diff --git a/.DS_Store b/.DS_Store index 5008ddf..a2ea65d 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index a1338d6..84204c7 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ +vendor/github.com/skycoin/skycoin/src/api/README.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ca9f0..6bf5b09 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,31 +8,93 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added +### Fixed + +### Changed + +### Removed + +## [0.24.1] - 2018-07-30 + +### Added + +- Add Content-Security-Policy header to http responses + +### Fixed + +- Fix portable browser version opening to blank page + +### Changed +- Increase visor db timeout to 5000 `ms` +- Change `InitTransaction` to accept parameters for distributing genesis coin to distribution wallets + +### Removed + +## [0.24.0] - 2018-07-06 + +### Added + +- Minimum go version is go1.10 +- Add environment variable `DATA_DIR` in CLI's - `USE_CSRF` environment variable for CLI, if the remote node has CSRF enabled (CSRF is enabled by default, use `-disable-csrf` to disable) - `cli showConfig` command to echo the cli's configuration back to the user - Option to generate 12/24 word seed when creating new wallet +- libskycoin 0.0.1 released with bindings for cipher/address, cipher/hash, cipher/crypto, cli/create_rawtx - Add `-version` flag to show node version +- Add transaction verification step to "Send" page +- Add more details about transaction in transaction history +- Add advanced spend UI - Add CLI `encryptWallet` command - Add CLI `decryptWallet` command - Add CLI `showSeed` command - Add `password` argument to the CLI commands of `addPrivateKey`, `createRawTransaction`, `generateAddresses`, `generateWallet`, `send` - Support for decoding map values in cipher binary encoder - +- Expose known block height of peer in brand new `height` field added in responses of `GET /api/v1/network/connections` API endpoints +- `-verify-db` option (default true), will verify the database integrity during startup and exit if a problem is found +- `-reset-corrupt-db` option (default false) will verify the database integrity during startup and reset the db if a problem is found +- `GET /explorer/address`: add `fee` to transaction objects and `calculated_hours` to transaction inputs +- Test data generator and test suite for verification of alternative `cipher` implementations +- Begin `/api/v2` API endpoints. These endpoints are in beta and subject to change. +- Add `POST /api/v2/transaction/verify` API endpoint +- Add `POST /api/v2/address/verify` API endpoint +- Add `ignore_unconfirmed` option to `POST /api/v1/wallet/transaction` to allow transactions to be created or spent even if there are unspent outputs in the unconfirmed pool. +- Add `uxouts` to `POST /api/v1/wallet/transaction`, to allow specific unspent outputs to be used in a transaction. +- Add Dockerfile in docker/images/dev-cli to build a docker image suitable for development. +- Coin creator tool, `cmd/newcoin`, to quickly bootstrap a new fiber coin +- Add Dockerfile in `docker/images/dev-dind` to build a docker in docker image based on skycoindev-cli. ### Fixed - Reduce connection disconnects, improves syncing - Fix #1171, update CLI to support wallet encryption +- Use `bolt.Tx` correctly for read operations +- Docker images for `arm32v5` and `ar32v7` architectures by using busybox as base in docker/images/mainnet/Dockerfile and docker/images/mainnet/hooks/ ### Changed - JSON 2.0 RPC interface (used by the CLI tool) is now served on the same host interface as the REST API, port `6420`. The additional listener has been removed. - CLI's `RPC_ADDR` environment variable must now start with a scheme e.g. `http://127.0.0.1:6420`, previously it did not use a scheme. +- API response will be gzip compressed if client sends request with 'Accept-Encoding' contains 'gzip' in the header. +- `GET /api/v1/wallet/balance` and `GET /api/v1/balance` now return an address balance list as well. +- API endpoints are prefixed with `/api/v1/`. API endpoints without the `/api/v1/` prefix are deprecated but can be enabled with `-enable-unversioned-api`. Please migrate to use `/api/v1/` prefix in URLs. +- Enable message protocol upgrade +- `change_address` is no longer required in `POST /api/v1/wallet/transaction`. If not provided, `change_address` will default to one of the addresses being spent from. +- In `POST /api/v1/wallet/transaction`, for `auto` type `share` mode requests, if extra coinhours remain after applying the `share_factor` but change cannot be made due to insufficient coins, the `share_factor` will switch to `1.0`. +- Support automatic port allocation of the API interface by specifying port 0 +- The web interface / API port is randomly allocated for the precompiled standalone client and electron client released on the website. + If you are using the CLI tool or another API client to communicate with the standalone client, use `-web-interface-port=6420` to continue using port 6420. + If the program is run from source (e.g. `go run`, `run.sh`, `make run`) there is no change, the API will still be on port 6420. +- Change number of outgoing connections to 8 from 16 +- Transaction history shows transactions between own addresses +- Client will only maintain one connection to the default hardcoded peers, instead of all of them ### Removed - Remove `-rpc-interface-addr`, `-rpc-interface-port` options. The RPC interface is now on default port `6420` with the REST API. - Remove `-rpc-thread-num` option +- Remove `-connect-to` option +- Remove `-print-web-interface-address` option +- Remove support for go1.9 ## [0.23.0] - 2018-04-22 @@ -263,6 +325,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - #350 Wallet name always 'undefined' after loading wallet from seed [Unreleased]: https://github.com/skycoin/skycoin/compare/master...develop +[0.24.1]: https://github.com/skycoin/skycoin/compare/v0.24.0...v0.24.1 +[0.24.0]: https://github.com/skycoin/skycoin/compare/v0.23.0...v0.24.0 [0.23.0]: https://github.com/skycoin/skycoin/compare/v0.22.0...v0.23.0 [0.22.0]: https://github.com/skycoin/skycoin/compare/v0.21.1...v0.22.0 [0.21.1]: https://github.com/skycoin/skycoin/compare/v0.21.0...v0.21.1 diff --git a/Gopkg.lock b/Gopkg.lock index 4fd3fe9..4426a52 100755 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,11 +1,17 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + name = "github.com/NYTimes/gziphandler" + packages = ["."] + revision = "2600fb119af974220d3916a5916d6e31176aac1b" + version = "v1.0.1" + [[projects]] name = "github.com/boltdb/bolt" packages = ["."] - revision = "583e8937c61f1af6513608ccc75c97b6abdf4ff9" - version = "v1.3.0" + revision = "2f1ce7a837dcb8da3ec595b1dac9d0632f0f99e8" + version = "v1.3.1" [[projects]] name = "github.com/cenkalti/backoff" @@ -19,6 +25,35 @@ revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" +[[projects]] + name = "github.com/fsnotify/fsnotify" + packages = ["."] + revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" + version = "v1.4.7" + +[[projects]] + branch = "master" + name = "github.com/hashicorp/hcl" + packages = [ + ".", + "hcl/ast", + "hcl/parser", + "hcl/printer", + "hcl/scanner", + "hcl/strconv", + "hcl/token", + "json/parser", + "json/scanner", + "json/token" + ] + revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" + +[[projects]] + name = "github.com/magiconair/properties" + packages = ["."] + revision = "c2353362d570a7bfa228149c62842019201cfb71" + version = "v1.8.0" + [[projects]] name = "github.com/mattn/go-colorable" packages = ["."] @@ -37,6 +72,18 @@ packages = ["."] revision = "9520e82c474b0a04dd04f8a40959027271bab992" +[[projects]] + branch = "master" + name = "github.com/mitchellh/mapstructure" + packages = ["."] + revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" + +[[projects]] + name = "github.com/pelletier/go-toml" + packages = ["."] + revision = "acdc4509485b587f5e675510c4f2c63e90ff68a8" + version = "v1.1.0" + [[projects]] name = "github.com/pmezard/go-difflib" packages = ["difflib"] @@ -44,10 +91,10 @@ version = "v1.0.0" [[projects]] - branch = "master" name = "github.com/shopspring/decimal" packages = ["."] - revision = "aed1bfe463fa3c9cc268d60dcc1491db613bff7e" + revision = "69b3a8ad1f5f2c8bd855cb6506d18593064a346b" + version = "1.0.1" [[projects]] name = "github.com/sirupsen/logrus" @@ -55,11 +102,44 @@ revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc" version = "v1.0.5" +[[projects]] + name = "github.com/spf13/afero" + packages = [ + ".", + "mem" + ] + revision = "63644898a8da0bc22138abf860edaf5277b6102e" + version = "v1.1.0" + +[[projects]] + name = "github.com/spf13/cast" + packages = ["."] + revision = "8965335b8c7107321228e3e3702cab9832751bac" + version = "v1.2.0" + [[projects]] branch = "master" + name = "github.com/spf13/jwalterweatherman" + packages = ["."] + revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" + +[[projects]] + name = "github.com/spf13/pflag" + packages = ["."] + revision = "583c0c0531f06d5278b7d917446061adc344b5cd" + version = "v1.0.1" + +[[projects]] + name = "github.com/spf13/viper" + packages = ["."] + revision = "b5e8006cbee93ec955a89ab31e0e3ce3204f3736" + version = "v1.0.2" + +[[projects]] name = "github.com/stretchr/objx" packages = ["."] - revision = "1a9d0bb9f541897e62256577b352fdbc1fb4fd94" + revision = "facf9a85c22f48d2f52f2380e4efce1768749a89" + version = "v0.1" [[projects]] name = "github.com/stretchr/testify" @@ -73,30 +153,58 @@ [[projects]] name = "github.com/toqueteos/webbrowser" packages = ["."] - revision = "21fc9f95c83442fd164094666f7cb4f9fdd56cd6" - version = "v1.0" + revision = "3232c91b8ede8ca86e8962981d881af78875542f" + version = "v1.1.0" [[projects]] name = "github.com/urfave/cli" packages = ["."] - revision = "0bdeddeeb0f650497d603c4ad7b20cfe685682f6" - version = "v1.19.1" + revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1" + version = "v1.20.0" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + revision = "4ec37c66abab2c7e02ae775328b2ff001c3f025a" [[projects]] branch = "master" name = "golang.org/x/net" packages = ["context"] - revision = "a8b9294777976932365dabb6640cf1468d95c70f" + revision = "d11bb6cd8e3c4e60239c9cb20ef68586d74500d0" [[projects]] branch = "master" name = "golang.org/x/sys" - packages = ["unix"] - revision = "50298aa7a9faed39cd341ad7fd9275b1d5ddd70c" + packages = [ + "unix", + "windows" + ] + revision = "7db1c3b1a98089d0071c84f646ff5c96aad43682" + +[[projects]] + name = "golang.org/x/text" + packages = [ + "internal/gen", + "internal/triegen", + "internal/ucd", + "transform", + "unicode/cldr", + "unicode/norm" + ] + revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" + version = "v0.3.0" + +[[projects]] + name = "gopkg.in/yaml.v2" + packages = ["."] + revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" + version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "1d8b3690230401d26d294ca7b72d86d7f5f8bb706360023a21dde1f81fff4804" + inputs-digest = "54b60e7f81ba03cf22a9cf957d47f75b9f1592aa729980b6e4af3c208344cbbf" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 9765614..1311532 100755 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -38,3 +38,11 @@ [[constraint]] name = "github.com/stretchr/testify" revision = "2aa2c176b9dab406a6970f6a55f513e8a8c8b18f" + +[[constraint]] + name = "github.com/cenkalti/backoff" + version = "v1.1.0" + +[[constraint]] + name = "github.com/NYTimes/gziphandler" + version = "1.0.1" diff --git a/INTEGRATION.md b/INTEGRATION.md new file mode 100755 index 0000000..bf70da9 --- /dev/null +++ b/INTEGRATION.md @@ -0,0 +1,279 @@ +# Skycoin Exchange Integration + +A Skycoin node offers multiple interfaces: + +* REST API on port 6420 (when running from source; if you are using the releases downloaded from the website, the port is randomized) +* JSON-RPC 2.0 API accessible on `/api/v1/webrpc` endpoint **[deprecated]** + +A CLI tool is provided in `cmd/cli/cli.go`. This tool communicates over the JSON-RPC 2.0 API. In the future it will communicate over the REST API. + +*Note*: Do not interface with the JSON-RPC 2.0 API directly, it is deprecated and will be removed in a future version. + +The API interfaces do not support authentication or encryption so they should only be used over localhost. + +If your application is written in Go, you can use these client libraries to interface with the node: + +* [Skycoin REST API Client Godoc](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) +* [Skycoin CLI Godoc](https://godoc.org/github.com/skycoin/skycoin/src/cli) + +*Note*: The CLI interface will be deprecated and replaced with a better one in the future. + +The wallet APIs in the REST API operate on wallets loaded from and saved to `~/.skycoin/wallets`. +Use the CLI tool to perform seed generation and transaction signing outside of the Skycoin node. + +The Skycoin node's wallet APIs can be enabled with `-enable-wallet-api`. + +For a node used to support another application, +it is recommended to use the REST API for blockchain queries and disable the wallet APIs, +and to use the CLI tool for wallet operations (seed and address generation, transaction signing). + + + +- [API Documentation](#api-documentation) + - [Wallet REST API](#wallet-rest-api) + - [Skycoin command line interface](#skycoin-command-line-interface) + - [Skycoin REST API Client Documentation](#skycoin-rest-api-client-documentation) + - [Skycoin Go Library Documentation](#skycoin-go-library-documentation) + - [libskycoin Documentation](#libskycoin-documentation) +- [Implementation guidelines](#implementation-guidelines) + - [Scanning deposits](#scanning-deposits) + - [Using the CLI](#using-the-cli) + - [Using the REST API](#using-the-rest-api) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application) + - [Sending coins](#sending-coins) + - [General principles](#general-principles) + - [Using the CLI](#using-the-cli-1) + - [Using the REST API](#using-the-rest-api-1) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-1) + - [Coinhours](#coinhours) + - [REST API](#rest-api) + - [CLI](#cli) + - [Verifying addresses](#verifying-addresses) + - [Using the CLI](#using-the-cli-2) + - [Using the REST API](#using-the-rest-api-2) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-2) + - [Using skycoin as a library in other applications](#using-skycoin-as-a-library-in-other-applications) + - [Checking Skycoin node connections](#checking-skycoin-node-connections) + - [Using the CLI](#using-the-cli-3) + - [Using the REST API](#using-the-rest-api-3) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-3) + - [Checking Skycoin node status](#checking-skycoin-node-status) + - [Using the CLI](#using-the-cli-4) + - [Using the REST API](#using-the-rest-api-4) + - [Using skycoin as a library in a Go application](#using-skycoin-as-a-library-in-a-go-application-4) + + + + +## API Documentation + +### Wallet REST API + +[Wallet REST API](src/api/README.md). + +### Skycoin command line interface + +[CLI command API](cmd/cli/README.md). + +### Skycoin REST API Client Documentation + +[Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) + +### Skycoin Go Library Documentation + +[Skycoin Godoc](https://godoc.org/github.com/skycoin/skycoin) + +### libskycoin Documentation + +[libskycoin documentation](/lib/cgo/README.md) + +## Implementation guidelines + +### Scanning deposits + +There are multiple approaches to scanning for deposits, depending on your implementation. + +One option is to watch for incoming blocks and check them for deposits made to a list of known deposit addresses. +Another option is to check the unspent outputs for a list of known deposit addresses. + +#### Using the CLI + +To scan the blockchain, use `skycoin-cli lastBlocks` or `skycoin-cli blocks`. These will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, use `skycoin-cli addressOutputs`. If you only want the balance, you can use `skycoin-cli addressBalance`. + +#### Using the REST API + +To scan the blockchain, call `GET /api/v1/last_blocks?num=` or `GET /api/v1/blocks?start=&end=`. There will return block data as JSON +and new unspent outputs sent to an address can be detected. + +To check address outputs, call `GET /api/v1/outputs?addrs=`. If you only want the balance, you can call `GET /api/v1/balance?addrs=`. + +* [`GET /api/v1/last_blocks` docs](src/api/README.md#get-last-n-blocks) +* [`GET /api/v1/blocks` docs](src/api/README.md#get-blocks-in-specific-range) +* [`GET /api/v1/outputs` docs](src/api/README.md#get-unspent-output-set-of-address-or-hash) +* [`GET /api/v1/balance` docs](src/api/README.md#get-balance-of-addresses) + +#### Using skycoin as a library in a Go application + +We recommend using the [Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client). + +### Sending coins + +#### General principles + +After each spend, wait for the transaction to confirm before trying to spend again. + +For higher throughput, combine multiple spends into one transaction. + +Skycoin uses "coin hours" to ratelimit transactions. +The total number of coinhours in a transaction's outputs must be 50% or less than the number of coinhours in a transaction's inputs, +or else the transaction is invalid and will not be accepted. A transaction must have at least 1 input with at least 1 coin hour. +Sending too many transactions in quick succession will use up all available coinhours. +Coinhours are earned at a rate of 1 coinhour per coin per hour, calculated per second. +This means that 3600 coins will earn 1 coinhour per second. +However, coinhours are only updated when a new block is published to the blockchain. +New blocks are published every 10 seconds, but only if there are pending transactions in the network. + +To avoid running out of coinhours in situations where the application may frequently send, +the sender should batch sends into a single transaction and send them on a +30 second to 1 minute interval. + +There are other strategies to minimize the likelihood of running out of coinhours, such +as splitting up balances into many unspent outputs and having a large balance which generates +coinhours quickly. + +#### Using the CLI + +When sending coins from the CLI tool, a wallet file local to the caller is used. +The CLI tool allows you to specify the wallet file on disk to use for operations. + +See [CLI command API](cmd/cli/README.md) for documentation of the CLI interface. + +To perform a send, the preferred method follows these steps in a loop: + +* `skycoin-cli createRawTransaction -m '[{"addr:"$addr1,"coins:"$coins1"}, ...]` - `-m` flag is send-to-many +* `skycoin-cli broadcastTransaction` - returns `txid` +* `skycoin-cli transaction $txid` - repeat this command until `"status"` is `"confirmed"` + +That is, create a raw transaction, broadcast it, and wait for it to confirm. + +#### Using the REST API + +Create a transaction with [POST /wallet/transaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#create-transaction), +then inject it to the network with [POST /injectTransaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#inject-raw-transaction). + +When using `POST /wallet/transaction`, a wallet file local to the skycoin node is used. +The wallet file is specified by wallet ID, and all wallet files are in the +configured data directory (which is `$HOME/.skycoin/wallets` by default). + +#### Using skycoin as a library in a Go application + +If your application is written in Go, you can interface with the CLI library +directly, see [Skycoin CLI Godoc](https://godoc.org/github.com/skycoin/skycoin/src/cli). + +A REST API client is also available: [Skycoin REST API Client Godoc](https://godoc.org/github.com/skycoin/skycoin/src/api#Client). + +#### Coinhours + +Transaction fees in skycoin is paid in coinhours and is currently set to `50%`, +every transaction created burns `50%` of the total coinhours in all the input +unspents. + +You need a minimum of `1` of coinhour to create a transaction. + +Coinhours are generated at a rate of `1 coinsecond` per `second` +which are then converted to `coinhours`, `1` coinhour = `3600` coinseconds. + +> Note: Coinhours don't have decimals and only show up in whole numbers. + +##### REST API + +When using the REST API, the coin hours sent to the destination and change can be controlled. +The 50% burn fee is still required. + +See the [POST /wallet/transaction](https://github.com/skycoin/skycoin/blob/develop/src/api/README.md#create-transaction) +documentation for more information on how to control the coin hours. + +We recommend sending at least 1 coin hour to each destination, otherwise the receiver will have to +wait for another coin hour to accumulate before they can make another transaction. + +##### CLI + +When using the CLI the amount of coinhours sent to the receiver is capped to +the number of coins they receive with a minimum of `1` coinhour for transactions +with `<1` skycoin being sent. + +The coinhours left after burning `50%` and sending to receivers are sent to the change address. + +For eg. If an address has `10` skycoins and `50` coinhours and only `1` unspent. +If we send `5` skycoins to another address then that address will receive +`5` skycoins and `5` coinhours, `26` coinhours will be burned. +The sending address will be left with `5` skycoins and `19` coinhours which +will then be sent to the change address. + + +### Verifying addresses + +#### Using the CLI + +```sh +skycoin-cli verifyAddress $addr +``` + +#### Using the REST API + +Not directly supported, but API calls that have an address argument will return `400 Bad Request` if they receive an invalid address. + +#### Using skycoin as a library in a Go application + +https://godoc.org/github.com/skycoin/skycoin/src/cipher#DecodeBase58Address + +```go +if _, err := cipher.DecodeBase58Address(address); err != nil { + fmt.Println("Invalid address:", err) + return +} +``` + +#### Using skycoin as a library in other applications + +Address validation is available through a C wrapper, `libskycoin`. + +See the [libskycoin documentation](/lib/cgo/README.md) for usage instructions. + +### Checking Skycoin node connections + +#### Using the CLI + +Not implemented + +#### Using the REST API + +* `GET /api/v1/network/connections` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin REST API Client](https://godoc.org/github.com/skycoin/skycoin/src/api#Client) + +### Checking Skycoin node status + +#### Using the CLI + +```sh +skycoin-cli status +``` + +#### Using the REST API + +A method similar to `skycoin-cli status` is not implemented, but these endpoints can be used: + +* `GET /api/v1/health` +* `GET /api/v1/version` +* `GET /api/v1/blockchain/metadata` +* `GET /api/v1/blockchain/progress` + +#### Using skycoin as a library in a Go application + +Use the [Skycoin CLI package](https://godoc.org/github.com/skycoin/skycoin/src/cli) diff --git a/Installation.md b/Installation.md index e035e36..7ef426d 100755 --- a/Installation.md +++ b/Installation.md @@ -1,6 +1,6 @@ # Installing go -Skycoin supports go1.9+. The preferred version is go1.10. +Skycoin supports go1.10+. ## For OSX First you need to have `homebrew` installed, if you don't have it yet. @@ -53,8 +53,8 @@ In China, use `--source=https://github.com/golang/go` to bypass firewall when fe gvm install go1.4 --source=https://github.com/golang/go gvm use go1.4 -gvm install go1.9 -gvm use go1.9 --default +gvm install go1.10.2 +gvm use go1.10.2 --default ``` #### Installation issues @@ -62,7 +62,7 @@ If you open up new a terminal and the `go` command is not found then add this to ```sh [[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm" -gvm use go1.9 >/dev/null +gvm use go1.10.2 >/dev/null ``` ## Install Go manually @@ -72,7 +72,7 @@ Let's go to home directory and declare `go`'s version that you want to download. ```sh cd ~ -export GOV=1.10 # golang version. Could be any of the following versions 1.9, 1.10 +export GOV=1.10.2 # golang version ``` After that, let's download and uncompress golang source. diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..5937df6 --- /dev/null +++ b/Makefile @@ -0,0 +1,218 @@ +.DEFAULT_GOAL := help +.PHONY: run run-help test test-core test-libc test-lint build-libc check cover +.PHONY: integration-test-stable integration-test-stable-disable-csrf +.PHONY: integration-test-live integration-test-live-wallet +.PHONY: integration-test-disable-wallet-api integration-test-disable-seed-api +.PHONY: integration-test-enable-seed-api integration-test-enable-seed-api +.PHONY: integration-test-disable-gui integration-test-disable-gui +.PHONY: install-linters format release clean-release install-deps-ui build-ui help + +# Static files directory +GUI_STATIC_DIR = src/gui/static + +# Electron files directory +ELECTRON_DIR = electron + +# Compilation output +BUILD_DIR = build +BUILDLIB_DIR = $(BUILD_DIR)/libskycoin +LIB_DIR = lib +LIB_FILES = $(shell find ./lib/cgo -type f -name "*.go") +SRC_FILES = $(shell find ./src -type f -name "*.go") +BIN_DIR = bin +DOC_DIR = docs +INCLUDE_DIR = include +LIBSRC_DIR = lib/cgo +LIBDOC_DIR = $(DOC_DIR)/libc + +# Compilation flags +CC_VERSION = $(shell $(CC) -dumpversion) +STDC_FLAG = $(python -c "if tuple(map(int, '$(CC_VERSION)'.split('.'))) < (6,): print('-std=C99'") +LIBC_LIBS = -lcriterion +LIBC_FLAGS = -I$(LIBSRC_DIR) -I$(INCLUDE_DIR) -I$(BUILD_DIR)/usr/include -L $(BUILDLIB_DIR) -L$(BUILD_DIR)/usr/lib + +# Platform specific checks +OSNAME = $(TRAVIS_OS_NAME) + +ifeq ($(shell uname -s),Linux) + LDLIBS=$(LIBC_LIBS) -lpthread + LDPATH=$(shell printenv LD_LIBRARY_PATH) + LDPATHVAR=LD_LIBRARY_PATH + LDFLAGS=$(LIBC_FLAGS) $(STDC_FLAG) +ifndef OSNAME + OSNAME = linux +endif +else ifeq ($(shell uname -s),Darwin) +ifndef OSNAME + OSNAME = osx +endif + LDLIBS = $(LIBC_LIBS) + LDPATH=$(shell printenv DYLD_LIBRARY_PATH) + LDPATHVAR=DYLD_LIBRARY_PATH + LDFLAGS=$(LIBC_FLAGS) -framework CoreFoundation -framework Security +else + LDLIBS = $(LIBC_LIBS) + LDPATH=$(shell printenv LD_LIBRARY_PATH) + LDPATHVAR=LD_LIBRARY_PATH + LDFLAGS=$(LIBC_FLAGS) +endif + +run: ## Run the skycoin node. To add arguments, do 'make ARGS="--foo" run'. + ./run.sh ${ARGS} + +run-help: ## Show skycoin node help + @go run cmd/skycoin/skycoin.go --help + +test: ## Run tests for Skycoin + go test ./cmd/... -timeout=5m + go test ./src/... -timeout=5m + +test-386: ## Run tests for Skycoin with GOARCH=386 + GOARCH=386 go test ./cmd/... -timeout=5m + GOARCH=386 go test ./src/... -timeout=5m + +test-amd64: ## Run tests for Skycoin with GOARCH=amd64 + GOARCH=amd64 go test ./cmd/... -timeout=5m + GOARCH=amd64 go test ./src/... -timeout=5m + +configure-build: + mkdir -p $(BUILD_DIR)/usr/tmp $(BUILD_DIR)/usr/lib $(BUILD_DIR)/usr/include + mkdir -p $(BUILDLIB_DIR) $(BIN_DIR) $(INCLUDE_DIR) + +$(BUILDLIB_DIR)/libskycoin.so: $(LIB_FILES) $(SRC_FILES) + rm -Rf $(BUILDLIB_DIR)/libskycoin.so + go build -buildmode=c-shared -o $(BUILDLIB_DIR)/libskycoin.so $(LIB_FILES) + mv $(BUILDLIB_DIR)/libskycoin.h $(INCLUDE_DIR)/ + +$(BUILDLIB_DIR)/libskycoin.a: $(LIB_FILES) $(SRC_FILES) + rm -Rf $(BUILDLIB_DIR)/libskycoin.a + go build -buildmode=c-archive -o $(BUILDLIB_DIR)/libskycoin.a $(LIB_FILES) + mv $(BUILDLIB_DIR)/libskycoin.h $(INCLUDE_DIR)/ + +build-libc-static: $(BUILDLIB_DIR)/libskycoin.a + +build-libc-shared: $(BUILDLIB_DIR)/libskycoin.so + +## Build libskycoin C client library +build-libc: configure-build build-libc-static build-libc-shared + +## Build libskycoin C client library and executable C test suites +## with debug symbols. Use this target to debug the source code +## with the help of an IDE +build-libc-dbg: configure-build build-libc-static build-libc-shared + $(CC) -g -o $(BIN_DIR)/test_libskycoin_shared $(LIB_DIR)/cgo/tests/*.c -lskycoin $(LDLIBS) $(LDFLAGS) + $(CC) -g -o $(BIN_DIR)/test_libskycoin_static $(LIB_DIR)/cgo/tests/*.c $(BUILDLIB_DIR)/libskycoin.a $(LDLIBS) $(LDFLAGS) + +test-libc: build-libc ## Run tests for libskycoin C client library + echo "Compiling with $(CC) $(CC_VERSION) $(STDC_FLAG)" + $(CC) -o $(BIN_DIR)/test_libskycoin_shared $(LIB_DIR)/cgo/tests/*.c $(LIB_DIR)/cgo/tests/testutils/*.c -lskycoin $(LDLIBS) $(LDFLAGS) + $(CC) -o $(BIN_DIR)/test_libskycoin_static $(LIB_DIR)/cgo/tests/*.c $(LIB_DIR)/cgo/tests/testutils/*.c $(BUILDLIB_DIR)/libskycoin.a $(LDLIBS) $(LDFLAGS) + $(LDPATHVAR)="$(LDPATH):$(BUILD_DIR)/usr/lib:$(BUILDLIB_DIR)" $(BIN_DIR)/test_libskycoin_shared + $(LDPATHVAR)="$(LDPATH):$(BUILD_DIR)/usr/lib" $(BIN_DIR)/test_libskycoin_static + +docs-libc: + doxygen ./.Doxyfile + moxygen -o $(LIBDOC_DIR)/API.md $(LIBDOC_DIR)/xml/ + +docs: docs-libc + +lint: ## Run linters. Use make install-linters first. + vendorcheck ./... + golangci-lint run --no-config --deadline=3m --concurrency=2 --disable-all --tests --skip-dirs=lib/cgo \ + -E goimports \ + -E golint \ + -E varcheck \ + -E unparam \ + -E deadcode \ + -E structcheck \ + ./... + # lib cgo can't use golint because it needs export directives in function docstrings that do not obey golint rules + golangci-lint run --no-config --deadline=3m --concurrency=2 --disable-all --tests \ + -E goimports \ + -E varcheck \ + -E unparam \ + -E structcheck \ + ./lib/cgo/... + +check: lint test integration-test-stable integration-test-stable-disable-csrf integration-test-disable-wallet-api integration-test-disable-seed-api integration-test-enable-seed-api integration-test-disable-gui ## Run tests and linters + +integration-test-stable: ## Run stable integration tests + ./ci-scripts/integration-test-stable.sh -c + +integration-test-stable-disable-csrf: ## Run stable integration tests with CSRF disabled + ./ci-scripts/integration-test-stable.sh + +integration-test-live: ## Run live integration tests + ./ci-scripts/integration-test-live.sh -c + +integration-test-live-wallet: ## Run live integration tests with wallet + ./ci-scripts/integration-test-live.sh -w + +integration-test-live-disable-csrf: ## Run live integration tests against a node with CSRF disabled + ./ci-scripts/integration-test-live.sh + +integration-test-disable-wallet-api: ## Run disable wallet api integration tests + ./ci-scripts/integration-test-disable-wallet-api.sh + +integration-test-enable-seed-api: ## Run enable seed api integration test + ./ci-scripts/integration-test-enable-seed-api.sh + +integration-test-disable-gui: + ./ci-scripts/integration-test-disable-gui.sh + +cover: ## Runs tests on ./src/ with HTML code coverage + go test -cover -coverprofile=cover.out -coverpkg=github.com/skycoin/skycoin/... ./src/... + go tool cover -html=cover.out + +install-linters: ## Install linters + go get -u github.com/FiloSottile/vendorcheck + go get -u github.com/golangci/golangci-lint/cmd/golangci-lint + +install-deps-libc: configure-build ## Install locally dependencies for testing libskycoin + git clone --recursive https://github.com/skycoin/Criterion $(BUILD_DIR)/usr/tmp/Criterion + mkdir $(BUILD_DIR)/usr/tmp/Criterion/build + cd $(BUILD_DIR)/usr/tmp/Criterion/build && cmake .. && cmake --build . + mv $(BUILD_DIR)/usr/tmp/Criterion/build/libcriterion.* $(BUILD_DIR)/usr/lib/ + cp -R $(BUILD_DIR)/usr/tmp/Criterion/include/* $(BUILD_DIR)/usr/include/ + +format: ## Formats the code. Must have goimports installed (use make install-linters). + goimports -w -local github.com/skycoin/skycoin ./cmd + goimports -w -local github.com/skycoin/skycoin ./src + goimports -w -local github.com/skycoin/skycoin ./lib + +install-deps-ui: ## Install the UI dependencies + cd $(GUI_STATIC_DIR) && npm install + +lint-ui: ## Lint the UI code + cd $(GUI_STATIC_DIR) && npm run lint + +test-ui: ## Run UI tests + cd $(GUI_STATIC_DIR) && npm run test + +test-ui-e2e: ## Run UI e2e tests + ./ci-scripts/ui-e2e.sh + +build-ui: ## Builds the UI + cd $(GUI_STATIC_DIR) && npm run build + +build-ui-travis: ## Builds the UI for travis + cd $(GUI_STATIC_DIR) && npm run build-travis + +release: ## Build electron and standalone apps. Use osarch=${osarch} to specify the platform. Example: 'make release osarch=darwin/amd64', multiple platform can be supported in this way: 'make release osarch="darwin/amd64 windows/amd64"'. Supported architectures are: darwin/amd64 windows/amd64 windows/386 linux/amd64 linux/arm, the builds are located in electron/release folder. + cd $(ELECTRON_DIR) && ./build.sh ${osarch} + @echo release files are in the folder of electron/release + +release-bin: ## Build standalone apps. Use osarch=${osarch} to specify the platform. Example: 'make release-bin osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-standalone-release.sh ${osarch} + @echo release files are in the folder of electron/release + +release-gui: ## Build electron apps. Use osarch=${osarch} to specify the platform. Example: 'make release-gui osarch=darwin/amd64' Supported architectures are the same as 'release' command. + cd $(ELECTRON_DIR) && ./build-electron-release.sh ${osarch} + @echo release files are in the folder of electron/release + + +clean-release: ## Clean dist files and delete all builds in electron/release + rm $(ELECTRON_DIR)/release/* + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' \ No newline at end of file diff --git a/ci-scripts/build-wallet.sh b/ci-scripts/build-wallet.sh index 46213a0..8c1210d 100755 --- a/ci-scripts/build-wallet.sh +++ b/ci-scripts/build-wallet.sh @@ -2,7 +2,6 @@ echo "start to build wallets..." pushd "electron" -yarn if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./build.sh 'linux/amd64 linux/arm' ;fi if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh 'darwin/amd64' ;fi ls release/ diff --git a/ci-scripts/integration-test-disable-gui.sh b/ci-scripts/integration-test-disable-gui.sh new file mode 100755 index 0000000..9c80af3 --- /dev/null +++ b/ci-scripts/integration-test-disable-gui.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Runs "disable-gui"-mode tests against a skycoin node configured with -enable-gui=false +# and /api/v1/api endpoint should return 404 Not Found error + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-gui" +BINARY="skycoin-integration" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-wallet-api=true \ + -enable-seed-api=true \ + -enable-gui=false& +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +else + exit 0 +fi \ No newline at end of file diff --git a/ci-scripts/integration-test-disable-seed-api.sh b/ci-scripts/integration-test-disable-seed-api.sh deleted file mode 100755 index 400278a..0000000 --- a/ci-scripts/integration-test-disable-seed-api.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# Runs "disable-seed-api"-mode tests against a skycoin node configured with -enable-seed-api=false -# and /wallet/seed api endpoint should return 403 forbidden error. - -#Set Script Name variable -SCRIPT=`basename ${BASH_SOURCE[0]}` -PORT="46422" -RPC_PORT="$PORT" -HOST="http://127.0.0.1:$PORT" -RPC_ADDR="http://127.0.0.1:$RPC_PORT" -MODE="disable-seed-api" -BINARY="skycoin-integration" -TEST="" -RUN_TESTS="" -# run go test with -v flag -VERBOSE="" - -usage () { - echo "Usage: $SCRIPT" - echo "Optional command line arguments" - echo "-t -- Test to run, gui or cli; empty runs both tests" - echo "-v -- Run test with -v flag" - exit 1 -} - -while getopts "h?t:r:v" args; do - case $args in - h|\?) - usage; - exit;; - t ) TEST=${OPTARG};; - v ) VERBOSE="-v";; - r ) RUN_TESTS="-run ${OPTARG}";; - esac -done - -set -euxo pipefail - -DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) -WALLET_DIR="${DATA_DIR}/wallets" - -if [[ ! "$DATA_DIR" ]]; then - echo "Could not create temp dir" - exit 1 -fi - -# Compile the skycoin node -# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end -echo "compiling skycoin" -go build -o "$BINARY" cmd/skycoin/skycoin.go - -# Run skycoin node with pinned blockchain database -echo "starting skycoin node in background with http listener on $HOST" - -./skycoin-integration -disable-networking=true \ - -web-interface-port=$PORT \ - -download-peerlist=false \ - -db-path=./src/gui/integration/test-fixtures/blockchain-180.db \ - -db-read-only=true \ - -rpc-interface=true \ - -launch-browser=false \ - -data-dir="$DATA_DIR" \ - -wallet-dir="$WALLET_DIR" \ - -enable-wallet-api=true \ - -enable-seed-api=false & -SKYCOIN_PID=$! - -echo "skycoin node pid=$SKYCOIN_PID" - -echo "sleeping for startup" -sleep 3 -echo "done sleeping" - -set +e - -if [[ -z $TEST || $TEST = "gui" ]]; then - -SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ - go test ./src/gui/integration/... -timeout=30s $VERBOSE $RUN_TESTS - -GUI_FAIL=$? - -fi - -if [[ -z $TEST || $TEST = "cli" ]]; then - -# SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ -# go test ./src/api/cli/integration/... -timeout=30s $VERBOSE $RUN_TESTS - -CLI_FAIL=$? - -fi - - -echo "shutting down skycoin node" - -# Shutdown skycoin node -kill -s SIGINT $SKYCOIN_PID -wait $SKYCOIN_PID - -rm "$BINARY" - - -if [[ (-z $TEST || $TEST = "gui") && $GUI_FAIL -ne 0 ]]; then - exit $GUI_FAIL -elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then - exit $CLI_FAIL -else - exit 0 -fi -# exit $FAIL diff --git a/ci-scripts/integration-test-disable-wallet-api.sh b/ci-scripts/integration-test-disable-wallet-api.sh index f311e61..d49c697 100755 --- a/ci-scripts/integration-test-disable-wallet-api.sh +++ b/ci-scripts/integration-test-disable-wallet-api.sh @@ -3,15 +3,20 @@ # "disable-wallet-api"-mode confirms that no wallet related apis work, that the main index.html page # does not load, and that a new wallet file is not created. -#Set Script Name variable +# Set Script Name variable SCRIPT=`basename ${BASH_SOURCE[0]}` -PORT="46421" + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + RPC_PORT="$PORT" HOST="http://127.0.0.1:$PORT" RPC_ADDR="http://127.0.0.1:$RPC_PORT" MODE="disable-wallet-api" BINARY="skycoin-integration" -TEST="" UPDATE="" # run go test with -v flag VERBOSE="" @@ -26,7 +31,6 @@ GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" usage () { echo "Usage: $SCRIPT" echo "Optional command line arguments" - echo "-t -- Test to run, gui or cli; empty runs both tests" echo "-r -- Run test with -run flag" echo "-u -- Update stable testdata" echo "-v -- Run test with -v flag" @@ -39,7 +43,6 @@ while getopts "h?t:r:uvf" args; do h|\?) usage; exit;; - t ) TEST=${OPTARG};; r ) RUN_TESTS="-run ${OPTARG}";; u ) UPDATE="--update";; v ) VERBOSE="-v";; @@ -68,12 +71,13 @@ echo "starting skycoin node in background with http listener on $HOST" ./skycoin-integration -disable-networking=true \ -web-interface-port=$PORT \ -download-peerlist=false \ - -db-path=./src/gui/integration/test-fixtures/blockchain-180.db \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ -db-read-only=true \ -rpc-interface=true \ -launch-browser=false \ -data-dir="$DATA_DIR" \ -wallet-dir="$WALLET_DIR" \ + -enable-unversioned-api=true \ -enable-wallet-api=false & SKYCOIN_PID=$! @@ -85,24 +89,10 @@ echo "done sleeping" set +e -if [[ -z $TEST || $TEST = "gui" ]]; then - SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ - go test ./src/gui/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS - -GUI_FAIL=$? - -fi - -if [[ -z $TEST || $TEST = "cli" ]]; then - -SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ - go test ./src/api/cli/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS - -CLI_FAIL=$? - -fi + go test ./src/api/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS +FAIL=$? echo "shutting down skycoin node" @@ -112,12 +102,4 @@ wait $SKYCOIN_PID rm "$BINARY" - -if [[ (-z $TEST || $TEST = "gui") && $GUI_FAIL -ne 0 ]]; then - exit $GUI_FAIL -elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then - exit $CLI_FAIL -else - exit 0 -fi -# exit $FAIL +exit $FAIL diff --git a/ci-scripts/integration-test-enable-seed-api.sh b/ci-scripts/integration-test-enable-seed-api.sh new file mode 100755 index 0000000..3614699 --- /dev/null +++ b/ci-scripts/integration-test-enable-seed-api.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# Runs "enable-seed-api"-mode tests against a skycoin node configured with -enable-seed-api=true +# and /api/v1/wallet/seed api endpoint should return coresponding seed + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="enable-seed-api" +BINARY="skycoin-integration" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-wallet-api=true \ + -enable-seed-api=true & +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +# SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ +# go test ./src/cli/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/ci-scripts/integration-test-live.sh b/ci-scripts/integration-test-live.sh index e841677..525f975 100755 --- a/ci-scripts/integration-test-live.sh +++ b/ci-scripts/integration-test-live.sh @@ -28,7 +28,7 @@ FAILFAST="" usage () { echo "Usage: $SCRIPT" echo "Optional command line arguments" - echo "-t -- Test to run, gui or cli; empty runs both tests" + echo "-t -- Test to run, api or cli; empty runs both tests" echo "-r -- Run test with -run flag" echo "-u -- Update stable testdata" echo "-v -- Run test with -v flag" @@ -57,23 +57,25 @@ set -euxo pipefail echo "checking if skycoin node is running" -http_proxy="" https_proxy="" wget -O- $HOST 2>&1 >/dev/null +HEALTH="$HOST/api/v1/health" + +http_proxy="" https_proxy="" wget -O- $HEALTH 2>&1 >/dev/null if [ ! $? -eq 0 ]; then echo "Skycoin node is not running on $HOST" exit 1 fi -if [[ -z $TEST || $TEST = "gui" ]]; then +if [[ -z $TEST || $TEST = "api" ]]; then SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ - go test ./src/gui/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + go test ./src/api/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET fi if [[ -z $TEST || $TEST = "cli" ]]; then SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR SKYCOIN_NODE_HOST=$HOST USE_CSRF=$USE_CSRF \ - go test ./src/api/cli/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + go test ./src/cli/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET fi diff --git a/ci-scripts/integration-test-stable.sh b/ci-scripts/integration-test-stable.sh index 0fda7dc..20ff4e4 100755 --- a/ci-scripts/integration-test-stable.sh +++ b/ci-scripts/integration-test-stable.sh @@ -1,11 +1,17 @@ #!/bin/bash # Runs "stable"-mode tests against a skycoin node configured with a pinned database # "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely -# $TEST defines which test to run i.e, cli or gui; If empty both are run +# $TEST defines which test to run i.e, cli or api; If empty both are run -#Set Script Name variable +# Set Script Name variable SCRIPT=`basename ${BASH_SOURCE[0]}` -PORT="46420" + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + RPC_PORT="$PORT" HOST="http://127.0.0.1:$PORT" RPC_ADDR="http://127.0.0.1:$RPC_PORT" @@ -28,7 +34,7 @@ GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" usage () { echo "Usage: $SCRIPT" echo "Optional command line arguments" - echo "-t -- Test to run, gui or cli; empty runs both tests" + echo "-t -- Test to run, api or cli; empty runs both tests" echo "-r -- Run test with -run flag" echo "-u -- Update stable testdata" echo "-v -- Run test with -v flag" @@ -70,15 +76,14 @@ echo "starting skycoin node in background with http listener on $HOST" ./skycoin-integration -disable-networking=true \ -web-interface-port=$PORT \ -download-peerlist=false \ - -db-path=./src/gui/integration/test-fixtures/blockchain-180.db \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ -db-read-only=true \ -rpc-interface=true \ -launch-browser=false \ -data-dir="$DATA_DIR" \ -enable-wallet-api=true \ -wallet-dir="$WALLET_DIR" \ - $DISABLE_CSRF \ - -enable-seed-api=true & + $DISABLE_CSRF & SKYCOIN_PID=$! echo "skycoin node pid=$SKYCOIN_PID" @@ -89,19 +94,19 @@ echo "done sleeping" set +e -if [[ -z $TEST || $TEST = "gui" ]]; then +if [[ -z $TEST || $TEST = "api" ]]; then SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ - go test ./src/gui/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS + go test ./src/api/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS -GUI_FAIL=$? +API_FAIL=$? fi if [[ -z $TEST || $TEST = "cli" ]]; then SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR USE_CSRF=$USE_CSRF \ - go test ./src/api/cli/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS + go test ./src/cli/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS CLI_FAIL=$? @@ -117,8 +122,8 @@ wait $SKYCOIN_PID rm "$BINARY" -if [[ (-z $TEST || $TEST = "gui") && $GUI_FAIL -ne 0 ]]; then - exit $GUI_FAIL +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then exit $CLI_FAIL else diff --git a/ci-scripts/ui-e2e.sh b/ci-scripts/ui-e2e.sh new file mode 100755 index 0000000..b5878b8 --- /dev/null +++ b/ci-scripts/ui-e2e.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Runs UI e2e tests against a skycoin node configured with a pinned database + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_ADDR="127.0.0.1:$PORT" +HOST="http://127.0.0.1:$PORT" +BINARY="skycoin-integration" +E2E_PROXY_CONFIG=$(mktemp -t e2e-proxy.config.XXXXXX.js) + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Create a dummy wallet with an address existing in the blockchain-180.db dataset +mkdir "$WALLET_DIR" +cat >"${WALLET_DIR}/test_wallet.wlt" <$E2E_PROXY_CONFIG < + - [Install](#install) - [Enable command autocomplete](#enable-command-autocomplete) - [Environment Setting](#environment-setting) - - [RPC_ADDR](#rpcaddr) - - [WALLET_DIR](#walletdir) - - [WALLET_NAME](#walletname) - - [USE_CSRF](#usecsrf) + - [RPC_ADDR](#rpc_addr) + - [WALLET_DIR](#wallet_dir) + - [WALLET_NAME](#wallet_name) + - [USE_CSRF](#use_csrf) - [Usage](#usage) - [Add Private Key](#add-private-key) - - [Example](#example) - [Check address balance](#check-address-balance) - - [Example](#example-1) - [Generate new addresses](#generate-new-addresses) - - [Examples](#examples) - [Check address outputs](#check-address-outputs) - - [Example](#example-2) - [Check block data](#check-block-data) - - [Example](#example-3) - [Check database integrity](#check-database-integrity) - - [Example](#example-4) - [Create a raw transaction](#create-a-raw-transaction) - - [Examples](#examples-1) - [Decode a raw transaction](#decode-a-raw-transaction) - - [Example](#example-5) - [Broadcast a raw transaction](#broadcast-a-raw-transaction) - [Generate a wallet](#generate-a-wallet) - - [Examples](#examples-2) - [Generate addresses for a wallet](#generate-addresses-for-a-wallet) - [Last blocks](#last-blocks) - - [Examples](#examples-3) - [List wallet addresses](#list-wallet-addresses) - - [Examples](#examples-4) - [List wallets](#list-wallets) - - [Example](#example-6) - [Send](#send) - - [Examples](#examples-5) - [Show Config](#show-config) - - [Example](#example-7) - [Status](#status) - - [Example](#example-8) - [Get transaction](#get-transaction) - - [Example](#example-9) - [Verify address](#verify-address) - - [Example](#example-10) - [Check wallet balance](#check-wallet-balance) - - [Example](#example-11) - [See wallet directory](#see-wallet-directory) - - [Examples](#examples-6) - [List wallet transaction history](#list-wallet-transaction-history) - - [Examples](#examples-7) - [List wallet outputs](#list-wallet-outputs) - - [Examples](#examples-8) - [CLI version](#cli-version) - - [Examples](#examples-9) - [Note](#note) @@ -142,7 +120,7 @@ USAGE: skycoin-cli [global options] command [command options] [arguments...] VERSION: - 0.23.1-rc2 + 0.24.1 COMMANDS: addPrivateKey Add a private key to specific wallet diff --git a/cmd/cli/cli.go b/cmd/cli/cli.go index 354671c..c396320 100755 --- a/cmd/cli/cli.go +++ b/cmd/cli/cli.go @@ -4,7 +4,7 @@ import ( "fmt" "os" - "github.com/skycoin/skycoin/src/api/cli" + "github.com/skycoin/skycoin/src/cli" ) func main() { diff --git a/cmd/newcoin/README.md b/cmd/newcoin/README.md new file mode 100755 index 0000000..b655619 --- /dev/null +++ b/cmd/newcoin/README.md @@ -0,0 +1,66 @@ +# Fiber Coin Creator CLI Documention +This tool can be used to create a new fiber coin easily from a config file. +- [Install](#install) + - [Usage](#usage) + - [Create New Coin](#create-new-coin) + - [Example](#example) + +## Install + +```bash +$ cd $GOPATH/src/github.com/skycoin/skycoin/cmd/newcoin +$ go install ./... +``` + +## Usage + +After the installation, you can run `newcoin` to see the usage: + +``` +$ newcoin + +NAME: + newcoin - newcoin is a helper tool for creating new fiber coins + +USAGE: + newcoin [global options] command [command options] [arguments...] + +VERSION: + 0.1 + +COMMANDS: + createcoin Create a new coin from a template file + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --help, -h show help + --version, -v print the version +``` + +### Create New Coin + +```bash +$ newcoin createcoin [command options] +``` + +``` +OPTIONS: + --coin value name of the coin to create (default: "skycoin") + --template-dir value, --td value template directory path (default: "./template") + --coin-template-file value, --ct value coin template file (default: "coin.template") + --visor-template-file value, --vt value visor template file (default: "visor_parameters.template") + --config-dir value, --cd value config directory path (default: "./") + --config-file value, --cf value config file path (default: "fiber.toml") +``` + +#### Example +Create a test coin. + +```bash +$ newcoin --coin testcoin +``` + +This will create a new directory, `testcoin`, in `cmd` folder and +a `testcoin.go` file inside that folder. + +This file can be used to run a "testcoin" node. \ No newline at end of file diff --git a/cmd/newcoin/newcoin.go b/cmd/newcoin/newcoin.go new file mode 100755 index 0000000..8b6c4c9 --- /dev/null +++ b/cmd/newcoin/newcoin.go @@ -0,0 +1,210 @@ +package main + +import ( + "fmt" + + "os" + "path/filepath" + "text/template" + + "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/skycoin" + "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + // Version is the cli version + Version = "0.1" +) + +// CoinTemplateParameters represents parameters used to generate the new coin files. +type CoinTemplateParameters struct { + Version string + PeerListURL string + Port int + WebInterfacePort int + DataDirectory string + ProfileCPUFile string + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string +} + +var ( + app = cli.NewApp() + log = logging.MustGetLogger("newcoin") +) + +func init() { + app.Name = "newcoin" + app.Usage = "newcoin is a helper tool for creating new fiber coins" + app.Version = Version + commands := cli.Commands{ + createCoinCommand(), + } + + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *cli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(context.App.Writer, "error: %v\n\n", err) + cli.ShowAppHelp(context) + return nil + } + app.CommandNotFound = func(context *cli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} "+ + "command. See '{{.HelpName}} --help'. \n", command) + cli.HelpPrinter(app.Writer, tmp, app) + } +} + +func createCoinCommand() cli.Command { + name := "createcoin" + return cli.Command{ + Name: name, + Usage: "Create a new coin from a template file", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "coin", + Usage: "name of the coin to create", + Value: "skycoin", + }, + cli.StringFlag{ + Name: "template-dir, td", + Usage: "template directory path", + Value: "./template", + }, + cli.StringFlag{ + Name: "coin-template-file, ct", + Usage: "coin template file", + Value: "coin.template", + }, + cli.StringFlag{ + Name: "visor-template-file, vt", + Usage: "visor template file", + Value: "visor.template", + }, + cli.StringFlag{ + Name: "config-dir, cd", + Usage: "config directory path", + Value: "./", + }, + cli.StringFlag{ + Name: "config-file, cf", + Usage: "config file path", + Value: "fiber.toml", + }, + }, + Action: func(c *cli.Context) error { + // -- parse flags -- // + + templateDir := c.String("template-dir") + + coinTemplateFile := c.String("coin-template-file") + visorTemplateFile := c.String("visor-template-file") + + // check that the coin template file exists + if _, err := os.Stat(filepath.Join(templateDir, coinTemplateFile)); os.IsNotExist(err) { + return err + } + // check that the visor template file exists + if _, err := os.Stat(filepath.Join(templateDir, visorTemplateFile)); os.IsNotExist(err) { + return err + } + + configFile := c.String("config-file") + configDir := c.String("config-dir") + + configFilepath := filepath.Join(configDir, configFile) + // check that the config file exists + if _, err := os.Stat(configFilepath); os.IsNotExist(err) { + return err + } + + coinName := c.String("coin") + + // -- parse template and create new coin.go and visor parameters.go -- // + + config, err := skycoin.NewParameters(configFile, configDir) + if err != nil { + log.Errorf("failed to create new fiber coin config") + return err + } + + coinDir := fmt.Sprintf("./cmd/%s", coinName) + // create new coin directory + // MkdirAll does not error out if the directory already exists + err = os.MkdirAll(coinDir, 0755) + if err != nil { + log.Errorf("failed to create new coin directory %s", coinDir) + return err + } + + // we have to always create a new file otherwise the templating gives an error + coinFilePath := fmt.Sprintf("./cmd/%[1]s/%[1]s.go", coinName) + coinFile, err := os.Create(coinFilePath) + if err != nil { + log.Errorf("failed to create new coin file %s", coinFilePath) + return err + } + + visorParamsFile, err := os.Create("./src/visor/parameters.go") + if err != nil { + log.Errorf("failed to create new visor parameters.go") + return err + } + + // change dir so that text/template can parse the file + err = os.Chdir(templateDir) + if err != nil { + log.Errorf("failed to change directory to %s", templateDir) + return err + } + + t := template.New(coinTemplateFile) + t, err = t.ParseFiles(coinTemplateFile, visorTemplateFile) + if err != nil { + log.Errorf("failed to parse template file: %s", coinTemplateFile) + return err + } + + err = t.ExecuteTemplate(coinFile, coinTemplateFile, CoinTemplateParameters{ + Version: config.Build.Version, + PeerListURL: config.Node.PeerListURL, + Port: config.Node.Port, + WebInterfacePort: config.Node.WebInterfacePort, + DataDirectory: "$HOME/." + coinName, + ProfileCPUFile: coinName + ".prof", + GenesisSignatureStr: config.Node.GenesisSignatureStr, + GenesisAddressStr: config.Node.GenesisAddressStr, + BlockchainPubkeyStr: config.Node.BlockchainPubkeyStr, + BlockchainSeckeyStr: config.Node.BlockchainSeckeyStr, + GenesisTimestamp: config.Node.GenesisTimestamp, + GenesisCoinVolume: config.Node.GenesisCoinVolume, + DefaultConnections: config.Node.DefaultConnections, + }) + if err != nil { + log.Errorf("failed to parse coin template variables") + return err + } + + err = t.ExecuteTemplate(visorParamsFile, visorTemplateFile, config.Visor) + if err != nil { + log.Errorf("failed to parse visor params template variables") + return err + } + + return nil + }, + } +} + +func main() { + if e := app.Run(os.Args); e != nil { + log.Fatal(e) + } +} diff --git a/cmd/solarbankerscoin/solarbankerscoin.go b/cmd/solarbankerscoin/solarbankerscoin.go index dca7ee6..52b00e6 100755 --- a/cmd/solarbankerscoin/solarbankerscoin.go +++ b/cmd/solarbankerscoin/solarbankerscoin.go @@ -1,38 +1,16 @@ package main import ( - "flag" - "fmt" - "log" -"io" - - "net/http" _ "net/http/pprof" - "os" - "os/user" - "os/signal" - "path/filepath" - "runtime/debug" - "runtime/pprof" - "sync" - "syscall" - "time" - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/gui" - "github.com/skycoin/skycoin/src/util/browser" - "github.com/skycoin/skycoin/src/util/cert" - "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/skycoin" "github.com/skycoin/skycoin/src/util/logging" "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" ) var ( // Version of the node. Can be set by -ldflags - Version = "0.23.1-rc2" + Version = "0.24.1" // Commit ID. Can be set by -ldflags Commit = "" // Branch name. Can be set by -ldflags @@ -42,8 +20,6 @@ var ( // Can be set by -ldflags ConfigMode = "" - help = false - logger = logging.MustGetLogger("main") // GenesisSignatureStr hex string of genesis signature @@ -53,7 +29,7 @@ var ( // BlockchainPubkeyStr pubic key string BlockchainPubkeyStr = "02c656f4b2ab967f24109b01fb7bce30d76ce9cf1e28ef05b73cc3a5b0bd0f6447" // BlockchainSeckeyStr empty private key string - BlockchainSeckeyStr = "" + BlockchainSeckeyStr = "3a9a608e2f27d52fdbddd2ba2cfd7a0aabb6adb11dc9c1a4c8455080397b72eb" // GenesisTimestamp genesis block create unix time GenesisTimestamp uint64 = 1522660056 @@ -67,798 +43,43 @@ var ( "172.104.173.74:30002", "172.104.173.74:30000", "172.104.52.230:30000", +"18.218.142.16:30000", +"13.58.196.172:30000", } ) - -// Config records the node's configuration -type Config struct { - // Disable peer exchange - DisablePEX bool - // Download peer list - DownloadPeerList bool - // Download the peers list from this URL - PeerListURL string - // Don't make any outgoing connections - DisableOutgoingConnections bool - // Don't allowing incoming connections - DisableIncomingConnections bool - // Disables networking altogether - DisableNetworking bool - // Disables wallet API - EnableWalletAPI bool - // Disable CSRF check in the wallet api - DisableCSRF bool - // Enable /wallet/seed api endpoint - EnableSeedAPI bool - - // Only run on localhost and only connect to others on localhost - LocalhostOnly bool - // Which address to serve on. Leave blank to automatically assign to a - // public interface - Address string - //gnet uses this for TCP incoming and outgoing - Port int - //max outgoing connections to maintain - MaxOutgoingConnections int - // How often to make outgoing connections - OutgoingConnectionsRate time.Duration - // PeerlistSize represents the maximum number of peers that the pex would maintain - PeerlistSize int - // Wallet Address Version - //AddressVersion string - // Remote web interface - WebInterface bool - WebInterfacePort int - WebInterfaceAddr string - WebInterfaceCert string - WebInterfaceKey string - WebInterfaceHTTPS bool - - RPCInterface bool - - // Launch System Default Browser after client startup - LaunchBrowser bool - - // If true, print the configured client web interface address and exit - PrintWebInterfaceAddress bool - - // Data directory holds app data -- defaults to ~/.solarbankerscoin - DataDirectory string - // GUI directory contains assets for the html gui - GUIDirectory string - - ReadTimeout time.Duration - WriteTimeout time.Duration - IdleTimeout time.Duration - - // Logging - ColorLog bool - // This is the value registered with flag, it is converted to LogLevel after parsing - LogLevel string - // Disable "Reply to ping", "Received pong" log messages - DisablePingPong bool - - // Wallets - // Defaults to ${DataDirectory}/wallets/ - WalletDirectory string - // Wallet crypto type - WalletCryptoType string - - RunMaster bool - - GenesisSignature cipher.Sig - GenesisTimestamp uint64 - GenesisAddress cipher.Address - - BlockchainPubkey cipher.PubKey - BlockchainSeckey cipher.SecKey - - /* Developer options */ - - // Enable cpu profiling - ProfileCPU bool - // Where the file is written to - ProfileCPUFile string - // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) - HTTPProf bool - // Will force it to connect to this ip:port, instead of waiting for it - // to show up as a peer - ConnectTo string - - DBPath string - DBReadOnly bool - Arbitrating bool - LogToFile bool - Version bool // show node version -} - -func (c *Config) register() { - flag.BoolVar(&help, "help", false, "Show help") - flag.BoolVar(&c.DisablePEX, "disable-pex", c.DisablePEX, "disable PEX peer discovery") - flag.BoolVar(&c.DownloadPeerList, "download-peerlist", c.DownloadPeerList, "download a peers.txt from -peerlist-url") - flag.StringVar(&c.PeerListURL, "peerlist-url", c.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") - flag.BoolVar(&c.DisableOutgoingConnections, "disable-outgoing", c.DisableOutgoingConnections, "Don't make outgoing connections") - flag.BoolVar(&c.DisableIncomingConnections, "disable-incoming", c.DisableIncomingConnections, "Don't make incoming connections") - flag.BoolVar(&c.DisableNetworking, "disable-networking", c.DisableNetworking, "Disable all network activity") - flag.BoolVar(&c.EnableWalletAPI, "enable-wallet-api", c.EnableWalletAPI, "Enable the wallet API") - flag.BoolVar(&c.DisableCSRF, "disable-csrf", c.DisableCSRF, "disable CSRF check") - flag.BoolVar(&c.EnableSeedAPI, "enable-seed-api", c.EnableSeedAPI, "enable /wallet/seed api") - flag.StringVar(&c.Address, "address", c.Address, "IP Address to run application on. Leave empty to default to a public interface") - flag.IntVar(&c.Port, "port", c.Port, "Port to run application on") - - flag.BoolVar(&c.WebInterface, "web-interface", c.WebInterface, "enable the web interface") - flag.IntVar(&c.WebInterfacePort, "web-interface-port", c.WebInterfacePort, "port to serve web interface on") - flag.StringVar(&c.WebInterfaceAddr, "web-interface-addr", c.WebInterfaceAddr, "addr to serve web interface on") - flag.StringVar(&c.WebInterfaceCert, "web-interface-cert", c.WebInterfaceCert, "cert.pem file for web interface HTTPS. If not provided, will use cert.pem in -data-directory") - flag.StringVar(&c.WebInterfaceKey, "web-interface-key", c.WebInterfaceKey, "key.pem file for web interface HTTPS. If not provided, will use key.pem in -data-directory") - flag.BoolVar(&c.WebInterfaceHTTPS, "web-interface-https", c.WebInterfaceHTTPS, "enable HTTPS for web interface") - - flag.BoolVar(&c.RPCInterface, "rpc-interface", c.RPCInterface, "enable the rpc interface") - - flag.BoolVar(&c.LaunchBrowser, "launch-browser", c.LaunchBrowser, "launch system default webbrowser at client startup") - flag.BoolVar(&c.PrintWebInterfaceAddress, "print-web-interface-address", c.PrintWebInterfaceAddress, "print configured web interface address and exit") - flag.StringVar(&c.DataDirectory, "data-dir", c.DataDirectory, "directory to store app data (defaults to ~/.solarbankerscoin)") - flag.StringVar(&c.DBPath, "db-path", c.DBPath, "path of database file (defaults to ~/.solarbankerscoin/data.db)") - flag.BoolVar(&c.DBReadOnly, "db-read-only", c.DBReadOnly, "open bolt db read-only") - flag.StringVar(&c.ConnectTo, "connect-to", c.ConnectTo, "connect to this ip only") - flag.BoolVar(&c.ProfileCPU, "profile-cpu", c.ProfileCPU, "enable cpu profiling") - flag.StringVar(&c.ProfileCPUFile, "profile-cpu-file", c.ProfileCPUFile, "where to write the cpu profile file") - flag.BoolVar(&c.HTTPProf, "http-prof", c.HTTPProf, "Run the http profiling interface") - flag.StringVar(&c.LogLevel, "log-level", c.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") - flag.BoolVar(&c.ColorLog, "color-log", c.ColorLog, "Add terminal colors to log output") - flag.BoolVar(&c.DisablePingPong, "no-ping-log", c.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) - flag.BoolVar(&c.LogToFile, "logtofile", c.LogToFile, "log to file") - flag.StringVar(&c.GUIDirectory, "gui-dir", c.GUIDirectory, "static content directory for the html gui") - - // Key Configuration Data - flag.BoolVar(&c.RunMaster, "master", c.RunMaster, "run the daemon as blockchain master server") - - flag.StringVar(&BlockchainPubkeyStr, "master-public-key", BlockchainPubkeyStr, "public key of the master chain") - flag.StringVar(&BlockchainSeckeyStr, "master-secret-key", BlockchainSeckeyStr, "secret key, set for master") - - flag.StringVar(&GenesisAddressStr, "genesis-address", GenesisAddressStr, "genesis address") - flag.StringVar(&GenesisSignatureStr, "genesis-signature", GenesisSignatureStr, "genesis block signature") - flag.Uint64Var(&c.GenesisTimestamp, "genesis-timestamp", c.GenesisTimestamp, "genesis block timestamp") - - flag.StringVar(&c.WalletDirectory, "wallet-dir", c.WalletDirectory, "location of the wallet files. Defaults to ~/.solarbankerscoin/wallet/") - flag.IntVar(&c.MaxOutgoingConnections, "max-outgoing-connections", c.MaxOutgoingConnections, "The maximum outgoing connections allowed") - flag.IntVar(&c.PeerlistSize, "peerlist-size", c.PeerlistSize, "The peer list size") - flag.DurationVar(&c.OutgoingConnectionsRate, "connection-rate", c.OutgoingConnectionsRate, "How often to make an outgoing connection") - flag.BoolVar(&c.LocalhostOnly, "localhost-only", c.LocalhostOnly, "Run on localhost and only connect to localhost peers") - flag.BoolVar(&c.Arbitrating, "arbitrating", c.Arbitrating, "Run node in arbitrating mode") - flag.StringVar(&c.WalletCryptoType, "wallet-crypto-type", c.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") - flag.BoolVar(&c.Version, "version", false, "show node version") -} - -var home = file.UserHome() - -var devConfig = Config{ - // Disable peer exchange - DisablePEX: false, - // Don't make any outgoing connections - DisableOutgoingConnections: false, - // Don't allowing incoming connections - DisableIncomingConnections: false, - // Disables networking altogether - DisableNetworking: false, - // Enable wallet API - EnableWalletAPI: false, - // Enable seed API - EnableSeedAPI: false, - // Disable CSRF check in the wallet api - DisableCSRF: false, - // Only run on localhost and only connect to others on localhost - LocalhostOnly: false, - // Which address to serve on. Leave blank to automatically assign to a - // public interface - Address: "", - //gnet uses this for TCP incoming and outgoing - Port: 30000, - // MaxOutgoingConnections is the maximum outgoing connections allowed. - MaxOutgoingConnections: 16, - DownloadPeerList: false, - PeerListURL: "https://downloads.solarbankerscoin.net/blockchain/peers.txt", - // How often to make outgoing connections, in seconds - OutgoingConnectionsRate: time.Second * 5, - PeerlistSize: 65535, - // Wallet Address Version - //AddressVersion: "test", - // Remote web interface - WebInterface: true, - WebInterfacePort: 7220, - WebInterfaceAddr: "127.0.0.1", - WebInterfaceCert: "", - WebInterfaceKey: "", - WebInterfaceHTTPS: false, - PrintWebInterfaceAddress: false, - - RPCInterface: true, - - LaunchBrowser: false, - // Data directory holds app data -- defaults to ~/.solarbankerscoin - DataDirectory: filepath.Join(home, ".solarbankerscoin"), - // Web GUI static resources - GUIDirectory: "./src/gui/static/", - // Logging - ColorLog: true, - LogLevel: "INFO", - LogToFile: false, - DisablePingPong: false, - - // Wallets - WalletDirectory: "", - WalletCryptoType: string(wallet.CryptoTypeScryptChacha20poly1305), - - // Timeout settings for http.Server - // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ - ReadTimeout: 10 * time.Second, - WriteTimeout: 60 * time.Second, - IdleTimeout: 120 * time.Second, - - // Centralized network configuration - RunMaster: false, - BlockchainPubkey: cipher.PubKey{}, - BlockchainSeckey: cipher.SecKey{}, - - GenesisAddress: cipher.Address{}, - GenesisTimestamp: GenesisTimestamp, - GenesisSignature: cipher.Sig{}, - - /* Developer options */ - - // Enable cpu profiling - ProfileCPU: false, - // Where the file is written to - ProfileCPUFile: "skycoin.prof", - // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) - HTTPProf: false, - // Will force it to connect to this ip:port, instead of waiting for it - // to show up as a peer - ConnectTo: "", -} - -func init() { - applyConfigMode() -} - -func applyConfigMode() { - switch ConfigMode { - case "": - case "STANDALONE_CLIENT": - devConfig.EnableWalletAPI = true - devConfig.EnableSeedAPI = true - devConfig.LaunchBrowser = true - devConfig.DisableCSRF = false - devConfig.DownloadPeerList = true - devConfig.RPCInterface = false - devConfig.WebInterface = true - devConfig.LogToFile = false - devConfig.ColorLog = true - default: - panic("Invalid ConfigMode") - } -} - -// Parse prepare the config -func (c *Config) Parse() { - c.register() - flag.Parse() - if help { - flag.Usage() - os.Exit(0) - } - c.postProcess() -} - -func (c *Config) postProcess() { - var err error - if GenesisSignatureStr != "" { - c.GenesisSignature, err = cipher.SigFromHex(GenesisSignatureStr) - panicIfError(err, "Invalid Signature") - } - if GenesisAddressStr != "" { - c.GenesisAddress, err = cipher.DecodeBase58Address(GenesisAddressStr) - panicIfError(err, "Invalid Address") - } - if BlockchainPubkeyStr != "" { - c.BlockchainPubkey, err = cipher.PubKeyFromHex(BlockchainPubkeyStr) - panicIfError(err, "Invalid Pubkey") - } - if BlockchainSeckeyStr != "" { - c.BlockchainSeckey, err = cipher.SecKeyFromHex(BlockchainSeckeyStr) - panicIfError(err, "Invalid Seckey") - BlockchainSeckeyStr = "" - } - if BlockchainSeckeyStr != "" { - c.BlockchainSeckey = cipher.SecKey{} - } - - c.DataDirectory, err = file.InitDataDir(c.DataDirectory) - panicIfError(err, "Invalid DataDirectory") - - if c.WebInterfaceCert == "" { - c.WebInterfaceCert = filepath.Join(c.DataDirectory, "cert.pem") - } - if c.WebInterfaceKey == "" { - c.WebInterfaceKey = filepath.Join(c.DataDirectory, "key.pem") - } - - if c.WalletDirectory == "" { - c.WalletDirectory = filepath.Join(c.DataDirectory, "wallets") - } - - if c.DBPath == "" { - c.DBPath = filepath.Join(c.DataDirectory, "data.db") - } - - if c.RunMaster { - // Run in arbitrating mode if the node is master - c.Arbitrating = true - } - - // Don't open browser to load wallets if wallet apis are disabled. - if c.EnableWalletAPI { - c.GUIDirectory = file.ResolveResourceDirectory(c.GUIDirectory) - } else { - c.LaunchBrowser = false - } -} - -func panicIfError(err error, msg string, args ...interface{}) { - if err != nil { - log.Panicf(msg+": %v", append(args, err)...) - } -} - -func printProgramStatus() { - p := pprof.Lookup("goroutine") - if err := p.WriteTo(os.Stdout, 2); err != nil { - fmt.Println("ERROR:", err) - return - } -} - -// Catches SIGUSR1 and prints internal program state -func catchDebug() { - sigchan := make(chan os.Signal, 1) - //signal.Notify(sigchan, syscall.SIGUSR1) - signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) - for { - select { - case <-sigchan: - printProgramStatus() - } - } -} - -func catchInterrupt(quit chan<- struct{}) { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - <-sigchan - signal.Stop(sigchan) - close(quit) - - // If ctrl-c is called again, panic so that the program state can be examined. - // Ctrl-c would be called again if program shutdown was stuck. - go catchInterruptPanic() -} - -// catchInterruptPanic catches os.Interrupt and panics -func catchInterruptPanic() { - sigchan := make(chan os.Signal, 1) - signal.Notify(sigchan, os.Interrupt) - <-sigchan - signal.Stop(sigchan) - printProgramStatus() - panic("SIGINT") -} - -func createGUI(c *Config, d *daemon.Daemon, host string) (*gui.Server, error) { - var s *gui.Server - var err error - - config := gui.Config{ - StaticDir: c.GUIDirectory, - DisableCSRF: c.DisableCSRF, - EnableWalletAPI: c.EnableWalletAPI, - EnableJSON20RPC: c.RPCInterface, - ReadTimeout: c.ReadTimeout, - WriteTimeout: c.WriteTimeout, - IdleTimeout: c.IdleTimeout, - } - - if c.WebInterfaceHTTPS { - // Verify cert/key parameters, and if neither exist, create them - if err := cert.CreateCertIfNotExists(host, c.WebInterfaceCert, c.WebInterfaceKey, "Skycoind"); err != nil { - logger.Errorf("gui.CreateCertIfNotExists failure: %v", err) - return nil, err - } - - s, err = gui.CreateHTTPS(host, config, d, c.WebInterfaceCert, c.WebInterfaceKey) - } else { - s, err = gui.Create(host, config, d) - } - if err != nil { - logger.Errorf("Failed to start web GUI: %v", err) - return nil, err - } - - return s, nil -} - -func initLogFile(dataDir string) (*os.File, error) { - logDir := filepath.Join(dataDir, "logs") - if err := createDirIfNotExist(logDir); err != nil { - logger.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) - return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) - } - - // open log file - tf := "2006-01-02-030405" - logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), Version)) - - f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) - if err != nil { - logger.Errorf("os.OpenFile(%s) failed: %v", logfile, err) - return nil, err - } - - hook := logging.NewWriteHook(f) - logging.AddHook(hook) - - return f, nil -} - -func initProfiling(httpProf, profileCPU bool, profileCPUFile string) { - if profileCPU { - f, err := os.Create(profileCPUFile) - if err != nil { - log.Fatal(err) - } - pprof.StartCPUProfile(f) - defer pprof.StopCPUProfile() - } - if httpProf { - go func() { - log.Println(http.ListenAndServe("localhost:6060", nil)) - }() - } -} - -func configureDaemon(c *Config) daemon.Config { - //cipher.SetAddressVersion(c.AddressVersion) - dc := daemon.NewConfig() - dc.Pex.DataDirectory = c.DataDirectory - dc.Pex.Disabled = c.DisablePEX - dc.Pex.Max = c.PeerlistSize - dc.Pex.DownloadPeerList = c.DownloadPeerList - dc.Pex.PeerListURL = c.PeerListURL - dc.Daemon.DisableOutgoingConnections = c.DisableOutgoingConnections - dc.Daemon.DisableIncomingConnections = c.DisableIncomingConnections - dc.Daemon.DisableNetworking = c.DisableNetworking - dc.Daemon.Port = c.Port - dc.Daemon.Address = c.Address - dc.Daemon.LocalhostOnly = c.LocalhostOnly - dc.Daemon.OutgoingMax = c.MaxOutgoingConnections - dc.Daemon.DataDirectory = c.DataDirectory - dc.Daemon.LogPings = !c.DisablePingPong - - if c.OutgoingConnectionsRate == 0 { - c.OutgoingConnectionsRate = time.Millisecond - } - dc.Daemon.OutgoingRate = c.OutgoingConnectionsRate - dc.Visor.Config.IsMaster = c.RunMaster - - dc.Visor.Config.BlockchainPubkey = c.BlockchainPubkey - dc.Visor.Config.BlockchainSeckey = c.BlockchainSeckey - - dc.Visor.Config.GenesisAddress = c.GenesisAddress - dc.Visor.Config.GenesisSignature = c.GenesisSignature - dc.Visor.Config.GenesisTimestamp = c.GenesisTimestamp - dc.Visor.Config.GenesisCoinVolume = GenesisCoinVolume - dc.Visor.Config.DBPath = c.DBPath - dc.Visor.Config.DBReadOnly = c.DBReadOnly - dc.Visor.Config.Arbitrating = c.Arbitrating - dc.Visor.Config.EnableWalletAPI = c.EnableWalletAPI - dc.Visor.Config.WalletDirectory = c.WalletDirectory - dc.Visor.Config.BuildInfo = visor.BuildInfo{ - Version: Version, - Commit: Commit, - Branch: Branch, - } - dc.Visor.Config.EnableSeedAPI = c.EnableSeedAPI - - dc.Gateway.EnableWalletAPI = c.EnableWalletAPI - - // Initialize wallet default crypto type - cryptoType, err := wallet.CryptoTypeFromString(c.WalletCryptoType) - if err != nil { - log.Panic(err) - } - - dc.Visor.Config.WalletCryptoType = cryptoType - - return dc -} - -// Run starts the skycoin node -func Run(c *Config) { - defer func() { - // try catch panic in main thread - if r := recover(); r != nil { - logger.Errorf("recover: %v\nstack:%v", r, string(debug.Stack())) - } - }() - - if c.Version { - fmt.Println(Version) - return - } - - logLevel, err := logging.LevelFromString(c.LogLevel) - if err != nil { - logger.Error("Invalid -log-level:", err) - return - } - - logging.SetLevel(logLevel) - - if c.ColorLog { - logging.EnableColors() - } else { - logging.DisableColors() - } - - var logFile *os.File - if c.LogToFile { - var err error - logFile, err = initLogFile(c.DataDirectory) - if err != nil { - logger.Error(err) - return - } - } - - scheme := "http" - if c.WebInterfaceHTTPS { - scheme = "https" - } - host := fmt.Sprintf("%s:%d", c.WebInterfaceAddr, c.WebInterfacePort) - fullAddress := fmt.Sprintf("%s://%s", scheme, host) - logger.Critical().Infof("Full address: %s", fullAddress) - if c.PrintWebInterfaceAddress { - fmt.Println(fullAddress) - } - - initProfiling(c.HTTPProf, c.ProfileCPU, c.ProfileCPUFile) - - var wg sync.WaitGroup - - // If the user Ctrl-C's, shutdown properly - quit := make(chan struct{}) - - wg.Add(1) - go func() { - defer wg.Done() - catchInterrupt(quit) - }() - - // Watch for SIGUSR1 - wg.Add(1) - func() { - defer wg.Done() - go catchDebug() - }() - - // creates blockchain instance - dconf := configureDaemon(c) - - logger.Infof("Opening database %s", dconf.Visor.Config.DBPath) - db, err := visor.OpenDB(dconf.Visor.Config.DBPath, dconf.Visor.Config.DBReadOnly) - if err != nil { - logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) - return - } - - d, err := daemon.NewDaemon(dconf, db, DefaultConnections) - if err != nil { - logger.Error(err) - return - } - - var webInterface *gui.Server - if c.WebInterface { - webInterface, err = createGUI(c, d, host) - if err != nil { - logger.Error(err) - return - } - } - - // Debug only - forces connection on start. Violates thread safety. - if c.ConnectTo != "" { - if err := d.Pool.Pool.Connect(c.ConnectTo); err != nil { - logger.Errorf("Force connect %s failed, %v", c.ConnectTo, err) - return - } - } - - errC := make(chan error, 10) - - wg.Add(1) - go func() { - defer wg.Done() - if err := d.Run(); err != nil { - logger.Error(err) - errC <- err - } - }() - - if c.WebInterface { - wg.Add(1) - go func() { - defer wg.Done() - if err := webInterface.Serve(); err != nil { - logger.Error(err) - errC <- err - } - }() - - if c.LaunchBrowser { - wg.Add(1) - go func() { - defer wg.Done() - - // Wait a moment just to make sure the http interface is up - time.Sleep(time.Millisecond * 100) - - logger.Infof("Launching System Browser with %s", fullAddress) - if err := browser.Open(fullAddress); err != nil { - logger.Error(err) - return - } - }() - } - } - - /* - time.Sleep(5) - tx := InitTransaction() - _ = tx - err, _ = d.Visor.Visor.InjectTransaction(tx) - if err != nil { - log.Panic(err) - } - */ - - /* - //first transaction - if c.RunMaster == true { - go func() { - for d.Visor.Visor.Blockchain.Head().Seq() < 2 { - time.Sleep(5) - tx := InitTransaction() - err, _ := d.Visor.Visor.InjectTransaction(tx) - if err != nil { - //log.Panic(err) - } - } - }() - } - */ - - select { - case <-quit: - case err := <-errC: - logger.Error(err) - } - - logger.Info("Shutting down...") - if webInterface != nil { - webInterface.Shutdown() - } - d.Shutdown() - wg.Wait() - - logger.Info("Goodbye") - - if logFile != nil { - if err := logFile.Close(); err != nil { - fmt.Println("Failed to close log file") - } - } -} - func main() { -usr, err := user.Current() - if err != nil { - log.Fatal( err ) - } - logger.Info( usr.HomeDir ) - // Open original file - originalFile, err := os.Open("data.db") - if err != nil { - log.Fatal(err) - } - defer originalFile.Close() - -createDirIfNotExist(usr.HomeDir+"/.solarbankerscoin") -if _, err := os.Stat(usr.HomeDir+"/.solarbankerscoin/data.db"); os.IsNotExist(err) { - // Create new file - newFile, err := os.Create(usr.HomeDir+"/.solarbankerscoin/data.db") - if err != nil { - log.Fatal(err) - } - defer newFile.Close() - - // Copy the bytes to destination from source - bytesWritten, err := io.Copy(newFile, originalFile) - if err != nil { - log.Fatal(err) - } - log.Printf("Copied %d bytes.", bytesWritten) - - // Commit the file contents - // Flushes memory to disk - err = newFile.Sync() - if err != nil { - log.Fatal(err) - } } - - devConfig.Parse() - Run(&devConfig) -} - -// InitTransaction creates the initialize transaction -func InitTransaction() coin.Transaction { - var tx coin.Transaction - - output := cipher.MustSHA256FromHex("043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0") - tx.PushInput(output) - - addrs := visor.GetDistributionAddresses() - - if len(addrs) != 100 { - log.Panic("Should have 100 distribution addresses") - } - - // 1 million per address, measured in droplets - if visor.DistributionAddressInitialBalance != 1e6 { - log.Panic("visor.DistributionAddressInitialBalance expected to be 1e6*1e6") - } - - for i := range addrs { - addr := cipher.MustDecodeBase58Address(addrs[i]) - tx.PushOutput(addr, visor.DistributionAddressInitialBalance*1e6, 1) - } - /* - seckeys := make([]cipher.SecKey, 1) - seckey := "" - seckeys[0] = cipher.MustSecKeyFromHex(seckey) - tx.SignInputs(seckeys) - */ - - txs := make([]cipher.Sig, 1) - sig := "ed9bd7a31fe30b9e2d53b35154233dfdf48aaaceb694a07142f84cdf4f5263d21b723f631817ae1c1f735bea13f0ff2a816e24a53ccb92afae685fdfc06724de01" - txs[0] = cipher.MustSigFromHex(sig) - tx.Sigs = txs - - tx.UpdateHeader() - - err := tx.Verify() - - if err != nil { - log.Panic(err) - } - - log.Printf("signature= %s", tx.Sigs[0].Hex()) - return tx -} - -func createDirIfNotExist(dir string) error { - if _, err := os.Stat(dir); !os.IsNotExist(err) { - return nil - } - - return os.Mkdir(dir, 0777) + // get node config + nodeConfig := skycoin.NewNodeConfig(ConfigMode, skycoin.NodeParameters{ + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "https://solarbankers.com/peers.txt", + Port: 30005, + WebInterfacePort: 7220, + DataDirectory: "$HOME/.solarbankerscoin", + ProfileCPUFile: "skycoin.prof", + }) + + // create a new fiber coin instance + coin := skycoin.NewCoin( + skycoin.Config{ + Node: *nodeConfig, + Build: visor.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, + logger, + ) + + // parse config values + coin.ParseConfig() + + // run fiber coin node + coin.Run() } diff --git a/data.db b/data.db deleted file mode 100755 index b2757bb..0000000 Binary files a/data.db and /dev/null differ diff --git a/docker/images/dev-cli/Dockerfile b/docker/images/dev-cli/Dockerfile new file mode 100755 index 0000000..4c3d744 --- /dev/null +++ b/docker/images/dev-cli/Dockerfile @@ -0,0 +1,202 @@ +# Creates an image for skycoin development +FROM golang:1.10.2-stretch + +# Installs nodejs and npm. Needed for moxygen. + +# Packages installed in buildpack-deps:stretch +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + autoconf \ + automake \ + bzip2 \ + dpkg-dev \ + file \ + g++ \ + gcc \ + imagemagick \ + libbz2-dev \ + libc6-dev \ + libcurl4-openssl-dev \ + libdb-dev \ + libevent-dev \ + libffi-dev \ + libgdbm-dev \ + libgeoip-dev \ + libglib2.0-dev \ + libjpeg-dev \ + libkrb5-dev \ + liblzma-dev \ + libmagickcore-dev \ + libmagickwand-dev \ + libncurses5-dev \ + libncursesw5-dev \ + libpng-dev \ + libpq-dev \ + libreadline-dev \ + libsqlite3-dev \ + libssl-dev \ + libtool \ + libwebp-dev \ + libxml2-dev \ + libxslt-dev \ + libyaml-dev \ + make \ + patch \ + xz-utils \ + zlib1g-dev \ + build-essential \ + \ +# No need for MySQL client +# +# # https://lists.debian.org/debian-devel-announce/2016/09/msg00000.html +# $( \ +# # if we use just "apt-cache show" here, it returns zero because "Can't select versions from package 'libmysqlclient-dev' as it is purely virtual", hence the pipe to grep +# if apt-cache show 'default-libmysqlclient-dev' 2>/dev/null | grep -q '^Version:'; then \ +# echo 'default-libmysqlclient-dev'; \ +# else \ +# echo 'libmysqlclient-dev'; \ +# fi \ +# ) \ + ; \ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +# Build steps in node:10 (uid=2000) +RUN groupadd --gid 2000 node \ + && useradd --uid 2000 --gid node --shell /bin/bash --create-home node + +# gpg keys listed at https://github.com/nodejs/node#release-team +RUN set -ex \ + && for key in \ + 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ + FD3A5288F042B6850C66B31F09FE44734EB7990E \ + 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ + DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ + C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ + B9AE9905FFD7803F25714661B63B535A4C206CA9 \ + 56730D5401028683275BD23C23EFEFE93C4CFFFE \ + 77984A986EBC2AA786BC0F66B01FBB92821C587A \ + ; do \ + gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done + +ENV NODE_VERSION 10.2.1 + +RUN ARCH= && dpkgArch="$(dpkg --print-architecture)" \ + && case "${dpkgArch##*-}" in \ + amd64) ARCH='x64';; \ + ppc64el) ARCH='ppc64le';; \ + s390x) ARCH='s390x';; \ + arm64) ARCH='arm64';; \ + armhf) ARCH='armv7l';; \ + i386) ARCH='x86';; \ + *) echo "unsupported architecture"; exit 1 ;; \ + esac \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH.tar.xz" \ + && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ + && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ + && grep " node-v$NODE_VERSION-linux-$ARCH.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v$NODE_VERSION-linux-$ARCH.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ + && rm "node-v$NODE_VERSION-linux-$ARCH.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ + && ln -s /usr/local/bin/node /usr/local/bin/nodejs + +ENV YARN_VERSION 1.7.0 + +RUN set -ex \ + && for key in \ + 6A010C5166006599AA17F08146C2130DFD2497F5 \ + ; do \ + gpg --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys "$key" || \ + gpg --keyserver hkp://ipv4.pool.sks-keyservers.net --recv-keys "$key" || \ + gpg --keyserver hkp://pgp.mit.edu:80 --recv-keys "$key" ; \ + done \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ + && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ + && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ + && mkdir -p /opt \ + && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ + && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz + +# Installs software +RUN set -ex ; \ + apt-get update ; \ + apt-get install -y --no-install-recommends \ + cmake \ + libpcre3-dev \ + gdbserver \ + gdb \ + vim \ + less \ + ctags \ + vim-scripts \ + screen \ + sudo \ + doxygen \ + valgrind \ + bsdmainutils \ + texlive-latex-base \ + ; \ + apt-get clean ; \ + rm -rf /var/lib/apt/lists/* ; \ + npm install moxygen -g ; \ + \ + \ + echo 'Installing Criterion ...' ; \ + git clone --recurse-submodules -j8 https://github.com/skycoin/Criterion /go/Criterion ; \ + cd /go/Criterion ; \ + cmake . ; \ + make install ; \ + rm -r /go/Criterion ; \ + echo 'Success nstalling Criterion ...' + +# Installs go development tools +RUN go get -u github.com/derekparker/delve/cmd/dlv && \ + go get -u github.com/FiloSottile/vendorcheck && \ + go get -u github.com/alecthomas/gometalinter && \ + gometalinter --vendored-linters --install && \ + go get -u github.com/zmb3/gogetdoc && \ + go get -u golang.org/x/tools/cmd/guru && \ + go get -u github.com/davidrjenni/reftools/cmd/fillstruct && \ + go get -u github.com/rogpeppe/godef && \ + go get -u github.com/fatih/motion && \ + go get -u github.com/nsf/gocode && \ + go get -u github.com/jstemmer/gotags && \ + go get -u github.com/josharian/impl && \ + go get -u github.com/fatih/gomodifytags && \ + go get -u github.com/dominikh/go-tools/cmd/keyify && \ + go get -u golang.org/x/tools/cmd/gorename && \ + go get -u github.com/klauspost/asmfmt/cmd/asmfmt && \ + go get -u github.com/ernesto-jimenez/goautomock && \ + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + + +# Install vim-go development tools +RUN git clone https://github.com/fatih/vim-go /usr/share/vim/vim80/pack/dev/start/vim-go && \ + git clone https://github.com/tpope/vim-fugitive /usr/share/vim/vim80/pack/dev/start/vim-fugitive && \ + git clone https://github.com/Shougo/vimshell.vim /usr/share/vim/vim80/pack/dev/start/0vimshell && \ + git clone https://github.com/Shougo/vimproc.vim /usr/share/vim/vim80/pack/dev/start/0vimproc && \ + git clone https://github.com/w0rp/ale.git /usr/share/vim/vim80/pack/dev/start/ale && \ + cd /usr/share/vim/vim80/pack/dev/start/0vimproc && make ;\ + git clone https://github.com/iberianpig/tig-explorer.vim.git /tmp/tig-explorer;\ + cp /tmp/tig-explorer/autoload/tig_explorer.vim /usr/share/vim/vim80/autoload;\ + cp /tmp/tig-explorer/plugin/tig_explorer.vim /usr/share/vim/vim80/plugin;\ + rm -rf /tmp/tig-explorer + + +# Install SWIG-3.0.12 +RUN cd /tmp/; \ + wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz && \ + tar -zxf swig-3.0.12.tar.gz ; \ + cd swig-3.0.12 ;\ + ./configure --prefix=/usr && make && make install && \ + rm -rf /tmp/swig-* + +WORKDIR $GOPATH/src/github.com/skycoin +VOLUME $GOPATH/src/ + +ENV LD_LIBRARY_PATH=/usr/local/lib diff --git a/docker/images/dev-cli/README.md b/docker/images/dev-cli/README.md new file mode 100755 index 0000000..bad0a42 --- /dev/null +++ b/docker/images/dev-cli/README.md @@ -0,0 +1,74 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`latest` (*docker/images/skycoindev-cli/Dockerfile*)](https://github.com/skycoin/skycoin/tree/develop/docker/images/skycoindev-cli/Dockerfile) + +# Skycoin development image + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git. + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli \ + go get github.com/skycoin/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/skycoin/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing the them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli \ + vim +``` + +## Additional tools and packages installed + +### Packages + +- dep +- tig +- swig + +### Vim's plugins + +- Ale +- tig-explorer + diff --git a/docker/images/dev-cli/repo-info/README.md b/docker/images/dev-cli/repo-info/README.md new file mode 100755 index 0000000..b74654e --- /dev/null +++ b/docker/images/dev-cli/repo-info/README.md @@ -0,0 +1,16 @@ +# `skycoin/skycoindev-cli:develop` repo-info + +This directory contains additional information about the published artifacts of [the `skycoin/skycoindev-cli:develop` official image](https://hub.docker.com/r/skycoin/skycoindev-cli/). + +- [the `remote` directory](remote/): + + - gathered from the Docker Hub/Registry API + + - image digests/blobs, transfer sizes, image metadata, etc. + +- [the `local` directory](local/): + + - inspected from the image on-disk after it is pulled + + - installed packages, creation date, architecture, environment variables, detected licenses, etc. + diff --git a/docker/images/dev-cli/repo-info/local/develop.md b/docker/images/dev-cli/repo-info/local/develop.md new file mode 100755 index 0000000..bb46bba --- /dev/null +++ b/docker/images/dev-cli/repo-info/local/develop.md @@ -0,0 +1,17 @@ +# `skycoin/skycoindev-cli:develop` + +## Docker Metadata + +- Image ID: `sha256:741211afec4dcc09b6dffc9aad631a0d6c1c5fa25cae8a8d2eae9e4534de3162` +- Created: `2018-07-02T22:18:09.770106655Z` +- Virtual Size: ~ 2.08 Gb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Command: `["bash"]` +- Environment: + - `PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `GOLANG_VERSION=1.10.2` + - `GOPATH=/go` + - `NODE_VERSION=10.2.1` + - `YARN_VERSION=1.7.0` + - `LD_LIBRARY_PATH=/usr/local/lib` diff --git a/docker/images/dev-cli/repo-info/remote/develop.md b/docker/images/dev-cli/repo-info/remote/develop.md new file mode 100755 index 0000000..127fade --- /dev/null +++ b/docker/images/dev-cli/repo-info/remote/develop.md @@ -0,0 +1,79 @@ +## `skycoin/skycoindev-cli:develop` + +```console +$ docker pull skycoin/skycoin@sha256:7c1d1d2acfc098ae172b565e8b1975d37a3b8d945b82c78010c47c950cc020b7 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:cc1a78bfd46becbfc3abb8a74d9a70a0e0dc7a5809bbd12e814f9382db003707 + - sha256:d2c05365ee2a2245bb9f6786bc88aa12bf64da676a52668424437826d0f0cb92 + - sha256:231cb0e216d30ea48044d44d37fba016eb67eca9b19b29a741d95775359d3533 + - sha256:3d2aa70286b89febc36370098220c9b2960cc67c03375c9df4e82736519f1e8a + - sha256:6b387538c1ae7468ba635e703c1f55e68ef1634290958da056185f5ce529dba4 + - sha256:39f9c30eddc9211649a148492c59b81dfe6ecff769bd96462220d1329fb62718 + - sha256:f4e296016ab64df5cf193e6e2c3391e2f3e8689de8765dc966f14bcc042ce7a3 + - sha256:dd412a416bc36702f39e14277ae2e43103c7251f49c27b369c2de5dc4bc8d209 + - sha256:2d071012d44f8781afad94e13709c0d3ea6ac66dc9bdef0a9d35c893d045d13e + - sha256:88c53c392054ea0bc1405502a0af2d7439b1d340690312ef6d5fae630ec025e5 + - sha256:748b5ee860b04de9f71702e12108249c4ed29ad7226a2d659b3cf14417c4a618 + - sha256:b6942952f9935f0f0bd813a2d379c1e6b22da183315cda30fd0b590806b7610a + - sha256:22084e1c017fce593f31454bc27238c267953d6fc162eccef0928b204cf67593 + - sha256:9ae2147d285fb3720eab6350aa36c0611bd713ef51345e11b61617099f6abce4 + - sha256:8f210d9cfd5af953f8daff98f74a29b21ec115fa50155cb9f76a2f549f40ff81 + - sha256:a00e162b8cbd633a07d10b4cd105234db559f14bf4b87124b8bfa6faf0ea4d4e + - sha256:92b5df9979d594a665691e680c469deca3726c3f6203d1b084f56ae5d9b31b96 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-02T22:18:08.316631342Z +VOLUME [/go/src/] +# 2018-07-02T22:18:08.316631342Z +WORKDIR /go/src/github.com/skycoin\ +# 2018-07-02T22:18:08.316631342Z +cd /tmp/; \ +wget http://prdownloads.sourceforge.net/swig/swig-3.0.12.tar.gz && \ +tar -zxf swig-3.0.12.tar.gz ;\ +cd swig-3.0.12 ;\ +./configure --prefix=/usr && \ +make && \ +make install && \ +rm -rf /tmp/swig-* +# 2018-07-02T22:18:08.316631342Z +git clone https://github.com/fatih/vim-go /usr/share/vim/vim80/pack/dev/start/vim-go && \ +git clone https://github.com/tpope/vim-fugitive /usr/share/vim/vim80/pack/dev/start/vim-fugitive && \ +git clone https://github.com/Shougo/vimshell.vim /usr/share/vim/vim80/pack/dev/start/0vimshell && \ +git clone https://github.com/Shougo/vimproc.vim /usr/share/vim/vim80/pack/dev/start/0vimproc && \ +git clone https://github.com/w0rp/ale.git /usr/share/vim/vim80/pack/dev/start/ale && \ +cd /usr/share/vim/vim80/pack/dev/start/0vimproc && \ +make ; \ +git clone https://github.com/iberianpig/tig-explorer.vim.git /tmp/tig-explorer; \ +cp /tmp/tig-explorer/autoload/tig_explorer.vim /usr/share/vim/vim80/autoload; \ +cp /tmp/tig-explorer/plugin/tig_explorer.vim /usr/share/vim/vim80/plugin; \ +rm -rf /tmp/tig-explorer +# 2018-07-02T22:18:08.316631342Z +go get -u github.com/derekparker/delve/cmd/dlv && \ +go get -u github.com/FiloSottile/vendorcheck && \ +go get -u github.com/alecthomas/gometalinter && \ +gometalinter --vendored-linters --install && \ +go get -u github.com/zmb3/gogetdoc && \ +go get -u golang.org/x/tools/cmd/guru && \ +go get -u github.com/davidrjenni/reftools/cmd/fillstruct && \ +go get -u github.com/rogpeppe/godef && \ +go get -u github.com/fatih/motion && \ +go get -u github.com/nsf/gocode && \ +go get -u github.com/jstemmer/gotags && \ +go get -u github.com/josharian/impl && \ +go get -u github.com/fatih/gomodifytags && \ +go get -u github.com/dominikh/go-tools/cmd/keyify && \ +go get -u golang.org/x/tools/cmd/gorename && \ +go get -u github.com/klauspost/asmfmt/cmd/asmfmt && \ +go get -u github.com/ernesto-jimenez/goautomock && \ +curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh +``` diff --git a/docker/images/dev-docker/Dockerfile b/docker/images/dev-docker/Dockerfile new file mode 100755 index 0000000..680dcd9 --- /dev/null +++ b/docker/images/dev-docker/Dockerfile @@ -0,0 +1,63 @@ +# Creates an image for skycoin development +FROM skycoin/skycoindev-cli:develop + +# Install docker + +RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - +RUN apt-key fingerprint 0EBFCD88 +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + lsb-release \ + software-properties-common \ + apt-transport-https + +RUN add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/debian \ + $(lsb_release -cs) \ + stable" + +RUN set -ex; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + btrfs-progs \ + e2fsprogs \ + iptables \ + xfsprogs \ + ca-certificates \ + gnupg2 \ + software-properties-common \ + pigz \ + docker-ce ;\ + apt-get clean; \ + rm -rf /var/lib/apt/lists/* + +COPY modprobe.sh /usr/local/bin/modprobe + +RUN set -x \ + && groupadd dockremap \ + && useradd -g dockremap dockremap \ + && echo 'dockremap:165536:65536' >> /etc/subuid \ + && echo 'dockremap:165536:65536' >> /etc/subgid + +ENV DIND_COMMIT 3b5fac462d21ca164b3778647420016315289034 + +RUN set -ex; \ + wget -O /usr/local/bin/dind "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind"; \ + chmod +x /usr/local/bin/dind; + +COPY dockerd-entrypoint.sh /usr/local/bin/ + +RUN ["chmod", "+x", "/usr/local/bin/dockerd-entrypoint.sh","/usr/local/bin/modprobe"] + +VOLUME /var/lib/docker + +EXPOSE 2375 + +#WORKDIR $GOPATH/src/github.com/skycoin +#VOLUME $GOPATH/src/ + +#ENV LD_LIBRARY_PATH=/usr/local/lib + +ENTRYPOINT ["/usr/local/bin/dockerd-entrypoint.sh"] +CMD [] diff --git a/docker/images/dev-docker/README.md b/docker/images/dev-docker/README.md new file mode 100755 index 0000000..47385d7 --- /dev/null +++ b/docker/images/dev-docker/README.md @@ -0,0 +1,84 @@ +# Supported tags and respective `Dockerfile` links + +## Simple Tags + +- [`dind` (*docker/images/devdocker/Dockerfile*)](https://github.com/skycoin/skycoin/tree/develop/docker/images/devdocker/Dockerfile) + +# Skycoin development image including [docker in docker](https://hub.docker.com/_/docker/) + +This image has the necessary tools to build, test, edit, lint and version the Skycoin +source code. It comes with the Vim editor installed, along with some plugins +to ease go development and version control with git, besides it comes with docker installed. + +# How to use this image + +## Initialize your development environment. + +```sh +$ mkdir src +$ docker run --privileged --rm \ + -v src:/go/src skycoin/skycoindev-cli:dind \ + go get github.com/skycoin/skycoin +$ sudo chown -R `whoami` src +``` + +This downloads the skycoin source to src/skycoin/skycoin and changes the owner +to your user. This is necessary, because all processes inside the container run +as root and the files created by it are therefore owned by root. + +If you already have a Go development environment installed, you just need to +mount the src directory from your $GOPATH in the /go/src volume of the +container. + +## Running commands inside the container + +You can run commands by just passing them to the image. Everything is run +in a container and deleted when finished. + +### Running tests + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli:dind \ + sh -c "cd skycoin; make test" +``` + +### Running lint + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli:dind \ + sh -c "cd skycoin; make lint" +``` + +### Editing code + +```sh +$ docker run --rm \ + -v src:/go/src skycoin/skycoindev-cli:dind \ + vim +``` + +## How to use docker in docker image + +### Start a daemon instance + +```sh +$ docker run --privileged --name some-name -d skycoin/skycoindev-cli:dind +``` + +### Where to store data + +Create a data directory on the host system (outside the container) and mount this to a directory visible from inside the container. + +The downside is that you need to make sure that the directory exists, and that e.g. directory permissions and other security mechanisms on the host system are set up correctly. + +1. Create a data directory on a suitable volume on your host system, e.g. /my/own/var-lib-docker. +2. Start your docker container like this: + +```sh +$ docker run --privileged --name some-name -v /my/own/var-lib-docker:/var/lib/docker \ +-d skycoin/skycoindev-cli:dind +``` + + diff --git a/docker/images/dev-docker/dockerd-entrypoint.sh b/docker/images/dev-docker/dockerd-entrypoint.sh new file mode 100755 index 0000000..05cc91b --- /dev/null +++ b/docker/images/dev-docker/dockerd-entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -e + +# no arguments passed +# or first arg is `-f` or `--some-option` +if [ "$#" -eq 0 -o "${1#-}" != "$1" ]; then + # add our default arguments + set -- dockerd \ + --host=unix:///var/run/docker.sock \ + --host=tcp://0.0.0.0:2375 \ + "$@" +fi + +if [ "$1" = 'dockerd' ]; then + # if we're running Docker, let's pipe through dind + # (and we'll run dind explicitly with "sh" since its shebang is /bin/bash) + set -- sh "$(which dind)" "$@" +fi + +exec "$@" diff --git a/docker/images/dev-docker/modprobe.sh b/docker/images/dev-docker/modprobe.sh new file mode 100755 index 0000000..b357d89 --- /dev/null +++ b/docker/images/dev-docker/modprobe.sh @@ -0,0 +1,20 @@ +#!/bin/sh +set -eu + +# "modprobe" without modprobe +# https://twitter.com/lucabruno/status/902934379835662336 + +# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe + +# Docker often uses "modprobe -va foo bar baz" +# so we ignore modules that start with "-" +for module; do + if [ "${module#-}" = "$module" ]; then + ip link show "$module" || true + lsmod | grep "$module" || true + fi +done + +# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort +export PATH='/usr/sbin:/usr/bin:/sbin:/bin' +exec modprobe "$@" diff --git a/docker/images/mainnet/Dockerfile b/docker/images/mainnet/Dockerfile index 90592b1..93c144b 100755 --- a/docker/images/mainnet/Dockerfile +++ b/docker/images/mainnet/Dockerfile @@ -1,7 +1,9 @@ # skycoin build # reference https://github.com/skycoin/skycoin -FROM golang:1.10 AS build - +ARG IMAGE_FROM=busybox +FROM golang:1.10.1-stretch AS build +ARG ARCH=amd64 +ARG GOARM ARG SKYCOIN_VERSION COPY . $GOPATH/src/github.com/skycoin/skycoin @@ -18,10 +20,18 @@ RUN sh -c \ fi' RUN cd $GOPATH/src/github.com/skycoin/skycoin && \ - CGO_ENABLED=0 GOOS=linux go install -a -installsuffix cgo ./... + COMMIT=$(git rev-parse HEAD) BRANCH=$(git rev-parse -—abbrev-ref HEAD) \ + GOARCH=$ARCH GOARM=$GOARM CGO_ENABLED=0 GOOS=linux \ + GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" \ + go install -ldflags "${GOLDFLAGS}" ./cmd/... && \ + sh -c "if test -d $GOPATH/bin/linux_arm ; then mv $GOPATH/bin/linux_arm/* $GOPATH/bin/; fi; \ + if test -d $GOPATH/bin/linux_arm64 ; then mv $GOPATH/bin/linux_arm64/* $GOPATH/bin/; fi" + +RUN apt-get update && \ + apt-get install -y ca-certificates # skycoin image -FROM alpine:3.7 +FROM $IMAGE_FROM ENV COIN="skycoin" ENV RPC_ADDR="http://0.0.0.0:6420" \ @@ -37,7 +47,10 @@ COPY --from=build /go/bin/* /usr/bin/ COPY --from=build /go/src/github.com/skycoin/skycoin/src/gui/static /usr/local/skycoin/src/gui/static # copy launcher -COPY docker_launcher.sh /usr/local/bin +COPY docker_launcher.sh /usr/local/bin/docker_launcher.sh + +#Copy certificates +COPY --from=build /etc/ssl/certs /etc/ssl/certs # volumes VOLUME $WALLET_DIR diff --git a/docker/images/mainnet/README.md b/docker/images/mainnet/README.md new file mode 100755 index 0000000..7a562a8 --- /dev/null +++ b/docker/images/mainnet/README.md @@ -0,0 +1,128 @@ +# Supported tags + +## Simple Tags + +- latest +- latest-arm32v5 +- latest-arm32v6 +- latest-arm32v7 +- latest-arm64v8 +- develop +- develop-arm32v5 +- develop-arm32v6 +- develop-arm32v7 +- develop-arm64v8 +- release-v0.23.0 +- release-v0.23.0-arm32v5 +- release-v0.23.0-arm32v6 +- release-v0.23.0-arm32v7 +- release-v0.23.0-arm64v8 +- release-v0.22.0 + +## Building your own images + +This Dockerfile build your working copy by default, but if you pass the +SKYCOIN_VERSION build argument to the `docker build` command, it will checkout +to the branch, a tag or a commit you specify on that variable. + +Example + +```sh +$ git clone https://github.com/skycoin/skycoin +$ cd skycoin +$ SKYCOIN_VERSION=v0.24.0 +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=$SKYCOIN_VERSION \ + -t skycoin:$SKYCOIN_VERSION . +``` + +or just + +```sh +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=SKYCOIN_VERSION=v0.24.0 \ + -t skycoin:v0.24.0 +``` + +## ARM Architecture + +Build arguments are provided to make it easy if you want to build for the ARM +architecture. + +Example for ARMv5. + +```sh +$ git clone https://github.com/skycoin/skycoin +$ cd skycoin +$ docker build -f docker/images/mainnet/Dockerfile \ + --build-arg=ARCH=arm \ + --build-arg=GOARM=5 \ + --build-arg=IMAGE_FROM="arm32v5/alpine" \ + -t skycoin:$SKYCOIN_VERSION-arm32v5 . +``` + +## How to use this images + +### Run a Skycoin node + +This command pulls latest stable image from Docker Hub, and launches a node inside a Docker container that runs as a service daemon in the background. It is possible to use the tags listed above to run another version of the node + +```sh +$ docker volume create skycoin-data +$ docker volume create skycoin-wallet +$ docker run -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6420:6420 \ + --name skycoin-node-stable skycoin/skycoin +``` + +When invoking the container this way the options of the skycoin command are set to their respective default values , except the following + +| Parameter | Value | +| ------------- | ------------- | +| web-interface-addr | 0.0.0.0 | +| gui-dir | /usr/local/skycoin/src/gui/static | + +In order to stop the container , just run + +```sh +$ docker stop skycoin-node-stable +``` + +Restart it once again by executing + +```sh +$ docker start skycoin-node-stable +``` + +### Customizing node server with parameters + +The container accepts parameters in order to customize the execution of the skycoin node. For instance, in order to run the bleeding edge development image and listen for REST API requests at a non-standard port (e.g. `6421`) it is possible to execute the following command. + +```sh + $ docker run --rm -d -v skycoin-data:/data/.skycoin \ + -v skycoin-wallet:/wallet \ + -p 6000:6000 -p 6421:6421 \ + --name skycoin-node-develop skycoin/skycoin:develop -web-interface-port 6421 +``` + +Notice that the value of node parameter (e.g. `-web-interface-port`) affects the execution context inside the container. Therefore, in this particular case, the port mapping should be updated accordingly. + +To get a full list of skycoin's parameters, just run + +```sh + $ docker run --rm skycoin/skycoin:develop -help +``` + +To run multiple nodes concurrently in the same host, it is highly recommended to create separate volumes for each node. For example, in order to run a master node along with the one launched above, it is necessary to execute + +```sh +$ docker volume create skycoin-master-data +$ docker volume create skycoin-master-wallet +$ docker run -d -v skycoin-master-data:/data/.skycoin \ + -v skycoin-master-wallet:/wallet \ + -p 6001:6000 -p 6421:6420 \ + --name skycoin-master-stable skycoin/skycoin -master +``` + +Notice that the host's port must be changed since collisions of two services listening at the same port are not allowed by the low-level operating system socket libraries. diff --git a/docker/images/mainnet/hooks/push b/docker/images/mainnet/hooks/push new file mode 100755 index 0000000..5fab945 --- /dev/null +++ b/docker/images/mainnet/hooks/push @@ -0,0 +1,6 @@ +#!/bin/bash +docker push $IMAGE_NAME +docker push $IMAGE_NAME-arm32v5 +docker push $IMAGE_NAME-arm32v6 +docker push $IMAGE_NAME-arm32v7 +docker push $IMAGE_NAME-arm64v8 diff --git a/docker/images/mainnet/repo-info/README.md b/docker/images/mainnet/repo-info/README.md new file mode 100755 index 0000000..4583f3d --- /dev/null +++ b/docker/images/mainnet/repo-info/README.md @@ -0,0 +1,16 @@ +# `skycoin` repo-info + +This directory contains additional information about the published artifacts of [the `skycoin` official image](https://hub.docker.com/_/skycoin/). + +- [the `remote` directory](remote/): + + - gathered from the Docker Hub/Registry API + + - image digests/blobs, transfer sizes, image metadata, etc. + +- [the `local` directory](local/): + + - inspected from the image on-disk after it is pulled + + - installed packages, creation date, architecture, environment variables, detected licenses, etc. + diff --git a/docker/images/mainnet/repo-info/local/develop-arm32v5.md b/docker/images/mainnet/repo-info/local/develop-arm32v5.md new file mode 100755 index 0000000..8f2592a --- /dev/null +++ b/docker/images/mainnet/repo-info/local/develop-arm32v5.md @@ -0,0 +1,18 @@ +# `skycoin/skycoin:develop-arm32v5 + +## Docker Metadata +- Image ID: `sha256:98f1008db3f91495a022076029a8dda22ff1d1dea545f72012fae417dba84493` +- Created: `2018-07-22T07:55:24.720466071Z` +- Virtual Size: ~ 64.98 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=http://0.0.0.0:6420` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `USE_CSRF=1` + - `WALLET_NAME=.wlt` +` diff --git a/docker/images/mainnet/repo-info/local/develop-arm32v6.md b/docker/images/mainnet/repo-info/local/develop-arm32v6.md new file mode 100755 index 0000000..36f0942 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/develop-arm32v6.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:develop-arm32v6 + +## Docker Metadata +- Image ID: `sha256:198326928c5588ecd9e541ea107a1c80932332e57f98ec0935286abc75a085c7` +- Created: `2018-07-22T07:56:47.222015339Z` +- Virtual Size: ~ 65.13 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=http://0.0.0.0:6420` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `USE_CSRF=1` + - `WALLET_NAME=.wlt` diff --git a/docker/images/mainnet/repo-info/local/develop-arm32v7.md b/docker/images/mainnet/repo-info/local/develop-arm32v7.md new file mode 100755 index 0000000..b07ab28 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/develop-arm32v7.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:develop-arm32v7 + +## Docker Metadata +- Image ID: `sha256:945299ae46f507a8e5172d00f5e0270ee1d26e526c3386cf65de9e5a869108d2` +- Created: `2018-07-22T07:58:10.527720754Z` +- Virtual Size: ~ 64.51 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=http://0.0.0.0:6420` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `USE_CSRF=1` + - `WALLET_NAME=.wlt` diff --git a/docker/images/mainnet/repo-info/local/develop-arm64v8.md b/docker/images/mainnet/repo-info/local/develop-arm64v8.md new file mode 100755 index 0000000..6de8261 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/develop-arm64v8.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:develop-arm64v8 + +## Docker Metadata +- Image ID: `sha256:128bf130785e83c97f70bc1a8557de5fded81501283e2d9293e0d55162e1356e` +- Created: `2018-07-22T07:59:33.29836188Z` +- Virtual Size: ~ 70.22 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=http://0.0.0.0:6420` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `USE_CSRF=1` + - `WALLET_NAME=.wlt` diff --git a/docker/images/mainnet/repo-info/local/develop.md b/docker/images/mainnet/repo-info/local/develop.md new file mode 100755 index 0000000..dd52777 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/develop.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:develop + +## Docker Metadata +- Image ID: `sha256:f169063bee4bb93175bb7a1974f048735039642c5ba58abfa3e0e1f4cb796569` +- Created: `2018-07-12T23:41:29.41000319Z` +- Virtual Size: ~ 71.08 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=http://0.0.0.0:6420` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `USE_CSRF=1` + - `WALLET_NAME=.wlt` diff --git a/docker/images/mainnet/repo-info/local/latest.md b/docker/images/mainnet/repo-info/local/latest.md new file mode 100755 index 0000000..d030f28 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/latest.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:latest + +## Docker Metadata +- Image ID: `sha256:dac6887647b0e5ac2f54c511adceca68b71447ca23dfdac0da45d90cb146d9bb` +- Created: `2018-04-26T02:12:22.177628806Z` +- Virtual Size: ~ 53.95 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--rpc-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=0.0.0.0:6430` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `WALLET_NAME=.wlt` + diff --git a/docker/images/mainnet/repo-info/local/release-v0.22.0.md b/docker/images/mainnet/repo-info/local/release-v0.22.0.md new file mode 100755 index 0000000..ff9de92 --- /dev/null +++ b/docker/images/mainnet/repo-info/local/release-v0.22.0.md @@ -0,0 +1,17 @@ +# `skycoin/skycoin:release-v0.22.0 + +## Docker Metadata +- Image ID: `sha256:8b407227171b3bf409b65357d46a965e57c2a47b879544a0babfe7986304833c` +- Created: `2018-03-23T10:57:03.174084913Z` +- Virtual Size: ~ 341.33 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Command: `["skycoin","--web-interface-addr=0.0.0.0"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=0.0.0.0:6430` + - `DATA_DIR=/data/.` + - `WALLET_DIR=/wallet` + - `WALLET_NAME=.wlt` + diff --git a/docker/images/mainnet/repo-info/local/release-v0.23.0.md b/docker/images/mainnet/repo-info/local/release-v0.23.0.md new file mode 100755 index 0000000..27a49ee --- /dev/null +++ b/docker/images/mainnet/repo-info/local/release-v0.23.0.md @@ -0,0 +1,16 @@ +# `skycoin/skycoin:release-v0.23.0 + +`## Docker Metadata +- Image ID: `sha256:ef210ca501514b74b7935607686e0f9faa91c32fd91b4c6bbecfa74382a152cd` +- Created: `2018-04-26T02:21:44.894022832Z` +- Virtual Size: ~ 53.95 Mb + (total size of all layers on-disk) +- Arch: `linux`/`amd64` +- Entrypoint: `["docker_launcher.sh","--web-interface-addr=0.0.0.0","--rpc-interface-addr=0.0.0.0","--gui-dir=/usr/local/skycoin/src/gui/static"]` +- Environment: + - `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin` + - `COIN=skycoin` + - `RPC_ADDR=0.0.0.0:6430` + - `DATA_DIR=/data/.skycoin` + - `WALLET_DIR=/wallet` + - `WALLET_NAME=.wlt` diff --git a/docker/images/mainnet/repo-info/remote/develop-arm32v5.md b/docker/images/mainnet/repo-info/remote/develop-arm32v5.md new file mode 100755 index 0000000..62ca657 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/develop-arm32v5.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop-arm32v5` + +```console +$ docker pull skycoin/skycoin@sha256:2e95c6d7a10cc4f69821c79d3dee8ac1c1fb329949796c2b04f81faddef8b4f0 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:b4f45fb2b1d01c55a010dc4585efa7c58022437c15734b329df6afdd7670005b + - sha256:b3a3ece1ae8b8bd197c940a7acde1956f3f9138008ca948a1fc25b92991f02dd + - sha256:52546602f55a7fcd444a5942e0429cdfd30e7f718ff422a7b2856c37302a206a + - sha256:03169c874cfd04b8604b67c33ee55e1b9b69d95e19bf83f4869ba59692fa4b89 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/develop-arm32v6.md b/docker/images/mainnet/repo-info/remote/develop-arm32v6.md new file mode 100755 index 0000000..2329aa8 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/develop-arm32v6.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop-arm32v6` + +```console +$ docker pull skycoin/skycoin@sha256:8b5312f0f7c5096bbaaf3c0c028cc2c64a698e01abe5ac601c32498e856302d5 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:3de7e3894033b9df2faed9182c17e7376f2081a1b0a62a55779e3fa0b3d6d49d + - sha256:07e79c5a00e3b11d0b59e40df64d3a22696d4e633a53116eba30154876c89ea6 + - sha256:d8231cb38bd19e8578fa4cc2045999bdc14b3fedd4727be1488d5f9a5181596b + - sha256:22e32bd4288e8a0f0c4cfc93b9ab8f87fe45986cd69c30887aa5094ca8aaa92c + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/develop-arm32v7.md b/docker/images/mainnet/repo-info/remote/develop-arm32v7.md new file mode 100755 index 0000000..a9539ef --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/develop-arm32v7.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop-arm32v7` + +```console +$ docker pull skycoin/skycoin@sha256:cdcc64b55ed18cab7c31e012eb0688abb28c6760583c5d9cb66fb4ec31fadb9f +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:f2a233543dfec794586554b869659f42b8a372dab31797707359adbe19060c65 + - sha256:85f59ff72a098fcc969638878dd2ccc9a27595138a583609b4d780e3c034b3b9 + - sha256:f0d10c632ed822c08c779cfa2d30712a67905b2b4dfb5262dd6180cfc294ba5d + - sha256:e0dfa07ef5b562ae759773aee83e5aff5cc3d8a9b2f86d80f5a3c3af144db14f + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/develop-arm64v8.md b/docker/images/mainnet/repo-info/remote/develop-arm64v8.md new file mode 100755 index 0000000..bae3497 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/develop-arm64v8.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop` + +```console +$ docker pull skycoin/skycoin@sha256:0207b712c3df38a66bda4d7b355ab7dfc45e960b7d46f44ef4f40f454860ff68 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:cd6101adb6f7d5c6f64f1bfb40ef0a63eea38274ac16c8c04bb949769962897b + - sha256:9d396ec3c9f752238b6ce3459984560c56c5ebf99975e82ee2b4b68726de463d + - sha256:30199736bff8fdef5d4caacbcba3c4478cd08b2d3c3328b2e15a1a192d851f31 + - sha256:d1d21de26fcccf58cafa0470142e38def9ed327c193a0d7212614e22dbeced15 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/develop.md b/docker/images/mainnet/repo-info/remote/develop.md new file mode 100755 index 0000000..f9dc9e3 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/develop.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop` + +```console +$ docker pull skycoin/skycoin@sha256:940af212ee94d4da8b7dce2dbb4f2aece146f529c25e33908fbecc2bcfe2f425 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:51c49aafd5a6f4bdf61a5a087ccb5e9cf616796d70dcc8ca62b7bf257473582e + - sha256:c1b532ec52a9dd695a4a8dde5a56916f00433e1e8ccc8723a37fa50b2b3467f8 + - sha256:9f75ac52562ed718648d77a6705bd0b271fcc075fbec05085028ed34f1694f13 + - sha256:3b486c5a9b0fa0bb15ec4f952479279d9bbbe294b9ca834e97ccf4cd169f06db + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/latest.md b/docker/images/mainnet/repo-info/remote/latest.md new file mode 100755 index 0000000..c6b7bf8 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/latest.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop-arm32v5` + +```console +$ docker pull skycoin/skycoin@sha256: +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28 + - sha256:301b4fdf119c9522dd066626b1675a37a5d6e95eedf382ded38d4aa7238f3bd0 + - sha256:b8eba0ce32557c1a4fc70597fba0ee7b0bd4359bb55df92cd34aba7f73b7831e + - sha256:fe2ed3aff324c5468feaa24cae82589e442817c78a74caefa2cb00df09614bd8 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/release-v0.22.0.md b/docker/images/mainnet/repo-info/remote/release-v0.22.0.md new file mode 100755 index 0000000..6562d87 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/release-v0.22.0.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop` + +```console +$ docker pull skycoin/skycoin@sha256:4b7e56145a7584d14273de62495e21622712fd07908ec2972fabaaf1fb0e7ca8 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28 + - sha256:4ea2ebce37a98ced054ce64a83b8e2c38d4c63995799c76e43008b627bec12bf + - sha256:bfe7dc706c0d6054d556e7a8635d22f58a67ee121c59b4edd9ea6ba611688893 + - sha256:516441122b6918902d3d3b085b312d430d16fca130415b6f26b2d361a43c4ba8 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docker/images/mainnet/repo-info/remote/release-v0.23.0.md b/docker/images/mainnet/repo-info/remote/release-v0.23.0.md new file mode 100755 index 0000000..c7f0232 --- /dev/null +++ b/docker/images/mainnet/repo-info/remote/release-v0.23.0.md @@ -0,0 +1,40 @@ +## `skycoin/skycoin:develop` + +```console +$ docker pull skycoin/skycoin@sha256:65443f0a0edf10553b1a7de873a97811b7876432fd85e99e8d862e1e8af578e8 +``` + +- Manifest MIME: `application/vnd.docker.distribution.manifest.list.v2+json` +- Platforms: + - linux; amd64 + +- Layers: + - sha256:ff3a5c916c92643ff77519ffa742d3ec61b7f591b6b7504599d95a4a41134e28 + - sha256:dd60045279a8607b6626b5f073fec245fdf9ac0f82ae485a87abcb30b9ae93b7 + - sha256:7b77e283ac6198f1a85306d4b461bdd48cd664f5021a198d26fb60f198387a36 + - sha256:6f62387a5d0369d7bb441bd4ce462bedb2e6d9e1fa69e510acd8e310b53743a8 + +- Expose Ports: + - 6000 + - 6420 + +```dockerfile +# 2018-07-22T07:53:54.681656183Z +EXPOSE 6000 6420 +# 2018-07-22T07:53:54.450638675Z +VOLUME [/data/.skycoin] +# 2018-07-22T07:53:54.450638675Z +VOLUME [/wallet] +# 2018-07-20T01:31:36.608478714Z +COPY file:6ac857b94e8b21cfa7f4c9a4d19387c91ec0b0eeb0faf318a16758e7c280e791 in /usr/local/bin/docker_launcher.sh +# 2018-07-20T01:31:35.779110731Z +COPY dir:0a4f98c7af3e020a45ac06413d1f1cb6409bd9ef2ba1546d2a4970fb73bc8c31 in /usr/local/skycoin/src/gui/static +# 2018-07-16T22:19:41.841251284Z +COPY multi:d033726808550b3bf4ec4dc28a2156e03a05e265d8e928b8762a8d0ad1f2583e in /usr/bin/ +# 2018-07-16T22:19:41.841251284Z +ENV RPC_ADDR=http://0.0.0.0:6420 DATA_DIR=/data/.skycoin WALLET_DIR=/wallet USE_CSRF=1 WALLET_NAME=.wlt +# 2018-07-16T22:19:41.841251284Z +ENV COIN=skycoin +# 2018-07-16T22:19:41.841251284Z +ADD file:2a4c44bdcb743a52ffa1c4b07ce471d8735a5d59cb45da2e6bfe0c2b5311ca90 in / +``` diff --git a/docs/assets/sky.libc.jpg b/docs/assets/sky.libc.jpg new file mode 100755 index 0000000..bcb8717 Binary files /dev/null and b/docs/assets/sky.libc.jpg differ diff --git a/docs/libc/API.md b/docs/libc/API.md new file mode 100755 index 0000000..72d97a2 --- /dev/null +++ b/docs/libc/API.md @@ -0,0 +1,599 @@ +# Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`define `[`GO_CGO_EXPORT_PROLOGUE_H`](#libskycoin_8h_1ac91211782906f9494d827fe6e0b2e190) | +`define `[`GO_CGO_PROLOGUE_H`](#libskycoin_8h_1ad45a58cf8a40d22e35017cb53dd6055a) | +`define `[`SKY_OK`](#skyerrors_8h_1a5cd9ddcf04c6f149c283c805c7d296da) | +`define `[`SKY_ERROR`](#skyerrors_8h_1a8405baf075a12e6232d75a8432d44f81) | +`define `[`LIBSKY_TESTING_H`](#skytest_8h_1aa31e87416545dcd6dcad132467018e22) | +`public GoUint32 `[`SKY_cli_CreateRawTxFromWallet`](#libskycoin_8h_1a20c77077115b9e629b9372dc45052978)`(Handle p0,`[`GoString`](#struct___go_string__)` p1,`[`GoString`](#struct___go_string__)` p2,`[`GoSlice`](#struct_go_slice)` p3,`[`Transaction`](#struct_transaction)` * p4)` | +`public GoUint32 `[`SKY_cli_CreateRawTxFromAddress`](#libskycoin_8h_1aa034c786a7dda49ba5caf939787dccd0)`(Handle p0,`[`GoString`](#struct___go_string__)` p1,`[`GoString`](#struct___go_string__)` p2,`[`GoString`](#struct___go_string__)` p3,`[`GoSlice`](#struct_go_slice)` p4,`[`Transaction`](#struct_transaction)` * p5)` | +`public void `[`SKY_cli_CreateRawTx`](#libskycoin_8h_1a8c5f5db1256b025fe16334a5bbbd1060)`(Handle p0,`[`Wallet`](#struct_wallet)` * p1,`[`GoSlice`](#struct_go_slice)` p2,`[`GoString`](#struct___go_string__)` p3,`[`GoSlice`](#struct_go_slice)` p4,`[`Transaction`](#struct_transaction)` * p5)` | +`public void `[`SKY_cli_NewTransaction`](#libskycoin_8h_1a86e20b22f34804b6ae95d334f0f2a51c)`(`[`GoSlice`](#struct_go_slice)` p0,`[`GoSlice`](#struct_go_slice)` p1,`[`GoSlice`](#struct_go_slice)` p2,`[`Transaction`](#struct_transaction)` * p3)` | +`public GoUint32 `[`SKY_cipher_DecodeBase58Address`](#libskycoin_8h_1ac624e50feca30ee4a1d215b55545bee8)`(`[`GoString`](#struct___go_string__)` p0,`[`Address`](#struct_address)` * p1)` | +`public void `[`SKY_cipher_AddressFromPubKey`](#libskycoin_8h_1a19502bcf26285130314d51c51034ed81)`(PubKey * p0,`[`Address`](#struct_address)` * p1)` | +`public void `[`SKY_cipher_AddressFromSecKey`](#libskycoin_8h_1a43dd635ce2999221eaf53443636a2cc9)`(SecKey * p0,`[`Address`](#struct_address)` * p1)` | +`public GoUint32 `[`SKY_cipher_BitcoinDecodeBase58Address`](#libskycoin_8h_1a3dbdee1e58738d24b1eee258971610ff)`(`[`GoString`](#struct___go_string__)` p0,`[`Address`](#struct_address)` * p1)` | +`public void `[`SKY_cipher_Address_Bytes`](#libskycoin_8h_1a2158e97d434d32452c4bc483fc42863e)`(`[`Address`](#struct_address)` * p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` | +`public void `[`SKY_cipher_Address_BitcoinBytes`](#libskycoin_8h_1ab6e15c43880cab6f2f7283f985c09b8c)`(`[`Address`](#struct_address)` * p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` | +`public GoUint32 `[`SKY_cipher_Address_Verify`](#libskycoin_8h_1a3c521e58dd6ba4d6c4996c1dd95f445b)`(`[`Address`](#struct_address)` * p0,PubKey * p1)` | +`public void `[`SKY_cipher_Address_String`](#libskycoin_8h_1a3fa26ea0e01795b94c8b163bf19677f6)`(`[`Address`](#struct_address)` * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_Address_BitcoinString`](#libskycoin_8h_1a8f650e9df71fc4fec8a9326bd9ad209a)`(`[`Address`](#struct_address)` * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_Address_Checksum`](#libskycoin_8h_1a5ccfd64d21d152219b9f6a92ec24099a)`(`[`Address`](#struct_address)` * p0,Checksum * p1)` | +`public void `[`SKY_cipher_Address_BitcoinChecksum`](#libskycoin_8h_1a54f6d9269d976d337431869a6025d1b6)`(`[`Address`](#struct_address)` * p0,Checksum * p1)` | +`public void `[`SKY_cipher_BitcoinAddressFromPubkey`](#libskycoin_8h_1a3bb30e8687b82b3d2b7a3ecb6ad99d51)`(PubKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_BitcoinWalletImportFormatFromSeckey`](#libskycoin_8h_1a5086015efeb4450facc6e44d01f3c0bf)`(SecKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public GoUint32 `[`SKY_cipher_BitcoinAddressFromBytes`](#libskycoin_8h_1afd7bbc548f9add0fb3846c5537c3e6bb)`(`[`GoSlice`](#struct_go_slice)` p0,`[`Address`](#struct_address)` * p1)` | +`public GoUint32 `[`SKY_cipher_SecKeyFromWalletImportFormat`](#libskycoin_8h_1aff9f7e90c09af0fbe68de0c2cb93445b)`(`[`GoString`](#struct___go_string__)` p0,SecKey * p1)` | +`public GoInt `[`SKY_cipher_PubKeySlice_Len`](#libskycoin_8h_1a4f8c95cf781be6721227ed34e3e31a82)`(`[`PubKeySlice`](#struct_go_slice__)` * p0)` | +`public GoUint8 `[`SKY_cipher_PubKeySlice_Less`](#libskycoin_8h_1aee5e7adb2fb6a981499b67ccd6950f07)`(`[`PubKeySlice`](#struct_go_slice__)` * p0,GoInt p1,GoInt p2)` | +`public void `[`SKY_cipher_PubKeySlice_Swap`](#libskycoin_8h_1adec780a8bb7a1e6b06e46725d438802f)`(`[`PubKeySlice`](#struct_go_slice__)` * p0,GoInt p1,GoInt p2)` | +`public void `[`SKY_cipher_RandByte`](#libskycoin_8h_1a443396fbe41b5ceca52ca9ce1178da87)`(GoInt p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` | +`public GoUint32 `[`SKY_cipher_NewPubKey`](#libskycoin_8h_1acce44b33fe66eb8e5a474ce5a52ce6ad)`(`[`GoSlice`](#struct_go_slice)` p0,PubKey * p1)` | +`public GoUint32 `[`SKY_cipher_PubKeyFromHex`](#libskycoin_8h_1a2941fcfb4b91f1a6831ed7a008f2f492)`(`[`GoString`](#struct___go_string__)` p0,PubKey * p1)` | +`public GoUint32 `[`SKY_cipher_PubKeyFromSecKey`](#libskycoin_8h_1afcd38ca547a7dae97d415bbec4d25199)`(SecKey * p0,PubKey * p1)` | +`public GoUint32 `[`SKY_cipher_PubKeyFromSig`](#libskycoin_8h_1a92d9b6d12c0f4eba7aa63336c83b920d)`(Sig * p0,SHA256 * p1,PubKey * p2)` | +`public GoUint32 `[`SKY_cipher_PubKey_Verify`](#libskycoin_8h_1aa758e062425798924e1eea3cddafb8ef)`(PubKey * p0)` | +`public void `[`SKY_cipher_PubKey_Hex`](#libskycoin_8h_1a80a69cd598ab67fc83afa6f8646f4358)`(PubKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_PubKey_ToAddressHash`](#libskycoin_8h_1ad9c96b9e1d8915c6546d4070f2e76cab)`(PubKey * p0,Ripemd160 * p1)` | +`public GoUint32 `[`SKY_cipher_NewSecKey`](#libskycoin_8h_1a009cc1bf2f436a1a790db7708f17198c)`(`[`GoSlice`](#struct_go_slice)` p0,SecKey * p1)` | +`public GoUint32 `[`SKY_cipher_SecKeyFromHex`](#libskycoin_8h_1a780e839e1ae75fbac8ec674d54927d77)`(`[`GoString`](#struct___go_string__)` p0,SecKey * p1)` | +`public GoUint32 `[`SKY_cipher_SecKey_Verify`](#libskycoin_8h_1aa17089f7a830bbd75d11095f561cf39d)`(SecKey * p0)` | +`public void `[`SKY_cipher_SecKey_Hex`](#libskycoin_8h_1a645f5f92b38653939297b625d0f8dc21)`(SecKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_ECDH`](#libskycoin_8h_1a23f26a93a05cc2fdb59e6feac5fe5140)`(PubKey * p0,SecKey * p1,`[`PubKeySlice`](#struct_go_slice__)` * p2)` | +`public GoUint32 `[`SKY_cipher_NewSig`](#libskycoin_8h_1ae72cdb33ffdd48382414c6125df5592c)`(`[`GoSlice`](#struct_go_slice)` p0,Sig * p1)` | +`public GoUint32 `[`SKY_cipher_SigFromHex`](#libskycoin_8h_1acd82a1de9be7d7291f79f7b32add9eec)`(`[`GoString`](#struct___go_string__)` p0,Sig * p1)` | +`public void `[`SKY_cipher_Sig_Hex`](#libskycoin_8h_1a0df60afe6e0a6b09a45959c81123cd84)`(Sig * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_SignHash`](#libskycoin_8h_1a88c349cd3a7f14df8decd6c9c646c7f3)`(SHA256 * p0,SecKey * p1,Sig * p2)` | +`public GoUint32 `[`SKY_cipher_ChkSig`](#libskycoin_8h_1af512d40dd13c355ee7222f4bd2085f41)`(`[`Address`](#struct_address)` * p0,SHA256 * p1,Sig * p2)` | +`public GoUint32 `[`SKY_cipher_VerifySignedHash`](#libskycoin_8h_1a8a9388cb9ff151f481f4681658381728)`(Sig * p0,SHA256 * p1)` | +`public GoUint32 `[`SKY_cipher_VerifySignature`](#libskycoin_8h_1a24949394563c4a49c502549a96809b32)`(PubKey * p0,Sig * p1,SHA256 * p2)` | +`public void `[`SKY_cipher_GenerateKeyPair`](#libskycoin_8h_1ab601accdb915f5794554f80801a856d1)`(PubKey * p0,SecKey * p1)` | +`public void `[`SKY_cipher_GenerateDeterministicKeyPair`](#libskycoin_8h_1a2e579464b2cf0cdb94701c52b84ad979)`(`[`GoSlice`](#struct_go_slice)` p0,PubKey * p1,SecKey * p2)` | +`public void `[`SKY_cipher_DeterministicKeyPairIterator`](#libskycoin_8h_1a43ef1cf5a3d82f8093ab1a8eee043fcb)`(`[`GoSlice`](#struct_go_slice)` p0,`[`PubKeySlice`](#struct_go_slice__)` * p1,PubKey * p2,SecKey * p3)` | +`public void `[`SKY_cipher_GenerateDeterministicKeyPairs`](#libskycoin_8h_1a60367b51223730d7d77297309b230be4)`(`[`GoSlice`](#struct_go_slice)` p0,GoInt p1,`[`PubKeySlice`](#struct_go_slice__)` * p2)` | +`public void `[`SKY_cipher_GenerateDeterministicKeyPairsSeed`](#libskycoin_8h_1a038ca71fb6cff77b49e41ad69f00a516)`(`[`GoSlice`](#struct_go_slice)` p0,GoInt p1,`[`PubKeySlice`](#struct_go_slice__)` * p2,`[`PubKeySlice`](#struct_go_slice__)` * p3)` | +`public GoUint32 `[`SKY_cipher_TestSecKey`](#libskycoin_8h_1ace44f781f8ec684f8e9c59fb7fa3dbb3)`(SecKey * p0)` | +`public GoUint32 `[`SKY_cipher_TestSecKeyHash`](#libskycoin_8h_1a6cb852f76a408372d3b0aa5221bcdaed)`(SecKey * p0,SHA256 * p1)` | +`public GoUint32 `[`SKY_cipher_Ripemd160_Set`](#libskycoin_8h_1a3ec912a20b9e36b1c12c94f8f5be119e)`(Ripemd160 * p0,`[`GoSlice`](#struct_go_slice)` p1)` | +`public void `[`SKY_cipher_HashRipemd160`](#libskycoin_8h_1a54bd9a7ead7b661260abf98d2490153f)`(`[`GoSlice`](#struct_go_slice)` p0,Ripemd160 * p1)` | +`public GoUint32 `[`SKY_cipher_SHA256_Set`](#libskycoin_8h_1aba4a6f9df12f6384da9eeb93d7723f73)`(SHA256 * p0,`[`GoSlice`](#struct_go_slice)` p1)` | +`public void `[`SKY_cipher_SHA256_Hex`](#libskycoin_8h_1a5c8d433169079581776fe5a5eec1adb4)`(SHA256 * p0,`[`GoString_`](#struct_go_string__)` * p1)` | +`public void `[`SKY_cipher_SHA256_Xor`](#libskycoin_8h_1adf30e083c2811ee14eeef58178ceefc6)`(SHA256 * p0,SHA256 * p1,SHA256 * p2)` | +`public GoUint32 `[`SKY_cipher_SumSHA256`](#libskycoin_8h_1a7f0f0fa3b1610c7e97dc2950b35a75c4)`(`[`GoSlice`](#struct_go_slice)` p0,SHA256 * p1)` | +`public GoUint32 `[`SKY_cipher_SHA256FromHex`](#libskycoin_8h_1a046027f0eb544d6a0b8f1b78a7d189b4)`(`[`GoString`](#struct___go_string__)` p0,SHA256 * p1)` | +`public void `[`SKY_cipher_DoubleSHA256`](#libskycoin_8h_1ad3390997c0c9aec4c2cd678b6356d3ea)`(`[`GoSlice`](#struct_go_slice)` p0,SHA256 * p1)` | +`public void `[`SKY_cipher_AddSHA256`](#libskycoin_8h_1aa5977d4828735c3bceb1153f8bffc21b)`(SHA256 * p0,SHA256 * p1,SHA256 * p2)` | +`public void `[`SKY_cipher_Merkle`](#libskycoin_8h_1a71f945bbf46e4496051c98e390d11460)`(`[`GoSlice`](#struct_go_slice)` * p0,SHA256 * p1)` | +`public int `[`cr_user_Address_eq`](#skycriterion_8h_1a5c3dd4cd20db987c789c0a49ba098185)`(`[`Address`](#struct_address)` * addr1,`[`Address`](#struct_address)` * addr2)` | +`public char * `[`cr_user_Address_tostr`](#skycriterion_8h_1a232c966bd05993a3e9accc2670af2872)`(`[`Address`](#struct_address)` * addr1)` | +`public int `[`cr_user_Address_noteq`](#skycriterion_8h_1a0fc9801f223de4c4dee580e47060ee12)`(`[`Address`](#struct_address)` * addr1,`[`Address`](#struct_address)` * addr2)` | +`public int `[`cr_user_GoString_eq`](#skycriterion_8h_1afde184bfa3d42dadb560478bb384fd0e)`(`[`GoString`](#struct___go_string__)` * string1,`[`GoString`](#struct___go_string__)` * string2)` | +`public int `[`cr_user_GoString__eq`](#skycriterion_8h_1adc4957c85581c8021d1bc5e1fe68954e)`(`[`GoString_`](#struct_go_string__)` * string1,`[`GoString_`](#struct_go_string__)` * string2)` | +`public char * `[`cr_user_GoString_tostr`](#skycriterion_8h_1ac49e1ea1279ec23eb1b06fc4cff4346e)`(`[`GoString`](#struct___go_string__)` * string)` | +`public char * `[`cr_user_GoString__tostr`](#skycriterion_8h_1a8ba00c85c7eede2d955cfe016cb1023d)`(`[`GoString_`](#struct_go_string__)` * string)` | +`public int `[`cr_user_SecKey_eq`](#skycriterion_8h_1a93763ef6964d4cae39c79a7f46a2f42f)`(SecKey * seckey1,SecKey * seckey2)` | +`public char * `[`cr_user_SecKey_tostr`](#skycriterion_8h_1a2285d6f43b6c3d8903444d0983308ad3)`(SecKey * seckey1)` | +`public int `[`cr_user_Ripemd160_noteq`](#skycriterion_8h_1ac402ce38ac35394b35bed0b866266f51)`(Ripemd160 * rp1,Ripemd160 * rp2)` | +`public int `[`cr_user_Ripemd160_eq`](#skycriterion_8h_1ab77cfde0399d3d261908732b6fd0074e)`(Ripemd160 * rp1,Ripemd160 * rp2)` | +`public char * `[`cr_user_Ripemd160_tostr`](#skycriterion_8h_1ab2fe9026270b2ff7589cb44e03bd94c5)`(Ripemd160 * rp1)` | +`public int `[`cr_user_GoSlice_eq`](#skycriterion_8h_1a68e13a153f444839e3dbe06cc14e2348)`(`[`GoSlice`](#struct_go_slice)` * slice1,`[`GoSlice`](#struct_go_slice)` * slice2)` | +`public char * `[`cr_user_GoSlice_tostr`](#skycriterion_8h_1aa058100c8835ae72f2c609ad2ef1ba85)`(`[`GoSlice`](#struct_go_slice)` * slice1)` | +`public int `[`cr_user_GoSlice_noteq`](#skycriterion_8h_1a361dbb4ff75151c68df6d37368880b24)`(`[`GoSlice`](#struct_go_slice)` * slice1,`[`GoSlice`](#struct_go_slice)` * slice2)` | +`public int `[`cr_user_SHA256_noteq`](#skycriterion_8h_1ae300f329a27269668d76e11aeeae30e7)`(SHA256 * sh1,SHA256 * sh2)` | +`public int `[`cr_user_SHA256_eq`](#skycriterion_8h_1a233276e4a1ceab57a648c997c970bf92)`(SHA256 * sh1,SHA256 * sh2)` | +`public char * `[`cr_user_SHA256_tostr`](#skycriterion_8h_1a396e12d7842311b730774d39913d6ab9)`(SHA256 * sh1)` | +`public void `[`randBytes`](#skystring_8h_1abc646fb4e2f83b9ec86bacd6f8006907)`(`[`GoSlice`](#struct_go_slice)` * bytes,size_t n)` | +`public void `[`strnhex`](#skystring_8h_1aef6e4f140a965b05589db78792dc3c09)`(unsigned char * buf,char * str,int n)` | +`public void `[`strhex`](#skystring_8h_1a589986670c6a1cd947da79512078ff05)`(unsigned char * buf,char * str)` | +`public void * `[`registerMemCleanup`](#skytest_8h_1a3138ecc83c1c8906c84ef5e0d54cdfbb)`(void * p)` | +`public void `[`fprintbuff`](#skytest_8h_1a1ee45e153c115a9a735b3ccbf992e495)`(FILE * f,void * buff,size_t n)` | +`public void `[`toGoString`](#skytest_8h_1a1bad90cc197623fa8328f71809dda1a3)`(`[`GoString_`](#struct_go_string__)` * s,`[`GoString`](#struct___go_string__)` * r)` | +`struct `[`_GoString_`](#struct___go_string__) | +`struct `[`Address`](#struct_address) | Addresses of SKY accounts +`struct `[`Entry`](#struct_entry) | [Wallet](#struct_wallet) entry. +`struct `[`GoInterface`](#struct_go_interface) | +`struct `[`GoInterface_`](#struct_go_interface__) | Instances of Go interface types. +`struct `[`GoSlice`](#struct_go_slice) | +`struct `[`GoSlice_`](#struct_go_slice__) | Instances of Go slices +`struct `[`GoString_`](#struct_go_string__) | Instances of Go `string` type. +`struct `[`SendAmount`](#struct_send_amount) | Structure used to specify amounts transferred in a transaction. +`struct `[`Transaction`](#struct_transaction) | Skycoin transaction. +`struct `[`TransactionOutput`](#struct_transaction_output) | Skycoin transaction output. +`struct `[`UxBalance`](#struct_ux_balance) | Intermediate representation of a UxOut for sorting and spend choosing. +`struct `[`Wallet`](#struct_wallet) | Internal representation of a Skycoin wallet. + +## Members + +#### `define `[`GO_CGO_EXPORT_PROLOGUE_H`](#libskycoin_8h_1ac91211782906f9494d827fe6e0b2e190) + +#### `define `[`GO_CGO_PROLOGUE_H`](#libskycoin_8h_1ad45a58cf8a40d22e35017cb53dd6055a) + +#### `define `[`SKY_OK`](#skyerrors_8h_1a5cd9ddcf04c6f149c283c805c7d296da) + +#### `define `[`SKY_ERROR`](#skyerrors_8h_1a8405baf075a12e6232d75a8432d44f81) + +#### `define `[`LIBSKY_TESTING_H`](#skytest_8h_1aa31e87416545dcd6dcad132467018e22) + +#### `public GoUint32 `[`SKY_cli_CreateRawTxFromWallet`](#libskycoin_8h_1a20c77077115b9e629b9372dc45052978)`(Handle p0,`[`GoString`](#struct___go_string__)` p1,`[`GoString`](#struct___go_string__)` p2,`[`GoSlice`](#struct_go_slice)` p3,`[`Transaction`](#struct_transaction)` * p4)` + +#### `public GoUint32 `[`SKY_cli_CreateRawTxFromAddress`](#libskycoin_8h_1aa034c786a7dda49ba5caf939787dccd0)`(Handle p0,`[`GoString`](#struct___go_string__)` p1,`[`GoString`](#struct___go_string__)` p2,`[`GoString`](#struct___go_string__)` p3,`[`GoSlice`](#struct_go_slice)` p4,`[`Transaction`](#struct_transaction)` * p5)` + +#### `public void `[`SKY_cli_CreateRawTx`](#libskycoin_8h_1a8c5f5db1256b025fe16334a5bbbd1060)`(Handle p0,`[`Wallet`](#struct_wallet)` * p1,`[`GoSlice`](#struct_go_slice)` p2,`[`GoString`](#struct___go_string__)` p3,`[`GoSlice`](#struct_go_slice)` p4,`[`Transaction`](#struct_transaction)` * p5)` + +#### `public void `[`SKY_cli_NewTransaction`](#libskycoin_8h_1a86e20b22f34804b6ae95d334f0f2a51c)`(`[`GoSlice`](#struct_go_slice)` p0,`[`GoSlice`](#struct_go_slice)` p1,`[`GoSlice`](#struct_go_slice)` p2,`[`Transaction`](#struct_transaction)` * p3)` + +#### `public GoUint32 `[`SKY_cipher_DecodeBase58Address`](#libskycoin_8h_1ac624e50feca30ee4a1d215b55545bee8)`(`[`GoString`](#struct___go_string__)` p0,`[`Address`](#struct_address)` * p1)` + +#### `public void `[`SKY_cipher_AddressFromPubKey`](#libskycoin_8h_1a19502bcf26285130314d51c51034ed81)`(PubKey * p0,`[`Address`](#struct_address)` * p1)` + +#### `public void `[`SKY_cipher_AddressFromSecKey`](#libskycoin_8h_1a43dd635ce2999221eaf53443636a2cc9)`(SecKey * p0,`[`Address`](#struct_address)` * p1)` + +#### `public GoUint32 `[`SKY_cipher_BitcoinDecodeBase58Address`](#libskycoin_8h_1a3dbdee1e58738d24b1eee258971610ff)`(`[`GoString`](#struct___go_string__)` p0,`[`Address`](#struct_address)` * p1)` + +#### `public void `[`SKY_cipher_Address_Bytes`](#libskycoin_8h_1a2158e97d434d32452c4bc483fc42863e)`(`[`Address`](#struct_address)` * p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` + +#### `public void `[`SKY_cipher_Address_BitcoinBytes`](#libskycoin_8h_1ab6e15c43880cab6f2f7283f985c09b8c)`(`[`Address`](#struct_address)` * p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` + +#### `public GoUint32 `[`SKY_cipher_Address_Verify`](#libskycoin_8h_1a3c521e58dd6ba4d6c4996c1dd95f445b)`(`[`Address`](#struct_address)` * p0,PubKey * p1)` + +#### `public void `[`SKY_cipher_Address_String`](#libskycoin_8h_1a3fa26ea0e01795b94c8b163bf19677f6)`(`[`Address`](#struct_address)` * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_Address_BitcoinString`](#libskycoin_8h_1a8f650e9df71fc4fec8a9326bd9ad209a)`(`[`Address`](#struct_address)` * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_Address_Checksum`](#libskycoin_8h_1a5ccfd64d21d152219b9f6a92ec24099a)`(`[`Address`](#struct_address)` * p0,Checksum * p1)` + +#### `public void `[`SKY_cipher_Address_BitcoinChecksum`](#libskycoin_8h_1a54f6d9269d976d337431869a6025d1b6)`(`[`Address`](#struct_address)` * p0,Checksum * p1)` + +#### `public void `[`SKY_cipher_BitcoinAddressFromPubkey`](#libskycoin_8h_1a3bb30e8687b82b3d2b7a3ecb6ad99d51)`(PubKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_BitcoinWalletImportFormatFromSeckey`](#libskycoin_8h_1a5086015efeb4450facc6e44d01f3c0bf)`(SecKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public GoUint32 `[`SKY_cipher_BitcoinAddressFromBytes`](#libskycoin_8h_1afd7bbc548f9add0fb3846c5537c3e6bb)`(`[`GoSlice`](#struct_go_slice)` p0,`[`Address`](#struct_address)` * p1)` + +#### `public GoUint32 `[`SKY_cipher_SecKeyFromWalletImportFormat`](#libskycoin_8h_1aff9f7e90c09af0fbe68de0c2cb93445b)`(`[`GoString`](#struct___go_string__)` p0,SecKey * p1)` + +#### `public GoInt `[`SKY_cipher_PubKeySlice_Len`](#libskycoin_8h_1a4f8c95cf781be6721227ed34e3e31a82)`(`[`PubKeySlice`](#struct_go_slice__)` * p0)` + +#### `public GoUint8 `[`SKY_cipher_PubKeySlice_Less`](#libskycoin_8h_1aee5e7adb2fb6a981499b67ccd6950f07)`(`[`PubKeySlice`](#struct_go_slice__)` * p0,GoInt p1,GoInt p2)` + +#### `public void `[`SKY_cipher_PubKeySlice_Swap`](#libskycoin_8h_1adec780a8bb7a1e6b06e46725d438802f)`(`[`PubKeySlice`](#struct_go_slice__)` * p0,GoInt p1,GoInt p2)` + +#### `public void `[`SKY_cipher_RandByte`](#libskycoin_8h_1a443396fbe41b5ceca52ca9ce1178da87)`(GoInt p0,`[`PubKeySlice`](#struct_go_slice__)` * p1)` + +#### `public GoUint32 `[`SKY_cipher_NewPubKey`](#libskycoin_8h_1acce44b33fe66eb8e5a474ce5a52ce6ad)`(`[`GoSlice`](#struct_go_slice)` p0,PubKey * p1)` + +#### `public GoUint32 `[`SKY_cipher_PubKeyFromHex`](#libskycoin_8h_1a2941fcfb4b91f1a6831ed7a008f2f492)`(`[`GoString`](#struct___go_string__)` p0,PubKey * p1)` + +#### `public GoUint32 `[`SKY_cipher_PubKeyFromSecKey`](#libskycoin_8h_1afcd38ca547a7dae97d415bbec4d25199)`(SecKey * p0,PubKey * p1)` + +#### `public GoUint32 `[`SKY_cipher_PubKeyFromSig`](#libskycoin_8h_1a92d9b6d12c0f4eba7aa63336c83b920d)`(Sig * p0,SHA256 * p1,PubKey * p2)` + +#### `public GoUint32 `[`SKY_cipher_PubKey_Verify`](#libskycoin_8h_1aa758e062425798924e1eea3cddafb8ef)`(PubKey * p0)` + +#### `public void `[`SKY_cipher_PubKey_Hex`](#libskycoin_8h_1a80a69cd598ab67fc83afa6f8646f4358)`(PubKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_PubKey_ToAddressHash`](#libskycoin_8h_1ad9c96b9e1d8915c6546d4070f2e76cab)`(PubKey * p0,Ripemd160 * p1)` + +#### `public GoUint32 `[`SKY_cipher_NewSecKey`](#libskycoin_8h_1a009cc1bf2f436a1a790db7708f17198c)`(`[`GoSlice`](#struct_go_slice)` p0,SecKey * p1)` + +#### `public GoUint32 `[`SKY_cipher_SecKeyFromHex`](#libskycoin_8h_1a780e839e1ae75fbac8ec674d54927d77)`(`[`GoString`](#struct___go_string__)` p0,SecKey * p1)` + +#### `public GoUint32 `[`SKY_cipher_SecKey_Verify`](#libskycoin_8h_1aa17089f7a830bbd75d11095f561cf39d)`(SecKey * p0)` + +#### `public void `[`SKY_cipher_SecKey_Hex`](#libskycoin_8h_1a645f5f92b38653939297b625d0f8dc21)`(SecKey * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_ECDH`](#libskycoin_8h_1a23f26a93a05cc2fdb59e6feac5fe5140)`(PubKey * p0,SecKey * p1,`[`PubKeySlice`](#struct_go_slice__)` * p2)` + +#### `public GoUint32 `[`SKY_cipher_NewSig`](#libskycoin_8h_1ae72cdb33ffdd48382414c6125df5592c)`(`[`GoSlice`](#struct_go_slice)` p0,Sig * p1)` + +#### `public GoUint32 `[`SKY_cipher_SigFromHex`](#libskycoin_8h_1acd82a1de9be7d7291f79f7b32add9eec)`(`[`GoString`](#struct___go_string__)` p0,Sig * p1)` + +#### `public void `[`SKY_cipher_Sig_Hex`](#libskycoin_8h_1a0df60afe6e0a6b09a45959c81123cd84)`(Sig * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_SignHash`](#libskycoin_8h_1a88c349cd3a7f14df8decd6c9c646c7f3)`(SHA256 * p0,SecKey * p1,Sig * p2)` + +#### `public GoUint32 `[`SKY_cipher_ChkSig`](#libskycoin_8h_1af512d40dd13c355ee7222f4bd2085f41)`(`[`Address`](#struct_address)` * p0,SHA256 * p1,Sig * p2)` + +#### `public GoUint32 `[`SKY_cipher_VerifySignedHash`](#libskycoin_8h_1a8a9388cb9ff151f481f4681658381728)`(Sig * p0,SHA256 * p1)` + +#### `public GoUint32 `[`SKY_cipher_VerifySignature`](#libskycoin_8h_1a24949394563c4a49c502549a96809b32)`(PubKey * p0,Sig * p1,SHA256 * p2)` + +#### `public void `[`SKY_cipher_GenerateKeyPair`](#libskycoin_8h_1ab601accdb915f5794554f80801a856d1)`(PubKey * p0,SecKey * p1)` + +#### `public void `[`SKY_cipher_GenerateDeterministicKeyPair`](#libskycoin_8h_1a2e579464b2cf0cdb94701c52b84ad979)`(`[`GoSlice`](#struct_go_slice)` p0,PubKey * p1,SecKey * p2)` + +#### `public void `[`SKY_cipher_DeterministicKeyPairIterator`](#libskycoin_8h_1a43ef1cf5a3d82f8093ab1a8eee043fcb)`(`[`GoSlice`](#struct_go_slice)` p0,`[`PubKeySlice`](#struct_go_slice__)` * p1,PubKey * p2,SecKey * p3)` + +#### `public void `[`SKY_cipher_GenerateDeterministicKeyPairs`](#libskycoin_8h_1a60367b51223730d7d77297309b230be4)`(`[`GoSlice`](#struct_go_slice)` p0,GoInt p1,`[`PubKeySlice`](#struct_go_slice__)` * p2)` + +#### `public void `[`SKY_cipher_GenerateDeterministicKeyPairsSeed`](#libskycoin_8h_1a038ca71fb6cff77b49e41ad69f00a516)`(`[`GoSlice`](#struct_go_slice)` p0,GoInt p1,`[`PubKeySlice`](#struct_go_slice__)` * p2,`[`PubKeySlice`](#struct_go_slice__)` * p3)` + +#### `public GoUint32 `[`SKY_cipher_TestSecKey`](#libskycoin_8h_1ace44f781f8ec684f8e9c59fb7fa3dbb3)`(SecKey * p0)` + +#### `public GoUint32 `[`SKY_cipher_TestSecKeyHash`](#libskycoin_8h_1a6cb852f76a408372d3b0aa5221bcdaed)`(SecKey * p0,SHA256 * p1)` + +#### `public GoUint32 `[`SKY_cipher_Ripemd160_Set`](#libskycoin_8h_1a3ec912a20b9e36b1c12c94f8f5be119e)`(Ripemd160 * p0,`[`GoSlice`](#struct_go_slice)` p1)` + +#### `public void `[`SKY_cipher_HashRipemd160`](#libskycoin_8h_1a54bd9a7ead7b661260abf98d2490153f)`(`[`GoSlice`](#struct_go_slice)` p0,Ripemd160 * p1)` + +#### `public GoUint32 `[`SKY_cipher_SHA256_Set`](#libskycoin_8h_1aba4a6f9df12f6384da9eeb93d7723f73)`(SHA256 * p0,`[`GoSlice`](#struct_go_slice)` p1)` + +#### `public void `[`SKY_cipher_SHA256_Hex`](#libskycoin_8h_1a5c8d433169079581776fe5a5eec1adb4)`(SHA256 * p0,`[`GoString_`](#struct_go_string__)` * p1)` + +#### `public void `[`SKY_cipher_SHA256_Xor`](#libskycoin_8h_1adf30e083c2811ee14eeef58178ceefc6)`(SHA256 * p0,SHA256 * p1,SHA256 * p2)` + +#### `public GoUint32 `[`SKY_cipher_SumSHA256`](#libskycoin_8h_1a7f0f0fa3b1610c7e97dc2950b35a75c4)`(`[`GoSlice`](#struct_go_slice)` p0,SHA256 * p1)` + +#### `public GoUint32 `[`SKY_cipher_SHA256FromHex`](#libskycoin_8h_1a046027f0eb544d6a0b8f1b78a7d189b4)`(`[`GoString`](#struct___go_string__)` p0,SHA256 * p1)` + +#### `public void `[`SKY_cipher_DoubleSHA256`](#libskycoin_8h_1ad3390997c0c9aec4c2cd678b6356d3ea)`(`[`GoSlice`](#struct_go_slice)` p0,SHA256 * p1)` + +#### `public void `[`SKY_cipher_AddSHA256`](#libskycoin_8h_1aa5977d4828735c3bceb1153f8bffc21b)`(SHA256 * p0,SHA256 * p1,SHA256 * p2)` + +#### `public void `[`SKY_cipher_Merkle`](#libskycoin_8h_1a71f945bbf46e4496051c98e390d11460)`(`[`GoSlice`](#struct_go_slice)` * p0,SHA256 * p1)` + +#### `public int `[`cr_user_Address_eq`](#skycriterion_8h_1a5c3dd4cd20db987c789c0a49ba098185)`(`[`Address`](#struct_address)` * addr1,`[`Address`](#struct_address)` * addr2)` + +#### `public char * `[`cr_user_Address_tostr`](#skycriterion_8h_1a232c966bd05993a3e9accc2670af2872)`(`[`Address`](#struct_address)` * addr1)` + +#### `public int `[`cr_user_Address_noteq`](#skycriterion_8h_1a0fc9801f223de4c4dee580e47060ee12)`(`[`Address`](#struct_address)` * addr1,`[`Address`](#struct_address)` * addr2)` + +#### `public int `[`cr_user_GoString_eq`](#skycriterion_8h_1afde184bfa3d42dadb560478bb384fd0e)`(`[`GoString`](#struct___go_string__)` * string1,`[`GoString`](#struct___go_string__)` * string2)` + +#### `public int `[`cr_user_GoString__eq`](#skycriterion_8h_1adc4957c85581c8021d1bc5e1fe68954e)`(`[`GoString_`](#struct_go_string__)` * string1,`[`GoString_`](#struct_go_string__)` * string2)` + +#### `public char * `[`cr_user_GoString_tostr`](#skycriterion_8h_1ac49e1ea1279ec23eb1b06fc4cff4346e)`(`[`GoString`](#struct___go_string__)` * string)` + +#### `public char * `[`cr_user_GoString__tostr`](#skycriterion_8h_1a8ba00c85c7eede2d955cfe016cb1023d)`(`[`GoString_`](#struct_go_string__)` * string)` + +#### `public int `[`cr_user_SecKey_eq`](#skycriterion_8h_1a93763ef6964d4cae39c79a7f46a2f42f)`(SecKey * seckey1,SecKey * seckey2)` + +#### `public char * `[`cr_user_SecKey_tostr`](#skycriterion_8h_1a2285d6f43b6c3d8903444d0983308ad3)`(SecKey * seckey1)` + +#### `public int `[`cr_user_Ripemd160_noteq`](#skycriterion_8h_1ac402ce38ac35394b35bed0b866266f51)`(Ripemd160 * rp1,Ripemd160 * rp2)` + +#### `public int `[`cr_user_Ripemd160_eq`](#skycriterion_8h_1ab77cfde0399d3d261908732b6fd0074e)`(Ripemd160 * rp1,Ripemd160 * rp2)` + +#### `public char * `[`cr_user_Ripemd160_tostr`](#skycriterion_8h_1ab2fe9026270b2ff7589cb44e03bd94c5)`(Ripemd160 * rp1)` + +#### `public int `[`cr_user_GoSlice_eq`](#skycriterion_8h_1a68e13a153f444839e3dbe06cc14e2348)`(`[`GoSlice`](#struct_go_slice)` * slice1,`[`GoSlice`](#struct_go_slice)` * slice2)` + +#### `public char * `[`cr_user_GoSlice_tostr`](#skycriterion_8h_1aa058100c8835ae72f2c609ad2ef1ba85)`(`[`GoSlice`](#struct_go_slice)` * slice1)` + +#### `public int `[`cr_user_GoSlice_noteq`](#skycriterion_8h_1a361dbb4ff75151c68df6d37368880b24)`(`[`GoSlice`](#struct_go_slice)` * slice1,`[`GoSlice`](#struct_go_slice)` * slice2)` + +#### `public int `[`cr_user_SHA256_noteq`](#skycriterion_8h_1ae300f329a27269668d76e11aeeae30e7)`(SHA256 * sh1,SHA256 * sh2)` + +#### `public int `[`cr_user_SHA256_eq`](#skycriterion_8h_1a233276e4a1ceab57a648c997c970bf92)`(SHA256 * sh1,SHA256 * sh2)` + +#### `public char * `[`cr_user_SHA256_tostr`](#skycriterion_8h_1a396e12d7842311b730774d39913d6ab9)`(SHA256 * sh1)` + +#### `public void `[`randBytes`](#skystring_8h_1abc646fb4e2f83b9ec86bacd6f8006907)`(`[`GoSlice`](#struct_go_slice)` * bytes,size_t n)` + +#### `public void `[`strnhex`](#skystring_8h_1aef6e4f140a965b05589db78792dc3c09)`(unsigned char * buf,char * str,int n)` + +#### `public void `[`strhex`](#skystring_8h_1a589986670c6a1cd947da79512078ff05)`(unsigned char * buf,char * str)` + +#### `public void * `[`registerMemCleanup`](#skytest_8h_1a3138ecc83c1c8906c84ef5e0d54cdfbb)`(void * p)` + +#### `public void `[`fprintbuff`](#skytest_8h_1a1ee45e153c115a9a735b3ccbf992e495)`(FILE * f,void * buff,size_t n)` + +#### `public void `[`toGoString`](#skytest_8h_1a1bad90cc197623fa8328f71809dda1a3)`(`[`GoString_`](#struct_go_string__)` * s,`[`GoString`](#struct___go_string__)` * r)` + +# struct `_GoString_` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public const char * `[`p`](#struct___go_string___1a6bc6b007533335efe02bafff799ec64c) | +`public ptrdiff_t `[`n`](#struct___go_string___1a52d899ae12c13f4df8ff5ee014f3a106) | + +## Members + +#### `public const char * `[`p`](#struct___go_string___1a6bc6b007533335efe02bafff799ec64c) + +#### `public ptrdiff_t `[`n`](#struct___go_string___1a52d899ae12c13f4df8ff5ee014f3a106) + +# struct `Address` + +Addresses of SKY accounts + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public unsigned char `[`Version`](#struct_address_1a49fed92a3e4a3cc30678924a13acc19f) | [Address](#struct_address) version identifier. Used to differentiate testnet vs mainnet addresses, for instance. +`public Ripemd160 `[`Key`](#struct_address_1aa7fd9da55c53a8f7a6abe4987a8ea093) | [Address](#struct_address) hash identifier. + +## Members + +#### `public unsigned char `[`Version`](#struct_address_1a49fed92a3e4a3cc30678924a13acc19f) + +[Address](#struct_address) version identifier. Used to differentiate testnet vs mainnet addresses, for instance. + +#### `public Ripemd160 `[`Key`](#struct_address_1aa7fd9da55c53a8f7a6abe4987a8ea093) + +[Address](#struct_address) hash identifier. + +# struct `Entry` + +[Wallet](#struct_wallet) entry. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`Address`](#struct_address)` `[`Address`](#struct_entry_1a0f1895b2f69382d62e5bdc459d30cae1) | [Wallet](#struct_wallet) address. +`public PubKey `[`Public`](#struct_entry_1ac4e11c22d8462b7633be585127f1a8d0) | Public key used to generate address. +`public SecKey `[`Secret`](#struct_entry_1a18296486015d3885702241c1d821d563) | Secret key used to generate address. + +## Members + +#### `public `[`Address`](#struct_address)` `[`Address`](#struct_entry_1a0f1895b2f69382d62e5bdc459d30cae1) + +[Wallet](#struct_wallet) address. + +#### `public PubKey `[`Public`](#struct_entry_1ac4e11c22d8462b7633be585127f1a8d0) + +Public key used to generate address. + +#### `public SecKey `[`Secret`](#struct_entry_1a18296486015d3885702241c1d821d563) + +Secret key used to generate address. + +# struct `GoInterface` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public void * `[`t`](#struct_go_interface_1a6445205ee90f5ff5131595cf7ddfcec0) | +`public void * `[`v`](#struct_go_interface_1a67806b49e20fb1170422969965db6ecb) | + +## Members + +#### `public void * `[`t`](#struct_go_interface_1a6445205ee90f5ff5131595cf7ddfcec0) + +#### `public void * `[`v`](#struct_go_interface_1a67806b49e20fb1170422969965db6ecb) + +# struct `GoInterface_` + +Instances of Go interface types. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public void * `[`t`](#struct_go_interface___1a6445205ee90f5ff5131595cf7ddfcec0) | Pointer to the information of the concrete Go type bound to this interface reference. +`public void * `[`v`](#struct_go_interface___1a67806b49e20fb1170422969965db6ecb) | Pointer to the data corresponding to the value bound to this interface type. + +## Members + +#### `public void * `[`t`](#struct_go_interface___1a6445205ee90f5ff5131595cf7ddfcec0) + +Pointer to the information of the concrete Go type bound to this interface reference. + +#### `public void * `[`v`](#struct_go_interface___1a67806b49e20fb1170422969965db6ecb) + +Pointer to the data corresponding to the value bound to this interface type. + +# struct `GoSlice` + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public void * `[`data`](#struct_go_slice_1a735984d41155bc1032e09bece8f8d66d) | +`public GoInt `[`len`](#struct_go_slice_1abefd7e3d615fc657a761fd36bcd7296c) | +`public GoInt `[`cap`](#struct_go_slice_1a726ab221ad9e219391b7f4c9a5c5ba33) | + +## Members + +#### `public void * `[`data`](#struct_go_slice_1a735984d41155bc1032e09bece8f8d66d) + +#### `public GoInt `[`len`](#struct_go_slice_1abefd7e3d615fc657a761fd36bcd7296c) + +#### `public GoInt `[`cap`](#struct_go_slice_1a726ab221ad9e219391b7f4c9a5c5ba33) + +# struct `GoSlice_` + +Instances of Go slices + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public void * `[`data`](#struct_go_slice___1a735984d41155bc1032e09bece8f8d66d) | Pointer to buffer containing slice data. +`public GoInt_ `[`len`](#struct_go_slice___1af7b822f9987d08af70f228eb6dd4b7c7) | Number of items stored in slice buffer. +`public GoInt_ `[`cap`](#struct_go_slice___1abb0492bac72ee60cd3cafd152291df94) | Maximum number of items that fits in this slice considering allocated memory and item type's size. + +## Members + +#### `public void * `[`data`](#struct_go_slice___1a735984d41155bc1032e09bece8f8d66d) + +Pointer to buffer containing slice data. + +#### `public GoInt_ `[`len`](#struct_go_slice___1af7b822f9987d08af70f228eb6dd4b7c7) + +Number of items stored in slice buffer. + +#### `public GoInt_ `[`cap`](#struct_go_slice___1abb0492bac72ee60cd3cafd152291df94) + +Maximum number of items that fits in this slice considering allocated memory and item type's size. + +# struct `GoString_` + +Instances of Go `string` type. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public const char * `[`p`](#struct_go_string___1a6bc6b007533335efe02bafff799ec64c) | Pointer to string characters buffer. +`public GoInt_ `[`n`](#struct_go_string___1aa78f60eaaf1d3eb1661886a694b82b23) | String size not counting trailing `\0` char if at all included. + +## Members + +#### `public const char * `[`p`](#struct_go_string___1a6bc6b007533335efe02bafff799ec64c) + +Pointer to string characters buffer. + +#### `public GoInt_ `[`n`](#struct_go_string___1aa78f60eaaf1d3eb1661886a694b82b23) + +String size not counting trailing `\0` char if at all included. + +# struct `SendAmount` + +Structure used to specify amounts transferred in a transaction. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`GoString_`](#struct_go_string__)` `[`Addr`](#struct_send_amount_1af646aec99cf83d30d17fd62e014d19f8) | Sender / receipient address. +`public GoInt64_ `[`Coins`](#struct_send_amount_1a7733f16af3115d3cfc712f2f687b73e4) | Amount transferred (e.g. measured in SKY) + +## Members + +#### `public `[`GoString_`](#struct_go_string__)` `[`Addr`](#struct_send_amount_1af646aec99cf83d30d17fd62e014d19f8) + +Sender / receipient address. + +#### `public GoInt64_ `[`Coins`](#struct_send_amount_1a7733f16af3115d3cfc712f2f687b73e4) + +Amount transferred (e.g. measured in SKY) + +# struct `Transaction` + +Skycoin transaction. + +Instances of this struct are included in blocks. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public GoInt32_ `[`Length`](#struct_transaction_1a8a3c288e7b3f7245e0b7916ce322e5f9) | Current transaction's length expressed in bytes. +`public GoInt8_ `[`Type`](#struct_transaction_1a5bf4f40bde41c84f4ab5ff82bc74f744) | [Transaction](#struct_transaction)'s version. When a node tries to process a transaction, it must verify whether it supports the transaction's type. This is intended to provide a way to update skycoin clients and servers without crashing the network. If the transaction is not compatible with the node, it should not process it. +`public SHA256 `[`InnerHash`](#struct_transaction_1a62befdbe16b0b7f106cc8ac01d88b51f) | It's a SHA256 hash of the inputs and outputs of the transaction. It is used to protect against transaction mutability. This means that the transaction cannot be altered after its creation. +`public `[`GoSlice_`](#struct_go_slice__)` `[`Sigs`](#struct_transaction_1af0a2ba807a16f9ae66dd5682c243b943) | A list of digital signiatures generated by the skycoin client using the private key. It is used by Skycoin servers to verify the authenticy of the transaction. Each input requires a different signature. +`public `[`GoSlice_`](#struct_go_slice__)` `[`In`](#struct_transaction_1a317b73fcfa2b93fd16dfeab7ba228c39) | A list of references to unspent transaction outputs. Unlike other cryptocurrencies, such as Bitcoin, Skycoin unspent transaction outputs (UX) and Skycoin transactions (TX) are separated in the blockchain protocol, allowing for lighter transactions, thus reducing the broadcasting costs across the network. +`public `[`GoSlice_`](#struct_go_slice__)` `[`Out`](#struct_transaction_1a181edcb164c89b192b3838de7792cc89) | Outputs: A list of outputs created by the client, that will be recorded in the blockchain if transactions are confirmed. An output consists of a data structure representing an UTXT, which is composed by a Skycoin address to be sent to, the amount in Skycoin to be sent, and the amount of Coin Hours to be sent, and the SHA256 hash of the previous fields. + +## Members + +#### `public GoInt32_ `[`Length`](#struct_transaction_1a8a3c288e7b3f7245e0b7916ce322e5f9) + +Current transaction's length expressed in bytes. + +#### `public GoInt8_ `[`Type`](#struct_transaction_1a5bf4f40bde41c84f4ab5ff82bc74f744) + +[Transaction](#struct_transaction)'s version. When a node tries to process a transaction, it must verify whether it supports the transaction's type. This is intended to provide a way to update skycoin clients and servers without crashing the network. If the transaction is not compatible with the node, it should not process it. + +#### `public SHA256 `[`InnerHash`](#struct_transaction_1a62befdbe16b0b7f106cc8ac01d88b51f) + +It's a SHA256 hash of the inputs and outputs of the transaction. It is used to protect against transaction mutability. This means that the transaction cannot be altered after its creation. + +#### `public `[`GoSlice_`](#struct_go_slice__)` `[`Sigs`](#struct_transaction_1af0a2ba807a16f9ae66dd5682c243b943) + +A list of digital signiatures generated by the skycoin client using the private key. It is used by Skycoin servers to verify the authenticy of the transaction. Each input requires a different signature. + +#### `public `[`GoSlice_`](#struct_go_slice__)` `[`In`](#struct_transaction_1a317b73fcfa2b93fd16dfeab7ba228c39) + +A list of references to unspent transaction outputs. Unlike other cryptocurrencies, such as Bitcoin, Skycoin unspent transaction outputs (UX) and Skycoin transactions (TX) are separated in the blockchain protocol, allowing for lighter transactions, thus reducing the broadcasting costs across the network. + +#### `public `[`GoSlice_`](#struct_go_slice__)` `[`Out`](#struct_transaction_1a181edcb164c89b192b3838de7792cc89) + +Outputs: A list of outputs created by the client, that will be recorded in the blockchain if transactions are confirmed. An output consists of a data structure representing an UTXT, which is composed by a Skycoin address to be sent to, the amount in Skycoin to be sent, and the amount of Coin Hours to be sent, and the SHA256 hash of the previous fields. + +# struct `TransactionOutput` + +Skycoin transaction output. + +Instances are integral part of transactions included in blocks. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public `[`Address`](#struct_address)` `[`Address`](#struct_transaction_output_1a0f1895b2f69382d62e5bdc459d30cae1) | Receipient address. +`public GoInt64_ `[`Coins`](#struct_transaction_output_1a7733f16af3115d3cfc712f2f687b73e4) | Amount sent to the receipient address. +`public GoInt64_ `[`Hours`](#struct_transaction_output_1a7aef551ad5991173b5a6160fd8fe1594) | Amount of Coin Hours sent to the receipient address. + +## Members + +#### `public `[`Address`](#struct_address)` `[`Address`](#struct_transaction_output_1a0f1895b2f69382d62e5bdc459d30cae1) + +Receipient address. + +#### `public GoInt64_ `[`Coins`](#struct_transaction_output_1a7733f16af3115d3cfc712f2f687b73e4) + +Amount sent to the receipient address. + +#### `public GoInt64_ `[`Hours`](#struct_transaction_output_1a7aef551ad5991173b5a6160fd8fe1594) + +Amount of Coin Hours sent to the receipient address. + +# struct `UxBalance` + +Intermediate representation of a UxOut for sorting and spend choosing. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public SHA256 `[`Hash`](#struct_ux_balance_1a26607631022473d778367a1327b77a4c) | Hash of underlying UxOut. +`public GoInt64_ `[`BkSeq`](#struct_ux_balance_1a1c1b05acfa8b1a65809ba4525f14a55b) | moment balance calculation is performed at. +`public `[`Address`](#struct_address)` `[`Address`](#struct_ux_balance_1a0f1895b2f69382d62e5bdc459d30cae1) | Account holder address. +`public GoInt64_ `[`Coins`](#struct_ux_balance_1a7733f16af3115d3cfc712f2f687b73e4) | Coins amount (e.g. in SKY). +`public GoInt64_ `[`Hours`](#struct_ux_balance_1a7aef551ad5991173b5a6160fd8fe1594) | Balance of Coin Hours generated by underlying UxOut, depending on UxOut's head time. + +## Members + +#### `public SHA256 `[`Hash`](#struct_ux_balance_1a26607631022473d778367a1327b77a4c) + +Hash of underlying UxOut. + +#### `public GoInt64_ `[`BkSeq`](#struct_ux_balance_1a1c1b05acfa8b1a65809ba4525f14a55b) + +moment balance calculation is performed at. + +Block height corresponding to the + +#### `public `[`Address`](#struct_address)` `[`Address`](#struct_ux_balance_1a0f1895b2f69382d62e5bdc459d30cae1) + +Account holder address. + +#### `public GoInt64_ `[`Coins`](#struct_ux_balance_1a7733f16af3115d3cfc712f2f687b73e4) + +Coins amount (e.g. in SKY). + +#### `public GoInt64_ `[`Hours`](#struct_ux_balance_1a7aef551ad5991173b5a6160fd8fe1594) + +Balance of Coin Hours generated by underlying UxOut, depending on UxOut's head time. + +# struct `Wallet` + +Internal representation of a Skycoin wallet. + +## Summary + + Members | Descriptions +--------------------------------|--------------------------------------------- +`public GoMap_ `[`Meta`](#struct_wallet_1acdf30a4af55c2c677ebf6fc57b27e740) | Records items that are not deterministic, like filename, lable, wallet type, secrets, etc. +`public `[`GoSlice_`](#struct_go_slice__)` `[`Entries`](#struct_wallet_1a57b718d97f8db7e0bc9d9c755510951b) | Entries field stores the address entries that are deterministically generated from seed. + +## Members + +#### `public GoMap_ `[`Meta`](#struct_wallet_1acdf30a4af55c2c677ebf6fc57b27e740) + +Records items that are not deterministic, like filename, lable, wallet type, secrets, etc. + +#### `public `[`GoSlice_`](#struct_go_slice__)` `[`Entries`](#struct_wallet_1a57b718d97f8db7e0bc9d9c755510951b) + +Entries field stores the address entries that are deterministically generated from seed. + +Generated by [Moxygen](https://sourcey.com/moxygen) \ No newline at end of file diff --git a/electron/README.md b/electron/README.md index 9e05600..8fb54b8 100755 --- a/electron/README.md +++ b/electron/README.md @@ -122,23 +122,6 @@ To build app in 32 bit from a machine with 64 bit: sudo apt-get install --no-install-recommends -y gcc-multilib g++-multilib ``` -## Setup - -Once requirements are installed, node dependencies must be downloaded. - -Install yarn: - -```sh -npm install -g yarn -``` - -Install dependencies with yarn: - -```sh -yarn install -``` - -A folder `node_modules/` should now exist. ## Building diff --git a/electron/build-conf.sh b/electron/build-conf.sh index 256ecbc..9faad32 100755 --- a/electron/build-conf.sh +++ b/electron/build-conf.sh @@ -19,20 +19,11 @@ ELN_OUTPUT="${ELN_OUTPUT_BASE}/${ELN_VERSION}" if [ -n "$1" ]; then - GOX_OSARCH="$1" + GOX_OSARCH="$@" else GOX_OSARCH="linux/amd64 linux/arm windows/amd64 windows/386 darwin/amd64" fi -# GOX_OSARCH="linux/amd64 darwin/amd64" -# GOX_OSARCH="linux/amd64 linux/arm windows/amd64 windows/386 darwin/amd64" -# GOX_OSARCH="linux/amd64" -# GOX_OSARCH="darwin/amd64" -# GOX_OSARCH="windows/amd64" -# GOX_OSARCH="windows/386" -# GOX_OSARCH="linux/arm" - - GOX_OUTPUT=".gox_output" STL_OUTPUT=".standalone_output" diff --git a/electron/build-electron-release.sh b/electron/build-electron-release.sh index bb66381..de8daf6 100755 --- a/electron/build-electron-release.sh +++ b/electron/build-electron-release.sh @@ -12,9 +12,7 @@ set -e -o pipefail # By default builds all architectures. # A single arch can be built by specifying it using gox's arch names -if [ -n "$1" ]; then - GOX_OSARCH="$1" -fi +GOX_OSARCH="$@" . build-conf.sh "$GOX_OSARCH" @@ -33,23 +31,23 @@ if [ -e "$ELN_OUTPUT" ]; then fi if [ ! -z "$WIN64_ELN" ] && [ ! -z "$WIN32_ELN" ]; then - yarn run dist-win + npm run dist-win elif [ ! -z "$WIN64_ELN" ]; then - yarn run dist-win64 + npm run dist-win64 elif [ ! -z "$WIN32_ELN" ]; then - yarn run dist-win32 + npm run dist-win32 fi if [ ! -z "$LNX64_ELN" ]; then - yarn run dist-linux + npm run dist-linux fi if [ ! -z "$OSX64_ELN" ]; then if [[ "$OSTYPE" == "darwin"* ]]; then echo "run dist-mac" - yarn run dist-mac + npm run dist-mac elif [[ "$OSTYPE" == "linux"* ]]; then - yarn run pack-mac + npm run pack-mac else echo "Can not run build script in $OSTYPE" fi @@ -80,7 +78,13 @@ fi EXE="${PDT_NAME} Setup ${APP_VERSION}.exe" if [ -e "$EXE" ]; then - mv "$EXE" "${PKG_NAME}-${APP_VERSION}-gui-win-setup.exe" + if [ ! -z $WIN32_ELN ] && [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${PKG_NAME}-${APP_VERSION}-gui-win-setup.exe" + elif [ ! -z $WIN32_ELN ]; then + mv "$EXE" "${WIN32_ELN}.exe" + elif [ ! -z $WIN64_ELN ]; then + mv "$EXE" "${WIN64_ELN}.exe" + fi fi # rename dmg file name diff --git a/electron/build-standalone-release.sh b/electron/build-standalone-release.sh index 44178a4..ce2b5be 100755 --- a/electron/build-standalone-release.sh +++ b/electron/build-standalone-release.sh @@ -1,9 +1,7 @@ #!/usr/bin/env bash set -e -o pipefail - if [ -n "$1" ]; then - GOX_OSARCH="$1" -fi +GOX_OSARCH="$@" . build-conf.sh "$GOX_OSARCH" @@ -24,6 +22,6 @@ echo "Packaging standalone release" echo "------------------------------" echo "Compressing standalone release" -#./compress-standalone-release.sh "$GOX_OSARCH" +./compress-standalone-release.sh "$GOX_OSARCH" popd >/dev/null diff --git a/electron/build.sh b/electron/build.sh index b5d2ed2..17fb0ae 100755 --- a/electron/build.sh +++ b/electron/build.sh @@ -3,11 +3,9 @@ set -e -o pipefail # Builds both the electron and standalone releases -. build-conf.sh "$1" +GOX_OSARCH="$@" -if [ -n "$1" ]; then - GOX_OSARCH="$1" -fi +. build-conf.sh "$GOX_OSARCH" SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" diff --git a/electron/build/icons/icon512x512.png b/electron/build/icons/icon512x512.png new file mode 100755 index 0000000..44f086c Binary files /dev/null and b/electron/build/icons/icon512x512.png differ diff --git a/electron/compress-electron-release.sh b/electron/compress-electron-release.sh index 35e597f..bebfe2c 100755 --- a/electron/compress-electron-release.sh +++ b/electron/compress-electron-release.sh @@ -4,9 +4,7 @@ set -e -o pipefail # Compresses packaged electron apps after # ./package-electron-release.sh is done -if [ -n "$1" ]; then - GOX_OSARCH="$1" -fi +GOX_OSARCH="$@" . build-conf.sh "$GOX_OSARCH" diff --git a/electron/compress-standalone-release.sh b/electron/compress-standalone-release.sh index 4d17f40..ecddc0d 100755 --- a/electron/compress-standalone-release.sh +++ b/electron/compress-standalone-release.sh @@ -4,9 +4,7 @@ set -e -o pipefail # Compresses packaged standalone release after # ./package-standalone-release.sh is done -if [ -n "$2" ]; then - GOX_OSARCH="$1" -fi +GOX_OSARCH="$@" . build-conf.sh "$GOX_OSARCH" @@ -40,7 +38,7 @@ if [ -e "$WIN64_STL" ]; then fi echo "Zipping $WIN64_STL_ZIP" if [[ "$OSTYPE" == "linux"* ]]; then - zip -r --quiet "$WIN64_STL_ZIP" --owner=0 --group=0 "$WIN64_STL" + zip -r --quiet -X "$WIN64_STL_ZIP" "$WIN64_STL" elif [[ "$OSTYPE" == "darwin"* ]]; then zip -r --quiet "$WIN64_STL_ZIP" "$WIN64_STL" elif [[ "$OSTYPE" == "msys"* ]]; then @@ -57,7 +55,7 @@ if [ -e "$WIN32_STL" ]; then fi echo "Zipping $WIN32_STL_ZIP" if [[ "$OSTYPE" == "linux"* ]]; then - zip -r --quiet "$WIN32_STL_ZIP" --owner=0 --group=0 "$WIN32_STL" + zip -r --quiet -X "$WIN32_STL_ZIP" "$WIN32_STL" elif [[ "$OSTYPE" == "darwin"* ]]; then zip -r --quiet "$WIN32_STL_ZIP" "$WIN32_STL" elif [[ "$OSTYPE" == "msys"* ]]; then diff --git a/electron/data.db b/electron/data.db deleted file mode 100755 index b2757bb..0000000 Binary files a/electron/data.db and /dev/null differ diff --git a/electron/install-node-modules.sh b/electron/install-node-modules.sh index 91588f9..e3166ef 100755 --- a/electron/install-node-modules.sh +++ b/electron/install-node-modules.sh @@ -2,13 +2,14 @@ set -e -o pipefail # installs the node modules for the skycoin electron app -# NOT for the electron build process +# and for the electron build process SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd "$SCRIPTDIR" >/dev/null +npm install cd src/ -yarn +npm install popd >/dev/null diff --git a/electron/npm-debug.log b/electron/npm-debug.log new file mode 100755 index 0000000..b6b004d --- /dev/null +++ b/electron/npm-debug.log @@ -0,0 +1,45 @@ +0 info it worked if it ends with ok +1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'run', 'dist-win' ] +2 info using npm@3.10.10 +3 info using node@v6.14.1 +4 verbose run-script [ 'predist-win', 'dist-win', 'postdist-win' ] +5 info lifecycle solarbankerscoin@0.24.1~predist-win: solarbankerscoin@0.24.1 +6 silly lifecycle solarbankerscoin@0.24.1~predist-win: no script for predist-win, continuing +7 info lifecycle solarbankerscoin@0.24.1~dist-win: solarbankerscoin@0.24.1 +8 verbose lifecycle solarbankerscoin@0.24.1~dist-win: unsafe-perm in lifecycle true +9 verbose lifecycle solarbankerscoin@0.24.1~dist-win: PATH: /usr/lib/node_modules/npm/bin/node-gyp-bin:/root/go/src/SolarBankersCoin_24.0/electron/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games +10 verbose lifecycle solarbankerscoin@0.24.1~dist-win: CWD: /root/go/src/SolarBankersCoin_24.0/electron +11 silly lifecycle solarbankerscoin@0.24.1~dist-win: Args: [ '-c', 'build -w --x64 --ia32 -p=never' ] +12 silly lifecycle solarbankerscoin@0.24.1~dist-win: Returned: code: 1 signal: null +13 info lifecycle solarbankerscoin@0.24.1~dist-win: Failed to exec dist-win script +14 verbose stack Error: solarbankerscoin@0.24.1 dist-win: `build -w --x64 --ia32 -p=never` +14 verbose stack Exit status 1 +14 verbose stack at EventEmitter. (/usr/lib/node_modules/npm/lib/utils/lifecycle.js:255:16) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at EventEmitter.emit (events.js:191:7) +14 verbose stack at ChildProcess. (/usr/lib/node_modules/npm/lib/utils/spawn.js:40:14) +14 verbose stack at emitTwo (events.js:106:13) +14 verbose stack at ChildProcess.emit (events.js:191:7) +14 verbose stack at maybeClose (internal/child_process.js:920:16) +14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5) +15 verbose pkgid solarbankerscoin@0.24.1 +16 verbose cwd /root/go/src/SolarBankersCoin_24.0/electron +17 error Linux 4.15.12-x86_64-linode105 +18 error argv "/usr/bin/node" "/usr/bin/npm" "run" "dist-win" +19 error node v6.14.1 +20 error npm v3.10.10 +21 error code ELIFECYCLE +22 error solarbankerscoin@0.24.1 dist-win: `build -w --x64 --ia32 -p=never` +22 error Exit status 1 +23 error Failed at the solarbankerscoin@0.24.1 dist-win script 'build -w --x64 --ia32 -p=never'. +23 error Make sure you have the latest version of node.js and npm installed. +23 error If you do, this is most likely a problem with the solarbankerscoin package, +23 error not with npm itself. +23 error Tell the author that this fails on your system: +23 error build -w --x64 --ia32 -p=never +23 error You can get information on how to open an issue for this project with: +23 error npm bugs solarbankerscoin +23 error Or if that isn't available, you can get their info via: +23 error npm owner ls solarbankerscoin +23 error There is likely additional logging output above. +24 verbose exit [ 1, true ] diff --git a/electron/package-electron-release.sh b/electron/package-electron-release.sh index 708cd74..4323743 100755 --- a/electron/package-electron-release.sh +++ b/electron/package-electron-release.sh @@ -4,9 +4,7 @@ set -e -o pipefail # Copies gox-compiled binaries and compiled GUI assets # into an electron package -if [ -n "$1" ]; then - GOX_OSARCH="$1" -fi +GOX_OSARCH="$@" . build-conf.sh "$GOX_OSARCH" diff --git a/electron/package-lock.json b/electron/package-lock.json new file mode 100755 index 0000000..044865c --- /dev/null +++ b/electron/package-lock.json @@ -0,0 +1,2780 @@ +{ + "name": "solarbankerscoin", + "version": "0.24.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "7zip-bin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-3.1.0.tgz", + "integrity": "sha1-cIFMa21E/vi3S+b8ZNOXei7/WaU=", + "dev": true, + "requires": { + "7zip-bin-linux": "1.3.1", + "7zip-bin-mac": "1.0.1", + "7zip-bin-win": "2.2.0" + } + }, + "7zip-bin-linux": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/7zip-bin-linux/-/7zip-bin-linux-1.3.1.tgz", + "integrity": "sha1-SFbbGrG/W27oRE+T9aitcURtANU=", + "dev": true, + "optional": true + }, + "7zip-bin-mac": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz", + "integrity": "sha1-Pmh3i78JJq3GgVlCcHRQXUdVXAI=", + "dev": true, + "optional": true + }, + "7zip-bin-win": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin-win/-/7zip-bin-win-2.2.0.tgz", + "integrity": "sha512-uPHXapEmUtlUKTBx4asWMlxtFUWXzEY0KVEgU7QKhgO2LJzzM3kYxM6yOyUZTtYE6mhK4dDn3FDut9SCQWHzgg==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "8.10.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.21.tgz", + "integrity": "sha512-87XkD9qDXm8fIax+5y7drx84cXsu34ZZqfB7Cial3Q/2lxSoJ/+DRaWckkCbxP41wFSIrrb939VhzaNxj4eY1w==", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "app-builder-bin": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.8.6.tgz", + "integrity": "sha1-hWBOzpwbY+0EN6vpLdr0HIjD8uQ=", + "dev": true, + "requires": { + "app-builder-bin-linux": "1.8.6", + "app-builder-bin-mac": "1.8.6", + "app-builder-bin-win": "1.8.6" + } + }, + "app-builder-bin-linux": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-linux/-/app-builder-bin-linux-1.8.6.tgz", + "integrity": "sha1-gRdrvLKSmVipDyGEr7VN+QtyEKM=", + "dev": true, + "optional": true + }, + "app-builder-bin-mac": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-mac/-/app-builder-bin-mac-1.8.6.tgz", + "integrity": "sha512-lWIpI2zmOmQ4JCp1IGxK6KngKAEN6QO9nu5k8h+ZzMxHBTCk8+kbBTE+R36BSRGX9q/4FhHBpYGXHVj+N9xOXg==", + "dev": true, + "optional": true + }, + "app-builder-bin-win": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/app-builder-bin-win/-/app-builder-bin-win-1.8.6.tgz", + "integrity": "sha512-nlceArzkRtWgqNoif6OFKaAKNNZ3uZuiG+9UkpOPLf/EDoYdeAq4YdvKWaQx1RHsNNfQTx0s/IODvlD0AdUmPA==", + "dev": true, + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha1-i9iwJLDsmxwBzMua+dspvXF9+vM=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "dev": true + }, + "bluebird-lst": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", + "integrity": "sha1-vryDAmt+kqcocaPcWZ4hnL+wAqk=", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", + "dev": true, + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.4.1", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true + }, + "builder-util": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.8.1.tgz", + "integrity": "sha1-jdlTwBi3p7KlbDQnssYu93ySWsc=", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "bluebird-lst": "1.0.5", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "semver": "5.5.0", + "source-map-support": "0.5.6", + "stat-mode": "0.2.2", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builder-util-runtime": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-4.2.1.tgz", + "integrity": "sha1-DKo1jxMx1waAAQFBylkZUrabNbw=", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "debug": "3.1.0", + "fs-extra-p": "4.6.1", + "sax": "1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha1-GMSasWoDe26wFSzIPjRxM4IVtm4=", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha1-cQGTJkuwXHe4yQ0C9aryIhamZ7I=", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha1-SYgbj7pn3xKpa98/VsCqueeRMUc=", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha1-xvJd767vJt8S3TNBSwAf6BpUP48=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.3.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "dmg-builder": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.1.8.tgz", + "integrity": "sha1-NlBIpKvz9Omk2PsDMc57oTRY9L0=", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "electron-builder-lib": "20.13.3", + "fs-extra-p": "4.6.1", + "iconv-lite": "0.4.23", + "js-yaml": "3.12.0", + "parse-color": "1.0.0", + "sanitize-filename": "1.6.1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha1-pTF0Wb09eauIz/bkQFemo/ux/O8=", + "dev": true + }, + "dotenv-expand": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", + "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha1-SY7A1JVlWrxvI81hho2SZGQHGqA=", + "dev": true + }, + "electron": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.0.tgz", + "integrity": "sha1-6V3H86CJpSuMKlLHyeECTbDI1G4=", + "dev": true, + "requires": { + "@types/node": "8.10.21", + "electron-download": "3.3.0", + "extract-zip": "1.6.7" + } + }, + "electron-builder": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.13.3.tgz", + "integrity": "sha1-70Gcmipi+q9dXl4ZaLGLJBi+/jY=", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "dmg-builder": "4.1.8", + "electron-builder-lib": "20.13.3", + "electron-download-tf": "4.3.4", + "fs-extra-p": "4.6.1", + "is-ci": "1.1.0", + "lazy-val": "1.0.3", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "update-notifier": "2.5.0", + "yargs": "11.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "electron-download-tf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/electron-download-tf/-/electron-download-tf-4.3.4.tgz", + "integrity": "sha1-sDdAsohaoq0/h4T65030J/ZtUWU=", + "dev": true, + "requires": { + "debug": "3.1.0", + "env-paths": "1.0.0", + "fs-extra": "4.0.3", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "3.0.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "2.0.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "2.6.9" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + } + } + }, + "electron-builder-lib": { + "version": "20.13.3", + "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.13.3.tgz", + "integrity": "sha1-H8m3lfqRMSXAcIQmoWFZ+4VLjjs=", + "dev": true, + "requires": { + "7zip-bin": "3.1.0", + "app-builder-bin": "1.8.6", + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chromium-pickle-js": "0.2.0", + "debug": "3.1.0", + "ejs": "2.6.1", + "electron-osx-sign": "0.4.10", + "electron-publish": "20.13.2", + "fs-extra-p": "4.6.1", + "hosted-git-info": "2.7.1", + "is-ci": "1.1.0", + "isbinaryfile": "3.0.2", + "js-yaml": "3.12.0", + "lazy-val": "1.0.3", + "minimatch": "3.0.4", + "normalize-package-data": "2.4.0", + "plist": "3.0.1", + "read-config-file": "3.0.1", + "sanitize-filename": "1.6.1", + "semver": "5.5.0", + "temp-file": "3.1.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "dev": true, + "requires": { + "debug": "2.6.9", + "fs-extra": "0.30.0", + "home-path": "1.0.6", + "minimist": "1.2.0", + "nugget": "2.0.1", + "path-exists": "2.1.0", + "rc": "1.2.8", + "semver": "5.5.0", + "sumchecker": "1.3.1" + } + }, + "electron-osx-sign": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", + "integrity": "sha1-vk87ibKnWh3F8eckkIGrKSnKOiY=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "compare-version": "0.1.2", + "debug": "2.6.9", + "isbinaryfile": "3.0.2", + "minimist": "1.2.0", + "plist": "2.1.0" + }, + "dependencies": { + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "dev": true, + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.27" + } + } + } + }, + "electron-publish": { + "version": "20.13.2", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.13.2.tgz", + "integrity": "sha1-pTiAmKwX+hDQSUaH6FSKJs8VIqw=", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "builder-util": "5.8.1", + "builder-util-runtime": "4.2.1", + "chalk": "2.4.1", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3", + "mime": "2.3.1" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.19" + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1", + "path-is-absolute": "1.0.1", + "rimraf": "2.6.2" + } + }, + "fs-extra-p": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/fs-extra-p/-/fs-extra-p-4.6.1.tgz", + "integrity": "sha1-YVbgzJgJf0FfzRcClXj8QceLUJI=", + "dev": true, + "requires": { + "bluebird-lst": "1.0.5", + "fs-extra": "6.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha1-irwSj3lG4xATXdyTuYvdtBDno0s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.2" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.2", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "home-path": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz", + "integrity": "sha1-1UncJGU4in+GZyQsWzFYjSmvKfw=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha1-KXhx9jvlB63Pv8pxXQzQ7thOmmM=", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha1-JH5BYueGDOu9rzC3dNawrH3P56U=", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-val": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", + "integrity": "sha1-u5eyAO8AgB2UwxfincbtOeMcXtw=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha1-oRdc80lt/IQ2wVbDNLSVWZK85pw=", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=", + "dev": true, + "requires": { + "pify": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha1-sWIcVNY7l8R9PP5/chX31kUXw2k=", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha1-BWnWV0ZkkSg3CWY603mpm5DZq0c=", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha1-ceRkU3p++BwV8tudl+kT/A/2BvA=", + "dev": true, + "requires": { + "mime-db": "1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "2.6.9", + "minimist": "1.2.0", + "pretty-bytes": "1.0.4", + "progress-stream": "1.2.0", + "request": "2.87.0", + "single-line-log": "1.1.2", + "throttleit": "0.0.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-color": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", + "integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=", + "dev": true, + "requires": { + "color-convert": "0.5.3" + }, + "dependencies": { + "color-convert": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", + "dev": true + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha1-qbkx0XwwTokS7wujvdYYK68uH4w=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "xmlbuilder": "9.0.7", + "xmldom": "0.1.27" + }, + "dependencies": { + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "0.1.4", + "through2": "0.2.3" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "dev": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-config-file": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.0.1.tgz", + "integrity": "sha1-MH7S4WL6VDBtCubUHpzcgpcg0qk=", + "dev": true, + "requires": { + "ajv": "6.5.2", + "ajv-keywords": "3.2.0", + "bluebird-lst": "1.0.5", + "dotenv": "5.0.1", + "dotenv-expand": "4.2.0", + "fs-extra-p": "4.6.1", + "js-yaml": "3.12.0", + "json5": "1.0.1", + "lazy-val": "1.0.3" + }, + "dependencies": { + "ajv": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.2.tgz", + "integrity": "sha1-Z4SV+bgvfMpr4kjdkvWb/14fQ2A=", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", + "dev": true, + "requires": { + "rc": "1.2.8", + "safe-buffer": "5.1.2" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.19", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "1.0.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.1.0", + "source-map": "0.6.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha1-LHrmEFbHFKW5ubKyr30xHvXHj+k=", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha1-enzShHDMbToc/m1miG9rxDDTrIc=", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "es6-promise": "4.2.4" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "temp-file": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.1.3.tgz", + "integrity": "sha1-JMFEmU8DO+HM9ncygMj38ckWkak=", + "dev": true, + "requires": { + "async-exit-hook": "2.0.1", + "bluebird-lst": "1.0.5", + "fs-extra-p": "4.6.1", + "lazy-val": "1.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "0.7.0" + } + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "xtend": "2.1.2" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "1.0.4" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y=", + "dev": true, + "requires": { + "boxen": "1.3.0", + "chalk": "2.4.1", + "configstore": "3.1.2", + "import-lazy": "2.1.0", + "is-ci": "1.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", + "dev": true, + "requires": { + "punycode": "2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "dev": true, + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "0.4.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha1-kLhpk07W6HERXqL/WLA/RyTtLXc=", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + } + } +} diff --git a/electron/package-standalone-release.sh b/electron/package-standalone-release.sh index 596815b..ae01c4c 100755 --- a/electron/package-standalone-release.sh +++ b/electron/package-standalone-release.sh @@ -3,9 +3,7 @@ set -e -o pipefail # Builds the release without electron -if [ -n "$1" ]; then - GOX_OSARCH="$2" -fi +GOX_OSARCH="$@" echo "In package standalone release: $GOX_OSARCH" @@ -15,18 +13,6 @@ SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" pushd "$SCRIPTDIR" >/dev/null -OSX64="${STL_OUTPUT}/${OSX64_STL}" -WIN64="${STL_OUTPUT}/${WIN64_STL}" -WIN32="${STL_OUTPUT}/${WIN32_STL}" -LNX64="${STL_OUTPUT}/${LNX64_STL}" -LNX_ARM="${STL_OUTPUT}/${LNX_ARM_STL}" - -OSX64_SRC="${OSX64}/src" -WIN64_SRC="${WIN64}/src" -WIN32_SRC="${WIN32}/src" -LNX64_SRC="${LNX64}/src" -LNX_ARM_SRC="${LNX_ARM}/src" - DESTSRCS=() function copy_if_exists { @@ -63,16 +49,43 @@ function copy_if_exists { echo "Copying ${PKG_NAME} binaries" -# copy binaries -copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" -copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" -copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" -copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" -copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +# OS X +if [ ! -z "$OSX64_STL" ]; then + OSX64="${STL_OUTPUT}/${OSX64_STL}" + OSX64_SRC="${OSX64}/src" + copy_if_exists "${OSX64_OUT}/${PKG_NAME}" "$OSX64" "$OSX64_SRC" +fi + +# Linux amd64 +if [ ! -z "$LNX64_STL" ]; then + LNX64="${STL_OUTPUT}/${LNX64_STL}" + LNX64_SRC="${LNX64}/src" + copy_if_exists "${LNX64_OUT}/${PKG_NAME}" "$LNX64" "$LNX64_SRC" +fi + +# Linux arm +if [ ! -z "$LNX_ARM_STL" ]; then + LNX_ARM="${STL_OUTPUT}/${LNX_ARM_STL}" + LNX_ARM_SRC="${LNX_ARM}/src" + copy_if_exists "${LNX_ARM_OUT}/${PKG_NAME}" "$LNX_ARM" "$LNX_ARM_SRC" +fi + +# Windows amd64 +if [ ! -z "$WIN64_STL" ]; then + WIN64="${STL_OUTPUT}/${WIN64_STL}" + WIN64_SRC="${WIN64}/src" + copy_if_exists "${WIN64_OUT}/${PKG_NAME}.exe" "$WIN64" "$WIN64_SRC" +fi + +# Windows 386 +if [ ! -z "$WIN32_STL" ]; then + WIN32="${STL_OUTPUT}/${WIN32_STL}" + WIN32_SRC="${WIN32}/src" + copy_if_exists "${WIN32_OUT}/${PKG_NAME}.exe" "$WIN32" "$WIN32_SRC" +fi # Copy the source for reference # tar it with filters, move it, then untar in order to do this echo "Copying source snapshot" -./package-source.sh "${DESTSRCS[@]}" - +./package-source.sh "${DESTSRCS[@]}" \ No newline at end of file diff --git a/electron/package.json b/electron/package.json index 4c6dc66..e03148d 100755 --- a/electron/package.json +++ b/electron/package.json @@ -1,13 +1,13 @@ { "name": "solarbankerscoin", "productName": "SolarBankers Coin", - "author": "SolarBankers", + "author": "Solarbankers Coin", "main": "src/electron-main.js", - "version": "0.23.1-rc2", + "version": "0.24.1", "description": "solarbankerscoin wallet", "license": "MIT", "build": { - "appId": "org.solarbankers.solarbankers", + "appId": "org.solarbankerscoin.solarbankerscoin", "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true @@ -27,10 +27,6 @@ { "from": ".gox_output/${os}_${arch}", "to": "./resources/app" - }, - { - "from": "data.db", - "to": "./" } ] }, @@ -74,13 +70,12 @@ "dist-win": "build -w --x64 --ia32 -p=never", "dist-linux": "build -l --x64 -p=never", "dist-mac": "build -m --x64 -p=never", - "pack-mac": "build --dir -m -p=never" + "pack-mac": "build --dir -m -p=never", + "postinstall": "electron-builder install-app-deps" }, "devDependencies": { - "electron": "^1.8.0", - "electron-builder": "^19.55.0" + "electron": "2.0.0", + "electron-builder": "20.13.3" }, - "dependencies": { - "electron-log": "^2.2.9" - } + "dependencies": {} } diff --git a/electron/skycoin/current-skycoin.json b/electron/skycoin/current-skycoin.json index 9418bd3..381e17e 100755 --- a/electron/skycoin/current-skycoin.json +++ b/electron/skycoin/current-skycoin.json @@ -1 +1 @@ -versionData='{ "version": "0.23.1-rc2" }'; +versionData='{ "version": "0.24.1" }'; diff --git a/electron/src/electron-main.js b/electron/src/electron-main.js index fbb8542..0756d85 100755 --- a/electron/src/electron-main.js +++ b/electron/src/electron-main.js @@ -2,8 +2,6 @@ const { app, Menu, BrowserWindow, dialog, shell, session } = require('electron'); -var log = require('electron-log'); - const path = require('path'); const childProcess = require('child_process'); @@ -21,7 +19,6 @@ require('electron-context-menu')({}); global.eval = function() { throw new Error('bad!!'); } -const defaultURL = 'http://127.0.0.1:7220/'; let currentURL; // Force everything localhost, in case of a leak @@ -39,10 +36,10 @@ let win; var skycoin = null; function startSkycoin() { - console.log('Starting SolarBankerCoin from electron'); + console.log('Starting distributedblocks from electron'); if (skycoin) { - console.log('SolarBankerCoin already running'); + console.log('solarbankerscoinalready running'); app.emit('skycoin-ready'); return } @@ -77,13 +74,18 @@ function startSkycoin() { '-enable-seed-api=true', '-enable-wallet-api=true', '-rpc-interface=false', - "-disable-csrf=false" + '-disable-csrf=false', + '-reset-corrupt-db=true', + '-enable-gui=true', + '-web-interface-port=0' // random port assignment // will break // broken (automatically generated certs do not work): // '-web-interface-https=true', ] skycoin = childProcess.spawn(exe, args); + createWindow(); + skycoin.on('error', (e) => { dialog.showErrorBox('Failed to start solarbankerscoin', e.toString()); app.quit(); @@ -95,13 +97,15 @@ function startSkycoin() { if (currentURL) { return } + const marker = 'Starting web interface on '; - var i = data.indexOf(marker); - if (i === -1) { - return - } - currentURL = defaultURL; - app.emit('skycoin-ready', { url: currentURL }); + + data.toString().split("\n").forEach(line => { + if (line.indexOf(marker) !== -1) { + currentURL = 'http://' + line.split(marker)[1].trim(); + app.emit('skycoin-ready', { url: currentURL }); + } + }); }); skycoin.stderr.on('data', (data) => { @@ -109,23 +113,19 @@ function startSkycoin() { }); skycoin.on('close', (code) => { - // log.info('Skycoin closed'); - console.log('SolarBankerscoin closed'); + // log.info('solarbankerscoinclosed'); + console.log('solarbankerscoinclosed'); reset(); }); skycoin.on('exit', (code) => { - // log.info('Skycoin exited'); - console.log('SolarBankerscoin exited'); + // log.info(solarbankerscoinexited'); + console.log('solarbankerscoinexited'); reset(); }); } function createWindow(url) { - if (!url) { - url = defaultURL; - } - // To fix appImage doesn't show icon in dock issue. var appPath = app.getPath('exe'); var iconPath = (() => { @@ -139,13 +139,19 @@ function createWindow(url) { win = new BrowserWindow({ width: 1200, height: 900, - title: 'Skycoin', + title: 'SolarBankersCoin', icon: iconPath, nodeIntegration: false, webPreferences: { webgl: false, webaudio: false, contextIsolation: true, + webviewTag: false, + nodeIntegration: false, + nodeIntegrationInWorker: false, + allowRunningInsecureContent: false, + webSecurity: true, + plugins: false, }, }); @@ -155,14 +161,18 @@ function createWindow(url) { const ses = win.webContents.session ses.clearCache(function () { - console.log('Cleared the caching of the SolarBankerscoin wallet.'); + console.log('Cleared the caching of the solarbankerscoin wallet.'); }); ses.clearStorageData([], function() { console.log('Cleared the stored cached data'); }); - win.loadURL(url); + if (url) { + win.loadURL(url); + } else { + win.loadURL('file://' + __dirname + '/splash/index.html'); + } // Open the DevTools. // win.webContents.openDevTools(); @@ -238,7 +248,7 @@ const alreadyRunning = app.makeSingleInstance((commandLine, workingDirectory) => } win.focus(); } else { - createWindow(currentURL || defaultURL); + createWindow(currentURL); } }); @@ -255,10 +265,14 @@ let walletsFolder = null; app.on('ready', startSkycoin); app.on('skycoin-ready', (e) => { - createWindow(e.url); + if (win) { + win.loadURL(e.url); + } else { + createWindow(e.url); + } axios - .get(defaultURL + 'wallets/folderName') + .get(e.url + '/api/v1/wallets/folderName') .then(response => walletsFolder = response.data.address) .catch(() => {}); }); @@ -276,7 +290,7 @@ app.on('activate', () => { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (win === null) { - createWindow(); + createWindow(currentURL); } }); diff --git a/electron/src/node_modules/.yarn-integrity b/electron/src/node_modules/.yarn-integrity deleted file mode 100755 index d23c664..0000000 --- a/electron/src/node_modules/.yarn-integrity +++ /dev/null @@ -1,44 +0,0 @@ -{ - "systemParams": "linux-x64-48", - "modulesFolders": [ - "node_modules" - ], - "flags": [], - "linkedModules": [], - "topLevelPatterns": [ - "axios@^0.18.0", - "electron-context-menu@^0.9.1", - "electron-debug@^1.0.1", - "electron-log@^1.2.2" - ], - "lockfileEntries": { - "axios@^0.18.0": "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102", - "debug@^2.6.8": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f", - "debug@^3.1.0": "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261", - "electron-context-menu@^0.9.1": "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-0.9.1.tgz#ed4df20c080491c3c996abfcb363159946a38058", - "electron-debug@^1.0.1": "https://registry.yarnpkg.com/electron-debug/-/electron-debug-1.4.0.tgz#bec7005522220a9d0622153352e1bbff0f37af2e", - "electron-dl@^1.2.0": "https://registry.yarnpkg.com/electron-dl/-/electron-dl-1.10.0.tgz#f94416064056fc6f2a86ae498614c93526890af9", - "electron-is-accelerator@^0.1.0": "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b", - "electron-is-dev@^0.1.1": "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.1.2.tgz#8a1043e32b3a1da1c3f553dce28ce764246167e3", - "electron-is-dev@^0.3.0": "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe", - "electron-localshortcut@^3.0.0": "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.0.2.tgz#df9cebe64140f4e58b680aacb2bd6278ae38ee61", - "electron-log@^1.2.2": "https://registry.yarnpkg.com/electron-log/-/electron-log-1.3.0.tgz#d05544114b971a16c86739c79d0d236103ad0a16", - "ext-list@^2.0.0": "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37", - "ext-name@^5.0.0": "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6", - "follow-redirects@^1.3.0": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa", - "is-buffer@^1.1.5": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be", - "is-plain-obj@^1.0.0": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e", - "keyboardevent-from-electron-accelerator@^0.7.0": "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-0.7.1.tgz#aedafa5cc9a3a5f3f2b7c88b2ffd4057568118e7", - "keyboardevents-areequal@^0.2.1": "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194", - "mime-db@^1.28.0": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414", - "modify-filename@^1.1.0": "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1", - "ms@2.0.0": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8", - "path-exists@^3.0.0": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515", - "pupa@^1.0.0": "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6", - "sort-keys-length@^1.0.0": "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188", - "sort-keys@^1.0.0": "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad", - "unused-filename@^1.0.0": "https://registry.yarnpkg.com/unused-filename/-/unused-filename-1.0.0.tgz#d340880f71ae2115ebaa1325bef05cc6684469c6" - }, - "files": [], - "artifacts": {} -} \ No newline at end of file diff --git a/electron/src/node_modules/axios/CHANGELOG.md b/electron/src/node_modules/axios/CHANGELOG.md deleted file mode 100755 index d336ec1..0000000 --- a/electron/src/node_modules/axios/CHANGELOG.md +++ /dev/null @@ -1,245 +0,0 @@ -# Changelog - -### 0.18.0 (Feb 19, 2018) - -- Adding support for UNIX Sockets when running with Node.js ([#1070](https://github.com/axios/axios/pull/1070)) -- Fixing typings ([#1177](https://github.com/axios/axios/pull/1177)): - - AxiosRequestConfig.proxy: allows type false - - AxiosProxyConfig: added auth field -- Adding function signature in AxiosInstance interface so AxiosInstance can be invoked ([#1192](https://github.com/axios/axios/pull/1192), [#1254](https://github.com/axios/axios/pull/1254)) -- Allowing maxContentLength to pass through to redirected calls as maxBodyLength in follow-redirects config ([#1287](https://github.com/axios/axios/pull/1287)) -- Fixing configuration when using an instance - method can now be set ([#1342](https://github.com/axios/axios/pull/1342)) - - -### 0.17.1 (Nov 11, 2017) - -- Fixing issue with web workers ([#1160](https://github.com/axios/axios/pull/1160)) -- Allowing overriding transport ([#1080](https://github.com/axios/axios/pull/1080)) -- Updating TypeScript typings ([#1165](https://github.com/axios/axios/pull/1165), [#1125](https://github.com/axios/axios/pull/1125), [#1131](https://github.com/axios/axios/pull/1131)) - -### 0.17.0 (Oct 21, 2017) - -- **BREAKING** Fixing issue with `baseURL` and interceptors ([#950](https://github.com/axios/axios/pull/950)) -- **BREAKING** Improving handing of duplicate headers ([#874](https://github.com/axios/axios/pull/874)) -- Adding support for disabling proxies ([#691](https://github.com/axios/axios/pull/691)) -- Updating TypeScript typings with generic type parameters ([#1061](https://github.com/axios/axios/pull/1061)) - -### 0.16.2 (Jun 3, 2017) - -- Fixing issue with including `buffer` in bundle ([#887](https://github.com/axios/axios/pull/887)) -- Including underlying request in errors ([#830](https://github.com/axios/axios/pull/830)) -- Convert `method` to lowercase ([#930](https://github.com/axios/axios/pull/930)) - -### 0.16.1 (Apr 8, 2017) - -- Improving HTTP adapter to return last request in case of redirects ([#828](https://github.com/axios/axios/pull/828)) -- Updating `follow-redirects` dependency ([#829](https://github.com/axios/axios/pull/829)) -- Adding support for passing `Buffer` in node ([#773](https://github.com/axios/axios/pull/773)) - -### 0.16.0 (Mar 31, 2017) - -- **BREAKING** Removing `Promise` from axios typings in favor of built-in type declarations ([#480](https://github.com/axios/axios/issues/480)) -- Adding `options` shortcut method ([#461](https://github.com/axios/axios/pull/461)) -- Fixing issue with using `responseType: 'json'` in browsers incompatible with XHR Level 2 ([#654](https://github.com/axios/axios/pull/654)) -- Improving React Native detection ([#731](https://github.com/axios/axios/pull/731)) -- Fixing `combineURLs` to support empty `relativeURL` ([#581](https://github.com/axios/axios/pull/581)) -- Removing `PROTECTION_PREFIX` support ([#561](https://github.com/axios/axios/pull/561)) - -### 0.15.3 (Nov 27, 2016) - -- Fixing issue with custom instances and global defaults ([#443](https://github.com/axios/axios/issues/443)) -- Renaming `axios.d.ts` to `index.d.ts` ([#519](https://github.com/axios/axios/issues/519)) -- Adding `get`, `head`, and `delete` to `defaults.headers` ([#509](https://github.com/axios/axios/issues/509)) -- Fixing issue with `btoa` and IE ([#507](https://github.com/axios/axios/issues/507)) -- Adding support for proxy authentication ([#483](https://github.com/axios/axios/pull/483)) -- Improving HTTP adapter to use `http` protocol by default ([#493](https://github.com/axios/axios/pull/493)) -- Fixing proxy issues ([#491](https://github.com/axios/axios/pull/491)) - -### 0.15.2 (Oct 17, 2016) - -- Fixing issue with calling `cancel` after response has been received ([#482](https://github.com/axios/axios/issues/482)) - -### 0.15.1 (Oct 14, 2016) - -- Fixing issue with UMD ([#485](https://github.com/axios/axios/issues/485)) - -### 0.15.0 (Oct 10, 2016) - -- Adding cancellation support ([#452](https://github.com/axios/axios/pull/452)) -- Moving default adapter to global defaults ([#437](https://github.com/axios/axios/pull/437)) -- Fixing issue with `file` URI scheme ([#440](https://github.com/axios/axios/pull/440)) -- Fixing issue with `params` objects that have no prototype ([#445](https://github.com/axios/axios/pull/445)) - -### 0.14.0 (Aug 27, 2016) - -- **BREAKING** Updating TypeScript definitions ([#419](https://github.com/axios/axios/pull/419)) -- **BREAKING** Replacing `agent` option with `httpAgent` and `httpsAgent` ([#387](https://github.com/axios/axios/pull/387)) -- **BREAKING** Splitting `progress` event handlers into `onUploadProgress` and `onDownloadProgress` ([#423](https://github.com/axios/axios/pull/423)) -- Adding support for `http_proxy` and `https_proxy` environment variables ([#366](https://github.com/axios/axios/pull/366)) -- Fixing issue with `auth` config option and `Authorization` header ([#397](https://github.com/axios/axios/pull/397)) -- Don't set XSRF header if `xsrfCookieName` is `null` ([#406](https://github.com/axios/axios/pull/406)) - -### 0.13.1 (Jul 16, 2016) - -- Fixing issue with response data not being transformed on error ([#378](https://github.com/axios/axios/issues/378)) - -### 0.13.0 (Jul 13, 2016) - -- **BREAKING** Improved error handling ([#345](https://github.com/axios/axios/pull/345)) -- **BREAKING** Response transformer now invoked in dispatcher not adapter ([10eb238](https://github.com/axios/axios/commit/10eb23865101f9347570552c04e9d6211376e25e)) -- **BREAKING** Request adapters now return a `Promise` ([157efd5](https://github.com/axios/axios/commit/157efd5615890301824e3121cc6c9d2f9b21f94a)) -- Fixing issue with `withCredentials` not being overwritten ([#343](https://github.com/axios/axios/issues/343)) -- Fixing regression with request transformer being called before request interceptor ([#352](https://github.com/axios/axios/issues/352)) -- Fixing custom instance defaults ([#341](https://github.com/axios/axios/issues/341)) -- Fixing instances created from `axios.create` to have same API as default axios ([#217](https://github.com/axios/axios/issues/217)) - -### 0.12.0 (May 31, 2016) - -- Adding support for `URLSearchParams` ([#317](https://github.com/axios/axios/pull/317)) -- Adding `maxRedirects` option ([#307](https://github.com/axios/axios/pull/307)) - -### 0.11.1 (May 17, 2016) - -- Fixing IE CORS support ([#313](https://github.com/axios/axios/pull/313)) -- Fixing detection of `FormData` ([#325](https://github.com/axios/axios/pull/325)) -- Adding `Axios` class to exports ([#321](https://github.com/axios/axios/pull/321)) - -### 0.11.0 (Apr 26, 2016) - -- Adding support for Stream with HTTP adapter ([#296](https://github.com/axios/axios/pull/296)) -- Adding support for custom HTTP status code error ranges ([#308](https://github.com/axios/axios/pull/308)) -- Fixing issue with ArrayBuffer ([#299](https://github.com/axios/axios/pull/299)) - -### 0.10.0 (Apr 20, 2016) - -- Fixing issue with some requests sending `undefined` instead of `null` ([#250](https://github.com/axios/axios/pull/250)) -- Fixing basic auth for HTTP adapter ([#252](https://github.com/axios/axios/pull/252)) -- Fixing request timeout for XHR adapter ([#227](https://github.com/axios/axios/pull/227)) -- Fixing IE8 support by using `onreadystatechange` instead of `onload` ([#249](https://github.com/axios/axios/pull/249)) -- Fixing IE9 cross domain requests ([#251](https://github.com/axios/axios/pull/251)) -- Adding `maxContentLength` option ([#275](https://github.com/axios/axios/pull/275)) -- Fixing XHR support for WebWorker environment ([#279](https://github.com/axios/axios/pull/279)) -- Adding request instance to response ([#200](https://github.com/axios/axios/pull/200)) - -### 0.9.1 (Jan 24, 2016) - -- Improving handling of request timeout in node ([#124](https://github.com/axios/axios/issues/124)) -- Fixing network errors not rejecting ([#205](https://github.com/axios/axios/pull/205)) -- Fixing issue with IE rejecting on HTTP 204 ([#201](https://github.com/axios/axios/issues/201)) -- Fixing host/port when following redirects ([#198](https://github.com/axios/axios/pull/198)) - -### 0.9.0 (Jan 18, 2016) - -- Adding support for custom adapters -- Fixing Content-Type header being removed when data is false ([#195](https://github.com/axios/axios/pull/195)) -- Improving XDomainRequest implementation ([#185](https://github.com/axios/axios/pull/185)) -- Improving config merging and order of precedence ([#183](https://github.com/axios/axios/pull/183)) -- Fixing XDomainRequest support for only <= IE9 ([#182](https://github.com/axios/axios/pull/182)) - -### 0.8.1 (Dec 14, 2015) - -- Adding support for passing XSRF token for cross domain requests when using `withCredentials` ([#168](https://github.com/axios/axios/pull/168)) -- Fixing error with format of basic auth header ([#178](https://github.com/axios/axios/pull/173)) -- Fixing error with JSON payloads throwing `InvalidStateError` in some cases ([#174](https://github.com/axios/axios/pull/174)) - -### 0.8.0 (Dec 11, 2015) - -- Adding support for creating instances of axios ([#123](https://github.com/axios/axios/pull/123)) -- Fixing http adapter to use `Buffer` instead of `String` in case of `responseType === 'arraybuffer'` ([#128](https://github.com/axios/axios/pull/128)) -- Adding support for using custom parameter serializer with `paramsSerializer` option ([#121](https://github.com/axios/axios/pull/121)) -- Fixing issue in IE8 caused by `forEach` on `arguments` ([#127](https://github.com/axios/axios/pull/127)) -- Adding support for following redirects in node ([#146](https://github.com/axios/axios/pull/146)) -- Adding support for transparent decompression if `content-encoding` is set ([#149](https://github.com/axios/axios/pull/149)) -- Adding support for transparent XDomainRequest to handle cross domain requests in IE9 ([#140](https://github.com/axios/axios/pull/140)) -- Adding support for HTTP basic auth via Authorization header ([#167](https://github.com/axios/axios/pull/167)) -- Adding support for baseURL option ([#160](https://github.com/axios/axios/pull/160)) - -### 0.7.0 (Sep 29, 2015) - -- Fixing issue with minified bundle in IE8 ([#87](https://github.com/axios/axios/pull/87)) -- Adding support for passing agent in node ([#102](https://github.com/axios/axios/pull/102)) -- Adding support for returning result from `axios.spread` for chaining ([#106](https://github.com/axios/axios/pull/106)) -- Fixing typescript definition ([#105](https://github.com/axios/axios/pull/105)) -- Fixing default timeout config for node ([#112](https://github.com/axios/axios/pull/112)) -- Adding support for use in web workers, and react-native ([#70](https://github.com/axios/axios/issue/70)), ([#98](https://github.com/axios/axios/pull/98)) -- Adding support for fetch like API `axios(url[, config])` ([#116](https://github.com/axios/axios/issues/116)) - -### 0.6.0 (Sep 21, 2015) - -- Removing deprecated success/error aliases -- Fixing issue with array params not being properly encoded ([#49](https://github.com/axios/axios/pull/49)) -- Fixing issue with User-Agent getting overridden ([#69](https://github.com/axios/axios/issues/69)) -- Adding support for timeout config ([#56](https://github.com/axios/axios/issues/56)) -- Removing es6-promise dependency -- Fixing issue preventing `length` to be used as a parameter ([#91](https://github.com/axios/axios/pull/91)) -- Fixing issue with IE8 ([#85](https://github.com/axios/axios/pull/85)) -- Converting build to UMD - -### 0.5.4 (Apr 08, 2015) - -- Fixing issue with FormData not being sent ([#53](https://github.com/axios/axios/issues/53)) - -### 0.5.3 (Apr 07, 2015) - -- Using JSON.parse unconditionally when transforming response string ([#55](https://github.com/axios/axios/issues/55)) - -### 0.5.2 (Mar 13, 2015) - -- Adding support for `statusText` in response ([#46](https://github.com/axios/axios/issues/46)) - -### 0.5.1 (Mar 10, 2015) - -- Fixing issue using strict mode ([#45](https://github.com/axios/axios/issues/45)) -- Fixing issue with standalone build ([#47](https://github.com/axios/axios/issues/47)) - -### 0.5.0 (Jan 23, 2015) - -- Adding support for intercepetors ([#14](https://github.com/axios/axios/issues/14)) -- Updating es6-promise dependency - -### 0.4.2 (Dec 10, 2014) - -- Fixing issue with `Content-Type` when using `FormData` ([#22](https://github.com/axios/axios/issues/22)) -- Adding support for TypeScript ([#25](https://github.com/axios/axios/issues/25)) -- Fixing issue with standalone build ([#29](https://github.com/axios/axios/issues/29)) -- Fixing issue with verbs needing to be capitalized in some browsers ([#30](https://github.com/axios/axios/issues/30)) - -### 0.4.1 (Oct 15, 2014) - -- Adding error handling to request for node.js ([#18](https://github.com/axios/axios/issues/18)) - -### 0.4.0 (Oct 03, 2014) - -- Adding support for `ArrayBuffer` and `ArrayBufferView` ([#10](https://github.com/axios/axios/issues/10)) -- Adding support for utf-8 for node.js ([#13](https://github.com/axios/axios/issues/13)) -- Adding support for SSL for node.js ([#12](https://github.com/axios/axios/issues/12)) -- Fixing incorrect `Content-Type` header ([#9](https://github.com/axios/axios/issues/9)) -- Adding standalone build without bundled es6-promise ([#11](https://github.com/axios/axios/issues/11)) -- Deprecating `success`/`error` in favor of `then`/`catch` - -### 0.3.1 (Sep 16, 2014) - -- Fixing missing post body when using node.js ([#3](https://github.com/axios/axios/issues/3)) - -### 0.3.0 (Sep 16, 2014) - -- Fixing `success` and `error` to properly receive response data as individual arguments ([#8](https://github.com/axios/axios/issues/8)) -- Updating `then` and `catch` to receive response data as a single object ([#6](https://github.com/axios/axios/issues/6)) -- Fixing issue with `all` not working ([#7](https://github.com/axios/axios/issues/7)) - -### 0.2.2 (Sep 14, 2014) - -- Fixing bundling with browserify ([#4](https://github.com/axios/axios/issues/4)) - -### 0.2.1 (Sep 12, 2014) - -- Fixing build problem causing ridiculous file sizes - -### 0.2.0 (Sep 12, 2014) - -- Adding support for `all` and `spread` -- Adding support for node.js ([#1](https://github.com/axios/axios/issues/1)) - -### 0.1.0 (Aug 29, 2014) - -- Initial release diff --git a/electron/src/node_modules/axios/LICENSE b/electron/src/node_modules/axios/LICENSE deleted file mode 100755 index d36c80e..0000000 --- a/electron/src/node_modules/axios/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014-present Matt Zabriskie - -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/electron/src/node_modules/axios/README.md b/electron/src/node_modules/axios/README.md deleted file mode 100755 index ec78817..0000000 --- a/electron/src/node_modules/axios/README.md +++ /dev/null @@ -1,625 +0,0 @@ -# axios - -[![npm version](https://img.shields.io/npm/v/axios.svg?style=flat-square)](https://www.npmjs.org/package/axios) -[![build status](https://img.shields.io/travis/axios/axios.svg?style=flat-square)](https://travis-ci.org/axios/axios) -[![code coverage](https://img.shields.io/coveralls/mzabriskie/axios.svg?style=flat-square)](https://coveralls.io/r/mzabriskie/axios) -[![npm downloads](https://img.shields.io/npm/dm/axios.svg?style=flat-square)](http://npm-stat.com/charts.html?package=axios) -[![gitter chat](https://img.shields.io/gitter/room/mzabriskie/axios.svg?style=flat-square)](https://gitter.im/mzabriskie/axios) -[![code helpers](https://www.codetriage.com/axios/axios/badges/users.svg)](https://www.codetriage.com/axios/axios) - -Promise based HTTP client for the browser and node.js - -## Features - -- Make [XMLHttpRequests](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) from the browser -- Make [http](http://nodejs.org/api/http.html) requests from node.js -- Supports the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) API -- Intercept request and response -- Transform request and response data -- Cancel requests -- Automatic transforms for JSON data -- Client side support for protecting against [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) - -## Browser Support - -![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png) | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png) | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png) | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png) | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png) | ![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png) | ---- | --- | --- | --- | --- | --- | -Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | Latest ✔ | 8+ ✔ | - -[![Browser Matrix](https://saucelabs.com/open_sauce/build_matrix/axios.svg)](https://saucelabs.com/u/axios) - -## Installing - -Using npm: - -```bash -$ npm install axios -``` - -Using bower: - -```bash -$ bower install axios -``` - -Using cdn: - -```html - -``` - -## Example - -Performing a `GET` request - -```js -// Make a request for a user with a given ID -axios.get('/user?ID=12345') - .then(function (response) { - console.log(response); - }) - .catch(function (error) { - console.log(error); - }); - -// Optionally the request above could also be done as -axios.get('/user', { - params: { - ID: 12345 - } - }) - .then(function (response) { - console.log(response); - }) - .catch(function (error) { - console.log(error); - }); -``` - -Performing a `POST` request - -```js -axios.post('/user', { - firstName: 'Fred', - lastName: 'Flintstone' - }) - .then(function (response) { - console.log(response); - }) - .catch(function (error) { - console.log(error); - }); -``` - -Performing multiple concurrent requests - -```js -function getUserAccount() { - return axios.get('/user/12345'); -} - -function getUserPermissions() { - return axios.get('/user/12345/permissions'); -} - -axios.all([getUserAccount(), getUserPermissions()]) - .then(axios.spread(function (acct, perms) { - // Both requests are now complete - })); -``` - -## axios API - -Requests can be made by passing the relevant config to `axios`. - -##### axios(config) - -```js -// Send a POST request -axios({ - method: 'post', - url: '/user/12345', - data: { - firstName: 'Fred', - lastName: 'Flintstone' - } -}); -``` - -```js -// GET request for remote image -axios({ - method:'get', - url:'http://bit.ly/2mTM3nY', - responseType:'stream' -}) - .then(function(response) { - response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) -}); -``` - -##### axios(url[, config]) - -```js -// Send a GET request (default method) -axios('/user/12345'); -``` - -### Request method aliases - -For convenience aliases have been provided for all supported request methods. - -##### axios.request(config) -##### axios.get(url[, config]) -##### axios.delete(url[, config]) -##### axios.head(url[, config]) -##### axios.options(url[, config]) -##### axios.post(url[, data[, config]]) -##### axios.put(url[, data[, config]]) -##### axios.patch(url[, data[, config]]) - -###### NOTE -When using the alias methods `url`, `method`, and `data` properties don't need to be specified in config. - -### Concurrency - -Helper functions for dealing with concurrent requests. - -##### axios.all(iterable) -##### axios.spread(callback) - -### Creating an instance - -You can create a new instance of axios with a custom config. - -##### axios.create([config]) - -```js -var instance = axios.create({ - baseURL: 'https://some-domain.com/api/', - timeout: 1000, - headers: {'X-Custom-Header': 'foobar'} -}); -``` - -### Instance methods - -The available instance methods are listed below. The specified config will be merged with the instance config. - -##### axios#request(config) -##### axios#get(url[, config]) -##### axios#delete(url[, config]) -##### axios#head(url[, config]) -##### axios#options(url[, config]) -##### axios#post(url[, data[, config]]) -##### axios#put(url[, data[, config]]) -##### axios#patch(url[, data[, config]]) - -## Request Config - -These are the available config options for making requests. Only the `url` is required. Requests will default to `GET` if `method` is not specified. - -```js -{ - // `url` is the server URL that will be used for the request - url: '/user', - - // `method` is the request method to be used when making the request - method: 'get', // default - - // `baseURL` will be prepended to `url` unless `url` is absolute. - // It can be convenient to set `baseURL` for an instance of axios to pass relative URLs - // to methods of that instance. - baseURL: 'https://some-domain.com/api/', - - // `transformRequest` allows changes to the request data before it is sent to the server - // This is only applicable for request methods 'PUT', 'POST', and 'PATCH' - // The last function in the array must return a string or an instance of Buffer, ArrayBuffer, - // FormData or Stream - // You may modify the headers object. - transformRequest: [function (data, headers) { - // Do whatever you want to transform the data - - return data; - }], - - // `transformResponse` allows changes to the response data to be made before - // it is passed to then/catch - transformResponse: [function (data) { - // Do whatever you want to transform the data - - return data; - }], - - // `headers` are custom headers to be sent - headers: {'X-Requested-With': 'XMLHttpRequest'}, - - // `params` are the URL parameters to be sent with the request - // Must be a plain object or a URLSearchParams object - params: { - ID: 12345 - }, - - // `paramsSerializer` is an optional function in charge of serializing `params` - // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) - paramsSerializer: function(params) { - return Qs.stringify(params, {arrayFormat: 'brackets'}) - }, - - // `data` is the data to be sent as the request body - // Only applicable for request methods 'PUT', 'POST', and 'PATCH' - // When no `transformRequest` is set, must be of one of the following types: - // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams - // - Browser only: FormData, File, Blob - // - Node only: Stream, Buffer - data: { - firstName: 'Fred' - }, - - // `timeout` specifies the number of milliseconds before the request times out. - // If the request takes longer than `timeout`, the request will be aborted. - timeout: 1000, - - // `withCredentials` indicates whether or not cross-site Access-Control requests - // should be made using credentials - withCredentials: false, // default - - // `adapter` allows custom handling of requests which makes testing easier. - // Return a promise and supply a valid response (see lib/adapters/README.md). - adapter: function (config) { - /* ... */ - }, - - // `auth` indicates that HTTP Basic auth should be used, and supplies credentials. - // This will set an `Authorization` header, overwriting any existing - // `Authorization` custom headers you have set using `headers`. - auth: { - username: 'janedoe', - password: 's00pers3cret' - }, - - // `responseType` indicates the type of data that the server will respond with - // options are 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream' - responseType: 'json', // default - - // `xsrfCookieName` is the name of the cookie to use as a value for xsrf token - xsrfCookieName: 'XSRF-TOKEN', // default - - // `xsrfHeaderName` is the name of the http header that carries the xsrf token value - xsrfHeaderName: 'X-XSRF-TOKEN', // default - - // `onUploadProgress` allows handling of progress events for uploads - onUploadProgress: function (progressEvent) { - // Do whatever you want with the native progress event - }, - - // `onDownloadProgress` allows handling of progress events for downloads - onDownloadProgress: function (progressEvent) { - // Do whatever you want with the native progress event - }, - - // `maxContentLength` defines the max size of the http response content allowed - maxContentLength: 2000, - - // `validateStatus` defines whether to resolve or reject the promise for a given - // HTTP response status code. If `validateStatus` returns `true` (or is set to `null` - // or `undefined`), the promise will be resolved; otherwise, the promise will be - // rejected. - validateStatus: function (status) { - return status >= 200 && status < 300; // default - }, - - // `maxRedirects` defines the maximum number of redirects to follow in node.js. - // If set to 0, no redirects will be followed. - maxRedirects: 5, // default - - // `socketPath` defines a UNIX Socket to be used in node.js. - // e.g. '/var/run/docker.sock' to send requests to the docker daemon. - // Only either `socketPath` or `proxy` can be specified. - // If both are specified, `socketPath` is used. - socketPath: null, // default - - // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http - // and https requests, respectively, in node.js. This allows options to be added like - // `keepAlive` that are not enabled by default. - httpAgent: new http.Agent({ keepAlive: true }), - httpsAgent: new https.Agent({ keepAlive: true }), - - // 'proxy' defines the hostname and port of the proxy server - // Use `false` to disable proxies, ignoring environment variables. - // `auth` indicates that HTTP Basic auth should be used to connect to the proxy, and - // supplies credentials. - // This will set an `Proxy-Authorization` header, overwriting any existing - // `Proxy-Authorization` custom headers you have set using `headers`. - proxy: { - host: '127.0.0.1', - port: 9000, - auth: { - username: 'mikeymike', - password: 'rapunz3l' - } - }, - - // `cancelToken` specifies a cancel token that can be used to cancel the request - // (see Cancellation section below for details) - cancelToken: new CancelToken(function (cancel) { - }) -} -``` - -## Response Schema - -The response for a request contains the following information. - -```js -{ - // `data` is the response that was provided by the server - data: {}, - - // `status` is the HTTP status code from the server response - status: 200, - - // `statusText` is the HTTP status message from the server response - statusText: 'OK', - - // `headers` the headers that the server responded with - // All header names are lower cased - headers: {}, - - // `config` is the config that was provided to `axios` for the request - config: {}, - - // `request` is the request that generated this response - // It is the last ClientRequest instance in node.js (in redirects) - // and an XMLHttpRequest instance the browser - request: {} -} -``` - -When using `then`, you will receive the response as follows: - -```js -axios.get('/user/12345') - .then(function(response) { - console.log(response.data); - console.log(response.status); - console.log(response.statusText); - console.log(response.headers); - console.log(response.config); - }); -``` - -When using `catch`, or passing a [rejection callback](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) as second parameter of `then`, the response will be available through the `error` object as explained in the [Handling Errors](#handling-errors) section. - -## Config Defaults - -You can specify config defaults that will be applied to every request. - -### Global axios defaults - -```js -axios.defaults.baseURL = 'https://api.example.com'; -axios.defaults.headers.common['Authorization'] = AUTH_TOKEN; -axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; -``` - -### Custom instance defaults - -```js -// Set config defaults when creating the instance -var instance = axios.create({ - baseURL: 'https://api.example.com' -}); - -// Alter defaults after instance has been created -instance.defaults.headers.common['Authorization'] = AUTH_TOKEN; -``` - -### Config order of precedence - -Config will be merged with an order of precedence. The order is library defaults found in [lib/defaults.js](https://github.com/axios/axios/blob/master/lib/defaults.js#L28), then `defaults` property of the instance, and finally `config` argument for the request. The latter will take precedence over the former. Here's an example. - -```js -// Create an instance using the config defaults provided by the library -// At this point the timeout config value is `0` as is the default for the library -var instance = axios.create(); - -// Override timeout default for the library -// Now all requests will wait 2.5 seconds before timing out -instance.defaults.timeout = 2500; - -// Override timeout for this request as it's known to take a long time -instance.get('/longRequest', { - timeout: 5000 -}); -``` - -## Interceptors - -You can intercept requests or responses before they are handled by `then` or `catch`. - -```js -// Add a request interceptor -axios.interceptors.request.use(function (config) { - // Do something before request is sent - return config; - }, function (error) { - // Do something with request error - return Promise.reject(error); - }); - -// Add a response interceptor -axios.interceptors.response.use(function (response) { - // Do something with response data - return response; - }, function (error) { - // Do something with response error - return Promise.reject(error); - }); -``` - -If you may need to remove an interceptor later you can. - -```js -var myInterceptor = axios.interceptors.request.use(function () {/*...*/}); -axios.interceptors.request.eject(myInterceptor); -``` - -You can add interceptors to a custom instance of axios. - -```js -var instance = axios.create(); -instance.interceptors.request.use(function () {/*...*/}); -``` - -## Handling Errors - -```js -axios.get('/user/12345') - .catch(function (error) { - if (error.response) { - // The request was made and the server responded with a status code - // that falls out of the range of 2xx - console.log(error.response.data); - console.log(error.response.status); - console.log(error.response.headers); - } else if (error.request) { - // The request was made but no response was received - // `error.request` is an instance of XMLHttpRequest in the browser and an instance of - // http.ClientRequest in node.js - console.log(error.request); - } else { - // Something happened in setting up the request that triggered an Error - console.log('Error', error.message); - } - console.log(error.config); - }); -``` - -You can define a custom HTTP status code error range using the `validateStatus` config option. - -```js -axios.get('/user/12345', { - validateStatus: function (status) { - return status < 500; // Reject only if the status code is greater than or equal to 500 - } -}) -``` - -## Cancellation - -You can cancel a request using a *cancel token*. - -> The axios cancel token API is based on the withdrawn [cancelable promises proposal](https://github.com/tc39/proposal-cancelable-promises). - -You can create a cancel token using the `CancelToken.source` factory as shown below: - -```js -var CancelToken = axios.CancelToken; -var source = CancelToken.source(); - -axios.get('/user/12345', { - cancelToken: source.token -}).catch(function(thrown) { - if (axios.isCancel(thrown)) { - console.log('Request canceled', thrown.message); - } else { - // handle error - } -}); - -axios.post('/user/12345', { - name: 'new name' -}, { - cancelToken: source.token -}) - -// cancel the request (the message parameter is optional) -source.cancel('Operation canceled by the user.'); -``` - -You can also create a cancel token by passing an executor function to the `CancelToken` constructor: - -```js -var CancelToken = axios.CancelToken; -var cancel; - -axios.get('/user/12345', { - cancelToken: new CancelToken(function executor(c) { - // An executor function receives a cancel function as a parameter - cancel = c; - }) -}); - -// cancel the request -cancel(); -``` - -> Note: you can cancel several requests with the same cancel token. - -## Using application/x-www-form-urlencoded format - -By default, axios serializes JavaScript objects to `JSON`. To send data in the `application/x-www-form-urlencoded` format instead, you can use one of the following options. - -### Browser - -In a browser, you can use the [`URLSearchParams`](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) API as follows: - -```js -var params = new URLSearchParams(); -params.append('param1', 'value1'); -params.append('param2', 'value2'); -axios.post('/foo', params); -``` - -> Note that `URLSearchParams` is not supported by all browsers (see [caniuse.com](http://www.caniuse.com/#feat=urlsearchparams)), but there is a [polyfill](https://github.com/WebReflection/url-search-params) available (make sure to polyfill the global environment). - -Alternatively, you can encode data using the [`qs`](https://github.com/ljharb/qs) library: - -```js -var qs = require('qs'); -axios.post('/foo', qs.stringify({ 'bar': 123 })); -``` - -### Node.js - -In node.js, you can use the [`querystring`](https://nodejs.org/api/querystring.html) module as follows: - -```js -var querystring = require('querystring'); -axios.post('http://something.com/', querystring.stringify({ foo: 'bar' })); -``` - -You can also use the [`qs`](https://github.com/ljharb/qs) library. - -## Semver - -Until axios reaches a `1.0` release, breaking changes will be released with a new minor version. For example `0.5.1`, and `0.5.4` will have the same API, but `0.6.0` will have breaking changes. - -## Promises - -axios depends on a native ES6 Promise implementation to be [supported](http://caniuse.com/promises). -If your environment doesn't support ES6 Promises, you can [polyfill](https://github.com/jakearchibald/es6-promise). - -## TypeScript -axios includes [TypeScript](http://typescriptlang.org) definitions. -```typescript -import axios from 'axios'; -axios.get('/user?ID=12345'); -``` - -## Resources - -* [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) -* [Upgrade Guide](https://github.com/axios/axios/blob/master/UPGRADE_GUIDE.md) -* [Ecosystem](https://github.com/axios/axios/blob/master/ECOSYSTEM.md) -* [Contributing Guide](https://github.com/axios/axios/blob/master/CONTRIBUTING.md) -* [Code of Conduct](https://github.com/axios/axios/blob/master/CODE_OF_CONDUCT.md) - -## Credits - -axios is heavily inspired by the [$http service](https://docs.angularjs.org/api/ng/service/$http) provided in [Angular](https://angularjs.org/). Ultimately axios is an effort to provide a standalone `$http`-like service for use outside of Angular. - -## License - -MIT diff --git a/electron/src/node_modules/axios/UPGRADE_GUIDE.md b/electron/src/node_modules/axios/UPGRADE_GUIDE.md deleted file mode 100755 index eedb049..0000000 --- a/electron/src/node_modules/axios/UPGRADE_GUIDE.md +++ /dev/null @@ -1,162 +0,0 @@ -# Upgrade Guide - -### 0.15.x -> 0.16.0 - -#### `Promise` Type Declarations - -The `Promise` type declarations have been removed from the axios typings in favor of the built-in type declarations. If you use axios in a TypeScript project that targets `ES5`, please make sure to include the `es2015.promise` lib. Please see [this post](https://blog.mariusschulz.com/2016/11/25/typescript-2-0-built-in-type-declarations) for details. - -### 0.13.x -> 0.14.0 - -#### TypeScript Definitions - -The axios TypeScript definitions have been updated to match the axios API and use the ES2015 module syntax. - -Please use the following `import` statement to import axios in TypeScript: - -```typescript -import axios from 'axios'; - -axios.get('/foo') - .then(response => console.log(response)) - .catch(error => console.log(error)); -``` - -#### `agent` Config Option - -The `agent` config option has been replaced with two new options: `httpAgent` and `httpsAgent`. Please use them instead. - -```js -{ - // Define a custom agent for HTTP - httpAgent: new http.Agent({ keepAlive: true }), - // Define a custom agent for HTTPS - httpsAgent: new https.Agent({ keepAlive: true }) -} -``` - -#### `progress` Config Option - -The `progress` config option has been replaced with the `onUploadProgress` and `onDownloadProgress` options. - -```js -{ - // Define a handler for upload progress events - onUploadProgress: function (progressEvent) { - // ... - }, - - // Define a handler for download progress events - onDownloadProgress: function (progressEvent) { - // ... - } -} -``` - -### 0.12.x -> 0.13.0 - -The `0.13.0` release contains several changes to custom adapters and error handling. - -#### Error Handling - -Previous to this release an error could either be a server response with bad status code or an actual `Error`. With this release Promise will always reject with an `Error`. In the case that a response was received, the `Error` will also include the response. - -```js -axios.get('/user/12345') - .catch((error) => { - console.log(error.message); - console.log(error.code); // Not always specified - console.log(error.config); // The config that was used to make the request - console.log(error.response); // Only available if response was received from the server - }); -``` - -#### Request Adapters - -This release changes a few things about how request adapters work. Please take note if you are using your own custom adapter. - -1. Response transformer is now called outside of adapter. -2. Request adapter returns a `Promise`. - -This means that you no longer need to invoke `transformData` on response data. You will also no longer receive `resolve` and `reject` as arguments in your adapter. - -Previous code: - -```js -function myAdapter(resolve, reject, config) { - var response = { - data: transformData( - responseData, - responseHeaders, - config.transformResponse - ), - status: request.status, - statusText: request.statusText, - headers: responseHeaders - }; - settle(resolve, reject, response); -} -``` - -New code: - -```js -function myAdapter(config) { - return new Promise(function (resolve, reject) { - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders - }; - settle(resolve, reject, response); - }); -} -``` - -See the related commits for more details: -- [Response transformers](https://github.com/axios/axios/commit/10eb23865101f9347570552c04e9d6211376e25e) -- [Request adapter Promise](https://github.com/axios/axios/commit/157efd5615890301824e3121cc6c9d2f9b21f94a) - -### 0.5.x -> 0.6.0 - -The `0.6.0` release contains mostly bug fixes, but there are a couple things to be aware of when upgrading. - -#### ES6 Promise Polyfill - -Up until the `0.6.0` release ES6 `Promise` was being polyfilled using [es6-promise](https://github.com/jakearchibald/es6-promise). With this release, the polyfill has been removed, and you will need to supply it yourself if your environment needs it. - -```js -require('es6-promise').polyfill(); -var axios = require('axios'); -``` - -This will polyfill the global environment, and only needs to be done once. - -#### `axios.success`/`axios.error` - -The `success`, and `error` aliases were deprectated in [0.4.0](https://github.com/axios/axios/blob/master/CHANGELOG.md#040-oct-03-2014). As of this release they have been removed entirely. Instead please use `axios.then`, and `axios.catch` respectively. - -```js -axios.get('some/url') - .then(function (res) { - /* ... */ - }) - .catch(function (err) { - /* ... */ - }); -``` - -#### UMD - -Previous versions of axios shipped with an AMD, CommonJS, and Global build. This has all been rolled into a single UMD build. - -```js -// AMD -require(['bower_components/axios/dist/axios'], function (axios) { - /* ... */ -}); - -// CommonJS -var axios = require('axios/dist/axios'); -``` diff --git a/electron/src/node_modules/axios/dist/axios.js b/electron/src/node_modules/axios/dist/axios.js deleted file mode 100755 index cf8b39d..0000000 --- a/electron/src/node_modules/axios/dist/axios.js +++ /dev/null @@ -1,1603 +0,0 @@ -/* axios v0.18.0 | (c) 2018 by Matt Zabriskie */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["axios"] = factory(); - else - root["axios"] = factory(); -})(this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - - module.exports = __webpack_require__(1); - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - var bind = __webpack_require__(3); - var Axios = __webpack_require__(5); - var defaults = __webpack_require__(6); - - /** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ - function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; - } - - // Create the default instance to be exported - var axios = createInstance(defaults); - - // Expose Axios class to allow class inheritance - axios.Axios = Axios; - - // Factory for creating new instances - axios.create = function create(instanceConfig) { - return createInstance(utils.merge(defaults, instanceConfig)); - }; - - // Expose Cancel & CancelToken - axios.Cancel = __webpack_require__(23); - axios.CancelToken = __webpack_require__(24); - axios.isCancel = __webpack_require__(20); - - // Expose all/spread - axios.all = function all(promises) { - return Promise.all(promises); - }; - axios.spread = __webpack_require__(25); - - module.exports = axios; - - // Allow use of default import syntax in TypeScript - module.exports.default = axios; - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var bind = __webpack_require__(3); - var isBuffer = __webpack_require__(4); - - /*global toString:true*/ - - // utils is a library of generic helper functions non-specific to axios - - var toString = Object.prototype.toString; - - /** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ - function isArray(val) { - return toString.call(val) === '[object Array]'; - } - - /** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ - function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; - } - - /** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ - function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); - } - - /** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ - function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; - } - - /** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ - function isString(val) { - return typeof val === 'string'; - } - - /** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ - function isNumber(val) { - return typeof val === 'number'; - } - - /** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ - function isUndefined(val) { - return typeof val === 'undefined'; - } - - /** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ - function isObject(val) { - return val !== null && typeof val === 'object'; - } - - /** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ - function isDate(val) { - return toString.call(val) === '[object Date]'; - } - - /** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ - function isFile(val) { - return toString.call(val) === '[object File]'; - } - - /** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ - function isBlob(val) { - return toString.call(val) === '[object Blob]'; - } - - /** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ - function isFunction(val) { - return toString.call(val) === '[object Function]'; - } - - /** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ - function isStream(val) { - return isObject(val) && isFunction(val.pipe); - } - - /** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ - function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; - } - - /** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ - function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); - } - - /** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - */ - function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); - } - - /** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ - function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } - } - - /** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ - function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = merge(result[key], val); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; - } - - /** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ - function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; - } - - module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim - }; - - -/***/ }), -/* 3 */ -/***/ (function(module, exports) { - - 'use strict'; - - module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; - }; - - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - - /*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ - - // The _isBuffer check is for Safari 5-7 support, because it's missing - // Object.prototype.constructor. Remove this eventually - module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) - } - - function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) - } - - // For Node v0.10 support. Remove this eventually. - function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) - } - - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var defaults = __webpack_require__(6); - var utils = __webpack_require__(2); - var InterceptorManager = __webpack_require__(17); - var dispatchRequest = __webpack_require__(18); - - /** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ - function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; - } - - /** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ - Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = utils.merge({ - url: arguments[0] - }, arguments[1]); - } - - config = utils.merge(defaults, {method: 'get'}, this.defaults, config); - config.method = config.method.toLowerCase(); - - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); - - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); - - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; - }; - - // Provide aliases for supported request methods - utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url - })); - }; - }); - - utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; - }); - - module.exports = Axios; - - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - var normalizeHeaderName = __webpack_require__(7); - - var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' - }; - - function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } - } - - function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = __webpack_require__(8); - } else if (typeof process !== 'undefined') { - // For node use HTTP adapter - adapter = __webpack_require__(8); - } - return adapter; - } - - var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } - } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } - }; - - defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } - }; - - utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; - }); - - utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); - }); - - module.exports = defaults; - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); - }; - - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - var settle = __webpack_require__(9); - var buildURL = __webpack_require__(12); - var parseHeaders = __webpack_require__(13); - var isURLSameOrigin = __webpack_require__(14); - var createError = __webpack_require__(10); - var btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(15); - - module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - var loadEvent = 'onreadystatechange'; - var xDomain = false; - - // For IE 8/9 CORS support - // Only supports POST and GET calls and doesn't returns the response headers. - // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest. - if (("production") !== 'test' && - typeof window !== 'undefined' && - window.XDomainRequest && !('withCredentials' in request) && - !isURLSameOrigin(config.url)) { - request = new window.XDomainRequest(); - loadEvent = 'onload'; - xDomain = true; - request.onprogress = function handleProgress() {}; - request.ontimeout = function handleTimeout() {}; - } - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - // Listen for ready state - request[loadEvent] = function handleLoad() { - if (!request || (request.readyState !== 4 && !xDomain)) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201) - status: request.status === 1223 ? 204 : request.status, - statusText: request.status === 1223 ? 'No Content' : request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - var cookies = __webpack_require__(16); - - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (config.withCredentials) { - request.withCredentials = true; - } - - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (requestData === undefined) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); - }; - - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var createError = __webpack_require__(10); - - /** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ - module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - // Note: status is not exposed by XDomainRequest - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } - }; - - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var enhanceError = __webpack_require__(11); - - /** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ - module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); - }; - - -/***/ }), -/* 11 */ -/***/ (function(module, exports) { - - 'use strict'; - - /** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ - module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - error.request = request; - error.response = response; - return error; - }; - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - function encode(val) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); - } - - /** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ - module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; - }; - - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - // Headers whose duplicates are ignored by node - // c.f. https://nodejs.org/api/http.html#http_message_headers - var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' - ]; - - /** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ - module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; - }; - - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() - ); - - -/***/ }), -/* 15 */ -/***/ (function(module, exports) { - - 'use strict'; - - // btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js - - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - function E() { - this.message = 'String contains an invalid character'; - } - E.prototype = new Error; - E.prototype.code = 5; - E.prototype.name = 'InvalidCharacterError'; - - function btoa(input) { - var str = String(input); - var output = ''; - for ( - // initialize result and counter - var block, charCode, idx = 0, map = chars; - // if the next str index does not exist: - // change the mapping table to "=" - // check if d has no fractional digits - str.charAt(idx | 0) || (map = '=', idx % 1); - // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 - output += map.charAt(63 & block >> 8 - idx % 1 * 8) - ) { - charCode = str.charCodeAt(idx += 3 / 4); - if (charCode > 0xFF) { - throw new E(); - } - block = block << 8 | charCode; - } - return output; - } - - module.exports = btoa; - - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() - ); - - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - function InterceptorManager() { - this.handlers = []; - } - - /** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ - InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; - }; - - /** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ - InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } - }; - - /** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ - InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); - }; - - module.exports = InterceptorManager; - - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - var transformData = __webpack_require__(19); - var isCancel = __webpack_require__(20); - var defaults = __webpack_require__(6); - var isAbsoluteURL = __webpack_require__(21); - var combineURLs = __webpack_require__(22); - - /** - * Throws a `Cancel` if cancellation has been requested. - */ - function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } - } - - /** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ - module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Support baseURL config - if (config.baseURL && !isAbsoluteURL(config.url)) { - config.url = combineURLs(config.baseURL, config.url); - } - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers || {} - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); - }; - - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var utils = __webpack_require__(2); - - /** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ - module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; - }; - - -/***/ }), -/* 20 */ -/***/ (function(module, exports) { - - 'use strict'; - - module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); - }; - - -/***/ }), -/* 21 */ -/***/ (function(module, exports) { - - 'use strict'; - - /** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ - module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); - }; - - -/***/ }), -/* 22 */ -/***/ (function(module, exports) { - - 'use strict'; - - /** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ - module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; - }; - - -/***/ }), -/* 23 */ -/***/ (function(module, exports) { - - 'use strict'; - - /** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ - function Cancel(message) { - this.message = message; - } - - Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); - }; - - Cancel.prototype.__CANCEL__ = true; - - module.exports = Cancel; - - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - - 'use strict'; - - var Cancel = __webpack_require__(23); - - /** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ - function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel(message); - resolvePromise(token.reason); - }); - } - - /** - * Throws a `Cancel` if cancellation has been requested. - */ - CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } - }; - - /** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ - CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; - }; - - module.exports = CancelToken; - - -/***/ }), -/* 25 */ -/***/ (function(module, exports) { - - 'use strict'; - - /** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ - module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; - }; - - -/***/ }) -/******/ ]) -}); -; -//# sourceMappingURL=axios.map \ No newline at end of file diff --git a/electron/src/node_modules/axios/dist/axios.map b/electron/src/node_modules/axios/dist/axios.map deleted file mode 100755 index 6b76578..0000000 --- a/electron/src/node_modules/axios/dist/axios.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 48f4719183d3ec9e4379","webpack:///./index.js","webpack:///./lib/axios.js","webpack:///./lib/utils.js","webpack:///./lib/helpers/bind.js","webpack:///./~/is-buffer/index.js","webpack:///./lib/core/Axios.js","webpack:///./lib/defaults.js","webpack:///./lib/helpers/normalizeHeaderName.js","webpack:///./lib/adapters/xhr.js","webpack:///./lib/core/settle.js","webpack:///./lib/core/createError.js","webpack:///./lib/core/enhanceError.js","webpack:///./lib/helpers/buildURL.js","webpack:///./lib/helpers/parseHeaders.js","webpack:///./lib/helpers/isURLSameOrigin.js","webpack:///./lib/helpers/btoa.js","webpack:///./lib/helpers/cookies.js","webpack:///./lib/core/InterceptorManager.js","webpack:///./lib/core/dispatchRequest.js","webpack:///./lib/core/transformData.js","webpack:///./lib/cancel/isCancel.js","webpack:///./lib/helpers/isAbsoluteURL.js","webpack:///./lib/helpers/combineURLs.js","webpack:///./lib/cancel/Cancel.js","webpack:///./lib/cancel/CancelToken.js","webpack:///./lib/helpers/spread.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA,yC;;;;;;ACAA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,aAAY,MAAM;AAClB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;;;;;;ACnDA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,aAAa;AACxB,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oCAAmC,OAAO;AAC1C;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAuB,SAAS,GAAG,SAAS;AAC5C,4BAA2B;AAC3B;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA,wCAAuC,OAAO;AAC9C;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC9SA;;AAEA;AACA;AACA;AACA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;AACA;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;ACpBA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA,mCAAkC,cAAc;AAChD;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAgD;AAChD;AACA;AACA,MAAK;AACL;AACA,EAAC;;AAED;AACA;AACA;AACA,iDAAgD;AAChD;AACA;AACA;AACA,MAAK;AACL;AACA,EAAC;;AAED;;;;;;;AC9EA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAwE;AACxE;AACA;AACA;AACA,wDAAuD;AACvD;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,QAAO,YAAY;AACnB;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,EAAC;;AAED;AACA;AACA,EAAC;;AAED;;;;;;;AC/FA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;;;;;;ACXA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,6CAA4C;AAC5C;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;;;;;;ACnLA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACzBA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;;;;;;;ACjBA;;AAEA;AACA;AACA;AACA,YAAW,MAAM;AACjB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,MAAM;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACpBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;AACH;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA,QAAO;AACP,MAAK;;AAEL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;;;;;;ACjEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;AAEA,kBAAiB,eAAe;;AAEhC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA;AACA,IAAG;;AAEH;AACA;;;;;;;ACpDA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAc,OAAO;AACrB,iBAAgB;AAChB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,eAAc,OAAO;AACrB,iBAAgB,QAAQ;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;;;;;;ACnEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACnCA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,yCAAwC;AACxC,QAAO;;AAEP;AACA,2DAA0D,wBAAwB;AAClF;AACA,QAAO;;AAEP;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA,iCAAgC;AAChC,8BAA6B,aAAa,EAAE;AAC5C;AACA;AACA,IAAG;AACH;;;;;;;ACpDA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,SAAS;AACpB,YAAW,SAAS;AACpB;AACA,aAAY,OAAO;AACnB;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;;AAEA;;;;;;;ACnDA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gCAA+B;AAC/B,wCAAuC;AACvC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,IAAG;AACH;;;;;;;ACrFA;;AAEA;;AAEA;AACA;AACA;AACA,YAAW,cAAc;AACzB,YAAW,MAAM;AACjB,YAAW,eAAe;AAC1B,cAAa,EAAE;AACf;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;;;;;;;ACnBA;;AAEA;AACA;AACA;;;;;;;ACJA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,cAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;AAEA;AACA;AACA;AACA,YAAW,OAAO;AAClB,YAAW,OAAO;AAClB,cAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;AACA;;;;;;;ACbA;;AAEA;AACA;AACA;AACA;AACA,YAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;;;;;;AClBA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,YAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA;AACA;AACA;;AAEA;;;;;;;ACxDA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gCAA+B;AAC/B;AACA;AACA,YAAW,SAAS;AACpB,cAAa;AACb;AACA;AACA;AACA;AACA;AACA","file":"axios.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"axios\"] = factory();\n\telse\n\t\troot[\"axios\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 48f4719183d3ec9e4379","module.exports = require('./lib/axios');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./index.js\n// module id = 0\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/axios.js\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar bind = require('./helpers/bind');\nvar isBuffer = require('is-buffer');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/utils.js\n// module id = 2\n// module chunks = 0","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/bind.js\n// module id = 3\n// module chunks = 0","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/is-buffer/index.js\n// module id = 4\n// module chunks = 0","'use strict';\n\nvar defaults = require('./../defaults');\nvar utils = require('./../utils');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/Axios.js\n// module id = 5\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/defaults.js\n// module id = 6\n// module chunks = 0","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/normalizeHeaderName.js\n// module id = 7\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false;\n\n // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n if (process.env.NODE_ENV !== 'test' &&\n typeof window !== 'undefined' &&\n window.XDomainRequest && !('withCredentials' in request) &&\n !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n request.onprogress = function handleProgress() {};\n request.ontimeout = function handleTimeout() {};\n }\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request[loadEvent] = function handleLoad() {\n if (!request || (request.readyState !== 4 && !xDomain)) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/adapters/xhr.js\n// module id = 8\n// module chunks = 0","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/settle.js\n// module id = 9\n// module chunks = 0","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/createError.js\n// module id = 10\n// module chunks = 0","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/enhanceError.js\n// module id = 11\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/buildURL.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/parseHeaders.js\n// module id = 13\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/isURLSameOrigin.js\n// module id = 14\n// module chunks = 0","'use strict';\n\n// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\nE.prototype = new Error;\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw new E();\n }\n block = block << 8 | charCode;\n }\n return output;\n}\n\nmodule.exports = btoa;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/btoa.js\n// module id = 15\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/cookies.js\n// module id = 16\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/InterceptorManager.js\n// module id = 17\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar isAbsoluteURL = require('./../helpers/isAbsoluteURL');\nvar combineURLs = require('./../helpers/combineURLs');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/dispatchRequest.js\n// module id = 18\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/transformData.js\n// module id = 19\n// module chunks = 0","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/isCancel.js\n// module id = 20\n// module chunks = 0","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/isAbsoluteURL.js\n// module id = 21\n// module chunks = 0","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/combineURLs.js\n// module id = 22\n// module chunks = 0","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/Cancel.js\n// module id = 23\n// module chunks = 0","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/CancelToken.js\n// module id = 24\n// module chunks = 0","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/spread.js\n// module id = 25\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/electron/src/node_modules/axios/dist/axios.min.js b/electron/src/node_modules/axios/dist/axios.min.js deleted file mode 100755 index 69cc188..0000000 --- a/electron/src/node_modules/axios/dist/axios.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* axios v0.18.0 | (c) 2018 by Matt Zabriskie */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(5),u=n(6),a=r(u);a.Axios=s,a.create=function(e){return r(o.merge(u,e))},a.Cancel=n(23),a.CancelToken=n(24),a.isCancel=n(20),a.all=function(e){return Promise.all(e)},a.spread=n(25),e.exports=a,e.exports.default=a},function(e,t,n){"use strict";function r(e){return"[object Array]"===R.call(e)}function o(e){return"[object ArrayBuffer]"===R.call(e)}function i(e){return"undefined"!=typeof FormData&&e instanceof FormData}function s(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function u(e){return"string"==typeof e}function a(e){return"number"==typeof e}function c(e){return"undefined"==typeof e}function f(e){return null!==e&&"object"==typeof e}function p(e){return"[object Date]"===R.call(e)}function d(e){return"[object File]"===R.call(e)}function l(e){return"[object Blob]"===R.call(e)}function h(e){return"[object Function]"===R.call(e)}function m(e){return f(e)&&h(e.pipe)}function y(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function w(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function g(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function v(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n - * @license MIT - */ -e.exports=function(e){return null!=e&&(n(e)||r(e)||!!e._isBuffer)}},function(e,t,n){"use strict";function r(e){this.defaults=e,this.interceptors={request:new s,response:new s}}var o=n(6),i=n(2),s=n(17),u=n(18);r.prototype.request=function(e){"string"==typeof e&&(e=i.merge({url:arguments[0]},arguments[1])),e=i.merge(o,{method:"get"},this.defaults,e),e.method=e.method.toLowerCase();var t=[u,void 0],n=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){t.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){t.push(e.fulfilled,e.rejected)});t.length;)n=n.then(t.shift(),t.shift());return n},i.forEach(["delete","get","head","options"],function(e){r.prototype[e]=function(t,n){return this.request(i.merge(n||{},{method:e,url:t}))}}),i.forEach(["post","put","patch"],function(e){r.prototype[e]=function(t,n,r){return this.request(i.merge(r||{},{method:e,url:t,data:n}))}}),e.exports=r},function(e,t,n){"use strict";function r(e,t){!i.isUndefined(e)&&i.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}function o(){var e;return"undefined"!=typeof XMLHttpRequest?e=n(8):"undefined"!=typeof process&&(e=n(8)),e}var i=n(2),s=n(7),u={"Content-Type":"application/x-www-form-urlencoded"},a={adapter:o(),transformRequest:[function(e,t){return s(t,"Content-Type"),i.isFormData(e)||i.isArrayBuffer(e)||i.isBuffer(e)||i.isStream(e)||i.isFile(e)||i.isBlob(e)?e:i.isArrayBufferView(e)?e.buffer:i.isURLSearchParams(e)?(r(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):i.isObject(e)?(r(t,"application/json;charset=utf-8"),JSON.stringify(e)):e}],transformResponse:[function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,validateStatus:function(e){return e>=200&&e<300}};a.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){a.headers[e]={}}),i.forEach(["post","put","patch"],function(e){a.headers[e]=i.merge(u)}),e.exports=a},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(9),i=n(12),s=n(13),u=n(14),a=n(10),c="undefined"!=typeof window&&window.btoa&&window.btoa.bind(window)||n(15);e.exports=function(e){return new Promise(function(t,f){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest,h="onreadystatechange",m=!1;if("undefined"==typeof window||!window.XDomainRequest||"withCredentials"in l||u(e.url)||(l=new window.XDomainRequest,h="onload",m=!0,l.onprogress=function(){},l.ontimeout=function(){}),e.auth){var y=e.auth.username||"",w=e.auth.password||"";d.Authorization="Basic "+c(y+":"+w)}if(l.open(e.method.toUpperCase(),i(e.url,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l[h]=function(){if(l&&(4===l.readyState||m)&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in l?s(l.getAllResponseHeaders()):null,r=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:r,status:1223===l.status?204:l.status,statusText:1223===l.status?"No Content":l.statusText,headers:n,config:e,request:l};o(t,f,i),l=null}},l.onerror=function(){f(a("Network Error",e,null,l)),l=null},l.ontimeout=function(){f(a("timeout of "+e.timeout+"ms exceeded",e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=n(16),v=(e.withCredentials||u(e.url))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;v&&(d[e.xsrfHeaderName]=v)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),e.withCredentials&&(l.withCredentials=!0),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),f(e),l=null)}),void 0===p&&(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(10);e.exports=function(e,t,n){var o=n.config.validateStatus;n.status&&o&&!o(n.status)?t(r("Request failed with status code "+n.status,n.config,null,n.request,n)):e(n)}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e}},function(e,t,n){"use strict";function r(e){return encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var o=n(2);e.exports=function(e,t,n){if(!t)return e;var i;if(n)i=n(t);else if(o.isURLSearchParams(t))i=t.toString();else{var s=[];o.forEach(t,function(e,t){null!==e&&"undefined"!=typeof e&&(o.isArray(e)?t+="[]":e=[e],o.forEach(e,function(e){o.isDate(e)?e=e.toISOString():o.isObject(e)&&(e=JSON.stringify(e)),s.push(r(t)+"="+r(e))}))}),i=s.join("&")}return i&&(e+=(e.indexOf("?")===-1?"?":"&")+i),e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t){"use strict";function n(){this.message="String contains an invalid character"}function r(e){for(var t,r,i=String(e),s="",u=0,a=o;i.charAt(0|u)||(a="=",u%1);s+=a.charAt(63&t>>8-u%1*8)){if(r=i.charCodeAt(u+=.75),r>255)throw new n;t=t<<8|r}return s}var o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";n.prototype=new Error,n.prototype.code=5,n.prototype.name="InvalidCharacterError",e.exports=r},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var u=[];u.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&u.push("expires="+new Date(n).toGMTString()),r.isString(o)&&u.push("path="+o),r.isString(i)&&u.push("domain="+i),s===!0&&u.push("secure"),document.cookie=u.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";function r(){this.handlers=[]}var o=n(2);r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(e){o.forEach(this.handlers,function(t){null!==t&&e(t)})},e.exports=r},function(e,t,n){"use strict";function r(e){e.cancelToken&&e.cancelToken.throwIfRequested()}var o=n(2),i=n(19),s=n(20),u=n(6),a=n(21),c=n(22);e.exports=function(e){r(e),e.baseURL&&!a(e.url)&&(e.url=c(e.baseURL,e.url)),e.headers=e.headers||{},e.data=i(e.data,e.headers,e.transformRequest),e.headers=o.merge(e.headers.common||{},e.headers[e.method]||{},e.headers||{}),o.forEach(["delete","get","head","post","put","patch","common"],function(t){delete e.headers[t]});var t=e.adapter||u.adapter;return t(e).then(function(t){return r(e),t.data=i(t.data,t.headers,e.transformResponse),t},function(t){return s(t)||(r(e),t&&t.response&&(t.response.data=i(t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)})}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t,n){return r.forEach(n,function(n){e=n(e,t)}),e}},function(e,t){"use strict";e.exports=function(e){return!(!e||!e.__CANCEL__)}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); -//# sourceMappingURL=axios.min.map \ No newline at end of file diff --git a/electron/src/node_modules/axios/dist/axios.min.map b/electron/src/node_modules/axios/dist/axios.min.map deleted file mode 100755 index f7fdd44..0000000 --- a/electron/src/node_modules/axios/dist/axios.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///axios.min.js","webpack:///webpack/bootstrap dad8263224c86c166a30","webpack:///./index.js","webpack:///./lib/axios.js","webpack:///./lib/utils.js","webpack:///./lib/helpers/bind.js","webpack:///./~/is-buffer/index.js","webpack:///./lib/core/Axios.js","webpack:///./lib/defaults.js","webpack:///./lib/helpers/normalizeHeaderName.js","webpack:///./lib/adapters/xhr.js","webpack:///./lib/core/settle.js","webpack:///./lib/core/createError.js","webpack:///./lib/core/enhanceError.js","webpack:///./lib/helpers/buildURL.js","webpack:///./lib/helpers/parseHeaders.js","webpack:///./lib/helpers/isURLSameOrigin.js","webpack:///./lib/helpers/btoa.js","webpack:///./lib/helpers/cookies.js","webpack:///./lib/core/InterceptorManager.js","webpack:///./lib/core/dispatchRequest.js","webpack:///./lib/core/transformData.js","webpack:///./lib/cancel/isCancel.js","webpack:///./lib/helpers/isAbsoluteURL.js","webpack:///./lib/helpers/combineURLs.js","webpack:///./lib/cancel/Cancel.js","webpack:///./lib/cancel/CancelToken.js","webpack:///./lib/helpers/spread.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","createInstance","defaultConfig","context","Axios","instance","bind","prototype","request","utils","extend","defaults","axios","create","instanceConfig","merge","Cancel","CancelToken","isCancel","all","promises","Promise","spread","default","isArray","val","toString","isArrayBuffer","isFormData","FormData","isArrayBufferView","result","ArrayBuffer","isView","buffer","isString","isNumber","isUndefined","isObject","isDate","isFile","isBlob","isFunction","isStream","pipe","isURLSearchParams","URLSearchParams","trim","str","replace","isStandardBrowserEnv","navigator","product","window","document","forEach","obj","fn","i","l","length","key","Object","hasOwnProperty","assignValue","arguments","a","b","thisArg","isBuffer","args","Array","apply","constructor","isSlowBuffer","readFloatLE","slice","_isBuffer","interceptors","InterceptorManager","response","dispatchRequest","config","url","method","toLowerCase","chain","undefined","promise","resolve","interceptor","unshift","fulfilled","rejected","push","then","shift","data","setContentTypeIfUnset","headers","value","getDefaultAdapter","adapter","XMLHttpRequest","process","normalizeHeaderName","DEFAULT_CONTENT_TYPE","Content-Type","transformRequest","JSON","stringify","transformResponse","parse","e","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","validateStatus","status","common","Accept","normalizedName","name","toUpperCase","settle","buildURL","parseHeaders","isURLSameOrigin","createError","btoa","reject","requestData","requestHeaders","loadEvent","xDomain","XDomainRequest","onprogress","ontimeout","auth","username","password","Authorization","open","params","paramsSerializer","readyState","responseURL","indexOf","responseHeaders","getAllResponseHeaders","responseData","responseType","responseText","statusText","onerror","cookies","xsrfValue","withCredentials","read","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancelToken","cancel","abort","send","enhanceError","message","code","error","Error","encode","encodeURIComponent","serializedParams","parts","v","toISOString","join","ignoreDuplicateOf","parsed","split","line","substr","concat","resolveURL","href","msie","urlParsingNode","setAttribute","protocol","host","search","hash","hostname","port","pathname","charAt","originURL","test","userAgent","createElement","location","requestURL","E","input","block","charCode","String","output","idx","map","chars","charCodeAt","write","expires","path","domain","secure","cookie","Date","toGMTString","match","RegExp","decodeURIComponent","remove","now","handlers","use","eject","h","throwIfCancellationRequested","throwIfRequested","transformData","isAbsoluteURL","combineURLs","baseURL","reason","fns","__CANCEL__","relativeURL","executor","TypeError","resolvePromise","token","source","callback","arr"],"mappings":"CAAA,SAAAA,EAAAC,GACA,gBAAAC,UAAA,gBAAAC,QACAA,OAAAD,QAAAD,IACA,kBAAAG,gBAAAC,IACAD,UAAAH,GACA,gBAAAC,SACAA,QAAA,MAAAD,IAEAD,EAAA,MAAAC,KACCK,KAAA,WACD,MCAgB,UAAUC,GCN1B,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAP,OAGA,IAAAC,GAAAO,EAAAD,IACAP,WACAS,GAAAF,EACAG,QAAA,EAUA,OANAL,GAAAE,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAS,QAAA,EAGAT,EAAAD,QAvBA,GAAAQ,KAqCA,OATAF,GAAAM,EAAAP,EAGAC,EAAAO,EAAAL,EAGAF,EAAAQ,EAAA,GAGAR,EAAA,KDgBM,SAAUL,EAAQD,EAASM,GEtDjCL,EAAAD,QAAAM,EAAA,IF4DM,SAAUL,EAAQD,EAASM,GG5DjC,YAaA,SAAAS,GAAAC,GACA,GAAAC,GAAA,GAAAC,GAAAF,GACAG,EAAAC,EAAAF,EAAAG,UAAAC,QAAAL,EAQA,OALAM,GAAAC,OAAAL,EAAAD,EAAAG,UAAAJ,GAGAM,EAAAC,OAAAL,EAAAF,GAEAE,EArBA,GAAAI,GAAAjB,EAAA,GACAc,EAAAd,EAAA,GACAY,EAAAZ,EAAA,GACAmB,EAAAnB,EAAA,GAsBAoB,EAAAX,EAAAU,EAGAC,GAAAR,QAGAQ,EAAAC,OAAA,SAAAC,GACA,MAAAb,GAAAQ,EAAAM,MAAAJ,EAAAG,KAIAF,EAAAI,OAAAxB,EAAA,IACAoB,EAAAK,YAAAzB,EAAA,IACAoB,EAAAM,SAAA1B,EAAA,IAGAoB,EAAAO,IAAA,SAAAC,GACA,MAAAC,SAAAF,IAAAC,IAEAR,EAAAU,OAAA9B,EAAA,IAEAL,EAAAD,QAAA0B,EAGAzB,EAAAD,QAAAqC,QAAAX,GHmEM,SAAUzB,EAAQD,EAASM,GItHjC,YAiBA,SAAAgC,GAAAC,GACA,yBAAAC,EAAA7B,KAAA4B,GASA,QAAAE,GAAAF,GACA,+BAAAC,EAAA7B,KAAA4B,GASA,QAAAG,GAAAH,GACA,yBAAAI,WAAAJ,YAAAI,UASA,QAAAC,GAAAL,GACA,GAAAM,EAMA,OAJAA,GADA,mBAAAC,0BAAA,OACAA,YAAAC,OAAAR,GAEA,GAAAA,EAAA,QAAAA,EAAAS,iBAAAF,aAWA,QAAAG,GAAAV,GACA,sBAAAA,GASA,QAAAW,GAAAX,GACA,sBAAAA,GASA,QAAAY,GAAAZ,GACA,yBAAAA,GASA,QAAAa,GAAAb,GACA,cAAAA,GAAA,gBAAAA,GASA,QAAAc,GAAAd,GACA,wBAAAC,EAAA7B,KAAA4B,GASA,QAAAe,GAAAf,GACA,wBAAAC,EAAA7B,KAAA4B,GASA,QAAAgB,GAAAhB,GACA,wBAAAC,EAAA7B,KAAA4B,GASA,QAAAiB,GAAAjB,GACA,4BAAAC,EAAA7B,KAAA4B,GASA,QAAAkB,GAAAlB,GACA,MAAAa,GAAAb,IAAAiB,EAAAjB,EAAAmB,MASA,QAAAC,GAAApB,GACA,yBAAAqB,kBAAArB,YAAAqB,iBASA,QAAAC,GAAAC,GACA,MAAAA,GAAAC,QAAA,WAAAA,QAAA,WAgBA,QAAAC,KACA,0BAAAC,YAAA,gBAAAA,UAAAC,WAIA,mBAAAC,SACA,mBAAAC,WAgBA,QAAAC,GAAAC,EAAAC,GAEA,UAAAD,GAAA,mBAAAA,GAUA,GALA,gBAAAA,KAEAA,OAGAhC,EAAAgC,GAEA,OAAAE,GAAA,EAAAC,EAAAH,EAAAI,OAAmCF,EAAAC,EAAOD,IAC1CD,EAAA5D,KAAA,KAAA2D,EAAAE,KAAAF,OAIA,QAAAK,KAAAL,GACAM,OAAAvD,UAAAwD,eAAAlE,KAAA2D,EAAAK,IACAJ,EAAA5D,KAAA,KAAA2D,EAAAK,KAAAL,GAuBA,QAAAzC,KAEA,QAAAiD,GAAAvC,EAAAoC,GACA,gBAAA9B,GAAA8B,IAAA,gBAAApC,GACAM,EAAA8B,GAAA9C,EAAAgB,EAAA8B,GAAApC,GAEAM,EAAA8B,GAAApC,EAIA,OATAM,MASA2B,EAAA,EAAAC,EAAAM,UAAAL,OAAuCF,EAAAC,EAAOD,IAC9CH,EAAAU,UAAAP,GAAAM,EAEA,OAAAjC,GAWA,QAAArB,GAAAwD,EAAAC,EAAAC,GAQA,MAPAb,GAAAY,EAAA,SAAA1C,EAAAoC,GACAO,GAAA,kBAAA3C,GACAyC,EAAAL,GAAAvD,EAAAmB,EAAA2C,GAEAF,EAAAL,GAAApC,IAGAyC,EApRA,GAAA5D,GAAAd,EAAA,GACA6E,EAAA7E,EAAA,GAMAkC,EAAAoC,OAAAvD,UAAAmB,QAgRAvC,GAAAD,SACAsC,UACAG,gBACA0C,WACAzC,aACAE,oBACAK,WACAC,WACAE,WACAD,cACAE,SACAC,SACAC,SACAC,aACAC,WACAE,oBACAK,uBACAK,UACAxC,QACAL,SACAqC,SJ8HM,SAAU5D,EAAQD,GK3axB,YAEAC,GAAAD,QAAA,SAAAuE,EAAAW,GACA,kBAEA,OADAE,GAAA,GAAAC,OAAAN,UAAAL,QACAF,EAAA,EAAmBA,EAAAY,EAAAV,OAAiBF,IACpCY,EAAAZ,GAAAO,UAAAP,EAEA,OAAAD,GAAAe,MAAAJ,EAAAE,MLobM,SAAUnF,EAAQD,GM/axB,QAAAmF,GAAAb,GACA,QAAAA,EAAAiB,aAAA,kBAAAjB,GAAAiB,YAAAJ,UAAAb,EAAAiB,YAAAJ,SAAAb,GAIA,QAAAkB,GAAAlB,GACA,wBAAAA,GAAAmB,aAAA,kBAAAnB,GAAAoB,OAAAP,EAAAb,EAAAoB,MAAA;;;;;;AAVAzF,EAAAD,QAAA,SAAAsE,GACA,aAAAA,IAAAa,EAAAb,IAAAkB,EAAAlB,QAAAqB,aN6cM,SAAU1F,EAAQD,EAASM,GOvdjC,YAYA,SAAAY,GAAAU,GACAxB,KAAAqB,SAAAG,EACAxB,KAAAwF,cACAtE,QAAA,GAAAuE,GACAC,SAAA,GAAAD,IAdA,GAAApE,GAAAnB,EAAA,GACAiB,EAAAjB,EAAA,GACAuF,EAAAvF,EAAA,IACAyF,EAAAzF,EAAA,GAoBAY,GAAAG,UAAAC,QAAA,SAAA0E,GAGA,gBAAAA,KACAA,EAAAzE,EAAAM,OACAoE,IAAAlB,UAAA,IACKA,UAAA,KAGLiB,EAAAzE,EAAAM,MAAAJ,GAAkCyE,OAAA,OAAc9F,KAAAqB,SAAAuE,GAChDA,EAAAE,OAAAF,EAAAE,OAAAC,aAGA,IAAAC,IAAAL,EAAAM,QACAC,EAAAnE,QAAAoE,QAAAP,EAUA,KARA5F,KAAAwF,aAAAtE,QAAA+C,QAAA,SAAAmC,GACAJ,EAAAK,QAAAD,EAAAE,UAAAF,EAAAG,YAGAvG,KAAAwF,aAAAE,SAAAzB,QAAA,SAAAmC,GACAJ,EAAAQ,KAAAJ,EAAAE,UAAAF,EAAAG,YAGAP,EAAA1B,QACA4B,IAAAO,KAAAT,EAAAU,QAAAV,EAAAU,QAGA,OAAAR,IAIA/E,EAAA8C,SAAA,0CAAA6B,GAEAhF,EAAAG,UAAA6E,GAAA,SAAAD,EAAAD,GACA,MAAA5F,MAAAkB,QAAAC,EAAAM,MAAAmE,OACAE,SACAD,YAKA1E,EAAA8C,SAAA,+BAAA6B,GAEAhF,EAAAG,UAAA6E,GAAA,SAAAD,EAAAc,EAAAf,GACA,MAAA5F,MAAAkB,QAAAC,EAAAM,MAAAmE,OACAE,SACAD,MACAc,aAKA9G,EAAAD,QAAAkB,GP8dM,SAAUjB,EAAQD,EAASM,GQ5iBjC,YASA,SAAA0G,GAAAC,EAAAC,IACA3F,EAAA4B,YAAA8D,IAAA1F,EAAA4B,YAAA8D,EAAA,mBACAA,EAAA,gBAAAC,GAIA,QAAAC,KACA,GAAAC,EAQA,OAPA,mBAAAC,gBAEAD,EAAA9G,EAAA,GACG,mBAAAgH,WAEHF,EAAA9G,EAAA,IAEA8G,EAtBA,GAAA7F,GAAAjB,EAAA,GACAiH,EAAAjH,EAAA,GAEAkH,GACAC,eAAA,qCAqBAhG,GACA2F,QAAAD,IAEAO,kBAAA,SAAAX,EAAAE,GAEA,MADAM,GAAAN,EAAA,gBACA1F,EAAAmB,WAAAqE,IACAxF,EAAAkB,cAAAsE,IACAxF,EAAA4D,SAAA4B,IACAxF,EAAAkC,SAAAsD,IACAxF,EAAA+B,OAAAyD,IACAxF,EAAAgC,OAAAwD,GAEAA,EAEAxF,EAAAqB,kBAAAmE,GACAA,EAAA/D,OAEAzB,EAAAoC,kBAAAoD,IACAC,EAAAC,EAAA,mDACAF,EAAAvE,YAEAjB,EAAA6B,SAAA2D,IACAC,EAAAC,EAAA,kCACAU,KAAAC,UAAAb,IAEAA,IAGAc,mBAAA,SAAAd,GAEA,mBAAAA,GACA,IACAA,EAAAY,KAAAG,MAAAf,GACO,MAAAgB,IAEP,MAAAhB,KAOAiB,QAAA,EAEAC,eAAA,aACAC,eAAA,eAEAC,kBAAA,EAEAC,eAAA,SAAAC,GACA,MAAAA,IAAA,KAAAA,EAAA,KAIA5G,GAAAwF,SACAqB,QACAC,OAAA,sCAIAhH,EAAA8C,SAAA,gCAAA6B,GACAzE,EAAAwF,QAAAf,QAGA3E,EAAA8C,SAAA,+BAAA6B,GACAzE,EAAAwF,QAAAf,GAAA3E,EAAAM,MAAA2F,KAGAvH,EAAAD,QAAAyB,GRmjBM,SAAUxB,EAAQD,EAASM,GSlpBjC,YAEA,IAAAiB,GAAAjB,EAAA,EAEAL,GAAAD,QAAA,SAAAiH,EAAAuB,GACAjH,EAAA8C,QAAA4C,EAAA,SAAAC,EAAAuB,GACAA,IAAAD,GAAAC,EAAAC,gBAAAF,EAAAE,gBACAzB,EAAAuB,GAAAtB,QACAD,GAAAwB,QT4pBM,SAAUxI,EAAQD,EAASM,GUpqBjC,YAEA,IAAAiB,GAAAjB,EAAA,GACAqI,EAAArI,EAAA,GACAsI,EAAAtI,EAAA,IACAuI,EAAAvI,EAAA,IACAwI,EAAAxI,EAAA,IACAyI,EAAAzI,EAAA,IACA0I,EAAA,mBAAA7E,gBAAA6E,MAAA7E,OAAA6E,KAAA5H,KAAA+C,SAAA7D,EAAA,GAEAL,GAAAD,QAAA,SAAAgG,GACA,UAAA7D,SAAA,SAAAoE,EAAA0C,GACA,GAAAC,GAAAlD,EAAAe,KACAoC,EAAAnD,EAAAiB,OAEA1F,GAAAmB,WAAAwG,UACAC,GAAA,eAGA,IAAA7H,GAAA,GAAA+F,gBACA+B,EAAA,qBACAC,GAAA,CAiBA,IAXA,mBAAAlF,UACAA,OAAAmF,gBAAA,mBAAAhI,IACAwH,EAAA9C,EAAAC,OACA3E,EAAA,GAAA6C,QAAAmF,eACAF,EAAA,SACAC,GAAA,EACA/H,EAAAiI,WAAA,aACAjI,EAAAkI,UAAA,cAIAxD,EAAAyD,KAAA,CACA,GAAAC,GAAA1D,EAAAyD,KAAAC,UAAA,GACAC,EAAA3D,EAAAyD,KAAAE,UAAA,EACAR,GAAAS,cAAA,SAAAZ,EAAAU,EAAA,IAAAC,GA+DA,GA5DArI,EAAAuI,KAAA7D,EAAAE,OAAAwC,cAAAE,EAAA5C,EAAAC,IAAAD,EAAA8D,OAAA9D,EAAA+D,mBAAA,GAGAzI,EAAA0G,QAAAhC,EAAAgC,QAGA1G,EAAA8H,GAAA,WACA,GAAA9H,IAAA,IAAAA,EAAA0I,YAAAX,KAQA,IAAA/H,EAAA+G,QAAA/G,EAAA2I,aAAA,IAAA3I,EAAA2I,YAAAC,QAAA,WAKA,GAAAC,GAAA,yBAAA7I,GAAAuH,EAAAvH,EAAA8I,yBAAA,KACAC,EAAArE,EAAAsE,cAAA,SAAAtE,EAAAsE,aAAAhJ,EAAAwE,SAAAxE,EAAAiJ,aACAzE,GACAiB,KAAAsD,EAEAhC,OAAA,OAAA/G,EAAA+G,OAAA,IAAA/G,EAAA+G,OACAmC,WAAA,OAAAlJ,EAAA+G,OAAA,aAAA/G,EAAAkJ,WACAvD,QAAAkD,EACAnE,SACA1E,UAGAqH,GAAApC,EAAA0C,EAAAnD,GAGAxE,EAAA,OAIAA,EAAAmJ,QAAA,WAGAxB,EAAAF,EAAA,gBAAA/C,EAAA,KAAA1E,IAGAA,EAAA,MAIAA,EAAAkI,UAAA,WACAP,EAAAF,EAAA,cAAA/C,EAAAgC,QAAA,cAAAhC,EAAA,eACA1E,IAGAA,EAAA,MAMAC,EAAAyC,uBAAA,CACA,GAAA0G,GAAApK,EAAA,IAGAqK,GAAA3E,EAAA4E,iBAAA9B,EAAA9C,EAAAC,OAAAD,EAAAiC,eACAyC,EAAAG,KAAA7E,EAAAiC,gBACA5B,MAEAsE,KACAxB,EAAAnD,EAAAkC,gBAAAyC,GAuBA,GAlBA,oBAAArJ,IACAC,EAAA8C,QAAA8E,EAAA,SAAA5G,EAAAoC,GACA,mBAAAuE,IAAA,iBAAAvE,EAAAwB,oBAEAgD,GAAAxE,GAGArD,EAAAwJ,iBAAAnG,EAAApC,KAMAyD,EAAA4E,kBACAtJ,EAAAsJ,iBAAA,GAIA5E,EAAAsE,aACA,IACAhJ,EAAAgJ,aAAAtE,EAAAsE,aACO,MAAAvC,GAGP,YAAA/B,EAAAsE,aACA,KAAAvC,GAMA,kBAAA/B,GAAA+E,oBACAzJ,EAAA0J,iBAAA,WAAAhF,EAAA+E,oBAIA,kBAAA/E,GAAAiF,kBAAA3J,EAAA4J,QACA5J,EAAA4J,OAAAF,iBAAA,WAAAhF,EAAAiF,kBAGAjF,EAAAmF,aAEAnF,EAAAmF,YAAA7E,QAAAO,KAAA,SAAAuE,GACA9J,IAIAA,EAAA+J,QACApC,EAAAmC,GAEA9J,EAAA,QAIA+E,SAAA6C,IACAA,EAAA,MAIA5H,EAAAgK,KAAApC,OV6qBM,SAAUjJ,EAAQD,EAASM,GW91BjC,YAEA,IAAAyI,GAAAzI,EAAA,GASAL,GAAAD,QAAA,SAAAuG,EAAA0C,EAAAnD,GACA,GAAAsC,GAAAtC,EAAAE,OAAAoC,cAEAtC,GAAAuC,QAAAD,MAAAtC,EAAAuC,QAGAY,EAAAF,EACA,mCAAAjD,EAAAuC,OACAvC,EAAAE,OACA,KACAF,EAAAxE,QACAwE,IAPAS,EAAAT,KX+2BM,SAAU7F,EAAQD,EAASM,GY93BjC,YAEA,IAAAiL,GAAAjL,EAAA,GAYAL,GAAAD,QAAA,SAAAwL,EAAAxF,EAAAyF,EAAAnK,EAAAwE,GACA,GAAA4F,GAAA,GAAAC,OAAAH,EACA,OAAAD,GAAAG,EAAA1F,EAAAyF,EAAAnK,EAAAwE,KZs4BM,SAAU7F,EAAQD,Gat5BxB,YAYAC,GAAAD,QAAA,SAAA0L,EAAA1F,EAAAyF,EAAAnK,EAAAwE,GAOA,MANA4F,GAAA1F,SACAyF,IACAC,EAAAD,QAEAC,EAAApK,UACAoK,EAAA5F,WACA4F,Ib85BM,SAAUzL,EAAQD,EAASM,Gcj7BjC,YAIA,SAAAsL,GAAArJ,GACA,MAAAsJ,oBAAAtJ,GACAwB,QAAA,aACAA,QAAA,aACAA,QAAA,YACAA,QAAA,aACAA,QAAA,YACAA,QAAA,aACAA,QAAA,aAVA,GAAAxC,GAAAjB,EAAA,EAoBAL,GAAAD,QAAA,SAAAiG,EAAA6D,EAAAC,GAEA,IAAAD,EACA,MAAA7D,EAGA,IAAA6F,EACA,IAAA/B,EACA+B,EAAA/B,EAAAD,OACG,IAAAvI,EAAAoC,kBAAAmG,GACHgC,EAAAhC,EAAAtH,eACG,CACH,GAAAuJ,KAEAxK,GAAA8C,QAAAyF,EAAA,SAAAvH,EAAAoC,GACA,OAAApC,GAAA,mBAAAA,KAIAhB,EAAAe,QAAAC,GACAoC,GAAA,KAEApC,MAGAhB,EAAA8C,QAAA9B,EAAA,SAAAyJ,GACAzK,EAAA8B,OAAA2I,GACAA,IAAAC,cACS1K,EAAA6B,SAAA4I,KACTA,EAAArE,KAAAC,UAAAoE,IAEAD,EAAAnF,KAAAgF,EAAAjH,GAAA,IAAAiH,EAAAI,SAIAF,EAAAC,EAAAG,KAAA,KAOA,MAJAJ,KACA7F,MAAAiE,QAAA,mBAAA4B,GAGA7F,Idy7BM,SAAUhG,EAAQD,EAASM,Gez/BjC,YAEA,IAAAiB,GAAAjB,EAAA,GAIA6L,GACA,6DACA,kEACA,gEACA,qCAgBAlM,GAAAD,QAAA,SAAAiH,GACA,GACAtC,GACApC,EACAiC,EAHA4H,IAKA,OAAAnF,IAEA1F,EAAA8C,QAAA4C,EAAAoF,MAAA,eAAAC,GAKA,GAJA9H,EAAA8H,EAAApC,QAAA,KACAvF,EAAApD,EAAAsC,KAAAyI,EAAAC,OAAA,EAAA/H,IAAA2B,cACA5D,EAAAhB,EAAAsC,KAAAyI,EAAAC,OAAA/H,EAAA,IAEAG,EAAA,CACA,GAAAyH,EAAAzH,IAAAwH,EAAAjC,QAAAvF,IAAA,EACA,MAEA,gBAAAA,EACAyH,EAAAzH,IAAAyH,EAAAzH,GAAAyH,EAAAzH,OAAA6H,QAAAjK,IAEA6J,EAAAzH,GAAAyH,EAAAzH,GAAAyH,EAAAzH,GAAA,KAAApC,OAKA6J,GAnBiBA,IfohCX,SAAUnM,EAAQD,EAASM,GgBpjCjC,YAEA,IAAAiB,GAAAjB,EAAA,EAEAL,GAAAD,QACAuB,EAAAyC,uBAIA,WAWA,QAAAyI,GAAAxG,GACA,GAAAyG,GAAAzG,CAWA,OATA0G,KAEAC,EAAAC,aAAA,OAAAH,GACAA,EAAAE,EAAAF,MAGAE,EAAAC,aAAA,OAAAH,IAIAA,KAAAE,EAAAF,KACAI,SAAAF,EAAAE,SAAAF,EAAAE,SAAA/I,QAAA,YACAgJ,KAAAH,EAAAG,KACAC,OAAAJ,EAAAI,OAAAJ,EAAAI,OAAAjJ,QAAA,aACAkJ,KAAAL,EAAAK,KAAAL,EAAAK,KAAAlJ,QAAA,YACAmJ,SAAAN,EAAAM,SACAC,KAAAP,EAAAO,KACAC,SAAA,MAAAR,EAAAQ,SAAAC,OAAA,GACAT,EAAAQ,SACA,IAAAR,EAAAQ,UAhCA,GAEAE,GAFAX,EAAA,kBAAAY,KAAAtJ,UAAAuJ,WACAZ,EAAAxI,SAAAqJ,cAAA,IA2CA,OARAH,GAAAb,EAAAtI,OAAAuJ,SAAAhB,MAQA,SAAAiB,GACA,GAAAvB,GAAA7K,EAAA0B,SAAA0K,GAAAlB,EAAAkB,IACA,OAAAvB,GAAAU,WAAAQ,EAAAR,UACAV,EAAAW,OAAAO,EAAAP,SAKA,WACA,kBACA,chB8jCM,SAAU9M,EAAQD,GiB9nCxB,YAMA,SAAA4N,KACAxN,KAAAoL,QAAA,uCAMA,QAAAxC,GAAA6E,GAGA,IAEA,GAAAC,GAAAC,EAJAjK,EAAAkK,OAAAH,GACAI,EAAA,GAGAC,EAAA,EAAAC,EAAAC,EAIAtK,EAAAuJ,OAAA,EAAAa,KAAAC,EAAA,IAAAD,EAAA,GAEAD,GAAAE,EAAAd,OAAA,GAAAS,GAAA,EAAAI,EAAA,KACA,CAEA,GADAH,EAAAjK,EAAAuK,WAAAH,GAAA,KACAH,EAAA,IACA,SAAAH,EAEAE,MAAA,EAAAC,EAEA,MAAAE,GA5BA,GAAAG,GAAA,mEAKAR,GAAAvM,UAAA,GAAAsK,OACAiC,EAAAvM,UAAAoK,KAAA,EACAmC,EAAAvM,UAAAoH,KAAA,wBAwBAxI,EAAAD,QAAAgJ,GjBqoCM,SAAU/I,EAAQD,EAASM,GkBxqCjC,YAEA,IAAAiB,GAAAjB,EAAA,EAEAL,GAAAD,QACAuB,EAAAyC,uBAGA,WACA,OACAsK,MAAA,SAAA7F,EAAAvB,EAAAqH,EAAAC,EAAAC,EAAAC,GACA,GAAAC,KACAA,GAAA/H,KAAA6B,EAAA,IAAAoD,mBAAA3E,IAEA3F,EAAA2B,SAAAqL,IACAI,EAAA/H,KAAA,cAAAgI,MAAAL,GAAAM,eAGAtN,EAAA0B,SAAAuL,IACAG,EAAA/H,KAAA,QAAA4H,GAGAjN,EAAA0B,SAAAwL,IACAE,EAAA/H,KAAA,UAAA6H,GAGAC,KAAA,GACAC,EAAA/H,KAAA,UAGAxC,SAAAuK,SAAAzC,KAAA,OAGArB,KAAA,SAAApC,GACA,GAAAqG,GAAA1K,SAAAuK,OAAAG,MAAA,GAAAC,QAAA,aAA0DtG,EAAA,aAC1D,OAAAqG,GAAAE,mBAAAF,EAAA,UAGAG,OAAA,SAAAxG,GACArI,KAAAkO,MAAA7F,EAAA,GAAAmG,KAAAM,MAAA,YAMA,WACA,OACAZ,MAAA,aACAzD,KAAA,WAA6B,aAC7BoE,OAAA,kBlBkrCM,SAAUhP,EAAQD,EAASM,GmBnuCjC,YAIA,SAAAuF,KACAzF,KAAA+O,YAHA,GAAA5N,GAAAjB,EAAA,EAcAuF,GAAAxE,UAAA+N,IAAA,SAAA1I,EAAAC,GAKA,MAJAvG,MAAA+O,SAAAvI,MACAF,YACAC,aAEAvG,KAAA+O,SAAAzK,OAAA,GAQAmB,EAAAxE,UAAAgO,MAAA,SAAA5O,GACAL,KAAA+O,SAAA1O,KACAL,KAAA+O,SAAA1O,GAAA,OAYAoF,EAAAxE,UAAAgD,QAAA,SAAAE,GACAhD,EAAA8C,QAAAjE,KAAA+O,SAAA,SAAAG,GACA,OAAAA,GACA/K,EAAA+K,MAKArP,EAAAD,QAAA6F,GnB0uCM,SAAU5F,EAAQD,EAASM,GoB7xCjC,YAYA,SAAAiP,GAAAvJ,GACAA,EAAAmF,aACAnF,EAAAmF,YAAAqE,mBAZA,GAAAjO,GAAAjB,EAAA,GACAmP,EAAAnP,EAAA,IACA0B,EAAA1B,EAAA,IACAmB,EAAAnB,EAAA,GACAoP,EAAApP,EAAA,IACAqP,EAAArP,EAAA,GAiBAL,GAAAD,QAAA,SAAAgG,GACAuJ,EAAAvJ,GAGAA,EAAA4J,UAAAF,EAAA1J,EAAAC,OACAD,EAAAC,IAAA0J,EAAA3J,EAAA4J,QAAA5J,EAAAC,MAIAD,EAAAiB,QAAAjB,EAAAiB,YAGAjB,EAAAe,KAAA0I,EACAzJ,EAAAe,KACAf,EAAAiB,QACAjB,EAAA0B,kBAIA1B,EAAAiB,QAAA1F,EAAAM,MACAmE,EAAAiB,QAAAqB,WACAtC,EAAAiB,QAAAjB,EAAAE,YACAF,EAAAiB,aAGA1F,EAAA8C,SACA,qDACA,SAAA6B,SACAF,GAAAiB,QAAAf,IAIA,IAAAkB,GAAApB,EAAAoB,SAAA3F,EAAA2F,OAEA,OAAAA,GAAApB,GAAAa,KAAA,SAAAf,GAUA,MATAyJ,GAAAvJ,GAGAF,EAAAiB,KAAA0I,EACA3J,EAAAiB,KACAjB,EAAAmB,QACAjB,EAAA6B,mBAGA/B,GACG,SAAA+J,GAcH,MAbA7N,GAAA6N,KACAN,EAAAvJ,GAGA6J,KAAA/J,WACA+J,EAAA/J,SAAAiB,KAAA0I,EACAI,EAAA/J,SAAAiB,KACA8I,EAAA/J,SAAAmB,QACAjB,EAAA6B,qBAKA1F,QAAA8G,OAAA4G,OpBsyCM,SAAU5P,EAAQD,EAASM,GqBz3CjC,YAEA,IAAAiB,GAAAjB,EAAA,EAUAL,GAAAD,QAAA,SAAA+G,EAAAE,EAAA6I,GAMA,MAJAvO,GAAA8C,QAAAyL,EAAA,SAAAvL,GACAwC,EAAAxC,EAAAwC,EAAAE,KAGAF,IrBi4CM,SAAU9G,EAAQD,GsBn5CxB,YAEAC,GAAAD,QAAA,SAAAkH,GACA,SAAAA,MAAA6I,ctB25CM,SAAU9P,EAAQD,GuB95CxB,YAQAC,GAAAD,QAAA,SAAAiG,GAIA,sCAAAsH,KAAAtH,KvBs6CM,SAAUhG,EAAQD,GwBl7CxB,YASAC,GAAAD,QAAA,SAAA4P,EAAAI,GACA,MAAAA,GACAJ,EAAA7L,QAAA,eAAAiM,EAAAjM,QAAA,WACA6L,IxB07CM,SAAU3P,EAAQD,GyBt8CxB,YAQA,SAAA8B,GAAA0J,GACApL,KAAAoL,UAGA1J,EAAAT,UAAAmB,SAAA,WACA,gBAAApC,KAAAoL,QAAA,KAAApL,KAAAoL,QAAA,KAGA1J,EAAAT,UAAA0O,YAAA,EAEA9P,EAAAD,QAAA8B,GzB68CM,SAAU7B,EAAQD,EAASM,G0B/9CjC,YAUA,SAAAyB,GAAAkO,GACA,qBAAAA,GACA,SAAAC,WAAA,+BAGA,IAAAC,EACA/P,MAAAkG,QAAA,GAAAnE,SAAA,SAAAoE,GACA4J,EAAA5J,GAGA,IAAA6J,GAAAhQ,IACA6P,GAAA,SAAAzE,GACA4E,EAAAP,SAKAO,EAAAP,OAAA,GAAA/N,GAAA0J,GACA2E,EAAAC,EAAAP,WA1BA,GAAA/N,GAAAxB,EAAA,GAiCAyB,GAAAV,UAAAmO,iBAAA,WACA,GAAApP,KAAAyP,OACA,KAAAzP,MAAAyP,QAQA9N,EAAAsO,OAAA,WACA,GAAAjF,GACAgF,EAAA,GAAArO,GAAA,SAAAlB,GACAuK,EAAAvK,GAEA,QACAuP,QACAhF,WAIAnL,EAAAD,QAAA+B,G1Bs+CM,SAAU9B,EAAQD,G2B9hDxB,YAsBAC,GAAAD,QAAA,SAAAsQ,GACA,gBAAAC,GACA,MAAAD,GAAAhL,MAAA,KAAAiL","file":"axios.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"axios\"] = factory();\n\telse\n\t\troot[\"axios\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"axios\"] = factory();\n\telse\n\t\troot[\"axios\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\tmodule.exports = __webpack_require__(1);\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\tvar bind = __webpack_require__(3);\n\tvar Axios = __webpack_require__(5);\n\tvar defaults = __webpack_require__(6);\n\t\n\t/**\n\t * Create an instance of Axios\n\t *\n\t * @param {Object} defaultConfig The default config for the instance\n\t * @return {Axios} A new instance of Axios\n\t */\n\tfunction createInstance(defaultConfig) {\n\t var context = new Axios(defaultConfig);\n\t var instance = bind(Axios.prototype.request, context);\n\t\n\t // Copy axios.prototype to instance\n\t utils.extend(instance, Axios.prototype, context);\n\t\n\t // Copy context to instance\n\t utils.extend(instance, context);\n\t\n\t return instance;\n\t}\n\t\n\t// Create the default instance to be exported\n\tvar axios = createInstance(defaults);\n\t\n\t// Expose Axios class to allow class inheritance\n\taxios.Axios = Axios;\n\t\n\t// Factory for creating new instances\n\taxios.create = function create(instanceConfig) {\n\t return createInstance(utils.merge(defaults, instanceConfig));\n\t};\n\t\n\t// Expose Cancel & CancelToken\n\taxios.Cancel = __webpack_require__(23);\n\taxios.CancelToken = __webpack_require__(24);\n\taxios.isCancel = __webpack_require__(20);\n\t\n\t// Expose all/spread\n\taxios.all = function all(promises) {\n\t return Promise.all(promises);\n\t};\n\taxios.spread = __webpack_require__(25);\n\t\n\tmodule.exports = axios;\n\t\n\t// Allow use of default import syntax in TypeScript\n\tmodule.exports.default = axios;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar bind = __webpack_require__(3);\n\tvar isBuffer = __webpack_require__(4);\n\t\n\t/*global toString:true*/\n\t\n\t// utils is a library of generic helper functions non-specific to axios\n\t\n\tvar toString = Object.prototype.toString;\n\t\n\t/**\n\t * Determine if a value is an Array\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Array, otherwise false\n\t */\n\tfunction isArray(val) {\n\t return toString.call(val) === '[object Array]';\n\t}\n\t\n\t/**\n\t * Determine if a value is an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBuffer(val) {\n\t return toString.call(val) === '[object ArrayBuffer]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a FormData\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an FormData, otherwise false\n\t */\n\tfunction isFormData(val) {\n\t return (typeof FormData !== 'undefined') && (val instanceof FormData);\n\t}\n\t\n\t/**\n\t * Determine if a value is a view on an ArrayBuffer\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n\t */\n\tfunction isArrayBufferView(val) {\n\t var result;\n\t if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n\t result = ArrayBuffer.isView(val);\n\t } else {\n\t result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Determine if a value is a String\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a String, otherwise false\n\t */\n\tfunction isString(val) {\n\t return typeof val === 'string';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Number\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Number, otherwise false\n\t */\n\tfunction isNumber(val) {\n\t return typeof val === 'number';\n\t}\n\t\n\t/**\n\t * Determine if a value is undefined\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if the value is undefined, otherwise false\n\t */\n\tfunction isUndefined(val) {\n\t return typeof val === 'undefined';\n\t}\n\t\n\t/**\n\t * Determine if a value is an Object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is an Object, otherwise false\n\t */\n\tfunction isObject(val) {\n\t return val !== null && typeof val === 'object';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Date\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Date, otherwise false\n\t */\n\tfunction isDate(val) {\n\t return toString.call(val) === '[object Date]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a File\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a File, otherwise false\n\t */\n\tfunction isFile(val) {\n\t return toString.call(val) === '[object File]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Blob\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Blob, otherwise false\n\t */\n\tfunction isBlob(val) {\n\t return toString.call(val) === '[object Blob]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Function\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Function, otherwise false\n\t */\n\tfunction isFunction(val) {\n\t return toString.call(val) === '[object Function]';\n\t}\n\t\n\t/**\n\t * Determine if a value is a Stream\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a Stream, otherwise false\n\t */\n\tfunction isStream(val) {\n\t return isObject(val) && isFunction(val.pipe);\n\t}\n\t\n\t/**\n\t * Determine if a value is a URLSearchParams object\n\t *\n\t * @param {Object} val The value to test\n\t * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n\t */\n\tfunction isURLSearchParams(val) {\n\t return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n\t}\n\t\n\t/**\n\t * Trim excess whitespace off the beginning and end of a string\n\t *\n\t * @param {String} str The String to trim\n\t * @returns {String} The String freed of excess whitespace\n\t */\n\tfunction trim(str) {\n\t return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n\t}\n\t\n\t/**\n\t * Determine if we're running in a standard browser environment\n\t *\n\t * This allows axios to run in a web worker, and react-native.\n\t * Both environments support XMLHttpRequest, but not fully standard globals.\n\t *\n\t * web workers:\n\t * typeof window -> undefined\n\t * typeof document -> undefined\n\t *\n\t * react-native:\n\t * navigator.product -> 'ReactNative'\n\t */\n\tfunction isStandardBrowserEnv() {\n\t if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n\t return false;\n\t }\n\t return (\n\t typeof window !== 'undefined' &&\n\t typeof document !== 'undefined'\n\t );\n\t}\n\t\n\t/**\n\t * Iterate over an Array or an Object invoking a function for each item.\n\t *\n\t * If `obj` is an Array callback will be called passing\n\t * the value, index, and complete array for each item.\n\t *\n\t * If 'obj' is an Object callback will be called passing\n\t * the value, key, and complete object for each property.\n\t *\n\t * @param {Object|Array} obj The object to iterate\n\t * @param {Function} fn The callback to invoke for each item\n\t */\n\tfunction forEach(obj, fn) {\n\t // Don't bother if no value provided\n\t if (obj === null || typeof obj === 'undefined') {\n\t return;\n\t }\n\t\n\t // Force an array if not already something iterable\n\t if (typeof obj !== 'object') {\n\t /*eslint no-param-reassign:0*/\n\t obj = [obj];\n\t }\n\t\n\t if (isArray(obj)) {\n\t // Iterate over array values\n\t for (var i = 0, l = obj.length; i < l; i++) {\n\t fn.call(null, obj[i], i, obj);\n\t }\n\t } else {\n\t // Iterate over object keys\n\t for (var key in obj) {\n\t if (Object.prototype.hasOwnProperty.call(obj, key)) {\n\t fn.call(null, obj[key], key, obj);\n\t }\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * Accepts varargs expecting each argument to be an object, then\n\t * immutably merges the properties of each object and returns result.\n\t *\n\t * When multiple objects contain the same key the later object in\n\t * the arguments list will take precedence.\n\t *\n\t * Example:\n\t *\n\t * ```js\n\t * var result = merge({foo: 123}, {foo: 456});\n\t * console.log(result.foo); // outputs 456\n\t * ```\n\t *\n\t * @param {Object} obj1 Object to merge\n\t * @returns {Object} Result of all merge properties\n\t */\n\tfunction merge(/* obj1, obj2, obj3, ... */) {\n\t var result = {};\n\t function assignValue(val, key) {\n\t if (typeof result[key] === 'object' && typeof val === 'object') {\n\t result[key] = merge(result[key], val);\n\t } else {\n\t result[key] = val;\n\t }\n\t }\n\t\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t forEach(arguments[i], assignValue);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Extends object a by mutably adding to it the properties of object b.\n\t *\n\t * @param {Object} a The object to be extended\n\t * @param {Object} b The object to copy properties from\n\t * @param {Object} thisArg The object to bind function to\n\t * @return {Object} The resulting value of object a\n\t */\n\tfunction extend(a, b, thisArg) {\n\t forEach(b, function assignValue(val, key) {\n\t if (thisArg && typeof val === 'function') {\n\t a[key] = bind(val, thisArg);\n\t } else {\n\t a[key] = val;\n\t }\n\t });\n\t return a;\n\t}\n\t\n\tmodule.exports = {\n\t isArray: isArray,\n\t isArrayBuffer: isArrayBuffer,\n\t isBuffer: isBuffer,\n\t isFormData: isFormData,\n\t isArrayBufferView: isArrayBufferView,\n\t isString: isString,\n\t isNumber: isNumber,\n\t isObject: isObject,\n\t isUndefined: isUndefined,\n\t isDate: isDate,\n\t isFile: isFile,\n\t isBlob: isBlob,\n\t isFunction: isFunction,\n\t isStream: isStream,\n\t isURLSearchParams: isURLSearchParams,\n\t isStandardBrowserEnv: isStandardBrowserEnv,\n\t forEach: forEach,\n\t merge: merge,\n\t extend: extend,\n\t trim: trim\n\t};\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function bind(fn, thisArg) {\n\t return function wrap() {\n\t var args = new Array(arguments.length);\n\t for (var i = 0; i < args.length; i++) {\n\t args[i] = arguments[i];\n\t }\n\t return fn.apply(thisArg, args);\n\t };\n\t};\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n\t/*!\n\t * Determine if an object is a Buffer\n\t *\n\t * @author Feross Aboukhadijeh \n\t * @license MIT\n\t */\n\t\n\t// The _isBuffer check is for Safari 5-7 support, because it's missing\n\t// Object.prototype.constructor. Remove this eventually\n\tmodule.exports = function (obj) {\n\t return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n\t}\n\t\n\tfunction isBuffer (obj) {\n\t return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n\t}\n\t\n\t// For Node v0.10 support. Remove this eventually.\n\tfunction isSlowBuffer (obj) {\n\t return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n\t}\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar defaults = __webpack_require__(6);\n\tvar utils = __webpack_require__(2);\n\tvar InterceptorManager = __webpack_require__(17);\n\tvar dispatchRequest = __webpack_require__(18);\n\t\n\t/**\n\t * Create a new instance of Axios\n\t *\n\t * @param {Object} instanceConfig The default config for the instance\n\t */\n\tfunction Axios(instanceConfig) {\n\t this.defaults = instanceConfig;\n\t this.interceptors = {\n\t request: new InterceptorManager(),\n\t response: new InterceptorManager()\n\t };\n\t}\n\t\n\t/**\n\t * Dispatch a request\n\t *\n\t * @param {Object} config The config specific for this request (merged with this.defaults)\n\t */\n\tAxios.prototype.request = function request(config) {\n\t /*eslint no-param-reassign:0*/\n\t // Allow for axios('example/url'[, config]) a la fetch API\n\t if (typeof config === 'string') {\n\t config = utils.merge({\n\t url: arguments[0]\n\t }, arguments[1]);\n\t }\n\t\n\t config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n\t config.method = config.method.toLowerCase();\n\t\n\t // Hook up interceptors middleware\n\t var chain = [dispatchRequest, undefined];\n\t var promise = Promise.resolve(config);\n\t\n\t this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n\t chain.unshift(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n\t chain.push(interceptor.fulfilled, interceptor.rejected);\n\t });\n\t\n\t while (chain.length) {\n\t promise = promise.then(chain.shift(), chain.shift());\n\t }\n\t\n\t return promise;\n\t};\n\t\n\t// Provide aliases for supported request methods\n\tutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url\n\t }));\n\t };\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t /*eslint func-names:0*/\n\t Axios.prototype[method] = function(url, data, config) {\n\t return this.request(utils.merge(config || {}, {\n\t method: method,\n\t url: url,\n\t data: data\n\t }));\n\t };\n\t});\n\t\n\tmodule.exports = Axios;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\tvar normalizeHeaderName = __webpack_require__(7);\n\t\n\tvar DEFAULT_CONTENT_TYPE = {\n\t 'Content-Type': 'application/x-www-form-urlencoded'\n\t};\n\t\n\tfunction setContentTypeIfUnset(headers, value) {\n\t if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n\t headers['Content-Type'] = value;\n\t }\n\t}\n\t\n\tfunction getDefaultAdapter() {\n\t var adapter;\n\t if (typeof XMLHttpRequest !== 'undefined') {\n\t // For browsers use XHR adapter\n\t adapter = __webpack_require__(8);\n\t } else if (typeof process !== 'undefined') {\n\t // For node use HTTP adapter\n\t adapter = __webpack_require__(8);\n\t }\n\t return adapter;\n\t}\n\t\n\tvar defaults = {\n\t adapter: getDefaultAdapter(),\n\t\n\t transformRequest: [function transformRequest(data, headers) {\n\t normalizeHeaderName(headers, 'Content-Type');\n\t if (utils.isFormData(data) ||\n\t utils.isArrayBuffer(data) ||\n\t utils.isBuffer(data) ||\n\t utils.isStream(data) ||\n\t utils.isFile(data) ||\n\t utils.isBlob(data)\n\t ) {\n\t return data;\n\t }\n\t if (utils.isArrayBufferView(data)) {\n\t return data.buffer;\n\t }\n\t if (utils.isURLSearchParams(data)) {\n\t setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n\t return data.toString();\n\t }\n\t if (utils.isObject(data)) {\n\t setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n\t return JSON.stringify(data);\n\t }\n\t return data;\n\t }],\n\t\n\t transformResponse: [function transformResponse(data) {\n\t /*eslint no-param-reassign:0*/\n\t if (typeof data === 'string') {\n\t try {\n\t data = JSON.parse(data);\n\t } catch (e) { /* Ignore */ }\n\t }\n\t return data;\n\t }],\n\t\n\t /**\n\t * A timeout in milliseconds to abort a request. If set to 0 (default) a\n\t * timeout is not created.\n\t */\n\t timeout: 0,\n\t\n\t xsrfCookieName: 'XSRF-TOKEN',\n\t xsrfHeaderName: 'X-XSRF-TOKEN',\n\t\n\t maxContentLength: -1,\n\t\n\t validateStatus: function validateStatus(status) {\n\t return status >= 200 && status < 300;\n\t }\n\t};\n\t\n\tdefaults.headers = {\n\t common: {\n\t 'Accept': 'application/json, text/plain, */*'\n\t }\n\t};\n\t\n\tutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n\t defaults.headers[method] = {};\n\t});\n\t\n\tutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n\t defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n\t});\n\t\n\tmodule.exports = defaults;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\tmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n\t utils.forEach(headers, function processHeader(value, name) {\n\t if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n\t headers[normalizedName] = value;\n\t delete headers[name];\n\t }\n\t });\n\t};\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\tvar settle = __webpack_require__(9);\n\tvar buildURL = __webpack_require__(12);\n\tvar parseHeaders = __webpack_require__(13);\n\tvar isURLSameOrigin = __webpack_require__(14);\n\tvar createError = __webpack_require__(10);\n\tvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || __webpack_require__(15);\n\t\n\tmodule.exports = function xhrAdapter(config) {\n\t return new Promise(function dispatchXhrRequest(resolve, reject) {\n\t var requestData = config.data;\n\t var requestHeaders = config.headers;\n\t\n\t if (utils.isFormData(requestData)) {\n\t delete requestHeaders['Content-Type']; // Let the browser set it\n\t }\n\t\n\t var request = new XMLHttpRequest();\n\t var loadEvent = 'onreadystatechange';\n\t var xDomain = false;\n\t\n\t // For IE 8/9 CORS support\n\t // Only supports POST and GET calls and doesn't returns the response headers.\n\t // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n\t if ((\"production\") !== 'test' &&\n\t typeof window !== 'undefined' &&\n\t window.XDomainRequest && !('withCredentials' in request) &&\n\t !isURLSameOrigin(config.url)) {\n\t request = new window.XDomainRequest();\n\t loadEvent = 'onload';\n\t xDomain = true;\n\t request.onprogress = function handleProgress() {};\n\t request.ontimeout = function handleTimeout() {};\n\t }\n\t\n\t // HTTP basic authentication\n\t if (config.auth) {\n\t var username = config.auth.username || '';\n\t var password = config.auth.password || '';\n\t requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n\t }\n\t\n\t request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\t\n\t // Set the request timeout in MS\n\t request.timeout = config.timeout;\n\t\n\t // Listen for ready state\n\t request[loadEvent] = function handleLoad() {\n\t if (!request || (request.readyState !== 4 && !xDomain)) {\n\t return;\n\t }\n\t\n\t // The request errored out and we didn't get a response, this will be\n\t // handled by onerror instead\n\t // With one exception: request that using file: protocol, most browsers\n\t // will return status as 0 even though it's a successful request\n\t if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n\t return;\n\t }\n\t\n\t // Prepare the response\n\t var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n\t var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n\t var response = {\n\t data: responseData,\n\t // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n\t status: request.status === 1223 ? 204 : request.status,\n\t statusText: request.status === 1223 ? 'No Content' : request.statusText,\n\t headers: responseHeaders,\n\t config: config,\n\t request: request\n\t };\n\t\n\t settle(resolve, reject, response);\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle low level network errors\n\t request.onerror = function handleError() {\n\t // Real errors are hidden from us by the browser\n\t // onerror should only fire if it's a network error\n\t reject(createError('Network Error', config, null, request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Handle timeout\n\t request.ontimeout = function handleTimeout() {\n\t reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n\t request));\n\t\n\t // Clean up request\n\t request = null;\n\t };\n\t\n\t // Add xsrf header\n\t // This is only done if running in a standard browser environment.\n\t // Specifically not if we're in a web worker, or react-native.\n\t if (utils.isStandardBrowserEnv()) {\n\t var cookies = __webpack_require__(16);\n\t\n\t // Add xsrf header\n\t var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n\t cookies.read(config.xsrfCookieName) :\n\t undefined;\n\t\n\t if (xsrfValue) {\n\t requestHeaders[config.xsrfHeaderName] = xsrfValue;\n\t }\n\t }\n\t\n\t // Add headers to the request\n\t if ('setRequestHeader' in request) {\n\t utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n\t if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n\t // Remove Content-Type if data is undefined\n\t delete requestHeaders[key];\n\t } else {\n\t // Otherwise add header to the request\n\t request.setRequestHeader(key, val);\n\t }\n\t });\n\t }\n\t\n\t // Add withCredentials to request if needed\n\t if (config.withCredentials) {\n\t request.withCredentials = true;\n\t }\n\t\n\t // Add responseType to request if needed\n\t if (config.responseType) {\n\t try {\n\t request.responseType = config.responseType;\n\t } catch (e) {\n\t // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n\t // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n\t if (config.responseType !== 'json') {\n\t throw e;\n\t }\n\t }\n\t }\n\t\n\t // Handle progress if needed\n\t if (typeof config.onDownloadProgress === 'function') {\n\t request.addEventListener('progress', config.onDownloadProgress);\n\t }\n\t\n\t // Not all browsers support upload events\n\t if (typeof config.onUploadProgress === 'function' && request.upload) {\n\t request.upload.addEventListener('progress', config.onUploadProgress);\n\t }\n\t\n\t if (config.cancelToken) {\n\t // Handle cancellation\n\t config.cancelToken.promise.then(function onCanceled(cancel) {\n\t if (!request) {\n\t return;\n\t }\n\t\n\t request.abort();\n\t reject(cancel);\n\t // Clean up request\n\t request = null;\n\t });\n\t }\n\t\n\t if (requestData === undefined) {\n\t requestData = null;\n\t }\n\t\n\t // Send the request\n\t request.send(requestData);\n\t });\n\t};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar createError = __webpack_require__(10);\n\t\n\t/**\n\t * Resolve or reject a Promise based on response status.\n\t *\n\t * @param {Function} resolve A function that resolves the promise.\n\t * @param {Function} reject A function that rejects the promise.\n\t * @param {object} response The response.\n\t */\n\tmodule.exports = function settle(resolve, reject, response) {\n\t var validateStatus = response.config.validateStatus;\n\t // Note: status is not exposed by XDomainRequest\n\t if (!response.status || !validateStatus || validateStatus(response.status)) {\n\t resolve(response);\n\t } else {\n\t reject(createError(\n\t 'Request failed with status code ' + response.status,\n\t response.config,\n\t null,\n\t response.request,\n\t response\n\t ));\n\t }\n\t};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar enhanceError = __webpack_require__(11);\n\t\n\t/**\n\t * Create an Error with the specified message, config, error code, request and response.\n\t *\n\t * @param {string} message The error message.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The created error.\n\t */\n\tmodule.exports = function createError(message, config, code, request, response) {\n\t var error = new Error(message);\n\t return enhanceError(error, config, code, request, response);\n\t};\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Update an Error with the specified config, error code, and response.\n\t *\n\t * @param {Error} error The error to update.\n\t * @param {Object} config The config.\n\t * @param {string} [code] The error code (for example, 'ECONNABORTED').\n\t * @param {Object} [request] The request.\n\t * @param {Object} [response] The response.\n\t * @returns {Error} The error.\n\t */\n\tmodule.exports = function enhanceError(error, config, code, request, response) {\n\t error.config = config;\n\t if (code) {\n\t error.code = code;\n\t }\n\t error.request = request;\n\t error.response = response;\n\t return error;\n\t};\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\tfunction encode(val) {\n\t return encodeURIComponent(val).\n\t replace(/%40/gi, '@').\n\t replace(/%3A/gi, ':').\n\t replace(/%24/g, '$').\n\t replace(/%2C/gi, ',').\n\t replace(/%20/g, '+').\n\t replace(/%5B/gi, '[').\n\t replace(/%5D/gi, ']');\n\t}\n\t\n\t/**\n\t * Build a URL by appending params to the end\n\t *\n\t * @param {string} url The base of the url (e.g., http://www.google.com)\n\t * @param {object} [params] The params to be appended\n\t * @returns {string} The formatted url\n\t */\n\tmodule.exports = function buildURL(url, params, paramsSerializer) {\n\t /*eslint no-param-reassign:0*/\n\t if (!params) {\n\t return url;\n\t }\n\t\n\t var serializedParams;\n\t if (paramsSerializer) {\n\t serializedParams = paramsSerializer(params);\n\t } else if (utils.isURLSearchParams(params)) {\n\t serializedParams = params.toString();\n\t } else {\n\t var parts = [];\n\t\n\t utils.forEach(params, function serialize(val, key) {\n\t if (val === null || typeof val === 'undefined') {\n\t return;\n\t }\n\t\n\t if (utils.isArray(val)) {\n\t key = key + '[]';\n\t } else {\n\t val = [val];\n\t }\n\t\n\t utils.forEach(val, function parseValue(v) {\n\t if (utils.isDate(v)) {\n\t v = v.toISOString();\n\t } else if (utils.isObject(v)) {\n\t v = JSON.stringify(v);\n\t }\n\t parts.push(encode(key) + '=' + encode(v));\n\t });\n\t });\n\t\n\t serializedParams = parts.join('&');\n\t }\n\t\n\t if (serializedParams) {\n\t url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n\t }\n\t\n\t return url;\n\t};\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\t// Headers whose duplicates are ignored by node\n\t// c.f. https://nodejs.org/api/http.html#http_message_headers\n\tvar ignoreDuplicateOf = [\n\t 'age', 'authorization', 'content-length', 'content-type', 'etag',\n\t 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n\t 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n\t 'referer', 'retry-after', 'user-agent'\n\t];\n\t\n\t/**\n\t * Parse headers into an object\n\t *\n\t * ```\n\t * Date: Wed, 27 Aug 2014 08:58:49 GMT\n\t * Content-Type: application/json\n\t * Connection: keep-alive\n\t * Transfer-Encoding: chunked\n\t * ```\n\t *\n\t * @param {String} headers Headers needing to be parsed\n\t * @returns {Object} Headers parsed into an object\n\t */\n\tmodule.exports = function parseHeaders(headers) {\n\t var parsed = {};\n\t var key;\n\t var val;\n\t var i;\n\t\n\t if (!headers) { return parsed; }\n\t\n\t utils.forEach(headers.split('\\n'), function parser(line) {\n\t i = line.indexOf(':');\n\t key = utils.trim(line.substr(0, i)).toLowerCase();\n\t val = utils.trim(line.substr(i + 1));\n\t\n\t if (key) {\n\t if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n\t return;\n\t }\n\t if (key === 'set-cookie') {\n\t parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n\t } else {\n\t parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n\t }\n\t }\n\t });\n\t\n\t return parsed;\n\t};\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs have full support of the APIs needed to test\n\t // whether the request URL is of the same origin as current location.\n\t (function standardBrowserEnv() {\n\t var msie = /(msie|trident)/i.test(navigator.userAgent);\n\t var urlParsingNode = document.createElement('a');\n\t var originURL;\n\t\n\t /**\n\t * Parse a URL to discover it's components\n\t *\n\t * @param {String} url The URL to be parsed\n\t * @returns {Object}\n\t */\n\t function resolveURL(url) {\n\t var href = url;\n\t\n\t if (msie) {\n\t // IE needs attribute set twice to normalize properties\n\t urlParsingNode.setAttribute('href', href);\n\t href = urlParsingNode.href;\n\t }\n\t\n\t urlParsingNode.setAttribute('href', href);\n\t\n\t // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n\t return {\n\t href: urlParsingNode.href,\n\t protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n\t host: urlParsingNode.host,\n\t search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n\t hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n\t hostname: urlParsingNode.hostname,\n\t port: urlParsingNode.port,\n\t pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n\t urlParsingNode.pathname :\n\t '/' + urlParsingNode.pathname\n\t };\n\t }\n\t\n\t originURL = resolveURL(window.location.href);\n\t\n\t /**\n\t * Determine if a URL shares the same origin as the current location\n\t *\n\t * @param {String} requestURL The URL to test\n\t * @returns {boolean} True if URL shares the same origin, otherwise false\n\t */\n\t return function isURLSameOrigin(requestURL) {\n\t var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n\t return (parsed.protocol === originURL.protocol &&\n\t parsed.host === originURL.host);\n\t };\n\t })() :\n\t\n\t // Non standard browser envs (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return function isURLSameOrigin() {\n\t return true;\n\t };\n\t })()\n\t);\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\t\n\tvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\t\n\tfunction E() {\n\t this.message = 'String contains an invalid character';\n\t}\n\tE.prototype = new Error;\n\tE.prototype.code = 5;\n\tE.prototype.name = 'InvalidCharacterError';\n\t\n\tfunction btoa(input) {\n\t var str = String(input);\n\t var output = '';\n\t for (\n\t // initialize result and counter\n\t var block, charCode, idx = 0, map = chars;\n\t // if the next str index does not exist:\n\t // change the mapping table to \"=\"\n\t // check if d has no fractional digits\n\t str.charAt(idx | 0) || (map = '=', idx % 1);\n\t // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n\t output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n\t ) {\n\t charCode = str.charCodeAt(idx += 3 / 4);\n\t if (charCode > 0xFF) {\n\t throw new E();\n\t }\n\t block = block << 8 | charCode;\n\t }\n\t return output;\n\t}\n\t\n\tmodule.exports = btoa;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\tmodule.exports = (\n\t utils.isStandardBrowserEnv() ?\n\t\n\t // Standard browser envs support document.cookie\n\t (function standardBrowserEnv() {\n\t return {\n\t write: function write(name, value, expires, path, domain, secure) {\n\t var cookie = [];\n\t cookie.push(name + '=' + encodeURIComponent(value));\n\t\n\t if (utils.isNumber(expires)) {\n\t cookie.push('expires=' + new Date(expires).toGMTString());\n\t }\n\t\n\t if (utils.isString(path)) {\n\t cookie.push('path=' + path);\n\t }\n\t\n\t if (utils.isString(domain)) {\n\t cookie.push('domain=' + domain);\n\t }\n\t\n\t if (secure === true) {\n\t cookie.push('secure');\n\t }\n\t\n\t document.cookie = cookie.join('; ');\n\t },\n\t\n\t read: function read(name) {\n\t var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n\t return (match ? decodeURIComponent(match[3]) : null);\n\t },\n\t\n\t remove: function remove(name) {\n\t this.write(name, '', Date.now() - 86400000);\n\t }\n\t };\n\t })() :\n\t\n\t // Non standard browser env (web workers, react-native) lack needed support.\n\t (function nonStandardBrowserEnv() {\n\t return {\n\t write: function write() {},\n\t read: function read() { return null; },\n\t remove: function remove() {}\n\t };\n\t })()\n\t);\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\tfunction InterceptorManager() {\n\t this.handlers = [];\n\t}\n\t\n\t/**\n\t * Add a new interceptor to the stack\n\t *\n\t * @param {Function} fulfilled The function to handle `then` for a `Promise`\n\t * @param {Function} rejected The function to handle `reject` for a `Promise`\n\t *\n\t * @return {Number} An ID used to remove interceptor later\n\t */\n\tInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n\t this.handlers.push({\n\t fulfilled: fulfilled,\n\t rejected: rejected\n\t });\n\t return this.handlers.length - 1;\n\t};\n\t\n\t/**\n\t * Remove an interceptor from the stack\n\t *\n\t * @param {Number} id The ID that was returned by `use`\n\t */\n\tInterceptorManager.prototype.eject = function eject(id) {\n\t if (this.handlers[id]) {\n\t this.handlers[id] = null;\n\t }\n\t};\n\t\n\t/**\n\t * Iterate over all the registered interceptors\n\t *\n\t * This method is particularly useful for skipping over any\n\t * interceptors that may have become `null` calling `eject`.\n\t *\n\t * @param {Function} fn The function to call for each interceptor\n\t */\n\tInterceptorManager.prototype.forEach = function forEach(fn) {\n\t utils.forEach(this.handlers, function forEachHandler(h) {\n\t if (h !== null) {\n\t fn(h);\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = InterceptorManager;\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\tvar transformData = __webpack_require__(19);\n\tvar isCancel = __webpack_require__(20);\n\tvar defaults = __webpack_require__(6);\n\tvar isAbsoluteURL = __webpack_require__(21);\n\tvar combineURLs = __webpack_require__(22);\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tfunction throwIfCancellationRequested(config) {\n\t if (config.cancelToken) {\n\t config.cancelToken.throwIfRequested();\n\t }\n\t}\n\t\n\t/**\n\t * Dispatch a request to the server using the configured adapter.\n\t *\n\t * @param {object} config The config that is to be used for the request\n\t * @returns {Promise} The Promise to be fulfilled\n\t */\n\tmodule.exports = function dispatchRequest(config) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Support baseURL config\n\t if (config.baseURL && !isAbsoluteURL(config.url)) {\n\t config.url = combineURLs(config.baseURL, config.url);\n\t }\n\t\n\t // Ensure headers exist\n\t config.headers = config.headers || {};\n\t\n\t // Transform request data\n\t config.data = transformData(\n\t config.data,\n\t config.headers,\n\t config.transformRequest\n\t );\n\t\n\t // Flatten headers\n\t config.headers = utils.merge(\n\t config.headers.common || {},\n\t config.headers[config.method] || {},\n\t config.headers || {}\n\t );\n\t\n\t utils.forEach(\n\t ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n\t function cleanHeaderConfig(method) {\n\t delete config.headers[method];\n\t }\n\t );\n\t\n\t var adapter = config.adapter || defaults.adapter;\n\t\n\t return adapter(config).then(function onAdapterResolution(response) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t response.data = transformData(\n\t response.data,\n\t response.headers,\n\t config.transformResponse\n\t );\n\t\n\t return response;\n\t }, function onAdapterRejection(reason) {\n\t if (!isCancel(reason)) {\n\t throwIfCancellationRequested(config);\n\t\n\t // Transform response data\n\t if (reason && reason.response) {\n\t reason.response.data = transformData(\n\t reason.response.data,\n\t reason.response.headers,\n\t config.transformResponse\n\t );\n\t }\n\t }\n\t\n\t return Promise.reject(reason);\n\t });\n\t};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar utils = __webpack_require__(2);\n\t\n\t/**\n\t * Transform the data for a request or a response\n\t *\n\t * @param {Object|String} data The data to be transformed\n\t * @param {Array} headers The headers for the request or response\n\t * @param {Array|Function} fns A single function or Array of functions\n\t * @returns {*} The resulting transformed data\n\t */\n\tmodule.exports = function transformData(data, headers, fns) {\n\t /*eslint no-param-reassign:0*/\n\t utils.forEach(fns, function transform(fn) {\n\t data = fn(data, headers);\n\t });\n\t\n\t return data;\n\t};\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = function isCancel(value) {\n\t return !!(value && value.__CANCEL__);\n\t};\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Determines whether the specified URL is absolute\n\t *\n\t * @param {string} url The URL to test\n\t * @returns {boolean} True if the specified URL is absolute, otherwise false\n\t */\n\tmodule.exports = function isAbsoluteURL(url) {\n\t // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n\t // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n\t // by any combination of letters, digits, plus, period, or hyphen.\n\t return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n\t};\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Creates a new URL by combining the specified URLs\n\t *\n\t * @param {string} baseURL The base URL\n\t * @param {string} relativeURL The relative URL\n\t * @returns {string} The combined URL\n\t */\n\tmodule.exports = function combineURLs(baseURL, relativeURL) {\n\t return relativeURL\n\t ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n\t : baseURL;\n\t};\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * A `Cancel` is an object that is thrown when an operation is canceled.\n\t *\n\t * @class\n\t * @param {string=} message The message.\n\t */\n\tfunction Cancel(message) {\n\t this.message = message;\n\t}\n\t\n\tCancel.prototype.toString = function toString() {\n\t return 'Cancel' + (this.message ? ': ' + this.message : '');\n\t};\n\t\n\tCancel.prototype.__CANCEL__ = true;\n\t\n\tmodule.exports = Cancel;\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar Cancel = __webpack_require__(23);\n\t\n\t/**\n\t * A `CancelToken` is an object that can be used to request cancellation of an operation.\n\t *\n\t * @class\n\t * @param {Function} executor The executor function.\n\t */\n\tfunction CancelToken(executor) {\n\t if (typeof executor !== 'function') {\n\t throw new TypeError('executor must be a function.');\n\t }\n\t\n\t var resolvePromise;\n\t this.promise = new Promise(function promiseExecutor(resolve) {\n\t resolvePromise = resolve;\n\t });\n\t\n\t var token = this;\n\t executor(function cancel(message) {\n\t if (token.reason) {\n\t // Cancellation has already been requested\n\t return;\n\t }\n\t\n\t token.reason = new Cancel(message);\n\t resolvePromise(token.reason);\n\t });\n\t}\n\t\n\t/**\n\t * Throws a `Cancel` if cancellation has been requested.\n\t */\n\tCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n\t if (this.reason) {\n\t throw this.reason;\n\t }\n\t};\n\t\n\t/**\n\t * Returns an object that contains a new `CancelToken` and a function that, when called,\n\t * cancels the `CancelToken`.\n\t */\n\tCancelToken.source = function source() {\n\t var cancel;\n\t var token = new CancelToken(function executor(c) {\n\t cancel = c;\n\t });\n\t return {\n\t token: token,\n\t cancel: cancel\n\t };\n\t};\n\t\n\tmodule.exports = CancelToken;\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\n\t'use strict';\n\t\n\t/**\n\t * Syntactic sugar for invoking a function and expanding an array for arguments.\n\t *\n\t * Common use case would be to use `Function.prototype.apply`.\n\t *\n\t * ```js\n\t * function f(x, y, z) {}\n\t * var args = [1, 2, 3];\n\t * f.apply(null, args);\n\t * ```\n\t *\n\t * With `spread` this example can be re-written.\n\t *\n\t * ```js\n\t * spread(function(x, y, z) {})([1, 2, 3]);\n\t * ```\n\t *\n\t * @param {Function} callback\n\t * @returns {Function}\n\t */\n\tmodule.exports = function spread(callback) {\n\t return function wrap(arr) {\n\t return callback.apply(null, arr);\n\t };\n\t};\n\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// axios.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap dad8263224c86c166a30","module.exports = require('./lib/axios');\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./index.js\n// module id = 0\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/axios.js\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar bind = require('./helpers/bind');\nvar isBuffer = require('is-buffer');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/utils.js\n// module id = 2\n// module chunks = 0","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/bind.js\n// module id = 3\n// module chunks = 0","/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/is-buffer/index.js\n// module id = 4\n// module chunks = 0","'use strict';\n\nvar defaults = require('./../defaults');\nvar utils = require('./../utils');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/Axios.js\n// module id = 5\n// module chunks = 0","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/defaults.js\n// module id = 6\n// module chunks = 0","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/normalizeHeaderName.js\n// module id = 7\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n var loadEvent = 'onreadystatechange';\n var xDomain = false;\n\n // For IE 8/9 CORS support\n // Only supports POST and GET calls and doesn't returns the response headers.\n // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest.\n if (process.env.NODE_ENV !== 'test' &&\n typeof window !== 'undefined' &&\n window.XDomainRequest && !('withCredentials' in request) &&\n !isURLSameOrigin(config.url)) {\n request = new window.XDomainRequest();\n loadEvent = 'onload';\n xDomain = true;\n request.onprogress = function handleProgress() {};\n request.ontimeout = function handleTimeout() {};\n }\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request[loadEvent] = function handleLoad() {\n if (!request || (request.readyState !== 4 && !xDomain)) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201)\n status: request.status === 1223 ? 204 : request.status,\n statusText: request.status === 1223 ? 'No Content' : request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/adapters/xhr.js\n// module id = 8\n// module chunks = 0","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/settle.js\n// module id = 9\n// module chunks = 0","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/createError.js\n// module id = 10\n// module chunks = 0","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/enhanceError.js\n// module id = 11\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/buildURL.js\n// module id = 12\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/parseHeaders.js\n// module id = 13\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/isURLSameOrigin.js\n// module id = 14\n// module chunks = 0","'use strict';\n\n// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js\n\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\nfunction E() {\n this.message = 'String contains an invalid character';\n}\nE.prototype = new Error;\nE.prototype.code = 5;\nE.prototype.name = 'InvalidCharacterError';\n\nfunction btoa(input) {\n var str = String(input);\n var output = '';\n for (\n // initialize result and counter\n var block, charCode, idx = 0, map = chars;\n // if the next str index does not exist:\n // change the mapping table to \"=\"\n // check if d has no fractional digits\n str.charAt(idx | 0) || (map = '=', idx % 1);\n // \"8 - idx % 1 * 8\" generates the sequence 2, 4, 6, 8\n output += map.charAt(63 & block >> 8 - idx % 1 * 8)\n ) {\n charCode = str.charCodeAt(idx += 3 / 4);\n if (charCode > 0xFF) {\n throw new E();\n }\n block = block << 8 | charCode;\n }\n return output;\n}\n\nmodule.exports = btoa;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/btoa.js\n// module id = 15\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/cookies.js\n// module id = 16\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/InterceptorManager.js\n// module id = 17\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar isAbsoluteURL = require('./../helpers/isAbsoluteURL');\nvar combineURLs = require('./../helpers/combineURLs');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/dispatchRequest.js\n// module id = 18\n// module chunks = 0","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/core/transformData.js\n// module id = 19\n// module chunks = 0","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/isCancel.js\n// module id = 20\n// module chunks = 0","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/isAbsoluteURL.js\n// module id = 21\n// module chunks = 0","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/combineURLs.js\n// module id = 22\n// module chunks = 0","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/Cancel.js\n// module id = 23\n// module chunks = 0","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/cancel/CancelToken.js\n// module id = 24\n// module chunks = 0","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./lib/helpers/spread.js\n// module id = 25\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/electron/src/node_modules/axios/index.d.ts b/electron/src/node_modules/axios/index.d.ts deleted file mode 100755 index 403fd1a..0000000 --- a/electron/src/node_modules/axios/index.d.ts +++ /dev/null @@ -1,131 +0,0 @@ -export interface AxiosTransformer { - (data: any, headers?: any): any; -} - -export interface AxiosAdapter { - (config: AxiosRequestConfig): AxiosPromise; -} - -export interface AxiosBasicCredentials { - username: string; - password: string; -} - -export interface AxiosProxyConfig { - host: string; - port: number; - auth?: { - username: string; - password:string; - } -} - -export interface AxiosRequestConfig { - url?: string; - method?: string; - baseURL?: string; - transformRequest?: AxiosTransformer | AxiosTransformer[]; - transformResponse?: AxiosTransformer | AxiosTransformer[]; - headers?: any; - params?: any; - paramsSerializer?: (params: any) => string; - data?: any; - timeout?: number; - withCredentials?: boolean; - adapter?: AxiosAdapter; - auth?: AxiosBasicCredentials; - responseType?: string; - xsrfCookieName?: string; - xsrfHeaderName?: string; - onUploadProgress?: (progressEvent: any) => void; - onDownloadProgress?: (progressEvent: any) => void; - maxContentLength?: number; - validateStatus?: (status: number) => boolean; - maxRedirects?: number; - httpAgent?: any; - httpsAgent?: any; - proxy?: AxiosProxyConfig | false; - cancelToken?: CancelToken; -} - -export interface AxiosResponse { - data: T; - status: number; - statusText: string; - headers: any; - config: AxiosRequestConfig; - request?: any; -} - -export interface AxiosError extends Error { - config: AxiosRequestConfig; - code?: string; - request?: any; - response?: AxiosResponse; -} - -export interface AxiosPromise extends Promise> { -} - -export interface CancelStatic { - new (message?: string): Cancel; -} - -export interface Cancel { - message: string; -} - -export interface Canceler { - (message?: string): void; -} - -export interface CancelTokenStatic { - new (executor: (cancel: Canceler) => void): CancelToken; - source(): CancelTokenSource; -} - -export interface CancelToken { - promise: Promise; - reason?: Cancel; - throwIfRequested(): void; -} - -export interface CancelTokenSource { - token: CancelToken; - cancel: Canceler; -} - -export interface AxiosInterceptorManager { - use(onFulfilled?: (value: V) => V | Promise, onRejected?: (error: any) => any): number; - eject(id: number): void; -} - -export interface AxiosInstance { - (config: AxiosRequestConfig): AxiosPromise; - (url: string, config?: AxiosRequestConfig): AxiosPromise; - defaults: AxiosRequestConfig; - interceptors: { - request: AxiosInterceptorManager; - response: AxiosInterceptorManager; - }; - request(config: AxiosRequestConfig): AxiosPromise; - get(url: string, config?: AxiosRequestConfig): AxiosPromise; - delete(url: string, config?: AxiosRequestConfig): AxiosPromise; - head(url: string, config?: AxiosRequestConfig): AxiosPromise; - post(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise; - put(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise; - patch(url: string, data?: any, config?: AxiosRequestConfig): AxiosPromise; -} - -export interface AxiosStatic extends AxiosInstance { - create(config?: AxiosRequestConfig): AxiosInstance; - Cancel: CancelStatic; - CancelToken: CancelTokenStatic; - isCancel(value: any): boolean; - all(values: (T | Promise)[]): Promise; - spread(callback: (...args: T[]) => R): (array: T[]) => R; -} - -declare const Axios: AxiosStatic; - -export default Axios; diff --git a/electron/src/node_modules/axios/index.js b/electron/src/node_modules/axios/index.js deleted file mode 100755 index 79dfd09..0000000 --- a/electron/src/node_modules/axios/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/axios'); \ No newline at end of file diff --git a/electron/src/node_modules/axios/lib/adapters/README.md b/electron/src/node_modules/axios/lib/adapters/README.md deleted file mode 100755 index 68f1118..0000000 --- a/electron/src/node_modules/axios/lib/adapters/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# axios // adapters - -The modules under `adapters/` are modules that handle dispatching a request and settling a returned `Promise` once a response is received. - -## Example - -```js -var settle = require('./../core/settle'); - -module.exports = function myAdapter(config) { - // At this point: - // - config has been merged with defaults - // - request transformers have already run - // - request interceptors have already run - - // Make the request using config provided - // Upon response settle the Promise - - return new Promise(function(resolve, reject) { - - var response = { - data: responseData, - status: request.status, - statusText: request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // From here: - // - response transformers will run - // - response interceptors will run - }); -} -``` diff --git a/electron/src/node_modules/axios/lib/adapters/http.js b/electron/src/node_modules/axios/lib/adapters/http.js deleted file mode 100755 index b986487..0000000 --- a/electron/src/node_modules/axios/lib/adapters/http.js +++ /dev/null @@ -1,237 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); -var settle = require('./../core/settle'); -var buildURL = require('./../helpers/buildURL'); -var http = require('http'); -var https = require('https'); -var httpFollow = require('follow-redirects').http; -var httpsFollow = require('follow-redirects').https; -var url = require('url'); -var zlib = require('zlib'); -var pkg = require('./../../package.json'); -var createError = require('../core/createError'); -var enhanceError = require('../core/enhanceError'); - -/*eslint consistent-return:0*/ -module.exports = function httpAdapter(config) { - return new Promise(function dispatchHttpRequest(resolve, reject) { - var data = config.data; - var headers = config.headers; - var timer; - - // Set User-Agent (required by some servers) - // Only set header if it hasn't been set in config - // See https://github.com/axios/axios/issues/69 - if (!headers['User-Agent'] && !headers['user-agent']) { - headers['User-Agent'] = 'axios/' + pkg.version; - } - - if (data && !utils.isStream(data)) { - if (Buffer.isBuffer(data)) { - // Nothing to do... - } else if (utils.isArrayBuffer(data)) { - data = new Buffer(new Uint8Array(data)); - } else if (utils.isString(data)) { - data = new Buffer(data, 'utf-8'); - } else { - return reject(createError( - 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream', - config - )); - } - - // Add Content-Length header if data exists - headers['Content-Length'] = data.length; - } - - // HTTP basic authentication - var auth = undefined; - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - auth = username + ':' + password; - } - - // Parse url - var parsed = url.parse(config.url); - var protocol = parsed.protocol || 'http:'; - - if (!auth && parsed.auth) { - var urlAuth = parsed.auth.split(':'); - var urlUsername = urlAuth[0] || ''; - var urlPassword = urlAuth[1] || ''; - auth = urlUsername + ':' + urlPassword; - } - - if (auth) { - delete headers.Authorization; - } - - var isHttps = protocol === 'https:'; - var agent = isHttps ? config.httpsAgent : config.httpAgent; - - var options = { - path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''), - method: config.method, - headers: headers, - agent: agent, - auth: auth - }; - - if (config.socketPath) { - options.socketPath = config.socketPath; - } else { - options.hostname = parsed.hostname; - options.port = parsed.port; - } - - var proxy = config.proxy; - if (!proxy && proxy !== false) { - var proxyEnv = protocol.slice(0, -1) + '_proxy'; - var proxyUrl = process.env[proxyEnv] || process.env[proxyEnv.toUpperCase()]; - if (proxyUrl) { - var parsedProxyUrl = url.parse(proxyUrl); - proxy = { - host: parsedProxyUrl.hostname, - port: parsedProxyUrl.port - }; - - if (parsedProxyUrl.auth) { - var proxyUrlAuth = parsedProxyUrl.auth.split(':'); - proxy.auth = { - username: proxyUrlAuth[0], - password: proxyUrlAuth[1] - }; - } - } - } - - if (proxy) { - options.hostname = proxy.host; - options.host = proxy.host; - options.headers.host = parsed.hostname + (parsed.port ? ':' + parsed.port : ''); - options.port = proxy.port; - options.path = protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path; - - // Basic proxy authorization - if (proxy.auth) { - var base64 = new Buffer(proxy.auth.username + ':' + proxy.auth.password, 'utf8').toString('base64'); - options.headers['Proxy-Authorization'] = 'Basic ' + base64; - } - } - - var transport; - if (config.transport) { - transport = config.transport; - } else if (config.maxRedirects === 0) { - transport = isHttps ? https : http; - } else { - if (config.maxRedirects) { - options.maxRedirects = config.maxRedirects; - } - transport = isHttps ? httpsFollow : httpFollow; - } - - if (config.maxContentLength && config.maxContentLength > -1) { - options.maxBodyLength = config.maxContentLength; - } - - // Create the request - var req = transport.request(options, function handleResponse(res) { - if (req.aborted) return; - - // Response has been received so kill timer that handles request timeout - clearTimeout(timer); - timer = null; - - // uncompress the response body transparently if required - var stream = res; - switch (res.headers['content-encoding']) { - /*eslint default-case:0*/ - case 'gzip': - case 'compress': - case 'deflate': - // add the unzipper to the body stream processing pipeline - stream = stream.pipe(zlib.createUnzip()); - - // remove the content-encoding in order to not confuse downstream operations - delete res.headers['content-encoding']; - break; - } - - // return the last request in case of redirects - var lastRequest = res.req || req; - - var response = { - status: res.statusCode, - statusText: res.statusMessage, - headers: res.headers, - config: config, - request: lastRequest - }; - - if (config.responseType === 'stream') { - response.data = stream; - settle(resolve, reject, response); - } else { - var responseBuffer = []; - stream.on('data', function handleStreamData(chunk) { - responseBuffer.push(chunk); - - // make sure the content length is not over the maxContentLength if specified - if (config.maxContentLength > -1 && Buffer.concat(responseBuffer).length > config.maxContentLength) { - reject(createError('maxContentLength size of ' + config.maxContentLength + ' exceeded', - config, null, lastRequest)); - } - }); - - stream.on('error', function handleStreamError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, lastRequest)); - }); - - stream.on('end', function handleStreamEnd() { - var responseData = Buffer.concat(responseBuffer); - if (config.responseType !== 'arraybuffer') { - responseData = responseData.toString('utf8'); - } - - response.data = responseData; - settle(resolve, reject, response); - }); - } - }); - - // Handle errors - req.on('error', function handleRequestError(err) { - if (req.aborted) return; - reject(enhanceError(err, config, null, req)); - }); - - // Handle request timeout - if (config.timeout && !timer) { - timer = setTimeout(function handleRequestTimeout() { - req.abort(); - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', req)); - }, config.timeout); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (req.aborted) return; - - req.abort(); - reject(cancel); - }); - } - - // Send the request - if (utils.isStream(data)) { - data.pipe(req); - } else { - req.end(data); - } - }); -}; diff --git a/electron/src/node_modules/axios/lib/adapters/xhr.js b/electron/src/node_modules/axios/lib/adapters/xhr.js deleted file mode 100755 index 81364bd..0000000 --- a/electron/src/node_modules/axios/lib/adapters/xhr.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); -var settle = require('./../core/settle'); -var buildURL = require('./../helpers/buildURL'); -var parseHeaders = require('./../helpers/parseHeaders'); -var isURLSameOrigin = require('./../helpers/isURLSameOrigin'); -var createError = require('../core/createError'); -var btoa = (typeof window !== 'undefined' && window.btoa && window.btoa.bind(window)) || require('./../helpers/btoa'); - -module.exports = function xhrAdapter(config) { - return new Promise(function dispatchXhrRequest(resolve, reject) { - var requestData = config.data; - var requestHeaders = config.headers; - - if (utils.isFormData(requestData)) { - delete requestHeaders['Content-Type']; // Let the browser set it - } - - var request = new XMLHttpRequest(); - var loadEvent = 'onreadystatechange'; - var xDomain = false; - - // For IE 8/9 CORS support - // Only supports POST and GET calls and doesn't returns the response headers. - // DON'T do this for testing b/c XMLHttpRequest is mocked, not XDomainRequest. - if (process.env.NODE_ENV !== 'test' && - typeof window !== 'undefined' && - window.XDomainRequest && !('withCredentials' in request) && - !isURLSameOrigin(config.url)) { - request = new window.XDomainRequest(); - loadEvent = 'onload'; - xDomain = true; - request.onprogress = function handleProgress() {}; - request.ontimeout = function handleTimeout() {}; - } - - // HTTP basic authentication - if (config.auth) { - var username = config.auth.username || ''; - var password = config.auth.password || ''; - requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); - } - - request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true); - - // Set the request timeout in MS - request.timeout = config.timeout; - - // Listen for ready state - request[loadEvent] = function handleLoad() { - if (!request || (request.readyState !== 4 && !xDomain)) { - return; - } - - // The request errored out and we didn't get a response, this will be - // handled by onerror instead - // With one exception: request that using file: protocol, most browsers - // will return status as 0 even though it's a successful request - if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { - return; - } - - // Prepare the response - var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; - var response = { - data: responseData, - // IE sends 1223 instead of 204 (https://github.com/axios/axios/issues/201) - status: request.status === 1223 ? 204 : request.status, - statusText: request.status === 1223 ? 'No Content' : request.statusText, - headers: responseHeaders, - config: config, - request: request - }; - - settle(resolve, reject, response); - - // Clean up request - request = null; - }; - - // Handle low level network errors - request.onerror = function handleError() { - // Real errors are hidden from us by the browser - // onerror should only fire if it's a network error - reject(createError('Network Error', config, null, request)); - - // Clean up request - request = null; - }; - - // Handle timeout - request.ontimeout = function handleTimeout() { - reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED', - request)); - - // Clean up request - request = null; - }; - - // Add xsrf header - // This is only done if running in a standard browser environment. - // Specifically not if we're in a web worker, or react-native. - if (utils.isStandardBrowserEnv()) { - var cookies = require('./../helpers/cookies'); - - // Add xsrf header - var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ? - cookies.read(config.xsrfCookieName) : - undefined; - - if (xsrfValue) { - requestHeaders[config.xsrfHeaderName] = xsrfValue; - } - } - - // Add headers to the request - if ('setRequestHeader' in request) { - utils.forEach(requestHeaders, function setRequestHeader(val, key) { - if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { - // Remove Content-Type if data is undefined - delete requestHeaders[key]; - } else { - // Otherwise add header to the request - request.setRequestHeader(key, val); - } - }); - } - - // Add withCredentials to request if needed - if (config.withCredentials) { - request.withCredentials = true; - } - - // Add responseType to request if needed - if (config.responseType) { - try { - request.responseType = config.responseType; - } catch (e) { - // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2. - // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function. - if (config.responseType !== 'json') { - throw e; - } - } - } - - // Handle progress if needed - if (typeof config.onDownloadProgress === 'function') { - request.addEventListener('progress', config.onDownloadProgress); - } - - // Not all browsers support upload events - if (typeof config.onUploadProgress === 'function' && request.upload) { - request.upload.addEventListener('progress', config.onUploadProgress); - } - - if (config.cancelToken) { - // Handle cancellation - config.cancelToken.promise.then(function onCanceled(cancel) { - if (!request) { - return; - } - - request.abort(); - reject(cancel); - // Clean up request - request = null; - }); - } - - if (requestData === undefined) { - requestData = null; - } - - // Send the request - request.send(requestData); - }); -}; diff --git a/electron/src/node_modules/axios/lib/axios.js b/electron/src/node_modules/axios/lib/axios.js deleted file mode 100755 index ed1f519..0000000 --- a/electron/src/node_modules/axios/lib/axios.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var utils = require('./utils'); -var bind = require('./helpers/bind'); -var Axios = require('./core/Axios'); -var defaults = require('./defaults'); - -/** - * Create an instance of Axios - * - * @param {Object} defaultConfig The default config for the instance - * @return {Axios} A new instance of Axios - */ -function createInstance(defaultConfig) { - var context = new Axios(defaultConfig); - var instance = bind(Axios.prototype.request, context); - - // Copy axios.prototype to instance - utils.extend(instance, Axios.prototype, context); - - // Copy context to instance - utils.extend(instance, context); - - return instance; -} - -// Create the default instance to be exported -var axios = createInstance(defaults); - -// Expose Axios class to allow class inheritance -axios.Axios = Axios; - -// Factory for creating new instances -axios.create = function create(instanceConfig) { - return createInstance(utils.merge(defaults, instanceConfig)); -}; - -// Expose Cancel & CancelToken -axios.Cancel = require('./cancel/Cancel'); -axios.CancelToken = require('./cancel/CancelToken'); -axios.isCancel = require('./cancel/isCancel'); - -// Expose all/spread -axios.all = function all(promises) { - return Promise.all(promises); -}; -axios.spread = require('./helpers/spread'); - -module.exports = axios; - -// Allow use of default import syntax in TypeScript -module.exports.default = axios; diff --git a/electron/src/node_modules/axios/lib/cancel/Cancel.js b/electron/src/node_modules/axios/lib/cancel/Cancel.js deleted file mode 100755 index e0de400..0000000 --- a/electron/src/node_modules/axios/lib/cancel/Cancel.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -/** - * A `Cancel` is an object that is thrown when an operation is canceled. - * - * @class - * @param {string=} message The message. - */ -function Cancel(message) { - this.message = message; -} - -Cancel.prototype.toString = function toString() { - return 'Cancel' + (this.message ? ': ' + this.message : ''); -}; - -Cancel.prototype.__CANCEL__ = true; - -module.exports = Cancel; diff --git a/electron/src/node_modules/axios/lib/cancel/CancelToken.js b/electron/src/node_modules/axios/lib/cancel/CancelToken.js deleted file mode 100755 index 6b46e66..0000000 --- a/electron/src/node_modules/axios/lib/cancel/CancelToken.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; - -var Cancel = require('./Cancel'); - -/** - * A `CancelToken` is an object that can be used to request cancellation of an operation. - * - * @class - * @param {Function} executor The executor function. - */ -function CancelToken(executor) { - if (typeof executor !== 'function') { - throw new TypeError('executor must be a function.'); - } - - var resolvePromise; - this.promise = new Promise(function promiseExecutor(resolve) { - resolvePromise = resolve; - }); - - var token = this; - executor(function cancel(message) { - if (token.reason) { - // Cancellation has already been requested - return; - } - - token.reason = new Cancel(message); - resolvePromise(token.reason); - }); -} - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -CancelToken.prototype.throwIfRequested = function throwIfRequested() { - if (this.reason) { - throw this.reason; - } -}; - -/** - * Returns an object that contains a new `CancelToken` and a function that, when called, - * cancels the `CancelToken`. - */ -CancelToken.source = function source() { - var cancel; - var token = new CancelToken(function executor(c) { - cancel = c; - }); - return { - token: token, - cancel: cancel - }; -}; - -module.exports = CancelToken; diff --git a/electron/src/node_modules/axios/lib/cancel/isCancel.js b/electron/src/node_modules/axios/lib/cancel/isCancel.js deleted file mode 100755 index 051f3ae..0000000 --- a/electron/src/node_modules/axios/lib/cancel/isCancel.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = function isCancel(value) { - return !!(value && value.__CANCEL__); -}; diff --git a/electron/src/node_modules/axios/lib/core/Axios.js b/electron/src/node_modules/axios/lib/core/Axios.js deleted file mode 100755 index d21edbc..0000000 --- a/electron/src/node_modules/axios/lib/core/Axios.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -var defaults = require('./../defaults'); -var utils = require('./../utils'); -var InterceptorManager = require('./InterceptorManager'); -var dispatchRequest = require('./dispatchRequest'); - -/** - * Create a new instance of Axios - * - * @param {Object} instanceConfig The default config for the instance - */ -function Axios(instanceConfig) { - this.defaults = instanceConfig; - this.interceptors = { - request: new InterceptorManager(), - response: new InterceptorManager() - }; -} - -/** - * Dispatch a request - * - * @param {Object} config The config specific for this request (merged with this.defaults) - */ -Axios.prototype.request = function request(config) { - /*eslint no-param-reassign:0*/ - // Allow for axios('example/url'[, config]) a la fetch API - if (typeof config === 'string') { - config = utils.merge({ - url: arguments[0] - }, arguments[1]); - } - - config = utils.merge(defaults, {method: 'get'}, this.defaults, config); - config.method = config.method.toLowerCase(); - - // Hook up interceptors middleware - var chain = [dispatchRequest, undefined]; - var promise = Promise.resolve(config); - - this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { - chain.unshift(interceptor.fulfilled, interceptor.rejected); - }); - - this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { - chain.push(interceptor.fulfilled, interceptor.rejected); - }); - - while (chain.length) { - promise = promise.then(chain.shift(), chain.shift()); - } - - return promise; -}; - -// Provide aliases for supported request methods -utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url - })); - }; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - /*eslint func-names:0*/ - Axios.prototype[method] = function(url, data, config) { - return this.request(utils.merge(config || {}, { - method: method, - url: url, - data: data - })); - }; -}); - -module.exports = Axios; diff --git a/electron/src/node_modules/axios/lib/core/InterceptorManager.js b/electron/src/node_modules/axios/lib/core/InterceptorManager.js deleted file mode 100755 index 50d667b..0000000 --- a/electron/src/node_modules/axios/lib/core/InterceptorManager.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -function InterceptorManager() { - this.handlers = []; -} - -/** - * Add a new interceptor to the stack - * - * @param {Function} fulfilled The function to handle `then` for a `Promise` - * @param {Function} rejected The function to handle `reject` for a `Promise` - * - * @return {Number} An ID used to remove interceptor later - */ -InterceptorManager.prototype.use = function use(fulfilled, rejected) { - this.handlers.push({ - fulfilled: fulfilled, - rejected: rejected - }); - return this.handlers.length - 1; -}; - -/** - * Remove an interceptor from the stack - * - * @param {Number} id The ID that was returned by `use` - */ -InterceptorManager.prototype.eject = function eject(id) { - if (this.handlers[id]) { - this.handlers[id] = null; - } -}; - -/** - * Iterate over all the registered interceptors - * - * This method is particularly useful for skipping over any - * interceptors that may have become `null` calling `eject`. - * - * @param {Function} fn The function to call for each interceptor - */ -InterceptorManager.prototype.forEach = function forEach(fn) { - utils.forEach(this.handlers, function forEachHandler(h) { - if (h !== null) { - fn(h); - } - }); -}; - -module.exports = InterceptorManager; diff --git a/electron/src/node_modules/axios/lib/core/README.md b/electron/src/node_modules/axios/lib/core/README.md deleted file mode 100755 index 253bc48..0000000 --- a/electron/src/node_modules/axios/lib/core/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# axios // core - -The modules found in `core/` should be modules that are specific to the domain logic of axios. These modules would most likely not make sense to be consumed outside of the axios module, as their logic is too specific. Some examples of core modules are: - -- Dispatching requests -- Managing interceptors -- Handling config diff --git a/electron/src/node_modules/axios/lib/core/createError.js b/electron/src/node_modules/axios/lib/core/createError.js deleted file mode 100755 index 933680f..0000000 --- a/electron/src/node_modules/axios/lib/core/createError.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -var enhanceError = require('./enhanceError'); - -/** - * Create an Error with the specified message, config, error code, request and response. - * - * @param {string} message The error message. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The created error. - */ -module.exports = function createError(message, config, code, request, response) { - var error = new Error(message); - return enhanceError(error, config, code, request, response); -}; diff --git a/electron/src/node_modules/axios/lib/core/dispatchRequest.js b/electron/src/node_modules/axios/lib/core/dispatchRequest.js deleted file mode 100755 index 9ea70f2..0000000 --- a/electron/src/node_modules/axios/lib/core/dispatchRequest.js +++ /dev/null @@ -1,86 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); -var transformData = require('./transformData'); -var isCancel = require('../cancel/isCancel'); -var defaults = require('../defaults'); -var isAbsoluteURL = require('./../helpers/isAbsoluteURL'); -var combineURLs = require('./../helpers/combineURLs'); - -/** - * Throws a `Cancel` if cancellation has been requested. - */ -function throwIfCancellationRequested(config) { - if (config.cancelToken) { - config.cancelToken.throwIfRequested(); - } -} - -/** - * Dispatch a request to the server using the configured adapter. - * - * @param {object} config The config that is to be used for the request - * @returns {Promise} The Promise to be fulfilled - */ -module.exports = function dispatchRequest(config) { - throwIfCancellationRequested(config); - - // Support baseURL config - if (config.baseURL && !isAbsoluteURL(config.url)) { - config.url = combineURLs(config.baseURL, config.url); - } - - // Ensure headers exist - config.headers = config.headers || {}; - - // Transform request data - config.data = transformData( - config.data, - config.headers, - config.transformRequest - ); - - // Flatten headers - config.headers = utils.merge( - config.headers.common || {}, - config.headers[config.method] || {}, - config.headers || {} - ); - - utils.forEach( - ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], - function cleanHeaderConfig(method) { - delete config.headers[method]; - } - ); - - var adapter = config.adapter || defaults.adapter; - - return adapter(config).then(function onAdapterResolution(response) { - throwIfCancellationRequested(config); - - // Transform response data - response.data = transformData( - response.data, - response.headers, - config.transformResponse - ); - - return response; - }, function onAdapterRejection(reason) { - if (!isCancel(reason)) { - throwIfCancellationRequested(config); - - // Transform response data - if (reason && reason.response) { - reason.response.data = transformData( - reason.response.data, - reason.response.headers, - config.transformResponse - ); - } - } - - return Promise.reject(reason); - }); -}; diff --git a/electron/src/node_modules/axios/lib/core/enhanceError.js b/electron/src/node_modules/axios/lib/core/enhanceError.js deleted file mode 100755 index 8dfd5b4..0000000 --- a/electron/src/node_modules/axios/lib/core/enhanceError.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -/** - * Update an Error with the specified config, error code, and response. - * - * @param {Error} error The error to update. - * @param {Object} config The config. - * @param {string} [code] The error code (for example, 'ECONNABORTED'). - * @param {Object} [request] The request. - * @param {Object} [response] The response. - * @returns {Error} The error. - */ -module.exports = function enhanceError(error, config, code, request, response) { - error.config = config; - if (code) { - error.code = code; - } - error.request = request; - error.response = response; - return error; -}; diff --git a/electron/src/node_modules/axios/lib/core/settle.js b/electron/src/node_modules/axios/lib/core/settle.js deleted file mode 100755 index 8db5e23..0000000 --- a/electron/src/node_modules/axios/lib/core/settle.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict'; - -var createError = require('./createError'); - -/** - * Resolve or reject a Promise based on response status. - * - * @param {Function} resolve A function that resolves the promise. - * @param {Function} reject A function that rejects the promise. - * @param {object} response The response. - */ -module.exports = function settle(resolve, reject, response) { - var validateStatus = response.config.validateStatus; - // Note: status is not exposed by XDomainRequest - if (!response.status || !validateStatus || validateStatus(response.status)) { - resolve(response); - } else { - reject(createError( - 'Request failed with status code ' + response.status, - response.config, - null, - response.request, - response - )); - } -}; diff --git a/electron/src/node_modules/axios/lib/core/transformData.js b/electron/src/node_modules/axios/lib/core/transformData.js deleted file mode 100755 index e065362..0000000 --- a/electron/src/node_modules/axios/lib/core/transformData.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -/** - * Transform the data for a request or a response - * - * @param {Object|String} data The data to be transformed - * @param {Array} headers The headers for the request or response - * @param {Array|Function} fns A single function or Array of functions - * @returns {*} The resulting transformed data - */ -module.exports = function transformData(data, headers, fns) { - /*eslint no-param-reassign:0*/ - utils.forEach(fns, function transform(fn) { - data = fn(data, headers); - }); - - return data; -}; diff --git a/electron/src/node_modules/axios/lib/defaults.js b/electron/src/node_modules/axios/lib/defaults.js deleted file mode 100755 index 65a25d5..0000000 --- a/electron/src/node_modules/axios/lib/defaults.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -var utils = require('./utils'); -var normalizeHeaderName = require('./helpers/normalizeHeaderName'); - -var DEFAULT_CONTENT_TYPE = { - 'Content-Type': 'application/x-www-form-urlencoded' -}; - -function setContentTypeIfUnset(headers, value) { - if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { - headers['Content-Type'] = value; - } -} - -function getDefaultAdapter() { - var adapter; - if (typeof XMLHttpRequest !== 'undefined') { - // For browsers use XHR adapter - adapter = require('./adapters/xhr'); - } else if (typeof process !== 'undefined') { - // For node use HTTP adapter - adapter = require('./adapters/http'); - } - return adapter; -} - -var defaults = { - adapter: getDefaultAdapter(), - - transformRequest: [function transformRequest(data, headers) { - normalizeHeaderName(headers, 'Content-Type'); - if (utils.isFormData(data) || - utils.isArrayBuffer(data) || - utils.isBuffer(data) || - utils.isStream(data) || - utils.isFile(data) || - utils.isBlob(data) - ) { - return data; - } - if (utils.isArrayBufferView(data)) { - return data.buffer; - } - if (utils.isURLSearchParams(data)) { - setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); - return data.toString(); - } - if (utils.isObject(data)) { - setContentTypeIfUnset(headers, 'application/json;charset=utf-8'); - return JSON.stringify(data); - } - return data; - }], - - transformResponse: [function transformResponse(data) { - /*eslint no-param-reassign:0*/ - if (typeof data === 'string') { - try { - data = JSON.parse(data); - } catch (e) { /* Ignore */ } - } - return data; - }], - - /** - * A timeout in milliseconds to abort a request. If set to 0 (default) a - * timeout is not created. - */ - timeout: 0, - - xsrfCookieName: 'XSRF-TOKEN', - xsrfHeaderName: 'X-XSRF-TOKEN', - - maxContentLength: -1, - - validateStatus: function validateStatus(status) { - return status >= 200 && status < 300; - } -}; - -defaults.headers = { - common: { - 'Accept': 'application/json, text/plain, */*' - } -}; - -utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { - defaults.headers[method] = {}; -}); - -utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { - defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); -}); - -module.exports = defaults; diff --git a/electron/src/node_modules/axios/lib/helpers/README.md b/electron/src/node_modules/axios/lib/helpers/README.md deleted file mode 100755 index 4ae3419..0000000 --- a/electron/src/node_modules/axios/lib/helpers/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# axios // helpers - -The modules found in `helpers/` should be generic modules that are _not_ specific to the domain logic of axios. These modules could theoretically be published to npm on their own and consumed by other modules or apps. Some examples of generic modules are things like: - -- Browser polyfills -- Managing cookies -- Parsing HTTP headers diff --git a/electron/src/node_modules/axios/lib/helpers/bind.js b/electron/src/node_modules/axios/lib/helpers/bind.js deleted file mode 100755 index 6147c60..0000000 --- a/electron/src/node_modules/axios/lib/helpers/bind.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -module.exports = function bind(fn, thisArg) { - return function wrap() { - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - return fn.apply(thisArg, args); - }; -}; diff --git a/electron/src/node_modules/axios/lib/helpers/btoa.js b/electron/src/node_modules/axios/lib/helpers/btoa.js deleted file mode 100755 index 2fe5014..0000000 --- a/electron/src/node_modules/axios/lib/helpers/btoa.js +++ /dev/null @@ -1,36 +0,0 @@ -'use strict'; - -// btoa polyfill for IE<10 courtesy https://github.com/davidchambers/Base64.js - -var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - -function E() { - this.message = 'String contains an invalid character'; -} -E.prototype = new Error; -E.prototype.code = 5; -E.prototype.name = 'InvalidCharacterError'; - -function btoa(input) { - var str = String(input); - var output = ''; - for ( - // initialize result and counter - var block, charCode, idx = 0, map = chars; - // if the next str index does not exist: - // change the mapping table to "=" - // check if d has no fractional digits - str.charAt(idx | 0) || (map = '=', idx % 1); - // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 - output += map.charAt(63 & block >> 8 - idx % 1 * 8) - ) { - charCode = str.charCodeAt(idx += 3 / 4); - if (charCode > 0xFF) { - throw new E(); - } - block = block << 8 | charCode; - } - return output; -} - -module.exports = btoa; diff --git a/electron/src/node_modules/axios/lib/helpers/buildURL.js b/electron/src/node_modules/axios/lib/helpers/buildURL.js deleted file mode 100755 index be83cd0..0000000 --- a/electron/src/node_modules/axios/lib/helpers/buildURL.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -function encode(val) { - return encodeURIComponent(val). - replace(/%40/gi, '@'). - replace(/%3A/gi, ':'). - replace(/%24/g, '$'). - replace(/%2C/gi, ','). - replace(/%20/g, '+'). - replace(/%5B/gi, '['). - replace(/%5D/gi, ']'); -} - -/** - * Build a URL by appending params to the end - * - * @param {string} url The base of the url (e.g., http://www.google.com) - * @param {object} [params] The params to be appended - * @returns {string} The formatted url - */ -module.exports = function buildURL(url, params, paramsSerializer) { - /*eslint no-param-reassign:0*/ - if (!params) { - return url; - } - - var serializedParams; - if (paramsSerializer) { - serializedParams = paramsSerializer(params); - } else if (utils.isURLSearchParams(params)) { - serializedParams = params.toString(); - } else { - var parts = []; - - utils.forEach(params, function serialize(val, key) { - if (val === null || typeof val === 'undefined') { - return; - } - - if (utils.isArray(val)) { - key = key + '[]'; - } else { - val = [val]; - } - - utils.forEach(val, function parseValue(v) { - if (utils.isDate(v)) { - v = v.toISOString(); - } else if (utils.isObject(v)) { - v = JSON.stringify(v); - } - parts.push(encode(key) + '=' + encode(v)); - }); - }); - - serializedParams = parts.join('&'); - } - - if (serializedParams) { - url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; - } - - return url; -}; diff --git a/electron/src/node_modules/axios/lib/helpers/combineURLs.js b/electron/src/node_modules/axios/lib/helpers/combineURLs.js deleted file mode 100755 index f1b58a5..0000000 --- a/electron/src/node_modules/axios/lib/helpers/combineURLs.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -/** - * Creates a new URL by combining the specified URLs - * - * @param {string} baseURL The base URL - * @param {string} relativeURL The relative URL - * @returns {string} The combined URL - */ -module.exports = function combineURLs(baseURL, relativeURL) { - return relativeURL - ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') - : baseURL; -}; diff --git a/electron/src/node_modules/axios/lib/helpers/cookies.js b/electron/src/node_modules/axios/lib/helpers/cookies.js deleted file mode 100755 index e45a4f9..0000000 --- a/electron/src/node_modules/axios/lib/helpers/cookies.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs support document.cookie - (function standardBrowserEnv() { - return { - write: function write(name, value, expires, path, domain, secure) { - var cookie = []; - cookie.push(name + '=' + encodeURIComponent(value)); - - if (utils.isNumber(expires)) { - cookie.push('expires=' + new Date(expires).toGMTString()); - } - - if (utils.isString(path)) { - cookie.push('path=' + path); - } - - if (utils.isString(domain)) { - cookie.push('domain=' + domain); - } - - if (secure === true) { - cookie.push('secure'); - } - - document.cookie = cookie.join('; '); - }, - - read: function read(name) { - var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); - return (match ? decodeURIComponent(match[3]) : null); - }, - - remove: function remove(name) { - this.write(name, '', Date.now() - 86400000); - } - }; - })() : - - // Non standard browser env (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return { - write: function write() {}, - read: function read() { return null; }, - remove: function remove() {} - }; - })() -); diff --git a/electron/src/node_modules/axios/lib/helpers/deprecatedMethod.js b/electron/src/node_modules/axios/lib/helpers/deprecatedMethod.js deleted file mode 100755 index ed40965..0000000 --- a/electron/src/node_modules/axios/lib/helpers/deprecatedMethod.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -/*eslint no-console:0*/ - -/** - * Supply a warning to the developer that a method they are using - * has been deprecated. - * - * @param {string} method The name of the deprecated method - * @param {string} [instead] The alternate method to use if applicable - * @param {string} [docs] The documentation URL to get further details - */ -module.exports = function deprecatedMethod(method, instead, docs) { - try { - console.warn( - 'DEPRECATED method `' + method + '`.' + - (instead ? ' Use `' + instead + '` instead.' : '') + - ' This method will be removed in a future release.'); - - if (docs) { - console.warn('For more information about usage see ' + docs); - } - } catch (e) { /* Ignore */ } -}; diff --git a/electron/src/node_modules/axios/lib/helpers/isAbsoluteURL.js b/electron/src/node_modules/axios/lib/helpers/isAbsoluteURL.js deleted file mode 100755 index d33e992..0000000 --- a/electron/src/node_modules/axios/lib/helpers/isAbsoluteURL.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -/** - * Determines whether the specified URL is absolute - * - * @param {string} url The URL to test - * @returns {boolean} True if the specified URL is absolute, otherwise false - */ -module.exports = function isAbsoluteURL(url) { - // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). - // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed - // by any combination of letters, digits, plus, period, or hyphen. - return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url); -}; diff --git a/electron/src/node_modules/axios/lib/helpers/isURLSameOrigin.js b/electron/src/node_modules/axios/lib/helpers/isURLSameOrigin.js deleted file mode 100755 index e292745..0000000 --- a/electron/src/node_modules/axios/lib/helpers/isURLSameOrigin.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -module.exports = ( - utils.isStandardBrowserEnv() ? - - // Standard browser envs have full support of the APIs needed to test - // whether the request URL is of the same origin as current location. - (function standardBrowserEnv() { - var msie = /(msie|trident)/i.test(navigator.userAgent); - var urlParsingNode = document.createElement('a'); - var originURL; - - /** - * Parse a URL to discover it's components - * - * @param {String} url The URL to be parsed - * @returns {Object} - */ - function resolveURL(url) { - var href = url; - - if (msie) { - // IE needs attribute set twice to normalize properties - urlParsingNode.setAttribute('href', href); - href = urlParsingNode.href; - } - - urlParsingNode.setAttribute('href', href); - - // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils - return { - href: urlParsingNode.href, - protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', - host: urlParsingNode.host, - search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', - hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', - hostname: urlParsingNode.hostname, - port: urlParsingNode.port, - pathname: (urlParsingNode.pathname.charAt(0) === '/') ? - urlParsingNode.pathname : - '/' + urlParsingNode.pathname - }; - } - - originURL = resolveURL(window.location.href); - - /** - * Determine if a URL shares the same origin as the current location - * - * @param {String} requestURL The URL to test - * @returns {boolean} True if URL shares the same origin, otherwise false - */ - return function isURLSameOrigin(requestURL) { - var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; - return (parsed.protocol === originURL.protocol && - parsed.host === originURL.host); - }; - })() : - - // Non standard browser envs (web workers, react-native) lack needed support. - (function nonStandardBrowserEnv() { - return function isURLSameOrigin() { - return true; - }; - })() -); diff --git a/electron/src/node_modules/axios/lib/helpers/normalizeHeaderName.js b/electron/src/node_modules/axios/lib/helpers/normalizeHeaderName.js deleted file mode 100755 index 738c9fe..0000000 --- a/electron/src/node_modules/axios/lib/helpers/normalizeHeaderName.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - -var utils = require('../utils'); - -module.exports = function normalizeHeaderName(headers, normalizedName) { - utils.forEach(headers, function processHeader(value, name) { - if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { - headers[normalizedName] = value; - delete headers[name]; - } - }); -}; diff --git a/electron/src/node_modules/axios/lib/helpers/parseHeaders.js b/electron/src/node_modules/axios/lib/helpers/parseHeaders.js deleted file mode 100755 index 8af2cc7..0000000 --- a/electron/src/node_modules/axios/lib/helpers/parseHeaders.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict'; - -var utils = require('./../utils'); - -// Headers whose duplicates are ignored by node -// c.f. https://nodejs.org/api/http.html#http_message_headers -var ignoreDuplicateOf = [ - 'age', 'authorization', 'content-length', 'content-type', 'etag', - 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', - 'last-modified', 'location', 'max-forwards', 'proxy-authorization', - 'referer', 'retry-after', 'user-agent' -]; - -/** - * Parse headers into an object - * - * ``` - * Date: Wed, 27 Aug 2014 08:58:49 GMT - * Content-Type: application/json - * Connection: keep-alive - * Transfer-Encoding: chunked - * ``` - * - * @param {String} headers Headers needing to be parsed - * @returns {Object} Headers parsed into an object - */ -module.exports = function parseHeaders(headers) { - var parsed = {}; - var key; - var val; - var i; - - if (!headers) { return parsed; } - - utils.forEach(headers.split('\n'), function parser(line) { - i = line.indexOf(':'); - key = utils.trim(line.substr(0, i)).toLowerCase(); - val = utils.trim(line.substr(i + 1)); - - if (key) { - if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { - return; - } - if (key === 'set-cookie') { - parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); - } else { - parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; - } - } - }); - - return parsed; -}; diff --git a/electron/src/node_modules/axios/lib/helpers/spread.js b/electron/src/node_modules/axios/lib/helpers/spread.js deleted file mode 100755 index 25e3cdd..0000000 --- a/electron/src/node_modules/axios/lib/helpers/spread.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; - -/** - * Syntactic sugar for invoking a function and expanding an array for arguments. - * - * Common use case would be to use `Function.prototype.apply`. - * - * ```js - * function f(x, y, z) {} - * var args = [1, 2, 3]; - * f.apply(null, args); - * ``` - * - * With `spread` this example can be re-written. - * - * ```js - * spread(function(x, y, z) {})([1, 2, 3]); - * ``` - * - * @param {Function} callback - * @returns {Function} - */ -module.exports = function spread(callback) { - return function wrap(arr) { - return callback.apply(null, arr); - }; -}; diff --git a/electron/src/node_modules/axios/lib/utils.js b/electron/src/node_modules/axios/lib/utils.js deleted file mode 100755 index b3fd865..0000000 --- a/electron/src/node_modules/axios/lib/utils.js +++ /dev/null @@ -1,303 +0,0 @@ -'use strict'; - -var bind = require('./helpers/bind'); -var isBuffer = require('is-buffer'); - -/*global toString:true*/ - -// utils is a library of generic helper functions non-specific to axios - -var toString = Object.prototype.toString; - -/** - * Determine if a value is an Array - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Array, otherwise false - */ -function isArray(val) { - return toString.call(val) === '[object Array]'; -} - -/** - * Determine if a value is an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an ArrayBuffer, otherwise false - */ -function isArrayBuffer(val) { - return toString.call(val) === '[object ArrayBuffer]'; -} - -/** - * Determine if a value is a FormData - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an FormData, otherwise false - */ -function isFormData(val) { - return (typeof FormData !== 'undefined') && (val instanceof FormData); -} - -/** - * Determine if a value is a view on an ArrayBuffer - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false - */ -function isArrayBufferView(val) { - var result; - if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { - result = ArrayBuffer.isView(val); - } else { - result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer); - } - return result; -} - -/** - * Determine if a value is a String - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a String, otherwise false - */ -function isString(val) { - return typeof val === 'string'; -} - -/** - * Determine if a value is a Number - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Number, otherwise false - */ -function isNumber(val) { - return typeof val === 'number'; -} - -/** - * Determine if a value is undefined - * - * @param {Object} val The value to test - * @returns {boolean} True if the value is undefined, otherwise false - */ -function isUndefined(val) { - return typeof val === 'undefined'; -} - -/** - * Determine if a value is an Object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is an Object, otherwise false - */ -function isObject(val) { - return val !== null && typeof val === 'object'; -} - -/** - * Determine if a value is a Date - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Date, otherwise false - */ -function isDate(val) { - return toString.call(val) === '[object Date]'; -} - -/** - * Determine if a value is a File - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a File, otherwise false - */ -function isFile(val) { - return toString.call(val) === '[object File]'; -} - -/** - * Determine if a value is a Blob - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Blob, otherwise false - */ -function isBlob(val) { - return toString.call(val) === '[object Blob]'; -} - -/** - * Determine if a value is a Function - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Function, otherwise false - */ -function isFunction(val) { - return toString.call(val) === '[object Function]'; -} - -/** - * Determine if a value is a Stream - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a Stream, otherwise false - */ -function isStream(val) { - return isObject(val) && isFunction(val.pipe); -} - -/** - * Determine if a value is a URLSearchParams object - * - * @param {Object} val The value to test - * @returns {boolean} True if value is a URLSearchParams object, otherwise false - */ -function isURLSearchParams(val) { - return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams; -} - -/** - * Trim excess whitespace off the beginning and end of a string - * - * @param {String} str The String to trim - * @returns {String} The String freed of excess whitespace - */ -function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); -} - -/** - * Determine if we're running in a standard browser environment - * - * This allows axios to run in a web worker, and react-native. - * Both environments support XMLHttpRequest, but not fully standard globals. - * - * web workers: - * typeof window -> undefined - * typeof document -> undefined - * - * react-native: - * navigator.product -> 'ReactNative' - */ -function isStandardBrowserEnv() { - if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') { - return false; - } - return ( - typeof window !== 'undefined' && - typeof document !== 'undefined' - ); -} - -/** - * Iterate over an Array or an Object invoking a function for each item. - * - * If `obj` is an Array callback will be called passing - * the value, index, and complete array for each item. - * - * If 'obj' is an Object callback will be called passing - * the value, key, and complete object for each property. - * - * @param {Object|Array} obj The object to iterate - * @param {Function} fn The callback to invoke for each item - */ -function forEach(obj, fn) { - // Don't bother if no value provided - if (obj === null || typeof obj === 'undefined') { - return; - } - - // Force an array if not already something iterable - if (typeof obj !== 'object') { - /*eslint no-param-reassign:0*/ - obj = [obj]; - } - - if (isArray(obj)) { - // Iterate over array values - for (var i = 0, l = obj.length; i < l; i++) { - fn.call(null, obj[i], i, obj); - } - } else { - // Iterate over object keys - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - fn.call(null, obj[key], key, obj); - } - } - } -} - -/** - * Accepts varargs expecting each argument to be an object, then - * immutably merges the properties of each object and returns result. - * - * When multiple objects contain the same key the later object in - * the arguments list will take precedence. - * - * Example: - * - * ```js - * var result = merge({foo: 123}, {foo: 456}); - * console.log(result.foo); // outputs 456 - * ``` - * - * @param {Object} obj1 Object to merge - * @returns {Object} Result of all merge properties - */ -function merge(/* obj1, obj2, obj3, ... */) { - var result = {}; - function assignValue(val, key) { - if (typeof result[key] === 'object' && typeof val === 'object') { - result[key] = merge(result[key], val); - } else { - result[key] = val; - } - } - - for (var i = 0, l = arguments.length; i < l; i++) { - forEach(arguments[i], assignValue); - } - return result; -} - -/** - * Extends object a by mutably adding to it the properties of object b. - * - * @param {Object} a The object to be extended - * @param {Object} b The object to copy properties from - * @param {Object} thisArg The object to bind function to - * @return {Object} The resulting value of object a - */ -function extend(a, b, thisArg) { - forEach(b, function assignValue(val, key) { - if (thisArg && typeof val === 'function') { - a[key] = bind(val, thisArg); - } else { - a[key] = val; - } - }); - return a; -} - -module.exports = { - isArray: isArray, - isArrayBuffer: isArrayBuffer, - isBuffer: isBuffer, - isFormData: isFormData, - isArrayBufferView: isArrayBufferView, - isString: isString, - isNumber: isNumber, - isObject: isObject, - isUndefined: isUndefined, - isDate: isDate, - isFile: isFile, - isBlob: isBlob, - isFunction: isFunction, - isStream: isStream, - isURLSearchParams: isURLSearchParams, - isStandardBrowserEnv: isStandardBrowserEnv, - forEach: forEach, - merge: merge, - extend: extend, - trim: trim -}; diff --git a/electron/src/node_modules/axios/package.json b/electron/src/node_modules/axios/package.json deleted file mode 100755 index dc02a75..0000000 --- a/electron/src/node_modules/axios/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "axios", - "version": "0.18.0", - "description": "Promise based HTTP client for the browser and node.js", - "main": "index.js", - "scripts": { - "test": "grunt test && bundlesize", - "start": "node ./sandbox/server.js", - "build": "NODE_ENV=production grunt build", - "preversion": "npm test", - "version": "npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json", - "postversion": "git push && git push --tags", - "examples": "node ./examples/server.js", - "coveralls": "cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/axios/axios.git" - }, - "keywords": [ - "xhr", - "http", - "ajax", - "promise", - "node" - ], - "author": "Matt Zabriskie", - "license": "MIT", - "bugs": { - "url": "https://github.com/axios/axios/issues" - }, - "homepage": "https://github.com/axios/axios", - "devDependencies": { - "bundlesize": "^0.5.7", - "coveralls": "^2.11.9", - "es6-promise": "^4.0.5", - "grunt": "^1.0.1", - "grunt-banner": "^0.6.0", - "grunt-cli": "^1.2.0", - "grunt-contrib-clean": "^1.0.0", - "grunt-contrib-nodeunit": "^1.0.0", - "grunt-contrib-watch": "^1.0.0", - "grunt-eslint": "^19.0.0", - "grunt-karma": "^2.0.0", - "grunt-ts": "^6.0.0-beta.3", - "grunt-webpack": "^1.0.18", - "istanbul-instrumenter-loader": "^1.0.0", - "jasmine-core": "^2.4.1", - "karma": "^1.3.0", - "karma-chrome-launcher": "^2.0.0", - "karma-coverage": "^1.0.0", - "karma-firefox-launcher": "^1.0.0", - "karma-jasmine": "^1.0.2", - "karma-jasmine-ajax": "^0.1.13", - "karma-opera-launcher": "^1.0.0", - "karma-safari-launcher": "^1.0.0", - "karma-sauce-launcher": "^1.1.0", - "karma-sinon": "^1.0.5", - "karma-sourcemap-loader": "^0.3.7", - "karma-webpack": "^1.7.0", - "load-grunt-tasks": "^3.5.2", - "minimist": "^1.2.0", - "sinon": "^1.17.4", - "webpack": "^1.13.1", - "webpack-dev-server": "^1.14.1", - "url-search-params": "^0.6.1", - "typescript": "^2.0.3" - }, - "browser": { - "./lib/adapters/http.js": "./lib/adapters/xhr.js" - }, - "typings": "./index.d.ts", - "dependencies": { - "follow-redirects": "^1.3.0", - "is-buffer": "^1.1.5" - }, - "bundlesize": [ - { - "path": "./dist/axios.min.js", - "threshold": "5kB" - } - ] -} diff --git a/electron/src/node_modules/debug/.coveralls.yml b/electron/src/node_modules/debug/.coveralls.yml deleted file mode 100755 index 20a7068..0000000 --- a/electron/src/node_modules/debug/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/electron/src/node_modules/debug/.eslintrc b/electron/src/node_modules/debug/.eslintrc deleted file mode 100755 index 8a37ae2..0000000 --- a/electron/src/node_modules/debug/.eslintrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "env": { - "browser": true, - "node": true - }, - "rules": { - "no-console": 0, - "no-empty": [1, { "allowEmptyCatch": true }] - }, - "extends": "eslint:recommended" -} diff --git a/electron/src/node_modules/debug/.npmignore b/electron/src/node_modules/debug/.npmignore deleted file mode 100755 index 5f60eec..0000000 --- a/electron/src/node_modules/debug/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -support -test -examples -example -*.sock -dist -yarn.lock -coverage -bower.json diff --git a/electron/src/node_modules/debug/.travis.yml b/electron/src/node_modules/debug/.travis.yml deleted file mode 100755 index 6c6090c..0000000 --- a/electron/src/node_modules/debug/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ - -language: node_js -node_js: - - "6" - - "5" - - "4" - -install: - - make node_modules - -script: - - make lint - - make test - - make coveralls diff --git a/electron/src/node_modules/debug/CHANGELOG.md b/electron/src/node_modules/debug/CHANGELOG.md deleted file mode 100755 index eadaa18..0000000 --- a/electron/src/node_modules/debug/CHANGELOG.md +++ /dev/null @@ -1,362 +0,0 @@ - -2.6.9 / 2017-09-22 -================== - - * remove ReDoS regexp in %o formatter (#504) - -2.6.8 / 2017-05-18 -================== - - * Fix: Check for undefined on browser globals (#462, @marbemac) - -2.6.7 / 2017-05-16 -================== - - * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) - * Fix: Inline extend function in node implementation (#452, @dougwilson) - * Docs: Fix typo (#455, @msasad) - -2.6.5 / 2017-04-27 -================== - - * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) - * Misc: clean up browser reference checks (#447, @thebigredgeek) - * Misc: add npm-debug.log to .gitignore (@thebigredgeek) - - -2.6.4 / 2017-04-20 -================== - - * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) - * Chore: ignore bower.json in npm installations. (#437, @joaovieira) - * Misc: update "ms" to v0.7.3 (@tootallnate) - -2.6.3 / 2017-03-13 -================== - - * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) - * Docs: Changelog fix (@thebigredgeek) - -2.6.2 / 2017-03-10 -================== - - * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) - * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) - * Docs: Add Slackin invite badge (@tootallnate) - -2.6.1 / 2017-02-10 -================== - - * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error - * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) - * Fix: IE8 "Expected identifier" error (#414, @vgoma) - * Fix: Namespaces would not disable once enabled (#409, @musikov) - -2.6.0 / 2016-12-28 -================== - - * Fix: added better null pointer checks for browser useColors (@thebigredgeek) - * Improvement: removed explicit `window.debug` export (#404, @tootallnate) - * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) - -2.5.2 / 2016-12-25 -================== - - * Fix: reference error on window within webworkers (#393, @KlausTrainer) - * Docs: fixed README typo (#391, @lurch) - * Docs: added notice about v3 api discussion (@thebigredgeek) - -2.5.1 / 2016-12-20 -================== - - * Fix: babel-core compatibility - -2.5.0 / 2016-12-20 -================== - - * Fix: wrong reference in bower file (@thebigredgeek) - * Fix: webworker compatibility (@thebigredgeek) - * Fix: output formatting issue (#388, @kribblo) - * Fix: babel-loader compatibility (#383, @escwald) - * Misc: removed built asset from repo and publications (@thebigredgeek) - * Misc: moved source files to /src (#378, @yamikuronue) - * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) - * Test: coveralls integration (#378, @yamikuronue) - * Docs: simplified language in the opening paragraph (#373, @yamikuronue) - -2.4.5 / 2016-12-17 -================== - - * Fix: `navigator` undefined in Rhino (#376, @jochenberger) - * Fix: custom log function (#379, @hsiliev) - * Improvement: bit of cleanup + linting fixes (@thebigredgeek) - * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) - * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) - -2.4.4 / 2016-12-14 -================== - - * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) - -2.4.3 / 2016-12-14 -================== - - * Fix: navigation.userAgent error for react native (#364, @escwald) - -2.4.2 / 2016-12-14 -================== - - * Fix: browser colors (#367, @tootallnate) - * Misc: travis ci integration (@thebigredgeek) - * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) - -2.4.1 / 2016-12-13 -================== - - * Fix: typo that broke the package (#356) - -2.4.0 / 2016-12-13 -================== - - * Fix: bower.json references unbuilt src entry point (#342, @justmatt) - * Fix: revert "handle regex special characters" (@tootallnate) - * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) - * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) - * Improvement: allow colors in workers (#335, @botverse) - * Improvement: use same color for same namespace. (#338, @lchenay) - -2.3.3 / 2016-11-09 -================== - - * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) - * Fix: Returning `localStorage` saved values (#331, Levi Thomason) - * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) - -2.3.2 / 2016-11-09 -================== - - * Fix: be super-safe in index.js as well (@TooTallNate) - * Fix: should check whether process exists (Tom Newby) - -2.3.1 / 2016-11-09 -================== - - * Fix: Added electron compatibility (#324, @paulcbetts) - * Improvement: Added performance optimizations (@tootallnate) - * Readme: Corrected PowerShell environment variable example (#252, @gimre) - * Misc: Removed yarn lock file from source control (#321, @fengmk2) - -2.3.0 / 2016-11-07 -================== - - * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) - * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) - * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) - * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) - * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) - * Package: Update "ms" to 0.7.2 (#315, @DevSide) - * Package: removed superfluous version property from bower.json (#207 @kkirsche) - * Readme: fix USE_COLORS to DEBUG_COLORS - * Readme: Doc fixes for format string sugar (#269, @mlucool) - * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) - * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) - * Readme: better docs for browser support (#224, @matthewmueller) - * Tooling: Added yarn integration for development (#317, @thebigredgeek) - * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) - * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) - * Misc: Updated contributors (@thebigredgeek) - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/electron/src/node_modules/debug/LICENSE b/electron/src/node_modules/debug/LICENSE deleted file mode 100755 index 658c933..0000000 --- a/electron/src/node_modules/debug/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk - -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/electron/src/node_modules/debug/Makefile b/electron/src/node_modules/debug/Makefile deleted file mode 100755 index 584da8b..0000000 --- a/electron/src/node_modules/debug/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# Path -PATH := node_modules/.bin:$(PATH) -SHELL := /bin/bash - -# applications -NODE ?= $(shell which node) -YARN ?= $(shell which yarn) -PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -.FORCE: - -install: node_modules - -node_modules: package.json - @NODE_ENV= $(PKG) install - @touch node_modules - -lint: .FORCE - eslint browser.js debug.js index.js node.js - -test-node: .FORCE - istanbul cover node_modules/mocha/bin/_mocha -- test/**.js - -test-browser: .FORCE - mkdir -p dist - - @$(BROWSERIFY) \ - --standalone debug \ - . > dist/debug.js - - karma start --single-run - rimraf dist - -test: .FORCE - concurrently \ - "make test-node" \ - "make test-browser" - -coveralls: - cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js - -.PHONY: all install clean distclean diff --git a/electron/src/node_modules/debug/README.md b/electron/src/node_modules/debug/README.md deleted file mode 100755 index f67be6b..0000000 --- a/electron/src/node_modules/debug/README.md +++ /dev/null @@ -1,312 +0,0 @@ -# debug -[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) - - - -A tiny node.js debugging utility modelled after node core's debugging technique. - -**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)** - -## Installation - -```bash -$ npm install debug -``` - -## Usage - -`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. - -Example _app.js_: - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %s', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example _worker.js_: - -```js -var debug = require('debug')('worker'); - -setInterval(function(){ - debug('doing some work'); -}, 1000); -``` - - The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: - - ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) - - ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) - -#### Windows note - - On Windows the environment variable is set using the `set` command. - - ```cmd - set DEBUG=*,-not_this - ``` - - Note that PowerShell uses different syntax to set environment variables. - - ```cmd - $env:DEBUG = "*,-not_this" - ``` - -Then, run the program to be debugged as usual. - -## Millisecond diff - - When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) - - When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: - - ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) - -## Conventions - - If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". - -## Wildcards - - The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - - You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:". - -## Environment Variables - - When running through Node.js, you can set a few environment variables that will - change the behavior of the debug logging: - -| Name | Purpose | -|-----------|-------------------------------------------------| -| `DEBUG` | Enables/disables specific debugging namespaces. | -| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | -| `DEBUG_DEPTH` | Object inspection depth. | -| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | - - - __Note:__ The environment variables beginning with `DEBUG_` end up being - converted into an Options object that gets used with `%o`/`%O` formatters. - See the Node.js documentation for - [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) - for the complete list. - -## Formatters - - - Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters: - -| Formatter | Representation | -|-----------|----------------| -| `%O` | Pretty-print an Object on multiple lines. | -| `%o` | Pretty-print an Object all on a single line. | -| `%s` | String. | -| `%d` | Number (both integer and float). | -| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | -| `%%` | Single percent sign ('%'). This does not consume an argument. | - -### Custom formatters - - You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like: - -```js -const createDebug = require('debug') -createDebug.formatters.h = (v) => { - return v.toString('hex') -} - -// …elsewhere -const debug = createDebug('foo') -debug('this is hex: %h', new Buffer('hello world')) -// foo this is hex: 68656c6c6f20776f726c6421 +0ms -``` - -## Browser support - You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), - or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), - if you don't want to build it yourself. - - Debug's enable state is currently persisted by `localStorage`. - Consider the situation shown below where you have `worker:a` and `worker:b`, - and wish to debug both. You can enable this using `localStorage.debug`: - -```js -localStorage.debug = 'worker:*' -``` - -And then refresh the page. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - -#### Web Inspector Colors - - Colors are also enabled on "Web Inspectors" that understand the `%c` formatting - option. These are WebKit web inspectors, Firefox ([since version - 31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) - and the Firebug plugin for Firefox (any version). - - Colored output looks something like: - - ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png) - - -## Output streams - - By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: - -Example _stdout.js_: - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - - Andrew Rhyne - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## License - -(The MIT License) - -Copyright (c) 2014-2016 TJ Holowaychuk <tj@vision-media.ca> - -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/electron/src/node_modules/debug/component.json b/electron/src/node_modules/debug/component.json deleted file mode 100755 index 9de2641..0000000 --- a/electron/src/node_modules/debug/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "debug", - "repo": "visionmedia/debug", - "description": "small debugging utility", - "version": "2.6.9", - "keywords": [ - "debug", - "log", - "debugger" - ], - "main": "src/browser.js", - "scripts": [ - "src/browser.js", - "src/debug.js" - ], - "dependencies": { - "rauchg/ms.js": "0.7.1" - } -} diff --git a/electron/src/node_modules/debug/karma.conf.js b/electron/src/node_modules/debug/karma.conf.js deleted file mode 100755 index 103a82d..0000000 --- a/electron/src/node_modules/debug/karma.conf.js +++ /dev/null @@ -1,70 +0,0 @@ -// Karma configuration -// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) - -module.exports = function(config) { - config.set({ - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['mocha', 'chai', 'sinon'], - - - // list of files / patterns to load in the browser - files: [ - 'dist/debug.js', - 'test/*spec.js' - ], - - - // list of files to exclude - exclude: [ - 'src/node.js' - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress'], - - - // web server port - port: 9876, - - - // enable / disable colors in the output (reporters and logs) - colors: true, - - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['PhantomJS'], - - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: false, - - // Concurrency level - // how many browser should be started simultaneous - concurrency: Infinity - }) -} diff --git a/electron/src/node_modules/debug/node.js b/electron/src/node_modules/debug/node.js deleted file mode 100755 index 7fc36fe..0000000 --- a/electron/src/node_modules/debug/node.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./src/node'); diff --git a/electron/src/node_modules/debug/package.json b/electron/src/node_modules/debug/package.json deleted file mode 100755 index dc787ba..0000000 --- a/electron/src/node_modules/debug/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "debug", - "version": "2.6.9", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": "TJ Holowaychuk ", - "contributors": [ - "Nathan Rajlich (http://n8.io)", - "Andrew Rhyne " - ], - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - }, - "devDependencies": { - "browserify": "9.0.3", - "chai": "^3.5.0", - "concurrently": "^3.1.0", - "coveralls": "^2.11.15", - "eslint": "^3.12.1", - "istanbul": "^0.4.5", - "karma": "^1.3.0", - "karma-chai": "^0.1.0", - "karma-mocha": "^1.3.0", - "karma-phantomjs-launcher": "^1.0.2", - "karma-sinon": "^1.0.5", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "^1.2.0", - "rimraf": "^2.5.4", - "sinon": "^1.17.6", - "sinon-chai": "^2.8.0" - }, - "main": "./src/index.js", - "browser": "./src/browser.js", - "component": { - "scripts": { - "debug/index.js": "browser.js", - "debug/debug.js": "debug.js" - } - } -} diff --git a/electron/src/node_modules/debug/src/browser.js b/electron/src/node_modules/debug/src/browser.js deleted file mode 100755 index 7106924..0000000 --- a/electron/src/node_modules/debug/src/browser.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - 'lightseagreen', - 'forestgreen', - 'goldenrod', - 'dodgerblue', - 'darkorchid', - 'crimson' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} diff --git a/electron/src/node_modules/debug/src/debug.js b/electron/src/node_modules/debug/src/debug.js deleted file mode 100755 index 6a5e3fc..0000000 --- a/electron/src/node_modules/debug/src/debug.js +++ /dev/null @@ -1,202 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Previous log timestamp. - */ - -var prevTime; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - return debug; -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (var i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/electron/src/node_modules/debug/src/index.js b/electron/src/node_modules/debug/src/index.js deleted file mode 100755 index e12cf4d..0000000 --- a/electron/src/node_modules/debug/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = require('./browser.js'); -} else { - module.exports = require('./node.js'); -} diff --git a/electron/src/node_modules/debug/src/inspector-log.js b/electron/src/node_modules/debug/src/inspector-log.js deleted file mode 100755 index 60ea6c0..0000000 --- a/electron/src/node_modules/debug/src/inspector-log.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = inspectorLog; - -// black hole -const nullStream = new (require('stream').Writable)(); -nullStream._write = () => {}; - -/** - * Outputs a `console.log()` to the Node.js Inspector console *only*. - */ -function inspectorLog() { - const stdout = console._stdout; - console._stdout = nullStream; - console.log.apply(console, arguments); - console._stdout = stdout; -} diff --git a/electron/src/node_modules/debug/src/node.js b/electron/src/node_modules/debug/src/node.js deleted file mode 100755 index b15109c..0000000 --- a/electron/src/node_modules/debug/src/node.js +++ /dev/null @@ -1,248 +0,0 @@ -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * The file descriptor to write the `debug()` calls to. - * Set the `DEBUG_FD` env variable to override with another value. i.e.: - * - * $ DEBUG_FD=3 node script.js 3>debug.log - */ - -var fd = parseInt(process.env.DEBUG_FD, 10) || 2; - -if (1 !== fd && 2 !== fd) { - util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')() -} - -var stream = 1 === fd ? process.stdout : - 2 === fd ? process.stderr : - createWritableStdioStream(fd); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var prefix = ' \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = new Date().toUTCString() - + ' ' + name + ' ' + args[0]; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to `stream`. - */ - -function log() { - return stream.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Copied from `node/src/node.js`. - * - * XXX: It's lame that node doesn't expose this API out-of-the-box. It also - * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. - */ - -function createWritableStdioStream (fd) { - var stream; - var tty_wrap = process.binding('tty_wrap'); - - // Note stream._type is used for test-module-load-list.js - - switch (tty_wrap.guessHandleType(fd)) { - case 'TTY': - stream = new tty.WriteStream(fd); - stream._type = 'tty'; - - // Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - case 'FILE': - var fs = require('fs'); - stream = new fs.SyncWriteStream(fd, { autoClose: false }); - stream._type = 'fs'; - break; - - case 'PIPE': - case 'TCP': - var net = require('net'); - stream = new net.Socket({ - fd: fd, - readable: false, - writable: true - }); - - // FIXME Should probably have an option in net.Socket to create a - // stream from an existing fd which is writable only. But for now - // we'll just add this hack and set the `readable` member to false. - // Test: ./node test/fixtures/echo.js < /etc/passwd - stream.readable = false; - stream.read = null; - stream._type = 'pipe'; - - // FIXME Hack to have stream not keep the event loop alive. - // See https://github.com/joyent/node/issues/1726 - if (stream._handle && stream._handle.unref) { - stream._handle.unref(); - } - break; - - default: - // Probably an error on in uv_guess_handle() - throw new Error('Implement me. Unknown stream file type!'); - } - - // For supporting legacy API we put the FD here. - stream.fd = fd; - - stream._isStdio = true; - - return stream; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/electron/src/node_modules/electron-context-menu/index.js b/electron/src/node_modules/electron-context-menu/index.js deleted file mode 100755 index cbf5cc3..0000000 --- a/electron/src/node_modules/electron-context-menu/index.js +++ /dev/null @@ -1,170 +0,0 @@ -'use strict'; -const electron = require('electron'); -const {download} = require('electron-dl'); -const isDev = require('electron-is-dev'); - -const webContents = win => win.webContents || win.getWebContents(); - -function create(win, opts) { - webContents(win).on('context-menu', (e, props) => { - if (typeof opts.shouldShowMenu === 'function' && opts.shouldShowMenu(e, props) === false) { - return; - } - - const editFlags = props.editFlags; - const hasText = props.selectionText.trim().length > 0; - const can = type => editFlags[`can${type}`] && hasText; - - let menuTpl = [{ - type: 'separator' - }, { - id: 'cut', - label: 'Cut', - // Needed because of macOS limitation: - // https://github.com/electron/electron/issues/5860 - role: can('Cut') ? 'cut' : '', - enabled: can('Cut'), - visible: props.isEditable - }, { - id: 'copy', - label: 'Copy', - role: can('Copy') ? 'copy' : '', - enabled: can('Copy'), - visible: props.isEditable || hasText - }, { - id: 'paste', - label: 'Paste', - role: editFlags.canPaste ? 'paste' : '', - enabled: editFlags.canPaste, - visible: props.isEditable - }, { - type: 'separator' - }]; - - if (props.mediaType === 'image') { - menuTpl = [{ - type: 'separator' - }, { - id: 'save', - label: 'Save Image', - click() { - download(win, props.srcURL); - } - }, { - type: 'separator' - }]; - } - - if (props.linkURL && props.mediaType === 'none') { - menuTpl = [{ - type: 'separator' - }, { - id: 'copyLink', - label: 'Copy Link', - click() { - if (process.platform === 'darwin') { - electron.clipboard.writeBookmark(props.linkText, props.linkURL); - } else { - electron.clipboard.writeText(props.linkURL); - } - } - }, { - type: 'separator' - }]; - } - - if (opts.prepend) { - const result = opts.prepend(props, win); - - if (Array.isArray(result)) { - menuTpl.unshift(...result); - } - } - - if (opts.append) { - const result = opts.append(props, win); - - if (Array.isArray(result)) { - menuTpl.push(...result); - } - } - - if (opts.showInspectElement || (opts.showInspectElement !== false && isDev)) { - menuTpl.push({ - type: 'separator' - }, { - id: 'inspect', - label: 'Inspect Element', - click() { - win.inspectElement(props.x, props.y); - - if (webContents(win).isDevToolsOpened()) { - webContents(win).devToolsWebContents.focus(); - } - } - }, { - type: 'separator' - }); - } - - // Apply custom labels for default menu items - if (opts.labels) { - for (const menuItem of menuTpl) { - if (opts.labels[menuItem.id]) { - menuItem.label = opts.labels[menuItem.id]; - } - } - } - - // Filter out leading/trailing separators - // TODO: https://github.com/electron/electron/issues/5869 - menuTpl = delUnusedElements(menuTpl); - - if (menuTpl.length > 0) { - const menu = (electron.remote ? electron.remote.Menu : electron.Menu).buildFromTemplate(menuTpl); - - /* - * When electron.remote is not available this runs in the browser process. - * We can safely use win in this case as it refers to the window the - * context-menu should open in. - * When this is being called from a webView, we can't use win as this - * would refere to the webView which is not allowed to render a popup menu. - */ - menu.popup(electron.remote ? electron.remote.getCurrentWindow() : win); - } - }); -} - -function delUnusedElements(menuTpl) { - let notDeletedPrevEl; - return menuTpl.filter(el => el.visible !== false).filter((el, i, arr) => { - const toDelete = el.type === 'separator' && (!notDeletedPrevEl || i === arr.length - 1 || arr[i + 1].type === 'separator'); - notDeletedPrevEl = toDelete ? notDeletedPrevEl : el; - return !toDelete; - }); -} - -module.exports = (opts = {}) => { - if (opts.window) { - const win = opts.window; - const wc = webContents(win); - - // When window is a webview that has not yet finished loading webContents is not available - if (wc === undefined) { - win.addEventListener('dom-ready', () => { - create(win, opts); - }, {once: true}); - return; - } - - return create(win, opts); - } - - (electron.BrowserWindow || electron.remote.BrowserWindow).getAllWindows().forEach(win => { - create(win, opts); - }); - - (electron.app || electron.remote.app).on('browser-window-created', (e, win) => { - create(win, opts); - }); -}; diff --git a/electron/src/node_modules/electron-context-menu/license b/electron/src/node_modules/electron-context-menu/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/electron-context-menu/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/electron-context-menu/package.json b/electron/src/node_modules/electron-context-menu/package.json deleted file mode 100755 index 0d6d169..0000000 --- a/electron/src/node_modules/electron-context-menu/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "electron-context-menu", - "version": "0.9.1", - "description": "Context menu for your Electron app", - "license": "MIT", - "repository": "sindresorhus/electron-context-menu", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "scripts": { - "start": "electron fixture.js", - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "electron", - "app", - "context", - "right-click", - "menu", - "extensible", - "save", - "image" - ], - "dependencies": { - "electron-dl": "^1.2.0", - "electron-is-dev": "^0.1.1" - }, - "devDependencies": { - "ava": "*", - "electron": "^1.3.3", - "xo": "*" - }, - "xo": { - "envs": [ - "node", - "browser" - ] - } -} diff --git a/electron/src/node_modules/electron-context-menu/readme.md b/electron/src/node_modules/electron-context-menu/readme.md deleted file mode 100755 index 9f54591..0000000 --- a/electron/src/node_modules/electron-context-menu/readme.md +++ /dev/null @@ -1,115 +0,0 @@ -# electron-context-menu [![Build Status](https://travis-ci.org/sindresorhus/electron-context-menu.svg?branch=master)](https://travis-ci.org/sindresorhus/electron-context-menu) - -> Context menu for your [Electron](http://electron.atom.io) app - - - -Electron doesn't have a built-in context menu. You're supposed to handle that yourself. But it's both tedious and hard to get right. This module gives you a nice extensible context menu with items like `Cut`/`Copy`/`Paste` for text, `Save Image` for images, and `Copy Link` for links. It also adds an `Inspect Element` menu item when in development to quickly view items in the inspector like in Chrome. - -You can use this module directly in both the main and renderer process. - - -## Install - -``` -$ npm install --save electron-context-menu -``` - - -## Usage - -```js -const {app, BrowserWindow} = require('electron'); - -require('electron-context-menu')({ - prepend: (params, browserWindow) => [{ - label: 'Rainbow', - // Only show it when right-clicking images - visible: params.mediaType === 'image' - }] -}); - -let win; - -app.on('ready', () => { - win = new BrowserWindow(); -}); -``` - - -## API - -### contextMenu([options]) - -### options - -#### window - -Type: `BrowserWindow` `WebView`
- -Window or WebView to add the context menu to. - -When not specified, the context menu will be added to all existing and new windows. - -#### prepend - -Type: `Function` - -Should return an array of [MenuItem](http://electron.atom.io/docs/api/menu-item/)'s to be prepended to the context menu. The first argument is [this `params` object](http://electron.atom.io/docs/api/web-contents/#event-context-menu). The second argument is the [BrowserWindow](http://electron.atom.io/docs/api/browser-window/) the context menu was requested for. - -#### append - -Type: `Function` - -Should return an array of [MenuItem](http://electron.atom.io/docs/api/menu-item/)'s to be appended to the context menu. The first argument is [this `params` object](http://electron.atom.io/docs/api/web-contents/#event-context-menu). The second argument is the [BrowserWindow](http://electron.atom.io/docs/api/browser-window/) the context menu was requested for. - -#### showInspectElement - -Type: `boolean`
-Default: [Only in development](https://github.com/sindresorhus/electron-is-dev) - -Force enable or disable the `Inspect Element` menu item. - -#### labels - -Type: `Object`
-Default: `{}` - -Overwrite labels for the default menu items. Useful for i18n. - -Format: - -```js -labels: { - cut: 'Configured Cut', - copy: 'Configured Copy', - paste: 'Configured Paste', - save: 'Configured Save Image', - copyLink: 'Configured Copy Link', - inspect: 'Configured Inspect' -} -``` - -#### shouldShowMenu - -Type: `Function` - -Determines whether or not to show the menu. Can be useful if you for example have other code presenting a context menu in some contexts. The second argument is [this `params` object](http://electron.atom.io/docs/api/web-contents/#event-context-menu). - -Example: - -```js -// Doesn't show the menu if the element is editable -shouldShowMenu: (event, params) => !params.isEditable -``` - -## Related - -- [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app -- [electron-config](https://github.com/sindresorhus/electron-config) - Simple config handling for your Electron app or module -- [electron-unhandled](https://github.com/sindresorhus/electron-unhandled) - Catch unhandled errors and promise rejections in your Electron app - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/electron-debug/index.js b/electron/src/node_modules/electron-debug/index.js deleted file mode 100755 index 7bc03da..0000000 --- a/electron/src/node_modules/electron-debug/index.js +++ /dev/null @@ -1,89 +0,0 @@ -'use strict'; -const electron = require('electron'); -const localShortcut = require('electron-localshortcut'); -const isDev = require('electron-is-dev'); - -const app = electron.app; -const BrowserWindow = electron.BrowserWindow; -const isMacOS = process.platform === 'darwin'; - -function devTools(win) { - win = win || BrowserWindow.getFocusedWindow(); - - if (win) { - win.toggleDevTools(); - } -} - -function openDevTools(win, showDevTools) { - win = win || BrowserWindow.getFocusedWindow(); - - if (win) { - const mode = showDevTools === true ? undefined : showDevTools; - win.webContents.openDevTools({mode}); - } -} - -function refresh(win) { - win = win || BrowserWindow.getFocusedWindow(); - - if (win) { - win.webContents.reloadIgnoringCache(); - } -} - -function inspectElements() { - const win = BrowserWindow.getFocusedWindow(); - const inspect = () => { - win.devToolsWebContents.executeJavaScript('DevToolsAPI.enterInspectElementMode()'); - }; - - if (win) { - if (win.webContents.isDevToolsOpened()) { - inspect(); - } else { - win.webContents.on('devtools-opened', inspect); - win.openDevTools(); - } - } -} - -module.exports = opts => { - opts = Object.assign({ - enabled: null, - showDevTools: false - }, opts); - - if (opts.enabled === false || (opts.enabled === null && !isDev)) { - return; - } - - app.on('browser-window-created', (e, win) => { - if (opts.showDevTools) { - openDevTools(win, opts.showDevTools); - } - }); - - app.on('ready', () => { - // Activate devtron for the user if they have it installed and it's not already added - try { - const devtronAlreadyAdded = BrowserWindow.getDevToolsExtensions && - {}.hasOwnProperty.call(BrowserWindow.getDevToolsExtensions(), 'devtron'); - - if (!devtronAlreadyAdded) { - BrowserWindow.addDevToolsExtension(require('devtron').path); - } - } catch (err) {} - - localShortcut.register('CmdOrCtrl+Shift+C', inspectElements); - localShortcut.register(isMacOS ? 'Cmd+Alt+I' : 'Ctrl+Shift+I', devTools); - localShortcut.register('F12', devTools); - - localShortcut.register('CmdOrCtrl+R', refresh); - localShortcut.register('F5', refresh); - }); -}; - -module.exports.refresh = refresh; -module.exports.devTools = devTools; -module.exports.openDevTools = openDevTools; diff --git a/electron/src/node_modules/electron-debug/license b/electron/src/node_modules/electron-debug/license deleted file mode 100755 index e7af2f7..0000000 --- a/electron/src/node_modules/electron-debug/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/index.js b/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/index.js deleted file mode 100755 index 28fa7df..0000000 --- a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/index.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const getFromEnv = parseInt(process.env.ELECTRON_IS_DEV, 10) === 1; -const isEnvSet = 'ELECTRON_IS_DEV' in process.env; - -module.exports = isEnvSet ? getFromEnv : (process.defaultApp || /node_modules[\\/]electron[\\/]/.test(process.execPath)); diff --git a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/license b/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/package.json b/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/package.json deleted file mode 100755 index 0345e7d..0000000 --- a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "electron-is-dev", - "version": "0.3.0", - "description": "Check if Electron is running in development", - "license": "MIT", - "repository": "sindresorhus/electron-is-dev", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "scripts": { - "test": "xo" - }, - "files": [ - "index.js" - ], - "keywords": [ - "electron", - "dev", - "development", - "mode", - "prod", - "production", - "detect", - "check", - "debug", - "app" - ], - "devDependencies": { - "xo": "*" - }, - "xo": { - "esnext": true, - "envs": [ - "node", - "browser" - ] - } -} diff --git a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/readme.md b/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/readme.md deleted file mode 100755 index d8e69ff..0000000 --- a/electron/src/node_modules/electron-debug/node_modules/electron-is-dev/readme.md +++ /dev/null @@ -1,37 +0,0 @@ -# electron-is-dev - -> Check if [Electron](http://electron.atom.io) is running in development - -Useful for enabling debug features only during development. - - -## Install - -``` -$ npm install --save electron-is-dev -``` - - -## Usage - -```js -const isDev = require('electron-is-dev'); - -if (isDev) { - console.log('Running in development'); -} else { - console.log('Running in production'); -} -``` - -Can be overridden by setting the `ELECTRON_IS_DEV` environment variable to `1`. - - -## Related - -- [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/electron-debug/package.json b/electron/src/node_modules/electron-debug/package.json deleted file mode 100755 index 44cb1b2..0000000 --- a/electron/src/node_modules/electron-debug/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "electron-debug", - "version": "1.4.0", - "description": "Adds useful debug features to your Electron app", - "license": "MIT", - "repository": "sindresorhus/electron-debug", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "scripts": { - "start": "electron test.js", - "test": "xo" - }, - "files": [ - "index.js" - ], - "keywords": [ - "electron", - "debug", - "debugging", - "devtools", - "app", - "dev", - "development" - ], - "dependencies": { - "electron-is-dev": "^0.3.0", - "electron-localshortcut": "^3.0.0" - }, - "devDependencies": { - "devtron": "^1.1.0", - "electron": "^1.6.12", - "xo": "*" - }, - "xo": { - "envs": [ - "node", - "browser" - ] - } -} diff --git a/electron/src/node_modules/electron-debug/readme.md b/electron/src/node_modules/electron-debug/readme.md deleted file mode 100755 index 2d3dc51..0000000 --- a/electron/src/node_modules/electron-debug/readme.md +++ /dev/null @@ -1,137 +0,0 @@ -# electron-debug - -> Adds useful debug features to your [Electron](http://electron.atom.io) app - -Ideas for more debug features [welcome!](https://github.com/sindresorhus/electron-debug/issues/new) - - -## Features - -### DevTools - -Toggle DevTools. - -- macOS: Cmd Alt I or F12 -- Linux: Ctrl Shift I or F12 -- Windows: Ctrl Shift I or F12 - -### Reload - -Force reload the window. - -- macOS: Cmd R or F5 -- Linux: Ctrl R or F5 -- Windows: Ctrl R or F5 - -### Element Inspector - -Open DevTools and focus the Element Inspector tool. - -- macOS: Cmd Shift C -- Linux: Ctrl Shift C -- Windows: Ctrl Shift C - -### Activates Devtron - -[Devtron](http://electron.atom.io/devtron/) is the official Electron DevTools extension. - -Just install it in your app and we'll activate it for you. - -``` -$ npm install --save-dev devtron -``` - - -## Install - -``` -$ npm install electron-debug -``` - - -## Usage - -```js -const {app, BrowserWindow} = require('electron'); - -require('electron-debug')({showDevTools: true}); - -let win; - -app.on('ready', () => { - win = new BrowserWindow(); -}); -``` - - -## API - -Only runs when in [development](https://github.com/sindresorhus/electron-is-dev), unless overridden by the `enabled` option. So no need to guard it for production. - -### electronDebug([options]) - -Install keyboard shortcuts and optionally activate DevTools on each created `BrowserWindow`. - -#### options - -##### enabled - -Type: `boolean` - -##### showDevTools - -Type: `boolean` `string`
-Default: `false`
-Values: `'right'` `'bottom'` `'undocked'` `false` `true` *(Last dock state)* - -Show DevTools on each created `BrowserWindow`. - -### devTools([window]) - -Toggle DevTools for the specified `BrowserWindow` instance or the focused one. - -#### window - -Type: `BrowserWindow`
-Default: The focused `BrowserWindow` - -### refresh([window]) - -Reload the specified `BrowserWindow` instance or the focused one. - -#### window - -Type: `BrowserWindow`
-Default: The focused `BrowserWindow` - -### openDevTools([window], [showDevTools]) - -Open DevTools for the specified `BrowserWindow` instance or the focused one. - -#### window - -Type: `BrowserWindow`
-Default: The focused `BrowserWindow` - -#### showDevTools - -Type: `boolean` `string`
-Default: `false`
-Values: `'right'` `'bottom'` `'undocked'` `false` `true` *(last dock state)* - -Show DevTools on each created `BrowserWindow`. - - -## Related - -- [electron-store](https://github.com/sindresorhus/electron-store) - Save and load data like user preferences, app state, cache, etc -- [electron-context-menu](https://github.com/sindresorhus/electron-context-menu) - Context menu for your Electron app -- [electron-dl](https://github.com/sindresorhus/electron-dl) - Simplified file downloads for your Electron app -- [electron-unhandled](https://github.com/sindresorhus/electron-unhandled) - Catch unhandled errors and promise rejections in your Electron app -- [electron-is-dev](https://github.com/sindresorhus/electron-is-dev) - Check if Electron is running in development -- [debug-menu](https://github.com/parro-it/debug-menu) - Chrome-like debug context-menu for Electron - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/electron-dl/index.js b/electron/src/node_modules/electron-dl/index.js deleted file mode 100755 index c18ff62..0000000 --- a/electron/src/node_modules/electron-dl/index.js +++ /dev/null @@ -1,134 +0,0 @@ -'use strict'; -const path = require('path'); -const electron = require('electron'); -const unusedFilename = require('unused-filename'); -const pupa = require('pupa'); -const extName = require('ext-name'); - -const app = electron.app; -const shell = electron.shell; - -function getFilenameFromMime(name, mime) { - const exts = extName.mime(mime); - - if (exts.length !== 1) { - return name; - } - - return `${name}.${exts[0].ext}`; -} - -function registerListener(session, opts = {}, cb = () => {}) { - const downloadItems = new Set(); - let receivedBytes = 0; - let completedBytes = 0; - let totalBytes = 0; - const activeDownloadItems = () => downloadItems.size; - const progressDownloadItems = () => receivedBytes / totalBytes; - - const listener = (e, item, webContents) => { - downloadItems.add(item); - totalBytes += item.getTotalBytes(); - - let hostWebContents = webContents; - if (webContents.getType() === 'webview') { - hostWebContents = webContents.hostWebContents; - } - const win = electron.BrowserWindow.fromWebContents(hostWebContents); - - const dir = opts.directory || app.getPath('downloads'); - let filePath; - if (opts.filename) { - filePath = path.join(dir, opts.filename); - } else { - const filename = item.getFilename(); - const name = path.extname(filename) ? filename : getFilenameFromMime(filename, item.getMimeType()); - - filePath = unusedFilename.sync(path.join(dir, name)); - } - - const errorMessage = opts.errorMessage || 'The download of {filename} was interrupted'; - const errorTitle = opts.errorTitle || 'Download Error'; - - if (!opts.saveAs) { - item.setSavePath(filePath); - } - - item.on('updated', () => { - receivedBytes = [...downloadItems].reduce((receivedBytes, item) => { - receivedBytes += item.getReceivedBytes(); - return receivedBytes; - }, completedBytes); - - if (['darwin', 'linux'].includes(process.platform)) { - app.setBadgeCount(activeDownloadItems()); - } - - if (!win.isDestroyed()) { - win.setProgressBar(progressDownloadItems()); - } - - if (typeof opts.onProgress === 'function') { - opts.onProgress(progressDownloadItems()); - } - }); - - item.on('done', (e, state) => { - completedBytes += item.getTotalBytes(); - downloadItems.delete(item); - - if (['darwin', 'linux'].includes(process.platform)) { - app.setBadgeCount(activeDownloadItems()); - } - - if (!win.isDestroyed() && !activeDownloadItems()) { - win.setProgressBar(-1); - receivedBytes = 0; - completedBytes = 0; - totalBytes = 0; - } - - if (state === 'interrupted') { - const message = pupa(errorMessage, {filename: item.getFilename()}); - electron.dialog.showErrorBox(errorTitle, message); - cb(new Error(message)); - } else if (state === 'completed') { - if (process.platform === 'darwin') { - app.dock.downloadFinished(filePath); - } - - if (opts.openFolderWhenDone) { - shell.showItemInFolder(filePath); - } - - if (opts.unregisterWhenDone) { - session.removeListener('will-download', listener); - } - - cb(null, item); - } - }); - }; - - session.on('will-download', listener); -} - -module.exports = (opts = {}) => { - app.on('session-created', session => { - registerListener(session, opts); - }); -}; - -module.exports.download = (win, url, opts) => new Promise((resolve, reject) => { - opts = Object.assign({}, opts, {unregisterWhenDone: true}); - - registerListener(win.webContents.session, opts, (err, item) => { - if (err) { - reject(err); - } else { - resolve(item); - } - }); - - win.webContents.downloadURL(url); -}); diff --git a/electron/src/node_modules/electron-dl/license b/electron/src/node_modules/electron-dl/license deleted file mode 100755 index e7af2f7..0000000 --- a/electron/src/node_modules/electron-dl/license +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/electron/src/node_modules/electron-dl/package.json b/electron/src/node_modules/electron-dl/package.json deleted file mode 100755 index 54da4c8..0000000 --- a/electron/src/node_modules/electron-dl/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "electron-dl", - "version": "1.10.0", - "description": "Simplified file downloads for your Electron app", - "license": "MIT", - "repository": "sindresorhus/electron-dl", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "scripts": { - "start": "electron run.js", - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "electron", - "app", - "file", - "download", - "downloader", - "progress" - ], - "dependencies": { - "ext-name": "^5.0.0", - "pupa": "^1.0.0", - "unused-filename": "^1.0.0" - }, - "devDependencies": { - "ava": "^0.21.0", - "cp-file": "^4.2.0", - "electron": "^1.3.3", - "minimist": "^1.2.0", - "node-static": "^0.7.9", - "pify": "^3.0.0", - "spectron": "^3.7.2", - "uuid": "^3.1.0", - "xo": "*" - }, - "xo": { - "envs": [ - "node", - "browser" - ] - } -} diff --git a/electron/src/node_modules/electron-dl/readme.md b/electron/src/node_modules/electron-dl/readme.md deleted file mode 100755 index 6a8f336..0000000 --- a/electron/src/node_modules/electron-dl/readme.md +++ /dev/null @@ -1,155 +0,0 @@ -# electron-dl [![Build Status](https://travis-ci.org/sindresorhus/electron-dl.svg?branch=master)](https://travis-ci.org/sindresorhus/electron-dl) - -> Simplified file downloads for your [Electron](http://electron.atom.io) app - - -## Why? - -- One function call instead of having to manually implement a lot of [boilerplate](index.js). -- Saves the file to the users Downloads directory instead of prompting. -- Bounces the Downloads directory in the dock when done. *(macOS)* -- Handles multiple downloads. -- Shows badge count *(macOS & Linux only)* and download progress. Example on macOS: - - - - -## Install - -``` -$ npm install electron-dl -``` - - -## Usage - -### Register it for all windows - -This is probably what you want for your app. - -```js -const {app, BrowserWindow} = require('electron'); - -require('electron-dl')(); - -let win; - -app.on('ready', () => { - win = new BrowserWindow(); -}); -``` - -### Use it manually - -This can be useful if you need download functionality in a reusable module. - -```js -const {app, BrowserWindow, ipcMain} = require('electron'); -const {download} = require('electron-dl'); - -ipcMain.on('download-btn', (e, args) => { - download(BrowserWindow.getFocusedWindow(), args.url) - .then(dl => console.log(dl.getSavePath())) - .catch(console.error); -}); -``` - -## API - -### electronDl([options]) - -### electronDl.download(window, url, [options]): Promise<[DownloadItem](https://github.com/electron/electron/blob/master/docs/api/download-item.md)> - -### window - -Type: `BrowserWindow` - -Window to register the behavior on. - -### url - -Type: `string` - -URL to download. - -### options - -#### saveAs - -Type: `boolean`
-Default: `false` - -Show a `Save As…` dialog instead of downloading immediately. - -Note: Only use this option when strictly necessary. Downloading directly without a prompt is a much better user experience. - -#### directory - -Type: `string`
-Default: [User's downloads directory](http://electron.atom.io/docs/api/app/#appgetpathname) - -Directory to save the file in. - -#### filename - -Type: `string`
-Default: [`downloadItem.getFilename()`](https://electron.atom.io/docs/api/download-item/#downloaditemgetfilename) - -Name of the saved file. - -This option only makes sense for `electronDl.download()`. - -#### errorTitle - -Type: `string`
-Default: `Download Error` - -Title of the error dialog. Can be customized for localization. - -#### errorMessage - -Type: `string`
-Default: `The download of {filename} was interrupted` - -Message of the error dialog. `{filename}` is replaced with the name of the actual file. Can be customized for localization. - -#### onProgress - -Type: `Function` - -Optional callback that receives a number between `0` and `1` representing the progress of the current download. - -#### openFolderWhenDone - -Type: `boolean`
-Default: `false` - -Reveal the downloaded file in the system file manager, and if possible, select the file. - - -## Development - -After making changes, run the automated tests: - -``` -$ npm test -``` - -And before submitting a pull request, run the manual tests to manually verify that everything works: - -``` -npm start -``` - - -## Related - -- [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app -- [electron-context-menu](https://github.com/sindresorhus/electron-context-menu) - Context menu for your Electron app -- [electron-store](https://github.com/sindresorhus/electron-store) - Save and load data like user preferences, app state, cache, etc -- [electron-unhandled](https://github.com/sindresorhus/electron-unhandled) - Catch unhandled errors and promise rejections in your Electron app - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/electron-is-accelerator/.jshintrc b/electron/src/node_modules/electron-is-accelerator/.jshintrc deleted file mode 100755 index 91f833d..0000000 --- a/electron/src/node_modules/electron-is-accelerator/.jshintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "undef": true, - "unused": "vars", - "browser": true, - "node": true, - "eqnull": true, - "esnext": true, - "indent": 4 -} diff --git a/electron/src/node_modules/electron-is-accelerator/.npmignore b/electron/src/node_modules/electron-is-accelerator/.npmignore deleted file mode 100755 index 5148e52..0000000 --- a/electron/src/node_modules/electron-is-accelerator/.npmignore +++ /dev/null @@ -1,37 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules -jspm_packages - -# Optional npm cache directory -.npm - -# Optional REPL history -.node_repl_history diff --git a/electron/src/node_modules/electron-is-accelerator/.travis.yml b/electron/src/node_modules/electron-is-accelerator/.travis.yml deleted file mode 100755 index fdebe67..0000000 --- a/electron/src/node_modules/electron-is-accelerator/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 'stable' -sudo: false diff --git a/electron/src/node_modules/electron-is-accelerator/LICENSE b/electron/src/node_modules/electron-is-accelerator/LICENSE deleted file mode 100755 index 5866b7f..0000000 --- a/electron/src/node_modules/electron-is-accelerator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 Thomas Brouard - -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/electron/src/node_modules/electron-is-accelerator/README.md b/electron/src/node_modules/electron-is-accelerator/README.md deleted file mode 100755 index 63fcf7c..0000000 --- a/electron/src/node_modules/electron-is-accelerator/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# electron-is-accelerator - -Check if a string is a valid [Electron accelerator](https://github.com/electron/electron/blob/master/docs/api/accelerator.md) and return a boolean. This module can be used to validate user defined accelerators before using them with [MenuItems](http://electron.atom.io/docs/api/menu-item/). - -## Installation - -``` -$ npm install --save electron-is-accelerator -``` - -## Usage - -```javascript -var isAccelerator = require("electron-is-accelerator"); - -isAccelerator("CommandOrControl+Shift+Z"); // true -isAccelerator("CommandOrControl+F9"); // true -isAccelerator("CommandOrContrl+F9"); // false -isAccelerator("A+Z"); // false -``` - -## License - -The MIT License (MIT) -Copyright (c) 2016 Thomas Brouard diff --git a/electron/src/node_modules/electron-is-accelerator/index.js b/electron/src/node_modules/electron-is-accelerator/index.js deleted file mode 100755 index 6da27f5..0000000 --- a/electron/src/node_modules/electron-is-accelerator/index.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -const modifiers = /^(Command|Cmd|Control|Ctrl|CommandOrControl|CmdOrCtrl|Alt|Option|AltGr|Shift|Super)$/; -const keyCodes = /^([0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]']|F1*[1-9]|F10|F2[0-4]|Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen)$/; - -module.exports = function (str) { - let parts = str.split("+"); - let keyFound = false; - return parts.every((val, index) => { - const isKey = keyCodes.test(val); - const isModifier = modifiers.test(val); - if (isKey) { - // Key must be unique - if (keyFound) return false; - keyFound = true; - } - // Key is required - if (index === parts.length - 1 && !keyFound) return false; - return isKey || isModifier; - }); -}; diff --git a/electron/src/node_modules/electron-is-accelerator/package.json b/electron/src/node_modules/electron-is-accelerator/package.json deleted file mode 100755 index 997cefe..0000000 --- a/electron/src/node_modules/electron-is-accelerator/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "electron-is-accelerator", - "version": "0.1.2", - "description": "Check if a string is a valid Electron accelerator", - "main": "index.js", - "scripts": { - "test": "jshint *.js && ava" - }, - "repository": { - "type": "git", - "url": "https://github.com/brrd/electron-is-accelerator.git" - }, - "keywords": [ - "electron", - "accelerator" - ], - "author": "brrd", - "license": "MIT", - "bugs": { - "url": "https://github.com/brrd/electron-is-accelerator/issues" - }, - "homepage": "https://github.com/brrd/electron-is-accelerator", - "devDependencies": { - "ava": "^0.17.0", - "jshint": "^2.9.4" - } -} diff --git a/electron/src/node_modules/electron-is-accelerator/test.js b/electron/src/node_modules/electron-is-accelerator/test.js deleted file mode 100755 index 8fa6b77..0000000 --- a/electron/src/node_modules/electron-is-accelerator/test.js +++ /dev/null @@ -1,96 +0,0 @@ -import test from 'ava'; -import isAccelerator from '.'; - -const keys = [ - '0', - '1', - '9', - 'A', - 'G', - 'Z', - 'F1', - 'F5', - 'F24', - '~', - '!', - '@', - '#', - 'Plus', - 'Space', - 'Tab', - 'Backspace', - 'Delete', - 'Insert', - 'Return', - 'Enter', - 'Up', - 'Down', - 'Left', - 'Right', - 'Home', - 'End', - 'PageUp', - 'PageDown', - 'Escape', - 'Esc', - 'VolumeUp', - 'VolumeDown', - 'VolumeMute', - 'MediaNextTrack', - 'MediaPreviousTrack', - 'MediaStop', - 'MediaPlayPause', - 'PrintScreen' -]; - -const modifiers = [ - 'Command', - 'Cmd', - 'Control', - 'Ctrl', - 'CommandOrControl', - 'CmdOrCtrl', - 'Alt', - 'Option', - 'AltGr', - 'Shift', - 'Super' -]; - -test('multiple modifier', t => t.true(isAccelerator('CommandOrControl+Shift+Z'))); -test('multiple keys', t => t.false(isAccelerator('A+Z'))); -test('typos', t => t.false(isAccelerator('CommandOrContol+A'))); -test('modifiers without keys', t => t.false(isAccelerator('CmdOrCtrl'))); -test('multiple modifiers without keys', t => t.false(isAccelerator('CmdOrCtrl+Ctrl'))); -test('empty string', t => t.false(isAccelerator(''))); - -// tests to check each modifiers -modifiers.forEach(mod => test( - mod + ' modifier', - t => t.true( - isAccelerator(mod + '+A') - ) -)); - -// tests to check all keys -keys.forEach(key => test( - key + ' key', - t => t.true( - isAccelerator(key) - ) -)); - -// tests to check every combination of modifier and key -const testSequence = (sequence) => test( - `${sequence} sequence`, - t => t.true( - isAccelerator(`${sequence}`) - ) -); - -modifiers.forEach(mod => - keys.forEach(key => { - testSequence(`${mod}+${key}`); - testSequence(`${key}+${mod}`); - }) -); diff --git a/electron/src/node_modules/electron-is-dev/index.js b/electron/src/node_modules/electron-is-dev/index.js deleted file mode 100755 index b517c5c..0000000 --- a/electron/src/node_modules/electron-is-dev/index.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict'; -module.exports = process.defaultApp || /[\\/]electron-prebuilt[\\/]/.test(process.execPath) || /[\\/]electron[\\/]/.test(process.execPath); diff --git a/electron/src/node_modules/electron-is-dev/license b/electron/src/node_modules/electron-is-dev/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/electron-is-dev/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/electron-is-dev/package.json b/electron/src/node_modules/electron-is-dev/package.json deleted file mode 100755 index 0d6eaee..0000000 --- a/electron/src/node_modules/electron-is-dev/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "electron-is-dev", - "version": "0.1.2", - "description": "Check if Electron is running in development", - "license": "MIT", - "repository": "sindresorhus/electron-is-dev", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "scripts": { - "test": "xo" - }, - "files": [ - "index.js" - ], - "keywords": [ - "electron", - "dev", - "development", - "mode", - "prod", - "production", - "detect", - "check", - "debug", - "app" - ], - "devDependencies": { - "xo": "*" - }, - "xo": { - "esnext": true, - "envs": [ - "node", - "browser" - ] - } -} diff --git a/electron/src/node_modules/electron-is-dev/readme.md b/electron/src/node_modules/electron-is-dev/readme.md deleted file mode 100755 index 46f9a23..0000000 --- a/electron/src/node_modules/electron-is-dev/readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# electron-is-dev - -> Check if [Electron](http://electron.atom.io) is running in development - -Useful for enabling debug features only during development. - - -## Install - -``` -$ npm install --save electron-is-dev -``` - - -## Usage - -```js -const isDev = require('electron-is-dev'); - -if (isDev) { - console.log('Running in development'); -} else { - console.log('Running in production'); -} -``` - - -## Related - -- [electron-debug](https://github.com/sindresorhus/electron-debug) - Adds useful debug features to your Electron app - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/electron-localshortcut/README.md b/electron/src/node_modules/electron-localshortcut/README.md deleted file mode 100755 index a6117c9..0000000 --- a/electron/src/node_modules/electron-localshortcut/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# electron-localshortcut - -A module to register/unregister a keyboard shortcut -locally to a BrowserWindow instance, without using a Menu. - -This is built to circumvent [this Electron issue](https://github.com/atom/electron/issues/1334). - -**Note:** Since this module internally use `global-shortcut` native module, you should not use it until the `ready` event of the app module is emitted. See [electron docs](http://electron.atom.io/docs/latest/api/global-shortcut/). - -[![Travis Build Status](https://img.shields.io/travis/parro-it/electron-localshortcut.svg)](http://travis-ci.org/parro-it/electron-localshortcut) -[![NPM module](https://img.shields.io/npm/v/electron-localshortcut.svg)](https://npmjs.org/package/electron-localshortcut) -[![NPM downloads](https://img.shields.io/npm/dt/electron-localshortcut.svg)](https://npmjs.org/package/electron-localshortcut) -[![Greenkeeper badge](https://badges.greenkeeper.io/parro-it/electron-localshortcut.svg)](https://greenkeeper.io/) - -# Installation - -```bash -npm install --save electron-localshortcut -``` - -# Usage - -```javascript - const electronLocalshortcut = require('electron-localshortcut'); - const BrowserWindow = require('electron').BrowserWindow; - - const win = new BrowserWindow(); - win.loadUrl('https://github.com'); - win.show(); - - electronLocalshortcut.register(win, 'Ctrl+A', () => { - console.log('You pressed ctrl & A'); - }); - - electronLocalshortcut.register(win, 'Ctrl+B', () => { - console.log('You pressed ctrl & B'); - }); - - console.log( - electronLocalshortcut.isRegistered(win, 'Ctrl+A') - ); // true - - electronLocalshortcut.unregister(win, 'Ctrl+A'); - electronLocalshortcut.unregisterAll(win); -``` - -# App shortcuts. - -If you omit the window argument of `isRegistered`, `unregisterAll`, `unregister` and `register` methods, the shortcut is registered as an app shortcut. -It is active when any window of the app is focused. - -They differ from native [global-shortcuts](https://github.com/atom/electron/blob/master/docs/api/global-shortcut.md) because they doesn't interfere with other apps running on the same machine. - -# Shortcut behaviour. - -If you register a shortcut for a window, this module unregister the shortcut when the window is hidden, unfocused or minimized, and automatically restore them when the window is restored and focused again. - -If you register an app shortcut, this module unregister the shortcut when all windows of your app are hidden, unfocused or minimized, and automatically restore it when any window of your app is restored and focused again. - - -# API - - - -## disableAll - -Disable all of the shortcuts registered on the BrowserWindow instance. -Registered shortcuts no more works on the `window` instance, but the module keep a reference on them. You can reactivate them later by calling `enableAll` method on the same window instance. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance - -Returns **[Undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)** - -## enableAll - -Enable all of the shortcuts registered on the BrowserWindow instance that you had previously disabled calling `disableAll` method. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance - -Returns **[Undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)** - -## unregisterAll - -Unregisters all of the shortcuts registered on any focused BrowserWindow instance. This method does not unregister any shortcut you registered on a particular window instance. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance - -Returns **[Undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)** - -## register - -Registers the shortcut `accelerator`on the BrowserWindow instance. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance to register. This argument could be omitted, in this case the function register the shortcut on all app windows. -- `accelerator` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the shortcut to register -- `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** This function is called when the shortcut is pressed and the window is focused and not minimized. - -Returns **[Undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)** - -## unregister - -Unregisters the shortcut of `accelerator` registered on the BrowserWindow instance. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance to unregister. This argument could be omitted, in this case the function unregister the shortcut on all app windows. If you registered the shortcut on a particular window instance, it will do nothing. -- `accelerator` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the shortcut to unregister - -Returns **[Undefined](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)** - -## isRegistered - -Returns `true` or `false` depending on whether the shortcut `accelerator` is -registered on `window`. - -**Parameters** - -- `win` **BrowserWindow** BrowserWindow instance to check. This argument could be omitted, in this case the function returns whether the shortcut `accelerator` is registered on all app windows. If you registered the shortcut on a particular window instance, it return false. -- `accelerator` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** the shortcut to check - -Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** if the shortcut `accelerator` is registered on `window`. - -# License - -The MIT License (MIT) - -Copyright (c) 2017 Andrea Parodi diff --git a/electron/src/node_modules/electron-localshortcut/index.js b/electron/src/node_modules/electron-localshortcut/index.js deleted file mode 100755 index 4630907..0000000 --- a/electron/src/node_modules/electron-localshortcut/index.js +++ /dev/null @@ -1,308 +0,0 @@ -'use strict'; -const {app, BrowserWindow} = require('electron'); -const isAccelerator = require('electron-is-accelerator'); -const equals = require('keyboardevents-areequal'); -const {toKeyEvent} = require('keyboardevent-from-electron-accelerator'); -const _debug = require('debug'); - -const debug = _debug('electron-localshortcut'); - -// A placeholder to register shortcuts -// on any window of the app. -const ANY_WINDOW = {}; - -const windowsWithShortcuts = new WeakMap(); - -const title = win => { - if (win) { - try { - return win.getTitle(); - } catch (err) { - return 'A destroyed window'; - } - } - - return 'An falsy value'; -}; - -function _checkAccelerator(accelerator) { - if (!isAccelerator(accelerator)) { - const w = {}; - Error.captureStackTrace(w); - const msg = ` -WARNING: ${accelerator} is not a valid accelerator. - -${w.stack.split('\n').slice(4).join('\n')} -`; - console.error(msg); - } -} - -/** - * Disable all of the shortcuts registered on the BrowserWindow instance. - * Registered shortcuts no more works on the `window` instance, but the module - * keep a reference on them. You can reactivate them later by calling `enableAll` - * method on the same window instance. - * @param {BrowserWindow} win BrowserWindow instance - * @return {Undefined} - */ -function disableAll(win) { - debug(`Disabling all shortcuts on window ${title(win)}`); - const wc = win.webContents; - const shortcutsOfWindow = windowsWithShortcuts.get(wc); - - for (const shortcut of shortcutsOfWindow) { - shortcut.enabled = false; - } -} - -/** - * Enable all of the shortcuts registered on the BrowserWindow instance that - * you had previously disabled calling `disableAll` method. - * @param {BrowserWindow} win BrowserWindow instance - * @return {Undefined} - */ -function enableAll(win) { - debug(`Enabling all shortcuts on window ${title(win)}`); - const wc = win.webContents; - const shortcutsOfWindow = windowsWithShortcuts.get(wc); - - for (const shortcut of shortcutsOfWindow) { - shortcut.enabled = true; - } -} - -/** - * Unregisters all of the shortcuts registered on any focused BrowserWindow - * instance. This method does not unregister any shortcut you registered on - * a particular window instance. - * @param {BrowserWindow} win BrowserWindow instance - * @return {Undefined} - */ -function unregisterAll(win) { - debug(`Unregistering all shortcuts on window ${title(win)}`); - const wc = win.webContents; - const shortcutsOfWindow = windowsWithShortcuts.get(wc); - - // Remove listener from window - shortcutsOfWindow.removeListener(); - - windowsWithShortcuts.delete(wc); -} - -function _normalizeEvent(input) { - const normalizedEvent = { - code: input.code, - key: input.key - }; - - ['alt', 'shift', 'meta'].forEach(prop => { - if (typeof input[prop] !== 'undefined') { - normalizedEvent[`${prop}Key`] = input[prop]; - } - }); - - if (typeof input.control !== 'undefined') { - normalizedEvent.ctrlKey = input.control; - } - - return normalizedEvent; -} - -function _findShortcut(event, shortcutsOfWindow) { - let i = 0; - for (const shortcut of shortcutsOfWindow) { - if (equals(shortcut.eventStamp, event)) { - return i; - } - i++; - } - return -1; -} - -const _onBeforeInput = shortcutsOfWindow => (e, input) => { - if (input.type === 'keyUp') { - return; - } - - const event = _normalizeEvent(input); - - debug(`before-input-event: ${input} is translated to: ${event}`); - for (const {eventStamp, callback} of shortcutsOfWindow) { - if (equals(eventStamp, event)) { - debug(`eventStamp: ${eventStamp} match`); - callback(); - return; - } - debug(`eventStamp: ${eventStamp} no match`); - } -}; - -/** -* Registers the shortcut `accelerator`on the BrowserWindow instance. - * @param {BrowserWindow} win - BrowserWindow instance to register. - * This argument could be omitted, in this case the function register - * the shortcut on all app windows. - * @param {String} accelerator - the shortcut to register - * @param {Function} callback This function is called when the shortcut is pressed - * and the window is focused and not minimized. - * @return {Undefined} - */ -function register(win, accelerator, callback) { - let wc; - if (typeof callback === 'undefined') { - wc = ANY_WINDOW; - callback = accelerator; - accelerator = win; - } else { - wc = win.webContents; - } - - debug(`Registering callback for ${accelerator} on window ${title(win)}`); - _checkAccelerator(accelerator); - - debug(`${accelerator} seems a valid shortcut sequence.`); - - let shortcutsOfWindow; - if (windowsWithShortcuts.has(wc)) { - debug(`Window has others shortcuts registered.`); - shortcutsOfWindow = windowsWithShortcuts.get(wc); - } else { - debug(`This is the first shortcut of the window.`); - shortcutsOfWindow = []; - windowsWithShortcuts.set(wc, shortcutsOfWindow); - - if (wc === ANY_WINDOW) { - const keyHandler = _onBeforeInput(shortcutsOfWindow); - const enableAppShortcuts = (e, win) => { - const wc = win.webContents; - wc.on('before-input-event', keyHandler); - wc.once( - 'closed', - () => wc.removeListener('before-input-event', keyHandler) - ); - }; - - // Enable shortcut on current windows - const windows = BrowserWindow.getAllWindows(); - - windows.forEach(win => enableAppShortcuts(null, win)); - - // Enable shortcut on future windows - app.on( - 'browser-window-created', - enableAppShortcuts - ); - - shortcutsOfWindow.removeListener = () => { - const windows = BrowserWindow.getAllWindows(); - windows.forEach(win => - win.webContents.removeListener( - 'before-input-event', - keyHandler - ) - ); - app.removeListener( - 'browser-window-created', - enableAppShortcuts - ); - }; - } else { - const keyHandler = _onBeforeInput(shortcutsOfWindow); - wc.on('before-input-event', keyHandler); - - // Save a reference to allow remove of listener from elsewhere - shortcutsOfWindow.removeListener = () => wc.removeListener('before-input-event', keyHandler); - wc.once('closed', shortcutsOfWindow.removeListener); - } - } - - debug(`Adding shortcut to window set.`); - - const eventStamp = toKeyEvent(accelerator); - - shortcutsOfWindow.push({ - eventStamp, - callback, - enabled: true - }); - - debug(`Shortcut registered.`); -} - -/** - * Unregisters the shortcut of `accelerator` registered on the BrowserWindow instance. - * @param {BrowserWindow} win - BrowserWindow instance to unregister. - * This argument could be omitted, in this case the function unregister the shortcut - * on all app windows. If you registered the shortcut on a particular window instance, it will do nothing. - * @param {String} accelerator - the shortcut to unregister - * @return {Undefined} - */ -function unregister(win, accelerator) { - let wc; - if (typeof accelerator === 'undefined') { - wc = ANY_WINDOW; - accelerator = win; - } else { - if (win.isDestroyed()) { - debug(`Early return because window is destroyed.`); - return; - } - wc = win.webContents; - } - - debug(`Unregistering callback for ${accelerator} on window ${title(win)}`); - - _checkAccelerator(accelerator); - - debug(`${accelerator} seems a valid shortcut sequence.`); - - if (!windowsWithShortcuts.has(wc)) { - debug(`Early return because window has never had shortcuts registered.`); - return; - } - - const shortcutsOfWindow = windowsWithShortcuts.get(wc); - - const eventStamp = toKeyEvent(accelerator); - const shortcutIdx = _findShortcut(eventStamp, shortcutsOfWindow); - if (shortcutIdx === -1) { - return; - } - - shortcutsOfWindow.splice(shortcutIdx, 1); - - // If the window has no more shortcuts, - // we remove it early from the WeakMap - // and unregistering the event listener - if (shortcutsOfWindow.length === 0) { - // Remove listener from window - shortcutsOfWindow.removeListener(); - - // Remove window from shrtcuts catalog - windowsWithShortcuts.delete(wc); - } -} - -/** - * Returns `true` or `false` depending on whether the shortcut `accelerator` - * is registered on `window`. - * @param {BrowserWindow} win - BrowserWindow instance to check. This argument - * could be omitted, in this case the function returns whether the shortcut - * `accelerator` is registered on all app windows. If you registered the - * shortcut on a particular window instance, it return false. - * @param {String} accelerator - the shortcut to check - * @return {Boolean} - if the shortcut `accelerator` is registered on `window`. - */ -function isRegistered(win, accelerator) { - _checkAccelerator(accelerator); -} - -module.exports = { - register, - unregister, - isRegistered, - unregisterAll, - enableAll, - disableAll -}; diff --git a/electron/src/node_modules/electron-localshortcut/license b/electron/src/node_modules/electron-localshortcut/license deleted file mode 100755 index 1ddd606..0000000 --- a/electron/src/node_modules/electron-localshortcut/license +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2017 Andrea Parodi - - -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/electron/src/node_modules/electron-localshortcut/package.json b/electron/src/node_modules/electron-localshortcut/package.json deleted file mode 100755 index 72e4c4f..0000000 --- a/electron/src/node_modules/electron-localshortcut/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "electron-localshortcut", - "version": "3.0.2", - "description": "register/unregister a keyboard shortcut locally to a BrowserWindow instance, without using a Menu", - "repository": "parro-it/electron-localshortcut", - "license": "MIT", - "author": "andrea@parro.it", - "scripts": { - "doc": "documentation readme index.js --section=API", - "start": "electron example.js", - "test": "electron test.js | faucet && xo", - "setup-dev": "npm rebuild --runtime=electron --target=1.6.7 --disturl=https://atom.io/download/atom-shell --abi=51", - "tape": "DEBUG=electron-localshortcut electron test.js" - }, - "keywords": [ - "electron", - "shortcuts", - "browser-window" - ], - "files": [ - "index.js" - ], - "devDependencies": { - "delay": "^2.0.0", - "documentation": "^4.0.0-rc.1", - "electron": "^1.6.7", - "faucet": "^0.0.1", - "p-electron": "^0.8.0", - "p-event": "^1.1.0", - "p-timeout": "^1.0.0", - "robotjs": "^0.4.7", - "tape-async": "^2.3.0", - "xo": "^0.19.0" - }, - "dependencies": { - "debug": "^2.6.8", - "electron-is-accelerator": "^0.1.0", - "keyboardevent-from-electron-accelerator": "^0.7.0", - "keyboardevents-areequal": "^0.2.1" - } -} diff --git a/electron/src/node_modules/electron-log/LICENSE b/electron/src/node_modules/electron-log/LICENSE deleted file mode 100755 index 1f7f7e1..0000000 --- a/electron/src/node_modules/electron-log/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Alexey Prokhorov - -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/electron/src/node_modules/electron-log/README.md b/electron/src/node_modules/electron-log/README.md deleted file mode 100755 index 35461a2..0000000 --- a/electron/src/node_modules/electron-log/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# electron-log -[![Build Status](https://travis-ci.org/megahertz/electron-log.svg?branch=master)](https://travis-ci.org/megahertz/electron-log) -[![npm version](https://badge.fury.io/js/electron-log.svg)](https://badge.fury.io/js/electron-log) - -## Description - -Just a very simple logging module for your Electron or NW.js application. -No dependencies. No complicated configuration. Just require and use. -Also it can be used without Electron. - -By default it writes logs to the following locations: - - * **on Linux:** `~/.config//log.log` - * **on OS X:** `~/Library/Logs//log.log` - * **on Windows:** `%USERPROFILE%\AppData\Roaming\\log.log` - -## Installation - -Install with [npm](https://npmjs.org/package/electron-log): - - npm install electron-log - -## Usage - -```js -var log = require('electron-log'); - -log.info('Hello, log'); -``` - - -### Transport -Transport is a simple function which requires an object which describes a message. -By default, two transports are active: console and file. The file path is -dependent on current platform. - -#### Disable default transport: - -```js -log.transports.file = false; -log.transports.console = false; -``` - -#### Override transport: - -```js -log.transports.console = function(msg) { - console.log(`[${msg.date.toLocaleTimeString()} ${msg.level}] ${msg.text}`); -}; -``` - -#### Console Transport - -```js -// Log level -log.transports.console.level = 'warn'; - -/** - * Set output format template. Available variables: - * Main: {level}, {text} - * Date: {y},{m},{d},{h},{i},{s},{ms} - */ -log.transports.console.format = '{h}:{i}:{s}:{ms} {text}'; - -// Set a function which formats output -log.transports.console.format = (msg) => msg.text; -``` - -#### File transport - -```js -// Same as for console transport -log.transports.file.level = 'warn'; -log.transports.file.format = '{h}:{i}:{s}:{ms} {text}'; - -// Set maximum log size in bytes. When it exceeds, old log will be saved -// as log.old.log file -log.transports.file.maxSize = 5 * 1024 * 1024; - -// Write to this file, must be set before first logging -log.transports.file.file = __dirname + '/log.txt'; - -// fs.createWriteStream options, must be set before first logging -log.transports.file.streamConfig = { flags: 'w' }; - -// set existed file stream -log.transports.file.stream = fs.createWriteStream('log.txt'); -``` - -By default, file transport reads a productName or name property from package.json to -determine a log path like `~/.config//log.log`. -If you have no package.json or you want to specify another , -just set the appName property: - -```js -log.appName = 'test'; -``` - -## Change Log - -**1.3.0** - -- #18 Rename 'warning' log level to 'warn' - -**1.2.0** - - - #14 Use native console levels instead of console.log - -**1.0.16** - - - Prefer to use package.json:productName instead of package.json:name to - determine a log path. - -## License - -Licensed under MIT. diff --git a/electron/src/node_modules/electron-log/index.js b/electron/src/node_modules/electron-log/index.js deleted file mode 100755 index 856066e..0000000 --- a/electron/src/node_modules/electron-log/index.js +++ /dev/null @@ -1,344 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var path = require('path'); -var util = require('util'); -var EOL = require('os').EOL; - - -var LEVELS = [ 'error', 'warn', 'info', 'verbose', 'debug', 'silly' ]; - -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.error - */ -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.warn - */ -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.info - */ -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.verbose - */ -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.debug - */ -/** - * @param {string|Object} text - * @param {...Object} [objects] - * @name module.exports.silly - */ - -module.exports.log = log; - -module.exports.format = formatFile; - -/** - * Set this variable if you doesn't specify app name in package.json - * @type {undefined|string} - */ -module.exports.appName = undefined; - -module.exports.transports = {}; -module.exports.transports.console = transportConsole; -module.exports.transports.console.format = formatConsole; -module.exports.transports.console.level = 'silly'; - -module.exports.transports.file = transportFile; -module.exports.transports.file.format = formatFile; -module.exports.transports.file.level = 'warn'; -module.exports.transports.file.maxSize = 1024 * 1024; -module.exports.transports.file.streamConfig = undefined; - -module.exports.findLogPath = findLogPath; - -for (var i = 0; i < LEVELS.length; i++) { - module.exports[LEVELS[i]] = log.bind(module.exports, LEVELS[i]); -} - -/** - * @param {string} level - * @param {string} text - */ -function log(level, text) { - var args = Array.prototype.slice.call(arguments, 1); - args = args.map(function formatErrors(arg) { - return arg instanceof Error ? arg.stack + EOL : arg; - }); - text = util.format.apply(util, args); - - var msg = { - level: level, - text: text, - date: new Date() - }; - - var transports = module.exports.transports; - for (var i in transports) { - // jshint -W089 - if (!transports.hasOwnProperty(i) || typeof transports[i] !== 'function') { - continue; - } - if (!compareLevels(transports[i].level, level)) { - continue; - } - transports[i].call(module.exports, msg); - } -} - -function compareLevels(passLevel, checkLevel) { - var pass = LEVELS.indexOf(passLevel); - var check = LEVELS.indexOf(checkLevel); - if (check === -1 || pass === -1) { - return true; - } - return check <= pass; -} - -// region transport -function transportConsole(msg) { - var text = format(msg, transportConsole.format || module.exports.format); - if (console[msg.level]) { - console[msg.level](text); - } else { - console.log(text); - } -} - -function transportFile(msg) { - var text = format(msg, transportFile.format || module.exports.format); - - if (undefined === transportFile.stream) { - transportFile.file = transportFile.file || findLogPath(module.exports.appName); - if (!transportFile.file) { - transportFile.stream = false; - log('warn', 'electron-log.transports.file: Could not set a log file'); - return; - } - - if (transportFile.maxSize > 0) { - logRotate(transportFile.file, transportFile.maxSize); - } - - transportFile.stream = fs.createWriteStream( - transportFile.file, - transportFile.streamConfig || { flags: 'a' } - ); - } - - if (!transportFile.stream) { - return; - } - - transportFile.stream.write(text + EOL); -} - -function logRotate(file, maxSize) { - try { - const stat = fs.statSync(file); - if (stat.size > maxSize) { - fs.renameSync(file, file.replace(/log$/, 'old.log')); - } - } catch (e) {} -} -// endregion transport - -// region get log path -/** - * Try to determine a platform-specific path where can write logs - * @param {string} [appName] App name, path-safe, loads by package.json by default - * @return {string|boolean} - */ -function findLogPath(appName) { - appName = appName || findAppName(); - if (!appName) { - return false; - } - - var dir; - switch (process.platform) { - case 'linux': - dir = prepareDir(process.env['XDG_CONFIG_HOME'], appName) - .or(process.env['HOME'], '.config', appName) - .or(process.env['XDG_DATA_HOME'], appName) - .or(process.env['HOME'], '.local', 'share', appName) - .result; - break; - case 'darwin': - dir = prepareDir(process.env['HOME'], 'Library', 'Logs', appName) - .or(process.env['HOME'], 'Library', 'Application Support', appName) - .result; - break; - case 'win32': - dir = prepareDir(process.env['APPDATA'], appName) - .or(process.env['USERPROFILE'], 'AppData', 'Roaming', appName) - .result; - break; - } - - if (dir) { - return path.join(dir, 'log.log'); - } else { - return false; - } - - function findAppName() { - var appName; - try { - var appPkg = loadAppPackage(); - if (!appPkg || (!appPkg.productName && !appPkg.name)) { - transportFile.stream = false; - log('warn', 'electron-log cannot read a name from package.json'); - return false; - } - appName = appPkg.productName || appPkg.name; - } catch (e) { - transportFile.stream = false; - log('warn', 'electron-log: ' + e.message); - return false; - } - return appName; - } - - function prepareDir(dirPath) { - // jshint -W040 - if (!this || this.or !== prepareDir || !this.result) { - if (!dirPath) { - return { or: prepareDir }; - } - dirPath = path.join.apply(path, arguments); - mkDir(dirPath); - try { - fs.accessSync(dirPath, fs.W_OK); - } catch (e) { - return { or: prepareDir }; - } - } - - return { - or: prepareDir, - result: (this ? this.result : false) || dirPath - }; - } - - function mkDir(dirPath, root) { - var dirs = dirPath.split(path.sep); - var dir = dirs.shift(); - root = (root || '') + dir + path.sep; - - try { - fs.mkdirSync(root); - } - catch (e) { - if (!fs.statSync(root).isDirectory()) { - throw new Error(e); - } - } - - return !dirs.length || mkDir(dirs.join(path.sep), root); - } -} - -/** - * Try to load main app package - * @throws {Error} - * @return {Object|null} - */ -function loadAppPackage() { - var packageFile; - try { - packageFile = find(path.dirname(require.main.filename)); - } catch (e) {} - if (!packageFile && process.resourcesPath) { - packageFile = find(path.join(process.resourcesPath, 'app.asar')); - } - if (!packageFile) { - packageFile = find(process.cwd()); - } - if (!packageFile) { - return null; - } - - var content = fs.readFileSync(packageFile, 'utf-8'); - return JSON.parse(content); - - - function find(root) { - var file; - while (!file) { - var parent; - file = path.join(root, 'package.json'); - try { - fs.statSync(file); - } catch (e) { - parent = path.resolve(root, '..'); - file = null; - } - if (root === parent) { - break; - } - root = parent; - } - return file; - } -} -// endregion get log path - -// region formatter -function format(msg, formatter) { - if (typeof formatter === 'function') { - return formatter(msg); - } - - var date = msg.date; - - return formatter - .replace('{level}', msg.level) - .replace('{text}', msg.text) - .replace('{y}', date.getFullYear()) - .replace('{m}', pad(date.getMonth() + 1)) - .replace('{d}', pad(date.getDate())) - .replace('{h}', pad(date.getHours())) - .replace('{i}', pad(date.getMinutes())) - .replace('{s}', pad(date.getSeconds())) - .replace('{ms}', pad(date.getMilliseconds(), 4)); -} - -function formatConsole(msg) { - var time = - pad(msg.date.getHours()) + ':' + - pad(msg.date.getMinutes()) + ':' + - pad(msg.date.getSeconds()) + ':' + - pad(msg.date.getMilliseconds(), 4); - - return '[' + time + '] [' + msg.level + '] ' + msg.text; -} - -function formatFile(msg) { - var date = - msg.date.getFullYear() + '-' + - pad(msg.date.getMonth() + 1) + '-' + - pad(msg.date.getDate()) + ' ' + - pad(msg.date.getHours()) + ':' + - pad(msg.date.getMinutes()) + ':' + - pad(msg.date.getSeconds()) + ':' + - pad(msg.date.getMilliseconds(), 4); - - return '[' + date + '] [' + msg.level + '] ' + msg.text; -} - -function pad(number, zeros) { - zeros = zeros || 2; - return (new Array(zeros + 1).join('0') + number).substr(-zeros, zeros); -} -// endregion formatter diff --git a/electron/src/node_modules/electron-log/package.json b/electron/src/node_modules/electron-log/package.json deleted file mode 100755 index 3058f2b..0000000 --- a/electron/src/node_modules/electron-log/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "electron-log", - "version": "1.3.0", - "description": "Just a very simple logging module for your Electron application", - "main": "index.js", - "scripts": { - "test": "npm run jshint && npm run jscs && npm run mocha", - "mocha": "node_modules/.bin/mocha ./index.spec.js", - "jscs": "node_modules/.bin/jscs .", - "jshint": "node_modules/.bin/jshint --exclude ./node_modules . --verbose" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/megahertz/electron-log.git" - }, - "files": [ - "index.js", - "README.md" - ], - "keywords": [ - "electron", - "atom", - "log", - "logger", - "logging", - "windows", - "mac", - "osx", - "linux", - "desktop" - ], - "author": "Alexey Prokhorov", - "license": "MIT", - "bugs": { - "url": "https://github.com/megahertz/electron-log/issues" - }, - "homepage": "https://github.com/megahertz/electron-log#readme", - "devDependencies": { - "chai": "*", - "jscs": "*", - "jshint": "*", - "jshint-reporter-jscs": "*", - "mocha": "*", - "rewire": "*" - } -} diff --git a/electron/src/node_modules/ext-list/index.js b/electron/src/node_modules/ext-list/index.js deleted file mode 100755 index ebee2ce..0000000 --- a/electron/src/node_modules/ext-list/index.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; -var mimeDb = require('mime-db'); - -module.exports = function () { - var ret = {}; - - Object.keys(mimeDb).forEach(function (x) { - var val = mimeDb[x]; - - if (val.extensions && val.extensions.length > 0) { - val.extensions.forEach(function (y) { - ret[y] = x; - }); - } - }); - - return ret; -}; diff --git a/electron/src/node_modules/ext-list/license b/electron/src/node_modules/ext-list/license deleted file mode 100755 index a8ecbbe..0000000 --- a/electron/src/node_modules/ext-list/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Kevin Mårtensson - -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/electron/src/node_modules/ext-list/package.json b/electron/src/node_modules/ext-list/package.json deleted file mode 100755 index cd2e0bc..0000000 --- a/electron/src/node_modules/ext-list/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "ext-list", - "version": "2.2.2", - "description": "List of known file extensions and their MIME types", - "license": "MIT", - "repository": "kevva/ext-list", - "author": { - "name": "Kevin Mårtensson", - "email": "kevinmartensson@gmail.com", - "url": "https://github.com/kevva" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ext", - "mime" - ], - "dependencies": { - "mime-db": "^1.28.0" - }, - "devDependencies": { - "ava": "*", - "xo": "*" - } -} diff --git a/electron/src/node_modules/ext-list/readme.md b/electron/src/node_modules/ext-list/readme.md deleted file mode 100755 index 893064d..0000000 --- a/electron/src/node_modules/ext-list/readme.md +++ /dev/null @@ -1,25 +0,0 @@ -# ext-list [![Build Status](http://img.shields.io/travis/kevva/ext-list.svg?style=flat)](https://travis-ci.org/kevva/ext-list) - -> Return a list of known [file extensions](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) and their MIME types - - -## Install - -``` -$ npm install --save ext-list -``` - - -## Usage - -```js -const extList = require('ext-list'); - -extList(); -//=> {'123': 'application/vnd.lotus-1-2-3', ez: 'application/andrew-inset', aw: 'application/applixware', ...} -``` - - -## License - -MIT © [Kevin Mårtensson](https://github.com/kevva) diff --git a/electron/src/node_modules/ext-name/index.js b/electron/src/node_modules/ext-name/index.js deleted file mode 100755 index 59ac1f6..0000000 --- a/electron/src/node_modules/ext-name/index.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; -const extList = require('ext-list'); -const sortKeysLength = require('sort-keys-length'); - -module.exports = str => { - const obj = sortKeysLength.desc(extList()); - const exts = Object.keys(obj).filter(x => str.endsWith(x)); - - if (exts.length === 0) { - return []; - } - - return exts.map(x => ({ - ext: x, - mime: obj[x] - })); -}; - -module.exports.mime = str => { - const obj = sortKeysLength.desc(extList()); - const exts = Object.keys(obj).filter(x => obj[x] === str); - - if (exts.length === 0) { - return []; - } - - return exts.map(x => ({ - ext: x, - mime: obj[x] - })); -}; diff --git a/electron/src/node_modules/ext-name/license b/electron/src/node_modules/ext-name/license deleted file mode 100755 index a8ecbbe..0000000 --- a/electron/src/node_modules/ext-name/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Kevin Mårtensson - -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/electron/src/node_modules/ext-name/package.json b/electron/src/node_modules/ext-name/package.json deleted file mode 100755 index 7c12ccf..0000000 --- a/electron/src/node_modules/ext-name/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "ext-name", - "version": "5.0.0", - "description": "Get the file extension and MIME type from a file", - "license": "MIT", - "repository": "kevva/ext-name", - "author": { - "name": "Kevin Mårtensson", - "email": "kevinmartensson@gmail.com", - "url": "https://github.com/kevva" - }, - "engines": { - "node": ">=4" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "ext", - "extname", - "mime" - ], - "dependencies": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - }, - "devDependencies": { - "ava": "*", - "xo": "*" - } -} diff --git a/electron/src/node_modules/ext-name/readme.md b/electron/src/node_modules/ext-name/readme.md deleted file mode 100755 index 8df382b..0000000 --- a/electron/src/node_modules/ext-name/readme.md +++ /dev/null @@ -1,57 +0,0 @@ -# ext-name [![Build Status](https://travis-ci.org/kevva/ext-name.svg?branch=master)](https://travis-ci.org/kevva/ext-name) - -> Get the file extension and MIME type from a file - - -## Install - -``` -$ npm install --save ext-name -``` - - -## Usage - -```js -const extName = require('ext-name'); - -console.log(extName('foobar.tar')); -//=> [{ext: 'tar', mime: 'application/x-tar'}] - -console.log(extName.mime('application/x-tar')); -//=> [{ext: 'tar', mime: 'application/x-tar'}] -``` - - -## API - -### extName(filename) - -Returns an `Array` with objects with the file extension and MIME type. - -#### filename - -Type: `string` - -Get the extension and MIME type from a filename. - -### extName.mime(mimetype) - -Returns an `Array` with objects with the file extension and MIME type. - -#### mimetype - -Type: `string` - -Get the extension and MIME type from a MIME type. - - -## Related - -* [ext-name-cli](https://github.com/kevva/ext-name-cli) - CLI for this module -* [file-type](https://github.com/sindresorhus/file-type) - Detect the file type of a Buffer/Uint8Array - - -## License - -MIT © [Kevin Mårtensson](https://github.com/kevva) diff --git a/electron/src/node_modules/follow-redirects/LICENSE b/electron/src/node_modules/follow-redirects/LICENSE deleted file mode 100755 index 459a247..0000000 --- a/electron/src/node_modules/follow-redirects/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2017 Olivier Lalonde , James Talmage , Ruben Verborgh - -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/electron/src/node_modules/follow-redirects/README.md b/electron/src/node_modules/follow-redirects/README.md deleted file mode 100755 index 469abb0..0000000 --- a/electron/src/node_modules/follow-redirects/README.md +++ /dev/null @@ -1,155 +0,0 @@ -## Follow Redirects - -Drop-in replacement for Nodes `http` and `https` that automatically follows redirects. - -[![npm version](https://badge.fury.io/js/follow-redirects.svg)](https://www.npmjs.com/package/follow-redirects) -[![Build Status](https://travis-ci.org/olalonde/follow-redirects.svg?branch=master)](https://travis-ci.org/olalonde/follow-redirects) -[![Coverage Status](https://coveralls.io/repos/olalonde/follow-redirects/badge.svg?branch=master)](https://coveralls.io/r/olalonde/follow-redirects?branch=master) -[![Dependency Status](https://david-dm.org/olalonde/follow-redirects.svg)](https://david-dm.org/olalonde/follow-redirects) -[![devDependency Status](https://david-dm.org/olalonde/follow-redirects/dev-status.svg)](https://david-dm.org/olalonde/follow-redirects#info=devDependencies) - -[![NPM](https://nodei.co/npm/follow-redirects.png?downloads=true)](https://nodei.co/npm/follow-redirects/) - -`follow-redirects` provides [request](https://nodejs.org/api/http.html#http_http_request_options_callback) and [get](https://nodejs.org/api/http.html#http_http_get_options_callback) - methods that behave identically to those found on the native [http](https://nodejs.org/api/http.html#http_http_request_options_callback) and [https](https://nodejs.org/api/https.html#https_https_request_options_callback) - modules, with the exception that they will seamlessly follow redirects. - -```javascript -var http = require('follow-redirects').http; -var https = require('follow-redirects').https; - -http.get('http://bit.ly/900913', function (response) { - response.on('data', function (chunk) { - console.log(chunk); - }); -}).on('error', function (err) { - console.error(err); -}); -``` - -You can inspect the final redirected URL through the `responseUrl` property on the `response`. -If no redirection happened, `responseUrl` is the original request URL. - -```javascript -https.request({ - host: 'bitly.com', - path: '/UHfDGO', -}, function (response) { - console.log(response.responseUrl); - // 'http://duckduckgo.com/robots.txt' -}); -``` - -## Options -### Global options -Global options are set directly on the `follow-redirects` module: - -```javascript -var followRedirects = require('follow-redirects'); -followRedirects.maxRedirects = 10; -followRedirects.maxBodyLength = 20 * 1024 * 1024; // 20 MB -``` - -The following global options are supported: - -- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted. - -- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted. - - -### Per-request options -Per-request options are set by passing an `options` object: - -```javascript -var url = require('url'); -var followRedirects = require('follow-redirects'); - -var options = url.parse('http://bit.ly/900913'); -options.maxRedirects = 10; -http.request(options); -``` - -In addition to the [standard HTTP](https://nodejs.org/api/http.html#http_http_request_options_callback) and [HTTPS options](https://nodejs.org/api/https.html#https_https_request_options_callback), -the following per-request options are supported: -- `followRedirects` (default: `true`) – whether redirects should be followed. - -- `maxRedirects` (default: `21`) – sets the maximum number of allowed redirects; if exceeded, an error will be emitted. - -- `maxBodyLength` (default: 10MB) – sets the maximum size of the request body; if exceeded, an error will be emitted. - -- `agents` (default: `undefined`) – sets the `agent` option per protocol, since HTTP and HTTPS use different agents. Example value: `{ http: new http.Agent(), https: new https.Agent() }` - - -### Advanced usage -By default, `follow-redirects` will use the Node.js default implementations -of [`http`](https://nodejs.org/api/http.html) -and [`https`](https://nodejs.org/api/https.html). -To enable features such as caching and/or intermediate request tracking, -you might instead want to wrap `follow-redirects` around custom protocol implementations: - -```javascript -var followRedirects = require('follow-redirects').wrap({ - http: require('your-custom-http'), - https: require('your-custom-https'), -}); -``` - -Such custom protocols only need an implementation of the `request` method. - -## Browserify Usage - -Due to the way `XMLHttpRequest` works, the `browserify` versions of `http` and `https` already follow redirects. - If you are *only* targeting the browser, then this library has little value for you. If you want to write cross - platform code for node and the browser, `follow-redirects` provides a great solution for making the native node - modules behave the same as they do in browserified builds in the browser. To avoid bundling unnecessary code - you should tell browserify to swap out `follow-redirects` with the standard modules when bundling. - To make this easier, you need to change how you require the modules: - -```javascript -var http = require('follow-redirects/http'); -var https = require('follow-redirects/https'); -``` - -You can then replace `follow-redirects` in your browserify configuration like so: - -```javascript -"browser": { - "follow-redirects/http" : "http", - "follow-redirects/https" : "https" -} -``` - -The `browserify-http` module has not kept pace with node development, and no long behaves identically to the native - module when running in the browser. If you are experiencing problems, you may want to check out - [browserify-http-2](https://www.npmjs.com/package/http-browserify-2). It is more actively maintained and - attempts to address a few of the shortcomings of `browserify-http`. In that case, your browserify config should - look something like this: - -```javascript -"browser": { - "follow-redirects/http" : "browserify-http-2/http", - "follow-redirects/https" : "browserify-http-2/https" -} -``` - -## Contributing - -Pull Requests are always welcome. Please [file an issue](https://github.com/olalonde/follow-redirects/issues) - detailing your proposal before you invest your valuable time. Additional features and bug fixes should be accompanied - by tests. You can run the test suite locally with a simple `npm test` command. - -## Debug Logging - -`follow-redirects` uses the excellent [debug](https://www.npmjs.com/package/debug) for logging. To turn on logging - set the environment variable `DEBUG=follow-redirects` for debug output from just this module. When running the test - suite it is sometimes advantageous to set `DEBUG=*` to see output from the express server as well. - -## Authors - -- Olivier Lalonde (olalonde@gmail.com) -- James Talmage (james@talmage.io) -- [Ruben Verborgh](https://ruben.verborgh.org/) - -## License - -MIT: [http://olalonde.mit-license.org](http://olalonde.mit-license.org) diff --git a/electron/src/node_modules/follow-redirects/http.js b/electron/src/node_modules/follow-redirects/http.js deleted file mode 100755 index 695e356..0000000 --- a/electron/src/node_modules/follow-redirects/http.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./").http; diff --git a/electron/src/node_modules/follow-redirects/https.js b/electron/src/node_modules/follow-redirects/https.js deleted file mode 100755 index d21c921..0000000 --- a/electron/src/node_modules/follow-redirects/https.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./").https; diff --git a/electron/src/node_modules/follow-redirects/index.js b/electron/src/node_modules/follow-redirects/index.js deleted file mode 100755 index 95a02e5..0000000 --- a/electron/src/node_modules/follow-redirects/index.js +++ /dev/null @@ -1,267 +0,0 @@ -var url = require("url"); -var http = require("http"); -var https = require("https"); -var assert = require("assert"); -var Writable = require("stream").Writable; -var debug = require("debug")("follow-redirects"); - -// RFC7231§4.2.1: Of the request methods defined by this specification, -// the GET, HEAD, OPTIONS, and TRACE methods are defined to be safe. -var SAFE_METHODS = { GET: true, HEAD: true, OPTIONS: true, TRACE: true }; - -// Create handlers that pass events from native requests -var eventHandlers = Object.create(null); -["abort", "aborted", "error", "socket", "timeout"].forEach(function (event) { - eventHandlers[event] = function (arg) { - this._redirectable.emit(event, arg); - }; -}); - -// An HTTP(S) request that can be redirected -function RedirectableRequest(options, responseCallback) { - // Initialize the request - Writable.call(this); - options.headers = options.headers || {}; - this._options = options; - this._redirectCount = 0; - this._requestBodyLength = 0; - this._requestBodyBuffers = []; - - // Attach a callback if passed - if (responseCallback) { - this.on("response", responseCallback); - } - - // React to responses of native requests - var self = this; - this._onNativeResponse = function (response) { - self._processResponse(response); - }; - - // Complete the URL object when necessary - if (!options.pathname && options.path) { - var searchPos = options.path.indexOf("?"); - if (searchPos < 0) { - options.pathname = options.path; - } - else { - options.pathname = options.path.substring(0, searchPos); - options.search = options.path.substring(searchPos); - } - } - - // Perform the first request - this._performRequest(); -} -RedirectableRequest.prototype = Object.create(Writable.prototype); - -// Writes buffered data to the current native request -RedirectableRequest.prototype.write = function (data, encoding, callback) { - if (this._requestBodyLength + data.length <= this._options.maxBodyLength) { - this._requestBodyLength += data.length; - this._requestBodyBuffers.push({ data: data, encoding: encoding }); - this._currentRequest.write(data, encoding, callback); - } - else { - this.emit("error", new Error("Request body larger than maxBodyLength limit")); - this.abort(); - } -}; - -// Ends the current native request -RedirectableRequest.prototype.end = function (data, encoding, callback) { - var currentRequest = this._currentRequest; - if (!data) { - currentRequest.end(null, null, callback); - } - else { - this.write(data, encoding, function () { - currentRequest.end(null, null, callback); - }); - } -}; - -// Sets a header value on the current native request -RedirectableRequest.prototype.setHeader = function (name, value) { - this._options.headers[name] = value; - this._currentRequest.setHeader(name, value); -}; - -// Clears a header value on the current native request -RedirectableRequest.prototype.removeHeader = function (name) { - delete this._options.headers[name]; - this._currentRequest.removeHeader(name); -}; - -// Proxy all other public ClientRequest methods -[ - "abort", "flushHeaders", "getHeader", - "setNoDelay", "setSocketKeepAlive", "setTimeout", -].forEach(function (method) { - RedirectableRequest.prototype[method] = function (a, b) { - return this._currentRequest[method](a, b); - }; -}); - -// Proxy all public ClientRequest properties -["aborted", "connection", "socket"].forEach(function (property) { - Object.defineProperty(RedirectableRequest.prototype, property, { - get: function () { return this._currentRequest[property]; }, - }); -}); - -// Executes the next native request (initial or redirect) -RedirectableRequest.prototype._performRequest = function () { - // Load the native protocol - var protocol = this._options.protocol; - var nativeProtocol = this._options.nativeProtocols[protocol]; - - // If specified, use the agent corresponding to the protocol - // (HTTP and HTTPS use different types of agents) - if (this._options.agents) { - var scheme = protocol.substr(0, protocol.length - 1); - this._options.agent = this._options.agents[scheme]; - } - - // Create the native request - var request = this._currentRequest = - nativeProtocol.request(this._options, this._onNativeResponse); - this._currentUrl = url.format(this._options); - - // Set up event handlers - request._redirectable = this; - for (var event in eventHandlers) { - /* istanbul ignore else */ - if (event) { - request.on(event, eventHandlers[event]); - } - } - - // End a redirected request - // (The first request must be ended explicitly with RedirectableRequest#end) - if (this._isRedirect) { - // Write the request entity and end. - var requestBodyBuffers = this._requestBodyBuffers; - (function writeNext() { - if (requestBodyBuffers.length !== 0) { - var buffer = requestBodyBuffers.pop(); - request.write(buffer.data, buffer.encoding, writeNext); - } - else { - request.end(); - } - }()); - } -}; - -// Processes a response from the current native request -RedirectableRequest.prototype._processResponse = function (response) { - // RFC7231§6.4: The 3xx (Redirection) class of status code indicates - // that further action needs to be taken by the user agent in order to - // fulfill the request. If a Location header field is provided, - // the user agent MAY automatically redirect its request to the URI - // referenced by the Location field value, - // even if the specific status code is not understood. - var location = response.headers.location; - if (location && this._options.followRedirects !== false && - response.statusCode >= 300 && response.statusCode < 400) { - // RFC7231§6.4: A client SHOULD detect and intervene - // in cyclical redirections (i.e., "infinite" redirection loops). - if (++this._redirectCount > this._options.maxRedirects) { - this.emit("error", new Error("Max redirects exceeded.")); - return; - } - - // RFC7231§6.4: Automatic redirection needs to done with - // care for methods not known to be safe […], - // since the user might not wish to redirect an unsafe request. - // RFC7231§6.4.7: The 307 (Temporary Redirect) status code indicates - // that the target resource resides temporarily under a different URI - // and the user agent MUST NOT change the request method - // if it performs an automatic redirection to that URI. - var header; - var headers = this._options.headers; - if (response.statusCode !== 307 && !(this._options.method in SAFE_METHODS)) { - this._options.method = "GET"; - // Drop a possible entity and headers related to it - this._requestBodyBuffers = []; - for (header in headers) { - if (/^content-/i.test(header)) { - delete headers[header]; - } - } - } - - // Drop the Host header, as the redirect might lead to a different host - if (!this._isRedirect) { - for (header in headers) { - if (/^host$/i.test(header)) { - delete headers[header]; - } - } - } - - // Perform the redirected request - var redirectUrl = url.resolve(this._currentUrl, location); - debug("redirecting to", redirectUrl); - Object.assign(this._options, url.parse(redirectUrl)); - this._isRedirect = true; - this._performRequest(); - } - else { - // The response is not a redirect; return it as-is - response.responseUrl = this._currentUrl; - this.emit("response", response); - - // Clean up - this._requestBodyBuffers = []; - } -}; - -// Wraps the key/value object of protocols with redirect functionality -function wrap(protocols) { - // Default settings - var exports = { - maxRedirects: 21, - maxBodyLength: 10 * 1024 * 1024, - }; - - // Wrap each protocol - var nativeProtocols = {}; - Object.keys(protocols).forEach(function (scheme) { - var protocol = scheme + ":"; - var nativeProtocol = nativeProtocols[protocol] = protocols[scheme]; - var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol); - - // Executes a request, following redirects - wrappedProtocol.request = function (options, callback) { - if (typeof options === "string") { - options = url.parse(options); - options.maxRedirects = exports.maxRedirects; - } - else { - options = Object.assign({ - protocol: protocol, - maxRedirects: exports.maxRedirects, - maxBodyLength: exports.maxBodyLength, - }, options); - } - options.nativeProtocols = nativeProtocols; - assert.equal(options.protocol, protocol, "protocol mismatch"); - debug("options", options); - return new RedirectableRequest(options, callback); - }; - - // Executes a GET request, following redirects - wrappedProtocol.get = function (options, callback) { - var request = wrappedProtocol.request(options, callback); - request.end(); - return request; - }; - }); - return exports; -} - -// Exports -module.exports = wrap({ http: http, https: https }); -module.exports.wrap = wrap; diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/.coveralls.yml b/electron/src/node_modules/follow-redirects/node_modules/debug/.coveralls.yml deleted file mode 100755 index 20a7068..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/.coveralls.yml +++ /dev/null @@ -1 +0,0 @@ -repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/.eslintrc b/electron/src/node_modules/follow-redirects/node_modules/debug/.eslintrc deleted file mode 100755 index 146371e..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/.eslintrc +++ /dev/null @@ -1,14 +0,0 @@ -{ - "env": { - "browser": true, - "node": true - }, - "globals": { - "chrome": true - }, - "rules": { - "no-console": 0, - "no-empty": [1, { "allowEmptyCatch": true }] - }, - "extends": "eslint:recommended" -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/.npmignore b/electron/src/node_modules/follow-redirects/node_modules/debug/.npmignore deleted file mode 100755 index 5f60eec..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -support -test -examples -example -*.sock -dist -yarn.lock -coverage -bower.json diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/.travis.yml b/electron/src/node_modules/follow-redirects/node_modules/debug/.travis.yml deleted file mode 100755 index a764300..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -sudo: false - -language: node_js - -node_js: - - "4" - - "6" - - "8" - -install: - - make install - -script: - - make lint - - make test - -matrix: - include: - - node_js: '8' - env: BROWSER=1 diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/CHANGELOG.md b/electron/src/node_modules/follow-redirects/node_modules/debug/CHANGELOG.md deleted file mode 100755 index 820d21e..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/CHANGELOG.md +++ /dev/null @@ -1,395 +0,0 @@ - -3.1.0 / 2017-09-26 -================== - - * Add `DEBUG_HIDE_DATE` env var (#486) - * Remove ReDoS regexp in %o formatter (#504) - * Remove "component" from package.json - * Remove `component.json` - * Ignore package-lock.json - * Examples: fix colors printout - * Fix: browser detection - * Fix: spelling mistake (#496, @EdwardBetts) - -3.0.1 / 2017-08-24 -================== - - * Fix: Disable colors in Edge and Internet Explorer (#489) - -3.0.0 / 2017-08-08 -================== - - * Breaking: Remove DEBUG_FD (#406) - * Breaking: Use `Date#toISOString()` instead to `Date#toUTCString()` when output is not a TTY (#418) - * Breaking: Make millisecond timer namespace specific and allow 'always enabled' output (#408) - * Addition: document `enabled` flag (#465) - * Addition: add 256 colors mode (#481) - * Addition: `enabled()` updates existing debug instances, add `destroy()` function (#440) - * Update: component: update "ms" to v2.0.0 - * Update: separate the Node and Browser tests in Travis-CI - * Update: refactor Readme, fixed documentation, added "Namespace Colors" section, redid screenshots - * Update: separate Node.js and web browser examples for organization - * Update: update "browserify" to v14.4.0 - * Fix: fix Readme typo (#473) - -2.6.9 / 2017-09-22 -================== - - * remove ReDoS regexp in %o formatter (#504) - -2.6.8 / 2017-05-18 -================== - - * Fix: Check for undefined on browser globals (#462, @marbemac) - -2.6.7 / 2017-05-16 -================== - - * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) - * Fix: Inline extend function in node implementation (#452, @dougwilson) - * Docs: Fix typo (#455, @msasad) - -2.6.5 / 2017-04-27 -================== - - * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) - * Misc: clean up browser reference checks (#447, @thebigredgeek) - * Misc: add npm-debug.log to .gitignore (@thebigredgeek) - - -2.6.4 / 2017-04-20 -================== - - * Fix: bug that would occur if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) - * Chore: ignore bower.json in npm installations. (#437, @joaovieira) - * Misc: update "ms" to v0.7.3 (@tootallnate) - -2.6.3 / 2017-03-13 -================== - - * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) - * Docs: Changelog fix (@thebigredgeek) - -2.6.2 / 2017-03-10 -================== - - * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) - * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) - * Docs: Add Slackin invite badge (@tootallnate) - -2.6.1 / 2017-02-10 -================== - - * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error - * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) - * Fix: IE8 "Expected identifier" error (#414, @vgoma) - * Fix: Namespaces would not disable once enabled (#409, @musikov) - -2.6.0 / 2016-12-28 -================== - - * Fix: added better null pointer checks for browser useColors (@thebigredgeek) - * Improvement: removed explicit `window.debug` export (#404, @tootallnate) - * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) - -2.5.2 / 2016-12-25 -================== - - * Fix: reference error on window within webworkers (#393, @KlausTrainer) - * Docs: fixed README typo (#391, @lurch) - * Docs: added notice about v3 api discussion (@thebigredgeek) - -2.5.1 / 2016-12-20 -================== - - * Fix: babel-core compatibility - -2.5.0 / 2016-12-20 -================== - - * Fix: wrong reference in bower file (@thebigredgeek) - * Fix: webworker compatibility (@thebigredgeek) - * Fix: output formatting issue (#388, @kribblo) - * Fix: babel-loader compatibility (#383, @escwald) - * Misc: removed built asset from repo and publications (@thebigredgeek) - * Misc: moved source files to /src (#378, @yamikuronue) - * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) - * Test: coveralls integration (#378, @yamikuronue) - * Docs: simplified language in the opening paragraph (#373, @yamikuronue) - -2.4.5 / 2016-12-17 -================== - - * Fix: `navigator` undefined in Rhino (#376, @jochenberger) - * Fix: custom log function (#379, @hsiliev) - * Improvement: bit of cleanup + linting fixes (@thebigredgeek) - * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) - * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) - -2.4.4 / 2016-12-14 -================== - - * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) - -2.4.3 / 2016-12-14 -================== - - * Fix: navigation.userAgent error for react native (#364, @escwald) - -2.4.2 / 2016-12-14 -================== - - * Fix: browser colors (#367, @tootallnate) - * Misc: travis ci integration (@thebigredgeek) - * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) - -2.4.1 / 2016-12-13 -================== - - * Fix: typo that broke the package (#356) - -2.4.0 / 2016-12-13 -================== - - * Fix: bower.json references unbuilt src entry point (#342, @justmatt) - * Fix: revert "handle regex special characters" (@tootallnate) - * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) - * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) - * Improvement: allow colors in workers (#335, @botverse) - * Improvement: use same color for same namespace. (#338, @lchenay) - -2.3.3 / 2016-11-09 -================== - - * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) - * Fix: Returning `localStorage` saved values (#331, Levi Thomason) - * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) - -2.3.2 / 2016-11-09 -================== - - * Fix: be super-safe in index.js as well (@TooTallNate) - * Fix: should check whether process exists (Tom Newby) - -2.3.1 / 2016-11-09 -================== - - * Fix: Added electron compatibility (#324, @paulcbetts) - * Improvement: Added performance optimizations (@tootallnate) - * Readme: Corrected PowerShell environment variable example (#252, @gimre) - * Misc: Removed yarn lock file from source control (#321, @fengmk2) - -2.3.0 / 2016-11-07 -================== - - * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) - * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) - * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) - * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) - * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) - * Package: Update "ms" to 0.7.2 (#315, @DevSide) - * Package: removed superfluous version property from bower.json (#207 @kkirsche) - * Readme: fix USE_COLORS to DEBUG_COLORS - * Readme: Doc fixes for format string sugar (#269, @mlucool) - * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) - * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) - * Readme: better docs for browser support (#224, @matthewmueller) - * Tooling: Added yarn integration for development (#317, @thebigredgeek) - * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) - * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) - * Misc: Updated contributors (@thebigredgeek) - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/LICENSE b/electron/src/node_modules/follow-redirects/node_modules/debug/LICENSE deleted file mode 100755 index 658c933..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 TJ Holowaychuk - -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/electron/src/node_modules/follow-redirects/node_modules/debug/Makefile b/electron/src/node_modules/follow-redirects/node_modules/debug/Makefile deleted file mode 100755 index 3ddd136..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# get Makefile directory name: http://stackoverflow.com/a/5982798/376773 -THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) -THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd) - -# BIN directory -BIN := $(THIS_DIR)/node_modules/.bin - -# Path -PATH := node_modules/.bin:$(PATH) -SHELL := /bin/bash - -# applications -NODE ?= $(shell which node) -YARN ?= $(shell which yarn) -PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm)) -BROWSERIFY ?= $(NODE) $(BIN)/browserify - -install: node_modules - -browser: dist/debug.js - -node_modules: package.json - @NODE_ENV= $(PKG) install - @touch node_modules - -dist/debug.js: src/*.js node_modules - @mkdir -p dist - @$(BROWSERIFY) \ - --standalone debug \ - . > dist/debug.js - -lint: - @eslint *.js src/*.js - -test-node: - @istanbul cover node_modules/mocha/bin/_mocha -- test/**.js - @cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js - -test-browser: - @$(MAKE) browser - @karma start --single-run - -test-all: - @concurrently \ - "make test-node" \ - "make test-browser" - -test: - @if [ "x$(BROWSER)" = "x" ]; then \ - $(MAKE) test-node; \ - else \ - $(MAKE) test-browser; \ - fi - -clean: - rimraf dist coverage - -.PHONY: browser install clean lint test test-all test-node test-browser diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/README.md b/electron/src/node_modules/follow-redirects/node_modules/debug/README.md deleted file mode 100755 index 8e754d1..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/README.md +++ /dev/null @@ -1,368 +0,0 @@ -# debug -[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) - - - -A tiny JavaScript debugging utility modelled after Node.js core's debugging -technique. Works in Node.js and web browsers. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - -`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. - -Example [_app.js_](./examples/node/app.js): - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %o', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example [_worker.js_](./examples/node/worker.js): - -```js -var a = require('debug')('worker:a') - , b = require('debug')('worker:b'); - -function work() { - a('doing lots of uninteresting work'); - setTimeout(work, Math.random() * 1000); -} - -work(); - -function workb() { - b('doing some work'); - setTimeout(workb, Math.random() * 2000); -} - -workb(); -``` - -The `DEBUG` environment variable is then used to enable these based on space or -comma-delimited names. - -Here are some examples: - -screen shot 2017-08-08 at 12 53 04 pm -screen shot 2017-08-08 at 12 53 38 pm -screen shot 2017-08-08 at 12 53 25 pm - -#### Windows note - -On Windows the environment variable is set using the `set` command. - -```cmd -set DEBUG=*,-not_this -``` - -Note that PowerShell uses different syntax to set environment variables. - -```cmd -$env:DEBUG = "*,-not_this" -``` - -Then, run the program to be debugged as usual. - - -## Namespace Colors - -Every debug instance has a color generated for it based on its namespace name. -This helps when visually parsing the debug output to identify which debug instance -a debug line belongs to. - -#### Node.js - -In Node.js, colors are enabled when stderr is a TTY. You also _should_ install -the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, -otherwise debug will only use a small handful of basic colors. - - - -#### Web Browser - -Colors are also enabled on "Web Inspectors" that understand the `%c` formatting -option. These are WebKit web inspectors, Firefox ([since version -31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) -and the Firebug plugin for Firefox (any version). - - - - -## Millisecond diff - -When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - - -When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: - - - - -## Conventions - -If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. - -## Wildcards - -The `*` character may be used as a wildcard. Suppose for example your library has -debuggers named "connect:bodyParser", "connect:compress", "connect:session", -instead of listing all three with -`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do -`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - -You can also exclude specific debuggers by prefixing them with a "-" character. -For example, `DEBUG=*,-connect:*` would include all debuggers except those -starting with "connect:". - -## Environment Variables - -When running through Node.js, you can set a few environment variables that will -change the behavior of the debug logging: - -| Name | Purpose | -|-----------|-------------------------------------------------| -| `DEBUG` | Enables/disables specific debugging namespaces. | -| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | -| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | -| `DEBUG_DEPTH` | Object inspection depth. | -| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | - - -__Note:__ The environment variables beginning with `DEBUG_` end up being -converted into an Options object that gets used with `%o`/`%O` formatters. -See the Node.js documentation for -[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) -for the complete list. - -## Formatters - -Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. -Below are the officially supported formatters: - -| Formatter | Representation | -|-----------|----------------| -| `%O` | Pretty-print an Object on multiple lines. | -| `%o` | Pretty-print an Object all on a single line. | -| `%s` | String. | -| `%d` | Number (both integer and float). | -| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | -| `%%` | Single percent sign ('%'). This does not consume an argument. | - - -### Custom formatters - -You can add custom formatters by extending the `debug.formatters` object. -For example, if you wanted to add support for rendering a Buffer as hex with -`%h`, you could do something like: - -```js -const createDebug = require('debug') -createDebug.formatters.h = (v) => { - return v.toString('hex') -} - -// …elsewhere -const debug = createDebug('foo') -debug('this is hex: %h', new Buffer('hello world')) -// foo this is hex: 68656c6c6f20776f726c6421 +0ms -``` - - -## Browser Support - -You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), -or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), -if you don't want to build it yourself. - -Debug's enable state is currently persisted by `localStorage`. -Consider the situation shown below where you have `worker:a` and `worker:b`, -and wish to debug both. You can enable this using `localStorage.debug`: - -```js -localStorage.debug = 'worker:*' -``` - -And then refresh the page. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - - -## Output streams - - By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: - -Example [_stdout.js_](./examples/node/stdout.js): - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - -## Checking whether a debug target is enabled - -After you've created a debug instance, you can determine whether or not it is -enabled by checking the `enabled` property: - -```javascript -const debug = require('debug')('http'); - -if (debug.enabled) { - // do stuff... -} -``` - -You can also manually toggle this property to force the debug instance to be -enabled or disabled. - - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - - Andrew Rhyne - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## License - -(The MIT License) - -Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> - -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/electron/src/node_modules/follow-redirects/node_modules/debug/karma.conf.js b/electron/src/node_modules/follow-redirects/node_modules/debug/karma.conf.js deleted file mode 100755 index 103a82d..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/karma.conf.js +++ /dev/null @@ -1,70 +0,0 @@ -// Karma configuration -// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC) - -module.exports = function(config) { - config.set({ - - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['mocha', 'chai', 'sinon'], - - - // list of files / patterns to load in the browser - files: [ - 'dist/debug.js', - 'test/*spec.js' - ], - - - // list of files to exclude - exclude: [ - 'src/node.js' - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - }, - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress'], - - - // web server port - port: 9876, - - - // enable / disable colors in the output (reporters and logs) - colors: true, - - - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, - - - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, - - - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['PhantomJS'], - - - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: false, - - // Concurrency level - // how many browser should be started simultaneous - concurrency: Infinity - }) -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/node.js b/electron/src/node_modules/follow-redirects/node_modules/debug/node.js deleted file mode 100755 index 7fc36fe..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/node.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./src/node'); diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/package.json b/electron/src/node_modules/follow-redirects/node_modules/debug/package.json deleted file mode 100755 index ada43cf..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "debug", - "version": "3.1.0", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": "TJ Holowaychuk ", - "contributors": [ - "Nathan Rajlich (http://n8.io)", - "Andrew Rhyne " - ], - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - }, - "devDependencies": { - "browserify": "14.4.0", - "chai": "^3.5.0", - "concurrently": "^3.1.0", - "coveralls": "^2.11.15", - "eslint": "^3.12.1", - "istanbul": "^0.4.5", - "karma": "^1.3.0", - "karma-chai": "^0.1.0", - "karma-mocha": "^1.3.0", - "karma-phantomjs-launcher": "^1.0.2", - "karma-sinon": "^1.0.5", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "^1.2.0", - "rimraf": "^2.5.4", - "sinon": "^1.17.6", - "sinon-chai": "^2.8.0" - }, - "main": "./src/index.js", - "browser": "./src/browser.js" -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/src/browser.js b/electron/src/node_modules/follow-redirects/node_modules/debug/src/browser.js deleted file mode 100755 index f5149ff..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/src/browser.js +++ /dev/null @@ -1,195 +0,0 @@ -/** - * This is the web browser implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = 'undefined' != typeof chrome - && 'undefined' != typeof chrome.storage - ? chrome.storage.local - : localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', - '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', - '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', - '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', - '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', - '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', - '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', - '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', - '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', - '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', - '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') { - return true; - } - - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } - - // is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -exports.formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (err) { - return '[UnexpectedJSONParseError]: ' + err.message; - } -}; - - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - var useColors = this.useColors; - - args[0] = (useColors ? '%c' : '') - + this.namespace - + (useColors ? ' %c' : ' ') - + args[0] - + (useColors ? '%c ' : ' ') - + '+' + exports.humanize(this.diff); - - if (!useColors) return; - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit') - - // the final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function(match) { - if ('%%' === match) return; - index++; - if ('%c' === match) { - // we only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - -function log() { - // this hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return 'object' === typeof console - && console.log - && Function.prototype.apply.call(console.log, console, arguments); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - try { - if (null == namespaces) { - exports.storage.removeItem('debug'); - } else { - exports.storage.debug = namespaces; - } - } catch(e) {} -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - var r; - try { - r = exports.storage.debug; - } catch(e) {} - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Enable namespaces listed in `localStorage.debug` initially. - */ - -exports.enable(load()); - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - return window.localStorage; - } catch (e) {} -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/src/debug.js b/electron/src/node_modules/follow-redirects/node_modules/debug/src/debug.js deleted file mode 100755 index 77e6384..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/src/debug.js +++ /dev/null @@ -1,225 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; -exports.coerce = coerce; -exports.disable = disable; -exports.enable = enable; -exports.enabled = enabled; -exports.humanize = require('ms'); - -/** - * Active `debug` instances. - */ -exports.instances = []; - -/** - * The currently active debug mode names, and names to skip. - */ - -exports.names = []; -exports.skips = []; - -/** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - -exports.formatters = {}; - -/** - * Select a color. - * @param {String} namespace - * @return {Number} - * @api private - */ - -function selectColor(namespace) { - var hash = 0, i; - - for (i in namespace) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return exports.colors[Math.abs(hash) % exports.colors.length]; -} - -/** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - -function createDebug(namespace) { - - var prevTime; - - function debug() { - // disabled? - if (!debug.enabled) return; - - var self = debug; - - // set `diff` timestamp - var curr = +new Date(); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - // turn the `arguments` into a proper Array - var args = new Array(arguments.length); - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i]; - } - - args[0] = exports.coerce(args[0]); - - if ('string' !== typeof args[0]) { - // anything else let's inspect with %O - args.unshift('%O'); - } - - // apply any `formatters` transformations - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { - // if we encounter an escaped % then don't increase the array index - if (match === '%%') return match; - index++; - var formatter = exports.formatters[format]; - if ('function' === typeof formatter) { - var val = args[index]; - match = formatter.call(self, val); - - // now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // apply env-specific formatting (colors, etc.) - exports.formatArgs.call(self, args); - - var logFn = debug.log || exports.log || console.log.bind(console); - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = exports.enabled(namespace); - debug.useColors = exports.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - - // env-specific initialization logic for debug instances - if ('function' === typeof exports.init) { - exports.init(debug); - } - - exports.instances.push(debug); - - return debug; -} - -function destroy () { - var index = exports.instances.indexOf(this); - if (index !== -1) { - exports.instances.splice(index, 1); - return true; - } else { - return false; - } -} - -/** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - -function enable(namespaces) { - exports.save(namespaces); - - exports.names = []; - exports.skips = []; - - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) continue; // ignore empty strings - namespaces = split[i].replace(/\*/g, '.*?'); - if (namespaces[0] === '-') { - exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - exports.names.push(new RegExp('^' + namespaces + '$')); - } - } - - for (i = 0; i < exports.instances.length; i++) { - var instance = exports.instances[i]; - instance.enabled = exports.enabled(instance.namespace); - } -} - -/** - * Disable debug output. - * - * @api public - */ - -function disable() { - exports.enable(''); -} - -/** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - -function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - var i, len; - for (i = 0, len = exports.skips.length; i < len; i++) { - if (exports.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = exports.names.length; i < len; i++) { - if (exports.names[i].test(name)) { - return true; - } - } - return false; -} - -/** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function coerce(val) { - if (val instanceof Error) return val.stack || val.message; - return val; -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/src/index.js b/electron/src/node_modules/follow-redirects/node_modules/debug/src/index.js deleted file mode 100755 index cabcbcd..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Detect Electron renderer process, which is node, but we should - * treat as a browser. - */ - -if (typeof process === 'undefined' || process.type === 'renderer') { - module.exports = require('./browser.js'); -} else { - module.exports = require('./node.js'); -} diff --git a/electron/src/node_modules/follow-redirects/node_modules/debug/src/node.js b/electron/src/node_modules/follow-redirects/node_modules/debug/src/node.js deleted file mode 100755 index d666fb9..0000000 --- a/electron/src/node_modules/follow-redirects/node_modules/debug/src/node.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Module dependencies. - */ - -var tty = require('tty'); -var util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - * - * Expose `debug()` as the module. - */ - -exports = module.exports = require('./debug'); -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [ 6, 2, 3, 4, 5, 1 ]; - -try { - var supportsColor = require('supports-color'); - if (supportsColor && supportsColor.level >= 2) { - exports.colors = [ - 20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, - 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, - 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 214, 215, 220, 221 - ]; - } -} catch (err) { - // swallow - we only care if `supports-color` is available; it doesn't have to be. -} - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(function (key) { - return /^debug_/i.test(key); -}).reduce(function (obj, key) { - // camel-case - var prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() }); - - // coerce string value into JS value - var val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) val = true; - else if (/^(no|off|false|disabled)$/i.test(val)) val = false; - else if (val === 'null') val = null; - else val = Number(val); - - obj[prop] = val; - return obj; -}, {}); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts - ? Boolean(exports.inspectOpts.colors) - : tty.isatty(process.stderr.fd); -} - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -exports.formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .split('\n').map(function(str) { - return str.trim() - }).join(' '); -}; - -/** - * Map %o to `util.inspect()`, allowing multiple lines if needed. - */ - -exports.formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - var name = this.namespace; - var useColors = this.useColors; - - if (useColors) { - var c = this.color; - var colorCode = '\u001b[3' + (c < 8 ? c : '8;5;' + c); - var prefix = ' ' + colorCode + ';1m' + name + ' ' + '\u001b[0m'; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\u001b[0m'); - } else { - args[0] = getDate() + name + ' ' + args[0]; - } -} - -function getDate() { - if (exports.inspectOpts.hideDate) { - return ''; - } else { - return new Date().toISOString() + ' '; - } -} - -/** - * Invokes `util.format()` with the specified arguments and writes to stderr. - */ - -function log() { - return process.stderr.write(util.format.apply(util, arguments) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - -function save(namespaces) { - if (null == namespaces) { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } else { - process.env.DEBUG = namespaces; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init (debug) { - debug.inspectOpts = {}; - - var keys = Object.keys(exports.inspectOpts); - for (var i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -/** - * Enable namespaces listed in `process.env.DEBUG` initially. - */ - -exports.enable(load()); diff --git a/electron/src/node_modules/follow-redirects/package.json b/electron/src/node_modules/follow-redirects/package.json deleted file mode 100755 index 7782c65..0000000 --- a/electron/src/node_modules/follow-redirects/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "follow-redirects", - "version": "1.4.1", - "description": "HTTP and HTTPS modules that follow redirects.", - "main": "index.js", - "engines": { - "node": ">=4.0" - }, - "scripts": { - "test": "npm run lint && npm run mocha", - "lint": "eslint *.js test", - "mocha": "nyc mocha" - }, - "repository": { - "type": "git", - "url": "git@github.com:olalonde/follow-redirects.git" - }, - "homepage": "https://github.com/olalonde/follow-redirects", - "bugs": { - "url": "https://github.com/olalonde/follow-redirects/issues" - }, - "keywords": [ - "http", - "https", - "url", - "redirect", - "client", - "location", - "utility" - ], - "author": { - "name": "Olivier Lalonde", - "email": "olalonde@gmail.com", - "url": "http://www.syskall.com" - }, - "contributors": [ - "James Talmage ", - "Ruben Verborgh (https://ruben.verborgh.org/)" - ], - "files": [ - "index.js", - "create.js", - "http.js", - "https.js" - ], - "dependencies": { - "debug": "^3.1.0" - }, - "devDependencies": { - "bluebird": "^3.5.1", - "concat-stream": "^1.6.0", - "coveralls": "^3.0.0", - "eslint": "^4.16.0", - "express": "^4.16.2", - "mocha": "^5.0.0", - "nyc": "^11.4.1" - }, - "license": "MIT", - "nyc": { - "reporter": [ - "lcov", - "text" - ] - } -} diff --git a/electron/src/node_modules/is-buffer/LICENSE b/electron/src/node_modules/is-buffer/LICENSE deleted file mode 100755 index 0c068ce..0000000 --- a/electron/src/node_modules/is-buffer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Feross Aboukhadijeh - -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/electron/src/node_modules/is-buffer/README.md b/electron/src/node_modules/is-buffer/README.md deleted file mode 100755 index cce0a8c..0000000 --- a/electron/src/node_modules/is-buffer/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# is-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url] - -[travis-image]: https://img.shields.io/travis/feross/is-buffer/master.svg -[travis-url]: https://travis-ci.org/feross/is-buffer -[npm-image]: https://img.shields.io/npm/v/is-buffer.svg -[npm-url]: https://npmjs.org/package/is-buffer -[downloads-image]: https://img.shields.io/npm/dm/is-buffer.svg -[downloads-url]: https://npmjs.org/package/is-buffer -[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg -[standard-url]: https://standardjs.com - -#### Determine if an object is a [`Buffer`](http://nodejs.org/api/buffer.html) (including the [browserify Buffer](https://github.com/feross/buffer)) - -[![saucelabs][saucelabs-image]][saucelabs-url] - -[saucelabs-image]: https://saucelabs.com/browser-matrix/is-buffer.svg -[saucelabs-url]: https://saucelabs.com/u/is-buffer - -## Why not use `Buffer.isBuffer`? - -This module lets you check if an object is a `Buffer` without using `Buffer.isBuffer` (which includes the whole [buffer](https://github.com/feross/buffer) module in [browserify](http://browserify.org/)). - -It's future-proof and works in node too! - -## install - -```bash -npm install is-buffer -``` - -## usage - -```js -var isBuffer = require('is-buffer') - -isBuffer(new Buffer(4)) // true - -isBuffer(undefined) // false -isBuffer(null) // false -isBuffer('') // false -isBuffer(true) // false -isBuffer(false) // false -isBuffer(0) // false -isBuffer(1) // false -isBuffer(1.0) // false -isBuffer('string') // false -isBuffer({}) // false -isBuffer(function foo () {}) // false -``` - -## license - -MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org). diff --git a/electron/src/node_modules/is-buffer/index.js b/electron/src/node_modules/is-buffer/index.js deleted file mode 100755 index 9cce396..0000000 --- a/electron/src/node_modules/is-buffer/index.js +++ /dev/null @@ -1,21 +0,0 @@ -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ - -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} - -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} - -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) -} diff --git a/electron/src/node_modules/is-buffer/package.json b/electron/src/node_modules/is-buffer/package.json deleted file mode 100755 index ea12137..0000000 --- a/electron/src/node_modules/is-buffer/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "is-buffer", - "description": "Determine if an object is a Buffer", - "version": "1.1.6", - "author": { - "name": "Feross Aboukhadijeh", - "email": "feross@feross.org", - "url": "http://feross.org/" - }, - "bugs": { - "url": "https://github.com/feross/is-buffer/issues" - }, - "dependencies": {}, - "devDependencies": { - "standard": "*", - "tape": "^4.0.0", - "zuul": "^3.0.0" - }, - "keywords": [ - "buffer", - "buffers", - "type", - "core buffer", - "browser buffer", - "browserify", - "typed array", - "uint32array", - "int16array", - "int32array", - "float32array", - "float64array", - "browser", - "arraybuffer", - "dataview" - ], - "license": "MIT", - "main": "index.js", - "repository": { - "type": "git", - "url": "git://github.com/feross/is-buffer.git" - }, - "scripts": { - "test": "standard && npm run test-node && npm run test-browser", - "test-browser": "zuul -- test/*.js", - "test-browser-local": "zuul --local -- test/*.js", - "test-node": "tape test/*.js" - }, - "testling": { - "files": "test/*.js" - } -} diff --git a/electron/src/node_modules/is-buffer/test/basic.js b/electron/src/node_modules/is-buffer/test/basic.js deleted file mode 100755 index be4f8e4..0000000 --- a/electron/src/node_modules/is-buffer/test/basic.js +++ /dev/null @@ -1,24 +0,0 @@ -var isBuffer = require('../') -var test = require('tape') - -test('is-buffer', function (t) { - t.equal(isBuffer(Buffer.alloc(4)), true, 'new Buffer(4)') - t.equal(isBuffer(Buffer.allocUnsafeSlow(100)), true, 'SlowBuffer(100)') - - t.equal(isBuffer(undefined), false, 'undefined') - t.equal(isBuffer(null), false, 'null') - t.equal(isBuffer(''), false, 'empty string') - t.equal(isBuffer(true), false, 'true') - t.equal(isBuffer(false), false, 'false') - t.equal(isBuffer(0), false, '0') - t.equal(isBuffer(1), false, '1') - t.equal(isBuffer(1.0), false, '1.0') - t.equal(isBuffer('string'), false, 'string') - t.equal(isBuffer({}), false, '{}') - t.equal(isBuffer([]), false, '[]') - t.equal(isBuffer(function foo () {}), false, 'function foo () {}') - t.equal(isBuffer({ isBuffer: null }), false, '{ isBuffer: null }') - t.equal(isBuffer({ isBuffer: function () { throw new Error() } }), false, '{ isBuffer: function () { throw new Error() } }') - - t.end() -}) diff --git a/electron/src/node_modules/is-plain-obj/index.js b/electron/src/node_modules/is-plain-obj/index.js deleted file mode 100755 index 0d1ba9e..0000000 --- a/electron/src/node_modules/is-plain-obj/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; -var toString = Object.prototype.toString; - -module.exports = function (x) { - var prototype; - return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); -}; diff --git a/electron/src/node_modules/is-plain-obj/license b/electron/src/node_modules/is-plain-obj/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/is-plain-obj/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/is-plain-obj/package.json b/electron/src/node_modules/is-plain-obj/package.json deleted file mode 100755 index d331f6e..0000000 --- a/electron/src/node_modules/is-plain-obj/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "is-plain-obj", - "version": "1.1.0", - "description": "Check if a value is a plain object", - "license": "MIT", - "repository": "sindresorhus/is-plain-obj", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "obj", - "object", - "is", - "check", - "test", - "type", - "plain", - "vanilla", - "pure", - "simple" - ], - "devDependencies": { - "ava": "0.0.4" - } -} diff --git a/electron/src/node_modules/is-plain-obj/readme.md b/electron/src/node_modules/is-plain-obj/readme.md deleted file mode 100755 index 269e56a..0000000 --- a/electron/src/node_modules/is-plain-obj/readme.md +++ /dev/null @@ -1,35 +0,0 @@ -# is-plain-obj [![Build Status](https://travis-ci.org/sindresorhus/is-plain-obj.svg?branch=master)](https://travis-ci.org/sindresorhus/is-plain-obj) - -> Check if a value is a plain object - -An object is plain if it's created by either `{}`, `new Object()` or `Object.create(null)`. - - -## Install - -``` -$ npm install --save is-plain-obj -``` - - -## Usage - -```js -var isPlainObj = require('is-plain-obj'); - -isPlainObj({foo: 'bar'}); -//=> true - -isPlainObj([1, 2, 3]); -//=> false -``` - - -## Related - -- [is-obj](https://github.com/sindresorhus/is-obj) - Check if a value is an object - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/electron/src/node_modules/keyboardevent-from-electron-accelerator/README.md b/electron/src/node_modules/keyboardevent-from-electron-accelerator/README.md deleted file mode 100755 index 65d66ee..0000000 --- a/electron/src/node_modules/keyboardevent-from-electron-accelerator/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# keyboardevent-from-electron-accelerator - -[![Travis Build Status](https://img.shields.io/travis/parro-it/keyboardevent-from-electron-accelerator/master.svg)](http://travis-ci.org/parro-it/keyboardevent-from-electron-accelerator) -[![NPM downloads](https://img.shields.io/npm/dt/keyboardevent-from-electron-accelerator.svg)](https://npmjs.org/package/keyboardevent-from-electron-accelerator) - -> Transform an Electron Accelerator string into a DOM KeyboardEvent. - -This module export a function that take an Electron Accelerator as input -and return a corresponding KeyboardEvent object. - -E.g. `'Ctrl+Alt+C' => {code: 'c', ctrlKey: true, altKey: true}` - -## Usage - -This example convert a string containing an Electron Accelerator to a corresponding KeyboardEvent object. Returned object is the keyevent that would be emitted if that key combination was pressed. - -```js -const {toKeyEvent} = require('keyboardevent-from-electron-accelerator'); -console.log(toKeyEvent('Shift+Delete')); -``` - -This will output - - {key: 'Delete', shiftKey: true} - -## Context and motivation for this module. - -This module is part of an ongoing effort to make [electron-localshortcut](https://github.com/parro-it/electron-localshortcut) less error prone, using keyboard DOM listener instead of 'globalShortcut' method to trigger shortcuts handlers. - -`electron-localshortcut` will listen for DOM `keydown` and `keyup` events, and will -trigger shortcuts handlers if emitted DOM events match the Accelerator. - -This module wrap the core logic of that match operation. - -You can help by testing the module on [runkit](https://npm.runkit.com/keyboardevent-from-electron-accelerator) and [opening an issue](https://github.com/parro-it/keyboardevent-from-electron-accelerator/issues/new) if you found some wrong -result. - - -## API - - - -### toKeyEvent - -This function transform an Electron Accelerator string into -a DOM KeyboardEvent object. - -**Parameters** - -- `accelerator` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** an Electron Accelerator string, e.g. `Ctrl+C` or `Shift+Space`. - -Returns **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** a DOM KeyboardEvent object derivate from the `accelerator` argument. - -## Install - -With [npm](https://npmjs.org/) installed, run - - $ npm install keyboardevent-from-electron-accelerator - -## See Also - -- [`noffle/common-readme`](https://github.com/noffle/common-readme) - -## License - -MIT diff --git a/electron/src/node_modules/keyboardevent-from-electron-accelerator/example.js b/electron/src/node_modules/keyboardevent-from-electron-accelerator/example.js deleted file mode 100755 index f13adb3..0000000 --- a/electron/src/node_modules/keyboardevent-from-electron-accelerator/example.js +++ /dev/null @@ -1,5 +0,0 @@ -const {toKeyEvent} = require('keyboardevent-from-electron-accelerator'); -console.log(toKeyEvent('Ctrl+Shift+V')); -console.log(toKeyEvent('Control+c')); -console.log(toKeyEvent('Alt+Delete')); - diff --git a/electron/src/node_modules/keyboardevent-from-electron-accelerator/index.js b/electron/src/node_modules/keyboardevent-from-electron-accelerator/index.js deleted file mode 100755 index a07e20a..0000000 --- a/electron/src/node_modules/keyboardevent-from-electron-accelerator/index.js +++ /dev/null @@ -1,195 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -const modifiers = /^(CommandOrControl|CmdOrCtrl|Command|Cmd|Control|Ctrl|Alt|Option|AltGr|Shift|Super)/i; -const keyCodes = /^(Plus|Space|Tab|Backspace|Delete|Insert|Return|Enter|Up|Down|Left|Right|Home|End|PageUp|PageDown|Escape|Esc|VolumeUp|VolumeDown|VolumeMute|MediaNextTrack|MediaPreviousTrack|MediaStop|MediaPlayPause|PrintScreen|F24|F23|F22|F21|F20|F19|F18|F17|F16|F15|F14|F13|F12|F11|F10|F9|F8|F7|F6|F5|F4|F3|F2|F1|[0-9A-Z)!@#$%^&*(:+<_>?~{|}";=,\-./`[\\\]'])/i; - -function reduceModifier({accelerator, event}, modifier) { - switch (modifier) { - case 'command': - case 'cmd': { - if (event.metaKey) { - throw new Error('Double `Command` modifier specified.'); - } - - return { - event: Object.assign({}, event, {metaKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - case 'super': { - if (event.metaKey) { - throw new Error('Double `Super` modifier specified.'); - } - - return { - event: Object.assign({}, event, {metaKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - case 'control': - case 'ctrl': { - if (event.ctrlKey) { - throw new Error('Double `Control` modifier specified.'); - } - - return { - event: Object.assign({}, event, {ctrlKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - case 'commandorcontrol': - case 'cmdorctrl': { - if (process.platform === 'darwin') { - if (event.metaKey) { - throw new Error('Double `Command` modifier specified.'); - } - - return { - event: Object.assign({}, event, {metaKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - - if (event.ctrlKey) { - throw new Error('Double `Control` modifier specified.'); - } - - return { - event: Object.assign({}, event, {ctrlKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - case 'option': - case 'altgr': - case 'alt': { - if (event.altKey) { - throw new Error('Double `Alt` modifier specified.'); - } - - return { - event: Object.assign({}, event, {altKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - case 'shift': { - if (event.shiftKey) { - throw new Error('Double `Shift` modifier specified.'); - } - - return { - event: Object.assign({}, event, {shiftKey: true}), - accelerator: accelerator.slice(modifier.length) - }; - } - - default: - console.error(modifier); - } -} - -function reducePlus({accelerator, event}) { - return { - event, - accelerator: accelerator.trim().slice(1) - }; -} - -function reduceKey({accelerator, event}, key) { - return { - event: Object.assign({}, event, {key}), - accelerator: accelerator.trim().slice(key.length) - }; -} - -const domKeys = Object.assign(Object.create(null), { - plus: 'Add', - space: ' ', - tab: 'Tab', - backspace: 'Backspace', - delete: 'Delete', - insert: 'Insert', - return: 'Return', - enter: 'Return', - up: 'ArrowUp', - down: 'ArrowDown', - left: 'ArrowLeft', - right: 'ArrowRight', - home: 'Home', - end: 'End', - pageup: 'PageUp', - pagedown: 'PageDown', - escape: 'Escape', - esc: 'Escape', - volumeup: 'AudioVolumeUp', - volumedown: 'AudioVolumeDown', - volumemute: 'AudioVolumeMute', - medianexttrack: 'MediaTrackNext', - mediaprevioustrack: 'MediaTrackPrevious', - mediastop: 'MediaStop', - mediaplaypause: 'MediaPlayPause', - printscreen: 'PrintScreen' -}); - -// Add function keys -for (let i = 1; i <= 24; i++) { - domKeys[`f${i}`] = `F${i}`; -} - -function reduceCode({accelerator, event}, {code, key}) { - return { - event: Object.assign({}, event, {key}, code ? {code} : null), - accelerator: accelerator.trim().slice((key && key.length) || 0) - }; -} - -/** - * This function transform an Electron Accelerator string into - * a DOM KeyboardEvent object. - * - * @param {string} accelerator an Electron Accelerator string, e.g. `Ctrl+C` or `Shift+Space`. - * @return {object} a DOM KeyboardEvent object derivate from the `accelerator` argument. - */ -function toKeyEvent(accelerator) { - let state = {accelerator, event: {}}; - while (state.accelerator !== '') { - const modifierMatch = state.accelerator.match(modifiers); - if (modifierMatch) { - const modifier = modifierMatch[0].toLowerCase(); - state = reduceModifier(state, modifier); - } else if (state.accelerator.trim()[0] === '+') { - state = reducePlus(state); - } else { - const codeMatch = state.accelerator.match(keyCodes); - if (codeMatch) { - const code = codeMatch[0].toLowerCase(); - if (code in domKeys) { - state = reduceCode(state, { - code: domKeys[code], - key: code - }); - } else { - state = reduceKey(state, code); - } - } else { - throw new Error(`Unvalid accelerator: "${state.accelerator}"`); - } - } - } - return state.event; -} - -function match(accelerator, keyEvent) { - if (toKeyEvent(accelerator).code === keyEvent.code) { - return true; - } - return false; -} - -exports.reduceModifier = reduceModifier; -exports.reducePlus = reducePlus; -exports.reduceKey = reduceKey; -exports.reduceCode = reduceCode; -exports.toKeyEvent = toKeyEvent; -exports.match = match; diff --git a/electron/src/node_modules/keyboardevent-from-electron-accelerator/license b/electron/src/node_modules/keyboardevent-from-electron-accelerator/license deleted file mode 100755 index 3af6b95..0000000 --- a/electron/src/node_modules/keyboardevent-from-electron-accelerator/license +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Andrea Parodi - -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/electron/src/node_modules/keyboardevent-from-electron-accelerator/package.json b/electron/src/node_modules/keyboardevent-from-electron-accelerator/package.json deleted file mode 100755 index 7e481d7..0000000 --- a/electron/src/node_modules/keyboardevent-from-electron-accelerator/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "keyboardevent-from-electron-accelerator", - "version": "0.7.1", - "description": "Transform an Electron Accelerator string into a DOM KeyboardEvent.", - "repository": "parro-it/keyboardevent-from-electron-accelerator", - "author": "Andrea ", - "license": "MIT", - "files": [ - "index.js", - "example.js" - ], - "scripts": { - "test": "rollup -c && ava && xo --ignore example.js --ignore index.js", - "doc": "documentation readme main.js --section=API" - }, - "keywords": [], - "tonicExampleFilename": "example.js", - "devDependencies": { - "ava": "^0.19.1", - "documentation": "^4.0.0-rc.1", - "rollup": "^0.43.0", - "xo": "^0.18.2" - } -} diff --git a/electron/src/node_modules/keyboardevents-areequal/README.md b/electron/src/node_modules/keyboardevents-areequal/README.md deleted file mode 100755 index 8923ae2..0000000 --- a/electron/src/node_modules/keyboardevents-areequal/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# keyboardevents-areequal - -[![Travis Build Status](https://img.shields.io/travis/parro-it/keyboardevents-areequal/master.svg)](http://travis-ci.org/parro-it/keyboardevents-areequal) -[![NPM downloads](https://img.shields.io/npm/dt/keyboardevents-areequal.svg)](https://npmjs.org/package/keyboardevents-areequal) - -> Check if two keyboardevents objects are equals. - -This module is part of an ongoing effort to make [electron-localshortcut](https://github.com/parro-it/electron-localshortcut) less error prone, using keyboard DOM listener instead of 'globalShortcut' method to trigger shortcuts handlers. - -## Usage - -This example check if various KeyboardEvent objects represents the same event: - -```js -const areEqual = require('keyboardevents-areequal'); - -console.log(areEqual({ctrlKey: true, code: 'f'}, {ctrlKey: true, code: 'f'})); -// true - -console.log(areEqual({code: 'f'}, {ctrlKey: true, code: 'f'})); -// false -``` - - -## API - -## Install - -With [npm](https://npmjs.org/) installed, run - -```bash -npm install --save keyboardevents-areequal -``` - -## See Also - -- [`noffle/common-readme`](https://github.com/noffle/common-readme) - -## License - -MIT - diff --git a/electron/src/node_modules/keyboardevents-areequal/example.js b/electron/src/node_modules/keyboardevents-areequal/example.js deleted file mode 100755 index 5402d9e..0000000 --- a/electron/src/node_modules/keyboardevents-areequal/example.js +++ /dev/null @@ -1,4 +0,0 @@ -const keyboardeventsAreequal = require('keyboardevents-areequal'); - -console.log({keyboardeventsAreequal}); - diff --git a/electron/src/node_modules/keyboardevents-areequal/index.js b/electron/src/node_modules/keyboardevents-areequal/index.js deleted file mode 100755 index 041e4aa..0000000 --- a/electron/src/node_modules/keyboardevents-areequal/index.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -function _lower(key) { - if (typeof key !== 'string') { - return key; - } - return key.toLowerCase(); -} - -function areEqual(ev1, ev2) { - if (ev1 === ev2) { - // Same object - // console.log(`Events are same.`) - return true; - } - - for (const prop of ['altKey', 'ctrlKey', 'shiftKey', 'metaKey']) { - const [value1, value2] = [ev1[prop], ev2[prop]]; - - if (Boolean(value1) !== Boolean(value2)) { - // One of the prop is different - // console.log(`Comparing prop ${prop}: ${value1} ${value2}`); - return false; - } - } - - if ((_lower(ev1.key) === _lower(ev2.key) && ev1.key !== undefined) || - (ev1.code === ev2.code && ev1.code !== undefined)) { - // Events are equals - return true; - } - - // Key or code are differents - // console.log(`key or code are differents. ${ev1.key} !== ${ev2.key} ${ev1.code} !== ${ev2.code}`); - - return false; -} - -module.exports = areEqual; diff --git a/electron/src/node_modules/keyboardevents-areequal/license b/electron/src/node_modules/keyboardevents-areequal/license deleted file mode 100755 index 0c7dc0c..0000000 --- a/electron/src/node_modules/keyboardevents-areequal/license +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Andrea - -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/electron/src/node_modules/keyboardevents-areequal/package.json b/electron/src/node_modules/keyboardevents-areequal/package.json deleted file mode 100755 index 29baa06..0000000 --- a/electron/src/node_modules/keyboardevents-areequal/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "keyboardevents-areequal", - "version": "0.2.2", - "description": "Check if two keyboardevents objects are equals.", - "repository": "parro-it/keyboardevents-areequal", - "author": "Andrea ", - "license": "MIT", - "files": [ - "index.js", - "example.js" - ], - "scripts": { - "test": "rollup -c && ava && xo --ignore example.js --ignore index.js", - "doc": "documentation readme main.js --section=API" - }, - "keywords": [], - "tonicExampleFilename": "example.js", - "devDependencies": { - "ava": "^0.20.0", - "documentation": "^4.0.0-rc.1", - "rollup": "^0.43.0", - "xo": "^0.18.2" - } -} diff --git a/electron/src/node_modules/mime-db/HISTORY.md b/electron/src/node_modules/mime-db/HISTORY.md deleted file mode 100755 index 7e60975..0000000 --- a/electron/src/node_modules/mime-db/HISTORY.md +++ /dev/null @@ -1,360 +0,0 @@ -1.32.0 / 2017-11-29 -=================== - - * Add new upstream MIME types - * Update `text/hjson` to registered `application/hjson` - * Add `text/shex` with extension `.shex` - -1.31.0 / 2017-10-25 -=================== - - * Add `application/raml+yaml` with extension `.raml` - * Add `application/wasm` with extension `.wasm` - * Add new `font` type from IANA - * Add new upstream font extensions - * Add new upstream MIME types - * Add extensions for JPEG-2000 images - -1.30.0 / 2017-08-27 -=================== - - * Add `application/vnd.ms-outlook` - * Add `application/x-arj` - * Add extension `.mjs` to `application/javascript` - * Add glTF types and extensions - * Add new upstream MIME types - * Add `text/x-org` - * Add VirtualBox MIME types - * Fix `source` records for `video/*` types that are IANA - * Update `font/opentype` to registered `font/otf` - -1.29.0 / 2017-07-10 -=================== - - * Add `application/fido.trusted-apps+json` - * Add extension `.wadl` to `application/vnd.sun.wadl+xml` - * Add new upstream MIME types - * Add `UTF-8` as default charset for `text/css` - -1.28.0 / 2017-05-14 -=================== - - * Add new upstream MIME types - * Add extension `.gz` to `application/gzip` - * Update extensions `.md` and `.markdown` to be `text/markdown` - -1.27.0 / 2017-03-16 -=================== - - * Add new upstream MIME types - * Add `image/apng` with extension `.apng` - -1.26.0 / 2017-01-14 -=================== - - * Add new upstream MIME types - * Add extension `.geojson` to `application/geo+json` - -1.25.0 / 2016-11-11 -=================== - - * Add new upstream MIME types - -1.24.0 / 2016-09-18 -=================== - - * Add `audio/mp3` - * Add new upstream MIME types - -1.23.0 / 2016-05-01 -=================== - - * Add new upstream MIME types - * Add extension `.3gpp` to `audio/3gpp` - -1.22.0 / 2016-02-15 -=================== - - * Add `text/slim` - * Add extension `.rng` to `application/xml` - * Add new upstream MIME types - * Fix extension of `application/dash+xml` to be `.mpd` - * Update primary extension to `.m4a` for `audio/mp4` - -1.21.0 / 2016-01-06 -=================== - - * Add Google document types - * Add new upstream MIME types - -1.20.0 / 2015-11-10 -=================== - - * Add `text/x-suse-ymp` - * Add new upstream MIME types - -1.19.0 / 2015-09-17 -=================== - - * Add `application/vnd.apple.pkpass` - * Add new upstream MIME types - -1.18.0 / 2015-09-03 -=================== - - * Add new upstream MIME types - -1.17.0 / 2015-08-13 -=================== - - * Add `application/x-msdos-program` - * Add `audio/g711-0` - * Add `image/vnd.mozilla.apng` - * Add extension `.exe` to `application/x-msdos-program` - -1.16.0 / 2015-07-29 -=================== - - * Add `application/vnd.uri-map` - -1.15.0 / 2015-07-13 -=================== - - * Add `application/x-httpd-php` - -1.14.0 / 2015-06-25 -=================== - - * Add `application/scim+json` - * Add `application/vnd.3gpp.ussd+xml` - * Add `application/vnd.biopax.rdf+xml` - * Add `text/x-processing` - -1.13.0 / 2015-06-07 -=================== - - * Add nginx as a source - * Add `application/x-cocoa` - * Add `application/x-java-archive-diff` - * Add `application/x-makeself` - * Add `application/x-perl` - * Add `application/x-pilot` - * Add `application/x-redhat-package-manager` - * Add `application/x-sea` - * Add `audio/x-m4a` - * Add `audio/x-realaudio` - * Add `image/x-jng` - * Add `text/mathml` - -1.12.0 / 2015-06-05 -=================== - - * Add `application/bdoc` - * Add `application/vnd.hyperdrive+json` - * Add `application/x-bdoc` - * Add extension `.rtf` to `text/rtf` - -1.11.0 / 2015-05-31 -=================== - - * Add `audio/wav` - * Add `audio/wave` - * Add extension `.litcoffee` to `text/coffeescript` - * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data` - * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install` - -1.10.0 / 2015-05-19 -=================== - - * Add `application/vnd.balsamiq.bmpr` - * Add `application/vnd.microsoft.portable-executable` - * Add `application/x-ns-proxy-autoconfig` - -1.9.1 / 2015-04-19 -================== - - * Remove `.json` extension from `application/manifest+json` - - This is causing bugs downstream - -1.9.0 / 2015-04-19 -================== - - * Add `application/manifest+json` - * Add `application/vnd.micro+json` - * Add `image/vnd.zbrush.pcx` - * Add `image/x-ms-bmp` - -1.8.0 / 2015-03-13 -================== - - * Add `application/vnd.citationstyles.style+xml` - * Add `application/vnd.fastcopy-disk-image` - * Add `application/vnd.gov.sk.xmldatacontainer+xml` - * Add extension `.jsonld` to `application/ld+json` - -1.7.0 / 2015-02-08 -================== - - * Add `application/vnd.gerber` - * Add `application/vnd.msa-disk-image` - -1.6.1 / 2015-02-05 -================== - - * Community extensions ownership transferred from `node-mime` - -1.6.0 / 2015-01-29 -================== - - * Add `application/jose` - * Add `application/jose+json` - * Add `application/json-seq` - * Add `application/jwk+json` - * Add `application/jwk-set+json` - * Add `application/jwt` - * Add `application/rdap+json` - * Add `application/vnd.gov.sk.e-form+xml` - * Add `application/vnd.ims.imsccv1p3` - -1.5.0 / 2014-12-30 -================== - - * Add `application/vnd.oracle.resource+json` - * Fix various invalid MIME type entries - - `application/mbox+xml` - - `application/oscp-response` - - `application/vwg-multiplexed` - - `audio/g721` - -1.4.0 / 2014-12-21 -================== - - * Add `application/vnd.ims.imsccv1p2` - * Fix various invalid MIME type entries - - `application/vnd-acucobol` - - `application/vnd-curl` - - `application/vnd-dart` - - `application/vnd-dxr` - - `application/vnd-fdf` - - `application/vnd-mif` - - `application/vnd-sema` - - `application/vnd-wap-wmlc` - - `application/vnd.adobe.flash-movie` - - `application/vnd.dece-zip` - - `application/vnd.dvb_service` - - `application/vnd.micrografx-igx` - - `application/vnd.sealed-doc` - - `application/vnd.sealed-eml` - - `application/vnd.sealed-mht` - - `application/vnd.sealed-ppt` - - `application/vnd.sealed-tiff` - - `application/vnd.sealed-xls` - - `application/vnd.sealedmedia.softseal-html` - - `application/vnd.sealedmedia.softseal-pdf` - - `application/vnd.wap-slc` - - `application/vnd.wap-wbxml` - - `audio/vnd.sealedmedia.softseal-mpeg` - - `image/vnd-djvu` - - `image/vnd-svf` - - `image/vnd-wap-wbmp` - - `image/vnd.sealed-png` - - `image/vnd.sealedmedia.softseal-gif` - - `image/vnd.sealedmedia.softseal-jpg` - - `model/vnd-dwf` - - `model/vnd.parasolid.transmit-binary` - - `model/vnd.parasolid.transmit-text` - - `text/vnd-a` - - `text/vnd-curl` - - `text/vnd.wap-wml` - * Remove example template MIME types - - `application/example` - - `audio/example` - - `image/example` - - `message/example` - - `model/example` - - `multipart/example` - - `text/example` - - `video/example` - -1.3.1 / 2014-12-16 -================== - - * Fix missing extensions - - `application/json5` - - `text/hjson` - -1.3.0 / 2014-12-07 -================== - - * Add `application/a2l` - * Add `application/aml` - * Add `application/atfx` - * Add `application/atxml` - * Add `application/cdfx+xml` - * Add `application/dii` - * Add `application/json5` - * Add `application/lxf` - * Add `application/mf4` - * Add `application/vnd.apache.thrift.compact` - * Add `application/vnd.apache.thrift.json` - * Add `application/vnd.coffeescript` - * Add `application/vnd.enphase.envoy` - * Add `application/vnd.ims.imsccv1p1` - * Add `text/csv-schema` - * Add `text/hjson` - * Add `text/markdown` - * Add `text/yaml` - -1.2.0 / 2014-11-09 -================== - - * Add `application/cea` - * Add `application/dit` - * Add `application/vnd.gov.sk.e-form+zip` - * Add `application/vnd.tmd.mediaflex.api+xml` - * Type `application/epub+zip` is now IANA-registered - -1.1.2 / 2014-10-23 -================== - - * Rebuild database for `application/x-www-form-urlencoded` change - -1.1.1 / 2014-10-20 -================== - - * Mark `application/x-www-form-urlencoded` as compressible. - -1.1.0 / 2014-09-28 -================== - - * Add `application/font-woff2` - -1.0.3 / 2014-09-25 -================== - - * Fix engine requirement in package - -1.0.2 / 2014-09-25 -================== - - * Add `application/coap-group+json` - * Add `application/dcd` - * Add `application/vnd.apache.thrift.binary` - * Add `image/vnd.tencent.tap` - * Mark all JSON-derived types as compressible - * Update `text/vtt` data - -1.0.1 / 2014-08-30 -================== - - * Fix extension ordering - -1.0.0 / 2014-08-30 -================== - - * Add `application/atf` - * Add `application/merge-patch+json` - * Add `multipart/x-mixed-replace` - * Add `source: 'apache'` metadata - * Add `source: 'iana'` metadata - * Remove badly-assumed charset data diff --git a/electron/src/node_modules/mime-db/LICENSE b/electron/src/node_modules/mime-db/LICENSE deleted file mode 100755 index a7ae8ee..0000000 --- a/electron/src/node_modules/mime-db/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/mime-db/README.md b/electron/src/node_modules/mime-db/README.md deleted file mode 100755 index 2416c6d..0000000 --- a/electron/src/node_modules/mime-db/README.md +++ /dev/null @@ -1,94 +0,0 @@ -# mime-db - -[![NPM Version][npm-version-image]][npm-url] -[![NPM Downloads][npm-downloads-image]][npm-url] -[![Node.js Version][node-image]][node-url] -[![Build Status][travis-image]][travis-url] -[![Coverage Status][coveralls-image]][coveralls-url] - -This is a database of all mime types. -It consists of a single, public JSON file and does not include any logic, -allowing it to remain as un-opinionated as possible with an API. -It aggregates data from the following sources: - -- http://www.iana.org/assignments/media-types/media-types.xhtml -- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types - -## Installation - -```bash -npm install mime-db -``` - -### Database Download - -If you're crazy enough to use this in the browser, you can just grab the -JSON file using [RawGit](https://rawgit.com/). It is recommended to replace -`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the -JSON format may change in the future. - -``` -https://cdn.rawgit.com/jshttp/mime-db/master/db.json -``` - -## Usage - -```js -var db = require('mime-db'); - -// grab data on .js files -var data = db['application/javascript']; -``` - -## Data Structure - -The JSON file is a map lookup for lowercased mime types. -Each mime type has the following properties: - -- `.source` - where the mime type is defined. - If not set, it's probably a custom media type. - - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types) - - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml) - - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types) -- `.extensions[]` - known extensions associated with this mime type. -- `.compressible` - whether a file of this type can be gzipped. -- `.charset` - the default charset associated with this type, if any. - -If unknown, every property could be `undefined`. - -## Contributing - -To edit the database, only make PRs against `src/custom.json` or -`src/custom-suffix.json`. - -The `src/custom.json` file is a JSON object with the MIME type as the keys -and the values being an object with the following keys: - -- `compressible` - leave out if you don't know, otherwise `true`/`false` for - if the data represented by the time is typically compressible. -- `extensions` - include an array of file extensions that are associated with - the type. -- `notes` - human-readable notes about the type, typically what the type is. -- `sources` - include an array of URLs of where the MIME type and the associated - extensions are sourced from. This needs to be a [primary source](https://en.wikipedia.org/wiki/Primary_source); - links to type aggregating sites and Wikipedia are _not acceptible_. - -To update the build, run `npm run build`. - -## Adding Custom Media Types - -The best way to get new media types included in this library is to register -them with the IANA. The community registration procedure is outlined in -[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types -registered with the IANA are automatically pulled into this library. - -[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg -[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg -[npm-url]: https://npmjs.org/package/mime-db -[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg -[travis-url]: https://travis-ci.org/jshttp/mime-db -[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master -[node-image]: https://img.shields.io/node/v/mime-db.svg -[node-url]: https://nodejs.org/en/download/ diff --git a/electron/src/node_modules/mime-db/db.json b/electron/src/node_modules/mime-db/db.json deleted file mode 100755 index e3143c0..0000000 --- a/electron/src/node_modules/mime-db/db.json +++ /dev/null @@ -1,7047 +0,0 @@ -{ - "application/1d-interleaved-parityfec": { - "source": "iana" - }, - "application/3gpdash-qoe-report+xml": { - "source": "iana" - }, - "application/3gpp-ims+xml": { - "source": "iana" - }, - "application/a2l": { - "source": "iana" - }, - "application/activemessage": { - "source": "iana" - }, - "application/alto-costmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-costmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/alto-directory+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcost+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointcostparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointprop+json": { - "source": "iana", - "compressible": true - }, - "application/alto-endpointpropparams+json": { - "source": "iana", - "compressible": true - }, - "application/alto-error+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmap+json": { - "source": "iana", - "compressible": true - }, - "application/alto-networkmapfilter+json": { - "source": "iana", - "compressible": true - }, - "application/aml": { - "source": "iana" - }, - "application/andrew-inset": { - "source": "iana", - "extensions": ["ez"] - }, - "application/applefile": { - "source": "iana" - }, - "application/applixware": { - "source": "apache", - "extensions": ["aw"] - }, - "application/atf": { - "source": "iana" - }, - "application/atfx": { - "source": "iana" - }, - "application/atom+xml": { - "source": "iana", - "compressible": true, - "extensions": ["atom"] - }, - "application/atomcat+xml": { - "source": "iana", - "extensions": ["atomcat"] - }, - "application/atomdeleted+xml": { - "source": "iana" - }, - "application/atomicmail": { - "source": "iana" - }, - "application/atomsvc+xml": { - "source": "iana", - "extensions": ["atomsvc"] - }, - "application/atxml": { - "source": "iana" - }, - "application/auth-policy+xml": { - "source": "iana" - }, - "application/bacnet-xdd+zip": { - "source": "iana" - }, - "application/batch-smtp": { - "source": "iana" - }, - "application/bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/beep+xml": { - "source": "iana" - }, - "application/calendar+json": { - "source": "iana", - "compressible": true - }, - "application/calendar+xml": { - "source": "iana" - }, - "application/call-completion": { - "source": "iana" - }, - "application/cals-1840": { - "source": "iana" - }, - "application/cbor": { - "source": "iana" - }, - "application/cccex": { - "source": "iana" - }, - "application/ccmp+xml": { - "source": "iana" - }, - "application/ccxml+xml": { - "source": "iana", - "extensions": ["ccxml"] - }, - "application/cdfx+xml": { - "source": "iana" - }, - "application/cdmi-capability": { - "source": "iana", - "extensions": ["cdmia"] - }, - "application/cdmi-container": { - "source": "iana", - "extensions": ["cdmic"] - }, - "application/cdmi-domain": { - "source": "iana", - "extensions": ["cdmid"] - }, - "application/cdmi-object": { - "source": "iana", - "extensions": ["cdmio"] - }, - "application/cdmi-queue": { - "source": "iana", - "extensions": ["cdmiq"] - }, - "application/cdni": { - "source": "iana" - }, - "application/cea": { - "source": "iana" - }, - "application/cea-2018+xml": { - "source": "iana" - }, - "application/cellml+xml": { - "source": "iana" - }, - "application/cfw": { - "source": "iana" - }, - "application/clue_info+xml": { - "source": "iana" - }, - "application/cms": { - "source": "iana" - }, - "application/cnrp+xml": { - "source": "iana" - }, - "application/coap-group+json": { - "source": "iana", - "compressible": true - }, - "application/coap-payload": { - "source": "iana" - }, - "application/commonground": { - "source": "iana" - }, - "application/conference-info+xml": { - "source": "iana" - }, - "application/cose": { - "source": "iana" - }, - "application/cose-key": { - "source": "iana" - }, - "application/cose-key-set": { - "source": "iana" - }, - "application/cpl+xml": { - "source": "iana" - }, - "application/csrattrs": { - "source": "iana" - }, - "application/csta+xml": { - "source": "iana" - }, - "application/cstadata+xml": { - "source": "iana" - }, - "application/csvm+json": { - "source": "iana", - "compressible": true - }, - "application/cu-seeme": { - "source": "apache", - "extensions": ["cu"] - }, - "application/cybercash": { - "source": "iana" - }, - "application/dart": { - "compressible": true - }, - "application/dash+xml": { - "source": "iana", - "extensions": ["mpd"] - }, - "application/dashdelta": { - "source": "iana" - }, - "application/davmount+xml": { - "source": "iana", - "extensions": ["davmount"] - }, - "application/dca-rft": { - "source": "iana" - }, - "application/dcd": { - "source": "iana" - }, - "application/dec-dx": { - "source": "iana" - }, - "application/dialog-info+xml": { - "source": "iana" - }, - "application/dicom": { - "source": "iana" - }, - "application/dicom+json": { - "source": "iana", - "compressible": true - }, - "application/dicom+xml": { - "source": "iana" - }, - "application/dii": { - "source": "iana" - }, - "application/dit": { - "source": "iana" - }, - "application/dns": { - "source": "iana" - }, - "application/docbook+xml": { - "source": "apache", - "extensions": ["dbk"] - }, - "application/dskpp+xml": { - "source": "iana" - }, - "application/dssc+der": { - "source": "iana", - "extensions": ["dssc"] - }, - "application/dssc+xml": { - "source": "iana", - "extensions": ["xdssc"] - }, - "application/dvcs": { - "source": "iana" - }, - "application/ecmascript": { - "source": "iana", - "compressible": true, - "extensions": ["ecma"] - }, - "application/edi-consent": { - "source": "iana" - }, - "application/edi-x12": { - "source": "iana", - "compressible": false - }, - "application/edifact": { - "source": "iana", - "compressible": false - }, - "application/efi": { - "source": "iana" - }, - "application/emergencycalldata.comment+xml": { - "source": "iana" - }, - "application/emergencycalldata.control+xml": { - "source": "iana" - }, - "application/emergencycalldata.deviceinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.ecall.msd": { - "source": "iana" - }, - "application/emergencycalldata.providerinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.serviceinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.subscriberinfo+xml": { - "source": "iana" - }, - "application/emergencycalldata.veds+xml": { - "source": "iana" - }, - "application/emma+xml": { - "source": "iana", - "extensions": ["emma"] - }, - "application/emotionml+xml": { - "source": "iana" - }, - "application/encaprtp": { - "source": "iana" - }, - "application/epp+xml": { - "source": "iana" - }, - "application/epub+zip": { - "source": "iana", - "extensions": ["epub"] - }, - "application/eshop": { - "source": "iana" - }, - "application/exi": { - "source": "iana", - "extensions": ["exi"] - }, - "application/fastinfoset": { - "source": "iana" - }, - "application/fastsoap": { - "source": "iana" - }, - "application/fdt+xml": { - "source": "iana" - }, - "application/fido.trusted-apps+json": { - "compressible": true - }, - "application/fits": { - "source": "iana" - }, - "application/font-sfnt": { - "source": "iana" - }, - "application/font-tdpfr": { - "source": "iana", - "extensions": ["pfr"] - }, - "application/font-woff": { - "source": "iana", - "compressible": false, - "extensions": ["woff"] - }, - "application/font-woff2": { - "compressible": false, - "extensions": ["woff2"] - }, - "application/framework-attributes+xml": { - "source": "iana" - }, - "application/geo+json": { - "source": "iana", - "compressible": true, - "extensions": ["geojson"] - }, - "application/geo+json-seq": { - "source": "iana" - }, - "application/geoxacml+xml": { - "source": "iana" - }, - "application/gml+xml": { - "source": "iana", - "extensions": ["gml"] - }, - "application/gpx+xml": { - "source": "apache", - "extensions": ["gpx"] - }, - "application/gxf": { - "source": "apache", - "extensions": ["gxf"] - }, - "application/gzip": { - "source": "iana", - "compressible": false, - "extensions": ["gz"] - }, - "application/h224": { - "source": "iana" - }, - "application/held+xml": { - "source": "iana" - }, - "application/hjson": { - "extensions": ["hjson"] - }, - "application/http": { - "source": "iana" - }, - "application/hyperstudio": { - "source": "iana", - "extensions": ["stk"] - }, - "application/ibe-key-request+xml": { - "source": "iana" - }, - "application/ibe-pkg-reply+xml": { - "source": "iana" - }, - "application/ibe-pp-data": { - "source": "iana" - }, - "application/iges": { - "source": "iana" - }, - "application/im-iscomposing+xml": { - "source": "iana" - }, - "application/index": { - "source": "iana" - }, - "application/index.cmd": { - "source": "iana" - }, - "application/index.obj": { - "source": "iana" - }, - "application/index.response": { - "source": "iana" - }, - "application/index.vnd": { - "source": "iana" - }, - "application/inkml+xml": { - "source": "iana", - "extensions": ["ink","inkml"] - }, - "application/iotp": { - "source": "iana" - }, - "application/ipfix": { - "source": "iana", - "extensions": ["ipfix"] - }, - "application/ipp": { - "source": "iana" - }, - "application/isup": { - "source": "iana" - }, - "application/its+xml": { - "source": "iana" - }, - "application/java-archive": { - "source": "apache", - "compressible": false, - "extensions": ["jar","war","ear"] - }, - "application/java-serialized-object": { - "source": "apache", - "compressible": false, - "extensions": ["ser"] - }, - "application/java-vm": { - "source": "apache", - "compressible": false, - "extensions": ["class"] - }, - "application/javascript": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["js","mjs"] - }, - "application/jf2feed+json": { - "source": "iana", - "compressible": true - }, - "application/jose": { - "source": "iana" - }, - "application/jose+json": { - "source": "iana", - "compressible": true - }, - "application/jrd+json": { - "source": "iana", - "compressible": true - }, - "application/json": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["json","map"] - }, - "application/json-patch+json": { - "source": "iana", - "compressible": true - }, - "application/json-seq": { - "source": "iana" - }, - "application/json5": { - "extensions": ["json5"] - }, - "application/jsonml+json": { - "source": "apache", - "compressible": true, - "extensions": ["jsonml"] - }, - "application/jwk+json": { - "source": "iana", - "compressible": true - }, - "application/jwk-set+json": { - "source": "iana", - "compressible": true - }, - "application/jwt": { - "source": "iana" - }, - "application/kpml-request+xml": { - "source": "iana" - }, - "application/kpml-response+xml": { - "source": "iana" - }, - "application/ld+json": { - "source": "iana", - "compressible": true, - "extensions": ["jsonld"] - }, - "application/lgr+xml": { - "source": "iana" - }, - "application/link-format": { - "source": "iana" - }, - "application/load-control+xml": { - "source": "iana" - }, - "application/lost+xml": { - "source": "iana", - "extensions": ["lostxml"] - }, - "application/lostsync+xml": { - "source": "iana" - }, - "application/lxf": { - "source": "iana" - }, - "application/mac-binhex40": { - "source": "iana", - "extensions": ["hqx"] - }, - "application/mac-compactpro": { - "source": "apache", - "extensions": ["cpt"] - }, - "application/macwriteii": { - "source": "iana" - }, - "application/mads+xml": { - "source": "iana", - "extensions": ["mads"] - }, - "application/manifest+json": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["webmanifest"] - }, - "application/marc": { - "source": "iana", - "extensions": ["mrc"] - }, - "application/marcxml+xml": { - "source": "iana", - "extensions": ["mrcx"] - }, - "application/mathematica": { - "source": "iana", - "extensions": ["ma","nb","mb"] - }, - "application/mathml+xml": { - "source": "iana", - "extensions": ["mathml"] - }, - "application/mathml-content+xml": { - "source": "iana" - }, - "application/mathml-presentation+xml": { - "source": "iana" - }, - "application/mbms-associated-procedure-description+xml": { - "source": "iana" - }, - "application/mbms-deregister+xml": { - "source": "iana" - }, - "application/mbms-envelope+xml": { - "source": "iana" - }, - "application/mbms-msk+xml": { - "source": "iana" - }, - "application/mbms-msk-response+xml": { - "source": "iana" - }, - "application/mbms-protection-description+xml": { - "source": "iana" - }, - "application/mbms-reception-report+xml": { - "source": "iana" - }, - "application/mbms-register+xml": { - "source": "iana" - }, - "application/mbms-register-response+xml": { - "source": "iana" - }, - "application/mbms-schedule+xml": { - "source": "iana" - }, - "application/mbms-user-service-description+xml": { - "source": "iana" - }, - "application/mbox": { - "source": "iana", - "extensions": ["mbox"] - }, - "application/media-policy-dataset+xml": { - "source": "iana" - }, - "application/media_control+xml": { - "source": "iana" - }, - "application/mediaservercontrol+xml": { - "source": "iana", - "extensions": ["mscml"] - }, - "application/merge-patch+json": { - "source": "iana", - "compressible": true - }, - "application/metalink+xml": { - "source": "apache", - "extensions": ["metalink"] - }, - "application/metalink4+xml": { - "source": "iana", - "extensions": ["meta4"] - }, - "application/mets+xml": { - "source": "iana", - "extensions": ["mets"] - }, - "application/mf4": { - "source": "iana" - }, - "application/mikey": { - "source": "iana" - }, - "application/mmt-usd+xml": { - "source": "iana" - }, - "application/mods+xml": { - "source": "iana", - "extensions": ["mods"] - }, - "application/moss-keys": { - "source": "iana" - }, - "application/moss-signature": { - "source": "iana" - }, - "application/mosskey-data": { - "source": "iana" - }, - "application/mosskey-request": { - "source": "iana" - }, - "application/mp21": { - "source": "iana", - "extensions": ["m21","mp21"] - }, - "application/mp4": { - "source": "iana", - "extensions": ["mp4s","m4p"] - }, - "application/mpeg4-generic": { - "source": "iana" - }, - "application/mpeg4-iod": { - "source": "iana" - }, - "application/mpeg4-iod-xmt": { - "source": "iana" - }, - "application/mrb-consumer+xml": { - "source": "iana" - }, - "application/mrb-publish+xml": { - "source": "iana" - }, - "application/msc-ivr+xml": { - "source": "iana" - }, - "application/msc-mixer+xml": { - "source": "iana" - }, - "application/msword": { - "source": "iana", - "compressible": false, - "extensions": ["doc","dot"] - }, - "application/mud+json": { - "source": "iana", - "compressible": true - }, - "application/mxf": { - "source": "iana", - "extensions": ["mxf"] - }, - "application/n-quads": { - "source": "iana" - }, - "application/n-triples": { - "source": "iana" - }, - "application/nasdata": { - "source": "iana" - }, - "application/news-checkgroups": { - "source": "iana" - }, - "application/news-groupinfo": { - "source": "iana" - }, - "application/news-transmission": { - "source": "iana" - }, - "application/nlsml+xml": { - "source": "iana" - }, - "application/nss": { - "source": "iana" - }, - "application/ocsp-request": { - "source": "iana" - }, - "application/ocsp-response": { - "source": "iana" - }, - "application/octet-stream": { - "source": "iana", - "compressible": false, - "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"] - }, - "application/oda": { - "source": "iana", - "extensions": ["oda"] - }, - "application/odx": { - "source": "iana" - }, - "application/oebps-package+xml": { - "source": "iana", - "extensions": ["opf"] - }, - "application/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogx"] - }, - "application/omdoc+xml": { - "source": "apache", - "extensions": ["omdoc"] - }, - "application/onenote": { - "source": "apache", - "extensions": ["onetoc","onetoc2","onetmp","onepkg"] - }, - "application/oxps": { - "source": "iana", - "extensions": ["oxps"] - }, - "application/p2p-overlay+xml": { - "source": "iana" - }, - "application/parityfec": { - "source": "iana" - }, - "application/passport": { - "source": "iana" - }, - "application/patch-ops-error+xml": { - "source": "iana", - "extensions": ["xer"] - }, - "application/pdf": { - "source": "iana", - "compressible": false, - "extensions": ["pdf"] - }, - "application/pdx": { - "source": "iana" - }, - "application/pgp-encrypted": { - "source": "iana", - "compressible": false, - "extensions": ["pgp"] - }, - "application/pgp-keys": { - "source": "iana" - }, - "application/pgp-signature": { - "source": "iana", - "extensions": ["asc","sig"] - }, - "application/pics-rules": { - "source": "apache", - "extensions": ["prf"] - }, - "application/pidf+xml": { - "source": "iana" - }, - "application/pidf-diff+xml": { - "source": "iana" - }, - "application/pkcs10": { - "source": "iana", - "extensions": ["p10"] - }, - "application/pkcs12": { - "source": "iana" - }, - "application/pkcs7-mime": { - "source": "iana", - "extensions": ["p7m","p7c"] - }, - "application/pkcs7-signature": { - "source": "iana", - "extensions": ["p7s"] - }, - "application/pkcs8": { - "source": "iana", - "extensions": ["p8"] - }, - "application/pkix-attr-cert": { - "source": "iana", - "extensions": ["ac"] - }, - "application/pkix-cert": { - "source": "iana", - "extensions": ["cer"] - }, - "application/pkix-crl": { - "source": "iana", - "extensions": ["crl"] - }, - "application/pkix-pkipath": { - "source": "iana", - "extensions": ["pkipath"] - }, - "application/pkixcmp": { - "source": "iana", - "extensions": ["pki"] - }, - "application/pls+xml": { - "source": "iana", - "extensions": ["pls"] - }, - "application/poc-settings+xml": { - "source": "iana" - }, - "application/postscript": { - "source": "iana", - "compressible": true, - "extensions": ["ai","eps","ps"] - }, - "application/ppsp-tracker+json": { - "source": "iana", - "compressible": true - }, - "application/problem+json": { - "source": "iana", - "compressible": true - }, - "application/problem+xml": { - "source": "iana" - }, - "application/provenance+xml": { - "source": "iana" - }, - "application/prs.alvestrand.titrax-sheet": { - "source": "iana" - }, - "application/prs.cww": { - "source": "iana", - "extensions": ["cww"] - }, - "application/prs.hpub+zip": { - "source": "iana" - }, - "application/prs.nprend": { - "source": "iana" - }, - "application/prs.plucker": { - "source": "iana" - }, - "application/prs.rdf-xml-crypt": { - "source": "iana" - }, - "application/prs.xsf+xml": { - "source": "iana" - }, - "application/pskc+xml": { - "source": "iana", - "extensions": ["pskcxml"] - }, - "application/qsig": { - "source": "iana" - }, - "application/raml+yaml": { - "compressible": true, - "extensions": ["raml"] - }, - "application/raptorfec": { - "source": "iana" - }, - "application/rdap+json": { - "source": "iana", - "compressible": true - }, - "application/rdf+xml": { - "source": "iana", - "compressible": true, - "extensions": ["rdf"] - }, - "application/reginfo+xml": { - "source": "iana", - "extensions": ["rif"] - }, - "application/relax-ng-compact-syntax": { - "source": "iana", - "extensions": ["rnc"] - }, - "application/remote-printing": { - "source": "iana" - }, - "application/reputon+json": { - "source": "iana", - "compressible": true - }, - "application/resource-lists+xml": { - "source": "iana", - "extensions": ["rl"] - }, - "application/resource-lists-diff+xml": { - "source": "iana", - "extensions": ["rld"] - }, - "application/rfc+xml": { - "source": "iana" - }, - "application/riscos": { - "source": "iana" - }, - "application/rlmi+xml": { - "source": "iana" - }, - "application/rls-services+xml": { - "source": "iana", - "extensions": ["rs"] - }, - "application/route-apd+xml": { - "source": "iana" - }, - "application/route-s-tsid+xml": { - "source": "iana" - }, - "application/route-usd+xml": { - "source": "iana" - }, - "application/rpki-ghostbusters": { - "source": "iana", - "extensions": ["gbr"] - }, - "application/rpki-manifest": { - "source": "iana", - "extensions": ["mft"] - }, - "application/rpki-publication": { - "source": "iana" - }, - "application/rpki-roa": { - "source": "iana", - "extensions": ["roa"] - }, - "application/rpki-updown": { - "source": "iana" - }, - "application/rsd+xml": { - "source": "apache", - "extensions": ["rsd"] - }, - "application/rss+xml": { - "source": "apache", - "compressible": true, - "extensions": ["rss"] - }, - "application/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "application/rtploopback": { - "source": "iana" - }, - "application/rtx": { - "source": "iana" - }, - "application/samlassertion+xml": { - "source": "iana" - }, - "application/samlmetadata+xml": { - "source": "iana" - }, - "application/sbml+xml": { - "source": "iana", - "extensions": ["sbml"] - }, - "application/scaip+xml": { - "source": "iana" - }, - "application/scim+json": { - "source": "iana", - "compressible": true - }, - "application/scvp-cv-request": { - "source": "iana", - "extensions": ["scq"] - }, - "application/scvp-cv-response": { - "source": "iana", - "extensions": ["scs"] - }, - "application/scvp-vp-request": { - "source": "iana", - "extensions": ["spq"] - }, - "application/scvp-vp-response": { - "source": "iana", - "extensions": ["spp"] - }, - "application/sdp": { - "source": "iana", - "extensions": ["sdp"] - }, - "application/sep+xml": { - "source": "iana" - }, - "application/sep-exi": { - "source": "iana" - }, - "application/session-info": { - "source": "iana" - }, - "application/set-payment": { - "source": "iana" - }, - "application/set-payment-initiation": { - "source": "iana", - "extensions": ["setpay"] - }, - "application/set-registration": { - "source": "iana" - }, - "application/set-registration-initiation": { - "source": "iana", - "extensions": ["setreg"] - }, - "application/sgml": { - "source": "iana" - }, - "application/sgml-open-catalog": { - "source": "iana" - }, - "application/shf+xml": { - "source": "iana", - "extensions": ["shf"] - }, - "application/sieve": { - "source": "iana" - }, - "application/simple-filter+xml": { - "source": "iana" - }, - "application/simple-message-summary": { - "source": "iana" - }, - "application/simplesymbolcontainer": { - "source": "iana" - }, - "application/slate": { - "source": "iana" - }, - "application/smil": { - "source": "iana" - }, - "application/smil+xml": { - "source": "iana", - "extensions": ["smi","smil"] - }, - "application/smpte336m": { - "source": "iana" - }, - "application/soap+fastinfoset": { - "source": "iana" - }, - "application/soap+xml": { - "source": "iana", - "compressible": true - }, - "application/sparql-query": { - "source": "iana", - "extensions": ["rq"] - }, - "application/sparql-results+xml": { - "source": "iana", - "extensions": ["srx"] - }, - "application/spirits-event+xml": { - "source": "iana" - }, - "application/sql": { - "source": "iana" - }, - "application/srgs": { - "source": "iana", - "extensions": ["gram"] - }, - "application/srgs+xml": { - "source": "iana", - "extensions": ["grxml"] - }, - "application/sru+xml": { - "source": "iana", - "extensions": ["sru"] - }, - "application/ssdl+xml": { - "source": "apache", - "extensions": ["ssdl"] - }, - "application/ssml+xml": { - "source": "iana", - "extensions": ["ssml"] - }, - "application/tamp-apex-update": { - "source": "iana" - }, - "application/tamp-apex-update-confirm": { - "source": "iana" - }, - "application/tamp-community-update": { - "source": "iana" - }, - "application/tamp-community-update-confirm": { - "source": "iana" - }, - "application/tamp-error": { - "source": "iana" - }, - "application/tamp-sequence-adjust": { - "source": "iana" - }, - "application/tamp-sequence-adjust-confirm": { - "source": "iana" - }, - "application/tamp-status-query": { - "source": "iana" - }, - "application/tamp-status-response": { - "source": "iana" - }, - "application/tamp-update": { - "source": "iana" - }, - "application/tamp-update-confirm": { - "source": "iana" - }, - "application/tar": { - "compressible": true - }, - "application/tei+xml": { - "source": "iana", - "extensions": ["tei","teicorpus"] - }, - "application/thraud+xml": { - "source": "iana", - "extensions": ["tfi"] - }, - "application/timestamp-query": { - "source": "iana" - }, - "application/timestamp-reply": { - "source": "iana" - }, - "application/timestamped-data": { - "source": "iana", - "extensions": ["tsd"] - }, - "application/trig": { - "source": "iana" - }, - "application/ttml+xml": { - "source": "iana" - }, - "application/tve-trigger": { - "source": "iana" - }, - "application/ulpfec": { - "source": "iana" - }, - "application/urc-grpsheet+xml": { - "source": "iana" - }, - "application/urc-ressheet+xml": { - "source": "iana" - }, - "application/urc-targetdesc+xml": { - "source": "iana" - }, - "application/urc-uisocketdesc+xml": { - "source": "iana" - }, - "application/vcard+json": { - "source": "iana", - "compressible": true - }, - "application/vcard+xml": { - "source": "iana" - }, - "application/vemmi": { - "source": "iana" - }, - "application/vividence.scriptfile": { - "source": "apache" - }, - "application/vnd.1000minds.decision-model+xml": { - "source": "iana" - }, - "application/vnd.3gpp-prose+xml": { - "source": "iana" - }, - "application/vnd.3gpp-prose-pc3ch+xml": { - "source": "iana" - }, - "application/vnd.3gpp-v2x-local-service-information": { - "source": "iana" - }, - "application/vnd.3gpp.access-transfer-events+xml": { - "source": "iana" - }, - "application/vnd.3gpp.bsf+xml": { - "source": "iana" - }, - "application/vnd.3gpp.gmop+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-affiliation-command+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-floor-request+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-location-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-mbms-usage-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mcptt-signed+xml": { - "source": "iana" - }, - "application/vnd.3gpp.mid-call+xml": { - "source": "iana" - }, - "application/vnd.3gpp.pic-bw-large": { - "source": "iana", - "extensions": ["plb"] - }, - "application/vnd.3gpp.pic-bw-small": { - "source": "iana", - "extensions": ["psb"] - }, - "application/vnd.3gpp.pic-bw-var": { - "source": "iana", - "extensions": ["pvb"] - }, - "application/vnd.3gpp.sms": { - "source": "iana" - }, - "application/vnd.3gpp.sms+xml": { - "source": "iana" - }, - "application/vnd.3gpp.srvcc-ext+xml": { - "source": "iana" - }, - "application/vnd.3gpp.srvcc-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.state-and-event-info+xml": { - "source": "iana" - }, - "application/vnd.3gpp.ussd+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.bcmcsinfo+xml": { - "source": "iana" - }, - "application/vnd.3gpp2.sms": { - "source": "iana" - }, - "application/vnd.3gpp2.tcap": { - "source": "iana", - "extensions": ["tcap"] - }, - "application/vnd.3lightssoftware.imagescal": { - "source": "iana" - }, - "application/vnd.3m.post-it-notes": { - "source": "iana", - "extensions": ["pwn"] - }, - "application/vnd.accpac.simply.aso": { - "source": "iana", - "extensions": ["aso"] - }, - "application/vnd.accpac.simply.imp": { - "source": "iana", - "extensions": ["imp"] - }, - "application/vnd.acucobol": { - "source": "iana", - "extensions": ["acu"] - }, - "application/vnd.acucorp": { - "source": "iana", - "extensions": ["atc","acutc"] - }, - "application/vnd.adobe.air-application-installer-package+zip": { - "source": "apache", - "extensions": ["air"] - }, - "application/vnd.adobe.flash.movie": { - "source": "iana" - }, - "application/vnd.adobe.formscentral.fcdt": { - "source": "iana", - "extensions": ["fcdt"] - }, - "application/vnd.adobe.fxp": { - "source": "iana", - "extensions": ["fxp","fxpl"] - }, - "application/vnd.adobe.partial-upload": { - "source": "iana" - }, - "application/vnd.adobe.xdp+xml": { - "source": "iana", - "extensions": ["xdp"] - }, - "application/vnd.adobe.xfdf": { - "source": "iana", - "extensions": ["xfdf"] - }, - "application/vnd.aether.imp": { - "source": "iana" - }, - "application/vnd.ah-barcode": { - "source": "iana" - }, - "application/vnd.ahead.space": { - "source": "iana", - "extensions": ["ahead"] - }, - "application/vnd.airzip.filesecure.azf": { - "source": "iana", - "extensions": ["azf"] - }, - "application/vnd.airzip.filesecure.azs": { - "source": "iana", - "extensions": ["azs"] - }, - "application/vnd.amazon.ebook": { - "source": "apache", - "extensions": ["azw"] - }, - "application/vnd.amazon.mobi8-ebook": { - "source": "iana" - }, - "application/vnd.americandynamics.acc": { - "source": "iana", - "extensions": ["acc"] - }, - "application/vnd.amiga.ami": { - "source": "iana", - "extensions": ["ami"] - }, - "application/vnd.amundsen.maze+xml": { - "source": "iana" - }, - "application/vnd.android.package-archive": { - "source": "apache", - "compressible": false, - "extensions": ["apk"] - }, - "application/vnd.anki": { - "source": "iana" - }, - "application/vnd.anser-web-certificate-issue-initiation": { - "source": "iana", - "extensions": ["cii"] - }, - "application/vnd.anser-web-funds-transfer-initiation": { - "source": "apache", - "extensions": ["fti"] - }, - "application/vnd.antix.game-component": { - "source": "iana", - "extensions": ["atx"] - }, - "application/vnd.apache.thrift.binary": { - "source": "iana" - }, - "application/vnd.apache.thrift.compact": { - "source": "iana" - }, - "application/vnd.apache.thrift.json": { - "source": "iana" - }, - "application/vnd.api+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apothekende.reservation+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.apple.installer+xml": { - "source": "iana", - "extensions": ["mpkg"] - }, - "application/vnd.apple.mpegurl": { - "source": "iana", - "extensions": ["m3u8"] - }, - "application/vnd.apple.pkpass": { - "compressible": false, - "extensions": ["pkpass"] - }, - "application/vnd.arastra.swi": { - "source": "iana" - }, - "application/vnd.aristanetworks.swi": { - "source": "iana", - "extensions": ["swi"] - }, - "application/vnd.artsquare": { - "source": "iana" - }, - "application/vnd.astraea-software.iota": { - "source": "iana", - "extensions": ["iota"] - }, - "application/vnd.audiograph": { - "source": "iana", - "extensions": ["aep"] - }, - "application/vnd.autopackage": { - "source": "iana" - }, - "application/vnd.avalon+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.avistar+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmml+xml": { - "source": "iana" - }, - "application/vnd.balsamiq.bmpr": { - "source": "iana" - }, - "application/vnd.bbf.usp.msg": { - "source": "iana" - }, - "application/vnd.bekitzur-stech+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.bint.med-content": { - "source": "iana" - }, - "application/vnd.biopax.rdf+xml": { - "source": "iana" - }, - "application/vnd.blink-idb-value-wrapper": { - "source": "iana" - }, - "application/vnd.blueice.multipass": { - "source": "iana", - "extensions": ["mpm"] - }, - "application/vnd.bluetooth.ep.oob": { - "source": "iana" - }, - "application/vnd.bluetooth.le.oob": { - "source": "iana" - }, - "application/vnd.bmi": { - "source": "iana", - "extensions": ["bmi"] - }, - "application/vnd.businessobjects": { - "source": "iana", - "extensions": ["rep"] - }, - "application/vnd.cab-jscript": { - "source": "iana" - }, - "application/vnd.canon-cpdl": { - "source": "iana" - }, - "application/vnd.canon-lips": { - "source": "iana" - }, - "application/vnd.capasystems-pg+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.cendio.thinlinc.clientconf": { - "source": "iana" - }, - "application/vnd.century-systems.tcp_stream": { - "source": "iana" - }, - "application/vnd.chemdraw+xml": { - "source": "iana", - "extensions": ["cdxml"] - }, - "application/vnd.chess-pgn": { - "source": "iana" - }, - "application/vnd.chipnuts.karaoke-mmd": { - "source": "iana", - "extensions": ["mmd"] - }, - "application/vnd.cinderella": { - "source": "iana", - "extensions": ["cdy"] - }, - "application/vnd.cirpack.isdn-ext": { - "source": "iana" - }, - "application/vnd.citationstyles.style+xml": { - "source": "iana" - }, - "application/vnd.claymore": { - "source": "iana", - "extensions": ["cla"] - }, - "application/vnd.cloanto.rp9": { - "source": "iana", - "extensions": ["rp9"] - }, - "application/vnd.clonk.c4group": { - "source": "iana", - "extensions": ["c4g","c4d","c4f","c4p","c4u"] - }, - "application/vnd.cluetrust.cartomobile-config": { - "source": "iana", - "extensions": ["c11amc"] - }, - "application/vnd.cluetrust.cartomobile-config-pkg": { - "source": "iana", - "extensions": ["c11amz"] - }, - "application/vnd.coffeescript": { - "source": "iana" - }, - "application/vnd.collabio.xodocuments.document": { - "source": "iana" - }, - "application/vnd.collabio.xodocuments.document-template": { - "source": "iana" - }, - "application/vnd.collabio.xodocuments.presentation": { - "source": "iana" - }, - "application/vnd.collabio.xodocuments.spreadsheet": { - "source": "iana" - }, - "application/vnd.collection+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.doc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.collection.next+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.comicbook+zip": { - "source": "iana" - }, - "application/vnd.commerce-battelle": { - "source": "iana" - }, - "application/vnd.commonspace": { - "source": "iana", - "extensions": ["csp"] - }, - "application/vnd.contact.cmsg": { - "source": "iana", - "extensions": ["cdbcmsg"] - }, - "application/vnd.coreos.ignition+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.cosmocaller": { - "source": "iana", - "extensions": ["cmc"] - }, - "application/vnd.crick.clicker": { - "source": "iana", - "extensions": ["clkx"] - }, - "application/vnd.crick.clicker.keyboard": { - "source": "iana", - "extensions": ["clkk"] - }, - "application/vnd.crick.clicker.palette": { - "source": "iana", - "extensions": ["clkp"] - }, - "application/vnd.crick.clicker.template": { - "source": "iana", - "extensions": ["clkt"] - }, - "application/vnd.crick.clicker.wordbank": { - "source": "iana", - "extensions": ["clkw"] - }, - "application/vnd.criticaltools.wbs+xml": { - "source": "iana", - "extensions": ["wbs"] - }, - "application/vnd.ctc-posml": { - "source": "iana", - "extensions": ["pml"] - }, - "application/vnd.ctct.ws+xml": { - "source": "iana" - }, - "application/vnd.cups-pdf": { - "source": "iana" - }, - "application/vnd.cups-postscript": { - "source": "iana" - }, - "application/vnd.cups-ppd": { - "source": "iana", - "extensions": ["ppd"] - }, - "application/vnd.cups-raster": { - "source": "iana" - }, - "application/vnd.cups-raw": { - "source": "iana" - }, - "application/vnd.curl": { - "source": "iana" - }, - "application/vnd.curl.car": { - "source": "apache", - "extensions": ["car"] - }, - "application/vnd.curl.pcurl": { - "source": "apache", - "extensions": ["pcurl"] - }, - "application/vnd.cyan.dean.root+xml": { - "source": "iana" - }, - "application/vnd.cybank": { - "source": "iana" - }, - "application/vnd.d2l.coursepackage1p0+zip": { - "source": "iana" - }, - "application/vnd.dart": { - "source": "iana", - "compressible": true, - "extensions": ["dart"] - }, - "application/vnd.data-vision.rdz": { - "source": "iana", - "extensions": ["rdz"] - }, - "application/vnd.datapackage+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dataresource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.debian.binary-package": { - "source": "iana" - }, - "application/vnd.dece.data": { - "source": "iana", - "extensions": ["uvf","uvvf","uvd","uvvd"] - }, - "application/vnd.dece.ttml+xml": { - "source": "iana", - "extensions": ["uvt","uvvt"] - }, - "application/vnd.dece.unspecified": { - "source": "iana", - "extensions": ["uvx","uvvx"] - }, - "application/vnd.dece.zip": { - "source": "iana", - "extensions": ["uvz","uvvz"] - }, - "application/vnd.denovo.fcselayout-link": { - "source": "iana", - "extensions": ["fe_launch"] - }, - "application/vnd.desmume-movie": { - "source": "iana" - }, - "application/vnd.desmume.movie": { - "source": "apache" - }, - "application/vnd.dir-bi.plate-dl-nosuffix": { - "source": "iana" - }, - "application/vnd.dm.delegation+xml": { - "source": "iana" - }, - "application/vnd.dna": { - "source": "iana", - "extensions": ["dna"] - }, - "application/vnd.document+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.dolby.mlp": { - "source": "apache", - "extensions": ["mlp"] - }, - "application/vnd.dolby.mobile.1": { - "source": "iana" - }, - "application/vnd.dolby.mobile.2": { - "source": "iana" - }, - "application/vnd.doremir.scorecloud-binary-document": { - "source": "iana" - }, - "application/vnd.dpgraph": { - "source": "iana", - "extensions": ["dpg"] - }, - "application/vnd.dreamfactory": { - "source": "iana", - "extensions": ["dfac"] - }, - "application/vnd.drive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ds-keypoint": { - "source": "apache", - "extensions": ["kpxx"] - }, - "application/vnd.dtg.local": { - "source": "iana" - }, - "application/vnd.dtg.local.flash": { - "source": "iana" - }, - "application/vnd.dtg.local.html": { - "source": "iana" - }, - "application/vnd.dvb.ait": { - "source": "iana", - "extensions": ["ait"] - }, - "application/vnd.dvb.dvbj": { - "source": "iana" - }, - "application/vnd.dvb.esgcontainer": { - "source": "iana" - }, - "application/vnd.dvb.ipdcdftnotifaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgaccess2": { - "source": "iana" - }, - "application/vnd.dvb.ipdcesgpdd": { - "source": "iana" - }, - "application/vnd.dvb.ipdcroaming": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-base": { - "source": "iana" - }, - "application/vnd.dvb.iptv.alfec-enhancement": { - "source": "iana" - }, - "application/vnd.dvb.notif-aggregate-root+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-container+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-generic+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-msglist+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-request+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-ia-registration-response+xml": { - "source": "iana" - }, - "application/vnd.dvb.notif-init+xml": { - "source": "iana" - }, - "application/vnd.dvb.pfr": { - "source": "iana" - }, - "application/vnd.dvb.service": { - "source": "iana", - "extensions": ["svc"] - }, - "application/vnd.dxr": { - "source": "iana" - }, - "application/vnd.dynageo": { - "source": "iana", - "extensions": ["geo"] - }, - "application/vnd.dzr": { - "source": "iana" - }, - "application/vnd.easykaraoke.cdgdownload": { - "source": "iana" - }, - "application/vnd.ecdis-update": { - "source": "iana" - }, - "application/vnd.ecip.rlp": { - "source": "iana" - }, - "application/vnd.ecowin.chart": { - "source": "iana", - "extensions": ["mag"] - }, - "application/vnd.ecowin.filerequest": { - "source": "iana" - }, - "application/vnd.ecowin.fileupdate": { - "source": "iana" - }, - "application/vnd.ecowin.series": { - "source": "iana" - }, - "application/vnd.ecowin.seriesrequest": { - "source": "iana" - }, - "application/vnd.ecowin.seriesupdate": { - "source": "iana" - }, - "application/vnd.efi.img": { - "source": "iana" - }, - "application/vnd.efi.iso": { - "source": "iana" - }, - "application/vnd.emclient.accessrequest+xml": { - "source": "iana" - }, - "application/vnd.enliven": { - "source": "iana", - "extensions": ["nml"] - }, - "application/vnd.enphase.envoy": { - "source": "iana" - }, - "application/vnd.eprints.data+xml": { - "source": "iana" - }, - "application/vnd.epson.esf": { - "source": "iana", - "extensions": ["esf"] - }, - "application/vnd.epson.msf": { - "source": "iana", - "extensions": ["msf"] - }, - "application/vnd.epson.quickanime": { - "source": "iana", - "extensions": ["qam"] - }, - "application/vnd.epson.salt": { - "source": "iana", - "extensions": ["slt"] - }, - "application/vnd.epson.ssf": { - "source": "iana", - "extensions": ["ssf"] - }, - "application/vnd.ericsson.quickcall": { - "source": "iana" - }, - "application/vnd.espass-espass+zip": { - "source": "iana" - }, - "application/vnd.eszigno3+xml": { - "source": "iana", - "extensions": ["es3","et3"] - }, - "application/vnd.etsi.aoc+xml": { - "source": "iana" - }, - "application/vnd.etsi.asic-e+zip": { - "source": "iana" - }, - "application/vnd.etsi.asic-s+zip": { - "source": "iana" - }, - "application/vnd.etsi.cug+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvcommand+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvdiscovery+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-bc+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-cod+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsad-npvr+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvservice+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvsync+xml": { - "source": "iana" - }, - "application/vnd.etsi.iptvueprofile+xml": { - "source": "iana" - }, - "application/vnd.etsi.mcid+xml": { - "source": "iana" - }, - "application/vnd.etsi.mheg5": { - "source": "iana" - }, - "application/vnd.etsi.overload-control-policy-dataset+xml": { - "source": "iana" - }, - "application/vnd.etsi.pstn+xml": { - "source": "iana" - }, - "application/vnd.etsi.sci+xml": { - "source": "iana" - }, - "application/vnd.etsi.simservs+xml": { - "source": "iana" - }, - "application/vnd.etsi.timestamp-token": { - "source": "iana" - }, - "application/vnd.etsi.tsl+xml": { - "source": "iana" - }, - "application/vnd.etsi.tsl.der": { - "source": "iana" - }, - "application/vnd.eudora.data": { - "source": "iana" - }, - "application/vnd.evolv.ecig.profile": { - "source": "iana" - }, - "application/vnd.evolv.ecig.settings": { - "source": "iana" - }, - "application/vnd.evolv.ecig.theme": { - "source": "iana" - }, - "application/vnd.ezpix-album": { - "source": "iana", - "extensions": ["ez2"] - }, - "application/vnd.ezpix-package": { - "source": "iana", - "extensions": ["ez3"] - }, - "application/vnd.f-secure.mobile": { - "source": "iana" - }, - "application/vnd.fastcopy-disk-image": { - "source": "iana" - }, - "application/vnd.fdf": { - "source": "iana", - "extensions": ["fdf"] - }, - "application/vnd.fdsn.mseed": { - "source": "iana", - "extensions": ["mseed"] - }, - "application/vnd.fdsn.seed": { - "source": "iana", - "extensions": ["seed","dataless"] - }, - "application/vnd.ffsns": { - "source": "iana" - }, - "application/vnd.filmit.zfc": { - "source": "iana" - }, - "application/vnd.fints": { - "source": "iana" - }, - "application/vnd.firemonkeys.cloudcell": { - "source": "iana" - }, - "application/vnd.flographit": { - "source": "iana", - "extensions": ["gph"] - }, - "application/vnd.fluxtime.clip": { - "source": "iana", - "extensions": ["ftc"] - }, - "application/vnd.font-fontforge-sfd": { - "source": "iana" - }, - "application/vnd.framemaker": { - "source": "iana", - "extensions": ["fm","frame","maker","book"] - }, - "application/vnd.frogans.fnc": { - "source": "iana", - "extensions": ["fnc"] - }, - "application/vnd.frogans.ltf": { - "source": "iana", - "extensions": ["ltf"] - }, - "application/vnd.fsc.weblaunch": { - "source": "iana", - "extensions": ["fsc"] - }, - "application/vnd.fujitsu.oasys": { - "source": "iana", - "extensions": ["oas"] - }, - "application/vnd.fujitsu.oasys2": { - "source": "iana", - "extensions": ["oa2"] - }, - "application/vnd.fujitsu.oasys3": { - "source": "iana", - "extensions": ["oa3"] - }, - "application/vnd.fujitsu.oasysgp": { - "source": "iana", - "extensions": ["fg5"] - }, - "application/vnd.fujitsu.oasysprs": { - "source": "iana", - "extensions": ["bh2"] - }, - "application/vnd.fujixerox.art-ex": { - "source": "iana" - }, - "application/vnd.fujixerox.art4": { - "source": "iana" - }, - "application/vnd.fujixerox.ddd": { - "source": "iana", - "extensions": ["ddd"] - }, - "application/vnd.fujixerox.docuworks": { - "source": "iana", - "extensions": ["xdw"] - }, - "application/vnd.fujixerox.docuworks.binder": { - "source": "iana", - "extensions": ["xbd"] - }, - "application/vnd.fujixerox.docuworks.container": { - "source": "iana" - }, - "application/vnd.fujixerox.hbpl": { - "source": "iana" - }, - "application/vnd.fut-misnet": { - "source": "iana" - }, - "application/vnd.fuzzysheet": { - "source": "iana", - "extensions": ["fzs"] - }, - "application/vnd.genomatix.tuxedo": { - "source": "iana", - "extensions": ["txd"] - }, - "application/vnd.geo+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.geocube+xml": { - "source": "iana" - }, - "application/vnd.geogebra.file": { - "source": "iana", - "extensions": ["ggb"] - }, - "application/vnd.geogebra.tool": { - "source": "iana", - "extensions": ["ggt"] - }, - "application/vnd.geometry-explorer": { - "source": "iana", - "extensions": ["gex","gre"] - }, - "application/vnd.geonext": { - "source": "iana", - "extensions": ["gxt"] - }, - "application/vnd.geoplan": { - "source": "iana", - "extensions": ["g2w"] - }, - "application/vnd.geospace": { - "source": "iana", - "extensions": ["g3w"] - }, - "application/vnd.gerber": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt": { - "source": "iana" - }, - "application/vnd.globalplatform.card-content-mgt-response": { - "source": "iana" - }, - "application/vnd.gmx": { - "source": "iana", - "extensions": ["gmx"] - }, - "application/vnd.google-apps.document": { - "compressible": false, - "extensions": ["gdoc"] - }, - "application/vnd.google-apps.presentation": { - "compressible": false, - "extensions": ["gslides"] - }, - "application/vnd.google-apps.spreadsheet": { - "compressible": false, - "extensions": ["gsheet"] - }, - "application/vnd.google-earth.kml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["kml"] - }, - "application/vnd.google-earth.kmz": { - "source": "iana", - "compressible": false, - "extensions": ["kmz"] - }, - "application/vnd.gov.sk.e-form+xml": { - "source": "iana" - }, - "application/vnd.gov.sk.e-form+zip": { - "source": "iana" - }, - "application/vnd.gov.sk.xmldatacontainer+xml": { - "source": "iana" - }, - "application/vnd.grafeq": { - "source": "iana", - "extensions": ["gqf","gqs"] - }, - "application/vnd.gridmp": { - "source": "iana" - }, - "application/vnd.groove-account": { - "source": "iana", - "extensions": ["gac"] - }, - "application/vnd.groove-help": { - "source": "iana", - "extensions": ["ghf"] - }, - "application/vnd.groove-identity-message": { - "source": "iana", - "extensions": ["gim"] - }, - "application/vnd.groove-injector": { - "source": "iana", - "extensions": ["grv"] - }, - "application/vnd.groove-tool-message": { - "source": "iana", - "extensions": ["gtm"] - }, - "application/vnd.groove-tool-template": { - "source": "iana", - "extensions": ["tpl"] - }, - "application/vnd.groove-vcard": { - "source": "iana", - "extensions": ["vcg"] - }, - "application/vnd.hal+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hal+xml": { - "source": "iana", - "extensions": ["hal"] - }, - "application/vnd.handheld-entertainment+xml": { - "source": "iana", - "extensions": ["zmm"] - }, - "application/vnd.hbci": { - "source": "iana", - "extensions": ["hbci"] - }, - "application/vnd.hc+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hcl-bireports": { - "source": "iana" - }, - "application/vnd.hdt": { - "source": "iana" - }, - "application/vnd.heroku+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hhe.lesson-player": { - "source": "iana", - "extensions": ["les"] - }, - "application/vnd.hp-hpgl": { - "source": "iana", - "extensions": ["hpgl"] - }, - "application/vnd.hp-hpid": { - "source": "iana", - "extensions": ["hpid"] - }, - "application/vnd.hp-hps": { - "source": "iana", - "extensions": ["hps"] - }, - "application/vnd.hp-jlyt": { - "source": "iana", - "extensions": ["jlt"] - }, - "application/vnd.hp-pcl": { - "source": "iana", - "extensions": ["pcl"] - }, - "application/vnd.hp-pclxl": { - "source": "iana", - "extensions": ["pclxl"] - }, - "application/vnd.httphone": { - "source": "iana" - }, - "application/vnd.hydrostatix.sof-data": { - "source": "iana", - "extensions": ["sfd-hdstx"] - }, - "application/vnd.hyper-item+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hyperdrive+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.hzn-3d-crossword": { - "source": "iana" - }, - "application/vnd.ibm.afplinedata": { - "source": "iana" - }, - "application/vnd.ibm.electronic-media": { - "source": "iana" - }, - "application/vnd.ibm.minipay": { - "source": "iana", - "extensions": ["mpy"] - }, - "application/vnd.ibm.modcap": { - "source": "iana", - "extensions": ["afp","listafp","list3820"] - }, - "application/vnd.ibm.rights-management": { - "source": "iana", - "extensions": ["irm"] - }, - "application/vnd.ibm.secure-container": { - "source": "iana", - "extensions": ["sc"] - }, - "application/vnd.iccprofile": { - "source": "iana", - "extensions": ["icc","icm"] - }, - "application/vnd.ieee.1905": { - "source": "iana" - }, - "application/vnd.igloader": { - "source": "iana", - "extensions": ["igl"] - }, - "application/vnd.imagemeter.folder+zip": { - "source": "iana" - }, - "application/vnd.imagemeter.image+zip": { - "source": "iana" - }, - "application/vnd.immervision-ivp": { - "source": "iana", - "extensions": ["ivp"] - }, - "application/vnd.immervision-ivu": { - "source": "iana", - "extensions": ["ivu"] - }, - "application/vnd.ims.imsccv1p1": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p2": { - "source": "iana" - }, - "application/vnd.ims.imsccv1p3": { - "source": "iana" - }, - "application/vnd.ims.lis.v2.result+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolconsumerprofile+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolproxy.id+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.ims.lti.v2.toolsettings.simple+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.informedcontrol.rms+xml": { - "source": "iana" - }, - "application/vnd.informix-visionary": { - "source": "iana" - }, - "application/vnd.infotech.project": { - "source": "iana" - }, - "application/vnd.infotech.project+xml": { - "source": "iana" - }, - "application/vnd.innopath.wamp.notification": { - "source": "iana" - }, - "application/vnd.insors.igm": { - "source": "iana", - "extensions": ["igm"] - }, - "application/vnd.intercon.formnet": { - "source": "iana", - "extensions": ["xpw","xpx"] - }, - "application/vnd.intergeo": { - "source": "iana", - "extensions": ["i2g"] - }, - "application/vnd.intertrust.digibox": { - "source": "iana" - }, - "application/vnd.intertrust.nncp": { - "source": "iana" - }, - "application/vnd.intu.qbo": { - "source": "iana", - "extensions": ["qbo"] - }, - "application/vnd.intu.qfx": { - "source": "iana", - "extensions": ["qfx"] - }, - "application/vnd.iptc.g2.catalogitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.conceptitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.knowledgeitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.newsmessage+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.packageitem+xml": { - "source": "iana" - }, - "application/vnd.iptc.g2.planningitem+xml": { - "source": "iana" - }, - "application/vnd.ipunplugged.rcprofile": { - "source": "iana", - "extensions": ["rcprofile"] - }, - "application/vnd.irepository.package+xml": { - "source": "iana", - "extensions": ["irp"] - }, - "application/vnd.is-xpr": { - "source": "iana", - "extensions": ["xpr"] - }, - "application/vnd.isac.fcs": { - "source": "iana", - "extensions": ["fcs"] - }, - "application/vnd.jam": { - "source": "iana", - "extensions": ["jam"] - }, - "application/vnd.japannet-directory-service": { - "source": "iana" - }, - "application/vnd.japannet-jpnstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-payment-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-registration": { - "source": "iana" - }, - "application/vnd.japannet-registration-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-setstore-wakeup": { - "source": "iana" - }, - "application/vnd.japannet-verification": { - "source": "iana" - }, - "application/vnd.japannet-verification-wakeup": { - "source": "iana" - }, - "application/vnd.jcp.javame.midlet-rms": { - "source": "iana", - "extensions": ["rms"] - }, - "application/vnd.jisp": { - "source": "iana", - "extensions": ["jisp"] - }, - "application/vnd.joost.joda-archive": { - "source": "iana", - "extensions": ["joda"] - }, - "application/vnd.jsk.isdn-ngn": { - "source": "iana" - }, - "application/vnd.kahootz": { - "source": "iana", - "extensions": ["ktz","ktr"] - }, - "application/vnd.kde.karbon": { - "source": "iana", - "extensions": ["karbon"] - }, - "application/vnd.kde.kchart": { - "source": "iana", - "extensions": ["chrt"] - }, - "application/vnd.kde.kformula": { - "source": "iana", - "extensions": ["kfo"] - }, - "application/vnd.kde.kivio": { - "source": "iana", - "extensions": ["flw"] - }, - "application/vnd.kde.kontour": { - "source": "iana", - "extensions": ["kon"] - }, - "application/vnd.kde.kpresenter": { - "source": "iana", - "extensions": ["kpr","kpt"] - }, - "application/vnd.kde.kspread": { - "source": "iana", - "extensions": ["ksp"] - }, - "application/vnd.kde.kword": { - "source": "iana", - "extensions": ["kwd","kwt"] - }, - "application/vnd.kenameaapp": { - "source": "iana", - "extensions": ["htke"] - }, - "application/vnd.kidspiration": { - "source": "iana", - "extensions": ["kia"] - }, - "application/vnd.kinar": { - "source": "iana", - "extensions": ["kne","knp"] - }, - "application/vnd.koan": { - "source": "iana", - "extensions": ["skp","skd","skt","skm"] - }, - "application/vnd.kodak-descriptor": { - "source": "iana", - "extensions": ["sse"] - }, - "application/vnd.las.las+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.las.las+xml": { - "source": "iana", - "extensions": ["lasxml"] - }, - "application/vnd.liberty-request+xml": { - "source": "iana" - }, - "application/vnd.llamagraphics.life-balance.desktop": { - "source": "iana", - "extensions": ["lbd"] - }, - "application/vnd.llamagraphics.life-balance.exchange+xml": { - "source": "iana", - "extensions": ["lbe"] - }, - "application/vnd.lotus-1-2-3": { - "source": "iana", - "extensions": ["123"] - }, - "application/vnd.lotus-approach": { - "source": "iana", - "extensions": ["apr"] - }, - "application/vnd.lotus-freelance": { - "source": "iana", - "extensions": ["pre"] - }, - "application/vnd.lotus-notes": { - "source": "iana", - "extensions": ["nsf"] - }, - "application/vnd.lotus-organizer": { - "source": "iana", - "extensions": ["org"] - }, - "application/vnd.lotus-screencam": { - "source": "iana", - "extensions": ["scm"] - }, - "application/vnd.lotus-wordpro": { - "source": "iana", - "extensions": ["lwp"] - }, - "application/vnd.macports.portpkg": { - "source": "iana", - "extensions": ["portpkg"] - }, - "application/vnd.mapbox-vector-tile": { - "source": "iana" - }, - "application/vnd.marlin.drm.actiontoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.conftoken+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.license+xml": { - "source": "iana" - }, - "application/vnd.marlin.drm.mdcf": { - "source": "iana" - }, - "application/vnd.mason+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.maxmind.maxmind-db": { - "source": "iana" - }, - "application/vnd.mcd": { - "source": "iana", - "extensions": ["mcd"] - }, - "application/vnd.medcalcdata": { - "source": "iana", - "extensions": ["mc1"] - }, - "application/vnd.mediastation.cdkey": { - "source": "iana", - "extensions": ["cdkey"] - }, - "application/vnd.meridian-slingshot": { - "source": "iana" - }, - "application/vnd.mfer": { - "source": "iana", - "extensions": ["mwf"] - }, - "application/vnd.mfmp": { - "source": "iana", - "extensions": ["mfm"] - }, - "application/vnd.micro+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.micrografx.flo": { - "source": "iana", - "extensions": ["flo"] - }, - "application/vnd.micrografx.igx": { - "source": "iana", - "extensions": ["igx"] - }, - "application/vnd.microsoft.portable-executable": { - "source": "iana" - }, - "application/vnd.microsoft.windows.thumbnail-cache": { - "source": "iana" - }, - "application/vnd.miele+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.mif": { - "source": "iana", - "extensions": ["mif"] - }, - "application/vnd.minisoft-hp3000-save": { - "source": "iana" - }, - "application/vnd.mitsubishi.misty-guard.trustweb": { - "source": "iana" - }, - "application/vnd.mobius.daf": { - "source": "iana", - "extensions": ["daf"] - }, - "application/vnd.mobius.dis": { - "source": "iana", - "extensions": ["dis"] - }, - "application/vnd.mobius.mbk": { - "source": "iana", - "extensions": ["mbk"] - }, - "application/vnd.mobius.mqy": { - "source": "iana", - "extensions": ["mqy"] - }, - "application/vnd.mobius.msl": { - "source": "iana", - "extensions": ["msl"] - }, - "application/vnd.mobius.plc": { - "source": "iana", - "extensions": ["plc"] - }, - "application/vnd.mobius.txf": { - "source": "iana", - "extensions": ["txf"] - }, - "application/vnd.mophun.application": { - "source": "iana", - "extensions": ["mpn"] - }, - "application/vnd.mophun.certificate": { - "source": "iana", - "extensions": ["mpc"] - }, - "application/vnd.motorola.flexsuite": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.adsi": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.fis": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.gotap": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.kmr": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.ttc": { - "source": "iana" - }, - "application/vnd.motorola.flexsuite.wem": { - "source": "iana" - }, - "application/vnd.motorola.iprm": { - "source": "iana" - }, - "application/vnd.mozilla.xul+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xul"] - }, - "application/vnd.ms-3mfdocument": { - "source": "iana" - }, - "application/vnd.ms-artgalry": { - "source": "iana", - "extensions": ["cil"] - }, - "application/vnd.ms-asf": { - "source": "iana" - }, - "application/vnd.ms-cab-compressed": { - "source": "iana", - "extensions": ["cab"] - }, - "application/vnd.ms-color.iccprofile": { - "source": "apache" - }, - "application/vnd.ms-excel": { - "source": "iana", - "compressible": false, - "extensions": ["xls","xlm","xla","xlc","xlt","xlw"] - }, - "application/vnd.ms-excel.addin.macroenabled.12": { - "source": "iana", - "extensions": ["xlam"] - }, - "application/vnd.ms-excel.sheet.binary.macroenabled.12": { - "source": "iana", - "extensions": ["xlsb"] - }, - "application/vnd.ms-excel.sheet.macroenabled.12": { - "source": "iana", - "extensions": ["xlsm"] - }, - "application/vnd.ms-excel.template.macroenabled.12": { - "source": "iana", - "extensions": ["xltm"] - }, - "application/vnd.ms-fontobject": { - "source": "iana", - "compressible": true, - "extensions": ["eot"] - }, - "application/vnd.ms-htmlhelp": { - "source": "iana", - "extensions": ["chm"] - }, - "application/vnd.ms-ims": { - "source": "iana", - "extensions": ["ims"] - }, - "application/vnd.ms-lrm": { - "source": "iana", - "extensions": ["lrm"] - }, - "application/vnd.ms-office.activex+xml": { - "source": "iana" - }, - "application/vnd.ms-officetheme": { - "source": "iana", - "extensions": ["thmx"] - }, - "application/vnd.ms-opentype": { - "source": "apache", - "compressible": true - }, - "application/vnd.ms-outlook": { - "compressible": false, - "extensions": ["msg"] - }, - "application/vnd.ms-package.obfuscated-opentype": { - "source": "apache" - }, - "application/vnd.ms-pki.seccat": { - "source": "apache", - "extensions": ["cat"] - }, - "application/vnd.ms-pki.stl": { - "source": "apache", - "extensions": ["stl"] - }, - "application/vnd.ms-playready.initiator+xml": { - "source": "iana" - }, - "application/vnd.ms-powerpoint": { - "source": "iana", - "compressible": false, - "extensions": ["ppt","pps","pot"] - }, - "application/vnd.ms-powerpoint.addin.macroenabled.12": { - "source": "iana", - "extensions": ["ppam"] - }, - "application/vnd.ms-powerpoint.presentation.macroenabled.12": { - "source": "iana", - "extensions": ["pptm"] - }, - "application/vnd.ms-powerpoint.slide.macroenabled.12": { - "source": "iana", - "extensions": ["sldm"] - }, - "application/vnd.ms-powerpoint.slideshow.macroenabled.12": { - "source": "iana", - "extensions": ["ppsm"] - }, - "application/vnd.ms-powerpoint.template.macroenabled.12": { - "source": "iana", - "extensions": ["potm"] - }, - "application/vnd.ms-printdevicecapabilities+xml": { - "source": "iana" - }, - "application/vnd.ms-printing.printticket+xml": { - "source": "apache" - }, - "application/vnd.ms-printschematicket+xml": { - "source": "iana" - }, - "application/vnd.ms-project": { - "source": "iana", - "extensions": ["mpp","mpt"] - }, - "application/vnd.ms-tnef": { - "source": "iana" - }, - "application/vnd.ms-windows.devicepairing": { - "source": "iana" - }, - "application/vnd.ms-windows.nwprinting.oob": { - "source": "iana" - }, - "application/vnd.ms-windows.printerpairing": { - "source": "iana" - }, - "application/vnd.ms-windows.wsd.oob": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.lic-resp": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-chlg-req": { - "source": "iana" - }, - "application/vnd.ms-wmdrm.meter-resp": { - "source": "iana" - }, - "application/vnd.ms-word.document.macroenabled.12": { - "source": "iana", - "extensions": ["docm"] - }, - "application/vnd.ms-word.template.macroenabled.12": { - "source": "iana", - "extensions": ["dotm"] - }, - "application/vnd.ms-works": { - "source": "iana", - "extensions": ["wps","wks","wcm","wdb"] - }, - "application/vnd.ms-wpl": { - "source": "iana", - "extensions": ["wpl"] - }, - "application/vnd.ms-xpsdocument": { - "source": "iana", - "compressible": false, - "extensions": ["xps"] - }, - "application/vnd.msa-disk-image": { - "source": "iana" - }, - "application/vnd.mseq": { - "source": "iana", - "extensions": ["mseq"] - }, - "application/vnd.msign": { - "source": "iana" - }, - "application/vnd.multiad.creator": { - "source": "iana" - }, - "application/vnd.multiad.creator.cif": { - "source": "iana" - }, - "application/vnd.music-niff": { - "source": "iana" - }, - "application/vnd.musician": { - "source": "iana", - "extensions": ["mus"] - }, - "application/vnd.muvee.style": { - "source": "iana", - "extensions": ["msty"] - }, - "application/vnd.mynfc": { - "source": "iana", - "extensions": ["taglet"] - }, - "application/vnd.ncd.control": { - "source": "iana" - }, - "application/vnd.ncd.reference": { - "source": "iana" - }, - "application/vnd.nearst.inv+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.nervana": { - "source": "iana" - }, - "application/vnd.netfpx": { - "source": "iana" - }, - "application/vnd.neurolanguage.nlu": { - "source": "iana", - "extensions": ["nlu"] - }, - "application/vnd.nintendo.nitro.rom": { - "source": "iana" - }, - "application/vnd.nintendo.snes.rom": { - "source": "iana" - }, - "application/vnd.nitf": { - "source": "iana", - "extensions": ["ntf","nitf"] - }, - "application/vnd.noblenet-directory": { - "source": "iana", - "extensions": ["nnd"] - }, - "application/vnd.noblenet-sealer": { - "source": "iana", - "extensions": ["nns"] - }, - "application/vnd.noblenet-web": { - "source": "iana", - "extensions": ["nnw"] - }, - "application/vnd.nokia.catalogs": { - "source": "iana" - }, - "application/vnd.nokia.conml+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.conml+xml": { - "source": "iana" - }, - "application/vnd.nokia.iptv.config+xml": { - "source": "iana" - }, - "application/vnd.nokia.isds-radio-presets": { - "source": "iana" - }, - "application/vnd.nokia.landmark+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.landmark+xml": { - "source": "iana" - }, - "application/vnd.nokia.landmarkcollection+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.ac+xml": { - "source": "iana" - }, - "application/vnd.nokia.n-gage.data": { - "source": "iana", - "extensions": ["ngdat"] - }, - "application/vnd.nokia.n-gage.symbian.install": { - "source": "iana", - "extensions": ["n-gage"] - }, - "application/vnd.nokia.ncd": { - "source": "iana" - }, - "application/vnd.nokia.pcd+wbxml": { - "source": "iana" - }, - "application/vnd.nokia.pcd+xml": { - "source": "iana" - }, - "application/vnd.nokia.radio-preset": { - "source": "iana", - "extensions": ["rpst"] - }, - "application/vnd.nokia.radio-presets": { - "source": "iana", - "extensions": ["rpss"] - }, - "application/vnd.novadigm.edm": { - "source": "iana", - "extensions": ["edm"] - }, - "application/vnd.novadigm.edx": { - "source": "iana", - "extensions": ["edx"] - }, - "application/vnd.novadigm.ext": { - "source": "iana", - "extensions": ["ext"] - }, - "application/vnd.ntt-local.content-share": { - "source": "iana" - }, - "application/vnd.ntt-local.file-transfer": { - "source": "iana" - }, - "application/vnd.ntt-local.ogw_remote-access": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_remote": { - "source": "iana" - }, - "application/vnd.ntt-local.sip-ta_tcp_stream": { - "source": "iana" - }, - "application/vnd.oasis.opendocument.chart": { - "source": "iana", - "extensions": ["odc"] - }, - "application/vnd.oasis.opendocument.chart-template": { - "source": "iana", - "extensions": ["otc"] - }, - "application/vnd.oasis.opendocument.database": { - "source": "iana", - "extensions": ["odb"] - }, - "application/vnd.oasis.opendocument.formula": { - "source": "iana", - "extensions": ["odf"] - }, - "application/vnd.oasis.opendocument.formula-template": { - "source": "iana", - "extensions": ["odft"] - }, - "application/vnd.oasis.opendocument.graphics": { - "source": "iana", - "compressible": false, - "extensions": ["odg"] - }, - "application/vnd.oasis.opendocument.graphics-template": { - "source": "iana", - "extensions": ["otg"] - }, - "application/vnd.oasis.opendocument.image": { - "source": "iana", - "extensions": ["odi"] - }, - "application/vnd.oasis.opendocument.image-template": { - "source": "iana", - "extensions": ["oti"] - }, - "application/vnd.oasis.opendocument.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["odp"] - }, - "application/vnd.oasis.opendocument.presentation-template": { - "source": "iana", - "extensions": ["otp"] - }, - "application/vnd.oasis.opendocument.spreadsheet": { - "source": "iana", - "compressible": false, - "extensions": ["ods"] - }, - "application/vnd.oasis.opendocument.spreadsheet-template": { - "source": "iana", - "extensions": ["ots"] - }, - "application/vnd.oasis.opendocument.text": { - "source": "iana", - "compressible": false, - "extensions": ["odt"] - }, - "application/vnd.oasis.opendocument.text-master": { - "source": "iana", - "extensions": ["odm"] - }, - "application/vnd.oasis.opendocument.text-template": { - "source": "iana", - "extensions": ["ott"] - }, - "application/vnd.oasis.opendocument.text-web": { - "source": "iana", - "extensions": ["oth"] - }, - "application/vnd.obn": { - "source": "iana" - }, - "application/vnd.ocf+cbor": { - "source": "iana" - }, - "application/vnd.oftn.l10n+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oipf.contentaccessdownload+xml": { - "source": "iana" - }, - "application/vnd.oipf.contentaccessstreaming+xml": { - "source": "iana" - }, - "application/vnd.oipf.cspg-hexbinary": { - "source": "iana" - }, - "application/vnd.oipf.dae.svg+xml": { - "source": "iana" - }, - "application/vnd.oipf.dae.xhtml+xml": { - "source": "iana" - }, - "application/vnd.oipf.mippvcontrolmessage+xml": { - "source": "iana" - }, - "application/vnd.oipf.pae.gem": { - "source": "iana" - }, - "application/vnd.oipf.spdiscovery+xml": { - "source": "iana" - }, - "application/vnd.oipf.spdlist+xml": { - "source": "iana" - }, - "application/vnd.oipf.ueprofile+xml": { - "source": "iana" - }, - "application/vnd.oipf.userprofile+xml": { - "source": "iana" - }, - "application/vnd.olpc-sugar": { - "source": "iana", - "extensions": ["xo"] - }, - "application/vnd.oma-scws-config": { - "source": "iana" - }, - "application/vnd.oma-scws-http-request": { - "source": "iana" - }, - "application/vnd.oma-scws-http-response": { - "source": "iana" - }, - "application/vnd.oma.bcast.associated-procedure-parameter+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.drm-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.imd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.ltkm": { - "source": "iana" - }, - "application/vnd.oma.bcast.notification+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.provisioningtrigger": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgboot": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdd+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sgdu": { - "source": "iana" - }, - "application/vnd.oma.bcast.simple-symbol-container": { - "source": "iana" - }, - "application/vnd.oma.bcast.smartcard-trigger+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.sprov+xml": { - "source": "iana" - }, - "application/vnd.oma.bcast.stkm": { - "source": "iana" - }, - "application/vnd.oma.cab-address-book+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-feature-handler+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-pcc+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-subs-invite+xml": { - "source": "iana" - }, - "application/vnd.oma.cab-user-prefs+xml": { - "source": "iana" - }, - "application/vnd.oma.dcd": { - "source": "iana" - }, - "application/vnd.oma.dcdc": { - "source": "iana" - }, - "application/vnd.oma.dd2+xml": { - "source": "iana", - "extensions": ["dd2"] - }, - "application/vnd.oma.drm.risd+xml": { - "source": "iana" - }, - "application/vnd.oma.group-usage-list+xml": { - "source": "iana" - }, - "application/vnd.oma.lwm2m+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.oma.lwm2m+tlv": { - "source": "iana" - }, - "application/vnd.oma.pal+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.detailed-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.final-report+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.groups+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.invocation-descriptor+xml": { - "source": "iana" - }, - "application/vnd.oma.poc.optimized-progress-report+xml": { - "source": "iana" - }, - "application/vnd.oma.push": { - "source": "iana" - }, - "application/vnd.oma.scidm.messages+xml": { - "source": "iana" - }, - "application/vnd.oma.xcap-directory+xml": { - "source": "iana" - }, - "application/vnd.omads-email+xml": { - "source": "iana" - }, - "application/vnd.omads-file+xml": { - "source": "iana" - }, - "application/vnd.omads-folder+xml": { - "source": "iana" - }, - "application/vnd.omaloc-supl-init": { - "source": "iana" - }, - "application/vnd.onepager": { - "source": "iana" - }, - "application/vnd.onepagertamp": { - "source": "iana" - }, - "application/vnd.onepagertamx": { - "source": "iana" - }, - "application/vnd.onepagertat": { - "source": "iana" - }, - "application/vnd.onepagertatp": { - "source": "iana" - }, - "application/vnd.onepagertatx": { - "source": "iana" - }, - "application/vnd.openblox.game+xml": { - "source": "iana" - }, - "application/vnd.openblox.game-binary": { - "source": "iana" - }, - "application/vnd.openeye.oeb": { - "source": "iana" - }, - "application/vnd.openofficeorg.extension": { - "source": "apache", - "extensions": ["oxt"] - }, - "application/vnd.openstreetmap.data+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.custom-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawing+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.extended-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation": { - "source": "iana", - "compressible": false, - "extensions": ["pptx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide": { - "source": "iana", - "extensions": ["sldx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow": { - "source": "iana", - "extensions": ["ppsx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.template": { - "source": "apache", - "extensions": ["potx"] - }, - "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": { - "source": "iana", - "compressible": false, - "extensions": ["xlsx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template": { - "source": "apache", - "extensions": ["xltx"] - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.theme+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.themeoverride+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.vmldrawing": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml-template": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document": { - "source": "iana", - "compressible": false, - "extensions": ["docx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template": { - "source": "apache", - "extensions": ["dotx"] - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.core-properties+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": { - "source": "iana" - }, - "application/vnd.openxmlformats-package.relationships+xml": { - "source": "iana" - }, - "application/vnd.oracle.resource+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.orange.indata": { - "source": "iana" - }, - "application/vnd.osa.netdeploy": { - "source": "iana" - }, - "application/vnd.osgeo.mapguide.package": { - "source": "iana", - "extensions": ["mgp"] - }, - "application/vnd.osgi.bundle": { - "source": "iana" - }, - "application/vnd.osgi.dp": { - "source": "iana", - "extensions": ["dp"] - }, - "application/vnd.osgi.subsystem": { - "source": "iana", - "extensions": ["esa"] - }, - "application/vnd.otps.ct-kip+xml": { - "source": "iana" - }, - "application/vnd.oxli.countgraph": { - "source": "iana" - }, - "application/vnd.pagerduty+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.palm": { - "source": "iana", - "extensions": ["pdb","pqa","oprc"] - }, - "application/vnd.panoply": { - "source": "iana" - }, - "application/vnd.paos+xml": { - "source": "iana" - }, - "application/vnd.paos.xml": { - "source": "apache" - }, - "application/vnd.patentdive": { - "source": "iana" - }, - "application/vnd.pawaafile": { - "source": "iana", - "extensions": ["paw"] - }, - "application/vnd.pcos": { - "source": "iana" - }, - "application/vnd.pg.format": { - "source": "iana", - "extensions": ["str"] - }, - "application/vnd.pg.osasli": { - "source": "iana", - "extensions": ["ei6"] - }, - "application/vnd.piaccess.application-licence": { - "source": "iana" - }, - "application/vnd.picsel": { - "source": "iana", - "extensions": ["efif"] - }, - "application/vnd.pmi.widget": { - "source": "iana", - "extensions": ["wg"] - }, - "application/vnd.poc.group-advertisement+xml": { - "source": "iana" - }, - "application/vnd.pocketlearn": { - "source": "iana", - "extensions": ["plf"] - }, - "application/vnd.powerbuilder6": { - "source": "iana", - "extensions": ["pbd"] - }, - "application/vnd.powerbuilder6-s": { - "source": "iana" - }, - "application/vnd.powerbuilder7": { - "source": "iana" - }, - "application/vnd.powerbuilder7-s": { - "source": "iana" - }, - "application/vnd.powerbuilder75": { - "source": "iana" - }, - "application/vnd.powerbuilder75-s": { - "source": "iana" - }, - "application/vnd.preminet": { - "source": "iana" - }, - "application/vnd.previewsystems.box": { - "source": "iana", - "extensions": ["box"] - }, - "application/vnd.proteus.magazine": { - "source": "iana", - "extensions": ["mgz"] - }, - "application/vnd.publishare-delta-tree": { - "source": "iana", - "extensions": ["qps"] - }, - "application/vnd.pvi.ptid1": { - "source": "iana", - "extensions": ["ptid"] - }, - "application/vnd.pwg-multiplexed": { - "source": "iana" - }, - "application/vnd.pwg-xhtml-print+xml": { - "source": "iana" - }, - "application/vnd.qualcomm.brew-app-res": { - "source": "iana" - }, - "application/vnd.quarantainenet": { - "source": "iana" - }, - "application/vnd.quark.quarkxpress": { - "source": "iana", - "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"] - }, - "application/vnd.quobject-quoxdocument": { - "source": "iana" - }, - "application/vnd.radisys.moml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-conn+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-audit-stream+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-conf+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-base+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-detect+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-group+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-speech+xml": { - "source": "iana" - }, - "application/vnd.radisys.msml-dialog-transform+xml": { - "source": "iana" - }, - "application/vnd.rainstor.data": { - "source": "iana" - }, - "application/vnd.rapid": { - "source": "iana" - }, - "application/vnd.rar": { - "source": "iana" - }, - "application/vnd.realvnc.bed": { - "source": "iana", - "extensions": ["bed"] - }, - "application/vnd.recordare.musicxml": { - "source": "iana", - "extensions": ["mxl"] - }, - "application/vnd.recordare.musicxml+xml": { - "source": "iana", - "extensions": ["musicxml"] - }, - "application/vnd.renlearn.rlprint": { - "source": "iana" - }, - "application/vnd.rig.cryptonote": { - "source": "iana", - "extensions": ["cryptonote"] - }, - "application/vnd.rim.cod": { - "source": "apache", - "extensions": ["cod"] - }, - "application/vnd.rn-realmedia": { - "source": "apache", - "extensions": ["rm"] - }, - "application/vnd.rn-realmedia-vbr": { - "source": "apache", - "extensions": ["rmvb"] - }, - "application/vnd.route66.link66+xml": { - "source": "iana", - "extensions": ["link66"] - }, - "application/vnd.rs-274x": { - "source": "iana" - }, - "application/vnd.ruckus.download": { - "source": "iana" - }, - "application/vnd.s3sms": { - "source": "iana" - }, - "application/vnd.sailingtracker.track": { - "source": "iana", - "extensions": ["st"] - }, - "application/vnd.sbm.cid": { - "source": "iana" - }, - "application/vnd.sbm.mid2": { - "source": "iana" - }, - "application/vnd.scribus": { - "source": "iana" - }, - "application/vnd.sealed.3df": { - "source": "iana" - }, - "application/vnd.sealed.csf": { - "source": "iana" - }, - "application/vnd.sealed.doc": { - "source": "iana" - }, - "application/vnd.sealed.eml": { - "source": "iana" - }, - "application/vnd.sealed.mht": { - "source": "iana" - }, - "application/vnd.sealed.net": { - "source": "iana" - }, - "application/vnd.sealed.ppt": { - "source": "iana" - }, - "application/vnd.sealed.tiff": { - "source": "iana" - }, - "application/vnd.sealed.xls": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.html": { - "source": "iana" - }, - "application/vnd.sealedmedia.softseal.pdf": { - "source": "iana" - }, - "application/vnd.seemail": { - "source": "iana", - "extensions": ["see"] - }, - "application/vnd.sema": { - "source": "iana", - "extensions": ["sema"] - }, - "application/vnd.semd": { - "source": "iana", - "extensions": ["semd"] - }, - "application/vnd.semf": { - "source": "iana", - "extensions": ["semf"] - }, - "application/vnd.shana.informed.formdata": { - "source": "iana", - "extensions": ["ifm"] - }, - "application/vnd.shana.informed.formtemplate": { - "source": "iana", - "extensions": ["itp"] - }, - "application/vnd.shana.informed.interchange": { - "source": "iana", - "extensions": ["iif"] - }, - "application/vnd.shana.informed.package": { - "source": "iana", - "extensions": ["ipk"] - }, - "application/vnd.sigrok.session": { - "source": "iana" - }, - "application/vnd.simtech-mindmapper": { - "source": "iana", - "extensions": ["twd","twds"] - }, - "application/vnd.siren+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.smaf": { - "source": "iana", - "extensions": ["mmf"] - }, - "application/vnd.smart.notebook": { - "source": "iana" - }, - "application/vnd.smart.teacher": { - "source": "iana", - "extensions": ["teacher"] - }, - "application/vnd.software602.filler.form+xml": { - "source": "iana" - }, - "application/vnd.software602.filler.form-xml-zip": { - "source": "iana" - }, - "application/vnd.solent.sdkm+xml": { - "source": "iana", - "extensions": ["sdkm","sdkd"] - }, - "application/vnd.spotfire.dxp": { - "source": "iana", - "extensions": ["dxp"] - }, - "application/vnd.spotfire.sfs": { - "source": "iana", - "extensions": ["sfs"] - }, - "application/vnd.sss-cod": { - "source": "iana" - }, - "application/vnd.sss-dtf": { - "source": "iana" - }, - "application/vnd.sss-ntf": { - "source": "iana" - }, - "application/vnd.stardivision.calc": { - "source": "apache", - "extensions": ["sdc"] - }, - "application/vnd.stardivision.draw": { - "source": "apache", - "extensions": ["sda"] - }, - "application/vnd.stardivision.impress": { - "source": "apache", - "extensions": ["sdd"] - }, - "application/vnd.stardivision.math": { - "source": "apache", - "extensions": ["smf"] - }, - "application/vnd.stardivision.writer": { - "source": "apache", - "extensions": ["sdw","vor"] - }, - "application/vnd.stardivision.writer-global": { - "source": "apache", - "extensions": ["sgl"] - }, - "application/vnd.stepmania.package": { - "source": "iana", - "extensions": ["smzip"] - }, - "application/vnd.stepmania.stepchart": { - "source": "iana", - "extensions": ["sm"] - }, - "application/vnd.street-stream": { - "source": "iana" - }, - "application/vnd.sun.wadl+xml": { - "source": "iana", - "compressible": true, - "extensions": ["wadl"] - }, - "application/vnd.sun.xml.calc": { - "source": "apache", - "extensions": ["sxc"] - }, - "application/vnd.sun.xml.calc.template": { - "source": "apache", - "extensions": ["stc"] - }, - "application/vnd.sun.xml.draw": { - "source": "apache", - "extensions": ["sxd"] - }, - "application/vnd.sun.xml.draw.template": { - "source": "apache", - "extensions": ["std"] - }, - "application/vnd.sun.xml.impress": { - "source": "apache", - "extensions": ["sxi"] - }, - "application/vnd.sun.xml.impress.template": { - "source": "apache", - "extensions": ["sti"] - }, - "application/vnd.sun.xml.math": { - "source": "apache", - "extensions": ["sxm"] - }, - "application/vnd.sun.xml.writer": { - "source": "apache", - "extensions": ["sxw"] - }, - "application/vnd.sun.xml.writer.global": { - "source": "apache", - "extensions": ["sxg"] - }, - "application/vnd.sun.xml.writer.template": { - "source": "apache", - "extensions": ["stw"] - }, - "application/vnd.sus-calendar": { - "source": "iana", - "extensions": ["sus","susp"] - }, - "application/vnd.svd": { - "source": "iana", - "extensions": ["svd"] - }, - "application/vnd.swiftview-ics": { - "source": "iana" - }, - "application/vnd.symbian.install": { - "source": "apache", - "extensions": ["sis","sisx"] - }, - "application/vnd.syncml+xml": { - "source": "iana", - "extensions": ["xsm"] - }, - "application/vnd.syncml.dm+wbxml": { - "source": "iana", - "extensions": ["bdm"] - }, - "application/vnd.syncml.dm+xml": { - "source": "iana", - "extensions": ["xdm"] - }, - "application/vnd.syncml.dm.notification": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmddf+xml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+wbxml": { - "source": "iana" - }, - "application/vnd.syncml.dmtnds+xml": { - "source": "iana" - }, - "application/vnd.syncml.ds.notification": { - "source": "iana" - }, - "application/vnd.tableschema+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.tao.intent-module-archive": { - "source": "iana", - "extensions": ["tao"] - }, - "application/vnd.tcpdump.pcap": { - "source": "iana", - "extensions": ["pcap","cap","dmp"] - }, - "application/vnd.tmd.mediaflex.api+xml": { - "source": "iana" - }, - "application/vnd.tml": { - "source": "iana" - }, - "application/vnd.tmobile-livetv": { - "source": "iana", - "extensions": ["tmo"] - }, - "application/vnd.tri.onesource": { - "source": "iana" - }, - "application/vnd.trid.tpt": { - "source": "iana", - "extensions": ["tpt"] - }, - "application/vnd.triscape.mxs": { - "source": "iana", - "extensions": ["mxs"] - }, - "application/vnd.trueapp": { - "source": "iana", - "extensions": ["tra"] - }, - "application/vnd.truedoc": { - "source": "iana" - }, - "application/vnd.ubisoft.webplayer": { - "source": "iana" - }, - "application/vnd.ufdl": { - "source": "iana", - "extensions": ["ufd","ufdl"] - }, - "application/vnd.uiq.theme": { - "source": "iana", - "extensions": ["utz"] - }, - "application/vnd.umajin": { - "source": "iana", - "extensions": ["umj"] - }, - "application/vnd.unity": { - "source": "iana", - "extensions": ["unityweb"] - }, - "application/vnd.uoml+xml": { - "source": "iana", - "extensions": ["uoml"] - }, - "application/vnd.uplanet.alert": { - "source": "iana" - }, - "application/vnd.uplanet.alert-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice": { - "source": "iana" - }, - "application/vnd.uplanet.bearer-choice-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop": { - "source": "iana" - }, - "application/vnd.uplanet.cacheop-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.channel": { - "source": "iana" - }, - "application/vnd.uplanet.channel-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.list": { - "source": "iana" - }, - "application/vnd.uplanet.list-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd": { - "source": "iana" - }, - "application/vnd.uplanet.listcmd-wbxml": { - "source": "iana" - }, - "application/vnd.uplanet.signal": { - "source": "iana" - }, - "application/vnd.uri-map": { - "source": "iana" - }, - "application/vnd.valve.source.material": { - "source": "iana" - }, - "application/vnd.vcx": { - "source": "iana", - "extensions": ["vcx"] - }, - "application/vnd.vd-study": { - "source": "iana" - }, - "application/vnd.vectorworks": { - "source": "iana" - }, - "application/vnd.vel+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.verimatrix.vcas": { - "source": "iana" - }, - "application/vnd.vidsoft.vidconference": { - "source": "iana" - }, - "application/vnd.visio": { - "source": "iana", - "extensions": ["vsd","vst","vss","vsw"] - }, - "application/vnd.visionary": { - "source": "iana", - "extensions": ["vis"] - }, - "application/vnd.vividence.scriptfile": { - "source": "iana" - }, - "application/vnd.vsf": { - "source": "iana", - "extensions": ["vsf"] - }, - "application/vnd.wap.sic": { - "source": "iana" - }, - "application/vnd.wap.slc": { - "source": "iana" - }, - "application/vnd.wap.wbxml": { - "source": "iana", - "extensions": ["wbxml"] - }, - "application/vnd.wap.wmlc": { - "source": "iana", - "extensions": ["wmlc"] - }, - "application/vnd.wap.wmlscriptc": { - "source": "iana", - "extensions": ["wmlsc"] - }, - "application/vnd.webturbo": { - "source": "iana", - "extensions": ["wtb"] - }, - "application/vnd.wfa.p2p": { - "source": "iana" - }, - "application/vnd.wfa.wsc": { - "source": "iana" - }, - "application/vnd.windows.devicepairing": { - "source": "iana" - }, - "application/vnd.wmc": { - "source": "iana" - }, - "application/vnd.wmf.bootstrap": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica": { - "source": "iana" - }, - "application/vnd.wolfram.mathematica.package": { - "source": "iana" - }, - "application/vnd.wolfram.player": { - "source": "iana", - "extensions": ["nbp"] - }, - "application/vnd.wordperfect": { - "source": "iana", - "extensions": ["wpd"] - }, - "application/vnd.wqd": { - "source": "iana", - "extensions": ["wqd"] - }, - "application/vnd.wrq-hp3000-labelled": { - "source": "iana" - }, - "application/vnd.wt.stf": { - "source": "iana", - "extensions": ["stf"] - }, - "application/vnd.wv.csp+wbxml": { - "source": "iana" - }, - "application/vnd.wv.csp+xml": { - "source": "iana" - }, - "application/vnd.wv.ssp+xml": { - "source": "iana" - }, - "application/vnd.xacml+json": { - "source": "iana", - "compressible": true - }, - "application/vnd.xara": { - "source": "iana", - "extensions": ["xar"] - }, - "application/vnd.xfdl": { - "source": "iana", - "extensions": ["xfdl"] - }, - "application/vnd.xfdl.webform": { - "source": "iana" - }, - "application/vnd.xmi+xml": { - "source": "iana" - }, - "application/vnd.xmpie.cpkg": { - "source": "iana" - }, - "application/vnd.xmpie.dpkg": { - "source": "iana" - }, - "application/vnd.xmpie.plan": { - "source": "iana" - }, - "application/vnd.xmpie.ppkg": { - "source": "iana" - }, - "application/vnd.xmpie.xlim": { - "source": "iana" - }, - "application/vnd.yamaha.hv-dic": { - "source": "iana", - "extensions": ["hvd"] - }, - "application/vnd.yamaha.hv-script": { - "source": "iana", - "extensions": ["hvs"] - }, - "application/vnd.yamaha.hv-voice": { - "source": "iana", - "extensions": ["hvp"] - }, - "application/vnd.yamaha.openscoreformat": { - "source": "iana", - "extensions": ["osf"] - }, - "application/vnd.yamaha.openscoreformat.osfpvg+xml": { - "source": "iana", - "extensions": ["osfpvg"] - }, - "application/vnd.yamaha.remote-setup": { - "source": "iana" - }, - "application/vnd.yamaha.smaf-audio": { - "source": "iana", - "extensions": ["saf"] - }, - "application/vnd.yamaha.smaf-phrase": { - "source": "iana", - "extensions": ["spf"] - }, - "application/vnd.yamaha.through-ngn": { - "source": "iana" - }, - "application/vnd.yamaha.tunnel-udpencap": { - "source": "iana" - }, - "application/vnd.yaoweme": { - "source": "iana" - }, - "application/vnd.yellowriver-custom-menu": { - "source": "iana", - "extensions": ["cmp"] - }, - "application/vnd.zul": { - "source": "iana", - "extensions": ["zir","zirz"] - }, - "application/vnd.zzazz.deck+xml": { - "source": "iana", - "extensions": ["zaz"] - }, - "application/voicexml+xml": { - "source": "iana", - "extensions": ["vxml"] - }, - "application/vq-rtcpxr": { - "source": "iana" - }, - "application/wasm": { - "compressible": true, - "extensions": ["wasm"] - }, - "application/watcherinfo+xml": { - "source": "iana" - }, - "application/webpush-options+json": { - "source": "iana", - "compressible": true - }, - "application/whoispp-query": { - "source": "iana" - }, - "application/whoispp-response": { - "source": "iana" - }, - "application/widget": { - "source": "iana", - "extensions": ["wgt"] - }, - "application/winhlp": { - "source": "apache", - "extensions": ["hlp"] - }, - "application/wita": { - "source": "iana" - }, - "application/wordperfect5.1": { - "source": "iana" - }, - "application/wsdl+xml": { - "source": "iana", - "extensions": ["wsdl"] - }, - "application/wspolicy+xml": { - "source": "iana", - "extensions": ["wspolicy"] - }, - "application/x-7z-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["7z"] - }, - "application/x-abiword": { - "source": "apache", - "extensions": ["abw"] - }, - "application/x-ace-compressed": { - "source": "apache", - "extensions": ["ace"] - }, - "application/x-amf": { - "source": "apache" - }, - "application/x-apple-diskimage": { - "source": "apache", - "extensions": ["dmg"] - }, - "application/x-arj": { - "compressible": false, - "extensions": ["arj"] - }, - "application/x-authorware-bin": { - "source": "apache", - "extensions": ["aab","x32","u32","vox"] - }, - "application/x-authorware-map": { - "source": "apache", - "extensions": ["aam"] - }, - "application/x-authorware-seg": { - "source": "apache", - "extensions": ["aas"] - }, - "application/x-bcpio": { - "source": "apache", - "extensions": ["bcpio"] - }, - "application/x-bdoc": { - "compressible": false, - "extensions": ["bdoc"] - }, - "application/x-bittorrent": { - "source": "apache", - "extensions": ["torrent"] - }, - "application/x-blorb": { - "source": "apache", - "extensions": ["blb","blorb"] - }, - "application/x-bzip": { - "source": "apache", - "compressible": false, - "extensions": ["bz"] - }, - "application/x-bzip2": { - "source": "apache", - "compressible": false, - "extensions": ["bz2","boz"] - }, - "application/x-cbr": { - "source": "apache", - "extensions": ["cbr","cba","cbt","cbz","cb7"] - }, - "application/x-cdlink": { - "source": "apache", - "extensions": ["vcd"] - }, - "application/x-cfs-compressed": { - "source": "apache", - "extensions": ["cfs"] - }, - "application/x-chat": { - "source": "apache", - "extensions": ["chat"] - }, - "application/x-chess-pgn": { - "source": "apache", - "extensions": ["pgn"] - }, - "application/x-chrome-extension": { - "extensions": ["crx"] - }, - "application/x-cocoa": { - "source": "nginx", - "extensions": ["cco"] - }, - "application/x-compress": { - "source": "apache" - }, - "application/x-conference": { - "source": "apache", - "extensions": ["nsc"] - }, - "application/x-cpio": { - "source": "apache", - "extensions": ["cpio"] - }, - "application/x-csh": { - "source": "apache", - "extensions": ["csh"] - }, - "application/x-deb": { - "compressible": false - }, - "application/x-debian-package": { - "source": "apache", - "extensions": ["deb","udeb"] - }, - "application/x-dgc-compressed": { - "source": "apache", - "extensions": ["dgc"] - }, - "application/x-director": { - "source": "apache", - "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"] - }, - "application/x-doom": { - "source": "apache", - "extensions": ["wad"] - }, - "application/x-dtbncx+xml": { - "source": "apache", - "extensions": ["ncx"] - }, - "application/x-dtbook+xml": { - "source": "apache", - "extensions": ["dtb"] - }, - "application/x-dtbresource+xml": { - "source": "apache", - "extensions": ["res"] - }, - "application/x-dvi": { - "source": "apache", - "compressible": false, - "extensions": ["dvi"] - }, - "application/x-envoy": { - "source": "apache", - "extensions": ["evy"] - }, - "application/x-eva": { - "source": "apache", - "extensions": ["eva"] - }, - "application/x-font-bdf": { - "source": "apache", - "extensions": ["bdf"] - }, - "application/x-font-dos": { - "source": "apache" - }, - "application/x-font-framemaker": { - "source": "apache" - }, - "application/x-font-ghostscript": { - "source": "apache", - "extensions": ["gsf"] - }, - "application/x-font-libgrx": { - "source": "apache" - }, - "application/x-font-linux-psf": { - "source": "apache", - "extensions": ["psf"] - }, - "application/x-font-pcf": { - "source": "apache", - "extensions": ["pcf"] - }, - "application/x-font-snf": { - "source": "apache", - "extensions": ["snf"] - }, - "application/x-font-speedo": { - "source": "apache" - }, - "application/x-font-sunos-news": { - "source": "apache" - }, - "application/x-font-type1": { - "source": "apache", - "extensions": ["pfa","pfb","pfm","afm"] - }, - "application/x-font-vfont": { - "source": "apache" - }, - "application/x-freearc": { - "source": "apache", - "extensions": ["arc"] - }, - "application/x-futuresplash": { - "source": "apache", - "extensions": ["spl"] - }, - "application/x-gca-compressed": { - "source": "apache", - "extensions": ["gca"] - }, - "application/x-glulx": { - "source": "apache", - "extensions": ["ulx"] - }, - "application/x-gnumeric": { - "source": "apache", - "extensions": ["gnumeric"] - }, - "application/x-gramps-xml": { - "source": "apache", - "extensions": ["gramps"] - }, - "application/x-gtar": { - "source": "apache", - "extensions": ["gtar"] - }, - "application/x-gzip": { - "source": "apache" - }, - "application/x-hdf": { - "source": "apache", - "extensions": ["hdf"] - }, - "application/x-httpd-php": { - "compressible": true, - "extensions": ["php"] - }, - "application/x-install-instructions": { - "source": "apache", - "extensions": ["install"] - }, - "application/x-iso9660-image": { - "source": "apache", - "extensions": ["iso"] - }, - "application/x-java-archive-diff": { - "source": "nginx", - "extensions": ["jardiff"] - }, - "application/x-java-jnlp-file": { - "source": "apache", - "compressible": false, - "extensions": ["jnlp"] - }, - "application/x-javascript": { - "compressible": true - }, - "application/x-latex": { - "source": "apache", - "compressible": false, - "extensions": ["latex"] - }, - "application/x-lua-bytecode": { - "extensions": ["luac"] - }, - "application/x-lzh-compressed": { - "source": "apache", - "extensions": ["lzh","lha"] - }, - "application/x-makeself": { - "source": "nginx", - "extensions": ["run"] - }, - "application/x-mie": { - "source": "apache", - "extensions": ["mie"] - }, - "application/x-mobipocket-ebook": { - "source": "apache", - "extensions": ["prc","mobi"] - }, - "application/x-mpegurl": { - "compressible": false - }, - "application/x-ms-application": { - "source": "apache", - "extensions": ["application"] - }, - "application/x-ms-shortcut": { - "source": "apache", - "extensions": ["lnk"] - }, - "application/x-ms-wmd": { - "source": "apache", - "extensions": ["wmd"] - }, - "application/x-ms-wmz": { - "source": "apache", - "extensions": ["wmz"] - }, - "application/x-ms-xbap": { - "source": "apache", - "extensions": ["xbap"] - }, - "application/x-msaccess": { - "source": "apache", - "extensions": ["mdb"] - }, - "application/x-msbinder": { - "source": "apache", - "extensions": ["obd"] - }, - "application/x-mscardfile": { - "source": "apache", - "extensions": ["crd"] - }, - "application/x-msclip": { - "source": "apache", - "extensions": ["clp"] - }, - "application/x-msdos-program": { - "extensions": ["exe"] - }, - "application/x-msdownload": { - "source": "apache", - "extensions": ["exe","dll","com","bat","msi"] - }, - "application/x-msmediaview": { - "source": "apache", - "extensions": ["mvb","m13","m14"] - }, - "application/x-msmetafile": { - "source": "apache", - "extensions": ["wmf","wmz","emf","emz"] - }, - "application/x-msmoney": { - "source": "apache", - "extensions": ["mny"] - }, - "application/x-mspublisher": { - "source": "apache", - "extensions": ["pub"] - }, - "application/x-msschedule": { - "source": "apache", - "extensions": ["scd"] - }, - "application/x-msterminal": { - "source": "apache", - "extensions": ["trm"] - }, - "application/x-mswrite": { - "source": "apache", - "extensions": ["wri"] - }, - "application/x-netcdf": { - "source": "apache", - "extensions": ["nc","cdf"] - }, - "application/x-ns-proxy-autoconfig": { - "compressible": true, - "extensions": ["pac"] - }, - "application/x-nzb": { - "source": "apache", - "extensions": ["nzb"] - }, - "application/x-perl": { - "source": "nginx", - "extensions": ["pl","pm"] - }, - "application/x-pilot": { - "source": "nginx", - "extensions": ["prc","pdb"] - }, - "application/x-pkcs12": { - "source": "apache", - "compressible": false, - "extensions": ["p12","pfx"] - }, - "application/x-pkcs7-certificates": { - "source": "apache", - "extensions": ["p7b","spc"] - }, - "application/x-pkcs7-certreqresp": { - "source": "apache", - "extensions": ["p7r"] - }, - "application/x-rar-compressed": { - "source": "apache", - "compressible": false, - "extensions": ["rar"] - }, - "application/x-redhat-package-manager": { - "source": "nginx", - "extensions": ["rpm"] - }, - "application/x-research-info-systems": { - "source": "apache", - "extensions": ["ris"] - }, - "application/x-sea": { - "source": "nginx", - "extensions": ["sea"] - }, - "application/x-sh": { - "source": "apache", - "compressible": true, - "extensions": ["sh"] - }, - "application/x-shar": { - "source": "apache", - "extensions": ["shar"] - }, - "application/x-shockwave-flash": { - "source": "apache", - "compressible": false, - "extensions": ["swf"] - }, - "application/x-silverlight-app": { - "source": "apache", - "extensions": ["xap"] - }, - "application/x-sql": { - "source": "apache", - "extensions": ["sql"] - }, - "application/x-stuffit": { - "source": "apache", - "compressible": false, - "extensions": ["sit"] - }, - "application/x-stuffitx": { - "source": "apache", - "extensions": ["sitx"] - }, - "application/x-subrip": { - "source": "apache", - "extensions": ["srt"] - }, - "application/x-sv4cpio": { - "source": "apache", - "extensions": ["sv4cpio"] - }, - "application/x-sv4crc": { - "source": "apache", - "extensions": ["sv4crc"] - }, - "application/x-t3vm-image": { - "source": "apache", - "extensions": ["t3"] - }, - "application/x-tads": { - "source": "apache", - "extensions": ["gam"] - }, - "application/x-tar": { - "source": "apache", - "compressible": true, - "extensions": ["tar"] - }, - "application/x-tcl": { - "source": "apache", - "extensions": ["tcl","tk"] - }, - "application/x-tex": { - "source": "apache", - "extensions": ["tex"] - }, - "application/x-tex-tfm": { - "source": "apache", - "extensions": ["tfm"] - }, - "application/x-texinfo": { - "source": "apache", - "extensions": ["texinfo","texi"] - }, - "application/x-tgif": { - "source": "apache", - "extensions": ["obj"] - }, - "application/x-ustar": { - "source": "apache", - "extensions": ["ustar"] - }, - "application/x-virtualbox-hdd": { - "compressible": true, - "extensions": ["hdd"] - }, - "application/x-virtualbox-ova": { - "compressible": true, - "extensions": ["ova"] - }, - "application/x-virtualbox-ovf": { - "compressible": true, - "extensions": ["ovf"] - }, - "application/x-virtualbox-vbox": { - "compressible": true, - "extensions": ["vbox"] - }, - "application/x-virtualbox-vbox-extpack": { - "compressible": false, - "extensions": ["vbox-extpack"] - }, - "application/x-virtualbox-vdi": { - "compressible": true, - "extensions": ["vdi"] - }, - "application/x-virtualbox-vhd": { - "compressible": true, - "extensions": ["vhd"] - }, - "application/x-virtualbox-vmdk": { - "compressible": true, - "extensions": ["vmdk"] - }, - "application/x-wais-source": { - "source": "apache", - "extensions": ["src"] - }, - "application/x-web-app-manifest+json": { - "compressible": true, - "extensions": ["webapp"] - }, - "application/x-www-form-urlencoded": { - "source": "iana", - "compressible": true - }, - "application/x-x509-ca-cert": { - "source": "apache", - "extensions": ["der","crt","pem"] - }, - "application/x-xfig": { - "source": "apache", - "extensions": ["fig"] - }, - "application/x-xliff+xml": { - "source": "apache", - "extensions": ["xlf"] - }, - "application/x-xpinstall": { - "source": "apache", - "compressible": false, - "extensions": ["xpi"] - }, - "application/x-xz": { - "source": "apache", - "extensions": ["xz"] - }, - "application/x-zmachine": { - "source": "apache", - "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"] - }, - "application/x400-bp": { - "source": "iana" - }, - "application/xacml+xml": { - "source": "iana" - }, - "application/xaml+xml": { - "source": "apache", - "extensions": ["xaml"] - }, - "application/xcap-att+xml": { - "source": "iana" - }, - "application/xcap-caps+xml": { - "source": "iana" - }, - "application/xcap-diff+xml": { - "source": "iana", - "extensions": ["xdf"] - }, - "application/xcap-el+xml": { - "source": "iana" - }, - "application/xcap-error+xml": { - "source": "iana" - }, - "application/xcap-ns+xml": { - "source": "iana" - }, - "application/xcon-conference-info+xml": { - "source": "iana" - }, - "application/xcon-conference-info-diff+xml": { - "source": "iana" - }, - "application/xenc+xml": { - "source": "iana", - "extensions": ["xenc"] - }, - "application/xhtml+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xhtml","xht"] - }, - "application/xhtml-voice+xml": { - "source": "apache" - }, - "application/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml","xsl","xsd","rng"] - }, - "application/xml-dtd": { - "source": "iana", - "compressible": true, - "extensions": ["dtd"] - }, - "application/xml-external-parsed-entity": { - "source": "iana" - }, - "application/xml-patch+xml": { - "source": "iana" - }, - "application/xmpp+xml": { - "source": "iana" - }, - "application/xop+xml": { - "source": "iana", - "compressible": true, - "extensions": ["xop"] - }, - "application/xproc+xml": { - "source": "apache", - "extensions": ["xpl"] - }, - "application/xslt+xml": { - "source": "iana", - "extensions": ["xslt"] - }, - "application/xspf+xml": { - "source": "apache", - "extensions": ["xspf"] - }, - "application/xv+xml": { - "source": "iana", - "extensions": ["mxml","xhvml","xvml","xvm"] - }, - "application/yang": { - "source": "iana", - "extensions": ["yang"] - }, - "application/yang-data+json": { - "source": "iana", - "compressible": true - }, - "application/yang-data+xml": { - "source": "iana" - }, - "application/yang-patch+json": { - "source": "iana", - "compressible": true - }, - "application/yang-patch+xml": { - "source": "iana" - }, - "application/yin+xml": { - "source": "iana", - "extensions": ["yin"] - }, - "application/zip": { - "source": "iana", - "compressible": false, - "extensions": ["zip"] - }, - "application/zlib": { - "source": "iana" - }, - "audio/1d-interleaved-parityfec": { - "source": "iana" - }, - "audio/32kadpcm": { - "source": "iana" - }, - "audio/3gpp": { - "source": "iana", - "compressible": false, - "extensions": ["3gpp"] - }, - "audio/3gpp2": { - "source": "iana" - }, - "audio/ac3": { - "source": "iana" - }, - "audio/adpcm": { - "source": "apache", - "extensions": ["adp"] - }, - "audio/amr": { - "source": "iana" - }, - "audio/amr-wb": { - "source": "iana" - }, - "audio/amr-wb+": { - "source": "iana" - }, - "audio/aptx": { - "source": "iana" - }, - "audio/asc": { - "source": "iana" - }, - "audio/atrac-advanced-lossless": { - "source": "iana" - }, - "audio/atrac-x": { - "source": "iana" - }, - "audio/atrac3": { - "source": "iana" - }, - "audio/basic": { - "source": "iana", - "compressible": false, - "extensions": ["au","snd"] - }, - "audio/bv16": { - "source": "iana" - }, - "audio/bv32": { - "source": "iana" - }, - "audio/clearmode": { - "source": "iana" - }, - "audio/cn": { - "source": "iana" - }, - "audio/dat12": { - "source": "iana" - }, - "audio/dls": { - "source": "iana" - }, - "audio/dsr-es201108": { - "source": "iana" - }, - "audio/dsr-es202050": { - "source": "iana" - }, - "audio/dsr-es202211": { - "source": "iana" - }, - "audio/dsr-es202212": { - "source": "iana" - }, - "audio/dv": { - "source": "iana" - }, - "audio/dvi4": { - "source": "iana" - }, - "audio/eac3": { - "source": "iana" - }, - "audio/encaprtp": { - "source": "iana" - }, - "audio/evrc": { - "source": "iana" - }, - "audio/evrc-qcp": { - "source": "iana" - }, - "audio/evrc0": { - "source": "iana" - }, - "audio/evrc1": { - "source": "iana" - }, - "audio/evrcb": { - "source": "iana" - }, - "audio/evrcb0": { - "source": "iana" - }, - "audio/evrcb1": { - "source": "iana" - }, - "audio/evrcnw": { - "source": "iana" - }, - "audio/evrcnw0": { - "source": "iana" - }, - "audio/evrcnw1": { - "source": "iana" - }, - "audio/evrcwb": { - "source": "iana" - }, - "audio/evrcwb0": { - "source": "iana" - }, - "audio/evrcwb1": { - "source": "iana" - }, - "audio/evs": { - "source": "iana" - }, - "audio/fwdred": { - "source": "iana" - }, - "audio/g711-0": { - "source": "iana" - }, - "audio/g719": { - "source": "iana" - }, - "audio/g722": { - "source": "iana" - }, - "audio/g7221": { - "source": "iana" - }, - "audio/g723": { - "source": "iana" - }, - "audio/g726-16": { - "source": "iana" - }, - "audio/g726-24": { - "source": "iana" - }, - "audio/g726-32": { - "source": "iana" - }, - "audio/g726-40": { - "source": "iana" - }, - "audio/g728": { - "source": "iana" - }, - "audio/g729": { - "source": "iana" - }, - "audio/g7291": { - "source": "iana" - }, - "audio/g729d": { - "source": "iana" - }, - "audio/g729e": { - "source": "iana" - }, - "audio/gsm": { - "source": "iana" - }, - "audio/gsm-efr": { - "source": "iana" - }, - "audio/gsm-hr-08": { - "source": "iana" - }, - "audio/ilbc": { - "source": "iana" - }, - "audio/ip-mr_v2.5": { - "source": "iana" - }, - "audio/isac": { - "source": "apache" - }, - "audio/l16": { - "source": "iana" - }, - "audio/l20": { - "source": "iana" - }, - "audio/l24": { - "source": "iana", - "compressible": false - }, - "audio/l8": { - "source": "iana" - }, - "audio/lpc": { - "source": "iana" - }, - "audio/melp": { - "source": "iana" - }, - "audio/melp1200": { - "source": "iana" - }, - "audio/melp2400": { - "source": "iana" - }, - "audio/melp600": { - "source": "iana" - }, - "audio/midi": { - "source": "apache", - "extensions": ["mid","midi","kar","rmi"] - }, - "audio/mobile-xmf": { - "source": "iana" - }, - "audio/mp3": { - "compressible": false, - "extensions": ["mp3"] - }, - "audio/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["m4a","mp4a"] - }, - "audio/mp4a-latm": { - "source": "iana" - }, - "audio/mpa": { - "source": "iana" - }, - "audio/mpa-robust": { - "source": "iana" - }, - "audio/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"] - }, - "audio/mpeg4-generic": { - "source": "iana" - }, - "audio/musepack": { - "source": "apache" - }, - "audio/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["oga","ogg","spx"] - }, - "audio/opus": { - "source": "iana" - }, - "audio/parityfec": { - "source": "iana" - }, - "audio/pcma": { - "source": "iana" - }, - "audio/pcma-wb": { - "source": "iana" - }, - "audio/pcmu": { - "source": "iana" - }, - "audio/pcmu-wb": { - "source": "iana" - }, - "audio/prs.sid": { - "source": "iana" - }, - "audio/qcelp": { - "source": "iana" - }, - "audio/raptorfec": { - "source": "iana" - }, - "audio/red": { - "source": "iana" - }, - "audio/rtp-enc-aescm128": { - "source": "iana" - }, - "audio/rtp-midi": { - "source": "iana" - }, - "audio/rtploopback": { - "source": "iana" - }, - "audio/rtx": { - "source": "iana" - }, - "audio/s3m": { - "source": "apache", - "extensions": ["s3m"] - }, - "audio/silk": { - "source": "apache", - "extensions": ["sil"] - }, - "audio/smv": { - "source": "iana" - }, - "audio/smv-qcp": { - "source": "iana" - }, - "audio/smv0": { - "source": "iana" - }, - "audio/sp-midi": { - "source": "iana" - }, - "audio/speex": { - "source": "iana" - }, - "audio/t140c": { - "source": "iana" - }, - "audio/t38": { - "source": "iana" - }, - "audio/telephone-event": { - "source": "iana" - }, - "audio/tone": { - "source": "iana" - }, - "audio/uemclip": { - "source": "iana" - }, - "audio/ulpfec": { - "source": "iana" - }, - "audio/vdvi": { - "source": "iana" - }, - "audio/vmr-wb": { - "source": "iana" - }, - "audio/vnd.3gpp.iufp": { - "source": "iana" - }, - "audio/vnd.4sb": { - "source": "iana" - }, - "audio/vnd.audiokoz": { - "source": "iana" - }, - "audio/vnd.celp": { - "source": "iana" - }, - "audio/vnd.cisco.nse": { - "source": "iana" - }, - "audio/vnd.cmles.radio-events": { - "source": "iana" - }, - "audio/vnd.cns.anp1": { - "source": "iana" - }, - "audio/vnd.cns.inf1": { - "source": "iana" - }, - "audio/vnd.dece.audio": { - "source": "iana", - "extensions": ["uva","uvva"] - }, - "audio/vnd.digital-winds": { - "source": "iana", - "extensions": ["eol"] - }, - "audio/vnd.dlna.adts": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.1": { - "source": "iana" - }, - "audio/vnd.dolby.heaac.2": { - "source": "iana" - }, - "audio/vnd.dolby.mlp": { - "source": "iana" - }, - "audio/vnd.dolby.mps": { - "source": "iana" - }, - "audio/vnd.dolby.pl2": { - "source": "iana" - }, - "audio/vnd.dolby.pl2x": { - "source": "iana" - }, - "audio/vnd.dolby.pl2z": { - "source": "iana" - }, - "audio/vnd.dolby.pulse.1": { - "source": "iana" - }, - "audio/vnd.dra": { - "source": "iana", - "extensions": ["dra"] - }, - "audio/vnd.dts": { - "source": "iana", - "extensions": ["dts"] - }, - "audio/vnd.dts.hd": { - "source": "iana", - "extensions": ["dtshd"] - }, - "audio/vnd.dvb.file": { - "source": "iana" - }, - "audio/vnd.everad.plj": { - "source": "iana" - }, - "audio/vnd.hns.audio": { - "source": "iana" - }, - "audio/vnd.lucent.voice": { - "source": "iana", - "extensions": ["lvp"] - }, - "audio/vnd.ms-playready.media.pya": { - "source": "iana", - "extensions": ["pya"] - }, - "audio/vnd.nokia.mobile-xmf": { - "source": "iana" - }, - "audio/vnd.nortel.vbk": { - "source": "iana" - }, - "audio/vnd.nuera.ecelp4800": { - "source": "iana", - "extensions": ["ecelp4800"] - }, - "audio/vnd.nuera.ecelp7470": { - "source": "iana", - "extensions": ["ecelp7470"] - }, - "audio/vnd.nuera.ecelp9600": { - "source": "iana", - "extensions": ["ecelp9600"] - }, - "audio/vnd.octel.sbc": { - "source": "iana" - }, - "audio/vnd.presonus.multitrack": { - "source": "iana" - }, - "audio/vnd.qcelp": { - "source": "iana" - }, - "audio/vnd.rhetorex.32kadpcm": { - "source": "iana" - }, - "audio/vnd.rip": { - "source": "iana", - "extensions": ["rip"] - }, - "audio/vnd.rn-realaudio": { - "compressible": false - }, - "audio/vnd.sealedmedia.softseal.mpeg": { - "source": "iana" - }, - "audio/vnd.vmx.cvsd": { - "source": "iana" - }, - "audio/vnd.wave": { - "compressible": false - }, - "audio/vorbis": { - "source": "iana", - "compressible": false - }, - "audio/vorbis-config": { - "source": "iana" - }, - "audio/wav": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/wave": { - "compressible": false, - "extensions": ["wav"] - }, - "audio/webm": { - "source": "apache", - "compressible": false, - "extensions": ["weba"] - }, - "audio/x-aac": { - "source": "apache", - "compressible": false, - "extensions": ["aac"] - }, - "audio/x-aiff": { - "source": "apache", - "extensions": ["aif","aiff","aifc"] - }, - "audio/x-caf": { - "source": "apache", - "compressible": false, - "extensions": ["caf"] - }, - "audio/x-flac": { - "source": "apache", - "extensions": ["flac"] - }, - "audio/x-m4a": { - "source": "nginx", - "extensions": ["m4a"] - }, - "audio/x-matroska": { - "source": "apache", - "extensions": ["mka"] - }, - "audio/x-mpegurl": { - "source": "apache", - "extensions": ["m3u"] - }, - "audio/x-ms-wax": { - "source": "apache", - "extensions": ["wax"] - }, - "audio/x-ms-wma": { - "source": "apache", - "extensions": ["wma"] - }, - "audio/x-pn-realaudio": { - "source": "apache", - "extensions": ["ram","ra"] - }, - "audio/x-pn-realaudio-plugin": { - "source": "apache", - "extensions": ["rmp"] - }, - "audio/x-realaudio": { - "source": "nginx", - "extensions": ["ra"] - }, - "audio/x-tta": { - "source": "apache" - }, - "audio/x-wav": { - "source": "apache", - "extensions": ["wav"] - }, - "audio/xm": { - "source": "apache", - "extensions": ["xm"] - }, - "chemical/x-cdx": { - "source": "apache", - "extensions": ["cdx"] - }, - "chemical/x-cif": { - "source": "apache", - "extensions": ["cif"] - }, - "chemical/x-cmdf": { - "source": "apache", - "extensions": ["cmdf"] - }, - "chemical/x-cml": { - "source": "apache", - "extensions": ["cml"] - }, - "chemical/x-csml": { - "source": "apache", - "extensions": ["csml"] - }, - "chemical/x-pdb": { - "source": "apache" - }, - "chemical/x-xyz": { - "source": "apache", - "extensions": ["xyz"] - }, - "font/collection": { - "source": "iana", - "extensions": ["ttc"] - }, - "font/otf": { - "source": "iana", - "compressible": true, - "extensions": ["otf"] - }, - "font/sfnt": { - "source": "iana" - }, - "font/ttf": { - "source": "iana", - "extensions": ["ttf"] - }, - "font/woff": { - "source": "iana", - "extensions": ["woff"] - }, - "font/woff2": { - "source": "iana", - "extensions": ["woff2"] - }, - "image/apng": { - "compressible": false, - "extensions": ["apng"] - }, - "image/bmp": { - "source": "iana", - "compressible": true, - "extensions": ["bmp"] - }, - "image/cgm": { - "source": "iana", - "extensions": ["cgm"] - }, - "image/dicom-rle": { - "source": "iana" - }, - "image/emf": { - "source": "iana" - }, - "image/fits": { - "source": "iana" - }, - "image/g3fax": { - "source": "iana", - "extensions": ["g3"] - }, - "image/gif": { - "source": "iana", - "compressible": false, - "extensions": ["gif"] - }, - "image/ief": { - "source": "iana", - "extensions": ["ief"] - }, - "image/jls": { - "source": "iana" - }, - "image/jp2": { - "source": "iana", - "compressible": false, - "extensions": ["jp2","jpg2"] - }, - "image/jpeg": { - "source": "iana", - "compressible": false, - "extensions": ["jpeg","jpg","jpe"] - }, - "image/jpm": { - "source": "iana", - "compressible": false, - "extensions": ["jpm"] - }, - "image/jpx": { - "source": "iana", - "compressible": false, - "extensions": ["jpx","jpf"] - }, - "image/ktx": { - "source": "iana", - "extensions": ["ktx"] - }, - "image/naplps": { - "source": "iana" - }, - "image/pjpeg": { - "compressible": false - }, - "image/png": { - "source": "iana", - "compressible": false, - "extensions": ["png"] - }, - "image/prs.btif": { - "source": "iana", - "extensions": ["btif"] - }, - "image/prs.pti": { - "source": "iana" - }, - "image/pwg-raster": { - "source": "iana" - }, - "image/sgi": { - "source": "apache", - "extensions": ["sgi"] - }, - "image/svg+xml": { - "source": "iana", - "compressible": true, - "extensions": ["svg","svgz"] - }, - "image/t38": { - "source": "iana" - }, - "image/tiff": { - "source": "iana", - "compressible": false, - "extensions": ["tiff","tif"] - }, - "image/tiff-fx": { - "source": "iana" - }, - "image/vnd.adobe.photoshop": { - "source": "iana", - "compressible": true, - "extensions": ["psd"] - }, - "image/vnd.airzip.accelerator.azv": { - "source": "iana" - }, - "image/vnd.cns.inf2": { - "source": "iana" - }, - "image/vnd.dece.graphic": { - "source": "iana", - "extensions": ["uvi","uvvi","uvg","uvvg"] - }, - "image/vnd.djvu": { - "source": "iana", - "extensions": ["djvu","djv"] - }, - "image/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "image/vnd.dwg": { - "source": "iana", - "extensions": ["dwg"] - }, - "image/vnd.dxf": { - "source": "iana", - "extensions": ["dxf"] - }, - "image/vnd.fastbidsheet": { - "source": "iana", - "extensions": ["fbs"] - }, - "image/vnd.fpx": { - "source": "iana", - "extensions": ["fpx"] - }, - "image/vnd.fst": { - "source": "iana", - "extensions": ["fst"] - }, - "image/vnd.fujixerox.edmics-mmr": { - "source": "iana", - "extensions": ["mmr"] - }, - "image/vnd.fujixerox.edmics-rlc": { - "source": "iana", - "extensions": ["rlc"] - }, - "image/vnd.globalgraphics.pgb": { - "source": "iana" - }, - "image/vnd.microsoft.icon": { - "source": "iana" - }, - "image/vnd.mix": { - "source": "iana" - }, - "image/vnd.mozilla.apng": { - "source": "iana" - }, - "image/vnd.ms-modi": { - "source": "iana", - "extensions": ["mdi"] - }, - "image/vnd.ms-photo": { - "source": "apache", - "extensions": ["wdp"] - }, - "image/vnd.net-fpx": { - "source": "iana", - "extensions": ["npx"] - }, - "image/vnd.radiance": { - "source": "iana" - }, - "image/vnd.sealed.png": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.gif": { - "source": "iana" - }, - "image/vnd.sealedmedia.softseal.jpg": { - "source": "iana" - }, - "image/vnd.svf": { - "source": "iana" - }, - "image/vnd.tencent.tap": { - "source": "iana" - }, - "image/vnd.valve.source.texture": { - "source": "iana" - }, - "image/vnd.wap.wbmp": { - "source": "iana", - "extensions": ["wbmp"] - }, - "image/vnd.xiff": { - "source": "iana", - "extensions": ["xif"] - }, - "image/vnd.zbrush.pcx": { - "source": "iana" - }, - "image/webp": { - "source": "apache", - "extensions": ["webp"] - }, - "image/wmf": { - "source": "iana" - }, - "image/x-3ds": { - "source": "apache", - "extensions": ["3ds"] - }, - "image/x-cmu-raster": { - "source": "apache", - "extensions": ["ras"] - }, - "image/x-cmx": { - "source": "apache", - "extensions": ["cmx"] - }, - "image/x-freehand": { - "source": "apache", - "extensions": ["fh","fhc","fh4","fh5","fh7"] - }, - "image/x-icon": { - "source": "apache", - "compressible": true, - "extensions": ["ico"] - }, - "image/x-jng": { - "source": "nginx", - "extensions": ["jng"] - }, - "image/x-mrsid-image": { - "source": "apache", - "extensions": ["sid"] - }, - "image/x-ms-bmp": { - "source": "nginx", - "compressible": true, - "extensions": ["bmp"] - }, - "image/x-pcx": { - "source": "apache", - "extensions": ["pcx"] - }, - "image/x-pict": { - "source": "apache", - "extensions": ["pic","pct"] - }, - "image/x-portable-anymap": { - "source": "apache", - "extensions": ["pnm"] - }, - "image/x-portable-bitmap": { - "source": "apache", - "extensions": ["pbm"] - }, - "image/x-portable-graymap": { - "source": "apache", - "extensions": ["pgm"] - }, - "image/x-portable-pixmap": { - "source": "apache", - "extensions": ["ppm"] - }, - "image/x-rgb": { - "source": "apache", - "extensions": ["rgb"] - }, - "image/x-tga": { - "source": "apache", - "extensions": ["tga"] - }, - "image/x-xbitmap": { - "source": "apache", - "extensions": ["xbm"] - }, - "image/x-xcf": { - "compressible": false - }, - "image/x-xpixmap": { - "source": "apache", - "extensions": ["xpm"] - }, - "image/x-xwindowdump": { - "source": "apache", - "extensions": ["xwd"] - }, - "message/cpim": { - "source": "iana" - }, - "message/delivery-status": { - "source": "iana" - }, - "message/disposition-notification": { - "source": "iana" - }, - "message/external-body": { - "source": "iana" - }, - "message/feedback-report": { - "source": "iana" - }, - "message/global": { - "source": "iana" - }, - "message/global-delivery-status": { - "source": "iana" - }, - "message/global-disposition-notification": { - "source": "iana" - }, - "message/global-headers": { - "source": "iana" - }, - "message/http": { - "source": "iana", - "compressible": false - }, - "message/imdn+xml": { - "source": "iana", - "compressible": true - }, - "message/news": { - "source": "iana" - }, - "message/partial": { - "source": "iana", - "compressible": false - }, - "message/rfc822": { - "source": "iana", - "compressible": true, - "extensions": ["eml","mime"] - }, - "message/s-http": { - "source": "iana" - }, - "message/sip": { - "source": "iana" - }, - "message/sipfrag": { - "source": "iana" - }, - "message/tracking-status": { - "source": "iana" - }, - "message/vnd.si.simp": { - "source": "iana" - }, - "message/vnd.wfa.wsc": { - "source": "iana" - }, - "model/3mf": { - "source": "iana" - }, - "model/gltf+json": { - "source": "iana", - "compressible": true, - "extensions": ["gltf"] - }, - "model/gltf-binary": { - "source": "iana", - "compressible": true, - "extensions": ["glb"] - }, - "model/iges": { - "source": "iana", - "compressible": false, - "extensions": ["igs","iges"] - }, - "model/mesh": { - "source": "iana", - "compressible": false, - "extensions": ["msh","mesh","silo"] - }, - "model/vnd.collada+xml": { - "source": "iana", - "extensions": ["dae"] - }, - "model/vnd.dwf": { - "source": "iana", - "extensions": ["dwf"] - }, - "model/vnd.flatland.3dml": { - "source": "iana" - }, - "model/vnd.gdl": { - "source": "iana", - "extensions": ["gdl"] - }, - "model/vnd.gs-gdl": { - "source": "apache" - }, - "model/vnd.gs.gdl": { - "source": "iana" - }, - "model/vnd.gtw": { - "source": "iana", - "extensions": ["gtw"] - }, - "model/vnd.moml+xml": { - "source": "iana" - }, - "model/vnd.mts": { - "source": "iana", - "extensions": ["mts"] - }, - "model/vnd.opengex": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.binary": { - "source": "iana" - }, - "model/vnd.parasolid.transmit.text": { - "source": "iana" - }, - "model/vnd.rosette.annotated-data-model": { - "source": "iana" - }, - "model/vnd.valve.source.compiled-map": { - "source": "iana" - }, - "model/vnd.vtu": { - "source": "iana", - "extensions": ["vtu"] - }, - "model/vrml": { - "source": "iana", - "compressible": false, - "extensions": ["wrl","vrml"] - }, - "model/x3d+binary": { - "source": "apache", - "compressible": false, - "extensions": ["x3db","x3dbz"] - }, - "model/x3d+fastinfoset": { - "source": "iana" - }, - "model/x3d+vrml": { - "source": "apache", - "compressible": false, - "extensions": ["x3dv","x3dvz"] - }, - "model/x3d+xml": { - "source": "iana", - "compressible": true, - "extensions": ["x3d","x3dz"] - }, - "model/x3d-vrml": { - "source": "iana" - }, - "multipart/alternative": { - "source": "iana", - "compressible": false - }, - "multipart/appledouble": { - "source": "iana" - }, - "multipart/byteranges": { - "source": "iana" - }, - "multipart/digest": { - "source": "iana" - }, - "multipart/encrypted": { - "source": "iana", - "compressible": false - }, - "multipart/form-data": { - "source": "iana", - "compressible": false - }, - "multipart/header-set": { - "source": "iana" - }, - "multipart/mixed": { - "source": "iana", - "compressible": false - }, - "multipart/multilingual": { - "source": "iana" - }, - "multipart/parallel": { - "source": "iana" - }, - "multipart/related": { - "source": "iana", - "compressible": false - }, - "multipart/report": { - "source": "iana" - }, - "multipart/signed": { - "source": "iana", - "compressible": false - }, - "multipart/vnd.bint.med-plus": { - "source": "iana" - }, - "multipart/voice-message": { - "source": "iana" - }, - "multipart/x-mixed-replace": { - "source": "iana" - }, - "text/1d-interleaved-parityfec": { - "source": "iana" - }, - "text/cache-manifest": { - "source": "iana", - "compressible": true, - "extensions": ["appcache","manifest"] - }, - "text/calendar": { - "source": "iana", - "extensions": ["ics","ifb"] - }, - "text/calender": { - "compressible": true - }, - "text/cmd": { - "compressible": true - }, - "text/coffeescript": { - "extensions": ["coffee","litcoffee"] - }, - "text/css": { - "source": "iana", - "charset": "UTF-8", - "compressible": true, - "extensions": ["css"] - }, - "text/csv": { - "source": "iana", - "compressible": true, - "extensions": ["csv"] - }, - "text/csv-schema": { - "source": "iana" - }, - "text/directory": { - "source": "iana" - }, - "text/dns": { - "source": "iana" - }, - "text/ecmascript": { - "source": "iana" - }, - "text/encaprtp": { - "source": "iana" - }, - "text/enriched": { - "source": "iana" - }, - "text/fwdred": { - "source": "iana" - }, - "text/grammar-ref-list": { - "source": "iana" - }, - "text/html": { - "source": "iana", - "compressible": true, - "extensions": ["html","htm","shtml"] - }, - "text/jade": { - "extensions": ["jade"] - }, - "text/javascript": { - "source": "iana", - "compressible": true - }, - "text/jcr-cnd": { - "source": "iana" - }, - "text/jsx": { - "compressible": true, - "extensions": ["jsx"] - }, - "text/less": { - "extensions": ["less"] - }, - "text/markdown": { - "source": "iana", - "compressible": true, - "extensions": ["markdown","md"] - }, - "text/mathml": { - "source": "nginx", - "extensions": ["mml"] - }, - "text/mizar": { - "source": "iana" - }, - "text/n3": { - "source": "iana", - "compressible": true, - "extensions": ["n3"] - }, - "text/parameters": { - "source": "iana" - }, - "text/parityfec": { - "source": "iana" - }, - "text/plain": { - "source": "iana", - "compressible": true, - "extensions": ["txt","text","conf","def","list","log","in","ini"] - }, - "text/provenance-notation": { - "source": "iana" - }, - "text/prs.fallenstein.rst": { - "source": "iana" - }, - "text/prs.lines.tag": { - "source": "iana", - "extensions": ["dsc"] - }, - "text/prs.prop.logic": { - "source": "iana" - }, - "text/raptorfec": { - "source": "iana" - }, - "text/red": { - "source": "iana" - }, - "text/rfc822-headers": { - "source": "iana" - }, - "text/richtext": { - "source": "iana", - "compressible": true, - "extensions": ["rtx"] - }, - "text/rtf": { - "source": "iana", - "compressible": true, - "extensions": ["rtf"] - }, - "text/rtp-enc-aescm128": { - "source": "iana" - }, - "text/rtploopback": { - "source": "iana" - }, - "text/rtx": { - "source": "iana" - }, - "text/sgml": { - "source": "iana", - "extensions": ["sgml","sgm"] - }, - "text/shex": { - "extensions": ["shex"] - }, - "text/slim": { - "extensions": ["slim","slm"] - }, - "text/strings": { - "source": "iana" - }, - "text/stylus": { - "extensions": ["stylus","styl"] - }, - "text/t140": { - "source": "iana" - }, - "text/tab-separated-values": { - "source": "iana", - "compressible": true, - "extensions": ["tsv"] - }, - "text/troff": { - "source": "iana", - "extensions": ["t","tr","roff","man","me","ms"] - }, - "text/turtle": { - "source": "iana", - "extensions": ["ttl"] - }, - "text/ulpfec": { - "source": "iana" - }, - "text/uri-list": { - "source": "iana", - "compressible": true, - "extensions": ["uri","uris","urls"] - }, - "text/vcard": { - "source": "iana", - "compressible": true, - "extensions": ["vcard"] - }, - "text/vnd.a": { - "source": "iana" - }, - "text/vnd.abc": { - "source": "iana" - }, - "text/vnd.ascii-art": { - "source": "iana" - }, - "text/vnd.curl": { - "source": "iana", - "extensions": ["curl"] - }, - "text/vnd.curl.dcurl": { - "source": "apache", - "extensions": ["dcurl"] - }, - "text/vnd.curl.mcurl": { - "source": "apache", - "extensions": ["mcurl"] - }, - "text/vnd.curl.scurl": { - "source": "apache", - "extensions": ["scurl"] - }, - "text/vnd.debian.copyright": { - "source": "iana" - }, - "text/vnd.dmclientscript": { - "source": "iana" - }, - "text/vnd.dvb.subtitle": { - "source": "iana", - "extensions": ["sub"] - }, - "text/vnd.esmertec.theme-descriptor": { - "source": "iana" - }, - "text/vnd.fly": { - "source": "iana", - "extensions": ["fly"] - }, - "text/vnd.fmi.flexstor": { - "source": "iana", - "extensions": ["flx"] - }, - "text/vnd.graphviz": { - "source": "iana", - "extensions": ["gv"] - }, - "text/vnd.in3d.3dml": { - "source": "iana", - "extensions": ["3dml"] - }, - "text/vnd.in3d.spot": { - "source": "iana", - "extensions": ["spot"] - }, - "text/vnd.iptc.newsml": { - "source": "iana" - }, - "text/vnd.iptc.nitf": { - "source": "iana" - }, - "text/vnd.latex-z": { - "source": "iana" - }, - "text/vnd.motorola.reflex": { - "source": "iana" - }, - "text/vnd.ms-mediapackage": { - "source": "iana" - }, - "text/vnd.net2phone.commcenter.command": { - "source": "iana" - }, - "text/vnd.radisys.msml-basic-layout": { - "source": "iana" - }, - "text/vnd.si.uricatalogue": { - "source": "iana" - }, - "text/vnd.sun.j2me.app-descriptor": { - "source": "iana", - "extensions": ["jad"] - }, - "text/vnd.trolltech.linguist": { - "source": "iana" - }, - "text/vnd.wap.si": { - "source": "iana" - }, - "text/vnd.wap.sl": { - "source": "iana" - }, - "text/vnd.wap.wml": { - "source": "iana", - "extensions": ["wml"] - }, - "text/vnd.wap.wmlscript": { - "source": "iana", - "extensions": ["wmls"] - }, - "text/vtt": { - "charset": "UTF-8", - "compressible": true, - "extensions": ["vtt"] - }, - "text/x-asm": { - "source": "apache", - "extensions": ["s","asm"] - }, - "text/x-c": { - "source": "apache", - "extensions": ["c","cc","cxx","cpp","h","hh","dic"] - }, - "text/x-component": { - "source": "nginx", - "extensions": ["htc"] - }, - "text/x-fortran": { - "source": "apache", - "extensions": ["f","for","f77","f90"] - }, - "text/x-gwt-rpc": { - "compressible": true - }, - "text/x-handlebars-template": { - "extensions": ["hbs"] - }, - "text/x-java-source": { - "source": "apache", - "extensions": ["java"] - }, - "text/x-jquery-tmpl": { - "compressible": true - }, - "text/x-lua": { - "extensions": ["lua"] - }, - "text/x-markdown": { - "compressible": true, - "extensions": ["mkd"] - }, - "text/x-nfo": { - "source": "apache", - "extensions": ["nfo"] - }, - "text/x-opml": { - "source": "apache", - "extensions": ["opml"] - }, - "text/x-org": { - "compressible": true, - "extensions": ["org"] - }, - "text/x-pascal": { - "source": "apache", - "extensions": ["p","pas"] - }, - "text/x-processing": { - "compressible": true, - "extensions": ["pde"] - }, - "text/x-sass": { - "extensions": ["sass"] - }, - "text/x-scss": { - "extensions": ["scss"] - }, - "text/x-setext": { - "source": "apache", - "extensions": ["etx"] - }, - "text/x-sfv": { - "source": "apache", - "extensions": ["sfv"] - }, - "text/x-suse-ymp": { - "compressible": true, - "extensions": ["ymp"] - }, - "text/x-uuencode": { - "source": "apache", - "extensions": ["uu"] - }, - "text/x-vcalendar": { - "source": "apache", - "extensions": ["vcs"] - }, - "text/x-vcard": { - "source": "apache", - "extensions": ["vcf"] - }, - "text/xml": { - "source": "iana", - "compressible": true, - "extensions": ["xml"] - }, - "text/xml-external-parsed-entity": { - "source": "iana" - }, - "text/yaml": { - "extensions": ["yaml","yml"] - }, - "video/1d-interleaved-parityfec": { - "source": "iana" - }, - "video/3gpp": { - "source": "iana", - "extensions": ["3gp","3gpp"] - }, - "video/3gpp-tt": { - "source": "iana" - }, - "video/3gpp2": { - "source": "iana", - "extensions": ["3g2"] - }, - "video/bmpeg": { - "source": "iana" - }, - "video/bt656": { - "source": "iana" - }, - "video/celb": { - "source": "iana" - }, - "video/dv": { - "source": "iana" - }, - "video/encaprtp": { - "source": "iana" - }, - "video/h261": { - "source": "iana", - "extensions": ["h261"] - }, - "video/h263": { - "source": "iana", - "extensions": ["h263"] - }, - "video/h263-1998": { - "source": "iana" - }, - "video/h263-2000": { - "source": "iana" - }, - "video/h264": { - "source": "iana", - "extensions": ["h264"] - }, - "video/h264-rcdo": { - "source": "iana" - }, - "video/h264-svc": { - "source": "iana" - }, - "video/h265": { - "source": "iana" - }, - "video/iso.segment": { - "source": "iana" - }, - "video/jpeg": { - "source": "iana", - "extensions": ["jpgv"] - }, - "video/jpeg2000": { - "source": "iana" - }, - "video/jpm": { - "source": "apache", - "extensions": ["jpm","jpgm"] - }, - "video/mj2": { - "source": "iana", - "extensions": ["mj2","mjp2"] - }, - "video/mp1s": { - "source": "iana" - }, - "video/mp2p": { - "source": "iana" - }, - "video/mp2t": { - "source": "iana", - "extensions": ["ts"] - }, - "video/mp4": { - "source": "iana", - "compressible": false, - "extensions": ["mp4","mp4v","mpg4"] - }, - "video/mp4v-es": { - "source": "iana" - }, - "video/mpeg": { - "source": "iana", - "compressible": false, - "extensions": ["mpeg","mpg","mpe","m1v","m2v"] - }, - "video/mpeg4-generic": { - "source": "iana" - }, - "video/mpv": { - "source": "iana" - }, - "video/nv": { - "source": "iana" - }, - "video/ogg": { - "source": "iana", - "compressible": false, - "extensions": ["ogv"] - }, - "video/parityfec": { - "source": "iana" - }, - "video/pointer": { - "source": "iana" - }, - "video/quicktime": { - "source": "iana", - "compressible": false, - "extensions": ["qt","mov"] - }, - "video/raptorfec": { - "source": "iana" - }, - "video/raw": { - "source": "iana" - }, - "video/rtp-enc-aescm128": { - "source": "iana" - }, - "video/rtploopback": { - "source": "iana" - }, - "video/rtx": { - "source": "iana" - }, - "video/smpte291": { - "source": "iana" - }, - "video/smpte292m": { - "source": "iana" - }, - "video/ulpfec": { - "source": "iana" - }, - "video/vc1": { - "source": "iana" - }, - "video/vnd.cctv": { - "source": "iana" - }, - "video/vnd.dece.hd": { - "source": "iana", - "extensions": ["uvh","uvvh"] - }, - "video/vnd.dece.mobile": { - "source": "iana", - "extensions": ["uvm","uvvm"] - }, - "video/vnd.dece.mp4": { - "source": "iana" - }, - "video/vnd.dece.pd": { - "source": "iana", - "extensions": ["uvp","uvvp"] - }, - "video/vnd.dece.sd": { - "source": "iana", - "extensions": ["uvs","uvvs"] - }, - "video/vnd.dece.video": { - "source": "iana", - "extensions": ["uvv","uvvv"] - }, - "video/vnd.directv.mpeg": { - "source": "iana" - }, - "video/vnd.directv.mpeg-tts": { - "source": "iana" - }, - "video/vnd.dlna.mpeg-tts": { - "source": "iana" - }, - "video/vnd.dvb.file": { - "source": "iana", - "extensions": ["dvb"] - }, - "video/vnd.fvt": { - "source": "iana", - "extensions": ["fvt"] - }, - "video/vnd.hns.video": { - "source": "iana" - }, - "video/vnd.iptvforum.1dparityfec-1010": { - "source": "iana" - }, - "video/vnd.iptvforum.1dparityfec-2005": { - "source": "iana" - }, - "video/vnd.iptvforum.2dparityfec-1010": { - "source": "iana" - }, - "video/vnd.iptvforum.2dparityfec-2005": { - "source": "iana" - }, - "video/vnd.iptvforum.ttsavc": { - "source": "iana" - }, - "video/vnd.iptvforum.ttsmpeg2": { - "source": "iana" - }, - "video/vnd.motorola.video": { - "source": "iana" - }, - "video/vnd.motorola.videop": { - "source": "iana" - }, - "video/vnd.mpegurl": { - "source": "iana", - "extensions": ["mxu","m4u"] - }, - "video/vnd.ms-playready.media.pyv": { - "source": "iana", - "extensions": ["pyv"] - }, - "video/vnd.nokia.interleaved-multimedia": { - "source": "iana" - }, - "video/vnd.nokia.mp4vr": { - "source": "iana" - }, - "video/vnd.nokia.videovoip": { - "source": "iana" - }, - "video/vnd.objectvideo": { - "source": "iana" - }, - "video/vnd.radgamettools.bink": { - "source": "iana" - }, - "video/vnd.radgamettools.smacker": { - "source": "iana" - }, - "video/vnd.sealed.mpeg1": { - "source": "iana" - }, - "video/vnd.sealed.mpeg4": { - "source": "iana" - }, - "video/vnd.sealed.swf": { - "source": "iana" - }, - "video/vnd.sealedmedia.softseal.mov": { - "source": "iana" - }, - "video/vnd.uvvu.mp4": { - "source": "iana", - "extensions": ["uvu","uvvu"] - }, - "video/vnd.vivo": { - "source": "iana", - "extensions": ["viv"] - }, - "video/vp8": { - "source": "iana" - }, - "video/webm": { - "source": "apache", - "compressible": false, - "extensions": ["webm"] - }, - "video/x-f4v": { - "source": "apache", - "extensions": ["f4v"] - }, - "video/x-fli": { - "source": "apache", - "extensions": ["fli"] - }, - "video/x-flv": { - "source": "apache", - "compressible": false, - "extensions": ["flv"] - }, - "video/x-m4v": { - "source": "apache", - "extensions": ["m4v"] - }, - "video/x-matroska": { - "source": "apache", - "compressible": false, - "extensions": ["mkv","mk3d","mks"] - }, - "video/x-mng": { - "source": "apache", - "extensions": ["mng"] - }, - "video/x-ms-asf": { - "source": "apache", - "extensions": ["asf","asx"] - }, - "video/x-ms-vob": { - "source": "apache", - "extensions": ["vob"] - }, - "video/x-ms-wm": { - "source": "apache", - "extensions": ["wm"] - }, - "video/x-ms-wmv": { - "source": "apache", - "compressible": false, - "extensions": ["wmv"] - }, - "video/x-ms-wmx": { - "source": "apache", - "extensions": ["wmx"] - }, - "video/x-ms-wvx": { - "source": "apache", - "extensions": ["wvx"] - }, - "video/x-msvideo": { - "source": "apache", - "extensions": ["avi"] - }, - "video/x-sgi-movie": { - "source": "apache", - "extensions": ["movie"] - }, - "video/x-smv": { - "source": "apache", - "extensions": ["smv"] - }, - "x-conference/x-cooltalk": { - "source": "apache", - "extensions": ["ice"] - }, - "x-shader/x-fragment": { - "compressible": true - }, - "x-shader/x-vertex": { - "compressible": true - } -} diff --git a/electron/src/node_modules/mime-db/index.js b/electron/src/node_modules/mime-db/index.js deleted file mode 100755 index 551031f..0000000 --- a/electron/src/node_modules/mime-db/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * mime-db - * Copyright(c) 2014 Jonathan Ong - * MIT Licensed - */ - -/** - * Module exports. - */ - -module.exports = require('./db.json') diff --git a/electron/src/node_modules/mime-db/package.json b/electron/src/node_modules/mime-db/package.json deleted file mode 100755 index 7fb2b6a..0000000 --- a/electron/src/node_modules/mime-db/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "mime-db", - "description": "Media Type Database", - "version": "1.32.0", - "contributors": [ - "Douglas Christopher Wilson ", - "Jonathan Ong (http://jongleberry.com)", - "Robert Kieffer (http://github.com/broofa)" - ], - "license": "MIT", - "keywords": [ - "mime", - "db", - "type", - "types", - "database", - "charset", - "charsets" - ], - "repository": "jshttp/mime-db", - "devDependencies": { - "bluebird": "3.5.1", - "co": "4.6.0", - "cogent": "1.0.1", - "csv-parse": "1.3.1", - "eslint": "3.19.0", - "eslint-config-standard": "10.2.1", - "eslint-plugin-import": "2.8.0", - "eslint-plugin-node": "5.2.1", - "eslint-plugin-promise": "3.6.0", - "eslint-plugin-standard": "3.0.1", - "gnode": "0.1.2", - "mocha": "1.21.5", - "nyc": "11.3.0", - "raw-body": "2.3.2", - "stream-to-array": "2.3.0" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "db.json", - "index.js" - ], - "engines": { - "node": ">= 0.6" - }, - "scripts": { - "build": "node scripts/build", - "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx", - "lint": "eslint .", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "nyc --reporter=html --reporter=text npm test", - "test-travis": "nyc --reporter=text npm test", - "update": "npm run fetch && npm run build" - } -} diff --git a/electron/src/node_modules/modify-filename/index.js b/electron/src/node_modules/modify-filename/index.js deleted file mode 100755 index 1c53fba..0000000 --- a/electron/src/node_modules/modify-filename/index.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; -var path = require('path'); - -module.exports = function modifyFilename(pth, modifier) { - if (arguments.length !== 2) { - throw new Error('`path` and `modifier` required'); - } - - if (Array.isArray(pth)) { - return pth.map(function (el) { - return modifyFilename(el, modifier); - }); - } - - var ext = path.extname(pth); - return path.join(path.dirname(pth), modifier(path.basename(pth, ext), ext)); -}; diff --git a/electron/src/node_modules/modify-filename/license b/electron/src/node_modules/modify-filename/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/modify-filename/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/modify-filename/package.json b/electron/src/node_modules/modify-filename/package.json deleted file mode 100755 index d3904aa..0000000 --- a/electron/src/node_modules/modify-filename/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "modify-filename", - "version": "1.1.0", - "description": "Modify the filename in a path", - "license": "MIT", - "repository": "sindresorhus/modify-filename", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "modify", - "change", - "replace", - "filename", - "file", - "name", - "path" - ], - "devDependencies": { - "ava": "0.0.4" - } -} diff --git a/electron/src/node_modules/modify-filename/readme.md b/electron/src/node_modules/modify-filename/readme.md deleted file mode 100755 index 1c3ec3b..0000000 --- a/electron/src/node_modules/modify-filename/readme.md +++ /dev/null @@ -1,32 +0,0 @@ -# modify-filename [![Build Status](https://travis-ci.org/sindresorhus/modify-filename.svg?branch=master)](https://travis-ci.org/sindresorhus/modify-filename) - -> Modify the filename in a path - - -## Install - -``` -$ npm install --save modify-filename -``` - - -## Usage - -```js -var modifyFilename = require('modify-filename'); - -modifyFilename('src/unicorn.png', function (filename, extension) { - return filename + '-rainbow' + extension; -}); -//=> 'src/unicorn-rainbow.png' - -modifyFilename(['src/unicorn.png', 'src/pony.png'], function (filename, extension) { - return filename + '-rainbow' + extension; -}); -//=> ['src/unicorn-rainbow.png', 'src/pony-rainbow.png'] -``` - - -## License - -MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/electron/src/node_modules/ms/index.js b/electron/src/node_modules/ms/index.js deleted file mode 100755 index 6a522b1..0000000 --- a/electron/src/node_modules/ms/index.js +++ /dev/null @@ -1,152 +0,0 @@ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - if (ms >= d) { - return Math.round(ms / d) + 'd'; - } - if (ms >= h) { - return Math.round(ms / h) + 'h'; - } - if (ms >= m) { - return Math.round(ms / m) + 'm'; - } - if (ms >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - return plural(ms, d, 'day') || - plural(ms, h, 'hour') || - plural(ms, m, 'minute') || - plural(ms, s, 'second') || - ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, n, name) { - if (ms < n) { - return; - } - if (ms < n * 1.5) { - return Math.floor(ms / n) + ' ' + name; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/electron/src/node_modules/ms/license.md b/electron/src/node_modules/ms/license.md deleted file mode 100755 index 69b6125..0000000 --- a/electron/src/node_modules/ms/license.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Zeit, 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/electron/src/node_modules/ms/package.json b/electron/src/node_modules/ms/package.json deleted file mode 100755 index 6a31c81..0000000 --- a/electron/src/node_modules/ms/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "ms", - "version": "2.0.0", - "description": "Tiny milisecond conversion utility", - "repository": "zeit/ms", - "main": "./index", - "files": [ - "index.js" - ], - "scripts": { - "precommit": "lint-staged", - "lint": "eslint lib/* bin/*", - "test": "mocha tests.js" - }, - "eslintConfig": { - "extends": "eslint:recommended", - "env": { - "node": true, - "es6": true - } - }, - "lint-staged": { - "*.js": [ - "npm run lint", - "prettier --single-quote --write", - "git add" - ] - }, - "license": "MIT", - "devDependencies": { - "eslint": "3.19.0", - "expect.js": "0.3.1", - "husky": "0.13.3", - "lint-staged": "3.4.1", - "mocha": "3.4.1" - } -} diff --git a/electron/src/node_modules/ms/readme.md b/electron/src/node_modules/ms/readme.md deleted file mode 100755 index 84a9974..0000000 --- a/electron/src/node_modules/ms/readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# ms - -[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms) -[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/) - -Use this package to easily convert various time formats to milliseconds. - -## Examples - -```js -ms('2 days') // 172800000 -ms('1d') // 86400000 -ms('10h') // 36000000 -ms('2.5 hrs') // 9000000 -ms('2h') // 7200000 -ms('1m') // 60000 -ms('5s') // 5000 -ms('1y') // 31557600000 -ms('100') // 100 -``` - -### Convert from milliseconds - -```js -ms(60000) // "1m" -ms(2 * 60000) // "2m" -ms(ms('10 hours')) // "10h" -``` - -### Time format written-out - -```js -ms(60000, { long: true }) // "1 minute" -ms(2 * 60000, { long: true }) // "2 minutes" -ms(ms('10 hours'), { long: true }) // "10 hours" -``` - -## Features - -- Works both in [node](https://nodejs.org) and in the browser. -- If a number is supplied to `ms`, a string with a unit is returned. -- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`). -- If you pass a string with a number and a valid unit, the number of equivalent ms is returned. - -## Caught a bug? - -1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device -2. Link the package to the global module directory: `npm link` -3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms! - -As always, you can run the tests using: `npm test` diff --git a/electron/src/node_modules/path-exists/index.js b/electron/src/node_modules/path-exists/index.js deleted file mode 100755 index 16ae60a..0000000 --- a/electron/src/node_modules/path-exists/index.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; -const fs = require('fs'); - -module.exports = fp => new Promise(resolve => { - fs.access(fp, err => { - resolve(!err); - }); -}); - -module.exports.sync = fp => { - try { - fs.accessSync(fp); - return true; - } catch (err) { - return false; - } -}; diff --git a/electron/src/node_modules/path-exists/license b/electron/src/node_modules/path-exists/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/path-exists/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/path-exists/package.json b/electron/src/node_modules/path-exists/package.json deleted file mode 100755 index efd5626..0000000 --- a/electron/src/node_modules/path-exists/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "path-exists", - "version": "3.0.0", - "description": "Check if a path exists", - "license": "MIT", - "repository": "sindresorhus/path-exists", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=4" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "path", - "exists", - "exist", - "file", - "filepath", - "fs", - "filesystem", - "file-system", - "access", - "stat" - ], - "devDependencies": { - "ava": "*", - "xo": "*" - }, - "xo": { - "esnext": true - } -} diff --git a/electron/src/node_modules/path-exists/readme.md b/electron/src/node_modules/path-exists/readme.md deleted file mode 100755 index 1b65fa7..0000000 --- a/electron/src/node_modules/path-exists/readme.md +++ /dev/null @@ -1,50 +0,0 @@ -# path-exists [![Build Status](https://travis-ci.org/sindresorhus/path-exists.svg?branch=master)](https://travis-ci.org/sindresorhus/path-exists) - -> Check if a path exists - -Because [`fs.exists()`](https://nodejs.org/api/fs.html#fs_fs_exists_path_callback) is being [deprecated](https://github.com/iojs/io.js/issues/103), but there's still a genuine use-case of being able to check if a path exists for other purposes than doing IO with it. - -Never use this before handling a file though: - -> In particular, checking if a file exists before opening it is an anti-pattern that leaves you vulnerable to race conditions: another process may remove the file between the calls to `fs.exists()` and `fs.open()`. Just open the file and handle the error when it's not there. - - -## Install - -``` -$ npm install --save path-exists -``` - - -## Usage - -```js -// foo.js -const pathExists = require('path-exists'); - -pathExists('foo.js').then(exists => { - console.log(exists); - //=> true -}); -``` - - -## API - -### pathExists(path) - -Returns a promise for a boolean of whether the path exists. - -### pathExists.sync(path) - -Returns a boolean of whether the path exists. - - -## Related - -- [path-exists-cli](https://github.com/sindresorhus/path-exists-cli) - CLI for this module - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/pupa/index.js b/electron/src/node_modules/pupa/index.js deleted file mode 100755 index 501fca5..0000000 --- a/electron/src/node_modules/pupa/index.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; -module.exports = (tpl, data) => { - if (typeof tpl !== 'string') { - throw new TypeError(`Expected a string in the first argument, got ${typeof tpl}`); - } - - if (typeof data !== 'object') { - throw new TypeError(`Expected an Object/Array in the second argument, got ${typeof data}`); - } - - const re = /{(.*?)}/g; - - return tpl.replace(re, (_, key) => { - let ret = data; - - for (const prop of key.split('.')) { - ret = ret ? ret[prop] : ''; - } - - return ret || ''; - }); -}; diff --git a/electron/src/node_modules/pupa/license b/electron/src/node_modules/pupa/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/pupa/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/pupa/package.json b/electron/src/node_modules/pupa/package.json deleted file mode 100755 index 1e973f3..0000000 --- a/electron/src/node_modules/pupa/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "pupa", - "version": "1.0.0", - "description": "Simple micro templating", - "license": "MIT", - "repository": "sindresorhus/pupa", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=4" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "string", - "formatting", - "template", - "object", - "format", - "interpolate", - "interpolation", - "templating", - "str", - "obj", - "tpl", - "expand", - "simple", - "replace", - "placeholders", - "values", - "fmt", - "transform", - "micro" - ], - "devDependencies": { - "ava": "*", - "xo": "*" - }, - "xo": { - "esnext": true - } -} diff --git a/electron/src/node_modules/pupa/readme.md b/electron/src/node_modules/pupa/readme.md deleted file mode 100755 index 1255e8d..0000000 --- a/electron/src/node_modules/pupa/readme.md +++ /dev/null @@ -1,59 +0,0 @@ -# pupa [![Build Status](https://travis-ci.org/sindresorhus/pupa.svg?branch=master)](https://travis-ci.org/sindresorhus/pupa) - -> Simple micro templating - -Useful when all you need is to fill in some placeholders. - - -## Install - -``` -$ npm install --save pupa -``` - - -## Usage - -```js -const pupa = require('pupa'); - -pupa('The mobile number of {name} is {phone.mobile}', { - name: 'Sindre', - phone: { - mobile: '609 24 363' - } -}); -//=> 'The mobile number of Sindre is 609 24 363' - -pupa('I like {0} and {1}', ['🦄', '🐮']); -//=> 'I like 🦄 and 🐮' -``` - - -## API - -### pupa(template, data) - -#### template - -Type: `string` - -Text with placeholders for `data` properties. - -#### data - -Type: `Object` `Array` - -Data to interpolate into `template`. - - -## FAQ - -### What about template literals? - -Template literals expand on creation. This module expands the template on execution, which can be useful if either or both template and data are lazily created or user-supplied. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/sort-keys-length/LICENSE.md b/electron/src/node_modules/sort-keys-length/LICENSE.md deleted file mode 100755 index 3beff79..0000000 --- a/electron/src/node_modules/sort-keys-length/LICENSE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) Kevin Mårtensson - -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/electron/src/node_modules/sort-keys-length/README.md b/electron/src/node_modules/sort-keys-length/README.md deleted file mode 100755 index 1efe188..0000000 --- a/electron/src/node_modules/sort-keys-length/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# sort-keys-length [![Build Status](http://img.shields.io/travis/kevva/sort-keys-length/master.svg?style=flat)](http://travis-ci.org/kevva/sort-keys-length) - -> Sort object keys by length - -## Install - -```sh -$ npm install --save sort-keys-length -``` - -## Usage - -```js -var sortKeysLength = require('sort-keys-length'); - -sortKeysLength.asc({ ab: 'x', a: 'y', abc: 'z' }); -//=> { a: 'y', ab: 'x', abc: 'z' } - -sortKeysLength.desc({ ab: 'x', a: 'y', abc: 'z' }); -//=> { abc: 'z', ab: 'x', a: 'y' } -``` - -## API - -### .asc - -Ascending sort. - -### .desc - -Descending sort. - -## License - -MIT © [Kevin Mårtensson](https://github.com/kevva) diff --git a/electron/src/node_modules/sort-keys-length/index.js b/electron/src/node_modules/sort-keys-length/index.js deleted file mode 100755 index b4af8d2..0000000 --- a/electron/src/node_modules/sort-keys-length/index.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -var sortKeys = require('sort-keys'); - -/** - * Sort object keys by length - * - * @param obj - * @api public - */ - -module.exports.desc = function (obj) { - return sortKeys(obj, function (a, b) { - return b.length - a.length; - }); -} - -module.exports.asc = function (obj) { - return sortKeys(obj, function (a, b) { - return a.length - b.length; - }); -} diff --git a/electron/src/node_modules/sort-keys-length/package.json b/electron/src/node_modules/sort-keys-length/package.json deleted file mode 100755 index 7698305..0000000 --- a/electron/src/node_modules/sort-keys-length/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "sort-keys-length", - "version": "1.0.1", - "description": "Sort objecy keys by length", - "license": "MIT", - "repository": "kevva/sort-keys-length", - "author": { - "name": "Kevin Mårtensson", - "email": "kevinmartensson@gmail.com", - "url": "https://github.com/kevva" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "node test.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "length", - "object", - "sort" - ], - "dependencies": { - "sort-keys": "^1.0.0" - }, - "devDependencies": { - "ava": "^0.0.4" - } -} diff --git a/electron/src/node_modules/sort-keys/index.js b/electron/src/node_modules/sort-keys/index.js deleted file mode 100755 index f75a0e0..0000000 --- a/electron/src/node_modules/sort-keys/index.js +++ /dev/null @@ -1,44 +0,0 @@ -'use strict'; -var isPlainObj = require('is-plain-obj'); - -module.exports = function (obj, opts) { - if (!isPlainObj(obj)) { - throw new TypeError('Expected a plain object'); - } - - opts = opts || {}; - - // DEPRECATED - if (typeof opts === 'function') { - opts = {compare: opts}; - } - - var deep = opts.deep; - var seenInput = []; - var seenOutput = []; - - var sortKeys = function (x) { - var seenIndex = seenInput.indexOf(x); - - if (seenIndex !== -1) { - return seenOutput[seenIndex]; - } - - var ret = {}; - var keys = Object.keys(x).sort(opts.compare); - - seenInput.push(x); - seenOutput.push(ret); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var val = x[key]; - - ret[key] = deep && isPlainObj(val) ? sortKeys(val) : val; - } - - return ret; - }; - - return sortKeys(obj); -}; diff --git a/electron/src/node_modules/sort-keys/license b/electron/src/node_modules/sort-keys/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/sort-keys/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/sort-keys/package.json b/electron/src/node_modules/sort-keys/package.json deleted file mode 100755 index dff0653..0000000 --- a/electron/src/node_modules/sort-keys/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "sort-keys", - "version": "1.1.2", - "description": "Sort the keys of an object", - "license": "MIT", - "repository": "sindresorhus/sort-keys", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && mocha" - }, - "files": [ - "index.js" - ], - "keywords": [ - "sort", - "object", - "keys", - "obj", - "key", - "stable", - "deterministic", - "deep", - "recursive", - "recursively" - ], - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "devDependencies": { - "mocha": "*", - "xo": "*" - } -} diff --git a/electron/src/node_modules/sort-keys/readme.md b/electron/src/node_modules/sort-keys/readme.md deleted file mode 100755 index a671ffb..0000000 --- a/electron/src/node_modules/sort-keys/readme.md +++ /dev/null @@ -1,60 +0,0 @@ -# sort-keys [![Build Status](https://travis-ci.org/sindresorhus/sort-keys.svg?branch=master)](https://travis-ci.org/sindresorhus/sort-keys) - -> Sort the keys of an object - -Useful to get a deterministically ordered object, as the order of keys can vary between engines. - - -## Install - -``` -$ npm install --save sort-keys -``` - - -## Usage - -```js -const sortKeys = require('sort-keys'); - -sortKeys({c: 0, a: 0, b: 0}); -//=> {a: 0, b: 0, c: 0} - -sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true}); -//=> {a: 0, b: {a: 0, b: 0}} - -sortKeys({c: 0, a: 0, b: 0}, { - compare: (a, b) => -a.localeCompare(b) -}); -//=> {c: 0, b: 0, a: 0} -``` - - -## API - -### sortKeys(input, [options]) - -Returns a new object with sorted keys. - -#### input - -Type: `Object` - -#### options - -##### deep - -Type: `boolean` - -Recursively sort keys. - -##### compare - -Type: `Function` - -[Compare function.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/node_modules/unused-filename/index.js b/electron/src/node_modules/unused-filename/index.js deleted file mode 100755 index cdb127c..0000000 --- a/electron/src/node_modules/unused-filename/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; -const pathExists = require('path-exists'); -const modifyFilename = require('modify-filename'); - -const incrementer = fp => { - let i = 0; - return () => modifyFilename(fp, (filename, ext) => `${filename} (${++i})${ext}`); -}; - -module.exports = fp => { - const getFp = incrementer(fp); - const find = newFp => pathExists(newFp).then(x => x ? find(getFp()) : newFp); - return find(fp); -}; - -module.exports.sync = fp => { - const getFp = incrementer(fp); - const find = newFp => pathExists.sync(newFp) ? find(getFp()) : newFp; - return find(fp); -}; diff --git a/electron/src/node_modules/unused-filename/license b/electron/src/node_modules/unused-filename/license deleted file mode 100755 index 654d0bf..0000000 --- a/electron/src/node_modules/unused-filename/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/electron/src/node_modules/unused-filename/package.json b/electron/src/node_modules/unused-filename/package.json deleted file mode 100755 index c45750b..0000000 --- a/electron/src/node_modules/unused-filename/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "unused-filename", - "version": "1.0.0", - "description": "Get an unused filename by appending a number if it exists: `file.txt` → `file (1).txt`", - "license": "MIT", - "repository": "sindresorhus/unused-filename", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=4" - }, - "scripts": { - "test": "xo && ava" - }, - "files": [ - "index.js" - ], - "keywords": [ - "unused", - "filename", - "filepath", - "file", - "name", - "available", - "safe", - "unique", - "usable", - "filesystem", - "fs", - "exists", - "path" - ], - "dependencies": { - "modify-filename": "^1.1.0", - "path-exists": "^3.0.0" - }, - "devDependencies": { - "ava": "*", - "xo": "*" - } -} diff --git a/electron/src/node_modules/unused-filename/readme.md b/electron/src/node_modules/unused-filename/readme.md deleted file mode 100755 index 0b75ee9..0000000 --- a/electron/src/node_modules/unused-filename/readme.md +++ /dev/null @@ -1,56 +0,0 @@ -# unused-filename [![Build Status](https://travis-ci.org/sindresorhus/unused-filename.svg?branch=master)](https://travis-ci.org/sindresorhus/unused-filename) - -> Get an unused filename by appending a number if it exists: `file.txt` → `file (1).txt` - -Useful for safely writing, copying, moving files without overwriting existing files. - - -## Install - -``` -$ npm install --save unused-filename -``` - - -## Usage - -``` -. -├── rainbow (1).txt -├── rainbow.txt -└── unicorn.txt -``` - -```js -const unusedFilename = require('unused-filename'); - -unusedFilename('rainbow.txt').then(filename => { - console.log(filename); - //=> 'rainbow (2).txt' -}); -``` - - -## API - -### unusedFilename(filepath) - -Returns a `Promise`. - -### unusedFilename.sync(filepath) - -Returns a `string`. - -#### filepath - -Type: `string` - - -## Related - -- [filenamify](https://github.com/sindresorhus/filenamify) - Convert a string to a valid safe filename - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/electron/src/package-lock.json b/electron/src/package-lock.json index 906f7e9..9658db8 100755 --- a/electron/src/package-lock.json +++ b/electron/src/package-lock.json @@ -2,65 +2,183 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "1.5.1", + "is-buffer": "1.1.6" + } + }, "debug": { - "version": "2.6.9", - "resolved": "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "requires": { "ms": "2.0.0" } }, + "electron-context-menu": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.9.1.tgz", + "integrity": "sha1-7U3yDAgEkcPJlqv8s2MVmUajgFg=", + "requires": { + "electron-dl": "1.12.0", + "electron-is-dev": "0.1.2" + } + }, "electron-debug": { - "version": "1.4.0", - "resolved": "http://r.cnpmjs.org/electron-debug/download/electron-debug-1.4.0.tgz", - "integrity": "sha1-vscAVSIiCp0GIhUzUuG7/w83ry4=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-1.5.0.tgz", + "integrity": "sha1-2IwCFG77f8WuGyHqxW++SYfq5Qw=", "requires": { "electron-is-dev": "0.3.0", - "electron-localshortcut": "3.0.2" + "electron-localshortcut": "3.1.0" }, "dependencies": { "electron-is-dev": { "version": "0.3.0", - "resolved": "http://r.cnpmjs.org/electron-is-dev/download/electron-is-dev-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" - }, - "electron-localshortcut": { - "version": "3.0.2", - "resolved": "http://r.cnpmjs.org/electron-localshortcut/download/electron-localshortcut-3.0.2.tgz", - "integrity": "sha1-35zr5kFA9OWLaAqssr1ieK447mE=", - "requires": { - "debug": "2.6.9", - "electron-is-accelerator": "0.1.2", - "keyboardevent-from-electron-accelerator": "0.7.1", - "keyboardevents-areequal": "0.2.2" - } } } }, + "electron-dl": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz", + "integrity": "sha1-Mox/EtPkWO1N3Hc9j/wo1ZqzXS4=", + "requires": { + "ext-name": "5.0.0", + "pupa": "1.0.0", + "unused-filename": "1.0.0" + } + }, "electron-is-accelerator": { "version": "0.1.2", - "resolved": "http://r.cnpmjs.org/electron-is-accelerator/download/electron-is-accelerator-0.1.2.tgz", + "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", "integrity": "sha1-UJ5RDCala1Xhf4Y6SwThEYRqsns=" }, - "electron-log": { - "version": "1.3.0", - "resolved": "http://r.cnpmjs.org/electron-log/download/electron-log-1.3.0.tgz", - "integrity": "sha1-0FVEEUuXGhbIZznHnQ0jYQOtChY=" + "electron-is-dev": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.1.2.tgz", + "integrity": "sha1-ihBD4ys6HaHD9VPc4oznZCRhZ+M=" + }, + "electron-localshortcut": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.1.0.tgz", + "integrity": "sha1-EMH/1Te405FwqvbhVRNB93gN0s4=", + "requires": { + "debug": "2.6.9", + "electron-is-accelerator": "0.1.2", + "keyboardevent-from-electron-accelerator": "1.1.0", + "keyboardevents-areequal": "0.2.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha1-C5jmTtgvWs8PKTG6v2khLvUt3Tc=", + "requires": { + "mime-db": "1.35.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha1-cHgZgdGD7hXROZPIgiBFxQbI8KY=", + "requires": { + "ext-list": "2.2.2", + "sort-keys-length": "1.0.1" + } + }, + "follow-redirects": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", + "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", + "requires": { + "debug": "3.1.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "keyboardevent-from-electron-accelerator": { - "version": "0.7.1", - "resolved": "http://r.cnpmjs.org/keyboardevent-from-electron-accelerator/download/keyboardevent-from-electron-accelerator-0.7.1.tgz", - "integrity": "sha1-rtr6XMmjpfPyt8iLL/1AV1aBGOc=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-1.1.0.tgz", + "integrity": "sha1-MkYU9uM0kMN//Fvlh2s+hf4iPIQ=" }, "keyboardevents-areequal": { "version": "0.2.2", - "resolved": "http://r.cnpmjs.org/keyboardevents-areequal/download/keyboardevents-areequal-0.2.2.tgz", + "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", "integrity": "sha1-iBkexzjOn3WRwl6QVt6Si0AncZQ=" }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha1-BWnWV0ZkkSg3CWY603mpm5DZq0c=" + }, + "modify-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", + "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" + }, "ms": { "version": "2.0.0", - "resolved": "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pupa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz", + "integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y=" + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "requires": { + "sort-keys": "1.1.2" + } + }, + "unused-filename": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz", + "integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=", + "requires": { + "modify-filename": "1.1.0", + "path-exists": "3.0.0" + } } } } diff --git a/electron/src/package.json b/electron/src/package.json index e251a4e..7eb98b1 100755 --- a/electron/src/package.json +++ b/electron/src/package.json @@ -5,7 +5,6 @@ "dependencies": { "axios": "^0.18.0", "electron-context-menu": "^0.9.1", - "electron-debug": "^1.0.1", - "electron-log": "^1.2.2" + "electron-debug": "^1.5.0" } } diff --git a/electron/src/splash/index.html b/electron/src/splash/index.html new file mode 100755 index 0000000..f09fbe7 --- /dev/null +++ b/electron/src/splash/index.html @@ -0,0 +1,44 @@ + + + + + + + + +
+
+ +
+ +
+
+
+ + diff --git a/electron/src/splash/logo-splash.png b/electron/src/splash/logo-splash.png new file mode 100755 index 0000000..6fa8dc5 Binary files /dev/null and b/electron/src/splash/logo-splash.png differ diff --git a/electron/src/splash/spinner.png b/electron/src/splash/spinner.png new file mode 100755 index 0000000..eb5f384 Binary files /dev/null and b/electron/src/splash/spinner.png differ diff --git a/electron/src/yarn.lock b/electron/src/yarn.lock deleted file mode 100755 index 9e40625..0000000 --- a/electron/src/yarn.lock +++ /dev/null @@ -1,143 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -axios@^0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102" - dependencies: - follow-redirects "^1.3.0" - is-buffer "^1.1.5" - -debug@^2.6.8: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -electron-context-menu@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/electron-context-menu/-/electron-context-menu-0.9.1.tgz#ed4df20c080491c3c996abfcb363159946a38058" - dependencies: - electron-dl "^1.2.0" - electron-is-dev "^0.1.1" - -electron-debug@^1.0.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-1.4.0.tgz#bec7005522220a9d0622153352e1bbff0f37af2e" - dependencies: - electron-is-dev "^0.3.0" - electron-localshortcut "^3.0.0" - -electron-dl@^1.2.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/electron-dl/-/electron-dl-1.10.0.tgz#f94416064056fc6f2a86ae498614c93526890af9" - dependencies: - ext-name "^5.0.0" - pupa "^1.0.0" - unused-filename "^1.0.0" - -electron-is-accelerator@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz#509e510c26a56b55e17f863a4b04e111846ab27b" - -electron-is-dev@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.1.2.tgz#8a1043e32b3a1da1c3f553dce28ce764246167e3" - -electron-is-dev@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-0.3.0.tgz#14e6fda5c68e9e4ecbeff9ccf037cbd7c05c5afe" - -electron-localshortcut@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/electron-localshortcut/-/electron-localshortcut-3.0.2.tgz#df9cebe64140f4e58b680aacb2bd6278ae38ee61" - dependencies: - debug "^2.6.8" - electron-is-accelerator "^0.1.0" - keyboardevent-from-electron-accelerator "^0.7.0" - keyboardevents-areequal "^0.2.1" - -electron-log@^1.2.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-1.3.0.tgz#d05544114b971a16c86739c79d0d236103ad0a16" - -ext-list@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37" - dependencies: - mime-db "^1.28.0" - -ext-name@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6" - dependencies: - ext-list "^2.0.0" - sort-keys-length "^1.0.0" - -follow-redirects@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" - dependencies: - debug "^3.1.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -keyboardevent-from-electron-accelerator@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-0.7.1.tgz#aedafa5cc9a3a5f3f2b7c88b2ffd4057568118e7" - -keyboardevents-areequal@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz#88191ec738ce9f7591c25e9056de928b40277194" - -mime-db@^1.28.0: - version "1.32.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" - -modify-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -pupa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-1.0.0.tgz#9a9568a5af7e657b8462a6e9d5328743560ceff6" - -sort-keys-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" - dependencies: - sort-keys "^1.0.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -unused-filename@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unused-filename/-/unused-filename-1.0.0.tgz#d340880f71ae2115ebaa1325bef05cc6684469c6" - dependencies: - modify-filename "^1.1.0" - path-exists "^3.0.0" diff --git a/electron/yarn.lock b/electron/yarn.lock deleted file mode 100755 index d6df536..0000000 --- a/electron/yarn.lock +++ /dev/null @@ -1,1794 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"7zip-bin-linux@~1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/7zip-bin-linux/-/7zip-bin-linux-1.3.1.tgz#4856db1ab1bf5b6ee8444f93f5a8ad71446d00d5" - -"7zip-bin-mac@~1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/7zip-bin-mac/-/7zip-bin-mac-1.0.1.tgz#3e68778bbf0926adc68159427074505d47555c02" - -"7zip-bin-win@~2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/7zip-bin-win/-/7zip-bin-win-2.1.1.tgz#8acfc28bb34e53a9476b46ae85a97418e6035c20" - -"7zip-bin@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-2.4.1.tgz#88cf99736d35b104dab1d430c4edd1d51e58aade" - optionalDependencies: - "7zip-bin-linux" "~1.3.1" - "7zip-bin-mac" "~1.0.1" - "7zip-bin-win" "~2.1.1" - -"@types/node@^8.0.24": - version "8.5.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.9.tgz#7155cfb4ae405bca4dd8df1a214c339e939109bf" - -ajv-keywords@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/ajv-keywords/download/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" - -ajv@^5.1.0: - version "5.2.3" - resolved "http://r.cnpmjs.org/ajv/download/ajv-5.2.3.tgz#c06f598778c44c6b161abafe3466b81ad1814ed2" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - json-schema-traverse "^0.3.0" - json-stable-stringify "^1.0.1" - -ajv@^5.5.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/ansi-align/download/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "http://r.cnpmjs.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^3.1.0: - version "3.2.0" - resolved "http://r.cnpmjs.org/ansi-styles/download/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" - -argparse@^1.0.7: - version "1.0.9" - resolved "http://r.cnpmjs.org/argparse/download/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "http://r.cnpmjs.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -asar-integrity@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asar-integrity/-/asar-integrity-0.2.4.tgz#b7867c9720e08c461d12bc42f005c239af701733" - dependencies: - bluebird-lst "^1.0.5" - fs-extra-p "^4.5.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "http://r.cnpmjs.org/asn1/download/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -async-exit-hook@^2.0.1: - version "2.0.1" - resolved "http://r.cnpmjs.org/async-exit-hook/download/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" - -asynckit@^0.4.0: - version "0.4.0" - resolved "http://r.cnpmjs.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "http://r.cnpmjs.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.6.0: - version "1.6.0" - resolved "http://r.cnpmjs.org/aws4/download/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/base64-js/download/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "http://r.cnpmjs.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -bluebird-lst@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.5.tgz#bebc83026b7e92a72871a3dc599e219cbfb002a9" - dependencies: - bluebird "^3.5.1" - -bluebird@^3.5.0, bluebird@^3.5.1: - version "3.5.1" - resolved "http://r.cnpmjs.org/bluebird/download/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -boom@4.x.x: - version "4.3.1" - resolved "http://r.cnpmjs.org/boom/download/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "http://r.cnpmjs.org/boom/download/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - -boxen@^1.2.1: - version "1.2.1" - resolved "http://r.cnpmjs.org/boxen/download/boxen-1.2.1.tgz#0f11e7fe344edb9397977fc13ede7f64d956481d" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^1.0.0" - -brace-expansion@^1.1.7: - version "1.1.8" - resolved "http://r.cnpmjs.org/brace-expansion/download/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -builder-util-runtime@4.0.3, builder-util-runtime@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-4.0.3.tgz#c9f1959598e3fb534cdbe9ce4160e985af11a0fe" - dependencies: - bluebird-lst "^1.0.5" - debug "^3.1.0" - fs-extra-p "^4.5.0" - sax "^1.2.4" - -builder-util@4.2.1, builder-util@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-4.2.1.tgz#ca9f0ddb5af1da5fe432129f7c6cbd447b552016" - dependencies: - "7zip-bin" "^2.4.1" - bluebird-lst "^1.0.5" - builder-util-runtime "^4.0.3" - chalk "^2.3.0" - debug "^3.1.0" - fs-extra-p "^4.5.0" - ini "^1.3.5" - is-ci "^1.1.0" - js-yaml "^3.10.0" - lazy-val "^1.0.3" - semver "^5.5.0" - source-map-support "^0.5.1" - stat-mode "^0.2.2" - temp-file "^3.1.1" - tunnel-agent "^0.6.0" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "http://r.cnpmjs.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "http://r.cnpmjs.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "http://r.cnpmjs.org/camelcase/download/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/capture-stack-trace/download/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.12.0: - version "0.12.0" - resolved "http://r.cnpmjs.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -chalk@^2.0.1: - version "2.1.0" - resolved "http://r.cnpmjs.org/chalk/download/chalk-2.1.0.tgz#ac5becf14fa21b99c6c92ca7a7d7cfd5b17e743e" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chromium-pickle-js@^0.2.0: - version "0.2.0" - resolved "http://r.cnpmjs.org/chromium-pickle-js/download/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" - -ci-info@^1.0.0: - version "1.1.1" - resolved "http://r.cnpmjs.org/ci-info/download/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/cli-boxes/download/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -cliui@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "http://r.cnpmjs.org/co/download/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -color-convert@^1.9.0: - version "1.9.0" - resolved "http://r.cnpmjs.org/color-convert/download/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" - dependencies: - color-name "^1.1.1" - -color-convert@~0.5.0: - version "0.5.3" - resolved "http://r.cnpmjs.org/color-convert/download/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" - -color-name@^1.1.1: - version "1.1.3" - resolved "http://r.cnpmjs.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "http://r.cnpmjs.org/combined-stream/download/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -compare-version@^0.1.2: - version "0.1.2" - resolved "http://r.cnpmjs.org/compare-version/download/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" - -concat-map@0.0.1: - version "0.0.1" - resolved "http://r.cnpmjs.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@1.6.0: - version "1.6.0" - resolved "http://r.cnpmjs.org/concat-stream/download/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^3.0.0: - version "3.1.1" - resolved "http://r.cnpmjs.org/configstore/download/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "http://r.cnpmjs.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "http://r.cnpmjs.org/create-error-class/download/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "http://r.cnpmjs.org/cross-spawn/download/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cryptiles@3.x.x: - version "3.1.2" - resolved "http://r.cnpmjs.org/cryptiles/download/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/crypto-random-string/download/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "http://r.cnpmjs.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "http://r.cnpmjs.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -debug@2.2.0: - version "2.2.0" - resolved "http://r.cnpmjs.org/debug/download/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: - version "2.6.9" - resolved "http://r.cnpmjs.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.0.0, debug@^3.1.0: - version "3.1.0" - resolved "http://r.cnpmjs.org/debug/download/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "http://r.cnpmjs.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "http://r.cnpmjs.org/deep-extend/download/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -dmg-builder@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-3.1.3.tgz#aa296f4be369e7ff013e67923adc70258bc0a510" - dependencies: - bluebird-lst "^1.0.5" - builder-util "^4.2.1" - fs-extra-p "^4.5.0" - iconv-lite "^0.4.19" - js-yaml "^3.10.0" - parse-color "^1.0.0" - -dot-prop@^4.1.0: - version "4.2.0" - resolved "http://r.cnpmjs.org/dot-prop/download/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - dependencies: - is-obj "^1.0.0" - -dotenv-expand@^4.0.1: - version "4.0.1" - resolved "http://r.cnpmjs.org/dotenv-expand/download/dotenv-expand-4.0.1.tgz#68fddc1561814e0a10964111057ff138ced7d7a8" - -dotenv@^4.0.0: - version "4.0.0" - resolved "http://r.cnpmjs.org/dotenv/download/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "http://r.cnpmjs.org/duplexer3/download/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "http://r.cnpmjs.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ejs@^2.5.7: - version "2.5.7" - resolved "http://r.cnpmjs.org/ejs/download/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" - -electron-builder-lib@19.55.2: - version "19.55.2" - resolved "https://registry.yarnpkg.com/electron-builder-lib/-/electron-builder-lib-19.55.2.tgz#9808495613cd947a0d1abf83b962c16da6402f9c" - dependencies: - "7zip-bin" "^2.4.1" - asar-integrity "0.2.4" - async-exit-hook "^2.0.1" - bluebird-lst "^1.0.5" - builder-util "4.2.1" - builder-util-runtime "4.0.3" - chromium-pickle-js "^0.2.0" - debug "^3.1.0" - dmg-builder "3.1.3" - ejs "^2.5.7" - electron-osx-sign "0.4.8" - electron-publish "19.55.2" - fs-extra-p "^4.5.0" - hosted-git-info "^2.5.0" - is-ci "^1.1.0" - isbinaryfile "^3.0.2" - js-yaml "^3.10.0" - lazy-val "^1.0.3" - minimatch "^3.0.4" - normalize-package-data "^2.4.0" - plist "^2.1.0" - read-config-file "2.1.1" - sanitize-filename "^1.6.1" - semver "^5.5.0" - temp-file "^3.1.1" - -electron-builder@^19.55.0: - version "19.55.2" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-19.55.2.tgz#af709037a97e85fe55cf87e87255bf96333750a3" - dependencies: - bluebird-lst "^1.0.5" - builder-util "4.2.1" - builder-util-runtime "4.0.3" - chalk "^2.3.0" - electron-builder-lib "19.55.2" - electron-download-tf "4.3.4" - fs-extra-p "^4.5.0" - is-ci "^1.1.0" - lazy-val "^1.0.3" - read-config-file "2.1.1" - sanitize-filename "^1.6.1" - update-notifier "^2.3.0" - yargs "^10.1.1" - -electron-download-tf@4.3.4: - version "4.3.4" - resolved "http://r.cnpmjs.org/electron-download-tf/download/electron-download-tf-4.3.4.tgz#b03740b2885aa2ad3f8784fae74df427f66d5165" - dependencies: - debug "^3.0.0" - env-paths "^1.0.0" - fs-extra "^4.0.1" - minimist "^1.2.0" - nugget "^2.0.1" - path-exists "^3.0.0" - rc "^1.2.1" - semver "^5.4.1" - sumchecker "^2.0.2" - -electron-download@^3.0.1: - version "3.3.0" - resolved "http://r.cnpmjs.org/electron-download/download/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" - dependencies: - debug "^2.2.0" - fs-extra "^0.30.0" - home-path "^1.0.1" - minimist "^1.2.0" - nugget "^2.0.0" - path-exists "^2.1.0" - rc "^1.1.2" - semver "^5.3.0" - sumchecker "^1.2.0" - -electron-log@^2.2.9: - version "2.2.9" - resolved "http://r.cnpmjs.org/electron-log/download/electron-log-2.2.9.tgz#e0484cb1a8a84593095e3b69f47361ae15d73bdf" - -electron-osx-sign@0.4.8: - version "0.4.8" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.8.tgz#f0b9fadded9e1e54ec35fa89877b5c6c34c7bc40" - dependencies: - bluebird "^3.5.0" - compare-version "^0.1.2" - debug "^2.6.8" - isbinaryfile "^3.0.2" - minimist "^1.2.0" - plist "^2.1.0" - -electron-publish@19.55.2: - version "19.55.2" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-19.55.2.tgz#773b6d13bc11312095848c08b3287f98c91ccc7e" - dependencies: - bluebird-lst "^1.0.5" - builder-util "^4.2.1" - builder-util-runtime "^4.0.3" - chalk "^2.3.0" - fs-extra-p "^4.5.0" - mime "^2.2.0" - -electron@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.1.tgz#19b6f39f2013e204a91a60bc3086dc7a4a07ed88" - dependencies: - "@types/node" "^8.0.24" - electron-download "^3.0.1" - extract-zip "^1.0.3" - -env-paths@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/env-paths/download/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "http://r.cnpmjs.org/error-ex/download/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es6-promise@^4.0.5: - version "4.1.1" - resolved "http://r.cnpmjs.org/es6-promise/download/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "http://r.cnpmjs.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esprima@^4.0.0: - version "4.0.0" - resolved "http://r.cnpmjs.org/esprima/download/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -execa@^0.7.0: - version "0.7.0" - resolved "http://r.cnpmjs.org/execa/download/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -extend@~3.0.1: - version "3.0.1" - resolved "http://r.cnpmjs.org/extend/download/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extract-zip@^1.0.3: - version "1.6.5" - resolved "http://r.cnpmjs.org/extract-zip/download/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" - dependencies: - concat-stream "1.6.0" - debug "2.2.0" - mkdirp "0.5.0" - yauzl "2.4.1" - -extsprintf@1.3.0, extsprintf@^1.2.0: - version "1.3.0" - resolved "http://r.cnpmjs.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/fd-slicer/download/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "http://r.cnpmjs.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "http://r.cnpmjs.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.3.1: - version "2.3.1" - resolved "http://r.cnpmjs.org/form-data/download/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -fs-extra-p@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/fs-extra-p/-/fs-extra-p-4.5.0.tgz#b79f3f3fcc0b5e57b7e7caeb06159f958ef15fe8" - dependencies: - bluebird-lst "^1.0.5" - fs-extra "^5.0.0" - -fs-extra@^0.30.0: - version "0.30.0" - resolved "http://r.cnpmjs.org/fs-extra/download/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^4.0.1: - version "4.0.2" - resolved "http://r.cnpmjs.org/fs-extra/download/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "http://r.cnpmjs.org/get-caller-file/download/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "http://r.cnpmjs.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^3.0.0: - version "3.0.0" - resolved "http://r.cnpmjs.org/get-stream/download/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -getpass@^0.1.1: - version "0.1.7" - resolved "http://r.cnpmjs.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob@^7.0.5: - version "7.1.2" - resolved "http://r.cnpmjs.org/glob/download/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.0: - version "0.1.0" - resolved "http://r.cnpmjs.org/global-dirs/download/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" - dependencies: - ini "^1.3.4" - -got@^6.7.1: - version "6.7.1" - resolved "http://r.cnpmjs.org/got/download/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "http://r.cnpmjs.org/graceful-fs/download/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -har-schema@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~5.0.3: - version "5.0.3" - resolved "http://r.cnpmjs.org/har-validator/download/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -has-flag@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/has-flag/download/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -hawk@~6.0.2: - version "6.0.2" - resolved "http://r.cnpmjs.org/hawk/download/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - -hoek@4.x.x: - version "4.2.0" - resolved "http://r.cnpmjs.org/hoek/download/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - -home-path@^1.0.1: - version "1.0.5" - resolved "http://r.cnpmjs.org/home-path/download/home-path-1.0.5.tgz#788b29815b12d53bacf575648476e6f9041d133f" - -hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: - version "2.5.0" - resolved "http://r.cnpmjs.org/hosted-git-info/download/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -http-signature@~1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -iconv-lite@^0.4.19: - version "0.4.19" - resolved "http://r.cnpmjs.org/iconv-lite/download/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/import-lazy/download/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "http://r.cnpmjs.org/imurmurhash/download/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "http://r.cnpmjs.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "http://r.cnpmjs.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "http://r.cnpmjs.org/ini/download/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "http://r.cnpmjs.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-ci@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-finite@^1.0.0: - version "1.0.2" - resolved "http://r.cnpmjs.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-installed-globally@^0.1.0: - version "0.1.0" - resolved "http://r.cnpmjs.org/is-installed-globally/download/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-npm/download/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-obj@^1.0.0: - version "1.0.1" - resolved "http://r.cnpmjs.org/is-obj/download/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-path-inside/download/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-redirect/download/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/is-retry-allowed/download/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/is-stream/download/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "http://r.cnpmjs.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -isarray@0.0.1: - version "0.0.1" - resolved "http://r.cnpmjs.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@~1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isbinaryfile@^3.0.2: - version "3.0.2" - resolved "http://r.cnpmjs.org/isbinaryfile/download/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - -isexe@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isstream@~0.1.2: - version "0.1.2" - resolved "http://r.cnpmjs.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -js-yaml@^3.10.0: - version "3.10.0" - resolved "http://r.cnpmjs.org/js-yaml/download/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "http://r.cnpmjs.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "http://r.cnpmjs.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "http://r.cnpmjs.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/json-stable-stringify/download/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "http://r.cnpmjs.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json5@^0.5.1: - version "0.5.1" - resolved "http://r.cnpmjs.org/json5/download/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^2.1.0: - version "2.4.0" - resolved "http://r.cnpmjs.org/jsonfile/download/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "http://r.cnpmjs.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "http://r.cnpmjs.org/jsonify/download/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "http://r.cnpmjs.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -klaw@^1.0.0: - version "1.3.1" - resolved "http://r.cnpmjs.org/klaw/download/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" - -latest-version@^3.0.0: - version "3.1.0" - resolved "http://r.cnpmjs.org/latest-version/download/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - -lazy-val@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.3.tgz#bb97b200ef00801d94c317e29dc6ed39e31c5edc" - -lcid@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "http://r.cnpmjs.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/lowercase-keys/download/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@^4.0.1: - version "4.1.1" - resolved "http://r.cnpmjs.org/lru-cache/download/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/make-dir/download/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - dependencies: - pify "^2.3.0" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -mem@^1.1.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/mem/download/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -meow@^3.1.0: - version "3.7.0" - resolved "http://r.cnpmjs.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -mime-db@~1.30.0: - version "1.30.0" - resolved "http://r.cnpmjs.org/mime-db/download/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.17" - resolved "http://r.cnpmjs.org/mime-types/download/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -mime@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.2.0.tgz#161e541965551d3b549fa1114391e3a3d55b923b" - -mimic-fn@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/mimic-fn/download/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" - -minimatch@^3.0.4: - version "3.0.4" - resolved "http://r.cnpmjs.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "http://r.cnpmjs.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mkdirp@0.5.0: - version "0.5.0" - resolved "http://r.cnpmjs.org/mkdirp/download/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - -ms@0.7.1: - version "0.7.1" - resolved "http://r.cnpmjs.org/ms/download/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: - version "2.4.0" - resolved "http://r.cnpmjs.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "http://r.cnpmjs.org/npm-run-path/download/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -nugget@^2.0.0, nugget@^2.0.1: - version "2.0.1" - resolved "http://r.cnpmjs.org/nugget/download/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" - dependencies: - debug "^2.1.3" - minimist "^1.1.0" - pretty-bytes "^1.0.2" - progress-stream "^1.1.0" - request "^2.45.0" - single-line-log "^1.1.2" - throttleit "0.0.2" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "http://r.cnpmjs.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.2: - version "0.8.2" - resolved "http://r.cnpmjs.org/oauth-sign/download/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^4.0.1: - version "4.1.1" - resolved "http://r.cnpmjs.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-keys@~0.4.0: - version "0.4.0" - resolved "http://r.cnpmjs.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - -once@^1.3.0: - version "1.4.0" - resolved "http://r.cnpmjs.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -os-locale@^2.0.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/os-locale/download/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/p-finally/download/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-limit@^1.1.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/p-limit/download/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - -p-locate@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -package-json@^4.0.0: - version "4.0.1" - resolved "http://r.cnpmjs.org/package-json/download/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parse-color@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/parse-color/download/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" - dependencies: - color-convert "~0.5.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "http://r.cnpmjs.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -path-exists@^2.0.0, path-exists@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "http://r.cnpmjs.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "http://r.cnpmjs.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "http://r.cnpmjs.org/path-is-inside/download/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - version "2.0.1" - resolved "http://r.cnpmjs.org/path-key/download/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-type@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pend@~1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "http://r.cnpmjs.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "http://r.cnpmjs.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "http://r.cnpmjs.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -plist@^2.1.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/plist/download/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" - dependencies: - base64-js "1.2.0" - xmlbuilder "8.2.2" - xmldom "0.1.x" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "http://r.cnpmjs.org/prepend-http/download/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -pretty-bytes@^1.0.2: - version "1.0.4" - resolved "http://r.cnpmjs.org/pretty-bytes/download/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" - dependencies: - get-stdin "^4.0.1" - meow "^3.1.0" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "http://r.cnpmjs.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -progress-stream@^1.1.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/progress-stream/download/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" - dependencies: - speedometer "~0.1.2" - through2 "~0.2.3" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "http://r.cnpmjs.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "http://r.cnpmjs.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.5.1: - version "6.5.1" - resolved "http://r.cnpmjs.org/qs/download/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.2.1: - version "1.2.1" - resolved "http://r.cnpmjs.org/rc/download/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-config-file@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-config-file/-/read-config-file-2.1.1.tgz#bd6c2b93e97a82a35f71a3c9eb43161e16692054" - dependencies: - ajv "^5.5.0" - ajv-keywords "^2.1.0" - bluebird-lst "^1.0.5" - dotenv "^4.0.0" - dotenv-expand "^4.0.1" - fs-extra-p "^4.5.0" - js-yaml "^3.10.0" - json5 "^0.5.1" - lazy-val "^1.0.3" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "http://r.cnpmjs.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^2.2.2: - version "2.3.3" - resolved "http://r.cnpmjs.org/readable-stream/download/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "http://r.cnpmjs.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -redent@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -registry-auth-token@^3.0.1: - version "3.3.1" - resolved "http://r.cnpmjs.org/registry-auth-token/download/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "http://r.cnpmjs.org/registry-url/download/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -repeating@^2.0.0: - version "2.0.1" - resolved "http://r.cnpmjs.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request@^2.45.0: - version "2.83.0" - resolved "http://r.cnpmjs.org/request/download/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "http://r.cnpmjs.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/require-main-filename/download/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -rimraf@^2.2.8: - version "2.6.2" - resolved "http://r.cnpmjs.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "http://r.cnpmjs.org/safe-buffer/download/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -sanitize-filename@^1.6.1: - version "1.6.1" - resolved "http://r.cnpmjs.org/sanitize-filename/download/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" - dependencies: - truncate-utf8-bytes "^1.0.0" - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/semver-diff/download/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: - version "5.4.1" - resolved "http://r.cnpmjs.org/semver/download/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/shebang-regex/download/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "http://r.cnpmjs.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -single-line-log@^1.1.2: - version "1.1.2" - resolved "http://r.cnpmjs.org/single-line-log/download/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" - dependencies: - string-width "^1.0.1" - -sntp@2.x.x: - version "2.0.2" - resolved "http://r.cnpmjs.org/sntp/download/sntp-2.0.2.tgz#5064110f0af85f7cfdb7d6b67a40028ce52b4b2b" - dependencies: - hoek "4.x.x" - -source-map-support@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" - dependencies: - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "http://r.cnpmjs.org/source-map/download/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "http://r.cnpmjs.org/spdx-correct/download/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "http://r.cnpmjs.org/spdx-expression-parse/download/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "http://r.cnpmjs.org/spdx-license-ids/download/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -speedometer@~0.1.2: - version "0.1.4" - resolved "http://r.cnpmjs.org/speedometer/download/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "http://r.cnpmjs.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "http://r.cnpmjs.org/sshpk/download/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stat-mode@^0.2.2: - version "0.2.2" - resolved "http://r.cnpmjs.org/stat-mode/download/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -string-width@^1.0.1: - version "1.0.2" - resolved "http://r.cnpmjs.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "http://r.cnpmjs.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "http://r.cnpmjs.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "http://r.cnpmjs.org/string_decoder/download/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.5: - version "0.0.5" - resolved "http://r.cnpmjs.org/stringstream/download/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "http://r.cnpmjs.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/strip-eof/download/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "http://r.cnpmjs.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "http://r.cnpmjs.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -sumchecker@^1.2.0: - version "1.3.1" - resolved "http://r.cnpmjs.org/sumchecker/download/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" - dependencies: - debug "^2.2.0" - es6-promise "^4.0.5" - -sumchecker@^2.0.2: - version "2.0.2" - resolved "http://r.cnpmjs.org/sumchecker/download/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - dependencies: - debug "^2.2.0" - -supports-color@^4.0.0: - version "4.4.0" - resolved "http://r.cnpmjs.org/supports-color/download/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" - dependencies: - has-flag "^2.0.0" - -temp-file@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.1.1.tgz#8823649aa4e8a6e419eb71b601a2e4d472b0f24f" - dependencies: - async-exit-hook "^2.0.1" - bluebird-lst "^1.0.5" - fs-extra-p "^4.5.0" - lazy-val "^1.0.3" - -term-size@^1.2.0: - version "1.2.0" - resolved "http://r.cnpmjs.org/term-size/download/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - dependencies: - execa "^0.7.0" - -throttleit@0.0.2: - version "0.0.2" - resolved "http://r.cnpmjs.org/throttleit/download/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" - -through2@~0.2.3: - version "0.2.3" - resolved "http://r.cnpmjs.org/through2/download/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" - dependencies: - readable-stream "~1.1.9" - xtend "~2.1.1" - -timed-out@^4.0.0: - version "4.0.1" - resolved "http://r.cnpmjs.org/timed-out/download/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -tough-cookie@~2.3.3: - version "2.3.3" - resolved "http://r.cnpmjs.org/tough-cookie/download/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -truncate-utf8-bytes@^1.0.0: - version "1.0.2" - resolved "http://r.cnpmjs.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" - dependencies: - utf8-byte-length "^1.0.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "http://r.cnpmjs.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "http://r.cnpmjs.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -typedarray@^0.0.6: - version "0.0.6" - resolved "http://r.cnpmjs.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -unique-string@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/unique-string/download/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -universalify@^0.1.0: - version "0.1.1" - resolved "http://r.cnpmjs.org/universalify/download/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "http://r.cnpmjs.org/unzip-response/download/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -update-notifier@^2.3.0: - version "2.3.0" - resolved "http://r.cnpmjs.org/update-notifier/download/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/url-parse-lax/download/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -utf8-byte-length@^1.0.1: - version "1.0.4" - resolved "http://r.cnpmjs.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "http://r.cnpmjs.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -uuid@^3.1.0: - version "3.1.0" - resolved "http://r.cnpmjs.org/uuid/download/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "http://r.cnpmjs.org/validate-npm-package-license/download/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.10.0: - version "1.10.0" - resolved "http://r.cnpmjs.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -which-module@^2.0.0: - version "2.0.0" - resolved "http://r.cnpmjs.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@^1.2.9: - version "1.3.0" - resolved "http://r.cnpmjs.org/which/download/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -widest-line@^1.0.0: - version "1.0.0" - resolved "http://r.cnpmjs.org/widest-line/download/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "http://r.cnpmjs.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "http://r.cnpmjs.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^2.0.0: - version "2.3.0" - resolved "http://r.cnpmjs.org/write-file-atomic/download/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "http://r.cnpmjs.org/xdg-basedir/download/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - -xmlbuilder@8.2.2: - version "8.2.2" - resolved "http://r.cnpmjs.org/xmlbuilder/download/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - -xmldom@0.1.x: - version "0.1.27" - resolved "http://r.cnpmjs.org/xmldom/download/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - -xtend@~2.1.1: - version "2.1.2" - resolved "http://r.cnpmjs.org/xtend/download/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" - -y18n@^3.2.1: - version "3.2.1" - resolved "http://r.cnpmjs.org/y18n/download/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "http://r.cnpmjs.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs@^10.1.1: - version "10.1.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - -yauzl@2.4.1: - version "2.4.1" - resolved "http://r.cnpmjs.org/yauzl/download/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - dependencies: - fd-slicer "~1.0.1" diff --git a/fiber.toml b/fiber.toml new file mode 100755 index 0000000..7dd5f51 --- /dev/null +++ b/fiber.toml @@ -0,0 +1,138 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "b248bf0606c85c87d86fe61f0645b98a30ccf213dbe221004b1a1898423215664cf0b094e18cb2a7f4c6ce113d4544891c2c876f8a6d69de98a9ae92b49a6c6501" +genesis_address_str = "2FiHFKWKqhnDCio47z9Q2o28qWF3yePUCg7" +blockchain_pubkey_str = "02ae5c7701dcd71e7448116e5766130f2eacecc585f3e320b1d85f2951382a424a" +blockchain_seckey_str = "" +genesis_timestamp = 1530619056 +# genesis_coin_volume = 100e12 +default_connections = [ +"139.162.161.41:9610", +"139.162.7.215:9610", +"139.162.7.215:9611", +"139.162.7.215:9612", +"18.218.142.16:9600", +"178.79.170.194:9600", +"13.58.196.172:9600", +] +peer_list_url = "https://distributedblocks.com/peers.txt" +#port = 9600 +#web_interface_port = 9620 + +[build] +version = "0.24.1" +#build = "" +#commit = "" + +[visor] +max_coin_supply = 1e8 +distribution_addresses_total = 100 +initial_unlocked_count = 100 +unlock_addresss_rate = 0 +unlocked_time_internal = 60 * 60 * 24 * 365 +max_droplet_precision = 3 +default_max_block_size = 32 * 1024 +distribution_addresses = [ + "23bNjBuUQEfhGdWZNiwb2f7Mu47xyiudYET", +"MYL1eQk3CAJvxQoXjfPmprhSiP73svL1XS", +"2Nm4oJ96Sb629114ERPi7tqEvpBDgt92tyF", +"2SJo7pXfY2w7k4SwmNsjb7Jy2B1vz4BEWHC", +"FWiv9GmDsZR7rtfXYtWPybyVT1iKKFu6GB", +"28cuBTUnfB5MeFGcqtmzb9gTh4zUfKzVVDK", +"5NWMnPw1mMcJRJdAhYkfzUo5uDNUcrgNN1", +"JEACD2rBDGvYcE8qNxYEFDJEE1dexhFhjE", +"2fDUoJzsddK2k8X1Y6QbFisxKFMRjNwErNB", +"uEEo7KrSBYUZjYSvY8Z9PLCLDJBxTFheQv", +"2TPcUbKzfeNWDXAYowJCybDZGiRgw32kgMK", +"WpSSxNVMVfWFimNcTGfgEA3AVCNrchDvfr", +"2N7p2MVvXbr9PbwQWGk7rGG6H2M9riGQcUB", +"yqoecGz1LBz3wQdtPJVHnuZX1EY6hVMjFq", +"2WH6cQa4LirnwUKnJkTmsNpyZLMXEwy4UjS", +"n1nuPRHjtHrmM2yGKm2Uz5AhKmKT8JTX7p", +"yhTPvq73ezReis3dZPA5YpzNnxHzHTkALB", +"2QCdCYmEZZYrhvcoms8qJmW57hfbPBEBwXL", +"2X3L48KCcHi2y5xpvnQC21x1PDPN6QLqzRJ", +"HFrbigTAqNc4n51YFAQ8ta8Ey3XqmpHqPJ", +"2W59hCZeqc1kURS1hKq9Swyjmf535DcbwBE", +"hNdDNtak3JYnpdRapoQZtT1mBJt56uMg6q", +"VPTBXcHsSY6ExfXkEvmFVvkYeLsJp7RdME", +"2LmPHmsKpS83g4QHfMvxvTHqc6GcYumfJvT", +"2cHn2Z3uPmraS8cGRcQeeZv2QbkFhKCmT1C", +"2XzE3ec6WNSPTo8WFkHYHjCp8NZzMT2VPfp", +"BaCCBy6eACE7ZgdT38TmU9n6TwTFW7agWn", +"W93CcpUmAwyyWJfaoz86vJuQbTXHMUXX9s", +"PdTiWAxjNc54D5GZoyF1qqfU71qXUyEeth", +"2WTKLguHpfJxm7Jc7HDdEMFww8Ssf4TC93h", +"23G1k2fYwQYqY9ACkeukWEhbpMx62auamYF", +"D91krziPz4snSRvkdaDX939FVBHA1fiwUa", +"J9hgP4iJ9femPEmrQU1NovMaG4qBQjQ92x", +"i3aRzqgjivBZeX2wFhazXqQAfSwzWXHLZD", +"26VWjg4x3wSEHE1vK1FyTUHfcBbS8gp8dsT", +"8UchvQEBBEytxndRTpXG3T32k3aPykqpfd", +"kPutyqB4usBsiDyqjDYyB8PeKFsJPZBsY4", +"2T64cBRvZrfw2fHXDYhT2QtvJtCBEAw4xbb", +"gASYNqkQwT4b1uJu5nhFqQzaEYiUYMXKhW", +"2HAFcb7dkSSEirBb8S8DBoz2yt8MxPSFyxZ", +"2Vm1K3yvRqXVxg3TGBvryvHHGhL18GmyUd9", +"GJPHA5ELhcqvdvtSs942bfXq5aeaqD31d3", +"TfaH8cLx92yZ8Czq2JVozxvCAzX8ToksMy", +"T2yhCt8NQf8z4PztyXbe3XGjwJjggz8cYD", +"2GGURjuGfwmsUpxtKqBvXaYtqTd91qqLU15", +"BKq56WV5iWjvE4Ch47rKfN6FqhqBa76BS9", +"2DpCcC64JX5hbV7wdz1hxTQjbkcTEi2Ty4V", +"2TroiWS4uB6hy8xW69XY7PRdk1Jubc654SZ", +"2nZNjwyV8gy91V3U4eyiAssdc7Ls7BNjSq", +"5ecmCxF7zWyx97KoSbGPLLXxVsfXFkVQoz", +"2Ve67p5a8VuesR9QJakQfmBKbuB2E3YXfiZ", +"xxYvUHJXZ7huisjkBC3TqKjaZqxJyataKq", +"BcZKm3CMwaJ611RDLQm2sv3EhDKiqbwebX", +"LS8SdBCpMW6dGKYNMZhUvTSFL8KgGFes4a", +"2KwE6a518EN3WyufuJsZj2M6T2nVcW8x1xb", +"21ijQHwFuYuWn3oiP5YeiQDCLyBswphyqsj", +"2YrexqhQbuzy57u2MdQAa4zRM7TcvyWEkdQ", +"ptKy9M67zTWX8uA84UqQ9h1pNgTwHmHejD", +"2kwYYHt5rCEbTCAsJ8D4pEbb8CiyqjXFSri", +"2hF9FsnqPR4H2bT5MasWo7QqWfAuLx1dxb5", +"WMVV8pxc5iswLepL89npQaMnC7aoqryN4F", +"28YYCP7mV1DfMLiGmf1ZAyr1AeiZmehBnsX", +"2JN5JigTv9Mb6kUBbPXydEBhMXEsvf32VJk", +"qP3cGCvVXykvkhEXVjXssrpxCLV5MhTAMJ", +"2MJNzJU17LTdbDmm84gLR2qTNk4San1DJJY", +"92nifkaphsBkZ9VRgktkEqqSGkroDaNRhQ", +"cnC5mTDjQMPnmv6jzSkDqdPjrpNRVVsfNB", +"2SQ2ZYp6eNtxUitRhnHgmsGqg3Ve4YEFYbC", +"2RDu9UT49XuzVyBe67zBqxQR5cAt2t2KkRi", +"d2GEgVr1EkCjC664MqL9Mx1AtWscvk9VXP", +"22znryMC36GVJkoDtruxDvUfP6rFQbF6zob", +"289i7SnAzPqtuVXWkFVBQyWiLZhZygXhmSG", +"2e32aNdnZ63NHMasvxkE3b5cGvre1CACExQ", +"jX3xJjitR8nBtWJXG4Q4wLKctq7SwCqxRy", +"QfySmE5E9NyuYJ5xSJ1NLqjx9EQ6X9UZvK", +"S7fksUk2bgueUTQ1oWEi4S7CtfPE4ALnuL", +"2dLV4qmJEu5BcBNNjy7nxsyxSQTLW8W87uu", +"U7FMBy5D81uWuE5yfFWg5R9VufokDt8zmz", +"2M4KAUsKzPrkoGuSTa9vXTqRKH7h3b25MfB", +"22pGBTfcpNcGgnQsY8wHXDaUCYp1THPHDbd", +"PKhPArP4Yy1s9nKta2LfZVuFBJoYFFgLPq", +"2QmUP7AL3W8eVW9j9AgxKxXe8iqYELV7Lu8", +"pdRYWyjpaSaRswx33wzWCPdwAeWcPvvRq1", +"2f75891emB82nZmrkrjRok7U5XJrATR1LCb", +"wxEKdg6AcTp7Ueo1isnbR4EKi9ufR5JTPa", +"z4Es9X7xvtuB1qfV5CZT5JG1p2GxAgrnko", +"2ZpnnkTSVvaA9ENWFNyXJWycrRiEntroJaJ", +"2W1VPJLs8yXpXuXPcZcAzEtrW5p2pbKFYCD", +"2Hcokk8EjjcSXGvHgRzsQ8SyswCPthWu9Lc", +"GjaWu68GcnsxtnTpsaRwqhBCRP6ApDhEwX", +"2MTmVkCfkbSbf2WFF7wD5wSoBk3TosX6LbN", +"heLVT5819tVrSy4VZ2G9rVkpKLojNLGjT1", +"28bShKHnV4W8qRZti8uE63HaCdb4jKTqKqp", +"3nTkzrxENBvu53qvgxbiLN55yP7Wf5v8b5", +"2HcXd1p9yBtnYSgRJ5KkBNe3nc2MKKb8EJf", +"vmzDMTohNYVJP6PQJhrrcSeaCzRbDELpQs", +"2PVzujZpkZsayMTMLBphSNdUPp3DPG2eKv3", +"2msYoM9CnJwHX7W9th85CYoXbL61jyCCTkF", +"2Hpw5t4MSnNoFiFgHXKjWuszdVJFuMkfM3S", +"2YuyJoUsRXSj2J7LHL52zDTdveWzkj8eywT", +] diff --git a/gz-c.asc b/gz-c.asc new file mode 100755 index 0000000..dc1d968 --- /dev/null +++ b/gz-c.asc @@ -0,0 +1,13 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mDMEWaj46RYJKwYBBAHaRw8BAQdApB44Kgde4Kiax3M9Ta+QbzKQQPoUHYP51fhN +1XTSbRi0I0daLUMgU0tZQ09JTiA8dG9rZW5AcHJvdG9ubWFpbC5jb20+iJYEExYK +AD4CGwMFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AWIQQQpyK3by/+e9I4AiJYAWMb +0nx4dAUCWq/TNwUJCmzbzgAKCRBYAWMb0nx4dKzqAP4tKJIk1vV2bO60nYdEuFB8 +FAgb5ITlkj9PyoXcunETVAEAhigo4miyE/nmE9JT3Q/ZAB40YXS6w3hWSl3YOF1P +VQq4OARZqPjpEgorBgEEAZdVAQUBAQdAa8NkEMxo0dr2x9PlNjTZ6/gGwhaf5OEG +t2sLnPtYxlcDAQgHiH4EGBYKACYCGwwWIQQQpyK3by/+e9I4AiJYAWMb0nx4dAUC +Wq/TTQUJCmzb5AAKCRBYAWMb0nx4dFPAAQD7otGsKbV70UopH+Xdq0CDTzWRbaGw +FAoZLIZRcFv8zwD/Z3i9NjKJ8+LS5oc8rn8yNx8xRS+8iXKQq55bDmz7Igw= +=5fwW +-----END PGP PUBLIC KEY BLOCK----- diff --git a/include/base64.h b/include/base64.h new file mode 100755 index 0000000..75211cc --- /dev/null +++ b/include/base64.h @@ -0,0 +1,45 @@ +/* +base64.c - by Joe DF (joedf@ahkscript.org) +Released under the MIT License + +Revision: 2015-06-12 01:26:51 + +Thank you for inspiration: +http://www.codeproject.com/Tips/813146/Fast-base-functions-for-encode-decode +*/ + +#include + +//Base64 char table function - used internally for decoding +unsigned int b64_int(unsigned int ch); + +// in_size : the number bytes to be encoded. +// Returns the recommended memory size to be allocated for the output buffer excluding the null byte +unsigned int b64e_size(unsigned int in_size); + +// in_size : the number bytes to be decoded. +// Returns the recommended memory size to be allocated for the output buffer +unsigned int b64d_size(unsigned int in_size); + +// in : buffer of "raw" binary to be encoded. +// in_len : number of bytes to be encoded. +// out : pointer to buffer with enough memory, user is responsible for memory allocation, receives null-terminated string +// returns size of output including null byte +unsigned int b64_encode(const unsigned char* in, unsigned int in_len, unsigned char* out); + +// in : buffer of base64 string to be decoded. +// in_len : number of bytes to be decoded. +// out : pointer to buffer with enough memory, user is responsible for memory allocation, receives "raw" binary +// returns size of output excluding null byte +unsigned int b64_decode(const unsigned char* in, unsigned int in_len, unsigned char* out); + +// file-version b64_encode +// Input : filenames +// returns size of output +unsigned int b64_encodef(char *InFile, char *OutFile); + +// file-version b64_decode +// Input : filenames +// returns size of output +unsigned int b64_decodef(char *InFile, char *OutFile); + diff --git a/include/cipher.address.go.h b/include/cipher.address.go.h new file mode 100755 index 0000000..462feb9 --- /dev/null +++ b/include/cipher.address.go.h @@ -0,0 +1,14 @@ +/** + * Integrity checksum, 4-bytes long. + */ +typedef unsigned char cipher__Checksum[4]; + +/** + * Addresses of SKY accounts + */ +typedef struct { + unsigned char Version; ///< Address version identifier. + ///< Used to differentiate testnet + ///< vs mainnet addresses, for instance. + cipher__Ripemd160 Key; ///< Address hash identifier. +} cipher__Address; diff --git a/include/cipher.crypto.go.h b/include/cipher.crypto.go.h new file mode 100755 index 0000000..17f3923 --- /dev/null +++ b/include/cipher.crypto.go.h @@ -0,0 +1,20 @@ +/** + * Hash signed using a secret key, 65 bytes long. + */ +typedef unsigned char cipher__Sig[65]; + +/** + * Public key, 33-bytes long. + */ +typedef unsigned char cipher__PubKey[33]; + +/** + * Container type suitable for storing a variable number of + * public keys. + */ +typedef GoSlice_ cipher__PubKeySlice; + +/** + * Secret key, 32 bytes long. + */ +typedef unsigned char cipher__SecKey[32]; diff --git a/include/cipher.hash.go.h b/include/cipher.hash.go.h new file mode 100755 index 0000000..8746569 --- /dev/null +++ b/include/cipher.hash.go.h @@ -0,0 +1,9 @@ +/** + * Hash obtained using SHA256 algorithm, 32 bytes long. + */ +typedef unsigned char cipher__SHA256[32]; + +/** + * RIPEMD-160 hash. + */ +typedef unsigned char cipher__Ripemd160[20]; diff --git a/include/cipher.testsuite.testsuite.go.h b/include/cipher.testsuite.testsuite.go.h new file mode 100755 index 0000000..0802f98 --- /dev/null +++ b/include/cipher.testsuite.testsuite.go.h @@ -0,0 +1,99 @@ + +#ifndef CIPHER_TESTSUITE_TESTSUITE +#define CIPHER_TESTSUITE_TESTSUITE + +#include +#include + +#include "base64.h" +#include "json.h" +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +#define BUFFER_SIZE 1024 +#define STRING_SIZE 128 +#define JSON_FILE_SIZE 4096 +#define JSON_BIG_FILE_SIZE 32768 + +// FIXME: Does not work on e.g. Windowa +#define FILEPATH_SEPARATOR "/" +#define TEST_DATA_DIR "src/cipher/testsuite/testdata/" +#define MANY_ADDRESSES_FILENAME "many-addresses.golden" +#define INPUT_HASHES_FILENAME "input-hashes.golden" +#define SEED_FILE_REGEX "seed-\d+.golden" + +//------------------------------------------------------------------------------ +// Data types +//------------------------------------------------------------------------------ + +// InputTestData contains hashes to be signed +typedef struct { + // Slice data is an array of cipher.SHA256's + GoSlice Hashes; +} InputTestData; + +// InputTestDataJSON contains hashes to be signed +typedef struct { + // Slice data is an array of GoString's + GoSlice Hashes; +} InputTestDataJSON; + +// KeysTestData contains address, public key, secret key and list of signatures +typedef struct { + cipher__Address Address; + cipher__SecKey Secret; + cipher__PubKey Public; + // Slice data is an array of cipher.Sig's + GoSlice Signatures; +} KeysTestData; + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +typedef struct { + GoString Address; + GoString Secret; + GoString Public; + // Slice data is an array of GoString's + GoSlice Signatures; +} KeysTestDataJSON; + +// SeedTestDataJSON contains data generated by Seed +typedef struct { + GoString Seed; + // Slice data is an array of KeysTestDataJSON's + GoSlice Keys; +} SeedTestDataJSON; + +// SeedTestData contains data generated by Seed +typedef struct { + // Slice data is a bytes array buffer + GoSlice Seed; + // Slice data is an array of KeysTestData + GoSlice Keys; +} SeedTestData; + +//------------------------------------------------------------------------------ +// Functions +//------------------------------------------------------------------------------ + +json_value* loadGoldenFile(const char* file); +InputTestDataJSON* jsonToInputTestData(json_value* json, InputTestDataJSON* input_data); +InputTestData* registerInputTestDataCleanup(InputTestData* input_data); +InputTestDataJSON* registerInputTestDataJSONCleanup(InputTestDataJSON* input_data); +void InputTestDataToJSON(InputTestData* input_data, InputTestDataJSON* json_data); +GoUint32 InputTestDataFromJSON(InputTestDataJSON* json_data, InputTestData* input_data); +KeysTestDataJSON* jsonToKeysTestData(json_value* json, KeysTestDataJSON* input_data); +KeysTestData* registerKeysTestDataCleanup(KeysTestData* input_data); +KeysTestDataJSON* registerKeysTestDataJSONCleanup(KeysTestDataJSON* input_data); +void KeysTestDataToJson(KeysTestData* input_data, KeysTestDataJSON* json_data); +GoUint32 KeysTestDataFromJSON(KeysTestDataJSON* json_data, KeysTestData* input_data); +SeedTestDataJSON* jsonToSeedTestData(json_value* json, SeedTestDataJSON* input_data); +SeedTestData* registerSeedTestDataCleanup(SeedTestData* input_data); +SeedTestDataJSON* registerSeedTestDataJSONCleanup(SeedTestDataJSON* input_data); +void SeedTestDataToJson(SeedTestData* input_data, SeedTestDataJSON* json_data); +GoUint32 SeedTestDataFromJSON(SeedTestDataJSON* json_data, SeedTestData* input_data); +void ValidateSeedData(SeedTestData* seedData, InputTestData* inputData); + +#endif + diff --git a/include/cli.create_rawtx.go.h b/include/cli.create_rawtx.go.h new file mode 100755 index 0000000..48dfa5c --- /dev/null +++ b/include/cli.create_rawtx.go.h @@ -0,0 +1,7 @@ +/** + * Structure used to specify amounts transferred in a transaction. + */ +typedef struct { + GoString_ Addr; ///< Sender / receipient address. + GoInt64_ Coins; ///< Amount transferred (e.g. measured in SKY) +} cli__SendAmount; diff --git a/include/coin.outputs.go.h b/include/coin.outputs.go.h new file mode 100755 index 0000000..2893219 --- /dev/null +++ b/include/coin.outputs.go.h @@ -0,0 +1,18 @@ +typedef struct{ + GoUint64_ Time; + GoUint64_ BkSeq; +} coin__UxHead; + +typedef GoSlice_ coin__UxArray; + +typedef struct{ + cipher__SHA256 SrcTransaction; + cipher__Address Address; + GoUint64_ Coins; + GoUint64_ Hours; +} coin__UxBody; + +typedef struct{ + coin__UxHead Head; + coin__UxBody Body; +} coin__UxOut; diff --git a/include/coin.transactions.go.h b/include/coin.transactions.go.h new file mode 100755 index 0000000..0fa66ca --- /dev/null +++ b/include/coin.transactions.go.h @@ -0,0 +1,25 @@ +/** + * Skycoin transaction output. + * + * Instances are integral part of transactions included in blocks. + */ +typedef struct { + cipher__Address Address; ///< Receipient address. + GoInt64_ Coins; ///< Amount sent to the receipient address. + GoInt64_ Hours; ///< Amount of Coin Hours sent to the receipient address. +} coin__TransactionOutput; + +/** + * Skycoin transaction. + * + * Instances of this struct are included in blocks. + */ +typedef struct { + GoInt32_ Length; ///< Current transaction's length expressed in bytes. + GoInt8_ Type; ///< Transaction's version. When a node tries to process a transaction, it must verify whether it supports the transaction's type. This is intended to provide a way to update skycoin clients and servers without crashing the network. If the transaction is not compatible with the node, it should not process it. + cipher__SHA256 InnerHash; ///< It's a SHA256 hash of the inputs and outputs of the transaction. It is used to protect against transaction mutability. This means that the transaction cannot be altered after its creation. + + GoSlice_ Sigs; ///< A list of digital signiatures generated by the skycoin client using the private key. It is used by Skycoin servers to verify the authenticy of the transaction. Each input requires a different signature. + GoSlice_ In; ///< A list of references to unspent transaction outputs. Unlike other cryptocurrencies, such as Bitcoin, Skycoin unspent transaction outputs (UX) and Skycoin transactions (TX) are separated in the blockchain protocol, allowing for lighter transactions, thus reducing the broadcasting costs across the network. + GoSlice_ Out; ///< Outputs: A list of outputs created by the client, that will be recorded in the blockchain if transactions are confirmed. An output consists of a data structure representing an UTXT, which is composed by a Skycoin address to be sent to, the amount in Skycoin to be sent, and the amount of Coin Hours to be sent, and the SHA256 hash of the previous fields. +} coin__Transaction; diff --git a/include/json.h b/include/json.h new file mode 100755 index 0000000..c00193a --- /dev/null +++ b/include/json.h @@ -0,0 +1,283 @@ + +/* vim: set et ts=3 sw=3 sts=3 ft=c: + * + * Copyright (C) 2012, 2013, 2014 James McLaughlin et al. All rights reserved. + * https://github.com/udp/json-parser + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _JSON_H +#define _JSON_H + +#ifndef json_char + #define json_char char +#endif + +#ifndef json_int_t + #ifndef _MSC_VER + #include + #define json_int_t int64_t + #else + #define json_int_t __int64 + #endif +#endif + +#include + +#ifdef __cplusplus + + #include + + extern "C" + { + +#endif + +typedef struct +{ + unsigned long max_memory; + int settings; + + /* Custom allocator support (leave null to use malloc/free) + */ + + void * (* mem_alloc) (size_t, int zero, void * user_data); + void (* mem_free) (void *, void * user_data); + + void * user_data; /* will be passed to mem_alloc and mem_free */ + + size_t value_extra; /* how much extra space to allocate for values? */ + +} json_settings; + +#define json_enable_comments 0x01 + +typedef enum +{ + json_none, + json_object, + json_array, + json_integer, + json_double, + json_string, + json_boolean, + json_null + +} json_type; + +extern const struct _json_value json_value_none; + +typedef struct _json_object_entry +{ + json_char * name; + unsigned int name_length; + + struct _json_value * value; + +} json_object_entry; + +typedef struct _json_value +{ + struct _json_value * parent; + + json_type type; + + union + { + int boolean; + json_int_t integer; + double dbl; + + struct + { + unsigned int length; + json_char * ptr; /* null terminated */ + + } string; + + struct + { + unsigned int length; + + json_object_entry * values; + + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin () const + { return values; + } + decltype(values) end () const + { return values + length; + } + #endif + + } object; + + struct + { + unsigned int length; + struct _json_value ** values; + + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin () const + { return values; + } + decltype(values) end () const + { return values + length; + } + #endif + + } array; + + } u; + + union + { + struct _json_value * next_alloc; + void * object_mem; + + } _reserved; + + #ifdef JSON_TRACK_SOURCE + + /* Location of the value in the source JSON + */ + unsigned int line, col; + + #endif + + + /* Some C++ operator sugar */ + + #ifdef __cplusplus + + public: + + inline _json_value () + { memset (this, 0, sizeof (_json_value)); + } + + inline const struct _json_value &operator [] (int index) const + { + if (type != json_array || index < 0 + || ((unsigned int) index) >= u.array.length) + { + return json_value_none; + } + + return *u.array.values [index]; + } + + inline const struct _json_value &operator [] (const char * index) const + { + if (type != json_object) + return json_value_none; + + for (unsigned int i = 0; i < u.object.length; ++ i) + if (!strcmp (u.object.values [i].name, index)) + return *u.object.values [i].value; + + return json_value_none; + } + + inline operator const char * () const + { + switch (type) + { + case json_string: + return u.string.ptr; + + default: + return ""; + }; + } + + inline operator json_int_t () const + { + switch (type) + { + case json_integer: + return u.integer; + + case json_double: + return (json_int_t) u.dbl; + + default: + return 0; + }; + } + + inline operator BOOL () const + { + if (type != json_boolean) + return false; + + return u.boolean != 0; + } + + inline operator double () const + { + switch (type) + { + case json_integer: + return (double) u.integer; + + case json_double: + return u.dbl; + + default: + return 0; + }; + } + + #endif + +} json_value; + +json_value * json_parse (const json_char * json, + size_t length); + +#define json_error_max 128 +json_value * json_parse_ex (json_settings * settings, + const json_char * json, + size_t length, + char * error); + +void json_value_free (json_value *); + + +/* Not usually necessary, unless you used a custom mem_alloc and now want to + * use a custom mem_free. + */ +void json_value_free_ex (json_settings * settings, + json_value *); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif + + diff --git a/include/skycriterion.h b/include/skycriterion.h new file mode 100755 index 0000000..ecdf227 --- /dev/null +++ b/include/skycriterion.h @@ -0,0 +1,36 @@ +#ifndef LIBCRITERION_H +#define LIBCRITERION_H + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" + +extern int cr_user_cipher__Address_eq(cipher__Address *addr1, cipher__Address *addr2); +extern char *cr_user_cipher__Address_tostr(cipher__Address *addr1); +extern int cr_user_cipher__Address_noteq(cipher__Address *addr1, cipher__Address *addr2); + +extern int cr_user_GoString_eq(GoString *string1, GoString *string2); +extern int cr_user_GoString__eq(GoString_ *string1, GoString_ *string2); + +extern char *cr_user_GoString_tostr(GoString *string); +extern char *cr_user_GoString__tostr(GoString_ *string) ; + +extern int cr_user_cipher__SecKey_eq(cipher__SecKey *seckey1, cipher__SecKey *seckey2); +extern char *cr_user_cipher__SecKey_tostr(cipher__SecKey *seckey1); + +extern int cr_user_cipher__Ripemd160_noteq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2); +extern int cr_user_cipher__Ripemd160_eq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2); +extern char *cr_user_cipher__Ripemd160_tostr(cipher__Ripemd160 *rp1); + +extern int cr_user_GoSlice_eq(GoSlice *slice1, GoSlice *slice2); +extern char *cr_user_GoSlice_tostr(GoSlice *slice1); +extern int cr_user_GoSlice_noteq(GoSlice *slice1, GoSlice *slice2); + +extern int cr_user_cipher__SHA256_noteq(cipher__SHA256 *sh1, cipher__SHA256 *sh2); +extern int cr_user_cipher__SHA256_eq(cipher__SHA256 *sh1, cipher__SHA256 *sh2); +extern char *cr_user_cipher__SHA256_tostr(cipher__SHA256 *sh1); + + +#endif //LIBCRITERION_H diff --git a/include/skyerrors.h b/include/skyerrors.h new file mode 100755 index 0000000..181de4b --- /dev/null +++ b/include/skyerrors.h @@ -0,0 +1,9 @@ + +#ifndef SKY_ERRORS_H +#define SKY_ERRORS_H + +#define SKY_OK 0 +#define SKY_ERROR 0xFFFFFFFF + +#endif + diff --git a/include/skystring.h b/include/skystring.h new file mode 100755 index 0000000..b49114a --- /dev/null +++ b/include/skystring.h @@ -0,0 +1,15 @@ +#ifndef LIBSKY_STRING_H +#define LIBSKY_STRING_H + +#include +#include +#include "libskycoin.h" + +extern void randBytes(GoSlice *bytes, size_t n); + +extern void strnhex(unsigned char* buf, char *str, int n); + +extern void strhex(unsigned char* buf, char *str); + + +#endif //LIBSKY_STRING_H diff --git a/include/skytest.h b/include/skytest.h new file mode 100755 index 0000000..ebd25d9 --- /dev/null +++ b/include/skytest.h @@ -0,0 +1,48 @@ + +#include + +#include "json.h" +#include "skycriterion.h" + +#ifndef LIBSKY_TESTING_H +#define LIBSKY_TESTING_H + +/*---------------------------------------------------------------------- + * I/O + *---------------------------------------------------------------------- + */ +void fprintbuff(FILE *f, void *buff, size_t n); +json_value* loadJsonFile(const char* filename); + +/*---------------------------------------------------------------------- + * Memory handling + *---------------------------------------------------------------------- + */ +void * registerMemCleanup(void *p); +extern void toGoString(GoString_ *s, GoString *r); + +/*---------------------------------------------------------------------- + * JSON helpers + *---------------------------------------------------------------------- + */ +json_value* json_get_string(json_value* value, const char* key); +int json_set_string(json_value* value, const char* new_string_value); +int registerJsonFree(void *p); +void freeRegisteredJson(void *p); + +json_value* loadJsonFile(const char* filename); +int compareJsonValues(json_value* value1, json_value* value2); +json_value* get_json_value(json_value* node, const char* path, + json_type type); +json_value* get_json_value_not_strict(json_value* node, const char* path, + json_type type, int allow_null); + +/*---------------------------------------------------------------------- + * JSON helpers + *---------------------------------------------------------------------- + */ +void setup(void); +void teardown(void); + +#endif + diff --git a/include/skytypes.h b/include/skytypes.h new file mode 100755 index 0000000..b15d846 --- /dev/null +++ b/include/skytypes.h @@ -0,0 +1,155 @@ + +#ifndef SKYTYPES_H +#define SKYTYPES_H + +/** + * Go 8-bit signed integer values. + */ +typedef signed char GoInt8_; +/** + * Go 8-bit unsigned integer values. + */ +typedef unsigned char GoUint8_; +/** + * Go 16-bit signed integer values. + */ +typedef short GoInt16_; +/** + * Go 16-bit unsigned integer values. + */ +typedef unsigned short GoUint16_; +/** + * Go 32-bit signed integer values. + */ +typedef int GoInt32_; +/** + * Go 32-bit unsigned integer values. + */ +typedef unsigned int GoUint32_; +/** + * Go 64-bit signed integer values. + */ +typedef long long GoInt64_; +/** + * Go 64-bit unsigned integer values. + */ +typedef unsigned long long GoUint64_; +/** + * Go integer values aligned to the word size of the underlying architecture. + */ +typedef GoInt64_ GoInt_; +/** + * Go unsigned integer values aligned to the word size of the underlying + * architecture. + */ +typedef GoUint64_ GoUint_; +/** + * Architecture-dependent type representing instances Go `uintptr` type. + * Used as a generic representation of pointer types. + */ +typedef __SIZE_TYPE__ GoUintptr_; +/** + * Go single precision 32-bits floating point values. + */ +typedef float GoFloat32_; +/** + * Go double precision 64-bits floating point values. + */ +typedef double GoFloat64_; +/** + * Instances of Go `complex` type. + */ +typedef float _Complex GoComplex64_; +/** + * Instances of Go `complex` type. + */ +typedef double _Complex GoComplex128_; + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt._ +*/ +typedef char _check_for_64_bit_pointer_matchingGoInt[sizeof(void*)==64/8 ? 1:-1]; + +/** + * Instances of Go `string` type. + */ +typedef struct { + const char *p; ///< Pointer to string characters buffer. + GoInt_ n; ///< String size not counting trailing `\0` char + ///< if at all included. +} GoString_; +/** + * Instances of Go `map` type. + */ +typedef void *GoMap_; +/** + * Instances of Go `chan` channel types. + */ +typedef void *GoChan_; +/** + * Instances of Go interface types. + */ +typedef struct { + void *t; ///< Pointer to the information of the concrete Go type + ///< bound to this interface reference. + void *v; ///< Pointer to the data corresponding to the value + ///< bound to this interface type. +} GoInterface_; +/** + * Instances of Go slices + */ +typedef struct { + void *data; ///< Pointer to buffer containing slice data. + GoInt_ len; ///< Number of items stored in slice buffer + GoInt_ cap; ///< Maximum number of items that fits in this slice + ///< considering allocated memory and item type's + ///< size. +} GoSlice_; + + +/** + * Memory handles returned back to the caller and manipulated + * internally by API functions. Usually used to avoid type dependencies + * with internal implementation types. + */ +typedef GoInt64_ Handle; + +/** + * Memory handle for internal object retrieving password to read + * encrypted wallets. + */ +typedef Handle PasswordReader__Handle; + +/** + * Memory handle to perform Skycoin RPC API calls + * encrypted wallets. + */ +typedef Handle WebRpcClient__Handle; + +/** + * Memory handle providing access to wallet data + */ +typedef Handle Wallet__Handle; + +/** + * Memory handle Options Handle +*/ +typedef Handle Options__Handle; + +/** + * Memory handle to access to Skycoin CLI configuration + */ +typedef Handle Config__Handle; + +#include "cipher.hash.go.h" +#include "cipher.crypto.go.h" +#include "cipher.address.go.h" +#include "cli.create_rawtx.go.h" +#include "coin.outputs.go.h" +#include "coin.transactions.go.h" +#include "wallet.entry.go.h" +#include "wallet.wallet.go.h" + +#endif + diff --git a/include/wallet.entry.go.h b/include/wallet.entry.go.h new file mode 100755 index 0000000..362bb76 --- /dev/null +++ b/include/wallet.entry.go.h @@ -0,0 +1,8 @@ +/** + * Wallet entry. + */ +typedef struct { + cipher__Address Address; ///< Wallet address. + cipher__PubKey Public; ///< Public key used to generate address. + cipher__SecKey Secret; ///< Secret key used to generate address. +} wallet__Entry; diff --git a/include/wallet.wallet.go.h b/include/wallet.wallet.go.h new file mode 100755 index 0000000..2605cde --- /dev/null +++ b/include/wallet.wallet.go.h @@ -0,0 +1,19 @@ +/** + * Intermediate representation of a UxOut for sorting and spend choosing. + */ +typedef struct { + cipher__SHA256 Hash; ///< Hash of underlying UxOut. + GoInt64_ BkSeq; ///< Block height corresponding to the + ///< moment balance calculation is performed at. + cipher__Address Address; ///< Account holder address. + GoInt64_ Coins; ///< Coins amount (e.g. in SKY). + GoInt64_ Hours; ///< Balance of Coin Hours generated by underlying UxOut, depending on UxOut's head time. +} wallet__UxBalance; + +/** + * Internal representation of a Skycoin wallet. + */ +typedef struct { + GoMap_ Meta; ///< Records items that are not deterministic, like filename, lable, wallet type, secrets, etc. + GoSlice_ Entries; ///< Entries field stores the address entries that are deterministically generated from seed. +} wallet__Wallet; diff --git a/lib/cgo/README.md b/lib/cgo/README.md new file mode 100755 index 0000000..0acc28e --- /dev/null +++ b/lib/cgo/README.md @@ -0,0 +1,101 @@ + +# Skycoin C client library + +[![Build Status](https://travis-ci.org/skycoin/skycoin.svg)](https://travis-ci.org/skycoin/skycoin) +[![GoDoc](https://godoc.org/github.com/skycoin/skycoin?status.svg)](https://godoc.org/github.com/skycoin/skycoin) +[![Go Report Card](https://goreportcard.com/badge/github.com/skycoin/skycoin)](https://goreportcard.com/report/github.com/skycoin/skycoin) + +Skycoin C client library (a.k.a libskycoin) provides access to Skycoin Core +internal and API functions for implementing third-party applications. + +## API Interface + +The API interface is defined in the [libskycoin header file](/include/libskycoin.h). + +## Building + +```sh +$ make build-libc +``` + +This command compiles wrappers partially generated by [cgogen](https://github.com/simelo/cgogen) tool. + +**Important** : `libskycoin.so` shared library +[can not be compiled on Windows 64 bit systems](t.me/skycoindev/925) due to +[lack of support for c-shared buildmode in golang 1.9](https://github.com/golang/go/issues/23582). +Make sure you have installed a go version higher than `1.10`. + +## Testing + +In order to test the C client libraries follow these steps + +- Install [Criterion](https://github.com/Snaipe/Criterion) + * locally by executing `make instal-deps-libc` command + * or by [installing Criterion system-wide](https://github.com/Snaipe/Criterion#packages) +- Run `make test-libc` command + +## Binary distribution + +The following files will be generated + +- `include/libskycoin.h` - Platform-specific header file for including libskycoin symbols in your app code +- `build/libskycoin.a` - Static library. +- `build/libskycoin.so` - Shared library object. + +In Mac OS X the linker will need extra `-framework CoreFoundation -framework Security` +options. + +In GNU/Linux distributions it will be necessary to load symbols in `pthread` +library e.g. by supplying extra `-lpthread` to the linker toolchain. + + +## API usage + +The C API (a.k.a libskycoin) exposes the internals of Skycoin core +classes and objects. This makes it suitable for writing third-party +applications and integrations. The notable differences between go lang +and C languages have consequences for the consumers of the API. + +### Data types + +Skycoin core objects may not be passed across API boundaries. Therefore +equivalent C types are defined for each Skycoin core struct that +might be needed by developers. The result of this translation is +available in [skytpes.h](../../include/skytypes.h). + +### Memory management + +Caller is responsible for allocating memory for objects meant to be +created by libskycoin API. Different approaches are chosen to avoid +segmentation faults and memory corruption. + +API functions perform memory allocation for output `GoString *` arguments. +In that case new memory is allocated dynamically by `libskycoin` code. +The caller C code is responsible for releasing that memory by passing the pointer +in `p` field in to [free()](http://en.cppreference.com/w/c/memory/free). + +The parameters corresponding to slices returned by `libskycoin` are +of `GoSlice *` type. Aforementioned approach is also implemented for slices +with `cap` field set to `0` prior to function invocation. +Otherwise their `data` field must always be +set consistently to point at the buffer memory address whereas +`cap` must always be set to the number of items of the +target element type that will fit in the memory +area reserved in advance for that buffer. If the size of the data +to be returned by a given libskycoin function exceeds the value +set in `cap` then libskycoin will copy `cap` items in available +memory space and will set `len` to a negative value representing +the number of extra items that could not be copied due to +overflow. + +For instance if `100` bytes have been allocated in advance +by the caller for a struct type that occupies `25` bytes then only +`4` items fit in that memory and `cap` should be set accordingly. +In the hypothetical situation that `libskycoin` result occupies +`125` bytes (e.g. a slice of same type including `5` items) then +the first `100` bytes will be copied onto C-allocated `data` buffer +and `len` field will be set to `-1` as a side-effect of function +invocation. The caller will be responsible for +[reallocating another memory buffer](http://en.cppreference.com/w/c/memory/realloc) +using a higher `cap` and retry. + diff --git a/lib/cgo/api.webrpc.client.go b/lib/cgo/api.webrpc.client.go new file mode 100755 index 0000000..a185aa0 --- /dev/null +++ b/lib/cgo/api.webrpc.client.go @@ -0,0 +1,47 @@ +package main + +import ( + webrpc "github.com/skycoin/skycoin/src/api/webrpc" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_webrpc_NewClient +func SKY_webrpc_NewClient(_addr string, _arg1 *C.WebRpcClient__Handle) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + addr := _addr + __arg1, ____return_err := webrpc.NewClient(addr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWebRpcClientHandle(__arg1) + } + return +} + +//export SKY_webrpc_Client_CSRF +func SKY_webrpc_Client_CSRF(_c C.WebRpcClient__Handle, _arg0 *C.GoString_) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + __arg0, ____return_err := c.CSRF() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyString(__arg0, _arg0) + } + return +} diff --git a/lib/cgo/cipher.address.go b/lib/cgo/cipher.address.go new file mode 100755 index 0000000..8c1abeb --- /dev/null +++ b/lib/cgo/cipher.address.go @@ -0,0 +1,145 @@ +package main + +/* +#include +#include + +#include "skytypes.h" + +*/ +import "C" + +import ( + "reflect" + "unsafe" + + "github.com/skycoin/skycoin/src/cipher" +) + +/** + * Functions in github.com/skycoin/skycoin/src/cipher/address.go + */ + +//export SKY_cipher_DecodeBase58Address +func SKY_cipher_DecodeBase58Address(_addr string, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.DecodeBase58Address(_addr) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_AddressFromPubKey +func SKY_cipher_AddressFromPubKey(_pubKey *C.cipher__PubKey, _arg1 *C.cipher__Address) { + pubKey := (*cipher.PubKey)(unsafe.Pointer(_pubKey)) + + addr := cipher.AddressFromPubKey(*pubKey) + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) +} + +//export SKY_cipher_AddressFromSecKey +func SKY_cipher_AddressFromSecKey(_secKey *C.cipher__SecKey, _arg1 *C.cipher__Address) { + var secKey cipher.SecKey + secKey = *(*cipher.SecKey)(unsafe.Pointer(_secKey)) + addr := cipher.AddressFromSecKey(secKey) + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) +} + +//export SKY_cipher_BitcoinDecodeBase58Address +func SKY_cipher_BitcoinDecodeBase58Address(_addr string, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.BitcoinDecodeBase58Address(_addr) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_Address_Bytes +func SKY_cipher_Address_Bytes(_addr *C.cipher__Address, _arg0 *C.GoSlice_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + bytes := addr.Bytes() + copyToGoSlice(reflect.ValueOf(bytes), _arg0) +} + +//export SKY_cipher_Address_BitcoinBytes +func SKY_cipher_Address_BitcoinBytes(_addr *C.cipher__Address, _arg0 *C.GoSlice_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + bytes := addr.BitcoinBytes() + copyToGoSlice(reflect.ValueOf(bytes), _arg0) +} + +//export SKY_cipher_Address_Verify +func SKY_cipher_Address_Verify(_addr *C.cipher__Address, _key *C.cipher__PubKey) uint32 { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + key := (*cipher.PubKey)(unsafe.Pointer(_key)) + err := addr.Verify(*key) + return libErrorCode(err) +} + +//export SKY_cipher_Address_String +func SKY_cipher_Address_String(_addr *C.cipher__Address, _arg1 *C.GoString_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + s := addr.String() + copyString(s, _arg1) +} + +//export SKY_cipher_Address_BitcoinString +func SKY_cipher_Address_BitcoinString(_addr *C.cipher__Address, _arg1 *C.GoString_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + s := addr.BitcoinString() + copyString(s, _arg1) +} + +//export SKY_cipher_Address_Checksum +func SKY_cipher_Address_Checksum(_addr *C.cipher__Address, _arg0 *C.cipher__Checksum) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + cs := addr.Checksum() + C.memcpy(unsafe.Pointer(_arg0), unsafe.Pointer(&cs[0]), C.size_t(len(cs))) +} + +//export SKY_cipher_Address_BitcoinChecksum +func SKY_cipher_Address_BitcoinChecksum(_addr *C.cipher__Address, _arg0 *C.cipher__Checksum) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + cs := addr.BitcoinChecksum() + C.memcpy(unsafe.Pointer(_arg0), unsafe.Pointer(&cs[0]), C.size_t(len(cs))) +} + +/* +Bitcoin Functions +*/ + +//export SKY_cipher_BitcoinAddressFromPubkey +func SKY_cipher_BitcoinAddressFromPubkey(_pubkey *C.cipher__PubKey, _arg1 *C.GoString_) { + pubkey := (*cipher.PubKey)(unsafe.Pointer(_pubkey)) + s := cipher.BitcoinAddressFromPubkey(*pubkey) + copyString(s, _arg1) +} + +//export SKY_cipher_BitcoinWalletImportFormatFromSeckey +func SKY_cipher_BitcoinWalletImportFormatFromSeckey(_seckey *C.cipher__SecKey, _arg1 *C.GoString_) { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + s := cipher.BitcoinWalletImportFormatFromSeckey(*seckey) + copyString(s, _arg1) +} + +//export SKY_cipher_BitcoinAddressFromBytes +func SKY_cipher_BitcoinAddressFromBytes(_b []byte, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.BitcoinAddressFromBytes(_b) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_SecKeyFromWalletImportFormat +func SKY_cipher_SecKeyFromWalletImportFormat(_input string, _arg1 *C.cipher__SecKey) uint32 { + seckey, err := cipher.SecKeyFromWalletImportFormat(_input) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__SecKey)(unsafe.Pointer(&seckey)) + } + return errcode +} diff --git a/lib/cgo/cipher.crypto.go b/lib/cgo/cipher.crypto.go new file mode 100755 index 0000000..15910e0 --- /dev/null +++ b/lib/cgo/cipher.crypto.go @@ -0,0 +1,278 @@ +package main + +import ( + cipher "github.com/skycoin/skycoin/src/cipher" + + "reflect" + "unsafe" +) + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_cipher_PubKeySlice_Len +func SKY_cipher_PubKeySlice_Len(_slice *C.cipher__PubKeySlice) int { + slice := inplacePubKeySlice(_slice) + return slice.Len() +} + +//export SKY_cipher_PubKeySlice_Less +func SKY_cipher_PubKeySlice_Less(_slice *C.cipher__PubKeySlice, _i, _j int) bool { + slice := inplacePubKeySlice(_slice) + return slice.Less(_i, _j) +} + +//export SKY_cipher_PubKeySlice_Swap +func SKY_cipher_PubKeySlice_Swap(_slice *C.cipher__PubKeySlice, _i, _j int) { + slice := inplacePubKeySlice(_slice) + slice.Swap(_i, _j) +} + +//export SKY_cipher_RandByte +func SKY_cipher_RandByte(_n int, _arg1 *C.GoSlice_) { + b := cipher.RandByte(_n) + copyToGoSlice(reflect.ValueOf(b), _arg1) +} + +//export SKY_cipher_NewPubKey +func SKY_cipher_NewPubKey(_b []byte, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + pubkey := cipher.NewPubKey(_b) + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + return libErrorCode(nil) +} + +//export SKY_cipher_PubKeyFromHex +func SKY_cipher_PubKeyFromHex(_s string, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + pubkey, err := cipher.PubKeyFromHex(_s) + errcode = libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + } + return errcode +} + +//export SKY_cipher_PubKeyFromSecKey +func SKY_cipher_PubKeyFromSecKey(_seckey *C.cipher__SecKey, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + + pubkey := cipher.PubKeyFromSecKey(*seckey) + + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + return libErrorCode(nil) +} + +//export SKY_cipher_PubKeyFromSig +func SKY_cipher_PubKeyFromSig(_sig *C.cipher__Sig, _hash *C.cipher__SHA256, _arg2 *C.cipher__PubKey) uint32 { + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + pubkey, err := cipher.PubKeyFromSig(*sig, *hash) + + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg2), uint(SizeofPubKey)) + } + return errcode +} + +//export SKY_cipher_PubKey_Verify +func SKY_cipher_PubKey_Verify(_pk *C.cipher__PubKey) uint32 { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + + err := pk.Verify() + errcode := libErrorCode(err) + return errcode +} + +//export SKY_cipher_PubKey_Hex +func SKY_cipher_PubKey_Hex(_pk *C.cipher__PubKey, _arg1 *C.GoString_) { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + s := pk.Hex() + copyString(s, _arg1) +} + +//export SKY_cipher_PubKey_ToAddressHash +func SKY_cipher_PubKey_ToAddressHash(_pk *C.cipher__PubKey, _arg0 *C.cipher__Ripemd160) { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + h := pk.ToAddressHash() + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg0), uint(SizeofRipemd160)) +} + +//export SKY_cipher_NewSecKey +func SKY_cipher_NewSecKey(_b []byte, _arg1 *C.cipher__SecKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + sk := cipher.NewSecKey(_b) + copyToBuffer(reflect.ValueOf(sk[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) + return SKY_OK +} + +//export SKY_cipher_SecKeyFromHex +func SKY_cipher_SecKeyFromHex(_s string, _arg1 *C.cipher__SecKey) uint32 { + sk, err := cipher.SecKeyFromHex(_s) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(sk[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) + } + return errcode +} + +//export SKY_cipher_SecKey_Verify +func SKY_cipher_SecKey_Verify(_sk *C.cipher__SecKey) uint32 { + sk := (*cipher.SecKey)(unsafe.Pointer(_sk)) + err := sk.Verify() + return libErrorCode(err) +} + +//export SKY_cipher_SecKey_Hex +func SKY_cipher_SecKey_Hex(_sk *C.cipher__SecKey, _arg1 *C.GoString_) { + sk := (*cipher.SecKey)(unsafe.Pointer(_sk)) + s := sk.Hex() + copyString(s, _arg1) +} + +//export SKY_cipher_ECDH +func SKY_cipher_ECDH(_pub *C.cipher__PubKey, _sec *C.cipher__SecKey, _arg2 *C.GoSlice_) { + pub := (*cipher.PubKey)(unsafe.Pointer(_pub)) + sec := (*cipher.SecKey)(unsafe.Pointer(_sec)) + b := cipher.ECDH(*pub, *sec) + copyToGoSlice(reflect.ValueOf(b), _arg2) +} + +//export SKY_cipher_NewSig +func SKY_cipher_NewSig(_b []byte, _arg1 *C.cipher__Sig) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + s := cipher.NewSig(_b) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSig)) + + return SKY_OK +} + +//export SKY_cipher_SigFromHex +func SKY_cipher_SigFromHex(_s string, _arg1 *C.cipher__Sig) uint32 { + s, err := cipher.SigFromHex(_s) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSig)) + } + return errcode +} + +//export SKY_cipher_Sig_Hex +func SKY_cipher_Sig_Hex(_s *C.cipher__Sig, _arg1 *C.GoString_) { + s := (*cipher.Sig)(unsafe.Pointer(_s)) + copyString(s.Hex(), _arg1) +} + +//export SKY_cipher_SignHash +func SKY_cipher_SignHash(_hash *C.cipher__SHA256, _sec *C.cipher__SecKey, _arg2 *C.cipher__Sig) { + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sec := (*cipher.SecKey)(unsafe.Pointer(_sec)) + s := cipher.SignHash(*hash, *sec) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg2), uint(SizeofSig)) +} + +//export SKY_cipher_ChkSig +func SKY_cipher_ChkSig(_address *C.cipher__Address, _hash *C.cipher__SHA256, _sig *C.cipher__Sig) uint32 { + address := inplaceAddress(_address) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + + err := cipher.ChkSig(*address, *hash, *sig) + return libErrorCode(err) +} + +//export SKY_cipher_VerifySignedHash +func SKY_cipher_VerifySignedHash(_sig *C.cipher__Sig, _hash *C.cipher__SHA256) uint32 { + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + + err := cipher.VerifySignedHash(*sig, *hash) + return libErrorCode(err) +} + +//export SKY_cipher_VerifySignature +func SKY_cipher_VerifySignature(_pubkey *C.cipher__PubKey, _sig *C.cipher__Sig, _hash *C.cipher__SHA256) uint32 { + pubkey := (*cipher.PubKey)(unsafe.Pointer(_pubkey)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + err := cipher.VerifySignature(*pubkey, *sig, *hash) + return libErrorCode(err) +} + +//export SKY_cipher_GenerateKeyPair +func SKY_cipher_GenerateKeyPair(_arg0 *C.cipher__PubKey, _arg1 *C.cipher__SecKey) { + p, s := cipher.GenerateKeyPair() + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg0), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) +} + +//export SKY_cipher_GenerateDeterministicKeyPair +func SKY_cipher_GenerateDeterministicKeyPair(_seed []byte, _arg1 *C.cipher__PubKey, _arg2 *C.cipher__SecKey) { + p, s := cipher.GenerateDeterministicKeyPair(_seed) + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg2), uint(SizeofSecKey)) +} + +//export SKY_cipher_DeterministicKeyPairIterator +func SKY_cipher_DeterministicKeyPairIterator(_seed []byte, _arg1 *C.GoSlice_, _arg2 *C.cipher__PubKey, _arg3 *C.cipher__SecKey) { + h, p, s := cipher.DeterministicKeyPairIterator(_seed) + + copyToGoSlice(reflect.ValueOf(h), _arg1) + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg2), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg3), uint(SizeofSecKey)) +} + +//export SKY_cipher_GenerateDeterministicKeyPairs +func SKY_cipher_GenerateDeterministicKeyPairs(_seed []byte, _n int, _arg2 *C.GoSlice_) { + sks := cipher.GenerateDeterministicKeyPairs(_seed, _n) + copyToGoSlice(reflect.ValueOf(sks), _arg2) +} + +//export SKY_cipher_GenerateDeterministicKeyPairsSeed +func SKY_cipher_GenerateDeterministicKeyPairsSeed(_seed []byte, _n int, _arg2 *C.GoSlice_, _arg3 *C.GoSlice_) { + h, sks := cipher.GenerateDeterministicKeyPairsSeed(_seed, _n) + copyToGoSlice(reflect.ValueOf(h), _arg2) + copyToGoSlice(reflect.ValueOf(sks), _arg3) +} + +//export SKY_cipher_TestSecKey +func SKY_cipher_TestSecKey(_seckey *C.cipher__SecKey) uint32 { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + + err := cipher.TestSecKey(*seckey) + return libErrorCode(err) +} + +//export SKY_cipher_TestSecKeyHash +func SKY_cipher_TestSecKeyHash(_seckey *C.cipher__SecKey, _hash *C.cipher__SHA256) uint32 { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + err := cipher.TestSecKeyHash(*seckey, *hash) + return libErrorCode(err) +} diff --git a/lib/cgo/cipher.hash.go b/lib/cgo/cipher.hash.go new file mode 100755 index 0000000..59ab70e --- /dev/null +++ b/lib/cgo/cipher.hash.go @@ -0,0 +1,107 @@ +package main + +import ( + cipher "github.com/skycoin/skycoin/src/cipher" + + "reflect" + "unsafe" +) + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_cipher_Ripemd160_Set +func SKY_cipher_Ripemd160_Set(_rd *C.cipher__Ripemd160, _b []byte) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + rd := (*cipher.Ripemd160)(unsafe.Pointer(_rd)) + + rd.Set(_b) + return libErrorCode(nil) +} + +//export SKY_cipher_HashRipemd160 +func SKY_cipher_HashRipemd160(_data []byte, _arg1 *C.cipher__Ripemd160) { + rd := cipher.HashRipemd160(_data) + + copyToBuffer(reflect.ValueOf(rd[:]), unsafe.Pointer(_arg1), uint(SizeofRipemd160)) +} + +//export SKY_cipher_SHA256_Set +func SKY_cipher_SHA256_Set(_g *C.cipher__SHA256, _b []byte) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + + g.Set(_b) + return libErrorCode(nil) +} + +//export SKY_cipher_SHA256_Hex +func SKY_cipher_SHA256_Hex(_g *C.cipher__SHA256, _arg1 *C.GoString_) { + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + copyString(g.Hex(), _arg1) +} + +//export SKY_cipher_SHA256_Xor +func SKY_cipher_SHA256_Xor(_g *C.cipher__SHA256, _b *C.cipher__SHA256, _arg1 *C.cipher__SHA256) { + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + b := (*cipher.SHA256)(unsafe.Pointer(_b)) + + x := g.Xor(*b) + copyToBuffer(reflect.ValueOf(x[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} + +//export SKY_cipher_SumSHA256 +func SKY_cipher_SumSHA256(_b []byte, _arg1 *C.cipher__SHA256) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + h := cipher.SumSHA256(_b) + + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) + return libErrorCode(nil) +} + +//export SKY_cipher_SHA256FromHex +func SKY_cipher_SHA256FromHex(_hs string, _arg1 *C.cipher__SHA256) uint32 { + h, err := cipher.SHA256FromHex(_hs) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) + } + return errcode +} + +//export SKY_cipher_DoubleSHA256 +func SKY_cipher_DoubleSHA256(_b []byte, _arg1 *C.cipher__SHA256) { + h := cipher.DoubleSHA256(_b) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} + +//export SKY_cipher_AddSHA256 +func SKY_cipher_AddSHA256(_a *C.cipher__SHA256, _b *C.cipher__SHA256, _arg2 *C.cipher__SHA256) { + a := (*cipher.SHA256)(unsafe.Pointer(_a)) + b := (*cipher.SHA256)(unsafe.Pointer(_b)) + + h := cipher.AddSHA256(*a, *b) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg2), uint(SizeofSHA256)) +} + +//export SKY_cipher_Merkle +func SKY_cipher_Merkle(_h0 *[]C.cipher__SHA256, _arg1 *C.cipher__SHA256) { + h0 := (*[]cipher.SHA256)(unsafe.Pointer(_h0)) + h := cipher.Merkle(*h0) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} diff --git a/lib/cgo/cli.create_rawtx.go b/lib/cgo/cli.create_rawtx.go new file mode 100755 index 0000000..fe416fb --- /dev/null +++ b/lib/cgo/cli.create_rawtx.go @@ -0,0 +1,108 @@ +package main + +import ( + "unsafe" + + cipher "github.com/skycoin/skycoin/src/cipher" + cli "github.com/skycoin/skycoin/src/cli" + coin "github.com/skycoin/skycoin/src/coin" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + + #include + #include + + #include "../../include/skytypes.h" +*/ +import "C" + +//export SKY_cli_CreateRawTxFromWallet +func SKY_cli_CreateRawTxFromWallet(_c C.WebRpcClient__Handle, _walletFile, _chgAddr string, _toAddrs []C.cli__SendAmount, pwd string, _arg4 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + walletFile := _walletFile + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + pr := cli.NewPasswordReader([]byte(pwd)) + __arg4, ____return_err := cli.CreateRawTxFromWallet(c, walletFile, chgAddr, toAddrs, pr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg4 = *(*C.coin__Transaction)(unsafe.Pointer(__arg4)) + } + return +} + +//export SKY_cli_CreateRawTxFromAddress +func SKY_cli_CreateRawTxFromAddress(_c C.WebRpcClient__Handle, _addr, _walletFile, _chgAddr string, _toAddrs []C.cli__SendAmount, pwd string, _arg4 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + addr := _addr + walletFile := _walletFile + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + pr := cli.NewPasswordReader([]byte(pwd)) + __arg4, ____return_err := cli.CreateRawTxFromAddress(c, addr, walletFile, chgAddr, toAddrs, pr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg4 = *(*C.coin__Transaction)(unsafe.Pointer(__arg4)) + } + return +} + +//export SKY_cli_CreateRawTx +func SKY_cli_CreateRawTx(_c C.WebRpcClient__Handle, _wlt C.Wallet__Handle, _inAddrs []string, _chgAddr string, _toAddrs []C.cli__SendAmount, _password []byte, _arg6 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + wlt, okwlt := lookupWalletHandle(_wlt) + if !okwlt { + ____error_code = SKY_ERROR + return + } + inAddrs := *(*[]string)(unsafe.Pointer(&_inAddrs)) + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + password := *(*[]byte)(unsafe.Pointer(&_password)) + __arg6, ____return_err := cli.CreateRawTx(c, wlt, inAddrs, chgAddr, toAddrs, password) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg6 = *(*C.coin__Transaction)(unsafe.Pointer(__arg6)) + } + return +} + +//export SKY_cli_NewTransaction +func SKY_cli_NewTransaction(_utxos []C.wallet__UxBalance, _keys []C.cipher__SecKey, _outs []C.coin__TransactionOutput, _arg3 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + utxos := *(*[]wallet.UxBalance)(unsafe.Pointer(&_utxos)) + keys := *(*[]cipher.SecKey)(unsafe.Pointer(&_keys)) + outs := *(*[]coin.TransactionOutput)(unsafe.Pointer(&_outs)) + __arg3 := cli.NewTransaction(utxos, keys, outs) + *_arg3 = *(*C.coin__Transaction)(unsafe.Pointer(__arg3)) + return +} diff --git a/lib/cgo/coin.outputs.go b/lib/cgo/coin.outputs.go new file mode 100755 index 0000000..66aac97 --- /dev/null +++ b/lib/cgo/coin.outputs.go @@ -0,0 +1,157 @@ +package main + +import ( + "reflect" + "unsafe" + + coin "github.com/skycoin/skycoin/src/coin" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_coin_UxOut_Hash +func SKY_coin_UxOut_Hash(_uo *C.coin__UxOut, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + __arg0 := uo.Hash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxOut_SnapshotHash +func SKY_coin_UxOut_SnapshotHash(_uo *C.coin__UxOut, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + __arg0 := uo.SnapshotHash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxBody_Hash +func SKY_coin_UxBody_Hash(_ub *C.coin__UxBody, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ub := (*coin.UxBody)(unsafe.Pointer(_ub)) + __arg0 := ub.Hash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxOut_CoinHours +func SKY_coin_UxOut_CoinHours(_uo *C.coin__UxOut, _t uint64, _arg1 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + t := _t + __arg1, ____return_err := uo.CoinHours(t) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = __arg1 + } + return +} + +//export SKY_coin_UxArray_Hashes +func SKY_coin_UxArray_Hashes(_ua *C.coin__UxArray, _arg0 *C.GoSlice_) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + __arg0 := ua.Hashes() + copyToGoSlice(reflect.ValueOf(__arg0), _arg0) + return +} + +//export SKY_coin_UxArray_HasDupes +func SKY_coin_UxArray_HasDupes(_ua *C.coin__UxArray) bool { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.HasDupes() +} + +//export SKY_coin_UxArray_Sort +func SKY_coin_UxArray_Sort(_ua *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + ua.Sort() +} + +//export SKY_coin_UxArray_Len +func SKY_coin_UxArray_Len(_ua *C.coin__UxArray) int { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.Len() +} + +//export SKY_coin_UxArray_Less +func SKY_coin_UxArray_Less(_ua *C.coin__UxArray, _i, _j int) bool { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.Less(_i, _j) +} + +//export SKY_coin_UxArray_Swap +func SKY_coin_UxArray_Swap(_ua *C.coin__UxArray, _i, _j int) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + ua.Swap(_i, _j) +} + +//export SKY_coin_UxArray_Coins +func SKY_coin_UxArray_Coins(_ua *C.coin__UxArray, _arg0 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + __arg0, ____return_err := ua.Coins() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg0 = __arg0 + } + return +} + +//export SKY_coin_UxArray_CoinHours +func SKY_coin_UxArray_CoinHours(_ua *C.coin__UxArray, _headTime uint64, _arg1 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + headTime := _headTime + __arg1, ____return_err := ua.CoinHours(headTime) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = __arg1 + } + return +} + +//export SKY_coin_UxArray_Sub +func SKY_coin_UxArray_Sub(_ua *C.coin__UxArray, _other *C.coin__UxArray, _arg1 *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + other := *(*coin.UxArray)(unsafe.Pointer(_other)) + __arg1 := ua.Sub(other) + *_arg1 = *(*C.coin__UxArray)(unsafe.Pointer(&__arg1)) +} + +//export SKY_coin_UxArray_Add +func SKY_coin_UxArray_Add(_ua *C.coin__UxArray, _other *C.coin__UxArray, _arg1 *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + other := *(*coin.UxArray)(unsafe.Pointer(_other)) + __arg1 := ua.Add(other) + *_arg1 = *(*C.coin__UxArray)(unsafe.Pointer(&__arg1)) +} diff --git a/lib/cgo/libsky_error.go b/lib/cgo/libsky_error.go new file mode 100755 index 0000000..b0aa4c0 --- /dev/null +++ b/lib/cgo/libsky_error.go @@ -0,0 +1,34 @@ +package main + +const ( + SKY_ERROR = 0xFFFFFFFF + SKY_OK = 0 +) + +func libErrorCode(err error) uint32 { + if err == nil { + return SKY_OK + } + // TODO: Implement error codes + return SKY_ERROR +} + +// Catch panic signals emitted by internal implementation +// of API methods. This function is mainly used in defer statements +// exceuted immediately before returning from API calls. +// +// @param errcode error status in function body +// @param err `recover()` result +// +func catchApiPanic(errcode uint32, err interface{}) uint32 { + if errcode != SKY_OK { + // Error already detected in function body + // Return right away + return errcode + } + if err != nil { + // TODO: Fix to be like retVal = libErrorCode(err) + return SKY_ERROR + } + return SKY_OK +} diff --git a/lib/cgo/libsky_handle.go b/lib/cgo/libsky_handle.go new file mode 100755 index 0000000..698bce7 --- /dev/null +++ b/lib/cgo/libsky_handle.go @@ -0,0 +1,115 @@ +package main + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +import ( + "unsafe" + + webrpc "github.com/skycoin/skycoin/src/api/webrpc" + cli "github.com/skycoin/skycoin/src/cli" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +type Handle uint64 + +var ( + handleMap = make(map[Handle]interface{}) +) + +func registerHandle(obj interface{}) Handle { + ptr := &obj + handle := *(*Handle)(unsafe.Pointer(&ptr)) + handleMap[handle] = obj + return handle +} + +func lookupHandle(handle Handle) (interface{}, bool) { + obj, ok := handleMap[handle] + return obj, ok +} + +func registerWebRpcClientHandle(obj *webrpc.Client) C.WebRpcClient__Handle { + return (C.WebRpcClient__Handle)(registerHandle(obj)) +} + +func lookupWebRpcClientHandle(handle C.WebRpcClient__Handle) (*webrpc.Client, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*webrpc.Client); isOK { + return obj, true + } + } + return nil, false +} + +func registerWalletHandle(obj *wallet.Wallet) C.Wallet__Handle { + return (C.Wallet__Handle)(registerHandle(obj)) +} + +func lookupWalletHandle(handle C.Wallet__Handle) (*wallet.Wallet, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*wallet.Wallet); isOK { + return obj, true + } + } + return nil, false +} + +func registerOptionsHandle(obj *wallet.Options) C.Options__Handle { + return (C.Options__Handle)(registerHandle(obj)) +} + +func lookupOptionsHandle(handle C.Options__Handle) (*wallet.Options, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*wallet.Options); isOK { + return obj, true + } + } + return nil, false +} + +func registerConfigHandle(obj *cli.Config) C.Config__Handle { + return (C.Config__Handle)(registerHandle(obj)) +} + +func lookupConfigHandle(handle C.Config__Handle) (*cli.Config, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*cli.Config); isOK { + return obj, true + } + } + return nil, false +} + +func registerPasswordReaderHandle(obj cli.PasswordReader) C.PasswordReader__Handle { + return (C.PasswordReader__Handle)(registerHandle(obj)) +} + +func lookupPasswordReaderHandle(handle C.PasswordReader__Handle) (cli.PasswordReader, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(cli.PasswordReader); isOK { + return obj, true + } + } + return nil, false +} + +func closeHandle(handle Handle) { + delete(handleMap, handle) +} + +//export SKY_handle_close +func SKY_handle_close(handle C.Handle) { + closeHandle(Handle(handle)) +} diff --git a/lib/cgo/libsky_mem.go b/lib/cgo/libsky_mem.go new file mode 100755 index 0000000..74eca3f --- /dev/null +++ b/lib/cgo/libsky_mem.go @@ -0,0 +1,123 @@ +package main + +import ( + "reflect" + "unsafe" + + "github.com/skycoin/skycoin/src/cipher" +) + +/* + #include + + #include "skytypes.h" + + void eos(char *str, int len) { + str[len] = 0; + } + +*/ +import "C" + +const ( + SizeofRipemd160 = unsafe.Sizeof(C.cipher__Ripemd160{}) + SizeOfAddress = unsafe.Sizeof(C.cipher__Address{}) + SizeofPubKey = unsafe.Sizeof(C.cipher__PubKey{}) + SizeofPubKeySlice = unsafe.Sizeof(C.cipher__PubKeySlice{}) + SizeofSecKey = unsafe.Sizeof(C.cipher__SecKey{}) + SizeofSig = unsafe.Sizeof(C.cipher__Sig{}) + SizeofChecksum = unsafe.Sizeof(C.cipher__Checksum{}) + SizeofSendAmount = unsafe.Sizeof(C.cli__SendAmount{}) + SizeofSHA256 = unsafe.Sizeof(C.cipher__SHA256{}) + SizeofTransactionOutput = unsafe.Sizeof(C.coin__TransactionOutput{}) + SizeofTransaction = unsafe.Sizeof(C.coin__Transaction{}) + SizeofWallet = unsafe.Sizeof(C.wallet__Wallet{}) + SizeofEntry = unsafe.Sizeof(C.wallet__Entry{}) + SizeofUxBalance = unsafe.Sizeof(C.wallet__UxBalance{}) +) + +/** + * Inplace memory references + */ + +func inplacePubKeySlice(p *C.cipher__PubKeySlice) *cipher.PubKeySlice { + return (*cipher.PubKeySlice)(unsafe.Pointer(p)) +} + +func inplaceAddress(p *C.cipher__Address) *cipher.Address { + return (*cipher.Address)(unsafe.Pointer(p)) +} + +func nop(p unsafe.Pointer) { + // Do nothing +} + +/** + * Copy helpers + */ + +func copyString(src string, dest *C.GoString_) { + strAddr := (*C.GoString_)(unsafe.Pointer(&src)) + srcLen := len(src) + dest.p = (*C.char)(C.memcpy( + C.malloc(C.size_t(srcLen+1)), + unsafe.Pointer(strAddr.p), + C.size_t(srcLen), + )) + C.eos(dest.p, C.int(srcLen)) + dest.n = C.GoInt_(srcLen) +} + +// Determine the memory address of a slice buffer and the +// size of its underlaying element type +func getBufferData(src reflect.Value) (bufferAddr unsafe.Pointer, elemSize C.size_t) { + firstElem := src.Index(0) + elemSize = C.size_t(firstElem.Type().Size()) + bufferAddr = unsafe.Pointer(src.Pointer()) + return +} + +// Copy n items in source slice/array/string onto C-managed memory buffer +// +// This function takes for granted that all values in src +// will be instances of the same type, and that src and dest +// element types will be aligned exactly the same +// in memory of the same size +func copyToBuffer(src reflect.Value, dest unsafe.Pointer, n uint) { + srcLen := src.Len() + if srcLen == 0 { + return + } + srcAddr, elemSize := getBufferData(src) + nop(C.memcpy(dest, srcAddr, C.size_t(n)*elemSize)) +} + +// Copy source slice/array/string onto instance of C.GSlice struct +// +// This function takes for granted that all values in src +// will be instances of the same type, and that src and dest +// element types will be aligned exactly the same +// in memory of the same size +func copyToGoSlice(src reflect.Value, dest *C.GoSlice_) { + srcLen := src.Len() + if srcLen == 0 { + dest.len = 0 + return + } + srcAddr, elemSize := getBufferData(src) + if dest.cap == 0 { + dest.data = C.malloc(C.size_t(srcLen) * elemSize) + dest.cap = C.GoInt_(srcLen) + } + n, overflow := srcLen, srcLen > int(dest.cap) + if overflow { + n = int(dest.cap) + } + nop(C.memcpy(dest.data, srcAddr, C.size_t(n)*elemSize)) + // Do not modify slice metadata until memory is actually copied + if overflow { + dest.len = dest.cap - C.GoInt_(srcLen) + } else { + dest.len = C.GoInt_(srcLen) + } +} diff --git a/lib/cgo/main.go b/lib/cgo/main.go new file mode 100755 index 0000000..8c04e9f --- /dev/null +++ b/lib/cgo/main.go @@ -0,0 +1,6 @@ +package main + +// #cgo CFLAGS: -I../../include +import "C" + +func main() {} diff --git a/lib/cgo/tests/check_cipher.address.c b/lib/cgo/tests/check_cipher.address.c new file mode 100755 index 0000000..6d5d5f5 --- /dev/null +++ b/lib/cgo/tests/check_cipher.address.c @@ -0,0 +1,337 @@ + +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +#define SKYCOIN_ADDRESS_VALID "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + +TestSuite(cipher_address, .init = setup, .fini = teardown); + +// buffer big enough to hold all kind of data needed by test cases +unsigned char buff[1024]; + +Test(cipher_address, TestDecodeBase58Address) { + + GoString strAddr = { + SKYCOIN_ADDRESS_VALID, + 35 + }; + cipher__Address addr; + + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_OK, "accept valid address"); + + char tempStr[50]; + + // preceding whitespace is invalid + strcpy(tempStr, " "); + strcat(tempStr, SKYCOIN_ADDRESS_VALID); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, "preceding whitespace is invalid"); + + // preceding zeroes are invalid + strcpy(tempStr, "000"); + strcat(tempStr, SKYCOIN_ADDRESS_VALID); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, "leading zeroes prefix are invalid"); + + // trailing whitespace is invalid + strcpy(tempStr, SKYCOIN_ADDRESS_VALID); + strcat(tempStr, " "); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, " trailing whitespace is invalid"); + + // trailing zeroes are invalid + strcpy(tempStr, SKYCOIN_ADDRESS_VALID); + strcat(tempStr, "000"); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, " trailing zeroes suffix are invalid"); + +} + +Test(cipher_address, TestAddressFromBytes){ + GoString strAddr = { + SKYCOIN_ADDRESS_VALID, + 35 + }; + cipher__Address addr, addr2; + GoSlice bytes; + + bytes.data = buff; + bytes.len = 0; + bytes.cap = sizeof(buff); + + SKY_cipher_DecodeBase58Address(strAddr, &addr); + SKY_cipher_Address_BitcoinBytes(&addr, (GoSlice_ *)&bytes); + cr_assert(bytes.len > 0, "address bytes written"); + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_OK, "convert bytes to SKY address"); + + cr_assert(eq(type(cipher__Address), addr, addr2)); + + int bytes_len = bytes.len; + + bytes.len = bytes.len - 2; + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_ERROR, "no SKY address due to short bytes length"); + + bytes.len = bytes_len; + ((char *) bytes.data)[bytes.len - 1] = '2'; + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_ERROR, "no SKY address due to corrupted bytes"); +} + +Test(cipher_address, TestAddressVerify){ + + cipher__PubKey pubkey; + cipher__SecKey seckey; + cipher__PubKey pubkey2; + cipher__SecKey seckey2; + cipher__Address addr; + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey); + SKY_cipher_AddressFromPubKey(&pubkey,&addr); + + // Valid pubkey+address + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_OK ,"Valid pubkey + address"); + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey2); + // // Invalid pubkey + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_ERROR," Invalid pubkey"); + + // Bad version + addr.Version = 0x01; + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_ERROR," Bad version"); +} + +Test(cipher_address,TestAddressString){ + +} + +Test (cipher, TestBitcoinAddress1){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + + GoString str = { + "1111111111111111111111111111111111111111111111111111111111111111", + 64 + }, s1, s2; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + GoString pubkeyStr = { "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", 66 }; + + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *) &s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *) &s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); +} + +Test (cipher, TestBitcoinAddress2){ + + cipher__SecKey seckey; + cipher__PubKey pubkey ; + GoString str = { + "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + 64 + }, s1, s2; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + char strBuff[101]; + GoString pubkeyStr = { + "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + 66 + }; + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *) &s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *) &s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); + +} + +Test (cipher, TestBitcoinAddress3){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + GoString str = { + "47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012", + 64 + }; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + char strBuff[101]; + GoString pubkeyStr = { + "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + 66 + }, s1, s2; + + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *)&s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *)&s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); + +} + +Test(cipher_address, TestBitcoinWIPRoundTrio){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + GoSlice slice; + slice.data = buff; + slice.cap = sizeof(buff); + slice.len = 33; + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey); + + GoString_ wip1; + + SKY_cipher_BitcoinWalletImportFormatFromSeckey(&seckey,&wip1); + + cipher__SecKey seckey2; + + unsigned int err; + + err = SKY_cipher_SecKeyFromWalletImportFormat( (*((GoString *) &wip1)) ,&seckey2); + + GoString_ wip2; + + SKY_cipher_BitcoinWalletImportFormatFromSeckey(&seckey2,&wip2); + + cr_assert(err == SKY_OK); + + cr_assert(eq(u8[sizeof(cipher__SecKey)],seckey,seckey2)); + + GoString_ seckeyhex1; + GoString_ seckeyhex2; + + SKY_cipher_SecKey_Hex(&seckey,&seckeyhex1); + SKY_cipher_SecKey_Hex(&seckey2,&seckeyhex2); + cr_assert(eq(type(GoString), (*(GoString*)&seckeyhex1),(*(GoString*)&seckeyhex2) )); + cr_assert(eq(type(GoString), (*(GoString*)&wip1),(*(GoString*)&wip2) )); + +} + + +Test(cipher_address, TestBitcoinWIP ){ + + //wallet input format string + GoString wip[3]; + + wip[0].p = "KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp"; + wip[1].p = "L4ezQvyC6QoBhxB4GVs9fAPhUKtbaXYUn8YTqoeXwbevQq4U92vN"; + wip[2].p = "KydbzBtk6uc7M6dXwEgTEH2sphZxSPbmDSz6kUUHi4eUpSQuhEbq"; + wip[0].n = 52; + wip[1].n = 52; + wip[2].n = 52; + + // // //the expected pubkey to generate + GoString_ pub[3]; + + pub[0].p="034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa"; + pub[1].p="02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd"; + pub[2].p="032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3"; + + pub[0].n = 66; + pub[1].n = 66; + pub[2].n = 66; + + + // //the expected addrss to generate + + GoString addr[3]; + + addr[0].p="1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9"; + addr[1].p="1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a"; + addr[2].p="19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV"; + + addr[0].n =34; + addr[1].n=34; + addr[2].n=34; + + + for (int i = 0; i < 3; i++) + { + cipher__SecKey seckey; + unsigned int err; + + err = SKY_cipher_SecKeyFromWalletImportFormat(wip[i],&seckey); + cr_assert(err==SKY_OK); + + cipher__PubKey pubkey; + + SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + + unsigned char * pubkeyhextmp; + GoString_ string; + + SKY_cipher_PubKey_Hex(&pubkey,&string); + cr_assert(eq(type(GoString), (*(GoString*)&string),(*(GoString*)&pub[i]) )); + GoString bitcoinAddr; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *)&bitcoinAddr); + cr_assert(eq(type(GoString),addr[i],bitcoinAddr)); + + } +} + +Test(cipher_address, TestAddressBulk){ + + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50 }; + + for (int i = 0; i < 1024; ++i) + { + randBytes(&slice,32); + cipher__PubKey pubkey; + cipher__SecKey seckey; + SKY_cipher_GenerateDeterministicKeyPair( slice,&pubkey,&seckey); + cipher__Address addr; + SKY_cipher_AddressFromPubKey(&pubkey,&addr); + unsigned int err; + err = SKY_cipher_Address_Verify(&addr,&pubkey); + cr_assert(err == SKY_OK); + GoString strAddr; + SKY_cipher_Address_String(&addr, (GoString_ *)&strAddr); + registerMemCleanup((void *) strAddr.p); + cipher__Address addr2; + + err = SKY_cipher_DecodeBase58Address(strAddr,&addr2); + cr_assert(err == SKY_OK); + cr_assert(eq(type(cipher__Address),addr,addr2)); + } + +} + diff --git a/lib/cgo/tests/check_cipher.crypto.c b/lib/cgo/tests/check_cipher.crypto.c new file mode 100755 index 0000000..b8e2b1d --- /dev/null +++ b/lib/cgo/tests/check_cipher.crypto.c @@ -0,0 +1,734 @@ + +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +TestSuite(cipher_crypto, .init = setup, .fini = teardown); + +Test(cipher_crypto, TestNewPubKey) { + unsigned char buff[101]; + GoSlice slice; + cipher__PubKey pk; + + slice.data = buff; + slice.cap = 101; + + randBytes(&slice, 31); + slice.len = 31; + unsigned int errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "31 random bytes"); + + randBytes(&slice, 32); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "32 random bytes"); + + randBytes(&slice, 34); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "34 random bytes"); + + slice.len = 0; + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "0 random bytes"); + + randBytes(&slice, 100); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "100 random bytes"); + + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_OK, "33 random bytes"); + + cr_assert(eq(u8[33], pk, buff)); +} + +Test(cipher_crypto, TestPubKeyFromHex) { + cipher__PubKey p, p1; + GoString s; + unsigned char buff[51]; + char sbuff[101]; + GoSlice slice = { (void *)buff, 0, 51 }; + unsigned int errcode; + + // Invalid hex + s.n = 0; + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex. Empty string"); + + s.p = "cascs"; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex. Bad chars"); + + // Invalid hex length + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + strnhex(&p[0], sbuff, slice.len / 2); + s.p = sbuff; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex length"); + + // Valid + strnhex(p, sbuff, sizeof(p)); + s.p = sbuff; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_OK, "TestPubKeyFromHex: Valid. No panic."); + cr_assert(eq(u8[33], p, p1)); +} + +Test(cipher_crypto, TestPubKeyHex) { + cipher__PubKey p, p2; + GoString s3, s4; + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50}; + unsigned int errcode; + + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + SKY_cipher_PubKey_Hex(&p, (GoString_ *) &s3); + registerMemCleanup((void *) s3.p); + errcode = SKY_cipher_PubKeyFromHex(s3, &p2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], p, p2)); + + SKY_cipher_PubKey_Hex(&p2, (GoString_ *)&s4); + registerMemCleanup((void *) s4.p); + // TODO: Translate into cr_assert(eq(type(GoString), s3, s4)); + cr_assert(s3.n == s4.n); + cr_assert(eq(str, ((char *) s3.p), ((char *) s4.p))); +} + +Test(cipher_crypto, TestPubKeyVerify) { + cipher__PubKey p; + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50 }; + unsigned int errcode; + + int i = 0; + for (; i < 10; i++) { + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_ERROR); + } +} + +Test(cipher_crypto, TestPubKeyVerifyNil) { + cipher__PubKey p = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }; + unsigned int errcode; + + errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestPubKeyVerifyDefault1) { + cipher__PubKey p; + cipher__SecKey s; + + SKY_cipher_GenerateKeyPair(&p, &s); + unsigned int errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyVerifyDefault2) { + cipher__PubKey p; + cipher__SecKey s; + int i; + + for (i = 0; i < 1024; ++i) { + SKY_cipher_GenerateKeyPair(&p, &s); + unsigned int errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_OK); + } +} + +Test(cipher_crypto, TestPubKeyToAddressHash) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Ripemd160 h; + + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_PubKey_ToAddressHash(&p, &h); + // TODO: Translate code snippet + // + // x := sha256.Sum256(p[:]) + // x = sha256.Sum256(x[:]) + // rh := ripemd160.New() + // rh.Write(x[:]) + // y := rh.Sum(nil) + // assert.True(t, bytes.Equal(h[:], y)) + // + // +} + +Test(cipher_crypto, TestPubKeyToAddress) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Address addr; + cipher__Ripemd160 h; + int errcode; + + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_AddressFromPubKey(&p, &addr); + errcode = SKY_cipher_Address_Verify(&addr, &p); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyToAddress2) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Address addr; + GoString_ addrStr; + int i, errcode; + + for (i = 0; i < 1024; i++) { + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_AddressFromPubKey(&p, &addr); + //func (self Address) Verify(key PubKey) error + errcode = SKY_cipher_Address_Verify(&addr, &p); + cr_assert(errcode == SKY_OK); + SKY_cipher_Address_String(&addr, &addrStr); + registerMemCleanup((void *) addrStr.p); + errcode = SKY_cipher_DecodeBase58Address( + *((GoString*)&addrStr), &addr); + //func DecodeBase58Address(addr string) (Address, error) + cr_assert(errcode == SKY_OK); + } +} + +Test(cipher_crypto, TestMustNewSecKey) { + unsigned char buff[101]; + GoSlice b; + cipher__SecKey sk; + int errcode; + + b.data = buff; + b.cap = 101; + + randBytes(&b, 31); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 33); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 34); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 0); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 100); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 32); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, buff)); +} + +Test(cipher_crypto, TestMustSecKeyFromHex) { + GoString str; + cipher__SecKey sk, sk1; + unsigned int buff[50]; + GoSlice b; + char strBuff[101]; + GoString s; + int errcode; + + // Invalid hex + s.p = ""; + s.n = strlen(s.p); + errcode = SKY_cipher_SecKeyFromHex(s, &sk); + cr_assert(errcode == SKY_ERROR); + + s.p = "cascs"; + s.n = strlen(s.p); + errcode = SKY_cipher_SecKeyFromHex(s, &sk); + cr_assert(errcode == SKY_ERROR); + + // Invalid hex length + b.data = buff; + b.cap = 50; + randBytes(&b, 32); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_OK); + strnhex(sk, strBuff, 16); + s.p = strBuff; + s.n = strlen(strBuff); + errcode = SKY_cipher_SecKeyFromHex(s, &sk1); + cr_assert(errcode == SKY_ERROR); + + // Valid + strnhex(sk, strBuff, 32); + s.p = strBuff; + s.n = strlen(strBuff); + errcode = SKY_cipher_SecKeyFromHex(s, &sk1); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, sk1)); +} + +Test(cipher_crypto, TestSecKeyHex) { + cipher__SecKey sk, sk2; + unsigned char buff[101]; + char strBuff[50]; + GoSlice b; + GoString str, h; + int errcode; + + b.data = buff; + b.cap = 50; + h.p = strBuff; + h.n = 0; + + randBytes(&b, 32); + SKY_cipher_NewSecKey(b, &sk); + SKY_cipher_SecKey_Hex(&sk, (GoString_ *)&str); + registerMemCleanup((void *) str.p); + + // Copy early to ensure memory is released + strncpy((char *) h.p, str.p, str.n); + h.n = str.n; + + errcode = SKY_cipher_SecKeyFromHex(h, &sk2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, sk2)); +} + +Test(cipher_crypto, TestSecKeyVerify) { + cipher__SecKey sk; + cipher__PubKey pk; + int errcode; + + // Empty secret key should not be valid + memset(sk, 0, 32); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_ERROR); + + // Generated sec key should be valid + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + // Random bytes are usually valid +} + +Test(cipher_crypto, TestECDHonce) { + cipher__PubKey pub1, pub2; + cipher__SecKey sec1, sec2; + unsigned char buff1[50], buff2[50]; + GoSlice_ buf1, buf2; + + buf1.data = buff1; + buf1.len = 0; + buf1.cap = 50; + buf2.data = buff2; + buf2.len = 0; + buf2.cap = 50; + + SKY_cipher_GenerateKeyPair(&pub1, &sec1); + SKY_cipher_GenerateKeyPair(&pub2, &sec2); + + SKY_cipher_ECDH(&pub2, &sec1, &buf1); + SKY_cipher_ECDH(&pub1, &sec2, &buf2); + + // ECDH shared secrets are 32 bytes SHA256 hashes in the end + cr_assert(eq(u8[32], buff1, buff2)); +} + +Test(cipher_crypto, TestECDHloop) { + int i; + cipher__PubKey pub1, pub2; + cipher__SecKey sec1, sec2; + unsigned char buff1[50], buff2[50]; + GoSlice_ buf1, buf2; + + buf1.data = buff1; + buf1.len = 0; + buf1.cap = 50; + buf2.data = buff2; + buf2.len = 0; + buf2.cap = 50; + + for (i = 0; i < 128; i++) { + SKY_cipher_GenerateKeyPair(&pub1, &sec1); + SKY_cipher_GenerateKeyPair(&pub2, &sec2); + SKY_cipher_ECDH(&pub2, &sec1, &buf1); + SKY_cipher_ECDH(&pub1, &sec2, &buf2); + cr_assert(eq(u8[32], buff1, buff2)); + } +} + +Test(cipher_crypto, TestNewSig) { + unsigned char buff[101]; + GoSlice b; + cipher__Sig s; + int errcode; + + b.data = buff; + b.len = 0; + b.cap = 101; + + randBytes(&b, 64); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 66); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 67); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 0); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 100); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], buff, s)); +} + +Test(cipher_crypto, TestMustSigFromHex) { + unsigned char buff[101]; + char strBuff[257]; + GoSlice b = { buff, 0, 101 }; + GoString str; + cipher__Sig s, s2; + int errcode; + + // Invalid hex + str.p = ""; + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + str.p = "cascs"; + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + // Invalid hex length + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_OK); + str.p = strBuff; + str.n = 0; + strnhex(s, (char *) str.p, 32); + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + // Valid + strnhex(s, (char *) str.p, 65); + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], s2, s)); +} + +Test(cipher_crypto, TestSigHex) { + unsigned char buff[66]; + GoSlice b = {buff, 0, 66}; + char strBuff[150], + strBuff2[150]; + GoString str = {NULL, 0}, + str2 = {NULL, 0}; + cipher__Sig s, s2; + int errcode; + + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + + cr_assert(errcode == SKY_OK); + SKY_cipher_Sig_Hex(&s, (GoString_ *) &str); + registerMemCleanup((void *) str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], s, s2)); + + SKY_cipher_Sig_Hex(&s2, (GoString_ *) &str2); + registerMemCleanup((void *) str2.p); + cr_assert(eq(type(GoString), str, str2)); +} + +Test(cipher_crypto, TestChkSig) { + cipher__PubKey pk, pk2; + cipher__SecKey sk, sk2; + cipher__Address addr, addr2; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + cipher__SHA256 h, h2; + cipher__Sig sig, sig2; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + SKY_cipher_AddressFromPubKey(&pk, &addr); + errcode = SKY_cipher_Address_Verify(&addr, &pk); + cr_assert(errcode == SKY_OK); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + + // Empty sig should be invalid + memset(&sig, 0, sizeof(sig)); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_ERROR); + + // Random sigs should not pass + int i; + for (i = 0; i < 100; i++) { + randBytes(&b, 65); + SKY_cipher_NewSig(b, &sig); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_ERROR); + } + + // Sig for one hash does not work for another hash + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h2); + SKY_cipher_SignHash(&h2, &sk, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h2, &sig2); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig2); + cr_assert(errcode == SKY_ERROR); + errcode = SKY_cipher_ChkSig(&addr, &h2, &sig); + cr_assert(errcode == SKY_ERROR); + + // Different secret keys should not create same sig + SKY_cipher_GenerateKeyPair(&pk2, &sk2); + SKY_cipher_AddressFromPubKey(&pk2, &addr2); + memset(&h, 0, sizeof(h)); + SKY_cipher_SignHash(&h, &sk, &sig); + SKY_cipher_SignHash(&h, &sk2, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig2); + cr_assert(errcode == SKY_OK); + cr_assert(not(eq(u8[65], sig, sig2))); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + SKY_cipher_SignHash(&h, &sk2, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig2); + cr_assert(errcode == SKY_OK); + cr_assert(not(eq(u8[65], sig, sig2))); + + // Bad address should be invalid + errcode = SKY_cipher_ChkSig(&addr, &h, &sig2); + cr_assert(errcode == SKY_ERROR); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestSignHash) { + cipher__PubKey pk; + cipher__SecKey sk; + cipher__Address addr; + unsigned char buff[257]; + GoSlice b = { buff, 0, 101 }; + cipher__SHA256 h; + cipher__Sig sig, sig2; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + SKY_cipher_AddressFromPubKey(&pk, &addr); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + memset((void *) &sig2, 0, 65); + cr_assert(not(eq(u8[65], sig2, sig))); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyFromSecKey) { + cipher__PubKey pk, pk2; + cipher__SecKey sk; + unsigned char buff[101]; + GoSlice b = { buff, 0, 101 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKeyFromSecKey(&sk, &pk2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], pk, pk2)); + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_PubKeyFromSecKey(&sk, &pk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 99); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 31); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestPubKeyFromSig) { + cipher__PubKey pk, pk2; + cipher__SecKey sk; + cipher__SHA256 h; + cipher__Sig sig; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_PubKeyFromSig(&sig, &h, &pk2); + + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], pk, pk2)); + + memset(&sig, 0, sizeof(sig)); + errcode = SKY_cipher_PubKeyFromSig(&sig, &h, &pk2); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestVerifySignature) { + cipher__PubKey pk, pk2; + cipher__SecKey sk, sk2; + cipher__SHA256 h, h2; + cipher__Sig sig, sig2; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h2); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_VerifySignature(&pk, &sig, &h); + cr_assert(errcode == SKY_OK); + + memset(&sig2, 0, sizeof(sig2)); + errcode = SKY_cipher_VerifySignature(&pk, &sig2, &h); + cr_assert(errcode == SKY_ERROR); + + errcode = SKY_cipher_VerifySignature(&pk, &sig, &h2); + cr_assert(errcode == SKY_ERROR); + + SKY_cipher_GenerateKeyPair(&pk2, &sk2); + errcode = SKY_cipher_VerifySignature(&pk2, &sig, &h); + cr_assert(errcode == SKY_ERROR); + + memset(&pk2, 0, sizeof(pk2)); + errcode = SKY_cipher_VerifySignature(&pk2, &sig, &h); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestGenerateKeyPair) { + cipher__PubKey pk; + cipher__SecKey sk; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestGenerateDeterministicKeyPair) { + cipher__PubKey pk; + cipher__SecKey sk; + unsigned char buff[33]; + GoSlice seed = { buff, 0, 33 }; + int errcode; + + // TODO -- deterministic key pairs are useless as is because we can't + // generate pair n+1, only pair 0 + randBytes(&seed, 32); + SKY_cipher_GenerateDeterministicKeyPair(seed, &pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + SKY_cipher_GenerateDeterministicKeyPair(seed, &pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestSecKeTest) { + cipher__PubKey pk; + cipher__SecKey sk; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_TestSecKey(&sk); + cr_assert(errcode == SKY_OK); + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_TestSecKey(&sk); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestSecKeyHashTest) { + cipher__PubKey pk; + cipher__SecKey sk; + cipher__SHA256 h; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257}; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + errcode = SKY_cipher_TestSecKeyHash(&sk, &h); + cr_assert(errcode == SKY_OK); + + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_TestSecKeyHash(&sk, &h); + cr_assert(errcode == SKY_ERROR); +} + diff --git a/lib/cgo/tests/check_cipher.hash.c b/lib/cgo/tests/check_cipher.hash.c new file mode 100755 index 0000000..0021920 --- /dev/null +++ b/lib/cgo/tests/check_cipher.hash.c @@ -0,0 +1,345 @@ +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +TestSuite(cipher_hash, .init = setup, .fini = teardown); + +void freshSumRipemd160(GoSlice bytes, cipher__Ripemd160 *rp160){ + + SKY_cipher_HashRipemd160(bytes, rp160); +} + +void freshSumSHA256(GoSlice bytes, cipher__SHA256 *sha256){ + + SKY_cipher_SumSHA256(bytes, sha256); +} + +Test(cipher,TestHashRipemd160){ + cipher__Ripemd160 tmp; + cipher__Ripemd160 r; + cipher__Ripemd160 r2; + unsigned char buff[257]; + GoSlice slice = { buff, 0, 257 }; + + randBytes(&slice,128); + SKY_cipher_HashRipemd160(slice,&tmp); + randBytes(&slice,160); + SKY_cipher_HashRipemd160(slice,&r); + cr_assert(not(eq(u8[sizeof(cipher__Ripemd160)],tmp,r))); + + unsigned char buff1[257]; + GoSlice b = { buff1, 0, 257 }; + randBytes(&b,256); + SKY_cipher_HashRipemd160(b,&r2); + cr_assert(not(eq(u8[sizeof(cipher__Ripemd160)],r2,tmp))); + freshSumRipemd160(b,&tmp); + cr_assert(eq(u8[20],tmp,r2)); +} + +Test(cipher_hash,TestRipemd160Set){ + + cipher__Ripemd160 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + memset(h, 0, sizeof(cipher__Ripemd160)); + randBytes(&slice,21); + + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert( error == SKY_ERROR); + + randBytes(&slice,100); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,19); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,0); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,20); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[20], h, buff)); +} + +Test(cipher_hash,TestSHA256Set){ + + cipher__SHA256 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + randBytes(&slice,33); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,100); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,31); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,0); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,32); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_OK); + + cr_assert(eq(u8[32], h, slice.data)); +} + +Test(cipher_hash,TestSHA256Hex){ + + cipher__SHA256 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + memset(&h, 0, sizeof(h)); + randBytes(&slice,32); + SKY_cipher_SHA256_Set(&h,slice); + GoString s; + + SKY_cipher_SHA256_Hex(&h, (GoString_ *)&s); + registerMemCleanup((void*) s.p); + + cipher__SHA256 h2; + + error = SKY_cipher_SHA256FromHex(s, &h2 ); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[32],h,h2)); + + GoString s2; + + SKY_cipher_SHA256_Hex(&h2, (GoString_ *) &s2); + registerMemCleanup((void*) s2.p); + cr_assert(eq(type(GoString),s,s2)); +} + +Test(cipher_hash,TestSHA256KnownValue){ + + + typedef struct + { + char *input; + char *output; + } tmpstruct; + + tmpstruct vals[3]; + + vals[0].input = "skycoin"; + vals[0].output = "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d"; + + vals[1].input = "hello world"; + vals[1].output = "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"; + + vals[2].input = "hello world asd awd awd awdapodawpokawpod "; + vals[2].output = "99d71f95cafe05ea2dddebc35b6083bd5af0e44850c9dc5139b4476c99950be4"; + + for (int i = 0; i < 3; ++i) + { + GoSlice slice_input; + GoSlice slice_output; + + slice_input.data = vals[i].input; + slice_input.len = strlen(vals[i].input); + slice_input.cap = strlen(vals[i].input)+1; + + cipher__SHA256 sha; + + SKY_cipher_SumSHA256(slice_input,&sha); + + GoString_ tmp_output; + + SKY_cipher_SHA256_Hex(&sha,&tmp_output); + registerMemCleanup((void*) tmp_output.p); + + cr_assert(strcmp(tmp_output.p,vals[i].output)== SKY_OK); + } +} + +Test(cipher_hash,TestSumSHA256){ + + unsigned char bbuff[257], + cbuff[257]; + GoSlice b = { bbuff, 0, 257 }; + cipher__SHA256 h1; + randBytes(&b,256); + SKY_cipher_SumSHA256(b,&h1); + cipher__SHA256 tmp; + cr_assert(not(eq(u8[32],h1,tmp))); + GoSlice c = { cbuff, 0, 257 }; + randBytes(&c,256); + cipher__SHA256 h2; + SKY_cipher_SumSHA256(c,&h2); + cr_assert(not(eq(u8[32],h2,tmp))); + cipher__SHA256 tmp_h2; + freshSumSHA256(c,&tmp_h2); + cr_assert(eq(u8[32],h2,tmp_h2)); +} + +Test(cipher_hash,TestSHA256FromHex){ + unsigned int error; + cipher__SHA256 tmp; + // Invalid hex hash + GoString tmp_string = {"cawcd",5}; + error = SKY_cipher_SHA256FromHex(tmp_string,&tmp); + cr_assert(error == SKY_ERROR); + // Truncated hex hash + cipher__SHA256 h; + unsigned char buff[130]; + char sbuff[300]; + GoSlice slice = { buff,0,130 }; + randBytes(&slice,128); + SKY_cipher_SumSHA256(slice,&h); + strnhex(h,sbuff,sizeof(h) >> 1); + GoString s1 = { sbuff, strlen(sbuff) }; + error = SKY_cipher_SHA256FromHex(s1,&h); + cr_assert(error == SKY_ERROR); + + // Valid hex hash + // char sbuff1[300]; + GoString_ s2; + // strnhex(h,sbuff1,sizeof(h)); + SKY_cipher_SHA256_Hex(&h, &s2 ); + cipher__SHA256 h2; + error = SKY_cipher_SHA256FromHex((*((GoString *) &s2)),&h2); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[32],h,h2)); +} + + +Test(cipher_hash,TestDoubleSHA256){ + unsigned char bbuff[130]; + GoSlice b = { bbuff, 0, 130 }; + randBytes(&b,128); + cipher__SHA256 h; + cipher__SHA256 tmp; + SKY_cipher_DoubleSHA256(b,&h); + cr_assert(not(eq(u8[32],tmp,h))); + freshSumSHA256(b,&tmp); + cr_assert(not(eq(u8[32],tmp,h))); +} + +Test(cipher_hash,TestAddSHA256){ + + unsigned char bbuff[130]; + GoSlice b = { bbuff, 0, 130 }; + randBytes(&b,128); + cipher__SHA256 h; + SKY_cipher_SumSHA256(b,&h); + + unsigned char cbuff[130]; + GoSlice c = { cbuff, 0, 130 }; + randBytes(&c,64); + cipher__SHA256 i; + SKY_cipher_SumSHA256(c,&i); + + cipher__SHA256 add; + cipher__SHA256 tmp; + + SKY_cipher_AddSHA256(&h,&i,&add); + + cr_assert(not(eq(u8[32],add,tmp))); + cr_assert(not(eq(u8[32],add,h))); + cr_assert(not(eq(u8[32],add,i))); +} + +Test(cipher_hash,TestXorSHA256){ + + unsigned char bbuff[129], + cbuff[129]; + GoSlice b = { bbuff, 0, 129 } ; + GoSlice c = { cbuff, 0, 129 }; + cipher__SHA256 h, i; + + randBytes(&b,128); + SKY_cipher_SumSHA256(b,&h); + randBytes(&c,128); + SKY_cipher_SumSHA256(c,&i); + + cipher__SHA256 tmp_xor1; + cipher__SHA256 tmp_xor2; + cipher__SHA256 tmp; + + SKY_cipher_SHA256_Xor(&h,&i,&tmp_xor1); + SKY_cipher_SHA256_Xor(&i,&h,&tmp_xor2); + + cr_assert(not(eq(u8[32],tmp_xor1,h))); + cr_assert(not(eq(u8[32],tmp_xor1,i))); + cr_assert(not(eq(u8[32],tmp_xor1,tmp))); + cr_assert(eq(u8[32],tmp_xor1,tmp_xor2)); + +} + +Test(cipher_hash,TestMerkle){ + unsigned char buff[129]; + cipher__SHA256 hashlist[5]; + GoSlice b = { buff, 0, 129 }, + hashes = { hashlist, 0, 5 }; + cipher__SHA256 h, zero, out, out1, out2, out3, out4; + int i; + + memset(zero, 0, sizeof(zero)); + + for (i = 0; i < 5; i++) { + randBytes(&b, 128); + SKY_cipher_SumSHA256(b, &hashlist[i]); + } + + // Single hash input returns hash + hashes.len = 1; + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], hashlist[0], h)); + + // 2 hashes should be Addcipher__SHA256 of them + hashes.len = 2; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 3 hashes should be Add(Add()) + hashes.len = 3; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &zero, &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 4 hashes should be Add(Add()) + hashes.len = 4; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &hashlist[3], &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 5 hashes + hashes.len = 5; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &hashlist[3], &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out3); + SKY_cipher_AddSHA256(&hashlist[4], &zero, &out1); + SKY_cipher_AddSHA256(&zero, &zero, &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out4); + SKY_cipher_AddSHA256(&out3, &out4, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); +} + diff --git a/lib/cgo/tests/check_cipher.testsuite.c b/lib/cgo/tests/check_cipher.testsuite.c new file mode 100755 index 0000000..d6b635d --- /dev/null +++ b/lib/cgo/tests/check_cipher.testsuite.c @@ -0,0 +1,83 @@ + +#include +#include + +#include "cipher.testsuite.testsuite.go.h" + +// TODO: File path utils. Move elsewhere. + +// Determine if a file name matches pattern for golden dataset +// i.e. matches 'seed-\d+.golden' regex +bool isGoldenFile(const char* filename) { + if (strncmp(filename, "seed-", 5) != 0) + return false; + char* ptr = (char*) filename + 5; + if (*ptr < '0' || *ptr > '9') + return false; + while (*++ptr >= '0' && *ptr <='9') {} + return strcmp(ptr, ".golden") == 0; +} + +TestSuite(cipher_testsuite, .init = setup, .fini = teardown); + +Test(cipher_testsuite, TestManyAddresses) { + SeedTestDataJSON dataJSON; + SeedTestData data; + GoUint32 err; + + json_value* json = loadGoldenFile(MANY_ADDRESSES_FILENAME); + cr_assert(json != NULL, "Error loading file %s", MANY_ADDRESSES_FILENAME); + registerJsonFree(json); + SeedTestDataJSON* dataset = jsonToSeedTestData(json, &dataJSON); + cr_assert(dataset != NULL, "Loaded JSON golden dataset must not be NULL"); + registerSeedTestDataJSONCleanup(&dataJSON); + err = SeedTestDataFromJSON(&dataJSON, &data); + registerSeedTestDataCleanup(&data); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + ValidateSeedData(&data, NULL); +} + +GoUint32 traverseGoldenFiles(const char *path, InputTestData* inputData) { + char* _path[2]; + _path[0] = (char *) path; + _path[1] = NULL; + size_t i = 0; + FTS* tree = fts_open(_path, FTS_NOCHDIR, NULL); + + if (!tree) + return 1; + FTSENT* node; + while ((node = fts_read(tree))) { + if ((node->fts_info & FTS_F) && isGoldenFile(node->fts_name)) { + char fn[FILENAME_MAX]; + fprintf(stderr, "Golden data set %s\n", node->fts_path); + SeedTestDataJSON seedDataJSON; + SeedTestData seedData; + + json_value* json = loadGoldenFile(node->fts_name); + cr_assert(json != NULL, "Error loading file %s", node->fts_name); + SeedTestDataJSON* dataset = jsonToSeedTestData(json, &seedDataJSON); + cr_assert(dataset != NULL, "Loaded JSON seed golden dataset must not be NULL"); + GoUint32 err = SeedTestDataFromJSON(&seedDataJSON, &seedData); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + ValidateSeedData(&seedData, inputData); + } + } + return 0; +} + +Test(cipher_testsuite, TestSeedSignatures) { + InputTestDataJSON inputDataJSON; + InputTestData inputData; + GoUint32 err; + + json_value* json = loadGoldenFile(INPUT_HASHES_FILENAME); + cr_assert(json != NULL, "Error loading file %s", INPUT_HASHES_FILENAME); + InputTestDataJSON* dataset = jsonToInputTestData(json, &inputDataJSON); + cr_assert(dataset != NULL, "Loaded JSON input golden dataset must not be NULL"); + err = InputTestDataFromJSON(&inputDataJSON, &inputData); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + err = traverseGoldenFiles(TEST_DATA_DIR, &inputData); + cr_assert(err == 0); +} + diff --git a/lib/cgo/tests/cipher.testsuite.c b/lib/cgo/tests/cipher.testsuite.c new file mode 100755 index 0000000..7a4bae2 --- /dev/null +++ b/lib/cgo/tests/cipher.testsuite.c @@ -0,0 +1,493 @@ + +#include "cipher.testsuite.testsuite.go.h" + +void empty_gostring(GoString *s) { + s->n = 0; + // FIXME: this satisfies 'all buffers allocated' contract + s->p = calloc(1, sizeof(char)); +} + +void empty_keysdataJSON(KeysTestDataJSON* kdj) { + empty_gostring(&kdj->Address); + empty_gostring(&kdj->Secret); + empty_gostring(&kdj->Public); + kdj->Signatures.len = 0; + kdj->Signatures.cap = 1; + kdj->Signatures.data = calloc(1, sizeof(GoString)); +} + +void json_get_gostring(json_value* value, GoString* s) { + if (value == NULL || value->type != json_string) { + empty_gostring(s); + } else { + s->n = value->u.string.length; + s->p = (const char *) calloc(s->n + 1, sizeof(char)); + memcpy((void *) s->p, (void *)value->u.string.ptr, s->n); + // Append NULL char , just in case + ((char *) s->p)[s->n] = 0; + } +} + +// FIXME: Move elsewhere +json_value* loadGoldenFile(const char* file) { + char path[FILENAME_MAX]; + if(strlen(TEST_DATA_DIR) + strlen(file) < FILENAME_MAX){ + strcat( strcpy(path, TEST_DATA_DIR) , file ); + return loadJsonFile(path); + } + return NULL; +} + +// Deserialize InputTestData JSON representation +InputTestDataJSON* jsonToInputTestData(json_value* json, InputTestDataJSON* input_data) { + if (!json || json->type != json_object) { + return NULL; + } + json_value* hashes = get_json_value(json, "hashes", json_array); + if (hashes == NULL) { + return NULL; + } + int i = 0, + length = hashes->u.array.length; + json_value** hashstr_value = hashes->u.array.values; + input_data->Hashes.len = input_data->Hashes.cap = length; + input_data->Hashes.data = calloc(length, sizeof(GoString)); + GoString* s = (GoString *) input_data->Hashes.data; + for (; i < length; i++, hashstr_value++, s++) { + if ((*hashstr_value)->type != json_string) { + // String value expected. Replace with empty string. + empty_gostring(s); + } else { + json_get_gostring(*hashstr_value, s); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with InputTestDataToJSON +InputTestData* registerInputTestDataCleanup(InputTestData* input_data) { + registerMemCleanup(input_data->Hashes.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with InputTestDataFromJSON +InputTestDataJSON* registerInputTestDataJSONCleanup(InputTestDataJSON* input_data) { + int i = 0, + length = input_data->Hashes.len; + GoString* s = input_data->Hashes.data; + for (; i < length; ++i, s++) { + registerMemCleanup((void *) s->p); + } + registerMemCleanup(input_data->Hashes.data); + return input_data; +} + +// InputTestDataToJSON converts InputTestData to InputTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - input_data.len * sizeof(GoString_) bytes for the strings slice data +// - Buffers to store individual string data +void InputTestDataToJSON(InputTestData* input_data, InputTestDataJSON* json_data) { + GoSlice* hashes = &input_data->Hashes; + GoSlice* hexstrings = &json_data->Hashes; + GoString_* s = hexstrings->data = calloc(hashes->len, sizeof(GoString_)); + hexstrings->len = hexstrings->cap = hashes->len; + + cipher__SHA256* hash = hashes->data; + + int i; + for (i = 0; i < hashes->len; i++, hash++, s++) { + SKY_cipher_SHA256_Hex(hash, s); + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +// +// Allocated memory has to be disposed for: +// +// - json_data.len * sizeof(cipher_SHA256) bytes for the strings slice data +GoUint32 InputTestDataFromJSON(InputTestDataJSON* json_data, InputTestData* input_data) { + GoSlice *hexstrings = &json_data->Hashes; + GoSlice* hashes = &input_data->Hashes; + cipher__SHA256* hash = hashes->data = calloc(hexstrings->len, sizeof(cipher__SHA256)); + hashes->len = hashes->cap = hexstrings->len; + + GoString* s = hexstrings->data; + + int i; + GoUint32 err = SKY_OK; + for (i = 0; i < hexstrings->len && err == SKY_OK; i++, s++, hash++) { + err = SKY_cipher_SHA256FromHex(*s, hash); + } + if (err != SKY_OK) + free(hashes->data); + return err; +} + +// Deserialize KeysTestData JSON representation +KeysTestDataJSON* jsonToKeysTestData(json_value* json, KeysTestDataJSON* input_data) { + if (json->type != json_object) { + return NULL; + } + json_value* value = json_get_string(json, "address"); + json_get_gostring(value, &input_data->Address); + value = json_get_string(json, "secret"); + json_get_gostring(value, &input_data->Secret); + value = json_get_string(json, "public"); + json_get_gostring(value, &input_data->Public); + + value = get_json_value(json, "signatures", json_array); + if (value == NULL) { + return input_data; + } + int i = 0, + length = value->u.array.length; + json_value** array_value = value->u.array.values; + input_data->Signatures.len = input_data->Signatures.cap = length; + input_data->Signatures.data = calloc(length, sizeof(GoString)); + GoString* s = (GoString *) input_data->Signatures.data; + for (; i < length; i++, array_value++, s++) { + if ((*array_value)->type != json_string) { + // String value expected. Replace with empty string + empty_gostring(s); + } else { + json_get_gostring(*array_value, s); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with KeysTestDataFromJSON +KeysTestData* registerKeysTestDataCleanup(KeysTestData* input_data) { + registerMemCleanup(input_data->Signatures.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with KeysTestDataFromJSON +KeysTestDataJSON* registerKeysTestDataJSONCleanup(KeysTestDataJSON* input_data) { + registerMemCleanup((void*) input_data->Address.p); + registerMemCleanup((void*) input_data->Secret.p); + registerMemCleanup((void*) input_data->Public.p); + + int i = 0, + length = input_data->Signatures.len; + GoString* s = input_data->Signatures.data; + for (; i < length; ++i, s++) { + registerMemCleanup((void *) s->p); + } + registerMemCleanup(input_data->Signatures.data); + return input_data; +} + +// KeysTestDataToJSON converts KeysTestData to KeysTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - input_data.Signatures.len * sizeof(GoString_) bytes for the strings slice data +// - Buffers to store individual string data +// - Buffer to store address hex string data +// - Buffer to store pubkey hex string data +// - Buffer to store seckey secret hex string data +void KeysTestDataToJson(KeysTestData* input_data, KeysTestDataJSON* json_data) { + SKY_cipher_Address_String(&input_data->Address, (GoString_*) &json_data->Address); + SKY_cipher_SecKey_Hex(&input_data->Secret, (GoString_*) &json_data->Secret); + SKY_cipher_PubKey_Hex(&input_data->Public, (GoString_*) &json_data->Public); + + json_data->Signatures.len = json_data->Signatures.cap = input_data->Signatures.len; + GoString* s = json_data->Signatures.data = calloc(input_data->Signatures.len, sizeof(GoString)); + + cipher__Sig* sig = (cipher__Sig*) input_data->Signatures.data; + int i; + + for (i = 0; i < input_data->Signatures.len; i++, sig++, s++) { + SKY_cipher_Sig_Hex(sig, (GoString_*) s); + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +// +// +// Allocated memory has to be disposed for: +// +// - json_data.Signatures.len * sizeof(cipher__Sig) bytes for sigs slice data +GoUint32 KeysTestDataFromJSON(KeysTestDataJSON* json_data, KeysTestData* input_data) { + GoUint32 err = SKY_cipher_DecodeBase58Address(json_data->Address, &input_data->Address); + if (err != SKY_OK) + return err; + err = SKY_cipher_SecKeyFromHex(json_data->Secret, &input_data->Secret); + if (err != SKY_OK) + return err; + err = SKY_cipher_PubKeyFromHex(json_data->Public, &input_data->Public); + if (err != SKY_OK) + return err; + + input_data->Signatures.len = input_data->Signatures.cap = json_data->Signatures.len; + input_data->Signatures.data = calloc(input_data->Signatures.cap, sizeof(cipher__Sig)); + cipher__Sig* sig = (cipher__Sig*) input_data->Signatures.data; + + GoString* s = (GoString*) json_data->Signatures.data; + int i; + err = SKY_OK; + + for (i = 0; i < json_data->Signatures.len && err == SKY_OK; i++, sig++, s++) { + SKY_cipher_SigFromHex(*s, sig); + } + if (err != SKY_OK) + free(input_data->Signatures.data); + return err; +} + +// Deserialize SeedTestData JSON representation +SeedTestDataJSON* jsonToSeedTestData(json_value* json, SeedTestDataJSON* input_data) { + if (json->type != json_object) { + return NULL; + } + json_value* value = json_get_string(json, "seed"); + json_get_gostring(value, &(input_data->Seed)); + + value = get_json_value(json, "keys", json_array); + int i = 0, + length = value->u.array.length; + json_value** array_value = value->u.array.values; + input_data->Keys.len = input_data->Keys.cap = length; + input_data->Keys.data = calloc(length, sizeof(KeysTestDataJSON)); + KeysTestDataJSON* kd = (KeysTestDataJSON*) input_data->Keys.data; + for (; i < length; i++, array_value++, kd++) { + if ((*array_value)->type != json_object) { + // String value expected. Replace with empty string + empty_keysdataJSON(kd); + } else { + jsonToKeysTestData(*array_value, kd); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with SeedTestDataFromJSON +SeedTestData* registerSeedTestDataCleanup(SeedTestData* input_data) { + registerMemCleanup(input_data->Seed.data); + + int i = 0, + length = input_data->Keys.len; + KeysTestData* kd = input_data->Keys.data; + for (; i < length; ++i, kd++) { + registerKeysTestDataCleanup(kd); + } + registerMemCleanup(input_data->Keys.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with SeedTestDataFromJSON +SeedTestDataJSON* registerSeedTestDataJSONCleanup(SeedTestDataJSON* input_data) { + registerMemCleanup((void*) input_data->Seed.p); + + int i = 0, + length = input_data->Keys.len; + KeysTestDataJSON* kd = input_data->Keys.data; + for (; i < length; ++i, kd++) { + registerKeysTestDataJSONCleanup((void*) kd); + } + registerMemCleanup(input_data->Keys.data); + return input_data; +} + +// SeedTestDataToJSON converts SeedTestData to SeedTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - Buffer to store seed hex data +// - input_data.Keys.len * sizeof(KeysTestDataJSON) bytes for keys test data slice +// - Memory requirements to allocate JSON data for instances of KeysTestDataJSON in Keys +// see KeysTestDataToJSON +void SeedTestDataToJson(SeedTestData* input_data, SeedTestDataJSON* json_data) { + json_data->Keys.len = json_data->Keys.cap = input_data->Keys.len; + json_data->Keys.data = calloc(input_data->Keys.len, sizeof(KeysTestDataJSON)); + KeysTestDataJSON* kj = (KeysTestDataJSON*) json_data->Keys.data; + + KeysTestData* k = (KeysTestData*) input_data->Keys.data; + int i; + + for (i = 0; i < input_data->Keys.len; i++, k++, kj++) { + KeysTestDataToJson(k, kj); + } + + unsigned int b64seed_size = b64e_size(input_data->Seed.len + 1) + 1; + json_data->Seed.p = malloc(b64seed_size); + json_data->Seed.n = b64_encode((const unsigned char*) input_data->Seed.data, + input_data->Seed.len, input_data->Seed.data); +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +// +// +// Allocated memory has to be disposed for: +// +// - Seed slice bytes buffer +// - json_data.Keys.len * sizeof(cipher__KeysTestData) bytes for keys test slice data +// - Memory requirements to allocate individual instances of KeyTestData in Keys +// see KeysTestDataFromJSON +GoUint32 SeedTestDataFromJSON(SeedTestDataJSON* json_data, SeedTestData* input_data) { + input_data->Seed.cap = b64d_size(json_data->Seed.n); + input_data->Seed.data = malloc(input_data->Seed.cap); + input_data->Seed.len = b64_decode((const unsigned char *)json_data->Seed.p, + json_data->Seed.n, input_data->Seed.data); + + input_data->Keys.len = input_data->Keys.cap = json_data->Keys.len; + input_data->Keys.data = calloc(input_data->Keys.cap, sizeof(KeysTestData)); + KeysTestData* k = (KeysTestData*) input_data->Keys.data; + + KeysTestDataJSON* kj = (KeysTestDataJSON*) json_data->Keys.data; + int i; + GoUint32 err = SKY_OK; + + for (i = 0; i < json_data->Keys.len && err == SKY_OK; i++, k++, kj++) { + err = KeysTestDataFromJSON(kj, k); + } + if (err != SKY_OK) + free(input_data->Keys.data); + return err; +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +void ValidateSeedData(SeedTestData* seedData, InputTestData* inputData) { + cipher__PubKey pubkey; + cipher__SecKey seckey; + GoSlice keys; + + // Force allocation of memory for slice buffer + keys.len = keys.cap = 0; + keys.data = NULL; + + SKY_cipher_GenerateDeterministicKeyPairs(seedData->Seed, seedData->Keys.len, (GoSlice_*) &keys); + + cr_assert(keys.data != NULL, + "SKY_cipher_GenerateDeterministicKeyPairs must allocate memory slice with zero cap"); + // Ensure buffer allocated for generated keys is disposed after testing + registerMemCleanup(keys.data); + cr_assert(seedData->Keys.len - keys.len == 0, + "SKY_cipher_GenerateDeterministicKeyPairs must generate expected number of keys"); + + cipher__SecKey skNull; + cipher__PubKey pkNull; + cipher__Address addrNull; + cipher__Sig sigNull; + + struct cr_mem mem_actual; + struct cr_mem mem_expect; + + memset((void *)&skNull, 0, sizeof(cipher__SecKey)); + memset((void *)&pkNull, 0, sizeof(cipher__PubKey)); + memset((void *)&addrNull, 0, sizeof(cipher__Address)); + memset((void *)&sigNull, 0, sizeof(cipher__Sig)); + + int i = 0; + KeysTestData* expected = (KeysTestData*) seedData->Keys.data; + cipher__SecKey *s = (cipher__SecKey*) keys.data; + for (; i < keys.len; i++, s++, expected++) { + mem_expect.data = skNull; + mem_actual.data = *s; + mem_actual.size = mem_expect.size = sizeof(cipher__SecKey); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th secret key must not be null", i); + cr_assert(eq(u8[32], (*s), expected->Secret), + "%d-th generated secret key must match provided secret key", i); + + cipher__PubKey p; + SKY_cipher_PubKeyFromSecKey(s, &p); + mem_expect.data = pkNull; + mem_actual.data = p; + mem_actual.size = mem_expect.size = sizeof(cipher__PubKey); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th public key must not be null", i); + cr_assert(eq(u8[33], expected->Public, p), + "%d-th derived public key must match provided public key", i); + + cipher__Address addr1; + SKY_cipher_AddressFromPubKey(&p, &addr1); + cr_assert(ne(type(cipher__Address), addrNull, addr1), + "%d-th address from pubkey must not be null", i); + cr_assert(eq(type(cipher__Address), expected->Address, addr1), + "%d-th derived address must match provided address", i); + + cipher__Address addr2; + SKY_cipher_AddressFromSecKey(s, &addr2); + cr_assert(ne(type(cipher__Address), addrNull, addr1), + "%d-th address from sec key must not be null", i); + cr_assert(eq(type(cipher__Address), addr1, addr2), + "%d-th SKY_cipher_AddressFromPubKey and SKY_cipher_AddressFromSecKey must generate same addresses", i); + + // TODO : Translate once secp256k1 be part of libskycoin + /* + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + */ + + // FIXME: without cond : 'not give a valid preprocessing token' + bool cond = (!(inputData == NULL && expected->Signatures.len != 0)); + cr_assert(cond, "%d seed data contains signatures but input data was not provided", i); + + if (inputData != NULL) { + cr_assert(expected->Signatures.len == inputData->Hashes.len, + "Number of signatures in %d-th seed data does not match number of hashes in input data", i); + + cipher__SHA256* h = (cipher__SHA256*) inputData->Hashes.data; + cipher__Sig* sig = (cipher__Sig*) expected->Signatures.data; + int j = 0; + for (; j < inputData->Hashes.len; j++, h++, sig++) { + mem_expect.data = sigNull; + mem_actual.data = *sig; + mem_actual.size = mem_expect.size = sizeof(cipher__Sig); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th provided signature for %d-th data set must not be null", j, i); + GoUint32 err = SKY_cipher_VerifySignature(&p, sig, h); + cr_assert(err == SKY_OK, + "SKY_cipher_VerifySignature failed: error=%d dataset=%d hashidx=%d", err, i, j); + err = SKY_cipher_ChkSig(&addr1, h, sig); + cr_assert(err == SKY_OK, "SKY_cipher_ChkSig failed: error=%d dataset=%d hashidx=%d", err, i, j); + err = SKY_cipher_VerifySignedHash(sig, h); + cr_assert(err == SKY_OK, + "SKY_cipher_VerifySignedHash failed: error=%d dataset=%d hashidx=%d", err, i, j); + + cipher__PubKey p2; + err = SKY_cipher_PubKeyFromSig(sig, h, &p2); + cr_assert(err == SKY_OK, + "SKY_cipher_PubKeyFromSig failed: error=%d dataset=%d hashidx=%d", err, i, j); + cr_assert(eq(u8[32], p, p2), + "public key derived from %d-th signature in %d-th dataset must match public key derived from secret", + j, i); + + cipher__Sig sig2; + SKY_cipher_SignHash(h, s, &sig2); + mem_expect.data = sigNull; + mem_actual.data = sig2; + mem_actual.size = mem_expect.size = sizeof(cipher__Sig); + cr_assert(ne(mem, mem_actual, mem_expect), + "created signature for %d-th hash in %d-th dataset is null", j, i); + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + } +} diff --git a/lib/cgo/tests/libsky_criterion.c b/lib/cgo/tests/libsky_criterion.c new file mode 100755 index 0000000..80e7bcf --- /dev/null +++ b/lib/cgo/tests/libsky_criterion.c @@ -0,0 +1,104 @@ + +#include +#include "skycriterion.h" +#include "skystring.h" + +int cr_user_cipher__Address_eq(cipher__Address *addr1, cipher__Address *addr2){ + if(addr1->Version != addr2->Version) + return 0; + for (int i = 0; i < sizeof(cipher__Ripemd160); ++i) { + if(addr1->Key[i] != addr2->Key[i]) + return 0; + } + return 1; +} + +char *cr_user_cipher__Address_tostr(cipher__Address *addr1) +{ + char *out; + + cr_asprintf(&out, "(cipher__Address) { .Key = %s, .Version = %llu }", addr1->Key, (unsigned long long) addr1->Version); + return out; +} + +int cr_user_cipher__Address_noteq(cipher__Address *addr1, cipher__Address *addr2){ + if(addr1->Version != addr2->Version) + return 0; + for (int i = 0; i < sizeof(cipher__Ripemd160); ++i) { + if(addr1->Key[i] != addr2->Key[i]) + return 0; + } + return 1; +} + +int cr_user_GoString_eq(GoString *string1, GoString *string2){ + return (string1->n == string2->n) && + (strcmp( (char *) string1->p, (char *) string2->p) == 0); +} + +char *cr_user_GoString_tostr(GoString *string) +{ + char *out; + cr_asprintf(&out, "(GoString) { .Data = %s, .Length = %llu }", + string->p, (unsigned long long) string->n); + return out; +} + +int cr_user_GoString__eq(GoString_ *string1, GoString_ *string2){ + return cr_user_GoString_eq((GoString *) &string1, (GoString *) &string2); +} + +char *cr_user_GoString__tostr(GoString_ *string) { + return cr_user_GoString_tostr((GoString *)string); +} + +int cr_user_cipher__SecKey_eq(cipher__SecKey *seckey1, cipher__SecKey *seckey2){ + return memcmp((void *)seckey1,(void *)seckey2, sizeof(cipher__SecKey)) == 0; +} + +char *cr_user_cipher__SecKey_tostr(cipher__SecKey *seckey1) +{ + char *out; + char hexdump[101]; + + strnhex((unsigned char *)seckey1, hexdump, sizeof(cipher__SecKey)); + cr_asprintf(&out, "(cipher__SecKey) { %s }", hexdump); + return out; +} + + +int cr_user_cipher__Ripemd160_noteq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2){ + return memcmp((void *)rp1,(void *)rp2, sizeof(cipher__Ripemd160)) != 0; +} + +int cr_user_cipher__Ripemd160_eq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2){ + return memcmp((void *)rp1,(void *)rp2, sizeof(cipher__Ripemd160)) == 0; +} + +char *cr_user_cipher__Ripemd160_tostr(cipher__Ripemd160 *rp1) +{ + char *out; + char hexdump[101]; + + strnhex((unsigned char *)rp1, hexdump, sizeof(cipher__Ripemd160)); + cr_asprintf(&out, "(cipher__Ripemd160) { %s }", hexdump ); + return out; +} + +int cr_user_cipher__SHA256_noteq(cipher__SHA256 *sh1, cipher__SHA256 *sh2){ + return memcmp((void *)sh1,(void *)sh1, sizeof(cipher__SHA256)) != 0; +} + +int cr_user_cipher__SHA256_eq(cipher__SHA256 *sh1, cipher__SHA256 *sh2){ + return memcmp((void *)sh1,(void *)sh1, sizeof(cipher__SHA256)) == 0; +} + +char *cr_user_cipher__SHA256_tostr(cipher__SHA256 *sh1) { + char *out; + char hexdump[101]; + + strnhex((unsigned char *)sh1, hexdump, sizeof(cipher__SHA256)); + cr_asprintf(&out, "(cipher__SHA256) { %s }", hexdump); + return out; +} + diff --git a/lib/cgo/tests/libsky_string.c b/lib/cgo/tests/libsky_string.c new file mode 100755 index 0000000..5cf44ff --- /dev/null +++ b/lib/cgo/tests/libsky_string.c @@ -0,0 +1,30 @@ + +#include "skystring.h" + +#define ALPHANUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +#define ALPHANUM_LEN 62 +#define SIZE_ALL -1 + +void randBytes(GoSlice *bytes, size_t n) { + size_t i = 0; + unsigned char *ptr = (unsigned char *) bytes->data; + for (; i < n; ++i, ++ptr) { + *ptr = ALPHANUM[rand() % ALPHANUM_LEN]; + } + bytes->len = (GoInt) n; +} + +void strnhex(unsigned char* buf, char *str, int n){ + unsigned char * pin = buf; + const char * hex = "0123456789ABCDEF"; + char * pout = str; + for(; *pin && n; --n){ + *pout++ = hex[(*pin>>4)&0xF]; + *pout++ = hex[(*pin++)&0xF]; + } + *pout = 0; +} + +void strhex(unsigned char* buf, char *str){ + strnhex(buf, str, SIZE_ALL); +} diff --git a/lib/cgo/tests/libsky_testutil.c b/lib/cgo/tests/libsky_testutil.c new file mode 100755 index 0000000..b38a03b --- /dev/null +++ b/lib/cgo/tests/libsky_testutil.c @@ -0,0 +1,121 @@ + +#include +#include +#include +#include +#include + +#include "json.h" +#include "skytest.h" +#include "skytypes.h" + +int MEMPOOLIDX = 0; +void *MEMPOOL[1024 * 256]; + +int JSONPOOLIDX = 0; +json_value* JSON_POOL[128]; + +void* registerMemCleanup(void* p) { + int i; + for (i = 0; i < MEMPOOLIDX; i++) { + if(MEMPOOL[i] == NULL){ + MEMPOOL[i] = p; + return p; + } + } + MEMPOOL[MEMPOOLIDX++] = p; + return p; +} + +int registerJsonFree(void *p){ + int i; + for (i = 0; i < JSONPOOLIDX; i++) { + if(JSON_POOL[i] == NULL){ + JSON_POOL[i] = p; + return i; + } + } + JSON_POOL[JSONPOOLIDX++] = p; + return JSONPOOLIDX-1; +} + +void cleanupMem() { + int i; + void **ptr; + + for (i = MEMPOOLIDX, ptr = MEMPOOL; i; --i) { + if( *ptr ) { + free(*ptr); + *ptr = NULL; + } + ptr++; + } + MEMPOOLIDX = 0; + for (i = JSONPOOLIDX, ptr = (void*)JSON_POOL; i; --i) { + if( *ptr ) { + json_value_free(*ptr); + *ptr = NULL; + } + ptr++; + } + JSONPOOLIDX = 0; +} + +json_value* loadJsonFile(const char* filename){ + FILE *fp; + struct stat filestatus; + int file_size; + char* file_contents; + json_char* json; + json_value* value; + + if ( stat(filename, &filestatus) != 0) { + return NULL; + } + file_size = filestatus.st_size; + file_contents = (char*)malloc(filestatus.st_size); + if ( file_contents == NULL) { + return NULL; + } + fp = fopen(filename, "rt"); + if (fp == NULL) { + free(file_contents); + return NULL; + } + if ( fread(file_contents, file_size, 1, fp) != 1 ) { + fclose(fp); + free(file_contents); + return NULL; + } + fclose(fp); + + json = (json_char*)file_contents; + value = json_parse(json, file_size); + free(file_contents); + return value; +} + +void setup(void) { + srand ((unsigned int) time (NULL)); +} + +void teardown(void) { + cleanupMem(); +} + +// TODO: Move to libsky_io.c +void fprintbuff(FILE *f, void *buff, size_t n) { + unsigned char *ptr = (unsigned char *) buff; + fprintf(f, "[ "); + for (; n; --n, ptr++) { + fprintf(f, "%02d ", *ptr); + } + fprintf(f, "]"); +} + + +void toGoString(GoString_ *s, GoString *r){ +GoString * tmp = r; + + *tmp = (*(GoString *) s); +} diff --git a/lib/cgo/tests/testutils/base64.c b/lib/cgo/tests/testutils/base64.c new file mode 100755 index 0000000..fa9585b --- /dev/null +++ b/lib/cgo/tests/testutils/base64.c @@ -0,0 +1,187 @@ +/* +base64.c - by Joe DF (joedf@ahkscript.org) +Released under the MIT License + +See "base64.h", for more information. + +Thank you for inspiration: +http://www.codeproject.com/Tips/813146/Fast-base-functions-for-encode-decode +*/ + +#include "base64.h" +#include + +//Base64 char table - used internally for encoding +unsigned char b64_chr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +unsigned int b64_int(unsigned int ch) { + // ASCII to base64_int + // 65-90 Upper Case >> 0-25 + // 97-122 Lower Case >> 26-51 + // 48-57 Numbers >> 52-61 + // 43 Plus (+) >> 62 + // 47 Slash (/) >> 63 + // 61 Equal (=) >> 64~ + if (ch==43) + return 62; + if (ch==47) + return 63; + if (ch==61) + return 64; + if ((ch>47) && (ch<58)) + return ch + 4; + if ((ch>64) && (ch<91)) + return ch - 'A'; + if ((ch>96) && (ch<123)) + return (ch - 'a') + 26; + return 0; +} + +unsigned int b64e_size(unsigned int in_size) { + // size equals 4*floor((1/3)*(in_size+2)); + int i, j = 0; + for (i=0;i>2 ]; + out[k+1] = b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ]; + out[k+2] = b64_chr[ ((s[1]&0x0F)<<2)+((s[2]&0xC0)>>6) ]; + out[k+3] = b64_chr[ s[2]&0x3F ]; + j=0; k+=4; + } + } + + if (j) { + if (j==1) + s[1] = 0; + out[k+0] = b64_chr[ (s[0]&255)>>2 ]; + out[k+1] = b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ]; + if (j==2) + out[k+2] = b64_chr[ ((s[1]&0x0F)<<2) ]; + else + out[k+2] = '='; + out[k+3] = '='; + k+=4; + } + + out[k] = '\0'; + + return k; +} + +unsigned int b64_decode(const unsigned char* in, unsigned int in_len, unsigned char* out) { + + unsigned int i=0, j=0, k=0, s[4]; + for (i=0;i>4); + if (s[2]!=64) { + out[k+1] = ((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2); + if ((s[3]!=64)) { + out[k+2] = ((s[2]&0x03)<<6)+(s[3]); k+=3; + } else { + k+=2; + } + } else { + k+=1; + } + j=0; + } + } + + return k; +} + +unsigned int b64_encodef(char *InFile, char *OutFile) { + + FILE *pInFile = fopen(InFile,"rb"); + FILE *pOutFile = fopen(OutFile,"wb"); + if ( (pInFile==NULL) || (pOutFile==NULL) ) + return 0; + + unsigned int i=0, j=0, c=0, s[3]; + + while(c!=EOF) { + c=fgetc(pInFile); + if (c==EOF) + break; + s[j++]=c; + if (j==3) { + fputc(b64_chr[ (s[0]&255)>>2 ],pOutFile); + fputc(b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ],pOutFile); + fputc(b64_chr[ ((s[1]&0x0F)<<2)+((s[2]&0xC0)>>6) ],pOutFile); + fputc(b64_chr[ s[2]&0x3F ],pOutFile); + j=0; i+=4; + } + } + + if (j) { + if (j==1) + s[1] = 0; + fputc(b64_chr[ (s[0]&255)>>2 ],pOutFile); + fputc(b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ],pOutFile); + if (j==2) + fputc(b64_chr[ ((s[1]&0x0F)<<2) ],pOutFile); + else + fputc('=',pOutFile); + fputc('=',pOutFile); + i+=4; + } + + fclose(pInFile); + fclose(pOutFile); + + return i; +} + +unsigned int b64_decodef(char *InFile, char *OutFile) { + + FILE *pInFile = fopen(InFile,"rb"); + FILE *pOutFile = fopen(OutFile,"wb"); + if ( (pInFile==NULL) || (pOutFile==NULL) ) + return 0; + + unsigned int c=0, j=0, k=0, s[4]; + + while(c!=EOF) { + c=fgetc(pInFile); + if (c==EOF) + break; + s[j++]=b64_int(c); + if (j==4) { + fputc(((s[0]&255)<<2)+((s[1]&0x30)>>4),pOutFile); + if (s[2]!=64) { + fputc(((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2),pOutFile); + if ((s[3]!=64)) { + fputc(((s[2]&0x03)<<6)+(s[3]),pOutFile); k+=3; + } else { + k+=2; + } + } else { + k+=1; + } + j=0; + } + } + + fclose(pInFile); + fclose(pOutFile); + + return k; +} + diff --git a/lib/cgo/tests/testutils/json.c b/lib/cgo/tests/testutils/json.c new file mode 100755 index 0000000..bae4b35 --- /dev/null +++ b/lib/cgo/tests/testutils/json.c @@ -0,0 +1,1012 @@ + +/* vim: set et ts=3 sw=3 sts=3 ft=c: + * + * Copyright (C) 2012, 2013, 2014 James McLaughlin et al. All rights reserved. + * https://github.com/udp/json-parser + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "json.h" + +#ifdef _MSC_VER + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif +#endif + +const struct _json_value json_value_none; + +#include +#include +#include +#include + +typedef unsigned int json_uchar; + +static unsigned char hex_value (json_char c) +{ + if (isdigit(c)) + return c - '0'; + + switch (c) { + case 'a': case 'A': return 0x0A; + case 'b': case 'B': return 0x0B; + case 'c': case 'C': return 0x0C; + case 'd': case 'D': return 0x0D; + case 'e': case 'E': return 0x0E; + case 'f': case 'F': return 0x0F; + default: return 0xFF; + } +} + +typedef struct +{ + unsigned long used_memory; + + unsigned int uint_max; + unsigned long ulong_max; + + json_settings settings; + int first_pass; + + const json_char * ptr; + unsigned int cur_line, cur_col; + +} json_state; + +static void * default_alloc (size_t size, int zero, void * user_data) +{ + return zero ? calloc (1, size) : malloc (size); +} + +static void default_free (void * ptr, void * user_data) +{ + free (ptr); +} + +static void * json_alloc (json_state * state, unsigned long size, int zero) +{ + if ((state->ulong_max - state->used_memory) < size) + return 0; + + if (state->settings.max_memory + && (state->used_memory += size) > state->settings.max_memory) + { + return 0; + } + + return state->settings.mem_alloc (size, zero, state->settings.user_data); +} + +static int new_value (json_state * state, + json_value ** top, json_value ** root, json_value ** alloc, + json_type type) +{ + json_value * value; + int values_size; + + if (!state->first_pass) + { + value = *top = *alloc; + *alloc = (*alloc)->_reserved.next_alloc; + + if (!*root) + *root = value; + + switch (value->type) + { + case json_array: + + if (value->u.array.length == 0) + break; + + if (! (value->u.array.values = (json_value **) json_alloc + (state, value->u.array.length * sizeof (json_value *), 0)) ) + { + return 0; + } + + value->u.array.length = 0; + break; + + case json_object: + + if (value->u.object.length == 0) + break; + + values_size = sizeof (*value->u.object.values) * value->u.object.length; + + if (! (value->u.object.values = (json_object_entry *) json_alloc + (state, values_size + ((unsigned long) value->u.object.values), 0)) ) + { + return 0; + } + + value->_reserved.object_mem = (*(char **) &value->u.object.values) + values_size; + + value->u.object.length = 0; + break; + + case json_string: + + if (! (value->u.string.ptr = (json_char *) json_alloc + (state, (value->u.string.length + 1) * sizeof (json_char), 0)) ) + { + return 0; + } + + value->u.string.length = 0; + break; + + default: + break; + }; + + return 1; + } + + if (! (value = (json_value *) json_alloc + (state, sizeof (json_value) + state->settings.value_extra, 1))) + { + return 0; + } + + if (!*root) + *root = value; + + value->type = type; + value->parent = *top; + + #ifdef JSON_TRACK_SOURCE + value->line = state->cur_line; + value->col = state->cur_col; + #endif + + if (*alloc) + (*alloc)->_reserved.next_alloc = value; + + *alloc = *top = value; + + return 1; +} + +#define whitespace \ + case '\n': ++ state.cur_line; state.cur_col = 0; \ + case ' ': case '\t': case '\r' + +#define string_add(b) \ + do { if (!state.first_pass) string [string_length] = b; ++ string_length; } while (0); + +#define line_and_col \ + state.cur_line, state.cur_col + +static const long + flag_next = 1 << 0, + flag_reproc = 1 << 1, + flag_need_comma = 1 << 2, + flag_seek_value = 1 << 3, + flag_escaped = 1 << 4, + flag_string = 1 << 5, + flag_need_colon = 1 << 6, + flag_done = 1 << 7, + flag_num_negative = 1 << 8, + flag_num_zero = 1 << 9, + flag_num_e = 1 << 10, + flag_num_e_got_sign = 1 << 11, + flag_num_e_negative = 1 << 12, + flag_line_comment = 1 << 13, + flag_block_comment = 1 << 14; + +json_value * json_parse_ex (json_settings * settings, + const json_char * json, + size_t length, + char * error_buf) +{ + json_char error [json_error_max]; + const json_char * end; + json_value * top, * root, * alloc = 0; + json_state state = { 0 }; + long flags; + long num_digits = 0, num_e = 0; + json_int_t num_fraction = 0; + + /* Skip UTF-8 BOM + */ + if (length >= 3 && ((unsigned char) json [0]) == 0xEF + && ((unsigned char) json [1]) == 0xBB + && ((unsigned char) json [2]) == 0xBF) + { + json += 3; + length -= 3; + } + + error[0] = '\0'; + end = (json + length); + + memcpy (&state.settings, settings, sizeof (json_settings)); + + if (!state.settings.mem_alloc) + state.settings.mem_alloc = default_alloc; + + if (!state.settings.mem_free) + state.settings.mem_free = default_free; + + memset (&state.uint_max, 0xFF, sizeof (state.uint_max)); + memset (&state.ulong_max, 0xFF, sizeof (state.ulong_max)); + + state.uint_max -= 8; /* limit of how much can be added before next check */ + state.ulong_max -= 8; + + for (state.first_pass = 1; state.first_pass >= 0; -- state.first_pass) + { + json_uchar uchar; + unsigned char uc_b1, uc_b2, uc_b3, uc_b4; + json_char * string = 0; + unsigned int string_length = 0; + + top = root = 0; + flags = flag_seek_value; + + state.cur_line = 1; + + for (state.ptr = json ;; ++ state.ptr) + { + json_char b = (state.ptr == end ? 0 : *state.ptr); + + if (flags & flag_string) + { + if (!b) + { sprintf (error, "Unexpected EOF in string (at %d:%d)", line_and_col); + goto e_failed; + } + + if (string_length > state.uint_max) + goto e_overflow; + + if (flags & flag_escaped) + { + flags &= ~ flag_escaped; + + switch (b) + { + case 'b': string_add ('\b'); break; + case 'f': string_add ('\f'); break; + case 'n': string_add ('\n'); break; + case 'r': string_add ('\r'); break; + case 't': string_add ('\t'); break; + case 'u': + + if (end - state.ptr <= 4 || + (uc_b1 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b2 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b3 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b4 = hex_value (*++ state.ptr)) == 0xFF) + { + sprintf (error, "Invalid character value `%c` (at %d:%d)", b, line_and_col); + goto e_failed; + } + + uc_b1 = (uc_b1 << 4) | uc_b2; + uc_b2 = (uc_b3 << 4) | uc_b4; + uchar = (uc_b1 << 8) | uc_b2; + + if ((uchar & 0xF800) == 0xD800) { + json_uchar uchar2; + + if (end - state.ptr <= 6 || (*++ state.ptr) != '\\' || (*++ state.ptr) != 'u' || + (uc_b1 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b2 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b3 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b4 = hex_value (*++ state.ptr)) == 0xFF) + { + sprintf (error, "Invalid character value `%c` (at %d:%d)", b, line_and_col); + goto e_failed; + } + + uc_b1 = (uc_b1 << 4) | uc_b2; + uc_b2 = (uc_b3 << 4) | uc_b4; + uchar2 = (uc_b1 << 8) | uc_b2; + + uchar = 0x010000 | ((uchar & 0x3FF) << 10) | (uchar2 & 0x3FF); + } + + if (sizeof (json_char) >= sizeof (json_uchar) || (uchar <= 0x7F)) + { + string_add ((json_char) uchar); + break; + } + + if (uchar <= 0x7FF) + { + if (state.first_pass) + string_length += 2; + else + { string [string_length ++] = 0xC0 | (uchar >> 6); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + } + + if (uchar <= 0xFFFF) { + if (state.first_pass) + string_length += 3; + else + { string [string_length ++] = 0xE0 | (uchar >> 12); + string [string_length ++] = 0x80 | ((uchar >> 6) & 0x3F); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + } + + if (state.first_pass) + string_length += 4; + else + { string [string_length ++] = 0xF0 | (uchar >> 18); + string [string_length ++] = 0x80 | ((uchar >> 12) & 0x3F); + string [string_length ++] = 0x80 | ((uchar >> 6) & 0x3F); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + + default: + string_add (b); + }; + + continue; + } + + if (b == '\\') + { + flags |= flag_escaped; + continue; + } + + if (b == '"') + { + if (!state.first_pass) + string [string_length] = 0; + + flags &= ~ flag_string; + string = 0; + + switch (top->type) + { + case json_string: + + top->u.string.length = string_length; + flags |= flag_next; + + break; + + case json_object: + + if (state.first_pass) + (*(json_char **) &top->u.object.values) += string_length + 1; + else + { + top->u.object.values [top->u.object.length].name + = (json_char *) top->_reserved.object_mem; + + top->u.object.values [top->u.object.length].name_length + = string_length; + + (*(json_char **) &top->_reserved.object_mem) += string_length + 1; + } + + flags |= flag_seek_value | flag_need_colon; + continue; + + default: + break; + }; + } + else + { + string_add (b); + continue; + } + } + + if (state.settings.settings & json_enable_comments) + { + if (flags & (flag_line_comment | flag_block_comment)) + { + if (flags & flag_line_comment) + { + if (b == '\r' || b == '\n' || !b) + { + flags &= ~ flag_line_comment; + -- state.ptr; /* so null can be reproc'd */ + } + + continue; + } + + if (flags & flag_block_comment) + { + if (!b) + { sprintf (error, "%d:%d: Unexpected EOF in block comment", line_and_col); + goto e_failed; + } + + if (b == '*' && state.ptr < (end - 1) && state.ptr [1] == '/') + { + flags &= ~ flag_block_comment; + ++ state.ptr; /* skip closing sequence */ + } + + continue; + } + } + else if (b == '/') + { + if (! (flags & (flag_seek_value | flag_done)) && top->type != json_object) + { sprintf (error, "%d:%d: Comment not allowed here", line_and_col); + goto e_failed; + } + + if (++ state.ptr == end) + { sprintf (error, "%d:%d: EOF unexpected", line_and_col); + goto e_failed; + } + + switch (b = *state.ptr) + { + case '/': + flags |= flag_line_comment; + continue; + + case '*': + flags |= flag_block_comment; + continue; + + default: + sprintf (error, "%d:%d: Unexpected `%c` in comment opening sequence", line_and_col, b); + goto e_failed; + }; + } + } + + if (flags & flag_done) + { + if (!b) + break; + + switch (b) + { + whitespace: + continue; + + default: + + sprintf (error, "%d:%d: Trailing garbage: `%c`", + state.cur_line, state.cur_col, b); + + goto e_failed; + }; + } + + if (flags & flag_seek_value) + { + switch (b) + { + whitespace: + continue; + + case ']': + + if (top && top->type == json_array) + flags = (flags & ~ (flag_need_comma | flag_seek_value)) | flag_next; + else + { sprintf (error, "%d:%d: Unexpected ]", line_and_col); + goto e_failed; + } + + break; + + default: + + if (flags & flag_need_comma) + { + if (b == ',') + { flags &= ~ flag_need_comma; + continue; + } + else + { + sprintf (error, "%d:%d: Expected , before %c", + state.cur_line, state.cur_col, b); + + goto e_failed; + } + } + + if (flags & flag_need_colon) + { + if (b == ':') + { flags &= ~ flag_need_colon; + continue; + } + else + { + sprintf (error, "%d:%d: Expected : before %c", + state.cur_line, state.cur_col, b); + + goto e_failed; + } + } + + flags &= ~ flag_seek_value; + + switch (b) + { + case '{': + + if (!new_value (&state, &top, &root, &alloc, json_object)) + goto e_alloc_failure; + + continue; + + case '[': + + if (!new_value (&state, &top, &root, &alloc, json_array)) + goto e_alloc_failure; + + flags |= flag_seek_value; + continue; + + case '"': + + if (!new_value (&state, &top, &root, &alloc, json_string)) + goto e_alloc_failure; + + flags |= flag_string; + + string = top->u.string.ptr; + string_length = 0; + + continue; + + case 't': + + if ((end - state.ptr) < 3 || *(++ state.ptr) != 'r' || + *(++ state.ptr) != 'u' || *(++ state.ptr) != 'e') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_boolean)) + goto e_alloc_failure; + + top->u.boolean = 1; + + flags |= flag_next; + break; + + case 'f': + + if ((end - state.ptr) < 4 || *(++ state.ptr) != 'a' || + *(++ state.ptr) != 'l' || *(++ state.ptr) != 's' || + *(++ state.ptr) != 'e') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_boolean)) + goto e_alloc_failure; + + flags |= flag_next; + break; + + case 'n': + + if ((end - state.ptr) < 3 || *(++ state.ptr) != 'u' || + *(++ state.ptr) != 'l' || *(++ state.ptr) != 'l') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_null)) + goto e_alloc_failure; + + flags |= flag_next; + break; + + default: + + if (isdigit (b) || b == '-') + { + if (!new_value (&state, &top, &root, &alloc, json_integer)) + goto e_alloc_failure; + + if (!state.first_pass) + { + while (isdigit (b) || b == '+' || b == '-' + || b == 'e' || b == 'E' || b == '.') + { + if ( (++ state.ptr) == end) + { + b = 0; + break; + } + + b = *state.ptr; + } + + flags |= flag_next | flag_reproc; + break; + } + + flags &= ~ (flag_num_negative | flag_num_e | + flag_num_e_got_sign | flag_num_e_negative | + flag_num_zero); + + num_digits = 0; + num_fraction = 0; + num_e = 0; + + if (b != '-') + { + flags |= flag_reproc; + break; + } + + flags |= flag_num_negative; + continue; + } + else + { sprintf (error, "%d:%d: Unexpected %c when seeking value", line_and_col, b); + goto e_failed; + } + }; + }; + } + else + { + switch (top->type) + { + case json_object: + + switch (b) + { + whitespace: + continue; + + case '"': + + if (flags & flag_need_comma) + { sprintf (error, "%d:%d: Expected , before \"", line_and_col); + goto e_failed; + } + + flags |= flag_string; + + string = (json_char *) top->_reserved.object_mem; + string_length = 0; + + break; + + case '}': + + flags = (flags & ~ flag_need_comma) | flag_next; + break; + + case ',': + + if (flags & flag_need_comma) + { + flags &= ~ flag_need_comma; + break; + } + + default: + sprintf (error, "%d:%d: Unexpected `%c` in object", line_and_col, b); + goto e_failed; + }; + + break; + + case json_integer: + case json_double: + + if (isdigit (b)) + { + ++ num_digits; + + if (top->type == json_integer || flags & flag_num_e) + { + if (! (flags & flag_num_e)) + { + if (flags & flag_num_zero) + { sprintf (error, "%d:%d: Unexpected `0` before `%c`", line_and_col, b); + goto e_failed; + } + + if (num_digits == 1 && b == '0') + flags |= flag_num_zero; + } + else + { + flags |= flag_num_e_got_sign; + num_e = (num_e * 10) + (b - '0'); + continue; + } + + top->u.integer = (top->u.integer * 10) + (b - '0'); + continue; + } + + num_fraction = (num_fraction * 10) + (b - '0'); + continue; + } + + if (b == '+' || b == '-') + { + if ( (flags & flag_num_e) && !(flags & flag_num_e_got_sign)) + { + flags |= flag_num_e_got_sign; + + if (b == '-') + flags |= flag_num_e_negative; + + continue; + } + } + else if (b == '.' && top->type == json_integer) + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit before `.`", line_and_col); + goto e_failed; + } + + top->type = json_double; + top->u.dbl = (double) top->u.integer; + + num_digits = 0; + continue; + } + + if (! (flags & flag_num_e)) + { + if (top->type == json_double) + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit after `.`", line_and_col); + goto e_failed; + } + + //top->u.dbl += ((double) num_fraction) / (pow (10.0, (double) num_digits)); + } + + if (b == 'e' || b == 'E') + { + flags |= flag_num_e; + + if (top->type == json_integer) + { + top->type = json_double; + top->u.dbl = (double) top->u.integer; + } + + num_digits = 0; + flags &= ~ flag_num_zero; + + continue; + } + } + else + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit after `e`", line_and_col); + goto e_failed; + } + + /*top->u.dbl *= pow (10.0, (double) + (flags & flag_num_e_negative ? - num_e : num_e));*/ + } + + if (flags & flag_num_negative) + { + if (top->type == json_integer) + top->u.integer = - top->u.integer; + else + top->u.dbl = - top->u.dbl; + } + + flags |= flag_next | flag_reproc; + break; + + default: + break; + }; + } + + if (flags & flag_reproc) + { + flags &= ~ flag_reproc; + -- state.ptr; + } + + if (flags & flag_next) + { + flags = (flags & ~ flag_next) | flag_need_comma; + + if (!top->parent) + { + /* root value done */ + + flags |= flag_done; + continue; + } + + if (top->parent->type == json_array) + flags |= flag_seek_value; + + if (!state.first_pass) + { + json_value * parent = top->parent; + + switch (parent->type) + { + case json_object: + + parent->u.object.values + [parent->u.object.length].value = top; + + break; + + case json_array: + + parent->u.array.values + [parent->u.array.length] = top; + + break; + + default: + break; + }; + } + + if ( (++ top->parent->u.array.length) > state.uint_max) + goto e_overflow; + + top = top->parent; + + continue; + } + } + + alloc = root; + } + + return root; + +e_unknown_value: + + sprintf (error, "%d:%d: Unknown value", line_and_col); + goto e_failed; + +e_alloc_failure: + + strcpy (error, "Memory allocation failure"); + goto e_failed; + +e_overflow: + + sprintf (error, "%d:%d: Too long (caught overflow)", line_and_col); + goto e_failed; + +e_failed: + + if (error_buf) + { + if (*error) + strcpy (error_buf, error); + else + strcpy (error_buf, "Unknown error"); + } + + if (state.first_pass) + alloc = root; + + while (alloc) + { + top = alloc->_reserved.next_alloc; + state.settings.mem_free (alloc, state.settings.user_data); + alloc = top; + } + + if (!state.first_pass) + json_value_free_ex (&state.settings, root); + + return 0; +} + +json_value * json_parse (const json_char * json, size_t length) +{ + json_settings settings = { 0 }; + return json_parse_ex (&settings, json, length, 0); +} + +void json_value_free_ex (json_settings * settings, json_value * value) +{ + json_value * cur_value; + + if (!value) + return; + + value->parent = 0; + + while (value) + { + switch (value->type) + { + case json_array: + + if (!value->u.array.length) + { + settings->mem_free (value->u.array.values, settings->user_data); + break; + } + + value = value->u.array.values [-- value->u.array.length]; + continue; + + case json_object: + + if (!value->u.object.length) + { + settings->mem_free (value->u.object.values, settings->user_data); + break; + } + + value = value->u.object.values [-- value->u.object.length].value; + continue; + + case json_string: + + settings->mem_free (value->u.string.ptr, settings->user_data); + break; + + default: + break; + }; + + cur_value = value; + value = value->parent; + settings->mem_free (cur_value, settings->user_data); + } +} + +void json_value_free (json_value * value) +{ + json_settings settings = { 0 }; + settings.mem_free = default_free; + json_value_free_ex (&settings, value); +} + diff --git a/lib/cgo/tests/testutils/json_util.c b/lib/cgo/tests/testutils/json_util.c new file mode 100755 index 0000000..f617cd1 --- /dev/null +++ b/lib/cgo/tests/testutils/json_util.c @@ -0,0 +1,137 @@ +#include "json.h" +#include +#include + +json_value* json_get_string(json_value* value, const char* key){ + int length, x; + if (value == NULL) { + return NULL; + } + if (value->type != json_object) { + return NULL; + } + length = value->u.object.length; + for (x = 0; x < length; x++) { + if( strcmp( value->u.object.values[x].name, key) == 0){ + if( value->u.object.values[x].value->type == json_string){ + return value->u.object.values[x].value; + } + } + } + return NULL; +} + +int json_set_string(json_value* value, const char* new_string_value){ + if( value->type == json_string){ + int length = strlen(new_string_value); + if( length > value->u.string.length ){ + value->u.string.ptr = malloc(length + 1); + } + strcpy( value->u.string.ptr, new_string_value ); + value->u.string.length = length; + } + return 0; +} + +int compareJsonValues(json_value* value1, json_value* value2); + +int compareJsonObjects(json_value* value1, json_value* value2){ + int length1 = value1->u.object.length; + int length2 = value2->u.object.length; + if( length1 != length2 ) + return 0; + for (int x = 0; x < length1; x++) { + char* name = value1->u.object.values[x].name; + int found = 0; + for( int y = 0; y < length2; y++){ + if( strcmp( value2->u.object.values[y].name, name ) == 0){ + if( !compareJsonValues( value1->u.object.values[x].value, + value2->u.object.values[y].value ) ) + return 0; + found = 1; + break; + } + } + if( !found ) + return 0; + } + return 1; +} + +int compareJsonArrays(json_value* value1, json_value* value2){ + int length1 = value1->u.array.length; + int length2 = value2->u.array.length; + if( length1 != length2 ) + return 0; + for (int x = 0; x < length1; x++) { + if( !compareJsonValues(value1->u.array.values[x], value2->u.array.values[x]) ) + return 0; + } + return 1; +} + +int compareJsonValues(json_value* value1, json_value* value2){ + if( value1 == NULL && value2 == NULL) + return 1; + if( value1 == NULL || value2 == NULL) + return 0; + if( value1->type != value2->type) + return 0; + switch (value1->type) { + case json_null: + return value2->type == json_null; + case json_none: + return 1; + case json_object: + return compareJsonObjects(value1, value2); + case json_array: + return compareJsonArrays(value1, value2); + case json_integer: + return value1->u.integer == value2->u.integer; + case json_double: + return fabs(value1->u.dbl - value2->u.dbl) < 0.000001; + case json_string: + return strcmp(value1->u.string.ptr, value2->u.string.ptr) == 0; + case json_boolean: + return value1->u.boolean == value2->u.boolean; + } + return 1; +} + + +json_value* get_json_value_not_strict(json_value* node, const char* path, + json_type type, int allow_null){ + int n; + const char* p = strchr(path, '/'); + if( p == NULL ) + n = strlen(path); + else + n = p - path; + if( n > 0 ) { + if( node->type == json_object){ + for (int x = 0; x < node->u.object.length; x++) { + json_object_entry * entry = &node->u.object.values[x]; + char* name = entry->name; + json_value* value = entry->value; + if( strncmp( path, name, n ) == 0){ + if( p == NULL){ + if( value->type == type || + (allow_null && value->type == json_null)) + return value; + }else + return get_json_value_not_strict( + value, p + 1, type, allow_null); + } + } + } else { + return NULL; + } + } + return NULL; +} + +json_value* get_json_value(json_value* node, const char* path, + json_type type){ + return get_json_value_not_strict(node, path, type, 1); +} + diff --git a/lib/cgo/wallet.wallet.go b/lib/cgo/wallet.wallet.go new file mode 100755 index 0000000..22b1a3c --- /dev/null +++ b/lib/cgo/wallet.wallet.go @@ -0,0 +1,382 @@ +package main + +import ( + "reflect" + "unsafe" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_wallet_NewWallet +func SKY_wallet_NewWallet(_wltName string, _opts C.Options__Handle, _arg2 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + wltName := _wltName + __opts, okopts := lookupOptionsHandle(_opts) + if !okopts { + ____error_code = SKY_ERROR + return + } + opts := *__opts + __arg2, ____return_err := wallet.NewWallet(wltName, opts) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg2 = registerWalletHandle(__arg2) + } + return +} + +//export SKY_wallet_Wallet_Lock +func SKY_wallet_Wallet_Lock(_w C.Wallet__Handle, _password []byte, _cryptoType string) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + password := *(*[]byte)(unsafe.Pointer(&_password)) + cryptoType := wallet.CryptoType(_cryptoType) + ____return_err := w.Lock(password, cryptoType) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Unlock +func SKY_wallet_Wallet_Unlock(_w C.Wallet__Handle, _password []byte, _arg1 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + password := *(*[]byte)(unsafe.Pointer(&_password)) + __arg1, ____return_err := w.Unlock(password) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWalletHandle(__arg1) + } + return +} + +//export SKY_wallet_Load +func SKY_wallet_Load(_wltFile string, _arg1 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + wltFile := _wltFile + __arg1, ____return_err := wallet.Load(wltFile) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWalletHandle(__arg1) + } + return +} + +//export SKY_wallet_Wallet_Save +func SKY_wallet_Wallet_Save(_w C.Wallet__Handle, _dir string) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + dir := _dir + ____return_err := w.Save(dir) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Validate +func SKY_wallet_Wallet_Validate(_w C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + ____return_err := w.Validate() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Type +func SKY_wallet_Wallet_Type(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Type() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Version +func SKY_wallet_Wallet_Version(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Version() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Filename +func SKY_wallet_Wallet_Filename(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Filename() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Label +func SKY_wallet_Wallet_Label(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Label() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_IsEncrypted +func SKY_wallet_Wallet_IsEncrypted(_w C.Wallet__Handle, _argSKY_OK *bool) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.IsEncrypted() + *_argSKY_OK = __argSKY_OK + return +} + +//export SKY_wallet_Wallet_GenerateAddresses +func SKY_wallet_Wallet_GenerateAddresses(_w C.Wallet__Handle, _num uint64, _arg1 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + num := _num + __arg1, ____return_err := w.GenerateAddresses(num) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg1), _arg1) + } + return +} + +//export SKY_wallet_Wallet_GetAddresses +func SKY_wallet_Wallet_GetAddresses(_w C.Wallet__Handle, _argSKY_OK *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.GetAddresses() + copyToGoSlice(reflect.ValueOf(__argSKY_OK), _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_GetEntry +func SKY_wallet_Wallet_GetEntry(_w C.Wallet__Handle, _a *C.cipher__Address, _arg1 *C.wallet__Entry, _arg2 *bool) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + a := *(*cipher.Address)(unsafe.Pointer(_a)) + __arg1, __arg2 := w.GetEntry(a) + *_arg1 = *(*C.wallet__Entry)(unsafe.Pointer(&__arg1)) + *_arg2 = __arg2 + return +} + +//export SKY_wallet_Wallet_AddEntry +func SKY_wallet_Wallet_AddEntry(_w C.Wallet__Handle, _entry *C.wallet__Entry) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + entry := *(*wallet.Entry)(unsafe.Pointer(_entry)) + ____return_err := w.AddEntry(entry) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_DistributeSpendHours +func SKY_wallet_DistributeSpendHours(_inputHours, _nAddrs uint64, _haveChange bool, _arg2 *uint64, _arg3 *C.GoSlice_, _arg4 *uint64) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + inputHours := _inputHours + nAddrs := _nAddrs + haveChange := _haveChange + __arg2, __arg3, __arg4 := wallet.DistributeSpendHours(inputHours, nAddrs, haveChange) + *_arg2 = __arg2 + copyToGoSlice(reflect.ValueOf(__arg3), _arg3) + *_arg4 = __arg4 + return +} + +//export SKY_wallet_DistributeCoinHoursProportional +func SKY_wallet_DistributeCoinHoursProportional(_coins []uint64, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + coins := *(*[]uint64)(unsafe.Pointer(&_coins)) + hours := _hours + __arg2, ____return_err := wallet.DistributeCoinHoursProportional(coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_NewUxBalances +func SKY_wallet_NewUxBalances(_headTime uint64, _uxa *C.coin__UxArray, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + headTime := _headTime + uxa := *(*coin.UxArray)(unsafe.Pointer(_uxa)) + __arg2, ____return_err := wallet.NewUxBalances(headTime, uxa) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_NewUxBalance +func SKY_wallet_NewUxBalance(_headTime uint64, _ux *C.coin__UxOut, _arg2 *C.wallet__UxBalance) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + headTime := _headTime + ux := *(*coin.UxOut)(unsafe.Pointer(_ux)) + __arg2, ____return_err := wallet.NewUxBalance(headTime, ux) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg2 = *(*C.wallet__UxBalance)(unsafe.Pointer(&__arg2)) + } + return +} + +//export SKY_wallet_ChooseSpendsMinimizeUxOuts +func SKY_wallet_ChooseSpendsMinimizeUxOuts(_uxa []C.wallet__UxBalance, _coins, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uxa := *(*[]wallet.UxBalance)(unsafe.Pointer(&_uxa)) + coins := _coins + hours := _hours + __arg2, ____return_err := wallet.ChooseSpendsMinimizeUxOuts(uxa, coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_ChooseSpendsMaximizeUxOuts +func SKY_wallet_ChooseSpendsMaximizeUxOuts(_uxa []C.wallet__UxBalance, _coins, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uxa := *(*[]wallet.UxBalance)(unsafe.Pointer(&_uxa)) + coins := _coins + hours := _hours + __arg2, ____return_err := wallet.ChooseSpendsMaximizeUxOuts(uxa, coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} diff --git a/lib/cgo/wallet_option.go b/lib/cgo/wallet_option.go new file mode 100755 index 0000000..f5db19c --- /dev/null +++ b/lib/cgo/wallet_option.go @@ -0,0 +1,27 @@ +package main + +import ( + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_wallet_CreateOptionsHandle +func SKY_wallet_CreateOptionsHandle(coin string, label string, seed string, encrypt bool, pwd string, cryptoType string, scanN uint64, _opts *C.Options__Handle) uint32 { + var walletOptions wallet.Options + walletOptions.Coin = (wallet.CoinType)(coin) + walletOptions.Label = label + walletOptions.Seed = seed + walletOptions.Encrypt = encrypt + walletOptions.Password = []byte(pwd) + walletOptions.CryptoType = (wallet.CryptoType)(cryptoType) + walletOptions.ScanN = scanN + *_opts = registerOptionsHandle(&walletOptions) + return SKY_OK +} diff --git a/peers.txt b/peers.txt deleted file mode 100755 index c58fb94..0000000 --- a/peers.txt +++ /dev/null @@ -1,54 +0,0 @@ -109.195.211.62:6000 -111.198.225.50:6000 -116.196.111.122:6000 -117.48.197.46:6000 -118.178.135.93:6000 -118.190.40.103:6000 -119.23.146.83:6000 -120.77.69.188:6000 -121.41.103.148:6000 -128.199.57.221:6000 -139.162.33.154:6000 -171.61.57.211:6000 -174.31.25.197:6000 -176.9.47.13:6000 -176.9.84.75:6000 -178.62.225.38:6000 -182.92.180.92:6000 -188.226.135.69:6000 -197.97.221.117:6000 -198.11.174.158:6000 -219.218.122.125:6000 -223.166.51.211:6000 -34.211.217.30:6000 -34.228.199.250:6000 -35.157.164.126:6000 -41.144.111.69:6000 -45.32.235.85:6000 -47.185.85.148:6000 -47.52.247.224:6000 -47.88.33.156:6000 -5.29.223.190:6000 -5.53.140.35:6000 -63.142.253.76:6000 -67.5.101.253:6000 -70.122.218.244:6000 -76.164.192.236:6000 -77.37.218.181:6000 -87.110.127.219:6000 -91.105.75.60:6000 -91.148.193.104:6000 -94.244.35.222:6000 -88.11.114.149:6000 -67.133.97.98:6001 -47.42.155.212:6000 -92.87.237.163:6000 -173.212.205.184:6000 -173.249.15.43:6000 -173.249.15.44:6000 -173.249.15.45:6000 -173.249.15.46:6000 -173.249.30.221:6000 -49.135.7.8:6000 -207.237.45.196:6000 -45.63.21.232:6000 diff --git a/run-live-integration-test-node.sh b/run-live-integration-test-node.sh new file mode 100755 index 0000000..c91674a --- /dev/null +++ b/run-live-integration-test-node.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +# Runs the node with configuration necessary for running the live integration tests + +set -x + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +echo "skycoin binary dir:" "$DIR" +pushd "$DIR" >/dev/null + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +go run -ldflags "${GOLDFLAGS}" cmd/skycoin/skycoin.go \ + -gui-dir="${DIR}/src/gui/static/" \ + -launch-browser=true \ + -enable-wallet-api=true \ + -enable-seed-api=true \ + $@ + +popd >/dev/null diff --git a/run-with-rpc.sh b/run-with-rpc.sh index 3ff5361..336eafd 100755 --- a/run-with-rpc.sh +++ b/run-with-rpc.sh @@ -1,19 +1,3 @@ #!/usr/bin/env bash -set -x - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -echo "skycoin binary dir:" "$DIR" -pushd "$DIR" >/dev/null - -COMMIT=$(git rev-parse HEAD) -BRANCH=$(git rev-parse --abbrev-ref HEAD) -GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" - -go run -ldflags "${GOLDFLAGS}" cmd/skycoin/skycoin.go \ - -gui-dir="${DIR}/src/gui/static/" \ - -launch-browser=true \ - -enable-wallet-api=true \ - $@ - -popd >/dev/null +./run.sh -rpc-interface=true diff --git a/run.sh b/run.sh index 273d755..79c54d3 100755 --- a/run.sh +++ b/run.sh @@ -14,6 +14,7 @@ go run -ldflags "${GOLDFLAGS}" cmd/solarbankerscoin/solarbankerscoin.go \ -gui-dir="${DIR}/src/gui/static/" \ -launch-browser=true \ -enable-wallet-api=true \ + -enable-gui=true \ -rpc-interface=false \ -log-level=debug \ $@ diff --git a/src/api/address.go b/src/api/address.go new file mode 100755 index 0000000..8b61544 --- /dev/null +++ b/src/api/address.go @@ -0,0 +1,63 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/skycoin/skycoin/src/cipher" + //http,json helpers +) + +// VerifyAddressRequest is the request data for POST /api/v2/address/verify +type VerifyAddressRequest struct { + Address string `json:"address"` +} + +// VerifyAddressResponse is returned by POST /api/v2/address/verify +type VerifyAddressResponse struct { + Version byte `json:"version"` +} + +// addressVerify verifies a Skycoin address +// Method: POST +// URI: /api/v2/address/verify +func addressVerify(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyAddressRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Address == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "address is required") + writeHTTPResponse(w, resp) + return + } + + addr, err := cipher.DecodeBase58Address(req.Address) + + if err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: VerifyAddressResponse{ + Version: addr.Version, + }, + }) +} diff --git a/src/api/address_test.go b/src/api/address_test.go new file mode 100755 index 0000000..9bff220 --- /dev/null +++ b/src/api/address_test.go @@ -0,0 +1,153 @@ +package api + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestVerifyAddress(t *testing.T) { + toJSON := func(r VerifyAddressRequest) string { + b, err := json.Marshal(r) + require.NoError(t, err) + return string(b) + } + + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "application/x-www-form-urlencoded", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + + { + name: "400 - Missing address", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "address is required"), + }, + + { + name: "422 - Invalid checksum", + method: http.MethodPost, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, "Invalid checksum"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/address/verify" + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = "application/json" + } + + req.Header.Set("Content-Type", contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + cfg := muxConfig{host: configuredHost, appLoc: "."} + handler := newServerMux(cfg, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.NewDecoder(rr.Body).Decode(&rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp VerifyAddressResponse + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyAddressResponse), addrRsp) + } + + }) + } +} diff --git a/src/api/blockchain.go b/src/api/blockchain.go new file mode 100755 index 0000000..8f640f7 --- /dev/null +++ b/src/api/blockchain.go @@ -0,0 +1,160 @@ +package api + +// APIs for blockchain related information + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" //http,json helpers +) + +func blockchainHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + metadata, err := gateway.GetBlockchainMetadata() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, metadata) + } +} + +func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + progress, err := gateway.GetBlockchainProgress() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainProgress failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, progress) + } +} + +// get block by hash or seq +// method: GET +// url: /block?hash=[:hash] or /block?seq[:seq] +// params: hash or seq, should only specify one filter. +func getBlock(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + hash := r.FormValue("hash") + seq := r.FormValue("seq") + var b *coin.SignedBlock + switch { + case hash == "" && seq == "": + wh.Error400(w, "should specify one filter, hash or seq") + return + case hash != "" && seq != "": + wh.Error400(w, "should only specify one filter, hash or seq") + return + case hash != "": + h, err := cipher.SHA256FromHex(hash) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err = gateway.GetSignedBlockByHash(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + case seq != "": + uSeq, err := strconv.ParseUint(seq, 10, 64) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err = gateway.GetSignedBlockBySeq(uSeq) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := visor.NewReadableBlock(&b.Block) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} + +func getBlocks(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + sstart := r.FormValue("start") + start, err := strconv.ParseUint(sstart, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid start value \"%s\"", sstart)) + return + } + + send := r.FormValue("end") + end, err := strconv.ParseUint(send, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid end value \"%s\"", send)) + return + } + rb, err := gateway.GetBlocks(start, end) + if err != nil { + wh.Error400(w, fmt.Sprintf("Get blocks failed: %v", err)) + return + } + wh.SendJSONOr500(logger, w, rb) + } +} + +// get last N blocks +func getLastBlocks(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + num := r.FormValue("num") + if num == "" { + wh.Error400(w, "Param: num is empty") + return + } + + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + rb, err := gateway.GetLastBlocks(n) + if err != nil { + wh.Error400(w, fmt.Sprintf("Get last %v blocks failed: %v", n, err)) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} diff --git a/src/api/blockchain_test.go b/src/api/blockchain_test.go new file mode 100755 index 0000000..ae0d4e4 --- /dev/null +++ b/src/api/blockchain_test.go @@ -0,0 +1,491 @@ +package api + +import ( + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "encoding/json" + + "math" + + "github.com/stretchr/testify/require" + + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor" +) + +func makeBadBlock(t *testing.T) *coin.Block { + genPublic, _ := cipher.GenerateKeyPair() + genAddress := cipher.AddressFromPubKey(genPublic) + var genCoins uint64 = 1000e6 + var genTime uint64 = 1000 + now := genTime + 100 + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + uxHash := testutil.RandSHA256(t) + tx := coin.Transaction{} + tx.PushOutput(genAddress, math.MaxInt64+1, 255) + b, err := coin.NewBlock(*preBlock, now, uxHash, coin.Transactions{tx}, func(t *coin.Transaction) (uint64, error) { + return 0, nil + }) + require.NoError(t, err) + return b +} + +func TestGetBlock(t *testing.T) { + + badBlock := makeBadBlock(t) + validHashString := testutil.RandSHA256(t).Hex() + validSHA256, err := cipher.SHA256FromHex(validHashString) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + hash string + sha256 cipher.SHA256 + seqStr string + seq uint64 + gatewayGetBlockByHashResult *coin.SignedBlock + gatewayGetBlockByHashErr error + gatewayGetBlockBySeqResult *coin.SignedBlock + gatewayGetBlockBySeqErr error + response *visor.ReadableBlock + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - no seq and hash", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should specify one filter, hash or seq", + }, + { + name: "400 - seq and hash simultaneously", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should only specify one filter, hash or seq", + hash: "hash", + seqStr: "seq", + }, + { + name: "400 - hash error: encoding/hex err invalid byte: U+0068 'h'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0068 'h'", + hash: "hash", + }, + { + name: "400 - hash error: encoding/hex: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + hash: "1234abc", + }, + { + name: "400 - hash error: Invalid hex length", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid hex length", + hash: "1234abcd", + }, + { + name: "404 - block by hash does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + hash: validHashString, + sha256: validSHA256, + }, + { + name: "400 - seq error: invalid syntax", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - strconv.ParseUint: parsing \"seq\": invalid syntax", + seqStr: "seq", + }, + { + name: "404 - block by seq does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + seqStr: "1", + seq: 1, + }, + { + name: "500 - NewReadableBlock error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{ + Block: *badBlock, + }, + }, + { + name: "500 - get block by hash error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockByHash failed", + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashErr: errors.New("GetSignedBlockByHash failed"), + }, + { + name: "500 - get block by seq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockBySeq failed", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "200 - got block by seq", + method: http.MethodGet, + status: http.StatusOK, + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{}, + response: &visor.ReadableBlock{ + Head: visor.ReadableBlockHeader{ + BkSeq: 0x0, + BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: visor.ReadableBlockBody{ + Transactions: []visor.ReadableTransaction{}, + }, + }, + }, + { + name: "200 - got block by hash", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashResult: &coin.SignedBlock{}, + response: &visor.ReadableBlock{ + Head: visor.ReadableBlockHeader{ + BkSeq: 0x0, + BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: visor.ReadableBlockBody{ + Transactions: []visor.ReadableTransaction{}, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + + gateway.On("GetSignedBlockByHash", tc.sha256).Return(tc.gatewayGetBlockByHashResult, tc.gatewayGetBlockByHashErr) + gateway.On("GetSignedBlockBySeq", tc.seq).Return(tc.gatewayGetBlockBySeqResult, tc.gatewayGetBlockBySeqErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/block" + + v := url.Values{} + if tc.hash != "" { + v.Add("hash", tc.hash) + } + if tc.seqStr != "" { + v.Add("seq", tc.seqStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlock + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} + +func TestGetBlocks(t *testing.T) { + type httpBody struct { + Start string + End string + } + + tt := []struct { + name string + method string + status int + err string + body *httpBody + start uint64 + end uint64 + gatewayGetBlocksResult *visor.ReadableBlocks + gatewayGetBlocksError error + response *visor.ReadableBlocks + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty start/end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"\"", + }, + { + name: "400 - bad start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"badStart\"", + body: &httpBody{ + Start: "badStart", + }, + }, + { + name: "400 - bad end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid end value \"badEnd\"", + body: &httpBody{ + Start: "1", + End: "badEnd", + }, + start: 1, + }, + { + name: "400 - gatewayGetBlocksError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Get blocks failed: gatewayGetBlocksError", + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksError: errors.New("gatewayGetBlocksError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksResult: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, + response: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetBlocks", tc.start, tc.end).Return(tc.gatewayGetBlocksResult, tc.gatewayGetBlocksError) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/blocks" + + v := url.Values{} + if tc.body != nil { + if tc.body.Start != "" { + v.Add("start", tc.body.Start) + } + if tc.body.End != "" { + v.Add("end", tc.body.End) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + type httpBody struct { + Num string + } + tt := []struct { + name string + method string + url string + status int + err string + body httpBody + num uint64 + gatewayGetLastBlocksResult *visor.ReadableBlocks + gatewayGetLastBlocksError error + response *visor.ReadableBlocks + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + body: httpBody{ + Num: "1", + }, + num: 1, + }, + { + name: "400 - empty num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Param: num is empty", + num: 1, + }, + { + name: "400 - bad num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - strconv.ParseUint: parsing \"badNumValue\": invalid syntax", + body: httpBody{ + Num: "badNumValue", + }, + num: 1, + }, + { + name: "400 - gatewayGetLastBlocksError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Get last 1 blocks failed: gatewayGetLastBlocksError", + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksError: errors.New("gatewayGetLastBlocksError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + }, + num: 1, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/last_blocks" + gateway := NewGatewayerMock() + + gateway.On("GetLastBlocks", tc.num).Return(tc.gatewayGetLastBlocksResult, tc.gatewayGetLastBlocksError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} diff --git a/src/api/cli/address_gen.go b/src/api/cli/address_gen.go deleted file mode 100755 index 4bf28b0..0000000 --- a/src/api/cli/address_gen.go +++ /dev/null @@ -1,85 +0,0 @@ -package cli - -import ( - "fmt" - - gcli "github.com/urfave/cli" - - "github.com/skycoin/skycoin/src/cipher" - bip39 "github.com/skycoin/skycoin/src/cipher/go-bip39" - "github.com/skycoin/skycoin/src/wallet" -) - -func addressGenCmd() gcli.Command { - name := "addressGen" - return gcli.Command{ - Name: name, - Usage: "Generate skycoin or bitcoin addresses", - Description: "", - Flags: []gcli.Flag{ - gcli.IntFlag{ - Name: "count,c", - Value: 1, - Usage: "Number of addresses to generate", - }, - gcli.BoolFlag{ - Name: "hide-secret,s", - Usage: "Hide the secret key from the output", - }, - gcli.BoolFlag{ - Name: "bitcoin,b", - Usage: "Output the addresses as bitcoin addresses instead of skycoin addresses", - }, - gcli.BoolFlag{ - Name: "hex,x", - Usage: "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided", - }, - gcli.BoolFlag{ - Name: "only-addr,oa", - Usage: "Only show generated address list, hide seed, secret key and public key", - }, - gcli.StringFlag{ - Name: "seed", - Usage: "Seed for deterministic key generation. Will use bip39 as the seed if not provided.", - }, - }, - OnUsageError: onCommandUsageError(name), - Action: func(c *gcli.Context) error { - var coinType wallet.CoinType - if c.Bool("bitcoin") { - coinType = wallet.CoinTypeBitcoin - } else { - coinType = wallet.CoinTypeSkycoin - } - - seed := c.String("seed") - if seed == "" { - hex := c.Bool("hex") - if hex { - // generate a new seed, as hex string - seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() - } else { - var err error - seed, err = bip39.NewDefaultMnemomic() - if err != nil { - return err - } - } - } - - w, err := wallet.CreateAddresses(coinType, seed, c.Int("count"), c.Bool("hide-secret")) - if err != nil { - return err - } - - if !c.Bool("only-addr") { - return printJSON(w) - } - - for _, e := range w.Entries { - fmt.Println(e.Address) - } - return nil - }, - } -} diff --git a/src/api/cli/checkdb.go b/src/api/cli/checkdb.go deleted file mode 100755 index 6b0ac74..0000000 --- a/src/api/cli/checkdb.go +++ /dev/null @@ -1,70 +0,0 @@ -package cli - -import ( - "fmt" - "os" - "time" - - "github.com/boltdb/bolt" - gcli "github.com/urfave/cli" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/visor" -) - -const ( - genesisPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" -) - -func checkdbCmd() gcli.Command { - name := "checkdb" - return gcli.Command{ - Name: name, - Usage: "Verify the database", - ArgsUsage: "[db path]", - Description: "If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.", - OnUsageError: onCommandUsageError(name), - Action: checkdb, - } -} - -func checkdb(c *gcli.Context) error { - cfg := ConfigFromContext(c) - - // get db path - dbpath, err := resolveDBPath(cfg, c.Args().First()) - if err != nil { - return err - } - - // check if this file is exist - if _, err := os.Stat(dbpath); os.IsNotExist(err) { - return fmt.Errorf("db file: %v does not exist", dbpath) - } - - db, err := bolt.Open(dbpath, 0600, &bolt.Options{ - Timeout: 5 * time.Second, - ReadOnly: true, - }) - - if err != nil { - return fmt.Errorf("open db failed: %v", err) - } - pubkey, err := cipher.PubKeyFromHex(genesisPubkey) - if err != nil { - return fmt.Errorf("decode genesis pubkey failed: %v", err) - } - - if err := IntegrityCheck(db, pubkey); err != nil { - return fmt.Errorf("checkdb failed: %v", err) - } - - fmt.Println("check db success") - return nil -} - -// IntegrityCheck checks database integrity -func IntegrityCheck(db *bolt.DB, genesisPubkey cipher.PubKey) error { - _, err := visor.NewBlockchain(db, genesisPubkey, visor.Arbitrating(true)) - return err -} diff --git a/src/api/cli/cli.go b/src/api/cli/cli.go deleted file mode 100755 index 335948d..0000000 --- a/src/api/cli/cli.go +++ /dev/null @@ -1,398 +0,0 @@ -/* -Package cli implements an interface for creating a CLI application. -Includes methods for manipulating wallets files and interacting with the -webrpc API to query a skycoin node's status. -*/ -package cli - -import ( - "encoding/json" - "errors" - "fmt" - "net/url" - "path/filepath" - "strconv" - "strings" - "syscall" - - "os" - - gcli "github.com/urfave/cli" - "golang.org/x/crypto/ssh/terminal" - - "github.com/skycoin/skycoin/src/api/webrpc" - "github.com/skycoin/skycoin/src/util/file" -) - -const ( - // Version is the CLI Version - Version = "0.23.1-rc2" - walletExt = ".wlt" - defaultCoin = "skycoin" - defaultWalletName = "$COIN_cli" + walletExt - defaultWalletDir = "$HOME/.$COIN/wallets" - defaultRPCAddress = "http://127.0.0.1:6420" -) - -var ( - envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: - RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" - COIN: Name of the coin. Default "%s" - USE_CSRF: Set to 1 or true if the remote node has CSRF enabled. Default false (unset) - WALLET_DIR: Directory where wallets are stored. This value is overriden by any subcommand flag specifying a wallet filename, if that filename includes a path. Default "%s" - WALLET_NAME: Name of wallet file (without path). This value is overriden by any subcommand flag specifying a wallet filename. Default "%s"`, - defaultRPCAddress, defaultCoin, defaultWalletDir, defaultWalletName) - - commandHelpTemplate = fmt.Sprintf(`USAGE: - {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} - -CATEGORY: - {{.Category}}{{end}}{{if .Description}} - -DESCRIPTION: - {{.Description}}{{end}}{{if .VisibleFlags}} - -OPTIONS: - {{range .VisibleFlags}}{{.}} - {{end}}{{end}} -%s -`, envVarsHelp) - - appHelpTemplate = fmt.Sprintf(`NAME: - {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} - -USAGE: - {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} - -VERSION: - {{.Version}}{{end}}{{end}}{{if .Description}} - -DESCRIPTION: - {{.Description}}{{end}}{{if len .Authors}} - -AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: - {{range $index, $author := .Authors}}{{if $index}} - {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} - -COMMANDS:{{range .VisibleCategories}}{{if .Name}} - {{.Name}}:{{end}}{{range .VisibleCommands}} - {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} - -GLOBAL OPTIONS: - {{range $index, $option := .VisibleFlags}}{{if $index}} - {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} - -COPYRIGHT: - {{.Copyright}}{{end}} -%s -`, envVarsHelp) - - // ErrWalletName is returned if the wallet file name is invalid - ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) - // ErrAddress is returned if an address is invalid - ErrAddress = errors.New("invalid address") - // ErrJSONMarshal is returned if JSON marshaling failed - ErrJSONMarshal = errors.New("json marshal failed") -) - -// App Wraps the app so that main package won't use the raw App directly, -// which will cause import issue -type App struct { - gcli.App -} - -// Config cli's configuration struct -type Config struct { - WalletDir string `json:"wallet_directory"` - WalletName string `json:"wallet_name"` - DataDir string `json:"data_directory"` - Coin string `json:"coin"` - RPCAddress string `json:"rpc_address"` - UseCSRF bool `json:"use_csrf"` -} - -// LoadConfig loads config from environment, prior to parsing CLI flags -func LoadConfig() (Config, error) { - // get coin name from env - coin := os.Getenv("COIN") - if coin == "" { - coin = defaultCoin - } - - // get rpc address from env - rpcAddr := os.Getenv("RPC_ADDR") - if rpcAddr == "" { - rpcAddr = defaultRPCAddress - } - - if _, err := url.Parse(rpcAddr); err != nil { - return Config{}, errors.New("RPC_ADDR must be in scheme://host format") - } - - home := file.UserHome() - - // get wallet dir from env - wltDir := os.Getenv("WALLET_DIR") - if wltDir == "" { - wltDir = fmt.Sprintf("%s/.%s/wallets", home, coin) - } - - // get wallet name from env - wltName := os.Getenv("WALLET_NAME") - if wltName == "" { - wltName = fmt.Sprintf("%s_cli%s", coin, walletExt) - } - - if !strings.HasSuffix(wltName, walletExt) { - return Config{}, ErrWalletName - } - - dataDir := filepath.Join(home, fmt.Sprintf(".%s", coin)) - - var useCSRF bool - useCSRFStr := os.Getenv("USE_CSRF") - if useCSRFStr != "" { - var err error - useCSRF, err = strconv.ParseBool(useCSRFStr) - if err != nil { - return Config{}, errors.New("Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") - } - } - - return Config{ - WalletDir: wltDir, - WalletName: wltName, - DataDir: dataDir, - Coin: coin, - RPCAddress: rpcAddr, - UseCSRF: useCSRF, - }, nil -} - -// FullWalletPath returns the joined wallet dir and wallet name path -func (c Config) FullWalletPath() string { - return filepath.Join(c.WalletDir, c.WalletName) -} - -// FullDBPath returns the joined data directory and db file name path -func (c Config) FullDBPath() string { - return filepath.Join(c.DataDir, "data.db") -} - -// Returns a full wallet path based on cfg and optional cli arg specifying wallet file -// FIXME: A CLI flag for the wallet filename is redundant with the envvar. Remove the flags or the envvar. -func resolveWalletPath(cfg Config, w string) (string, error) { - if w == "" { - w = cfg.FullWalletPath() - } - - if !strings.HasSuffix(w, walletExt) { - return "", ErrWalletName - } - - // If w is only the basename, use the default wallet directory - if filepath.Base(w) == w { - w = filepath.Join(cfg.WalletDir, w) - } - - absW, err := filepath.Abs(w) - if err != nil { - return "", fmt.Errorf("Invalid wallet path %s: %v", w, err) - } - - return absW, nil -} - -func resolveDBPath(cfg Config, db string) (string, error) { - if db == "" { - db = cfg.FullDBPath() - } - - // If db is only the basename, use the default data dir - if filepath.Base(db) == db { - db = filepath.Join(cfg.DataDir, db) - } - - absDB, err := filepath.Abs(db) - if err != nil { - return "", fmt.Errorf("Invalid data path %s: %v", db, err) - } - return absDB, nil -} - -// NewApp creates an app instance -func NewApp(cfg Config) (*App, error) { - gcli.AppHelpTemplate = appHelpTemplate - gcli.SubcommandHelpTemplate = commandHelpTemplate - gcli.CommandHelpTemplate = commandHelpTemplate - - gcliApp := gcli.NewApp() - app := &App{ - App: *gcliApp, - } - - commands := []gcli.Command{ - addPrivateKeyCmd(cfg), - addressBalanceCmd(), - addressGenCmd(), - addressOutputsCmd(), - blocksCmd(), - broadcastTxCmd(), - checkdbCmd(), - createRawTxCmd(cfg), - decodeRawTxCmd(), - generateAddrsCmd(cfg), - generateWalletCmd(cfg), - lastBlocksCmd(), - listAddressesCmd(), - listWalletsCmd(), - sendCmd(), - showConfigCmd(), - statusCmd(), - transactionCmd(), - verifyAddressCmd(), - versionCmd(), - walletBalanceCmd(cfg), - walletDirCmd(), - walletHisCmd(), - walletOutputsCmd(cfg), - encryptWalletCmd(cfg), - decryptWalletCmd(cfg), - showSeedCmd(cfg), - } - - app.Name = fmt.Sprintf("%s-cli", cfg.Coin) - app.Version = Version - app.Usage = fmt.Sprintf("the %s command line interface", cfg.Coin) - app.Commands = commands - app.EnableBashCompletion = true - app.OnUsageError = func(context *gcli.Context, err error, isSubcommand bool) error { - fmt.Fprintf(context.App.Writer, "Error: %v\n\n", err) - gcli.ShowAppHelp(context) - return nil - } - app.CommandNotFound = func(ctx *gcli.Context, command string) { - tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} command. See '{{.HelpName}} --help'.\n", command) - gcli.HelpPrinter(app.Writer, tmp, app) - } - - rpcClient, err := webrpc.NewClient(cfg.RPCAddress) - if err != nil { - return nil, err - } - rpcClient.UseCSRF = cfg.UseCSRF - - app.Metadata = map[string]interface{}{ - "config": cfg, - "rpc": rpcClient, - } - - return app, nil -} - -// Run starts the app -func (app *App) Run(args []string) error { - return app.App.Run(args) -} - -// RPCClientFromContext returns a webrpc.Client from a urfave/cli Context -func RPCClientFromContext(c *gcli.Context) *webrpc.Client { - return c.App.Metadata["rpc"].(*webrpc.Client) -} - -// ConfigFromContext returns a Config from a urfave/cli Context -func ConfigFromContext(c *gcli.Context) Config { - return c.App.Metadata["config"].(Config) -} - -func onCommandUsageError(command string) gcli.OnUsageErrorFunc { - return func(c *gcli.Context, err error, isSubcommand bool) error { - fmt.Fprintf(c.App.Writer, "Error: %v\n\n", err) - gcli.ShowCommandHelp(c, command) - return nil - } -} - -func errorWithHelp(c *gcli.Context, err error) { - fmt.Fprintf(c.App.Writer, "Error: %v. See '%s %s --help'\n\n", err, c.App.HelpName, c.Command.Name) -} - -func formatJSON(obj interface{}) ([]byte, error) { - d, err := json.MarshalIndent(obj, "", " ") - if err != nil { - return nil, ErrJSONMarshal - } - return d, nil -} - -func printJSON(obj interface{}) error { - d, err := formatJSON(obj) - if err != nil { - return err - } - - fmt.Println(string(d)) - - return nil -} - -// readPasswordFromTerminal promotes user to enter password and read it. -func readPasswordFromTerminal() ([]byte, error) { - // Promotes to enter the wallet password - fmt.Fprint(os.Stdout, "enter password:") - bp, err := terminal.ReadPassword(int(syscall.Stdin)) - if err != nil { - return nil, err - } - fmt.Fprintln(os.Stdout, "") - return bp, nil -} - -// PUBLIC - -// WalletLoadError is returned if a wallet could not be loaded -type WalletLoadError struct { - error -} - -// WalletSaveError is returned if a wallet could not be saved -type WalletSaveError struct { - error -} - -// PasswordReader is an interface for getting password -type PasswordReader interface { - Password() ([]byte, error) -} - -// PasswordFromBytes represents an implementation of PasswordReader, -// which reads password from the bytes itself. -type PasswordFromBytes []byte - -// Password implements the PasswordReader's Password method -func (p PasswordFromBytes) Password() ([]byte, error) { - return []byte(p), nil -} - -// PasswordFromTerm reads password from terminal -type PasswordFromTerm struct{} - -// Password implements the PasswordReader's Password method -func (p PasswordFromTerm) Password() ([]byte, error) { - v, err := readPasswordFromTerminal() - if err != nil { - return nil, err - } - - return v, nil -} - -// NewPasswordReader creats a PasswordReader instance, -// reads password from the input bytes first, if it's empty, then read from terminal. -func NewPasswordReader(p []byte) PasswordReader { - if len(p) != 0 { - return PasswordFromBytes(p) - } - - return PasswordFromTerm{} -} diff --git a/src/api/cli/cli_test.go b/src/api/cli/cli_test.go deleted file mode 100755 index 5c48485..0000000 --- a/src/api/cli/cli_test.go +++ /dev/null @@ -1,234 +0,0 @@ -package cli - -import ( - "fmt" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/file" -) - -func Example() { - // In cmd/cli/cli.go: - cfg, err := LoadConfig() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - app, err := NewApp(cfg) - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - if err := app.Run(os.Args); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func TestLoadConfig(t *testing.T) { - t.Run("set COIN", func(t *testing.T) { - val := "foocoin" - os.Setenv("COIN", val) - defer os.Unsetenv("COIN") - - cfg, err := LoadConfig() - require.NoError(t, err) - require.Equal(t, cfg.Coin, val) - }) - - t.Run("set RPC_ADDR", func(t *testing.T) { - val := "http://111.22.33.44:5555" - os.Setenv("RPC_ADDR", val) - defer os.Unsetenv("RPC_ADDR") - - cfg, err := LoadConfig() - require.NoError(t, err) - require.Equal(t, cfg.RPCAddress, val) - }) - - t.Run("set RPC_ADDR invalid", func(t *testing.T) { - val := "111.22.33.44:5555" - os.Setenv("RPC_ADDR", val) - defer os.Unsetenv("RPC_ADDR") - - _, err := LoadConfig() - testutil.RequireError(t, err, "RPC_ADDR must be in scheme://host format") - }) - - t.Run("set WALLET_DIR", func(t *testing.T) { - val := "/home/foo/bar" - os.Setenv("WALLET_DIR", val) - defer os.Unsetenv("WALLET_DIR") - - cfg, err := LoadConfig() - require.NoError(t, err) - require.Equal(t, cfg.WalletDir, val) - }) - - t.Run("set WALLET_NAME", func(t *testing.T) { - val := "bar.wlt" - os.Setenv("WALLET_NAME", val) - defer os.Unsetenv("WALLET_NAME") - - cfg, err := LoadConfig() - require.NoError(t, err) - require.Equal(t, cfg.WalletName, val) - }) - - t.Run("set WALLET_NAME invalid", func(t *testing.T) { - val := "badwltext.foo" - os.Setenv("WALLET_NAME", val) - defer os.Unsetenv("WALLET_NAME") - - _, err := LoadConfig() - require.Error(t, err) - require.Equal(t, ErrWalletName, err) - }) - - t.Run("don't set USE_CSRF", func(t *testing.T) { - os.Unsetenv("USE_CSRF") - - c, err := LoadConfig() - require.NoError(t, err) - require.False(t, c.UseCSRF) - }) - - t.Run("set USE_CSRF false", func(t *testing.T) { - val := "0" - os.Setenv("USE_CSRF", val) - defer os.Unsetenv("USE_CSRF") - - c, err := LoadConfig() - require.NoError(t, err) - require.False(t, c.UseCSRF) - }) - - t.Run("set USE_CSRF true", func(t *testing.T) { - val := "1" - os.Setenv("USE_CSRF", val) - defer os.Unsetenv("USE_CSRF") - - c, err := LoadConfig() - require.NoError(t, err) - require.True(t, c.UseCSRF) - }) - - t.Run("set USE_CSRF invalid", func(t *testing.T) { - val := "not_boolean" - os.Setenv("USE_CSRF", val) - defer os.Unsetenv("USE_CSRF") - - _, err := LoadConfig() - testutil.RequireError(t, err, "Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") - }) -} - -func TestResolveWalletPath(t *testing.T) { - mustLoadConfig := func() Config { - cfg, err := LoadConfig() - require.NoError(t, err) - return cfg - } - - defaultCfg := mustLoadConfig() - expectedFullPath := fmt.Sprintf("%[1]s/.%[2]s/wallets/%[2]s_cli%[3]s", file.UserHome(), defaultCoin, walletExt) - require.Equal(t, expectedFullPath, defaultCfg.FullWalletPath()) - - absPathInput := "./foo/bar.wlt" - absPathOutput, err := filepath.Abs(absPathInput) - require.NoError(t, err) - - tests := []struct { - Name string - WalletDir string - WalletName string - WalletArg string - Error error - Expected string - }{ - { - Name: "default config, empty cli arg", - Expected: defaultCfg.WalletDir + "/" + defaultCfg.WalletName, - }, - { - Name: "default config, nonempty cli arg, invalid extension", - WalletArg: "badwltext.foo", - Error: ErrWalletName, - }, - { - Name: "default config, nonempty cli arg, valid", - WalletArg: "foo.wlt", - Expected: defaultCfg.WalletDir + "/foo.wlt", - }, - { - Name: "nondefault config wallet name, empty cli arg", - WalletName: "bar.wlt", - Expected: defaultCfg.WalletDir + "/bar.wlt", - }, - { - Name: "nondefault config wallet name invalid, empty cli arg", - WalletName: "badwltext.foo", - Error: ErrWalletName, - }, - { - Name: "nondefault config wallet path, empty cli arg", - WalletDir: "/home/foo/somewhere", - Expected: "/home/foo/somewhere/" + defaultCfg.WalletName, - }, - { - Name: "nondefault config wallet path and name, empty cli arg", - WalletDir: "/home/foo/somewhere", - WalletName: "bar.wlt", - Expected: "/home/foo/somewhere/bar.wlt", - }, - { - Name: "nondefault config wallet path and name, cli arg, valid, name only", - WalletDir: "/home/foo/somewhere", - WalletName: "bar.wlt", - WalletArg: "foo.wlt", - Expected: "/home/foo/somewhere/foo.wlt", - }, - { - Name: "nondefault config wallet path and name, cli arg, valid, with path", - WalletDir: "/home/foo/somewhere", - WalletName: "bar.wlt", - WalletArg: "/usr/lib/foo.wlt", - Expected: "/usr/lib/foo.wlt", - }, - { - Name: "wallet arg relative path", - WalletArg: absPathInput, - Expected: absPathOutput, - }, - } - - for _, tc := range tests { - t.Run(tc.Name, func(t *testing.T) { - cfg := mustLoadConfig() - if tc.WalletDir != "" { - cfg.WalletDir = tc.WalletDir - } - if tc.WalletName != "" { - cfg.WalletName = tc.WalletName - } - - w, err := resolveWalletPath(cfg, tc.WalletArg) - - if tc.Error == nil { - require.NoError(t, err) - require.Equal(t, tc.Expected, w) - require.True(t, filepath.IsAbs(w)) - } else { - require.Error(t, err) - require.Equal(t, tc.Error, err) - } - }) - } -} diff --git a/src/api/cli/create_rawtx.go b/src/api/cli/create_rawtx.go deleted file mode 100755 index d136d42..0000000 --- a/src/api/cli/create_rawtx.go +++ /dev/null @@ -1,682 +0,0 @@ -package cli - -import ( - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "strings" - - "github.com/skycoin/skycoin/src/util/droplet" - "github.com/skycoin/skycoin/src/util/fee" - - "github.com/skycoin/skycoin/src/api/webrpc" - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" - - gcli "github.com/urfave/cli" -) - -var ( - // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm - ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") -) - -// SendAmount represents an amount to send to an address -type SendAmount struct { - Addr string - Coins uint64 -} - -type sendAmountJSON struct { - Addr string `json:"addr"` - Coins string `json:"coins"` -} - -func createRawTxCmd(cfg Config) gcli.Command { - name := "createRawTransaction" - return gcli.Command{ - Name: name, - Usage: "Create a raw transaction to be broadcast to the network later", - ArgsUsage: "[to address] [amount]", - Description: fmt.Sprintf(` - Note: The [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. - - The default wallet (%s) will be - used if no wallet and address was specified. - - - If you are sending from a wallet the coins will be taken iteratively - from all addresses within the wallet starting with the first address until - the amount of the transaction is met. - - Use caution when using the "-p" command. If you have command history enabled - your wallet encryption password can be recovered from the history log. If you - do not include the "-p" option you will be prompted to enter your password - after you enter your command.`, cfg.FullWalletPath()), - Flags: []gcli.Flag{ - gcli.StringFlag{ - Name: "f", - Usage: "[wallet file or path], From wallet", - }, - gcli.StringFlag{ - Name: "a", - Usage: "[address] From address", - }, - gcli.StringFlag{ - Name: "c", - Usage: `[changeAddress] Specify different change address. - By default the from address or a wallets coinbase address will be used.`, - }, - gcli.StringFlag{ - Name: "m", - Usage: `[send to many] use JSON string to set multiple receive addresses and coins, - example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`, - }, - gcli.StringFlag{ - Name: "p", - Usage: "[password] Wallet password", - }, - gcli.BoolFlag{ - Name: "json,j", - Usage: "Returns the results in JSON format.", - }, - }, - OnUsageError: onCommandUsageError(name), - Action: func(c *gcli.Context) error { - tx, err := createRawTxCmdHandler(c) - switch err.(type) { - case nil: - case WalletLoadError: - errorWithHelp(c, err) - case WalletSaveError: - return errors.New("save wallet failed") - default: - return err - } - - rawTx := hex.EncodeToString(tx.Serialize()) - - if c.Bool("json") { - return printJSON(struct { - RawTx string `json:"rawtx"` - }{ - RawTx: rawTx, - }) - } - - fmt.Println(rawTx) - return nil - }, - } -} - -type walletAddress struct { - Wallet string - Address string -} - -func fromWalletOrAddress(c *gcli.Context) (walletAddress, error) { - cfg := ConfigFromContext(c) - - wlt, err := resolveWalletPath(cfg, c.String("f")) - if err != nil { - return walletAddress{}, err - } - - wltAddr := walletAddress{ - Wallet: wlt, - } - - wltAddr.Address = c.String("a") - if wltAddr.Address == "" { - return wltAddr, nil - } - - if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { - return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) - } - - return wltAddr, nil -} - -func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { - if chgAddr == "" { - switch { - case wltAddr.Address != "": - // use the from address as change address - chgAddr = wltAddr.Address - case wltAddr.Wallet != "": - // get the default wallet's coin base address - wlt, err := wallet.Load(wltAddr.Wallet) - if err != nil { - return "", WalletLoadError{err} - } - - if len(wlt.Entries) > 0 { - chgAddr = wlt.Entries[0].Address.String() - } else { - return "", errors.New("no change address was found") - } - default: - return "", errors.New("both wallet file, from address and change address are empty") - } - } - - // validate the address - _, err := cipher.DecodeBase58Address(chgAddr) - if err != nil { - return "", fmt.Errorf("invalid change address: %s", chgAddr) - } - - return chgAddr, nil -} - -func getToAddresses(c *gcli.Context) ([]SendAmount, error) { - m := c.String("m") - if m != "" { - sas := []sendAmountJSON{} - if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { - return nil, fmt.Errorf("invalid -m flag string, err:%v", err) - } - sendAmts := make([]SendAmount, 0, len(sas)) - for _, sa := range sas { - amt, err := droplet.FromString(sa.Coins) - if err != nil { - return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) - } - - sendAmts = append(sendAmts, SendAmount{ - Addr: sa.Addr, - Coins: amt, - }) - } - return sendAmts, nil - } - - if c.NArg() < 2 { - return nil, errors.New("invalid argument") - } - - toAddr := c.Args().First() - // validate address - if _, err := cipher.DecodeBase58Address(toAddr); err != nil { - return nil, err - } - - amt, err := getAmount(c) - if err != nil { - return nil, err - } - return []SendAmount{{toAddr, amt}}, nil -} - -func getAmount(c *gcli.Context) (uint64, error) { - if c.NArg() < 2 { - return 0, errors.New("invalid argument") - } - - amount := c.Args().Get(1) - amt, err := droplet.FromString(amount) - if err != nil { - return 0, fmt.Errorf("invalid amount: %v", err) - } - - return amt, nil -} - -func createRawTxCmdHandler(c *gcli.Context) (*coin.Transaction, error) { - rpcClient := RPCClientFromContext(c) - - wltAddr, err := fromWalletOrAddress(c) - if err != nil { - return nil, err - } - - chgAddr, err := getChangeAddress(wltAddr, c.String("c")) - if err != nil { - return nil, err - } - - toAddrs, err := getToAddresses(c) - if err != nil { - return nil, err - } - - if err := validateSendAmounts(toAddrs); err != nil { - return nil, err - } - - pr := NewPasswordReader([]byte(c.String("p"))) - if wltAddr.Address == "" { - return CreateRawTxFromWallet(rpcClient, wltAddr.Wallet, chgAddr, toAddrs, pr) - } - - return CreateRawTxFromAddress(rpcClient, wltAddr.Address, wltAddr.Wallet, chgAddr, toAddrs, pr) -} - -func validateSendAmounts(toAddrs []SendAmount) error { - for _, arg := range toAddrs { - // validate to address - _, err := cipher.DecodeBase58Address(arg.Addr) - if err != nil { - return ErrAddress - } - - if arg.Coins == 0 { - return errors.New("Cannot send 0 coins") - } - } - - if len(toAddrs) == 0 { - return errors.New("No destination addresses") - } - - return nil -} - -// PUBLIC - -// CreateRawTxFromWallet creates a transaction from any address or combination of addresses in a wallet -func CreateRawTxFromWallet(c *webrpc.Client, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { - // check change address - cAddr, err := cipher.DecodeBase58Address(chgAddr) - if err != nil { - return nil, ErrAddress - } - - // check if the change address is in wallet. - wlt, err := wallet.Load(walletFile) - if err != nil { - return nil, err - } - - _, ok := wlt.GetEntry(cAddr) - if !ok { - return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) - } - - switch pr.(type) { - case nil: - if wlt.IsEncrypted() { - return nil, wallet.ErrWalletEncrypted - } - case PasswordFromBytes: - p, err := pr.Password() - if err != nil { - return nil, err - } - - if !wlt.IsEncrypted() && len(p) != 0 { - return nil, wallet.ErrWalletNotEncrypted - } - } - - var password []byte - if wlt.IsEncrypted() { - var err error - password, err = pr.Password() - if err != nil { - return nil, err - } - } - - // get all address in the wallet - totalAddrs := wlt.GetAddresses() - addrStrArray := make([]string, len(totalAddrs)) - for i, a := range totalAddrs { - addrStrArray[i] = a.String() - } - - return CreateRawTx(c, wlt, addrStrArray, chgAddr, toAddrs, password) -} - -// CreateRawTxFromAddress creates a transaction from a specific address in a wallet -func CreateRawTxFromAddress(c *webrpc.Client, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { - // check if the address is in the default wallet. - wlt, err := wallet.Load(walletFile) - if err != nil { - return nil, err - } - - srcAddr, err := cipher.DecodeBase58Address(addr) - if err != nil { - return nil, ErrAddress - } - - _, ok := wlt.GetEntry(srcAddr) - if !ok { - return nil, fmt.Errorf("%v address is not in wallet", addr) - } - - // validate change address - cAddr, err := cipher.DecodeBase58Address(chgAddr) - if err != nil { - return nil, ErrAddress - } - - _, ok = wlt.GetEntry(cAddr) - if !ok { - return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) - } - - switch pr.(type) { - case nil: - if wlt.IsEncrypted() { - return nil, wallet.ErrWalletEncrypted - } - case PasswordFromBytes: - p, err := pr.Password() - if err != nil { - return nil, err - } - - if !wlt.IsEncrypted() && len(p) != 0 { - return nil, wallet.ErrWalletNotEncrypted - } - } - - var password []byte - if wlt.IsEncrypted() { - var err error - password, err = pr.Password() - if err != nil { - return nil, err - } - } - - return CreateRawTx(c, wlt, []string{addr}, chgAddr, toAddrs, password) -} - -// CreateRawTx creates a transaction from a set of addresses contained in a loaded *wallet.Wallet -func CreateRawTx(c *webrpc.Client, wlt *wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { - if err := validateSendAmounts(toAddrs); err != nil { - return nil, err - } - - // Get unspent outputs of those addresses - unspents, err := c.GetUnspentOutputs(inAddrs) - if err != nil { - return nil, err - } - - inUxs, err := unspents.Outputs.SpendableOutputs().ToUxArray() - if err != nil { - return nil, err - } - - txn, err := createRawTx(unspents.Outputs, wlt, inAddrs, chgAddr, toAddrs, password) - if err != nil { - return nil, err - } - - // filter out unspents which are not used in transaction - var inUxsFiltered coin.UxArray - for _, h := range txn.In { - for _, u := range inUxs { - if h == u.Hash() { - inUxsFiltered = append(inUxsFiltered, u) - } - } - } - - // TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints minus - // the parts that require block head data, which is not available from the RPC API (see below) - if err := verifyTransactionConstraints(txn, inUxsFiltered, visor.DefaultMaxBlockSize); err != nil { - return nil, err - } - - // TODO -- verify against soft and hard constraints - // Need to get the head block to do verification. - // The head block is not exposed over the JSON RPC, which webrpc.Client uses. - // Need to remove the JSON RPC API and have the client make requests to the HTTP API. - // Once the HTTP API is used, - // Need to request /blockchain/metadata to get the head block time - // This could lead to race conditions; /blockchain/metadata should return the full head, or have an API endpoint - // just for the head, and/or include the head block in the get_outputs response - // The head block is used for calculating inUxs's coin hours. - // if err := visor.VerifySingleTxnSoftConstraints(txn, inUxs, visor.DefaultMaxBlockSize); err != nil { - // return nil, err - // } - // if err := visor.VerifySingleTxnHardConstraints(txn, head, inUxs); err != nil { - // return nil, err - // } - - return txn, nil -} - -// TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints and HardConstraints -// minus the parts that require block head data, which is not available from the RPC API (see below) -func verifyTransactionConstraints(txn *coin.Transaction, uxIn coin.UxArray, maxSize int) error { - // SOFT constraints: - - if txn.Size() > maxSize { - return errors.New("Transaction size bigger than max block size") - } - - if visor.TransactionIsLocked(uxIn) { - return errors.New("Transaction has locked address inputs") - } - - // Ignore transactions that do not conform to decimal restrictions - for _, o := range txn.Out { - if err := visor.DropletPrecisionCheck(o.Coins); err != nil { - return err - } - } - - // HARD constraints: - - if err := txn.Verify(); err != nil { - return err - } - - // Checks whether ux inputs exist, - // Check that signatures are allowed to spend inputs - if err := txn.VerifyInput(uxIn); err != nil { - return err - } - - // Verify CoinHours do not overflow - if _, err := txn.OutputHours(); err != nil { - return err - } - - // Check that no coins are created or destroyed - // TODO -- use the correct block head, once we have it from the API - // For now it doesn't matter, the block head is used to calculate the uxOut hours, - // but we're not validating the hours - uxOut := coin.CreateUnspents(coin.BlockHeader{ - BkSeq: 1, - }, *txn) - return coin.VerifyTransactionCoinsSpending(uxIn, uxOut) - - // TODO -- use coin.VerifyTransactionHoursSpending, once we have the head block - // return coin.VerifyTransactionHoursSpending(head.Time(), uxIn, uxOut) -} - -func createRawTx(uxouts visor.ReadableOutputSet, wlt *wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { - // Calculate total required coins - var totalCoins uint64 - for _, arg := range toAddrs { - totalCoins += arg.Coins - } - - spendOutputs, err := chooseSpends(uxouts, totalCoins) - if err != nil { - return nil, err - } - - txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) - if err != nil { - return nil, err - } - - f := func(w *wallet.Wallet) (*coin.Transaction, error) { - keys, err := getKeys(w, spendOutputs) - if err != nil { - return nil, err - } - - return NewTransaction(spendOutputs, keys, txOuts), nil - } - - makeTx := func() (*coin.Transaction, error) { - return f(wlt) - } - - if wlt.IsEncrypted() { - makeTx = func() (*coin.Transaction, error) { - var tx *coin.Transaction - if err := wlt.GuardView(password, func(w *wallet.Wallet) error { - var err error - tx, err = f(w) - return err - }); err != nil { - return nil, err - } - - return tx, nil - } - } - - return makeTx() -} - -func chooseSpends(uxouts visor.ReadableOutputSet, coins uint64) ([]wallet.UxBalance, error) { - // Convert spendable unspent outputs to []wallet.UxBalance - spendableOutputs, err := visor.ReadableOutputsToUxBalances(uxouts.SpendableOutputs()) - if err != nil { - return nil, err - } - - // Choose which unspent outputs to spend - // Use the MinimizeUxOuts strategy, since this is most likely used by - // application that may need to send frequently. - // Using fewer UxOuts will leave more available for other transactions, - // instead of waiting for confirmation. - outs, err := wallet.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) - if err != nil { - // If there is not enough balance in the spendable outputs, - // see if there is enough balance when including incoming outputs - if err == wallet.ErrInsufficientBalance { - expectedOutputs, otherErr := visor.ReadableOutputsToUxBalances(uxouts.ExpectedOutputs()) - if otherErr != nil { - return nil, otherErr - } - - if _, otherErr := wallet.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { - return nil, err - } - - return nil, ErrTemporaryInsufficientBalance - } - - return nil, err - } - - return outs, nil -} - -func makeChangeOut(outs []wallet.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { - var totalInCoins, totalInHours, totalOutCoins uint64 - - for _, o := range outs { - totalInCoins += o.Coins - totalInHours += o.Hours - } - - if totalInHours == 0 { - return nil, fee.ErrTxnNoFee - } - - for _, to := range toAddrs { - totalOutCoins += to.Coins - } - - if totalInCoins < totalOutCoins { - return nil, wallet.ErrInsufficientBalance - } - - outAddrs := []coin.TransactionOutput{} - changeAmount := totalInCoins - totalOutCoins - - haveChange := changeAmount > 0 - nAddrs := uint64(len(toAddrs)) - changeHours, addrHours, totalOutHours := wallet.DistributeSpendHours(totalInHours, nAddrs, haveChange) - - if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours); err != nil { - return nil, err - } - - for i, to := range toAddrs { - // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero - // changeHours is zero when there is no change left or all the coinhours were used in fees - // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses - // 2) if all the coinhours are burned in fees then all addrHours are zero by default - if changeHours > 0 { - // the coinhours are capped to a maximum of incoming coins for the address - // if incoming coins < 1 then the cap is set to 1 coinhour - - spendCoinsAmt := to.Coins / 1e6 - if spendCoinsAmt == 0 { - spendCoinsAmt = 1 - } - - // allow addrHours to be less than the incoming coins of the address but not more - if addrHours[i] > spendCoinsAmt { - // cap the addrHours, move the difference to changeHours - changeHours += addrHours[i] - spendCoinsAmt - addrHours[i] = spendCoinsAmt - } - } - - outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) - } - - if haveChange { - outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) - } - - return outAddrs, nil -} - -func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { - uo := coin.TransactionOutput{} - uo.Address = cipher.MustDecodeBase58Address(addr) - uo.Coins = coins - uo.Hours = hours - return uo -} - -func getKeys(wlt *wallet.Wallet, outs []wallet.UxBalance) ([]cipher.SecKey, error) { - keys := make([]cipher.SecKey, len(outs)) - for i, o := range outs { - entry, ok := wlt.GetEntry(o.Address) - if !ok { - return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) - } - - keys[i] = entry.Secret - } - return keys, nil -} - -// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. -func NewTransaction(utxos []wallet.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) *coin.Transaction { - tx := coin.Transaction{} - for _, u := range utxos { - tx.PushInput(u.Hash) - } - - for _, o := range outs { - tx.PushOutput(o.Address, o.Coins, o.Hours) - } - - tx.SignInputs(keys) - - tx.UpdateHeader() - return &tx -} diff --git a/src/api/cli/decryptWallet.go b/src/api/cli/decryptWallet.go deleted file mode 100755 index 63232e1..0000000 --- a/src/api/cli/decryptWallet.go +++ /dev/null @@ -1,95 +0,0 @@ -package cli - -import ( - "errors" - "fmt" - "path/filepath" - - "github.com/skycoin/skycoin/src/wallet" - gcli "github.com/urfave/cli" -) - -func decryptWalletCmd(cfg Config) gcli.Command { - name := "decryptWallet" - return gcli.Command{ - Name: name, - Usage: "Decrypt wallet", - Description: fmt.Sprintf(` - The default wallet (%s) will be - used if no wallet was specified. - - Use caution when using the "-p" command. If you have command history enabled - your wallet encryption password can be recovered from the history log. If you - do not include the "-p" option you will be prompted to enter your password - after you enter your command.`, cfg.FullWalletPath()), - Flags: []gcli.Flag{ - gcli.StringFlag{ - Name: "p", - Usage: "[password] Wallet password", - }, - }, - OnUsageError: onCommandUsageError(name), - Action: func(c *gcli.Context) error { - cfg := ConfigFromContext(c) - - w, err := resolveWalletPath(cfg, "") - if err != nil { - return err - } - - pr := NewPasswordReader([]byte(c.String("p"))) - - wlt, err := decryptWallet(w, pr) - switch err.(type) { - case nil: - case WalletLoadError: - errorWithHelp(c, err) - return nil - case WalletSaveError: - return errors.New("save wallet failed") - default: - return err - } - - printJSON(wallet.NewReadableWallet(wlt)) - return nil - }, - } -} - -func decryptWallet(walletFile string, pr PasswordReader) (*wallet.Wallet, error) { - wlt, err := wallet.Load(walletFile) - if err != nil { - return nil, WalletLoadError{err} - } - - if !wlt.IsEncrypted() { - return nil, wallet.ErrWalletNotEncrypted - } - - if pr == nil { - return nil, wallet.ErrMissingPassword - } - - password, err := pr.Password() - if err != nil { - return nil, err - } - - unlockedWlt, err := wlt.Unlock(password) - if err != nil { - return nil, err - } - - dir, err := filepath.Abs(filepath.Dir(walletFile)) - if err != nil { - return nil, err - } - - // save the wallet - if err := unlockedWlt.Save(dir); err != nil { - return nil, WalletLoadError{err} - } - - return unlockedWlt, nil -} diff --git a/src/api/cli/encrypt_wallet.go b/src/api/cli/encrypt_wallet.go deleted file mode 100755 index 6c452a0..0000000 --- a/src/api/cli/encrypt_wallet.go +++ /dev/null @@ -1,106 +0,0 @@ -package cli - -import ( - "errors" - "fmt" - "path/filepath" - - "github.com/skycoin/skycoin/src/wallet" - gcli "github.com/urfave/cli" -) - -func encryptWalletCmd(cfg Config) gcli.Command { - name := "encryptWallet" - return gcli.Command{ - Name: name, - Usage: "Encrypt wallet", - ArgsUsage: " ", - Description: fmt.Sprintf(` - The default wallet (%s) will be - used if no wallet was specified. - - Use caution when using the "-p" command. If you have command history enabled - your wallet encryption password can be recovered from the history log. If you - do not include the "-p" option you will be prompted to enter your password - after you enter your command.`, cfg.FullWalletPath()), - Flags: []gcli.Flag{ - gcli.StringFlag{ - Name: "p", - Usage: "[password] Wallet password", - }, - gcli.StringFlag{ - Name: "x,crypto-type", - Value: string(wallet.CryptoTypeScryptChacha20poly1305), - Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", - }, - }, - OnUsageError: onCommandUsageError(name), - Action: func(c *gcli.Context) error { - cfg := ConfigFromContext(c) - - w, err := resolveWalletPath(cfg, "") - if err != nil { - return err - } - - cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) - if err != nil { - errorWithHelp(c, err) - return nil - } - - pr := NewPasswordReader([]byte(c.String("p"))) - - wlt, err := encryptWallet(w, pr, cryptoType) - switch err.(type) { - case nil: - case WalletLoadError: - errorWithHelp(c, err) - return nil - case WalletSaveError: - return errors.New("save wallet failed") - default: - return err - } - - printJSON(wallet.NewReadableWallet(wlt)) - return nil - }, - } -} - -func encryptWallet(walletFile string, pr PasswordReader, cryptoType wallet.CryptoType) (*wallet.Wallet, error) { - wlt, err := wallet.Load(walletFile) - if err != nil { - return nil, WalletLoadError{err} - } - - if wlt.IsEncrypted() { - return nil, wallet.ErrWalletEncrypted - } - - if pr == nil { - return nil, wallet.ErrMissingPassword - } - - password, err := pr.Password() - if err != nil { - return nil, err - } - - if err := wlt.Lock(password, cryptoType); err != nil { - return nil, err - } - - dir, err := filepath.Abs(filepath.Dir(walletFile)) - if err != nil { - return nil, err - } - - // save the wallet - if err := wlt.Save(dir); err != nil { - return nil, WalletLoadError{err} - } - - return wlt, nil -} diff --git a/src/api/cli/generate_wallet.go b/src/api/cli/generate_wallet.go deleted file mode 100755 index 1129006..0000000 --- a/src/api/cli/generate_wallet.go +++ /dev/null @@ -1,252 +0,0 @@ -package cli - -import ( - "encoding/hex" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/cipher/go-bip39" - secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" - "github.com/skycoin/skycoin/src/wallet" - - gcli "github.com/urfave/cli" -) - -const ( - // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes - AlphaNumericSeedLength = 64 -) - -func generateWalletCmd(cfg Config) gcli.Command { - name := "generateWallet" - return gcli.Command{ - Name: "generateWallet", - Usage: "Generate a new wallet", - ArgsUsage: " ", - OnUsageError: onCommandUsageError(name), - Description: fmt.Sprintf(`The default wallet (%s) will - be created if no wallet and address was specified. - - Use caution when using the "-p" command. If you have command - history enabled your wallet encryption password can be recovered - from the history log. If you do not include the "-p" option you will - be prompted to enter your password after you enter your command. - - All results are returned in JSON format.`, cfg.FullWalletPath()), - Flags: []gcli.Flag{ - gcli.BoolFlag{ - Name: "r", - Usage: "A random alpha numeric seed will be generated for you", - }, - gcli.BoolFlag{ - Name: "rd", - Usage: "A random seed consisting of 12 dictionary words will be generated for you", - }, - gcli.StringFlag{ - Name: "s", - Usage: "Your seed", - }, - gcli.UintFlag{ - Name: "n", - Value: 1, - Usage: `[numberOfAddresses] Number of addresses to generate - By default 1 address is generated.`, - }, - gcli.StringFlag{ - Name: "f", - Value: cfg.WalletName, - Usage: `[walletName] Name of wallet. The final format will be "yourName.wlt". - If no wallet name is specified a generic name will be selected.`, - }, - gcli.StringFlag{ - Name: "l", - Usage: "[label] Label used to idetify your wallet.", - }, - gcli.BoolFlag{ - Name: "e,encrypt", - Usage: `Whether creates wallet with encryption `, - }, - gcli.StringFlag{ - Name: "x,crypto-type", - Value: string(wallet.CryptoTypeScryptChacha20poly1305), - Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", - }, - gcli.StringFlag{ - Name: "p", - Usage: "[password] Wallet password", - }, - }, - Action: generateWalletHandler, - } -} - -func generateWalletHandler(c *gcli.Context) error { - cfg := ConfigFromContext(c) - - // create wallet dir if not exist - if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { - if err := os.MkdirAll(cfg.WalletDir, 0755); err != nil { - return errors.New("create dir failed") - } - } - - // get wallet name - wltName := c.String("f") - - // check if the wallet name has wlt extension. - if !strings.HasSuffix(wltName, ".wlt") { - return ErrWalletName - } - - // wallet file should not be a path. - if filepath.Base(wltName) != wltName { - return fmt.Errorf("wallet file name must not contain path") - } - - // check if the wallet file does exist - if _, err := os.Stat(filepath.Join(cfg.WalletDir, wltName)); err == nil { - return fmt.Errorf("%v already exist", wltName) - } - - // check if the wallet dir does exist. - if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { - return err - } - - // get number of address that are need to be generated, if m is 0, set to 1. - num := c.Uint64("n") - if num == 0 { - return errors.New("-n must > 0") - } - - // get label - label := c.String("l") - - // get seed - s := c.String("s") - r := c.Bool("r") - rd := c.Bool("rd") - - encrypt := c.Bool("e") - - sd, err := makeSeed(s, r, rd) - if err != nil { - return err - } - - cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) - if err != nil { - return err - } - - pr := NewPasswordReader([]byte(c.String("p"))) - switch pr.(type) { - case PasswordFromBytes: - p, err := pr.Password() - if err != nil { - return err - } - - if !encrypt && len(p) != 0 { - return errors.New("password should not be set as we're not going to create a wallet with encryption") - } - } - - var password []byte - if encrypt { - var err error - password, err = pr.Password() - if err != nil { - return err - } - } - - opts := wallet.Options{ - Label: label, - Seed: sd, - Encrypt: encrypt, - CryptoType: cryptoType, - Password: []byte(password), - } - - wlt, err := GenerateWallet(wltName, opts, num) - if err != nil { - return err - } - - if err := wlt.Save(cfg.WalletDir); err != nil { - return err - } - - return printJSON(wallet.NewReadableWallet(wlt)) -} - -func makeSeed(s string, r, rd bool) (string, error) { - if s != "" { - // 111, 101, 110 - if r || rd { - return "", errors.New("seed already specified, must not use -r or -rd again") - } - // 100 - return s, nil - } - - // 011 - if r && rd { - return "", errors.New("for -r and -rd, only one option can be used") - } - - // 010 - if r { - return MakeAlphanumericSeed(), nil - } - - // 001, 000 - return bip39.NewDefaultMnemomic() -} - -// PUBLIC - -// GenerateWallet generates a new wallet with filename walletFile, label, seed and number of addresses. -// Caller should save the wallet file to its chosen directory -func GenerateWallet(walletFile string, opts wallet.Options, numAddrs uint64) (*wallet.Wallet, error) { - walletFile = filepath.Base(walletFile) - - wlt, err := wallet.NewWallet(walletFile, wallet.Options{ - Seed: opts.Seed, - Label: opts.Label, - }) - if err != nil { - return nil, err - } - - if numAddrs > 1 { - if _, err := wlt.GenerateAddresses(numAddrs - 1); err != nil { - return nil, err - } - } - - if !opts.Encrypt { - if len(opts.Password) != 0 { - return nil, wallet.ErrWalletNotEncrypted - } - - return wlt, nil - } - - if err := wlt.Lock(opts.Password, opts.CryptoType); err != nil { - return nil, err - } - - return wlt, nil -} - -// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it -func MakeAlphanumericSeed() string { - seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) - return hex.EncodeToString(seedRaw[:]) -} diff --git a/src/api/cli/integration/integration_test.go b/src/api/cli/integration/integration_test.go deleted file mode 100755 index c22dd18..0000000 --- a/src/api/cli/integration/integration_test.go +++ /dev/null @@ -1,2669 +0,0 @@ -// package integration_test implements CLI integration tests -package integration_test - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "sync" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/api/cli" - "github.com/skycoin/skycoin/src/api/webrpc" - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/gui" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/droplet" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" -) - -const ( - binaryName = "skycoin-cli" - - testModeStable = "stable" - testModeLive = "live" - testModeDisableWalletApi = "disable-wallet-api" - - // Number of random transactions of live transaction test. - randomLiveTransactionNum = 500 - - testFixturesDir = "test-fixtures" - - stableWalletName = "integration-test.wlt" - stableEncryptWalletName = "integration-test-encrypted.wlt" -) - -var ( - binaryPath string - - update = flag.Bool("update", false, "update golden files") - liveTxFull = flag.Bool("live-tx-full", false, "run live transaction test against full blockchain") - testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") - - cryptoTypes = []wallet.CryptoType{wallet.CryptoTypeScryptChacha20poly1305, wallet.CryptoTypeSha256Xor} -) - -type TestData struct { - actual interface{} - expected interface{} -} - -func init() { - rand.Seed(time.Now().Unix()) -} - -// Do setup and teardown here. -func TestMain(m *testing.M) { - abs, err := filepath.Abs(binaryName) - if err != nil { - fmt.Fprintf(os.Stderr, fmt.Sprintf("get binary name absolute path failed: %v\n", err)) - os.Exit(1) - } - - binaryPath = abs - - // Build cli binary file. - args := []string{"build", "-o", binaryPath, "../../../../cmd/cli/cli.go"} - if err := exec.Command("go", args...).Run(); err != nil { - fmt.Fprintf(os.Stderr, fmt.Sprintf("Make %v binary failed: %v\n", binaryName, err)) - os.Exit(1) - } - - ret := m.Run() - - // Remove the generated cli binary file. - if err := os.Remove(binaryPath); err != nil { - fmt.Fprintf(os.Stderr, fmt.Sprintf("Delete %v failed: %v", binaryName, err)) - os.Exit(1) - } - - os.Exit(ret) -} - -func createUnEncryptedWallet(t *testing.T) (string, func()) { - return createTempWallet(t, false) -} - -func createEncryptedWallet(t *testing.T) (string, func()) { - return createTempWallet(t, true) -} - -// createTempWallet creates a temporary dir, and if encrypt is true, copy -// the test-fixtures/$stableEncryptedWalletName file to the dir. If it's false, then -// copy the test-fixtures/$stableWalletName file to the dir -// returns the temporary wallet path, cleanup callback function, and error if any. -func createTempWallet(t *testing.T, encrypt bool) (string, func()) { - dir, err := ioutil.TempDir("", "wallet-data-dir") - require.NoError(t, err) - - // Copy the testdata/$stableWalletName to the temporary dir. - var wltName string - if encrypt { - wltName = stableEncryptWalletName - } else { - wltName = stableWalletName - } - - walletPath := filepath.Join(dir, wltName) - f, err := os.Create(walletPath) - require.NoError(t, err) - - defer f.Close() - - rf, err := os.Open(filepath.Join(testFixturesDir, wltName)) - require.NoError(t, err) - - defer rf.Close() - io.Copy(f, rf) - - originalWalletDirEnv := os.Getenv("WALLET_DIR") - originalWalletNameEnv := os.Getenv("WALLET_NAME") - - os.Setenv("WALLET_DIR", dir) - os.Setenv("WALLET_NAME", wltName) - - fun := func() { - os.Setenv("WALLET_DIR", originalWalletDirEnv) - os.Setenv("WALLET_NAME", originalWalletNameEnv) - - // Delete the temporary dir - os.RemoveAll(dir) - } - - return walletPath, fun -} - -// createTempWalletDir creates a temporary wallet dir, -// sets the WALLET_DIR environment variable. -// Returns wallet dir path and callback function to clean up the dir. -func createTempWalletDir(t *testing.T) func() { - dir, err := ioutil.TempDir("", "wallet-data-dir") - require.NoError(t, err) - os.Setenv("WALLET_DIR", dir) - - return func() { - os.Setenv("WALLET_DIR", "") - os.RemoveAll(dir) - } -} - -func loadJSON(t *testing.T, filename string, obj interface{}) { - f, err := os.Open(filename) - require.NoError(t, err) - defer f.Close() - - err = json.NewDecoder(f).Decode(obj) - require.NoError(t, err) -} - -func loadGoldenFile(t *testing.T, filename string, testData TestData) { - require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") - - goldenFile := filepath.Join(testFixturesDir, filename) - - if *update { - updateGoldenFile(t, goldenFile, testData.actual) - } - - f, err := os.Open(goldenFile) - require.NoError(t, err) - defer f.Close() - - err = json.NewDecoder(f).Decode(testData.expected) - require.NoError(t, err, filename) -} - -func updateGoldenFile(t *testing.T, filename string, content interface{}) { - contentJSON, err := json.MarshalIndent(content, "", "\t") - require.NoError(t, err) - contentJSON = append(contentJSON, '\n') - err = ioutil.WriteFile(filename, contentJSON, 0644) - require.NoError(t, err) -} - -func writeJSON(t *testing.T, filename string, obj interface{}) { - f, err := os.Create(filename) - require.NoError(t, err) - defer f.Close() - - enc := json.NewEncoder(f) - enc.SetIndent("", "\t") - require.NoError(t, enc.Encode(obj)) -} - -func mode(t *testing.T) string { - mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") - switch mode { - case "": - mode = testModeStable - case testModeLive, testModeStable, testModeDisableWalletApi: - default: - t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") - } - return mode -} - -func enabled() bool { - return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" -} - -func doStable(t *testing.T) bool { - if enabled() && mode(t) == testModeStable { - return true - } - - t.Skip("Stable tests disabled") - return false -} - -func doLive(t *testing.T) bool { - if enabled() && mode(t) == testModeLive { - return true - } - - t.Skip("Live tests disabled") - return false -} - -func doLiveWallet(t *testing.T) bool { - if *testLiveWallet { - return true - } - - t.Skip("Tests requiring wallet envvars are disabled") - return false -} - -// requireWalletDir checks if the WALLET_DIR environment value is set -func requireWalletDir(t *testing.T) { - walletDir := os.Getenv("WALLET_DIR") - if walletDir == "" { - t.Fatal("missing WALLET_DIR environment value") - } -} - -// requireWalletEnv checks if the WALLET_DIR and WALLET_NAME environment value are set -func requireWalletEnv(t *testing.T) { - if !doLiveWallet(t) { - return - } - - walletDir := os.Getenv("WALLET_DIR") - if walletDir == "" { - t.Fatal("missing WALLET_DIR environment value") - } - - walletName := os.Getenv("WALLET_NAME") - if walletName == "" { - t.Fatal("missing WALLET_NAME environment value") - } -} - -// getWalletPathFromEnv gets wallet file path from environment variables -func getWalletPathFromEnv(t *testing.T) (string, string) { - walletDir := os.Getenv("WALLET_DIR") - if walletDir == "" { - t.Fatal("missing WALLET_DIR environment value") - } - - walletName := os.Getenv("WALLET_NAME") - if walletName == "" { - t.Fatal("missing WALLET_NAME environment value") - } - - return walletDir, walletName -} - -func doLiveOrStable(t *testing.T) bool { - if enabled() { - switch mode(t) { - case testModeStable, testModeLive: - return true - } - } - - t.Skip("Live and stable tests disabled") - return false -} - -func rpcAddress() string { - rpcAddr := os.Getenv("RPC_ADDR") - if rpcAddr == "" { - rpcAddr = "http://127.0.0.1:6420" - } - - return rpcAddr -} - -func useCSRF(t *testing.T) bool { - x := os.Getenv("USE_CSRF") - if x == "" { - return false - } - - useCSRF, err := strconv.ParseBool(x) - require.NoError(t, err) - return useCSRF -} - -func TestGenerateAddresses(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - encrypted bool - args []string - isUsageErr bool - expectOutput []byte - goldenFile string - }{ - { - name: "generateAddresses", - encrypted: false, - args: []string{"generateAddresses"}, - expectOutput: []byte("7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\n"), - goldenFile: "generate-addresses.golden", - }, - { - name: "generateAddresses -n 2 -j", - encrypted: false, - args: []string{"generateAddresses", "-n", "2", "-j"}, - expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\",\n \"2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV\"\n ]\n}\n"), - goldenFile: "generate-addresses-2.golden", - }, - { - name: "generateAddresses -n -2 -j", - encrypted: false, - args: []string{"generateAddresses", "-n", "-2", "-j"}, - isUsageErr: true, - expectOutput: []byte("Error: invalid value \"-2\" for flag -n: strconv.ParseUint: parsing \"-2\": invalid syntax"), - goldenFile: "generate-addresses-2.golden", - }, - { - name: "generateAddresses in encrypted wallet", - encrypted: true, - args: []string{"generateAddresses", "-p", "pwd", "-j"}, - expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\"\n ]\n}\n"), - goldenFile: "generate-addresses-encrypted.golden", - }, - { - name: "generateAddresses in encrypted wallet with invalid password", - encrypted: true, - args: []string{"generateAddresses", "-p", "invalid password", "-j"}, - expectOutput: []byte("invalid password\n"), - }, - { - name: "generateAddresses in unencrypted wallet with password", - encrypted: false, - args: []string{"generateAddresses", "-p", "pwd"}, - expectOutput: []byte("wallet is not encrypted\n"), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - walletPath, clean := createTempWallet(t, tc.encrypted) - defer clean() - - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - if err != nil { - require.EqualError(t, err, "exit status 1") - return - } - - if tc.isUsageErr { - require.True(t, bytes.Contains(output, tc.expectOutput)) - return - } - - require.Equal(t, tc.expectOutput, output) - - require.NoError(t, err) - - var w wallet.ReadableWallet - loadJSON(t, walletPath, &w) - - // Use loadJSON instead of loadGoldenFile because this golden file - // should not use the *update flag - goldenFile := filepath.Join(testFixturesDir, tc.goldenFile) - fmt.Println("goldenFile:", goldenFile) - var expect wallet.ReadableWallet - loadJSON(t, goldenFile, &expect) - if tc.encrypted { - // wips secrets as it's not stable - expect.Meta["secrets"] = "" - w.Meta["secrets"] = "" - } - require.Equal(t, expect, w) - }) - } -} - -func TestVerifyAddress(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - addr string - err error - errMsg string - }{ - { - "valid skycoin address", - "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", - nil, - "", - }, - { - "invalid skycoin address", - "2KG9eRXUhx6hrDZvNGB99DKahtrPDQ1W9vn", - errors.New("exit status 1"), - "Invalid version", - }, - { - "invalid bitcoin address", - "1Dcb9gpaZpBKmjqjCsiBsP3sBW1md2kEM2", - errors.New("exit status 1"), - "Invalid version", - }, - } - - for _, tc := range tt { - output, err := exec.Command(binaryPath, "verifyAddress", tc.addr).CombinedOutput() - if err != nil { - require.Equal(t, tc.err.Error(), err.Error()) - require.Equal(t, tc.errMsg, strings.Trim(string(output), "\n")) - return - } - - require.Empty(t, output) - } -} - -func TestDecodeRawTransaction(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - rawTx string - goldenFile string - errMsg []byte - }{ - { - name: "success", - rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", - goldenFile: "decode-raw-transaction.golden", - }, - { - name: "invalid raw transaction", - rawTx: "2601000000a1d", - errMsg: []byte("invalid raw transaction: encoding/hex: odd length hex string\nencoding/hex: odd length hex string\n"), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, "decodeRawTransaction", tc.rawTx).CombinedOutput() - if err != nil { - require.Error(t, err, "exit status 1") - require.Equal(t, tc.errMsg, output) - return - } - - require.NoError(t, err) - if bytes.Contains(output, []byte("Error: ")) { - require.Equal(t, tc.errMsg, string(output)) - return - } - - var txn visor.TransactionJSON - err = json.NewDecoder(bytes.NewReader(output)).Decode(&txn) - require.NoError(t, err) - - var expect visor.TransactionJSON - loadGoldenFile(t, tc.goldenFile, TestData{txn, &expect}) - require.Equal(t, expect, txn) - }) - } - -} - -func TestAddressGen(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - args []string - outputCheck func(t *testing.T, output []byte) - }{ - { - "addressGen", - []string{"addressGen"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "skycoin", w.Meta["coin"]) - - // Confirms that the seed is consisted of 12 words - seed := w.Meta["seed"] - require.NotEmpty(t, seed) - ss := strings.Split(seed, " ") - require.Len(t, ss, 12) - }, - }, - { - "addressGen --count 2", - []string{"addressGen", "--count", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "skycoin", w.Meta["coin"]) - - // Confirms that the seed is consisted of 12 words - seed := w.Meta["seed"] - require.NotEmpty(t, seed) - ss := strings.Split(seed, " ") - require.Len(t, ss, 12) - - // Confirms that the wallet have 2 address - require.Len(t, w.Entries, 2) - - // Confirms the addresses are generated from the seed - _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) - for i, key := range keys { - pk := cipher.PubKeyFromSecKey(key) - addr := cipher.AddressFromSecKey(key) - require.Equal(t, addr.String(), w.Entries[i].Address) - require.Equal(t, pk.Hex(), w.Entries[i].Public) - require.Equal(t, key.Hex(), w.Entries[i].Secret) - } - }, - }, - { - "addressGen -c 2", - []string{"addressGen", "-c", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "skycoin", w.Meta["coin"]) - - // Confirms that the seed is consisted of 12 words - seed := w.Meta["seed"] - require.NotEmpty(t, seed) - ss := strings.Split(seed, " ") - require.Len(t, ss, 12) - - // Confirms that the wallet have 2 address - require.Len(t, w.Entries, 2) - - // Confirms the addresses are generated from the seed - _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) - for i, key := range keys { - pk := cipher.PubKeyFromSecKey(key) - addr := cipher.AddressFromSecKey(key) - require.Equal(t, addr.String(), w.Entries[i].Address) - require.Equal(t, pk.Hex(), w.Entries[i].Public) - require.Equal(t, key.Hex(), w.Entries[i].Secret) - } - }, - }, - { - "addressGen --hide-secret -c 2", - []string{"addressGen", "--hide-secret", "-c", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "skycoin", w.Meta["coin"]) - - // Confirms the secrets in Entries are hidden - require.Len(t, w.Entries, 2) - for _, e := range w.Entries { - require.Equal(t, e.Secret, "") - } - }, - }, - { - "addressGen -s -c 2", - []string{"addressGen", "-s", "-c", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "skycoin", w.Meta["coin"]) - - // Confirms the secrets in Entries are hidden - require.Len(t, w.Entries, 2) - for _, e := range w.Entries { - require.Equal(t, e.Secret, "") - } - }, - }, - { - "addressGen --bitcoin -c 2", - []string{"addressGen", "--bitcoin", "-c", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "bitcoin", w.Meta["coin"]) - - require.Len(t, w.Entries, 2) - - // Confirms the addresses are bitcoin addresses that generated from the seed - seed := w.Meta["seed"] - _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) - for i, key := range keys { - pk := cipher.PubKeyFromSecKey(key) - sk := cipher.BitcoinWalletImportFormatFromSeckey(key) - address := cipher.BitcoinAddressFromPubkey(pk) - require.Equal(t, address, w.Entries[i].Address) - require.Equal(t, pk.Hex(), w.Entries[i].Public) - require.Equal(t, sk, w.Entries[i].Secret) - } - }, - }, - { - "addressGen -b -c 2", - []string{"addressGen", "-b", "-c", "2"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the wallet type is skycoin - require.Equal(t, "bitcoin", w.Meta["coin"]) - - require.Len(t, w.Entries, 2) - - // Confirms the addresses are bitcoin addresses that generated from the seed - seed := w.Meta["seed"] - _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) - for i, key := range keys { - pk := cipher.PubKeyFromSecKey(key) - sk := cipher.BitcoinWalletImportFormatFromSeckey(key) - address := cipher.BitcoinAddressFromPubkey(pk) - require.Equal(t, address, w.Entries[i].Address) - require.Equal(t, pk.Hex(), w.Entries[i].Public) - require.Equal(t, sk, w.Entries[i].Secret) - } - }, - }, - { - "addressGen --hex", - []string{"addressGen", "--hex"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the seed is a valid hex string - _, err = hex.DecodeString(w.Meta["seed"]) - require.NoError(t, err) - }, - }, - { - "addressGen -x", - []string{"addressGen", "-x"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - // Confirms the seed is a valid hex string - _, err = hex.DecodeString(w.Meta["seed"]) - require.NoError(t, err) - }, - }, - { - "addressGen --only-addr", - []string{"addressGen", "--only-addr"}, - func(t *testing.T, v []byte) { - // Confirms that only addresses are returned - v = bytes.Trim(v, "\n") - _, err := cipher.DecodeBase58Address(string(v)) - require.NoError(t, err) - }, - }, - { - "addressGen --oa", - []string{"addressGen", "--oa"}, - func(t *testing.T, v []byte) { - // Confirms that only addresses are returned - v = bytes.Trim(v, "\n") - _, err := cipher.DecodeBase58Address(string(v)) - require.NoError(t, err) - }, - }, - { - "addressGen --seed=123", - []string{"addressGen", "--seed", "123"}, - func(t *testing.T, v []byte) { - var w wallet.ReadableWallet - err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) - require.NoError(t, err) - - pk, sk := cipher.GenerateDeterministicKeyPair([]byte("123")) - addr := cipher.AddressFromPubKey(pk) - require.Len(t, w.Entries, 1) - require.Equal(t, addr.String(), w.Entries[0].Address) - require.Equal(t, pk.Hex(), w.Entries[0].Public) - require.Equal(t, sk.Hex(), w.Entries[0].Secret) - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - require.NoError(t, err) - tc.outputCheck(t, output) - }) - } -} - -func TestStableListWallets(t *testing.T) { - if !doStable(t) { - return - } - - _, clean := createUnEncryptedWallet(t) - defer clean() - - output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() - require.NoError(t, err) - - var wlts struct { - Wallets []cli.WalletEntry `json:"wallets"` - } - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) - require.NoError(t, err) - - var expect struct { - Wallets []cli.WalletEntry `json:"wallets"` - } - loadGoldenFile(t, "list-wallets.golden", TestData{wlts, &expect}) - require.Equal(t, expect, wlts) -} - -func TestLiveListWallets(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletDir(t) - - output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() - require.NoError(t, err) - - var wlts struct { - Wallets []cli.WalletEntry `json:"wallets"` - } - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) - require.NoError(t, err) - require.NotEmpty(t, wlts.Wallets) -} - -func TestStableListAddress(t *testing.T) { - if !doStable(t) { - return - } - - _, clean := createUnEncryptedWallet(t) - defer clean() - - output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() - require.NoError(t, err) - - var wltAddresses struct { - Addresses []string `json:"addresses"` - } - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) - require.NoError(t, err) - - var expect struct { - Addresses []string `json:"addresses"` - } - loadGoldenFile(t, "list-addresses.golden", TestData{wltAddresses, &expect}) - require.Equal(t, expect, wltAddresses) -} - -func TestLiveListAddresses(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() - require.NoError(t, err) - - var wltAddresses struct { - Addresses []string `json:"addresses"` - } - - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) - require.NoError(t, err) - - require.NotEmpty(t, wltAddresses.Addresses) -} - -func TestStableAddressBalance(t *testing.T) { - if !doStable(t) { - return - } - - output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() - require.NoError(t, err) - - var addrBalance cli.BalanceResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) - require.NoError(t, err) - - var expect cli.BalanceResult - loadGoldenFile(t, "address-balance.golden", TestData{addrBalance, &expect}) - require.Equal(t, expect, addrBalance) -} - -func TestLiveAddressBalance(t *testing.T) { - if !doLive(t) { - return - } - - output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() - require.NoError(t, err) - - var addrBalance cli.BalanceResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) - require.NoError(t, err) -} - -func TestStableWalletBalance(t *testing.T) { - if !doStable(t) { - return - } - - _, clean := createUnEncryptedWallet(t) - defer clean() - - output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() - require.NoError(t, err) - - var wltBalance cli.BalanceResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) - require.NoError(t, err) - - var expect cli.BalanceResult - loadGoldenFile(t, "wallet-balance.golden", TestData{wltBalance, &expect}) - require.Equal(t, expect, wltBalance) -} - -func TestLiveWalletBalance(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() - require.NoError(t, err) - - var wltBalance cli.BalanceResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) - require.NoError(t, err) - - require.NotEmpty(t, wltBalance.Confirmed.Coins) - require.NotEmpty(t, wltBalance.Addresses) -} - -func TestStableWalletOutputs(t *testing.T) { - if !doStable(t) { - return - } - - _, clean := createUnEncryptedWallet(t) - defer clean() - - output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() - require.NoError(t, err) - - var wltOutput webrpc.OutputsResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) - require.NoError(t, err) - - var expect webrpc.OutputsResult - loadGoldenFile(t, "wallet-outputs.golden", TestData{wltOutput, &expect}) - require.Equal(t, expect, wltOutput) -} - -func TestLiveWalletOutputs(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() - require.NoError(t, err) - - var wltOutput webrpc.OutputsResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) - require.NoError(t, err) - - require.NotEmpty(t, wltOutput.Outputs.HeadOutputs) -} - -func TestStableAddressOutputs(t *testing.T) { - if !doStable(t) { - return - } - - tt := []struct { - name string - args []string - goldenFile string - err error - errMsg string - }{ - { - name: "addressOutputs one address", - args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, - goldenFile: "address-outputs.golden", - }, - { - name: "addressOutputs two address", - args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}, - goldenFile: "two-addresses-outputs.golden", - }, - { - name: "addressOutputs two address one invalid", - args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "badaddress"}, - err: errors.New("exit status 1"), - errMsg: "invalid address: badaddress, err: Invalid address length\n", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - - if tc.err != nil { - testutil.RequireError(t, err, tc.err.Error()) - require.Equal(t, tc.errMsg, string(output)) - return - } - - require.NoError(t, err) - - var addrOutputs webrpc.OutputsResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) - require.NoError(t, err) - - var expect webrpc.OutputsResult - loadGoldenFile(t, tc.goldenFile, TestData{addrOutputs, &expect}) - require.Equal(t, expect, addrOutputs) - }) - } -} - -func TestLiveAddressOutputs(t *testing.T) { - if !doLive(t) { - return - } - - output, err := exec.Command(binaryPath, "addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() - require.NoError(t, err) - - var addrOutputs webrpc.OutputsResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) - require.NoError(t, err) -} - -func TestStableShowConfig(t *testing.T) { - if !doStable(t) { - return - } - - output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() - require.NoError(t, err) - - var ret cli.Config - err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) - require.NoError(t, err) - - // WalletDir and DataDir can't be checked perfectly without essentially - // reimplementing cli.LoadConfig to compare values - require.NotEmpty(t, ret.WalletDir) - require.NotEmpty(t, ret.DataDir) - require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) - require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) - require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) - - ret.WalletDir = "IGNORED/.skycoin/wallets" - ret.DataDir = "IGNORED/.skycoin" - - goldenFile := "show-config.golden" - if useCSRF(t) { - goldenFile = "show-config-use-csrf.golden" - } - - var expect cli.Config - loadGoldenFile(t, goldenFile, TestData{ret, &expect}) - require.Equal(t, expect, ret) -} - -func TestLiveShowConfig(t *testing.T) { - if !doLive(t) { - return - } - - output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() - require.NoError(t, err) - - var ret cli.Config - err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) - require.NoError(t, err) - - // WalletDir and DataDir can't be checked perfectly without essentially - // reimplementing cli.LoadConfig to compare values - require.NotEmpty(t, ret.WalletDir) - require.NotEmpty(t, ret.DataDir) - require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) - require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) - require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) - - walletName := os.Getenv("WALLET_NAME") - if walletName == "" { - walletName = "skycoin_cli.wlt" - } - require.Equal(t, walletName, ret.WalletName) - require.NotEmpty(t, ret.WalletName) - - coin := os.Getenv("COIN") - if coin == "" { - coin = "skycoin" - } - require.Equal(t, coin, ret.Coin) - - require.Equal(t, rpcAddress(), ret.RPCAddress) - - require.Equal(t, useCSRF(t), ret.UseCSRF) -} - -func TestStableStatus(t *testing.T) { - if !doStable(t) { - return - } - - output, err := exec.Command(binaryPath, "status").CombinedOutput() - require.NoError(t, err) - - var ret cli.StatusResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) - require.NoError(t, err) - - // TimeSinceLastBlock is not stable - ret.TimeSinceLastBlock = "" - - goldenFile := "status.golden" - if useCSRF(t) { - goldenFile = "status-use-csrf.golden" - } - - var expect cli.StatusResult - loadGoldenFile(t, goldenFile, TestData{ret, &expect}) - require.Equal(t, expect, ret) -} - -func TestLiveStatus(t *testing.T) { - if !doLive(t) { - return - } - - output, err := exec.Command(binaryPath, "status").CombinedOutput() - require.NoError(t, err) - - var ret cli.StatusResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) - require.NoError(t, err) - require.True(t, ret.Running) - require.Equal(t, rpcAddress(), ret.RPCAddress) - require.Equal(t, useCSRF(t), ret.UseCSRF) -} - -func TestStableTransaction(t *testing.T) { - if !doStable(t) { - return - } - - tt := []struct { - name string - args []string - err error - errMsg string - goldenFile string - }{ - { - name: "invalid txid", - args: []string{"abcd"}, - err: errors.New("exit status 1"), - errMsg: "invalid txid\n", - goldenFile: "", - }, - { - name: "not exist", - args: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, - err: errors.New("exit status 1"), - errMsg: "transaction doesn't exist [code: -32600]\n", - goldenFile: "", - }, - { - name: "empty txid", - args: []string{""}, - err: errors.New("exit status 1"), - errMsg: "txid is empty\n", - goldenFile: "", - }, - { - name: "genesis transaction", - args: []string{"d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add"}, - err: nil, - errMsg: "", - goldenFile: "genesis-transaction-cli.golden", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - args := append([]string{"transaction"}, tc.args...) - o, err := exec.Command(binaryPath, args...).CombinedOutput() - if tc.err != nil { - testutil.RequireError(t, err, tc.err.Error()) - require.Equal(t, tc.errMsg, string(o)) - return - } - - require.NoError(t, err) - - // Decode the output into visor.TransactionJSON - var tx webrpc.TxnResult - err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) - require.NoError(t, err) - - var expect webrpc.TxnResult - loadGoldenFile(t, tc.goldenFile, TestData{tx, &expect}) - - require.Equal(t, expect, tx) - }) - } - - scanTransactions(t, true) -} - -func TestLiveTransaction(t *testing.T) { - if !doLive(t) { - return - } - - o, err := exec.Command(binaryPath, "transaction", "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add").CombinedOutput() - require.NoError(t, err) - var tx webrpc.TxnResult - err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) - require.NoError(t, err) - - var expect webrpc.TxnResult - - loadGoldenFile(t, "genesis-transaction.golden", TestData{tx, &expect}) - require.Equal(t, expect.Transaction.Transaction, tx.Transaction.Transaction) - - scanTransactions(t, *liveTxFull) - - // scan pending transactions - scanPendingTransactions(t) -} - -// cli doesn't have command to querying pending transactions yet. -func scanPendingTransactions(t *testing.T) { -} - -// scanTransactions scans transactions against blockchain. -// If fullTest is true, scan the whole blockchain, and test every transactions, -// otherwise just test random transactions. -func scanTransactions(t *testing.T, fullTest bool) { - // Gets blockchain height through "status" command - output, err := exec.Command(binaryPath, "status").CombinedOutput() - require.NoError(t, err) - var status struct { - webrpc.StatusResult - RPCAddress string `json:"webrpc_address"` - } - err = json.NewDecoder(bytes.NewReader(output)).Decode(&status) - require.NoError(t, err) - - txids := getTxids(t, status.BlockNum) - - l := len(txids) - if !fullTest && l > randomLiveTransactionNum { - txidMap := make(map[string]struct{}) - var ids []string - for len(txidMap) < randomLiveTransactionNum { - // get random txid - txid := txids[rand.Intn(l)] - if _, ok := txidMap[txid]; !ok { - ids = append(ids, txid) - txidMap[txid] = struct{}{} - } - } - - // reassign the txids - txids = ids - } - - checkTransactions(t, txids) -} - -func checkTransactions(t *testing.T, txids []string) { - // Start goroutines to check transactions - var wg sync.WaitGroup - txC := make(chan string, 500) - nReq := 4 - if useCSRF(t) { - nReq = 1 - } - for i := 0; i < nReq; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for { - select { - case txid, ok := <-txC: - if !ok { - return - } - - t.Run(fmt.Sprintf("%v", txid), func(t *testing.T) { - o, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() - require.NoError(t, err) - var txRlt webrpc.TxnResult - err = json.NewDecoder(bytes.NewReader(o)).Decode(&txRlt) - require.NoError(t, err) - require.Equal(t, txid, txRlt.Transaction.Transaction.Hash) - require.True(t, txRlt.Transaction.Status.Confirmed) - }) - } - } - }() - } - - for _, txid := range txids { - txC <- txid - } - close(txC) - - wg.Wait() -} - -func getTxids(t *testing.T, blockNum uint64) []string { - // p represents the number of blocks that each time we query, - // do not get all blocks in one query, which might run out of - // memory when blockchain becomes very huge. - p := 500 - n := int(blockNum / uint64(p)) - - // Collects all transactions' id - var txids []string - for i := 0; i < int(n); i++ { - txids = append(txids, getTxidsInBlocks(t, i*p+1, (i+1)*p)...) - } - - if (blockNum % uint64(p)) > 0 { - txids = append(txids, getTxidsInBlocks(t, n*p+1, int(blockNum)-1)...) - } - - return txids -} - -func getTxidsInBlocks(t *testing.T, start, end int) []string { - s := strconv.Itoa(start) - e := strconv.Itoa(end) - o, err := exec.Command(binaryPath, "blocks", s, e).CombinedOutput() - require.NoError(t, err) - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(o)).Decode(&blocks) - require.NoError(t, err) - require.Len(t, blocks.Blocks, end-start+1) - - var txids []string - for _, b := range blocks.Blocks { - for _, tx := range b.Body.Transactions { - txids = append(txids, tx.Hash) - } - } - return txids -} - -func TestStableBlocks(t *testing.T) { - if !doStable(t) { - return - } - - testKnownBlocks(t) - - // Tests blocks 180~181, should only return block 180. - output, err := exec.Command(binaryPath, "blocks", "180", "181").CombinedOutput() - require.NoError(t, err) - - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) - require.NoError(t, err) - - var expect visor.ReadableBlocks - loadGoldenFile(t, "blocks180.golden", TestData{blocks, &expect}) - require.Equal(t, expect, blocks) -} - -func TestLiveBlocks(t *testing.T) { - if !doLive(t) { - return - } - - testKnownBlocks(t) - - // These blocks were affected by the coinhour overflow issue, make sure that they can be queried - blockSeqs := []int{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} - - for _, seq := range blockSeqs { - output, err := exec.Command(binaryPath, "blocks", strconv.Itoa(seq)).CombinedOutput() - require.NoError(t, err) - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) - require.NoError(t, err) - } -} - -func testKnownBlocks(t *testing.T) { - tt := []struct { - name string - args []string - goldenFile string - }{ - { - "blocks 0", - []string{"blocks", "0"}, - "block0.golden", - }, - { - "blocks 0 5", - []string{"blocks", "0", "5"}, - "blocks0-5.golden", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - require.NoError(t, err) - - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) - require.NoError(t, err) - - var expect visor.ReadableBlocks - loadGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) - require.Equal(t, expect, blocks) - }) - } - - scanBlocks(t, "0", "180") -} - -func scanBlocks(t *testing.T, s, e string) { - outputs, err := exec.Command(binaryPath, "blocks", s, e).CombinedOutput() - require.NoError(t, err) - - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(outputs)).Decode(&blocks) - require.NoError(t, err) - - var preBlocks visor.ReadableBlock - preBlocks.Head.BlockHash = "0000000000000000000000000000000000000000000000000000000000000000" - for _, b := range blocks.Blocks { - require.Equal(t, b.Head.PreviousBlockHash, preBlocks.Head.BlockHash) - preBlocks = b - } -} - -func TestStableLastBlocks(t *testing.T) { - if !doStable(t) { - return - } - - tt := []struct { - name string - args []string - goldenFile string - errMsg []byte - }{ - { - name: "lastBlocks 0", - args: []string{"lastBlocks", "0"}, - goldenFile: "last-blocks0.golden", - }, - { - name: "lastBlocks 1", - args: []string{"lastBlocks", "1"}, - goldenFile: "last-blocks1.golden", - }, - { - name: "lastBlocks 2", - args: []string{"lastBlocks", "2"}, - goldenFile: "last-blocks2.golden", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - - if bytes.Contains(output, []byte("Error: ")) { - fmt.Println(string(output)) - require.Equal(t, string(tc.errMsg), string(output)) - return - } - - require.NoError(t, err) - - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) - require.NoError(t, err) - - var expect visor.ReadableBlocks - loadGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) - require.Equal(t, expect, blocks) - }) - } -} - -func TestLiveLastBlocks(t *testing.T) { - if !doLive(t) { - return - } - - tt := []struct { - name string - args []string - }{ - { - "lastBlocks 0", - []string{"lastBlocks", "0"}, - }, - { - "lastBlocks 1", - []string{"lastBlocks", "1"}, - }, - { - "lastBlocks 2", - []string{"lastBlocks", "2"}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() - require.NoError(t, err) - - var blocks visor.ReadableBlocks - err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) - require.NoError(t, err) - }) - } -} - -func TestStableWalletDir(t *testing.T) { - if !doStable(t) { - return - } - - walletPath, clean := createUnEncryptedWallet(t) - defer clean() - - dir := filepath.Dir(walletPath) - output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() - require.NoError(t, err) - require.Equal(t, dir, strings.TrimRight(string(output), "\n")) -} - -func TestLiveWalletDir(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletDir(t) - - walletDir := os.Getenv("WALLET_DIR") - output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() - require.NoError(t, err) - - require.Equal(t, walletDir, strings.Trim(string(output), "\n")) -} - -// TestLiveSend sends coin from specific wallet file, user should manually specify the -// wallet file by setting the enviroment variables: WALLET_DIR and WALLET_NAME. The WALLET_DIR -// points to the directory of the wallet, and WALLET_NAME represents the wallet file name. -// -// Note: -// 1. This test might modify the wallet file, in order to avoid losing coins, we don't send coins to -// addresses that are not belong to the wallet, when addresses in the wallet are not sufficient, we -// will automatically generate enough addresses as coin recipient. -// 2. The wallet must must have at least 2 coins and 16 coinhours. -func TestLiveSend(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. - w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 16) - - if w.IsEncrypted() { - t.Skip("CLI wallet integration tests do not support encrypted wallets yet") - return - } - - tt := []struct { - name string - args func() []string - errMsg []byte - checkTx func(t *testing.T, txid string) - }{ - { - // Send all coins to the first address to one output. - name: "send all coins to the first address", - args: func() []string { - coins, err := droplet.ToString(totalCoins) - require.NoError(t, err) - return []string{"send", w.Entries[0].Address.String(), coins} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms all coins are in the first address in one output - tx := getTransaction(t, txid) - require.Len(t, tx.Transaction.Transaction.Out, 1) - c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) - require.NoError(t, err) - require.Equal(t, totalCoins, c) - }, - }, - { - // Send 0.5 coin to the second address. - // Send 0.5 coin to the third address. - // After sending, the first address should have at least 1 coin left. - name: "send to multiple address with -m option", - args: func() []string { - addrCoins := []struct { - Addr string `json:"addr"` - Coins string `json:"coins"` - }{ - { - w.Entries[1].Address.String(), - "0.5", - }, - { - w.Entries[2].Address.String(), - "0.5", - }, - } - - v, err := json.Marshal(addrCoins) - require.NoError(t, err) - - return []string{"send", "-m", string(v)} - }, - checkTx: func(t *testing.T, txid string) { - tx := getTransaction(t, txid) - // Confirms the second address receives 0.5 coin and 1 coinhour in this transaction - checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 1) - // Confirms the third address receives 0.5 coin and 1 coinhour in this transaction - checkCoinsAndCoinhours(t, tx, w.Entries[2].Address.String(), 5e5, 1) - // Confirms the first address has at least 1 coin left. - coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) - require.True(t, coins >= 1e6) - }, - }, - { - // Send 0.001 coin from the third address to the second address. - // Set the second as change address, so the 0.499 change coin will also be sent to the second address. - // After sending, the second address should have 1 coin and 1 coin hour. - name: "send with -c(change address) -a(from address) options", - args: func() []string { - return []string{"send", "-c", w.Entries[1].Address.String(), - "-a", w.Entries[2].Address.String(), w.Entries[1].Address.String(), "0.001"} - }, - checkTx: func(t *testing.T, txid string) { - tx := getTransaction(t, txid) - // Confirms the second address receives 0.5 coin and 0 coinhour in this transaction - checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 0) - // Confirms the second address have 1 coin and 1 coin hour - coins, hours := getAddressBalance(t, w.Entries[1].Address.String()) - require.Equal(t, uint64(1e6), coins) - require.Equal(t, uint64(1), hours) - }, - }, - { - // Send 1 coin from second to the the third address, this will spend three outputs(0.2, 0.3. 0.5 coin), - // and burn out the remaining 1 coin hour. - name: "send to burn all coin hour", - args: func() []string { - return []string{"send", "-a", w.Entries[1].Address.String(), - w.Entries[2].Address.String(), "1"} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms that the third address has 1 coin and 0 coin hour - coins, hours := getAddressBalance(t, w.Entries[2].Address.String()) - require.Equal(t, uint64(1e6), coins) - require.Equal(t, uint64(0), hours) - }, - }, - { - // Send with 0 coin hour, this test should fail. - name: "send 0 coin hour", - args: func() []string { - return []string{"send", "-a", w.Entries[2].Address.String(), - w.Entries[1].Address.String(), "1"} - }, - errMsg: []byte("Error: Transaction has zero coinhour fee. See 'skycoin-cli send --help'"), - checkTx: func(t *testing.T, txid string) {}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() - if err != nil { - t.Fatalf("err: %v, output: %v", err, string(output)) - return - } - require.NoError(t, err) - output = bytes.TrimRight(output, "\n") - if bytes.Contains(output, []byte("Error:")) { - require.Equal(t, tc.errMsg, output) - return - } - - // output: "txid:$txid_string" - // split the output to get txid value - v := bytes.Split(output, []byte(":")) - require.Len(t, v, 2) - txid := string(v[1]) - fmt.Println("txid:", txid) - _, err = cipher.SHA256FromHex(txid) - require.NoError(t, err) - - // Wait untill transaction is confirmed. - tk := time.NewTicker(time.Second) - loop: - for { - select { - case <-time.After(30 * time.Second): - t.Fatal("Wait tx confirmation timeout") - case <-tk.C: - if isTxConfirmed(t, txid) { - break loop - } - } - } - - tc.checkTx(t, txid) - }) - } - - // Send with too small decimal value - // CLI send is a litte bit slow, almost 300ms each. so we only test 20 invalid decimal coin. - errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli send --help'") - for i := uint64(1); i < uint64(20); i++ { - v, err := droplet.ToString(i) - require.NoError(t, err) - name := fmt.Sprintf("send %v", v) - t.Run(name, func(t *testing.T) { - output, err := exec.Command(binaryPath, "send", w.Entries[0].Address.String(), v).CombinedOutput() - require.NoError(t, err) - output = bytes.Trim(output, "\n") - require.Equal(t, errMsg, output) - }) - } -} - -// TestLiveCreateAndBroadcastRawTransaction does almost the same procedure as TestLiveSend. -// Create raw transaction with command arguments the same as TestLiveSend, then broadcast the -// created raw transaction. After the transaction is confirmed, run the same transaction check -// function like in TestLiveSend. -func TestLiveCreateAndBroadcastRawTransaction(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. - w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) - - if w.IsEncrypted() { - t.Skip("CLI wallet integration tests do not support encrypted wallets yet") - return - } - - tt := []struct { - name string - args func() []string - errMsg []byte - checkTx func(t *testing.T, txid string) - }{ - { - // Send all coins to the first address to one output. - name: "send all coins to the first address", - args: func() []string { - coins, err := droplet.ToString(totalCoins) - require.NoError(t, err) - return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms all coins are in the first address in one output - tx := getTransaction(t, txid) - require.Len(t, tx.Transaction.Transaction.Out, 1) - c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) - require.NoError(t, err) - require.Equal(t, totalCoins, c) - }, - }, - { - // Send 0.5 coin to the second address. - // Send 0.5 coin to the third address. - // After sending, the first address should have at least 1 coin left. - name: "send to multiple address with -m option", - args: func() []string { - addrCoins := []struct { - Addr string `json:"addr"` - Coins string `json:"coins"` - }{ - { - w.Entries[1].Address.String(), - "0.5", - }, - { - w.Entries[2].Address.String(), - "0.5", - }, - } - - v, err := json.Marshal(addrCoins) - require.NoError(t, err) - - return []string{"createRawTransaction", "-m", string(v)} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms the first address has at least 1 coin left. - coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) - require.True(t, coins >= 1e6) - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - // Create raw transaction first - output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() - if err != nil { - t.Fatalf("err: %v, output: %v", err, string(output)) - return - } - require.NoError(t, err) - output = bytes.TrimRight(output, "\n") - if bytes.Contains(output, []byte("Error:")) { - require.Equal(t, tc.errMsg, output) - return - } - - // Broadcast transaction - output, err = exec.Command(binaryPath, "broadcastTransaction", string(output)).CombinedOutput() - require.NoError(t, err) - - txid := string(bytes.TrimRight(output, "\n")) - fmt.Println("txid:", txid) - _, err = cipher.SHA256FromHex(txid) - require.NoError(t, err) - - // Wait untill transaction is confirmed. - tk := time.NewTicker(time.Second) - loop: - for { - select { - case <-time.After(30 * time.Second): - t.Fatal("Wait tx confirmation timeout") - case <-tk.C: - if isTxConfirmed(t, txid) { - break loop - } - } - } - - tc.checkTx(t, txid) - }) - } - - // Send with too small decimal value - errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli createRawTransaction --help'") - for i := uint64(1); i < uint64(20); i++ { - v, err := droplet.ToString(i) - require.NoError(t, err) - name := fmt.Sprintf("send %v", v) - t.Run(name, func(t *testing.T) { - output, err := exec.Command(binaryPath, "createRawTransaction", w.Entries[0].Address.String(), v).CombinedOutput() - require.NoError(t, err) - output = bytes.Trim(output, "\n") - require.Equal(t, errMsg, output) - }) - } -} - -func getTransaction(t *testing.T, txid string) *webrpc.TxnResult { - output, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() - if err != nil { - fmt.Println(string(output)) - return &webrpc.TxnResult{} - } - require.NoError(t, err) - - var tx webrpc.TxnResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&tx) - require.NoError(t, err) - - return &tx -} - -func isTxConfirmed(t *testing.T, txid string) bool { - tx := getTransaction(t, txid) - require.NotNil(t, tx) - return tx.Transaction.Status.Confirmed -} - -// checkCoinhours checks if the address coinhours in transaction are correct -func checkCoinsAndCoinhours(t *testing.T, tx *webrpc.TxnResult, addr string, coins, coinhours uint64) { - addrCoinhoursMap := make(map[string][]visor.ReadableTransactionOutput) - for _, o := range tx.Transaction.Transaction.Out { - addrCoinhoursMap[o.Address] = append(addrCoinhoursMap[o.Address], o) - } - - os, ok := addrCoinhoursMap[addr] - if !ok { - t.Fatalf("transaction doesn't have receiver of address: %v", addr) - } - - var totalCoins, totalHours uint64 - for _, o := range os { - c, err := droplet.FromString(o.Coins) - if err != nil { - t.Fatalf("%v", err) - } - totalCoins += c - totalHours += o.Hours - } - - require.Equal(t, coins, totalCoins) - require.Equal(t, coinhours, totalHours) -} - -// prepareAndCheckWallet prepares wallet for live testing. -// Returns *wallet.Wallet, total coin, total hours. -// Confirms that the wallet meets the minimal requirements of coins and coinhours. -func prepareAndCheckWallet(t *testing.T, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64) { - walletDir, walletName := getWalletPathFromEnv(t) - walletPath := filepath.Join(walletDir, walletName) - // Checks if the wallet does exist - if _, err := os.Stat(walletPath); os.IsNotExist(err) { - t.Fatalf("Wallet file: %v does not exist", walletPath) - } - - // Loads the wallet - w, err := wallet.Load(walletPath) - if err != nil { - t.Fatalf("Load wallet failed: %v", err) - } - - if len(w.Entries) < 3 { - // Generates addresses - _, err = w.GenerateAddresses(uint64(3 - len(w.Entries))) - if err != nil { - t.Fatalf("Wallet generateAddress failed: %v", err) - } - } - - outputs := getWalletOutputs(t, walletPath) - // Confirms the wallet is not empty. - if len(outputs) == 0 { - t.Fatalf("Wallet %v has no coin", walletPath) - } - - var totalCoins uint64 - var totalCoinhours uint64 - for _, output := range outputs { - coins, err := droplet.FromString(output.Coins) - if err != nil { - t.Fatalf("%v", err) - } - - totalCoins += coins - totalCoinhours += output.CalculatedHours - } - - // Confirms the coins meet minimal coins requirement - if totalCoins < miniCoins { - t.Fatalf("Wallet must have at least %v coins", miniCoins) - } - - if totalCoinhours < miniCoinHours { - t.Fatalf("Wallet must have at least %v coinhours", miniCoinHours) - } - - if err := w.Save(walletDir); err != nil { - t.Fatalf("%v", err) - } - return w, totalCoins, totalCoinhours -} - -func getAddressBalance(t *testing.T, addr string) (uint64, uint64) { - output, err := exec.Command(binaryPath, "addressBalance", addr).CombinedOutput() - require.NoError(t, err) - - var addrBalance cli.BalanceResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) - require.NoError(t, err) - coins, err := droplet.FromString(addrBalance.Confirmed.Coins) - require.NoError(t, err) - - hours, err := strconv.ParseUint(addrBalance.Confirmed.Hours, 10, 64) - require.NoError(t, err) - return coins, hours -} - -func getWalletOutputs(t *testing.T, walletPath string) visor.ReadableOutputs { - output, err := exec.Command(binaryPath, "walletOutputs", walletPath).CombinedOutput() - require.NoError(t, err) - - var wltOutput webrpc.OutputsResult - err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) - require.NoError(t, err) - - return wltOutput.Outputs.HeadOutputs -} - -func TestStableWalletHistory(t *testing.T) { - if !doStable(t) { - return - } - - _, clean := createUnEncryptedWallet(t) - defer clean() - - output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() - require.NoError(t, err) - - var history []cli.AddrHistory - err = json.NewDecoder(bytes.NewReader(output)).Decode(&history) - require.NoError(t, err) - - var expect []cli.AddrHistory - loadGoldenFile(t, "wallet-history.golden", TestData{history, &expect}) - require.Equal(t, expect, history) -} - -func TestLiveWalletHistory(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() - require.NoError(t, err) - var his []cli.AddrHistory - err = json.NewDecoder(bytes.NewReader(output)).Decode(&his) - require.NoError(t, err) -} - -func TestStableCheckDB(t *testing.T) { - if !doStable(t) { - return - } - - tt := []struct { - name string - dbPath string - result []byte - errMsg []byte - }{ - { - name: "no signature", - dbPath: "../../../visor/testdata/data.db.nosig", - errMsg: []byte("checkdb failed: find no signature of block: seq=1000\n"), - }, - { - name: "invalid database", - dbPath: "../../../visor/testdata/data.db.garbage", - errMsg: []byte("open db failed: invalid database\n"), - }, - { - name: "valid database", - dbPath: "../../../gui/integration/test-fixtures/blockchain-180.db", - result: []byte("check db success\n"), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - output, err := exec.Command(binaryPath, "checkdb", tc.dbPath).CombinedOutput() - if err != nil { - fmt.Println(string(output)) - require.Equal(t, tc.errMsg, output) - return - } - require.NoError(t, err) - require.Equal(t, tc.result, output) - }) - } -} - -func TestVersion(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - // Gets version in json format. - output, err := exec.Command(binaryPath, "version", "-j").CombinedOutput() - require.NoError(t, err) - - var ver = struct { - Skycoin string `json:"skycoin"` - Cli string `json:"cli"` - RPC string `json:"rpc"` - Wallet string `json:"wallet"` - }{} - err = json.NewDecoder(bytes.NewReader(output)).Decode(&ver) - require.NoError(t, err) - require.True(t, ver.Skycoin != "") - require.True(t, ver.Cli != "") - require.True(t, ver.RPC != "") - require.True(t, ver.Wallet != "") - - // Gets version without json format. - output, err = exec.Command(binaryPath, "version").CombinedOutput() - require.NoError(t, err) - - // Confirms the result contains 4 version componments - output = bytes.TrimRight(output, "\n") - vers := bytes.Split(output, []byte("\n")) - require.Len(t, vers, 4) -} - -func TestStableGenerateWallet(t *testing.T) { - if !doStable(t) { - return - } - - tt := []struct { - name string - args []string - setup func(t *testing.T) func() - errMsg []byte - checkWallet func(t *testing.T, w *wallet.Wallet) - }{ - { - name: "generate wallet with -r option", - args: []string{"-r"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - - // Confirms the seed is a valid hex string - _, err := hex.DecodeString(w.Meta["seed"]) - require.NoError(t, err) - - // Confirms the label is empty - require.Empty(t, w.Meta["label"]) - }, - }, - { - name: "generate wallet with --rd option", - args: []string{"--rd"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - - // Confirms the seed is consisited of 12 words - seed := w.Meta["seed"] - words := strings.Split(seed, " ") - require.Len(t, words, 12) - - // Confirms the label is empty - require.Empty(t, w.Meta["label"]) - }, - }, - { - name: "generate wallet with -s option", - args: []string{"-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - // Confirms the label is empty - require.Empty(t, w.Meta["label"]) - - require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Meta["seed"]) - require.Equal(t, "2amA8sxKJhNRp3wfWrE5JfTEUjr9S3C2BaU", w.Entries[0].Address.String()) - require.Equal(t, "02b4a4b63f2f8ba56f9508712815eca3c088693333715eaf7a73275d8928e1be5a", w.Entries[0].Public.Hex()) - require.Equal(t, "f4a281d094a6e9e95a84c23701a7d01a0e413c838758e94ad86a10b9b83e0434", w.Entries[0].Secret.Hex()) - }, - }, - { - name: "generate wallet with -n option", - args: []string{"-n", "5"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - // Confirms the label is empty - require.Empty(t, w.Meta["label"]) - // Confirms wallet has 5 address entries - require.Len(t, w.Entries, 5) - }, - }, - { - name: "generate wallet with -f option", - args: []string{"-f", "integration-cli.wlt"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "integration-cli.wlt", w.Filename()) - // Confirms the label is empty - require.Empty(t, w.Meta["label"]) - }, - }, - { - name: "generate wallet with -l option", - args: []string{"-l", "integration-cli"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - // Confirms the default wallet name is skycoin_cli.wlt - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - label, ok := w.Meta["label"] - require.True(t, ok) - require.Equal(t, "integration-cli", label) - }, - }, - { - name: "generate wallet with duplicate wallet name", - args: []string{}, - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - return clean - }, - errMsg: []byte("integration-test.wlt already exist\n"), - }, - { - name: "encrypt=true", - args: []string{"-e", "-p", "pwd"}, - setup: createTempWalletDir, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - require.Equal(t, "skycoin_cli.wlt", w.Filename()) - // Confirms the wallet is encrypted - require.True(t, w.IsEncrypted()) - require.Empty(t, w.Meta["seed"]) - require.Empty(t, w.Meta["lastSeed"]) - - // Confirms the secrets in address entries are empty - for _, e := range w.Entries { - require.Equal(t, cipher.SecKey{}, e.Secret) - } - }, - }, - { - name: "encrypt=false password=pwd", - args: []string{"-p", "pwd"}, - setup: createTempWalletDir, - errMsg: []byte("password should not be set as we're not going to create a wallet with encryption\n"), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - clean := tc.setup(t) - defer clean() - - // Run command with arguments - args := append([]string{"generateWallet"}, tc.args...) - output, err := exec.Command(binaryPath, args...).CombinedOutput() - if err != nil { - require.EqualError(t, err, "exit status 1") - require.Equal(t, tc.errMsg, output) - return - } - - require.NoError(t, err) - var rw wallet.ReadableWallet - err = json.NewDecoder(bytes.NewReader(output)).Decode(&rw) - require.NoError(t, err) - - // Converts to wallet.Wallet - w, err := rw.ToWallet() - require.NoError(t, err) - - // Validate the wallet - err = w.Validate() - require.NoError(t, err) - - if !w.IsEncrypted() { - // Confirms all entries and lastSeed are derived from seed. - checkWalletEntriesAndLastSeed(t, w) - } - - // Checks the wallet with provided checking method. - tc.checkWallet(t, w) - }) - } -} - -// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied -// from the seed. -func checkWalletEntriesAndLastSeed(t *testing.T, w *wallet.Wallet) { - seed, ok := w.Meta["seed"] - require.True(t, ok) - newSeed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), len(w.Entries)) - require.Len(t, seckeys, len(w.Entries)) - for i, sk := range seckeys { - require.Equal(t, w.Entries[i].Secret, sk) - pk := cipher.PubKeyFromSecKey(sk) - require.Equal(t, w.Entries[i].Public, pk) - } - lastSeed, ok := w.Meta["lastSeed"] - require.True(t, ok) - require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) -} - -// TestLiveGUIInjectTransaction does almost the same procedure as TestCreateAndBroadcastRawTransaction. -// The only difference is we broadcast the raw transaction throught the gui /injectTransaction api. -func TestLiveGUIInjectTransaction(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(rpcAddress()) - // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. - w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) - - if w.IsEncrypted() { - t.Skip("CLI wallet integration tests do not support encrypted wallets yet") - return - } - - tt := []struct { - name string - args func() []string - errMsg []byte - checkTx func(t *testing.T, txid string) - }{ - { - // Send all coins to the first address to one output. - name: "send all coins to the first address", - args: func() []string { - coins, err := droplet.ToString(totalCoins) - require.NoError(t, err) - return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms all coins are in the first address in one output - tx := getTransaction(t, txid) - require.Len(t, tx.Transaction.Transaction.Out, 1) - c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) - require.NoError(t, err) - require.Equal(t, totalCoins, c) - }, - }, - { - // Send 0.5 coin to the second address. - // Send 0.5 coin to the third address. - // After sending, the first address should have at least 1 coin left. - name: "send to multiple address with -m option", - args: func() []string { - addrCoins := []struct { - Addr string `json:"addr"` - Coins string `json:"coins"` - }{ - { - w.Entries[1].Address.String(), - "0.5", - }, - { - w.Entries[2].Address.String(), - "0.5", - }, - } - - v, err := json.Marshal(addrCoins) - require.NoError(t, err) - - return []string{"createRawTransaction", "-m", string(v)} - }, - checkTx: func(t *testing.T, txid string) { - // Confirms the first address has at least 1 coin left. - coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) - require.True(t, coins >= 1e6) - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - // Create raw transaction first - output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() - if err != nil { - t.Fatalf("err: %v, output: %v", err, string(output)) - return - } - require.NoError(t, err) - output = bytes.TrimRight(output, "\n") - if bytes.Contains(output, []byte("Error:")) { - require.Equal(t, tc.errMsg, output) - return - } - - // Broadcast raw transaction with gui /injectTransaction - txid, err := c.InjectTransaction(string(output)) - require.NoError(t, err) - - txid = strings.TrimRight(txid, "\n") - fmt.Println("txid:", txid) - _, err = cipher.SHA256FromHex(txid) - require.NoError(t, err) - - // Wait untill transaction is confirmed. - tk := time.NewTicker(time.Second) - loop: - for { - select { - case <-time.After(30 * time.Second): - t.Fatal("Wait tx confirmation timeout") - case <-tk.C: - if isTxConfirmed(t, txid) { - break loop - } - } - } - - tc.checkTx(t, txid) - }) - } -} - -func TestEncryptWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - args []string - setup func(t *testing.T) func() - errMsg []byte - errWithHelp bool - checkWallet func(t *testing.T, w *wallet.Wallet) - }{ - { - name: "wallet is not encrypted", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - return clean - }, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - require.True(t, w.IsEncrypted()) - require.Empty(t, w.Meta["seed"]) - require.Empty(t, w.Meta["lastSeed"]) - - // Confirms that secrets in address entries are empty - for _, e := range w.Entries { - require.Equal(t, cipher.SecKey{}, e.Secret) - } - }, - }, - { - name: "wallet is encrypted", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - errMsg: []byte("wallet is encrypted\n"), - }, - { - name: "wallet doesn't exist", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - os.Setenv("WALLET_NAME", "not-exist.wlt") - return clean - }, - errWithHelp: true, - errMsg: []byte("not-exist.wlt doesn't exist."), - }, - } - - for _, tc := range tt { - for _, ct := range cryptoTypes { - name := fmt.Sprintf("name=%v crypto type=%v", tc.name, ct) - t.Run(name, func(t *testing.T) { - clean := tc.setup(t) - defer clean() - args := append([]string{"encryptWallet", "-x", string(ct)}, tc.args[:]...) - output, err := exec.Command(binaryPath, args...).CombinedOutput() - if err != nil { - require.EqualError(t, err, "exit status 1") - require.Equal(t, tc.errMsg, output) - return - } - - if tc.errWithHelp { - require.True(t, bytes.Contains(output, tc.errMsg), string(output)) - return - } - - var rlt wallet.ReadableWallet - err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) - require.NoError(t, err) - w, err := rlt.ToWallet() - require.NoError(t, err) - tc.checkWallet(t, w) - }) - } - } -} - -func TestDecryptWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - args []string - setup func(t *testing.T) func() - errMsg []byte - errWithHelp bool - checkWallet func(t *testing.T, w *wallet.Wallet) - }{ - { - name: "wallet is encrypted", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - checkWallet: func(t *testing.T, w *wallet.Wallet) { - require.False(t, w.IsEncrypted()) - require.Empty(t, w.Meta["cryptoType"]) - require.Empty(t, w.Meta["secrets"]) - require.NotEmpty(t, w.Meta["seed"]) - require.NotEmpty(t, w.Meta["lastSeed"]) - - for _, e := range w.Entries { - require.NotEqual(t, cipher.SecKey{}, e.Secret) - } - }, - }, - { - name: "wallet is not encrypted", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - return clean - }, - errMsg: []byte("wallet is not encrypted\n"), - }, - { - name: "invalid password", - args: []string{"-p", "wrong password"}, - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - errMsg: []byte("invalid password\n"), - }, - { - name: "wallet doesn't exist", - args: []string{"-p", "pwd"}, - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - os.Setenv("WALLET_NAME", "not-exist.wlt") - return clean - }, - errWithHelp: true, - errMsg: []byte("not-exist.wlt doesn't exist."), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - clean := tc.setup(t) - defer clean() - args := append([]string{"decryptWallet"}, tc.args...) - output, err := exec.Command(binaryPath, args...).CombinedOutput() - if err != nil { - require.EqualError(t, err, "exit status 1") - require.Equal(t, tc.errMsg, output) - return - } - - if tc.errWithHelp { - require.True(t, bytes.Contains(output, tc.errMsg), string(output)) - return - } - - var rlt wallet.ReadableWallet - err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) - require.NoError(t, err) - - w, err := rlt.ToWallet() - require.NoError(t, err) - tc.checkWallet(t, w) - }) - } -} - -func TestShowSeed(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - tt := []struct { - name string - args []string - setup func(t *testing.T) func() - errWithHelp bool - errMsg []byte - expectOutput []byte - }{ - { - name: "unencrypted wallet", - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - return clean - }, - expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), - }, - { - name: "unencrypted wallet with -j option", - args: []string{"-j"}, - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - return clean - }, - expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), - }, - { - name: "encrypted wallet", - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - args: []string{"-p", "pwd"}, - expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), - }, - { - name: "encrypted wallet with -j option", - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - args: []string{"-p", "pwd", "-j"}, - expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), - }, - { - name: "encrypted wallet with invalid password", - setup: func(t *testing.T) func() { - _, clean := createEncryptedWallet(t) - return clean - }, - args: []string{"-p", "wrong password"}, - expectOutput: []byte("invalid password"), - }, - { - name: "wallet doesn't exist", - setup: func(t *testing.T) func() { - _, clean := createUnEncryptedWallet(t) - os.Setenv("WALLET_NAME", "not-exist.wlt") - return clean - }, - errWithHelp: true, - expectOutput: []byte("not-exist.wlt doesn't exist."), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - clean := tc.setup(t) - defer clean() - args := append([]string{"showSeed"}, tc.args...) - output, err := exec.Command(binaryPath, args...).CombinedOutput() - if err != nil { - require.EqualError(t, err, "exit status 1") - return - } - - if tc.errWithHelp { - require.True(t, bytes.Contains(output, tc.errMsg), string(output)) - return - } - require.Equal(t, tc.expectOutput, output) - }) - } -} diff --git a/src/api/cli/integration/test-fixtures/genesis-transaction-cli.golden b/src/api/cli/integration/test-fixtures/genesis-transaction-cli.golden deleted file mode 100755 index 6281f68..0000000 --- a/src/api/cli/integration/test-fixtures/genesis-transaction-cli.golden +++ /dev/null @@ -1,29 +0,0 @@ -{ - "transaction": { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 181, - "block_seq": 0, - "unknown": false - }, - "time": 1426562704, - "txn": { - "length": 0, - "type": 0, - "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": 1426562704, - "sigs": [], - "inputs": [], - "outputs": [ - { - "uxid": "54c5dd9aebbe4656eb1adc658fdd4ff63a073aae473cc99b20c0ef5f0a21f08e", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ] - } - } -} diff --git a/src/api/cli/integration/test-fixtures/genesis-transaction.golden b/src/api/cli/integration/test-fixtures/genesis-transaction.golden deleted file mode 100755 index 6281f68..0000000 --- a/src/api/cli/integration/test-fixtures/genesis-transaction.golden +++ /dev/null @@ -1,29 +0,0 @@ -{ - "transaction": { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 181, - "block_seq": 0, - "unknown": false - }, - "time": 1426562704, - "txn": { - "length": 0, - "type": 0, - "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": 1426562704, - "sigs": [], - "inputs": [], - "outputs": [ - { - "uxid": "54c5dd9aebbe4656eb1adc658fdd4ff63a073aae473cc99b20c0ef5f0a21f08e", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ] - } - } -} diff --git a/src/api/cli/integration/test-fixtures/status-use-csrf.golden b/src/api/cli/integration/test-fixtures/status-use-csrf.golden deleted file mode 100755 index c85bff0..0000000 --- a/src/api/cli/integration/test-fixtures/status-use-csrf.golden +++ /dev/null @@ -1,8 +0,0 @@ -{ - "running": true, - "num_of_blocks": 181, - "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", - "time_since_last_block": "", - "webrpc_address": "http://127.0.0.1:46420", - "use_csrf": true -} diff --git a/src/api/cli/integration/test-fixtures/status.golden b/src/api/cli/integration/test-fixtures/status.golden deleted file mode 100755 index b7e775a..0000000 --- a/src/api/cli/integration/test-fixtures/status.golden +++ /dev/null @@ -1,8 +0,0 @@ -{ - "running": true, - "num_of_blocks": 181, - "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", - "time_since_last_block": "", - "webrpc_address": "http://127.0.0.1:46420", - "use_csrf": false -} diff --git a/src/api/cli/show_seed.go b/src/api/cli/show_seed.go deleted file mode 100755 index b0de516..0000000 --- a/src/api/cli/show_seed.go +++ /dev/null @@ -1,110 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/skycoin/skycoin/src/wallet" - gcli "github.com/urfave/cli" -) - -func showSeedCmd(cfg Config) gcli.Command { - name := "showSeed" - return gcli.Command{ - Name: name, - Usage: "Show wallet seed", - Description: fmt.Sprintf(` - The default wallet (%s) will be - used if no wallet was specified. - - Use caution when using the "-p" command. If you have command history enabled - your wallet encryption password can be recovered from the history log. If you - do not include the "-p" option you will be prompted to enter your password - after you enter your command.`, cfg.FullWalletPath()), - Flags: []gcli.Flag{ - gcli.StringFlag{ - Name: "p", - Usage: "[password] Wallet password, if encrypted", - }, - gcli.BoolFlag{ - Name: "j,json", - Usage: "Returns the results in JSON format", - }, - }, - OnUsageError: onCommandUsageError(name), - Action: func(c *gcli.Context) error { - cfg := ConfigFromContext(c) - - w, err := resolveWalletPath(cfg, "") - if err != nil { - return err - } - - pr := NewPasswordReader([]byte(c.String("p"))) - seed, err := getSeed(w, pr) - switch err.(type) { - case nil: - case WalletLoadError: - errorWithHelp(c, err) - return nil - default: - return err - } - - if c.Bool("j") { - v := struct { - Seed string `json:"seed"` - }{ - Seed: seed, - } - - printJSON(v) - return nil - } - - fmt.Println(seed) - return nil - }, - } -} - -func getSeed(walletFile string, pr PasswordReader) (string, error) { - wlt, err := wallet.Load(walletFile) - if err != nil { - return "", WalletLoadError{err} - } - - switch pr.(type) { - case nil: - if wlt.IsEncrypted() { - return "", wallet.ErrWalletEncrypted - } - case PasswordFromBytes: - p, err := pr.Password() - if err != nil { - return "", err - } - - if !wlt.IsEncrypted() && len(p) != 0 { - return "", wallet.ErrWalletNotEncrypted - } - } - - if !wlt.IsEncrypted() { - return wlt.Meta["seed"], nil - } - - password, err := pr.Password() - if err != nil { - return "", err - } - - var seed string - if err := wlt.GuardView(password, func(w *wallet.Wallet) error { - seed = w.Meta["seed"] - return nil - }); err != nil { - return "", err - } - - return seed, nil -} diff --git a/src/api/client.go b/src/api/client.go new file mode 100755 index 0000000..fc196fb --- /dev/null +++ b/src/api/client.go @@ -0,0 +1,956 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second +) + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +func (e ClientError) Error() string { + return e.Message +} + +// ReceivedHTTPResponse parsed a HTTPResponse received by the Client, for the V2 API +type ReceivedHTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data json.RawMessage `json:"data"` +} + +// Client provides an interface to a remote node's HTTP API +type Client struct { + HTTPClient *http.Client + Addr string +} + +// NewClient creates a Client +func NewClient(addr string) *Client { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + } +} + +// Get makes a GET request to an endpoint and unmarshals the response to obj. +// If the response is not 200 OK, returns an error +func (c *Client) Get(endpoint string, obj interface{}) error { + resp, err := c.get(endpoint) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + if obj == nil { + return nil + } + return json.NewDecoder(resp.Body).Decode(obj) +} + +// get makes a GET request to an endpoint. Caller must close response body. +func (c *Client) get(endpoint string) (*http.Response, error) { + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return nil, err + } + + return c.HTTPClient.Do(req) +} + +// PostForm makes a POST request to an endpoint with body of "application/x-www-form-urlencoded" formated data. +func (c *Client) PostForm(endpoint string, body io.Reader, obj interface{}) error { + return c.post(endpoint, "application/x-www-form-urlencoded", body, obj) +} + +// PostJSON makes a POST request to an endpoint with body of json data. +func (c *Client) PostJSON(endpoint string, reqObj, respObj interface{}) error { + body, err := json.Marshal(reqObj) + if err != nil { + return err + } + + return c.post(endpoint, "application/json", bytes.NewReader(body), respObj) +} + +// post makes a POST request to an endpoint. +func (c *Client) post(endpoint string, contentType string, body io.Reader, obj interface{}) error { + csrf, err := c.CSRF() + if err != nil { + return err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, body) + if err != nil { + return err + } + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", contentType) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + if obj == nil { + return nil + } + + decoder := json.NewDecoder(resp.Body) + decoder.DisallowUnknownFields() + return decoder.Decode(obj) +} + +// PostJSONV2 makes a POST request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) PostJSONV2(endpoint string, reqObj, respObj interface{}) (bool, error) { + body, err := json.Marshal(reqObj) + if err != nil { + return false, err + } + + csrf, err := c.CSRF() + if err != nil { + return false, err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewReader(body)) + if err != nil { + return false, err + } + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return false, err + } + + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, err + } + + decoder := json.NewDecoder(bytes.NewReader(respBody)) + decoder.DisallowUnknownFields() + + var wrapObj ReceivedHTTPResponse + if err := decoder.Decode(&wrapObj); err != nil { + // In some cases, the server can send an error response in a non-JSON format, + // such as a 404 when the endpoint is not registered, or if a 500 error + // occurs in the go HTTP stack, outside of the application's control. + // If this happens, treat the entire response body as the error message. + if resp.StatusCode != http.StatusOK { + return false, ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + return false, err + } + + var rspErr error + if resp.StatusCode != http.StatusOK { + rspErr = ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: wrapObj.Error.Message, + } + } + + if wrapObj.Data == nil { + return false, rspErr + } + + decoder = json.NewDecoder(bytes.NewReader(wrapObj.Data)) + decoder.DisallowUnknownFields() + + if err := decoder.Decode(respObj); err != nil { + return false, err + } + + return true, rspErr +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + resp, err := c.get("/api/v1/csrf") + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + var m map[string]string + if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// Version makes a request to GET /api/v1/version +func (c *Client) Version() (*visor.BuildInfo, error) { + var bi visor.BuildInfo + if err := c.Get("/api/v1/version", &bi); err != nil { + return nil, err + } + return &bi, nil +} + +// Outputs makes a request to GET /api/v1/outputs +func (c *Client) Outputs() (*visor.ReadableOutputSet, error) { + var o visor.ReadableOutputSet + if err := c.Get("/api/v1/outputs", &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForAddresses makes a request to GET /api/v1/outputs?addrs=xxx +func (c *Client) OutputsForAddresses(addrs []string) (*visor.ReadableOutputSet, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/outputs?" + v.Encode() + + var o visor.ReadableOutputSet + if err := c.Get(endpoint, &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForHashes makes a request to GET /api/v1/outputs?hashes=zzz +func (c *Client) OutputsForHashes(hashes []string) (*visor.ReadableOutputSet, error) { + v := url.Values{} + v.Add("hashes", strings.Join(hashes, ",")) + endpoint := "/api/v1/outputs?" + v.Encode() + + var o visor.ReadableOutputSet + if err := c.Get(endpoint, &o); err != nil { + return nil, err + } + return &o, nil +} + +// CoinSupply makes a request to GET /api/v1/coinSupply +func (c *Client) CoinSupply() (*CoinSupply, error) { + var cs CoinSupply + if err := c.Get("/api/v1/coinSupply", &cs); err != nil { + return nil, err + } + return &cs, nil +} + +// BlockByHash makes a request to GET /api/v1/block?hash=xxx +func (c *Client) BlockByHash(hash string) (*visor.ReadableBlock, error) { + v := url.Values{} + v.Add("hash", hash) + endpoint := "/api/v1/block?" + v.Encode() + + var b visor.ReadableBlock + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeq makes a request to GET /api/v1/block?seq=xxx +func (c *Client) BlockBySeq(seq uint64) (*visor.ReadableBlock, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + endpoint := "/api/v1/block?" + v.Encode() + + var b visor.ReadableBlock + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Blocks makes a request to GET /api/v1/blocks +func (c *Client) Blocks(start, end int) (*visor.ReadableBlocks, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + endpoint := "/api/v1/blocks?" + v.Encode() + + var b visor.ReadableBlocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocks makes a request to GET /api/v1/last_blocks +func (c *Client) LastBlocks(n int) (*visor.ReadableBlocks, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b visor.ReadableBlocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainMetadata makes a request to GET /api/v1/blockchain/metadata +func (c *Client) BlockchainMetadata() (*visor.BlockchainMetadata, error) { + var b visor.BlockchainMetadata + if err := c.Get("/api/v1/blockchain/metadata", &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainProgress makes a request to GET /api/v1/blockchain/progress +func (c *Client) BlockchainProgress() (*daemon.BlockchainProgress, error) { + var b daemon.BlockchainProgress + if err := c.Get("/api/v1/blockchain/progress", &b); err != nil { + return nil, err + } + return &b, nil +} + +// Balance makes a request to GET /api/v1/balance?addrs=xxx +func (c *Client) Balance(addrs []string) (*wallet.BalancePair, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/balance?" + v.Encode() + + var b wallet.BalancePair + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// UxOut makes a request to GET /api/v1/uxout?uxid=xxx +func (c *Client) UxOut(uxID string) (*historydb.UxOutJSON, error) { + v := url.Values{} + v.Add("uxid", uxID) + endpoint := "/api/v1/uxout?" + v.Encode() + + var b historydb.UxOutJSON + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// AddressUxOuts makes a request to GET /api/v1/address_uxouts +func (c *Client) AddressUxOuts(addr string) ([]*historydb.UxOutJSON, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/address_uxouts?" + v.Encode() + + var b []*historydb.UxOutJSON + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// Wallet makes a request to GET /api/v1/wallet +func (c *Client) Wallet(id string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet?" + v.Encode() + + var wr WalletResponse + if err := c.Get(endpoint, &wr); err != nil { + return nil, err + } + + return &wr, nil +} + +// Wallets makes a request to GET /api/v1/wallets +func (c *Client) Wallets() ([]*WalletResponse, error) { + var wrs []*WalletResponse + if err := c.Get("/api/v1/wallets", &wrs); err != nil { + return nil, err + } + + return wrs, nil +} + +// CreateUnencryptedWallet makes a request to POST /api/v1/wallet/create and creates +// a wallet without encryption. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateUnencryptedWallet(seed, label string, scanN int) (*WalletResponse, error) { + v := url.Values{} + v.Add("seed", seed) + v.Add("label", label) + v.Add("encrypt", "false") + + if scanN > 0 { + v.Add("scan", fmt.Sprint(scanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// CreateEncryptedWallet makes a request to POST /api/v1/wallet/create and try to create +// a wallet with encryption. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateEncryptedWallet(seed, label, password string, scanN int) (*WalletResponse, error) { + v := url.Values{} + v.Add("seed", seed) + v.Add("label", label) + v.Add("encrypt", "true") + v.Add("password", password) + + if scanN > 0 { + v.Add("scan", fmt.Sprint(scanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewWalletAddress makes a request to POST /api/v1/wallet/newAddress +// if n is <= 0, defaults to 1 +func (c *Client) NewWalletAddress(id string, n int, password string) ([]string, error) { + v := url.Values{} + v.Add("id", id) + if n > 0 { + v.Add("num", fmt.Sprint(n)) + } + + v.Add("password", password) + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// WalletBalance makes a request to GET /api/v1/wallet/balance +func (c *Client) WalletBalance(id string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/balance?" + v.Encode() + + var b BalanceResponse + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Spend makes a request to POST /api/v1/wallet/spend +func (c *Client) Spend(id, dst string, coins uint64, password string) (*SpendResult, error) { + v := url.Values{} + v.Add("id", id) + v.Add("dst", dst) + v.Add("coins", fmt.Sprint(coins)) + v.Add("password", password) + + var r SpendResult + endpoint := "/api/v1/wallet/spend" + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + + return &r, nil +} + +// CreateTransactionRequest is sent to /wallet/transaction +type CreateTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection HoursSelection `json:"hours_selection"` + Wallet CreateTransactionRequestWallet `json:"wallet"` + ChangeAddress *string `json:"change_address,omitempty"` + To []Receiver `json:"to"` +} + +// CreateTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet +type CreateTransactionRequestWallet struct { + ID string `json:"id"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + Password string `json:"password"` +} + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor string `json:"share_factor,omitempty"` +} + +// Receiver specifies a spend destination +type Receiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +// CreateTransaction makes a request to POST /api/v1/wallet/transaction +func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v1/wallet/transaction" + if err := c.PostJSON(endpoint, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + +// WalletTransactions makes a request to GET /api/v1/wallet/transactions +func (c *Client) WalletTransactions(id string) (*UnconfirmedTxnsResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// UpdateWallet makes a request to POST /api/v1/wallet/update +func (c *Client) UpdateWallet(id, label string) error { + v := url.Values{} + v.Add("id", id) + v.Add("label", label) + + return c.PostForm("/api/v1/wallet/update", strings.NewReader(v.Encode()), nil) +} + +// WalletFolderName makes a request to GET /api/v1/wallets/folderName +func (c *Client) WalletFolderName() (*WalletFolder, error) { + var w WalletFolder + if err := c.Get("/api/v1/wallets/folderName", &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewSeed makes a request to GET /api/v1/wallet/newSeed +// entropy must be 128 or 256 +func (c *Client) NewSeed(entropy int) (string, error) { + v := url.Values{} + v.Add("entropy", fmt.Sprint(entropy)) + endpoint := "/api/v1/wallet/newSeed?" + v.Encode() + + var r struct { + Seed string `json:"seed"` + } + if err := c.Get(endpoint, &r); err != nil { + return "", err + } + return r.Seed, nil +} + +// GetWalletSeed makes a request to POST /api/v1/wallet/seed +func (c *Client) GetWalletSeed(id string, password string) (string, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + + var r struct { + Seed string `json:"seed"` + } + if err := c.PostForm("/api/v1/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { + return "", err + } + + return r.Seed, nil +} + +// NetworkConnection makes a request to GET /api/v1/network/connection +func (c *Client) NetworkConnection(addr string) (*daemon.Connection, error) { + v := url.Values{} + v.Add("addr", addr) + endpoint := "/api/v1/network/connection?" + v.Encode() + + var dc daemon.Connection + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkConnections makes a request to GET /api/v1/network/connections +func (c *Client) NetworkConnections() (*Connections, error) { + var dc Connections + if err := c.Get("/api/v1/network/connections", &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkDefaultConnections makes a request to GET /api/v1/network/defaultConnections +func (c *Client) NetworkDefaultConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/defaultConnections", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkTrustedConnections makes a request to GET /api/v1/network/connections/trust +func (c *Client) NetworkTrustedConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/trust", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkExchangeableConnections makes a request to GET /api/v1/network/connections/exchange +func (c *Client) NetworkExchangeableConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/exchange", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// PendingTransactions makes a request to GET /api/v1/pendingTxs +func (c *Client) PendingTransactions() ([]*visor.ReadableUnconfirmedTxn, error) { + var v []*visor.ReadableUnconfirmedTxn + if err := c.Get("/api/v1/pendingTxs", &v); err != nil { + return nil, err + } + return v, nil +} + +// Transaction makes a request to GET /api/v1/transaction +func (c *Client) Transaction(txid string) (*daemon.TransactionResult, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/transaction?" + v.Encode() + + var r daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// Transactions makes a request to GET /api/v1/transactions +func (c *Client) Transactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// ConfirmedTransactions makes a request to GET /api/v1/transactions?confirmed=true +func (c *Client) ConfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// UnconfirmedTransactions makes a request to GET /api/v1/transactions?confirmed=false +func (c *Client) UnconfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// InjectTransaction makes a request to POST /api/v1/injectTransaction +func (c *Client) InjectTransaction(rawTx string) (string, error) { + v := struct { + Rawtx string `json:"rawtx"` + }{ + Rawtx: rawTx, + } + + var txid string + if err := c.PostJSON("/api/v1/injectTransaction", v, &txid); err != nil { + return "", err + } + return txid, nil +} + +// ResendUnconfirmedTransactions makes a request to GET /api/v1/resendUnconfirmedTxns +func (c *Client) ResendUnconfirmedTransactions() (*daemon.ResendResult, error) { + var r daemon.ResendResult + if err := c.Get("/api/v1/resendUnconfirmedTxns", &r); err != nil { + return nil, err + } + return &r, nil +} + +// RawTransaction makes a request to GET /api/v1/rawtx +func (c *Client) RawTransaction(txid string) (string, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/rawtx?" + v.Encode() + + var rawTx string + if err := c.Get(endpoint, &rawTx); err != nil { + return "", err + } + return rawTx, nil +} + +// VerifyTransaction makes a request to POST /api/v2/transaction/verify. +func (c *Client) VerifyTransaction(encodedTxn string) (*VerifyTxnResponse, error) { + req := VerifyTxnRequest{ + EncodedTransaction: encodedTxn, + } + + var rsp VerifyTxnResponse + ok, err := c.PostJSONV2("/api/v2/transaction/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// VerifyAddress makes a request to POST /api/v2/address/verify +// The API may respond with an error but include data useful for processing, +// so both return values may be non-nil. +func (c *Client) VerifyAddress(addr string) (*VerifyAddressResponse, error) { + req := VerifyAddressRequest{ + Address: addr, + } + + var rsp VerifyAddressResponse + ok, err := c.PostJSONV2("/api/v2/address/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// AddressTransactions makes a request to GET /api/v1/explorer/address +func (c *Client) AddressTransactions(addr string) ([]daemon.ReadableTransaction, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/explorer/address?" + v.Encode() + + var b []daemon.ReadableTransaction + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// RichlistParams are arguments to the /richlist endpoint +type RichlistParams struct { + N int + IncludeDistribution bool +} + +// Richlist makes a request to GET /api/v1/richlist +func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { + endpoint := "/api/v1/richlist" + + if params != nil { + v := url.Values{} + v.Add("n", fmt.Sprint(params.N)) + v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) + endpoint = "/api/v1/richlist?" + v.Encode() + } + + var r Richlist + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// AddressCount makes a request to GET /api/v1/addresscount +func (c *Client) AddressCount() (uint64, error) { + var r struct { + Count uint64 `json:"count"` + } + if err := c.Get("/api/v1/addresscount", &r); err != nil { + return 0, err + } + return r.Count, nil + +} + +// UnloadWallet makes a request to POST /api/v1/wallet/unload +func (c *Client) UnloadWallet(id string) error { + v := url.Values{} + v.Add("id", id) + return c.PostForm("/api/v1/wallet/unload", strings.NewReader(v.Encode()), nil) +} + +// Health makes a request to GET /api/v1/health +func (c *Client) Health() (*HealthResponse, error) { + var r HealthResponse + if err := c.Get("/api/v1/health", &r); err != nil { + return nil, err + } + + return &r, nil +} + +// EncryptWallet makes a request to POST /api/v1/wallet/encrypt to encrypt a specific wallet with the given password +func (c *Client) EncryptWallet(id string, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// DecryptWallet makes a request to POST /api/v1/wallet/decrypt to decrypt a wallet +func (c *Client) DecryptWallet(id string, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} diff --git a/src/api/csrf.go b/src/api/csrf.go new file mode 100755 index 0000000..e0ee303 --- /dev/null +++ b/src/api/csrf.go @@ -0,0 +1,177 @@ +package api + +import ( + "crypto/subtle" + "encoding/base64" + "errors" + "net/http" + "net/url" + "sync" + "time" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +const ( + // CSRFHeaderName is the name of the CSRF header + CSRFHeaderName = "X-CSRF-Token" + + // CSRFMaxAge is the lifetime of a CSRF token in seconds + CSRFMaxAge = time.Second * 30 + + csrfTokenLength = 64 +) + +// CSRFToken csrf token +type CSRFToken struct { + Value []byte + ExpiresAt time.Time +} + +// newCSRFToken generates a new CSRF Token +func newCSRFToken() CSRFToken { + return CSRFToken{ + Value: cipher.RandByte(csrfTokenLength), + ExpiresAt: time.Now().Add(CSRFMaxAge), + } +} + +// String returns the token in base64 URL-safe encoded format +func (c *CSRFToken) String() string { + return base64.RawURLEncoding.EncodeToString(c.Value) +} + +// CSRFStore encapsulates a single CSRFToken +type CSRFStore struct { + token *CSRFToken + Enabled bool + sync.RWMutex +} + +// getTokenValue returns a url safe base64 encoded token +func (c *CSRFStore) getTokenValue() string { + c.RLock() + defer c.RUnlock() + return c.token.String() +} + +// setToken sets a new CSRF token +// if the value is changing the expire time should also change +// so there is no explicit method to just set the value of the token +func (c *CSRFStore) setToken(token CSRFToken) { + c.Lock() + defer c.Unlock() + c.token = &token +} + +// expired checks if token expiry time is greater than current time +func (c *CSRFStore) expired() bool { + return c.token == nil || time.Now().After(c.token.ExpiresAt) +} + +// verifyToken checks that the given token is same as the internal token +func (c *CSRFStore) verifyToken(headerToken string) error { + c.RLock() + defer c.RUnlock() + + // check if token is initialized + if c.token == nil || len(c.token.Value) == 0 { + return errors.New("token not initialized") + } + + a, err := base64.RawURLEncoding.DecodeString(headerToken) + if err != nil { + return err + } + + // check if token values are same, using a constant time comparison + if subtle.ConstantTimeCompare(a, c.token.Value) != 1 { + return errors.New("invalid token") + } + + // make sure token is still valid + if c.expired() { + return errors.New("token has expired") + } + + return nil +} + +// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. +// URI: /api/v1/csrf +// Method: GET +// Response: +// csrf_token: CSRF token to use in POST requests +func getCSRFToken(store *CSRFStore) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if !store.Enabled { + logger.Warning("CSRF check disabled") + wh.Error404(w, "") + return + } + + // generate a new token + store.setToken(newCSRFToken()) + + wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": store.getTokenValue()}) + } +} + +// CSRFCheck verifies X-CSRF-Token header value +func CSRFCheck(store *CSRFStore, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if store.Enabled { + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodDelete: + token := r.Header.Get(CSRFHeaderName) + if err := store.verifyToken(token); err != nil { + logger.Errorf("CSRF token invalid: %v", err) + wh.Error403(w, "invalid CSRF token") + return + } + } + } + + handler.ServeHTTP(w, r) + }) +} + +// OriginRefererCheck checks the Origin header if present, falling back on Referer. +// The Origin or Referer hostname must match the configured host. +// If neither are present, the request is allowed. All major browsers will set +// at least one of these values. If neither are set, assume it is a request +// from curl/wget. +func OriginRefererCheck(host string, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + origin := r.Header.Get("Origin") + referer := r.Header.Get("Referer") + + toCheck := origin + if toCheck == "" { + toCheck = referer + } + + if toCheck != "" { + u, err := url.Parse(toCheck) + if err != nil { + logger.Critical().Errorf("Invalid URL in Origin or Referer header: %s %v", toCheck, err) + wh.Error403(w, "") + return + } + + if u.Host != host { + logger.Critical().Errorf("Origin or Referer header value %s does not match host", toCheck) + wh.Error403(w, "") + return + } + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/src/api/csrf_test.go b/src/api/csrf_test.go new file mode 100755 index 0000000..29ce447 --- /dev/null +++ b/src/api/csrf_test.go @@ -0,0 +1,379 @@ +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +const ( + tokenValid = "token_valid" + tokenInvalid = "token_invalid" + tokenExpired = "token_expired" + tokenEmpty = "token_empty" + tokenNotGenerated = "token_not_generated" +) + +func setCSRFParameters(csrfStore *CSRFStore, tokenType string, req *http.Request) { + token := newCSRFToken() + // token check + switch tokenType { + case tokenValid: + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", token.String()) + case tokenInvalid: + // set invalid token value + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", "xcasadsadsa") + case tokenExpired: + csrfStore.setToken(token) + csrfStore.token.ExpiresAt = time.Unix(1517509381, 10) + req.Header.Set("X-CSRF-Token", token.String()) + // set some old unix time + case tokenEmpty: + // set empty token + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", "") + case tokenNotGenerated: + // don't set token + csrfStore.token = nil + req.Header.Set("X-CSRF-Token", token.String()) + } +} + +var endpoints = []string{ + "/address_uxouts", + "/addresscount", + "/balance", + "/block", + "/blockchain/metadata", + "/blockchain/progress", + "/blocks", + "/coinSupply", + "/explorer/address", + "/health", + "/injectTransaction", + "/last_blocks", + "/version", + "/network/connection", + "/network/connections", + "/network/connections/exchange", + "/network/connections/trust", + "/network/defaultConnections", + "/outputs", + "/pendingTxs", + "/rawtx", + "/richlist", + "/resendUnconfirmedTxns", + "/transaction", + "/transactions", + "/uxout", + "/wallet", + "/wallet/balance", + "/wallet/create", + "/wallet/newAddress", + "/wallet/newSeed", + "/wallet/seed", + "/wallet/spend", + "/wallet/transaction", + "/wallet/transactions", + "/wallet/unload", + "/wallet/update", + "/wallets", + "/wallets/folderName", + "/webrpc", + + "/api/v1/address_uxouts", + "/api/v1/addresscount", + "/api/v1/balance", + "/api/v1/block", + "/api/v1/blockchain/metadata", + "/api/v1/blockchain/progress", + "/api/v1/blocks", + "/api/v1/coinSupply", + "/api/v1/explorer/address", + "/api/v1/health", + "/api/v1/injectTransaction", + "/api/v1/last_blocks", + "/api/v1/version", + "/api/v1/network/connection", + "/api/v1/network/connections", + "/api/v1/network/connections/exchange", + "/api/v1/network/connections/trust", + "/api/v1/network/defaultConnections", + "/api/v1/outputs", + "/api/v1/pendingTxs", + "/api/v1/rawtx", + "/api/v1/richlist", + "/api/v1/resendUnconfirmedTxns", + "/api/v1/transaction", + "/api/v1/transactions", + "/api/v1/uxout", + "/api/v1/wallet", + "/api/v1/wallet/balance", + "/api/v1/wallet/create", + "/api/v1/wallet/newAddress", + "/api/v1/wallet/newSeed", + "/api/v1/wallet/seed", + "/api/v1/wallet/spend", + "/api/v1/wallet/transaction", + "/api/v1/wallet/transactions", + "/api/v1/wallet/unload", + "/api/v1/wallet/update", + "/api/v1/wallets", + "/api/v1/wallets/folderName", + "/api/v1/webrpc", + + "/api/v2/transaction/verify", + "/api/v2/address/verify", +} + +func TestCSRFWrapper(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenNotGenerated} + + for _, endpoint := range endpoints { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, c, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + enableUnversionedAPI: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + }) + } + } + } +} + +func TestOriginRefererCheck(t *testing.T) { + cases := []struct { + name string + origin string + referer string + }{ + { + name: "mismatched origin header", + origin: "http://example.com/", + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + }, + } + + for _, endpoint := range endpoints { + for _, tc := range cases { + name := fmt.Sprintf("%s %s", tc.name, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + if tc.origin != "" { + req.Header.Set("Origin", tc.origin) + } + if tc.referer != "" { + req.Header.Set("Referer", tc.referer) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden\n", rr.Body.String()) + }) + } + } +} + +func TestHostCheck(t *testing.T) { + for _, endpoint := range endpoints { + t.Run(endpoint, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + req.Host = "example.com" + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden\n", rr.Body.String()) + }) + } +} + +func TestCSRF(t *testing.T) { + csrfStore := &CSRFStore{ + Enabled: true, + } + + updateWalletLabel := func(csrfToken string) *httptest.ResponseRecorder { + gateway := &GatewayerMock{} + gateway.On("UpdateWalletLabel", "fooid", "foolabel").Return(nil) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + v.Add("id", "fooid") + v.Add("label", "foolabel") + + req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + if csrfToken != "" { + req.Header.Set("X-CSRF-Token", csrfToken) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + return rr + } + + // First request to POST /wallet/update is rejected because of missing CSRF + rr := updateWalletLabel("") + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + + // Make a request to /csrf to get a token + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + // non-GET request to /csrf is invalid + req, err := http.NewRequest(http.MethodPost, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusMethodNotAllowed, rr.Code) + require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") + + // CSRF disabled 404s + csrfStore.Enabled = false + + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusNotFound, rr.Code) + require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") + + csrfStore.Enabled = true + + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + + token := msg["csrf_token"] + require.NotEmpty(t, token) + + req, err = http.NewRequest(http.MethodPost, "/api/v1/version", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + // Make a request to POST /wallet/update again, using the CSRF token + rr = updateWalletLabel(token) + require.Equal(t, http.StatusOK, rr.Code) + + // Make another call to /csrf, this will invalidate the first token + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg2 map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg2) + require.NoError(t, err) + require.NotEmpty(t, msg2["csrf_token"]) + require.NotEqual(t, msg["csrf_token"], msg2["csrf_token"]) + + rr = updateWalletLabel(token) + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) +} diff --git a/src/api/explorer.go b/src/api/explorer.go new file mode 100755 index 0000000..a0fb19d --- /dev/null +++ b/src/api/explorer.go @@ -0,0 +1,252 @@ +package api + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/droplet" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor" +) + +// CoinSupply records the coin supply info +type CoinSupply struct { + // Coins distributed beyond the project: + CurrentSupply string `json:"current_supply"` + // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable + TotalSupply string `json:"total_supply"` + // MaxSupply is the maximum number of coins to be distributed ever + MaxSupply string `json:"max_supply"` + // CurrentCoinHourSupply is coins hours in non distribution addresses + CurrentCoinHourSupply string `json:"current_coinhour_supply"` + // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses + TotalCoinHourSupply string `json:"total_coinhour_supply"` + // Distribution addresses which count towards total supply + UnlockedAddresses []string `json:"unlocked_distribution_addresses"` + // Distribution addresses which are locked and do not count towards total supply + LockedAddresses []string `json:"locked_distribution_addresses"` +} + +func getCoinSupply(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + supply := coinSupply(gateway, w, r) + if supply != nil { + wh.SendJSONOr500(logger, w, supply) + } + } +} + +func coinSupply(gateway Gatewayer, w http.ResponseWriter, r *http.Request) *CoinSupply { + if r.Method != http.MethodGet { + wh.Error405(w) + return nil + } + + allUnspents, err := gateway.GetUnspentOutputs() + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputs failed: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) + + var unlockedSupply uint64 + // check confirmed unspents only + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrMap[u.Address]; ok { + coins, err := droplet.FromString(u.Coins) + if err != nil { + err = fmt.Errorf("Invalid unlocked output balance string %s: %v", u.Coins, err) + wh.Error500(w, err.Error()) + return nil + } + unlockedSupply += coins + } + } + + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distributed from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + totalSupplyStr, err := droplet.ToString(totalSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + // locked distribution addresses + lockedAddrs := visor.GetLockedDistributionAddresses() + lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrMap[out.Address]; !ok { + totalCoinHours += out.CalculatedHours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrMap[out.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrMap[out.Address]; !ok { + currentCoinHours += out.CalculatedHours + } + } + } + + if err != nil { + err = fmt.Errorf("Failed to get total coinhours: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: unlockedAddrs, + LockedAddresses: visor.GetLockedDistributionAddresses(), + } + + return &cs +} + +// method: GET +// url: /explorer/address?address=${address} +func getTransactionsForAddress(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, "invalid address") + return + } + + txns, err := gateway.GetTransactionsForAddress(cipherAddr) + if err != nil { + err = fmt.Errorf("gateway.GetTransactionsForAddress failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txns) + } +} + +// Richlist is the API response for /richlist, contains top address balances +type Richlist struct { + Richlist visor.Richlist `json:"richlist"` +} + +// method: GET +// url: /richlist?n=${number}&include-distribution=${bool} +func getRichlist(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var topn int + topnStr := r.FormValue("n") + if topnStr == "" { + topn = 20 + } else { + var err error + topn, err = strconv.Atoi(topnStr) + if err != nil { + wh.Error400(w, "invalid n") + return + } + } + + var includeDistribution bool + includeDistributionStr := r.FormValue("include-distribution") + if includeDistributionStr == "" { + includeDistribution = false + } else { + var err error + includeDistribution, err = strconv.ParseBool(includeDistributionStr) + if err != nil { + wh.Error400(w, "invalid include-distribution") + return + } + } + + richlist, err := gateway.GetRichlist(includeDistribution) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if topn > 0 && topn < len(richlist) { + richlist = richlist[:topn] + } + + wh.SendJSONOr500(logger, w, Richlist{ + Richlist: richlist, + }) + } +} + +// method: GET +// url: /addresscount +func getAddressCount(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrCount, err := gateway.GetAddressCount() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) + } +} diff --git a/src/api/explorer_test.go b/src/api/explorer_test.go new file mode 100755 index 0000000..2ba3aac --- /dev/null +++ b/src/api/explorer_test.go @@ -0,0 +1,625 @@ +package api + +import ( + "errors" + "net/http" + "testing" + + "encoding/json" + "net/http/httptest" + "net/url" + "strings" + + "github.com/stretchr/testify/require" + + "github.com/stretchr/testify/mock" + + "strconv" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor" +) + +func makeSuccessCoinSupplyResult(t *testing.T, allUnspents visor.ReadableOutputSet) *CoinSupply { + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + var unlockedSupply uint64 + // check confirmed unspents only + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrMap[u.Address]; ok { + coins, err := droplet.FromString(u.Coins) + require.NoError(t, err) + unlockedSupply += coins + } + } + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distribution from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + require.NoError(t, err) + + totalSupplyStr, err := droplet.ToString(totalSupply) + require.NoError(t, err) + + maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) + require.NoError(t, err) + + // locked distribution addresses + lockedAddrs := visor.GetLockedDistributionAddresses() + lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrMap[out.Address]; !ok { + totalCoinHours += out.Hours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrMap[out.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrMap[out.Address]; !ok { + currentCoinHours += out.Hours + } + } + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: unlockedAddrs, + LockedAddresses: visor.GetLockedDistributionAddresses(), + } + return &cs +} + +func TestGetTransactionsForAddress(t *testing.T) { + address := testutil.MakeAddress() + successAddress := "111111111111111111111691FSP" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + tt := []struct { + name string + method string + status int + err string + addressParam string + gatewayGetTransactionsForAddressErr error + result []daemon.ReadableTransaction + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + addressParam: "0", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + addressParam: "", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address", + addressParam: "badAddress", + }, + { + name: "500 - gw GetTransactionsForAddress error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetTransactionsForAddress failed: gatewayGetTransactionsForAddressErr", + addressParam: address.String(), + gatewayGetTransactionsForAddressErr: errors.New("gatewayGetTransactionsForAddressErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + addressParam: address.String(), + result: []daemon.ReadableTransaction{ + { + In: []visor.ReadableTransactionInput{ + { + Hash: validHash, + Address: successAddress, + Coins: "0.000000", + Hours: 0, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/explorer/address" + gateway := NewGatewayerMock() + gateway.On("GetTransactionsForAddress", address).Return(tc.result, tc.gatewayGetTransactionsForAddressErr) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.addressParam != "" { + v.Add("address", tc.addressParam) + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []daemon.ReadableTransaction + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestCoinSupply(t *testing.T) { + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + successGatewayGetUnspentOutputsResult := visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "0", + }, + visor.ReadableOutput{ + Coins: "0", + }, + }, + } + var filterInUnlocked []daemon.OutputsFilter + filterInUnlocked = append(filterInUnlocked, daemon.FbyAddresses(unlockedAddrs)) + tt := []struct { + name string + method string + status int + err string + gatewayGetUnspentOutputsArg []daemon.OutputsFilter + gatewayGetUnspentOutputsResult *visor.ReadableOutputSet + gatewayGetUnspentOutputsErr error + result *CoinSupply + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - too large HeadOutputs item", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Invalid unlocked output balance string 9223372036854775807: Droplet string conversion failed: Value is too large", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "9223372036854775807", + Address: unlockedAddrs[0], + }, + visor.ReadableOutput{ + Coins: "1", + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "0", + }, + visor.ReadableOutput{ + Coins: "0", + }, + }, + }, + result: makeSuccessCoinSupplyResult(t, successGatewayGetUnspentOutputsResult), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/coinSupply" + gateway := NewGatewayerMock() + gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.gatewayGetUnspentOutputsResult, tc.gatewayGetUnspentOutputsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *CoinSupply + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetRichlist(t *testing.T) { + type httpParams struct { + topn string + includeDistribution string + } + tt := []struct { + name string + method string + status int + err string + httpParams *httpParams + includeDistribution bool + gatewayGetRichlistResult visor.Richlist + gatewayGetRichlistErr error + result Richlist + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - bad topn param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid n", + httpParams: &httpParams{ + topn: "bad topn", + }, + }, + { + name: "400 - include-distribution", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid include-distribution", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "bad include-distribution", + }, + }, + { + name: "500 - gw GetRichlist error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetRichlistErr", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "false", + }, + gatewayGetRichlistErr: errors.New("gatewayGetRichlistErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "3", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + result: Richlist{ + Richlist: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + }, + }, + }, + { + name: "200 no limit", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "0", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + result: Richlist{ + Richlist: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/richlist" + gateway := NewGatewayerMock() + gateway.On("GetRichlist", tc.includeDistribution).Return(tc.gatewayGetRichlistResult, tc.gatewayGetRichlistErr) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpParams != nil { + if tc.httpParams.topn != "" { + v.Add("n", tc.httpParams.topn) + } + if tc.httpParams.includeDistribution != "" { + v.Add("include-distribution", tc.httpParams.includeDistribution) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Richlist + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetAddressCount(t *testing.T) { + type Result struct { + Count uint64 + } + tt := []struct { + name string + method string + status int + err string + gatewayGetAddressCountResult uint64 + gatewayGetAddressCountErr error + result Result + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gw GetAddressCount error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetAddressCountErr", + gatewayGetAddressCountErr: errors.New("gatewayGetAddressCountErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + gatewayGetAddressCountResult: 1, + result: Result{ + Count: 1, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/addresscount" + gateway := NewGatewayerMock() + gateway.On("GetAddressCount").Return(tc.gatewayGetAddressCountResult, tc.gatewayGetAddressCountErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Result + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/src/api/gateway.go b/src/api/gateway.go new file mode 100755 index 0000000..ab634cf --- /dev/null +++ b/src/api/gateway.go @@ -0,0 +1,59 @@ +package api + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +//go:generate go install +//go:generate goautomock -template=testify Gatewayer + +// Gatewayer interface for Gateway methods +type Gatewayer interface { + Spend(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) + CreateTransaction(w wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) + GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalance, error) + GetWallet(wltID string) (*wallet.Wallet, error) + GetWallets() (wallet.Wallets, error) + UpdateWalletLabel(wltID, label string) error + GetWalletUnconfirmedTxns(wltID string) ([]visor.UnconfirmedTxn, error) + CreateWallet(wltName string, options wallet.Options) (*wallet.Wallet, error) + NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) + GetWalletDir() (string, error) + IsWalletAPIEnabled() bool + EncryptWallet(wltID string, password []byte) (*wallet.Wallet, error) + DecryptWallet(wltID string, password []byte) (*wallet.Wallet, error) + GetWalletSeed(wltID string, password []byte) (string, error) + GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) + GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) + GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) + GetBuildInfo() visor.BuildInfo + GetUnspentOutputs(filters ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) + GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) + GetBlockchainMetadata() (*visor.BlockchainMetadata, error) + GetBlockchainProgress() (*daemon.BlockchainProgress, error) + GetConnection(addr string) *daemon.Connection + GetConnections() *daemon.Connections + GetDefaultConnections() []string + GetTrustConnections() []string + GetExchgConnection() []string + GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + GetTransactions(flts ...visor.TxFilter) ([]visor.Transaction, error) + InjectBroadcastTransaction(txn coin.Transaction) error + ResendUnconfirmedTxns() (*daemon.ResendResult, error) + GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) + GetAddrUxOuts(addr []cipher.Address) ([]*historydb.UxOut, error) + GetTransactionsForAddress(a cipher.Address) ([]daemon.ReadableTransaction, error) + GetRichlist(includeDistribution bool) (visor.Richlist, error) + GetAddressCount() (uint64, error) + GetHealth() (*daemon.Health, error) + UnloadWallet(id string) error + VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) + IsCSPEnabled() bool +} diff --git a/src/api/gatewayer_mock_test.go b/src/api/gatewayer_mock_test.go new file mode 100755 index 0000000..ce81229 --- /dev/null +++ b/src/api/gatewayer_mock_test.go @@ -0,0 +1,1090 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package api + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + daemon "github.com/skycoin/skycoin/src/daemon" + visor "github.com/skycoin/skycoin/src/visor" + historydb "github.com/skycoin/skycoin/src/visor/historydb" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +// GatewayerMock mock +type GatewayerMock struct { + mock.Mock +} + +func NewGatewayerMock() *GatewayerMock { + return &GatewayerMock{} +} + +// CreateTransaction mocked method +func (m *GatewayerMock) CreateTransaction(p0 wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { + + ret := m.Called(p0) + + var r0 *coin.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *coin.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 []wallet.UxBalance + switch res := ret.Get(1).(type) { + case nil: + case []wallet.UxBalance: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// CreateWallet mocked method +func (m *GatewayerMock) CreateWallet(p0 string, p1 wallet.Options) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// DecryptWallet mocked method +func (m *GatewayerMock) DecryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// EncryptWallet mocked method +func (m *GatewayerMock) EncryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAddrUxOuts mocked method +func (m *GatewayerMock) GetAddrUxOuts(p0 []cipher.Address) ([]*historydb.UxOut, error) { + + ret := m.Called(p0) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAddressCount mocked method +func (m *GatewayerMock) GetAddressCount() (uint64, error) { + + ret := m.Called() + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAllUnconfirmedTxns mocked method +func (m *GatewayerMock) GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) { + + ret := m.Called() + + var r0 []visor.UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case []visor.UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBalanceOfAddrs mocked method +func (m *GatewayerMock) GetBalanceOfAddrs(p0 []cipher.Address) ([]wallet.BalancePair, error) { + + ret := m.Called(p0) + + var r0 []wallet.BalancePair + switch res := ret.Get(0).(type) { + case nil: + case []wallet.BalancePair: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlockchainMetadata mocked method +func (m *GatewayerMock) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { + + ret := m.Called() + + var r0 *visor.BlockchainMetadata + switch res := ret.Get(0).(type) { + case nil: + case *visor.BlockchainMetadata: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlockchainProgress mocked method +func (m *GatewayerMock) GetBlockchainProgress() (*daemon.BlockchainProgress, error) { + + ret := m.Called() + + var r0 *daemon.BlockchainProgress + switch res := ret.Get(0).(type) { + case nil: + case *daemon.BlockchainProgress: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlocks mocked method +func (m *GatewayerMock) GetBlocks(p0 uint64, p1 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0, p1) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBuildInfo mocked method +func (m *GatewayerMock) GetBuildInfo() visor.BuildInfo { + + ret := m.Called() + + var r0 visor.BuildInfo + switch res := ret.Get(0).(type) { + case nil: + case visor.BuildInfo: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetConnection mocked method +func (m *GatewayerMock) GetConnection(p0 string) *daemon.Connection { + + ret := m.Called(p0) + + var r0 *daemon.Connection + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Connection: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetConnections mocked method +func (m *GatewayerMock) GetConnections() *daemon.Connections { + + ret := m.Called() + + var r0 *daemon.Connections + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Connections: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetDefaultConnections mocked method +func (m *GatewayerMock) GetDefaultConnections() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetExchgConnection mocked method +func (m *GatewayerMock) GetExchgConnection() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetHealth mocked method +func (m *GatewayerMock) GetHealth() (*daemon.Health, error) { + + ret := m.Called() + + var r0 *daemon.Health + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Health: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetLastBlocks mocked method +func (m *GatewayerMock) GetLastBlocks(p0 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetRichlist mocked method +func (m *GatewayerMock) GetRichlist(p0 bool) (visor.Richlist, error) { + + ret := m.Called(p0) + + var r0 visor.Richlist + switch res := ret.Get(0).(type) { + case nil: + case visor.Richlist: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockByHash mocked method +func (m *GatewayerMock) GetSignedBlockByHash(p0 cipher.SHA256) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockBySeq mocked method +func (m *GatewayerMock) GetSignedBlockBySeq(p0 uint64) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransaction mocked method +func (m *GatewayerMock) GetTransaction(p0 cipher.SHA256) (*visor.Transaction, error) { + + ret := m.Called(p0) + + var r0 *visor.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *visor.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransactions mocked method +func (m *GatewayerMock) GetTransactions(p0 ...visor.TxFilter) ([]visor.Transaction, error) { + + ret := m.Called(p0) + + var r0 []visor.Transaction + switch res := ret.Get(0).(type) { + case nil: + case []visor.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransactionsForAddress mocked method +func (m *GatewayerMock) GetTransactionsForAddress(p0 cipher.Address) ([]daemon.ReadableTransaction, error) { + + ret := m.Called(p0) + + var r0 []daemon.ReadableTransaction + switch res := ret.Get(0).(type) { + case nil: + case []daemon.ReadableTransaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTrustConnections mocked method +func (m *GatewayerMock) GetTrustConnections() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetUnspentOutputs mocked method +func (m *GatewayerMock) GetUnspentOutputs(p0 ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableOutputSet + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableOutputSet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUxOutByID mocked method +func (m *GatewayerMock) GetUxOutByID(p0 cipher.SHA256) (*historydb.UxOut, error) { + + ret := m.Called(p0) + + var r0 *historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case *historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWallet mocked method +func (m *GatewayerMock) GetWallet(p0 string) (*wallet.Wallet, error) { + + ret := m.Called(p0) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletBalance mocked method +func (m *GatewayerMock) GetWalletBalance(p0 string) (wallet.BalancePair, wallet.AddressBalance, error) { + + ret := m.Called(p0) + + var r0 wallet.BalancePair + switch res := ret.Get(0).(type) { + case nil: + case wallet.BalancePair: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 wallet.AddressBalance + switch res := ret.Get(1).(type) { + case nil: + case wallet.AddressBalance: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// GetWalletDir mocked method +func (m *GatewayerMock) GetWalletDir() (string, error) { + + ret := m.Called() + + var r0 string + switch res := ret.Get(0).(type) { + case nil: + case string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletSeed mocked method +func (m *GatewayerMock) GetWalletSeed(p0 string, p1 []byte) (string, error) { + + ret := m.Called(p0, p1) + + var r0 string + switch res := ret.Get(0).(type) { + case nil: + case string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletUnconfirmedTxns mocked method +func (m *GatewayerMock) GetWalletUnconfirmedTxns(p0 string) ([]visor.UnconfirmedTxn, error) { + + ret := m.Called(p0) + + var r0 []visor.UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case []visor.UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWallets mocked method +func (m *GatewayerMock) GetWallets() (wallet.Wallets, error) { + + ret := m.Called() + + var r0 wallet.Wallets + switch res := ret.Get(0).(type) { + case nil: + case wallet.Wallets: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// InjectBroadcastTransaction mocked method +func (m *GatewayerMock) InjectBroadcastTransaction(p0 coin.Transaction) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsCSPEnabled mocked method +func (m *GatewayerMock) IsCSPEnabled() bool { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsWalletAPIEnabled mocked method +func (m *GatewayerMock) IsWalletAPIEnabled() bool { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// NewAddresses mocked method +func (m *GatewayerMock) NewAddresses(p0 string, p1 []byte, p2 uint64) ([]cipher.Address, error) { + + ret := m.Called(p0, p1, p2) + + var r0 []cipher.Address + switch res := ret.Get(0).(type) { + case nil: + case []cipher.Address: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// ResendUnconfirmedTxns mocked method +func (m *GatewayerMock) ResendUnconfirmedTxns() (*daemon.ResendResult, error) { + + ret := m.Called() + + var r0 *daemon.ResendResult + switch res := ret.Get(0).(type) { + case nil: + case *daemon.ResendResult: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Spend mocked method +func (m *GatewayerMock) Spend(p0 string, p1 []byte, p2 uint64, p3 cipher.Address) (*coin.Transaction, error) { + + ret := m.Called(p0, p1, p2, p3) + + var r0 *coin.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *coin.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// UnloadWallet mocked method +func (m *GatewayerMock) UnloadWallet(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// UpdateWalletLabel mocked method +func (m *GatewayerMock) UpdateWalletLabel(p0 string, p1 string) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// VerifyTxnVerbose mocked method +func (m *GatewayerMock) VerifyTxnVerbose(p0 *coin.Transaction) ([]wallet.UxBalance, bool, error) { + + ret := m.Called(p0) + + var r0 []wallet.UxBalance + switch res := ret.Get(0).(type) { + case nil: + case []wallet.UxBalance: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} diff --git a/src/api/health.go b/src/api/health.go new file mode 100755 index 0000000..90cfacb --- /dev/null +++ b/src/api/health.go @@ -0,0 +1,56 @@ +package api + +import ( + "fmt" + "net/http" + "time" + + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" +) + +// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block +type BlockchainMetadata struct { + *visor.BlockchainMetadata + TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` +} + +// HealthResponse is returned by the /health endpoint +type HealthResponse struct { + BlockchainMetadata BlockchainMetadata `json:"blockchain"` + Version visor.BuildInfo `json:"version"` + OpenConnections int `json:"open_connections"` + Uptime wh.Duration `json:"uptime"` +} + +// Returns node health data. +// URI: /api/v1/health +// Method: GET +func healthCheck(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + health, err := gateway.GetHealth() + if err != nil { + err = fmt.Errorf("gateway.GetHealth failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + elapsedBlockTime := time.Now().UTC().Unix() - int64(health.BlockchainMetadata.Head.Time) + timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) + + wh.SendJSONOr500(logger, w, HealthResponse{ + BlockchainMetadata: BlockchainMetadata{ + BlockchainMetadata: health.BlockchainMetadata, + TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), + }, + Version: health.Version, + OpenConnections: health.OpenConnections, + Uptime: wh.FromDuration(health.Uptime), + }) + } +} diff --git a/src/api/health_test.go b/src/api/health_test.go new file mode 100755 index 0000000..3970890 --- /dev/null +++ b/src/api/health_test.go @@ -0,0 +1,120 @@ +package api + +import ( + "errors" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "encoding/json" + "net/http/httptest" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" +) + +func TestHealthCheckHandler(t *testing.T) { + + cases := []struct { + name string + method string + code int + getHealthErr error + }{ + { + name: "valid response", + method: http.MethodGet, + code: http.StatusOK, + }, + { + name: "403 method not allowed", + method: http.MethodPost, + code: http.StatusMethodNotAllowed, + }, + { + name: "gateway.GetHealth error", + method: http.MethodGet, + code: http.StatusInternalServerError, + getHealthErr: errors.New("GetHealth failed"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unspents := uint64(10) + unconfirmed := uint64(20) + + metadata := &visor.BlockchainMetadata{ + Head: visor.ReadableBlockHeader{ + BkSeq: 21175, + BlockHash: "8a3e0aac619551ae009cfb28c2b36bb1300925f74da770d1512072314f6a4c80", + PreviousBlockHash: "001eb7911b6a6ab7c75feb88726dd2bc8b87133aebc82201c4404537eb74f7ac", + Time: 1523168686, + Fee: 2, + Version: 0, + BodyHash: "36be8d70d1e9f70b340ea7ecf0b247c27086bad10568044c1196fe150f6cea1b", + }, + Unspents: unspents, + Unconfirmed: unconfirmed, + } + + buildInfo := visor.BuildInfo{ + Version: "1.0.0", + Commit: "abcdef", + Branch: "develop", + } + + health := &daemon.Health{ + BlockchainMetadata: metadata, + OpenConnections: 3, + Version: buildInfo, + Uptime: time.Second * 4, + } + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + if tc.getHealthErr != nil { + gateway.On("GetHealth").Return(nil, tc.getHealthErr) + } else { + gateway.On("GetHealth").Return(health, nil) + } + + endpoint := "/api/v1/health" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + cfg := muxConfig{ + host: configuredHost, + appLoc: ".", + } + handler := newServerMux(cfg, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + if tc.code != http.StatusOK { + require.Equal(t, tc.code, rr.Code) + return + } + + require.Equal(t, http.StatusOK, rr.Code) + + r := &HealthResponse{} + err = json.Unmarshal(rr.Body.Bytes(), r) + require.NoError(t, err) + + require.Equal(t, buildInfo.Version, r.Version.Version) + require.Equal(t, buildInfo.Commit, r.Version.Commit) + require.Equal(t, buildInfo.Branch, r.Version.Branch) + require.Equal(t, health.Uptime, r.Uptime.Duration) + + require.Equal(t, health.OpenConnections, r.OpenConnections) + + require.Equal(t, unconfirmed, r.BlockchainMetadata.Unconfirmed) + require.Equal(t, unspents, r.BlockchainMetadata.Unspents) + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + require.Equal(t, metadata.Head, r.BlockchainMetadata.Head) + }) + } +} diff --git a/src/api/http.go b/src/api/http.go new file mode 100755 index 0000000..75512ce --- /dev/null +++ b/src/api/http.go @@ -0,0 +1,573 @@ +package api + +import ( + "crypto/tls" + "fmt" + "io/ioutil" + "net" + "net/http" + "path/filepath" + "strings" + "time" + "unicode" + + "github.com/NYTimes/gziphandler" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/file" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("api") +) + +const ( + resourceDir = "dist/" + devDir = "dev/" + indexPage = "index.html" + + defaultReadTimeout = time.Second * 10 + defaultWriteTimeout = time.Second * 60 + defaultIdleTimeout = time.Second * 120 +) + +// Server exposes an HTTP API +type Server struct { + server *http.Server + listener net.Listener + done chan struct{} +} + +// Config configures Server +type Config struct { + StaticDir string + DisableCSRF bool + EnableWalletAPI bool + EnableJSON20RPC bool + EnableGUI bool + EnableUnversionedAPI bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration +} + +type muxConfig struct { + host string + appLoc string + enableGUI bool + enableJSON20RPC bool + enableUnversionedAPI bool +} + +// HTTPResponse represents the http response struct +type HTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +// HTTPError is included in an HTTPResponse +type HTTPError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +// NewHTTPErrorResponse returns an HTTPResponse with the Error field populated +func NewHTTPErrorResponse(code int, msg string) HTTPResponse { + if msg == "" { + msg = http.StatusText(code) + } + + return HTTPResponse{ + Error: &HTTPError{ + Code: code, + Message: msg, + }, + } +} + +func create(host string, c Config, gateway Gatewayer) (*Server, error) { + var appLoc string + if c.EnableGUI { + var err error + appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) + if err != nil { + return nil, err + } + logger.Infof("Web resources directory: %s", appLoc) + } + + csrfStore := &CSRFStore{ + Enabled: !c.DisableCSRF, + } + if c.DisableCSRF { + logger.Warning("CSRF check disabled") + } + + var rpc *webrpc.WebRPC + if c.EnableJSON20RPC { + logger.Info("JSON 2.0 RPC enabled") + var err error + // TODO: change webprc to use http.Gatewayer + rpc, err = webrpc.New(gateway.(*daemon.Gateway)) + if err != nil { + return nil, err + } + } + + if c.ReadTimeout == 0 { + c.ReadTimeout = defaultReadTimeout + } + if c.WriteTimeout == 0 { + c.WriteTimeout = defaultWriteTimeout + } + if c.IdleTimeout == 0 { + c.IdleTimeout = defaultIdleTimeout + } + + mc := muxConfig{ + host: host, + appLoc: appLoc, + enableGUI: c.EnableGUI, + enableJSON20RPC: c.EnableJSON20RPC, + enableUnversionedAPI: c.EnableUnversionedAPI, + } + + srvMux := newServerMux(mc, gateway, csrfStore, rpc) + srv := &http.Server{ + Handler: srvMux, + ReadTimeout: c.ReadTimeout, + WriteTimeout: c.WriteTimeout, + IdleTimeout: c.IdleTimeout, + } + + return &Server{ + server: srv, + done: make(chan struct{}), + }, nil +} + +// Create creates a new Server instance that listens on HTTP +func Create(host string, c Config, gateway Gatewayer) (*Server, error) { + logger.Warning("HTTPS not in use!") + + listener, err := net.Listen("tcp", host) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + s.listener.Close() + return nil, err + } + + s.listener = listener + + return s, nil +} + +// CreateHTTPS creates a new Server instance that listens on HTTPS +func CreateHTTPS(host string, c Config, gateway Gatewayer, certFile, keyFile string) (*Server, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + logger.Infof("Using %s for the certificate", certFile) + logger.Infof("Using %s for the key", keyFile) + + listener, err := tls.Listen("tcp", host, &tls.Config{ + Certificates: []tls.Certificate{cert}, + }) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + s.listener.Close() + return nil, err + } + + s.listener = listener + + return s, nil +} + +// Addr returns the listening address of the Server +func (s *Server) Addr() string { + return s.listener.Addr().String() +} + +// Serve serves the web interface on the configured host +func (s *Server) Serve() error { + logger.Infof("Starting web interface on %s", s.listener.Addr()) + defer logger.Info("Web interface closed") + defer close(s.done) + + if err := s.server.Serve(s.listener); err != nil { + if err != http.ErrServerClosed { + return err + } + } + return nil +} + +// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. +func (s *Server) Shutdown() { + if s == nil { + return + } + + logger.Info("Shutting down web interface") + defer logger.Info("Web interface shut down") + s.listener.Close() + <-s.done +} + +// newServerMux creates an http.ServeMux with handlers registered +func newServerMux(c muxConfig, gateway Gatewayer, csrfStore *CSRFStore, rpc *webrpc.WebRPC) *http.ServeMux { + mux := http.NewServeMux() + + headerCheck := func(host string, handler http.Handler) http.Handler { + handler = OriginRefererCheck(host, handler) + handler = wh.HostCheck(logger, host, handler) + return handler + } + + webHandler := func(endpoint string, handler http.Handler) { + handler = wh.ElapsedHandler(logger, handler) + handler = CSRFCheck(csrfStore, handler) + handler = headerCheck(c.host, handler) + handler = gziphandler.GzipHandler(handler) + mux.Handle(endpoint, handler) + } + + webHandlerV1 := func(endpoint string, handler http.Handler) { + if c.enableUnversionedAPI { + webHandler(endpoint, handler) + } + webHandler("/api/v1"+endpoint, handler) + } + + webHandlerV2 := func(endpoint string, handler http.Handler) { + webHandler("/api/v2"+endpoint, handler) + } + + indexHandler := newIndexHandler(c.appLoc, c.enableGUI) + if gateway.IsCSPEnabled() { + indexHandler = wh.CSPHandler(indexHandler) + } + webHandler("/", indexHandler) + + if c.enableGUI { + fileInfos, _ := ioutil.ReadDir(c.appLoc) + + fs := http.FileServer(http.Dir(c.appLoc)) + if gateway.IsCSPEnabled() { + fs = wh.CSPHandler(fs) + } + + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + + webHandler(route, fs) + } + } + + if c.enableJSON20RPC { + webHandlerV1("/webrpc", http.HandlerFunc(rpc.Handler)) + } + + // get the current CSRF token + csrfHandler := headerCheck(c.host, getCSRFToken(csrfStore)) + mux.Handle("/csrf", csrfHandler) + mux.Handle("/api/v1/csrf", csrfHandler) + + webHandlerV1("/version", versionHandler(gateway)) + + // get set of unspent outputs + webHandlerV1("/outputs", getOutputsHandler(gateway)) + + // get balance of addresses + webHandlerV1("/balance", getBalanceHandler(gateway)) + + // Wallet interface + + // Returns wallet info + // Method: GET + // Args: + // id - Wallet ID [required] + webHandlerV1("/wallet", walletGet(gateway)) + + // Loads wallet from seed, will scan ahead N address and + // load addresses till the last one that have coins. + // Method: POST + // Args: + // seed: wallet seed [required] + // label: wallet label [required] + // scan: the number of addresses to scan ahead for balances [optional, must be > 0] + webHandlerV1("/wallet/create", walletCreate(gateway)) + + webHandlerV1("/wallet/newAddress", walletNewAddresses(gateway)) + + // Returns the confirmed and predicted balance for a specific wallet. + // The predicted balance is the confirmed balance minus any pending + // spent amount. + // GET arguments: + // id: Wallet ID + webHandlerV1("/wallet/balance", walletBalanceHandler(gateway)) + + // Sends coins&hours to another address. + // POST arguments: + // id: Wallet ID + // coins: Number of coins to spend + // dst: Destination address + // Returns total amount spent if successful, otherwise error describing + // failure status. + webHandlerV1("/wallet/spend", walletSpendHandler(gateway)) + + // Creates a transaction from a wallet + webHandlerV1("/wallet/transaction", createTransactionHandler(gateway)) + + // GET Arguments: + // id: Wallet ID + // Returns all pending transanction for all addresses by selected Wallet + webHandlerV1("/wallet/transactions", walletTransactionsHandler(gateway)) + + // Update wallet label + // POST Arguments: + // id: wallet id + // label: wallet label + webHandlerV1("/wallet/update", walletUpdateHandler(gateway)) + + // Returns all loaded wallets + // returns sensitive information + webHandlerV1("/wallets", walletsHandler(gateway)) + + // Returns wallets directory path + webHandlerV1("/wallets/folderName", getWalletFolder(gateway)) + + // Generate wallet seed + // GET Arguments: + // entropy: entropy bitsize. + webHandlerV1("/wallet/newSeed", newWalletSeed(gateway)) + + // Gets seed of wallet of given id + // GET Arguments: + // id: wallet id + // password: wallet password + webHandlerV1("/wallet/seed", walletSeedHandler(gateway)) + + // unload wallet + // POST Argument: + // id: wallet id + webHandlerV1("/wallet/unload", walletUnloadHandler(gateway)) + + // Encrypts wallet + // POST arguments: + // id: wallet id + // password: wallet password + // Returns an encrypted wallet json without sensitive data + webHandlerV1("/wallet/encrypt", walletEncryptHandler(gateway)) + + // Decrypts wallet + // POST arguments: + // id: wallet id + // password: wallet password + webHandlerV1("/wallet/decrypt", walletDecryptHandler(gateway)) + + // Blockchain interface + + webHandlerV1("/blockchain/metadata", blockchainHandler(gateway)) + webHandlerV1("/blockchain/progress", blockchainProgressHandler(gateway)) + + // get block by hash or seq + webHandlerV1("/block", getBlock(gateway)) + // get blocks in specific range + webHandlerV1("/blocks", getBlocks(gateway)) + // get last N blocks + webHandlerV1("/last_blocks", getLastBlocks(gateway)) + + // Network stats interface + webHandlerV1("/network/connection", connectionHandler(gateway)) + webHandlerV1("/network/connections", connectionsHandler(gateway)) + webHandlerV1("/network/defaultConnections", defaultConnectionsHandler(gateway)) + webHandlerV1("/network/connections/trust", trustConnectionsHandler(gateway)) + webHandlerV1("/network/connections/exchange", exchgConnectionsHandler(gateway)) + + // Transaction handler + + // get set of pending transactions + webHandlerV1("/pendingTxs", getPendingTxns(gateway)) + // get txn by txid + webHandlerV1("/transaction", getTransactionByID(gateway)) + + // parse and verify transaction + webHandlerV2("/transaction/verify", verifyTxnHandler(gateway)) + + // Health check handler + webHandlerV1("/health", healthCheck(gateway)) + + // Returns transactions that match the filters. + // Method: GET + // Args: + // addrs: Comma seperated addresses [optional, returns all transactions if no address is provided] + // confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + webHandlerV1("/transactions", getTransactions(gateway)) + // inject a transaction into network + webHandlerV1("/injectTransaction", injectTransaction(gateway)) + webHandlerV1("/resendUnconfirmedTxns", resendUnconfirmedTxns(gateway)) + // get raw tx by txid. + webHandlerV1("/rawtx", getRawTxn(gateway)) + + // UxOut api handler + + // get uxout by id. + webHandlerV1("/uxout", getUxOutByID(gateway)) + // get all the address affected uxouts. + webHandlerV1("/address_uxouts", getAddrUxOuts(gateway)) + + webHandlerV2("/address/verify", http.HandlerFunc(addressVerify)) + + // Explorer handler + + // get set of pending transactions + webHandlerV1("/explorer/address", getTransactionsForAddress(gateway)) + + webHandlerV1("/coinSupply", getCoinSupply(gateway)) + + webHandlerV1("/richlist", getRichlist(gateway)) + + webHandlerV1("/addresscount", getAddressCount(gateway)) + + return mux +} + +// Returns a http.HandlerFunc for index.html, where index.html is in appLoc +func newIndexHandler(appLoc string, enableGUI bool) http.Handler { + // Serves the main page + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !enableGUI { + wh.Error404(w, "") + return + } + + if r.URL.Path != "/" { + wh.Error404(w, "") + return + } + + if r.URL.Path == "/" { + page := filepath.Join(appLoc, indexPage) + logger.Debugf("Serving index page: %s", page) + http.ServeFile(w, r, page) + } + }) +} + +func splitCommaString(s string) []string { + words := strings.FieldsFunc(s, func(r rune) bool { + return r == ',' || unicode.IsSpace(r) + }) + + // Deduplicate + var dedupWords []string + wordsMap := make(map[string]struct{}) + for _, w := range words { + if _, ok := wordsMap[w]; !ok { + dedupWords = append(dedupWords, w) + } + wordsMap[w] = struct{}{} + } + + return dedupWords +} + +// getOutputsHandler returns UxOuts filtered by a set of addresses or a set of hashes +// URI: /api/v1/outputs +// Method: GET +// Args: +// addrs: comma-separated list of addresses +// hashes: comma-separated list of uxout hashes +// If neither addrs nor hashes are specificed, return all unspent outputs. +// If only one filter is specified, then return outputs match the filter. +// Both filters cannot be specified. +func getOutputsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var addrs []string + var hashes []string + + addrStr := r.FormValue("addrs") + hashStr := r.FormValue("hashes") + + if addrStr != "" && hashStr != "" { + wh.Error400(w, "addrs and hashes cannot be specified together") + return + } + + filters := []daemon.OutputsFilter{} + + if addrStr != "" { + addrs = splitCommaString(addrStr) + + for _, a := range addrs { + if _, err := cipher.DecodeBase58Address(a); err != nil { + wh.Error400(w, "addrs contains invalid address") + return + } + } + + if len(addrs) > 0 { + filters = append(filters, daemon.FbyAddresses(addrs)) + } + } + + if hashStr != "" { + hashes = splitCommaString(hashStr) + if len(hashes) > 0 { + filters = append(filters, daemon.FbyHashes(hashes)) + } + } + + outs, err := gateway.GetUnspentOutputs(filters...) + if err != nil { + err = fmt.Errorf("get unspent outputs failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, outs) + } +} + +func versionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wh.SendJSONOr500(logger, w, gateway.GetBuildInfo()) + } +} diff --git a/src/api/http_test.go b/src/api/http_test.go new file mode 100755 index 0000000..35a0afc --- /dev/null +++ b/src/api/http_test.go @@ -0,0 +1,446 @@ +package api + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "sync" + "testing" + + "errors" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +func TestGetOutputsHandler(t *testing.T) { + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + invalidAddr := "invalidAddr" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + addrs string + hashStr string + } + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getUnspentOutputsResponse *visor.ReadableOutputSet + getUnspentOutputsError error + httpResponse *visor.ReadableOutputSet + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - addrs and hashes together", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs and hashes cannot be specified together", + httpBody: &httpBody{ + addrs: validAddr, + hashStr: validHash, + }, + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs contains invalid address", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "500 - getUnspentOutputsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - get unspent outputs failed: getUnspentOutputsError", + getUnspentOutputsResponse: nil, + getUnspentOutputsError: errors.New("getUnspentOutputsError"), + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.ReadableOutputSet{}, + httpResponse: &visor.ReadableOutputSet{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/outputs" + gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.getUnspentOutputsResponse, tc.getUnspentOutputsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.hashStr != "" { + v.Add("hashes", tc.httpBody.hashStr) + } + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableOutputSet + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetBalanceHandler(t *testing.T) { + type httpBody struct { + addrs string + } + invalidAddr := "invalidAddr" + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + address, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getBalanceOfAddrsArg []cipher.Address + getBalanceOfAddrsResponse []wallet.BalancePair + getBalanceOfAddrsError error + httpResponse wallet.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address invalidAddr is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "400 - no addresses", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs is required", + httpBody: &httpBody{}, + }, + { + name: "500 - GetBalanceOfAddrsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBalanceOfAddrs failed: GetBalanceOfAddrsError", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsError: errors.New("GetBalanceOfAddrsError"), + }, + { + name: "500 - balance Confirmed coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + }, + { + name: "500 - balance Predicted coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + }, + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: wallet.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/balance" + gateway.On("GetBalanceOfAddrs", tc.getBalanceOfAddrsArg).Return(tc.getBalanceOfAddrsResponse, tc.getBalanceOfAddrsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg wallet.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +// TestEnableGUI tests enable gui option, EnableGUI isn't part of Gateway API, +// we can't control the output by mocking the Gateway like other tests. Instead, +// we create a full webserver for each test case. +func TestEnableGUI(t *testing.T) { + tt := []struct { + name string + enableGUI bool + endpoint string + appLoc string + expectCode int + expectBody string + }{ + { + name: "disable gui GET /", + enableGUI: false, + endpoint: "/", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "disable gui GET /invalid-path", + enableGUI: false, + endpoint: "/invalid-path", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "enable gui GET /", + enableGUI: true, + endpoint: "/", + appLoc: "../gui/static", + expectCode: http.StatusOK, + expectBody: "", + }, + { + name: "enable gui GET /invalid-path", + enableGUI: true, + endpoint: "/invalid-path", + appLoc: "../gui/static", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: tc.appLoc}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + c := Config{ + EnableGUI: tc.enableGUI, + DisableCSRF: true, + StaticDir: tc.appLoc, + } + + host := "127.0.0.1:6423" + s, err := Create(host, c, gateway) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + s.Serve() + }() + + defer func() { + s.listener.Close() + wg.Wait() + }() + + url := fmt.Sprintf("http://%s/%s", host, tc.endpoint) + rsp, err := http.Get(url) + require.NoError(t, err) + + defer rsp.Body.Close() + require.Equal(t, tc.expectCode, rsp.StatusCode) + + body, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + if rsp.StatusCode != http.StatusOK { + require.Equal(t, tc.expectBody, string(body)) + } + }) + } +} + +func TestContentSecurityPolicy(t *testing.T) { + tt := []struct { + name string + endpoint string + enableCSP bool + appLoc string + expectCSPHeader string + }{ + { + name: "enable CSP GET /", + endpoint: "/", + enableCSP: true, + appLoc: "../gui/static/dist", + expectCSPHeader: "script-src 'self' 127.0.0.1", + }, + { + name: "disable CSP GET /", + endpoint: "/", + enableCSP: false, + appLoc: "../gui/static/dist", + expectCSPHeader: "", + }, + { + // Confirms that the /csrf api won't be affected by the csp setting + name: "enable CSP GET /csrf", + endpoint: "/api/v1/csrf", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + }, + { + // Confirms that the /version api won't be affected by the csp setting + name: "enable CSP GET /version", + endpoint: "/api/v1/version", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(tc.enableCSP) + gateway.On("GetBuildInfo").Return(visor.BuildInfo{}) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: tc.appLoc, enableGUI: true}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + csp := rr.Header().Get("Content-Security-Policy") + require.Equal(t, tc.expectCSPHeader, csp) + }) + } +} diff --git a/src/api/cli/integration/empty.go b/src/api/integration/empty.go similarity index 100% rename from src/api/cli/integration/empty.go rename to src/api/integration/empty.go diff --git a/src/api/integration/integration_test.go b/src/api/integration/integration_test.go new file mode 100755 index 0000000..4464146 --- /dev/null +++ b/src/api/integration/integration_test.go @@ -0,0 +1,4019 @@ +// package integration_test implements API integration tests +package integration_test + +import ( + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "math" + "math/rand" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" //http,json helpers + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +/* Runs HTTP API tests against a running skycoin node + +Set envvar SKYCOIN_INTEGRATION_TESTS=1 to enable them +Set SKYCOIN_NODE_HOST to the node's address (defaults to http://127.0.0.1:6420) +Set SKYCOIN_INTEGRATION_TEST_MODE to either "stable" or "live" (defaults to "stable") + +Each test has two modes: + 1. against a stable, pinned blockchain + 2. against a live, active blockchain + +When running mode 1, API responses do not change. The exact responses are compared to saved responses on disk. +Make sure the skycoin node is running against the pinned blockchain data provided in this package's folder. + +When running mode 2, API responses may change (such as /coinSupply). The exact responses are not compared, +but the response is checked to be unmarshallable to a known JSON object. + +When update flag is set to true all tests pass +*/ + +const ( + testModeStable = "stable" + testModeLive = "live" + testModeDisableWalletAPI = "disable-wallet-api" + testModeEnableSeedAPI = "enable-seed-api" + testModeDisableGUI = "disable-gui" + + testFixturesDir = "testdata" +) + +type TestData struct { + actual interface{} + expected interface{} +} + +var update = flag.Bool("update", false, "update golden files") +var testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + +func nodeAddress() string { + addr := os.Getenv("SKYCOIN_NODE_HOST") + if addr == "" { + return "http://127.0.0.1:6420" + } + return addr +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, + testModeStable, + testModeDisableWalletAPI, + testModeEnableSeedAPI, + testModeDisableGUI: + default: + t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doDisableWalletAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableWalletAPI { + return true + } + + t.Skip("DisableWalletApi tests disabled") + return false +} + +func doEnableSeedAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeEnableSeedAPI { + return true + } + + t.Skip("EnableSeedAPI tests disabled") + return false +} + +func doDisableGUI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableGUI { + return true + } + + t.Skip("DisableGUIAPI tests disabled") + return false +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d := json.NewDecoder(f) + d.DisallowUnknownFields() + + err = d.Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + require.Equal(t, string(c), string(b)+"\n", "json struct output differs from golden file, was a field added to the struct?") +} + +func assertResponseError(t *testing.T, err error, errCode int, errMsg string) { + require.Error(t, err) + require.IsType(t, api.ClientError{}, err) + require.Equal(t, errCode, err.(api.ClientError).StatusCode) + require.Equal(t, errMsg, err.(api.ClientError).Message) +} + +func TestStableCoinSupply(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cs, err := c.CoinSupply() + require.NoError(t, err) + + var expected api.CoinSupply + checkGoldenFile(t, "coinsupply.golden", TestData{*cs, &expected}) +} + +func TestLiveCoinSupply(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cs, err := c.CoinSupply() + require.NoError(t, err) + + require.NotEmpty(t, cs.CurrentSupply) + require.NotEmpty(t, cs.TotalSupply) + require.NotEmpty(t, cs.MaxSupply) + require.Equal(t, "100000000.000000", cs.MaxSupply) + require.NotEmpty(t, cs.CurrentCoinHourSupply) + require.NotEmpty(t, cs.TotalCoinHourSupply) + require.Equal(t, 100, len(cs.UnlockedAddresses)+len(cs.LockedAddresses)) +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + v, err := c.Version() + require.NoError(t, err) + + require.NotEmpty(t, v.Version) +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addr string + errCode int + errMsg string + }{ + { + name: "valid address", + golden: "verify-address.golden", + addr: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }, + + { + name: "invalid address", + addr: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + errCode: http.StatusUnprocessableEntity, + errMsg: "Invalid checksum", + }, + + { + name: "missing address", + addr: "", + errCode: http.StatusBadRequest, + errMsg: "address is required", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyAddress(tc.addr) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected api.VerifyAddressResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } +} + +func TestStableVerifyTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + badSigStr := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSigBytes, err := hex.DecodeString(badSigStr) + require.NoError(t, err) + badSig := cipher.NewSig(badSigBytes) + + inputHash := "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e" + input := testutil.SHA256FromHex(t, inputHash) + + destAddrStr := "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD" + destAddr, err := cipher.DecodeBase58Address(destAddrStr) + require.NoError(t, err) + + inputAddrStr := "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5" + inputAddr, err := cipher.DecodeBase58Address(inputAddrStr) + require.NoError(t, err) + + badSignatureTxn := coin.Transaction{ + Sigs: []cipher.Sig{badSig}, + In: []cipher.SHA256{input}, + Out: []coin.TransactionOutput{ + { + Address: destAddr, + Coins: 1e3, + Hours: 10, + }, + { + Address: inputAddr, + Coins: 22100e6 - 1e3, + Hours: 188761, + }, + }, + } + badSignatureTxn.UpdateHeader() + + cases := []struct { + name string + golden string + txn coin.Transaction + errCode int + errMsg string + }{ + { + name: "invalid transaction empty", + txn: coin.Transaction{}, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "invalid transaction bad signature", + txn: badSignatureTxn, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature invalid for hash", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + encodedTxn := hex.EncodeToString(tc.txn.Serialize()) + + resp, err := c.VerifyTransaction(encodedTxn) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + if tc.errCode != http.StatusUnprocessableEntity { + return + } + } + + if tc.errCode != http.StatusUnprocessableEntity { + require.NoError(t, err) + } + + var expected api.VerifyTxnResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } + +} + +func TestStableOutputs(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + }, + golden: "outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + golden: "outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *visor.ReadableOutputSet + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected visor.ReadableOutputSet + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestLiveOutputs(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Request all outputs and check that HeadOutputs is not empty + // OutgoingOutputs and IncomingOutputs are variable and could be empty + outputs, err := c.Outputs() + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForAddresses(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForHashes(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) +} + +func TestStableBlock(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) +} + +func TestLiveBlock(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []uint64{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + c := api.NewClient(nodeAddress()) + for _, seq := range blockSeqs { + b, err := c.BlockBySeq(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + } +} + +func testKnownBlocks(t *testing.T) { + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found\n", + }, + { + name: "valid hash", + golden: "block-hash.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-0.golden", + seq: 0, + }, + { + name: "seq 100", + golden: "block-seq-100.golden", + seq: 100, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *visor.ReadableBlock + var err error + + if tc.hash != "" { + b, err = c.BlockByHash(tc.hash) + } else { + b, err = c.BlockBySeq(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + + var expected visor.ReadableBlock + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *visor.ReadableBlock + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-%d", i), func(t *testing.T) { + b, err := c.BlockBySeq(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +func TestStableBlockchainMetadata(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + var expected visor.BlockchainMetadata + checkGoldenFile(t, "blockchain-metadata.golden", TestData{*metadata, &expected}) +} + +func TestLiveBlockchainMetadata(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), metadata.Head.BkSeq) +} + +func TestStableBlockchainProgress(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var expected daemon.BlockchainProgress + checkGoldenFile(t, "blockchain-progress.golden", TestData{*progress, &expected}) +} + +func TestLiveBlockchainProgress(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), progress.Current) + require.True(t, progress.Current <= progress.Highest) + require.NotEmpty(t, progress.Peers) +} + +func TestStableBalance(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addrs []string + }{ + { + name: "unknown address", + addrs: []string{"prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9"}, + golden: "balance-noaddrs.golden", + }, + { + name: "one address", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "duplicate addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "two addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5"}, + golden: "balance-two-addrs.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + balance, err := c.Balance(tc.addrs) + require.NoError(t, err) + + var expected wallet.BalancePair + checkGoldenFile(t, tc.golden, TestData{*balance, &expected}) + }) + } +} + +func TestLiveBalance(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Genesis address check, should not have a balance + b, err := c.Balance([]string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}) + require.NoError(t, err) + require.Equal(t, wallet.BalancePair{}, *b) + + // Balance of final distribution address. Should have the same coins balance + // for the next 15-20 years. + b, err = c.Balance([]string{"ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}) + require.NoError(t, err) + require.Equal(t, b.Confirmed, b.Predicted) + require.NotEmpty(t, b.Confirmed.Hours) + require.Equal(t, uint64(1e6*1e6), b.Confirmed.Coins) + + // Check that the balance is queryable for addresses known to be affected + // by the coinhour overflow problem + addrs := []string{ + "n7AR1VMW1pK7F9TxhYdnr3HoXEQ3g9iTNP", + "2aTzmXi9jyiq45oTRFCP9Y7dcvnT6Rsp7u", + "FjFLnus2ePxuaPTXFXfpw6cVAE5owT1t3P", + "KT9vosieyWhn9yWdY8w7UZ6tk31KH4NAQK", + } + for _, a := range addrs { + _, err := c.Balance([]string{a}) + require.NoError(t, err, "Failed to get balance of address %s", a) + } + _, err = c.Balance(addrs) + require.NoError(t, err) +} + +func TestStableUxOut(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + uxID string + }{ + { + name: "valid uxID", + golden: "uxout.golden", + uxID: "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.UxOut(tc.uxID) + require.NoError(t, err) + + var expected historydb.UxOutJSON + checkGoldenFile(t, tc.golden, TestData{*ux, &expected}) + }) + } + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func TestLiveUxOut(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // A spent uxout should never change + ux, err := c.UxOut("fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20") + require.NoError(t, err) + + var expected historydb.UxOutJSON + checkGoldenFile(t, "uxout-spent.golden", TestData{*ux, &expected}) + require.NotEqual(t, uint64(0), ux.SpentBlockSeq) + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func scanUxOuts(t *testing.T) { + c := api.NewClient(nodeAddress()) + + outputs, err := c.Outputs() + require.NoError(t, err) + + for _, ux := range outputs.HeadOutputs { + t.Run(ux.Hash, func(t *testing.T) { + foundUx, err := c.UxOut(ux.Hash) + require.NoError(t, err) + + require.Equal(t, ux.Hash, foundUx.Uxid) + require.Equal(t, ux.Time, foundUx.Time) + require.Equal(t, ux.BkSeq, foundUx.SrcBkSeq) + require.Equal(t, ux.SourceTransaction, foundUx.SrcTx) + require.Equal(t, ux.Address, foundUx.OwnerAddress) + require.Equal(t, ux.Hours, foundUx.Hours) + coinsStr, err := droplet.ToString(foundUx.Coins) + require.NoError(t, err) + require.Equal(t, ux.Coins, coinsStr) + + if foundUx.SpentBlockSeq == 0 { + require.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) + } else { + require.NotEqual(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) + } + }) + } +} + +func TestStableAddressUxOuts(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + errCode int + errMsg string + golden string + addr string + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty\n", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + golden: "uxout-noaddr.golden", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + golden: "uxout-addr.golden", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + var expected []*historydb.UxOutJSON + checkGoldenFile(t, tc.golden, TestData{ux, &expected}) + }) + } +} + +func TestLiveAddressUxOuts(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + errCode int + errMsg string + addr string + moreThanZero bool + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty\n", + }, + { + name: "invalid address length", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid address length\n", + addr: "prRXwTcDK24hs6AFxj", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + if tc.moreThanZero { + require.NotEqual(t, 0, len(ux)) + } + }) + } +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + lastNBlocks := 10 + require.True(t, int(progress.Current) > lastNBlocks+1) + + cases := []struct { + name string + golden string + start int + end int + errCode int + errMsg string + }{ + { + name: "first 10", + golden: "blocks-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-last-10.golden", + start: int(progress.Current) - lastNBlocks, + end: int(progress.Current), + }, + { + name: "first block", + golden: "blocks-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-all.golden", + start: 0, + end: int(progress.Current), + }, + { + name: "start > end", + golden: "blocks-end-less-than-start.golden", + start: 10, + end: 9, + }, + { + name: "start negative", + start: -10, + end: 9, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid start value \"-10\"\n", + }, + { + name: "end negative", + start: 10, + end: -9, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid end value \"-9\"\n", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocks(t, tc.start, tc.end) + + var expected visor.ReadableBlocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.Blocks(tc.start, tc.end) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testBlocks(t, 1, 10) +} + +func testBlocks(t *testing.T, start, end int) *visor.ReadableBlocks { + c := api.NewClient(nodeAddress()) + + blocks, err := c.Blocks(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, end-start+1) + } + + var prevBlock *visor.ReadableBlock + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.Equal(t, uint64(idx+start), b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + blocks, err := c.LastBlocks(1) + require.NoError(t, err) + + var expected *visor.ReadableBlocks + checkGoldenFile(t, "block-last.golden", TestData{blocks, &expected}) + + var prevBlock *visor.ReadableBlock + blocks, err = c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + var prevBlock *visor.ReadableBlock + blocks, err := c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableNetworkConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkConnections() + require.NoError(t, err) + require.Empty(t, connections.Connections) + + connection, err := c.NetworkConnection("127.0.0.1:4444") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") + require.Nil(t, connection) +} + +func TestLiveNetworkConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkConnections() + require.NoError(t, err) + require.NotEmpty(t, connections.Connections) + + for _, cc := range connections.Connections { + connection, err := c.NetworkConnection(cc.Addr) + require.NoError(t, err) + require.NotEmpty(t, cc.Addr) + require.Equal(t, cc.Addr, connection.Addr) + require.Equal(t, cc.ID, connection.ID) + require.Equal(t, cc.ListenPort, connection.ListenPort) + require.Equal(t, cc.Mirror, connection.Mirror) + require.Equal(t, cc.Introduced, connection.Introduced) + require.Equal(t, cc.Outgoing, connection.Outgoing) + require.True(t, cc.LastReceived <= connection.LastReceived) + require.True(t, cc.LastSent <= connection.LastSent) + require.True(t, cc.Height >= 0) + } +} + +func TestNetworkDefaultConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkDefaultConnections() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-default-connections.golden", TestData{connections, &expected}) +} + +func TestNetworkTrustedConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkTrustedConnections() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-trusted-connections.golden", TestData{connections, &expected}) +} + +func TestStableNetworkExchangeableConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkExchangeableConnections() + require.NoError(t, err) + + var expected []string + checkGoldenFile(t, "network-exchangeable-connections.golden", TestData{connections, &expected}) +} + +func TestLiveNetworkExchangeableConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + _, err := c.NetworkExchangeableConnections() + require.NoError(t, err) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + goldenFile string + }{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txID is empty\n", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "./transaction.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + var expected *visor.ReadableTransaction + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, expected, &tx.Transaction) + }) + } +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + goldenFile string + }{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found\n", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty\n", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected *visor.ReadableTransaction + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, expected, &tx.Transaction) + }) + } +} + +func TestLiveTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.Transactions(addrs) + require.NoError(t, err) + require.True(t, len(*txns) > 0) +} + +func TestStableTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txId is empty\n", + }, + goldenFile: "./empty-addrs.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "./single-addr.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.Transactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + + ctxsSingle, err := c.ConfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(*ctxsSingle) > 0) + + ctxsAll, err := c.ConfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(*ctxsAll) > 0) + require.True(t, len(*ctxsAll) > len(*ctxsSingle)) +} + +func TestStableConfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "./empty-addrs.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "./single-addr.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.ConfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "./empty-addrs-unconfirmed-txs.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.UnconfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestLiveUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + + cTxsSingle, err := c.UnconfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(*cTxsSingle) >= 0) + + cTxsAll, err := c.UnconfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(*cTxsAll) >= 0) + require.True(t, len(*cTxsAll) >= len(*cTxsSingle)) +} + +func TestStableResendUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + c := api.NewClient(nodeAddress()) + res, err := c.ResendUnconfirmedTransactions() + require.NoError(t, err) + require.True(t, len(res.Txids) == 0) +} + +func TestLiveResendUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + _, err := c.ResendUnconfirmedTransactions() + require.NoError(t, err) +} + +func TestStableRawTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + rawTx string + }{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "not found", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found\n", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string\n", + }, + }, + { + name: "OK", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) + }) + } +} + +func TestLiveRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + rawTx string + }{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string\n", + }, + }, + { + name: "OK - genesis tx", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + { + name: "OK", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + rawTx: "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + cases := []struct { + name string + entropy int + numWords int + errCode int + errMsg string + }{ + { + name: "entropy 128", + entropy: 128, + numWords: 12, + }, + { + name: "entropy 256", + entropy: 256, + numWords: 24, + }, + { + name: "entropy 100", + entropy: 100, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - entropy length must be 128 or 256\n", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + seed, err := c.NewSeed(tc.entropy) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + words := strings.Split(seed, " ") + require.Len(t, words, tc.numWords) + + // no extra whitespace on the seed + require.Equal(t, seed, strings.TrimSpace(seed)) + + // should generate a different seed each time + seed2, err := c.NewSeed(tc.entropy) + require.NoError(t, err) + require.NotEqual(t, seed, seed2) + }) + } +} + +type addressTransactionsTestCase struct { + name string + address string + golden string + errCode int + errMsg string +} + +func TestStableAddressTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + address: "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + golden: "address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden", + }, + { + name: "address without transactions", + address: "2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9", + golden: "address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - invalid address\n", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.AddressTransactions(tc.address) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []daemon.ReadableTransaction + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestLiveAddressTransactions(t *testing.T) { + if !doLive(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + // This is the first distribution address which has spent all of its coins + // It's transactions list should not change, unless someone sends coins to it + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address without transactions", + // This is a randomly generated address, never used + // It should never see new transactions + // (if it ever does, somebody managed to generate this address for use and there is a serious bug) + address: "2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D", + golden: "address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - invalid address\n", + }, + } + + c := api.NewClient(nodeAddress()) + // Get current blockchain height + bp, err := c.BlockchainProgress() + require.NoError(t, err) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.AddressTransactions(tc.address) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []daemon.ReadableTransaction + loadGoldenFile(t, tc.golden, TestData{txns, &expected}) + + // Recaculate the height if it's live test + for i := range expected { + expected[i].Status.Height = bp.Current - expected[i].Status.BlockSeq + 1 + } + + require.Equal(t, expected, txns) + }) + } +} + +func TestStableRichlist(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + var expected api.Richlist + checkGoldenFile(t, "richlist-default.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all-include-distribution.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 8, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-8.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-150-include-distribution.golden", TestData{*richlist, &expected}) +} + +func TestLiveRichlist(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + require.NotEmpty(t, richlist.Richlist) + require.Len(t, richlist.Richlist, 20) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + require.Len(t, richlist.Richlist, 150) +} + +func TestStableAddressCount(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + count, err := c.AddressCount() + require.NoError(t, err) + + require.Equal(t, uint64(155), count) +} + +func TestLiveAddressCount(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + count, err := c.AddressCount() + require.NoError(t, err) + + // 5296 addresses as of 2018-03-06, the count could decrease but is unlikely to + require.True(t, count > 5000) +} + +func TestStablePendingTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + txns, err := c.PendingTransactions() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestLivePendingTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + _, err := c.PendingTransactions() + require.NoError(t, err) +} + +func TestLiveWalletSpend(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + w, totalCoins, _, password := prepareAndCheckWallet(t, c, 2e6, 2) + + tt := []struct { + name string + to string + coins uint64 + errMsg []byte + checkTx func(t *testing.T, tx *daemon.TransactionResult) + }{ + { + name: "send all coins to the first address", + to: w.Entries[0].Address.String(), + coins: totalCoins, + checkTx: func(t *testing.T, tx *daemon.TransactionResult) { + // Confirms the total output coins are equal to the totalCoins + var coins uint64 + for _, o := range tx.Transaction.Out { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + coins, err = coin.AddUint64(coins, c) + require.NoError(t, err) + } + + // Confirms the address balance are equal to the totalCoins + coins, _ = getAddressBalance(t, c, w.Entries[0].Address.String()) + require.Equal(t, totalCoins, coins) + }, + }, + { + // send 0.003 coin to the second address, + // this amount is chosen to not interfere with TestLiveWalletCreateTransaction + name: "send 0.003 coin to second address", + to: w.Entries[1].Address.String(), + coins: 3e3, + checkTx: func(t *testing.T, tx *daemon.TransactionResult) { + // Confirms there're two outputs, one to the second address, one as change output to the first address. + require.Len(t, tx.Transaction.Out, 2) + + // Gets the output of the second address in the transaction + getAddrOutputInTx := func(t *testing.T, tx *daemon.TransactionResult, addr string) *visor.ReadableTransactionOutput { + for _, output := range tx.Transaction.Out { + if output.Address == addr { + return &output + } + } + t.Fatalf("transaction doesn't have output to address: %v", addr) + return nil + } + + out := getAddrOutputInTx(t, tx, w.Entries[1].Address.String()) + + // Confirms the second address has 0.003 coin + require.Equal(t, out.Coins, "0.003000") + require.Equal(t, out.Address, w.Entries[1].Address.String()) + + coin, err := droplet.FromString(out.Coins) + require.NoError(t, err) + + // Gets the expected change coins + expectChangeCoins := totalCoins - coin + + // Gets the real change coins + changeOut := getAddrOutputInTx(t, tx, w.Entries[0].Address.String()) + changeCoins, err := droplet.FromString(changeOut.Coins) + require.NoError(t, err) + // Confirms the change coins are matched. + require.Equal(t, expectChangeCoins, changeCoins) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + result, err := c.Spend(w.Filename(), tc.to, tc.coins, password) + if err != nil { + t.Fatalf("spend failed: %v", err) + } + + tk := time.NewTicker(time.Second) + var tx *daemon.TransactionResult + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Waiting for transaction to be confirmed timeout") + case <-tk.C: + tx = getTransaction(t, c, result.Transaction.Hash) + if tx.Status.Confirmed { + break loop + } + } + } + tc.checkTx(t, tx) + }) + } + + // Return if wallet is encrypted, cause the rest of the tests will spend a lot of time. + if w.IsEncrypted() { + return + } + + // Confirms sending coins less than 0.001 is not allowed + errMsg := "500 Internal Server Error - Transaction violates soft constraint: invalid amount, too many decimal places\n" + for i := uint64(1); i < uint64(1000); i++ { + cs, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send invalid coin %v", cs) + t.Run(name, func(t *testing.T) { + result, err := c.Spend(w.Filename(), w.Entries[0].Address.String(), i, password) + if w.IsEncrypted() && len(password) == 0 { + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + return + } + assertResponseError(t, err, http.StatusInternalServerError, errMsg) + require.Nil(t, result) + }) + } +} + +func TestLiveWalletCreateTransactionSpecific(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + remainingHours := fee.RemainingHours(totalHours) + require.True(t, remainingHours > 1) + + addresses := make([]string, len(w.Entries)) + addressMap := make(map[string]struct{}, len(w.Entries)) + for i, e := range w.Entries { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + // Get all outputs + outputs, err := c.Outputs() + require.NoError(t, err) + + // Split outputs into those held by the wallet and those not + var walletOutputHashes []string + var walletOutputs visor.ReadableOutputs + walletAuxs := make(map[string][]string) + var nonWalletOutputs visor.ReadableOutputs + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletOutputHashes = append(walletOutputHashes, o.Hash) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } else { + nonWalletOutputs = append(nonWalletOutputs, o) + } + } + + require.NotEmpty(t, walletOutputs) + require.NotEmpty(t, nonWalletOutputs) + + unknownOutput := testutil.RandSHA256(t) + + toDropletString := func(i uint64) string { + x, err := droplet.ToString(i) + require.NoError(t, err) + return x + } + + defaultChangeAddress := w.Entries[0].Address.String() + + type testCase struct { + name string + req api.CreateTransactionRequest + outputs []coin.TransactionOutput + outputsSubset []coin.TransactionOutput + err string + code int + ignoreHours bool + additionalRespVerify func(t *testing.T, r *api.CreateTransactionResponse) + } + + cases := []testCase{ + { + name: "invalid decimals", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "0.0001", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - to[0].coins has too many decimal places\n", + code: http.StatusBadRequest, + }, + + { + name: "overflowing hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: "1", + }, + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64)), + }, + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64) - 1), + }, + }, + }, + err: "400 Bad Request - total output hours error: uint64 addition overflow\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient coins", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: fmt.Sprint(totalCoins + 1), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - balance is not sufficient\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: toDropletString(totalCoins), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "400 Bad Request - hours are not sufficient\n", + code: http.StatusBadRequest, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all, unspecified change address", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + // Address omitted -- will be check later in the test body + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + name: "valid request, manual one output with change, don't spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + Hours: "1", + }, + }, + }, + outputsSubset: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: 1e3, + Hours: 1, + }, + // NOTE: change omitted, + // change is too difficult to predict in this case, we are + // just checking that not all uxouts get spent in the transaction + }, + }, + + { + name: "valid request, manual one output no change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + // NOTE: no reliable way to test the ignore unconfirmed behavior, + // this test only checks that if IgnoreUnconfirmed is specified, + // the API doesn't throw up some parsing error + name: "valid request, manual one output no change, ignore unconfirmed", + req: api.CreateTransactionRequest{ + IgnoreUnconfirmed: true, + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + name: "valid request, auto one output no change, share factor recalculates to 1.0", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: remainingHours, + }, + }, + }, + + { + name: "valid request, auto two outputs with change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + }, + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 2e3), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: 1e3, + }, + { + Address: w.Entries[1].Address, + Coins: totalCoins - 2e3, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + }, + }, + ignoreHours: true, // the hours are too unpredictable + }, + + { + name: "uxout does not exist", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{unknownOutput.Hex()}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: fmt.Sprintf("400 Bad Request - unspent output of %s does not exist\n", unknownOutput.Hex()), + code: http.StatusBadRequest, + }, + + { + name: "uxout not held by the wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{nonWalletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - uxout is not owned by any address in the wallet\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient balance with uxouts", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{walletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins + 1e3), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - balance is not sufficient\n", + code: http.StatusBadRequest, + }, + + { + // NOTE: expects wallet to have multiple outputs with non-zero coins + name: "insufficient hours with uxouts", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{walletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "400 Bad Request - hours are not sufficient\n", + code: http.StatusBadRequest, + }, + + { + name: "valid request, uxouts specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + // NOTE: all uxouts are provided, which has the same behavior as + // not providing any uxouts or addresses. + // Using a subset of uxouts makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + UxOuts: walletOutputHashes, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + additionalRespVerify: func(t *testing.T, r *api.CreateTransactionResponse) { + require.Equal(t, len(walletOutputHashes), len(r.Transaction.In)) + }, + }, + + { + name: "specified addresses not in wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + Addresses: []string{testutil.MakeAddress().String()}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - address not found in wallet\n", + code: http.StatusBadRequest, + }, + + { + name: "valid request, addresses specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + // NOTE: all addresses are provided, which has the same behavior as + // not providing any addresses. + // Using a subset of addresses makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + Addresses: addresses, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + } + + if w.IsEncrypted() { + cases = append(cases, testCase{ + name: "invalid password", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password + "foo", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "401 Unauthorized - invalid password\n", + code: http.StatusUnauthorized, + }) + + cases = append(cases, testCase{ + name: "password not provided", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: "", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - missing password\n", + code: http.StatusBadRequest, + }) + + } else { + cases = append(cases, testCase{ + name: "password provided for unencrypted wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password + "foo", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - wallet is not encrypted\n", + code: http.StatusBadRequest, + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + result, err := c.CreateTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + d, err := json.MarshalIndent(result, "", " ") + require.NoError(t, err) + fmt.Println(string(d)) + + if len(tc.outputsSubset) == 0 { + require.Equal(t, len(tc.outputs), len(result.Transaction.Out)) + } + + for i, o := range tc.outputs { + // The final change output may not have the address specified, + // if the ChangeAddress was not specified in the wallet params. + // Calculate it automatically based upon the transaction inputs + if o.Address.Null() { + require.Equal(t, i, len(tc.outputs)-1) + require.Nil(t, tc.req.ChangeAddress) + + changeAddr := result.Transaction.Out[i].Address + // The changeAddr must be associated with one of the transaction inputs + changeAddrFound := false + for _, x := range result.Transaction.In { + require.NotNil(t, x.Address) + if changeAddr == x.Address { + changeAddrFound = true + break + } + } + + require.True(t, changeAddrFound) + } else { + require.Equal(t, o.Address.String(), result.Transaction.Out[i].Address) + } + + coins, err := droplet.FromString(result.Transaction.Out[i].Coins) + require.NoError(t, err) + require.Equal(t, o.Coins, coins, "[%d] %d != %d", i, o.Coins, coins) + + if !tc.ignoreHours { + hours, err := strconv.ParseUint(result.Transaction.Out[i].Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, o.Hours, hours, "[%d] %d != %d", i, o.Hours, hours) + } + } + + assertEncodeTxnMatchesTxn(t, result) + assertRequestedCoins(t, tc.req.To, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + if tc.req.HoursSelection.Type == wallet.HoursSelectionTypeManual { + assertRequestedHours(t, tc.req.To, result.Transaction.Out) + } + + if tc.additionalRespVerify != nil { + tc.additionalRespVerify(t, result) + } + }) + } +} + +func TestLiveWalletCreateTransactionRandom(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + if w.IsEncrypted() { + t.Skip("Skipping TestLiveWalletCreateTransactionRandom tests with encrypted wallet") + return + } + + remainingHours := fee.RemainingHours(totalHours) + require.True(t, remainingHours > 1) + + assertTxnOutputCount := func(t *testing.T, changeAddress string, nOutputs int, result *api.CreateTransactionResponse) { + nResultOutputs := len(result.Transaction.Out) + require.True(t, nResultOutputs == nOutputs || nResultOutputs == nOutputs+1) + hasChange := nResultOutputs == nOutputs+1 + changeOutput := result.Transaction.Out[nResultOutputs-1] + if hasChange { + require.Equal(t, changeOutput.Address, changeAddress) + } + + t.Log("hasChange", hasChange) + if hasChange { + t.Log("changeCoins", changeOutput.Coins) + t.Log("changeHours", changeOutput.Hours) + } + } + + iterations := 250 + maxOutputs := 10 + destAddrs := make([]cipher.Address, maxOutputs) + for i := range destAddrs { + destAddrs[i] = testutil.MakeAddress() + } + + for i := 0; i < iterations; i++ { + t.Log("iteration", i) + t.Log("totalCoins", totalCoins) + t.Log("totalHours", totalHours) + + spendableHours := fee.RemainingHours(totalHours) + t.Log("spendableHours", spendableHours) + + coins := rand.Intn(int(totalCoins)) + 1 + coins -= coins % int(visor.MaxDropletDivisor()) + if coins == 0 { + coins = int(visor.MaxDropletDivisor()) + } + hours := rand.Intn(int(spendableHours + 1)) + nOutputs := rand.Intn(maxOutputs) + 1 + + t.Log("sendCoins", coins) + t.Log("sendHours", hours) + + changeAddress := w.Entries[0].Address.String() + + shareFactor := strconv.FormatFloat(rand.Float64(), 'f', 8, 64) + + t.Log("shareFactor", shareFactor) + + to := make([]api.Receiver, 0, nOutputs) + remainingHours := hours + remainingCoins := coins + for i := 0; i < nOutputs; i++ { + if remainingCoins == 0 { + break + } + + receiver := api.Receiver{} + receiver.Address = destAddrs[rand.Intn(len(destAddrs))].String() + + if i == nOutputs-1 { + var err error + receiver.Coins, err = droplet.ToString(uint64(remainingCoins)) + require.NoError(t, err) + receiver.Hours = fmt.Sprint(remainingHours) + + remainingCoins = 0 + remainingHours = 0 + } else { + receiverCoins := rand.Intn(remainingCoins) + 1 + receiverCoins -= receiverCoins % int(visor.MaxDropletDivisor()) + if receiverCoins == 0 { + receiverCoins = int(visor.MaxDropletDivisor()) + } + + var err error + receiver.Coins, err = droplet.ToString(uint64(receiverCoins)) + require.NoError(t, err) + remainingCoins -= receiverCoins + + receiverHours := rand.Intn(remainingHours + 1) + receiver.Hours = fmt.Sprint(receiverHours) + remainingHours -= receiverHours + } + + to = append(to, receiver) + } + + // Remove duplicate outputs + dup := make(map[api.Receiver]struct{}, len(to)) + newTo := make([]api.Receiver, 0, len(dup)) + for _, o := range to { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newTo = append(newTo, o) + } + } + to = newTo + + nOutputs = len(to) + t.Log("nOutputs", nOutputs) + + rand.Shuffle(len(to), func(i, j int) { + to[i], to[j] = to[j], to[i] + }) + + for i, o := range to { + t.Logf("to[%d].Hours %s\n", i, o.Hours) + } + + autoTo := make([]api.Receiver, len(to)) + for i, o := range to { + autoTo[i] = api.Receiver{ + Address: o.Address, + Coins: o.Coins, + Hours: "", + } + } + + // Remove duplicate outputs + dup = make(map[api.Receiver]struct{}, len(autoTo)) + newAutoTo := make([]api.Receiver, 0, len(dup)) + for _, o := range autoTo { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newAutoTo = append(newAutoTo, o) + } + } + autoTo = newAutoTo + + nAutoOutputs := len(autoTo) + t.Log("nAutoOutputs", nAutoOutputs) + + for i, o := range autoTo { + t.Logf("autoTo[%d].Coins %s\n", i, o.Coins) + } + + // Auto, random share factor + + result, err := c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Auto, share factor 0 + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0", + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Check that the non-change outputs have 0 hours + for _, o := range result.Transaction.Out[:nAutoOutputs] { + require.Equal(t, "0", o.Hours) + } + + // Auto, share factor 1 + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "1", + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Check that the change output has 0 hours + if len(result.Transaction.Out) > nAutoOutputs { + require.Equal(t, "0", result.Transaction.Out[nAutoOutputs].Hours) + } + + // Manual + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: to, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nOutputs, result) + assertRequestedCoins(t, to, result.Transaction.Out) + assertRequestedHours(t, to, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + } +} + +func assertEncodeTxnMatchesTxn(t *testing.T, result *api.CreateTransactionResponse) { + require.NotEmpty(t, result.EncodedTransaction) + emptyTxn := &coin.Transaction{} + require.NotEqual(t, hex.EncodeToString(emptyTxn.Serialize()), result.EncodedTransaction) + txn, err := result.Transaction.ToTransaction() + require.NoError(t, err) + + serializedTxn := txn.Serialize() + require.Equal(t, hex.EncodeToString(serializedTxn), result.EncodedTransaction) + + require.Equal(t, int(txn.Length), len(serializedTxn)) +} + +func assertRequestedCoins(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + var requestedCoins uint64 + for _, o := range to { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + requestedCoins += c + } + + var sentCoins uint64 + for _, o := range out[:len(to)] { // exclude change output + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + sentCoins += c + } + + require.Equal(t, requestedCoins, sentCoins) +} + +func assertRequestedHours(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + for i, o := range out[:len(to)] { // exclude change output + toHours, err := strconv.ParseUint(to[i].Hours, 10, 64) + require.NoError(t, err) + + outHours, err := strconv.ParseUint(o.Hours, 10, 64) + + require.Equal(t, toHours, outHours) + } +} + +func assertCreatedTransactionValid(t *testing.T, r api.CreatedTransaction) { + require.NotEmpty(t, r.In) + require.NotEmpty(t, r.Out) + + fee, err := strconv.ParseUint(r.Fee, 10, 64) + require.NoError(t, err) + + require.NotEqual(t, uint64(0), fee) + + var inputHours uint64 + var inputCoins uint64 + for _, in := range r.In { + require.NotNil(t, in.CalculatedHours) + calculatedHours, err := strconv.ParseUint(in.CalculatedHours, 10, 64) + require.NoError(t, err) + inputHours, err = coin.AddUint64(inputHours, calculatedHours) + require.NoError(t, err) + + require.NotNil(t, in.Hours) + hours, err := strconv.ParseUint(in.Hours, 10, 64) + require.NoError(t, err) + + require.True(t, hours <= calculatedHours) + + require.NotNil(t, in.Coins) + coins, err := droplet.FromString(in.Coins) + require.NoError(t, err) + inputCoins, err = coin.AddUint64(inputCoins, coins) + require.NoError(t, err) + } + + var outputHours uint64 + var outputCoins uint64 + for _, out := range r.Out { + hours, err := strconv.ParseUint(out.Hours, 10, 64) + require.NoError(t, err) + outputHours, err = coin.AddUint64(outputHours, hours) + require.NoError(t, err) + + coins, err := droplet.FromString(out.Coins) + require.NoError(t, err) + outputCoins, err = coin.AddUint64(outputCoins, coins) + require.NoError(t, err) + } + + require.True(t, inputHours > outputHours) + require.Equal(t, inputHours-outputHours, fee) + + require.Equal(t, inputCoins, outputCoins) + + require.Equal(t, uint8(0), r.Type) + require.NotEmpty(t, r.Length) +} + +func TestCreateWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + w, seed, clean := createWallet(t, c, false, "", "") + defer clean() + require.False(t, w.Meta.Encrypted) + + walletDir := getWalletDir(t, c) + + // Confirms the wallet does exist + walletPath := filepath.Join(walletDir, w.Meta.Filename) + _, err := os.Stat(walletPath) + require.NoError(t, err) + + // Loads the wallet and confirms that the wallet has the same seed + lw, err := wallet.Load(walletPath) + require.NoError(t, err) + require.False(t, lw.IsEncrypted()) + require.Equal(t, seed, lw.Meta["seed"]) + require.Equal(t, len(w.Entries), len(lw.Entries)) + + for i := range w.Entries { + require.Equal(t, w.Entries[i].Address, lw.Entries[i].Address.String()) + require.Equal(t, w.Entries[i].Public, lw.Entries[i].Public.Hex()) + } + + // Creates wallet with encryption + encW, _, encWClean := createWallet(t, c, true, "pwd", "") + defer encWClean() + require.True(t, encW.Meta.Encrypted) + + walletPath = filepath.Join(walletDir, encW.Meta.Filename) + encLW, err := wallet.Load(walletPath) + require.NoError(t, err) + + // Confirms the loaded wallet is encrypted and has the same address entries + require.True(t, encLW.IsEncrypted()) + require.Equal(t, len(encW.Entries), len(encLW.Entries)) + + for i := range encW.Entries { + require.Equal(t, encW.Entries[i].Address, encLW.Entries[i].Address.String()) + require.Equal(t, encW.Entries[i].Public, encLW.Entries[i].Public.Hex()) + } +} + +func TestGetWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create a wallet + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + // Confirms the wallet can be acquired + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, *w, *w1) +} + +func TestGetWallets(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Creates 2 new wallets + var ws []api.WalletResponse + for i := 0; i < 2; i++ { + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + // cleaners = append(cleaners, clean) + ws = append(ws, *w) + } + + // Gets wallet from node + wlts, err := c.Wallets() + require.NoError(t, err) + + // Create the wallet map + walletMap := make(map[string]api.WalletResponse) + for _, w := range wlts { + walletMap[w.Meta.Filename] = *w + } + + // Confirms the returned wallets contains the wallet we created. + for _, w := range ws { + retW, ok := walletMap[w.Meta.Filename] + require.True(t, ok) + require.Equal(t, w, retW) + } +} + +// TestWalletNewAddress will generate 30 wallets for testing, and they will +// be removed automatically after testing. +func TestWalletNewAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // We only test 30 cases, cause the more addresses we generate, the longer + // it takes, we don't want to spend much time here. + for i := 1; i <= 30; i++ { + name := fmt.Sprintf("generate %v addresses", i) + t.Run(name, func(t *testing.T) { + c := api.NewClient(nodeAddress()) + var encrypt bool + var password string + // Test wallet with encryption only when i == 2, so that + // the tests won't time out. + if i == 2 { + encrypt = true + password = "pwd" + } + + w, seed, clean := createWallet(t, c, encrypt, password, "") + defer clean() + + addrs, err := c.NewWalletAddress(w.Meta.Filename, i, password) + if err != nil { + t.Fatalf("%v", err) + return + } + require.NoError(t, err) + + seckeys := cipher.GenerateDeterministicKeyPairs([]byte(seed), i+1) + var as []string + for _, k := range seckeys { + as = append(as, cipher.AddressFromSecKey(k).String()) + } + + // Confirms thoses new generated addresses are the same. + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + }) + } +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "casino away claim road artist where blossom warrior demise royal still palm") + defer clean() + + bp, err := c.WalletBalance(w.Meta.Filename) + require.NoError(t, err) + + var expect api.BalanceResponse + checkGoldenFile(t, "wallet-balance.golden", TestData{*bp, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + _, walletName, _ := getWalletFromEnv(t, c) + bp, err := c.WalletBalance(walletName) + require.NoError(t, err) + require.NotNil(t, bp) + require.NotNil(t, bp.Addresses) +} + +func TestWalletUpdate(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + err := c.UpdateWallet(w.Meta.Filename, "new wallet") + require.NoError(t, err) + + // Confirms the wallet has label of "new wallet" + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w1.Meta.Label, "new wallet") +} + +func TestStableWalletTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + txns, err := c.WalletTransactions(w.Meta.Filename) + require.NoError(t, err) + + var expect api.UnconfirmedTxnsResponse + checkGoldenFile(t, "wallet-transactions.golden", TestData{*txns, &expect}) +} + +func TestLiveWalletTransactions(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletTransactions(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestWalletFolderName(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + folderName, err := c.WalletFolderName() + require.NoError(t, err) + + require.NotNil(t, folderName) + require.NotEmpty(t, folderName.Address) +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create a unencrypted wallet + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + // Encrypts the wallet + rlt, err := c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.NotEmpty(t, rlt.Meta.CryptoType) + require.True(t, rlt.Meta.Encrypted) + + // Encrypt the wallet again, should returns error + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is encrypted\n") + + // Confirms that no sensitive data do exist in wallet file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + require.Empty(t, lw.Meta["seed"]) + require.Empty(t, lw.Meta["lastSeed"]) + require.NotEmpty(t, lw.Meta["secrets"]) + + // Decrypts the wallet, and confirms that the + // seed and address entries are the same as it was before being encrypted. + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.Equal(t, w, dw) +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, seed, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + // Decrypt wallet with different password, must fail + _, err := c.DecryptWallet(w.Meta.Filename, "pwd1") + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") + + // Decrypt wallet with no password, must fail + _, err = c.DecryptWallet(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + + // Decrypts wallet with correct password + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms that no sensitive data are returned + require.Empty(t, dw.Meta.CryptoType) + require.False(t, dw.Meta.Encrypted) + + // Loads wallet from file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + + require.Equal(t, lw.Meta["seed"], seed) + require.Len(t, lw.Entries, 1) + + // Confirms the last seed is matched + lseed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 1) + require.Equal(t, hex.EncodeToString(lseed), lw.Meta["lastSeed"]) + + // Confirms that the first address is derivied from the private key + pubkey := cipher.PubKeyFromSecKey(seckeys[0]) + require.Equal(t, w.Entries[0].Address, cipher.AddressFromPubKey(pubkey).String()) + require.Equal(t, lw.Entries[0].Address.String(), w.Entries[0].Address) +} + +func TestGetWalletSeedDisabledAPI(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create an encrypted wallet + w, _, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + _, err := c.GetWalletSeed(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusForbidden, "403 Forbidden\n") +} + +func TestGetWalletSeedEnabledAPI(t *testing.T) { + if !doEnableSeedAPI(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create an encrypted wallet + w, seed, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + require.NotEmpty(t, seed) + + sd, err := c.GetWalletSeed(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms the seed are matched + require.Equal(t, seed, sd) + + // Get seed of wrong wallet id + _, err = c.GetWalletSeed("w.wlt", "pwd") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") + + // Check with invalid password + _, err = c.GetWalletSeed(w.Meta.Filename, "wrong password") + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") + + // Check with missing password + _, err = c.GetWalletSeed(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + + // Create unencrypted wallet to check against + nw, _, nclean := createWallet(t, c, false, "", "") + defer nclean() + _, err = c.GetWalletSeed(nw.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is not encrypted\n") +} + +// prepareAndCheckWallet gets wallet from environment, and confirms: +// 1. The minimal coins and coin hours requirements are met. +// 2. The wallet has at least two address entry. +// Returns the loaded wallet, total coins, total coin hours and password of the wallet. +func prepareAndCheckWallet(t *testing.T, c *api.Client, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64, string) { + walletDir, walletName, password := getWalletFromEnv(t, c) + walletPath := filepath.Join(walletDir, walletName) + + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet %v doesn't exist", walletPath) + } + + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet %v failed: %v", walletPath, err) + } + + if w.IsEncrypted() && password == "" { + t.Fatalf("Wallet is encrypted, must set WALLET_PASSWORD env var") + } + + // Generate more addresses if address entries less than 2. + if len(w.Entries) < 2 { + _, err := c.NewWalletAddress(w.Filename(), 2-len(w.Entries), password) + if err != nil { + t.Fatalf("New wallet address failed: %v", err) + } + + w, err = wallet.Load(walletPath) + if err != nil { + t.Fatalf("Reload wallet %v failed: %v", walletPath, err) + } + } + + coins, hours := getWalletBalance(t, c, walletName) + if coins < miniCoins { + t.Fatalf("Wallet must have at least %d coins", miniCoins) + } + + if hours < miniCoinHours { + t.Fatalf("Wallet must have at least %d coin hours", miniCoinHours) + } + + if err := w.Save(walletDir); err != nil { + t.Fatalf("%v", err) + } + + return w, coins, hours, password +} + +// getWalletFromEnv loads wallet from envrionment variables. +// Returns wallet dir, wallet name and wallet password is any. +func getWalletFromEnv(t *testing.T, c *api.Client) (string, string, string) { + walletDir := getWalletDir(t, c) + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("Missing WALLET_NAME environment value") + } + + walletPassword := os.Getenv("WALLET_PASSWORD") + return walletDir, walletName, walletPassword +} + +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } +} + +// getWalletBalance gets wallet balance. +// Returns coins and hours +func getWalletBalance(t *testing.T, c *api.Client, walletName string) (uint64, uint64) { + wp, err := c.WalletBalance(walletName) + if err != nil { + t.Fatalf("Get wallet balance of %v failed: %v", walletName, err) + } + + return wp.Confirmed.Coins, wp.Confirmed.Hours +} + +func getTransaction(t *testing.T, c *api.Client, txid string) *daemon.TransactionResult { + tx, err := c.Transaction(txid) + if err != nil { + t.Fatalf("%v", err) + } + + return tx +} + +// getAddressBalance gets balance of given address. +// Returns coins and coin hours. +func getAddressBalance(t *testing.T, c *api.Client, addr string) (uint64, uint64) { // nolint: unparam + bp, err := c.Balance([]string{addr}) + if err != nil { + t.Fatalf("%v", err) + } + return bp.Confirmed.Coins, bp.Confirmed.Hours +} + +// createWallet creates a wallet with rand seed. +// Returns the generated wallet, seed and clean up function. +func createWallet(t *testing.T, c *api.Client, encrypt bool, password string, seed string) (*api.WalletResponse, string, func()) { + if seed == "" { + seed = hex.EncodeToString(cipher.RandByte(32)) + } + // Use the first 6 letter of the seed as label. + var w *api.WalletResponse + var err error + if encrypt { + w, err = c.CreateEncryptedWallet(seed, seed[:6], password, 0) + } else { + w, err = c.CreateUnencryptedWallet(seed, seed[:6], 0) + } + + require.NoError(t, err) + + walletDir := getWalletDir(t, c) + + return w, seed, func() { + // Cleaner function to delete the wallet and bak wallet + walletPath := filepath.Join(walletDir, w.Meta.Filename) + err = os.Remove(walletPath) + require.NoError(t, err) + + bakWalletPath := walletPath + ".bak" + if _, err := os.Stat(bakWalletPath); !os.IsNotExist(err) { + // Return directly if no .bak file does exist + err = os.Remove(bakWalletPath) + } + + require.NoError(t, err) + + // Removes the wallet from memory + c.UnloadWallet(w.Meta.Filename) + } +} + +func getWalletDir(t *testing.T, c *api.Client) string { + wf, err := c.WalletFolderName() + if err != nil { + t.Fatalf("%v", err) + } + return wf.Address +} + +func TestDisableWalletApi(t *testing.T) { + if !doDisableWalletAPI(t) { + return + } + + changeAddress := testutil.MakeAddress().String() + + type testCase struct { + name string + method string + endpoint string + contentType string + body func() io.Reader + json func() interface{} + expectErr string + code int + } + + tt := []testCase{ + { + name: "get wallet", + method: http.MethodGet, + endpoint: "/api/v1/wallet?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "create wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/create", + body: func() io.Reader { + v := url.Values{} + v.Add("seed", "seed") + v.Add("label", "label") + v.Add("scan", "1") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "generate new address", + method: http.MethodPost, + endpoint: "/api/v1/wallet/newAddress", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet balance", + method: http.MethodGet, + endpoint: "/api/v1/wallet/balance?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "wallet spending", + method: http.MethodPost, + endpoint: "/api/v1/wallet/spend", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("coins", "100000") // 1e5 + v.Add("dst", "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet unconfirmed transactions", + method: http.MethodGet, + endpoint: "/api/v1/wallet/transactions?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "update wallet label", + method: http.MethodPost, + endpoint: "/api/v1/wallet/update", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("label", "label") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodGet, + endpoint: "/api/v1/wallet/newSeed", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallets", + method: http.MethodGet, + endpoint: "/api/v1/wallets", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallets folder name", + method: http.MethodGet, + endpoint: "/api/v1/wallets/folderName", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "main index.html 404 not found", + method: http.MethodGet, + endpoint: "/api/v1/", + expectErr: "404 Not Found\n", + code: http.StatusNotFound, + }, + { + name: "encrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/encrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "decrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/decrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "create transaction", + method: http.MethodPost, + endpoint: "/api/v1/wallet/transaction", + contentType: "application/json", + json: func() interface{} { + return api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: "test.wlt", + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + { + Address: changeAddress, + Coins: "0.001", + Hours: "1", + }, + }, + } + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range tt { + f := func(tc testCase) func(t *testing.T) { + return func(t *testing.T) { + var err error + switch tc.method { + case http.MethodGet: + err = c.Get(tc.endpoint, nil) + case http.MethodPost: + switch tc.contentType { + case "application/json": + err = c.PostJSON(tc.endpoint, tc.json(), nil) + default: + err = c.PostForm(tc.endpoint, tc.body(), nil) + } + } + assertResponseError(t, err, tc.code, tc.expectErr) + } + } + + t.Run(tc.name, f(tc)) + + if strings.HasPrefix(tc.endpoint, "/api/v1") { + tc.endpoint = strings.TrimPrefix(tc.endpoint, "/api/v1") + t.Run(tc.name, f(tc)) + } + } + + // Confirms that no new wallet is created + // WALLET_DIR environment variable is set in ci-script/integration-test-disable-wallet-api.sh + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("WALLET_DIR is not set") + } + + // Confirms that the wallet directory does not exist + _, err := os.Stat(walletDir) + require.True(t, os.IsNotExist(err)) +} + +func checkHealthResponse(t *testing.T, r *api.HealthResponse) { + require.NotEmpty(t, r.BlockchainMetadata.Unspents) + require.NotEmpty(t, r.BlockchainMetadata.Head.BkSeq) + require.NotEmpty(t, r.BlockchainMetadata.Head.Time) + require.NotEmpty(t, r.Version.Version) + require.True(t, r.Uptime.Duration > time.Duration(0)) +} + +func TestStableHealth(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.Equal(t, 0, r.OpenConnections) + + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + // The stable node is always run with the commit and branch ldflags, so they should appear + require.NotEmpty(t, r.Version.Commit) + require.NotEmpty(t, r.Version.Branch) +} + +func TestLiveHealth(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.NotEqual(t, 0, r.OpenConnections) + + // The TimeSinceLastBlock can be any value, including negative values, due to clock skew + // The live node is not necessarily run with the commit and branch ldflags, so don't check them +} + +func TestDisableGUIAPI(t *testing.T) { + if !doDisableGUI(t) { + return + } + + c := api.NewClient(nodeAddress()) + err := c.Get("/", nil) + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") +} diff --git a/src/api/cli/integration/test-fixtures/wallet-history.golden b/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/wallet-history.golden rename to src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden diff --git a/src/gui/integration/test-fixtures/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden b/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden similarity index 100% rename from src/gui/integration/test-fixtures/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden rename to src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden diff --git a/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden b/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden new file mode 100755 index 0000000..f563060 --- /dev/null +++ b/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden @@ -0,0 +1,631 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1, + "unknown": false + }, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "fee": 100037880222122, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100037880222222 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } +] diff --git a/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100755 index 0000000..ff5a323 --- /dev/null +++ b/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,6892 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46450, + "block_seq": 1, + "unknown": false + }, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "fee": 100037880222122, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100037880222222 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46449, + "block_seq": 2, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "timestamp": 1427927651, + "fee": 349722, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 349723 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46448, + "block_seq": 3, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "timestamp": 1427927671, + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46447, + "block_seq": 4, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "timestamp": 1428793611, + "fee": 240538336, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 240542040 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46446, + "block_seq": 5, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "timestamp": 1428798821, + "fee": 1449243, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2419 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 1450897 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46434, + "block_seq": 17, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "timestamp": 1428989855, + "fee": 49022445, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 53063235 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46433, + "block_seq": 18, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "timestamp": 1428989925, + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46425, + "block_seq": 26, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "timestamp": 1429011077, + "fee": 8799264, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 9935082 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 58 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46424, + "block_seq": 27, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "timestamp": 1429011137, + "fee": 442618, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 584602 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46413, + "block_seq": 38, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "timestamp": 1429058484, + "fee": 12441684, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 13220174 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46412, + "block_seq": 39, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "timestamp": 1429058494, + "fee": 294709, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 392019 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46411, + "block_seq": 40, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "timestamp": 1429058514, + "fee": 41986, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 54148 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46410, + "block_seq": 41, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "timestamp": 1429058524, + "fee": 7279, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 8799 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46406, + "block_seq": 45, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "timestamp": 1429071074, + "fee": 2580615, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3381555 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46405, + "block_seq": 46, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "timestamp": 1429077374, + "fee": 1953736, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 2053852 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46404, + "block_seq": 47, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "timestamp": 1429077384, + "fee": 40168, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 52682 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46403, + "block_seq": 48, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "timestamp": 1429077394, + "fee": 7317, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 8881 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46402, + "block_seq": 49, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "timestamp": 1429077404, + "fee": 3212, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 3406 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46398, + "block_seq": 53, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "timestamp": 1429077514, + "fee": 23036, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 28964 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46394, + "block_seq": 57, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "timestamp": 1429077584, + "fee": 17952, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 21314 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46390, + "block_seq": 61, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "timestamp": 1429077654, + "fee": 16974, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 20012 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46387, + "block_seq": 64, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "timestamp": 1429077694, + "fee": 9642, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 11982 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46384, + "block_seq": 67, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "timestamp": 1429077874, + "fee": 45303, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 48207 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46383, + "block_seq": 68, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "timestamp": 1429077914, + "fee": 11531, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 11893 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46382, + "block_seq": 69, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "timestamp": 1429077944, + "fee": 7959, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 8003 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46381, + "block_seq": 70, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "timestamp": 1429077964, + "fee": 5094, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 5098 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46380, + "block_seq": 71, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "timestamp": 1429077974, + "fee": 2470, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2470 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46374, + "block_seq": 77, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "timestamp": 1429147880, + "fee": 14818951, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 16772585 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46370, + "block_seq": 81, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "timestamp": 1429164440, + "fee": 4694075, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 4945467 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46366, + "block_seq": 85, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "timestamp": 1429164620, + "fee": 128383, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 168783 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46365, + "block_seq": 86, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "timestamp": 1429164720, + "fee": 39068, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 44118 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46361, + "block_seq": 90, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "timestamp": 1429164810, + "fee": 18618, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 24026 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46357, + "block_seq": 94, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "timestamp": 1429164870, + "fee": 13363, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 17021 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46353, + "block_seq": 98, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "timestamp": 1429274566, + "fee": 26123869, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 26147565 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46352, + "block_seq": 99, + "unknown": false + }, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "timestamp": 1429274616, + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46350, + "block_seq": 101, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "timestamp": 1429274666, + "fee": 720560, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823465 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46345, + "block_seq": 106, + "unknown": false + }, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "timestamp": 1429279796, + "fee": 1140626, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 1258331 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11920 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7581 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 141380 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46344, + "block_seq": 107, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "timestamp": 1429280596, + "fee": 301137, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 335959 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46342, + "block_seq": 109, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "timestamp": 1429302756, + "fee": 5450278, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 5464462 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46340, + "block_seq": 111, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "timestamp": 1429348072, + "fee": 150348, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 154810 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46339, + "block_seq": 112, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "timestamp": 1429348102, + "fee": 8340296, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11115602 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2314 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46338, + "block_seq": 113, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "timestamp": 1429348172, + "fee": 1058600, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1405802 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46337, + "block_seq": 114, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "timestamp": 1429348502, + "fee": 210299, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 253699 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46336, + "block_seq": 115, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "timestamp": 1429348712, + "fee": 67241, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 72665 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46334, + "block_seq": 117, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "timestamp": 1429351912, + "fee": 737315, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 779245 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46330, + "block_seq": 121, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "timestamp": 1429382678, + "fee": 6644094, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 7401386 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46329, + "block_seq": 122, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "timestamp": 1429382898, + "fee": 332972, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 427632 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46328, + "block_seq": 123, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "timestamp": 1429451746, + "fee": 14677172, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 14689004 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46327, + "block_seq": 124, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "timestamp": 1429522086, + "fee": 14768022, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 14769500 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46326, + "block_seq": 125, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "timestamp": 1429578056, + "fee": 11670300, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 11670484 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46324, + "block_seq": 127, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "timestamp": 1429848410, + "fee": 4600910, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1767312 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3890350 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46323, + "block_seq": 128, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "timestamp": 1429849170, + "fee": 42124753, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55585992 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528397 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46320, + "block_seq": 131, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "timestamp": 1430330041, + "fee": 80047494, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 105466512 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46319, + "block_seq": 132, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "timestamp": 1430330311, + "fee": 9587333, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12764709 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46318, + "block_seq": 133, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "timestamp": 1430330421, + "fee": 1213974, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1611146 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46317, + "block_seq": 134, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "timestamp": 1430330481, + "fee": 161181, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 210827 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46316, + "block_seq": 135, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "timestamp": 1430330591, + "fee": 41059, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 47263 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46315, + "block_seq": 136, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "timestamp": 1430330851, + "fee": 55295, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 56069 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46314, + "block_seq": 137, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "timestamp": 1430504186, + "fee": 35264333, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 35264429 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46313, + "block_seq": 138, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "timestamp": 1430504236, + "fee": 10194, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 10206 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46312, + "block_seq": 139, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "timestamp": 1430504536, + "fee": 60856, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 60856 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46311, + "block_seq": 140, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "timestamp": 1430504746, + "fee": 42536, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 42536 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46310, + "block_seq": 141, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "timestamp": 1430504846, + "fee": 20227, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 20227 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46309, + "block_seq": 142, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "timestamp": 1430504966, + "fee": 24190, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 24190 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46308, + "block_seq": 143, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "timestamp": 1430505086, + "fee": 24156, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 24156 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46307, + "block_seq": 144, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "timestamp": 1430505176, + "fee": 18105, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 18105 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46305, + "block_seq": 146, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "timestamp": 1430641376, + "fee": 25062898, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 27361066 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46304, + "block_seq": 147, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "timestamp": 1430641536, + "fee": 893911, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1181181 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46303, + "block_seq": 148, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "timestamp": 1430642006, + "fee": 201883, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 237791 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46302, + "block_seq": 149, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "timestamp": 1430642106, + "fee": 33471, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 37959 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46301, + "block_seq": 150, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "timestamp": 1430642306, + "fee": 41639, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 42199 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46300, + "block_seq": 151, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "timestamp": 1430642426, + "fee": 24180, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 24250 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46299, + "block_seq": 152, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "timestamp": 1430642546, + "fee": 23963, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 23971 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46298, + "block_seq": 153, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "timestamp": 1430642816, + "fee": 53786, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 53786 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46297, + "block_seq": 154, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "timestamp": 1430643706, + "fee": 177035, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 177035 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46296, + "block_seq": 155, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "timestamp": 1430643906, + "fee": 39727, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 39727 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46295, + "block_seq": 156, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "timestamp": 1430644036, + "fee": 25812, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 25812 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46294, + "block_seq": 157, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "timestamp": 1430673946, + "fee": 5930488, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 5930488 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46293, + "block_seq": 158, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "timestamp": 1430674696, + "fee": 144958, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 144958 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46292, + "block_seq": 159, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "timestamp": 1430715196, + "fee": 7546500, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 7546500 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46291, + "block_seq": 160, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "timestamp": 1430784172, + "fee": 12731130, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 12731130 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46290, + "block_seq": 161, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "timestamp": 1430784312, + "fee": 25801, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 25801 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46289, + "block_seq": 162, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "timestamp": 1430784372, + "fee": 11041, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 11041 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46288, + "block_seq": 163, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "timestamp": 1430784932, + "fee": 103026, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 103026 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46287, + "block_seq": 164, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "timestamp": 1430790052, + "fee": 940535, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 940535 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46286, + "block_seq": 165, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "timestamp": 1430790152, + "fee": 18342, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 18342 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46284, + "block_seq": 167, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "timestamp": 1430791902, + "fee": 253195, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 320499 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46283, + "block_seq": 168, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "timestamp": 1430792072, + "fee": 56369, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 64781 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46280, + "block_seq": 171, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "timestamp": 1430870562, + "fee": 12326841, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 14355099 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46278, + "block_seq": 173, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "timestamp": 1430871512, + "fee": 930183, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1185063 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46276, + "block_seq": 175, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "timestamp": 1430908702, + "fee": 6658374, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 6695090 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46272, + "block_seq": 179, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "timestamp": 1431339429, + "fee": 63843789, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 74887085 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46270, + "block_seq": 181, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "timestamp": 1431757585, + "fee": 65605413, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 77037939 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46267, + "block_seq": 184, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a230d5b5b745bb51d40e86b11e6508dc84a486f5ffd3584b0d45818ab8520802", + "inner_hash": "e6acee381aaefcd94f28b3a7ef5e6c34232fd5e78e96816d71c9c60248d6c5c6", + "timestamp": 1432327272, + "fee": 93088328, + "sigs": [ + "2e70883dc210920e639b5f22efd820a5f04b5290bc65b6ef4c52cd6283ef7a2e580fec499d33a71700a61dcab9200ee09a08a695affa9c12ef00d6d07cb0164001" + ], + "inputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 101566100 + } + ], + "outputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886 + }, + { + "uxid": "d66dad2d285942e38e13fd5d921cd142e86489a16b0f83ece7249e72704f6536", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "40000.000000", + "hours": 4238886 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46261, + "block_seq": 190, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "655651b51d288fae2ca80dd8231fbc8927e7f0203d698bdf0dc47e1e9c63652d", + "inner_hash": "472ae342c5dcb47ec7cf0b63fba1414d5e4a32c63e974ce390d55fb668972151", + "timestamp": 1433229543, + "fee": 109516348, + "sigs": [ + "7dfbaddfb6b73fd84f23644a755c025b8480ab8754ad2e1a1c95d53ff52ed87e45030465ead44995235678e6e53ead91926da4af940367bef53ba7ae229edb7901" + ], + "inputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886, + "calculated_hours": 146020748 + } + ], + "outputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200 + }, + { + "uxid": "8cb546636d5039df6d4bda41a10322ea6dcd0fa0c766d3e2f45a6f30040765e0", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "600.000000", + "hours": 18252200 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46259, + "block_seq": 192, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cff22d57daf828015489bba3b01538369f5627cc89ad0f139261bb0be0dac4a8", + "inner_hash": "4fd9cd0aab064ef8cf67e2b6b0102aa1cd4df52cf60b00206cc7b5619bcf5acc", + "timestamp": 1433331745, + "fee": 28712805, + "sigs": [ + "36a79d8ce7050bf1df11c9e839ecbb75f889161c7f3a81539a5da630953dad30159d0db804123c48f3bcabe2314887614bd57be64f951f7162ffc08f5810d23101" + ], + "inputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200, + "calculated_hours": 34295075 + } + ], + "outputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135 + }, + { + "uxid": "79fc203078f4a201ed7bfb09977a75a5b22794645606aef22824d3fda9285932", + "dst": "2fcUG6oQSsaWZK9Crqkh6LzGfZexqUqtHWg", + "coins": "1000.000000", + "hours": 2791135 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46258, + "block_seq": 193, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1b83454b4e61348b9c643815c26350b4e34796170593895961f329a759cbadf8", + "inner_hash": "d551018fa96bcf1df6ae0136f75bfb5db002e6e41723fa80ab4fb5a1857bfcde", + "timestamp": 1433334775, + "fee": 2568137, + "sigs": [ + "9c02e3b3c6cc517badf9a4408bb9bf9d8d72fad0e2cc3f04f2e176bcfc2a7fee1b4740c4bc4eaa4ae008a9a18eda3f0cace91199613b14d2c34178cca1ac8ac500" + ], + "inputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135, + "calculated_hours": 3265919 + } + ], + "outputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891 + }, + { + "uxid": "6a349ba12c5d2827de6c24773d3dd8f6572e86adba4c8954a6d6e68df9e165e2", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "2400.000000", + "hours": 348891 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46256, + "block_seq": 195, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fa7a60f6d4a22404e28ce9d1600442c19237552d8678bd610793cb8e6b3353d4", + "inner_hash": "cc33e2831789b20ec4eb187a6b44a9f772aa243f3f5f6262cb46087a0a6ac3f5", + "timestamp": 1437050608, + "fee": 495228940, + "sigs": [ + "9b8e90365377deb3da537fdda4653f117c1c7de525b611d9d07f23139b5d4c642af80ad70779aa012b6399e73af8e08e87952f085edf8060f0832635e3244cb400" + ], + "inputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891, + "calculated_hours": 580122056 + } + ], + "outputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558 + }, + { + "uxid": "054e39b1d37f10a4e1ee6598d66bd7cdd8f97b5ef0de2666120ef710c053af98", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "100.000000", + "hours": 42446558 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46254, + "block_seq": 197, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b18ed75097ed7910315e3be9042c0ca0b734d30a1afb8f9346bbe18acddd3a8a", + "inner_hash": "847e1acbed683214ad9e0fe164204db0ae8f2ce1cc420cb25aa63c76a4739580", + "timestamp": 1437051128, + "fee": 31904730, + "sigs": [ + "523ef82bcc586c5c885ca0fc7f2ffe5057573556a8bfaa3d9eb30b6316e698e93ac11a9e0d8a3c2a8ace763d80edd8e059153b61a4a35fa6f0b214d8ba0c485d00" + ], + "inputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558, + "calculated_hours": 42527678 + } + ], + "outputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474 + }, + { + "uxid": "bd55382fd8ca5b623b167dd7180ee0165eca5e74a6b2be453536ce8b5e1231e0", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "34080.000000", + "hours": 5311474 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46253, + "block_seq": 198, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cd6fae6c021e64768cbb2e0a17ec6853db94b5dde52b417f872371dc3c24a27f", + "inner_hash": "8dde5734f617c1313288ac9d1b762a7d1e88b68846945b83c35935bcce1fdd8a", + "timestamp": 1437139506, + "fee": 16933928, + "sigs": [ + "1221df811e418338ca156c42fc881d1cd7384b819a6683d4a54ab6e78521e32761452bcbb7ad856fa345a8f80c6206b19bd178c09975b87180f86448994ba07c00" + ], + "inputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474, + "calculated_hours": 18261796 + } + ], + "outputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934 + }, + { + "uxid": "42ec7e7302b1464d94e99c7b842e477d10e55328257aa5d1987052a3bdcc8690", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "300.000000", + "hours": 663934 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46251, + "block_seq": 200, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "2e05ca5b53cdaf3d65102aa6a4a707a324e5bfa7fa46e9b3b7328d1e0363822a", + "inner_hash": "08832259284fe4965625e2ef97d1ff3b40d7832b159b3d5369fc086ebb95479f", + "timestamp": 1438939186, + "fee": 54694521, + "sigs": [ + "820dc5d47540b0978818356b512731ae47517c061a1b660e7fd47e8f3d6420700377fd2ec04b618504cd3dadf642111df2f6c1f6edf2a4067fd460c69e8eb07301" + ], + "inputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 70389941 + } + ], + "outputs": [ + { + "uxid": "6e4110a8ed6f2b8b8772516466032a99b4851de65cf9ce1b5c5673946b7408a9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25400.000000", + "hours": 7847710 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46226, + "block_seq": 225, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "5a348a2f9d4e70f1f0d68fa9abc66d8eb4adcd45942c89d79a4121033e7dfc39", + "inner_hash": "a282319ed05751e5df08ece9dfe9fdcc73ee03b3efa2227c78ed1fd65a072c23", + "timestamp": 1440298886, + "fee": 356772925, + "sigs": [ + "c2e5060c13dbcbe8bd76cbe8d7fa2aab8a8738bc6b1c1acf50366f211cbda18611feb1e218df129d1e6a6f957310ad08a139c03555d6ba2b99f52fd988e0a96800", + "90ed23dacf21e05817442155cf7ae9867a9531ee0e1c4b575caaec7c65ede2f73344e1b12e093b4d1ebb11e457f066560d1a280cf8cb48fbf7e937202c329fa001" + ], + "inputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934, + "calculated_hours": 463355135 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710, + "calculated_hours": 8225404 + } + ], + "outputs": [ + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807 + }, + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46225, + "block_seq": 226, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "e91d2553c18538d90847e7d432c75978abb0f6f84edeea2f942d018e7306074b", + "inner_hash": "e16c45b163f87caefb9d231d4608e6a9b67b5d379a7bff3aebd6587cfa349df6", + "timestamp": 1440299046, + "fee": 86129188, + "sigs": [ + "cdcc51cad962fa4c6da30a44222c1a7d91501d07ba358c5a017b1105ec6f95091ba4ed430a95220492b228cd1b48a74f19c08ef550108cb639a7451e6d80cb1100", + "6969d30799e0687d3c80ce026bc510f920171ed4fb592ce3bf7ba1c142ec515230856a3c5b618495b449f264dd4ca1c1cea6e0e95756b2d0201d280571ba41e301" + ], + "inputs": [ + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807, + "calculated_hours": 57404251 + }, + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807, + "calculated_hours": 57426839 + } + ], + "outputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951 + }, + { + "uxid": "dfb90c1854bbf56bb87452a2870b4270214ca163df7d77f37c6bbf9d4ee2878a", + "dst": "2F4uJss1tkD7LNUp5RmxF1DPqgyzKVJm5tb", + "coins": "50.000000", + "hours": 14350951 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46224, + "block_seq": 227, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "71f762590ff2ca5e0591405ca5bb81aa2540981ea6e5cb71da1b30e4f91124a0", + "inner_hash": "024a7d284281f46931f4068a7dc377064aaf51b1c841e8d43a9f80f19aa52a8e", + "timestamp": 1440299156, + "fee": 10779353, + "sigs": [ + "dac9b5146b34a81f1c167cb54a15584e4323cb1910bf8de6c3b999f903a88b25473df3474c5ebce317dc40b121c632a79ecc8e9081406cc5d4b7a9848bd13d0f01" + ], + "inputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951, + "calculated_hours": 14367089 + } + ], + "outputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868 + }, + { + "uxid": "b79723cfa4ff5c819de20392e8f73e16d353dc4af31eb0c7857735d74f0b1469", + "dst": "ywucfMPRof9HqQPXM9xaY865THKsK2bgsS", + "coins": "50.000000", + "hours": 1793868 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46223, + "block_seq": 228, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ca1a46e2ea862c0886adccc211140ff394315c580a8f2da711eeed39d6326eb", + "inner_hash": "e026ab911b2370df6ef3cf8ee91e2005ab9fa978efd4074a8415aa272b0c19a9", + "timestamp": 1440299256, + "fee": 1360072, + "sigs": [ + "2805ab4816da23f9e1fc26c8940b5b5b27f90c910201229e239fa2b8f3cb4f9a5d1b57a62c48d5fc21ed11ccc121d22a8269af51a9de1359dd897a78a068d9a300" + ], + "inputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868, + "calculated_hours": 1808538 + } + ], + "outputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233 + }, + { + "uxid": "03db7662bf54eadcf812dc76fad91d4022dc55b895ce8be3a4f13bda048bd281", + "dst": "23t2jE6DAMUUan6bgqQZchHtwtZo5sRUgR7", + "coins": "50.000000", + "hours": 224233 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46222, + "block_seq": 229, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ac0737f4a51a7274f6a32f337d21af0681eff77276f6365c1809a1a73564e850", + "inner_hash": "b0faed6dd74071ff4e4083f9e5f73ff5af90fda24b4e52a00962bae7eaadf5f8", + "timestamp": 1440339226, + "fee": 6031218, + "sigs": [ + "34abcaa9a093713d2a19323e234d216169d3f75336b3170c1ab7c281386d42da0e97cf5e444a7473a0b1806d3d887e9622a329770c57f27c7532f3b69e3a6b9100" + ], + "inputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233, + "calculated_hours": 6087276 + } + ], + "outputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029 + }, + { + "uxid": "db47ae0c8f6fb640a199a01ceb12c63c26303fd866840f964b634b2f1a7490ab", + "dst": "2bJVVKi3UU9FKEAnZpvNQRWMom9Pp1SYp8k", + "coins": "1100.000000", + "hours": 28029 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46221, + "block_seq": 230, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "26746e5734590a1ef50f6d8ec6f58c25ed4b2bc57324f9e321f5543807f8830a", + "inner_hash": "66744475146d04a7d95866e1e19b97e1d903e95bc5e8ea96223b281b7b95dbf7", + "timestamp": 1440400166, + "fee": 8941454, + "sigs": [ + "199134f5ee986ec6a7a86d01920a98c8930be6f224dfeddece5c94155c9b4cea59b78c855887769f00aa6aeb76eb8e632f25b58bd5409fd481fb6663c30db67201" + ], + "inputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029, + "calculated_hours": 8948460 + } + ], + "outputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503 + }, + { + "uxid": "10c9fb1e6e6eb1a70af6e6714c1c0edb9588478cddfdbccb9ac5b2194abcbbfd", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "50.000000", + "hours": 3503 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46220, + "block_seq": 231, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4553ac3bd00bc61bb9deb8a2bf3c606ecf78b857da710728f5b86fdd20434958", + "inner_hash": "0a23fd3f113c52b6b36d397256fe0161a3d7edc77f128ac974173fac90927fb9", + "timestamp": 1440400256, + "fee": 15802, + "sigs": [ + "883145c4d76b5032ab0489407e991b247edeac0f89334c0588b8ede6d4ea052a2c330a94598fc9953cf9d25afeee7cf00ecea4d14744657ec9d888fe39b0d55c01" + ], + "inputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503, + "calculated_hours": 16676 + } + ], + "outputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437 + }, + { + "uxid": "e161482d33d132611f343987fc55f400d83de9ce3e51b1e5bd47e2b526c1c567", + "dst": "mkzYUmbUSnBAvweQ3QqqHZM3esy97ubWwQ", + "coins": "50.000000", + "hours": 437 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46219, + "block_seq": 232, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ca448d0b9f00c3f779acd75ea6e5d09cb93b4dee8ae417e43cecc58b121155f2", + "inner_hash": "bdcb4cfeae31a07ac42547510c4763b26b139ae2b61d411d7d4a78678a89f4e4", + "timestamp": 1440412792, + "fee": 1835007, + "sigs": [ + "8d5c007633116141c43ff4c87e1394052c4b6832c250ebf5f49781c7b0879ab12261bfd92f41fa6963c4b74e96c2bf8c96e8708f5dd04d4781fdb780c8307bb001" + ], + "inputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437, + "calculated_hours": 1835115 + } + ], + "outputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46218, + "block_seq": 233, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "688395456432e777e9bcef2482950d047259da990199d26d88f113ba37e870e6", + "inner_hash": "97a6db93329382d3a23dad5caf203056e6747dca4722c7e8e8d1f316b5f79503", + "timestamp": 1440510872, + "fee": 14354361, + "sigs": [ + "b3a6984d1440aeceb4dac0304215a1bf8d017ab581f19c550b4d8f859f9a15270b54a8e599bff4f4a3a5fb3fcbe2f5bb95b7d61d4d48735696d7dd3c16f8fa7a01", + "5209b5d255a1308f3e25ad6115ed005e34479f4b9155c16c27b40b28da08332b646cc7fb29d82e07f6e8f0de780a4e6a6980ccf4c80214c9fbd0a3fe7eadf84900" + ], + "inputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54, + "calculated_hours": 13945667 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54, + "calculated_hours": 408720 + } + ], + "outputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13 + }, + { + "uxid": "121d93a2019c2bdcd69d58ca47cd4087c5ccc56c5ddc2486885dff8a6febcfb7", + "dst": "2N1izdmWPnPLUSvkRH8Q7aKES7crLYxBo5k", + "coins": "777.000000", + "hours": 13 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46217, + "block_seq": 234, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "036ad7678b828002f9f75645cd66e8c4a2d2ef66d4866bf7cfe5797be691a648", + "inner_hash": "0751142c1e40396fb2ea4e03cc64f8a7fabc12c1466d44726fa0dd9b2fab4b9e", + "timestamp": 1440543822, + "fee": 4006005, + "sigs": [ + "9093c6beef08fc75a1341830aa8da696a9a1f6e043ab8abc48c63f8527c186b26e7f5e802e1743e095031a94b1fee4876245285de8bc76133ea78b403b34b38800" + ], + "inputs": [ + { + "uxid": "18ffebf7d8410a48f00b6bbfa5272ba374c0b70c6c31172975b4c503542d4193", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25390.000000", + "hours": 980963, + "calculated_hours": 5263875 + } + ], + "outputs": [ + { + "uxid": "a715e01bf641734804ed64e468ec35aa43658dc618784e6aed2f67d10c811f5d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "24390.000000", + "hours": 628935 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46213, + "block_seq": 238, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "768dc6803457ca6ba774e251f0a8f482d8f7134a5a8347831ae1d84ff39040b3", + "inner_hash": "63020c4af6f170888d1ed626be016d895568d3a0aead892b979e55e5d0bd8800", + "timestamp": 1440675932, + "fee": 18591357, + "sigs": [ + "442db1af0d6925a01bf9510a5b8ba1dc1787373ba0851b99825533c2bc02f5246cdd56ac98ca2c1039d010f52e7a153c4118fe00dce63692b63dd04cefcce0f701", + "9d3c03789af3832c7cae849eed9ac2b1d5b1c3f89daee13ad46f10d256cd8774431d60b98ab3803709430cceefe1cdb55543064843240af9123ab9ffbb2ffccf01" + ], + "inputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13, + "calculated_hours": 24121377 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935, + "calculated_hours": 665632 + } + ], + "outputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826 + }, + { + "uxid": "2b724147fb8daced3ad03b0a94e291410ab70df7f22346ed836bb864904a24ab", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 3097826 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46212, + "block_seq": 239, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "60ba5bab66295f08c5c96411f53bdf38bdf2b985b6dec3989b7754a8e2919ef8", + "inner_hash": "e765990d43208cc3e4f2168abd1139b36eeb280d18d8f98b13c14708371a5109", + "timestamp": 1440676112, + "fee": 2349099, + "sigs": [ + "91a610f22d4aec320cb9a39a831eea7ff8b5fe5e18d402fda01bf732ccce2ad801d3709a073d0a95d18c8424ea8cb69cce38194a5b12ab11f6bb5278f9a7941d01" + ], + "inputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826, + "calculated_hours": 3123555 + } + ], + "outputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228 + }, + { + "uxid": "52d2c4bda60fcd5e144d1c229a4d31c559a3d1f060b689737148918d4c04e128", + "dst": "Zu5GRV7HcKu1zV4ymwXUBCNogbwFW1sbhA", + "coins": "500.000000", + "hours": 387228 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46211, + "block_seq": 240, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8839c0de129a84bb3025f8e314dae4d331b0da6a446a9893ad11225eec650e5e", + "inner_hash": "dd8ca4280d163c57c12c9792b544df85a2535e06b20b2c661d91b6aec80ba8fc", + "timestamp": 1440677762, + "fee": 526047, + "sigs": [ + "7ab23848784fdf05602660e838be997277a7c33b2907ba81ae324d735b39864a2235ed3a0bfff86fa3cd7dcec7c6ab519d78e5f42b39443ee3aa4a1e44b9e26400" + ], + "inputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228, + "calculated_hours": 622853 + } + ], + "outputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403 + }, + { + "uxid": "3e2b813ec4bdb29dd5bc232e00722c00beabf7cbbc2ca8b4e348f2f083978bd3", + "dst": "X7y5AqjNaLEuBGPxF2Rpip7d1AByHWWaXz", + "coins": "300.000000", + "hours": 48403 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46210, + "block_seq": 241, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6cf290b9b63988d6126b6101c10992f6d9340988731e67867f011790f1fdf8de", + "inner_hash": "7e4018b41a6906ddfd84f67d271d79ae89ade34ed5de0ae609a6eeddb37f5991", + "timestamp": 1440677792, + "fee": 40584, + "sigs": [ + "da30c4a5cd8670d84a8f7f8b7c7cf9ae0da0f5bf806720824ad2d59716b200d349070158bbac66723c1a434747a8c438dec3e40c9e199cf8a2ee6d5622eb6b5901" + ], + "inputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403, + "calculated_hours": 52684 + } + ], + "outputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050 + }, + { + "uxid": "3a87d255b1d892d58d606d622196b75e818690e55e74db6e0173b1e28b58e2a9", + "dst": "vneQ7V3nuPwRbSRqvFXhWkXaVou11ynXfC", + "coins": "1000.000000", + "hours": 6050 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46209, + "block_seq": 242, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ca9114947a591d12c8bcb3aed6c2b6f6f50c13ebea44fe62fcfd783b4716166", + "inner_hash": "0aa4f96969cccacc1c03e2d7f8a1719ffb6de7c85ee563f6d55f3da14a377502", + "timestamp": 1440679322, + "fee": 222475, + "sigs": [ + "2373f45b0d10eb272c0304af8b75bac0570fc265ae3a446ec74b0bea87e494d86101e9b0c042a84fb20bd2061e694f2791cc76c734e8dcba0f3a601651cd405601" + ], + "inputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050, + "calculated_hours": 223987 + } + ], + "outputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756 + }, + { + "uxid": "051a357d1fe7f7b417a5892531f1e8b25b5bb78011ed4b440a5af47cfe241605", + "dst": "26AzDqDncyr5VKg5PfAxfTVdDtJf9AnMvoV", + "coins": "50.000000", + "hours": 756 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46208, + "block_seq": 243, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6b056847543ff37d8dbb7506d85514b3e18001ce973b7aac2a1a198a7f3be318", + "inner_hash": "583525d962728c33c80c1a511f3f407df0b09f0b22d571b9b857dba3488c0b13", + "timestamp": 1440682532, + "fee": 457763, + "sigs": [ + "b625dcc6040f599b04f00e9812f93f6e087a68b8277a03efcb49a2e88cf86ea4314ac1d50e5299b9ec48921fed1b56e0221bbb8df5a3df386d524fbcb9fe9aa100" + ], + "inputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756, + "calculated_hours": 457951 + } + ], + "outputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94 + }, + { + "uxid": "e7a20c799176f6567f3ad37f67ef0bfe5dd957404bd436d12f378eb35e624430", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 94 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46207, + "block_seq": 244, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7732aba0b8f9773c975158578159f5f6e98e9864d1cd2b0cef23cac03783cb99", + "inner_hash": "0337a9c8ebc9c389166e782b1da8777b01c29894b19d2c34290d9a3b81cd2ee1", + "timestamp": 1440911542, + "fee": 31822474, + "sigs": [ + "c185a7bac79fa042884330bf37c97ad27d9b4726ced145d91aec91dfb1cd9bf71e2c2e0de33837b43b241eddff2ac7067144ab3859859bef3e926b99aab4e5da01" + ], + "inputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94, + "calculated_hours": 31822496 + } + ], + "outputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11 + }, + { + "uxid": "5b9ecc773b66edd04478a15c82f019986b973fbc24be45c933e1e8ef62e0b223", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "2400.000000", + "hours": 11 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46203, + "block_seq": 248, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c8cbf96c9875e5a7f9f20cc301e9541f41182ac02747953f299d97a971e861e8", + "inner_hash": "f2c27d1b408cdd4796f628bff892e43cdfaeb8725b3a83bd0eddc374d9ce3ad1", + "timestamp": 1441590662, + "fee": 81345481, + "sigs": [ + "314620c86df48d65a6fcfeb82d028f48660f01b78004a01c0b5e8d5ba5e38e297331862b3f2786cf682e03e81fab3a413068f4eb72991d574b90d6a857b32d6201" + ], + "inputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11, + "calculated_hours": 93915327 + } + ], + "outputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923 + }, + { + "uxid": "6ade5ea7988126cda24ab050d714172ce41b0ba33359e0d06d319be60e83db9d", + "dst": "SiS1P3maLEzpscmggF6yvBHQ3yn7tA5ZdJ", + "coins": "5000.000000", + "hours": 6284923 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46200, + "block_seq": 251, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7c2da40e69c1ab57129cda200cbc4916fc67673436209b549c0496a4991f73be", + "inner_hash": "2d2c7b9c7e9e7c2dac513d277e2ed378a4ccdc5263560e2173b6507e4d70670d", + "timestamp": 1441735522, + "fee": 19597209, + "sigs": [ + "9de55cef7a0e80984d48ecfd30acf98d220bb5556d456af477c6879e80ba1bf143e75d6b64a018c1023f1854e538f1b72df3efe932db13d0eb20adf31c38ff9f01" + ], + "inputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923, + "calculated_hours": 26116377 + } + ], + "outputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584 + }, + { + "uxid": "5e41c4784a2ed9b538d07c20c2cadc89e3566ea17653b965715dd8db2015b986", + "dst": "KXSR2KLsButg6ndwUDYoyJ4FE9vGPLvtAj", + "coins": "1000.000000", + "hours": 3259584 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46199, + "block_seq": 252, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6638eac25e01cb7aabc20e0bd8fff66267bfa88ef4d3b021cda4248f6c8538a3", + "inner_hash": "ce2201218b3d8b5c734bc18666e409174b77ae022c0e48c30c5a9949edff6b0d", + "timestamp": 1441735692, + "fee": 2467913, + "sigs": [ + "94a8d11ba959af4d2160d141989d9a3e21f875b829d07969d1be040b54317c901c47ebcc9431f3cc0af88d4fbc0ac924785de50d27a3af4e4e4dc31a9980e0eb01" + ], + "inputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584, + "calculated_hours": 3282809 + } + ], + "outputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448 + }, + { + "uxid": "4ce358e15868adaf6c5ca420f900d3dd0f737510b5412646e10548fa3d37653d", + "dst": "29vxf99tti4sFPZpg8ghEWV9fhoHSbjeRYd", + "coins": "100.000000", + "hours": 407448 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46191, + "block_seq": 260, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "22b65c63f88e188f8da71f42e41102cde030d9550cfc990b4391e0339a4cb2dd", + "inner_hash": "0f2f563f1fdf52d53dcc414228d347dc677c4143cb3be4471945709fed3d29f0", + "timestamp": 1444883250, + "fee": 331657183, + "sigs": [ + "f0ace9ccccb936a5b46073085d83ca357692dfe0de9635d36292289f6d3a6e4505bd42c7de08dc8642823b8ee2b986c0b926c62df834f694a4d44695ced6690000" + ], + "inputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448, + "calculated_hours": 430349007 + } + ], + "outputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912 + }, + { + "uxid": "d79a747561a4ae09c22e5ec0baf0eb861b56b1d9b1411868c474d32e9ef392dc", + "dst": "6QpWfvS8PxrWVJLKLFtQVUHvAwUg2oX6GW", + "coins": "12500.000000", + "hours": 49345912 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46189, + "block_seq": 262, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bc35493562cbe89797ce21a6202c8b43fc8514910ccb197c2f971c624b1fa5dd", + "inner_hash": "ff7c2bc8682df6f1a080061ca6d646c47636474b9e291dbf9d549fe5e63fddfe", + "timestamp": 1447060608, + "fee": 302141105, + "sigs": [ + "d1ffeea69fb213eaa7aea1e5f0d5a09e414247ba07a3860fb66c3af0b7ed611e2e630bfd292b4013e0d1bd9234290f068d49f5922ce895785c18cc4ada578a0e00" + ], + "inputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912, + "calculated_hours": 339202461 + } + ], + "outputs": [ + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678 + }, + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46188, + "block_seq": 263, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "32c585c56c5879158e3075f299998f6cf922b06b9620f272ebb4cb4a2353d4eb", + "inner_hash": "e0dcb3b201be487c7feaf513b3f245b08e0f86335fd2bd9a9dba7ca70684e8a7", + "timestamp": 1448245188, + "fee": 185490927, + "sigs": [ + "2b0585dc3ac3d497e9b139be51a0e5f6e0520c54e244678459169a82d386f5050f23dd92685efee03bad45f7e166992fb34c3fc036c1fd9204bc0280decb7c8000", + "adcd4b6cb6dc7816416f44649ce1dc4ce3489e9dbac70f4de610d0663e12ed556f3d1fda1781ecb6237652358cd6d1118ec9c2b5795dde594d92c47830c493f500" + ], + "inputs": [ + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678, + "calculated_hours": 18695203 + }, + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678, + "calculated_hours": 176061062 + } + ], + "outputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669 + }, + { + "uxid": "08c0b08d114154a06a39cf418dd39eb018a55c1c4ee7a96257b33bc6f413d577", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 4632669 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46187, + "block_seq": 264, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "97ed144d626d0ff6fca09745735aec22a103d182971a45989500a3aa757358d4", + "inner_hash": "4bafee81f542c63b988af48da3250dd56215a42b520892b1ebbb8e9c5271588b", + "timestamp": 1450942022, + "fee": 361736164, + "sigs": [ + "c4047afd7722520fea778426868ef461a602a3954b82051c2245107491efdfff54d701d18f5408ef20a7dcea37ae4c1c3555bfe1bc387b1f3a516d076420139e00" + ], + "inputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669, + "calculated_hours": 362894330 + } + ], + "outputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083 + }, + { + "uxid": "8745efaccbb21edd35d337233d7d1ae0e2c75723e72767c9b42cd27c46146abc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "2000.000000", + "hours": 579083 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46186, + "block_seq": 265, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b5ffbbb48c9900feb663f79c3b3e1c89328a08b592f96071fd4d3171197a5ff7", + "inner_hash": "b6d4ab02e9b05a532402a1b65185e098d4c730854c6f34d20e71da1262524195", + "timestamp": 1450942402, + "fee": 484583, + "sigs": [ + "b116c94fd9e32cc371bba4f9a88ad672112d53be861aaa5c77cd335d1553fe0a24fc334d79c61aed344b618a3de49e791cc8aebe83bead076ed2f38dccd9aaee00" + ], + "inputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083, + "calculated_hours": 629353 + } + ], + "outputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385 + }, + { + "uxid": "c33a3ad731a1375220c0701da00a462e13a11bab4cff684061ce173982227a2d", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "19980.000000", + "hours": 72385 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46185, + "block_seq": 266, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "981c2bb64f9e6717353cad40e21f3e97bd188381fde77862298488a516c31252", + "inner_hash": "cae5fc5f829da5ccb165c97b1140ed161e22e4ba290b1bee703b31a986c3c45c", + "timestamp": 1453191853, + "fee": 285149083, + "sigs": [ + "e3fb8400221770861288bcb1018a495548af5cd617724aa22efd219f350047086ea0ed5aa7f95e488045d5c31d8551a6cffcdf796d91ebbf573c1ef6492bb25701" + ], + "inputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385, + "calculated_hours": 285167179 + } + ], + "outputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048 + }, + { + "uxid": "d7eb0e6bd0ccbf9fd59e314999c37e8f97c652001e1ac1834f9b3c95665a746d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 9048 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46184, + "block_seq": 267, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4edf7e4859bd537481164719a563af45b2603d2caf1b676d6fe1e08713b0d6f3", + "inner_hash": "ac615d16f9c8be45bc50359496bdd6d489b374846f11586c19dc865c3217c1b9", + "timestamp": 1461084047, + "fee": 998068985, + "sigs": [ + "7ae17fdc81bb3b71304db642c6af046e67ca00e8499d8f3d19f7489cd13ca4b75f2415d1e9639e0a7a26791852331189f5e2bfdde574ccf6c0adbca2fb0c933100" + ], + "inputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048, + "calculated_hours": 998071247 + } + ], + "outputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131 + }, + { + "uxid": "fd99ca48c87575437fcbedd1bf05cf5c4f6a2d199616119ec99dfe61eb085ee5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5000.000000", + "hours": 1131 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46183, + "block_seq": 268, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "76b704d474896c5a3179b45a48c3ad327d5ebc27a6681ea7f514a90ba625bac3", + "inner_hash": "a60b2257f963b247a98f083828bf58d88aa3f327839c599bf1eaf0ee55a325a1", + "timestamp": 1461280957, + "fee": 24628984, + "sigs": [ + "15e30848b1d0aaf92e13f8927115314341ab4452a31f0a61f665c986c952ef6838753688759e98f393b5af088ad0fa4e9aa4e83695afe5734c45e4eb6c15b76f01" + ], + "inputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131, + "calculated_hours": 24629266 + } + ], + "outputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141 + }, + { + "uxid": "c85d1d533bf13c0725af9a30bb101670505ed192f6987d55c1db5dd70fb2e4b3", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "12931.000000", + "hours": 141 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46182, + "block_seq": 269, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ecc2fb1efa47e6ad0c4670281b364a2828bfe86d59fbc14105c5b3a3c34fd17", + "inner_hash": "0600d27b083aea0d64ba83749b3bb60cbde6dd2cdaa4ec2101adb8de668cdeec", + "timestamp": 1461296767, + "fee": 1920723, + "sigs": [ + "aaa9847aead8e1e43fdeb1548317046c252ddc8b61e9447c18006b8af5805f5c1dbf81b898f25ecbbd0bb97c2d6d89da0e25f7da979932b2a774c7c5e6f2281d01" + ], + "inputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141, + "calculated_hours": 1920757 + } + ], + "outputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17 + }, + { + "uxid": "7bb51af714bcae27ed5c092c6e721f10ca1ac167a61add8bd2989f15c968bab8", + "dst": "28nWDjroTJGr3rmZj9iiiVQK1wEVURcvsSc", + "coins": "2500.000000", + "hours": 17 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46177, + "block_seq": 274, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "2c97923aba19d8846f8f90db6dc89da7d433ead3ea8dc3155294ab4c9e7e61a4", + "inner_hash": "7d3af96a796daba12cbb863731c09e148f21302064d65945316473ad522e8ca8", + "timestamp": 1461749167, + "fee": 40993499, + "sigs": [ + "6f3c6fb3e971ec8b4eb3a352c94b2abcb347a3f476d1b5e3097ce239a32467bd0703a4436ce7c9b4beb1668a9056f6d93055b53aa7a36374c2b3d12793a6ea3900" + ], + "inputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17, + "calculated_hours": 54643905 + } + ], + "outputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203 + }, + { + "uxid": "df7cae650d11e13a5308ea9f10662060c57ad749538d5ea1f476556de3257270", + "dst": "A19fNE1BNGAELCJ5bCVgo8t5Y9UPtoxy2F", + "coins": "1000.000000", + "hours": 6825203 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46167, + "block_seq": 284, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7c3f991c9cb5098648da480666613a048267678dcf7033c6138b0ac619003bcb", + "inner_hash": "35e2f253fd5936f6086464b4f3bae2a39770f91b2d846533bdd677554a760bbf", + "timestamp": 1462264727, + "fee": 65048877, + "sigs": [ + "bd5e540c58e54ccc58d1f7021657665d1f7a1770cc575b47a46bc16f5e3f3c86338f61be266c851201e8441ea5aa3ac91fa1cbf3b77365826c3b76f8f6441b0700" + ], + "inputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203, + "calculated_hours": 68954765 + } + ], + "outputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944 + }, + { + "uxid": "fba32b8a7e10d7aad23bb8511dd61b9ad67b844142b5acd7ef22d03e540888fb", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "100000.000000", + "hours": 1952944 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46163, + "block_seq": 288, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4c41f200b398abbba12cb9ad5b935a5dad3bb6283093f062c82ae7c7904747a5", + "inner_hash": "5263bdcff23761f158c7286664908839983135936f1e53bdd2513e7fa317d05f", + "timestamp": 1462711117, + "fee": 37342376, + "sigs": [ + "39c94d70cedadb426004bea6137aa774ba757b78c44aad072143eb55cb9207aa7f02be91cd67c27f39f898a2303791665bfb5414a18df62a304c9cbdd4ffb5ff00" + ], + "inputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944, + "calculated_hours": 43347184 + } + ], + "outputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404 + }, + { + "uxid": "111b2d823bc70d9e8f42063eca3a457abe385b994d59f602d35bafe3e1402233", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 3002404 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46162, + "block_seq": 289, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6778a6900cf26b0ad69d2ead927663bd2bbaccd9b97d0dffb74655a08757ee5a", + "inner_hash": "53e042fba89ab6233f73a2bd08df87d84d5979b7a1bed5705156b8badc44f5b3", + "timestamp": 1462711187, + "fee": 2258293, + "sigs": [ + "006025e5067252a8e37eb4c911d7e2c5283b137f0be2c8ffae27cac8f5a21f723d25745c157e49783354751f3e0bf4ce25fe6271748bd78d31487e826685a59801" + ], + "inputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404, + "calculated_hours": 3008893 + } + ], + "outputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300 + }, + { + "uxid": "4729461061ba3e308d1fea8846b8326bb8300d3dcc8b66b242323ba0aa5a3ccb", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "50000.000000", + "hours": 375300 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46161, + "block_seq": 290, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "99988a504cb60473ad8b5047a9be9049dff3dd2ee13879707a12736ed52ea9a5", + "inner_hash": "13285dd910aca69020333f17bc6d0a9ad3424bba2610acbd062712a3b4b46b6b", + "timestamp": 1462715237, + "fee": 600674, + "sigs": [ + "cc4df545eddf94086f0aaf2bb28321d8e3822f835bb3a71ab51674a3a7dc305c57df3609b6dc3a434fa8e2a4c36b5406cdf2fe6833c74049b4b77cf098ca664c01" + ], + "inputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300, + "calculated_hours": 694498 + } + ], + "outputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912 + }, + { + "uxid": "a0e76e9cfd75deeb37f2db7bd67c95c95c3896c635ef104a548b77cafa65dd04", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 46912 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46160, + "block_seq": 291, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "714a3b2ba4479d0a95ad0ebae11bc1198eabc6392dabe776c15e7a68e0d82cf8", + "inner_hash": "32aa300316d5aff19a3aa0a99bfbca6398eef9462cc6c975fe7f41d1ecb9f6d5", + "timestamp": 1462715257, + "fee": 36732, + "sigs": [ + "a886ba759476985a6aec555b7acb5b3f7ea7d14201b66bd043bc172206bf4b7c0269959f3f8aac5c7a06a376a628221c67ae89cbd141c96987f852c2e2f4e73400" + ], + "inputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912, + "calculated_hours": 48460 + } + ], + "outputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864 + }, + { + "uxid": "0637e5ea11dba513d8839c02e4d564ec31a8377e5aca51fdef4c854cb5eaa332", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 5864 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46159, + "block_seq": 292, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7e8d02180c5e49cd36b545c8986ffaadc7e90840259d3fe10ceaff3e4cd931c4", + "inner_hash": "8e1d9f79f43372290c3d497314271a711c33474fdec555b4be6f3f0d7c608d76", + "timestamp": 1462715267, + "fee": 5170, + "sigs": [ + "61f0c36e996c391c61daaddd6dced605e79cdabc643d994d99c7a6a479aad25c4030619f1cf7420dbe2d673a2e124f2bae744277b246173342d7fdbddea78bc200" + ], + "inputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864, + "calculated_hours": 6636 + } + ], + "outputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733 + }, + { + "uxid": "9ab52d70129ef181bbd69a630a3fa929bb12357c5c31bc70173388b71327dab7", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 733 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46130, + "block_seq": 321, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7388dab349f2d2a59ab071fc592c0173acfa357f23fd17dae1561089da55e74f", + "inner_hash": "a0f3bfacdee3107342adb96e8dcb38a265af8054624dadc0b27d71c55854e6b5", + "timestamp": 1467090951, + "fee": 282914895, + "sigs": [ + "dda5202c4c44a5ab8eceb8cf8a7acc1c2714529eee0a69bd396cb74a98706dfe1c7686c1b0f2bf760b5d211ce535c21077944bd1d89bc0baade9606cd561147800" + ], + "inputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733, + "calculated_hours": 337575029 + } + ], + "outputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067 + }, + { + "uxid": "f16b87d2e0ea2e7f43434d058fb4435705cb15f4d01de6c6aa242ab7fcd9a80b", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 27330067 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46129, + "block_seq": 322, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "5733f006dda42be6198d3fb035170c9160428ad321c8255b851574776e03c34f", + "inner_hash": "993a366ebfc7210951eeda4c459389f396a2038f41025f4b729edab75d1dc9c5", + "timestamp": 1469074433, + "fee": 173463682, + "sigs": [ + "0612105a7d427841f1f9038bbb778c8c1db52e0dfe5fd7c9409b44bb03fc72a74d60913ad46fef4a525d3314a48e1ee49d4a5da69941075fe816c02ef691979001" + ], + "inputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067, + "calculated_hours": 180296198 + } + ], + "outputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258 + }, + { + "uxid": "02b48571a1a1f628a0e78b5b158a682262a88610cd0614697e17201f35c9ee98", + "dst": "22cmbaPHWozJRJfbxTUbfoy2FfM3oFvFs7k", + "coins": "1000.000000", + "hours": 3416258 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46128, + "block_seq": 323, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "725698203caf11e909360449956f0285735d44f4573c81413852d25b220e61b0", + "inner_hash": "ef1dc1d55aa04aa6a240a796f6f9c47af2317fdfa7f4843f3884e71cdb79c442", + "timestamp": 1469074773, + "fee": 2588320, + "sigs": [ + "77fd6d8da8b2efd32dd50ca558e44fde0f62d8cd15ab084650759ff61d51e3200b7c025488908a7d0f784de819764506ab8a67f9d5c384ab7962c30908695d3700" + ], + "inputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258, + "calculated_hours": 3442384 + } + ], + "outputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032 + }, + { + "uxid": "f575c8f632e92d9e3c7335f68e4e6c24d69d20fddbd05f794016b4d18d4d9c66", + "dst": "8CHWZqQEnBj9dTdZ78iqs1MVy83qgCuTs4", + "coins": "1000.000000", + "hours": 427032 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46124, + "block_seq": 327, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "823a284da9b7e49180e599552e824c60c23d28cc9fd4915e57037ac6ba5e364f", + "inner_hash": "83da271ca66c1da0f8ba30224552791e51f5334fb2868c01a95aa09aa5d8f8c4", + "timestamp": 1469463291, + "fee": 22630464, + "sigs": [ + "bd8a3cfd554c7fcf06c2fbdb0efe399f31d30373c96a0846edd52a3163dca1b43060014bda1db9abbacda35addcd3cd89625fe8e4753067aaf9a2de226fd692c01" + ], + "inputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032, + "calculated_hours": 30173696 + } + ], + "outputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616 + }, + { + "uxid": "f809efa66df51ff86023c6a514e91274a93dc303c34a191c37deb7e3467b9944", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1.000000", + "hours": 3771616 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46101, + "block_seq": 350, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ccf809db24bde3af9083bb6ba590e91f71cd93335c945ccae3f815ef68994843", + "inner_hash": "18e96e61845c7f9134eec568476ae5f8909417230382a261384a4116cb6ea980", + "timestamp": 1471358102, + "fee": 120495261, + "sigs": [ + "07220c9f545b585905db91d51aa1b00bd3c3c4ad251bd88c48cc1377c2ea86702ac6fb8354188abdf228cd9c05c8d8c0c8185e337f60fb824b06ca5c3893757f00" + ], + "inputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616, + "calculated_hours": 148846241 + } + ], + "outputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490 + }, + { + "uxid": "6e269a47dc13704da1058890e839f246fe6f57c52718687c863e0d16adbfbb3e", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 14175490 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46097, + "block_seq": 354, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e348450f03f57e10e3cb1227b6874186d72f090c1cb6468b400b4906807cef02", + "inner_hash": "79e866fddd91dea1ba6c8bdb88bc880216d25c812145bb476e91590396146b3f", + "timestamp": 1472066732, + "fee": 62149533, + "sigs": [ + "67d3293742ce7cd95612d1a01c0b307a94166fc0b7bdc01efcd312606f88a5a474affc18a56adf6fece4f9b6b593dd1479a70fac8d92d4d285e1af579eafb90b01" + ], + "inputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490, + "calculated_hours": 68234313 + } + ], + "outputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390 + }, + { + "uxid": "26974a5d7ccd20eebd9c832b5fd40d62fb6bae48227fffa65dd4e5be26d12f84", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 3042390 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46096, + "block_seq": 355, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c97bf2e161844d70686539eaec694b32678b130539946af8c3ec36f905e47d9a", + "inner_hash": "1e1f7265be9a1806a23a7f490fbd2f5c179e910102509dc4667e631115cad927", + "timestamp": 1472069152, + "fee": 22968235, + "sigs": [ + "085b5436b72b9ccd1b0e8001c42408ff90ecb544a027da4e18dd550933a7ef8f7a9b5a44939856f9f8d47a8805091696148ba86cc174cfe73604f0b34e43290400" + ], + "inputs": [ + { + "uxid": "a0ba6219e79ab6470430b6b387602b58c96ef57a850e9dc94af8da0dfedfcad1", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25314.000000", + "hours": 10499712, + "calculated_hours": 30618639 + } + ], + "outputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46095, + "block_seq": 356, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7ca2667f49dc21f893f2273c592618b0238959ec9aecc881150d6507c6a1755e", + "inner_hash": "06516c42bb9cd1d9584281fc41497afbcdbcf50d227e33d56016d003f426e262", + "timestamp": 1472069172, + "fee": 2869037, + "sigs": [ + "8172d96cbb9f33bbe1a2852745015abd99c4702af53aa10a0124efe0a3e1a32766ec459367d62f21dce3b08361feda40eef78dc273577ee4c8f7a0ee5551bc6d00" + ], + "inputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202, + "calculated_hours": 3825337 + } + ], + "outputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46094, + "block_seq": 357, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ccf714517563cfb8a9d694a7a0ac534da01cb74e18d8a9cd0d410081970d8015", + "inner_hash": "0470dddb1c719ccb518dc8df7d0150373c61e19e3bbe0d2ced04a6ca66d71215", + "timestamp": 1472069232, + "fee": 359002, + "sigs": [ + "8d29d25b00cd13891c3af52b6481d173d186ac4281afdf5a9c0646a55664addd0edbde30ce3d51c3952571ba37f056f289adefc1dedb1dde3465d2a16de6a02c01" + ], + "inputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150, + "calculated_hours": 478538 + } + ], + "outputs": [ + { + "uxid": "7e527dff560de74654aada4257259085486ea81716b577f7d8519a44beff78da", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22314.000000", + "hours": 59768 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46077, + "block_seq": 374, + "unknown": false + }, + "length": 511, + "type": 0, + "txid": "7a05ca15c9860700b34642339e91427ce0b211a8fe14805751d730f8ca0e5363", + "inner_hash": "34ef2b9ef8af1fb8d76b9ea9690356f2e0c20d1f672598020fa4e65aff25a9f5", + "timestamp": 1473696472, + "fee": 103067908, + "sigs": [ + "a45592c587087f22e42bbf5ea9061e0668bd7e8fb3daa9c8bde6a1f2644c2a373c91d0b874a2fa95a4ce94284cf663035f83bba786c0c356ae055b89cedd623301", + "d422b1658a5a49642bd1126a269eaa1c939849dd9ca179db7992f0c274a16d313c4b2c9bb8dba458895ad7f12590da944af0880cb75592c0f4185c9b510747c900", + "a4250a03285edf63270784bc3e0d655b709622dfdfdd99af0b6f85060d3f540e36eeba0ed719a415f67d3c542e2efdc93c0fcfd9b0c946cca5c0fa5abc9837d901", + "e89be88a2dfd2beb052d0b628a2b4c09c38c3d19751e0551a65a22b6d9b4ed305974e673c7cb5d7c0259eeea76f2044f708c1ea2abf8cf5d92c84c81eed30b4201" + ], + "inputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390, + "calculated_hours": 126916663 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202, + "calculated_hours": 4277235 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150, + "calculated_hours": 930177 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768, + "calculated_hours": 511779 + } + ], + "outputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973 + }, + { + "uxid": "aa975eb226edc45f46bc54bbbf08143ae1cc0cfedea598c536e1810b36d26258", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1000.000000", + "hours": 14783973 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46076, + "block_seq": 375, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9da07bf85e25c466daeb9e4bb8825161e2f2eb60ce470fecff30a557d8ab8d58", + "inner_hash": "2bf9ee9274c70c66f52d81df6b1f56bdbba9b17d3a67371ee45c94c0d91ffdad", + "timestamp": 1473696502, + "fee": 11090277, + "sigs": [ + "13d93765e882705c482307678fc2d7d4d10ec733626066d59a6ee0d83be0c3840f66e43dec32bc09b2dea074675e8cf1fb0e768891191657ff1e8895f6d24edc01" + ], + "inputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973, + "calculated_hours": 14786269 + } + ], + "outputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996 + }, + { + "uxid": "cb7e5dd3539b632b7c8de80bdd2bede4890d306ddde001854b21003546bdeb4a", + "dst": "bVMBhye4BsMtB9bC6t6VnQoYkbLH5JEb5A", + "coins": "10000.000000", + "hours": 1847996 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46028, + "block_seq": 423, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c0b00aa1fac000b225f3d59983d7be04b41dded7e70549cd118648c0f4120622", + "inner_hash": "409996e4103fb8a6d0a508cd1b4b3f3c0145f255461ed590e013a4a1cec87f53", + "timestamp": 1474976262, + "fee": 72562563, + "sigs": [ + "f11babcb58c0526909ab684968566c79f015a35eb5e800382847c58c12cd198b53cd8f5513139ba289ee547cbbbda6313516a8d18e10ee5497805d135020171c01" + ], + "inputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996, + "calculated_hours": 96276865 + } + ], + "outputs": [ + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151 + }, + { + "uxid": "9e5bd56c83575b8628dc1c497b7987bccd3cea12267782be95bf7cc9b47d6364", + "dst": "kW69Hh12ng6hqD6GsScVq6Bo6VDGTgq7Gx", + "coins": "20800.000000", + "hours": 11857151 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45960, + "block_seq": 491, + "unknown": false + }, + "length": 414, + "type": 0, + "txid": "127cae7ab2e851738fc4c9894dade853173c658317e5e551c0618f3c14de0c6e", + "inner_hash": "ae44ad68c8a6f83d22436a19ff274d5eeeceb7c515348c910cf09abea87b4449", + "timestamp": 1478603012, + "fee": 258641221, + "sigs": [ + "0a332a5c2c501b5fcf6d8ce21ef1aa6c82324dcaf5a4162a0ab8f6cada1ae56b19be195564263ace98db8a0b0b4c37a5ac080c5a55c76b2c9315980a025307b001", + "b2a3d81f2a2bd12ed1fc0d5bb9daa781a2553410902a25cfcf4c179165ef52936b86c4774ad3e9a4fbc2188f8fe7e5ad1949715c307ab4499b4d2bc2536bb2b600", + "e660d1823b2d2637c2da6080443410dadf90c8559e17b37b17fe51d553e2f26c0b71ee1b3a652b522b0f1cc17baef65f63457259b06fd6126fe4e2b1bf101e7d01" + ], + "inputs": [ + { + "uxid": "22f6cbb46c9d8566f6cdb3882dbd77bc473432c097b704c14457babd66da993d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 3128290, + "calculated_hours": 3397718 + }, + { + "uxid": "d0e6c3ff06b1125d70a707f57b4888a96aa56fe26fbf0fc80ce7d560acc77f63", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 27225, + "calculated_hours": 489288 + }, + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151, + "calculated_hours": 258507381 + } + ], + "outputs": [ + { + "uxid": "4594bb2382ac97aa0cf3ae0eeeae2d2a0dbe96a6293d0bd715e2ce7165080977", + "dst": "2X6eRFh6pp6rUHj74NJXLcmTg1TnDaPyYCw", + "coins": "1000.000000", + "hours": 1876583 + }, + { + "uxid": "931267f628963f9faccfaaa4973cb20a4d28a02a8c97a89f83f91d3413af7af7", + "dst": "Qq7dG2S5jwNgpayJzBf7kTtfWmpfSQPCQ6", + "coins": "244631.000000", + "hours": 1876583 + } + ] + } +] diff --git a/src/gui/integration/test-fixtures/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden b/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden similarity index 100% rename from src/gui/integration/test-fixtures/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden rename to src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden diff --git a/src/gui/integration/test-fixtures/balance-noaddrs.golden b/src/api/integration/testdata/balance-noaddrs.golden similarity index 100% rename from src/gui/integration/test-fixtures/balance-noaddrs.golden rename to src/api/integration/testdata/balance-noaddrs.golden diff --git a/src/gui/integration/test-fixtures/balance-two-addrs.golden b/src/api/integration/testdata/balance-two-addrs.golden similarity index 100% rename from src/gui/integration/test-fixtures/balance-two-addrs.golden rename to src/api/integration/testdata/balance-two-addrs.golden diff --git a/src/gui/integration/test-fixtures/block-hash-genesis.golden b/src/api/integration/testdata/block-hash-genesis.golden similarity index 100% rename from src/gui/integration/test-fixtures/block-hash-genesis.golden rename to src/api/integration/testdata/block-hash-genesis.golden diff --git a/src/gui/integration/test-fixtures/block-hash.golden b/src/api/integration/testdata/block-hash.golden similarity index 100% rename from src/gui/integration/test-fixtures/block-hash.golden rename to src/api/integration/testdata/block-hash.golden diff --git a/src/gui/integration/test-fixtures/block-last.golden b/src/api/integration/testdata/block-last.golden similarity index 100% rename from src/gui/integration/test-fixtures/block-last.golden rename to src/api/integration/testdata/block-last.golden diff --git a/src/gui/integration/test-fixtures/block-seq-0.golden b/src/api/integration/testdata/block-seq-0.golden similarity index 100% rename from src/gui/integration/test-fixtures/block-seq-0.golden rename to src/api/integration/testdata/block-seq-0.golden diff --git a/src/gui/integration/test-fixtures/block-seq-100.golden b/src/api/integration/testdata/block-seq-100.golden similarity index 100% rename from src/gui/integration/test-fixtures/block-seq-100.golden rename to src/api/integration/testdata/block-seq-100.golden diff --git a/src/api/integration/testdata/blockchain-180.db b/src/api/integration/testdata/blockchain-180.db new file mode 100755 index 0000000..f0908f2 Binary files /dev/null and b/src/api/integration/testdata/blockchain-180.db differ diff --git a/src/gui/integration/test-fixtures/blockchain-metadata.golden b/src/api/integration/testdata/blockchain-metadata.golden similarity index 100% rename from src/gui/integration/test-fixtures/blockchain-metadata.golden rename to src/api/integration/testdata/blockchain-metadata.golden diff --git a/src/gui/integration/test-fixtures/blockchain-progress.golden b/src/api/integration/testdata/blockchain-progress.golden similarity index 100% rename from src/gui/integration/test-fixtures/blockchain-progress.golden rename to src/api/integration/testdata/blockchain-progress.golden diff --git a/src/gui/integration/test-fixtures/blocks-all.golden b/src/api/integration/testdata/blocks-all.golden similarity index 100% rename from src/gui/integration/test-fixtures/blocks-all.golden rename to src/api/integration/testdata/blocks-all.golden diff --git a/src/gui/integration/test-fixtures/blocks-end-less-than-start.golden b/src/api/integration/testdata/blocks-end-less-than-start.golden similarity index 100% rename from src/gui/integration/test-fixtures/blocks-end-less-than-start.golden rename to src/api/integration/testdata/blocks-end-less-than-start.golden diff --git a/src/gui/integration/test-fixtures/blocks-first-1.golden b/src/api/integration/testdata/blocks-first-1.golden similarity index 100% rename from src/gui/integration/test-fixtures/blocks-first-1.golden rename to src/api/integration/testdata/blocks-first-1.golden diff --git a/src/gui/integration/test-fixtures/blocks-first-10.golden b/src/api/integration/testdata/blocks-first-10.golden similarity index 100% rename from src/gui/integration/test-fixtures/blocks-first-10.golden rename to src/api/integration/testdata/blocks-first-10.golden diff --git a/src/gui/integration/test-fixtures/blocks-last-10.golden b/src/api/integration/testdata/blocks-last-10.golden similarity index 100% rename from src/gui/integration/test-fixtures/blocks-last-10.golden rename to src/api/integration/testdata/blocks-last-10.golden diff --git a/src/gui/integration/test-fixtures/coinsupply.golden b/src/api/integration/testdata/coinsupply.golden similarity index 100% rename from src/gui/integration/test-fixtures/coinsupply.golden rename to src/api/integration/testdata/coinsupply.golden diff --git a/src/gui/integration/test-fixtures/empty-addrs-unconfirmed-txs.golden b/src/api/integration/testdata/empty-addrs-unconfirmed-txs.golden similarity index 100% rename from src/gui/integration/test-fixtures/empty-addrs-unconfirmed-txs.golden rename to src/api/integration/testdata/empty-addrs-unconfirmed-txs.golden diff --git a/src/api/integration/testdata/empty-addrs.golden b/src/api/integration/testdata/empty-addrs.golden new file mode 100755 index 0000000..30dc011 --- /dev/null +++ b/src/api/integration/testdata/empty-addrs.golden @@ -0,0 +1,7239 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1, + "unknown": false + }, + "time": 1427926392, + "txn": { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2, + "unknown": false + }, + "time": 1427927651, + "txn": { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "timestamp": 1427927651, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3, + "unknown": false + }, + "time": 1427927671, + "txn": { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "timestamp": 1427927671, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4, + "unknown": false + }, + "time": 1428793611, + "txn": { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "timestamp": 1428793611, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5, + "unknown": false + }, + "time": 1428798821, + "txn": { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "timestamp": 1428798821, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6, + "unknown": false + }, + "time": 1428806251, + "txn": { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "timestamp": 1428806251, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7, + "unknown": false + }, + "time": 1428807671, + "txn": { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "timestamp": 1428807671, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8, + "unknown": false + }, + "time": 1428807691, + "txn": { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "timestamp": 1428807691, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9, + "unknown": false + }, + "time": 1428807711, + "txn": { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "timestamp": 1428807711, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10, + "unknown": false + }, + "time": 1428807771, + "txn": { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "timestamp": 1428807771, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11, + "unknown": false + }, + "time": 1428808851, + "txn": { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "timestamp": 1428808851, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12, + "unknown": false + }, + "time": 1428814821, + "txn": { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "timestamp": 1428814821, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13, + "unknown": false + }, + "time": 1428814891, + "txn": { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "timestamp": 1428814891, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14, + "unknown": false + }, + "time": 1428815131, + "txn": { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "timestamp": 1428815131, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15, + "unknown": false + }, + "time": 1428820169, + "txn": { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "timestamp": 1428820169, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16, + "unknown": false + }, + "time": 1428820629, + "txn": { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "timestamp": 1428820629, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17, + "unknown": false + }, + "time": 1428989855, + "txn": { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "timestamp": 1428989855, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18, + "unknown": false + }, + "time": 1428989925, + "txn": { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "timestamp": 1428989925, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19, + "unknown": false + }, + "time": 1428990115, + "txn": { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "timestamp": 1428990115, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20, + "unknown": false + }, + "time": 1428990135, + "txn": { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "timestamp": 1428990135, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21, + "unknown": false + }, + "time": 1428991365, + "txn": { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "timestamp": 1428991365, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22, + "unknown": false + }, + "time": 1428991585, + "txn": { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "timestamp": 1428991585, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23, + "unknown": false + }, + "time": 1428991605, + "txn": { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "timestamp": 1428991605, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24, + "unknown": false + }, + "time": 1428991635, + "txn": { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "timestamp": 1428991635, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25, + "unknown": false + }, + "time": 1428991665, + "txn": { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "timestamp": 1428991665, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26, + "unknown": false + }, + "time": 1429011077, + "txn": { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "timestamp": 1429011077, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27, + "unknown": false + }, + "time": 1429011137, + "txn": { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "timestamp": 1429011137, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28, + "unknown": false + }, + "time": 1429020387, + "txn": { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "timestamp": 1429020387, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29, + "unknown": false + }, + "time": 1429020687, + "txn": { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "timestamp": 1429020687, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30, + "unknown": false + }, + "time": 1429021044, + "txn": { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "timestamp": 1429021044, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31, + "unknown": false + }, + "time": 1429021184, + "txn": { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "timestamp": 1429021184, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32, + "unknown": false + }, + "time": 1429021214, + "txn": { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "timestamp": 1429021214, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33, + "unknown": false + }, + "time": 1429021674, + "txn": { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "timestamp": 1429021674, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34, + "unknown": false + }, + "time": 1429021994, + "txn": { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "timestamp": 1429021994, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35, + "unknown": false + }, + "time": 1429022034, + "txn": { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "timestamp": 1429022034, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36, + "unknown": false + }, + "time": 1429022064, + "txn": { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "timestamp": 1429022064, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37, + "unknown": false + }, + "time": 1429022094, + "txn": { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "timestamp": 1429022094, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38, + "unknown": false + }, + "time": 1429058484, + "txn": { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "timestamp": 1429058484, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39, + "unknown": false + }, + "time": 1429058494, + "txn": { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "timestamp": 1429058494, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40, + "unknown": false + }, + "time": 1429058514, + "txn": { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "timestamp": 1429058514, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41, + "unknown": false + }, + "time": 1429058524, + "txn": { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "timestamp": 1429058524, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42, + "unknown": false + }, + "time": 1429058594, + "txn": { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "timestamp": 1429058594, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43, + "unknown": false + }, + "time": 1429070374, + "txn": { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "timestamp": 1429070374, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44, + "unknown": false + }, + "time": 1429070414, + "txn": { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "timestamp": 1429070414, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45, + "unknown": false + }, + "time": 1429071074, + "txn": { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "timestamp": 1429071074, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46, + "unknown": false + }, + "time": 1429077374, + "txn": { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "timestamp": 1429077374, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47, + "unknown": false + }, + "time": 1429077384, + "txn": { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "timestamp": 1429077384, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48, + "unknown": false + }, + "time": 1429077394, + "txn": { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "timestamp": 1429077394, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49, + "unknown": false + }, + "time": 1429077404, + "txn": { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "timestamp": 1429077404, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50, + "unknown": false + }, + "time": 1429077474, + "txn": { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "timestamp": 1429077474, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51, + "unknown": false + }, + "time": 1429077484, + "txn": { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "timestamp": 1429077484, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52, + "unknown": false + }, + "time": 1429077494, + "txn": { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "timestamp": 1429077494, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53, + "unknown": false + }, + "time": 1429077514, + "txn": { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "timestamp": 1429077514, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54, + "unknown": false + }, + "time": 1429077524, + "txn": { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "timestamp": 1429077524, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55, + "unknown": false + }, + "time": 1429077544, + "txn": { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "timestamp": 1429077544, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56, + "unknown": false + }, + "time": 1429077554, + "txn": { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "timestamp": 1429077554, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57, + "unknown": false + }, + "time": 1429077584, + "txn": { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "timestamp": 1429077584, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58, + "unknown": false + }, + "time": 1429077604, + "txn": { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "timestamp": 1429077604, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59, + "unknown": false + }, + "time": 1429077614, + "txn": { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "timestamp": 1429077614, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60, + "unknown": false + }, + "time": 1429077624, + "txn": { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "timestamp": 1429077624, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61, + "unknown": false + }, + "time": 1429077654, + "txn": { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "timestamp": 1429077654, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62, + "unknown": false + }, + "time": 1429077664, + "txn": { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "timestamp": 1429077664, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63, + "unknown": false + }, + "time": 1429077684, + "txn": { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "timestamp": 1429077684, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64, + "unknown": false + }, + "time": 1429077694, + "txn": { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "timestamp": 1429077694, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65, + "unknown": false + }, + "time": 1429077724, + "txn": { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "timestamp": 1429077724, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66, + "unknown": false + }, + "time": 1429077734, + "txn": { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "timestamp": 1429077734, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67, + "unknown": false + }, + "time": 1429077874, + "txn": { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "timestamp": 1429077874, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68, + "unknown": false + }, + "time": 1429077914, + "txn": { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "timestamp": 1429077914, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69, + "unknown": false + }, + "time": 1429077944, + "txn": { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "timestamp": 1429077944, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70, + "unknown": false + }, + "time": 1429077964, + "txn": { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "timestamp": 1429077964, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71, + "unknown": false + }, + "time": 1429077974, + "txn": { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "timestamp": 1429077974, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72, + "unknown": false + }, + "time": 1429078004, + "txn": { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "timestamp": 1429078004, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73, + "unknown": false + }, + "time": 1429091164, + "txn": { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "timestamp": 1429091164, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74, + "unknown": false + }, + "time": 1429091944, + "txn": { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "timestamp": 1429091944, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75, + "unknown": false + }, + "time": 1429096344, + "txn": { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "timestamp": 1429096344, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76, + "unknown": false + }, + "time": 1429110544, + "txn": { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "timestamp": 1429110544, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77, + "unknown": false + }, + "time": 1429147880, + "txn": { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "timestamp": 1429147880, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78, + "unknown": false + }, + "time": 1429147900, + "txn": { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "timestamp": 1429147900, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79, + "unknown": false + }, + "time": 1429147950, + "txn": { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "timestamp": 1429147950, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80, + "unknown": false + }, + "time": 1429148000, + "txn": { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "timestamp": 1429148000, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81, + "unknown": false + }, + "time": 1429164440, + "txn": { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "timestamp": 1429164440, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82, + "unknown": false + }, + "time": 1429164460, + "txn": { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "timestamp": 1429164460, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83, + "unknown": false + }, + "time": 1429164480, + "txn": { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "timestamp": 1429164480, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84, + "unknown": false + }, + "time": 1429164590, + "txn": { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "timestamp": 1429164590, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85, + "unknown": false + }, + "time": 1429164620, + "txn": { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "timestamp": 1429164620, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86, + "unknown": false + }, + "time": 1429164720, + "txn": { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "timestamp": 1429164720, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87, + "unknown": false + }, + "time": 1429164730, + "txn": { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "timestamp": 1429164730, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88, + "unknown": false + }, + "time": 1429164790, + "txn": { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "timestamp": 1429164790, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89, + "unknown": false + }, + "time": 1429164800, + "txn": { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "timestamp": 1429164800, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90, + "unknown": false + }, + "time": 1429164810, + "txn": { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "timestamp": 1429164810, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91, + "unknown": false + }, + "time": 1429164830, + "txn": { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "timestamp": 1429164830, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92, + "unknown": false + }, + "time": 1429164850, + "txn": { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "timestamp": 1429164850, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93, + "unknown": false + }, + "time": 1429164860, + "txn": { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "timestamp": 1429164860, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94, + "unknown": false + }, + "time": 1429164870, + "txn": { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "timestamp": 1429164870, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95, + "unknown": false + }, + "time": 1429164880, + "txn": { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "timestamp": 1429164880, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96, + "unknown": false + }, + "time": 1429164900, + "txn": { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "timestamp": 1429164900, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97, + "unknown": false + }, + "time": 1429165260, + "txn": { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "timestamp": 1429165260, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98, + "unknown": false + }, + "time": 1429274566, + "txn": { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "timestamp": 1429274566, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99, + "unknown": false + }, + "time": 1429274616, + "txn": { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "timestamp": 1429274616, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100, + "unknown": false + }, + "time": 1429274636, + "txn": { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "timestamp": 1429274636, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101, + "unknown": false + }, + "time": 1429274666, + "txn": { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "timestamp": 1429274666, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102, + "unknown": false + }, + "time": 1429274686, + "txn": { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "timestamp": 1429274686, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103, + "unknown": false + }, + "time": 1429278106, + "txn": { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "timestamp": 1429278106, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104, + "unknown": false + }, + "time": 1429278406, + "txn": { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "timestamp": 1429278406, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105, + "unknown": false + }, + "time": 1429278556, + "txn": { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "timestamp": 1429278556, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106, + "unknown": false + }, + "time": 1429279796, + "txn": { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "timestamp": 1429279796, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107, + "unknown": false + }, + "time": 1429280596, + "txn": { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "timestamp": 1429280596, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108, + "unknown": false + }, + "time": 1429280756, + "txn": { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "timestamp": 1429280756, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109, + "unknown": false + }, + "time": 1429302756, + "txn": { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "timestamp": 1429302756, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110, + "unknown": false + }, + "time": 1429326351, + "txn": { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "timestamp": 1429326351, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111, + "unknown": false + }, + "time": 1429348072, + "txn": { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "timestamp": 1429348072, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112, + "unknown": false + }, + "time": 1429348102, + "txn": { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "timestamp": 1429348102, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113, + "unknown": false + }, + "time": 1429348172, + "txn": { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "timestamp": 1429348172, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114, + "unknown": false + }, + "time": 1429348502, + "txn": { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "timestamp": 1429348502, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115, + "unknown": false + }, + "time": 1429348712, + "txn": { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "timestamp": 1429348712, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116, + "unknown": false + }, + "time": 1429349392, + "txn": { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "timestamp": 1429349392, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117, + "unknown": false + }, + "time": 1429351912, + "txn": { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "timestamp": 1429351912, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118, + "unknown": false + }, + "time": 1429364072, + "txn": { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "timestamp": 1429364072, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119, + "unknown": false + }, + "time": 1429364282, + "txn": { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "timestamp": 1429364282, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120, + "unknown": false + }, + "time": 1429364452, + "txn": { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "timestamp": 1429364452, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121, + "unknown": false + }, + "time": 1429382678, + "txn": { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "timestamp": 1429382678, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122, + "unknown": false + }, + "time": 1429382898, + "txn": { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "timestamp": 1429382898, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123, + "unknown": false + }, + "time": 1429451746, + "txn": { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "timestamp": 1429451746, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124, + "unknown": false + }, + "time": 1429522086, + "txn": { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "timestamp": 1429522086, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125, + "unknown": false + }, + "time": 1429578056, + "txn": { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "timestamp": 1429578056, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126, + "unknown": false + }, + "time": 1429680646, + "txn": { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "timestamp": 1429680646, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127, + "unknown": false + }, + "time": 1429848410, + "txn": { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "timestamp": 1429848410, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128, + "unknown": false + }, + "time": 1429849170, + "txn": { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "timestamp": 1429849170, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129, + "unknown": false + }, + "time": 1429849180, + "txn": { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "timestamp": 1429849180, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130, + "unknown": false + }, + "time": 1430311531, + "txn": { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "timestamp": 1430311531, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131, + "unknown": false + }, + "time": 1430330041, + "txn": { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "timestamp": 1430330041, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132, + "unknown": false + }, + "time": 1430330311, + "txn": { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "timestamp": 1430330311, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133, + "unknown": false + }, + "time": 1430330421, + "txn": { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "timestamp": 1430330421, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134, + "unknown": false + }, + "time": 1430330481, + "txn": { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "timestamp": 1430330481, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135, + "unknown": false + }, + "time": 1430330591, + "txn": { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "timestamp": 1430330591, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136, + "unknown": false + }, + "time": 1430330851, + "txn": { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "timestamp": 1430330851, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137, + "unknown": false + }, + "time": 1430504186, + "txn": { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "timestamp": 1430504186, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138, + "unknown": false + }, + "time": 1430504236, + "txn": { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "timestamp": 1430504236, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139, + "unknown": false + }, + "time": 1430504536, + "txn": { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "timestamp": 1430504536, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140, + "unknown": false + }, + "time": 1430504746, + "txn": { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "timestamp": 1430504746, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141, + "unknown": false + }, + "time": 1430504846, + "txn": { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "timestamp": 1430504846, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142, + "unknown": false + }, + "time": 1430504966, + "txn": { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "timestamp": 1430504966, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143, + "unknown": false + }, + "time": 1430505086, + "txn": { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "timestamp": 1430505086, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144, + "unknown": false + }, + "time": 1430505176, + "txn": { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "timestamp": 1430505176, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145, + "unknown": false + }, + "time": 1430550936, + "txn": { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "timestamp": 1430550936, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146, + "unknown": false + }, + "time": 1430641376, + "txn": { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "timestamp": 1430641376, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147, + "unknown": false + }, + "time": 1430641536, + "txn": { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "timestamp": 1430641536, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148, + "unknown": false + }, + "time": 1430642006, + "txn": { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "timestamp": 1430642006, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149, + "unknown": false + }, + "time": 1430642106, + "txn": { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "timestamp": 1430642106, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150, + "unknown": false + }, + "time": 1430642306, + "txn": { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "timestamp": 1430642306, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151, + "unknown": false + }, + "time": 1430642426, + "txn": { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "timestamp": 1430642426, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152, + "unknown": false + }, + "time": 1430642546, + "txn": { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "timestamp": 1430642546, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153, + "unknown": false + }, + "time": 1430642816, + "txn": { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "timestamp": 1430642816, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154, + "unknown": false + }, + "time": 1430643706, + "txn": { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "timestamp": 1430643706, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155, + "unknown": false + }, + "time": 1430643906, + "txn": { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "timestamp": 1430643906, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156, + "unknown": false + }, + "time": 1430644036, + "txn": { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "timestamp": 1430644036, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157, + "unknown": false + }, + "time": 1430673946, + "txn": { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "timestamp": 1430673946, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158, + "unknown": false + }, + "time": 1430674696, + "txn": { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "timestamp": 1430674696, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159, + "unknown": false + }, + "time": 1430715196, + "txn": { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "timestamp": 1430715196, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160, + "unknown": false + }, + "time": 1430784172, + "txn": { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "timestamp": 1430784172, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161, + "unknown": false + }, + "time": 1430784312, + "txn": { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "timestamp": 1430784312, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162, + "unknown": false + }, + "time": 1430784372, + "txn": { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "timestamp": 1430784372, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163, + "unknown": false + }, + "time": 1430784932, + "txn": { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "timestamp": 1430784932, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164, + "unknown": false + }, + "time": 1430790052, + "txn": { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "timestamp": 1430790052, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165, + "unknown": false + }, + "time": 1430790152, + "txn": { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "timestamp": 1430790152, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166, + "unknown": false + }, + "time": 1430791622, + "txn": { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "timestamp": 1430791622, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167, + "unknown": false + }, + "time": 1430791902, + "txn": { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "timestamp": 1430791902, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168, + "unknown": false + }, + "time": 1430792072, + "txn": { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "timestamp": 1430792072, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169, + "unknown": false + }, + "time": 1430836392, + "txn": { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "timestamp": 1430836392, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170, + "unknown": false + }, + "time": 1430836422, + "txn": { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "timestamp": 1430836422, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171, + "unknown": false + }, + "time": 1430870562, + "txn": { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "timestamp": 1430870562, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172, + "unknown": false + }, + "time": 1430870592, + "txn": { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "timestamp": 1430870592, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173, + "unknown": false + }, + "time": 1430871512, + "txn": { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "timestamp": 1430871512, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174, + "unknown": false + }, + "time": 1430871622, + "txn": { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "timestamp": 1430871622, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175, + "unknown": false + }, + "time": 1430908702, + "txn": { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "timestamp": 1430908702, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176, + "unknown": false + }, + "time": 1431162639, + "txn": { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "timestamp": 1431162639, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177, + "unknown": false + }, + "time": 1431162689, + "txn": { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "timestamp": 1431162689, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178, + "unknown": false + }, + "time": 1431162729, + "txn": { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "timestamp": 1431162729, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179, + "unknown": false + }, + "time": 1431339429, + "txn": { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "timestamp": 1431339429, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180, + "unknown": false + }, + "time": 1431574528, + "txn": { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "timestamp": 1431574528, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/src/gui/integration/test-fixtures/genesis-raw-tx.golden b/src/api/integration/testdata/genesis-raw-tx.golden similarity index 100% rename from src/gui/integration/test-fixtures/genesis-raw-tx.golden rename to src/api/integration/testdata/genesis-raw-tx.golden diff --git a/src/api/integration/testdata/genesis-transaction.golden b/src/api/integration/testdata/genesis-transaction.golden new file mode 100755 index 0000000..38d8c07 --- /dev/null +++ b/src/api/integration/testdata/genesis-transaction.golden @@ -0,0 +1,17 @@ +{ + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] +} diff --git a/src/gui/integration/test-fixtures/network-default-connections.golden b/src/api/integration/testdata/network-default-connections.golden similarity index 100% rename from src/gui/integration/test-fixtures/network-default-connections.golden rename to src/api/integration/testdata/network-default-connections.golden diff --git a/src/gui/integration/test-fixtures/network-exchangeable-connections.golden b/src/api/integration/testdata/network-exchangeable-connections.golden similarity index 100% rename from src/gui/integration/test-fixtures/network-exchangeable-connections.golden rename to src/api/integration/testdata/network-exchangeable-connections.golden diff --git a/src/gui/integration/test-fixtures/network-trusted-connections.golden b/src/api/integration/testdata/network-trusted-connections.golden similarity index 100% rename from src/gui/integration/test-fixtures/network-trusted-connections.golden rename to src/api/integration/testdata/network-trusted-connections.golden diff --git a/src/gui/integration/test-fixtures/outputs-addrs.golden b/src/api/integration/testdata/outputs-addrs.golden similarity index 100% rename from src/gui/integration/test-fixtures/outputs-addrs.golden rename to src/api/integration/testdata/outputs-addrs.golden diff --git a/src/gui/integration/test-fixtures/outputs-hashes.golden b/src/api/integration/testdata/outputs-hashes.golden similarity index 100% rename from src/gui/integration/test-fixtures/outputs-hashes.golden rename to src/api/integration/testdata/outputs-hashes.golden diff --git a/src/gui/integration/test-fixtures/outputs-noargs.golden b/src/api/integration/testdata/outputs-noargs.golden similarity index 100% rename from src/gui/integration/test-fixtures/outputs-noargs.golden rename to src/api/integration/testdata/outputs-noargs.golden diff --git a/src/gui/integration/test-fixtures/richlist-150-include-distribution.golden b/src/api/integration/testdata/richlist-150-include-distribution.golden similarity index 100% rename from src/gui/integration/test-fixtures/richlist-150-include-distribution.golden rename to src/api/integration/testdata/richlist-150-include-distribution.golden diff --git a/src/gui/integration/test-fixtures/richlist-8.golden b/src/api/integration/testdata/richlist-8.golden similarity index 100% rename from src/gui/integration/test-fixtures/richlist-8.golden rename to src/api/integration/testdata/richlist-8.golden diff --git a/src/gui/integration/test-fixtures/richlist-all-include-distribution.golden b/src/api/integration/testdata/richlist-all-include-distribution.golden similarity index 100% rename from src/gui/integration/test-fixtures/richlist-all-include-distribution.golden rename to src/api/integration/testdata/richlist-all-include-distribution.golden diff --git a/src/gui/integration/test-fixtures/richlist-all.golden b/src/api/integration/testdata/richlist-all.golden similarity index 100% rename from src/gui/integration/test-fixtures/richlist-all.golden rename to src/api/integration/testdata/richlist-all.golden diff --git a/src/gui/integration/test-fixtures/richlist-default.golden b/src/api/integration/testdata/richlist-default.golden similarity index 100% rename from src/gui/integration/test-fixtures/richlist-default.golden rename to src/api/integration/testdata/richlist-default.golden diff --git a/src/gui/integration/test-fixtures/single-addr.golden b/src/api/integration/testdata/single-addr.golden similarity index 100% rename from src/gui/integration/test-fixtures/single-addr.golden rename to src/api/integration/testdata/single-addr.golden diff --git a/src/gui/integration/test-fixtures/transaction.golden b/src/api/integration/testdata/transaction.golden similarity index 100% rename from src/gui/integration/test-fixtures/transaction.golden rename to src/api/integration/testdata/transaction.golden diff --git a/src/gui/integration/test-fixtures/uxout-addr.golden b/src/api/integration/testdata/uxout-addr.golden similarity index 100% rename from src/gui/integration/test-fixtures/uxout-addr.golden rename to src/api/integration/testdata/uxout-addr.golden diff --git a/src/gui/integration/test-fixtures/uxout-noaddr.golden b/src/api/integration/testdata/uxout-noaddr.golden similarity index 100% rename from src/gui/integration/test-fixtures/uxout-noaddr.golden rename to src/api/integration/testdata/uxout-noaddr.golden diff --git a/src/api/integration/testdata/uxout-spent.golden b/src/api/integration/testdata/uxout-spent.golden new file mode 100755 index 0000000..4ed814e --- /dev/null +++ b/src/api/integration/testdata/uxout-spent.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 181, + "spent_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947" +} diff --git a/src/gui/integration/test-fixtures/uxout.golden b/src/api/integration/testdata/uxout.golden similarity index 100% rename from src/gui/integration/test-fixtures/uxout.golden rename to src/api/integration/testdata/uxout.golden diff --git a/src/api/integration/testdata/verify-address.golden b/src/api/integration/testdata/verify-address.golden new file mode 100755 index 0000000..268bb84 --- /dev/null +++ b/src/api/integration/testdata/verify-address.golden @@ -0,0 +1,3 @@ +{ + "version": 0 +} diff --git a/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden b/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden new file mode 100755 index 0000000..5295a26 --- /dev/null +++ b/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden @@ -0,0 +1,39 @@ +{ + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "de977ea93c0090ebe6e0c2dea002ffaf4fc314d08d06534120d96b96cc0042ce", + "inner_hash": "c30ba73f9422e909c601777ace12c777db329e06875cc6b29383bac3766acdc7", + "fee": "188772", + "sigs": [ + "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + ], + "inputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": "377543", + "calculated_hours": "377543", + "timestamp": 1431574528, + "block": 180, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + } + ], + "outputs": [ + { + "uxid": "4ac148c444b86560bde4005fcf5d9f53ae18226b35a60911ab777dfe00e4cb89", + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "0.001000", + "hours": "10" + }, + { + "uxid": "a7369917d622df48d8f205e0935144a825df4d8318d82c8bd9492ab3ee11f102", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22099.999000", + "hours": "188761" + } + ] + } +} diff --git a/src/api/integration/testdata/verify-transaction-invalid-empty.golden b/src/api/integration/testdata/verify-transaction-invalid-empty.golden new file mode 100755 index 0000000..24a0f4c --- /dev/null +++ b/src/api/integration/testdata/verify-transaction-invalid-empty.golden @@ -0,0 +1,13 @@ +{ + "confirmed": false, + "transaction": { + "length": 0, + "type": 0, + "txid": "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": "0", + "sigs": [], + "inputs": [], + "outputs": [] + } +} diff --git a/src/api/integration/testdata/wallet-balance.golden b/src/api/integration/testdata/wallet-balance.golden new file mode 100755 index 0000000..3b86145 --- /dev/null +++ b/src/api/integration/testdata/wallet-balance.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "27nAhbBjHLcvD3UdbrH1YouKWYwmG94K9cw": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/src/gui/integration/test-fixtures/wallet-transactions.golden b/src/api/integration/testdata/wallet-transactions.golden similarity index 100% rename from src/gui/integration/test-fixtures/wallet-transactions.golden rename to src/api/integration/testdata/wallet-transactions.golden diff --git a/src/api/network.go b/src/api/network.go new file mode 100755 index 0000000..a42db7a --- /dev/null +++ b/src/api/network.go @@ -0,0 +1,136 @@ +package api + +// APIs for network-related information + +import ( + "net/http" + "sort" + + daemon "github.com/skycoin/skycoin/src/daemon" //http,json helpers + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// Connection wrapper around daemon connection with info about block height added +type Connection struct { + *daemon.Connection + Height uint64 `json:"height"` +} + +// Connections an array of connections +// Arrays must be wrapped in structs to avoid certain javascript exploits +type Connections struct { + Connections []Connection `json:"connections"` +} + +func connectionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("addr") + if addr == "" { + wh.Error400(w, "addr is required") + return + } + + c := gateway.GetConnection(addr) + if c == nil { + wh.Error404(w, "") + return + } + cnx := Connection{ + Connection: c, + Height: 0, + } + bcp, err := gateway.GetBlockchainProgress() + if err != nil { + wh.Error500(w, err.Error()) + return + } + for _, ph := range bcp.Peers { + if ph.Address == c.Addr { + cnx.Height = ph.Height + break + } + } + + wh.SendJSONOr500(logger, w, cnx) + } +} + +func connectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + dcnxs := gateway.GetConnections() + bcp, err := gateway.GetBlockchainProgress() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + peerHeights := bcp.Peers + index := make(map[string]uint64, len(peerHeights)) + + for i := 0; i < len(peerHeights); i++ { + index[peerHeights[i].Address] = peerHeights[i].Height + } + + cnxs := Connections{} + for _, c := range dcnxs.Connections { + cnx := Connection{ + Connection: c, + Height: index[c.Addr], + } + cnxs.Connections = append(cnxs.Connections, cnx) + } + wh.SendJSONOr500(logger, w, cnxs) + } +} + +func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetDefaultConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetTrustConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetExchgConnection() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} diff --git a/src/api/network_test.go b/src/api/network_test.go new file mode 100755 index 0000000..e21c863 --- /dev/null +++ b/src/api/network_test.go @@ -0,0 +1,453 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/daemon" +) + +func TestConnection(t *testing.T) { + bp := daemon.BlockchainProgress{ + Current: 35, + Highest: 39, + Peers: nil} + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.3.5.1", + Height: 39, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.0.1", + Height: 12, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.5.1", + Height: 13, + }) + + tt := []struct { + name string + method string + status int + err string + addr string + gatewayGetConnectionResult *daemon.Connection + gatewayGetBlockchainProgressResult *daemon.BlockchainProgress + gatewayGetBlockchainProgressError error + result *daemon.Connection + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty addr", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addr is required", + addr: "", + gatewayGetConnectionResult: nil, + result: nil, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + addr: "addr", + gatewayGetBlockchainProgressResult: &bp, + gatewayGetBlockchainProgressError: nil, + gatewayGetConnectionResult: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + result: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + { + name: "500 - blockchain progress failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - some error", + addr: "addr", + gatewayGetBlockchainProgressResult: nil, + gatewayGetBlockchainProgressError: errors.New("some error"), + gatewayGetConnectionResult: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connection" + gateway := NewGatewayerMock() + gateway.On("GetConnection", tc.addr).Return(tc.gatewayGetConnectionResult) + gateway.On("GetBlockchainProgress").Return( + tc.gatewayGetBlockchainProgressResult, + tc.gatewayGetBlockchainProgressError, + ) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.addr != "" { + v.Add("addr", tc.addr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.Connection + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestConnections(t *testing.T) { + bp := daemon.BlockchainProgress{ + Current: 35, + Highest: 39, + Peers: nil} + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.3.5.1", + Height: 39, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.0.1", + Height: 12, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.5.1", + Height: 13, + }) + + tt := []struct { + name string + method string + status int + err string + gatewayGetConnectionsResult *daemon.Connections + gatewayGetBlockchainProgressResult *daemon.BlockchainProgress + gatewayGetBlockchainProgressError error + result *daemon.Connections + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetBlockchainProgressResult: &bp, + gatewayGetBlockchainProgressError: nil, + gatewayGetConnectionsResult: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + result: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + }, + { + name: "500 - blockchain progress failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - some error", + gatewayGetBlockchainProgressResult: nil, + gatewayGetBlockchainProgressError: errors.New("some error"), + gatewayGetConnectionsResult: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections" + gateway := NewGatewayerMock() + gateway.On("GetConnections").Return(tc.gatewayGetConnectionsResult) + gateway.On("GetBlockchainProgress").Return( + tc.gatewayGetBlockchainProgressResult, + tc.gatewayGetBlockchainProgressError, + ) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.Connections + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDefaultConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetDefaultConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetDefaultConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/defaultConnections" + gateway := NewGatewayerMock() + gateway.On("GetDefaultConnections").Return(tc.gatewayGetDefaultConnectionsResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetTrustConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetTrustConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetTrustConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/trust" + gateway := NewGatewayerMock() + gateway.On("GetTrustConnections").Return(tc.gatewayGetTrustConnectionsResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetExchgConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetExchgConnectionResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetExchgConnectionResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/exchange" + gateway := NewGatewayerMock() + gateway.On("GetExchgConnection").Return(tc.gatewayGetExchgConnectionResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/src/api/notes.go b/src/api/notes.go new file mode 100755 index 0000000..ff2c684 --- /dev/null +++ b/src/api/notes.go @@ -0,0 +1,65 @@ +package api + +// NotesRPC note rpc +// type NotesRPC struct { +// Notes wallet.Notes +// WalletDirectory string +// } + +// // Ng global note +// var Ng *NotesRPC + +// // InitWalletRPC init wallet rpc +// func InitWalletRPC(walletDir string, options ...wallet.Option) { +// Ng = NewNotesRPC(walletDir) +// } + +// // NewNotesRPC new notes rpc +// func NewNotesRPC(walletDir string) *NotesRPC { +// rpc := &NotesRPC{} +// if err := os.MkdirAll(walletDir, os.FileMode(0700)); err != nil { +// logger.Panicf("Failed to create notes directory %s: %v", walletDir, err) +// } +// rpc.WalletDirectory = walletDir +// w, err := wallet.LoadNotes(rpc.WalletDirectory) +// if err != nil { +// logger.Panicf("Failed to load all notes: %v", err) +// } +// wallet.CreateNoteFileIfNotExist(walletDir) +// rpc.Notes = w +// return rpc +// } + +// GetNotesReadable returns readable notes +// func (nt *NotesRPC) GetNotesReadable() wallet.ReadableNotes { +// return nt.Notes.ToReadable() +// } + +// // Create a wallet Name is set by creation date +// func notesCreate(gateway *daemon.Gateway) http.HandlerFunc { +// return func(w http.ResponseWriter, r *http.Request) { +// logger.Info("API request made to create a note") +// note := r.FormValue("note") +// transactionID := r.FormValue("transaction_id") +// newNote := wallet.Note{ +// TxID: transactionID, +// Value: note, +// } +// Ng.Notes.SaveNote(Ng.WalletDirectory, newNote) +// rlt := Ng.GetNotesReadable() +// wh.SendOr500(w, rlt) +// } +// } + +// // Returns a wallet by ID if GET. Creates or updates a wallet if POST. +// func notesHandler(gateway *daemon.Gateway) http.HandlerFunc { +// return func(w http.ResponseWriter, r *http.Request) { +// //ret := wallet.Wallets.ToPublicReadable() +// ret := Ng.GetNotesReadable() +// wh.SendOr404(w, ret) +// } +// } + +// mux.Handle("/notes", notesHandler(gateway)) + +// mux.Handle("/notes/create", notesCreate(gateway)) diff --git a/src/api/spend.go b/src/api/spend.go new file mode 100755 index 0000000..8aaf04d --- /dev/null +++ b/src/api/spend.go @@ -0,0 +1,530 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/shopspring/decimal" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/wallet" +) + +// CreateTransactionResponse is returned by /wallet/transaction +type CreateTransactionResponse struct { + Transaction CreatedTransaction `json:"transaction"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// NewCreateTransactionResponse creates a CreateTransactionResponse +func NewCreateTransactionResponse(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreateTransactionResponse, error) { + cTxn, err := NewCreatedTransaction(txn, inputs) + if err != nil { + return nil, err + } + + return &CreateTransactionResponse{ + Transaction: *cTxn, + EncodedTransaction: hex.EncodeToString(txn.Serialize()), + }, nil +} + +// CreatedTransaction represents a transaction created by /wallet/transaction +type CreatedTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + TxID string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee string `json:"fee"` + + Sigs []string `json:"sigs"` + In []CreatedTransactionInput `json:"inputs"` + Out []CreatedTransactionOutput `json:"outputs"` +} + +// NewCreatedTransaction returns a CreatedTransaction +func NewCreatedTransaction(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + for _, o := range txn.Out { + var err error + outputHours, err = coin.AddUint64(outputHours, o.Hours) + if err != nil { + return nil, err + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = coin.AddUint64(inputHours, i.Hours) + if err != nil { + return nil, err + } + } + + if inputHours < outputHours { + return nil, errors.New("inputHours unexpectedly less than output hours") + } + + fee := inputHours - outputHours + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txid := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txid) + if err != nil { + return nil, err + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(inputs)) + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + return nil, err + } + in[i] = *ci + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txid.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ToTransaction converts a CreatedTransaction back to a coin.Transaction +func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { + t := coin.Transaction{} + + t.Length = r.Length + t.Type = r.Type + + var err error + t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) + if err != nil { + return nil, err + } + + sigs := make([]cipher.Sig, len(r.Sigs)) + for i, s := range r.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(r.In)) + for i, n := range r.In { + in[i], err = cipher.SHA256FromHex(n.UxID) + if err != nil { + return nil, err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(r.Out)) + for i, o := range r.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + hours, err := strconv.ParseUint(o.Hours, 10, 64) + if err != nil { + return nil, err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: hours, + } + } + + t.Out = out + + hash, err := cipher.SHA256FromHex(r.TxID) + if err != nil { + return nil, err + } + if t.Hash() != hash { + return nil, errors.New("ReadableTransaction.Hash does not match parsed transaction hash") + } + + return &t, nil +} + +// CreatedTransactionOutput is a transaction output +type CreatedTransactionOutput struct { + UxID string `json:"uxid"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// NewCreatedTransactionOutput creates CreatedTransactionOutput +func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + return &CreatedTransactionOutput{ + UxID: out.UxID(txid).Hex(), + Address: out.Address.String(), + Coins: coins, + Hours: fmt.Sprint(out.Hours), + }, nil +} + +// CreatedTransactionInput is a verbose transaction input +type CreatedTransactionInput struct { + UxID string `json:"uxid"` + Address string `json:"address,omitempty"` + Coins string `json:"coins,omitempty"` + Hours string `json:"hours,omitempty"` + CalculatedHours string `json:"calculated_hours,omitempty"` + Time uint64 `json:"timestamp,omitempty"` + Block uint64 `json:"block,omitempty"` + TxID string `json:"txid,omitempty"` +} + +// NewCreatedTransactionInput creates CreatedTransactionInput +func NewCreatedTransactionInput(out wallet.UxBalance) (*CreatedTransactionInput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + if out.SrcTransaction.Null() { + return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") + } + + addr := out.Address.String() + hours := fmt.Sprint(out.InitialHours) + calculatedHours := fmt.Sprint(out.Hours) + txID := out.SrcTransaction.Hex() + + return &CreatedTransactionInput{ + UxID: out.Hash.Hex(), + Address: addr, + Coins: coins, + Hours: hours, + CalculatedHours: calculatedHours, + Time: out.Time, + Block: out.BkSeq, + TxID: txID, + }, nil +} + +// createTransactionRequest is sent to /wallet/transaction +type createTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection hoursSelection `json:"hours_selection"` + Wallet createTransactionRequestWallet `json:"wallet"` + ChangeAddress *wh.Address `json:"change_address,omitempty"` + To []receiver `json:"to"` +} + +// createTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet +type createTransactionRequestWallet struct { + ID string `json:"id"` + UxOuts []wh.SHA256 `json:"unspents,omitempty"` + Addresses []wh.Address `json:"addresses,omitempty"` + Password string `json:"password"` +} + +// hoursSelection defines options for hours distribution +type hoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` +} + +// receiver specifies a spend destination +type receiver struct { + Address wh.Address `json:"address"` + Coins wh.Coins `json:"coins"` + Hours *wh.Hours `json:"hours,omitempty"` +} + +// Validate validates createTransactionRequest data +func (r createTransactionRequest) Validate() error { + switch r.HoursSelection.Type { + case wallet.HoursSelectionTypeAuto: + for i, to := range r.To { + if to.Hours != nil { + return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) + } + } + + switch r.HoursSelection.Mode { + case wallet.HoursSelectionModeShare: + case "": + return errors.New("missing hours_selection.mode") + default: + return errors.New("invalid hours_selection.mode") + } + + case wallet.HoursSelectionTypeManual: + for i, to := range r.To { + if to.Hours == nil { + return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) + } + } + + if r.HoursSelection.Mode != "" { + return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") + } + + case "": + return errors.New("missing hours_selection.type") + default: + return errors.New("invalid hours_selection.type") + } + + if r.HoursSelection.ShareFactor == nil { + if r.HoursSelection.Mode == wallet.HoursSelectionModeShare { + return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") + } + } else { + if r.HoursSelection.Mode != wallet.HoursSelectionModeShare { + return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") + } + + switch { + case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): + return errors.New("hours_selection.share_factor cannot be negative") + case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): + return errors.New("hours_selection.share_factor cannot be more than 1") + } + } + + if r.ChangeAddress != nil && r.ChangeAddress.Null() { + return errors.New("change_address must not be the null address") + } + + if r.Wallet.ID == "" { + return errors.New("missing wallet.id") + } + + addressMap := make(map[cipher.Address]struct{}, len(r.Wallet.Addresses)) + for i, a := range r.Wallet.Addresses { + if a.Null() { + return fmt.Errorf("wallet.addresses[%d] is empty", i) + } + + addressMap[a.Address] = struct{}{} + } + + if len(addressMap) != len(r.Wallet.Addresses) { + return errors.New("wallet.addresses contains duplicate values") + } + + if len(r.To) == 0 { + return errors.New("to is empty") + } + + for i, to := range r.To { + if to.Address.Null() { + return fmt.Errorf("to[%d].address is empty", i) + } + + if to.Coins == 0 { + return fmt.Errorf("to[%d].coins must not be zero", i) + } + + if to.Coins.Value()%visor.MaxDropletDivisor() != 0 { + return fmt.Errorf("to[%d].coins has too many decimal places", i) + } + } + + // Check for duplicate created outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) + for _, to := range r.To { + var hours uint64 + if to.Hours != nil { + hours = to.Hours.Value() + } + + outputs[coin.TransactionOutput{ + Address: to.Address.Address, + Coins: to.Coins.Value(), + Hours: hours, + }] = struct{}{} + } + + if len(outputs) != len(r.To) { + return errors.New("to contains duplicate values") + } + + if len(r.Wallet.UxOuts) != 0 && len(r.Wallet.Addresses) != 0 { + return errors.New("wallet.unspents and wallet.addresses cannot be combined") + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(r.Wallet.UxOuts)) + for _, o := range r.Wallet.UxOuts { + uxouts[o.SHA256] = struct{}{} + } + + if len(uxouts) != len(r.Wallet.UxOuts) { + return errors.New("wallet.unspents contains duplicate values") + } + + return nil +} + +// ToWalletParams converts createTransactionRequest to wallet.CreateTransactionParams +func (r createTransactionRequest) ToWalletParams() wallet.CreateTransactionParams { + addresses := make([]cipher.Address, len(r.Wallet.Addresses)) + for i, a := range r.Wallet.Addresses { + addresses[i] = a.Address + } + + uxouts := make([]cipher.SHA256, len(r.Wallet.UxOuts)) + for i, o := range r.Wallet.UxOuts { + uxouts[i] = o.SHA256 + } + + walletParams := wallet.CreateTransactionWalletParams{ + ID: r.Wallet.ID, + Addresses: addresses, + UxOuts: uxouts, + Password: []byte(r.Wallet.Password), + } + + to := make([]coin.TransactionOutput, len(r.To)) + for i, t := range r.To { + var hours uint64 + if t.Hours != nil { + hours = t.Hours.Value() + } + + to[i] = coin.TransactionOutput{ + Address: t.Address.Address, + Coins: t.Coins.Value(), + Hours: hours, + } + } + + var changeAddress *cipher.Address + if r.ChangeAddress != nil { + changeAddress = &r.ChangeAddress.Address + } + + return wallet.CreateTransactionParams{ + IgnoreUnconfirmed: r.IgnoreUnconfirmed, + HoursSelection: wallet.HoursSelection{ + Type: r.HoursSelection.Type, + Mode: r.HoursSelection.Mode, + ShareFactor: r.HoursSelection.ShareFactor, + }, + Wallet: walletParams, + ChangeAddress: changeAddress, + To: to, + } +} + +func createTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + wh.Error415(w) + return + } + + var params createTransactionRequest + err := json.NewDecoder(r.Body).Decode(¶ms) + if err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + if err := params.Validate(); err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + txn, inputs, err := gateway.CreateTransaction(params.ToWalletParams()) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error400(w, err.Error()) + } + case blockdb.ErrUnspentNotExist: + wh.Error400(w, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, + fee.ErrTxnInsufficientCoinHours, + wallet.ErrSpendingUnconfirmed: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + } + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnResp) + } +} diff --git a/src/api/spend_test.go b/src/api/spend_test.go new file mode 100755 index 0000000..50f08ce --- /dev/null +++ b/src/api/spend_test.go @@ -0,0 +1,904 @@ +package api + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" //http,json helpers + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/wallet" +) + +func TestCreateTransaction(t *testing.T) { + type rawRequestWallet struct { + ID string `json:"id"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + Password string `json:"password"` + } + + type rawHoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *string `json:"share_factor,omitempty"` + } + + type rawReceiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` + } + + type rawRequest struct { + HoursSelection rawHoursSelection `json:"hours_selection"` + Wallet rawRequestWallet `json:"wallet"` + ChangeAddress string `json:"change_address,omitempty"` + To []rawReceiver `json:"to"` + Password string `json:"password"` + } + + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []wallet.UxBalance{ + { + Hash: testutil.RandSHA256(t), + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 200, + InitialHours: 100, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := &CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: hex.EncodeToString(txn.Serialize()), + } + + validBody := &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + } + + walletInput := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + body *rawRequest + status int + err string + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []wallet.UxBalance + gatewayCreateTransactionErr error + createTransactionResponse *CreateTransactionResponse + csrfDisabled bool + contentType string + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: "application/x-www-form-urlencoded", + err: "415 Unsupported Media Type", + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: &rawRequest{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.type", + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.type", + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.mode", + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.mode", + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.share_factor when hours_selection.mode is share", + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor can only be used when hours_selection.mode is share", + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be negative", + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be more than 1", + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: rawRequestWallet{ + Addresses: []string{""}, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid base58 string", + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: rawRequestWallet{ + Addresses: []string{"xxx"}, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - change_address must not be the null address", + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must not be specified for auto hours_selection.mode", + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must be specified for manual hours_selection.mode", + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + Mode: wallet.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.mode cannot be used for manual hours_selection.type", + }, + + { + name: "400 - missing wallet ID", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{}, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet.id", + }, + + { + name: "400 - wallet address is empty", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{emptyAddress.String()}, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.addresses[0] is empty", + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].address is empty", + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins must not be zero", + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert 0.1a to decimal", + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax", + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert to decimal", + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins has too many decimal places", + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to is empty", + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - both wallet uxouts and wallet addresses specified", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.unspents and wallet.addresses cannot be combined", + }, + + { + name: "400 - duplicate wallet uxouts", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.unspents contains duplicate values", + }, + + { + name: "400 - duplicate wallet addresses", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.addresses contains duplicate values", + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + err: "500 Internal Server Error - unhandled error", + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + err: "400 Bad Request - Transaction has zero coinhour fee", + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + err: "400 Bad Request - Insufficient coinhours for transaction outputs", + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + err: "400 Bad Request - unspent output of foo does not exist", + }, + + { + name: "400 - other wallet error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewayCreateTransactionErr: wallet.ErrWalletNotExist, + err: "404 Not Found - wallet doesn't exist", + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewayCreateTransactionErr: wallet.ErrWalletAPIDisabled, + err: "403 Forbidden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.CreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body createTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + gateway.On("CreateTransaction", body.ToWalletParams()).Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } + + endpoint := "/api/v1/wallet/transaction" + + requestJSON, err := json.Marshal(tc.body) + require.NoError(t, err) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(requestJSON)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = "application/json" + } + + req.Header.Add("Content-Type", contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg CreateTransactionResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, tc.createTransactionResponse) + require.Equal(t, *tc.createTransactionResponse, msg) + } + }) + } +} + +func newStrPtr(s string) *string { + return &s +} diff --git a/src/api/transaction.go b/src/api/transaction.go new file mode 100755 index 0000000..da578c0 --- /dev/null +++ b/src/api/transaction.go @@ -0,0 +1,471 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// Returns pending transactions +func getPendingTxns(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txns, err := gateway.GetAllUnconfirmedTxns() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + ret := make([]*visor.ReadableUnconfirmedTxn, 0, len(txns)) + for _, unconfirmedTxn := range txns { + readable, err := visor.NewReadableUnconfirmedTxn(&unconfirmedTxn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + ret = append(ret, readable) + } + + wh.SendJSONOr500(logger, w, &ret) + } +} + +func getTransactionByID(gate Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gate.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + rbTxn, err := visor.NewReadableTransaction(txn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + resTxn := daemon.TransactionResult{ + Transaction: *rbTxn, + Status: txn.Status, + Time: txn.Time, + } + wh.SendJSONOr500(logger, w, &resTxn) + } +} + +// Returns transactions that match the filters. +// Method: GET +// URI: /api/v1/transactions +// Args: +// addrs: Comma seperated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +func getTransactions(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + flts := []visor.TxFilter{visor.AddrsFilter(addrs)} + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.ConfirmedTxFilter(confirmed)) + } + + // Gets transactions + txns, err := gateway.GetTransactions(flts...) + if err != nil { + err = fmt.Errorf("gateway.GetTransactions failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // Converts visor.Transaction to daemon.TransactionResult + txnRlts, err := daemon.NewTransactionResults(txns) + if err != nil { + err = fmt.Errorf("daemon.NewTransactionResults failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnRlts.Txns) + } +} + +// parseAddressesFromStr parses comma seperated addresses string into []cipher.Address +func parseAddressesFromStr(s string) ([]cipher.Address, error) { + addrsStr := splitCommaString(s) + + var addrs []cipher.Address + for _, s := range addrsStr { + a, err := cipher.DecodeBase58Address(s) + if err != nil { + return nil, err + } + + addrs = append(addrs, a) + } + + return addrs, nil +} + +// URI: /api/v1/injectTransaction +// Method: POST +// Content-Type: application/json +// Body: {"rawtx": ""} +// Response: +// 400 - bad transaction +// 503 - network unavailable for broadcasting transaction +// 200 - ok, returns the transaction hash in hex as string +func injectTransaction(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + // get the rawtransaction + v := struct { + Rawtx string `json:"rawtx"` + }{} + + if err := json.NewDecoder(r.Body).Decode(&v); err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err := hex.DecodeString(v.Rawtx) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := coin.TransactionDeserialize(b) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + err = fmt.Errorf("inject tx failed: %v", err) + wh.Error503(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txn.Hash().Hex()) + } +} + +func resendUnconfirmedTxns(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + rlt, err := gateway.ResendUnconfirmedTxns() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rlt) + return + } +} + +func getRawTxn(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if txn == nil { + wh.Error404(w, "") + return + } + + d := txn.Txn.Serialize() + wh.SendJSONOr500(logger, w, hex.EncodeToString(d)) + return + } +} + +// VerifyTxnRequest represents the data struct of the request for /api/v2/transaction/verify +type VerifyTxnRequest struct { + EncodedTransaction string `json:"encoded_transaction"` +} + +// VerifyTxnResponse the response data struct for /api/v2/transaction/verify +type VerifyTxnResponse struct { + Confirmed bool `json:"confirmed"` + Transaction CreatedTransaction `json:"transaction"` +} + +func writeHTTPResponse(w http.ResponseWriter, resp HTTPResponse) { + out, err := json.MarshalIndent(resp, "", " ") + if err != nil { + wh.Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if resp.Error == nil { + w.WriteHeader(http.StatusOK) + } else { + if resp.Error.Code < 400 || resp.Error.Code >= 600 { + logger.Critical().Errorf("writeHTTPResponse invalid error status code: %d", resp.Error.Code) + w.WriteHeader(http.StatusInternalServerError) + } else { + w.WriteHeader(resp.Error.Code) + } + } + + if _, err := w.Write(out); err != nil { + logger.WithError(err).Error("http Write failed") + } +} + +// Decode and verify an encoded transaction +// Method: POST +// URI: /api/v2/transaction/verify +func verifyTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyTxnRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + var resp HTTPResponse + inputs, isTxnConfirmed, err := gateway.VerifyTxnVerbose(txn) + if err != nil { + switch err.(type) { + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint: + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: err.Error(), + } + default: + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + } + + verifyTxnResp := VerifyTxnResponse{ + Confirmed: isTxnConfirmed, + } + + if len(inputs) != len(txn.In) { + inputs = nil + } + verboseTxn, err := newCreatedTransactionFuzzy(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + verifyTxnResp.Transaction = *verboseTxn + + resp.Data = verifyTxnResp + + if isTxnConfirmed && resp.Error == nil { + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "transaction has been spent", + } + } + + writeHTTPResponse(w, resp) + } +} + +func decodeTxn(encodedTxn string) (*coin.Transaction, error) { + var txn coin.Transaction + b, err := hex.DecodeString(encodedTxn) + if err != nil { + return nil, err + } + + txn, err = coin.TransactionDeserialize(b) + if err != nil { + return nil, err + } + + return &txn, nil +} + +// newCreatedTransactionFuzzy creates a CreatedTransaction but accomodates possibly invalid txn input +func newCreatedTransactionFuzzy(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) && len(inputs) != 0 { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + var feeInvalid bool + for _, o := range txn.Out { + var err error + outputHours, err = coin.AddUint64(outputHours, o.Hours) + if err != nil { + feeInvalid = true + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = coin.AddUint64(inputHours, i.Hours) + if err != nil { + feeInvalid = true + } + } + + if inputHours < outputHours { + feeInvalid = true + } + + var fee uint64 + if !feeInvalid { + fee = inputHours - outputHours + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txid := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txid) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionOutput failed") + continue + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(txn.In)) + if len(inputs) == 0 { + for i, h := range txn.In { + in[i] = CreatedTransactionInput{ + UxID: h.Hex(), + } + } + } else { + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionInput failed") + continue + } + in[i] = *ci + } + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txid.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} diff --git a/src/api/transaction_test.go b/src/api/transaction_test.go new file mode 100755 index 0000000..284db49 --- /dev/null +++ b/src/api/transaction_test.go @@ -0,0 +1,1045 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "math" + + "time" + + "net/url" + + "errors" + + "bytes" + "encoding/hex" + + "github.com/stretchr/testify/mock" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +func createUnconfirmedTxn(t *testing.T) visor.UnconfirmedTxn { + ut := visor.UnconfirmedTxn{} + ut.Txn = coin.Transaction{} + ut.Txn.InnerHash = testutil.RandSHA256(t) + ut.Received = utc.Now().UnixNano() + ut.Checked = ut.Received + ut.Announced = time.Time{}.UnixNano() + return ut +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeTransaction(t *testing.T) coin.Transaction { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(makeAddress(), 5e6, 50) + txn.UpdateHeader() + return txn +} + +func TestGetPendingTxs(t *testing.T) { + invalidTxn := createUnconfirmedTxn(t) + invalidTxn.Txn.Out = append(invalidTxn.Txn.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + + tt := []struct { + name string + method string + url string + status int + err string + getAllUnconfirmedTxnsResponse []visor.UnconfirmedTxn + getAllUnconfirmedTxnsErr error + httpResponse []*visor.ReadableUnconfirmedTxn + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, + }, + { + name: "500 - bad unconfirmedTxn", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{ + invalidTxn, + }, + }, + { + name: "500 - get unconfirmedTxn error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetAllUnconfirmedTxns failed", + getAllUnconfirmedTxnsErr: errors.New("GetAllUnconfirmedTxns failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, + httpResponse: []*visor.ReadableUnconfirmedTxn{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/pendingTxs" + gateway := NewGatewayerMock() + gateway.On("GetAllUnconfirmedTxns").Return(tc.getAllUnconfirmedTxnsResponse, tc.getAllUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*visor.ReadableUnconfirmedTxn + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetTransactionByID(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionReponse *visor.Transaction + getTransactionError error + httpResponse daemon.TransactionResult + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - empty txid", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{ + txid: "", + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{}, + httpResponse: daemon.TransactionResult{ + Transaction: visor.ReadableTransaction{ + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transaction" + gateway := NewGatewayerMock() + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionReponse, tc.getTransactionError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg daemon.TransactionResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestInjectTransaction(t *testing.T) { + validTransaction := makeTransaction(t) + type httpBody struct { + Rawtx string `json:"rawtx"` + } + + validTxnBody := &httpBody{Rawtx: hex.EncodeToString(validTransaction.Serialize())} + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{Rawtx: hex.EncodeToString(testutil.RandBytes(t, 128))} + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + httpBody string + injectTransactionArg coin.Transaction + injectTransactionError error + httpResponse string + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + injectTransactionArg: validTransaction, + }, + { + name: "400 - EOF", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - EOF", + }, + { + name: "400 - Invalid transaction: Deserialization failed", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Deserialization failed", + httpBody: `{"wrongKey":"wrongValue"}`, + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: `{"rawtx":"aab"}`, + }, + { + name: "400 - rawtx deserialization error", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Deserialization failed", + httpBody: string(invalidTxnBodyJSON), + }, + { + name: "503 - injectTransactionError", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - inject tx failed: injectTransactionError", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectTransactionError"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/injectTransaction" + gateway := NewGatewayerMock() + gateway.On("InjectBroadcastTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestResendUnconfirmedTxns(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + httpBody string + resendUnconfirmedTxnsResponse *daemon.ResendResult + resendUnconfirmedTxnsErr error + httpResponse *daemon.ResendResult + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 resend failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - ResendUnconfirmedTxns failed", + resendUnconfirmedTxnsErr: errors.New("ResendUnconfirmedTxns failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: &daemon.ResendResult{}, + httpResponse: &daemon.ResendResult{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/resendUnconfirmedTxns" + gateway := NewGatewayerMock() + gateway.On("ResendUnconfirmedTxns").Return(tc.resendUnconfirmedTxnsResponse, tc.resendUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.ResendResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetRawTx(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionResponse *visor.Transaction + getTransactionError error + httpResponse string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - txid is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{}, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionResponse: &visor.Transaction{}, + httpResponse: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/rawtx" + gateway := NewGatewayerMock() + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionResponse, tc.getTransactionError) + gateway.On("IsCSPEnabled").Return(false) + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestGetTransactions(t *testing.T) { + invalidAddrsStr := "invalid,addrs" + addrsStr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ,2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE" + var addrs []cipher.Address + for _, item := range []string{"2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE"} { + addr, err := cipher.DecodeBase58Address(item) + require.NoError(t, err) + addrs = append(addrs, addr) + } + invalidTxn := makeTransaction(t) + invalidTxn.Out = append(invalidTxn.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + type httpBody struct { + addrs string + confirmed string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionsArg []visor.TxFilter + getTransactionsResponse []visor.Transaction + getTransactionsError error + httpResponse []visor.Transaction + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid `addrs` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddrsStr, + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + }, + }, + { + name: "400 - invalid `confirmed` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid 'confirmed' value: strconv.ParseBool: parsing \"invalidConfirmed\": invalid syntax", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "invalidConfirmed", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + }, + }, + { + name: "500 - getTransactionsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetTransactions failed: getTransactionsError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsError: errors.New("getTransactionsError"), + }, + { + name: "500 - daemon.NewTransactionResults error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - daemon.NewTransactionResults failed: Droplet string conversion failed: Value is too large", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{ + { + Txn: invalidTxn, + Status: visor.TransactionStatus{ + Confirmed: true, + Height: 103, + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []visor.Transaction{}, + }, + } + + for _, tc := range tt { + endpoint := "/api/v1/transactions" + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("GetTransactions", mock.Anything).Return(tc.getTransactionsResponse, tc.getTransactionsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + if tc.httpBody.confirmed != "" { + v.Add("confirmed", tc.httpBody.confirmed) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []visor.Transaction + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +type transactionAndInputs struct { + txn coin.Transaction + inputs []wallet.UxBalance +} + +func newVerifyTxnResponseJSON(t *testing.T, txn *coin.Transaction, inputs []wallet.UxBalance, isTxnConfirmed bool) VerifyTxnResponse { + ctxn, err := newCreatedTransactionFuzzy(txn, inputs) + require.NoError(t, err) + return VerifyTxnResponse{ + Transaction: *ctxn, + Confirmed: isTxnConfirmed, + } +} + +func prepareTxnAndInputs(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(makeAddress(), 5e6, 50) + txn.UpdateHeader() + + input, err := wallet.NewUxBalance(uint64(utc.UnixNow()), ux) + require.NoError(t, err) + + return transactionAndInputs{txn: txn, inputs: []wallet.UxBalance{input}} +} + +func makeTransactionWithEmptyAddressOutput(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(cipher.Address{}, 5e6, 50) + txn.UpdateHeader() + + input, err := wallet.NewUxBalance(uint64(utc.UnixNow()), ux) + require.NoError(t, err) + + return transactionAndInputs{txn: txn, inputs: []wallet.UxBalance{input}} +} + +func TestVerifyTransaction(t *testing.T) { + txnAndInputs := prepareTxnAndInputs(t) + type httpBody struct { + EncodedTransaction string `json:"encoded_transaction"` + } + + validTxnBody := &httpBody{EncodedTransaction: hex.EncodeToString(txnAndInputs.txn.Serialize())} + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{EncodedTransaction: hex.EncodeToString(testutil.RandBytes(t, 128))} + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + invalidTxnEmptyAddress := makeTransactionWithEmptyAddressOutput(t) + invalidTxnEmptyAddressBody := &httpBody{ + EncodedTransaction: hex.EncodeToString(invalidTxnEmptyAddress.txn.Serialize()), + } + invalidTxnEmptyAddressBodyJSON, err := json.Marshal(invalidTxnEmptyAddressBody) + require.NoError(t, err) + + type verifyTxnVerboseResult struct { + Uxouts []wallet.UxBalance + IsTxnConfirmed bool + Err error + } + + tt := []struct { + name string + method string + contentType string + status int + err string + httpBody string + gatewayVerifyTxnVerboseArg coin.Transaction + gatewayVerifyTxnVerboseResult verifyTxnVerboseResult + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - Invalid transaction: Deserialization failed", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: `{"wrongKey":"wrongValue"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Deserialization failed"), + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: `{"encoded_transaction":"aab"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: encoding/hex: odd length hex string"), + }, + { + name: "400 - deserialization error", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: string(invalidTxnBodyJSON), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Deserialization failed"), + }, + { + name: "422 - txn sends to empty address", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusUnprocessableEntity, + httpBody: string(invalidTxnEmptyAddressBodyJSON), + gatewayVerifyTxnVerboseArg: invalidTxnEmptyAddress.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: invalidTxnEmptyAddress.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &invalidTxnEmptyAddress.txn, invalidTxnEmptyAddress.inputs, false), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "500 - internal server error", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusInternalServerError, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Err: errors.New("verify transaction failed"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "verify transaction failed"), + }, + { + name: "422 - txn is confirmed", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusUnprocessableEntity, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + IsTxnConfirmed: true, + }, + httpResponse: HTTPResponse{ + Error: &HTTPError{ + Message: "transaction has been spent", + Code: http.StatusUnprocessableEntity, + }, + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, true), + }, + }, + { + name: "200", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, false), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/transaction/verify" + gateway := NewGatewayerMock() + gateway.On("VerifyTxnVerbose", &tc.gatewayVerifyTxnVerboseArg).Return(tc.gatewayVerifyTxnVerboseResult.Uxouts, + tc.gatewayVerifyTxnVerboseResult.IsTxnConfirmed, tc.gatewayVerifyTxnVerboseResult.Err) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", tc.contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.NewDecoder(rr.Body).Decode(&rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var txnRsp VerifyTxnResponse + err := json.Unmarshal(rsp.Data, &txnRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyTxnResponse), txnRsp) + } + }) + } +} diff --git a/src/api/uxout.go b/src/api/uxout.go new file mode 100755 index 0000000..e6819f9 --- /dev/null +++ b/src/api/uxout.go @@ -0,0 +1,77 @@ +package api + +import ( + "net/http" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func getUxOutByID(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + uxid := r.FormValue("uxid") + if uxid == "" { + wh.Error400(w, "uxid is empty") + return + } + + id, err := cipher.SHA256FromHex(uxid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxout, err := gateway.GetUxOutByID(id) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if uxout == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, historydb.NewUxOutJSON(uxout)) + } +} + +func getAddrUxOuts(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxs, err := gateway.GetAddrUxOuts([]cipher.Address{cipherAddr}) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + //Convert slice UxOut to slice of UxOutJson + uxsJSON := make([]*historydb.UxOutJSON, len(uxs)) + for i, ux := range uxs { + uxsJSON[i] = historydb.NewUxOutJSON(ux) + } + + wh.SendJSONOr500(logger, w, uxsJSON) + } +} diff --git a/src/api/uxout_test.go b/src/api/uxout_test.go new file mode 100755 index 0000000..3c8bd26 --- /dev/null +++ b/src/api/uxout_test.go @@ -0,0 +1,282 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "errors" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func TestGetUxOutByID(t *testing.T) { + invalidHash := "carccb" + oddHash := "caccb" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + uxid string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getGetUxOutByIDArg cipher.SHA256 + getGetUxOutByIDResponse *historydb.UxOut + getGetUxOutByIDError error + httpResponse *historydb.UxOutJSON + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - uxid is empty", + httpBody: &httpBody{ + uxid: "", + }, + }, + { + name: "400 - odd length uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + uxid: oddHash, + }, + uxid: oddHash, + }, + { + name: "400 - invalid uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + uxid: invalidHash, + }, + uxid: invalidHash, + }, + { + name: "400 - getGetUxOutByIDError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getGetUxOutByIDError", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDError: errors.New("getGetUxOutByIDError"), + }, + { + name: "404 - uxout == nil", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDResponse: &historydb.UxOut{}, + httpResponse: historydb.NewUxOutJSON(&historydb.UxOut{}), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/uxout" + gateway.On("GetUxOutByID", tc.getGetUxOutByIDArg).Return(tc.getGetUxOutByIDResponse, tc.getGetUxOutByIDError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.uxid != "" { + v.Add("uxid", tc.httpBody.uxid) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *historydb.UxOutJSON + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetAddrUxOuts(t *testing.T) { + addressForGwError := testutil.MakeAddress() + addressForGwResponse := testutil.MakeAddress() + type httpBody struct { + address string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + getAddrUxOutsArg []cipher.Address + getAddrUxOutsResponse []*historydb.UxOut + getAddrUxOutsError error + httpResponse []*historydb.UxOutJSON + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + httpBody: &httpBody{ + address: "", + }, + }, + { + name: "400 - cipher.DecodeBase58Address error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid address length", + httpBody: &httpBody{ + address: "abcd", + }, + }, + { + name: "400 - gateway.GetAddrUxOuts error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getAddrUxOutsError", + httpBody: &httpBody{ + address: addressForGwError.String(), + }, + getAddrUxOutsArg: []cipher.Address{addressForGwError}, + getAddrUxOutsError: errors.New("getAddrUxOutsError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + address: addressForGwResponse.String(), + }, + getAddrUxOutsArg: []cipher.Address{addressForGwResponse}, + getAddrUxOutsResponse: []*historydb.UxOut{}, + httpResponse: []*historydb.UxOutJSON{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/address_uxouts" + gateway := NewGatewayerMock() + gateway.On("GetAddrUxOuts", tc.getAddrUxOutsArg).Return(tc.getAddrUxOutsResponse, tc.getAddrUxOutsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.address != "" { + v.Add("address", tc.httpBody.address) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*historydb.UxOutJSON + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/src/api/wallet.go b/src/api/wallet.go new file mode 100755 index 0000000..5bd16e7 --- /dev/null +++ b/src/api/wallet.go @@ -0,0 +1,919 @@ +package api + +// APIs for wallet-related information + +import ( + "fmt" + "net/http" + "sort" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/go-bip39" + + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/util/fee" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// HTTP401AuthHeader WWW-Authenticate value +const HTTP401AuthHeader = "SkycoinWallet" + +// SpendResult represents the result of spending +type SpendResult struct { + Balance *wallet.BalancePair `json:"balance,omitempty"` + Transaction *visor.ReadableTransaction `json:"txn,omitempty"` + Error string `json:"error,omitempty"` +} + +// UnconfirmedTxnsResponse contains unconfirmed transaction data +type UnconfirmedTxnsResponse struct { + Transactions []visor.ReadableUnconfirmedTxn `json:"transactions"` +} + +// WalletEntry the wallet entry struct +type WalletEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` +} + +// WalletMeta the wallet meta struct +type WalletMeta struct { + Coin string `json:"coin"` + Filename string `json:"filename"` + Label string `json:"label"` + Type string `json:"type"` + Version string `json:"version"` + CryptoType string `json:"crypto_type"` + Timestamp int64 `json:"timestamp"` + Encrypted bool `json:"encrypted"` +} + +// WalletResponse wallet response struct for http apis +type WalletResponse struct { + Meta WalletMeta `json:"meta"` + Entries []WalletEntry `json:"entries"` +} + +// BalanceResponse address balance summary struct +type BalanceResponse struct { + wallet.BalancePair + Addresses wallet.AddressBalance `json:"addresses"` +} + +// NewWalletResponse creates WalletResponse struct from *wallet.Wallet +func NewWalletResponse(w *wallet.Wallet) (*WalletResponse, error) { + var wr WalletResponse + + wr.Meta.Coin = w.Meta["coin"] + wr.Meta.Filename = w.Meta["filename"] + wr.Meta.Label = w.Meta["label"] + wr.Meta.Type = w.Meta["type"] + wr.Meta.Version = w.Meta["version"] + wr.Meta.CryptoType = w.Meta["cryptoType"] + + // Converts "encrypted" string to boolean if any + if encryptedStr, ok := w.Meta["encrypted"]; ok { + encrypted, err := strconv.ParseBool(encryptedStr) + if err != nil { + return nil, err + } + wr.Meta.Encrypted = encrypted + } + + if tmStr, ok := w.Meta["tm"]; ok { + // Converts "tm" string to integer timestamp. + tm, err := strconv.ParseInt(tmStr, 10, 64) + if err != nil { + return nil, err + } + wr.Meta.Timestamp = tm + } + + for _, e := range w.Entries { + wr.Entries = append(wr.Entries, WalletEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + }) + } + + return &wr, nil +} + +// Returns the wallet's balance, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/wallet/balance +// Method: GET +// Args: +// id: wallet id [required] +func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + walletBalance, addressBalances, err := gateway.GetWalletBalance(wltID) + if err != nil { + logger.Errorf("Get wallet balance failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + break + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + break + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: walletBalance, + Addresses: addressBalances, + }) + } +} + +// Returns the balance of one or more addresses, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/balance +// Method: GET +// Args: +// addrs: command separated list of addresses [required] +func getBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrsParam := r.FormValue("addrs") + addrsStr := splitCommaString(addrsParam) + + addrs := make([]cipher.Address, 0, len(addrsStr)) + for _, addr := range addrsStr { + a, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, fmt.Sprintf("address %s is invalid: %v", addr, err)) + return + } + addrs = append(addrs, a) + } + + if len(addrs) == 0 { + wh.Error400(w, "addrs is required") + return + } + + bals, err := gateway.GetBalanceOfAddrs(addrs) + if err != nil { + err = fmt.Errorf("gateway.GetBalanceOfAddrs failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // create map of address to balance + addressBalances := make(wallet.AddressBalance, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = bals[idx] + } + + var balance wallet.BalancePair + for _, bal := range bals { + var err error + balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + balance.Predicted, err = balance.Predicted.Add(bal.Predicted) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: balance, + Addresses: addressBalances, + }) + } +} + +// Creates and broadcasts a transaction sending money from one of our wallets +// to destination address. +// URI: /api/v1/wallet/spend +// Method: POST +// Args: +// id: wallet id +// dst: recipient address +// coins: the number of droplet you will send +// password: wallet password +// Response: +// balance: new balance of the wallet +// txn: spent transaction +// error: an error that may have occured after broadcast the transaction to the network +// if this field is not empty, the spend succeeded, but the response data could not be prepared +func walletSpendHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + sdst := r.FormValue("dst") + if sdst == "" { + wh.Error400(w, "missing destination address \"dst\"") + return + } + dst, err := cipher.DecodeBase58Address(sdst) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid destination address: %v", err)) + return + } + + scoins := r.FormValue("coins") + coins, err := strconv.ParseUint(scoins, 10, 64) + if err != nil { + wh.Error400(w, `invalid "coins" value`) + return + } + + if coins <= 0 { + wh.Error400(w, `invalid "coins" value, must > 0`) + return + } + + tx, err := gateway.Spend(wltID, []byte(r.FormValue("password")), coins, dst) + switch err { + case nil: + case fee.ErrTxnNoFee, + wallet.ErrSpendingUnconfirmed, + wallet.ErrInsufficientBalance, + wallet.ErrWalletNotEncrypted, + wallet.ErrMissingPassword, + wallet.ErrWalletEncrypted: + wh.Error400(w, err.Error()) + return + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + return + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + return + default: + wh.Error500(w, err.Error()) + return + } + + txStr, err := visor.TransactionToJSON(*tx) + if err != nil { + logger.Error(err) + wh.SendJSONOr500(logger, w, SpendResult{ + Error: err.Error(), + }) + return + } + + logger.Infof("Spend: \ntx= \n %s \n", txStr) + + var ret SpendResult + + ret.Transaction, err = visor.NewReadableTransaction(&visor.Transaction{Txn: *tx}) + if err != nil { + err = fmt.Errorf("Creation of new readable transaction failed: %v", err) + logger.Error(err) + ret.Error = err.Error() + wh.SendJSONOr500(logger, w, ret) + return + } + + // Get the new wallet balance + walletBalance, _, err := gateway.GetWalletBalance(wltID) + if err != nil { + err = fmt.Errorf("Get wallet balance failed: %v", err) + logger.Error(err) + ret.Error = err.Error() + wh.SendJSONOr500(logger, w, ret) + return + } + ret.Balance = &walletBalance + + wh.SendJSONOr500(logger, w, ret) + } +} + +// Loads wallet from seed, will scan ahead N address and +// load addresses till the last one that have coins. +// Method: POST +// Args: +// seed: wallet seed [required] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// encrypt: bool value, whether encrypt the wallet [optional] +// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] +func walletCreate(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + seed := r.FormValue("seed") + if seed == "" { + wh.Error400(w, "missing seed") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + var encrypt bool + encryptStr := r.FormValue("encrypt") + if encryptStr != "" { + var err error + encrypt, err = strconv.ParseBool(encryptStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) + return + } + } + + if encrypt && len(password) == 0 { + wh.Error400(w, "missing password") + return + } + + if !encrypt && len(password) > 0 { + wh.Error400(w, "encrypt must be true as password is provided") + return + } + + scanNStr := r.FormValue("scan") + var scanN uint64 = 1 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + if scanN == 0 { + wh.Error400(w, "scan must be > 0") + return + } + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Seed: seed, + Label: label, + Encrypt: encrypt, + Password: []byte(password), + ScanN: scanN, + }) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Genreates new addresses +// URI: /api/v1/wallet/newAddress +// Method: POST +// Args: +// id: wallet id [required] +// num: number of address need to create [optional, if not set the default value is 1] +// password: wallet password [optional, must be provided if the wallet is encrypted] +func walletNewAddresses(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + // the number of address that need to create, default is 1 + var n uint64 = 1 + var err error + num := r.FormValue("num") + if num != "" { + n, err = strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + addrs, err := gateway.NewAddresses(wltID, []byte(password), n) + if err != nil { + switch err { + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + return + } +} + +// Update wallet label +// URI: /api/v1/wallet/update +// Method: POST +// Args: +// id: wallet id [required] +// label: the label the wallet will be updated to [required] +func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + // Update wallet + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + if err := gateway.UpdateWalletLabel(wltID, label); err != nil { + logger.Errorf("update wallet label failed: %v", err) + + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, "success") + } +} + +// Returns a wallet by id +// URI: /api/v1/wallet +// Method: GET +// Args: +// id: wallet id [required] +func walletGet(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, fmt.Sprintf("missing wallet id")) + return + } + + wlt, err := gateway.GetWallet(wltID) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Returns JSON of unconfirmed transactions for user's wallet +// URI: /api/v1/wallet/transactions +// Method: GET +// Args: +// id: wallet id [required] +func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + txns, err := gateway.GetWalletUnconfirmedTxns(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + unconfirmedTxns, err := visor.NewReadableUnconfirmedTxns(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + unconfirmedTxnResp := UnconfirmedTxnsResponse{ + Transactions: unconfirmedTxns, + } + wh.SendJSONOr500(logger, w, unconfirmedTxnResp) + } +} + +// Returns all loaded wallets +// URI: /api/v1/wallets +// Method: GET +func walletsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wlts, err := gateway.GetWallets() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wrs := make([]*WalletResponse, 0, len(wlts)) + for _, wlt := range wlts { + wr, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wrs = append(wrs, wr) + } + + sort.Slice(wrs, func(i, j int) bool { + return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp + }) + + wh.SendJSONOr500(logger, w, wrs) + } +} + +// WalletFolder struct +type WalletFolder struct { + Address string `json:"address"` +} + +// Returns the wallet directory path +// URI: /api/v1/wallets/folderName +// Method: GET +func getWalletFolder(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr, err := gateway.GetWalletDir() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + ret := WalletFolder{ + Address: addr, + } + wh.SendJSONOr500(logger, w, ret) + } +} + +// Generates wallet seed +// URI: /api/v1/wallet/newSeed +// Method: GET +// Args: +// entropy: entropy bitsize [optional, default value of 128 will be used if not set] +func newWalletSeed(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if !gateway.IsWalletAPIEnabled() { + wh.Error403(w, "") + return + } + + entropyValue := r.FormValue("entropy") + if entropyValue == "" { + entropyValue = "128" + } + + entropyBits, err := strconv.Atoi(entropyValue) + if err != nil { + wh.Error400(w, "invalid entropy") + return + } + + // Entropy bit size can either be 128 or 256 + if entropyBits != 128 && entropyBits != 256 { + wh.Error400(w, "entropy length must be 128 or 256") + return + } + + entropy, err := bip39.NewEntropy(entropyBits) + if err != nil { + err = fmt.Errorf("bip39.NewEntropy failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + err = fmt.Errorf("bip39.NewDefaultMnemonic failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + var rlt = struct { + Seed string `json:"seed"` + }{ + mnemonic, + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Returns seed of wallet of given id +// URI: /api/v1/wallet/seed +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + seed, err := gateway.GetWalletSeed(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + v := struct { + Seed string `json:"seed"` + }{ + Seed: seed, + } + + wh.SendJSONOr500(logger, w, v) + } +} + +// Unloads wallet from the wallet service +// URI: /api/v1/wallet/unload +// Method: POST +// Args: +// id: wallet id +func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + if err := gateway.UnloadWallet(id); err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + } +} + +// Encrypts wallet +// URI: /api/v1/wallet/encrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.EncryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrWalletEncrypted, wallet.ErrMissingPassword: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + // Make sure the sensitive data are wiped + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Decrypts wallet +// URI: /api/v1/wallet/decrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.DecryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} diff --git a/src/api/wallet_test.go b/src/api/wallet_test.go new file mode 100755 index 0000000..fde88df --- /dev/null +++ b/src/api/wallet_test.go @@ -0,0 +1,2558 @@ +package api + +import ( + "bytes" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +const configuredHost = "127.0.0.1:6420" + +var mxConfig = muxConfig{host: configuredHost, appLoc: "."} + +func TestWalletSpendHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + Password string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + coins uint64 + dst string + password string + gatewaySpendResult *coin.Transaction + gatewaySpendErr error + gatewayGetWalletBalanceResult BalanceResponse + gatewayBalanceErr error + spendResult *SpendResult + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "400 - no dst", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing destination address \"dst\"", + walletID: "0", + }, + { + name: "400 - bad dst addr", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: " 2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid destination address: Invalid base58 character", + walletID: "0", + }, + { + name: "400 - no coins", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - coins is string", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - coins is negative value", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "-123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - zero coins", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value, must > 0", + walletID: "0", + }, + { + name: "400 - gw spend error txn no fee", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction has zero coinhour fee", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: fee.ErrTxnNoFee, + spendResult: &SpendResult{ + Error: fee.ErrTxnNoFee.Error(), + }, + }, + { + name: "400 - gw spend error spending unconfirmed", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - please spend after your pending transaction is confirmed", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrSpendingUnconfirmed, + spendResult: &SpendResult{ + Error: wallet.ErrSpendingUnconfirmed.Error(), + }, + }, + { + name: "400 - gw spend error insufficient balance", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - balance is not sufficient", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrInsufficientBalance, + spendResult: &SpendResult{ + Error: wallet.ErrInsufficientBalance.Error(), + }, + }, + { + name: "404 - gw spend error wallet not exist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrWalletNotExist, + spendResult: &SpendResult{ + Error: wallet.ErrWalletNotExist.Error(), + }, + }, + { + name: "500 - gw spend error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Spend error", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: errors.New("Spend error"), + spendResult: &SpendResult{ + Error: "Spend error", + }, + }, + { + name: "200 - gw GetWalletBalance error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + gatewayBalanceErr: errors.New("GetWalletBalance error"), + spendResult: &SpendResult{ + Error: "Get wallet balance failed: GetWalletBalance error", + Transaction: &visor.ReadableTransaction{ + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrWalletAPIDisabled, + spendResult: &SpendResult{ + Error: wallet.ErrWalletAPIDisabled.Error(), + }, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + spendResult: &SpendResult{ + Balance: &wallet.BalancePair{}, + Transaction: &visor.ReadableTransaction{ + Length: 0, + Type: 0, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Timestamp: 0, + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + }, + }, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + spendResult: &SpendResult{ + Balance: &wallet.BalancePair{}, + Transaction: &visor.ReadableTransaction{ + Length: 0, + Type: 0, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Timestamp: 0, + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + }, + }, + csrfDisabled: true, + }, + { + name: "400 - missing password", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + }, + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrMissingPassword, + err: "400 Bad Request - missing password", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrMissingPassword.Error(), + }, + }, + { + name: "401 Unauthorized - invalid password", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + Password: "pwd", + }, + password: "pwd", + status: http.StatusUnauthorized, + gatewaySpendErr: wallet.ErrInvalidPassword, + err: "401 Unauthorized - invalid password", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrInvalidPassword.Error(), + }, + }, + { + name: "400 - wallet is encrypted", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + }, + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrWalletEncrypted.Error(), + }, + }, + { + name: "400 - wallet is not encrypted", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + Password: "pwd", + }, + password: "pwd", + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrWalletNotEncrypted, + err: "400 Bad Request - wallet is not encrypted", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrWalletNotEncrypted.Error(), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if tc.gatewaySpendResult == nil { + tc.gatewaySpendResult = &coin.Transaction{} + } + + gateway := &GatewayerMock{} + addr, _ := cipher.DecodeBase58Address(tc.dst) + gateway.On("Spend", tc.walletID, []byte(tc.password), tc.coins, addr).Return(tc.gatewaySpendResult, tc.gatewaySpendErr) + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/spend" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Dst != "" { + v.Add("dst", tc.body.Dst) + } + if tc.body.Coins != "" { + v.Add("coins", tc.body.Coins) + } + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var msg SpendResult + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, *tc.spendResult, msg) + } + }) + } +} + +func TestWalletGet(t *testing.T) { + entries, resEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + url string + body *httpBody + status int + err string + walletID string + gatewayGetWalletResult wallet.Wallet + responseBody WalletResponse + gatewayGetWalletErr error + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "", + }, + { + name: "400 - error from the `gateway.GetWallet(wltID)`", + method: http.MethodGet, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet 123 doesn't exist", + walletID: "123", + gatewayGetWalletErr: errors.New("wallet 123 doesn't exist"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "1234", + gatewayGetWalletResult: wallet.Wallet{ + Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, + Entries: []wallet.Entry{}, + }, + gatewayGetWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusOK, + walletID: "1234", + gatewayGetWalletResult: wallet.Wallet{ + Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, + Entries: cloneEntries(entries), + }, + responseBody: WalletResponse{Entries: resEntries[:]}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetWallet", tc.walletID).Return(&tc.gatewayGetWalletResult, tc.gatewayGetWalletErr) + gateway.On("IsCSPEnabled").Return(false) + v := url.Values{} + + endpoint := "/api/v1/wallet" + + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var rlt WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rlt) + require.NoError(t, err) + require.Equal(t, tc.responseBody, rlt) + } + }) + } +} + +func TestWalletBalanceHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletBalanceResult BalanceResponse + gatewayBalanceErr error + result *wallet.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "404 - gw `wallet doesn't exist` error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "notFoundId", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "notFoundId", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: wallet.ErrWalletNotExist, + result: &wallet.BalancePair{ + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "500 - gw other error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "someId", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayBalanceError", + walletID: "someId", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: errors.New("gatewayBalanceError"), + result: &wallet.BalancePair{ + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + result: &wallet.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/balance" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg wallet.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, &msg, tc.name) + } + }) + } +} + +func TestUpdateWalletLabelHandler(t *testing.T) { + type httpBody struct { + WalletID string + Label string + } + + tt := []struct { + name string + method string + url string + body *httpBody + status int + err string + walletID string + label string + gatewayUpdateWalletLabelErr error + responseBody string + }{ + { + name: "405", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + walletID: "foo", + }, + { + name: "404 - gateway.UpdateWalletLabel ErrWalletNotExist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletNotExist, + }, + { + name: "500 - gateway.UpdateWalletLabel error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.UpdateWalletLabel error", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: errors.New("gateway.UpdateWalletLabel error"), + }, + { + name: "403 Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: nil, + responseBody: "\"success\"", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("UpdateWalletLabel", tc.walletID, tc.label).Return(tc.gatewayUpdateWalletLabelErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + require.Equal(t, tc.responseBody, rr.Body.String(), tc.name) + } + }) + } +} + +func TestWalletTransactionsHandler(t *testing.T) { + type httpBody struct { + WalletID string + } + + unconfirmedTxn, _ := visor.NewReadableUnconfirmedTxn(&visor.UnconfirmedTxn{}) + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletUnconfirmedTxnsResult []visor.UnconfirmedTxn + gatewayGetWalletUnconfirmedTxnsErr error + responseBody UnconfirmedTxnsResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "500 - gateway.GetWalletUnconfirmedTxns error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTxns error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: errors.New("gateway.GetWalletUnconfirmedTxns error"), + }, + { + name: "404 - wallet doesn't exist", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletNotExist, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsResult: make([]visor.UnconfirmedTxn, 1), + responseBody: UnconfirmedTxnsResponse{Transactions: []visor.ReadableUnconfirmedTxn{*unconfirmedTxn}}, + }, + } + + for _, tc := range tt { + gateway := &GatewayerMock{} + gateway.On("GetWalletUnconfirmedTxns", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsResult, tc.gatewayGetWalletUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/transactions" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg UnconfirmedTxnsResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Txn, tc.responseBody.Transactions[0].Txn) + } + } +} + +func TestWalletCreateHandler(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + Seed string + Label string + ScanN string + Encrypt bool + Password string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + wltName string + options wallet.Options + gatewayCreateWalletResult wallet.Wallet + gatewayCreateWalletErr error + scanWalletAddressesResult wallet.Wallet + scanWalletAddressesError error + responseBody WalletResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + wltName: "foo", + }, + { + name: "400 - missing seed", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing seed", + wltName: "foo", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + wltName: "foo", + }, + { + name: "400 - invalid scan value", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "bad scanN", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid scan value", + wltName: "foo", + }, + { + name: "400 - scan must be > 0", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - scan must be > 0", + wltName: "foo", + }, + { + name: "400 - gateway.CreateWallet error", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.CreateWallet error", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: errors.New("gateway.CreateWallet error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + // CSRF Tests + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + }, + }, + csrfDisabled: true, + }, + { + name: "200 - OK - Encrypted", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + Encrypt: true, + Password: "pwd", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + Label: "bar", + Encrypted: true, + }, + }, + }, + { + name: "400 Bad request - encrypt without password", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + Encrypt: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + if tc.options.ScanN == 0 { + tc.options.ScanN = 1 + } + gateway.On("CreateWallet", "", tc.options).Return(&tc.gatewayCreateWalletResult, tc.gatewayCreateWalletErr) + // gateway.On("ScanAheadWalletAddresses", tc.wltName, tc.options.Password, tc.scnN-1).Return(&tc.scanWalletAddressesResult, tc.scanWalletAddressesError) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/create" + + v := url.Values{} + if tc.body != nil { + if tc.body.Seed != "" { + v.Add("seed", tc.body.Seed) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + if tc.body.ScanN != "" { + v.Add("scan", tc.body.ScanN) + } + + if tc.body.Encrypt { + v.Add("encrypt", strconv.FormatBool(tc.body.Encrypt)) + } + + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + type httpBody struct { + Entropy string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + entropy string + resultLen int + }{ + { + name: "405", + method: http.MethodPut, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid entropy type", + method: http.MethodGet, + body: &httpBody{ + Entropy: "xx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid entropy", + entropy: "xx", + }, + { + name: "400 - `wrong entropy length` error", + method: http.MethodGet, + body: &httpBody{ + Entropy: "200", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - entropy length must be 128 or 256", + entropy: "200", + }, + { + name: "200 - OK with no entropy", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 12 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "128", + }, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 24 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "256", + }, + status: http.StatusOK, + entropy: "256", + resultLen: 24, + }, + } + + // Loop over each test case + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsWalletAPIEnabled").Return(true) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/newSeed" + + // Add request parameters to url + v := url.Values{} + if tc.body != nil { + if tc.body.Entropy != "" { + v.Add("entropy", tc.body.Entropy) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` expected `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, expected `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg struct { + Seed string `json:"seed"` + } + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // check that expected length is equal to response length + require.Equal(t, tc.resultLen, len(strings.Fields(msg.Seed)), tc.name) + } + }) + } +} + +func TestGetWalletSeed(t *testing.T) { + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturnArgs []interface{} + expectStatus int + expectSeed string + expectErr string + csrfDisabled bool + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + csrfDisabled: true, + }, + { + name: "400 - missing wallet id ", + method: http.MethodPost, + wltID: "", + password: "pwd", + gatewayReturnArgs: []interface{}{}, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrMissingPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "401 Unauthorized - Invalid password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrInvalidPassword, + }, + expectStatus: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrWalletNotEncrypted, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "404 - wallet does not exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrWalletNotExist, + }, + expectStatus: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "405 - Method Not Allowed", + method: http.MethodGet, + expectStatus: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("GetWalletSeed", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturnArgs...) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/seed" + + v := url.Values{} + v.Add("id", tc.wltID) + if len(tc.password) > 0 { + v.Add("password", tc.password) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.expectStatus, status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var r struct { + Seed string `json:"seed"` + } + err := json.Unmarshal(rr.Body.Bytes(), &r) + require.NoError(t, err) + require.Equal(t, tc.expectSeed, r.Seed) + } + }) + } +} + +func TestWalletNewAddressesHandler(t *testing.T) { + type httpBody struct { + ID string + Num string + Password string + } + type Addresses struct { + Address []string `json:"addresses"` + } + + var responseAddresses = Addresses{} + var responseEmptyAddresses = Addresses{} + + var emptyAddrs = make([]cipher.Address, 0) + var addrs = make([]cipher.Address, 3) + + for i := 0; i < 3; i++ { + pub, _ := cipher.GenerateDeterministicKeyPair(cipher.RandByte(32)) + addrs[i] = cipher.AddressFromPubKey(pub) + responseAddresses.Address = append(responseAddresses.Address, addrs[i].String()) + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + n uint64 + password string + gatewayNewAddressesResult []cipher.Address + gatewayNewAddressesErr error + responseBody Addresses + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - invalid num value", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "bar", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid num value", + }, + { + name: "400 - gateway.NewAddresses error", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.NewAddresses error", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: errors.New("gateway.NewAddresses error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "400 Bad Request - missing password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrMissingPassword, + }, + { + name: "401 Unauthorized - Invalid password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusUnauthorized, + err: "401 Unauthorized - invalid password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrInvalidPassword, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK with password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + Password: "pwd", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK empty addresses", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "0", + }, + status: http.StatusOK, + walletID: "foo", + n: 0, + gatewayNewAddressesResult: emptyAddrs, + responseBody: responseEmptyAddresses, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("NewAddresses", tc.walletID, []byte(tc.password), tc.n).Return(tc.gatewayNewAddressesResult, tc.gatewayNewAddressesErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/newAddress" + + v := url.Values{} + if tc.body != nil { + if tc.body.ID != "" { + v.Add("id", tc.body.ID) + } + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var msg Addresses + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + }) + } +} + +func TestGetWalletFolderHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + getWalletDirResponse string + getWalletDirErr error + httpResponse WalletFolder + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletDirResponse: "/wallet/folder/address", + httpResponse: WalletFolder{ + Address: "/wallet/folder/address", + }, + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletDirErr: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + gateway := &GatewayerMock{} + gateway.On("GetWalletDir").Return(tc.getWalletDirResponse, tc.getWalletDirErr) + gateway.On("IsCSPEnabled").Return(false) + endpoint := "/api/v1/wallets/folderName" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletFolder + json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestGetWallets(t *testing.T) { + var pubkeys []cipher.PubKey + var seckeys []cipher.SecKey + var addrs []cipher.Address + + for i := 0; i < 4; i++ { + pubkey, seckey := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubkey) + pubkeys = append(pubkeys, pubkey) + seckeys = append(seckeys, seckey) + addrs = append(addrs, addr) + } + + cases := []struct { + name string + method string + status int + err string + getWalletsResponse wallet.Wallets + getWalletsErr error + httpResponse []*WalletResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 no wallets", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: nil, + httpResponse: []*WalletResponse{}, + }, + { + name: "200 no wallets 2", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{}, + httpResponse: []*WalletResponse{}, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{ + "foofilename": { + Meta: map[string]string{ + "foo": "bar", + "seed": "fooseed", + "lastSeed": "foolastseed", + "coin": "foocoin", + "filename": "foofilename", + "label": "foolabel", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "345678", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[0], + Public: pubkeys[0], + Secret: seckeys[0], + }, + }, + }, + "foofilename2": { + Meta: map[string]string{ + "foo": "bar2", + "seed": "fooseed2", + "lastSeed": "foolastseed2", + "coin": "foocoin", + "filename": "foofilename2", + "label": "foolabel2", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "123456", + "encrypted": "false", + }, + Entries: []wallet.Entry{ + { + Address: addrs[1], + Public: pubkeys[1], + Secret: seckeys[1], + }, + }, + }, + "foofilename3": { + Meta: map[string]string{ + "foo": "bar3", + "seed": "fooseed3", + "lastSeed": "foolastseed3", + "coin": "foocoin", + "filename": "foofilename3", + "label": "foolabel3", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "234567", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[2], + Public: pubkeys[2], + Secret: seckeys[2], + }, + { + Address: addrs[3], + Public: pubkeys[3], + Secret: seckeys[3], + }, + }, + }, + }, + httpResponse: []*WalletResponse{ + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename2", + Label: "foolabel2", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 123456, + Encrypted: false, + }, + Entries: []WalletEntry{ + { + Address: addrs[1].String(), + Public: pubkeys[1].Hex(), + }, + }, + }, + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename3", + Label: "foolabel3", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 234567, + Encrypted: true, + }, + Entries: []WalletEntry{ + { + Address: addrs[2].String(), + Public: pubkeys[2].Hex(), + }, + { + Address: addrs[3].String(), + Public: pubkeys[3].Hex(), + }, + }, + }, + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename", + Label: "foolabel", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 345678, + Encrypted: true, + }, + Entries: []WalletEntry{ + { + Address: addrs[0].String(), + Public: pubkeys[0].Hex(), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + gateway := &GatewayerMock{} + gateway.On("GetWallets").Return(tc.getWalletsResponse, tc.getWalletsErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallets" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*WalletResponse + json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, msg) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestWalletUnloadHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + walletID string + unloadWalletErr error + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "wallet.wlt", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "wallet.wlt", + unloadWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - ok", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + }, + { + name: "200 - ok, csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("UnloadWallet", tc.walletID).Return(tc.unloadWalletErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/unload" + v := url.Values{} + v.Add("id", tc.walletID) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } + }) + } +} + +func TestEncryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w *wallet.Wallet + err error + } + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet.wlt", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "secrets", + "encrypted": "true", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet.wlt", + Encrypted: true, + }, + Entries: responseEntries, + }, + }, + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + wltID: "wallet.wlt", + password: "pwd", + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Missing Wallet Id", + method: http.MethodPost, + wltID: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "401 Unauthorized - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "404 - Wallet Not Found", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "400 - Wallet Is Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is encrypted", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("EncryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/encrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`, body: %v", status, tc.status, rr.Body.String()) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + return + } + + var rlt WalletResponse + err = json.NewDecoder(rr.Body).Decode(&rlt) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rlt) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w *wallet.Wallet + err error + } + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + csrfDisabled bool + }{ + { + name: "200 OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + }, + { + name: "200 OK CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + csrfDisabled: true, + }, + + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Wallet ID", + method: http.MethodPost, + wltID: "", + password: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Wallet IS Not Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "401 Unauthorized - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "404 - Wallet Does Not Exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("DecryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/decrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + return + } + + var r WalletResponse + err = json.NewDecoder(rr.Body).Decode(&r) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, r) + }) + } +} + +// makeEntries derives N wallet address entries from given seed +// Returns set of wallet.Entry and wallet.ReadableEntry, the readable +// entries' secrets are removed. +func makeEntries(seed []byte, n int) ([]wallet.Entry, []WalletEntry) { // nolint: unparam + seckeys := cipher.GenerateDeterministicKeyPairs(seed, n) + var entries []wallet.Entry + var responseEntries []WalletEntry + for i, seckey := range seckeys { + pubkey := cipher.PubKeyFromSecKey(seckey) + entries = append(entries, wallet.Entry{ + Address: cipher.AddressFromPubKey(pubkey), + Public: pubkey, + Secret: seckey, + }) + responseEntries = append(responseEntries, WalletEntry{ + Address: entries[i].Address.String(), + Public: entries[i].Public.Hex(), + }) + } + return entries, responseEntries +} + +func cloneEntries(es []wallet.Entry) []wallet.Entry { + var entries []wallet.Entry + for _, e := range es { + entries = append(entries, e) + } + return entries +} diff --git a/src/api/webrpc/client.go b/src/api/webrpc/client.go index fbf456c..411d80f 100755 --- a/src/api/webrpc/client.go +++ b/src/api/webrpc/client.go @@ -27,14 +27,14 @@ const ( // ErrJSONUnmarshal is returned if JSON unmarshal fails var ErrJSONUnmarshal = errors.New("JSON unmarshal failed") -// APIError is used for non-200 API responses -type APIError struct { +// ClientError is used for non-200 API responses +type ClientError struct { Status string StatusCode int Message string } -func (e APIError) Error() string { +func (e ClientError) Error() string { return e.Message } @@ -250,7 +250,7 @@ func do(httpClient *http.Client, rpcReq *Request, rpcAddress, csrf string) (*Res return nil, err } - url := rpcAddress + "webrpc" + url := rpcAddress + "api/v1/webrpc" body := bytes.NewBuffer(d) req, err := http.NewRequest(http.MethodPost, url, body) if err != nil { @@ -275,7 +275,7 @@ func do(httpClient *http.Client, rpcReq *Request, rpcAddress, csrf string) (*Res return nil, err } - return nil, APIError{ + return nil, ClientError{ Status: resp.Status, StatusCode: resp.StatusCode, Message: strings.TrimSpace(string(body)), diff --git a/src/api/webrpc/client_test.go b/src/api/webrpc/client_test.go index 57d94fe..eb0bce4 100755 --- a/src/api/webrpc/client_test.go +++ b/src/api/webrpc/client_test.go @@ -23,7 +23,7 @@ func TestClientGetUnspentOutputs(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) headTime := uint64(time.Now().UTC().Unix()) uxouts := make([]coin.UxOut, 5) @@ -66,7 +66,7 @@ func TestClientGetUnspentOutputs(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -115,7 +115,7 @@ func TestClientInjectTransaction(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) s.Gateway.(*fakeGateway).injectRawTxMap = map[string]bool{ rawTxID: true, @@ -128,7 +128,7 @@ func TestClientInjectTransaction(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -154,7 +154,7 @@ func TestClientGetStatus(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) rpcReq, err := NewRequest("get_status", nil, "1") require.NoError(t, err) @@ -162,7 +162,7 @@ func TestClientGetStatus(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -192,7 +192,7 @@ func TestClientGetTransactionByID(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) cases := []struct { name string @@ -231,7 +231,7 @@ func TestClientGetTransactionByID(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -270,7 +270,7 @@ func TestClientGetAddressUxOuts(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) cases := []struct { name string @@ -299,7 +299,7 @@ func TestClientGetAddressUxOuts(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -334,7 +334,7 @@ func TestClientGetBlocks(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) // blockString borrowed from block_test.go rpcReq, err := NewRequest("get_blocks", []uint64{0, 1}, "1") @@ -343,7 +343,7 @@ func TestClientGetBlocks(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -372,7 +372,7 @@ func TestClientGetBlocksBySeq(t *testing.T) { gatewayerMock.On("GetBlocksInDepth", []uint64{454}).Return(decodeBlock(blockString), nil) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) // blockString and seq borrowed from block_test.go var seq uint64 = 454 @@ -382,7 +382,7 @@ func TestClientGetBlocksBySeq(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() @@ -407,7 +407,7 @@ func TestClientGetLastBlocks(t *testing.T) { s := setupWebRPC(t) mux := http.NewServeMux() - mux.Handle("/webrpc", http.HandlerFunc(s.Handler)) + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) var n uint64 = 1 rpcReq, err := NewRequest("get_lastblocks", []uint64{n}, "1") @@ -416,7 +416,7 @@ func TestClientGetLastBlocks(t *testing.T) { body, err := json.Marshal(rpcReq) require.NoError(t, err) - req, err := http.NewRequest(http.MethodPost, "/webrpc", bytes.NewReader(body)) + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) require.NoError(t, err) rr := httptest.NewRecorder() diff --git a/src/api/webrpc/outputs_test.go b/src/api/webrpc/outputs_test.go index f5a8947..a9d8570 100755 --- a/src/api/webrpc/outputs_test.go +++ b/src/api/webrpc/outputs_test.go @@ -2,7 +2,6 @@ package webrpc import ( "encoding/json" - "strings" "testing" "time" @@ -14,52 +13,6 @@ import ( "github.com/skycoin/skycoin/src/visor" ) -const outputStr = `{ - "outputs": - { - "head_outputs": [ - { - "hash": "ca02361ef6d658cac5b5aadcb502b4b6046d1403e0f4b1f16b35c06a3f27e3df", - "src_tx": "e00196267e879c76215ccb93d046bd248e2bc5accad93d246ba43c71c42ff44a", - "address": "cBnu9sUvv12dovBmjQKTtfE4rbjMmf3fzW", - "coins": "4", - "hours": 0 - }, - { - "hash": "22f489be1a2f87ed826c183b516bd10f1703c6591643796f48630ba97db3b16c", - "src_tx": "fe50714012b29b3ffe5bc2f8e12a95af35004513d61e329e33b9b2a964ae2924", - "address": "cBnu9sUvv12dovBmjQKTtfE4rbjMmf3fzW", - "coins": "1", - "hours": 0 - }, - { - "hash": "f34f2f08c0a9bab56920b4ef946c0cb3ce31bbd641e44b23c5c1c39a14c86c86", - "src_tx": "059197c06b3a236c550bec377e26401c50ee6480b51206b6f3899ece55209b50", - "address": "fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B", - "coins": "53", - "hours": 1 - }, - { - "hash": "86c43aeaa420e17843fee51ec28275726c6422f6bb0f844e70c552d65dd63df8", - "src_tx": "bb35c6b277f432c6cf13d4a6b36d64f75cc405bc2b864aad718e53a6cbbd9105", - "address": "cBnu9sUvv12dovBmjQKTtfE4rbjMmf3fzW", - "coins": "1", - "hours": 0 - } - ], - "outgoing_outputs": [], - "incoming_outputs": [] - } - }` - -func decodeOutputStr(str string) visor.ReadableOutputSet { - outs := OutputsResult{} - if err := json.NewDecoder(strings.NewReader(outputStr)).Decode(&outs); err != nil { - panic(err) - } - return outs.Outputs -} - func filterOut(headTime uint64, outs []coin.UxOut, f func(out coin.UxOut) bool) visor.ReadableOutputSet { os := []coin.UxOut{} for _, o := range outs { diff --git a/src/api/webrpc/webrpc.go b/src/api/webrpc/webrpc.go index fca4f3f..042ab56 100755 --- a/src/api/webrpc/webrpc.go +++ b/src/api/webrpc/webrpc.go @@ -113,8 +113,6 @@ func MakeErrorResponse(code int, msg string, msgs ...string) Response { } } -type operation func(rpc *WebRPC) - // HandlerFunc represents the function type for processing the request type HandlerFunc func(req Request, gateway Gatewayer) Response diff --git a/src/api/webrpc/webrpc_test.go b/src/api/webrpc/webrpc_test.go index 280b868..4442db8 100755 --- a/src/api/webrpc/webrpc_test.go +++ b/src/api/webrpc/webrpc_test.go @@ -27,12 +27,10 @@ type fakeGateway struct { transactions map[string]string injectRawTxMap map[string]bool // key: transaction hash, value indicates whether the injectTransaction should return error. injectedTransactions map[string]string - addrRecvUxOuts []*historydb.UxOut - addrSpentUxOUts []*historydb.UxOut uxouts []coin.UxOut } -func (fg fakeGateway) GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) { +func (fg fakeGateway) GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) { // nolint: unparam var blocks visor.ReadableBlocks if err := json.Unmarshal([]byte(blockString), &blocks); err != nil { return nil, err diff --git a/src/api/webrpc_test.go b/src/api/webrpc_test.go new file mode 100755 index 0000000..44823bd --- /dev/null +++ b/src/api/webrpc_test.go @@ -0,0 +1,90 @@ +package api + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api/webrpc" +) + +func TestWebRPC(t *testing.T) { + type args struct { + httpMethod string + req webrpc.Request + } + + cases := []struct { + name string + status int + args args + want webrpc.Response + }{ + { + name: "http GET", + status: http.StatusOK, + args: args{ + httpMethod: http.MethodGet, + req: webrpc.Request{}, + }, + want: webrpc.Response{ + Jsonrpc: "2.0", + Error: &webrpc.RPCError{ + Code: webrpc.ErrCodeInvalidRequest, + Message: webrpc.ErrMsgNotPost, + }, + }, + }, + { + name: "invalid jsonrpc", + status: http.StatusOK, + args: args{ + httpMethod: http.MethodPost, + req: webrpc.Request{ + ID: "1", + Jsonrpc: "1.0", + Method: "get_status", + }, + }, + want: webrpc.MakeErrorResponse(webrpc.ErrCodeInvalidParams, webrpc.ErrMsgInvalidJsonrpc), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + d, err := json.Marshal(tc.args.req) + require.NoError(t, err) + + req, err := http.NewRequest(tc.args.httpMethod, "/api/v1/webrpc", bytes.NewBuffer(d)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: false, + } + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, tc.status, rr.Code) + + if rr.Code == http.StatusOK { + var res webrpc.Response + err = json.NewDecoder(rr.Body).Decode(&res) + require.NoError(t, err) + require.Equal(t, res, tc.want) + } + }) + } +} diff --git a/src/cipher/address.go b/src/cipher/address.go index d79cdf0..b9c15cd 100755 --- a/src/cipher/address.go +++ b/src/cipher/address.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "log" "github.com/skycoin/skycoin/src/cipher/base58" ) @@ -56,7 +57,7 @@ func DecodeBase58Address(addr string) (Address, error) { if err != nil { return Address{}, err } - return addressFromBytes(b) + return AddressFromBytes(b) } // MustDecodeBase58Address creates an Address from its base58 encoding. Will panic if the addr is @@ -64,7 +65,7 @@ func DecodeBase58Address(addr string) (Address, error) { func MustDecodeBase58Address(addr string) Address { a, err := DecodeBase58Address(addr) if err != nil { - logger.Panicf("Invalid address %s: %v", addr, err) + log.Panicf("Invalid address %s: %v", addr, err) } return a } @@ -82,13 +83,13 @@ func BitcoinDecodeBase58Address(addr string) (Address, error) { func BitcoinMustDecodeBase58Address(addr string) Address { a, err := BitcoinDecodeBase58Address(addr) if err != nil { - logger.Panicf("Invalid address %s: %v", addr, err) + log.Panicf("Invalid address %s: %v", addr, err) } return a } -// Returns an address given an Address.Bytes() -func addressFromBytes(b []byte) (addr Address, err error) { +// AddressFromBytes converts []byte to an Address +func AddressFromBytes(b []byte) (addr Address, err error) { defer func() { if r := recover(); r != nil { err = fmt.Errorf("%v", r) @@ -101,9 +102,6 @@ func addressFromBytes(b []byte) (addr Address, err error) { a := Address{} copy(a.Key[0:20], b[0:20]) a.Version = b[20] - if a.Version != 0 { - return Address{}, errors.New("Invalid version") - } chksum := a.Checksum() var checksum [4]byte @@ -113,9 +111,23 @@ func addressFromBytes(b []byte) (addr Address, err error) { return Address{}, errors.New("Invalid checksum") } + if a.Version != 0 { + return Address{}, errors.New("Invalid version") + } + return a, nil } +// MustAddressFromBytes converts []byte to an Address, panicking on error +func MustAddressFromBytes(b []byte) (Address, error) { + addr, err := AddressFromBytes(b) + if err != nil { + panic(err) + } + + return addr, err +} + // Null returns true if the address is null (0x0000....) func (addr Address) Null() bool { return addr == Address{} @@ -222,9 +234,6 @@ func BitcoinAddressFromBytes(b []byte) (Address, error) { a := Address{} copy(a.Key[0:20], b[1:21]) a.Version = b[0] - if a.Version != 0 { - return Address{}, errors.New("Invalid version") - } chksum := a.BitcoinChecksum() var checksum [4]byte @@ -234,6 +243,10 @@ func BitcoinAddressFromBytes(b []byte) (Address, error) { return Address{}, errors.New("Invalid checksum") } + if a.Version != 0 { + return Address{}, errors.New("Invalid version") + } + return a, nil } @@ -266,7 +279,7 @@ func SecKeyFromWalletImportFormat(input string) (SecKey, error) { seckey := b[1:33] if len(seckey) != 32 { - logger.Panic("...") + log.Panic("...") } return NewSecKey(b[1:33]), nil } @@ -275,7 +288,7 @@ func SecKeyFromWalletImportFormat(input string) (SecKey, error) { func MustSecKeyFromWalletImportFormat(input string) SecKey { seckey, err := SecKeyFromWalletImportFormat(input) if err != nil { - logger.Panicf("MustSecKeyFromWalletImportFormat, invalid seckey, %v", err) + log.Panicf("MustSecKeyFromWalletImportFormat, invalid seckey, %v", err) } return seckey } diff --git a/src/cipher/address_test.go b/src/cipher/address_test.go index 3e4e78c..29454cb 100755 --- a/src/cipher/address_test.go +++ b/src/cipher/address_test.go @@ -91,24 +91,54 @@ func TestDecodeBase58Address(t *testing.T) { func TestAddressFromBytes(t *testing.T) { p, _ := GenerateKeyPair() a := AddressFromPubKey(p) - a2, err := addressFromBytes(a.Bytes()) + a2, err := AddressFromBytes(a.Bytes()) require.NoError(t, err) require.Equal(t, a2, a) + // Invalid number of bytes b := a.Bytes() - _, err = addressFromBytes(b[:len(b)-2]) - require.Error(t, err) + _, err = AddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + // Invalid checksum b[len(b)-1] += byte(1) - _, err = addressFromBytes(b) - require.Error(t, err) + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid version") +} + +func TestBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := BitcoinAddressFromBytes(a.BitcoinBytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.BitcoinBytes() + _, err = BitcoinAddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.BitcoinBytes() + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid version") } -//encode and decode func TestAddressRoundtrip(t *testing.T) { + // Tests encode and decode p, _ := GenerateKeyPair() a := AddressFromPubKey(p) - a2, err := addressFromBytes(a.Bytes()) + a2, err := AddressFromBytes(a.Bytes()) require.NoError(t, err) require.Equal(t, a, a2) require.Equal(t, a.String(), a2.String()) diff --git a/src/cipher/crypto.go b/src/cipher/crypto.go index 8055117..ec5b1ae 100755 --- a/src/cipher/crypto.go +++ b/src/cipher/crypto.go @@ -5,6 +5,7 @@ import ( "crypto/sha256" "encoding/hex" "errors" + "fmt" "hash" "log" "time" @@ -12,12 +13,9 @@ import ( "github.com/skycoin/skycoin/src/cipher/ripemd160" "github.com/skycoin/skycoin/src/cipher/secp256k1-go" - - "github.com/skycoin/skycoin/src/util/logging" ) var ( - logger = logging.MustGetLogger("crypto") // DebugLevel1 debug level one DebugLevel1 = true //checks for extremely unlikely conditions (10e-40) // DebugLevel2 debug level two @@ -54,7 +52,7 @@ func RandByte(n int) []byte { func NewPubKey(b []byte) PubKey { p := PubKey{} if len(b) != len(p) { - logger.Panic("Invalid public key length") + log.Panic("Invalid public key length") } copy(p[:], b[:]) return p @@ -64,7 +62,7 @@ func NewPubKey(b []byte) PubKey { func MustPubKeyFromHex(s string) PubKey { b, err := hex.DecodeString(s) if err != nil { - logger.Panic(err) + log.Panic(err) } return NewPubKey(b) } @@ -81,11 +79,11 @@ func PubKeyFromHex(s string) (PubKey, error) { // PubKeyFromSecKey recovers the public key for a secret key func PubKeyFromSecKey(seckey SecKey) PubKey { if seckey == (SecKey{}) { - logger.Panic("PubKeyFromSecKey, attempt to load null seckey, unsafe") + log.Panic("PubKeyFromSecKey, attempt to load null seckey, unsafe") } b := secp256k1.PubkeyFromSeckey(seckey[:]) if b == nil { - logger.Panic("PubKeyFromSecKey, pubkey recovery failed. Function " + + log.Panic("PubKeyFromSecKey, pubkey recovery failed. Function " + "assumes seckey is valid. Check seckey") } return NewPubKey(b) @@ -127,7 +125,7 @@ type SecKey [32]byte func NewSecKey(b []byte) SecKey { p := SecKey{} if len(b) != len(p) { - logger.Panic("Invalid secret key length") + log.Panic("Invalid secret key length") } copy(p[:], b[:]) return p @@ -137,7 +135,7 @@ func NewSecKey(b []byte) SecKey { func MustSecKeyFromHex(s string) SecKey { b, err := hex.DecodeString(s) if err != nil { - logger.Panic(err) + log.Panic(err) } return NewSecKey(b) } @@ -163,7 +161,7 @@ func (sk SecKey) Verify() error { if DebugLevel2 { err := TestSecKey(sk) if err != nil { - logger.Panic("DebugLevel2, WARNING CRYPTO ARMAGEDDON") + log.Panic("DebugLevel2, WARNING CRYPTO ARMAGEDDON") } } return nil @@ -186,11 +184,11 @@ func (sk SecKey) Hex() string { func ECDH(pub PubKey, sec SecKey) []byte { if err := pub.Verify(); err != nil { - logger.Panic("ECDH invalid pubkey input") + log.Panic("ECDH invalid pubkey input") } if err := sec.Verify(); err != nil { - logger.Panic("ECDH invalid seckey input") + log.Panic("ECDH invalid seckey input") } buff := secp256k1.ECDH(pub[:], sec[:]) @@ -206,7 +204,7 @@ type Sig [64 + 1]byte //64 byte signature with 1 byte for key recovery func NewSig(b []byte) Sig { s := Sig{} if len(b) != len(s) { - logger.Panic("Invalid secret key length") + log.Panic("Invalid secret key length") } copy(s[:], b[:]) return s @@ -216,10 +214,10 @@ func NewSig(b []byte) Sig { func MustSigFromHex(s string) Sig { b, err := hex.DecodeString(s) if err != nil { - logger.Panic(err) + log.Panic(err) } if len(b) != 65 { - logger.Panic("Signature Length is Invalid") + log.Panic("Signature Length is Invalid") } return NewSig(b) } @@ -248,14 +246,14 @@ func SignHash(hash SHA256, sec SecKey) Sig { if DebugLevel2 || DebugLevel1 { //!!! Guard against coin loss pubkey, err := PubKeyFromSig(sig, hash) if err != nil { - logger.Panic("SignHash, error: pubkey from sig recovery failure") + log.Panic("SignHash, error: pubkey from sig recovery failure") } if VerifySignature(pubkey, sig, hash) != nil { - logger.Panic("SignHash, error: secp256k1.Sign returned non-null " + + log.Panic("SignHash, error: secp256k1.Sign returned non-null " + "invalid non-null signature") } if ChkSig(AddressFromPubKey(pubkey), hash, sig) != nil { - logger.Panic("SignHash error: ChkSig failed for signature") + log.Panic("SignHash error: ChkSig failed for signature") } } return sig @@ -291,7 +289,7 @@ func VerifySignedHash(sig Sig, hash SHA256) error { } if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey) != 1 { // If this occurs, secp256k1 is bugged - logger.Critical().Error("Recovered public key is not valid for signed hash") + log.Printf("Recovered public key is not valid for signed hash") return errors.New("Signature invalid for hash") } return nil @@ -309,7 +307,7 @@ func VerifySignature(pubkey PubKey, sig Sig, hash SHA256) error { if secp256k1.VerifyPubkey(pubkey[:]) != 1 { if DebugLevel2 { if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) == 1 { - logger.Panic("VerifySignature warning, ") + log.Panic("VerifySignature warning, ") } } return errors.New("VerifySignature, secp256k1.VerifyPubkey failed") @@ -329,7 +327,7 @@ func GenerateKeyPair() (PubKey, SecKey) { if DebugLevel1 { if TestSecKey(NewSecKey(secret)) != nil { - logger.Panic("DebugLevel1, GenerateKeyPair, generated private key " + + log.Panic("DebugLevel1, GenerateKeyPair, generated private key " + "failed TestSecKey") } } @@ -344,11 +342,11 @@ func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { if DebugLevel1 { if TestSecKey(NewSecKey(secret)) != nil { - logger.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + "seckey invalid, failed TestSecKey") } if TestSecKey(NewSecKey(secret)) != nil { - logger.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + "generated private key failed TestSecKey") } if PubKeyFromSecKey(NewSecKey(secret)) != NewPubKey(public) { @@ -356,7 +354,7 @@ func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { //s2 := NewPubKey(public).Hex() //s3 := PubKeyFromSecKey(NewSecKey(secret)).Hex() //log.Printf("sec= %s, pub= %s recpub= %s \n", s1,s2, s3 ) - logger.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + "public key does not match private key") } } @@ -370,11 +368,11 @@ func DeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey) { hash, public, secret := secp256k1.DeterministicKeyPairIterator(seed) if DebugLevel1 { if TestSecKey(NewSecKey(secret)) != nil { - logger.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + "generated private key failed TestSecKey") } if PubKeyFromSecKey(NewSecKey(secret)) != NewPubKey(public) { - logger.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + "public key does not match private key") } } @@ -425,15 +423,14 @@ func TestSecKeyHash(seckey SecKey, hash SHA256) error { } //verify recovered pubkey if secp256k1.VerifyPubkey(pubkey[:]) != 1 { - return errors.New("impossible error, TestSecKey, Derived Pubkey " + - "verification failed") + return errors.New("impossible error, TestSecKey, Derived Pubkey verification failed") } //check signature production sig := SignHash(hash, seckey) pubkey2, err := PubKeyFromSig(sig, hash) if err != nil { - return err + return fmt.Errorf("PubKeyFromSig failed: %v", err) } if pubkey != pubkey2 { return errors.New("Recovered pubkey does not match signed hash") @@ -442,27 +439,29 @@ func TestSecKeyHash(seckey SecKey, hash SHA256) error { //check pubkey recovered from sig recoveredPubkey, err := PubKeyFromSig(sig, hash) if err != nil { - return errors.New("impossible error, TestSecKey, pubkey recovery " + - "from signature failed") + return fmt.Errorf("impossible error, TestSecKey, pubkey recovery from signature failed: %v", err) } if pubkey != recoveredPubkey { - return errors.New("impossible error TestSecKey, pubkey does not " + - "match recovered pubkey") + return errors.New("impossible error TestSecKey, pubkey does not match recovered pubkey") } //verify produced signature err = VerifySignature(pubkey, sig, hash) if err != nil { - return errors.New("impossible error, TestSecKey, verify signature failed " + - "for sig") + return fmt.Errorf("impossible error, TestSecKey, verify signature failed for sig: %v", err) } //verify ChkSig addr := AddressFromPubKey(pubkey) err = ChkSig(addr, hash, sig) if err != nil { - return errors.New("impossible error TestSecKey, ChkSig Failed, " + - "should not get this far") + return fmt.Errorf("impossible error TestSecKey, ChkSig Failed, should not get this far: %v", err) + } + + //verify VerifySignedHash + err = VerifySignedHash(sig, hash) + if err != nil { + return fmt.Errorf("VerifySignedHash failed: %v", err) } return nil @@ -479,8 +478,7 @@ func init() { } _, seckey := GenerateKeyPair() - if TestSecKey(seckey) != nil { - log.Fatal("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING " + - "PROGRAM TO PROTECT COINS") + if err := TestSecKey(seckey); err != nil { + log.Fatalf("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING PROGRAM TO PROTECT COINS: %v", err) } } diff --git a/src/cipher/crypto_test.go b/src/cipher/crypto_test.go index a6c74c9..91ff956 100755 --- a/src/cipher/crypto_test.go +++ b/src/cipher/crypto_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher/ripemd160" ) @@ -333,3 +334,11 @@ func TestSecKeyHashTest(t *testing.T) { assert.Nil(t, TestSecKeyHash(s, h)) assert.NotNil(t, TestSecKeyHash(SecKey{}, h)) } + +func TestGenerateDeterministicKeyPairsUsesAllBytes(t *testing.T) { + // Tests that if a seed >128 bits is used, the generator does not ignore bits >128 + seed := "property diet little foster provide disagree witness mountain alley weekend kitten general" + seckeys := GenerateDeterministicKeyPairs([]byte(seed), 3) + seckeys2 := GenerateDeterministicKeyPairs([]byte(seed[:16]), 3) + require.NotEqual(t, seckeys, seckeys2) +} diff --git a/src/cipher/encoder/encoder.go b/src/cipher/encoder/encoder.go index 370e1c6..70b89e0 100755 --- a/src/cipher/encoder/encoder.go +++ b/src/cipher/encoder/encoder.go @@ -13,6 +13,16 @@ // Varints are a method of encoding integers using one or more bytes; // numbers with smaller absolute value take a smaller number of bytes. // For a specification, see http://code.google.com/apis/protocolbuffers/docs/encoding.html. +// +// Fields can be ignored with the struct tag `enc:"-"` . +// Unexported struct fields are ignored by default . +// +// Fields can be skipped if empty with the struct tag `enc:",omitempty"` +// Note the comma, which follows package json's conventions. +// Only Slice, Map and String types recognize the omitempty tag. +// When omitempty is set, the no data will be written if the value is empty. +// If the value is empty and omitempty is not set, then a length prefix with value 0 would be written. +// omitempty can only be used for the last field in the struct package encoder import ( @@ -22,6 +32,7 @@ import ( "log" "math" "reflect" + "strings" ) /* @@ -30,9 +41,18 @@ Todo: - validate packet legnth for incoming */ +var ( + // ErrBufferUnderflow bytes in input buffer not enough to deserialize expected type + ErrBufferUnderflow = errors.New("Not enough buffer data to deserialize") + // ErrInvalidOmitEmpty field tagged with omitempty and it's not last one in struct + ErrInvalidOmitEmpty = errors.New("omitempty only supported for the final field in the struct") +) + // TODO: constant length byte arrays must not be prefixed -// EncodeInt encodes int +// EncodeInt encodes an Integer type contained in `data` +// into buffer `b`. If `data` is not an Integer type, +// panic message is logged. func EncodeInt(b []byte, data interface{}) { //var b [8]byte var bs []byte @@ -67,7 +87,8 @@ func EncodeInt(b []byte, data interface{}) { } } -// DecodeInt decodes int +// DecodeInt decodes `in` buffer into `data` parameter. +// If `data` is not an Integer type, panic message is logged. func DecodeInt(in []byte, data interface{}) { n := intDestSize(data) @@ -106,11 +127,13 @@ func DecodeInt(in []byte, data interface{}) { } } -// DeserializeAtomic fast path for atomic types. +// DeserializeAtomic deserializes `in` buffer into `data` +// parameter. If `data` is not an atomic type +// (i.e., Integer type or Boolean type), panic message is logged. func DeserializeAtomic(in []byte, data interface{}) { n := intDestSize(data) if len(in) < n { - log.Panic("Not enough data to deserialize") + log.Panic(ErrBufferUnderflow) } if n != 0 { var b [8]byte @@ -148,7 +171,11 @@ func DeserializeAtomic(in []byte, data interface{}) { } } -// DeserializeRaw deserialize raw +// DeserializeRaw deserializes `in` buffer into return +// parameter. If `data` is not either a Pointer type, +// a Slice type or a Struct type, an error message +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. func DeserializeRaw(in []byte, data interface{}) error { v := reflect.ValueOf(data) switch v.Kind() { @@ -174,7 +201,11 @@ func DeserializeRaw(in []byte, data interface{}) error { return d1.value(v) } -// Deserialize takes reader and number of bytes to read +// Deserialize reads `dsize` bytes from `r` and deserializes +// the resulting buffer into return parameter. If `data` +// is not either a Pointer type, a Slice type or a Struct type, +// an error message is returned. If `in` buffer can't be deserialized, +// an error message is returned. func Deserialize(r io.Reader, dsize int, data interface{}) error { // Fallback to reflect-based decoding. //fmt.Printf("A1 v is type %s \n", reflect.TypeOf(data).String() ) @@ -218,7 +249,9 @@ func Deserialize(r io.Reader, dsize int, data interface{}) error { return d1.value(v) } -// CanDeserialize does a check to see if serialization would be successful +// CanDeserialize returns true if `in` buffer can be +// deserialized into `dst`'s type. Returns false in any +// other case. func CanDeserialize(in []byte, dst reflect.Value) bool { d1 := &decoder{buf: make([]byte, len(in))} copy(d1.buf, in) @@ -228,7 +261,12 @@ func CanDeserialize(in []byte, dst reflect.Value) bool { return true } -// DeserializeRawToValue returns number of bytes used and an error if deserialization failed +// DeserializeRawToValue deserializes `in` buffer into +// `dst`'s type and returns the number of bytes used and +// the value of the buffer. If `data` is not either a +// Pointer type, a Slice type or a Struct type, 0 and an error +// message are returned. If `in` buffer can't be deserialized, 0 and +// an error message are returned. func DeserializeRawToValue(in []byte, dst reflect.Value) (int, error) { var v reflect.Value switch dst.Kind() { @@ -256,7 +294,12 @@ func DeserializeRawToValue(in []byte, dst reflect.Value) (int, error) { return inlen - len(d1.buf), err } -// DeserializeToValue deserialize to value +// DeserializeToValue reads `dsize` bytes from `r`, +// deserializes the resulting buffer into `dst`'s type and +// returns the value of the buffer. If `data` is not either +// a Pointer type, a Slice type or a Struct type, an error +// message is returned. If `in` buffer can't be deserialized, an +// error message is returned. func DeserializeToValue(r io.Reader, dsize int, dst reflect.Value) error { //fmt.Printf("*A1 v is type %s \n", data.Type().String() ) //this is the type of the value @@ -283,7 +326,8 @@ func DeserializeToValue(r io.Reader, dsize int, dst reflect.Value) error { return d1.value(v) } -// SerializeAtomic serializes int or other atomic +// SerializeAtomic returns serialization of `data` +// parameter. If `data` is not an atomic type, panic message is logged. func SerializeAtomic(data interface{}) []byte { var b [8]byte var bs []byte @@ -356,14 +400,14 @@ func SerializeAtomic(data interface{}) []byte { return bs } -// Serialize serialize struct +// Serialize returns serialized basic type-based `data` +// parameter. Encoding is reflect-based. func Serialize(data interface{}) []byte { // Fast path for basic types. // Fallback to reflect-based encoding. v := reflect.Indirect(reflect.ValueOf(data)) size, err := datasizeWrite(v) if err != nil { - //return nil, errors.New("binary.Write: " + err.Error()) log.Panic(err) } buf := make([]byte, size) @@ -372,8 +416,10 @@ func Serialize(data interface{}) []byte { return buf } -// Size returns how many bytes Write would generate to encode the value v, which -// must be a fixed-size value or a slice of fixed-size values, or a pointer to such data. +// Size returns how many bytes would it take to encode the +// value v, which must be a fixed-size value (struct) or a +// slice of fixed-size values, or a pointer to such data. +// Reflect-based encoding is used. func Size(v interface{}) int { n, err := datasizeWrite(reflect.Indirect(reflect.ValueOf(v))) if err != nil { @@ -382,20 +428,35 @@ func Size(v interface{}) int { return n } -// dataSize returns the number of bytes the actual data represented by v occupies in memory. +// isEmpty returns true if a value is "empty". +// Only supports Slice, Map and String. +// All other values are never considered empty. +func isEmpty(v reflect.Value) bool { + t := v.Type() + switch t.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Map: + return v.IsNil() || v.Len() == 0 + case reflect.Slice: + return v.IsNil() || v.Len() == 0 + default: + return false + } +} + +// datasizeWrite returns the number of bytes the actual data represented by v occupies in memory. // For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice // it returns the length of the slice times the element size and does not count the memory // occupied by the header. - -/* Datasize needs to write variable length slice fields */ -/* Datasize for serialization is different than for serialization */ func datasizeWrite(v reflect.Value) (int, error) { t := v.Type() switch t.Kind() { case reflect.Interface: - //fmt.Println(v.Elem()) return datasizeWrite(v.Elem()) + case reflect.Array: + // Arrays are a fixed size, so the length is not written size := 0 for i := 0; i < v.Len(); i++ { elem := v.Index(i) @@ -439,20 +500,36 @@ func datasizeWrite(v reflect.Value) (int, error) { case reflect.Struct: sum := 0 - for i, n := 0, t.NumField(); i < n; i++ { - f := t.Field(i) - if f.Tag.Get("enc") != "-" { - s, err := datasizeWrite(v.Field(i)) - if err != nil { - return 0, err + nFields := t.NumField() + for i, n := 0, nFields; i < n; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !omitempty || !isEmpty(fv) { + s, err := datasizeWrite(fv) + if err != nil { + return 0, err + } + sum += s } - sum += s } } return sum, nil case reflect.Bool: return 1, nil + case reflect.String: return len(v.String()) + 4, nil @@ -466,6 +543,19 @@ func datasizeWrite(v reflect.Value) (int, error) { } } +// ParseTag to extract encoder args from raw string +func ParseTag(tag string) (string, bool) { + tagSplit := strings.Split(tag, ",") + name := tagSplit[0] + + omitempty := false + if len(tagSplit) > 1 && tagSplit[1] == "omitempty" { + omitempty = true + } + + return name, omitempty +} + /* Internals */ @@ -505,7 +595,7 @@ func lePutUint64(b []byte, v uint64) { } type coder struct { - buf []byte + buf []byte //nolint: structcheck } type decoder coder @@ -628,17 +718,7 @@ func (d *decoder) value(v reflect.Value) error { switch kind { case reflect.Array: - //if len(d.buf) < 4 { - // return errors.New("Not enough buffer data to deserialize length") - //} - //length := int(d.uint32()) - //if length < 0 || length > len(d.buf) { - // return fmt.Errorf("Invalid length: %d", length) - //} - //if length != v.Len() { - // return errors.New("Incomplete fixed length array received") - //} - + // Arrays are a fixed size, so the length is not written for i := 0; i < v.Len(); i++ { if err := d.value(v.Index(i)); err != nil { return err @@ -647,7 +727,7 @@ func (d *decoder) value(v reflect.Value) error { case reflect.Map: if len(d.buf) < 4 { - return errors.New("Not enough buffer data to deserialize length") + return ErrBufferUnderflow } length := int(d.uint32()) if length < 0 || length > len(d.buf) { @@ -673,7 +753,7 @@ func (d *decoder) value(v reflect.Value) error { case reflect.Slice: if len(d.buf) < 4 { - return errors.New("Not enough buffer data to deserialize length") + return ErrBufferUnderflow } length := int(d.uint32()) if length < 0 || length > len(d.buf) { @@ -695,13 +775,28 @@ func (d *decoder) value(v reflect.Value) error { case reflect.Struct: t := v.Type() - for i := 0; i < v.NumField(); i++ { - fv := v.Field(i) + nFields := v.NumField() + for i := 0; i < nFields; i++ { ff := t.Field(i) - if ff.Tag.Get("enc") != "-" { + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) if fv.CanSet() && ff.Name != "_" { if err := d.value(fv); err != nil { - return err + // omitempty fields at the end of the buffer are ignored + if !(omitempty && len(d.buf) == 0) { + return err + } } } else { //dont decode anything @@ -712,7 +807,7 @@ func (d *decoder) value(v reflect.Value) error { case reflect.String: if len(d.buf) < 4 { - return errors.New("Not enough buffer data to deserialize length") + return ErrBufferUnderflow } length := int(d.uint32()) if length < 0 || length > len(d.buf) { @@ -753,16 +848,6 @@ func (d *decoder) value(v reflect.Value) error { return nil } -func (d *decoder) cmp(n int, m int) int { - if n != 0 { - return -1 - } - if m != 0 { - return -1 - } - return 0 -} - //advance, returns -1 on failure //returns 0 on success func (d *decoder) adv(n int) int { @@ -781,13 +866,13 @@ func (d *decoder) dchk(v reflect.Value) int { switch kind { case reflect.Array: - c := 0 + // Arrays are a fixed size, so the length is not written for i := 0; i < v.Len(); i++ { - //t := d.dchk(v.Index(i)) - //c += t - c = d.cmp(c, d.dchk(v.Index(i))) + if d.dchk(v.Index(i)) < 0 { + return -1 + } } - return c + return 0 case reflect.Map: if len(d.buf) < 4 { @@ -795,84 +880,97 @@ func (d *decoder) dchk(v reflect.Value) int { } length := int(leUint32(d.buf[0:4])) - d.adv(4) //must succeed + if d.adv(4) < 0 { + return -1 + } key := v.Type().Key() elem := v.Type().Elem() - c := 0 for i := 0; i < length; i++ { keyv := reflect.Indirect(reflect.New(key)) elemv := reflect.Indirect(reflect.New(elem)) - c = d.cmp(c, d.dchk(keyv)) - c = d.cmp(c, d.dchk(elemv)) - //c += d.adv(d.dchk(elemv)) - - //t := d.dchk(elemv) - //d.buf = d.buf[t:] - //c += t + if d.dchk(keyv) < 0 { + return -1 + } - //v.Set(reflect.Append(v, elemv)) + if d.dchk(elemv) < 0 { + return -1 + } } - return c + return 0 case reflect.Slice: if len(d.buf) < 4 { - return -1 //error + return -1 } length := int(leUint32(d.buf[0:4])) - d.adv(4) //must succeed + if d.adv(4) < 0 { + return -1 + } if length < 0 || length > len(d.buf) { - return -1 //error + return -1 } elem := v.Type().Elem() if elem.Kind() == reflect.Uint8 { - return d.cmp(0, d.adv(length)) //already advanced 4 + return d.adv(length) } - c := 0 for i := 0; i < length; i++ { elemv := reflect.Indirect(reflect.New(elem)) - c = d.cmp(c, d.dchk(elemv)) - //c += d.adv(d.dchk(elemv)) - - //t := d.dchk(elemv) - //d.buf = d.buf[t:] - //c += t - - //v.Set(reflect.Append(v, elemv)) + if d.dchk(elemv) < 0 { + return -1 + } } - return c + return 0 case reflect.Struct: t := v.Type() - c := 0 - for i := 0; i < v.NumField(); i++ { - fv := v.Field(i) + nFields := v.NumField() + for i := 0; i < nFields; i++ { ff := t.Field(i) - if ff.Tag.Get("enc") != "-" { - if fv.CanSet() && ff.Name != "_" { - //c += d.adv(d.dchk(fv)) - //c += d.dchk(fv) - c = d.cmp(c, d.dchk(fv)) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !omitempty && fv.CanSet() && ff.Name != "_" { + if d.dchk(fv) < 0 { + return -1 + } } else { //dont try to decode anything //d.skip(fv) //BUG!? } } } - return c + return 0 case reflect.Bool: return d.adv(1) case reflect.String: + if len(d.buf) < 4 { + return -1 + } + length := int(leUint32(d.buf[0:4])) - d.adv(4) //must succeed - return d.cmp(0, d.adv(length)) + if d.adv(4) < 0 { + return -1 + } + + return d.adv(length) case reflect.Int8: return d.adv(1) case reflect.Int16: @@ -910,8 +1008,8 @@ func (e *encoder) value(v reflect.Value) { case reflect.Interface: e.value(v.Elem()) - case reflect.Array: //fixed size - //e.uint32(uint32(v.Len())) + case reflect.Array: + // Arrays are a fixed size, so the length is not written for i := 0; i < v.Len(); i++ { e.value(v.Index(i)) } @@ -931,13 +1029,25 @@ func (e *encoder) value(v reflect.Value) { case reflect.Struct: t := v.Type() - for i := 0; i < v.NumField(); i++ { + nFields := v.NumField() + for i := 0; i < nFields; i++ { // see comment for corresponding code in decoder.value() - v := v.Field(i) - f := t.Field(i) - if f.Tag.Get("enc") != "-" { - if v.CanSet() || f.Name != "_" { - e.value(v) + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !(omitempty && isEmpty(fv)) && (fv.CanSet() || ff.Name != "_") { + e.value(fv) } else { //dont write anything //e.skip(v) @@ -945,30 +1055,6 @@ func (e *encoder) value(v reflect.Value) { } } - // case reflect.Slice: - // t := v.Type() //type of the value - - // //handle byte array - // if t.Elem().Kind() == reflect.Uint8 { - // b := v.Bytes() - // n := len(b) - // e.uint32(uint32(n)) - // for i := 0; i < n; i++ { - // e.buf[i] = b[i] - // } //memcpy - // e.buf = e.buf[n:] //advance slice n bytes - // } else { //handle struct array - // s := int(t.Elem().Size()) - // if s <= 1 { - // log.Panic() - // } - // n := v.Len() //const - // e.uint32(uint32(n * s)) //push number of bytes - // for i := 0; i < n; i++ { - // e.value(v.Index(i)) - // } - // } - case reflect.Bool: e.bool(v.Bool()) diff --git a/src/cipher/encoder/encoder_test.go b/src/cipher/encoder/encoder_test.go index a638fdc..901ef9b 100755 --- a/src/cipher/encoder/encoder_test.go +++ b/src/cipher/encoder/encoder_test.go @@ -8,10 +8,12 @@ import ( "reflect" "testing" + "github.com/stretchr/testify/require" + "github.com/skycoin/skycoin/src/cipher" ) -func randBytes(n int) []byte { +func randBytes(n int) []byte { // nolint: unparam const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" var bytes = make([]byte, n) rand.Read(bytes) @@ -625,3 +627,268 @@ func TestEncodeDictNested(t *testing.T) { t.Errorf("Expected %v but got %v", s1, s2) } } + +func TestEncodeDictString2Int64(t *testing.T) { + v := map[string]int64{ + "foo": 1, + "bar": 2, + } + + b := Serialize(v) + + v2 := make(map[string]int64) + err := DeserializeRaw(b, &v2) + require.NoError(t, err) + + require.Equal(t, v, v2) +} + +func TestOmitEmptyString(t *testing.T) { + + type omitString struct { + A string `enc:"a,omitempty"` + } + + cases := []struct { + name string + input omitString + outputShouldBeEmpty bool + }{ + { + name: "string not empty", + input: omitString{ + A: "foo", + }, + }, + + { + name: "string empty", + input: omitString{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitString + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + require.Equal(t, tc.input, y) + }) + } + +} + +func TestOmitEmptySlice(t *testing.T) { + type omitSlice struct { + B []byte `enc:"b,omitempty"` + } + + cases := []struct { + name string + input omitSlice + expect *omitSlice + outputShouldBeEmpty bool + }{ + { + name: "slice not empty", + input: omitSlice{ + B: []byte("foo"), + }, + }, + + { + name: "slice nil", + input: omitSlice{}, + outputShouldBeEmpty: true, + }, + + { + name: "slice empty but not nil", + input: omitSlice{ + B: []byte{}, + }, + expect: &omitSlice{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitSlice + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMap(t *testing.T) { + + type omitMap struct { + C map[string]int64 `enc:"d,omitempty"` + } + + cases := []struct { + name string + input omitMap + expect *omitMap + outputShouldBeEmpty bool + }{ + { + name: "map not empty", + input: omitMap{ + C: map[string]int64{"foo": 1}, + }, + }, + + { + name: "map nil", + input: omitMap{}, + outputShouldBeEmpty: true, + }, + + { + name: "map empty but not nil", + input: omitMap{ + C: map[string]int64{}, + }, + expect: &omitMap{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitMap + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMixedFinalByte(t *testing.T) { + type omitMixed struct { + A string + B []byte `enc:",omitempty"` + } + + cases := []struct { + name string + input omitMixed + expect omitMixed + }{ + { + name: "none empty", + input: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + expect: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + }, + + { + name: "byte nil", + input: omitMixed{ + A: "foo", + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "byte empty but not nil", + input: omitMixed{ + A: "foo", + B: []byte{}, + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "first string empty but not omitted", + input: omitMixed{ + B: []byte("foo"), + }, + expect: omitMixed{ + B: []byte("foo"), + }, + }, + + { + name: "all empty", + input: omitMixed{}, + expect: omitMixed{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + require.NotEmpty(t, b) + + var y omitMixed + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + require.Equal(t, tc.expect, y) + }) + } +} + +func TestOmitEmptyFinalFieldOnly(t *testing.T) { + type bad struct { + A string + B string `enc:",omitempty"` + C string + } + + require.Panics(t, func() { + var b bad + Serialize(b) + }) +} diff --git a/src/cipher/encoder/field.go b/src/cipher/encoder/field.go index 5e02936..a561c6a 100755 --- a/src/cipher/encoder/field.go +++ b/src/cipher/encoder/field.go @@ -22,7 +22,7 @@ func (s *StructField) String() string { } //TODO: replace fieldType on reflect.Kind -func getFieldSize(in []byte, d *decoder, fieldType reflect.Kind, s int) (int, error) { +func getFieldSize(d *decoder, fieldType reflect.Kind, s int) int { switch fieldType { case reflect.Slice, reflect.String: length := int(leUint32(d.buf[s : s+4])) @@ -41,7 +41,7 @@ func getFieldSize(in []byte, d *decoder, fieldType reflect.Kind, s int) (int, er fmt.Println(fieldType) log.Panicf("Decode error: kind %s not handled", fieldType) } - return s, nil + return s } //TODO: replace fieldType on reflect.Kind @@ -94,10 +94,7 @@ func DeserializeField(in []byte, fields []StructField, fieldName string, field i fd.value(fv) return nil } - res, err := getFieldSize(in, d, reflect.Kind(f.Kind), s) - if err != nil { - return err - } + res := getFieldSize(d, reflect.Kind(f.Kind), s) s = res } return nil @@ -110,7 +107,7 @@ func ParseFields(in []byte, fields []StructField) map[string]string { copy(d.buf, in) s := 0 for _, f := range fields { - resShift, _ := getFieldSize(in, d, reflect.Kind(f.Kind), s) + resShift := getFieldSize(d, reflect.Kind(f.Kind), s) result[f.Name] = getFieldValue(in, d, reflect.Kind(f.Kind), s) s = resShift } diff --git a/src/cipher/encrypt/scrypt_chacha20poly1305_test.go b/src/cipher/encrypt/scrypt_chacha20poly1305_test.go index 8ff9652..b098f7b 100755 --- a/src/cipher/encrypt/scrypt_chacha20poly1305_test.go +++ b/src/cipher/encrypt/scrypt_chacha20poly1305_test.go @@ -13,7 +13,7 @@ import ( ) func TestScryptChacha20poly1305Encrypt(t *testing.T) { - for i := uint(20); i < 20; i++ { + for i := uint(1); i < 20; i++ { name := fmt.Sprintf("N=1<<%v r=%v p=%v keyLen=%v", i, 8, 1, 32) t.Run(name, func(t *testing.T) { crypto := ScryptChacha20poly1305{N: 1 << i, R: 8, P: 1, KeyLen: 32} diff --git a/src/cipher/go-bip39/bip39.go b/src/cipher/go-bip39/bip39.go index 955c2e1..c81a92e 100755 --- a/src/cipher/go-bip39/bip39.go +++ b/src/cipher/go-bip39/bip39.go @@ -19,11 +19,11 @@ var ( BigTwo = big.NewInt(2) ) -// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemomic's entropy +// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemonic's entropy const DefaultMnemonicEntropyBitSize = 128 -// NewDefaultMnemomic returns a generated mnemomic using entropy with bitSize 128 -func NewDefaultMnemomic() (string, error) { +// NewDefaultMnemonic returns a generated mnemomic using entropy with bitSize 128 +func NewDefaultMnemonic() (string, error) { entropy, err := NewEntropy(DefaultMnemonicEntropyBitSize) if err != nil { return "", err @@ -32,6 +32,15 @@ func NewDefaultMnemomic() (string, error) { return NewMnemonic(entropy) } +// MustNewDefaultMnemonic returns a generated mnemomic using entropy with bitSize 128 and panics if there is an error +func MustNewDefaultMnemonic() string { + seed, err := NewDefaultMnemonic() + if err != nil { + panic(err) + } + return seed +} + // NewEntropy will create random entropy bytes // so long as the requested size bitSize is an appropriate size. func NewEntropy(bitSize int) ([]byte, error) { @@ -205,7 +214,7 @@ func addChecksum(data []byte) []byte { return dataBigInt.Bytes() } -func padByteSlice(slice []byte, length int) []byte { +func padByteSlice(slice []byte, length int) []byte { // nolint: unparam newSlice := make([]byte, length-len(slice)) return append(newSlice, slice...) } diff --git a/src/cipher/hash.go b/src/cipher/hash.go index 8453641..ec304c5 100755 --- a/src/cipher/hash.go +++ b/src/cipher/hash.go @@ -109,6 +109,27 @@ func MustSHA256FromHex(hs string) SHA256 { return h } +// SHA256FromBytes converts []byte to SHA256 +func SHA256FromBytes(b []byte) (SHA256, error) { + h := SHA256{} + + if len(b) != len(h) { + return h, errors.New("Invalid bytes length") + } + + h.Set(b) + return h, nil +} + +// MustSHA256FromBytes is the same as SHA256FromBytes, except it will panic when it detects an error +func MustSHA256FromBytes(b []byte) SHA256 { + h, err := SHA256FromBytes(b) + if err != nil { + log.Panic(err) + } + return h +} + // MustSumSHA256 like SumSHA256, but len(b) must equal n, or panic func MustSumSHA256(b []byte, n int) SHA256 { if len(b) != n { diff --git a/src/cipher/secp256k1-go/secp256_test.go b/src/cipher/secp256k1-go/secp256_test.go index d441d9d..9698f79 100755 --- a/src/cipher/secp256k1-go/secp256_test.go +++ b/src/cipher/secp256k1-go/secp256_test.go @@ -621,10 +621,6 @@ func Test_Abnormal_Keys2(t *testing.T) { } } -func _pairGen(seckey []byte) []byte { - return nil -} - //ECDH test func Test_Abnormal_Keys3(t *testing.T) { diff --git a/src/cipher/secp256k1-go/secp256k1-go2/num.go b/src/cipher/secp256k1-go/secp256k1-go2/num.go index c88f365..3c9f901 100755 --- a/src/cipher/secp256k1-go/secp256k1-go2/num.go +++ b/src/cipher/secp256k1-go/secp256k1-go2/num.go @@ -77,13 +77,13 @@ func (num *Number) splitExp(r1, r2 *Number) { r2.Sub(&bnt1.Int, &bnt2.Int) } -func (num *Number) split(rl, rh *Number, bits uint) { +func (num *Number) split(rl, rh *Number, bits uint) { // nolint: unparam rl.Int.Set(&num.Int) rh.Int.Rsh(&rl.Int, bits) rl.maskBits(bits) } -func (num *Number) rsh(bits uint) { +func (num *Number) rsh(bits uint) { // nolint: unparam num.Rsh(&num.Int, bits) } @@ -102,7 +102,7 @@ func (num *Number) IsOdd() bool { return num.Bit(0) != 0 } -func (num *Number) getBin(le int) []byte { +func (num *Number) getBin(le int) []byte { // nolint: unparam bts := num.Bytes() if len(bts) > le { panic("buffer too small") diff --git a/src/cipher/secp256k1-go/secp256k1-go2/xyz.go b/src/cipher/secp256k1-go/secp256k1-go2/xyz.go index c1cfc7a..7fffdd5 100755 --- a/src/cipher/secp256k1-go/secp256k1-go2/xyz.go +++ b/src/cipher/secp256k1-go/secp256k1-go2/xyz.go @@ -79,7 +79,7 @@ func (xyz *XYZ) Equals(b *XYZ) bool { return xyz.X.Equals(&b.X) && xyz.Y.Equals(&b.Y) && xyz.Z.Equals(&b.Z) } -func (xyz *XYZ) precomp(w int) (pre []XYZ) { +func (xyz *XYZ) precomp(w int) (pre []XYZ) { // nolint: unparam var d XYZ pre = make([]XYZ, (1 << (uint(w) - 2))) pre[0] = *xyz diff --git a/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go b/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go index b392785..75c2906 100755 --- a/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go +++ b/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func _TestGejDouble(t *testing.T) { +func _TestGejDouble(t *testing.T) { //nolint: deadcode var a, aExp, r XYZ a.X.SetHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798") a.Y.SetHex("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") diff --git a/src/cipher/testsuite/testdata/input-hashes.golden b/src/cipher/testsuite/testdata/input-hashes.golden new file mode 100755 index 0000000..445d849 --- /dev/null +++ b/src/cipher/testsuite/testdata/input-hashes.golden @@ -0,0 +1,14 @@ +{ + "hashes": [ + "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925", + "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "ae1d9ccf7ce3717a9aa3316c6b7850d0a85bc0466bc1b572545f90ccf1b59130", + "a4cfaddadceb816c4dad0a10d933a1880f9b47b9f943ca93b91cc3a046567fda", + "1d93be8a70df9e7450a0ce98231c58d7353e025cd1e9db32a00c2fd0a1643d96", + "a0c10151fc212bc313332c58aba5e19de1d6787178613819ff8dc6db270c66fc", + "fc54b1c9039285084cec65510329331a82397afff54706a9ac611b95c933f783", + "621484cec82cca5d8fb163d80c361ddf7320913fb294a3855c3e4db60440919b", + "b780c445c161b65c3dc1046cfba900161fe8a5f644907995b077f1afd231b230", + "4eefdc2b82e79d98fd3f323b5c284a1c35f4a8a862d9e83c8b96cd647ca3794d" + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/many-addresses.golden b/src/cipher/testsuite/testdata/many-addresses.golden new file mode 100755 index 0000000..e5e8edc --- /dev/null +++ b/src/cipher/testsuite/testdata/many-addresses.golden @@ -0,0 +1,5005 @@ +{ + "seed": "d2lyZSBqdW5rIG9yaWdpbmFsIHN3b3JkIGJyZWFkIGJvdHRvbSBhcm1vciBkb2cgc25vdyBhY2NpZGVudCBpbmZvcm0gcmlnaWQ=", + "keys": [ + { + "address": "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + "secret": "e7550f33084a1b8ba935e2a943201adbea065ba9e87ae1e07c5a0b1d87ea8f3e", + "public": "024386ad78055064e65086ab69ae5c1629aca2fc7e4857261d141c181236700ae0" + }, + { + "address": "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + "secret": "cd6c5e2d56c302496009c0cd8006e9264a69606524fc7f58b45351d2cd883209", + "public": "02b7e753683d5b53b5ce1c800dbfee62594d7d3f1d5f8a2af8f9b9b6d01fac02e3" + }, + { + "address": "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + "secret": "4976bba22c7f481334844d8f6c8d513c573d881f64a55981506b11dab581c39f", + "public": "038c977ea6bdef6f74ab9864cdbfa3065b5aeecfb1b9fc71f2459e3609a242082b" + }, + { + "address": "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + "secret": "097669b9fa165f102c4c9aa098ae3ee4ff2554788b875cb5b0aa76d225eaccf5", + "public": "021c52a4b715fc1cdc6ab6d7c8bc8d9e0ace43ae5321a07a950d63eced0b82f8fc" + }, + { + "address": "gwgdez9f3BLvQyNE5tMFS75p69zs2i3mRq", + "secret": "52d5cba120ee89ac59506d19900833e0d4d696fa56549f3f2418958791d5f880", + "public": "022e678bb9add17994fb4603914c8fa229b5c0aac6b725e24e256f6533bb185ae7" + }, + { + "address": "aSEqXrooiycfyXDc2aLYLGSmjrozJh3jCn", + "secret": "3bd338e8674ca06431eeca83d062f17557402b88afa9daa015783e47788168b1", + "public": "038f4cbfb7b0548f53a8fe25cce2c938acbf2d17ccbea347a10872317cb5168178" + }, + { + "address": "2Z6WpR2RoBBF722hZ75ShDp1LVmojSRfAiF", + "secret": "d7f3f12937a4429299e67d5f916a503fdc2ba3064d89b6b39930f5265a8d792a", + "public": "0363044bd9d59c9461dddd3a0aeb5e973d696ff5f1153c1e930263244aa8066a87" + }, + { + "address": "25sH1HLTQbr1CR4uxkMFtJY2WLLwFVPqzKQ", + "secret": "2c47f82501fdb00b7d47a545ab5d1e0a148c1ed6d47e8f5630091561465ed40e", + "public": "03992d87f8e40ed2e55304a05e3bf7e12c9e8713498a90acfa51c046c9746d8f0f" + }, + { + "address": "MGiD4Bg65F7bQhaKmhCLsaVKKeEFLuGgA3", + "secret": "fc7f9fb98804537752ec2d2e58618ac316e556af202294a109ddad5747b18d31", + "public": "02f4bb55716f1c7d7bd69e1f0fa7ffc50094fa348be3633a916c8da21298c2db55" + }, + { + "address": "2bYFuBzZ7QiEbpJophC2pFhQLbEFt3YSSJH", + "secret": "c8c40438a94ccfff9b2fe7150ff7a4193341a55893aad88c06f05b904bc2aab3", + "public": "0377b14de3039f77bcf3f5f4ba852a9b36eab3d7618c59c33336aa17870162d446" + }, + { + "address": "yExu4fryscnahAEMKa7XV4Wc1mY188KvGw", + "secret": "ccf9b32c1f573a7e1cbdaefb791e515847e857fa6e44a42a4bcb396c5e5e7544", + "public": "0399e8ac882b086491e424a04cd8289e340a5cf132c74950659bd21262db5674a7" + }, + { + "address": "23GxEvPcy5vFPuzuP8o3PBag3HgQdoaWyXb", + "secret": "815d3fb815e4cc29c5e17acd597c570a8f1f9108ae955c01fd756ba5564bba4f", + "public": "0370dc9f523c4bef8697e87a59cc6c54f4e89d513a8bf08b1cabab7a357a508957" + }, + { + "address": "2C3JbrfoE4dSjZ5dE4hxrYCmmmrcFEGyiUL", + "secret": "5e01bf90d5331617a5c83afec44ce5b13dadbfc94efa58f2445ac2e9885c867e", + "public": "03761fa32c428788d875e670ad62f128da4ee70ccafc9577b6f1e3ba69a5195137" + }, + { + "address": "KE9oA24AuPzDzWBEjhGJu7PHZsQjGXYcww", + "secret": "70a250282d1b56abffee25badeb702c2ca82650c67ffa8be526cd600007406da", + "public": "034e06e04e3c6a32ddbc25c7572343d50a3c4eedd596550ccea33aeb24410d2422" + }, + { + "address": "2KnZdRBrVkK7EyzPxFdYrAoZ17MwjxxaCR", + "secret": "4627499983552fea4be50a879b5923f039959baa3af2e0699381a95507f0e6ab", + "public": "02dba9c7be5ea5668554d295027eaec51b69a582f4561d13afa8ee9004b2941b2a" + }, + { + "address": "2NGNQTdVNxZQPpBvj64ecidwXF3ZhhkX922", + "secret": "76446750f1f12301fed6037803d0560c008a98a2fa34ab5a1ddaa8ff9dcd3a52", + "public": "026341de878a483526cbf90a591fe8b6fa77fa775d3dfabca8ac5be72aa83690ef" + }, + { + "address": "3sNLvvtb5wFLMhoFxhSb9FiySLGoAzNbGd", + "secret": "9f9b67cde19a83f752c9639a86ec935526e1ab8a38dd23a702686e0e9d4e45b0", + "public": "0398a29c3eb0462bb65757990a762f7e5062db04fa228168c8a308348f1ff5903d" + }, + { + "address": "2kaTspbcfCyWNatPbRNZ55Xg8zyp77rNgv7", + "secret": "2ef76df65020b8c65ba9c6d71dd027cac4892e7e8ff1c8b12f87a48be1e117d0", + "public": "02d16798077bb6dc624d3dbbe99c698c7b91b17157beaba72216b6d85b436a3529" + }, + { + "address": "2mcYBt3gpiYFjkTZQHP142R3NF4JZimhSzk", + "secret": "7c2e5e465f172630375aad2b57a45b654c10a9a805f0f25b1a34ceec1b420a74", + "public": "024ab0a1303bbe5e09222c39276da19ff1f761cd1a164dabbb48e6f388a7a82f8d" + }, + { + "address": "d4vFNveNynBj56XWK4M5cHw5JGLdc9arDb", + "secret": "0e956d92efe55a0b6c0b4db9a2f25d370961da54295ebf45fa8cd0bf4d4c3a3e", + "public": "0396a73e38515653a2b58030489cdb85b8dd000293597eab9616dcbfe0d02892a2" + }, + { + "address": "trJzid787SDzbZke8HGGabsRJxf5UYQ24t", + "secret": "aa3eab38c574d811d2238f88a8db27c3973c5f3454e50224340abbb70510da2f", + "public": "037570e5c30c2cd11af39ef7cfd8d3d1d09bc9a6618fa649b484f76560f27d9fdb" + }, + { + "address": "843rtbppb1fS7GLipW2VdAJ6U3ASNYEYXS", + "secret": "f700853e5a35c9993f7951b5b7c9bcba595f8a0ac6394e233fdb40c2955bafd9", + "public": "027b6f77c26d08e3ad3bed214f8bd450635c3f53879c60ad51560eb877753dccda" + }, + { + "address": "Jn8SM7bRtzC49hb5ndj8RSjbqUUUPqMj3A", + "secret": "dd09b66bc338c831be7d3e781345957e0b04c691cb9e3fec7104202aabc3b949", + "public": "036abfb1f082662fbe2d39ad34c9cfa4f58f57160d77a7ef997c6738ce7cc496fd" + }, + { + "address": "2BwTfjCK38ucP4UAdAX1HbzR7etZcBY6FXr", + "secret": "68928b66031781cc596dd42bf1234c6ae315df97791a2f96bd5c74d2251497bb", + "public": "0328b1281495e1547dc27a29fb29f4a1b66b66fb8358e126beafd76dadbc8272c5" + }, + { + "address": "2XRhzqNgRJgT6rNp1FVp2SyZfrDedjSKUWx", + "secret": "8800062e991bed81298c23b773050edc552390bc5d0eefa6abec0237524a1866", + "public": "020c41cb5d5294a18378f8141b7868d39c9f9c7b0ed2d5f862222a103cd9d491e9" + }, + { + "address": "o8xuJ8PVfeBCSsZkR5hoB12ooBwXJzVztB", + "secret": "7a54ee9f88101d3623b81556b36922b18b6fe2bff154170322544602daa2685a", + "public": "02d8f4e328d0c04218f563ad17edf39af82dcc8b5f8d5639a6ece03239c7695d4e" + }, + { + "address": "S49fz7SUwStZvhTM7DuJfN2DKPgkb9bo5r", + "secret": "9cd5662056a5ebfd882c63852c8bcff133d7fdec0c7c51d3cecc4b41dbb9c5aa", + "public": "02bc622382316e90b2dc4c63a6638719f710dad0024818d96a42c67bbf49f49632" + }, + { + "address": "FZRetm6mneEEkXzZTGhMfWvK4yaSo1rjf4", + "secret": "673a827dc5452987a4e944dd5edfc286f815c3fcaa7a9f219d46cfcbb56b5dd4", + "public": "03abc7caef609535b9bbec78b24c2f0944e2d3cd472021e2e714f5136b757b85c4" + }, + { + "address": "pC4nG37Nz9VWTfEXJjgSP7wKDRzNkF4bn2", + "secret": "a76c7a8c63a7c65eedf815ec927b0ec4236944d57bd975cbe3b0ba7c15a238a7", + "public": "03e9bf477af127058244bd5ada03d17f966ae1ac35fee464347aeca568643dae4c" + }, + { + "address": "uVfk3t6iE5f37MVCDKrquUewt2KJWZJNTP", + "secret": "f1fada84b0e61f65814ac2647a8e8f776fed9d07659cf5540817e712ee4d603e", + "public": "03ac4c5040d5e6c0fb9536968e4c59b826a5bcded4af44a1c70cb06c2998e772b6" + }, + { + "address": "25sESDqRTSKZbq1Z7UUykw1UxnxejaeHKNV", + "secret": "e66fce8a4934642b40de3206937bab985279d043a5dd063e04c2718d93612d00", + "public": "024b1e68e39344b6e3857434c4929f3c0409897725ddf6b82e363446964a5a7f8f" + }, + { + "address": "agYZZqeEPpHYS2Ks9tmtbBEg6xTCYZVatb", + "secret": "8b111a441d22f5bc465913e318ff99a5dfe7df5cb011c59d8197809209e47ad6", + "public": "03e36c45480e687f6f2ac25608d0b8e75ea8ada441965c927a4b15a78e3f94c82a" + }, + { + "address": "2TpoqeGL2tHKnfBzaBpD6oo3E37rA5X74bA", + "secret": "09bc51ed1979b9c3011519f2a6c900762cea345aa1af5c73a2ab94054c0e177c", + "public": "021b11212bd1127d4606e48c36938a92696d115dfb37880e3e81b8d5b59171fde3" + }, + { + "address": "22y8iKcVhL9337QPXWAM5m68f9eKHcjhU44", + "secret": "af7212e928b268c0c8078fe972dd394cace9551d36b6c0c60fd264542b6b5256", + "public": "02c1147a11a54d5545f696f6c5047d1571e6b432de8a57e3dff461f159f59a88ea" + }, + { + "address": "f1YscDhp9YWMEnYbPtdJE4F7yaV7GsNTPS", + "secret": "d8e41cba017811d71814bd36bcd31eb63fd6ee9745a3b2436eebdd2700f58bc1", + "public": "03346a3a79d5d6eea45ba3abca39284ff97d0ccd4371487d72f3b4767d70a5df79" + }, + { + "address": "nHPDziRL3wwDpe9rGsTUEocAQbyRHAJigC", + "secret": "c1bfbcd71db2d80d2cfd1d703a2c77d218cfcf887bdc31e54c8de628b9056fbc", + "public": "038e900f336f7c079594b2932ab6a477c88c0fc15499eca290c1901408ac0f5b6b" + }, + { + "address": "bx6Z6THQsmto8ANcgNb9WGhpedQWhvKiPD", + "secret": "909c29237a00742601bd955e68bd816f7e7bc6dd59ce3073c29bd33d541a2bae", + "public": "037b9af02809edd2690be5816a2884c2c13b81dac4664ae9b77955c1311b270116" + }, + { + "address": "2NAfLeTNC19wof25NSBNpKGTtKt1iEZtxDT", + "secret": "2e9162ff3277034514612537d06bff053b0739de417887d3aff7f4cad7234422", + "public": "02210135701345e15b2aaf4deda129cd751c47e3a37911d38c9cc69c2865b69c5f" + }, + { + "address": "9L2uQrmvmgeQDYSgiPAmczWAgJTWekBG6X", + "secret": "74e851270b94649cc8b53aa56ae2e188de32d43346a17e7e82e492dab1104a3a", + "public": "02adcb621c62eb75c79ea6436017e5d34631cd376aa8e965d760cfd8bf7f9a225a" + }, + { + "address": "8pDsA7hNgcGmugiq9SqbpBAr8LNvqXhYCd", + "secret": "df3557714a662940a82c11d84663c55c8de236095c28a31b9ec1b149b0a7bdfc", + "public": "03f1ea020b8a21dcf7c6fc3540f96ff6444f121f397ae04cadf65cb057848b80c6" + }, + { + "address": "HDVGBNTJmnVeU1wY4iEiDmT4KoNoJ97DVk", + "secret": "5041f6146dd91ca0213e2df48cf8c9bd0f99c64fc8a0b64726b44fbbc5f547d1", + "public": "031a66ada2536a17a5490072f0aee3d980b13de58700d933b691d2b95491701eaf" + }, + { + "address": "28GUdCt1ACa7Rn8pN9ekxugDh1hWgiY8W5m", + "secret": "a60c4ba7fdf08fd40149620ae0e8fc4286d6283269239f302407cd1281d57580", + "public": "023fecb3e413741c3f97ef44ae34a3c9b1d32bc77ec1cb5d2e0a62c61dbb336248" + }, + { + "address": "zW4yhXcYE1ehseDfsCyRJCfsT9aFJ1P7j9", + "secret": "121b9d7572889ef55b0208dca8a483887c0b2058db5a891196f561210f0fddb4", + "public": "037cfcbe2648f52ff55a77fbd120797beeeb12b3dafa78ad161bcbf539dedbe336" + }, + { + "address": "8oEmZLjUnFx8DCt6Jpbyz7iNDEfgg5FwXG", + "secret": "4c3c253abc435b410fd2705af8f0f790c3eab26415e25b7209472a40d0b0d1f3", + "public": "028d7c6613d9a95c0eab9698afbc2f2429c2fc67e62380b6536421e1b4cb4cf059" + }, + { + "address": "2FxepT5DXPGNW647tuCakM4HxzLPKXA5mnP", + "secret": "a938eed62cfb072cc74404a3133c91cd2cc056ceb466c00f466e000bd466983d", + "public": "03e72d38296b249fe8104308120c09a46155d8a31abb0e1869a56c66bd3e87f7f5" + }, + { + "address": "2Rt2P1Vh4o4GK5EwfqF8ndxscxRZErTuyV9", + "secret": "ee422bd4c063752400d45bae49135f9af10fe29d20fd5eca3116377406523de1", + "public": "0314e0b4a496c865dd68c18cf89f19d8f09cfc0fd4f6e94578af99c6325e699802" + }, + { + "address": "Y1g9wuCKZjCArscCAdw2YjyWoiwv5Dgv7U", + "secret": "550c62a0491ad444acf71d6eae431b4b0503df53f9e495d2340f36d4da47e9c4", + "public": "032f92422e238e703eded027945a9836efad0f1007bee51e4c32b457cade288e80" + }, + { + "address": "2Fafftp7czxeoiio5bNHUN3WbfvrJPghVZn", + "secret": "f4a0576bbff57e5d01ca0fc14b26407325ee7f5bc5b7f5f146dee7a6cfb0a31e", + "public": "038f0dadbe3227fae1a18427cacf83a004c63c51dc8860b7028e95cf148d000d57" + }, + { + "address": "2W5K63cGj1DsvB7RkjmpM43PgajoJKemynv", + "secret": "f0f2c983402bf6273aa88b42de4f03876f7beda8f8ad4d94ff35cf1c784667b4", + "public": "02d1c067f11e13275865477cdbd4596be460eace6d76a28e2a4190869c2a2ce598" + }, + { + "address": "2JmV5HRoUcQY4qfBCfUFgg1GKSbAW24iFDP", + "secret": "95d2a4a278f65f262f265a485d0341b5cbadfa913a06fe4ec168a94eb469c78a", + "public": "03b3856f613e7cf421e89c7ed8d9f218835bfff56fc85813a774545d811c4a1d05" + }, + { + "address": "JWyJu3N51syANQWy8CR5H8UyoM1W4zHbja", + "secret": "40709c6b0060a61fcbbff96623330fb65bc38d193ccaaf612ad06157c5135772", + "public": "03bdf149804ccfa96942a0985132dcadba7275b30f7cecff92f36dfff4195c4336" + }, + { + "address": "atsx4Dc6dnqoJQHKPDjR6hgjjEtF7cNhSw", + "secret": "c4e95cc86105d81321c5d7c5d93f7ca9956511e621ebe0a92a18e36c333922e9", + "public": "0314ab127f4fc734f7421a4e470f8bd763f6c63c6bd7e27644a0964f50fb736a5a" + }, + { + "address": "G6TVGZhGKttfCybksiQ77EYuQ6QUuXVsFs", + "secret": "5a1e028796d742347c7f17c2cabbcafc47c5d8fef5c34e31bcfa012cca8bb724", + "public": "028f2dc1e3dbb4cd78cdfec0a0a9d8e88d4f7d3a231530136030714b5c82040c2a" + }, + { + "address": "tnmiayXaehMjUutwQiMnjfwumiJii3Negi", + "secret": "ad96aca0144c11368637c0a0c204cb54812d2e6e401c35b414ac3b8e020a3d56", + "public": "03aa85be4ad8bde40cdd03f1733cab365ffe8645ac8860c13f8ee98eee7f587a47" + }, + { + "address": "qKBvbpxDrCC13fJih6z786gYkCMfPr4yt9", + "secret": "e62bcf14a9c22421cf790b112a49a41d292abf8f957c595d1604fe242218617f", + "public": "033fb1376285345ea5d55f282239c9ebe6a34b0bdcc2a24fd7e50f2dcd7a9f0323" + }, + { + "address": "2Q3fiiv1VnZq52EXRegs7Zm2uNuN1VqYEr6", + "secret": "402d0cd54cf447d0d1a6edce5b363f6d052ac923ac07880261ab1966323970f3", + "public": "036491f6619e034c7031284cd222785b9ee0873f20019e49eb80e599423050a4f2" + }, + { + "address": "2XTfvKh4sjavjxWzUpun2aEioprqmjy8DRg", + "secret": "4dccf074e0c8e4d01fb29a41da3b05acea13693c0d83ccef456f78493787de7a", + "public": "023c992a18276d82533dc77c0d12f65668083a75f9b4b8963fc1284f34b1bfd6dd" + }, + { + "address": "rDdVaVDJhB1idZHPXbQ3PmDFV1ieXp51hq", + "secret": "2fa5575b7df071950d930de9c9e00adfc8d7e41ae4e7731296b938874c4d324f", + "public": "0252de761de10cf981f0cec0171f713090944a85970cc911e35433427991e5381c" + }, + { + "address": "5MyhUZ9JkQ8nNh11JManWvm8btNEmBDHm9", + "secret": "12be2aab0d9b3556254e6ac9ec5480f9eeee5a9e9cd48d4ee5b26863cde25694", + "public": "03d0325101940bac1762da47ed2a30916fb381a461474ed6611afaed556d32836b" + }, + { + "address": "2faGziNRteqfmS2iT2JHrqg3DGJCr7bwPuf", + "secret": "d90f354a51fccdb09f854300ad60d85999062cb716b1f3e8ad706b20e99f6571", + "public": "03637c8155e9858f168a15283d0804840e01b02654ab30dc7505fdf88d7aa88ae4" + }, + { + "address": "s6nvRxY2XmgzUNxHPhpvZWL7KxgXHjpeEx", + "secret": "caa73fdc76cecdf09c278d82eda4ce9ff40c297580dcdc191a4bd43ac0804d53", + "public": "03af813f6b8137f46ba8b77cc9f1cba50f93689ba7ce5498a7edc59a0e3314c6c4" + }, + { + "address": "i4NJfp663DS2BKoZqRrwZWyqJmhV49rWVM", + "secret": "5becbb9a2f3dd5ddfe991b5d8d4c7c2d578ae4d612e92fc64fe902a4233a1ee1", + "public": "0237fa3963e2fc18f0f29e323ce3c01a7ec26550a4e17fa5dfbdd748d4a0a9e116" + }, + { + "address": "fcvhLM6vswQ1Gv6TjSjiadS6zoE7zDshJa", + "secret": "3dcf4be5fbd7fcec93f17a2a07854e902396f8ee7f0ee136633520c00bf8f26a", + "public": "022c509d2fa07aa98b90d4056497822853c53115f519eef7560aa0b08504c59a73" + }, + { + "address": "nfSyJEW2ABm9W8vEQiRsrWEiFu7t68YkYc", + "secret": "26e4d66a9d8a84b8bb249179d360817f042b065ed4f6dbd88ced895efdd660d8", + "public": "025898ccdd8f913077758d97d7dff8704eecbfcdc9d6ed6aac6e46884aeeff1b80" + }, + { + "address": "bQB98uNcaCJXWWeGr6x6xrGq5NMzbSfw7B", + "secret": "e01f466060b0a3ed01a453362d3ffd0f0612ae7dd8f9b5c1d23f3e5df7cc40c2", + "public": "0361f9eb0b245e30d44fe15780b06d67f04d1c175f2ee155e6028a14f6dba72864" + }, + { + "address": "242BmWuosWU4Sj5e3kvDQ6ibvzNqZUzZ4de", + "secret": "4730bf793535f544e4c3abe6d54921801305850f769cbcb64bd65f76da1928fd", + "public": "02f311980d0636ff8fe655b6a695d6214fd09d02d03ba426d1da42dce5585802e2" + }, + { + "address": "26BWqf1QCBxGUdnbuonjWRi27LVVLmab2Z3", + "secret": "ea4b5510b9a4fbac1057012004999622d16b0e8b89cadce161ff1196cdb5cd17", + "public": "02080ce1982679c7cc351d36a4f4d4725bec9167c781df0f93de7a63d02117eaa2" + }, + { + "address": "MLXZvSFYD2Q3ST9hWHJK4wgMmoSCBW4cvi", + "secret": "fb0b97b8fcd171b41fd436b8b513794adfda84fdfd2c6f472a40380a49508462", + "public": "0314787b7d974e093a356713a5be01b14586351a91464f8762ed179290e1324f9d" + }, + { + "address": "wdVZgcdoPVpdEhAM5SBQ4gm3aZQU5rbCjm", + "secret": "4f6c7aa166ebedcf651b11804a969cb0ab939b1bea36bc0c7ca50f0bcb208798", + "public": "03876a421f40c2fc8c6aabc3e4449f882915c2ab5a1d15b5c3329c46e61e417508" + }, + { + "address": "22z6getjDD2GNjXZqe8tHjt5ypjutAEFoLo", + "secret": "0f3d5966a4dc8b6dc64a338e16de058728c1cf2c3f839b3cb05931bd1745eec6", + "public": "029512639e507dcccabde5d47fc5e8a4a95e222c86f5b62bf210329aec935a63b0" + }, + { + "address": "2GEFesXK5Uv14hn5Bmqwd61c1CCQGMvbZLh", + "secret": "4cf001cad4d96d2f2a43089246a1c756e1c23729d1d024f5d332de17e7800c53", + "public": "03045c57e07f9a97d650fe10bf7f3fee1ec1fcaa706e4d7438b5dab09198b840a0" + }, + { + "address": "24zxvoEFNb6ww8zDnchMsqdBoJuBL2t6LQD", + "secret": "fdae58716ebdc041a3a15c70b829af15f13560a371f57086a9f44f3a0faa772f", + "public": "025b943230dcdca2a78d9e2ef9b655c310fcc1bbe6493f05f5cb685b8fa4c570b8" + }, + { + "address": "2F9PfKBjsUMEViRoM1jKAG55T1fSu6hg1aU", + "secret": "219b0e3e367bb102d9e221b3f9505fb808bc086c9bd39d85f3043d59a0b858e4", + "public": "037cd54ab5c37e03c911ee05f7a06dac32bb55b5a18c8c51a2098905ee4f4d2731" + }, + { + "address": "k6s7miNx1cnYVEgUPQD2iqufKzQpRDmzQ", + "secret": "ccc0b397cada9ce4237a0a99697ade6adb57902cb30b7205c1572c377b34b778", + "public": "037bb2652a57a019ba2409b589522ef8a469a140537b33550e161676c0ba609fb4" + }, + { + "address": "S8kVNfBsuRPY8UcwVC44L4JmHF9c2vdoz", + "secret": "02a608c34f19e5f5d48eb3779bc61997c6228d6a83d32ffa21cc5e00c0c66a63", + "public": "0264d8c516969cbe5bf6882187105c72e33c44534203c935cba5bceda4875bd48b" + }, + { + "address": "2ELFHvS8iJs7g9hAYmSQ4d3fPkHPZ7GSYb2", + "secret": "c4d7f23d8df026b38083120e820bc90150557567591f16891de724d1cbef936c", + "public": "02773b43ebe9825f49ffbf9869a63870427c0a2d952e259fb6f14d177100fc918a" + }, + { + "address": "hVeQGNagmE3VdB8FAipt4Ya792T7JhXruJ", + "secret": "4197e0ecf350e45e082214b47e17284ecfaf1fea454032595b143a0d89d79aeb", + "public": "037e25ac47ca505d157eb26196263b1747e71548381130bacdf8688c0f31e29d58" + }, + { + "address": "2gzCB5wvkKAAjind13d6r4oSm2wasV4aTjA", + "secret": "9e7cdb5242980b321a79f4247362d34c0df1552dcacab20f8dc831c06d4687a1", + "public": "020b81829cd7049a05c9403d9243247b62099a7373b5687300c4f05a3d6996522b" + }, + { + "address": "6DhQZL3HQG1Ai4pH9c72G2Svy2ELaozDpH", + "secret": "ea67b633edf994dae447cfbf50852ba075be004e23f4d99962317c62d25be769", + "public": "03e11ab39dadfac039500dd103f7f466b266a08e69ab2b3b0990b620720bafebfe" + }, + { + "address": "2Tw4op3FCi2aXuSySqPEkxUxAVHCi8Wyxwp", + "secret": "9a921268064f24b0e07d8740b72cfc658ca198dfe2af0b373ddf643dba4de755", + "public": "02aba206211ca5a9eff06f96823d3214dd21b2b7456de48f7fe51ffe4f7b7074bd" + }, + { + "address": "2apYHtvxjoen5tFVrb88XkjPRHp61bnMmYF", + "secret": "7828fe7605bbbf70fc0003d04ec85a860376e8d1d8ea13fda2079be6b11b5c2d", + "public": "02e717897f6b0f94f69a393f895c9df2da0e45d895cddbbe95256f6ae0c433c7fe" + }, + { + "address": "1NdzQhMertw6PGza5eSxqfWMhMjGhbYszx", + "secret": "6f539af4e8b9001e591421e2830a3a2508dcb1637f46203e5a80fe84a9952a9b", + "public": "0263b7563c486dcc9ab1f0d46a5c10ceae652339c353031296c9f1d7deb3fd2683" + }, + { + "address": "xQgKsD9dAHf3NAazojsQ8WYzbaAyrJZeVy", + "secret": "ac07ce6a66f23f5ecfd0e0d983297e18a945730cf653405029c2e94cc7975ad6", + "public": "037104e7bbc30d57f60ce85bd56b19ad72507079dbb9befeb524bec6c6f6b35f8f" + }, + { + "address": "2SShMG5rU7mJ7v6wsjtFYgxrNB56P3cpdrS", + "secret": "4a59d42ba0cf18052321f70d008820256b790ca132461ec0bbbdbe1e03bcab40", + "public": "0321b0224eae60e8518343b6cc8ac9943561edb276bfc468aac589eed9e1044415" + }, + { + "address": "M6JKu4bqGgnJ9ZFuodqfxdzN7Y4q6yoDYZ", + "secret": "dd8a0861ba597070c6d3b43be005e764dd2960bd12ba86baaec4c914132eff60", + "public": "03b046f7c69dee941ebdd54498386338bc2378ae983c9d6b949e3019205dcc7be6" + }, + { + "address": "21vVXWwfSgmhVjMZKzRqQphhHWJhQN9PDmy", + "secret": "29d4bc0900ad68a07c4d4678f9b75155fd06aae8d8c96637a75cce4f2cb332ed", + "public": "029b294458e653d166fddc0f96898b19b74b7ef9f5372c722ac159dcdd7a633557" + }, + { + "address": "HPju6EpzFnWijK4YF2PKhGw36zpC5MTPqc", + "secret": "c1a77068a552a8183a634ee9aa117b21cb9c9d3d71bf885f747cf45a109f3bb9", + "public": "03b13f40cb83bc0fe2386b36ce0fa0c4426ebe68cca13d969951e019539aaa67dc" + }, + { + "address": "B4X6nsN8LUFZnyzPU3xuVJvJseVy5QFywn", + "secret": "5eb166ba3ca4da3353078eca2ca23fda60698388b37f860456a84a1317c669d5", + "public": "020d49986dc4f72bbf500b1d334570fbe96938b51b659f2628f51f65a8211e3afc" + }, + { + "address": "rA8hZGYDhU6mpYdXvwJwdMkCijiGHxGG22", + "secret": "d8e8829f9729315b9ba98dc56e4aad0e85464b9f6bbb4728f705c1c40414177c", + "public": "022764a5135d53da5c995b93ec79259ad4895d0252f61020f9244914957ec4e67b" + }, + { + "address": "fHnsaH3e5F4iMSAaRBFdDvNuEXWMiG4h6z", + "secret": "01897cda7e654eaa1204a88bdd0cc1a3c97ead4a56d5fdf0392bea2e5e188146", + "public": "03f1ff4bbe86bcd2b9a352f886df871b09b2cdd0820db6ec12473a620e3ab40cab" + }, + { + "address": "NpcgbvncaoAW2TZDbLvA3SgRBKGKjFBnss", + "secret": "afc18ea7580c9563bac4fad5408e27bed5fa5c3b48f72b71de3771e4f4daa9e5", + "public": "02401f34ac31518444750a1aec8aebbb98396a788bcee54235c62cc8c7f1855d38" + }, + { + "address": "7mZibtJzH5BV7nTsk2L2E8ybPJQzXgsjjY", + "secret": "4f8468222e72f899d3eca4bb752e46338430df815ff32dbea405077a970a42a3", + "public": "033c5e16a1857eb18cbdaa0760defc375c11c7a990f22947b32f603127fe8fec81" + }, + { + "address": "rTrV5jQZ1116ubbxqTD3r9VVgd9bRausbm", + "secret": "f26dfd8767fe4f2d99a006b20dcc1b760a1784e11469f601e33da7413006721d", + "public": "02d53189e1719326ca40f472c452f18bcf499f2eec21e11f39c366ba3cd1693f4d" + }, + { + "address": "2HCBvVq4Z7rsJ7o3NdRGoG2DT1KZ5EinoD7", + "secret": "02a404e6b1ef80a48f9339deab225c0ded0b6a80d26b28746e1292ab01413a14", + "public": "025318a298154019bda73f131fde9878ec04832efb78369cf1fc90d2c3a6da74f0" + }, + { + "address": "2RUhPZhqiAoSiEYBrymsdAJ6t5VkEVV8sTc", + "secret": "4557c781294d893b66792f88bd6c7557ed85bc471d735b0cdaaa9e070dab173f", + "public": "02e2dd3b4e6ba39a59977a0ea678293255b3bc7d29351f0ec053c203a778dcefe2" + }, + { + "address": "Avk4QuxAyeFr7VtchVebEY6Raz4uRs4UZM", + "secret": "c73eb18af7efe89e31f452d912719611f8cab5872fa2d66c61ff376cf57fc9fc", + "public": "03907b52c063332d80a3aa3b9824c2a1873e966caee5a05c495487cd4bd30d2662" + }, + { + "address": "MGgcz3urE7CCqBm7BrUyiv5YgSkzM1zmAk", + "secret": "7ba7d4ae04765fe5f69d8e1072b22dc2bd5d8e89fc7ea9177e51e7407cb80324", + "public": "023ef86e43a831ed5ea3faa6c0b6c92ef447ead071c32085ba186b615af3e7849f" + }, + { + "address": "2MYqwgpjcM4KooQG5kPE7nqicqqma8TPoQH", + "secret": "5a26e22f142054c7e91ac5de6e257d341a66dea9b377f5a1524e8733909061be", + "public": "033956c4733f9983bb70877076e9a16da0a3192bb6412fe7285048f1efba2a835d" + }, + { + "address": "ae8Ah32GU21Jk2K8ryWB3xdcyBmLZT7Gob", + "secret": "1831d4b0c420224c83020eb30671836d8722e752619e8bbfff631ef4f4d229fb", + "public": "03b88178014789d21bc222e02cd802496baac40ad729b0183fb2da47d6b0bdf879" + }, + { + "address": "Hft6JuhuFhKpQmCteJp4y63GHadLWbtP5m", + "secret": "815d2fdde17cdf80623cb0e4798553f929b247b79faea9cde29cb213be378b56", + "public": "02fb184a0fa61e856f1c3e6324ed6089fe81e211bfc1ab746c89d4962b4ffe525a" + }, + { + "address": "dNwZxggozhUJ9Kvfm3ArnH2KDVFi6gkG9z", + "secret": "9547add3c5808753234603f06a90dbee06728be93345d74c6e1a5639341053f0", + "public": "03ba596f4f81a2b4033a557175e9fff808ea41804ebdfb2583bbb7807c1a7242d8" + }, + { + "address": "2LBqp8gpoo7V5Am7ExiaycspCkzwDybmCus", + "secret": "2fefb1881c3102faaa2105597a139f601105fb705f2a7c7a23e12049507b9236", + "public": "035421fe09128dbccb1bb951847800525cfd979006482a0576f3db7983f005b9b9" + }, + { + "address": "CNoWEhb8kKXFWESa5vyqkpnEm37owGLncC", + "secret": "3afab960a2d0fc16cc418946397251ada6243348bfb8cda133157e1932e519e9", + "public": "03e8f8a2ba639a925de7f93538838b6530b68ef53a7ebdafdc399b1e2e6066088e" + }, + { + "address": "2jSnuGTDS7fbkfgwjkNErXGyz4Xx8hNT5CX", + "secret": "7c124e22cba0f682a2a2a94144adf670f8e5c09228decab2a1cf531ffa59f82c", + "public": "03f88d2c546d56f7034fdd597f6e2c6cb1c00d54d69b605e3d0bb02b743bd9159b" + }, + { + "address": "BK1sByWwm6ZyCFvt1MYCnuhutEEoVKm1sL", + "secret": "51607221de3b4eede57796c66a418200535af5af75b73b8d48d47effa0d08e9c", + "public": "03efb377e6ee222a37a0d7f73be09a25947c5afc5b0aba90138344b44dce8e11c0" + }, + { + "address": "zmQok3As5KxobevD9YvReWkQDGC6AVNExn", + "secret": "f121104cd3d4fa345efd445fb8a39f52dec4a01d9948805dbe2fb2d8dd1153a0", + "public": "03997df1f0d27b539122782b6612529fdbef763de2ec3142844953b7f1fd91a254" + }, + { + "address": "JGRc5N3eEWYhasHmjWpiQ8RqFEQHFsgVev", + "secret": "efe5cb99efa43af9966268472eb5f2836af65d1878e12b3483dee1cd7f5ee967", + "public": "02d3cddc6ceb7eb6bc94244760b1b80e0fd8d32653c762a046f07379473e7a069b" + }, + { + "address": "5yDKACKJgXGeMLTJoT9Ak8GMKQrMuZtAXX", + "secret": "311d2ac25e2e93b75e4b221744a0544cd2c61cbed0f2ae9f2d1b96fb685de826", + "public": "03a460ee0fa4ae57cece255da2d237b155ef36add87596945c45ee399d9d092a61" + }, + { + "address": "Qt4eK48vohSAe9KL1VguDCdTsRbwqm4Nxi", + "secret": "65e4f0874bed373e927927bcf2c4a0b3695d623dcd9b82699a23e090f4d695ff", + "public": "03cdb9a9ca9e32fa1c21f45f97951d2e86d5801800f0e199a171a5932c46ee59d0" + }, + { + "address": "oDydBKTwxrA5SG8BRXkjgC8p8bCLCKX7CB", + "secret": "532b52c6afc906733f9a8d54f571bb46f8236aedbf99950f9441fd66195869e7", + "public": "033a17e3b255c31d2c462612cf55c7822b462072823c7aebd64d758013eb321ef8" + }, + { + "address": "2mtd6hKNAebgEXs3MKLUZj2Hbw98B6RWVJu", + "secret": "1d5df1bf4861aca59db4601886abf9c14215bb47dd498328d0854f5958e2cd52", + "public": "0217ffc7084bdd74bc7c512251ae2b6875d6dad5e519d6d91a39e9cec457b77b58" + }, + { + "address": "SnSBaGjufieLSyi193EDTNP2nqS3CRuEDr", + "secret": "f22dd87c70e283100b42adafc2d766153ed090247dcd909894e9340b35926464", + "public": "031d9e9e4e86b10f0a32a6af86dfd4c0ab8c1e18e1a2410a3abfbcdc6fa54d74f9" + }, + { + "address": "aBbez48E247uZMtn4vQVCFkac8iuuJZXu3", + "secret": "cd5ccab9036554e4d7d5124393ca441e115d3b681543c1ae0e09e8cdce38ccc8", + "public": "022c1a6fcad7a9a2ae3a66dc2802482f028dcf9e156377de508592b6ddabc84a4a" + }, + { + "address": "RY9YMTk1PavUEQNbdqyVHdNNVPDDQvisys", + "secret": "7ce9cc17a56b261615d768361a89bd287ea24f845267e5cc5fdd8f8d492e5cf1", + "public": "030ff1f4d7abb8780198d610d84a21bddc57cbea7625b43eab90a612f5e360345f" + }, + { + "address": "YVjTfb8TGxDRfXCnqNmZj9WocQ8t48bXid", + "secret": "94594f06051e8d60e315dd05dc7efdd99b033bb01071a48f2c4f0c5d14bfdeb6", + "public": "036d46388cb90f08c49d8c58ceb89b9713f9f28d5e40fc6ebeca7d1ffb628a3b93" + }, + { + "address": "4y2U1dJwDgL17A919tqmjqEfzXqMN1sfJr", + "secret": "0d845f4f5b6fef53b40bfd07d7175881f96cf26861a298c96d1310969174e9d0", + "public": "0349290922a67e016f3fa308f0a7dbb151b1f86f19be4cbcab6ba870b5075f1fb7" + }, + { + "address": "NcapPnAXXQbKGRrxGi83uJJLb5vk2VaRT5", + "secret": "183ceb7edab8ee4a5aa307f66f3cf7a55f1e271f8064e0ed74f2390a954c9005", + "public": "02977fcd738a85253b58b7a2ef2ff36d47a5b3a6aa1aa343bf6bf62954b878b9ed" + }, + { + "address": "D8PPZ13Ex6wr5Mn64RRBorPcQnfGYYrpHo", + "secret": "8f619639b6eb91aedd1213d9581e1651fe0b564ddf7a2623cfed817c8c181da6", + "public": "02d41cdbdb8785fd538e887f82752fbef97efc94669001849fae65fc1d68f84f52" + }, + { + "address": "2d4fGA1RtyybodYc3q7sMiKX1BrznHP53Px", + "secret": "c7eea265a0472d0de21010f87c0db5a88b7f6bbccbb7b2fc89f12bd9198d9f80", + "public": "03b0599b68daa9ec4c330d840517d041f638dcae1ca8cb93bad5c2e83db2a6010b" + }, + { + "address": "vaeR4TDLoUiYzJULM7FByv9owEKMkX5cG4", + "secret": "e27f88009bf53b0253ebfeec1c5cfa3831041a6a977a0a1fbaeebcfa3b515ff0", + "public": "0394fbf78b5909af228443f95e3bba853e1669a17e328314e27906637ee3e879c5" + }, + { + "address": "HHiby3rggQqcvcMWey7B2FFAwn4UPQSsky", + "secret": "0e513ab67bc9eae469626faee07dcdc95d886feee2dba72160cd824dbdcb002f", + "public": "025ac4561cbd4acecd25d95e09d1c0df88f3f181120be234cb182e4c6422090172" + }, + { + "address": "DRbn4e9kumeadJD6bx5Zwc9hJR33pCJ3Eu", + "secret": "e1a3e5b5f6378bbac69f4c851aba44d5508b6879ae173ed538a7f58eee98c005", + "public": "03b2ec20a6bc7089b22e02f3877648ae92d6a961cbb0764264aff9635cb9b8bc66" + }, + { + "address": "eF2QTjnUujZiyEReWFFtgCcF78bseuf2uR", + "secret": "5f9ac6bf76829a442c2e524d424fb91123e2afc9520df6fdeb9fa7985c017e9b", + "public": "021bc1cd131c269c4413aa235851449bf66d433ad2f7a6abe426f3d4251a38b4e3" + }, + { + "address": "GpdAHSAGjNBLy7f35PSgQd8fvmCYBWDS8k", + "secret": "18fe04699878a57546523dc3076b1c47d63bdb091eeefb2839eec162619fc1d7", + "public": "025d0f942436a465d4f027c00652717f6b77a09485ae5631a7cb0c7c0ac3edb40b" + }, + { + "address": "2epTtuKgNH7hzfbFV6QNSzEvP9vv2uUpfnT", + "secret": "c8755985ea031954c0501c048d8950c35685577cd543adc214c03437af59cf20", + "public": "03c88abdb994b24ea489bda4ab140e4c5cd9fadb95d395a11fb99fe7e790bbc4c0" + }, + { + "address": "2Qpz4d9HZzb1uaeN5uyjDonR3MR1f5v4qjV", + "secret": "b8ea20e202b9e411ab47c6da122aa0d2b2953567d61a99471a4ce66518bcb8be", + "public": "025c77a070003120f1af15aa42ae9740b44abe229ea7250b77eb1ba0033220a9d2" + }, + { + "address": "2iG4Fs82QP6WxCxayVbTfmoTH4M4N7Lvos9", + "secret": "9fcb5c59bf38c087b0e427e6c10db9990056b65560b79402e1fce98f14652cd3", + "public": "031d315e2eb87ee8032dd461a5485876c1139a9c28c7e624cea4a3649f8aef35ec" + }, + { + "address": "2NKE64LsSB77PCUPud1heKa8xmjadonV3SU", + "secret": "9b05f64e513868d2388c06a9ad974146a2b036a40910f9ddab77a9d75c11a751", + "public": "03adfe42ccd50b9577fa7620945d72c70a5b096d6c97d0b6fe3a3f25a4fad56f6f" + }, + { + "address": "Aezo2HdLAbaoZguPpszC9ZUxhmJHmAFnfT", + "secret": "c4a375cc88e1b0164a8a6e1d02d309312e256f84b18ea085d31806a1268c98cd", + "public": "03bc9e850dd82d2171f821fe8eeb98497dc0d3864544099ed2df96d26afa407e30" + }, + { + "address": "rhhySrhPyMSZ9DxDHFrHR7ktnEu7AkqB4K", + "secret": "0c41ee6da35751a7dbaca48f0634f69ddc5b69d2586093a1047011cbf10cfde7", + "public": "03b1952ff8bcfd8d1febcd8876e11212108860879eec9e05d8f985951861df81b1" + }, + { + "address": "bxfcnYtu2tJU23uVKmw9qV9CffuN2Lzvu9", + "secret": "a999df119d86f4a42617d53bad1a7536c5241d9bf63600a9d4245f07df3d3bd3", + "public": "0350e14e6de722e11f27ccb942e2a564738748a4678213a640ba3d3af0083f1f92" + }, + { + "address": "2m8ndBh1iPqPNBNGJe9vd5gThJ45KzTz4Fd", + "secret": "0523f1e4e57c30371b7f7b7f89f47ee9bb4d2d177c57da5a28d25ebd7ce71a46", + "public": "02e8a36d23ea250088c113d0b6f41ed40d22c3cff4ca3356f50637eb020088aa43" + }, + { + "address": "PHXhq5ArUzYZJSJ8PiBSUj4ef2sc4zEtW4", + "secret": "afc892144fd61f4c3ad6c1cbc493c317ed007dc43fc414f73a380f08697303a8", + "public": "037ffedafde38ebc382fd26c61622a258a1ed18d2f7a0587a5c37a93b6e48e0f96" + }, + { + "address": "2WCPdhx6QR9RxRxDntTG6iZa1as2ja6btJR", + "secret": "1818a34ac2b005aa1f3f259dc16d189620f76515a3528985766761fe9198c53d", + "public": "027fee0b90497183521704f2929cded0adb3cf7123fc17b929e9de3a45d9927833" + }, + { + "address": "2bFrdk6bqR8FLQ6kYF4UPgnVjs2mF1DsfoS", + "secret": "f5c7bd0bd1853186cdf8a529d904f1916076880a1c5cd4a828730674a09817f2", + "public": "02c4e443c03b8c12e140ab0270fc0c67a144144e3dcd02963e107facc5dac5e428" + }, + { + "address": "2cwNZy4SWDT1zX5uJesdCKU2fFKjrcmpzvL", + "secret": "38296af1206f02b7650d5be42b8533ef5870c54c146c39239beabf6d500218e4", + "public": "0290aaa6866d979208b6a7ac2984015813ed4ec47f6a9ac49cc032fbc16b4533f3" + }, + { + "address": "2bwm9u7aGPMc7pfmHezfhLFabAuH7H6EBTx", + "secret": "c98a3735e47a9c498dabae93f8b40683619eb1a37756e3b786b2d40dd001d7be", + "public": "03b9f0815dd914ef4e71caba76a11cfa41fc8d7063038b337a9c600c9a36273822" + }, + { + "address": "d4i4nQXJnoPiyPXnBFobXGM7nFqR7kJNZe", + "secret": "e3ed12b80054877ae1d5d9ca1be4dfc483d5ad4b44dffb14b331e9b8c07acae0", + "public": "02317c1f881a8f39c9987cf6daa3c8887ca03d91b3bd5f915d3dd3c8eb7dc90c29" + }, + { + "address": "2H9VJjLXy8nugAdyLLCRSJi1dwRx8oWxFaU", + "secret": "e296d63f3558df4bd455a9850bd9420e2ac5f3bd2cbf8de148a14369705370a6", + "public": "03b4fec118a0e5409f5c7ae65462f56d5f40f477b0227083f238f49b9f90f8f70b" + }, + { + "address": "2Mvc6WgBeU4p7QKaDbKPspwfNvTbncAY5Et", + "secret": "20dd7688888654a5f214bee8d411c5635e0be8c8b13d9ea4719521959e65840f", + "public": "020993b1c2fb2e251064b1c53bcd1e5f18e7f7b5b845d8fca619ff5654de57bab6" + }, + { + "address": "2UjjeJqwrL8zhL9hiQHsfyQS1ACo7oQQnsE", + "secret": "8dad55ff69be245c2f6714dd514338118b4e18f4743b65c1a318b8ae8acafae4", + "public": "0294b9b8baa6b0f15f00f707a02c5f4002074bd9461982c6153b87573c7e2176ec" + }, + { + "address": "2N5b3ujSAFtGPbAVvZ5PSMtirXPAGxXDbzm", + "secret": "0c878e067cb6dbecf3af796ea802d685a6bd463f24b84a3ef973797596081e52", + "public": "033df20062b208d521babdbc6105e65e02f40283132af33fea83aaf1e41b9a5c23" + }, + { + "address": "2LD16WXviY1JcFLL3Zz1Amcb4NPhMAzeqCB", + "secret": "aa9f09e643003c1227741d2c7c031d84cc4bc78269e988576a1e96ad94ab7baf", + "public": "037f33fdad8e27e15217a7c5a9b9ad7072439ee03176fd747c16a240938fe855dd" + }, + { + "address": "NRA6Li4MRknBbKaNEhRoxkP8g6r94r2Gnm", + "secret": "4c44a49639f2885c2e2897a98a4d1135255a8a5fcfd17cec0f452571f547d7f0", + "public": "0334f64e4c6af2e283a7a994132ac8d6f652b1de0442540028c168e36007c998ac" + }, + { + "address": "2hnM4BQEaaNjdyGDcRe5yRVXE9i3oLDUxY2", + "secret": "fc1b2dd7770ff800de4fee7eb01ec6c06499939dd9c4ae6ac51047dc803f177d", + "public": "036c44f8a8ba59edcccf49a6dee7d22ddda61272fff258ba19614a529768105dc9" + }, + { + "address": "LZh8LgTSoTo1YgRpSkh5etREEyFgkLtQyh", + "secret": "08d6246e2b3ae9ead57557f64d369507f2c6de10823864c33b68ab824229b7a0", + "public": "038f5db7aef3d2086f0e4f5fa6fb84057b8a7ad37eff06ee446911a385fd8197f1" + }, + { + "address": "KGToyy5gNPmoSxM4hUu4HDYjEVEv7kf7xQ", + "secret": "ad4a60e329f80e0b3ed882b9497f5078f61e15168c92181c4cf6c86142cabfd2", + "public": "036e48c7dd1294354ec1181c1c41f55211c5c27069fa98c2c192c1fb6f1095fc23" + }, + { + "address": "2eVWTrgYXbDZnke76xyAFdFZeRWykNf8SFx", + "secret": "3e2680dc4b231fe0c8f51b8a2c134b1fbde1f03ef8967011c1eac2054f65c741", + "public": "03c40c4d319aecf727e8b79e8b5dd2bba74d2d97d8da3486bf0e7df85458c3e7ab" + }, + { + "address": "EXeNXEayVMot8oAPsa4moaMyZ7ZqTNHdKN", + "secret": "bb4b593aac3b8938757e975b5f2f1ea203d56d4072c53e80f9b605ab35a70d55", + "public": "037a7744437290765a6024781596087b7554387227430c1feb5829879d242e3409" + }, + { + "address": "2Vt7Jv3tRKuTKu3H7eBffotFssGtcmxeUGG", + "secret": "5c6e8086199ecec957180e2bc5ddc894f91cb2ff118f10815358766dd6ce03d7", + "public": "0227df153973f5468a6b601b0aec4bf6c4f50ad3293b705d47fbc767dfe112cfdc" + }, + { + "address": "2anB6NqHTEP4MZ1kBf25m1AoZPaF5HCRNf2", + "secret": "f458a9a6f1345679295b52660daaab2e6c2ddfd9eec96de1309d29b8645de564", + "public": "030651edf0fa34aa2a8bd48f55304c30fa3156636ab22b72978fa2ede9c035238d" + }, + { + "address": "2MR9xtMD2fVReBmXauYAomuaMgjvgnuBzit", + "secret": "97150bc09d496aac364d1e9dd497a082b8671d47c1fa3479f55131bcdbdd9e02", + "public": "02ff32925ac8e230d9652d112b61908ae00ced09d71b9353bfa8eba16c328e772d" + }, + { + "address": "2iRSWoCyw9nNSkcWzV1ntHZDzq4g5d7EjpM", + "secret": "4d60df4c11698ccd0ee61e1df48016f37bf4f2f5bb14518003b1d69b1397bcd5", + "public": "03907ffdf7c2ce2d673625e03967b9bb40b5ecdee8143f92a61bc5f8e46cafeaa1" + }, + { + "address": "Up9XUznLumQuJ6waAJAYCCvFimKkStGJ8", + "secret": "5519a06420ba5c073901876d3b1f11a9fb8b5be9766e0f05c025e525fc0a1ab2", + "public": "022463fb3a5fc5a850c12fa1da8a7c6b23f604a60136600234ea6a5ce7224e0735" + }, + { + "address": "2LQzzLF1wzgXVJGfrJwbj8fbCCKHsYPcpdk", + "secret": "ee48e87aa610c69d99b3257bcc5359730d16e6afc06b9b9a9757c277c0c94c47", + "public": "02da4067d72fe2d00b13d22843fac5d8b6153eed2cbed55810c22416906f7072b0" + }, + { + "address": "LKziTaWPqm1mqcuuFy25uk3nPgjQCeKpG9", + "secret": "6222fdf0802f55ca91e656fe74408245aa477486acc16a1dff9bec220f26c3c1", + "public": "023298ce81f51ba19e8b93442cdebb4d34c5d25e82ed9cf89da090a6919bac92a4" + }, + { + "address": "2KJ5NEvapzdghqB7b8gVdU9eaYMk5Tgy2Me", + "secret": "6aa4dc4a06ef5063e3ebc083430def90f28cd90a05b13ce4ccbff29661340547", + "public": "0391782a7b3a5d8d2b34f7d2d0220a8471c1bf049ec51ea87712ba8f24a735f0fc" + }, + { + "address": "wteD4LYHyxZSBfnaik89dbELxBWoQubkB7", + "secret": "03f083aced4af42b6aab54b7aa648825fbee5fe9b5b6c61535e9f6017142e256", + "public": "027c3406cfff5e4af70371660b31bc6cacca686299f24eb69becbdf30c991c8510" + }, + { + "address": "2L1CsK1CdeAG7tkwa27y5QVkHPLxzizcdTC", + "secret": "c92dbefc11b3067762d632b5c0dfb335de6503ec5611599a98021ffccc72f3e4", + "public": "03910aaf182abbfb2cab0b137c90c2069451858ba4178f8e3b37ef395514581943" + }, + { + "address": "2Hba4NtNTJNhCPbbPTgiXNf7zGiuN22WDhC", + "secret": "9ee66eee2ed4f0025c5f83e6042eebe189eaa46bfe6f6670bc0b32400cc46e98", + "public": "03fac3efccaad9eb1302982d97e76d0b675752e98f37d7b6bbf7a014bfa373a292" + }, + { + "address": "Fct5xp4TiAfoVj53FsVgz2Xvfu3VoSoGwh", + "secret": "68533cfb6e102c1218d07c468bc0111e378ee524438c7493f0c6599280885cff", + "public": "034f00bfef452bdbdcdd0c55cf0e328acd67c9769dff7c8097f968734598c512d9" + }, + { + "address": "22n8VjKLqCBWMBrsmorJL4LwN3tezm5gEmS", + "secret": "4412597ea62ba47aa723023684be9f579628c79c40df98b139400304c4b32429", + "public": "037334c374d9ab761d5d9b738b07a48434444156f3fe293f222ee621615a008cd0" + }, + { + "address": "ZpBxiDKig7YMP4kpb26aGHyL2smaebcEHr", + "secret": "d941ba613cdc2b87609c336d2063bf612e540875a4dc904ea4e63d9db4210650", + "public": "036c7bc521bf8a4700a2629a0643dcd1d157959284aed13b74339a0006357838df" + }, + { + "address": "2P6fGBjKESXhkpCPmij9e6A1NerU2ryy3xV", + "secret": "5a6082c021c71535cacc07a5df04fc0e8a6eacebbdbd454ebeec87be95309c7f", + "public": "03c981d0bc997b4ab838a0f2009fa4e3211b2073b4b15a12a711ded2895bd69f9d" + }, + { + "address": "gByzB6sPJ7RmVpk1md1sXm6HLGKU8knjWi", + "secret": "e4f6298b83374823d72aa3796d7a4054a669c377090f61d1a11521390ce56745", + "public": "0227e1fd95615063c435c4f9ebe82c2d5dea86491c8b412d60b56a7e48bfbd9a4a" + }, + { + "address": "CwbKzRpBo1KMi4hrBBhQpfRbYqp4V8Zbf4", + "secret": "688f61a4f695771ec1bc1329c86d057b551cf5aff926b184be538846483028ce", + "public": "03407a7bf3e89de64044ff4d28d289a54651c3320edf98640dfa479501b5c67de3" + }, + { + "address": "HvvEsysCjqffVAu4YWubvfv5yYYzf57Vnw", + "secret": "08b6180067c0e32854776a2b70c226abc9bccbb9c03b718ebfe625563d139d4a", + "public": "03015c8f13f0029cd5f666211955f1a1208735844256cf32ca32486853175c2abb" + }, + { + "address": "nVyEuvxiTYTzN6QqcmRj9wU17fHMa4VJta", + "secret": "98bb4aea9cdc25f26e9ea16f0c17f171fc2b52645c25c72ebc02e2be0b561b86", + "public": "03b557c6cdb5bf376a38d06f53450b3fd5a9925e73f1c3ce03daf7702f98040621" + }, + { + "address": "2Swcj8nQBcNTtpExUnDLxhfYuvgo1ZPzX2N", + "secret": "c3f23a6efd8d79499b054bf933460d843aa62ff66dfdaf69306ad92ceb0b63f8", + "public": "0256bee55434ce76ae429e74b63cf7c3c7961bb1c702203200f08ab063f1f895dc" + }, + { + "address": "fYMS9Gw91GaQcUNS8yCSVR8aWXC7RCJ79H", + "secret": "64ef7e0063f803ec119a6afc327c4a4df9d196ecec2deac3e4c64b418a72fb79", + "public": "02ac29f3444911103ce467990640372b23c2f1a98e8495e193ac576686eeee6948" + }, + { + "address": "AsNPg1CrLTFKNa1vviV5HkMJSZ38NXvVev", + "secret": "68d3bec66658ca2f4723d3c514a3ff65cab561e75e694204849b5c1b4733def2", + "public": "03c8d03e195092d202c6f75bd17c26d30c9841df9266a450e5a153bbb85951c2a8" + }, + { + "address": "uomhwkEj2mEc9JNvZTFpufDuxpornqcLr4", + "secret": "b0b2c25646387fad2336a3abd66d20fc7fd261b5a776e4e510e46975d5678034", + "public": "02047af97b315e20bb41c74427bf67feb838eca34bd82d8a1a78631c6450409a36" + }, + { + "address": "288trEspbRwW1NXhMUG6zSMmn1z1Yupss7K", + "secret": "248d74d293a4689cb6a0160b4d3368b4ed8dd7a850587b3b23d069ea1e61039b", + "public": "03b65684d345fb8b319d50f4cffb672e9fd2ef99cbabf8ed13db898a1b40c2eb54" + }, + { + "address": "mC5F53X8PeJTqw8C8oAmbG6AcYA7zHTpWv", + "secret": "f88ee9fd93b3ef3bbc3e0abc31c0e14132079f91877bf27fc45fc612a11c8d04", + "public": "02ffacc6e508e69889db4b3df93b5c04f9ee20655bca13c0c76ae7d442d9a824a2" + }, + { + "address": "2N9TR5jDQWfSPvf2UTneWTTPzAzGixTUbxt", + "secret": "4e8e791dd29ea7842d682b42a7e1236be9c787706dd5f130de9b2262f4aac59b", + "public": "03e1288e0f91cc983220bbde8a8eedcf82e0727670fe746d54ccad7aad336919ee" + }, + { + "address": "xQZoBgh6s3YEkaWxJcBJJj1caCqEr3qs18", + "secret": "09e91887df03369c64df32b6c05c19d4eab03760c6949586173b8df7f55e5528", + "public": "026e4ee5352bd39ed09ccc6b4f1f6893b450b6c554680277af3127d66925aa29ff" + }, + { + "address": "o1DeUpx1vAjsgz6xwdHQmjpVPsmaeArGYy", + "secret": "eb76ba401eb1ce6f42a8a9b24766f98add7e717c96197b79806c5ae08c7fc36f", + "public": "03a5931787aa1f2e1bc5f03c160b1e72c42f00cc8ed5a6f78181ae26cf016699f4" + }, + { + "address": "26uyax1suGxdRZ7gJUjFKH3t8ptAnB3f1Ab", + "secret": "42b0c6d8afdc6c266e6afd7feec00f6fbc4298bf4b3e63e2c20a29c736b7ee3e", + "public": "02be4b56afdba2426151e542100fdb523271e8d0ca4fff3dde46a5ef90a2010bed" + }, + { + "address": "2GYqEYdWH4wd3aeCxWnAXAVBvfMiYL1rRpk", + "secret": "8662f1b8d3ca64d2eb00eebe3e245e99054d4bcb67d8bf7aad5f928516885e09", + "public": "0307c321ea95fd65d2e6b3985155d0d9899b6818bd7892347ffe8c261862da2b23" + }, + { + "address": "Xp5R1dYx4haxYjmZDpjBTUaGAqYTU6jRtP", + "secret": "f5c6a132ec483f08b48d7965fa5c034a26247f1e55d77e6dc4ebccc781902680", + "public": "03245b41ed7ac350d9993fa89a6afddaf52d61244229a8b89c653af757054b9516" + }, + { + "address": "ZLwQzFUw75sbsMWTLS8H9jA2m3czji6hop", + "secret": "1f05950172c640ab56ec5752c11139569f7c76736f00b94b397cad2c4f4977c8", + "public": "03b8b5bc8dd2c640e69c5f88c98f6ac0bed85f8119409147e7638b80c3931a2313" + }, + { + "address": "mLP32Fyc39JZxnvp2ZsEDK2xVKUv4YSQ49", + "secret": "8d74584cca5c9941d4306ed7061a4d5632546d22635f0aaf54fabf4081078c10", + "public": "03bca03957963890c237254b7a6293d398df43f275d1705d9d2ee81dcad889163e" + }, + { + "address": "9H2rHSAsnEPey7Q9reVfQjFcn6HeuA6nZU", + "secret": "f57f5c41a54b051c24195e9fda9e17c69ada46354ad0e100358db1153c15219c", + "public": "0294cac47535ba46b16380074e5a20b2e106eda46ef58d8588b34ffdda2b649753" + }, + { + "address": "RWeWyPo5jMW3RTQZhi4umoomc26asiQg71", + "secret": "3dcce71b3d62e7e9d60a8b0a7e7db415d2f29dabbbf9a90d9e4d028f5a2526d5", + "public": "0255f81c8260bb65c55b53ad5fcacfe14542dbb1478230bfc465f74d35f63d2ef7" + }, + { + "address": "489PcrGj1QQtFvdnrLYpabE99gVhK7CZDb", + "secret": "25e23bc3379bb160ee17faeb169d5b10e378cd4ff0c241ea47639d5ca5e3393b", + "public": "02351b30079c2adcc588fd1c50a68ca4c6b217129f0605f35057668eaf8528563b" + }, + { + "address": "fvAjpa6JpTXEEbuDLVd7fbaxyRpS97a35S", + "secret": "52724a60664d7b0d1b3f463324910c2b1924450be5b05e8d7a2db4bc53d453eb", + "public": "0209f0eb2cf37d24b74f01d385e77200d75e5ee67b2977c578443c8310fb9b2d7a" + }, + { + "address": "ZCV1g67KVwHfSGNfafFSSQBUHYeERkPNas", + "secret": "d6a7110de3a1ad13e9c01390c665810a596d8c6d1d4941532b32260b6defe285", + "public": "03b765ba10a5e030c8da62982214f549120fe18358f18f60855325939adad24c4e" + }, + { + "address": "2UQ9bjUN8YBtaLZrXFoFgdEz6H3PqfQRPnJ", + "secret": "8312de52989274e63b461bcd89cf9341b8014d3324892b8424146f3538e2ee27", + "public": "0318382d608f7da849b65e058db3afa32136f3b893f90b678001f0241a196ab325" + }, + { + "address": "2MdhNzpmAJxHnHBqsGmvSJVLzVYmMiX2qVq", + "secret": "fe3cd4f2731045ae184501ce477eb7745300158369ee44c3fdf5a87a2d5b8952", + "public": "039c452532ea6ca6af3eb68772172d42778c090cd199ba3e7009c06b0cb6c51b1f" + }, + { + "address": "816Gwzyu248U21D6f46r75pnVuv3AtHWrF", + "secret": "a71958850157ca5af9430ac1f7150f12970a3e5cc49f2b2f0b250f7262ee657e", + "public": "023385b52bd7cb2b0e5a749b59f1402237ddc355258a36011e03b860679e4b2728" + }, + { + "address": "NKYP3ZvpAa6ad2SvENi6T5HKwHeLbrVYT4", + "secret": "01ca13b25a13f4fc7d4712b11861bba3d213e4ccb65d06e0572cdc7d14ce15a6", + "public": "02b313de4985803a1d054804fba3e723f88e64c6a2ec7fbe44303d1c4652c98c3c" + }, + { + "address": "2VjJfmxYideGu2ypmZJfLJZhVv3yxYED7of", + "secret": "f58e7c75269761d1cbd1c9c034afb754434f05f327e291ba96ca8ed727caa66e", + "public": "02be84a327e37a6d8267bc626c38bed05d2950e2ca1e4349905704f7f5c404ebeb" + }, + { + "address": "eAPpk64h74tsYepanFtSFzPzr82B2avcDT", + "secret": "7a0d7756af1ceb796d4aa202b10dd626bae3b530b714a3c90e075a2f0e301ab1", + "public": "0280324942ed3da9244cc0fec7fc32240792529d313e565c5f7cc8fb3dd38f453e" + }, + { + "address": "dT9rzRU52tZEUGohPpibWgGwZHSe7H5xjG", + "secret": "39b16997962b2a8749203fc137aaa5bc3ed17f0202f6e7965a60c2dd7302f4b2", + "public": "02c35a4dc1a33451a49ff10a38cf2e040054d775df92749f98c220d9665de0d3b4" + }, + { + "address": "2NJ6w1Q7oKUnLPZ4rkdFqxoSXSh7jPdkPMg", + "secret": "cfb00a95d0bfbb4a1f2f5fbaab246b537ce130006f503dd3ed6108cb2f6fc25e", + "public": "03628ab3111affac3e804cca531c6392f25cb9accad0bc3439bc3fa3396c075756" + }, + { + "address": "sdrAWYjVrewkKMcpmxvcfS8NpFVoz8mQta", + "secret": "122f3a66ae026891431a535ecd4a7ce87b766b36ee06cc982bae63d55b48840d", + "public": "03856a4861a9d5d1d0dcbce11fccfd15b14e621965577d7f84ad44a008a3a82488" + }, + { + "address": "AtpEoDv9QzZ1msqRpS67AfKmNUYMdZqtWR", + "secret": "ad22f66b3f09fe8150b318dc2bf070c0e994a7a303eea67e5c784dc91cf93781", + "public": "03c43d4d1115804698e7f1e154b93537c91a61e579044682385b38abf606fc13f3" + }, + { + "address": "2RJsEraWYadfeoBhfJrBrvidi3u9VxTYpow", + "secret": "828c57ebac860ef0f55510655de61e642aa329bd0ef90a0a407ad88a4cdb6c2f", + "public": "0200ba05a1798468845e97875530a31317ed9a428393f972f4f0bad6786cb77d77" + }, + { + "address": "8hjVBQTV9x3eL7MRXgqV9UM64rYur64iJt", + "secret": "202190f9d8a5adbc1ba486df7f076fba0338440a97595a88c49c870e4f1cc39b", + "public": "02d25d29264dab7b03d48aa58091d249de7ce2ccad2db54bf18949bf19b2c9eb05" + }, + { + "address": "PEq6dSumPciu9yo98jMQdHQ8msF2JbfnXc", + "secret": "fb4a81bfb954ec7bdc5f6c6ccb2bc18d00428be1a64ad095154939ea8d945449", + "public": "02fc4697cb9d1a8c364b685342894127d162ef5d7a3b7b9b26a0d9931247a4d549" + }, + { + "address": "2VV5BMupLapDN23JrhZu1rbS97zcYBbqkgU", + "secret": "6970bfcd764f98f6095604f78a59ede3b079fdc7b9b369c28617405def807d85", + "public": "02a25a01476d6ea82a58c4022a8b5a379f4257a1aed8bee8968cbf3c162c84a16d" + }, + { + "address": "QcQpkqG2fRxcQsirLKHGJ2sYs5HTYrf7v9", + "secret": "1aa78e544b013fba58e38ae786767d93384cd75e02f3d4d059fcd0a099e34ae5", + "public": "0310f3a6b1152884ecc8d16417f0b9de900d86c29707538900f1fed76a8388af64" + }, + { + "address": "GEir5to36spsZ5uzSTck3pdLCFG2Tuq1p8", + "secret": "f48ba7c9a2b190d50b093a4bda6b0979dd4110cfd7fb3405c965805aebe44b67", + "public": "02c20825470a7658c012e38b3901631f41d4371b0048653f62975cfb0fbdd2c867" + }, + { + "address": "8KM9nD2XJTrSSff2vfuFYVvZcGbLj8eA7u", + "secret": "f274cd6a8279bab87069888a3d1dbf029ff46be4fd2e57d1a2fc82643a99878e", + "public": "0234e5b6d95fe79d493d0ecec613e9e0f0bc738c36ba1b77addf4b1f2fa6b71c67" + }, + { + "address": "2XaPonNm8z6upuKv5xtQpd7WmeRKTPUuoKH", + "secret": "b866d4cac48a0670f498e9b4c10edbc27560db7fb0701e4ff87a13f6e24f9f19", + "public": "0321c3fb78a69728088f6b7316e03795bc487b41ba87a5cb92c3be85377ae95871" + }, + { + "address": "iN2qYbja7wU1Gp2JnoMUH5QiSammUC7baZ", + "secret": "588ceb37fe6370051d4cdabce2bf19035fd8ad9e8dfd334322d43fc2e16acae0", + "public": "02e3132cdd81d56c6628cd5d851cea5930f0f53e5ffc6a5e35d87a9f85186d823a" + }, + { + "address": "GbTRDoRiK7FrTca2MVEbQ9r9TK9PGqLhLX", + "secret": "89898c1b41e26fcd6a41e97c27f560f5db50c92e6830377379d84d767e6b6a3c", + "public": "03bfb7365227b03415f2f4e56821a7ad1baeae87b7c35b3e4bd393e7ff5218c392" + }, + { + "address": "SnfWDBRmDkshVcSgLfw5cYoAgmKVFygyS", + "secret": "26030f3717e988f6739b27292401aaf8f9f7731c016fa1f5e1a7af384f22db2e", + "public": "03c754deb4f25d2d81cba3b6f0bdfa68907a37d9d87b7f5127f477cf3b1446d567" + }, + { + "address": "3SLNRTzvWE2qxPJH3zJdFZmZSNu2gnpXwr", + "secret": "bf33312864090d552a1f1c17435fab813d9dcfc5000f9b2a7aa693355856fef0", + "public": "02f684e4edc5d1dfeb37a770e08e57dd6a49cd8bda524631b7b208d6523c29b0ba" + }, + { + "address": "rsnD7sxaPfXqbqYXPggvLnWYQ9FTTERHYA", + "secret": "aae8981a907d7e0e5bd0baf1919f8dc663504a215223c3ed57cf70c823a3cacd", + "public": "03d18f871b16e48337b99fa6d9cee89212e53bb26eae9d73017ec796a09480fe64" + }, + { + "address": "2Ni5D2DznHv38gyn6E5Hc8mqBkrMQ1VfKq3", + "secret": "7673157ecbf104fec8687bebc5d8ad81dd5e93a0a8b92bbfcbee246dc7d3c7ef", + "public": "02bac8f5f1120987cb3fd7ffd4958cdc50e3906ffdd6062fd9ef4b96c7ff769970" + }, + { + "address": "2bso1AeKwYVDgZuiN8XLjNKx3xBHMm7M7xo", + "secret": "c41954726c0d4369932006758b39f1afdded0d309ff99d8c1772f993570f267f", + "public": "039c3f264f985f26dd31cff7b0830c2bcc58ce13f54c191fce6d45fb827500ae83" + }, + { + "address": "2kooXVM5k6vn4y4jJcmgCJPnoqB4ydkTtUo", + "secret": "4db9d88541c0efd0cdb9fa3acbb3b6e0ab3db4010a59aa78dd1488ad8c28ed14", + "public": "03bed7e9a58022dd6b2727439e1993b03088a61f2518a78436e4208efa19c4883e" + }, + { + "address": "2QiJF7CCM1tf6ESVHzrJbVckHcehKtGKAXP", + "secret": "d530371a1e54014249b716d0f58ea68ca94a8c29cc2c77766032f9ee7675d076", + "public": "021bec8c0d092baf315dc4f51bb6a74ab276f3366a7f5a9aa72da8531b6dfdc93a" + }, + { + "address": "2ZFwFc7gPebsz3329NMpZPdrbSdTCvioRjn", + "secret": "7bae0524fb5739792d1ca70ff661eee59d193113d2959308472efad7f745abc0", + "public": "02a497a0c6534627babf9ac0c9613702bf0774e3c663faa3a173daa489cfe9c032" + }, + { + "address": "2crTgsFrcHwrx96qTgNd5v2eZRhDSGwD9KU", + "secret": "0144fa3a146902f05d05ce1ea93d7f9f7740cd9515463541234b035ac7c13c10", + "public": "02a749c44375ac2f409ccade010712fc0b7108faedc9066e52656df90713407c1f" + }, + { + "address": "WTGdQJWnTZJy8BheAdohn9bDj1S1CJbcMK", + "secret": "320fff3d17aee027ab0a021d62984dc71e20e2a313d550d6bc71a7037da76ad4", + "public": "030b6ffda04d9048c4bcc32a2746f994eefde6b4a1707b5b2f4148503115227cbc" + }, + { + "address": "28JuPfNb5KQcTbMZorM5ffH5Z6dnqYoH5rs", + "secret": "5bf42214cfb2fb2b370dde6c400b89659c5b10d82623d5fb37051082be4dbc69", + "public": "03f727682db76736b93347b8f31414520db4fbfa8de36864ec33a5e397ced943de" + }, + { + "address": "2jYZCimvDikD1etTuiwNVkYdDVYoRkW5ajL", + "secret": "05140478b6c6839636564892946b45df6b3019681672f9b104c86ccfad644f1e", + "public": "02b04c95e8face2cb50c64526ca0d7c804811e4ca45ccd34ccc954d86692a39537" + }, + { + "address": "2Ws2CbP8zi2rmDoTV5wxXHYiBSgC4FcFbDH", + "secret": "2bd204df49886647bad2806269730ca62d071fc446f42881cd2b4f1fcc98d00a", + "public": "022aa6887280a4006676f44589b4b74a0e8358b627e797964f4d9ac466b35cf42d" + }, + { + "address": "eZLF5WNWovZ5N4KC8vZtS38K2A4u4BQs7w", + "secret": "e7a78096dcea1a150b559775f643908650d1eac4bcca20de411a2764790ab1f5", + "public": "03ee354b340b4a723fdcb1ba2c11331bda62c40fd1c0f0cc52c5f876c66c95ff58" + }, + { + "address": "fadbXiZAhdLmL4DPDPFYGyqsZJxhDGrBnv", + "secret": "c05043fe99c3315c8354326c6a7e38410372f2b27f68eab88e74d6f73f170993", + "public": "02a96ee70543de38766532aa7d58eb3d36ec7846ff57f3ac251e2522ff072cf046" + }, + { + "address": "dmEhj2EdVXyP6gTmNVwAv9cg1jsHNFR9kG", + "secret": "a09c86ebcaff266c7213d42a8fa98c1ffbbe12b91559a0d0b6a7936b3e16503f", + "public": "039dbf5a286018aa46bb4714984cdce0ae4eee0f35803495ca595b69adc5e07769" + }, + { + "address": "6MyEQAeTLFjYYxG52FPgpNrHDasYFrjXgy", + "secret": "7a37469469c1063b3ec2ff3504df6e7a6a91aa1055a998dcc11e2781168b3797", + "public": "02980f6dc6efc5b1a259b1c588fb27b9c01ce6c366da9dacba815616351d62afc6" + }, + { + "address": "2Qh8ycrQGRuDaTmqjtJ6GQQCjL5KRCpAE7L", + "secret": "53c278e573892656e5ebc94420ad4f4460f368c2c9ea6a89b3534414d5cd8635", + "public": "021543e5108cd46d6038eb2f2274c59cc2670ac395b73611b0f381734f2acf6641" + }, + { + "address": "2aceT88Aq7FHfqxo2aBoiyDDw7rB57QsWtn", + "secret": "d30bc636046b7fd619fa64d056c7bcae6d183b1e64e003ce9a358bd9be3ef3bc", + "public": "02f7c3b95e046785f21c280ead0a1eb3db86e87ba56a95671d1c44b5f72e93cb32" + }, + { + "address": "4Smrr2YzK2W52cxZxiCLoJhgPi81mSSZ2U", + "secret": "0641dcb8d208b0012909b8e7705ec077fd485e43778e4b8dbcaef8eb925c42cc", + "public": "023143e54417d2df738825c2d521e283ba6b2ef611b3d53bb4fa0ec09ca33671f7" + }, + { + "address": "2b7YVEDW5WkLzrqfoZrkxzhuESHEwHF3xph", + "secret": "77ebcdd32c08a25ff00b56603fbacb18d44eb869107e1b0a5b34f85bdcbb1672", + "public": "033c0e22d985b797c944acb9d176ff51200446aeed5a31cbd452b8aaa3f0364e1c" + }, + { + "address": "JaR22JZKMWEBSPNFiDKKCM8gatkWo9LVrJ", + "secret": "e31e98a9043ecbb6ffa15fd480e0f1f169d86ffc440a56581f2cb994b887f71f", + "public": "02d604d042b35e8882515b5bb6d3c3a8f66b0fc816fa6dac3b88aa97ea9a8c8442" + }, + { + "address": "2j5pAjhg9yPyLuzBJnG6jPFq8Moi58Db1Fy", + "secret": "7ca8e3dec55937eb12e1abce3ae262ae1ecba643c69d4268c0b39b7c38e902f8", + "public": "0321f9d1f269d36138604eb84dc1087ac7b06e3bd0511a1f1128c089fc6b61dcb2" + }, + { + "address": "25PWupb7kLuFdM3UQK8tvcT98h7i5UDHkXT", + "secret": "15c148fca7434a18c484b539830abfd9ee169d39c3bf95e13cec5877ae5137bc", + "public": "023ba5a705ac79594261ebe524de80c022dfd42bda9094e8a4fa69889e6ccfcac2" + }, + { + "address": "2LWHyVRV3AEtYLvN6TwUzbFE7g2ccmhTVEm", + "secret": "3bd05a85518a0596564796356e6ef267e99e8de6aa529a0bb70a992dfbd1abfe", + "public": "023f07f1368ace33dab9fdf039e05137b8df01ac5864723a8e913d7c74eed72c3a" + }, + { + "address": "2mJ7HbAJiYmNahgLpCSmxWg8HbAx15XPkzy", + "secret": "4929beb2e5e57a9a5f1679b3a60bd6d20dbcd7b2a2527dd55f036d6e0a0eede7", + "public": "03ecbda83c01407aaf4f4856865fdbf082c12884a82e787ec0ce3d9c02bd6fa565" + }, + { + "address": "rVg9n43dSffZoVYdPyhpNemNbHDcZcnFnh", + "secret": "c564ddbf95b83a7806655aed2277f7aab9b7fb14bb106baa03f497dbf3d7882f", + "public": "03972a262ab0052092640c9ab72b82617883a49b58df548f00b627286dd658efea" + }, + { + "address": "BvURWh8mAbBBqpqN6YcaVMo4xaqABPkjAK", + "secret": "53f6d7e20bab00854fe7cb1671eac9ce35f997ccef7a5c68088a60709ba3598a", + "public": "02b92fba69673ce455c828a6eb473a185a3b5739fd928bbdf0e017c85bf973a084" + }, + { + "address": "298GYxeyvXBFpA9b32nf838vHz2L5bGQoKs", + "secret": "e30820c25276c84d31b3048597f19f42b3eb204572d8d275c8f5f76788c9d3f5", + "public": "0278dc9c5578ed235bf491b5ce0fb47afcb1a1a57f73db7cc9f303055a124ba7e9" + }, + { + "address": "nRJwAXzpr766ne9BbdgX4wtf3vCkb6FFe", + "secret": "70ca6ef64244fd4f00651ed245f1f87390320b79ef721bdb6d87c14b52693c6e", + "public": "0362e369ee21ff7d59208212a8b9b696c617dda85821e4ef42194aa96c3581549c" + }, + { + "address": "TCXZMKsbdqy5yMnkuWgpVA5h8rZdK6odrS", + "secret": "6d5b53a3cd6e1b4b6cdfc44989627c71d5fe406dda8043eee286e40d4691890e", + "public": "037a95a70a38f2371799bc3cf2f329986d6f64bcad8455b93ec368c619696df252" + }, + { + "address": "yUMbbPX3JyD4oSA6L9cYDiEHpRqM5DZzEK", + "secret": "ac9c752c92b9fab9859f41d4df2799ba3083c0d0261557d1563ce10ba2c14763", + "public": "027c5e3452c791d2d21e9a11f2362fc86258ea4470d3271422cfea29aa18d65e0d" + }, + { + "address": "22LAVaqjZaQk66dw8thM5eN9883pfwxF7ve", + "secret": "1da6d30d4fed6353c051770fa8df8bb25073d2a65c83be50516c7ece3407b698", + "public": "0333620b3e2078bcd027a76ffe66baa972baea3b1eefe02ed76b9a17ccc7d995b1" + }, + { + "address": "Gn9QCBzKVxHHh8SGb66wpu84BZuCw7PHbm", + "secret": "16b00b79e3747c8e166120fe366546c32799aee2bab5ad442227b5c2173dc94f", + "public": "024726f46895b7ac02795bd5bea795ba7a51dc2ffd53a90c840c73657b25680c63" + }, + { + "address": "2kT2ZUiL7vzt446hY8Xc2Nx2ohGzcFjtZwM", + "secret": "f0daf3cfa005eb279b7244beb2ea779ac76b1ea77045cf00c7379b75aad4805a", + "public": "03a8f0fef09af25c1f30e8267af7759b02942875d12e265a3896e7ef6399cf43af" + }, + { + "address": "2g7bpFrHiyyZhjFr8NNLoVoEL1HLcGyfXFP", + "secret": "42e7c043b5bad590914cabd9da1c64fd95ba0e3618cf217c9e56e2cda849a1dd", + "public": "03d315900f1fa2b0363971f66067cb95b5e062799542417861acce3905ef009924" + }, + { + "address": "2aFx6zgr764yaew5kBJL83xKvJXtaFYrNe5", + "secret": "609ef2d18c07a72423ae24c2c0de839b900dd660106a4d2352606be503ab887f", + "public": "03070b88d231d49d34e46cf719e47fb0abd2d9b9db9dd571931cd0e33e9a21f251" + }, + { + "address": "2axw8SpzvpY6QJze48DubE7SVwhpfEdTt1e", + "secret": "3ae1e46578207468ba3ff0dc9e8670d3e92361eb8e4bdc7f372096a10fdea1fd", + "public": "02bda68d95c5516ec84e5e8ce328f6354a7f3fa1e8e0376b8708d570dc4e7cb551" + }, + { + "address": "y8DV3nCwaDs9PtsQbiZnueVcbqB5FNho3h", + "secret": "c4c7d8f99d6df9127b6ce974e4b5791619b7a6d9230bd7ea494ddd5321c3b02d", + "public": "032da1fe104a466b03731eb9fd85709ee31a91b3eaedbaca165413526ecdd87dd9" + }, + { + "address": "eJHjp2SLL6ZUtYHhfEMNdN3c49k6QU8W1k", + "secret": "fc4c34570ee70911601b48a8881e93c713d9552cb9499c871454b1247619f7f1", + "public": "036cbcc6c350ae878de0382b4d4a998f85490f6ccd288aa37356730eae31e1d3e4" + }, + { + "address": "ZBRYcydEtrkGHYVFRmHQpzVwfDimNC7rfj", + "secret": "2df0754861dd3c563c5c1a3efb75befff40774022fd74835abe23fae37c03f49", + "public": "03f5e7d8028debaee9b5f29b2196c652cc7dbeb05f6dfd2ff19e1a7934febac699" + }, + { + "address": "J2Lu6gP8zXyq6EjayWtV8cDmdi6M73Jn5B", + "secret": "4f82d68560df1e74999982c4087955f02eadadce6502054ec431a2a2958c27d5", + "public": "038494fb1ea6767a31005b3e2018500644fe5f9229d1facc6d3cbd086c1434a120" + }, + { + "address": "kXVPezUrC5jjzS1bcVEUgaXfqqPYpPG3jQ", + "secret": "72b9f75282bcfaf7c3e468f7a090bb3322ea4dceb96449a0e02d25826e242dcb", + "public": "0335224bb5460f92b2afc546fac694cc6af797543dbddc491235fe9469c269b5a8" + }, + { + "address": "sfBsXAZBz5VynyFGyEx1TA1EVA2SNS4Q3S", + "secret": "599c05c64d67fbf675b01219f15e82a4837acdefa30d714a7d9162550604ed51", + "public": "025eef68fc3790f499996747cf941398c8f90f57a47d8ec93cccbea84081b51058" + }, + { + "address": "2Q6guBQ4Mota7bUYx2TD3xwWd9oMRScu8q4", + "secret": "34378458342db0df22be23ec49aa0f0e911900447c6c7f8ee2e69b79d6e9d309", + "public": "029cb1684854b84198bc61cc8fd7f42d39d259912c6f7e65d228bef8846433720f" + }, + { + "address": "9DqzJkWCWK5kCVaqY1cXszUtNdwvNZJSJd", + "secret": "e381d7d02fc85b55ef129e13a10d5e7980bf88ecb631d55a9564085b6955f7cb", + "public": "033005b5aac2fdba5442c2d30adf6bac3bef6989b8f71530c91a28a7fe76908a78" + }, + { + "address": "CitkJhr47JTB2gTQhwcYXBsJrxLiHqixK4", + "secret": "7c776045c28bc10641f50461d4e985d6f28687f01a6635fb52406e2c073837b4", + "public": "0251c6fff14db8af2f982a840921ab6b228bab890ffcb2047ca9999029aa26f068" + }, + { + "address": "vFUe7fcmLXGhF2fKRF8zfWCLUujDEgLVAn", + "secret": "f643dfd7a3fa2b46e5ea2ec8d63e1fa81aa0124f24cec7902b55e8090f354867", + "public": "03cd6e4e5cc5779262e293938773a1fe3537e8bd0da18f8353a002c516a491a364" + }, + { + "address": "bNM3CoJCTquonnV3fGAHSHjkXU4VVXAtnm", + "secret": "b1303503a813b58803536d68466a197b1bb3a101ec9a1bf8fbd2369d49b364db", + "public": "02a1e47b9d9f2438582fb53aeb049c715b7a061ec5f5ff0a4390a27c1c9fb5daee" + }, + { + "address": "2BDGGpDt5TeQqtxJiwCsYfUqSH3RnDaJvrT", + "secret": "62ae0cb5fb989bac7245e194d13deb83bbe7997b316a13b384afaab7d8160c27", + "public": "02285851f4a07f8247d0e718dfc9ba3c0739eb0384025bd1088e5b2fc5075cb544" + }, + { + "address": "WPP7JbSpJbHy13p3tAtSxFgKg15tna37nz", + "secret": "81158f1ca73b5b92e88e35864c2cc32a7e6dc4aa1dc69549b69488be0f939210", + "public": "0399c5c339ea989ac64e6c0b8c46088241e654ea12be19055b0f3602185f59113c" + }, + { + "address": "CLWUkduHRQ3VDqWCtLPu73CWRuyYRcywUh", + "secret": "a2e2f95581ae88117371cbae30bfe82ab85b16ab30ee792c99815515f4b03144", + "public": "021025967d1d2d7cd6bae8259ade3dbec5c5c7340f7cc96ef9faa98a4e8e89356b" + }, + { + "address": "2hsch7LCnK94zgFRBbL6N5nSwHHoZLv55iY", + "secret": "919e0a2d7d8f4ebb28bb9f8f4725433850e5e3d3ec90ba4f2b8bed56b736b095", + "public": "021da1eacfee5cf2ad3c323953c8ee5be4ef8ee23fb2abe88b2cb4114c24402ac1" + }, + { + "address": "GJLtCoZnL4di3kHwvkJtR8CW92iN8Vjmcv", + "secret": "e7102c8e401b2d30627764d44d7233d37ad7f5e83f935499581c4118e7c3e545", + "public": "0297dd6e1b2b55a29022578bcb8f2a97c4ebd1f04e14004c83742948baf15db34a" + }, + { + "address": "dF5jq7t2pMQJbacvfPFbxbiTRYi8dt8Mh2", + "secret": "aa520684df5e3db05607e59f3e1a039348113fa32f844473c5a3b5be8cba448b", + "public": "039230da7d6b4324dbab6315c9268dec4c913e9eb2fc2cc59daf29e2195ba0c0fb" + }, + { + "address": "W1DHb2MP4dfnLYgS7YmTGrwT3jGkyYzTaV", + "secret": "4dc879f1a4d782bfcd3921714deb2371da5df3b2f46537283ccbfe919a21ee3f", + "public": "02a1596f4f937a01189f494ed81fb8354101e1c5f633d34ab6e6b189c99bfd5d95" + }, + { + "address": "14Dzj9AmYcmqHADtmZaiaGAAYPTJF5iu3Q", + "secret": "3179eab44f64ab0e35f3b4842112eb6cbb18ccba16b7668866adcda6ddac4882", + "public": "0395997101d2d8ca8ab15058f8e465d4b87a422ab825aaa8616dc62373f01c81ec" + }, + { + "address": "Qt3q3oPi1HN4v6iPj3EbfaaV9kMU6Qb9hh", + "secret": "ea350bd2044b3a9352393f5169c3881d8146a5577da478c0e2185b56d7e84e59", + "public": "028959d6882142bb5dec9fdd5b4a2c93b2762df2923598e056622b899ed332f062" + }, + { + "address": "2LdwMr8hZ7MeQ6uS5e89Jwq3KjqvWQguXpN", + "secret": "2e145d25d59f1e5314ba3f290a81ccd6d71dfe6b998352688dda120aafeb2b4c", + "public": "02e0a927394aa47473cf544a5ef5a21985d14204adb5e1bea315096f41d5d38307" + }, + { + "address": "6z7d9KEtvBw8q2VZqz7PBSwHaCAYD9SBiz", + "secret": "ec9dc327f748b8a02b7b931d761e41f9406fa1ef637113acfea60a395f07f703", + "public": "03610bf697e09ce02f54c830792678c008542d19fca2e625706fada2eb5012a3a8" + }, + { + "address": "SeECPVtog2nqdBuhCASpu5GFW7kAQ2aWse", + "secret": "45cf169176971687dd96d56d544dd4739b3c3c7b24eef38e2b2eec449259fa09", + "public": "02f2ecfb3e58709626fdc9de870bb11d8a5ada1b5088af73b0d49ee2397ebdadfc" + }, + { + "address": "2RfMB8P2jTG5dLcrLus4CTZZH6mke47G1yF", + "secret": "72082e472815e974af51c5ca2611dbd65be5d498305616aeff0e21845eb2f6fb", + "public": "022736c896b113689d8891ee1dadd6e90a357d25143199202223637127c1c082be" + }, + { + "address": "jsHspZyTeoWLQ5R3GAXPDmMdXiWMos8Lfr", + "secret": "d3b02aa4038b4c0a71588a45d9f75a670c35e28c600cee1d2de7d2a04bdb720f", + "public": "03a2ddc1d41e53f6b73967a1b47a6928be2bd29a3c0729a267d71ef8df83b4a05f" + }, + { + "address": "25CSv2NqfsHSodz2cRueFGwAbdzUiuHHLxb", + "secret": "f556a089f138f59e3000571593b7f9559c1f546b5f9d1f475bcf6768611c9baa", + "public": "0305705d3549479c977fed1227e84c0bb1e349c6fa2374e4f8931c7592f1e980d5" + }, + { + "address": "2SitgCMQcxkiCF9Jf4pACRa5H5z1Y78BQ87", + "secret": "219e289fee89a7afeb2fc1316e8399953bf879f607cbebab264bbe1927cf7527", + "public": "027a4480740e264da975b95df8333c4877180c546e26cd4ef280de97822491b479" + }, + { + "address": "Gr1aAJwLcHgR2bumhPAyS9en2VnRFZz278", + "secret": "9980f094f2582e0810ce8cbf488c44d68ed60f6a45b94d4a5a56f4dd95ee0954", + "public": "02554006809341e915b01dc0e9687efab3f00b274b47bb61febfb2b5898128b95b" + }, + { + "address": "22k2EBqKnNRAbuGRdSCoL9EkrfvocHs2w8j", + "secret": "8382c706a7533cff4bca93e5dd7428eef94df089461c3fb11c9dc9a0ee3b4bd6", + "public": "023f7dc5cbc6164735acf1e0abab395d99a41fb4ed26056be2f7844c31a03c48f4" + }, + { + "address": "N31RqZUYjL4e4VFFR14rtN7DqgrnZwqbC3", + "secret": "2b6c4d56af2d787de889eaad0d97a07f209851a2b6589edf5a1c7a3a4f33e09f", + "public": "0312eccb8c1542b4c5d108538da52ddc5850175df7a7de3b1398155614e792cc7e" + }, + { + "address": "9Pkybqiwz1EmDy2b9L9Nkc88mc6zvPRsWT", + "secret": "1c055ba9e77726033ebfe32237bd425a140110549d82e2311d086bb48af1608c", + "public": "035304c818e2c5c93aa671d150ec763a193064d9cd95d8711254a77c8995e3f52f" + }, + { + "address": "BKvj6kmqdx2j35qJdJ5DPAKjJR8vzLU9q9", + "secret": "30130b623de1c08e1cb7ad95a1dd87a3a321f402b9712229e6ce62b7e1efc501", + "public": "026878a7175b2fc3d0ef5a458079eeb1b63d1a63505ac71fa0667239efb3a348da" + }, + { + "address": "RFR4UhmnBPFZb5sg7zyQrr3Jw4So1u7tmv", + "secret": "bb50fcc6980cdcd78fb3e58dd73b9a0adf6fc4539c7e56b8af9f04437f740b10", + "public": "034aac6f55a6ec5e87ace89ae7823b04ef43851316eb3bf85b52a783cb9f97927a" + }, + { + "address": "2W81p8QoSnMKvTdnBqb91J2aucdtjwVNUFo", + "secret": "b3e1914296ef75748cc4cc7772880186b0ea31afea9f36a92836c3d03d66b28b", + "public": "03d9677912768e36ebab0aecb6849c9e09b161e689521bb93e3cfd5687d5eea42b" + }, + { + "address": "rLjhyJVYUrqpgimkycfCdPfi77GGTerroe", + "secret": "192af09cc5032ee7dc03652c72ef0936efc1a413eb74c3b98acb50ccac9a97a8", + "public": "032eb1861040be977bd41a7ddfb8230e6d9f0ecc53b43dc6bfe3f873455011ac45" + }, + { + "address": "2GahVFLmUyYWycDo9eXvq51ekc32VgxKwRs", + "secret": "536ee03f10031d63eb4c1f4433598dfa587a9edf031c162770eb76ea300b2410", + "public": "02be4a70bcb626976057df5e8a87f2727c6dc6dec80c1a5aa63e14d14a606387ac" + }, + { + "address": "23CNqwuhjigvmeGq1MABeYoTceo6PMFndun", + "secret": "89a4c39206bfe84ee531233692ec4d7da526f15e24fe66b06c0f539920620f87", + "public": "028b954910c22532fc7a3af3b5b3b03460209711c048c19d46e756312c06f6bf44" + }, + { + "address": "2M7tTKyESdcKE66Q4gJpvbDGAxryCM2MfjF", + "secret": "72c021662645cc9b8b2177ad62e0f5211ade182742976a8fbbea55a44c26dba4", + "public": "031bfaf003af08ef951f3ce58096fb09eeb6935b6e3e7e5a230b70c963652f9d40" + }, + { + "address": "2A8vRNeRFyB423goYsfaf2XJfFnwLVBEogG", + "secret": "3f193e4554fd7e6755b017b7db495c2d290351cb65ef3cce34c69e340cfaf177", + "public": "030b4d89c711efc08d9392c4cfa106bc1313c478826453fdcbc115d69866a6d896" + }, + { + "address": "2QRYen7D9tDdLeJD5bXuKfuYKBbo23o4ABo", + "secret": "69da90dc5871fc04146acf8a1e4121de64e55b97e1629cee8d0bba6b464f6a8d", + "public": "0203ffa8dfeb26dda72992ef3d4126c989651cd6279d4e738110296ab9b90b2515" + }, + { + "address": "2SkcSFj97J2BQU5hd4QTm5onBeXiwRsVtmd", + "secret": "3d3e5bbba89085b9f3925abf1a892d4e6be4f459e935e05a71ad04ea88fe6ddc", + "public": "03c1cafc2eae3d0f3b109f942234d1fd83489e040373477dba9e27a801b3bd6588" + }, + { + "address": "fA4ByNSX3amgkeVF3ZFQ44gAsDybhD1urU", + "secret": "68a10f706545aa984a8df888700d822793d8ddf9c1999e329ea6a579bbc33175", + "public": "02cd9aaccfabadcc58ae9612cc034054595a8004401c05b314121a4d83fd966339" + }, + { + "address": "2m6BdfcCCGxbSXELzBjGNnAMxPoej35TLwt", + "secret": "bafb45146ecd2536e463c08c6b3b18534dff04f03d2a2828c889792b83b2b6b7", + "public": "039ae122d8357f4d6053be5d29a3d9ea72926c6c3fe6b586179fb11808e561c0b9" + }, + { + "address": "f9hJHRytfpoEa8B4BpNs8gvT1unMjvTFpf", + "secret": "ed643cc27ce09053207c7b8eacb7ab98cff341217f2d398dc80728ba3dbc319a", + "public": "029e91944afc94461da0b314b75f07e1aca7de0af053329bf9eca191f5e9480471" + }, + { + "address": "26F9aPSV1mHR2wmqWtiY2FdXwiZG6GC1WxZ", + "secret": "5207daceea9d884ed6e35ce719fbb356a33d6a2013e1d1159d021da4cbc4ebf1", + "public": "03d41debc510d99b3be9a3fd290ed44cb6edbd4c94fd6e18cef6faacaf8a931e1f" + }, + { + "address": "62mX2aD2aDNfh5zCrrLAyw5bPPoVtsmsaS", + "secret": "c702c01d2a48e072f21d811535ec30edf8d1940957ec61bca0082e3959f6b2fe", + "public": "03b1daa11a074fee7dda44270d842753c49eb916c19066e85bf5bd0608409060aa" + }, + { + "address": "QroU1WomNFwEpKNooGfSVqJhaPepn82jx7", + "secret": "21e0c30a0af7930ebbab4de7723849b2c712c670d8caa66c7a600c44774b1f30", + "public": "0379bef14165a6c65fc2bd41d11077d25fd4701afffb0e3203422cdc85d0cd2b88" + }, + { + "address": "B2qurPj5Vosgdb3vMF9tNSbzvCwQvZT6Vt", + "secret": "67538ed445290e3552443d4b0b5def55ce9e14127055b89ca1a58a21589896e7", + "public": "0374a42e90a4336a0c7147d624f69070ac3ad046a3c2540fac75d874a518f2ef6e" + }, + { + "address": "rKR2aYWXsKdPe7TfeLCKpC99zZe9KrTjMK", + "secret": "4249267d631619da0bcbb7296779c2c74df42c3a21e7fb0241e9e45ebdf31bef", + "public": "03d0abd9eeb44e08e9e57f2c750657113eca20b16bf0ad63c46834bf526b9c7067" + }, + { + "address": "2fH2mNcRGcwTqUhi6yBhieXGuU45AiR1rSA", + "secret": "c1bbea6cb9ae73181b273c5f5bd7918b4c28d0e3902efe8eefa837a03c8b6f61", + "public": "03289894de48c672ca592a35fd083859bbb1d991d77cfef8d20b0fed1159e80e3b" + }, + { + "address": "61w9ZrrWmSXprKv87Nt4QRVf7vy6xZxx3S", + "secret": "9473ca381c03ece2f1895ca34c58ebd8ecfd6469e486d8e15baff9badbb8798c", + "public": "03095b664426e488732806e0c08b4b7e5cd49a2653c029eee6931b93cb361130e4" + }, + { + "address": "EiRhqw7RKPTSwmkEUzmWTB9anAfxB2u3HT", + "secret": "847acc35d8932f3f0d2e9fbc57557b949be580e93a7228a4e6b8fb154f448208", + "public": "033f3d37b184bac7eccb3fbe9bb6f3fc1416f7234b8670b67b65f8948e8f8fec16" + }, + { + "address": "2SNQebSnRZUyMKRyEZyemuRZWPiiN4iSUSu", + "secret": "b065935a2dc91950e4381a88907ea5bcb081eb9115e88e573c8ee73baa3bdce2", + "public": "030d9f84a7af08f7d8b104113e72e1bf56efa5cf8f9bec50356f442ac71fbcf767" + }, + { + "address": "FuBAryyosutbMmanUFRzJyqwXkwh7kdGEU", + "secret": "0ff066fed0235320963798399f2a8def41aa9700d2f84205f6caa63422ba6dcf", + "public": "0333e807c0be00d228199cb50869176b8d3021e58faf2f3e0403a09bd010216f28" + }, + { + "address": "ovUyGnQCsAFCY4CzfNGPfpBNe4L1yXoPS7", + "secret": "cab4652334411dc9504f420b936d5ac85a6a50c4bc5245cec04e08898ae6a236", + "public": "030ef30e7219e020b9f9e77240fed42739b5b47063373b8e5fa2a4cd19cab80d9c" + }, + { + "address": "z8EFc9WUA6Z4PnWDHC1rcby6mMxR6yq8uj", + "secret": "396b40376a1f66fe79b8050d8c2b7fd72c5442429cea1de9c3e9b7b10b93c36c", + "public": "032194941eefbd5480556832f47fc9495f2dd4daee52153fe4bca687f13e102c54" + }, + { + "address": "2cgrysvL5TgPD3Zo1bQ7atHePjU7pBbi5HM", + "secret": "66dd774702819987b97c150b2baef6ca69d7fa77b474ae6b827b434a4a22190e", + "public": "02e84cfcfbaae65066fc96271c87c2a74f6af8870cd5f90b19003abb2695bceef0" + }, + { + "address": "CBC3XTB4jQeeQiw1K25MBVy665AmN7ndcS", + "secret": "dec7e76355a27ffaaf7d706091b3321a877bff8acd255fda5a34a21819b413c0", + "public": "02c7e48a9e20852a8e25ea0670ac9a320c682d4a2f1602c1ff4b00e00bde283e91" + }, + { + "address": "x8Amv5taKJPoBogmVgNJjtyddz21hYeGzY", + "secret": "a11279a7533f382fe1c4797a35ca4c8e62577de9d32be5002037abb63c917937", + "public": "037d4322a6cedd200aeb6403700b5f723b8a4aea1f922527657572ae7da751dc8f" + }, + { + "address": "2f5JG9tVG1eJsCV6MiSAXXn9z2qLu1WwPBZ", + "secret": "63cb1ce295c72df8d9a5cdf619aaab3f6531a6f8f428fb61676f319f6443b1ba", + "public": "028e3738fa11f56333e6c6319de2acc192d998767100b079dec938c66c33447d10" + }, + { + "address": "2YnwtL7Eax6ALym5ZhtbZc5mVi69SAQa7qW", + "secret": "fabc193d52d4bf936067eadd28c936e7c4bbf5b65bdf904e00cc80e7aad8aec4", + "public": "037e8be0c5076b7b7d9aafcbbeb1deaa872bde340171362dca6a32595c08a71501" + }, + { + "address": "n8VxbBynsNFRjMpjx2PoyCsqCobNd3tTGy", + "secret": "d3b704c0fa85c62df383ef4c5d691920cb56f8a2eb0c676662349f592b2fda35", + "public": "0223c0bdc26f80f6b8689286475a1f6a1462b3f763368c8926681dc212e8a49d37" + }, + { + "address": "2GcfeP65kgZJsQxgjTnAbUDNXUX5pMS6qwA", + "secret": "3084c64edd34f827750497f7ae3c432484bc86ec1ee03c236c83c10c2189100f", + "public": "02cd4aed33c68c2380060d807b2eae38c8460bcb494a68882b3560e5e917808150" + }, + { + "address": "SC23LSoVTHMLfdsy1dZA4ysYzLWYwLe3VW", + "secret": "04c3536aec2531dbab08bd614adfd9839150b82b8f15cb7a7228b04171cf9310", + "public": "0357e08cbc0fae044ee6109394bb70675c05effee3d0bc76c95cd1f3814498dcb2" + }, + { + "address": "2mBQma7LZa74M3WFJCws6dwZKn3YQBMg6rA", + "secret": "aa5e825ace5471708b05f3f50929c180f85e8cc19db9975bc02934a3e0469cd2", + "public": "03474646c2920067a9fe223c1ba7411afe48327370afa1298fdf08b8077d9ee19e" + }, + { + "address": "2FxdQDCLe7c1mhtKGJEnj5sTmcyoEuQwit4", + "secret": "5732ba0920c7688da18a7d2313c982cb4f05de6c8f8cd953b57883c64d19d01f", + "public": "020bd054f35df3619681e88b8f5b1e02d16e92136067ea29d0e944065bc17febe8" + }, + { + "address": "opjMWDaZnfGytaigCzDS1WZcMRCZQEvDSh", + "secret": "960c1024d6b803bb61d729f56edaca88bebd8dd25d611cd90f8c1553d72cc23f", + "public": "02c6ca3390d4ca5b9f9d8ffa81f217438b371505f7943f1b821ccaf267502896c7" + }, + { + "address": "287avDBot4sKcLa6uVHX6CEActGrW5z9W8J", + "secret": "0b7f4c468e9b57a69e7af6887e055ff0bc9b6c0dbd236c738b8d83e515eba25d", + "public": "0297142932f8df1b0e6def85fad14db4f5e99cc34a2bdaf9e1d4d94d5d43ff09b6" + }, + { + "address": "VDkbYkMPHKbXHs3hLyh4XC5ohQVUeyhw91", + "secret": "92e524d5eaeea948e6d5562488d971f0e4dc45d2a5f94dd4af7191bb91b93fb6", + "public": "02a5d4694d6485b3b9bc18e875d04773fd35eb4bd68cfa10bcc6e9348b5c845965" + }, + { + "address": "mAtUfYshMbtEJzjuKYcU2t6T3dZe4y2khb", + "secret": "c553186bcc8b7b6da5dcff3f522153b6a5af4df9e358f028e3fab1b02d7a7dd9", + "public": "039a29f469d54ff46f32bc5f246aa5c3714480304984e3232b723838c4d06dad0a" + }, + { + "address": "2NAdsgf4ZJJt5mFNw8at8hCR5RMQDNzwiwJ", + "secret": "652f9b2e81b4882b0a3ed0acad1870f906c47b741f3264e9437578270a77fd6f", + "public": "0224d49247228129e7e7ac57aa56be2d2a318dc57841975d5d11400ec226101326" + }, + { + "address": "vcGe4piafnmA7HooScfnaPoMeAUzkGV2es", + "secret": "3d36f0ff8d896a4e29ee908c90269ef4da1950f5d43d709d46ebef82b42ec902", + "public": "0232b6196f9a91a97bcef66cefd06ced834b6e57962915762b7f3d93347eb7512a" + }, + { + "address": "TU2RS7a9ZDUuj1X7fTBXhqo9jJpa5wRGEh", + "secret": "3404371d8a927f2b948ad1050a085d8c152051e6ee97aedb77c44ed3f6c0a86b", + "public": "029b1d98a32c56d68abb0c7b74f5508b4b0cbb23ffe2d6c53e7859c8fc047ac16f" + }, + { + "address": "2d7H8CquSYs2nin9jaZ13hGZta5FsStFZo8", + "secret": "5039e52f7321bfa5b97ea5b6bc585df9e54d5e5d1a27758135cc842b65898882", + "public": "03e9ea87ac0e016f2fe8b789bbfa4a941c3cfcfdbadae82c4c5fdb13b5ba7389f7" + }, + { + "address": "AvV5YY5QUnFLLSJMKhu9DsuxxrZt5wpvdQ", + "secret": "a75da19d2e65a262e1a3560376e2d292a741f3a4b679fc3b86a6f342c41f7595", + "public": "03388b89a69105f3fbad86cff7edbbda8c7a6b65f670bd1ea65c1bd29ab8927794" + }, + { + "address": "ZnvGRWPCyM8BVpFWNMwAuNJu3W9Qu4EcjM", + "secret": "b36e756f2985b372c860d9c8ee82d701446a99df55369a09d9245cebffb7f6fc", + "public": "03211ffaccb7fc6be9ec8dfca941bd18a24834ce783071324e7797167966c169dd" + }, + { + "address": "qoVWHHmz3cst7ejrDs5Ak1veNqXvc6bKNs", + "secret": "6d9ba763e4b5ece32546a46271be8024627663f8a05eb90cf7ff10aad43bb0b4", + "public": "03ae2573c7cac526eed1b7ea204d98b57b905ccfa565317562903238d9047318b6" + }, + { + "address": "27WSr8SckJGeSd9wZeuWmEXhkwZagupQBhQ", + "secret": "0eed689ddc8783a2d7405b3c7b727f5e283adf51a79c00633e06f4d7af69ea71", + "public": "03e01b17ede565155704d1d38b169772189c572f3d8daf7217bf10cfdec744f00e" + }, + { + "address": "jfHgeppkfWrLrfLDefT1ubVcX8CZtEHrxd", + "secret": "ac6093af30358cd772157c99144ca77b8b51374d4d42d16ff4c044a79f659d1b", + "public": "0244bb127e905e68ac4f77a02d36f8bd43a180fdfda205c5dde80c216027fe5d3d" + }, + { + "address": "7kUKMbna5G2BnYdRaUNguDcRxZqU4DJE5Y", + "secret": "aeb2ba2cd9a26758c46ff42fdd59fa2e109a57a2a7e0b6a71cd929cfb7d3c734", + "public": "02020ceac637c2e0a627a5b495991925432b2f38b278a39972c6ae3e77b5cf72dd" + }, + { + "address": "uXumjBr72CzvyStXFAcQZ7KyHazCGC7bYF", + "secret": "3e1745a1032a59a4f381389fb0371169a87286a29f9d7697d095b5d65cca2457", + "public": "02da2344d15c5d43d19b9f350b1c725c636004934f087b67b240fb44d674344af7" + }, + { + "address": "2cjZgqBybtHQNio2h1hmb8W1VuNHZ9CiJMo", + "secret": "866bb52ec8c6e51e52120b64bc42277b0123c5d200ea17d20cf365eb0f343087", + "public": "039391283693aa699e839a7ac00962bc23dbb563882d1b5db5774418a5d16093d4" + }, + { + "address": "2KuhVZmuxygrtPKYXygnzWmrJxyth7aHmHo", + "secret": "114e79415b9b6162578bd08983fde25c8708fbc204669e32d244761adf81be6d", + "public": "034f94c72ad911244a5dae6a7d2cafd9e1e88edf87d244fb8478ebfcc607c8b5c0" + }, + { + "address": "9f51KEwdZ2k6fbJKw2No5QcEZfh1FcQT99", + "secret": "e36c8f6818e4f3a759b1f1c22339cb7a1a560bee4b590270ecde2789990280a1", + "public": "02dec657da3437d526c7bec71d91cbe3ebb9993e7cbb69b5844fe8d02c035a29dc" + }, + { + "address": "CUFdMUnVtSmLtXAC5ktYSSywEaQ9uxUivn", + "secret": "f8c15fcb6c56e3d1a5f13b02f3d6f3d751c9f113ec3837ac9ca49986e5c79938", + "public": "032e56e60227fdc1c4e7100e1a5bb8853c102efd072f7e3d3b255d98da7645e7ff" + }, + { + "address": "2QVfVHQ7c81vSHQjXwjfueUxmycPXeSoh8p", + "secret": "dd71cbe703a2aafbd6e4e9e33d5dd9845d432ca8c16dd0076330cd2aad1ea18a", + "public": "029f3682ffb06648d5ccae4e579920840a162e884cf18ea1c76f7861038d41c715" + }, + { + "address": "2aT8vQA3MncGyw2XfhqisJUuTeL8gt67r7N", + "secret": "6f4002a5258fd36acfca3ffca8f46148788346ba97e290ce1580e3f0e40a67ed", + "public": "039ca89216842186b5d4c3d8824d9a62aa7e6a7258c51fbbde2b7582c6ab3cfd61" + }, + { + "address": "2LjJYUvxEeiuSHdmqa6WriCcrVMUgbYsC4g", + "secret": "9d5b1907abaf169e86622e520f46530b15016a3c56e6473980783eb9e7e3bb1f", + "public": "03d47c7a4ba64efd5ceec1d90370dcb79c4a5792334f2a8fb3f816ab3de0aba6f3" + }, + { + "address": "H8WyRMJiyuttgg7raK3MHvuaP1sYYVt2GR", + "secret": "d8d258e9d6ac67a32b2bbdb2fe56c753a3d4b2c45370c2081f539c87119db3e8", + "public": "0237505507f545ffb6e5762d3ee5ba7b2dbe03e1cb0b73454538331009dbb06474" + }, + { + "address": "RnvXdAurMy5aeEpGKfanQsphVYXtvPvyws", + "secret": "b3767d3cb4903870b7c40b50d235366e58fb24c7a2e5ac1607ced94126d308e8", + "public": "02cf83f66d10e315d6d84644682cd792e45cbad330704c7fc8951176c301ce6a09" + }, + { + "address": "2EGguQkd9xNM6rz43bQpPH5SUBbyPCypu2Y", + "secret": "544b281008d4de4530b39b3cbfa257b8d6c7df865fadb0f3ff875f0a024f16ad", + "public": "03b2d7195dabc09a3ed2ac92d44436ad57e5150d02be25db571fa2a9db513c72ed" + }, + { + "address": "2Zo7LMedeibm88xHbD6BihxYF9VbxueAsww", + "secret": "10cb3fc3bfe1039921b82dd2be1a036ae7d989ac5f1308441e7cb27bfa999706", + "public": "02b69743fab8f7ef1c5572ed9efded6802054e8668c8372a718a1ed231f376e9eb" + }, + { + "address": "Er7xL49Yz8yTdxTHZ2aWF899fZwuBcN2w9", + "secret": "ee2dd1b1a27c83e12f78fd0eacb66c0b9ee63f71f49f62f2163cacaf24c96724", + "public": "037c596ce52db6b28e1a9080c0e8d0914768e7f7cb4c1b56ae01437602d91c14bf" + }, + { + "address": "Ssu5YEgifibQKpoPKNZmwPVAKEt6gdqXrS", + "secret": "94c8c227b8cef1971f0c88b79742da648da391682eaaaf72639bfc516024ce14", + "public": "03e6aa8cd03076584a0664a1d61609e20ea12e900eba179c7c0f1c935ae90faf52" + }, + { + "address": "6ZEir4GMrZ9dCu3LjF1txAyKxmHP1Z6B64", + "secret": "567c951ab4d83106e0ec0dfcabf84d9d4f553e828a8bf29ba3ebe2c3f2f6a6df", + "public": "026eb292c89a292a5386cf84cc0150b9d246b80e7993b15bdb63ac6ad84ff3ebcb" + }, + { + "address": "uF1CcstJsQwissNWqN6HUzbedUVHeWN919", + "secret": "3063086d76d5cb9e8a6b5fb1cfe9cb962dec10b02f84b52823ef66a29031b883", + "public": "0374369d1129cb7e0ee36c245f1de5cdce492addf44a3121fadc088aeea218b41c" + }, + { + "address": "LumhVq7XrSSzaV6EcGFcNJa2PRhUw4EvRS", + "secret": "b8e85174ad383c1b31cf412e36a8dfc5c7a70be075bb6dbb3f1265c8d45a1716", + "public": "033e763b16e8be84bf728c03a8a842de3e9b668db298e1d7a9a42fcbac397a87b9" + }, + { + "address": "928Epy9MYb3aXiSX3jViUK2quJUHddzm24", + "secret": "3b6bf331929bba2a60117ede5aa6e82be42dcb59fec6dfc8b7d56da04229ac15", + "public": "0247c4215f2b6d5b7e9741b229653aebcb9fd407023ce710dfa8a0dcbd6f2061b8" + }, + { + "address": "x6fedkRZ2f3uAFWYuAhMHbwvezuW4YakrZ", + "secret": "be633fc2e4797327d173ff4129d17b7f00164cdf4e6bcda36575ed50e733f6be", + "public": "03b73a0b399d47ce4790adee1f5b7cab3beaf7d127ce8137d93fd8dd0589e69fb3" + }, + { + "address": "jzij8bbtnsQMJox9mVxE9Wbt2cZji1av1Q", + "secret": "6c5f2687c2a14db0bdd44e293294da17b6c48cf1a245dec3a724a503ac7d2d20", + "public": "03ea4ff6cc2f3bc601adfad608e0558418bf0982b803bd6c61fab1d5f7082504bb" + }, + { + "address": "24JypXuBsutTE9Au31byi6cgYUVfXDa76Yx", + "secret": "caa801e43715a4080604ab1962a74b6985481a4c42377f5c210b969bae817522", + "public": "02fd5562bea861fec333eddd21a49611e9efaab8e593b7f8898614982e414fa537" + }, + { + "address": "sq1oxMdWKu9y1GqYDQzydUsLsnCaSsgFdV", + "secret": "115a9ee9d3a969c4c6777347e3047af13158f6b2feb2f96a207fc2bbbe6b989c", + "public": "0357723a1e36cfc4ca932d05aef4ff571a74dd01d72bb21df6a1df2b6dd6634c06" + }, + { + "address": "XF3MJCJf34rbZ71QSmTWzsc2K1EW5zp11L", + "secret": "a15da09058bb45eee32fd2ea2421f1cd9910e1f822355aada7abaf98ac09820d", + "public": "0296785ce0760c05db6e9f81d1650d5dd71a70fe9881039592e91f3ae1f905cf37" + }, + { + "address": "2MuLPu4CtC8rCaGvVXdaFsvZCGEBSFquKyT", + "secret": "c2d06a485140ef111c0df041d019cf7f5f6f2a57a88f98b4818bcd3471fefbf8", + "public": "02d037fa293b9c13d7332fb57873a5c9ef6fd3faec48e2192073e4cecafa383c7f" + }, + { + "address": "2AjTTLFwqFBTv9B4TqEttxgGxd6qdb6Rc95", + "secret": "00755ec32e300f700b65e584e00d642a7f94b68bac09fa56d9dd52f68367d06c", + "public": "021767b3cb8da064c221e18e5da4aba858c0783253b807cb0e7d3034e2a6971a40" + }, + { + "address": "YVao3N44KWz1gWwFA99SzE4eEWuiNDQa6", + "secret": "5d419baf49e43360a2db92ff445473ae5369a3854274088447f3b8aaa730e4a1", + "public": "02671cc9348c2b37412f7be7f44cfaf887878faa61ba2977d76a341121ec8543f5" + }, + { + "address": "2B6CQHAyf7hXBdujhdth8m3iXeGKoj1cUy5", + "secret": "5ce953dbca541c64186c6cd9be8ea528b4b2e46ca018da86c568eff924bc2950", + "public": "0346f13ae7df82aeacc3f1a0264b7e1d710f09e8464acd68989bd4009d8df44912" + }, + { + "address": "9qNtyuayg8LsLBxwByHFrSo6dMK5okoFVj", + "secret": "22c33cd73e3c93597e7a30e0e2f7263100dff55d1fbb1cbc28862a4adc01e393", + "public": "039f4e4dcdc790708675a86f89ff79ece90e2d2db6963453bb05639cea1277e0e6" + }, + { + "address": "KEaVf8Zwk9erYrwqYg5vLuTWGDZfFZvzH6", + "secret": "52b2e3d1fe43daef1de9ecc03f26d769d2a585e75caf027dcdd8e9a001de559e", + "public": "02e4ef2ea0fe31a8cacff87eb21d60c54bae50e6e69c725c06dae4851853c1f821" + }, + { + "address": "273HzqvvGsbfqN4DzmLXSHwxoQGvr6h2JDa", + "secret": "76ad5b4e12a5ab1a7b8b229bda86214d00a8c96a48d36ea2b10c7407ce385477", + "public": "0251e9738384fe9bd8c9bcdb49db45b37cb817032ad5e972bbc4e62fe221f6537e" + }, + { + "address": "tCmpCM4QEmcW4KmfyGJHCUGtdpwKM95M36", + "secret": "430d620b2194fa6ae143bf501ce4c6afa86cf59deff48e94d4a61aa0eac3af84", + "public": "0336454abd9fcfc96d5b9089939265878f0c192beaab0266792496b3547b999624" + }, + { + "address": "2Nr54S79UTeMQai98FHMbytUvoYpVhhTXSA", + "secret": "302e30106eb4510299016075449887cfe695e7b5bcc64acadd2b9257caaf8307", + "public": "026f54ddb61336452eb33fc82ce2eaa1cb2a1fc463d5061a6437e6a379763d6725" + }, + { + "address": "VETgdwGFKAc417h7jG8AcpDWvVaSvJja3A", + "secret": "ee896d44fd6a6d9a3c5d54843e1d5e2acdfd8f8b94a89e971af11250b7001ab6", + "public": "0321a92b89701a16780e524564a01b8a8c487927f6be5e5d1e8e503c1db8b6656f" + }, + { + "address": "aDooZkbTToo2zhsthv4DLzy4b2sB1hL72y", + "secret": "5036311405ab856a08752b575c77f9689d034804fd88013cd61ab1ef8ecfdc88", + "public": "0332eabe8dd5ad5bf2df2eed4c194a194688f55d559873362e19879486395404fe" + }, + { + "address": "2TeicjTeiN788NHkpLCYXabcViRYRzyHnS4", + "secret": "0d5615b3585c8039e8111839037d5f278761e3e2516ee747b92a8bdfa8a3042d", + "public": "02e46c9b263f06841bb8df6d05edb7f965272cfd7a84c79a7cc34eca522f3d5aa7" + }, + { + "address": "9gAGvw6ALttV6qsCv9yoHn2duKkvawUMT5", + "secret": "4461a0e36f4e178dd98d073e524f6c175c4af13d69e5895ca7d113155b7058b6", + "public": "036d44c748a5f4a0da05e9f08412ac59370fcc1456657c8da02696042b6e549319" + }, + { + "address": "2RymuWexhMxWGqZMK8H7gjcpKHYzJ7KTW3K", + "secret": "fef98b243643886cd6eaeb4b03718b2583e98a5cd335f7aa145888df0e3e62ac", + "public": "0363f7994223cc65f5c344a5418bedd4fc7ec3f153651fe9babff0e387c07cfdb1" + }, + { + "address": "tRzJDgcGujKjFLvhiP29DwCFcSENXwD8NQ", + "secret": "c550510324920ebc38c2b3d8f7207b45c72f53146bbe75297f65fda29adefe70", + "public": "03f1c9b77f74670325f9ed5c9144405e227a4ebc19fa2f71f263197cac542f1090" + }, + { + "address": "4fnAyeKwaaFqhL7KpWVk3dXGjTUKkZMWAE", + "secret": "adefed215155b9c86cf6b529cdaedeecf54813be2a92b7e25cf3607b635def63", + "public": "02b9ee73048d5e1547f6064c8ef19a40e334c239a0d50e2e7742881abccf4834db" + }, + { + "address": "cUg6C5xPeULFUYAi7k5z825UCFktGr8QHg", + "secret": "6ece6dd12c75bbc6147091af4ee1eb6b9ca83daa4c8c74fb857dde9a559ff354", + "public": "03ea642b0f6dfe84807c2be013b697e811b056f38854185c0624e509fb115696b9" + }, + { + "address": "vJVpVYYvDY4mA8kdrtuo8W1A1TeyRqou8y", + "secret": "a1536d32a2a0b53847cfc69a2ac15934c8f4b5d5d3601a7ce683f454c958a9bb", + "public": "031edeb3a15926ab996d39934138f4776c8903cdd2b3373b93464a19352fc0119e" + }, + { + "address": "y8hhvxPjZpinCChM9K2PLDBW4g1av1ZcHE", + "secret": "e29e15da9d8b981d7e511eee9ce4b3320b72eb476a7ea405431b15ebb04e8a9c", + "public": "0220c85610ff73b1eec67c09305d94cf094acdde37396da909de697e6c2a91f9ec" + }, + { + "address": "2mMfN6DGbDSjaUVVkigCvBUvrW2Te1jkWCt", + "secret": "8409735d24e573dd2c8b49f9eed1a4b43a92a0b0538fdb1a3453b012b7862c41", + "public": "0203e0317f62b21015090c038e8402cf9f68e90b4f309f848479290fff989ea77c" + }, + { + "address": "2fZZnSM65DF5XKtnNttaVkNBAEky9GNdoEG", + "secret": "ccc43a9f9b194263c547e8bc7c386513d0aeed9d16747e86ff0be5e70994515b", + "public": "0358b3ce59c1362d05214c30b581fc4571053672e84c4a7bc2a94293f4b3f47c89" + }, + { + "address": "8yh8LN8kFCg3pXqEtzyTKNMwyjNAVDsNVU", + "secret": "38d2135b506023ea860c37fd7b7744daa81e25f170a746cbcd7dc0ecf54e2415", + "public": "02112e98e0e9c524440a36f77cab80a971369f4e21d9e19492481318ccdc081090" + }, + { + "address": "jkFvb3j5YzTCg1LnEKrUGnjbAQmJqFhHuc", + "secret": "be596616d27c8e0396ebefdcb1897829bb39a7710b92f17548ae6812cb367b2e", + "public": "02959ca4a318184bc71c8e7df8636fc4d6cb3704386453967972fcece861df57df" + }, + { + "address": "m7QnzaABKgNqx4ekdVLf5SdWGUxVSFgPHP", + "secret": "d1c9d0827322a843c37fe58d3169d145d5e8477f9714e44ac6575de9f20c5bce", + "public": "022169ceb4f864b4766f7f1c085564f1334a63c6c7611787ea7f80828d9e41671d" + }, + { + "address": "2Db6fRqRY7fkYpdFMp7ik9eSicRHUPcXXuY", + "secret": "1ca5d69c367a4dd6f7ad4b702825e17fe66a2c0a6e219b03f00f4648598b056d", + "public": "0215e7d934e04d7b12385ffbe6e55b4dd539d4bb45b138396c18c5aa9854562896" + }, + { + "address": "6MiD95xbpTiX85WaezBFMx31qHU2Cy8mGb", + "secret": "cc3e2454363c09febf2940941b07477d226af5ab09d598f57818423586ddc3a7", + "public": "025ed910484ad0d8d837475339882248638efa73f1d96b29ee681b8dd1f3e710bf" + }, + { + "address": "2j3PE1Gnw7dimka8tbe2DWM7nadFtKZDRCi", + "secret": "b33249380ad2c5ca60577db005bbf15e24cd260e5dbe06c8da9e877373d79bea", + "public": "02e90a239e782a8dbfbee2aac3d2d729bc45059a80f67ee3d52ce4e24b24a7aeae" + }, + { + "address": "oUmQZvH1kKqfKEhj9EkjPH7mJsDd9PekUH", + "secret": "ed2166711c446df7efe1615619a99ae9f9192cd548f28c2d76e0ef224003ea01", + "public": "03f2707b4ce0ab1664b4ec6ca958e9a6ad53de97687b933b11f36309c3ae9463ec" + }, + { + "address": "P381ZTCxZB7XJgTBnv8Je6YdQj5oRCnWrV", + "secret": "20412f51c1283546151fae13238c8173f71517e839df2399f59d6975d867ba00", + "public": "022fdf6aab50d1c7ba9f07dca660507294c2347e9f0455e9d906a8b76d46232be5" + }, + { + "address": "bvjjm4USaFY153twBg4k11mKKW1SZri7Kr", + "secret": "9ebc684f04adf27593e3d3862042c867d9e7b93a15486d1b910cd3df01d6f5e1", + "public": "03a26dd8d7c5536fa1ba0b8ea88974a1449796bd7a03613c7a8d0386f634d83605" + }, + { + "address": "SjAB5JX8MngBBmZqHAQv6b4xBf8EU6TUdH", + "secret": "ef9391016d560ed1bb76e27712b3eafba14a97d765e3a2c95e4a33c91e3daba7", + "public": "03e7e8262b1b397ef1f5d956b9b4ef46a87670c6e74bb84dd63d649074d6a90d95" + }, + { + "address": "AaowUNsWWGCTSQt8Ubg9t7t66WXgNm8qj6", + "secret": "ce21b58c3a7f7eb5d7c5231a906215a39d13771d903ee07b1bd6ed2175180f68", + "public": "03c5b1e76ad124d9558599a670af3f196aa8380ba2068a3f8fd86b78959553af50" + }, + { + "address": "7M5c2bpc6vChU5LjgSenmEiRxKvFrjdJRm", + "secret": "a9b800fd9e55855e3938b2d81b7ef5f38c3ca48f4ff6f16e2a846bc8924daf9e", + "public": "02db984277e99de74db246766d96923d0da2025588bce93b3002f67020bef74a60" + }, + { + "address": "2A5Bu1Ho179P2EyoNcY6iuuweMpnTo6Dszj", + "secret": "916a59a3fb9e8cf7ca8b57e12c479a3bececb4e2cc045b138c30d24193b2907d", + "public": "03f05db64aacd7f1872deade0890c84144ce00e38a5dc07e2880079f8e480a2eab" + }, + { + "address": "25dcnottoLnueHerPbKAhZRmUoXjKHpUTi1", + "secret": "787132dcc79020e6037ad2b33708a2ccf0221154be3a53779bb13ac7fff938ab", + "public": "03b740ebcd062875de83f984c37d71f1dbe56b054bb39ac1d1294d52e8cb702d58" + }, + { + "address": "Yez45aeDFBzSDLpLRT4j1ZW6Wu4dH487QH", + "secret": "b55fe82dbcab00982ae20bdc5d6d2205132161e91eb4bc80646e5d3e56e26deb", + "public": "024b71d54e31d943a04299bee61abaa0410b665724fddbc02062544521826b66c8" + }, + { + "address": "4wzjraRSLhkmQBfdzPYu9DcLoJCLtg4PjN", + "secret": "a0297d49a0ac7db02f303fca9e342fde7d3fa9588322a50be65711f3b33125ce", + "public": "0363eb9e525f712ce3549366d42944d9bb11f4489d38f61d30bf319f242f0bfcf6" + }, + { + "address": "PCgs68kierVHr2ZqQKkACJe5uFCaqn4Twa", + "secret": "362097a58bdd050e595df2f2e49ad7be2202eacb5a7bd86c50a9b44c9d10ad73", + "public": "023f74ca7041a7d9f3ac4c524f8686018d8a24a735fbf942b271ceb2eaa840c875" + }, + { + "address": "pJ1EMgaUEpeTSXu1X469gtXhjd6RvCjNq1", + "secret": "556e1fab62c57725765b5250062b6b9e3d2af8bbdb522255d1304f12047d283e", + "public": "020a6a5ab65ffb60e706fc1febcdbabdee7f8f3f916a2100dcab925cc8ed0b34c0" + }, + { + "address": "PY91kddKVU4mVe2pcM4ZmEvsdP25rFze7J", + "secret": "23bfe9afcd904fd9aff9838dfd1edd67b897cc9b2aef6fa5eeff116103887a6a", + "public": "038824148c1b8ecf7848dd3d1acb359423334c5822fc46dba4016da02810d30f74" + }, + { + "address": "2NRQSCu82A61Q3Crm6fMJLUuwEnwMraT2FF", + "secret": "c352efce59357fb758de15e09f00e2638b504123212003157a3917e8f41a2e96", + "public": "0202ccfdf6248cab6f045e620789fc7c9eb2a561ff80c2a89f0cd478b15d1576b0" + }, + { + "address": "3RRzhD77qJoXvM6v5D9qxdHfoKjUhnEYhX", + "secret": "63c1cb5a1c165c78c847548390a01b8bff6682a1b247373ed6887aed21dc4bb3", + "public": "02d608b2d0df929b6ab7b261f5670d53f406e27b2bcfb00e024dd256c85623b77a" + }, + { + "address": "2d1BVVuCTEhTxdKfKJnRYB1QZvAZQnzKqKb", + "secret": "c888dc692ac017a6e7937fe04612473ee816f3f35c0a5a099d13adb9af7f7571", + "public": "0219c3f2baf3665dc97ddbeabbfbda43c37f9a797c66623c2d2f991e8b39a99858" + }, + { + "address": "HqZLYWBYACeiSgC3ZugJuq9hwgmDTrDgRN", + "secret": "fd1780ef43c24ede009e36107e15903a29fc150a1581a7844370e440cc922e56", + "public": "021ebef79e0e5afce2d4d4eafb2199cd558507ca1a0ab33556c464b41b020aa5e8" + }, + { + "address": "2cXxCXNXbFx6vF7AyK4Jq4Tn8gvL1tGxjJZ", + "secret": "fb90dd91878c0a09f823b8142f71f702bbe2cec4319403b37967e17cef6aee0c", + "public": "022491a0e903acf81c62f8e13c2e342905374acc4afe48b8cf8650f269899e5bee" + }, + { + "address": "u1qW96EaRAuxaKWTJT4Uu7v1EEiiDkDbpT", + "secret": "5a3211ed2aff62a77006ae14b4af4cbece71e3932fe835cab03e7778b42684dc", + "public": "02676a8a39902a79d7057b177552fa7c99ccfeacd8d1ed5f4cef52d20909bdf067" + }, + { + "address": "K5PVBVZjJkg84f83p6A4Bu66NJPJBoVHYp", + "secret": "1214af921adc1234c210a62675b5c4b962be4708638a67b2c840b950a7da2bc3", + "public": "02ac6ece3449fcaa163302eed3e3dd9293a46457533e4b5f28c137bed59da53e4b" + }, + { + "address": "2Gg92Ak9qtPMmijPb5W6kB8M3S5J41qwJHT", + "secret": "7a9d1e7742bca2aeb4a5b1a2bdbb304293477bb14345676a27a2052e5d4ca1f8", + "public": "03eea804e1a66b4b00ab6957a03e07750b9bf716be5deec43642e20549f54af1e6" + }, + { + "address": "CmFiKdFeKorB7hsKCmjhKCw8UScJCfXx5d", + "secret": "7be562525ad05357770a38a48380a23ee8d1b9b6118ff0d36f1205d3b265727a", + "public": "0316c776b70f4ae4c158e68c3393a68b3f9bc76864c805386e93057fccde70953b" + }, + { + "address": "29tcDz14WSM58YkXMhaPJfiwUtTJDAXt2zn", + "secret": "c0bb01bbb159b0bedf44cb7ba6f8d688ba94370daa08bdaaa5b8644b57045758", + "public": "029f5edc881fd9c965626bd57608b3d39cbc03bc12891684bd3545e02e77932c98" + }, + { + "address": "23QXSzuMwpeTpdfag88sM7teo2BC2dEiqUm", + "secret": "34ba38674aef49b33ce5deee37b685e6ebec56f3e1f249c4d9ef6bb5169c775b", + "public": "0242e775c22b176ec52c313fdb2c070c34a1de75b9f5b0aaeb5c4f37858c7541e5" + }, + { + "address": "j2twcqftn4NGiaEKTG8C8EE8ThV5E854NL", + "secret": "646c729eb1df22aef8c1ae4ae5fbc493241b2beffbed8cf80fe29b59c61b5946", + "public": "03ceae5231f5e67bbc1958e45cd8e13861373bd273f8a014c031af845384c26642" + }, + { + "address": "XPNkBF8xkXbFZnwvJs2mGKVtzqbYT1sxMu", + "secret": "69e76a9701546342dc4a67b4b96d88387113cd0ed03334e76ecfb7f760539b90", + "public": "029dc62e8c891bf8996292dd7b9dbd4f35de762e82ca1e34075aa7772f3bde6340" + }, + { + "address": "2GWkZ9KZZ3tqL5b3WU7bWQBBAPTnoffrRch", + "secret": "e8b1495cd299d98bc817123bc3925aa58b43d80fc2e54f2572bce0ebcf890167", + "public": "02763f7a152c2190cabe16a1f29035c6c70b80a3636e5568fa4fdfcfe35094bfae" + }, + { + "address": "DmJHLWMHp5JNCFcpwt3JmxbywjNrne5jEi", + "secret": "8c2f4d83eafc53c13a85ff8035403c61d9e4c17f1453cf87b6be7b0dc6ef9e9b", + "public": "0371288fe9beaa9fc75a63444803969ad821550141e74712e9dbee02b21725875d" + }, + { + "address": "26jmnqf7s3FPRu2wLBqQc5KfbBKrkgtLerT", + "secret": "026406771a4e3b8baf98de0521150c91eb068422d37af2974bfc6ae0d4fdcd50", + "public": "03e47579aced7c10ad1c479e46e13e930b535ac90b628d29d89f6d02a75ce6bf80" + }, + { + "address": "2UUvsfNWQNycy6smEG8c2bMNyCh9qQ9P5EY", + "secret": "1814c9a6e012f1b4dabac7e7040adbe519e3e8071c15089b5620d091e3c26cc5", + "public": "020429f24353d0ebf7a17c9acb952df72b6364a010c69d5d98c61ccb462a65b2b5" + }, + { + "address": "haWRgQvuH4MdCSyjAUxzzunVLwNi3vgoj4", + "secret": "5ae9f61a0c40f15c178775033192c68581f7dc014a5c7f23b1f8342e853a919d", + "public": "022139698f089264428fe2e194d7ff0138e633f3b21cb39768b9c6f65dfa689eb5" + }, + { + "address": "28wV2r2XHDMdAgriHeYL9Mq1W7TmJufBwp9", + "secret": "bc37955215e69841e42c9881e284fe53eb090598f3f511fed533e3e82478e83a", + "public": "03c2c2c3a698da61e8a3d95744326e1015c1842aa84a091565cd3b235b1d55a16d" + }, + { + "address": "28WhxGF5tSuvWF4D9tSJqp4Tz3dAynY4rkx", + "secret": "c7666cc0687a4cf835972c65c58f5a395beca834eeb8c7e0db1e87de1ee5ea43", + "public": "03c2ed06a2d7c5ab80d35d0c792ef4b3c9630a50ebb6c23aa886d4981437c79389" + }, + { + "address": "etcmKzzd4K8NT6n8aTiMtUkNxFc8sz8vyx", + "secret": "a3fd517ccfa8ab4623d02331e818c4d713e26f7cc7d18b2a7e1125ce3e405335", + "public": "02e1438126acabe6a4c2eaff465a5b0899b4cf66fe762f92434d6ad91b44a3ae3a" + }, + { + "address": "F4YnpYwedDV3DSuTVgAqN2F7mikJkRhcTP", + "secret": "efa78a590bd91f5b51964d3a4537abd76f03c41d93e2f68923df89662f52d32f", + "public": "03b05cc039402bd180818546c50dce27f21cc34f85d0f0a108fdadf8a6aa670d82" + }, + { + "address": "2c6N2MabsomEg3JKDkch4Jpz29bsNU2chWp", + "secret": "f0873cd7a110412e885761425372f29c72555e50fbba2af0cbdc2745f60717b6", + "public": "030da68239a9b2f59b09726846321a3ab9268912b01802743098721229b4e36c90" + }, + { + "address": "23LApPWq6hQYCe6G4cgaPnYVS8pAX84FBaR", + "secret": "52aa35161bc67fbeb4db60e92872d737679da25a4fb65331f8ff49cebe9ec56f", + "public": "03038fde27b7f8ef7554632abf454ddb8e0dc428785851afb742599a4a69371822" + }, + { + "address": "xFw9ZDCbQFG7DpRiQPTzb2WNRHqrkj7RGQ", + "secret": "eca2b0b5b6b1d84723b01384112f25786c5c8f3445c941070a71cc76aa95ba88", + "public": "039b957325b2c35cd8734b8d1cf83facc02e497ad886940350a68e2f480768b0e5" + }, + { + "address": "268GpgoU9Hv289M8Hse1akwZde5ag9uj53x", + "secret": "2b5b22635f3aacc25b8e49aeef42bd6d64a02417a80e9ec724a68cb219a7c0a2", + "public": "02d8e1b7b6ceee82a2ed233139abca00cf638c8f2398d477f0dd06b4660e294f45" + }, + { + "address": "2FCo3HNQxWgh5K56mfG2RwLAvzagB6d1jah", + "secret": "4d9df01b27be68b30693b07335823009231b9da913c91b8e5d8b8d4bf0f52f5b", + "public": "0313287d7d4684f66fe587df1543766dd415c9086e8c95b8daba9242d0853b164a" + }, + { + "address": "2MpDqMjjZ5yULWt4CVDCxdPQGJVuGhaajfw", + "secret": "f54df30c69b3319ed9b23ab5a6b8f304bde489876d94a321929551d0a8308519", + "public": "02b67fe14d0c9341f3ac2aee4469517c8afe0a7e4377bd17a23016a08489f4a9a5" + }, + { + "address": "2Xz7wn9Bxb2tszHxPDNgewe4FkxQk4SccBT", + "secret": "2c1a5fd49bb16649b9a928dcdb0d3c1ecd6846a53cc59d1456883b7669dc89fb", + "public": "03c627ab67dfafd83933b644c17154cb3952fefd97cc88d80b4710c0e90f4175fd" + }, + { + "address": "sGEef8vBoVE4EroM3Zt1f1isXbpyEkQDMb", + "secret": "8a630f2682bd44c03490b6387bae44e5842af0b6b08b2b1c0a4549e73342fb53", + "public": "029d3349abd73409c2ab4ca0d69159dd09f3648abd85128f559a422a61499cf46d" + }, + { + "address": "HxKmR2d1tRHRXeAQ4tL7ekbi3MRfyHVWow", + "secret": "3d7de091a784479b3af9ca73d8dcb8646b055b33faf8ee18b88a188a6048bd40", + "public": "03fa8f11fc56eab51d0f1658b8476afda73eae0e5d4adb3af4e721fcbd732ca25f" + }, + { + "address": "2eD58A32HBAUhHVfCgF9udzJRdswTuuG5mi", + "secret": "6d6790b0807b0dc719eddfe623b1ea711075609d3be17609731f5d9ed05d6365", + "public": "021a69827e26d0c81e1fd1a690f84d94fc183bfc066e8aea1f0485ce1fffb4faa6" + }, + { + "address": "2e2Mr8MjvUHmMSf4DayyoVqgSerZyFsK79W", + "secret": "f09b7f763a7cbbcf01a63a81dd0a60fa014e0a96ff609dc544b3d003d0f82b70", + "public": "02746c6784634fb65f5d0b6a73a023464c47a4232831b548a57b5d4039a177388d" + }, + { + "address": "27JVEagjW413PVigf6ALjqNCgm99xS5jj25", + "secret": "e4d69a0e022f119941ece60c0b0fe8f36d93f7f7115fba75ba6c3c646bc0b804", + "public": "039ad4b9726873f1ddd35ee87cd49aafd1734cea699ed9feb3c5fcc6f5a20ab237" + }, + { + "address": "d2LgfFBTFTwxP7PyzHwpqhHKc4BLPbA5cv", + "secret": "fc46fbbfa893010b6b3b7a82aeb52290d58f6d14d25a68232f0143b99eb95966", + "public": "0248ef5a23acdf96f41e3a3f1b796baa6e4bcd303f223f92b34025f11f3875117e" + }, + { + "address": "DYnuqgGZsGk49sU7c8SFqCezEzeZMnYT6h", + "secret": "dc7b04fe3530713ecb0bc55ad66236040f3df7962d0f7764184059a5300de5ae", + "public": "023240e626ea68612bf3a722df5cf567052e807a555b63eafd3c3fdabab1aa60fc" + }, + { + "address": "2XpYsb37q5XDQHvtK19wZbsTrNzkH7BVc21", + "secret": "b2d00fb19032ca52ab73f6308248e3fbdaa6e747a5f00af9cdb4fa914d76e19e", + "public": "021a7d5d53479b596f9510b9fa23e682dc02930e715550cf70ef9844c62a9f7944" + }, + { + "address": "ucW7K9gf3qU3RN2b4i6bGxFYrL3woqAGgb", + "secret": "9ad70994a257aee7ada71f7f93ce52973febe7cbeeeaac7ebdbdf1e6c481dfec", + "public": "02ea5e47e063bdf92c93e0bcfa3ce25fba9f4df0c28ff008c6b17737bd0e994292" + }, + { + "address": "25fbmTF3vThUywruNQqVXE45sViGFJREY18", + "secret": "f62247d6d0644814ab52dd187d34a409d7e4fd92cf84525adb6703a1d85aad7f", + "public": "021f05d696dedef4f9739c6a7a258e49d62cef2d53c23a37a0a3589f95e6cf7b02" + }, + { + "address": "xYMp4hezFHZQDDyRZeAdv12fwaCiJ2vMdY", + "secret": "6b4ab66f5d8913678ba852718f6ea0e663a6433f7f3d748966b4063c3a6177d9", + "public": "0302f82272e3d4ab41c5f2d90af3d457f1317ec703cb28e10f657f34c4b702142d" + }, + { + "address": "2QtyuU4brhrHAfUTKba4nRTMzGk1tEXruVM", + "secret": "6e9aa8ecbedcefbbae841c8b9abf7c72d047ee02d02ab3de3235e02d24d9bcd9", + "public": "03eb4850fb800b164540382b34d7d92c07f054383c4c5e8cd6da2b2d721fb27c42" + }, + { + "address": "2kvThk3SQYaNSNN5HrjPTbTFM74vXj3T65T", + "secret": "bdf9c95a73abeb67f87cb4cd628ffe1c8f11efb6538feca26b50bd8697b6df2e", + "public": "02d4cec5d6667aee1afb4c077f34031b05879ab4246decd0eed08218a8bfca1778" + }, + { + "address": "gEnn3tL7KwqmVuXQgndgbdxKesw8XLwMJ4", + "secret": "e98a343f67ba8e50dcdd8d23a32bb4fca328fc6c3ed3dfb21646a48e396c0c08", + "public": "03a69b41e972c2735d740f1c1e96b7bfcc9c20d157c3fd6981170f5171fdb0a5de" + }, + { + "address": "QhJj9DnTETkK6BKN5hX8CNxoiDrpRvp9p8", + "secret": "e4e661663ed2750e8abdb0c6a66dd61bf3883155212c83e0d6e2ebfaf47c4138", + "public": "02e8d9982798c5f006a0adcbef9ec806a894bc88de7adce0b7839a197a437fc417" + }, + { + "address": "occqAdzZCGaz6ZHLmyW1FCSrRcL5Am49Pv", + "secret": "20b851a7b0615ceade0f4777e0d58b0f6f8531d1e367a4523f8f182d534bfe55", + "public": "03bea4e1361b538fe990a04555d9dd02fbf7f7b6a7e04fffa80914a5b1f5b9d74d" + }, + { + "address": "22YUVaU84KrbVogn9sjpATTEVH4KsVWdmsh", + "secret": "d75b07572d7bbd6aed033392cef11e46ea53b07a309e10a88cb13b7dc7b895fd", + "public": "0235ac4849583dde931ab62f283ca3b6788acfbcdc9118f95e8e70b9235b0f20f6" + }, + { + "address": "67Bvi6FjvJrmtVs8knw5jrhbB9CHbydGmb", + "secret": "f1ab28b4d9a4e7154200f9e97021b505680f2b6aff67b84556d3595f24b3526b", + "public": "03658ae2dfaf17d476e66d3fc37c60589a358dc2cee8a0da100745672266c6f174" + }, + { + "address": "234EUS3L1CSktQjv7Gew3XyuiWfuyYsW7zk", + "secret": "34d2973733c9907551bd889bf373e43a2e8c5b725c047f30fd280c11fc5022a0", + "public": "03f26a30354f239883057cb42ef7c332ab02509d0cf65abf0a4a62023a8d649ecc" + }, + { + "address": "rh4HV53HPjP5EVzovH1N3MpS56xEFHBWR9", + "secret": "1ea8940d0b18999efd6f6cf7d59f40372732e10abd9f08d2bdf366fe3daddbd4", + "public": "03eaf9fc065239fba9e5fc042b250988c52aa6ac9e5775d4719004b20b431297cb" + }, + { + "address": "2YzJk1MuPpnAvKXYMTyRM1VsgwrvsdxfjT", + "secret": "bfc39b678b8ab0c31baf501d510548b7e88f1a2c4c0d61a56d99ac334eb4420a", + "public": "02e73b0cb3d96c20b4611e74cdb81501f5dc8aec50784e021cee7e3a3599eb8de4" + }, + { + "address": "2EkVeCkNTSD7QEaz88g6tL72174si87xSVL", + "secret": "4412a0ad23f28be3735698d4a086e9c285a5f6ae1651a95b526f3bed320b3de1", + "public": "02fbf462883546a2e516aa22f1f5f06c89a6a3b7cde80b59e7ef39bfcb94a78e50" + }, + { + "address": "2L8NW3x6F9fnMVgosWWdEcXmdkt5Sfhkyip", + "secret": "da5743dd6f09bd139c9c6e2105843b19de9a3393a7549c79edf91532387bd6ad", + "public": "03fd90e6f33e338fa4e9f6111396585c124b83d6b390b39f92d072bdd862831d7e" + }, + { + "address": "22ZB5dM2NVyz13YiuwvW9X7uKABoEbHSwYN", + "secret": "910176e477b73d66007ae2f5d44a7bc71fc21891ad1bbfd988d8badcfb1fdcab", + "public": "036d9ba5504a7fa6f55577ee34b5e8f2e989aab504dca6ba265d26e6518f5fc5a6" + }, + { + "address": "2RcNdAmomK5hPkrzEagpBPbJKPG1YhfqBZX", + "secret": "8b656b8a83350a408db0258f81c1fff913c6caf10fcb53049be6cdf5f6850ccd", + "public": "03e0e7fd4a33c7e2af83e476ad5d78f5fa91cd8f16c5f3a3904875444f76b038de" + }, + { + "address": "mECP2omm6nNKCRbUUEA3ngU83gBtbG2p53", + "secret": "3306fa898776691df724ca8b72dd5ebebe9a166a9f107a281b7e83e0bcf34d8c", + "public": "034a9096445d1401a979fc821bdefa15f44df8dc02ae88e051c6a7b45a577dfc64" + }, + { + "address": "22nsdEVSxa5aDvpFPeyTz9qpcc2h8PLzRt4", + "secret": "e6fe5bdf75d6e4f7aaea16388cf2450fc1839b088c415bd3f7b9a65958c08f18", + "public": "03349d2964d9d6dada8ae6934b76145cc4d92bc43a41edb55d548a7da36530ed2a" + }, + { + "address": "2gadfsU9qYJSKcjYSbYGjrRXffK9grr74T6", + "secret": "56d995f35b80a3046af165ad9dc0a507ecdafa9a947403ceb63c79a3084be6ba", + "public": "034010692d87e47df712c37a3490f096d4323b0148d71eb06756d1153e47de9558" + }, + { + "address": "24krePYfSFjn21YTDA2e5FAWZefu8qE8Z3R", + "secret": "493102a3bbcfb4178ec7c1072631ce03f7f3e1d07d5876f07c3902cddea3e5fc", + "public": "03253e2a852b5aa4f8fe11d5d32cb8364dcd5460665935b47138ab945a1b7550a7" + }, + { + "address": "rcqLsBcsWXHodbDaCLHcjQJKSJ8kD1q4Ff", + "secret": "cc8d395693f126bdbdabb3622933d1c0bc148a2d929bc30e66e22f07421f1592", + "public": "027558c499a52a96043a001f8999a6cd38a3fd2527fccf28d12edbc90fb7641aee" + }, + { + "address": "wvFzxVWV9xGs2ppokV3wmpy2C9BcUe3DZy", + "secret": "e8e09e51b8add90be81a392196c76930e876c97cb8b1df408eec8df13c215b19", + "public": "028e99b6990ae84d590aa30acffe4b9a1fe5033cbbdbcd9971022c6e249b43d98a" + }, + { + "address": "21124BfJReTshKP7zKthRyLAkjSnvbo3JL2", + "secret": "f452d999bbfbe7da6cf10d8e602a09543ed716167649dbc6b260f218d08d0a33", + "public": "0323535070dbdc40d0e3e5ce3f1f75af79922dafed3f8a3d102fbc891b9be3efaf" + }, + { + "address": "KKqLNqWvbsMZ5sYKAZpXLZm39jZ8zUamy4", + "secret": "0fd7f48cc79b6252dcbd7a24d5f3e4099acfd16368f8f2e7c7db356ad1488284", + "public": "02cc8fbdac02a1050df58a28793247184b810bceeda25b7e2879ccc4b695cdfd20" + }, + { + "address": "2afkMQHbNM5EGuVPt69yjjzxfPsih4hzfAt", + "secret": "7ef7f98aa685734f83c7faeae4cb687b246c21998d29961d5899757814a1c28b", + "public": "0321f6a774876011ce97bb51f15a35ef2aedee2bf9aa9e5a2be3193d7bdd4020df" + }, + { + "address": "QqrvnPdiJm4qg2PZuhAEYWCHo4s9VRzQ1d", + "secret": "3ccaf169d3c906c5475f0d2ed148a6a0bedb23b88df3a16f485fb7a27c61f465", + "public": "031d90572ce93b645673c299b4d3540fcb11cac5137356ebff65f29e47e75bf921" + }, + { + "address": "26oEbwGTv2tGemBwWvbANw5z9oW1odHLKU", + "secret": "cbdfa24088c30d9c07bf634e84a739773b79bfadea68db57e7e690cdce00395d", + "public": "0320275a12cbc4888b9b0390de849c2bf6811a128212e43c2359fcecd2e5bc3fd0" + }, + { + "address": "2bNwEBFte5ezxWk4hVB2gSDzh3YTacKYxKo", + "secret": "a216d679e012a931b34ddf4716f4d5184073afd962f3ffd293cdd1974eb5e919", + "public": "03fca51ddac76f423fc3863eeb7681a564f75c16026da6bafa50096c6748bf4dce" + }, + { + "address": "2M9Ms8uouj4wVZSd9sJXNFMYMDCBrLQPwNj", + "secret": "2e3757e0b1c32e5c930c27f9ef8a60f8eaf934b063cdfb788370f0f4a0b12100", + "public": "03022caa31c325e86fe4f9f28b7a3f4474587722821c7e0384a7e05b7aa6a8e72e" + }, + { + "address": "ZVD9KiPi2BjuXvqa2uVSUz9UVvyt6bCin7", + "secret": "16d14664cb9c65122d76a74d8fcdf542f5a4badc4e63da12f9a2e21a49364142", + "public": "027044e66f79defc67e06bcd5aab6921a985c1a78e5f9c965b2b8b576aec5be7a4" + }, + { + "address": "EWFzgYgdjU6CVtPXyP4WrwMondHoPX9VSi", + "secret": "bf6f0cf4e0786300a07294f18d9c0619ee77e224274ddb0b4c74ef9b5ae12bec", + "public": "02c402d13f5bda635669b0b384e2a7f937ea3668d14c6667472fbe974027f338fd" + }, + { + "address": "frgeQ5LGCQiJdqbBPmzJrvHf7osA95iCN", + "secret": "1b533323661fc93337c9a09546613f13f10c0dedb756a935791336b1c847a012", + "public": "022dc106b9222bd5779688fbc75010ee6f24d9491a7db1dea0bfad969d27080483" + }, + { + "address": "2Ygc9Y4SWt6pErg3smALUqb4nxe8y3Aa5SV", + "secret": "5aff64e7ee0c57c08b80c66d91c5db5d0892a7a182eaaf9fb775eb77d128e731", + "public": "0349af83b3db967df7319957aad339eeb85550e57835f4acc07293e2eb353de8de" + }, + { + "address": "VZSQ6ji6oeLZgxd5Nzzt67JPUFzm9oXa7D", + "secret": "bdcf7de5460ecaca02d4e485892a4858ad4c4a7a17d57fdfa8f311a0a3b386c2", + "public": "0335f1138f086f04fba73c261ddbc263f9187454b9dcaaac91d2f628ff64e2d7fb" + }, + { + "address": "2UtPuf7UmE1RMaKaRnQnsUmHsHmTyv2GCqd", + "secret": "33f62c9b2d5984aaa7df578a2d8109a010f400b522d95294dad79d0579b69790", + "public": "032c2ca487f68198688cff80a29f59ff68dcd659082b8b28e850343a810702b6d0" + }, + { + "address": "CQNjG6VeT7XLoFd2DHxj7Bdu1ofdkvf9Hz", + "secret": "0d323574b86731c76d23912641b4272aad76c610641794f6008de85245d90501", + "public": "03cdb086cb3d513a001501591289093bff66c0e4694390b120c9997af573789fee" + }, + { + "address": "cFhdRpgfDXFD1d9tzSGTDxVkyexiHHbscT", + "secret": "04b1bc8cc808c62c32ff387b2cfae435b3fa48e6775a98cf564e5c77d58c4d80", + "public": "03214b11698b52fa5efea3549a08c69afad4d14d2e1949a267f29a7486f40d1662" + }, + { + "address": "EPqkNxDnvQorZaKoEtjGcGKURNcywr3dny", + "secret": "de6c09ad0b43723096aa1b5ad133a194954793f2005066d2f3f7f629bbd14429", + "public": "0285584deec2240b44f3ba9fa9380b39aed1582896e38fe0c8254bdb1e14bd7f0a" + }, + { + "address": "UhCE6NpRtm1Bd44MkPgVKToavRRLqoJbDr", + "secret": "3fb29d455a7d5917a88f001aec8bb44ea20d17d7a68019b4e29320cb1bcd4561", + "public": "025c453cb7b8c4470678976e1e08baf10852d9b28a5a21b55376766f302af15d32" + }, + { + "address": "j6rcr86aiDCMtHj57zQt3f4MkG9zoscywy", + "secret": "1e05688f0796d4bc347a92bac8748bca26fc4cf749836672d240fcae8b8ac467", + "public": "038b8875d803161483165346766f9a1bdea5b123b38d7705538d6a1d8d5cdf54c8" + }, + { + "address": "G8unj5XY9mKMjPZ66KNrADKojueP3FxpFV", + "secret": "4eb017d642be8864dd5c54d0e81d4804fd588361fa14f31b099cb5211a0b14e4", + "public": "03c0b736889e8cfa84b9fbbe9053f508a5cfe44c6148e0b575cf0d136204adc9c0" + }, + { + "address": "iEY1wongyqqfMMCwwKa6yKnrBPzWRv6Cjd", + "secret": "205d5d8cac7ef46d7049a8e360b5db56690c939178ca1cd46db8a686d9f2ca81", + "public": "026953569b00b6d1545899246f12bbace2fd78f568a004d0d08ac61525c0eb8e10" + }, + { + "address": "8MofVFHLEyfDbybjEuj8Av3tvtAHm7aB6i", + "secret": "b88a93973a8a62453a83c10e00817112922471d2270d1cb0c8490fffa98ff4a5", + "public": "034abbe2d59395e30fa5e769961bc54beaa08598370b3e85193a9e200d8b18213c" + }, + { + "address": "LokNHE2zyrZgjpXXWrWY5L5BNsXR6qJR6D", + "secret": "fab1c44ee39d0839860710e49df3f47b35d48465573c0251bd844fd90a6366f2", + "public": "0251740aa6f68cb3290cb0d72db8d9c03447bc747da7f272847417cc8e40330e9c" + }, + { + "address": "NXV5XL7rggQ8GAPDjJ62jpXkYGJ8VAXSba", + "secret": "631b5a1fd96e7a99ebe33d4788a8d6e45a6d4b116b11bac53aadd116f39c4c11", + "public": "03670833bc074d7009dfcd1a61cf5b63a08ea0bd58f0f295121b8d5825d897dba8" + }, + { + "address": "frEtjtXJoKyuyq49akz1Zx3yLMpni5gYh2", + "secret": "8d50af61f21107f572606d21c35e453f997ec17e941f2b7afbc051acb36283f2", + "public": "038daf6200f2ca021673a6915e57b4c424ab2ac1c1b749db8dc059607d2092b1e3" + }, + { + "address": "2Fp1fioauYwyMikcL9VphTrG72ZBwP21WF8", + "secret": "af01bdd50bf4187bc8fd855962fc0a68ba55b3950d9abb192ec7b5179638e045", + "public": "02619d27f77c97b36ce895a9ad47339ef69a9f02a6953379d077d078ba7bc6535b" + }, + { + "address": "PeoTufGJDpATgy7y5fKUkM9xoL8tzk4LUA", + "secret": "f8c45f4c7034fff54f2c8f2f2b8f9ea356b299c73a66a9979832ab7e162ecf59", + "public": "03f4f3d208cea7bb257b6e6e84def31a26b22a2375c9ed50e0e02041ece9b09f50" + }, + { + "address": "2avexrXAe1yFcmEaFSMpp4E6bkHDyonTg8i", + "secret": "4f62ec6881c21bc8ec63676b124ce103a59d2acfac567827d29d9f3bd8015562", + "public": "03e17e14a0c2691b025b2a07d63ac21fb28451db69d8e18904ff8161ca6bd93f68" + }, + { + "address": "pwNab8Wa7Sag9Cg2FmEDF56izp8mD7kzQw", + "secret": "fcdf5e499b22ec63290dc2c680f87745aea192abf5aaef858c007e946ac3002b", + "public": "02ad66e1ecc629d989a0c80f81997906f5465ab1d4ff908f02f23e8a96cfe00f50" + }, + { + "address": "scN5GgoA6epthFqoXEKc2Y5QZz8jyT9FNf", + "secret": "24decfe6e2e505c5fb7a9a7a6608587883554ed81bfdc581921525a5a23f6305", + "public": "0344f0bedc327fa09c9686235ea3b2139c07259497264c2b4461cedda3f55399fb" + }, + { + "address": "SEAR4hqpuvGLPVoGLpd5U61aoYHUc6jNqG", + "secret": "b5093a711d22263967e5ce2b2aad751e6742cb34ab51c8d517a328cb406cf801", + "public": "02b5fd3eb5a00f7bb172fab386af63c965e72c1874520fcf2121bb3bb96988f68b" + }, + { + "address": "2agxCQqyVw2Ne1n4CtBboaWQ3YjmhXaocdh", + "secret": "ae897238f5b80a8312437b2335442d83c695feb68b44482f5bc2684079ca40a1", + "public": "0294e9cf3b98d6c5386dee498da50e2a0fd28244d9edc82aa0aa3212c4c0ef06a7" + }, + { + "address": "XoHShPLTkcUeFqiwSEfRgvJnHHKhNYAHc6", + "secret": "bcc65eae057e0fcf3e423255a0f5ae2ce146919bb707dfd4bd3fb762fd69d78e", + "public": "03c740e434cf3614b53c2788274f7a356905a8a1a27725d6ae9e67cb1a006027cf" + }, + { + "address": "2hGNn3KRW1Amg5xWEW8HXDW9pNhdyvp3Bxa", + "secret": "7b39b68fc581a9bd7d759a74dbc1d7beab35e0a64660372ea1d598ced36d9ee8", + "public": "02a8f5bdc94366497ffbdf88fdc423b51718947a0a523ec63547f88b1c10c0382e" + }, + { + "address": "26T57mqYiFif4KBVW3N9w16RGfSg8VP9FfW", + "secret": "c71f7cabea5b39352997f647f1481710c13ae1a29a06f01480af3cab1e6b2f8b", + "public": "032f0a83a1826005975aad6e23c87088000bef7fafd11a52e1dadfae590e859a0e" + }, + { + "address": "2eCjgi3o6eTNtj5fiTs9Lu7CW5WMXWZhfXN", + "secret": "8d6142ee69ff6eba19bcd25fb16f1c781a93d404385dd9b90e85a4881187797e", + "public": "0339f788c880d61c3f6fcc23e0e90a1c18f79460533f392389650151314d59058b" + }, + { + "address": "22a6YptFqi4MjqsDjFp2L3d5ZGV9NDuczfh", + "secret": "865f1a3d7d1a95b54627dcf64e3677cca758a7cf35aab7389cb2eba2ec6607d9", + "public": "0266e102621ee4087707692aca8cb858cb51ecbcb5579b99cb2725749674394766" + }, + { + "address": "2Tzi3mCkXk2h3GshRuw89zcku2WbvZiYXmf", + "secret": "1a4167d782b49faacbb3c89994bad131ce61850641f79e52e4246bb1a05bbce2", + "public": "02632b4a6bb063f28ddf1034ede2e900194dc1d4d709c33672fd33070291f53d3c" + }, + { + "address": "9YRxCxLexL89oe8RV2SFCZy4AQaBYXAsLf", + "secret": "253249e9c22d9c28a110be2d8be3acbdc6a3d04bd001a07aa6759a3be2a4c591", + "public": "02548f69543f4622659ee0ef77db503e734112813f70d3bfe6b4223b395a74364e" + }, + { + "address": "EXAHo74kkrdfFnFTEU6zKSMubBYyY6ZmWL", + "secret": "1a5f08c53c600ab5a52e948bbbe77cce9ad52e90aa14d16d78938fbacebc2c4b", + "public": "02cfb2fcf1ff02fe24d210df86d12cbbdc81429eea6613824c031a8da77db2065e" + }, + { + "address": "2RRBNvJSxReWxHRTqxHoUs8gMuhkBAvQaVM", + "secret": "4ad2c6899bdad0d7a8b36ae0ba0fa22cf6713fe48a454327ebafd2a2cee2bf57", + "public": "02835fe7180f085ed98bbb305c84470d585a391a9b53cccb344f26ab0591efe186" + }, + { + "address": "DLLAzoNAdSqmjoeHY1Zs4C8cF5TsVrhxMw", + "secret": "436f14e457a94af30f1064a3ebe4b925feb0bb08728b9b37ce6e3fb2f048e6d3", + "public": "03e6c236453466b1c7e7ec6edb05d8ce526f9b34ed696526e39cfa0e7974289043" + }, + { + "address": "2g7WeX2ieVcucWtFhqVouh2U34VT7jBTKvY", + "secret": "6c147b748cde69b07054d13132180dff1e2968ec311727c3d5b430074abcc53d", + "public": "02515f6a52401a03498092aa16c0fe94725030545b987e2572c5700e91c7dbb7a1" + }, + { + "address": "27rnygUUorp69QkwCHqzy5WJMc1hnxoxN6n", + "secret": "2f0606e012fa536aff11702f3fc192550abbea7ca580f65ff44013f6e6d2ee62", + "public": "02ddafc8f9963dab80b74c602d49a42f9ae8fbee1ebe9c10d72ef00284c563527f" + }, + { + "address": "2RcdcDLnqB9pvNPy15MaqcSNjFjZ3ToYQt5", + "secret": "0fd61a8d1265e0479293983b5b6628867fd99f965179e5d51901c602ef2c8671", + "public": "03b9420f1acadb53799c7bcc7693d1024e45b66998821c957abf57def534c82d3e" + }, + { + "address": "2L4E53nxkgMtdEJMVEetmEqN8VsH8bvN3qL", + "secret": "5bcf2fd07fa946483b0bff30d0008398e584ff001093e588c99d4fb4303a6654", + "public": "02cc1fd871d6ad834a8c7997c38b1101b7bb781ca886add7ff39032d7e11774031" + }, + { + "address": "nasKi6MWvCCyupab4SoScbhxJDYyzS6NzC", + "secret": "9c3dce71afa6edd50d843534d0d5bc755c36e0609ebb4d42c14f144d67b57867", + "public": "033b9a12e3ac267d17c0ad1fcbd0e6204d57f021cdc3e7d63a186fb6b46c9a9344" + }, + { + "address": "JtrbAukxBVGesZgcuU46nqwYnMJxSvS69w", + "secret": "f6f2398e745d764547fae8d939cc137b21f0788f4bcc2b18aaa98ce9b5bfe3e6", + "public": "028a5936ce42aae51a92e89ed3d000b81e186892e3ab72da8ea02f36e1a09656d9" + }, + { + "address": "CmJZiinFtNVFsFGCo4ad5Trup7DBmehmB1", + "secret": "deb89ee1539b6cb4ed4a3ac1153f6893565b4279d9aec526651e712a02bd29e4", + "public": "03b3ff7fb687b17b45178138fbce9bba96f1def5781564adb5964bb5c1d292f2da" + }, + { + "address": "28t9se5L397uuatoiv2y4q65ZB73C2dxRRw", + "secret": "ac33995bc96e8ff83a12a49b22673484f8c3f742e2a9be2ccb74739d603e023e", + "public": "02863968a7c079c5ec060dea520c87396a60b840d7373cb6ea1a1c250f8e273031" + }, + { + "address": "2bjyscrwVN6nSWxM8L1yhavTY5326GUgdMU", + "secret": "54faa9a7a42f6159ddd56d8edf97acf1004129786d6e7beb88e0c7471ca32c67", + "public": "023f441a065b9026c6574ab08869d322d1dee79cae99f7bc1b71b98db92fab567d" + }, + { + "address": "2fmezc3WLhTCwfTz5AG9C9s7YtmGaisLSLz", + "secret": "c2c7d6d6cda61f543af9793d80508bc62b19896216039ef946d8ba68fcf84798", + "public": "0290d8e460b751e0cafe38855a130effeb6f090a0213374b537d6759c617ff4c68" + }, + { + "address": "2PwxALhCSc4XrgRCMknLxFWMoRwc8WYF2cr", + "secret": "c7c3b8f070204163dac5aa2b4318181540662a63bd4f0ba14906e44a6337fbd8", + "public": "028af1aceed2ebe9cf27ff522fecf8136c066d6c6c3af1e4030c8f9e124ef71602" + }, + { + "address": "BQFdx54A54kcGLx15CGi6Ffnaz8iCTksfX", + "secret": "f7ec3ed86093aebef546cb068c0aff22079f84f388d16399ae7410d171b8a095", + "public": "020310b0d4934d5f28db1e6db364392d3e71cd6e31b95a94d4bd5cc23b7d9e8c41" + }, + { + "address": "UNEV8oNtzoUHHTRuYSZs4uMCEYZFk8Bob5", + "secret": "8e0c7f3926a867b0bfdd1d1b62ed3462f9e564040f013039ee4e94c8b7519512", + "public": "02450766db9e74917020297e0e3d509a584390be68fed4ee488362734f075f38d1" + }, + { + "address": "2ZMV9ShQLokk1HTUVhqzR8J9tABBxnzASnA", + "secret": "ab2059ce17a55d13e96137be6838b108105d561e6a888116550d0fbfbe8d1e31", + "public": "02d21a40b09a09dbf8947f67317f2262d2c72fbf0a96c8f143c65a09355a3b96d1" + }, + { + "address": "KeykKcYHZy4WKXXsEor6o9PuUJFTUVXbz4", + "secret": "d7a282eeb2a7b1182977013d3583fa13e80d955be8ce2cdd2125635812a79a73", + "public": "022d38ed4c43431b5ac35352b2aa5291c3754075a232b694a6e06740be7f2353c7" + }, + { + "address": "irKDBpNkRF59SEC4aeJ3uBnGfsX6T991dx", + "secret": "be96ac4a73e5aedd538eb1c38bdd31ecd4600b1f4987bf64128bede52820f02a", + "public": "0233d41add351854a597a7fd80ba47c5124ae8d926c3c24b531600c2e4f9688275" + }, + { + "address": "2LWEVDkftAQjJBgaW8MPPTrijdXyH4wGjEn", + "secret": "f6639cb6b9a3ae2cabfe37404110cb17a0787fd92a109258a6fa19b183003764", + "public": "0381f5570ce75b62b655e9aecbb02bf5376adba0e91f21e893ea92e21c8a50bc2a" + }, + { + "address": "u7uJsj6EsCd7Z57jQnGQNFAis2YiyoeuuM", + "secret": "034d44196c5ee1eded33599fb1bc8cf205b544f86e8947afbf49a868d081206b", + "public": "0245a408560b1f747c86b47033b083729f5785ef6b00cb37fba401ddc4545384da" + }, + { + "address": "EuuHKQUFGgHN68T6VkssAwNxP4e1htMEAU", + "secret": "cda4c7df62d18d8ce0141c62fb52f05c7a987706ccbc26fdc8a900836711772f", + "public": "02894d1a4b8e222e1ae067c20567475322f925dfeca1405e2e30b845e3ef047756" + }, + { + "address": "TFVXLJKgoGENxDPfiNn9h1eXWLbER71Dgn", + "secret": "0e7d7e87f806b6d5e1063318268fc1df380d1e0aa13499d2b7e6034b89e94943", + "public": "033e8aba7f8c579c7164aa2369c62a3cbcb24bd0b49bf5339841d3c42048405a38" + }, + { + "address": "2bFS9uBumCkSkFhbaV8q3dYnNxx7725JVDV", + "secret": "28672a34711c4d818c8feb835dd2198e0dda20d4dffeaf78dcdffef05c991370", + "public": "03c88bdfb32a4c8932ef3b06d066495700cc5161886f6350f7dd46469b56ac3ca2" + }, + { + "address": "a3QUbyUgZaXcZtZPFm9ChWNt5DjYgo2wKH", + "secret": "dc644efb58c344e4f999080d7d8847ff159710c85d0726b80036c47e336a0ec0", + "public": "03494aee0e1406ba2ebf85de3d3fa5cd19877e81720be24140d9d703eadd14d881" + }, + { + "address": "2NZGkbUWx7CHzJ6LHTf7KpcDJNbMmM7PG6z", + "secret": "5d4fa6c7fdf51ef26a9095245dfe6ad181f5284d338cb5b008e38a6e07399b68", + "public": "035492a39daa2b6abd7530b5846e06fce0ff45f69f62ac722f0e315a092d377923" + }, + { + "address": "2daa3YQCFEXFqwZ7HwrfhSQXgmDucjkKC2R", + "secret": "a9d6dc77d7e4633075d0581eb43cb6266bedba600c62a98fd2a6349b04b98ef2", + "public": "03d83767f81104accce7893437d33f613567d85ddede6b88c0973ee8ec672fa7f0" + }, + { + "address": "2HrVw78xZrjDMz8YahiRXVgghRJNYxvoMv7", + "secret": "65a75bf3ea1df83c1d56297990620ef347b6671e4530991a15a4a0abc4b91c53", + "public": "0306ca67b3fd9b45f14865afe7405dd8810d81ef0fb27e11d4a98862565ea54eda" + }, + { + "address": "isQzfULaF8qsZwEjVqttXC5p3CwWdVrsEm", + "secret": "f421529f43cf5de54382f390fb7d4118f7151bf2b114eec6205d9fe557d07024", + "public": "02727f6d688ffc1afb11202b85b37e35478b5619afde09081620018f485970cae9" + }, + { + "address": "bBHE5LpRBZEaY7upVZrk9THomitAmUQ7pw", + "secret": "22f23e4560ace182ebb9e4c809236e3c37e636d02cbe41dc7f57f1b0d53c3034", + "public": "03457a68ca3c395a1615bd7b41db4338b1648c076fe008973377252f23d538637e" + }, + { + "address": "R2Tmy6uLAyyBVkV9c5EzLvx7dn7QWkgRCp", + "secret": "5f6cd6f06cc6c5658f2212002bb31984e98edce455cae435b0abd2dd68549c95", + "public": "03a51c801274b5774032661bbfb691d832da2ecf19d77a6be035a4e0080b618d8e" + }, + { + "address": "2FbLk1kx2pqoKJifFNVKYYdhxKQEJLqBa4p", + "secret": "bd3591b1afd596cdceb604d4c8755faf9effaa8e6a42637066db28b22bfbfd7e", + "public": "03717c0ad9214a4e590fc0379be9696c4168443458e75a3552cb1cce9f40e5bae4" + }, + { + "address": "D4F4Vo5xPLu4YX1sTaKzQfUGnmGk3yCUb3", + "secret": "03e60b222f3d7571669e7f943e85d08a65693c8d2054da755149802a69307411", + "public": "03078a2be8905c0c4bd5bb15bc52388f90c996f7e59c8a0351dcba8876e0102c55" + }, + { + "address": "uZKWALKm9AYC3GQxxC1T5i4SZTtDaQ3ov4", + "secret": "be694dcc0b7c37ca2251b509dec610b1501ea16cf2dc7e48fb44953eb881373b", + "public": "028fb5be4d87deb707259c4fd9fba441f3f89f171c9b5b39cc7cdb3aa694694bec" + }, + { + "address": "2Bg7DduvSuHQQodT8rDm3zgubnLApfwe1qF", + "secret": "6a10bfa1c59f6d4cd1be7e707320efa6160853bdfbcc7969f9b30fbf0a9626b9", + "public": "03bdc46bff88f5854dd6aacf5a69e8b344a45633c6b2fe46b902188f70d7f4af46" + }, + { + "address": "XLkHshahJQ4QM3XdFqeuTEfzq2B2Sut1gB", + "secret": "48d4aed38ddaf9131b75c34976cd6983d4c35009eda7461217f9f24dcf51c854", + "public": "02ea0380924ec74c9a1e61ad665c283c6dd8e69d5a403318ea0c9f6dfe6bb71c47" + }, + { + "address": "2BPMq8EUBGRyrz8NDSaUSGT9NrFrcDjq1pN", + "secret": "96819304e4803e15daa655205cee676dc04417c368b9851280c2c54fe509956c", + "public": "02382b4e6a8feb6d13de1394bcd4fd9dab6e6bdf4de96c9f0efd917d5997b94f21" + }, + { + "address": "2GGWkSEStqCKs2kGUa4pDbg4RxHJVhh3DyQ", + "secret": "e81e01c500a5f159cd5451b054568ee1ffb2700ddf61fd38371d0e128934007a", + "public": "0270cfe30a0fb41dfe30b9d897580ea16a401c4c41babfb41a78b1f20c12caf0d1" + }, + { + "address": "2JAihz1jHZxDVSJ478Yx2cdkseqm6ZfNnr9", + "secret": "c40ae6bb5a1c19764797563de1eb978ba85c686a379247adcf36426918f8f25c", + "public": "03d8a1fd67726ce2aba192f8358ce9143b8eec0066d80e93333f27931c8c96af56" + }, + { + "address": "2e3SyTQALdRjunDL4VpUkQqZ7kL45twGSvy", + "secret": "443200ff2becf64f313a047c0afe64470a1b79ea56802a2a782d8a4c3b0e8bd7", + "public": "03245acebda4649d21578bd2ac5466470125d9785668e0d0e6d6969ef23d99dfc5" + }, + { + "address": "iXws2tgmeN1i68GAoneEcEzASNosHZCrR4", + "secret": "a525b3c37481552bebf2b7f6849d5cbf8d891f804427ceb01b4d0fcffc3e6a6b", + "public": "03631cb9c53d25e67cede82f50e5fb1c905a166569894b2f1a75109253ea455ce4" + }, + { + "address": "RULqwD1WjY678XddBPK3qRJC1KC1MLg5zi", + "secret": "9d465bdd07bbde238dc7dfe872cb05a3a8461893af61ea37f85a8805edce44d4", + "public": "0379f5996ed66ac9a17a990cba9b619cfabf87336fb41043145d240bf88c1c4087" + }, + { + "address": "2e4ekDcVtjG6PHuaeVBd6y7JSiLKphizGo9", + "secret": "601832e7a373217b5c84c5d77cfb1581069f970c0ec3f96f59f2907a69bb9c6a", + "public": "026302c344271cc040efd6536cdf77fb09f2a8b7cf49a2159a595770e25a741873" + }, + { + "address": "2iLYSsW9o3GGnEWRgcuPiXrmZ3xpKR5SbH3", + "secret": "130179676d01bc4f06e818b9746ebefbb2ae3d7aeeb287e85db1dbcfd1f12ede", + "public": "02057b44f1b07039ff175a24e133240ee378d036fa07b82b6f897ae352b8e9c66b" + }, + { + "address": "5Xx14ZZYBtd32jH8vRaQVydBo37PKDPXSn", + "secret": "bd8f3c1423a321e75bb1358e9e48befad2730aa0eb351f35b89264686482833e", + "public": "024cac9550b8b534595cc4b648335256ce22e25911cfe85e6b50a59484ef0a6331" + }, + { + "address": "28m9mZA2vpkYVRotYxaWU2cAJ5rNA4fU8qo", + "secret": "43e19b1dde61837e9237afd145664c21d57ef0878c298b22db20d9f1383c5a0d", + "public": "02c2d5b3e587facaa13bc9b480be8995b06cdbb83edecc7b9a751342a1dc47d3e0" + }, + { + "address": "k5zSTYgM1JJygeyj1HiH29quDhz7kp7CdE", + "secret": "037824cdfa5b27ea0918ffaa34a700a32a8d216f04aef0335d775adc5dd47ef9", + "public": "0257aaf74b90dce0b3bcc41b0d28ccbcb6f4bd6c06fb24c283a740bfae74cdc136" + }, + { + "address": "2Q8onKZCoJE6YLfSqENhPyvkHtxvduBy2t5", + "secret": "53e6dde235adc370674fa60b7718b8b8e66e37ddadad2c4a75acf50f8d1975a5", + "public": "0244e3aefc7b751b97ca4a0302d31f361a93fcbb1d89ac1b1b8bf6039975c6088e" + }, + { + "address": "2K9tDb6pEaLXzndCDnSEotEiYBQazoDEmMd", + "secret": "127cf350a9dd07e2622d53b5c3ddbf73030882d55538746896b135004e9668e8", + "public": "0299325e94d7e822b53055d1400a91d914993b96b78b2273d52e9032710a2d7404" + }, + { + "address": "2Po1yzP4RSDm8p1w1tF2nbwcUcCKaEEoQJq", + "secret": "74ed922d8ee20fa41c5cbbec171d1248da080b3a974d0784737709749c6d9374", + "public": "0316f6d02dc551aef7eb45cd6d271a333ffea11c2a3b6c95ba84f44b1a7e366da9" + }, + { + "address": "ztvFFxYHYLzGDmW83chkUToB8Htkz8119D", + "secret": "1696d5006de140218790c9620873ce0b1b605711686a0b9fced1c0b10677b5be", + "public": "025d0053049ba7034a6d227041ee2800b3d4b575506c85b62a0a2e22791f88c093" + }, + { + "address": "22QmSnYryfxUNRpgM6j9uA57Dn7Jhn3JxFG", + "secret": "05042fa3951fcc1c3e392349d8589cefdc6a1eb6d986f497fce500bcc454b4c4", + "public": "023ec539cc83b92a8121c0e45a3d21ac79c364455efd3df406a87845ecb7f120be" + }, + { + "address": "1EXdxZfNk4VW9ZdXd8VHUah3nBmARtfD4r", + "secret": "291a3c544d77662dd4266425368f39e05b91ca916a8b0b4bcc773567b0bc461a", + "public": "03612f2c6450b0e95960d8b5d6b56dbb12652193f843b30cc9770e46761cdfd24c" + }, + { + "address": "AH5WE6cxeqJ7g8ThBWCt6351dpmqZxEtvR", + "secret": "387d9f7de29bbcac267ce51dd1cd09cce463cf4daa2e208f5a5caf79129cb03e", + "public": "02144e16ad2e88d743de602393d93b9154c30579789546f39b1538c787934d23e9" + }, + { + "address": "2bUvBzrA2rySkTsTz8ubjxUiLG2X2UXk132", + "secret": "730001c2c9564606fe0148a9b25a22150b386edbc657b81bcf63fe4f5e77e9ae", + "public": "03ae3acf63026f08d3369d57ea42f277c6b5dcf5c2c36f1dbe1d1d8b54b493cc82" + }, + { + "address": "K8jHVZcygoN3e7Uh57nUfQJzmews7rWi79", + "secret": "02b6931812541d3cb7de3dcc88c877918d477ca0cf6f25ee7d728059bf11ba97", + "public": "0225b37ef3f5014dd5b6eeefcc480e1b136c28e9147f98e14ffcbaa6ee2283ff11" + }, + { + "address": "Cr2ErUjL1UqhiVMVuPu5o73NDQhRFp43up", + "secret": "e55e26e1fa9decc1e8030bcabfe2c996e08a2a009984128e7301cb815d96bd61", + "public": "037599174736e30d76f9ecc5dd1107ba032353641ed7eb6acce126b0018c7ce71e" + }, + { + "address": "2UrDkbr8qkLaUJHMYkXN3k9xvmh4D19Ucei", + "secret": "4a8f360f40ee58ff53e957782eb3aadb861a6e0ec252339c83b5579c1990a37e", + "public": "03b9c9c0631811a24edf9e79901114d1d03b762561183d2651443ccd65e16568d7" + }, + { + "address": "2SnMjTtr3WRJ6q8GU68CnT3vMPtrXcRLiHK", + "secret": "9ca92d31e7fa4b7827126bab0ab02d2bcb608af1e9efbf4ee0edbca3c387fa36", + "public": "03856adf3f6a7079e6d42275a21fa0ce851eda69b1cbfbd96d25f2d72228498b1b" + }, + { + "address": "2dXPVZij2rRzCERmaXs5fjnB2epMy6ftAsj", + "secret": "28ca80b3f0db34c13e73b7ad5ff8605a6ce9099f06494a1a7b6727c51c64110d", + "public": "03545172070d03df86e8ad6580ae6fcebb6a775f2a0612d373395279debd7269e6" + }, + { + "address": "aMdRuCA5s1Ak8QqcEn7gmX9xFUJXebbntH", + "secret": "d24f4bb16b89077ab63a2faa921162f4f9ff33558c6ac33ac72f76af45cd6fb6", + "public": "02866b765a68f1befb293cce71775697e8cd03cf3102a9888f337e5b1703e751d1" + }, + { + "address": "HJd5e87cu7zu2GEWweaf4SVYX1PCxHnHmE", + "secret": "be3aa9e7df5bf981a75ed0b655c7490d2611c23b973a902d8dc5295c4b41b555", + "public": "02833598127e11f7935000892baf351e5a0de50a008d5864f9a951fd5449859e66" + }, + { + "address": "RjvjFhLR8UWA8UUBwmyPFV4V99snhSujJU", + "secret": "9f17ea1077558a3c898f0d080eccb1bb2385beabf092b3f84e027a9a84fa2e1b", + "public": "02f6ae99ad5a0e79e75f681b8c365e33ed31041d6038139c8f0c46a9cc467b0efe" + }, + { + "address": "smnUYq9hco8u5Q19wWRNtMieS91EA76vCY", + "secret": "b813a912be979cabdbca7b9b7d432b6b969c8b7d9b9b0c69f7e697945989aa98", + "public": "03ac5574e7787a94d7e79733f7c1f428805bd502608888a670e41c548cd3d466d9" + }, + { + "address": "2KKp3DbztvFi1Dq7fCbqJW3jyMLxRcVgoXf", + "secret": "8bbb021e60073065cd2250b0784e47fb0cca7974853166e3e942c070ad192a95", + "public": "02fd39b777e33098fa4c953b2f98660005a27fbfbea9c8ec8bb96fda649a139edf" + }, + { + "address": "oPWJvhk5tDy222LCYAzJUJZce13cVoZTba", + "secret": "0ac8ae1963c9b62b27d6a0dc32a21daab5197c4e81ce81bd5f06253a36b0eece", + "public": "03c29d315728a212c153f094f68a93693bb09aa3868f5c0ce9dc349e2792f0bbb9" + }, + { + "address": "V2KpF1Yoht3iGMEpJ6VKLpm65uYxEmk6L8", + "secret": "c1786113036db1edbd2e7e85322ba5b0f49a71b49d975cc503ec0bbeef70c8ff", + "public": "02a7359427fc56d44639ad1823805fe2790034811320361c0884e8dc3f9253bea1" + }, + { + "address": "ghZL4ds3pEAQ86zaZ2VqXaHajC7AWPvazN", + "secret": "7ecedb39e58d7dad0d035c947e350d7266a836533294dd0b645288f31fb6ce3e", + "public": "03ff6b7ae9a48247ae440fe8277a748995d1294ad40175eb63810864bb05624984" + }, + { + "address": "jRzDnixfu9hJoTGA19diDvUZmx4wFMFzYz", + "secret": "184e8fdc7e1cd4d666c578601f9230f93611f465bce0e429b2e7406f41a249f2", + "public": "030e121a88721a5e312c6508e3d76cae63d27cfcd5fa0d5109a620174bfecc7355" + }, + { + "address": "24ZgZVdovTJGACYDmzTr2UmCiXvLS2BDisr", + "secret": "6201e4a74d799d9322a373d5577466f0b958ebc66e36b0c943837be70c4856c1", + "public": "03cfde6af9a8673a45c7394073a7bef3d5c734ed5fbd9e5d6bff0905521508f036" + }, + { + "address": "9QLaTBBFzbNT7FqtLyr4mC3SjUF81wscKu", + "secret": "e14ed2a6506c03fb7235637ec696508d9a4f224130db2112448284d97319f729", + "public": "0257544ad0489b631d7f839ba50ba8d817fce3b68849b014535c7c579b053af479" + }, + { + "address": "2mrdnsDH8GkDxzTfKLGM5Qic6twVNnUzUCp", + "secret": "4272244bad296247de956a03b15027018dc3eaa997c7eddb62e11eb4b62a5fce", + "public": "025079ec188d81448851558da00f1375167a99f5a47ba55178c23bd5fd83e8fdf8" + }, + { + "address": "5r1ppyYuyjxLRchj8iR88z2v2YmSjA4uRH", + "secret": "41399be04144c30fba7767d2a8b320b051efd72727a73b0eede7503a150b82c0", + "public": "0348852f17e6e423f99a927ae6711f0ca386950dadfd23e87d986e13c049249636" + }, + { + "address": "d6Kr1rcKXZFsbiA9XnAvYraR7K9b14mtJN", + "secret": "6dde963a31bd1c4ea9dac7c262a503f73f7f00a30b6bd684d39c7b774fbff32b", + "public": "039e9dfa055b56922799d5abeb4d9ac9afd653563b5827c1c0a3382cb33d32b937" + }, + { + "address": "23w3Mpx7B6T7YzS61KzGRTdFaqqVhfhSPVh", + "secret": "3e1e627486422c1e38525ffd5f3a20b84698337fd376a6298914b9f7ad215cc5", + "public": "03fc41d428a7984ab2e8a86de2c72fc843e3cd0822694a58b33f1d30295384b091" + }, + { + "address": "2UE1RjgYByFJTaZWm7CASrJ1zLpD6A2ibpN", + "secret": "1658c7ea9d9c887b47df2bf778a2a9f02acc7342c7ee98e16250e51193f70e20", + "public": "020d1c92e2a29a11e5b77449d817edaebb620f4bcf089108fd5892d5e293760855" + }, + { + "address": "2gUQycnLvW5PNbjx8zbX6qqKSMx8AZcbHJN", + "secret": "29990b7a22aeaea7dc196cd588c0855ae29b9cc501ef5f36a0e48493994c8121", + "public": "039a9f1c0426e4acc12d754e38373d7db58eb5fb5eab6adfd920ab57ee786d7b5c" + }, + { + "address": "LJJtdHQ8YwTXyv9ZiNTrCGgh8N6iud2jH8", + "secret": "0f7a45ac7fa48214e22ae57d598357c6502b0120a53f0846a89d24b278869625", + "public": "03f96bd4d570ad5e3a424ca6b5e1fcbe2baa3990e9f930d8d096ae6e72f41908da" + }, + { + "address": "2erBQmqWbCn42XHgv5mX4FGdYmWwGWNwJtF", + "secret": "fc8ca55c4e86af2ab9d79035618bfbeea89c4582c39f6a53cf254fa0334eadd6", + "public": "02950e3d4516dc08c46228b6a77b0f28d73eeea47fd4d31ad9fb9246ff0c02fb13" + }, + { + "address": "pvvZnFhT5braNsvEF1LEDABDLXJPPy9n3D", + "secret": "f9d86da49c0584a6640aa990599f0d9986f58650eefad763a7eaaa90b747666e", + "public": "0268c65be7256ea4d769e8a723698db683faccc1e21b1fd38a31a591825d07202b" + }, + { + "address": "6SnfZwj1UeVtzg25n9wnkj1dun4ZWHMUwa", + "secret": "6d3afb2bab90de214060fed091f8dfde04fa19c540d896b5c81495d98e5256af", + "public": "03484096e0e52f26f11fd5bdb501666d4c74cd15c291d038aa9b3f9680f097d6f1" + }, + { + "address": "22Y6d1jn78SCSrea9dipxWZsHMmGYVVzrEa", + "secret": "0669359fcf951af5c51ae9731c5064bd7c937015ff88842ea15971fd8a01cf8c", + "public": "03004bda791425eb21c1143628c200df0cbe2e26349a175fdcb2a6dd54e135e03c" + }, + { + "address": "c6sPKAa4oJ6pnVdLSpcsfBtvseHFCN66p3", + "secret": "983bb4b8c8390b8a00024074b43227e2afeb1b30080e91bdb241f2434cba3c9a", + "public": "037b6f7922f08910e0b282e08206517659565254795299cf212724bc10063a76dd" + }, + { + "address": "HgoqRHGQCqjBaib5JnGxzzqJerYpSQDoDo", + "secret": "c43caa26364198a11e898020edb42eb38b48715a7047b4a970b6bd80038c7c6e", + "public": "03b6ece9d98596d9ac7b3e2297c0b321a897bdb539f38c7850a9981ab940a464e7" + }, + { + "address": "vujxJAz6RJrNhwGpRKEHTnwFvTQ4mQwfrs", + "secret": "031b4b8e634853c180f13d3f8aebf5a44dc3d85eef6f5e86ae3091abf8e49a06", + "public": "03bdd90e83de029d7d1e9950d4ea800542b47fb1bb2e5666ab1b5ba4f5d12c1d05" + }, + { + "address": "HXdBWU4ned4Q19MUJvr1T8BkC2Y7gYJHhq", + "secret": "06962e39a38fbe298731924221cfa42ed0ae9abb105843cbac487019252879a1", + "public": "02363ee0442a993d4dad2666ebdc7465e2ad30b38f74ebc2ce5be39cc5731283ab" + }, + { + "address": "2mJtA9XppXTh9o2267QFqmgUc4vQtMxH4Pf", + "secret": "a3c41a8aa49ac7c989744f59037ab6e7ba02305e3ddb09948664698fb3c7b546", + "public": "025677fc7e26cbff2de1d162979d011fb49c2f94a51ae0049a96354798f8df9493" + }, + { + "address": "2WuGtr54gfEM6E4hzARgeDMiVke4mZGjyK8", + "secret": "e701ca2b190297d5b5d17fc8e85400e555a1cd4ce59d9ec9039615560d5a77e1", + "public": "03e4a81a81a0b38d3804c998ea6d3e40eca24b301d9200d7a40f47a7bef8b1bfaf" + }, + { + "address": "21SkhMpvCAxvVnVRa3QnKEocXrPbEfpQXer", + "secret": "06f71a679c3dba236d942839f9cecd105c93df008dbda4e88502a70c67aa66b9", + "public": "02e0b7a344d4a571cdaf8b0f46feb2007a80c24027f71848745568685a33ce9a84" + }, + { + "address": "2Hch5H6WNpXjExggAWUVUozAZaBRWEWvpsE", + "secret": "ffbd71a2fe82aeb6afeba8f7dc4247820bf479ac5beb7a95ee12e1d511736cf9", + "public": "028b22c80b41a8a2fdf64d78ceefc639745b87b6909dc4130c7bfa8828d5aad1f5" + }, + { + "address": "2FRNJ4e3FDtY9c8RALijiiXqsqZNbkHHGsB", + "secret": "ea2a4ac1c298304f065d00f113125596155c2c99641988240be833c09673bf05", + "public": "030f33fa43b5854f000799468b1802e61baf183baac079e66f124c2a133e3997ab" + }, + { + "address": "iszc3eZpwcUu1GQQSz3CMnN4veQ44yMYRs", + "secret": "ea333ff90f76fb162dae8290d0984043e39cf6339e608e1265fb5b747b49d9a1", + "public": "038f2cbe9174da40beffc058f1a89467b1c37dce1777ab9352992f90a38763f02c" + }, + { + "address": "2iaaVJguAHYeytjfLcDVLLJLVSgPtAxBHHb", + "secret": "0c4a939514204b5f8a7327b36c491281652900993a1d78d356cad26f4370ea23", + "public": "023611dea864deef27decd48b58def13dab411eb9cdb8c32662f457af30cbece7b" + }, + { + "address": "2W3ep1m7sk4opyxoX3k4CTsmgHeqfSGuZ7y", + "secret": "3b21495ebefdbe33ecd33bbd9bef707648252d3306256b3852f2c1e32cf19301", + "public": "030e7e2017177e74a272c6f231dc429d47d842b86032f9e825e26dcd33808d7052" + }, + { + "address": "27qTt9ETdo1L8WjA38ui2mVctqu1akWnPn2", + "secret": "bd2722b3935a9f91cb7d158a36a53c33a27f32a07d02f4ea160596d96d9d2682", + "public": "02932a6c3dbb4efebec33236009ed9f625560df67703ce162d8579af9c2c28817e" + }, + { + "address": "dBFXCh3oZmfLEadzRpZuLvp7b6ty6MUH8B", + "secret": "080caa4dbf128bbb328ec33fc87ccca81171ce16f30697b4198e247bdd49295f", + "public": "0260863678aacc4fd7ab87668e54d7be15a7a762a276070efd6cf3f93a285ee4a9" + }, + { + "address": "Vm38DRDiryXCdiUUy7L3ewfsADF8x3xrvG", + "secret": "9f8df7712861e96c82d2af651ebd06ddfe79b31635aca4539a018e6ee3533ecf", + "public": "02d40797f08f3d9ac42c73367db84b4243fc87dedcefe91f1ad44e288e58177389" + }, + { + "address": "x4FCuwHK2B8uxy6TcW7v9V4rMTe2inrjCp", + "secret": "ccc879b0ea61fc4960ad3933d592c407618af109c4cc87221fe9235adba4c499", + "public": "02ab01ad4cad7b1bcc9d20219415fb92fd9bc819f6cac43cf36867e8284d41d50b" + }, + { + "address": "2moHfKQdFLvdpdioxUiewyQz81yBKA2T22m", + "secret": "cb2e589bc0fc5c3fc5f9dfbaf454f5c5d6eb2fc7be47a547c4ffceeafe074cfa", + "public": "020233f795f9380e7d04c9c8d4639c7d8ec598e4e4c8de59a4c73a76c3bfd4f161" + }, + { + "address": "eNpWwxqZeY1PYuj8M4M5TwoF3jPFsoKifj", + "secret": "73ba8fe059ce1c08c5c716300d2bc92097b9dd92fbb0581f624d7b064ba0fb29", + "public": "037382d2900cea5956f8cdedd21e8cd81a63ea0227090deec7f5a7685279c711f4" + }, + { + "address": "2g51QorpyKSr6rrCxf4dD4CeZEYAMURc3dw", + "secret": "f3861c2d1e69b93b666aacdf0cc2cdffea36c7e7b83dc1718829ce79e7513c68", + "public": "02381d60f8d1803ec10ac693e9d3060b9b796946f503ee7eb01f967c8bd5e5d89d" + }, + { + "address": "2DKTyBvzGiaPU2kL51AVubLGQFq2mjTr4HE", + "secret": "c3b3d02cea87e4f6c335784d4cfbdaaec7bcd7e45836567c60230f49ec8b304c", + "public": "02274e27234d8e7a0a15155fda616f7e75188cc1b96e463ae399d77cd17ac56db8" + }, + { + "address": "2CFcXpDqV5vNd4UzoHTsjPDTWuryZcQExsR", + "secret": "a239a35c1279ceeaa4f6f23837e92c464e71dcc86a2217587b1c1d0fdf9d4657", + "public": "02c8dfb3b231c7ba9cc67d84b9c6fdae1945f5c61ea5ff9b443abf866e373e2050" + }, + { + "address": "2gDrnTUUeZ1xrC3hCJyXhkrkm79yABLpdxP", + "secret": "6c3652adfe9e2cd2704fa0b1181b90ffd7dc4f8a4153a633103057e08b5ff881", + "public": "024b3b047a60af29f997d46cfe157a57bc77bd53a894dc6c8557d038e6d817d763" + }, + { + "address": "5fHL9AfwcqgYEMvjqyX5RVeksU5x4hEG75", + "secret": "f3451f3fc143fbb7dc7b1302841dbfb29c795dfd86402e2dd625c9870382b801", + "public": "02a858158514e7355b25ade1ff88d7381c3a0bc2b3d0af7dc7a15fc085e3e9ef36" + }, + { + "address": "2BbgUyWCqJ66xaznA5o84Fu64DzBrCTwvyK", + "secret": "17bb9b6b89948673b6faf3bba8c0680ca1b77ee23b16e0b2b23d4d31693de961", + "public": "02fd5e3ac72dbec55b340529bf913c62075ccf8cb399d008c8716048468cb1931a" + }, + { + "address": "2G8GaA8JYfVqj3ooDtkzWN2fNideKU8b9xK", + "secret": "770fa4cc2d8f1a8a686281e8aab3ff589a852ae450983bc3accca5080495829b", + "public": "02d69f91cb1e70caeaa8839c1635643b0360f0cafc9d890ef8c1bb7c91ca40ea35" + }, + { + "address": "2BwjUtSuGKCph4EfkthDa2CdyaGzHy4WDjD", + "secret": "b6dccd72e79f39bb939f2efdf1a90868a09dadf400629465e1ab97e2236ee7cb", + "public": "039cc9b2602ab2ffa175f87ad776a1e040555d4dd3485fc09a03dbdbe39c8740f7" + }, + { + "address": "wa5sR5oYKKY5PyqG5rnBCzafjhFmU5Mk2o", + "secret": "3879cdb11ae8bd760a2378c178b29fd694d3c7447e03d161f8fd19dcfad6512d", + "public": "02d6fb32ef1862b79b935dff7bb5aa868b040749ff08a9dbe8f6054e953dd3504a" + }, + { + "address": "2APKsjpuiYDw7DgC1rK4NEtGCu61V4zAc4o", + "secret": "91b23e1ef44587743475ca071a4ebdc3be0e87ffe46657be9299e17b3f0fbdc0", + "public": "0314cb0648861cb94994bc2631a4c782bcf0bdabec37bf3de1a170fd0503b9d258" + }, + { + "address": "2FwB1ZYgAB44ENWpudrpmYujkFZBT1ARF2q", + "secret": "16f82f75f6ea09ab92cb4110e1a397dd71fbec81ad7faa9c7a54c90875757a3c", + "public": "03017078b4d051aee4050e7dacd1b886cf27432d4e90286e47fd9501922476617d" + }, + { + "address": "WFNNgbZzsTztN2HvLroNXNDjP4y2qz2Wgw", + "secret": "b245f9311b8a69ade2b61164e18585ec636b0b4b9a5356b7561950c9b5beedb6", + "public": "029b5a844da9c824f7338a5d759402f7dc871ca4e331f38bf363f7e91cf7057ee3" + }, + { + "address": "JrF81tT3NehqrGLEWJPqTntBecMkZHbTLa", + "secret": "a7fc0662dfd8fd39f8589903c95abc60b22cdf45ad67fb2a5a65dc7e2c3ef9ab", + "public": "03c67fef9d6aec9e842b7915d78a060ae2271b01cb8945d1e14fb8c16ae2b8a3c5" + }, + { + "address": "h3vEzWCwWSGxyEXHhmVbGurjYNfJbnxgpX", + "secret": "287cdfea83b55bf184e81c0ea6889832db112c8a8762f2331d78caa7cf9baca7", + "public": "02b1104780c99c9e6f9d94ae9a564517362f374c536271f18fdad6334f219f45c4" + }, + { + "address": "2UnSqnvfPVgWXEuNuEdmBKoyJ3xBvPnY2fo", + "secret": "df35877a008cf9e514c9f64b245b5a3e0ad134bbc2e95ce9557551c79e46fd52", + "public": "03284b8af8e7cf913f02734f74a00a1df9102e8f6e93e826176a830a7aa5324fdc" + }, + { + "address": "VZptjy7VaWQjY5crMtFbDWq3mu4t5Lypso", + "secret": "f91ba72711696fa175a549dbed4efdff703664fbd7dc98dc7c64619ba32e6390", + "public": "02b1bc13a83d263633164df5fb9eb71e913105bf2e6589ac9b5607223f7170b481" + }, + { + "address": "K6Zvz4DHtdih5k8JBcPdcXZRRDhTBWMtD3", + "secret": "fd515d026596d95fd283ea3ff94a3220e58c1e283711f79b0720d8bae7df5801", + "public": "03bb2baf3490d40fab6171d4d2e4387d72f43d40f516e8ea219530ebab2fc19a47" + }, + { + "address": "23WQc4TFLtfZQADK42fTfqLvqd5fVc3eCFb", + "secret": "9f49138a3f36e5fe5b2b020e7595ea39cedb7db6c55da6864d15966b118ab3d7", + "public": "02a25227209e5620211e2b5c61f20f7376c83015fdd338f6ab30a5221d71a5fcb7" + }, + { + "address": "GLSoByoK4BEQWfiZ3rbLqLxmSyhfijHrbj", + "secret": "027bf03c34f696cee5042061902d4b15e7f9c5163e2abef6d2bbb24989e3660b", + "public": "038d3c9c0734574ab07c02d905a7c045571803fc0ee93cee1626b3a15b4c993f49" + }, + { + "address": "tNdNWcH2F96PAUtB7pC4n5M5TBSTpxKVse", + "secret": "e9415a0e3e395800cc7551be12b54bd04dc3c4bd29995a031dbf11ea3121998f", + "public": "02db97fd454c0d93e60841a153d22471ba7e82b6aa2e3f49d19fb4bc52a8c1f5ba" + }, + { + "address": "2VNyTcriS4FrYVotvAJaqmQuYwYSBAYEKjk", + "secret": "347e2aa0653c13973c2694e3bf368f9e84deada71edc0cd4d6f8b587b81d767d", + "public": "02b4a1fa85c4a9d2a6868efde449a41249bb4f8c1b3081fa9dd0085ed414286497" + }, + { + "address": "2eu6HH8nryPEjbg9TMvxNi5miWwiFHdXEbf", + "secret": "e1086f1538f9f99ac01dda8b722c6973ac2b890fbd8c0836115a1ecf8196c84b", + "public": "03e52237f3adc43fb7f086c089c452f85fd9fedf8b50bd1c69965124e7828c31eb" + }, + { + "address": "UG8Dvm24teXpSs4MWY4BpBENnT7BnFbDNK", + "secret": "3bddb147f42c46c265fa2cee35c90c182604618d822e22760dedfd5bc2c41199", + "public": "039087ce76a965f0b3dbbcb3b3532544b94c96d73ee4d41804f358d19648642bce" + }, + { + "address": "dzdJh62tUkWbFkHcEJYNeDrNYF6osZew1S", + "secret": "e5b4fd658c62ede1ec0a9b073ab9a70cf63fd0cb55a00d173657893c935d4909", + "public": "037a2e8f9a1600a8550a27792d7a543bfeaf4e6183f2ff280bef6c1f8ed85d9d07" + }, + { + "address": "a6zxRQZdY7ZurpcUXEo3GBpX5Kf95F7JhX", + "secret": "d3968dada23fbe55a954aa2d6b34c7570d5846a84b806c052c3a3adcab120b79", + "public": "03db3c65748908d1b55ad7b8c96eb8973df440e1971f05066636f4c39b53262361" + }, + { + "address": "2GGTTctwYB3iHjYBDE9WFxGXJLFBUn7UzXn", + "secret": "48435832c57f48ee7f19f6a09c752e5c2e0f230ce6ff1904445b39c3e9203e0b", + "public": "02c686311de0b0f37073bef4e2743c2f42052e0258e1dc6541cff2571268d1c852" + }, + { + "address": "2aVNmkkrKkCRSxe5JnX9QnvMhNXwwczk6nN", + "secret": "0eeef28c43478e967e0434dcd1231af081abd3ba31d80a8b021cf0fdc8847307", + "public": "03881a9cc92cf911a5d1c7e7c7ed6e1f38f85cdf42415dbc27a5bee88c17c52836" + }, + { + "address": "21py334hX7LKskHjLZhUPeEtJ7TYKVqfaFY", + "secret": "eb9e056f34028cf4546c287c7f4dc37c92d58c26b6546dfc17911359c93ae7aa", + "public": "02e3c5bbe2ccd4edee09601caa941e19847df1e8b40117557fbcf95354b817abda" + }, + { + "address": "2TKYS9gbr3CnSmAiLewX7RppUzC7r8NX6Hd", + "secret": "f792b0c3e445775b4ba17400525848f3e27199bebd29380474ffcacc1a8a6ac7", + "public": "033ed56d7ba7138d71a213adcf823d9728547e849afcdf02aa0c40f6536537109d" + }, + { + "address": "27T6vpidojqAZgPhFA1gV32hbAGEvxYhrhk", + "secret": "f5b982ac586e994fa405c8b57225d4cb9f79e6823439e930ca6c3675856bf87a", + "public": "033f52847eda3a395ba83baa7aff6c40b6c27cab7e31bbff2e59aad5fcd2c39f7a" + }, + { + "address": "fKRmxuEydH3xr84jJbM2RmXLTrUQY754CM", + "secret": "26d4a55a93849fdbe9df353a8a94f36fdc29850c26a80af1efd9052d77f7f97e", + "public": "035ef6fdf9d281e09fe89737a9d5aa1ba7a2f353471ccf753035a4d59b084a36c4" + }, + { + "address": "oxCKHFyceqKrQz5ufoNkiNou9vx6yiCxrf", + "secret": "7d88523fb836a1e68249bd8b30052e2dd0105f925b0bee6192f318df099e8104", + "public": "03be2cbff63238343dfa80072c431a7fdc09efddf529b0fd403722ae3976ef6981" + }, + { + "address": "3RJy9j7ztK14sJgA5NyoLMLAUNxAFg11Lt", + "secret": "7476b76ac6ad3254575f2cebf43333b02ca6b263ad06938286c00e217f39864f", + "public": "03755eb7bbd9500055a58a6c05144b2479888bc59d4284b3d66bbc7e9b8d78c903" + }, + { + "address": "99Rq9gQBzT6o7hHVh9mwBi2KWpDrVueokr", + "secret": "efc2a3b8cb9d78f38c3432040e2e2ecc6588125338224a90ba96a72e6df63150", + "public": "03bd8601f987579cebe725c52db9f343744165c023c8cc011b643df1cd0f9c4187" + }, + { + "address": "229uFKbAxjKb3S3dWxGLRUhU7nN2rm7AjJ", + "secret": "9fb9f20b2e6a51603689d48f53f7c65f3fbe37019f6e4dd86f37602599a8c4fc", + "public": "03735784436e95bd5de80a203aebf28f4ff01d51c15bc724cafca7b7681abbc5f8" + }, + { + "address": "R1EMZ6BCUN2euBPftE5P9xMcR2wH6wFyuV", + "secret": "29b9c973254a1fde206af582fb3bb1dd6fe5719180640d5f15a52c963bfa17d5", + "public": "0371f270f8f053116ab75c995f06ad975417c10a3bd6134d6032fffad8e8d08114" + }, + { + "address": "KbDQwkTKbeG5WSWJo1Vvp4RoRktGyDuUTx", + "secret": "55bf5909518a71986710f11bb911c42c9a2af2714041c2cd5cb85f3232035fec", + "public": "02d133fc33f2ecef76aff19b8e0730a1fb3b63287b1a68023ab5403cfc56d02f27" + }, + { + "address": "xVa8iZKV9oFwgCDooUJRpSmj6GV7HGywBp", + "secret": "8590b46cec2d565adf8e9463a5a28b3f8e3c6f6ac7ca54e7446f5f8aa61ee7c3", + "public": "033d2efefd95dc97173cec2327ef9ad8f643ef40811cee511e63370ed052904e71" + }, + { + "address": "mhkWnCSekNPca91xzoGijAzk7pK5xe7YVa", + "secret": "81bef4b4678092a023b72b425ba9518d577e86f5a8b9337f77ce3cacfea56f6a", + "public": "027616c1c5cf8efdd7a148fa20c037c2a3910ad6cb6518844aa56f4b8cc0cbdae9" + }, + { + "address": "2H5W2Jw38hV6eoLWNUPqExSJ8AuQC96Qfav", + "secret": "c3680727fbdd7b7d8b79d7f736886df08470801cb2a868e010b27e4d8414e1d9", + "public": "02811390fbacb53a0b30d76f70acc9da9e06aa5acf0166b8206dbc73c3836b5ebf" + }, + { + "address": "gBqUqD4wvWmsEMk73iZ77fL9QwKXMX2C4c", + "secret": "c44b381379048198f1d676149bc496aee52a78ae356cc8ada3f6ceded0b8f9bc", + "public": "02603067281ccef6bef438e77296ef76679128c0eaf4a43c215df5dcb08a1d15fc" + }, + { + "address": "2aBtN3zU8f5nHW4z9HgRyaviqQAx4kNoUBt", + "secret": "2584c7512d2ec4a9e2836db33adfd709676768b823266260d8ef86abcfaf3cb0", + "public": "03c64e69cd4d2c448425dacbd34b68104820d14dcda260a9e088e1aa6bb13f9832" + }, + { + "address": "MpJfVPxdSwDePFQqzqreFqFHyFPnFvPmxZ", + "secret": "8bf59fcce66654480b1ab5f0d792532b11829ec84b93ee325f4fcd7b7da99fa0", + "public": "02dc2a97e5e0b5986db4d7682928b3d18aad18a4375b2ca4f5d5b611592d629170" + }, + { + "address": "fMXu7ACfhpAddDQUcYMhFVtBjfeXTxPZSg", + "secret": "ad848094a7299cf5e485debc38ae745312f1de43297c214eca1712a8ed56aeda", + "public": "022e13429bd73cf57a0b81b2d14e99a6f215ca643f567275b9a4ea48aa98d2bc36" + }, + { + "address": "2HzJgfGUhaszpeqvvBkxTunGQWvMo4oi4De", + "secret": "817eafc5caff271c2a4caa381c4340d70594110ac5a5564b322b2bd9b7317fd2", + "public": "03f2f8dd9b867e863d7afc5e222d49788cc80f937b3a69d27775866f28ee557f00" + }, + { + "address": "TEfAFxc3b7BTnq2nBQNbwNDdNQVGLEDzZi", + "secret": "040e3177db9566e5902b2c8313d31e29aa17015580de4b66b0dcc3a6760fe697", + "public": "02a8cdd0040d877f7553f35021f8ff7bc13cb6f6f7b16d4bf71f1eeab8b417ae48" + }, + { + "address": "MQ9xeCGvPPcQsrjeu1tQ6h4W1Kf2q9BoG2", + "secret": "9aad6041f7eede6e858e0379c0afd24f60a9c73346be12ce9fa23bc58607f0e3", + "public": "032afabdf323ebf7b961340fd32b8cd5dceaca5b58f81f3f28bf547fc978fb34c8" + }, + { + "address": "23cxi2zraJZqyHLG1ModJpLBSohWDn7T9ZP", + "secret": "cb9886037a6d33329a05f8eb2668f9c68721682ac4f68767bbed2dd087938b5e", + "public": "03923baf3cc7f3e53edf3cdc60c7d64f83649ec9b8ad611a190bfc93f77cf165ca" + }, + { + "address": "2ARxqoM21PhW9zLqreZvoyhG2xuVQBnWVsB", + "secret": "b8d18a20d90c3be8509e1a1c14ea2a084c546dce3800fcfd64427e8e11cb842a", + "public": "03c6a58df05a703a561a9bda49ac053ee063f4684e2d689e64a57eb415a799bde1" + }, + { + "address": "2hFDnFqkKbfBgrShepvK2DazTQv4Lvcb2fS", + "secret": "300d26fcf88f23e874f714b16e5c9539064e74d3e5fd379e0bcd407811885ca9", + "public": "02c8b777679aa8fff406b3065f92815e1e7dd4e06acfb2cc2cf73d834640efba6f" + }, + { + "address": "2EMb44AyrsLU9tcMaGZH5qKMAWURWjXtj1C", + "secret": "2c7d8fbc9e91d0754a184b52363b2c5ce304031b30d7488a15ec53404ca1f81b", + "public": "03aeb51a80bd56711beef6bbbfc26cfeb2356e932fbc3c6c6b8c6d7442b1d2556d" + }, + { + "address": "RsWcgENNPyhM7KHFTo9VCLw5b4uU4CLmpU", + "secret": "ac9a2f724bba9198c756b026e5df829b8e72df7837182cff61a961a84ded209b", + "public": "0364313c902a7e6197e95aaa85218532b2626b10836d2dcc8078dd18022d3a28ad" + }, + { + "address": "2SvGwVovNFjwS91HNF1vrMjEfT7STTG9r4N", + "secret": "ffb644d19360dd7eebf66abfa70e492ed3a276aefe38c172a11b0284aa169541", + "public": "03f3a1532a61087e9bc8f6a6ba81102d429de7414ae0085ba9f51594e68e3d1a97" + }, + { + "address": "rZMkh43Pod6kpNBGNaBXNoqXotme9NHBC8", + "secret": "5558f95e18cf37496521c244e37fc0f842e936d20cb203c3a0e6bc8f6d2e8a9e", + "public": "03f571e0a9a233ce8cd348606b097c728649f7c5c1dcbe0f5ca2874dad3de77919" + }, + { + "address": "2RxvaL652F4Wyoq3PLjr4tFEaSbbeeJZBqe", + "secret": "f5b3d206cc14c4b57df04a2fabbbaf91cd6a7e9d07c1d09bde4c0ebaa43b3ee1", + "public": "03bf9105249ae909f87dab44e18a8a052940a17180b4da0f5222f8cb5f2562da76" + }, + { + "address": "2Mt4eBP7iXYxYJD59UET1DpFJSG6HoTavJg", + "secret": "7ffc75211c93ae6363522dd6b1750ff54204c0f1204edce6e368ca3b771ba821", + "public": "0221463c98407c8e24b21cfa4ec10960747daca19569ea4b3f11c71e98d27da0f6" + }, + { + "address": "qDQMt3d5dYCohkMT5B6izsGHkPRUeVZcLK", + "secret": "b683a64ccb4319188831f8ba86c7bcb596da63d10ce89d0ca64c8dd1915cf669", + "public": "02b6a6fa5b9c8ff7836fc761be9ab4da0d2e27c53ebde0d8869a7d128cc72801a8" + }, + { + "address": "2S5Nk6LmUD1cPeVk1gBkVT9ca47EPxrmZqi", + "secret": "d3874feee7af97339d66a43890b16e1fa4e490ad6d8bca3eb69ce2b20fd8ad55", + "public": "036918969f7908670b5dffd58efd16003757f43e647c7698496ef534bb7332703e" + }, + { + "address": "2j8fTL6mXwNG1aHz4xfGLcNxomnNtsDeyXY", + "secret": "0f3bdc50d6664a7b9b1b537aa8c34bdfa648c9a3cbe5f45afa88cdeb15feec44", + "public": "0242704747967357dda0fe5f6f2868e2e558dc7fe8bbd653164cf87b94bf309cdb" + }, + { + "address": "2kEpigdrfgbuN2sczody557JbVjLVd6CtZb", + "secret": "a34e6bf7b8d3b20500f51695d36b667d9b88ba9f442cf4290260baf8e15bedbe", + "public": "03300db6dc465d523c01152f1e91ff50537804890a0b4457607e5bed41ce268993" + }, + { + "address": "2KGErAn9X6KUykj175VQ6GWkcHTQ9xg4yvK", + "secret": "c6f96ec8d7b9bbd628852c417ec221fd8cbe301af5800914bd48886099a99a31", + "public": "027b6393a34246599475d26a5c35169431d79ce0b062d3bb25ce4a00b5f469b63a" + }, + { + "address": "Md27STrLZhDXCzeyiWV4dnYha4LLwoWbjo", + "secret": "2a0b423abe24b1554fbdf5a0cb23b8c537ae9763e94b27a4492ec5f73fe37c10", + "public": "0249ab7ea2652438992c2cda1f23b01678f9de1b037d2db8c1171c7e3a67fdddc1" + }, + { + "address": "23YsH6ZZcyVsVmoKhJ1GgFL3HudWQwUgrm9", + "secret": "db525456d04f0fec18a228065fe5c977e818854337937d491a4eeb9401236550", + "public": "022bbdf07624dc2bb2ae619781cf217cee4121fa53267a7e99c275ec9b692f8f76" + }, + { + "address": "SCWSUcZYva8MDEKRY7YmdYRoNj5sFe1XQJ", + "secret": "e0912a7bb851cedca4500657294f1bdd3fb6549f2187d458edd7c8cd468566ed", + "public": "032e20e706fd2f9745569d6f714c6fd0941f6c4b2806c00ecf15409a8d9256db72" + }, + { + "address": "2JgFxPbynhqiMvRREQ45cKiDdsiibSjK2et", + "secret": "09d3054ad1d287561b31569e18c1d46a3a45ff74ea86515c1d0aa119a993b717", + "public": "031e2aa54504dd6cfb2d6911033df39de005a31bc110916dd046bf15f82fc9347c" + }, + { + "address": "2k9byFja2RVJa4rFc9reVuNdn3Qq3cZFoRY", + "secret": "943b62a940a348d81993958200d8bdfc00c13b1b376478635e07b68f080a6178", + "public": "02421da715e7043dbab22e0016018e4c94e8bee58f4c9335fa115f0c83244dce18" + }, + { + "address": "2MoEjzeLCtzMPv8ZGbkAkQeC5479wH9ha4w", + "secret": "c65414ed2eb2d83ac87c77ac6646ada456573761400108b8e0d05de9a5ce5fff", + "public": "03741c4051901ea5bff8e8d59676f0fd6ed7763d295e92fd1d800c6363da1609ff" + }, + { + "address": "zTtMPPtk2wiUac2uB7Qc1k7JC6ssPnTeRy", + "secret": "79a8da2939915b0da33fe11abce0fe80c7a68e0fc6d372b500fbe06f3269d165", + "public": "02489ef908c3f224d8b8e68d7e9399dfa66ff53dbda4a452d55a01ca2ff7278d7a" + }, + { + "address": "21jfiioBpG4oYW8KjYpSs9cV14aub75ZQha", + "secret": "9aa3371acdc4444d281a770e7579c42d2b81f24b5e8c7434fd3754212b577bd1", + "public": "03d4e9be8f6b7378f7448435a1043636bf9a77602b6a2446c417c8f0d289cf04b8" + }, + { + "address": "2jhGXgUkXV7L6o2ooBSJTRiZp8voCXsws8L", + "secret": "312c20808b5c6ccb4305db4cc49831322ed841aa354c5e6f6f78ad58ea770381", + "public": "038aec6a7a2ff76b2ef68347d8cae7b6fbad292a07466ec69ba0643bf21ac3b2cf" + }, + { + "address": "hkQ28aDsUPiqtGAvVdhq9HS2JYGZPvSy7c", + "secret": "fa115d4a9929c01d41d7c1c23a197f377fb06166d0207f859bf469e75675c6dc", + "public": "02896b7c2842f4b641a3f723adc9445620f6ef1f6c354846958569349e19f15a9b" + }, + { + "address": "2HXGxGiyTiiA5JViSuYDva96pacPkKEg2DU", + "secret": "1091f0c9a82613f7879461d623e5420981116629d8163a6486ee564c95407f9f", + "public": "0277d34e24239b4be68dee716c04c4f29961bfdc89c0f1a90250d8a4a1b0ec508b" + }, + { + "address": "ETt8tPLv7KdEn3isJ8ovCk6Arpt38R8Xi9", + "secret": "2d5964c37e55bdb7daba25b8f73cd30e7658263f679a9771c6eaa76d73a469da", + "public": "021098ab98d1dd4beabaab7108e2dc267d96085defb391db4797119bdeb7b6c10d" + }, + { + "address": "2aL2T8aem5nGM2dzzkQUZyhoYziUZ2q6fWG", + "secret": "ce625aaeeb7aa8d0967c20a572040b71622d225abcde8c7166f0e355163be56b", + "public": "027ab9006f88a03876f9ffa2bdd87fb687f3c9edfcec37bcb4023f7fbed35832df" + }, + { + "address": "MKutfh1PF7dQ2yyLLyVyUyKLrCcKFcrXi8", + "secret": "c52636ac3ebdadae875e9a74b264d1b2ce4c82034415ebefb5827e1bb6fd1e4b", + "public": "029ecbd866ab779ed2cd90dbfb34b7283da00d3f9b71ed805ca92c6944ee30955f" + }, + { + "address": "BcpL5eUt2jXBMCUEYJMKbDzsNHqFbapSUf", + "secret": "0ec1616139c61bdcd4f93d86c1115077e769080410b5d077718d43715eb49323", + "public": "03550226d015d7cd3298e48acd54bc0a5698905a87c5ada8467d4d0a0565362f7a" + }, + { + "address": "C6wHriSkyTXN1MxkX3c4tDFUw8qAS6gZt6", + "secret": "7e74eceae672c54786531c9c37840da266cdccdd334271a4034fe87805fa22dc", + "public": "036af0726c32dbda8b224d655b1f572bcf625bc8701ecc1f53fa0e5ca45b2a5809" + }, + { + "address": "21QWTX5QyFovW5ezTQ2as3ndPtmk5ScYiFS", + "secret": "65da770ee49d0b6f62cd85db5153a6961d4345f02cd1e460209b9abac795624a", + "public": "03cb526f36a2bc9dce0adaa33c27cb10302927c9ad50de88ea541e81789b246298" + }, + { + "address": "LA9fKvqm5A9k1agtszrWfnPKKjgtu8VxFR", + "secret": "4e02f9b57a3ad01a77e30951c2ca97ca0955f39a54346ce47311cadcedfc2f08", + "public": "027ca7b0b8a83845c3d1318b3e54ba94fccd14f259865dd770b80443b5631fa10d" + }, + { + "address": "2TxMvLAFWwm145FndHzESjU6HZLU6r4vQAq", + "secret": "c0c11b487b7d307d0cce023520f94c9d2e5d1e656ea3eb2ca3adc1361998ad04", + "public": "03ac77cd63f2176fef590a3a30e619e4127fe6c1b45368682b468375bc908dbcf3" + }, + { + "address": "xd9dBK1mKxiXDBHgd9Eg35Cz9sLbkgcLws", + "secret": "ff38df8c6834713082048d42afd3218bab991ca44044c971774ff2fa7a0dc918", + "public": "029b1c4622f0248a0975cfcd8502fa6d528d6a2a6d397601af0628fd09b6c4dcbb" + }, + { + "address": "NwGDy3Qoj6k8nqRqaTQk7r2jUfzLs5AEny", + "secret": "b79e882093fd2adb54b4fa6e408cea0273f8252acd4179540d7fdda6ad367dcf", + "public": "03dbed449745129f24b6b18b68272ff5d9fe3008ad4670adee385b669674f34d4f" + }, + { + "address": "d4H2t1an8nB89LEK4Jt5mWdFokoW1cWieK", + "secret": "4d9d83192e7fed98e7db7ce06a84c0c0b7d909fecdfbe5d0c357f69ac9838869", + "public": "0259d4c22e3388e6720f75481de2c0ae3b45d08c0e1c8ba6876d2cda2c65d2d225" + }, + { + "address": "2jTF7ftopY2Hj6xqNeLGcWv9PtPZoo2JYav", + "secret": "5342506eefc9b01f50e4844179ec6d2c180e35b28b05f56b8f6af2de40f6edd1", + "public": "03d628a9bb74f35bc9318b7b28ba90421fbabd774cc0c004bb26b567c3beaefb94" + }, + { + "address": "2Zbxb2VLkptcheURB1GvfgCor8c7QMtiWbr", + "secret": "7c4cf9f367c4e6b48edd68b8c8cd9e8871f7e221374f2b5d8cd3d08203b076f7", + "public": "02aef811f1013bbb834716e05e798f73e5a6921f58dfea6c8c3398b9f3019fdc6a" + }, + { + "address": "2m8BVtBjvPHX5gki7X1BnyiTmK66t35mQDD", + "secret": "b057ced7e5492e9ded80586b5eb2f76114a6c251ed5e39b24c3ec21251fea1be", + "public": "034b17a6fd6bfd049ef97e8784cbf60e107c8221b78d5500cba83aa9e59cf738ec" + }, + { + "address": "2FaK8WZ1F1BKHSjbdhyfSsJsEK3QoHcJSKi", + "secret": "c79f87f1bf048398a6472d874391d4cd3b5c7a39a6ff61e086f175640d7447bf", + "public": "033db0c425c4155a970fd67804944b021d40ff2d3551950ed9da5c610a43425d55" + }, + { + "address": "2CRGhkAxp5buiGacrgrfubi7Uhn4X8KHJdG", + "secret": "26865442a8640529bbe092aa2f91668866ab75c8bf0749f4be250f873f62881a", + "public": "03cc4acb6abce20eadd4ac2733842dc94d8b8af31cc6ba1199190c48bfcd07e7ff" + }, + { + "address": "VNy1SQuLkrD7DFtUGCv2ZRovVoRYTgQxBB", + "secret": "246e7490fb721da5d00e3ef037a0cf91e83b9448db618d4e7f1529a5db2f3dbd", + "public": "02c5697d970be8cae8b2f74e5b8482b872f130fd396d317494865d761303c969ae" + }, + { + "address": "gRiFHzstLZD8DYbVGUwy5wnX9zA6yVaUs", + "secret": "d1e407b654de28a5edc1e76efe740d22c57e12dffb6651851272e1b50543822f", + "public": "03acd87ee0ba18abf1f86526d38e7e0e38869cc08f612439ee3a30fb3c35406167" + }, + { + "address": "2XAGsYg7bbb6wcFb6TJzSsutWpGQb95LQLS", + "secret": "e6a4e56812750dd194a556f6e0777f09fea03b4bb22e2529344f7ab664e64321", + "public": "031039ebe4e1d925358ce5640fa9b740238ce14f568d26835927449c5274e8a992" + }, + { + "address": "pYg6r2ysRY1v84tzCunvg9G3VZkF6cD2LN", + "secret": "7c553337f10619cd16eb1659a3edd2e897e7687960f27c6fc4b56805b048c3e6", + "public": "02a21ce35dc6e62279f2276e5a3eb684c6f15164218be90b39caf52fb2b5cc092c" + }, + { + "address": "wRT6Q3pkwHcgqWQBMh5QJQgzGQ9p2rDo64", + "secret": "b0736043e34e014da806c851fd4ba9b5884871f1a8bf907255d0d75087295424", + "public": "0231bdbf26e1d2bf65a713ed36008a6b471db068266de238ec15d02f46b1a349ee" + }, + { + "address": "Zu6t4hJBBUJU4ovfceA2HL7VSPybkzxPk2", + "secret": "1994b927514fdee4f75f6421a03536eae2fb2af384e9fdd8d070cd1b8bb1d310", + "public": "0220bd88e29aec79bdd0b5ff0117273722f4e27e37e2fda6211489bbe3df06c1a8" + }, + { + "address": "rj8c2gwEmCqPPQ8aeCrDTkJdmxDoScddVA", + "secret": "3bff5ba7558f7b7dbb57f9bac31ed15f5c8593497e847124808990dba099137c", + "public": "02f4de29bd53fe8376aee85bbdca748fb83bf80b1161efeaa3e23cc939035de782" + }, + { + "address": "EhEDFabctpkEQaJQ733WLfWUn6MpqZU42v", + "secret": "29da61ba08814ac6cfc1c06e931142afe3785bcc8640ad712d817de2fbb0eb23", + "public": "02c890ef71edf9fe2b1d3b8a8a7cd8e0925e9a55b093fe0e34a1ed5c336b0051c9" + }, + { + "address": "gpAimarggdCr22gAJ4kxiF3aQecXaxQR2V", + "secret": "83b195bedb8c8ab123ac337aa943fb8366e87a0b78a46f11a6e99811b754cc28", + "public": "0233a097a9f450f42884d32110ba6b9b384339044ad7abbdca8a9dbd10644c7c04" + }, + { + "address": "277i1qEXLAMWB4EWpimpnHSrVu6zB765nfM", + "secret": "d4e2ab32dfac3fd6db1aa5e48f93369f71fb22519512aa08e27780e900bcab8e", + "public": "02734ce3a6116b3701a67d169c0cae42422bf81f2e16ee10626ae8b2534fffc8cf" + }, + { + "address": "vKSL2GSF1kf1GQ7dLqqLsvJBXbaijecZwm", + "secret": "1e9ba0985d8e225e6b5df2a15e38503886df0fc2173b3e3d9ac7660a72f3ab5b", + "public": "0321019f74d1f922b8bb10eb6a5445c7fd7cf4e4dd4f0867bf64f43c0be0c0c800" + }, + { + "address": "2E83iNBy7MQyBCuHy42D69ib4fY3PmpJGzK", + "secret": "ac1edd6226835a859e5fe8c5cb1a0fdf94f68ed17219da5743083aaf93f3eeac", + "public": "03c4b5da359619972014f1f55197d9493e392aedc96d9e814ca71128747cfc20b4" + }, + { + "address": "CpZCFZEjSxMnMqeWWXuo3QgNw8zMUS35fb", + "secret": "db3c84f4b276bf9985c9a645f92a477fea63e5d5eff9a51c35d323a87f9b4c42", + "public": "03dc61b6619fb09fd7d69559f5c6775651b92c5c988290f481cbb7e7a2fb8365e7" + }, + { + "address": "14fcNNPALfDmtfjt3iqnUx5ECKozQwpNuY", + "secret": "00d33565e34e583a79468d6401a4789e7d623fb3e69d8d20b9f4d5751f7d0551", + "public": "0244b282442667183a585263c8a631c7abf0245228829b59d7314da2792066f92d" + }, + { + "address": "yqK6WFVBpuDN4kfcqVqMi5YDVkwE2iuozQ", + "secret": "e155a8a39e9e4ba79e16ec0ba2f7c60bf2bbb9b70011219400999a920706345f", + "public": "02b55a56bc0b74fd16fd17aba5211421f040950e9484483af788ea07dd3d7183e5" + }, + { + "address": "W51H6pd82ZWMw69h51yqufMkFKKTLJ6cUD", + "secret": "ee32e6b847c7061bf1a351c1b37ab31d7c2f7d530a59757c6c69929c9a50277c", + "public": "03186946c764572808287eff9ec29cb1db45511785f3ab3372d77ba90fb27c8f1c" + }, + { + "address": "WeBMYEagMqSvmHsFA3KuPAaarBwZyXGSG", + "secret": "1b3c9c5dd6b081a20bc2d24262b8007dbc2c541b71d18cf38c21f41451f90205", + "public": "031f28f96a5ea3640814207a223679603599e47b4f5f97f84788263760051d72be" + }, + { + "address": "xDmCFbvJ54uUFsWs9JdMVRc4pLgGSfMJg7", + "secret": "8ab8de8bcd5b3ca578efc354834fd5808e732785424f14041b5bd88e52d74058", + "public": "03afbbefa4aab3a996d06d66db94d6a2bfe3c73e2ab06866b267322eedc4e8ad74" + }, + { + "address": "X6yjHdHhJjoZd22mBKzPbtmoAdn1c1GEFd", + "secret": "960bf9bbad1970f6e29a9dc94e7257fd97c2921336b71345575b701853b1b03b", + "public": "029a88fc03edbea796c19081151942fadad9def61bacbe4acbb2d8e5cc32b3791d" + }, + { + "address": "2NtkQYTkB1Gtv5vEuxnJ2rnw7vBx2MaFZ3f", + "secret": "244dff8ab639cd4d1ae38e838fcb970d0e409440214aade40ccac2b0c93748c0", + "public": "02f15c4404d16679aecaf06a4c0a84599287f9a672ef81311c85b25f6d11fe2bac" + }, + { + "address": "qdUuCBtnWFPkqoLS4T4QeJhv1MTFd65ir9", + "secret": "328e730c6ed08d616ca8740bc05de4144f1f39a89b2840636d13dd9eeb69a1fc", + "public": "033cae48014b7dd9aaf8ac182b9d11acaf2119c4e8b136ea2eb8ef42a75e7b45c0" + }, + { + "address": "Ce24goELgjozPagSMjUJrKdYCwfzi7guUF", + "secret": "f37bba7af44d3338c12bd91f95d0879aed78bd8763925dc657faf33f0335b089", + "public": "038ec03df3b4b5c5a51abc135de0d2641a892382732fd2471133b70b9da2a99944" + }, + { + "address": "C5x5R9HUaTp5nr44tX7KgguMp7FW3874Ri", + "secret": "fa0d9ece0ac17368976ec01348503cc026a19510218f660ae0abbe6965233e2e", + "public": "029e6d69030cb4730b95648443820e3f974e70b9d7d5ce2a2559163e0463668153" + }, + { + "address": "2b8k8jUXfHnDpEDk9APRWowqVHMs1C6u2xd", + "secret": "fbe064b4fcd145c2155d717bb1916b1c7d73c1d624691b36bf7df1332de410b2", + "public": "0292d4e8e577b274d72e74b3fb54e56443cc2f4ea586748e86a8311a474457e2b4" + }, + { + "address": "MPZ54f9653bA1V9sDRTgPFgnYWdqdU7ye6", + "secret": "2fdf6ae40789196480461853f075b6bf34fda7f118949c4401b5d4c05dca43c8", + "public": "03e3178668134726e267877354a3e34383823bdffee27b3f7edde6b882fa4b2183" + }, + { + "address": "CicfeSE7jKdooXwA6pb2SFVmTKnBd2b2RB", + "secret": "a1f4b57b2de3389fd1b45bdb838b789a7699c5ca1d0bf458d84faa4a9e68512a", + "public": "0343a7cfd8b57d9359de6062547c3fda453cccbc4ba7524656e9ca58bd5e4f1ec1" + }, + { + "address": "2itVDbUu9t6Y1sJB5hqGUECp3r2mA1KEg3D", + "secret": "2b5a9358c31be11e49985c2f6e11c9039e105ca9175980609c7052cd5ad10b73", + "public": "03c06daebbf6d2c25955b3461fcc8fe73c93f1fb35ec46f0129cd03560137cab17" + }, + { + "address": "hmMGDgFx1gEVCA7FsB9Xo2AmiGXnYaZAck", + "secret": "a53404405b2c79359d04eaea710d283371a92e18caabe8e0cd169bb77cada7ac", + "public": "0332aed6d0d7cb573817142a69be2f34257bd95b95e04a7f29750ef284fe248ffd" + }, + { + "address": "2Hz4RbBvSeNbTwhFer6vV1Y7uUfqbN7FiFX", + "secret": "f5643dcfc17be04b092340b11fdad373d4bc5cab710761bdcfb94d76c005383e", + "public": "033fe130623f83bba6cbfeed537952d030f0ee3f99a4b9bcc18ebf6471274e1851" + }, + { + "address": "9Q5qJ39aeRmY8ippsZCiodMyon2wzfhDYk", + "secret": "37e970e52d13e3b95c4db1e5e5b8b13b87a03fcc433e81d49912726033ba5b12", + "public": "02d02350a1b27a087cf0301583551ad488d336b5cd2dec48006b6dcf2a08ab0509" + }, + { + "address": "pXys5mPkk4jwQW3xYRyqEyQJLKz4WEypsv", + "secret": "381dd50ffc4dcc059beeada39ce30da070c0fa67fbeff5f4b183c2c3e427e7c6", + "public": "021a36d9ab658c57ff3f5734eafed081feed61ae1d6e15f0fd56bef992ab9a326d" + }, + { + "address": "aVp2GMSoJaXJp98jfksbyGxUVmkyYCTyHK", + "secret": "9598203aeae46c16a3f57551ba6541dc83052eb62bfffa65c67beb66e2468c16", + "public": "037985090f64098cbe218815361bf49a1143de4260e85519b9bbe64a18d7a009a0" + }, + { + "address": "2d6weK4E7LmeQ6viCECBKteexwQfmXJefeV", + "secret": "55c82c51607d2612d2c558c87c0ccd2b1c1b02a16616d632f09eded8ca9eeb5d", + "public": "0378bb0f40994c3bd0d789b5cc48aea01872136c0e25eb27e0593c4f8fdae2b63c" + }, + { + "address": "17eYicrsFCUDmQ9Ay6k2enNG6kDRpH27Um", + "secret": "1d5a0997833672800fbf7f55b9dbd5eef6bc53c033c0659db8a474faba7428bb", + "public": "039fa99bbce21aaf219d1eadd3c9851280b447a21f5e42c3083e01243093f5d237" + }, + { + "address": "2SSfBC3MeLVgb3XyBGGXsKYzckjCbYKUgsP", + "secret": "c948107863c1f274f82c8e7759521f575b616fc0b593bb7a3f16cb84337ead51", + "public": "03fb19b4b9769665a86d3554ee26b7e44585f6d9a90109a915cfde83271d7bc5c3" + }, + { + "address": "2n18ViQiVXuUqwjEszaSWvi1kANDYKeQH5y", + "secret": "497d87deccaf1e7c30cf18833c580ac4263ae6e010273805b1940a0e652ffc3f", + "public": "02e5ee7a913f43f7f6adeb6a6f52f0eed025267b930426747909af342b5123e106" + }, + { + "address": "2UmBGe17SSXBpYpp1t68zCU9ojfjk66dYNH", + "secret": "d42ac161ded15f405c83b5bd2645ffb3f9c8f28095dbe2277de723395550a453", + "public": "02118d8b12f20485921989d7156e9cd06a9233abe03286992fd94116fa57b8df4d" + }, + { + "address": "U8YL4g25u9NnpALPn5aBGbosJXidvCooCr", + "secret": "b6b75cfa9529e12e39394a5852a077061b172da0cd6090a4271f4f942b82e7d6", + "public": "02c5094141d4e994dd81e81e4e91a6b81051370b96ebf41a624f3499f9b4525119" + }, + { + "address": "2U2k86ibWdUoe5BNBj54d96sw3rFYXnSySH", + "secret": "e715f598acf607c8552679d0d1833e4ca10aef44e4d662aca8ea84adb71840e9", + "public": "024041c3512656d1736bf7ee532a726ff43a4b4b93a89cf437640ca3f6f17f8eee" + }, + { + "address": "FaibKxHFYdqaorDr3KYXq1pnAYE8581MuH", + "secret": "cf2ebf9d3f6d34189b32c7e7730de432e6ccf9858becc80be734523c5876ce2e", + "public": "02b6b3963a2517bc2010d3042e5e8e595c6074538b22db7fdbcc0c2d6cf5931922" + }, + { + "address": "pB9Q5eXorXGxNZtxfr2Mzuk7xFBYNpMnEo", + "secret": "8f92555b725ed6e25a5e5805f53c5624b58a9706cb144d5a07d60509713fbdc7", + "public": "03c97d38b690b41240cd7e1bbf23529d178742736d6f1ff9f5a8a688747eda0e71" + }, + { + "address": "2Rbxzsa7C3B6cYTdk3Fun32woki93ewxvNu", + "secret": "bb6d4b2d400e6c1b631eed7d4f572fabb51081327bb6645c425d9663e0ef8a12", + "public": "0363d28fb085932c0cfcc17f1174fd70973798ce480af85ff4430bf0bcd4715199" + }, + { + "address": "Diq3gG7K6evBUEE8osDTPq4QKtXzbxUtDi", + "secret": "81b5d2598b5dbb522a57b67073bbb6a130f0711923448dff127c02861b03a946", + "public": "03b0bb0ab5ca2984c0f0fcada6907ca8250d22a001ee69380b083df443265e3a98" + }, + { + "address": "2epzEVetCYHwuGNZefGrZmzYtpeaHoDAQEY", + "secret": "8dacd77988acda3ff11b62ea1d8ae24b45d398b43f91147cac23451c5b68afb8", + "public": "035afc03e6b69359125261b3c78994c6b04525f09b0ae1c5111357be772ca88aa1" + }, + { + "address": "2Qkx7LFzEfxJzqWRPxTGjE4h8sFwnnfZSsw", + "secret": "d828a1ea868827488473c9cd4347c10408c00b4b42c649a975f9385560128607", + "public": "0381df65e2ae07acc12d48e09253698fa510bcc9c9f8ec34a136c9fe248c432103" + }, + { + "address": "gj6RTW7z32ScNorWP5WzHCgPPrh3KT8kmU", + "secret": "6d10041a9ef43512dffb1a94c82171ae2afecdb62a729c48072a877967d2264e", + "public": "036bc174c86d63f4470e151ada6b664dfd7c29bce402543ed249aa7ba67568df00" + }, + { + "address": "zAS1wCFHtdeUgwRWFY2N4cMCPnSTLd5R6A", + "secret": "0c072c2ec7c3a4feb9b946856082b9ee4f35295bf9b278349a254d3d12260c80", + "public": "02439f39e43b0a399cf84982f1e7085b5a2c0fcc248aa6ff6a7a80e1260c8293c2" + }, + { + "address": "6Fs7FRMk3GN8Z1wxksyJQTbmwjgZPcT3Qj", + "secret": "11fa5cc4f1da12b142b18f031b8de70588492f3f7c136b8227236da184bbd17b", + "public": "02773f6b07f15b38a96b3f3395206513372e92376098c2421bc8778424ef19a199" + }, + { + "address": "WpjbGPfvrPARdjnfARbsPhA64BU36oaKms", + "secret": "a3ca77abbd98c442c15ec3a9d755f708474576986d00a082b4999939786b8bd8", + "public": "03a4b79952218f7d035de076d464eb61ef837bf58db060a4765462c95b4342a8a6" + }, + { + "address": "26XKvqVnXe91pE1a6nnfZyjHRmNcHNQX14Q", + "secret": "816345565c3d408ec600f7f012185e5e35fb201a2517f56235e96730021a032d", + "public": "02d5ee48f9e78e6ccfcf20716ad8991624df0e2f08f9585071852d7cdab2505306" + }, + { + "address": "6ymppMLFLv9hDKngn3vUGXuKa82n8fVNRX", + "secret": "04341a22e621f8e46dace5b8f4e6b4a7160b864474c04c3d96874e02d1ef1277", + "public": "038c519a633e90ad55987f55ee03acac4bf269323dd3e5367597e56dab4f0a16dd" + }, + { + "address": "3BfpvXz5km93FKb1L9q3e4gZ5tiLoNN6ES", + "secret": "388a333fde8f497babb32008b17f4172849320f16bdd6688fd6582a52d61be2f", + "public": "03ed04ed7f880f3cd8290b53ea0f41f44f227e842abcc43d73a9640e5ce216a79a" + }, + { + "address": "EaBntaU8c9V3EnfSo6uALdB7NVNVm7BSfU", + "secret": "2f0cea8d8d0be0bb2b826b813cd24da9bc6a059f785dfca5f372d1fa3ed66020", + "public": "03893d78ebea3f3835ec5b88aa5b0fa616a165af23384328a1689c684af46f74e0" + }, + { + "address": "85ewkkmYE23QsaJ8QGHDQ6c788CUTDEh2m", + "secret": "8156a464cd249208b3456c7c1be5d8ecad3d42212278cb5db58d036503316501", + "public": "02cf694432823e75825bf1a9034c2b7ad054210bad5d58250b0dd8e8107a808abb" + }, + { + "address": "2fkBZZHm9KzJCj9uTwyU2EKeGVGaq2T6Tsh", + "secret": "1ba157b63be9213eac9504fe35bb9b8b8441256bf486e1184d1ec95de2360b62", + "public": "03026989d4b9ba7c82055586525a3081b52ef0bdec1c60dd72c5cd2a317d7b7b9a" + }, + { + "address": "shgRMgZie6idoREA27V8zzB4YKHp6g3D53", + "secret": "0b530bc844170e8c96e2fa0270bc25b18158b1cd0a0dc335a2082ad78ab952ce", + "public": "02b9be84fbe4377cb38084efb37101296fa74871438153bc7c10b50e648a467f59" + }, + { + "address": "2WXMUMWm9BxPgg1nu8Pjo9VAA3kv6z1wctC", + "secret": "677e5a6bd11d2d7950ed67cdf19b2321a7ef6735793540615d7dee25f4a89099", + "public": "036d544ff08e196318752c2d0694cfdd2df265fd37f8f701309b206169c894464a" + }, + { + "address": "9h7vgZXrxvpSNkh9v4di38NfsAAoCKxdTV", + "secret": "64687125d8d1d0301bcb7c7f8254148ba674f2fd7976fbfd478e388e2fbdaf34", + "public": "03dda10d0169d9492fe86e73dcb4bee444f8655a3ec54630599e1873b49d62361c" + }, + { + "address": "2A8uy8LLb5VxUt9z2V2tqvFJZujEQKBvHk", + "secret": "4418550903f77fb6afc475aa45f6d46385505aaa261d3333782739aac63775c7", + "public": "022ed942f2c7f4ae006a56d40d2f2973a9f6489539712b09755611e519861a915d" + }, + { + "address": "QcURHwLk8cNaycfrcB2Rw4eLojXTXFafrG", + "secret": "22ca073353e4e79b3568d7f273bdd4d7798f32211856394caa568c06e45eb379", + "public": "02a633a0584586a40799160dc620f5198cbf9288ca1e067cce1f9983e7cd536616" + }, + { + "address": "251iuEvBheMsacZDSmnQeekfPtwjQpf33hH", + "secret": "63751fb3da5decacd945ca81560f083dff8eb89807b8e9111e306e547578ad5b", + "public": "02ed51caff4445482542a0b6ff7156da9bdf7cfa8d722c7b181c1c402e5b33beea" + }, + { + "address": "CJPiAxCd5B6SEg8gwPDGFi8wfQ7MmmCY5U", + "secret": "1ac56d8474ba1909a44e93fd62516514219c3df4b1d83a0caa3cfc8a9926ae98", + "public": "021c30a39512cd8ae0a1dac9bbe80031548c2efea00046312e84bb90265c674315" + }, + { + "address": "2WngTwv8JkpeBGnz78k9WuzUYhspAcjV4zF", + "secret": "e077f3e181e3870cb6c3f3ee95b61c3cb61a05c40661073729a71e228940486c", + "public": "03da594d2e0fa86a0e77bc47b832fd1f270189b8e509dcc14e801103a202388467" + }, + { + "address": "282LaqNpQNhgBAGQW3uVJgTTFFbjX1qvAEp", + "secret": "26e1bf94fa2c8a12ea407e10bea604142e7b81c879cadd378a8c151503a1dbcb", + "public": "03609ceab8230f56a60c6d85f9a4ee0b5f3275ae6ee204c297cf3906404a0e607d" + }, + { + "address": "2M2nyEzS8KcEgBHTFpTpQu5WuCHMqpwyaZQ", + "secret": "485604374652f35a5812dd9b75019d7082209c02cf775e837500fd0233436a03", + "public": "03a7cdab6917f1f5d458774a1a6a37216da8476822bc1f9e89c66bdc7cd0650997" + }, + { + "address": "P9xPYDRBaZxSczCGXnkepWtZfvjKWcjAJr", + "secret": "9abd8aca5eb851431dde8a2aba245fa3dca2f196596c75bee0b4b1f5c54a8bae", + "public": "02baac3167bc9450f0595027f30bdd5fa52e8e7e2c3db98528b4bec3b116ba03ad" + }, + { + "address": "23avPf1yDCPwYDooFJ2uA3ygMshBq24oa3b", + "secret": "425570cb9fd473ffafa9c3b10aa9658301e94171cf6625b8a0c8f1a1f284575e", + "public": "02b3c25bc926088840fe0325c4c277d1e5e135ecc47d77ee30135824767a682af3" + }, + { + "address": "MFY41NGXYtAxyWsrSPFGojAVuLRUS24tZ6", + "secret": "aed7361510bb9fad15a1efb6599d7759ae3e4c154145f386e415d2d86af09b3b", + "public": "027658dc03f023433ebae5b19fc13110b8bc81786355a62cb0395fc4f3e44f200f" + }, + { + "address": "2mJhg63fvEcfvHkjABt1sqhsV9U1R9fi67g", + "secret": "c0739f6996b0fece57a490c12a6b037739526f709e56e8ec93db7ec58b27a341", + "public": "0383d00c097840d92b66c828d555f038dd23f160e1408394ab9708ad9602811803" + }, + { + "address": "B7uERaApqSwMahW6VeqZ2HekW6EHSRLuhu", + "secret": "e68379b76208250614afae494bbfe5da612e9c0de863ad2c916aae46f5a92887", + "public": "0256404e09850fdbd455763e45b75b79aec15b5eb005cb89b906fa5c6099f84ec3" + }, + { + "address": "68qcyx2YJY1C1sFvBkSPpmqpN2G88e2CvA", + "secret": "f9adaa10140355edb590e61818712040662491a6eb59765fd3d8364badcb27bc", + "public": "0321c06486d367c4c40313672c3b6998c7291e3cbe0519e13827a7c4049d5c16a3" + }, + { + "address": "2FaMkeRPxhdiuDhUhXqLPv15pnmsS1oSkqo", + "secret": "f0ad71ef9b7bbd682988ee3b7ec68ead4c9e7dae2e0fc41813ccf719b6ce2857", + "public": "02647a9839758ed0830bdeb1c1ce2769acbe4e8deeee42ee745d3d7f18e8f261d2" + }, + { + "address": "CFdDHPNwmVk6WhC39WCvWyrzs6SRo2bLXz", + "secret": "ffa8b3da58c93aba377e1292afc33849cd796d826d185aa04964473f0e978343", + "public": "0288f6df8b041860d17fd8d991c87a164ab51905f79c85bf93930042ce196c1df9" + }, + { + "address": "FKmFe5i5z2krYxQkg8NTq8PgPXRdP6xjLs", + "secret": "06e70a542984378260026ba1a0cb09fec849a6e3de827129be09234c45959046", + "public": "022df795fa62b6497c171898520b4012b89ef28e66dfb2ec4c01dbd83d6a633d08" + }, + { + "address": "NxKCPRWfvHmpavAZw5MjP5d9JcXieC34Kp", + "secret": "9ccb0d6970a675903491fe280f6b07dcb018d3d7e470f3c1a6ec2984aaee7bcc", + "public": "0220b8d468f5f1f65ef33948aca4606fd21bc8b908a28f14b0de18dd18ccebb838" + }, + { + "address": "RJgPnJMTKBo7KuEDPd7GQQB4DeEtyczUT5", + "secret": "3a765a74fd919c407a95ce6d2ad9491641589a60878b785d9e18639e3ed185da", + "public": "03fbfd66876c8200c688488876f227df16a665e50f455ad01b3264658797c54f73" + }, + { + "address": "2ZK6KxmX9T9qk5UnFb9SfNM8LvrJejux5kt", + "secret": "0990c94bb8b0d8f7cd3e7e097efc6e85525720992a9b8af9bf1f2e5127f11277", + "public": "0393941b893f7b4efa9d0ecc06df1b55d46ade9fe9b385bed458fc172094b9cbf8" + }, + { + "address": "2N3RdM5K4r3eYmHCFDH58CnUGx1gFMmx9o7", + "secret": "8cb43acb4b196c151e45227fbde9488d9e15bbf8da3a1b45b8997dada8700cde", + "public": "03f6c1da3c8f27ab64794a00599887c97f32cc9e42a822451ecf26d508eca9ad82" + }, + { + "address": "2H1VNSr9z5w1szqtva9bRUCLXsyvLNSXWrq", + "secret": "b695dcc4a615914926331365f1e894c6efb33078e44d87542bee580574f075b5", + "public": "035020067ebc6f0b5ada96bf2ee82177cbe2fab157cc6733cb52a05047e122e0fe" + }, + { + "address": "msNB3k7p23RwHgHhttqpuvw4psfysq1Rkh", + "secret": "75b36b96993b83d56a21376aefb2638fcadc03b3e1a1d67332aa4d5e05842167", + "public": "02cb48b18b854d05d3fe595c9036a3e0f486761c43e7dea7858a5378b97040f5f0" + }, + { + "address": "2f7axMoMyTFgCbkbsXvi7zRYgQFdhPZXh6P", + "secret": "04fbee77d3726559ed06eb2f63c11dcc231547910d70869a0e061cc858efd0fd", + "public": "02594db5ca23a3c18801205e3aa94b1e70e1eb632ff0e5fe092d1b8f109932a9e1" + }, + { + "address": "4nJxCkfZkzFC3Gcng9yB4jTYbc9jYoeWui", + "secret": "7b4eaa2f5be99c3ff630558e26ec8df249d2f3faa2f6d5e150ada68946e56024", + "public": "02d6e473a3f1d0ab1d10f3e49b22a0f10a0c7aaf6a91ea20a4c0cc402e7be557aa" + }, + { + "address": "yuGQw5TzntwHHSFZ3Fj1yNfU6DuVtrK2Bx", + "secret": "d716d9193356f96d634913768b0a9fd5c76378d87e472a20afb086566b17ba7a", + "public": "03442b91d87ed6772e0fb557ba5ad2b481c78cca2730b4ffbc0cb637c14472f054" + }, + { + "address": "1L33Kg34Gj7yccMoJKXj2ivzQyxihoybaY", + "secret": "4583af591c90d5df33029f874c76ada794ba7ba2800fbd91778131ab8fcccfa2", + "public": "03723d1d42bfc722cfdebee030af95936030f602ce3c464593eac6bb048df5989a" + }, + { + "address": "2NwiemjJATwoJ9r25Jfmi6biyYtBUJqZ7vD", + "secret": "c96a2a6ecc7c964766e15cb3e6e976500153b5d6192d8dd4520a8ac9077bac4f", + "public": "03054413578006144e776be5d65c171667fd0466f41c865fffa8d8ca4f58d3b46d" + }, + { + "address": "wh6cxtvGracfHfKPga1Gw5aAYL7YjiaoLV", + "secret": "8c2e6470f1505d55fb80d4112807f7dfafcbebb3e33ed5e5bdf844fcd8415e09", + "public": "02a8e00fd4e4a06e017c17f3d93edac7060a8f97ec4c2226552b6881d94e102449" + }, + { + "address": "2jTGRGAkWVojYeNrJ1PtE1ppcq2mt2dCQP2", + "secret": "f41b9f940cc71f9fc889bf8e1c42df2c8cdcfe051f6e9c0bca2f3567f991d9de", + "public": "03de30a46efc8ae7e14926487fd940bfbf9752fc48f8260d17362e59fcd98c3326" + }, + { + "address": "2gunAdaL2kStrQEcaiN3wYXpyuTZVdCQgJu", + "secret": "ad8a98fea822a9f6e3dde77720ac33b645f1ee653653b5002daf0b51b36054cf", + "public": "03e71f0b9923dea45f5b36f03cb39ec95091be101f50b515dc4e7305786265f12a" + }, + { + "address": "2aqkXB7Ktc9UqD3cpD85LXWM6K15sExbmjd", + "secret": "ed8a62664b20244f817ba415b88748ece10c6c017b47c1eadb6aefa81a1339e4", + "public": "032340ae72ed38c789d18e9c79337dc7ed3b758bf79ca46bc96d859842522579e2" + }, + { + "address": "wAzQNGrVRX4YUpa1cVAHHAfhDUNedenZq5", + "secret": "3142f3da96ee43338c96f9adfa031a4c8f9fd6c2ecb1a3445dcbb1120c25e9e1", + "public": "023795f20aace810257af3d7b3657f91871dd420dbf71b8325bf5d4c7483f64566" + }, + { + "address": "EPMifzsxYan5zGa4vQucqTqRhoD3FVppLJ", + "secret": "c4822448039a8158ce1df9226658200617b9567731d40eeb194932420d3fa3b2", + "public": "02d9cf102f49f1f4a179bc1c3f1b1f98d9b048521a4030adefec219c578b084a40" + }, + { + "address": "S2A5TZc9KreFuyALfSrAEqtfAnDpNZc94m", + "secret": "447e435d5b33194e4d9e4fc2843f0565a7d0d4b70f5aa9e5013b41f248cf91cd", + "public": "03c1fb28de9f691912d2a70babbc75bbb98f631600e271abfabf61d91cc8cc4daa" + }, + { + "address": "iAYSpkDoyaLaR84EfrtQvN717B9u6fj4qh", + "secret": "e7f0edcc22d803e6cb9d267e081749371654f455ca285fe89933c036dcb371bc", + "public": "033557467e9d623824a3fedd7291f0305b8ee6ae2425031a9950bff58174971671" + }, + { + "address": "2K1nzfXsFnvSVZwMJL6WEvhW8qxobLtaQR7", + "secret": "e7698cbafa77734600bafc754f0d9a24ef84b94c16d69ef4594c375bc0c849f2", + "public": "026525ef0253337c276ccbd8d7c0182ab7ab48583d5ec743ab408514d6af2ecb0f" + }, + { + "address": "2NLypD5yFCBvqNQ46f8y2AjTzrQtmdR8Amg", + "secret": "63356b3d581b1416150cfe17c698db997c734b2303b7e7364b91b42139597a14", + "public": "02174eda85628cdf4a38a6059ff96b58435c1f841d70ebde77838f14ce029de210" + }, + { + "address": "ycaUcxZ297suGDQHX8rAE2o66uBbaHSa9K", + "secret": "22f75ca0d85ba3ab8ab6133c4f8222cca188418422d6c8f30535f0db6399a747", + "public": "0287d014af5975037275978bd20691124f4d906be9c09ac5901d6388abc6fb2806" + }, + { + "address": "cvDxKoZWNEhuG73dxxjwBHJwHqHoj82qQJ", + "secret": "3cbc7c5436572ea5ff736489d84420158600d5c39e8175d3d1f752bc1ced2b90", + "public": "03279f03cfaa48f1eb80c66138e4e32b22b943c0b46c387c4a26dbd1cca5ac4147" + }, + { + "address": "2V6bLf431P4U8odSUTozXtNVyVhhfD1x8ks", + "secret": "4a9234206aefb76345294863efc3e344ac8294542d6c78eaa8f0f94a396eca29", + "public": "02a096ec8754944a523602aa7141c17e76de62c2d910edc107d9e5d2e2ddfafac9" + }, + { + "address": "78CiJEYytgY1GY3e7YkEEtc3iKUh17BsRB", + "secret": "e9fe953daa778f1a4e2ebac0f2d5efd9a10835d3301f51f6c23b3c03c1d6bd2f", + "public": "0311cf95a60d6e04ac1b08b3354efa2d364fc1f26d552b1f6f864379a264d49dcb" + }, + { + "address": "KxXp9kXfiUwqYApRBpSieRjG2gUz8MCAeA", + "secret": "f9b6f18626230dc0221df145949885138b66add73f216febbe8da03216852fa5", + "public": "0200780f30aeb162071b8e8f863d81ca0a9aff46fbf8475da8faa702ac66f7a705" + }, + { + "address": "TRXyHSr7oGbVbJurhkJGgSA3Q1NvPQadqs", + "secret": "189694b3d311db623cb393808e89cfcdff228f1675a8392f3a85882d116a442c", + "public": "0280a7a939f549d5d8c8fe377ebdde1413223b36708ea770a9fc37fc5bb4cfc742" + }, + { + "address": "2dzxhFNvfELuA7cPFsHR6z8NnoCZbBrwq8b", + "secret": "626fa9e02b3cb633ec3f5bd75aa7f39cb9c0c494ee9ffa1c059032086542ba54", + "public": "03aa1d51380d5ad3fe1e6c3bda6fc013d02dcd620784d5c1e37dbee85ad2296cb7" + }, + { + "address": "2NWM7ZKdpa1KAKbJGoh2kjKQWnF4PSRuTWd", + "secret": "77a01079dad73056ca87d84251811bd0e4925e59e64ea2a957fcab3368f56d5c", + "public": "02ab48fa9293ae86ce7eb083a2c90d8f63301e115052cebe7e1dbb281f424ddb8a" + }, + { + "address": "23X2NT6wQJicBDvZMUDysSV3wMgXVSoxMr3", + "secret": "aa7aff9bedd949cd11efdb243fea9e09e8a36700cf97d611122d9eeee9d597b4", + "public": "02bd0d5009b71f203acec6294881215d7db08595e9ed86dc92e634d5b0d2f23f0a" + }, + { + "address": "LH1YBP5AjvYaen4k7DYgFyAzqi9pKXBkgW", + "secret": "464afa06ba6e8c59a1f16315cdaba68549cd1616644a7a25b343390ca5d86bd3", + "public": "039bde448da1bd733e8582cd0a99f6288fa227e0f36f1e945603b2d83e5bb1edd1" + }, + { + "address": "LPedwEmoxZPp1Hfh2gM19aadcfjznvdcvA", + "secret": "ea2e750dbbaba5eb4f25597e27f0ecdad267de8404adbcbdffdf9ece9cb0e168", + "public": "021d0f2e38c66ea712101b9c522e9ae53c827e8c3124608ef64fc3cb316b4f099f" + }, + { + "address": "iuEGDZe6HGaVkR8Z2UgdDopPQaJZ9GahVc", + "secret": "88f6191752848ad861182bc02853fa7a62b2ef1e6a037a81738eee0ee0d5d495", + "public": "0224a18069cbaa5ce86031530cc6c53f5be72cce4affe5aa9e2fad32e93b231c58" + }, + { + "address": "2fFT7hVto1ijQx5S7mNtiRA14nkxKHmd8X2", + "secret": "a2a4095a7ee80b306c02c0dfa672f6de067ba62f6dd23e48cbf925e7cffeb376", + "public": "03b12f22cfdccd4999c0f8623e1b482f11679591198d76d7c448de1209c2b75a6e" + }, + { + "address": "2epcFgre2Cfgzr1nkLgB5LHmQNPxdebFHVW", + "secret": "3b9ab3594ba9909e49e46438c637f9247c3b343027196533047369af3f86d761", + "public": "034075500701002c771f867a354c5b63dfd7a27b230d6604e2b8063b945e1c83d4" + }, + { + "address": "Vwgtss72ku5Ud7UDZL836MQJohdcSuwGub", + "secret": "76690e5179208d5b72b57b19e492cd8201ee8867d5ebe40bdc8667af33b62da3", + "public": "03b88ae823021df56ada42cfc8c1fd88c7143eadea1ef884f1f0ee2e2943b8cdef" + }, + { + "address": "cXJ5ihXqFezFnWMygwsfifaskFT7xV4ghw", + "secret": "dc352ef72b282321a30ec9b0d959d4d9b77063a45f32d8c905448d0873460b69", + "public": "0320b8d9fb36ac1b22177930e31430d5b84c89aeb89ecdcd554872362c85afdc2e" + }, + { + "address": "2B5gSmoLbRppmBiHx8wxWwnX9Wt5XhV8c4m", + "secret": "aa687c90db3b0c2f87bad5455fd030bc8775dd0ff8a65948bddb2476f573aa46", + "public": "03bc34b2d5cfb361477821c4d7707f239b95c87d26e6928d4f3f4acc2d6718149a" + }, + { + "address": "CrMPQ1PjwKWnDdPVAQaSfozkHPuKzDe4JK", + "secret": "688c5018bec02673824ff63699d3002f80382aa6ecc7d2767f8f3c74ffb0590d", + "public": "0341fb80c77b69a986a39d1797a0c5b8cf1b9ebbcbf4c108a122b153e2d8ac3063" + }, + { + "address": "UxFfwBKAquEJYus4FZRJXu3Hqcrb6XgVXA", + "secret": "1be47e095bab584745b8474c9b8e3c1bd03cd14ab6d4cdad4278a33d804e6018", + "public": "022b2ca9b29ffab11f2ce848851c326eb8f016e7d402477c80fadea819b4c7dc2c" + }, + { + "address": "2bKghkQxAUpLRL2CH5UXi5obZR3e7bMXjev", + "secret": "4c8f815282e42bf87fd63533bd11c27bf2f684886419927ab539165869dabb47", + "public": "0327ff01fc52d974f53769efad15458ddfafc7526628faff0834b1688429abdb3a" + }, + { + "address": "yNQkWKwwyYaSWQRqxkuCPWLBDUny2VwRW5", + "secret": "e0a08d6aaa1efe1fd000901732256ef93946d68c038735b3ea99b54d0aeee8c2", + "public": "02c8c10b617f36160a432cf69551aaf10e5d92a3ef55b7960bfdea86b85c6a2aac" + }, + { + "address": "Ehy18wxh4BaU4H4ddKzhTe8upRdHdKgM3C", + "secret": "cf82029c3429bf9e3a2918fbb059dfdf667f56ebab79c62bb3379c4bcad9fccd", + "public": "0341b4c77a846dfb985f5e25c21dded44577d51b8cbd2c6728f1ccfea6f80ba547" + }, + { + "address": "87CxDUGMUEG4TbmKuJrnE81tnDfdbji3iD", + "secret": "7d9656cb64662392ed93c60d66c7c2e5c6d917bf955729c4672841b63e6967ff", + "public": "038a4b918b57f7b303ceb32f8b3e4a0a3f93907edca2c028b1eb1730890ff9de1c" + }, + { + "address": "M5Hd2UfGCYHHHAMRhhRNuMiH1L4PFTdBu7", + "secret": "7f96a3f77ee706de79268dc5b161305f0d60b32b5e39f827fb7c59c9d2c6f594", + "public": "03355b8c6ee5d09e41c5cfd0aefa230b3de94484bf65fe04b2b4ddad68a452cefe" + }, + { + "address": "7dCt8NcfvF2eqSDU31BSX6sdfbuYg6D7s3", + "secret": "c6d2f40294eeb8d5e9b05f79ff0011dcd641c318981f2a6fa118c1fee8301787", + "public": "026a28127485642665a7d791b8a94b7a19ec42ebaa30a6cae318ded26fc2e120eb" + }, + { + "address": "EfjaJj1zqUT7c44FtWTpTtZd9SctAsgYgN", + "secret": "5fa1c6aefa6b2c3265181f94362798bd97ac1157e2825a555c3a73ab298c9085", + "public": "03c51dbc5d349755cb608535d9678b67690a83ce6f4b4abd2b4b1bfa3d8deda428" + }, + { + "address": "G4t7VPjovTXpPkB4WFR5NsQs6UCKsZMrTV", + "secret": "a92f1ab3e1c387727a160af2236d5b1140b69016d8e328d0600e3ba933eae344", + "public": "02f5ef7788d11f164cb17facc1c3d755954373ad43c350ee22de71b1b4d3f6a921" + }, + { + "address": "EqnAHqETs7ZqSEwmVGcUBWENuXfF3AwX7u", + "secret": "8ed59413c05a8fb4258a38bc8e2ae33c549c31e953737433edccc00f6e281375", + "public": "03e99890fcf8468447dda686a52fcc4d2ebcb4a2a9598645cf17bd35e1b2036e4a" + }, + { + "address": "9JY67nL2TLrh4rf8W5KezEjakLffjJ7ZJv", + "secret": "819c8cc72b0c266c144c6c77f359d0c5f476fefc7d5e48b0cc32e694e00a1be9", + "public": "024eb7dd60ec2195640e68ae70cafbf9d3f32ed84491e9ef9917d50a15da31156a" + }, + { + "address": "eJhighy1FQDgytHobEPkFUrc8MRRDUrERX", + "secret": "d8ec3cefb2571360c9a63e100c133e1a28f5298479f6b71f24fd2e35a2ff391b", + "public": "02ae12cd82ddf09f2d41f2eeb4c89d7bcfcf7ea6d045825d5e7ff480006c873cac" + }, + { + "address": "sXKjeTQx1Kxg7JiUsY1s9JzxmaZAxJGz71", + "secret": "6d2213281136b28c2311ba20c7f06dfa2631023cb9c41600a343b12eab7a1fae", + "public": "03efe76de2c6f2bb427d311f819421fd737d9796ec4b5e884724bc83313bc7df25" + }, + { + "address": "2P4vNsCQX5e2TEFsA3phiEzzLNcsa55z5ZN", + "secret": "7e34200c29f235e7d41165de73e3e24345b333f2d62b1332d1645c79a131fe41", + "public": "02431861ed3afa26be09c750021b2f0e91b115216ad177403e45135346d037c421" + }, + { + "address": "2hK3XCyTcLDihcW1EpBqvRhUEfQTySJvtZj", + "secret": "26e1cbc5e0d46ed4ce85ffec8e2673ceb4703796b88a3dc47207f2e08dcff8dd", + "public": "03c07daec002df3915d53e49dd3bf592056f9ec01c4c9f71463bebf622d8db9651" + }, + { + "address": "CMyzndV7XRPcWyvLQtUckf4AqXh2BzeDaZ", + "secret": "016be155c064286b20c31e3eb78570aee436b4a1bcb51553a98a3b88db3f1a0e", + "public": "02dffd952d6087b6839ff2fb5406f8df0a588b47fa37f6b6501adef82237cc91e5" + }, + { + "address": "2Sx6BgyjTNa4SRGzrtQ3XczPtwKykMDNYUU", + "secret": "fd0f956556804aa600fbe8d179a5cd5293fa543f4b301496df71d44ca18f9f44", + "public": "021306263d266c508be82703eca67e924138e8373fad6db63fb082b173e3790a83" + }, + { + "address": "X54kZpzfh2QgJKptToev26n3DKtREcoPu3", + "secret": "5ebdaf145155d2c3b8f3c2058878121d4da049de70569287afcabdcedf9e548f", + "public": "0318d7c0dee3c80ed280adeddc136dfb8addc4a96a0fe1686ae40ad48c4538485a" + }, + { + "address": "2dy28oXtQ5xjMmk5WZoxestCyYrdDKp4k9a", + "secret": "9fef49579fb653c9a1cb089f286318cd125db8da7a02e1603a516ce0e90b9519", + "public": "0367c6fa57634d2dd0ed737eeaf9a968ee566f0f9ff8c080fb5d3a20955f1b9cd1" + }, + { + "address": "2YsSC6ULU9ud1HFPx61iK1EmbtFPwuPvLmX", + "secret": "93ca92327524ca10a615c97c803c31e181ec25e1221a66f6cf4ed45549832f05", + "public": "0272595118ad56acb6fd1a7e733d580fef7bd7177c8f5150e834daa4ade1f69d2c" + }, + { + "address": "c9yNnwGMSciNxtfCfDpZYQBqkKhcruoCBR", + "secret": "1837ba45ee86dbaa69529292dfbcc93c1424326ebdf8a77608f1a0f7f4e46679", + "public": "03a7a4a53f0e573ea39f83bb9bacd91ed402937678c7909a2630c852f6a677659c" + }, + { + "address": "2cPy9RXG1kqppk6hvBWJdYPusTM9oaNpaGY", + "secret": "5838f6f51f7ecda21c6bb33bb6878c0a9d25a86015dba6d79b0cdc472577dc4a", + "public": "02fb56f26293d4ac62f3e49e3b87e81c78661b8af91ccff7ee4f452cace307d842" + }, + { + "address": "2RrSuZnng4zVoTt4Ytq2tGqg9yYSXB4pwCn", + "secret": "97b347bb13110f84c58bb17e8ed424714a897f72893ed476f285db2e4fd8c80f", + "public": "0302adfd41a08a7f23338dcc45dd6fbd0bf3f4352f8abf814c10729a63c99863e9" + }, + { + "address": "3ThUUSbyeiP8sYcKUJfjTh68rZSBh2K1Qe", + "secret": "b5396837ab1890a661f493011d5d3198849ddf54f3620ddc89c7127cdc6e1031", + "public": "02a9b07fce49c94f70ad821eed6691d35435124528e4dfa060b218098794288782" + }, + { + "address": "2P7eu8oaRGRqfZMkm7XQCA4bkAMVuW7XarV", + "secret": "aa11b35c65657a62aa20b44fa2d79d7e39f0d50af94c83758db244e63cf3deb7", + "public": "0301a3fe3b088d93bc40f197f476017d02a3f269bf7e402bc30e8028f95eeb323d" + }, + { + "address": "wDgABtGkzH1fFoPRFRdXXPC8Eh4fbXA44X", + "secret": "e7e5b7774a59efaa663bb190f4141a443811fd915a0542ae6d5b80350ab4d566", + "public": "0398a4a1db8426a805b7c78a101605173073a26395b9e870894bcc19edad3ca1bf" + }, + { + "address": "2bxejRENs8r4JTvfcjzzPrYqAFHCZWZpUgT", + "secret": "fd684a261ce599c7e60b4ae3dd8c25ce6f379cd0917145e784b2d65bee3dbd40", + "public": "035ecac650a6ad90a0c7ce37c4a8f60470f720bc323665342b4c8a0891223e24fe" + }, + { + "address": "2KGpywnakyuFh8JwrQzkZVYZCNTUjNUP4QH", + "secret": "1f6f6a383bde7f74e62906fdd0e732777bdbe083d8cbc3f937911ea97527fb09", + "public": "02710b1c5b760022a5defcd04a471cb156304bc97b0f2888ec0319677de684d1b3" + }, + { + "address": "RtK2DJPZQKcDtFQUEvmjDrVWGzZ7yBL5SY", + "secret": "398bcee8a98af1760b796cf0ffb3b97915a5f7395976af48e56a88ff1723abc4", + "public": "0395443d2c26ad2e5b14c62d83d742c212741ea90a9f862270e9b6fa65f7f93eec" + }, + { + "address": "gSHFa7incxNmjnTRVeu9adx3H491Q6Z7gL", + "secret": "6f75672a799f02d99f8be68c3f5ec9cdaa4e225d6b63fb28413210592852339d", + "public": "0296ca726068a5902489957ec48c85cc9d77e868b159ba9ccd50e6a5a7208515b4" + }, + { + "address": "2VErjgC2zSFHYp8upgaUmYTpyqZm54HuaTy", + "secret": "d9a70bdb789be436b144ff6b337fc2179ae4dab76cd17ac61c69f81eb669b7db", + "public": "032ddb910371263818b94e8d5d763718ad8d6a1134bb806c1f6c84358482cc68aa" + }, + { + "address": "aGCeAXjw7P3grVg2N7ccWqvM6Urtsrr56k", + "secret": "1f6ac2fb2540969789c1e435cbf10e32f537603beb33afb9cc2561e1612bd3f0", + "public": "03930f9ac4c718599a2bb6dfa60215ea9679d393a57e2f1d0c1df60dd813b0e320" + }, + { + "address": "2Amstf2g1ABsQwZARZdP1hsyuTF2To4Qb7E", + "secret": "d5500918f2cf90b27f68e476a7f542201f881f62ab571c1a56f92b3ef2bbde98", + "public": "02d5c5807716a26bd520189294ee1394f9e331b052904bb74529e11af87ed4725a" + }, + { + "address": "LZH9W2Au9PdRNYChRYhQQ1WygQR2m1Gv8E", + "secret": "8565e2c08db9f98f6dceb06f01b6234960005f049360f9ab778864b278f53935", + "public": "035c4e48eba28145bf0c949a21b2d6d8ef0bb34112a5f75341372af93aa23d749b" + }, + { + "address": "tCNwshNocxoMVaRprwjnbfSoBtNXYdZbva", + "secret": "e5125d5a11dd0bd007cb96b665ce5a6924b3980d9707324961f3a5d98eb37fc3", + "public": "0203fa587df0939b087dcfa338bdf509674ae0b3b8c2554717c0f9bd0accf7c0b1" + }, + { + "address": "2KiyEu5BhXanjwmjASUNXS3d5fgk1ra2Dwj", + "secret": "556baa1dc55107be4cfe1c345350aa3d0d6c029b3b7e11287b06ef648ef799ab", + "public": "03003633353160cdf7887f5cd7a1631c28b52589d6349fe26105fc7831822dac1f" + }, + { + "address": "26PYDLjvhxjrKMaRnqrBoNtD523VdpsbsfA", + "secret": "a14b726d7f34d630b51c2d668c9d4a309ef13caa9d29faa9b25fb1acea77971f", + "public": "024015911a99f20fd61a7c836ef8bfb8c036322e9555d4f87fbfec8a280f251b13" + }, + { + "address": "2PMnPZxbrtjJBj4HtWnbNEJXGqNVuzg7L6T", + "secret": "1e057bdc28c90b117348301d61b7788799fa48747633b3ef65f128db85bf5f94", + "public": "032c82d55599f47c022b7ec1f2d94a63a980f88ed47e07eac48bbf0ac0bde7c3b3" + }, + { + "address": "ngEoKTA5kLWYecYcHpLUSrP8Renp5xG3Vf", + "secret": "63e673ad8615535dfec17d8d4232df7ce645556517e3a7a9b77cc535b62755c8", + "public": "037ffe90571b19501cc7c0e7619b6ee64f00f2f5f9bffc54b82e9637506a5179c7" + }, + { + "address": "2XTu3GjDN1haGmdP15JiedULe17Yvou3PUA", + "secret": "d0354da826bc9131d5c511bab8180df24445d4ecf3ac1d163c586a60ba691639", + "public": "03ae79c37f3806808c63ee7ccb22f82b2f43ac4da2081fd15c26c2361585415d11" + }, + { + "address": "Mi81U5WwUVeD8gvQUHk4uVwARQbW6GGdCN", + "secret": "cf4559eb1ab7e0dc0e2589ae74744a6c6440acc1c47c1e20af6597839302cfd8", + "public": "03f39538cbdae0192c6e467950c14e8b78181ac80a4f4be7118b920a0419d4748e" + }, + { + "address": "JS6ktiN7Ms79KoTQWGzZ1M8VAtRcrERu2N", + "secret": "753330d28ab5b9236fc9e3d2b0e289b61dd9f08f38f1326cb2adc79d10465d4e", + "public": "0369365644818b84383ec3f85eaaf5de68874b2f0993a2ca80e9fd5520a80f1142" + }, + { + "address": "2ZNsWDs1TacJQw5JxiRgVhUAcxThC6WHuJe", + "secret": "fe014fb4af0b644d30ca6cbf94dd56f9489cfe049e76ea7868f4ff77302934f4", + "public": "032efedffc122bff9baef556ea5925ecfa2c67c495cb19d981a1bdcaa44e74351e" + }, + { + "address": "LxgmkPM2f1HRcRrmzr9N3cEXugNmXsN8qH", + "secret": "a21b407ba7d8c319036912b3959a158be0f06aae3736502c8b6f9e45c3622239", + "public": "0370e1ef67eefb04dc4b36793e1d8dacef50f1956062a41e16aefd0df257ae0690" + }, + { + "address": "222JtJnk5pvmP8nbET1au9SZbomfzwUKFs5", + "secret": "fd1d0d6acb0f13009f1cc4067456d8b3e2ef43b1cd7ca9a5dceb9b682a29d10a", + "public": "03e193aa4c3448f010c380254a79bf4ec7936b92acda213d33b46f684c52077237" + }, + { + "address": "24voKQR8GY8aWuDp6deB16Nq8ZQMo1eKpmB", + "secret": "dc2d1c7680935541cd768d6a15304edbd709b2d8a6d2414d138292a707b17fbd", + "public": "03e75c1f8746e2d0c7001212b5a2f81b1703efc0bf9cb8f8b34fb10be810fd543b" + }, + { + "address": "vWtNWUB6gkdeCn5YUXbXArYNVfJLP4Cz87", + "secret": "0fb2a5b69860ebb7b5b17dcc20d283aa5f45983cbe0cd4a9fc2972f3b17b90f1", + "public": "02977a6e8bd289782fe6bc933e212fa7f13c6e915b44f8de61bed4786dd16f8f3e" + }, + { + "address": "F7vSLH9cg77q973YtGaWc5iodkMBpHiJ3T", + "secret": "57ed144cbfe320f19d3a3ad3d5d3e7103aa2fb62586d42da71e7f987da14b648", + "public": "022187aaee0d76e40534cc89ec0b299bc9e80fbf3fc10bcc0c01fead840cf80eb2" + }, + { + "address": "FuTw7roSkr6CNsKqzpUyQJvMpUReBSFTUd", + "secret": "31ca978b4bd2bf895eee56004c56e7a3d21e8ebdafeb572bbbecb36e0e16a5c2", + "public": "029eb0564cc27d0a4a65c1942e446585105cd05dc22a96f19764cdc8b7d0228f9b" + }, + { + "address": "hFGCMRbvKs4m1zAV1RqEGcyAi5SpMCco5N", + "secret": "68cdd1bbbf0b0b8774a6f45be72e0b561e6d30348d64dacec06b194e4c957365", + "public": "03d126e5cdea74eda90d02651be16a70d0580315e1617a70fe46531016a2c00cd4" + }, + { + "address": "6GPVFb8T8Y4iBd3bAmyojBiMM8RnPYgZKS", + "secret": "ccb1e0206867f641e3abd217c1e9811ae39ab55909a7711a04702e5603827655", + "public": "02fd2e9b6e7468dc351f32e6dda6ab83edaab1eb3d7e4acdc3d740677f106ff907" + }, + { + "address": "Ef8qDc2Q7Sz7J3eFnvd98SMEJCHmURdzS8", + "secret": "3a09f2bf6b43df6c213a94214dc65a9ad30c651d09e008be435e66e46ed41c14", + "public": "03cba4c199f928595615b8dbec52e7b20f1a10b40735adbbf7b6f107cd12751308" + }, + { + "address": "2DHxwQdqxY8NvwXBnwX7xhzs9aGKsspDbX1", + "secret": "e8813cacbdddfa7e48271964fb91a63eea487ca3f462e64ef598d3b5748f13aa", + "public": "02f156980f66466742b818fbe5fc452f7557f9e51f51e188543b746e5496fce569" + }, + { + "address": "gecvozAwkyuw9r6eUn8Rg59Y8DcgYk2dFB", + "secret": "fa9f8353f6a67de64f4a7d2719bd0c53bc80d48d05c272d59c7c3bd45d458bba", + "public": "02afa8788e25f7be793cd8c9cb505f7613015f1c0a2de08649757ed5bdffefcb94" + }, + { + "address": "81eQpxzb3xiQs6C9R16rTKJKKcPjAYP8CS", + "secret": "fb50e96115ca8e95e5def16d2ad10834dd2c5fc3fc5cf819d86cc47355bf9579", + "public": "02e5f672d5af83ce1aaab51e99a1225574598b27c922b4f1a3feca3c20cd6d3ee3" + }, + { + "address": "9RckSwNRZvVSWHRYTGW5TpYzWYAfa14CuW", + "secret": "c0c14f4b99871b6ab8da7d3e44e76f943481e7d313f7df492f15512c42fd9bfb", + "public": "02f57a28bc829e1fb9862d0a063f19b99d7a1acf93ee52b21ef838ca5cce45a822" + }, + { + "address": "kR5sYz4U3hpfvV9UpJoHpGe4b5dvSgxq8d", + "secret": "9b8e0a6e8e1ab9f089049a33be70b0ba67f9204227e49fa7085cfb12b9ffff44", + "public": "0271bc6796ff472cc141b0afc0169efccc865786b0d3a607cbaf31dd45fe1262e8" + }, + { + "address": "Nxo31uJshFSDeQqKTrFBayX2Kp4CELgnbi", + "secret": "29e4fdb5b7725afb1db7035cef6d4ef29cd818c81e66981a58d597c5d4259758", + "public": "02e95df9d7dca346d3fbbfb4a5c71689ff2226200f41118f951a3cf8d4f5574f78" + }, + { + "address": "2A7CxHDjsapYNt6NHQjWVKvxrXCFccKi6a4", + "secret": "2087742e97dd285b394d6b2f171009da8b0fb858bd4a0527a4e1fd8d04f922c3", + "public": "02a10f6ff9086e45bb2ffd96f56dcaf5adc8759da06fac9265cd116f6da6cb8d0c" + }, + { + "address": "MydhPQrxZubrT36DLVBvm4ww8jPgwXh3FR", + "secret": "a7d1a0b8a57b64b6149903ebf0b6aec407c5d8a7f5a0765b0fb62807fefdd9ee", + "public": "02858feda2754c0e692228f459b4f5b563adfc1c0d231d32777c369bfd12025261" + }, + { + "address": "2RCHxBQrfCpWpDgHhQMx9CDdNXuRSdBvQW7", + "secret": "9e59e8c9248db0067f382ec45f8b50fdb229b7d35145912cbda5a60652e4e2fe", + "public": "03ebf7323c9d07ae87639780e7fd2368dbb2a2be81fe2422a0a6caa3fe95af8070" + }, + { + "address": "2CibMMEZLdQNDNUkeGTxukCyP9ZQyKTdTwr", + "secret": "20ef1184fdf206000b3afe262bb8c7c1f7e47779c37e25b4aa8bc9ce1fcdd5ce", + "public": "0228a3cbbdbe7b3c06de4ba6a57b90f0a32353d967b1df3d2a735eea9985483531" + }, + { + "address": "2kS7peVSHev3CmmdN7DLaZtjEzvfvKkk5YD", + "secret": "92bc9d6ddf02530375b614e6dd951c0ae3732ba6186cdbac6ec2f0c85f40136d", + "public": "025a3b72d6a01728ddb251dc64295c7ccc8ece2dd068054c694ff856db247cf232" + }, + { + "address": "21oC4NFV2TGUjrGcrvPwVKpzgFkKM97kmB8", + "secret": "e61d9affee3d90ba37ea488fc7afc55ab78dd71e8b1b93b04ff83226aa4b73ce", + "public": "035d082c055d9c298234e57ec9871914c996884b2014de1c0eba6f958bd1353077" + }, + { + "address": "8u6dLFZSABo5ALndKjJ5ScYpDFv9R9uZDG", + "secret": "aa14f51b05ab597628809bed7e01008280d702fa85dcd8d6a284bdd5d18a5402", + "public": "02c089c13a962d52e5c46a445c5b6b4beb86ba95fa56359465e2308821e92e1261" + }, + { + "address": "k5Tw2oc5wEF7msAycqGdG6f7dFmSg3Y1Zb", + "secret": "a6134facf7ed270bc3bc2c69cc8883f8f63e9c937232bc4c0cf6cead6bcce999", + "public": "02a63bff81da219a749e513ac2971ddf06938ecf358c7a0d4ab4a2cd3498deed9a" + }, + { + "address": "JYXHANNbaSnXJhNsCxjytkA2F6rxE2KidV", + "secret": "19b88e4a1a08ca94d8b1a63ebb5cac5e3f862bfd33c246ce754db589e322e19f", + "public": "033ff55a1af67ae3b294be6a2d8995572681e3b71b95aa70aa2d26ace15d2fa165" + }, + { + "address": "2MiD5TDqRpKggn1kKrgrtpAUsYaREZrAcPg", + "secret": "14d82b366ef04a93bde3bce086256e54cbd55f597f9d9cdd9fcbfb17c7fc751e", + "public": "0352d8e915e865373d83be53fc117872ad560b7a82e2f5db84bb4785dfa7f2fc26" + }, + { + "address": "2hSv2av4dyyrsA7PWyt8Z6DfRgTxQCZV6KF", + "secret": "0cd99b278bbd4b0c3de49d5ea72b853e45e22b699086efacd3989aca748be469", + "public": "02382bffabcbfd3b8511528b3e0a2a17a543c8739475fdfe750874f3e04f57e3a1" + }, + { + "address": "RMEbHrzzidye3H366c38zoT9sEHcxbsndj", + "secret": "4d8949fda234c91983c3fed2b20e2122136f027b415c53c3b28fd3a9401030e4", + "public": "03413090be4d221f8a0d6a14bd411c296569417d04efd2a6bb75459a6808380bda" + }, + { + "address": "Vu9f2FuXNzXHhVZqLPjDjyaNLvF3eirA5B", + "secret": "d2de1f7c3105cbac90d122261c0fcfcc74cca0b0bfbfe9f334f753f3e36f9021", + "public": "039923f773cb3c12812c304aab95965c1a86c576d88508bc8ef97265568684c465" + }, + { + "address": "PvJvPdr2V2B4rRZosBo2x2tHmWefXdgQhr", + "secret": "2ac57beaa74675d799d24540f398b2f08672db637eda8cf024eea9e458af72cb", + "public": "02ded23068562062cccd51936e7fad88f7a202a55349f54c47cfc6f9be27a78309" + }, + { + "address": "2kaCFQ7x8rBJ6JttjYP4psf6ejKwADrH3Ed", + "secret": "341b2bec8e242e758ccce37178a134a50b3a97821c9d8a78c5f7f7c8fa545b72", + "public": "020dd4d4be64e0e7305e59bb928340e27f8381c3659e0b4f5fb3b746882e8fc609" + }, + { + "address": "2AYJYq4zBgKb1ZtC5RCF4TdG2zbbEAnfNch", + "secret": "1c304b592dcc3f935134a24eb57988bb8344a8c061d2f82c045868295c8be5a3", + "public": "0213136dc207e6b37ac9de79bd26598d2fa2ec25dd0f1fb4b9d41595b58502b348" + }, + { + "address": "GK9gno6miV6T9UTUswvc8pRdFf8NfNQLwN", + "secret": "fcc02916da58e734019b145f5850d1859905b9cdd48944de073f12d2115702b7", + "public": "02a97331c4f06faef53ba8936e0965516c6ef605724decfe69481443cf4fc2a755" + }, + { + "address": "iUkqHafpgjy6onWwQnvzdHnZDEe8rQXLdR", + "secret": "01f973071fd0188319092052ac43ffce7972283d98855265d3d82ea6a5c7cff9", + "public": "039a5cab52c9950588ac44cb5ac805d27aca17a6f7515f03f6d8b2ba5f6b12c93d" + }, + { + "address": "txb8qzZRZT1WRXrg84kQS93omLXhnTF8As", + "secret": "bf709d3b0eed838ff3edf0838a585d48de69b9ce8bdf389bb7d657cdde26a132", + "public": "03a08d2ab339e68465101d9dfbfa2b83265902ff5326b11b7ce53ea7f419bcd6e1" + }, + { + "address": "wydSm3axBbXCtygk3LEoUC6TDYzrASvY5e", + "secret": "8f3691f710738866731a562873a18a11b17aefeb5981a1c528cf94fb2961c1aa", + "public": "0342b15f8b54187e0528d67455f4f13fee993d2ce6c3e0330a48e805cdd8ffe8fe" + }, + { + "address": "GrcRWScVaDgjfY3vfybHCh4NiE3satxdYm", + "secret": "7e10f5ebf6a8ebf21e62c80ea90bf39c8c885b0b682d488dbe5b3146ae3df21e", + "public": "03be16c5650fd39e75e6344f1f94e56b8e2e32200cde1caea4a2d6a9d0b72260c8" + }, + { + "address": "2bWdKXnEMhTD1XUY2aMeiVS5bZkUHpYmMGH", + "secret": "185c0f312da84fecb88764438b48185aad42c7236180dc1961cedf4ca3bcccef", + "public": "030436246f3aea56925db62803f8e30d620b744aeac79e494890e2ecaaf6699fae" + }, + { + "address": "2V2Zi5eW2Uizu8mqBoCgfM2wNEsuBUV75MA", + "secret": "21f8705279bc92569a2d0cc3be054f6a34da982c7d8046ba3f92a7165bdaad2b", + "public": "030a582da2554ca666e19603ab129046e69afc88b2e10a643a053f935fa1ac91f9" + }, + { + "address": "2eoMqcWAh4CZ6fr5VF1P7JWByp9ZZyXxoLt", + "secret": "596d3109aa4d63509bae68a6d23bfa9b31f5118823208fafaa93e37dfb388ecc", + "public": "0212d52f6325785a064fda843f18936f41ab825adaf9d013b0cf6beb792ef3ac3d" + }, + { + "address": "2UJfBnL4wU9YrrC6qadiNHysCXn5uYSgJag", + "secret": "00e57b2fea94a45bb324b69c6efe451164dcff3f030197294e71c9e38abae3db", + "public": "031fdd5da24da4f04ad91c96c764caff0c9d5f61234446b2d4587c141e7741b754" + }, + { + "address": "Prd3few66cjZHCdB6za6G4v7fnPzeSD2iN", + "secret": "efa8feb48f1da1eeff8a66b0e051127846b73aa22c5bed6966048b8e09a17f47", + "public": "03f6e0fc17b5b3efc249986380633183ae578edd267055e9cb4b5c753414acd523" + }, + { + "address": "bs2oWEVpaH8fi2YqaDZ4VpSgEAcpjrBuLH", + "secret": "2376d1e38d7b79a5edc8db82291f7d23226ae0c9c8e541f8197e67bdef978660", + "public": "036a9e6eee4f778b184b8252ff0fa93e7054cf00e01cdba67907a3d04cf4812b27" + }, + { + "address": "jdXefcHXereUDbC6JyM9p6YKDMr48q2WPg", + "secret": "92181da42717c4ef58029f272e56e497b15147268b0c9e3830d8a76ac8293a73", + "public": "025e49a895fdd528d99561d7864076d1067683e374fcdd2b550a8bededeab01337" + }, + { + "address": "5NxWC4oktPpNE1bHAPksR6WRBuKj1dgdgj", + "secret": "3797eb0d846c2bfa231b21a88f68aaecddc3e4bb5f5c40b08e12a30ca5a9a8b8", + "public": "031ad96ab1dfbeeaca199c561a185165fb957dbc9ab615af157954319936759915" + }, + { + "address": "8MAM31HoWXZvDucv6K2qXDoTiVEDUoTZVo", + "secret": "d8c3a2b3899f1a4564d12960caf8bd2e02135981224d1f1251209209a1a7c3eb", + "public": "02be30b3205f3dd43c5224c96fc73460ba227ce463dbe3accb9f8cdd5e36e05bbc" + }, + { + "address": "Mzymc2SJmEtizbeBctHtWvLwkejj88PG84", + "secret": "5450122d57559c9524eb51445add43f6fdb9b5b3ef514daedbbb2409380f8091", + "public": "02a630725197056ad33d7d65e93ef00353de3b8516732ad3bf01b227457d4e2d33" + }, + { + "address": "pg3L2zkpFxWvZoFFrqJB6rpbLCc6AGzuRb", + "secret": "e43543544e2c5587a10cb0ac69cdb99a46f31cb8fcedf0d1aba4bef755175915", + "public": "035b250809634ca72f8ff5951c8b33b26665aa4d62e367befcee476d654c2db75b" + }, + { + "address": "2ND4LcwLPgoVf9h3mWCwNzRoMKRWiNtDaVb", + "secret": "e8338cb5e4f5008d4c2a133a5f2c5daef0b9ad807b1edca149a3ce48302cd4e6", + "public": "028f8a7bed139ce4a708872273115dee124e9187936318afce6614aaeb68efe348" + }, + { + "address": "JbxjtGo3m6fb9NHD1PXdXiePmjQoCxYGcJ", + "secret": "4e8ca2101270bdf9d18826f5b4cb19d2dad0aff9e848583d4574ca4442e6c721", + "public": "03b1b4eb17becc25c2299489bf28db1bff7d4cd282128591ba6c849d2e76c7ded1" + }, + { + "address": "2Lu6tTQ72MKV9wquyaXFja6XU9vLFScmUiF", + "secret": "e5dbfadb988d7117ff6ffe71064f6b0af0f689a7a30a605444f45a22dd998d43", + "public": "03b6764c3cf877df3cd6cc04813061985ca1fab72eeb0fdac8020d491a9b9cc8e6" + }, + { + "address": "Bk9aopdh4aVS9DXFVteEfnvK6B1G5ZQ6yF", + "secret": "3fb44c013e9119aae6de00c4d31911a9e3c8a8f7574d6087c16e97161b8d4fd7", + "public": "03679e922161ee237706bfb3b5d08b0ff3cd83cfb91b62687ce400e917115e84a3" + }, + { + "address": "pPHJkUrsgLHLrTW3W6A8MgdrYTCyb6uipf", + "secret": "e5efc89a01ff944f078aaa553ce1fd81774c5a0b8f74f39c49404cdb69bb3e41", + "public": "035b2e1d01c7dd09eabc905b3c274365abed2a5439b2dee9754bb1d3d760aaef48" + }, + { + "address": "2euWrr8eWQUwofQ84zQfpStygyUdLBmHG6T", + "secret": "8985df67d23fe2ed3ba1a487d9f4e6677752497c7690ef1d6b97242bba7e218d", + "public": "03092935e59628015a627db9dc3816d2b6323fc1b383d7b6c1bf0e7ffaebb7ff78" + }, + { + "address": "2JbV1HpUFaQNxBGGzXvmgKgsMRtRLiuu4iW", + "secret": "403c5105e61a06dae3846df4bb9cb015c7073137fe8c5b69633ab5fafb2f50d2", + "public": "021bf36446a0583323f37b4ccf6c3a1f7eeb9c5b16dc164a9222ce1bf58e9765d8" + }, + { + "address": "nkSd3RskDcX1UVrbi7McpTWjDDHTatAFuC", + "secret": "936535f0861ab8774e63a0da8910311215ee5b868d2b0fb7c63e9a6bd52556f3", + "public": "039b7b5687043d02634c7a37bdc49763da72ab6dd94e0e4bb9a57f46572d1c2c5f" + }, + { + "address": "2Tsgim6KU6LQmfdvhdWMFBQmLtYU8HhJ6h2", + "secret": "9e4dd2b272096951ef4776cdc7f176629c4fcdc964034847a482c3cc7de5eb02", + "public": "02a8e2ab0a854e1381b0632b0961633d541f31841512aae1089be8b8a89de1f96f" + }, + { + "address": "mF5CK5hbyT59F5mjS8Nmxhc8eqpu7ZoeiV", + "secret": "9f4424d21a2ae111217aadf776c9070f9e499beede5c0c6ab9d6a7e8f9e5a691", + "public": "03c3bb8a4676d5eb6d32c53c82c9b2bc6d37b8d98f414e67e59fc3ec4766e52b22" + }, + { + "address": "J5XUnSVpD5BoUQHPsJb1iHXBsmpZBnFoYV", + "secret": "c41cd6d22063a0f9d674e1c23f52f1842bed8938b17bf1f32db7d1ac70b10ac0", + "public": "02489d6562dacd0b39bd71d53c123dcb69b0edda93ee428554a904bfab2d77bed2" + }, + { + "address": "QJ9mJXCzFBRSL3xgVRSD9N2qJBZJfsMXDc", + "secret": "7f399ba3f61828187c23d5649ca93a4dccff0170df1b98eace826bc10c44987a", + "public": "022a0380050debb4516116c052c6b6369da3f99d8e983227d1f1ab083a776c38f0" + }, + { + "address": "qeSQ75vnGJSdfBwHLdaxNbmmh4ubrnDAju", + "secret": "022965e0753ecc622455ce3e794efc10afd2969f588a5653cd14858a922de550", + "public": "02f3aba0f28b0c36eabf82777f7eac06b65da1b344b4d1564d66255fd9ecaabde1" + }, + { + "address": "DQBDX9kunUZc8EhaCDaTsWCsR8fQdMFqNJ", + "secret": "34b344be4497e6969cbfae8e154d837c72c85f246bff54fa5a18eb16964b3479", + "public": "02e96f90e75ea904486562d31ec162cae8b75036a75d44888e55a2a062276c3c2b" + }, + { + "address": "2M8ffrt5gQ96ec8mid58y8dob4RpEQeKRtR", + "secret": "d072f6a2b4f85461aef64cac0d2f63134ddec4b9891359295b9a155eae735c15", + "public": "02fd82ff7a4f209b35152da7dec8c55a6d715c3643ffe23e53cd701b7d665da62d" + }, + { + "address": "23q2Y6do8YQ5hLqgMWPLRJoGCgHCpnmFceJ", + "secret": "ce494783eaea98c9c19083b79aef2f8fd4ff0e5ee27acc3ec3ab810706e7d8f3", + "public": "036226b6d29fc4db7410d7887be144b48ec7cf865bc2c8457417f2e5a4fe6c95e5" + }, + { + "address": "Mj8Az1NanWTB2bmQyyGjybYuVBvnRKjJvf", + "secret": "f75fd40219820fd2984e000c531e758cc5b8ae4fbc422f63ac3f8835b0eda06e", + "public": "0388fc76f02ccc90b86c240d880c9abf9a1a2299f7a59eb21f26f3d8d55bf5a6b9" + }, + { + "address": "2ZrbqGFYr8p9AHYrsGpMX81Svf3esHnv23w", + "secret": "e84439ec6b8da8758f88e91f33fa37a47ff218098520c634e71fa21897720bf9", + "public": "03db7a56071a216deb554b5b3bba3966c531a63c4312a18504e2d0b5780303fca0" + }, + { + "address": "2buvFGVozbDCzRpadgLt8gYqwkYApVzWzXq", + "secret": "648af6bb80e569e9e7d8155f81459d717fd7951362fde9ca5521cec0d7a8b44a", + "public": "021559a6f9630c7345bfa81feb9181624af8a21d831a49ecc9003a107619dd7cf0" + }, + { + "address": "rYd8g48TD4MQtPbKaCoZt8xzMNx1ppHqPd", + "secret": "fa0a33e154a972151f7b7b371d5184b07ac8ddda8141e1d0b521003ddf05dd69", + "public": "03b12cef132a3b0d6fcf79acac849681f24478df506c778c34389b5a02c660778f" + }, + { + "address": "2LVoYHBtfPiXybV5D6DRq6X6qrQxbDB6wB4", + "secret": "5a350017532d09953ed6e32bd8abb0f7a47268e0e4022cf15cbfadedf890518f", + "public": "03c7475b5097a89c68652a7aeabbec758aa18f102b2fc87289f993d694f0e89c80" + }, + { + "address": "nCGXsbdNQgf8HjjRDYzDouvFvQikmaZZVr", + "secret": "f6579d55c6fc7525d283831af9360d8a20a7c856dbf92fb1c5a02c146f0413a9", + "public": "021780bf8d1862a81ea1a75a89a9576e0330d0b4d20a61e0817bf3b9f9d52a815a" + }, + { + "address": "9z44BB51AgYhr3Ljqb2zMWQrvLpbLYd27j", + "secret": "80530625c63b9b6c1dc510039f379a8b01b0d646fe569ea2ce35322a1894fdfe", + "public": "02765c54f55f261a24c164a2ece6662d0008eb3a9f3a379d19d2b624d431738a53" + }, + { + "address": "ZHmtrHfaxG8U7y7pjf9azLyUtvYuX15egH", + "secret": "14b437e7aee69001945c95d203c08f9d19dc8a8dde97c7133d296b883e58292c", + "public": "0394c3de2b6d85c29b7b066318a8bf83f9758474f595541d9154399a790d1a0299" + }, + { + "address": "bd1D8ZA24hn2nnXJFu8BVdCZ9k1TmMADoQ", + "secret": "e32ec60d9815b47f4de798dec53ce29d706abd85838f6aed87bb9d251ef25114", + "public": "036c0a31bd777b096d09636c11892bcf197668cadd72d339a926a404fdb6e6c9d7" + }, + { + "address": "2g5eNKbSsUF2NXqGkPP9TuTa6YuiJTaPKgF", + "secret": "12346069b478a1004cd81e9056a4d56c8e8dbce92cca698916e93e1609bd603f", + "public": "03861f1e168860ff59e647b1b64617bb08133815ffa56fe56a79d95f2a97654298" + }, + { + "address": "tDw9LMweotZST3PeEAneUJKM4qn2Ti8Pwz", + "secret": "a84d45ad2f527acbb1baa76fb15f252a4e5e79763a059232a412e585030446a8", + "public": "02300b36d580deb81b563d5430f1f91b930ec72838008a1f7304c466ffc70bec66" + }, + { + "address": "wHVfmjDbVKmfYntbXYARdPyDuUUoAAw6op", + "secret": "206f1e19e7b1b8c61fa20a1aef9863d3119f348c9b82d4f8fcae8de42525e6d9", + "public": "039a54db3c39cfc2fdd8a2386f9e98e55462c1f1a041432ee5fa87c1fa4f70efba" + }, + { + "address": "FgkCgYgEbc9rAuuNUdZgeUwCw3XrnGFX3s", + "secret": "db7cde643d4847775836ec285af69de816f699048e64571cb911444e258cc40f", + "public": "028332c7267e536582c2308c166c5be90c1365fea194a4916bec575f19295259d3" + }, + { + "address": "2R9QoPRT5ucDMXQku5T3ZbHymPGkX6SNSgH", + "secret": "9cb4301d96c544ce6f3c19071c5145b89b100ec8aef58bdf90c90aec054ce985", + "public": "03e9b2e1541e9559887ddc09f22f575de87db66b895eadce25cbb68bb243068b20" + }, + { + "address": "2n1NfYxcLwoH1jakovQ2sM4ShKH3Tcs4rWL", + "secret": "7b031409b353b33f8921ede8a6b03c6b61a6b1a4fe81769c79751aa7b023ae3c", + "public": "03f024762d6f497aef1a1fb90deeb34da641b8a1a0470040a784fe85dae164a406" + }, + { + "address": "2E21TE2z5qCtTT9WwXNWD2jQBLeH7nGB6Kt", + "secret": "555190ea46cad100a23dc8261250dce85ae205d2848c81477ad0eec31d9070dc", + "public": "0252684dff78d0b15faadb0e0d4f3fdc9ac9f168b62721119bcba98609bded5caf" + }, + { + "address": "2gRYextJNcQE2TJUSCBxhcnEK1siAtH7mhU", + "secret": "fd895903859ca6a879f8a6214b67a4458a804965fcf85f893d04df4fcc1dbe30", + "public": "037b4075a8e23d4d14e5b2090fb78c0cb72737197f27ce1da81ccd1097cee99db4" + }, + { + "address": "2M2KmM33LeLGZ18e4G9CioqzSqaAsii44bE", + "secret": "2bd1ff5e663a33f3d36df0dce93148789ec358093ff3e335e88897027a639f81", + "public": "02e579ce75e735146329eb9b67c5af870fd95ab070bc18b80ce8a536c92db98189" + }, + { + "address": "zeUUj9uFNSgkW8VTHjR7AwhcfKsa7xDwMi", + "secret": "ed2b56c6babfc1a1a55f8d393f35b517993a61651b6380d938ab0dc322a00e66", + "public": "029306804e046440a614e43dca6854a37d194dd58867c2efbc109500a63b85a38f" + }, + { + "address": "2DdyebEM9mHwrX3jmcTvzgnmdBQYetyNWY3", + "secret": "4eb31d856d118fbf86e151a08615bd20248315f8ff9666e7470e5ded6423019e", + "public": "026812e3cfcfac2970a723e05c5c457ba99e2298b4ec06a5464e59064f29a10d95" + }, + { + "address": "WXAafhTwvot8bnNY1ekUDmad1b3xzW5KoB", + "secret": "98690f96a8bcb814cdb88a6ca5c5bf260586a1919913a2af3e5bf47f4843cfc0", + "public": "03c1ef010a6891cb5f9a34302b52f6cf47e1859dfebbb0d8aec889ff93e95a27c8" + }, + { + "address": "5Qf7bQMDQgJSGMXPh6nNJdFHjbbPr6vyB3", + "secret": "87cac60697e5670624b0086a10e5a3a29b54fabcd302e8fb22e1f46a319c14b2", + "public": "020edf7e9ddb148abc5e22cca11b3eae82a28832d0069c0dd54d75f87105f1d2b1" + }, + { + "address": "SKVDSRbKdqMjhR2ciTEc8nr8zXNHAcrSfS", + "secret": "84f3f3b47fc67662ff7353d14f28c64d824b2e877d457fc749bc437e6bcd7058", + "public": "021e6d35f208aa9bb7d4c920c3b4d10eda891efd7f9af569e6e6bc624ec5c8f3f4" + }, + { + "address": "gowLNZDHBB9tNmEG6qz2NNwGkY1SouL1tm", + "secret": "b25ece468580847a3857d3d694924060e1e385d8d6c85e98c1b495bdfd8cdcdd", + "public": "036a8d7baac3beadb20bf1b5b6e900c99f1a476b91e3ffdbd8ad6cbc2310055bb5" + }, + { + "address": "Fsh4tkUymVnqmGiAYC9wX48fw2fucNipFb", + "secret": "e3877a2e5b413ff58ac84a792cbdb604d38b960dd5e5ea978fafd0a60850f746", + "public": "025775cf3978b487bf7aa201683a82930a0c1e8a61d466936c07006f719bb7fdf5" + }, + { + "address": "2Ma9qXTpbJ9JmYuUhZU6y1nwXKzJwbE3i5B", + "secret": "6625fc71d334dd607a82f6cc4e73a260eb9ae5a08b31f323bd896714eb38c7a0", + "public": "03132099778fce50227afc5e41c65d9830ee2930bc789e242dc11f153dab5538dd" + }, + { + "address": "nsjzo4SXJK9AXaw8fSkossG7einZQxmjuj", + "secret": "5665f7c5048337a78dc75c98c591b31901ce7fc43a8ba5ebe7f45a5ab062d80f", + "public": "0263deef3218d427110f58d0d72a66d0deadfb2d9cca0aa2b2cd283ec805cf87ba" + }, + { + "address": "2ipWusQvA7UN552H7e1zY8pXb5h7z9cvwaj", + "secret": "e0842dc4b26eb0d3f04ac0aa9abe86fd1bfa7202789543ff34fb08078457c419", + "public": "0252193f968bee3c45adb88c4881c0770b49440782a1ebc5095ef6c1453a3a039d" + }, + { + "address": "f1xfUvKjRCeBzvwdfCu399cebpX1vDFESV", + "secret": "f7b7138be61f2785e5d7dc9c4e987c1dabb7913c5c675d68cf0dbf6ea3511238", + "public": "0313f2f2a40cff2672943935a0b529624bd8be43d65de1eb076e983b2f0b60d36e" + }, + { + "address": "o3YhEi1J9QoEkk48YwCdhdSPTZVX3FJDGQ", + "secret": "2acfe55aaeccf96199403b04f37e350244b04875946bbacefc321f5514de675c", + "public": "02eded9af107b76a0339242ac409f01664979a8edf182760c393a2a67e9f78ed40" + }, + { + "address": "49SvQFsbWdBB5y7ijBYFcDJL59Aj5NckFY", + "secret": "766221b7013f73b64fa328c2633456eb66fbc9dab7dabb17d3a87d1ed1fb1517", + "public": "03268b627d2d62a7541c7a376738a170c897316d93a07cfb3890414f010fb00db2" + }, + { + "address": "joV4SQMdpCUDUZftsKLd7NNLshkHxeysLY", + "secret": "83fd7eaa0dfd5f7e7897994d162de93d91b09aff9b9b685133c3b3f372e00ced", + "public": "02afb8fbb2f77e29f3751a5e3c9be92b4a42e05955c7b58d5c09d878c233571460" + }, + { + "address": "SmSro39dpb6RCTSd3xAVpQcXtauUk2zzL4", + "secret": "88c46c1b53ce49abc62814e5564496b3b0c1c3a51dad775191f8ddeec522f30f", + "public": "03cf3e3cb197c3746187b8a0f3550c8389e2a00af834dfcb81ef3eeb21c5143dd7" + }, + { + "address": "QQwrjn5k3khUgvHjPst6GVHn6F2AwNYs1p", + "secret": "c82e491f70f9bbadc4bc518cc6d74eb9149b1a10e67529874dc9292339277d74", + "public": "027ab1776783179393527326b64836d737832cc5b9909cfd1219024e1e0fd0fdc3" + }, + { + "address": "JAgmiif855wDZgaC7U5wYg9dyuWi5nxPHr", + "secret": "25830dd91c4037776b390ee7f598aa8fe65847169437dd925e240883b1947b8d", + "public": "02b9f656a6ac504eac5f22cab1472e4760fd5064589ea36492dc6d7ba2753ee5e0" + }, + { + "address": "26MHnfJWUL4uNee9LjdAGLGa7HC4EpLH7S", + "secret": "e70d55437795dda9fae07616b2eddc1f3ea6f3ab0f971e5f7091a225caf2fd88", + "public": "03440d9fd95ada18ac1076623f92f9e2fd7d2c4493c504bfb5faa2250aa7d50cdb" + }, + { + "address": "k4jTLy6nhFhpxXKogNAcbbhXeKYJXKqgA1", + "secret": "fb3c20a167fa642a78d55347fa54d9e1d7e2a3a0f0b43534faa6d846b84516c8", + "public": "026648469e9a9f18ec527885fe8f2665acffa546979007758fe6ce2892f0a26e65" + }, + { + "address": "gMDDYLmdNigohzJbpH4pkZEVHGzdpJC9KR", + "secret": "b06b09ff98110ed0e7b76ca84288d7a0a73693d0d1058310b46922873b276252", + "public": "0298bcde4659aafc2d6f55b394de41107c400ea786460e01595c1b0ce568d0f928" + }, + { + "address": "2QXKE1KgQvHLfrUuP7pK1xDo8BHsNNR5wu1", + "secret": "b476c0ede7587bb5d76532c984fa5a4d810aa4341990837ebdb70e9e4d4c2099", + "public": "0378972efc8ed0aff8fe5a9b530bd70b697150c45799567bb21fc24542802157e9" + }, + { + "address": "zRH1vs7WRARth893W7ZXL7dkp24JJEHLfm", + "secret": "137303696ccf1fe9c4a3167dcfdab890f10fd46861634c17b75203d1ed181bcb", + "public": "03b241d494fff26c5fc1a8f9c509284151794696e4bd5736184e42bda7a2d1ceb5" + }, + { + "address": "2bgEuW1vkDRfSvzVaHrsN2V7mahtMsopgJB", + "secret": "7584cf68badbf5cf89950fa55e92d38ad678b320a2dd87baac186ed272e3fc73", + "public": "033697a7ff566de076c1f62e21964078876ff0bf00cb52c6b0ec28885a5703b4c6" + }, + { + "address": "S3M5uARXPFWon4dVxJbFt9oL5cPZDLGEzW", + "secret": "34b07e4545dc8d5681058630b94d16b76e302020a295fa72f1f3ea5f9e555ec2", + "public": "021f506a48039b0b9daf3857207c85213a2e6e9a86b9e7f19174835c0a7fc7ff3b" + }, + { + "address": "29LsJE9Rp9EfDjMCoFSwhsJPy1BvB9v7iaY", + "secret": "dc9574c4593e48481e7ed0e4178289f238f63cbeaf659d9d7d9e67a919b60ddb", + "public": "022922ad2cb0d3f22f0d7c8b990db9b1c98bbbdc5c172598da5c9b0cef6d8f3537" + }, + { + "address": "29gtaNw6Sh6Eza9CLNTR6AsLYP2s5RqxBcZ", + "secret": "a76b65ce9b49e5ecd1952d117713097b3c8610bd6a024190fbee18e516e87d86", + "public": "03428a59615bb06d26ac224215f79b47b3b90aa677db112a2a80d8a9848722ec25" + }, + { + "address": "21iG54TP9jygdxhcdceUrk2Szvg3PRHteTc", + "secret": "67c4ef1f760b5953ebb32055fd76d8c2bc2415c72ef8bfe1a8eb40647b199d7b", + "public": "0397a70380961422ea32c25a34b0cec7cc58fe7f62f9501177ece0b6acadc86c59" + }, + { + "address": "XEzXQfHKhQuMtgCHRRNWYZ7VTNCJUCy5Dr", + "secret": "8b71c09585dcede6d668bf0020787ac50c9556714321c288b4e0eb8302864386", + "public": "03bbb9313b566fa2e5bb153af95992adb39d1f3a8f77ebe6d36cf1d9e874dec0fe" + }, + { + "address": "8safALsBasgBw5U52rryWk5vWa3XWmQfks", + "secret": "ebb458a1777415e80574e94ba3fd381ecefd7871dd3f8e231ac97948d9d6af2e", + "public": "027841bd654f450121a3730982808e7526365f4ead99ed226cde64fbf460c9ef52" + }, + { + "address": "o5j27rParabrSJPUGGC26yX6pBqqNcDi7", + "secret": "5091e3ea0d50a88d12c2f331717f87b5289f26f12aab3145c017e59823617b9b", + "public": "024a2c3b28276e59db236ac1458c165a30f6e8fa8af411e663aa815d2f0e0f5a1e" + }, + { + "address": "26XbTkFX3sXem69GaSBHezQkmRzGJLJsdio", + "secret": "dbad683919d198390157accf51d1c246fa6282d0ab494aa418aeae9152219445", + "public": "03e4009cac3088edb22bfea5ad639016b64b36debb1f12475cf036c37ad4e5e69f" + }, + { + "address": "yuFUDW1RSa226gQKLG7d8GcCFxFVaSb3Zk", + "secret": "d2b5f0954912e055d0dd56cc3e921147c62942cb665b4d52e60530edb32d72d3", + "public": "03d12828f548687480d31b41dcc6c4e90b6abce46ddec55586a6e8acb7727157d4" + }, + { + "address": "2kmy4ccRfRCDcaFJw2G5WwikcoFCxTyFmTM", + "secret": "4381f86b3987baf546fd72efa280b8dc6b0819fb463d8ae5d591ff5061b1c12e", + "public": "021b20bd44372c14999ddb5f777d7d16bb7c2df0123b210e1a8c7e56701accc848" + }, + { + "address": "2K5dB6rem74XYuajLLhmxk1Ym5ktyF2rHK6", + "secret": "d6aeac3755497bac024965298fa8e8c02766122c5e99af88091751a051a1a84f", + "public": "0243b5a4cb7d2a422e2ab703520fcafcad3a62c071a1e18e827cbdd16b982af1c7" + }, + { + "address": "DS89RK7MsmZErHe4vc4a3zqp7BCatZYYh1", + "secret": "198614c6bac55b6f1ff6561051c70cf4aea344587f637e526de39e9179d3a4da", + "public": "02c92b2f731386e94d4a43f965cc443c19e5da1b7915084ab4888cb8348944194d" + }, + { + "address": "ccuSWwS7Hvw7UdQgNaZGqeAXH4v3kCsoJi", + "secret": "b1e8829213ff5231968cf5e7b9ff13cf83d945a7de3eb903eee46d857903f544", + "public": "0334c602e039256862c040ff3200bfd591fe65c5f10e0ec6fa8b173a03ab4b20c1" + }, + { + "address": "QxgofLYmG7Cyyqg9PPbcYWUE4Jf5r6JMmK", + "secret": "9e617dceff8339cd34094b9ff8cf3ad9f66c702528b58391e94f7c9b775a2313", + "public": "02913bac8d16a9df9c8a94507a2d93d21d7bbeb5733e3f16a1a619c8d4649f610f" + }, + { + "address": "24BL6QMtEsank54gFDG6JfGbKkzcfmbYHvH", + "secret": "64dbde8e8125fc928c4805122ed1def7a968ac458d949d50e77b02a9b72ff16a", + "public": "029a30417b752a63570caf8b4caf3bbc9df6ace56320121f59d9f3f73ee5c66419" + }, + { + "address": "iNCaYPUY7iFwuNdKkBdF2QRbuJG2Z89T5T", + "secret": "4532262c82d391663f96fb922d3eee86179deab0395f32e658c243dfc4b259f6", + "public": "03e9f19634daa5aea15533f097d2e65fee7e427a26f690530f8bdf8592e08563f8" + }, + { + "address": "B5PrWYoMX4X6xQy6vavi6aSB7niTTxBEUo", + "secret": "e43f066ecb51d8b88e92ec6bdc39b62482ef349353eea9daa6ba866f336d12dc", + "public": "03e36925d3826236e41efb6fa4c7efea1c84979cdcbb299707028fe8deb3344140" + }, + { + "address": "huYwnnc82FHNNdF6MomXUGE2aFu4Apo1eB", + "secret": "e835d2a47abf7865afaf03d7399e038ade3c79ed40ded121b3879010ea437ada", + "public": "0397c04c78b5f17306d04bdb8aa986808e2aa9f736376cba5246bc3c766a552f29" + }, + { + "address": "2Uidx5h6vU5ijGsigtrhtCymmXgkdScXu2A", + "secret": "9c97a07295238b5e968fb6d256efc0298b2d86ad339f41a22aa99208e441462f", + "public": "0366fa3afaa882fe120c5461c7831818ad771eb4454ac1833be66e4409d68c1d5c" + }, + { + "address": "sssGhHuMTELS4afckMa5xCfFwUdoTpQogR", + "secret": "b682db37d4e64798e7ffba455ecef95ee7134582f7ad72a4f077a4612dc71eff", + "public": "036b3043af63338f60227ecd8b810e122f6efae22fd83e579b7cfa75dffaca7638" + }, + { + "address": "23FmY9Rvb9WWDZnQegW9HcwPcSSWXJYy9rW", + "secret": "92bbd9023b9bd5a1871b23a4ec30144b4a9403a27aacd207df2072096fc74a92", + "public": "02530c3e0158aeb99422c5c23114e494ccefbc6581b27e46b9c1163fe71973fbac" + }, + { + "address": "fqdRNStjfsNdmpK3DQK9WVTtSs2mph8Kwt", + "secret": "66fb2e78682b560c4ae978c5ab294c8d7f6d710cdd5914b4d613aebd89d3572f", + "public": "022d6a236600e6672d9e4f7f10bde1b42f2950fcf21248c8f6488b95303539a3cc" + }, + { + "address": "ZJiG2CGoqtSx2GkuxFvoToLdcnVHHzDtHi", + "secret": "6d95dac69ac754af9e1afae5ca34aabdf9b810a108804c58723248fcf4f05466", + "public": "02092f669a4858e627bb5a371f629aa9de2db91e1ad7ba633d027b6354af8b6811" + }, + { + "address": "stC7w5uT6NxykyuDTr8wa5yXhHL1RQHHHC", + "secret": "61073b41891fb56c71e5f7483e63807b6912763019630267c19ea9d9cfc93d84", + "public": "035c445fb99914723945b2c1e1b54b7ac35bed350284b0d93e5d492a41cc87d86d" + }, + { + "address": "BpWeZBhPNCYMpzBiKMcUNaR8qX4kdxdy3E", + "secret": "5ab3d7484566f08ff1be3c9c9dc74d001c5531fb5ecdf98f87bf4e36b6154153", + "public": "0229270ef80ce2340bdfffa6e4809fc43f9a033037f63a865acc69c12773b64054" + }, + { + "address": "2SMsFtscMGLu9Sx87HBebRG8naW4iLA2cZz", + "secret": "1e528bd5632186db07cdef8449c1eedfae575ac4c56f0bf9440b4e6be28ccb27", + "public": "031b597d85b54343593060588e1c4d820a0295ca573cfb88b066be174b69a93a69" + }, + { + "address": "bnDptZijEK6av5LjjaywjhgkqyU3xRyadj", + "secret": "abaad2674b08b8869a3c66dd86a6197c3f0505cf07b1f20a8f9ae934ba2dbd1b", + "public": "027e4a5d95c683171da70094a3a12c2bdf9012745d509d1ee732e58c0045035a9a" + }, + { + "address": "wwW42DUNggV9cmupj1Qf6uHU5RmipL1dSC", + "secret": "1b9a75bdcaf6b9b4d4f4994233126f28d63f56ed11d7067a69fabf946b313456", + "public": "02a842939d4a77bfcce9994708751b564ca29233672149b4d144da27586c98ecde" + }, + { + "address": "BnRkAyySwtJ3RU1AcqLfNBFUwi1wp4SoLP", + "secret": "9d3cbe92944aba5c8c0649161a398d3f8f458c269d760e9b625acce3a476ed8d", + "public": "025e1cd036ecbdbfb9123ff839f007ec0feb3cc66d1a82965ad373508079669031" + }, + { + "address": "jdgX9aogovnV3BLVg43MoRmSBXUKAaKwaT", + "secret": "3291f3e77bcc03cb913fa0aaec62c75f43311037ee80c80df8d162969a8756ce", + "public": "02551abd2d1ba1bbd28d2e6016bc5e41a56d153313c762797c7b8749643134c4f1" + }, + { + "address": "ZG3RtZogdoEj2gUGkgZgyqD36EJnGaBKFL", + "secret": "3dc50dea1948cac53baa20453eb4e457c545e7b6d07c07eab23952188bbe041d", + "public": "03a100b0493995563b865c1a58612843e9120dc6b0577f95b04e5839f0260d56c6" + }, + { + "address": "HvNoZMcknBtSHMGmkNAdviAqmiynJbkbEg", + "secret": "6ba1222dddac6d0a5bf8a3539d01e4117e69b559287b0bf56afdd6055d927bc1", + "public": "035559216c7f0bfdd24b03208e5d77c82dffb7108570589b4c6e9172e982c9ca03" + }, + { + "address": "2R94sJXypsCnnhWauFb8XKtJrLfNJ6Jki7G", + "secret": "4c8809559e07f860b56132a1cb6ab660db9bd15bee02991c93dcfcd9c453b7a4", + "public": "023c9af631584445b2a6c7c22353478db1ca9d546b7af5c7384e038dc6dc38085e" + }, + { + "address": "Bf3doov6qd9M9iTzw6ppuNSiv5FnsBnPFj", + "secret": "f513f76c64ddde08ddbbf2a38a39f864218d65ae23bf457a790ce5e1c5b37893", + "public": "0304b8ecf1a3aac1eaa6b67032047848389aa3feccdcc3cc6dd5ea661c85ee5f35" + }, + { + "address": "e6297wnTqHemj3UjUsHEcfkWgoYLY34ESP", + "secret": "9d69dc4a3bec0c7c706356c6ecd1c7ac5162dca35a6aae6c9ed8df86885aae50", + "public": "0305c56afe0588c191b0dc1b0ce37df4dc8e71cf6e9e55fe68c18c094ed9dcbb5a" + }, + { + "address": "sFwqVVHrN7KHN41F8jU9g7kwYpAJkQ2YXf", + "secret": "2fc60a5c19c707445faf08a76ef89f1d4d8ce0e6ab883711ba859851ceef19a1", + "public": "023e2ee53efc59e8516a65c36f5655d57b67ecf64afa4362235568d6fbdb9aa872" + }, + { + "address": "wTttDcbFvgPuniukJhxKV73XKxTGjLt7vA", + "secret": "545c0b9625e5b9c9929e267c4f10379447b7c5ee9fda6f6f6b3038ccd563266b", + "public": "0357953cc18907b20e5516dfe2fac4b35c33a778559fd21f2a7266defcc5b0b8c8" + }, + { + "address": "2SCgJ7nLb3To7LihhrKWfZLNoDr88k4pcEE", + "secret": "8f37ec0ae63e299a6ec5db7fe241dc30acc8bcb1f629d66326c7aa79f5263d6a", + "public": "03eba8479f757c91703601cafbb601db428be8f9acd9c6d2c05440fd42d87fbf2f" + }, + { + "address": "265SGFsQ5a65k16Mifui5R1GvtuDpnuN49Q", + "secret": "c98ec995d808922549bcbc5217c826bd3e0369754dd09396bbda8c5a7be6b1d2", + "public": "02cd1a00f584cab9c9fcddbc21ee8ce269d055ce230085a6318922335c00f0fabd" + }, + { + "address": "WJcJburNm8edTpbPVMNqnTuWFWWGRFUhTL", + "secret": "3d8e9968716ef2e8ecf5c260a78af235a76be4c35c33b7ef44c9612ad061252b", + "public": "03aeb0564afd126b603a47116caa9a6a9bdaae72f6b16b57c278c8850e77669e63" + }, + { + "address": "2ZVfdVcExE27kEsqXTHRvH4CWhtrgerytru", + "secret": "017a418ec986559a235f235e40dc1a4847c6ab6c8379769ca1e3f53263608a1e", + "public": "03093f374e5184893941460723c082e6c03edb07a24481011dc4913045e1988f3c" + }, + { + "address": "rrzosBqV6qPrLcXmUi38E4JuT5HK9p5EZ2", + "secret": "2be9b2d68a22435750341c07bfca519a0282f6b8e8a89504cf327fc0361d1794", + "public": "027ce626a4c6ed8ec8442d196c2779eefd48a1dbf14136cb4a2f1fe203d1a5488d" + }, + { + "address": "CAh4fftzSytRiuoD1mhKPr2odx1we74S9M", + "secret": "7d86a42ac216a345c761f28412c606c3ddc518021c44ed5d9316469260eceb77", + "public": "02369a7e1b3527c29616f6b9cd7a9264ebe7c4fca5cec9249ec9c2fbdbaa79fca4" + }, + { + "address": "hT9MrhFKQ3st4LaCSpiLYMvHhKDjHsWhdM", + "secret": "88e7e0a3b6709d657b686c3b44c7c94560f4287752206a80c819d18672042bbb", + "public": "02b1fe72058c93ef78e3a0d766a577d0483b34fb8e1310ebdfef3072373ee380d6" + }, + { + "address": "24U2xuWF4Sy7H54J84cTwMe19tZpJGFpYv6", + "secret": "f66c96e161c59ff504434ef31cba28cc01bae76f9782c0ddff2b7a2b3483b44c", + "public": "0369d6be394fe7eabb5340fb2703efb82b07d92fafaf46a66716ef3e158abba759" + }, + { + "address": "2GdfV6jEBBCq39A1TAuReBR6MGu68NfAzQv", + "secret": "ed97ecfd2dcffc1bf79853d1b659720afa9334b3e94650a4a7561580e97699c4", + "public": "02abb05b3015f33f2c30230978b680f1e8e9ea00d1ee067521cb54ec3a5320a712" + }, + { + "address": "G4W6UDwRi3n4s3erXq5viKHfD8Gt6Dv6Jc", + "secret": "36240bebec42b7928104606f9f939eb155ba296e567b8c62dccec004ad603339", + "public": "038808ca90a168226c3083378e9d6a43e2637d0a3ed61ea1ffbdd5619a3b2ddb03" + }, + { + "address": "2EDc2WfM84fEXwahWNynu3iDXLZeJvzSunL", + "secret": "c9604c86f8a949e0d186bc656d6d3625dd3e248416e408a5c2ab8b7f70835926", + "public": "02fb89b41148210016e8ab63bc4175b0d3e8c07784536435f1535c37db523b5f04" + }, + { + "address": "2f7WZfa6CMs8YBuBpha6U7H2eSj93ePBX5j", + "secret": "e6de015f90b46bff63dc0977b3e9c48338865bba24a09ee7012696c4cc56662f", + "public": "03fec5fff6df86f8783056e7e7e0d0ce9d160a62394afdbd7f4e73e1ca7f2f1a0a" + }, + { + "address": "6CGm1DqHawvJrfQjt2UfABWo3bhkr8UJQD", + "secret": "8d5e6cfd6440a1ca8583c59cc1f0155bcc3d3aa5e9b084d2490603acabc0fb75", + "public": "02357f3dcb10b5630bd904259bb75137889c04123b509b77cb9dcc33b9de2e1a69" + }, + { + "address": "5yq6MtxX9tP9dfM3A8FKH9xLY9UpAcxm4D", + "secret": "fea98f69b33c8a708459a4c224c4fefa66a152a0e6a853b85585f7147c0e95e0", + "public": "035a2b87b8d9ae00d39606bd626ab395814e2e1ae1fde6add2dba581ca00dd6200" + }, + { + "address": "GMaMEgBcs5csC5XamNTYyniVTo5ngHD8k5", + "secret": "0da55fb8a6846a8a34e3965fcf0a33d314050c160bc3b9537cab8a385776ba42", + "public": "020c3aed49b27d6c62d76f209fe5227a2d4fbfaec5d7eff7015c5cb2c6403c2ff5" + }, + { + "address": "VPHFDCFDchimwsVGtc2jmPtycJwDnbp5EU", + "secret": "c9dd55ca1018b0d8533ba318ed08f1af73f9b98eb919f4b6af4c360becd3658e", + "public": "02b0dd156151a6228dc4cd5cc1ec9642f3215b919d793efb9900266bc18937345f" + }, + { + "address": "L3qpTuDGH5wem8EWY82fUwo1oYzFctess4", + "secret": "b1e2ffdae4f2aa3b20df169a5034bd20c5a939084ac1539efa33cf673dfd1534", + "public": "0251e2d2a31adbf37e00c3e0406a15c0f97ae718ac2f284013154bd82a5b8d16f0" + }, + { + "address": "2BKAxsB6REMxDhQt3Bg4bRjvQwgpzYrpHGD", + "secret": "94c2ab6880546c63f83e5704041aa006cdcba445233cf0ef710dc774c917af83", + "public": "031fc9a3ed32e2ff9ddbf8d64c5de39ff74847812ffd5a426dd35f7eb8ac56fea6" + }, + { + "address": "h4UF9sekW8WJDERLXiSU6JiwBJPCFXCVQz", + "secret": "e256c250043f7d7f4a60421c378c734a1b956dcbc22ff828b57e09f68fda47a7", + "public": "02c942fe2db3ef7c37ae64a7943733ed40da2bf4c7f479a5b1210fb5e57aa722cb" + }, + { + "address": "2C3wT9Wf7xsE5BNEPSj8KUerpPiYSeM9PLo", + "secret": "85023f5d7ae3a15a82548e7785f9287d0d39b1c59920d08cd8f2dd61a227df87", + "public": "02bb78ffb03ee30ff07ae445989b15108df51c1306d5d712358ff3a77356fc928f" + }, + { + "address": "MeUC8cndNSMJdT2P7THbb7TzhfZEYbQwTF", + "secret": "abfad820eb18e0fb504bdd0dfadfd98be92ca215d738c1d4c21aae87ced8fe79", + "public": "02bd31ffc3fc02ddc9c6bcfd3dad9ad4b2d51965cf368f854d9dff66f33b27e87e" + }, + { + "address": "MW7nP3oRdP1rfN6kpBjwQZ8f3MWrGEpc3F", + "secret": "77b3b0b050d0ceb25ef73cb3cd47c16afc954b1d87b57e0b7e7215f4a1150c0e", + "public": "030ce0bdf4ee5b7fb72a4dad6d047832d52ddd34ecd8d81f81645f989c8dba2107" + }, + { + "address": "xHtjPK1SPcKTKmA6Hd3ybsL6GwBD1xyxUb", + "secret": "2a609e0536a025e55366035efbf9e28c3283f15daf9b2273e43154466e7afcf2", + "public": "02ac89388615f2b53f6890a31fbd75b31c6c27d522214843364da96ab41fe70e9d" + }, + { + "address": "2EUCXDL1Pnr35Abe3BAmewZkNtJX2Hqc2Ro", + "secret": "ec3bfc75efdb69da3ef0f609ded06b9848e7c5ba69cc76b4ba8e0f2fc5fac011", + "public": "0385bba88e897783786e06b55e535f13057ae68ef6f57b14ceb70e9dc4e34e92f8" + }, + { + "address": "2icjs7U7LjPRWArUe4dfKWEyXPNMKYfNqbf", + "secret": "81995ff5e709bed9cf86966f88cb8da6095831f7090bdd64382b5e539246b454", + "public": "022f1466e726b826363ba710ab7575000f41e71e0ee7994f1af7331246224d766b" + }, + { + "address": "RJXHk1XPZv3gyQfydsSLY5vb82USLdpUTh", + "secret": "a627d0c088ae6c6a004435f93be2019e9735930e4026d14fbe0fb0309039a198", + "public": "02f200888ad6d3f3547f012d72d264fcf780e124f04aaad4acdb2617bcd901566b" + }, + { + "address": "2L5QFAHBPcogj4tVPvviCGgoEgK4yF9UHqK", + "secret": "1fba9300ae3acb7d9d02b6be35bc7cdfe3fac495d79ef4080d25656632a75035", + "public": "03723bea8eae042c976de6884d9b54c0aa19286db7ee4c6e9740064301f465bc32" + }, + { + "address": "xz8JrwJdYru4vwnNbpt1wrXRF2NH89Khst", + "secret": "a785c36c66f28f4c19818cbc54faaef43e574b2d42f8df864dbce43e177cfaea", + "public": "02ae807160537347a4eba3a0761b53e2f9c464b47e526d6d4d48052e888f434e0a" + }, + { + "address": "2EyfYcC8rHjycyL1yQqCBS16BtCvA1cwYxY", + "secret": "bb152d93f18912155551d152c10ddab0c6ce77adf9092545dc458dc34dfbb603", + "public": "022c3c113b27a7726a6ad38e198b827f94a0de62cd319db41743dd08a740ed6b45" + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0000.golden b/src/cipher/testsuite/testdata/seed-0000.golden new file mode 100755 index 0000000..b086942 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0000.golden @@ -0,0 +1,175 @@ +{ + "seed": "aG9iYnkgZ3JhY2UgbHVtYmVyIGN1cnZlIGRvdWJsZSBzY29ycGlvbiByb3RhdGUgaW5zcGlyZSBzaGl2ZXIgYWRkcmVzcyB3ZWFwb24gZG9vcg==", + "keys": [ + { + "address": "cfb24jWcms9pZtvEx3UjUuLPdT6rbx6r9M", + "secret": "6614f0956f4e08e07ec2d4c2767b9f7121449fc2269e2b22f1a549d63e9f719b", + "public": "03b79123b2a3100420b19cccbfc688aa39f510b8491b67bdd296a92a021a3d0d8e", + "signatures": [ + "9ba679ebbcf6ebe265512d46265bdad40df99b5cb44a34f28466143cbc5f152d0e522018b8f4298ecadc129a1b471b0fd62cb51ea9305d93e3b189dd2b08e06c00", + "cf17711343205a01e4f5a6eeb81d3dbb523858cfd97e11281cff9617bd70932067b11313cde8b21487cfad20f7cca5f24fd7f1687fd073094eb2becf2e2ce37a00", + "1b45f0df19184f9e6047d2e4ae89cf5cc4f929fbcaed499ee7b2fc57c14e973f74ba3813bd28ea910a3e3d94ebab060353d564bac41cafcdc415226e9b8574d901", + "6e65a200a5a02eb1298c37d82005ced3e844d7065271db5752d242b611fef8ef2e3d811bbe83eb872213ca64bb9008bf6fe7edb548fea97e85dad05b4766cd6e01", + "7c020637b7d0f1748ad9891091de7f05f9b024d9bf4a68044515426f65d57cc3091b52ea7f72a571fcdcf629eb006523f4e173f0ab9fef7d1a906fa2956ef5fc01", + "1ca1cb90743f5599b206227ed8ae620b6e501cbffe662369a447f9846277d70569be1ea604c2c4d3af99ff5b1e5c4da0068bfa412f58f9c505d4747acd04962f01", + "af95ec5a6976f1da014accbc98aaa62340a4efd5f42c21a2ba73a53cf388b19022874e03e56cd77e9410e39fc937da8e02c23de7e3889c731d652c0da9aae16500", + "d1154d77593d24227e95233ffdb2862145457b97d27b4216e56b6a81523c9a455e37a98694c465d86573f0a55d20397a25f089738475114c954fa746b0c5ca1100", + "7d8e327ba9d328bd124b43f3d472b2a2ec45d4dd44be4a6d2a1edac8cb019c98675bcaf76e531e06e2c6c96294e8fefb1fbd29640e528a2d7671b1091c0a55b200", + "352d7850e4425012640dd63540d7fe760c728b6057bdd5722c862d59337dfe7c47bfc33bf439465ec4f833f10ef658469933765be14963982f6c112402e26d6000" + ] + }, + { + "address": "nJUPS5CrLV2iBdMvdMzMiP7iA2dzumaWGc", + "secret": "93876705c31fbf77f756c7a59616ebafe12b5ec6bf6f0c85014b918fd79d6df6", + "public": "03e0298390270c0b67c62cc35b493503ae2b3e02d2d2e7711e03beb2b6f481115d", + "signatures": [ + "d6c5510639c65b5c78f2964b0d42e1ffbef3101cbe51b23ee9bb9bd627020bda7fef7c1d291fdfd46ae66825e0d419a561be56bdb4e6585a6d65bf9b25d4206e00", + "789de29db7d31f0fd788a2cb161290abe58f48c2538ea620c1ea9f1a73d723bd3d75287ecc450bfd0c401ee43f67f45ef003d53dd85514f980e69d6be3fbe2dc00", + "57c4cec61bcfb07af8d934d28afd239caa988c5b99e12fe3b157010bbb4200882896fe9d1aee6b53ee0cb59ce34e3184b347613d22ffd18d34e5ee32b14f4a0200", + "01598d2f3248547c4438669dd9cd4ddd43528d71de8d91493fa65297a88b6c8d23c876f2ca5e0e2ce2d9106342faf4cc2a5d7e71e8c363244e5e0d0a1723f40700", + "721a84e14995fd84f3d2b65d45e79bd012e59e1cb4f0a801a67129739f7949c91634cc5fed042d573d552b9e5b1c9f043b77b23988e2b1ec60f37a61c1e469bb01", + "c557e15d55028b279f899a6aed370aec27a66e59f2d3cfff517696b64d74a5a05106fad5e5b795f45383c358f554c4bd97d93728fd0bf41940005a72f85dd72c01", + "54241216147f863da2d7e0ec30bb61365343c498847fe3a788568e343e42fab947368fcb8a879766e99a85bd7614c968bd517e5ff1975195a49f999767b43e0e00", + "85c2649489658ab69ee9936b616d98a38d6c639c73d6dbc4bd434e0cd079b605131521529b2dd6d50b1d45621b7974cac8e7c6f0ad836ef102df53f60a43d8f801", + "58462dde6faf9bcfe80e3aa81e3976a3c1a5fbd4d0090b925641a15c21bc6d6a26dc6ba374765e7c470ddee3892c01c310c19a2178cbfb7260692fd3e3e3b67e01", + "ce1d26440fd13d4a4501b6417b8823c8e447f507c7a198e351633081e05a91df5d7d4fe3632c11a7d69cd1a646a23bedda6e4cbad037189b145f97713436e90e01" + ] + }, + { + "address": "UxnG3PoFvKtRuLu5nyFdb6eu6pu1SZadkR", + "secret": "c1b8c857a2039d6249d3bd4e25d40b34c358e136869592d03c1e3ea85e2916a9", + "public": "037a13b47233d512e123c180984a67571c6b0ed10c012351842846a4eb33b26e37", + "signatures": [ + "d08141df6b5627105e2ad7444c6ac67031eae74fffb1ac993038ab38081b05841c591e997942501dea90332e0c8c1c8d8d1fc041cb0284819935adac9998066a00", + "73dd6d14687efe1ba1a03e8de150dbcf16e4c91f14eb626bb39b0fb64df9156836e3923a84d95d6aecec4afb71b406c71fb6145541787830c6ca8bd07b74017301", + "033beb311d4a6306303d3e7c7089f51b06e8bf7ea0f49c2450e26cf228d0cd347e4aec6143db99a87db6bc4f25c3ba72aff652b95d8f09fc8c2bde54624540ca00", + "d045036a4c717792cd1b76d2b54218cbb2d0c3347cde1b685635ddf76fd310dd4ce356e1c97e25cb304f3850c751fbdae646f4c028c68bbef0ee0dcf5fb0ce6801", + "96ecb1fe556f543e6abdd72255f8b844e7574afb928617fa7f347030d17bbf8c745484dac51073ed18a9a1287844fa22d5b46ad5acbd67096d857da1b303e14801", + "3bbb6961256e153fba0c749b1cd73bc5d5aef993e37c28111a3f10218af4a8625d263224b43193c00d0b383c0dfd6ed5017cb764f0be76b744d0e01d1df8e66601", + "ea391ffb47c13a48f74a70b96490f7b0f7eefbe4222d55f7bfe004b1b04b983a56a465da3e033df40a3b51e63becdaddcdd38bdabcdc33b249a30a13689e5aca01", + "0bd57e44ab89c2c677eb0c491b6ed609c85018f0e875a7e1300d4699d60529e875e7850562e96fb90c897f316e5fd56d54170b3cd6320be2ce3eb5362d03cd3800", + "b27bb5e4a094442b30b7d55ba2c4996cce6e454f79c88c339ef89bb754c2b2ca561086e3ed647881fc4f6079831076d413ef027f942643a5e939ca41e583037401", + "26faa7a87708f5d27731e866ca1cce8864a4fb2e258eeb16de8bbf86c1fc4429736f07693a5e42f0bab79c696024ade370fd7374c93cc8b692bd56fb7093295600" + ] + }, + { + "address": "SZRDLCVHyoP7Xo5FEnEw7ckibmitbNx25V", + "secret": "2ccb1679652e9bad28f3a316dd8d98ebfb5d8d72d679655365c4fd42e07089b1", + "public": "0284eefe3f4d6500fb563b69d52c7cfdf3152a3394321cfe1dc8d1de1e2868e3f2", + "signatures": [ + "392f6b36bf19de26894386049ae581aeb4f358296a02ea0666fa7a0c4732aa950d5b0410757644af454df89b1b6c6e8922676b21e095dc0fd094aee93e4be6a100", + "6eb48f725ed820f3001b88814a7ddbfc2dd60264612a29c2a6fe619dcd227fc3641873b78539dcb14fb74024e617b1e9c59ec71edd33f7292b5771a52bb6289d01", + "4b81f2caabe43a42915a7e19b34234f624f0dfa69353ccdc613874264bb5335003e6e04414ec7c84f4127f720b84772209ca59382fb4f38d102d312ecd4e64ac01", + "2428b1fd886fd31eea75246479dc120746ced1a4d97e633cea7a22ba67378f5636a09f06b6e9c66824efd5c761f1106b6aa15d4e0594c29239f4cb9dc1089bb800", + "627dde5f3179cfd4f1256018e59f17af2426a23d2131c4bc68d6cfb82b19a08f70e0ae7fe7d1029c71112272577c1db86086ed84ee5a7b17c112badcba0a601d00", + "8249b9da32a7f5c94035279ac4eb27f0e62cb50d230d1b30347d7cb0292dea8f2b662f54585a7bbd462858210010298abb3f7d1c16371d1221ff421a74a3744301", + "cd8c4985681c319ba9f7c797f5b9ba9c683776367dc4a90370ec09fcc8f6e0f07c7208db052e77ab6d595879e14423579eb2e2bc55ce04912e65f82601abbf6601", + "0aae569e4ceabbe5b8e1cec72ffc180fd9f93d5f17bc1b7df01e8951cb4c35a675f55a49ec380f8f33b561ff1647a063d4147808e94e2ae99dbcef97d2f1139d00", + "5b984636c673f60e7abe58c10a2e079f3e01da2fd8b41a239e6f596219dee2511ce4f0b35b1531ca8442137764980163509a3c05c219106c79a8e2f62b23d14701", + "9c6ff83bb5482a96c22eeef69246cede55105641018ef2d9cd40a265e45d402620403f555329262e20a5a0d053792ca7ddbdfc16d80552e4e0a8d6b83da86b9400" + ] + }, + { + "address": "2hSc4vmw59H1FEfsRUQ3eqvkceAAv6nanQE", + "secret": "867f5d21e6e2c3204b6c526ddd8a5d3b7fdaf8612f5bcb5423956a0d9eac9761", + "public": "02ddfd5d6c55293a925a7003bf23df040a91002f603c5db45c8605822f79caea01", + "signatures": [ + "e2255269e581bb78a86cd9b056d5089f03b77724401cfb900373571b5bce0c8069660bcdaaa99dc5df44214ffdf270d7e5065236867f20c2e692d2c4d7de0a4100", + "959d6ccae8bb8234634a5b15327a3e5ba03a15a6ac59341ed45f4e5767731bc358e2113667bf1fb15f15c0bde8b32d6aa83d4d9f91a8e479758373729641901401", + "cc8e9ec5f38f3d0a3ff71d507b9cd185ad7379448c2d33f4fc0944c4cf8d072f756e7cf1c38022375865105dbfaf5b7f71725e8c7a6491a1468db8ed93aa72df00", + "b82e4a33f0d9c4f6bdcf8a20acf103539bbd29d6e34dcbf15e396b980985f3a21d7903f83d6c61278d28de465f2a7ad2e8df1ae5db2bc823902bc63353e0937401", + "0783f3743f119b073a1ed59dea2641b5546fe585831597c655cb9841bc8ac16f656ac3ab9d16c57410bde691053675126c739cfc49694a3cf3030d776bb8def001", + "bfc6d5273d529ba5687a925e177740f33035a7677f366a3cb1660840954b417c0b9876d130231c1cffba939121d9ea12de9cecd88d6e84d5e9e061b4b443cab600", + "8edbbc3fa3c844abc1263b9ea429cde5df75524bb2acf2ffef42f65e4c1922b5676fa50b316ee8afec86fbcd116dd55218a44ceab2645d4bfb9e277822ea305a01", + "584242e0143eaa13dfb4736fab23f6a5e19848a3b625e59b9bf6c603789b00047371314b12fadc3b554437220c6af2ce6a406e694393d8e3da445496891d3ac800", + "d8fff1e095c12c899d7e993f5918e99164fa362d6262227d13f0e1f6ea40caa01fbab5f7b0252f306baa364a29e6824d4217bca7771b98e3114a6d9ddf72970000", + "6e4241e151308d5b33cd8256c7d614f804e668a61a16b4b7273f023c21d7e3006b41e1aff2703b4c8ce93da01484a70b6e9f09ebe09390f6f611db0694df44e700" + ] + }, + { + "address": "5vbcxd6wjxfVaa2rYqHXXYkW5cjFLmh8BS", + "secret": "2bf3f42540a08a15ca280560e43efd112e843d4de930a2ad8de07b1befcf7231", + "public": "0243e58f57f152aceda76daef9332f9ef9f844e4ef5c1b15685359d0d0dfa07799", + "signatures": [ + "c562d6f8476717a027f1ab8c14f95e444f6a5c0eb789a640a56f58dc0339ced44a62e983abecb139a3a96ff2333a7561df23fa8b1705b8c06bc3b921a51afb4f00", + "4cc7e74e1f2e6136e1e122817f39f83faac6e9e022bd9d0361506a26b368ee28128d1ea7f0bbcb6971fda0caaed4e1e52a0270aeaeaf3daa0fd833ca1e17715201", + "88674e6524a76d0d2e1b8d07067b5342e890d9bf11091b0993b6a5cebc74f71e29dcbe6b0a41446e3d7079c1ba2a6a4df34a8a9cc9724c3dc887d40bd7f5f64401", + "488a99706031b162594963d5bbf78d426fb22dfef8491b32ff9b30a0dd18fb5f085021d97d2bebfb1132d86cfcf72e498a791e19811ff1b3985a499b059a1ebb00", + "438fec175b65eb9644fa9c88e4ebdd7d77c760822eef3bc0bc4ddbf7d04e5d5738928c1ba5e2a31cf006a21a4a888d1986043601a563fcea71afd4e7a46fc38c01", + "f7e70b4a33131be328f844d0011efaee24b63ae60c38f3e79d9cd29583f479d6125c20606de51cd56ad5bc047209f4abf0244335c8bd666306e318dfec5b11b200", + "c61983d341ea122a3001ad70a9e7bc009f564e57b0fb0b8af60e3d72f9326a6248cbad7faff8740da7b907fdc2bafbedd1593c9b83ceb418157232c8fa1802d001", + "afabaa96aa5543d5b7fee0b63c84a9a220c6de4fec3ca7a351b793aa417c28391455cbb90f298b873349f9abeff8fea461a6217a8e1694c69fba51a1d1b10c0500", + "faf1e87ae00172aa9832fa7aaf13297bda608165fc583623062d13360bcb4ab42d8ab9a9f202885030fafdf12c8c21f4bb2ff85a7855e8190b15f52dad3b122601", + "50392beddfed77190bc6c31746006ae525d6be392ebe65a71992711456491031238df2641834bd50cf119074b8f44cbbd5d44bbf8d939461d4d2d09cb022904101" + ] + }, + { + "address": "2ACC9xnasQo1uuJQiZwyxtLnCBxMACcZ5HA", + "secret": "c2a0cef659813cf70809fb35804c0f6446524c039e4e14444c54f71d99888527", + "public": "0286b5204bdac7367a78f615f9cdfeb560fa36a7e2c9cd87d7193fb6dbd856a403", + "signatures": [ + "c77ab13d8107f4965708b75f24bdda7df11bb99b5cf0b8f7bdc8e071db62026b7179fb6256db5e36d926d8fc5227683e52277dea74b95f12c7eb6109049f813e01", + "958d52862b8f9c93bc63c3187a15e1f08e823aa0b4ce36b511668e7e082d05d976afc60b13012199bb5557f0d7726043f25e11434129f6bbc2ef665ad148492200", + "b9077e49d9f986de93cc360e5be3dbf8f30d91fc0f815752eaf0cbc64071000b16fbb965787a4a40eeaa8fd58d6f19e3ec49cdce059aad5f3674c4adaab72da901", + "3cbb3e9169b6116aef09e671e1f35cdbb7dc0fcea9e6f8152df98c371b3648491eaaf50a0cc6e672ed5e69f4255b9bff79532f8da101fa060d0b68ee0e86a86900", + "002895c8bd7a3537095f2e7670a909fd9502e25a6492278d2ae1b65a3f75642364dd31b5446c251174c57bccc5f40f9dfeffb959386a85b9473fabf1578be9f801", + "e3d5e49b8889cb5d655f4d4bdf16a2e3a35c88bc89f1a5c4a75aa82f93c8acc213770b1784c9bf5503f4ea127f4f928e36127d954b18cd3a5d75b1015966da1401", + "990c379fd3f47f08a6899f82f218ba9350e2a94fe046f9865b5ebef04dc734a808769bdfc057f45ea24ebc2a16363dd215c2656fee82792a34439c466a0c3fc201", + "60f194e854753e978e18455dfcd17ed6fc50dc9ecde80c9e78e9ba84238627a815f47b9a7633d6c0e963571a661c7e3896cd4fd26555df11b842466efa4de2ed00", + "12bc90a0c84c73c7b3331ac5106bc5b33202fd28428411721fb084bf5b57cd1517925c8f63265583c50ddafeed9c53c1817b1668a64480226161ec8aa43a73b101", + "ec850e2bc4ad3c96db1cb54cff954ed88566ed2046c806afb0f8218f92b66c9a2a51f2e948b36c5a0137781b82a401639e58301c790d2fad02c17de493bd9f7801" + ] + }, + { + "address": "kaVexneJnxkAbJMmmStgksNmJnZLC426Cm", + "secret": "af9e2a6f2298c2e47f1d77aa23707fdd2963fa83ec431bf48a8b9d15de8a790b", + "public": "029453f88f667c4f636d2461e03fdb8edd01376bf04c0f67ecdac93c38eb869f47", + "signatures": [ + "821915081c72f5b5c953d31cae7d74e65f4156aff94befb9fe18f3b6b4436102488d841a3112eeeb9cbaf1e07450fba1e76714983d5bb40cdbd4581c3a42a71700", + "2295b3fe78e5f199f8eff8648ddedb640dea47b46db10ee38a8942941ae1f70b25da39268774726427c3e77df81e338a91d1a1228053b417c33a9ea01e35854100", + "ebcb5e094ab5ff2c05ce9e6731d879379a59cde87168fda1c066cf8439bde9e53c463a4fecbc1e7eb72f65bd39ecfcc0e67f57dee9e866766e39ee3431e0337c01", + "afaec530e77e9e2906857324943441e574548873d1448348b4a754267d68217707bd6a5074ec510e6144f0dde0dfc8bdaf7e4e7dd58cdd83cae5454a7d0cac0f00", + "61f7f2667cec398d5f03b4d59abab20a7da2f9989efa068659f884bed748f49a449cc53a84a1d7ecb717902d4600c63cd2a4baeb16504563bf5b417157b43c5600", + "7ec0f56f2bb9cd8219ea83a4ac71477ce20061ac77889568f4e26633c68cd35b1cc2177e801eace67e7e11ec23c4d68a7fa324e6c32496cecbe0745eae3fbb3f00", + "25fc127004c1ea09e9f0b0c5bcb62ee8425b2a45484160ba0cdec8c3834ac2707963c59ff546e96f2912107cf0f808fdfc2c56562e19f9398ea37c888dcdfeeb00", + "9db1af6c0c87542eb3af726044951cf603faab78865862314283c48f608aa35846d660253b7d09f77a5b6873f3f77597e8f67f1cc02df53a7072da9cb7fe867a00", + "4c0308e93abf3ac49235e2d97b35f7ea80d18e7bd8da96cabc24c324e97705cd34094509727518ea807c20fc0b54b5d5ad0984d39c5c417b67db098563737d5701", + "6031dd2e342edf16e3d6de88a462a4bccab609efc48deb8c7f1d4d31de655c845e0513a38e2146043eaeb03f0bddd77d583e0ba55dd01379570f0c3116d2215d00" + ] + }, + { + "address": "JAiiQdrBFFSAgY2NxbU4PgKSzzycdjAJN9", + "secret": "2e6a21b2b939aae41056675f2aa47fa9015ee2472864b0da10cb0b3ab81c7d83", + "public": "028022f636b47fd06b43abed097bd3c0fadf44689936cc5cef4e40291281964aae", + "signatures": [ + "ed6a323988302ae35f6bf4344d0feeaf6ca2cc98924c61d89d2baac4756f84af157c96fab9ccbf05ac1f3bbda3ab26c01bd0de2ea5d7516f1740f21990c0582700", + "816166e485e7a1fc98f013bcba8c86929b81d2b4ee98b116146bbfffc51405d61bd43d91a03969f08a062a74dee64eda518555a2f71ab2fe54606b11e010d23701", + "fa66344d7212ab12eefcdc2e30bead3eb015d9e328a09ee342a60fb50fdb1ab91db7ad1b0391a2c5e483435e177d2190dc9624212b02b9c4a8ebb6d8e23e5add00", + "92e6d0c388cc9bc4a2a42c7cf7d4eee0e9969ee2673d1b3f3cfa049cb069e361255f0e5e3fb1ad08eabadaf8338b990b9a3c03775e20499952144653c7d4c56701", + "491cd9ddb98909e25c019f93f75f42a3f3be73628ad5c822e619eb63d2bd47022d38afa0b1017529cc5afbcb8ffad74cdd216ba9dfd934b48b1d5a5f47f581da01", + "5407be85be4c256f186dd2b552c47d3a5a50bfb6bba489f9c3dfe3d95b7213372fb5a884beedd1ae250066ac2b264a5d60fd8520798ae0f990c1459bc3f79f6a00", + "35ab96ef9cf604e2ce83b7a2475700435426789bb56b2a4e3e39f2fbf84692f85b4501acb8129ff57f769a9ef1d5826509ff86474fd12e9882b204e956d7832b01", + "b4598b238badb2b0b06c6bc3f37ee59ad802cd45990646c1fc2ac157821ce159497fe4b0cb90dff620b1516952007b12af295aea98d3dae4d5b16820f17145a800", + "971802ee62ad7818279facc0c549f6a54da277b69d55e01fb02d557ce93788f32eddbed9fc62fcb68fe0429fa615369cb0fcf9dde3d5305477348acefd19e0cf01", + "4afc9fb67f058d08575ba3eea93fb6e6309cccca16e359197a6aa838c9be7c065138af45c012aca1f74914402b8c3d84f7094daf6300c9045db74e7ab1c3fa6701" + ] + }, + { + "address": "Z6XPgNGMRjR3dVjcm4A5CBqLS3aqVQcVaA", + "secret": "0deaeda9c4f6391c54bb1ec5d16a31474b297f33d4e7af256286cea76e4fc40e", + "public": "024945c67ebb6749835872e06e9fe8d3f0fe13c154a5681764072daaebfc9f6c60", + "signatures": [ + "e8148d32e2bace9e7c8e6017e7229c3ce809ec88ceb83a01a2a2299fb87700576f79df74e7071e3216649de4653807a1c94193ac38f0d74d0abf25a6f8de750900", + "0ab4d582a506ccbfe351f54f676a97830fbc3efc24deb49f9410d8d80e0767e16fe6e0890c72b16774fc8aae801c698072e001b2d0c6ec2cb6637cc52517692900", + "1c6bf51244d387fae3b6409e5c42428c5a39db4178746298e29cf397b21335fb49deeb64ce486281fe6318f235213d016ef7142c7540fae3163a5de94f209ee600", + "f18778602f0cdef09fbc469c219e92c5bc52a5dcd7d873c2a4759d0938e503dc0d022341130004e45be1c7644d3ec3a338039d9c410352afce7e41dcb300728d01", + "2e0978dae226b1e70b46e88ab1fc2126fa1db334f022b0b960b3611e341b6986233ef8fc90a1a1ce28183b18a9ff5c701fbf340ddb4c45a88b1dfde74f7f39e101", + "3fe60797a43ffc78e26e55990e3eeea76e6e920e47ceb4a51a07ee22c2c0be1b7e51d098536a38537aa99d24af3c644db97337d51b65d13ccbd218b9839f179c01", + "ad77f584346779975e2fa12d3e7aaf0ea35b025298fde1f211488ed5b92d25343c86b4c2c0202748b80c2de9008fd043aa1d3f60262ec1f9f0f0e95dd4c2fa4800", + "27d66336014a5a93c5e2177ea72755fc0b858d7ab79a5976e38e5287549a6d0d0cee44bff45c3b7b89d6a1ea30cfda80c13f9a772d38bcd57c72f938db85afc101", + "9417eb0a9be763f5fb0ee8b189df8cf1a52657b87e545c28908802a7fa0c06442fd47c5ae49bd8fbc4e4985f82da6f86c2149e17fb903303420c7fe4d05a6b0500", + "421dbe10f4f49c005f3918511f9ff71ea6701ea76226cd1e6984329adbe4428745ce14e5768970e2e3fcd1408055b2f194f73cfff88aabd933bc8de4d607426f01" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0001.golden b/src/cipher/testsuite/testdata/seed-0001.golden new file mode 100755 index 0000000..db7a542 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0001.golden @@ -0,0 +1,175 @@ +{ + "seed": "d29yayBwcmlkZSB3YXJyaW9yIHRheGkga2ljayBhdGhsZXRlIGdvb2QgbWF6ZSBicmllZiBhZGRyZXNzIHNoaWZ0IGNyZWVr", + "keys": [ + { + "address": "2XDHP1JPEun347k6C559npPHT23V5GWeMkA", + "secret": "0e1e9ad1a0a6c688d9d04af22b2e07a13af293a05859ffb557c841daed509127", + "public": "02fbb044de5c57fae0a3e95ff02b9054ea82b54417a649088b76b4c340a38010ad", + "signatures": [ + "7d3283dcdfb1405890548d18839f6b7ecafe2087c5059e9d480e6161a79d6454213ca3da4653d39c269ecc909602f31fc7b3d6e7490d254baa166381281209be01", + "346269476c810294bf435f0567d1dbb397edef6e14e933215beb5cfbc07626c654e3012b5b56d218bb06ad9d384e19610824d80d618eb9c319ddfe206ba2655c01", + "1834af9a12d6a1f445441a23d320ab4f8a33b838c2055a3ba504c2e4b4e778fe5e2f7b1982f21129ed41eb20fa045f6bc0d248af77bf85830699826bf5b285d200", + "deee28aad8b2c995811b297d38ad4a27bbce26e7cd3a66e9ef69049a0336ccdb6a5d10c95b48cc561d1138b2eb21441bc83e7c02b7e759c8c270b17184d6f1e300", + "4b3657dff134d534749c5843eb3ddcccaa4f4c0cc7cc8d1916f002975dbc49d7731a595924b92d943a8c851f86ad78a017b35333302d51367b7029ab4750bcc301", + "5e045424c0cc976af4aed5c82418eb552b65f3daa5faed4ce7252e58edf6055c4ddde6b3769fbcde1daca74eb7681cc675cfbc2041d9b72094fd8dd0b87201fa01", + "9c5034280942f96a7dc805c436984a048a5f69b66c1dd1e8ebf07d9a34997a5f2f839a6bc4d6f17bf0f36fb3aab950dc9e5b62bee81bddabfc7d3aca80edf69b00", + "ffbda2b52e5f3e66b51feadecce7bfdad2fe28599233c5d458bad947f8760d11290a822629788ef521d39d7e0a7acb8b4bbfb7e69d3b45c88b98d594ba2bb84c00", + "0a21297c3a3b0ec4175428c78b656bfbae6864b4175fe02fa76cd9b353ca818a3ff3016c73ee471818f59d56112afbea170618e80eeb993d187bf7e4e608099f01", + "5edf4fb85781e57e15ac862da6bc40052edcb038a2716ddcbeaf99c6aa5e44037903672256d3d7959cc519fbfcbba47632f9c0648869844713e57dda74b87b9300" + ] + }, + { + "address": "Vqab1WiLJNvuijFgF1MMpvBxuq6sFUCA3T", + "secret": "2c7035ee76f97882a5c42f9876dd754babbf09acb0b78e05e7dcc51abfb41487", + "public": "03e775cae88d586b8df030ca149b93a71957a0a94c7e46c1d3a73b7f3c6488bea8", + "signatures": [ + "f33228d492945ea6ee40ca7b70161a9326f908f6153c2de82658047a0569f51f248cffb24033dbe9fffc6d7a9ec9745a3e52352ce3932a536fb6b4989506ee1101", + "e0509cdf76cd8a7dde14751190e8aa1272a04fe7635a51f454726e914c81e9a7744f189a3b62886bfbc33df0e5e56be6a16d555974955c124cea192cd0fed73000", + "7bb2e5b1162127af297a6cb76ab5979b1bef18bd309baa96e720aaf7188219ed58d0d520700c8415d4d5fbf75ad2d40960e63266d7db8a1c922940bb3770c46001", + "db6426d28e2345597df9aeb13b12a6921b4fcdd2c8017f33b98ad0a0062041072a1a270431d05a4af1a5f7e75eed79bbfe375682947e793011c31d4e1ac02bf800", + "01c403fd1157ebef2233dad324262fd6ccfcdb4a6537476acd9dff6490219fd214395056c03118f9543854822556667f1380bef6004b307683629ad0787c219a00", + "59eb6e47198963496cf86545e83375d5681031561de90e3e845d59317977a7aa4e70b08b87106f149139fce3514fbcf9d63d9da31a33c52a259b438050b86a7000", + "85e49ce059db04f9c567766831dad49aca85f1365d9a87e3b4cd3a948a42be82105b4d54cc47684c135b453e685b73e0472f42565d6f7d155937826cece3ff5000", + "f49bda680022309cb2480beaf3eb31dc88b6a17bb4f6afd00b75097ea8a17aee4594137fa0de216ae3e9b20846eee984e7cc4d5b68d9ea156ecef90bb371728400", + "93fe26c6153eb35fce04f0308ea84a36d4843f474c6afc4ab1ff8415b8274d1236f1d0b683b73b3098802d53e5ac2a0da06d9cd62de7cac8695e8d167baf15ab01", + "a65eaaceb3624a1e0ed73e5b04bd499b818e1636fa4f3145ba571e0d811a8ca42b8763f27a2a07b521fcb4c1f19e5e991127ca54692db641cfdf44d0bf39455600" + ] + }, + { + "address": "zAvpEnXXBKqLqUuqW4SXQKKpMSPRF78Pod", + "secret": "ba66a37d7ef52c9145221b0b744afdc2a39922e512af4387fa6d109392929566", + "public": "02b2508601b986a275cde7ff449580639c8b78442ce0d87539110c5fbec4886f8e", + "signatures": [ + "8c2202d04ddc46d2fd066b440c263e00102a2c62efe4ad53bbbcfc7c119aa7a83130d56f7e7a117876a0d4285ba056ebfd2c66f8ae81272d9f0c39d0602a8cca00", + "50526c8372452645fb21a4f8b5a7cdeb4c937bc5d051beafd389911f6360514a4ec32e6d08c6227de99d7e03895385518dd5d4948b392935b7f8b69779ae1dae01", + "e4eb76d581d4f99b1904be74387ab7954b52bbd387e6f7c033083dd7024ca3c31952acb23da09ce66af2ccff81a2d59baf17cc454ad71d6bd4a109486fb4fdca01", + "84c8ec314681261c43bf9120544b9be17d2378d508ebb833a353c34216051f4d28c9713bad786d5a90b3a3b228467085dc05f4da092d6eba4c8643b0adb4e6d700", + "f46706a56fb07d67fd6cc2a4071af59863669acf2d7f1a9941f8b36bde42c47e767089a7e26eab64b5bc8a6e116044a9a5eb3eb1f2d0cb7d4f51f9e50a76ceb001", + "56e4b18df20901bfeae20cc9c9f45ad7a7a3c7d6d2506acf7571c04415308e00379fcc74cbef49823c51dad0c063f269596fa1ac434b8405cfb9d1b125b0a47500", + "0855cf0318fdc6d0c7f106630911171e7c51106e5e837df48fd117be59d92d5144d0ccba6a42791f48ba49f3388686176a2ade9f0a7d91a103b2add7ad3d682100", + "42c0522ac061f7d596462a20c5994201e1912ca4c0181ef7002570b0773181306038a5e0221b971f069599a1600d20cadaab5908d3944f885e1389b20ea16e0400", + "643bba11d65520ed42000e94d2da7800e7b595475606114d87b603c1af4276780d83db0cd39999ac96fa35cf9977ed5bc8352c2a94ea4629bb7d6ad733c73eb501", + "93b65ebc83179381e53c4010a7a63e95e2daa9ddefd4d05c342a6aa0a5891262764c21bd85cccca2a8f040a00b983836976540968e65f26ba62eaddf597d977801" + ] + }, + { + "address": "GykRXwXiz5kjHyBsrUkHRNToHWSKEEhkAd", + "secret": "0c335f2076e58db76dde9a26dba8995028512180208c9ffc9c01928682814d91", + "public": "03a6963955bfa042116dbd4670361b989bcc0d841b96c0c402c83e7e1e23b64708", + "signatures": [ + "f9c115799f868fd84a1201021830966916a492e68a56592d5eb8dfbaad0d9c34564f420ab00996831f19db39bb94d81af763baad2d3e71f670f53e0e8003e1d301", + "a1ef2a9c00f6a4581105f586d735121f21f0236c48b1ad2d5466d392c53ad88f4bbe91493b909e48f6fa5a9ce5e7ebd93fc3c9a071bf2b760c6c771f04ed0b0601", + "394fee301cab788f7cc4af12f245a0b4765519cec1af7208409cabb06986add670f6c8641c4b40b7cd516d0283fe6c2ad872d953fb34fb9b554ac272268fb7a201", + "86493a09108cd772ed60f67ca2e5dad4c61d04e9dc24809247156400ca41e7ec31af35d01d71e24a3776673e7c825100678e9b7d060a7b5b5013160ac4f0a10e00", + "aefdfecc52c33f074351c497ffd2508d0bdb651f7b5745bdd98ae384c266f993336b6bd67d575d749db3c54bb2dad5d977958840309b954e3586e5b01fcb7b0701", + "3b032eb1fd883530a7d8f4fafd023f83da857f8c4381c1d0a055b8ffd1a3ad8b5554a1a295d188cca6ad6ab1ef9964610ea53d92cb868fc83b46a12206c70a8c01", + "e59f70fbfb3b23e75e290a0569f323ed6c82e721ba7b268b75b5833dbb3c739f4ee0d92593ccba21970fadae8904ce4e95e6edc6429377229b74f6bec34ec77201", + "b3936090c63f04f6a52720a102f1dc5ee26123758637b98e23c01dcee3d6f280266963e980439eb9bcdae68095fa5cb1d8bda02a1440be90a5e597f8c426bdb600", + "09cbc77d194f64d03a3ef27cc4716241f815e8b3b46e5ad4fa68277c5d8d1ecd72bdb8576be4e325fcbbc67aec516de0aead8f871ab9087ac53a39bf6f9db26601", + "704365c292a1d934d26956584bbe34ac0db54cf5b03ce3f9b1367805cd488ff830f0e2fe34727e8c7409fae6bd4878e10ae2b452fdf15c9a423afc79e653ea2801" + ] + }, + { + "address": "aZ9jLZm6MWpy6kF3kpjJTNo2eo4oLbeeXx", + "secret": "ecaef882b218b8e182f17883ed7462b4120064f26d5c7880a596e9f8bd0cff52", + "public": "0268e2cc53ec1d81dc64731495428a98db2331e9eab7ff899251931662ddd6c12b", + "signatures": [ + "b56be8c206b65c96cb8e0d174b289dc0f78d3d1657edf35eb2dbeae0260a89b96e7bd8847e206129348e0ab303f2a7f331d34fbe81d11b85aa02a6c0e9d3ee0200", + "b4bc4d5be6e24a0fb415c211f4420dc92729f0a1085126342d04fceead2ac7c1699542e02aef4e7a5b8426915a1a68beb1687669344256ac899e5332066a455201", + "4f037576467400a8b68bed9f47deac9956a1a6eb353677f10e21b5a424b2a0656efc0a949f9c0b125dc1c1208c80e708c5ab29eafdf97dd40f26172decd1726601", + "2365b10f2be2fdde0b7831bf3f9aa24fadcdf4713a6efb422a6790e353dd71c74d813e137da07a6f9e1ca515b10abfc316ba280eea0eb8d1645fbaba20c2e81800", + "cadf2560137316bb8827417e8ee322644cad64c4c1ec9aac63967f4a5ac0ae7971f5260c83d792c044332f07da13a0d573c9905f588b607486ffb00755a94f2600", + "a16edacc86031c008d0b5cba9365ca9c39ae724d030fa288d11726adf59e7e3f4060155ffea336028d03ccd08393dc27b427121fb5b63fba892171aa0d00920601", + "e85d863e3e5b30e31ca57c511614f6a53794a48a16197d2a504f6b4347e8417f73b2d1367988d687568f8b413c4d3b854daac8df95a64c22153b76e7ac03123201", + "a98e2e0361339e11417f4d8d45585e8fb3a517735793b2c4dcb7d06838ef80fc06706b99f91dbfdc7568ef720d9915169e63003b435c2e2d03557c90baca319e01", + "f2b62c93fb7d36e0bb6152ea57b7eb158fb93984f12fc7eba7151a8a4ebfeec902f2c2205a910c79288063e3b73896429f162cc253360f50aabe4372d81badff00", + "3d99597f0d9f53dbd009640fde0e7c44ff567babeb4d5eb54b7f00f50c337bc92155b9342cd817fff6291d70e614681b3d890a1249debd89a6d3e14e6641e2fc00" + ] + }, + { + "address": "2mLzdkpXtaLWvFuVvzNgZFcQgBnd2Nz6wEh", + "secret": "d35734c6a9df59900f8fac59396a1e1e735eb0c43443bba39ff814c9f91abd4e", + "public": "0272b067783e0ae0660364318bf3b408b12c105f6f75ad6da46bd88131f8cee2fb", + "signatures": [ + "ab9ea96f4f3638fdf6b5166d7c971b7e5aa71c042704ffb4c21657ef29cad87e2ec2c8b1d220ac68f40efbc7f9236bfb28c02762d52bf1b5677a7063682cacf600", + "e16e160405c0b410d1037fc217b32e2fcf626a27a5f50ee003065a8059bd40757e18a5f1d469009458725b936ba581a99af1183838fe7b0b3931cab941814cfb01", + "80c491a4668da1a22eb4eae950c1456a07919286656e327c0b9190c7004922ad50bb59de0620ef381cf1c10515b2f31d2850650ee65d3cf60fe44276bc7ce04f01", + "3d3f547e2644e3b8c49dc5a54882100bdb499879017f51949cf4bb8ccba9591040b1036483de48b27aba1bb7f8d73ac90a96fe787dddd233ee5406d3d8fcb4f600", + "72ccf7ebdef8e297db0a7348ff83bf6149e50daa24a29e38dd2c5f0d8ddd689f58034fcf8eafe64eacaba243dda0bfcc498743521f569301c9b19f95ea71d9ca01", + "b7347269ce29185b3ac9bf94f623307108dde70145978005d09c396d0739682028a3bbf0460eb7c848f3fd1648af5e90611e42b49901c40aa22e4f73bec0290b01", + "3658c5490f32f423ccdd10fbdb2c5ce674424c8635c1236ed88a37732f253d6212656ed16c70fbb31e9980f27ebbd34400a424d2110baf67c348c167033c7a0400", + "a4111d9b5b8ab7bbca90adb0b4c93faa45fcb03b717a6f11ac485b64ab3b0da505e2b749d971c700eafafea370c9feb66a1385943515950291fb3253b255505300", + "34e8c561770c77c2aa14f6955a1f5acfb29b7fd9ae846bb537c50f02833a35d656a8146517cb3312577a751f8fa1d3a1d48377a9ae6f3fec5fff3806f335fe3900", + "ed91dc06187be3c4688ffb6da8fe16392daf976dcc965faa4dad753a46cf2da476db8956787d98cac6af62665be2f31a9556b76d1cf4684127f90502d9a4ffd301" + ] + }, + { + "address": "2QDx8n4AqA2Zg6BjHPbvKa6jjTqn8GuvDmN", + "secret": "d65af2ad4afa373ec16c002605d384c6dacc8e6f5b803eef066626f518eee964", + "public": "034591c117b23c0125cc41e78d887fb64d3ca4f4ba6c14ba9e5a03380114096ccf", + "signatures": [ + "0b4418424dc07e0ef668f9363ca9e069946c8f5f2e0e733177fc37ef9e9a0b17626fbc899ced973cd2b2794b9980bfe8004c5bd5f9f8e7545fbcf3d45387844600", + "18889e1bc48c7ec850fedb15d991145607c097c061c78eb8a88b709b01b7a996479f55f3ed9e44c8e48551d56e2292011e5e2af8820bd48e43a0a572dfd2197801", + "45e65bd3a99910aa5cde9d482bfb5ce61b138b8d3f0269b7d892e5975bea8c9b7ac6b85541000f75f7eb0998161357fb7cc54fbaee11436fbaffe77ccd0f0b7201", + "ec56ea2c59898f2885313db13dc7386d7d7339968139190905c0c8f6c1b93dc868b03b12f19efa0de748beda1727c9e7d2ad5b5f7121a4d77c38e675c70fcd6600", + "893f74090ec8b968a3576e22280c946f75fb59b6bc8b32c1f5b74485f1d555ca050285b91ee0ed5a3d3e997a7c9c2f3e680092025065f5047631de41e8b7359400", + "018748f5470e0ba9560ac9b284265fd93a7e65284cbde89cb8bd17c7bb570cc94ba0084159d0046769f2172152e53652e29c176fec65f03d8f319c1187530d1600", + "8abe93c4ad0a2860274a38adf092dde1e49ca71501840d66f1b3f515e99ba6b05f231a7fae44eaf376030f1727a0bd60d7623573b85198e6a4d995b84d89c8bb01", + "7767f6d6810a2026620886014d9197e67f73bc091b6c1356eca1eac80300f0a6080d8dbeb24785d1a53ee87612d833001b7f0368ed9699c559c7443c3148a95700", + "9740dce7801a4845fa194ad13ceab4179441f2cd708797ef1c1720bec9039d1a7adfc34098b756dfee4b02356ff86160322afc29ee603ba4a8091108ff4c619501", + "e75ac790094525f7eff99f14d92e7ec035b0134442f1ef55c6ded7af74d42a6c6f689e9fcbf2d9b3de722f9e1415e5c7dce756946e8ae8174a0866c22b8d9a8f01" + ] + }, + { + "address": "nSXnnQA2aaLHdzg9LXgyoY1bkRYyoJcPNK", + "secret": "3a6d13f46da4a800ef8c2e350f48e53cb601efca9c1af27f0650065d9334583b", + "public": "03865c2b491360dfe2afe6e918261b9e909cd87e53b61afa3edf4fcf47bc4f9d51", + "signatures": [ + "1d9ff908a3bbd7416efc2a9ad50ef9a3b7db795857755c79ce0457360812116f516960d1c6f97d1d8d0ac3ea2975cf2f4ffa0d08b1d35224ae9799e91b04fc2a01", + "957ae4c1a90e1465564112a513597c3bd6c8a1e341f682b8a251a0c6272e9f562a0d3d81665425e7f710fc3d20a9f8a4a28b6badd63c92922b1933fda2d8376b00", + "d791eda6f4548bb24fe5f0b1eddae7db453156187a10538fcd837fc63dc189f40359ed7cadd04c6dc65946488149854e4cb5baed743ddfd1c49247e7305d9fcb01", + "7188ed823f256af8a430f9c6e56769c3455b093fc649bfe6e779a97219b9d3673dbd5748cc3bfb8097708f997baf7b901290ba0daef661369738a5f7794e72cb00", + "5b5bd1b9b1ac663480cc4f1652151aa0a27d456392dbd7fa5c1077f14c523d200b9c677b150e4a03f68c363c987495b05cc7dbc1498f9347dd7e7b1c598f1c0b00", + "1d9535097480035b32e949d5b678ab1bc0a40f998eab8f411d8917232ac58af0022d32d709431a693639926e36ef70dcbdba6841bf8a6edf007d4b2b339b02bd00", + "f99830f86e5f4c812104bc7f7d4b0f2dea4e1afc0cc338e93f378cd82f044d4f2647771d665af37c3b83fa4ad153516a120f6177cad4c6b151bb7fbe057432b801", + "d28e2d7aa2964f048b262c9bcbb9a462196d81ffd491b36700cf1ebdcbe51a6104a97beff3265896731d03e7f98239358c14235e2480d10665573e838b6e6db000", + "97ed4c87a77ef0bd231debfe414bf1335e74be8a1d56dfc5fe7d8f611246506f1e7c6aa6395f2a0e31547d71e766358ab048581678d83b2ee2362b3e52ef7c3c01", + "d6717596c6f62d6430c475a46f6ae0e062cd667c1bbbee66cb448daef72e6ef1093011f7e398488b280ac763f3b11b93b2d643380d1e0514dbaac2d6293271c700" + ] + }, + { + "address": "25qo9WDafW5bL8J1rrfDo3zAFFmUbWM545B", + "secret": "03a71adfe4f3a34087b6b0f303f0678b218b386c3d129a8366f9fd40e11c1050", + "public": "03d5b421cffd4fa34d0aa36716d7b5f34c78ec362f6b2396d1104c490ecce196d0", + "signatures": [ + "2aea2918de643baa9bec04ea49f9c3bb7858b09e7d0a2dfa8ac718367951ebfe6e3825f4a5aa08f3a8ce3ac1fd021aa8dbd68f2b05ed18746a53d70cdcadb26400", + "c0475aa5ee4dc3d3264703195a145beb28731516684194fee43c9538444079670f30eb13522ad7ef654deed6a7a6a818f38d79219bdf6138461d43d8ede9aef901", + "7ac1e3195f1ef8b99084f2d97250b8dba8cd55148807f8d3437406e252938f1d78d86fa5f9b6949942ef4579fdb0a8dcbbf3cc37cbcecf51605ec4aa2922cf2500", + "af2afcacc960b2d12395e1de8668a456eb2526b250e5942db785fdf3a0b055d56015c367ed6de7efd680eeddc1a8f789ae787eda887b23a7e4f6c2f7575f10b000", + "4b9ab114829349ba27e34152b51f9d3c83198673a354a949934399088508d3d014baac7e910c367627e37a1544bab8ce1661600be92c346463497e6965551a9000", + "7e5c5d8f8f27d2c1461b6653089e7727c7a0f630ebe5012d07d75979095658ae0b5c679b3daa5ae34a528993d6c9f60319668f36e583bf607782766adc7d9fc400", + "ccd7e23d4de2f095d77d08b6e34e134521c5aeab84c9ae78c427cbdb0f72c310261444cf20d21ab84ac2ee6472b8163204323b5108adc59c6c01e72fdab6eb8100", + "f7eb4299d5b9fdecc1ea7b366b1d82713322d15390c057953d6b42ac76d0bacb36d9f3c5568bf2f5c6372d4f0fbcd630588f3c27c2309e1da4e02a09d4d6ce4201", + "384b61a3719213b153ca45d788c34738860c6353d6d15751225ae3d6dc35bc192c0189edd24f96f95898a29164291c047a1d11099d397600820e171dd813b94201", + "9392c342570352667d1d6ed8c1a8438bd8caae455e9901194f788c4fc653e04f43d328453c9818c0a1b009767e36a630ef9453a51b4aab4de80581a78119212000" + ] + }, + { + "address": "2U9tv3pcptMson7aVDj7epyVhuJBQkSTA8W", + "secret": "a7832a68c6f1ce353b341c78661ec2e39291a3d02676a7804c04eae2a638a68b", + "public": "035bbcfedafcabc3f0bd26f3af4e9046d01e96e6d596e751e2a3922815f586d70e", + "signatures": [ + "d0857d3237ec891c839269dafd3df42be1e8429765673bcde990d2e760f827b9189da08b0037bd8a0423bc541798925a4396b79688cf9e329cf42881aff93d1a00", + "bd143fbef42414fc7520308c6492dde2fe442b19deb2d2c8412626c0f07526292ad3bca282cda727915408e14da782d3bff8047eec4011363a8db4ad562cba5700", + "4893755c3b2c465c3a503465a0cfc7828169fcdd52139f042ce4799dc9d0a4003cb4e40c271de767fc8df0a6f93745a591fc2dc13f6b17a12c95473c1042857a00", + "62f03a6284039b98acac22c0d64447ffd65be2101b22d104eb098e4a065d995d157226a117a6d34a2e2a053dc199b41a6e23074a8a700554c76fa45ffa4a1b8b00", + "99d7cc90fb119c8b722c0582bc097b5bb260b0a871c9c05439dad466d1c970f112cb4311efe7753d44e91dc0162c3d2befca32848767fa642b50725e02e02b1501", + "de62021fa95a4c90a5cee0b902d03119bb801ef99a6c575577b32f432be9da047e8b2a7e32e9910116219bf1c41dfafddf38f99ddeedd01ed1bed9853779e7e800", + "dfed34d6c672783dd664ec8f4444467b1e15c2e3aaefb21804545fb47398c3d3728c86c27e1507d6b14bf3c5f952d7a308f0fb5e5cb947dd0971cf37440086c700", + "4d410ada413d3af780693aab75d8280da0d9af542875f8b71f50ee194cf9829a33e23686760fb9a07f3bb37af99b1c97709c124b15c0fa89ec3f9709a1439fe801", + "a5ddc28a3ee448ca1cf28ea8ac3991ce2f1fe562d52c8a7634d58871744253f2132e8bc1e7c13a370429eefa26c6956c19cb548d5e4e663e47dca12fedd16a2300", + "3da1a98584f6ed35cbf918d514fcd5074157d91b99d84ee1267b10d40fe0d34b42d552f8ea1d09b44de9e32fc2339d1d784046d834c790c471fcb9249d4030a500" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0002.golden b/src/cipher/testsuite/testdata/seed-0002.golden new file mode 100755 index 0000000..585fb02 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0002.golden @@ -0,0 +1,175 @@ +{ + "seed": "jvgFL+YrrDSJWjeXY3tJo3dek4BbeV+UzrMZ3yir9Sg=", + "keys": [ + { + "address": "JQCEabhVC6ZbsgxbmA5MHTzhifUbX2PUPR", + "secret": "e7c807f67e53438daeafd79a7c52ffeb8d80bf5eec00f281515e7c1d7ceadd13", + "public": "02661206c9ce3649dc890e58e24763dd1f102e7312cf778bf15c0838a589736c7a", + "signatures": [ + "c8d3fdfa608b495c14fd0b47d6f8408a083986ddb58336082f1b0b2aad32aaeb27954f329267c4f2387104f80451a6abf237f40b5e93dbdddf39262fc35cc07e01", + "411f4b6179671d9d13233d9dc9ae4c41982b1e7ee5beeb7389435f8351ae1dcf31d2fed790a49d66cc74c714792d2029a75dea964dc2737428efdba056b4a7f001", + "87ab0f994df1c137ef4b0cdeb657630509eedab2f3fa390de2d8ef51f605743522119933f6751f446975616a95577398e7b0c44ab997634f716bbabcea9793c300", + "77714367c993faaf9162c73cff53f78a0f2bfe6be96b71d28ef2680cab54145047f69c6b592da393aa48891f87fdc261e0dbef1ef718fc0fac80cd11b4d9089200", + "1ee6bf3930d3220d2338a50e66c0e8192bfb98d8ab19e2bab7d0fca6aaf553d95e3f4dd3063d0a6ebf1f9d34a8a0f42c69c2050ff9174ec5a93269e7d6d4c20801", + "026c0be15dc3c74994c403ded0ec0b62982a4916f6cf7acbe644f1205b5cefbb1353ded02926f8450274ae95c89892032d23fb6a03ce192ee0a4408af42332e401", + "4739117ae45320d82e2e1b41ae3f60898e9bc0258d1d7b3f90de521db1ed8e9c67e4d9ee8b5d9ccbb1e5ca76d4cc3caa7bd1dc5fe343a4792b26ff29f0d894d301", + "1c367647b6f9f5da5b1d1ebe3ca06028cc285037c3df4d52c95c832280312e9833e65fadb77fff05e5d649ca5a65b57ed33135d5e190186f376eab30c195b2f901", + "21437ae018a00fc75f3ff8ecc69055fa20f320786bfc87e5a3dfd50767f5e64a392ff9dfdbfee7b28b25bfd043e98932ae3c2019e62bebc5ee09ce0385944a0100", + "93232ce00bc5f85f28cd93237be83f861f1fdae74d53c2ad024d4036420178bb1f6df282a829ca5b7361ea348d188ca88c537878644f8e1ccf3bef0e64536d2100" + ] + }, + { + "address": "2xYA6Ty5ngQSGxUxLarPiVpGexTWa7kmZ4", + "secret": "cb09609a37b47ab42e522acc616a8276488b255b07c7d592a03de5fc19bd3ad4", + "public": "02be247f8c246ec549cd378ce34bcbfda52a59bb2cffc92cacc26877c2d0d4e06d", + "signatures": [ + "b218b9da47c96150d6477b44c656ab5bd4e3098f0a36cc37aee30d327e4bc1d37dde4dd8a4167d0fb54dae0b56fd7d7a7aaf7f7671898b81ed0958e4f51bcc0b01", + "3efdb6bd6b772dc8039ea5ce52c9d4714a3b075463180b5a45598523da21a7b32fc6e730a2b7cd48b7e3fb04f61bc8acf07ed6b97922dd3600a837a6d6ef601301", + "fce5664c0d550e19256dd04eb20ba1ae255a855702c7cbfc22576b9057ec32875953066bb020030eaa9a8c7856cb8c2c58c6a3e4cd2dcd7895de8f6bcd5157e801", + "95fe28da7561ddccc725d2fb3aa540bcc8e4571c60b0e744f0ada9db5ec772885a0efc8de1dbee4d347b1caf601f37d8d74a075a6dc290f4960cf70c8370563401", + "b70a88c6c2a2c76df89b481f3546e2a7ca08882f70447043313156a2d5b90e8d0de40c0c27e5dbc565d6148247582b6b05410d9d69998ed4332811436c7b458101", + "fb0f74606f4e239fb7134c6bf3d91cf3a2b76c4cdb08d4c8189c6b457b0663cb7272c6673c93d94e4d7cf94bbbf3af983f541b46a3598a0efe60bfa2fea4508b01", + "3c627b20e0298231599e59d4c803b8a49bab9baba4f45a49d616d4cd06660ffb1c2b60189845cf79546322b22396f613314807e034163e66d47318b9d0d35be501", + "4363cd2d43a6c23df3304023887d7a4d291645c425aaa1afadaf96f1c1ab51b709c054741e5ae7837de4238d0587634c2e189eeb0f01f6bec00cf273a9028c0b01", + "71448bee0563d244d32a17f4683da5c20b786f831cf32bd30f05cc12e376fd9f27c9c60a1130bf9887f2249f3286e4a855232091f1a8900dbfef9b1ad863f70500", + "10ea5ad3a7699ec6de2d3402c333f2fa8ba7b186a3eb378214098a8d1e829e6a4e42505ead889f03113b1a4088b583dac42830879876a9bc74cdd53a815c379301" + ] + }, + { + "address": "zNyfR5GRMNki3HcyWe8da1vhnq1Huf1pYE", + "secret": "1469780a7a54f01572e2a29326b8726a1e5147a2d96222b1e8220b01e7ecb428", + "public": "02e8c038377cba9acf5e6bc9d886973538b8897eb34de689c957caacabe8db839c", + "signatures": [ + "2de7268716605679f813e044d0dc9592660ec76d9fd77eb6286c3ed9a56cc8726b63b69874c186335a5acef4477771748a33d4ea4c7040b6b712aa38e975a98701", + "e320dc92764ecec970a60a0a47fe1580162f2f97438bccab0496dda3a1d985d8132a3d7c5c2eeb7f0aca5ec71a855f9121f06778150d7d0505135304fe991edc01", + "fa5edd7910235a8e57b31fced17ae73d32366642eebb7919538ba17c565e40e37f3730ffecfc7ae42207e531921b7e0ca87bdef76523640659dc7337fba57a4101", + "04c046ff48bf60c1ae74b128d71988f5ce435ee99af83cadbf14c6dd7edb1ec61051fc0ff3c18b020ec642219c72dd45b7c76f4828bc432e181b37959f82d40301", + "b676b3cc400f3362342dd1d279a7230c57dca3973f5a82486717ccbe00dcddd87bb81cadd29fb322d02b2dcc59a3d47b78cdf25ea788ecd3e9ba7cf338d248c301", + "f8adc3b7f0c241f45d8c3ca7b4add88b819ff8388c6eda817f8fb44b5d46e1cf4f1a2554f68957ba82a36996926f25292b7dbce9a37047875eab3ccccea19d1e01", + "1c5c583bc903de18d020ba9dd2494fb9249b387252c3a7967f93ce8aaebfce184cb3edefa7480b886a944d1b1712e323fecceceb70a34371eaf1d87a5172a9fb01", + "7a20e7d8587ab4e612033448e19cbf2d76309ea3914b52578d6000fdfc8243d53ea7f25c81acba7eccb9feec3d09e20fe8947656beaccbc9d63bd6ef79ef96d701", + "800f68685440c16a9fe8eadf94e703b6cf750d798c19bb21df50e0afa2ab85e10a67b1773e571e55a26bca2d9c40ca6661815ad8723c5dc077be6a125d9019b800", + "479d3e035de00b7dcf5cbf5e5ca641b8524f8dc415ec6c60170fa367b9bfd3002cb2a9f477130f105d0ae4ce2d56ac4c4d6cb8aef7244f65ca04c149f469caa700" + ] + }, + { + "address": "2JLkLasmC3aZWegxfrFBMegUwPMMaTRHezu", + "secret": "0c0290d80263d5ca9c3a0d4a8425bfb340387660feb48de1e0020853daa12616", + "public": "03491b93d73f48083311ae3c06f3ecd8c16474e795a58e3ce301ff548e9bac33ed", + "signatures": [ + "13728767950c9ce26b4b7ce9c520a7ad36044ac27fa72a7264764b15b4fdb2e3404d3cd1e716907231fda3db6d4d7b9f1055cada44d72fc3939fe892f4bbf82401", + "d257c55f64e001336df83863ce2b065efab6c60799f7b13839f7abffed5bf5dd6a108c7db8b00dd4cc313150966a88b34770c9d963609054c3f791c15ecedb1401", + "531982656772e00adf2d87834a532310a1fe018a7e44a26b110db88cd51c240e3501514398eeb26ac535613b35a2f71942f6e621598d026c18d29127a8b5c33201", + "4095c7b25fc5deaeb3ceddbfbf65cafc5b060e5a790e9cec3b9b791d2e3a556258eea375d87839bbbd3e277c53be855c51417225dc9d586568cfbce1d542da4000", + "87511d32bd897733747252c3373a17849dd6b87c68f3eec30e30f47ff75a40982546d22a33bd2398d2525ff99980aa96ac0e17ed8ea8574329d427262cfb5d2401", + "d2011487bbd4b997db6c12978637c3c042e397d17d9924d65417b2134467a9d36ed7ac74fe0727ce3727dfff6d90e1607062edd16407f93b26e466162f188fb001", + "5f65d112bc25524334e028ac597c3f9e289394a0afb2e0af6b038eee2a66a40169246279115b5b95e0c4c79e9ce738ea79636c0ae7c1f1e2178a15acf3617f6e01", + "3e87be40a4d5a3c9bf3a8c5e8aded3e311788fecafa3736495a71e06876f55055d34376352cdc8c99de89ae69e48c7dc7f845278408562c681f1aaa02860995600", + "a92ca8f889bdce1c2bb27b1808156afee9c5448cbbf9eee7941e379797261a3346258d418dae445da9c483c55b68c10285c8c5ac59b9e9690b3f0bb429b8782000", + "138752502a10679ca518c2f1c8394b0f49a258a8f92f3e07752a72700817310a08e76da5600f15d214b58b0f3fa00a5797a23e294cc76f72c3913ebf624ed2fb01" + ] + }, + { + "address": "fVQJVXDCg3xx7nSK9NtLm7xw5wfhPenak8", + "secret": "7a64f76a55d52e9ebcc2fd8703153eefe458b7983e8be501cd7b53e99eb7bc38", + "public": "032849624ed86775b96a940bb4c3ea30ce87d2bbf1bd78a8dffac5d5a26a32edb2", + "signatures": [ + "ad8e2123a55c325578facac3b33a4f893b3f2afb1065b6ae51b26a4937d4ac094b89ac89036849a7474539be19af5a82a10476bc9cba60a3c29eed8e16cdd97200", + "3e3811c10b7e1644e4cbb4feb05713be87055c3692124abb51f046d3572ce88367cb91dbbd56208c0958482730cfade12f481babc35839e37c063826f5b3165900", + "c3cc2e9ba9068e6896f15e522dc64a07c2d8767a50e3c95f5d591e708101575655006f4124a433c8045248737772d4f8c49db07bb4fb7e4638592ac2901dfdac00", + "f7e7bd47eb319bc33e14d340b73340c78527587e470a92a5372ff4d4b10780a03ec02ee20ba8387d2bc1f6faa4661c94e2193009c22bd3ae3c7218b70598dfd601", + "d25814fa5075fe6f6dde48d0036638803bde3cdf6162d284cd49182488cb76985f3a27becf6ca57a04a17286fd6479ce89e6e137e47b01a347db4df0983193ba00", + "d9db8532cc2595e35e499319e2193e28024d08f845c6ab83fc069009c3e901f9051953eefa426591d56d092ab7a4b7c8e0cafe3e6704ce0bd10466589cf7e75d01", + "5a7556a143df94e47195afd3ec97fbd8e5a10d970fee7135674a5cff47da053171750083f985fb09dceb762dc97582f87ac312331ae2d2aaef9f34c536bfaa7b01", + "b7e4cb3d1dd9405fa7c4342352fd0920078ceaacea6dcfb3fa5fc5b95ec4e9550c50500507cc8584f9671c8f2c52cc7f773451d94b34adde0438e14aa433461000", + "fb48718e2d5f99114064c368f825842544968cb59a59fe3247a21b0f959397723b838a8b8a9b52690eb14a404987206f5408600e5afe1f03918a1a91fc53451501", + "13cb6373816e236bdcb07c5700078604cbb6de83324ec4f952d9ce046991818242b3730f43bbc5644448fc65097c450191a3cb4a07aaa3115bf7b01de5c0a46f00" + ] + }, + { + "address": "65uJtfRcuUQnQ77iXgusuMwUUE8X3YypDu", + "secret": "1e83fd70b9c3c83271856870fc194779562aada020bdd771e9db16a26fe0e699", + "public": "021733c35bab05988350a1a4012f1a960c9ec09df6581d0e205de3ef8b5589a006", + "signatures": [ + "2d41e8b8bb40a4f4e7a6f3d4e62ad54a1ee0606a968e317bc453a45632384fef6768fc26faafbdfda6893b6cd397d11f25bceab298bdffa0d15beeefebd4f51a01", + "9c7b0470d72e6adc12b1a1bc3cbce3a94a6a899f7a7cd29e4103f8ed25f1ea284dc034e5a4daaa44046869093bf65e5a918532b5f7ca9f3e5cfc5fb41db1341500", + "4376eeb10daf7003a33f1e09c8b308673b51395c607bb64dc2559dfbb669ecc84ab7ce243646b4f1078988051d1c2721a1ec834852313b2f0b1d0473d703914701", + "9e4c7b2251a21ecfa279428137229e0689e5d07fd045e5937996cf2ba36bc85e28a80a8dcc0d08d71a9aaf69e0681002dbdd0e7bf996220fb113e73e5a75d7cc01", + "3ce1f8df018a64a9d076f8418f92c4766aa48e4863b4dcf9e5259f844d8e93d35d04853654e953be812d13282a996efcf7bcbab951aa315e3f8bac3b4c0fad9f01", + "2f86dc5d8c351fe522dd28c48154f9012055cf84efe1e5ee852c35e0c1beca515df764310a3261656123cbb135cedb066f1e2d15c6d3da50809108b1dfee957100", + "630ec741f809aeeb3427b0c3ad6b87d579fec9fe1783f927a9186df5059d5c1803b9d0a91d1f4d7761b374cea2ed1c336de82f0abdbeafeb718894f0b2ac253400", + "211d06f41bdba332658455ecdb19e70f13533319e25e2d9e701201c4f6eb038a22a04478802a9fdc5da0ef96b4e97fca848d142c12d831269641aa013dd3da3000", + "e35d120fb5a7ee7d644bc0b4b22a81b3eef841ec1388d0d094c3aa85322f04325b208770d47a5d9dc251e7551d63801fb502d9d10d6d5e216ccf4f456408350000", + "7fdbea3efd7bc036fec0ca9eb26e0b7a257acf779ebcec1689b206f77dab863d0508e14c3cda0411f958975646b85ea99d67246eb0e000f96f7840a29c9878cf01" + ] + }, + { + "address": "DrbwF4PMmGLwV1n6b5r1yUcnRjESsB3xER", + "secret": "b2cac97f1fc63a1e1a16d1f322f4a33c173488ba3ebf5049931103728a822624", + "public": "02fefbbfe2f400b83ae244bb3bcd2e4073335d58c35659100f2b323d887982918a", + "signatures": [ + "d412750a5c4e7fe4564bee6f221389f0ada48c6ea612f77a9b1aeb586d8dc4a7129ff3e8aab7cfb9944e344d5e2129de4730a21e20d612a2e37f097549880b5a00", + "b2fa691f873903b0154d6347be1eddf989e67f390ab1e3f1e4c8cf1470acf4804a5d55356807561d5c6c3cd9ac7ef70d54f845d0afc42734a05310ee7bab55d801", + "e21e1102033378122861e21245e0ff0752aa94d7b097a26a16b92aebc7b7291670b5f9efa09b60bd72b21c1e386779400455708ffe36518299b25c1bc4695f9100", + "52351ba65627367f19b6ad38ebfc57b2d797770aaa45a5441e61857ba0aa07f5452412d20710e6ad4e15a9353244cd69fa01d09b17d1b2539774c0c2ee477f8901", + "129d602024659785f35229d08148eeb270192b5600a4f64ebd30bf1721f40ef70312cc10cb97cbcf2dc53da1e8b10723c43bec6b380344f635130ddcc89403f000", + "e7e63d42e064530b329837dd38955731fe3cb68c7f8cfbf7bb7452df2976842b299624c6b91be28fdc3c70fe80d844104d4f35b5c5a6f550471975de4519b66400", + "800fc84bc5cc7947c1860eb2d84e0a4a16995c75ed6023b34ba69b7b3ca0da10146fa36b391e95fd48af4e1281d129b73c66b7ae12141f1db72a177efea7835301", + "5bc5e990c347f77cd4a0db7debcdc92bb6c8d8f0287b2ac7e542ece2f5df3a2834490e90bb3ebb3021f444fc6638c6361a51f92b62616eb31730e53c74d17afe01", + "5b9537851a702c03851633a514750f4050f08430a287a885312c2b0db992879c5ac20bc4725ee26a83551f220314572fd8f23e5aaccfa0df80b8e9b38f357f1100", + "ef0c38e69e2a6f90da8bf5366984a20bcd1444e46d5a96448f7c7fc2026f13150822069375ad746c3502897ecb977b78df08e3c65cb4f2c26981f34a9e0dec7701" + ] + }, + { + "address": "8UtRig63MLaLcBWz1roupZjzgNFWZjFDPC", + "secret": "84401dfa69739cf31e040af784a9f2fc92d2c403b77244c0ee1fda554b26609d", + "public": "036affad9cd7bae39d491c37cffe118d5b3d23a82cb7d251bd9b0a26e02ecfad91", + "signatures": [ + "93b45998033de9db250380fce60a61e3ade7e75eaaa616752efa84756278a152260b96b3d32033a243c525e81b70c7b304ba6dda691be1f031e1db5b8e40de2501", + "2993e15ae39378a443662deb0a2389df953c1b819c760b05bc8c57e8b2a47df76af6d61d06a60d16da662ede2e0e608cdb3a12d8789a8c4fe6a21f1eae6e63f601", + "dc85027cf73b354bd47b8399a22057baf11c4c59a133a335f598c5a32e3d0b410060a0e37f14b4254def16fc8b93347ab0bfdb56325dc3f361be6a45239c5b8600", + "cff714d386410016878b11ea5a20c756e2b8eb5126cd92efd668c48d4b3d1543499aa234bccd23730bc745954cd901e645763d3f0e25472ecf5b86563b15448a00", + "3a783749b0b78225ba0e6391927e4bc8093c1c0f7d165e79241d97d77dc969aa302a4447bdcf85ec3d2807ec49148dac1bd3c34c46f50ce835c408210d449fb501", + "f1fd6960250d78d7773fc114cb8b08eadc5616fba800ecbfe6591ed4351e0da77668b8691157742ba1046c957de85db1c2337da9c852270906b5f1edf262275801", + "8559c8902387ede48f83e19e9b9fbdc6aa4b30feaa5911c02311e02e683de49230895dd2de9cbea7cbd2c87c62705e3ea669f436bd131d2e14c946040a53c47b01", + "3194e03f394b5f5f73ec5cdf98188be9cd702a4b23650d34dcbc6ba838c449c6346931eca359b9014dfeaf59e223e49977cd48b997b2b95ce612934919583ee500", + "b56a1b1db892f1b55157f4460baeb410acb9e3941375993cd9487245791c45667de87e6a27130deac8ad53930cc7f4f36f60c194a6f9738b9b76099bdd9d258f00", + "fec84af4b8fab37a828ff011beed6850e12160d08c4bb5bc41d175f40b034b25357589de2f8a2c4031be33f6cba385782143870947d2238f3071bbe6a780492a01" + ] + }, + { + "address": "2FEcDysCMv4HMzwXqUGYdpEqPPzJmAanfo9", + "secret": "e44eac00ad22c4e17a0749103e842c381db7bfdcf5589fee225d0171b044fa19", + "public": "029f93f0c3a354d1b89f6aaa93b80ce26cf674988a9cb8042b9291b47639b621e4", + "signatures": [ + "61d574bde2ad3a35a6d7ed33b47f5885ba88536f1dbe54bf4e61a4fad6eb383640da8d0e4b6f5552172cc7d0c9db11c4c7b4e8329223ebabf3349ea1dcf07a9101", + "4f2c6bd0058643ada8225fc910ae42edadd4ed77894880594fc6a14587d56d9b5b1689780ff5ffe0550e336ce8340915a4ed2e07d5317eeb8e8d4a195b31251100", + "6f4339f187cde041b7f4eed3171066abb1ac510afe00b334cdc6dbd460cff0be41ad89604f191db6666cf50a2cde47bb6b7555e6b200d4c1ec1ea22102adcd1201", + "1d1d56be698880ed0e3edb50071838b0cdf622cc9401c63b46497d121c7a35b44aaad0415496ac0ca4e7a6efc2c28aeae509cdecccb469335cf7dede8301b86401", + "8a33f78cb1e2767147a40bb33b2aa5ae367d4e07f9d954a11489901a49edf823431b7da2d23d48958416e310e9089e00b9f2695fcf0508993e8efab888703f0e01", + "02a2752aeeba167d66f8ec9443ad8575570d766bd226d4fcfa7f1037392c33e520750a77e8b62577d8e469fb05a3d33f8e9c18fb3a02f2ee69ca8043b063031c01", + "7ae9f070f1ac3292c3fed78d8676351fb330a8cccd016876576ad3d50bb861e41963bc58a736ec0f515e3879dd36ba86fa71632dfa1627b6a5f092d228e990f301", + "a9dc1cdb26c36c56346f0cdfce899db2dbea965e695846e09623cf09185e17b8495511b6e5972cc631f71f9735102585e744144ea36e990fefdc215da688c5df01", + "70ac0d8ba64116397c25d5515e9a9abd9a80eb028dfb44bee9b3ac97b2c00e9f0e8690ffa8d0ea8aa6bf6aca24b2fba06476c88170ef621f3002da946de2a83301", + "441200b55b63ae560addc5a020b56937fd25021b23e1d951ba7c57d90ff7672a371513739db52f4294bee054fa2ef8adeb4ed38bb4d0a2e83cacfbf9828bd8d500" + ] + }, + { + "address": "CZQfJSz4sSF5t3FVzu6kyvXYDugW3aSNVu", + "secret": "c7a2c3a4d66588696d0bbbdae561d44c5ebfae50965bac29a5c34be86f9f2ad0", + "public": "03e40a507b0a3a2e27734098d565f8bd1892db382c325838b4bae875453a0cf5e8", + "signatures": [ + "785c64e60448d4c3c6e1e56bd0a1743c70fdfccfa0866385db6c86cf64dec8ea76e655a5621cb0c8f2f1e3e20b8aae8fcf2efabcb0539831ec7962fe310ea92b00", + "c0a18cb45d85e65de31fac27e60c602452ccf320e93bd217e001bba8a96a2fec3c51f6e6983386310a4f3ba3e06ea8b4fb6c62ec7698d12a41bde9fe278dc8f601", + "de824e91917697141f4d1ab5174477488468ed853dbff47710805d1abecd3df9454f497eecfc98a32189e00b5ccc0019bb0a06b56f6df7c77afbb4fbb65f639e00", + "1a54dbc4c6fbc4905feb7d3cdce1143f0e5bb1836c12b6e4bbf9fbece2987f6a3fc6838fe5704fa6fe97e0be3cbf73fead915bb9a9b1fd555eb6dda4ba69082700", + "7ff1df7d20ae44dfa8d03232328d0c921dee85441065691715b6a5604c74af135ec9de99dd075360893432889b3a4cbcd65fca62bb4a4b7de9d72ac9bb90e19200", + "27bb1cf484ee097e6eb0e0d1c09611e162ffb41479d172c8fd040d89781c268732dfabfa77c1d8c21b8a2be1167c24054960273005432edfcbe82bf86c7752fa00", + "adb2af1376af5008e9e59d1d7fd09e283ff2fabb9a8e0f75fed093418576f103311064ad3228a23e34363142f5415333bf97bca296f20aa2efaf11c5696428fc01", + "37135bb0ec3ef75b4490c32cb476bf80d04a8c175480a755edf07bd87a0575dc213e25cec0cbf100114daa083875390dad119f181a4044b61c1575414d5f38cf00", + "b0af6e597e32d5a34c75d1c7bcf9dba46edf8980a0da02378a4fa80e13c5c8e6684ab741a8dcc60a4032aec17310451c21d167493e4f91157f9054142090882f00", + "df3b1d979e90dc35f5f89f98a29f041b261f1e18d9c9ab4cf323b797e7a077d45db26932095c28d3e7a2cac92ed38079c8d3f3f2bfc60173fbd2ae64d51dfc5300" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0003.golden b/src/cipher/testsuite/testdata/seed-0003.golden new file mode 100755 index 0000000..ff562a0 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0003.golden @@ -0,0 +1,175 @@ +{ + "seed": "osqujzBPUMZxaJ3Do1Y7kNVJkcvcD0MeduHY9y0YTG0=", + "keys": [ + { + "address": "DC6BLZG8zpsiSa1gGefwdPzuxpUccKrbXe", + "secret": "325da6487b7076dcf1eec385918306aa041351226beb3781640eae8a432e1055", + "public": "020f3512b4c14d806f71faaa21dac57a07649f3b6871425f654e3fbc7f65be1497", + "signatures": [ + "809c24982147fa79488cfbd3940e73e2ecf2ee9e467f0e18e39fdbf18db776de60419e3535bff3cf67ba2791457afe74722744a872e3fe18d3bc37d3d8d397be00", + "b4296714ecc2176ec0322cb6a13f9bd75a34f09d5365ae5131468682d1f674412c61a0c67085ad839cb61b51e9c5a7eaddcec7de4743ade77825b2e746b4963500", + "508056bd0ffed1dfd2c6b0cc0c9c6ad26225db5c43f315a87bf8251355686ae212746fe8f679b7a9fa1686e6fd4e20dfa924ad9f0d186431bd0e5854ee58193c01", + "4bb6ffcbdf92372d6b34fd216197482fc25a39492641e74fadcb54f461998a4339480cc1d2a6f9d082b8603ed0bcbaa3981ca871f515e32ebb4ad6fce804556701", + "2b9d6fb8dc332b4c35961b916ca8a2ff62992fc841302ccd8dc199b3795e95d0750b6b359841fbb1f9deb5d28040d3a13e8deb759f8c3d5e95a7b51de70c1a7a00", + "6295a6d33266334ca84e5f27937ca2eb0ad7de6e28e89607a061c6be2d26714f3dffdac337c67840d78dfbdcdef5f175cdcc681d31bca40ef33c742da9cdbf2b01", + "fa2c67f056fefc0345e38cea031b98deb7b94c0e8b354e4e14aa8a28e7e2f88e717fbc72ac2c7336f000180be95bcf2f3c72704027e91fadb91a1cf3794d977401", + "4c2e02faaa872d69564c1ec25d6ff77893808cf4b025a8271f716497e16f9244079b7bd642877f8595c5cec0a009b5773b1627017c2ef31fefb558e3ca87d09900", + "116efeb0211296184f0c6b52b71f43b9dfb7dbca6a641b6a5daa4646b44655b3094dda11541899c235ead9ee5ed5ea9888ed68f9fdf51a77c973dc27243c055c00", + "91007e5048b024ba6ea799d14c5d907d7febcb896d8d6b37c528d59f43f0ff033ba752ad336bad95cdb162c6b2c991e06d4e2aa72769de959d536a15049c6af401" + ] + }, + { + "address": "2dJiYdLAPrgJtNxmYbmx6Yjf3J6o6tTQTd5", + "secret": "ca3448d20174e2bef91842c97cc89961ce108b634798e3add08349d2ebb3b7af", + "public": "0363cad05bc20e6061d1687f02cbe2c23e188f7272bd06a17f5e1035b434215d95", + "signatures": [ + "707b5c34007269e88ce9898b604a1c9c9ad31e5989f8ee6fc682a5bec4b98c3832f33d84d9efb2f3ade0b8813aa5f3305517762719278172645d842bb0a3175600", + "ccbfac78d5323f046a6585ba6b6fe674edbe1e565d33207b0f662a28176d0e1e7711309c9df63edd6e08f3a7c454d94cde4fe146cde5f4cd686a2103e788ee4700", + "60b58eb3b8020113be1ae1025f5a5d57ddb4cb27adf0471f653fc4bf5a937a805d523921ce98c3f2f3f39811ca47601b4c1a5bef7ef3ae47c87877dfe49a04bd00", + "1cdc3524c0e0a18011f5e8a627979309606c826272e1339444349c356cdbc2c05728c3aa674446b38f076641ea3c032a007a030e4069a570874545c4663667ee00", + "786aee30a6087a5687781b3ed888907d1c067148339552b90c022b21728472613aa715b75cb141839c02b3a3e7d72b58e6cf1a66733be1bdc7d9f209a0cbcf2b01", + "44e13e6d249dc2120e5920a93ff9d14b6d8b9f4f76bf3b160111e7247d816a0d673da37fed5407fb4adaf4974751d17212a88d646889f3c21d18dfcb8236847101", + "d0665523c04db55188b1285f0f6fc79693f9468446b0e2209f1573bf2f1781b16d06368f0f1d7483ec3038e64af75569cb474eff030838397e1bfa331394f26f01", + "d73c18368eaa83cc36ed1ba70424ed51b6889a1bd184e8e63b05b320f0231c876d70bfbd5e287e81ee947b1961c88790285c70b3167197f04a3cbd026b4a9af800", + "d99efa290ad64474bc2c650af2e4623d491aab54317d73a4cbadbf10f706d49447b508e2874fe41fb5d62d8676df9775d3fe533e26c3b59e8290d02473b29b5901", + "e4708608839de5df88e9d8091816566060ce16715e6488c0b376a31dd977777279a6f88316f3d2c0716d92048b8d10689b273d83dadf5d4b167799abac89b59e01" + ] + }, + { + "address": "tNP6Z6m64tN66qv8MNbpgs3hXphXY84rLm", + "secret": "52296f8c8b894ddf388ae2b000a023b6bd48817b9139e2495997a74775f5205c", + "public": "0229a7d3b520548fc3ce2d2008368d9b00ad9ff5ef045ac9ac7f3f8f3036434917", + "signatures": [ + "4bbfb348b79a401708a6a2a420e14fd003fb4a1a705b375ab679fc22a0a41f4272459c5d5f85282fc28566934d4577ae9b1a7089869331185a5f582dfd0e94b001", + "1c5c40dfd36fe3787fb6dd38be1dae85f6a6fd4b871916cd1b95c1034429472e4934998b8bc82bf166e14aa9367dfc18331db53224a1194ec97e506005cff1cc01", + "d90f16cea7f7098d6ff350a99a75747ae4d09052434c11d60d1f3bf44366d4fc310e19b33618ec4f3be097cf01c24fbc3cb5bc9289659e5b1cea5229490979a400", + "3ea89cb88d288bfe01f48409a9de0f869ab9de596ec9d01df313f5362d33b44845e96e60146b218a085a0d55526a6418eb02c37355167b0b632268becc33731c01", + "9e497a538a113c0872cd2427795e37dc0c6062065917cce07a6f406f2bcb1d203fd2fd6b2a411287cb253a6595da66c2c253e3d9035448bf1a867fc54afa719000", + "c19122058a54edb872e7c010a2fd7fd4f2c0612f5fe9dfdb69a23c257817643f4ff5774d3714b6efa9b5a585f5b89f1bd3febc43031d10526b78ba1c65a753f400", + "d2d796df07fa14f76b3ea84efef72d4412aaa67be7ced6b4c0ab2768968878614820fd94dab1b679a64548a4854f0beb7d6ce495d59b32e7226c4aa55b04be7800", + "7f9fa76140303717d61f6fa1beb1cb1d492599e8a4e9758a76c36f9bdb0f2e165a86cd84066d094b7b5a5b1f7e6669fed39ae381f03b54862662fdfae9317ba300", + "351feefd233570aa5390987f9dad774999ba97b2c1f39affa31a80b68030a4ea2afcbc0443ad0e90d6198fb22bc99a42afd1a264cd4866e2d7ac93a9bf03a79201", + "12683e4bd838a9ccbbea355a374eeed3eaa0339055cb90040c79570736175deb5568ea3b22bb642067a2db8245e83fa3e9ff14cfa17bfdcd7538d91784a8e75200" + ] + }, + { + "address": "28Jw9pmX3U7cckrah9kEkp72nPQ1rsRVEmN", + "secret": "324ea8f53efd2dbd840d97b8eb1a81f4446a33ca0694c9e91fe87e82f0930d43", + "public": "03dfd1e1219d411414b1dd12efca1a54e96ead409cb810020af7c92c8bc6a03d62", + "signatures": [ + "095e9e13403b7b398249ba6b07121adea43086c9dae49259955c77bd0c42c84a66f58bc0cb6fe7e471d6dfb085f3fa936a730725ba551874b90c12d1f09e463d00", + "1872730df7a78b2400ce26692298c979460552a7e1bda64c702fd10d8df1956131fdcb3c53621ccb2032585ac0e11a5d685e12e658c7f3f0d105ff9b4176c30e01", + "c048a79e93c15a2820821d0a9f5d64ed5c1560c4a791baa79320b865a636d48932ac1db2fa43a58fb9e422da818bb971aa9a25be0e13646251d28ae94c5e2ba600", + "c7e67e2222a5243970e88be22d5cb13620635e2e2e93e1d81f441a4c7298c14f29a897b38b59bad93aaaec08c5e408a374804b2418cb6044ebb3cc3029afb7e401", + "cfe3f39d79f18c868bc9cd227f8cb32ccaab48b4e6481b72f9f3e74f17b87b5e5af1033b0ee04f410ccc20fc96242a5e5292ef40f91e3caddc3ddf6e83d1912401", + "a06f1eae2fb6125574ddd35a586b2034630d672a38691b459206b8ff1ec0a6e8681ea699daf0af611faf1e17fbad60436fcd5ba7022a0401c1936b77ac6e081e01", + "9ca4ab63017ea7639c8c17195e090c7d1006289da7ea61adb27cb3d647a9f44e756791099fbd7a380b780f6818eef289e7576140620a418a0fce013de7240a2701", + "08d70e714be4493282719e96c6ff7ca063b003e595e3c1fb7925c8494b17d2aa6d17eba028e8419fc2fd76e7b1352074d711964e9b2c3818eeaa6b611f4895b301", + "af0477044a15ecc71fcbf118695030d582930842eb49c1675a969cf2575dc2eb0d14d742ee694fd6dae8ca424143a5f22e53e01cf077ca8cd95434f0ff926d7701", + "f0f6f7da0e96362162e433b3b3c445ea90f1d18b32d9cc1413248f0dc27e68c6703af07525f4dfab6e09ca83bb360d9962f8b67e271fa1bbb485b884aca6bef801" + ] + }, + { + "address": "NBhY9RijacMUvN18h11DmPVSQTfiqwVd2a", + "secret": "b07bcb05916fa130aad994a1d7de445acc2c28b2acfe97c1e6fbee7c95baaf5d", + "public": "029d8e3cce3767b3ecf6f615dfe46d8ef93538f2748d4f0a116eb4f55d6812d4cc", + "signatures": [ + "96d040001d138f7e8e8facf6add8ada3f2b3cbd73a9a7ce4184de7c6c8da694964df193acceb01fd53007f5947fbc035d8e85e84fb59d352ea746a068229326001", + "67bd4e12abb98df97009a415984c1c494f00946f0fe58ec8b93fb40a05bbbd571fe50029c7de9142a2466b60e835d78c33e0185aeca77af671be437a8abeef7b00", + "f4053547b9dedb47b479966fc4f31162f7d63c749beeebed4f9d0de0e59aef85145fe85cc249a776f35f0798d4c140f75babe24db0898e8e5aa0ad094a087d5900", + "91f63bb31c6ebc767194b073b81374d6748cebf10f46d8aacad986c450641939490f6a3380186f98540c5252882ab19d8093c25275d656577a67f2b4a51b573201", + "5fa1ac1fe4fc4e07923241de99b7a3d7471ae5d601277bbe3c21cda7c5ec9db44c89674432eb551580175e8001586203f4163b9686d82378c5b027f844c0da5601", + "c4fd4007a107d2b58389eb9bef87eec5e8e6721eab888a13a19b5059aba4a329162c64e9e7bcaefb043fb1fe677b2d6434fc99a9cfb1f60067c00d98b3cc5f2c00", + "4b2c0f225d0a94279ba2f99859a730aff20ee09eb161c9f74650f4061c8919ba364504dd91ba52e0339acedad7d65a5ef9734d5aada7aff1c3b707e28431772b01", + "f28b175b0ad668f075c998e6cd1325515dd6795e506b4e7f3b1b41167f8f7fc84ddf8eb85bbe32241347fb81c22a7ba46e052817b168102f43d630ed909231df01", + "ed07e4b55f64713de65af6e2d65fe9c88c782bd9f54b0cd30fc0c95f2b4d8e48244398e72b4aeb7bbe698f3032a5cdb39329e06952683dab69802861cf3f325200", + "c042e9d6c8a0919a297843013b0da4f16f62b0fb98ce047694f50f433ae9ae9a4dbce35a715a374d54034386efed191de09cbd4d1e180c5b292f06506298a74801" + ] + }, + { + "address": "2FyNgfqHoLncq9y2Ruz29KwueL7oK9aKryi", + "secret": "f46a54411adb3a34ed4a11e4bf01d3d87ffefcc2a2ce158f415078c20e5b01f1", + "public": "029db862d6ecaa866217c85468d7b0164208dd37087a90c5c8428524959e982d79", + "signatures": [ + "192f8833f7172283c5c9c0294baca36002429782595fdc924c987099bddc7c6065683b14dd858eaa55ef7f87441e6848130ddba06b9cda2a41e635ab072f378601", + "93e6c81c91dd59aabd9247892a73f3939f1bb0b8ad6229c08e1f308f72275a066910573dbf60ef1f3a72f31bb0848e66e14c55771f5862d9d90b230c6fc8d02d00", + "1ce3643c9c018800ff12ba0a121b98a0f858ec40c2e6a9b5fd37abe0fd6d9e7d54612e64474ed28831fc0175bc989aa9f1aaa436a635207cdfa085d6e18906b001", + "429bc18483a652f86ae32e20c917de9ef043abe922c6bdc95d76724d95aae40c7c9e273784f58255e5ea873de4826b81686789470895984c7d8aac2a13365d3500", + "f4dd8039559a894885d1cf76043a4c4bc69be4e439050d965c4e2889818f582021d0850d7e2691b941d63b79819d9d11ee443f953395a1b76a54c794125a95e901", + "6f5b2ad4c639745a02a5633dc6f336ad1f8d4e035573abb8b9d91960b2ebea7601f62bacc3eb8c89b1707dc0ca3da4d0f8faf5b34f18ff8c0c86578d5340674c00", + "e9e052fec6c7086b57d7dc12ceec2f637eba01863336e6bc5a6d6405c8721ddc13f41a526937e82725037feef805603ce6a4c97421a28e5804c74ca66434404001", + "10c5f518ffd52e5b0759565706b618401d958e994a8cc48773b4081abe5f1c693c3d33378c08e29703018226148079fcb929c47389cca503155ffb7663c3fbfc00", + "3d943c9d9290f0c01410175ebfe7d33926c309b5a6724742632e962e2492181809596d7f5b712f64e82dcfef0e5f2dfe76d85911146e9920e5ac5392da1589de01", + "67bf7d8eaf1636985fb661774a0c4b5377184b5a5ac1f6f8c6ee4edda83ddbd22f161d315e924331ff5ae0919f83b1ce1b49cff295defe5617264e21aa75f18801" + ] + }, + { + "address": "24sXyRBQRq1kYZhwhfHhLU98DZGcTeHwQNz", + "secret": "af178cc4704bdd222cc94016d529c5420710de96ec8926bb0a395855875163b2", + "public": "0306b389235982bd983d081f6584bb45123bb45e8055a844562b37ce7971c539f9", + "signatures": [ + "a6d3d5d20fdd1620c4a60e665272657e24fbaee36f61121cf9807f2207823bc51900b811ffb4ab32a2a03081ff4faeaa2d16d73fa82dd1814c683d53add34d8101", + "a176b6bd3ca6d38d8b38492178d78950575ae7ba22a6e4c43c30010d0b88e37f7a59d1da6430c92ce9f45276ba75cf48a4ff25f4dc73be8428ceae7943c7a79101", + "ad4287bb732b1d2dd038d3a3efff7c14a617d1fcd14d5431a5dc3264f082ed0a4aceb53231c0025fff20ace3215755d83a4380e61d1762f5b2a7139678830be500", + "394c94399fea17bdc9d5ba2ce5895c671ab755d10a7b10cf9e414b779762b5a309960d0a5c6a63490959ac2aea2b78e3a46ff404d001bfb89217daaf6aac135801", + "2656802a9978b3ebf7bce6153e7ac3ceb227121a2a030d0a18c7555c30d332e80f75e0b528ba372f44e457989a5879016b84c06b2d9ba305adad899817ef2cf201", + "e9a7e15fc35ed1b76dd33a5bd54893e8655acea9313cc3c2c4e5561b07d97d9e67e953ebfa256470c8c680bb80ba373ac03d3cec9c8a11a036665df7db9001ef01", + "0fe18385d5e354c2d53398351d94f0c4716a27e8b2ed564643939a2ffe8f0bae79a0b60e15ed1d26a57277f25440aa1ffe87da1311e735f22c76bfe183f777c001", + "96ef9eb7cb0d210642b35dc139d86ec9bb1244045faed3b3e81fe03874aabdd316fe4c261d075373282a678c57b996f9c38f9aea0fafc7f95202fd057325492101", + "7b9fa00ed2687eece3dc9ebfd517c76e49cc435048320699b7983aab895c196a25eaa9c3b423aa5a56ebd27bc197ee40ca0705ed0bc082b5bf826d9f1faacd4f01", + "163d0482069bcec72d0cd9aacb4601902e41ff7c5268f8a80e3f3f1bea5390d2592d8c24c2784b645f5c1776835614a85679da210b9e2d67fcd72462acf73d9101" + ] + }, + { + "address": "2eEijADfBZAFk5WpNhQg24DnqPPWaUwd8G7", + "secret": "a3d764738e2dc9eff6c1d423362b537d2e2d8346483d6a5a034293fd9d057aea", + "public": "02e7f5c694d4f4b4ecb146a634fbd3fe450b017a0b8306f4f351dce5773e81ba8b", + "signatures": [ + "4611b93df2c55426447f5bc13cb2dc60d738bc62b90e823e25cd0607154fe0b6194df3869d33c25db8c9ad94b89443440e01d617b26d628fe090a70db05588eb00", + "a7102de3b33131aaf1462c9b37c31da6c5e8fd8bf8f6ea5821eb3aec8672a93b42bc359635a36bddd0a0fff3ab605776cf63544adfe5044dfc302d6665f7d98c01", + "2a78f73c5fe82809661e4ab087fcff0275aeb6dbb6e5200359352d708705f6855828916a6442ee15e3689113ff3a00b0cd9617fdffb429d96885a5b881b1f6d700", + "b0d5621cd30790b21e32d079eaf465bb13356aa1972d91017ce5e53aa8d1acaa06bfb3850f59edcd71b5b7a5df72d87af038f1ae4a5bf19b6628a8fb046c360a01", + "ed1fc78e0f115aa052a9d3146b057516c140365176da613af737d1641d7c70f71324a533c06189f3bbfdb1420febb09917dec38ba2bbbe5cc4bccb89eb8f82fc00", + "db6cf55a88608ae3d438cb994c490c0c99a036c4254414f0c04be67475c179c95f5d6be14f009dbe391dc6c5c078c673e2b627b9018f425490d07e87352159f401", + "b43fc4b582eb91acc18cb03caa1b8460e85364115268cb4d70236b87fa58140b0644123f8df014d3c7195b3ce081294a9a7bb2946050ae24cbb98dd643e7e30100", + "5a14a381c75753e4f1403fecbdcff1ce0a0207ceceac88a6264b68eaa164a4263e419903c61b455b5894a3e83fdabf4137fe27ef57501b252a5a40b1733c2d8e00", + "1bc9144b3cc9c33032864d23c42d58da1cda12e782fcc20ff66487b6b4eac7655f4ba61d26aa2632c9033e9b5231da547d3737ebebe86c36d7219562e04792a901", + "44fa785abbbfd89a8dcf6bca7785e1fcd52188baf3368da756b7a8fba7d6360f54a974a54db38877cf84ff45ed136c0cb36573c3a26f952eba03a77de1a49b8700" + ] + }, + { + "address": "1CRfbjpqCGsrFuU1iRWQcCEfiS9vSDGDnb", + "secret": "7c4fd501bb1a2f4dbf7dbf0bb9d0134fd90935d7ae5689d2005a030ee64ff0a6", + "public": "033f24693c5e97edcab4c2fa1a3cba46354af26865b055c6b7f699cd61b0731d69", + "signatures": [ + "9f01d4332f3e069d930d98ca5f7c8f23374924c317503b2859537fe014ab351c07c36c8a6ecf6a4c8bfc571558399cf3c31b4dbaff4b1d5ab37dfb0c0b0e384601", + "7e18b44021d19c3d4d36a2fccd3139c6bcf8f7e3bf2ecd0270d3e01eff0b94ca6366ba2e8fa086a6f2ee3d5d9197a47114333942b754ea9cef3e210e528af0c500", + "8912e1fa6852554783c4d77be8e45e7a14c0a4c8b0473201813430b1ea832a700031ca373e48ae06a78cb3d95f2cc24b93c0a2eb4c02db2511e3c2db7fffe4f401", + "1591e3f7dd9b74483bd6c65846b9e59f94aa2f6dd02213c715f720e098e19f517aecaed7eba340374cd69bd39c7c9d0accd78bb9c3b6caed9704e7751a27710e00", + "9ab1221cdb071b3baa1943e1e2065f581d2a81c1d33d42f00b106c0e52c03ba5326e99bad3e1a4fe76a5fec41a29a82a366d2df1ed7b5688e1c9c591a8c937af00", + "699e98e30bd3e769bac617bb874a84137e279a420e09acb1bdc85f69d1d8132509f958813b914327aefbde00232d2fd860bf37f0aa085c2c672a3b47cabe0d9a01", + "e731c954198de65dbb56cc586274804ca0148a1a9f0ab562be25c7ca5ccb5556101dcd76b3137da7a8847bf63465fe174e537a80e7f507dcbcbe29e8f99fd61401", + "2d8790ab17a76d20e1b6d213505d08fb95b0e949eae75c4aacf7e575680179620be72cb7781037aa4e5e9656eb8b6f86eb81644dd102bd4b8259668e7eed38b401", + "ddf5b3672691bb851ada7425a749bc95fda1fc6f5cd2a14e11881cb06033543619ae8665086e22c308040b5488a2c7885e4f73e506b69c7138ff7a67f474c11300", + "a835ca7b0a5b355dd58983932cf1d4d15035a86e49df81128ecaf9fb783317115f69aa5d6d75302a0c128e3c531577f77ad0d5b6d215d25b890e941938d3bab200" + ] + }, + { + "address": "2bDMZ8tKNd9jjpaxor2mNN7eyD3tvGQvGrh", + "secret": "5b5ca59c4abe3a782c370365bb9b85cb64ef66ed194fa2a0fb6b66616735d9e1", + "public": "0372ffabf5e1fe4289af91fdcded36bd3841e20926f9ea1e1048c1125c2aefb7bd", + "signatures": [ + "9760ad87d8566f068df40cb8b7510cc58fd5d8417c3c24e4a640f29e4af047c13fbfa476656295689a0a4543c0235af56a2b73cc310f9433f8392e8ecd36645301", + "5136f29e66edd0961f8a21511d04230ab71639aede10447cd21783ca79af10514420c3571d364112b3236e8e2c4613a1b35d365d522d7e57578d06bad5d6dd5701", + "206af9e7a04b8ff4f34fd353ff67c74723abcf6947c897901ada314ae14d5be60939fbcdfb0a19abd7dee745d4ef41d536dba5af63ff4ed51a9527f75d7653a000", + "39a21464e465370c3303fe9615535efd132b2a9625a5b687bd48dee0529cbd7926e45514566d8800bb0d730adca3a81a70d6092be7e0cce3c990585a37954a5701", + "177e0155ab098387673b2b95627f10437aa81aca8dae9d485f0a81d3a1954bee644ee54b2fbacb76ea2e3990d5ccbad69b6048adaad9f365627c3d4d62ff44a600", + "0e1e137d69c9b30ca391eeaafcc3e6c43b4d8261fa591ef9710e666797c214b54cedbfc2057a5c4c7f30ae3328b8286ee33bc38e301003b7d96a696628948f0401", + "0f6350ba71a39d629a37b79e4deeaa785dd634d833667379b5f56425632be10a7be104ebdfcc3304e6d2e7b672066305ee894187a86b1d04be617cea14d3b86b00", + "89d2aeccb2685af100c6df043f2ac618abffc9c25aac53e459231a9f86452a89005a26d25559688e543c24c23871e2c374a62237bf2d3c308c4b4e334970038200", + "e22ff4a474f973a28d084a842a3aabac7eea8c6d7f098b8dce13a327f9b4957b625ee95f947c86c072490a2606908dd6068df998106ea2a1bfefbdae1ee59f4c00", + "98902bc39b4e4d58dbb9906384dad91b0b2ba15f9b59f47b6d1985e1e48da08f213a4e785d5a1c18da576f5d9d2a37b4a6b21c330a26d4cad23bd75f1419e2cf01" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0004.golden b/src/cipher/testsuite/testdata/seed-0004.golden new file mode 100755 index 0000000..646b5b5 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0004.golden @@ -0,0 +1,175 @@ +{ + "seed": "Y292ZXIgZmF0YWwgd2F2ZSBjb21pYyBzd2VhciBldmlsIHJlZ3JldCB2aWNpb3VzIGJyaXNrIHNjcmVlbiBjbGF5IGJlZm9yZQ==", + "keys": [ + { + "address": "2gSg5K2Aq7V52tPkQFMCfgHNhkae2KsTE7x", + "secret": "6f1d4cae19bb875ef2588591612a73972d824ff40bbc8ed709831e71764e7897", + "public": "02e28e6d645e070e698c35fbceb8a81ab5e5d4912c8957d3e065e8966d19ad8960", + "signatures": [ + "ad1d4a3a61606df19d2d56083c4754f158a3cd76e60fbf6f12ec5293fe45fd0f7053bbc931322c3b6c289ed8b69eddc4517afcc9574eb6abf85dda7aca90eb0401", + "ca7cea4a7b3b705aec86d1cd5730ccbbc3521c9b4e5916db5df089307c14d89b655ee0d17da0729f7220b6ba79f39fad2fcf4370b1c1ebb1ab8d787868090ef301", + "f485b3a381b0f88629afddaaf895ca7dbe0f173db225c5f1bfd05b80bef18e5e330b2dfa46b460eaa11a0434010a76c8c710e44e489fa879091112f9f7ce51e501", + "c3f369e6685732b3f07deb7a271f786f90b3fa8cd69f217443c9e5d05aa2e9286225f6435ae60a3b7a5206bf35166a7960bbb640a5becad2d881f3a953b6887901", + "800b70203dea088ac2fd6e6e5c8a26b831a245998d540292cb2a69bec83f15ad172b805b8670a485ada4069816efea4c50fb1603913e00331562894c7df87ad001", + "bd558108807f9fdebe5cd192230d0acb651b992fdeb54f4e9b2e5fa0a13e069f366b8442478a62032847a832cc5462aff4b7458f18eb104ed8aba8501e4470a801", + "a5604f914b5169099a990f95dcd38d9f78d145b99f5c4160118c0b6f8f8948d47f0cf1a41887efcc6f821cb72eff0b66f5b7befd824ef9ed8f3a07ca671a1b6501", + "31455eed1035e50088ec9ab7097ee54a8e9f6dd5f233f1b95f2c6cdaced59dac23118ee87da70ec88056e48ad033ba81fa8c14ea891a6bc4b65ea2e08182f2ac01", + "5cbcbdfbc91b05bba7cf8a24ab13d5872dd0b148ec6141a4eae664b03b08e6795d89bf71203a6cc2021fb3a16429992c3de07d3a8d3f4504a0c2ff48e8dac5c901", + "0a42a468246b2807cb1b1a83edb251e1a81838fefb0c2414d569b593eae8d3932bedc14a5daebe0edd1910cf64e18d0ce70dffb536eefe8b7b9c27f2a630cad101" + ] + }, + { + "address": "DwLc3z1ff7uKUgcyAR3gQhfzJUHGMXktyj", + "secret": "8592f9f419cb7b0fd4216e314b17cb3b58ec944979f8f6a34e21fda09e01fb2c", + "public": "02c0b5b53873ec9cba0790588c64244579b0b23eda646d6ddea6153cb97538b3bf", + "signatures": [ + "f174e61cabae3b37f1cfe3d1abbd606621765d02ed6bfa7124dae185aef762a51f6af575745d33d4b2d1664a0d95dfc82e9010bec8830e13aec03cacd6ab158801", + "28cc5c115b8bc99e6bc9d6281877417a2d5b45806205f4c430210157794920490d11d4d0de202357df8e8603dc3c74426b98d3c30fd7963198a0ac15a6e6954e00", + "c28d5d073b95ace0e2e0fef8c34bf5288633f5d60c33d2fc5fcf427c1d70a8a9045ba9db1510b68de5cd9ba2c8709a6cbd0e8c5b57cde5a601d1737f854a4e3f00", + "2c67e279048522919862955b1afe7c32f432deda62d90219505cbfe7473a976e1968d180f7d43b2b018e7f4f265d489358afc66ce0efc1836348f065fb03197c01", + "f8ede7998f1110729adce0af5f3926a3bd8927c178e98c45ba1529943913ea337d4b6661c54914d323be43a9d7596fe7ecba2a8717981ad2d9db835b898e08f701", + "8b8b94e9962b5332f1289a299b3b99529edfd4fe17ded5c0b38d6a23364cd41759f40ee4454dc9889d207a920fd09bedeaad78885a0af853cce2d1c15472412e00", + "697b517897a92769b59d9cfc86e2ce8650a51a318bee6808a10ae9e752e8fc6a587073b92da7431ac39fb8d7e77c98de1b19ae90451df69a03dcda911587c06100", + "e79c81ec05b0bde926a1ad3310ffc62423016213895bfcbac1e120cad6db1ba872dce323156b76bfe316467c26475a3ff1468e2e285cbf0c23e2ea542c3447e901", + "4f90c8736b8081e2d354c22f5e2f7e15f5fbd230305257a3f63fa89276c21c9206716122be313ca3c8560fe86c26c09b9d6e9ecaf8c7d4bffaebe20edef7444600", + "0c3e651b2b03dcbb6cdddce3612f4d0f414e11f949d046d9befb8b34b0baafb57fd3d8968f27c994a08be0fdd6be016bd55c73b4a9fea07ed44801e3dab6086e01" + ] + }, + { + "address": "25F9ZVk6tvues2LcxpRUCCjh7yubBBUXf1o", + "secret": "618adb045d65f9c1f99bd8e8ff6098aa1c2abea4c8424a9ba50d2a46c7a4340b", + "public": "03eca0e99aec7896b84c683db6eb93fff2df7cf03389720ffd214eddf15f901390", + "signatures": [ + "c19580a393f382b914baae4fb0861c4bd667914729dfc2a2ba04359c247669e55da6940023902e17d1006bfb14b71e2cd6abf4388ba0f18964f51d8b4ac272ed01", + "97920bcbb32e3b0e853a2a7369d0c777826fca18037ec9711e74fc04e31de4af309a5cc22311e13d68197ec991abb351f3cdf8e0d8c112d0774d1ed0585f93ee01", + "febf199c3d88e46fd9aad05f1c612d95dc2b14a0e81113b844fca9152964fd8407866c9348572f70f8b1a8f6d313ced36314f04a616383cc3cff9f6faabffbb401", + "e5da5885db7f22a5aecc0bb7b8573703b450ad8fd454e65f658ce3e99280495a6201bcbc756ae9f7bcaaa387819f6e7bb921ba33d142077344bac8bca489cded00", + "52086e02e21e9ca4349ef74aadba227f30062a46b150fa6ba478a238084617dd48bf5cae7823683b1dd7ed0c1190ef301a5a9235fe0636fdc32cfd4a4effe0df01", + "3ff9158189c485c5dac9ca9b588291e8c7e02e148be3ac5dc15c8d1e744483b315c6c6d078d025e9537ef2a03ec813cfaded0de7afa37f329e94b6688f566c1a01", + "369c2bf1bce93ff4324683029bc35655f45c2214f7137a2ca67da406b982a9bd53f5e3a728abe88decc966ea4d7516523986b504ddc9f6e4038a80848a81ef9301", + "e673fc1269619a2bb56d3a5ab9d5d25412e8015074585abc94ec66bd5179d8c0272b48914b95f37e8ae92a25fabe6714e79ee90ef32d0d6a02fb55b72191ae5000", + "1defb8dc62e55cf8666b6f02ba3814095c686211a5194b214ef01a655f3ad03f71fcabac8760e2be64448207dd7a94e3c6502d272aabdb1bb2fece29ec4e82da01", + "96b40f52ac8edb532955af2b023078bb10a8583e06f50cb769aa79f27b6b1d6c487c1abfa02cade78f960698439569fc8fd75f88933c745ada0bc2c6efd7611201" + ] + }, + { + "address": "DJGUeQoBFUFmCeVSGkVY6DTcDzwAn3f6KX", + "secret": "4fe0e662f034a0b4937c6d8ab1c9f49e6f612e8fcfd57d332705d69b05a2bee4", + "public": "0340c46145683e5aeb80354625ac586fa8142eea1894cb2b858a162673914701e1", + "signatures": [ + "d7a1198628f61f4925a314cd3468093d3231c99defa06f40bffe364693b5a06905d47a8a380666279e7a701d952ac3d148d99cfef84b60c39239cd2669ee641401", + "cb68e677160ff64bb60f5ebaf34317dfa0a88977819f807e5fca01320a493b192841804684874177c82a269eb867d118ad9e7e785d577b217b86a694a322c94e01", + "d901fe90a9b825ccdc5a0c7f154d839961658e6b0277310ebce6e27ff94ff05459b3356686cdd942060efe49413445e86ed1be410f5bbf88f0b4e5df35f9098e00", + "2c9d4bfc9ef82226b0b71cc4d725bc0b35ae15a8635e4c5900230b942ca0303e3a4ab3d5d57a02af7acd4bea6eb9d25fb52c3d0d43da43a854a309231ea9040f00", + "d01f41a7555d7d232e34dfcbfa6dffb0e0df120aecd9f6cace922c87ccc08063437073c07000b8b799ee52bb0cc438750502455141b5033a974eb3c4c7ead62000", + "908c2b370bd5a5bf23ee6e45211dd823bbc381e3d5b67b1a0844c7148b556c6e077ff844f4a17253993992be91ef1bd2f546f2847b9a5490fac0898e7536673b00", + "3fb2652982f07cb81c9b4df36b5719f29f42b2cd63f37227727a66652a757181620b676fe314394a9161e6a9193f6fea9244107d160bc02850484ebc0a2b1bc600", + "f1c38343dbcf9f4da4860554eeefa267cb18a35aeae5c0be0d6f4e81630b507860098120ce12924e7e237f4b72d0a3eb3669e687aea9b162db21417945ee679700", + "39332bf80f31e75d34ef1300cee7dbd87b5605d0714907e08d0cc552f86baf6e6346b68501bca34feb81f776af53053eaf36c91343d15e6e76d25f79c47fd6e801", + "c183c3f38336efe21ce302b914dcb06ef151f70bac7220c318b1cd68cc5d90f90a171263f5f67ca870fcb680e0307f1d872948d7d3458010864f0a3f284136b901" + ] + }, + { + "address": "Vh9Zt9oPMjsJxNVphCjiGUxHSixS48J3dF", + "secret": "c2fde07e45562dc50c18c1e7552e03ef28639c44b2bf3a4d363314203e3d5f4f", + "public": "02d40df519e11c34b78b2124820d5dc04c6f59f465d6263b68347a9f74a98048e7", + "signatures": [ + "a2d420be32276ba19ada464ae8b29eab9b07b20be80ed9a2998d7ed9cb872b767d4ddbaa6babeebac811a6dce35915d9279cc6d3c0a813fbc82a54dada6dfed401", + "4459aa264b6e3d724abc8043de82bb8eb3f2dbbca1367d4b36327738a37c2f842d92698747c24602274588a91c8b191d17f0b82fe10b48ef01a9defb14fb07bf01", + "7c890ef0145c41edbb3d56f37919efdc817b3d5e82976fe2ca0f98460315253325c47f553e91ab6a6c0531fefe7061d9c79f1f3983e46c7cc5d21fe7d4068b7701", + "20ed571ec5dbf4a322c3b447cc8d2b454150ddedf84ba086e5735451698f99101f86f82802643c9e49673f83a988d7b8193a011ce0a3c52e84c6fccb1172f8c700", + "64325c6f0ab86cadcb791a37de986659a83df1faeacd4112216b8ef2f7f0c1337c12e6af249244ed03a460c3b12636593cba964cce2beb052308d20777343b0501", + "1ed1e4d8ea4b5d925b7bc270d5013d11c5b99992c6f22fba3699c1b7fb08b79835f7ca88c52416b191cbba7cc275d7f5d9d6d693990d85c41e4a305469d0aa1400", + "02b1d63de47256007c751b9b7854ec997bf7c543af9f3536d831f2758643885b3e22d15755247365b21a5200aaada52e603b53187ad8ee5c73306ea8cd0a7cca00", + "3b7680d15858017a6795d2c3a3e292fbacf2604c5f7db30ef2270d9b6093648411dd4f1c1868a9cf2cbd51cba1a8c68f35f3492abfa9af493db4260e04438bf201", + "c1b24bcc8d83c07ab3bee8fd90cab612421c1e2eff21f03a26f49c933d94e4734b79ae74268d591b6b58d68b214b3458412f0585e9d2f9a7ae1b17ed36b0102d00", + "c0ba9d290f95ed0068e90cf68c4b98ee935d463820fa35cd152ca085b548dc6b08035498a6f23cc28da907ff320260b9aee8bc589c481629070673d4cb1cbb0501" + ] + }, + { + "address": "Z8JM2GA3ABPuKYwufFGkhvQrD2y52NFT2s", + "secret": "bdccd360c259b643e5f48a52043602ae46cf5f71a4604142794b687d21d1b8eb", + "public": "03fc611f00d187b85fb2d056a6a7e03a078939b1e9ff472c3f7b9575f5b459145d", + "signatures": [ + "7f023a6462b1eac2ad7226dbe884ffcb79cc640247f720a653cf62e4bca47d8519b98c45a7f5bb348f15f75cd33f5bdad5041dae85e9ba3ff073432a77f36bab00", + "1f9b6736fdaf0bc3934c687a0915acb1488f1ba30fee969c73f7f2dd16d011f65bb030cfb3738ac7dbed8b36585151f5adf2138075fcbe61ec7c3a2e0e5a6f2101", + "7fc3dab6e22ad333206069656f10ecc9600916f1cd0b49c5cc874c42102907f33bd20b18d4bf5bfdad1456eb7c8c7cfca1a676d525314f37f92977156af808fd00", + "a7697698ee9ab3368b5c6e75dca0fddf3f2ecf0378bd73481fd49e1d4f73a8b73988ea189cd301cf35b2bf4c9c8445f0a88bc2ed1d17f2e79f46336d6172442e00", + "0f6e0373d049e5cef26325258bdbc6d052826e18e26d8a7d4e7231d4c2f7f8af7f783fc5994c609e4acee8bc6777fcc62d40ee4595a2962b061475130b1e584f01", + "5727d799b297cf70b70c7267424f842cc78ff7853c7b56f0e47af60fe73a305f7713d11b418a1c4f214cfc2d87aeb5f90654e957a1752358a8bf160de86893af01", + "6abb7a9d88d099d1160ebb9f0f76e54874447214bea3d8bbcedae00c4eee34df5da3e84fb6cb35faa42688e7075351ef22b9b8543664dec354725de47c1f83b300", + "ee5966c6140b76fd30c4241c55ebb4e6e59be0546b41a7a2618a845b56edde5d63a0644551cca495bc6d1b4c8f8ba7067c3849391bba13a4a38a1c040f5ba44500", + "0692808145227bab7af3087c5e45f0fd2a468db2970c5fe37f0dfd2eab8dfc5752f18a2475a008f439c94d178a4b335304d4369096dc7e33735f73dcfa46e0a101", + "d6aabbf59d8b2ba240e9c415f95955892c7ea91e78e5c097ae126934a3ba6d592575f48b9ad58a1e65ebdd9d0464d5bfcbd4af4b849dca17d1dc2b17013623bc01" + ] + }, + { + "address": "22GWk6z8PQVKDoRNR9Mt3YusZBqf18RBdb2", + "secret": "02a29f33493d777d410677a8ffb9049ebd37c08e994e48ab7664b66f02fa034d", + "public": "03c2d659597aa5b59c6f64f7b75321d824432b5a41724a74a91a667d3a183e9d2c", + "signatures": [ + "94ba8c0c74b89e5bf2ea16b610de49b6cb82dab492228f7e2a08317fd32ffc994c0c440715c24bfa144d5e8f73d6bba3f66dedddd6524946eabad7733df86f0a00", + "ac497705c165952cedb8d8060cabc5753fa0de358af047a9569c0b989931ad25357887605eac25ecfd15fbd0c64eac6ddd65af25de11dd16ef24863f20886fa801", + "7a3c728bc7aeaf467d9285eb8b5200f9a9fdf97e9cc7c5fbf4fccc8a12c2d76b7a652321bba91e9f8a30569b56b5357a7b19a6b1870399dd9ac24ba5a199986d00", + "68bdd162a269d6536d8f03cfc395f5c3fbef268a18d6d85c535af73aac08d87d77c913500ef9fb9b5d6222d084111953b8f04f14ea7a73e1aabe36ef884ce32100", + "dfa9cb7e3a83c637e8759701edab94800808e4ae0611c6dd1a753b01431a84081ec0fe95dd4b0ad18884fc307d81292806ffcf837ccfec38ecc99f32659564b501", + "2ce3a840fa0cc355e9f0ba33571580c177753bffad543ceb20785319832eb6c71414d06f9c15e06311b201f8cb595f5abe5deb471a9efc8472ec1ffbd6765b3200", + "5b87c2450e587f2ba62fedb4fe46dd8b487ff19b24632c3dedc1999035457a37088c380db077ab84fd31cb414f80c99b05444dec8e0295f337a13f079747e8c300", + "712c0e4c8b261bb86d46b458c51fa33de865414dc008229d9fe523bc97a6eaba22b0b5e70be850b833a78db5e2cd4a3c64ec8380a7566d72bcb9a986234c84e001", + "e4671df444064977c74fccc8692f11eda6a7460765e437edda902d3c5aae2dd1353c88d783dc0200d769bd420d989155cbafffda4762795343055cd3d21ac7ec00", + "8c4077f1f6e7fdf022e0ab07b55b3f6c876e73879d1af32ce281f77cc936d4ad5a86667cb593d0c142efc707eb4f8e6c6770c8c72c2d89aa1fce466875afb7dd01" + ] + }, + { + "address": "Gy7bWVonUXNhGeuba6vuf9VCMxSDopVwXC", + "secret": "127e2ae002a0089db7c77259210be6b39559f2de9e0dbf1a16e362c73e8e539e", + "public": "02b2bd36f4f2cec30c5679311a2a918b61593c46b6cf522908daafdc337bf6c73f", + "signatures": [ + "3c7e5cd75e42e58d4ffa2ca1a6f7d27df4c29454162329ee4395137fd911f90e2b3c855f37b20fdb915057be390de611ab7b9f8a306585a98bf37c9e9f9c74d601", + "5924e1c81b54945b3f1654ee12010984c18f39cdfe438339e672bb24b3ea245f55d46a79bf6359b41f08bd5317e7f52029ebf6a11001c184a2719f6e6312f94600", + "2dea341a911245608f6b92037f2ff9389ea009dca319db7ced270d766631d30043b8a627b5237d89c12c75085c84e0ea96e1a1cbb7ec44eb9b45646763cbba2b01", + "6270ba0e3dbd54f697f440cb4ec22c6551332ec07bd8040f6367df6717470fdc3957791332a244d270046d164124c80472ebaa7978d339df19dfbdab5c109d1f01", + "25ccbc38150545974f3b9cc52ef96130246fa9a3f64e6069a762989f5f8e9d8f015bad4faf0100a6eb0078770cf32c2bd997dea56facb314c47b3cdd37cc3d4501", + "6cdb3de2d53293aca9bfd74c6621c82af5f6e7102ecc4d658189d28021371791728c859162fa51f8b1823ceb19aa3037090bf18ce50fa5cbc56e5abd728eed4500", + "8253acc32c056cc0f10941e21ff25b17b4e2ff4ada8716315852e6ce459ee3b82f45747d867ccf0188a6b3799990e72298c31670f8bde9fd788c986e1779899500", + "7ea062c2bba7b93d31073f90df27a26543b67f357992fdcfa8e3a7db368cb0f141629c1498f010f2af86f1805556ccd4758fb8fbcc28a043e8b2025066d6f8b101", + "2e1270c4031965205ba2b8a4b85bc1945c0eed13b758e02fd627f96d89758b9f2f9819f90dc9f19fbb7f27c8b91adebba02055f72cd7ee3a07481587481c975001", + "8806abc33816a9fc503bc6f560f399b4073e8c27a42ad3e78ccaa643943164f41f8f0d016f9f32b25fcd98259b8e6d9244cdace4e0a813ec78d7ca6d9a89de9401" + ] + }, + { + "address": "C8jt5AnTY8rbxTpbY8JwWkPXYfoAQ4fikt", + "secret": "6612959069c41c6ed02d7e1a2a868a241fabb65bf8361c0082c797a87eafe119", + "public": "03e0f8e7fb3d410563352dbc65fdc0a42dd4f6c3702440c63f249d76b96585bafb", + "signatures": [ + "03fbaf561b2dc8eb519fdf55b887286d29ec6685ab043adcaefd84a5525a4e406d62f5209001e0dd07a5865603d36f29575322b21575d26e5644bf19bdaf46bb00", + "a5af3b7b26b4a0ef7099775a9ab9155b9619595146e584e794f08ccef4f870ac74b1cca792622fc0932025cc88f44a2b436e1035a377aa2fe31c51ee76fdcc4901", + "28bd55dc280a0d32cfc09325ba0c10cf83b45148d3b8e5b6e71f518c731426ee670a71850ce30bffd3faff287a75f338000b5faf4d3ce8e3625dbce87b09774d00", + "61b4dfe751c918060ea390cfe695b5284fddb0e260ed4a8fbd3bd50d2de7dc49260094650012c89f5f0a93fd5a29a0aa0a23a34dbdc46b0837801e6a2b8f744600", + "6ff07926f05fb316a1eed1bc6157681063c8545aab1b05b37f6d328564659cf0621bdb4935fc4d5dacd751132a1513b2ee23acc7eb7cc395e8a27a83b26f7eaa01", + "45ba72c2a125e68610f5f453709f4cd08e3be050f053bdc9d1788e65b2da7b085d36fee291feff41430a429a87a4b9cd8d43ea005e3b9f4b099a0c2c997983e401", + "4ab3341c870bc25dc9441a6e920b11ebb47cfda4f4645e51cdcea6fa99aeb68c06b5a0e4b3b41da3ecdcc5fb162609cf1f71d49c0461cbce484fd11c0a8557b700", + "aa253e2de851ccf7d3a41096ce5c0029cb4ac90f4ebee3eeb4395a54ac50361d3d16cfa3e8b764dcd8756f8d890bd5adfc72a43347c9ca81b072dec40b75ea3901", + "ecc90584883a76a56b914f73fd1367329db16d547e692a64fc59ba4ea86e5bf93598d53f0236834c98c3751795030578ba249fcbc69da087dd632886611ab96b01", + "0b9462cbe619e461b8a72a52194d0599cd63d130f10e905a1ffe8af03aa1584311953db3006f00e7d7273036b0d9c5347c3c586a8b8eeae315dafe6f8bb2340901" + ] + }, + { + "address": "baYpCovQfbz8Q2A9q5zp2AR4Q6hhCBL5pM", + "secret": "1ec466e5d354246ba0b60dd2de440908d7909fa5c2443b67ee2d5d151b94bc3c", + "public": "02edc9f522f60e60763359f6fa8d55760ba814552961fba4e3035c2b722a89c2fa", + "signatures": [ + "7de1174714dd3ae5dbe8e6799cacdcbd03ae68b0440b04adeb46bb1136f333e55bd410dccc8489b3d01c5e4073a956caf4388bb803cc8d0105f22a585237a0ae01", + "2864b63a0ea3bec590a1cd4be61a31e086cae999fb7c78955fa86696fb3ace04753e70d4f14c83cb20b05bb9a30528aaba1f6f5a952995343495a4fb6c05079300", + "703edaf07205c2cc3bcfd26cf1608d679458bf92861880d7856489c42c50d712460335658b68625f9083430f5338d6bf42d3ba0f144f5ab533679556df92000a01", + "d4be1600c0cb92e0b07ca0263cd57d6c909849fdbbe5178fa97d983a406839a94c8b964b06066c27d13613d6addf21e151c630bff8c38092ed00de017d1562de00", + "c842070d8c933f4fd86667ed96cae99037195a88d5033dc76b95969766ccd9ac41432953188335399e7b2224958aaf08c5262bdff78a65f9191b5fa13547915d00", + "0dffc1ef0f4b1d62b997965a884728c25702d6fce447df95a0549e4cedfafcfd056ab44346bde268b8cd848b4e61d3c0ab8939cc251a935336ebe599886bde9800", + "d59b89ada61d412d26eb7a1451ff13c1872d93250243b359a368a1dac24566b0617172f14b76091b80f49bf8b02a8beaf85a461a521f1a977bbcfca1ad81225801", + "af4db82905ab7d4038d17c6c511cff360af7140ac3a99e5f9c4165d197f45185443fd0090e7be38f3be83cb3bb6fd2ab7b5f913fbfbfa0fb8c676936e995499701", + "005009764d6b272d9049808915172c3e8e38060c6227ea8fae538bbd273cd815393c215b0c04dce8400084dc3d83de618f7bb3f2f98f30a3a930b1e3286ac50100", + "85281a5f09289a2625bd5f23012e98c16ab43596c0bec18b64f47e0c67265b8020132a12b3c9e32c95c7155122ef88da0143d629f4256beb6c77db4077c562ad01" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0005.golden b/src/cipher/testsuite/testdata/seed-0005.golden new file mode 100755 index 0000000..f5f9a0a --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0005.golden @@ -0,0 +1,175 @@ +{ + "seed": "rg==", + "keys": [ + { + "address": "E1YWJLum4Zo67o4HvSHcGwgTRRS5jsbM1S", + "secret": "28cc037e29023331566461ef67695ec84cfe2e3963b3284cd39ee3be4340cb3f", + "public": "039f1cade86afd2d1c2aab43bb91f346dce39aade4f1c4539b68b220b2deafd2db", + "signatures": [ + "582ed859fd7ac1047451c96dece2fce048a7a2769dbf7d6e26fd6d8665ca77d74de3e4fff87cc8eae6d2be699110bdd461ad3d2cd26a5f3b0a1ee57eadb8926e00", + "65147b6a8bf3b95a29d3717c77c0673e03abfb2e1a1d087686272130b3120d5425970e25ef2f2fee5c094c41d3a6a61314b73c1d505b53bce259904854da270f00", + "be54697842c0ddc05fbc4456ed2d25c52c8cb6a421d63b69c8a74717a70245a9574314b50a9da78ee7ae1456693887b662699ec495e0192d6df6acc1fad1c28701", + "93bd2264ae0770bc43304dbf03d841044b92a9a0e1bcaf02616c9fc27981efea59bc48fdecde42419d8504889f2142d1912f68c2526ea6bac7bde4cc6899818900", + "279c3f244cd708c0382585497edbb979542362842f431bbb2fb79c1e32c349b95c53b90d170f18aac97fd8cf5f7a44d3e3d4ce80d44bfdcc28fdf96404c04f2200", + "790bd0d363885beb9ff0fbc40c2731a09efe3239a5c1bef3770f20845e15456967dae17ebf7672c3520b3f2056f1c041723d8adf6035a79bfadfa3538952368900", + "f7bd0099fd178cb133e8d756dc78b4ba9f35f0eee557d5a6cae15adfd3b5274c7b41077a8b1d938d7864cef8654ec0154f6698735fbfdddabdc11baed63b180f00", + "29e7751f0cee32a72664925334dfe384347524b950776f19bb8f1f65a6e709a23f9f8970f3e3bf47536a99ed2926aa5a9275b75f3383b3d34baf662c03bfbc5f00", + "a4db1d71434b9eb07c3f75e9b6f4116a0ce972420c1873e588410fbb89dc31ac3d812e71cf4909386dd46824f6baa9c5c3b6b27a5bc7f9e5988c60fdd5ec506f01", + "fcd688f407736fcf408a7aaf27f1b2cedb72f4f9f6de248c1b1be600d1a79d8200aadeb8d330062861b4a93c948d1be588d062d02c36bae498d3d969c4194c9a01" + ] + }, + { + "address": "2TXZrhjdPPVWX3mropZdAJ7C9tfKA1H5btJ", + "secret": "3a6ac4318cb089dee2fe368495932155be25dc2cfb1994986cdd5a4eeb97951d", + "public": "025a9903b928ef2f66596d3fec381bd8ab02be4dd419d6147a2839f4883720c424", + "signatures": [ + "0d1ce484bdef0becc50ccd02245871e1bd28338313ce57f754c931edab9a822638f9dcc028b722e0738d5beda6ff9ebe71db9a1c432bc144608a58da7b5a73a700", + "d1c15c29c7d9cfa1312ce992120ea80ad20b79d46edd91815c4bed09f414d4244882d6fdc99d7416a35f2af2a148ebf2adcf66d35e6f2acf9fb61d23ed31714201", + "8b746e791bdb92becec684471b0463aa4191ea1735599b5c48850693f79a1b4e195d559735e0db727ba02ed790cf17d724f2c8085bbc755b3e165eb7afe52aee00", + "4b8fe3f64d924f290d451cb3b34ad3433cf0f5a1e63e2ebaeadd8c19507a8f5d558d012dd1a348a7143a995f1d6fc87d476379843271c1a3b217eb835d6c1a5401", + "06548a750b3a35ebc8408d251aeec0e2deed67e37f297120acf78391ba611ef625bd64a40e2521acc1110b9fe4fbb47b8130a70d10e7f16f8d15ebdcae50cb4501", + "75d7cfcaaa4e9f483d11087f4e1460991b96a47e3c13be1c7711dab7f9fa9cf577085bdcd8be8f852efae4cdb5ff32acbb7c62f944565e5fa2773760279efa6401", + "2ab8f885369a6671cd27ff2990a8c363a7c4a06b7f83db97421443241204a410170c37e10c8912aba3475ed773b80853dfe6d17ed7d3918191ccbaf84640a62c00", + "8590c0d45abb75fa18976c9e5c9f28aaf157a5d00611321d7ae86d1adc4ef87a560dd28f3dec5db3ab0156c19431a19d900267a36d88bee206e42c17e0586d0f00", + "c4dfa4c79fa9ebdd739a89fac870cb8d38aa52480e63c59f42aa0046dcbbea5c2fca4e64421852c8dd62ff7870ca24fe44b5513374560d4aa49f60921ac712fc01", + "8a3d9436b8230a13ad2c00173e819deb4117fc106064b044ab560c89d7f01a065d6533d1d2aad1565b22f1b69d005ece97de62c6e8c45da8f853f532ecefa24f01" + ] + }, + { + "address": "PTu4VmJMkpSZNPyReRoH8n5MG1o3gaicPs", + "secret": "a9e8dce4a111f6e752bdf29a5879c2c5f77ecd1c5f612df3e9edb8b251df803c", + "public": "026c915201c05aac2a8893115fe41615a49ed8d601bbee9867c53c7e3813f95088", + "signatures": [ + "c723e8e7ac59644eb1a9a59e6b8dc261104e7f89cad7e7e508be71a93a9ecea70c63a10f0d93eb5edfb23b0183e0a654dd042cf2420c6228818e819f8a63a4c000", + "50bf3cd499902e7350d89531941af889a0dd9bb0e0bdea2282313c99b291a6884080095a1eeb55f5a65ebbd209d889dc264bb7da5ddb7e13706a88dc532e3c5401", + "f4a9c141f072faf21151839182d55e841e48ce3d793e14ffc36088ffd76b1d650760bb36721ae64b2792cf2eed0afb0fe1d862d42ba9673348382ff3f1ca245f01", + "37a7ff5a750b8b77fe93cc01f71f4d4a324ac70fd5d1527d5ab41c1775f09087321f3da3198c38bbef0cbb886596804a22006c704f6592652aae8366a1784e9201", + "95fa2b244623e26c29ee4cf050c73cac85f1b49246790f34838d2922e4b3c90d28377d332cd9f9bf122afccc889a84930b5ec196b399c9550b1b83372ad7486e01", + "b391dc7753846b34c00091914219addb98d2c8f843d21c72c8f0b57c9292ee4642599181c94129464cbdd8704b93babe7cc0b76d281555536a93b6a17ccf042001", + "54325c4d401df59c618bc76f16c1684f3cc25aad328f5944d232a9f0a3170d8a393ec2c78c7389be320044f0770bb6c2f9b97a0c8df111425f7683753c783e7600", + "9479da56bd083cd4e8f53e492e651105659ac18682488ccf9019084d14c8fa9560873c07e85f5fc002e573ff7c5465b8167382652d088082ec8584f93db0d5d301", + "a4c4429e46ab80549c155fbf05fd7ff5d1adc497024cff628f751522ce429a825856c0c7f62a1dc92fd95d62bacecc002a6800d41ef6db5d8737dacb9d60e08601", + "fc82184adaf042736fd92e36fc42dc7e0b63125b6014916065bd3858402a4d891c8c206bc05f3a60ed6623b107ee34ea8bfb5182e5d75c33b8b5672ec5c536c100" + ] + }, + { + "address": "mkx9CqV8vnX8m6wgMiQbW8gLLnHh6vGz4N", + "secret": "ec677f802da9627a8c4a90d385ae68399bfbb69c15dea4cba08573cd81ac5a9a", + "public": "038797d2c1174dbb2e128e165c9d3814cbbebcce024c6fd459043f0dc661c7db24", + "signatures": [ + "273a38e3d7ba7ac27064fb70420911526994f497976c809803cbf933b95651f570c82ed60b0d5eee3e434754f525716ba85d1fb4f4b6ccd85680f12c178af1fe00", + "e4efd05ec215a0bccf810283ce8397f023cb79cf549e9b84cc9a879da14a1def127b603baf0756698db559d4ce57f12c84a90233eb952857e3864236bfe413f900", + "cd7bdb06aa7c5fe19a365ed29c120edc4936443b074437e048a174525fc8a49678e6e5d34355d771835c176f281341eb621d1c9912db8d04d51ef9e8289b3c6301", + "186363b97aa04417a725771ab2f53219f75bbedcca84a7720c542bcf1b7a7bac1d195cad9b52b23efc8278e0035856d1c405220164b29189ed094dec7618656600", + "c6eec9029162fad395aca44947e6cda7517f10835e5ca801462fe7a868086eef3cf8d712bdda3f4aae38b288c09a3851cf6d8f418721886a0a8e87e9fab6bf2200", + "aefb39fc91f106de7f7349b53ce3e8efa97986ce3503e8ab527af820aaae04a053cf336698cebec7d306cf5c52618ff77aca763ae5393ce8d5f45a580ef9ad8a00", + "7f2ace494c7b7ddc380da34d60ef4152f1cdf8bdfe082603d86a9d52a543e66253635ec64531f6b09d5a546549300d0df2ded35ec25e84f7b0a961f8b392423500", + "1fc025543feb8990d415283e946d3d42593e3f4259ad36de79d3211640b61c2607da58688dc13734c15beb10018238aa22cea4460deb1c0a95626699c0b58f8201", + "a08ecaa36a67fffac7189c82a72ef65a419f8ac513cf87e7d1e2780c25da17e72d21e72755f88d6fad7f5c9b21fcb5d9ff3e1cc0796d46b978e0023663fed85d00", + "58733846895c696b0dc113a50751747fdb0dcf32b43171acc591013c2c6fbd7239f707a1c5820a8b922544d2cbd3f49bdcbba5e7bf28db69035bf30b202da4b601" + ] + }, + { + "address": "ufRofY1rDAa2QQojenfxsM4X6ibkqCeEb6", + "secret": "661e38c38e3a9a5463be99e2e57d9dd6efd5569545cc0d4eda18be36911408e4", + "public": "025b6f563fdaf60aef899c7ea420397602b1b3ff23ff7a36230cfe55fd88368b8b", + "signatures": [ + "fc478aaf82572939f34775beba8665c9fe1366969dbe69dffc17824447f45192506556092180d7f76d3a317902e33a9706fce4d9dd41cfbc29794e31d00d123501", + "53bf45832787f16e51cb6bb8468a790cd494a3719b4430b84d1d4050a487d7ce347fc6e1cc810583b681447bbbbe0c9b2a98b12552417a4c687ce4de59de5e8400", + "fce73f2e0970d1d02338d808609010351a2c3cfa41f63e7e632b32741978f598158096d5dcc54584b05e288b3522db48d01e6295a1a64750d8c971e734d0597200", + "c44114e4381adc869165fc09554859f1f920e8cb25abbd10bda4f20c34fce4665b4403b43ab653f14354ca43e1cdc78e669b5448e4b9db5424704253141b62c500", + "80f551c54136d983cccb8e656eeba08874318b0fbb1239d2d0306d49a262591e7c44cfba78775ea5153b2bea5e6c108398b17c20fd8e401929c5e36aaa3b692801", + "4c978f3ffb2986d0251e54672cc393e1bbfed047083fd3ada43544bb2beb3f9b14f79550b5251431a4993ade176063589dc0df26ff16355b65b5ad6e06d9892100", + "460dc20c24368bc2793c15df634b3da1ecf55ce3d86507514a03d9b945663cf00887da944dc845fb1ef423e7ab51fe556b7391d697e6a69400e1e676f1ac24fe00", + "c90f01c37871140f69d90b2c5338ee058b0baacf05277bd5d1945fe465cbe0670133edf40c746ac174a5926b102dea63cde0e283e7d7d6b7cbb1faed0f5ffbe101", + "1ead603fecd7f7860eaed98169f33f479e45ca8ee2aa8bd220e9e602123435c84581a5f8603b2a9d16fd5811a3e6ade670fdc5114d7300bb1e12990c5c9eef4000", + "6731612a2c6b5ec693f8c710c9633840f321e572ae0a2a0e641193bd1fa543f55acf916bc16438ab756b365cefa68d749569fc49bd75a993cf193ab3036ea9b900" + ] + }, + { + "address": "jhRanaAD1Ta8fVFa6jR7u8sMtnABK8i6Fa", + "secret": "1d3da4928ba90d5bf443fd7fb56a6ebfc2a01fcc30ee33eaf8465d82b683850b", + "public": "03f3cfdd8ef2bf64c313f2feb8e9a0124bcd5d633134fd8eed177f46e957a77e96", + "signatures": [ + "813cc034cb0a590d2b264178509c874a27978e1590b39536319fba150cf16727759965f1c02ec72d01d2c76b403753460cb569739a2b4193f94184508c5733ad01", + "eb31c1e18718ea401dd5b1bbeda01886a4c40272c8f6d0d56a5ecde09df3085d513be8293fb7e47d37de19849a756ee6fc7ac73f3a8a215b2096c5f7662cf2ba01", + "a8850cdf7936d3f8339029efa5bea9c9422719c52fd31386044c0f7ab8a628622b118d80df8a5972a5e0736de5a2ddb9684fdb8d620f7a68dd72e4a09c10bc7601", + "9d6c8ca1145714afed5a3b6e2ee995375ab6262cccf0d24f22cd7067a4350ed0751dd15bbe7ebac345a4d56d75a3c850f229d3aae44dfb7916c39e07f252d37900", + "84eb2b5c4d183334cfe54dc7601217f81672985a6f2504440ea867cea0eb8446193a6f82d38a1bf7a32c3d8f2bbd3afb57767837986537a1d9b7dfd05e4552e601", + "afb88d11917ae3cc498bf982efa0e5afb1c2d23eccd20dd5494766e763673dfb664aff38e6f6482deb6cb05f38439355ca3ffa395af381cafb8353a105cd321500", + "a4f772b50f0e7ad5bfac148f58bad6bf83a98954d04d51608a9a218b9adc1e5417fb5ca3210a3f04d0dfa2ab09e44f6b667a51f6f005e8366d83032e219706bb01", + "21bcb3564cafda1143937042447b79a89bf128d881a88099654a12c5ebc05f4b6b477da247639e2080f1e0a0c0c5cd5180f902735e634026235c2f3e1a9407db01", + "18259cab8828b0a8b4fdf6b116ea053a82e1ddb71ac3b8868d8f14b4ed3b8d290dbad8a67f9ebe626ecc213db20e3fd90ebda5edb995682be0afa8f35690bebd00", + "41d91535c7fd4a9d7835149d3eec0c72b90a6d1b73a92dc91c35af16f2d35c107bf9e4c2123e09921439e161891becc5a2be9c5ddbc8b1795cc6804ed3eab34901" + ] + }, + { + "address": "77W85kDVi2ygMY6EjQffPtZQ2A5K1kJeTp", + "secret": "450e7d29bdee2f8a2e15ae2730152483498dd0b31dfc693ec7e4fbc6eac502fc", + "public": "024e94e6e275c8a3c6e409c91b071b70c0c1ca2ddfbfd3d08cc76c1a98ea719eec", + "signatures": [ + "647bbd3dd48454ed1ca0075cc15a39a2be0c91842dfaa57907eabaf9ca6d561219e69cdd04804ac2b83508b779a2acb71cd3bae1f6e9e8352a8b1d9240fe9dc700", + "04e7cf21fbddb4b196ddda4b75bbc92e82f7ec92fae5c824da045e352845b4a127f84d07069132fc1530b425fc64791d556733422ecf6a571425f622b58cdd1f00", + "90545da6f9a0e89c703bea93df3ce2ca7c8cb05d137659a2a3407707164913f928712322ee2067b26ebff4cf052f811e630936f0ce21affcdc7d99f21e25fbe800", + "21ed7cee0e1df586105273b54228c54a21e7621fd97592d6ba5501e2a277ef7b03282b2109dc87c2770d28c3c9b381ad82c7c79b619322a1f797b5c95d95a9ea00", + "0f4fcd6374b0b9aa05a3a702e41afea1173bac9077f8b5d037395097ac5482931775f134d59c55f546ff33211bb1ca83911c1901f2e4aa44358d3e2df97a558000", + "4b3f21d76694fe2f03012f2f4cb506e128f610ea3e8738ac94f22523bf5e1f4830e712d3902342ae2779c49cb8ab05de744540443f69900f1904f5b2e5a767b901", + "e1a91763cc1105ea763e67b9cd1c25f74d41b39f400df22003d779f2c91e4ee20ef444a3c454f8eedfc6b127c8961be3e6b25a75db3ad49451774606d35bfb2c00", + "395b880f1c233c3c12c0a7d9ce08c5e95e35873e7b5659f8a1472f9a197f59d8345bf678724bdc2f83138cff4c3ccc5de81bb074efeeb2105a4aa28e66825e6e00", + "0ea0f9b45f425ea224675d88e24c092e369a2d2a969ac0bc959d4d7b1418c10223aab768d397b7a71967e27e3eef91494260b43a9da4460ed5f973220221c6cd01", + "4142a63fc2be7e70c9da1501360b84662bd02eda9dc2d7d5e6c6217d075d1d683faa45cea9069cc8fff98348c7f2f31ea30ef5da710f27a9203d13a41b89c00601" + ] + }, + { + "address": "2fDFwpM7P6tK3krFcrhaYY2x93B7D86dCnq", + "secret": "189bd3947f4682e4bbdff3195eb88cc75c023248242fc1a2d3e37d707551e593", + "public": "02ba296ae39678461dc7a1963624b71f8038d6f74785f01d8e884c72f228cf7e88", + "signatures": [ + "89fe07b2f3da7f6e1c5de1dc60111033b8976a7e79e7fcf062c0c8ab3d7e9ea0206e68b8b01170fb5d7f491142725573625b3a006df68af15836496f00013b1900", + "62923dcc288cf2e7a118e44a4e087d13c86cc63f1f5157f0199ae98a900eb81d20702990fb9804c7d3ee668ddb80ed1cb36855ce479b54f0971ef7300373e72d01", + "59479f47a39299809c24b8e206f129d204597f2bfb416bbfbd4b8608a1d89fe33d3c1ccc4ac469393b12ef514f5c82d2e2ca780187ba1ab1e376f164649cf62501", + "d3fd138264c4b63d19341ba742456ff50b63bfb62bd7b2d70f18901a1d1478b73f03e45328e587d0f11c16c3dbd43c1ddab6c4ad989975e47093a4362287313200", + "397e578ba4e262ac884394d924650ea6b5065c72ea0ad1e917ba256875afca776055d0cfb36f4720d76f7b276da462fcd09e2f3ff791827660cd3ac139d1deb801", + "9fa423cad02fb69b578d38a059bcbe142ff273a91a042f61da0f73b72c80f8e24ed3a7cd1c8986af7de8ca603b2fd09812d14c098556fcb3879be8fd65fde9a501", + "a35ad7955b416e9db5f0070fcfcd601084ea72d313f1f5f20fe7ddda8f4e8cb0608d0a524ec33c0c7c7b9e22942cc26c13f1b5d986695ad9611aa38490dcd2d900", + "ea661e1459ead9509b69621676e1bc53ab2844c189df802caba4894d22daf93b1711c6ed4095ecf989794c5ff7f6af97f2cdb200fc4185b657a986b75910c90500", + "16064c60d7077e55795adc7c0f34ab0fdaffdedb7a128e99c0af9f1365463ffe62c8e537e4f591b0dcd3a26393f04eaa0651a9fd4f3d9152da2cc96e3b0590af01", + "98ecc21e4cc24e917150352ff2cd1df43a18fd7c81934ab5826763d300848962261ba895d13a8b5d102c1b4897cefcc5ae3bb777dfd882dbcc3a0437b1a7d9d301" + ] + }, + { + "address": "Ly5LPYccXjDtx3EA1Amb6kwZe4xL2HTCJT", + "secret": "2a00b256c613cf7de4acb7b47efb7b5be2cc328012717f3d585e6eea02df6f53", + "public": "03713f5421167dd1b76aeccb351d4bcf4086edc9c9be95d4f9efc4b27bb41c93b9", + "signatures": [ + "e8b8246e1dd328a7fd59d5e5023ae736d14f03f55c71a1e164642f0abd2d46975c27ae7b4ba1cd0acb39cf55fb24e7c6146011e3bb4fa7d425693b0ee8a3fd2901", + "c92fff56058c70c86863c7b703cf245a73ef615f4985c9951b2647be5c4b543f0c840ef819c7bf0583a11627785ab310a21338597fbc8900aa2f0b21fe81f90701", + "4f319b9e8697570ca0acae7423498da1aae0b53497f5feb3752279c7416498eb4b8a0b61f9be697dbe59bf9071c4c507fc0d6f59cfa29003aba8789a2caf5cde01", + "6ca0e05d533fffd7a3514c8d0cf7be303cb901dd19171a07b9dedccdcee28c830231e465c24d2f728dc88e9d9a742923b237f69132fdd45d282bad446e60750501", + "e8a4f6ce818a4a66e9fec715a01d4412d6bc8ec64199764f6864cd1004a6a54919897cc7403ef9106a5dfc76c16d56fbfcfe6f72f762726715148a09322bd5eb01", + "f236ab0ccb778d2cb2f3b1c94ed6e2aca5c2dee17a0fbb5bd560cc463e4fc8602e60c1dba5efab13f452a6b205cc231cf65bd015183855ea00d457a5fa0bd34201", + "d0114bad79c8173035bbbb330ce157fc1c1cee17de0801ac594d2b86931f42c54cb01efe70cc49bbcbffd85f363821efda30357e819d9a71e64f092b53f18cf500", + "6830f56c0c6db89cebe1672b1ad58ab4691e72c8e7ab44430cea79f1df58924504154d1f6109526f57d53f89186c4c631755123274d53365de0fc8c74ea2ff1e00", + "c580993fc7bf98f4d75d64119ae5e3472d2108add0a3ac427470b253433d9f8d36ab1e2e2e60cda7b7701ba0a78387df04ee3679a5fe0011306d8ee29ebd102100", + "a90ad4f18a5292bbf30e6b6a9e8143573524823d3e6b0a066ed78b3e9f30be6c0285e6554e6e9a1c24a01809dc7e0d439fdb57ac054259ec10895a52a5c2873400" + ] + }, + { + "address": "fVskJWYkJekapAcR3QQvBsegn63BkRCsE", + "secret": "115c197195ed609ebb91e4d81a5fa57f0819ce9e08774a330db4fa52d97417da", + "public": "024a4807e5f3c20b777705cee1a58905355232210e84b72c74e25cffd9fcb110ed", + "signatures": [ + "f210a289f3cf7dea3476400432a8a64e7b2c62a3b12e8f3fd9c8c22d4928e5c607894263fcbd23e0538dae2deb979b555d11539034b8ff31f99fc7f51d69a30100", + "f463eb2677fa97af9666a103e110010484197271ef4e710dd792b8fe0964c9b8307c9c40fdf5633d278f3ad3fc1f00b10c42310d11135158851b6b19edbccab901", + "14e222fff75aa114b3145022a34eadc6abb64e69e7f1b905430c38b7e4e4af294c720a884a9c16f44c8386cb91cd53b2af334da27177fb4f1d282ebfeeb80aa401", + "9df1ad76f388829b069d4474c4ecf0d8bf7de01a31e287b10fcc883c4fa714441490fb088d0586402cfdda4202e4f648ef9257be506daadb9803ddb84545eed200", + "9c83abbf506869f684bdec893a5d5d1291929c6b66e9fd35ebe655e1528f2b0d63563a380785345aab85e375132b7257b6b26a066b6a20c9c8ec58adea33122001", + "80b6477e48dbb5ea75eab67eb887fce8229ba9352fdf1175f6e502301be5ff0e370504d8ccf447dc76e58ebf0a8effcd3604b5f3935fefb78e6230fb1aa3df9a00", + "2bb168b7613b165187391ea14889863d43a8d967e63edee1fae608d2cfb7a7ff4939a76a1571e67481065c4e56a72d2bdd55877c474fd62dfaffcc6926a360bb00", + "eff83a7caddce6009dd76d07a5a9a09478e3300dacb39c4aca637d653ec4cdfb380bf7e83aa27fdc632467b4a64834055012601d05306ef3aa7cecc86f50ddd000", + "6f87163870bd241190f9bca7d3df36901d8139892f21a6db2575cc5b7f1cc55a21d85e68bc73fac1e2d29fe01d51fbd55741e7a727ced4947c8d6712f64dcf5801", + "7ecaa15895a85a13a2f8faeaca642e4439187f1899fadc7f954624764b29b64e0e617808ff959e0a584284f65931807817d3ae23255ee8cce74a8b65412507bb00" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0006.golden b/src/cipher/testsuite/testdata/seed-0006.golden new file mode 100755 index 0000000..ead3267 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0006.golden @@ -0,0 +1,175 @@ +{ + "seed": "5MnQdu6vWeP9NddFiehxsGwspc8aff/Fuzs5W3c6L1I=", + "keys": [ + { + "address": "rLjV76Fayt9WU5rk19FnzWeZEbF8nWqGHH", + "secret": "953b69e03457e239449ef051aee7a5fd9ad4f832bc60e8915e0f07b52598206b", + "public": "0296d12f5627840862172af9aa4a22574c427e60bfccdeef22e675b137b439b92b", + "signatures": [ + "4c9836174cf0204d88ec36d6cebf72aaabd1c5085ebba250e12e5fa21e629a9e78d71b3a0faced4cfdf037110b452acca16e2efae3a16efaa84c5132951139f600", + "e27307fdd00c852a4d209fa94502e580d7aa33c64cdf811c743c394430f1b2d361a1108937a57fe35ceba04b96498421f8210fe32cfe1223601565b918e70e9c01", + "d29f5c767b865f6311218d23cccf4dbc728a4cb4a148c7863a4475e4aae268af27e38557216a8290ba01fe1047b7400c6743388f75d999af176e3bbc1957ac2000", + "30d45245cc67ae3ca1bc840d90e3535ede9ce5008796a2c90250f7de86500da86f17b19a343ef2051d3526fd33a5894927b09234b86f58f469a3f1d018094dc401", + "826d791c834ed696f9f961f0a7f971716c66efe58a6ccce16e4b3cf834fc49d95051cc8bea2cf183a1d05b04ba9ed407648329f51224781a27bc01fc1fe75d2101", + "b0fbf1f4e21d32b4f3a6398da88e8d4dec7f20eddc4938d7fc493997254245fe257ab78edf9412fe3cc1d773e3c28b41669504baed686320abdd0edf21f2259d01", + "7515f2946fc8e43199818bb95926934d6a5be0722782ad44fbc67489019564094f378b3c57d1b11bcfe14bf2c0eae08aa9b9186f7b1c072a03ecc03ba416f33801", + "870ce446e34720816170da99f49a843537ff6cf299d7562af82fd9025deafb0b315529625a47049408d081da2b3429f555c74d7657917b8f7ba8fe0fefe0cd0f01", + "94fe3ce87ddc7f386fa597df17d53d9aa33d01a8aa2ab37a18a40128541af8874e1e05cbb6429f40710d945ae493aa033387696884788dd9ef9322030f1c246300", + "1700b3a08d9733e486dbbd26f67b48add3b43d72a952930c786ab44e5f31866f14d20319a6b1a72bdbb091d89ef7bd55ce9078c8c86aa2f0bc30e75f13b8142201" + ] + }, + { + "address": "2d94nXraZtkPD2GiSCfzugewm9cRbCVDNnm", + "secret": "4f8db9121a8fb6bdbc8de701593e953b6022431d9045b914e58c0fbf109cf1cb", + "public": "029cc260c200b5893e55faa5f23baf6268e0f20e77ee1b524b37f6e1e6ca9a1814", + "signatures": [ + "96cc1e166e56335bc6f859557ef73c2b7a96e3cbca0f32d901052fa55023a88732b40ce4e45ee236ffc07e0c4d2db6c294cc7f1d3a2f39d5e6e0f11da3c2259b00", + "7478758d8006ecb8103311c394931722a03f3bcdddeada8afd37b9d93b39d67033833444097d3d979bd9913526300f6491107be0d31acad6c28591d8529e24cc01", + "db8a4f5dd1d5cd811cd08f4ac1c4effb55ee93498f7d5f4d1531c315f047ffba605861a92e5d5358a87e7763ac223c6edc2489c9a08ebdbd3d37e7728ade58f300", + "7dd0865d18a574266d0dd3b173e03c2e8cf92ae77af99a8f68b9c7db2837326c769c69968837647d5b763a13f1caa9cef07804cbd814140d66607b0d151014c900", + "7f97f9fa0d45f1eda3e985b3e64b4656ef38480644c355b644e01dd772aa7c374db2e37f819d008d2da57d564fce1c0544e17206f3200dd12161777428c383c401", + "7a1aa12c91e34842ab1b8cdfc3e4d46d2f1a8af0267ff74aeb24a942d78fcd544438341e30c91c161689491514bb1d19e6881758007b25f0e6a87be044ea8c3d00", + "b823e93c1fa6e3391910ca4e461c58e51118e76470dc88506f183f6661f8ff0f03e4e4f1c58c06ff40446dccc0b9a9bb65b7793589e8402860f0d60f368659ca00", + "36751c77d88427b43ef8b68f15a2cdb48225a98e506d40fbb09f442cd513621615fb62d138933d7b88812f054be3c21ce1a626162abcc705bd45d4299c5ed15800", + "0932a2f7eedb5f7b9fc67602c1379254682892da2af0b5b8ac06d417b5136b756b96c281c4ab3735b9e3f8195747128b4cb46a704702b42d54c99e2b79ea98db00", + "9a7b5f8c7a78eaae1fc9c6ec63372297748a3e977a3b06919ececd3859e0ff5973c2fe2effedc1b01888f87d1ebfeb7b96dfb5dd6a9c96f804dfe56e9504c0dd01" + ] + }, + { + "address": "gVpAMGVd271pzHcNZiMzU7FDNqUiP78BwT", + "secret": "1a59b0065001a05a93d72d5939fddb148c5cfb775a0e2a27a99c6d54372939ca", + "public": "036de1827a8524f166854bc7b85510d17ebe0369fe828d8f8c40e930569dce118d", + "signatures": [ + "0dd770f09abc025ea1f3bc25b8910f85ddc5bd2adbfde66d247607a069405bb10cc60ee15cf03524dd5c15365214401b0d911110ac2ec6d530850c097bd543cd00", + "69b432114a086fb15dc22d85340d605bb73e81dcc48b2d3ac776fc84686e19304850f09c69d54dae0b30704a7693a33956303c5118cde508295927599e13cc6501", + "0f43fcde4a728d8c8a354aaaf12bf7585f52cbef863d99c63c9a0308ea53a5a32af018116c1669667ac5a62acadc0ef198dbac3d72821ea300b5459de615b91e00", + "af29eb64035e6e7282927df51f1506e5b0d12db63fdd567a23bd386e086d1559770b918ae23d51a73cf6059c8475f611c786b81c6b15233a2b707cdffa71af6600", + "7ee7e341312c1c2fbc6179f325a58cb592b740353431679e178213cdfd0cc0726247a34b9379559fa091eaf45e5b4e39e7687eb83729f409c6cdba842bba197601", + "18aa13d884feab6eb0d57fc85500cc714a49b45ca1529f4cc6eb5c6521e0126c027679f19d06d629789480342209ffcec217e0620d632cfb82afdae61c53c14500", + "3256f3bae51169f46403562616cf71988324e86bfdb7e7c24f431fbd4451ed29302dd9762a2a296f9cbb58dc757c2d0757fce4601977547c6a54a30dfe56c9f000", + "3214ce760c0f3dfc8463c85b4c5bf1c81759c3d45e85d8d061af54bae927ebb3297b7e30e9a24341b1a620d81a8cdc7e5bcaca4bae94e910a8dd4111bac8956601", + "bbbac8d56a6c385825c5549fe5efd900331864550d4c56f9930c3eae8e1f34ef7d6fb9c51f731aa4d501b224f37ce6ac73141f2bbfdcb881379d4d019761c59b01", + "f3fb7ea9622f83cba22743363780060afd9c6e5a46971636edccb41c90332caf6340aaf635bea94085b8cefe0533536bcc0076ab305bf0ca30dedf9e8d9ba35e01" + ] + }, + { + "address": "2TpmTjZqMDwwnmMum5CqDZjyjekoQxctUaZ", + "secret": "df84bb1a455c464ebb1da23257ce7e2998d6a2f92e2864a9e9adddd3f017d784", + "public": "03a9aa938ee9aec021db0717c0737973e68a39b4d0a2b0c168135a98a1a7c64dbe", + "signatures": [ + "2c64c71319bb1650d862f7d7d981947866d3249dd88f18e7955cec62343e6b5d68fa07470cf84d29731989f2c7b5132de1197cc54af7c13b0ac93b09c3779f0801", + "0023899b5ec712d998eed46bdba397be815fe1d0bf17dd1fed798a7d6cebd90e15ef600c2ef755cbfaea7705cf8f9c151b59c652775dcb8a1bf193a0f157844100", + "f291b5461df348d6b63e956b8ceff056c85dc80062fb4109f8ad4b7c92e64b5a3be753846525a0929e10223e6b50d6ab3705f259d515a4e861172171ab40bc4e00", + "3338f44cfaa47203cc6b7f40608a4a7391e3116244e7e3c2926d895bbd42d6841954685b36f65007fd768dd99b54f398de79d57355e5fd1d70f88ad83e27153000", + "a6fa07fdf20f918b7e834c258c759b8c8c701d990e879cbf3031935afc21ef882ef1e5802e4a6203a4e8be329f629185031948f46362ab8b9798990f10ded16c00", + "147ad65314e28af6c3153d74e278777184d4da1daf328f90da98f1f2049254a843d780f7ff795bc5e64960555355ea600897dcc6aeff4ad9e20b98d37702386800", + "8b6a680ec0484a272a0bfe3a22e3d2e764b78e71f0f616ca678d350b46aa8ff90d8d4c1281dea8ed555f90ca721da4960268e3376d752c772c2bf1114fb9b80900", + "a978234a0f34f7acda0716902b32a13738532ffe1f80b7f2194f5f595cc5f0f4083163aa767d6d84d40a0ec8f2ba9cd7a29e7778aadc15387201b6d3418d391500", + "5e4a552f73c260759372db4b6ab76dceab031ee738aae499b0495b214e7664a50fc03a74d2fe5c04e77edba12149b37beff9d4b247d3cacefc09696f7f67e2a801", + "838b75641e209dc77a8b72e7ae3ff0cd00df644abf5889949ccbabce2bccb3e563525b3bfed5ef54785432b87206342ead57e1b404235bc96b32980a570b25e100" + ] + }, + { + "address": "2fznUrLmmNj3vrq6kqhYTPdEcxsPF3gd2Bc", + "secret": "49db3eb8a8973862917e151d92ad0d159a5a11de20ca3fe299f2fc4ec71a9161", + "public": "03b0f175d8daf4d0b353cd28a6d454a39cedfe58d4d9447b47bf19cdcdc985b2c8", + "signatures": [ + "ca098ae575f90a7cb8a33024977b5511b54be8207ee45e607d0a1b2b01df75053eb358c3d1afc7cd6a14d127f37217def7d617fae164ed865fbb6edcd519bd1d00", + "3a57e71e97f360e0760586b567d9a9cd54aa578348c5ccc5b8105aab532ba4396ff942cfee75b255b39a60bdf8dfdd86218301a233b113da1110de51502f8a1500", + "67b95edd21d74b9348e2f1a9b04459edb63a1f6025f967f3e9bf237b01bc1dff426287145206d285984881a76d353416b0a09092f020389a26dc6ed2083a479101", + "929c014bbc57f925525698c7d382d98b7997a46bd8ef5d6cb195fea87a7c45575c55a8e9d9578f0847fad452b39a32e25968d546cd90bc9ce4adb0d9f9d82fa200", + "763f05ac9198194298c92246ac056bf1b9f92c808260aca82fa976b803d11c8d1e2afaa965baa5ecf38d656e3ca3c2035ba18518765a7aac0bb6d9106fef6fbb00", + "3abe07f94713ca02e09662cc1127822cb7c8a2fd68ecfe859777dc818c67e94331366941b9e3131d3f8173a504982f043d985e00de6291bc48fd2e7a362f9ee601", + "5f2062b454a14402f952b1f82e275c9e94d5a803302b7d960aa8fe739157b7dc6ebc1f8b284e2a1f7b94b7622a1cbd6928a8596cd843f93cb829b919f9d1e50600", + "61803922611692eb0f4776862841583e6e31844c71f12af2e6eb1316350017f731a6be87b0dee2ed0e32ad98f72e1e86ad50a481a2b153226b532e3473020ec201", + "c08e615dc8e024d42e22553de77971c3eb19de95e178528be685c2c9fe3f64aa59541a40158a3ced9a4aa974b0fad13e57d9bc6fe182c78b5a3a9f37dbcace5a01", + "fdef54961fc0756322e658a993f3cc4e982b770483ee763fc40bfff7b37943c771e7a4f44b4bd48dee2c0a722f184f0c8faa22173c3b2f1da0a3d3ac2965f3f901" + ] + }, + { + "address": "2gQbpB4v3yXRyF6oorigjnUUQaNzM8KuQtD", + "secret": "60961b0cb2ff7ec60965404fed8b5dbf29edbec06bb8325b03957ea5cc191970", + "public": "02c4534d31801b121ff729abc6873ac9ce3fca7f8f87f4b4aa001a9990845bed33", + "signatures": [ + "8502a96792de276b98893482baea1d2d1b1cfd7aa6e028662400f3f59212b034270f86e8f98a38a8b3bc0452afe3c51730fe321833d97a6f2af0a75f239a565901", + "f80fbe0a4126504ea331b1eda8c0ba9c33ae9bbe43b80a109a7d4e2dc102a5be7aed8abf4ea85dfc6378f7a090317df37a2bcad54ca4982871aeb0fce5b497a001", + "e8e4ce06507f1aa72def1b965fe4a2eecbf5f3cc9533138be8db41e78768ac8445db94f136d8b373a21f5991679091914c849736fdf842d35e4ce9b66d38ce9e00", + "9d1a1454348343036699d8be3be97912e4b29428e3642344557e24f0ce7be7537e150b9895636e28947b4ee1a42ca037c392fbb9fcc419ce5f250718684d71cb01", + "60fd7de5912ab8b581be9d6c396c838ecdb497c706c38f45a6a2b730b8d1e5ac2562ece612d9debf93f453ae45136d131d08a53e6a1d393914571d1c551b1f2e01", + "ef9f454083f9a2550115585dcf1d45e3c3cafa1460b0730ceb1dae89ad07d07e67499e3ea50ab5798c16923325b7d33b70456425d124d0a7be86ed2efbd4133b00", + "6f8231bf2769af9d12d011798307d7faf9580135df840576dc57addb0d66eec33c343646d92bb2297a8d1085d953be6f96697c88e2f978f4033b7bf4ddafe73400", + "8667448f5154ef26d1e65a6d29f04c2a510fb97d7de90949b3f47a3aede8694d1fbabc3c16f64b698d1fdc2d986bd5e8df0ebe09ecab5399cfbab39a8ac80b9e01", + "4f964bb6101b0126e44e1e71abdb414e937b7668ee97074a69b628c15ac78d524fd45f39a1be141ead32df77a8ad0a62cfb6c05d5eafdf69d6c80932219c856a01", + "660763690925139272e41c09c27885b1c5d8aae87bbe2c02fd83d57f9db9c57a69aa933da8a4a37cb56dcaea20c0f742cfb00294dec4a6c66ce7dddb5669d9f101" + ] + }, + { + "address": "2FmtRamAEN3Eiw2eqroJt3nhHzgo9VxTvPK", + "secret": "5127d7f0c06d335e1584ddcbf4534c8a5be109ec2e28a2f40aa5491427b7452c", + "public": "03103745843f93a49c945f4fbc0bf4ff479101c22a3ece11220cafa109280b494f", + "signatures": [ + "6f9e4d1d02cca690bf0e2ed204e32b11357588a77f8605280bcb92f148cb4003166a5aef470d4e3170e68f6be369e4444b8b04290ed5a0d564e6e5f86cda0b8701", + "7e5649e2e83de29a9058fa138d253133c7bb8d0594c3cb546ade2a026796050013926bfd1a8a7bc7f92875e2275224037932568b60dfc7bc2ae2ebc6a1b0f82501", + "b5d0be26eff1bcc5ae0d03a115baa82d52cb33c13833351362cfa2bf4c2db3075f7035d08b3ae0f850c63b87358e1bfe557678bbcc7226097c9e45310f9a5e6b00", + "74352b57c8344b32c37420f636892e592842c5e1794d2bf0369d4f4dbb005406152b7725f68726df8274246e7923b2aac6e43314569cd54863158d0f9ffdcd2500", + "366cefeba68f76d1ef460ac310d0654ba8434ea30e79b445cd7481b1356482d107a7148c2495b0d143d800024cde9364aecea0d1457a8fed1a2c1de326c2777701", + "2d0a2fa37cc5e3cb4a882d0632fe2204cc26c4340a13376e7b0805264a77a32313ae46ced96592e9a25a7773b7cdb38ed0a6ed4db445c079b5cadee8202d29b900", + "ec35429af03b64053d09c0e7e1413331e261ec2652c9a5ab268fc48c8a7449d13b4f707aaa5edc48fd78feb5018fb000f53521ed9167841b618a9a27a153567500", + "d8f999ae5e660966147c9faa1acb503ad6750ba1f5fbc14fd1806eaf6667bc3636cb000d5e02f68963b7e6af546d21d0c0f4c97eb13411a03da3870c73a685d801", + "f49df2eb22d660fad6d4f529b0c645023d4c9b37822bc728bb80a28ce5cb2898618f080208f48643efd045c130025f9f3223c568a5a2505a8b2747880af730b201", + "17d9223864ee1764545b1bd74330f3d692052f42b73ae530712ce7b3a02e0336316736ae1e054e80da778e173f9cc6e93bd865e208b41ddd6bb7b8231d0af4e700" + ] + }, + { + "address": "k46MSCkDYk6ZaHcj2ytwZamLRr5w4QUEwe", + "secret": "2b1ba25cdecc2b0c4b7938c220615929abca0d1df1d673604f8b370f145467fe", + "public": "02771a319f31f4d999adb58b1df0042a525e539d6cb4bc3721efd7ab2cfcd0a3e2", + "signatures": [ + "59851f4aa542003febf2d39ebadbd07ddd12cd41a665a8fc052ba01b1c484a6d407bdc61b449cdbeadf73f6ba5866685651b7d0249527a82f965d5a2b314c4af00", + "40f631b61815f54e0a12eaac988684f4808462f19f7b76deed56ce3f3dd2bf2827104ee2ab71c3a96773de3bef7a41df960fb98329852a42be09227a1c9ed89b00", + "f539e928d4c68938eb6eddd169a09edb46c056771185968d548b7886f5c1eb9b7895cff1df13be0d70c51bffd0c98f8fee9dafb68d5d8d3bc1b2f6a5e700c9cf00", + "d1b9277ce64f26956d65b15bac44a3ec80bd2024e098be69bfb6ec36a4718aa75fb6e8b353008a20bd4dc994ae9e7bd928c6efacfbca7d2e07861e3fcd74f51301", + "bf919b227af4075ca7864fceca4dad5a21ca9c1f124fce3b8f66f8406322fb021c85aee03128fb1b43fe0ea91ea825932b4dbd468c15ffbc8e5d36f69906f45200", + "36a6c965fbaf282058fb5fefc466d9f4df508598be400eb1f9415533554c59ac18f04007eefce37f5c8e9ef7901e65deb2a2219e2aa7ab638e4370bee9c98d5d01", + "30ea0d7dc2735767bd60d85cbfb39c19d0b4a2d7aa81157a2d647c548c7eb9082b991300b5608d13eb2bae260c4eea723f92a0c1fa82a267fa34498fcec117d000", + "91ac4a1889132a827df3d7dbee5aa95a4c9b111283cc1209c0a7ff77dbe782cf31c8f32320bb3344e06a3c114e18fa0da245f4749b11a27ab918c521637d6c8700", + "8c59fa54d45f81390b67c23659c831786376bd7d730a9af1e936f09dfb0cf11321200469f6ce4c2ebd53f7ef09069c314d9742ac540c3ae90bd4dcd805ea6e3f01", + "1055cbb78a97a410fc3663dfad3bfe21865da1854cf196d1f532ae42d9161783284210305c1abd09f77f0c36131458506d3e84dc19e87a3255e1fe220018169c01" + ] + }, + { + "address": "2GAWkAhh6ddxLGT38b2XHCuhdbRx9Jvf4pk", + "secret": "e0c84b3bd790f03c58548657cad0a83cc302d1b75d7b6b3d8edfc21d8c2289cd", + "public": "028209201b8152ea8fd7f7711eeb82354f67cf1cf1b4082160f9f04eca421bea2e", + "signatures": [ + "2b390a37a9cb797fb637ba4ef700637108629067a6666d5e1ee23bf448fd171e0f7218eeb61ab445ebd7c14ed3998f3dcf0a3aa22b66e7d5a545a31a6829e5f501", + "871b75956dceef0b0edfe032290de7cc86347154cfdda5f589298e6aee850bbc2668a09c61d71f92ca98347c39e33d52193f61cdf125db85d463bd24b3805a4500", + "dcdc972a97aa2c3784a9d48a886d344a1db80a26e0015c54590621ac2fdc9c6e40149a4966a80b4b96a3f92cb40fb48043c359f44e58134c0addedba9257506b00", + "de090ac5cdfdb9082e682534f1486f426343c9aad870ad45291a8343524ddd67379f76bb35f75191ccd45c5286b48e4cf5049b975d07548b97fdb31d86c1fa5100", + "7bf2158c903b09045bedaceaff8f15603c762543d6854e60037529a20f401f766979df98a63a9432f6154b010deed9772ad21a15bc3a162b49bd5f11bd4d96ea01", + "ae300255bfb6443a65ede797bce0944bf7a503d38c4b161935f44ed2f7738e347040bb8309017d5d6c14161aaa0075f301d957c8a761b33284d6d535547bff9100", + "e61371336baabb089fe52ff52751e5e41f34820c4875f0a2cedb2e20cd8c1c2b638f3b0b04b199dcb2699428fbdd1e55ffcee0744d46c503ee125ea533d567d701", + "e22f88a49370f37b078fed65668cbdee44567ef3254693a9fc0aa181739acf2f3ced7c4ff5fc8204304122c3072c2e1dd8a44989cf6bd77ab4709d6fd1e3952400", + "76d6cb79f1529b03762fd3323fd381174568a05f7c799faed8be6a0080d89d9b3c607d378178b6e941e2fdbeaab235f2cdfd37fbfb9922170193d6508081148c01", + "1cc5722eb5e17c21114daba7c19ae25649ee79482ef8b681015f8d708aae2aca4b3abc6b345410f94193d4e9e8de50cda2f5a5e52befdfc9e7c81a42757eec3d01" + ] + }, + { + "address": "EzfiGbJmK9AtLocAbUUgKt5FbvkptAfLqC", + "secret": "4da01bf2216bb743f5412fcb843d79ed3bc22a03ff7ca0b314255fd622d90874", + "public": "0342b3d108f4f046af97cd92244b841b6ada34f52548d944d3e22344a952e3d173", + "signatures": [ + "d320e4335cad33aee05f4149326c9975464d2b8b0f24fb0ecd68d57c19f6df3f3dd0df782322bfab34be399762e3c43c91e8e61fb2d52d9d41b63663ced9e71c01", + "ac536af52e3f49f392a5612bb227c25c3ab58c60b6d2646ca43b465d409620230a52304d22c942f28d5a6f7d2e69093e828027dd6dd5ba4af5e91a6fa423cb1000", + "922a0df5d51a5a7f64b42a2a3491842350cb37f3d3331e14cc2458e449f384f158b9d6814017cf2b8dbba0962315808163af33dc85f73339aea0db2f1249e4c901", + "19ab17f648411a76c8011199a3f648bf4678ec8086ee97bdfd09a6abac3703190d75dd1444404a97505401e5c5465cff9c73f8281ab300ea2bb473647265cf3301", + "df43f4d301309340903b862f6002d8746b622c7f8aebbbe6a3b9fac0d17e8e933a32313dc3faec39590c414d5d9dac92705e72c45be95a1e53c9476c96b35f8400", + "91af75028b21573abc40d3b7a652850202898b2692e5fc77223ea7c8bcac75f002d42a0968e9bd12cddd0f5dfe8372f441dec2108650d8892ec133428099951601", + "4ea9d6a9cd5a4298b9649a83837a1492339c53fc2db3e120003f5e3f33e13984739b7f2fdebc10ba7b465e000c2167e8b215f250379d7c864f98d16e6d9e130901", + "61ba9794787249f40c9d49e451f7605d7e7df411db3e6833f3ec6b436139583615644f11da4e650dd170c501e6f4011691c9dd1eb8371f7e06b5de59cb4767b800", + "8e3ce6420e9e3ffb84d87f4b62738114f93afc76650c184445e5e625b7470fd01f1052b3c85f629053fad8bc8e2b356885f1cb82e647254d4e5f79d86cc94f4d01", + "2966a1e0262bb90144cbcbce45fbe477f9ff135ec4aa59f8fed4225ad88c8acb4eb639cf1dfffd7f702b7c9695b427dd91274904394597bb83209f00b7403a8900" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0007.golden b/src/cipher/testsuite/testdata/seed-0007.golden new file mode 100755 index 0000000..a62353f --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0007.golden @@ -0,0 +1,175 @@ +{ + "seed": "cGlsbCBnZW5yZSBwYW50aGVyIGZhY3VsdHkgZ3JhY2UgZ29zcGVsIHJpYiBpY2UgcmVmbGVjdCBzbGFiIHRoZXkgamF6eg==", + "keys": [ + { + "address": "mPSsNuUTsMdvc6afNScJGAYWLTK6zjpaXr", + "secret": "b4635dce2ea621928c61bbfb2132090c674e99b9ca6017a6c7ab33dfdbefdee8", + "public": "028e6507a815ed048711b7bc74214addda37b5197d3128419fe2cf1f46aa6f4da6", + "signatures": [ + "8669aca771dc0437ff8e12b65ad4458b4e38c1bcb1b1ff29f8182780057942b82f5877933306f93753d76c5e74d0915bbc8ab62c6a641b2bd7ccea69797f5ac700", + "97ea4fdd2fec0593c93c8d37f2e938057fb570f023e73b8b441d5eeabfc2a72764a3f851f7da5c5f3af3d969d87f86fa905cc9f1bf6472e2a749f60d6891b2d901", + "4ef65b166932549734074a92f77266c70696f2ec5d64aee324f6cc68cc6dc20b0fbdfac4d871c47bfe97f11070ef74900f9da818bd5a0f44bab01b35cd47fb7501", + "da6383da7ae60f724056a120280e8fa24abcf08c0ee32024165090edc7e472b14c81d41c9d52b637efc1c7114ab65f53890251caede1dfed2ad2beda0bb57b6c00", + "ca7d081115500cb95a9b8e4990429f2d1df284ee6088503721c100d8132c54ac1298e9b79b1546a09877e658735192292283d8396734607a90905c98c7f5b1d301", + "50906532962f9b50c8db4a9836669fd0d62f7a33d3d58b33e95cdad4ddc99f207c9f75fb0fedcda2f87ced5fc9d48e2eaef274a7395d68f31749282ca96f729100", + "e316c729311f1cb873bb245e128775948f4782f9e36e9112bea1d4c1ac8644ce2b3c4c914b1ac36c102fcef8e99391ecdd5bcfae3bafcbb002c5b0f6eba25b5c01", + "af312200f509edd20bec70328b8f88ba71a57b299b46799d15d9a8afbc7ff2a173d7f67a70b7a527e7bdca3ca0d0980cf84efbee41d2eebcea8d81d79da6843c00", + "04c2cd593c4cba96a0fe54fc119b3fd00efb82bb20bd71aed1fbbaca05a588a239f4975d39351bc085a2b8c0043a08ee09351e3594554a23b357fb5223f7769801", + "792267a2445428980b35e0d59f3f656bd4c71f0e6c4b8fd1f89930060d90ad8b26dfe4e4aeae7df72b42e7d4b5a5781c402cbeed51a23302f65c321a2d847d6801" + ] + }, + { + "address": "2Necqw9k3NCEtj9FY28Kx7NV5nSCGQ1joHi", + "secret": "7655913737a47a580d2c388440d9236a0283050aadc7b167f2584e9878b066b2", + "public": "02bd478e24155889b48977d6ac97fc7bdedd146fb2c983960e28d63a20a1adb6c5", + "signatures": [ + "aee5eee74330efeb184999e59b5b26516a124f6c320d9df6167cad45ff297c4f43525905e5fdf73f07f6925cb4084fca43fbfeffaff5eee81d52f53ca08d2c3e00", + "d97bdbc541dd80006dcc5e4c6001f044e20ebfae2f6410a2af7e44acb9ff4c0f68e0debc89784258f6f8d04e0d58e4342ddf0ea52dfbfcd693dfd00b6cae60a401", + "726eb4a9402228f925da2aa936b635bf1d3b587e7566620f0d5e359a0596c35d62a786f1d604d5109420e3449232622c3ea440341715119821c8392908e0db3601", + "b591beb1c89636c14a82694323df81508bfd6f209ffa768d0f2f74b27b2572aa65719c48732ea457e628ffd68fe3125801336f147968da55f8165ec020f480bc01", + "9f5ea12b545d1ca7f4ede6515e4f88e92aeb075e470d69a4a5df5b8516eafcdf762be8995c70fc788f886a7440781c95c384f7a8a4cd5e9a7e228366374ece3b01", + "f8e7277a042429076ceddc5b896f6ed69864776dc904572cb499be4672b16d0613e046fc3626a953343046c60e86114f59a24e46ef96f5b7032b8b204d18f4ad01", + "2c4b74070467fc30c8f902cffd43cfb21e7d5dce587fd1ebb07ad4374df020e240c0191cd5e68f4913d1b99a87f9c68cb59bb877296aa6a531e6bad860c0ab5300", + "00a0d16272360c4f47de24be8962cd3f3cdc13fbc8ea64aa57f138f12b9de5082ce3ee1e50906b74552dd5f99cb10d517e4aeffd308b43f680443a223363b9cd00", + "3aa6aa35b15eda95eee58a82e8a2e54780b77248e6020149407e3981a721129401319fe05da2a9e768baf195547c5180c52bd2b862af445b5b0ad50f8557aaf900", + "863ad24a59dcfd63da8c41af9334137277cbfedaed35c0c85d1424751c3cd871191ae55d8227dafbbf9596966a759c77fea4da7a2eaabf126aa47e9608cc000400" + ] + }, + { + "address": "ajzwXmj91ZKMnHeJ8LasEEzjd43fGJo2P9", + "secret": "b1410fe8b4705b209bdbce08b800017e52d34ebb5cbf62f84bfba61c146312c6", + "public": "033c8dcfced958c25c2e522a854c102da4901ab2985474183e3563b5540b4c7b00", + "signatures": [ + "24643acd511ef7d7310f30d42c6e627cd7fe33681b5a6e3752f3a29176b44c7a547dd22d421019223d0575478cd20ce96931afd3ce50bab7ec7814b07f5690a701", + "20300a8466aa41d9ca854c4cd18291d6aafb8be050db7553573493387ea56808494e4bfe7bd40670813ead46f6dceb0bc147faa7804eed7738de4588466f800300", + "8d47354f77889b8b6e5c91af0771b6c6a1f8cdc704184a635fe06ed839f054ae264189d96c05444c3412a352e5141e08adfdb9f71a6694f98b029d43dd47251101", + "a13d77d2f566e73cdf93b915f24ca8408716400261ae15997dd6ce6a7ea0372e03def52420d5951645211c59057f911215ef25f8534867da690ff90fd9f7247f00", + "0980bb01721d53f0498801b77ac4d916a89f17c243f8e6323fa0988245dfd6c74d2919c4dccf3732567349349fe83be40c0dd068e9b49517cf15d0700ab1811501", + "d8f02afe36134fa6b42a649fc5c779a2c22edf4ab828da68c5f891d99823a3a72345a4e0a0770404f890fb385bd306a4d25e92a6dd5e6d1fdaebac427c10c3c600", + "706d0784c82536a5f2b79622a8c6c73bcccf8384dd22c4b0d2a8bee0918e1492240ff03af79937797292475464e04cd0976bf3a9ce3602405f6808c9af98bfd800", + "cc27141a61bcafeb90ff4a55c25b2f80f5a4a8bf1d9b23dc56990b06ea523a91650b356d9a24b9624fe74541a117542d2f20992bf047114680c8d2169dd6404b01", + "052427033c268b9b576a93fa05513f07f5fe090aa1040d94ed116db202e064af58e2f05f9ebee6f405448ec70e41173ad39e29f8462e6a4a82c6e76e2790b94700", + "215d08a564e5fef911b8fa1b7dfb84d9d7013501efc3ab92a7ea2bce8282dd8c31db5c2bbfb44df63b8b93e6bd2099cab367ed1d9584b432c85018f816b7302a01" + ] + }, + { + "address": "KAcJer4yML3KndgxtHGs2SoGLmRTxJCynf", + "secret": "4a5e44f0036c42fde00ec8dc633969474fabda864e45f5035b18f4d15c8321aa", + "public": "03f7d1f72c91c5e6878c76cd1e5b84996a0c0a8ef36efb550d01f7af459606b48b", + "signatures": [ + "3a5ff4fe01d7cb3739f2976746d396eb18f1f181bd5948395d4c41e7326ade1215da758964d42ba65158bf7e03ff8c7eb7c0dfbc914eb365e1fc0ea6c02b24eb01", + "3c391bba2682abef47fdff47022a590859abb9e95fb7dbe7317f6094901189160b114cdf44b240851c939f22e1540ff3086f91340b3c3b842fea5fffcadeab6100", + "c2be33d40825d186a950a653b61cad1b16ec0429689867a82b0f44f1a6cd633d03a6e6272e0cb886f1bff6a014516cf181a2cf6e12658d6ff32d6b32d69eedc300", + "4cce6a1330e0e838aae3747ca45f35b9df835f8744fc4ea10aecc7aa0f14946c3a780554f6fb2de15ba38c067b5e13d7d88c31c9e77bf622339cdbbc3be985fe01", + "7513352f17bf50544d3b808f9be00b9263f4328ce98db10f3f8e6e601145673c0bb2ac0dbe4784a370434d45f209dbd6afe1c4c26e0e7f8eb2427b94293f91c500", + "3f3bc0a9d2979a813bc0e1d9f6f755fa0f542796c3a2db18c04c39aeeb1822842c4d1373bd524c45aa8b537b71e5848ffefc65871b3b91e753e54ea1dc66acb501", + "1ebfd245fb5b3654ccd95be0e7f4a644896c5e5ba758778d77de878f860e4d8a3a4c33f7407db1fc5734672fb046a5c02776e13c0d56eb8ff8105ba68d52cda901", + "49e5a8fbad3e381488d6ef1ff2a8d58167cd1d17edb597c8e88a24b6e5e17e8c442d4eaca8e1bc7050bbfd439a86e857a9cdf1b704d5aa2addb016eb5af77a1e00", + "36a9f46810244e5eb23e823965a83224cf2783c140f6042fb35568ce9abb33242616c0ef0b619d9034205f01b4b7155a8237c9745fe905078dc4bd2c8fb8599001", + "e016afc5f089018881eb7516cbd07e37e044565aa826d7e37c9aea005be336f158eda455c30e03eb7cfd56bb79c5895dab15ae575b18d4b1b2de8a8645529a5601" + ] + }, + { + "address": "X8yAtMRCVageKAgRixGESP5vRJoe1evT9w", + "secret": "e2107eba690b1df6e0d3a08373921d0a19ac491bb10380e40dc6717ed11bdd16", + "public": "036a17b121be33dce4f868d591c82268cc86d765db3b86a447ea50b7d1915db8be", + "signatures": [ + "90fdd824c80b4d683ad26e8950aaa9c9459891374e6d519154e16833d9c6ee801c5d7d202c204e85530ae4ee0a38e9b115528bb3446364c945d529f9dd1d185601", + "b51a66267ef5c3373cd2d19e569d65349acbd3e1bf2e4422f5ef9fefbfbefc4c18fbd07ab1d008c887cb52c179dd15c7ad1f6a348a5bac45071b62ad4f9690a900", + "629bdb73080d5a2148d3a6d68e46c29509285edca81d9ec602a6eae1ee1fc31b4cc421a925e5c1a55f77ececbe201146afcc93ebb1376bcdc8a0950f61a3010c00", + "e392a4bde506161eac5473a3f646d3a153efb718405bc3ca96ae4d6d302c25964ac38e211ecb52564f459098f865f3b7000e58f30afc444a6b9fd6837a61b90500", + "7ac54bbdaa5a2b800904fc79cee2b55a6a2953b31292824bdfe2796228b2c97c06a0d1032adf26570c139ca5ceb7ea17d677be5e32f3d73edb61b49dd21e312a00", + "7f4e56604ebece2f589ba9cc8bdd3ceed3cae3bc7c737946c69637613a497b0a22d7bf916b70cd40fa7532cf91bff9d48c9cedc0e8fcc24c2a1d5a70ecbc51f200", + "74b00a4928e33bc6121e6eb622707487fad27282c736620892c0015b7b7db96a1e94f3a19f0da4096c8034456185107911c25a01248afdfd4a49f98f38bce89001", + "8a880ee824069f49a1f4e7d5cd76d70b44990cb8902379ae64713921bd8c0ebb4e6f63f4c3849e3fcce331f77c080120cf2409aded25bf48000c64a2515cd28401", + "4121056c8a3696b6158d8e3301e23c514a5863ecc1926db3c6ca313583098fc409d61ec72f9d3bcd0c215defe6cd5a07c4b2aa062e55c9c4e631ac3db237443e01", + "264e63e3df6bf4495d12d1df6db295b61ce99b9e477c1a3e6ac9fa413a11410455f173038160aaea178bcc71a3da7deefb70fac5f1f7fdc9dcfcf8d5d2f74ce901" + ] + }, + { + "address": "2XKCgWpkUHdPxBhzgN6RNFDQSFDpbfjTM97", + "secret": "bd04dd38b12d99d5d99da868871ce4c8ec3005e615043e7f6ef766bbfa041d88", + "public": "02037e40467e07e07528f1076e64429ce8efc955ac73b741f2775df7ab7c83e9dc", + "signatures": [ + "25a7ebaeaa0eba12d350cd2e022fffa3ee7d73b60bcfb1b7dc6ea3a930ab16e065a23d7caf1f79bdb390e3de2b1c09371ff22369a1b51a0ebfbee5a11d20883a01", + "d3d06e33fd3597af973851f1ef82278083f8a8a6bd58c6d33ce59264cbcd26a13daf8906cf2699c3846e64a2fd7e7dfbb092f2e4e3925157cfaea7788b8efd0900", + "e97b9b1349bd9b38912270f20c664b1f52c1ccf2dc6122c089fb6bba1c9a1864430ba63af58748de4f3c2d97172577a0b7bc659a31be9e492af81a612d3ca66601", + "5b69a9fef8e54fc5e262b62a5de331a9a7f16dcbe41f61799d367c0a4d965e8b1bbef4bce114397dba8d01b8a86a87f1ebb03ed8f3b3250d95c72963acbb7f8400", + "c34181e4a138f719197db757f12063cf844e5ce384594122b7ea668063a2dea318b00fd391471fa4a6b951f9d3cfac173ff2f4204e912f4a762f6f3eed2ee30c01", + "585ed7c1228fd22d7d481cb6e3c484c8749572050aad297aa9e406b948ec42d67430f39a4a7c46b65e876eecd8d4383aa89ce4eaff4268802cf1369663be9c4000", + "a3ba44c0e700bb0cf95efc6b0c215af840d929522d6f46efd6bd2f4b3d03bbd822139ae82e476b0d8419db6b106418286800d420fa6017ad460980e499ff547600", + "23d1eb4d7379ebdb764e6c99949a8ddd76306f351559db3e6b20aa44b5cd2b201ae1656f92dff367ef9b1608e98206fa97a61291ac28b1894d06a8267751dce000", + "9b61d09bdfca7e6c22fc89e1e60a85b94641fb2496d9259d9a277a48403551351505f6c412a67cfa2870fd43cffadb11d83c46b3abc9e2d7e335db819d775a8201", + "8da42dbeb2e06fc69ecafeb7bf9cb06f1f7c18ff16fcd0e1a3260dfe9302293e68d0408cdb6d2264a979a1eb855d503af18248beadb95ad14ced7fd4b65c516500" + ] + }, + { + "address": "WmcZyCWxhWWBXhcW1KuBf9ft1j8wzTw9EU", + "secret": "47cdecfb4697492b71ea68c871fbffcd3d7ab6df36f5cb744c7530c88a775703", + "public": "0393d74aaf73d8bda3199efcc619d7bb3f26cfc95800e3a0ab5ea029182669a0e6", + "signatures": [ + "0cd5e03900cb1f6b9217a68b5456595a5e8693e247d06b59ff1df287b4c8d3bf7a39ae9e794c3ccca84fed36b447b6256df5b6886b73d1f15a47efab6ed7abd101", + "1ee6a768810935fb72d74ca1fb946786c944cb335b1cd95c33d10e1a5ac16e0e18f6a0e4102e99ddb6cfcda7faf4ab49e1a93e1133d488aa6c23ce1a5fe251f201", + "001e7e58de32386c7e5d3b64a967ab804fb147cea16b184c2644a8685922fada0f648c9223baadbde6e637be0ce26bf477d1b2922decd993e1d97bf968b7972100", + "2bc7c3a115f6fe9fabe9a0ac3729d665621e0a1ef5026c41fb65f328914b84a6228cc3491dc07a5cd5f0b6c6a9373b1aa6f4a51f1bd370b74a2827f1773fe31501", + "bd114507fae6943f5adc330ce600b1bb8f67f72bb57f2975348f91e85a5e333440bb6cfbe0b692f63e6aa1e14ddbf62078adf5f6a620dad5b88659ac89485c5600", + "4a147ee3c96cb3563c1b06b251eb947f18ebd45c13d5121745cb0c2676a1dac47e41569699501664495527228cb5d5227e77262a6fee592c2e39d4d076ba736600", + "869de9726a35885a2e1542d059e38637f07a1f7a748f85e248b10a21321fb7a90c895931eedb897d99608115cb3e95e5f3464402099b451b14ccda964585abec00", + "e04d0d2574924c2e42c0402a8586463c68f0c9817c2eab2b0ae12d7614602e5f51a1e3ca41dbed052456c8efe96101c6176af9ef79b785351623b53c8028b2e401", + "d8b3678390136043eb595c3440e891d217024abbe8bcbf8fe359bef38282298b7b3250ca4fd74036386a480529d24bd23facf4b109bc565c61c47ad3515c3d5901", + "77e465dcfb285aee33e2c07ffd22e0cbe66123fdb6d83139f26b2eb5a151e6cc3df0614f9a4687207877f573c9a776bbe8e8582ec76264e68cba2e23db6f866300" + ] + }, + { + "address": "sQsVTtmRVSBQvXB66Li2HmZFqxjJNt174d", + "secret": "dda8c4aed2d9dd515df72e4a31c3fd05815f7ed3b2f2b2e203d12f7fc48f90ef", + "public": "020dedd0243219fec27920385309b31ea68d3418df5cba597bbba0dc794fff11f8", + "signatures": [ + "9e6b99596d5fa55c07c9daaa893ff65cd713aeb723337996c51e3a42b13bf76e04090eaa3365a5d6297065e229e21315b60e14411ad660d8a74a4c1e2ff4dc9901", + "320954de1ac17b54446863320f55e18ecbf4dd65bab9288d18f25ec163762b42132ff562af17f2b8f2c759f96b2dbe0f4642376c8e8b64164f3ee323dc26bcaf00", + "00e678398b522707f33435ad16714372447cc0dfb0857f744d86fe3cdae1f375235dd78bf6d07eb559b844971754f8199999105b76b0994501fa34c96333c4a400", + "8b8d6c37c63458744011eb7f181e9221029081910565fdb34e4e4ee70ae992df04f005ef1da8920bb820b124571093ae59b2b75e87c6de069c109c308d61314b00", + "45acf679d22c6727f187a2e2516599d1597e8ba0ec268918e2b0ccada99c85136cdecba2d94cf31137b612e87819fa2fd0efcca7aa85771c9ac9f13b00c74afa01", + "1f3b2ae803fb5605cc4d698c1787777d448eefe2deb2571975886c62bf1f83881543913b7182358d7457842be6937a3fbf142ae776180ee2a0488e568898240a00", + "19902fc27e1b56e81e2f98fb4f89b8f15a716c96dca83407917ed615674b77bf0cbf8f7de42fb19da7d40d7de49e8eed4d24d0e260c3421184688b1bdc07cca200", + "c40fb53834a3198829961133e3543d786ba2719b89a059022affd7f3820a38727523fa0dccbf645b492780af141c0ddbdb421fff18f8f97a15e2d7d18114d66c01", + "5c65768f4ccbce98584a050c845264a6a19233260e7d711c48ace814d0820c43681f2d175722518df44cd135c759f54082c9eb866c967892df43875156a9420701", + "5c91737f504558b000539d368aba1c5ea62d4b5346ecac64ffcd2b5ef820b01675a58703e39a55889d1128f678f0ee13ba0170b11fdd6a02eeab87f5485eb79901" + ] + }, + { + "address": "HAZJiBg33BdkdW3RLqg6CmUe9rTyjobvfM", + "secret": "2d046d99674e756338789b24c04cbbd0c022c06482f7592a19dab3d8da473135", + "public": "03c5784476d10e4110236c60af26f085d3f7bebcfae0a2cc06ddc95e8dfe01da4c", + "signatures": [ + "7ac208a7d530b1b5777b6416ca89d52e3fd4047d488cfc043dbf655cdbf535c55ae6234531e652376dc034ed3620b64fc7182a4e712569d07f4bfffda421cdff01", + "c8c0f9e69ff25a3a79fcd78efacdba7255fe22e69907fbb23164c6dacf74f0da013213ab8b072dcb11429e4de0d8a5080063b09a613fdd5ecad1028374c3a0e100", + "519ec555c35fd5669e00aab7c8a6d244361f11934b154e026194485d456c019e69eba81ccd983a62ca529ca3203e3a1e8d98e09c5b38044f1e47628f8e6deed000", + "ee211016b58172b2b28cbf34e501484126ac1f49ee1b89d8c2d4f03bdce628382e07f7f7f1fce3ea0b24e413452660a061377f8df4161fba404c48c07f96529a01", + "333d5e802b0b72c72c6bd615521cb3b557cd4ee15a58134e18c7305bb9f909223c4ef26dc3fc26c63a064f88cd1ed77c2a7bcf9a9f530fe7080ce102032b680d00", + "c251824690e71e8766f8896aa79b37054be3e0c981836a664066adde3cee3e482c240364fdcd5cb1398c7af02671f4a999a6ae5313db94f7c13a97b3b4a1b72100", + "2e674b3e7a2988f2d1cd6ea8440a13f78bc9a0dd948c1cb6b2ebc89b766af4531b31de154016462426d7b3594ac2283214d6f5f7cffdeab426fb83ac9f91882f01", + "0d923ce2a834ec22daa222c5997d439406be1e41b1ce8e10110568fceea3b64a2f8b4ca395d2b7be1d1eea8c47845e683ad9c5d26e1f58fb639c07ed8476e60600", + "ced0ca11d628b4f1eeda80ae34c312aa5140c65b781cb7848952bebf3a66c926424f8fa8b605c1542261a088290ca4e2854567be62620fc6920fea5b3d8a1d2501", + "0a83eccbd0c8df9b0f8ad166d892b84d85b2861d945539b124f657400d52c8261db09b5eea6d03e181d38af344c49e3f6356444bc7bb2a93c7662666daf0c2ff01" + ] + }, + { + "address": "KAU6CLysbrc41MdFKHNioXsJNcFQTLZSWV", + "secret": "fd2de4b3e1284eee8ec5884d92ae5841bef651fa324b001bbf99b7a96a4ee232", + "public": "032548366a5a732e4b389f8fa5d8c0e5debe5be166de2b557fd58dc78d1693de2d", + "signatures": [ + "fd3b22598a78353042190783d3410bf0bccab1331a4e167a2f60057a5511a4425953fe8b7d7099b96f711eec98078ab44c14c4638a8055f750f79384cd5c9e2b00", + "7b6157888227e72af6d22f2964ae61a8d3dc12fc72396b5302e65d2bdfa0e54e13128e531490afe48a7b75e31461587f67f741fd78cb6b15b4da8d8b12fd44e000", + "41b4944313bbb5414956049204dc8cccb782c664cc990e31447904ee317ae75655df2780d60aee06d80a99d6cde3731024d364238cf48ece1129b9f6d9e5e6cd01", + "aa892a1e3becba91b7d2ae3aeb04309e6be4221bc972100fce3f275e6982b8b2124e21016d5edcf8d533b5dc25ccab9656927fa03d6428c4ae8c8fc01be830ef01", + "b7757db90ae36a75c0730786e121567715dfef02f0fde002c56fce4282fae3f1386007b9d6889550e26d756cdf9b22e29614e9ca8325f285e9d19737a8fd768601", + "12a0c556c743f4e10cf60d8e25cf19520b2c83ff10aa508000f9153c38c7b00f4a13bc9c453d6037ad048e3cd4484fbba37ed072698dce7dbdf8a6a153bd1b7801", + "7eba52f7fa4a007f022cefde6a293ba46166420552b06855b34419392a8e906b10005884da94e87f677183f622c0de3066a5e73e1e512107892c967fc71094de00", + "602b4fdd642fbe5630e36c80409db56bf49c672080dfacca681933d086cac6184fec501ffec1e53a0695e06fda2781e33c44f601b2047c2c9392a16f195ff3c701", + "4f09c6bfb9a839e67c39ea1b44ddb21fb4c25808b9d72e8eb2a0667c9b79464d4f2b74908d3c0307eac43bc648467cc5ff3efbb3b500d5f2d110dbac977a18b601", + "f7635143e6d3dc5ffc4918944a4dbd783c7fffced7b8db8c243677af745750b72101ba863d037c27c862a02acabcd897850f34f3b4e7c649de784c937391332c01" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0008.golden b/src/cipher/testsuite/testdata/seed-0008.golden new file mode 100755 index 0000000..0feb035 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0008.golden @@ -0,0 +1,175 @@ +{ + "seed": "c2xpY2UgZGVtYW5kIGR1dHkgZm9sZCBob25leSByb3lhbCBvcHRpb24gZnVlbCBmb2FtIGdob3N0IHRvb2wgd2VsY29tZQ==", + "keys": [ + { + "address": "2hBixkyUneVyeWK8HXr9S5wTuHPPjLQfVNk", + "secret": "a4196da38de61394985555f95c8cb063b055f11a654806d1bc9000ca65fd48b8", + "public": "026a7c59d51fd0412c7964e85d428e8e7f462596bf55b6e92fb42dda47523fda13", + "signatures": [ + "2d324fb86d84dce6babbab85615e3fa8fcf40db5265eb12c7d2177463d414f4074f46bfea5af54d9a1e4718d6a3854ad3dd0c07218f7b337b0451677ea1f553a00", + "6eb90b199fb3777ea55a938d99eb0aa5660000bc12945cd7500bc3e465e00fee5eb0779fe7f83d04858928376bbe74faef7b10477fdb78247f5e5f45318d5d4000", + "32e36ef19c712fdd1080090d5231e8c1a756161b26da3d55c8fd86994d66d8c07ce4f774fd2e05d75ffcf9ba6a38396ea58774e6db1d8858232cb1be6a394d8901", + "9cd97b11b5fefde1a0418d6b52436c6cac206e79ebe124053bf365e5d9ed9db042a9b0fe513c3cfaf790af1bc5711b45ccc5ed0724c44e33eec62ab3bc460e4800", + "00b53304db9b47062c92c91a392e104e51cb91ece9426434f32fff31ea1fbddb5324cd9906564c603c8a36ae54f19748a281474ecc8ec788677dc15f3c5ddc1b01", + "41d8e48ebc1a724a242024ef1a2121077cff8f2bd78f27893ebbc14442854f3036094b99ab8f8c7c662005cb32b3bad03858a9d47a8d8eec0c0829d06f37d31b00", + "eaa1f2b114c70d7a04c9eda7892c615ff33b4f0f05e2e9b8b28bc0f5672c04d95f84f284912bf8222b80ce237294c163ee2ee928f0400b1602979de890b8330d01", + "3b4586cc527ab41c6c65383dee57a12000a2f3df181cfbad65511a6203666640681286b23cf890e72405023ed282d67c060433b93a0601e2c0014e7deaa1b92100", + "05ddb5df8ad91c32b933a1fe8c0ae217287f51494635f5dc46f3b8c0c58ed8e54b0f1a522ebef697d41bb7a776702fd7f81710db217346f372acf2140a0a0b7200", + "9fa9c7e922a89fe3f9beb528fc030b9ef53284144e92b95a13cfd19bce14dd9f19d5407a8c4273b6c17fd61c73178b7af32c8c217f00a131f3625cd145c08acf00" + ] + }, + { + "address": "2X1uf2u1LK2S8CC8e3VWGVLjiVhHGkPyB51", + "secret": "46d449a4e9edcfd54dc0d21d75797421a3f0aaf6363b4fa489e3889a8dcb34d5", + "public": "03c164e6e935c29b4a93ba87cbcdabc49b8639bdc69f1e89dcffc026dfac7393c8", + "signatures": [ + "2bb7fae7a294a511468194fcbe2000cc7d4e3da84dba19226f89f446c9cd67853a1d6b9519354c9de307f10d9a375aa4f2af3601de56312b087a15317f40938001", + "b84ecbc6f15a0e377bc74efa502029ac87b55bc3d3ffc79867c41c909d34b7112ea1353b9da4024eb3f083bbbc04214f5332cb2d4d25bfb4b47ae0f95515ef9c01", + "1c9a32563e107c5d225dad141db80175d92997dd44ac7b1d0f6c2b0c5fba018373276221bf930f508ffe429ab0efd1a88cf54449d26992cb392983f0f7785dd800", + "df150b6b76ce86e688e3817fc10d16aac4da2e5723ce75181254269175e491a613e7d69f892d718d10fd5a8abc54fc266c731b33f77599c0a30b9186d6cf8dbd00", + "e869020afcdbcc8c07ee6dd356f83daa1aa5522aa3c2d9a0627c76e4745f0d0f4e3593a69a6a22ad3e5ddf7759b6d9ffa36f0c081f5462cb1cc76765da12e50600", + "3ab42e19889ca8527bc75dd3a320ffc7602371ae754c28cc61d2ad986268ab62790a940a0f9a9e7a9c1b32c0f98fd2c52c55171fb7de8f5b4f339997df46e76800", + "20a89d2aa6ebc277ad374e1ba8a8cb54bba5da83f4b0b786d71f7118c87bc73e680641af294c70a4bd5c6d837a8ae373a272e56e1ef6879ef2868c0d40f67a3e01", + "7a12400e7ba39600a1b2dfd9da749b34eff25246c83ecdea065cdf5f1df5046937cfeeab9c9096c678ad27b96ceaeca81e6cd20c00d23b7aabcaa13143649fdf00", + "389b8fab74bd3c02c51029543663f8930e3b37aba3ae08264761ec8cd77fbcbc24fa5bf47482ff4db62ece7ce5c9f8554b685379256228e208f7d65a8e33c37c00", + "351ff96e4913784381de11fda7b52abb87d4b786add98e534d215236100f44922435e0f8e8a264d720a8b49b88307be2a098c0614610a216dbe8862f5e51d4cb01" + ] + }, + { + "address": "nTsFenEp3j6vda1f5uRe4d8H7ZEXQkHEZ3", + "secret": "c7bee90a73f6cffb9abcb920ee497fe7522fff3ec46b35cae5f07bf3fb0490a2", + "public": "037d3dfc78dfa302b464ef903a085fddf94251587290d965754d8530be02322743", + "signatures": [ + "8869ee2ff57bb97475d007f70279f9e3b81193259e64e2bed77957e8f6cdfcbb4ab2501d617c5ca2d1dc89233817a0b91f5a8a2d23aae07354d5ebbe97a3dd9c00", + "10af988a9c826232bafc857dbdde32c76cd6532d0213f101d4afa3994da15a261210b9ae7b69273b538fb6c3deb17cd53113f3b1cb01ac9e8604d209cc78cab900", + "6e858a10f3ddf96b2fd8d49806dca2dcb0745979e288c8a4a913e7bf6c722a531d285d2f081164d414af64bfa8ef6c8c9928ed7d25cce9bb28a698582802fa0d00", + "3b1ae90d38869d522cc70e6d4a51063bab5eceaef100cba3190c15dd63681067700cf336565409075b825e4031112e1eb0bcd209a7a0f5a99eae804b9599104601", + "4bd286c40792b96bf0d1588be470b96d2fd2e4ad7ec3d48e81fc129a95274b9b5ac15138902cab4112730ab83767dbd9845fb3157dfc89131a5e4f36fa63fc0f01", + "1270a0b3f00f41e1f10eb53fdcb5de369585bd95a0900231c7e7f03c2b0cec942adae9e17a043774bec2e40d36fa15e4c9adfb9133cb8ede06d07f840137c57601", + "8a12e03ae27a954c4f8e865fa6428ef4806c40391015962d9ed151a9cfe3a87274a3b1095b76e47aa72e01512bf5d412caca5e336c198f82db668bea7abc452f01", + "1ee1f0fcac14db2ce6203065e58f80fd7e518a56904dba875928baac48abf454513225dd572c9d3c28c11580a7b480dd8c34c24baa2a895ee5b61b0613ba507300", + "d0bd8fbb858f52de5f38029c5251941a0a2cfdf3cfaf8da684db747b4470f6943fe545e9c31a8666546d5d1b67399fa013394418f638de3fdb54d93d68347d2c00", + "cc8842288635cecfcf885db9863a870674d37285a795a326ea11ce93aff2aef0372e06054831dd776cf0d986e7e01a05070a2572bb7926635fe153a464e64e3400" + ] + }, + { + "address": "2Zj9ehnjn7c2P9AcoxbvQPBiX72yjHEJaPb", + "secret": "8727e233f4165d2cf3805052e9df916b81a19d2e859c48e15576fba347d4123b", + "public": "03ec84a0cebc8c690f106fde7df91b86f7b7dd2bd6bbc15d19b6813d11bf523113", + "signatures": [ + "d878d051562f5872f20cf27067b54b677a7ed2ab44e4b88791933369e632993244d88b54060d3253e60afaffc30d8f89b6de5fedba6c90dad01ab9680ad2796a00", + "fb2f87e024946cbdeb11fca226d0efcbdb7d5c27e24b260bb1f6184bdb6446881917d5ab8e0f780fffa13b9459c6e751de391b3d7f1c61938736f8df5550534401", + "3d6b8527fb2b455a6d8565bef090728d3e0ba88b5f1a0599d296d21f268763120ab02a9f3521a96c4e93ad369080db860f6c00da586e91664e5cc410d9b6e99b00", + "baf8d8164e225bcef8a8ded4d54980af405fb6ff28281a16f64586f78a1a0d82670cdf6195f9ae7bc2a7ae9d9f5e32f81e5e6623e239005f4db8cf84ba85c10200", + "90f5ed24882e6e7dfd4eea059e3ac3d2414fb9d1cf7f58156be9e194c1d35e1b44b063a7c81c595d7e818ac6b28aa4aabfc9d8dab2d9c34310d6432dbbc5907101", + "cac8341488306402682b33e723ace25e45f599520753b65f0744cdaa64b14069255126d9d7ad18e219794165f6b723c500e72195ac535a554092444b0c9ebe6000", + "e8e3a8a6937abe48b730de30c5f486f9dc583f7054315c8c96c51e54be8a76772b476fea0543d6f825aa02fb8fb6b7b4c9350bb33889b16eb968fcfc3a64678500", + "cfd8a7cda65e598602bb91d522bb328a3a273b803b6e0e209019987487b1de7a52a87fbce1a87df47756a94ce97e3c51d6f4e66703f2c4893ab11304c407e56001", + "206e31703569b50ac2b2fe0d7d128dc53200a7f84ae74c0cd5153271e9d9d4367a9ad4d7c6b19236b836394ac40a1723468f96a35f4e813d4dc499f50feec2d300", + "7235cdbf150eaf66951644d4fc07226997c313c33eeb171f0bffc5548223317a2c6d933f970656babddba290e044a03d880eb5cb2d77d3036c3f925dd9b7a46201" + ] + }, + { + "address": "4DueLL7QCMVrwsbR5ydfJ9pnR8vahYytBz", + "secret": "ae81bed68945bf50c190e743deb49273168569001e452be70725e1d4844594b4", + "public": "0295546a4287fb64ae8077ac4b8ea13768122654901492f3920541d76bd2b7acc4", + "signatures": [ + "bdbb583965e1281daa47dc4010c30251dfd30473e44348dd9111d517117f5d4b56c6ed8d137e0eb0e68634e196266c0c8de51d5250549a760c46d1198ca7795a00", + "be84724248bfbe549ec32ba7c06ab7d40f0671248b349e9b4587a248a2459cc31f0fcceb2da8a5d5715dbcd9ac92082029bec9ebef4c00a59f18a5fbecd81ab000", + "c215694fddc95dbf210c4e6291ffec12c2dc431583159efbb0ea0edec08549cd27ba5a682b07fb1cc97e6ad92cc8c41fb6755ec2fda6edae10c575f93a0b761901", + "b23e9e76c81ee93e6a27e984bff91cd9546282cc55c8c8bc06502715484fe0610692f71015579110c1f96609550e7d4b0c30ea8fe291c80c73e65915b97644ea01", + "d0e910ee5328f38fb8283e87e7e64c38a99b2cf0e3ec5da096b032d77ec7be814a110c66b1e13632ff373b56c5a307d013d636aaceefa92f9683f71ce4c7478901", + "021a0670aabb167b9e7f184501247b031cc34492e2f22565b3173aa7091ac49f64c8f2535cfa4855ebf8e4ee1e522cfc6242ee87cb75cca29623269a954f465701", + "aa9c6f5a2ade42fe2f520115508c9182fa9652880511027190d26ee56ef088134d7689ceb3dd7a1c6350b8a49817759ec15b9d3ab7f0514ad51446902b41fc2e00", + "14182c66e730a7a8c22746abbb683d2f65a4492ed644e835aa376d81d848edcb229b813c89ce41bed07b4114b7d8b558a7b53132065bdd9769c228d195a204fd00", + "4036bd33c3b8e0aeded4275d0d5928c71e808350ef1c6926987c5377cc48395870169fb2987db63a5641080a2037e9fe5881b8e38e493063727d31327d04952d00", + "8434cec2a8c8ec3daa591a4b2cfe87426b4b71d0ae5397225ff39ad01c5fe15e209ca7e4de4056a64f043b73b622ccf4d2b3d27f362cf7d7fe932c5f110d986a01" + ] + }, + { + "address": "2XUMdVGXbHaBmFBiYcfwssY5vXnQTav3BP5", + "secret": "312483999efe5e2a416a5300c9ada328cd422b8eb81d348aef76b1ab254ffa31", + "public": "028992d0ba3ec0cd066223a35fc6221c89433e373836e42ab820909dae2a7649c1", + "signatures": [ + "da51c05e697d2eca9f130713c958e0517d17a8ff829f6e6e7df581c74954b1b75d475bcbe3e96fa64048fd89cd4f5abb418efdc780ae1fd44553f9980ded225800", + "d77d1bb5711b9f08dfcf7f5cc69aa3883c34b5a38dfe428aa705ee2190c2ef6c4a1572e07348616f57f1a6133161136278c39a16a421039c1ccf6de16a02431500", + "6cef8f2474eb973aedcd8e86fbf82de5245db429408e8161343d681440c08a0730fb6f80fd42ba3f10a74a784b18e3cf7c36a2cf89bae3446f0348904527d55400", + "296ca1df8fa846a321f4ca49b76e06e2b8712bd4a7276f0651c38ef1aab9af265c411d0a76dc499073e7be7b60033db5cf2dd85858311c17dd9fb7582a954a7f01", + "3528f0101c5dc155c9d68580ab804e424a6bf81ea85bdd3864ae6eb347960aab33b20a3d4ac2763a2bb50de1b5cf11362086a5659e5859c7d6aa2d64d6a489e501", + "3c18a53e7f1a1d627435f685d3dfd4b7ae2c40ab4b43de1c559b5f8dea6c44a358fa73f0fe004fc42c1f660b711215e477a3752dcebad0af01a4d86b7b3cc91800", + "7a5d1227d136933f935dcac3198ffd462d00fa9e91d76d071d69331cdeaa98a33ca61def907610fc121daaa9d552f872090adb31d25f60023c9dba8d422c335c00", + "a3738eec0537aba0fcbc71627f588452b7401e5892939aba2119e1b063902da55fd912777e1d2bcc61944f77236efd2d7a84f3817b1a996a320f71fbbc7dc0c000", + "3afed1e7749b9bd23a97a55bf9e6aa9f9533151ffb731afa52455a00ec9f1aa9575369c0ce426d64830a6bfa708218ebd337728b914297002db298f10cba9b3e00", + "b0886b57153458794497fff860c70955b7ea80146ef30e413300527f547798e3775bd769893bec65c7cea503d4fd8703e08b6aef736027ba2feb06315f9b2b4000" + ] + }, + { + "address": "2f1gvQUSUucGZ1xtNcqDb2QqT8mR2YtJF2r", + "secret": "435d065f46be884edaf18ef9371ae6b9723e0931a45551447826368b3b1472be", + "public": "03dc267f778651a06be4b14f2a47063aacca922a218a1f984f224a8ec55f6b8da9", + "signatures": [ + "2c7ab60525daea6fd2bd2a2944d3f7ac62443f2c5f3ca4dea2252a7bc6d7a7520cf8e0e0e29167cdca142e1c6106b0f723d9caeaf181bb7ba7be3d3dd049053000", + "49dee8cb5efabb28ab2bd248482d913a7de2bce830637728e6926ca6f9607a8436eecb06aadbec7eb8fc49064a73d48de1215d2541e196f450a870565dd8562100", + "1ababc8f886af10ae76d167a93c6a6d5049c7d2b72257c6d51fb0242fb2d13a027b92c76463e3981489e665b7bff2707c577d960cadd5b392aad117f13e1218500", + "8461a17909adf7e7ba21ba08f9a351e3f059cce7b81458121e432a1b07c2353e46c874dce95d02adfa1cbdd723785eecabe93c3a65ac732e497a6a0adfc0350c00", + "3e458d37cd58a426d176f2e3acf123880f44607db8805f5cefd4c438c4eb1ed779eb69fd65dbba39d91cbefc9f54eebe9322aff7c8989f506cd1bd74a05fd66700", + "6658d5242d1fb860d4de1d54cbb6290893990a84bb139a9b79c50c20fa8f5add37af3552601645ac8fe35ad5790ebfd8fcf8b371b9f862e67e48b929bbba3f1800", + "71b2930f5e1b703e90d328f65164673a26558a3126ead81d61807354d59cf91e622d19725c201ec16fbc621feb5679957bf710fb5d54935673e8cadc4e25be1001", + "cc4c1e0fdd2301539ec0ace1eff47807af38c26c20c0b7304abfa75346472ccb38dedab61733895911e37591b35eae5be7daa554f22e75baec3f5b9b158d758900", + "5cac030ff5bb66bb091a86693a2d972540cfb61bd79869a866124dffb515f50907f7c90e99e09c04c3bdf18b7aeb5a82d5d9d983e2993c01a75571a335c8852101", + "9758a5917b51e9989f476eb9fa051a32d2ecf19ad6ddbc2aefb81ba95c16e52d3dc528db27b34ea150344458490d58868e5ca493b8ad4cf21dc356e776d0d54c01" + ] + }, + { + "address": "2QnMSr9PedSgf84NreugQJaxnaGJLHY9axQ", + "secret": "9e3b1370323a9aeb7ef6872489f3e33a0349235854464d656ce4b0dc00ea56be", + "public": "0255538dfa3b6c02635b667704512bfc4c3d33c48dc878d8576076e530382f34e8", + "signatures": [ + "9e40e30eb9ad0d99b592a148ba1066542651e04e90bfc30bdd98c258754ef77d500d11f51ec5eefa4a1be570d12cfc580bc55793fe430e75e31676f9b2c1bef901", + "0f19610905349de8673a6c9ed78158a899f6fd25a37efd22b9657af5b51026246669112914c6d203364456d8c1ae06d5767bc12ee51e91608bbf8b54ebf2ae2300", + "14dd6d4ebad35dff18c60df85ceefa17a03a9e0c5e2c004cc0ecd29ca8096e716333d8e24a32d0ab3cd74ac7fe917e4ebad00828c27093b6dd26eea20f0def4801", + "ca337390ff73808c302904675b4f954b6d4be500ed1cbbe1536693f3ed185edc5973e64764773763408d366d7dc80c209fb3cb323300bed542c359686548046a01", + "5bd597d9019853d5d13f89d55fdffe6a12e1f1969e786ce52aef28df44da1b04595b497136dda48e5eeca2b19741d3851c08d51b18a994f55e1c45bbadfe9d8a01", + "90d711499247f36f3280b09bb6fb9d1a9e89ac3b055bb59bead4c08945d2f9de59f0d6840314ca4641d39a80d9ebdcfc6cabc603db53cef6fd12240c576c7f0400", + "9f742e202407c4fc7462278dc4b8382ed34161faca80f3015861b8cc9cf9b1256d7017777e2fc68eeaf913725dfea2af2cdcdac76f88415dbcd2f6e65b9ef98001", + "20fd3fb2c83a63f69a7fc021d8cad22bbf9516f4b1f4053d4e032d5089d644c638eab2fdd8cbd9a7e5e2d797cfcfe6426aee8bb570c6799eef48a84fb333e24a01", + "0f4135937cde24fb32c92be875d39022920e04d76f0a99e60328556570b2250b69df184f9ea803c9cb720d441139d3369e29a4ce53252d7b71b015303d6cf22b00", + "2cea41e7728facd686876fc173ec9f3b82e243db23d284394b46ac929c254e564a58772ffc1cd1ff1940d0dc5ad7969f134471ab408acea0116c1bf2346befcc01" + ] + }, + { + "address": "Zi6vjiuB86UidJSxPnRnLuoQKNqbhKDTQX", + "secret": "a7d72f9c41978b79e61dcb6de20d05d31850bbbd5defe2e594262157292eba49", + "public": "02f947801d035fb531c1859be4045d3d6f54d4df41927277a42040c25ace724972", + "signatures": [ + "34e7d96043aaedc7b18d19a44934e9a59695bf5cb2b8ce04e845b6d5547103f046150acb03a3d08dceee0648a96d0877b7747d07d609b5bc2738eed78406571101", + "9eec6edabe7cc6c38a3c8f731aa310683f5b1b5b7f18ff597ce1cc85b69316226bdb6a853054bd0e0b07f7b6e95a14c1b331ceb47c42c7de0f64978e23c3f89401", + "024c006a48beefc070dbda72b0335726bc875143330cd5a5063b5d36bf81bfa971cf8b5bd8b0a097f9ce85b5e1e32d3516b9dc7fc18b2d07f967d2a0a85404e800", + "fae32316c3926889b4a6c351e32865c5f619e84678db65eeb9a8b97b2aa60859246e416af3844a9a8d036fc95cd583ff6d194424fdaab1a75d6302bec4d5fe2101", + "c8e1782059a35a98d0dc23ddc45a29e6ee37855e7ffc3a2db02ba548be82943d4c01190bcb22d8bde6a18545428022a5cae17efe9b1b59bcb054190016be55f800", + "67437425c618bc99fc2b111ac534a8337db17b07f05c2dc0c8699809de0c69ac5201bd0ce83d4af61df6597f0aa819c66c859b3fdf07e12739494e942dcac83901", + "7df6c5bda9dcef9a81ea470d1cf0a6c465220ff8cdc9a549021e02fa1dfbf2aa16f2434d181db5ac44ef949b0447bb56ce0ab2cf43e0ee6c7f4835267c12d48401", + "a55b5663ec5c53f034f45c199ca720198e272d25012444d6ed1e2c8dc312223a084126d0b7b0cb0dd9753fc68d3a1c3daf625203756c6c92a924aeed718680e600", + "c3a346976e04f54d750dd830fdea864495e3ae80e1a3995e5b7852db907cac1f454d95532fb7c536daf11003987065fc835414b1a19cfdd9d08f4332ae1e691901", + "53022befceb0a4f6de14ee1a6f287e75413614f4df77b0ce4c1a1e8d85f8947e7ecc9ede42ba82ee06f06b4a6dc70a25cc12fe9ecc6f1c4e31350980140144f701" + ] + }, + { + "address": "2EVQ1xmJ6A4iHeZXRtD7DawoBoxX1vRmBxq", + "secret": "04ccdc4fb9e5d77140a5ab7710b4993f9accbca372d142e358301f1bf096e05c", + "public": "03fc5a8249345fbf2b876f4d0234efec9e88b6a9b3a6ea3fdaede839f0520cd2bf", + "signatures": [ + "a47efd9e820c974dd9107bbed207f6324c042a21ff0d41e323f799974ea963282fe800b1f1067d8c7753b3e666dfff01f2bb6516121fd1cc3afdb5ed2d45ffa701", + "39b2a9098ed07c55e1492ac28673dfde7a9fb683bbc5c9ce62079c7abae343764dfe618112bbcd5805226e9a45a98f8efac840d38ae4db420fdc13e6dc9f05a800", + "a7934bb9e039f1ebda681cc87c833c7158666a9cabcfde5ed95aad53f1fb529733daa506e7f65845e4a5c7891ae059d62a52885010a4113d844df2d03acd17ed01", + "d8dd518bbf0d921954a840ca9326f9eef5b17eb00e4c158c03b298426f682a55077685305337e06a1d5b0ed3d48be76e6a404eda1bbf4a0f58bd84ea0920a28b01", + "3787c025ec0a21ef202b340770fb21d9c5204d969feceaa7639316b0875f0a6875db7554b4cf67c476f32292d7415ff07eaf73d9922e2639890d15dac3fd2e0200", + "89dd0b2bef097e4a7da14f90bca131005084ed954434627ba3c9e904515120d309a0fe9ae64c5191eb483d07a294ac37be0d53153d511dcfe8a339b79db1572b00", + "b559569007407a5cca128d0a3153a8572d8e8d1c765913b23ea27036955962470abf538464d519fcfaa4caadf9322c3f0a1a432ca5d3f45bd993c6965f4e63d000", + "15ebb160d7813b01269fd09e07d62b27b1665d243ee1c1be913595bccc6fe3377b46e2f1ce0fe485a810bb98c988d70b9dcf3a377d99ebe664b88a2239ceeef800", + "1ec59aa97c2e40a0766bc470b0a2079c58f337a6c8eca1372696785446f77b1b42704bec74c429eb2a084a00e676d084b175323dd43022f99fe513c17625d0db00", + "ed37c8d62f87802a0cc8e2feaa56c9ce46681d07f31da88c958317e5616b1278043e6abb646407909ab2d7f8ea880a7d89e696052a9b01da573a967fb91f141301" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0009.golden b/src/cipher/testsuite/testdata/seed-0009.golden new file mode 100755 index 0000000..f619411 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0009.golden @@ -0,0 +1,175 @@ +{ + "seed": "vWqzW+tavumliuNymgNb1scvd3DxS3kEU9EznZRyjys=", + "keys": [ + { + "address": "dxJmhYz5CYqbxaurBDKndour8bKsX2BCg2", + "secret": "103bc41600c537a83751efc3b3375224ab5e50f062d5f679ba39a69676ddf4af", + "public": "028628228b9fa099df41f59a84685964e7b5b9aa2c2517027bc97163932d3f44e1", + "signatures": [ + "673112ab3fc33c8611b71baf4f5859b11f15775c619435285c076c77406ddd5b355ec1dc1091481ecea3ec23b05857fa5756842b19433cbd16edb98b276b4f3300", + "b884b685184fd7b18465d266e5c0aa3f715ef1ebdd2c510fd1d93985ed73700e07cd8967fb4bb41baac5dfb1b5acd43542368843571a8c2328c04ecd99480fc700", + "74ab28ea8eaa8abc10a60900da86209415f9c2da7c40c4dcae9c24f4a7577607264c1fa8abc18afbdf618726c5fa4088d074b22281419fa72042204da4d101f700", + "42e5c576f3c946efdf7433f68bf8bb08bdb9a4cd96b1df6ae21c1f977452565b144a0a3431d1fd01964c016a545f70581508ada70ed2d2e2471f61adb9fae9e200", + "d94e96c42e8206c754363103c1dab199ba324ca4a84382800cf95be2bb2fec4a641352aac50919a636cf60e21f6124b0898096b2537737e132b3a591a73631de01", + "462dcbfca20d8db7933e5ce611bbeaf3445be562df729e7110fb262651efb8512186b6b19902894c2ee0dd2749612c839976b6ba56b42d091357b9f63f40400800", + "1a7f718160e4ebc415679c176b4266582cdb59d0d3cc6d5844375604313513356663f148e0813fe02a6b4e657c76cb2fd5095a78048c639e431def9a0ea1f36e01", + "0c94e5e5dfe0ce864cfbf722ebe2e567f7b3b0303eae438f1a8fae2c232b8f95344ff2b43c1c5473942eda7e2c292b11c99bba70281964ff03105a1b916155f601", + "ee890cc57362d5adfb7e664671a4073c5d126b5da52835089916e45f5ee71cb227bae34bfa070ad0920bd9106fd0bad517bd7346cd85d7042a2ba88c029eef2e00", + "0199f28e2f9497c17c59e31c863984d7d4848720c9c151b6334e2c56dee15fcf2d642e073bfb728498342d9f19ea1dc6f9a4e8af31056e850405a5009be6f6c701" + ] + }, + { + "address": "wWfAkC5DRKmBesD3ycyZPLA9WUC5hKBY8J", + "secret": "ec68100218702342e62a0138e49fecf0281e97214f224f3ab2591be5094764e9", + "public": "020c1e5d0e449141cd10910c9ae064d878537bcf7a617e6f694a9f377a6528b96b", + "signatures": [ + "74dd33ff9586150eb0a6566e31da608be6cd9519c0a373a10794a3f2b0415ffa2f0b4304e895b4d9c7a6a1bbcbd0e4557800732ecf39239c193e27738f432fdf01", + "d23c6e62b777c96c1e21091fea380733c223bd68811c7bad12fcbf9a159b84992c7b011e4152d0339bbdc4ead5de4aa1a288997ef3a5ad0bdaaf79653077df7900", + "237df8d524e32e90b2e2e009b0defe40769fb341147191b2ba45aa277aadf81068fe8f206ef713e674ebaea775385b053c85be37dc2490c0c4f736a7a1feaa8301", + "83157989273570d30d0221ccff0497c8e9837d728fee2adf2b3142e8f04cef2943410fff868ec9c7e68602e083420b29706d3926c2d397e1e1587c31a60c9a3501", + "34212857e85e5dd71748f02f77941550164b4702dc55cfc835a22cb99e30ece054c53f43a3bddf4ce800bb2aecb2ecc87137acd3ca8a269af9763bc3abfed62e00", + "5348dd18e2bbc319860ddbe3b5ef9627447718252a189ea5957982acf54f0c3d4d6bc9d191cc6cf454281cb74fbdc9e05971b712119bd39332d94a4d03340d2d00", + "14f7d8da4fd890f6bdeb978a389a65d954a82037f1a59a3c22a952d1a6071a5601c460f31a6cdd5b9749412d44b8399068c9605b18c9677ab89ee3d92fb74a1200", + "4cbbb3a086dbae9049670ee8b55e31ab36fc012ab22674b4f036091bb511011a5ab11e3500a47f09b0187a407cbbbcaa3b8addd885b6b0639278903bd2d64a7b01", + "c8db912171497d49570aa43ccb6a5984f25fef8f44dcfe6edf4fae6e737082ec03d531e0f77057b47dbc5e50af5b67b74fb8915fa802f21e63c1db9125ce579300", + "d13cfe83aa0faffd130cede0acd5c6066c333474e7f2a059be3e3c27c081620d6f5fb985f4f595377332abdad3de0e27db9ccff7dbb24211b7375682c46f3d4601" + ] + }, + { + "address": "2NpdyMGSis7pKksyJdw2Lw9CkLxRXQ4mXfQ", + "secret": "e08ae8786cf4f17a7b6024143f7e99261b0f30f240b4a4eef241051f4b051c57", + "public": "03185a63e2d55ae868e815e5ccec398ad955f5ddf8f7f5878843810d22a95d8749", + "signatures": [ + "5d97d0bb03d8eff8cd742665a59e6cc7bee75c809f46396b607613e5e6bca6a84aa089f7cd8f53b18d6bc3068493ac1077da6f818bd65e18457d5b457549b9a501", + "66db0f30c1e6ede54bb6f70fff659935ac180bf41d62b2f3a649d8821d90e9f9452393d0ef245a4b9070a3e7a93b05fe3933ec5bfd3042ea3a644e77816e57a900", + "4dcd8b7df6aa6fddb60c9ae6781426d09f43b3f72bbc8c6e2f80e2f052bb29fb68d0541edf0bd7fc58b468850110fb3209742c3a1e4cbd0fa385adc55d76bf2301", + "b64aa7147d42e3e67617f21b5f49d0ce03dd5ff677efe922a57d783f438facb43d35df5d3f5bc6bf4418b12189bda65e791e837fab789f5765c58a4f3362758701", + "a61449bbae701565ec8b9101ffcb1e5cf8ccaf0148cc074649322d2ab07df14329b60562740b410dd042996d17f9fcf9bcf48eef01cf14439cfb7679ce49ace200", + "9ec3b65bd966d8d29037a74ecb0da1425a8bff15b82fb5aaa5ce85dfdc26a0c869d43b8073dc98d9871907908b13ed80997a11bf61724646d94525d0ca33185401", + "5764aa6b439d5eaa4ea629cc0bcd0d0bdfae933da8a4aa1beaf7ed8d6c751446784fbc57f0182c6f7bb13c33641dacfad3ca0065c1bad8c49690ba42abaf00ab01", + "1a48518590d1ad8fd92863486c10078b3c1703037cbea02e81ab17c41f52e8120b394db294c7ea4a4d8c9e5e735bd30c3a1574125e8005b80b2d429c4baa764b00", + "12e8b5c303a9d348bfbbfc7ccf5a74e9c1701482f95d818f51aefeff982e18ad0e25b86221553e6282be68cfe384ef7729cd716b3b66e48863fdebee137d2d8801", + "d9abcdf0970a1b8fd7721fd8bb7a6f2712cf331d04e300b7cb0a12caef919d2b335bef5436cb624cba1aa669df168840eb80e0f9f40c6ed180ac58fad922a4d601" + ] + }, + { + "address": "2YsC7EayfSJEMpH5tkFABZ7NxksBxUcRKFM", + "secret": "d609d3e43e182e23c9414e10427b1c8437d5de881836ae882819b4ccfd39ea03", + "public": "028158909c3c9e59135b6019738c31acba380d2d42cd07b3bc0e302fbfae9c3ed0", + "signatures": [ + "5de888e7d8889d800935e92430ef045b4b61896ff9b400edea6a9f184e56be5954ba6dd40388a43332cb2515553e227e936c3f39a40ae7fa254a37dfd478a89a00", + "9534f206b47c69377a9134a5a372817e68893181d5489f411a90ab47748e7fb621b840c0d2a857b7555f266611960c47814d3c9460c6f0ee33b688a7a95e0d8d01", + "fdb21218173ee37a35a864e6ee685b66ca3b3a62275499b5050ba9563203634f7f4ea6988aef0cd05b504e0a4f090a341d3cade4fc72876171a41d4a8e7900a001", + "c444d5d828e5d9551e6c85a0744655d75fdb35c90174557c442f6866130489a07f8d3e72ab8f1c4937b5b56174e83f1f0099fe8a90a2034a30ff33a58cd95b0a01", + "7b105ce2133aa4f330c7bcef90473b0433ffb8f15eff07533f31083d816a05c86e18e972ba8200db9c173eaccd57658d29e541805c467642b7c71fa3dcfa9e6d00", + "6c83b4cfaad9fe84e9fb6221c96f3e3f7a8a570d912df042c17f01877fcbc5755b52aacf432a0655461446c25ebb6668828f2c93930dc0c25cd0625204fc6f7401", + "a524aef799f60bda7106f53f7be4f6dfa23c650f0183fb6c8c7945f7a1091db10b569cf203541516404853c6f84b0c903015bc1ea4b84689f76503af90819fc801", + "64e06be4685c5f44276114ee82eadd0ac0fd2dc32e06695aea6b9bb1c4f539bf13a1dbcef6083d764d8fa1246ce72888fb242e5e2e2fd40708a1101f078f568400", + "0405169edaf9044e0730ebfadf22bdba6d29433227626eb1183b4e1fad384bee129c911097fd5b5996a045a39b75fae33f20d6610f3c160ba6c9f7fa61afddad01", + "3a4d6eac4ae0c420a2b07539deea5b9703816b8f1c63ee015e9300a89192035e4a6bfdc1c0764268b36f545ba40dc69b0de024fb89b367f74f0582c49991f1bc00" + ] + }, + { + "address": "VWBgiD8Bm82C5scBT7ouJXUdCt5WYBmwid", + "secret": "cd6cac0f13566084bff6d1415a6cf5b481d1180dff8041f4b0cbbc3ad9c45575", + "public": "02db0ddcb741d0ea2e05d2e299a09d063456dc3370cb8ba32adbcbd5f2de195d55", + "signatures": [ + "01b8d8773c41c67426921f5668f6327f3a678119f207fbbb3ea88031fbc3928a3b516ef61495997234e59ed5548b5ed94f59f988e3de4d12f57bbfdecf2ba00000", + "1832e3ef1aa54595cfce5706271449f00f634ddf07a124673027e65bedfa3751377dc647490148c8a753c8458824edeeb7a6a1dce149a49cd57f04d26cf775bd01", + "a32e7217378671d22ee640ad993cefe1cd7d35dcb8ec8c4946a202246b8ddc837e0933dc6246bf061115e7adf77b1ea7cee2e570da6afd263c4bee68061c7a2601", + "ea42d95fdb6dab4c5df0cbb87fa8f893724d26b1784b7e19eb799f1f8a5facc34eef7b929acb300c953864ff36dfebab0e4c069174217c8ef3cfef6587f5644600", + "a281a7e62930e0ac659ef9c372ad192cf86db5f35d71c656b72b03b9b439fc8d551bbcd58b8904f8653dc4fb3698774cebca153ea664040ce0184be627d31ab001", + "83c70b8c70db7fcb8da6887a6c0d575383ceae53c28f904a31ee69ce6106317a23e6c764a23b55118cc8d52bb621ee3f9782165580d98bf4b74f10ccdac5f2a700", + "42ded223b124824f156a96ec2a3b39a98daa76eb845e365c1238a38f7b49e663286b94e55dc245221d85345497f223d1dd81aecbdec5613efe4c4ca901a3c9ee01", + "c07eed52f2b0a550e57cba0175ec37fcb71aca4ed0fc37c4528a01117c6a52665196310f3b56b8439a156c33ee67a6108cca46b7b6081c5fad30be432f2f0e8701", + "04faaea1a63d8c3fb7174d21785afdae0e8520a4bfa9e5a82f4915be48cd4180158490d079fa2b7633d4082c8f1ab2a25a9ce4e99690b08cfe95ee60a92eff8d00", + "12826d3405affe5552bbe42b5e9f1ffcbdbfe3b88b537ca1c6d52a53fce068f5482f9c9026b8e72858506d9b8d1bec3b1cda36878ce979916382e880af7715e901" + ] + }, + { + "address": "6d9MoeBRrPUSW7C88QFe8T83GKxKfd2CY2", + "secret": "e7cba671232e76a905770b9dcfc280a0f47db8e37fd2e5cd32cf67d3d7e44c4f", + "public": "02ab3080b4ea8a74789ca7ba75577609de2961e01e583d8432f50e112ae1c6a7dc", + "signatures": [ + "0f15c8684f255ae234760053b193e2e3e799e0972f11aa7cd6ab62e29a4fba093d66356b08a0fc544a6c62c37b419e65982dacac87c445570a76cdfb3e981e2101", + "84e597668750e6c582ac72925d5f51c1ac43913f15472a13f45470d8e35ea6da6134b2d0fb356a6386a0d7bc95b4d35deeb8381d61e73ad852975e0c188364ec00", + "f2be4f437fb1a7f8e6ae876833d02a1b2407e29c393565f43cf28a6416cdc839593188c29d402479321d4cbfe92f0c70664bf19f550eba0c72c2e064727b93fc01", + "e8ea5937f15a16c93b56b60e527f14b343453a689b2fbbf98141775e7419f030190a32e8a831c4148f703f1861da656e93365cf6bb59aee628270bde6b6310a701", + "122ebc51724839413d8760e5b7e6317e7348e3c06690083baa2b5dda38cb103d3d6fbd0b924cbcdb4803a7c13de1b3a3794b464a6e2cf7ad9cc33305cb3e704401", + "e68851a6bbde68b5645eac304e0be24f3e8b51c763b0a5b3cc3b7d58b9ce1b4a3ff54a30199ad276a41015781f951f058eb20e513dbbe0097da5840821afa8eb01", + "23555eb3dcfcb3757f0ab11f822822da366baa4148448e76f4123ce944f0b4c80e1998aaf3e00b38e8efd33d8cecfab46901cce7655f37958d67d92b280e687401", + "46e956e8a6c12707ed890079afdecae1c94c5e39d3d04c312bd5477e6770e3274fb763ca342857e80358a2101e628e7d1a653f227307337cb292a005ce2f03db00", + "d3c7b3ebebd0fc24f378f1ac9a2f60bf9c96d9d88d64369f33fdb97893585b303d6cf556dbc12e991c336ac7df9e48cda650f4e5219696108f295af769cea5f601", + "9f8ba0642998c5da0c4691eae7a51a64120ab74ebce32d58fe8f0c11683ad06f232dd3f3b0b9aec0b1c53687298be5584b259bc7738ef54b247c6e436929e01200" + ] + }, + { + "address": "UBGqCZrRCWLNVUTejLUTmWs3ZjcdnanAEa", + "secret": "cefc013f3eef428213011a542db07a220e85b2ea978caec5c47170e2fbc52a61", + "public": "0316f70fba8d65a0f9f3e49b1cbbc3fd3ce83b62725a59ed85bc1693c98e9c0f24", + "signatures": [ + "e15da877661402d0c6c8440d05c3780591c61c5f46094258363b5ced7a3c23e565468cd9cda0a34be02efd37e49239d3b9d6f3fe64f53f359dd1dc52275f6c6900", + "b5dd04df253eab7c671b4414e1dc706f703016f9f545e4d765160fa8511e4e553ce7ffae05b9a527b84ffeca7ea531a7f8bd51add548305d3bff5273b3db6b3601", + "c3135db42f34ab5443ba8ce3e6833c24ca84100d3247fcbb71b8615dc958ee917edb1deb12bc9eb3c259d43958ee10a53e22e966ffeff4116a04714a88ee285c01", + "9183ca8eb77e2bed8c9a788fb13c0f2c834619edc7013f58ae7c7444016012ff033bfbb32494cef26f0e308aa69d4c10cc92b0a8dc3da23d883319808496dff301", + "7ccf91f8222c834c99d28f79d7f858c028150bd0f234fafbaf55a39bc1d9f1c30c39672373d94b2c66658c91f770a280882909717eb4e6020650cac801c7aa5401", + "6f7bd016f7130ce5f33f46da12046b1bc9a8fc03e5fed7165ed16b1eb96012b12ce6166c43af598e24d8eaa8e08c60923de15e55088148993cab843f7fac758001", + "1b62fdbcd1b0eeb42a2ea162ac8332607007d3e94c40d3f329fc5f06abcab57b493cbd3f4b490c5635390500c66d45f51bbd340899922aff54204a2cbbb1ac9d00", + "bba47fe6febf896cc1f9f02a34d77710a050adaa8fbbd9ef2b51bbffca08cb9a22146c0eb84099cf48b499715675417a486abe4de28f99a24a75e9bccc1e91c301", + "ec16b3721e1f05d368969b88a9cb476e8aa7c0177691bc080d5f698decf5969f5d7910d95360cd49700f191cf0f7745d01c09468a1061d28630f8b4f923fad1800", + "76a0ca994efc4714a3d1bf10c7ad81825500a2492ab5df87682acd145bfc6c1e234c1e6238254bc451ae957353531bf2bdfa7899e99c3f7eeedfcc0d3d35a9bc01" + ] + }, + { + "address": "28mhRTjG2P2fah7AJuUrBygpxhmheYy4qwi", + "secret": "a5bf25ae3ac443489d23aa9fa45810a36deb19fc56fb67d09ca920868ee81933", + "public": "02e2a845979adc6147886e594728f975b3121fbeae3bb5e026a2b2738c104175cf", + "signatures": [ + "459509346729140b8534d06867f7c3885a59b38ca9264ae6243e83fd71ff023631aa62a9926ebc21b164717e227813c0a84b222cf7881038d7692c208f1911d300", + "36dd71d7c43b438be226dc6bb3d1695162da774d4aa9d73621ce40f17e71d59c47129046201b7f7ff42128af0df2b8b1075d3c96135fef755cd50d78f443965800", + "e3dbb279b2df949cccd238fd7c9682024a7e86ef4be62c46c21d1a5add6d5bd75ece28373bf65ef0ef01e35873510e1bd6d632390c1d0043af57ee6fcb8e423100", + "21bb5e11f34214dd7472ddccf0e156ae8c2a3b2519022246ba77f2ba804593ee21fe5b20dde87ac0e60948400187cbef45b70ac20f44add46cfd045d87b839ba00", + "f8ae837a61c9a083e366417f0e4be2d43d490add9d34ff4c513d6222194c16232a01b51b9205946f4cd66a5ba69f1ccb6dd4ba3906ec17711547378545d1be7e01", + "0393357ff49e2de374492fdea60319320c37ccbc03e7e6b9ac42ee3422303cfe0648c75c57d3062b5c33634ab0916baa88a998505281287e99ebbb000cd2e42301", + "2900df4afc8b3a123c0ebca53ed6f6398e5172f5f9676b76efd6dd2d5c4fda68568b72fe2cfeefdeed89fa2604d7bd6b3bc9ec9cddb307832a2d4368d863bafa00", + "f10ed20af67fd8a37f4100885e08195460728c89dd5651047e658cc679237c445377114888c7f4402140f2886492038be603087cc921d1baa2ce5ba62e9e40ad00", + "8e00142a82c8259adbb209104373e52d7b3986fda2a29af86e4915706675a35b3af0b4a31002d263355d47e6072a7959d4eacacafdffc5279f6e90bab4e6a84e01", + "87f22431354dcb7f1484d18a1207365d69b69341bcbdd49dbb76ad9ce53cdd3f7c806f14e71b3f05fc1b43726b3be409cb4b06f2738553c61e2ee7713898157300" + ] + }, + { + "address": "o8KcCaEq7rUzk9jU3ej9NXz8ySGoAsM9wq", + "secret": "a774d84ad42813d48f293e77fd9d872d4bc5dcf94a968fbac437811a37e0273f", + "public": "028084b66fe7cd20247fe319bbd62116732e22219ce6ac0c38b10ee7df6a5e84ef", + "signatures": [ + "1f173b3cbdf6157b181cb88ba8fde5490288b1c994eb3d15dd64109207aa330a1eb99b8061555b30addf7e5a1410b22c1791ec979e9f1e359fe67bdf1bc331b000", + "e44ee5d90f91ac62a4b08ca7adabb3f4fbf242fda2c60db76730788a1746012517b7e656078c36e6d2aed28bfb65cded94d4f776c7f3e339829668e2d24fbb8701", + "684052ce6947cf8ef9c661c317136f087f8ccdfaf8b9e9b309c6e61ea43ae09808fd5a912a45e6ac71e4833d7089e1b610dfa1a67e2e3826722a145efe7ced6501", + "673ce36127a13f491044262e8d238aaaf5dc806bed61d7999a262ab215aff64747c2440e532d8bdc6b04b889aa856e0e53f2fd1bb2bc514854e46cda7fac379f00", + "2ac98375228432233fb3d2d3e3e985bef2e46b65a906300f759f6c5588f30d21656385d9a48412387199a44eb21ec2a9da4434e981c5b6e1dc2740565a381eb601", + "acba6f64c54168e9d0a3dfc01b52326a2c2f18d3af10ca6ebbac6bfca02064147887a6cec9613dcbbcb909de55dd5870561c4d6a98683cd1bd34db16c93f6b4a01", + "9b0b680d306e8f196fb882c8ad3fe3591486b19487c5ff7c5ede4a9c86809da6586d28e62bcdafe4bf6d1f48b0714e8f876fdc9bee9c5a946db34d095fb66a3501", + "5c1a56d3fcd09a8d749ff6e69eab86c3a850d9ac4cd4aad1e650c7cf83545cf22192288535eed8d67b1bcd49ca0c4d3ec950b1eac2d1ebf52d052ad46323f76401", + "4ff012ec8b1e136eda5d7638e407985ec6ac20932a60cc9f6387cfbd07e5eb8c6b9e991876f1230008e76b9881425a10f74f731bd67b95c44fecb7239cc215df01", + "15f1b3110921e7113a3e2c0153699c4932189a9f11e08e5e780b171eb6b3dfff5ef5c2b283ef0883ce128c32323efe8ae4aa240d70113ca0103870842e65482701" + ] + }, + { + "address": "F5b64tWsytrtoTB7Gka3Y8gL8bcozi9ZwC", + "secret": "c9da0f4e53c8299fc289eea70a8204053f8e2d357496bf37673b7a2a09606239", + "public": "0249ea059bbf219d4e5fa61b68009dcf568a4c3b8838281066098c9c70e6302e14", + "signatures": [ + "2b6a68e36f23bb4e70e325b74df03af03507c617e1a3f2f3d9ae9de51684e69502a1d4b9d4576a58851c3c30dda5098fb5e483c387a6791d220ae360fa46db1101", + "9bf76435655fd5517083d56112a85d6390f2cdb29ef0083b72f05fc80513553d3855fd859c062c615197f85fa6ea2f64df0a08c05f6fde543aae1e5b06fb070001", + "b4b3d577b3f634171ff462e6ea1a5d7847095c9be3afe56e1ffb5910bdaf5993776a79fb0a11d31af5b8ad03fb82dd60852da5db60812fcb66c430b76e6590c900", + "aea6e04924a561febd89188d0735fccbc342d23afa7d4874a3fb7deec80e38902c85c386e2319bf165b28e07f8f2e5bc65d53124a2e18f3664f14f3156916cf000", + "de5a68867d648b90fb090b366800a458eae988401778295d6737161bc2cb403b7a6c65054ab8a63de5da6b78017dba1fb5225c6d49fa02b0a884c8139e00b6c601", + "b00a6f1b743f2ad3efd370c33bd763924615e06d9640d7473183822f8aa6be792dfca685286084a2d88027079a4eb510c49192da0355217685900c644c37a29300", + "e2c318045aefc3099a25545c35bad5c8b34a9566b5a5e3813a3ca0b9c82698e27209aa93d369b788d8567a9f77c47796060895a566c961652b606f40e73735ca01", + "707e73c79f3212dd48e2d14a807f59a4ce2cbab2d60f9bfd213f3253b4b37c962f66e7b22e16633bae7c6fd4cd25489f731b99f6a68062532f509214ca7593ef00", + "acaf82b616b71700291f97934baf5693a018f685594af570ff51e6b19bb93238174b5d5bd4fb70e7ca1c7a247b795817269e4a93c399d2e55065f9851e0c6d2501", + "7a6afd718dd5126b7a238933f0ab66a93f68bd83b0e233698706662eed4d61486eeb68af6bc69c63f30a6107584a302dd2f3d404feb35868f155b83939541e0800" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testdata/seed-0010.golden b/src/cipher/testsuite/testdata/seed-0010.golden new file mode 100755 index 0000000..136b7f2 --- /dev/null +++ b/src/cipher/testsuite/testdata/seed-0010.golden @@ -0,0 +1,175 @@ +{ + "seed": "58OY1/IoLeJIrfYkiwmSc3IbtSF/XwYHExUdRFPL0G4=", + "keys": [ + { + "address": "2SrJiwmXj5RmsN9DzCVzNFuQDA2ps8FToiE", + "secret": "646ffabadff7a510e36d37a6559b98c24956a62275bc6ac80fb2597985c1557f", + "public": "022b32f9b0f70ed57f356a49faa999f5bfc25f6f1863db2ee5fd2aa1cac0592877", + "signatures": [ + "6ca2305b555ad4757be898041a936b5ba013a0213c24b37abe5dd6586c1dd3e3718f1e38c72481c39d4733994ef2db85528d4307162923427b2cd3fdf67103de00", + "c33f4665e035ca0534798d866857da38b37fc7aa24ce2828d9639bd0cb88ee6e14fe150b016e1cd842a6056d2093629eb272b13b86afb71771dd8064f65a8bb800", + "fc2377a4be18e2c53fd277b136117468b7c8fd12d3abbe6561c210d6c29c56ae3afb4508d5e74ae75c697d51d578458e7b7310a6bebe4c97fbd51e9ab84f7fe000", + "40637de52a5d28d87db456c85b3854a4b73865fa3dacead32bf5d3d24349aef0680735f2083b1c4c0dc10d2f5ff8b84189ecf3c196ebe09d479587334a56145601", + "1265e4ecaea5ba5e80f7125e28fcd6a228e0899e53fce3fe5fc1087a1c931f28710662c01c1986775761f0ed677c5dd663c43b8a3db4e7c34414ccb61fc9daa801", + "02e14ddc2c85600f466297b5938bea2fce271dee37cc4e54c812c4040364e7bd3a57b5ce9839877b7742695c55c85de569aef2faeeac234cfda4246a0d21c0a801", + "614aee033e979afe8cccfbb568dc4f3b1fdb368e249f913ac12a3cd26d4746a52e87252b156dd3c572e1eec02bde554c0d5afb0ee37648aef342d8a401f3332901", + "79e3de5d0b0996e66cb2edc8a683a7ac8aff4a79ec4afab42fa4ccb4bbb0df4439c9e0ec9acc390c9b0c639f6be1d61b7ab9942113f9adeb1642724515cebe0b01", + "8c6ab61c14112eb77e0e3dc0550aa47a14c88bf51b9f3b7bdf40ee666330ab313787b54300c2f405bcca00f7f8a157426cb8b87984e091ba30c095704fdc27e700", + "c30dc8967b5c2fd418e7cebb7dc5cbacc2694da4b80e3fec197b8a8b54a9c517383a2cea7a07bbbc166f53e171d58e3a971e618c62e43a86bd8c529fea53376d00" + ] + }, + { + "address": "28EpfFX9Syr1E1DTtufp4rt6KHDKWJLUCzw", + "secret": "8597cc7736e6a039267fa3ccba8eb73360ab492282026ab8b73328da061d3256", + "public": "0276f2290c48973bd92552fbad3a9ac4ff433a8da13e13beaeaab95f164edb8ef8", + "signatures": [ + "403e2bf565bd10642a72ac10ecb868dd54f22413f1983c5dd8352ea3f5af2e3f660f790c200fc38d135f61c97169c7a6a51d77d00975e95598d47c19b7eab0c001", + "4d9011b95d86cdfcb867ee695d40417b96a1030afef22682874879a9a55b6cb108afb8963d5f89344e396b60e17ef758813a6ec4c669786184031e814c417e0801", + "7505f810db7cf603f5f370f0442cfb15211395fbcaa1876eab3015aa96e11c3d52b681d3b8758b878cd577c984bff55492ffdefd8979d28e355950fa7aa4aa3300", + "9b969732d7672397c3b85b9279a8c7e633f3d59446824ba3c77360c0a1f2d6f315d548aa2576b61285388d6fb1d6f33815cd746b85ab4baec28d3aee3ef06e6c00", + "57c1c7d20cabbf967a68356f806115a1e900211159a2a40dc6fa3420432523977443cb3bdca94911c04f9a15dbe87cae661a085aec6044e9c561df654449f36f01", + "54189224c9c02dc272dfb4474a802083e1ac372350ded7539db03bf60ab918187a2b63a8041e79e0b8bbfd2af09417f71f553972c914df8f956cab8cc4eed2a801", + "a5987f6d62982652f06f5cebfe4a83fe8918566100f9b28b65478a5100164ecc2b366f92ed006321e1300931dca8fa5661a906145fb769ea6351dee3b5215d2900", + "ead667dc0d71e3e6877da08dfa17720e80e372bddf067a6783ff723a37f004ac675d15229369aac75bdcf1875cd548b7b068a41d04b50cfd8bc5b07ddbb13d9e00", + "3dc279ce62d0ea023e13007c737635f752787ca6f5268d12e6347331eb0edb274d702d485599954ec99cea8556aca04d538c87695c2c1c9c1551288b047486f500", + "d5c31767dea1490d951cadc4bf1472ec341b83b3edcb397eb3281af60b48ad4d68ec1d3a192d05af7883a19eb955e2ce4c30db6a7387a708bb41f33d9300ac5f01" + ] + }, + { + "address": "2j5u9ieaqLQjoEru9V9sMqLPL4cncKJfpoU", + "secret": "720a01fccd31cc08832df230316cb89e619113d951475c97b9dc350122036cd8", + "public": "03ad8eec89298721e6f6da1ad420fe178e4e37ba6c5fbeb707375380454eda84b6", + "signatures": [ + "89272a6545cd40117f89c7e18594e5794a72445fb45752d64f9a1d606f7e69604992268952b136b192c0dafab15b9bb322401b967f18536f0f5b78c7ff75f38800", + "06b3fcef37e36255613a3805d31ca5753c1e11ed1c554d6c8c4676c78fd9c53b2a1b0d19ef37b7e8062a65d5e982fec61fd5097d49fb5198c376e914571623dd00", + "82359df3355f1823d03c0aefa5fe9f04f208cd7105f9ea310c615bc6a857f2c153f68e8b1e2ea4fc952c1dbeed02ca31a5f425aa23234ef31a1b052ab177ea1301", + "72ed2078e5bec03162cf64aca6eae363aaae0b402324dd74e7ff630f0d48c67d6e781d0f2612fae060577d827fd7987e4a0d6b6254babc3744c08a98ad85ee9c01", + "fd6d6acb517bf4b27cf1e6b03bb1f2b4213e883c4174c56b14c2ff429aace102214df6bee50df0b5707cb59e215eef0a2138fdf3d94ae01537b03ad4f20d279d00", + "491360c4d4937e2a1e9523051909639a8262bbdbc77becfdf82dedff9fb9c7710b7ac8b9b97aee6267fde5635d247e1c16a1a26a82c9727778c6eaa5b7e3d50e01", + "dc6468ceb3dd16c717549a68ce0d03cc3394891e9118663aabe2de125fea621c16de79f0864fd44b5e23c2058ed8f8e65156abd27e89bea63627afb4487e7af501", + "22ecb0f1e4b39838cb386ff2c705c22b35ee0a84d95ee5cf739a97d3a6bf51be245ae7392a89d05def89a5075b3590d2ebccbc1458371e5cf5a4aae932904d8201", + "806050af0d6b5d2b806f06927438981c648ec6ee3469fae4cfd4d64a31fdfbc57ea6347828cc15ad8092cefb59a738a61bdda7e823282472a688ec288da08e4c01", + "c7e31a146353e1273a1c0f5ba4205e743ed67da7515f1cc052d2c0c24e86445905ada83acf5ddf68b9124c8edb149cf96851f01d41b8a8515d22f0ffb8a86a9101" + ] + }, + { + "address": "2KoZQBUD99gg5jKrZLLycqJvjMvKFf2APLA", + "secret": "5a04368aefae7f463f31da6955d7c08249460e3c90da76936b641f25f7c6ea91", + "public": "03ee8074e5474b0712267b0f66ffc17f42d130523ff4c3f78217532540c89f4609", + "signatures": [ + "aef0feb04a3a4e4318282c0b8d2bcc1f658470be785aa4a3639117035f7b5f357562f1167230ca14aee019f8c32e9c072299a8918f5a76fed3c3f54a40661f1501", + "ffea567262851e00794d58ff9bff182a19fd97862a4e0dba414ae8681ac8f03d5396550c2a867def5be17f5e38296c40c8b6a994870604ccccc2326c5709062d01", + "3d88280db03a3ba9b15929f0f9d6339c835218e60e82780b9a1becfdf674550852149d4e068f2527ae425d280bbdf70bd37ef98ce2dde4d5d3feddcd87497c7a00", + "d53f2a4c346b8c007530beb4c1a28904b0cfa876325cf9790489959f82d4ad74035d957cbbf335177912ea7278f45bf86fa8d47ed9929d78d43da6a9637bd1ea00", + "b02fc80ec2869131159c562df839971b3285ea9dbf3b1279835ade6ec0fc2110228eb443d743bfd1bca24f20308d6034f1a5654f2dc81df537f761aef1234a7701", + "bba9e94d716a041fccdd03498047d9ffaf55a28b1ba905915464255af0b883d03a109c7afde2fbcca2ec9bc2f9bccaab9e07898017d40882fd6be9d12423825b00", + "9b557e95d53b22903526cca3e17468ab029bcb478708ad88c3581f0aff4fbaf4328bb3839134933f3a252432f01573e3f8111f0bbac6c61528de302abf286ff600", + "fec6d86d9efaf625b18c0f48ac7856f1825dfe82495c167a0f44511e9cb52b5c1ac4bd6a5015feb5cabfd39a62f48da6d267da23e5a49d6a1d66c34cd9588ad201", + "1a3ad7d2f56ed736cfe7db24673bfd917bc582b3a63132828372da1def7ae91f5cf322f8d35aba104eb71004658ded222f6411e36079a17a1c7d99473bf2a8b001", + "e3faf295d743fe5e38c1517b1437bea083c4908004dacec1177e410dce94278a4477cbdc751cfb1497a5cfc9c6707ee47bd1e34fc35e0bd27411c3fe69e8186f00" + ] + }, + { + "address": "2YUgePgEgTrbACq7vrna1NXVGUzrBERj4dw", + "secret": "5674c557050ac9dd67cebf9629b9af676024f126e3a52e856fead1ff51521c06", + "public": "025358627a6f01a52f446cc7b643b813482ae3077cd3760385b6700d83def6cf39", + "signatures": [ + "d807b670e83a1dd3424f916a7226d44bf3c9c8cea11f6fb37fe8e96b031f95d52fe48d0a3649e7777cb003a03890c127020bb698dea5e4eba0dd4c3beaf289fd00", + "0437e62986f35dc27782a1697e282da1a7ed39032ae01bf66ed61fdca42e87821a8939036ee91a16ab7bc917d2aa74fb059a6961d8265f98fbcf209e73c3f4db00", + "54d9401e1d6e12f7ce81223ab450134e1a39c7a2077de5ce121156fd56f345f3240cf8b9803df2bf7f105d1db73d8aa1e275dc5926e9340d9c4398f9b8af929800", + "8f052c5c4b6093a88bd24c80d1bc783945ad34b71b00ddc3f5bd6c948419308954e20d8ad22636c082ea536a431c96473531899f2566b57de9d038749e71fd9f01", + "8ecf28f58913914851d5fe5a1181ae665a7d536acd8e3cffd55e1e37e1bc1b8946b1dfbd091b0945dfe944123ba3df27d596dd7866169f4878614cca58b0f4eb01", + "b2c4e3e9bd832da27a0766914652b48a3b93e66cdf558343a4fac554844b99da27d9091693cc8fc5c89f769b870f29cf56b855f29a2f7ee1130b1f51a4d11f4b00", + "2bb5c25e4cd8ad7353d64f5e3ad8c23aa213c71c60c14a207805dc03562b8b1928a1f285fba00eecaf2fe00825574c7cee09cc3eb06a510a87fe3327a2ed808100", + "b00bd2eb6cdc38d9de63fb3ac5f249cc1b65d0aaea101a096d3434563a930a837aa7bf3cc91d7a28c4fe2a0cbacb20e9cf16ddd0e2fd305053c69d0962ad434200", + "1443132e898aef931e53552c74e87a0226227a443dea6d656d02e41e2d03a27749c6f2dc39e0f1de5441d2a828f66b60c598c197bc6a32e0e670143e57802cf200", + "ee030515f8444a3f9abd4cf883fe0d56ac35e44e4a17f3a91619bcd9892649f31ecf607475aaea87b69bfb25fdc6f785aeba8c3f64eb20624ddb18020fcb8d1f00" + ] + }, + { + "address": "dVMg6FSsHo191yyMzvKAu8jNempZbKnkRS", + "secret": "d5c59918edbc439fdc9237ea652127f3f83722895e07b82e5a5094fb628d21fd", + "public": "02697d387c359d57c492f24403a10e2ee47e54866ee381cdacbb5b7cf8ab6e1b80", + "signatures": [ + "a7e7bc206006583d3c9fcf9380c3cc9d3c405eacca2f65f8fdf1ebded73695824cb75bd9cbcd7446c19a45e907e3c3ce2bfc84d4dbe890280d9a41640a1fde7100", + "0e68259177452e77fe363f86c8dfa8f4eda29cb75400f05d1353cc5d7cfc64a36aa54a266635ba55110141a66a63c19429650d72a17f57ad18ccdfded25a264400", + "331e14a445fb114fe7960de531de1612aca3d6701dabcafddc155065e1f9322247a19bf3ff1e9804d4169e6f295215bf41642ac095a6e540e4161b44d660ea1b01", + "69bc7a31bda0c4600e66c7ac02dcfd49bf8ea99cd6f8aec851882204076b2eaa1457b47038230bbd6dca6ae72c404b73e3e2ed4fbe642b5ac9a22c214788363900", + "951cb4a095b98c49470fd3ad7befda82093ce231623ff346947e6eb078f3114020fa56918d334fc29ff724b794a7fe3698eb473efa95c053cc43b1a75c069a9201", + "48fad2b7d86a9b8b7ed87c506d7957bc32c1df1a56af9f2f2f44a382f182a6277766c39ef39fdb580a488393b90937ee0217708c3266f680b62cc980575957c701", + "40ba88d401efc157039d9b305a0ba136d7aaddf9fa97e3e8b11012532eeb8c2f72b910e96029e6a40ae73f15949c692770f95bddbbaebcbae1df67d6002f5a2a01", + "9e5889ba9f34e0dbd4e9dfa354533bf005ead72f170c00b562bb08fe40c7f6e0323b94e84d55637e5dc9b6f007240fc4fbc3bea7c8632aef1b6d10fa9c68d32400", + "7acffdee6552639aa7a1960a0c80366e72f28e74826d17cc4eb2804d516c57f67d2c015df16f5ec84b46963925b53cb3b9e8538360c66a334adba487b4a065ea01", + "11131aa556119bce1540e2820bf21925e5ee2ad16057a6ed3aca1ccb600697ae449bdd0b266838edfc8b02c82b01158035b041c3c844fc7995cc86ff5372749701" + ] + }, + { + "address": "25NJpLNrTci5BtBtLGzGzeU2ABvT9Nw4d3f", + "secret": "0d3ac7f674c3177de5555a6a0e7d97eca63651f686942111ecedbd00c586d03c", + "public": "02c18d3e9b15c91247a2c71ce8c2e27e1b008de4d17ffa388d34b35fb27f3ba1a7", + "signatures": [ + "459d02374af7e0547df8d3ac93bbbf477d9b13add08cea4a2c4a9d55e04bb9501ea2f10c8fc68cde1ad2539df321032fd2f2fe56b010a8afac91f65d63c1ab0900", + "da1e742628e40682df13b888c7b166220638af152120a18fbc3e41cfbc4a2b8c0fffda7514e1c84c0f9211e0efff55ef7699560e64bba76adee30f341f5edd5301", + "da1893f530c4fe952d2da3a56d7b5f40e29e24368c00bea9c6d1317287f646fa08d251e69052b97f7c1d4033936b00ade787de33e6fa8ef939ea4412fe96bfdb01", + "0b782c5ad45598c6678b11254821637c3aaee8c4677dcb38285793337df838924160101e905f89502d30ad3761b4894dad68b7d2601f949301ed5ae4079cbcb400", + "3355727fd4fc2342737c86fc1c01bff49cf1afe258a927064edfc48c2445582d1415b3c74fea1ad22c5d9df4bcb0a65f6e633b729dfe088b29041a013e67db6c01", + "c493605d78ca352ae5758c7b56e9d6b338411e2c78e3cf244df3f5182d55f8de32c3a8464e00de450320d6f62cbbf00719d34d9bd6262cae586befc2bcc0601300", + "833b50000dd4564746e3dd0a90023f5fc74eb443795d2f986a568196fd849fc41751145da01b8a6753867184e02da5e023b12b1638a06bc5e2821afce12c6ee200", + "fb702b3cfb5c4225e14a9f9c56e9959d6f73ad6b8cd17b127187127665e9ca035718e5c139fb2c495425bea29c9c65b2be97f4c642b0da60a37bd10d717ac9f900", + "2dedc42424ffa658049e251c9d0a690a31637f5353e5d1a0d423c1efa3c361fa47c54f642f1876b5089f7c059796579f4a556821f3aa2810678face35c8fe22401", + "6ab859b8b4cf7e047e1e0f8134655aec58c04d0ed86b909d4290c8c335fc9816591fa8236258144b5c4b44c8ce746a11b4e1cfb1b5a259c2ff3e3beeafa26c0c00" + ] + }, + { + "address": "21ryRMcQ4jvpDLv947JhNYFGhkBdPfTa7Ft", + "secret": "cce2107186b602a42f83bdd37870457404daf2d327c83f02422a381628d2350b", + "public": "0240ae55709e29278c3c5df3eba50d14caf9ef73cce3329c05c56595384e801a81", + "signatures": [ + "f59f660e8a14a0ce2b5c866a077ba83529b466658293067c6d16bc3ca1bb512c1cb4923fd4011e23ab572714b7dae244cbbec5518570ca3978a04902adcc183f00", + "e4ac4e486160881d9ba88c70a3aec2c5b0df4e56b1dfaa8212be1e5ed52a2ac36495d35e71791418948689e551886704fd669b2981edb13a8b4b2f385ad301ed01", + "517f2f1532c4986176854141b4a1fd4da24f1a7824a534e1dfa7430d6c6bcff66808f8bd72223a4a8caaf636f4408744372bfe2bdab86eb7c86f862dca40a53200", + "9d597dac44c1dae6b8d940ff6fc61474f6109b07cd4cf036f1c04702c5de5c613b09c0610da9a80f386d2dab714d72b804b0f4404a59d03f8fa63dd9738ed1d301", + "67b3708f680fc77279d0c1e7e65ee6b009223f83d63be3cf3bd2f050110222ac7b069b8fa6fe51bcd18f8332e3696e89ed759eb6d3b01f6a47de09cf1f929a3801", + "c6ba13f4754a3378272eb6ef0bb8543c1c821cbac252cdb23ea3a5687e4672ab6e9f9ebba8f77c2d0805f4c72f81455ae5e91d5669c48cedef9ecc0eb7fce1fc00", + "9db0cf266b02ffc7715d53796c871f0b6cbd221d1d8e6da6dada54198348c4c446b8c2a77ae8f2734ef4209caba8173c86fbe7ea4393cc53021e1e0ff7b5940d01", + "2eaa229d2fddd9dcad651f375202e71168be4b350a1e897b1fe2f27f8660e60131129a497d90254832045c830971578e0f7c1c963b75ada05e7589679fa23c9901", + "36a806424d934f5200b94d16a531d8375bd75183e72b9fc060b3868610930b411e298110ce7d0fd6a3325d83b896cd224c9cb293054553b7a7b3035aaadc39c901", + "5d660629134419b57f48ffea9756105649061067178059caab7c4d285e6a4ba572565e9b7aa7fc8700536e25d7c0dc04ebbe6d50647af58c04e7347d9b3557c601" + ] + }, + { + "address": "2UpJ9CTUUzbSjSfByhiYG7TDuHpyuRCXmjN", + "secret": "01776da713f58690c4ba654afa403ee43527a3697b32c898164b1739b1a8307e", + "public": "03b8f7b20aa8cbdb7b40de6426fcb4a5eb2517dbfbc6e532ec1612341b51a234e8", + "signatures": [ + "7fc7d6a44b4368ee439be43108306c1b78c90f401b7bf5806dea4793ed5941fe67c3fc8700751e21841c16b37f1a22d7ef354b85b39e73dbd38dac6c1d76dd8a01", + "5e634789d9dd8748ce83b5a173ec580a2e2483170f10e391b37e71fa1a0513d7407089d0e3ff410d122518b7ccaad7f39d3e6d87fc731259ab162e2e65eb2e3e00", + "15ba0d2d44d9ba95ff5477275b646d6fd129454a364feccc96eadda27666c2a9419453e2e9fe6890037dbc14d347813ba3cac14bdf11b33dc388466eeacacaa801", + "de5a67850d94ad5183c032b75255de8d125acb9ab613c3a678aa4b0bef2205fb0067b51ba705b25038619a4d99be5f9b6144beb0e758a070e0a5781d1f3d793501", + "60f137a5017662523950c544b23334d98f4ddd044d9ed1d9ae529394431f00883bb79088b7fa127a679a2998dd1bbec57aaa1e9abcb803540e520414ce69760b01", + "273cad4820707e6af38d07e847a579f297200cb567fae62c69ca68cdc0d32c5d7b365b2e8c74d74d802874fa98ba3d1d342246989d56eed0d876e4373cd82a5900", + "7ccf9b45d6368690c145d62acb788b8e1d0c555e8a8e3e3d396ba7f3cdf9fe7b3bad3bdbbc3bf26f5f07a9d7cffedd5f54fff4d06f7354fe60baae6498f0325801", + "c38ea111a10d599bee668edef517315c5a3a960fd38258578033ff9b8a92b9c2443e5dab03a7fa5596280b5aa8fda6c6cc0feb5c921d8cba90ba897d0e61c3b800", + "1268fee5962b4b33fe144373ecbbcf5a4524adec330e46144de4d5de7d7f45f64f26531869aea55eff07b8ab76a6b4c27e7e0582bc5bf2d0e31cca5c82bd60f500", + "7bcf7fd288b4f734ff16fe8c49682997126350fbd5df9537c009995a0859f8ce30c4748c4965c144c415af1f8434e4e2ec1023ca00cc793c55505c7fb4e4f94800" + ] + }, + { + "address": "kwyudpCciG9nTC98vz8b3qrQM9DP2pn9wx", + "secret": "3bfecb42d2aa5f86043bf61ebb1ffcc52c3355e0cb5866cc6d4db80d467b5387", + "public": "021d7c5180dffb1d3e65a341525fe952d65627bb1e4d881777b278665b138419d1", + "signatures": [ + "d8fd20b09ef6f55bf0d668e9d70c42906c54551357122c363d1c8dfd427cb1fd157a47ba228f011e4654b94ac08239ffc955174c0b3123cd445c964ee81e3d3f01", + "40b439422c0be6b652784484e3f760dbe243d2e0639cc2d0b26405615142a3625c1bdd3b088e1444b6f350a01c3ea58439938d01dd0e5b7c840c81f47722b6c601", + "b79308cd0df36560badef6f66fc137a98d0ec27bd5be97b5b83ad94b7d26d94471c3b1d8814008c41524a204aadf208bef1deec1b4019720d2a751455b9d1eea01", + "5a286c751257180a33677d22ea8c66cb457436dd54babe3cdebdf932f6da769b24f99f6cbddfcdffb2d4b5a810431f412737d5bfb9f0de42808d926561b557f301", + "bd066317a372c59468c72f9aae202fe7a5f2f954058ced864b31523961068e0a1bc7e10fcee9ec16cf44580e4d3e7f6194b74dbd6bcf4cd1c5a35640b56293f601", + "cd6fef0e0329f7c11a1785c9b0788ba8be92a5d063486872ab8e85bedd9749995166dde4562ceab241e97f9441e9bb73c54eae7dc3eebea7cac286955ad9016300", + "a5656209f4e0d02c32c38322296de87bdd9688d560dd1d46025929f9a8adc3dc7cbd5127f06c58caf405c8e4c8add84e7e9319aef965e85f7c658173001b8c2f01", + "f3f53b4e7def065704eaf65ff500d33b0522524eb240ecd68d149902334d653a25ec6be35ff944478a852fbc74657d4c6e1c3caef0a525161dbc1b124920cd5000", + "14315ad0efe67c42a7c78da6b84709b22ed187d9417fd2639c88a8f5badf411b0c9ff5ff0420c05d63eb55ce98c743b8e74f73d100cf236cc30b4b397e25a13a01", + "8cd16c423b8ddb65d690651975404a6ead1c8bec450e24181e6c1f1ff914313f2744980e4a3f37977b91133c0c87430156073ef8f523a160e3f266eaa9d4e39100" + ] + } + ] +} \ No newline at end of file diff --git a/src/cipher/testsuite/testsuite.go b/src/cipher/testsuite/testsuite.go new file mode 100755 index 0000000..d4972fe --- /dev/null +++ b/src/cipher/testsuite/testsuite.go @@ -0,0 +1,264 @@ +package testsuite + +import ( + "encoding/base64" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +// InputTestDataJSON contains hashes to be signed +type InputTestDataJSON struct { + Hashes []string `json:"hashes"` +} + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +type KeysTestDataJSON struct { + Address string `json:"address"` + Secret string `json:"secret"` + Public string `json:"public"` + Signatures []string `json:"signatures,omitempty"` +} + +// SeedTestDataJSON contains data generated by Seed +type SeedTestDataJSON struct { + Seed string `json:"seed"` + Keys []KeysTestDataJSON `json:"keys"` +} + +// InputTestData contains hashes to be signed +type InputTestData struct { + Hashes []cipher.SHA256 +} + +// ToJSON converts InputTestData to InputTestDataJSON +func (d *InputTestData) ToJSON() *InputTestDataJSON { + hashes := make([]string, len(d.Hashes)) + for i, h := range d.Hashes { + hashes[i] = h.Hex() + } + + return &InputTestDataJSON{ + Hashes: hashes, + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +func InputTestDataFromJSON(d *InputTestDataJSON) (*InputTestData, error) { + hashes := make([]cipher.SHA256, len(d.Hashes)) + for i, h := range d.Hashes { + var err error + hashes[i], err = cipher.SHA256FromHex(h) + if err != nil { + return nil, err + } + } + + return &InputTestData{ + Hashes: hashes, + }, nil +} + +// KeysTestData contains address, public key, secret key and list of signatures +type KeysTestData struct { + Address cipher.Address + Secret cipher.SecKey + Public cipher.PubKey + Signatures []cipher.Sig +} + +// ToJSON converts KeysTestData to KeysTestDataJSON +func (k *KeysTestData) ToJSON() *KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &KeysTestDataJSON{ + Address: k.Address.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +func KeysTestDataFromJSON(d *KeysTestDataJSON) (*KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + return &KeysTestData{ + Address: addr, + Secret: s, + Public: p, + Signatures: sigs, + }, nil +} + +// SeedTestData contains data generated by Seed +type SeedTestData struct { + Seed []byte + Keys []KeysTestData +} + +// ToJSON converts SeedTestData to SeedTestDataJSON +func (s *SeedTestData) ToJSON() *SeedTestDataJSON { + keys := make([]KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + Keys: keys, + } +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +func SeedTestDataFromJSON(d *SeedTestDataJSON) (*SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &SeedTestData{ + Seed: seed, + Keys: keys, + }, nil +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +func ValidateSeedData(seedData *SeedTestData, inputData *InputTestData) error { + keys := cipher.GenerateDeterministicKeyPairs(seedData.Seed, len(seedData.Keys)) + if len(seedData.Keys) != len(keys) { + return errors.New("cipher.GenerateDeterministicKeyPairs generated an unexpected number of keys") + } + + for i, s := range keys { + if s == (cipher.SecKey{}) { + return errors.New("secret key is null") + } + if seedData.Keys[i].Secret != s { + return errors.New("generated secret key does not match provided secret key") + } + + p := cipher.PubKeyFromSecKey(s) + if p == (cipher.PubKey{}) { + return errors.New("public key is null") + } + if seedData.Keys[i].Public != p { + return errors.New("derived public key does not match provided public key") + } + + addr1 := cipher.AddressFromPubKey(p) + if addr1 == (cipher.Address{}) { + return errors.New("address is null") + } + if seedData.Keys[i].Address != addr1 { + return errors.New("derived address does not match provided address") + } + + addr2 := cipher.AddressFromSecKey(s) + if addr1 != addr2 { + return errors.New("cipher.AddressFromPubKey and cipher.AddressFromSecKey generated different addresses") + } + + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + + if inputData == nil && len(seedData.Keys[i].Signatures) != 0 { + return errors.New("seed data contains signatures but input data was not provided") + } + + if inputData != nil { + if len(seedData.Keys[i].Signatures) != len(inputData.Hashes) { + return errors.New("Number of signatures in seed data does not match number of hashes in input data") + } + + for j, h := range inputData.Hashes { + sig := seedData.Keys[i].Signatures[j] + if sig == (cipher.Sig{}) { + return errors.New("provided signature is null") + } + + err := cipher.VerifySignature(p, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignature failed: %v", err) + } + + err = cipher.ChkSig(addr1, h, sig) + if err != nil { + return fmt.Errorf("cipher.ChkSig failed: %v", err) + } + + err = cipher.VerifySignedHash(sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignedHash failed: %v", err) + } + + p2, err := cipher.PubKeyFromSig(sig, h) + if err != nil { + return fmt.Errorf("cipher.PubKeyFromSig failed: %v", err) + } + + if p != p2 { + return errors.New("public key derived from signature does not match public key derived from secret") + } + + sig2 := cipher.SignHash(h, s) + if sig2 == (cipher.Sig{}) { + return errors.New("created signature is null") + } + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + } + + return nil +} diff --git a/src/cipher/testsuite/testsuite_test.go b/src/cipher/testsuite/testsuite_test.go new file mode 100755 index 0000000..7d28424 --- /dev/null +++ b/src/cipher/testsuite/testsuite_test.go @@ -0,0 +1,76 @@ +package testsuite + +import ( + "os" + "path/filepath" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/file" +) + +const ( + testdataDir = "./testdata/" + manyAddressesFilename = "many-addresses.golden" + inputHashesFilename = "input-hashes.golden" + seedFileRegex = `seed-\d+.golden` +) + +func TestManyAddresses(t *testing.T) { + fn := filepath.Join(testdataDir, manyAddressesFilename) + + var dataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + err = ValidateSeedData(data, nil) + require.NoError(t, err) +} + +func TestSeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles := traverseFiles(testdataDir, seedFileRegex) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateSeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func traverseFiles(dir string, filenameTemplate string) []string { // nolint: unparam + files := make([]string, 0) + filepath.Walk(dir, func(path string, f os.FileInfo, _ error) error { + if !f.IsDir() { + r, err := regexp.MatchString(filenameTemplate, f.Name()) + if err == nil && r { + files = append(files, f.Name()) + } + } + return nil + }) + return files +} diff --git a/src/api/cli/add_private_key.go b/src/cli/add_private_key.go similarity index 100% rename from src/api/cli/add_private_key.go rename to src/cli/add_private_key.go diff --git a/src/cli/address_gen.go b/src/cli/address_gen.go new file mode 100755 index 0000000..9e9b4ed --- /dev/null +++ b/src/cli/address_gen.go @@ -0,0 +1,85 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + bip39 "github.com/skycoin/skycoin/src/cipher/go-bip39" + "github.com/skycoin/skycoin/src/wallet" +) + +func addressGenCmd() gcli.Command { + name := "addressGen" + return gcli.Command{ + Name: name, + Usage: "Generate skycoin or bitcoin addresses", + Description: "", + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "count,c", + Value: 1, + Usage: "Number of addresses to generate", + }, + gcli.BoolFlag{ + Name: "hide-secret,s", + Usage: "Hide the secret key from the output", + }, + gcli.BoolFlag{ + Name: "bitcoin,b", + Usage: "Output the addresses as bitcoin addresses instead of skycoin addresses", + }, + gcli.BoolFlag{ + Name: "hex,x", + Usage: "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided", + }, + gcli.BoolFlag{ + Name: "only-addr,oa", + Usage: "Only show generated address list, hide seed, secret key and public key", + }, + gcli.StringFlag{ + Name: "seed", + Usage: "Seed for deterministic key generation. Will use bip39 as the seed if not provided.", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + var coinType wallet.CoinType + if c.Bool("bitcoin") { + coinType = wallet.CoinTypeBitcoin + } else { + coinType = wallet.CoinTypeSkycoin + } + + seed := c.String("seed") + if seed == "" { + hex := c.Bool("hex") + if hex { + // generate a new seed, as hex string + seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() + } else { + var err error + seed, err = bip39.NewDefaultMnemonic() + if err != nil { + return err + } + } + } + + w, err := wallet.CreateAddresses(coinType, seed, c.Int("count"), c.Bool("hide-secret")) + if err != nil { + return err + } + + if !c.Bool("only-addr") { + return printJSON(w) + } + + for _, e := range w.Entries { + fmt.Println(e.Address) + } + return nil + }, + } +} diff --git a/src/api/cli/blocks.go b/src/cli/blocks.go similarity index 100% rename from src/api/cli/blocks.go rename to src/cli/blocks.go diff --git a/src/api/cli/broadcast_rawtx.go b/src/cli/broadcast_rawtx.go similarity index 100% rename from src/api/cli/broadcast_rawtx.go rename to src/cli/broadcast_rawtx.go diff --git a/src/api/cli/check_balance.go b/src/cli/check_balance.go similarity index 100% rename from src/api/cli/check_balance.go rename to src/cli/check_balance.go diff --git a/src/api/cli/check_balance_test.go b/src/cli/check_balance_test.go similarity index 100% rename from src/api/cli/check_balance_test.go rename to src/cli/check_balance_test.go diff --git a/src/cli/checkdb.go b/src/cli/checkdb.go new file mode 100755 index 0000000..a43dbea --- /dev/null +++ b/src/cli/checkdb.go @@ -0,0 +1,85 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/boltdb/bolt" + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +const ( + blockchainPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +// wrapDB calls dbutil.WrapDB and disables all logging +func wrapDB(db *bolt.DB) *dbutil.DB { + wdb := dbutil.WrapDB(db) + wdb.ViewLog = false + wdb.ViewTrace = false + wdb.UpdateLog = false + wdb.UpdateTrace = false + wdb.DurationLog = false + return wdb +} + +func checkdbCmd() gcli.Command { + name := "checkdb" + return gcli.Command{ + Name: name, + Usage: "Verify the database", + ArgsUsage: "[db path]", + Description: "If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.", + OnUsageError: onCommandUsageError(name), + Action: checkdb, + } +} + +func checkdb(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // get db path + dbpath, err := resolveDBPath(cfg, c.Args().First()) + if err != nil { + return err + } + + // check if this file is exist + if _, err := os.Stat(dbpath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbpath) + } + + db, err := bolt.Open(dbpath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + pubkey, err := cipher.PubKeyFromHex(blockchainPubkey) + if err != nil { + return fmt.Errorf("decode blockchain pubkey failed: %v", err) + } + + quit := QuitChanFromContext(c) + go func() { + apputil.CatchInterrupt(quit) + }() + + if err := visor.CheckDatabase(wrapDB(db), pubkey, quit); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkdb failed: %v", err) + } + + fmt.Println("check db success") + return nil +} diff --git a/src/cli/cli.go b/src/cli/cli.go new file mode 100755 index 0000000..15679d8 --- /dev/null +++ b/src/cli/cli.go @@ -0,0 +1,409 @@ +/* +Package cli implements an interface for creating a CLI application. +Includes methods for manipulating wallets files and interacting with the +webrpc API to query a skycoin node's status. +*/ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + "path/filepath" + "strconv" + "strings" + "syscall" + + "os" + + gcli "github.com/urfave/cli" + "golang.org/x/crypto/ssh/terminal" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/util/file" +) + +const ( + // Version is the CLI Version + Version = "0.24.1" + walletExt = ".wlt" + defaultCoin = "skycoin" + defaultWalletName = "$COIN_cli" + walletExt + defaultWalletDir = "$DATA_DIR/wallets" + defaultRPCAddress = "http://127.0.0.1:6420" + defaultDataDir = "$HOME/.$COIN/" +) + +var ( + envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" + COIN: Name of the coin. Default "%s" + USE_CSRF: Set to 1 or true if the remote node has CSRF enabled. Default false (unset) + WALLET_DIR: Directory where wallets are stored. This value is overriden by any subcommand flag specifying a wallet filename, if that filename includes a path. Default "%s" + WALLET_NAME: Name of wallet file (without path). This value is overriden by any subcommand flag specifying a wallet filename. Default "%s" + DATA_DIR: Directory where everything is stored. Default "%s"`, defaultRPCAddress, defaultCoin, defaultWalletDir, defaultWalletName, defaultDataDir) + + commandHelpTemplate = fmt.Sprintf(`USAGE: + {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .VisibleFlags}} + +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +%s +`, envVarsHelp) + + appHelpTemplate = fmt.Sprintf(`NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +%s +`, envVarsHelp) + + // ErrWalletName is returned if the wallet file name is invalid + ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) + // ErrAddress is returned if an address is invalid + ErrAddress = errors.New("invalid address") + // ErrJSONMarshal is returned if JSON marshaling failed + ErrJSONMarshal = errors.New("json marshal failed") +) + +// App Wraps the app so that main package won't use the raw App directly, +// which will cause import issue +type App struct { + gcli.App +} + +// Config cli's configuration struct +type Config struct { + WalletDir string `json:"wallet_directory"` + WalletName string `json:"wallet_name"` + DataDir string `json:"data_directory"` + Coin string `json:"coin"` + RPCAddress string `json:"rpc_address"` + UseCSRF bool `json:"use_csrf"` +} + +// LoadConfig loads config from environment, prior to parsing CLI flags +func LoadConfig() (Config, error) { + // get coin name from env + coin := os.Getenv("COIN") + if coin == "" { + coin = defaultCoin + } + + // get rpc address from env + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = defaultRPCAddress + } + + if _, err := url.Parse(rpcAddr); err != nil { + return Config{}, errors.New("RPC_ADDR must be in scheme://host format") + } + + home := file.UserHome() + + // get data dir dir from env + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = filepath.Join(home, fmt.Sprintf(".%s", coin)) + } + + // get wallet dir from env + wltDir := os.Getenv("WALLET_DIR") + if wltDir == "" { + wltDir = filepath.Join(dataDir, "wallets") + } + + // get wallet name from env + wltName := os.Getenv("WALLET_NAME") + if wltName == "" { + wltName = fmt.Sprintf("%s_cli%s", coin, walletExt) + } + + if !strings.HasSuffix(wltName, walletExt) { + return Config{}, ErrWalletName + } + var useCSRF bool + useCSRFStr := os.Getenv("USE_CSRF") + if useCSRFStr != "" { + var err error + useCSRF, err = strconv.ParseBool(useCSRFStr) + if err != nil { + return Config{}, errors.New("Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") + } + } + + return Config{ + WalletDir: wltDir, + WalletName: wltName, + DataDir: dataDir, + Coin: coin, + RPCAddress: rpcAddr, + UseCSRF: useCSRF, + }, nil +} + +// FullWalletPath returns the joined wallet dir and wallet name path +func (c Config) FullWalletPath() string { + return filepath.Join(c.WalletDir, c.WalletName) +} + +// FullDBPath returns the joined data directory and db file name path +func (c Config) FullDBPath() string { + return filepath.Join(c.DataDir, "data.db") +} + +// Returns a full wallet path based on cfg and optional cli arg specifying wallet file +// FIXME: A CLI flag for the wallet filename is redundant with the envvar. Remove the flags or the envvar. +func resolveWalletPath(cfg Config, w string) (string, error) { + if w == "" { + w = cfg.FullWalletPath() + } + + if !strings.HasSuffix(w, walletExt) { + return "", ErrWalletName + } + + // If w is only the basename, use the default wallet directory + if filepath.Base(w) == w { + w = filepath.Join(cfg.WalletDir, w) + } + + absW, err := filepath.Abs(w) + if err != nil { + return "", fmt.Errorf("Invalid wallet path %s: %v", w, err) + } + + return absW, nil +} + +func resolveDBPath(cfg Config, db string) (string, error) { + if db == "" { + db = cfg.FullDBPath() + } + + // If db is only the basename, use the default data dir + if filepath.Base(db) == db { + db = filepath.Join(cfg.DataDir, db) + } + + absDB, err := filepath.Abs(db) + if err != nil { + return "", fmt.Errorf("Invalid data path %s: %v", db, err) + } + return absDB, nil +} + +// NewApp creates an app instance +func NewApp(cfg Config) (*App, error) { + gcli.AppHelpTemplate = appHelpTemplate + gcli.SubcommandHelpTemplate = commandHelpTemplate + gcli.CommandHelpTemplate = commandHelpTemplate + + gcliApp := gcli.NewApp() + app := &App{ + App: *gcliApp, + } + + commands := []gcli.Command{ + addPrivateKeyCmd(cfg), + addressBalanceCmd(), + addressGenCmd(), + addressOutputsCmd(), + blocksCmd(), + broadcastTxCmd(), + checkdbCmd(), + createRawTxCmd(cfg), + decodeRawTxCmd(), + generateAddrsCmd(cfg), + generateWalletCmd(cfg), + lastBlocksCmd(), + listAddressesCmd(), + listWalletsCmd(), + sendCmd(), + showConfigCmd(), + statusCmd(), + transactionCmd(), + verifyAddressCmd(), + versionCmd(), + walletBalanceCmd(cfg), + walletDirCmd(), + walletHisCmd(), + walletOutputsCmd(cfg), + encryptWalletCmd(cfg), + decryptWalletCmd(cfg), + showSeedCmd(cfg), + } + + app.Name = fmt.Sprintf("%s-cli", cfg.Coin) + app.Version = Version + app.Usage = fmt.Sprintf("the %s command line interface", cfg.Coin) + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *gcli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(context.App.Writer, "Error: %v\n\n", err) + gcli.ShowAppHelp(context) + return nil + } + app.CommandNotFound = func(ctx *gcli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} command. See '{{.HelpName}} --help'.\n", command) + gcli.HelpPrinter(app.Writer, tmp, app) + gcli.OsExiter(1) + } + + rpcClient, err := webrpc.NewClient(cfg.RPCAddress) + if err != nil { + return nil, err + } + rpcClient.UseCSRF = cfg.UseCSRF + + app.Metadata = map[string]interface{}{ + "config": cfg, + "rpc": rpcClient, + "quitChan": make(chan struct{}), + } + + return app, nil +} + +// Run starts the app +func (app *App) Run(args []string) error { + return app.App.Run(args) +} + +// RPCClientFromContext returns a webrpc.Client from a urfave/cli Context +func RPCClientFromContext(c *gcli.Context) *webrpc.Client { + return c.App.Metadata["rpc"].(*webrpc.Client) +} + +// ConfigFromContext returns a Config from a urfave/cli Context +func ConfigFromContext(c *gcli.Context) Config { + return c.App.Metadata["config"].(Config) +} + +// QuitChanFromContext returns a chan struct{} from a urfave/cli Context +func QuitChanFromContext(c *gcli.Context) chan struct{} { + return c.App.Metadata["quitChan"].(chan struct{}) +} + +func onCommandUsageError(command string) gcli.OnUsageErrorFunc { + return func(c *gcli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(c.App.Writer, "Error: %v\n\n", err) + gcli.ShowCommandHelp(c, command) + return nil + } +} + +func errorWithHelp(c *gcli.Context, err error) { + fmt.Fprintf(c.App.Writer, "Error: %v. See '%s %s --help'\n\n", err, c.App.HelpName, c.Command.Name) +} + +func formatJSON(obj interface{}) ([]byte, error) { + d, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return nil, ErrJSONMarshal + } + return d, nil +} + +func printJSON(obj interface{}) error { + d, err := formatJSON(obj) + if err != nil { + return err + } + + fmt.Println(string(d)) + + return nil +} + +// readPasswordFromTerminal promotes user to enter password and read it. +func readPasswordFromTerminal() ([]byte, error) { + // Promotes to enter the wallet password + fmt.Fprint(os.Stdout, "enter password:") + bp, err := terminal.ReadPassword(int(syscall.Stdin)) + if err != nil { + return nil, err + } + fmt.Fprintln(os.Stdout, "") + return bp, nil +} + +// PUBLIC + +// WalletLoadError is returned if a wallet could not be loaded +type WalletLoadError struct { + error +} + +// WalletSaveError is returned if a wallet could not be saved +type WalletSaveError struct { + error +} + +// PasswordReader is an interface for getting password +type PasswordReader interface { + Password() ([]byte, error) +} + +// PasswordFromBytes represents an implementation of PasswordReader, +// which reads password from the bytes itself. +type PasswordFromBytes []byte + +// Password implements the PasswordReader's Password method +func (p PasswordFromBytes) Password() ([]byte, error) { + return []byte(p), nil +} + +// PasswordFromTerm reads password from terminal +type PasswordFromTerm struct{} + +// Password implements the PasswordReader's Password method +func (p PasswordFromTerm) Password() ([]byte, error) { + v, err := readPasswordFromTerminal() + if err != nil { + return nil, err + } + + return v, nil +} + +// NewPasswordReader creats a PasswordReader instance, +// reads password from the input bytes first, if it's empty, then read from terminal. +func NewPasswordReader(p []byte) PasswordReader { + if len(p) != 0 { + return PasswordFromBytes(p) + } + + return PasswordFromTerm{} +} diff --git a/src/cli/cli_test.go b/src/cli/cli_test.go new file mode 100755 index 0000000..7bc3939 --- /dev/null +++ b/src/cli/cli_test.go @@ -0,0 +1,255 @@ +package cli + +import ( + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/file" +) + +func Example() { + // In cmd/cli/cli.go: + cfg, err := LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + app, err := NewApp(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := app.Run(os.Args); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func TestLoadConfig(t *testing.T) { + t.Run("set COIN", func(t *testing.T) { + val := "foocoin" + os.Setenv("COIN", val) + defer os.Unsetenv("COIN") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.Coin, val) + }) + + t.Run("set RPC_ADDR", func(t *testing.T) { + val := "http://111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.RPCAddress, val) + }) + + t.Run("set RPC_ADDR invalid", func(t *testing.T) { + val := "111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + _, err := LoadConfig() + testutil.RequireError(t, err, "RPC_ADDR must be in scheme://host format") + }) + + t.Run("set WALLET_DIR", func(t *testing.T) { + val := "/home/foo/bar" + os.Setenv("WALLET_DIR", val) + defer os.Unsetenv("WALLET_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.WalletDir, val) + }) + + t.Run("set WALLET_NAME", func(t *testing.T) { + val := "bar.wlt" + os.Setenv("WALLET_NAME", val) + defer os.Unsetenv("WALLET_NAME") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.WalletName, val) + }) + + t.Run("set WALLET_NAME invalid", func(t *testing.T) { + val := "badwltext.foo" + os.Setenv("WALLET_NAME", val) + defer os.Unsetenv("WALLET_NAME") + + _, err := LoadConfig() + require.Error(t, err) + require.Equal(t, ErrWalletName, err) + }) + + t.Run("set DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + }) + + t.Run("set WALLET_DIR by DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + valWallet := val + "wallets" + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + require.Equal(t, cfg.WalletDir, valWallet) + }) + + t.Run("don't set USE_CSRF", func(t *testing.T) { + os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.False(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF false", func(t *testing.T) { + val := "0" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.False(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF true", func(t *testing.T) { + val := "1" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.True(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF invalid", func(t *testing.T) { + val := "not_boolean" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + _, err := LoadConfig() + testutil.RequireError(t, err, "Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") + }) +} + +func TestResolveWalletPath(t *testing.T) { + mustLoadConfig := func() Config { + cfg, err := LoadConfig() + require.NoError(t, err) + return cfg + } + + defaultCfg := mustLoadConfig() + expectedFullPath := fmt.Sprintf("%[1]s/.%[2]s/wallets/%[2]s_cli%[3]s", file.UserHome(), defaultCoin, walletExt) + require.Equal(t, expectedFullPath, defaultCfg.FullWalletPath()) + + absPathInput := "./foo/bar.wlt" + absPathOutput, err := filepath.Abs(absPathInput) + require.NoError(t, err) + + tests := []struct { + Name string + WalletDir string + WalletName string + WalletArg string + Error error + Expected string + }{ + { + Name: "default config, empty cli arg", + Expected: defaultCfg.WalletDir + "/" + defaultCfg.WalletName, + }, + { + Name: "default config, nonempty cli arg, invalid extension", + WalletArg: "badwltext.foo", + Error: ErrWalletName, + }, + { + Name: "default config, nonempty cli arg, valid", + WalletArg: "foo.wlt", + Expected: defaultCfg.WalletDir + "/foo.wlt", + }, + { + Name: "nondefault config wallet name, empty cli arg", + WalletName: "bar.wlt", + Expected: defaultCfg.WalletDir + "/bar.wlt", + }, + { + Name: "nondefault config wallet name invalid, empty cli arg", + WalletName: "badwltext.foo", + Error: ErrWalletName, + }, + { + Name: "nondefault config wallet path, empty cli arg", + WalletDir: "/home/foo/somewhere", + Expected: "/home/foo/somewhere/" + defaultCfg.WalletName, + }, + { + Name: "nondefault config wallet path and name, empty cli arg", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + Expected: "/home/foo/somewhere/bar.wlt", + }, + { + Name: "nondefault config wallet path and name, cli arg, valid, name only", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + WalletArg: "foo.wlt", + Expected: "/home/foo/somewhere/foo.wlt", + }, + { + Name: "nondefault config wallet path and name, cli arg, valid, with path", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + WalletArg: "/usr/lib/foo.wlt", + Expected: "/usr/lib/foo.wlt", + }, + { + Name: "wallet arg relative path", + WalletArg: absPathInput, + Expected: absPathOutput, + }, + } + + for _, tc := range tests { + t.Run(tc.Name, func(t *testing.T) { + cfg := mustLoadConfig() + if tc.WalletDir != "" { + cfg.WalletDir = tc.WalletDir + } + if tc.WalletName != "" { + cfg.WalletName = tc.WalletName + } + + w, err := resolveWalletPath(cfg, tc.WalletArg) + + if tc.Error == nil { + require.NoError(t, err) + require.Equal(t, tc.Expected, w) + require.True(t, filepath.IsAbs(w)) + } else { + require.Error(t, err) + require.Equal(t, tc.Error, err) + } + }) + } +} diff --git a/src/cli/create_rawtx.go b/src/cli/create_rawtx.go new file mode 100755 index 0000000..c1b118a --- /dev/null +++ b/src/cli/create_rawtx.go @@ -0,0 +1,686 @@ +package cli + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +var ( + // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm + ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") +) + +// SendAmount represents an amount to send to an address +type SendAmount struct { + Addr string + Coins uint64 +} + +type sendAmountJSON struct { + Addr string `json:"addr"` + Coins string `json:"coins"` +} + +func createRawTxCmd(cfg Config) gcli.Command { + name := "createRawTransaction" + return gcli.Command{ + Name: name, + Usage: "Create a raw transaction to be broadcast to the network later", + ArgsUsage: "[to address] [amount]", + Description: fmt.Sprintf(` + Note: The [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + The default wallet (%s) will be + used if no wallet and address was specified. + + + If you are sending from a wallet the coins will be taken iteratively + from all addresses within the wallet starting with the first address until + the amount of the transaction is met. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f", + Usage: "[wallet file or path], From wallet", + }, + gcli.StringFlag{ + Name: "a", + Usage: "[address] From address", + }, + gcli.StringFlag{ + Name: "c", + Usage: `[changeAddress] Specify different change address. + By default the from address or a wallets coinbase address will be used.`, + }, + gcli.StringFlag{ + Name: "m", + Usage: `[send to many] use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`, + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + gcli.BoolFlag{ + Name: "json,j", + Usage: "Returns the results in JSON format.", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + tx, err := createRawTxCmdHandler(c) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + rawTx := hex.EncodeToString(tx.Serialize()) + + if c.Bool("json") { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTx, + }) + } + + fmt.Println(rawTx) + return nil + }, + } +} + +type walletAddress struct { + Wallet string + Address string +} + +func fromWalletOrAddress(c *gcli.Context) (walletAddress, error) { + cfg := ConfigFromContext(c) + + wlt, err := resolveWalletPath(cfg, c.String("f")) + if err != nil { + return walletAddress{}, err + } + + wltAddr := walletAddress{ + Wallet: wlt, + } + + wltAddr.Address = c.String("a") + if wltAddr.Address == "" { + return wltAddr, nil + } + + if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { + return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) + } + + return wltAddr, nil +} + +func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { + if chgAddr == "" { + switch { + case wltAddr.Address != "": + // use the from address as change address + chgAddr = wltAddr.Address + case wltAddr.Wallet != "": + // get the default wallet's coin base address + wlt, err := wallet.Load(wltAddr.Wallet) + if err != nil { + return "", WalletLoadError{err} + } + + if len(wlt.Entries) > 0 { + chgAddr = wlt.Entries[0].Address.String() + } else { + return "", errors.New("no change address was found") + } + default: + return "", errors.New("both wallet file, from address and change address are empty") + } + } + + // validate the address + _, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return "", fmt.Errorf("invalid change address: %s", chgAddr) + } + + return chgAddr, nil +} + +func getToAddresses(c *gcli.Context) ([]SendAmount, error) { + m := c.String("m") + if m != "" { + sas := []sendAmountJSON{} + if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { + return nil, fmt.Errorf("invalid -m flag string, err:%v", err) + } + sendAmts := make([]SendAmount, 0, len(sas)) + for _, sa := range sas { + amt, err := droplet.FromString(sa.Coins) + if err != nil { + return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) + } + + sendAmts = append(sendAmts, SendAmount{ + Addr: sa.Addr, + Coins: amt, + }) + } + return sendAmts, nil + } + + if c.NArg() < 2 { + return nil, errors.New("invalid argument") + } + + toAddr := c.Args().First() + // validate address + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + amt, err := getAmount(c) + if err != nil { + return nil, err + } + return []SendAmount{{toAddr, amt}}, nil +} + +func getAmount(c *gcli.Context) (uint64, error) { + if c.NArg() < 2 { + return 0, errors.New("invalid argument") + } + + amount := c.Args().Get(1) + amt, err := droplet.FromString(amount) + if err != nil { + return 0, fmt.Errorf("invalid amount: %v", err) + } + + return amt, nil +} + +func createRawTxCmdHandler(c *gcli.Context) (*coin.Transaction, error) { + rpcClient := RPCClientFromContext(c) + + wltAddr, err := fromWalletOrAddress(c) + if err != nil { + return nil, err + } + + chgAddr, err := getChangeAddress(wltAddr, c.String("c")) + if err != nil { + return nil, err + } + + toAddrs, err := getToAddresses(c) + if err != nil { + return nil, err + } + + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + if wltAddr.Address == "" { + return CreateRawTxFromWallet(rpcClient, wltAddr.Wallet, chgAddr, toAddrs, pr) + } + + return CreateRawTxFromAddress(rpcClient, wltAddr.Address, wltAddr.Wallet, chgAddr, toAddrs, pr) +} + +func validateSendAmounts(toAddrs []SendAmount) error { + for _, arg := range toAddrs { + // validate to address + _, err := cipher.DecodeBase58Address(arg.Addr) + if err != nil { + return ErrAddress + } + + if arg.Coins == 0 { + return errors.New("Cannot send 0 coins") + } + } + + if len(toAddrs) == 0 { + return errors.New("No destination addresses") + } + + return nil +} + +// PUBLIC + +// CreateRawTxFromWallet creates a transaction from any address or combination of addresses in a wallet +func CreateRawTxFromWallet(c *webrpc.Client, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { + // check change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + // check if the change address is in wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + _, ok := wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + // get all address in the wallet + totalAddrs := wlt.GetAddresses() + addrStrArray := make([]string, len(totalAddrs)) + for i, a := range totalAddrs { + addrStrArray[i] = a.String() + } + + return CreateRawTx(c, wlt, addrStrArray, chgAddr, toAddrs, password) +} + +// CreateRawTxFromAddress creates a transaction from a specific address in a wallet +func CreateRawTxFromAddress(c *webrpc.Client, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { + // check if the address is in the default wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + srcAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + return nil, ErrAddress + } + + _, ok := wlt.GetEntry(srcAddr) + if !ok { + return nil, fmt.Errorf("%v address is not in wallet", addr) + } + + // validate change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + _, ok = wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + return CreateRawTx(c, wlt, []string{addr}, chgAddr, toAddrs, password) +} + +// CreateRawTx creates a transaction from a set of addresses contained in a loaded *wallet.Wallet +func CreateRawTx(c *webrpc.Client, wlt *wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + // Get unspent outputs of those addresses + unspents, err := c.GetUnspentOutputs(inAddrs) + if err != nil { + return nil, err + } + + inUxs, err := unspents.Outputs.SpendableOutputs().ToUxArray() + if err != nil { + return nil, err + } + + txn, err := createRawTx(unspents.Outputs, wlt, chgAddr, toAddrs, password) + if err != nil { + return nil, err + } + + // filter out unspents which are not used in transaction + var inUxsFiltered coin.UxArray + for _, h := range txn.In { + for _, u := range inUxs { + if h == u.Hash() { + inUxsFiltered = append(inUxsFiltered, u) + } + } + } + + // TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints minus + // the parts that require block head data, which is not available from the RPC API (see below) + if err := verifyTransactionConstraints(txn, inUxsFiltered, visor.DefaultMaxBlockSize); err != nil { + return nil, err + } + + // TODO -- verify against soft and hard constraints + // Need to get the head block to do verification. + // The head block is not exposed over the JSON RPC, which webrpc.Client uses. + // Need to remove the JSON RPC API and have the client make requests to the HTTP API. + // Once the HTTP API is used, + // Need to request /blockchain/metadata to get the head block time + // This could lead to race conditions; /blockchain/metadata should return the full head, or have an API endpoint + // just for the head, and/or include the head block in the get_outputs response + // The head block is used for calculating inUxs's coin hours. + // if err := visor.VerifySingleTxnSoftConstraints(txn, inUxs, visor.DefaultMaxBlockSize); err != nil { + // return nil, err + // } + // if err := visor.VerifySingleTxnHardConstraints(txn, head, inUxs); err != nil { + // return nil, err + // } + + return txn, nil +} + +// TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints and HardConstraints +// minus the parts that require block head data, which is not available from the RPC API (see below) +func verifyTransactionConstraints(txn *coin.Transaction, uxIn coin.UxArray, maxSize int) error { // nolint: unparam + // SOFT constraints: + + if txn.Size() > maxSize { + return errors.New("Transaction size bigger than max block size") + } + + if visor.TransactionIsLocked(uxIn) { + return errors.New("Transaction has locked address inputs") + } + + // Ignore transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := visor.DropletPrecisionCheck(o.Coins); err != nil { + return err + } + } + + // HARD constraints: + + if err := txn.Verify(); err != nil { + return err + } + + // Checks whether ux inputs exist, + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInput(uxIn); err != nil { + return err + } + + // Verify CoinHours do not overflow + if _, err := txn.OutputHours(); err != nil { + return err + } + + // Check that no coins are created or destroyed + // TODO -- use the correct block head, once we have it from the API + // For now it doesn't matter, the block head is used to calculate the uxOut hours, + // but we're not validating the hours + uxOut := coin.CreateUnspents(coin.BlockHeader{ + BkSeq: 1, + }, *txn) + return coin.VerifyTransactionCoinsSpending(uxIn, uxOut) + + // TODO -- use coin.VerifyTransactionHoursSpending, once we have the head block + // return coin.VerifyTransactionHoursSpending(head.Time(), uxIn, uxOut) +} + +func createRawTx(uxouts visor.ReadableOutputSet, wlt *wallet.Wallet, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + // Calculate total required coins + var totalCoins uint64 + for _, arg := range toAddrs { + var err error + totalCoins, err = coin.AddUint64(totalCoins, arg.Coins) + if err != nil { + return nil, err + } + } + + spendOutputs, err := chooseSpends(uxouts, totalCoins) + if err != nil { + return nil, err + } + + txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) + if err != nil { + return nil, err + } + + f := func(w *wallet.Wallet) (*coin.Transaction, error) { + keys, err := getKeys(w, spendOutputs) + if err != nil { + return nil, err + } + + return NewTransaction(spendOutputs, keys, txOuts), nil + } + + makeTx := func() (*coin.Transaction, error) { + return f(wlt) + } + + if wlt.IsEncrypted() { + makeTx = func() (*coin.Transaction, error) { + var tx *coin.Transaction + if err := wlt.GuardView(password, func(w *wallet.Wallet) error { + var err error + tx, err = f(w) + return err + }); err != nil { + return nil, err + } + + return tx, nil + } + } + + return makeTx() +} + +func chooseSpends(uxouts visor.ReadableOutputSet, coins uint64) ([]wallet.UxBalance, error) { + // Convert spendable unspent outputs to []wallet.UxBalance + spendableOutputs, err := visor.ReadableOutputsToUxBalances(uxouts.SpendableOutputs()) + if err != nil { + return nil, err + } + + // Choose which unspent outputs to spend + // Use the MinimizeUxOuts strategy, since this is most likely used by + // application that may need to send frequently. + // Using fewer UxOuts will leave more available for other transactions, + // instead of waiting for confirmation. + outs, err := wallet.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) + if err != nil { + // If there is not enough balance in the spendable outputs, + // see if there is enough balance when including incoming outputs + if err == wallet.ErrInsufficientBalance { + expectedOutputs, otherErr := visor.ReadableOutputsToUxBalances(uxouts.ExpectedOutputs()) + if otherErr != nil { + return nil, otherErr + } + + if _, otherErr := wallet.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { + return nil, err + } + + return nil, ErrTemporaryInsufficientBalance + } + + return nil, err + } + + return outs, nil +} + +func makeChangeOut(outs []wallet.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { + var totalInCoins, totalInHours, totalOutCoins uint64 + + for _, o := range outs { + totalInCoins += o.Coins + totalInHours += o.Hours + } + + if totalInHours == 0 { + return nil, fee.ErrTxnNoFee + } + + for _, to := range toAddrs { + totalOutCoins += to.Coins + } + + if totalInCoins < totalOutCoins { + return nil, wallet.ErrInsufficientBalance + } + + outAddrs := []coin.TransactionOutput{} + changeAmount := totalInCoins - totalOutCoins + + haveChange := changeAmount > 0 + nAddrs := uint64(len(toAddrs)) + changeHours, addrHours, totalOutHours := wallet.DistributeSpendHours(totalInHours, nAddrs, haveChange) + + if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours); err != nil { + return nil, err + } + + for i, to := range toAddrs { + // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero + // changeHours is zero when there is no change left or all the coinhours were used in fees + // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses + // 2) if all the coinhours are burned in fees then all addrHours are zero by default + if changeHours > 0 { + // the coinhours are capped to a maximum of incoming coins for the address + // if incoming coins < 1 then the cap is set to 1 coinhour + + spendCoinsAmt := to.Coins / 1e6 + if spendCoinsAmt == 0 { + spendCoinsAmt = 1 + } + + // allow addrHours to be less than the incoming coins of the address but not more + if addrHours[i] > spendCoinsAmt { + // cap the addrHours, move the difference to changeHours + changeHours += addrHours[i] - spendCoinsAmt + addrHours[i] = spendCoinsAmt + } + } + + outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) + } + + if haveChange { + outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) + } + + return outAddrs, nil +} + +func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { + uo := coin.TransactionOutput{} + uo.Address = cipher.MustDecodeBase58Address(addr) + uo.Coins = coins + uo.Hours = hours + return uo +} + +func getKeys(wlt *wallet.Wallet, outs []wallet.UxBalance) ([]cipher.SecKey, error) { + keys := make([]cipher.SecKey, len(outs)) + for i, o := range outs { + entry, ok := wlt.GetEntry(o.Address) + if !ok { + return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) + } + + keys[i] = entry.Secret + } + return keys, nil +} + +// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. +func NewTransaction(utxos []wallet.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) *coin.Transaction { + tx := coin.Transaction{} + for _, u := range utxos { + tx.PushInput(u.Hash) + } + + for _, o := range outs { + tx.PushOutput(o.Address, o.Coins, o.Hours) + } + + tx.SignInputs(keys) + + tx.UpdateHeader() + return &tx +} diff --git a/src/api/cli/create_rawtx_test.go b/src/cli/create_rawtx_test.go similarity index 100% rename from src/api/cli/create_rawtx_test.go rename to src/cli/create_rawtx_test.go diff --git a/src/cli/decryptWallet.go b/src/cli/decryptWallet.go new file mode 100755 index 0000000..3282692 --- /dev/null +++ b/src/cli/decryptWallet.go @@ -0,0 +1,96 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func decryptWalletCmd(cfg Config) gcli.Command { + name := "decryptWallet" + return gcli.Command{ + Name: name, + Usage: "Decrypt wallet", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + + wlt, err := decryptWallet(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + printJSON(wallet.NewReadableWallet(wlt)) + return nil + }, + } +} + +func decryptWallet(walletFile string, pr PasswordReader) (*wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if !wlt.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + unlockedWlt, err := wlt.Unlock(password) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := unlockedWlt.Save(dir); err != nil { + return nil, WalletLoadError{err} + } + + return unlockedWlt, nil +} diff --git a/src/cli/encrypt_wallet.go b/src/cli/encrypt_wallet.go new file mode 100755 index 0000000..321fa1f --- /dev/null +++ b/src/cli/encrypt_wallet.go @@ -0,0 +1,107 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func encryptWalletCmd(cfg Config) gcli.Command { + name := "encryptWallet" + return gcli.Command{ + Name: name, + Usage: "Encrypt wallet", + ArgsUsage: " ", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + gcli.StringFlag{ + Name: "x,crypto-type", + Value: string(wallet.CryptoTypeScryptChacha20poly1305), + Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) + if err != nil { + errorWithHelp(c, err) + return nil + } + + pr := NewPasswordReader([]byte(c.String("p"))) + + wlt, err := encryptWallet(w, pr, cryptoType) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + printJSON(wallet.NewReadableWallet(wlt)) + return nil + }, + } +} + +func encryptWallet(walletFile string, pr PasswordReader, cryptoType wallet.CryptoType) (*wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + if err := wlt.Lock(password, cryptoType); err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wlt.Save(dir); err != nil { + return nil, WalletLoadError{err} + } + + return wlt, nil +} diff --git a/src/api/cli/generate_addrs.go b/src/cli/generate_addrs.go similarity index 100% rename from src/api/cli/generate_addrs.go rename to src/cli/generate_addrs.go diff --git a/src/cli/generate_wallet.go b/src/cli/generate_wallet.go new file mode 100755 index 0000000..d0a6ca4 --- /dev/null +++ b/src/cli/generate_wallet.go @@ -0,0 +1,252 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/go-bip39" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +const ( + // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes + AlphaNumericSeedLength = 64 +) + +func generateWalletCmd(cfg Config) gcli.Command { + name := "generateWallet" + return gcli.Command{ + Name: "generateWallet", + Usage: "Generate a new wallet", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Description: fmt.Sprintf(`The default wallet (%s) will + be created if no wallet and address was specified. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command. + + All results are returned in JSON format.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.BoolFlag{ + Name: "r", + Usage: "A random alpha numeric seed will be generated for you", + }, + gcli.BoolFlag{ + Name: "rd", + Usage: "A random seed consisting of 12 dictionary words will be generated for you", + }, + gcli.StringFlag{ + Name: "s", + Usage: "Your seed", + }, + gcli.UintFlag{ + Name: "n", + Value: 1, + Usage: `[numberOfAddresses] Number of addresses to generate + By default 1 address is generated.`, + }, + gcli.StringFlag{ + Name: "f", + Value: cfg.WalletName, + Usage: `[walletName] Name of wallet. The final format will be "yourName.wlt". + If no wallet name is specified a generic name will be selected.`, + }, + gcli.StringFlag{ + Name: "l", + Usage: "[label] Label used to idetify your wallet.", + }, + gcli.BoolFlag{ + Name: "e,encrypt", + Usage: `Whether creates wallet with encryption `, + }, + gcli.StringFlag{ + Name: "x,crypto-type", + Value: string(wallet.CryptoTypeScryptChacha20poly1305), + Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + }, + Action: generateWalletHandler, + } +} + +func generateWalletHandler(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // create wallet dir if not exist + if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { + if err := os.MkdirAll(cfg.WalletDir, 0755); err != nil { + return errors.New("create dir failed") + } + } + + // get wallet name + wltName := c.String("f") + + // check if the wallet name has wlt extension. + if !strings.HasSuffix(wltName, ".wlt") { + return ErrWalletName + } + + // wallet file should not be a path. + if filepath.Base(wltName) != wltName { + return fmt.Errorf("wallet file name must not contain path") + } + + // check if the wallet file does exist + if _, err := os.Stat(filepath.Join(cfg.WalletDir, wltName)); err == nil { + return fmt.Errorf("%v already exist", wltName) + } + + // check if the wallet dir does exist. + if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { + return err + } + + // get number of address that are need to be generated, if m is 0, set to 1. + num := c.Uint64("n") + if num == 0 { + return errors.New("-n must > 0") + } + + // get label + label := c.String("l") + + // get seed + s := c.String("s") + r := c.Bool("r") + rd := c.Bool("rd") + + encrypt := c.Bool("e") + + sd, err := makeSeed(s, r, rd) + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + switch pr.(type) { + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return err + } + + if !encrypt && len(p) != 0 { + return errors.New("password should not be set as we're not going to create a wallet with encryption") + } + } + + var password []byte + if encrypt { + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + + opts := wallet.Options{ + Label: label, + Seed: sd, + Encrypt: encrypt, + CryptoType: cryptoType, + Password: []byte(password), + } + + wlt, err := GenerateWallet(wltName, opts, num) + if err != nil { + return err + } + + if err := wlt.Save(cfg.WalletDir); err != nil { + return err + } + + return printJSON(wallet.NewReadableWallet(wlt)) +} + +func makeSeed(s string, r, rd bool) (string, error) { + if s != "" { + // 111, 101, 110 + if r || rd { + return "", errors.New("seed already specified, must not use -r or -rd again") + } + // 100 + return s, nil + } + + // 011 + if r && rd { + return "", errors.New("for -r and -rd, only one option can be used") + } + + // 010 + if r { + return MakeAlphanumericSeed(), nil + } + + // 001, 000 + return bip39.NewDefaultMnemonic() +} + +// PUBLIC + +// GenerateWallet generates a new wallet with filename walletFile, label, seed and number of addresses. +// Caller should save the wallet file to its chosen directory +func GenerateWallet(walletFile string, opts wallet.Options, numAddrs uint64) (*wallet.Wallet, error) { + walletFile = filepath.Base(walletFile) + + wlt, err := wallet.NewWallet(walletFile, wallet.Options{ + Seed: opts.Seed, + Label: opts.Label, + }) + if err != nil { + return nil, err + } + + if numAddrs > 1 { + if _, err := wlt.GenerateAddresses(numAddrs - 1); err != nil { + return nil, err + } + } + + if !opts.Encrypt { + if len(opts.Password) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + + return wlt, nil + } + + if err := wlt.Lock(opts.Password, opts.CryptoType); err != nil { + return nil, err + } + + return wlt, nil +} + +// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it +func MakeAlphanumericSeed() string { + seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) + return hex.EncodeToString(seedRaw[:]) +} diff --git a/src/gui/integration/empty.go b/src/cli/integration/empty.go similarity index 100% rename from src/gui/integration/empty.go rename to src/cli/integration/empty.go diff --git a/src/cli/integration/integration_test.go b/src/cli/integration/integration_test.go new file mode 100755 index 0000000..05a92a6 --- /dev/null +++ b/src/cli/integration/integration_test.go @@ -0,0 +1,2692 @@ +// package integration_test implements CLI integration tests +package integration_test + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "path/filepath" + "reflect" + "strconv" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cli" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + binaryName = "skycoin-cli" + + testModeStable = "stable" + testModeLive = "live" + + // Number of random transactions of live transaction test. + randomLiveTransactionNum = 500 + + testFixturesDir = "testdata" + + stableWalletName = "integration-test.wlt" + stableEncryptWalletName = "integration-test-encrypted.wlt" +) + +var ( + binaryPath string + + update = flag.Bool("update", false, "update golden files") + liveTxFull = flag.Bool("live-tx-full", false, "run live transaction test against full blockchain") + testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + + cryptoTypes = []wallet.CryptoType{wallet.CryptoTypeScryptChacha20poly1305, wallet.CryptoTypeSha256Xor} +) + +type TestData struct { + actual interface{} + expected interface{} +} + +func init() { + rand.Seed(time.Now().Unix()) +} + +// Do setup and teardown here. +func TestMain(m *testing.M) { + abs, err := filepath.Abs(binaryName) + if err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("get binary name absolute path failed: %v\n", err)) + os.Exit(1) + } + + binaryPath = abs + + // Build cli binary file. + args := []string{"build", "-o", binaryPath, "../../../cmd/cli/cli.go"} + if err := exec.Command("go", args...).Run(); err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("Make %v binary failed: %v\n", binaryName, err)) + os.Exit(1) + } + + ret := m.Run() + + // Remove the generated cli binary file. + if err := os.Remove(binaryPath); err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("Delete %v failed: %v", binaryName, err)) + os.Exit(1) + } + + os.Exit(ret) +} + +func createUnencryptedWallet(t *testing.T) (string, func()) { + return createTempWallet(t, false) +} + +func createEncryptedWallet(t *testing.T) (string, func()) { // nolint: unparam + return createTempWallet(t, true) +} + +// createTempWallet creates a temporary dir, and if encrypt is true, copy +// the testdata/$stableEncryptedWalletName file to the dir. If it's false, then +// copy the testdata/$stableWalletName file to the dir +// returns the temporary wallet path, cleanup callback function, and error if any. +func createTempWallet(t *testing.T, encrypt bool) (string, func()) { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + + // Copy the testdata/$stableWalletName to the temporary dir. + var wltName string + if encrypt { + wltName = stableEncryptWalletName + } else { + wltName = stableWalletName + } + + walletPath := filepath.Join(dir, wltName) + f, err := os.Create(walletPath) + require.NoError(t, err) + + defer f.Close() + + rf, err := os.Open(filepath.Join(testFixturesDir, wltName)) + require.NoError(t, err) + + defer rf.Close() + io.Copy(f, rf) + + originalWalletDirEnv := os.Getenv("WALLET_DIR") + originalWalletNameEnv := os.Getenv("WALLET_NAME") + + os.Setenv("WALLET_DIR", dir) + os.Setenv("WALLET_NAME", wltName) + + fun := func() { + os.Setenv("WALLET_DIR", originalWalletDirEnv) + os.Setenv("WALLET_NAME", originalWalletNameEnv) + + // Delete the temporary dir + os.RemoveAll(dir) + } + + return walletPath, fun +} + +// createTempWalletDir creates a temporary wallet dir, +// sets the WALLET_DIR environment variable. +// Returns wallet dir path and callback function to clean up the dir. +func createTempWalletDir(t *testing.T) func() { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + os.Setenv("WALLET_DIR", dir) + + return func() { + os.Setenv("WALLET_DIR", "") + os.RemoveAll(dir) + } +} + +func loadJSON(t *testing.T, filename string, obj interface{}) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(obj) + require.NoError(t, err) +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + checkGoldenFileObjectChanges(t, goldenFile, td) +} + +func checkGoldenFileObjectChanges(t *testing.T, goldenFile string, td TestData) { + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + require.Equal(t, string(c), string(b)+"\n", "json struct output differs from golden file, was a field added to the struct?") +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, testModeStable: + default: + t.Fatal("Invalid test mode, must be stable or live") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +// requireWalletDir checks if the WALLET_DIR environment value is set +func requireWalletDir(t *testing.T) { + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } +} + +// requireWalletEnv checks if the WALLET_DIR and WALLET_NAME environment value are set +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } +} + +// getWalletPathFromEnv gets wallet file path from environment variables +func getWalletPathFromEnv(t *testing.T) (string, string) { + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } + + return walletDir, walletName +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func rpcAddress() string { + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = "http://127.0.0.1:6420" + } + + return rpcAddr +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func TestGenerateAddresses(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + encrypted bool + args []string + isUsageErr bool + expectOutput []byte + goldenFile string + }{ + { + name: "generateAddresses", + encrypted: false, + args: []string{"generateAddresses"}, + expectOutput: []byte("7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\n"), + goldenFile: "generate-addresses.golden", + }, + { + name: "generateAddresses -n 2 -j", + encrypted: false, + args: []string{"generateAddresses", "-n", "2", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\",\n \"2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV\"\n ]\n}\n"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "generateAddresses -n -2 -j", + encrypted: false, + args: []string{"generateAddresses", "-n", "-2", "-j"}, + isUsageErr: true, + expectOutput: []byte("Error: invalid value \"-2\" for flag -n: strconv.ParseUint: parsing \"-2\": invalid syntax"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "generateAddresses in encrypted wallet", + encrypted: true, + args: []string{"generateAddresses", "-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\"\n ]\n}\n"), + goldenFile: "generate-addresses-encrypted.golden", + }, + { + name: "generateAddresses in encrypted wallet with invalid password", + encrypted: true, + args: []string{"generateAddresses", "-p", "invalid password", "-j"}, + expectOutput: []byte("invalid password\n"), + }, + { + name: "generateAddresses in unencrypted wallet with password", + encrypted: false, + args: []string{"generateAddresses", "-p", "pwd"}, + expectOutput: []byte("wallet is not encrypted\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletPath, clean := createTempWallet(t, tc.encrypted) + defer clean() + + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.isUsageErr { + require.True(t, bytes.Contains(output, tc.expectOutput)) + return + } + + require.Equal(t, tc.expectOutput, output) + + require.NoError(t, err) + + var w wallet.ReadableWallet + loadJSON(t, walletPath, &w) + + // Use loadJSON instead of loadGoldenFile because this golden file + // should not use the *update flag + goldenFile := filepath.Join(testFixturesDir, tc.goldenFile) + var expect wallet.ReadableWallet + loadJSON(t, goldenFile, &expect) + if tc.encrypted { + // wips secrets as it's not stable + expect.Meta["secrets"] = "" + w.Meta["secrets"] = "" + } + require.Equal(t, expect, w) + }) + } +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + addr string + err error + errMsg string + }{ + { + "valid skycoin address", + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + nil, + "", + }, + { + "invalid skycoin address", + "2KG9eRXUhx6hrDZvNGB99DKahtrPDQ1W9vn", + errors.New("exit status 1"), + "Invalid checksum", + }, + { + "invalid bitcoin address", + "1Dcb9gpaZpBKmjqjCsiBsP3sBW1md2kEM2", + errors.New("exit status 1"), + "Invalid checksum", + }, + } + + for _, tc := range tt { + output, err := exec.Command(binaryPath, "verifyAddress", tc.addr).CombinedOutput() + if err != nil { + require.Equal(t, tc.err.Error(), err.Error()) + require.Equal(t, tc.errMsg, strings.Trim(string(output), "\n")) + return + } + + require.Empty(t, output) + } +} + +func TestDecodeRawTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + rawTx string + goldenFile string + errMsg []byte + }{ + { + name: "success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + goldenFile: "decode-raw-transaction.golden", + }, + { + name: "invalid raw transaction", + rawTx: "2601000000a1d", + errMsg: []byte("invalid raw transaction: encoding/hex: odd length hex string\nencoding/hex: odd length hex string\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "decodeRawTransaction", tc.rawTx).CombinedOutput() + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + if bytes.Contains(output, []byte("Error: ")) { + require.Equal(t, tc.errMsg, string(output)) + return + } + + var txn visor.TransactionJSON + err = json.NewDecoder(bytes.NewReader(output)).Decode(&txn) + require.NoError(t, err) + + var expect visor.TransactionJSON + checkGoldenFile(t, tc.goldenFile, TestData{txn, &expect}) + }) + } + +} + +func TestAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + outputCheck func(t *testing.T, output []byte) + }{ + { + "addressGen", + []string{"addressGen"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + }, + }, + { + "addressGen --count 2", + []string{"addressGen", "--count", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + require.Len(t, w.Entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + addr := cipher.AddressFromSecKey(key) + require.Equal(t, addr.String(), w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, key.Hex(), w.Entries[i].Secret) + } + }, + }, + { + "addressGen -c 2", + []string{"addressGen", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + require.Len(t, w.Entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + addr := cipher.AddressFromSecKey(key) + require.Equal(t, addr.String(), w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, key.Hex(), w.Entries[i].Secret) + } + }, + }, + { + "addressGen --hide-secret -c 2", + []string{"addressGen", "--hide-secret", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.Entries, 2) + for _, e := range w.Entries { + require.Equal(t, e.Secret, "") + } + }, + }, + { + "addressGen -s -c 2", + []string{"addressGen", "-s", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.Entries, 2) + for _, e := range w.Entries { + require.Equal(t, e.Secret, "") + } + }, + }, + { + "addressGen --bitcoin -c 2", + []string{"addressGen", "--bitcoin", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "bitcoin", w.Meta["coin"]) + + require.Len(t, w.Entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Meta["seed"] + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubkey(pk) + require.Equal(t, address, w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, sk, w.Entries[i].Secret) + } + }, + }, + { + "addressGen -b -c 2", + []string{"addressGen", "-b", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "bitcoin", w.Meta["coin"]) + + require.Len(t, w.Entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Meta["seed"] + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubkey(pk) + require.Equal(t, address, w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, sk, w.Entries[i].Secret) + } + }, + }, + { + "addressGen --hex", + []string{"addressGen", "--hex"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + }, + }, + { + "addressGen -x", + []string{"addressGen", "-x"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + }, + }, + { + "addressGen --only-addr", + []string{"addressGen", "--only-addr"}, + func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + "addressGen --oa", + []string{"addressGen", "--oa"}, + func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + "addressGen --seed=123", + []string{"addressGen", "--seed", "123"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.GenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + require.Len(t, w.Entries, 1) + require.Equal(t, addr.String(), w.Entries[0].Address) + require.Equal(t, pk.Hex(), w.Entries[0].Public) + require.Equal(t, sk.Hex(), w.Entries[0].Secret) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + tc.outputCheck(t, output) + }) + } +} + +func TestStableListWallets(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() + require.NoError(t, err) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + + var expect struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + checkGoldenFile(t, "list-wallets.golden", TestData{wlts, &expect}) +} + +func TestLiveListWallets(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletDir(t) + + output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() + require.NoError(t, err) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + require.NotEmpty(t, wlts.Wallets) +} + +func TestStableListAddress(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + var expect struct { + Addresses []string `json:"addresses"` + } + checkGoldenFile(t, "list-addresses.golden", TestData{wltAddresses, &expect}) +} + +func TestLiveListAddresses(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + require.NotEmpty(t, wltAddresses.Addresses) +} + +func TestStableAddressBalance(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "address-balance.golden", TestData{addrBalance, &expect}) +} + +func TestLiveAddressBalance(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "wallet-balance.golden", TestData{wltBalance, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + require.NotEmpty(t, wltBalance.Confirmed.Coins) + require.NotEmpty(t, wltBalance.Addresses) +} + +func TestStableWalletOutputs(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + var expect webrpc.OutputsResult + checkGoldenFile(t, "wallet-outputs.golden", TestData{wltOutput, &expect}) +} + +func TestLiveWalletOutputs(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + require.NotEmpty(t, wltOutput.Outputs.HeadOutputs) +} + +func TestStableAddressOutputs(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + err error + errMsg string + }{ + { + name: "addressOutputs one address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "address-outputs.golden", + }, + { + name: "addressOutputs two address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}, + goldenFile: "two-addresses-outputs.golden", + }, + { + name: "addressOutputs two address one invalid", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "badaddress"}, + err: errors.New("exit status 1"), + errMsg: "invalid address: badaddress, err: Invalid address length\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(output)) + return + } + + require.NoError(t, err) + + var addrOutputs webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + + var expect webrpc.OutputsResult + checkGoldenFile(t, tc.goldenFile, TestData{addrOutputs, &expect}) + }) + } +} + +func TestLiveAddressOutputs(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrOutputs webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) +} + +func TestStableShowConfig(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // WalletDir and DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.WalletDir) + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) + + ret.WalletDir = "IGNORED/.skycoin/wallets" + ret.DataDir = "IGNORED/.skycoin" + + goldenFile := "show-config.golden" + if useCSRF(t) { + goldenFile = "show-config-use-csrf.golden" + } + + var expect cli.Config + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveShowConfig(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // WalletDir and DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.WalletDir) + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + walletName = "skycoin_cli.wlt" + } + require.Equal(t, walletName, ret.WalletName) + require.NotEmpty(t, ret.WalletName) + + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + require.Equal(t, coin, ret.Coin) + + require.Equal(t, rpcAddress(), ret.RPCAddress) + + require.Equal(t, useCSRF(t), ret.UseCSRF) +} + +func TestStableStatus(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // TimeSinceLastBlock is not stable + ret.TimeSinceLastBlock = "" + + goldenFile := "status.golden" + if useCSRF(t) { + goldenFile = "status-use-csrf.golden" + } + + var expect cli.StatusResult + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) + +} + +func TestLiveStatus(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + require.True(t, ret.Running) + require.Equal(t, rpcAddress(), ret.RPCAddress) + require.Equal(t, useCSRF(t), ret.UseCSRF) +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + err error + errMsg string + goldenFile string + }{ + { + name: "invalid txid", + args: []string{"abcd"}, + err: errors.New("exit status 1"), + errMsg: "invalid txid\n", + goldenFile: "", + }, + { + name: "not exist", + args: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: errors.New("exit status 1"), + errMsg: "transaction doesn't exist [code: -32600]\n", + goldenFile: "", + }, + { + name: "empty txid", + args: []string{""}, + err: errors.New("exit status 1"), + errMsg: "txid is empty\n", + goldenFile: "", + }, + { + name: "genesis transaction", + args: []string{"d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add"}, + err: nil, + errMsg: "", + goldenFile: "genesis-transaction-cli.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + args := append([]string{"transaction"}, tc.args...) + o, err := exec.Command(binaryPath, args...).CombinedOutput() + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(o)) + return + } + + require.NoError(t, err) + + // Decode the output into visor.TransactionJSON + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect webrpc.TxnResult + checkGoldenFile(t, tc.goldenFile, TestData{tx, &expect}) + }) + } + + scanTransactions(t, true) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + o, err := exec.Command(binaryPath, "transaction", "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add").CombinedOutput() + require.NoError(t, err) + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect webrpc.TxnResult + + loadGoldenFile(t, "genesis-transaction.golden", TestData{tx, &expect}) + require.Equal(t, expect.Transaction.Transaction, tx.Transaction.Transaction) + + scanTransactions(t, *liveTxFull) + + // scan pending transactions + scanPendingTransactions(t) +} + +// cli doesn't have command to querying pending transactions yet. +func scanPendingTransactions(t *testing.T) { +} + +// scanTransactions scans transactions against blockchain. +// If fullTest is true, scan the whole blockchain, and test every transactions, +// otherwise just test random transactions. +func scanTransactions(t *testing.T, fullTest bool) { + // Gets blockchain height through "status" command + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + var status struct { + webrpc.StatusResult + RPCAddress string `json:"webrpc_address"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&status) + require.NoError(t, err) + + txids := getTxids(t, status.BlockNum) + + l := len(txids) + if !fullTest && l > randomLiveTransactionNum { + txidMap := make(map[string]struct{}) + var ids []string + for len(txidMap) < randomLiveTransactionNum { + // get random txid + txid := txids[rand.Intn(l)] + if _, ok := txidMap[txid]; !ok { + ids = append(ids, txid) + txidMap[txid] = struct{}{} + } + } + + // reassign the txids + txids = ids + } + + checkTransactions(t, txids) +} + +func checkTransactions(t *testing.T, txids []string) { + // Start goroutines to check transactions + var wg sync.WaitGroup + txC := make(chan string, 500) + nReq := 4 + if useCSRF(t) { + nReq = 1 + } + for i := 0; i < nReq; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case txid, ok := <-txC: + if !ok { + return + } + + t.Run(fmt.Sprintf("%v", txid), func(t *testing.T) { + o, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() + require.NoError(t, err) + var txRlt webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&txRlt) + require.NoError(t, err) + require.Equal(t, txid, txRlt.Transaction.Transaction.Hash) + require.True(t, txRlt.Transaction.Status.Confirmed) + }) + } + } + }() + } + + for _, txid := range txids { + txC <- txid + } + close(txC) + + wg.Wait() +} + +func getTxids(t *testing.T, blockNum uint64) []string { + // p represents the number of blocks that each time we query, + // do not get all blocks in one query, which might run out of + // memory when blockchain becomes very huge. + p := 500 + n := int(blockNum / uint64(p)) + + // Collects all transactions' id + var txids []string + for i := 0; i < int(n); i++ { + txids = append(txids, getTxidsInBlocks(t, i*p+1, (i+1)*p)...) + } + + if (blockNum % uint64(p)) > 0 { + txids = append(txids, getTxidsInBlocks(t, n*p+1, int(blockNum)-1)...) + } + + return txids +} + +func getTxidsInBlocks(t *testing.T, start, end int) []string { + s := strconv.Itoa(start) + e := strconv.Itoa(end) + o, err := exec.Command(binaryPath, "blocks", s, e).CombinedOutput() + require.NoError(t, err) + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(o)).Decode(&blocks) + require.NoError(t, err) + require.Len(t, blocks.Blocks, end-start+1) + + var txids []string + for _, b := range blocks.Blocks { + for _, tx := range b.Body.Transactions { + txids = append(txids, tx.Hash) + } + } + return txids +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) + + // Tests blocks 180~181, should only return block 180. + output, err := exec.Command(binaryPath, "blocks", "180", "181").CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, "blocks180.golden", TestData{blocks, &expect}) +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []int{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + for _, seq := range blockSeqs { + output, err := exec.Command(binaryPath, "blocks", strconv.Itoa(seq)).CombinedOutput() + require.NoError(t, err) + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + } +} + +func testKnownBlocks(t *testing.T) { + tt := []struct { + name string + args []string + goldenFile string + }{ + { + "blocks 0", + []string{"blocks", "0"}, + "block0.golden", + }, + { + "blocks 0 5", + []string{"blocks", "0", "5"}, + "blocks0-5.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } + + scanBlocks(t, "0", "180") +} + +func scanBlocks(t *testing.T, start, end string) { // nolint: unparam + outputs, err := exec.Command(binaryPath, "blocks", start, end).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(outputs)).Decode(&blocks) + require.NoError(t, err) + + var preBlocks visor.ReadableBlock + preBlocks.Head.BlockHash = "0000000000000000000000000000000000000000000000000000000000000000" + for _, b := range blocks.Blocks { + require.Equal(t, b.Head.PreviousBlockHash, preBlocks.Head.BlockHash) + preBlocks = b + } +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + errMsg []byte + }{ + { + name: "lastBlocks 0", + args: []string{"lastBlocks", "0"}, + goldenFile: "last-blocks0.golden", + }, + { + name: "lastBlocks 1", + args: []string{"lastBlocks", "1"}, + goldenFile: "last-blocks1.golden", + }, + { + name: "lastBlocks 2", + args: []string{"lastBlocks", "2"}, + goldenFile: "last-blocks2.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + + if bytes.Contains(output, []byte("Error: ")) { + fmt.Println(string(output)) + require.Equal(t, string(tc.errMsg), string(output)) + return + } + + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + + tt := []struct { + name string + args []string + }{ + { + "lastBlocks 0", + []string{"lastBlocks", "0"}, + }, + { + "lastBlocks 1", + []string{"lastBlocks", "1"}, + }, + { + "lastBlocks 2", + []string{"lastBlocks", "2"}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + }) + } +} + +func TestStableWalletDir(t *testing.T) { + if !doStable(t) { + return + } + + walletPath, clean := createUnencryptedWallet(t) + defer clean() + + dir := filepath.Dir(walletPath) + output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() + require.NoError(t, err) + require.Equal(t, dir, strings.TrimRight(string(output), "\n")) +} + +func TestLiveWalletDir(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletDir(t) + + walletDir := os.Getenv("WALLET_DIR") + output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() + require.NoError(t, err) + + require.Equal(t, walletDir, strings.Trim(string(output), "\n")) +} + +// TestLiveSend sends coin from specific wallet file, user should manually specify the +// wallet file by setting the enviroment variables: WALLET_DIR and WALLET_NAME. The WALLET_DIR +// points to the directory of the wallet, and WALLET_NAME represents the wallet file name. +// +// Note: +// 1. This test might modify the wallet file, in order to avoid losing coins, we don't send coins to +// addresses that are not belong to the wallet, when addresses in the wallet are not sufficient, we +// will automatically generate enough addresses as coin recipient. +// 2. The wallet must must have at least 2 coins and 16 coinhours. +func TestLiveSend(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 16) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"send", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"send", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 1) + // Confirms the third address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[2].Address.String(), 5e5, 1) + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.001 coin from the third address to the second address. + // Set the second as change address, so the 0.499 change coin will also be sent to the second address. + // After sending, the second address should have 1 coin and 1 coin hour. + name: "send with -c(change address) -a(from address) options", + args: func() []string { + return []string{"send", "-c", w.Entries[1].Address.String(), + "-a", w.Entries[2].Address.String(), w.Entries[1].Address.String(), "0.001"} + }, + checkTx: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 0 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 0) + // Confirms the second address have 1 coin and 1 coin hour + coins, hours := getAddressBalance(t, w.Entries[1].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(1), hours) + }, + }, + { + // Send 1 coin from second to the the third address, this will spend three outputs(0.2, 0.3. 0.5 coin), + // and burn out the remaining 1 coin hour. + name: "send to burn all coin hour", + args: func() []string { + return []string{"send", "-a", w.Entries[1].Address.String(), + w.Entries[2].Address.String(), "1"} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms that the third address has 1 coin and 0 coin hour + coins, hours := getAddressBalance(t, w.Entries[2].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(0), hours) + }, + }, + { + // Send with 0 coin hour, this test should fail. + name: "send 0 coin hour", + args: func() []string { + return []string{"send", "-a", w.Entries[2].Address.String(), + w.Entries[1].Address.String(), "1"} + }, + errMsg: []byte("Error: Transaction has zero coinhour fee. See 'skycoin-cli send --help'"), + checkTx: func(t *testing.T, txid string) {}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // output: "txid:$txid_string" + // split the output to get txid value + v := bytes.Split(output, []byte(":")) + require.Len(t, v, 2) + txid := string(v[1]) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } + + // Send with too small decimal value + // CLI send is a litte bit slow, almost 300ms each. so we only test 20 invalid decimal coin. + errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli send --help'") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "send", w.Entries[0].Address.String(), v).CombinedOutput() + require.NoError(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, output) + }) + } +} + +// TestLiveCreateAndBroadcastRawTransaction does almost the same procedure as TestLiveSend. +// Create raw transaction with command arguments the same as TestLiveSend, then broadcast the +// created raw transaction. After the transaction is confirmed, run the same transaction check +// function like in TestLiveSend. +func TestLiveCreateAndBroadcastRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast transaction + output, err = exec.Command(binaryPath, "broadcastTransaction", string(output)).CombinedOutput() + require.NoError(t, err) + + txid := string(bytes.TrimRight(output, "\n")) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } + + // Send with too small decimal value + errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli createRawTransaction --help'") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "createRawTransaction", w.Entries[0].Address.String(), v).CombinedOutput() + require.NoError(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, output) + }) + } +} + +func getTransaction(t *testing.T, txid string) *webrpc.TxnResult { + output, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() + if err != nil { + fmt.Println(string(output)) + return &webrpc.TxnResult{} + } + require.NoError(t, err) + + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&tx) + require.NoError(t, err) + + return &tx +} + +func isTxConfirmed(t *testing.T, txid string) bool { + tx := getTransaction(t, txid) + require.NotNil(t, tx) + return tx.Transaction.Status.Confirmed +} + +// checkCoinhours checks if the address coinhours in transaction are correct +func checkCoinsAndCoinhours(t *testing.T, tx *webrpc.TxnResult, addr string, coins, coinhours uint64) { // nolint: unparam + addrCoinhoursMap := make(map[string][]visor.ReadableTransactionOutput) + for _, o := range tx.Transaction.Transaction.Out { + addrCoinhoursMap[o.Address] = append(addrCoinhoursMap[o.Address], o) + } + + os, ok := addrCoinhoursMap[addr] + if !ok { + t.Fatalf("transaction doesn't have receiver of address: %v", addr) + } + + var totalCoins, totalHours uint64 + for _, o := range os { + c, err := droplet.FromString(o.Coins) + if err != nil { + t.Fatalf("%v", err) + } + totalCoins += c + totalHours += o.Hours + } + + require.Equal(t, coins, totalCoins) + require.Equal(t, coinhours, totalHours) +} + +// prepareAndCheckWallet prepares wallet for live testing. +// Returns *wallet.Wallet, total coin, total hours. +// Confirms that the wallet meets the minimal requirements of coins and coinhours. +func prepareAndCheckWallet(t *testing.T, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64) { // nolint: unparam + walletDir, walletName := getWalletPathFromEnv(t) + walletPath := filepath.Join(walletDir, walletName) + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet file: %v does not exist", walletPath) + } + + // Loads the wallet + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet failed: %v", err) + } + + if len(w.Entries) < 3 { + // Generates addresses + _, err = w.GenerateAddresses(uint64(3 - len(w.Entries))) + if err != nil { + t.Fatalf("Wallet generateAddress failed: %v", err) + } + } + + outputs := getWalletOutputs(t, walletPath) + // Confirms the wallet is not empty. + if len(outputs) == 0 { + t.Fatalf("Wallet %v has no coin", walletPath) + } + + var totalCoins uint64 + var totalCoinhours uint64 + for _, output := range outputs { + coins, err := droplet.FromString(output.Coins) + if err != nil { + t.Fatalf("%v", err) + } + + totalCoins += coins + totalCoinhours += output.CalculatedHours + } + + // Confirms the coins meet minimal coins requirement + if totalCoins < miniCoins { + t.Fatalf("Wallet must have at least %v coins", miniCoins) + } + + if totalCoinhours < miniCoinHours { + t.Fatalf("Wallet must have at least %v coinhours", miniCoinHours) + } + + if err := w.Save(walletDir); err != nil { + t.Fatalf("%v", err) + } + return w, totalCoins, totalCoinhours +} + +func getAddressBalance(t *testing.T, addr string) (uint64, uint64) { + output, err := exec.Command(binaryPath, "addressBalance", addr).CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + coins, err := droplet.FromString(addrBalance.Confirmed.Coins) + require.NoError(t, err) + + hours, err := strconv.ParseUint(addrBalance.Confirmed.Hours, 10, 64) + require.NoError(t, err) + return coins, hours +} + +func getWalletOutputs(t *testing.T, walletPath string) visor.ReadableOutputs { + output, err := exec.Command(binaryPath, "walletOutputs", walletPath).CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + return wltOutput.Outputs.HeadOutputs +} + +func TestStableWalletHistory(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() + require.NoError(t, err) + + var history []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&history) + require.NoError(t, err) + + var expect []cli.AddrHistory + checkGoldenFile(t, "wallet-history.golden", TestData{history, &expect}) +} + +func TestLiveWalletHistory(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() + require.NoError(t, err) + var his []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&his) + require.NoError(t, err) +} + +func TestStableCheckDB(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + dbPath string + result string + errMsg string + }{ + { + name: "no signature", + dbPath: "../../visor/testdata/data.db.nosig", + errMsg: "checkdb failed: Signature not found for block seq=1000 hash=71852c1a8ab5e470bd14e5fce8e1116697151181a188d4262b545542fb3d526c\n", + }, + { + name: "invalid database", + dbPath: "../../visor/testdata/data.db.garbage", + errMsg: "open db failed: invalid database\n", + }, + { + name: "valid database", + dbPath: "../../api/integration/testdata/blockchain-180.db", + result: "check db success\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "checkdb", tc.dbPath).CombinedOutput() + if err != nil { + fmt.Println(string(output)) + require.Equal(t, tc.errMsg, string(output)) + return + } + require.NoError(t, err) + require.Equal(t, tc.result, string(output)) + }) + } +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // Gets version in json format. + output, err := exec.Command(binaryPath, "version", "-j").CombinedOutput() + require.NoError(t, err) + + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{} + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ver) + require.NoError(t, err) + require.True(t, ver.Skycoin != "") + require.True(t, ver.Cli != "") + require.True(t, ver.RPC != "") + require.True(t, ver.Wallet != "") + + // Gets version without json format. + output, err = exec.Command(binaryPath, "version").CombinedOutput() + require.NoError(t, err) + + // Confirms the result contains 4 version componments + output = bytes.TrimRight(output, "\n") + vers := bytes.Split(output, []byte("\n")) + require.Len(t, vers, 4) +} + +func TestStableGenerateWallet(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "generate wallet with -r option", + args: []string{"-r"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + + // Confirms the seed is a valid hex string + _, err := hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with --rd option", + args: []string{"--rd"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + + // Confirms the seed is consisited of 12 words + seed := w.Meta["seed"] + words := strings.Split(seed, " ") + require.Len(t, words, 12) + + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with -s option", + args: []string{"-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Meta["seed"]) + require.Equal(t, "2amA8sxKJhNRp3wfWrE5JfTEUjr9S3C2BaU", w.Entries[0].Address.String()) + require.Equal(t, "02b4a4b63f2f8ba56f9508712815eca3c088693333715eaf7a73275d8928e1be5a", w.Entries[0].Public.Hex()) + require.Equal(t, "f4a281d094a6e9e95a84c23701a7d01a0e413c838758e94ad86a10b9b83e0434", w.Entries[0].Secret.Hex()) + }, + }, + { + name: "generate wallet with -n option", + args: []string{"-n", "5"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + // Confirms wallet has 5 address entries + require.Len(t, w.Entries, 5) + }, + }, + { + name: "generate wallet with -f option", + args: []string{"-f", "integration-cli.wlt"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "integration-cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with -l option", + args: []string{"-l", "integration-cli"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + label, ok := w.Meta["label"] + require.True(t, ok) + require.Equal(t, "integration-cli", label) + }, + }, + { + name: "generate wallet with duplicate wallet name", + args: []string{}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + errMsg: []byte("integration-test.wlt already exist\n"), + }, + { + name: "encrypt=true", + args: []string{"-e", "-p", "pwd"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the wallet is encrypted + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Meta["seed"]) + require.Empty(t, w.Meta["lastSeed"]) + + // Confirms the secrets in address entries are empty + for _, e := range w.Entries { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "encrypt=false password=pwd", + args: []string{"-p", "pwd"}, + setup: createTempWalletDir, + errMsg: []byte("password should not be set as we're not going to create a wallet with encryption\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + + // Run command with arguments + args := append([]string{"generateWallet"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + var rw wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rw) + require.NoError(t, err) + + // Converts to wallet.Wallet + w, err := rw.ToWallet() + require.NoError(t, err) + + // Validate the wallet + err = w.Validate() + require.NoError(t, err) + + if !w.IsEncrypted() { + // Confirms all entries and lastSeed are derived from seed. + checkWalletEntriesAndLastSeed(t, w) + } + + // Checks the wallet with provided checking method. + tc.checkWallet(t, w) + }) + } +} + +// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied +// from the seed. +func checkWalletEntriesAndLastSeed(t *testing.T, w *wallet.Wallet) { + seed, ok := w.Meta["seed"] + require.True(t, ok) + newSeed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), len(w.Entries)) + require.Len(t, seckeys, len(w.Entries)) + for i, sk := range seckeys { + require.Equal(t, w.Entries[i].Secret, sk) + pk := cipher.PubKeyFromSecKey(sk) + require.Equal(t, w.Entries[i].Public, pk) + } + lastSeed, ok := w.Meta["lastSeed"] + require.True(t, ok) + require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) +} + +// TestLiveGUIInjectTransaction does almost the same procedure as TestCreateAndBroadcastRawTransaction. +// The only difference is we broadcast the raw transaction throught the gui /injectTransaction api. +func TestLiveGUIInjectTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(rpcAddress()) + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast raw transaction with gui /injectTransaction + txid, err := c.InjectTransaction(string(output)) + require.NoError(t, err) + + txid = strings.TrimRight(txid, "\n") + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Meta["seed"]) + require.Empty(t, w.Meta["lastSeed"]) + + // Confirms that secrets in address entries are empty + for _, e := range w.Entries { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + errMsg: []byte("wallet is encrypted\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + for _, ct := range cryptoTypes { + name := fmt.Sprintf("name=%v crypto type=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"encryptWallet", "-x", string(ct)}, tc.args[:]...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + + var rlt wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) + require.NoError(t, err) + w, err := rlt.ToWallet() + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.False(t, w.IsEncrypted()) + require.Empty(t, w.Meta["cryptoType"]) + require.Empty(t, w.Meta["secrets"]) + require.NotEmpty(t, w.Meta["seed"]) + require.NotEmpty(t, w.Meta["lastSeed"]) + + for _, e := range w.Entries { + require.NotEqual(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + errMsg: []byte("wallet is not encrypted\n"), + }, + { + name: "invalid password", + args: []string{"-p", "wrong password"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + errMsg: []byte("invalid password\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"decryptWallet"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + + var rlt wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) + require.NoError(t, err) + + w, err := rlt.ToWallet() + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } +} + +func TestShowSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errWithHelp bool + errMsg []byte + expectOutput []byte + }{ + { + name: "unencrypted wallet", + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "unencrypted wallet with -j option", + args: []string{"-j"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "pwd"}, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "encrypted wallet with -j option", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet with invalid password", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "wrong password"}, + expectOutput: []byte("invalid password"), + }, + { + name: "wallet doesn't exist", + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + expectOutput: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"showSeed"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + require.Equal(t, tc.expectOutput, output) + }) + } +} diff --git a/src/api/cli/integration/test-fixtures/address-balance.golden b/src/cli/integration/testdata/address-balance.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/address-balance.golden rename to src/cli/integration/testdata/address-balance.golden diff --git a/src/api/cli/integration/test-fixtures/address-outputs.golden b/src/cli/integration/testdata/address-outputs.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/address-outputs.golden rename to src/cli/integration/testdata/address-outputs.golden diff --git a/src/api/cli/integration/test-fixtures/block0.golden b/src/cli/integration/testdata/block0.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/block0.golden rename to src/cli/integration/testdata/block0.golden diff --git a/src/api/cli/integration/test-fixtures/blocks0-5.golden b/src/cli/integration/testdata/blocks0-5.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/blocks0-5.golden rename to src/cli/integration/testdata/blocks0-5.golden diff --git a/src/api/cli/integration/test-fixtures/blocks180.golden b/src/cli/integration/testdata/blocks180.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/blocks180.golden rename to src/cli/integration/testdata/blocks180.golden diff --git a/src/api/cli/integration/test-fixtures/decode-raw-transaction.golden b/src/cli/integration/testdata/decode-raw-transaction.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/decode-raw-transaction.golden rename to src/cli/integration/testdata/decode-raw-transaction.golden diff --git a/src/api/cli/integration/test-fixtures/generate-addresses-2.golden b/src/cli/integration/testdata/generate-addresses-2.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/generate-addresses-2.golden rename to src/cli/integration/testdata/generate-addresses-2.golden diff --git a/src/api/cli/integration/test-fixtures/generate-addresses-encrypted.golden b/src/cli/integration/testdata/generate-addresses-encrypted.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/generate-addresses-encrypted.golden rename to src/cli/integration/testdata/generate-addresses-encrypted.golden diff --git a/src/api/cli/integration/test-fixtures/generate-addresses.golden b/src/cli/integration/testdata/generate-addresses.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/generate-addresses.golden rename to src/cli/integration/testdata/generate-addresses.golden diff --git a/src/cli/integration/testdata/genesis-transaction-cli.golden b/src/cli/integration/testdata/genesis-transaction-cli.golden new file mode 100755 index 0000000..0083809 --- /dev/null +++ b/src/cli/integration/testdata/genesis-transaction-cli.golden @@ -0,0 +1,29 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/src/cli/integration/testdata/genesis-transaction.golden b/src/cli/integration/testdata/genesis-transaction.golden new file mode 100755 index 0000000..0083809 --- /dev/null +++ b/src/cli/integration/testdata/genesis-transaction.golden @@ -0,0 +1,29 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/src/api/cli/integration/test-fixtures/integration-test-encrypted.wlt b/src/cli/integration/testdata/integration-test-encrypted.wlt similarity index 100% rename from src/api/cli/integration/test-fixtures/integration-test-encrypted.wlt rename to src/cli/integration/testdata/integration-test-encrypted.wlt diff --git a/src/api/cli/integration/test-fixtures/integration-test.wlt b/src/cli/integration/testdata/integration-test.wlt similarity index 100% rename from src/api/cli/integration/test-fixtures/integration-test.wlt rename to src/cli/integration/testdata/integration-test.wlt diff --git a/src/api/cli/integration/test-fixtures/last-blocks0.golden b/src/cli/integration/testdata/last-blocks0.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/last-blocks0.golden rename to src/cli/integration/testdata/last-blocks0.golden diff --git a/src/api/cli/integration/test-fixtures/last-blocks1.golden b/src/cli/integration/testdata/last-blocks1.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/last-blocks1.golden rename to src/cli/integration/testdata/last-blocks1.golden diff --git a/src/api/cli/integration/test-fixtures/last-blocks2.golden b/src/cli/integration/testdata/last-blocks2.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/last-blocks2.golden rename to src/cli/integration/testdata/last-blocks2.golden diff --git a/src/api/cli/integration/test-fixtures/list-addresses.golden b/src/cli/integration/testdata/list-addresses.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/list-addresses.golden rename to src/cli/integration/testdata/list-addresses.golden diff --git a/src/api/cli/integration/test-fixtures/list-wallets.golden b/src/cli/integration/testdata/list-wallets.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/list-wallets.golden rename to src/cli/integration/testdata/list-wallets.golden diff --git a/src/api/cli/integration/test-fixtures/show-config-use-csrf.golden b/src/cli/integration/testdata/show-config-use-csrf.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/show-config-use-csrf.golden rename to src/cli/integration/testdata/show-config-use-csrf.golden diff --git a/src/api/cli/integration/test-fixtures/show-config.golden b/src/cli/integration/testdata/show-config.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/show-config.golden rename to src/cli/integration/testdata/show-config.golden diff --git a/src/cli/integration/testdata/status-use-csrf.golden b/src/cli/integration/testdata/status-use-csrf.golden new file mode 100755 index 0000000..16d034a --- /dev/null +++ b/src/cli/integration/testdata/status-use-csrf.golden @@ -0,0 +1,8 @@ +{ + "running": true, + "num_of_blocks": 181, + "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "time_since_last_block": "", + "webrpc_address": "http://127.0.0.1:46420", + "use_csrf": true +} diff --git a/src/cli/integration/testdata/status.golden b/src/cli/integration/testdata/status.golden new file mode 100755 index 0000000..1cbd708 --- /dev/null +++ b/src/cli/integration/testdata/status.golden @@ -0,0 +1,8 @@ +{ + "running": true, + "num_of_blocks": 181, + "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "time_since_last_block": "", + "webrpc_address": "http://127.0.0.1:46420", + "use_csrf": false +} diff --git a/src/api/cli/integration/test-fixtures/two-addresses-outputs.golden b/src/cli/integration/testdata/two-addresses-outputs.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/two-addresses-outputs.golden rename to src/cli/integration/testdata/two-addresses-outputs.golden diff --git a/src/api/cli/integration/test-fixtures/wallet-balance.golden b/src/cli/integration/testdata/wallet-balance.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/wallet-balance.golden rename to src/cli/integration/testdata/wallet-balance.golden diff --git a/src/cli/integration/testdata/wallet-history.golden b/src/cli/integration/testdata/wallet-history.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/src/cli/integration/testdata/wallet-history.golden @@ -0,0 +1 @@ +[] diff --git a/src/api/cli/integration/test-fixtures/wallet-outputs.golden b/src/cli/integration/testdata/wallet-outputs.golden similarity index 100% rename from src/api/cli/integration/test-fixtures/wallet-outputs.golden rename to src/cli/integration/testdata/wallet-outputs.golden diff --git a/src/api/cli/last_blocks.go b/src/cli/last_blocks.go similarity index 100% rename from src/api/cli/last_blocks.go rename to src/cli/last_blocks.go diff --git a/src/api/cli/list_addrs.go b/src/cli/list_addrs.go similarity index 100% rename from src/api/cli/list_addrs.go rename to src/cli/list_addrs.go diff --git a/src/api/cli/list_wallets.go b/src/cli/list_wallets.go similarity index 100% rename from src/api/cli/list_wallets.go rename to src/cli/list_wallets.go diff --git a/src/api/cli/outputs.go b/src/cli/outputs.go similarity index 100% rename from src/api/cli/outputs.go rename to src/cli/outputs.go diff --git a/src/api/cli/send.go b/src/cli/send.go similarity index 100% rename from src/api/cli/send.go rename to src/cli/send.go diff --git a/src/cli/show_seed.go b/src/cli/show_seed.go new file mode 100755 index 0000000..480e285 --- /dev/null +++ b/src/cli/show_seed.go @@ -0,0 +1,111 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func showSeedCmd(cfg Config) gcli.Command { + name := "showSeed" + return gcli.Command{ + Name: name, + Usage: "Show wallet seed", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password, if encrypted", + }, + gcli.BoolFlag{ + Name: "j,json", + Usage: "Returns the results in JSON format", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + seed, err := getSeed(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + default: + return err + } + + if c.Bool("j") { + v := struct { + Seed string `json:"seed"` + }{ + Seed: seed, + } + + printJSON(v) + return nil + } + + fmt.Println(seed) + return nil + }, + } +} + +func getSeed(walletFile string, pr PasswordReader) (string, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return "", WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return "", wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return "", err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return "", wallet.ErrWalletNotEncrypted + } + } + + if !wlt.IsEncrypted() { + return wlt.Meta["seed"], nil + } + + password, err := pr.Password() + if err != nil { + return "", err + } + + var seed string + if err := wlt.GuardView(password, func(w *wallet.Wallet) error { + seed = w.Meta["seed"] + return nil + }); err != nil { + return "", err + } + + return seed, nil +} diff --git a/src/api/cli/status.go b/src/cli/status.go similarity index 100% rename from src/api/cli/status.go rename to src/cli/status.go diff --git a/src/api/cli/transaction.go b/src/cli/transaction.go similarity index 100% rename from src/api/cli/transaction.go rename to src/cli/transaction.go diff --git a/src/api/cli/verify_address.go b/src/cli/verify_address.go similarity index 100% rename from src/api/cli/verify_address.go rename to src/cli/verify_address.go diff --git a/src/api/cli/version.go b/src/cli/version.go similarity index 100% rename from src/api/cli/version.go rename to src/cli/version.go diff --git a/src/api/cli/wallet_dir.go b/src/cli/wallet_dir.go similarity index 100% rename from src/api/cli/wallet_dir.go rename to src/cli/wallet_dir.go diff --git a/src/api/cli/wallet_history.go b/src/cli/wallet_history.go similarity index 100% rename from src/api/cli/wallet_history.go rename to src/cli/wallet_history.go diff --git a/src/coin/block.go b/src/coin/block.go index 38f23dd..d40a5c7 100755 --- a/src/coin/block.go +++ b/src/coin/block.go @@ -2,15 +2,12 @@ package coin import ( "fmt" + "log" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" - - "github.com/skycoin/skycoin/src/util/logging" ) -var logger = logging.MustGetLogger("coin") - // Block represents the block struct type Block struct { Head BlockHeader @@ -148,7 +145,7 @@ func (b Block) GetTransaction(txHash cipher.SHA256) (Transaction, bool) { // NewBlockHeader creates block header func NewBlockHeader(prev BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body BlockBody) BlockHeader { if currentTime <= prev.Time { - logger.Panic("Time can only move forward") + log.Panic("Time can only move forward") } prevHash := prev.Hash() return BlockHeader{ diff --git a/src/coin/block_test.go b/src/coin/block_test.go index 3718b52..c17aa97 100755 --- a/src/coin/block_test.go +++ b/src/coin/block_test.go @@ -62,7 +62,9 @@ func TestNewBlock(t *testing.T) { // valid block is fine fee := uint64(121) currentTime := uint64(133) - b, err := NewBlock(prev, currentTime, uxHash, txns, _makeFeeCalc(fee)) + b, err := NewBlock(prev, currentTime, uxHash, txns, func(t *Transaction) (uint64, error) { + return fee, nil + }) require.NoError(t, err) assert.Equal(t, b.Body.Transactions, txns) assert.Equal(t, b.Head.Fee, fee*uint64(len(txns))) diff --git a/src/coin/coin_test.go b/src/coin/coin_test.go index a67377b..7d68430 100755 --- a/src/coin/coin_test.go +++ b/src/coin/coin_test.go @@ -2,7 +2,6 @@ package coin import ( "encoding/hex" - "math/rand" "testing" "github.com/skycoin/skycoin/src/cipher" @@ -25,12 +24,6 @@ func _feeCalc(t *Transaction) (uint64, error) { return 0, nil } -func _makeFeeCalc(fee uint64) FeeCalculator { - return func(t *Transaction) (uint64, error) { - return fee, nil - } -} - func TestAddress1(t *testing.T) { a := "02fa939957e9fc52140e180264e621c2576a1bfe781f88792fb315ca3d1786afb8" b, err := hex.DecodeString(a) @@ -112,67 +105,6 @@ func TestCrypto2(t *testing.T) { } -func _gensec() cipher.SecKey { - _, s := cipher.GenerateKeyPair() - return s -} - -func _gpub(s cipher.SecKey) cipher.PubKey { - return cipher.PubKeyFromSecKey(s) -} - -func _gaddr(s cipher.SecKey) cipher.Address { - return cipher.AddressFromSecKey(s) -} - -func _gaddrA1(S []cipher.SecKey) []cipher.Address { - A := make([]cipher.Address, len(S)) - for i := 0; i < len(S); i++ { - A[i] = cipher.AddressFromSecKey(S[i]) - } - return A -} - -func _gaddrA2(S []cipher.SecKey, O []UxOut) []int { - A := _gaddrA1(S) - var M map[cipher.Address]int //address to int - for i, a := range A { - M[a] = i - } - - I := make([]int, len(O)) //output to seckey/address index - for i, o := range O { - I[i] = M[o.Body.Address] - } - - return I -} - -func _gaddrA3(S []cipher.SecKey, O []UxOut) map[cipher.Address]int { - A := _gaddrA1(S) - M := make(map[cipher.Address]int) //address to int - for i, a := range A { - M[a] = i - } - return M -} - -//assign amt to n bins in randomized manner -func _randBins(amt uint64, n int) []uint64 { - bins := make([]uint64, n) - max := amt / (4 * uint64(n)) - for i := 0; amt > 0; i++ { - //amount going into this bin - b := 1 + (uint64(rand.Int63()) % max) - if b > amt { - b = amt - } - bins[i%n] += b - amt -= b - } - return bins -} - /* TODO: check block header of new block TODO: check that coins are not created or destroyed diff --git a/src/coin/math.go b/src/coin/math.go index f4fd386..0060dc1 100755 --- a/src/coin/math.go +++ b/src/coin/math.go @@ -32,7 +32,7 @@ func AddUint64(a, b uint64) (uint64, error) { return c, nil } -func addUint32(a, b uint32) (uint32, error) { +func addUint32(a, b uint32) (uint32, error) { //nolint: deadcode c := a + b if c < a || c < b { return 0, ErrUint32AddOverflow diff --git a/src/coin/outputs.go b/src/coin/outputs.go index b3465af..70340ec 100755 --- a/src/coin/outputs.go +++ b/src/coin/outputs.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "log" "sort" "github.com/skycoin/skycoin/src/cipher" @@ -89,7 +90,7 @@ var ErrAddEarnedCoinHoursAdditionOverflow = errors.New("UxOut.CoinHours addition // CoinHours Calculate coinhour balance of output. t is the current unix utc time. func (uo *UxOut) CoinHours(t uint64) (uint64, error) { if t < uo.Head.Time { - logger.Warning("Calculating coin hours with t < head time") + log.Printf("Calculating coin hours with t < head time") return uo.Body.Hours, nil } @@ -100,7 +101,7 @@ func (uo *UxOut) CoinHours(t uint64) (uint64, error) { wholeCoinSeconds, err := multUint64(seconds, wholeCoins) if err != nil { err := fmt.Errorf("UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=%d coins=%d uxid=%s", seconds, wholeCoins, uo.Hash().Hex()) - logger.Critical().Error(err) + log.Printf("%v", err) return 0, err } @@ -109,7 +110,7 @@ func (uo *UxOut) CoinHours(t uint64) (uint64, error) { dropletSeconds, err := multUint64(seconds, remainderDroplets) if err != nil { err := fmt.Errorf("UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=%d droplets=%d uxid=%s", seconds, remainderDroplets, uo.Hash().Hex()) - logger.Critical().Error(err) + log.Printf("%v", err) return 0, err } @@ -119,7 +120,7 @@ func (uo *UxOut) CoinHours(t uint64) (uint64, error) { coinHours := coinSeconds / 3600 // coin hours totalHours, err := AddUint64(uo.Body.Hours, coinHours) // starting+earned if err != nil { - logger.Critical().Errorf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) + log.Printf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) return 0, ErrAddEarnedCoinHoursAdditionOverflow } return totalHours, nil diff --git a/src/coin/transactions.go b/src/coin/transactions.go index b18330c..d55e164 100755 --- a/src/coin/transactions.go +++ b/src/coin/transactions.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "log" "math" "sort" @@ -146,17 +147,17 @@ func (txn *Transaction) Verify() error { func (txn Transaction) VerifyInput(uxIn UxArray) error { if DebugLevel2 { if len(txn.In) != len(uxIn) { - logger.Panic("tx.In != uxIn") + log.Panic("tx.In != uxIn") } if len(txn.In) != len(txn.Sigs) { - logger.Panic("tx.In != tx.Sigs") + log.Panic("tx.In != tx.Sigs") } if txn.InnerHash != txn.HashInner() { - logger.Panic("Invalid Tx Inner Hash") + log.Panic("Invalid Tx Inner Hash") } for i := range txn.In { if txn.In[i] != uxIn[i].Hash() { - logger.Panic("Ux hash mismatch") + log.Panic("Ux hash mismatch") } } } @@ -177,7 +178,7 @@ func (txn Transaction) VerifyInput(uxIn UxArray) error { // Returns the signature index for later signing func (txn *Transaction) PushInput(uxOut cipher.SHA256) uint16 { if len(txn.In) >= math.MaxUint16 { - logger.Panic("Max transaction inputs reached") + log.Panic("Max transaction inputs reached") } txn.In = append(txn.In, uxOut) return uint16(len(txn.In) - 1) @@ -208,16 +209,16 @@ func (txn *Transaction) SignInputs(keys []cipher.SecKey) { txn.InnerHash = txn.HashInner() // update hash if len(txn.Sigs) != 0 { - logger.Panic("Transaction has been signed") + log.Panic("Transaction has been signed") } if len(keys) != len(txn.In) { - logger.Panic("Invalid number of keys") + log.Panic("Invalid number of keys") } if len(keys) > math.MaxUint16 { - logger.Panic("Too many keys") + log.Panic("Too many keys") } if len(keys) == 0 { - logger.Panic("No keys") + log.Panic("No keys") } sigs := make([]cipher.Sig, len(txn.In)) @@ -284,7 +285,7 @@ func (txn *Transaction) Serialize() []byte { func MustTransactionDeserialize(b []byte) Transaction { t, err := TransactionDeserialize(b) if err != nil { - logger.Panicf("Failed to deserialize transaction: %v", err) + log.Panicf("Failed to deserialize transaction: %v", err) } return t } diff --git a/src/coin/transactions_test.go b/src/coin/transactions_test.go index e5e6fd9..a63e1ee 100755 --- a/src/coin/transactions_test.go +++ b/src/coin/transactions_test.go @@ -16,7 +16,7 @@ import ( _require "github.com/skycoin/skycoin/src/testutil/require" ) -func makeTransactionFromUxOut(t *testing.T, ux UxOut, s cipher.SecKey) Transaction { +func makeTransactionFromUxOut(ux UxOut, s cipher.SecKey) Transaction { tx := Transaction{} tx.PushInput(ux.Hash()) tx.PushOutput(makeAddress(), 1e6, 50) @@ -28,10 +28,10 @@ func makeTransactionFromUxOut(t *testing.T, ux UxOut, s cipher.SecKey) Transacti func makeTransaction(t *testing.T) Transaction { ux, s := makeUxOutWithSecret(t) - return makeTransactionFromUxOut(t, ux, s) + return makeTransactionFromUxOut(ux, s) } -func makeTransactions(t *testing.T, n int) Transactions { +func makeTransactions(t *testing.T, n int) Transactions { // nolint: unparam txns := make(Transactions, n) for i := range txns { txns[i] = makeTransaction(t) @@ -94,7 +94,7 @@ func TestTransactionVerify(t *testing.T) { // Duplicate inputs ux, s := makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) tx.PushInput(tx.In[0]) tx.Sigs = nil tx.SignInputs([]cipher.SecKey{s, s}) @@ -162,14 +162,14 @@ func TestTransactionVerifyInput(t *testing.T) { // tx.In != tx.Sigs ux, s := makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) tx.Sigs = []cipher.Sig{} _require.PanicsWithLogMessage(t, "tx.In != tx.Sigs", func() { tx.VerifyInput(UxArray{ux}) }) ux, s = makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) tx.Sigs = append(tx.Sigs, cipher.Sig{}) _require.PanicsWithLogMessage(t, "tx.In != tx.Sigs", func() { tx.VerifyInput(UxArray{ux}) @@ -177,7 +177,7 @@ func TestTransactionVerifyInput(t *testing.T) { // tx.InnerHash != tx.HashInner() ux, s = makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) tx.InnerHash = cipher.SHA256{} _require.PanicsWithLogMessage(t, "Invalid Tx Inner Hash", func() { tx.VerifyInput(UxArray{ux}) @@ -185,21 +185,21 @@ func TestTransactionVerifyInput(t *testing.T) { // tx.In does not match uxIn hashes ux, s = makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) _require.PanicsWithLogMessage(t, "Ux hash mismatch", func() { tx.VerifyInput(UxArray{UxOut{}}) }) // Invalid signature ux, s = makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) tx.Sigs[0] = cipher.Sig{} err := tx.VerifyInput(UxArray{ux}) testutil.RequireError(t, err, "Signature not valid for output being spent") // Valid ux, s = makeUxOutWithSecret(t) - tx = makeTransactionFromUxOut(t, ux, s) + tx = makeTransactionFromUxOut(ux, s) err = tx.VerifyInput(UxArray{ux}) require.NoError(t, err) } @@ -336,59 +336,6 @@ func TestTransactionOutputHours(t *testing.T) { testutil.RequireError(t, err, "Transaction output hours overflow") } -type outAddr struct { - Addr cipher.Address - Coins uint64 - Hours uint64 -} - -func makeTx(s cipher.SecKey, ux *UxOut, outs []outAddr, tm uint64, seq uint64) (*Transaction, UxArray, error) { - if ux == nil { - // genesis block tx. - tx := Transaction{} - tx.PushOutput(outs[0].Addr, outs[0].Coins, outs[0].Hours) - _, s = cipher.GenerateKeyPair() - ux := UxOut{ - Head: UxHead{ - Time: 100, - BkSeq: 0, - }, - Body: UxBody{ - SrcTransaction: tx.InnerHash, - Address: outs[0].Addr, - Coins: outs[0].Coins, - Hours: outs[0].Hours, - }, - } - return &tx, []UxOut{ux}, nil - } - - tx := Transaction{} - tx.PushInput(ux.Hash()) - tx.SignInputs([]cipher.SecKey{s}) - for _, o := range outs { - tx.PushOutput(o.Addr, o.Coins, o.Hours) - } - tx.UpdateHeader() - - uxo := make(UxArray, len(tx.Out)) - for i := range tx.Out { - uxo[i] = UxOut{ - Head: UxHead{ - Time: tm, - BkSeq: seq, - }, - Body: UxBody{ - SrcTransaction: tx.Hash(), - Address: tx.Out[i].Address, - Coins: tx.Out[i].Coins, - Hours: tx.Out[i].Hours, - }, - } - } - return &tx, uxo, nil -} - func TestTransactionsSize(t *testing.T) { txns := makeTransactions(t, 10) size := 0 diff --git a/src/daemon/announced_txns.go b/src/daemon/announced_txns.go new file mode 100755 index 0000000..b67191d --- /dev/null +++ b/src/daemon/announced_txns.go @@ -0,0 +1,44 @@ +package daemon + +import ( + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/utc" +) + +type announcedTxnsCache struct { + sync.Mutex + cache map[cipher.SHA256]int64 +} + +func newAnnouncedTxnsCache() *announcedTxnsCache { + return &announcedTxnsCache{ + cache: make(map[cipher.SHA256]int64), + } +} + +func (c *announcedTxnsCache) add(txns []cipher.SHA256) { + c.Lock() + defer c.Unlock() + + t := utc.Now().UnixNano() + for _, txn := range txns { + c.cache[txn] = t + } +} + +func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { + c.Lock() + defer c.Unlock() + + if len(c.cache) == 0 { + return nil + } + + cache := c.cache + + c.cache = make(map[cipher.SHA256]int64) + + return cache +} diff --git a/src/daemon/daemon.go b/src/daemon/daemon.go index 2292765..7e78539 100755 --- a/src/daemon/daemon.go +++ b/src/daemon/daemon.go @@ -4,15 +4,15 @@ import ( "bytes" "errors" "reflect" - "runtime/debug" "sync" "time" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/daemon/gnet" "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" "github.com/skycoin/skycoin/src/util/elapse" "github.com/skycoin/skycoin/src/util/iputil" @@ -49,7 +49,15 @@ var ( ErrDisconnectIPLimitReached gnet.DisconnectReason = errors.New("Maximum number of connections for this IP was reached") // ErrDisconnectOtherError this is returned when a seemingly impossible error is encountered // e.g. net.Conn.Addr() returns an invalid ip:port - ErrDisconnectOtherError gnet.DisconnectReason = errors.New("Incomprehensible error") + ErrDisconnectOtherError gnet.DisconnectReason = errors.New("Incomprehensible error") + ErrDisconnectMaxDefaultConnectionReached = errors.New("Maximum number of default connections was reached") + // ErrDisconnectMaxOutgoingConnectionsReached is returned when connection pool size is greater than the maximum allowed + ErrDisconnectMaxOutgoingConnectionsReached gnet.DisconnectReason = errors.New("Maximum outgoing connections was reached") + // ErrDisconnectBlockchainPubkeyNotMatched is returned when the blockchain pubkey in introduction does not match + ErrDisconnectBlockchainPubkeyNotMatched gnet.DisconnectReason = errors.New("Blockchain pubkey in Introduction message is not matched ") + // ErrDisconnectInvalidExtraData is returned when extra field can't be parsed as specific data type. + // e.g. ExtraData length in IntroductionMessage is not the same as cipher.PubKey + ErrDisconnectInvalidExtraData gnet.DisconnectReason = errors.New("Invalid extra data") logger = logging.MustGetLogger("daemon") ) @@ -65,7 +73,7 @@ type Config struct { Pool PoolConfig Pex pex.Config Gateway GatewayConfig - Visor VisorConfig + Visor visor.Config } // NewConfig returns a Config with defaults set @@ -76,7 +84,7 @@ func NewConfig() Config { Pex: pex.NewConfig(), Gateway: NewGatewayConfig(), Messages: NewMessagesConfig(), - Visor: NewVisorConfig(), + Visor: visor.NewVisorConfig(), } } @@ -105,15 +113,12 @@ func (cfg *Config) preprocess() Config { config.Pex.Disabled = true config.Daemon.DisableIncomingConnections = true config.Daemon.DisableOutgoingConnections = true - config.Visor.DisableNetworking = true } else { if config.Daemon.DisableIncomingConnections { logger.Info("Incoming connections are disabled.") } if config.Daemon.DisableOutgoingConnections { logger.Info("Outgoing connections are disabled.") - // Visor only makes outgoing connections - config.Visor.DisableNetworking = true } } @@ -122,10 +127,12 @@ func (cfg *Config) preprocess() Config { // DaemonConfig configuration for the Daemon type DaemonConfig struct { // nolint: golint - // Application version. TODO -- manage version better + // Protocol version. TODO -- manage version better Version int32 // IP Address to serve on. Leave empty for automatic assignment Address string + // BlockchainPubkey blockchain pubkey string + BlockchainPubkey cipher.PubKey // TCP/UDP port for connections Port int // Directory where application data is stored @@ -157,30 +164,86 @@ type DaemonConfig struct { // nolint: golint LocalhostOnly bool // Log ping and pong messages LogPings bool + // How often to request blocks from peers + BlocksRequestRate time.Duration + // How often to announce our blocks to peers + BlocksAnnounceRate time.Duration + // How many blocks to respond with to a GetBlocksMessage + BlocksResponseCount uint64 + // Max announce txns hash number + MaxTxnAnnounceNum int + // How often new blocks are created by the signing node, in seconds + BlockCreationInterval uint64 + // How often to check the unconfirmed pool for transactions that become valid + UnconfirmedRefreshRate time.Duration + // How often to remove transactions that become permanently invalid from the unconfirmed pool + UnconfirmedRemoveInvalidRate time.Duration } // NewDaemonConfig creates daemon config func NewDaemonConfig() DaemonConfig { return DaemonConfig{ - Version: 2, - Address: "", - Port: 6677, - OutgoingRate: time.Second * 5, - PrivateRate: time.Second * 5, - OutgoingMax: 16, - PendingMax: 16, - IntroductionWait: time.Second * 30, - CullInvalidRate: time.Second * 3, - FlushAnnouncedTxnsRate: time.Second * 3, - IPCountsMax: 3, - DisableNetworking: false, - DisableOutgoingConnections: false, - DisableIncomingConnections: false, - LocalhostOnly: false, - LogPings: true, + Version: 2, + Address: "", + Port: 6677, + OutgoingRate: time.Second * 5, + PrivateRate: time.Second * 5, + OutgoingMax: 8, + PendingMax: 8, + IntroductionWait: time.Second * 30, + CullInvalidRate: time.Second * 3, + FlushAnnouncedTxnsRate: time.Second * 3, + IPCountsMax: 3, + DisableNetworking: false, + DisableOutgoingConnections: false, + DisableIncomingConnections: false, + LocalhostOnly: false, + LogPings: true, + BlocksRequestRate: time.Second * 60, + BlocksAnnounceRate: time.Second * 60, + BlocksResponseCount: 20, + MaxTxnAnnounceNum: 16, + BlockCreationInterval: 10, + UnconfirmedRefreshRate: time.Minute, + UnconfirmedRemoveInvalidRate: time.Minute, } } +//go:generate go install +//go:generate goautomock -template=testify Daemoner + +// Daemoner Daemon interface +type Daemoner interface { + SendMessage(addr string, msg gnet.Message) error + BroadcastMessage(msg gnet.Message) error + Disconnect(addr string, r gnet.DisconnectReason) error + IsDefaultConnection(addr string) bool + IsMaxDefaultConnectionsReached() (bool, error) + PexConfig() pex.Config + RandomExchangeable(n int) pex.Peers + AddPeer(addr string) error + AddPeers(addrs []string) int + SetHasIncomingPort(addr string) error + IncreaseRetryTimes(addr string) + ResetRetryTimes(addr string) + RecordPeerHeight(addr string, height uint64) + GetSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) + HeadBkSeq() (uint64, bool, error) + ExecuteSignedBlock(b coin.SignedBlock) error + GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) + GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) + InjectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) + Mirror() uint32 + DaemonConfig() DaemonConfig + BlockchainPubkey() cipher.PubKey + RecordMessageEvent(m AsyncMessage, c *gnet.MessageContext) error + RecordConnectionMirror(addr string, mirror uint32) error + GetMirrorPort(addr string, mirror uint32) (uint16, bool) + RemoveFromExpectingIntroductions(addr string) + RequestBlocksFromAddr(addr string) error + AnnounceAllTxns() error +} + // Daemon stateful properties of the daemon type Daemon struct { // Daemon configuration @@ -188,13 +251,18 @@ type Daemon struct { // Components Messages *Messages - Pool *Pool - Pex *pex.Pex + pool *Pool + pex *pex.Pex Gateway *Gateway - Visor *Visor + visor *visor.Visor DefaultConnections []string + // Cache of announced transactions that are flushed to the database periodically + announcedTxns *announcedTxnsCache + // Cache of reported peer blockchain heights + Heights *peerBlockchainHeights + // Separate index of outgoing connections. The pool aggregates all // connections. outgoingConnections *OutgoingConnections @@ -222,18 +290,18 @@ type Daemon struct { ipCounts *IPCount // Message handling queue messageEvents chan MessageEvent - // Cache of announced transactions that are flushed to the database periodically - announcedTxns *announcedTxnsCache // quit channel - quitC chan struct{} + quit chan struct{} + // done channel + done chan struct{} // log buffer LogBuff bytes.Buffer } // NewDaemon returns a Daemon with primitives allocated -func NewDaemon(config Config, db *bolt.DB, defaultConns []string) (*Daemon, error) { +func NewDaemon(config Config, db *dbutil.DB, defaultConns []string) (*Daemon, error) { config = config.preprocess() - vs, err := NewVisor(config.Visor, db) + vs, err := visor.NewVisor(config.Visor, db) if err != nil { return nil, err } @@ -246,10 +314,13 @@ func NewDaemon(config Config, db *bolt.DB, defaultConns []string) (*Daemon, erro d := &Daemon{ Config: config.Daemon, Messages: NewMessages(config.Messages), - Pex: pex, - Visor: vs, + pex: pex, + visor: vs, + + DefaultConnections: defaultConns, - DefaultConnections: defaultConns, //passed in from top level + announcedTxns: newAnnouncedTxnsCache(), + Heights: newPeerBlockchainHeights(), expectingIntroductions: NewExpectIntroductions(), connectionMirrors: NewConnectionMirrors(), @@ -264,13 +335,13 @@ func NewDaemon(config Config, db *bolt.DB, defaultConns []string) (*Daemon, erro outgoingConnections: NewOutgoingConnections(config.Daemon.OutgoingMax), pendingConnections: NewPendingConnections(config.Daemon.PendingMax), messageEvents: make(chan MessageEvent, config.Pool.EventChannelSize), - announcedTxns: newAnnouncedTxnsCache(), - quitC: make(chan struct{}), + quit: make(chan struct{}), + done: make(chan struct{}), } d.Gateway = NewGateway(config.Gateway, d) d.Messages.Config.Register() - d.Pool = NewPool(config.Pool, d) + d.pool = NewPool(config.Pool, d) return d, nil } @@ -303,43 +374,44 @@ type MessageEvent struct { // over the quit channel provided to Init. The Daemon run loop must be stopped // before calling this function. func (dm *Daemon) Shutdown() { + defer logger.Info("Daemon shutdown complete") + // close daemon run loop first to avoid creating new connection after // the connection pool is shutdown. - close(dm.quitC) + logger.Info("Stopping the daemon run loop") + close(dm.quit) - dm.Pool.Shutdown() + logger.Info("Shutting down Pool") + dm.pool.Shutdown() + + logger.Info("Shutting down Gateway") dm.Gateway.Shutdown() - dm.Pex.Shutdown() - dm.Visor.Shutdown() + + logger.Info("Shutting down Pex") + dm.pex.Shutdown() + + <-dm.done } // Run main loop for peer/connection management. // Send anything to the quit channel to shut it down. func (dm *Daemon) Run() error { - defer func() { - if r := recover(); r != nil { - logger.Errorf("recover:%v\n stack:%v", r, string(debug.Stack())) - } + defer logger.Info("Daemon closed") + defer close(dm.done) - logger.Info("Daemon closed") - }() + if err := dm.visor.Init(); err != nil { + logger.WithError(err).Error("visor.Visor.Init failed") + return err + } errC := make(chan error, 5) - wg := sync.WaitGroup{} + var wg sync.WaitGroup - // start visor wg.Add(1) go func() { defer wg.Done() - if err := dm.Visor.Run(); err != nil { - errC <- err - } - }() - - wg.Add(1) - go func() { - defer wg.Done() - if err := dm.Pex.Run(); err != nil { + if err := dm.pex.Run(); err != nil { + logger.WithError(err).Error("daemon.Pex.Run failed") errC <- err } }() @@ -348,36 +420,35 @@ func (dm *Daemon) Run() error { go func() { defer wg.Done() if dm.Config.DisableIncomingConnections { - if err := dm.Pool.RunOffline(); err != nil { + if err := dm.pool.RunOffline(); err != nil { + logger.WithError(err).Error("daemon.Pool.RunOffline failed") errC <- err } } else { - if err := dm.Pool.Run(); err != nil { + if err := dm.pool.Run(); err != nil { + logger.WithError(err).Error("daemon.Pool.Run failed") errC <- err } } }() - // TODO -- run blockchain stuff in its own goroutine - blockInterval := time.Duration(dm.Visor.Config.Config.BlockCreationInterval) - // blockchainBackupTicker := time.Tick(self.Visor.Config.BlockchainBackupRate) + blockInterval := time.Duration(dm.Config.BlockCreationInterval) blockCreationTicker := time.NewTicker(time.Second * blockInterval) - if !dm.Visor.Config.Config.IsMaster { + if !dm.visor.Config.IsMaster { blockCreationTicker.Stop() } - unconfirmedRefreshTicker := time.Tick(dm.Visor.Config.Config.UnconfirmedRefreshRate) - unconfirmedRemoveInvalidTicker := time.Tick(dm.Visor.Config.Config.UnconfirmedRemoveInvalidRate) - blocksRequestTicker := time.Tick(dm.Visor.Config.BlocksRequestRate) - blocksAnnounceTicker := time.Tick(dm.Visor.Config.BlocksAnnounceRate) + unconfirmedRefreshTicker := time.Tick(dm.Config.UnconfirmedRefreshRate) + unconfirmedRemoveInvalidTicker := time.Tick(dm.Config.UnconfirmedRemoveInvalidRate) + blocksRequestTicker := time.Tick(dm.Config.BlocksRequestRate) + blocksAnnounceTicker := time.Tick(dm.Config.BlocksAnnounceRate) privateConnectionsTicker := time.Tick(dm.Config.PrivateRate) cullInvalidTicker := time.Tick(dm.Config.CullInvalidRate) outgoingConnectionsTicker := time.Tick(dm.Config.OutgoingRate) - // clearOldPeersTicker := time.Tick(dm.Peers.Config.CullRate) - requestPeersTicker := time.Tick(dm.Pex.Config.RequestRate) - clearStaleConnectionsTicker := time.Tick(dm.Pool.Config.ClearStaleRate) - idleCheckTicker := time.Tick(dm.Pool.Config.IdleCheckRate) + requestPeersTicker := time.Tick(dm.pex.Config.RequestRate) + clearStaleConnectionsTicker := time.Tick(dm.pool.Config.ClearStaleRate) + idleCheckTicker := time.Tick(dm.pool.Config.IdleCheckRate) flushAnnouncedTxnsTicker := time.Tick(dm.Config.FlushAnnouncedTxnsRate) @@ -405,10 +476,10 @@ func (dm *Daemon) Run() error { for { elapser.CheckForDone() select { - case <-dm.quitC: + case <-dm.quit: break loop - case r := <-dm.Pool.Pool.SendResults: + case r := <-dm.pool.Pool.SendResults: // Process message sending results elapser.Register("dm.Pool.Pool.SendResults") if dm.Config.DisableNetworking { @@ -424,7 +495,7 @@ loop: for { elapser.CheckForDone() select { - case <-dm.quitC: + case <-dm.quit: break loop case <-cullInvalidTicker: @@ -437,16 +508,16 @@ loop: case <-requestPeersTicker: // Request peers via PEX elapser.Register("requestPeersTicker") - if dm.Pex.Config.Disabled { + if dm.pex.Config.Disabled { continue } - if dm.Pex.IsFull() { + if dm.pex.IsFull() { continue } m := NewGetPeersMessage() - if err := dm.Pool.Pool.BroadcastMessage(m); err != nil { + if err := dm.pool.Pool.BroadcastMessage(m); err != nil { logger.Error(err) } @@ -454,20 +525,20 @@ loop: // Remove connections that haven't said anything in a while elapser.Register("clearStaleConnectionsTicker") if !dm.Config.DisableNetworking { - dm.Pool.clearStaleConnections() + dm.pool.clearStaleConnections() } case <-idleCheckTicker: // Sends pings as needed elapser.Register("idleCheckTicker") if !dm.Config.DisableNetworking { - dm.Pool.sendPings() + dm.pool.sendPings() } case <-outgoingConnectionsTicker: // Fill up our outgoing connections elapser.Register("outgoingConnectionsTicker") - trustPeerNum := len(dm.Pex.Trusted()) + trustPeerNum := len(dm.pex.Trusted()) if !dm.Config.DisableOutgoingConnections && dm.outgoingConnections.Len() < (dm.Config.OutgoingMax+trustPeerNum) && dm.pendingConnections.Len() < dm.Config.PendingMax { @@ -513,7 +584,11 @@ loop: case <-flushAnnouncedTxnsTicker: elapser.Register("flushAnnouncedTxnsTicker") txns := dm.announcedTxns.flush() - dm.Visor.SetTxnsAnnounced(txns) + + if err := dm.visor.SetTxnsAnnounced(txns); err != nil { + logger.WithError(err).Error("Failed to set unconfirmed txn announce time") + return err + } case m := <-dm.messageEvents: // Message handlers @@ -532,10 +607,10 @@ loop: case <-blockCreationTicker.C: // Create blocks, if master chain elapser.Register("blockCreationTicker.C") - if dm.Visor.Config.Config.IsMaster { - sb, err := dm.Visor.CreateAndPublishBlock(dm.Pool) + if dm.visor.Config.IsMaster { + sb, err := dm.CreateAndPublishBlock() if err != nil { - logger.Errorf("Failed to create block: %v", err) + logger.Errorf("Failed to create and publish block: %v", err) continue } @@ -547,18 +622,18 @@ loop: case <-unconfirmedRefreshTicker: elapser.Register("unconfirmedRefreshTicker") // Get the transactions that turn to valid - validTxns, err := dm.Visor.RefreshUnconfirmed() + validTxns, err := dm.visor.RefreshUnconfirmed() if err != nil { logger.Errorf("dm.Visor.RefreshUnconfirmed failed: %v", err) continue } // Announce these transactions - dm.Visor.AnnounceTxns(dm.Pool, validTxns) + dm.AnnounceTxns(validTxns) case <-unconfirmedRemoveInvalidTicker: elapser.Register("unconfirmedRemoveInvalidTicker") // Remove transactions that become invalid (violating hard constraints) - removedTxns, err := dm.Visor.RemoveInvalidUnconfirmed() + removedTxns, err := dm.visor.RemoveInvalidUnconfirmed() if err != nil { logger.Errorf("dm.Visor.RemoveInvalidUnconfirmed failed: %v", err) continue @@ -569,11 +644,11 @@ loop: case <-blocksRequestTicker: elapser.Register("blocksRequestTicker") - dm.Visor.RequestBlocks(dm.Pool) + dm.RequestBlocks() case <-blocksAnnounceTicker: elapser.Register("blocksAnnounceTicker") - dm.Visor.AnnounceBlocks(dm.Pool) + dm.AnnounceBlocks() case err = <-errC: break loop @@ -623,7 +698,7 @@ func (dm *Daemon) connectToPeer(p pex.Peer) error { return errors.New("Not localhost") } - conned, err := dm.Pool.Pool.IsConnExist(p.Addr) + conned, err := dm.pool.Pool.IsConnExist(p.Addr) if err != nil { return err } @@ -643,7 +718,7 @@ func (dm *Daemon) connectToPeer(p pex.Peer) error { logger.Debugf("Trying to connect to %s", p.Addr) dm.pendingConnections.Add(p.Addr, p) go func() { - if err := dm.Pool.Pool.Connect(p.Addr); err != nil { + if err := dm.pool.Pool.Connect(p.Addr); err != nil { dm.connectionErrors <- ConnectionError{p.Addr, err} } }() @@ -656,7 +731,7 @@ func (dm *Daemon) makePrivateConnections() { return } - peers := dm.Pex.Private() + peers := dm.pex.Private() for _, p := range peers { logger.Infof("Private peer attempt: %s", p.Addr) if err := dm.connectToPeer(p); err != nil { @@ -672,7 +747,7 @@ func (dm *Daemon) connectToTrustPeer() { logger.Info("Connect to trusted peers") // Make connections to all trusted peers - peers := dm.Pex.TrustedPublic() + peers := dm.pex.TrustedPublic() for _, p := range peers { dm.connectToPeer(p) } @@ -685,12 +760,12 @@ func (dm *Daemon) connectToRandomPeer() { } // Make a connection to a random (public) peer - peers := dm.Pex.RandomPublic(0) + peers := dm.pex.RandomPublic(dm.Config.OutgoingMax) for _, p := range peers { // Check if the peer has public port if p.HasIncomingPort { // Try to connect the peer if it's ip:mirror does not exist - if _, exist := dm.getMirrorPort(p.Addr, dm.Messages.Mirror); !exist { + if _, exist := dm.GetMirrorPort(p.Addr, dm.Messages.Mirror); !exist { dm.connectToPeer(p) continue } @@ -702,7 +777,7 @@ func (dm *Daemon) connectToRandomPeer() { if len(peers) == 0 { // Reset the retry times of all peers, - dm.Pex.ResetAllRetryTimes() + dm.pex.ResetAllRetryTimes() } } @@ -712,7 +787,7 @@ func (dm *Daemon) handleConnectionError(c ConnectionError) { logger.Debugf("Failed to connect to %s with error: %v", c.Addr, c.Error) dm.pendingConnections.Remove(c.Addr) - dm.Pex.IncreaseRetryTimes(c.Addr) + dm.pex.IncreaseRetryTimes(c.Addr) } // Removes unsolicited connections who haven't sent a version @@ -722,7 +797,7 @@ func (dm *Daemon) cullInvalidConnections() { now := utc.Now() addrs, err := dm.expectingIntroductions.CullInvalidConns( func(addr string, t time.Time) (bool, error) { - conned, err := dm.Pool.Pool.IsConnExist(addr) + conned, err := dm.pool.Pool.IsConnExist(addr) if err != nil { return false, err } @@ -748,7 +823,7 @@ func (dm *Daemon) cullInvalidConnections() { } for _, a := range addrs { - exist, err := dm.Pool.Pool.IsConnExist(a) + exist, err := dm.pool.Pool.IsConnExist(a) if err != nil { logger.Error(err) return @@ -756,17 +831,17 @@ func (dm *Daemon) cullInvalidConnections() { if exist { logger.Infof("Removing %s for not sending a version", a) - if err := dm.Pool.Pool.Disconnect(a, ErrDisconnectIntroductionTimeout); err != nil { + if err := dm.pool.Pool.Disconnect(a, ErrDisconnectIntroductionTimeout); err != nil { logger.Error(err) return } - dm.Pex.RemovePeer(a) + dm.pex.RemovePeer(a) } } } func (dm *Daemon) isTrustedPeer(addr string) bool { - peer, ok := dm.Pex.GetPeerByAddr(addr) + peer, ok := dm.pex.GetPeerByAddr(addr) if !ok { return false } @@ -774,9 +849,9 @@ func (dm *Daemon) isTrustedPeer(addr string) bool { return peer.Trusted } -// Records an AsyncMessage to the messageEvent chan. Do not access +// RecordMessageEvent records an AsyncMessage to the messageEvent chan. Do not access // messageEvent directly. -func (dm *Daemon) recordMessageEvent(m AsyncMessage, c *gnet.MessageContext) error { +func (dm *Daemon) RecordMessageEvent(m AsyncMessage, c *gnet.MessageContext) error { dm.messageEvents <- MessageEvent{m, c} return nil } @@ -798,7 +873,7 @@ func (dm *Daemon) processMessageEvent(e MessageEvent) { if dm.needsIntro(e.Context.Addr) { _, isIntro := e.Message.(*IntroductionMessage) if !isIntro { - dm.Pool.Pool.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction) + dm.pool.Pool.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction) } } e.Message.Process(dm) @@ -816,7 +891,7 @@ func (dm *Daemon) onConnect(e ConnectEvent) { dm.pendingConnections.Remove(a) - exist, err := dm.Pool.Pool.IsConnExist(a) + exist, err := dm.pool.Pool.IsConnExist(a) if err != nil { logger.Error(err) return @@ -829,20 +904,34 @@ func (dm *Daemon) onConnect(e ConnectEvent) { if dm.ipCountMaxed(a) { logger.Infof("Max connections for %s reached, disconnecting", a) - dm.Pool.Pool.Disconnect(a, ErrDisconnectIPLimitReached) + dm.pool.Pool.Disconnect(a, ErrDisconnectIPLimitReached) return } dm.recordIPCount(a) if e.Solicited { + // Disconnect if the max outgoing connections is reached + n, err := dm.pool.Pool.OutgoingConnectionsNum() + if err != nil { + logger.WithError(err).Error("get outgoing connections number failed") + return + } + + if n > dm.Config.OutgoingMax { + logger.Warningf("max outgoing connections is reached, disconnecting %v", a) + dm.pool.Pool.Disconnect(a, ErrDisconnectMaxOutgoingConnectionsReached) + return + } + dm.outgoingConnections.Add(a) } dm.expectingIntroductions.Add(a, utc.Now()) logger.Debugf("Sending introduction message to %s, mirror:%d", a, dm.Messages.Mirror) - m := NewIntroductionMessage(dm.Messages.Mirror, dm.Config.Version, dm.Pool.Pool.Config.Port) - if err := dm.Pool.Pool.SendMessage(a, m); err != nil { + // TODO: replace the last paramenter of nil with dm.Config.BlockchainPubkey in v25 + m := NewIntroductionMessage(dm.Messages.Mirror, dm.Config.Version, dm.pool.Pool.Config.Port, nil) + if err := dm.pool.Pool.SendMessage(a, m); err != nil { logger.Errorf("Send IntroductionMessage to %s failed: %v", a, err) } } @@ -852,7 +941,7 @@ func (dm *Daemon) onDisconnect(e DisconnectEvent) { dm.outgoingConnections.Remove(e.Addr) dm.expectingIntroductions.Remove(e.Addr) - dm.Visor.RemoveConnection(e.Addr) + dm.Heights.Remove(e.Addr) dm.removeIPCount(e.Addr) dm.removeConnectionMirror(e.Addr) } @@ -909,11 +998,11 @@ func (dm *Daemon) removeIPCount(addr string) { dm.ipCounts.Decrease(ip) } -// Adds addr + mirror to the connectionMirror mappings -func (dm *Daemon) recordConnectionMirror(addr string, mirror uint32) error { +// RecordConnectionMirror adds addr + mirror to the connectionMirror mappings +func (dm *Daemon) RecordConnectionMirror(addr string, mirror uint32) error { ip, port, err := iputil.SplitAddr(addr) if err != nil { - logger.Warningf("recordConnectionMirror called with invalid addr: %v", err) + logger.Warningf("RecordConnectionMirror called with invalid addr: %v", err) return err } dm.connectionMirrors.Add(addr, mirror) @@ -939,8 +1028,8 @@ func (dm *Daemon) removeConnectionMirror(addr string) { dm.connectionMirrors.Remove(addr) } -// Returns whether an addr+mirror's port and whether the port exists -func (dm *Daemon) getMirrorPort(addr string, mirror uint32) (uint16, bool) { +// GetMirrorPort returns whether an addr+mirror's port and whether the port exists +func (dm *Daemon) GetMirrorPort(addr string, mirror uint32) (uint16, bool) { ip, _, err := iputil.SplitAddr(addr) if err != nil { logger.Warningf("getMirrorPort called with invalid addr: %v", err) @@ -964,38 +1053,363 @@ func (dm *Daemon) handleMessageSendResult(r gnet.SendResult) { } } -type announcedTxnsCache struct { - sync.Mutex - cache map[cipher.SHA256]int64 +// RequestBlocks Sends a GetBlocksMessage to all connections +func (dm *Daemon) RequestBlocks() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.Config.BlocksResponseCount) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast GetBlocksMessage failed: %v", err) + } + + return err +} + +// AnnounceBlocks sends an AnnounceBlocksMessage to all connections +func (dm *Daemon) AnnounceBlocks() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot announce blocks, there is no head block") + } + + m := NewAnnounceBlocksMessage(headSeq) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast AnnounceBlocksMessage failed: %v", err) + } + + return err } -func newAnnouncedTxnsCache() *announcedTxnsCache { - return &announcedTxnsCache{ - cache: make(map[cipher.SHA256]int64), +// AnnounceAllTxns announces local unconfirmed transactions +func (dm *Daemon) AnnounceAllTxns() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + // Get local unconfirmed transaction hashes. + hashes, err := dm.visor.GetAllValidUnconfirmedTxHashes() + if err != nil { + return err } + + // Divide hashes into multiple sets of max size + hashesSet := divideHashes(hashes, dm.Config.MaxTxnAnnounceNum) + + for _, hs := range hashesSet { + m := NewAnnounceTxnsMessage(hs) + if err = dm.pool.Pool.BroadcastMessage(m); err != nil { + break + } + } + + if err != nil { + logger.Debugf("Broadcast AnnounceTxnsMessage failed, err: %v", err) + } + + return err } -func (c *announcedTxnsCache) add(txns []cipher.SHA256) { - c.Lock() - defer c.Unlock() +func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { + if len(hashes) == 0 { + return [][]cipher.SHA256{} + } - t := utc.Now().UnixNano() - for _, txn := range txns { - c.cache[txn] = t + var j int + var hashesArray [][]cipher.SHA256 + + if len(hashes) > n { + for i := range hashes { + if len(hashes[j:i]) == n { + hs := make([]cipher.SHA256, n) + copy(hs, hashes[j:i]) + hashesArray = append(hashesArray, hs) + j = i + } + } } + + hs := make([]cipher.SHA256, len(hashes)-j) + copy(hs, hashes[j:]) + hashesArray = append(hashesArray, hs) + return hashesArray } -func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { - c.Lock() - defer c.Unlock() +// AnnounceTxns announces given transaction hashes. +func (dm *Daemon) AnnounceTxns(txns []cipher.SHA256) error { + if dm.Config.DisableOutgoingConnections { + return nil + } - if len(c.cache) == 0 { + if len(txns) == 0 { return nil } - cache := c.cache + m := NewAnnounceTxnsMessage(txns) - c.cache = make(map[cipher.SHA256]int64) + err := dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast AnnounceTxnsMessage failed: %v", err) + } + + return err +} + +// RequestBlocksFromAddr sends a GetBlocksMessage to one connected address +func (dm *Daemon) RequestBlocksFromAddr(addr string) error { + if dm.Config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks from addr, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.Config.BlocksResponseCount) + + return dm.pool.Pool.SendMessage(addr, m) +} + +// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. +// If the transaction violates either hard or soft constraints, it is not broadcast. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use InjectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectBroadcastTransaction(txn coin.Transaction) error { + if _, err := dm.visor.InjectTransactionStrict(txn); err != nil { + return err + } + + return dm.broadcastTransaction(txn) +} + +// ResendUnconfirmedTxns resends all unconfirmed transactions and returns the hashes that were successfully rebroadcast +func (dm *Daemon) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + if dm.Config.DisableOutgoingConnections { + return nil, nil + } + + txns, err := dm.visor.GetAllUnconfirmedTxns() + if err != nil { + return nil, err + } + + var txids []cipher.SHA256 + for i := range txns { + logger.Debugf("Rebroadcast tx %s", txns[i].Hash().Hex()) + if err := dm.broadcastTransaction(txns[i].Txn); err == nil { + txids = append(txids, txns[i].Txn.Hash()) + } + } + + return txids, nil +} + +// broadcastTransaction broadcasts a single transaction to all peers. +func (dm *Daemon) broadcastTransaction(t coin.Transaction) error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + m := NewGiveTxnsMessage(coin.Transactions{t}) + l, err := dm.pool.Pool.Size() + if err != nil { + return err + } + + logger.Debugf("Broadcasting GiveTxnsMessage to %d conns", l) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Errorf("Broadcast GivenTxnsMessage failed: %v", err) + } + + return err +} + +// CreateAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. +// Will panic if not running as a master chain. +// Will not create a block if outgoing connections are disabled. +// If the block was created but the broadcast failed, the error will be non-nil but the +// SignedBlock value will not be empty. +// TODO -- refactor this method -- it should either always create a block and maybe broadcast it, +// or use a database transaction to rollback block publishing if broadcast failed (however, this will cause a slow DB write) +func (dm *Daemon) CreateAndPublishBlock() (*coin.SignedBlock, error) { + if dm.Config.DisableOutgoingConnections { + return nil, errors.New("Outgoing connections disabled") + } + + sb, err := dm.visor.CreateAndExecuteBlock() + if err != nil { + return nil, err + } + + err = dm.broadcastBlock(sb) + + return &sb, err +} + +// Sends a signed block to all connections. +func (dm *Daemon) broadcastBlock(sb coin.SignedBlock) error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + m := NewGiveBlocksMessage([]coin.SignedBlock{sb}) + return dm.pool.Pool.BroadcastMessage(m) +} + +// Mirror returns the message mirror +func (dm *Daemon) Mirror() uint32 { + return dm.Messages.Mirror +} + +// DaemonConfig returns the daemon config +func (dm *Daemon) DaemonConfig() DaemonConfig { + return dm.Config +} + +// BlockchainPubkey returns the blockchain pubkey +func (dm *Daemon) BlockchainPubkey() cipher.PubKey { + return dm.Config.BlockchainPubkey +} + +// RemoveFromExpectingIntroductions removes the peer from expect introduction pool +func (dm *Daemon) RemoveFromExpectingIntroductions(addr string) { + dm.expectingIntroductions.Remove(addr) +} + +// Implements pooler interface + +// SendMessage sends a Message to a Connection and pushes the result onto the +// SendResults channel. +func (dm *Daemon) SendMessage(addr string, msg gnet.Message) error { + return dm.pool.Pool.SendMessage(addr, msg) +} + +// BroadcastMessage sends a Message to all connections in the Pool. +func (dm *Daemon) BroadcastMessage(msg gnet.Message) error { + return dm.pool.Pool.BroadcastMessage(msg) +} + +// Disconnect removes a connection from the pool by address, and passes a Disconnection to +// the DisconnectCallback +func (dm *Daemon) Disconnect(addr string, r gnet.DisconnectReason) error { + return dm.pool.Pool.Disconnect(addr, r) +} + +// IsDefaultConnection returns if the addr is a default connection +func (dm *Daemon) IsDefaultConnection(addr string) bool { + return dm.pool.Pool.IsDefaultConnection(addr) +} + +// IsMaxDefaultConnectionsReached returns whether the max default connection number was reached. +func (dm *Daemon) IsMaxDefaultConnectionsReached() (bool, error) { + return dm.pool.Pool.IsMaxDefaultConnReached() +} + +// Implements pexer interface + +// RandomExchangeable returns N random exchangeable peers +func (dm *Daemon) RandomExchangeable(n int) pex.Peers { + return dm.pex.RandomExchangeable(n) +} + +// PexConfig returns the pex config +func (dm *Daemon) PexConfig() pex.Config { + return dm.pex.Config +} + +// AddPeer adds peer to the pex +func (dm *Daemon) AddPeer(addr string) error { + return dm.pex.AddPeer(addr) +} + +// AddPeers adds peers to the pex +func (dm *Daemon) AddPeers(addrs []string) int { + return dm.pex.AddPeers(addrs) +} + +// SetHasIncomingPort sets the peer public peer +func (dm *Daemon) SetHasIncomingPort(addr string) error { + return dm.pex.SetHasIncomingPort(addr, true) +} + +// IncreaseRetryTimes increases the retry times of given peer +func (dm *Daemon) IncreaseRetryTimes(addr string) { + dm.pex.IncreaseRetryTimes(addr) +} + +// ResetRetryTimes reset the retry times of given peer +func (dm *Daemon) ResetRetryTimes(addr string) { + dm.pex.ResetRetryTimes(addr) +} + +// Implements chain height store + +// Record(addr string, height uint64) + +// RecordPeerHeight records the height of specific peer +func (dm *Daemon) RecordPeerHeight(addr string, height uint64) { + dm.Heights.Record(addr, height) +} + +// Implements visorer interface + +// GetSignedBlocksSince returns N signed blocks since given seq +func (dm *Daemon) GetSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) { + return dm.visor.GetSignedBlocksSince(seq, count) +} + +// HeadBkSeq returns the head block sequence +func (dm *Daemon) HeadBkSeq() (uint64, bool, error) { + return dm.visor.HeadBkSeq() +} + +// ExecuteSignedBlock executes the signed block +func (dm *Daemon) ExecuteSignedBlock(b coin.SignedBlock) error { + return dm.visor.ExecuteSignedBlock(b) +} + +// GetUnconfirmedUnknown returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) { + return dm.visor.GetUnconfirmedUnknown(txns) +} + +// GetUnconfirmedKnown returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) { + return dm.visor.GetUnconfirmedKnown(txns) +} - return cache +// InjectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (dm *Daemon) InjectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + return dm.visor.InjectTransaction(txn) } diff --git a/src/daemon/daemon_test.go b/src/daemon/daemon_test.go index 9d30720..d308ef8 100755 --- a/src/daemon/daemon_test.go +++ b/src/daemon/daemon_test.go @@ -1 +1,105 @@ package daemon + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" +) + +func TestDivideHashes(t *testing.T) { + hashes := make([]cipher.SHA256, 10) + for i := 0; i < 10; i++ { + hashes[i] = cipher.SumSHA256(cipher.RandByte(512)) + } + + testCases := []struct { + name string + init []cipher.SHA256 + n int + array [][]cipher.SHA256 + }{ + { + "has one odd", + hashes[:], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + hashes[8], + }, + []cipher.SHA256{ + hashes[9], + }, + }, + }, + { + "only one value", + hashes[:1], + 1, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + }, + }, + }, + { + "empty value", + hashes[:0], + 0, + [][]cipher.SHA256{}, + }, + { + "with 3 value", + hashes[:3], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + }, + }, + { + "with 8 value", + hashes[:8], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + rlt := divideHashes(tc.init, tc.n) + require.Equal(t, tc.array, rlt) + }) + } +} diff --git a/src/daemon/daemoner_mock_test.go b/src/daemon/daemoner_mock_test.go new file mode 100755 index 0000000..756c7b5 --- /dev/null +++ b/src/daemon/daemoner_mock_test.go @@ -0,0 +1,568 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package daemon + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + gnet "github.com/skycoin/skycoin/src/daemon/gnet" + pex "github.com/skycoin/skycoin/src/daemon/pex" + visor "github.com/skycoin/skycoin/src/visor" +) + +// DaemonerMock mock +type DaemonerMock struct { + mock.Mock +} + +func NewDaemonerMock() *DaemonerMock { + return &DaemonerMock{} +} + +// AddPeer mocked method +func (m *DaemonerMock) AddPeer(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// AddPeers mocked method +func (m *DaemonerMock) AddPeers(p0 []string) int { + + ret := m.Called(p0) + + var r0 int + switch res := ret.Get(0).(type) { + case nil: + case int: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// AnnounceAllTxns mocked method +func (m *DaemonerMock) AnnounceAllTxns() error { + + ret := m.Called() + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// BlockchainPubkey mocked method +func (m *DaemonerMock) BlockchainPubkey() cipher.PubKey { + + ret := m.Called() + + var r0 cipher.PubKey + switch res := ret.Get(0).(type) { + case nil: + case cipher.PubKey: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// BroadcastMessage mocked method +func (m *DaemonerMock) BroadcastMessage(p0 gnet.Message) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// DaemonConfig mocked method +func (m *DaemonerMock) DaemonConfig() DaemonConfig { + + ret := m.Called() + + var r0 DaemonConfig + switch res := ret.Get(0).(type) { + case nil: + case DaemonConfig: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// Disconnect mocked method +func (m *DaemonerMock) Disconnect(p0 string, p1 gnet.DisconnectReason) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ExecuteSignedBlock mocked method +func (m *DaemonerMock) ExecuteSignedBlock(p0 coin.SignedBlock) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetMirrorPort mocked method +func (m *DaemonerMock) GetMirrorPort(p0 string, p1 uint32) (uint16, bool) { + + ret := m.Called(p0, p1) + + var r0 uint16 + switch res := ret.Get(0).(type) { + case nil: + case uint16: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlocksSince mocked method +func (m *DaemonerMock) GetSignedBlocksSince(p0 uint64, p1 uint64) ([]coin.SignedBlock, error) { + + ret := m.Called(p0, p1) + + var r0 []coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case []coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnconfirmedKnown mocked method +func (m *DaemonerMock) GetUnconfirmedKnown(p0 []cipher.SHA256) (coin.Transactions, error) { + + ret := m.Called(p0) + + var r0 coin.Transactions + switch res := ret.Get(0).(type) { + case nil: + case coin.Transactions: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnconfirmedUnknown mocked method +func (m *DaemonerMock) GetUnconfirmedUnknown(p0 []cipher.SHA256) ([]cipher.SHA256, error) { + + ret := m.Called(p0) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// HeadBkSeq mocked method +func (m *DaemonerMock) HeadBkSeq() (uint64, bool, error) { + + ret := m.Called() + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// IncreaseRetryTimes mocked method +func (m *DaemonerMock) IncreaseRetryTimes(p0 string) { + + m.Called(p0) + +} + +// InjectTransaction mocked method +func (m *DaemonerMock) InjectTransaction(p0 coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + + ret := m.Called(p0) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 *visor.ErrTxnViolatesSoftConstraint + switch res := ret.Get(1).(type) { + case nil: + case *visor.ErrTxnViolatesSoftConstraint: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// IsDefaultConnection mocked method +func (m *DaemonerMock) IsDefaultConnection(p0 string) bool { + + ret := m.Called(p0) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsMaxDefaultConnectionsReached mocked method +func (m *DaemonerMock) IsMaxDefaultConnectionsReached() (bool, error) { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Mirror mocked method +func (m *DaemonerMock) Mirror() uint32 { + + ret := m.Called() + + var r0 uint32 + switch res := ret.Get(0).(type) { + case nil: + case uint32: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// PexConfig mocked method +func (m *DaemonerMock) PexConfig() pex.Config { + + ret := m.Called() + + var r0 pex.Config + switch res := ret.Get(0).(type) { + case nil: + case pex.Config: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RandomExchangeable mocked method +func (m *DaemonerMock) RandomExchangeable(p0 int) pex.Peers { + + ret := m.Called(p0) + + var r0 pex.Peers + switch res := ret.Get(0).(type) { + case nil: + case pex.Peers: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordConnectionMirror mocked method +func (m *DaemonerMock) RecordConnectionMirror(p0 string, p1 uint32) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordMessageEvent mocked method +func (m *DaemonerMock) RecordMessageEvent(p0 AsyncMessage, p1 *gnet.MessageContext) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordPeerHeight mocked method +func (m *DaemonerMock) RecordPeerHeight(p0 string, p1 uint64) { + + m.Called(p0, p1) + +} + +// RemoveFromExpectingIntroductions mocked method +func (m *DaemonerMock) RemoveFromExpectingIntroductions(p0 string) { + + m.Called(p0) + +} + +// RequestBlocksFromAddr mocked method +func (m *DaemonerMock) RequestBlocksFromAddr(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ResetRetryTimes mocked method +func (m *DaemonerMock) ResetRetryTimes(p0 string) { + + m.Called(p0) + +} + +// SendMessage mocked method +func (m *DaemonerMock) SendMessage(p0 string, p1 gnet.Message) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// SetHasIncomingPort mocked method +func (m *DaemonerMock) SetHasIncomingPort(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/src/daemon/gateway.go b/src/daemon/gateway.go index 1a270e2..880c486 100755 --- a/src/daemon/gateway.go +++ b/src/daemon/gateway.go @@ -1,6 +1,8 @@ package daemon import ( + "sort" + "strings" "time" "github.com/skycoin/skycoin/src/cipher" @@ -12,16 +14,15 @@ import ( "fmt" - "github.com/skycoin/skycoin/src/visor/blockdb" "github.com/skycoin/skycoin/src/visor/historydb" ) -// Exposes a read-only api for use by the gui rpc interface - // GatewayConfig configuration set of gateway. type GatewayConfig struct { BufferSize int EnableWalletAPI bool + EnableGUI bool + DisableCSP bool } // NewGatewayConfig create and init an GatewayConfig @@ -29,13 +30,14 @@ func NewGatewayConfig() GatewayConfig { return GatewayConfig{ BufferSize: 32, EnableWalletAPI: false, + EnableGUI: false, + DisableCSP: false, } } // Gateway RPC interface wrapper for daemon state type Gateway struct { Config GatewayConfig - drpc RPC // Backref to Daemon d *Daemon @@ -50,9 +52,8 @@ type Gateway struct { func NewGateway(c GatewayConfig, d *Daemon) *Gateway { return &Gateway{ Config: c, - drpc: RPC{}, d: d, - v: d.Visor.v, + v: d.visor, requests: make(chan strand.Request, c.BufferSize), quit: make(chan struct{}), } @@ -61,6 +62,8 @@ func NewGateway(c GatewayConfig, d *Daemon) *Gateway { // Shutdown closes the Gateway func (gw *Gateway) Shutdown() { close(gw.quit) + // wait for strand to complete + gw.strand("wait-shutdown", func() {}) } func (gw *Gateway) strand(name string, f func()) { @@ -71,20 +74,78 @@ func (gw *Gateway) strand(name string, f func()) { }, gw.quit, nil) } +// Connection a connection's state within the daemon +type Connection struct { + ID int `json:"id"` + Addr string `json:"address"` + LastSent int64 `json:"last_sent"` + LastReceived int64 `json:"last_received"` + // Whether the connection is from us to them (true, outgoing), + // or from them to us (false, incoming) + Outgoing bool `json:"outgoing"` + // Whether the client has identified their version, mirror etc + Introduced bool `json:"introduced"` + Mirror uint32 `json:"mirror"` + ListenPort uint16 `json:"listen_port"` +} + +// Connections an array of connections +// Arrays must be wrapped in structs to avoid certain javascript exploits +type Connections struct { + Connections []*Connection `json:"connections"` +} + // GetConnections returns a *Connections func (gw *Gateway) GetConnections() *Connections { var conns *Connections gw.strand("GetConnections", func() { - conns = gw.drpc.GetConnections(gw.d) + conns = gw.getConnections() }) return conns } +func (gw *Gateway) getConnections() *Connections { + if gw.d.pool.Pool == nil { + return nil + } + + n, err := gw.d.pool.Pool.Size() + if err != nil { + logger.Error(err) + return nil + } + + conns := make([]*Connection, 0, n) + cs, err := gw.d.pool.Pool.GetConnections() + if err != nil { + logger.Error(err) + return nil + } + + for _, c := range cs { + if c.Solicited { + conn := gw.getConnection(c.Addr()) + if conn != nil { + conns = append(conns, conn) + } + } + } + + // Sort connnections by IP address + sort.Slice(conns, func(i, j int) bool { + return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 + }) + + return &Connections{Connections: conns} + +} + // GetDefaultConnections returns default connections func (gw *Gateway) GetDefaultConnections() []string { var conns []string gw.strand("GetDefaultConnections", func() { - conns = gw.drpc.GetDefaultConnections(gw.d) + conns = make([]string, len(gw.d.DefaultConnections)) + copy(conns[:], gw.d.DefaultConnections[:]) }) return conns } @@ -93,17 +154,49 @@ func (gw *Gateway) GetDefaultConnections() []string { func (gw *Gateway) GetConnection(addr string) *Connection { var conn *Connection gw.strand("GetConnection", func() { - conn = gw.drpc.GetConnection(gw.d, addr) + conn = gw.getConnection(addr) }) return conn } +func (gw *Gateway) getConnection(addr string) *Connection { + if gw.d.pool.Pool == nil { + return nil + } + + c, err := gw.d.pool.Pool.GetConnection(addr) + if err != nil { + logger.Error(err) + return nil + } + + if c == nil { + return nil + } + + mirror, exist := gw.d.connectionMirrors.Get(addr) + if !exist { + return nil + } + + return &Connection{ + ID: c.ID, + Addr: addr, + LastSent: c.LastSent.Unix(), + LastReceived: c.LastReceived.Unix(), + Outgoing: gw.d.outgoingConnections.Get(addr), + Introduced: !gw.d.needsIntro(addr), + Mirror: mirror, + ListenPort: gw.d.GetListenPort(addr), + } +} + // GetTrustConnections returns all trusted connections, // including private and public func (gw *Gateway) GetTrustConnections() []string { var conn []string gw.strand("GetTrustConnections", func() { - conn = gw.drpc.GetTrustConnections(gw.d) + conn = gw.d.pex.Trusted().ToAddrs() }) return conn } @@ -113,37 +206,69 @@ func (gw *Gateway) GetTrustConnections() []string { func (gw *Gateway) GetExchgConnection() []string { var conn []string gw.strand("GetExchgConnection", func() { - conn = gw.drpc.GetAllExchgConnections(gw.d) + conn = gw.d.pex.RandomExchangeable(0).ToAddrs() }) return conn } /* Blockchain & Transaction status */ +// BlockchainProgress current sync blockchain status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 `json:"current"` + // Our best guess at true blockchain length + Highest uint64 `json:"highest"` + Peers []PeerBlockchainHeight `json:"peers"` +} + // GetBlockchainProgress returns a *BlockchainProgress -func (gw *Gateway) GetBlockchainProgress() *BlockchainProgress { +func (gw *Gateway) GetBlockchainProgress() (*BlockchainProgress, error) { var bcp *BlockchainProgress + var err error gw.strand("GetBlockchainProgress", func() { - bcp = gw.drpc.GetBlockchainProgress(gw.d.Visor) + var headSeq uint64 + headSeq, _, err = gw.d.visor.HeadBkSeq() + if err != nil { + return + } + + bcp = &BlockchainProgress{ + Current: headSeq, + Highest: gw.d.Heights.Estimate(headSeq), + Peers: gw.d.Heights.All(), + } }) - return bcp + + if err != nil { + return nil, err + } + + return bcp, nil } -// ResendTransaction resent the transaction and return a *ResendResult -func (gw *Gateway) ResendTransaction(txn cipher.SHA256) *ResendResult { - var result *ResendResult - gw.strand("ResendTransaction", func() { - result = gw.drpc.ResendTransaction(gw.d.Visor, gw.d.Pool, txn) - }) - return result +// ResendResult rebroadcast tx result +type ResendResult struct { + Txids []string `json:"txids"` // transaction id } // ResendUnconfirmedTxns resents all unconfirmed transactions -func (gw *Gateway) ResendUnconfirmedTxns() (rlt *ResendResult) { +func (gw *Gateway) ResendUnconfirmedTxns() (*ResendResult, error) { + var hashes []cipher.SHA256 + var err error gw.strand("ResendUnconfirmedTxns", func() { - rlt = gw.drpc.ResendUnconfirmedTxns(gw.d.Visor, gw.d.Pool) + hashes, err = gw.d.ResendUnconfirmedTxns() }) - return + + if err != nil { + return nil, err + } + + var rlt ResendResult + for _, txid := range hashes { + rlt.Txids = append(rlt.Txids, txid.Hex()) + } + return &rlt, nil } // GetBlockchainMetadata returns a *visor.BlockchainMetadata @@ -156,39 +281,24 @@ func (gw *Gateway) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { return bcm, err } -// GetBlockByHash returns the block by hash -func (gw *Gateway) GetBlockByHash(hash cipher.SHA256) (block coin.SignedBlock, ok bool) { - gw.strand("GetBlockByHash", func() { - b, err := gw.v.GetBlockByHash(hash) - if err != nil { - logger.Errorf("gateway.GetBlockByHash failed: %v", err) - return - } - if b == nil { - return - } - - block = *b - ok = true +// GetSignedBlockByHash returns the block by hash +func (gw *Gateway) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + var err error + gw.strand("GetSignedBlockByHash", func() { + b, err = gw.v.GetSignedBlockByHash(hash) }) - return + return b, err } -// GetBlockBySeq returns blcok by seq -func (gw *Gateway) GetBlockBySeq(seq uint64) (block coin.SignedBlock, ok bool) { - gw.strand("GetBlockBySeq", func() { - b, err := gw.v.GetBlockBySeq(seq) - if err != nil { - logger.Errorf("gateway.GetBlockBySeq failed: %v", err) - return - } - if b == nil { - return - } - block = *b - ok = true +// GetSignedBlockBySeq returns block by seq +func (gw *Gateway) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + var err error + gw.strand("GetSignedBlockBySeq", func() { + b, err = gw.v.GetSignedBlockBySeq(seq) }) - return + return b, err } // GetBlocks returns a *visor.ReadableBlocks @@ -214,7 +324,7 @@ func (gw *Gateway) GetBlocksInDepth(vs []uint64) (*visor.ReadableBlocks, error) gw.strand("GetBlocksInDepth", func() { for _, n := range vs { var b *coin.SignedBlock - b, err = gw.v.GetBlockBySeq(n) + b, err = gw.v.GetSignedBlockBySeq(n) if err != nil { err = fmt.Errorf("get block %v failed: %v", n, err) return @@ -261,26 +371,30 @@ func (gw *Gateway) GetUnspentOutputs(filters ...OutputsFilter) (*visor.ReadableO var uncfmSpendingOutputs coin.UxArray // unconfirmed incoming outputs var uncfmIncomingOutputs coin.UxArray - var headTime uint64 + var head *coin.SignedBlock var err error gw.strand("GetUnspentOutputs", func() { - headTime = gw.v.Blockchain.Time() + head, err = gw.v.GetHeadBlock() + if err != nil { + err = fmt.Errorf("v.GetHeadBlock failed: %v", err) + return + } - unspentOutputs, err = gw.v.GetUnspentOutputs() + unspentOutputs, err = gw.v.GetAllUnspentOutputs() if err != nil { - err = fmt.Errorf("get unspent output readables failed: %v", err) + err = fmt.Errorf("v.GetAllUnspentOutputs failed: %v", err) return } uncfmSpendingOutputs, err = gw.v.UnconfirmedSpendingOutputs() if err != nil { - err = fmt.Errorf("get unconfirmed spending outputs failed: %v", err) + err = fmt.Errorf("v.UnconfirmedSpendingOutputs failed: %v", err) return } uncfmIncomingOutputs, err = gw.v.UnconfirmedIncomingOutputs() if err != nil { - err = fmt.Errorf("get all incoming outputs failed: %v", err) + err = fmt.Errorf("v.UnconfirmedIncomingOutputs failed: %v", err) return } }) @@ -296,17 +410,17 @@ func (gw *Gateway) GetUnspentOutputs(filters ...OutputsFilter) (*visor.ReadableO } outputSet := visor.ReadableOutputSet{} - outputSet.HeadOutputs, err = visor.NewReadableOutputs(headTime, unspentOutputs) + outputSet.HeadOutputs, err = visor.NewReadableOutputs(head.Time(), unspentOutputs) if err != nil { return nil, err } - outputSet.OutgoingOutputs, err = visor.NewReadableOutputs(headTime, uncfmSpendingOutputs) + outputSet.OutgoingOutputs, err = visor.NewReadableOutputs(head.Time(), uncfmSpendingOutputs) if err != nil { return nil, err } - outputSet.IncomingOutputs, err = visor.NewReadableOutputs(headTime, uncfmIncomingOutputs) + outputSet.IncomingOutputs, err = visor.NewReadableOutputs(head.Time(), uncfmIncomingOutputs) if err != nil { return nil, err } @@ -447,25 +561,162 @@ func (gw *Gateway) GetTransactionResult(txid cipher.SHA256) (*TransactionResult, func (gw *Gateway) InjectBroadcastTransaction(txn coin.Transaction) error { var err error gw.strand("InjectBroadcastTransaction", func() { - err = gw.d.Visor.InjectBroadcastTransaction(txn, gw.d.Pool) + err = gw.d.InjectBroadcastTransaction(txn) }) return err } -// GetAddressTxns returns a *TransactionResults -func (gw *Gateway) GetAddressTxns(a cipher.Address) (*TransactionResults, error) { - var txs []visor.Transaction +// ReadableTransaction has readable transaction data. It differs from visor.ReadableTransaction +// in that it includes metadata for transaction inputs +type ReadableTransaction struct { + Status visor.TransactionStatus `json:"status"` + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Timestamp uint64 `json:"timestamp,omitempty"` + Fee uint64 `json:"fee"` + + Sigs []string `json:"sigs"` + In []visor.ReadableTransactionInput `json:"inputs"` + Out []visor.ReadableTransactionOutput `json:"outputs"` +} + +// NewReadableTransaction creates ReadableTransaction +func NewReadableTransaction(t visor.Transaction, inputs []visor.ReadableTransactionInput) (ReadableTransaction, error) { + // Genesis transaction use empty SHA256 as txid + txID := cipher.SHA256{} + if t.Status.BlockSeq != 0 { + txID = t.Txn.Hash() + } + + sigs := make([]string, len(t.Txn.Sigs)) + for i, s := range t.Txn.Sigs { + sigs[i] = s.Hex() + } + + out := make([]visor.ReadableTransactionOutput, len(t.Txn.Out)) + for i := range t.Txn.Out { + o, err := visor.NewReadableTransactionOutput(&t.Txn.Out[i], txID) + if err != nil { + return ReadableTransaction{}, err + } + + out[i] = *o + } + + var hoursIn uint64 + for _, i := range inputs { + if _, err := coin.AddUint64(hoursIn, i.CalculatedHours); err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransaction summing txn %s input hours error: %v", txID.Hex(), err) + } + hoursIn += i.CalculatedHours + } + + var hoursOut uint64 + for _, o := range t.Txn.Out { + if _, err := coin.AddUint64(hoursOut, o.Hours); err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransaction summing txn %s outputs hours error: %v", txID.Hex(), err) + } + + hoursOut += o.Hours + } + + if hoursIn < hoursOut { + err := fmt.Errorf("NewReadableTransaction input hours is less than output hours, txid=%s", txID.Hex()) + return ReadableTransaction{}, err + } + + fee := hoursIn - hoursOut + + return ReadableTransaction{ + Status: t.Status, + Length: t.Txn.Length, + Type: t.Txn.Type, + Hash: t.Txn.Hash().Hex(), + InnerHash: t.Txn.InnerHash.Hex(), + Timestamp: t.Time, + Fee: fee, + + Sigs: sigs, + In: inputs, + Out: out, + }, nil +} + +// GetTransactionsForAddress returns []ReadableTransaction for a given address. +// These transactions include confirmed and unconfirmed transactions +// TODO -- move into visor (visor.ReadableTransaction can't be changed to daemon.ReadableTransaction without breaking the API) +func (gw *Gateway) GetTransactionsForAddress(a cipher.Address) ([]ReadableTransaction, error) { var err error + var resTxns []ReadableTransaction + + gw.strand("GetTransactionsForAddress", func() { + var txns []visor.Transaction + txns, err = gw.v.GetAddressTxns(a) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetAddressTxns failed: %v", err) + return + } + + var head *coin.SignedBlock + head, err = gw.v.GetHeadBlock() + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetHeadBlock failed: %v", err) + return + } + + resTxns = make([]ReadableTransaction, len(txns)) + + for i, txn := range txns { + inputs := make([]visor.ReadableTransactionInput, len(txn.Txn.In)) + for j, inputID := range txn.Txn.In { + var input *historydb.UxOut + input, err = gw.v.GetUxOutByID(inputID) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetUxOutByID failed: %v", err) + return + } + if input == nil { + err = fmt.Errorf("uxout of %v does not exist in history db", inputID.Hex()) + return + } + + // If the txn is confirmed, + // use the time of the transaction when it was executed, + // else use the head time + t := txn.Time + if !txn.Status.Confirmed { + t = head.Time() + } + + var readableInput *visor.ReadableTransactionInput + readableInput, err = visor.NewReadableTransactionInput(input.Out, t) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: visor.NewReadableTransactionInput failed: %v", err) + return + } + + inputs[j] = *readableInput + } + + var rTxn ReadableTransaction + rTxn, err = NewReadableTransaction(txn, inputs) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: NewReadableTransaction failed: %v", err) + return + } + + resTxns[i] = rTxn + } - gw.strand("GetAddressesTxns", func() { - txs, err = gw.v.GetAddressTxns(a) }) if err != nil { return nil, err } - return NewTransactionResults(txs) + return resTxns, nil } // GetTransactions returns transactions filtered by zero or more visor.TxFilter @@ -490,23 +741,26 @@ func (gw *Gateway) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { // GetAddrUxOuts gets all the address affected UxOuts. func (gw *Gateway) GetAddrUxOuts(addresses []cipher.Address) ([]*historydb.UxOut, error) { - var ( - uxOuts []*historydb.UxOut - err error - ) + var uxOuts []*historydb.UxOut + var err error - for _, addr := range addresses { - result, e := gw.v.GetAddrUxOuts(addr) + gw.strand("GetAddrUxOuts", func() { + for _, addr := range addresses { + var result []*historydb.UxOut + result, err = gw.v.GetAddrUxOuts(addr) + if err != nil { + return + } - if e != nil { - err = e - continue + uxOuts = append(uxOuts, result...) } + }) - uxOuts = append(uxOuts, result...) + if err != nil { + return nil, err } - return uxOuts, err + return uxOuts, nil } // GetTimeNow returns the current Unix time @@ -515,52 +769,23 @@ func (gw *Gateway) GetTimeNow() uint64 { } // GetAllUnconfirmedTxns returns all unconfirmed transactions -func (gw *Gateway) GetAllUnconfirmedTxns() []visor.UnconfirmedTxn { +func (gw *Gateway) GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) { var txns []visor.UnconfirmedTxn + var err error gw.strand("GetAllUnconfirmedTxns", func() { - txns = gw.v.GetAllUnconfirmedTxns() + txns, err = gw.v.GetAllUnconfirmedTxns() }) - return txns + return txns, err } // GetUnconfirmedTxns returns addresses related unconfirmed transactions -func (gw *Gateway) GetUnconfirmedTxns(addrs []cipher.Address) []visor.UnconfirmedTxn { +func (gw *Gateway) GetUnconfirmedTxns(addrs []cipher.Address) ([]visor.UnconfirmedTxn, error) { var txns []visor.UnconfirmedTxn + var err error gw.strand("GetUnconfirmedTxns", func() { - txns = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) + txns, err = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) }) - return txns -} - -// GetUnspent returns the unspent pool -func (gw *Gateway) GetUnspent() blockdb.UnspentPool { - var unspent blockdb.UnspentPool - gw.strand("GetUnspent", func() { - unspent = gw.v.Blockchain.Unspent() - }) - return unspent -} - -// implements the wallet.Validator interface -type spendValidator struct { - uncfm visor.UnconfirmedTxnPooler - unspent blockdb.UnspentPool -} - -func newSpendValidator(uncfm visor.UnconfirmedTxnPooler, unspent blockdb.UnspentPool) *spendValidator { - return &spendValidator{ - uncfm: uncfm, - unspent: unspent, - } -} - -func (sv spendValidator) HasUnconfirmedSpendTx(addr []cipher.Address) (bool, error) { - aux, err := sv.uncfm.SpendsOfAddresses(addr, sv.unspent) - if err != nil { - return false, err - } - - return len(aux) > 0, nil + return txns, err } // Spend spends coins from given wallet and broadcast it, @@ -571,28 +796,27 @@ func (gw *Gateway) Spend(wltID string, password []byte, coins uint64, dest ciphe return nil, wallet.ErrWalletAPIDisabled } - var tx *coin.Transaction + var txn *coin.Transaction var err error gw.strand("Spend", func() { - // create spend validator - unspent := gw.v.Blockchain.Unspent() - sv := newSpendValidator(gw.v.Unconfirmed, unspent) - // create and sign transaction - tx, err = gw.v.Wallets.CreateAndSignTransaction(wltID, password, sv, unspent, gw.v.Blockchain.Time(), coins, dest) + txn, err = gw.v.CreateTransactionDeprecated(wltID, password, coins, dest) if err != nil { - logger.Errorf("Create transaction failed: %v", err) return } // Inject transaction - err = gw.d.Visor.InjectBroadcastTransaction(*tx, gw.d.Pool) + err = gw.d.InjectBroadcastTransaction(*txn) if err != nil { logger.Errorf("Inject transaction failed: %v", err) return } }) - return tx, err + if err != nil { + return nil, err + } + + return txn, nil } // CreateTransaction creates a transaction based upon parameters in wallet.CreateTransactionParams @@ -606,25 +830,7 @@ func (gw *Gateway) CreateTransaction(params wallet.CreateTransactionParams) (*co var err error gw.strand("CreateTransaction", func() { - // Create spend validator - unspent := gw.v.Blockchain.Unspent() - sv := newSpendValidator(gw.v.Unconfirmed, unspent) - - // Create and sign transaction - txn, inputs, err = gw.v.Wallets.CreateAndSignTransactionAdvanced(params, sv, unspent, gw.v.Blockchain.Time()) - if err != nil { - logger.WithError(err).Error("CreateAndSignTransactionAdvanced failed") - return - } - - // The wallet can create transactions that would not pass all validation, such as the decimal restriction, - // because the wallet is not aware of visor-level constraints. - // Check that the transaction is valid before returning it to the caller. - err = gw.v.Blockchain.VerifySingleTxnAllConstraints(*txn, visor.DefaultMaxBlockSize) - if err != nil { - logger.WithError(err).Error("Created transaction violates transaction constraints") - return - } + txn, inputs, err = gw.v.CreateTransaction(params) }) if err != nil { @@ -643,7 +849,7 @@ func (gw *Gateway) CreateWallet(wltName string, options wallet.Options) (*wallet var wlt *wallet.Wallet var err error gw.strand("CreateWallet", func() { - wlt, err = gw.v.CreateWallet(wltName, options) + wlt, err = gw.v.Wallets.CreateWallet(wltName, options, gw.v) }) return wlt, err } @@ -676,11 +882,12 @@ func (gw *Gateway) DecryptWallet(wltID string, password []byte) (*wallet.Wallet, return w, err } -// GetWalletBalance returns balance pair of specific wallet -func (gw *Gateway) GetWalletBalance(wltID string) (wallet.BalancePair, error) { - var balance wallet.BalancePair +// GetWalletBalance returns balance pairs of specific wallet +func (gw *Gateway) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalance, error) { + var addressBalances wallet.AddressBalance + var walletBalance wallet.BalancePair if !gw.Config.EnableWalletAPI { - return balance, wallet.ErrWalletAPIDisabled + return walletBalance, addressBalances, wallet.ErrWalletAPIDisabled } var err error @@ -690,52 +897,60 @@ func (gw *Gateway) GetWalletBalance(wltID string) (wallet.BalancePair, error) { if err != nil { return } - auxs := gw.v.Blockchain.Unspent().GetUnspentsOfAddrs(addrs) - var spendUxs coin.AddressUxOuts - spendUxs, err = gw.v.GetUnconfirmedSpends(addrs) + // get list of address balances + addrsBalanceList, err := gw.v.GetBalanceOfAddrs(addrs) if err != nil { - err = fmt.Errorf("get unconfimed spending failed when checking wallet balance: %v", err) return } - var recvUxs coin.AddressUxOuts - recvUxs, err = gw.v.GetUnconfirmedReceiving(addrs) - if err != nil { - err = fmt.Errorf("get unconfirmed receiving failed when when checking wallet balance: %v", err) - return + // create map of address to balance + addressBalances = make(wallet.AddressBalance, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = addrsBalanceList[idx] } - coins1, hours1, err := gw.v.AddressBalance(auxs) - if err != nil { - err = fmt.Errorf("Computing confirmed address balance failed: %v", err) - return - } - - coins2, hours2, err := gw.v.AddressBalance(auxs.Sub(spendUxs).Add(recvUxs)) - if err != nil { - err = fmt.Errorf("Computing predicted address balance failed: %v", err) - return - } + // compute the sum of all addresses + for _, addrBalance := range addressBalances { + // compute confirmed balance + walletBalance.Confirmed.Coins, err = coin.AddUint64(walletBalance.Confirmed.Coins, addrBalance.Confirmed.Coins) + if err != nil { + return + } + walletBalance.Confirmed.Hours, err = coin.AddUint64(walletBalance.Confirmed.Hours, addrBalance.Confirmed.Hours) + if err != nil { + return + } - balance = wallet.BalancePair{ - Confirmed: wallet.Balance{Coins: coins1, Hours: hours1}, - Predicted: wallet.Balance{Coins: coins2, Hours: hours2}, + // compute predicted balance + walletBalance.Predicted.Coins, err = coin.AddUint64(walletBalance.Predicted.Coins, addrBalance.Predicted.Coins) + if err != nil { + return + } + walletBalance.Predicted.Hours, err = coin.AddUint64(walletBalance.Predicted.Hours, addrBalance.Predicted.Hours) + if err != nil { + return + } } }) - return balance, err + return walletBalance, addressBalances, err } // GetBalanceOfAddrs gets balance of given addresses func (gw *Gateway) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) { - var bps []wallet.BalancePair + var balance []wallet.BalancePair var err error + gw.strand("GetBalanceOfAddrs", func() { - bps, err = gw.v.GetBalanceOfAddrs(addrs) + balance, err = gw.v.GetBalanceOfAddrs(addrs) }) - return bps, err + if err != nil { + return nil, err + } + + return balance, nil } // GetWalletDir returns path for storing wallet files @@ -816,7 +1031,7 @@ func (gw *Gateway) GetWalletUnconfirmedTxns(wltID string) ([]visor.UnconfirmedTx return } - txns = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) + txns, err = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) }) return txns, err @@ -913,17 +1128,14 @@ func (gw *Gateway) GetRichlist(includeDistribution bool) (visor.Richlist, error) // GetAddressCount returns count number of unique address with uxouts > 0. func (gw *Gateway) GetAddressCount() (uint64, error) { - rbOuts, err := gw.GetUnspentOutputs() - if err != nil { - return 0, err - } + var count uint64 + var err error - allAccounts, err := rbOuts.AggregateUnspentOutputs() - if err != nil { - return 0, err - } + gw.strand("GetAddressCount", func() { + count, err = gw.v.AddressCount() + }) - return uint64(len(allAccounts)), nil + return count, err } // Health is returned by the /health endpoint @@ -945,7 +1157,7 @@ func (gw *Gateway) GetHealth() (*Health, error) { return } - conns := gw.drpc.GetConnections(gw.d) + conns := gw.getConnections() health = &Health{ BlockchainMetadata: metadata, @@ -957,3 +1169,20 @@ func (gw *Gateway) GetHealth() (*Health, error) { return health, err } + +// VerifyTxnVerbose verifies an isolated transaction and returns []wallet.UxBalance of +// transaction inputs, whether the transaction is confirmed and error if any +func (gw *Gateway) VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) { + var uxs []wallet.UxBalance + var isTxnConfirmed bool + var err error + gw.strand("VerifyTxnVerbose", func() { + uxs, isTxnConfirmed, err = gw.v.VerifyTxnVerbose(txn) + }) + return uxs, isTxnConfirmed, err +} + +// IsCSPEnabled returns if the csp is enabled +func (gw *Gateway) IsCSPEnabled() bool { + return !gw.Config.DisableCSP +} diff --git a/src/daemon/gateway_test.go b/src/daemon/gateway_test.go index 51704b0..b4c46e1 100755 --- a/src/daemon/gateway_test.go +++ b/src/daemon/gateway_test.go @@ -65,9 +65,6 @@ func TestFbyHashes(t *testing.T) { } } - type args struct { - hashes []string - } tests := []struct { name string hashes []string @@ -404,7 +401,7 @@ func TestGateway_GetWalletBalance(t *testing.T) { EnableWalletAPI: tc.enableWalletAPI, }, } - res, err := gw.GetWalletBalance(tc.walletID) + res, _, err := gw.GetWalletBalance(tc.walletID) if tc.err != nil { require.Equal(t, tc.err, err) return diff --git a/src/daemon/gnet/dispatcher.go b/src/daemon/gnet/dispatcher.go index 9d96031..e6fbd12 100755 --- a/src/daemon/gnet/dispatcher.go +++ b/src/daemon/gnet/dispatcher.go @@ -45,7 +45,7 @@ func convertToMessage(id int, msg []byte, debugPrint bool) (Message, error) { } if debugPrint { - logger.Debugf("Convert, Message type %v", t) + logger.Debugf("convertToMessage for connection %d, message type %v", id, t) } var m Message @@ -55,6 +55,7 @@ func convertToMessage(id int, msg []byte, debugPrint bool) (Message, error) { if err != nil { return nil, err } + if used != len(msg) { return nil, errors.New("Data buffer was not completely decoded") } diff --git a/src/daemon/gnet/dispatcher_test.go b/src/daemon/gnet/dispatcher_test.go index f7b8dca..8c28db7 100755 --- a/src/daemon/gnet/dispatcher_test.go +++ b/src/daemon/gnet/dispatcher_test.go @@ -71,7 +71,6 @@ func TestConvertToMessageBadDeserialize(t *testing.T) { b := append(DummyPrefix[:], []byte{0, 1, 1, 1}...) m, err := convertToMessage(c.ID, b, testing.Verbose()) assert.NotNil(t, err) - assert.Equal(t, err.Error(), "Data buffer was not completely decoded") assert.Nil(t, m) // Test with not enough bytes @@ -172,10 +171,6 @@ func TestSendMessage(t *testing.T) { /* Helpers */ -func noopSendByteMessage(conn net.Conn, m []byte, tm time.Duration) error { - return nil -} - func failingSendByteMessage(conn net.Conn, m []byte, tm time.Duration) error { return errors.New("send byte message failed") } diff --git a/src/daemon/gnet/message_test.go b/src/daemon/gnet/message_test.go index 24b82c1..071de3a 100755 --- a/src/daemon/gnet/message_test.go +++ b/src/daemon/gnet/message_test.go @@ -151,10 +151,13 @@ func NewDummyMessage() Message { type ErrorMessage struct{} -var ErrorPrefix = MessagePrefix{'E', 'R', 'R', 0x00} +var ( + ErrorPrefix = MessagePrefix{'E', 'R', 'R', 0x00} + ErrErrorMessageHandler = errors.New("Bad") +) func (em *ErrorMessage) Handle(context *MessageContext, x interface{}) error { - return errors.New("Bad") + return ErrErrorMessageHandler } func NewErrorMessage() Message { diff --git a/src/daemon/gnet/pool.go b/src/daemon/gnet/pool.go index 6c4898f..816c551 100755 --- a/src/daemon/gnet/pool.go +++ b/src/daemon/gnet/pool.go @@ -28,6 +28,7 @@ const ( readLoopDurationThreshold = 10 * time.Second sendInMsgChanDurationThreshold = 5 * time.Second sendLoopDurationThreshold = 500 * time.Millisecond + defaultMaxDefaultConnNum = 1 ) var ( @@ -51,6 +52,8 @@ var ( ErrWriteQueueFull = errors.New("Write queue full") // ErrNoReachableConnections when broadcasting a message, no connections were available to send a message to ErrNoReachableConnections = errors.New("All pool connections are unreachable at this time") + // ErrMaxDefaultConnectionsReached returns when maximum number of default connections is reached + ErrMaxDefaultConnectionsReached = errors.New("maximum number of default outgoing connections was reached") // Logger logger = logging.MustGetLogger("gnet") ) @@ -65,6 +68,8 @@ type Config struct { MaxConnections int // Messages greater than length are rejected and the sender disconnected MaxMessageLength int + // Maximum allowed default outgoing connection number + MaxDefaultPeerOutgoingConnections int // Timeout is the timeout for dialing new connections. Use a // timeout of 0 to ignore timeout. DialTimeout time.Duration @@ -85,23 +90,27 @@ type Config struct { ConnectCallback ConnectCallback // Print debug logs DebugPrint bool + // Default connections map + DefaultPeerConnections map[string]struct{} } // NewConfig returns a Config with defaults set func NewConfig() Config { return Config{ - Address: "", - Port: 0, - MaxConnections: 128, - MaxMessageLength: 256 * 1024, - DialTimeout: time.Second * 30, - ReadTimeout: time.Second * 30, - WriteTimeout: time.Second * 30, - SendResultsSize: 2048, - ConnectionWriteQueueSize: 128, - DisconnectCallback: nil, - ConnectCallback: nil, - DebugPrint: false, + Address: "", + Port: 0, + MaxConnections: 128, + MaxMessageLength: 256 * 1024, + MaxDefaultPeerOutgoingConnections: defaultMaxDefaultConnNum, + DialTimeout: time.Second * 30, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + SendResultsSize: 2048, + ConnectionWriteQueueSize: 128, + DisconnectCallback: nil, + ConnectCallback: nil, + DebugPrint: false, + DefaultPeerConnections: make(map[string]struct{}), } } @@ -157,7 +166,6 @@ func (conn *Connection) String() string { func (conn *Connection) Close() error { err := conn.Conn.Close() close(conn.WriteQueue) - conn.WriteQueue = nil conn.Buffer = &bytes.Buffer{} return err } @@ -178,6 +186,8 @@ type ConnectionPool struct { pool map[int]*Connection // All connections, indexed by address addresses map[string]*Connection + // connected default peer connections + defaultPeerConnections map[string]struct{} // User-defined state to be passed into message handlers messageState interface{} // Connection ID counter @@ -187,9 +197,10 @@ type ConnectionPool struct { // operations channel reqC chan strand.Request // quit channel - quit chan struct{} - done chan struct{} - wg sync.WaitGroup + quit chan struct{} + done chan struct{} + strandDone chan struct{} + wg sync.WaitGroup } // NewConnectionPool creates a new ConnectionPool that will listen on @@ -197,14 +208,16 @@ type ConnectionPool struct { // will be passed to a Message's Handle(). func NewConnectionPool(c Config, state interface{}) *ConnectionPool { pool := &ConnectionPool{ - Config: c, - pool: make(map[int]*Connection), - addresses: make(map[string]*Connection), - SendResults: make(chan SendResult, c.SendResultsSize), - messageState: state, - quit: make(chan struct{}), - done: make(chan struct{}), - reqC: make(chan strand.Request), + Config: c, + pool: make(map[int]*Connection), + addresses: make(map[string]*Connection), + defaultPeerConnections: make(map[string]struct{}), + SendResults: make(chan SendResult, c.SendResultsSize), + messageState: state, + quit: make(chan struct{}), + done: make(chan struct{}), + strandDone: make(chan struct{}), + reqC: make(chan strand.Request), } return pool @@ -251,7 +264,9 @@ loop: pool.wg.Add(1) go func() { defer pool.wg.Done() - pool.handleConnection(conn, false) + if err := pool.handleConnection(conn, false); err != nil { + logger.Errorf("pool.handleConnection error: %v", err) + } }() } pool.wg.Wait() @@ -267,6 +282,7 @@ func (pool *ConnectionPool) RunOffline() error { } func (pool *ConnectionPool) processStrand() { + defer close(pool.strandDone) for { select { case <-pool.quit: @@ -284,9 +300,7 @@ func (pool *ConnectionPool) Shutdown() { close(pool.quit) // Wait for all strand() calls to finish - pool.strand("waitingToShutdown", func() error { - return nil - }) + <-pool.strandDone // Close to listener to prevent new connections if pool.listener != nil { @@ -301,6 +315,13 @@ func (pool *ConnectionPool) Shutdown() { // TODO -- could conn.Close() block too? pool.disconnectAll() + if len(pool.pool) != 0 { + logger.Critical().Warning("pool.pool is not empty after calling pool.disconnectAll()") + } + if len(pool.addresses) != 0 { + logger.Critical().Warning("pool.addresses is not empty after calling pool.disconnectAll()") + } + <-pool.done } @@ -316,9 +337,18 @@ func (pool *ConnectionPool) NewConnection(conn net.Conn, solicited bool) (*Conne a := conn.RemoteAddr().String() var nc *Connection if err := pool.strand("NewConnection", func() error { - if pool.addresses[a] != nil { + if _, ok := pool.addresses[a]; ok { return fmt.Errorf("Already connected to %s", a) } + + if _, ok := pool.Config.DefaultPeerConnections[a]; ok { + if len(pool.defaultPeerConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections && solicited { + return ErrMaxDefaultConnectionsReached + } + + pool.defaultPeerConnections[a] = struct{}{} + } + pool.connID++ nc = NewConnection(pool, pool.connID, conn, pool.Config.ConnectionWriteQueueSize, solicited) @@ -343,24 +373,39 @@ func (pool *ConnectionPool) ListeningAddress() (net.Addr, error) { } // Creates a Connection and begins its read and write loop -func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) { - defer logger.Debugf("connection %s closed", conn.RemoteAddr()) +func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) error { + defer logger.Debugf("Connection %s closed", conn.RemoteAddr()) addr := conn.RemoteAddr().String() - exist, err := pool.IsConnExist(addr) - if err != nil { - logger.Error(err) - return - } - if exist { - logger.Errorf("Connection %s already exists", addr) - return - } + c, err := func() (c *Connection, err error) { + defer func() { + if err != nil { + if closeErr := conn.Close(); closeErr != nil { + logger.Errorf("conn.Close() %s error: %v", addr, closeErr) + } + } + }() + + exist, err := pool.IsConnExist(addr) + if err != nil { + return + } + if exist { + err = fmt.Errorf("Connection %s already exists", addr) + return + } + + c, err = pool.NewConnection(conn, solicited) + if err != nil { + err = fmt.Errorf("Create connection to %s failed: %v", addr, err) + return + } + + return c, err + }() - c, err := pool.NewConnection(conn, solicited) if err != nil { - logger.Errorf("Create connection to %s failed: %v", addr, err) - return + return err } if pool.Config.ConnectCallback != nil { @@ -370,7 +415,7 @@ func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) { msgC := make(chan []byte, 32) errC := make(chan error, 3) - wg := sync.WaitGroup{} + var wg sync.WaitGroup wg.Add(1) qc := make(chan struct{}) go func() { @@ -425,6 +470,8 @@ func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) { close(qc) wg.Wait() + + return err } func (pool *ConnectionPool) readLoop(conn *Connection, msgChan chan []byte, qc chan struct{}) error { @@ -499,7 +546,18 @@ func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, qc if m == nil { continue } + err := sendMessage(conn.Conn, m, timeout) + + // Update last sent before writing to SendResult, + // this allows a write to SendResult to be used as a sync marker, + // since no further action in this block will happen after the write. + if err == nil { + if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { + logger.Warningf("updateLastSent(%s) failed", conn.Addr()) + } + } + sr := newSendResult(conn.Addr(), m, err) select { case <-qc: @@ -512,10 +570,6 @@ func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, qc if err != nil { return err } - - if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { - return err - } } } } @@ -585,6 +639,27 @@ func (pool *ConnectionPool) IsConnExist(addr string) (bool, error) { return exist, nil } +// IsDefaultConnection returns if the addr is a default connection +func (pool *ConnectionPool) IsDefaultConnection(addr string) bool { + _, ok := pool.Config.DefaultPeerConnections[addr] + return ok +} + +// IsMaxDefaultConnReached returns whether the max default connection number was reached. +func (pool *ConnectionPool) IsMaxDefaultConnReached() (bool, error) { + var reached bool + if err := pool.strand("IsDefaultMaxConnReached", func() error { + l := len(pool.defaultPeerConnections) + logger.Debugf("%d/%d default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + reached = l > pool.Config.MaxDefaultPeerOutgoingConnections + return nil + }); err != nil { + return false, err + } + + return reached, nil +} + func (pool *ConnectionPool) updateLastSent(addr string, t time.Time) error { return pool.strand("updateLastSent", func() error { if conn, ok := pool.addresses[addr]; ok { @@ -631,6 +706,23 @@ func (pool *ConnectionPool) Connect(address string) error { return nil } + var hitMaxDefaultConnNum bool + // Checks if it's one of the default connection + if err := pool.strand("Check default connection", func() error { + if _, ok := pool.Config.DefaultPeerConnections[address]; ok { + hitMaxDefaultConnNum = len(pool.defaultPeerConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections + } + + return nil + }); err != nil { + return err + } + + if hitMaxDefaultConnNum { + logger.Critical().Infof("ConnectionPool.Connect: %v", ErrMaxDefaultConnectionsReached) + return nil + } + logger.Debugf("Making TCP Connection to %s", address) conn, err := net.DialTimeout("tcp", address, pool.Config.DialTimeout) if err != nil { @@ -640,7 +732,9 @@ func (pool *ConnectionPool) Connect(address string) error { pool.wg.Add(1) go func() { defer pool.wg.Done() - pool.handleConnection(conn, true) + if err := pool.handleConnection(conn, true); err != nil { + logger.Errorf("pool.handleConnection error: %v", err) + } }() return nil } @@ -648,30 +742,30 @@ func (pool *ConnectionPool) Connect(address string) error { // Disconnect removes a connection from the pool by address, and passes a Disconnection to // the DisconnectCallback func (pool *ConnectionPool) Disconnect(addr string, r DisconnectReason) error { - var exist bool if err := pool.strand("Disconnect", func() error { - exist = pool.disconnect(addr) + exist := pool.disconnect(addr) + + if pool.Config.DisconnectCallback != nil && exist { + pool.Config.DisconnectCallback(addr, r) + } + return nil }); err != nil { return err } - if pool.Config.DisconnectCallback != nil && exist { - pool.Config.DisconnectCallback(addr, r) - } - return nil } func (pool *ConnectionPool) disconnect(addr string) bool { conn, ok := pool.addresses[addr] - if !ok { return false } delete(pool.pool, conn.ID) delete(pool.addresses, addr) + delete(pool.defaultPeerConnections, addr) if err := conn.Close(); err != nil { logger.Errorf("conn.Close() error address=%s: %v", addr, err) } else { @@ -712,6 +806,23 @@ func (pool *ConnectionPool) Size() (l int, err error) { return } +// OutgoingConnectionsNum returns the number of outgoing connections +func (pool *ConnectionPool) OutgoingConnectionsNum() (int, error) { + var n int + if err := pool.strand("OutgoingSize", func() error { + for _, p := range pool.pool { + if p.Solicited { + n++ + } + } + return nil + }); err != nil { + return 0, err + } + + return n, nil +} + // SendMessage sends a Message to a Connection and pushes the result onto the // SendResults channel. func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { @@ -727,6 +838,8 @@ func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { logger.Critical().Infof("Write queue full for address %s", addr) return ErrWriteQueueFull } + } else { + return fmt.Errorf("Tried to send %T to %s, but we are not connected", msg, addr) } return nil }) diff --git a/src/daemon/gnet/pool_test.go b/src/daemon/gnet/pool_test.go index 98f5121..c93d4a4 100755 --- a/src/daemon/gnet/pool_test.go +++ b/src/daemon/gnet/pool_test.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "net" + "strings" "sync" "testing" "time" @@ -68,16 +69,20 @@ func TestNewConnection(t *testing.T) { require.NoError(t, err) wait() - c := p.addresses[conn.LocalAddr().String()] - require.Equal(t, p.pool[p.connID], c) - require.Equal(t, p.connID, 1) - require.Equal(t, c.Addr(), conn.LocalAddr().String()) - require.Equal(t, cap(c.WriteQueue), cfg.ConnectionWriteQueueSize) - require.NotNil(t, c.Buffer) - require.Equal(t, c.Buffer.Len(), 0) - require.Equal(t, c.ConnectionPool, p) - require.False(t, c.LastSent.IsZero()) - require.False(t, c.LastReceived.IsZero()) + err = p.strand("", func() error { + c := p.addresses[conn.LocalAddr().String()] + require.Equal(t, p.pool[p.connID], c) + require.Equal(t, p.connID, 1) + require.Equal(t, c.Addr(), conn.LocalAddr().String()) + require.Equal(t, cap(c.WriteQueue), cfg.ConnectionWriteQueueSize) + require.NotNil(t, c.Buffer) + require.Equal(t, c.Buffer.Len(), 0) + require.Equal(t, c.ConnectionPool, p) + require.False(t, c.LastSent.IsZero()) + require.False(t, c.LastReceived.IsZero()) + return nil + }) + require.NoError(t, err) p.Shutdown() <-q @@ -87,6 +92,12 @@ func TestNewConnectionAlreadyConnected(t *testing.T) { cfg := newTestConfig() p := NewConnectionPool(cfg, nil) + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + require.False(t, solicited) + cc <- p.pool[1] + } + q := make(chan struct{}) go func() { defer close(q) @@ -96,13 +107,17 @@ func TestNewConnectionAlreadyConnected(t *testing.T) { conn, err := net.Dial("tcp", addr) require.NoError(t, err) - wait() - c := p.addresses[conn.LocalAddr().String()] + c := <-cc require.NotNil(t, c) + ac := p.addresses[conn.LocalAddr().String()] + require.NotNil(t, ac) + require.Equal(t, c.ID, ac.ID) + _, err = p.NewConnection(c.Conn, true) require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "Already connected to")) p.Shutdown() <-q @@ -127,8 +142,6 @@ func TestAcceptConnections(t *testing.T) { }() wait() - require.NotNil(t, p.listener) - conn, err := net.Dial("tcp", addr) require.NoError(t, err) @@ -177,12 +190,16 @@ func TestStopListen(t *testing.T) { }() wait() - require.NotNil(t, p.listener) _, err := net.Dial("tcp", addr) require.NoError(t, err) wait() - require.Equal(t, len(p.pool), 1) + err = p.strand("", func() error { + require.Equal(t, len(p.pool), 1) + return nil + }) + require.NoError(t, err) + p.Shutdown() <-q @@ -231,7 +248,11 @@ func TestHandleConnection(t *testing.T) { cc <- p.pool[2] } - go p.handleConnection(conn, true) + done := make(chan struct{}) + go func() { + defer close(done) + p.handleConnection(conn, true) + }() c = <-cc require.NotNil(t, c) @@ -248,6 +269,9 @@ func TestHandleConnection(t *testing.T) { require.Equal(t, len(p.pool), 1) p.Shutdown() + + <-done + <-q } @@ -336,16 +360,34 @@ func TestDisconnect(t *testing.T) { c := <-cc require.NotNil(t, c) - p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - require.Equal(t, addr, c.Addr()) - } + var cAddr string + err = p.strand("", func() error { + cAddr = c.Addr() + return nil + }) + require.NoError(t, err) - p.Disconnect(c.Addr(), ErrDisconnectMalformedMessage) + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, cAddr, addr) + } + return nil + }) + require.NoError(t, err) - p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - t.Fatal("disconnect unknown connection should not see this") - } - p.Disconnect("", nil) + err = p.Disconnect(c.Addr(), ErrDisconnectMalformedMessage) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + t.Fatal("disconnect unknown connection should not see this") + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect("", nil) + require.NoError(t, err) p.Shutdown() <-q @@ -361,9 +403,13 @@ func TestConnectionClose(t *testing.T) { c.Buffer.WriteByte(7) require.Equal(t, c.Buffer.Len(), 1) c.Close() - wait() - require.Nil(t, c.WriteQueue) + select { + case <-c.WriteQueue: + case <-time.After(time.Millisecond): + t.Fatalf("WriteQueue should be closed") + } + require.Equal(t, c.Buffer.Len(), 0) } @@ -433,10 +479,15 @@ func TestGetConnections(t *testing.T) { <-q } -func TestConnectionReadLoop(t *testing.T) { +func TestConnectionReadLoopReadError(t *testing.T) { cfg := newTestConfig() p := NewConnectionPool(cfg, nil) + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + q := make(chan struct{}) go func() { defer close(q) @@ -445,58 +496,164 @@ func TestConnectionReadLoop(t *testing.T) { wait() + readDataErr := errors.New("read data failed: failed") + + disconnectCalled := make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - // require.Equal(t, connID, 1) - require.Equal(t, reason, errors.New("read data failed: failed")) + require.Equal(t, readDataErr, reason) + close(disconnectCalled) } // 1: // Use a mock net.Conn that captures SetReadDeadline // and throws an error on Read reconn := NewReadErrorConn() - go p.handleConnection(reconn, false) + go func() { + err := p.handleConnection(reconn, false) + require.Equal(t, readDataErr, err) + }() + + <-cc + wait() - require.True(t, reconn.(*ReadErrorConn).ReadDeadlineSet != time.Time{}) + + require.True(t, reconn.(*ReadErrorConn).GetReadDeadlineSet() != time.Time{}) reconn.Close() + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopSetReadDeadlineFailed(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + // 2: // Use a mock net.Conn that fails on SetReadDeadline + disconnectCalled := make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - // require.Equal(t, connID, 2) - require.Equal(t, reason, ErrDisconnectSetReadDeadlineFailed) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, reason) + close(disconnectCalled) } rdfconn := &ReadDeadlineFailedConn{} - go p.handleConnection(rdfconn, false) - wait() + go func() { + err := p.handleConnection(rdfconn, false) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, err) + }() + + <-cc + rdfconn.Close() + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopInvalidMessageLength(t *testing.T) { + cfg := newTestConfig() + cfg.MaxMessageLength = 1 + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + // 3: // Use a mock net.Conn that returns some bytes on Read // Look for these bytes copied into the eventChannel + disconnectCalled := make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - // require.Equal(t, connID, 3) - require.Equal(t, reason, ErrDisconnectInvalidMessageLength) + require.Equal(t, ErrDisconnectInvalidMessageLength, reason) + close(disconnectCalled) } - raconn := &ReadAlwaysConn{} - go p.handleConnection(raconn, false) + + raconn := newReadAlwaysConn() + go func() { + err := p.handleConnection(raconn, false) + require.Equal(t, ErrDisconnectInvalidMessageLength, err) + }() + + <-cc + wait() raconn.stop() wait() raconn.Close() + <-disconnectCalled + + p.Shutdown() + <-q + +} + +func TestConnectionReadLoopTerminates(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + readDataErr := errors.New("read data failed: done") + // 4: Use a mock net.Conn that successfully returns 0 bytes when read - rnconn := &ReadNothingConn{} + rnconn := newReadNothingConn() + disconnectCalled := make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - // require.Equal(t, connID, 4) - require.Equal(t, reason, errors.New("read data failed: done")) + require.Equal(t, readDataErr, reason) + close(disconnectCalled) } - go p.handleConnection(rnconn, false) + go func() { + err := p.handleConnection(rnconn, false) + require.Equal(t, readDataErr, err) + }() + + <-cc + wait() rnconn.stop() wait() rnconn.Close() + <-disconnectCalled + p.Shutdown() <-q } @@ -512,10 +669,12 @@ func TestProcessConnectionBuffers(t *testing.T) { // Setup a callback to capture the connection pointer so we can get the address cc := make(chan *Connection, 1) - i := 1 p.Config.ConnectCallback = func(addr string, solicited bool) { - cc <- p.pool[i] - i++ + cc <- p.addresses[addr] + } + + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + t.Fatalf("Unexpected disconnect address=%s reason=%v", addr, reason) } q := make(chan struct{}) @@ -529,41 +688,50 @@ func TestProcessConnectionBuffers(t *testing.T) { require.NoError(t, err) c := <-cc + require.NotNil(t, c) - p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - t.Fatalf("Unexpected disconnect address=%s reason=%v", addr, reason) - } - - conn.Write([]byte{4, 0, 0, 0}) + // Write DummyMessage + _, err = conn.Write([]byte{4, 0, 0, 0}) + require.NoError(t, err) + _, err = conn.Write([]byte{'D', 'U', 'M', 'Y'}) + require.NoError(t, err) - // A DummyMessage should have been processed - conn.Write([]byte{'D', 'U', 'M', 'Y'}) - wait() - require.NotEqual(t, c.LastReceived, time.Time{}) - require.Equal(t, c.Buffer.Len(), 0) - conn.Write([]byte{5, 0, 0, 0, 0}) wait() - require.Equal(t, c.Buffer.Len(), 5) + + err = p.strand("", func() error { + require.NotEqual(t, c.LastReceived, time.Time{}) + return nil + }) + require.NoError(t, err) // Push multiple messages, the first causing an error, and confirm that // the remaining messages were unprocessed. t.Logf("Pushing multiple messages, first one causing an error") - c.Buffer.Reset() + + disconnectCalled := make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - require.Equal(t, reason, errors.New("Bad")) + require.Equal(t, reason, ErrErrorMessageHandler) + close(disconnectCalled) } - conn.Write([]byte{4, 0, 0, 0, 'E', 'R', 'R', 0x00}) - wait() - require.Equal(t, c.Buffer.Len(), 0) + _, err = conn.Write([]byte{4, 0, 0, 0, 'E', 'R', 'R', 0x00}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { fmt.Println(reason) t.Fatal("should not see this") } - conn.Write([]byte{4, 0, 0, 0, 'D', 'U', 'M', 'Y'}) + + _, err = conn.Write([]byte{4, 0, 0, 0, 'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + wait() - require.Equal(t, c.Buffer.Len(), 0) conn, err = net.Dial("tcp", addr) require.NoError(t, err) @@ -571,18 +739,26 @@ func TestProcessConnectionBuffers(t *testing.T) { c = <-cc require.NotNil(t, c) + disconnectCalled = make(chan struct{}) p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { require.Equal(t, c.Addr(), addr) require.Equal(t, reason, ErrDisconnectInvalidMessageLength) require.Nil(t, p.pool[1]) require.Nil(t, p.pool[2]) + close(disconnectCalled) } // Sending a length of < messagePrefixLength should cause a disconnect t.Logf("Pushing message with too small length") - c.Buffer.Reset() - conn.Write([]byte{messagePrefixLength - 1, 0, 0, 0, 'B', 'Y', 'T', 'E'}) - wait() + + _, err = conn.Write([]byte{messagePrefixLength - 1, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } // Sending a length > MaxMessageLength should cause a disconnect conn, err = net.Dial("tcp", addr) @@ -592,17 +768,24 @@ func TestProcessConnectionBuffers(t *testing.T) { require.NotNil(t, c) t.Logf("Pushing message with too large length") - max := p.Config.MaxMessageLength p.Config.MaxMessageLength = 4 + disconnectCalled = make(chan struct{}) p.Config.DisconnectCallback = func(addr string, r DisconnectReason) { require.Equal(t, ErrDisconnectInvalidMessageLength, r) + close(disconnectCalled) + } + + _, err = conn.Write([]byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + <-disconnectCalled + + err = p.strand("", func() error { require.Nil(t, p.pool[1]) require.Nil(t, p.pool[2]) require.Nil(t, p.pool[3]) - } - conn.Write([]byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E'}) - wait() - p.Config.MaxMessageLength = max + return nil + }) p.Shutdown() <-q @@ -623,6 +806,12 @@ func TestConnectionWriteLoop(t *testing.T) { cc <- p.pool[1] } + disconnectErr := make(chan DisconnectReason, 1) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + fmt.Printf("DisconnectCallback called, address=%s reason=%v\n", addr, reason) + disconnectErr <- reason + } + q := make(chan struct{}) go func() { defer close(q) @@ -656,36 +845,26 @@ func TestConnectionWriteLoop(t *testing.T) { t.Fatal("No send results, would block") } + require.Len(t, p.SendResults, 0) + require.Equal(t, sr.Message, m) require.Equal(t, sr.Addr, c.Addr()) require.Nil(t, sr.Error) - wait() - - var c2 *Connection - p.strand("", func() error { - fmt.Println("len(p.pool)", len(p.pool)) - c2 = p.pool[1] + err = p.strand("", func() error { + c = p.pool[c.ID] return nil }) + require.NoError(t, err) + require.NotNil(t, c) - require.NotNil(t, c2) - - require.False(t, c2.LastSent.IsZero()) - fmt.Println("c2.LastSent", c2.LastSent) - c2.LastSent = time.Time{} - require.True(t, c2.LastSent.IsZero()) - fmt.Println("Reset c2.LastSent to zero") + lastSent := c.LastSent + require.False(t, lastSent.IsZero()) - // Send a failed message to c2 + // Send a failed message to c sendByteMessage = failingSendByteMessage - disconnectErr := make(chan DisconnectReason, 1) - p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { - fmt.Printf("DisconnectCallback called, address=%s reason=%v\n", addr, reason) - disconnectErr <- reason - } - err = p.SendMessage(c2.Addr(), m) + err = p.SendMessage(c.Addr(), m) require.NoError(t, err) select { @@ -694,15 +873,15 @@ func TestConnectionWriteLoop(t *testing.T) { t.Fatal("No send results, would block") } require.Equal(t, sr.Message, m) - require.Equal(t, sr.Addr, c2.Addr()) + require.Equal(t, sr.Addr, c.Addr()) require.NotNil(t, sr.Error) reason := <-disconnectErr require.NotNil(t, reason) require.Equal(t, errors.New("send byte message failed"), reason) - fmt.Println("Final c2.LastSent", c2.LastSent) - require.True(t, c2.LastSent.IsZero()) + // c.LastSent should not have changed + require.Equal(t, lastSent, c.LastSent) p.Shutdown() <-q @@ -916,7 +1095,7 @@ func TestPoolReceiveMessage(t *testing.T) { b = make([]byte, 0) b = append(b, ErrorPrefix[:]...) err = p.receiveMessage(c, b) - require.Equal(t, err.Error(), "Bad") + require.Equal(t, err, ErrErrorMessageHandler) p.Shutdown() <-q @@ -982,10 +1161,11 @@ func (dc *DummyConn) Write(b []byte) (int, error) { type ReadErrorConn struct { net.Conn ReadDeadlineSet time.Time + sync.Mutex } func NewReadErrorConn() net.Conn { - return &ReadErrorConn{nil, time.Time{}} + return &ReadErrorConn{} } func (rec *ReadErrorConn) RemoteAddr() net.Addr { @@ -993,10 +1173,18 @@ func (rec *ReadErrorConn) RemoteAddr() net.Addr { } func (rec *ReadErrorConn) SetReadDeadline(t time.Time) error { + rec.Lock() + defer rec.Unlock() rec.ReadDeadlineSet = t return nil } +func (rec *ReadErrorConn) GetReadDeadlineSet() time.Time { + rec.Lock() + defer rec.Unlock() + return rec.ReadDeadlineSet +} + func (rec *ReadErrorConn) Read(b []byte) (int, error) { return 0, errors.New("failed") } @@ -1025,64 +1213,83 @@ func (c *ReadDeadlineFailedConn) Close() error { return nil } -type ReadAlwaysConn struct { +type readAlwaysConn struct { net.Conn - stopReading bool + stopReading chan struct{} } -func (c *ReadAlwaysConn) RemoteAddr() net.Addr { +func newReadAlwaysConn() *readAlwaysConn { + return &readAlwaysConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readAlwaysConn) RemoteAddr() net.Addr { return NewDummyAddr(addr) } -func (c *ReadAlwaysConn) Close() error { +func (c *readAlwaysConn) Close() error { return nil } -func (c *ReadAlwaysConn) Read(b []byte) (int, error) { - if c.stopReading { +func (c *readAlwaysConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: return 0, errors.New("done") + default: } + if len(b) == 0 { return 0, nil } + b[0] = byte(88) - time.Sleep(time.Millisecond * 2) + return 1, nil } -func (c *ReadAlwaysConn) SetReadDeadline(t time.Time) error { +func (c *readAlwaysConn) SetReadDeadline(t time.Time) error { return nil } -func (c *ReadAlwaysConn) stop() { - c.stopReading = true +func (c *readAlwaysConn) stop() { + close(c.stopReading) } -type ReadNothingConn struct { +type readNothingConn struct { net.Conn - stopReading bool + stopReading chan struct{} +} + +func newReadNothingConn() *readNothingConn { + return &readNothingConn{ + stopReading: make(chan struct{}), + } } -func (c *ReadNothingConn) Read(b []byte) (int, error) { - if c.stopReading { +func (c *readNothingConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: return 0, errors.New("done") + default: } + time.Sleep(time.Millisecond * 2) return 0, nil } -func (c *ReadNothingConn) SetReadDeadline(t time.Time) error { +func (c *readNothingConn) SetReadDeadline(t time.Time) error { return nil } -func (c *ReadNothingConn) RemoteAddr() net.Addr { +func (c *readNothingConn) RemoteAddr() net.Addr { return NewDummyAddr(addr) } -func (c *ReadNothingConn) Close() error { +func (c *readNothingConn) Close() error { return nil } -func (c *ReadNothingConn) stop() { - c.stopReading = true +func (c *readNothingConn) stop() { + close(c.stopReading) } diff --git a/src/daemon/heights.go b/src/daemon/heights.go new file mode 100755 index 0000000..57288b8 --- /dev/null +++ b/src/daemon/heights.go @@ -0,0 +1,84 @@ +package daemon + +import ( + "sort" + "strings" + "sync" +) + +// PeerBlockchainHeight is a peer's IP address with their reported blockchain height +type PeerBlockchainHeight struct { + Address string `json:"address"` + Height uint64 `json:"height"` +} + +// peerBlockchainHeights tracks reported blockchain heights of peers +type peerBlockchainHeights struct { + // Peer-reported blockchain height. Use to estimate download progress + heights map[string]uint64 + sync.Mutex +} + +// newPeerBlockchainHeights creates a peerBlockchainHeights +func newPeerBlockchainHeights() *peerBlockchainHeights { + return &peerBlockchainHeights{ + heights: make(map[string]uint64), + } +} + +// Remove removes a connection from the records +func (p *peerBlockchainHeights) Remove(addr string) { + p.Lock() + defer p.Unlock() + + delete(p.heights, addr) +} + +// Record saves a peer-reported blockchain height +func (p *peerBlockchainHeights) Record(addr string, height uint64) { + p.Lock() + defer p.Unlock() + + p.heights[addr] = height +} + +// Estimate returns the blockchain length estimated from peer reports. +// The highest height reported amongst all peers, and including the node itself, +// is returned. +func (p *peerBlockchainHeights) Estimate(headSeq uint64) uint64 { + p.Lock() + defer p.Unlock() + + for _, seq := range p.heights { + if headSeq < seq { + headSeq = seq + } + } + + return headSeq +} + +// All returns recorded peers' blockchain heights as an array. +// The array is sorted by address as strings. +func (p *peerBlockchainHeights) All() []PeerBlockchainHeight { + p.Lock() + defer p.Unlock() + + if len(p.heights) == 0 { + return nil + } + + peerHeights := make([]PeerBlockchainHeight, 0, len(p.heights)) + for addr, height := range p.heights { + peerHeights = append(peerHeights, PeerBlockchainHeight{ + Address: addr, + Height: height, + }) + } + + sort.Slice(peerHeights, func(i, j int) bool { + return strings.Compare(peerHeights[i].Address, peerHeights[j].Address) < 0 + }) + + return peerHeights +} diff --git a/src/daemon/heights_test.go b/src/daemon/heights_test.go new file mode 100755 index 0000000..f3acd1d --- /dev/null +++ b/src/daemon/heights_test.go @@ -0,0 +1,82 @@ +package daemon + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPeerBlockchainHeights(t *testing.T) { + p := newPeerBlockchainHeights() + + addr1 := "127.0.0.1:1234" + addr2 := "127.0.0.1:5678" + addr3 := "127.0.0.1:9999" + + require.Empty(t, p.heights) + p.Remove(addr1) + require.Empty(t, p.heights) + + e := p.Estimate(1) + require.Equal(t, uint64(1), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr1, 10) + require.Len(t, p.heights, 1) + + records := p.All() + require.Len(t, records, 1) + require.Equal(t, PeerBlockchainHeight{ + Address: addr1, + Height: 10, + }, records[0]) + + p.Record(addr1, 11) + require.Len(t, p.heights, 1) + + records = p.All() + require.Len(t, records, 1) + require.Equal(t, PeerBlockchainHeight{ + Address: addr1, + Height: 11, + }, records[0]) + + e = p.Estimate(1) + require.Equal(t, uint64(11), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr2, 12) + p.Record(addr3, 12) + require.Len(t, p.heights, 3) + + records = p.All() + require.Len(t, records, 3) + require.Equal(t, []PeerBlockchainHeight{ + { + Address: addr1, + Height: 11, + }, + { + Address: addr2, + Height: 12, + }, + { + Address: addr3, + Height: 12, + }, + }, records) + + e = p.Estimate(1) + require.Equal(t, uint64(12), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr3, 24) + e = p.Estimate(13) + require.Equal(t, uint64(24), e) +} diff --git a/src/daemon/messages.go b/src/daemon/messages.go index 34a467f..1ed7eab 100755 --- a/src/daemon/messages.go +++ b/src/daemon/messages.go @@ -8,6 +8,8 @@ import ( "net" "strings" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/daemon/gnet" "github.com/skycoin/skycoin/src/daemon/pex" "github.com/skycoin/skycoin/src/util/iputil" @@ -98,19 +100,20 @@ type IPAddr struct { Port uint16 } -// NewIPAddr returns an IPAddr from an ip:port string. If ipv6 or invalid, error is -// returned +// NewIPAddr returns an IPAddr from an ip:port string. func NewIPAddr(addr string) (ipaddr IPAddr, err error) { - // TODO -- support ipv6 ips, port, err := iputil.SplitAddr(addr) if err != nil { return } + + // TODO -- support ipv6 ipb := net.ParseIP(ips).To4() if ipb == nil { err = errors.New("Ignoring IPv6 address") return } + ip := binary.BigEndian.Uint32(ipb) ipaddr.IP = ip ipaddr.Port = uint16(port) @@ -129,7 +132,7 @@ func (ipa IPAddr) String() string { // Messages should place themselves on the messageEvent channel in their // Handle() method required by gnet. type AsyncMessage interface { - Process(d *Daemon) + Process(d Daemoner) } // GetPeersMessage sent to request peers @@ -145,27 +148,26 @@ func NewGetPeersMessage() *GetPeersMessage { } // Handle handles message -func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { +func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { // self.connID = mc.ConnID gpm.addr = mc.Addr - return daemon.(*Daemon).recordMessageEvent(gpm, mc) + return daemon.(Daemoner).RecordMessageEvent(gpm, mc) } // Process Notifies the Pex instance that peers were requested -func (gpm *GetPeersMessage) Process(d *Daemon) { - if d.Pex.Config.Disabled { +func (gpm *GetPeersMessage) Process(d Daemoner) { + if d.PexConfig().Disabled { return } - peers := d.Pex.RandomExchangeable(d.Pex.Config.ReplyCount) + peers := d.RandomExchangeable(d.PexConfig().ReplyCount) if len(peers) == 0 { logger.Debug("We have no peers to send in reply") return } m := NewGivePeersMessage(peers) - if err := d.Pool.Pool.SendMessage(gpm.addr, m); err != nil { + if err := d.SendMessage(gpm.addr, m); err != nil { logger.Errorf("Send GivePeersMessage to %s failed: %v", gpm.addr, err) } } @@ -205,18 +207,18 @@ func (gpm *GivePeersMessage) GetPeers() []string { // Handle handle message func (gpm *GivePeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { gpm.c = mc - return daemon.(*Daemon).recordMessageEvent(gpm, mc) + return daemon.(Daemoner).RecordMessageEvent(gpm, mc) } // Process Notifies the Pex instance that peers were received -func (gpm *GivePeersMessage) Process(d *Daemon) { - if d.Pex.Config.Disabled { +func (gpm *GivePeersMessage) Process(d Daemoner) { + if d.PexConfig().Disabled { return } peers := gpm.GetPeers() logger.Debugf("Got these peers via PEX: %s", strings.Join(peers, ", ")) - d.Pex.AddPeers(peers) + d.AddPeers(peers) } // IntroductionMessage jan IntroductionMessage is sent on first connect by both parties @@ -228,18 +230,20 @@ type IntroductionMessage struct { Port uint16 // Our client version Version int32 - - c *gnet.MessageContext `enc:"-"` + c *gnet.MessageContext `enc:"-"` // We validate the message in Handle() and cache the result for Process() valid bool `enc:"-"` // skip it during encoding + // Extra would be parsed as blockchain pubkey if it's not empty + Extra []byte `enc:",omitempty"` } // NewIntroductionMessage creates introduction message -func NewIntroductionMessage(mirror uint32, version int32, port uint16) *IntroductionMessage { +func NewIntroductionMessage(mirror uint32, version int32, port uint16, extra []byte) *IntroductionMessage { return &IntroductionMessage{ Mirror: mirror, Version: version, Port: port, + Extra: extra, } } @@ -247,27 +251,44 @@ func NewIntroductionMessage(mirror uint32, version int32, port uint16) *Introduc // need to control the DisconnectReason sent back to gnet. We still implement // Process(), where we do modifications that are not threadsafe func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { - d := daemon.(*Daemon) + d := daemon.(Daemoner) err := func() error { // Disconnect if this is a self connection (we have the same mirror value) - if intro.Mirror == d.Messages.Mirror { + if intro.Mirror == d.Mirror() { logger.Infof("Remote mirror value %v matches ours", intro.Mirror) - d.Pool.Pool.Disconnect(mc.Addr, ErrDisconnectSelf) + d.Disconnect(mc.Addr, ErrDisconnectSelf) return ErrDisconnectSelf } // Disconnect if not running the same version - if intro.Version != d.Config.Version { + if intro.Version != d.DaemonConfig().Version { logger.Infof("%s has different version %d. Disconnecting.", mc.Addr, intro.Version) - d.Pool.Pool.Disconnect(mc.Addr, ErrDisconnectInvalidVersion) + d.Disconnect(mc.Addr, ErrDisconnectInvalidVersion) return ErrDisconnectInvalidVersion } logger.Infof("%s verified for version %d", mc.Addr, intro.Version) + // Checks the genesis hash if not empty + if len(intro.Extra) > 0 { + var bcPubKey cipher.PubKey + if len(intro.Extra) < len(bcPubKey) { + logger.Infof("Extra data length does not meet the minimum requirement") + d.Disconnect(mc.Addr, ErrDisconnectInvalidExtraData) + return ErrDisconnectInvalidExtraData + } + copy(bcPubKey[:], intro.Extra[:len(bcPubKey)]) + + if d.BlockchainPubkey() != bcPubKey { + logger.Infof("Blockchain pubkey does not match, local: %s, remote: %s", d.BlockchainPubkey().Hex(), bcPubKey.Hex()) + d.Disconnect(mc.Addr, ErrDisconnectBlockchainPubkeyNotMatched) + return ErrDisconnectBlockchainPubkeyNotMatched + } + } + // only solicited connection can be added to exchange peer list, cause accepted // connection may not have incomming port. ip, port, err := iputil.SplitAddr(mc.Addr) @@ -275,25 +296,42 @@ func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interfa // This should never happen, but the program should still work if it // does. logger.Errorf("Invalid Addr() for connection: %s", mc.Addr) - d.Pool.Pool.Disconnect(mc.Addr, ErrDisconnectOtherError) + d.Disconnect(mc.Addr, ErrDisconnectOtherError) return ErrDisconnectOtherError } + // Checks if the introduction message is from outgoing connection. + // It's outgoing connection if port == intro.Port, as the incoming + // connection's port is a random port, it's different from the port + // in introduction message. if port == intro.Port { - if err := d.Pex.SetHasIncomingPort(mc.Addr, true); err != nil { + if d.IsDefaultConnection(mc.Addr) { + reached, err := d.IsMaxDefaultConnectionsReached() + if err != nil { + logger.Errorf("Check IsMaxDefaultConnReached failed: %v", err) + return err + } + + if reached { + d.Disconnect(mc.Addr, ErrDisconnectMaxDefaultConnectionReached) + return ErrDisconnectMaxDefaultConnectionReached + } + } + + if err := d.SetHasIncomingPort(mc.Addr); err != nil { logger.Errorf("Failed to set peer has incoming port status, %v", err) } } else { - if err := d.Pex.AddPeer(fmt.Sprintf("%s:%d", ip, intro.Port)); err != nil { + if err := d.AddPeer(fmt.Sprintf("%s:%d", ip, intro.Port)); err != nil { logger.Errorf("Failed to add peer: %v", err) } } // Disconnect if connected twice to the same peer (judging by ip:mirror) - knownPort, exists := d.getMirrorPort(mc.Addr, intro.Mirror) + knownPort, exists := d.GetMirrorPort(mc.Addr, intro.Mirror) if exists { logger.Infof("%s is already connected on port %d", mc.Addr, knownPort) - d.Pool.Pool.Disconnect(mc.Addr, ErrDisconnectConnectedTwice) + d.Disconnect(mc.Addr, ErrDisconnectConnectedTwice) return ErrDisconnectConnectedTwice } return nil @@ -303,19 +341,19 @@ func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interfa intro.c = mc if err != nil { - d.Pex.IncreaseRetryTimes(mc.Addr) - d.expectingIntroductions.Remove(mc.Addr) + d.IncreaseRetryTimes(mc.Addr) + d.RemoveFromExpectingIntroductions(mc.Addr) return err } - err = d.recordMessageEvent(intro, mc) - d.Pex.ResetRetryTimes(mc.Addr) + err = d.RecordMessageEvent(intro, mc) + d.ResetRetryTimes(mc.Addr) return err } // Process an event queued by Handle() -func (intro *IntroductionMessage) Process(d *Daemon) { - d.expectingIntroductions.Remove(intro.c.Addr) +func (intro *IntroductionMessage) Process(d Daemoner) { + d.RemoveFromExpectingIntroductions(intro.c.Addr) if !intro.valid { return } @@ -323,17 +361,17 @@ func (intro *IntroductionMessage) Process(d *Daemon) { a := intro.c.Addr // Record their listener, to avoid double connections - err := d.recordConnectionMirror(a, intro.Mirror) + err := d.RecordConnectionMirror(a, intro.Mirror) if err != nil { // This should never happen, but the program should not allow itself // to be corrupted in case it does logger.Errorf("Invalid port for connection %s", a) - d.Pool.Pool.Disconnect(intro.c.Addr, ErrDisconnectOtherError) + d.Disconnect(intro.c.Addr, ErrDisconnectOtherError) return } // Request blocks immediately after they're confirmed - err = d.Visor.RequestBlocksFromAddr(d.Pool, intro.c.Addr) + err = d.RequestBlocksFromAddr(intro.c.Addr) if err == nil { logger.Debugf("Successfully requested blocks from %s", intro.c.Addr) } else { @@ -341,7 +379,7 @@ func (intro *IntroductionMessage) Process(d *Daemon) { } // Anounce unconfirmed know txns - d.Visor.AnnounceAllTxns(d.Pool) + d.AnnounceAllTxns() } // PingMessage Sent to keep a connection alive. A PongMessage is sent in reply. @@ -352,15 +390,15 @@ type PingMessage struct { // Handle implements the Messager interface func (ping *PingMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { ping.c = mc - return daemon.(*Daemon).recordMessageEvent(ping, mc) + return daemon.(Daemoner).RecordMessageEvent(ping, mc) } // Process Sends a PongMessage to the sender of PingMessage -func (ping *PingMessage) Process(d *Daemon) { - if d.Config.LogPings { +func (ping *PingMessage) Process(d Daemoner) { + if d.DaemonConfig().LogPings { logger.Debugf("Reply to ping from %s", ping.c.Addr) } - if err := d.Pool.Pool.SendMessage(ping.c.Addr, &PongMessage{}); err != nil { + if err := d.SendMessage(ping.c.Addr, &PongMessage{}); err != nil { logger.Errorf("Send PongMessage to %s failed: %v", ping.c.Addr, err) } } @@ -378,3 +416,341 @@ func (pong *PongMessage) Handle(mc *gnet.MessageContext, daemon interface{}) err } return nil } + +// GetBlocksMessage sent to request blocks since LastBlock +type GetBlocksMessage struct { + LastBlock uint64 + RequestedBlocks uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetBlocksMessage creates GetBlocksMessage +func NewGetBlocksMessage(lastBlock uint64, requestedBlocks uint64) *GetBlocksMessage { + return &GetBlocksMessage{ + LastBlock: lastBlock, + RequestedBlocks: requestedBlocks, // count of blocks requested + } +} + +// Handle handles message +func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, + daemon interface{}) error { + gbm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gbm, mc) +} + +// Process should send number to be requested, with request +func (gbm *GetBlocksMessage) Process(d Daemoner) { + // TODO -- we need the sig to be sent with the block, but only the master + // can sign blocks. Thus the sig needs to be stored with the block. + if d.DaemonConfig().DisableNetworking { + return + } + // Record this as this peer's highest block + d.RecordPeerHeight(gbm.c.Addr, gbm.LastBlock) + // Fetch and return signed blocks since LastBlock + blocks, err := d.GetSignedBlocksSince(gbm.LastBlock, gbm.RequestedBlocks) + if err != nil { + logger.Infof("Get signed blocks failed: %v", err) + return + } + + if len(blocks) == 0 { + return + } + + logger.Debugf("Got %d blocks since %d", len(blocks), gbm.LastBlock) + + m := NewGiveBlocksMessage(blocks) + if err := d.SendMessage(gbm.c.Addr, m); err != nil { + logger.Errorf("Send GiveBlocksMessage to %s failed: %v", gbm.c.Addr, err) + } +} + +// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited +type GiveBlocksMessage struct { + Blocks []coin.SignedBlock + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveBlocksMessage creates GiveBlocksMessage +func NewGiveBlocksMessage(blocks []coin.SignedBlock) *GiveBlocksMessage { + return &GiveBlocksMessage{ + Blocks: blocks, + } +} + +// Handle handle message +func (gbm *GiveBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gbm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gbm, mc) +} + +// Process process message +func (gbm *GiveBlocksMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") + return + } + + // These DB queries are not performed in a transaction for performance reasons. + // It is not necessary that the blocks be executed together in a single transaction. + + processed := 0 + maxSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found, cannot execute blocks") + return + } + + for _, b := range gbm.Blocks { + // To minimize waste when receiving multiple responses from peers + // we only break out of the loop if the block itself is invalid. + // E.g. if we request 20 blocks since 0 from 2 peers, and one peer + // replies with 15 and the other 20, if we did not do this check and + // the reply with 15 was received first, we would toss the one with 20 + // even though we could process it at the time. + if b.Seq() <= maxSeq { + continue + } + + err := d.ExecuteSignedBlock(b) + if err == nil { + logger.Critical().Infof("Added new block %d", b.Block.Head.BkSeq) + processed++ + } else { + logger.Critical().Errorf("Failed to execute received block %d: %v", b.Block.Head.BkSeq, err) + // Blocks must be received in order, so if one fails its assumed + // the rest are failing + break + } + } + if processed == 0 { + return + } + + headBkSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found after executing blocks, will not announce blocks") + return + } + + if headBkSeq < maxSeq { + logger.Critical().Warning("HeadBkSeq decreased after executing blocks") + } else if headBkSeq-maxSeq != uint64(processed) { + logger.Critical().Warning("HeadBkSeq increased by %d but we processed %s blocks", headBkSeq-maxSeq, processed) + } + + // Announce our new blocks to peers + m1 := NewAnnounceBlocksMessage(headBkSeq) + d.BroadcastMessage(m1) + //request more blocks. + m2 := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().BlocksResponseCount) + d.BroadcastMessage(m2) +} + +// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose +// to send GetBlocksMessage in response +type AnnounceBlocksMessage struct { + MaxBkSeq uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceBlocksMessage creates message +func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { + return &AnnounceBlocksMessage{ + MaxBkSeq: seq, + } +} + +// Handle handles message +func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + abm.c = mc + return daemon.(Daemoner).RecordMessageEvent(abm, mc) +} + +// Process process message +func (abm *AnnounceBlocksMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + headBkSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("AnnounceBlocksMessage Visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("AnnounceBlocksMessage no head block, cannot process AnnounceBlocksMessage") + return + } + + if headBkSeq >= abm.MaxBkSeq { + return + } + + // TODO: Should this be block get request for current sequence? + // If client is not caught up, won't attempt to get block + m := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().BlocksResponseCount) + if err := d.SendMessage(abm.c.Addr, m); err != nil { + logger.Errorf("Send GetBlocksMessage to %s failed: %v", abm.c.Addr, err) + } +} + +// SendingTxnsMessage send transaction message interface +type SendingTxnsMessage interface { + GetTxns() []cipher.SHA256 +} + +// AnnounceTxnsMessage tells a peer that we have these transactions +type AnnounceTxnsMessage struct { + Txns []cipher.SHA256 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceTxnsMessage creates announce txns message +func NewAnnounceTxnsMessage(txns []cipher.SHA256) *AnnounceTxnsMessage { + return &AnnounceTxnsMessage{ + Txns: txns, + } +} + +// GetTxns returns txns +func (atm *AnnounceTxnsMessage) GetTxns() []cipher.SHA256 { + return atm.Txns +} + +// Handle handle message +func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + atm.c = mc + return daemon.(Daemoner).RecordMessageEvent(atm, mc) +} + +// Process process message +func (atm *AnnounceTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + unknown, err := d.GetUnconfirmedUnknown(atm.Txns) + if err != nil { + logger.WithError(err).Error("AnnounceTxnsMessage Visor.GetUnconfirmedUnknown failed") + return + } + + if len(unknown) == 0 { + return + } + + m := NewGetTxnsMessage(unknown) + if err := d.SendMessage(atm.c.Addr, m); err != nil { + logger.Errorf("Send GetTxnsMessage to %s failed: %v", atm.c.Addr, err) + } +} + +// GetTxnsMessage request transactions of given hash +type GetTxnsMessage struct { + Txns []cipher.SHA256 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetTxnsMessage creates GetTxnsMessage +func NewGetTxnsMessage(txns []cipher.SHA256) *GetTxnsMessage { + return &GetTxnsMessage{ + Txns: txns, + } +} + +// Handle handle message +func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gtm, mc) +} + +// Process process message +func (gtm *GetTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + // Locate all txns from the unconfirmed pool + known, err := d.GetUnconfirmedKnown(gtm.Txns) + if err != nil { + logger.WithError(err).Error("GetTxnsMessage Visor.GetUnconfirmedKnown failed") + return + } + if len(known) == 0 { + return + } + + // Reply to sender with GiveTxnsMessage + m := NewGiveTxnsMessage(known) + if err := d.SendMessage(gtm.c.Addr, m); err != nil { + logger.Errorf("Send GiveTxnsMessage to %s failed: %v", gtm.c.Addr, err) + } +} + +// GiveTxnsMessage tells the transaction of given hashes +type GiveTxnsMessage struct { + Txns coin.Transactions + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveTxnsMessage creates GiveTxnsMessage +func NewGiveTxnsMessage(txns coin.Transactions) *GiveTxnsMessage { + return &GiveTxnsMessage{ + Txns: txns, + } +} + +// GetTxns returns transactions hashes +func (gtm *GiveTxnsMessage) GetTxns() []cipher.SHA256 { + return gtm.Txns.Hashes() +} + +// Handle handle message +func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gtm, mc) +} + +// Process process message +func (gtm *GiveTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + hashes := make([]cipher.SHA256, 0, len(gtm.Txns)) + // Update unconfirmed pool with these transactions + for _, txn := range gtm.Txns { + // Only announce transactions that are new to us, so that peers can't spam relays + known, softErr, err := d.InjectTransaction(txn) + if err != nil { + logger.Warningf("Failed to record transaction %s: %v", txn.Hash().Hex(), err) + continue + } else if softErr != nil { + logger.Warningf("Transaction soft violation: %v", err) + continue + } else if known { + logger.Warningf("Duplicate Transaction: %s", txn.Hash().Hex()) + continue + } + + hashes = append(hashes, txn.Hash()) + } + + // Announce these transactions to peers + if len(hashes) != 0 { + logger.Debugf("Announce %d transactions", len(hashes)) + m := NewAnnounceTxnsMessage(hashes) + d.BroadcastMessage(m) + } +} diff --git a/src/daemon/messages_test.go b/src/daemon/messages_test.go index 9d30720..bd8dc0e 100755 --- a/src/daemon/messages_test.go +++ b/src/daemon/messages_test.go @@ -1 +1,832 @@ package daemon + +import ( + "bufio" + "fmt" + "os" + "reflect" + "strconv" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/util" +) + +func setupMsgEncoding() { + gnet.EraseMessages() + var messagesConfig = NewMessagesConfig() + messagesConfig.Register() +} + +/************************************** + * + * Test helpers + * + *************************************/ + +// MessagesAnnotationsIterator : Implementation of IAnnotationsIterator for type gnet.Message +type MessagesAnnotationsIterator struct { + Message gnet.Message + LengthCalled bool + PrefixCalled bool + CurrentField int + MaxField int + CurrentIndex int +} + +// NewMessagesAnnotationsIterator : Initializes struct MessagesAnnotationsIterator +func NewMessagesAnnotationsIterator(message gnet.Message) MessagesAnnotationsIterator { + var mai = MessagesAnnotationsIterator{} + mai.Message = message + mai.LengthCalled = false + mai.PrefixCalled = false + mai.CurrentField = 0 + mai.CurrentIndex = -1 + + mai.MaxField = reflect.Indirect(reflect.ValueOf(mai.Message)).NumField() + + return mai +} + +// Next : Yields next element of MessagesAnnotationsIterator +func (mai *MessagesAnnotationsIterator) Next() (util.Annotation, bool) { + if !mai.LengthCalled { + mai.LengthCalled = true + return util.Annotation{Size: 4, Name: "Length"}, true + } + if !mai.PrefixCalled { + mai.PrefixCalled = true + return util.Annotation{Size: 4, Name: "Prefix"}, true + + } + if mai.CurrentField >= mai.MaxField { + return util.Annotation{}, false + } + + var i = mai.CurrentField + var j = mai.CurrentIndex + + var v = reflect.Indirect(reflect.ValueOf(mai.Message)) + t := v.Type() + vF := v.Field(i) + f := t.Field(i) + for f.PkgPath != "" && i < mai.MaxField { + i++ + mai.CurrentField++ + mai.CurrentIndex = -1 + j = -1 + if i < mai.MaxField { + f = t.Field(i) + if f.Type.Kind() == reflect.Slice { + if _, omitempty := encoder.ParseTag(f.Tag.Get("enc")); omitempty { + if i == mai.MaxField-1 { + vF = v.Field(i) + if vF.Len() == 0 { + // Last field is empty slice. Nothing further tokens + return util.Annotation{}, false + } + } else { + panic(encoder.ErrInvalidOmitEmpty) + } + } + } + } else { + return util.Annotation{}, false + } + } + if f.Tag.Get("enc") != "-" { + if vF.CanSet() || f.Name != "_" { + if v.Field(i).Kind() == reflect.Slice { + if mai.CurrentIndex == -1 { + mai.CurrentIndex = 0 + return util.Annotation{Size: 4, Name: f.Name + " length"}, true + } + sliceLen := v.Field(i).Len() + mai.CurrentIndex++ + if mai.CurrentIndex < sliceLen { + // Emit annotation for slice item + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Slice(j, j+1).Interface())[4:]), Name: f.Name + "[" + strconv.Itoa(j) + "]"}, true + } + // No more annotation tokens for current slice field + mai.CurrentIndex = -1 + mai.CurrentField++ + if sliceLen > 0 { + // Emit annotation for last item + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Slice(j, j+1).Interface())[4:]), Name: f.Name + "[" + strconv.Itoa(j) + "]"}, true + } + // Zero length slice. Start over + return mai.Next() + } + + mai.CurrentField++ + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Interface())), Name: f.Name}, true + + } + } + + return util.Annotation{}, false +} + +/************************************** + * + * Test cases + * + *************************************/ + +var hashes = []cipher.SHA256{ + GetSHAFromHex("123"), + GetSHAFromHex("456"), + GetSHAFromHex("789"), + GetSHAFromHex("abc"), + GetSHAFromHex("def"), + GetSHAFromHex("101"), + GetSHAFromHex("111"), + GetSHAFromHex("121"), + GetSHAFromHex("314"), + GetSHAFromHex("151"), +} + +var secKey1 = (cipher.NewSecKey([]byte{1, 2, 3, 4, 5, 6, 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})) +var secKey2 = cipher.NewSecKey([]byte{33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}) +var secKey3 = cipher.NewSecKey([]byte{65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}) +var secKey4 = cipher.NewSecKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}) + +var addresses = []cipher.Address{ + cipher.AddressFromSecKey(secKey1), + cipher.AddressFromSecKey(secKey2), + cipher.AddressFromSecKey(secKey3), + cipher.AddressFromSecKey(secKey4), +} + +func GetSHAFromHex(hex string) cipher.SHA256 { + var sha, _ = cipher.SHA256FromHex(hex) + return sha +} + +type EmptySliceStruct struct { + A uint8 + e int16 + B string + C int32 + D []byte + f rune +} + +func (m *EmptySliceStruct) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // Do nothing + return nil +} + +func ExampleEmptySliceStruct() { + defer gnet.EraseMessages() + setupMsgEncoding() + gnet.RegisterMessage(gnet.MessagePrefixFromString("TEST"), EmptySliceStruct{}) + gnet.VerifyMessages() + var message = EmptySliceStruct{ + 0x01, + 0x2345, + "", + 0x6789ABCD, + nil, + 'a', + } + var mai = NewMessagesAnnotationsIterator(&message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(&message), &mai, w) + // Output: + // 0x0000 | 11 00 00 00 ....................................... Length + // 0x0004 | 54 45 53 54 ....................................... Prefix + // 0x0008 | 01 ................................................ A + // 0x0009 | 00 00 00 00 ....................................... B + // 0x000d | cd ab 89 67 ....................................... C + // 0x0011 | 00 00 00 00 ....................................... D length + // 0x0015 | +} + +type OmitEmptySliceTestStruct struct { + A uint8 + B []byte + c rune + D []byte `enc:",omitempty"` +} + +func (m *OmitEmptySliceTestStruct) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // Do nothing + return nil +} + +func ExampleOmitEmptySliceTestStruct() { + defer gnet.EraseMessages() + setupMsgEncoding() + gnet.RegisterMessage(gnet.MessagePrefixFromString("TEST"), OmitEmptySliceTestStruct{}) + gnet.VerifyMessages() + var message = OmitEmptySliceTestStruct{ + 0x01, + nil, + 'a', + nil, + } + var mai = NewMessagesAnnotationsIterator(&message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(&message), &mai, w) + // Output: + // 0x0000 | 09 00 00 00 ....................................... Length + // 0x0004 | 54 45 53 54 ....................................... Prefix + // 0x0008 | 01 ................................................ A + // 0x0009 | 00 00 00 00 ....................................... B length + // 0x000d | +} + +func ExampleIntroductionMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewIntroductionMessage(1234, 5, 7890, nil) + fmt.Println("IntroductionMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // IntroductionMessage: + // 0x0000 | 0e 00 00 00 ....................................... Length + // 0x0004 | 49 4e 54 52 ....................................... Prefix + // 0x0008 | d2 04 00 00 ....................................... Mirror + // 0x000c | d2 1e ............................................. Port + // 0x000e | 05 00 00 00 ....................................... Version + // 0x0012 | +} + +func ExampleGetPeersMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewGetPeersMessage() + fmt.Println("GetPeersMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetPeersMessage: + // 0x0000 | 04 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 50 ....................................... Prefix + // 0x0008 | +} + +func ExampleGivePeersMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var peers = make([]pex.Peer, 3) + var peer0 = *pex.NewPeer("118.178.135.93:6000") + var peer1 = *pex.NewPeer("47.88.33.156:6000") + var peer2 = *pex.NewPeer("121.41.103.148:6000") + peers = append(peers, peer0, peer1, peer2) + var message = NewGivePeersMessage(peers) + fmt.Println("GivePeersMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GivePeersMessage: + // 0x0000 | 1a 00 00 00 ....................................... Length + // 0x0004 | 47 49 56 50 ....................................... Prefix + // 0x0008 | 03 00 00 00 ....................................... Peers length + // 0x000c | 5d 87 b2 76 70 17 ................................. Peers[0] + // 0x0012 | 9c 21 58 2f 70 17 ................................. Peers[1] + // 0x0018 | 94 67 29 79 70 17 ................................. Peers[2] + // 0x001e | +} + +func ExampleGetBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewGetBlocksMessage(1234, 5678) + fmt.Println("GetBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetBlocksMessage: + // 0x0000 | 14 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 42 ....................................... Prefix + // 0x0008 | d2 04 00 00 00 00 00 00 ........................... LastBlock + // 0x0010 | 2e 16 00 00 00 00 00 00 ........................... RequestedBlocks + // 0x0018 | +} + +func ExampleGiveBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var blocks = make([]coin.SignedBlock, 1) + var body1 = coin.BlockBody{ + Transactions: make([]coin.Transaction, 0), + } + var block1 = coin.Block{ + Body: body1, + Head: coin.BlockHeader{ + Version: 0x02, + Time: 100, + BkSeq: 0, + Fee: 10, + PrevHash: hashes[0], + BodyHash: body1.Hash(), + }} + var sig, _ = cipher.SigFromHex("123") + var signedBlock = coin.SignedBlock{ + Sig: sig, + Block: block1, + } + blocks = append(blocks, signedBlock) + var message = NewGiveBlocksMessage(blocks) + fmt.Println("GiveBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GiveBlocksMessage: + // 0x0000 | 8a 01 00 00 ....................................... Length + // 0x0004 | 47 49 56 42 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Blocks length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x004c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x005c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x006c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x007c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x008c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x009c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ac | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00bc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00cc | 00 ................................................ Blocks[0] + // 0x00cd | 02 00 00 00 64 00 00 00 00 00 00 00 00 00 00 00 + // 0x00dd | 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ed | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00fd | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x010d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x011d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x012d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x013d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x014d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x015d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x016d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x017d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x018d | 00 ................................................ Blocks[1] + // 0x018e | +} + +func ExampleAnnounceBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewAnnounceBlocksMessage(123456) + fmt.Println("AnnounceBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // AnnounceBlocksMessage: + // 0x0000 | 0c 00 00 00 ....................................... Length + // 0x0004 | 41 4e 4e 42 ....................................... Prefix + // 0x0008 | 40 e2 01 00 00 00 00 00 ........................... MaxBkSeq + // 0x0010 | +} + +func ExampleGetTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var shas = make([]cipher.SHA256, 0) + + shas = append(shas, hashes[1], hashes[2]) + var message = NewGetTxnsMessage(shas) + fmt.Println("GetTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetTxnsMessage: + // 0x0000 | 48 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[0] + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[1] + // 0x004c | +} + +func ExampleGiveTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var transactions coin.Transactions = make([]coin.Transaction, 0) + var transactionOutputs0 = make([]coin.TransactionOutput, 0) + var transactionOutputs1 = make([]coin.TransactionOutput, 0) + var txOutput0 = coin.TransactionOutput{ + Address: addresses[0], + Coins: 12, + Hours: 34, + } + var txOutput1 = coin.TransactionOutput{ + Address: addresses[1], + Coins: 56, + Hours: 78, + } + var txOutput2 = coin.TransactionOutput{ + Address: addresses[3], + Coins: 9, + Hours: 12, + } + var txOutput3 = coin.TransactionOutput{ + Address: addresses[2], + Coins: 34, + Hours: 56, + } + transactionOutputs0 = append(transactionOutputs0, txOutput0, txOutput1) + transactionOutputs1 = append(transactionOutputs1, txOutput2, txOutput3) + + var sig0, sig1, sig2, sig3 cipher.Sig + sig0, _ = cipher.SigFromHex("sig0") + sig1, _ = cipher.SigFromHex("sig1") + sig2, _ = cipher.SigFromHex("sig2") + sig3, _ = cipher.SigFromHex("sig3") + var transaction0 = coin.Transaction{ + Type: 123, + In: []cipher.SHA256{hashes[3], hashes[4]}, + InnerHash: hashes[5], + Length: 5000, + Out: transactionOutputs0, + Sigs: []cipher.Sig{sig0, sig1}, + } + var transaction1 = coin.Transaction{ + Type: 123, + In: []cipher.SHA256{hashes[5], hashes[6]}, + InnerHash: hashes[6], + Length: 5000, + Out: transactionOutputs1, + Sigs: []cipher.Sig{sig2, sig3}, + } + transactions = append(transactions, transaction0, transaction1) + var message = NewGiveTxnsMessage(transactions) + fmt.Println("GiveTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GiveTxnsMessage: + // 0x0000 | 82 02 00 00 ....................................... Length + // 0x0004 | 47 49 56 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 88 13 00 00 7b 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x002c | 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x004c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x005c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x006c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x007c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x008c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x009c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ac | 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 + // 0x00bc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00cc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00dc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ec | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 + // 0x00fc | 00 00 00 00 07 6d ca 32 de 03 4e 48 67 fa 7a 2a + // 0x010c | a9 ee fe 91 f2 0b a0 74 0c 00 00 00 00 00 00 00 + // 0x011c | 22 00 00 00 00 00 00 00 00 e9 cb 47 35 e3 95 cf + // 0x012c | 36 b0 d1 a6 f2 21 bb 23 b3 f7 bf b1 f9 38 00 00 + // 0x013c | 00 00 00 00 00 4e 00 00 00 00 00 00 00 ............ Txns[0] + // 0x0149 | 88 13 00 00 7b 00 00 00 00 00 00 00 00 00 00 00 + // 0x0159 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0169 | 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 + // 0x0179 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0189 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0199 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01a9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01b9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01c9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01d9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01e9 | 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 + // 0x01f9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0209 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0219 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0229 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 + // 0x0239 | 00 00 00 00 7e f9 b1 b9 40 6f 8d b3 99 b2 5f d0 + // 0x0249 | e9 f4 f0 88 7b 08 4b 43 09 00 00 00 00 00 00 00 + // 0x0259 | 0c 00 00 00 00 00 00 00 00 83 f1 96 59 16 14 99 + // 0x0269 | 2f a6 03 13 38 6f 72 88 ac 40 14 c8 bc 22 00 00 + // 0x0279 | 00 00 00 00 00 38 00 00 00 00 00 00 00 ............ Txns[1] + // 0x0286 | +} + +func ExampleAnnounceTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewAnnounceTxnsMessage([]cipher.SHA256{hashes[7], hashes[8]}) + fmt.Println("AnnounceTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // AnnounceTxnsMessage: + // 0x0000 | 48 00 00 00 ....................................... Length + // 0x0004 | 41 4e 4e 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[0] + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[1] + // 0x004c | +} + +func TestIntroductionMessage(t *testing.T) { + defer gnet.EraseMessages() + setupMsgEncoding() + + pubkey, _ := cipher.GenerateKeyPair() + pubkey2, _ := cipher.GenerateKeyPair() + + type mirrorPortResult struct { + port uint16 + exist bool + } + + type daemonMockValue struct { + version uint32 + mirror uint32 + isDefaultConnection bool + isMaxConnectionsReached bool + isMaxConnectionsReachedErr error + setHasIncomingPortErr error + getMirrorPortResult mirrorPortResult + recordMessageEventErr error + pubkey cipher.PubKey + disconnectReason gnet.DisconnectReason + disconnectErr error + addPeerArg string + addPeerErr error + } + + tt := []struct { + name string + addr string + mockValue daemonMockValue + intro *IntroductionMessage + err error + }{ + { + name: "INTR message without extra bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + }, + err: nil, + }, + { + name: "INTR message with pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey[:], + }, + err: nil, + }, + { + name: "INTR message with pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey[:], + }, + err: nil, + }, + { + name: "INTR message with pubkey and additional data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: append(pubkey[:], []byte("additional data")...), + }, + err: nil, + }, + { + name: "INTR message with different pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + disconnectReason: ErrDisconnectBlockchainPubkeyNotMatched, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey2[:], + }, + err: ErrDisconnectBlockchainPubkeyNotMatched, + }, + { + name: "INTR message with invalid pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: []byte("invalid extra data"), + }, + err: ErrDisconnectInvalidExtraData, + }, + { + name: "Disconnect self connection", + mockValue: daemonMockValue{ + mirror: 10000, + disconnectReason: ErrDisconnectSelf, + }, + intro: &IntroductionMessage{ + Mirror: 10000, + }, + err: ErrDisconnectSelf, + }, + { + name: "Invalid version", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectInvalidVersion, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 0, + }, + err: ErrDisconnectInvalidVersion, + }, + { + name: "Invalid address", + addr: "121.121.121.121", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectOtherError, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectOtherError, + }, + { + name: "Max default connections reached", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectMaxDefaultConnectionReached, + isDefaultConnection: true, + isMaxConnectionsReached: true, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectMaxDefaultConnectionReached, + }, + { + name: "incomming connection", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + isDefaultConnection: true, + isMaxConnectionsReached: true, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + addPeerArg: "121.121.121.121:6000", + addPeerErr: nil, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + valid: true, + }, + }, + { + name: "Connect twice", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + isDefaultConnection: true, + getMirrorPortResult: mirrorPortResult{ + exist: true, + }, + pubkey: pubkey, + addPeerArg: "121.121.121.121:6000", + addPeerErr: nil, + disconnectReason: ErrDisconnectConnectedTwice, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectConnectedTwice, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + mc := &gnet.MessageContext{Addr: tc.addr} + tc.intro.c = mc + + d := NewDaemonerMock() + d.On("DaemonConfig").Return(DaemonConfig{Version: int32(tc.mockValue.version)}) + d.On("Mirror").Return(tc.mockValue.mirror) + d.On("IsDefaultConnection", tc.addr).Return(tc.mockValue.isDefaultConnection) + d.On("SetHasIncomingPort", tc.addr).Return(tc.mockValue.setHasIncomingPortErr) + d.On("GetMirrorPort", tc.addr, tc.intro.Mirror).Return(tc.mockValue.getMirrorPortResult.port, tc.mockValue.getMirrorPortResult.exist) + d.On("RecordMessageEvent", tc.intro, mc).Return(tc.mockValue.recordMessageEventErr) + d.On("ResetRetryTimes", tc.addr) + d.On("BlockchainPubkey").Return(tc.mockValue.pubkey) + d.On("Disconnect", tc.addr, tc.mockValue.disconnectReason).Return(tc.mockValue.disconnectErr) + d.On("IncreaseRetryTimes", tc.addr) + d.On("RemoveFromExpectingIntroductions", tc.addr) + d.On("IsMaxDefaultConnectionsReached").Return(tc.mockValue.isMaxConnectionsReached, tc.mockValue.isMaxConnectionsReachedErr) + d.On("AddPeer", tc.mockValue.addPeerArg).Return(tc.mockValue.addPeerErr) + + err := tc.intro.Handle(mc, d) + require.Equal(t, tc.err, err) + }) + } + +} diff --git a/src/daemon/pex/peerlist_test.go b/src/daemon/pex/peerlist_test.go index ae4b66a..2fc4aac 100755 --- a/src/daemon/pex/peerlist_test.go +++ b/src/daemon/pex/peerlist_test.go @@ -527,9 +527,7 @@ func preparePeerlistFile(t *testing.T) (string, func()) { func preparePeerlistDir(t *testing.T) (string, func()) { f, err := ioutil.TempDir("", "peerlist") - if err != nil { - panic(err) - } + require.NoError(t, err) return f, func() { os.Remove(f) diff --git a/src/daemon/pex/pex.go b/src/daemon/pex/pex.go index 569d6b7..afe0d3d 100755 --- a/src/daemon/pex/pex.go +++ b/src/daemon/pex/pex.go @@ -392,10 +392,9 @@ func (px *Pex) AddPeers(addrs []string) int { addrs = validAddrs // Shuffle the addresses before capping them - for i := len(addrs) - 1; i > 0; i-- { - j := rand.Intn(i + 1) + rand.Shuffle(len(addrs), func(i, j int) { addrs[i], addrs[j] = addrs[j], addrs[i] - } + }) if px.Config.Max > 0 { rcap := px.Config.Max - px.peerlist.len() diff --git a/src/daemon/pool.go b/src/daemon/pool.go index 2729dce..4ac51dc 100755 --- a/src/daemon/pool.go +++ b/src/daemon/pool.go @@ -3,7 +3,6 @@ package daemon import ( "time" - //"github.com/skycoin/skycoin/src/daemon/gnet" "github.com/skycoin/skycoin/src/daemon/gnet" ) @@ -24,7 +23,9 @@ type PoolConfig struct { // Buffer size for gnet.ConnectionPool's network Read events EventChannelSize int // Maximum number of connections to maintain - MaxConnections int + MaxConnections int + MaxDefaultPeerOutgoingConnections int + DefaultPeerConnections map[string]struct{} // These should be assigned by the controlling daemon address string port int @@ -34,16 +35,18 @@ type PoolConfig struct { func NewPoolConfig() PoolConfig { //defIdleLimit := time.Minute return PoolConfig{ - port: 6677, - address: "", - DialTimeout: time.Second * 30, - MessageHandlingRate: time.Millisecond * 50, - PingRate: 5 * time.Second, - IdleLimit: 60 * time.Second, - IdleCheckRate: 1 * time.Second, - ClearStaleRate: 1 * time.Second, - EventChannelSize: 4096, - MaxConnections: 128, + port: 6677, + address: "", + DialTimeout: time.Second * 30, + MessageHandlingRate: time.Millisecond * 50, + PingRate: 5 * time.Second, + IdleLimit: 60 * time.Second, + IdleCheckRate: 1 * time.Second, + ClearStaleRate: 1 * time.Second, + EventChannelSize: 4096, + MaxConnections: 128, + MaxDefaultPeerOutgoingConnections: 1, + DefaultPeerConnections: make(map[string]struct{}), } } @@ -54,30 +57,29 @@ type Pool struct { } // NewPool creates pool -func NewPool(c PoolConfig, d *Daemon) *Pool { - pool := &Pool{ - Config: c, - Pool: nil, - } - - cfg := gnet.NewConfig() - cfg.DialTimeout = pool.Config.DialTimeout - cfg.Port = uint16(pool.Config.port) - cfg.Address = pool.Config.address - cfg.ConnectCallback = d.onGnetConnect - cfg.DisconnectCallback = d.onGnetDisconnect - cfg.MaxConnections = pool.Config.MaxConnections +func NewPool(cfg PoolConfig, d *Daemon) *Pool { + gnetCfg := gnet.NewConfig() + gnetCfg.DialTimeout = cfg.DialTimeout + gnetCfg.Port = uint16(cfg.port) + gnetCfg.Address = cfg.address + gnetCfg.ConnectCallback = d.onGnetConnect + gnetCfg.DisconnectCallback = d.onGnetDisconnect + gnetCfg.MaxConnections = cfg.MaxConnections + gnetCfg.MaxDefaultPeerOutgoingConnections = cfg.MaxDefaultPeerOutgoingConnections + gnetCfg.DefaultPeerConnections = cfg.DefaultPeerConnections - pool.Pool = gnet.NewConnectionPool(cfg, d) - - return pool + return &Pool{ + Config: cfg, + Pool: gnet.NewConnectionPool(gnetCfg, d), + } } // Shutdown closes all connections and stops listening func (pool *Pool) Shutdown() { - if pool.Pool != nil { - pool.Pool.Shutdown() + if pool == nil { + return } + pool.Pool.Shutdown() } // Run starts listening on the configured Port diff --git a/src/daemon/pool_test.go b/src/daemon/pool_test.go deleted file mode 100755 index 6dd7167..0000000 --- a/src/daemon/pool_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package daemon - -import ( - "time" - //"github.com/skycoin/skycoin/src/daemon/gnet" -) - -// func TestInitPool(t *testing.T) { -// d := newDefaultDaemon() -// pool := NewPool(NewPoolConfig()) -// assert.Nil(t, pool.Pool) -// assert.NotPanics(t, func() { pool.Init(d) }) -// assert.Equal(t, pool.Pool.Config.DialTimeout, pool.Config.DialTimeout) -// assert.NotNil(t, pool.Pool.Config.DisconnectCallback) -// assert.NotNil(t, pool.Pool.Config.ConnectCallback) -// wait() -// go func() { -// assert.NotPanics(t, pool.Start) -// }() -// wait() -// // A second call to start listen will panic due to the pool already -// // listening -// assert.Panics(t, pool.Start) -// pool.Pool.StopListen() -// wait() -// pool.Shutdown() -// shutdown(d) -// } - -// func TestShutdownPool(t *testing.T) { -// // Shutting down should flush the DisconnectQueue, among other things -// d := newDefaultDaemon() -// pool := d.Pool -// assert.Equal(t, len(pool.Pool.DisconnectQueue), 0) -// pool.Pool.DisconnectQueue <- gnet.DisconnectEvent{ -// ConnId: 1, -// Reason: DisconnectOtherError, -// } -// assert.NotPanics(t, d.Pool.Shutdown) -// wait() -// // pool.Shutdown() should call Pool.StopListen() which closes and resets -// // the DisconnectQueue channel -// assert.Equal(t, len(pool.Pool.DisconnectQueue), 0) -// shutdown(d) -// } - -// func testOnGnetConnectSolicitation(t *testing.T, d *Daemon, -// c *gnet.Connection, addr string, sol bool) { -// d.onGnetConnect(c, sol) -// assert.Equal(t, len(d.onConnectEvent), 1) -// if len(d.onConnectEvent) == 0 { -// t.Fatalf("onConnectEvent is not empty, would block") -// } -// ce := <-d.onConnectEvent -// assert.Equal(t, ce.Addr, addr) -// assert.Equal(t, ce.Solicited, sol) -// } - -// func TestOnGnetConnect(t *testing.T) { -// d := newDefaultDaemon() -// addr := "11.22.33.44:5555" -// c := gnetConnection(addr) -// assert.Equal(t, len(d.onConnectEvent), 0) -// testOnGnetConnectSolicitation(t, d, c, addr, false) -// assert.Equal(t, len(d.onConnectEvent), 0) -// testOnGnetConnectSolicitation(t, d, c, addr, true) -// assert.Equal(t, len(d.onConnectEvent), 0) -// shutdown(d) -// } - -/* Helpers */ - -func wait() { - time.Sleep(time.Millisecond * 50) -} diff --git a/src/daemon/rpc.go b/src/daemon/rpc.go deleted file mode 100755 index e081569..0000000 --- a/src/daemon/rpc.go +++ /dev/null @@ -1,181 +0,0 @@ -package daemon - -import ( - "sort" - "strings" - - "github.com/skycoin/skycoin/src/cipher" -) - -// Connection a connection's state within the daemon -type Connection struct { - ID int `json:"id"` - Addr string `json:"address"` - LastSent int64 `json:"last_sent"` - LastReceived int64 `json:"last_received"` - // Whether the connection is from us to them (true, outgoing), - // or from them to us (false, incoming) - Outgoing bool `json:"outgoing"` - // Whether the client has identified their version, mirror etc - Introduced bool `json:"introduced"` - Mirror uint32 `json:"mirror"` - ListenPort uint16 `json:"listen_port"` -} - -// Connections an array of connections -// Arrays must be wrapped in structs to avoid certain javascript exploits -type Connections struct { - Connections []*Connection `json:"connections"` -} - -// BlockchainProgress current sync blockchain status -type BlockchainProgress struct { - // Our current blockchain length - Current uint64 `json:"current"` - // Our best guess at true blockchain length - Highest uint64 `json:"highest"` - Peers []struct { - Address string `json:"address"` - Height uint64 `json:"height"` - } `json:"peers"` -} - -// ResendResult rebroadcast tx result -type ResendResult struct { - Txids []string `json:"txids"` // transaction id -} - -// RPC rpc -type RPC struct{} - -// GetConnection gets connection of given address -func (rpc RPC) GetConnection(d *Daemon, addr string) *Connection { - if d.Pool.Pool == nil { - return nil - } - - c, err := d.Pool.Pool.GetConnection(addr) - if err != nil { - logger.Error(err) - return nil - } - - if c == nil { - return nil - } - - mirror, exist := d.connectionMirrors.Get(addr) - if !exist { - return nil - } - - return &Connection{ - ID: c.ID, - Addr: addr, - LastSent: c.LastSent.Unix(), - LastReceived: c.LastReceived.Unix(), - Outgoing: !d.outgoingConnections.Get(addr), - Introduced: !d.needsIntro(addr), - Mirror: mirror, - ListenPort: d.GetListenPort(addr), - } -} - -// GetConnections gets all connections -func (rpc RPC) GetConnections(d *Daemon) *Connections { - if d.Pool.Pool == nil { - return nil - } - - l, err := d.Pool.Pool.Size() - if err != nil { - logger.Error(err) - return nil - } - - conns := make([]*Connection, 0, l) - cs, err := d.Pool.Pool.GetConnections() - if err != nil { - logger.Error(err) - return nil - } - - for _, c := range cs { - if c.Solicited { - conn := rpc.GetConnection(d, c.Addr()) - if conn != nil { - conns = append(conns, conn) - } - } - } - - // Sort connnections by IP address - sort.Slice(conns, func(i, j int) bool { - return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 - }) - - return &Connections{Connections: conns} -} - -// GetDefaultConnections gets default connections -func (rpc RPC) GetDefaultConnections(d *Daemon) []string { - return d.DefaultConnections -} - -// GetTrustConnections get all trusted transaction -func (rpc RPC) GetTrustConnections(d *Daemon) []string { - return d.Pex.Trusted().ToAddrs() -} - -// GetAllExchgConnections return all exchangeable connections -func (rpc RPC) GetAllExchgConnections(d *Daemon) []string { - return d.Pex.RandomExchangeable(0).ToAddrs() -} - -// GetBlockchainProgress gets the blockchain progress -func (rpc RPC) GetBlockchainProgress(v *Visor) *BlockchainProgress { - if v.v == nil { - return nil - } - - bp := &BlockchainProgress{ - Current: v.HeadBkSeq(), - Highest: v.EstimateBlockchainHeight(), - } - - peerHeights := v.GetPeerBlockchainHeights() - - for _, ph := range peerHeights { - bp.Peers = append(bp.Peers, struct { - Address string `json:"address"` - Height uint64 `json:"height"` - }{ - Address: ph.Address, - Height: ph.Height, - }) - } - - return bp -} - -// ResendTransaction rebroadcast transaction -func (rpc RPC) ResendTransaction(v *Visor, p *Pool, txHash cipher.SHA256) *ResendResult { - if v.v == nil { - return nil - } - v.ResendTransaction(txHash, p) - return &ResendResult{} -} - -// ResendUnconfirmedTxns rebroadcast unconfirmed transactions -func (rpc RPC) ResendUnconfirmedTxns(v *Visor, p *Pool) *ResendResult { - if v.v == nil { - return nil - } - txids := v.ResendUnconfirmedTxns(p) - var rlt ResendResult - for _, txid := range txids { - rlt.Txids = append(rlt.Txids, txid.Hex()) - } - return &rlt -} diff --git a/src/daemon/storage.go b/src/daemon/storage.go index 4303670..00da623 100755 --- a/src/daemon/storage.go +++ b/src/daemon/storage.go @@ -14,7 +14,6 @@ type store struct { } type storeFunc func(*store) error -type matchFunc func(k interface{}, v interface{}) bool func (s *store) setValue(k interface{}, v interface{}) { s.lk.Lock() diff --git a/src/daemon/strand/strand.go b/src/daemon/strand/strand.go index 4c08384..1df88ce 100755 --- a/src/daemon/strand/strand.go +++ b/src/daemon/strand/strand.go @@ -10,7 +10,7 @@ const ( // logDurationThreshold is how long to wait before reporting a function call's time logDurationThreshold = time.Millisecond * 100 // writeWait is how long to wait to write to a request channel before logging the delay - logQueueRequestWaitThreshold = time.Second * 3 + logQueueRequestWaitThreshold = time.Second * 1 ) var ( @@ -96,6 +96,7 @@ func Strand(logger *logging.Logger, c chan Request, name string, f func() error, } // Log a message if waiting too long to write due to a full queue + t := time.Now() loop: for { select { @@ -104,14 +105,19 @@ loop: case c <- req: break loop case <-time.After(logQueueRequestWaitThreshold): - logger.Warningf("Waited %s while trying to write %s to the strand request channel", logQueueRequestWaitThreshold, req.Name) + logger.Warningf("Waited %s while trying to write %s to the strand request channel", time.Now().Sub(t), req.Name) } } - select { - case <-quit: - return quitErr - case <-done: - return err + t = time.Now() + for { + select { + case <-quit: + return quitErr + case <-done: + return err + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while waiting for %s to be done or quit", time.Now().Sub(t), req.Name) + } } } diff --git a/src/daemon/visor.go b/src/daemon/visor.go deleted file mode 100755 index 620a244..0000000 --- a/src/daemon/visor.go +++ /dev/null @@ -1,850 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "time" - - "github.com/boltdb/bolt" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon/gnet" - "github.com/skycoin/skycoin/src/daemon/strand" - "github.com/skycoin/skycoin/src/visor" -) - -//TODO -//- download block headers -//- request blocks individually across multiple peers - -//TODO -//- use CXO for blocksync - -/* -Visor should not be duplicated -- this should be pushed into /src/visor -*/ - -// VisorConfig represents the configuration of visor -type VisorConfig struct { - Config visor.Config - // Disable visor networking - DisableNetworking bool - // How often to request blocks from peers - BlocksRequestRate time.Duration - // How often to announce our blocks to peers - BlocksAnnounceRate time.Duration - // How many blocks to respond with to a GetBlocksMessage - BlocksResponseCount uint64 - // How long between saving copies of the blockchain - BlockchainBackupRate time.Duration - // Max announce txns hash number - MaxTxnAnnounceNum int - // How often to announce our unconfirmed txns to peers - TxnsAnnounceRate time.Duration - // How long to wait for Visor request to process - RequestDeadline time.Duration - // Internal request buffer size - RequestBufferSize int -} - -// NewVisorConfig creates default visor config -func NewVisorConfig() VisorConfig { - return VisorConfig{ - Config: visor.NewVisorConfig(), - DisableNetworking: false, - BlocksRequestRate: time.Second * 60, - BlocksAnnounceRate: time.Second * 60, - BlocksResponseCount: 20, - BlockchainBackupRate: time.Second * 30, - MaxTxnAnnounceNum: 16, - TxnsAnnounceRate: time.Minute, - RequestDeadline: time.Second * 3, - RequestBufferSize: 100, - } -} - -// Visor struct -type Visor struct { - Config VisorConfig - v *visor.Visor - // Peer-reported blockchain height. Use to estimate download progress - blockchainHeights map[string]uint64 - // all request will go through this channel, to keep writing and reading member variable thread safe. - reqC chan strand.Request - quit chan struct{} -} - -// NewVisor creates visor instance -func NewVisor(c VisorConfig, db *bolt.DB) (*Visor, error) { - vs := &Visor{ - Config: c, - blockchainHeights: make(map[string]uint64), - reqC: make(chan strand.Request, c.RequestBufferSize), - quit: make(chan struct{}), - } - - v, err := visor.NewVisor(c.Config, db) - if err != nil { - return nil, err - } - - vs.v = v - - return vs, nil -} - -// Run starts the visor -func (vs *Visor) Run() error { - defer logger.Info("Visor closed") - errC := make(chan error, 1) - go func() { - errC <- vs.v.Run() - }() - - return vs.processRequests(errC) -} - -func (vs *Visor) processRequests(errC <-chan error) error { - for { - select { - case err := <-errC: - return err - case req := <-vs.reqC: - if err := req.Func(); err != nil { - logger.Errorf("Visor request func failed: %v", err) - } - } - } -} - -// Shutdown shuts down the visor -func (vs *Visor) Shutdown() { - close(vs.quit) - vs.v.Shutdown() -} - -func (vs *Visor) strand(name string, f func() error) error { - name = fmt.Sprintf("daemon.Visor.%s", name) - return strand.Strand(logger, vs.reqC, name, f, vs.quit, nil) -} - -// RefreshUnconfirmed checks unconfirmed txns against the blockchain and marks -// and returns those that become valid -func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { - var hashes []cipher.SHA256 - if err := vs.strand("RefreshUnconfirmed", func() error { - var err error - hashes, err = vs.v.RefreshUnconfirmed() - return err - }); err != nil { - return nil, err - } - return hashes, nil -} - -// RemoveInvalidUnconfirmed checks unconfirmed txns against the blockchain and -// purges those that become permanently invalid, violating hard constraints -func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { - var hashes []cipher.SHA256 - if err := vs.strand("RemoveInvalidUnconfirmed", func() error { - var err error - hashes, err = vs.v.RemoveInvalidUnconfirmed() - return err - }); err != nil { - return nil, err - } - return hashes, nil -} - -// RequestBlocks Sends a GetBlocksMessage to all connections -func (vs *Visor) RequestBlocks(pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - err := vs.strand("RequestBlocks", func() error { - m := NewGetBlocksMessage(vs.v.HeadBkSeq(), vs.Config.BlocksResponseCount) - return pool.Pool.BroadcastMessage(m) - }) - - if err != nil { - logger.Debugf("Broadcast GetBlocksMessage failed: %v", err) - } - - return err -} - -// AnnounceBlocks sends an AnnounceBlocksMessage to all connections -func (vs *Visor) AnnounceBlocks(pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - err := vs.strand("AnnounceBlocks", func() error { - m := NewAnnounceBlocksMessage(vs.v.HeadBkSeq()) - return pool.Pool.BroadcastMessage(m) - }) - - if err != nil { - logger.Debugf("Broadcast AnnounceBlocksMessage failed: %v", err) - } - - return err -} - -// AnnounceAllTxns announces local unconfirmed transactions -func (vs *Visor) AnnounceAllTxns(pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - err := vs.strand("AnnounceAllTxns", func() error { - // Get local unconfirmed transaction hashes. - hashes := vs.v.GetAllValidUnconfirmedTxHashes() - - // Divide hashes into multiple sets of max size - hashesSet := divideHashes(hashes, vs.Config.MaxTxnAnnounceNum) - - for _, hs := range hashesSet { - m := NewAnnounceTxnsMessage(hs) - if err := pool.Pool.BroadcastMessage(m); err != nil { - return err - } - } - - return nil - }) - - if err != nil { - logger.Debugf("Broadcast AnnounceTxnsMessage failed, err: %v", err) - } - - return err -} - -// AnnounceTxns announces given transaction hashes. -func (vs *Visor) AnnounceTxns(pool *Pool, txns []cipher.SHA256) error { - if vs.Config.DisableNetworking { - return nil - } - - if len(txns) == 0 { - return nil - } - - err := vs.strand("AnnounceTxns", func() error { - m := NewAnnounceTxnsMessage(txns) - return pool.Pool.BroadcastMessage(m) - }) - - if err != nil { - logger.Debugf("Broadcast AnnounceTxnsMessage failed: %v", err) - } - - return err -} - -func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { - if len(hashes) == 0 { - return [][]cipher.SHA256{} - } - - var j int - var hashesArray [][]cipher.SHA256 - - if len(hashes) > n { - for i := range hashes { - if len(hashes[j:i]) == n { - hs := make([]cipher.SHA256, n) - copy(hs, hashes[j:i]) - hashesArray = append(hashesArray, hs) - j = i - } - } - } - - hs := make([]cipher.SHA256, len(hashes)-j) - copy(hs, hashes[j:]) - hashesArray = append(hashesArray, hs) - return hashesArray -} - -// RequestBlocksFromAddr sends a GetBlocksMessage to one connected address -func (vs *Visor) RequestBlocksFromAddr(pool *Pool, addr string) error { - if vs.Config.DisableNetworking { - return errors.New("Visor disabled") - } - - err := vs.strand("RequestBlocksFromAddr", func() error { - m := NewGetBlocksMessage(vs.v.HeadBkSeq(), vs.Config.BlocksResponseCount) - exist, err := pool.Pool.IsConnExist(addr) - if err != nil { - return err - } - - if !exist { - return fmt.Errorf("Tried to send GetBlocksMessage to %s, but we are not connected", addr) - } - - return pool.Pool.SendMessage(addr, m) - }) - - return err -} - -// SetTxnsAnnounced sets all txns as announced -func (vs *Visor) SetTxnsAnnounced(txns map[cipher.SHA256]int64) { - vs.strand("SetTxnsAnnounced", func() error { - for h, t := range txns { - if err := vs.v.Unconfirmed.SetAnnounced(h, t); err != nil { - logger.Error("Failed to set unconfirmed txn announce time: ", err) - } - } - - return nil - }) -} - -// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. -// If the transaction violates either hard or soft constraints, it is not broadcast. -// This method is to be used by user-initiated transaction injections. -// For transactions received over the network, use InjectTransaction and check the result to -// decide on repropagation. -func (vs *Visor) InjectBroadcastTransaction(txn coin.Transaction, pool *Pool) error { - return vs.strand("InjectBroadcastTransaction", func() error { - if _, err := vs.v.InjectTransactionStrict(txn); err != nil { - return err - } - - return vs.broadcastTransaction(txn, pool) - }) -} - -// InjectTransaction adds a transaction to the unconfirmed txn pool if it does not violate hard constraints. -// The transaction is added to the pool if it only violates soft constraints. -// If a soft constraint is violated, the specific error is returned separately. -func (vs *Visor) InjectTransaction(tx coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { - var known bool - var softErr *visor.ErrTxnViolatesSoftConstraint - err := vs.strand("InjectTransaction", func() error { - var err error - known, softErr, err = vs.v.InjectTransaction(tx) - return err - }) - return known, softErr, err -} - -// Sends a signed block to all connections. -// TODO: deprecate, should only send to clients that request by hash -func (vs *Visor) broadcastBlock(sb coin.SignedBlock, pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - m := NewGiveBlocksMessage([]coin.SignedBlock{sb}) - return pool.Pool.BroadcastMessage(m) -} - -// broadcastTransaction broadcasts a single transaction to all peers. -func (vs *Visor) broadcastTransaction(t coin.Transaction, pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - m := NewGiveTxnsMessage(coin.Transactions{t}) - l, err := pool.Pool.Size() - if err != nil { - return err - } - - logger.Debugf("Broadcasting GiveTxnsMessage to %d conns", l) - - err = pool.Pool.BroadcastMessage(m) - if err != nil { - logger.Errorf("Broadcast GivenTxnsMessage failed: %v", err) - } - - return err -} - -// ResendTransaction resends a known UnconfirmedTxn. -func (vs *Visor) ResendTransaction(h cipher.SHA256, pool *Pool) error { - if vs.Config.DisableNetworking { - return nil - } - - return vs.strand("ResendTransaction", func() error { - if ut, ok := vs.v.Unconfirmed.Get(h); ok { - return vs.broadcastTransaction(ut.Txn, pool) - } - return nil - }) -} - -// ResendUnconfirmedTxns resents all unconfirmed transactions -func (vs *Visor) ResendUnconfirmedTxns(pool *Pool) []cipher.SHA256 { - if vs.Config.DisableNetworking { - return nil - } - - var txids []cipher.SHA256 - vs.strand("ResendUnconfirmedTxns", func() error { - txns := vs.v.GetAllUnconfirmedTxns() - - for i := range txns { - logger.Debugf("Rebroadcast tx %s", txns[i].Hash().Hex()) - if err := vs.broadcastTransaction(txns[i].Txn, pool); err == nil { - txids = append(txids, txns[i].Txn.Hash()) - } - } - - return nil - }) - return txids -} - -// CreateAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. -// Will panic if not running as a master chain. Returns creation error and -// whether it was published or not -func (vs *Visor) CreateAndPublishBlock(pool *Pool) (coin.SignedBlock, error) { - if vs.Config.DisableNetworking { - return coin.SignedBlock{}, errors.New("Visor disabled") - } - - var sb coin.SignedBlock - err := vs.strand("CreateAndPublishBlock", func() error { - var err error - sb, err = vs.v.CreateAndExecuteBlock() - if err != nil { - return err - } - - return vs.broadcastBlock(sb, pool) - }) - - return sb, err -} - -// RemoveConnection updates internal state when a connection disconnects -func (vs *Visor) RemoveConnection(addr string) { - vs.strand("RemoveConnection", func() error { - delete(vs.blockchainHeights, addr) - return nil - }) -} - -// RecordBlockchainHeight saves a peer-reported blockchain length -func (vs *Visor) RecordBlockchainHeight(addr string, bkLen uint64) { - vs.strand("RecordBlockchainHeight", func() error { - vs.blockchainHeights[addr] = bkLen - return nil - }) -} - -// EstimateBlockchainHeight returns the blockchain length estimated from peer reports -// Deprecate. Should not need. Just report time of last block -func (vs *Visor) EstimateBlockchainHeight() uint64 { - var maxLen uint64 - vs.strand("EstimateBlockchainHeight", func() error { - maxLen = vs.v.HeadBkSeq() - - for _, seq := range vs.blockchainHeights { - if maxLen < seq { - maxLen = seq - } - } - - return nil - }) - return maxLen -} - -// PeerBlockchainHeight is a peer's IP address with their reported blockchain height -type PeerBlockchainHeight struct { - Address string - Height uint64 -} - -// GetPeerBlockchainHeights returns recorded peers' blockchain heights as an array. -func (vs *Visor) GetPeerBlockchainHeights() []PeerBlockchainHeight { - var peerHeights []PeerBlockchainHeight - vs.strand("GetPeerBlockchainHeights", func() error { - if len(vs.blockchainHeights) == 0 { - return nil - } - - peerHeights = make([]PeerBlockchainHeight, 0, len(peerHeights)) - for addr, height := range vs.blockchainHeights { - peerHeights = append(peerHeights, PeerBlockchainHeight{ - Address: addr, - Height: height, - }) - } - - return nil - }) - - return peerHeights -} - -// HeadBkSeq returns the head sequence -func (vs *Visor) HeadBkSeq() uint64 { - var seq uint64 - vs.strand("HeadBkSeq", func() error { - seq = vs.v.HeadBkSeq() - return nil - }) - return seq -} - -// ExecuteSignedBlock executes signed block -func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { - return vs.strand("ExecuteSignedBlock", func() error { - return vs.v.ExecuteSignedBlock(b) - }) -} - -// GetSignedBlock returns a copy of signed block at seq. -// Returns error if seq is greater than blockhain height. -func (vs *Visor) GetSignedBlock(seq uint64) (*coin.SignedBlock, error) { - var sb *coin.SignedBlock - err := vs.strand("GetSignedBlock", func() error { - var err error - sb, err = vs.v.GetBlock(seq) - return err - }) - return sb, err -} - -// GetSignedBlocksSince returns signed blocks in an inclusive range of [seq+1, seq+ct] -func (vs *Visor) GetSignedBlocksSince(seq uint64, ct uint64) ([]coin.SignedBlock, error) { - var sbs []coin.SignedBlock - err := vs.strand("GetSignedBlocksSince", func() error { - var err error - sbs, err = vs.v.GetSignedBlocksSince(seq, ct) - return err - }) - return sbs, err -} - -// UnConfirmFilterKnown returns all unknown transaction hashes -func (vs *Visor) UnConfirmFilterKnown(txns []cipher.SHA256) []cipher.SHA256 { - var ts []cipher.SHA256 - vs.strand("UnConfirmFilterKnown", func() error { - ts = vs.v.Unconfirmed.FilterKnown(txns) - return nil - }) - return ts -} - -// UnConfirmKnow returns all know tansactions -func (vs *Visor) UnConfirmKnow(hashes []cipher.SHA256) coin.Transactions { - var txns coin.Transactions - vs.strand("UnConfirmKnow", func() error { - txns = vs.v.Unconfirmed.GetKnown(hashes) - return nil - }) - return txns -} - -// Communication layer for the coin pkg - -// GetBlocksMessage sent to request blocks since LastBlock -type GetBlocksMessage struct { - LastBlock uint64 - RequestedBlocks uint64 - c *gnet.MessageContext `enc:"-"` -} - -// NewGetBlocksMessage creates GetBlocksMessage -func NewGetBlocksMessage(lastBlock uint64, requestedBlocks uint64) *GetBlocksMessage { - return &GetBlocksMessage{ - LastBlock: lastBlock, - RequestedBlocks: requestedBlocks, // count of blocks requested - } -} - -// Handle handles message -func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { - gbm.c = mc - return daemon.(*Daemon).recordMessageEvent(gbm, mc) -} - -// Process should send number to be requested, with request -func (gbm *GetBlocksMessage) Process(d *Daemon) { - // TODO -- we need the sig to be sent with the block, but only the master - // can sign blocks. Thus the sig needs to be stored with the block. - // TODO -- move to either Messages.Config or Visor.Config - if d.Visor.Config.DisableNetworking { - return - } - // Record this as this peer's highest block - d.Visor.RecordBlockchainHeight(gbm.c.Addr, gbm.LastBlock) - // Fetch and return signed blocks since LastBlock - blocks, err := d.Visor.GetSignedBlocksSince(gbm.LastBlock, gbm.RequestedBlocks) - if err != nil { - logger.Infof("Get signed blocks failed: %v", err) - return - } - - if len(blocks) == 0 { - return - } - - logger.Debugf("Got %d blocks since %d", len(blocks), gbm.LastBlock) - - m := NewGiveBlocksMessage(blocks) - if err := d.Pool.Pool.SendMessage(gbm.c.Addr, m); err != nil { - logger.Errorf("Send GiveBlocksMessage to %s failed: %v", gbm.c.Addr, err) - } -} - -// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited -type GiveBlocksMessage struct { - Blocks []coin.SignedBlock - c *gnet.MessageContext `enc:"-"` -} - -// NewGiveBlocksMessage creates GiveBlocksMessage -func NewGiveBlocksMessage(blocks []coin.SignedBlock) *GiveBlocksMessage { - return &GiveBlocksMessage{ - Blocks: blocks, - } -} - -// Handle handle message -func (gbm *GiveBlocksMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { - gbm.c = mc - return daemon.(*Daemon).recordMessageEvent(gbm, mc) -} - -// Process process message -func (gbm *GiveBlocksMessage) Process(d *Daemon) { - if d.Visor.Config.DisableNetworking { - logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") - return - } - - processed := 0 - maxSeq := d.Visor.HeadBkSeq() - for _, b := range gbm.Blocks { - // To minimize waste when receiving multiple responses from peers - // we only break out of the loop if the block itself is invalid. - // E.g. if we request 20 blocks since 0 from 2 peers, and one peer - // replies with 15 and the other 20, if we did not do this check and - // the reply with 15 was received first, we would toss the one with 20 - // even though we could process it at the time. - if b.Seq() <= maxSeq { - continue - } - - err := d.Visor.ExecuteSignedBlock(b) - if err == nil { - logger.Critical().Infof("Added new block %d", b.Block.Head.BkSeq) - processed++ - } else { - logger.Critical().Errorf("Failed to execute received block %d: %v", b.Block.Head.BkSeq, err) - // Blocks must be received in order, so if one fails its assumed - // the rest are failing - break - } - } - if processed == 0 { - return - } - - headBkSeq := d.Visor.HeadBkSeq() - // Announce our new blocks to peers - m1 := NewAnnounceBlocksMessage(headBkSeq) - d.Pool.Pool.BroadcastMessage(m1) - //request more blocks. - m2 := NewGetBlocksMessage(headBkSeq, d.Visor.Config.BlocksResponseCount) - d.Pool.Pool.BroadcastMessage(m2) -} - -// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose -// to send GetBlocksMessage in response -type AnnounceBlocksMessage struct { - MaxBkSeq uint64 - c *gnet.MessageContext `enc:"-"` -} - -// NewAnnounceBlocksMessage creates message -func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { - return &AnnounceBlocksMessage{ - MaxBkSeq: seq, - } -} - -// Handle handles message -func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { - abm.c = mc - return daemon.(*Daemon).recordMessageEvent(abm, mc) -} - -// Process process message -func (abm *AnnounceBlocksMessage) Process(d *Daemon) { - if d.Visor.Config.DisableNetworking { - return - } - - headBkSeq := d.Visor.HeadBkSeq() - if headBkSeq >= abm.MaxBkSeq { - return - } - - // TODO: Should this be block get request for current sequence? - // If client is not caught up, won't attempt to get block - m := NewGetBlocksMessage(headBkSeq, d.Visor.Config.BlocksResponseCount) - if err := d.Pool.Pool.SendMessage(abm.c.Addr, m); err != nil { - logger.Errorf("Send GetBlocksMessage to %s failed: %v", abm.c.Addr, err) - } -} - -// SendingTxnsMessage send transaction message interface -type SendingTxnsMessage interface { - GetTxns() []cipher.SHA256 -} - -// AnnounceTxnsMessage tells a peer that we have these transactions -type AnnounceTxnsMessage struct { - Txns []cipher.SHA256 - c *gnet.MessageContext `enc:"-"` -} - -// NewAnnounceTxnsMessage creates announce txns message -func NewAnnounceTxnsMessage(txns []cipher.SHA256) *AnnounceTxnsMessage { - return &AnnounceTxnsMessage{ - Txns: txns, - } -} - -// GetTxns returns txns -func (atm *AnnounceTxnsMessage) GetTxns() []cipher.SHA256 { - return atm.Txns -} - -// Handle handle message -func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { - atm.c = mc - return daemon.(*Daemon).recordMessageEvent(atm, mc) -} - -// Process process message -func (atm *AnnounceTxnsMessage) Process(d *Daemon) { - if d.Visor.Config.DisableNetworking { - return - } - - unknown := d.Visor.UnConfirmFilterKnown(atm.Txns) - if len(unknown) == 0 { - return - } - - m := NewGetTxnsMessage(unknown) - if err := d.Pool.Pool.SendMessage(atm.c.Addr, m); err != nil { - logger.Errorf("Send GetTxnsMessage to %s failed: %v", atm.c.Addr, err) - } -} - -// GetTxnsMessage request transactions of given hash -type GetTxnsMessage struct { - Txns []cipher.SHA256 - c *gnet.MessageContext `enc:"-"` -} - -// NewGetTxnsMessage creates GetTxnsMessage -func NewGetTxnsMessage(txns []cipher.SHA256) *GetTxnsMessage { - return &GetTxnsMessage{ - Txns: txns, - } -} - -// Handle handle message -func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { - gtm.c = mc - return daemon.(*Daemon).recordMessageEvent(gtm, mc) -} - -// Process process message -func (gtm *GetTxnsMessage) Process(d *Daemon) { - if d.Visor.Config.DisableNetworking { - return - } - - // Locate all txns from the unconfirmed pool - known := d.Visor.UnConfirmKnow(gtm.Txns) - if len(known) == 0 { - return - } - - // Reply to sender with GiveTxnsMessage - m := NewGiveTxnsMessage(known) - if err := d.Pool.Pool.SendMessage(gtm.c.Addr, m); err != nil { - logger.Errorf("Send GiveTxnsMessage to %s failed: %v", gtm.c.Addr, err) - } -} - -// GiveTxnsMessage tells the transaction of given hashes -type GiveTxnsMessage struct { - Txns coin.Transactions - c *gnet.MessageContext `enc:"-"` -} - -// NewGiveTxnsMessage creates GiveTxnsMessage -func NewGiveTxnsMessage(txns coin.Transactions) *GiveTxnsMessage { - return &GiveTxnsMessage{ - Txns: txns, - } -} - -// GetTxns returns transactions hashes -func (gtm *GiveTxnsMessage) GetTxns() []cipher.SHA256 { - return gtm.Txns.Hashes() -} - -// Handle handle message -func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, - daemon interface{}) error { - gtm.c = mc - return daemon.(*Daemon).recordMessageEvent(gtm, mc) -} - -// Process process message -func (gtm *GiveTxnsMessage) Process(d *Daemon) { - if d.Visor.Config.DisableNetworking { - return - } - - hashes := make([]cipher.SHA256, 0, len(gtm.Txns)) - // Update unconfirmed pool with these transactions - for _, txn := range gtm.Txns { - // Only announce transactions that are new to us, so that peers can't spam relays - known, softErr, err := d.Visor.InjectTransaction(txn) - if err != nil { - logger.Warningf("Failed to record transaction %s: %v", txn.Hash().Hex(), err) - continue - } else if softErr != nil { - logger.Warningf("Transaction soft violation: %v", err) - continue - } else if known { - logger.Warningf("Duplicate Transaction: %s", txn.Hash().Hex()) - continue - } - - hashes = append(hashes, txn.Hash()) - } - - // Announce these transactions to peers - if len(hashes) != 0 { - logger.Debugf("Announce %d transactions", len(hashes)) - m := NewAnnounceTxnsMessage(hashes) - d.Pool.Pool.BroadcastMessage(m) - } -} diff --git a/src/daemon/visor_test.go b/src/daemon/visor_test.go deleted file mode 100755 index a804b4b..0000000 --- a/src/daemon/visor_test.go +++ /dev/null @@ -1,367 +0,0 @@ -package daemon - -import ( - "errors" - "fmt" - "testing" - - "github.com/boltdb/bolt" - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon/strand" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/fee" - "github.com/skycoin/skycoin/src/visor" -) - -var ( - GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() - GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) -) - -const ( - TimeIncrement uint64 = 3600 * 1000 - GenesisTime uint64 = 1000 - GenesisCoins uint64 = 1000e6 - GenesisCoinHours uint64 = 1000 * 1000 -) - -func MakeTransactionForChain(t *testing.T, bc *visor.Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { - chrs, err := ux.CoinHours(bc.Time()) - require.NoError(t, err) - - require.Equal(t, cipher.AddressFromPubKey(cipher.PubKeyFromSecKey(sec)), ux.Body.Address) - - knownUx, exists := bc.Unspent().Get(ux.Hash()) - require.True(t, exists) - require.Equal(t, knownUx, ux) - - tx := coin.Transaction{} - tx.PushInput(ux.Hash()) - - tx.PushOutput(toAddr, amt, hours) - - // Change output - coinsOut := ux.Body.Coins - amt - if coinsOut > 0 { - tx.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) - } - - tx.SignInputs([]cipher.SecKey{sec}) - - require.Equal(t, len(tx.Sigs), 1) - - err = cipher.ChkSig(ux.Body.Address, cipher.AddSHA256(tx.HashInner(), tx.In[0]), tx.Sigs[0]) - require.NoError(t, err) - - tx.UpdateHeader() - - err = tx.Verify() - require.NoError(t, err) - - err = bc.VerifySingleTxnHardConstraints(tx) - require.NoError(t, err) - - return tx -} - -func MakeBlockchain(t *testing.T, db *bolt.DB, seckey cipher.SecKey) *visor.Blockchain { - pubkey := cipher.PubKeyFromSecKey(seckey) - b, err := visor.NewBlockchain(db, pubkey) - require.NoError(t, err) - gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) - if err != nil { - panic(fmt.Errorf("create genesis block failed: %v", err)) - } - - sig := cipher.SignHash(gb.HashHeader(), seckey) - db.Update(func(tx *bolt.Tx) error { - return b.ExecuteBlockWithTx(tx, &coin.SignedBlock{ - Block: *gb, - Sig: sig, - }) - }) - return b -} - -func MakeAddress() (cipher.PubKey, cipher.SecKey, cipher.Address) { - p, s := cipher.GenerateKeyPair() - a := cipher.AddressFromPubKey(p) - return p, s, a -} - -func createGenesisSpendTransaction(t *testing.T, bc *visor.Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { - uxOuts, err := bc.Unspent().GetAll() - require.NoError(t, err) - require.Len(t, uxOuts, 1) - - txn := MakeTransactionForChain(t, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) - require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) - - if coins == GenesisCoins { - // No change output - require.Len(t, txn.Out, 1) - } else { - require.Len(t, txn.Out, 2) - require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) - } - - return txn -} - -func setupSimpleVisor(db *bolt.DB, bc *visor.Blockchain) *Visor { - visorCfg := NewVisorConfig() - visorCfg.DisableNetworking = true - visorCfg.Config.DBPath = db.Path() - return &Visor{ - Config: visorCfg, - v: &visor.Visor{ - Config: visorCfg.Config, - Unconfirmed: visor.NewUnconfirmedTxnPool(db), - Blockchain: bc, - }, - reqC: make(chan strand.Request, 10), - } -} - -func TestVerifyTransactionInvalidFee(t *testing.T) { - // Test that a soft constraint is enforced - // Full verification tests are in visor/blockchain_verify_test.go - db, close := testutil.PrepareDB(t) - defer close() - - // Setup blockchain - _, s := cipher.GenerateKeyPair() - bc := MakeBlockchain(t, db, s) - - // Send coins to the initial address, with invalid fee - var coins = GenesisCoins - var hours = GenesisCoinHours * 1e3 - var f uint64 - _, _, addr := MakeAddress() - - txn := createGenesisSpendTransaction(t, bc, addr, coins, hours, f) - - // Setup a minimal visor - v := setupSimpleVisor(db, bc) - errC := make(chan error) - go v.processRequests(errC) - defer func() { - errC <- errors.New("stop") - }() - - _, softErr, err := v.InjectTransaction(txn) - require.NoError(t, err) - require.NotNil(t, softErr) - require.Equal(t, visor.NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) -} - -func TestVerifyTransactionInvalidSignature(t *testing.T) { - // Test that a hard constraint is enforced - // Full verification tests are in visor/blockchain_verify_test.go - db, close := testutil.PrepareDB(t) - defer close() - - // Setup blockchain - _, s := cipher.GenerateKeyPair() - bc := MakeBlockchain(t, db, s) - - // Send coins to the initial address, with invalid fee - var coins = GenesisCoins - var hours uint64 - var fee uint64 - _, _, addr := MakeAddress() - - txn := createGenesisSpendTransaction(t, bc, addr, coins, hours, fee) - - // Invalidate signatures - txn.Sigs = nil - - // Setup a minimal visor - v := setupSimpleVisor(db, bc) - errC := make(chan error) - go v.processRequests(errC) - defer func() { - errC <- errors.New("stop") - }() - - _, softErr, err := v.InjectTransaction(txn) - require.Nil(t, softErr) - testutil.RequireError(t, err, visor.NewErrTxnViolatesHardConstraint(errors.New("Invalid number of signatures")).Error()) -} - -func TestInjectValidTransaction(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - _, s := cipher.GenerateKeyPair() - // Setup blockchain - bc := MakeBlockchain(t, db, s) - - // Send coins to the initial address, with invalid fee - var coins = GenesisCoins - var hours uint64 - var fee uint64 - _, _, addr := MakeAddress() - - txn := createGenesisSpendTransaction(t, bc, addr, coins, hours, fee) - - // Setup a minimal visor - v := setupSimpleVisor(db, bc) - errC := make(chan error) - go v.processRequests(errC) - defer func() { - errC <- errors.New("stop") - }() - - // The unconfirmed pool should be empty - txns := v.v.Unconfirmed.RawTxns() - require.Len(t, txns, 0) - - // Call injectTransaction - _, softErr, err := v.InjectTransaction(txn) - require.Nil(t, softErr) - require.NoError(t, err) - - // The transaction should appear in the unconfirmed pool - txns = v.v.Unconfirmed.RawTxns() - require.Len(t, txns, 1) - require.Equal(t, txns[0], txn) -} - -func TestInjectTransactionSoftViolationNoFee(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - // Setup blockchain - _, s := cipher.GenerateKeyPair() - bc := MakeBlockchain(t, db, s) - - // Send coins to the initial address, with invalid fee - var coins = GenesisCoins - var hours = GenesisCoinHours * 1e3 - var f uint64 - _, _, addr := MakeAddress() - - txn := createGenesisSpendTransaction(t, bc, addr, coins, hours, f) - - // Setup a minimal visor - v := setupSimpleVisor(db, bc) - errC := make(chan error) - go v.processRequests(errC) - defer func() { - errC <- errors.New("stop") - }() - - // The unconfirmed pool should be empty - txns := v.v.Unconfirmed.RawTxns() - require.Len(t, txns, 0) - - // Call injectTransaction - _, softErr, err := v.InjectTransaction(txn) - require.NoError(t, err) - require.NotNil(t, softErr) - require.Equal(t, visor.NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) - - // The transaction should appear in the unconfirmed pool - txns = v.v.Unconfirmed.RawTxns() - require.Len(t, txns, 1) -} - -func TestSplitHashes(t *testing.T) { - hashes := make([]cipher.SHA256, 10) - for i := 0; i < 10; i++ { - hashes[i] = cipher.SumSHA256(cipher.RandByte(512)) - } - - testCases := []struct { - name string - init []cipher.SHA256 - n int - array [][]cipher.SHA256 - }{ - { - "has one odd", - hashes[:], - 3, - [][]cipher.SHA256{ - []cipher.SHA256{ - hashes[0], - hashes[1], - hashes[2], - }, - []cipher.SHA256{ - hashes[3], - hashes[4], - hashes[5], - }, - []cipher.SHA256{ - hashes[6], - hashes[7], - hashes[8], - }, - []cipher.SHA256{ - hashes[9], - }, - }, - }, - { - "only one value", - hashes[:1], - 1, - [][]cipher.SHA256{ - []cipher.SHA256{ - hashes[0], - }, - }, - }, - { - "empty value", - hashes[:0], - 0, - [][]cipher.SHA256{}, - }, - { - "with 3 value", - hashes[:3], - 3, - [][]cipher.SHA256{ - []cipher.SHA256{ - hashes[0], - hashes[1], - hashes[2], - }, - }, - }, - { - "with 8 value", - hashes[:8], - 3, - [][]cipher.SHA256{ - []cipher.SHA256{ - hashes[0], - hashes[1], - hashes[2], - }, - []cipher.SHA256{ - hashes[3], - hashes[4], - hashes[5], - }, - []cipher.SHA256{ - hashes[6], - hashes[7], - }, - }, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - rlt := divideHashes(tc.init, tc.n) - require.Equal(t, tc.array, rlt) - }) - } -} diff --git a/src/gui/blockchain.go b/src/gui/blockchain.go deleted file mode 100755 index 47b5bfe..0000000 --- a/src/gui/blockchain.go +++ /dev/null @@ -1,146 +0,0 @@ -package gui - -// Blockchain related information for the GUI - -import ( - "fmt" - "net/http" - "strconv" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - wh "github.com/skycoin/skycoin/src/util/http" - "github.com/skycoin/skycoin/src/visor" //http,json helpers -) - -func blockchainHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - metadata, err := gateway.GetBlockchainMetadata() - if err != nil { - err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, metadata) - } -} - -func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - wh.SendJSONOr500(logger, w, gateway.GetBlockchainProgress()) - } -} - -// get block by hash or seq -// method: GET -// url: /block?hash=[:hash] or /block?seq[:seq] -// params: hash or seq, should only specify one filter. -func getBlock(gate Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - hash := r.FormValue("hash") - seq := r.FormValue("seq") - var b coin.SignedBlock - var exist bool - switch { - case hash == "" && seq == "": - wh.Error400(w, "should specify one filter, hash or seq") - return - case hash != "" && seq != "": - wh.Error400(w, "should only specify one filter, hash or seq") - return - case hash != "": - h, err := cipher.SHA256FromHex(hash) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - b, exist = gate.GetBlockByHash(h) - case seq != "": - uSeq, err := strconv.ParseUint(seq, 10, 64) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - b, exist = gate.GetBlockBySeq(uSeq) - } - - if !exist { - wh.Error404(w, "") - return - } - - rb, err := visor.NewReadableBlock(&b.Block) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, rb) - } -} - -func getBlocks(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - sstart := r.FormValue("start") - start, err := strconv.ParseUint(sstart, 10, 64) - if err != nil { - wh.Error400(w, fmt.Sprintf("Invalid start value \"%s\"", sstart)) - return - } - - send := r.FormValue("end") - end, err := strconv.ParseUint(send, 10, 64) - if err != nil { - wh.Error400(w, fmt.Sprintf("Invalid end value \"%s\"", send)) - return - } - rb, err := gateway.GetBlocks(start, end) - if err != nil { - wh.Error400(w, fmt.Sprintf("Get blocks failed: %v", err)) - return - } - wh.SendJSONOr500(logger, w, rb) - } -} - -// get last N blocks -func getLastBlocks(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - num := r.FormValue("num") - if num == "" { - wh.Error400(w, "Param: num is empty") - return - } - - n, err := strconv.ParseUint(num, 10, 64) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - rb, err := gateway.GetLastBlocks(n) - if err != nil { - wh.Error400(w, fmt.Sprintf("Get last %v blocks failed: %v", n, err)) - return - } - - wh.SendJSONOr500(logger, w, rb) - } -} diff --git a/src/gui/blockchain_test.go b/src/gui/blockchain_test.go deleted file mode 100755 index 2314f07..0000000 --- a/src/gui/blockchain_test.go +++ /dev/null @@ -1,471 +0,0 @@ -package gui - -import ( - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "encoding/json" - - "math" - - "github.com/stretchr/testify/require" - - "errors" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/visor" -) - -func makeBadBlock(t *testing.T) *coin.Block { - genPublic, _ := cipher.GenerateKeyPair() - genAddress := cipher.AddressFromPubKey(genPublic) - var genCoins uint64 = 1000e6 - var genTime uint64 = 1000 - now := genTime + 100 - preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) - require.NoError(t, err) - uxHash := testutil.RandSHA256(t) - tx := coin.Transaction{} - tx.PushOutput(genAddress, math.MaxInt64+1, 255) - b, err := coin.NewBlock(*preBlock, now, uxHash, coin.Transactions{tx}, func(t *coin.Transaction) (uint64, error) { - return 0, nil - }) - require.NoError(t, err) - return b -} - -func TestGetBlock(t *testing.T) { - - badBlock := makeBadBlock(t) - validHashString := testutil.RandSHA256(t).Hex() - validSHA256, err := cipher.SHA256FromHex(validHashString) - require.NoError(t, err) - - tt := []struct { - name string - method string - status int - err string - hash string - sha256 cipher.SHA256 - seqStr string - seq uint64 - gatewayGetBlockByHashResult coin.SignedBlock - gatewayGetBlockByHashExists bool - gatewayGetBlockBySeqResult coin.SignedBlock - gatewayGetBlockBySeqExists bool - response *visor.ReadableBlock - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - no seq and hash", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - should specify one filter, hash or seq", - }, - { - name: "400 - seq and hash simultaneously", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - should only specify one filter, hash or seq", - hash: "hash", - seqStr: "seq", - }, - { - name: "400 - hash error: encoding/hex err invalid byte: U+0068 'h'", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: invalid byte: U+0068 'h'", - hash: "hash", - }, - { - name: "400 - hash error: encoding/hex: odd length hex string", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: odd length hex string", - hash: "1234abc", - }, - { - name: "400 - hash error: Invalid hex length", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid hex length", - hash: "1234abcd", - }, - { - name: "404 - block by hash does not exist", - method: http.MethodGet, - status: http.StatusNotFound, - err: "404 Not Found", - hash: validHashString, - sha256: validSHA256, - }, - { - name: "200 - got block by hash", - method: http.MethodGet, - status: http.StatusOK, - hash: validHashString, - sha256: validSHA256, - gatewayGetBlockByHashExists: true, - response: &visor.ReadableBlock{ - Head: visor.ReadableBlockHeader{ - BkSeq: 0x0, - BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", - PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", - Time: 0x0, - Fee: 0x0, - Version: 0x0, - BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", - }, - Body: visor.ReadableBlockBody{ - Transactions: []visor.ReadableTransaction{}, - }, - }, - }, - { - name: "400 - seq error: invalid syntax", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - strconv.ParseUint: parsing \"seq\": invalid syntax", - seqStr: "seq", - }, - { - name: "404 - block by seq does not exist", - method: http.MethodGet, - status: http.StatusNotFound, - err: "404 Not Found", - seqStr: "1", - seq: 1, - }, - { - name: "500 - NewReadableBlock error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", - seqStr: "1", - seq: 1, - gatewayGetBlockBySeqResult: coin.SignedBlock{ - Block: *badBlock, - }, - gatewayGetBlockBySeqExists: true, - }, - { - name: "200 - got block by seq", - method: http.MethodGet, - status: http.StatusOK, - seqStr: "1", - seq: 1, - gatewayGetBlockBySeqExists: true, - response: &visor.ReadableBlock{ - Head: visor.ReadableBlockHeader{ - BkSeq: 0x0, - BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", - PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", - Time: 0x0, - Fee: 0x0, - Version: 0x0, - BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", - }, - Body: visor.ReadableBlockBody{ - Transactions: []visor.ReadableTransaction{}, - }, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - - gateway.On("GetBlockByHash", tc.sha256).Return(tc.gatewayGetBlockByHashResult, tc.gatewayGetBlockByHashExists) - gateway.On("GetBlockBySeq", tc.seq).Return(tc.gatewayGetBlockBySeqResult, tc.gatewayGetBlockBySeqExists) - - endpoint := "/block" - - v := url.Values{} - if tc.hash != "" { - v.Add("hash", tc.hash) - } - if tc.seqStr != "" { - v.Add("seq", tc.seqStr) - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *visor.ReadableBlock - err := json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.response, msg) - } - }) - } -} - -func TestGetBlocks(t *testing.T) { - type httpBody struct { - Start string - End string - } - - tt := []struct { - name string - method string - status int - err string - body *httpBody - start uint64 - end uint64 - gatewayGetBlocksResult *visor.ReadableBlocks - gatewayGetBlocksError error - response *visor.ReadableBlocks - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - empty start/end", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid start value \"\"", - }, - { - name: "400 - bad start", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid start value \"badStart\"", - body: &httpBody{ - Start: "badStart", - }, - }, - { - name: "400 - bad end", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid end value \"badEnd\"", - body: &httpBody{ - Start: "1", - End: "badEnd", - }, - start: 1, - }, - { - name: "400 - gatewayGetBlocksError", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Get blocks failed: gatewayGetBlocksError", - body: &httpBody{ - Start: "1", - End: "3", - }, - start: 1, - end: 3, - gatewayGetBlocksError: errors.New("gatewayGetBlocksError"), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - body: &httpBody{ - Start: "1", - End: "3", - }, - start: 1, - end: 3, - gatewayGetBlocksResult: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, - response: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("GetBlocks", tc.start, tc.end).Return(tc.gatewayGetBlocksResult, tc.gatewayGetBlocksError) - - endpoint := "/blocks" - - v := url.Values{} - if tc.body != nil { - if tc.body.Start != "" { - v.Add("start", tc.body.Start) - } - if tc.body.End != "" { - v.Add("end", tc.body.End) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *visor.ReadableBlocks - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.response, msg) - } - }) - } -} - -func TestGetLastBlocks(t *testing.T) { - type httpBody struct { - Num string - } - tt := []struct { - name string - method string - url string - status int - err string - body httpBody - num uint64 - gatewayGetLastBlocksResult *visor.ReadableBlocks - gatewayGetLastBlocksError error - response *visor.ReadableBlocks - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - body: httpBody{ - Num: "1", - }, - num: 1, - }, - { - name: "400 - empty num value", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Param: num is empty", - num: 1, - }, - { - name: "400 - bad num value", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - strconv.ParseUint: parsing \"badNumValue\": invalid syntax", - body: httpBody{ - Num: "badNumValue", - }, - num: 1, - }, - { - name: "400 - gatewayGetLastBlocksError", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Get last 1 blocks failed: gatewayGetLastBlocksError", - body: httpBody{ - Num: "1", - }, - num: 1, - gatewayGetLastBlocksError: errors.New("gatewayGetLastBlocksError"), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - body: httpBody{ - Num: "1", - }, - num: 1, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/last_blocks" - gateway := NewGatewayerMock() - - gateway.On("GetLastBlocks", tc.num).Return(tc.gatewayGetLastBlocksResult, tc.gatewayGetLastBlocksError) - - v := url.Values{} - if tc.body.Num != "" { - v.Add("num", tc.body.Num) - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *visor.ReadableBlocks - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.response, msg) - } - }) - } -} diff --git a/src/gui/client.go b/src/gui/client.go deleted file mode 100755 index beedfb3..0000000 --- a/src/gui/client.go +++ /dev/null @@ -1,831 +0,0 @@ -package gui - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "strings" - "time" - - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/visor/historydb" - "github.com/skycoin/skycoin/src/wallet" -) - -const ( - dialTimeout = 60 * time.Second - httpClientTimeout = 120 * time.Second - tlsHandshakeTimeout = 60 * time.Second -) - -// APIError is used for non-200 API responses -type APIError struct { - Status string - StatusCode int - Message string -} - -func (e APIError) Error() string { - return e.Message -} - -// Client provides an interface to a remote node's HTTP API -type Client struct { - HTTPClient *http.Client - Addr string -} - -// NewClient creates a Client -func NewClient(addr string) *Client { - transport := &http.Transport{ - Dial: (&net.Dialer{ - Timeout: dialTimeout, - }).Dial, - TLSHandshakeTimeout: tlsHandshakeTimeout, - } - httpClient := &http.Client{ - Transport: transport, - Timeout: httpClientTimeout, - } - addr = strings.TrimRight(addr, "/") - addr += "/" - - return &Client{ - Addr: addr, - HTTPClient: httpClient, - } -} - -// Get makes a GET request to an endpoint and unmarshals the response to obj. -// If the response is not 200 OK, returns an error -func (c *Client) Get(endpoint string, obj interface{}) error { - resp, err := c.get(endpoint) - if err != nil { - return err - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - return APIError{ - Status: resp.Status, - StatusCode: resp.StatusCode, - Message: string(body), - } - } - - if obj == nil { - return nil - } - return json.NewDecoder(resp.Body).Decode(obj) -} - -// get makes a GET request to an endpoint. Caller must close response body. -func (c *Client) get(endpoint string) (*http.Response, error) { - endpoint = strings.TrimLeft(endpoint, "/") - endpoint = c.Addr + endpoint - - req, err := http.NewRequest(http.MethodGet, endpoint, nil) - if err != nil { - return nil, err - } - - return c.HTTPClient.Do(req) -} - -// PostForm makes a POST request to an endpoint with body of "application/x-www-form-urlencoded" formated data. -func (c *Client) PostForm(endpoints string, body io.Reader, obj interface{}) error { - return c.post(endpoints, "application/x-www-form-urlencoded", body, obj) -} - -// PostJSON makes a POST request to an endpoint with body of json data. -func (c *Client) PostJSON(endpoints string, reqObj, respObj interface{}) error { - body, err := json.Marshal(reqObj) - if err != nil { - return err - } - - return c.post(endpoints, "application/json", bytes.NewReader(body), respObj) -} - -// Post makes a POST request to an endpoint. Caller must close response body. -func (c *Client) post(endpoint string, contentType string, body io.Reader, obj interface{}) error { - csrf, err := c.CSRF() - if err != nil { - return err - } - - endpoint = strings.TrimLeft(endpoint, "/") - endpoint = c.Addr + endpoint - - req, err := http.NewRequest(http.MethodPost, endpoint, body) - if err != nil { - return err - } - - if csrf != "" { - req.Header.Set(CSRFHeaderName, csrf) - } - - req.Header.Set("Content-Type", contentType) - - resp, err := c.HTTPClient.Do(req) - if err != nil { - return err - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - return APIError{ - Status: resp.Status, - StatusCode: resp.StatusCode, - Message: string(body), - } - } - - if obj == nil { - return nil - } - - return json.NewDecoder(resp.Body).Decode(obj) -} - -// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. -func (c *Client) CSRF() (string, error) { - resp, err := c.get("/csrf") - if err != nil { - return "", err - } - - defer resp.Body.Close() - - switch resp.StatusCode { - case http.StatusOK: - case http.StatusNotFound: - // CSRF is disabled on the node - return "", nil - default: - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return "", err - } - - return "", APIError{ - Status: resp.Status, - StatusCode: resp.StatusCode, - Message: string(body), - } - } - - var m map[string]string - if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { - return "", err - } - - token, ok := m["csrf_token"] - if !ok { - return "", errors.New("csrf_token not found in response") - } - - return token, nil -} - -// Version makes a request to /version -func (c *Client) Version() (*visor.BuildInfo, error) { - var bi visor.BuildInfo - if err := c.Get("/version", &bi); err != nil { - return nil, err - } - return &bi, nil -} - -// Outputs makes a request to /outputs -func (c *Client) Outputs() (*visor.ReadableOutputSet, error) { - var o visor.ReadableOutputSet - if err := c.Get("/outputs", &o); err != nil { - return nil, err - } - return &o, nil -} - -// OutputsForAddresses makes a request to /outputs?addrs=xxx -func (c *Client) OutputsForAddresses(addrs []string) (*visor.ReadableOutputSet, error) { - v := url.Values{} - v.Add("addrs", strings.Join(addrs, ",")) - endpoint := "/outputs?" + v.Encode() - - var o visor.ReadableOutputSet - if err := c.Get(endpoint, &o); err != nil { - return nil, err - } - return &o, nil -} - -// OutputsForHashes makes a request to /outputs?hashes=zzz -func (c *Client) OutputsForHashes(hashes []string) (*visor.ReadableOutputSet, error) { - v := url.Values{} - v.Add("hashes", strings.Join(hashes, ",")) - endpoint := "/outputs?" + v.Encode() - - var o visor.ReadableOutputSet - if err := c.Get(endpoint, &o); err != nil { - return nil, err - } - return &o, nil -} - -// CoinSupply makes a request to /coinSupply -func (c *Client) CoinSupply() (*CoinSupply, error) { - var cs CoinSupply - if err := c.Get("/coinSupply", &cs); err != nil { - return nil, err - } - return &cs, nil -} - -// BlockByHash makes a request to /block?hash=xxx -func (c *Client) BlockByHash(hash string) (*visor.ReadableBlock, error) { - v := url.Values{} - v.Add("hash", hash) - endpoint := "/block?" + v.Encode() - - var b visor.ReadableBlock - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// BlockBySeq makes a request to /block?seq=xxx -func (c *Client) BlockBySeq(seq uint64) (*visor.ReadableBlock, error) { - v := url.Values{} - v.Add("seq", fmt.Sprint(seq)) - endpoint := "/block?" + v.Encode() - - var b visor.ReadableBlock - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// Blocks makes a request to /blocks -func (c *Client) Blocks(start, end int) (*visor.ReadableBlocks, error) { - v := url.Values{} - v.Add("start", fmt.Sprint(start)) - v.Add("end", fmt.Sprint(end)) - endpoint := "/blocks?" + v.Encode() - - var b visor.ReadableBlocks - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// LastBlocks makes a request to /last_blocks -func (c *Client) LastBlocks(n int) (*visor.ReadableBlocks, error) { - v := url.Values{} - v.Add("num", fmt.Sprint(n)) - endpoint := "/last_blocks?" + v.Encode() - - var b visor.ReadableBlocks - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// BlockchainMetadata makes a request to /blockchain/metadata -func (c *Client) BlockchainMetadata() (*visor.BlockchainMetadata, error) { - var b visor.BlockchainMetadata - if err := c.Get("/blockchain/metadata", &b); err != nil { - return nil, err - } - return &b, nil -} - -// BlockchainProgress makes a request to /blockchain/progress -func (c *Client) BlockchainProgress() (*daemon.BlockchainProgress, error) { - var b daemon.BlockchainProgress - if err := c.Get("/blockchain/progress", &b); err != nil { - return nil, err - } - return &b, nil -} - -// Balance makes a request to /balance?addrs=xxx -func (c *Client) Balance(addrs []string) (*wallet.BalancePair, error) { - v := url.Values{} - v.Add("addrs", strings.Join(addrs, ",")) - endpoint := "/balance?" + v.Encode() - - var b wallet.BalancePair - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// UxOut makes a request to /uxout?uxid=xxx -func (c *Client) UxOut(uxID string) (*historydb.UxOutJSON, error) { - v := url.Values{} - v.Add("uxid", uxID) - endpoint := "/uxout?" + v.Encode() - - var b historydb.UxOutJSON - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// AddressUxOuts makes a request to /address_uxouts -func (c *Client) AddressUxOuts(addr string) ([]*historydb.UxOutJSON, error) { - v := url.Values{} - v.Add("address", addr) - endpoint := "/address_uxouts?" + v.Encode() - - var b []*historydb.UxOutJSON - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return b, nil -} - -// Wallet makes a request to /wallet -func (c *Client) Wallet(id string) (*WalletResponse, error) { - v := url.Values{} - v.Add("id", id) - endpoint := "/wallet?" + v.Encode() - - var wr WalletResponse - if err := c.Get(endpoint, &wr); err != nil { - return nil, err - } - - return &wr, nil -} - -// Wallets makes a request to /wallets -func (c *Client) Wallets() ([]*WalletResponse, error) { - var wrs []*WalletResponse - if err := c.Get("/wallets", &wrs); err != nil { - return nil, err - } - - return wrs, nil -} - -// CreateUnencryptedWallet makes a request to /wallet/create and create -// a wallet without no encryption -// If scanN is <= 0, the scan number defaults to 1 -func (c *Client) CreateUnencryptedWallet(seed, label string, scanN int) (*WalletResponse, error) { - v := url.Values{} - v.Add("seed", seed) - v.Add("label", label) - v.Add("encrypt", "false") - - if scanN > 0 { - v.Add("scan", fmt.Sprint(scanN)) - } - - var w WalletResponse - if err := c.PostForm("/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { - return nil, err - } - return &w, nil -} - -// CreateEncryptedWallet makes a request to /wallet/create and try to create -// a wallet with encryption. -// If scanN is <= 0, the scan number defaults to 1 -func (c *Client) CreateEncryptedWallet(seed, label, password string, scanN int) (*WalletResponse, error) { - v := url.Values{} - v.Add("seed", seed) - v.Add("label", label) - v.Add("encrypt", "true") - v.Add("password", password) - - if scanN > 0 { - v.Add("scan", fmt.Sprint(scanN)) - } - - var w WalletResponse - if err := c.PostForm("/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { - return nil, err - } - return &w, nil -} - -// NewWalletAddress makes a request to /wallet/newAddress -// if n is <= 0, defaults to 1 -func (c *Client) NewWalletAddress(id string, n int, password string) ([]string, error) { - v := url.Values{} - v.Add("id", id) - if n > 0 { - v.Add("num", fmt.Sprint(n)) - } - - v.Add("password", password) - - var obj struct { - Addresses []string `json:"addresses"` - } - if err := c.PostForm("/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { - return nil, err - } - return obj.Addresses, nil -} - -// WalletBalance makes a request to /wallet/balance -func (c *Client) WalletBalance(id string) (*wallet.BalancePair, error) { - v := url.Values{} - v.Add("id", id) - endpoint := "/wallet/balance?" + v.Encode() - - var b wallet.BalancePair - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return &b, nil -} - -// Spend makes a request to /wallet/spend -func (c *Client) Spend(id, dst string, coins uint64, password string) (*SpendResult, error) { - v := url.Values{} - v.Add("id", id) - v.Add("dst", dst) - v.Add("coins", fmt.Sprint(coins)) - v.Add("password", password) - - var r SpendResult - endpoint := "/wallet/spend" - if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { - return nil, err - } - - return &r, nil -} - -// CreateTransactionRequest is sent to /wallet/transaction -type CreateTransactionRequest struct { - HoursSelection HoursSelection `json:"hours_selection"` - Wallet CreateTransactionRequestWallet `json:"wallet"` - ChangeAddress string `json:"change_address"` - To []Receiver `json:"to"` -} - -// CreateTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet -type CreateTransactionRequestWallet struct { - ID string `json:"id"` - Addresses []string `json:"addresses,omitempty"` - Password string `json:"password"` -} - -// HoursSelection defines options for hours distribution -type HoursSelection struct { - Type string `json:"type"` - Mode string `json:"mode"` - ShareFactor string `json:"share_factor,omitempty"` -} - -// Receiver specifies a spend destination -type Receiver struct { - Address string `json:"address"` - Coins string `json:"coins"` - Hours string `json:"hours,omitempty"` -} - -// CreateTransaction makes a request to POST /wallet/transaction -func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { - var r CreateTransactionResponse - endpoint := "/wallet/transaction" - if err := c.PostJSON(endpoint, req, &r); err != nil { - return nil, err - } - - return &r, nil -} - -// WalletTransactions makes a request to /wallet/transactions -func (c *Client) WalletTransactions(id string) (*UnconfirmedTxnsResponse, error) { - v := url.Values{} - v.Add("id", id) - endpoint := "/wallet/transactions?" + v.Encode() - - var utx *UnconfirmedTxnsResponse - if err := c.Get(endpoint, &utx); err != nil { - return nil, err - } - return utx, nil -} - -// UpdateWallet makes a request to /wallet/update -func (c *Client) UpdateWallet(id, label string) error { - v := url.Values{} - v.Add("id", id) - v.Add("label", label) - - return c.PostForm("/wallet/update", strings.NewReader(v.Encode()), nil) -} - -// WalletFolderName makes a request to /wallets/folderName -func (c *Client) WalletFolderName() (*WalletFolder, error) { - var w WalletFolder - if err := c.Get("/wallets/folderName", &w); err != nil { - return nil, err - } - return &w, nil -} - -// NewSeed makes a request to /wallet/newSeed -// entropy must be 128 or 256 -func (c *Client) NewSeed(entropy int) (string, error) { - v := url.Values{} - v.Add("entropy", fmt.Sprint(entropy)) - endpoint := "/wallet/newSeed?" + v.Encode() - - var r struct { - Seed string `json:"seed"` - } - if err := c.Get(endpoint, &r); err != nil { - return "", err - } - return r.Seed, nil -} - -// GetWalletSeed makes a request to /wallet/seed -func (c *Client) GetWalletSeed(id string, password string) (string, error) { - v := url.Values{} - v.Add("id", id) - v.Add("password", password) - - var r struct { - Seed string `json:"seed"` - } - if err := c.PostForm("/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { - return "", err - } - - return r.Seed, nil -} - -// NetworkConnection makes a request to /network/connection -func (c *Client) NetworkConnection(addr string) (*daemon.Connection, error) { - v := url.Values{} - v.Add("addr", addr) - endpoint := "/network/connection?" + v.Encode() - - var dc daemon.Connection - if err := c.Get(endpoint, &dc); err != nil { - return nil, err - } - return &dc, nil -} - -// NetworkConnections makes a request to /network/connections -func (c *Client) NetworkConnections() (*daemon.Connections, error) { - var dc daemon.Connections - if err := c.Get("/network/connections", &dc); err != nil { - return nil, err - } - return &dc, nil -} - -// NetworkDefaultConnections makes a request to /network/defaultConnections -func (c *Client) NetworkDefaultConnections() ([]string, error) { - var dc []string - if err := c.Get("/network/defaultConnections", &dc); err != nil { - return nil, err - } - return dc, nil -} - -// NetworkTrustedConnections makes a request to /network/connections/trust -func (c *Client) NetworkTrustedConnections() ([]string, error) { - var dc []string - if err := c.Get("/network/connections/trust", &dc); err != nil { - return nil, err - } - return dc, nil -} - -// NetworkExchangeableConnections makes a request to /network/connections/exchange -func (c *Client) NetworkExchangeableConnections() ([]string, error) { - var dc []string - if err := c.Get("/network/connections/exchange", &dc); err != nil { - return nil, err - } - return dc, nil -} - -// PendingTransactions makes a request to /pendingTxs -func (c *Client) PendingTransactions() ([]*visor.ReadableUnconfirmedTxn, error) { - var v []*visor.ReadableUnconfirmedTxn - if err := c.Get("/pendingTxs", &v); err != nil { - return nil, err - } - return v, nil -} - -// Transaction makes a request to /transaction -func (c *Client) Transaction(txid string) (*daemon.TransactionResult, error) { - v := url.Values{} - v.Add("txid", txid) - endpoint := "/transaction?" + v.Encode() - - var r daemon.TransactionResult - if err := c.Get(endpoint, &r); err != nil { - return nil, err - } - return &r, nil -} - -// Transactions makes a request to /transactions -func (c *Client) Transactions(addrs []string) (*[]daemon.TransactionResult, error) { - v := url.Values{} - v.Add("addrs", strings.Join(addrs, ",")) - endpoint := "/transactions?" + v.Encode() - - var r []daemon.TransactionResult - if err := c.Get(endpoint, &r); err != nil { - return nil, err - } - return &r, nil -} - -// ConfirmedTransactions makes a request to /transactions?confirmed=true -func (c *Client) ConfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { - v := url.Values{} - v.Add("addrs", strings.Join(addrs, ",")) - v.Add("confirmed", "true") - endpoint := "/transactions?" + v.Encode() - - var r []daemon.TransactionResult - if err := c.Get(endpoint, &r); err != nil { - return nil, err - } - return &r, nil -} - -// UnconfirmedTransactions makes a request to /transactions?confirmed=false -func (c *Client) UnconfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { - v := url.Values{} - v.Add("addrs", strings.Join(addrs, ",")) - v.Add("confirmed", "false") - endpoint := "/transactions?" + v.Encode() - - var r []daemon.TransactionResult - if err := c.Get(endpoint, &r); err != nil { - return nil, err - } - return &r, nil -} - -// InjectTransaction makes a request to /injectTransaction -func (c *Client) InjectTransaction(rawTx string) (string, error) { - v := struct { - Rawtx string `json:"rawtx"` - }{ - Rawtx: rawTx, - } - - var txid string - if err := c.PostJSON("/injectTransaction", v, &txid); err != nil { - return "", err - } - return txid, nil -} - -// ResendUnconfirmedTransactions makes a request to /resendUnconfirmedTxns -func (c *Client) ResendUnconfirmedTransactions() (*daemon.ResendResult, error) { - var r daemon.ResendResult - if err := c.Get("/resendUnconfirmedTxns", &r); err != nil { - return nil, err - } - return &r, nil -} - -// RawTransaction makes a request to /rawtx -func (c *Client) RawTransaction(txid string) (string, error) { - v := url.Values{} - v.Add("txid", txid) - endpoint := "/rawtx?" + v.Encode() - - var rawTx string - if err := c.Get(endpoint, &rawTx); err != nil { - return "", err - } - return rawTx, nil -} - -// AddressTransactions makes a request to /explorer/address -func (c *Client) AddressTransactions(addr string) ([]ReadableTransaction, error) { - v := url.Values{} - v.Add("address", addr) - endpoint := "/explorer/address?" + v.Encode() - - var b []ReadableTransaction - if err := c.Get(endpoint, &b); err != nil { - return nil, err - } - return b, nil -} - -// RichlistParams are arguments to the /richlist endpoint -type RichlistParams struct { - N int - IncludeDistribution bool -} - -// Richlist makes a request to /richlist -func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { - endpoint := "/richlist" - - if params != nil { - v := url.Values{} - v.Add("n", fmt.Sprint(params.N)) - v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) - endpoint = "/richlist?" + v.Encode() - } - - var r Richlist - if err := c.Get(endpoint, &r); err != nil { - return nil, err - } - return &r, nil -} - -// AddressCount makes a request to /addresscount -func (c *Client) AddressCount() (uint64, error) { - var r struct { - Count uint64 `json:"count"` - } - if err := c.Get("/addresscount", &r); err != nil { - return 0, err - } - return r.Count, nil - -} - -// UnloadWallet makes a request to /wallet/unload -func (c *Client) UnloadWallet(id string) error { - v := url.Values{} - v.Add("id", id) - return c.PostForm("/wallet/unload", strings.NewReader(v.Encode()), nil) -} - -// Health makes a request to /health -func (c *Client) Health() (*HealthResponse, error) { - var r HealthResponse - if err := c.Get("/health", &r); err != nil { - return nil, err - } - - return &r, nil -} - -// EncryptWallet encrypts specific wallet with given password -func (c *Client) EncryptWallet(id string, password string) (*WalletResponse, error) { - v := url.Values{} - v.Add("id", id) - v.Add("password", password) - var wlt WalletResponse - if err := c.PostForm("/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { - return nil, err - } - - return &wlt, nil -} - -// DecryptWallet decrypts wallet by making a request to /wallet/decrypt -func (c *Client) DecryptWallet(id string, password string) (*WalletResponse, error) { - v := url.Values{} - v.Add("id", id) - v.Add("password", password) - var wlt WalletResponse - if err := c.PostForm("/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { - return nil, err - } - - return &wlt, nil -} diff --git a/src/gui/csrf.go b/src/gui/csrf.go deleted file mode 100755 index 99ab84b..0000000 --- a/src/gui/csrf.go +++ /dev/null @@ -1,178 +0,0 @@ -package gui - -import ( - "crypto/subtle" - "encoding/base64" - "errors" - "net/http" - "net/url" - "sync" - "time" - - "github.com/skycoin/skycoin/src/cipher" - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers -) - -const ( - // CSRFHeaderName is the name of the CSRF header - CSRFHeaderName = "X-CSRF-Token" - - // CSRFMaxAge is the lifetime of a CSRF token in seconds - CSRFMaxAge = time.Second * 30 - - csrfTokenLength = 64 -) - -// CSRFToken csrf token -type CSRFToken struct { - Value []byte - ExpiresAt time.Time -} - -// newCSRFToken generates a new CSRF Token -func newCSRFToken() CSRFToken { - return CSRFToken{ - Value: cipher.RandByte(csrfTokenLength), - ExpiresAt: time.Now().Add(CSRFMaxAge), - } -} - -// String returns the token in base64 URL-safe encoded format -func (c *CSRFToken) String() string { - return base64.RawURLEncoding.EncodeToString(c.Value) -} - -// CSRFStore encapsulates a single CSRFToken -type CSRFStore struct { - token *CSRFToken - Enabled bool - sync.RWMutex -} - -// getTokenValue returns a url safe base64 encoded token -func (c *CSRFStore) getTokenValue() string { - c.RLock() - defer c.RUnlock() - return c.token.String() -} - -// setToken sets a new CSRF token -// if the value is changing the expire time should also change -// so there is no explicit method to just set the value of the token -func (c *CSRFStore) setToken(token CSRFToken) { - c.Lock() - defer c.Unlock() - c.token = &token -} - -// expired checks if token expiry time is greater than current time -func (c *CSRFStore) expired() bool { - return c.token == nil || time.Now().After(c.token.ExpiresAt) - -} - -// verifyToken checks that the given token is same as the internal token -func (c *CSRFStore) verifyToken(headerToken string) error { - c.RLock() - defer c.RUnlock() - - // check if token is initialized - if c.token == nil || len(c.token.Value) == 0 { - return errors.New("token not initialized") - } - - a, err := base64.RawURLEncoding.DecodeString(headerToken) - if err != nil { - return err - } - - // check if token values are same, using a constant time comparison - if subtle.ConstantTimeCompare(a, c.token.Value) != 1 { - return errors.New("invalid token") - } - - // make sure token is still valid - if c.expired() { - return errors.New("token has expired") - } - - return nil -} - -// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. -// URI: /csrf -// Method: GET -// Response: -// csrf_token: CSRF token to use in POST requests -func getCSRFToken(gateway Gatewayer, store *CSRFStore) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - if !store.Enabled { - logger.Warning("CSRF check disabled") - wh.Error404(w, "") - return - } - - // generate a new token - store.setToken(newCSRFToken()) - - wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": store.getTokenValue()}) - } -} - -// CSRFCheck verifies X-CSRF-Token header value -func CSRFCheck(store *CSRFStore, handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if store.Enabled { - switch r.Method { - case http.MethodPost, http.MethodPut, http.MethodDelete: - token := r.Header.Get(CSRFHeaderName) - if err := store.verifyToken(token); err != nil { - logger.Errorf("CSRF token invalid: %v", err) - wh.Error403(w, "invalid CSRF token") - return - } - } - } - - handler.ServeHTTP(w, r) - }) -} - -// OriginRefererCheck checks the Origin header if present, falling back on Referer. -// The Origin or Referer hostname must match the configured host. -// If neither are present, the request is allowed. All major browsers will set -// at least one of these values. If neither are set, assume it is a request -// from curl/wget. -func OriginRefererCheck(host string, handler http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - origin := r.Header.Get("Origin") - referer := r.Header.Get("Referer") - - toCheck := origin - if toCheck == "" { - toCheck = referer - } - - if toCheck != "" { - u, err := url.Parse(toCheck) - if err != nil { - logger.Critical().Errorf("Invalid URL in Origin or Referer header: %s %v", toCheck, err) - wh.Error403(w, "") - return - } - - if u.Host != host { - logger.Critical().Errorf("Origin or Referer header value %s does not match host", toCheck) - wh.Error403(w, "") - return - } - } - - handler.ServeHTTP(w, r) - }) -} diff --git a/src/gui/csrf_test.go b/src/gui/csrf_test.go deleted file mode 100755 index f9a4916..0000000 --- a/src/gui/csrf_test.go +++ /dev/null @@ -1,329 +0,0 @@ -package gui - -import ( - "bytes" - "encoding/json" - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -const ( - tokenValid = "token_valid" - tokenInvalid = "token_invalid" - tokenExpired = "token_expired" - tokenEmpty = "token_empty" - tokenNotGenerated = "token_not_generated" -) - -func setCSRFParameters(csrfStore *CSRFStore, tokenType string, req *http.Request) { - token := newCSRFToken() - // token check - switch tokenType { - case tokenValid: - csrfStore.setToken(token) - req.Header.Set("X-CSRF-Token", token.String()) - case tokenInvalid: - // set invalid token value - csrfStore.setToken(token) - req.Header.Set("X-CSRF-Token", "xcasadsadsa") - case tokenExpired: - csrfStore.setToken(token) - csrfStore.token.ExpiresAt = time.Unix(1517509381, 10) - req.Header.Set("X-CSRF-Token", token.String()) - // set some old unix time - case tokenEmpty: - // set empty token - csrfStore.setToken(token) - req.Header.Set("X-CSRF-Token", "") - case tokenNotGenerated: - // don't set token - csrfStore.token = nil - req.Header.Set("X-CSRF-Token", token.String()) - } -} - -var endpoints = []string{ - "/address_uxouts", - "/addresscount", - "/balance", - "/block", - "/blockchain/metadata", - "/blockchain/progress", - "/blocks", - "/coinSupply", - "/explorer/address", - "/health", - "/injectTransaction", - "/last_blocks", - "/version", - "/network/connection", - "/network/connections", - "/network/connections/exchange", - "/network/connections/trust", - "/network/defaultConnections", - "/outputs", - "/pendingTxs", - "/rawtx", - "/richlist", - "/resendUnconfirmedTxns", - "/transaction", - "/transactions", - "/uxout", - "/wallet", - "/wallet/balance", - "/wallet/create", - "/wallet/newAddress", - "/wallet/newSeed", - "/wallet/seed", - "/wallet/spend", - "/wallet/transaction", - "/wallet/transactions", - "/wallet/unload", - "/wallet/update", - "/wallets", - "/wallets/folderName", - "/webrpc", -} - -func TestCSRFWrapper(t *testing.T) { - methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} - cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenNotGenerated} - - for _, endpoint := range endpoints { - for _, method := range methods { - for _, c := range cases { - name := fmt.Sprintf("%s %s %s", method, endpoint, c) - t.Run(name, func(t *testing.T) { - gateway := &GatewayerMock{} - - req, err := http.NewRequest(method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, c, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{ - host: configuredHost, - appLoc: ".", - enableJSON20RPC: true, - }, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) - require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) - }) - } - } - } -} - -func TestOriginRefererCheck(t *testing.T) { - cases := []struct { - name string - origin string - referer string - }{ - { - name: "mismatched origin header", - origin: "http://example.com/", - }, - { - name: "mismatched referer header", - referer: "http://example.com/", - }, - } - - for _, endpoint := range endpoints { - for _, tc := range cases { - name := fmt.Sprintf("%s %s", tc.name, endpoint) - t.Run(name, func(t *testing.T) { - gateway := &GatewayerMock{} - - req, err := http.NewRequest(http.MethodGet, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - if tc.origin != "" { - req.Header.Set("Origin", tc.origin) - } - if tc.referer != "" { - req.Header.Set("Referer", tc.referer) - } - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{ - host: configuredHost, - appLoc: ".", - enableJSON20RPC: true, - }, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) - require.Equal(t, "403 Forbidden\n", rr.Body.String()) - }) - } - } -} - -func TestHostCheck(t *testing.T) { - for _, endpoint := range endpoints { - t.Run(endpoint, func(t *testing.T) { - gateway := &GatewayerMock{} - - req, err := http.NewRequest(http.MethodGet, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - req.Host = "example.com" - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{ - host: configuredHost, - appLoc: ".", - enableJSON20RPC: true, - }, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) - require.Equal(t, "403 Forbidden\n", rr.Body.String()) - }) - } -} - -func TestCSRF(t *testing.T) { - csrfStore := &CSRFStore{ - Enabled: true, - } - - updateWalletLabel := func(csrfToken string) *httptest.ResponseRecorder { - gateway := &GatewayerMock{} - gateway.On("UpdateWalletLabel", "fooid", "foolabel").Return(nil) - - endpoint := "/wallet/update" - - v := url.Values{} - v.Add("id", "fooid") - v.Add("label", "foolabel") - - req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - if csrfToken != "" { - req.Header.Set("X-CSRF-Token", csrfToken) - } - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{ - host: configuredHost, - appLoc: ".", - enableJSON20RPC: true, - }, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - return rr - } - - // First request to POST /wallet/update is rejected because of missing CSRF - rr := updateWalletLabel("") - require.Equal(t, http.StatusForbidden, rr.Code) - require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) - - // Make a request to /csrf to get a token - gateway := &GatewayerMock{} - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - // non-GET request to /csrf is invalid - req, err := http.NewRequest(http.MethodPost, "/csrf", nil) - require.NoError(t, err) - - rr = httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - require.Equal(t, http.StatusMethodNotAllowed, rr.Code) - require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") - - // CSRF disabled 404s - csrfStore.Enabled = false - - req, err = http.NewRequest(http.MethodGet, "/csrf", nil) - require.NoError(t, err) - - rr = httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - require.Equal(t, http.StatusNotFound, rr.Code) - require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") - - csrfStore.Enabled = true - - // Request a CSRF token, use it in a request - req, err = http.NewRequest(http.MethodGet, "/csrf", nil) - require.NoError(t, err) - - rr = httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - require.Equal(t, http.StatusOK, rr.Code) - - var msg map[string]string - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - - token := msg["csrf_token"] - require.NotEmpty(t, token) - - req, err = http.NewRequest(http.MethodPost, "/version", nil) - require.NoError(t, err) - - rr = httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - // Make a request to POST /wallet/update again, using the CSRF token - rr = updateWalletLabel(token) - require.Equal(t, http.StatusOK, rr.Code) - - // Make another call to /csrf, this will invalidate the first token - // Request a CSRF token, use it in a request - req, err = http.NewRequest(http.MethodGet, "/csrf", nil) - require.NoError(t, err) - - rr = httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - require.Equal(t, http.StatusOK, rr.Code) - - var msg2 map[string]string - err = json.Unmarshal(rr.Body.Bytes(), &msg2) - require.NoError(t, err) - require.NotEmpty(t, msg2["csrf_token"]) - require.NotEqual(t, msg["csrf_token"], msg2["csrf_token"]) - - rr = updateWalletLabel(token) - require.Equal(t, http.StatusForbidden, rr.Code) - require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) -} diff --git a/src/gui/explorer.go b/src/gui/explorer.go deleted file mode 100755 index dd5a9fc..0000000 --- a/src/gui/explorer.go +++ /dev/null @@ -1,319 +0,0 @@ -package gui - -import ( - "fmt" - "net/http" - "strconv" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/util/droplet" - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers - "github.com/skycoin/skycoin/src/visor" -) - -// CoinSupply records the coin supply info -type CoinSupply struct { - // Coins distributed beyond the project: - CurrentSupply string `json:"current_supply"` - // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable - TotalSupply string `json:"total_supply"` - // MaxSupply is the maximum number of coins to be distributed ever - MaxSupply string `json:"max_supply"` - // CurrentCoinHourSupply is coins hours in non distribution addresses - CurrentCoinHourSupply string `json:"current_coinhour_supply"` - // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses - TotalCoinHourSupply string `json:"total_coinhour_supply"` - // Distribution addresses which count towards total supply - UnlockedAddresses []string `json:"unlocked_distribution_addresses"` - // Distribution addresses which are locked and do not count towards total supply - LockedAddresses []string `json:"locked_distribution_addresses"` -} - -func getCoinSupply(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - supply := coinSupply(gateway, w, r) - if supply != nil { - wh.SendJSONOr500(logger, w, supply) - } - } -} - -func coinSupply(gateway Gatewayer, w http.ResponseWriter, r *http.Request) *CoinSupply { - if r.Method != http.MethodGet { - wh.Error405(w) - return nil - } - - allUnspents, err := gateway.GetUnspentOutputs() - if err != nil { - err = fmt.Errorf("gateway.GetUnspentOutputs failed: %v", err) - wh.Error500(w, err.Error()) - return nil - } - - unlockedAddrs := visor.GetUnlockedDistributionAddresses() - // Search map of unlocked addresses - // used to filter unspents - unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) - - var unlockedSupply uint64 - // check confirmed unspents only - for _, u := range allUnspents.HeadOutputs { - // check if address is an unlocked distribution address - if _, ok := unlockedAddrMap[u.Address]; ok { - coins, err := droplet.FromString(u.Coins) - if err != nil { - err = fmt.Errorf("Invalid unlocked output balance string %s: %v", u.Coins, err) - wh.Error500(w, err.Error()) - return nil - } - unlockedSupply += coins - } - } - - // "total supply" is the number of coins unlocked. - // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. - totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance - totalSupply *= droplet.Multiplier - - // "current supply" is the number of coins distributed from the unlocked pool - currentSupply := totalSupply - unlockedSupply - - currentSupplyStr, err := droplet.ToString(currentSupply) - if err != nil { - err = fmt.Errorf("Failed to convert coins to string: %v", err) - wh.Error500(w, err.Error()) - return nil - } - - totalSupplyStr, err := droplet.ToString(totalSupply) - if err != nil { - err = fmt.Errorf("Failed to convert coins to string: %v", err) - wh.Error500(w, err.Error()) - return nil - } - - maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) - if err != nil { - err = fmt.Errorf("Failed to convert coins to string: %v", err) - wh.Error500(w, err.Error()) - return nil - } - - // locked distribution addresses - lockedAddrs := visor.GetLockedDistributionAddresses() - lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) - - // get total coins hours which excludes locked distribution addresses - var totalCoinHours uint64 - for _, out := range allUnspents.HeadOutputs { - if _, ok := lockedAddrMap[out.Address]; !ok { - totalCoinHours += out.CalculatedHours - } - } - - // get current coin hours which excludes all distribution addresses - var currentCoinHours uint64 - for _, out := range allUnspents.HeadOutputs { - // check if address not in locked distribution addresses - if _, ok := lockedAddrMap[out.Address]; !ok { - // check if address not in unlocked distribution addresses - if _, ok := unlockedAddrMap[out.Address]; !ok { - currentCoinHours += out.CalculatedHours - } - } - } - - if err != nil { - err = fmt.Errorf("Failed to get total coinhours: %v", err) - wh.Error500(w, err.Error()) - return nil - } - - cs := CoinSupply{ - CurrentSupply: currentSupplyStr, - TotalSupply: totalSupplyStr, - MaxSupply: maxSupplyStr, - CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), - TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), - UnlockedAddresses: unlockedAddrs, - LockedAddresses: visor.GetLockedDistributionAddresses(), - } - - return &cs -} - -// method: GET -// url: /explorer/address?address=${address} -func getTransactionsForAddress(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - addr := r.FormValue("address") - if addr == "" { - wh.Error400(w, "address is empty") - return - } - - cipherAddr, err := cipher.DecodeBase58Address(addr) - if err != nil { - wh.Error400(w, "invalid address") - return - } - - txns, err := gateway.GetAddressTxns(cipherAddr) - if err != nil { - err = fmt.Errorf("gateway.GetAddressTxns failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - resTxs := make([]ReadableTransaction, 0, len(txns.Txns)) - - for _, tx := range txns.Txns { - in := make([]visor.ReadableTransactionInput, len(tx.Transaction.In)) - for i := range tx.Transaction.In { - id, err := cipher.SHA256FromHex(tx.Transaction.In[i]) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - uxout, err := gateway.GetUxOutByID(id) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - if uxout == nil { - err := fmt.Errorf("uxout of %v does not exist in history db", id.Hex()) - wh.Error500(w, err.Error()) - return - } - - tIn, err := visor.NewReadableTransactionInput(tx.Transaction.In[i], uxout.Out.Body.Address.String(), uxout.Out.Body.Coins, uxout.Out.Body.Hours) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - in[i] = *tIn - } - - rTx := NewReadableTransaction(tx, in) - - resTxs = append(resTxs, rTx) - } - - wh.SendJSONOr500(logger, w, &resTxs) - } -} - -// Richlist is the API response for /richlist, contains top address balances -type Richlist struct { - Richlist visor.Richlist `json:"richlist"` -} - -// method: GET -// url: /richlist?n=${number}&include-distribution=${bool} -func getRichlist(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - var topn int - topnStr := r.FormValue("n") - if topnStr == "" { - topn = 20 - } else { - var err error - topn, err = strconv.Atoi(topnStr) - if err != nil { - wh.Error400(w, "invalid n") - return - } - } - - var includeDistribution bool - includeDistributionStr := r.FormValue("include-distribution") - if includeDistributionStr == "" { - includeDistribution = false - } else { - var err error - includeDistribution, err = strconv.ParseBool(includeDistributionStr) - if err != nil { - wh.Error400(w, "invalid include-distribution") - return - } - } - - richlist, err := gateway.GetRichlist(includeDistribution) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - if topn > 0 && topn < len(richlist) { - richlist = richlist[:topn] - } - - wh.SendJSONOr500(logger, w, Richlist{ - Richlist: richlist, - }) - } -} - -// method: GET -// url: /addresscount -func getAddressCount(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - addrCount, err := gateway.GetAddressCount() - if err != nil { - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) - } -} - -// ReadableTransaction represents readable address transaction -type ReadableTransaction struct { - Status visor.TransactionStatus `json:"status"` - Length uint32 `json:"length"` - Type uint8 `json:"type"` - Hash string `json:"txid"` - InnerHash string `json:"inner_hash"` - Timestamp uint64 `json:"timestamp,omitempty"` - - Sigs []string `json:"sigs"` - In []visor.ReadableTransactionInput `json:"inputs"` - Out []visor.ReadableTransactionOutput `json:"outputs"` -} - -// NewReadableTransaction creates readable address transaction -func NewReadableTransaction(t daemon.TransactionResult, inputs []visor.ReadableTransactionInput) ReadableTransaction { - return ReadableTransaction{ - Status: t.Status, - Length: t.Transaction.Length, - Type: t.Transaction.Type, - Hash: t.Transaction.Hash, - InnerHash: t.Transaction.InnerHash, - Timestamp: t.Time, - - Sigs: t.Transaction.Sigs, - In: inputs, - Out: t.Transaction.Out, - } -} diff --git a/src/gui/explorer_test.go b/src/gui/explorer_test.go deleted file mode 100755 index 11eea6e..0000000 --- a/src/gui/explorer_test.go +++ /dev/null @@ -1,699 +0,0 @@ -package gui - -import ( - "errors" - "net/http" - "testing" - - "encoding/json" - "net/http/httptest" - "net/url" - "strings" - - "github.com/stretchr/testify/require" - - "github.com/stretchr/testify/mock" - - "strconv" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/droplet" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/visor/historydb" -) - -func makeSuccessCoinSupplyResult(t *testing.T, allUnspents visor.ReadableOutputSet) *CoinSupply { - unlockedAddrs := visor.GetUnlockedDistributionAddresses() - var unlockedSupply uint64 - // check confirmed unspents only - // Search map of unlocked addresses - // used to filter unspents - unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) - for _, u := range allUnspents.HeadOutputs { - // check if address is an unlocked distribution address - if _, ok := unlockedAddrMap[u.Address]; ok { - coins, err := droplet.FromString(u.Coins) - require.NoError(t, err) - unlockedSupply += coins - } - } - // "total supply" is the number of coins unlocked. - // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. - totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance - totalSupply *= droplet.Multiplier - - // "current supply" is the number of coins distribution from the unlocked pool - currentSupply := totalSupply - unlockedSupply - - currentSupplyStr, err := droplet.ToString(currentSupply) - require.NoError(t, err) - - totalSupplyStr, err := droplet.ToString(totalSupply) - require.NoError(t, err) - - maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) - require.NoError(t, err) - - // locked distribution addresses - lockedAddrs := visor.GetLockedDistributionAddresses() - lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) - - // get total coins hours which excludes locked distribution addresses - var totalCoinHours uint64 - for _, out := range allUnspents.HeadOutputs { - if _, ok := lockedAddrMap[out.Address]; !ok { - totalCoinHours += out.Hours - } - } - - // get current coin hours which excludes all distribution addresses - var currentCoinHours uint64 - for _, out := range allUnspents.HeadOutputs { - // check if address not in locked distribution addresses - if _, ok := lockedAddrMap[out.Address]; !ok { - // check if address not in unlocked distribution addresses - if _, ok := unlockedAddrMap[out.Address]; !ok { - currentCoinHours += out.Hours - } - } - } - - cs := CoinSupply{ - CurrentSupply: currentSupplyStr, - TotalSupply: totalSupplyStr, - MaxSupply: maxSupplyStr, - CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), - TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), - UnlockedAddresses: unlockedAddrs, - LockedAddresses: visor.GetLockedDistributionAddresses(), - } - return &cs -} - -func TestGetTransactionsForAddress(t *testing.T) { - address := testutil.MakeAddress() - successAddress := "111111111111111111111691FSP" - invalidHash := "cafcb" - validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" - tt := []struct { - name string - method string - status int - err string - addressParam string - gatewayGetAddressTxnsResult *daemon.TransactionResults - gatewayGetAddressTxnsErr error - gatewayGetUxOutByIDArg cipher.SHA256 - gatewayGetUxOutByIDResult *historydb.UxOut - gatewayGetUxOutByIDErr error - result []ReadableTransaction - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - addressParam: "0", - }, - { - name: "400 - address is empty", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - address is empty", - addressParam: "", - }, - { - name: "400 - invalid address", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid address", - addressParam: "badAddress", - }, - { - name: "500 - gw GetAddressTxns error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetAddressTxns failed: gatewayGetAddressTxnsErr", - addressParam: address.String(), - gatewayGetAddressTxnsErr: errors.New("gatewayGetAddressTxnsErr"), - }, - { - name: "500 - cipher.SHA256FromHex(tx.Transaction.In) error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - encoding/hex: odd length hex string", - addressParam: address.String(), - gatewayGetAddressTxnsResult: &daemon.TransactionResults{ - Txns: []daemon.TransactionResult{ - { - Transaction: visor.ReadableTransaction{ - In: []string{ - invalidHash, - }, - }, - }, - }, - }, - }, - { - name: "500 - GetUxOutByID error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gatewayGetUxOutByIDErr", - addressParam: address.String(), - gatewayGetAddressTxnsResult: &daemon.TransactionResults{ - Txns: []daemon.TransactionResult{ - { - Transaction: visor.ReadableTransaction{ - In: []string{ - validHash, - }, - }, - }, - }, - }, - gatewayGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - gatewayGetUxOutByIDErr: errors.New("gatewayGetUxOutByIDErr"), - }, - { - name: "500 - GetUxOutByID nil result", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - uxout of 79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b does not exist in history db", - addressParam: address.String(), - gatewayGetAddressTxnsResult: &daemon.TransactionResults{ - Txns: []daemon.TransactionResult{ - { - Transaction: visor.ReadableTransaction{ - In: []string{ - validHash, - }, - }, - }, - }, - }, - gatewayGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - addressParam: address.String(), - gatewayGetAddressTxnsResult: &daemon.TransactionResults{ - Txns: []daemon.TransactionResult{ - { - Transaction: visor.ReadableTransaction{ - In: []string{ - validHash, - }, - }, - }, - }, - }, - gatewayGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - gatewayGetUxOutByIDResult: &historydb.UxOut{}, - result: []ReadableTransaction{ - { - In: []visor.ReadableTransactionInput{ - { - Hash: validHash, - Address: successAddress, - Coins: "0.000000", - Hours: 0, - }, - }, - }, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/explorer/address" - gateway := NewGatewayerMock() - gateway.On("GetAddressTxns", address).Return(tc.gatewayGetAddressTxnsResult, tc.gatewayGetAddressTxnsErr) - gateway.On("GetUxOutByID", tc.gatewayGetUxOutByIDArg).Return(tc.gatewayGetUxOutByIDResult, tc.gatewayGetUxOutByIDErr) - - v := url.Values{} - if tc.addressParam != "" { - v.Add("address", tc.addressParam) - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - rr := httptest.NewRecorder() - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []ReadableTransaction - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestCoinSupply(t *testing.T) { - unlockedAddrs := visor.GetUnlockedDistributionAddresses() - successGatewayGetUnspentOutputsResult := visor.ReadableOutputSet{ - HeadOutputs: visor.ReadableOutputs{ - visor.ReadableOutput{ - Coins: "0", - }, - visor.ReadableOutput{ - Coins: "0", - }, - }, - } - var filterInUnlocked []daemon.OutputsFilter - filterInUnlocked = append(filterInUnlocked, daemon.FbyAddresses(unlockedAddrs)) - tt := []struct { - name string - method string - status int - err string - gatewayGetUnspentOutputsArg []daemon.OutputsFilter - gatewayGetUnspentOutputsResult *visor.ReadableOutputSet - gatewayGetUnspentOutputsErr error - result *CoinSupply - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "500 - gatewayGetUnspentOutputsErr", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", - gatewayGetUnspentOutputsArg: filterInUnlocked, - gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), - }, - { - name: "500 - gatewayGetUnspentOutputsErr", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", - gatewayGetUnspentOutputsArg: filterInUnlocked, - gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), - }, - { - name: "500 - too large HeadOutputs item", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - Invalid unlocked output balance string 9223372036854775807: Droplet string conversion failed: Value is too large", - gatewayGetUnspentOutputsArg: filterInUnlocked, - gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ - HeadOutputs: visor.ReadableOutputs{ - visor.ReadableOutput{ - Coins: "9223372036854775807", - Address: unlockedAddrs[0], - }, - visor.ReadableOutput{ - Coins: "1", - }, - }, - }, - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - - gatewayGetUnspentOutputsArg: filterInUnlocked, - gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ - HeadOutputs: visor.ReadableOutputs{ - visor.ReadableOutput{ - Coins: "0", - }, - visor.ReadableOutput{ - Coins: "0", - }, - }, - }, - result: makeSuccessCoinSupplyResult(t, successGatewayGetUnspentOutputsResult), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/coinSupply" - gateway := NewGatewayerMock() - gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.gatewayGetUnspentOutputsResult, tc.gatewayGetUnspentOutputsErr) - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *CoinSupply - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestGetRichlist(t *testing.T) { - type httpParams struct { - topn string - includeDistribution string - } - tt := []struct { - name string - method string - status int - err string - httpParams *httpParams - includeDistribution bool - gatewayGetRichlistResult visor.Richlist - gatewayGetRichlistErr error - result Richlist - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - bad topn param", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid n", - httpParams: &httpParams{ - topn: "bad topn", - }, - }, - { - name: "400 - include-distribution", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid include-distribution", - httpParams: &httpParams{ - topn: "1", - includeDistribution: "bad include-distribution", - }, - }, - { - name: "500 - gw GetRichlist error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gatewayGetRichlistErr", - httpParams: &httpParams{ - topn: "1", - includeDistribution: "false", - }, - gatewayGetRichlistErr: errors.New("gatewayGetRichlistErr"), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - httpParams: &httpParams{ - topn: "3", - includeDistribution: "false", - }, - gatewayGetRichlistResult: visor.Richlist{ - { - Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - Coins: "1000000.000000", - Locked: false, - }, - { - Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", - Coins: "244458.000000", - Locked: false, - }, - { - Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", - Coins: "195503.000000", - Locked: false, - }, - }, - result: Richlist{ - Richlist: visor.Richlist{ - { - Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - Coins: "1000000.000000", - Locked: false, - }, - { - Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", - Coins: "500000.000000", - Locked: false, - }, - }, - }, - }, - { - name: "200 no limit", - method: http.MethodGet, - status: http.StatusOK, - httpParams: &httpParams{ - topn: "0", - includeDistribution: "false", - }, - gatewayGetRichlistResult: visor.Richlist{ - { - Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - Coins: "1000000.000000", - Locked: false, - }, - { - Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", - Coins: "244458.000000", - Locked: false, - }, - { - Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", - Coins: "195503.000000", - Locked: false, - }, - }, - result: Richlist{ - Richlist: visor.Richlist{ - { - Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - Coins: "1000000.000000", - Locked: false, - }, - { - Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", - Coins: "500000.000000", - Locked: false, - }, - { - Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", - Coins: "244458.000000", - Locked: false, - }, - { - Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", - Coins: "195503.000000", - Locked: false, - }, - }, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/richlist" - gateway := NewGatewayerMock() - gateway.On("GetRichlist", tc.includeDistribution).Return(tc.gatewayGetRichlistResult, tc.gatewayGetRichlistErr) - - v := url.Values{} - if tc.httpParams != nil { - if tc.httpParams.topn != "" { - v.Add("n", tc.httpParams.topn) - } - if tc.httpParams.includeDistribution != "" { - v.Add("include-distribution", tc.httpParams.includeDistribution) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg Richlist - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestGetAddressCount(t *testing.T) { - type Result struct { - Count uint64 - } - tt := []struct { - name string - method string - status int - err string - gatewayGetAddressCountResult uint64 - gatewayGetAddressCountErr error - result Result - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "500 - gw GetAddressCount error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gatewayGetAddressCountErr", - gatewayGetAddressCountErr: errors.New("gatewayGetAddressCountErr"), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - gatewayGetAddressCountResult: 1, - result: Result{ - Count: 1, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/addresscount" - gateway := NewGatewayerMock() - gateway.On("GetAddressCount").Return(tc.gatewayGetAddressCountResult, tc.gatewayGetAddressCountErr) - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg Result - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} diff --git a/src/gui/gateway.go b/src/gui/gateway.go deleted file mode 100755 index e225eb9..0000000 --- a/src/gui/gateway.go +++ /dev/null @@ -1,57 +0,0 @@ -package gui - -import ( - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/visor/historydb" - "github.com/skycoin/skycoin/src/wallet" -) - -//go:generate go install -//go:generate goautomock -template=testify Gatewayer - -// Gatewayer interface for Gateway methods -type Gatewayer interface { - Spend(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) - CreateTransaction(w wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) - GetWalletBalance(wltID string) (wallet.BalancePair, error) - GetWallet(wltID string) (*wallet.Wallet, error) - GetWallets() (wallet.Wallets, error) - UpdateWalletLabel(wltID, label string) error - GetWalletUnconfirmedTxns(wltID string) ([]visor.UnconfirmedTxn, error) - CreateWallet(wltName string, options wallet.Options) (*wallet.Wallet, error) - NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) - GetWalletDir() (string, error) - IsWalletAPIEnabled() bool - EncryptWallet(wltID string, password []byte) (*wallet.Wallet, error) - DecryptWallet(wltID string, password []byte) (*wallet.Wallet, error) - GetWalletSeed(wltID string, password []byte) (string, error) - GetBlockByHash(hash cipher.SHA256) (block coin.SignedBlock, ok bool) - GetBlockBySeq(seq uint64) (block coin.SignedBlock, ok bool) - GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) - GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) - GetBuildInfo() visor.BuildInfo - GetUnspentOutputs(filters ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) - GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) - GetBlockchainMetadata() (*visor.BlockchainMetadata, error) - GetBlockchainProgress() *daemon.BlockchainProgress - GetConnection(addr string) *daemon.Connection - GetConnections() *daemon.Connections - GetDefaultConnections() []string - GetTrustConnections() []string - GetExchgConnection() []string - GetAllUnconfirmedTxns() []visor.UnconfirmedTxn - GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) - GetTransactions(flts ...visor.TxFilter) ([]visor.Transaction, error) - InjectBroadcastTransaction(txn coin.Transaction) error - ResendUnconfirmedTxns() *daemon.ResendResult - GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) - GetAddrUxOuts(addr []cipher.Address) ([]*historydb.UxOut, error) - GetAddressTxns(a cipher.Address) (*daemon.TransactionResults, error) - GetRichlist(includeDistribution bool) (visor.Richlist, error) - GetAddressCount() (uint64, error) - GetHealth() (*daemon.Health, error) - UnloadWallet(id string) error -} diff --git a/src/gui/gatewayer_mock_test.go b/src/gui/gatewayer_mock_test.go deleted file mode 100755 index f4a0c2a..0000000 --- a/src/gui/gatewayer_mock_test.go +++ /dev/null @@ -1,1000 +0,0 @@ -/* -* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock -* THIS FILE MUST NEVER BE EDITED MANUALLY - */ - -package gui - -import ( - "fmt" - - mock "github.com/stretchr/testify/mock" - - cipher "github.com/skycoin/skycoin/src/cipher" - coin "github.com/skycoin/skycoin/src/coin" - daemon "github.com/skycoin/skycoin/src/daemon" - visor "github.com/skycoin/skycoin/src/visor" - historydb "github.com/skycoin/skycoin/src/visor/historydb" - wallet "github.com/skycoin/skycoin/src/wallet" -) - -// GatewayerMock mock -type GatewayerMock struct { - mock.Mock -} - -func NewGatewayerMock() *GatewayerMock { - return &GatewayerMock{} -} - -// CreateTransaction mocked method -func (m *GatewayerMock) CreateTransaction(p0 wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { - - ret := m.Called(p0) - - var r0 *coin.Transaction - switch res := ret.Get(0).(type) { - case nil: - case *coin.Transaction: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 []wallet.UxBalance - switch res := ret.Get(1).(type) { - case nil: - case []wallet.UxBalance: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r2 error - switch res := ret.Get(2).(type) { - case nil: - case error: - r2 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1, r2 - -} - -// CreateWallet mocked method -func (m *GatewayerMock) CreateWallet(p0 string, p1 wallet.Options) (*wallet.Wallet, error) { - - ret := m.Called(p0, p1) - - var r0 *wallet.Wallet - switch res := ret.Get(0).(type) { - case nil: - case *wallet.Wallet: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// DecryptWallet mocked method -func (m *GatewayerMock) DecryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { - - ret := m.Called(p0, p1) - - var r0 *wallet.Wallet - switch res := ret.Get(0).(type) { - case nil: - case *wallet.Wallet: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// EncryptWallet mocked method -func (m *GatewayerMock) EncryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { - - ret := m.Called(p0, p1) - - var r0 *wallet.Wallet - switch res := ret.Get(0).(type) { - case nil: - case *wallet.Wallet: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetAddrUxOuts mocked method -func (m *GatewayerMock) GetAddrUxOuts(p0 []cipher.Address) ([]*historydb.UxOut, error) { - - ret := m.Called(p0) - - var r0 []*historydb.UxOut - switch res := ret.Get(0).(type) { - case nil: - case []*historydb.UxOut: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetAddressCount mocked method -func (m *GatewayerMock) GetAddressCount() (uint64, error) { - - ret := m.Called() - - var r0 uint64 - switch res := ret.Get(0).(type) { - case nil: - case uint64: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetAddressTxns mocked method -func (m *GatewayerMock) GetAddressTxns(p0 cipher.Address) (*daemon.TransactionResults, error) { - - ret := m.Called(p0) - - var r0 *daemon.TransactionResults - switch res := ret.Get(0).(type) { - case nil: - case *daemon.TransactionResults: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetAllUnconfirmedTxns mocked method -func (m *GatewayerMock) GetAllUnconfirmedTxns() []visor.UnconfirmedTxn { - - ret := m.Called() - - var r0 []visor.UnconfirmedTxn - switch res := ret.Get(0).(type) { - case nil: - case []visor.UnconfirmedTxn: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetBalanceOfAddrs mocked method -func (m *GatewayerMock) GetBalanceOfAddrs(p0 []cipher.Address) ([]wallet.BalancePair, error) { - - ret := m.Called(p0) - - var r0 []wallet.BalancePair - switch res := ret.Get(0).(type) { - case nil: - case []wallet.BalancePair: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetBlockByHash mocked method -func (m *GatewayerMock) GetBlockByHash(p0 cipher.SHA256) (coin.SignedBlock, bool) { - - ret := m.Called(p0) - - var r0 coin.SignedBlock - switch res := ret.Get(0).(type) { - case nil: - case coin.SignedBlock: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 bool - switch res := ret.Get(1).(type) { - case nil: - case bool: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetBlockBySeq mocked method -func (m *GatewayerMock) GetBlockBySeq(p0 uint64) (coin.SignedBlock, bool) { - - ret := m.Called(p0) - - var r0 coin.SignedBlock - switch res := ret.Get(0).(type) { - case nil: - case coin.SignedBlock: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 bool - switch res := ret.Get(1).(type) { - case nil: - case bool: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetBlockchainMetadata mocked method -func (m *GatewayerMock) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { - - ret := m.Called() - - var r0 *visor.BlockchainMetadata - switch res := ret.Get(0).(type) { - case nil: - case *visor.BlockchainMetadata: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetBlockchainProgress mocked method -func (m *GatewayerMock) GetBlockchainProgress() *daemon.BlockchainProgress { - - ret := m.Called() - - var r0 *daemon.BlockchainProgress - switch res := ret.Get(0).(type) { - case nil: - case *daemon.BlockchainProgress: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetBlocks mocked method -func (m *GatewayerMock) GetBlocks(p0 uint64, p1 uint64) (*visor.ReadableBlocks, error) { - - ret := m.Called(p0, p1) - - var r0 *visor.ReadableBlocks - switch res := ret.Get(0).(type) { - case nil: - case *visor.ReadableBlocks: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetBuildInfo mocked method -func (m *GatewayerMock) GetBuildInfo() visor.BuildInfo { - - ret := m.Called() - - var r0 visor.BuildInfo - switch res := ret.Get(0).(type) { - case nil: - case visor.BuildInfo: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetConnection mocked method -func (m *GatewayerMock) GetConnection(p0 string) *daemon.Connection { - - ret := m.Called(p0) - - var r0 *daemon.Connection - switch res := ret.Get(0).(type) { - case nil: - case *daemon.Connection: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetConnections mocked method -func (m *GatewayerMock) GetConnections() *daemon.Connections { - - ret := m.Called() - - var r0 *daemon.Connections - switch res := ret.Get(0).(type) { - case nil: - case *daemon.Connections: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetDefaultConnections mocked method -func (m *GatewayerMock) GetDefaultConnections() []string { - - ret := m.Called() - - var r0 []string - switch res := ret.Get(0).(type) { - case nil: - case []string: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetExchgConnection mocked method -func (m *GatewayerMock) GetExchgConnection() []string { - - ret := m.Called() - - var r0 []string - switch res := ret.Get(0).(type) { - case nil: - case []string: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetHealth mocked method -func (m *GatewayerMock) GetHealth() (*daemon.Health, error) { - - ret := m.Called() - - var r0 *daemon.Health - switch res := ret.Get(0).(type) { - case nil: - case *daemon.Health: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetLastBlocks mocked method -func (m *GatewayerMock) GetLastBlocks(p0 uint64) (*visor.ReadableBlocks, error) { - - ret := m.Called(p0) - - var r0 *visor.ReadableBlocks - switch res := ret.Get(0).(type) { - case nil: - case *visor.ReadableBlocks: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetRichlist mocked method -func (m *GatewayerMock) GetRichlist(p0 bool) (visor.Richlist, error) { - - ret := m.Called(p0) - - var r0 visor.Richlist - switch res := ret.Get(0).(type) { - case nil: - case visor.Richlist: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetTransaction mocked method -func (m *GatewayerMock) GetTransaction(p0 cipher.SHA256) (*visor.Transaction, error) { - - ret := m.Called(p0) - - var r0 *visor.Transaction - switch res := ret.Get(0).(type) { - case nil: - case *visor.Transaction: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetTransactions mocked method -func (m *GatewayerMock) GetTransactions(p0 ...visor.TxFilter) ([]visor.Transaction, error) { - - ret := m.Called(p0) - - var r0 []visor.Transaction - switch res := ret.Get(0).(type) { - case nil: - case []visor.Transaction: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetTrustConnections mocked method -func (m *GatewayerMock) GetTrustConnections() []string { - - ret := m.Called() - - var r0 []string - switch res := ret.Get(0).(type) { - case nil: - case []string: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// GetUnspentOutputs mocked method -func (m *GatewayerMock) GetUnspentOutputs(p0 ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) { - - ret := m.Called(p0) - - var r0 *visor.ReadableOutputSet - switch res := ret.Get(0).(type) { - case nil: - case *visor.ReadableOutputSet: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetUxOutByID mocked method -func (m *GatewayerMock) GetUxOutByID(p0 cipher.SHA256) (*historydb.UxOut, error) { - - ret := m.Called(p0) - - var r0 *historydb.UxOut - switch res := ret.Get(0).(type) { - case nil: - case *historydb.UxOut: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWallet mocked method -func (m *GatewayerMock) GetWallet(p0 string) (*wallet.Wallet, error) { - - ret := m.Called(p0) - - var r0 *wallet.Wallet - switch res := ret.Get(0).(type) { - case nil: - case *wallet.Wallet: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWalletBalance mocked method -func (m *GatewayerMock) GetWalletBalance(p0 string) (wallet.BalancePair, error) { - - ret := m.Called(p0) - - var r0 wallet.BalancePair - switch res := ret.Get(0).(type) { - case nil: - case wallet.BalancePair: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWalletDir mocked method -func (m *GatewayerMock) GetWalletDir() (string, error) { - - ret := m.Called() - - var r0 string - switch res := ret.Get(0).(type) { - case nil: - case string: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWalletSeed mocked method -func (m *GatewayerMock) GetWalletSeed(p0 string, p1 []byte) (string, error) { - - ret := m.Called(p0, p1) - - var r0 string - switch res := ret.Get(0).(type) { - case nil: - case string: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWalletUnconfirmedTxns mocked method -func (m *GatewayerMock) GetWalletUnconfirmedTxns(p0 string) ([]visor.UnconfirmedTxn, error) { - - ret := m.Called(p0) - - var r0 []visor.UnconfirmedTxn - switch res := ret.Get(0).(type) { - case nil: - case []visor.UnconfirmedTxn: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// GetWallets mocked method -func (m *GatewayerMock) GetWallets() (wallet.Wallets, error) { - - ret := m.Called() - - var r0 wallet.Wallets - switch res := ret.Get(0).(type) { - case nil: - case wallet.Wallets: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// InjectBroadcastTransaction mocked method -func (m *GatewayerMock) InjectBroadcastTransaction(p0 coin.Transaction) error { - - ret := m.Called(p0) - - var r0 error - switch res := ret.Get(0).(type) { - case nil: - case error: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// IsWalletAPIEnabled mocked method -func (m *GatewayerMock) IsWalletAPIEnabled() bool { - - ret := m.Called() - - var r0 bool - switch res := ret.Get(0).(type) { - case nil: - case bool: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// NewAddresses mocked method -func (m *GatewayerMock) NewAddresses(p0 string, p1 []byte, p2 uint64) ([]cipher.Address, error) { - - ret := m.Called(p0, p1, p2) - - var r0 []cipher.Address - switch res := ret.Get(0).(type) { - case nil: - case []cipher.Address: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// ResendUnconfirmedTxns mocked method -func (m *GatewayerMock) ResendUnconfirmedTxns() *daemon.ResendResult { - - ret := m.Called() - - var r0 *daemon.ResendResult - switch res := ret.Get(0).(type) { - case nil: - case *daemon.ResendResult: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// Spend mocked method -func (m *GatewayerMock) Spend(p0 string, p1 []byte, p2 uint64, p3 cipher.Address) (*coin.Transaction, error) { - - ret := m.Called(p0, p1, p2, p3) - - var r0 *coin.Transaction - switch res := ret.Get(0).(type) { - case nil: - case *coin.Transaction: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - var r1 error - switch res := ret.Get(1).(type) { - case nil: - case error: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0, r1 - -} - -// UnloadWallet mocked method -func (m *GatewayerMock) UnloadWallet(p0 string) error { - - ret := m.Called(p0) - - var r0 error - switch res := ret.Get(0).(type) { - case nil: - case error: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// UpdateWalletLabel mocked method -func (m *GatewayerMock) UpdateWalletLabel(p0 string, p1 string) error { - - ret := m.Called(p0, p1) - - var r0 error - switch res := ret.Get(0).(type) { - case nil: - case error: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} diff --git a/src/gui/health.go b/src/gui/health.go deleted file mode 100755 index d560b1b..0000000 --- a/src/gui/health.go +++ /dev/null @@ -1,56 +0,0 @@ -package gui - -import ( - "fmt" - "net/http" - "time" - - wh "github.com/skycoin/skycoin/src/util/http" - "github.com/skycoin/skycoin/src/visor" -) - -// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block -type BlockchainMetadata struct { - *visor.BlockchainMetadata - TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` -} - -// HealthResponse is returned by the /health endpoint -type HealthResponse struct { - BlockchainMetadata BlockchainMetadata `json:"blockchain"` - Version visor.BuildInfo `json:"version"` - OpenConnections int `json:"open_connections"` - Uptime wh.Duration `json:"uptime"` -} - -// Returns node health data. -// URI: /health -// Method: GET -func healthCheck(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - health, err := gateway.GetHealth() - if err != nil { - err = fmt.Errorf("gateway.GetHealth failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - elapsedBlockTime := time.Now().UTC().Unix() - int64(health.BlockchainMetadata.Head.Time) - timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) - - wh.SendJSONOr500(logger, w, HealthResponse{ - BlockchainMetadata: BlockchainMetadata{ - BlockchainMetadata: health.BlockchainMetadata, - TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), - }, - Version: health.Version, - OpenConnections: health.OpenConnections, - Uptime: wh.FromDuration(health.Uptime), - }) - } -} diff --git a/src/gui/health_test.go b/src/gui/health_test.go deleted file mode 100755 index c4f976e..0000000 --- a/src/gui/health_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package gui - -import ( - "errors" - "net/http" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "encoding/json" - "net/http/httptest" - - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/visor" -) - -func TestHealthCheckHandler(t *testing.T) { - - cases := []struct { - name string - method string - code int - getHealthErr error - }{ - { - name: "valid response", - method: http.MethodGet, - code: http.StatusOK, - }, - { - name: "403 method not allowed", - method: http.MethodPost, - code: http.StatusMethodNotAllowed, - }, - { - name: "gateway.GetHealth error", - method: http.MethodGet, - code: http.StatusInternalServerError, - getHealthErr: errors.New("GetHealth failed"), - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - unspents := uint64(10) - unconfirmed := uint64(20) - - metadata := &visor.BlockchainMetadata{ - Head: visor.ReadableBlockHeader{ - BkSeq: 21175, - BlockHash: "8a3e0aac619551ae009cfb28c2b36bb1300925f74da770d1512072314f6a4c80", - PreviousBlockHash: "001eb7911b6a6ab7c75feb88726dd2bc8b87133aebc82201c4404537eb74f7ac", - Time: 1523168686, - Fee: 2, - Version: 0, - BodyHash: "36be8d70d1e9f70b340ea7ecf0b247c27086bad10568044c1196fe150f6cea1b", - }, - Unspents: unspents, - Unconfirmed: unconfirmed, - } - - buildInfo := visor.BuildInfo{ - Version: "1.0.0", - Commit: "abcdef", - Branch: "develop", - } - - health := &daemon.Health{ - BlockchainMetadata: metadata, - OpenConnections: 3, - Version: buildInfo, - Uptime: time.Second * 4, - } - - gateway := NewGatewayerMock() - if tc.getHealthErr != nil { - gateway.On("GetHealth").Return(nil, tc.getHealthErr) - } else { - gateway.On("GetHealth").Return(health, nil) - } - - endpoint := "/health" - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - cfg := muxConfig{ - host: configuredHost, - appLoc: ".", - } - handler := newServerMux(cfg, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - if tc.code != http.StatusOK { - require.Equal(t, tc.code, rr.Code) - return - } - - require.Equal(t, http.StatusOK, rr.Code) - - r := &HealthResponse{} - err = json.Unmarshal(rr.Body.Bytes(), r) - require.NoError(t, err) - - require.Equal(t, buildInfo.Version, r.Version.Version) - require.Equal(t, buildInfo.Commit, r.Version.Commit) - require.Equal(t, buildInfo.Branch, r.Version.Branch) - require.Equal(t, health.Uptime, r.Uptime.Duration) - - require.Equal(t, health.OpenConnections, r.OpenConnections) - - require.Equal(t, unconfirmed, r.BlockchainMetadata.Unconfirmed) - require.Equal(t, unspents, r.BlockchainMetadata.Unspents) - require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) - require.Equal(t, metadata.Head, r.BlockchainMetadata.Head) - }) - } -} diff --git a/src/gui/http.go b/src/gui/http.go deleted file mode 100755 index e151717..0000000 --- a/src/gui/http.go +++ /dev/null @@ -1,530 +0,0 @@ -package gui - -import ( - "crypto/tls" - "fmt" - "io/ioutil" - "net" - "net/http" - "path/filepath" - "strings" - "time" - "unicode" - - "github.com/skycoin/skycoin/src/api/webrpc" - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/util/file" - wh "github.com/skycoin/skycoin/src/util/http" - "github.com/skycoin/skycoin/src/util/logging" - "github.com/skycoin/skycoin/src/wallet" -) - -var ( - logger = logging.MustGetLogger("gui") -) - -const ( - resourceDir = "dist/" - devDir = "dev/" - indexPage = "index.html" - - defaultReadTimeout = time.Second * 10 - defaultWriteTimeout = time.Second * 60 - defaultIdleTimeout = time.Second * 120 -) - -// Server exposes an HTTP API -type Server struct { - server *http.Server - listener net.Listener - done chan struct{} -} - -// Config configures Server -type Config struct { - StaticDir string - DisableCSRF bool - EnableWalletAPI bool - EnableJSON20RPC bool - ReadTimeout time.Duration - WriteTimeout time.Duration - IdleTimeout time.Duration -} - -type muxConfig struct { - host string - appLoc string - enableWalletAPI bool - enableJSON20RPC bool -} - -func create(host string, c Config, daemon *daemon.Daemon) (*Server, error) { - var appLoc string - if c.EnableWalletAPI { - logger.Info("Wallet API enabled") - - var err error - appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) - if err != nil { - return nil, err - } - logger.Infof("Web resources directory: %s", appLoc) - } - - csrfStore := &CSRFStore{ - Enabled: !c.DisableCSRF, - } - if c.DisableCSRF { - logger.Warning("CSRF check disabled") - } - - var rpc *webrpc.WebRPC - if c.EnableJSON20RPC { - logger.Info("JSON 2.0 RPC enabled") - var err error - rpc, err = webrpc.New(daemon.Gateway) - if err != nil { - return nil, err - } - } - - if c.ReadTimeout == 0 { - c.ReadTimeout = defaultReadTimeout - } - if c.WriteTimeout == 0 { - c.WriteTimeout = defaultWriteTimeout - } - if c.IdleTimeout == 0 { - c.IdleTimeout = defaultIdleTimeout - } - - mc := muxConfig{ - host: host, - appLoc: appLoc, - enableWalletAPI: c.EnableWalletAPI, - enableJSON20RPC: c.EnableJSON20RPC, - } - - srvMux := newServerMux(mc, daemon.Gateway, csrfStore, rpc) - srv := &http.Server{ - Handler: srvMux, - ReadTimeout: c.ReadTimeout, - WriteTimeout: c.WriteTimeout, - IdleTimeout: c.IdleTimeout, - } - - return &Server{ - server: srv, - done: make(chan struct{}), - }, nil -} - -// Create creates a new Server instance that listens on HTTP -func Create(host string, c Config, daemon *daemon.Daemon) (*Server, error) { - s, err := create(host, c, daemon) - if err != nil { - return nil, err - } - - logger.Warning("HTTPS not in use!") - - s.listener, err = net.Listen("tcp", host) - if err != nil { - return nil, err - } - - return s, nil -} - -// CreateHTTPS creates a new Server instance that listens on HTTPS -func CreateHTTPS(host string, c Config, daemon *daemon.Daemon, certFile, keyFile string) (*Server, error) { - s, err := create(host, c, daemon) - if err != nil { - return nil, err - } - - logger.Infof("Using %s for the certificate", certFile) - logger.Infof("Using %s for the key", keyFile) - - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - - s.listener, err = tls.Listen("tcp", host, &tls.Config{ - Certificates: []tls.Certificate{cert}, - }) - if err != nil { - return nil, err - } - - return s, nil -} - -// Serve serves the web interface on the configured host -func (s *Server) Serve() error { - logger.Infof("Starting web interface on %s", s.listener.Addr()) - defer logger.Info("Web interface closed") - defer close(s.done) - - if err := s.server.Serve(s.listener); err != nil { - if err != http.ErrServerClosed { - return err - } - } - return nil -} - -// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. -func (s *Server) Shutdown() { - logger.Info("Shutting down web interface") - defer logger.Info("Web interface shut down") - s.listener.Close() - <-s.done -} - -// newServerMux creates an http.ServeMux with handlers registered -func newServerMux(c muxConfig, gateway Gatewayer, csrfStore *CSRFStore, rpc *webrpc.WebRPC) *http.ServeMux { - mux := http.NewServeMux() - - headerCheck := func(host string, handler http.Handler) http.Handler { - handler = OriginRefererCheck(host, handler) - handler = wh.HostCheck(logger, host, handler) - return handler - } - - webHandler := func(endpoint string, handler http.Handler) { - - handler = wh.ElapsedHandler(logger, handler) - handler = CSRFCheck(csrfStore, handler) - handler = headerCheck(c.host, handler) - mux.Handle(endpoint, handler) - } - - if c.enableWalletAPI { - webHandler("/", newIndexHandler(c.appLoc)) - - fileInfos, _ := ioutil.ReadDir(c.appLoc) - for _, fileInfo := range fileInfos { - route := fmt.Sprintf("/%s", fileInfo.Name()) - if fileInfo.IsDir() { - route = route + "/" - } - webHandler(route, http.FileServer(http.Dir(c.appLoc))) - } - } - - if c.enableJSON20RPC { - webHandler("/webrpc", http.HandlerFunc(rpc.Handler)) - } - - // get the current CSRF token - mux.Handle("/csrf", headerCheck(c.host, getCSRFToken(gateway, csrfStore))) - - webHandler("/version", versionHandler(gateway)) - - // get set of unspent outputs - webHandler("/outputs", getOutputsHandler(gateway)) - - // get balance of addresses - webHandler("/balance", getBalanceHandler(gateway)) - - // Wallet interface - - // Returns wallet info - // Method: GET - // Args: - // id - Wallet ID [required] - webHandler("/wallet", walletGet(gateway)) - - // Loads wallet from seed, will scan ahead N address and - // load addresses till the last one that have coins. - // Method: POST - // Args: - // seed: wallet seed [required] - // label: wallet label [required] - // scan: the number of addresses to scan ahead for balances [optional, must be > 0] - webHandler("/wallet/create", walletCreate(gateway)) - - webHandler("/wallet/newAddress", walletNewAddresses(gateway)) - - // Returns the confirmed and predicted balance for a specific wallet. - // The predicted balance is the confirmed balance minus any pending - // spent amount. - // GET arguments: - // id: Wallet ID - webHandler("/wallet/balance", walletBalanceHandler(gateway)) - - // Sends coins&hours to another address. - // POST arguments: - // id: Wallet ID - // coins: Number of coins to spend - // dst: Destination address - // Returns total amount spent if successful, otherwise error describing - // failure status. - webHandler("/wallet/spend", walletSpendHandler(gateway)) - - // Creates a transaction from a wallet - webHandler("/wallet/transaction", createTransactionHandler(gateway)) - - // GET Arguments: - // id: Wallet ID - // Returns all pending transanction for all addresses by selected Wallet - webHandler("/wallet/transactions", walletTransactionsHandler(gateway)) - - // Update wallet label - // POST Arguments: - // id: wallet id - // label: wallet label - webHandler("/wallet/update", walletUpdateHandler(gateway)) - - // Returns all loaded wallets - // returns sensitive information - webHandler("/wallets", walletsHandler(gateway)) - - // Returns wallets directory path - webHandler("/wallets/folderName", getWalletFolder(gateway)) - - // Generate wallet seed - // GET Arguments: - // entropy: entropy bitsize. - webHandler("/wallet/newSeed", newWalletSeed(gateway)) - - // Gets seed of wallet of given id - // GET Arguments: - // id: wallet id - // password: wallet password - webHandler("/wallet/seed", walletSeedHandler(gateway)) - - // unload wallet - // POST Argument: - // id: wallet id - webHandler("/wallet/unload", walletUnloadHandler(gateway)) - - // Encrypts wallet - // POST arguments: - // id: wallet id - // password: wallet password - // Returns an encrypted wallet json without sensitive data - webHandler("/wallet/encrypt", walletEncryptHandler(gateway)) - - // Decrypts wallet - // POST arguments: - // id: wallet id - // password: wallet password - webHandler("/wallet/decrypt", walletDecryptHandler(gateway)) - - // Blockchain interface - - webHandler("/blockchain/metadata", blockchainHandler(gateway)) - webHandler("/blockchain/progress", blockchainProgressHandler(gateway)) - - // get block by hash or seq - webHandler("/block", getBlock(gateway)) - // get blocks in specific range - webHandler("/blocks", getBlocks(gateway)) - // get last N blocks - webHandler("/last_blocks", getLastBlocks(gateway)) - - // Network stats interface - webHandler("/network/connection", connectionHandler(gateway)) - webHandler("/network/connections", connectionsHandler(gateway)) - webHandler("/network/defaultConnections", defaultConnectionsHandler(gateway)) - webHandler("/network/connections/trust", trustConnectionsHandler(gateway)) - webHandler("/network/connections/exchange", exchgConnectionsHandler(gateway)) - - // Transaction handler - - // get set of pending transactions - webHandler("/pendingTxs", getPendingTxs(gateway)) - // get txn by txid - webHandler("/transaction", getTransactionByID(gateway)) - - // Health check handler - webHandler("/health", healthCheck(gateway)) - - // Returns transactions that match the filters. - // Method: GET - // Args: - // addrs: Comma seperated addresses [optional, returns all transactions if no address is provided] - // confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] - webHandler("/transactions", getTransactions(gateway)) - // inject a transaction into network - webHandler("/injectTransaction", injectTransaction(gateway)) - webHandler("/resendUnconfirmedTxns", resendUnconfirmedTxns(gateway)) - // get raw tx by txid. - webHandler("/rawtx", getRawTx(gateway)) - - // UxOut api handler - - // get uxout by id. - webHandler("/uxout", getUxOutByID(gateway)) - // get all the address affected uxouts. - webHandler("/address_uxouts", getAddrUxOuts(gateway)) - - // Explorer handler - - // get set of pending transactions - webHandler("/explorer/address", getTransactionsForAddress(gateway)) - - webHandler("/coinSupply", getCoinSupply(gateway)) - - webHandler("/richlist", getRichlist(gateway)) - - webHandler("/addresscount", getAddressCount(gateway)) - - return mux -} - -// Returns a http.HandlerFunc for index.html, where index.html is in appLoc -func newIndexHandler(appLoc string) http.HandlerFunc { - // Serves the main page - return func(w http.ResponseWriter, r *http.Request) { - page := filepath.Join(appLoc, indexPage) - logger.Debugf("Serving index page: %s", page) - if r.URL.Path == "/" { - http.ServeFile(w, r, page) - } else { - wh.Error404(w, "") - } - } -} - -func splitCommaString(s string) []string { - words := strings.FieldsFunc(s, func(r rune) bool { - return r == ',' || unicode.IsSpace(r) - }) - - // Deduplicate - var dedupWords []string - wordsMap := make(map[string]struct{}) - for _, w := range words { - if _, ok := wordsMap[w]; !ok { - dedupWords = append(dedupWords, w) - } - wordsMap[w] = struct{}{} - } - - return dedupWords -} - -// getOutputsHandler returns UxOuts filtered by a set of addresses or a set of hashes -// URI: /outputs -// Method: GET -// Args: -// addrs: comma-separated list of addresses -// hashes: comma-separated list of uxout hashes -// If neither addrs nor hashes are specificed, return all unspent outputs. -// If only one filter is specified, then return outputs match the filter. -// Both filters cannot be specified. -func getOutputsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - var addrs []string - var hashes []string - - addrStr := r.FormValue("addrs") - hashStr := r.FormValue("hashes") - - if addrStr != "" && hashStr != "" { - wh.Error400(w, "addrs and hashes cannot be specified together") - return - } - - filters := []daemon.OutputsFilter{} - - if addrStr != "" { - addrs = splitCommaString(addrStr) - - for _, a := range addrs { - if _, err := cipher.DecodeBase58Address(a); err != nil { - wh.Error400(w, "addrs contains invalid address") - return - } - } - - if len(addrs) > 0 { - filters = append(filters, daemon.FbyAddresses(addrs)) - } - } - - if hashStr != "" { - hashes = splitCommaString(hashStr) - if len(hashes) > 0 { - filters = append(filters, daemon.FbyHashes(hashes)) - } - } - - outs, err := gateway.GetUnspentOutputs(filters...) - if err != nil { - err = fmt.Errorf("get unspent outputs failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, outs) - } -} - -func getBalanceHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - addrsParam := r.FormValue("addrs") - addrsStr := splitCommaString(addrsParam) - - addrs := make([]cipher.Address, 0, len(addrsStr)) - for _, addr := range addrsStr { - a, err := cipher.DecodeBase58Address(addr) - if err != nil { - wh.Error400(w, fmt.Sprintf("address %s is invalid: %v", addr, err)) - return - } - addrs = append(addrs, a) - } - - bals, err := gateway.GetBalanceOfAddrs(addrs) - if err != nil { - err = fmt.Errorf("gateway.GetBalanceOfAddrs failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - var balance wallet.BalancePair - for _, bal := range bals { - var err error - balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - balance.Predicted, err = balance.Predicted.Add(bal.Predicted) - if err != nil { - wh.Error500(w, err.Error()) - return - } - } - - wh.SendJSONOr500(logger, w, balance) - } -} - -func versionHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - wh.SendJSONOr500(logger, w, gateway.GetBuildInfo()) - } -} diff --git a/src/gui/http_test.go b/src/gui/http_test.go deleted file mode 100755 index 3d9a56f..0000000 --- a/src/gui/http_test.go +++ /dev/null @@ -1,278 +0,0 @@ -package gui - -import ( - "encoding/json" - "math" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "errors" - - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" -) - -func TestGetOutputsHandler(t *testing.T) { - validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" - invalidAddr := "invalidAddr" - validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" - - type httpBody struct { - addrs string - hashStr string - } - tt := []struct { - name string - method string - url string - status int - err string - httpBody *httpBody - uxid string - getUnspentOutputsResponse *visor.ReadableOutputSet - getUnspentOutputsError error - httpResponse *visor.ReadableOutputSet - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - addrs and hashes together", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - addrs and hashes cannot be specified together", - httpBody: &httpBody{ - addrs: validAddr, - hashStr: validHash, - }, - }, - { - name: "400 - invalid address", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - addrs contains invalid address", - httpBody: &httpBody{ - addrs: invalidAddr, - }, - }, - { - name: "500 - getUnspentOutputsError", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - get unspent outputs failed: getUnspentOutputsError", - getUnspentOutputsResponse: nil, - getUnspentOutputsError: errors.New("getUnspentOutputsError"), - }, - { - name: "200 - OK", - method: http.MethodGet, - status: http.StatusOK, - getUnspentOutputsResponse: &visor.ReadableOutputSet{}, - httpResponse: &visor.ReadableOutputSet{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - endpoint := "/outputs" - gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.getUnspentOutputsResponse, tc.getUnspentOutputsError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.hashStr != "" { - v.Add("hashes", tc.httpBody.hashStr) - } - if tc.httpBody.addrs != "" { - v.Add("addrs", tc.httpBody.addrs) - } - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *visor.ReadableOutputSet - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} - -func TestGetBalanceHandler(t *testing.T) { - type httpBody struct { - addrs string - } - invalidAddr := "invalidAddr" - validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" - address, err := cipher.DecodeBase58Address(validAddr) - require.NoError(t, err) - tt := []struct { - name string - method string - url string - status int - err string - httpBody *httpBody - uxid string - getBalanceOfAddrsArg []cipher.Address - getBalanceOfAddrsResponse []wallet.BalancePair - getBalanceOfAddrsError error - httpResponse wallet.BalancePair - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - invalid address", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - address invalidAddr is invalid: Invalid base58 character", - httpBody: &httpBody{ - addrs: invalidAddr, - }, - }, - { - name: "500 - GetBalanceOfAddrsError", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetBalanceOfAddrs failed: GetBalanceOfAddrsError", - httpBody: &httpBody{ - addrs: validAddr, - }, - getBalanceOfAddrsArg: []cipher.Address{address}, - getBalanceOfAddrsError: errors.New("GetBalanceOfAddrsError"), - }, - { - name: "500 - balance Confirmed coins uint64 addition overflow", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - uint64 addition overflow", - httpBody: &httpBody{ - addrs: validAddr, - }, - getBalanceOfAddrsArg: []cipher.Address{address}, - getBalanceOfAddrsResponse: []wallet.BalancePair{ - { - Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - { - Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - }, - }, - { - name: "500 - balance Predicted coins uint64 addition overflow", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - uint64 addition overflow", - httpBody: &httpBody{ - addrs: validAddr, - }, - getBalanceOfAddrsArg: []cipher.Address{address}, - getBalanceOfAddrsResponse: []wallet.BalancePair{ - { - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, - }, - { - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, - }, - }, - }, - { - name: "200 - OK", - method: http.MethodGet, - status: http.StatusOK, - err: "200 - OK", - httpBody: &httpBody{ - addrs: validAddr, - }, - getBalanceOfAddrsArg: []cipher.Address{address}, - getBalanceOfAddrsResponse: []wallet.BalancePair{ - { - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - { - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - }, - httpResponse: wallet.BalancePair{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - endpoint := "/balance" - gateway.On("GetBalanceOfAddrs", tc.getBalanceOfAddrsArg).Return(tc.getBalanceOfAddrsResponse, tc.getBalanceOfAddrsError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.addrs != "" { - v.Add("addrs", tc.httpBody.addrs) - } - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg wallet.BalancePair - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} diff --git a/src/gui/integration/integration_test.go b/src/gui/integration/integration_test.go deleted file mode 100755 index 044ba1c..0000000 --- a/src/gui/integration/integration_test.go +++ /dev/null @@ -1,3525 +0,0 @@ -// package integration_test implements GUI integration tests -package integration_test - -import ( - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "math" - "math/rand" - "net/http" - "net/url" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/gui" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/droplet" //http,json helpers - "github.com/skycoin/skycoin/src/util/fee" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/visor/historydb" - "github.com/skycoin/skycoin/src/wallet" -) - -/* Runs HTTP API tests against a running skycoin node - -Set envvar SKYCOIN_INTEGRATION_TESTS=1 to enable them -Set SKYCOIN_NODE_HOST to the node's address (defaults to http://127.0.0.1:6420) -Set SKYCOIN_INTEGRATION_TEST_MODE to either "stable" or "live" (defaults to "stable") - -Each test has two modes: - 1. against a stable, pinned blockchain - 2. against a live, active blockchain - -When running mode 1, API responses do not change. The exact responses are compared to saved responses on disk. -Make sure the skycoin node is running against the pinned blockchain data provided in this package's folder. - -When running mode 2, API responses may change (such as /coinSupply). The exact responses are not compared, -but the response is checked to be unmarshallable to a known JSON object. -TODO: When go1.10 is released, use the new DisallowUnknownFields property of the JSON decoder, to detect when -an API adds a new field to the response. See: https://tip.golang.org/doc/go1.10#encoding/json - -When update flag is set to true all tests pass -*/ - -const ( - testModeStable = "stable" - testModeLive = "live" - testModeDisableWalletApi = "disable-wallet-api" - testModeDisableSeedApi = "disable-seed-api" - - testFixturesDir = "test-fixtures" -) - -type TestData struct { - actual interface{} - expected interface{} -} - -var update = flag.Bool("update", false, "update golden files") -var testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") - -func nodeAddress() string { - addr := os.Getenv("SKYCOIN_NODE_HOST") - if addr == "" { - return "http://127.0.0.1:6420" - } - return addr -} - -func mode(t *testing.T) string { - mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") - switch mode { - case "": - mode = testModeStable - case testModeLive, - testModeStable, - testModeDisableWalletApi, - testModeDisableSeedApi: - default: - t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") - } - return mode -} - -func enabled() bool { - return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" -} - -func doStable(t *testing.T) bool { - if enabled() && mode(t) == testModeStable { - return true - } - - t.Skip("Stable tests disabled") - return false -} - -func doLive(t *testing.T) bool { - if enabled() && mode(t) == testModeLive { - return true - } - - t.Skip("Live tests disabled") - return false -} - -func doDisableWalletApi(t *testing.T) bool { - if enabled() && mode(t) == testModeDisableWalletApi { - return true - } - - t.Skip("DisableWalletApi tests disabled") - return false -} - -func doDisableSeedApi(t *testing.T) bool { - if enabled() && mode(t) == testModeDisableSeedApi { - return true - } - - t.Skip("EnableSeedAPI tests disabled") - return false -} - -func doLiveOrStable(t *testing.T) bool { - if enabled() { - switch mode(t) { - case testModeStable, testModeLive: - return true - } - } - - t.Skip("Live and stable tests disabled") - return false -} - -func doLiveWallet(t *testing.T) bool { - if *testLiveWallet { - return true - } - - t.Skip("Tests requiring wallet envvars are disabled") - return false -} - -func loadJSON(t *testing.T, filename string, obj interface{}) { - f, err := os.Open(filename) - require.NoError(t, err, filename) - defer f.Close() - - err = json.NewDecoder(f).Decode(obj) - require.NoError(t, err, filename) -} - -func loadGoldenFile(t *testing.T, filename string, testData TestData) { - require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") - - goldenFile := filepath.Join(testFixturesDir, filename) - - if *update { - updateGoldenFile(t, goldenFile, testData.actual) - } - - f, err := os.Open(goldenFile) - require.NoError(t, err) - defer f.Close() - - err = json.NewDecoder(f).Decode(testData.expected) - require.NoError(t, err, filename) -} - -func updateGoldenFile(t *testing.T, filename string, content interface{}) { - contentJSON, err := json.MarshalIndent(content, "", "\t") - require.NoError(t, err) - contentJSON = append(contentJSON, '\n') - err = ioutil.WriteFile(filename, contentJSON, 0644) - require.NoError(t, err) -} - -func assertResponseError(t *testing.T, err error, errCode int, errMsg string) { - require.Error(t, err) - require.IsType(t, gui.APIError{}, err) - require.Equal(t, errCode, err.(gui.APIError).StatusCode) - require.Equal(t, errMsg, err.(gui.APIError).Message) -} - -func TestStableCoinSupply(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cs, err := c.CoinSupply() - require.NoError(t, err) - - var expected gui.CoinSupply - loadGoldenFile(t, "coinsupply.golden", TestData{cs, &expected}) - - require.Equal(t, expected, *cs) -} - -func TestLiveCoinSupply(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cs, err := c.CoinSupply() - require.NoError(t, err) - - require.NotEmpty(t, cs.CurrentSupply) - require.NotEmpty(t, cs.TotalSupply) - require.NotEmpty(t, cs.MaxSupply) - require.Equal(t, "100000000.000000", cs.MaxSupply) - require.NotEmpty(t, cs.CurrentCoinHourSupply) - require.NotEmpty(t, cs.TotalCoinHourSupply) - require.Equal(t, 100, len(cs.UnlockedAddresses)+len(cs.LockedAddresses)) -} - -func TestVersion(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - v, err := c.Version() - require.NoError(t, err) - - require.NotEmpty(t, v.Version) -} - -func TestStableOutputs(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - golden string - addrs []string - hashes []string - errCode int - errMsg string - }{ - { - name: "no addrs or hashes", - golden: "outputs-noargs.golden", - }, - { - name: "only addrs", - addrs: []string{ - "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - }, - golden: "outputs-addrs.golden", - }, - { - name: "only hashes", - hashes: []string{ - "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", - "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", - "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", - "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - }, - golden: "outputs-hashes.golden", - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - require.False(t, tc.addrs != nil && tc.hashes != nil) - - var outputs *visor.ReadableOutputSet - var err error - switch { - case tc.addrs == nil && tc.hashes == nil: - outputs, err = c.Outputs() - case tc.addrs != nil: - outputs, err = c.OutputsForAddresses(tc.addrs) - case tc.hashes != nil: - outputs, err = c.OutputsForHashes(tc.hashes) - } - - if tc.errCode != 0 && tc.errCode != http.StatusOK { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - - require.NoError(t, err) - - var expected visor.ReadableOutputSet - loadGoldenFile(t, tc.golden, TestData{outputs, &expected}) - - require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) - require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) - require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) - - for i, o := range expected.HeadOutputs { - require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) - } - - require.Equal(t, expected, *outputs) - }) - } -} - -func TestLiveOutputs(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Request all outputs and check that HeadOutputs is not empty - // OutgoingOutputs and IncomingOutputs are variable and could be empty - outputs, err := c.Outputs() - require.NoError(t, err) - require.NotEmpty(t, outputs.HeadOutputs) - - outputs, err = c.OutputsForAddresses(nil) - require.NoError(t, err) - require.NotEmpty(t, outputs.HeadOutputs) - - outputs, err = c.OutputsForHashes(nil) - require.NoError(t, err) - require.NotEmpty(t, outputs.HeadOutputs) -} - -func TestStableBlock(t *testing.T) { - if !doStable(t) { - return - } - - testKnownBlocks(t) -} - -func TestLiveBlock(t *testing.T) { - if !doLive(t) { - return - } - - testKnownBlocks(t) - - // These blocks were affected by the coinhour overflow issue, make sure that they can be queried - blockSeqs := []uint64{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} - - c := gui.NewClient(nodeAddress()) - for _, seq := range blockSeqs { - b, err := c.BlockBySeq(seq) - require.NoError(t, err) - require.Equal(t, seq, b.Head.BkSeq) - } -} - -func testKnownBlocks(t *testing.T) { - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - golden string - hash string - seq uint64 - errCode int - errMsg string - }{ - { - name: "unknown hash", - hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", - errCode: http.StatusNotFound, - errMsg: "404 Not Found\n", - }, - { - name: "valid hash", - golden: "block-hash.golden", - hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", - }, - { - name: "genesis hash", - golden: "block-hash-genesis.golden", - hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", - }, - { - name: "genesis seq", - golden: "block-seq-0.golden", - seq: 0, - }, - { - name: "seq 100", - golden: "block-seq-100.golden", - seq: 100, - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - var b *visor.ReadableBlock - var err error - - if tc.hash != "" { - b, err = c.BlockByHash(tc.hash) - } else { - b, err = c.BlockBySeq(tc.seq) - } - - if tc.errCode != 0 && tc.errCode != http.StatusOK { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - - require.NotNil(t, b) - - var expected visor.ReadableBlock - loadGoldenFile(t, tc.golden, TestData{b, &expected}) - - require.Equal(t, expected, *b) - }) - } - - t.Logf("Querying every block in the blockchain") - - // Scan every block by seq - progress, err := c.BlockchainProgress() - require.NoError(t, err) - - var prevBlock *visor.ReadableBlock - for i := uint64(0); i < progress.Current; i++ { - t.Run(fmt.Sprintf("block-seq-%d", i), func(t *testing.T) { - b, err := c.BlockBySeq(i) - require.NoError(t, err) - require.NotNil(t, b) - require.Equal(t, i, b.Head.BkSeq) - - if prevBlock != nil { - require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) - } - - bHash, err := c.BlockByHash(b.Head.BlockHash) - require.NoError(t, err) - require.NotNil(t, bHash) - require.Equal(t, b, bHash) - - prevBlock = b - }) - } -} - -func TestStableBlockchainMetadata(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - metadata, err := c.BlockchainMetadata() - require.NoError(t, err) - - var expected visor.BlockchainMetadata - loadGoldenFile(t, "blockchain-metadata.golden", TestData{metadata, &expected}) - - require.Equal(t, expected, *metadata) -} - -func TestLiveBlockchainMetadata(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - metadata, err := c.BlockchainMetadata() - require.NoError(t, err) - - require.NotEqual(t, uint64(0), metadata.Head.BkSeq) -} - -func TestStableBlockchainProgress(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - progress, err := c.BlockchainProgress() - require.NoError(t, err) - - var expected daemon.BlockchainProgress - loadGoldenFile(t, "blockchain-progress.golden", TestData{progress, &expected}) - - require.Equal(t, expected, *progress) -} - -func TestLiveBlockchainProgress(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - progress, err := c.BlockchainProgress() - require.NoError(t, err) - - require.NotEqual(t, uint64(0), progress.Current) - require.True(t, progress.Current <= progress.Highest) - require.NotEmpty(t, progress.Peers) -} - -func TestStableBalance(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - golden string - addrs []string - }{ - { - name: "no addresses", - golden: "balance-noaddrs.golden", - }, - { - name: "unknown address", - addrs: []string{"prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9"}, - golden: "balance-noaddrs.golden", - }, - { - name: "one address", - addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, - golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", - }, - { - name: "duplicate addresses", - addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, - golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", - }, - { - name: "two addresses", - addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5"}, - golden: "balance-two-addrs.golden", - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - balance, err := c.Balance(tc.addrs) - require.NoError(t, err) - - var expected wallet.BalancePair - loadGoldenFile(t, tc.golden, TestData{balance, &expected}) - - require.Equal(t, expected, *balance) - }) - } -} - -func TestLiveBalance(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Genesis address check, should not have a balance - b, err := c.Balance([]string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}) - require.NoError(t, err) - require.Equal(t, wallet.BalancePair{}, *b) - - // Balance of final distribution address. Should have the same coins balance - // for the next 15-20 years. - b, err = c.Balance([]string{"ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}) - require.NoError(t, err) - require.Equal(t, b.Confirmed, b.Predicted) - require.NotEmpty(t, b.Confirmed.Hours) - require.Equal(t, uint64(1e6*1e6), b.Confirmed.Coins) - - // Check that the balance is queryable for addresses known to be affected - // by the coinhour overflow problem - addrs := []string{ - "n7AR1VMW1pK7F9TxhYdnr3HoXEQ3g9iTNP", - "2aTzmXi9jyiq45oTRFCP9Y7dcvnT6Rsp7u", - "FjFLnus2ePxuaPTXFXfpw6cVAE5owT1t3P", - "KT9vosieyWhn9yWdY8w7UZ6tk31KH4NAQK", - } - for _, a := range addrs { - _, err := c.Balance([]string{a}) - require.NoError(t, err, "Failed to get balance of address %s", a) - } - _, err = c.Balance(addrs) - require.NoError(t, err) -} - -func TestStableUxOut(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - golden string - uxID string - }{ - { - name: "valid uxID", - golden: "uxout.golden", - uxID: "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - ux, err := c.UxOut(tc.uxID) - require.NoError(t, err) - - var expected historydb.UxOutJSON - loadGoldenFile(t, tc.golden, TestData{ux, &expected}) - - require.Equal(t, expected, *ux) - }) - } - - // Scan all uxouts from the result of /outputs - scanUxOuts(t) -} - -func TestLiveUxOut(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // A spent uxout should never change - ux, err := c.UxOut("fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20") - require.NoError(t, err) - - var expected historydb.UxOutJSON - loadGoldenFile(t, "uxout-spent.golden", TestData{ux, &expected}) - require.Equal(t, expected, *ux) - require.NotEqual(t, uint64(0), ux.SpentBlockSeq) - - // Scan all uxouts from the result of /outputs - scanUxOuts(t) -} - -func scanUxOuts(t *testing.T) { - c := gui.NewClient(nodeAddress()) - - outputs, err := c.Outputs() - require.NoError(t, err) - - for _, ux := range outputs.HeadOutputs { - t.Run(ux.Hash, func(t *testing.T) { - foundUx, err := c.UxOut(ux.Hash) - require.NoError(t, err) - - require.Equal(t, ux.Hash, foundUx.Uxid) - require.Equal(t, ux.Time, foundUx.Time) - require.Equal(t, ux.BkSeq, foundUx.SrcBkSeq) - require.Equal(t, ux.SourceTransaction, foundUx.SrcTx) - require.Equal(t, ux.Address, foundUx.OwnerAddress) - require.Equal(t, ux.Hours, foundUx.Hours) - coinsStr, err := droplet.ToString(foundUx.Coins) - require.NoError(t, err) - require.Equal(t, ux.Coins, coinsStr) - - if foundUx.SpentBlockSeq == 0 { - require.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) - } else { - require.NotEqual(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) - } - }) - } -} - -func TestStableAddressUxOuts(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - errCode int - errMsg string - golden string - addr string - }{ - { - name: "no addresses", - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - address is empty\n", - }, - { - name: "unknown address", - addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", - golden: "uxout-noaddr.golden", - }, - { - name: "one address", - addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - golden: "uxout-addr.golden", - }, - } - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - ux, err := c.AddressUxOuts(tc.addr) - if tc.errCode != 0 && tc.errCode != http.StatusOK { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - require.NoError(t, err) - var expected []*historydb.UxOutJSON - loadGoldenFile(t, tc.golden, TestData{ux, &expected}) - require.Equal(t, expected, ux, tc.name) - }) - } -} - -func TestLiveAddressUxOuts(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - cases := []struct { - name string - errCode int - errMsg string - addr string - moreThanZero bool - }{ - { - name: "no addresses", - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - address is empty\n", - }, - { - name: "invalid address length", - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - Invalid address length\n", - addr: "prRXwTcDK24hs6AFxj", - }, - { - name: "unknown address", - addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", - }, - { - name: "one address", - addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - }, - } - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - ux, err := c.AddressUxOuts(tc.addr) - if tc.errCode != 0 && tc.errCode != http.StatusOK { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - require.NoError(t, err) - if tc.moreThanZero { - require.NotEqual(t, 0, len(ux)) - } - }) - } -} - -func TestStableBlocks(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - progress, err := c.BlockchainProgress() - require.NoError(t, err) - - lastNBlocks := 10 - require.True(t, int(progress.Current) > lastNBlocks+1) - - cases := []struct { - name string - golden string - start int - end int - errCode int - errMsg string - }{ - { - name: "first 10", - golden: "blocks-first-10.golden", - start: 1, - end: 10, - }, - { - name: "last 10", - golden: "blocks-last-10.golden", - start: int(progress.Current) - lastNBlocks, - end: int(progress.Current), - }, - { - name: "first block", - golden: "blocks-first-1.golden", - start: 1, - end: 1, - }, - { - name: "all blocks", - golden: "blocks-all.golden", - start: 0, - end: int(progress.Current), - }, - { - name: "start > end", - golden: "blocks-end-less-than-start.golden", - start: 10, - end: 9, - }, - { - name: "start negative", - start: -10, - end: 9, - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - Invalid start value \"-10\"\n", - }, - { - name: "end negative", - start: 10, - end: -9, - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - Invalid end value \"-9\"\n", - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - if tc.errMsg == "" { - resp := testBlocks(t, tc.start, tc.end) - - var expected visor.ReadableBlocks - loadGoldenFile(t, tc.golden, TestData{resp, &expected}) - - require.Equal(t, expected, *resp) - } else { - _, err := c.Blocks(tc.start, tc.end) - assertResponseError(t, err, tc.errCode, tc.errMsg) - } - }) - } -} - -func TestLiveBlocks(t *testing.T) { - if !doLive(t) { - return - } - - testBlocks(t, 1, 10) -} - -func testBlocks(t *testing.T, start, end int) *visor.ReadableBlocks { - c := gui.NewClient(nodeAddress()) - - blocks, err := c.Blocks(start, end) - require.NoError(t, err) - - if start > end { - require.Empty(t, blocks.Blocks) - } else { - require.Len(t, blocks.Blocks, end-start+1) - } - - var prevBlock *visor.ReadableBlock - for idx, b := range blocks.Blocks { - if prevBlock != nil { - require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) - } - - bHash, err := c.BlockByHash(b.Head.BlockHash) - require.Equal(t, uint64(idx+start), b.Head.BkSeq) - require.NoError(t, err) - require.NotNil(t, bHash) - require.Equal(t, b, *bHash) - - prevBlock = &blocks.Blocks[idx] - } - - return blocks -} - -func TestStableLastBlocks(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - blocks, err := c.LastBlocks(1) - require.NoError(t, err) - - var expected *visor.ReadableBlocks - loadGoldenFile(t, "block-last.golden", TestData{blocks, &expected}) - require.Equal(t, expected, blocks) - - var prevBlock *visor.ReadableBlock - blocks, err = c.LastBlocks(10) - require.NoError(t, err) - require.Equal(t, 10, len(blocks.Blocks)) - for idx, b := range blocks.Blocks { - if prevBlock != nil { - require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) - } - - bHash, err := c.BlockByHash(b.Head.BlockHash) - require.NoError(t, err) - require.NotNil(t, bHash) - require.Equal(t, b, *bHash) - - prevBlock = &blocks.Blocks[idx] - } - -} - -func TestLiveLastBlocks(t *testing.T) { - if !doLive(t) { - return - } - c := gui.NewClient(nodeAddress()) - var prevBlock *visor.ReadableBlock - blocks, err := c.LastBlocks(10) - require.NoError(t, err) - require.Equal(t, 10, len(blocks.Blocks)) - for idx, b := range blocks.Blocks { - if prevBlock != nil { - require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) - } - - bHash, err := c.BlockByHash(b.Head.BlockHash) - require.NoError(t, err) - require.NotNil(t, bHash) - require.Equal(t, b, *bHash) - - prevBlock = &blocks.Blocks[idx] - } -} - -func TestStableNetworkConnections(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - connections, err := c.NetworkConnections() - require.NoError(t, err) - require.Empty(t, connections.Connections) - - connection, err := c.NetworkConnection("127.0.0.1:4444") - assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") - require.Nil(t, connection) -} - -func TestLiveNetworkConnections(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - connections, err := c.NetworkConnections() - require.NoError(t, err) - require.NotEmpty(t, connections.Connections) - - for _, cc := range connections.Connections { - connection, err := c.NetworkConnection(cc.Addr) - require.NoError(t, err) - require.NotEmpty(t, cc.Addr) - require.Equal(t, cc.Addr, connection.Addr) - require.Equal(t, cc.ID, connection.ID) - require.Equal(t, cc.ListenPort, connection.ListenPort) - require.Equal(t, cc.Mirror, connection.Mirror) - require.Equal(t, cc.Introduced, connection.Introduced) - require.Equal(t, cc.Outgoing, connection.Outgoing) - require.True(t, cc.LastReceived <= connection.LastReceived) - require.True(t, cc.LastSent <= connection.LastSent) - } -} - -func TestNetworkDefaultConnections(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - connections, err := c.NetworkDefaultConnections() - require.NoError(t, err) - require.NotEmpty(t, connections) - sort.Strings(connections) - - var expected []string - loadGoldenFile(t, "network-default-connections.golden", TestData{connections, &expected}) - sort.Strings(expected) - require.Equal(t, expected, connections) -} - -func TestNetworkTrustedConnections(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - connections, err := c.NetworkTrustedConnections() - require.NoError(t, err) - require.NotEmpty(t, connections) - sort.Strings(connections) - - var expected []string - loadGoldenFile(t, "network-trusted-connections.golden", TestData{connections, &expected}) - sort.Strings(expected) - require.Equal(t, expected, connections) -} - -func TestStableNetworkExchangeableConnections(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - connections, err := c.NetworkExchangeableConnections() - require.NoError(t, err) - - var expected []string - loadGoldenFile(t, "network-exchangeable-connections.golden", TestData{connections, &expected}) - sort.Strings(connections) - sort.Strings(expected) - require.Equal(t, expected, connections) -} - -func TestLiveNetworkExchangeableConnections(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - _, err := c.NetworkExchangeableConnections() - require.NoError(t, err) -} - -func TestLiveTransaction(t *testing.T) { - if !doLive(t) { - return - } - - cases := []struct { - name string - txId string - err gui.APIError - goldenFile string - }{ - { - name: "invalid txId", - txId: "abcd", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - Invalid hex length\n", - }, - }, - { - name: "empty txId", - txId: "", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - txid is empty\n", - }, - }, - { - name: "OK", - txId: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", - goldenFile: "./transaction.golden", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - tx, err := c.Transaction(tc.txId) - if err != nil { - require.Equal(t, tc.err, err) - return - } - var expected *visor.ReadableTransaction - loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) - require.Equal(t, expected, &tx.Transaction) - }) - } -} - -func TestStableTransaction(t *testing.T) { - if !doStable(t) { - return - } - - cases := []struct { - name string - txId string - err gui.APIError - goldenFile string - }{ - { - name: "invalid txId", - txId: "abcd", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - Invalid hex length\n", - }, - goldenFile: "", - }, - { - name: "not exist", - txId: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", - err: gui.APIError{ - Status: "404 Not Found", - StatusCode: http.StatusNotFound, - Message: "404 Not Found\n", - }, - goldenFile: "", - }, - { - name: "empty txId", - txId: "", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - txid is empty\n", - }, - goldenFile: "", - }, - { - name: "genesis transaction", - txId: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - goldenFile: "genesis-transaction.golden", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - tx, err := c.Transaction(tc.txId) - if err != nil { - require.Equal(t, tc.err, err) - return - } - - var expected *visor.ReadableTransaction - loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) - require.Equal(t, expected, &tx.Transaction) - }) - } -} - -func TestLiveTransactions(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - addrs := []string{ - "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - } - txns, err := c.Transactions(addrs) - require.NoError(t, err) - require.True(t, len(*txns) > 0) -} - -func TestStableTransactions(t *testing.T) { - if !doStable(t) { - return - } - - cases := []struct { - name string - addrs []string - err gui.APIError - goldenFile string - }{ - { - name: "invalid addr length", - addrs: []string{"abcd"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", - }, - }, - { - name: "invalid addr character", - addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", - }, - }, - { - name: "invalid checksum", - addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", - }, - }, - { - name: "empty addrs", - addrs: []string{}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - txId is empty\n", - }, - goldenFile: "./empty-addrs.golden", - }, - { - name: "single addr", - addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, - goldenFile: "./single-addr.golden", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txResult, err := c.Transactions(tc.addrs) - if err != nil { - require.Equal(t, tc.err, err, "case: "+tc.name) - return - } - - var expected *[]daemon.TransactionResult - loadGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) - require.Equal(t, expected, txResult, "case: "+tc.name) - }) - } -} - -func TestLiveConfirmedTransactions(t *testing.T) { - if !doLive(t) { - return - } - c := gui.NewClient(nodeAddress()) - - ctxsSingle, err := c.ConfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) - require.NoError(t, err) - require.True(t, len(*ctxsSingle) > 0) - - ctxsAll, err := c.ConfirmedTransactions([]string{}) - require.NoError(t, err) - require.True(t, len(*ctxsAll) > 0) - require.True(t, len(*ctxsAll) > len(*ctxsSingle)) -} - -func TestStableConfirmedTransactions(t *testing.T) { - if !doStable(t) { - return - } - cases := []struct { - name string - addrs []string - err gui.APIError - goldenFile string - }{ - { - name: "invalid addr length", - addrs: []string{"abcd"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", - }, - }, - { - name: "invalid addr character", - addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", - }, - }, - { - name: "invalid checksum", - addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", - }, - }, - { - name: "empty addrs", - addrs: []string{}, - goldenFile: "./empty-addrs.golden", - }, - { - name: "single addr", - addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, - goldenFile: "./single-addr.golden", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txResult, err := c.ConfirmedTransactions(tc.addrs) - if err != nil { - require.Equal(t, tc.err, err, "case: "+tc.name) - return - } - - var expected *[]daemon.TransactionResult - loadGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) - require.Equal(t, expected, txResult, "case: "+tc.name) - }) - } -} - -func TestStableUnconfirmedTransactions(t *testing.T) { - if !doStable(t) { - return - } - cases := []struct { - name string - addrs []string - err gui.APIError - goldenFile string - }{ - { - name: "invalid addr length", - addrs: []string{"abcd"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", - }, - }, - { - name: "invalid addr character", - addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", - }, - }, - { - name: "invalid checksum", - addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", - }, - }, - { - name: "empty addrs", - addrs: []string{}, - goldenFile: "./empty-addrs-unconfirmed-txs.golden", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txResult, err := c.UnconfirmedTransactions(tc.addrs) - if err != nil { - require.Equal(t, tc.err, err, "case: "+tc.name) - return - } - - var expected *[]daemon.TransactionResult - loadGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) - require.Equal(t, expected, txResult, "case: "+tc.name) - }) - } -} - -func TestLiveUnconfirmedTransactions(t *testing.T) { - if !doLive(t) { - return - } - c := gui.NewClient(nodeAddress()) - - cTxsSingle, err := c.UnconfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) - require.NoError(t, err) - require.True(t, len(*cTxsSingle) >= 0) - - cTxsAll, err := c.UnconfirmedTransactions([]string{}) - require.NoError(t, err) - require.True(t, len(*cTxsAll) >= 0) - require.True(t, len(*cTxsAll) >= len(*cTxsSingle)) -} - -func TestStableResendUnconfirmedTransactions(t *testing.T) { - if !doStable(t) { - return - } - c := gui.NewClient(nodeAddress()) - res, err := c.ResendUnconfirmedTransactions() - require.NoError(t, err) - require.True(t, len(res.Txids) == 0) -} - -func TestLiveResendUnconfirmedTransactions(t *testing.T) { - if !doLive(t) { - return - } - c := gui.NewClient(nodeAddress()) - _, err := c.ResendUnconfirmedTransactions() - require.NoError(t, err) -} - -func TestStableRawTransaction(t *testing.T) { - if !doStable(t) { - return - } - - cases := []struct { - name string - txId string - err gui.APIError - rawTx string - }{ - { - name: "invalid hex length", - txId: "abcd", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - Invalid hex length\n", - }, - }, - { - name: "not found", - txId: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", - err: gui.APIError{ - Status: "404 Not Found", - StatusCode: http.StatusNotFound, - Message: "404 Not Found\n", - }, - }, - { - name: "odd length hex string", - txId: "abcdeffedca", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - encoding/hex: odd length hex string\n", - }, - }, - { - name: "OK", - txId: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txResult, err := c.RawTransaction(tc.txId) - if err != nil { - require.Equal(t, tc.err, err, "case: "+tc.name) - return - } - require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) - }) - } -} - -func TestLiveRawTransaction(t *testing.T) { - if !doLive(t) { - return - } - - cases := []struct { - name string - txId string - err gui.APIError - rawTx string - }{ - { - name: "invalid hex length", - txId: "abcd", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - Invalid hex length\n", - }, - }, - { - name: "odd length hex string", - txId: "abcdeffedca", - err: gui.APIError{ - Status: "400 Bad Request", - StatusCode: http.StatusBadRequest, - Message: "400 Bad Request - encoding/hex: odd length hex string\n", - }, - }, - { - name: "OK - genesis tx", - txId: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", - }, - { - name: "OK", - txId: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", - rawTx: "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txResult, err := c.RawTransaction(tc.txId) - if err != nil { - require.Equal(t, tc.err, err, "case: "+tc.name) - return - } - require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) - }) - } -} - -func TestWalletNewSeed(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - cases := []struct { - name string - entropy int - numWords int - errCode int - errMsg string - }{ - { - name: "entropy 128", - entropy: 128, - numWords: 12, - }, - { - name: "entropy 256", - entropy: 256, - numWords: 24, - }, - { - name: "entropy 100", - entropy: 100, - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - entropy length must be 128 or 256\n", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - seed, err := c.NewSeed(tc.entropy) - if tc.errMsg != "" { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - - require.NoError(t, err) - words := strings.Split(seed, " ") - require.Len(t, words, tc.numWords) - - // no extra whitespace on the seed - require.Equal(t, seed, strings.TrimSpace(seed)) - - // should generate a different seed each time - seed2, err := c.NewSeed(tc.entropy) - require.NoError(t, err) - require.NotEqual(t, seed, seed2) - }) - } -} - -type addressTransactionsTestCase struct { - name string - address string - golden string - errCode int - errMsg string -} - -func TestStableAddressTransactions(t *testing.T) { - if !doStable(t) { - return - } - - cases := []addressTransactionsTestCase{ - { - name: "address with transactions", - address: "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - golden: "address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden", - }, - { - name: "address without transactions", - address: "2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9", - golden: "address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden", - }, - { - name: "invalid address", - address: "prRXwTcDK24hs6AFxj", - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - invalid address\n", - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txns, err := c.AddressTransactions(tc.address) - if tc.errMsg != "" { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - - require.NoError(t, err) - - var expected []gui.ReadableTransaction - loadGoldenFile(t, tc.golden, TestData{txns, &expected}) - require.Equal(t, expected, txns) - }) - } -} - -func TestLiveAddressTransactions(t *testing.T) { - if !doLive(t) { - return - } - - cases := []addressTransactionsTestCase{ - { - name: "address with transactions", - // This is the first distribution address which has spent all of its coins - // It's transactions list should not change, unless someone sends coins to it - address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - golden: "address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", - }, - { - name: "address without transactions", - // This is a randomly generated address, never used - // It should never see new transactions - // (if it ever does, somebody managed to generate this address for use and there is a serious bug) - address: "2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D", - golden: "address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden", - }, - { - name: "invalid address", - address: "prRXwTcDK24hs6AFxj", - errCode: http.StatusBadRequest, - errMsg: "400 Bad Request - invalid address\n", - }, - } - - c := gui.NewClient(nodeAddress()) - // Get current blockchain height - bp, err := c.BlockchainProgress() - require.NoError(t, err) - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - txns, err := c.AddressTransactions(tc.address) - if tc.errMsg != "" { - assertResponseError(t, err, tc.errCode, tc.errMsg) - return - } - - require.NoError(t, err) - - var expected []gui.ReadableTransaction - loadGoldenFile(t, tc.golden, TestData{txns, &expected}) - - // Recaculate the height if it's live test - for i := range expected { - expected[i].Status.Height = bp.Current - expected[i].Status.BlockSeq + 1 - } - - require.Equal(t, expected, txns) - }) - } -} - -func TestStableRichlist(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - richlist, err := c.Richlist(nil) - require.NoError(t, err) - - var expected gui.Richlist - loadGoldenFile(t, "richlist-default.golden", TestData{richlist, &expected}) - require.Equal(t, expected, *richlist) - - richlist, err = c.Richlist(&gui.RichlistParams{ - N: 0, - IncludeDistribution: false, - }) - require.NoError(t, err) - - expected = gui.Richlist{} - loadGoldenFile(t, "richlist-all.golden", TestData{richlist, &expected}) - require.Equal(t, expected, *richlist) - - richlist, err = c.Richlist(&gui.RichlistParams{ - N: 0, - IncludeDistribution: true, - }) - require.NoError(t, err) - - expected = gui.Richlist{} - loadGoldenFile(t, "richlist-all-include-distribution.golden", TestData{richlist, &expected}) - require.Equal(t, expected, *richlist) - - richlist, err = c.Richlist(&gui.RichlistParams{ - N: 8, - IncludeDistribution: false, - }) - require.NoError(t, err) - - expected = gui.Richlist{} - loadGoldenFile(t, "richlist-8.golden", TestData{richlist, &expected}) - require.Equal(t, expected, *richlist) - - richlist, err = c.Richlist(&gui.RichlistParams{ - N: 150, - IncludeDistribution: true, - }) - require.NoError(t, err) - - expected = gui.Richlist{} - loadGoldenFile(t, "richlist-150-include-distribution.golden", TestData{richlist, &expected}) - require.Equal(t, expected, *richlist) -} - -func TestLiveRichlist(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - richlist, err := c.Richlist(nil) - require.NoError(t, err) - - require.NotEmpty(t, richlist.Richlist) - require.Len(t, richlist.Richlist, 20) - - richlist, err = c.Richlist(&gui.RichlistParams{ - N: 150, - IncludeDistribution: true, - }) - require.NoError(t, err) - - require.Len(t, richlist.Richlist, 150) -} - -func TestStableAddressCount(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - count, err := c.AddressCount() - require.NoError(t, err) - - require.Equal(t, uint64(155), count) -} - -func TestLiveAddressCount(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - count, err := c.AddressCount() - require.NoError(t, err) - - // 5296 addresses as of 2018-03-06, the count could decrease but is unlikely to - require.True(t, count > 5000) -} - -func TestStablePendingTransactions(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - txns, err := c.PendingTransactions() - require.NoError(t, err) - require.Empty(t, txns) -} - -func TestLivePendingTransactions(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - _, err := c.PendingTransactions() - require.NoError(t, err) -} - -func TestLiveWalletSpend(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(nodeAddress()) - w, totalCoins, _, password := prepareAndCheckWallet(t, c, 2e6, 2) - - tt := []struct { - name string - to string - coins uint64 - errMsg []byte - checkTx func(t *testing.T, tx *daemon.TransactionResult) - }{ - { - name: "send all coins to the first address", - to: w.Entries[0].Address.String(), - coins: totalCoins, - checkTx: func(t *testing.T, tx *daemon.TransactionResult) { - // Confirms the total output coins are equal to the totalCoins - var coins uint64 - for _, o := range tx.Transaction.Out { - c, err := droplet.FromString(o.Coins) - require.NoError(t, err) - coins += c - } - require.Equal(t, totalCoins, coins) - - // Confirms the address balance are equal to the totalCoins - coins, _ = getAddressBalance(t, c, w.Entries[0].Address.String()) - require.Equal(t, totalCoins, coins) - }, - }, - { - // send 0.003 coin to the second address, - // this amount is chosen to not interfere with TestLiveWalletCreateTransaction - name: "send 0.003 coin to second address", - to: w.Entries[1].Address.String(), - coins: 3e3, - checkTx: func(t *testing.T, tx *daemon.TransactionResult) { - // Confirms there're two outputs, one to the second address, one as change output to the first address. - require.Len(t, tx.Transaction.Out, 2) - - // Gets the output of the second address in the transaction - getAddrOutputInTx := func(t *testing.T, tx *daemon.TransactionResult, addr string) *visor.ReadableTransactionOutput { - for _, output := range tx.Transaction.Out { - if output.Address == addr { - return &output - } - } - t.Fatalf("transaction doesn't have output to address: %v", addr) - return nil - } - - out := getAddrOutputInTx(t, tx, w.Entries[1].Address.String()) - - // Confirms the second address has 0.003 coin - require.Equal(t, out.Coins, "0.003000") - require.Equal(t, out.Address, w.Entries[1].Address.String()) - - coin, err := droplet.FromString(out.Coins) - require.NoError(t, err) - - // Gets the expected change coins - expectChangeCoins := totalCoins - coin - - // Gets the real change coins - changeOut := getAddrOutputInTx(t, tx, w.Entries[0].Address.String()) - changeCoins, err := droplet.FromString(changeOut.Coins) - require.NoError(t, err) - // Confirms the change coins are matched. - require.Equal(t, expectChangeCoins, changeCoins) - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - result, err := c.Spend(w.Filename(), tc.to, tc.coins, password) - if err != nil { - t.Fatalf("spend failed: %v", err) - } - - tk := time.NewTicker(time.Second) - var tx *daemon.TransactionResult - loop: - for { - select { - case <-time.After(30 * time.Second): - t.Fatal("Waiting for transaction to be confirmed timeout") - case <-tk.C: - tx = getTransaction(t, c, result.Transaction.Hash) - if tx.Status.Confirmed { - break loop - } - } - } - tc.checkTx(t, tx) - }) - } - - // Return if wallet is encrypted, cause the rest of the tests will spend a lot of time. - if w.IsEncrypted() { - return - } - - // Confirms sending coins less than 0.001 is not allowed - errMsg := "500 Internal Server Error - Transaction violates soft constraint: invalid amount, too many decimal places\n" - for i := uint64(1); i < uint64(1000); i++ { - cs, err := droplet.ToString(i) - require.NoError(t, err) - name := fmt.Sprintf("send invalid coin %v", cs) - t.Run(name, func(t *testing.T) { - result, err := c.Spend(w.Filename(), w.Entries[0].Address.String(), i, password) - if w.IsEncrypted() && len(password) == 0 { - assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") - return - } - assertResponseError(t, err, http.StatusInternalServerError, errMsg) - require.Nil(t, result) - }) - } -} - -func TestLiveWalletCreateTransaction(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(nodeAddress()) - - w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) - - remainingHours := fee.RemainingHours(totalHours) - require.True(t, remainingHours > 1) - - toDropletString := func(i uint64) string { - x, err := droplet.ToString(i) - require.NoError(t, err) - return x - } - - type testCase struct { - name string - req gui.CreateTransactionRequest - outputs []coin.TransactionOutput - err string - code int - ignoreHours bool - } - - cases := []testCase{ - { - name: "invalid decimals", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: "0.0001", - Hours: "1", - }, - }, - }, - err: "400 Bad Request - to[0].coins has too many decimal places\n", - code: http.StatusBadRequest, - }, - - { - name: "overflowing hours", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: "0.001", - Hours: "1", - }, - { - Address: w.Entries[0].Address.String(), - Coins: "0.001", - Hours: fmt.Sprint(uint64(math.MaxUint64)), - }, - { - Address: w.Entries[0].Address.String(), - Coins: "0.001", - Hours: fmt.Sprint(uint64(math.MaxUint64) - 1), - }, - }, - }, - err: "400 Bad Request - total output hours error: uint64 addition overflow\n", - code: http.StatusBadRequest, - }, - - { - name: "insufficient coins", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: fmt.Sprint(totalCoins + 1), - Hours: "1", - }, - }, - }, - err: "400 Bad Request - balance is not sufficient\n", - code: http.StatusBadRequest, - }, - - { - name: "insufficient hours", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: toDropletString(totalCoins), - Hours: fmt.Sprint(totalHours + 1), - }, - }, - }, - err: "400 Bad Request - hours are not sufficient\n", - code: http.StatusBadRequest, - }, - - { - // NOTE: this test will fail if "totalCoins - 1e3" does not require - // all of the outputs to be spent, e.g. if there is an output with - // "totalCoins - 1e3" coins in it. - // TODO -- Check that the wallet does not have an output of 0.001, - // because then this test cannot be performed, since there is no - // way to use all outputs and produce change in that case. - name: "valid request, manual one output with change", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[1].Address.String(), - Coins: toDropletString(totalCoins - 1e3), - Hours: "1", - }, - }, - }, - outputs: []coin.TransactionOutput{ - { - Address: w.Entries[1].Address, - Coins: totalCoins - 1e3, - Hours: 1, - }, - { - Address: w.Entries[0].Address, - Coins: 1e3, - Hours: remainingHours - 1, - }, - }, - }, - - { - name: "valid request, manual one output no change", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[1].Address.String(), - Coins: toDropletString(totalCoins), - Hours: "1", - }, - }, - }, - outputs: []coin.TransactionOutput{ - { - Address: w.Entries[1].Address, - Coins: totalCoins, - Hours: 1, - }, - }, - }, - - { - name: "valid request, auto one output no change", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: "0.5", - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[1].Address.String(), - Coins: toDropletString(totalCoins), - }, - }, - }, - outputs: []coin.TransactionOutput{ - { - Address: w.Entries[1].Address, - Coins: totalCoins, - Hours: remainingHours / 2, - }, - }, - }, - - { - name: "valid request, auto two outputs with change", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: "0.5", - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[1].Address.String(), - Coins: toDropletString(1e3), - }, - { - Address: w.Entries[1].Address.String(), - Coins: toDropletString(totalCoins - 2e3), - }, - }, - }, - outputs: []coin.TransactionOutput{ - { - Address: w.Entries[1].Address, - Coins: 1e3, - }, - { - Address: w.Entries[1].Address, - Coins: totalCoins - 2e3, - }, - { - Address: w.Entries[0].Address, - Coins: 1e3, - }, - }, - ignoreHours: true, // the hours are too unpredictable - }, - } - - if w.IsEncrypted() { - cases = append(cases, testCase{ - name: "invalid password", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password + "foo", - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: "1000", - Hours: "1", - }, - }, - }, - err: "401 Unauthorized - invalid password\n", - code: http.StatusUnauthorized, - }) - - cases = append(cases, testCase{ - name: "password not provided", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: "", - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: "1000", - Hours: "1", - }, - }, - }, - err: "400 Bad Request - missing password\n", - code: http.StatusBadRequest, - }) - - } else { - cases = append(cases, testCase{ - name: "password provided for unencrypted wallet", - req: gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password + "foo", - }, - ChangeAddress: w.Entries[0].Address.String(), - To: []gui.Receiver{ - { - Address: w.Entries[0].Address.String(), - Coins: "1000", - Hours: "1", - }, - }, - }, - err: "400 Bad Request - wallet is not encrypted\n", - code: http.StatusBadRequest, - }) - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - result, err := c.CreateTransaction(tc.req) - if tc.err != "" { - assertResponseError(t, err, tc.code, tc.err) - return - } - - require.NoError(t, err) - - require.Equal(t, len(tc.outputs), len(result.Transaction.Out)) - - for i, o := range tc.outputs { - require.Equal(t, o.Address.String(), result.Transaction.Out[i].Address) - - coins, err := droplet.FromString(result.Transaction.Out[i].Coins) - require.NoError(t, err) - require.Equal(t, o.Coins, coins, "[%d] %d != %d", i, o.Coins, coins) - - if !tc.ignoreHours { - hours, err := strconv.ParseUint(result.Transaction.Out[i].Hours, 10, 64) - require.NoError(t, err) - require.Equal(t, o.Hours, hours, "[%d] %d != %d", i, o.Hours, hours) - } - } - - assertEncodeTxnMatchesTxn(t, result) - assertRequestedCoins(t, tc.req.To, result.Transaction.Out) - assertCreatedTransactionValid(t, result.Transaction) - - if tc.req.HoursSelection.Type == wallet.HoursSelectionTypeManual { - assertRequestedHours(t, tc.req.To, result.Transaction.Out) - } - }) - } -} - -func TestLiveWalletCreateTransactionRandom(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(nodeAddress()) - - w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) - - if w.IsEncrypted() { - t.Skip("Skipping TestLiveWalletCreateTransactionRandom tests with encrypted wallet") - return - } - - remainingHours := fee.RemainingHours(totalHours) - require.True(t, remainingHours > 1) - - assertTxnOutputCount := func(t *testing.T, changeAddress string, nOutputs int, result *gui.CreateTransactionResponse) { - nResultOutputs := len(result.Transaction.Out) - require.True(t, nResultOutputs == nOutputs || nResultOutputs == nOutputs+1) - hasChange := nResultOutputs == nOutputs+1 - changeOutput := result.Transaction.Out[nResultOutputs-1] - if hasChange { - require.Equal(t, changeOutput.Address, changeAddress) - } - - t.Log("hasChange", hasChange) - if hasChange { - t.Log("changeCoins", changeOutput.Coins) - t.Log("changeHours", changeOutput.Hours) - } - } - - iterations := 250 - maxOutputs := 10 - destAddrs := make([]cipher.Address, maxOutputs) - for i := range destAddrs { - destAddrs[i] = testutil.MakeAddress() - } - - for i := 0; i < iterations; i++ { - t.Log("iteration", i) - t.Log("totalCoins", totalCoins) - t.Log("totalHours", totalHours) - - spendableHours := fee.RemainingHours(totalHours) - t.Log("spendableHours", spendableHours) - - coins := rand.Intn(int(totalCoins)) + 1 - coins -= coins % int(visor.MaxDropletDivisor()) - if coins == 0 { - coins = int(visor.MaxDropletDivisor()) - } - hours := rand.Intn(int(spendableHours + 1)) - nOutputs := rand.Intn(maxOutputs) + 1 - - t.Log("sendCoins", coins) - t.Log("sendHours", hours) - - changeAddress := w.Entries[0].Address.String() - - shareFactor := strconv.FormatFloat(rand.Float64(), 'f', 8, 64) - - t.Log("shareFactor", shareFactor) - - to := make([]gui.Receiver, 0, nOutputs) - remainingHours := hours - remainingCoins := coins - for i := 0; i < nOutputs; i++ { - if remainingCoins == 0 { - break - } - - receiver := gui.Receiver{} - receiver.Address = destAddrs[rand.Intn(len(destAddrs))].String() - - if i == nOutputs-1 { - var err error - receiver.Coins, err = droplet.ToString(uint64(remainingCoins)) - require.NoError(t, err) - receiver.Hours = fmt.Sprint(remainingHours) - - remainingCoins = 0 - remainingHours = 0 - } else { - receiverCoins := rand.Intn(remainingCoins) + 1 - receiverCoins -= receiverCoins % int(visor.MaxDropletDivisor()) - if receiverCoins == 0 { - receiverCoins = int(visor.MaxDropletDivisor()) - } - - var err error - receiver.Coins, err = droplet.ToString(uint64(receiverCoins)) - require.NoError(t, err) - remainingCoins -= receiverCoins - - receiverHours := rand.Intn(remainingHours + 1) - receiver.Hours = fmt.Sprint(receiverHours) - remainingHours -= receiverHours - } - - to = append(to, receiver) - } - - // Remove duplicate outputs - dup := make(map[gui.Receiver]struct{}, len(to)) - newTo := make([]gui.Receiver, 0, len(dup)) - for _, o := range to { - if _, ok := dup[o]; !ok { - dup[o] = struct{}{} - newTo = append(newTo, o) - } - } - to = newTo - - nOutputs = len(to) - t.Log("nOutputs", nOutputs) - - for i := range to { - j := rand.Intn(i + 1) - to[i], to[j] = to[j], to[i] - } - - // TODO -- use rand.Shuffle [go1.10 only] - // rand.Shuffle(len(to), func(i, j int) { - // to[i], to[j] = to[j], to[i] - // }) - - for i, o := range to { - t.Logf("to[%d].Hours %s\n", i, o.Hours) - } - - autoTo := make([]gui.Receiver, len(to)) - for i, o := range to { - autoTo[i] = gui.Receiver{ - Address: o.Address, - Coins: o.Coins, - Hours: "", - } - } - - // Remove duplicate outputs - dup = make(map[gui.Receiver]struct{}, len(autoTo)) - newAutoTo := make([]gui.Receiver, 0, len(dup)) - for _, o := range autoTo { - if _, ok := dup[o]; !ok { - dup[o] = struct{}{} - newAutoTo = append(newAutoTo, o) - } - } - autoTo = newAutoTo - - nAutoOutputs := len(autoTo) - t.Log("nAutoOutputs", nAutoOutputs) - - for i, o := range autoTo { - t.Logf("autoTo[%d].Coins %s\n", i, o.Coins) - } - - // Auto, random share factor - - result, err := c.CreateTransaction(gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: shareFactor, - }, - ChangeAddress: changeAddress, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - To: autoTo, - }) - require.NoError(t, err) - - assertEncodeTxnMatchesTxn(t, result) - assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) - assertRequestedCoins(t, autoTo, result.Transaction.Out) - assertCreatedTransactionValid(t, result.Transaction) - - // Auto, share factor 0 - - result, err = c.CreateTransaction(gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: "0", - }, - ChangeAddress: changeAddress, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - To: autoTo, - }) - require.NoError(t, err) - - assertEncodeTxnMatchesTxn(t, result) - assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) - assertRequestedCoins(t, autoTo, result.Transaction.Out) - assertCreatedTransactionValid(t, result.Transaction) - - // Check that the non-change outputs have 0 hours - for _, o := range result.Transaction.Out[:nAutoOutputs] { - require.Equal(t, "0", o.Hours) - } - - // Auto, share factor 1 - - result, err = c.CreateTransaction(gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: "1", - }, - ChangeAddress: changeAddress, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - To: autoTo, - }) - require.NoError(t, err) - - assertEncodeTxnMatchesTxn(t, result) - assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) - assertRequestedCoins(t, autoTo, result.Transaction.Out) - assertCreatedTransactionValid(t, result.Transaction) - - // Check that the change output has 0 hours - if len(result.Transaction.Out) > nAutoOutputs { - require.Equal(t, "0", result.Transaction.Out[nAutoOutputs].Hours) - } - - // Manual - - result, err = c.CreateTransaction(gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - ChangeAddress: changeAddress, - Wallet: gui.CreateTransactionRequestWallet{ - ID: w.Filename(), - Password: password, - }, - To: to, - }) - require.NoError(t, err) - - assertEncodeTxnMatchesTxn(t, result) - assertTxnOutputCount(t, changeAddress, nOutputs, result) - assertRequestedCoins(t, to, result.Transaction.Out) - assertRequestedHours(t, to, result.Transaction.Out) - assertCreatedTransactionValid(t, result.Transaction) - } -} - -func assertEncodeTxnMatchesTxn(t *testing.T, result *gui.CreateTransactionResponse) { - require.NotEmpty(t, result.EncodedTransaction) - emptyTxn := &coin.Transaction{} - require.NotEqual(t, hex.EncodeToString(emptyTxn.Serialize()), result.EncodedTransaction) - txn, err := result.Transaction.ToTransaction() - require.NoError(t, err) - - serializedTxn := txn.Serialize() - require.Equal(t, hex.EncodeToString(serializedTxn), result.EncodedTransaction) - - require.Equal(t, int(txn.Length), len(serializedTxn)) -} - -func assertRequestedCoins(t *testing.T, to []gui.Receiver, out []gui.CreatedTransactionOutput) { - var requestedCoins uint64 - for _, o := range to { - c, err := droplet.FromString(o.Coins) - require.NoError(t, err) - requestedCoins += c - } - - var sentCoins uint64 - for _, o := range out[:len(to)] { // exclude change output - c, err := droplet.FromString(o.Coins) - require.NoError(t, err) - sentCoins += c - } - - require.Equal(t, requestedCoins, sentCoins) -} - -func assertRequestedHours(t *testing.T, to []gui.Receiver, out []gui.CreatedTransactionOutput) { - for i, o := range out[:len(to)] { // exclude change output - toHours, err := strconv.ParseUint(to[i].Hours, 10, 64) - require.NoError(t, err) - - outHours, err := strconv.ParseUint(o.Hours, 10, 64) - - require.Equal(t, toHours, outHours) - } -} - -func assertCreatedTransactionValid(t *testing.T, r gui.CreatedTransaction) { - require.NotEmpty(t, r.In) - require.NotEmpty(t, r.Out) - - fee, err := strconv.ParseUint(r.Fee, 10, 64) - require.NoError(t, err) - - require.NotEqual(t, uint64(0), fee) - - var inputHours uint64 - var inputCoins uint64 - for _, in := range r.In { - calculatedHours, err := strconv.ParseUint(in.CalculatedHours, 10, 64) - require.NoError(t, err) - inputHours, err = coin.AddUint64(inputHours, calculatedHours) - require.NoError(t, err) - - hours, err := strconv.ParseUint(in.Hours, 10, 64) - require.NoError(t, err) - - require.True(t, hours <= calculatedHours) - - coins, err := droplet.FromString(in.Coins) - require.NoError(t, err) - inputCoins, err = coin.AddUint64(inputCoins, coins) - require.NoError(t, err) - } - - var outputHours uint64 - var outputCoins uint64 - for _, out := range r.Out { - hours, err := strconv.ParseUint(out.Hours, 10, 64) - require.NoError(t, err) - outputHours, err = coin.AddUint64(outputHours, hours) - require.NoError(t, err) - - coins, err := droplet.FromString(out.Coins) - require.NoError(t, err) - outputCoins, err = coin.AddUint64(outputCoins, coins) - require.NoError(t, err) - } - - require.True(t, inputHours > outputHours) - require.Equal(t, inputHours-outputHours, fee) - - require.Equal(t, inputCoins, outputCoins) - - require.Equal(t, uint8(0), r.Type) - require.NotEmpty(t, r.Length) -} - -func TestCreateWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - w, seed, clean := createWallet(t, c, false, "") - defer clean() - require.False(t, w.Meta.Encrypted) - - walletDir := getWalletDir(t, c) - - // Confirms the wallet does exist - walletPath := filepath.Join(walletDir, w.Meta.Filename) - _, err := os.Stat(walletPath) - require.NoError(t, err) - - // Loads the wallet and confirms that the wallet has the same seed - lw, err := wallet.Load(walletPath) - require.NoError(t, err) - require.False(t, lw.IsEncrypted()) - require.Equal(t, seed, lw.Meta["seed"]) - require.Equal(t, len(w.Entries), len(lw.Entries)) - - for i := range w.Entries { - require.Equal(t, w.Entries[i].Address, lw.Entries[i].Address.String()) - require.Equal(t, w.Entries[i].Public, lw.Entries[i].Public.Hex()) - } - - // Creates wallet with encryption - encW, _, encWClean := createWallet(t, c, true, "pwd") - defer encWClean() - require.True(t, encW.Meta.Encrypted) - - walletPath = filepath.Join(walletDir, encW.Meta.Filename) - encLW, err := wallet.Load(walletPath) - require.NoError(t, err) - - // Confirms the loaded wallet is encrypted and has the same address entries - require.True(t, encLW.IsEncrypted()) - require.Equal(t, len(encW.Entries), len(encLW.Entries)) - - for i := range encW.Entries { - require.Equal(t, encW.Entries[i].Address, encLW.Entries[i].Address.String()) - require.Equal(t, encW.Entries[i].Public, encLW.Entries[i].Public.Hex()) - } -} - -func TestGetWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Create a wallet - w, _, clean := createWallet(t, c, false, "") - defer clean() - - // Confirms the wallet can be acquired - w1, err := c.Wallet(w.Meta.Filename) - require.NoError(t, err) - require.Equal(t, *w, *w1) -} - -func TestGetWallets(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Creates 2 new wallets - var ws []gui.WalletResponse - for i := 0; i < 2; i++ { - w, _, clean := createWallet(t, c, false, "") - defer clean() - // cleaners = append(cleaners, clean) - ws = append(ws, *w) - } - - // Gets wallet from node - wlts, err := c.Wallets() - require.NoError(t, err) - - // Create the wallet map - walletMap := make(map[string]gui.WalletResponse) - for _, w := range wlts { - walletMap[w.Meta.Filename] = *w - } - - // Confirms the returned wallets contains the wallet we created. - for _, w := range ws { - retW, ok := walletMap[w.Meta.Filename] - require.True(t, ok) - require.Equal(t, w, retW) - } -} - -// TestWalletNewAddress will generate 30 wallets for testing, and they will -// be removed automatically after testing. -func TestWalletNewAddress(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - // We only test 30 cases, cause the more addresses we generate, the longer - // it takes, we don't want to spend much time here. - for i := 1; i <= 30; i++ { - name := fmt.Sprintf("generate %v addresses", i) - t.Run(name, func(t *testing.T) { - c := gui.NewClient(nodeAddress()) - var encrypt bool - var password string - // Test wallet with encryption only when i == 2, so that - // the tests won't time out. - if i == 2 { - encrypt = true - password = "pwd" - } - - w, seed, clean := createWallet(t, c, encrypt, password) - defer clean() - - addrs, err := c.NewWalletAddress(w.Meta.Filename, i, password) - if err != nil { - t.Fatalf("%v", err) - return - } - require.NoError(t, err) - - seckeys := cipher.GenerateDeterministicKeyPairs([]byte(seed), i+1) - var as []string - for _, k := range seckeys { - as = append(as, cipher.AddressFromSecKey(k).String()) - } - - // Confirms thoses new generated addresses are the same. - require.Equal(t, len(addrs), len(as)-1) - for i := range addrs { - require.Equal(t, as[i+1], addrs[i]) - } - }) - } -} - -func TestStableWalletBalance(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - w, _, clean := createWallet(t, c, false, "") - defer clean() - - bp, err := c.WalletBalance(w.Meta.Filename) - require.NoError(t, err) - - var expect wallet.BalancePair - loadGoldenFile(t, "wallet-balance.golden", TestData{bp, &expect}) - require.Equal(t, expect, *bp) -} - -func TestLiveWalletBalance(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(nodeAddress()) - _, walletName, _ := getWalletFromEnv(t, c) - bp, err := c.WalletBalance(walletName) - require.NoError(t, err) - require.NotNil(t, bp) -} - -func TestWalletUpdate(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - w, _, clean := createWallet(t, c, false, "") - defer clean() - - err := c.UpdateWallet(w.Meta.Filename, "new wallet") - require.NoError(t, err) - - // Confirms the wallet has label of "new wallet" - w1, err := c.Wallet(w.Meta.Filename) - require.NoError(t, err) - require.Equal(t, w1.Meta.Label, "new wallet") -} - -func TestStableWalletTransactions(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - w, _, clean := createWallet(t, c, false, "") - defer clean() - - txns, err := c.WalletTransactions(w.Meta.Filename) - require.NoError(t, err) - - var expect gui.UnconfirmedTxnsResponse - loadGoldenFile(t, "wallet-transactions.golden", TestData{txns, &expect}) - require.Equal(t, expect, *txns) -} - -func TestLiveWalletTransactions(t *testing.T) { - if !doLive(t) { - return - } - - requireWalletEnv(t) - - c := gui.NewClient(nodeAddress()) - w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) - txns, err := c.WalletTransactions(w.Filename()) - require.NoError(t, err) - - bp, err := c.WalletBalance(w.Filename()) - require.NoError(t, err) - // There's pending transactions if predicted coins are not the same as confirmed coins - if bp.Predicted.Coins != bp.Confirmed.Coins { - require.NotEmpty(t, txns.Transactions) - return - } - - require.Empty(t, txns.Transactions) -} - -func TestWalletFolderName(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - folderName, err := c.WalletFolderName() - require.NoError(t, err) - - require.NotNil(t, folderName) - require.NotEmpty(t, folderName.Address) -} - -func TestEncryptWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Create a unencrypted wallet - w, _, clean := createWallet(t, c, false, "") - defer clean() - - // Encrypts the wallet - rlt, err := c.EncryptWallet(w.Meta.Filename, "pwd") - require.NoError(t, err) - require.NotEmpty(t, rlt.Meta.CryptoType) - require.True(t, rlt.Meta.Encrypted) - - // Encrypt the wallet again, should returns error - _, err = c.EncryptWallet(w.Meta.Filename, "pwd") - assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is encrypted\n") - - // Confirms that no sensitive data do exist in wallet file - wf, err := c.WalletFolderName() - require.NoError(t, err) - wltPath := filepath.Join(wf.Address, w.Meta.Filename) - lw, err := wallet.Load(wltPath) - require.NoError(t, err) - require.Empty(t, lw.Meta["seed"]) - require.Empty(t, lw.Meta["lastSeed"]) - require.NotEmpty(t, lw.Meta["secrets"]) - - // Decrypts the wallet, and confirms that the - // seed and address entries are the same as it was before being encrypted. - dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") - require.NoError(t, err) - require.Equal(t, w, dw) -} - -func TestDecryptWallet(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - w, seed, clean := createWallet(t, c, true, "pwd") - defer clean() - - // Decrypt wallet with different password, must fail - _, err := c.DecryptWallet(w.Meta.Filename, "pwd1") - assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") - - // Decrypt wallet with no password, must fail - _, err = c.DecryptWallet(w.Meta.Filename, "") - assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") - - // Decrypts wallet with correct password - dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") - require.NoError(t, err) - - // Confirms that no sensitive data are returned - require.Empty(t, dw.Meta.CryptoType) - require.False(t, dw.Meta.Encrypted) - - // Loads wallet from file - wf, err := c.WalletFolderName() - require.NoError(t, err) - wltPath := filepath.Join(wf.Address, w.Meta.Filename) - lw, err := wallet.Load(wltPath) - require.NoError(t, err) - - require.Equal(t, lw.Meta["seed"], seed) - require.Len(t, lw.Entries, 1) - - // Confirms the last seed is matched - lseed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 1) - require.Equal(t, hex.EncodeToString(lseed), lw.Meta["lastSeed"]) - - // Confirms that the first address is derivied from the private key - pubkey := cipher.PubKeyFromSecKey(seckeys[0]) - require.Equal(t, w.Entries[0].Address, cipher.AddressFromPubKey(pubkey).String()) - require.Equal(t, lw.Entries[0].Address.String(), w.Entries[0].Address) -} - -func TestGetWalletSeedDisabledAPI(t *testing.T) { - if !doDisableSeedApi(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Create an encrypted wallet - w, _, clean := createWallet(t, c, true, "pwd") - defer clean() - - _, err := c.GetWalletSeed(w.Meta.Filename, "pwd") - assertResponseError(t, err, http.StatusForbidden, "403 Forbidden\n") -} - -func TestGetWalletSeedEnabledAPI(t *testing.T) { - if !doLiveOrStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - // Create an encrypted wallet - w, seed, clean := createWallet(t, c, true, "pwd") - defer clean() - - require.NotEmpty(t, seed) - - sd, err := c.GetWalletSeed(w.Meta.Filename, "pwd") - require.NoError(t, err) - - // Confirms the seed are matched - require.Equal(t, seed, sd) - - // Get seed of wrong wallet id - _, err = c.GetWalletSeed("w.wlt", "pwd") - assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") - - // Check with invalid password - _, err = c.GetWalletSeed(w.Meta.Filename, "wrong password") - assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") - - // Check with missing password - _, err = c.GetWalletSeed(w.Meta.Filename, "") - assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") - - // Create unencrypted wallet to check against - nw, _, nclean := createWallet(t, c, false, "") - defer nclean() - _, err = c.GetWalletSeed(nw.Meta.Filename, "pwd") - assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is not encrypted\n") -} - -// prepareAndCheckWallet gets wallet from environment, and confirms: -// 1. The minimal coins and coin hours requirements are met. -// 2. The wallet has at least two address entry. -// Returns the loaded wallet, total coins, total coin hours and password of the wallet. -func prepareAndCheckWallet(t *testing.T, c *gui.Client, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64, string) { - walletDir, walletName, password := getWalletFromEnv(t, c) - walletPath := filepath.Join(walletDir, walletName) - - // Checks if the wallet does exist - if _, err := os.Stat(walletPath); os.IsNotExist(err) { - t.Fatalf("Wallet %v doesn't exist", walletPath) - } - - w, err := wallet.Load(walletPath) - if err != nil { - t.Fatalf("Load wallet %v failed: %v", walletPath, err) - } - - if w.IsEncrypted() && password == "" { - t.Fatalf("Wallet is encrypted, must set WALLET_PASSWORD env var") - } - - // Generate more addresses if address entries less than 2. - if len(w.Entries) < 2 { - _, err := c.NewWalletAddress(w.Filename(), 2-len(w.Entries), password) - if err != nil { - t.Fatalf("New wallet address failed: %v", err) - } - - w, err = wallet.Load(walletPath) - if err != nil { - t.Fatalf("Reload wallet %v failed: %v", walletPath, err) - } - } - - coins, hours := getWalletBalance(t, c, walletName) - if coins < miniCoins { - t.Fatalf("Wallet must have at least %d coins", miniCoins) - } - - if hours < miniCoinHours { - t.Fatalf("Wallet must have at least %d coin hours", miniCoinHours) - } - - if err := w.Save(walletDir); err != nil { - t.Fatalf("%v", err) - } - - return w, coins, hours, password -} - -// getWalletFromEnv loads wallet from envrionment variables. -// Returns wallet dir, wallet name and wallet password is any. -func getWalletFromEnv(t *testing.T, c *gui.Client) (string, string, string) { - walletDir := getWalletDir(t, c) - - walletName := os.Getenv("WALLET_NAME") - if walletName == "" { - t.Fatal("Missing WALLET_NAME environment value") - } - - walletPassword := os.Getenv("WALLET_PASSWORD") - return walletDir, walletName, walletPassword -} - -func requireWalletEnv(t *testing.T) { - if !doLiveWallet(t) { - return - } - - walletName := os.Getenv("WALLET_NAME") - if walletName == "" { - t.Fatal("missing WALLET_NAME environment value") - } -} - -// getWalletBalance gets wallet balance. -// Returns coins and hours -func getWalletBalance(t *testing.T, c *gui.Client, walletName string) (uint64, uint64) { - wp, err := c.WalletBalance(walletName) - if err != nil { - t.Fatalf("Get wallet balance of %v failed: %v", walletName, err) - } - - return wp.Confirmed.Coins, wp.Confirmed.Hours -} - -func getTransaction(t *testing.T, c *gui.Client, txid string) *daemon.TransactionResult { - tx, err := c.Transaction(txid) - if err != nil { - t.Fatalf("%v", err) - } - - return tx -} - -// getAddressBalance gets balance of given address. -// Returns coins and coin hours. -func getAddressBalance(t *testing.T, c *gui.Client, addr string) (uint64, uint64) { - bp, err := c.Balance([]string{addr}) - if err != nil { - t.Fatalf("%v", err) - } - return bp.Confirmed.Coins, bp.Confirmed.Hours -} - -func checkNoSensitiveData(t *testing.T, w *wallet.Wallet) { - require.Empty(t, w.Meta["seed"]) - require.Empty(t, w.Meta["lastSeed"]) - require.Empty(t, w.Meta["secrets"]) - for _, e := range w.Entries { - require.Equal(t, cipher.SecKey{}, e.Secret) - } -} - -// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied -// from the seed. -func checkWalletEntriesAndLastSeed(t *testing.T, w *wallet.Wallet) { - seed, ok := w.Meta["seed"] - require.True(t, ok) - newSeed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), len(w.Entries)) - require.Len(t, seckeys, len(w.Entries)) - for i, sk := range seckeys { - require.Equal(t, w.Entries[i].Secret, sk) - pk := cipher.PubKeyFromSecKey(sk) - require.Equal(t, w.Entries[i].Public, pk) - } - lastSeed, ok := w.Meta["lastSeed"] - require.True(t, ok) - require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) -} - -// createWallet creates a wallet with rand seed. -// Returns the generated wallet, seed and clean up function. -func createWallet(t *testing.T, c *gui.Client, encrypt bool, password string) (*gui.WalletResponse, string, func()) { - seed := hex.EncodeToString(cipher.RandByte(32)) - // Use the first 6 letter of the seed as label. - var w *gui.WalletResponse - var err error - if encrypt { - w, err = c.CreateEncryptedWallet(seed, seed[:6], password, 0) - } else { - w, err = c.CreateUnencryptedWallet(seed, seed[:6], 0) - } - - require.NoError(t, err) - - walletDir := getWalletDir(t, c) - - return w, seed, func() { - // Cleaner function to delete the wallet and bak wallet - walletPath := filepath.Join(walletDir, w.Meta.Filename) - err = os.Remove(walletPath) - require.NoError(t, err) - - bakWalletPath := walletPath + ".bak" - if _, err := os.Stat(bakWalletPath); !os.IsNotExist(err) { - // Return directly if no .bak file does exist - err = os.Remove(bakWalletPath) - } - - require.NoError(t, err) - - // Removes the wallet from memory - c.UnloadWallet(w.Meta.Filename) - } -} - -func getWalletDir(t *testing.T, c *gui.Client) string { - wf, err := c.WalletFolderName() - if err != nil { - t.Fatalf("%v", err) - } - return wf.Address -} - -func TestDisableWalletApi(t *testing.T) { - if !doDisableWalletApi(t) { - return - } - - tt := []struct { - name string - method string - endpoint string - contentType string - body func() io.Reader - json func() interface{} - expectErr string - code int - }{ - { - name: "get wallet", - method: http.MethodGet, - endpoint: "/wallet?id=test.wlt", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "create wallet", - method: http.MethodPost, - endpoint: "/wallet/create", - body: func() io.Reader { - v := url.Values{} - v.Add("seed", "seed") - v.Add("label", "label") - v.Add("scan", "1") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "generate new address", - method: http.MethodPost, - endpoint: "/wallet/newAddress", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "get wallet balance", - method: http.MethodGet, - endpoint: "/wallet/balance?id=test.wlt", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "wallet spending", - method: http.MethodPost, - endpoint: "/wallet/spend", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - v.Add("coins", "100000") // 1e5 - v.Add("dst", "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "get wallet unconfirmed transactions", - method: http.MethodGet, - endpoint: "/wallet/transactions?id=test.wlt", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "update wallet label", - method: http.MethodPost, - endpoint: "/wallet/update", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - v.Add("label", "label") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "new seed", - method: http.MethodGet, - endpoint: "/wallet/newSeed", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "get wallets", - method: http.MethodGet, - endpoint: "/wallets", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "get wallets folder name", - method: http.MethodGet, - endpoint: "/wallets/folderName", - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "main index.html 404 not found", - method: http.MethodGet, - endpoint: "/", - expectErr: "404 page not found\n", - code: http.StatusNotFound, - }, - { - name: "encrypt wallet", - method: http.MethodPost, - endpoint: "/wallet/encrypt", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - v.Add("password", "pwd") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "decrypt wallet", - method: http.MethodPost, - endpoint: "/wallet/decrypt", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - v.Add("password", "pwd") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "get wallet seed", - method: http.MethodPost, - endpoint: "/wallet/seed", - body: func() io.Reader { - v := url.Values{} - v.Add("id", "test.wlt") - v.Add("password", "pwd") - return strings.NewReader(v.Encode()) - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - { - name: "create transaction", - method: http.MethodPost, - endpoint: "/wallet/transaction", - contentType: "application/json", - json: func() interface{} { - return gui.CreateTransactionRequest{ - HoursSelection: gui.HoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: gui.CreateTransactionRequestWallet{ - ID: "test.wlt", - }, - ChangeAddress: testutil.MakeAddress().String(), - To: []gui.Receiver{ - { - Address: testutil.MakeAddress().String(), - Coins: "0.001", - Hours: "1", - }, - }, - } - }, - expectErr: "403 Forbidden\n", - code: http.StatusForbidden, - }, - } - - c := gui.NewClient(nodeAddress()) - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - var err error - switch tc.method { - case http.MethodGet: - err = c.Get(tc.endpoint, nil) - case http.MethodPost: - switch tc.contentType { - case "application/json": - err = c.PostJSON(tc.endpoint, tc.json(), nil) - default: - err = c.PostForm(tc.endpoint, tc.body(), nil) - } - } - assertResponseError(t, err, tc.code, tc.expectErr) - }) - } - - // Confirms that no new wallet is created - // WALLET_DIR environment variable is set in ci-script/integration-test-disable-wallet-api.sh - walletDir := os.Getenv("WALLET_DIR") - if walletDir == "" { - t.Fatal("WALLET_DIR is not set") - } - - // Confirms that the wallet directory does not exist - _, err := os.Stat(walletDir) - require.True(t, os.IsNotExist(err)) -} - -func checkHealthResponse(t *testing.T, r *gui.HealthResponse) { - require.NotEmpty(t, r.BlockchainMetadata.Unspents) - require.NotEmpty(t, r.BlockchainMetadata.Head.BkSeq) - require.NotEmpty(t, r.BlockchainMetadata.Head.Time) - require.NotEmpty(t, r.Version.Version) - require.True(t, r.Uptime.Duration > time.Duration(0)) -} - -func TestStableHealth(t *testing.T) { - if !doStable(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - r, err := c.Health() - require.NoError(t, err) - - checkHealthResponse(t, r) - - require.Equal(t, 0, r.OpenConnections) - - require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) - - // The stable node is always run with the commit and branch ldflags, so they should appear - require.NotEmpty(t, r.Version.Commit) - require.NotEmpty(t, r.Version.Branch) -} - -func TestLiveHealth(t *testing.T) { - if !doLive(t) { - return - } - - c := gui.NewClient(nodeAddress()) - - r, err := c.Health() - require.NoError(t, err) - - checkHealthResponse(t, r) - - require.NotEqual(t, 0, r.OpenConnections) - - // The TimeSinceLastBlock can be any value, including negative values, due to clock skew - // The live node is not necessarily run with the commit and branch ldflags, so don't check them -} diff --git a/src/gui/integration/test-fixtures/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden b/src/gui/integration/test-fixtures/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden deleted file mode 100755 index 0637a08..0000000 --- a/src/gui/integration/test-fixtures/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/src/gui/integration/test-fixtures/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden b/src/gui/integration/test-fixtures/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden deleted file mode 100755 index c2a58d3..0000000 --- a/src/gui/integration/test-fixtures/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden +++ /dev/null @@ -1,629 +0,0 @@ -[ - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 180, - "block_seq": 1, - "unknown": false - }, - "length": 3846, - "type": 0, - "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", - "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", - "timestamp": 1427926392, - "sigs": [ - "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" - ], - "inputs": [ - { - "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ], - "outputs": [ - { - "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", - "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", - "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", - "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", - "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", - "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", - "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", - "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", - "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", - "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", - "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", - "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", - "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", - "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", - "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", - "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", - "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", - "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", - "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", - "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", - "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", - "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", - "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", - "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", - "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", - "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", - "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", - "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", - "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", - "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", - "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", - "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", - "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", - "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", - "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", - "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", - "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", - "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", - "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", - "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", - "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", - "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", - "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", - "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", - "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", - "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", - "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", - "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", - "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", - "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", - "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", - "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", - "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", - "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", - "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", - "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", - "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", - "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", - "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", - "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", - "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", - "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", - "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", - "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", - "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", - "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", - "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", - "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", - "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", - "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", - "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", - "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", - "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", - "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", - "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", - "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", - "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", - "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", - "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", - "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", - "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", - "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", - "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", - "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", - "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", - "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", - "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", - "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", - "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", - "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", - "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", - "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", - "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", - "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", - "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", - "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", - "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", - "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", - "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", - "coins": "1000000.000000", - "hours": 1 - } - ] - } -] diff --git a/src/gui/integration/test-fixtures/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/src/gui/integration/test-fixtures/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden deleted file mode 100755 index 4847bc7..0000000 --- a/src/gui/integration/test-fixtures/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden +++ /dev/null @@ -1,6570 +0,0 @@ -[ - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17183, - "block_seq": 1, - "unknown": false - }, - "length": 3846, - "type": 0, - "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", - "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", - "timestamp": 1427926392, - "sigs": [ - "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" - ], - "inputs": [ - { - "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ], - "outputs": [ - { - "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", - "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", - "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", - "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", - "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", - "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", - "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", - "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", - "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", - "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", - "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", - "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", - "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", - "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", - "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", - "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", - "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", - "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", - "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", - "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", - "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", - "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", - "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", - "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", - "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", - "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", - "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", - "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", - "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", - "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", - "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", - "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", - "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", - "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", - "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", - "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", - "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", - "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", - "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", - "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", - "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", - "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", - "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", - "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", - "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", - "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", - "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", - "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", - "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", - "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", - "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", - "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", - "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", - "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", - "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", - "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", - "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", - "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", - "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", - "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", - "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", - "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", - "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", - "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", - "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", - "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", - "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", - "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", - "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", - "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", - "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", - "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", - "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", - "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", - "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", - "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", - "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", - "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", - "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", - "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", - "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", - "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", - "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", - "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", - "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", - "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", - "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", - "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", - "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", - "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", - "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", - "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", - "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", - "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", - "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", - "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", - "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", - "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", - "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", - "coins": "1000000.000000", - "hours": 1 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17182, - "block_seq": 2, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", - "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", - "timestamp": 1427927651, - "sigs": [ - "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" - ], - "inputs": [ - { - "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000000.000000", - "hours": 1 - } - ], - "outputs": [ - { - "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999990.000000", - "hours": 1 - }, - { - "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17181, - "block_seq": 3, - "unknown": false - }, - "length": 183, - "type": 0, - "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", - "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", - "timestamp": 1427927671, - "sigs": [ - "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" - ], - "inputs": [ - { - "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17180, - "block_seq": 4, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", - "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", - "timestamp": 1428793611, - "sigs": [ - "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" - ], - "inputs": [ - { - "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999990.000000", - "hours": 1 - } - ], - "outputs": [ - { - "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999980.000000", - "hours": 3704 - }, - { - "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17179, - "block_seq": 5, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", - "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", - "timestamp": 1428798821, - "sigs": [ - "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", - "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" - ], - "inputs": [ - { - "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - }, - { - "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999980.000000", - "hours": 3704 - } - ], - "outputs": [ - { - "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999890.000000", - "hours": 4073 - }, - { - "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "100.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17167, - "block_seq": 17, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", - "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", - "timestamp": 1428989855, - "sigs": [ - "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" - ], - "inputs": [ - { - "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999890.000000", - "hours": 4073 - } - ], - "outputs": [ - { - "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 4040790 - }, - { - "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17166, - "block_seq": 18, - "unknown": false - }, - "length": 183, - "type": 0, - "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", - "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", - "timestamp": 1428989925, - "sigs": [ - "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" - ], - "inputs": [ - { - "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17158, - "block_seq": 26, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", - "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", - "timestamp": 1429011077, - "sigs": [ - "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", - "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" - ], - "inputs": [ - { - "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 4040790 - }, - { - "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 567938 - }, - { - "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", - "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", - "coins": "10.000000", - "hours": 567938 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17157, - "block_seq": 27, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", - "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", - "timestamp": 1429011137, - "sigs": [ - "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" - ], - "inputs": [ - { - "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 567938 - } - ], - "outputs": [ - { - "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999790.000000", - "hours": 70992 - }, - { - "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", - "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", - "coins": "90.000000", - "hours": 70992 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17146, - "block_seq": 38, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", - "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", - "timestamp": 1429058484, - "sigs": [ - "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" - ], - "inputs": [ - { - "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999790.000000", - "hours": 70992 - } - ], - "outputs": [ - { - "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "998790.000000", - "hours": 389245 - }, - { - "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "1000.000000", - "hours": 389245 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17145, - "block_seq": 39, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", - "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", - "timestamp": 1429058494, - "sigs": [ - "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" - ], - "inputs": [ - { - "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "998790.000000", - "hours": 389245 - } - ], - "outputs": [ - { - "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "988790.000000", - "hours": 48655 - }, - { - "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "10000.000000", - "hours": 48655 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17144, - "block_seq": 40, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", - "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", - "timestamp": 1429058514, - "sigs": [ - "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" - ], - "inputs": [ - { - "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "988790.000000", - "hours": 48655 - } - ], - "outputs": [ - { - "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "978790.000000", - "hours": 6081 - }, - { - "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "10000.000000", - "hours": 6081 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17143, - "block_seq": 41, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", - "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", - "timestamp": 1429058524, - "sigs": [ - "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" - ], - "inputs": [ - { - "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "978790.000000", - "hours": 6081 - } - ], - "outputs": [ - { - "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "969790.000000", - "hours": 760 - }, - { - "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "9000.000000", - "hours": 760 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17139, - "block_seq": 45, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", - "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", - "timestamp": 1429071074, - "sigs": [ - "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" - ], - "inputs": [ - { - "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "969790.000000", - "hours": 760 - } - ], - "outputs": [ - { - "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944790.000000", - "hours": 400470 - }, - { - "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "25000.000000", - "hours": 400470 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17138, - "block_seq": 46, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", - "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", - "timestamp": 1429077374, - "sigs": [ - "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" - ], - "inputs": [ - { - "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944790.000000", - "hours": 400470 - } - ], - "outputs": [ - { - "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944780.000000", - "hours": 50058 - }, - { - "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 50058 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17137, - "block_seq": 47, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", - "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", - "timestamp": 1429077384, - "sigs": [ - "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" - ], - "inputs": [ - { - "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944780.000000", - "hours": 50058 - } - ], - "outputs": [ - { - "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944770.000000", - "hours": 6257 - }, - { - "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 6257 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17136, - "block_seq": 48, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", - "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", - "timestamp": 1429077394, - "sigs": [ - "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" - ], - "inputs": [ - { - "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944770.000000", - "hours": 6257 - } - ], - "outputs": [ - { - "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944760.000000", - "hours": 782 - }, - { - "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 782 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17135, - "block_seq": 49, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", - "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", - "timestamp": 1429077404, - "sigs": [ - "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" - ], - "inputs": [ - { - "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944760.000000", - "hours": 782 - } - ], - "outputs": [ - { - "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944750.000000", - "hours": 97 - }, - { - "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 97 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17131, - "block_seq": 53, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", - "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", - "timestamp": 1429077514, - "sigs": [ - "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" - ], - "inputs": [ - { - "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944750.000000", - "hours": 97 - } - ], - "outputs": [ - { - "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "943750.000000", - "hours": 2964 - }, - { - "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "1000.000000", - "hours": 2964 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17127, - "block_seq": 57, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", - "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", - "timestamp": 1429077584, - "sigs": [ - "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" - ], - "inputs": [ - { - "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "943750.000000", - "hours": 2964 - } - ], - "outputs": [ - { - "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "942750.000000", - "hours": 1681 - }, - { - "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "1000.000000", - "hours": 1681 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17123, - "block_seq": 61, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", - "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", - "timestamp": 1429077654, - "sigs": [ - "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" - ], - "inputs": [ - { - "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "942750.000000", - "hours": 1681 - } - ], - "outputs": [ - { - "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "941750.000000", - "hours": 1519 - }, - { - "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", - "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", - "coins": "1000.000000", - "hours": 1519 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17120, - "block_seq": 64, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", - "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", - "timestamp": 1429077694, - "sigs": [ - "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" - ], - "inputs": [ - { - "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "941750.000000", - "hours": 1519 - } - ], - "outputs": [ - { - "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "940750.000000", - "hours": 1170 - }, - { - "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "1000.000000", - "hours": 1170 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17117, - "block_seq": 67, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", - "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", - "timestamp": 1429077874, - "sigs": [ - "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" - ], - "inputs": [ - { - "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "940750.000000", - "hours": 1170 - } - ], - "outputs": [ - { - "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "939750.000000", - "hours": 1452 - }, - { - "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "1000.000000", - "hours": 1452 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17116, - "block_seq": 68, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", - "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", - "timestamp": 1429077914, - "sigs": [ - "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" - ], - "inputs": [ - { - "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "939750.000000", - "hours": 1452 - } - ], - "outputs": [ - { - "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "938750.000000", - "hours": 181 - }, - { - "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 181 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17115, - "block_seq": 69, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", - "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", - "timestamp": 1429077944, - "sigs": [ - "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" - ], - "inputs": [ - { - "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "938750.000000", - "hours": 181 - } - ], - "outputs": [ - { - "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "913750.000000", - "hours": 22 - }, - { - "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "25000.000000", - "hours": 22 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17114, - "block_seq": 70, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", - "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", - "timestamp": 1429077964, - "sigs": [ - "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" - ], - "inputs": [ - { - "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "913750.000000", - "hours": 22 - } - ], - "outputs": [ - { - "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "888750.000000", - "hours": 2 - }, - { - "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "25000.000000", - "hours": 2 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17113, - "block_seq": 71, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", - "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", - "timestamp": 1429077974, - "sigs": [ - "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" - ], - "inputs": [ - { - "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "888750.000000", - "hours": 2 - } - ], - "outputs": [ - { - "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863750.000000", - "hours": 0 - }, - { - "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "25000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17107, - "block_seq": 77, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", - "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", - "timestamp": 1429147880, - "sigs": [ - "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" - ], - "inputs": [ - { - "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863750.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "862750.000000", - "hours": 976817 - }, - { - "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 976817 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17103, - "block_seq": 81, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", - "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", - "timestamp": 1429164440, - "sigs": [ - "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" - ], - "inputs": [ - { - "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "862750.000000", - "hours": 976817 - } - ], - "outputs": [ - { - "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861750.000000", - "hours": 125696 - }, - { - "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 125696 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17099, - "block_seq": 85, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", - "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", - "timestamp": 1429164620, - "sigs": [ - "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" - ], - "inputs": [ - { - "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861750.000000", - "hours": 125696 - } - ], - "outputs": [ - { - "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861050.000000", - "hours": 20200 - }, - { - "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "700.000000", - "hours": 20200 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17098, - "block_seq": 86, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", - "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", - "timestamp": 1429164720, - "sigs": [ - "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" - ], - "inputs": [ - { - "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861050.000000", - "hours": 20200 - } - ], - "outputs": [ - { - "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "860050.000000", - "hours": 2525 - }, - { - "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", - "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", - "coins": "1000.000000", - "hours": 2525 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17094, - "block_seq": 90, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", - "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", - "timestamp": 1429164810, - "sigs": [ - "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" - ], - "inputs": [ - { - "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "860050.000000", - "hours": 2525 - } - ], - "outputs": [ - { - "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "859050.000000", - "hours": 2704 - }, - { - "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 2704 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17090, - "block_seq": 94, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", - "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", - "timestamp": 1429164870, - "sigs": [ - "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" - ], - "inputs": [ - { - "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "859050.000000", - "hours": 2704 - } - ], - "outputs": [ - { - "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858050.000000", - "hours": 1829 - }, - { - "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "1000.000000", - "hours": 1829 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17086, - "block_seq": 98, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", - "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", - "timestamp": 1429274566, - "sigs": [ - "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" - ], - "inputs": [ - { - "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858050.000000", - "hours": 1829 - } - ], - "outputs": [ - { - "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858000.000000", - "hours": 11848 - }, - { - "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 11848 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17085, - "block_seq": 99, - "unknown": false - }, - "length": 571, - "type": 0, - "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", - "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", - "timestamp": 1429274616, - "sigs": [ - "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", - "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", - "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", - "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", - "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" - ], - "inputs": [ - { - "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 0 - }, - { - "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 50058 - }, - { - "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 6257 - }, - { - "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 782 - }, - { - "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", - "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 97 - } - ], - "outputs": [ - { - "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 7510 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17083, - "block_seq": 101, - "unknown": false - }, - "length": 183, - "type": 0, - "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", - "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", - "timestamp": 1429274666, - "sigs": [ - "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" - ], - "inputs": [ - { - "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", - "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "27000.000000", - "hours": 220 - } - ], - "outputs": [ - { - "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "27000.000000", - "hours": 102905 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17078, - "block_seq": 106, - "unknown": false - }, - "length": 511, - "type": 0, - "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", - "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", - "timestamp": 1429279796, - "sigs": [ - "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", - "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", - "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", - "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" - ], - "inputs": [ - { - "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858000.000000", - "hours": 11848 - }, - { - "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 11848 - }, - { - "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 7510 - }, - { - "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "27000.000000", - "hours": 102905 - } - ], - "outputs": [ - { - "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "885000.000000", - "hours": 139293 - }, - { - "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "100.000000", - "hours": 139293 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17077, - "block_seq": 107, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", - "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", - "timestamp": 1429280596, - "sigs": [ - "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" - ], - "inputs": [ - { - "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "885000.000000", - "hours": 139293 - } - ], - "outputs": [ - { - "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "884900.000000", - "hours": 17411 - }, - { - "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", - "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", - "coins": "100.000000", - "hours": 17411 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17075, - "block_seq": 109, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", - "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", - "timestamp": 1429302756, - "sigs": [ - "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" - ], - "inputs": [ - { - "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "884900.000000", - "hours": 17411 - } - ], - "outputs": [ - { - "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "881900.000000", - "hours": 7092 - }, - { - "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", - "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", - "coins": "3000.000000", - "hours": 7092 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17073, - "block_seq": 111, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", - "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", - "timestamp": 1429348072, - "sigs": [ - "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" - ], - "inputs": [ - { - "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22700.000000", - "hours": 17848 - } - ], - "outputs": [ - { - "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "12700.000000", - "hours": 2231 - }, - { - "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10000.000000", - "hours": 2231 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17072, - "block_seq": 112, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", - "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", - "timestamp": 1429348102, - "sigs": [ - "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", - "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" - ], - "inputs": [ - { - "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "881900.000000", - "hours": 7092 - }, - { - "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10000.000000", - "hours": 2231 - } - ], - "outputs": [ - { - "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873900.000000", - "hours": 1388810 - }, - { - "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "18000.000000", - "hours": 1388810 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17071, - "block_seq": 113, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", - "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", - "timestamp": 1429348172, - "sigs": [ - "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" - ], - "inputs": [ - { - "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873900.000000", - "hours": 1388810 - } - ], - "outputs": [ - { - "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873800.000000", - "hours": 173601 - }, - { - "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "100.000000", - "hours": 173601 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17070, - "block_seq": 114, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", - "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", - "timestamp": 1429348502, - "sigs": [ - "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" - ], - "inputs": [ - { - "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873800.000000", - "hours": 173601 - } - ], - "outputs": [ - { - "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873700.000000", - "hours": 21700 - }, - { - "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "100.000000", - "hours": 21700 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17069, - "block_seq": 115, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", - "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", - "timestamp": 1429348712, - "sigs": [ - "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" - ], - "inputs": [ - { - "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873700.000000", - "hours": 21700 - } - ], - "outputs": [ - { - "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873600.000000", - "hours": 2712 - }, - { - "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", - "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", - "coins": "100.000000", - "hours": 2712 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17067, - "block_seq": 117, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", - "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", - "timestamp": 1429351912, - "sigs": [ - "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" - ], - "inputs": [ - { - "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873600.000000", - "hours": 2712 - } - ], - "outputs": [ - { - "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863600.000000", - "hours": 20965 - }, - { - "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", - "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", - "coins": "10000.000000", - "hours": 20965 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17063, - "block_seq": 121, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", - "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", - "timestamp": 1429382678, - "sigs": [ - "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" - ], - "inputs": [ - { - "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863600.000000", - "hours": 20965 - } - ], - "outputs": [ - { - "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "801600.000000", - "hours": 378646 - }, - { - "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "62000.000000", - "hours": 378646 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17062, - "block_seq": 122, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", - "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", - "timestamp": 1429382898, - "sigs": [ - "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" - ], - "inputs": [ - { - "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "801600.000000", - "hours": 378646 - } - ], - "outputs": [ - { - "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "765600.000000", - "hours": 47330 - }, - { - "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "36000.000000", - "hours": 47330 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17061, - "block_seq": 123, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", - "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", - "timestamp": 1429451746, - "sigs": [ - "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" - ], - "inputs": [ - { - "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "765600.000000", - "hours": 47330 - } - ], - "outputs": [ - { - "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "755600.000000", - "hours": 5916 - }, - { - "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10000.000000", - "hours": 5916 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17060, - "block_seq": 124, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", - "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", - "timestamp": 1429522086, - "sigs": [ - "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" - ], - "inputs": [ - { - "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "755600.000000", - "hours": 5916 - } - ], - "outputs": [ - { - "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "750600.000000", - "hours": 739 - }, - { - "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", - "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", - "coins": "5000.000000", - "hours": 739 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17059, - "block_seq": 125, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", - "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", - "timestamp": 1429578056, - "sigs": [ - "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" - ], - "inputs": [ - { - "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "750600.000000", - "hours": 739 - } - ], - "outputs": [ - { - "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "738100.000000", - "hours": 92 - }, - { - "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "12500.000000", - "hours": 92 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17057, - "block_seq": 127, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", - "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", - "timestamp": 1429848410, - "sigs": [ - "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", - "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" - ], - "inputs": [ - { - "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "12700.000000", - "hours": 2231 - }, - { - "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "18000.000000", - "hours": 1388810 - } - ], - "outputs": [ - { - "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "30600.000000", - "hours": 528376 - }, - { - "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "100.000000", - "hours": 528376 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17056, - "block_seq": 128, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", - "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", - "timestamp": 1429849170, - "sigs": [ - "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", - "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" - ], - "inputs": [ - { - "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "738100.000000", - "hours": 92 - }, - { - "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "100.000000", - "hours": 528376 - } - ], - "outputs": [ - { - "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "737200.000000", - "hours": 6994818 - }, - { - "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", - "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", - "coins": "1000.000000", - "hours": 6994818 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17053, - "block_seq": 131, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", - "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", - "timestamp": 1430330041, - "sigs": [ - "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" - ], - "inputs": [ - { - "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "737200.000000", - "hours": 6994818 - } - ], - "outputs": [ - { - "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "736000.000000", - "hours": 12709509 - }, - { - "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", - "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", - "coins": "1200.000000", - "hours": 12709509 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17052, - "block_seq": 132, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", - "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", - "timestamp": 1430330311, - "sigs": [ - "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" - ], - "inputs": [ - { - "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "736000.000000", - "hours": 12709509 - } - ], - "outputs": [ - { - "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "735000.000000", - "hours": 1588688 - }, - { - "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", - "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", - "coins": "1000.000000", - "hours": 1588688 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17051, - "block_seq": 133, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", - "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", - "timestamp": 1430330421, - "sigs": [ - "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" - ], - "inputs": [ - { - "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "735000.000000", - "hours": 1588688 - } - ], - "outputs": [ - { - "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734500.000000", - "hours": 198586 - }, - { - "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "500.000000", - "hours": 198586 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17050, - "block_seq": 134, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", - "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", - "timestamp": 1430330481, - "sigs": [ - "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" - ], - "inputs": [ - { - "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734500.000000", - "hours": 198586 - } - ], - "outputs": [ - { - "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734400.000000", - "hours": 24823 - }, - { - "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "100.000000", - "hours": 24823 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17049, - "block_seq": 135, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", - "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", - "timestamp": 1430330591, - "sigs": [ - "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" - ], - "inputs": [ - { - "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734400.000000", - "hours": 24823 - } - ], - "outputs": [ - { - "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "733400.000000", - "hours": 3102 - }, - { - "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 3102 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17048, - "block_seq": 136, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", - "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", - "timestamp": 1430330851, - "sigs": [ - "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" - ], - "inputs": [ - { - "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "733400.000000", - "hours": 3102 - } - ], - "outputs": [ - { - "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "732400.000000", - "hours": 387 - }, - { - "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", - "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", - "coins": "1000.000000", - "hours": 387 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17047, - "block_seq": 137, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", - "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", - "timestamp": 1430504186, - "sigs": [ - "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" - ], - "inputs": [ - { - "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "732400.000000", - "hours": 387 - } - ], - "outputs": [ - { - "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "731400.000000", - "hours": 48 - }, - { - "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "1000.000000", - "hours": 48 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17046, - "block_seq": 138, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", - "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", - "timestamp": 1430504236, - "sigs": [ - "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" - ], - "inputs": [ - { - "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "731400.000000", - "hours": 48 - } - ], - "outputs": [ - { - "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "730200.000000", - "hours": 6 - }, - { - "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", - "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", - "coins": "1200.000000", - "hours": 6 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17045, - "block_seq": 139, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", - "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", - "timestamp": 1430504536, - "sigs": [ - "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" - ], - "inputs": [ - { - "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "730200.000000", - "hours": 6 - } - ], - "outputs": [ - { - "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "729200.000000", - "hours": 0 - }, - { - "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", - "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17044, - "block_seq": 140, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", - "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", - "timestamp": 1430504746, - "sigs": [ - "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" - ], - "inputs": [ - { - "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "729200.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "728200.000000", - "hours": 0 - }, - { - "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17043, - "block_seq": 141, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", - "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", - "timestamp": 1430504846, - "sigs": [ - "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" - ], - "inputs": [ - { - "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "728200.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "725700.000000", - "hours": 0 - }, - { - "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "2500.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17042, - "block_seq": 142, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", - "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", - "timestamp": 1430504966, - "sigs": [ - "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" - ], - "inputs": [ - { - "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "725700.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724700.000000", - "hours": 0 - }, - { - "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17041, - "block_seq": 143, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", - "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", - "timestamp": 1430505086, - "sigs": [ - "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" - ], - "inputs": [ - { - "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724700.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724200.000000", - "hours": 0 - }, - { - "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", - "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", - "coins": "500.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17040, - "block_seq": 144, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", - "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", - "timestamp": 1430505176, - "sigs": [ - "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" - ], - "inputs": [ - { - "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724200.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "723200.000000", - "hours": 0 - }, - { - "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17038, - "block_seq": 146, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", - "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", - "timestamp": 1430641376, - "sigs": [ - "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" - ], - "inputs": [ - { - "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "723200.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "722200.000000", - "hours": 1149084 - }, - { - "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 1149084 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17037, - "block_seq": 147, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", - "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", - "timestamp": 1430641536, - "sigs": [ - "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" - ], - "inputs": [ - { - "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "722200.000000", - "hours": 1149084 - } - ], - "outputs": [ - { - "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "721200.000000", - "hours": 143635 - }, - { - "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 143635 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17036, - "block_seq": 148, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", - "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", - "timestamp": 1430642006, - "sigs": [ - "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" - ], - "inputs": [ - { - "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "721200.000000", - "hours": 143635 - } - ], - "outputs": [ - { - "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "720200.000000", - "hours": 17954 - }, - { - "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "1000.000000", - "hours": 17954 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17035, - "block_seq": 149, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", - "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", - "timestamp": 1430642106, - "sigs": [ - "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" - ], - "inputs": [ - { - "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "720200.000000", - "hours": 17954 - } - ], - "outputs": [ - { - "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719200.000000", - "hours": 2244 - }, - { - "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 2244 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17034, - "block_seq": 150, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", - "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", - "timestamp": 1430642306, - "sigs": [ - "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" - ], - "inputs": [ - { - "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719200.000000", - "hours": 2244 - } - ], - "outputs": [ - { - "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719100.000000", - "hours": 280 - }, - { - "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", - "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", - "coins": "100.000000", - "hours": 280 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17033, - "block_seq": 151, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", - "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", - "timestamp": 1430642426, - "sigs": [ - "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" - ], - "inputs": [ - { - "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719100.000000", - "hours": 280 - } - ], - "outputs": [ - { - "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "718100.000000", - "hours": 35 - }, - { - "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", - "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", - "coins": "1000.000000", - "hours": 35 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17032, - "block_seq": 152, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", - "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", - "timestamp": 1430642546, - "sigs": [ - "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" - ], - "inputs": [ - { - "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "718100.000000", - "hours": 35 - } - ], - "outputs": [ - { - "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "717100.000000", - "hours": 4 - }, - { - "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", - "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", - "coins": "1000.000000", - "hours": 4 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17031, - "block_seq": 153, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", - "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", - "timestamp": 1430642816, - "sigs": [ - "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" - ], - "inputs": [ - { - "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "717100.000000", - "hours": 4 - } - ], - "outputs": [ - { - "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "716100.000000", - "hours": 0 - }, - { - "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17030, - "block_seq": 154, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", - "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", - "timestamp": 1430643706, - "sigs": [ - "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" - ], - "inputs": [ - { - "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "716100.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "715100.000000", - "hours": 0 - }, - { - "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17029, - "block_seq": 155, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", - "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", - "timestamp": 1430643906, - "sigs": [ - "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" - ], - "inputs": [ - { - "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "715100.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "714800.000000", - "hours": 0 - }, - { - "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "300.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17028, - "block_seq": 156, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", - "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", - "timestamp": 1430644036, - "sigs": [ - "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" - ], - "inputs": [ - { - "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "714800.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "713800.000000", - "hours": 0 - }, - { - "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", - "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17027, - "block_seq": 157, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", - "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", - "timestamp": 1430673946, - "sigs": [ - "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" - ], - "inputs": [ - { - "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "713800.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "695800.000000", - "hours": 0 - }, - { - "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "18000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17026, - "block_seq": 158, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", - "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", - "timestamp": 1430674696, - "sigs": [ - "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" - ], - "inputs": [ - { - "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "695800.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "670800.000000", - "hours": 0 - }, - { - "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "25000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17025, - "block_seq": 159, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", - "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", - "timestamp": 1430715196, - "sigs": [ - "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" - ], - "inputs": [ - { - "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "670800.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "664464.000000", - "hours": 0 - }, - { - "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "6336.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17024, - "block_seq": 160, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", - "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", - "timestamp": 1430784172, - "sigs": [ - "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" - ], - "inputs": [ - { - "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "664464.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "663464.000000", - "hours": 0 - }, - { - "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", - "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17023, - "block_seq": 161, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", - "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", - "timestamp": 1430784312, - "sigs": [ - "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" - ], - "inputs": [ - { - "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "663464.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662464.000000", - "hours": 0 - }, - { - "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", - "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17022, - "block_seq": 162, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", - "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", - "timestamp": 1430784372, - "sigs": [ - "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" - ], - "inputs": [ - { - "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662464.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662314.000000", - "hours": 0 - }, - { - "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "150.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17021, - "block_seq": 163, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", - "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", - "timestamp": 1430784932, - "sigs": [ - "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" - ], - "inputs": [ - { - "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662314.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "661314.000000", - "hours": 0 - }, - { - "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", - "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17020, - "block_seq": 164, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", - "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", - "timestamp": 1430790052, - "sigs": [ - "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" - ], - "inputs": [ - { - "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "661314.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "660314.000000", - "hours": 0 - }, - { - "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", - "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17019, - "block_seq": 165, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", - "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", - "timestamp": 1430790152, - "sigs": [ - "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" - ], - "inputs": [ - { - "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "660314.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659314.000000", - "hours": 0 - }, - { - "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17017, - "block_seq": 167, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", - "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", - "timestamp": 1430791902, - "sigs": [ - "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" - ], - "inputs": [ - { - "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659314.000000", - "hours": 0 - } - ], - "outputs": [ - { - "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659214.000000", - "hours": 33652 - }, - { - "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", - "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", - "coins": "100.000000", - "hours": 33652 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17016, - "block_seq": 168, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", - "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", - "timestamp": 1430792072, - "sigs": [ - "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" - ], - "inputs": [ - { - "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659214.000000", - "hours": 33652 - } - ], - "outputs": [ - { - "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "658214.000000", - "hours": 4206 - }, - { - "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", - "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", - "coins": "1000.000000", - "hours": 4206 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17013, - "block_seq": 171, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", - "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", - "timestamp": 1430870562, - "sigs": [ - "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" - ], - "inputs": [ - { - "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "658214.000000", - "hours": 4206 - } - ], - "outputs": [ - { - "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "647750.000000", - "hours": 1014129 - }, - { - "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "10464.000000", - "hours": 1014129 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17011, - "block_seq": 173, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", - "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", - "timestamp": 1430871512, - "sigs": [ - "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" - ], - "inputs": [ - { - "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "647750.000000", - "hours": 1014129 - } - ], - "outputs": [ - { - "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "635750.000000", - "hours": 127440 - }, - { - "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", - "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", - "coins": "12000.000000", - "hours": 127440 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17009, - "block_seq": 175, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", - "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", - "timestamp": 1430908702, - "sigs": [ - "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" - ], - "inputs": [ - { - "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "635750.000000", - "hours": 127440 - } - ], - "outputs": [ - { - "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "625750.000000", - "hours": 18358 - }, - { - "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "10000.000000", - "hours": 18358 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17005, - "block_seq": 179, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", - "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", - "timestamp": 1431339429, - "sigs": [ - "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" - ], - "inputs": [ - { - "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "625750.000000", - "hours": 18358 - } - ], - "outputs": [ - { - "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "615700.000000", - "hours": 5521648 - }, - { - "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", - "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", - "coins": "10050.000000", - "hours": 5521648 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17003, - "block_seq": 181, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", - "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", - "timestamp": 1431757585, - "sigs": [ - "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" - ], - "inputs": [ - { - "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "615700.000000", - "hours": 5521648 - } - ], - "outputs": [ - { - "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "605700.000000", - "hours": 5716263 - }, - { - "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", - "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", - "coins": "10000.000000", - "hours": 5716263 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17000, - "block_seq": 184, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "a230d5b5b745bb51d40e86b11e6508dc84a486f5ffd3584b0d45818ab8520802", - "inner_hash": "e6acee381aaefcd94f28b3a7ef5e6c34232fd5e78e96816d71c9c60248d6c5c6", - "timestamp": 1432327272, - "sigs": [ - "2e70883dc210920e639b5f22efd820a5f04b5290bc65b6ef4c52cd6283ef7a2e580fec499d33a71700a61dcab9200ee09a08a695affa9c12ef00d6d07cb0164001" - ], - "inputs": [ - { - "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "605700.000000", - "hours": 5716263 - } - ], - "outputs": [ - { - "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "565700.000000", - "hours": 4238886 - }, - { - "uxid": "d66dad2d285942e38e13fd5d921cd142e86489a16b0f83ece7249e72704f6536", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "40000.000000", - "hours": 4238886 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16994, - "block_seq": 190, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "655651b51d288fae2ca80dd8231fbc8927e7f0203d698bdf0dc47e1e9c63652d", - "inner_hash": "472ae342c5dcb47ec7cf0b63fba1414d5e4a32c63e974ce390d55fb668972151", - "timestamp": 1433229543, - "sigs": [ - "7dfbaddfb6b73fd84f23644a755c025b8480ab8754ad2e1a1c95d53ff52ed87e45030465ead44995235678e6e53ead91926da4af940367bef53ba7ae229edb7901" - ], - "inputs": [ - { - "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "565700.000000", - "hours": 4238886 - } - ], - "outputs": [ - { - "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "565100.000000", - "hours": 18252200 - }, - { - "uxid": "8cb546636d5039df6d4bda41a10322ea6dcd0fa0c766d3e2f45a6f30040765e0", - "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", - "coins": "600.000000", - "hours": 18252200 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16992, - "block_seq": 192, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "cff22d57daf828015489bba3b01538369f5627cc89ad0f139261bb0be0dac4a8", - "inner_hash": "4fd9cd0aab064ef8cf67e2b6b0102aa1cd4df52cf60b00206cc7b5619bcf5acc", - "timestamp": 1433331745, - "sigs": [ - "36a79d8ce7050bf1df11c9e839ecbb75f889161c7f3a81539a5da630953dad30159d0db804123c48f3bcabe2314887614bd57be64f951f7162ffc08f5810d23101" - ], - "inputs": [ - { - "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "565100.000000", - "hours": 18252200 - } - ], - "outputs": [ - { - "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "564100.000000", - "hours": 2791135 - }, - { - "uxid": "79fc203078f4a201ed7bfb09977a75a5b22794645606aef22824d3fda9285932", - "dst": "2fcUG6oQSsaWZK9Crqkh6LzGfZexqUqtHWg", - "coins": "1000.000000", - "hours": 2791135 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16991, - "block_seq": 193, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "1b83454b4e61348b9c643815c26350b4e34796170593895961f329a759cbadf8", - "inner_hash": "d551018fa96bcf1df6ae0136f75bfb5db002e6e41723fa80ab4fb5a1857bfcde", - "timestamp": 1433334775, - "sigs": [ - "9c02e3b3c6cc517badf9a4408bb9bf9d8d72fad0e2cc3f04f2e176bcfc2a7fee1b4740c4bc4eaa4ae008a9a18eda3f0cace91199613b14d2c34178cca1ac8ac500" - ], - "inputs": [ - { - "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "564100.000000", - "hours": 2791135 - } - ], - "outputs": [ - { - "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "561700.000000", - "hours": 348891 - }, - { - "uxid": "6a349ba12c5d2827de6c24773d3dd8f6572e86adba4c8954a6d6e68df9e165e2", - "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", - "coins": "2400.000000", - "hours": 348891 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16989, - "block_seq": 195, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "fa7a60f6d4a22404e28ce9d1600442c19237552d8678bd610793cb8e6b3353d4", - "inner_hash": "cc33e2831789b20ec4eb187a6b44a9f772aa243f3f5f6262cb46087a0a6ac3f5", - "timestamp": 1437050608, - "sigs": [ - "9b8e90365377deb3da537fdda4653f117c1c7de525b611d9d07f23139b5d4c642af80ad70779aa012b6399e73af8e08e87952f085edf8060f0832635e3244cb400" - ], - "inputs": [ - { - "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "561700.000000", - "hours": 348891 - } - ], - "outputs": [ - { - "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "561600.000000", - "hours": 42446558 - }, - { - "uxid": "054e39b1d37f10a4e1ee6598d66bd7cdd8f97b5ef0de2666120ef710c053af98", - "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", - "coins": "100.000000", - "hours": 42446558 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16987, - "block_seq": 197, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b18ed75097ed7910315e3be9042c0ca0b734d30a1afb8f9346bbe18acddd3a8a", - "inner_hash": "847e1acbed683214ad9e0fe164204db0ae8f2ce1cc420cb25aa63c76a4739580", - "timestamp": 1437051128, - "sigs": [ - "523ef82bcc586c5c885ca0fc7f2ffe5057573556a8bfaa3d9eb30b6316e698e93ac11a9e0d8a3c2a8ace763d80edd8e059153b61a4a35fa6f0b214d8ba0c485d00" - ], - "inputs": [ - { - "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "561600.000000", - "hours": 42446558 - } - ], - "outputs": [ - { - "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "527520.000000", - "hours": 5311474 - }, - { - "uxid": "bd55382fd8ca5b623b167dd7180ee0165eca5e74a6b2be453536ce8b5e1231e0", - "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", - "coins": "34080.000000", - "hours": 5311474 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16986, - "block_seq": 198, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "cd6fae6c021e64768cbb2e0a17ec6853db94b5dde52b417f872371dc3c24a27f", - "inner_hash": "8dde5734f617c1313288ac9d1b762a7d1e88b68846945b83c35935bcce1fdd8a", - "timestamp": 1437139506, - "sigs": [ - "1221df811e418338ca156c42fc881d1cd7384b819a6683d4a54ab6e78521e32761452bcbb7ad856fa345a8f80c6206b19bd178c09975b87180f86448994ba07c00" - ], - "inputs": [ - { - "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "527520.000000", - "hours": 5311474 - } - ], - "outputs": [ - { - "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "527220.000000", - "hours": 663934 - }, - { - "uxid": "42ec7e7302b1464d94e99c7b842e477d10e55328257aa5d1987052a3bdcc8690", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "300.000000", - "hours": 663934 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16984, - "block_seq": 200, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "2e05ca5b53cdaf3d65102aa6a4a707a324e5bfa7fa46e9b3b7328d1e0363822a", - "inner_hash": "08832259284fe4965625e2ef97d1ff3b40d7832b159b3d5369fc086ebb95479f", - "timestamp": 1438939186, - "sigs": [ - "820dc5d47540b0978818356b512731ae47517c061a1b660e7fd47e8f3d6420700377fd2ec04b618504cd3dadf642111df2f6c1f6edf2a4067fd460c69e8eb07301" - ], - "inputs": [ - { - "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", - "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26400.000000", - "hours": 64785 - } - ], - "outputs": [ - { - "uxid": "6e4110a8ed6f2b8b8772516466032a99b4851de65cf9ce1b5c5673946b7408a9", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "25400.000000", - "hours": 7847710 - }, - { - "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 7847710 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16959, - "block_seq": 225, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "5a348a2f9d4e70f1f0d68fa9abc66d8eb4adcd45942c89d79a4121033e7dfc39", - "inner_hash": "a282319ed05751e5df08ece9dfe9fdcc73ee03b3efa2227c78ed1fd65a072c23", - "timestamp": 1440298886, - "sigs": [ - "c2e5060c13dbcbe8bd76cbe8d7fa2aab8a8738bc6b1c1acf50366f211cbda18611feb1e218df129d1e6a6f957310ad08a139c03555d6ba2b99f52fd988e0a96800", - "90ed23dacf21e05817442155cf7ae9867a9531ee0e1c4b575caaec7c65ede2f73344e1b12e093b4d1ebb11e457f066560d1a280cf8cb48fbf7e937202c329fa001" - ], - "inputs": [ - { - "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "527220.000000", - "hours": 663934 - }, - { - "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 7847710 - } - ], - "outputs": [ - { - "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "518220.000000", - "hours": 57403807 - }, - { - "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10000.000000", - "hours": 57403807 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16958, - "block_seq": 226, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "e91d2553c18538d90847e7d432c75978abb0f6f84edeea2f942d018e7306074b", - "inner_hash": "e16c45b163f87caefb9d231d4608e6a9b67b5d379a7bff3aebd6587cfa349df6", - "timestamp": 1440299046, - "sigs": [ - "cdcc51cad962fa4c6da30a44222c1a7d91501d07ba358c5a017b1105ec6f95091ba4ed430a95220492b228cd1b48a74f19c08ef550108cb639a7451e6d80cb1100", - "6969d30799e0687d3c80ce026bc510f920171ed4fb592ce3bf7ba1c142ec515230856a3c5b618495b449f264dd4ca1c1cea6e0e95756b2d0201d280571ba41e301" - ], - "inputs": [ - { - "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10000.000000", - "hours": 57403807 - }, - { - "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "518220.000000", - "hours": 57403807 - } - ], - "outputs": [ - { - "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528170.000000", - "hours": 14350951 - }, - { - "uxid": "dfb90c1854bbf56bb87452a2870b4270214ca163df7d77f37c6bbf9d4ee2878a", - "dst": "2F4uJss1tkD7LNUp5RmxF1DPqgyzKVJm5tb", - "coins": "50.000000", - "hours": 14350951 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16957, - "block_seq": 227, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "71f762590ff2ca5e0591405ca5bb81aa2540981ea6e5cb71da1b30e4f91124a0", - "inner_hash": "024a7d284281f46931f4068a7dc377064aaf51b1c841e8d43a9f80f19aa52a8e", - "timestamp": 1440299156, - "sigs": [ - "dac9b5146b34a81f1c167cb54a15584e4323cb1910bf8de6c3b999f903a88b25473df3474c5ebce317dc40b121c632a79ecc8e9081406cc5d4b7a9848bd13d0f01" - ], - "inputs": [ - { - "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528170.000000", - "hours": 14350951 - } - ], - "outputs": [ - { - "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528120.000000", - "hours": 1793868 - }, - { - "uxid": "b79723cfa4ff5c819de20392e8f73e16d353dc4af31eb0c7857735d74f0b1469", - "dst": "ywucfMPRof9HqQPXM9xaY865THKsK2bgsS", - "coins": "50.000000", - "hours": 1793868 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16956, - "block_seq": 228, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "8ca1a46e2ea862c0886adccc211140ff394315c580a8f2da711eeed39d6326eb", - "inner_hash": "e026ab911b2370df6ef3cf8ee91e2005ab9fa978efd4074a8415aa272b0c19a9", - "timestamp": 1440299256, - "sigs": [ - "2805ab4816da23f9e1fc26c8940b5b5b27f90c910201229e239fa2b8f3cb4f9a5d1b57a62c48d5fc21ed11ccc121d22a8269af51a9de1359dd897a78a068d9a300" - ], - "inputs": [ - { - "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528120.000000", - "hours": 1793868 - } - ], - "outputs": [ - { - "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528070.000000", - "hours": 224233 - }, - { - "uxid": "03db7662bf54eadcf812dc76fad91d4022dc55b895ce8be3a4f13bda048bd281", - "dst": "23t2jE6DAMUUan6bgqQZchHtwtZo5sRUgR7", - "coins": "50.000000", - "hours": 224233 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16955, - "block_seq": 229, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ac0737f4a51a7274f6a32f337d21af0681eff77276f6365c1809a1a73564e850", - "inner_hash": "b0faed6dd74071ff4e4083f9e5f73ff5af90fda24b4e52a00962bae7eaadf5f8", - "timestamp": 1440339226, - "sigs": [ - "34abcaa9a093713d2a19323e234d216169d3f75336b3170c1ab7c281386d42da0e97cf5e444a7473a0b1806d3d887e9622a329770c57f27c7532f3b69e3a6b9100" - ], - "inputs": [ - { - "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "528070.000000", - "hours": 224233 - } - ], - "outputs": [ - { - "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526970.000000", - "hours": 28029 - }, - { - "uxid": "db47ae0c8f6fb640a199a01ceb12c63c26303fd866840f964b634b2f1a7490ab", - "dst": "2bJVVKi3UU9FKEAnZpvNQRWMom9Pp1SYp8k", - "coins": "1100.000000", - "hours": 28029 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16954, - "block_seq": 230, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "26746e5734590a1ef50f6d8ec6f58c25ed4b2bc57324f9e321f5543807f8830a", - "inner_hash": "66744475146d04a7d95866e1e19b97e1d903e95bc5e8ea96223b281b7b95dbf7", - "timestamp": 1440400166, - "sigs": [ - "199134f5ee986ec6a7a86d01920a98c8930be6f224dfeddece5c94155c9b4cea59b78c855887769f00aa6aeb76eb8e632f25b58bd5409fd481fb6663c30db67201" - ], - "inputs": [ - { - "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526970.000000", - "hours": 28029 - } - ], - "outputs": [ - { - "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526920.000000", - "hours": 3503 - }, - { - "uxid": "10c9fb1e6e6eb1a70af6e6714c1c0edb9588478cddfdbccb9ac5b2194abcbbfd", - "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", - "coins": "50.000000", - "hours": 3503 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16953, - "block_seq": 231, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "4553ac3bd00bc61bb9deb8a2bf3c606ecf78b857da710728f5b86fdd20434958", - "inner_hash": "0a23fd3f113c52b6b36d397256fe0161a3d7edc77f128ac974173fac90927fb9", - "timestamp": 1440400256, - "sigs": [ - "883145c4d76b5032ab0489407e991b247edeac0f89334c0588b8ede6d4ea052a2c330a94598fc9953cf9d25afeee7cf00ecea4d14744657ec9d888fe39b0d55c01" - ], - "inputs": [ - { - "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526920.000000", - "hours": 3503 - } - ], - "outputs": [ - { - "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526870.000000", - "hours": 437 - }, - { - "uxid": "e161482d33d132611f343987fc55f400d83de9ce3e51b1e5bd47e2b526c1c567", - "dst": "mkzYUmbUSnBAvweQ3QqqHZM3esy97ubWwQ", - "coins": "50.000000", - "hours": 437 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16952, - "block_seq": 232, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ca448d0b9f00c3f779acd75ea6e5d09cb93b4dee8ae417e43cecc58b121155f2", - "inner_hash": "bdcb4cfeae31a07ac42547510c4763b26b139ae2b61d411d7d4a78678a89f4e4", - "timestamp": 1440412792, - "sigs": [ - "8d5c007633116141c43ff4c87e1394052c4b6832c250ebf5f49781c7b0879ab12261bfd92f41fa6963c4b74e96c2bf8c96e8708f5dd04d4781fdb780c8307bb001" - ], - "inputs": [ - { - "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526870.000000", - "hours": 437 - } - ], - "outputs": [ - { - "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "511870.000000", - "hours": 54 - }, - { - "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "15000.000000", - "hours": 54 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16951, - "block_seq": 233, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "688395456432e777e9bcef2482950d047259da990199d26d88f113ba37e870e6", - "inner_hash": "97a6db93329382d3a23dad5caf203056e6747dca4722c7e8e8d1f316b5f79503", - "timestamp": 1440510872, - "sigs": [ - "b3a6984d1440aeceb4dac0304215a1bf8d017ab581f19c550b4d8f859f9a15270b54a8e599bff4f4a3a5fb3fcbe2f5bb95b7d61d4d48735696d7dd3c16f8fa7a01", - "5209b5d255a1308f3e25ad6115ed005e34479f4b9155c16c27b40b28da08332b646cc7fb29d82e07f6e8f0de780a4e6a6980ccf4c80214c9fbd0a3fe7eadf84900" - ], - "inputs": [ - { - "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "511870.000000", - "hours": 54 - }, - { - "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "15000.000000", - "hours": 54 - } - ], - "outputs": [ - { - "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526093.000000", - "hours": 13 - }, - { - "uxid": "121d93a2019c2bdcd69d58ca47cd4087c5ccc56c5ddc2486885dff8a6febcfb7", - "dst": "2N1izdmWPnPLUSvkRH8Q7aKES7crLYxBo5k", - "coins": "777.000000", - "hours": 13 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16950, - "block_seq": 234, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "036ad7678b828002f9f75645cd66e8c4a2d2ef66d4866bf7cfe5797be691a648", - "inner_hash": "0751142c1e40396fb2ea4e03cc64f8a7fabc12c1466d44726fa0dd9b2fab4b9e", - "timestamp": 1440543822, - "sigs": [ - "9093c6beef08fc75a1341830aa8da696a9a1f6e043ab8abc48c63f8527c186b26e7f5e802e1743e095031a94b1fee4876245285de8bc76133ea78b403b34b38800" - ], - "inputs": [ - { - "uxid": "18ffebf7d8410a48f00b6bbfa5272ba374c0b70c6c31172975b4c503542d4193", - "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "25390.000000", - "hours": 980963 - } - ], - "outputs": [ - { - "uxid": "a715e01bf641734804ed64e468ec35aa43658dc618784e6aed2f67d10c811f5d", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "24390.000000", - "hours": 628935 - }, - { - "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 628935 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16946, - "block_seq": 238, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "768dc6803457ca6ba774e251f0a8f482d8f7134a5a8347831ae1d84ff39040b3", - "inner_hash": "63020c4af6f170888d1ed626be016d895568d3a0aead892b979e55e5d0bd8800", - "timestamp": 1440675932, - "sigs": [ - "442db1af0d6925a01bf9510a5b8ba1dc1787373ba0851b99825533c2bc02f5246cdd56ac98ca2c1039d010f52e7a153c4118fe00dce63692b63dd04cefcce0f701", - "9d3c03789af3832c7cae849eed9ac2b1d5b1c3f89daee13ad46f10d256cd8774431d60b98ab3803709430cceefe1cdb55543064843240af9123ab9ffbb2ffccf01" - ], - "inputs": [ - { - "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "526093.000000", - "hours": 13 - }, - { - "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 628935 - } - ], - "outputs": [ - { - "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "514593.000000", - "hours": 3097826 - }, - { - "uxid": "2b724147fb8daced3ad03b0a94e291410ab70df7f22346ed836bb864904a24ab", - "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", - "coins": "12500.000000", - "hours": 3097826 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16945, - "block_seq": 239, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "60ba5bab66295f08c5c96411f53bdf38bdf2b985b6dec3989b7754a8e2919ef8", - "inner_hash": "e765990d43208cc3e4f2168abd1139b36eeb280d18d8f98b13c14708371a5109", - "timestamp": 1440676112, - "sigs": [ - "91a610f22d4aec320cb9a39a831eea7ff8b5fe5e18d402fda01bf732ccce2ad801d3709a073d0a95d18c8424ea8cb69cce38194a5b12ab11f6bb5278f9a7941d01" - ], - "inputs": [ - { - "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "514593.000000", - "hours": 3097826 - } - ], - "outputs": [ - { - "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "514093.000000", - "hours": 387228 - }, - { - "uxid": "52d2c4bda60fcd5e144d1c229a4d31c559a3d1f060b689737148918d4c04e128", - "dst": "Zu5GRV7HcKu1zV4ymwXUBCNogbwFW1sbhA", - "coins": "500.000000", - "hours": 387228 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16944, - "block_seq": 240, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "8839c0de129a84bb3025f8e314dae4d331b0da6a446a9893ad11225eec650e5e", - "inner_hash": "dd8ca4280d163c57c12c9792b544df85a2535e06b20b2c661d91b6aec80ba8fc", - "timestamp": 1440677762, - "sigs": [ - "7ab23848784fdf05602660e838be997277a7c33b2907ba81ae324d735b39864a2235ed3a0bfff86fa3cd7dcec7c6ab519d78e5f42b39443ee3aa4a1e44b9e26400" - ], - "inputs": [ - { - "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "514093.000000", - "hours": 387228 - } - ], - "outputs": [ - { - "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "513793.000000", - "hours": 48403 - }, - { - "uxid": "3e2b813ec4bdb29dd5bc232e00722c00beabf7cbbc2ca8b4e348f2f083978bd3", - "dst": "X7y5AqjNaLEuBGPxF2Rpip7d1AByHWWaXz", - "coins": "300.000000", - "hours": 48403 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16943, - "block_seq": 241, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6cf290b9b63988d6126b6101c10992f6d9340988731e67867f011790f1fdf8de", - "inner_hash": "7e4018b41a6906ddfd84f67d271d79ae89ade34ed5de0ae609a6eeddb37f5991", - "timestamp": 1440677792, - "sigs": [ - "da30c4a5cd8670d84a8f7f8b7c7cf9ae0da0f5bf806720824ad2d59716b200d349070158bbac66723c1a434747a8c438dec3e40c9e199cf8a2ee6d5622eb6b5901" - ], - "inputs": [ - { - "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "513793.000000", - "hours": 48403 - } - ], - "outputs": [ - { - "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "512793.000000", - "hours": 6050 - }, - { - "uxid": "3a87d255b1d892d58d606d622196b75e818690e55e74db6e0173b1e28b58e2a9", - "dst": "vneQ7V3nuPwRbSRqvFXhWkXaVou11ynXfC", - "coins": "1000.000000", - "hours": 6050 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16942, - "block_seq": 242, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "8ca9114947a591d12c8bcb3aed6c2b6f6f50c13ebea44fe62fcfd783b4716166", - "inner_hash": "0aa4f96969cccacc1c03e2d7f8a1719ffb6de7c85ee563f6d55f3da14a377502", - "timestamp": 1440679322, - "sigs": [ - "2373f45b0d10eb272c0304af8b75bac0570fc265ae3a446ec74b0bea87e494d86101e9b0c042a84fb20bd2061e694f2791cc76c734e8dcba0f3a601651cd405601" - ], - "inputs": [ - { - "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "512793.000000", - "hours": 6050 - } - ], - "outputs": [ - { - "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "512743.000000", - "hours": 756 - }, - { - "uxid": "051a357d1fe7f7b417a5892531f1e8b25b5bb78011ed4b440a5af47cfe241605", - "dst": "26AzDqDncyr5VKg5PfAxfTVdDtJf9AnMvoV", - "coins": "50.000000", - "hours": 756 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16941, - "block_seq": 243, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6b056847543ff37d8dbb7506d85514b3e18001ce973b7aac2a1a198a7f3be318", - "inner_hash": "583525d962728c33c80c1a511f3f407df0b09f0b22d571b9b857dba3488c0b13", - "timestamp": 1440682532, - "sigs": [ - "b625dcc6040f599b04f00e9812f93f6e087a68b8277a03efcb49a2e88cf86ea4314ac1d50e5299b9ec48921fed1b56e0221bbb8df5a3df386d524fbcb9fe9aa100" - ], - "inputs": [ - { - "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "512743.000000", - "hours": 756 - } - ], - "outputs": [ - { - "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "500243.000000", - "hours": 94 - }, - { - "uxid": "e7a20c799176f6567f3ad37f67ef0bfe5dd957404bd436d12f378eb35e624430", - "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", - "coins": "12500.000000", - "hours": 94 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16940, - "block_seq": 244, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7732aba0b8f9773c975158578159f5f6e98e9864d1cd2b0cef23cac03783cb99", - "inner_hash": "0337a9c8ebc9c389166e782b1da8777b01c29894b19d2c34290d9a3b81cd2ee1", - "timestamp": 1440911542, - "sigs": [ - "c185a7bac79fa042884330bf37c97ad27d9b4726ced145d91aec91dfb1cd9bf71e2c2e0de33837b43b241eddff2ac7067144ab3859859bef3e926b99aab4e5da01" - ], - "inputs": [ - { - "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "500243.000000", - "hours": 94 - } - ], - "outputs": [ - { - "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "497843.000000", - "hours": 11 - }, - { - "uxid": "5b9ecc773b66edd04478a15c82f019986b973fbc24be45c933e1e8ef62e0b223", - "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", - "coins": "2400.000000", - "hours": 11 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16936, - "block_seq": 248, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c8cbf96c9875e5a7f9f20cc301e9541f41182ac02747953f299d97a971e861e8", - "inner_hash": "f2c27d1b408cdd4796f628bff892e43cdfaeb8725b3a83bd0eddc374d9ce3ad1", - "timestamp": 1441590662, - "sigs": [ - "314620c86df48d65a6fcfeb82d028f48660f01b78004a01c0b5e8d5ba5e38e297331862b3f2786cf682e03e81fab3a413068f4eb72991d574b90d6a857b32d6201" - ], - "inputs": [ - { - "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "497843.000000", - "hours": 11 - } - ], - "outputs": [ - { - "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "492843.000000", - "hours": 6284923 - }, - { - "uxid": "6ade5ea7988126cda24ab050d714172ce41b0ba33359e0d06d319be60e83db9d", - "dst": "SiS1P3maLEzpscmggF6yvBHQ3yn7tA5ZdJ", - "coins": "5000.000000", - "hours": 6284923 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16933, - "block_seq": 251, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7c2da40e69c1ab57129cda200cbc4916fc67673436209b549c0496a4991f73be", - "inner_hash": "2d2c7b9c7e9e7c2dac513d277e2ed378a4ccdc5263560e2173b6507e4d70670d", - "timestamp": 1441735522, - "sigs": [ - "9de55cef7a0e80984d48ecfd30acf98d220bb5556d456af477c6879e80ba1bf143e75d6b64a018c1023f1854e538f1b72df3efe932db13d0eb20adf31c38ff9f01" - ], - "inputs": [ - { - "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "492843.000000", - "hours": 6284923 - } - ], - "outputs": [ - { - "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "491843.000000", - "hours": 3259584 - }, - { - "uxid": "5e41c4784a2ed9b538d07c20c2cadc89e3566ea17653b965715dd8db2015b986", - "dst": "KXSR2KLsButg6ndwUDYoyJ4FE9vGPLvtAj", - "coins": "1000.000000", - "hours": 3259584 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16932, - "block_seq": 252, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6638eac25e01cb7aabc20e0bd8fff66267bfa88ef4d3b021cda4248f6c8538a3", - "inner_hash": "ce2201218b3d8b5c734bc18666e409174b77ae022c0e48c30c5a9949edff6b0d", - "timestamp": 1441735692, - "sigs": [ - "94a8d11ba959af4d2160d141989d9a3e21f875b829d07969d1be040b54317c901c47ebcc9431f3cc0af88d4fbc0ac924785de50d27a3af4e4e4dc31a9980e0eb01" - ], - "inputs": [ - { - "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "491843.000000", - "hours": 3259584 - } - ], - "outputs": [ - { - "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "491743.000000", - "hours": 407448 - }, - { - "uxid": "4ce358e15868adaf6c5ca420f900d3dd0f737510b5412646e10548fa3d37653d", - "dst": "29vxf99tti4sFPZpg8ghEWV9fhoHSbjeRYd", - "coins": "100.000000", - "hours": 407448 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16924, - "block_seq": 260, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "22b65c63f88e188f8da71f42e41102cde030d9550cfc990b4391e0339a4cb2dd", - "inner_hash": "0f2f563f1fdf52d53dcc414228d347dc677c4143cb3be4471945709fed3d29f0", - "timestamp": 1444883250, - "sigs": [ - "f0ace9ccccb936a5b46073085d83ca357692dfe0de9635d36292289f6d3a6e4505bd42c7de08dc8642823b8ee2b986c0b926c62df834f694a4d44695ced6690000" - ], - "inputs": [ - { - "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "491743.000000", - "hours": 407448 - } - ], - "outputs": [ - { - "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "479243.000000", - "hours": 49345912 - }, - { - "uxid": "d79a747561a4ae09c22e5ec0baf0eb861b56b1d9b1411868c474d32e9ef392dc", - "dst": "6QpWfvS8PxrWVJLKLFtQVUHvAwUg2oX6GW", - "coins": "12500.000000", - "hours": 49345912 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16922, - "block_seq": 262, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "bc35493562cbe89797ce21a6202c8b43fc8514910ccb197c2f971c624b1fa5dd", - "inner_hash": "ff7c2bc8682df6f1a080061ca6d646c47636474b9e291dbf9d549fe5e63fddfe", - "timestamp": 1447060608, - "sigs": [ - "d1ffeea69fb213eaa7aea1e5f0d5a09e414247ba07a3860fb66c3af0b7ed611e2e630bfd292b4013e0d1bd9234290f068d49f5922ce895785c18cc4ada578a0e00" - ], - "inputs": [ - { - "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "479243.000000", - "hours": 49345912 - } - ], - "outputs": [ - { - "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "478743.000000", - "hours": 18530678 - }, - { - "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "500.000000", - "hours": 18530678 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16921, - "block_seq": 263, - "unknown": false - }, - "length": 317, - "type": 0, - "txid": "32c585c56c5879158e3075f299998f6cf922b06b9620f272ebb4cb4a2353d4eb", - "inner_hash": "e0dcb3b201be487c7feaf513b3f245b08e0f86335fd2bd9a9dba7ca70684e8a7", - "timestamp": 1448245188, - "sigs": [ - "2b0585dc3ac3d497e9b139be51a0e5f6e0520c54e244678459169a82d386f5050f23dd92685efee03bad45f7e166992fb34c3fc036c1fd9204bc0280decb7c8000", - "adcd4b6cb6dc7816416f44649ce1dc4ce3489e9dbac70f4de610d0663e12ed556f3d1fda1781ecb6237652358cd6d1118ec9c2b5795dde594d92c47830c493f500" - ], - "inputs": [ - { - "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "500.000000", - "hours": 18530678 - }, - { - "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "478743.000000", - "hours": 18530678 - } - ], - "outputs": [ - { - "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "478243.000000", - "hours": 4632669 - }, - { - "uxid": "08c0b08d114154a06a39cf418dd39eb018a55c1c4ee7a96257b33bc6f413d577", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "1000.000000", - "hours": 4632669 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16920, - "block_seq": 264, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "97ed144d626d0ff6fca09745735aec22a103d182971a45989500a3aa757358d4", - "inner_hash": "4bafee81f542c63b988af48da3250dd56215a42b520892b1ebbb8e9c5271588b", - "timestamp": 1450942022, - "sigs": [ - "c4047afd7722520fea778426868ef461a602a3954b82051c2245107491efdfff54d701d18f5408ef20a7dcea37ae4c1c3555bfe1bc387b1f3a516d076420139e00" - ], - "inputs": [ - { - "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "478243.000000", - "hours": 4632669 - } - ], - "outputs": [ - { - "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "476243.000000", - "hours": 579083 - }, - { - "uxid": "8745efaccbb21edd35d337233d7d1ae0e2c75723e72767c9b42cd27c46146abc", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "2000.000000", - "hours": 579083 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16919, - "block_seq": 265, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "b5ffbbb48c9900feb663f79c3b3e1c89328a08b592f96071fd4d3171197a5ff7", - "inner_hash": "b6d4ab02e9b05a532402a1b65185e098d4c730854c6f34d20e71da1262524195", - "timestamp": 1450942402, - "sigs": [ - "b116c94fd9e32cc371bba4f9a88ad672112d53be861aaa5c77cd335d1553fe0a24fc334d79c61aed344b618a3de49e791cc8aebe83bead076ed2f38dccd9aaee00" - ], - "inputs": [ - { - "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "476243.000000", - "hours": 579083 - } - ], - "outputs": [ - { - "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "456263.000000", - "hours": 72385 - }, - { - "uxid": "c33a3ad731a1375220c0701da00a462e13a11bab4cff684061ce173982227a2d", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "19980.000000", - "hours": 72385 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16918, - "block_seq": 266, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "981c2bb64f9e6717353cad40e21f3e97bd188381fde77862298488a516c31252", - "inner_hash": "cae5fc5f829da5ccb165c97b1140ed161e22e4ba290b1bee703b31a986c3c45c", - "timestamp": 1453191853, - "sigs": [ - "e3fb8400221770861288bcb1018a495548af5cd617724aa22efd219f350047086ea0ed5aa7f95e488045d5c31d8551a6cffcdf796d91ebbf573c1ef6492bb25701" - ], - "inputs": [ - { - "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "456263.000000", - "hours": 72385 - } - ], - "outputs": [ - { - "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "455263.000000", - "hours": 9048 - }, - { - "uxid": "d7eb0e6bd0ccbf9fd59e314999c37e8f97c652001e1ac1834f9b3c95665a746d", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "1000.000000", - "hours": 9048 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16917, - "block_seq": 267, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "4edf7e4859bd537481164719a563af45b2603d2caf1b676d6fe1e08713b0d6f3", - "inner_hash": "ac615d16f9c8be45bc50359496bdd6d489b374846f11586c19dc865c3217c1b9", - "timestamp": 1461084047, - "sigs": [ - "7ae17fdc81bb3b71304db642c6af046e67ca00e8499d8f3d19f7489cd13ca4b75f2415d1e9639e0a7a26791852331189f5e2bfdde574ccf6c0adbca2fb0c933100" - ], - "inputs": [ - { - "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "455263.000000", - "hours": 9048 - } - ], - "outputs": [ - { - "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "450263.000000", - "hours": 1131 - }, - { - "uxid": "fd99ca48c87575437fcbedd1bf05cf5c4f6a2d199616119ec99dfe61eb085ee5", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "5000.000000", - "hours": 1131 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16916, - "block_seq": 268, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "76b704d474896c5a3179b45a48c3ad327d5ebc27a6681ea7f514a90ba625bac3", - "inner_hash": "a60b2257f963b247a98f083828bf58d88aa3f327839c599bf1eaf0ee55a325a1", - "timestamp": 1461280957, - "sigs": [ - "15e30848b1d0aaf92e13f8927115314341ab4452a31f0a61f665c986c952ef6838753688759e98f393b5af088ad0fa4e9aa4e83695afe5734c45e4eb6c15b76f01" - ], - "inputs": [ - { - "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "450263.000000", - "hours": 1131 - } - ], - "outputs": [ - { - "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "437332.000000", - "hours": 141 - }, - { - "uxid": "c85d1d533bf13c0725af9a30bb101670505ed192f6987d55c1db5dd70fb2e4b3", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "12931.000000", - "hours": 141 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16915, - "block_seq": 269, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "8ecc2fb1efa47e6ad0c4670281b364a2828bfe86d59fbc14105c5b3a3c34fd17", - "inner_hash": "0600d27b083aea0d64ba83749b3bb60cbde6dd2cdaa4ec2101adb8de668cdeec", - "timestamp": 1461296767, - "sigs": [ - "aaa9847aead8e1e43fdeb1548317046c252ddc8b61e9447c18006b8af5805f5c1dbf81b898f25ecbbd0bb97c2d6d89da0e25f7da979932b2a774c7c5e6f2281d01" - ], - "inputs": [ - { - "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "437332.000000", - "hours": 141 - } - ], - "outputs": [ - { - "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "434832.000000", - "hours": 17 - }, - { - "uxid": "7bb51af714bcae27ed5c092c6e721f10ca1ac167a61add8bd2989f15c968bab8", - "dst": "28nWDjroTJGr3rmZj9iiiVQK1wEVURcvsSc", - "coins": "2500.000000", - "hours": 17 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16910, - "block_seq": 274, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "2c97923aba19d8846f8f90db6dc89da7d433ead3ea8dc3155294ab4c9e7e61a4", - "inner_hash": "7d3af96a796daba12cbb863731c09e148f21302064d65945316473ad522e8ca8", - "timestamp": 1461749167, - "sigs": [ - "6f3c6fb3e971ec8b4eb3a352c94b2abcb347a3f476d1b5e3097ce239a32467bd0703a4436ce7c9b4beb1668a9056f6d93055b53aa7a36374c2b3d12793a6ea3900" - ], - "inputs": [ - { - "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "434832.000000", - "hours": 17 - } - ], - "outputs": [ - { - "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "433832.000000", - "hours": 6825203 - }, - { - "uxid": "df7cae650d11e13a5308ea9f10662060c57ad749538d5ea1f476556de3257270", - "dst": "A19fNE1BNGAELCJ5bCVgo8t5Y9UPtoxy2F", - "coins": "1000.000000", - "hours": 6825203 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16900, - "block_seq": 284, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7c3f991c9cb5098648da480666613a048267678dcf7033c6138b0ac619003bcb", - "inner_hash": "35e2f253fd5936f6086464b4f3bae2a39770f91b2d846533bdd677554a760bbf", - "timestamp": 1462264727, - "sigs": [ - "bd5e540c58e54ccc58d1f7021657665d1f7a1770cc575b47a46bc16f5e3f3c86338f61be266c851201e8441ea5aa3ac91fa1cbf3b77365826c3b76f8f6441b0700" - ], - "inputs": [ - { - "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "433832.000000", - "hours": 6825203 - } - ], - "outputs": [ - { - "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "333832.000000", - "hours": 1952944 - }, - { - "uxid": "fba32b8a7e10d7aad23bb8511dd61b9ad67b844142b5acd7ef22d03e540888fb", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "100000.000000", - "hours": 1952944 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16896, - "block_seq": 288, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "4c41f200b398abbba12cb9ad5b935a5dad3bb6283093f062c82ae7c7904747a5", - "inner_hash": "5263bdcff23761f158c7286664908839983135936f1e53bdd2513e7fa317d05f", - "timestamp": 1462711117, - "sigs": [ - "39c94d70cedadb426004bea6137aa774ba757b78c44aad072143eb55cb9207aa7f02be91cd67c27f39f898a2303791665bfb5414a18df62a304c9cbdd4ffb5ff00" - ], - "inputs": [ - { - "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "333832.000000", - "hours": 1952944 - } - ], - "outputs": [ - { - "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "333732.000000", - "hours": 3002404 - }, - { - "uxid": "111b2d823bc70d9e8f42063eca3a457abe385b994d59f602d35bafe3e1402233", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "100.000000", - "hours": 3002404 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16895, - "block_seq": 289, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "6778a6900cf26b0ad69d2ead927663bd2bbaccd9b97d0dffb74655a08757ee5a", - "inner_hash": "53e042fba89ab6233f73a2bd08df87d84d5979b7a1bed5705156b8badc44f5b3", - "timestamp": 1462711187, - "sigs": [ - "006025e5067252a8e37eb4c911d7e2c5283b137f0be2c8ffae27cac8f5a21f723d25745c157e49783354751f3e0bf4ce25fe6271748bd78d31487e826685a59801" - ], - "inputs": [ - { - "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "333732.000000", - "hours": 3002404 - } - ], - "outputs": [ - { - "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "283732.000000", - "hours": 375300 - }, - { - "uxid": "4729461061ba3e308d1fea8846b8326bb8300d3dcc8b66b242323ba0aa5a3ccb", - "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", - "coins": "50000.000000", - "hours": 375300 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16894, - "block_seq": 290, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "99988a504cb60473ad8b5047a9be9049dff3dd2ee13879707a12736ed52ea9a5", - "inner_hash": "13285dd910aca69020333f17bc6d0a9ad3424bba2610acbd062712a3b4b46b6b", - "timestamp": 1462715237, - "sigs": [ - "cc4df545eddf94086f0aaf2bb28321d8e3822f835bb3a71ab51674a3a7dc305c57df3609b6dc3a434fa8e2a4c36b5406cdf2fe6833c74049b4b77cf098ca664c01" - ], - "inputs": [ - { - "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "283732.000000", - "hours": 375300 - } - ], - "outputs": [ - { - "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "278732.000000", - "hours": 46912 - }, - { - "uxid": "a0e76e9cfd75deeb37f2db7bd67c95c95c3896c635ef104a548b77cafa65dd04", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "5000.000000", - "hours": 46912 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16893, - "block_seq": 291, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "714a3b2ba4479d0a95ad0ebae11bc1198eabc6392dabe776c15e7a68e0d82cf8", - "inner_hash": "32aa300316d5aff19a3aa0a99bfbca6398eef9462cc6c975fe7f41d1ecb9f6d5", - "timestamp": 1462715257, - "sigs": [ - "a886ba759476985a6aec555b7acb5b3f7ea7d14201b66bd043bc172206bf4b7c0269959f3f8aac5c7a06a376a628221c67ae89cbd141c96987f852c2e2f4e73400" - ], - "inputs": [ - { - "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "278732.000000", - "hours": 46912 - } - ], - "outputs": [ - { - "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "278232.000000", - "hours": 5864 - }, - { - "uxid": "0637e5ea11dba513d8839c02e4d564ec31a8377e5aca51fdef4c854cb5eaa332", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "500.000000", - "hours": 5864 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16892, - "block_seq": 292, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7e8d02180c5e49cd36b545c8986ffaadc7e90840259d3fe10ceaff3e4cd931c4", - "inner_hash": "8e1d9f79f43372290c3d497314271a711c33474fdec555b4be6f3f0d7c608d76", - "timestamp": 1462715267, - "sigs": [ - "61f0c36e996c391c61daaddd6dced605e79cdabc643d994d99c7a6a479aad25c4030619f1cf7420dbe2d673a2e124f2bae744277b246173342d7fdbddea78bc200" - ], - "inputs": [ - { - "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "278232.000000", - "hours": 5864 - } - ], - "outputs": [ - { - "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "277732.000000", - "hours": 733 - }, - { - "uxid": "9ab52d70129ef181bbd69a630a3fa929bb12357c5c31bc70173388b71327dab7", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "500.000000", - "hours": 733 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16863, - "block_seq": 321, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7388dab349f2d2a59ab071fc592c0173acfa357f23fd17dae1561089da55e74f", - "inner_hash": "a0f3bfacdee3107342adb96e8dcb38a265af8054624dadc0b27d71c55854e6b5", - "timestamp": 1467090951, - "sigs": [ - "dda5202c4c44a5ab8eceb8cf8a7acc1c2714529eee0a69bd396cb74a98706dfe1c7686c1b0f2bf760b5d211ce535c21077944bd1d89bc0baade9606cd561147800" - ], - "inputs": [ - { - "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "277732.000000", - "hours": 733 - } - ], - "outputs": [ - { - "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "277632.000000", - "hours": 27330067 - }, - { - "uxid": "f16b87d2e0ea2e7f43434d058fb4435705cb15f4d01de6c6aa242ab7fcd9a80b", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "100.000000", - "hours": 27330067 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16862, - "block_seq": 322, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "5733f006dda42be6198d3fb035170c9160428ad321c8255b851574776e03c34f", - "inner_hash": "993a366ebfc7210951eeda4c459389f396a2038f41025f4b729edab75d1dc9c5", - "timestamp": 1469074433, - "sigs": [ - "0612105a7d427841f1f9038bbb778c8c1db52e0dfe5fd7c9409b44bb03fc72a74d60913ad46fef4a525d3314a48e1ee49d4a5da69941075fe816c02ef691979001" - ], - "inputs": [ - { - "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "277632.000000", - "hours": 27330067 - } - ], - "outputs": [ - { - "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "276632.000000", - "hours": 3416258 - }, - { - "uxid": "02b48571a1a1f628a0e78b5b158a682262a88610cd0614697e17201f35c9ee98", - "dst": "22cmbaPHWozJRJfbxTUbfoy2FfM3oFvFs7k", - "coins": "1000.000000", - "hours": 3416258 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16861, - "block_seq": 323, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "725698203caf11e909360449956f0285735d44f4573c81413852d25b220e61b0", - "inner_hash": "ef1dc1d55aa04aa6a240a796f6f9c47af2317fdfa7f4843f3884e71cdb79c442", - "timestamp": 1469074773, - "sigs": [ - "77fd6d8da8b2efd32dd50ca558e44fde0f62d8cd15ab084650759ff61d51e3200b7c025488908a7d0f784de819764506ab8a67f9d5c384ab7962c30908695d3700" - ], - "inputs": [ - { - "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "276632.000000", - "hours": 3416258 - } - ], - "outputs": [ - { - "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275632.000000", - "hours": 427032 - }, - { - "uxid": "f575c8f632e92d9e3c7335f68e4e6c24d69d20fddbd05f794016b4d18d4d9c66", - "dst": "8CHWZqQEnBj9dTdZ78iqs1MVy83qgCuTs4", - "coins": "1000.000000", - "hours": 427032 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16857, - "block_seq": 327, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "823a284da9b7e49180e599552e824c60c23d28cc9fd4915e57037ac6ba5e364f", - "inner_hash": "83da271ca66c1da0f8ba30224552791e51f5334fb2868c01a95aa09aa5d8f8c4", - "timestamp": 1469463291, - "sigs": [ - "bd8a3cfd554c7fcf06c2fbdb0efe399f31d30373c96a0846edd52a3163dca1b43060014bda1db9abbacda35addcd3cd89625fe8e4753067aaf9a2de226fd692c01" - ], - "inputs": [ - { - "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275632.000000", - "hours": 427032 - } - ], - "outputs": [ - { - "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275631.000000", - "hours": 3771616 - }, - { - "uxid": "f809efa66df51ff86023c6a514e91274a93dc303c34a191c37deb7e3467b9944", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1.000000", - "hours": 3771616 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16834, - "block_seq": 350, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ccf809db24bde3af9083bb6ba590e91f71cd93335c945ccae3f815ef68994843", - "inner_hash": "18e96e61845c7f9134eec568476ae5f8909417230382a261384a4116cb6ea980", - "timestamp": 1471358102, - "sigs": [ - "07220c9f545b585905db91d51aa1b00bd3c3c4ad251bd88c48cc1377c2ea86702ac6fb8354188abdf228cd9c05c8d8c0c8185e337f60fb824b06ca5c3893757f00" - ], - "inputs": [ - { - "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275631.000000", - "hours": 3771616 - } - ], - "outputs": [ - { - "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "274631.000000", - "hours": 14175490 - }, - { - "uxid": "6e269a47dc13704da1058890e839f246fe6f57c52718687c863e0d16adbfbb3e", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1000.000000", - "hours": 14175490 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16830, - "block_seq": 354, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "e348450f03f57e10e3cb1227b6874186d72f090c1cb6468b400b4906807cef02", - "inner_hash": "79e866fddd91dea1ba6c8bdb88bc880216d25c812145bb476e91590396146b3f", - "timestamp": 1472066732, - "sigs": [ - "67d3293742ce7cd95612d1a01c0b307a94166fc0b7bdc01efcd312606f88a5a474affc18a56adf6fece4f9b6b593dd1479a70fac8d92d4d285e1af579eafb90b01" - ], - "inputs": [ - { - "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "274631.000000", - "hours": 14175490 - } - ], - "outputs": [ - { - "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "273631.000000", - "hours": 3042390 - }, - { - "uxid": "26974a5d7ccd20eebd9c832b5fd40d62fb6bae48227fffa65dd4e5be26d12f84", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1000.000000", - "hours": 3042390 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16829, - "block_seq": 355, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c97bf2e161844d70686539eaec694b32678b130539946af8c3ec36f905e47d9a", - "inner_hash": "1e1f7265be9a1806a23a7f490fbd2f5c179e910102509dc4667e631115cad927", - "timestamp": 1472069152, - "sigs": [ - "085b5436b72b9ccd1b0e8001c42408ff90ecb544a027da4e18dd550933a7ef8f7a9b5a44939856f9f8d47a8805091696148ba86cc174cfe73604f0b34e43290400" - ], - "inputs": [ - { - "uxid": "a0ba6219e79ab6470430b6b387602b58c96ef57a850e9dc94af8da0dfedfcad1", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "25314.000000", - "hours": 10499712 - } - ], - "outputs": [ - { - "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "24314.000000", - "hours": 3825202 - }, - { - "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 3825202 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16828, - "block_seq": 356, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "7ca2667f49dc21f893f2273c592618b0238959ec9aecc881150d6507c6a1755e", - "inner_hash": "06516c42bb9cd1d9584281fc41497afbcdbcf50d227e33d56016d003f426e262", - "timestamp": 1472069172, - "sigs": [ - "8172d96cbb9f33bbe1a2852745015abd99c4702af53aa10a0124efe0a3e1a32766ec459367d62f21dce3b08361feda40eef78dc273577ee4c8f7a0ee5551bc6d00" - ], - "inputs": [ - { - "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "24314.000000", - "hours": 3825202 - } - ], - "outputs": [ - { - "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "23314.000000", - "hours": 478150 - }, - { - "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 478150 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16827, - "block_seq": 357, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "ccf714517563cfb8a9d694a7a0ac534da01cb74e18d8a9cd0d410081970d8015", - "inner_hash": "0470dddb1c719ccb518dc8df7d0150373c61e19e3bbe0d2ced04a6ca66d71215", - "timestamp": 1472069232, - "sigs": [ - "8d29d25b00cd13891c3af52b6481d173d186ac4281afdf5a9c0646a55664addd0edbde30ce3d51c3952571ba37f056f289adefc1dedb1dde3465d2a16de6a02c01" - ], - "inputs": [ - { - "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", - "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "23314.000000", - "hours": 478150 - } - ], - "outputs": [ - { - "uxid": "7e527dff560de74654aada4257259085486ea81716b577f7d8519a44beff78da", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22314.000000", - "hours": 59768 - }, - { - "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 59768 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16810, - "block_seq": 374, - "unknown": false - }, - "length": 511, - "type": 0, - "txid": "7a05ca15c9860700b34642339e91427ce0b211a8fe14805751d730f8ca0e5363", - "inner_hash": "34ef2b9ef8af1fb8d76b9ea9690356f2e0c20d1f672598020fa4e65aff25a9f5", - "timestamp": 1473696472, - "sigs": [ - "a45592c587087f22e42bbf5ea9061e0668bd7e8fb3daa9c8bde6a1f2644c2a373c91d0b874a2fa95a4ce94284cf663035f83bba786c0c356ae055b89cedd623301", - "d422b1658a5a49642bd1126a269eaa1c939849dd9ca179db7992f0c274a16d313c4b2c9bb8dba458895ad7f12590da944af0880cb75592c0f4185c9b510747c900", - "a4250a03285edf63270784bc3e0d655b709622dfdfdd99af0b6f85060d3f540e36eeba0ed719a415f67d3c542e2efdc93c0fcfd9b0c946cca5c0fa5abc9837d901", - "e89be88a2dfd2beb052d0b628a2b4c09c38c3d19751e0551a65a22b6d9b4ed305974e673c7cb5d7c0259eeea76f2044f708c1ea2abf8cf5d92c84c81eed30b4201" - ], - "inputs": [ - { - "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "273631.000000", - "hours": 3042390 - }, - { - "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 3825202 - }, - { - "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 478150 - }, - { - "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000.000000", - "hours": 59768 - } - ], - "outputs": [ - { - "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275631.000000", - "hours": 14783973 - }, - { - "uxid": "aa975eb226edc45f46bc54bbbf08143ae1cc0cfedea598c536e1810b36d26258", - "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", - "coins": "1000.000000", - "hours": 14783973 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16809, - "block_seq": 375, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "9da07bf85e25c466daeb9e4bb8825161e2f2eb60ce470fecff30a557d8ab8d58", - "inner_hash": "2bf9ee9274c70c66f52d81df6b1f56bdbba9b17d3a67371ee45c94c0d91ffdad", - "timestamp": 1473696502, - "sigs": [ - "13d93765e882705c482307678fc2d7d4d10ec733626066d59a6ee0d83be0c3840f66e43dec32bc09b2dea074675e8cf1fb0e768891191657ff1e8895f6d24edc01" - ], - "inputs": [ - { - "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "275631.000000", - "hours": 14783973 - } - ], - "outputs": [ - { - "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "265631.000000", - "hours": 1847996 - }, - { - "uxid": "cb7e5dd3539b632b7c8de80bdd2bede4890d306ddde001854b21003546bdeb4a", - "dst": "bVMBhye4BsMtB9bC6t6VnQoYkbLH5JEb5A", - "coins": "10000.000000", - "hours": 1847996 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16761, - "block_seq": 423, - "unknown": false - }, - "length": 220, - "type": 0, - "txid": "c0b00aa1fac000b225f3d59983d7be04b41dded7e70549cd118648c0f4120622", - "inner_hash": "409996e4103fb8a6d0a508cd1b4b3f3c0145f255461ed590e013a4a1cec87f53", - "timestamp": 1474976262, - "sigs": [ - "f11babcb58c0526909ab684968566c79f015a35eb5e800382847c58c12cd198b53cd8f5513139ba289ee547cbbbda6313516a8d18e10ee5497805d135020171c01" - ], - "inputs": [ - { - "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "265631.000000", - "hours": 1847996 - } - ], - "outputs": [ - { - "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "244831.000000", - "hours": 11857151 - }, - { - "uxid": "9e5bd56c83575b8628dc1c497b7987bccd3cea12267782be95bf7cc9b47d6364", - "dst": "kW69Hh12ng6hqD6GsScVq6Bo6VDGTgq7Gx", - "coins": "20800.000000", - "hours": 11857151 - } - ] - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16693, - "block_seq": 491, - "unknown": false - }, - "length": 414, - "type": 0, - "txid": "127cae7ab2e851738fc4c9894dade853173c658317e5e551c0618f3c14de0c6e", - "inner_hash": "ae44ad68c8a6f83d22436a19ff274d5eeeceb7c515348c910cf09abea87b4449", - "timestamp": 1478603012, - "sigs": [ - "0a332a5c2c501b5fcf6d8ce21ef1aa6c82324dcaf5a4162a0ab8f6cada1ae56b19be195564263ace98db8a0b0b4c37a5ac080c5a55c76b2c9315980a025307b001", - "b2a3d81f2a2bd12ed1fc0d5bb9daa781a2553410902a25cfcf4c179165ef52936b86c4774ad3e9a4fbc2188f8fe7e5ad1949715c307ab4499b4d2bc2536bb2b600", - "e660d1823b2d2637c2da6080443410dadf90c8559e17b37b17fe51d553e2f26c0b71ee1b3a652b522b0f1cc17baef65f63457259b06fd6126fe4e2b1bf101e7d01" - ], - "inputs": [ - { - "uxid": "22f6cbb46c9d8566f6cdb3882dbd77bc473432c097b704c14457babd66da993d", - "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "400.000000", - "hours": 3128290 - }, - { - "uxid": "d0e6c3ff06b1125d70a707f57b4888a96aa56fe26fbf0fc80ce7d560acc77f63", - "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "400.000000", - "hours": 27225 - }, - { - "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", - "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "244831.000000", - "hours": 11857151 - } - ], - "outputs": [ - { - "uxid": "4594bb2382ac97aa0cf3ae0eeeae2d2a0dbe96a6293d0bd715e2ce7165080977", - "dst": "2X6eRFh6pp6rUHj74NJXLcmTg1TnDaPyYCw", - "coins": "1000.000000", - "hours": 1876583 - }, - { - "uxid": "931267f628963f9faccfaaa4973cb20a4d28a02a8c97a89f83f91d3413af7af7", - "dst": "Qq7dG2S5jwNgpayJzBf7kTtfWmpfSQPCQ6", - "coins": "244631.000000", - "hours": 1876583 - } - ] - } -] diff --git a/src/gui/integration/test-fixtures/blockchain-180.db b/src/gui/integration/test-fixtures/blockchain-180.db deleted file mode 100755 index 4af6f0f..0000000 Binary files a/src/gui/integration/test-fixtures/blockchain-180.db and /dev/null differ diff --git a/src/gui/integration/test-fixtures/empty-addrs.golden b/src/gui/integration/test-fixtures/empty-addrs.golden deleted file mode 100755 index cbcd4c6..0000000 --- a/src/gui/integration/test-fixtures/empty-addrs.golden +++ /dev/null @@ -1,7239 +0,0 @@ -[ - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 181, - "block_seq": 0, - "unknown": false - }, - "time": 1426562704, - "txn": { - "length": 0, - "type": 0, - "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": 1426562704, - "sigs": [], - "inputs": [], - "outputs": [ - { - "uxid": "54c5dd9aebbe4656eb1adc658fdd4ff63a073aae473cc99b20c0ef5f0a21f08e", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 180, - "block_seq": 1, - "unknown": false - }, - "time": 1427926392, - "txn": { - "length": 3846, - "type": 0, - "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", - "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", - "timestamp": 1427926392, - "sigs": [ - "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" - ], - "inputs": [ - "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" - ], - "outputs": [ - { - "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", - "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", - "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", - "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", - "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", - "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", - "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", - "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", - "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", - "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", - "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", - "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", - "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", - "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", - "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", - "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", - "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", - "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", - "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", - "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", - "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", - "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", - "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", - "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", - "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", - "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", - "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", - "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", - "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", - "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", - "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", - "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", - "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", - "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", - "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", - "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", - "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", - "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", - "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", - "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", - "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", - "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", - "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", - "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", - "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", - "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", - "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", - "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", - "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", - "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", - "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", - "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", - "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", - "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", - "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", - "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", - "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", - "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", - "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", - "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", - "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", - "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", - "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", - "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", - "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", - "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", - "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", - "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", - "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", - "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", - "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", - "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", - "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", - "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", - "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", - "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", - "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", - "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", - "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", - "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", - "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", - "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", - "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", - "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", - "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", - "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", - "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", - "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", - "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", - "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", - "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", - "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", - "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", - "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", - "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", - "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", - "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", - "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", - "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", - "coins": "1000000.000000", - "hours": 1 - }, - { - "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", - "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", - "coins": "1000000.000000", - "hours": 1 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 179, - "block_seq": 2, - "unknown": false - }, - "time": 1427927651, - "txn": { - "length": 220, - "type": 0, - "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", - "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", - "timestamp": 1427927651, - "sigs": [ - "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" - ], - "inputs": [ - "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" - ], - "outputs": [ - { - "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999990.000000", - "hours": 1 - }, - { - "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 178, - "block_seq": 3, - "unknown": false - }, - "time": 1427927671, - "txn": { - "length": 183, - "type": 0, - "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", - "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", - "timestamp": 1427927671, - "sigs": [ - "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" - ], - "inputs": [ - "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" - ], - "outputs": [ - { - "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 177, - "block_seq": 4, - "unknown": false - }, - "time": 1428793611, - "txn": { - "length": 220, - "type": 0, - "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", - "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", - "timestamp": 1428793611, - "sigs": [ - "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" - ], - "inputs": [ - "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" - ], - "outputs": [ - { - "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999980.000000", - "hours": 3704 - }, - { - "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 176, - "block_seq": 5, - "unknown": false - }, - "time": 1428798821, - "txn": { - "length": 317, - "type": 0, - "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", - "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", - "timestamp": 1428798821, - "sigs": [ - "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", - "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" - ], - "inputs": [ - "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", - "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" - ], - "outputs": [ - { - "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999890.000000", - "hours": 4073 - }, - { - "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "100.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 175, - "block_seq": 6, - "unknown": false - }, - "time": 1428806251, - "txn": { - "length": 220, - "type": 0, - "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", - "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", - "timestamp": 1428806251, - "sigs": [ - "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" - ], - "inputs": [ - "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" - ], - "outputs": [ - { - "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "95.000000", - "hours": 0 - }, - { - "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 174, - "block_seq": 7, - "unknown": false - }, - "time": 1428807671, - "txn": { - "length": 220, - "type": 0, - "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", - "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", - "timestamp": 1428807671, - "sigs": [ - "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" - ], - "inputs": [ - "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" - ], - "outputs": [ - { - "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "90.000000", - "hours": 0 - }, - { - "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", - "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 173, - "block_seq": 8, - "unknown": false - }, - "time": 1428807691, - "txn": { - "length": 220, - "type": 0, - "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", - "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", - "timestamp": 1428807691, - "sigs": [ - "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" - ], - "inputs": [ - "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" - ], - "outputs": [ - { - "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "85.000000", - "hours": 0 - }, - { - "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", - "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 172, - "block_seq": 9, - "unknown": false - }, - "time": 1428807711, - "txn": { - "length": 220, - "type": 0, - "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", - "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", - "timestamp": 1428807711, - "sigs": [ - "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" - ], - "inputs": [ - "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" - ], - "outputs": [ - { - "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "80.000000", - "hours": 0 - }, - { - "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 171, - "block_seq": 10, - "unknown": false - }, - "time": 1428807771, - "txn": { - "length": 220, - "type": 0, - "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", - "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", - "timestamp": 1428807771, - "sigs": [ - "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" - ], - "inputs": [ - "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" - ], - "outputs": [ - { - "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "75.000000", - "hours": 0 - }, - { - "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 170, - "block_seq": 11, - "unknown": false - }, - "time": 1428808851, - "txn": { - "length": 220, - "type": 0, - "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", - "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", - "timestamp": 1428808851, - "sigs": [ - "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" - ], - "inputs": [ - "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" - ], - "outputs": [ - { - "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "4.000000", - "hours": 0 - }, - { - "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", - "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 169, - "block_seq": 12, - "unknown": false - }, - "time": 1428814821, - "txn": { - "length": 183, - "type": 0, - "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", - "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", - "timestamp": 1428814821, - "sigs": [ - "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" - ], - "inputs": [ - "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" - ], - "outputs": [ - { - "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", - "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 168, - "block_seq": 13, - "unknown": false - }, - "time": 1428814891, - "txn": { - "length": 220, - "type": 0, - "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", - "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", - "timestamp": 1428814891, - "sigs": [ - "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" - ], - "inputs": [ - "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" - ], - "outputs": [ - { - "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "3.000000", - "hours": 4 - }, - { - "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 167, - "block_seq": 14, - "unknown": false - }, - "time": 1428815131, - "txn": { - "length": 183, - "type": 0, - "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", - "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", - "timestamp": 1428815131, - "sigs": [ - "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" - ], - "inputs": [ - "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" - ], - "outputs": [ - { - "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 166, - "block_seq": 15, - "unknown": false - }, - "time": 1428820169, - "txn": { - "length": 220, - "type": 0, - "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", - "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", - "timestamp": 1428820169, - "sigs": [ - "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" - ], - "inputs": [ - "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" - ], - "outputs": [ - { - "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "70.000000", - "hours": 102 - }, - { - "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", - "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 165, - "block_seq": 16, - "unknown": false - }, - "time": 1428820629, - "txn": { - "length": 220, - "type": 0, - "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", - "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", - "timestamp": 1428820629, - "sigs": [ - "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" - ], - "inputs": [ - "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" - ], - "outputs": [ - { - "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", - "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", - "coins": "3.000000", - "hours": 0 - }, - { - "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", - "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", - "coins": "2.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 164, - "block_seq": 17, - "unknown": false - }, - "time": 1428989855, - "txn": { - "length": 220, - "type": 0, - "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", - "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", - "timestamp": 1428989855, - "sigs": [ - "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" - ], - "inputs": [ - "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" - ], - "outputs": [ - { - "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 4040790 - }, - { - "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 163, - "block_seq": 18, - "unknown": false - }, - "time": 1428989925, - "txn": { - "length": 183, - "type": 0, - "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", - "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", - "timestamp": 1428989925, - "sigs": [ - "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" - ], - "inputs": [ - "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" - ], - "outputs": [ - { - "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 162, - "block_seq": 19, - "unknown": false - }, - "time": 1428990115, - "txn": { - "length": 220, - "type": 0, - "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", - "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", - "timestamp": 1428990115, - "sigs": [ - "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" - ], - "inputs": [ - "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" - ], - "outputs": [ - { - "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "65.000000", - "hours": 2268 - }, - { - "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", - "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 161, - "block_seq": 20, - "unknown": false - }, - "time": 1428990135, - "txn": { - "length": 220, - "type": 0, - "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", - "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", - "timestamp": 1428990135, - "sigs": [ - "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" - ], - "inputs": [ - "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" - ], - "outputs": [ - { - "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "60.000000", - "hours": 1512 - }, - { - "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", - "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 160, - "block_seq": 21, - "unknown": false - }, - "time": 1428991365, - "txn": { - "length": 220, - "type": 0, - "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", - "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", - "timestamp": 1428991365, - "sigs": [ - "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" - ], - "inputs": [ - "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" - ], - "outputs": [ - { - "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "55.000000", - "hours": 1008 - }, - { - "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", - "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", - "coins": "5.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 159, - "block_seq": 22, - "unknown": false - }, - "time": 1428991585, - "txn": { - "length": 220, - "type": 0, - "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", - "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", - "timestamp": 1428991585, - "sigs": [ - "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" - ], - "inputs": [ - "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" - ], - "outputs": [ - { - "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", - "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", - "coins": "4.000000", - "hours": 0 - }, - { - "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", - "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 158, - "block_seq": 23, - "unknown": false - }, - "time": 1428991605, - "txn": { - "length": 220, - "type": 0, - "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", - "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", - "timestamp": 1428991605, - "sigs": [ - "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" - ], - "inputs": [ - "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" - ], - "outputs": [ - { - "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", - "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", - "coins": "3.000000", - "hours": 0 - }, - { - "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", - "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", - "coins": "1.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 157, - "block_seq": 24, - "unknown": false - }, - "time": 1428991635, - "txn": { - "length": 280, - "type": 0, - "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", - "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", - "timestamp": 1428991635, - "sigs": [ - "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", - "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" - ], - "inputs": [ - "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", - "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" - ], - "outputs": [ - { - "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", - "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", - "coins": "2.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 156, - "block_seq": 25, - "unknown": false - }, - "time": 1428991665, - "txn": { - "length": 220, - "type": 0, - "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", - "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", - "timestamp": 1428991665, - "sigs": [ - "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" - ], - "inputs": [ - "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" - ], - "outputs": [ - { - "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", - "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", - "coins": "1.000000", - "hours": 0 - }, - { - "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", - "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", - "coins": "2.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 155, - "block_seq": 26, - "unknown": false - }, - "time": 1429011077, - "txn": { - "length": 317, - "type": 0, - "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", - "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", - "timestamp": 1429011077, - "sigs": [ - "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", - "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" - ], - "inputs": [ - "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", - "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" - ], - "outputs": [ - { - "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999880.000000", - "hours": 567938 - }, - { - "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", - "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", - "coins": "10.000000", - "hours": 567938 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 154, - "block_seq": 27, - "unknown": false - }, - "time": 1429011137, - "txn": { - "length": 220, - "type": 0, - "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", - "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", - "timestamp": 1429011137, - "sigs": [ - "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" - ], - "inputs": [ - "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" - ], - "outputs": [ - { - "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "999790.000000", - "hours": 70992 - }, - { - "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", - "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", - "coins": "90.000000", - "hours": 70992 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 153, - "block_seq": 28, - "unknown": false - }, - "time": 1429020387, - "txn": { - "length": 220, - "type": 0, - "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", - "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", - "timestamp": 1429020387, - "sigs": [ - "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" - ], - "inputs": [ - "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" - ], - "outputs": [ - { - "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "3.000000", - "hours": 35 - }, - { - "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "2.000000", - "hours": 35 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 152, - "block_seq": 29, - "unknown": false - }, - "time": 1429020687, - "txn": { - "length": 183, - "type": 0, - "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", - "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", - "timestamp": 1429020687, - "sigs": [ - "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" - ], - "inputs": [ - "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" - ], - "outputs": [ - { - "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 78 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 151, - "block_seq": 30, - "unknown": false - }, - "time": 1429021044, - "txn": { - "length": 183, - "type": 0, - "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", - "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", - "timestamp": 1429021044, - "sigs": [ - "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" - ], - "inputs": [ - "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" - ], - "outputs": [ - { - "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "3.000000", - "hours": 4 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 150, - "block_seq": 31, - "unknown": false - }, - "time": 1429021184, - "txn": { - "length": 220, - "type": 0, - "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", - "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", - "timestamp": 1429021184, - "sigs": [ - "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" - ], - "inputs": [ - "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" - ], - "outputs": [ - { - "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "5.000000", - "hours": 9 - }, - { - "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "5.000000", - "hours": 9 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 149, - "block_seq": 32, - "unknown": false - }, - "time": 1429021214, - "txn": { - "length": 183, - "type": 0, - "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", - "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", - "timestamp": 1429021214, - "sigs": [ - "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" - ], - "inputs": [ - "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" - ], - "outputs": [ - { - "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "5.000000", - "hours": 1 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 148, - "block_seq": 33, - "unknown": false - }, - "time": 1429021674, - "txn": { - "length": 280, - "type": 0, - "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", - "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", - "timestamp": 1429021674, - "sigs": [ - "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", - "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" - ], - "inputs": [ - "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", - "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" - ], - "outputs": [ - { - "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 1 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 147, - "block_seq": 34, - "unknown": false - }, - "time": 1429021994, - "txn": { - "length": 220, - "type": 0, - "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", - "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", - "timestamp": 1429021994, - "sigs": [ - "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" - ], - "inputs": [ - "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" - ], - "outputs": [ - { - "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "6.000000", - "hours": 0 - }, - { - "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "4.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 146, - "block_seq": 35, - "unknown": false - }, - "time": 1429022034, - "txn": { - "length": 183, - "type": 0, - "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", - "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", - "timestamp": 1429022034, - "sigs": [ - "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" - ], - "inputs": [ - "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" - ], - "outputs": [ - { - "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "6.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 145, - "block_seq": 36, - "unknown": false - }, - "time": 1429022064, - "txn": { - "length": 280, - "type": 0, - "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", - "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", - "timestamp": 1429022064, - "sigs": [ - "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", - "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" - ], - "inputs": [ - "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", - "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" - ], - "outputs": [ - { - "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 144, - "block_seq": 37, - "unknown": false - }, - "time": 1429022094, - "txn": { - "length": 183, - "type": 0, - "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", - "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", - "timestamp": 1429022094, - "sigs": [ - "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" - ], - "inputs": [ - "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" - ], - "outputs": [ - { - "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 143, - "block_seq": 38, - "unknown": false - }, - "time": 1429058484, - "txn": { - "length": 220, - "type": 0, - "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", - "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", - "timestamp": 1429058484, - "sigs": [ - "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" - ], - "inputs": [ - "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" - ], - "outputs": [ - { - "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "998790.000000", - "hours": 389245 - }, - { - "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "1000.000000", - "hours": 389245 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 142, - "block_seq": 39, - "unknown": false - }, - "time": 1429058494, - "txn": { - "length": 220, - "type": 0, - "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", - "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", - "timestamp": 1429058494, - "sigs": [ - "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" - ], - "inputs": [ - "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" - ], - "outputs": [ - { - "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "988790.000000", - "hours": 48655 - }, - { - "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "10000.000000", - "hours": 48655 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 141, - "block_seq": 40, - "unknown": false - }, - "time": 1429058514, - "txn": { - "length": 220, - "type": 0, - "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", - "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", - "timestamp": 1429058514, - "sigs": [ - "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" - ], - "inputs": [ - "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" - ], - "outputs": [ - { - "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "978790.000000", - "hours": 6081 - }, - { - "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "10000.000000", - "hours": 6081 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 140, - "block_seq": 41, - "unknown": false - }, - "time": 1429058524, - "txn": { - "length": 220, - "type": 0, - "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", - "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", - "timestamp": 1429058524, - "sigs": [ - "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" - ], - "inputs": [ - "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" - ], - "outputs": [ - { - "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "969790.000000", - "hours": 760 - }, - { - "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "9000.000000", - "hours": 760 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 139, - "block_seq": 42, - "unknown": false - }, - "time": 1429058594, - "txn": { - "length": 317, - "type": 0, - "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", - "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", - "timestamp": 1429058594, - "sigs": [ - "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", - "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" - ], - "inputs": [ - "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", - "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" - ], - "outputs": [ - { - "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "9000.000000", - "hours": 48752 - }, - { - "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", - "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", - "coins": "1000.000000", - "hours": 48752 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 138, - "block_seq": 43, - "unknown": false - }, - "time": 1429070374, - "txn": { - "length": 414, - "type": 0, - "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", - "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", - "timestamp": 1429070374, - "sigs": [ - "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", - "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", - "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" - ], - "inputs": [ - "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", - "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", - "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" - ], - "outputs": [ - { - "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "55.000000", - "hours": 265 - }, - { - "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", - "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", - "coins": "5.000000", - "hours": 265 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 137, - "block_seq": 44, - "unknown": false - }, - "time": 1429070414, - "txn": { - "length": 220, - "type": 0, - "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", - "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", - "timestamp": 1429070414, - "sigs": [ - "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" - ], - "inputs": [ - "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" - ], - "outputs": [ - { - "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "50.000000", - "hours": 33 - }, - { - "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", - "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", - "coins": "5.000000", - "hours": 33 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 136, - "block_seq": 45, - "unknown": false - }, - "time": 1429071074, - "txn": { - "length": 220, - "type": 0, - "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", - "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", - "timestamp": 1429071074, - "sigs": [ - "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" - ], - "inputs": [ - "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" - ], - "outputs": [ - { - "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944790.000000", - "hours": 400470 - }, - { - "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "25000.000000", - "hours": 400470 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 135, - "block_seq": 46, - "unknown": false - }, - "time": 1429077374, - "txn": { - "length": 220, - "type": 0, - "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", - "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", - "timestamp": 1429077374, - "sigs": [ - "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" - ], - "inputs": [ - "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" - ], - "outputs": [ - { - "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944780.000000", - "hours": 50058 - }, - { - "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 50058 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 134, - "block_seq": 47, - "unknown": false - }, - "time": 1429077384, - "txn": { - "length": 220, - "type": 0, - "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", - "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", - "timestamp": 1429077384, - "sigs": [ - "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" - ], - "inputs": [ - "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" - ], - "outputs": [ - { - "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944770.000000", - "hours": 6257 - }, - { - "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 6257 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 133, - "block_seq": 48, - "unknown": false - }, - "time": 1429077394, - "txn": { - "length": 220, - "type": 0, - "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", - "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", - "timestamp": 1429077394, - "sigs": [ - "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" - ], - "inputs": [ - "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" - ], - "outputs": [ - { - "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944760.000000", - "hours": 782 - }, - { - "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 782 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 132, - "block_seq": 49, - "unknown": false - }, - "time": 1429077404, - "txn": { - "length": 220, - "type": 0, - "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", - "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", - "timestamp": 1429077404, - "sigs": [ - "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" - ], - "inputs": [ - "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" - ], - "outputs": [ - { - "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "944750.000000", - "hours": 97 - }, - { - "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10.000000", - "hours": 97 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 131, - "block_seq": 50, - "unknown": false - }, - "time": 1429077474, - "txn": { - "length": 220, - "type": 0, - "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", - "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", - "timestamp": 1429077474, - "sigs": [ - "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" - ], - "inputs": [ - "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" - ], - "outputs": [ - { - "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "8000.000000", - "hours": 11972 - }, - { - "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "1000.000000", - "hours": 11972 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 130, - "block_seq": 51, - "unknown": false - }, - "time": 1429077484, - "txn": { - "length": 220, - "type": 0, - "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", - "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", - "timestamp": 1429077484, - "sigs": [ - "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" - ], - "inputs": [ - "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" - ], - "outputs": [ - { - "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "9000.000000", - "hours": 7343 - }, - { - "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", - "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", - "coins": "1000.000000", - "hours": 7343 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 129, - "block_seq": 52, - "unknown": false - }, - "time": 1429077494, - "txn": { - "length": 220, - "type": 0, - "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", - "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", - "timestamp": 1429077494, - "sigs": [ - "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" - ], - "inputs": [ - "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" - ], - "outputs": [ - { - "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "7000.000000", - "hours": 1499 - }, - { - "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "1000.000000", - "hours": 1499 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 128, - "block_seq": 53, - "unknown": false - }, - "time": 1429077514, - "txn": { - "length": 220, - "type": 0, - "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", - "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", - "timestamp": 1429077514, - "sigs": [ - "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" - ], - "inputs": [ - "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" - ], - "outputs": [ - { - "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "943750.000000", - "hours": 2964 - }, - { - "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "1000.000000", - "hours": 2964 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 127, - "block_seq": 54, - "unknown": false - }, - "time": 1429077524, - "txn": { - "length": 220, - "type": 0, - "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", - "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", - "timestamp": 1429077524, - "sigs": [ - "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" - ], - "inputs": [ - "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" - ], - "outputs": [ - { - "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "6000.000000", - "hours": 192 - }, - { - "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "1000.000000", - "hours": 192 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 126, - "block_seq": 55, - "unknown": false - }, - "time": 1429077544, - "txn": { - "length": 220, - "type": 0, - "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", - "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", - "timestamp": 1429077544, - "sigs": [ - "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" - ], - "inputs": [ - "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" - ], - "outputs": [ - { - "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "8000.000000", - "hours": 930 - }, - { - "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", - "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", - "coins": "1000.000000", - "hours": 930 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 125, - "block_seq": 56, - "unknown": false - }, - "time": 1429077554, - "txn": { - "length": 220, - "type": 0, - "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", - "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", - "timestamp": 1429077554, - "sigs": [ - "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" - ], - "inputs": [ - "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" - ], - "outputs": [ - { - "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "9000.000000", - "hours": 12696 - }, - { - "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", - "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", - "coins": "1000.000000", - "hours": 12696 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 124, - "block_seq": 57, - "unknown": false - }, - "time": 1429077584, - "txn": { - "length": 220, - "type": 0, - "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", - "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", - "timestamp": 1429077584, - "sigs": [ - "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" - ], - "inputs": [ - "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" - ], - "outputs": [ - { - "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "942750.000000", - "hours": 1681 - }, - { - "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "1000.000000", - "hours": 1681 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 123, - "block_seq": 58, - "unknown": false - }, - "time": 1429077604, - "txn": { - "length": 220, - "type": 0, - "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", - "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", - "timestamp": 1429077604, - "sigs": [ - "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" - ], - "inputs": [ - "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" - ], - "outputs": [ - { - "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "5000.000000", - "hours": 36 - }, - { - "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "1000.000000", - "hours": 36 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 122, - "block_seq": 59, - "unknown": false - }, - "time": 1429077614, - "txn": { - "length": 220, - "type": 0, - "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", - "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", - "timestamp": 1429077614, - "sigs": [ - "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" - ], - "inputs": [ - "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" - ], - "outputs": [ - { - "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "7000.000000", - "hours": 132 - }, - { - "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "1000.000000", - "hours": 132 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 121, - "block_seq": 60, - "unknown": false - }, - "time": 1429077624, - "txn": { - "length": 220, - "type": 0, - "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", - "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", - "timestamp": 1429077624, - "sigs": [ - "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" - ], - "inputs": [ - "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" - ], - "outputs": [ - { - "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "8000.000000", - "hours": 1605 - }, - { - "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 1605 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 120, - "block_seq": 61, - "unknown": false - }, - "time": 1429077654, - "txn": { - "length": 220, - "type": 0, - "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", - "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", - "timestamp": 1429077654, - "sigs": [ - "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" - ], - "inputs": [ - "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" - ], - "outputs": [ - { - "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "941750.000000", - "hours": 1519 - }, - { - "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", - "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", - "coins": "1000.000000", - "hours": 1519 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 119, - "block_seq": 62, - "unknown": false - }, - "time": 1429077664, - "txn": { - "length": 220, - "type": 0, - "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", - "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", - "timestamp": 1429077664, - "sigs": [ - "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" - ], - "inputs": [ - "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" - ], - "outputs": [ - { - "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "4000.000000", - "hours": 13 - }, - { - "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", - "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", - "coins": "1000.000000", - "hours": 13 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 118, - "block_seq": 63, - "unknown": false - }, - "time": 1429077684, - "txn": { - "length": 220, - "type": 0, - "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", - "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", - "timestamp": 1429077684, - "sigs": [ - "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" - ], - "inputs": [ - "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" - ], - "outputs": [ - { - "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "7000.000000", - "hours": 211 - }, - { - "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", - "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", - "coins": "1000.000000", - "hours": 211 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 117, - "block_seq": 64, - "unknown": false - }, - "time": 1429077694, - "txn": { - "length": 220, - "type": 0, - "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", - "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", - "timestamp": 1429077694, - "sigs": [ - "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" - ], - "inputs": [ - "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" - ], - "outputs": [ - { - "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "940750.000000", - "hours": 1170 - }, - { - "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "1000.000000", - "hours": 1170 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 116, - "block_seq": 65, - "unknown": false - }, - "time": 1429077724, - "txn": { - "length": 220, - "type": 0, - "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", - "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", - "timestamp": 1429077724, - "sigs": [ - "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" - ], - "inputs": [ - "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" - ], - "outputs": [ - { - "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "3000.000000", - "hours": 5 - }, - { - "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 5 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 115, - "block_seq": 66, - "unknown": false - }, - "time": 1429077734, - "txn": { - "length": 220, - "type": 0, - "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", - "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", - "timestamp": 1429077734, - "sigs": [ - "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" - ], - "inputs": [ - "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" - ], - "outputs": [ - { - "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "6000.000000", - "hours": 43 - }, - { - "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 43 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 114, - "block_seq": 67, - "unknown": false - }, - "time": 1429077874, - "txn": { - "length": 220, - "type": 0, - "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", - "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", - "timestamp": 1429077874, - "sigs": [ - "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" - ], - "inputs": [ - "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" - ], - "outputs": [ - { - "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "939750.000000", - "hours": 1452 - }, - { - "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "1000.000000", - "hours": 1452 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 113, - "block_seq": 68, - "unknown": false - }, - "time": 1429077914, - "txn": { - "length": 220, - "type": 0, - "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", - "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", - "timestamp": 1429077914, - "sigs": [ - "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" - ], - "inputs": [ - "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" - ], - "outputs": [ - { - "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "938750.000000", - "hours": 181 - }, - { - "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 181 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 112, - "block_seq": 69, - "unknown": false - }, - "time": 1429077944, - "txn": { - "length": 220, - "type": 0, - "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", - "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", - "timestamp": 1429077944, - "sigs": [ - "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" - ], - "inputs": [ - "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" - ], - "outputs": [ - { - "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "913750.000000", - "hours": 22 - }, - { - "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "25000.000000", - "hours": 22 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 111, - "block_seq": 70, - "unknown": false - }, - "time": 1429077964, - "txn": { - "length": 220, - "type": 0, - "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", - "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", - "timestamp": 1429077964, - "sigs": [ - "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" - ], - "inputs": [ - "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" - ], - "outputs": [ - { - "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "888750.000000", - "hours": 2 - }, - { - "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "25000.000000", - "hours": 2 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 110, - "block_seq": 71, - "unknown": false - }, - "time": 1429077974, - "txn": { - "length": 220, - "type": 0, - "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", - "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", - "timestamp": 1429077974, - "sigs": [ - "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" - ], - "inputs": [ - "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" - ], - "outputs": [ - { - "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863750.000000", - "hours": 0 - }, - { - "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "25000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 109, - "block_seq": 72, - "unknown": false - }, - "time": 1429078004, - "txn": { - "length": 414, - "type": 0, - "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", - "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", - "timestamp": 1429078004, - "sigs": [ - "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", - "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", - "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" - ], - "inputs": [ - "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", - "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", - "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" - ], - "outputs": [ - { - "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "31000.000000", - "hours": 93 - }, - { - "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "25000.000000", - "hours": 93 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 108, - "block_seq": 73, - "unknown": false - }, - "time": 1429091164, - "txn": { - "length": 220, - "type": 0, - "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", - "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", - "timestamp": 1429091164, - "sigs": [ - "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" - ], - "inputs": [ - "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" - ], - "outputs": [ - { - "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "995.000000", - "hours": 387 - }, - { - "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", - "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", - "coins": "5.000000", - "hours": 387 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 107, - "block_seq": 74, - "unknown": false - }, - "time": 1429091944, - "txn": { - "length": 317, - "type": 0, - "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", - "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", - "timestamp": 1429091944, - "sigs": [ - "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", - "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" - ], - "inputs": [ - "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", - "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" - ], - "outputs": [ - { - "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", - "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", - "coins": "955.000000", - "hours": 7273 - }, - { - "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", - "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", - "coins": "50.000000", - "hours": 7273 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 106, - "block_seq": 75, - "unknown": false - }, - "time": 1429096344, - "txn": { - "length": 220, - "type": 0, - "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", - "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", - "timestamp": 1429096344, - "sigs": [ - "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" - ], - "inputs": [ - "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" - ], - "outputs": [ - { - "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", - "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", - "coins": "5.000000", - "hours": 909 - }, - { - "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", - "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", - "coins": "45.000000", - "hours": 909 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 105, - "block_seq": 76, - "unknown": false - }, - "time": 1429110544, - "txn": { - "length": 317, - "type": 0, - "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", - "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", - "timestamp": 1429110544, - "sigs": [ - "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", - "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" - ], - "inputs": [ - "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", - "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" - ], - "outputs": [ - { - "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "25045.000000", - "hours": 72043 - }, - { - "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", - "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", - "coins": "5.000000", - "hours": 72043 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 104, - "block_seq": 77, - "unknown": false - }, - "time": 1429147880, - "txn": { - "length": 220, - "type": 0, - "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", - "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", - "timestamp": 1429147880, - "sigs": [ - "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" - ], - "inputs": [ - "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" - ], - "outputs": [ - { - "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "862750.000000", - "hours": 976817 - }, - { - "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 976817 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 103, - "block_seq": 78, - "unknown": false - }, - "time": 1429147900, - "txn": { - "length": 317, - "type": 0, - "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", - "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", - "timestamp": 1429147900, - "sigs": [ - "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", - "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" - ], - "inputs": [ - "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", - "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" - ], - "outputs": [ - { - "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "27000.000000", - "hours": 67976 - }, - { - "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", - "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", - "coins": "1000.000000", - "hours": 67976 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 102, - "block_seq": 79, - "unknown": false - }, - "time": 1429147950, - "txn": { - "length": 317, - "type": 0, - "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", - "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", - "timestamp": 1429147950, - "sigs": [ - "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", - "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" - ], - "inputs": [ - "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", - "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" - ], - "outputs": [ - { - "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "31000.000000", - "hours": 77792 - }, - { - "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", - "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", - "coins": "1000.000000", - "hours": 77792 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 101, - "block_seq": 80, - "unknown": false - }, - "time": 1429148000, - "txn": { - "length": 220, - "type": 0, - "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", - "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", - "timestamp": 1429148000, - "sigs": [ - "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" - ], - "inputs": [ - "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" - ], - "outputs": [ - { - "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "26000.000000", - "hours": 8543 - }, - { - "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", - "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", - "coins": "1000.000000", - "hours": 8543 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 100, - "block_seq": 81, - "unknown": false - }, - "time": 1429164440, - "txn": { - "length": 220, - "type": 0, - "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", - "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", - "timestamp": 1429164440, - "sigs": [ - "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" - ], - "inputs": [ - "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" - ], - "outputs": [ - { - "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861750.000000", - "hours": 125696 - }, - { - "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 125696 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 99, - "block_seq": 82, - "unknown": false - }, - "time": 1429164460, - "txn": { - "length": 220, - "type": 0, - "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", - "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", - "timestamp": 1429164460, - "sigs": [ - "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" - ], - "inputs": [ - "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" - ], - "outputs": [ - { - "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "30000.000000", - "hours": 93050 - }, - { - "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", - "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", - "coins": "1000.000000", - "hours": 93050 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 98, - "block_seq": 83, - "unknown": false - }, - "time": 1429164480, - "txn": { - "length": 220, - "type": 0, - "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", - "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", - "timestamp": 1429164480, - "sigs": [ - "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" - ], - "inputs": [ - "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" - ], - "outputs": [ - { - "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "30000.000000", - "hours": 27495 - }, - { - "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "1000.000000", - "hours": 27495 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 97, - "block_seq": 84, - "unknown": false - }, - "time": 1429164590, - "txn": { - "length": 220, - "type": 0, - "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", - "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", - "timestamp": 1429164590, - "sigs": [ - "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" - ], - "inputs": [ - "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" - ], - "outputs": [ - { - "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "29700.000000", - "hours": 3436 - }, - { - "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "300.000000", - "hours": 3436 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 96, - "block_seq": 85, - "unknown": false - }, - "time": 1429164620, - "txn": { - "length": 220, - "type": 0, - "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", - "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", - "timestamp": 1429164620, - "sigs": [ - "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" - ], - "inputs": [ - "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" - ], - "outputs": [ - { - "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "861050.000000", - "hours": 20200 - }, - { - "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "700.000000", - "hours": 20200 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 95, - "block_seq": 86, - "unknown": false - }, - "time": 1429164720, - "txn": { - "length": 220, - "type": 0, - "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", - "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", - "timestamp": 1429164720, - "sigs": [ - "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" - ], - "inputs": [ - "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" - ], - "outputs": [ - { - "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "860050.000000", - "hours": 2525 - }, - { - "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", - "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", - "coins": "1000.000000", - "hours": 2525 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 94, - "block_seq": 87, - "unknown": false - }, - "time": 1429164730, - "txn": { - "length": 220, - "type": 0, - "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", - "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", - "timestamp": 1429164730, - "sigs": [ - "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" - ], - "inputs": [ - "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" - ], - "outputs": [ - { - "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "25000.000000", - "hours": 16162 - }, - { - "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", - "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", - "coins": "1000.000000", - "hours": 16162 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 93, - "block_seq": 88, - "unknown": false - }, - "time": 1429164790, - "txn": { - "length": 220, - "type": 0, - "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", - "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", - "timestamp": 1429164790, - "sigs": [ - "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" - ], - "inputs": [ - "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" - ], - "outputs": [ - { - "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "29000.000000", - "hours": 11912 - }, - { - "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", - "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", - "coins": "1000.000000", - "hours": 11912 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 92, - "block_seq": 89, - "unknown": false - }, - "time": 1429164800, - "txn": { - "length": 220, - "type": 0, - "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", - "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", - "timestamp": 1429164800, - "sigs": [ - "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" - ], - "inputs": [ - "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" - ], - "outputs": [ - { - "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "28700.000000", - "hours": 635 - }, - { - "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", - "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", - "coins": "1000.000000", - "hours": 635 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 91, - "block_seq": 90, - "unknown": false - }, - "time": 1429164810, - "txn": { - "length": 220, - "type": 0, - "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", - "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", - "timestamp": 1429164810, - "sigs": [ - "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" - ], - "inputs": [ - "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" - ], - "outputs": [ - { - "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "859050.000000", - "hours": 2704 - }, - { - "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 2704 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 90, - "block_seq": 91, - "unknown": false - }, - "time": 1429164830, - "txn": { - "length": 220, - "type": 0, - "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", - "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", - "timestamp": 1429164830, - "sigs": [ - "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" - ], - "inputs": [ - "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" - ], - "outputs": [ - { - "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "24000.000000", - "hours": 2089 - }, - { - "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", - "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", - "coins": "1000.000000", - "hours": 2089 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 89, - "block_seq": 92, - "unknown": false - }, - "time": 1429164850, - "txn": { - "length": 220, - "type": 0, - "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", - "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", - "timestamp": 1429164850, - "sigs": [ - "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" - ], - "inputs": [ - "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" - ], - "outputs": [ - { - "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "28000.000000", - "hours": 1529 - }, - { - "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", - "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", - "coins": "1000.000000", - "hours": 1529 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 88, - "block_seq": 93, - "unknown": false - }, - "time": 1429164860, - "txn": { - "length": 220, - "type": 0, - "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", - "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", - "timestamp": 1429164860, - "sigs": [ - "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" - ], - "inputs": [ - "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" - ], - "outputs": [ - { - "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "27700.000000", - "hours": 129 - }, - { - "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", - "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", - "coins": "1000.000000", - "hours": 129 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 87, - "block_seq": 94, - "unknown": false - }, - "time": 1429164870, - "txn": { - "length": 220, - "type": 0, - "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", - "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", - "timestamp": 1429164870, - "sigs": [ - "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" - ], - "inputs": [ - "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" - ], - "outputs": [ - { - "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858050.000000", - "hours": 1829 - }, - { - "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "1000.000000", - "hours": 1829 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 86, - "block_seq": 95, - "unknown": false - }, - "time": 1429164880, - "txn": { - "length": 220, - "type": 0, - "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", - "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", - "timestamp": 1429164880, - "sigs": [ - "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" - ], - "inputs": [ - "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" - ], - "outputs": [ - { - "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "23000.000000", - "hours": 294 - }, - { - "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", - "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", - "coins": "1000.000000", - "hours": 294 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 85, - "block_seq": 96, - "unknown": false - }, - "time": 1429164900, - "txn": { - "length": 220, - "type": 0, - "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", - "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", - "timestamp": 1429164900, - "sigs": [ - "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" - ], - "inputs": [ - "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" - ], - "outputs": [ - { - "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", - "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", - "coins": "27000.000000", - "hours": 220 - }, - { - "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", - "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", - "coins": "1000.000000", - "hours": 220 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 84, - "block_seq": 97, - "unknown": false - }, - "time": 1429165260, - "txn": { - "length": 220, - "type": 0, - "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", - "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", - "timestamp": 1429165260, - "sigs": [ - "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" - ], - "inputs": [ - "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" - ], - "outputs": [ - { - "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26700.000000", - "hours": 54 - }, - { - "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", - "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", - "coins": "1000.000000", - "hours": 54 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 83, - "block_seq": 98, - "unknown": false - }, - "time": 1429274566, - "txn": { - "length": 220, - "type": 0, - "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", - "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", - "timestamp": 1429274566, - "sigs": [ - "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" - ], - "inputs": [ - "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" - ], - "outputs": [ - { - "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "858000.000000", - "hours": 11848 - }, - { - "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 11848 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 82, - "block_seq": 99, - "unknown": false - }, - "time": 1429274616, - "txn": { - "length": 571, - "type": 0, - "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", - "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", - "timestamp": 1429274616, - "sigs": [ - "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", - "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", - "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", - "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", - "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" - ], - "inputs": [ - "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", - "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", - "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", - "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", - "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" - ], - "outputs": [ - { - "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "50.000000", - "hours": 7510 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 81, - "block_seq": 100, - "unknown": false - }, - "time": 1429274636, - "txn": { - "length": 183, - "type": 0, - "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", - "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", - "timestamp": 1429274636, - "sigs": [ - "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" - ], - "inputs": [ - "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" - ], - "outputs": [ - { - "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "23000.000000", - "hours": 87673 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 80, - "block_seq": 101, - "unknown": false - }, - "time": 1429274666, - "txn": { - "length": 183, - "type": 0, - "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", - "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", - "timestamp": 1429274666, - "sigs": [ - "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" - ], - "inputs": [ - "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" - ], - "outputs": [ - { - "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "27000.000000", - "hours": 102905 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 79, - "block_seq": 102, - "unknown": false - }, - "time": 1429274686, - "txn": { - "length": 183, - "type": 0, - "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", - "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", - "timestamp": 1429274686, - "sigs": [ - "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" - ], - "inputs": [ - "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" - ], - "outputs": [ - { - "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26700.000000", - "hours": 101435 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 78, - "block_seq": 103, - "unknown": false - }, - "time": 1429278106, - "txn": { - "length": 220, - "type": 0, - "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", - "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", - "timestamp": 1429278106, - "sigs": [ - "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" - ], - "inputs": [ - "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" - ], - "outputs": [ - { - "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26600.000000", - "hours": 12679 - }, - { - "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", - "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", - "coins": "100.000000", - "hours": 12679 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 77, - "block_seq": 104, - "unknown": false - }, - "time": 1429278406, - "txn": { - "length": 220, - "type": 0, - "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", - "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", - "timestamp": 1429278406, - "sigs": [ - "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" - ], - "inputs": [ - "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" - ], - "outputs": [ - { - "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22900.000000", - "hours": 13730 - }, - { - "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", - "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", - "coins": "100.000000", - "hours": 13730 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 76, - "block_seq": 105, - "unknown": false - }, - "time": 1429278556, - "txn": { - "length": 220, - "type": 0, - "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", - "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", - "timestamp": 1429278556, - "sigs": [ - "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" - ], - "inputs": [ - "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" - ], - "outputs": [ - { - "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26500.000000", - "hours": 1861 - }, - { - "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", - "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", - "coins": "100.000000", - "hours": 1861 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 75, - "block_seq": 106, - "unknown": false - }, - "time": 1429279796, - "txn": { - "length": 511, - "type": 0, - "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", - "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", - "timestamp": 1429279796, - "sigs": [ - "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", - "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", - "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", - "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" - ], - "inputs": [ - "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", - "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", - "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", - "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" - ], - "outputs": [ - { - "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "885000.000000", - "hours": 139293 - }, - { - "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "100.000000", - "hours": 139293 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 74, - "block_seq": 107, - "unknown": false - }, - "time": 1429280596, - "txn": { - "length": 220, - "type": 0, - "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", - "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", - "timestamp": 1429280596, - "sigs": [ - "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" - ], - "inputs": [ - "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" - ], - "outputs": [ - { - "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "884900.000000", - "hours": 17411 - }, - { - "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", - "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", - "coins": "100.000000", - "hours": 17411 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 73, - "block_seq": 108, - "unknown": false - }, - "time": 1429280756, - "txn": { - "length": 220, - "type": 0, - "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", - "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", - "timestamp": 1429280756, - "sigs": [ - "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" - ], - "inputs": [ - "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" - ], - "outputs": [ - { - "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22800.000000", - "hours": 3457 - }, - { - "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "100.000000", - "hours": 3457 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 72, - "block_seq": 109, - "unknown": false - }, - "time": 1429302756, - "txn": { - "length": 220, - "type": 0, - "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", - "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", - "timestamp": 1429302756, - "sigs": [ - "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" - ], - "inputs": [ - "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" - ], - "outputs": [ - { - "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "881900.000000", - "hours": 7092 - }, - { - "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", - "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", - "coins": "3000.000000", - "hours": 7092 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 71, - "block_seq": 110, - "unknown": false - }, - "time": 1429326351, - "txn": { - "length": 220, - "type": 0, - "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", - "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", - "timestamp": 1429326351, - "sigs": [ - "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" - ], - "inputs": [ - "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" - ], - "outputs": [ - { - "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22700.000000", - "hours": 17848 - }, - { - "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", - "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", - "coins": "100.000000", - "hours": 17848 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 70, - "block_seq": 111, - "unknown": false - }, - "time": 1429348072, - "txn": { - "length": 220, - "type": 0, - "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", - "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", - "timestamp": 1429348072, - "sigs": [ - "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" - ], - "inputs": [ - "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" - ], - "outputs": [ - { - "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "12700.000000", - "hours": 2231 - }, - { - "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "10000.000000", - "hours": 2231 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 69, - "block_seq": 112, - "unknown": false - }, - "time": 1429348102, - "txn": { - "length": 317, - "type": 0, - "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", - "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", - "timestamp": 1429348102, - "sigs": [ - "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", - "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" - ], - "inputs": [ - "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", - "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" - ], - "outputs": [ - { - "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873900.000000", - "hours": 1388810 - }, - { - "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "18000.000000", - "hours": 1388810 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 68, - "block_seq": 113, - "unknown": false - }, - "time": 1429348172, - "txn": { - "length": 220, - "type": 0, - "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", - "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", - "timestamp": 1429348172, - "sigs": [ - "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" - ], - "inputs": [ - "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" - ], - "outputs": [ - { - "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873800.000000", - "hours": 173601 - }, - { - "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "100.000000", - "hours": 173601 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 67, - "block_seq": 114, - "unknown": false - }, - "time": 1429348502, - "txn": { - "length": 220, - "type": 0, - "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", - "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", - "timestamp": 1429348502, - "sigs": [ - "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" - ], - "inputs": [ - "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" - ], - "outputs": [ - { - "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873700.000000", - "hours": 21700 - }, - { - "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "100.000000", - "hours": 21700 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 66, - "block_seq": 115, - "unknown": false - }, - "time": 1429348712, - "txn": { - "length": 220, - "type": 0, - "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", - "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", - "timestamp": 1429348712, - "sigs": [ - "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" - ], - "inputs": [ - "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" - ], - "outputs": [ - { - "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "873600.000000", - "hours": 2712 - }, - { - "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", - "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", - "coins": "100.000000", - "hours": 2712 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 65, - "block_seq": 116, - "unknown": false - }, - "time": 1429349392, - "txn": { - "length": 220, - "type": 0, - "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", - "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", - "timestamp": 1429349392, - "sigs": [ - "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" - ], - "inputs": [ - "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" - ], - "outputs": [ - { - "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", - "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", - "coins": "26400.000000", - "hours": 64785 - }, - { - "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", - "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", - "coins": "100.000000", - "hours": 64785 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 64, - "block_seq": 117, - "unknown": false - }, - "time": 1429351912, - "txn": { - "length": 220, - "type": 0, - "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", - "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", - "timestamp": 1429351912, - "sigs": [ - "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" - ], - "inputs": [ - "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" - ], - "outputs": [ - { - "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "863600.000000", - "hours": 20965 - }, - { - "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", - "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", - "coins": "10000.000000", - "hours": 20965 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 63, - "block_seq": 118, - "unknown": false - }, - "time": 1429364072, - "txn": { - "length": 317, - "type": 0, - "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", - "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", - "timestamp": 1429364072, - "sigs": [ - "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", - "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" - ], - "inputs": [ - "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", - "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" - ], - "outputs": [ - { - "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "1045.000000", - "hours": 30769 - }, - { - "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", - "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", - "coins": "50.000000", - "hours": 30769 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 62, - "block_seq": 119, - "unknown": false - }, - "time": 1429364282, - "txn": { - "length": 220, - "type": 0, - "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", - "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", - "timestamp": 1429364282, - "sigs": [ - "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" - ], - "inputs": [ - "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" - ], - "outputs": [ - { - "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", - "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", - "coins": "12.000000", - "hours": 3846 - }, - { - "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", - "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", - "coins": "38.000000", - "hours": 3846 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 61, - "block_seq": 120, - "unknown": false - }, - "time": 1429364452, - "txn": { - "length": 183, - "type": 0, - "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", - "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", - "timestamp": 1429364452, - "sigs": [ - "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" - ], - "inputs": [ - "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" - ], - "outputs": [ - { - "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "38.000000", - "hours": 480 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 60, - "block_seq": 121, - "unknown": false - }, - "time": 1429382678, - "txn": { - "length": 220, - "type": 0, - "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", - "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", - "timestamp": 1429382678, - "sigs": [ - "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" - ], - "inputs": [ - "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" - ], - "outputs": [ - { - "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "801600.000000", - "hours": 378646 - }, - { - "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", - "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", - "coins": "62000.000000", - "hours": 378646 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 59, - "block_seq": 122, - "unknown": false - }, - "time": 1429382898, - "txn": { - "length": 220, - "type": 0, - "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", - "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", - "timestamp": 1429382898, - "sigs": [ - "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" - ], - "inputs": [ - "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" - ], - "outputs": [ - { - "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "765600.000000", - "hours": 47330 - }, - { - "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "36000.000000", - "hours": 47330 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 58, - "block_seq": 123, - "unknown": false - }, - "time": 1429451746, - "txn": { - "length": 220, - "type": 0, - "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", - "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", - "timestamp": 1429451746, - "sigs": [ - "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" - ], - "inputs": [ - "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" - ], - "outputs": [ - { - "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "755600.000000", - "hours": 5916 - }, - { - "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "10000.000000", - "hours": 5916 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 57, - "block_seq": 124, - "unknown": false - }, - "time": 1429522086, - "txn": { - "length": 220, - "type": 0, - "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", - "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", - "timestamp": 1429522086, - "sigs": [ - "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" - ], - "inputs": [ - "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" - ], - "outputs": [ - { - "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "750600.000000", - "hours": 739 - }, - { - "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", - "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", - "coins": "5000.000000", - "hours": 739 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 56, - "block_seq": 125, - "unknown": false - }, - "time": 1429578056, - "txn": { - "length": 220, - "type": 0, - "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", - "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", - "timestamp": 1429578056, - "sigs": [ - "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" - ], - "inputs": [ - "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" - ], - "outputs": [ - { - "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "738100.000000", - "hours": 92 - }, - { - "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", - "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", - "coins": "12500.000000", - "hours": 92 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 55, - "block_seq": 126, - "unknown": false - }, - "time": 1429680646, - "txn": { - "length": 317, - "type": 0, - "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", - "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", - "timestamp": 1429680646, - "sigs": [ - "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", - "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" - ], - "inputs": [ - "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", - "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" - ], - "outputs": [ - { - "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "990.000000", - "hours": 17310 - }, - { - "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", - "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", - "coins": "10.000000", - "hours": 17310 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 54, - "block_seq": 127, - "unknown": false - }, - "time": 1429848410, - "txn": { - "length": 317, - "type": 0, - "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", - "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", - "timestamp": 1429848410, - "sigs": [ - "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", - "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" - ], - "inputs": [ - "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", - "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" - ], - "outputs": [ - { - "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "30600.000000", - "hours": 528376 - }, - { - "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "100.000000", - "hours": 528376 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 53, - "block_seq": 128, - "unknown": false - }, - "time": 1429849170, - "txn": { - "length": 317, - "type": 0, - "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", - "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", - "timestamp": 1429849170, - "sigs": [ - "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", - "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" - ], - "inputs": [ - "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", - "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" - ], - "outputs": [ - { - "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "737200.000000", - "hours": 6994818 - }, - { - "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", - "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", - "coins": "1000.000000", - "hours": 6994818 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 52, - "block_seq": 129, - "unknown": false - }, - "time": 1429849180, - "txn": { - "length": 220, - "type": 0, - "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", - "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", - "timestamp": 1429849180, - "sigs": [ - "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" - ], - "inputs": [ - "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" - ], - "outputs": [ - { - "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "29600.000000", - "hours": 66854 - }, - { - "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", - "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", - "coins": "1000.000000", - "hours": 66854 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 51, - "block_seq": 130, - "unknown": false - }, - "time": 1430311531, - "txn": { - "length": 220, - "type": 0, - "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", - "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", - "timestamp": 1430311531, - "sigs": [ - "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" - ], - "inputs": [ - "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" - ], - "outputs": [ - { - "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "28600.000000", - "hours": 8356 - }, - { - "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "1000.000000", - "hours": 8356 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 50, - "block_seq": 131, - "unknown": false - }, - "time": 1430330041, - "txn": { - "length": 220, - "type": 0, - "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", - "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", - "timestamp": 1430330041, - "sigs": [ - "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" - ], - "inputs": [ - "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" - ], - "outputs": [ - { - "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "736000.000000", - "hours": 12709509 - }, - { - "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", - "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", - "coins": "1200.000000", - "hours": 12709509 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 49, - "block_seq": 132, - "unknown": false - }, - "time": 1430330311, - "txn": { - "length": 220, - "type": 0, - "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", - "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", - "timestamp": 1430330311, - "sigs": [ - "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" - ], - "inputs": [ - "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" - ], - "outputs": [ - { - "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "735000.000000", - "hours": 1588688 - }, - { - "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", - "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", - "coins": "1000.000000", - "hours": 1588688 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 48, - "block_seq": 133, - "unknown": false - }, - "time": 1430330421, - "txn": { - "length": 220, - "type": 0, - "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", - "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", - "timestamp": 1430330421, - "sigs": [ - "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" - ], - "inputs": [ - "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" - ], - "outputs": [ - { - "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734500.000000", - "hours": 198586 - }, - { - "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "500.000000", - "hours": 198586 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 47, - "block_seq": 134, - "unknown": false - }, - "time": 1430330481, - "txn": { - "length": 220, - "type": 0, - "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", - "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", - "timestamp": 1430330481, - "sigs": [ - "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" - ], - "inputs": [ - "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" - ], - "outputs": [ - { - "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "734400.000000", - "hours": 24823 - }, - { - "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "100.000000", - "hours": 24823 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 46, - "block_seq": 135, - "unknown": false - }, - "time": 1430330591, - "txn": { - "length": 220, - "type": 0, - "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", - "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", - "timestamp": 1430330591, - "sigs": [ - "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" - ], - "inputs": [ - "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" - ], - "outputs": [ - { - "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "733400.000000", - "hours": 3102 - }, - { - "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 3102 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 45, - "block_seq": 136, - "unknown": false - }, - "time": 1430330851, - "txn": { - "length": 220, - "type": 0, - "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", - "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", - "timestamp": 1430330851, - "sigs": [ - "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" - ], - "inputs": [ - "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" - ], - "outputs": [ - { - "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "732400.000000", - "hours": 387 - }, - { - "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", - "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", - "coins": "1000.000000", - "hours": 387 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 44, - "block_seq": 137, - "unknown": false - }, - "time": 1430504186, - "txn": { - "length": 220, - "type": 0, - "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", - "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", - "timestamp": 1430504186, - "sigs": [ - "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" - ], - "inputs": [ - "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" - ], - "outputs": [ - { - "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "731400.000000", - "hours": 48 - }, - { - "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "1000.000000", - "hours": 48 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 43, - "block_seq": 138, - "unknown": false - }, - "time": 1430504236, - "txn": { - "length": 220, - "type": 0, - "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", - "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", - "timestamp": 1430504236, - "sigs": [ - "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" - ], - "inputs": [ - "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" - ], - "outputs": [ - { - "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "730200.000000", - "hours": 6 - }, - { - "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", - "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", - "coins": "1200.000000", - "hours": 6 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 42, - "block_seq": 139, - "unknown": false - }, - "time": 1430504536, - "txn": { - "length": 220, - "type": 0, - "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", - "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", - "timestamp": 1430504536, - "sigs": [ - "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" - ], - "inputs": [ - "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" - ], - "outputs": [ - { - "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "729200.000000", - "hours": 0 - }, - { - "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", - "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 41, - "block_seq": 140, - "unknown": false - }, - "time": 1430504746, - "txn": { - "length": 220, - "type": 0, - "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", - "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", - "timestamp": 1430504746, - "sigs": [ - "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" - ], - "inputs": [ - "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" - ], - "outputs": [ - { - "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "728200.000000", - "hours": 0 - }, - { - "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 40, - "block_seq": 141, - "unknown": false - }, - "time": 1430504846, - "txn": { - "length": 220, - "type": 0, - "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", - "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", - "timestamp": 1430504846, - "sigs": [ - "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" - ], - "inputs": [ - "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" - ], - "outputs": [ - { - "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "725700.000000", - "hours": 0 - }, - { - "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", - "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", - "coins": "2500.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 39, - "block_seq": 142, - "unknown": false - }, - "time": 1430504966, - "txn": { - "length": 220, - "type": 0, - "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", - "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", - "timestamp": 1430504966, - "sigs": [ - "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" - ], - "inputs": [ - "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" - ], - "outputs": [ - { - "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724700.000000", - "hours": 0 - }, - { - "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 38, - "block_seq": 143, - "unknown": false - }, - "time": 1430505086, - "txn": { - "length": 220, - "type": 0, - "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", - "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", - "timestamp": 1430505086, - "sigs": [ - "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" - ], - "inputs": [ - "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" - ], - "outputs": [ - { - "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "724200.000000", - "hours": 0 - }, - { - "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", - "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", - "coins": "500.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 37, - "block_seq": 144, - "unknown": false - }, - "time": 1430505176, - "txn": { - "length": 220, - "type": 0, - "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", - "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", - "timestamp": 1430505176, - "sigs": [ - "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" - ], - "inputs": [ - "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" - ], - "outputs": [ - { - "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "723200.000000", - "hours": 0 - }, - { - "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", - "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 36, - "block_seq": 145, - "unknown": false - }, - "time": 1430550936, - "txn": { - "length": 280, - "type": 0, - "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", - "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", - "timestamp": 1430550936, - "sigs": [ - "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", - "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" - ], - "inputs": [ - "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", - "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" - ], - "outputs": [ - { - "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", - "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", - "coins": "2000.000000", - "hours": 99134 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 35, - "block_seq": 146, - "unknown": false - }, - "time": 1430641376, - "txn": { - "length": 220, - "type": 0, - "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", - "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", - "timestamp": 1430641376, - "sigs": [ - "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" - ], - "inputs": [ - "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" - ], - "outputs": [ - { - "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "722200.000000", - "hours": 1149084 - }, - { - "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 1149084 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 34, - "block_seq": 147, - "unknown": false - }, - "time": 1430641536, - "txn": { - "length": 220, - "type": 0, - "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", - "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", - "timestamp": 1430641536, - "sigs": [ - "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" - ], - "inputs": [ - "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" - ], - "outputs": [ - { - "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "721200.000000", - "hours": 143635 - }, - { - "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "1000.000000", - "hours": 143635 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 33, - "block_seq": 148, - "unknown": false - }, - "time": 1430642006, - "txn": { - "length": 220, - "type": 0, - "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", - "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", - "timestamp": 1430642006, - "sigs": [ - "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" - ], - "inputs": [ - "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" - ], - "outputs": [ - { - "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "720200.000000", - "hours": 17954 - }, - { - "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "1000.000000", - "hours": 17954 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 32, - "block_seq": 149, - "unknown": false - }, - "time": 1430642106, - "txn": { - "length": 220, - "type": 0, - "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", - "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", - "timestamp": 1430642106, - "sigs": [ - "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" - ], - "inputs": [ - "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" - ], - "outputs": [ - { - "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719200.000000", - "hours": 2244 - }, - { - "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", - "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", - "coins": "1000.000000", - "hours": 2244 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 31, - "block_seq": 150, - "unknown": false - }, - "time": 1430642306, - "txn": { - "length": 220, - "type": 0, - "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", - "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", - "timestamp": 1430642306, - "sigs": [ - "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" - ], - "inputs": [ - "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" - ], - "outputs": [ - { - "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "719100.000000", - "hours": 280 - }, - { - "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", - "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", - "coins": "100.000000", - "hours": 280 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 30, - "block_seq": 151, - "unknown": false - }, - "time": 1430642426, - "txn": { - "length": 220, - "type": 0, - "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", - "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", - "timestamp": 1430642426, - "sigs": [ - "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" - ], - "inputs": [ - "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" - ], - "outputs": [ - { - "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "718100.000000", - "hours": 35 - }, - { - "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", - "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", - "coins": "1000.000000", - "hours": 35 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 29, - "block_seq": 152, - "unknown": false - }, - "time": 1430642546, - "txn": { - "length": 220, - "type": 0, - "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", - "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", - "timestamp": 1430642546, - "sigs": [ - "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" - ], - "inputs": [ - "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" - ], - "outputs": [ - { - "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "717100.000000", - "hours": 4 - }, - { - "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", - "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", - "coins": "1000.000000", - "hours": 4 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 28, - "block_seq": 153, - "unknown": false - }, - "time": 1430642816, - "txn": { - "length": 220, - "type": 0, - "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", - "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", - "timestamp": 1430642816, - "sigs": [ - "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" - ], - "inputs": [ - "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" - ], - "outputs": [ - { - "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "716100.000000", - "hours": 0 - }, - { - "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 27, - "block_seq": 154, - "unknown": false - }, - "time": 1430643706, - "txn": { - "length": 220, - "type": 0, - "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", - "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", - "timestamp": 1430643706, - "sigs": [ - "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" - ], - "inputs": [ - "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" - ], - "outputs": [ - { - "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "715100.000000", - "hours": 0 - }, - { - "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", - "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 26, - "block_seq": 155, - "unknown": false - }, - "time": 1430643906, - "txn": { - "length": 220, - "type": 0, - "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", - "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", - "timestamp": 1430643906, - "sigs": [ - "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" - ], - "inputs": [ - "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" - ], - "outputs": [ - { - "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "714800.000000", - "hours": 0 - }, - { - "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", - "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", - "coins": "300.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 25, - "block_seq": 156, - "unknown": false - }, - "time": 1430644036, - "txn": { - "length": 220, - "type": 0, - "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", - "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", - "timestamp": 1430644036, - "sigs": [ - "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" - ], - "inputs": [ - "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" - ], - "outputs": [ - { - "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "713800.000000", - "hours": 0 - }, - { - "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", - "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 24, - "block_seq": 157, - "unknown": false - }, - "time": 1430673946, - "txn": { - "length": 220, - "type": 0, - "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", - "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", - "timestamp": 1430673946, - "sigs": [ - "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" - ], - "inputs": [ - "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" - ], - "outputs": [ - { - "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "695800.000000", - "hours": 0 - }, - { - "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", - "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", - "coins": "18000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 23, - "block_seq": 158, - "unknown": false - }, - "time": 1430674696, - "txn": { - "length": 220, - "type": 0, - "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", - "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", - "timestamp": 1430674696, - "sigs": [ - "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" - ], - "inputs": [ - "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" - ], - "outputs": [ - { - "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "670800.000000", - "hours": 0 - }, - { - "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", - "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", - "coins": "25000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 22, - "block_seq": 159, - "unknown": false - }, - "time": 1430715196, - "txn": { - "length": 220, - "type": 0, - "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", - "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", - "timestamp": 1430715196, - "sigs": [ - "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" - ], - "inputs": [ - "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" - ], - "outputs": [ - { - "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "664464.000000", - "hours": 0 - }, - { - "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "6336.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 21, - "block_seq": 160, - "unknown": false - }, - "time": 1430784172, - "txn": { - "length": 220, - "type": 0, - "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", - "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", - "timestamp": 1430784172, - "sigs": [ - "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" - ], - "inputs": [ - "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" - ], - "outputs": [ - { - "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "663464.000000", - "hours": 0 - }, - { - "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", - "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 20, - "block_seq": 161, - "unknown": false - }, - "time": 1430784312, - "txn": { - "length": 220, - "type": 0, - "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", - "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", - "timestamp": 1430784312, - "sigs": [ - "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" - ], - "inputs": [ - "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" - ], - "outputs": [ - { - "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662464.000000", - "hours": 0 - }, - { - "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", - "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 19, - "block_seq": 162, - "unknown": false - }, - "time": 1430784372, - "txn": { - "length": 220, - "type": 0, - "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", - "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", - "timestamp": 1430784372, - "sigs": [ - "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" - ], - "inputs": [ - "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" - ], - "outputs": [ - { - "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "662314.000000", - "hours": 0 - }, - { - "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "150.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 18, - "block_seq": 163, - "unknown": false - }, - "time": 1430784932, - "txn": { - "length": 220, - "type": 0, - "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", - "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", - "timestamp": 1430784932, - "sigs": [ - "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" - ], - "inputs": [ - "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" - ], - "outputs": [ - { - "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "661314.000000", - "hours": 0 - }, - { - "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", - "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 17, - "block_seq": 164, - "unknown": false - }, - "time": 1430790052, - "txn": { - "length": 220, - "type": 0, - "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", - "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", - "timestamp": 1430790052, - "sigs": [ - "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" - ], - "inputs": [ - "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" - ], - "outputs": [ - { - "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "660314.000000", - "hours": 0 - }, - { - "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", - "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 16, - "block_seq": 165, - "unknown": false - }, - "time": 1430790152, - "txn": { - "length": 220, - "type": 0, - "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", - "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", - "timestamp": 1430790152, - "sigs": [ - "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" - ], - "inputs": [ - "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" - ], - "outputs": [ - { - "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659314.000000", - "hours": 0 - }, - { - "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 0 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 15, - "block_seq": 166, - "unknown": false - }, - "time": 1430791622, - "txn": { - "length": 317, - "type": 0, - "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", - "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", - "timestamp": 1430791622, - "sigs": [ - "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", - "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" - ], - "inputs": [ - "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", - "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" - ], - "outputs": [ - { - "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "29100.000000", - "hours": 494004 - }, - { - "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", - "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", - "coins": "500.000000", - "hours": 494004 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 14, - "block_seq": 167, - "unknown": false - }, - "time": 1430791902, - "txn": { - "length": 220, - "type": 0, - "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", - "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", - "timestamp": 1430791902, - "sigs": [ - "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" - ], - "inputs": [ - "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" - ], - "outputs": [ - { - "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "659214.000000", - "hours": 33652 - }, - { - "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", - "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", - "coins": "100.000000", - "hours": 33652 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 13, - "block_seq": 168, - "unknown": false - }, - "time": 1430792072, - "txn": { - "length": 220, - "type": 0, - "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", - "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", - "timestamp": 1430792072, - "sigs": [ - "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" - ], - "inputs": [ - "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" - ], - "outputs": [ - { - "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "658214.000000", - "hours": 4206 - }, - { - "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", - "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", - "coins": "1000.000000", - "hours": 4206 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 12, - "block_seq": 169, - "unknown": false - }, - "time": 1430836392, - "txn": { - "length": 220, - "type": 0, - "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", - "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", - "timestamp": 1430836392, - "sigs": [ - "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" - ], - "inputs": [ - "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" - ], - "outputs": [ - { - "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", - "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", - "coins": "990.000000", - "hours": 70 - }, - { - "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", - "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", - "coins": "10.000000", - "hours": 70 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 11, - "block_seq": 170, - "unknown": false - }, - "time": 1430836422, - "txn": { - "length": 183, - "type": 0, - "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", - "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", - "timestamp": 1430836422, - "sigs": [ - "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" - ], - "inputs": [ - "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" - ], - "outputs": [ - { - "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", - "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", - "coins": "10.000000", - "hours": 8 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 10, - "block_seq": 171, - "unknown": false - }, - "time": 1430870562, - "txn": { - "length": 220, - "type": 0, - "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", - "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", - "timestamp": 1430870562, - "sigs": [ - "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" - ], - "inputs": [ - "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" - ], - "outputs": [ - { - "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "647750.000000", - "hours": 1014129 - }, - { - "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "10464.000000", - "hours": 1014129 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 9, - "block_seq": 172, - "unknown": false - }, - "time": 1430870592, - "txn": { - "length": 220, - "type": 0, - "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", - "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", - "timestamp": 1430870592, - "sigs": [ - "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" - ], - "inputs": [ - "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" - ], - "outputs": [ - { - "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "28100.000000", - "hours": 141512 - }, - { - "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "1000.000000", - "hours": 141512 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 8, - "block_seq": 173, - "unknown": false - }, - "time": 1430871512, - "txn": { - "length": 220, - "type": 0, - "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", - "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", - "timestamp": 1430871512, - "sigs": [ - "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" - ], - "inputs": [ - "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" - ], - "outputs": [ - { - "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "635750.000000", - "hours": 127440 - }, - { - "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", - "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", - "coins": "12000.000000", - "hours": 127440 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 7, - "block_seq": 174, - "unknown": false - }, - "time": 1430871622, - "txn": { - "length": 220, - "type": 0, - "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", - "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", - "timestamp": 1430871622, - "sigs": [ - "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" - ], - "inputs": [ - "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" - ], - "outputs": [ - { - "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "23100.000000", - "hours": 18586 - }, - { - "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", - "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", - "coins": "5000.000000", - "hours": 18586 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 6, - "block_seq": 175, - "unknown": false - }, - "time": 1430908702, - "txn": { - "length": 220, - "type": 0, - "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", - "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", - "timestamp": 1430908702, - "sigs": [ - "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" - ], - "inputs": [ - "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" - ], - "outputs": [ - { - "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "625750.000000", - "hours": 18358 - }, - { - "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", - "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", - "coins": "10000.000000", - "hours": 18358 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 5, - "block_seq": 176, - "unknown": false - }, - "time": 1431162639, - "txn": { - "length": 1481, - "type": 0, - "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", - "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", - "timestamp": 1431162639, - "sigs": [ - "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", - "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", - "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", - "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", - "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", - "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", - "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", - "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", - "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", - "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", - "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", - "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", - "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", - "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" - ], - "inputs": [ - "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", - "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", - "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", - "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", - "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", - "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", - "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", - "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", - "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", - "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", - "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", - "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", - "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", - "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" - ], - "outputs": [ - { - "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "24950.000000", - "hours": 451992 - }, - { - "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", - "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", - "coins": "5.000000", - "hours": 451992 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 4, - "block_seq": 177, - "unknown": false - }, - "time": 1431162689, - "txn": { - "length": 220, - "type": 0, - "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", - "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", - "timestamp": 1431162689, - "sigs": [ - "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" - ], - "inputs": [ - "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" - ], - "outputs": [ - { - "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "4950.000000", - "hours": 56499 - }, - { - "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", - "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", - "coins": "20000.000000", - "hours": 56499 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 3, - "block_seq": 178, - "unknown": false - }, - "time": 1431162729, - "txn": { - "length": 183, - "type": 0, - "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", - "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", - "timestamp": 1431162729, - "sigs": [ - "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" - ], - "inputs": [ - "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" - ], - "outputs": [ - { - "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", - "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", - "coins": "5.000000", - "hours": 56499 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 2, - "block_seq": 179, - "unknown": false - }, - "time": 1431339429, - "txn": { - "length": 220, - "type": 0, - "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", - "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", - "timestamp": 1431339429, - "sigs": [ - "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" - ], - "inputs": [ - "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" - ], - "outputs": [ - { - "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": "615700.000000", - "hours": 5521648 - }, - { - "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", - "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", - "coins": "10050.000000", - "hours": 5521648 - } - ] - } - }, - { - "status": { - "confirmed": true, - "unconfirmed": false, - "height": 1, - "block_seq": 180, - "unknown": false - }, - "time": 1431574528, - "txn": { - "length": 220, - "type": 0, - "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", - "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", - "timestamp": 1431574528, - "sigs": [ - "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" - ], - "inputs": [ - "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" - ], - "outputs": [ - { - "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", - "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", - "coins": "22100.000000", - "hours": 377543 - }, - { - "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", - "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", - "coins": "1000.000000", - "hours": 377543 - } - ] - } - } -] diff --git a/src/gui/integration/test-fixtures/genesis-transaction.golden b/src/gui/integration/test-fixtures/genesis-transaction.golden deleted file mode 100755 index b58e400..0000000 --- a/src/gui/integration/test-fixtures/genesis-transaction.golden +++ /dev/null @@ -1,17 +0,0 @@ -{ - "length": 0, - "type": 0, - "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", - "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "timestamp": 1426562704, - "sigs": [], - "inputs": [], - "outputs": [ - { - "uxid": "54c5dd9aebbe4656eb1adc658fdd4ff63a073aae473cc99b20c0ef5f0a21f08e", - "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", - "coins": "100000000.000000", - "hours": 100000000000000 - } - ] -} diff --git a/src/gui/integration/test-fixtures/uxout-spent.golden b/src/gui/integration/test-fixtures/uxout-spent.golden deleted file mode 100755 index adb5bef..0000000 --- a/src/gui/integration/test-fixtures/uxout-spent.golden +++ /dev/null @@ -1,11 +0,0 @@ -{ - "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", - "time": 1431339429, - "src_block_seq": 179, - "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", - "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "coins": 615700000000, - "hours": 5521648, - "spent_block_seq": 181, - "spent_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947" -} \ No newline at end of file diff --git a/src/gui/network.go b/src/gui/network.go deleted file mode 100755 index 5dfa0d6..0000000 --- a/src/gui/network.go +++ /dev/null @@ -1,85 +0,0 @@ -package gui - -// Network-related information for the GUI -import ( - "net/http" - "sort" - - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers -) - -func connectionHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - addr := r.FormValue("addr") - if addr == "" { - wh.Error400(w, "addr is required") - return - } - - c := gateway.GetConnection(addr) - if c == nil { - wh.Error404(w, "") - return - } - - wh.SendJSONOr500(logger, w, c) - } -} - -func connectionsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - wh.SendJSONOr500(logger, w, gateway.GetConnections()) - } -} - -func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - conns := gateway.GetDefaultConnections() - sort.Strings(conns) - - wh.SendJSONOr500(logger, w, conns) - } -} - -func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - conns := gateway.GetTrustConnections() - sort.Strings(conns) - - wh.SendJSONOr500(logger, w, conns) - } -} - -func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - conns := gateway.GetExchgConnection() - sort.Strings(conns) - - wh.SendJSONOr500(logger, w, conns) - } -} diff --git a/src/gui/network_test.go b/src/gui/network_test.go deleted file mode 100755 index f79c1cb..0000000 --- a/src/gui/network_test.go +++ /dev/null @@ -1,336 +0,0 @@ -package gui - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/daemon" -) - -func TestConnection(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - addr string - gatewayGetConnectionResult *daemon.Connection - result *daemon.Connection - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - empty addr", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - addr is required", - addr: "", - gatewayGetConnectionResult: nil, - result: nil, - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "", - addr: "addr", - gatewayGetConnectionResult: &daemon.Connection{ - ID: 1, - Addr: "127.0.0.1", - LastSent: 99999, - LastReceived: 1111111, - Outgoing: true, - Introduced: true, - Mirror: 9876, - ListenPort: 9877, - }, - result: &daemon.Connection{ - ID: 1, - Addr: "127.0.0.1", - LastSent: 99999, - LastReceived: 1111111, - Outgoing: true, - Introduced: true, - Mirror: 9876, - ListenPort: 9877, - }, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/network/connection" - gateway := NewGatewayerMock() - gateway.On("GetConnection", tc.addr).Return(tc.gatewayGetConnectionResult) - v := url.Values{} - if tc.addr != "" { - v.Add("addr", tc.addr) - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *daemon.Connection - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestConnections(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - gatewayGetConnectionsResult *daemon.Connections - result *daemon.Connections - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "", - gatewayGetConnectionsResult: &daemon.Connections{ - Connections: []*daemon.Connection{ - &daemon.Connection{ - ID: 1, - Addr: "127.0.0.1", - LastSent: 99999, - LastReceived: 1111111, - Outgoing: true, - Introduced: true, - Mirror: 9876, - ListenPort: 9877, - }, - }, - }, - result: &daemon.Connections{ - Connections: []*daemon.Connection{ - &daemon.Connection{ - ID: 1, - Addr: "127.0.0.1", - LastSent: 99999, - LastReceived: 1111111, - Outgoing: true, - Introduced: true, - Mirror: 9876, - ListenPort: 9877, - }, - }, - }, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/network/connections" - gateway := NewGatewayerMock() - gateway.On("GetConnections").Return(tc.gatewayGetConnectionsResult) - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *daemon.Connections - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestDefaultConnections(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - gatewayGetDefaultConnectionsResult []string - result []string - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "", - gatewayGetDefaultConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, - result: []string{"11.44.66.88", "44.33.22.11"}, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/network/defaultConnections" - gateway := NewGatewayerMock() - gateway.On("GetDefaultConnections").Return(tc.gatewayGetDefaultConnectionsResult) - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []string - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestGetTrustConnections(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - gatewayGetTrustConnectionsResult []string - result []string - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "", - gatewayGetTrustConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, - result: []string{"11.44.66.88", "44.33.22.11"}, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/network/connections/trust" - gateway := NewGatewayerMock() - gateway.On("GetTrustConnections").Return(tc.gatewayGetTrustConnectionsResult) - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []string - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} - -func TestGetExchgConnection(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - gatewayGetExchgConnectionResult []string - result []string - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "", - gatewayGetExchgConnectionResult: []string{"44.33.22.11", "11.44.66.88"}, - result: []string{"11.44.66.88", "44.33.22.11"}, - }, - } - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/network/connections/exchange" - gateway := NewGatewayerMock() - gateway.On("GetExchgConnection").Return(tc.gatewayGetExchgConnectionResult) - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []string - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, msg) - } - }) - } -} diff --git a/src/gui/notes.go b/src/gui/notes.go deleted file mode 100755 index c685711..0000000 --- a/src/gui/notes.go +++ /dev/null @@ -1,65 +0,0 @@ -package gui - -// NotesRPC note rpc -// type NotesRPC struct { -// Notes wallet.Notes -// WalletDirectory string -// } - -// // Ng global note -// var Ng *NotesRPC - -// // InitWalletRPC init wallet rpc -// func InitWalletRPC(walletDir string, options ...wallet.Option) { -// Ng = NewNotesRPC(walletDir) -// } - -// // NewNotesRPC new notes rpc -// func NewNotesRPC(walletDir string) *NotesRPC { -// rpc := &NotesRPC{} -// if err := os.MkdirAll(walletDir, os.FileMode(0700)); err != nil { -// logger.Panicf("Failed to create notes directory %s: %v", walletDir, err) -// } -// rpc.WalletDirectory = walletDir -// w, err := wallet.LoadNotes(rpc.WalletDirectory) -// if err != nil { -// logger.Panicf("Failed to load all notes: %v", err) -// } -// wallet.CreateNoteFileIfNotExist(walletDir) -// rpc.Notes = w -// return rpc -// } - -// GetNotesReadable returns readable notes -// func (nt *NotesRPC) GetNotesReadable() wallet.ReadableNotes { -// return nt.Notes.ToReadable() -// } - -// // Create a wallet Name is set by creation date -// func notesCreate(gateway *daemon.Gateway) http.HandlerFunc { -// return func(w http.ResponseWriter, r *http.Request) { -// logger.Info("API request made to create a note") -// note := r.FormValue("note") -// transactionID := r.FormValue("transaction_id") -// newNote := wallet.Note{ -// TxID: transactionID, -// Value: note, -// } -// Ng.Notes.SaveNote(Ng.WalletDirectory, newNote) -// rlt := Ng.GetNotesReadable() -// wh.SendOr500(w, rlt) -// } -// } - -// // Returns a wallet by ID if GET. Creates or updates a wallet if POST. -// func notesHandler(gateway *daemon.Gateway) http.HandlerFunc { -// return func(w http.ResponseWriter, r *http.Request) { -// //ret := wallet.Wallets.ToPublicReadable() -// ret := Ng.GetNotesReadable() -// wh.SendOr404(w, ret) -// } -// } - -// mux.Handle("/notes", notesHandler(gateway)) - -// mux.Handle("/notes/create", notesCreate(gateway)) diff --git a/src/gui/spend.go b/src/gui/spend.go deleted file mode 100755 index 68625bc..0000000 --- a/src/gui/spend.go +++ /dev/null @@ -1,484 +0,0 @@ -package gui - -import ( - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "net/http" - "strconv" - - "github.com/shopspring/decimal" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/util/droplet" - "github.com/skycoin/skycoin/src/util/fee" - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" -) - -// CreateTransactionResponse is returned by /wallet/transaction -type CreateTransactionResponse struct { - Transaction CreatedTransaction `json:"transaction"` - EncodedTransaction string `json:"encoded_transaction"` -} - -// NewCreateTransactionResponse creates a CreateTransactionResponse -func NewCreateTransactionResponse(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreateTransactionResponse, error) { - cTxn, err := NewCreatedTransaction(txn, inputs) - if err != nil { - return nil, err - } - - return &CreateTransactionResponse{ - Transaction: *cTxn, - EncodedTransaction: hex.EncodeToString(txn.Serialize()), - }, nil -} - -// CreatedTransaction represents a transaction created by /wallet/transaction -type CreatedTransaction struct { - Length uint32 `json:"length"` - Type uint8 `json:"type"` - TxID string `json:"txid"` - InnerHash string `json:"inner_hash"` - Fee string `json:"fee"` - - Sigs []string `json:"sigs"` - In []CreatedTransactionInput `json:"inputs"` - Out []CreatedTransactionOutput `json:"outputs"` -} - -// NewCreatedTransaction returns a CreatedTransaction -func NewCreatedTransaction(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreatedTransaction, error) { - if len(txn.In) != len(inputs) { - return nil, errors.New("len(txn.In) != len(inputs)") - } - - var outputHours uint64 - for _, o := range txn.Out { - outputHours += o.Hours - } - - var inputHours uint64 - for _, i := range inputs { - inputHours += i.Hours - } - - if inputHours < outputHours { - return nil, errors.New("inputHours unexpectedly less than output hours") - } - - fee := inputHours - outputHours - - sigs := make([]string, len(txn.Sigs)) - for i, s := range txn.Sigs { - sigs[i] = s.Hex() - } - - txid := txn.Hash() - out := make([]CreatedTransactionOutput, len(txn.Out)) - for i, o := range txn.Out { - co, err := NewCreatedTransactionOutput(o, txid) - if err != nil { - return nil, err - } - out[i] = *co - } - - in := make([]CreatedTransactionInput, len(inputs)) - for i, o := range inputs { - ci, err := NewCreatedTransactionInput(o) - if err != nil { - return nil, err - } - in[i] = *ci - } - - return &CreatedTransaction{ - Length: txn.Length, - Type: txn.Type, - TxID: txid.Hex(), - InnerHash: txn.InnerHash.Hex(), - Fee: fmt.Sprint(fee), - - Sigs: sigs, - In: in, - Out: out, - }, nil -} - -// ToTransaction converts a CreatedTransaction back to a coin.Transaction -func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { - t := coin.Transaction{} - - t.Length = r.Length - t.Type = r.Type - - var err error - t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) - if err != nil { - return nil, err - } - - sigs := make([]cipher.Sig, len(r.Sigs)) - for i, s := range r.Sigs { - sigs[i], err = cipher.SigFromHex(s) - if err != nil { - return nil, err - } - } - - t.Sigs = sigs - - in := make([]cipher.SHA256, len(r.In)) - for i, n := range r.In { - in[i], err = cipher.SHA256FromHex(n.UxID) - if err != nil { - return nil, err - } - } - - t.In = in - - out := make([]coin.TransactionOutput, len(r.Out)) - for i, o := range r.Out { - addr, err := cipher.DecodeBase58Address(o.Address) - if err != nil { - return nil, err - } - - coins, err := droplet.FromString(o.Coins) - if err != nil { - return nil, err - } - - hours, err := strconv.ParseUint(o.Hours, 10, 64) - if err != nil { - return nil, err - } - - out[i] = coin.TransactionOutput{ - Address: addr, - Coins: coins, - Hours: hours, - } - } - - t.Out = out - - hash, err := cipher.SHA256FromHex(r.TxID) - if err != nil { - return nil, err - } - if t.Hash() != hash { - return nil, errors.New("ReadableTransaction.Hash does not match parsed transaction hash") - } - - return &t, nil -} - -// CreatedTransactionOutput is a transaction output -type CreatedTransactionOutput struct { - UxID string `json:"uxid"` - Address string `json:"address"` - Coins string `json:"coins"` - Hours string `json:"hours"` -} - -// NewCreatedTransactionOutput creates CreatedTransactionOutput -func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { - coins, err := droplet.ToString(out.Coins) - if err != nil { - return nil, err - } - - return &CreatedTransactionOutput{ - UxID: out.UxID(txid).Hex(), - Address: out.Address.String(), - Coins: coins, - Hours: fmt.Sprint(out.Hours), - }, nil -} - -// CreatedTransactionInput is a verbose transaction input -type CreatedTransactionInput struct { - UxID string `json:"uxid"` - Address string `json:"address"` - Coins string `json:"coins"` - Hours string `json:"hours"` - CalculatedHours string `json:"calculated_hours"` - Time uint64 `json:"timestamp"` - Block uint64 `json:"block"` - TxID string `json:"txid"` -} - -// NewCreatedTransactionInput creates CreatedTransactionInput -func NewCreatedTransactionInput(out wallet.UxBalance) (*CreatedTransactionInput, error) { - coins, err := droplet.ToString(out.Coins) - if err != nil { - return nil, err - } - - if out.SrcTransaction.Null() { - return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") - } - - return &CreatedTransactionInput{ - UxID: out.Hash.Hex(), - Address: out.Address.String(), - Coins: coins, - Hours: fmt.Sprint(out.InitialHours), - CalculatedHours: fmt.Sprint(out.Hours), - Time: out.Time, - Block: out.BkSeq, - TxID: out.SrcTransaction.Hex(), - }, nil -} - -// createTransactionRequest is sent to /wallet/transaction -type createTransactionRequest struct { - HoursSelection hoursSelection `json:"hours_selection"` - Wallet createTransactionRequestWallet `json:"wallet"` - ChangeAddress *wh.Address `json:"change_address"` - To []receiver `json:"to"` -} - -// createTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet -type createTransactionRequestWallet struct { - ID string `json:"id"` - Addresses []wh.Address `json:"addresses,omitempty"` - Password string `json:"password"` -} - -// hoursSelection defines options for hours distribution -type hoursSelection struct { - Type string `json:"type"` - Mode string `json:"mode"` - ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` -} - -// receiver specifies a spend destination -type receiver struct { - Address wh.Address `json:"address"` - Coins wh.Coins `json:"coins"` - Hours *wh.Hours `json:"hours,omitempty"` -} - -// Validate validates createTransactionRequest data -func (r createTransactionRequest) Validate() error { - switch r.HoursSelection.Type { - case wallet.HoursSelectionTypeAuto: - for i, to := range r.To { - if to.Hours != nil { - return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) - } - } - - switch r.HoursSelection.Mode { - case wallet.HoursSelectionModeShare: - case "": - return errors.New("missing hours_selection.mode") - default: - return errors.New("invalid hours_selection.mode") - } - - case wallet.HoursSelectionTypeManual: - for i, to := range r.To { - if to.Hours == nil { - return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) - } - } - - if r.HoursSelection.Mode != "" { - return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") - } - - case "": - return errors.New("missing hours_selection.type") - default: - return errors.New("invalid hours_selection.type") - } - - if r.HoursSelection.ShareFactor == nil { - if r.HoursSelection.Mode == wallet.HoursSelectionModeShare { - return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") - } - } else { - if r.HoursSelection.Mode != wallet.HoursSelectionModeShare { - return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") - } - - switch { - case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): - return errors.New("hours_selection.share_factor cannot be negative") - case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): - return errors.New("hours_selection.share_factor cannot be more than 1") - } - } - - if r.ChangeAddress == nil { - return errors.New("missing change_address") - } else if r.ChangeAddress.Null() { - return errors.New("change_address is an empty address") - } - - if r.Wallet.ID == "" { - return errors.New("missing wallet.id") - } - - for i, a := range r.Wallet.Addresses { - if a.Null() { - return fmt.Errorf("wallet.addresses[%d] is empty", i) - } - } - - if len(r.To) == 0 { - return errors.New("to is empty") - } - - for i, to := range r.To { - if to.Address.Null() { - return fmt.Errorf("to[%d].address is empty", i) - } - - if to.Coins == 0 { - return fmt.Errorf("to[%d].coins must not be zero", i) - } - - if to.Coins.Value()%visor.MaxDropletDivisor() != 0 { - return fmt.Errorf("to[%d].coins has too many decimal places", i) - } - } - - // Check for duplicate outputs, a transaction can't have outputs with - // the same (address, coins, hours) - // Auto mode would distribute hours to the outputs and could hypothetically - // avoid assigning duplicate hours in many cases, but the complexity for doing - // so is very high, so also reject duplicate (address, coins) for auto mode. - outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) - for _, to := range r.To { - var hours uint64 - if to.Hours != nil { - hours = to.Hours.Value() - } - - outputs[coin.TransactionOutput{ - Address: to.Address.Address, - Coins: to.Coins.Value(), - Hours: hours, - }] = struct{}{} - } - - if len(outputs) != len(r.To) { - return errors.New("to contains duplicate values") - } - - return nil -} - -// ToWalletParams converts createTransactionRequest to wallet.CreateTransactionParams -func (r createTransactionRequest) ToWalletParams() wallet.CreateTransactionParams { - addresses := make([]cipher.Address, len(r.Wallet.Addresses)) - for i, a := range r.Wallet.Addresses { - addresses[i] = a.Address - } - - walletParams := wallet.CreateTransactionWalletParams{ - ID: r.Wallet.ID, - Addresses: addresses, - Password: []byte(r.Wallet.Password), - } - - to := make([]coin.TransactionOutput, len(r.To)) - for i, t := range r.To { - var hours uint64 - if t.Hours != nil { - hours = t.Hours.Value() - } - - to[i] = coin.TransactionOutput{ - Address: t.Address.Address, - Coins: t.Coins.Value(), - Hours: hours, - } - } - - var changeAddress cipher.Address - if r.ChangeAddress != nil { - changeAddress = r.ChangeAddress.Address - } - - return wallet.CreateTransactionParams{ - HoursSelection: wallet.HoursSelection{ - Type: r.HoursSelection.Type, - Mode: r.HoursSelection.Mode, - ShareFactor: r.HoursSelection.ShareFactor, - }, - Wallet: walletParams, - ChangeAddress: changeAddress, - To: to, - } -} - -func createTransactionHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - if r.Header.Get("Content-Type") != "application/json" { - wh.Error415(w) - return - } - - var params createTransactionRequest - err := json.NewDecoder(r.Body).Decode(¶ms) - if err != nil { - logger.WithError(err).Error("Invalid create transaction request") - wh.Error400(w, err.Error()) - return - } - - if err := params.Validate(); err != nil { - logger.WithError(err).Error("Invalid create transaction request") - wh.Error400(w, err.Error()) - return - } - - txn, inputs, err := gateway.CreateTransaction(params.ToWalletParams()) - if err != nil { - switch err.(type) { - case wallet.Error: - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - case wallet.ErrWalletNotExist: - wh.Error404(w, err.Error()) - default: - wh.Error400(w, err.Error()) - } - default: - switch err { - case fee.ErrTxnNoFee, fee.ErrTxnInsufficientCoinHours: - wh.Error400(w, err.Error()) - default: - wh.Error500(w, err.Error()) - } - } - return - } - - txnResp, err := NewCreateTransactionResponse(txn, inputs) - if err != nil { - err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, txnResp) - } -} diff --git a/src/gui/spend_test.go b/src/gui/spend_test.go deleted file mode 100755 index 502560a..0000000 --- a/src/gui/spend_test.go +++ /dev/null @@ -1,826 +0,0 @@ -package gui - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/testutil" //http,json helpers - "github.com/skycoin/skycoin/src/util/fee" - "github.com/skycoin/skycoin/src/wallet" -) - -func TestCreateTransaction(t *testing.T) { - type rawRequestWallet struct { - ID string `json:"id"` - Addresses []string `json:"addresses,omitempty"` - Password string `json:"password"` - } - - type rawHoursSelection struct { - Type string `json:"type"` - Mode string `json:"mode"` - ShareFactor *string `json:"share_factor,omitempty"` - } - - type rawReceiver struct { - Address string `json:"address"` - Coins string `json:"coins"` - Hours string `json:"hours,omitempty"` - } - - type rawRequest struct { - HoursSelection rawHoursSelection `json:"hours_selection"` - Wallet rawRequestWallet `json:"wallet"` - ChangeAddress string `json:"change_address,omitempty"` - To []rawReceiver `json:"to"` - Password string `json:"password"` - } - - changeAddress := testutil.MakeAddress() - destinationAddress := testutil.MakeAddress() - emptyAddress := cipher.Address{} - - txn := &coin.Transaction{ - Length: 100, - Type: 0, - InnerHash: testutil.RandSHA256(t), - In: []cipher.SHA256{testutil.RandSHA256(t)}, - Out: []coin.TransactionOutput{ - { - Address: destinationAddress, - Coins: 1e6, - Hours: 100, - }, - }, - } - - inputs := []wallet.UxBalance{ - { - Hash: testutil.RandSHA256(t), - Time: uint64(time.Now().UTC().Unix()), - BkSeq: 9999, - SrcTransaction: testutil.RandSHA256(t), - Address: testutil.MakeAddress(), - Coins: 1e6, - Hours: 200, - InitialHours: 100, - }, - } - - createdTxn, err := NewCreatedTransaction(txn, inputs) - require.NoError(t, err) - - createTxnResponse := &CreateTransactionResponse{ - Transaction: *createdTxn, - EncodedTransaction: hex.EncodeToString(txn.Serialize()), - } - - validBody := &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "100", - Hours: "10", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - } - - tt := []struct { - name string - method string - body *rawRequest - status int - err string - gatewayCreateTransactionResult *coin.Transaction - gatewayCreateTransactionInputs []wallet.UxBalance - gatewayCreateTransactionErr error - createTransactionResponse *CreateTransactionResponse - csrfDisabled bool - contentType string - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - - { - name: "415", - method: http.MethodPost, - status: http.StatusUnsupportedMediaType, - contentType: "application/x-www-form-urlencoded", - err: "415 Unsupported Media Type", - }, - - { - name: "400 - missing hours selection type", - method: http.MethodPost, - body: &rawRequest{}, - status: http.StatusBadRequest, - err: "400 Bad Request - missing hours_selection.type", - }, - - { - name: "400 - invalid hours selection type", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: "foo", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid hours_selection.type", - }, - - { - name: "400 - missing hours selection mode", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing hours_selection.mode", - }, - - { - name: "400 - invalid hours selection mode", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: "foo", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid hours_selection.mode", - }, - - { - name: "400 - missing hours selection share factor", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing hours_selection.share_factor when hours_selection.mode is share", - }, - - { - name: "400 - share factor set but mode is not share", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - ShareFactor: newStrPtr("0.5"), - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - hours_selection.share_factor can only be used when hours_selection.mode is share", - }, - - { - name: "400 - negative share factor", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("-1"), - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - hours_selection.share_factor cannot be negative", - }, - - { - name: "400 - share factor greater than 1", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("1.1"), - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - hours_selection.share_factor cannot be more than 1", - }, - - { - name: "400 - empty sender address", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: rawRequestWallet{ - Addresses: []string{""}, - }, - ChangeAddress: changeAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid address: Invalid base58 string", - }, - - { - name: "400 - invalid sender address", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - Wallet: rawRequestWallet{ - Addresses: []string{"xxx"}, - }, - ChangeAddress: changeAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid address: Invalid address length", - }, - - { - name: "400 - missing change address", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing change_address", - }, - - { - name: "400 - invalid change address", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - ChangeAddress: "xxx", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid address: Invalid address length", - }, - - { - name: "400 - empty change address", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - ChangeAddress: emptyAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - change_address is an empty address", - }, - - { - name: "400 - auto type destination has hours", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("0.5"), - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Hours: "100", - Coins: "1.01", - }, - }, - ChangeAddress: changeAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to[0].hours must not be specified for auto hours_selection.mode", - }, - - { - name: "400 - manual type destination missing hours", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.01", - }, - }, - ChangeAddress: changeAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to[0].hours must be specified for manual hours_selection.mode", - }, - - { - name: "400 - manual type has mode set", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - Mode: wallet.HoursSelectionModeShare, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.01", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - }, - status: http.StatusBadRequest, - err: "400 Bad Request - hours_selection.mode cannot be used for manual hours_selection.type", - }, - - { - name: "400 - missing wallet ID", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.01", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{}, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet.id", - }, - - { - name: "400 - wallet address is empty", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.01", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - Addresses: []string{emptyAddress.String()}, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - wallet.addresses[0] is empty", - }, - - { - name: "400 - to address is empty", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: emptyAddress.String(), - Coins: "1.01", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to[0].address is empty", - }, - - { - name: "400 - to coins is zero", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "0", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to[0].coins must not be zero", - }, - - { - name: "400 - invalid to coins", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "0.1a", - Hours: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - can't convert 0.1a to decimal", - }, - - { - name: "400 - invalid to hours", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "0.1", - Hours: "100.1", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax", - }, - - { - name: "400 - empty string to coins", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("0.5"), - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "", - Hours: "", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - can't convert to decimal", - }, - - { - name: "400 - coins has too many decimals", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("0.5"), - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.1234", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to[0].coins has too many decimal places", - }, - - { - name: "400 - empty to", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to is empty", - }, - - { - name: "400 - manual duplicate outputs", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.2", - Hours: "100", - }, - { - Address: destinationAddress.String(), - Coins: "1.2", - Hours: "100", - }, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to contains duplicate values", - }, - - { - name: "400 - auto duplicate outputs", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("0.5"), - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "1.2", - }, - { - Address: destinationAddress.String(), - Coins: "1.2", - }, - }, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - to contains duplicate values", - }, - - { - name: "200 - auto type split even", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeAuto, - Mode: wallet.HoursSelectionModeShare, - ShareFactor: newStrPtr("0.5"), - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "100", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusOK, - gatewayCreateTransactionResult: txn, - gatewayCreateTransactionInputs: inputs, - createTransactionResponse: createTxnResponse, - }, - - { - name: "200 - manual type zero hours", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "100", - Hours: "0", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusOK, - gatewayCreateTransactionResult: txn, - gatewayCreateTransactionInputs: inputs, - createTransactionResponse: createTxnResponse, - }, - - { - name: "200 - manual type nonzero hours", - method: http.MethodPost, - body: &rawRequest{ - HoursSelection: rawHoursSelection{ - Type: wallet.HoursSelectionTypeManual, - }, - To: []rawReceiver{ - { - Address: destinationAddress.String(), - Coins: "100", - Hours: "10", - }, - }, - ChangeAddress: changeAddress.String(), - Wallet: rawRequestWallet{ - ID: "foo.wlt", - }, - }, - status: http.StatusOK, - gatewayCreateTransactionResult: txn, - gatewayCreateTransactionInputs: inputs, - createTransactionResponse: createTxnResponse, - }, - - { - name: "200 - manual type nonzero hours - csrf disabled", - method: http.MethodPost, - body: validBody, - status: http.StatusOK, - gatewayCreateTransactionResult: txn, - gatewayCreateTransactionInputs: inputs, - createTransactionResponse: createTxnResponse, - csrfDisabled: true, - }, - - { - name: "500 - misc error", - method: http.MethodPost, - body: validBody, - status: http.StatusInternalServerError, - gatewayCreateTransactionErr: errors.New("unhandled error"), - err: "500 Internal Server Error - unhandled error", - }, - - { - name: "400 - no fee", - method: http.MethodPost, - body: validBody, - status: http.StatusBadRequest, - gatewayCreateTransactionErr: fee.ErrTxnNoFee, - err: "400 Bad Request - Transaction has zero coinhour fee", - }, - - { - name: "400 - insufficient coin hours", - method: http.MethodPost, - body: validBody, - status: http.StatusBadRequest, - gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, - err: "400 Bad Request - Insufficient coinhours for transaction outputs", - }, - - { - name: "400 - other wallet error", - method: http.MethodPost, - body: validBody, - status: http.StatusBadRequest, - gatewayCreateTransactionErr: wallet.ErrWalletEncrypted, - err: "400 Bad Request - wallet is encrypted", - }, - - { - name: "404 - wallet not found", - method: http.MethodPost, - body: validBody, - status: http.StatusNotFound, - gatewayCreateTransactionErr: wallet.ErrWalletNotExist, - err: "404 Not Found - wallet doesn't exist", - }, - - { - name: "403 - wallet API disabled", - method: http.MethodPost, - body: validBody, - status: http.StatusForbidden, - gatewayCreateTransactionErr: wallet.ErrWalletAPIDisabled, - err: "403 Forbidden", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - - // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.CreateTransaction - serializedBody, err := json.Marshal(tc.body) - require.NoError(t, err) - var body createTransactionRequest - err = json.Unmarshal(serializedBody, &body) - if err == nil { - gateway.On("CreateTransaction", body.ToWalletParams()).Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) - } - - endpoint := "/wallet/transaction" - - requestJSON, err := json.Marshal(tc.body) - require.NoError(t, err) - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(requestJSON)) - require.NoError(t, err) - - contentType := tc.contentType - if contentType == "" { - contentType = "application/json" - } - - req.Header.Add("Content-Type", contentType) - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) - } else { - var msg CreateTransactionResponse - err := json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.NotNil(t, tc.createTransactionResponse) - require.Equal(t, *tc.createTransactionResponse, msg) - } - }) - } -} - -func newStrPtr(s string) *string { - return &s -} diff --git a/src/gui/static/dist/0.c5a8ce8f55ecb5290b5c.chunk.js b/src/gui/static/dist/0.c5a8ce8f55ecb5290b5c.chunk.js new file mode 100755 index 0000000..32f8645 --- /dev/null +++ b/src/gui/static/dist/0.c5a8ce8f55ecb5290b5c.chunk.js @@ -0,0 +1 @@ +webpackJsonp([0],{TKku:function(e,t){e.exports={common:{"coin-id":"SLB","coin-hours":"Coin Hours",loading:"Loading...",new:"New",load:"Load"},errors:{"fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs"},title:{wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy SLB",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"SolarBankersCoin Explorer",seed:"Wallet Seed",qrcode:"QR Code"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your SLB after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single SLB address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the SLB to a new address in the wallet selected above at the current rate of {{ rate }} SLB/BTC.","fraction-warning":"Only send multiple of the SLB/BTC rate! SLB is sent in whole number; fractional SLB is not sent!",receive:"Receive SLB","receive-desc":"After receiving your Bitcoin, we'll send you your SLB. It may take anywhere between 20 minutes and an hour to receive your SLB.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a SLB wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your SLB wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled",wallet:"Wallet",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},address:{copy:"Copy","copy-address":"Copy address",copied:"Copied!",outputs:"Unspent Outputs"}},send:{"from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","addresses-help":"Wallet addresses to send from","change-address-label":"Custom change address","change-address-help":"Address to receive change. If it's not provided, it will be chosen automatically","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-sent":"sent","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SLB supply","total-supply":"Total SLB supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send SLB",unknown:"Unknown"}}}}); \ No newline at end of file diff --git a/src/gui/static/dist/3rdpartylicenses.txt b/src/gui/static/dist/3rdpartylicenses.txt index c846b85..16079bd 100755 --- a/src/gui/static/dist/3rdpartylicenses.txt +++ b/src/gui/static/dist/3rdpartylicenses.txt @@ -1,4 +1,4 @@ -moment@2.22.1 +moment@2.21.0 MIT Copyright (c) JS Foundation and other contributors @@ -23,6 +23,29 @@ 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. +webpack@3.11.0 +MIT +Copyright JS Foundation and other contributors + +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. + cache-loader@1.2.2 MIT Copyright JS Foundation and other contributors @@ -70,50 +93,55 @@ 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. -webpack@3.11.0 +@angular/core@5.2.0 +MIT MIT -Copyright JS Foundation and other contributors -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: +@ngx-translate/core@9.1.1 +MIT +MIT -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +hammerjs@2.0.8 +MIT +The MIT License (MIT) -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. +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) -@angular/core@5.2.10 -MIT -MIT +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. -@angular/common@5.2.10 +@angular/common@5.2.0 MIT MIT -@angular/platform-browser@5.2.10 +@angular/platform-browser@5.2.0 MIT MIT -@angular/http@5.2.10 +@angular/http@5.2.0 MIT MIT -@angular/cdk@5.2.5 +@angular/cdk@5.0.4 MIT The MIT License -Copyright (c) 2018 Google LLC. +Copyright (c) 2017 Google LLC. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -133,11 +161,11 @@ 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. -@angular/material@5.2.5 +@angular/material@5.0.4 MIT The MIT License -Copyright (c) 2018 Google LLC. +Copyright (c) 2017 Google LLC. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -157,25 +185,25 @@ 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. -@angular/animations@5.2.10 +@angular/animations@5.2.0 MIT MIT -@angular/forms@5.2.10 +@angular/forms@5.2.0 MIT MIT -@angular/router@5.2.10 +@angular/router@5.2.0 MIT MIT -@angular/platform-browser-dynamic@5.2.10 +@angular/platform-browser-dynamic@5.2.0 MIT MIT -core-js@2.5.6 +core-js@2.5.3 MIT -Copyright (c) 2014-2018 Denis Pushkarev +Copyright (c) 2014-2017 Denis Pushkarev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -195,11 +223,11 @@ 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. -zone.js@0.8.26 +zone.js@0.8.20 MIT The MIT License -Copyright (c) 2016-2018 Google, Inc. +Copyright (c) 2016 Google, 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 @@ -219,12 +247,12 @@ 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. -bootstrap@4.1.1 +bootstrap@4.0.0-beta.3 MIT The MIT License (MIT) -Copyright (c) 2011-2018 Twitter, Inc. -Copyright (c) 2011-2018 The Bootstrap Authors +Copyright (c) 2011-2017 Twitter, Inc. +Copyright (c) 2011-2017 The Bootstrap Authors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/src/gui/static/dist/assets/header.png b/src/gui/static/dist/assets/header.png index be1002a..56243b8 100755 Binary files a/src/gui/static/dist/assets/header.png and b/src/gui/static/dist/assets/header.png differ diff --git a/src/gui/static/dist/assets/i18n/en.json b/src/gui/static/dist/assets/i18n/en.json new file mode 100755 index 0000000..927bdc1 --- /dev/null +++ b/src/gui/static/dist/assets/i18n/en.json @@ -0,0 +1,244 @@ +{ + "common": { + "coin-id": "SLB", + "coin-hours": "Coin Hours", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs" + }, + + "title": { + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy SLB", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "SolarBankersCoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your SLB after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single SLB address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the SLB to a new address in the wallet selected above at the current rate of {{ rate }} SLB/BTC.", + "fraction-warning": "Only send multiple of the SLB/BTC rate! SLB is sent in whole number; fractional SLB is not sent!", + "receive": "Receive SLB", + "receive-desc": "After receiving your Bitcoin, we'll send you your SLB. It may take anywhere between 20 minutes and an hour to receive your SLB.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a SLB wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your SLB wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "wallet": "Wallet", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "address": { + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "outputs": "Unspent Outputs" + } + }, + + "send": { + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "addresses-help": "Wallet addresses to send from", + "change-address-label": "Custom change address", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-sent": "sent", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SLB supply", + "total-supply": "Total SLB supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send SLB", + "unknown": "Unknown" + } +} diff --git a/src/gui/static/dist/assets/img/edit-blue.png b/src/gui/static/dist/assets/img/edit-blue.png new file mode 100755 index 0000000..de88a9a Binary files /dev/null and b/src/gui/static/dist/assets/img/edit-blue.png differ diff --git a/src/gui/static/dist/assets/img/header.png b/src/gui/static/dist/assets/img/header.png index 6eaf10d..56243b8 100755 Binary files a/src/gui/static/dist/assets/img/header.png and b/src/gui/static/dist/assets/img/header.png differ diff --git a/src/gui/static/dist/assets/img/lock-grey.png b/src/gui/static/dist/assets/img/lock-grey.png new file mode 100755 index 0000000..3f835e7 Binary files /dev/null and b/src/gui/static/dist/assets/img/lock-grey.png differ diff --git a/src/gui/static/dist/assets/img/minus-red.png b/src/gui/static/dist/assets/img/minus-red.png index 33677a7..6686a98 100755 Binary files a/src/gui/static/dist/assets/img/minus-red.png and b/src/gui/static/dist/assets/img/minus-red.png differ diff --git a/src/gui/static/dist/assets/img/plus-green.png b/src/gui/static/dist/assets/img/plus-green.png new file mode 100755 index 0000000..ab02079 Binary files /dev/null and b/src/gui/static/dist/assets/img/plus-green.png differ diff --git a/src/gui/static/dist/assets/img/unlock-gold.png b/src/gui/static/dist/assets/img/unlock-gold.png new file mode 100755 index 0000000..3ecf4ae Binary files /dev/null and b/src/gui/static/dist/assets/img/unlock-gold.png differ diff --git a/src/gui/static/dist/header.250b4e23ed529c1ee94b.png b/src/gui/static/dist/header.250b4e23ed529c1ee94b.png new file mode 100755 index 0000000..56243b8 Binary files /dev/null and b/src/gui/static/dist/header.250b4e23ed529c1ee94b.png differ diff --git a/src/gui/static/dist/header.f58db270477d6968f530.png b/src/gui/static/dist/header.f58db270477d6968f530.png deleted file mode 100755 index 6eaf10d..0000000 Binary files a/src/gui/static/dist/header.f58db270477d6968f530.png and /dev/null differ diff --git a/src/gui/static/dist/index.html b/src/gui/static/dist/index.html index fd6e184..75dc604 100755 --- a/src/gui/static/dist/index.html +++ b/src/gui/static/dist/index.html @@ -1 +1 @@ -SolarBankersCoin \ No newline at end of file +SolarBankersCoin \ No newline at end of file diff --git a/src/gui/static/dist/inline.2773fac96b73a466879f.bundle.js b/src/gui/static/dist/inline.2773fac96b73a466879f.bundle.js new file mode 100755 index 0000000..b49d665 --- /dev/null +++ b/src/gui/static/dist/inline.2773fac96b73a466879f.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,u){for(var a,i,f,l=0,s=[];l12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(n("PJh5"))},"+3/4":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e){t.call(this),this.scheduler=e}return Object(r.__extends)(e,t),e.create=function(t){return new e(t)},e.dispatch=function(t){t.subscriber.complete()},e.prototype._subscribe=function(t){var n=this.scheduler;if(n)return n.schedule(e.dispatch,0,{subscriber:t});t.complete()},e}(n("YaPU").a)},"+7/x":function(t,e,n){!function(t){"use strict";var e={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};t.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(t){return t+"\u0bb5\u0ba4\u0bc1"},preparse:function(t){return t.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(t,e,n){return t<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":t<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":t<10?" \u0b95\u0bbe\u0bb2\u0bc8":t<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":t<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":t<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(t,e){return 12===t&&(t=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===e?t<2?t:t+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===e||"\u0b95\u0bbe\u0bb2\u0bc8"===e?t:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(n("PJh5"))},"+CnV":function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e,r=n("AMGY").a.Symbol;return"function"==typeof r?r.observable?e=r.observable:(e=r("observable"),r.observable=e):e="@@observable",e}()},"/4Bh":function(t,e,n){"use strict";var r=n("TToO"),i=n("OVmG");function o(t,e){var n=!1;return arguments.length>=2&&(n=!0),function(r){return r.lift(new s(t,e,n))}}var s=function(){function t(t,e,n){void 0===n&&(n=!1),this.accumulator=t,this.seed=e,this.hasSeed=n}return t.prototype.call=function(t,e){return e.subscribe(new a(t,this.accumulator,this.seed,this.hasSeed))},t}(),a=function(t){function e(e,n,r,i){t.call(this,e),this.accumulator=n,this._seed=r,this.hasSeed=i,this.index=0}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"seed",{get:function(){return this._seed},set:function(t){this.hasSeed=!0,this._seed=t},enumerable:!0,configurable:!0}),e.prototype._next=function(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)},e.prototype._tryNext=function(t){var e,n=this.index++;try{e=this.accumulator(this.seed,t,n)}catch(t){this.destination.error(t)}this.seed=e,this.destination.next(e)},e}(i.a),l=n("pU/0"),u=n("+3/4");function c(t){return function(e){return 0===t?new u.a:e.lift(new d(t))}}var d=function(){function t(t){if(this.total=t,this.total<0)throw new l.a}return t.prototype.call=function(t,e){return e.subscribe(new h(t,this.total))},t}(),h=function(t){function e(e,n){t.call(this,e),this.total=n,this.ring=new Array,this.count=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e=this.ring,n=this.total,r=this.count++;e.length0)for(var n=this.count>=this.total?this.total:this.count,r=this.ring,i=0;i=2?function(n){return Object(_.a)(o(t,e),c(1),(void 0===(r=e)&&(r=null),function(t){return t.lift(new p(r))}))(n);var r}:function(e){return Object(_.a)(o(function(e,n,r){return t(e,n,r+1)}),c(1))(e)}}},"/6P1":function(t,e,n){!function(t){"use strict";var e={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function n(t,e,n,r){return e?i(n)[0]:r?i(n)[1]:i(n)[2]}function r(t){return t%10==0||t>10&&t<20}function i(t){return e[t].split("_")}function o(t,e,o,s){var a=t+" ";return 1===t?a+n(0,e,o[0],s):e?a+(r(t)?i(o)[1]:i(o)[0]):s?a+i(o)[1]:a+(r(t)?i(o)[1]:i(o)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(t,e,n,r){return e?"kelios sekund\u0117s":r?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:o,m:n,mm:o,h:n,hh:o,d:n,dd:o,M:n,MM:o,y:n,yy:o},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(n("PJh5"))},"/bsm":function(t,e,n){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n("PJh5"))},"/iUD":function(t,e,n){"use strict";e.a=function(t){return"function"==typeof t}},"/mhn":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u093f"===e?t<4?t:t+12:"\u092c\u093f\u0939\u093e\u0928"===e?t:"\u0926\u093f\u0909\u0901\u0938\u094b"===e?t>=10?t:t+12:"\u0938\u093e\u0901\u091d"===e?t+12:void 0},meridiem:function(t,e,n){return t<3?"\u0930\u093e\u0924\u093f":t<12?"\u092c\u093f\u0939\u093e\u0928":t<16?"\u0926\u093f\u0909\u0901\u0938\u094b":t<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n("PJh5"))},"/nXB":function(t,e,n){"use strict";e.a=function(){for(var t=[],e=0;e1&&"number"==typeof t[t.length-1]&&(n=t.pop())):"number"==typeof l&&(n=t.pop()),null===a&&1===t.length&&t[0]instanceof r.a?t[0]:Object(s.a)(n)(new i.a(t,a))};var r=n("YaPU"),i=n("Veqx"),o=n("1Q68"),s=n("8D5t")},0:function(t,e,n){t.exports=n("x35b")},"0X8Q":function(t,e,n){!function(t){"use strict";t.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"1Bqh":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.subject=e,this.subscriber=n,this.closed=!1}return Object(r.__extends)(e,t),e.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var t=this.subject,e=t.observers;if(this.subject=null,e&&0!==e.length&&!t.isStopped&&!t.closed){var n=e.indexOf(this.subscriber);-1!==n&&e.splice(n,1)}}},e}(n("VwZZ").a)},"1Q68":function(t,e,n){"use strict";e.a=function(t){return t&&"function"==typeof t.schedule}},"2pmY":function(t,e,n){!function(t){"use strict";var e={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};t.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(t){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(t)},meridiem:function(t,e,n){return t<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/[\u06f0-\u06f9]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n("PJh5"))},"2s1U":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i=t+" ";switch(n){case"s":return e||r?"nekaj sekund":"nekaj sekundami";case"ss":return i+(1===t?e?"sekundo":"sekundi":2===t?e||r?"sekundi":"sekundah":t<5?e||r?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return i+(1===t?e?"minuta":"minuto":2===t?e||r?"minuti":"minutama":t<5?e||r?"minute":"minutami":e||r?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return i+(1===t?e?"ura":"uro":2===t?e||r?"uri":"urama":t<5?e||r?"ure":"urami":e||r?"ur":"urami");case"d":return e||r?"en dan":"enim dnem";case"dd":return i+(1===t?e||r?"dan":"dnem":2===t?e||r?"dni":"dnevoma":e||r?"dni":"dnevi");case"M":return e||r?"en mesec":"enim mesecem";case"MM":return i+(1===t?e||r?"mesec":"mesecem":2===t?e||r?"meseca":"mesecema":t<5?e||r?"mesece":"meseci":e||r?"mesecev":"meseci");case"y":return e||r?"eno leto":"enim letom";case"yy":return i+(1===t?e||r?"leto":"letom":2===t?e||r?"leti":"letoma":t<5?e||r?"leta":"leti":e||r?"let":"leti")}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},"3CJN":function(t,e,n){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3IRH":function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},"3K28":function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3LKG":function(t,e,n){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"3MVc":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},o=function(t){return function(e,n,o,s){var a=r(e),l=i[t][r(e)];return 2===a&&(l=l[n?0:1]),l.replace(/%d/i,e)}},s=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar",{months:s,monthsShort:s,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},"3a3m":function(t,e,n){"use strict";var r=n("TToO"),i=n("g5jc"),o=n("YaPU"),s=n("OVmG"),a=n("VwZZ");function l(){return function(t){return t.lift(new u(t))}}var u=function(){function t(t){this.connectable=t}return t.prototype.call=function(t,e){var n=this.connectable;n._refCount++;var r=new c(t,n),i=e.subscribe(r);return r.closed||(r.connection=n.connect()),i},t}(),c=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.__extends)(e,t),e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._refCount;if(e<=0)this.connection=null;else if(t._refCount=e-1,e>1)this.connection=null;else{var n=this.connection,r=t._connection;this.connection=null,!r||n&&r!==n||r.unsubscribe()}}else this.connection=null},e}(s.a),d=function(t){function e(e,n){t.call(this),this.source=e,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}return Object(r.__extends)(e,t),e.prototype._subscribe=function(t){return this.getSubject().subscribe(t)},e.prototype.getSubject=function(){var t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject},e.prototype.connect=function(){var t=this._connection;return t||(this._isComplete=!1,(t=this._connection=new a.a).add(this.source.subscribe(new p(this.getSubject(),this))),t.closed?(this._connection=null,t=a.a.EMPTY):this._connection=t),t},e.prototype.refCount=function(){return l()(this)},e}(o.a).prototype,h={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:d._subscribe},_isComplete:{value:d._isComplete,writable:!0},getSubject:{value:d.getSubject},connect:{value:d.connect},refCount:{value:d.refCount}},p=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.__extends)(e,t),e.prototype._error=function(e){this._unsubscribe(),t.prototype._error.call(this,e)},e.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}},e}(i.b);function f(){return new i.a}e.a=function(){return function(t){return l()((e=f,function(t){var n;n="function"==typeof e?e:function(){return e};var r=Object.create(t,h);return r.source=t,r.subjectFactory=n,r})(t));var e}}},"3hfc":function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}t.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:e,mm:e,h:e,hh:e,d:"\u0434\u0437\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u044b":t<12?"\u0440\u0430\u043d\u0456\u0446\u044b":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-\u044b":t+"-\u0456";case"D":return t+"-\u0433\u0430";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},"5Omq":function(t,e,n){!function(t){"use strict";t.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"5SNd":function(t,e,n){!function(t){"use strict";var e={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};t.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0448\u0430\u0431"===e?t<4?t:t+12:"\u0441\u0443\u0431\u04b3"===e?t:"\u0440\u04ef\u0437"===e?t>=11?t:t+12:"\u0431\u0435\u0433\u043e\u04b3"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0448\u0430\u0431":t<11?"\u0441\u0443\u0431\u04b3":t<16?"\u0440\u04ef\u0437":t<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"5X6E":function(t,e,n){"use strict";e.a=function(t,e){return function(n){return n.lift(new s(t,e))}};var r=n("TToO"),i=n("tZ2B"),o=n("PIsA"),s=function(){function t(t,e){this.project=t,this.resultSelector=e}return t.prototype.call=function(t,e){return e.subscribe(new a(t,this.project,this.resultSelector))},t}(),a=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.resultSelector=r,this.index=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e,n=this.index++;try{e=this.project(t,n)}catch(t){return void this.destination.error(t)}this._innerSub(e,t,n)},e.prototype._innerSub=function(t,e,n){var r=this.innerSubscription;r&&r.unsubscribe(),this.add(this.innerSubscription=Object(o.a)(this,t,e,n))},e.prototype._complete=function(){var e=this.innerSubscription;e&&!e.closed||t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){this.innerSubscription=null},e.prototype.notifyComplete=function(e){this.remove(e),this.innerSubscription=null,this.isStopped&&t.prototype._complete.call(this)},e.prototype.notifyNext=function(t,e,n,r,i){this.resultSelector?this._tryNotifyNext(t,e,n,r):this.destination.next(e)},e.prototype._tryNotifyNext=function(t,e,n,r){var i;try{i=this.resultSelector(t,e,n,r)}catch(t){return void this.destination.error(t)}this.destination.next(i)},e}(i.a)},"5j66":function(t,e,n){!function(t){"use strict";t.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(n("PJh5"))},"5vPg":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function r(t,e,n,r){var i="";if(e)switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":i="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":i="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":i="%d \u0924\u093e\u0938";break;case"d":i="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":i="%d \u0926\u093f\u0935\u0938";break;case"M":i="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":i="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":i="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":i="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":i="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":i="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":i="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":i="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":i="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return i.replace(/%d/i,t)}t.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===e?t<4?t:t+12:"\u0938\u0915\u093e\u0933\u0940"===e?t:"\u0926\u0941\u092a\u093e\u0930\u0940"===e?t>=10?t:t+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924\u094d\u0930\u0940":t<10?"\u0938\u0915\u093e\u0933\u0940":t<17?"\u0926\u0941\u092a\u093e\u0930\u0940":t<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n("PJh5"))},"6cf8":function(t,e,n){!function(t){"use strict";var e={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};t.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"7LV+":function(t,e,n){!function(t){"use strict";var e="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function r(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function i(t,e,n){var i=t+" ";switch(n){case"ss":return i+(r(t)?"sekundy":"sekund");case"m":return e?"minuta":"minut\u0119";case"mm":return i+(r(t)?"minuty":"minut");case"h":return e?"godzina":"godzin\u0119";case"hh":return i+(r(t)?"godziny":"godzin");case"MM":return i+(r(t)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return i+(r(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,r){return t?""===r?"("+n[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(r)?n[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:i,m:i,mm:i,h:i,hh:i,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:i,y:"rok",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"7MHZ":function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"7OnE":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};t.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n("PJh5"))},"7Q8x":function(t,e,n){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,n){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n("PJh5"))},"8D5t":function(t,e,n){"use strict";var r=n("Qnch");function i(t){return t}e.a=function(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(r.a)(i,null,t)}},"8v14":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"9Ocp":function(t,e,n){"use strict";e.a=function(t){return function(e){return 0===t?new s.a:e.lift(new a(t))}};var r=n("TToO"),i=n("OVmG"),o=n("pU/0"),s=n("+3/4"),a=function(){function t(t){if(this.total=t,this.total<0)throw new o.a}return t.prototype.call=function(t,e){return e.subscribe(new l(t,this.total))},t}(),l=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e=this.total,n=++this.count;n<=e&&(this.destination.next(t),n===e&&(this.destination.complete(),this.unsubscribe()))},e}(i.a)},ALEw:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},AMGY:function(t,e,n){"use strict";(function(t){n.d(e,"a",function(){return o});var r="undefined"!=typeof window&&window,i="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,o=r||"undefined"!=typeof t&&t||i}).call(e,n("DuR2"))},Ab7C:function(t,e,n){!function(t){"use strict";t.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},AoDM:function(t,e,n){!function(t){"use strict";t.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(n("PJh5"))},BEem:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n("PJh5"))},BX3T:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=Array.isArray||function(t){return t&&"number"==typeof t.length}},BbgG:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},Bp2f:function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},C7av:function(t,e,n){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},CFqe:function(t,e,n){!function(t){"use strict";t.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(t,e,n){return t>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(t){return"\u03bc"===(t+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n,r=this._calendarEl[t],i=e&&e.hours();return((n=r)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(r=r.apply(e)),r.replace("{}",i%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n("PJh5"))},DDro:function(t,e,n){"use strict";e.a=function(){return Object(r.a)(i,[])};var r=n("/4Bh");function i(t,e,n){return t.push(e),t}},DOkx:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},DSXN:function(t,e,n){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n("PJh5"))},DuR2:function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},ETHv:function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924"===e?t<4?t:t+12:"\u0938\u0941\u092c\u0939"===e?t:"\u0926\u094b\u092a\u0939\u0930"===e?t>=10?t:t+12:"\u0936\u093e\u092e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924":t<10?"\u0938\u0941\u092c\u0939":t<17?"\u0926\u094b\u092a\u0939\u0930":t<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n("PJh5"))},"F+2e":function(t,e,n){!function(t){"use strict";var e={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};t.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(t){return t.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n("PJh5"))},FKXc:function(t,e,n){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},FRPF:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n("PJh5"))},FlzV:function(t,e,n){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},Fpqq:function(t,e,n){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"e":1===e?"a":2===e?"a":"e")},week:{dow:1,doy:4}})}(n("PJh5"))},Frex:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},FuaP:function(t,e,n){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"G++c":function(t,e,n){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},GK6M:function(t,e,n){"use strict";e.a=function(t){return r=t,o};var r,i=n("fKB6");function o(){try{return r.apply(this,arguments)}catch(t){return i.a.e=t,i.a}}},GrS7:function(t,e,n){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(t){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(t)},meridiem:function(t){return t<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":t<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":t<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-\u056b\u0576":t+"-\u0580\u0564";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},HdCx:function(t,e,n){"use strict";e.a=function(t,e){return function(n){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new o(t,e))}};var r=n("TToO"),i=n("OVmG"),o=function(){function t(t,e){this.project=t,this.thisArg=e}return t.prototype.call=function(t,e){return e.subscribe(new s(t,this.project,this.thisArg))},t}(),s=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.count=0,this.thisArg=r||this}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(i.a)},INcR:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n("PJh5"))},Jnfr:function(t,e){function n(t){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+t+"'.")})}n.keys=function(){return[]},n.resolve=n,t.exports=n,n.id="Jnfr"},JwiF:function(t,e,n){!function(t){"use strict";t.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(t,e){return 12===t&&(t=0),"enjing"===e?t:"siyang"===e?t>=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n("PJh5"))},LT9G:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},Lgqo:function(t,e,n){!function(t){"use strict";t.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(t){return t+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(t){return"\u0db4.\u0dc0."===t||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===t},meridiem:function(t,e,n){return t>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n("PJh5"))},N3vo:function(t,e,n){!function(t){"use strict";t.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(t){return t+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(t)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(t)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n("PJh5"))},N4j0:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){return t&&"number"==typeof t.length}},Nd3h:function(t,e,n){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n("PJh5"))},Nlnz:function(t,e,n){!function(t){"use strict";t.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===e?t<4?t:t+12:"\u0c09\u0c26\u0c2f\u0c02"===e?t:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===e?t>=10?t:t+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":t<10?"\u0c09\u0c26\u0c2f\u0c02":t<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":t<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n("PJh5"))},Nzt2:function(t,e,n){!function(t){"use strict";t.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(t){return 2===t?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":t+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(t){return 2===t?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":t+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(t){return 2===t?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":t+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(t){return 2===t?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":t%10==0&&10!==t?t+" \u05e9\u05e0\u05d4":t+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(t){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(t)},meridiem:function(t,e,n){return t<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":t<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":t<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":t<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n("PJh5"))},ORgI:function(t,e,n){!function(t){"use strict";t.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(t){return"\u5348\u5f8c"===t},meridiem:function(t,e,n){return t<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";default:return t}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(n("PJh5"))},OSsP:function(t,e,n){!function(t){"use strict";function e(t,e,n){return t+" "+function(t,e){return 2===e?function(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}(t):t}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],t)}t.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:function(t){switch(function t(e){return e>9?t(e%10):e}(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(t){return t+(1===t?"a\xf1":"vet")},week:{dow:1,doy:4}})}(n("PJh5"))},OUMt:function(t,e,n){!function(t){"use strict";var e="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function r(t){return t>1&&t<5}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sek\xfand"):o+"sekundami";case"m":return e?"min\xfata":i?"min\xfatu":"min\xfatou";case"mm":return e||i?o+(r(t)?"min\xfaty":"min\xfat"):o+"min\xfatami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hod\xedn"):o+"hodinami";case"d":return e||i?"de\u0148":"d\u0148om";case"dd":return e||i?o+(r(t)?"dni":"dn\xed"):o+"d\u0148ami";case"M":return e||i?"mesiac":"mesiacom";case"MM":return e||i?o+(r(t)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return e||i?"rok":"rokom";case"yy":return e||i?o+(r(t)?"roky":"rokov"):o+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVPi:function(t,e,n){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVmG:function(t,e,n){"use strict";n.d(e,"a",function(){return l});var r=n("TToO"),i=n("/iUD"),o=n("VwZZ"),s=n("t7NR"),a=n("tLDX"),l=function(t){function e(n,r,i){switch(t.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=s.a;break;case 1:if(!n){this.destination=s.a;break}if("object"==typeof n){n instanceof e?(this.syncErrorThrowable=n.syncErrorThrowable,this.destination=n,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,n));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,n,r,i)}}return Object(r.__extends)(e,t),e.prototype[a.a]=function(){return this},e.create=function(t,n,r){var i=new e(t,n,r);return i.syncErrorThrowable=!1,i},e.prototype.next=function(t){this.isStopped||this._next(t)},e.prototype.error=function(t){this.isStopped||(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,t.prototype.unsubscribe.call(this))},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){this.destination.error(t),this.unsubscribe()},e.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},e.prototype._unsubscribeAndRecycle=function(){var t=this._parent,e=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=t,this._parents=e,this},e}(o.a),u=function(t){function e(e,n,r,o){var a;t.call(this),this._parentSubscriber=e;var l=this;Object(i.a)(n)?a=n:n&&(a=n.next,r=n.error,o=n.complete,n!==s.a&&(l=Object.create(n),Object(i.a)(l.unsubscribe)&&this.add(l.unsubscribe.bind(l)),l.unsubscribe=this.unsubscribe.bind(this))),this._context=l,this._next=a,this._error=r,this._complete=o}return Object(r.__extends)(e,t),e.prototype.next=function(t){if(!this.isStopped&&this._next){var e=this._parentSubscriber;e.syncErrorThrowable?this.__tryOrSetError(e,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}},e.prototype.error=function(t){if(!this.isStopped){var e=this._parentSubscriber;if(this._error)e.syncErrorThrowable?(this.__tryOrSetError(e,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else{if(!e.syncErrorThrowable)throw this.unsubscribe(),t;e.syncErrorValue=t,e.syncErrorThrown=!0,this.unsubscribe()}}},e.prototype.complete=function(){var t=this;if(!this.isStopped){var e=this._parentSubscriber;if(this._complete){var n=function(){return t._complete.call(t._context)};e.syncErrorThrowable?(this.__tryOrSetError(e,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}},e.prototype.__tryOrUnsub=function(t,e){try{t.call(this._context,e)}catch(t){throw this.unsubscribe(),t}},e.prototype.__tryOrSetError=function(t,e,n){try{e.call(this._context,n)}catch(e){return t.syncErrorValue=e,t.syncErrorThrown=!0,!0}return!1},e.prototype._unsubscribe=function(){var t=this._parentSubscriber;this._context=null,this._parentSubscriber=null,t.unsubscribe()},e}(l)},PIsA:function(t,e,n){"use strict";var r=n("AMGY"),i=n("N4j0"),o=n("cQXm"),s=n("dgOU"),a=n("YaPU"),l=n("etqZ"),u=n("TToO"),c=function(t){function e(e,n,r){t.call(this),this.parent=e,this.outerValue=n,this.outerIndex=r,this.index=0}return Object(u.__extends)(e,t),e.prototype._next=function(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)},e.prototype._error=function(t){this.parent.notifyError(t,this),this.unsubscribe()},e.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},e}(n("OVmG").a),d=n("+CnV");e.a=function(t,e,n,u){var h=new c(t,n,u);if(h.closed)return null;if(e instanceof a.a)return e._isScalar?(h.next(e.value),h.complete(),null):(h.syncErrorThrowable=!0,e.subscribe(h));if(Object(i.a)(e)){for(var p=0,f=e.length;p>>0,r=0;r0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,e-r.length)).toString().substr(1)+r}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,B={},z={};function W(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(z[t]=i),e&&(z[e[0]]=function(){return F(i.apply(this,arguments),e[1],e[2])}),n&&(z[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),B[e]=B[e]||function(t){var e,n,r,i=t.match(N);for(e=0,n=i.length;e=0&&V.test(t);)t=t.replace(V,r),V.lastIndex=0,n-=1;return t}var J=/\d/,q=/\d\d/,Q=/\d{3}/,X=/\d{4}/,K=/[+-]?\d{6}/,Z=/\d\d?/,$=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,rt=/[+-]?\d{1,6}/,it=/\d+/,ot=/[+-]?\d+/,st=/Z|[+-]\d\d:?\d\d/gi,at=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function ct(t,e,n){ut[t]=D(e)?e:function(t,r){return t&&n?n:e}}function dt(t,e){return d(ut,t)?ut[t](e._strict,e._locale):new RegExp(ht(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i})))}function ht(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var pt={};function ft(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),l(e)&&(r=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Tt,Ot=Dt("FullYear",!0);function Dt(t,e){return function(n){return null!=n?(Pt(this,t,n),i.updateOffset(this,e),this):Yt(this,t)}}function Yt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Pt(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&St(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Et(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function Et(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%12+12)%12;return t+=(e-n)/12,1===n?St(t)?29:28:31-n%7%2}Tt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function zt(t,e,n){var r=7+e-n;return-(7+Bt(t,0,r).getUTCDay()-e)%7+r-1}function Wt(t,e,n,r,i){var o,s,a=1+7*(e-1)+(7+n-r)%7+zt(t,r,i);return a<=0?s=Ct(o=t-1)+a:a>Ct(t)?(o=t+1,s=a-Ct(t)):(o=t,s=a),{year:o,dayOfYear:s}}function Ut(t,e,n){var r,i,o=zt(t.year(),e,n),s=Math.floor((t.dayOfYear()-o-1)/7)+1;return s<1?r=s+Gt(i=t.year()-1,e,n):s>Gt(t.year(),e,n)?(r=s-Gt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=s),{week:r,year:i}}function Gt(t,e,n){var r=zt(t,e,n),i=zt(t+1,e,n);return(Ct(t)-r+i)/7}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),H("week",5),H("isoWeek",5),ct("w",Z),ct("ww",Z,q),ct("W",Z),ct("WW",Z,q),_t(["w","ww","W","WW"],function(t,e,n,r){e[r.substr(0,1)]=k(t)}),W("d",0,"do","day"),W("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),W("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),W("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),ct("d",Z),ct("e",Z),ct("E",Z),ct("dd",function(t,e){return e.weekdaysMinRegex(t)}),ct("ddd",function(t,e){return e.weekdaysShortRegex(t)}),ct("dddd",function(t,e){return e.weekdaysRegex(t)}),_t(["dd","ddd","dddd"],function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:f(n).invalidWeekday=t}),_t(["d","e","E"],function(t,e,n,r){e[r]=k(t)});var Jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Qt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xt=lt,Kt=lt,Zt=lt;function $t(){function t(t,e){return e.length-t.length}var e,n,r,i,o,s=[],a=[],l=[],u=[];for(e=0;e<7;e++)n=p([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),o=this.weekdays(n,""),s.push(r),a.push(i),l.push(o),u.push(r),u.push(i),u.push(o);for(s.sort(t),a.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)a[e]=ht(a[e]),l[e]=ht(l[e]),u[e]=ht(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+s.join("|")+")","i")}function te(){return this.hours()%12||12}function ee(t,e){W(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ne(t,e){return e._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,te),W("k",["kk",2],0,function(){return this.hours()||24}),W("hmm",0,0,function(){return""+te.apply(this)+F(this.minutes(),2)}),W("hmmss",0,0,function(){return""+te.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+F(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)}),ee("a",!0),ee("A",!1),A("hour","h"),H("hour",13),ct("a",ne),ct("A",ne),ct("H",Z),ct("h",Z),ct("k",Z),ct("HH",Z,q),ct("hh",Z,q),ct("kk",Z,q),ct("hmm",$),ct("hmmss",tt),ct("Hmm",$),ct("Hmmss",tt),ft(["H","HH"],bt),ft(["k","kk"],function(t,e,n){var r=k(t);e[bt]=24===r?0:r}),ft(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),ft(["h","hh"],function(t,e,n){e[bt]=k(t),f(n).bigHour=!0}),ft("hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r)),f(n).bigHour=!0}),ft("hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i)),f(n).bigHour=!0}),ft("Hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r))}),ft("Hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i))});var re,ie=Dt("Hours",!0),oe={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:jt,monthsShort:It,week:{dow:0,doy:6},weekdays:Jt,weekdaysMin:Qt,weekdaysShort:qt,meridiemParse:/[ap]\.?m?\.?/i},se={},ae={};function le(t){return t?t.toLowerCase().replace("_","-"):t}function ue(e){var r=null;if(!se[e]&&"undefined"!=typeof t&&t&&t.exports)try{r=re._abbr,n("uslO")("./"+e),ce(r)}catch(t){}return se[e]}function ce(t,e){var n;return t&&((n=a(e)?he(t):de(t,e))?re=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function de(t,e){if(null!==e){var n,r=oe;if(e.abbr=t,null!=se[t])O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=se[t]._config;else if(null!=e.parentLocale)if(null!=se[e.parentLocale])r=se[e.parentLocale]._config;else{if(null==(n=ue(e.parentLocale)))return ae[e.parentLocale]||(ae[e.parentLocale]=[]),ae[e.parentLocale].push({name:t,config:e}),null;r=n._config}return se[t]=new P(Y(r,e)),ae[t]&&ae[t].forEach(function(t){de(t.name,t.config)}),ce(t),se[t]}return delete se[t],null}function he(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return re;if(!o(t)){if(e=ue(t))return e;t=[t]}return function(t){for(var e,n,r,i,o=0;o0;){if(r=ue(i.slice(0,e).join("-")))return r;if(n&&n.length>=e&&x(i,n,!0)>=e-1)break;e--}o++}return re}(t)}function pe(t){var e,n=t._a;return n&&-2===f(t).overflow&&(e=n[yt]<0||n[yt]>11?yt:n[vt]<1||n[vt]>Et(n[gt],n[yt])?vt:n[bt]<0||n[bt]>24||24===n[bt]&&(0!==n[wt]||0!==n[Mt]||0!==n[kt])?bt:n[wt]<0||n[wt]>59?wt:n[Mt]<0||n[Mt]>59?Mt:n[kt]<0||n[kt]>999?kt:-1,f(t)._overflowDayOfYear&&(evt)&&(e=vt),f(t)._overflowWeeks&&-1===e&&(e=xt),f(t)._overflowWeekday&&-1===e&&(e=Lt),f(t).overflow=e),t}function fe(t,e,n){return null!=t?t:null!=e?e:n}function _e(t){var e,n,r,o,s,a=[];if(!t._d){for(r=function(t){var e=new Date(i.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[vt]&&null==t._a[yt]&&function(t){var e,n,r,i,o,s,a,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)o=1,s=4,n=fe(e.GG,t._a[gt],Ut(Oe(),1,4).year),r=fe(e.W,1),((i=fe(e.E,1))<1||i>7)&&(l=!0);else{o=t._locale._week.dow,s=t._locale._week.doy;var u=Ut(Oe(),o,s);n=fe(e.gg,t._a[gt],u.year),r=fe(e.w,u.week),null!=e.d?((i=e.d)<0||i>6)&&(l=!0):null!=e.e?(i=e.e+o,(e.e<0||e.e>6)&&(l=!0)):i=o}r<1||r>Gt(n,o,s)?f(t)._overflowWeeks=!0:null!=l?f(t)._overflowWeekday=!0:(a=Wt(n,r,i,o,s),t._a[gt]=a.year,t._dayOfYear=a.dayOfYear)}(t),null!=t._dayOfYear&&(s=fe(t._a[gt],r[gt]),(t._dayOfYear>Ct(s)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),n=Bt(s,0,t._dayOfYear),t._a[yt]=n.getUTCMonth(),t._a[vt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=a[e]=r[e];for(;e<7;e++)t._a[e]=a[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[wt]&&0===t._a[Mt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?Bt:function(t,e,n,r,i,o,s){var a=new Date(t,e,n,r,i,o,s);return t<100&&t>=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}).apply(null,a),o=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==o&&(f(t).weekdayMismatch=!0)}}var me=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ge=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/Z|[+-]\d\d(?::?\d\d)?/,ve=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],we=/^\/?Date\((\-?\d+)/i;function Me(t){var e,n,r,i,o,s,a=t._i,l=me.exec(a)||ge.exec(a);if(l){for(f(t).iso=!0,e=0,n=ve.length;e0&&f(t).unusedInput.push(s),a=a.slice(a.indexOf(n)+n.length),u+=n.length),z[o]?(n?f(t).empty=!1:f(t).unusedTokens.push(o),mt(o,n,t)):t._strict&&!n&&f(t).unusedTokens.push(o);f(t).charsLeftOver=l-u,a.length>0&&f(t).unusedInput.push(a),t._a[bt]<=12&&!0===f(t).bigHour&&t._a[bt]>0&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[bt]=(c=t._locale,d=t._a[bt],null==(h=t._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),_e(t),pe(t)}else Le(t);else Me(t);var c,d,h,p}function Se(t){var e=t._i,n=t._f;return t._locale=t._locale||he(t._l),null===e||void 0===n&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),w(e)?new b(pe(e)):(u(e)?t._d=e:o(n)?function(t){var e,n,r,i,o;if(0===t._f.length)return f(t).invalidFormat=!0,void(t._d=new Date(NaN));for(i=0;ithis?this:t:m()});function Pe(t,e){var n,r;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return Oe();for(n=e[0],r=1;r(o=Gt(t,r,i))&&(e=o),(function(t,e,n,r,i){var o=Wt(t,e,n,r,i),s=Bt(o.year,0,o.dayOfYear);return this.year(s.getUTCFullYear()),this.month(s.getUTCMonth()),this.date(s.getUTCDate()),this}).call(this,t,e,n,r,i))}W(0,["gg",2],0,function(){return this.weekYear()%100}),W(0,["GG",2],0,function(){return this.isoWeekYear()%100}),nn("gggg","weekYear"),nn("ggggg","weekYear"),nn("GGGG","isoWeekYear"),nn("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),ct("G",ot),ct("g",ot),ct("GG",Z,q),ct("gg",Z,q),ct("GGGG",nt,X),ct("gggg",nt,X),ct("GGGGG",rt,K),ct("ggggg",rt,K),_t(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,r){e[r.substr(0,2)]=k(t)}),_t(["gg","GG"],function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)}),W("Q",0,"Qo","quarter"),A("quarter","Q"),H("quarter",7),ct("Q",J),ft("Q",function(t,e){e[yt]=3*(k(t)-1)}),W("D",["DD",2],"Do","date"),A("date","D"),H("date",9),ct("D",Z),ct("DD",Z,q),ct("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),ft(["D","DD"],vt),ft("Do",function(t,e){e[vt]=k(t.match(Z)[0])});var on=Dt("Date",!0);W("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),H("dayOfYear",4),ct("DDD",et),ct("DDDD",Q),ft(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),W("m",["mm",2],0,"minute"),A("minute","m"),H("minute",14),ct("m",Z),ct("mm",Z,q),ft(["m","mm"],wt);var sn=Dt("Minutes",!1);W("s",["ss",2],0,"second"),A("second","s"),H("second",15),ct("s",Z),ct("ss",Z,q),ft(["s","ss"],Mt);var an,ln=Dt("Seconds",!1);for(W("S",0,0,function(){return~~(this.millisecond()/100)}),W(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,function(){return 10*this.millisecond()}),W(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),W(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),W(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),W(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),W(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),H("millisecond",16),ct("S",et,J),ct("SS",et,q),ct("SSS",et,Q),an="SSSS";an.length<=9;an+="S")ct(an,it);function un(t,e){e[kt]=k(1e3*("0."+t))}for(an="S";an.length<=9;an+="S")ft(an,un);var cn=Dt("Milliseconds",!1);W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var dn=b.prototype;function hn(t){return t}dn.add=Xe,dn.calendar=function(t,e){var n=t||Oe(),r=Ne(n,this).startOf("day"),o=i.calendarFormat(this,r)||"sameElse",s=e&&(D(e[o])?e[o].call(this,n):e[o]);return this.format(s||this.localeData().calendar(o,this,Oe(n)))},dn.clone=function(){return new b(this)},dn.diff=function(t,e,n){var r,i,o;if(!this.isValid())return NaN;if(!(r=Ne(t,this)).isValid())return NaN;switch(i=6e4*(r.utcOffset()-this.utcOffset()),e=j(e)){case"year":o=Ze(this,r)/12;break;case"month":o=Ze(this,r);break;case"quarter":o=Ze(this,r)/3;break;case"second":o=(this-r)/1e3;break;case"minute":o=(this-r)/6e4;break;case"hour":o=(this-r)/36e5;break;case"day":o=(this-r-i)/864e5;break;case"week":o=(this-r-i)/6048e5;break;default:o=this-r}return n?o:M(o)},dn.endOf=function(t){return void 0===(t=j(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},dn.format=function(t){t||(t=this.isUtc()?i.defaultFormatUtc:i.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},dn.from=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Oe(t).isValid())?Ue({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.fromNow=function(t){return this.from(Oe(),t)},dn.to=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Oe(t).isValid())?Ue({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.toNow=function(t){return this.to(Oe(),t)},dn.get=function(t){return D(this[t=j(t)])?this[t]():this},dn.invalidAt=function(){return f(this).overflow},dn.isAfter=function(t,e){var n=w(t)?t:Oe(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=j(a(e)?"millisecond":e))?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):D(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},dn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(n+r+"-MM-DD[T]HH:mm:ss.SSS"+e+'[")]')},dn.toJSON=function(){return this.isValid()?this.toISOString():null},dn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},dn.unix=function(){return Math.floor(this.valueOf()/1e3)},dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},dn.year=Ot,dn.isLeapYear=function(){return St(this.year())},dn.weekYear=function(t){return rn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},dn.isoWeekYear=function(t){return rn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},dn.quarter=dn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},dn.month=Ht,dn.daysInMonth=function(){return Et(this.year(),this.month())},dn.week=dn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},dn.isoWeek=dn.isoWeeks=function(t){var e=Ut(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},dn.weeksInYear=function(){var t=this.localeData()._week;return Gt(this.year(),t.dow,t.doy)},dn.isoWeeksInYear=function(){return Gt(this.year(),1,4)},dn.date=on,dn.day=dn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},dn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},dn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},dn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},dn.hour=dn.hours=ie,dn.minute=dn.minutes=sn,dn.second=dn.seconds=ln,dn.millisecond=dn.milliseconds=cn,dn.utcOffset=function(t,e,n){var r,o=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Fe(at,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=Ve(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),o!==t&&(!e||this._changeInProgress?Qe(this,Ue(t-o,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?o:Ve(this)},dn.utc=function(t){return this.utcOffset(0,t)},dn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ve(this),"m")),this},dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Fe(st,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},dn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Oe(t).utcOffset():0,(this.utcOffset()-t)%60==0)},dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},dn.isUtc=Be,dn.isUTC=Be,dn.zoneAbbr=function(){return this._isUTC?"UTC":""},dn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},dn.dates=C("dates accessor is deprecated. Use date instead.",on),dn.months=C("months accessor is deprecated. Use month instead",Ht),dn.years=C("years accessor is deprecated. Use year instead",Ot),dn.zone=C("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),dn.isDSTShifted=C("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!a(this._isDSTShifted))return this._isDSTShifted;var t={};if(y(t,this),(t=Se(t))._a){var e=t._isUTC?p(t._a):Oe(t._a);this._isDSTShifted=this.isValid()&&x(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pn=P.prototype;function fn(t,e,n,r){var i=he(),o=p().set(r,e);return i[n](o,t)}function _n(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return fn(t,e,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=fn(t,r,n,"month");return i}function mn(t,e,n,r){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var i,o=he(),s=t?o._week.dow:0;if(null!=n)return fn(e,(n+s)%7,r,"day");var a=[];for(i=0;i<7;i++)a[i]=fn(e,(i+s)%7,r,"day");return a}pn.calendar=function(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return D(r)?r.call(e,n):r},pn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},pn.invalidDate=function(){return this._invalidDate},pn.ordinal=function(t){return this._ordinal.replace("%d",t)},pn.preparse=hn,pn.postformat=hn,pn.relativeTime=function(t,e,n,r){var i=this._relativeTime[n];return D(i)?i(t,e,n,r):i.replace(/%d/i,t)},pn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return D(n)?n(e):n.replace(/%s/i,e)},pn.set=function(t){var e,n;for(n in t)D(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pn.months=function(t,e){return t?o(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||At).test(e)?"format":"standalone"][t.month()]:o(this._months)?this._months:this._months.standalone},pn.monthsShort=function(t,e){return t?o(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[At.test(e)?"format":"standalone"][t.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pn.monthsParse=function(t,e,n){var r,i,o;if(this._monthsParseExact)return(function(t,e,n){var r,i,o,s=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)o=p([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(o,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(o,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,s))?i:null:-1!==(i=Tt.call(this._longMonthsParse,s))?i:null:"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,s))?i:-1!==(i=Tt.call(this._longMonthsParse,s))?i:null:-1!==(i=Tt.call(this._longMonthsParse,s))?i:-1!==(i=Tt.call(this._shortMonthsParse,s))?i:null}).call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=p([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(o="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(o.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}},pn.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Nt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},pn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Ft),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},pn.week=function(t){return Ut(t,this._week.dow,this._week.doy).week},pn.firstDayOfYear=function(){return this._week.doy},pn.firstDayOfWeek=function(){return this._week.dow},pn.weekdays=function(t,e){return t?o(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},pn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},pn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},pn.weekdaysParse=function(t,e,n){var r,i,o;if(this._weekdaysParseExact)return(function(t,e,n){var r,i,o,s=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)o=p([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,s))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:null}).call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=p([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[r]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[r].test(t))return r;if(n&&"ddd"===e&&this._shortWeekdaysParse[r].test(t))return r;if(n&&"dd"===e&&this._minWeekdaysParse[r].test(t))return r;if(!n&&this._weekdaysParse[r].test(t))return r}},pn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},pn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Kt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Zt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},pn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ce("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),i.lang=C("moment.lang is deprecated. Use moment.locale instead.",ce),i.langData=C("moment.langData is deprecated. Use moment.localeData instead.",he);var gn=Math.abs;function yn(t,e,n,r){var i=Ue(e,n);return t._milliseconds+=r*i._milliseconds,t._days+=r*i._days,t._months+=r*i._months,t._bubble()}function vn(t){return t<0?Math.floor(t):Math.ceil(t)}function bn(t){return 4800*t/146097}function wn(t){return 146097*t/4800}function Mn(t){return function(){return this.as(t)}}var kn=Mn("ms"),xn=Mn("s"),Ln=Mn("m"),Cn=Mn("h"),Sn=Mn("d"),Tn=Mn("w"),On=Mn("M"),Dn=Mn("y");function Yn(t){return function(){return this.isValid()?this._data[t]:NaN}}var Pn=Yn("milliseconds"),En=Yn("seconds"),An=Yn("minutes"),jn=Yn("hours"),In=Yn("days"),Rn=Yn("months"),Hn=Yn("years"),Fn=Math.round,Nn={ss:44,s:45,m:45,h:22,d:26,M:11},Vn=Math.abs;function Bn(t){return(t>0)-(t<0)||+t}function zn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=Vn(this._milliseconds)/1e3,r=Vn(this._days),i=Vn(this._months);e=M((t=M(n/60))/60),n%=60,t%=60;var o=M(i/12),s=i%=12,a=r,l=e,u=t,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=Bn(this._months)!==Bn(d)?"-":"",f=Bn(this._days)!==Bn(d)?"-":"",_=Bn(this._milliseconds)!==Bn(d)?"-":"";return h+"P"+(o?p+o+"Y":"")+(s?p+s+"M":"")+(a?f+a+"D":"")+(l||u||c?"T":"")+(l?_+l+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var Wn=Ae.prototype;return Wn.isValid=function(){return this._isValid},Wn.abs=function(){var t=this._data;return this._milliseconds=gn(this._milliseconds),this._days=gn(this._days),this._months=gn(this._months),t.milliseconds=gn(t.milliseconds),t.seconds=gn(t.seconds),t.minutes=gn(t.minutes),t.hours=gn(t.hours),t.months=gn(t.months),t.years=gn(t.years),this},Wn.add=function(t,e){return yn(this,t,e,1)},Wn.subtract=function(t,e){return yn(this,t,e,-1)},Wn.as=function(t){if(!this.isValid())return NaN;var e,n,r=this._milliseconds;if("month"===(t=j(t))||"year"===t)return n=this._months+bn(e=this._days+r/864e5),"month"===t?n:n/12;switch(e=this._days+Math.round(wn(this._months)),t){case"week":return e/7+r/6048e5;case"day":return e+r/864e5;case"hour":return 24*e+r/36e5;case"minute":return 1440*e+r/6e4;case"second":return 86400*e+r/1e3;case"millisecond":return Math.floor(864e5*e)+r;default:throw new Error("Unknown unit "+t)}},Wn.asMilliseconds=kn,Wn.asSeconds=xn,Wn.asMinutes=Ln,Wn.asHours=Cn,Wn.asDays=Sn,Wn.asWeeks=Tn,Wn.asMonths=On,Wn.asYears=Dn,Wn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},Wn._bubble=function(){var t,e,n,r,i,o=this._milliseconds,s=this._days,a=this._months,l=this._data;return o>=0&&s>=0&&a>=0||o<=0&&s<=0&&a<=0||(o+=864e5*vn(wn(a)+s),s=0,a=0),l.milliseconds=o%1e3,t=M(o/1e3),l.seconds=t%60,e=M(t/60),l.minutes=e%60,n=M(e/60),l.hours=n%24,a+=i=M(bn(s+=M(n/24))),s-=vn(wn(i)),r=M(a/12),a%=12,l.days=s,l.months=a,l.years=r,this},Wn.clone=function(){return Ue(this)},Wn.get=function(t){return t=j(t),this.isValid()?this[t+"s"]():NaN},Wn.milliseconds=Pn,Wn.seconds=En,Wn.minutes=An,Wn.hours=jn,Wn.days=In,Wn.weeks=function(){return M(this.days()/7)},Wn.months=Rn,Wn.years=Hn,Wn.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var r=Ue(t).abs(),i=Fn(r.as("s")),o=Fn(r.as("m")),s=Fn(r.as("h")),a=Fn(r.as("d")),l=Fn(r.as("M")),u=Fn(r.as("y")),c=i<=Nn.ss&&["s",i]||i0,c[4]=n,(function(t,e,n,r,i){return i.relativeTime(e||1,!!n,t,r)}).apply(null,c)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},Wn.toISOString=zn,Wn.toString=zn,Wn.toJSON=zn,Wn.locale=$e,Wn.localeData=en,Wn.toIsoString=C("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zn),Wn.lang=tn,W("X",0,0,"unix"),W("x",0,0,"valueOf"),ct("x",ot),ct("X",/[+-]?\d+(\.\d{1,3})?/),ft("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),ft("x",function(t,e,n){n._d=new Date(k(t))}),i.version="2.21.0",e=Oe,i.fn=dn,i.min=function(){return Pe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Pe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=p,i.unix=function(t){return Oe(1e3*t)},i.months=function(t,e){return _n(t,e,"months")},i.isDate=u,i.locale=ce,i.invalid=m,i.duration=Ue,i.isMoment=w,i.weekdays=function(t,e,n){return mn(t,e,n,"weekdays")},i.parseZone=function(){return Oe.apply(null,arguments).parseZone()},i.localeData=he,i.isDuration=je,i.monthsShort=function(t,e){return _n(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return mn(t,e,n,"weekdaysMin")},i.defineLocale=de,i.updateLocale=function(t,e){if(null!=e){var n,r,i=oe;null!=(r=ue(t))&&(i=r._config),(n=new P(e=Y(i,e))).parentLocale=se[t],se[t]=n,ce(t)}else null!=se[t]&&(null!=se[t].parentLocale?se[t]=se[t].parentLocale:null!=se[t]&&delete se[t]);return se[t]},i.locales=function(){return S(se)},i.weekdaysShort=function(t,e,n){return mn(t,e,n,"weekdaysShort")},i.normalizeUnits=j,i.relativeTimeRounding=function(t){return void 0===t?Fn:"function"==typeof t&&(Fn=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Nn[t]&&(void 0===e?Nn[t]:(Nn[t]=e,"s"===t&&(Nn.ss=e-1),!0))},i.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},i.prototype=dn,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},i}()}).call(e,n("3IRH")(t))},QZk1:function(t,e,n){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},Qnch:function(t,e,n){"use strict";e.a=function(t,e,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof e&&(n=e,e=null),r.lift(new s(t,e,n))}};var r=n("TToO"),i=n("PIsA"),o=n("tZ2B"),s=function(){function t(t,e,n){void 0===n&&(n=Number.POSITIVE_INFINITY),this.project=t,this.resultSelector=e,this.concurrent=n}return t.prototype.call=function(t,e){return e.subscribe(new a(t,this.project,this.resultSelector,this.concurrent))},t}(),a=function(t){function e(e,n,r,i){void 0===i&&(i=Number.POSITIVE_INFINITY),t.call(this,e),this.project=n,this.resultSelector=r,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){this.active0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(o.a)},RMhj:function(t,e,n){var r={"./en.json":["TKku",0]};function i(t){var e=r[t];return e?n.e(e[1]).then(function(){return n(e[0])}):Promise.reject(new Error("Cannot find module '"+t+"'."))}i.keys=function(){return Object.keys(r)},i.id="RMhj",t.exports=i},Rf9G:function(t,e,n){"use strict";e.a=function(){return Object(r.a)()(this)};var r=n("3a3m")},RnJI:function(t,e,n){!function(t){"use strict";t.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(t)?t.replace(/\u10d8$/,"\u10e8\u10d8"):t+"\u10e8\u10d8"},past:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(t)?t.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(t)?t.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(t){return 0===t?t:1===t?t+"-\u10da\u10d8":t<20||t<=100&&t%20==0||t%100==0?"\u10db\u10d4-"+t:t+"-\u10d4"},week:{dow:1,doy:7}})}(n("PJh5"))},Sjoy:function(t,e,n){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},TILf:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.value=e,this.scheduler=n,this._isScalar=!0,n&&(this._isScalar=!1)}return Object(r.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){var e=t.value,n=t.subscriber;t.done?n.complete():(n.next(e),n.closed||(t.done=!0,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.value,r=this.scheduler;if(r)return r.schedule(e.dispatch,0,{done:!1,value:n,subscriber:t});t.next(n),t.closed||t.complete()},e}(n("YaPU").a)},TToO:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.__extends=function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},n.d(e,"__assign",function(){return i}),e.__rest=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(t);i=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},e.__param=function(t,e){return function(n,r){e(n,r,t)}},e.__metadata=function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},e.__awaiter=function(t,e,n,r){return new(n||(n=Promise))(function(i,o){function s(t){try{l(r.next(t))}catch(t){o(t)}}function a(t){try{l(r.throw(t))}catch(t){o(t)}}function l(t){t.done?i(t.value):new n(function(e){e(t.value)}).then(s,a)}l((r=r.apply(t,e||[])).next())})},e.__generator=function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=r[2&o[0]?"return":o[0]?"throw":"next"])&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[0,i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=(i=s.trys).length>0&&i[i.length-1])&&(6===o[0]||2===o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]1||l(t,e)})})}function l(t,e){try{(n=i[t](e)).value instanceof a?Promise.resolve(n.value.v).then(u,c):d(o[0][2],n)}catch(t){d(o[0][3],t)}var n}function u(t){l("next",t)}function c(t){l("throw",t)}function d(t,e){t(e),o.shift(),o.length&&l(o[0][0],o[0][1])}},e.__asyncDelegator=function(t){var e,n;return e={},r("next"),r("throw",function(t){throw t}),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,i){t[r]&&(e[r]=function(e){return(n=!n)?{value:a(t[r](e)),done:"return"===r}:i?i(e):e})}},e.__asyncValues=function(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=t[Symbol.asyncIterator];return e?e.call(t):"function"==typeof o?o(t):t[Symbol.iterator]()},e.__makeTemplateObject=function(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t};var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}}}function s(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,i,o=n.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function a(t){return this instanceof a?(this.v=t,this):new a(t)}},To0v:function(t,e,n){!function(t){"use strict";t.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===e||"\u0633\u06d5\u06be\u06d5\u0631"===e||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===e?t:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===e||"\u0643\u06d5\u0686"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":r<900?"\u0633\u06d5\u06be\u06d5\u0631":r<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":r<1230?"\u0686\u06c8\u0634":r<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return t+"-\u06be\u06d5\u067e\u062a\u06d5";default:return t}},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n("PJh5"))},Tqun:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},V0td:function(t,e,n){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,n){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},V4qH:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},VK9h:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},Veqx:function(t,e,n){"use strict";n.d(e,"a",function(){return l});var r=n("TToO"),i=n("YaPU"),o=n("TILf"),s=n("+3/4"),a=n("1Q68"),l=function(t){function e(e,n){t.call(this),this.array=e,this.scheduler=n,n||1!==e.length||(this._isScalar=!0,this.value=e[0])}return Object(r.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.of=function(){for(var t=[],n=0;n1?new e(t,r):1===i?new o.a(t[0],r):new s.a(r)},e.dispatch=function(t){var e=t.array,n=t.index,r=t.subscriber;n>=t.count?r.complete():(r.next(e[n]),r.closed||(t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(e.dispatch,0,{array:n,index:0,count:r,subscriber:t});for(var o=0;o=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u5468";default:return t}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n("PJh5"))},WT6e:function(t,e,n){"use strict";(function(t){n.d(e,"g",function(){return oe}),n.d(e,"V",function(){return Zt}),n.d(e,"Y",function(){return $t}),n.d(e,"U",function(){return ee}),n.d(e,"A",function(){return te}),n.d(e,"c",function(){return dt}),n.d(e,"E",function(){return ft}),n.d(e,"D",function(){return _t}),n.d(e,"b",function(){return mt}),n.d(e,"d",function(){return ut}),n.d(e,"e",function(){return ct}),n.d(e,"X",function(){return Ce}),n.d(e,"P",function(){return Wt}),n.d(e,"_0",function(){return Gt}),n.d(e,"w",function(){return Qe}),n.d(e,"f",function(){return $e}),n.d(e,"o",function(){return It}),n.d(e,"n",function(){return st}),n.d(e,"J",function(){return en}),n.d(e,"K",function(){return tn}),n.d(e,"a",function(){return _}),n.d(e,"k",function(){return m}),n.d(e,"t",function(){return y}),n.d(e,"F",function(){return g}),n.d(e,"S",function(){return v}),n.d(e,"Q",function(){return b}),n.d(e,"W",function(){return j}),n.d(e,"s",function(){return N}),n.d(e,"r",function(){return l}),n.d(e,"p",function(){return M}),n.d(e,"C",function(){return k}),n.d(e,"q",function(){return x}),n.d(e,"L",function(){return C}),n.d(e,"B",function(){return Rt}),n.d(e,"G",function(){return ue}),n.d(e,"H",function(){return ae}),n.d(e,"I",function(){return le}),n.d(e,"i",function(){return vt}),n.d(e,"j",function(){return St}),n.d(e,"l",function(){return ce}),n.d(e,"x",function(){return Yt}),n.d(e,"z",function(){return Dt}),n.d(e,"y",function(){return de}),n.d(e,"M",function(){return _e}),n.d(e,"N",function(){return pe}),n.d(e,"O",function(){return ge}),n.d(e,"R",function(){return ye}),n.d(e,"m",function(){return be}),n.d(e,"h",function(){return ve}),n.d(e,"u",function(){return ze}),n.d(e,"v",function(){return We}),n.d(e,"T",function(){return Oe}),n.d(e,"Z",function(){return qe}),n.d(e,"_13",function(){return Ye}),n.d(e,"_2",function(){return gt}),n.d(e,"_1",function(){return Tt}),n.d(e,"_10",function(){return O}),n.d(e,"_16",function(){return E}),n.d(e,"_30",function(){return A}),n.d(e,"_14",function(){return lt}),n.d(e,"_15",function(){return at}),n.d(e,"_3",function(){return Qn}),n.d(e,"_4",function(){return Xn}),n.d(e,"_5",function(){return _r}),n.d(e,"_6",function(){return Mo}),n.d(e,"_7",function(){return bn}),n.d(e,"_8",function(){return Hr}),n.d(e,"_9",function(){return Kn}),n.d(e,"_12",function(){return Jn}),n.d(e,"_18",function(){return sr}),n.d(e,"_19",function(){return or}),n.d(e,"_21",function(){return si}),n.d(e,"_22",function(){return Cr}),n.d(e,"_25",function(){return Fr}),n.d(e,"_28",function(){return Nr}),n.d(e,"_24",function(){return ui}),n.d(e,"_26",function(){return ci}),n.d(e,"_27",function(){return li}),n.d(e,"_29",function(){return ei}),n.d(e,"_31",function(){return hi}),n.d(e,"_32",function(){return gn}),n.d(e,"_33",function(){return _i}),n.d(e,"_17",function(){return Xe}),n.d(e,"_20",function(){return Ke}),n.d(e,"_23",function(){return Ze}),n.d(e,"_11",function(){return ht});var r=n("TToO"),i=n("YaPU"),o=n("/nXB"),s=n("Rf9G"),a=n("g5jc"),l=function(){function t(t){this._desc=t,this.ngMetadataName="InjectionToken"}return t.prototype.toString=function(){return"InjectionToken "+this._desc},t}(),u="__annotations__",c="__paramaters__",d="__prop__metadata__";function h(t,e,n,r){var i=p(e);function o(t){if(this instanceof o)return i.call(this,t),this;var e=new o(t),n=function(t){return(t.hasOwnProperty(u)?t[u]:Object.defineProperty(t,u,{value:[]})[u]).push(e),t};return r&&r(n),n}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=t,o.annotationCls=o,o}function p(t){return function(){for(var e=[],n=0;n ");else if("object"==typeof e){var i=[];for(var o in e)if(e.hasOwnProperty(o)){var s=e[o];i.push(o+":"+("string"==typeof s?JSON.stringify(s):A(s)))}r="{"+i.join(", ")+"}"}return"StaticInjectorError"+(n?"("+n+")":"")+"["+r+"]: "+t.replace(q,"\n ")}function $(t,e){return new Error(Z(t,e))}var tt="ngDebugContext",et="ngOriginalError",nt="ngErrorLogger";function rt(t){return t[tt]}function it(t){return t[et]}function ot(t){for(var e=[],n=1;n0)t._bootstrapComponents.forEach(function(t){return e.bootstrap(t)});else{if(!t.instance.ngDoBootstrap)throw new Error("The module "+A(t.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');t.instance.ngDoBootstrap(e)}this._modules.push(t)},t.prototype.onDestroy=function(t){this._destroyListeners.push(t)},Object.defineProperty(t.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(t){return t.destroy()}),this._destroyListeners.forEach(function(t){return t()}),this._destroyed=!0},Object.defineProperty(t.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),t}();function ie(t,e){return Array.isArray(e)?e.reduce(ie,t):Object(r.__assign)({},t,e)}var oe=function(){function t(t,e,n,r,a,l){var u=this;this._zone=t,this._console=e,this._injector=n,this._exceptionHandler=r,this._componentFactoryResolver=a,this._initStatus=l,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=$t(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new i.a(function(t){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){t.next(u._stable),t.complete()})}),d=new i.a(function(t){var e;u._zone.runOutsideAngular(function(){e=u._zone.onStable.subscribe(function(){Rt.assertNotInAngularZone(),P(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,t.next(!0))})})});var n=u._zone.onUnstable.subscribe(function(){Rt.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){t.next(!1)}))});return function(){e.unsubscribe(),n.unsubscribe()}});this.isStable=Object(o.a)(c,s.a.call(d))}return t.prototype.bootstrap=function(t,e){var n,r=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=t instanceof wt?t:this._componentFactoryResolver.resolveComponentFactory(t),this.componentTypes.push(n.componentType);var i=n instanceof Ot?null:this._injector.get(Dt),o=n.create(N.NULL,[],e||n.selector,i);o.onDestroy(function(){r._unloadComponent(o)});var s=o.injector.get(Wt,null);return s&&o.injector.get(Ut).registerApplication(o.location.nativeElement,s),this._loadComponent(o),$t()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),o},t.prototype.tick=function(){var e=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var n=t._tickScope();try{this._runningTick=!0,this._views.forEach(function(t){return t.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(t){return t.checkNoChanges()})}catch(t){this._zone.runOutsideAngular(function(){return e._exceptionHandler.handleError(t)})}finally{this._runningTick=!1,jt(n)}},t.prototype.attachView=function(t){var e=t;this._views.push(e),e.attachToAppRef(this)},t.prototype.detachView=function(t){var e=t;se(this._views,e),e.detachFromAppRef()},t.prototype._loadComponent=function(t){this.attachView(t.hostView),this.tick(),this.components.push(t),this._injector.get(mt,[]).concat(this._bootstrapListeners).forEach(function(e){return e(t)})},t.prototype._unloadComponent=function(t){this.detachView(t.hostView),se(this.components,t)},t.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(t){return t.destroy()})},Object.defineProperty(t.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),t._tickScope=At("ApplicationRef#tick()"),t}();function se(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var ae=function(){},le=function(){var t={Important:1,DashCase:2};return t[t.Important]="Important",t[t.DashCase]="DashCase",t}(),ue=function(){},ce=function(t){this.nativeElement=t},de=function(){},he=function(){function t(){this.dirty=!0,this._results=[],this.changes=new It}return t.prototype.map=function(t){return this._results.map(t)},t.prototype.filter=function(t){return this._results.filter(t)},t.prototype.find=function(t){return this._results.find(t)},t.prototype.reduce=function(t,e){return this._results.reduce(t,e)},t.prototype.forEach=function(t){this._results.forEach(t)},t.prototype.some=function(t){return this._results.some(t)},t.prototype.toArray=function(){return this._results.slice()},t.prototype[Y()]=function(){return this._results[Y()]()},t.prototype.toString=function(){return this._results.toString()},t.prototype.reset=function(t){this._results=function t(e){return e.reduce(function(e,n){var r=Array.isArray(n)?t(n):n;return e.concat(r)},[])}(t),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},t.prototype.notifyOnChanges=function(){this.changes.emit(this)},t.prototype.setDirty=function(){this.dirty=!0},t.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},t}(),pe=function(){},fe={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},_e=function(){function t(t,e){this._compiler=t,this._config=e||fe}return t.prototype.load=function(t){return this._compiler instanceof vt?this.loadFactory(t):this.loadAndCompile(t)},t.prototype.loadAndCompile=function(t){var e=this,r=t.split("#"),i=r[0],o=r[1];return void 0===o&&(o="default"),n("Jnfr")(i).then(function(t){return t[o]}).then(function(t){return me(t,i,o)}).then(function(t){return e._compiler.compileModuleAsync(t)})},t.prototype.loadFactory=function(t){var e=t.split("#"),r=e[0],i=e[1],o="NgFactory";return void 0===i&&(i="default",o=""),n("Jnfr")(this._config.factoryPathPrefix+r+this._config.factoryPathSuffix).then(function(t){return t[i+o]}).then(function(t){return me(t,r,i)})},t}();function me(t,e,n){if(!t)throw new Error("Cannot find '"+n+"' in '"+e+"'");return t}var ge=function(){},ye=function(){},ve=function(){},be=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.__extends)(e,t),e}(function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.__extends)(e,t),e}(ve)),we=function(){function t(t,e,n){this._debugContext=n,this.nativeNode=t,e&&e instanceof Me?e.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(t.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),t}(),Me=function(t){function e(e,n,r){var i=t.call(this,e,n,r)||this;return i.properties={},i.attributes={},i.classes={},i.styles={},i.childNodes=[],i.nativeElement=e,i}return Object(r.__extends)(e,t),e.prototype.addChild=function(t){t&&(this.childNodes.push(t),t.parent=this)},e.prototype.removeChild=function(t){var e=this.childNodes.indexOf(t);-1!==e&&(t.parent=null,this.childNodes.splice(e,1))},e.prototype.insertChildrenAfter=function(t,e){var n,r=this,i=this.childNodes.indexOf(t);-1!==i&&((n=this.childNodes).splice.apply(n,[i+1,0].concat(e)),e.forEach(function(t){t.parent&&t.parent.removeChild(t),t.parent=r}))},e.prototype.insertBefore=function(t,e){var n=this.childNodes.indexOf(t);-1===n?this.addChild(e):(e.parent&&e.parent.removeChild(e),e.parent=this,this.childNodes.splice(n,0,e))},e.prototype.query=function(t){return this.queryAll(t)[0]||null},e.prototype.queryAll=function(t){var e=[];return ke(this,t,e),e},e.prototype.queryAllNodes=function(t){var e=[];return xe(this,t,e),e},Object.defineProperty(e.prototype,"children",{get:function(){return this.childNodes.filter(function(t){return t instanceof e})},enumerable:!0,configurable:!0}),e.prototype.triggerEventHandler=function(t,e){this.listeners.forEach(function(n){n.name==t&&n.callback(e)})},e}(we);function ke(t,e,n){t.childNodes.forEach(function(t){t instanceof Me&&(e(t)&&n.push(t),ke(t,e,n))})}function xe(t,e,n){t instanceof Me&&t.childNodes.forEach(function(t){e(t)&&n.push(t),t instanceof Me&&xe(t,e,n)})}var Le=new Map;function Ce(t){return Le.get(t)||null}function Se(t){Le.set(t.nativeNode,t)}function Te(t,e){var n=Ye(t),r=Ye(e);return n&&r?function(t,e,n){for(var r=t[Y()](),i=e[Y()]();;){var o=r.next(),s=i.next();if(o.done&&s.done)return!0;if(o.done||s.done)return!1;if(!n(o.value,s.value))return!1}}(t,e,Te):!(n||!t||"object"!=typeof t&&"function"!=typeof t||r||!e||"object"!=typeof e&&"function"!=typeof e)||E(t,e)}var Oe=function(){function t(t){this.wrapped=t}return t.wrap=function(e){return new t(e)},t}(),De=function(){function t(t,e,n){this.previousValue=t,this.currentValue=e,this.firstChange=n}return t.prototype.isFirstChange=function(){return this.firstChange},t}();function Ye(t){return!!Pe(t)&&(Array.isArray(t)||!(t instanceof Map)&&Y()in t)}function Pe(t){return null!==t&&("function"==typeof t||"object"==typeof t)}var Ee=function(){function t(){}return t.prototype.supports=function(t){return Ye(t)},t.prototype.create=function(t){return new je(t)},t}(),Ae=function(t,e){return e},je=function(){function t(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||Ae}return t.prototype.forEachItem=function(t){var e;for(e=this._itHead;null!==e;e=e._next)t(e)},t.prototype.forEachOperation=function(t){for(var e=this._itHead,n=this._removalsHead,r=0,i=null;e||n;){var o=!n||e&&e.currentIndex=n.length)&&(e=n.length-1),e<0)return null;var r=n[e];return r.viewContainerParent=null,pr(n,e),cn.dirtyParentQueries(r),dr(r),r}function cr(t,e,n){var r=e?Dn(e,e.def.lastRenderRootNode):t.renderElement;Fn(n,2,n.renderer.parentNode(r),n.renderer.nextSibling(r),void 0)}function dr(t){Fn(t,3,null,null,void 0)}function hr(t,e,n){e>=t.length?t.push(n):t.splice(e,0,n)}function pr(t,e){e>=t.length-1?t.pop():t.splice(e,1)}var fr=new Object;function _r(t,e,n,r,i,o){return new mr(t,e,n,r,i,o)}var mr=function(t){function e(e,n,r,i,o,s){var a=t.call(this)||this;return a.selector=e,a.componentType=n,a._inputs=i,a._outputs=o,a.ngContentSelectors=s,a.viewDefFactory=r,a}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"inputs",{get:function(){var t=[],e=this._inputs;for(var n in e)t.push({propName:n,templateName:e[n]});return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){var t=[];for(var e in this._outputs)t.push({propName:e,templateName:this._outputs[e]});return t},enumerable:!0,configurable:!0}),e.prototype.create=function(t,e,n,r){if(!r)throw new Error("ngModule should be provided");var i=Hn(this.viewDefFactory),o=i.nodes[0].element.componentProvider.nodeIndex,s=cn.createRootView(t,e||[],n,i,r,fr),a=an(s,o).instance;return n&&s.renderer.setAttribute(sn(s,0).renderElement,"ng-version",w.full),new gr(s,new wr(s),a)},e}(wt),gr=function(t){function e(e,n,r){var i=t.call(this)||this;return i._view=e,i._viewRef=n,i._component=r,i._elDef=i._view.def.nodes[0],i.hostView=n,i.changeDetectorRef=n,i.instance=r,i}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"location",{get:function(){return new ce(sn(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return new Lr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this._viewRef.destroy()},e.prototype.onDestroy=function(t){this._viewRef.onDestroy(t)},e}(function(){});function yr(t,e,n){return new vr(t,e,n)}var vr=function(){function t(t,e,n){this._view=t,this._elDef=e,this._data=n,this._embeddedViews=[]}return Object.defineProperty(t.prototype,"element",{get:function(){return new ce(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Lr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentInjector",{get:function(){for(var t=this._view,e=this._elDef.parent;!e&&t;)e=On(t),t=t.parent;return t?new Lr(t,e):new Lr(this._view,null)},enumerable:!0,configurable:!0}),t.prototype.clear=function(){for(var t=this._embeddedViews.length-1;t>=0;t--){var e=ur(this._data,t);cn.destroyView(e)}},t.prototype.get=function(t){var e=this._embeddedViews[t];if(e){var n=new wr(e);return n.attachToViewContainerRef(this),n}return null},Object.defineProperty(t.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),t.prototype.createEmbeddedView=function(t,e,n){var r=t.createEmbeddedView(e||{});return this.insert(r,n),r},t.prototype.createComponent=function(t,e,n,r,i){var o=n||this.parentInjector;i||t instanceof Ot||(i=o.get(Dt));var s=t.create(o,r,void 0,i);return this.insert(s.hostView,e),s},t.prototype.insert=function(t,e){if(t.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var n,r,i,o,s=t;return i=s._view,o=(n=this._data).viewContainer._embeddedViews,null!==(r=e)&&void 0!==r||(r=o.length),i.viewContainerParent=this._view,hr(o,r,i),function(t,e){var n=Tn(e);if(n&&n!==t&&!(16&e.state)){e.state|=16;var r=n.template._projectedViews;r||(r=n.template._projectedViews=[]),r.push(e),function(t,n){if(!(4&n.flags)){e.parent.def.nodeFlags|=4,n.flags|=4;for(var r=n.parent;r;)r.childFlags|=4,r=r.parent}}(0,e.parentNodeDef)}}(n,i),cn.dirtyParentQueries(i),cr(n,r>0?o[r-1]:null,i),s.attachToViewContainerRef(this),t},t.prototype.move=function(t,e){if(t.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var n,r,i,o,s,a=this._embeddedViews.indexOf(t._view);return i=e,s=(o=(n=this._data).viewContainer._embeddedViews)[r=a],pr(o,r),null==i&&(i=o.length),hr(o,i,s),cn.dirtyParentQueries(s),dr(s),cr(n,i>0?o[i-1]:null,s),t},t.prototype.indexOf=function(t){return this._embeddedViews.indexOf(t._view)},t.prototype.remove=function(t){var e=ur(this._data,t);e&&cn.destroyView(e)},t.prototype.detach=function(t){var e=ur(this._data,t);return e?new wr(e):null},t}();function br(t){return new wr(t)}var wr=function(){function t(t){this._view=t,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(t.prototype,"rootNodes",{get:function(){return Fn(this._view,0,void 0,void 0,t=[]),t;var t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),t.prototype.markForCheck=function(){Ln(this._view)},t.prototype.detach=function(){this._view.state&=-5},t.prototype.detectChanges=function(){var t=this._view.root.rendererFactory;t.begin&&t.begin();try{cn.checkAndUpdateView(this._view)}finally{t.end&&t.end()}},t.prototype.checkNoChanges=function(){cn.checkNoChangesView(this._view)},t.prototype.reattach=function(){this._view.state|=4},t.prototype.onDestroy=function(t){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(t)},t.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),cn.destroyView(this._view)},t.prototype.detachFromAppRef=function(){this._appRef=null,dr(this._view),cn.dirtyParentQueries(this._view)},t.prototype.attachToAppRef=function(t){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t},t.prototype.attachToViewContainerRef=function(t){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=t},t}();function Mr(t,e){return new kr(t,e)}var kr=function(t){function e(e,n){var r=t.call(this)||this;return r._parentView=e,r._def=n,r}return Object(r.__extends)(e,t),e.prototype.createEmbeddedView=function(t){return new wr(cn.createEmbeddedView(this._parentView,this._def,this._def.element.template,t))},Object.defineProperty(e.prototype,"elementRef",{get:function(){return new ce(sn(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),e}(ge);function xr(t,e){return new Lr(t,e)}var Lr=function(){function t(t,e){this.view=t,this.elDef=e}return t.prototype.get=function(t,e){return void 0===e&&(e=N.THROW_IF_NOT_FOUND),cn.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:t,tokenKey:mn(t)},e)},t}();function Cr(t,e){var n=t.def.nodes[e];if(1&n.flags){var r=sn(t,n.nodeIndex);return n.element.template?r.template:r.renderElement}if(2&n.flags)return on(t,n.nodeIndex).renderText;if(20240&n.flags)return an(t,n.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+e)}function Sr(t){return new Tr(t.renderer)}var Tr=function(){function t(t){this.delegate=t}return t.prototype.selectRootElement=function(t){return this.delegate.selectRootElement(t)},t.prototype.createElement=function(t,e){var n=Un(e),r=this.delegate.createElement(n[1],n[0]);return t&&this.delegate.appendChild(t,r),r},t.prototype.createViewRoot=function(t){return t},t.prototype.createTemplateAnchor=function(t){var e=this.delegate.createComment("");return t&&this.delegate.appendChild(t,e),e},t.prototype.createText=function(t,e){var n=this.delegate.createText(e);return t&&this.delegate.appendChild(t,n),n},t.prototype.projectNodes=function(t,e){for(var n=0;n0,e.provider.value,e.provider.deps);if(e.outputs.length)for(var r=0;r0,r=e.provider;switch(201347067&e.flags){case 512:return Jr(t,e.parent,n,r.value,r.deps);case 1024:return function(t,e,n,r,i){var o=i.length;switch(o){case 0:return r();case 1:return r(Qr(t,e,n,i[0]));case 2:return r(Qr(t,e,n,i[0]),Qr(t,e,n,i[1]));case 3:return r(Qr(t,e,n,i[0]),Qr(t,e,n,i[1]),Qr(t,e,n,i[2]));default:for(var s=Array(o),a=0;a0)u=_,mi(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&mi(u)?u.renderParent:u}}return{factory:null,nodeFlags:s,rootNodeFlags:a,nodeMatchedQueries:l,flags:t,nodes:e,updateDirectives:n||fn,updateRenderer:r||fn,handleEvent:function(t,n,r,i){return e[n].element.handleEvent(t,r,i)},bindingCount:i,outputCount:o,lastRenderRootNode:p}}function mi(t){return 0!=(1&t.flags)&&null===t.element.name}function gi(t,e,n){var r=e.element&&e.element.template;if(r){if(!r.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(r.lastRenderRootNode&&16777216&r.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+e.nodeIndex+"!")}if(20224&e.flags&&0==(1&(t?t.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+e.nodeIndex+"!");if(e.query){if(67108864&e.flags&&(!t||0==(16384&t.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+e.nodeIndex+"!");if(134217728&e.flags&&t)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+e.nodeIndex+"!")}if(e.childCount){var i=t?t.nodeIndex+t.childCount:n-1;if(e.nodeIndex<=i&&e.nodeIndex+e.childCount>i)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+e.nodeIndex+"!")}}function yi(t,e,n,r){var i=wi(t.root,t.renderer,t,e,n);return Mi(i,t.component,r),ki(i),i}function vi(t,e,n){var r=wi(t,t.renderer,null,null,e);return Mi(r,n,n),ki(r),r}function bi(t,e,n,r){var i,o=e.element.componentRendererType;return i=o?t.root.rendererFactory.createRenderer(r,o):t.root.renderer,wi(t.root,i,t,e.element.componentProvider,n)}function wi(t,e,n,r,i){var o=new Array(i.nodes.length),s=i.outputCount?new Array(i.outputCount):null;return{def:i,parent:n,viewContainerParent:null,parentNodeDef:r,context:null,component:null,nodes:o,state:13,root:t,renderer:e,oldValues:new Array(i.bindingCount),disposables:s,initIndex:-1}}function Mi(t,e,n){t.component=e,t.context=n}function ki(t){var e;Yn(t)&&(e=sn(t.parent,t.parentNodeDef.parent.nodeIndex).renderElement);for(var n=t.def,r=t.nodes,i=0;i0&&er(t,e,0,n)&&(p=!0),h>1&&er(t,e,1,r)&&(p=!0),h>2&&er(t,e,2,i)&&(p=!0),h>3&&er(t,e,3,o)&&(p=!0),h>4&&er(t,e,4,s)&&(p=!0),h>5&&er(t,e,5,a)&&(p=!0),h>6&&er(t,e,6,l)&&(p=!0),h>7&&er(t,e,7,u)&&(p=!0),h>8&&er(t,e,8,c)&&(p=!0),h>9&&er(t,e,9,d)&&(p=!0),p}(t,e,n,r,i,o,s,a,l,u,c,d);case 2:return function(t,e,n,r,i,o,s,a,l,u,c,d){var h=!1,p=e.bindings,f=p.length;if(f>0&&kn(t,e,0,n)&&(h=!0),f>1&&kn(t,e,1,r)&&(h=!0),f>2&&kn(t,e,2,i)&&(h=!0),f>3&&kn(t,e,3,o)&&(h=!0),f>4&&kn(t,e,4,s)&&(h=!0),f>5&&kn(t,e,5,a)&&(h=!0),f>6&&kn(t,e,6,l)&&(h=!0),f>7&&kn(t,e,7,u)&&(h=!0),f>8&&kn(t,e,8,c)&&(h=!0),f>9&&kn(t,e,9,d)&&(h=!0),h){var _=e.text.prefix;f>0&&(_+=fi(n,p[0])),f>1&&(_+=fi(r,p[1])),f>2&&(_+=fi(i,p[2])),f>3&&(_+=fi(o,p[3])),f>4&&(_+=fi(s,p[4])),f>5&&(_+=fi(a,p[5])),f>6&&(_+=fi(l,p[6])),f>7&&(_+=fi(u,p[7])),f>8&&(_+=fi(c,p[8])),f>9&&(_+=fi(d,p[9]));var m=on(t,e.nodeIndex).renderText;t.renderer.setValue(m,_)}return h}(t,e,n,r,i,o,s,a,l,u,c,d);case 16384:return function(t,e,n,r,i,o,s,a,l,u,c,d){var h=an(t,e.nodeIndex),p=h.instance,f=!1,_=void 0,m=e.bindings.length;return m>0&&Mn(t,e,0,n)&&(f=!0,_=Kr(t,h,e,0,n,_)),m>1&&Mn(t,e,1,r)&&(f=!0,_=Kr(t,h,e,1,r,_)),m>2&&Mn(t,e,2,i)&&(f=!0,_=Kr(t,h,e,2,i,_)),m>3&&Mn(t,e,3,o)&&(f=!0,_=Kr(t,h,e,3,o,_)),m>4&&Mn(t,e,4,s)&&(f=!0,_=Kr(t,h,e,4,s,_)),m>5&&Mn(t,e,5,a)&&(f=!0,_=Kr(t,h,e,5,a,_)),m>6&&Mn(t,e,6,l)&&(f=!0,_=Kr(t,h,e,6,l,_)),m>7&&Mn(t,e,7,u)&&(f=!0,_=Kr(t,h,e,7,u,_)),m>8&&Mn(t,e,8,c)&&(f=!0,_=Kr(t,h,e,8,c,_)),m>9&&Mn(t,e,9,d)&&(f=!0,_=Kr(t,h,e,9,d,_)),_&&p.ngOnChanges(_),65536&e.flags&&rn(t,256,e.nodeIndex)&&p.ngOnInit(),262144&e.flags&&p.ngDoCheck(),f}(t,e,n,r,i,o,s,a,l,u,c,d);case 32:case 64:case 128:return function(t,e,n,r,i,o,s,a,l,u,c,d){var h=e.bindings,p=!1,f=h.length;if(f>0&&kn(t,e,0,n)&&(p=!0),f>1&&kn(t,e,1,r)&&(p=!0),f>2&&kn(t,e,2,i)&&(p=!0),f>3&&kn(t,e,3,o)&&(p=!0),f>4&&kn(t,e,4,s)&&(p=!0),f>5&&kn(t,e,5,a)&&(p=!0),f>6&&kn(t,e,6,l)&&(p=!0),f>7&&kn(t,e,7,u)&&(p=!0),f>8&&kn(t,e,8,c)&&(p=!0),f>9&&kn(t,e,9,d)&&(p=!0),p){var _=ln(t,e.nodeIndex),m=void 0;switch(201347067&e.flags){case 32:m=new Array(h.length),f>0&&(m[0]=n),f>1&&(m[1]=r),f>2&&(m[2]=i),f>3&&(m[3]=o),f>4&&(m[4]=s),f>5&&(m[5]=a),f>6&&(m[6]=l),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=n),f>1&&(m[h[1].name]=r),f>2&&(m[h[2].name]=i),f>3&&(m[h[3].name]=o),f>4&&(m[h[4].name]=s),f>5&&(m[h[5].name]=a),f>6&&(m[h[6].name]=l),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=n;switch(f){case 1:m=g.transform(n);break;case 2:m=g.transform(r);break;case 3:m=g.transform(r,i);break;case 4:m=g.transform(r,i,o);break;case 5:m=g.transform(r,i,o,s);break;case 6:m=g.transform(r,i,o,s,a);break;case 7:m=g.transform(r,i,o,s,a,l);break;case 8:m=g.transform(r,i,o,s,a,l,u);break;case 9:m=g.transform(r,i,o,s,a,l,u,c);break;case 10:m=g.transform(r,i,o,s,a,l,u,c,d)}}_.value=m}return p}(t,e,n,r,i,o,s,a,l,u,c,d);default:throw"unreachable"}}(t,e,r,i,o,s,a,l,u,c,d,h):function(t,e,n){switch(201347067&e.flags){case 1:return function(t,e,n){for(var r=!1,i=0;i0&&xn(t,e,0,n),h>1&&xn(t,e,1,r),h>2&&xn(t,e,2,i),h>3&&xn(t,e,3,o),h>4&&xn(t,e,4,s),h>5&&xn(t,e,5,a),h>6&&xn(t,e,6,l),h>7&&xn(t,e,7,u),h>8&&xn(t,e,8,c),h>9&&xn(t,e,9,d)}(t,e,r,i,o,s,a,l,u,c,d,h):function(t,e,n){for(var r=0;r=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},f=function(){},_=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return h(e,t),e.prototype.getTranslation=function(t){return Object(i.a)({})},e}(f);_=p([Object(r.q)()],_);var m=function(t){return t&&"function"==typeof t.schedule},g="undefined"!=typeof window?window:"undefined"!=typeof t?t:"undefined"!=typeof self?self:{};function y(t,e){return t(e={exports:{}},e.exports),e.exports}var v="undefined"!=typeof window&&window,b="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,w=v||"undefined"!=typeof g&&g||b,M=w;!function(){if(!w)throw new Error("RxJS could not find any global context (window, self, global)")}();var k,x={root:M},L={isFunction:function(t){return"function"==typeof t}},C={isArray:Array.isArray||function(t){return t&&"number"==typeof t.length}},S=function(t){return null!=t&&"object"==typeof t},T={errorObject:{e:{}}};function O(){try{return k.apply(this,arguments)}catch(t){return T.errorObject.e=t,T.errorObject}}var D=function(t){return k=t,O},Y=g&&g.__extends||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);function r(){this.constructor=t}t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)},P={UnsubscriptionError:function(t){function e(e){t.call(this),this.errors=e;var n=Error.call(this,e?e.length+" errors occurred during unsubscription:\n "+e.map(function(t,e){return e+1+") "+t.toString()}).join("\n "):"");this.name=n.name="UnsubscriptionError",this.stack=n.stack,this.message=n.message}return Y(e,t),e}(Error)};function E(t){return t.reduce(function(t,e){return t.concat(e instanceof P.UnsubscriptionError?e.errors:e)},[])}var A={Subscription:function(){function t(t){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,t&&(this._unsubscribe=t)}var e;return t.prototype.unsubscribe=function(){var t,e=!1;if(!this.closed){var n=this._parent,r=this._parents,i=this._unsubscribe,o=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var s=-1,a=r?r.length:0;n;)n.remove(this),n=++s1?new e(t,r):1===i?new q.ScalarObservable(t[0],r):new X.EmptyObservable(r)},e.dispatch=function(t){var e=t.array,n=t.index,r=t.subscriber;n>=t.count?r.complete():(r.next(e[n]),r.closed||(t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(e.dispatch,0,{array:n,index:0,count:r,subscriber:t});for(var o=0;oct?ct:i:i}()),this.arr=t,this.idx=e,this.len=n}return t.prototype[ot.iterator]=function(){return this},t.prototype.next=function(){return this.idx=t.length?r.complete():(r.next(e[n]),t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(e.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:t});for(var o=0;o0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(Ct.OuterSubscriber),Dt=function(t){return t},Yt=function(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),function(t,e,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof e&&(n=e,e=null),r.lift(new Tt(t,e,n))}}(Dt,null,t)},Pt={concat:function(){for(var t=[],e=0;e=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},At=function(){},jt=function(){function t(){}return t.prototype.handle=function(t){return t.key},t}();jt=Et([Object(r.q)()],jt);var It=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=o<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},Rt=function(){},Ht=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return h(e,t),e.prototype.compile=function(t,e){return t},e.prototype.compileTranslations=function(t,e){return t},e}(Rt);function Ft(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t!=t&&e!=e)return!0;var n,r,i,o=typeof t;if(o==typeof e&&"object"==o){if(!Array.isArray(t)){if(Array.isArray(e))return!1;for(r in i=Object.create(null),t){if(!Ft(t[r],e[r]))return!1;i[r]=!0}for(r in e)if(!(r in i)&&"undefined"!=typeof e[r])return!1;return!0}if(!Array.isArray(e))return!1;if((n=t.length)==e.length){for(r=0;r=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},zt=function(){},Wt=function(t){function e(){var e=t.apply(this,arguments)||this;return e.templateMatcher=/{{\s?([^{}\s]*)\s?}}/g,e}return h(e,t),e.prototype.interpolate=function(t,e){return"string"==typeof t?this.interpolateString(t,e):"function"==typeof t?this.interpolateFunction(t,e):t},e.prototype.getValue=function(t,e){var n=e.split(".");e="";do{e+=n.shift(),!Nt(t)||!Nt(t[e])||"object"!=typeof t[e]&&n.length?n.length?e+=".":t=void 0:(t=t[e],e="")}while(n.length);return t},e.prototype.interpolateFunction=function(t,e){return t(e)},e.prototype.interpolateString=function(t,e){var n=this;return e?t.replace(this.templateMatcher,function(t,r){var i=n.getValue(e,r);return Nt(i)?i:t}):t},e}(zt);Wt=Bt([Object(r.q)()],Wt);var Ut=function(){return function(){this.currentLang=this.defaultLang,this.translations={},this.langs=[],this.onTranslationChange=new r.o,this.onLangChange=new r.o,this.onDefaultLangChange=new r.o}}(),Gt=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=o<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},Jt=n("TToO").__metadata,qt=n("TToO").__param,Qt=new r.r("USE_STORE"),Xt=new r.r("USE_DEFAULT_LANG"),Kt=function(){function t(t,e,n,i,o,s,a){void 0===s&&(s=!0),void 0===a&&(a=!1),this.store=t,this.currentLoader=e,this.compiler=n,this.parser=i,this.missingTranslationHandler=o,this.useDefaultLang=s,this.isolate=a,this.pending=!1,this._onTranslationChange=new r.o,this._onLangChange=new r.o,this._onDefaultLangChange=new r.o,this._langs=[],this._translations={},this._translationRequests={}}return Object.defineProperty(t.prototype,"onTranslationChange",{get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onLangChange",{get:function(){return this.isolate?this._onLangChange:this.store.onLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onDefaultLangChange",{get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"defaultLang",{get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(t){this.isolate?this._defaultLang=t:this.store.defaultLang=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentLang",{get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(t){this.isolate?this._currentLang=t:this.store.currentLang=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"langs",{get:function(){return this.isolate?this._langs:this.store.langs},set:function(t){this.isolate?this._langs=t:this.store.langs=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"translations",{get:function(){return this.isolate?this._translations:this.store.translations},set:function(t){this.isolate?this._translations=t:this.store.translations=t},enumerable:!0,configurable:!0}),t.prototype.setDefaultLang=function(t){var e=this;if(t!==this.defaultLang){var n=this.retrieveTranslations(t);"undefined"!=typeof n?(this.defaultLang||(this.defaultLang=t),n.pipe(Object(d.a)(1)).subscribe(function(n){e.changeDefaultLang(t)})):this.changeDefaultLang(t)}},t.prototype.getDefaultLang=function(){return this.defaultLang},t.prototype.use=function(t){var e=this;if(t===this.currentLang)return Object(i.a)(this.translations[t]);var n=this.retrieveTranslations(t);return"undefined"!=typeof n?(this.currentLang||(this.currentLang=t),n.pipe(Object(d.a)(1)).subscribe(function(n){e.changeLang(t)}),n):(this.changeLang(t),Object(i.a)(this.translations[t]))},t.prototype.retrieveTranslations=function(t){var e;return"undefined"==typeof this.translations[t]&&(this._translationRequests[t]=this._translationRequests[t]||this.getTranslation(t),e=this._translationRequests[t]),e},t.prototype.getTranslation=function(t){var e=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(t).pipe(Object(s.a)()),this.loadingTranslations.pipe(Object(d.a)(1)).subscribe(function(n){e.translations[t]=e.compiler.compileTranslations(n,t),e.updateLangs(),e.pending=!1},function(t){e.pending=!1}),this.loadingTranslations},t.prototype.setTranslation=function(t,e,n){void 0===n&&(n=!1),e=this.compiler.compileTranslations(e,t),this.translations[t]=n&&this.translations[t]?function t(e,n){var r=Object.assign({},e);return Vt(e)&&Vt(n)&&Object.keys(n).forEach(function(i){var o,s;Vt(n[i])?i in e?r[i]=t(e[i],n[i]):Object.assign(r,((o={})[i]=n[i],o)):Object.assign(r,((s={})[i]=n[i],s))}),r}(this.translations[t],e):e,this.updateLangs(),this.onTranslationChange.emit({lang:t,translations:this.translations[t]})},t.prototype.getLangs=function(){return this.langs},t.prototype.addLangs=function(t){var e=this;t.forEach(function(t){-1===e.langs.indexOf(t)&&e.langs.push(t)})},t.prototype.updateLangs=function(){this.addLangs(Object.keys(this.translations))},t.prototype.getParsedResult=function(t,e,n){var r;if(e instanceof Array){for(var o={},s=!1,u=0,d=e;u=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},$t=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},te=function(){function t(t,e,n){var r=this;this.translateService=t,this.element=e,this._ref=n,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe(function(t){t.lang===r.translateService.currentLang&&r.checkNodes(!0,t.translations)})),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe(function(t){r.checkNodes(!0,t.translations)})),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe(function(t){r.checkNodes(!0)}))}return Object.defineProperty(t.prototype,"translate",{set:function(t){t&&(this.key=t,this.checkNodes())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"translateParams",{set:function(t){Ft(this.currentParams,t)||(this.currentParams=t,this.checkNodes(!0))},enumerable:!0,configurable:!0}),t.prototype.ngAfterViewChecked=function(){this.checkNodes()},t.prototype.checkNodes=function(t,e){void 0===t&&(t=!1);var n=this.element.nativeElement.childNodes;n.length||(this.setContent(this.element.nativeElement,this.key),n=this.element.nativeElement.childNodes);for(var r=0;r=0;a--)(i=t[a])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},ne=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},re=function(){function t(t,e){this.translate=t,this._ref=e,this.value=""}return t.prototype.updateValue=function(t,e,n){var r=this,i=function(e){r.value=void 0!==e?e:t,r.lastKey=t,r._ref.markForCheck()};if(n){var o=this.translate.getParsedResult(n,t,e);"function"==typeof o.subscribe?o.subscribe(i):i(o)}this.translate.get(t,e).subscribe(i)},t.prototype.transform=function(t){for(var e,n=this,r=[],i=1;i20?e=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),t+e},week:{dow:1,doy:4}})}(n("PJh5"))},ZUyn:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},ZoSI:function(t,e,n){!function(t){"use strict";t.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},aM0x:function(t,e,n){!function(t){"use strict";var e={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};t.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(t){return t.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u09b0\u09be\u09a4"===e&&t>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===e&&t<5||"\u09ac\u09bf\u0995\u09be\u09b2"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u09b0\u09be\u09a4":t<10?"\u09b8\u0995\u09be\u09b2":t<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":t<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n("PJh5"))},aqvp:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},bXQP:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(n("PJh5"))},c1x4:function(t,e,n){!function(t){"use strict";var e={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"\u0434\u0430\u043d",dd:e.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:e.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},cQXm:function(t,e,n){"use strict";e.a=function(t){return t&&"function"!=typeof t.subscribe&&"function"==typeof t.then}},"ce/b":function(t,e,n){"use strict";e.a=function(){for(var t=[],e=0;e=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},etqZ:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e=t.Symbol;if("function"==typeof e)return e.iterator||(e.iterator=e("iterator polyfill")),e.iterator;var n=t.Set;if(n&&"function"==typeof(new n)["@@iterator"])return"@@iterator";var r=t.Map;if(r)for(var i=Object.getOwnPropertyNames(r.prototype),o=0;o=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},f9aG:function(t,e,n){"use strict";function r(){}function i(t){return t?1===t.length?t[0]:function(e){return t.reduce(function(t,e){return e(t)},e)}:r}e.a=function(){for(var t=[],e=0;e=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},gEQe:function(t,e,n){!function(t){"use strict";var e={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};t.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(t){return t.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===e?t<4?t:t+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===e?t:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===e?t>=10?t:t+12:"\u0cb8\u0c82\u0c9c\u0cc6"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":t<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":t<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":t<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(t){return t+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n("PJh5"))},gEU3:function(t,e,n){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},gUgh:function(t,e,n){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hPuz:function(t,e,n){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hng5:function(t,e,n){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n("PJh5"))},iNtv:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[t+" m\xeduts",t+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[t+" \xfeoras",t+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return r?i[n][0]:e?i[n][0]:i[n][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,n){return t>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"j+vx":function(t,e,n){!function(t){"use strict";var e={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};t.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},j8cJ:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n("PJh5"))},jxEH:function(t,e,n){!function(t){"use strict";var e={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(t,e,n){return n?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function r(t,r,i){return t+" "+n(e[i],t,r)}function i(t,r,i){return n(e[i],t,r)}t.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(t,e){return e?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:r,m:i,mm:r,h:i,hh:r,d:i,dd:r,M:i,MM:r,y:i,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"k+5o":function(t,e,n){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};t.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(t,n){switch(n){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'\u0131nc\u0131";var r=t%10;return t+(e[r]||e[t%100-r]||e[t>=100?100:null])}},week:{dow:1,doy:7}})}(n("PJh5"))},krPU:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n("PJh5"))},lOED:function(t,e,n){!function(t){"use strict";t.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},m7yE:function(t,e,n){!function(t){"use strict";var e="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(t,n,r,i){var o=function(t){var n=Math.floor(t%1e3/100),r=Math.floor(t%100/10),i=t%10,o="";return n>0&&(o+=e[n]+"vatlh"),r>0&&(o+=(""!==o?" ":"")+e[r]+"maH"),i>0&&(o+=(""!==o?" ":"")+e[i]),""===o?"pagh":o}(t);switch(r){case"ss":return o+" lup";case"mm":return o+" tup";case"hh":return o+" rep";case"dd":return o+" jaj";case"MM":return o+" jar";case"yy":return o+" DIS"}}t.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"},past:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu\u2019":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},nE8X:function(t,e,n){!function(t){"use strict";t.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(t){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===t},meridiem:function(t,e,n){return t<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(t){return"\u0e97\u0eb5\u0ec8"+t}})}(n("PJh5"))},nLOz:function(t,e,n){!function(t){"use strict";t.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n("PJh5"))},nS2h:function(t,e,n){!function(t){"use strict";var e="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",e[7],e[8],e[9]];function r(t,r,i,o){var s="";switch(i){case"s":return o?"muutaman sekunnin":"muutama sekunti";case"ss":return o?"sekunnin":"sekuntia";case"m":return o?"minuutin":"minuutti";case"mm":s=o?"minuutin":"minuuttia";break;case"h":return o?"tunnin":"tunti";case"hh":s=o?"tunnin":"tuntia";break;case"d":return o?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":s=o?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return o?"kuukauden":"kuukausi";case"MM":s=o?"kuukauden":"kuukautta";break;case"y":return o?"vuoden":"vuosi";case"yy":s=o?"vuoden":"vuotta"}return function(t,r){return t<10?r?n[t]:e[t]:t}(t,o)+" "+s}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},ntHu:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?e?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:e?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}function n(t){return function(){return t+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}t.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(t,e){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return t?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(e)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:e,y:"\u0440\u0456\u043a",yy:e},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0456":t<12?"\u0440\u0430\u043d\u043a\u0443":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-\u0439";case"D":return t+"-\u0433\u043e";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},oCzW:function(t,e,n){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},oo1B:function(t,e,n){!function(t){"use strict";t.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===e&&t>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===e||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":t<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":t<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":t<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n("PJh5"))},ooba:function(t,e,n){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},"pU/0":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(){var e=t.call(this,"argument out of range");this.name=e.name="ArgumentOutOfRangeError",this.stack=e.stack,this.message=e.message}return Object(r.__extends)(e,t),e}(Error)},pfs9:function(t,e,n){!function(t){"use strict";var e={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};t.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(t){return t.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0a30\u0a3e\u0a24"===e?t<4?t:t+12:"\u0a38\u0a35\u0a47\u0a30"===e?t:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===e?t>=10?t:t+12:"\u0a38\u0a3c\u0a3e\u0a2e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0a30\u0a3e\u0a24":t<10?"\u0a38\u0a35\u0a47\u0a30":t<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":t<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n("PJh5"))},rIuo:function(t,e,n){!function(t){"use strict";var e=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(t){return"\u0789\u078a"===t},meridiem:function(t,e,n){return t<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n("PJh5"))},rtsW:function(t,e,n){!function(t){"use strict";var e={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};t.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(t){return t.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0ab0\u0abe\u0aa4"===e?t<4?t:t+12:"\u0ab8\u0ab5\u0abe\u0ab0"===e?t:"\u0aac\u0aaa\u0acb\u0ab0"===e?t>=10?t:t+12:"\u0ab8\u0abe\u0a82\u0a9c"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0ab0\u0abe\u0aa4":t<10?"\u0ab8\u0ab5\u0abe\u0ab0":t<17?"\u0aac\u0aaa\u0acb\u0ab0":t<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n("PJh5"))},rxKx:function(t,e,n){var r;!function(i,o,s,a){"use strict";var l,u=["","webkit","Moz","MS","ms","o"],c=o.createElement("div"),d="function",h=Math.round,p=Math.abs,f=Date.now;function _(t,e,n){return setTimeout(M(t,n),e)}function m(t,e,n){return!!Array.isArray(t)&&(g(t,n[e],n),!0)}function g(t,e,n){var r;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==a)for(r=0;r\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=i.console&&(i.console.warn||i.console.log);return o&&o.call(i.console,r,n),t.apply(this,arguments)}}l="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n-1}function O(t){return t.trim().split(/\s+/g)}function D(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var r=0;rn[e]}):r.sort()),r}function E(t,e){for(var n,r,i=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=et(e):1===i&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,l=s?s.center:o.center,u=e.center=nt(r);e.timeStamp=f(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=st(l,u),e.distance=ot(l,u),function(t,e){var n=e.center,r=t.offsetDelta||{},i=t.prevDelta||{},o=t.prevInput||{};e.eventType!==N&&o.eventType!==V||(i=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},r=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=i.x+(n.x-r.x),e.deltaY=i.y+(n.y-r.y)}(n,e),e.offsetDirection=it(e.deltaX,e.deltaY);var c,d,h=rt(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=h.x,e.overallVelocityY=h.y,e.overallVelocity=p(h.x)>p(h.y)?h.x:h.y,e.scale=s?(c=s.pointers,ot((d=r)[0],d[1],Z)/ot(c[0],c[1],Z)):1,e.rotation=s?function(t,e){return st(r[1],r[0],Z)+st(t[1],t[0],Z)}(s.pointers):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,function(t,e){var n,r,i,o,s=t.lastInterval||e,l=e.timeStamp-s.timeStamp;if(e.eventType!=B&&(l>F||s.velocity===a)){var u=e.deltaX-s.deltaX,c=e.deltaY-s.deltaY,d=rt(l,u,c);r=d.x,i=d.y,n=p(d.x)>p(d.y)?d.x:d.y,o=it(u,c),t.lastInterval=e}else n=s.velocity,r=s.velocityX,i=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=r,e.velocityY=i,e.direction=o}(n,e);var _=t.element;S(e.srcEvent.target,_)&&(_=e.srcEvent.target),e.target=_}(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function et(t){for(var e=[],n=0;n=p(e)?t<0?W:U:e<0?G:J}function ot(t,e,n){n||(n=K);var r=e[n[0]]-t[n[0]],i=e[n[1]]-t[n[1]];return Math.sqrt(r*r+i*i)}function st(t,e,n){return n||(n=K),180*Math.atan2(e[n[1]]-t[n[1]],e[n[0]]-t[n[0]])/Math.PI}$.prototype={handler:function(){},init:function(){this.evEl&&L(this.element,this.evEl,this.domHandler),this.evTarget&&L(this.target,this.evTarget,this.domHandler),this.evWin&&L(j(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(j(this.element),this.evWin,this.domHandler)}};var at={mousedown:N,mousemove:2,mouseup:V},lt="mousedown",ut="mousemove mouseup";function ct(){this.evEl=lt,this.evWin=ut,this.pressed=!1,$.apply(this,arguments)}w(ct,$,{handler:function(t){var e=at[t.type];e&N&&0===t.button&&(this.pressed=!0),2&e&&1!==t.which&&(e=V),this.pressed&&(e&V&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var dt={pointerdown:N,pointermove:2,pointerup:V,pointercancel:B,pointerout:B},ht={2:"touch",3:"pen",4:"mouse",5:"kinect"},pt="pointerdown",ft="pointermove pointerup pointercancel";function _t(){this.evEl=pt,this.evWin=ft,$.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}i.MSPointerEvent&&!i.PointerEvent&&(pt="MSPointerDown",ft="MSPointerMove MSPointerUp MSPointerCancel"),w(_t,$,{handler:function(t){var e=this.store,n=!1,r=t.type.toLowerCase().replace("ms",""),i=dt[r],o=ht[t.pointerType]||t.pointerType,s="touch"==o,a=D(e,t.pointerId,"pointerId");i&N&&(0===t.button||s)?a<0&&(e.push(t),a=e.length-1):i&(V|B)&&(n=!0),a<0||(e[a]=t,this.callback(this.manager,i,{pointers:e,changedPointers:[t],pointerType:o,srcEvent:t}),n&&e.splice(a,1))}});var mt={touchstart:N,touchmove:2,touchend:V,touchcancel:B},gt="touchstart",yt="touchstart touchmove touchend touchcancel";function vt(){this.evTarget=gt,this.evWin=yt,this.started=!1,$.apply(this,arguments)}w(vt,$,{handler:function(t){var e=mt[t.type];if(e===N&&(this.started=!0),this.started){var n=(function(t,e){var n=Y(t.touches),r=Y(t.changedTouches);return e&(V|B)&&(n=P(n.concat(r),"identifier",!0)),[n,r]}).call(this,t,e);e&(V|B)&&n[0].length-n[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:t})}}});var bt={touchstart:N,touchmove:2,touchend:V,touchcancel:B},wt="touchstart touchmove touchend touchcancel";function Mt(){this.evTarget=wt,this.targetIds={},$.apply(this,arguments)}w(Mt,$,{handler:function(t){var e=bt[t.type],n=(function(t,e){var n=Y(t.touches),r=this.targetIds;if(e&(2|N)&&1===n.length)return r[n[0].identifier]=!0,[n,n];var i,o,s=Y(t.changedTouches),a=[],l=this.target;if(o=n.filter(function(t){return S(t.target,l)}),e===N)for(i=0;i-1&&r.splice(t,1)},kt)}}w(xt,$,{handler:function(t,e,n){var r="mouse"==n.pointerType;if(!(r&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if("touch"==n.pointerType)(function(t,e){t&N?(this.primaryTouch=e.changedPointers[0].identifier,Lt.call(this,e)):t&(V|B)&&Lt.call(this,e)}).call(this,e,n);else if(r&&(function(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,r=0;r-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){var e=this,n=this.state;function r(n){e.manager.emit(n,t)}n=Et&&r(e.options.event+Rt(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&i&e.direction},attrTest:function(t){return Nt.prototype.attrTest.call(this,t)&&(this.state&Yt||!(this.state&Yt)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Ht(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),w(Bt,Nt,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&Yt)},emit:function(t){1!==t.scale&&(t.additionalEvent=this.options.event+(t.scale<1?"in":"out")),this._super.emit.call(this,t)}}),w(zt,It,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distancee.time;if(this._input=t,!r||!n||t.eventType&(V|B)&&!i)this.reset();else if(t.eventType&N)this.reset(),this._timer=_(function(){this.state=At,this.tryEmit()},e.time,this);else if(t.eventType&V)return At;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===At&&(t&&t.eventType&V?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=f(),this.manager.emit(this.options.event,this._input)))}}),w(Wt,Nt,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&Yt)}}),w(Ut,Nt,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:q|Q,pointers:1},getTouchAction:function(){return Vt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(q|Q)?e=t.overallVelocity:n&q?e=t.overallVelocityX:n&Q&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&p(e)>this.options.velocity&&t.eventType&V},emit:function(t){var e=Ht(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),w(Gt,It,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return["manipulation"]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distance1&&t<5&&1!=~~(t/10)}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sekund"):o+"sekundami";case"m":return e?"minuta":i?"minutu":"minutou";case"mm":return e||i?o+(r(t)?"minuty":"minut"):o+"minutami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hodin"):o+"hodinami";case"d":return e||i?"den":"dnem";case"dd":return e||i?o+(r(t)?"dny":"dn\xed"):o+"dny";case"M":return e||i?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return e||i?o+(r(t)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):o+"m\u011bs\xedci";case"y":return e||i?"rok":"rokem";case"yy":return e||i?o+(r(t)?"roky":"let"):o+"lety"}}t.defineLocale("cs",{months:e,monthsShort:n,monthsParse:function(t,e){var n,r=[];for(n=0;n<12;n++)r[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return r}(e,n),shortMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(n),longMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(e),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},svD2:function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},t7NR:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r={closed:!0,next:function(t){},error:function(t){throw t},complete:function(){}}},tLDX:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("AMGY").a.Symbol,i="function"==typeof r&&"function"==typeof r.for?r.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(){t.apply(this,arguments)}return Object(r.__extends)(e,t),e.prototype.notifyNext=function(t,e,n,r,i){this.destination.next(e)},e.prototype.notifyError=function(t,e){this.destination.error(t)},e.prototype.notifyComplete=function(t){this.destination.complete()},e}(n("OVmG").a)},tkWw:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(n("PJh5"))},tzHd:function(t,e,n){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},uSe8:function(t,e,n){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("PJh5"))},ulq9:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];t.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0447\u0430\u0441",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0438":t<12?"\u0443\u0442\u0440\u0430":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-\u0439";case"D":return t+"-\u0433\u043e";case"w":case"W":return t+"-\u044f";default:return t}},week:{dow:1,doy:4}})}(n("PJh5"))},upln:function(t,e,n){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function n(t,n,r,i){var o=t+" ";switch(r){case"s":return n||i?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return e(t)?o+(n||i?"sek\xfandur":"sek\xfandum"):o+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return e(t)?o+(n||i?"m\xedn\xfatur":"m\xedn\xfatum"):n?o+"m\xedn\xfata":o+"m\xedn\xfatu";case"hh":return e(t)?o+(n||i?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return n?"dagur":i?"dag":"degi";case"dd":return e(t)?n?o+"dagar":o+(i?"daga":"d\xf6gum"):n?o+"dagur":o+(i?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":i?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return e(t)?n?o+"m\xe1nu\xf0ir":o+(i?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?o+"m\xe1nu\xf0ur":o+(i?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||i?"\xe1r":"\xe1ri";case"yy":return e(t)?o+(n||i?"\xe1r":"\xe1rum"):o+(n||i?"\xe1r":"\xe1ri")}}t.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},uslO:function(t,e,n){var r={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function i(t){return n(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="uslO"},w2Hs:function(t,e,n){!function(t){"use strict";var e={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};t.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(t){return t.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===e&&t>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===e&&t<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":t<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":t<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":t<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n("PJh5"))},wIgY:function(t,e,n){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(t,e){var n=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"\xe8";return"w"!==e&&"W"!==e||(n="a"),t+n},week:{dow:1,doy:4}})}(n("PJh5"))},wPpW:function(t,e,n){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(t){return function(e,i,o,s){var a=n(e),l=r[t][n(e)];return 2===a&&(l=l[i?0:1]),l.replace(/%d/i,e)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},wT5f:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=" ";return(t%100>=20||t>=100&&t%100==0)&&(r=" de "),t+r+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:e,m:"un minut",mm:e,h:"o or\u0103",hh:e,d:"o zi",dd:e,M:"o lun\u0103",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(n("PJh5"))},x35b:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("WT6e"),i={nodeUrl:"/api/v1/",production:!0,tellerUrl:"https://event.skycoin.net/api/"},o=(n("rxKx"),n("TToO")),s=n("YaPU"),a=function(){},l=new r.r("Location Initialized"),u=function(){},c=new r.r("appBaseHref"),d=function(){function t(e){var n=this;this._subject=new r.o,this._platformStrategy=e;var i=this._platformStrategy.getBaseHref();this._baseHref=t.stripTrailingSlash(h(i)),this._platformStrategy.onPopState(function(t){n._subject.emit({url:n.path(!0),pop:!0,type:t.type})})}return t.prototype.path=function(t){return void 0===t&&(t=!1),this.normalize(this._platformStrategy.path(t))},t.prototype.isCurrentPathEqualTo=function(e,n){return void 0===n&&(n=""),this.path()==this.normalize(e+t.normalizeQueryParams(n))},t.prototype.normalize=function(e){return t.stripTrailingSlash(function(t,e){return t&&e.startsWith(t)?e.substring(t.length):e}(this._baseHref,h(e)))},t.prototype.prepareExternalUrl=function(t){return t&&"/"!==t[0]&&(t="/"+t),this._platformStrategy.prepareExternalUrl(t)},t.prototype.go=function(t,e){void 0===e&&(e=""),this._platformStrategy.pushState(null,"",t,e)},t.prototype.replaceState=function(t,e){void 0===e&&(e=""),this._platformStrategy.replaceState(null,"",t,e)},t.prototype.forward=function(){this._platformStrategy.forward()},t.prototype.back=function(){this._platformStrategy.back()},t.prototype.subscribe=function(t,e,n){return this._subject.subscribe({next:t,error:e,complete:n})},t.normalizeQueryParams=function(t){return t&&"?"!==t[0]?"?"+t:t},t.joinWithSlash=function(t,e){if(0==t.length)return e;if(0==e.length)return t;var n=0;return t.endsWith("/")&&n++,e.startsWith("/")&&n++,2==n?t+e.substring(1):1==n?t+e:t+"/"+e},t.stripTrailingSlash=function(t){var e=t.match(/#|\?|$/),n=e&&e.index||t.length;return t.slice(0,n-("/"===t[n-1]?1:0))+t.slice(n)},t}();function h(t){return t.replace(/\/index.html$/,"")}var p=function(t){function e(e,n){var r=t.call(this)||this;return r._platformLocation=e,r._baseHref="",null!=n&&(r._baseHref=n),r}return Object(o.__extends)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.hash;return null==e&&(e="#"),e.length>0?e.substring(1):e},e.prototype.prepareExternalUrl=function(t){var e=d.joinWithSlash(this._baseHref,t);return e.length>0?"#"+e:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),f=function(t){function e(e,n){var r=t.call(this)||this;if(r._platformLocation=e,null==n&&(n=r._platformLocation.getBaseHrefFromDOM()),null==n)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=n,r}return Object(o.__extends)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.prepareExternalUrl=function(t){return d.joinWithSlash(this._baseHref,t)},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),n=this._platformLocation.hash;return n&&t?""+e+n:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),_=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(t){var e=Math.floor(Math.abs(t)),n=t.toString().replace(/^[^.]*\.?/,"").length;return 1===e&&0===n?1:5}],m={},g=function(){var t={Decimal:0,Percent:1,Currency:2,Scientific:3};return t[t.Decimal]="Decimal",t[t.Percent]="Percent",t[t.Currency]="Currency",t[t.Scientific]="Scientific",t}(),y=function(){var t={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return t[t.Zero]="Zero",t[t.One]="One",t[t.Two]="Two",t[t.Few]="Few",t[t.Many]="Many",t[t.Other]="Other",t}(),v=function(){var t={Format:0,Standalone:1};return t[t.Format]="Format",t[t.Standalone]="Standalone",t}(),b=function(){var t={Narrow:0,Abbreviated:1,Wide:2,Short:3};return t[t.Narrow]="Narrow",t[t.Abbreviated]="Abbreviated",t[t.Wide]="Wide",t[t.Short]="Short",t}(),w=function(){var t={Short:0,Medium:1,Long:2,Full:3};return t[t.Short]="Short",t[t.Medium]="Medium",t[t.Long]="Long",t[t.Full]="Full",t}(),M=function(){var t={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return t[t.Decimal]="Decimal",t[t.Group]="Group",t[t.List]="List",t[t.PercentSign]="PercentSign",t[t.PlusSign]="PlusSign",t[t.MinusSign]="MinusSign",t[t.Exponential]="Exponential",t[t.SuperscriptingExponent]="SuperscriptingExponent",t[t.PerMille]="PerMille",t[t.Infinity]="Infinity",t[t.NaN]="NaN",t[t.TimeSeparator]="TimeSeparator",t[t.CurrencyDecimal]="CurrencyDecimal",t[t.CurrencyGroup]="CurrencyGroup",t}();function k(t,e){return D(t)[10][e]}function x(t,e){return D(t)[11][e]}function L(t,e){return T(D(t)[12],e)}function C(t,e){var n=D(t),r=n[13][e];if("undefined"==typeof r){if(e===M.CurrencyDecimal)return n[13][M.Decimal];if(e===M.CurrencyGroup)return n[13][M.Group]}return r}function S(t){if(!t[18])throw new Error('Missing extra locale data for the locale "'+t[0]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function T(t,e){for(var n=e;n>-1;n--)if("undefined"!=typeof t[n])return t[n];throw new Error("Locale data API: locale data undefined")}function O(t){var e=t.split(":");return{hours:+e[0],minutes:+e[1]}}function D(t){var e=t.toLowerCase().replace(/_/g,"-"),n=m[e];if(n)return n;var r=e.split("-")[0];if(n=m[r])return n;if("en"===r)return _;throw new Error('Missing locale data for the locale "'+t+'".')}var Y=new r.r("UseV4Plurals"),P=function(){},E=function(t){function e(e,n){var r=t.call(this)||this;return r.locale=e,r.deprecatedPluralFn=n,r}return Object(o.__extends)(e,t),e.prototype.getPluralCategory=function(t,e){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(e||this.locale,t):function(t){return D(t)[17]}(e||this.locale)(t)){case y.Zero:return"zero";case y.One:return"one";case y.Two:return"two";case y.Few:return"few";case y.Many:return"many";default:return"other"}},e}(P);function A(t,e){e=encodeURIComponent(e);for(var n=0,r=t.split(";");n0||a>-n)&&(a+=n),t===Q.Hours&&0===a&&-12===n&&(a=12),Z(a,e,C(s,M.MinusSign),r,i)}}function tt(t,e,n,r){return void 0===n&&(n=v.Format),void 0===r&&(r=!1),function(i,o){return function(t,e,n,r,i,o){switch(n){case X.Months:return function(t,e,n){var r=D(t);return T(T([r[5],r[6]],e),n)}(e,i,r)[t.getMonth()];case X.Days:return function(t,e,n){var r=D(t);return T(T([r[3],r[4]],e),n)}(e,i,r)[t.getDay()];case X.DayPeriods:var s=t.getHours(),a=t.getMinutes();if(o){var l,u=function(t){var e=D(t);return S(e),(e[18][2]||[]).map(function(t){return"string"==typeof t?O(t):[O(t[0]),O(t[1])]})}(e),c=function(t,e,n){var r=D(t);return S(r),T(T([r[18][0],r[18][1]],e)||[],n)||[]}(e,i,r);if(u.forEach(function(t,e){if(Array.isArray(t)){var n=t[0],r=t[1],i=r.hours;s>=n.hours&&a>=n.minutes&&(s0?Math.floor(i/60):Math.ceil(i/60);switch(t){case q.Short:return(i>=0?"+":"")+Z(s,2,o)+Z(Math.abs(i%60),2,o);case q.ShortGMT:return"GMT"+(i>=0?"+":"")+Z(s,1,o);case q.Long:return"GMT"+(i>=0?"+":"")+Z(s,2,o)+":"+Z(Math.abs(i%60),2,o);case q.Extended:return 0===r?"Z":(i>=0?"+":"")+Z(s,2,o)+":"+Z(Math.abs(i%60),2,o);default:throw new Error('Unknown zone width "'+t+'"')}}}var nt=0,rt=4;function it(t,e){return void 0===e&&(e=!1),function(n,r){var i,o,s,a;if(e){var l=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,u=n.getDate();i=1+Math.floor((u+l)/7)}else{var c=(s=n.getFullYear(),a=new Date(s,nt,1).getDay(),new Date(s,0,1+(a<=rt?rt:rt+7)-a)),d=(o=n,new Date(o.getFullYear(),o.getMonth(),o.getDate()+(rt-o.getDay()))).getTime()-c.getTime();i=1+Math.round(d/6048e5)}return Z(i,t,C(r,M.MinusSign))}}var ot={};function st(t,e){t=t.replace(/:/g,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(n)?e:n}function at(t,e){return Error("InvalidPipeArgument: '"+e+"' for pipe '"+Object(r._30)(t)+"'")}var lt=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,ut=function(){function t(t){this.locale=t}return t.prototype.transform=function(e,n,r,i){if(void 0===n&&(n="mediumDate"),null==e||""===e||e!=e)return null;var o;if("string"==typeof e&&(e=e.trim()),ct(e))o=e;else if(isNaN(e-parseFloat(e)))if("string"==typeof e&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(e)){var s=e.split("-").map(function(t){return+t});o=new Date(s[0],s[1]-1,s[2])}else o=new Date(e);else o=new Date(parseFloat(e));if(!ct(o)){var a=void 0;if("string"!=typeof e||!(a=e.match(lt)))throw at(t,e);o=function(t){var e=new Date(0),n=0,r=0,i=t[8]?e.setUTCHours:e.setHours;t[9]&&(n=+(t[9]+t[10]),r=+(t[9]+t[11])),(t[8]?e.setUTCFullYear:e.setFullYear).call(e,+t[1],+t[2]-1,+t[3]);var o=+(t[4]||"0")-n,s=+(t[5]||"0")-r,a=+(t[6]||"0"),l=Math.round(1e3*parseFloat("0."+(t[7]||0)));return i.call(e,o,s,a,l),e}(a)}return function(t,e,n,r){e=function t(e,n){var r=function(t){return D(t)[0]}(e);if(G[r]=G[r]||{},G[r][n])return G[r][n];var i="";switch(n){case"shortDate":i=k(e,w.Short);break;case"mediumDate":i=k(e,w.Medium);break;case"longDate":i=k(e,w.Long);break;case"fullDate":i=k(e,w.Full);break;case"shortTime":i=x(e,w.Short);break;case"mediumTime":i=x(e,w.Medium);break;case"longTime":i=x(e,w.Long);break;case"fullTime":i=x(e,w.Full);break;case"short":var o=t(e,"shortTime"),s=t(e,"shortDate");i=K(L(e,w.Short),[o,s]);break;case"medium":var a=t(e,"mediumTime"),l=t(e,"mediumDate");i=K(L(e,w.Medium),[a,l]);break;case"long":var u=t(e,"longTime"),c=t(e,"longDate");i=K(L(e,w.Long),[u,c]);break;case"full":var d=t(e,"fullTime"),h=t(e,"fullDate");i=K(L(e,w.Full),[d,h])}return i&&(G[r][n]=i),i}(n,e)||e;for(var i,o=[];e;){if(!(i=J.exec(e))){o.push(e);break}var s=(o=o.concat(i.slice(1))).pop();if(!s)break;e=s}var a=t.getTimezoneOffset();r&&(a=st(r,a),t=function(t,e,n){var r=t.getTimezoneOffset();return function(t,e){return(t=new Date(t.getTime())).setMinutes(t.getMinutes()+e),t}(t,-1*(st(e,r)-r))}(t,r));var l="";return o.forEach(function(e){var r=function(t){if(ot[t])return ot[t];var e;switch(t){case"G":case"GG":case"GGG":e=tt(X.Eras,b.Abbreviated);break;case"GGGG":e=tt(X.Eras,b.Wide);break;case"GGGGG":e=tt(X.Eras,b.Narrow);break;case"y":e=$(Q.FullYear,1,0,!1,!0);break;case"yy":e=$(Q.FullYear,2,0,!0,!0);break;case"yyy":e=$(Q.FullYear,3,0,!1,!0);break;case"yyyy":e=$(Q.FullYear,4,0,!1,!0);break;case"M":case"L":e=$(Q.Month,1,1);break;case"MM":case"LL":e=$(Q.Month,2,1);break;case"MMM":e=tt(X.Months,b.Abbreviated);break;case"MMMM":e=tt(X.Months,b.Wide);break;case"MMMMM":e=tt(X.Months,b.Narrow);break;case"LLL":e=tt(X.Months,b.Abbreviated,v.Standalone);break;case"LLLL":e=tt(X.Months,b.Wide,v.Standalone);break;case"LLLLL":e=tt(X.Months,b.Narrow,v.Standalone);break;case"w":e=it(1);break;case"ww":e=it(2);break;case"W":e=it(1,!0);break;case"d":e=$(Q.Date,1);break;case"dd":e=$(Q.Date,2);break;case"E":case"EE":case"EEE":e=tt(X.Days,b.Abbreviated);break;case"EEEE":e=tt(X.Days,b.Wide);break;case"EEEEE":e=tt(X.Days,b.Narrow);break;case"EEEEEE":e=tt(X.Days,b.Short);break;case"a":case"aa":case"aaa":e=tt(X.DayPeriods,b.Abbreviated);break;case"aaaa":e=tt(X.DayPeriods,b.Wide);break;case"aaaaa":e=tt(X.DayPeriods,b.Narrow);break;case"b":case"bb":case"bbb":e=tt(X.DayPeriods,b.Abbreviated,v.Standalone,!0);break;case"bbbb":e=tt(X.DayPeriods,b.Wide,v.Standalone,!0);break;case"bbbbb":e=tt(X.DayPeriods,b.Narrow,v.Standalone,!0);break;case"B":case"BB":case"BBB":e=tt(X.DayPeriods,b.Abbreviated,v.Format,!0);break;case"BBBB":e=tt(X.DayPeriods,b.Wide,v.Format,!0);break;case"BBBBB":e=tt(X.DayPeriods,b.Narrow,v.Format,!0);break;case"h":e=$(Q.Hours,1,-12);break;case"hh":e=$(Q.Hours,2,-12);break;case"H":e=$(Q.Hours,1);break;case"HH":e=$(Q.Hours,2);break;case"m":e=$(Q.Minutes,1);break;case"mm":e=$(Q.Minutes,2);break;case"s":e=$(Q.Seconds,1);break;case"ss":e=$(Q.Seconds,2);break;case"S":e=$(Q.Milliseconds,1);break;case"SS":e=$(Q.Milliseconds,2);break;case"SSS":e=$(Q.Milliseconds,3);break;case"Z":case"ZZ":case"ZZZ":e=et(q.Short);break;case"ZZZZZ":e=et(q.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":e=et(q.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":e=et(q.Long);break;default:return null}return ot[t]=e,e}(e);l+=r?r(t,n,a):"''"===e?"'":e.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),l}(o,n,i||this.locale,r)},t}();function ct(t){return t instanceof Date&&!isNaN(t.valueOf())}var dt=/^(\d+)?\.((\d+)(-(\d+))?)?$/,ht=22,pt=".",ft="0",_t=";",mt=",",gt="#",yt="\xa4",vt="%";function bt(t,e,n,r,i){void 0===i&&(i=null);var o,s={str:null},a=function(t,e){return D(t)[14][e]}(e,n);if("string"!=typeof t||isNaN(+t-parseFloat(t))){if("number"!=typeof t)return s.error=t+" is not a number",s;o=t}else o=+t;var l=function(t,e){void 0===e&&(e="-");var n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},r=t.split(_t),i=r[0],o=r[1],s=-1!==i.indexOf(pt)?i.split(pt):[i.substring(0,i.lastIndexOf(ft)+1),i.substring(i.lastIndexOf(ft)+1)],a=s[0],l=s[1]||"";n.posPre=a.substr(0,a.indexOf(gt));for(var u=0;u-1&&(s=s.replace(pt,"")),(r=s.search(/e/i))>0?(n<0&&(n=r),n+=+s.slice(r+1),s=s.substring(0,r)):n<0&&(n=s.length),r=0;s.charAt(r)===ft;r++);if(r===(o=s.length))e=[0],n=1;else{for(o--;s.charAt(o)===ft;)o--;for(n-=r,e=[],i=0;r<=o;r++,i++)e[i]=+s.charAt(r)}return n>ht&&(e=e.splice(0,ht-1),a=n-1,n=1),{digits:e,exponent:a,integerLen:n}}(o);n===g.Percent&&(d=function(t){if(0===t.digits[0])return t;var e=t.digits.length-t.integerLen;return t.exponent?t.exponent+=2:(0===e?t.digits.push(0,0):1===e&&t.digits.push(0),t.integerLen+=2),t}(d));var h=l.minInt,p=l.minFrac,f=l.maxFrac;if(r){var _=r.match(dt);if(null===_)return s.error=r+" is not a valid digit info",s;var m=_[1],y=_[3],v=_[5];null!=m&&(h=wt(m)),null!=y&&(p=wt(y)),null!=v?f=wt(v):null!=y&&p>f&&(f=p)}!function(t,e,n){if(e>n)throw new Error("The minimum number of digits after fraction ("+e+") is higher than the maximum ("+n+").");var r=t.digits,i=r.length-t.integerLen,o=Math.min(Math.max(e,i),n),s=o+t.integerLen,a=r[s];if(s>0){r.splice(Math.max(t.integerLen,s));for(var l=s;l=5)if(s-1<0){for(var c=0;c>s;c--)r.unshift(0),t.integerLen++;r.unshift(1),t.integerLen++}else r[s-1]++;for(;i=h?r.pop():d=!1),e>=10?1:0},0);p&&(r.unshift(p),t.integerLen++)}(d,p,f);var b=d.digits,w=d.integerLen,k=d.exponent,x=[];for(c=b.every(function(t){return!t});w0?x=b.splice(w,b.length):(x=b,b=[0]);var L=[];for(b.length>=l.lgSize&&L.unshift(b.splice(-l.lgSize,b.length).join(""));b.length>l.gSize;)L.unshift(b.splice(-l.gSize,b.length).join(""));b.length&&L.unshift(b.join("")),u=L.join(C(e,i?M.CurrencyGroup:M.Group)),x.length&&(u+=C(e,i?M.CurrencyDecimal:M.Decimal)+x.join("")),k&&(u+=C(e,M.Exponential)+"+"+k)}else u=C(e,M.Infinity);return u=o<0&&!c?l.negPre+u+l.negSuf:l.posPre+u+l.posSuf,n===g.Currency&&null!==i?(s.str=u.replace(yt,i).replace(yt,""),s):n===g.Percent?(s.str=u.replace(new RegExp(vt,"g"),C(e,M.PercentSign)),s):(s.str=u,s)}function wt(t){var e=parseInt(t);if(isNaN(e))throw new Error("Invalid integer literal when parsing "+t);return e}var Mt=function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.subscribe({next:e,error:function(t){throw t}})},t.prototype.dispose=function(t){t.unsubscribe()},t.prototype.onDestroy=function(t){t.unsubscribe()},t}(),kt=new(function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.then(e,function(t){throw t})},t.prototype.dispose=function(t){},t.prototype.onDestroy=function(t){},t}()),xt=new Mt,Lt=function(){function t(t){this._ref=t,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return t.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},t.prototype.transform=function(t){return this._obj?t!==this._obj?(this._dispose(),this.transform(t)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,r.T.wrap(this._latestValue)):(t&&this._subscribe(t),this._latestReturnedValue=this._latestValue,this._latestValue)},t.prototype._subscribe=function(t){var e=this;this._obj=t,this._strategy=this._selectStrategy(t),this._subscription=this._strategy.createSubscription(t,function(n){return e._updateLatestValue(t,n)})},t.prototype._selectStrategy=function(e){if(Object(r._15)(e))return kt;if(Object(r._14)(e))return xt;throw at(t,e)},t.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},t.prototype._updateLatestValue=function(t,e){t===this._obj&&(this._latestValue=e,this._ref.markForCheck())},t}(),Ct=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Tt(e))return null;var i=bt(e,r=r||this._locale,g.Decimal,n),o=i.str,s=i.error;if(s)throw at(t,s);return o},t}(),St=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Tt(e))return null;var i=bt(e,r=r||this._locale,g.Percent,n),o=i.str,s=i.error;if(s)throw at(t,s);return o},t}();function Tt(t){return null==t||""===t||t!=t}var Ot=function(){},Dt=new r.r("DocumentToken"),Yt=null;function Pt(){return Yt}var Et,At={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},jt={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},It={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};r._10.Node&&(Et=r._10.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))});var Rt,Ht=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.parse=function(t){throw new Error("parse not implemented")},e.makeCurrent=function(){var t;t=new e,Yt||(Yt=t)},e.prototype.hasProperty=function(t,e){return e in t},e.prototype.setProperty=function(t,e,n){t[e]=n},e.prototype.getProperty=function(t,e){return t[e]},e.prototype.invoke=function(t,e,n){var r;(r=t)[e].apply(r,n)},e.prototype.logError=function(t){window.console&&(console.error?console.error(t):console.log(t))},e.prototype.log=function(t){window.console&&window.console.log&&window.console.log(t)},e.prototype.logGroup=function(t){window.console&&window.console.group&&window.console.group(t)},e.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(e.prototype,"attrToPropMap",{get:function(){return At},enumerable:!0,configurable:!0}),e.prototype.contains=function(t,e){return Et.call(t,e)},e.prototype.querySelector=function(t,e){return t.querySelector(e)},e.prototype.querySelectorAll=function(t,e){return t.querySelectorAll(e)},e.prototype.on=function(t,e,n){t.addEventListener(e,n,!1)},e.prototype.onAndCancel=function(t,e,n){return t.addEventListener(e,n,!1),function(){t.removeEventListener(e,n,!1)}},e.prototype.dispatchEvent=function(t,e){t.dispatchEvent(e)},e.prototype.createMouseEvent=function(t){var e=this.getDefaultDocument().createEvent("MouseEvent");return e.initEvent(t,!0,!0),e},e.prototype.createEvent=function(t){var e=this.getDefaultDocument().createEvent("Event");return e.initEvent(t,!0,!0),e},e.prototype.preventDefault=function(t){t.preventDefault(),t.returnValue=!1},e.prototype.isPrevented=function(t){return t.defaultPrevented||null!=t.returnValue&&!t.returnValue},e.prototype.getInnerHTML=function(t){return t.innerHTML},e.prototype.getTemplateContent=function(t){return"content"in t&&this.isTemplateElement(t)?t.content:null},e.prototype.getOuterHTML=function(t){return t.outerHTML},e.prototype.nodeName=function(t){return t.nodeName},e.prototype.nodeValue=function(t){return t.nodeValue},e.prototype.type=function(t){return t.type},e.prototype.content=function(t){return this.hasProperty(t,"content")?t.content:t},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.nextSibling=function(t){return t.nextSibling},e.prototype.parentElement=function(t){return t.parentNode},e.prototype.childNodes=function(t){return t.childNodes},e.prototype.childNodesAsList=function(t){for(var e=t.childNodes,n=new Array(e.length),r=0;r0},e.prototype.tagName=function(t){return t.tagName},e.prototype.attributeMap=function(t){for(var e=new Map,n=t.attributes,r=0;r0;a||(a=t[s]=[]);var u=be(e)?Zone.root:Zone.current;if(0===a.length)a.push({zone:u,handler:o});else{for(var c=!1,d=0;d-1},e}($t),Se=["alt","control","meta","shift"],Te={alt:function(t){return t.altKey},control:function(t){return t.ctrlKey},meta:function(t){return t.metaKey},shift:function(t){return t.shiftKey}},Oe=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e.prototype.supports=function(t){return null!=e.parseEventName(t)},e.prototype.addEventListener=function(t,n,r){var i=e.parseEventName(n),o=e.eventCallback(i.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return Pt().onAndCancel(t,i.domEventName,o)})},e.parseEventName=function(t){var n=t.toLowerCase().split("."),r=n.shift();if(0===n.length||"keydown"!==r&&"keyup"!==r)return null;var i=e._normalizeKey(n.pop()),o="";if(Se.forEach(function(t){var e=n.indexOf(t);e>-1&&(n.splice(e,1),o+=t+".")}),o+=i,0!=n.length||0===i.length)return null;var s={};return s.domEventName=r,s.fullKey=o,s},e.getEventFullKey=function(t){var e="",n=Pt().getEventKey(t);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),Se.forEach(function(r){r!=n&&(0,Te[r])(t)&&(e+=r+".")}),e+=n},e.eventCallback=function(t,n,r){return function(i){e.getEventFullKey(i)===t&&r.runGuarded(function(){return n(i)})}},e._normalizeKey=function(t){switch(t){case"esc":return"escape";default:return t}},e}($t),De=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Ye=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function Pe(t){return(t=String(t)).match(De)||t.match(Ye)?t:(Object(r.Y)()&&Pt().log("WARNING: sanitizing unsafe URL value "+t+" (see http://g.co/ng/security#xss)"),"unsafe:"+t)}var Ee=null,Ae=null;function je(t){for(var e={},n=0,r=t.split(",");n")):this.sanitizedSomething=!0},t.prototype.endElement=function(t){var e=Ae.nodeName(t).toLowerCase();Ve.hasOwnProperty(e)&&!Re.hasOwnProperty(e)&&(this.buf.push(""))},t.prototype.chars=function(t){this.buf.push(Qe(t))},t}();function Ge(t,e){if(e&&Ae.contains(t,e))throw new Error("Failed to sanitize html because the element is clobbered: "+Ae.getOuterHTML(t));return e}var Je=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,qe=/([^\#-~ |!])/g;function Qe(t){return t.replace(/&/g,"&").replace(Je,function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"}).replace(qe,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}function Xe(t){Ae.attributeMap(t).forEach(function(e,n){"xmlns:ns1"!==n&&0!==n.indexOf("ns1:")||Ae.removeAttribute(t,n)});for(var e=0,n=Ae.childNodesAsList(t);e0){var r=t.slice(0,e),i=t.slice(e+1).trim();n.set(r,i)}}),n},t.prototype.append=function(t,e){var n=this.getAll(t);null===n?this.set(t,e):n.push(e)},t.prototype.delete=function(t){var e=t.toLowerCase();this._normalizedNames.delete(e),this._headers.delete(e)},t.prototype.forEach=function(t){var e=this;this._headers.forEach(function(n,r){return t(n,e._normalizedNames.get(r),e._headers)})},t.prototype.get=function(t){var e=this.getAll(t);return null===e?null:e.length>0?e[0]:null},t.prototype.has=function(t){return this._headers.has(t.toLowerCase())},t.prototype.keys=function(){return Array.from(this._normalizedNames.values())},t.prototype.set=function(t,e){Array.isArray(e)?e.length&&this._headers.set(t.toLowerCase(),[e.join(",")]):this._headers.set(t.toLowerCase(),[e]),this.mayBeSetNormalizedName(t)},t.prototype.values=function(){return Array.from(this._headers.values())},t.prototype.toJSON=function(){var t=this,e={};return this._headers.forEach(function(n,r){var i=[];n.forEach(function(t){return i.push.apply(i,t.split(","))}),e[t._normalizedNames.get(r)]=i}),e},t.prototype.getAll=function(t){return this.has(t)&&this._headers.get(t.toLowerCase())||null},t.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},t.prototype.mayBeSetNormalizedName=function(t){var e=t.toLowerCase();this._normalizedNames.has(e)||this._normalizedNames.set(e,t)},t}(),yn=function(){function t(t){void 0===t&&(t={});var e=t.body,n=t.status,r=t.headers,i=t.statusText,o=t.type,s=t.url;this.body=null!=e?e:null,this.status=null!=n?n:null,this.headers=null!=r?r:null,this.statusText=null!=i?i:null,this.type=null!=o?o:null,this.url=null!=s?s:null}return t.prototype.merge=function(e){return new t({body:e&&null!=e.body?e.body:this.body,status:e&&null!=e.status?e.status:this.status,headers:e&&null!=e.headers?e.headers:this.headers,statusText:e&&null!=e.statusText?e.statusText:this.statusText,type:e&&null!=e.type?e.type:this.type,url:e&&null!=e.url?e.url:this.url})},t}(),vn=function(t){function e(){return t.call(this,{status:200,statusText:"Ok",type:fn.Default,headers:new gn})||this}return Object(o.__extends)(e,t),e}(yn),bn=function(){};function wn(t){if("string"!=typeof t)return t;switch(t.toUpperCase()){case"GET":return pn.Get;case"POST":return pn.Post;case"PUT":return pn.Put;case"DELETE":return pn.Delete;case"OPTIONS":return pn.Options;case"HEAD":return pn.Head;case"PATCH":return pn.Patch}throw new Error('Invalid request method. The method "'+t+'" is not supported.')}var Mn=function(t){return t>=200&&t<300},kn=function(){function t(){}return t.prototype.encodeKey=function(t){return xn(t)},t.prototype.encodeValue=function(t){return xn(t)},t}();function xn(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Ln=function(){function t(t,e){void 0===t&&(t=""),void 0===e&&(e=new kn),this.rawParams=t,this.queryEncoder=e,this.paramsMap=function(t){void 0===t&&(t="");var e=new Map;return t.length>0&&t.split("&").forEach(function(t){var n=t.indexOf("="),r=-1==n?[t,""]:[t.slice(0,n),t.slice(n+1)],i=r[0],o=r[1],s=e.get(i)||[];s.push(o),e.set(i,s)}),e}(t)}return t.prototype.clone=function(){var e=new t("",this.queryEncoder);return e.appendAll(this),e},t.prototype.has=function(t){return this.paramsMap.has(t)},t.prototype.get=function(t){var e=this.paramsMap.get(t);return Array.isArray(e)?e[0]:null},t.prototype.getAll=function(t){return this.paramsMap.get(t)||[]},t.prototype.set=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.length=0,n.push(e),this.paramsMap.set(t,n)}else this.delete(t)},t.prototype.setAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){var r=e.paramsMap.get(n)||[];r.length=0,r.push(t[0]),e.paramsMap.set(n,r)})},t.prototype.append=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.push(e),this.paramsMap.set(t,n)}},t.prototype.appendAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){for(var r=e.paramsMap.get(n)||[],i=0;i=200&&n.status<=299,n.statusText=e.statusText,n.headers=e.headers,n.type=e.type,n.url=e.url,n}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},e}(Cn),Tn=/^\)\]\}',?\n/,On=function(){function t(t,e,n){var r=this;this.request=t,this.response=new s.a(function(i){var o=e.build();o.open(pn[t.method].toUpperCase(),t.url),null!=t.withCredentials&&(o.withCredentials=t.withCredentials);var s=function(){var e=1223===o.status?204:o.status,r=null;204!==e&&"string"==typeof(r="undefined"==typeof o.response?o.responseText:o.response)&&(r=r.replace(Tn,"")),0===e&&(e=r?200:0);var s,a=gn.fromResponseHeaderString(o.getAllResponseHeaders()),l=("responseURL"in(s=o)?s.responseURL:/^X-Request-URL:/m.test(s.getAllResponseHeaders())?s.getResponseHeader("X-Request-URL"):null)||t.url,u=new yn({body:r,status:e,headers:a,statusText:o.statusText||"OK",url:l});null!=n&&(u=n.merge(u));var c=new Sn(u);if(c.ok=Mn(e),c.ok)return i.next(c),void i.complete();i.error(c)},a=function(t){var e=new yn({body:t,type:fn.Error,status:o.status,statusText:o.statusText});null!=n&&(e=n.merge(e)),i.error(new Sn(e))};if(r.setDetectedContentType(t,o),null==t.headers&&(t.headers=new gn),t.headers.has("Accept")||t.headers.append("Accept","application/json, text/plain, */*"),t.headers.forEach(function(t,e){return o.setRequestHeader(e,t.join(","))}),null!=t.responseType&&null!=o.responseType)switch(t.responseType){case mn.ArrayBuffer:o.responseType="arraybuffer";break;case mn.Json:o.responseType="json";break;case mn.Text:o.responseType="text";break;case mn.Blob:o.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return o.addEventListener("load",s),o.addEventListener("error",a),o.send(r.request.getBody()),function(){o.removeEventListener("load",s),o.removeEventListener("error",a),o.abort()}})}return t.prototype.setDetectedContentType=function(t,e){if(null==t.headers||null==t.headers.get("Content-Type"))switch(t.contentType){case _n.NONE:break;case _n.JSON:e.setRequestHeader("content-type","application/json");break;case _n.FORM:e.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case _n.TEXT:e.setRequestHeader("content-type","text/plain");break;case _n.BLOB:var n=t.blob();n.type&&e.setRequestHeader("content-type",n.type)}},t}(),Dn=function(){function t(t,e){void 0===t&&(t="XSRF-TOKEN"),void 0===e&&(e="X-XSRF-TOKEN"),this._cookieName=t,this._headerName=e}return t.prototype.configureRequest=function(t){var e=Pt().getCookie(this._cookieName);e&&t.headers.set(this._headerName,e)},t}(),Yn=function(){function t(t,e,n){this._browserXHR=t,this._baseResponseOptions=e,this._xsrfStrategy=n}return t.prototype.createConnection=function(t){return this._xsrfStrategy.configureRequest(t),new On(t,this._browserXHR,this._baseResponseOptions)},t}(),Pn=function(){function t(t){void 0===t&&(t={});var e=t.method,n=t.headers,r=t.body,i=t.url,o=t.search,s=t.params,a=t.withCredentials,l=t.responseType;this.method=null!=e?wn(e):null,this.headers=null!=n?n:null,this.body=null!=r?r:null,this.url=null!=i?i:null,this.params=this._mergeSearchParams(s||o),this.withCredentials=null!=a?a:null,this.responseType=null!=l?l:null}return Object.defineProperty(t.prototype,"search",{get:function(){return this.params},set:function(t){this.params=t},enumerable:!0,configurable:!0}),t.prototype.merge=function(e){return new t({method:e&&null!=e.method?e.method:this.method,headers:e&&null!=e.headers?e.headers:new gn(this.headers),body:e&&null!=e.body?e.body:this.body,url:e&&null!=e.url?e.url:this.url,params:e&&this._mergeSearchParams(e.params||e.search),withCredentials:e&&null!=e.withCredentials?e.withCredentials:this.withCredentials,responseType:e&&null!=e.responseType?e.responseType:this.responseType})},t.prototype._mergeSearchParams=function(t){return t?t instanceof Ln?t.clone():"string"==typeof t?new Ln(t):this._parseParams(t):this.params},t.prototype._parseParams=function(t){var e=this;void 0===t&&(t={});var n=new Ln;return Object.keys(t).forEach(function(r){var i=t[r];Array.isArray(i)?i.forEach(function(t){return e._appendParam(r,t,n)}):e._appendParam(r,i,n)}),n},t.prototype._appendParam=function(t,e,n){"string"!=typeof e&&(e=JSON.stringify(e)),n.append(t,e)},t}(),En=function(t){function e(){return t.call(this,{method:pn.Get,headers:new gn})||this}return Object(o.__extends)(e,t),e}(Pn),An=function(t){function e(e){var n=t.call(this)||this,r=e.url;n.url=e.url;var i,o=e.params||e.search;if(o&&(i="object"!=typeof o||o instanceof Ln?o.toString():function(t){var e=new Ln;return Object.keys(t).forEach(function(n){var r=t[n];r&&Array.isArray(r)?r.forEach(function(t){return e.append(n,t.toString())}):e.append(n,r.toString())}),e}(o).toString()).length>0){var s="?";-1!=n.url.indexOf("?")&&(s="&"==n.url[n.url.length-1]?"":"&"),n.url=r+s+i}return n._body=e.body,n.method=wn(e.method),n.headers=new gn(e.headers),n.contentType=n.detectContentType(),n.withCredentials=e.withCredentials,n.responseType=e.responseType,n}return Object(o.__extends)(e,t),e.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return _n.JSON;case"application/x-www-form-urlencoded":return _n.FORM;case"multipart/form-data":return _n.FORM_DATA;case"text/plain":case"text/html":return _n.TEXT;case"application/octet-stream":return this._body instanceof Fn?_n.ARRAY_BUFFER:_n.BLOB;default:return this.detectContentTypeFromBody()}},e.prototype.detectContentTypeFromBody=function(){return null==this._body?_n.NONE:this._body instanceof Ln?_n.FORM:this._body instanceof Rn?_n.FORM_DATA:this._body instanceof Hn?_n.BLOB:this._body instanceof Fn?_n.ARRAY_BUFFER:this._body&&"object"==typeof this._body?_n.JSON:_n.TEXT},e.prototype.getBody=function(){switch(this.contentType){case _n.JSON:case _n.FORM:return this.text();case _n.FORM_DATA:return this._body;case _n.TEXT:return this.text();case _n.BLOB:return this.blob();case _n.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},e}(Cn),jn=function(){},In="object"==typeof window?window:jn,Rn=In.FormData||jn,Hn=In.Blob||jn,Fn=In.ArrayBuffer||jn;function Nn(t,e){return t.createConnection(e).response}function Vn(t,e,n,r){return t.merge(new Pn(e?{method:e.method||n,url:e.url||r,search:e.search,params:e.params,headers:e.headers,body:e.body,withCredentials:e.withCredentials,responseType:e.responseType}:{method:n,url:r}))}var Bn=function(){function t(t,e){this._backend=t,this._defaultOptions=e}return t.prototype.request=function(t,e){var n;if("string"==typeof t)n=Nn(this._backend,new An(Vn(this._defaultOptions,e,pn.Get,t)));else{if(!(t instanceof An))throw new Error("First argument must be a url string or Request instance.");n=Nn(this._backend,t)}return n},t.prototype.get=function(t,e){return this.request(new An(Vn(this._defaultOptions,e,pn.Get,t)))},t.prototype.post=function(t,e,n){return this.request(new An(Vn(this._defaultOptions.merge(new Pn({body:e})),n,pn.Post,t)))},t.prototype.put=function(t,e,n){return this.request(new An(Vn(this._defaultOptions.merge(new Pn({body:e})),n,pn.Put,t)))},t.prototype.delete=function(t,e){return this.request(new An(Vn(this._defaultOptions,e,pn.Delete,t)))},t.prototype.patch=function(t,e,n){return this.request(new An(Vn(this._defaultOptions.merge(new Pn({body:e})),n,pn.Patch,t)))},t.prototype.head=function(t,e){return this.request(new An(Vn(this._defaultOptions,e,pn.Head,t)))},t.prototype.options=function(t,e){return this.request(new An(Vn(this._defaultOptions,e,pn.Options,t)))},t}();function zn(){return new Dn}function Wn(t,e){return new Bn(t,e)}var Un=function(){},Gn=function(t){function e(e,n){t.call(this),this.error=e,this.scheduler=n}return Object(o.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){t.subscriber.error(t.error)},e.prototype._subscribe=function(t){var n=this.error,r=this.scheduler;if(t.syncErrorThrowable=!0,r)return r.schedule(e.dispatch,0,{error:n,subscriber:t});t.error(n)},e}(s.a).create;s.a.throw=Gn;var Jn=n("tZ2B"),qn=n("PIsA");function Qn(t){return function(e){var n=new Xn(t),r=e.lift(n);return n.caught=r}}var Xn=function(){function t(t){this.selector=t}return t.prototype.call=function(t,e){return e.subscribe(new Kn(t,this.selector,this.caught))},t}(),Kn=function(t){function e(e,n,r){t.call(this,e),this.selector=n,this.caught=r}return Object(o.__extends)(e,t),e.prototype.error=function(e){if(!this.isStopped){var n=void 0;try{n=this.selector(e,this.caught)}catch(e){return void t.prototype.error.call(this,e)}this._unsubscribeAndRecycle(),this.add(Object(qn.a)(this,n))}},e}(Jn.a);function Zn(t){return Qn(t)(this)}s.a.prototype.catch=Zn,s.a.prototype._catch=Zn;var $n=n("HdCx");function tr(t,e){return Object($n.a)(t,e)(this)}s.a.prototype.map=tr;var er=function(){function t(t){this.http=t,this.url=i.nodeUrl}return t.prototype.getExplorerAddress=function(t){return this.get("explorer/address",{address:t.address}).map(function(t){return t.map(function(t){return{addresses:[],balance:0,block:t.status.block_seq,confirmed:t.status.confirmed,timestamp:t.timestamp,txid:t.txid,inputs:t.inputs,outputs:t.outputs}})})},t.prototype.getVersion=function(){return this.get("version")},t.prototype.generateSeed=function(t){return void 0===t&&(t=128),this.get("wallet/newSeed",{entropy:t}).map(function(t){return t.seed})},t.prototype.getWallets=function(){return this.get("wallets").map(function(t){var e=[];return t.forEach(function(t){e.push({label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted})}),e})},t.prototype.getWalletSeed=function(t,e){return this.post("wallet/seed",{id:t.filename,password:e}).map(function(t){return t.seed})},t.prototype.postWalletCreate=function(t,e,n,r){var i={label:t,seed:e,scan:n};return r&&(i.password=r,i.encrypt=!0),this.post("wallet/create",i).map(function(t){return{label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted}})},t.prototype.postWalletNewAddress=function(t,e){return this.post("wallet/newAddress",{id:t.filename,password:e}).map(function(t){return{address:t.addresses[0],coins:null,hours:null}})},t.prototype.postWalletToggleEncryption=function(t,e){return this.post("wallet/"+(t.encrypted?"decrypt":"encrypt"),{id:t.filename,password:e})},t.prototype.get=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n={}),this.http.get(this.getUrl(t,e),this.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return s.a.throw(t||"Server error")})},t.prototype.getCsrf=function(){return this.get("csrf").map(function(t){return t.csrf_token})},t.prototype.post=function(t,e,n){var r=this;return void 0===e&&(e={}),void 0===n&&(n={}),this.getCsrf().first().flatMap(function(i){return n.csrf=i,r.http.post(r.getUrl(t),n.json?JSON.stringify(e):r.getQueryString(e),r.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return s.a.throw(t||"Server error")})})},t.prototype.returnRequestOptions=function(t){var e=new Pn;return e.headers=this.getHeaders(t),t.csrf&&e.headers.append("X-CSRF-Token",t.csrf),e},t.prototype.getHeaders=function(t){var e=new gn;return e.append("Content-Type",t.json?"application/json":"application/x-www-form-urlencoded"),e},t.prototype.getQueryString=function(t){return void 0===t&&(t=null),t?Object.keys(t).reduce(function(e,n){return e.push(n+"="+encodeURIComponent(t[n])),e},[]).join("&"):""},t.prototype.getUrl=function(t,e){return void 0===e&&(e=null),this.url+t+"?"+this.getQueryString(e)},t}(),nr=n("+3/4"),rr=n("BX3T"),ir=function(t){function e(e,n){t.call(this),this.sources=e,this.resultSelector=n}return Object(o.__extends)(e,t),e.create=function(){for(var t=[],n=0;n=0}s.a.prototype.mergeMap=Mr,s.a.prototype.flatMap=Mr;var xr=n("AMGY"),Lr=n("VwZZ"),Cr=function(t){function e(e,n){t.call(this,e,n),this.scheduler=e,this.work=n,this.pending=!1}return Object(o.__extends)(e,t),e.prototype.schedule=function(t,e){if(void 0===e&&(e=0),this.closed)return this;this.state=t,this.pending=!0;var n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this},e.prototype.requestAsyncId=function(t,e,n){return void 0===n&&(n=0),xr.a.setInterval(t.flush.bind(t,this),n)},e.prototype.recycleAsyncId=function(t,e,n){if(void 0===n&&(n=0),null!==n&&this.delay===n&&!1===this.pending)return e;xr.a.clearInterval(e)},e.prototype.execute=function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},e.prototype._execute=function(t,e){var n=!1,r=void 0;try{this.work(t)}catch(t){n=!0,r=!!t&&t||new Error(t)}if(n)return this.unsubscribe(),r},e.prototype._unsubscribe=function(){var t=this.id,e=this.scheduler,n=e.actions,r=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==r&&n.splice(r,1),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null},e}(function(t){function e(e,n){t.call(this)}return Object(o.__extends)(e,t),e.prototype.schedule=function(t,e){return void 0===e&&(e=0),this},e}(Lr.a)),Sr=function(t){function e(){t.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(o.__extends)(e,t),e.prototype.flush=function(t){var e=this.actions;if(this.active)e.push(t);else{var n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}},e}(function(){function t(e,n){void 0===n&&(n=t.now),this.SchedulerAction=e,this.now=n}return t.prototype.schedule=function(t,e,n){return void 0===e&&(e=0),new this.SchedulerAction(this,t).schedule(n,e)},t.now=Date.now?Date.now:function(){return+new Date},t}()),Tr=new Sr(Cr),Or=n("1Q68");function Dr(t){return t instanceof Date&&!isNaN(+t)}var Yr=function(t){function e(e,n,r){void 0===e&&(e=0),t.call(this),this.period=-1,this.dueTime=0,kr(n)?this.period=Number(n)<1?1:Number(n):Object(Or.a)(n)&&(r=n),Object(Or.a)(r)||(r=Tr),this.scheduler=r,this.dueTime=Dr(e)?+e-this.scheduler.now():e}return Object(o.__extends)(e,t),e.create=function(t,n,r){return void 0===t&&(t=0),new e(t,n,r)},e.dispatch=function(t){var e=t.index,n=t.period,r=t.subscriber;if(r.next(e),!r.closed){if(-1===n)return r.complete();t.index=e+1,this.schedule(t,n)}},e.prototype._subscribe=function(t){return this.scheduler.schedule(e.dispatch,this.dueTime,{index:0,period:this.period,subscriber:t})},e}(s.a).create;s.a.timer=Yr;var Pr=n("Veqx"),Er=n("etqZ"),Ar=function(){function t(t){this.project=t}return t.prototype.call=function(t,e){return e.subscribe(new jr(t,this.project))},t}(),jr=function(t){function e(e,n,r){void 0===r&&(r=Object.create(null)),t.call(this,e),this.iterators=[],this.active=0,this.project="function"==typeof n?n:null,this.values=r}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e=this.iterators;Object(rr.a)(t)?e.push(new Rr(t)):e.push("function"==typeof t[Er.a]?new Ir(t[Er.a]()):new Hr(this.destination,this,t))},e.prototype._complete=function(){var t=this.iterators,e=t.length;if(0!==e){this.active=e;for(var n=0;nthis.index},t.prototype.hasCompleted=function(){return this.array.length===this.index},t}(),Hr=function(t){function e(e,n,r){t.call(this,e),this.parent=n,this.observable=r,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(o.__extends)(e,t),e.prototype[Er.a]=function(){return this},e.prototype.next=function(){var t=this.buffer;return 0===t.length&&this.isComplete?{value:null,done:!0}:{value:t.shift(),done:!1}},e.prototype.hasValue=function(){return this.buffer.length>0},e.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},e.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},e.prototype.notifyNext=function(t,e,n,r,i){this.buffer.push(e),this.parent.checkIterators()},e.prototype.subscribe=function(t,e){return Object(qn.a)(this,this.observable,this,e)},e}(Jn.a);s.a.zip=function(){for(var t=[],e=0;e0?t.prototype.schedule.call(this,e,n):(this.delay=n,this.state=e,this.scheduler.flush(this),this)},e.prototype.execute=function(e,n){return n>0||this.closed?t.prototype.execute.call(this,e,n):this._execute(e,n)},e.prototype.requestAsyncId=function(e,n,r){return void 0===r&&(r=0),null!==r&&r>0||null===r&&this.delay>0?t.prototype.requestAsyncId.call(this,e,n,r):e.flush(this)},e}(Cr),Br=new(function(t){function e(){t.apply(this,arguments)}return Object(o.__extends)(e,t),e}(Sr))(Vr),zr=function(){function t(t,e,n){this.kind=t,this.value=e,this.error=n,this.hasValue="N"===t}return t.prototype.observe=function(t){switch(this.kind){case"N":return t.next&&t.next(this.value);case"E":return t.error&&t.error(this.error);case"C":return t.complete&&t.complete()}},t.prototype.do=function(t,e,n){switch(this.kind){case"N":return t&&t(this.value);case"E":return e&&e(this.error);case"C":return n&&n()}},t.prototype.accept=function(t,e,n){return t&&"function"==typeof t.next?this.observe(t):this.do(t,e,n)},t.prototype.toObservable=function(){switch(this.kind){case"N":return s.a.of(this.value);case"E":return s.a.throw(this.error);case"C":return s.a.empty()}throw new Error("unexpected notification kind value")},t.createNext=function(e){return"undefined"!=typeof e?new t("N",e):t.undefinedValueNotification},t.createError=function(e){return new t("E",void 0,e)},t.createComplete=function(){return t.completeNotification},t.completeNotification=new t("C"),t.undefinedValueNotification=new t("N",void 0),t}(),Wr=function(t){function e(e,n,r){void 0===r&&(r=0),t.call(this,e),this.scheduler=n,this.delay=r}return Object(o.__extends)(e,t),e.dispatch=function(t){t.notification.observe(t.destination),this.unsubscribe()},e.prototype.scheduleMessage=function(t){this.add(this.scheduler.schedule(e.dispatch,this.delay,new Ur(t,this.destination)))},e.prototype._next=function(t){this.scheduleMessage(zr.createNext(t))},e.prototype._error=function(t){this.scheduleMessage(zr.createError(t))},e.prototype._complete=function(){this.scheduleMessage(zr.createComplete())},e}(lr.a),Ur=function(t,e){this.notification=t,this.destination=e},Gr=n("x6VL"),Jr=n("1Bqh"),qr=function(t){function e(e,n,r){void 0===e&&(e=Number.POSITIVE_INFINITY),void 0===n&&(n=Number.POSITIVE_INFINITY),t.call(this),this.scheduler=r,this._events=[],this._bufferSize=e<1?1:e,this._windowTime=n<1?1:n}return Object(o.__extends)(e,t),e.prototype.next=function(e){var n=this._getNow();this._events.push(new Qr(n,e)),this._trimBufferThenGetEvents(),t.prototype.next.call(this,e)},e.prototype._subscribe=function(t){var e,n=this._trimBufferThenGetEvents(),r=this.scheduler;if(this.closed)throw new Gr.a;this.hasError?e=Lr.a.EMPTY:this.isStopped?e=Lr.a.EMPTY:(this.observers.push(t),e=new Jr.a(this,t)),r&&t.add(t=new Wr(t,r));for(var i=n.length,o=0;oe&&(o=Math.max(o,i-e)),o>0&&r.splice(0,o),r},e}(Nr.a),Qr=function(t,e){this.time=t,this.value=e},Xr=this&&this.__assign||Object.assign||function(t){for(var e,n=1,r=arguments.length;n0}).map(function(t){return t.transactions})).reduce(function(t,e){return t.find(function(t){return t.transaction.txid===e.transaction.txid})||t.push(e),t},[]))})})},t}(),Zr="undefined"!=typeof Intl&&Intl.v8BreakIterator,$r=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Zr)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function ti(){if(null==Fr&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return Fr=!0}}))}finally{Fr=Fr||!1}return Fr}var ei=function(){},ni=n("GK6M"),ri=n("/iUD"),ii=n("fKB6"),oi=Object.prototype.toString,si=function(t){function e(e,n,r,i){t.call(this),this.sourceObj=e,this.eventName=n,this.selector=r,this.options=i}return Object(o.__extends)(e,t),e.create=function(t,n,r,i){return Object(ri.a)(r)&&(i=r,r=void 0),new e(t,n,i,r)},e.setupSubscription=function(t,n,r,i,o){var s;if(function(t){return!!t&&"[object NodeList]"===oi.call(t)}(t)||function(t){return!!t&&"[object HTMLCollection]"===oi.call(t)}(t))for(var a=0,l=t.length;a0?e._scrolled.pipe(ui(t)).subscribe(n):e._scrolled.subscribe(n);return e._scrolledCount++,function(){r.unsubscribe(),e._scrolledCount--,e._globalSubscription&&!e._scrolledCount&&(e._globalSubscription.unsubscribe(),e._globalSubscription=null)}}):Object(ar.a)()},t.prototype.ancestorScrolled=function(t,e){var n=this.getAncestorScrollContainers(t);return this.scrolled(e).pipe(pr(function(t){return!t||n.indexOf(t)>-1}))},t.prototype.getAncestorScrollContainers=function(t){var e=this,n=[];return this.scrollContainers.forEach(function(r,i){e._scrollableContainsElement(i,t)&&n.push(i)}),n},t.prototype._scrollableContainsElement=function(t,e){var n=e.nativeElement,r=t.getElementRef().nativeElement;do{if(n==r)return!0}while(n=n.parentElement);return!1},t.prototype._addGlobalListener=function(){var t=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return si(window.document,"scroll").subscribe(function(){return t._scrolled.next()})})},t}();function hi(t,e,n){return t||new di(e,n)}var pi=function(){function t(t,e){var n=this;this._change=t.isBrowser?e.runOutsideAngular(function(){return Object(ci.a)(si(window,"resize"),si(window,"orientationchange"))}):Object(ar.a)(),this._invalidateCache=this.change().subscribe(function(){return n._updateViewportSize()})}return t.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},t.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},t.prototype.getViewportRect=function(){var t=this.getViewportScrollPosition(),e=this.getViewportSize(),n=e.width,r=e.height;return{top:t.top,left:t.left,bottom:t.top+r,right:t.left+n,height:r,width:n}},t.prototype.getViewportScrollPosition=function(){var t=document.documentElement.getBoundingClientRect();return{top:-t.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-t.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},t.prototype.change=function(t){return void 0===t&&(t=20),t>0?this._change.pipe(ui(t)):this._change},t.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},t}();function fi(t,e,n){return t||new pi(e,n)}var _i=function(){},mi=new r.r("cdk-dir-doc"),gi=function(){return function(t){this.value="ltr",this.change=new r.o,t&&(this.value=(t.body?t.body.dir:null)||(t.documentElement?t.documentElement.dir:null)||"ltr")}}(),yi=function(){};function vi(){throw Error("Host already has a portal attached")}var bi=function(){function t(){}return t.prototype.attach=function(t){return null==t&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),t.hasAttached()&&vi(),this._attachedHost=t,t.attach(this)},t.prototype.detach=function(){var t=this._attachedHost;null==t?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,t.detach())},Object.defineProperty(t.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),t.prototype.setAttachedHost=function(t){this._attachedHost=t},t}(),wi=function(t){function e(e,n,r){var i=t.call(this)||this;return i.component=e,i.viewContainerRef=n,i.injector=r,i}return Object(o.__extends)(e,t),e}(bi),Mi=function(t){function e(e,n,r){var i=t.call(this)||this;return i.templateRef=e,i.viewContainerRef=n,r&&(i.context=r),i}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),e.prototype.attach=function(e,n){return void 0===n&&(n=this.context),this.context=n,t.prototype.attach.call(this,e)},e.prototype.detach=function(){return this.context=void 0,t.prototype.detach.call(this)},e}(bi),ki=function(){function t(){this._isDisposed=!1}return t.prototype.hasAttached=function(){return!!this._attachedPortal},t.prototype.attach=function(t){return t||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&vi(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),t instanceof wi?(this._attachedPortal=t,this.attachComponentPortal(t)):t instanceof Mi?(this._attachedPortal=t,this.attachTemplatePortal(t)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},t.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},t.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},t.prototype.setDisposeFn=function(t){this._disposeFn=t},t.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},t}(),xi=function(t){function e(e,n,r,i){var o=t.call(this)||this;return o._hostDomElement=e,o._componentFactoryResolver=n,o._appRef=r,o._defaultInjector=i,o}return Object(o.__extends)(e,t),e.prototype.attachComponentPortal=function(t){var e,n=this,r=this._componentFactoryResolver.resolveComponentFactory(t.component);return t.viewContainerRef?(e=t.viewContainerRef.createComponent(r,t.viewContainerRef.length,t.injector||t.viewContainerRef.parentInjector),this.setDisposeFn(function(){return e.destroy()})):(e=r.create(t.injector||this._defaultInjector),this._appRef.attachView(e.hostView),this.setDisposeFn(function(){n._appRef.detachView(e.hostView),e.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(e)),e},e.prototype.attachTemplatePortal=function(t){var e=this,n=t.viewContainerRef,r=n.createEmbeddedView(t.templateRef,t.context);return r.detectChanges(),r.rootNodes.forEach(function(t){return e._hostDomElement.appendChild(t)}),this.setDisposeFn(function(){var t=n.indexOf(r);-1!==t&&n.remove(t)}),r},e.prototype.dispose=function(){t.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},e.prototype._getComponentRootNode=function(t){return t.hostView.rootNodes[0]},e}(ki),Li=function(t){function e(e,n){var r=t.call(this)||this;return r._componentFactoryResolver=e,r._viewContainerRef=n,r._isInitialized=!1,r}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"portal",{get:function(){return this._attachedPortal},set:function(e){(!this.hasAttached()||e||this._isInitialized)&&(this.hasAttached()&&t.prototype.detach.call(this),e&&t.prototype.attach.call(this,e),this._attachedPortal=e)},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._isInitialized=!0},e.prototype.ngOnDestroy=function(){t.prototype.dispose.call(this),this._attachedPortal=null},e.prototype.attachComponentPortal=function(e){e.setAttachedHost(this);var n=null!=e.viewContainerRef?e.viewContainerRef:this._viewContainerRef,r=this._componentFactoryResolver.resolveComponentFactory(e.component),i=n.createComponent(r,n.length,e.injector||n.parentInjector);return t.prototype.setDisposeFn.call(this,function(){return i.destroy()}),this._attachedPortal=e,i},e.prototype.attachTemplatePortal=function(e){var n=this;e.setAttachedHost(this);var r=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context);return t.prototype.setDisposeFn.call(this,function(){return n._viewContainerRef.clear()}),this._attachedPortal=e,r},e}(ki),Ci=function(){},Si=function(){function t(t,e){this._parentInjector=t,this._customTokens=e}return t.prototype.get=function(t,e){var n=this._customTokens.get(t);return"undefined"!=typeof n?n:this._parentInjector.get(t,e)},t}(),Ti=n("9Ocp");function Oi(t){return null!=t&&""+t!="false"}function Di(t,e){return void 0===e&&(e=0),isNaN(parseFloat(t))||isNaN(Number(t))?e:Number(t)}function Yi(t){return Array.isArray(t)?t:[t]}var Pi=function(){function t(){}return t.prototype.enable=function(){},t.prototype.disable=function(){},t.prototype.attach=function(){},t}(),Ei=function(){return function(t){var e=this;this.scrollStrategy=new Pi,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",t&&Object.keys(t).forEach(function(n){return e[n]=t[n]})}}(),Ai=function(t,e,n,r){this.offsetX=n,this.offsetY=r,this.originX=t.originX,this.originY=t.originY,this.overlayX=e.overlayX,this.overlayY=e.overlayY};function ji(){return Error("Scroll strategy has already been attached.")}var Ii=function(){function t(t,e){this._scrollDispatcher=t,this._ngZone=e,this._scrollSubscription=null}return t.prototype.attach=function(t){if(this._overlayRef)throw ji();this._overlayRef=t},t.prototype.enable=function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){t._ngZone.run(function(){t.disable(),t._overlayRef.hasAttached()&&t._overlayRef.detach()})}))},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),Ri=function(){function t(t){this._viewportRuler=t,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return t.prototype.attach=function(){},t.prototype.enable=function(){if(this._canBeEnabled()){var t=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=t.style.left||"",this._previousHTMLStyles.top=t.style.top||"",t.style.left=-this._previousScrollPosition.left+"px",t.style.top=-this._previousScrollPosition.top+"px",t.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},t.prototype.disable=function(){if(this._isEnabled){var t=document.documentElement,e=document.body,n=t.style.scrollBehavior||"",r=e.style.scrollBehavior||"";this._isEnabled=!1,t.style.left=this._previousHTMLStyles.left,t.style.top=this._previousHTMLStyles.top,t.classList.remove("cdk-global-scrollblock"),t.style.scrollBehavior=e.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),t.style.scrollBehavior=n,e.style.scrollBehavior=r}},t.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var t=document.body,e=this._viewportRuler.getViewportSize();return t.scrollHeight>e.height||t.scrollWidth>e.width},t}();function Hi(t,e){return e.some(function(e){return t.bottome.bottom||t.righte.right})}function Fi(t,e){return e.some(function(e){return t.tope.bottom||t.lefte.right})}var Ni=function(){function t(t,e,n,r){this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this._config=r,this._scrollSubscription=null}return t.prototype.attach=function(t){if(this._overlayRef)throw ji();this._overlayRef=t},t.prototype.enable=function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(t._overlayRef.updatePosition(),t._config&&t._config.autoClose){var e=t._overlayRef.overlayElement.getBoundingClientRect(),n=t._viewportRuler.getViewportSize(),r=n.width,i=n.height;Hi(e,[{width:r,height:i,bottom:i,right:r,top:0,left:0}])&&(t.disable(),t._ngZone.run(function(){return t._overlayRef.detach()}))}}))},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),Vi=function(){return function(t,e,n){var r=this;this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this.noop=function(){return new Pi},this.close=function(){return new Ii(r._scrollDispatcher,r._ngZone)},this.block=function(){return new Ri(r._viewportRuler)},this.reposition=function(t){return new Ni(r._scrollDispatcher,r._viewportRuler,r._ngZone,t)}}}(),Bi=function(){function t(t,e,n,r,i){this._portalOutlet=t,this._pane=e,this._config=n,this._ngZone=r,this._keyboardDispatcher=i,this._backdropElement=null,this._backdropClick=new Nr.a,this._attachments=new Nr.a,this._detachments=new Nr.a,this._keydownEvents=new Nr.a,n.scrollStrategy&&n.scrollStrategy.attach(this)}return Object.defineProperty(t.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this,n=this._portalOutlet.attach(t);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Object(Ti.a)(1)).subscribe(function(){e.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(t){return e._pane.classList.add(t)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),n},t.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var t=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),t}},t.prototype.dispose=function(){var t=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),t&&this._detachments.next(),this._detachments.complete()},t.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},t.prototype.backdropClick=function(){return this._backdropClick.asObservable()},t.prototype.attachments=function(){return this._attachments.asObservable()},t.prototype.detachments=function(){return this._detachments.asObservable()},t.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},t.prototype.getConfig=function(){return this._config},t.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},t.prototype.updateSize=function(t){this._config=Object(o.__assign)({},this._config,t),this._updateElementSize()},t.prototype.setDirection=function(t){this._config=Object(o.__assign)({},this._config,{direction:t}),this._updateElementDirection()},t.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},t.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=zi(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=zi(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=zi(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=zi(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=zi(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=zi(this._config.maxHeight))},t.prototype._togglePointerEvents=function(t){this._pane.style.pointerEvents=t?"auto":"none"},t.prototype._attachBackdrop=function(){var t=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return t._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){t._backdropElement&&t._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},t.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},t.prototype.detachBackdrop=function(){var t=this,e=this._backdropElement;if(e){var n=function(){e&&e.parentNode&&e.parentNode.removeChild(e),t._backdropElement==e&&(t._backdropElement=null)};e.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&e.classList.remove(this._config.backdropClass),e.addEventListener("transitionend",n),e.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(n,500)})}},t}();function zi(t){return"string"==typeof t?t:t+"px"}var Wi=function(){function t(t,e,n,r,i){this._connectedTo=n,this._viewportRuler=r,this._document=i,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=Lr.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new Nr.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(t,e)}return Object.defineProperty(t.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this;this._overlayRef=t,this._pane=t.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return e.apply()})},t.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},t.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},t.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var t,e,n=this._pane,r=this._origin.getBoundingClientRect(),i=n.getBoundingClientRect(),o=this._viewportRuler.getViewportSize(),s=0,a=this._preferredPositions;s-1&&this._attachedOverlays.splice(e,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},t.prototype._subscribeToKeydownEvents=function(){var t=this,e=si(this._document.body,"keydown");this._keydownEventSubscription=e.pipe(pr(function(){return!!t._attachedOverlays.length})).subscribe(function(e){t._selectOverlayFromEvent(e)._keydownEvents.next(e)})},t.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},t.prototype._selectOverlayFromEvent=function(t){return this._attachedOverlays.find(function(e){return e.overlayElement===t.target||e.overlayElement.contains(t.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},t}();function qi(t,e){return t||new Ji(e)}var Qi=function(){function t(t){this._document=t}return t.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},t.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},t.prototype._createContainer=function(){var t=this._document.createElement("div");t.classList.add("cdk-overlay-container"),this._document.body.appendChild(t),this._containerElement=t},t}();function Xi(t,e){return t||new Qi(e)}var Ki=0,Zi=new Ei,$i=function(){function t(t,e,n,r,i,o,s,a,l){this.scrollStrategies=t,this._overlayContainer=e,this._componentFactoryResolver=n,this._positionBuilder=r,this._keyboardDispatcher=i,this._appRef=o,this._injector=s,this._ngZone=a,this._document=l}return t.prototype.create=function(t){void 0===t&&(t=Zi);var e=this._createPaneElement(),n=this._createPortalOutlet(e);return new Bi(n,e,t,this._ngZone,this._keyboardDispatcher)},t.prototype.position=function(){return this._positionBuilder},t.prototype._createPaneElement=function(){var t=this._document.createElement("div");return t.id="cdk-overlay-"+Ki++,t.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(t),t},t.prototype._createPortalOutlet=function(t){return new xi(t,this._componentFactoryResolver,this._appRef,this._injector)},t}(),to=[new Ai({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new Ai({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new Ai({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new Ai({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],eo=new r.r("cdk-connected-overlay-scroll-strategy");function no(t){return function(){return t.scrollStrategies.reposition()}}var ro=function(t){this.elementRef=t},io=function(){function t(t,e,n,i,o){this._overlay=t,this._scrollStrategy=i,this._dir=o,this._hasBackdrop=!1,this._backdropSubscription=Lr.a.EMPTY,this._positionSubscription=Lr.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new r.o,this.positionChange=new r.o,this.attach=new r.o,this.detach=new r.o,this._templatePortal=new Mi(e,n)}return Object.defineProperty(t.prototype,"offsetX",{get:function(){return this._offsetX},set:function(t){this._offsetX=t,this._position&&this._position.withOffsetX(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"offsetY",{get:function(){return this._offsetY},set:function(t){this._offsetY=t,this._position&&this._position.withOffsetY(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(t){this._hasBackdrop=Oi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(t){this.origin=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(t){this.positions=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(t){this.offsetX=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(t){this.offsetY=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(t){this.width=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(t){this.height=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(t){this.minWidth=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(t){this.minHeight=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(t){this.backdropClass=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(t){this.scrollStrategy=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(t){this.open=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(t){this.hasBackdrop=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnDestroy=function(){this._destroyOverlay()},t.prototype.ngOnChanges=function(t){(t.open||t._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},t.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=to),this._overlayRef=this._overlay.create(this._buildConfig())},t.prototype._buildConfig=function(){var t=this._position=this._createPositionStrategy(),e=new Ei({positionStrategy:t,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(e.width=this.width),(this.height||0===this.height)&&(e.height=this.height),(this.minWidth||0===this.minWidth)&&(e.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(e.minHeight=this.minHeight),this.backdropClass&&(e.backdropClass=this.backdropClass),e},t.prototype._createPositionStrategy=function(){var t=this.positions[0],e={originX:t.originX,originY:t.originY},n={overlayX:t.overlayX,overlayY:t.overlayY},r=this._overlay.position().connectedTo(this.origin.elementRef,e,n).withOffsetX(this.offsetX).withOffsetY(this.offsetY);return this._handlePositionChanges(r),r},t.prototype._handlePositionChanges=function(t){for(var e=this,n=1;n=0},t.prototype.isFocusable=function(t){return function(t){return!function(t){return function(t){return"input"==t.nodeName.toLowerCase()}(t)&&"hidden"==t.type}(t)&&(function(t){var e=t.nodeName.toLowerCase();return"input"===e||"select"===e||"button"===e||"textarea"===e}(t)||function(t){return function(t){return"a"==t.nodeName.toLowerCase()}(t)&&t.hasAttribute("href")}(t)||t.hasAttribute("contenteditable")||ho(t))}(t)&&!this.isDisabled(t)&&this.isVisible(t)},t}();function ho(t){if(!t.hasAttribute("tabindex")||void 0===t.tabIndex)return!1;var e=t.getAttribute("tabindex");return"-32768"!=e&&!(!e||isNaN(parseInt(e,10)))}function po(t){if(!ho(t))return null;var e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}var fo=function(){function t(t,e,n,r,i){void 0===i&&(i=!1),this._element=t,this._checker=e,this._ngZone=n,this._document=r,this._enabled=!0,i||this.attachAnchors()}return Object.defineProperty(t.prototype,"enabled",{get:function(){return this._enabled},set:function(t){this._enabled=t,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},t.prototype.attachAnchors=function(){var t=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){t._startAnchor.addEventListener("focus",function(){t.focusLastTabbableElement()}),t._endAnchor.addEventListener("focus",function(){t.focusFirstTabbableElement()}),t._element.parentNode&&(t._element.parentNode.insertBefore(t._startAnchor,t._element),t._element.parentNode.insertBefore(t._endAnchor,t._element.nextSibling))})},t.prototype.focusInitialElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusInitialElement())})})},t.prototype.focusFirstTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusFirstTabbableElement())})})},t.prototype.focusLastTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusLastTabbableElement())})})},t.prototype._getRegionBoundary=function(t){for(var e=this._element.querySelectorAll("[cdk-focus-region-"+t+"], [cdkFocusRegion"+t+"], [cdk-focus-"+t+"]"),n=0;n=0;n--){var r=1===e[n].nodeType?this._getLastTabbableElement(e[n]):null;if(r)return r}return null},t.prototype._createAnchor=function(){var t=this._document.createElement("div");return t.tabIndex=this._enabled?0:-1,t.classList.add("cdk-visually-hidden"),t.classList.add("cdk-focus-trap-anchor"),t},t.prototype._executeOnStable=function(t){this._ngZone.isStable?t():this._ngZone.onStable.asObservable().pipe(Object(Ti.a)(1)).subscribe(t)},t}(),_o=function(){function t(t,e,n){this._checker=t,this._ngZone=e,this._document=n}return t.prototype.create=function(t,e){return void 0===e&&(e=!1),new fo(t,this._checker,this._ngZone,this._document,e)},t}(),mo=function(){function t(t){this._items=t,this._activeItemIndex=-1,this._wrap=!1,this._letterKeyStream=new Nr.a,this._typeaheadSubscription=Lr.a.EMPTY,this._pressedLetters=[],this.tabOut=new Nr.a,this.change=new Nr.a}return t.prototype.withWrap=function(){return this._wrap=!0,this},t.prototype.withTypeAhead=function(t){var e=this;if(void 0===t&&(t=200),this._items.length&&this._items.some(function(t){return"function"!=typeof t.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(ur(function(t){return e._pressedLetters.push(t)}),so(t),pr(function(){return e._pressedLetters.length>0}),Object($n.a)(function(){return e._pressedLetters.join("")})).subscribe(function(t){for(var n=e._items.toArray(),r=1;r=65&&e<=90||e>=48&&e<=91)&&this._letterKeyStream.next(String.fromCharCode(e)))}this._pressedLetters=[],t.preventDefault()},Object.defineProperty(t.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),t.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},t.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},t.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},t.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},t.prototype.updateActiveItemIndex=function(t){this._activeItemIndex=t},t.prototype._setActiveItemByDelta=function(t,e){void 0===e&&(e=this._items.toArray()),this._wrap?this._setActiveInWrapMode(t,e):this._setActiveInDefaultMode(t,e)},t.prototype._setActiveInWrapMode=function(t,e){this._activeItemIndex=(this._activeItemIndex+t+e.length)%e.length,e[this._activeItemIndex].disabled?this._setActiveInWrapMode(t,e):this.setActiveItem(this._activeItemIndex)},t.prototype._setActiveInDefaultMode=function(t,e){this._setActiveItemByIndex(this._activeItemIndex+t,t,e)},t.prototype._setActiveItemByIndex=function(t,e,n){if(void 0===n&&(n=this._items.toArray()),n[t]){for(;n[t].disabled;)if(!n[t+=e])return;this.setActiveItem(t)}},t}(),go=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.setActiveItem=function(e){this.activeItem&&this.activeItem.setInactiveStyles(),t.prototype.setActiveItem.call(this,e),this.activeItem&&this.activeItem.setActiveStyles()},e}(mo);function yo(t,e){return(t.getAttribute(e)||"").match(/\S+/g)||[]}var vo=0,bo=new Map,wo=null,Mo=function(){function t(t){this._document=t}return t.prototype.describe=function(t,e){e.trim()&&(bo.has(e)||this._createMessageElement(e),this._isElementDescribedByMessage(t,e)||this._addMessageReference(t,e))},t.prototype.removeDescription=function(t,e){if(e.trim()){this._isElementDescribedByMessage(t,e)&&this._removeMessageReference(t,e);var n=bo.get(e);n&&0===n.referenceCount&&this._deleteMessageElement(e),wo&&0===wo.childNodes.length&&this._deleteMessagesContainer()}},t.prototype.ngOnDestroy=function(){for(var t=this._document.querySelectorAll("[cdk-describedby-host]"),e=0;e_s?_s:i:i}()),this.arr=t,this.idx=e,this.len=n}return t.prototype[Er.a]=function(){return this},t.prototype.next=function(){return this.idx=t.length?r.complete():(r.next(e[n]),t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(e.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:t});for(var o=0;o1?new Pr.a(t,n):new nr.a(n),e)}}var Ms=function(){},ks="*";function xs(t,e){return void 0===e&&(e=null),{type:2,steps:t,options:e}}function Ls(t){return{type:6,styles:t,offset:null}}function Cs(t){Promise.resolve(null).then(t)}var Ss=function(){function t(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.init=function(){},t.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},t.prototype.triggerMicrotask=function(){var t=this;Cs(function(){return t._onFinish()})},t.prototype._onStart=function(){this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[]},t.prototype.pause=function(){},t.prototype.restart=function(){},t.prototype.finish=function(){this._onFinish()},t.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){},t.prototype.setPosition=function(t){},t.prototype.getPosition=function(){return 0},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Ts=function(){function t(t){var e=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=t;var n=0,r=0,i=0,o=this.players.length;0==o?Cs(function(){return e._onFinish()}):this.players.forEach(function(t){t.onDone(function(){++n==o&&e._onFinish()}),t.onDestroy(function(){++r==o&&e._onDestroy()}),t.onStart(function(){++i==o&&e._onStart()})}),this.totalTime=this.players.reduce(function(t,e){return Math.max(t,e.totalTime)},0)}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.init=function(){this.players.forEach(function(t){return t.init()})},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[])},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(t){return t.play()})},t.prototype.pause=function(){this.players.forEach(function(t){return t.pause()})},t.prototype.restart=function(){this.players.forEach(function(t){return t.restart()})},t.prototype.finish=function(){this._onFinish(),this.players.forEach(function(t){return t.finish()})},t.prototype.destroy=function(){this._onDestroy()},t.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(t){return t.destroy()}),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){this.players.forEach(function(t){return t.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},t.prototype.setPosition=function(t){var e=t*this.totalTime;this.players.forEach(function(t){var n=t.totalTime?Math.min(1,e/t.totalTime):1;t.setPosition(n)})},t.prototype.getPosition=function(){var t=0;return this.players.forEach(function(e){var n=e.getPosition();t=Math.min(n,t)}),t},t.prototype.beforeDestroy=function(){this.players.forEach(function(t){t.beforeDestroy&&t.beforeDestroy()})},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Os="!",Ds=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0};function Ys(){throw Error("Attempting to attach dialog content after content is already attached")}var Ps=function(t){function e(e,n,i,o){var s=t.call(this)||this;return s._elementRef=e,s._focusTrapFactory=n,s._changeDetectorRef=i,s._document=o,s._elementFocusedBeforeDialogWasOpened=null,s._state="enter",s._animationStateChanged=new r.o,s._ariaLabelledBy=null,s}return Object(o.__extends)(e,t),e.prototype.attachComponentPortal=function(t){return this._portalOutlet.hasAttached()&&Ys(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(t)},e.prototype.attachTemplatePortal=function(t){return this._portalOutlet.hasAttached()&&Ys(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(t)},e.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},e.prototype._restoreFocus=function(){var t=this._elementFocusedBeforeDialogWasOpened;t&&"function"==typeof t.focus&&t.focus(),this._focusTrap&&this._focusTrap.destroy()},e.prototype._savePreviouslyFocusedElement=function(){var t=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return t._elementRef.nativeElement.focus()}))},e.prototype._onAnimationDone=function(t){"enter"===t.toState?this._trapFocus():"exit"===t.toState&&this._restoreFocus(),this._animationStateChanged.emit(t)},e.prototype._onAnimationStart=function(t){this._animationStateChanged.emit(t)},e.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},e}(ki),Es=0,As=function(){function t(t,e,n){void 0===n&&(n="mat-dialog-"+Es++);var r=this;this._overlayRef=t,this._containerInstance=e,this.id=n,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new Nr.a,this._afterClosed=new Nr.a,this._beforeClose=new Nr.a,e._animationStateChanged.pipe(pr(function(t){return"done"===t.phaseName&&"enter"===t.toState}),Object(Ti.a)(1)).subscribe(function(){r._afterOpen.next(),r._afterOpen.complete()}),e._animationStateChanged.pipe(pr(function(t){return"done"===t.phaseName&&"exit"===t.toState}),Object(Ti.a)(1)).subscribe(function(){r._overlayRef.dispose(),r._afterClosed.next(r._result),r._afterClosed.complete(),r.componentInstance=null})}return t.prototype.close=function(t){var e=this;this._result=t,this._containerInstance._animationStateChanged.pipe(pr(function(t){return"start"===t.phaseName}),Object(Ti.a)(1)).subscribe(function(){e._beforeClose.next(t),e._beforeClose.complete(),e._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},t.prototype.afterOpen=function(){return this._afterOpen.asObservable()},t.prototype.afterClosed=function(){return this._afterClosed.asObservable()},t.prototype.beforeClose=function(){return this._beforeClose.asObservable()},t.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},t.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},t.prototype.updatePosition=function(t){var e=this._getPositionStrategy();return t&&(t.left||t.right)?t.left?e.left(t.left):e.right(t.right):e.centerHorizontally(),t&&(t.top||t.bottom)?t.top?e.top(t.top):e.bottom(t.bottom):e.centerVertically(),this._overlayRef.updatePosition(),this},t.prototype.updateSize=function(t,e){return void 0===t&&(t="auto"),void 0===e&&(e="auto"),this._getPositionStrategy().width(t).height(e),this._overlayRef.updatePosition(),this},t.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},t}(),js=new r.r("MatDialogData"),Is=new r.r("mat-dialog-scroll-strategy");function Rs(t){return function(){return t.scrollStrategies.block()}}var Hs=function(){function t(t,e,n,r,i,o){var s=this;this._overlay=t,this._injector=e,this._scrollStrategy=r,this._parentDialog=i,this._overlayContainer=o,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new Nr.a,this._afterOpenAtThisLevel=new Nr.a,this._ariaHiddenElements=new Map,this.afterAllClosed=is(function(){return s.openDialogs.length?s._afterAllClosed:s._afterAllClosed.pipe(ws(void 0))}),!i&&n&&n.subscribe(function(){return s.closeAll()})}return Object.defineProperty(t.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_afterAllClosed",{get:function(){var t=this._parentDialog;return t?t._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),t.prototype.open=function(t,e){var n=this;if((e=function(t){return Object(o.__assign)({},new Ds,t)}(e)).id&&this.getDialogById(e.id))throw Error('Dialog with id "'+e.id+'" exists already. The dialog id must be unique.');var r=this._createOverlay(e),i=this._attachDialogContainer(r,e),s=this._attachDialogContent(t,i,r,e);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(s),s.afterClosed().subscribe(function(){return n._removeOpenDialog(s)}),this.afterOpen.next(s),s},t.prototype.closeAll=function(){for(var t=this.openDialogs.length;t--;)this.openDialogs[t].close()},t.prototype.getDialogById=function(t){return this.openDialogs.find(function(e){return e.id===t})},t.prototype._createOverlay=function(t){var e=this._getOverlayConfig(t);return this._overlay.create(e)},t.prototype._getOverlayConfig=function(t){var e=new Ei({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:t.panelClass,hasBackdrop:t.hasBackdrop,direction:t.direction,minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight});return t.backdropClass&&(e.backdropClass=t.backdropClass),e},t.prototype._attachDialogContainer=function(t,e){var n=new wi(Ps,e.viewContainerRef),r=t.attach(n);return r.instance._config=e,r.instance},t.prototype._attachDialogContent=function(t,e,n,i){var o=new As(n,e,i.id);if(i.hasBackdrop&&n.backdropClick().subscribe(function(){o.disableClose||o.close()}),n.keydownEvents().pipe(pr(function(t){return 27===t.keyCode&&!o.disableClose})).subscribe(function(){return o.close()}),t instanceof r.O)e.attachTemplatePortal(new Mi(t,null,{$implicit:i.data,dialogRef:o}));else{var s=this._createInjector(i,o,e),a=e.attachComponentPortal(new wi(t,void 0,s));o.componentInstance=a.instance}return o.updateSize(i.width,i.height).updatePosition(i.position),o},t.prototype._createInjector=function(t,e,n){var r=t&&t.viewContainerRef&&t.viewContainerRef.injector,i=new WeakMap;return i.set(As,e),i.set(Ps,n),i.set(js,t.data),i.set(gi,{value:t.direction,change:Object(ar.a)()}),new Si(r||this._injector,i)},t.prototype._removeOpenDialog=function(t){var e=this.openDialogs.indexOf(t);e>-1&&(this.openDialogs.splice(e,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(t,e){t?e.setAttribute("aria-hidden",t):e.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},t.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var t=this._overlayContainer.getContainerElement();if(t.parentElement)for(var e=t.parentElement.children,n=e.length-1;n>-1;n--){var r=e[n];r===t||"SCRIPT"===r.nodeName||"STYLE"===r.nodeName||r.hasAttribute("aria-live")||(this._ariaHiddenElements.set(r,r.getAttribute("aria-hidden")),r.setAttribute("aria-hidden","true"))}},t}(),Fs=function(){},Ns=function(){},Vs=ls.create,Bs=function(){function t(){}return Object.defineProperty(t.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t.prototype.reset=function(t){void 0===t&&(t=void 0),this.control&&this.control.reset(t)},t.prototype.hasError=function(t,e){return!!this.control&&this.control.hasError(t,e)},t.prototype.getError=function(t,e){return this.control?this.control.getError(t,e):null},t}(),zs=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),e}(Bs);function Ws(t){return null==t||0===t.length}var Us=new r.r("NgValidators"),Gs=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Js=function(){function t(){}return t.min=function(t){return function(e){if(Ws(e.value)||Ws(t))return null;var n=parseFloat(e.value);return!isNaN(n)&&nt?{max:{max:t,actual:e.value}}:null}},t.required=function(t){return Ws(t.value)?{required:!0}:null},t.requiredTrue=function(t){return!0===t.value?null:{required:!0}},t.email=function(t){return Gs.test(t.value)?null:{email:!0}},t.minLength=function(t){return function(e){if(Ws(e.value))return null;var n=e.value?e.value.length:0;return nt?{maxlength:{requiredLength:t,actualLength:n}}:null}},t.pattern=function(e){return e?("string"==typeof e?(r="^"+e+"$",n=new RegExp(r)):(r=e.toString(),n=e),function(t){if(Ws(t.value))return null;var e=t.value;return n.test(e)?null:{pattern:{requiredPattern:r,actualValue:e}}}):t.nullValidator;var n,r},t.nullValidator=function(t){return null},t.compose=function(t){if(!t)return null;var e=t.filter(qs);return 0==e.length?null:function(t){return Xs(function(t,n){return e.map(function(e){return e(t)})}(t))}},t.composeAsync=function(t){if(!t)return null;var e=t.filter(qs);return 0==e.length?null:function(t){var n=function(t,n){return e.map(function(e){return e(t)})}(t).map(Qs);return tr.call(sr(n),Xs)}},t}();function qs(t){return null!=t}function Qs(t){var e=Object(r._15)(t)?Vs(t):t;if(!Object(r._14)(e))throw new Error("Expected validator to return Promise or Observable.");return e}function Xs(t){var e=t.reduce(function(t,e){return null!=e?Object(o.__assign)({},t,e):t},{});return 0===Object.keys(e).length?null:e}var Ks=new r.r("NgValueAccessor"),Zs=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"checked",t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}(),$s=new r.r("CompositionEventMode"),ta=function(){function t(t,e,n){var r;this._renderer=t,this._elementRef=e,this._compositionMode=n,this.onChange=function(t){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(r=Pt()?Pt().getUserAgent():"",!/android (\d+)/.test(r.toLowerCase())))}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._handleInput=function(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)},t.prototype._compositionStart=function(){this._composing=!0},t.prototype._compositionEnd=function(t){this._composing=!1,this._compositionMode&&this.onChange(t)},t}();function ea(t){return t.validate?function(e){return t.validate(e)}:t}function na(t){return t.validate?function(e){return t.validate(e)}:t}var ra=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function ia(){throw new Error("unimplemented")}var oa=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._parent=null,e.name=null,e.valueAccessor=null,e._rawValidators=[],e._rawAsyncValidators=[],e}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"validator",{get:function(){return ia()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return ia()},enumerable:!0,configurable:!0}),e}(Bs),sa=function(){function t(){this._accessors=[]}return t.prototype.add=function(t,e){this._accessors.push([t,e])},t.prototype.remove=function(t){for(var e=this._accessors.length-1;e>=0;--e)if(this._accessors[e][1]===t)return void this._accessors.splice(e,1)},t.prototype.select=function(t){var e=this;this._accessors.forEach(function(n){e._isSameGroup(n,t)&&n[1]!==t&&n[1].fireUncheck(t.value)})},t.prototype._isSameGroup=function(t,e){return!!t[0].control&&t[0]._parent===e._control._parent&&t[1].name===e.name},t}(),aa=function(){function t(t,e,n,r){this._renderer=t,this._elementRef=e,this._registry=n,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return t.prototype.ngOnInit=function(){this._control=this._injector.get(oa),this._checkName(),this._registry.add(this._control,this)},t.prototype.ngOnDestroy=function(){this._registry.remove(this)},t.prototype.writeValue=function(t){this._state=t===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},t.prototype.registerOnChange=function(t){var e=this;this._fn=t,this.onChange=function(){t(e.value),e._registry.select(e)}},t.prototype.fireUncheck=function(t){this.writeValue(t)},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},t.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},t}(),la=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(t))},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function ua(t,e){return null==t?""+e:(e&&"object"==typeof e&&(e="Object"),(t+": "+e).slice(0,50))}var ca=function(){function t(t,e){this._renderer=t,this._elementRef=e,this._optionMap=new Map,this._idCounter=0,this.onChange=function(t){},this.onTouched=function(){},this._compareWith=r._16}return Object.defineProperty(t.prototype,"compareWith",{set:function(t){if("function"!=typeof t)throw new Error("compareWith must be a function, but received "+JSON.stringify(t));this._compareWith=t},enumerable:!0,configurable:!0}),t.prototype.writeValue=function(t){this.value=t;var e=this._getOptionId(t);null==e&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=ua(e,t);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){e.value=e._getOptionValue(n),t(e.value)}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._registerOption=function(){return(this._idCounter++).toString()},t.prototype._getOptionId=function(t){for(var e=0,n=Array.from(this._optionMap.keys());e-1)}}else e=function(t,e){t._setSelected(!1)};this._optionMap.forEach(e)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){var r=[];if(n.hasOwnProperty("selectedOptions"))for(var i=n.selectedOptions,o=0;o1?"path: '"+t.path.join(" -> ")+"'":t.path[0]?"name: '"+t.path+"'":"unspecified name attribute",new Error(e+" "+n)}function wa(t){return null!=t?Js.compose(t.map(ea)):null}function Ma(t){return null!=t?Js.composeAsync(t.map(na)):null}var ka=[Zs,la,ra,ca,pa,aa];function xa(t,e){t._syncPendingControls(),e.forEach(function(t){var e=t.control;"submit"===e.updateOn&&e._pendingChange&&(t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1)})}function La(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var Ca=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return _a(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return wa(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ma(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){},e}(zs),Sa=function(){function t(t){this._cd=t}return Object.defineProperty(t.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),t}(),Ta=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e}(Sa),Oa=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e}(Sa);function Da(t){var e=Pa(t)?t.validators:t;return Array.isArray(e)?wa(e):e||null}function Ya(t,e){var n=Pa(e)?e.asyncValidators:t;return Array.isArray(n)?Ma(n):n||null}function Pa(t){return null!=t&&!Array.isArray(t)&&"object"==typeof t}var Ea=function(){function t(t,e){this.validator=t,this.asyncValidator=e,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),t.prototype.setValidators=function(t){this.validator=Da(t)},t.prototype.setAsyncValidators=function(t){this.asyncValidator=Ya(t)},t.prototype.clearValidators=function(){this.validator=null},t.prototype.clearAsyncValidators=function(){this.asyncValidator=null},t.prototype.markAsTouched=function(t){void 0===t&&(t={}),this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)},t.prototype.markAsUntouched=function(t){void 0===t&&(t={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(t){t.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype.markAsDirty=function(t){void 0===t&&(t={}),this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)},t.prototype.markAsPristine=function(t){void 0===t&&(t={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(t){t.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype.markAsPending=function(t){void 0===t&&(t={}),this.status="PENDING",this._parent&&!t.onlySelf&&this._parent.markAsPending(t)},t.prototype.disable=function(t){void 0===t&&(t={}),this.status="DISABLED",this.errors=null,this._forEachChild(function(t){t.disable({onlySelf:!0})}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(!!t.onlySelf),this._onDisabledChange.forEach(function(t){return t(!0)})},t.prototype.enable=function(t){void 0===t&&(t={}),this.status="VALID",this._forEachChild(function(t){t.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors(!!t.onlySelf),this._onDisabledChange.forEach(function(t){return t(!1)})},t.prototype._updateAncestors=function(t){this._parent&&!t&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},t.prototype.setParent=function(t){this._parent=t},t.prototype.updateValueAndValidity=function(t){void 0===t&&(t={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)},t.prototype._updateTreeValidity=function(t){void 0===t&&(t={emitEvent:!0}),this._forEachChild(function(e){return e._updateTreeValidity(t)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})},t.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},t.prototype._runValidator=function(){return this.validator?this.validator(this):null},t.prototype._runAsyncValidator=function(t){var e=this;if(this.asyncValidator){this.status="PENDING";var n=Qs(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){return e.setErrors(n,{emitEvent:t})})}},t.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},t.prototype.setErrors=function(t,e){void 0===e&&(e={}),this.errors=t,this._updateControlsErrors(!1!==e.emitEvent)},t.prototype.get=function(t){return function(t,e,n){return null==e?null:(e instanceof Array||(e=e.split(".")),e instanceof Array&&0===e.length?null:e.reduce(function(t,e){return t instanceof ja?t.controls[e]||null:t instanceof Ia&&t.at(e)||null},t))}(this,t)},t.prototype.getError=function(t,e){var n=e?this.get(e):this;return n&&n.errors?n.errors[t]:null},t.prototype.hasError=function(t,e){return!!this.getError(t,e)},Object.defineProperty(t.prototype,"root",{get:function(){for(var t=this;t._parent;)t=t._parent;return t},enumerable:!0,configurable:!0}),t.prototype._updateControlsErrors=function(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)},t.prototype._initObservables=function(){this.valueChanges=new r.o,this.statusChanges=new r.o},t.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},t.prototype._anyControlsHaveStatus=function(t){return this._anyControls(function(e){return e.status===t})},t.prototype._anyControlsDirty=function(){return this._anyControls(function(t){return t.dirty})},t.prototype._anyControlsTouched=function(){return this._anyControls(function(t){return t.touched})},t.prototype._updatePristine=function(t){void 0===t&&(t={}),this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype._updateTouched=function(t){void 0===t&&(t={}),this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype._isBoxedValue=function(t){return"object"==typeof t&&null!==t&&2===Object.keys(t).length&&"value"in t&&"disabled"in t},t.prototype._registerOnCollectionChange=function(t){this._onCollectionChange=t},t.prototype._setUpdateStrategy=function(t){Pa(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)},t}(),Aa=function(t){function e(e,n,r){void 0===e&&(e=null);var i=t.call(this,Da(n),Ya(r,n))||this;return i._onChange=[],i._applyFormState(e),i._setUpdateStrategy(n),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i._initObservables(),i}return Object(o.__extends)(e,t),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this.value=this._pendingValue=t,this._onChange.length&&!1!==e.emitModelToViewChange&&this._onChange.forEach(function(t){return t(n.value,!1!==e.emitViewToModelChange)}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){void 0===e&&(e={}),this.setValue(t,e)},e.prototype.reset=function(t,e){void 0===t&&(t=null),void 0===e&&(e={}),this._applyFormState(t),this.markAsPristine(e),this.markAsUntouched(e),this.setValue(this.value,e),this._pendingChange=!1},e.prototype._updateValue=function(){},e.prototype._anyControls=function(t){return!1},e.prototype._allControlsDisabled=function(){return this.disabled},e.prototype.registerOnChange=function(t){this._onChange.push(t)},e.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},e.prototype.registerOnDisabledChange=function(t){this._onDisabledChange.push(t)},e.prototype._forEachChild=function(t){},e.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},e.prototype._applyFormState=function(t){this._isBoxedValue(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t},e}(Ea),ja=function(t){function e(e,n,r){var i=t.call(this,Da(n),Ya(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.__extends)(e,t),e.prototype.registerControl=function(t,e){return this.controls[t]?this.controls[t]:(this.controls[t]=e,e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange),e)},e.prototype.addControl=function(t,e){this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.removeControl=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],e&&this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.contains=function(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled},e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),Object.keys(t).forEach(function(r){n._throwIfControlMissing(r),n.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),Object.keys(t).forEach(function(r){n.controls[r]&&n.controls[r].patchValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this._reduceChildren({},function(t,e,n){return t[n]=e instanceof Aa?e.value:e.getRawValue(),t})},e.prototype._syncPendingControls=function(){var t=this._reduceChildren(!1,function(t,e){return!!e._syncPendingControls()||t});return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[t])throw new Error("Cannot find form control with name: "+t+".")},e.prototype._forEachChild=function(t){var e=this;Object.keys(this.controls).forEach(function(n){return t(e.controls[n],n)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){e.setParent(t),e._registerOnCollectionChange(t._onCollectionChange)})},e.prototype._updateValue=function(){this.value=this._reduceValue()},e.prototype._anyControls=function(t){var e=this,n=!1;return this._forEachChild(function(r,i){n=n||e.contains(i)&&t(r)}),n},e.prototype._reduceValue=function(){var t=this;return this._reduceChildren({},function(e,n,r){return(n.enabled||t.disabled)&&(e[r]=n.value),e})},e.prototype._reduceChildren=function(t,e){var n=t;return this._forEachChild(function(t,r){n=e(n,t,r)}),n},e.prototype._allControlsDisabled=function(){for(var t=0,e=Object.keys(this.controls);t0||this.disabled},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control with name: '"+n+"'.")})},e}(Ea),Ia=function(t){function e(e,n,r){var i=t.call(this,Da(n),Ya(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.__extends)(e,t),e.prototype.at=function(t){return this.controls[t]},e.prototype.push=function(t){this.controls.push(t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.insert=function(t,e){this.controls.splice(t,0,e),this._registerControl(e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.removeAt=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),e&&(this.controls.splice(t,0,e),this._registerControl(e)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(e.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),t.forEach(function(t,r){n._throwIfControlMissing(r),n.at(r).setValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),t.forEach(function(t,r){n.at(r)&&n.at(r).patchValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t=[]),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this.controls.map(function(t){return t instanceof Aa?t.value:t.getRawValue()})},e.prototype._syncPendingControls=function(){var t=this.controls.reduce(function(t,e){return!!e._syncPendingControls()||t},!1);return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(t))throw new Error("Cannot find form control at index "+t)},e.prototype._forEachChild=function(t){this.controls.forEach(function(e,n){t(e,n)})},e.prototype._updateValue=function(){var t=this;this.value=this.controls.filter(function(e){return e.enabled||t.disabled}).map(function(t){return t.value})},e.prototype._anyControls=function(t){return this.controls.some(function(e){return e.enabled&&t(e)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){return t._registerControl(e)})},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control at index: "+n+".")})},e.prototype._allControlsDisabled=function(){for(var t=0,e=this.controls;t0||this.disabled},e.prototype._registerControl=function(t){t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)},e}(Ea),Ra=Promise.resolve(null),Ha=function(t){function e(e,n){var i=t.call(this)||this;return i.submitted=!1,i._directives=[],i.ngSubmit=new r.o,i.form=new ja({},wa(e),Ma(n)),i}return Object(o.__extends)(e,t),e.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this;Ra.then(function(){var n=e._findContainer(t.path);t.control=n.registerControl(t.name,t.control),ma(t.control,t),t.control.updateValueAndValidity({emitEvent:!1}),e._directives.push(t)})},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){var e=this;Ra.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name),La(e._directives,t)})},e.prototype.addFormGroup=function(t){var e=this;Ra.then(function(){var n=e._findContainer(t.path),r=new ja({});ya(r,t),n.registerControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})},e.prototype.removeFormGroup=function(t){var e=this;Ra.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name)})},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){var n=this;Ra.then(function(){n.form.get(t.path).setValue(e)})},e.prototype.setValue=function(t){this.control.setValue(t)},e.prototype.onSubmit=function(t){return this.submitted=!0,xa(this.form,this._directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},e.prototype._findContainer=function(t){return t.pop(),t.length?this.form.get(t):this.form},e}(zs),Fa='\n
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Na='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Va=function(){function t(){}return t.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Fa)},t.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Na+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n
\n
\n \n
\n
')},t.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+Fa)},t.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Na)},t.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},t.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},t}(),Ba=function(t){function e(e,n){var i=t.call(this)||this;return i._validators=e,i._asyncValidators=n,i.submitted=!1,i.directives=[],i.form=null,i.ngSubmit=new r.o,i}return Object(o.__extends)(e,t),e.prototype.ngOnChanges=function(t){this._checkFormPresent(),t.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this.form.get(t.path);return ma(e,t),e.updateValueAndValidity({emitEvent:!1}),this.directives.push(t),e},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){La(this.directives,t)},e.prototype.addFormGroup=function(t){var e=this.form.get(t.path);ya(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormGroup=function(t){},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.addFormArray=function(t){var e=this.form.get(t.path);ya(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormArray=function(t){},e.prototype.getFormArray=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){this.form.get(t.path).setValue(e)},e.prototype.onSubmit=function(t){return this.submitted=!0,xa(this.form,this.directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._updateDomValue=function(){var t=this;this.directives.forEach(function(e){var n=t.form.get(e.path);e.control!==n&&(function(t,e){e.valueAccessor.registerOnChange(function(){return va(e)}),e.valueAccessor.registerOnTouched(function(){return va(e)}),e._rawValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),e._rawAsyncValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),t&&t._clearChangeFns()}(e.control,e),n&&ma(n,e),e.control=n)}),this.form._updateTreeValidity({emitEvent:!1})},e.prototype._updateRegistrations=function(){var t=this;this.form._registerOnCollectionChange(function(){return t._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},e.prototype._updateValidators=function(){var t=wa(this._validators);this.form.validator=Js.compose([this.form.validator,t]);var e=Ma(this._asyncValidators);this.form.asyncValidator=Js.composeAsync([this.form.asyncValidator,e])},e.prototype._checkFormPresent=function(){this.form||Va.missingFormException()},e}(zs),za=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.__extends)(e,t),e.prototype._checkParentType=function(){Ua(this._parent)&&Va.groupParentException()},e}(Ca),Wa=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.__extends)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return _a(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return wa(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ma(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){Ua(this._parent)&&Va.arrayParentException()},e}(zs);function Ua(t){return!(t instanceof za||t instanceof Ba||t instanceof Wa)}var Ga=function(t){function e(e,n,i,o){var s=t.call(this)||this;return s._added=!1,s.update=new r.o,s._parent=e,s._rawValidators=n||[],s._rawAsyncValidators=i||[],s.valueAccessor=function(t,e){if(!e)return null;var n=void 0,r=void 0,i=void 0;return e.forEach(function(e){var o;e.constructor===ta?n=e:(o=e,ka.some(function(t){return o.constructor===t})?(r&&ba(t,"More than one built-in value accessor matches form control with"),r=e):(i&&ba(t,"More than one custom value accessor matches form control with"),i=e))}),i||r||n||(ba(t,"No valid value accessor for form control with"),null)}(s,o),s}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"isDisabled",{set:function(t){Va.disabledAttrWarning()},enumerable:!0,configurable:!0}),e.prototype.ngOnChanges=function(t){this._added||this._setUpControl(),function(t,e){if(!t.hasOwnProperty("model"))return!1;var n=t.model;return!!n.isFirstChange()||!Object(r._16)(e,n.currentValue)}(t,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},e.prototype.viewToModelUpdate=function(t){this.viewModel=t,this.update.emit(t)},Object.defineProperty(e.prototype,"path",{get:function(){return _a(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return wa(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ma(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){!(this._parent instanceof za)&&this._parent instanceof Ca?Va.ngModelGroupException():this._parent instanceof za||this._parent instanceof Ba||this._parent instanceof Wa||Va.controlParentException()},e.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},e}(oa),Ja=function(){function t(){}return Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(t){this._required=null!=t&&!1!==t&&""+t!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),t.prototype.validate=function(t){return this.required?Js.required(t):null},t.prototype.registerOnValidatorChange=function(t){this._onChange=t},t}(),qa=function(){function t(){}return t.prototype.group=function(t,e){void 0===e&&(e=null);var n=this._reduceControls(t);return new ja(n,null!=e?e.validator:null,null!=e?e.asyncValidator:null)},t.prototype.control=function(t,e,n){return new Aa(t,e,n)},t.prototype.array=function(t,e,n){var r=this,i=t.map(function(t){return r._createControl(t)});return new Ia(i,e,n)},t.prototype._reduceControls=function(t){var e=this,n={};return Object.keys(t).forEach(function(r){n[r]=e._createControl(t[r])}),n},t.prototype._createControl=function(t){return t instanceof Aa||t instanceof ja||t instanceof Ia?t:Array.isArray(t)?this.control(t[0],t.length>1?t[1]:null,t.length>2?t[2]:null):this.control(t)},t}(),Qa=function(){},Xa=function(){},Ka=function(){},Za=n("5X6E"),$a=function(){function t(t,e){this.delay=t,this.scheduler=e}return t.prototype.call=function(t,e){return e.subscribe(new tl(t,this.delay,this.scheduler))},t}(),tl=function(t){function e(e,n,r){t.call(this,e),this.delay=n,this.scheduler=r,this.queue=[],this.active=!1,this.errored=!1}return Object(o.__extends)(e,t),e.dispatch=function(t){for(var e=t.source,n=e.queue,r=t.scheduler,i=t.destination;n.length>0&&n[0].time-r.now()<=0;)n.shift().notification.observe(i);if(n.length>0){var o=Math.max(0,n[0].time-r.now());this.schedule(t,o)}else e.active=!1},e.prototype._schedule=function(t){this.active=!0,this.add(t.schedule(e.dispatch,this.delay,{source:this,destination:this.destination,scheduler:t}))},e.prototype.scheduleNotification=function(t){if(!0!==this.errored){var e=this.scheduler,n=new el(e.now()+this.delay,t);this.queue.push(n),!1===this.active&&this._schedule(e)}},e.prototype._next=function(t){this.scheduleNotification(zr.createNext(t))},e.prototype._error=function(t){this.errored=!0,this.queue=[],this.destination.error(t)},e.prototype._complete=function(){this.scheduleNotification(zr.createComplete())},e}(lr.a),el=function(t,e){this.time=t,this.notification=e},nl=function(){};function rl(t){return Error("A hint was already declared for 'align=\""+t+"\"'.")}var il=0,ol=function(){function t(t,e,n){this._elementRef=t,this._changeDetectorRef=e,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+il++,this._labelOptions=n||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(t.prototype,"dividerColor",{get:function(){return this.color},set:function(t){this.color=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(t){this._hideRequiredMarker=Oi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(t){this._hintLabel=t,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(t){this.floatLabel=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(t){t!==this._floatLabel&&(this._floatLabel=t||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(ws(null)).subscribe(function(){t._validatePlaceholders(),t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()});var e=this._control.ngControl;e&&e.valueChanges&&e.valueChanges.subscribe(function(){t._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(ws(null)).subscribe(function(){t._processHints(),t._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(ws(null)).subscribe(function(){t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()})},t.prototype.ngAfterContentChecked=function(){this._validateControlChild()},t.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},t.prototype._shouldForward=function(t){var e=this._control?this._control.ngControl:null;return e&&e[t]},t.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},t.prototype._hasLabel=function(){return!!this._labelChild},t.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},t.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},t.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},t.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},t.prototype._animateAndLockLabel=function(){var t=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",si(this._label.nativeElement,"transitionend").pipe(Object(Ti.a)(1)).subscribe(function(){t._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},t.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},t.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},t.prototype._validateHints=function(){var t,e,n=this;this._hintChildren&&this._hintChildren.forEach(function(r){if("start"==r.align){if(t||n.hintLabel)throw rl("start");t=r}else if("end"==r.align){if(e)throw rl("end");e=r}})},t.prototype._syncDescribedByIds=function(){if(this._control){var t=[];if("hint"===this._getDisplayedMessages()){var e=this._hintChildren?this._hintChildren.find(function(t){return"start"===t.align}):null,n=this._hintChildren?this._hintChildren.find(function(t){return"end"===t.align}):null;e?t.push(e.id):this._hintLabel&&t.push(this._hintLabelId),n&&t.push(n.id)}else this._errorChildren&&(t=this._errorChildren.map(function(t){return t.id}));this._control.setDescribedByIds(t)}},t.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},t}(),sl=function(){},al=function(){},ll=function(){},ul=function(){},cl=function(t){function e(e,n,r){var i=t.call(this,e)||this;return i._platform=n,i._focusMonitor=r,i._isRoundButton=i._hasHostAttributes("mat-fab","mat-mini-fab"),i._isIconButton=i._hasHostAttributes("mat-icon-button"),i._focusMonitor.monitor(i._elementRef.nativeElement,!0),i}return Object(o.__extends)(e,t),e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},e.prototype.focus=function(){this._getHostElement().focus()},e.prototype._getHostElement=function(){return this._elementRef.nativeElement},e.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},e.prototype._hasHostAttributes=function(){for(var t=this,e=[],n=0;n1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},t}(),fl=function(t,e){this.added=t,this.removed=e},_l=function(){function t(){this._listeners=[]}return t.prototype.notify=function(t,e){for(var n=0,r=this._listeners;n0?this._ngZone.runOutsideAngular(function(){t._debouncer.pipe(so(t.debounce)).subscribe(function(e){return t.event.emit(e)})}):this._debouncer.subscribe(function(e){return t.event.emit(e)}),this._observer=this._ngZone.runOutsideAngular(function(){return t._mutationObserverFactory.create(function(e){t._debouncer.next(e)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},t.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},t}(),bl=function(){},wl=new r.r("mat-checkbox-click-action"),Ml=0,kl=function(){var t={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return t[t.Init]="Init",t[t.Checked]="Checked",t[t.Unchecked]="Unchecked",t[t.Indeterminate]="Indeterminate",t}(),xl=function(t){function e(e,n,i,o,s){var a=t.call(this,e)||this;return a._changeDetectorRef=n,a._focusMonitor=i,a._clickAction=s,a.ariaLabel="",a.ariaLabelledby=null,a._uniqueId="mat-checkbox-"+ ++Ml,a.id=a._uniqueId,a.labelPosition="after",a.name=null,a.change=new r.o,a.indeterminateChange=new r.o,a._rippleConfig={centered:!0,radius:25,speedFactor:1.5},a.onTouched=function(){},a._currentAnimationClass="",a._currentCheckState=kl.Init,a._checked=!1,a._indeterminate=!1,a._controlValueAccessorChangeFn=function(){},a.tabIndex=parseInt(o)||0,a}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Oi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(t){this.labelPosition="start"==t?"after":"before"},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this;this._focusMonitor.monitor(this._inputElement.nativeElement,!1).subscribe(function(e){return t._onInputFocusChange(e)})},e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(e.prototype,"checked",{get:function(){return this._checked},set:function(t){t!=this.checked&&(this._checked=t,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(t){var e=t!=this._indeterminate;this._indeterminate=t,e&&(this._transitionCheckState(this._indeterminate?kl.Indeterminate:this.checked?kl.Checked:kl.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),e.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},e.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},e.prototype.writeValue=function(t){this.checked=!!t},e.prototype.registerOnChange=function(t){this._controlValueAccessorChangeFn=t},e.prototype.registerOnTouched=function(t){this.onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck()},e.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},e.prototype._transitionCheckState=function(t){var e=this._currentCheckState,n=this._elementRef.nativeElement;e!==t&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(e,t),this._currentCheckState=t,this._currentAnimationClass.length>0&&n.classList.add(this._currentAnimationClass))},e.prototype._emitChangeEvent=function(){var t=new function(){};t.source=this,t.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(t)},e.prototype._onInputFocusChange=function(t){this._focusRipple||"keyboard"!==t?t||(this._removeFocusRipple(),this.onTouched()):this._focusRipple=this._ripple.launch(0,0,Object(o.__assign)({persistent:!0},this._rippleConfig))},e.prototype.toggle=function(){this.checked=!this.checked},e.prototype._onInputClick=function(t){var e=this;t.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){e._indeterminate=!1,e.indeterminateChange.emit(e._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?kl.Checked:kl.Unchecked),this._emitChangeEvent())},e.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},e.prototype._onInteractionEvent=function(t){t.stopPropagation()},e.prototype._getAnimationClassForCheckStateTransition=function(t,e){var n="";switch(t){case kl.Init:if(e===kl.Checked)n="unchecked-checked";else{if(e!=kl.Indeterminate)return"";n="unchecked-indeterminate"}break;case kl.Unchecked:n=e===kl.Checked?"unchecked-checked":"unchecked-indeterminate";break;case kl.Checked:n=e===kl.Unchecked?"checked-unchecked":"checked-indeterminate";break;case kl.Indeterminate:n=e===kl.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+n},e.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},e}(Io(Ao(jo(Eo(function(t){this._elementRef=t})),"accent"))),Ll=function(){},Cl=function(){function t(t){this.callback=t}return t.prototype.call=function(t,e){return e.subscribe(new Sl(t,this.callback))},t}(),Sl=function(t){function e(e,n){t.call(this,e),this.add(new Lr.a(n))}return Object(o.__extends)(e,t),e}(lr.a),Tl=n("3a3m");function Ol(t,e){return function(t,e){return Object(wr.a)(t,e,1)}(t,e)(this)}var Dl=function(){},Yl=function(){},Pl=function(){function t(t){var e=this;this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?function(){e.headers=new Map,t.split("\n").forEach(function(t){var n=t.indexOf(":");if(n>0){var r=t.slice(0,n),i=r.toLowerCase(),o=t.slice(n+1).trim();e.maybeSetNormalizedName(r,i),e.headers.has(i)?e.headers.get(i).push(o):e.headers.set(i,[o])}})}:function(){e.headers=new Map,Object.keys(t).forEach(function(n){var r=t[n],i=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(e.headers.set(i,r),e.maybeSetNormalizedName(n,i))})}:this.headers=new Map}return t.prototype.has=function(t){return this.init(),this.headers.has(t.toLowerCase())},t.prototype.get=function(t){this.init();var e=this.headers.get(t.toLowerCase());return e&&e.length>0?e[0]:null},t.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},t.prototype.getAll=function(t){return this.init(),this.headers.get(t.toLowerCase())||null},t.prototype.append=function(t,e){return this.clone({name:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({name:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({name:t,value:e,op:"d"})},t.prototype.maybeSetNormalizedName=function(t,e){this.normalizedNames.has(e)||this.normalizedNames.set(e,t)},t.prototype.init=function(){var e=this;this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(t){return e.applyUpdate(t)}),this.lazyUpdate=null))},t.prototype.copyFrom=function(t){var e=this;t.init(),Array.from(t.headers.keys()).forEach(function(n){e.headers.set(n,t.headers.get(n)),e.normalizedNames.set(n,t.normalizedNames.get(n))})},t.prototype.clone=function(e){var n=new t;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([e]),n},t.prototype.applyUpdate=function(t){var e=t.name.toLowerCase();switch(t.op){case"a":case"s":var n=t.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(t.name,e);var r=("a"===t.op?this.headers.get(e):void 0)||[];r.push.apply(r,n),this.headers.set(e,r);break;case"d":var i=t.value;if(i){var o=this.headers.get(e);if(!o)return;0===(o=o.filter(function(t){return-1===i.indexOf(t)})).length?(this.headers.delete(e),this.normalizedNames.delete(e)):this.headers.set(e,o)}else this.headers.delete(e),this.normalizedNames.delete(e)}},t.prototype.forEach=function(t){var e=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return t(e.normalizedNames.get(n),e.headers.get(n))})},t}(),El=function(){function t(){}return t.prototype.encodeKey=function(t){return Al(t)},t.prototype.encodeValue=function(t){return Al(t)},t.prototype.decodeKey=function(t){return decodeURIComponent(t)},t.prototype.decodeValue=function(t){return decodeURIComponent(t)},t}();function Al(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var jl=function(){function t(t){void 0===t&&(t={});var e,n,r,i=this;if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new El,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(e=t.fromString,n=this.encoder,r=new Map,e.length>0&&e.split("&").forEach(function(t){var e=t.indexOf("="),i=-1==e?[n.decodeKey(t),""]:[n.decodeKey(t.slice(0,e)),n.decodeValue(t.slice(e+1))],o=i[0],s=i[1],a=r.get(o)||[];a.push(s),r.set(o,a)}),r)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(function(e){var n=t.fromObject[e];i.map.set(e,Array.isArray(n)?n:[n])})):this.map=null}return t.prototype.has=function(t){return this.init(),this.map.has(t)},t.prototype.get=function(t){this.init();var e=this.map.get(t);return e?e[0]:null},t.prototype.getAll=function(t){return this.init(),this.map.get(t)||null},t.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},t.prototype.append=function(t,e){return this.clone({param:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({param:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({param:t,value:e,op:"d"})},t.prototype.toString=function(){var t=this;return this.init(),this.keys().map(function(e){var n=t.encoder.encodeKey(e);return t.map.get(e).map(function(e){return n+"="+t.encoder.encodeValue(e)}).join("&")}).join("&")},t.prototype.clone=function(e){var n=new t({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([e]),n},t.prototype.init=function(){var t=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(e){return t.map.set(e,t.cloneFrom.map.get(e))}),this.updates.forEach(function(e){switch(e.op){case"a":case"s":var n=("a"===e.op?t.map.get(e.param):void 0)||[];n.push(e.value),t.map.set(e.param,n);break;case"d":if(void 0===e.value){t.map.delete(e.param);break}var r=t.map.get(e.param)||[],i=r.indexOf(e.value);-1!==i&&r.splice(i,1),r.length>0?t.map.set(e.param,r):t.map.delete(e.param)}}),this.cloneFrom=null)},t}();function Il(t){return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer}function Rl(t){return"undefined"!=typeof Blob&&t instanceof Blob}function Hl(t){return"undefined"!=typeof FormData&&t instanceof FormData}var Fl=function(){function t(t,e,n,r){var i;if(this.url=e,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==n?n:null,i=r):i=n,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.params&&(this.params=i.params)),this.headers||(this.headers=new Pl),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=e;else{var s=e.indexOf("?");this.urlWithParams=e+(-1===s?"?":s=200&&this.status<300}}(),Bl=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=Nl.ResponseHeader,n}return Object(o.__extends)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(Vl),zl=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=Nl.Response,n.body=void 0!==e.body?e.body:null,n}return Object(o.__extends)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(Vl),Wl=function(t){function e(e){var n=t.call(this,e,0,"Unknown Error")||this;return n.name="HttpErrorResponse",n.ok=!1,n.message=n.status>=200&&n.status<300?"Http failure during parsing for "+(e.url||"(unknown url)"):"Http failure response for "+(e.url||"(unknown url)")+": "+e.status+" "+e.statusText,n.error=e.error||null,n}return Object(o.__extends)(e,t),e}(Vl);function Ul(t,e){return{body:e,headers:t.headers,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials}}var Gl=function(){function t(t){this.handler=t}return t.prototype.request=function(t,e,n){var r,i=this;if(void 0===n&&(n={}),t instanceof Fl)r=t;else{var o;o=n.headers instanceof Pl?n.headers:new Pl(n.headers);var s=void 0;n.params&&(s=n.params instanceof jl?n.params:new jl({fromObject:n.params})),r=new Fl(t,e,void 0!==n.body?n.body:null,{headers:o,params:s,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials})}var a=Ol.call(Object(ar.a)(r),function(t){return i.handler.handle(t)});if(t instanceof Fl||"events"===n.observe)return a;var l=mr.call(a,function(t){return t instanceof zl});switch(n.observe||"body"){case"body":switch(r.responseType){case"arraybuffer":return tr.call(l,function(t){if(null!==t.body&&!(t.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return t.body});case"blob":return tr.call(l,function(t){if(null!==t.body&&!(t.body instanceof Blob))throw new Error("Response is not a Blob.");return t.body});case"text":return tr.call(l,function(t){if(null!==t.body&&"string"!=typeof t.body)throw new Error("Response is not a string.");return t.body});case"json":default:return tr.call(l,function(t){return t.body})}case"response":return l;default:throw new Error("Unreachable: unhandled observe type "+n.observe+"}")}},t.prototype.delete=function(t,e){return void 0===e&&(e={}),this.request("DELETE",t,e)},t.prototype.get=function(t,e){return void 0===e&&(e={}),this.request("GET",t,e)},t.prototype.head=function(t,e){return void 0===e&&(e={}),this.request("HEAD",t,e)},t.prototype.jsonp=function(t,e){return this.request("JSONP",t,{params:(new jl).append(e,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},t.prototype.options=function(t,e){return void 0===e&&(e={}),this.request("OPTIONS",t,e)},t.prototype.patch=function(t,e,n){return void 0===n&&(n={}),this.request("PATCH",t,Ul(n,e))},t.prototype.post=function(t,e,n){return void 0===n&&(n={}),this.request("POST",t,Ul(n,e))},t.prototype.put=function(t,e,n){return void 0===n&&(n={}),this.request("PUT",t,Ul(n,e))},t}(),Jl=function(){function t(t,e){this.next=t,this.interceptor=e}return t.prototype.handle=function(t){return this.interceptor.intercept(t,this.next)},t}(),ql=new r.r("HTTP_INTERCEPTORS"),Ql=function(){function t(){}return t.prototype.intercept=function(t,e){return e.handle(t)},t}(),Xl=/^\)\]\}',?\n/,Kl=function(){},Zl=function(){function t(){}return t.prototype.build=function(){return new XMLHttpRequest},t}(),$l=function(){function t(t){this.xhrFactory=t}return t.prototype.handle=function(t){var e=this;if("JSONP"===t.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new s.a(function(n){var r=e.xhrFactory.build();if(r.open(t.method,t.urlWithParams),t.withCredentials&&(r.withCredentials=!0),t.headers.forEach(function(t,e){return r.setRequestHeader(t,e.join(","))}),t.headers.has("Accept")||r.setRequestHeader("Accept","application/json, text/plain, */*"),!t.headers.has("Content-Type")){var i=t.detectContentTypeHeader();null!==i&&r.setRequestHeader("Content-Type",i)}if(t.responseType){var o=t.responseType.toLowerCase();r.responseType="json"!==o?o:"text"}var s=t.serializeBody(),a=null,l=function(){if(null!==a)return a;var e=1223===r.status?204:r.status,n=r.statusText||"OK",i=new Pl(r.getAllResponseHeaders()),o=function(t){return"responseURL"in t&&t.responseURL?t.responseURL:/^X-Request-URL:/m.test(t.getAllResponseHeaders())?t.getResponseHeader("X-Request-URL"):null}(r)||t.url;return a=new Bl({headers:i,status:e,statusText:n,url:o})},u=function(){var e=l(),i=e.headers,o=e.status,s=e.statusText,a=e.url,u=null;204!==o&&(u="undefined"==typeof r.response?r.responseText:r.response),0===o&&(o=u?200:0);var c=o>=200&&o<300;if("json"===t.responseType&&"string"==typeof u){var d=u;u=u.replace(Xl,"");try{u=""!==u?JSON.parse(u):null}catch(t){u=d,c&&(c=!1,u={error:t,text:u})}}c?(n.next(new zl({body:u,headers:i,status:o,statusText:s,url:a||void 0})),n.complete()):n.error(new Wl({error:u,headers:i,status:o,statusText:s,url:a||void 0}))},c=function(t){var e=new Wl({error:t,status:r.status||0,statusText:r.statusText||"Unknown Error"});n.error(e)},d=!1,h=function(e){d||(n.next(l()),d=!0);var i={type:Nl.DownloadProgress,loaded:e.loaded};e.lengthComputable&&(i.total=e.total),"text"===t.responseType&&r.responseText&&(i.partialText=r.responseText),n.next(i)},p=function(t){var e={type:Nl.UploadProgress,loaded:t.loaded};t.lengthComputable&&(e.total=t.total),n.next(e)};return r.addEventListener("load",u),r.addEventListener("error",c),t.reportProgress&&(r.addEventListener("progress",h),null!==s&&r.upload&&r.upload.addEventListener("progress",p)),r.send(s),n.next({type:Nl.Sent}),function(){r.removeEventListener("error",c),r.removeEventListener("load",u),t.reportProgress&&(r.removeEventListener("progress",h),null!==s&&r.upload&&r.upload.removeEventListener("progress",p)),r.abort()}})},t}(),tu=new r.r("XSRF_COOKIE_NAME"),eu=new r.r("XSRF_HEADER_NAME"),nu=function(){},ru=function(){function t(t,e,n){this.doc=t,this.platform=e,this.cookieName=n,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return t.prototype.getToken=function(){if("server"===this.platform)return null;var t=this.doc.cookie||"";return t!==this.lastCookieString&&(this.parseCount++,this.lastToken=A(t,this.cookieName),this.lastCookieString=t),this.lastToken},t}(),iu=function(){function t(t,e){this.tokenService=t,this.headerName=e}return t.prototype.intercept=function(t,e){var n=t.url.toLowerCase();if("GET"===t.method||"HEAD"===t.method||n.startsWith("http://")||n.startsWith("https://"))return e.handle(t);var r=this.tokenService.getToken();return null===r||t.headers.has(this.headerName)||(t=t.clone({headers:t.headers.set(this.headerName,r)})),e.handle(t)},t}();function ou(t,e){return void 0===e&&(e=[]),e?e.reduceRight(function(t,e){return new Jl(t,e)},t):t}var su=function(){function t(){}return t.disable=function(){return{ngModule:t,providers:[{provide:iu,useClass:Ql}]}},t.withOptions=function(e){return void 0===e&&(e={}),{ngModule:t,providers:[e.cookieName?{provide:tu,useValue:e.cookieName}:[],e.headerName?{provide:eu,useValue:e.headerName}:[]]}},t}(),au=function(){};function lu(t){return Error('Unable to find icon with the name "'+t+'"')}function uu(t){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+t+'".')}var cu=function(t){this.url=t,this.svgElement=null},du=function(){function t(t,e,n){this._httpClient=t,this._sanitizer=e,this._document=n,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return t.prototype.addSvgIcon=function(t,e){return this.addSvgIconInNamespace("",t,e)},t.prototype.addSvgIconInNamespace=function(t,e,n){var r=fu(t,e);return this._svgIconConfigs.set(r,new cu(n)),this},t.prototype.addSvgIconSet=function(t){return this.addSvgIconSetInNamespace("",t)},t.prototype.addSvgIconSetInNamespace=function(t,e){var n=new cu(e),r=this._iconSetConfigs.get(t);return r?r.push(n):this._iconSetConfigs.set(t,[n]),this},t.prototype.registerFontClassAlias=function(t,e){return void 0===e&&(e=t),this._fontCssClassesByAlias.set(t,e),this},t.prototype.classNameForFontAlias=function(t){return this._fontCssClassesByAlias.get(t)||t},t.prototype.setDefaultFontSetClass=function(t){return this._defaultFontSetClass=t,this},t.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},t.prototype.getSvgIconFromUrl=function(t){var e=this,n=this._sanitizer.sanitize(r.K.RESOURCE_URL,t);if(!n)throw uu(t);var i=this._cachedIconsByUrl.get(n);return i?Object(ar.a)(pu(i)):this._loadSvgIconFromConfig(new cu(t)).pipe(ur(function(t){return e._cachedIconsByUrl.set(n,t)}),Object($n.a)(function(t){return pu(t)}))},t.prototype.getNamedSvgIcon=function(t,e){void 0===e&&(e="");var n=fu(e,t),r=this._svgIconConfigs.get(n);if(r)return this._getSvgFromConfig(r);var i=this._iconSetConfigs.get(e);return i?this._getSvgFromIconSetConfigs(t,i):Gn(lu(n))},t.prototype._getSvgFromConfig=function(t){return t.svgElement?Object(ar.a)(pu(t.svgElement)):this._loadSvgIconFromConfig(t).pipe(ur(function(e){return t.svgElement=e}),Object($n.a)(function(t){return pu(t)}))},t.prototype._getSvgFromIconSetConfigs=function(t,e){var n=this,i=this._extractIconWithNameFromAnySet(t,e);if(i)return Object(ar.a)(i);var o=e.filter(function(t){return!t.svgElement}).map(function(t){return n._loadSvgIconSetFromConfig(t).pipe(Qn(function(e){var i=n._sanitizer.sanitize(r.K.RESOURCE_URL,t.url);return console.log("Loading icon set URL: "+i+" failed: "+e),Object(ar.a)(null)}),ur(function(e){e&&(t.svgElement=e)}))});return sr(o).pipe(Object($n.a)(function(){var r=n._extractIconWithNameFromAnySet(t,e);if(!r)throw lu(t);return r}))},t.prototype._extractIconWithNameFromAnySet=function(t,e){for(var n=e.length-1;n>=0;n--){var r=e[n];if(r.svgElement){var i=this._extractSvgIconFromSet(r.svgElement,t);if(i)return i}}return null},t.prototype._loadSvgIconFromConfig=function(t){var e=this;return this._fetchUrl(t.url).pipe(Object($n.a)(function(t){return e._createSvgElementForSingleIcon(t)}))},t.prototype._loadSvgIconSetFromConfig=function(t){var e=this;return this._fetchUrl(t.url).pipe(Object($n.a)(function(t){return e._svgElementFromString(t)}))},t.prototype._createSvgElementForSingleIcon=function(t){var e=this._svgElementFromString(t);return this._setSvgAttributes(e),e},t.prototype._extractSvgIconFromSet=function(t,e){var n=t.querySelector("#"+e);if(!n)return null;var r=n.cloneNode(!0);if(r.id="","svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r));var i=this._svgElementFromString("");return i.appendChild(r),this._setSvgAttributes(i)},t.prototype._svgElementFromString=function(t){if(this._document||"undefined"!=typeof document){var e=(this._document||document).createElement("DIV");e.innerHTML=t;var n=e.querySelector("svg");if(!n)throw Error(" tag not found");return n}throw new Error("MatIconRegistry could not resolve document.")},t.prototype._toSvgElement=function(t){for(var e=this._svgElementFromString(""),n=0;n')}(),this._xPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"yPosition",{get:function(){return this._yPosition},set:function(t){"above"!==t&&"below"!==t&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(t){this._overlapTrigger=Oi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"panelClass",{set:function(t){t&&t.length&&(this._classList=t.split(" ").reduce(function(t,e){return t[e]=!0,t},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"classList",{get:function(){return this.panelClass},set:function(t){this.panelClass=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._keyManager=new xo(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return t.close.emit("keydown")})},t.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},t.prototype._hovered=function(){var t=this;return this.items?this.items.changes.pipe(ws(this.items),Object(Za.a)(function(t){return ci.a.apply(void 0,t.map(function(t){return t._hovered}))})):this._ngZone.onStable.asObservable().pipe(Object(Ti.a)(1),Object(Za.a)(function(){return t._hovered()}))},t.prototype._handleKeydown=function(t){switch(t.keyCode){case 27:this.closed.emit("keydown"),t.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(t)}},t.prototype.focusFirstItem=function(){this._keyManager.setFirstItemActive()},t.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},t.prototype.setPositionClasses=function(t,e){void 0===t&&(t=this.xPosition),void 0===e&&(e=this.yPosition),this._classList["mat-menu-before"]="before"===t,this._classList["mat-menu-after"]="after"===t,this._classList["mat-menu-above"]="above"===e,this._classList["mat-menu-below"]="below"===e},t.prototype.setElevation=function(t){var e="mat-elevation-z"+(2+t),n=Object.keys(this._classList).find(function(t){return t.startsWith("mat-elevation-z")});n&&n!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[e]=!0,this._previousElevation=e)},t.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},t.prototype._resetAnimation=function(){this._panelAnimationState="void"},t.prototype._onAnimationDone=function(t){"enter-start"===t.toState&&(this._panelAnimationState="enter")},t}(),Tu=new r.r("mat-menu-scroll-strategy");function Ou(t){return function(){return t.scrollStrategies.reposition()}}var Du=function(){function t(t,e,n,i,o,s,a){this._overlay=t,this._element=e,this._viewContainerRef=n,this._scrollStrategy=i,this._parentMenu=o,this._menuItemInstance=s,this._dir=a,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=Lr.a.EMPTY,this._positionSubscription=Lr.a.EMPTY,this._hoverSubscription=Lr.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new r.o,this.onMenuOpen=this.menuOpened,this.menuClosed=new r.o,this.onMenuClose=this.menuClosed,s&&(s._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(t.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(t){this.menu=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._checkMenu(),this.menu.close.subscribe(function(e){t._destroyMenu(),"click"===e&&t._parentMenu&&t._parentMenu.closed.emit(e)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(pr(function(e){return e===t._menuItemInstance})).subscribe(function(){t._openedByMouse=!0,t.openMenu()}))},t.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(t.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},t.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},t.prototype.openMenu=function(){var t=this;this._menuOpen||(this._createOverlay().attach(this._portal),this._closeSubscription=this._menuClosingActions().subscribe(function(){return t.closeMenu()}),this._initMenu(),this.menu instanceof Su&&this.menu._startAnimation())},t.prototype.closeMenu=function(){this.menu.close.emit()},t.prototype.focus=function(){this._element.nativeElement.focus()},t.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof Su&&this.menu._resetAnimation())},t.prototype._initMenu=function(){if(this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this._openedByMouse){var t=this._overlayRef.overlayElement.firstElementChild;t&&(this.menu.resetActiveItem(),t.focus())}else this.menu.focusFirstItem()},t.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var t=0,e=this.menu.parentMenu;e;)t++,e=e.parentMenu;this.menu.setElevation(t)}},t.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse&&this.triggersSubmenu()||this.focus(),this._openedByMouse=!1},t.prototype._setIsMenuOpen=function(t){this._menuOpen=t,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=t)},t.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},t.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new Mi(this.menu.templateRef,this._viewContainerRef);var t=this._getOverlayConfig();this._subscribeToPositions(t.positionStrategy),this._overlayRef=this._overlay.create(t)}return this._overlayRef},t.prototype._getOverlayConfig=function(){return new Ei({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},t.prototype._subscribeToPositions=function(t){var e=this;this._positionSubscription=t.onPositionChange.subscribe(function(t){e.menu.setPositionClasses("start"===t.connectionPair.overlayX?"after":"before","top"===t.connectionPair.overlayY?"below":"above")})},t.prototype._getPosition=function(){var t="before"===this.menu.xPosition?["end","start"]:["start","end"],e=t[0],n=t[1],r="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],i=r[0],o=r[1],s=[i,o],a=s[0],l=s[1],u=[e,n],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=e="before"===this.menu.xPosition?"start":"end",n=c="end"===e?"start":"end",h="bottom"===i?8:-8):this.menu.overlapTrigger||(a="top"===i?"bottom":"top",l="top"===o?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:e,originY:a},{overlayX:c,overlayY:i}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:n,originY:a},{overlayX:d,overlayY:i}).withFallbackPosition({originX:e,originY:l},{overlayX:c,overlayY:o},void 0,-h).withFallbackPosition({originX:n,originY:l},{overlayX:d,overlayY:o},void 0,-h)},t.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},t.prototype._menuClosingActions=function(){var t=this,e=this._overlayRef.backdropClick(),n=this._overlayRef.detachments(),r=this._parentMenu?this._parentMenu.close:Object(ar.a)(),i=this._parentMenu?this._parentMenu._hovered().pipe(pr(function(e){return e!==t._menuItemInstance}),pr(function(){return t._menuOpen})):Object(ar.a)();return Object(ci.a)(e,r,i,n)},t.prototype._handleMousedown=function(t){(function(t){return 0===t.buttons})(t)||(this._openedByMouse=!0,this.triggersSubmenu()&&t.preventDefault())},t.prototype._handleKeydown=function(t){var e=t.keyCode;this.triggersSubmenu()&&(39===e&&"ltr"===this.dir||37===e&&"rtl"===this.dir)&&this.openMenu()},t.prototype._handleClick=function(t){this.triggersSubmenu()?(t.stopPropagation(),this.openMenu()):this.toggleMenu()},t}(),Yu=function(){},Pu=0,Eu=new r.r("mat-select-scroll-strategy");function Au(t){return function(){return t.scrollStrategies.reposition()}}var ju=function(){},Iu=function(t){function e(e,n,i,o,s,a,l,u,c,d,h,p){var f=t.call(this,s,o,l,u,d)||this;return f._viewportRuler=e,f._changeDetectorRef=n,f._ngZone=i,f._dir=a,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(t,e){return t===e},f._uid="mat-select-"+Pu++,f._destroy=new Nr.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=is(function(){return f.options?ci.a.apply(void 0,f.options.map(function(t){return t.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Object(Ti.a)(1),Object(Za.a)(function(){return f.optionSelectionChanges}))}),f.openedChange=new r.o,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new r.o,f.change=f.selectionChange,f.valueChange=new r.o,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"placeholder",{get:function(){return this._placeholder},set:function(t){this._placeholder=t,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Oi(t),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"multiple",{get:function(){return this._multiple},set:function(t){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=Oi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"compareWith",{get:function(){return this._compareWith},set:function(t){if("function"!=typeof t)throw Error("`compareWith` must be a function.");this._compareWith=t,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(t){t!==this._value&&(this.writeValue(t),this._value=t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},set:function(t){this._id=t||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(pr(function(t){return t}),Object($n.a)(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(pr(function(t){return!t}),Object($n.a)(function(){}))},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._selectionModel=new pl(this.multiple,void 0,!1),this.stateChanges.next()},e.prototype.ngAfterContentInit=function(){var t=this;this._initKeyManager(),this.options.changes.pipe(ws(null),gu(this._destroy)).subscribe(function(){t._resetOptions(),t._initializeSelection()})},e.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},e.prototype.ngOnChanges=function(t){t.disabled&&this.stateChanges.next()},e.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},e.prototype.toggle=function(){this.panelOpen?this.close():this.open()},e.prototype.open=function(){var t=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Object(Ti.a)(1)).subscribe(function(){t._triggerFontSize&&t.overlayDir.overlayRef&&t.overlayDir.overlayRef.overlayElement&&(t.overlayDir.overlayRef.overlayElement.style.fontSize=t._triggerFontSize+"px")}))},e.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._changeDetectorRef.markForCheck(),this._onTouched(),this.focus())},e.prototype.writeValue=function(t){this.options&&this._setSelectionByValue(t)},e.prototype.registerOnChange=function(t){this._onChange=t},e.prototype.registerOnTouched=function(t){this._onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(e.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var t=this._selectionModel.selected.map(function(t){return t.viewValue});return this._isRtl()&&t.reverse(),t.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),e.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},e.prototype._handleKeydown=function(t){this.disabled||(this.panelOpen?this._handleOpenKeydown(t):this._handleClosedKeydown(t))},e.prototype._handleClosedKeydown=function(t){var e=t.keyCode;13===e||32===e||(this.multiple||t.altKey)&&(40===e||38===e)?(t.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(t)},e.prototype._handleOpenKeydown=function(t){var e=t.keyCode;if(36===e||35===e)t.preventDefault(),36===e?this._keyManager.setFirstItemActive():this._keyManager.setLastItemActive();else if(13!==e&&32!==e||!this._keyManager.activeItem){var n=40===e||38===e,r=this._keyManager.activeItemIndex;this._keyManager.onKeydown(t),this._multiple&&n&&t.shiftKey&&this._keyManager.activeItem&&this._keyManager.activeItemIndex!==r&&this._keyManager.activeItem._selectViaInteraction()}else t.preventDefault(),this._keyManager.activeItem._selectViaInteraction()},e.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},e.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},e.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},e.prototype._onBlur=function(){this.disabled||this.panelOpen||(this.focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},e.prototype._onAttached=function(){var t=this;this.overlayDir.positionChange.pipe(Object(Ti.a)(1)).subscribe(function(){t._changeDetectorRef.detectChanges(),t._calculateOverlayOffsetX(),t.panel.nativeElement.scrollTop=t._scrollTop})},e.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(e.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),e.prototype._initializeSelection=function(){var t=this;Promise.resolve().then(function(){t._setSelectionByValue(t.ngControl?t.ngControl.value:t._value)})},e.prototype._setSelectionByValue=function(t,e){var n=this;if(void 0===e&&(e=!1),this.multiple&&t){if(!Array.isArray(t))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),t.forEach(function(t){return n._selectValue(t,e)}),this._sortValues()}else{this._clearSelection();var r=this._selectValue(t,e);r&&this._keyManager.setActiveItem(this.options.toArray().indexOf(r))}this._changeDetectorRef.markForCheck()},e.prototype._selectValue=function(t,e){var n=this;void 0===e&&(e=!1);var i=this.options.find(function(e){try{return null!=e.value&&n._compareWith(e.value,t)}catch(t){return Object(r.Y)()&&console.warn(t),!1}});return i&&(e?i._selectViaInteraction():i.select(),this._selectionModel.select(i),this.stateChanges.next()),i},e.prototype._clearSelection=function(t){this._selectionModel.clear(),this.options.forEach(function(e){e!==t&&e.deselect()}),this.stateChanges.next()},e.prototype._initKeyManager=function(){var t=this;this._keyManager=new go(this.options).withTypeAhead(),this._keyManager.tabOut.pipe(gu(this._destroy)).subscribe(function(){return t.close()}),this._keyManager.change.pipe(gu(this._destroy)).subscribe(function(){t._panelOpen&&t.panel?t._scrollActiveOptionIntoView():t._panelOpen||t.multiple||!t._keyManager.activeItem||t._keyManager.activeItem._selectViaInteraction()})},e.prototype._resetOptions=function(){var t=this;this.optionSelectionChanges.pipe(gu(Object(ci.a)(this._destroy,this.options.changes)),pr(function(t){return t.isUserInput})).subscribe(function(e){t._onSelect(e.source),t.multiple||t.close()}),this._setOptionIds()},e.prototype._onSelect=function(t){var e=this._selectionModel.isSelected(t);this.multiple?(this._selectionModel.toggle(t),this.stateChanges.next(),e?t.deselect():t.select(),this._keyManager.setActiveItem(this._getOptionIndex(t)),this._sortValues()):(this._clearSelection(null==t.value?void 0:t),null==t.value?this._propagateChanges(t.value):(this._selectionModel.select(t),this.stateChanges.next())),e!==this._selectionModel.isSelected(t)&&this._propagateChanges()},e.prototype._sortValues=function(){var t=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(e){e.selected&&t._selectionModel.select(e)}),this.stateChanges.next())},e.prototype._propagateChanges=function(t){var e;e=this.multiple?this.selected.map(function(t){return t.value}):this.selected?this.selected.value:t,this._value=e,this.valueChange.emit(e),this._onChange(e),this.selectionChange.emit(new function(t,e){this.source=t,this.value=e}(this,e)),this._changeDetectorRef.markForCheck()},e.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(t){return t.id}).join(" ")},e.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},e.prototype._scrollActiveOptionIntoView=function(){var t=this._getItemHeight(),e=this._keyManager.activeItemIndex||0,n=(e+ts.countGroupLabelsBeforeOption(e,this.options,this.optionGroups))*t,r=this.panel.nativeElement.scrollTop;nr+256&&(this.panel.nativeElement.scrollTop=Math.max(0,n-256+t))},e.prototype.focus=function(){this._elementRef.nativeElement.focus()},e.prototype._getOptionIndex=function(t){return this.options.reduce(function(e,n,r){return void 0===e?t===n?r:void 0:e},void 0)},e.prototype._calculateOverlayPosition=function(){var t=this._getItemHeight(),e=this._getItemCount(),n=Math.min(e*t,256),r=e*t-n,i=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);i+=ts.countGroupLabelsBeforeOption(i,this.options,this.optionGroups);var o=n/2;this._scrollTop=this._calculateOverlayScroll(i,o,r),this._offsetY=this._calculateOverlayOffsetY(i,o,r),this._checkOverlayWithinViewport(r)},e.prototype._calculateOverlayScroll=function(t,e,n){var r=this._getItemHeight();return Math.min(Math.max(0,r*t-e+r/2),n)},Object.defineProperty(e.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),e.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},e.prototype._calculateOverlayOffsetX=function(){var t,e=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),r=this._isRtl(),i=this.multiple?60:32;if(this.multiple)t=44;else{var o=this._selectionModel.selected[0]||this.options.first;t=o&&o.group?32:16}r||(t*=-1);var s=0-(e.left+t-(r?i:0)),a=e.right+t-n.width+(r?0:i);s>0?t+=s+8:a>0&&(t-=a+8),this.overlayDir.offsetX=t,this.overlayDir.overlayRef.updatePosition()},e.prototype._calculateOverlayOffsetY=function(t,e,n){var r=this._getItemHeight(),i=(r-this._triggerRect.height)/2,o=Math.floor(256/r);return-1*(0===this._scrollTop?t*r:this._scrollTop===n?(t-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-256)%r):e-r/2)-i},e.prototype._checkOverlayWithinViewport=function(t){var e=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),r=this._triggerRect.top-8,i=n.height-this._triggerRect.bottom-8,o=Math.abs(this._offsetY),s=Math.min(this._getItemCount()*e,256)-o-this._triggerRect.height;s>i?this._adjustPanelUp(s,i):o>r?this._adjustPanelDown(o,r,t):this._transformOrigin=this._getOriginBasedOnOption()},e.prototype._adjustPanelUp=function(t,e){var n=Math.round(t-e);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},e.prototype._adjustPanelDown=function(t,e,n){var r=Math.round(t-e);if(this._scrollTop+=r,this._offsetY+=r,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")},e.prototype._getOriginBasedOnOption=function(){var t=this._getItemHeight(),e=(t-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-e+t/2)+"px 0px"},e.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},e.prototype._getItemHeight=function(){return 3*this._triggerFontSize},e.prototype.setDescribedByIds=function(t){this._ariaDescribedby=t.join(" ")},e.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(e.prototype,"shouldLabelFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),e}(jo(Io(Eo(function(t){return function(t){function e(){for(var e=[],n=0;n0&&i.afterOpened().subscribe(function(){return i._dismissAfter(r.duration)}),r.announcementMessage&&this._live.announce(r.announcementMessage,r.politeness),this._openedSnackBarRef=i,this._openedSnackBarRef},t.prototype.open=function(t,e,n){void 0===e&&(e="");var r=fc(n);return r.data={message:t,action:e},r.announcementMessage=t,this.openFromComponent(dc,r)},t.prototype.dismiss=function(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()},t.prototype._attachSnackBarContainer=function(t,e){var n=new wi(hc,e.viewContainerRef),r=t.attach(n);return r.instance.snackBarConfig=e,r.instance},t.prototype._attach=function(t,e){var n=this._createOverlay(e),r=this._attachSnackBarContainer(n,e),i=new lc(r,n),o=this._createInjector(e,i),s=new wi(t,void 0,o),a=r.attachComponentPortal(s);return i.instance=a.instance,this._breakpointObserver.observe("(max-width: 599px) and (orientation: portrait), (max-width: 959px) and (orientation: landscape)").pipe(gu(n.detachments().pipe(Object(Ti.a)(1)))).subscribe(function(t){t.matches?n.overlayElement.classList.add("mat-snack-bar-handset"):n.overlayElement.classList.remove("mat-snack-bar-handset")}),i},t.prototype._createOverlay=function(t){var e=new Ei;e.direction=t.direction;var n=this._overlay.position().global(),r="rtl"===t.direction,i="left"===t.horizontalPosition||"start"===t.horizontalPosition&&!r||"end"===t.horizontalPosition&&r,o=!i&&"center"!==t.horizontalPosition;return i?n.left("0"):o?n.right("0"):n.centerHorizontally(),"top"===t.verticalPosition?n.top("0"):n.bottom("0"),e.positionStrategy=n,this._overlay.create(e)},t.prototype._createInjector=function(t,e){var n=t&&t.viewContainerRef&&t.viewContainerRef.injector,r=new WeakMap;return r.set(lc,e),r.set(uc,t.data),new Si(n||this._injector,r)},t}();function fc(t){return Object(o.__assign)({},new cc,t)}var _c=function(){},mc=function(t){function e(e){t.call(this),this._value=e}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),e.prototype._subscribe=function(e){var n=t.prototype._subscribe.call(this,e);return n&&!n.closed&&e.next(this._value),n},e.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new Gr.a;return this._value},e.prototype.next=function(e){t.prototype.next.call(this,this._value=e)},e}(Nr.a),gc=function(){},yc=function(t){function e(e,n){var r=t.call(this,e)||this;return r._platform=n,r}return Object(o.__extends)(e,t),e.prototype.ngAfterViewInit=function(){var t=this;Object(r.Y)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return t._checkToolbarMixedModes()}))},e.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(t){return!(t.classList&&t.classList.contains("mat-toolbar-row"))}).filter(function(t){return t.nodeType!==Node.COMMENT_NODE}).some(function(t){return t.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},e}(Ao(function(t){this._elementRef=t})),vc=function(){};function bc(t){if("object"==typeof t&&(t=t._body),t.startsWith("400")||t.startsWith("403")){var e=t.split(" - ",2);return 2===e.length?e[1].charAt(0).toUpperCase()+e[1].slice(1):t}return t}function wc(t,e,n){void 0===n&&(n=3e5);var r=new cc;r.duration=n,t.open(bc(e),null,r)}var Mc=function(){function t(){this.forceEmitEvents=!1,this.action=new r.o,this.mouseOver=!1}return t.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},t.prototype.setLoading=function(){this.state=0},t.prototype.setSuccess=function(){var t=this;this.state=1,setTimeout(function(){return t.state=null},3e3)},t.prototype.setError=function(t){var e=this;this.error="string"==typeof t?t:bc(t._body),this.state=2,this.mouseOver&&setTimeout(function(){return e.tooltip.show()},50)},t.prototype.setDisabled=function(){this.disabled=!0},t.prototype.setEnabled=function(){this.disabled=!1},t.prototype.isLoading=function(){return 0===this.state},t.prototype.resetState=function(){return this.state=null,this.error="",this},t}(),kc=function(){function t(t,e,n,r){this.data=t,this.dialogRef=e,this.walletService=n,this.apiService=r,this.encrypt=!0,this.disableDismiss=!1}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.createWallet=function(){var t=this;this.form.valid&&!this.createButton.isLoading()&&(this.createButton.resetState(),this.createButton.setLoading(),this.cancelButton.setDisabled(),this.disableDismiss=!0,this.walletService.create(this.form.value.label,this.form.value.seed,this.scan,this.encrypt?this.form.value.password:null).subscribe(function(){return t.dialogRef.close()},function(e){t.createButton.setError(e),t.cancelButton.disabled=!1,t.disableDismiss=!1}))},t.prototype.generateSeed=function(t){var e=this;this.apiService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},t.prototype.setEncrypt=function(t){this.encrypt=t.checked,this.form.updateValueAndValidity()},t.prototype.initForm=function(){this.form=new ja({},[this.validatePasswords.bind(this),this.validateSeeds.bind(this)]),this.form.addControl("label",new Aa("",[Js.required])),this.form.addControl("seed",new Aa("",[Js.required])),this.form.addControl("confirm_seed",new Aa),this.form.addControl("password",new Aa),this.form.addControl("confirm_password",new Aa),this.data.create&&this.generateSeed(128),this.scan=100},t.prototype.validateSeeds=function(){return this.data.create&&this.form&&this.form.get("seed")&&this.form.get("confirm_seed")&&this.form.get("seed").value!==this.form.get("confirm_seed").value?{NotEqual:!0}:null},t.prototype.validatePasswords=function(){if(this.encrypt&&this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(!this.form.get("password").value)return{Required:!0};if(this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t}(),xc=function(){function t(t,e){this.walletService=t,this.dialog=e}return t.prototype.addWallet=function(t){var e=new Ds;e.width="566px",e.data={create:t},this.dialog.open(kc,e)},t.prototype.toggleWallet=function(t){t.opened=!t.opened},t}(),Lc=function(){function t(){this.switchVisible=!1,this.activeComponent=new mc(1)}return t.prototype.setActiveComponent=function(t){this.activeComponent.next(t)},t.prototype.showSwitch=function(t,e){this.switchVisible=!0,this.leftText=t,this.rightText=e},t.prototype.hideSwitch=function(){this.switchVisible=!1},t}(),Cc=function(t){return t[t.RightButton=0]="RightButton",t[t.LeftButton=1]="LeftButton",t}({}),Sc=function(){function t(){this.className="",this.onStateChange=new r.o,this.ButtonState=Cc}return t.prototype.onRightClick=function(){this.activeButton===Cc.LeftButton&&(this.activeButton=Cc.RightButton,this.onStateChange.emit(Cc.RightButton))},t.prototype.onLeftClick=function(){this.activeButton===Cc.RightButton&&(this.activeButton=Cc.LeftButton,this.onStateChange.emit(Cc.LeftButton))},t}(),Tc=function(){function t(t){var e=this;this.navbarService=t,this.showForm=!0,this.activeForms=Cc,this.subscription=t.activeComponent.subscribe(function(t){e.activeForm=t,e.formData=null})}return t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.onFormSubmitted=function(t){this.formData=t,this.showForm=!1},t.prototype.onBack=function(t){t&&(this.formData=null),this.showForm=!0},Object.defineProperty(t.prototype,"transaction",{get:function(){var t=this.formData.transaction;return t.from=this.formData.form.wallet.label,t.to=this.formData.to,t.balance=this.formData.amount,t},enumerable:!0,configurable:!0}),t}(),Oc=n("PJh5"),Dc=function(){function t(t,e){var n=this;this.walletService=t,this.navbarService=e,this.transactions=null,this.navbarSubscription=this.navbarService.activeComponent.subscribe(function(t){n.loadTransactions(t)})}return t.prototype.ngOnInit=function(){this.navbarService.showSwitch("pending-txs.my","pending-txs.all")},t.prototype.ngOnDestroy=function(){this.transactionsSubscription.unsubscribe(),this.navbarSubscription.unsubscribe(),this.navbarService.hideSwitch()},t.prototype.loadTransactions=function(t){var e=this,n=t===Cc.LeftButton?"pendingTransactions":"allPendingTransactions";this.transactions=null,this.transactionsSubscription&&this.transactionsSubscription.unsubscribe(),"pendingTransactions"===n&&this.walletService.startDataRefreshSubscription(),this.transactionsSubscription=this.walletService[n]().subscribe(function(t){e.transactions=e.mapTransactions(t)})},t.prototype.mapTransactions=function(t){return t.map(function(t){return t.transaction.timestamp=Oc(t.received).unix(),t.transaction}).map(function(t){return t.amount=t.outputs.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+parseFloat(e)},0),t})},t}();function Yc(){return bs()(this)}var Pc=function(){function t(t,e,n){this.predicate=t,this.thisArg=e,this.source=n}return t.prototype.call=function(t,e){return e.subscribe(new Ec(t,this.predicate,this.thisArg,this.source))},t}(),Ec=function(t){function e(e,n,r,i){t.call(this,e),this.predicate=n,this.thisArg=r,this.source=i,this.index=0,this.thisArg=r||this}return Object(o.__extends)(e,t),e.prototype.notifyComplete=function(t){this.destination.next(t),this.destination.complete()},e.prototype._next=function(t){var e=!1;try{e=this.predicate.call(this.thisArg,t,this.index++,this.source)}catch(t){return void this.destination.error(t)}e||this.notifyComplete(!1)},e.prototype._complete=function(){this.notifyComplete(!0)},e}(lr.a);function Ac(t,e){return function(t,e){return function(n){return n.lift(new Pc(t,e,n))}}(t,e)(this)}var jc=function(){function t(t,e,n,r){this.predicate=t,this.resultSelector=e,this.defaultValue=n,this.source=r}return t.prototype.call=function(t,e){return e.subscribe(new Ic(t,this.predicate,this.resultSelector,this.defaultValue,this.source))},t}(),Ic=function(t){function e(e,n,r,i,o){t.call(this,e),this.predicate=n,this.resultSelector=r,this.defaultValue=i,this.source=o,this.hasValue=!1,this.index=0,"undefined"!=typeof i&&(this.lastValue=i,this.hasValue=!0)}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e=this.index++;if(this.predicate)this._tryPredicate(t,e);else{if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryPredicate=function(t,e){var n;try{n=this.predicate(t,e,this.source)}catch(t){return void this.destination.error(t)}if(n){if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryResultSelector=function(t,e){var n;try{n=this.resultSelector(t,e)}catch(t){return void this.destination.error(t)}this.lastValue=n,this.hasValue=!0},e.prototype._complete=function(){var t=this.destination;this.hasValue?(t.next(this.lastValue),t.complete()):t.error(new gr)},e}(lr.a);function Rc(t,e,n){return function(t,e,n){return function(r){return r.lift(new jc(t,e,n,r))}}(t,e,n)(this)}function Hc(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(vs.a)(t)(this)}var Fc=n("/4Bh"),Nc=function(t,e){this.id=t,this.url=e},Vc=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationStart(id: "+this.id+", url: '"+this.url+"')"},e}(Nc),Bc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.urlAfterRedirects=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"')"},e}(Nc),zc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.reason=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationCancel(id: "+this.id+", url: '"+this.url+"')"},e}(Nc),Wc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.error=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationError(id: "+this.id+", url: '"+this.url+"', error: "+this.error+")"},e}(Nc),Uc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"RoutesRecognized(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Nc),Gc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"GuardsCheckStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Nc),Jc=function(t){function e(e,n,r,i,o){var s=t.call(this,e,n)||this;return s.urlAfterRedirects=r,s.state=i,s.shouldActivate=o,s}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"GuardsCheckEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+", shouldActivate: "+this.shouldActivate+")"},e}(Nc),qc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"ResolveStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Nc),Qc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"ResolveEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Nc),Xc=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadStart(path: "+this.route.path+")"},t}(),Kc=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadEnd(path: "+this.route.path+")"},t}(),Zc=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),$c=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),td=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),ed=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),nd="primary",rd=function(){function t(t){this.params=t||{}}return t.prototype.has=function(t){return this.params.hasOwnProperty(t)},t.prototype.get=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e[0]:e}return null},t.prototype.getAll=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e:[e]}return[]},Object.defineProperty(t.prototype,"keys",{get:function(){return Object.keys(this.params)},enumerable:!0,configurable:!0}),t}();function id(t){return new rd(t)}function od(t,e,n){var r=n.path.split("/");if(r.length>t.length)return null;if("full"===n.pathMatch&&(e.hasChildren()||r.length0?t[t.length-1]:null}function pd(t,e){for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)}function fd(t){var e=Hc.call(t);return Ac.call(e,function(t){return!0===t})}function _d(t){return Object(r._14)(t)?t:Object(r._15)(t)?Vs(Promise.resolve(t)):Object(ar.a)(t)}function md(t,e,n){return n?function(t,e){return cd(t,e)}(t.queryParams,e.queryParams)&&function t(e,n){if(!bd(e.segments,n.segments))return!1;if(e.numberOfChildren!==n.numberOfChildren)return!1;for(var r in n.children){if(!e.children[r])return!1;if(!t(e.children[r],n.children[r]))return!1}return!0}(t.root,e.root):function(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(function(n){return e[n]===t[n]})}(t.queryParams,e.queryParams)&&function t(e,n){return function e(n,r,i){if(n.segments.length>i.length)return!!bd(s=n.segments.slice(0,i.length),i)&&!r.hasChildren();if(n.segments.length===i.length){if(!bd(n.segments,i))return!1;for(var o in r.children){if(!n.children[o])return!1;if(!t(n.children[o],r.children[o]))return!1}return!0}var s=i.slice(0,n.segments.length),a=i.slice(n.segments.length);return!!bd(n.segments,s)&&!!n.children[nd]&&e(n.children[nd],r,a)}(e,n,n.segments)}(t.root,e.root)}var gd=function(){function t(t,e,n){this.root=t,this.queryParams=e,this.fragment=n}return Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=id(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return xd.serialize(this)},t}(),yd=function(){function t(t,e){var n=this;this.segments=t,this.children=e,this.parent=null,pd(e,function(t,e){return t.parent=n})}return t.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(t.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Ld(this)},t}(),vd=function(){function t(t,e){this.path=t,this.parameters=e}return Object.defineProperty(t.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=id(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Td(this)},t}();function bd(t,e){return t.length===e.length&&t.every(function(t,n){return t.path===e[n].path})}function wd(t,e){var n=[];return pd(t.children,function(t,r){r===nd&&(n=n.concat(e(t,r)))}),pd(t.children,function(t,r){r!==nd&&(n=n.concat(e(t,r)))}),n}var Md=function(){},kd=function(){function t(){}return t.prototype.parse=function(t){var e=new Ed(t);return new gd(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())},t.prototype.serialize=function(t){var e,n;return"/"+function t(e,n){if(!e.hasChildren())return Ld(e);if(n){var r=e.children[nd]?t(e.children[nd],!1):"",i=[];return pd(e.children,function(e,n){n!==nd&&i.push(n+":"+t(e,!1))}),i.length>0?r+"("+i.join("//")+")":r}var o=wd(e,function(n,r){return r===nd?[t(e.children[nd],!1)]:[r+":"+t(n,!1)]});return Ld(e)+"/("+o.join("//")+")"}(t.root,!0)+(e=t.queryParams,(n=Object.keys(e).map(function(t){var n=e[t];return Array.isArray(n)?n.map(function(e){return Cd(t)+"="+Cd(e)}).join("&"):Cd(t)+"="+Cd(n)})).length?"?"+n.join("&"):"")+("string"==typeof t.fragment?"#"+encodeURI(t.fragment):"")},t}(),xd=new kd;function Ld(t){return t.segments.map(function(t){return Td(t)}).join("/")}function Cd(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";")}function Sd(t){return decodeURIComponent(t)}function Td(t){return""+Cd(t.path)+(e=t.parameters,Object.keys(e).map(function(t){return";"+Cd(t)+"="+Cd(e[t])}).join(""));var e}var Od=/^[^\/()?;=&#]+/;function Dd(t){var e=t.match(Od);return e?e[0]:""}var Yd=/^[^=?&#]+/,Pd=/^[^?&#]+/,Ed=function(){function t(t){this.url=t,this.remaining=t}return t.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new yd([],{}):new yd([],this.parseChildren())},t.prototype.parseQueryParams=function(){var t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t},t.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURI(this.remaining):null},t.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());var e={};this.peekStartsWith("/(")&&(this.capture("/"),e=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(t.length>0||Object.keys(e).length>0)&&(n[nd]=new yd(t,e)),n},t.prototype.parseSegment=function(){var t=Dd(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(t),new vd(Sd(t),this.parseMatrixParams())},t.prototype.parseMatrixParams=function(){for(var t={};this.consumeOptional(";");)this.parseParam(t);return t},t.prototype.parseParam=function(t){var e=Dd(this.remaining);if(e){this.capture(e);var n="";if(this.consumeOptional("=")){var r=Dd(this.remaining);r&&this.capture(n=r)}t[Sd(e)]=Sd(n)}},t.prototype.parseQueryParam=function(t){var e,n=(e=this.remaining.match(Yd))?e[0]:"";if(n){this.capture(n);var r="";if(this.consumeOptional("=")){var i=function(t){var e=t.match(Pd);return e?e[0]:""}(this.remaining);i&&this.capture(r=i)}var o=Sd(n),s=Sd(r);if(t.hasOwnProperty(o)){var a=t[o];Array.isArray(a)||(t[o]=a=[a]),a.push(s)}else t[o]=s}},t.prototype.parseParens=function(t){var e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=Dd(this.remaining),r=this.remaining[n.length];if("/"!==r&&")"!==r&&";"!==r)throw new Error("Cannot parse url '"+this.url+"'");var i=void 0;n.indexOf(":")>-1?(i=n.substr(0,n.indexOf(":")),this.capture(i),this.capture(":")):t&&(i=nd);var o=this.parseChildren();e[i]=1===Object.keys(o).length?o[nd]:new yd([],o),this.consumeOptional("//")}return e},t.prototype.peekStartsWith=function(t){return this.remaining.startsWith(t)},t.prototype.consumeOptional=function(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)},t.prototype.capture=function(t){if(!this.consumeOptional(t))throw new Error('Expected "'+t+'".')},t}(),Ad=function(t){this.segmentGroup=t||null},jd=function(t){this.urlTree=t};function Id(t){return new s.a(function(e){return e.error(new Ad(t))})}function Rd(t){return new s.a(function(e){return e.error(new jd(t))})}function Hd(t){return new s.a(function(e){return e.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+t+"'"))})}var Fd=function(){function t(t,e,n,i,o){this.configLoader=e,this.urlSerializer=n,this.urlTree=i,this.config=o,this.allowRedirects=!0,this.ngModule=t.get(r.z)}return t.prototype.apply=function(){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,nd),n=tr.call(e,function(e){return t.createUrlTree(e,t.urlTree.queryParams,t.urlTree.fragment)});return Zn.call(n,function(e){if(e instanceof jd)return t.allowRedirects=!1,t.match(e.urlTree);if(e instanceof Ad)throw t.noMatchError(e);throw e})},t.prototype.match=function(t){var e=this,n=this.expandSegmentGroup(this.ngModule,this.config,t.root,nd),r=tr.call(n,function(n){return e.createUrlTree(n,t.queryParams,t.fragment)});return Zn.call(r,function(t){if(t instanceof Ad)throw e.noMatchError(t);throw t})},t.prototype.noMatchError=function(t){return new Error("Cannot match any routes. URL Segment: '"+t.segmentGroup+"'")},t.prototype.createUrlTree=function(t,e,n){var r,i=t.segments.length>0?new yd([],((r={})[nd]=t,r)):t;return new gd(i,e,n)},t.prototype.expandSegmentGroup=function(t,e,n,r){return 0===n.segments.length&&n.hasChildren()?tr.call(this.expandChildren(t,e,n),function(t){return new yd([],t)}):this.expandSegment(t,n,e,n.segments,r,!0)},t.prototype.expandChildren=function(t,e,n){var r=this;return function(n,i){if(0===Object.keys(n).length)return Object(ar.a)({});var o=[],s=[],a={};pd(n,function(n,i){var l=tr.call(r.expandSegmentGroup(t,e,n,i),function(t){return a[i]=t});i===nd?o.push(l):s.push(l)});var l=Yc.call(ar.a.apply(void 0,o.concat(s))),u=Rc.call(l);return tr.call(u,function(){return a})}(n.children)},t.prototype.expandSegment=function(t,e,n,r,i,o){var s=this,a=ar.a.apply(void 0,n),l=tr.call(a,function(a){var l=s.expandSegmentAgainstRoute(t,e,n,a,r,i,o);return Zn.call(l,function(t){if(t instanceof Ad)return Object(ar.a)(null);throw t})}),u=Yc.call(l),c=br.call(u,function(t){return!!t});return Zn.call(c,function(t,n){if(t instanceof gr||"EmptyError"===t.name){if(s.noLeftoversInUrl(e,r,i))return Object(ar.a)(new yd([],{}));throw new Ad(e)}throw t})},t.prototype.noLeftoversInUrl=function(t,e,n){return 0===e.length&&!t.children[n]},t.prototype.expandSegmentAgainstRoute=function(t,e,n,r,i,o,s){return zd(r)!==o?Id(e):void 0===r.redirectTo?this.matchSegmentAgainstRoute(t,e,r,i):s&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o):Id(e)},t.prototype.expandSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){return"**"===r.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,r,o):this.expandRegularSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o)},t.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(t,e,n,r){var i=this,o=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?Rd(o):Mr.call(this.lineralizeSegments(n,o),function(n){var o=new yd(n,{});return i.expandSegment(t,o,e,n,r,!1)})},t.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){var s=this,a=Nd(e,r,i),l=a.consumedSegments,u=a.lastChild,c=a.positionalParamSegments;if(!a.matched)return Id(e);var d=this.applyRedirectCommands(l,r.redirectTo,c);return r.redirectTo.startsWith("/")?Rd(d):Mr.call(this.lineralizeSegments(r,d),function(r){return s.expandSegment(t,e,n,r.concat(i.slice(u)),o,!1)})},t.prototype.matchSegmentAgainstRoute=function(t,e,n,r){var i=this;if("**"===n.path)return n.loadChildren?tr.call(this.configLoader.load(t.injector,n),function(t){return n._loadedConfig=t,new yd(r,{})}):Object(ar.a)(new yd(r,{}));var s=Nd(e,n,r),a=s.consumedSegments,l=s.lastChild;if(!s.matched)return Id(e);var u=r.slice(l),c=this.getChildConfig(t,n);return Mr.call(c,function(t){var n=t.module,r=t.routes,s=function(t,e,n,r){return n.length>0&&function(t,e,n){return r.some(function(n){return Bd(t,e,n)&&zd(n)!==nd})}(t,n)?{segmentGroup:Vd(new yd(e,function(t,e){var n={};n[nd]=e;for(var r=0,i=t;r1||!r.children[nd])return Hd(t.redirectTo);r=r.children[nd]}},t.prototype.applyRedirectCommands=function(t,e,n){return this.applyRedirectCreatreUrlTree(e,this.urlSerializer.parse(e),t,n)},t.prototype.applyRedirectCreatreUrlTree=function(t,e,n,r){var i=this.createSegmentGroup(t,e.root,n,r);return new gd(i,this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)},t.prototype.createQueryParams=function(t,e){var n={};return pd(t,function(t,r){if("string"==typeof t&&t.startsWith(":")){var i=t.substring(1);n[r]=e[i]}else n[r]=t}),n},t.prototype.createSegmentGroup=function(t,e,n,r){var i=this,o=this.createSegments(t,e.segments,n,r),s={};return pd(e.children,function(e,o){s[o]=i.createSegmentGroup(t,e,n,r)}),new yd(o,s)},t.prototype.createSegments=function(t,e,n,r){var i=this;return e.map(function(e){return e.path.startsWith(":")?i.findPosParam(t,e,r):i.findOrReturn(e,n)})},t.prototype.findPosParam=function(t,e,n){var r=n[e.path.substring(1)];if(!r)throw new Error("Cannot redirect to '"+t+"'. Cannot find '"+e.path+"'.");return r},t.prototype.findOrReturn=function(t,e){for(var n=0,r=0,i=e;r0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var r=(e.matcher||od)(n,t,e);return r?{matched:!0,consumedSegments:r.consumed,lastChild:r.consumed.length,positionalParamSegments:r.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function Vd(t){if(1===t.numberOfChildren&&t.children[nd]){var e=t.children[nd];return new yd(t.segments.concat(e.segments),e.children)}return t}function Bd(t,e,n){return(!(t.hasChildren()||e.length>0)||"full"!==n.pathMatch)&&""===n.path&&void 0!==n.redirectTo}function zd(t){return t.outlet||nd}var Wd=function(){function t(t){this._root=t}return Object.defineProperty(t.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),t.prototype.parent=function(t){var e=this.pathFromRoot(t);return e.length>1?e[e.length-2]:null},t.prototype.children=function(t){var e=Ud(t,this._root);return e?e.children.map(function(t){return t.value}):[]},t.prototype.firstChild=function(t){var e=Ud(t,this._root);return e&&e.children.length>0?e.children[0].value:null},t.prototype.siblings=function(t){var e=Gd(t,this._root);return e.length<2?[]:e[e.length-2].children.map(function(t){return t.value}).filter(function(e){return e!==t})},t.prototype.pathFromRoot=function(t){return Gd(t,this._root).map(function(t){return t.value})},t}();function Ud(t,e){if(t===e.value)return e;for(var n=0,r=e.children;n=1;){var i=n[r],s=n[r-1];if(i.routeConfig&&""===i.routeConfig.path)r--;else{if(s.component)break;r--}}return function(t){return t.reduce(function(t,e){return{params:Object(o.__assign)({},t.params,e.params),data:Object(o.__assign)({},t.data,e.data),resolve:Object(o.__assign)({},t.resolve,e._resolvedData)}},{params:{},data:{},resolve:{}})}(n.slice(r))}var $d=function(){function t(t,e,n,r,i,o,s,a,l,u,c){this.url=t,this.params=e,this.queryParams=n,this.fragment=r,this.data=i,this.outlet=o,this.component=s,this.routeConfig=a,this._urlSegment=l,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(t.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=id(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=id(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return"Route(url:'"+this.url.map(function(t){return t.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},t}(),th=function(t){function e(e,n){var r=t.call(this,n)||this;return r.url=e,eh(r,n),r}return Object(o.__extends)(e,t),e.prototype.toString=function(){return nh(this._root)},e}(Wd);function eh(t,e){e.value._routerState=t,e.children.forEach(function(e){return eh(t,e)})}function nh(t){var e=t.children.length>0?" { "+t.children.map(nh).join(", ")+" } ":"";return""+t.value+e}function rh(t){if(t.snapshot){var e=t.snapshot,n=t._futureSnapshot;t.snapshot=n,cd(e.queryParams,n.queryParams)||t.queryParams.next(n.queryParams),e.fragment!==n.fragment&&t.fragment.next(n.fragment),cd(e.params,n.params)||t.params.next(n.params),function(t,e){if(t.length!==e.length)return!1;for(var n=0;n0&&oh(n[0]))throw new Error("Root segment cannot have matrix parameters");var r=n.find(function(t){return"object"==typeof t&&null!=t&&t.outlets});if(r&&r!==hd(n))throw new Error("{outlets:{}} has to be the last command")}return t.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},t}(),lh=function(t,e,n){this.segmentGroup=t,this.processChildren=e,this.index=n};function uh(t){return"object"==typeof t&&null!=t&&t.outlets?t.outlets[nd]:""+t}function ch(t,e,n){if(t||(t=new yd([],{})),0===t.segments.length&&t.hasChildren())return dh(t,e,n);var r=function(t,e,n){for(var r=0,i=e,o={match:!1,pathIndex:0,commandIndex:0};i=n.length)return o;var s=t.segments[i],a=uh(n[r]),l=r0&&void 0===a)break;if(a&&l&&"object"==typeof l&&void 0===l.outlets){if(!_h(a,l,s))return o;r+=2}else{if(!_h(a,{},s))return o;r++}i++}return{match:!0,pathIndex:i,commandIndex:r}}(t,e,n),i=n.slice(r.commandIndex);if(r.match&&r.pathIndex=2?Object(Fc.a)(t,e)(this):Object(Fc.a)(t)(this)}).call(r,function(t,e){return t})},t.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},t.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},t.prototype.setupChildRouteGuards=function(t,e,n,r){var i=this,o=qd(e);t.children.forEach(function(t){i.setupRouteGuards(t,o[t.value.outlet],n,r.concat([t.value])),delete o[t.value.outlet]}),pd(o,function(t,e){return i.deactivateRouteAndItsChildren(t,n.getContext(e))})},t.prototype.setupRouteGuards=function(t,e,n,r){var i=t.value,o=e?e.value:null,s=n?n.getContext(t.value.outlet):null;if(o&&i.routeConfig===o.routeConfig){var a=this.shouldRunGuardsAndResolvers(o,i,i.routeConfig.runGuardsAndResolvers);a?this.canActivateChecks.push(new mh(r)):(i.data=o.data,i._resolvedData=o._resolvedData),this.setupChildRouteGuards(t,e,i.component?s?s.children:null:n,r),a&&this.canDeactivateChecks.push(new gh(s.outlet.component,o))}else o&&this.deactivateRouteAndItsChildren(e,s),this.canActivateChecks.push(new mh(r)),this.setupChildRouteGuards(t,null,i.component?s?s.children:null:n,r)},t.prototype.shouldRunGuardsAndResolvers=function(t,e,n){switch(n){case"always":return!0;case"paramsOrQueryParamsChange":return!ih(t,e)||!cd(t.queryParams,e.queryParams);case"paramsChange":default:return!ih(t,e)}},t.prototype.deactivateRouteAndItsChildren=function(t,e){var n=this,r=qd(t),i=t.value;pd(r,function(t,r){n.deactivateRouteAndItsChildren(t,i.component?e?e.children.getContext(r):null:e)}),this.canDeactivateChecks.push(new gh(i.component&&e&&e.outlet&&e.outlet.isActivated?e.outlet.component:null,i))},t.prototype.runCanDeactivateChecks=function(){var t=this,e=ys(this.canDeactivateChecks),n=Mr.call(e,function(e){return t.runCanDeactivate(e.component,e.route)});return Ac.call(n,function(t){return!0===t})},t.prototype.runCanActivateChecks=function(){var t=this,e=ys(this.canActivateChecks),n=Ol.call(e,function(e){return fd(ys([t.fireChildActivationStart(e.route.parent),t.fireActivationStart(e.route),t.runCanActivateChild(e.path),t.runCanActivate(e.route)]))});return Ac.call(n,function(t){return!0===t})},t.prototype.fireActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new td(t)),Object(ar.a)(!0)},t.prototype.fireChildActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new Zc(t)),Object(ar.a)(!0)},t.prototype.runCanActivate=function(t){var e=this,n=t.routeConfig?t.routeConfig.canActivate:null;return n&&0!==n.length?fd(tr.call(ys(n),function(n){var r,i=e.getToken(n,t);return r=_d(i.canActivate?i.canActivate(t,e.future):i(t,e.future)),br.call(r)})):Object(ar.a)(!0)},t.prototype.runCanActivateChild=function(t){var e=this,n=t[t.length-1],r=t.slice(0,t.length-1).reverse().map(function(t){return e.extractCanActivateChild(t)}).filter(function(t){return null!==t});return fd(tr.call(ys(r),function(t){return fd(tr.call(ys(t.guards),function(r){var i,o=e.getToken(r,t.node);return i=_d(o.canActivateChild?o.canActivateChild(n,e.future):o(n,e.future)),br.call(i)}))}))},t.prototype.extractCanActivateChild=function(t){var e=t.routeConfig?t.routeConfig.canActivateChild:null;return e&&0!==e.length?{node:t,guards:e}:null},t.prototype.runCanDeactivate=function(t,e){var n=this,r=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!r||0===r.length)return Object(ar.a)(!0);var i=Mr.call(ys(r),function(r){var i,o=n.getToken(r,e);return i=_d(o.canDeactivate?o.canDeactivate(t,e,n.curr,n.future):o(t,e,n.curr,n.future)),br.call(i)});return Ac.call(i,function(t){return!0===t})},t.prototype.runResolve=function(t,e){return tr.call(this.resolveNode(t._resolve,t),function(n){return t._resolvedData=n,t.data=Object(o.__assign)({},t.data,Zd(t,e).resolve),null})},t.prototype.resolveNode=function(t,e){var n=this,r=Object.keys(t);if(0===r.length)return Object(ar.a)({});if(1===r.length){var i=r[0];return tr.call(this.getResolver(t[i],e),function(t){return(e={})[i]=t,e;var e})}var o={},s=Mr.call(ys(r),function(r){return tr.call(n.getResolver(t[r],e),function(t){return o[r]=t,t})});return tr.call(Rc.call(s),function(){return o})},t.prototype.getResolver=function(t,e){var n=this.getToken(t,e);return _d(n.resolve?n.resolve(e,this.future):n(e,this.future))},t.prototype.getToken=function(t,e){var n=function(t){if(!t)return null;for(var e=t.parent;e;e=e.parent){var n=e.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(e);return(n?n.module.injector:this.moduleInjector).get(t)},t}(),vh=function(){},bh=function(){function t(t,e,n,r,i){this.rootComponentType=t,this.config=e,this.urlTree=n,this.url=r,this.paramsInheritanceStrategy=i}return t.prototype.recognize=function(){try{var t=kh(this.urlTree.root,[],[],this.config).segmentGroup,e=this.processSegmentGroup(this.config,t,nd),n=new $d([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},nd,this.rootComponentType,null,this.urlTree.root,-1,{}),r=new Jd(n,e),i=new th(this.url,r);return this.inheritParamsAndData(i._root),Object(ar.a)(i)}catch(t){return new s.a(function(e){return e.error(t)})}},t.prototype.inheritParamsAndData=function(t){var e=this,n=t.value,r=Zd(n,this.paramsInheritanceStrategy);n.params=Object.freeze(r.params),n.data=Object.freeze(r.data),t.children.forEach(function(t){return e.inheritParamsAndData(t)})},t.prototype.processSegmentGroup=function(t,e,n){return 0===e.segments.length&&e.hasChildren()?this.processChildren(t,e):this.processSegment(t,e,e.segments,n)},t.prototype.processChildren=function(t,e){var n,r=this,i=wd(e,function(e,n){return r.processSegmentGroup(t,e,n)});return n={},i.forEach(function(t){var e=n[t.value.outlet];if(e){var r=e.url.map(function(t){return t.toString()}).join("/"),i=t.value.url.map(function(t){return t.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+r+"' and '"+i+"'.")}n[t.value.outlet]=t.value}),i.sort(function(t,e){return t.value.outlet===nd?-1:e.value.outlet===nd?1:t.value.outlet.localeCompare(e.value.outlet)}),i},t.prototype.processSegment=function(t,e,n,r){for(var i=0,o=t;i0?hd(n).parameters:{};i=new $d(n,l,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,Ch(t),r,t.component,t,wh(e),Mh(e)+n.length,Sh(t))}else{var u=function(t,e,n){if(""===e.path){if("full"===e.pathMatch&&(t.hasChildren()||n.length>0))throw new vh;return{consumedSegments:[],lastChild:0,parameters:{}}}var r=(e.matcher||od)(n,t,e);if(!r)throw new vh;var i={};pd(r.posParams,function(t,e){i[e]=t.path});var s=r.consumed.length>0?Object(o.__assign)({},i,r.consumed[r.consumed.length-1].parameters):i;return{consumedSegments:r.consumed,lastChild:r.consumed.length,parameters:s}}(e,t,n);s=u.consumedSegments,a=n.slice(u.lastChild),i=new $d(s,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,Ch(t),r,t.component,t,wh(e),Mh(e)+s.length,Sh(t))}var c=function(t){return t.children?t.children:t.loadChildren?t._loadedConfig.routes:[]}(t),d=kh(e,s,a,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new Jd(i,f)]}if(0===c.length&&0===p.length)return[new Jd(i,[])];var _=this.processSegment(c,h,p,nd);return[new Jd(i,_)]},t}();function wh(t){for(var e=t;e._sourceSegment;)e=e._sourceSegment;return e}function Mh(t){for(var e=t,n=e._segmentIndexShift?e._segmentIndexShift:0;e._sourceSegment;)n+=(e=e._sourceSegment)._segmentIndexShift?e._segmentIndexShift:0;return n-1}function kh(t,e,n,r){if(n.length>0&&function(t,e,n){return r.some(function(n){return xh(t,e,n)&&Lh(n)!==nd})}(t,n)){var i=new yd(e,function(t,e,n,r){var i={};i[nd]=r,r._sourceSegment=t,r._segmentIndexShift=e.length;for(var o=0,s=n;o0)||"full"!==n.pathMatch)&&""===n.path&&void 0===n.redirectTo}function Lh(t){return t.outlet||nd}function Ch(t){return t.data||{}}function Sh(t){return t.resolve||{}}var Th=function(){},Oh=function(){function t(){}return t.prototype.shouldDetach=function(t){return!1},t.prototype.store=function(t,e){},t.prototype.shouldAttach=function(t){return!1},t.prototype.retrieve=function(t){return null},t.prototype.shouldReuseRoute=function(t,e){return t.routeConfig===e.routeConfig},t}(),Dh=new r.r("ROUTES"),Yh=function(){function t(t,e,n,r){this.loader=t,this.compiler=e,this.onLoadStartListener=n,this.onLoadEndListener=r}return t.prototype.load=function(t,e){var n=this;this.onLoadStartListener&&this.onLoadStartListener(e);var r=this.loadModuleFactory(e.loadChildren);return tr.call(r,function(r){n.onLoadEndListener&&n.onLoadEndListener(e);var i=r.create(t);return new sd(dd(i.injector.get(Dh)),i)})},t.prototype.loadModuleFactory=function(t){var e=this;return"string"==typeof t?Vs(this.loader.load(t)):Mr.call(_d(t()),function(t){return t instanceof r.x?Object(ar.a)(t):Vs(e.compiler.compileModuleAsync(t))})},t}(),Ph=function(){},Eh=function(){function t(){}return t.prototype.shouldProcessUrl=function(t){return!0},t.prototype.extract=function(t){return t},t.prototype.merge=function(t,e){return t},t}();function Ah(t){throw t}function jh(t){return Object(ar.a)(null)}var Ih=function(){function t(t,e,n,i,o,s,a,l){var u=this;this.rootComponentType=t,this.urlSerializer=e,this.rootContexts=n,this.location=i,this.config=l,this.navigations=new mc(null),this.navigationId=0,this.events=new Nr.a,this.errorHandler=Ah,this.navigated=!1,this.hooks={beforePreactivation:jh,afterPreactivation:jh},this.urlHandlingStrategy=new Eh,this.routeReuseStrategy=new Oh,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=o.get(r.z),this.resetConfig(l),this.currentUrlTree=new gd(new yd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new Yh(s,a,function(t){return u.triggerEvent(new Xc(t))},function(t){return u.triggerEvent(new Kc(t))}),this.routerState=Xd(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return t.prototype.resetRootComponentType=function(t){this.rootComponentType=t,this.routerState.root.component=this.rootComponentType},t.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},t.prototype.setUpLocationChangeListener=function(){var t=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(e){var n=t.urlSerializer.parse(e.url),r="popstate"===e.type?"popstate":"hashchange";setTimeout(function(){t.scheduleNavigation(n,r,{replaceUrl:!0})},0)})))},Object.defineProperty(t.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),t.prototype.triggerEvent=function(t){this.events.next(t)},t.prototype.resetConfig=function(t){ad(t),this.config=t,this.navigated=!1},t.prototype.ngOnDestroy=function(){this.dispose()},t.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},t.prototype.createUrlTree=function(t,e){void 0===e&&(e={});var n=e.relativeTo,i=e.queryParams,s=e.fragment,a=e.preserveQueryParams,l=e.queryParamsHandling,u=e.preserveFragment;Object(r.Y)()&&a&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=n||this.routerState.root,d=u?this.currentUrlTree.fragment:s,h=null;if(l)switch(l){case"merge":h=Object(o.__assign)({},this.currentUrlTree.queryParams,i);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=i||null}else h=a?this.currentUrlTree.queryParams:i||null;return null!==h&&(h=this.removeEmptyProps(h)),function(t,e,n,r,i){if(0===n.length)return sh(e.root,e.root,e,r,i);var o=function(t){if("string"==typeof t[0]&&1===t.length&&"/"===t[0])return new ah(!0,0,t);var e=0,n=!1,r=t.reduce(function(t,r,i){if("object"==typeof r&&null!=r){if(r.outlets){var o={};return pd(r.outlets,function(t,e){o[e]="string"==typeof t?t.split("/"):t}),t.concat([{outlets:o}])}if(r.segmentPath)return t.concat([r.segmentPath])}return"string"!=typeof r?t.concat([r]):0===i?(r.split("/").forEach(function(r,i){0==i&&"."===r||(0==i&&""===r?n=!0:".."===r?e++:""!=r&&t.push(r))}),t):t.concat([r])},[]);return new ah(n,e,r)}(n);if(o.toRoot())return sh(e.root,new yd([],{}),e,r,i);var s=function(t,n,r){if(t.isAbsolute)return new lh(e.root,!0,0);if(-1===r.snapshot._lastPathIndex)return new lh(r.snapshot._urlSegment,!0,0);var i=oh(t.commands[0])?0:1;return function(e,n,o){for(var s=r.snapshot._urlSegment,a=r.snapshot._lastPathIndex+i,l=t.numberOfDoubleDots;l>a;){if(l-=a,!(s=s.parent))throw new Error("Invalid number of '../'");a=s.segments.length}return new lh(s,!1,a-l)}()}(o,0,t),a=s.processChildren?dh(s.segmentGroup,s.index,o.commands):ch(s.segmentGroup,s.index,o.commands);return sh(s.segmentGroup,a,e,r,i)}(c,this.currentUrlTree,t,h,d)},t.prototype.navigateByUrl=function(t,e){void 0===e&&(e={skipLocationChange:!1});var n=t instanceof gd?t:this.parseUrl(t),r=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(r,"imperative",e)},t.prototype.navigate=function(t,e){return void 0===e&&(e={skipLocationChange:!1}),function(t){for(var e=0;e0)return!n||t.address===n}),t}).filter(function(t){return t.addresses.length>0})})},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ds;n.data={address:e},this.dialog.open(dp,n)},t}(),pp=function(){function t(t,e,n){var r=this;this.apiService=t,this.walletService=e,this.ngZone=n,this.progressSubject=new mc(null),this.refreshedBalance=!1,this.ngZone.runOutsideAngular(function(){s.a.timer(0,2e3).flatMap(function(){return r.getBlockchainProgress()}).takeWhile(function(t){return!t.current||t.current!==t.highest}).subscribe(function(t){return r.ngZone.run(function(){r.progressSubject.next(t),r.refreshedBalance||(r.walletService.refreshBalances(),r.refreshedBalance=!0)})},function(t){return console.log(t)},function(){return r.ngZone.run(function(){return r.completeLoading()})})})}return Object.defineProperty(t.prototype,"progress",{get:function(){return this.progressSubject.asObservable()},enumerable:!0,configurable:!0}),t.prototype.block=function(t){var e=this;return this.apiService.get("blocks",{start:t,end:t}).map(function(t){return t.blocks[0]}).flatMap(function(t){return s.a.forkJoin(t.body.txns.map(function(t){return t.inputs&&!t.inputs.length?s.a.of(t):s.a.forkJoin(t.inputs.map(function(t){return e.retrieveInputAddress(t).map(function(t){return t.owner_address})})).map(function(e){return t.inputs=e,t})})).map(function(e){return t.body.txns=e,t})})},t.prototype.blocks=function(t){return void 0===t&&(t=5100),this.apiService.get("last_blocks",{num:t}).map(function(t){return t.blocks.reverse()})},t.prototype.lastBlock=function(){return this.blocks(1).map(function(t){return t[0]})},t.prototype.getBlockchainProgress=function(){return this.apiService.get("blockchain/progress")},t.prototype.coinSupply=function(){return this.apiService.get("coinSupply")},t.prototype.completeLoading=function(){this.progressSubject.next({current:999999999999,highest:999999999999}),this.walletService.refreshBalances()},t.prototype.retrieveInputAddress=function(t){return this.apiService.get("uxout",{uxid:t})},t}(),fp=function(){function t(t){this.blockchainService=t}return t.prototype.ngOnInit=function(){var t=this;this.blockchainService.lastBlock().subscribe(function(e){return t.block=e}),this.blockchainService.coinSupply().subscribe(function(e){return t.coinSupply=e})},t}(),_p=function(){function t(t,e){this.data=t,this.dialogRef=e}return t.prototype.ngOnDestroy=function(){this.data.seed=null},t}(),mp=n("YKDW"),gp=function(){function t(t,e,n,r){var i=this;this.data=t,this.dialogRef=e,this.snackbar=n,this.translateService=r,this.passwordSubmit=new Nr.a,this.disableDismiss=!1,this.subscriptions=[],this.data=Object.assign({confirm:!1,description:null,title:null},t||{}),this.translateService.get(["errors.incorrect-password","errors.api-disabled","errors.no-wallet"]).subscribe(function(t){i.errors=t})}return t.prototype.ngOnInit=function(){var t=this;this.form=new ja({},this.validateForm.bind(this)),this.form.addControl("password",new Aa("")),this.form.addControl("confirm_password",new Aa("")),["password","confirm_password"].forEach(function(e){t.subscriptions.push(t.form.get(e).valueChanges.subscribe(function(){2===t.button.state&&t.button.resetState()}))}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},t.prototype.ngOnDestroy=function(){this.form.get("password").setValue(""),this.form.get("confirm_password").setValue(""),this.passwordSubmit.complete(),this.subscriptions.forEach(function(t){return t.unsubscribe()})},t.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.disableDismiss=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}))},t.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t.prototype.close=function(){this.dialogRef.close()},t.prototype.error=function(t){if("object"==typeof t)switch(t.status){case 400:t=bc(t._body);break;case 401:t=this.errors["errors.incorrect-password"];break;case 403:t=this.errors["errors.api-disabled"];break;case 404:t=this.errors["errors.no-wallet"];break;default:wc(this.snackbar,t,5e3)}this.button.setError(t||this.errors["errors.incorrect-password"]),this.disableDismiss=!1},t}(),yp=function(){function t(t,e){this.walletService=t,this.dialog=e,this.wallets=[]}return t.prototype.ngOnInit=function(){var t=this;this.walletService.folder().subscribe(function(e){return t.folder=e}),this.walletSubscription=this.walletService.all().subscribe(function(e){t.wallets=e})},t.prototype.ngOnDestroy=function(){this.walletSubscription.unsubscribe()},Object.defineProperty(t.prototype,"onlyEncrypted",{get:function(){return this.wallets.filter(function(t){return t.encrypted})},enumerable:!0,configurable:!0}),t.prototype.showSeed=function(t){var e=this;this.dialog.open(gp).componentInstance.passwordSubmit.subscribe(function(n){e.walletService.getWalletSeed(t,n.password).subscribe(function(t){n.close();var r=new Ds;r.width="566px",r.data={seed:t},e.dialog.open(_p,r)},function(t){return n.error(t)})})},t}(),vp=function(t){function e(e,n){void 0===e&&(e=0),void 0===n&&(n=Tr),t.call(this),this.period=e,this.scheduler=n,(!kr(e)||e<0)&&(this.period=0),n&&"function"==typeof n.schedule||(this.scheduler=Tr)}return Object(o.__extends)(e,t),e.create=function(t,n){return void 0===t&&(t=0),void 0===n&&(n=Tr),new e(t,n)},e.dispatch=function(t){var e=t.subscriber,n=t.period;e.next(t.index),e.closed||(t.index+=1,this.schedule(t,n))},e.prototype._subscribe=function(t){var n=this.period;t.add(this.scheduler.schedule(e.dispatch,n,{index:0,subscriber:t,period:n}))},e}(s.a),bp=function(){function t(t){this.apiService=t,this.automaticPeers=new mc([]),this.loadData()}return t.prototype.automatic=function(){return this.automaticPeers.asObservable()},t.prototype.retrieveDefaultConnections=function(){return this.apiService.get("network/defaultConnections").map(function(t){return t.map(function(t,e){return{id:e+1,address:t,listen_port:3e4}})})},t.prototype.loadData=function(){var t=this;this.retrieveConnections().subscribe(function(e){return t.automaticPeers.next(e)}),vp.create(5e3).flatMap(function(){return t.retrieveConnections()}).subscribe(function(e){return t.automaticPeers.next(e)})},t.prototype.retrieveConnections=function(){return this.apiService.get("network/connections").map(function(t){return t.connections.sort(function(t,e){return t.id-e.id})})},t}(),wp=function(){function t(t){this.networkService=t}return t.prototype.ngOnInit=function(){var t=this;this.networkService.retrieveDefaultConnections().subscribe(function(e){t.subscription=t.networkService.automatic().first().subscribe(function(n){t.peers=n.map(function(t){return t.source=e.find(function(e){return e.address===t.address})?"default":"exchange",t}).sort(function(t,e){return t.address.localeCompare(e.address)})})})},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t}(),Mp=function(){function t(t,e){this.httpClient=t,this.walletService=e,this.configSubject=new mc(null),this.purchaseOrders=new mc([]),this.purchaseUrl=i.tellerUrl,this.getConfig()}return t.prototype.all=function(){return this.purchaseOrders.asObservable()},t.prototype.config=function(){return this.configSubject.asObservable()},t.prototype.getConfig=function(){var t=this;return this.get("config").map(function(t){return{enabled:!0,sky_btc_exchange_rate:parseFloat(t.sky_btc_exchange_rate)}}).subscribe(function(e){return t.configSubject.next(e)})},t.prototype.generate=function(t){var e=this;return this.walletService.addAddress(t).flatMap(function(n){return e.post("bind",{skyaddr:n.address,coin_type:"BTC"}).map(function(e){return{coin_type:e.coin_type,deposit_address:e.deposit_address,filename:t.filename,recipient_address:n.address,status:"waiting_deposit"}})})},t.prototype.scan=function(t){return this.get("status?skyaddr="+t).map(function(t){if(!t.statuses||t.statuses.length>1)throw new Error("too many purchase orders found");return t.statuses[0]})},t.prototype.get=function(t){return this.httpClient.get(this.purchaseUrl+t)},t.prototype.post=function(t,e){return void 0===e&&(e={}),this.httpClient.post(this.purchaseUrl+t,e)},t}(),kp=function(){function t(t,e,n,r){this.formBuilder=t,this.purchaseService=e,this.snackBar=n,this.walletService=r}return t.prototype.ngOnInit=function(){this.initForm(),this.loadData()},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.checkStatus=function(){var t=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(e){t.button.setSuccess(),t.order.status=e.status},function(e){return t.button.setError(e)})},t.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},t.prototype.initForm=function(){var t=this;this.form=this.formBuilder.group({wallet:["",Js.required]}),this.subscription=this.form.get("wallet").valueChanges.subscribe(function(e){var n=t.wallets.find(function(t){return t.filename===e});console.log("changing wallet value",e),t.purchaseService.generate(n).subscribe(function(e){return t.saveData(e)},function(e){return t.snackBar.open(e.toString())})})},t.prototype.loadConfig=function(){var t=this;this.purchaseService.config().filter(function(t){return!!t&&!!t.sky_btc_exchange_rate}).first().subscribe(function(e){return t.config=e})},t.prototype.loadData=function(){var t=this;this.loadConfig(),this.loadOrder(),this.subscription.add(this.walletService.all().subscribe(function(e){t.wallets=e,t.order&&t.form.get("wallet").setValue(t.order.filename,{emitEvent:!1})}))},t.prototype.loadOrder=function(){var t=JSON.parse(window.localStorage.getItem("purchaseOrder"));t&&(this.order=t,this.updateOrder())},t.prototype.saveData=function(t){this.order=t,window.localStorage.setItem("purchaseOrder",JSON.stringify(t))},t.prototype.updateOrder=function(){var t=this;this.purchaseService.scan(this.order.recipient_address).first().subscribe(function(e){return t.order.status=e.status},function(t){return console.log(t)})},t}(),xp=function(){return function(t,e){var n=this;this.http=t,this.ngZone=e,this.CMC_TICKER_ID=1619,this.price=new mc(null),this.ngZone.runOutsideAngular(function(){s.a.timer(0,6e5).subscribe(function(){n.http.get("https://api.coinmarketcap.com/v2/ticker/"+n.CMC_TICKER_ID+"/").map(function(t){return t.json()}).subscribe(function(t){return n.ngZone.run(function(){n.price.next(t.data.quotes.USD.price)})})})})}}(),Lp=function(){function t(t,e){this.transaction=t,this.dialogRef=e}return t.prototype.closePopup=function(){this.dialogRef.close()},t}(),Cp=function(){function t(t,e,n){this.dialog=t,this.priceService=e,this.walletService=n}return t.prototype.ngOnInit=function(){var t=this;this.priceSubscription=this.priceService.price.subscribe(function(e){return t.price=e}),this.walletService.transactions().first().subscribe(function(e){return t.transactions=e})},t.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe()},t.prototype.showTransaction=function(t){var e=new Ds;e.width="800px",e.data=t,this.dialog.open(Lp,e)},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ds;n.data={address:e},this.dialog.open(dp,n)},t}(),Sp=function(){function t(t,e){this.walletService=t,this.router=e}return t.prototype.canActivate=function(t,e){var n=this;return new Promise(function(t){n.walletService.all().first().subscribe(function(e){return 0===e.length?(n.router.navigate(["/wizard"]),t(!1)):t(!0)})})},t}(),Tp=function(){function t(t,e){this.router=t,this.walletService=e,this.step=1}return t.prototype.onLabelAndSeedCreated=function(t){this.label=t[0],this.seed=t[1],this.create=t[2],this.step=2},t.prototype.onPasswordCreated=function(t){this.password=t,this.createWallet()},t.prototype.onBack=function(){this.step=1},Object.defineProperty(t.prototype,"fill",{get:function(){return this.label?{label:this.label,seed:this.seed,create:this.create}:null},enumerable:!0,configurable:!0}),t.prototype.createWallet=function(){var t=this;this.walletService.create(this.label,this.seed,100,this.password).subscribe(function(){t.router.navigate(["/wallets"])})},t}(),Op=function(){},Dp=function(){function t(t){this.predicate=t}return t.prototype.call=function(t,e){return e.subscribe(new Yp(t,this.predicate))},t}(),Yp=function(t){function e(e,n){t.call(this,e),this.predicate=n,this.index=0}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e,n=this.destination;try{e=this.predicate(t,this.index++)}catch(t){return void n.error(t)}this.nextOrComplete(t,e)},e.prototype.nextOrComplete=function(t,e){var n=this.destination;Boolean(e)?n.next(t):n.complete()},e}(lr.a);s.a.prototype.takeWhile=function(t){return function(t){return function(e){return e.lift(new Dp(t))}}(t)(this)};var Pp=function(){function t(t,e){this.apiService=t,this.ngZone=e,this.monitorConnections()}return t.prototype.testBackend=function(){var t=this;this.apiService.getVersion().first().subscribe(function(e){t.version=e,t.apiService.getCsrf().subscribe(null,function(){return t.error=3})},function(){return t.error=2})},t.prototype.monitorConnections=function(){var t=this;this.retrieveConnections().subscribe(function(e){return t.setConnectionError(e)}),this.ngZone.runOutsideAngular(function(){vp.create(1500).flatMap(function(){return t.retrieveConnections()}).subscribe(function(e){return t.ngZone.run(function(){t.setConnectionError(e)})})})},t.prototype.retrieveConnections=function(){return this.apiService.get("network/connections")},t.prototype.setConnectionError=function(t){null!==t.connections&&0!==t.connections.length||(this.error=1),null!==t.connections&&t.connections.length>0&&1===this.error&&(this.error=null)},t}(),Ep=function(){function t(t,e){this.appService=t,this.translateService=e,e.setDefaultLang("en"),e.use("en")}return t.prototype.ngOnInit=function(){this.appService.testBackend()},t}(),Ap=r._7({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function jp(t){return r._33(0,[(t()(),r._4(0,null,null,0))],null,null)}function Ip(t){return r._33(0,[r._29(402653184,1,{_portalOutlet:0}),(t()(),r._4(16777216,null,null,1,null,jp)),r._8(2,212992,[[1,4]],0,Li,[r.j,r.R],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var Rp=r._5("mat-dialog-container",Ps,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(t,e,n){var i=!0;return"component:@slideDialog.start"===e&&(i=!1!==r._22(t,1)._onAnimationStart(n)&&i),"component:@slideDialog.done"===e&&(i=!1!==r._22(t,1)._onAnimationDone(n)&&i),i},Ip,Ap)),r._8(1,49152,null,0,Ps,[r.l,_o,r.h,[2,Dt]],null,null)],null,function(t,e){t(e,0,0,null==r._22(e,1)._config?null:r._22(e,1)._config.role,null!=r._22(e,1)._config&&r._22(e,1)._config.ariaLabel?null:r._22(e,1)._ariaLabelledBy,null==r._22(e,1)._config?null:r._22(e,1)._config.ariaLabel,(null==r._22(e,1)._config?null:r._22(e,1)._config.ariaDescribedBy)||null,r._22(e,1)._state)})},{},{},[]),Hp=r._7({encapsulation:2,styles:[".mat-snack-bar-container{border-radius:2px;box-sizing:border-box;display:block;margin:24px;max-width:568px;min-width:288px;padding:14px 24px;transform:translateY(100%) translateY(24px)}.mat-snack-bar-container.mat-snack-bar-center{margin:0;transform:translateY(100%)}.mat-snack-bar-container.mat-snack-bar-top{transform:translateY(-100%) translateY(-24px)}.mat-snack-bar-container.mat-snack-bar-top.mat-snack-bar-center{transform:translateY(-100%)}@media screen and (-ms-high-contrast:active){.mat-snack-bar-container{border:solid 1px}}.mat-snack-bar-handset{width:100%}.mat-snack-bar-handset .mat-snack-bar-container{margin:0;max-width:inherit;width:100%}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"visible-top, visible-bottom",styles:{type:6,styles:{transform:"translateY(0%)"},offset:null},options:void 0},{type:1,expr:"visible-top => hidden-top, visible-bottom => hidden-bottom",animation:{type:4,styles:null,timings:"195ms cubic-bezier(0.4,0.0,1,1)"},options:null},{type:1,expr:"void => visible-top, void => visible-bottom",animation:{type:4,styles:null,timings:"225ms cubic-bezier(0.0,0.0,0.2,1)"},options:null}],options:{}}]}});function Fp(t){return r._33(0,[(t()(),r._4(0,null,null,0))],null,null)}function Np(t){return r._33(2,[r._29(402653184,1,{_portalOutlet:0}),(t()(),r._4(16777216,null,null,1,null,Fp)),r._8(2,212992,[[1,4]],0,Li,[r.j,r.R],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var Vp=r._5("snack-bar-container",hc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"snack-bar-container",[["class","mat-snack-bar-container"],["role","alert"]],[[40,"@state",0]],[["component","@state.done"]],function(t,e,n){var i=!0;return"component:@state.done"===e&&(i=!1!==r._22(t,1).onAnimationEnd(n)&&i),i},Np,Hp)),r._8(1,180224,null,0,hc,[r.B,r.l,r.h],null,null)],null,function(t,e){t(e,0,0,r._22(e,1)._animationState)})},{},{},[]),Bp=r._7({encapsulation:2,styles:[".mat-simple-snackbar{display:flex;justify-content:space-between;line-height:20px;opacity:1}.mat-simple-snackbar-action{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;background:0 0;flex-shrink:0;margin-left:48px}[dir=rtl] .mat-simple-snackbar-action{margin-right:48px;margin-left:0}"],data:{animation:[{type:7,name:"contentFade",definitions:[{type:1,expr:":enter",animation:[{type:6,styles:{opacity:"0"},offset:null},{type:4,styles:null,timings:"375ms cubic-bezier(0.4,0.0,0.2,1)"}],options:null}],options:{}}]}});function zp(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"button",[["class","mat-simple-snackbar-action"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.action()&&r),r},null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.action)})}function Wp(t){return r._33(2,[(t()(),r._31(0,null,[""," "])),(t()(),r._4(16777216,null,null,1,null,zp)),r._8(2,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null)],function(t,e){t(e,2,0,e.component.hasAction)},function(t,e){t(e,0,0,e.component.data.message)})}var Up=r._5("simple-snack-bar",dc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"simple-snack-bar",[["class","mat-simple-snackbar"]],[[40,"@contentFade",0]],null,null,Wp,Bp)),r._8(1,49152,null,0,dc,[lc,uc],null,null)],null,function(t,e){t(e,0,0,void 0)})},{},{},[]),Gp=r._7({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function Jp(t){return r._33(2,[(t()(),r._9(0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(t,e,n){var r=!0,i=t.component;return"@state.start"===e&&(r=!1!==i._animationStart()&&r),"@state.done"===e&&(r=!1!==i._animationDone(n)&&r),r},null,null)),r._8(1,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._31(2,null,["",""]))],function(t,e){t(e,1,0,"mat-tooltip",e.component.tooltipClass)},function(t,e){var n=e.component;t(e,0,0,n._transformOrigin,n._visibility),t(e,2,0,n.message)})}var qp=r._5("mat-tooltip-component",zu,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(t,e,n){var i=!0;return"body:click"===e&&(i=!1!==r._22(t,1)._handleBodyInteraction()&&i),i},Jp,Gp)),r._8(1,49152,null,0,zu,[r.h],null,null)],null,function(t,e){t(e,0,0,"visible"===r._22(e,1)._visibility?1:null)})},{},{},[]),Qp=r._7({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Xp(t){return r._33(2,[r._21(null,0)],null,null)}var Kp=r._7({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item .mat-icon{vertical-align:middle}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:8px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Zp(t){return r._33(0,[(t()(),r._9(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(t,e,n){var r=!0,i=t.component;return"keydown"===e&&(r=!1!==i._handleKeydown(n)&&r),"click"===e&&(r=!1!==i.closed.emit("click")&&r),"@transformMenu.done"===e&&(r=!1!==i._onAnimationDone(n)&&r),r},null,null)),r._8(1,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),r._21(null,0)],function(t,e){t(e,1,0,"mat-menu-panel",e.component._classList)},function(t,e){t(e,0,0,e.component._panelAnimationState),t(e,2,0,"showing")})}function $p(t){return r._33(2,[r._29(402653184,1,{templateRef:0}),(t()(),r._4(0,[[1,2]],null,0,null,Zp))],null,null)}var tf=r._7({encapsulation:2,styles:[],data:{}});function ef(t){return r._33(2,[r._21(null,0),(t()(),r._9(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(2,212992,null,0,Go,[r.l,r.B,$r,[2,Uo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,2,0,n.disableRipple||n.disabled,n._getHostElement())},function(t,e){t(e,1,0,r._22(e,2).unbounded)})}var nf=function(){function t(t,e,n,r){this.dialogRef=t,this.data=e,this.formBuilder=n,this.walletService=r}return t.prototype.ngOnInit=function(){this.form=this.formBuilder.group({label:[this.data.label,Js.required]})},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.rename=function(){var t=this;this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.walletService.renameWallet(this.data,this.form.value.label).subscribe(function(){return t.dialogRef.close(t.form.value.label)}))},t}(),rf=function(){function t(t,e,n,r){this.dialog=t,this.walletService=e,this.snackbar=n,this.translateService=r}return t.prototype.ngOnInit=function(){var t=this;this.translateService.get("wallet.new.encrypt-warning").subscribe(function(e){t.encryptionWarning=e})},t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.editWallet=function(){var t=new Ds;t.width="566px",t.data=this.wallet,this.dialog.open(nf,t)},t.prototype.newAddress=function(){var t=this;this.snackbar.dismiss(),this.wallet.encrypted?this.dialog.open(gp).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.addAddress(t.wallet,e.password).subscribe(function(){return e.close()},function(){return e.error()})}):this.walletService.addAddress(this.wallet).subscribe(null,function(e){return wc(t.snackbar,e)})},t.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},t.prototype.toggleEncryption=function(){var t=this,e=new Ds;e.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt":"wallet.encrypt"},this.wallet.encrypted||(e.data.description=this.encryptionWarning),this.dialog.open(gp,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.toggleEncryption(t.wallet,e.password).subscribe(function(){e.close()},function(t){return e.error(t)})})},t.prototype.copyAddress=function(t,e,n){if(void 0===n&&(n=500),t.stopPropagation(),!e.copying){var r=document.createElement("textarea");r.style.position="fixed",r.style.left="0",r.style.top="0",r.style.opacity="0",r.value=e.address,document.body.appendChild(r),r.focus(),r.select(),document.execCommand("copy"),document.body.removeChild(r),e.copying=!0,setTimeout(function(){e.copying=!1},n)}},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ds;n.data={address:e},this.dialog.open(dp,n)},t}(),of=r._7({encapsulation:0,styles:[[".-row.-detail[_ngcontent-%COMP%]{background-color:#f5f5f5}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%]{padding-left:0!important}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-address[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{display:inline-block;line-height:60px;cursor:pointer}.-address[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:1}.-text-right[_ngcontent-%COMP%]{text-align:right}.-options[_ngcontent-%COMP%]{text-align:center}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:rgba(97,109,125,.5);cursor:pointer;vertical-align:middle}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-actions[_ngcontent-%COMP%]{background-color:#fefefe;border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,.03)!important;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;border-top-left-radius:0!important;border-top-right-radius:0!important;z-index:100;position:relative}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]::before{content:'';display:inline-block;height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-new-address[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANISURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdIKmE8TewJkg6QStJ6j72p6PzgTlBvUAsVhAohqK1jm2CPkuF3x3uphyDJIgCIAggCAIgiAIgiAIgiAIzw0FB8IYM8Q/Z9jliQMY4eccn6H/eoWPxcEs8fs5QDHTWq/gAPSuAJx4XhRwqTJ1Dg8TfhQc2C2Am6AiLPRIbwqoVjy7cuAuIQEFaooWMenLInpRAK26A/UDKjPnALeHe9+HNWTAzC9jRlsmv0KLmKxxMjihl6/0SNGDn1/QO1e4a/wf2/K7UqEkG5hhtYAtK29xgp/eaj3fUc4Fyrlqk8NtCWwKoD2PgzYQDRpX/BrNbLzvHiZ56DzH6Dw/R1+REjSXTzgCNjJcMZeHb8jcX2s9hg74CV4ujFmpyhpq8qov+AIMsFiAN/0/4TtaeZx8UgSoWSzMNLYE8iEcW4HFCToH4+iVJbMHJrKslGXDd5RbAAPJFuD3/t+mUHWh9fFXYOS3MaeDysHWrLwVJPkCDgs4i9qWe/KEjyDhZIfr9Ubfe5OsADT/00a7cDPoCZ8n/GcwUCeQSLoFKHUcNosMvkNPoOx52PaHqiQ4wmAeCVyGbWPuzjEiYD6/+0HIg/FejcPthLKt29J3Fzh8QGNisVPCyY9h/8kTuVdcKNvClr67wH4WaCFlkL3XBDgU0BgkJUVhuwBHGZuFDnLxt5NI9nBb313g8AEWAmd0X+1LW7ffaH0LZXGDhVFL30mkW4Bzdw2BRTMscoLZXyPuq8jhdiFZAXiYnzfam6c3NlD2h+jNHBLh8AEU9xsZGqWtwAzVCGAj7BXJSVeyAijsYYbWSH0xZ79pcVid8eeN8EhcFk05agIsYRBPa9PoVe7P7ExkLdWhZoToLBkYoAQlztOpGoxZYLISSEZcWaZaA1dZrPeSWNey9payOmtJ7GBF0Tivf0TOKcq5gadUFK2h0vURqG/QflChrTLLqhPjsl5Fnz3ik534FW9zoPYe3Md3WifH/hC5GIEeoIHSPo0dYxfI4fk9b6EHDnI5WhZNVXk5uitlbkHh9clejsbU1+NlCa2qIuXQcj2ON0g/B5hdHup6XBAEQRAEQRAEQRCE58c/90hmWzuzaIoAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZnRbdswEIZ/MhkgI7gTxKzdhz41mSAdIZ2gyQS1J0g8QdIJ6kzQvMcu1QmiEfzYAonYO1stZNaIDfdOcOH7AMMSIRK644n87wgYhmEYhmEYhmEY+4dDi8QYj6oK5967d3TbTUCnfomC/sqqSne9XrhFi7TmgEmM7z3cDV0erXm0TFUatuUIjxaI8fsVGf8F641nOs67G+rzCS2gHgFsSEIaYAsc3HUIx5dQRDUCpjGerzB+Rm3DZ6TT16Hr+PeEFID0Oe9Pz13wpwNFVCPgWyweUS90NeVPMvxtCOWq52mR7CS4r1mfmUN6FUKYQQG1CODZx7IheMl4howsydhTumwaO985oISaA7xzZ817CrXbl4z/DTuBdoHRUl+HEyihtwYkdLOGETak8rhfanDuGEqoOSBl4U8zW2za900I91lTB0q0ogN2mb13wCFagrbEhB1EXAdwwkOBxervAoKwKqTlcSitB0QdwMbXQqYLHQrWCZJOEF4DPCcwWsZjMbYXTZLEIqCWsY9Zc0ma/wMtNMU2s1an0FfItkHOI1ZslVshFwHO5TPDsjbwi24bsv0Qxm6eKKFstvsKYgmSmANSpvyq53Qp8a3yGBxFzTaqF5xBCMk1YMkB/X4YQ4jDRcmsSQdC/BdCSCsVZkwKY88xB2DPMQdAiUVStPuIOcBlau1JMCeYTP4qjW9cXVqHmAP4XK95fwA+3fn3KOAx/ME8H/iD20kHeOTKj5OjuGL2NoINf3iIJzwGMuX3gw5WIIRoPWA6jdek0z9CESq0jHohiBVbRBdB7zGAYHiuoKAXHkAQUQewZueKTX6wIQHPvHQ1iFE7G1wUSHi25oca2+4IJRl+VwFjqQKIYRiGYRiGYRiGYRjGL/wq6dJf5iBxAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgB7dlvT9pAGADw566tgAhUFJ0ijgSXidnM5t5s2YtlcS/2BfyUfoglvt5csmwMXFjYhij/W0H+lPZurQmmEKeId2SG+727o1T79Gm55zkAQRAEQRAEYTohmKS9PWn54HBhJoACQBUfAuq5+Cew3CK0Y5C2rB0fp6swQRMLQDz+TO3BeVyyXXccoWDQLhQmFQgJJiC6sbGGEIlh203HIgQSlkFVgxHQ9UoTOOMegIfJ5Aqy8ArcFoaA3xeSG436GXDENQDR6OaCfUdj7jmLEBMpUGxjODn5kcnp9crJrFfRFezFFMOs+1isSP750Fpb0047wAnXAIQiixtOSvfHFFA36JUy2XRaa1WrRn++2Wz2NK2iRVeWql0LVPvFJPc/Q3I3pO3uliGVosDBjc/kuJy7jxHMuOcCHnSUSqWMf33H+cw5xrL15wiRpMTh4QJwwi0A2CerA2MLqtddfJ9zjOyTi+45A9k/m5xwCwAl5sDzbJrN4qjfPSekOXgueRY44ZcBQ+mfz+fbI34VKplM47pzscQtAPeFDP+p39n0J5iAqc8AEQCYclMfAG7l8Hpi8wXckdMn6PbM9uksLsAIi6hxsK8F7KZH1DCiGPAc3BUlimQXSCGLLl9Uhu/fnbOuCdgGwL749c/fHmOKVGDMqQzVYi2o776pswwC0wBc3HkOF3/Jzgj/z2PMskfA7h2wtTWz3iVP3VNO+duWya+329ut/f19C25JjcfVgORb6/cO+1o6PapUBpfL42KWAQ/8CzHJ1dBwLv7lzpPvHw8OOqkxU7ajaZ2zeqUaDEfm3T0C7POYjVqRSRYw+xlE1PK5xw2rnR/nrl/BcrJo4G8RYx4YYRYARZYGSlYtl9OAEbs6bLnHLKvD+7IQYpFJVxJLYZhyIgAw5UQAgBe7LoB7gFkAnF1d93jxwxdmrWxnSewe90yrBYwwCwDFZt099gZRnEkW2OeYw96B/UUPkkZusd+EWZp6IhGqEHS5heXsCQYKpXA4tGaMtblpX/hiyZoL10qPhld+fh/OlstlJosjph2h1UQiJoOyBByZIJcK2a9/gBGmL8FCNltg+XwOc1pkr3eSBWCI9ZuaNvVa3R8OYQySHxhy7vyr58kcowrzErem6JbdIGm1yGrXLpOHK8VROT2FGZB0Xe5pw/uFgiAIgiAIgiAIgiAI4/oLaQBI2smc1O8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgB7ZnbcdNAFIbPSvYzpgJEBfaSgdeYDkwFhA5CBXFKoIIkHdABziszILkCnArwc8bSco4jT1aypGgvkjzD+R680lq3/9fZsxcBMAzDMAzDMAzzPyLghIjjeILFAh/rXAFEVIflNgDxHSC7l1JuwDMnYwCKXygQN7g5qTtGgFhKOb0Gj5yEAXG8vlKglm2OxYi4PZOzL+CJwQ0wEX/ApwmDGlAjfot131BkQu1/BMEU9y8hzwkHfJkwmAF14negPn6QMikeG0eYH35AByYMYoCJ+OdzujEhgJ6pa/OY4S/rxBPUBQo0CDc3xfPg4lec3IAlvUbACwmvMQKer1EdCSme+17KFRjSWwQ0hL3EQL7D7ckIhf2M41nTdeoiIQRxBRb0EgFt2vzvOL7Fx/kMZpHwR69DY96ajhY7j4C2Ce+dlBemkYDFSq8Lw3AKhnRqgGm2NzUBlHrQdx8f09dgSGcG2HR1hJEJQrzRd1VYzAtt6MQAW/EH2phAOQCLuV43ghMwwFX8gSYTtK5QZ2UzXfbaC1RlZrAQr1PuHcb7ucLxOIC6U5t7eI0ApWBZqnIST5QjoXo4rK5t7+G3CYj9m9LZ0hsDR3QToEL8mZRLsMSbARj+84rqfVvNE5bLtSNaJivXu4onvBmQZVDM1Erd4y+FpZMJ9bNAd/GEzyYQ6TuYD1b5mN3ahK7FE94MEIEoDEPH4zDGbmlra0If4gmfEVBoAmmarqm0MaEv8YQXA/JBir6cvdUHJSYm9Cme8GJAkBYfFp6EFmhjQt/iCS8GCFEMf5WpddVxTSYMIZ7wkwNKCRAT4nn+meuIGhPmQ4gn/EQAHDWBWS6syYRP8DR7i4YSTzhPhkgkCvhb83eSv21ijn7j/F2hOftpbFR3zb7EEyNwp2nVZlY0R8FL9CmecG4CR0Nge+iT2Nc+xRPOEVDuAQzZ0DfAAMQKrbzDWZ/zzNEUZwOUEK9aJBIShuv5lPlFsoNsjTdO5ACCy7gbgPN0/Ky10KowlHG5OlMPKoAktFyq6gsvS2I0iNlhVj+Vt8owDMMwDMMwDMMwDNPEPw5aH3llqGexAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-new-address::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI5QTAxQTVDNzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI5QTAxQTVENzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjlBMDFBNUE3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjlBMDFBNUI3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5A1duRAAACq0lEQVR42uyb3W3CMBCATdUBzAZhAmACYIKm75WgE0AHqAjqAJQJmkp9L0xQOgF0ArJBPUAlakuHhKwzzo+tGOVOugcMcXyfz5e7i2gdj0fWZLlhDRcCQAAIAAEgAASAABAAAkAACAABIABNlNuqE/w9f+T9KZcaSx1I7UmNYEyJkJpJ3UvdSt3AmN2Al4d6AeQQZehM6vjMYAxOD3QCY6nUBYC5yiOgjFpKPUidXjDeJBO4dlni2toBqF3fwc5XlRnMFV0LAOXGX4YFC3DrkdSO1BZoG8ZWBpePYM5e6ADUQj8R4zMwUBmaQKDLNDBb2G0F5hEBYZo7GADcsPNqV/tgYF5J4ZqVwRN4iADmiPEL2FVRYj4B1y4QCPPQAERIwFuBu1eVBPGEmauj4ApAgpz5xKF3JUhMmIUCgEOSoy9YOAQgIDCey9hFLHABIEZ2/93D43WrQeXIvWsBMNQ+bzxml3osGIQAoKt9XnsEsEWSrtoB6NF4j5zVX6nHgnpAYktmuXdtQVAPWHpA5CXBvloABBEEiwIqGv29igsAwuKWTyVreoFkgdw1IBcAbOcy1Sq/vNqGay8FvSwEAD+Wx6JLiS0BtxYA+qNp6hHAneXetQBYIxmaDy+YIMdrEwIAgaS+b8xtH48jJXAaShBkyPPaac1+odcQTDmcGWr2uSPjsV5DFhIAU82uxsq2tU9tda+9BpcA1HkcGRoXOySvt1WYWFs9g3uIEAGcFnhvSI5SKHBewUCufT8Ed1eFE9ZcNc1dSXy8GtvDLmFGRJAnTEuAHTEPr8l8FUNqoVhbu2wTpM88vSP0WQ2e2todVrxFJsDwDivfVq/tCGDeMAFDYjjrXWZ+Pf6NZJfepEX/F2i4EAACQAAIAAEgAASAABAAAkAACAABaKL8CzAAuPuelr6IAx8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKESURBVHgB7ZnRbdswEIb/o+33jKAiddG3Ogsk1gTpBk0nqDtBnQkaT5B0groTKG0HqB6LukE0Qt6d6ELSChIqhm0IR8GB7wMEmLR00h2P1P0UoCiKoiiKoiiKouwehBbhLNmD6X0A0RDMA9uVVH/ltq8AY0pH/76hRVoLAGf772HMuf25t+bUwj7WuK1AGLQA/+p/tc5/x3rnHYm94oJ/v/mCFoieAd6RksdoAuGMDmefEZGoGcBZ/2SJ8ze279QeKR3NyB0ocWCP5ynPGPmpE5GoGcA/+9d4XOgcBcp5SmlRLD0/e5vA3GW1a2zA5q/sNTeIQLQM8KMfOoJVzjso/WsD1EnhnH7ErhvdE0Qi3hTo8HHQZlyscv6BRRB4EvaaISIRLwBMg7CNCTbnMmgZfodIxFwEk6cNSmc5NoTS/5erbEnSSh2wzex8ALpoCftKZGwh4hngBI8vfaXtWpteTAkjWghVas8VMgPEIa9qCbGiSDYDOj0nYGI5D297cQ8xxDKgKmOva92uqPkI3OZNRq2S0G46JcEfTkc8f1U2Qi4DzN241uPq/gP3oE1TltKrqbPhbQWwmEASnAK1ao3KkcRc9TZ8Fj3BmGMIIRiAsPSlw6sfEOO2XkUmEOJFFEKxpLBDS2HsOBoA7DgaAEQihnCJgWQAirDZFdMES7bGN95dWodcAMoyLHwMnUtkwUJhmlBe8zYGADStdVhx1PvT9MOG31fIXg+dDdQrP56fQgjh/YD9MztanxCTspxYkTSCEMKLoFeEYum5hLy6hxiiAVgot3nqRgnSOJvCu0GOaN8G/QaJGy2yMpmo2RuB7ZuF3eJKU6kNEEVRFEVRFEVRFEVRlHvYheXBAEeGBAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKZSURBVHgB7ZlRbtpAEIb/NfCeI1ClVH0ruUATnyA9QnqCNidIOEHCCUhP0OQETtsDlMdKtApHyDuxpzNrV8EGAXJnLSLPJ1liF1h7/p3dnRkDhmEYhmEYRjtxaBBK+gdA9wyd6BhEQ+7qF19N4dwcKd25eHaDBmlMAEoOPyCKJvzxYMtP58gwakqICA1A3wdXbPxXbDde6PNTTejHmws0QHAP8IZkdIk6OFy797NzBCSoB1AyOFtj/CP3jfiK3fHMycUuf8TXl9UB8NkvnYAE9QD6NnjA80Yn8PpexC6ez9f+PnnL7p8mlf+wYItX/J9HBCCYB/jZLxuCTcYLLv7FAnViiNHP5CdHIMItgQ6dltqEm03G/yMXgcbl3ugEgQgnALlhuY0xdue+1IroHQIRchPsLzf4XJ9iR1z8+37TWJo0EgfsM13sKf54bIDWe4AJgJbTegGCbTQcBhP+H64T8JUuRrsEUXVQF8AXPTq9C0lkoAlnhoUQqjmBqgDe+KgnycwQYZgW+YSaCLp7gMx8OOPhx87voYaaBxSp7EOlWxKbj8DTtM6sFWW0K6xklVxLWA2Xa6HnAZ20OjOS+x/Jg9Z1WRf/uZUx/FglSK1IoicAVVw/y8411qofw3vRElF0CiU094CSAH721HiqZpJ9KPEiAqFQ5TDBQmG0HBMALccEQCDyN8H7j6YA83Kzq5YTrHk9tnOFeRt6AmTZXXlkN9HwgjzD9PnAUuc+CgBXjfw4Oer9rPtyUwyn5PWJjIFq5EeLEZRQrgccXvNsfUJIsmzMYbZasUV5E0wvobg+1zAt7qGGqgB55raIZZagjYypXA0SwhVFpUAis+X4xaZz9U4E4pOFZHN1t1oFEMMwDMMwDMMwDMMwjL+78e87Hb4jwAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgB7ZrRcdpAEIb/w/BOB1EHIY8Z4gQ6oIM4FWRSgU0HSQXGJaQCMCTPIRUEVxA9Z4DLrrBmJCFpdNLqxIz3mzE6nWWs/7+93TsBoCiKoiiKoijKS8TgkljaIa4wQw8fYBE894bU/o4DVpiaHYS5HAPWdkZ3c0+tYclVd7g2cwhyGQZs7C1YXBUMFnhnPkGI7g1wER8jaEK3BuSJtzTnDb7RcUtHnv8j6v1M7SB1nZAJ3RlQJP6AKSW7bap/aQNKjss2TOjGABfxMS2Z0INviuf8l0LxDJdANshil+q3uMEPe4+a+I2A8oQX0nBMMS4xgSmKBLKISuQKjviLgKKw3+MNHR/A9f9Iwn7aUen7FEUCcIsa+ImAKnN+bRd0Nx/hEgl9/En19SgqxuYJDrQfAVUT3ntz4xwJoOVxkgNFkyPtGuCa7V1NsMiO9hCOtGdAnVLHuJhg8CpzvoMj7RhQV3xMFRM4BwCTVN/+EgxoKj6mzAQWP6C+NLW2y7JVIC8z1xGfJFsd/tGRxdvMOqBHCXDs/j/6kGRAtdgmzpuKZzgS1haRCRwJg2iDFGSumtcRz8hOAV6Wpt89BKKfZiSnQ574a3OHmsgZsLGTsz6+WQ7XU8KqD/89PyY7p5F4Rs6A7MhYPNLrtrEJccITHvkYSQNGmfMVlaUpmpjQsnhGzoAeXqfODQmfmrC2CR7EM5JJMB0BB5yych0TPIlnZAxYRouU5Do8TC1KXEzwKJ6RMeDq7GbPa3IVEzyLZ2QMyCbAI37nXldmQgfiGRkDsgmQazZ/zJVHngm8huhAPCOzF9jYX8gmQRa4j5bB+SvB4hGPaV0809wAHuk+/hb8dvs82pwnJvQaRNFypLYpFM54Ec803wz1UfbUZnRmDm+Wym33Jp5pbgAnQImJZKPt7pw+5PgKjzQ3gEPaoh78aNtEyfCRFk4L2vU13zk6IhEBwwrXhNHzOhbLJdJEuWFbmCA9ImHAAwmaJc5Z7IpaT9EnvANqv5X/ZocUMmXw9CgsuJRRVRRFURRFURRFURRFKeM/oxaTpik5gaYAAAAASUVORK5CYII=)}@-webkit-keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);position:absolute;top:0;left:4px;opacity:0;line-height:1}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}"]],data:{}});function sf(t){return r._33(0,[(t()(),r._9(0,0,null,null,52,"div",[["class","-row -detail"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-width-70 -grey"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,13,"div",[["class","-flex-fill -address -grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.parent.context.$implicit.address)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,8,"span",[],null,[[null,"click"],[null,"mouseleave"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.copyAddress(n,t.parent.context.$implicit)&&r),"mouseleave"===e&&(r=0!=(t.parent.context.$implicit.copying=!1)&&r),r},null,null)),r._8(10,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(11,{copying:0}),(t()(),r._31(12,null,["\n ","\n "])),(t()(),r._9(13,0,null,null,3,"span",[["class","copy-label"]],[[1,"data-label",0]],null,null,null,null)),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(15,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(21,null,["",""])),r._27(22,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(t()(),r._31(25,null,["",""])),r._27(26,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(28,0,null,null,23,"div",[["class","-width-70 -options"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,16777216,null,null,3,"mat-icon",[["aria-haspopup","true"],["class","mat-icon"],["role","img"]],null,[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,32)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,32)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,32)._handleClick(n)&&i),i},Xp,Qp)),r._8(31,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(32,1196032,null,0,Du,[$i,r.l,r.R,Tu,[2,Su],[8,null],[2,gi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["more_vert"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,15,"mat-menu",[["class","compact"]],null,null,null,$p,Kp)),r._8(36,1228800,[["optionsMenu",4]],1,Su,[r.l,r.B,Cu],{overlapTrigger:[0,"overlapTrigger"],panelClass:[1,"panelClass"]},null),r._29(603979776,1,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(39,0,null,0,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0,o=t.component;return"click"===e&&(i=!1!==r._22(t,40)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,40)._emitHoverEvent()&&i),"click"===e&&(i=!1!==o.copyAddress(n,t.parent.context.$implicit,1e3)&&i),i},ef,tf)),r._8(40,180224,[[1,4]],0,Lu,[r.l],null,null),(t()(),r._31(41,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(44,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/settings/outputs"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,45)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,45)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,46).onClick()&&i),i},ef,tf)),r._8(45,180224,[[1,4]],0,Lu,[r.l],null,null),r._8(46,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),r._26(47,{addr:0}),(t()(),r._31(48,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,10,0,t(e,11,0,e.parent.context.$implicit.copying)),t(e,31,0),t(e,32,0,r._22(e,36)),t(e,36,0,!1,"compact"),t(e,46,0,t(e,47,0,e.parent.context.$implicit.address),"/settings/outputs")},function(t,e){t(e,3,0,e.parent.context.index+1),t(e,12,0,e.parent.context.$implicit.address),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("wallet.address.copied"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wallet.address.copy"))),t(e,21,0,r._32(e,21,0,t(e,22,0,r._22(e.parent.parent,0),e.parent.context.$implicit.coins?e.parent.context.$implicit.coins:0,"1.0-6"))),t(e,25,0,r._32(e,25,0,t(e,26,0,r._22(e.parent.parent,0),e.parent.context.$implicit.hours?e.parent.context.$implicit.hours:0,"1.0-6"))),t(e,39,0,r._22(e,40)._highlighted,r._22(e,40)._triggersSubmenu,r._22(e,40)._getTabIndex(),r._22(e,40).disabled.toString(),r._22(e,40).disabled||null),t(e,41,0,r._32(e,41,0,r._22(e,42).transform("wallet.address."+(e.parent.context.$implicit.copying?"copied":"copy-address")))),t(e,44,0,r._22(e,45)._highlighted,r._22(e,45)._triggersSubmenu,r._22(e,45)._getTabIndex(),r._22(e,45).disabled.toString(),r._22(e,45).disabled||null),t(e,48,0,r._32(e,48,0,r._22(e,49).transform("wallet.address.outputs")))})}function af(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,sf)),r._8(3,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.wallet.hideEmpty||e.context.$implicit.coins)},null)}function lf(t){return r._33(0,[r._25(0,Ct,[r.w]),(t()(),r._9(1,0,null,null,35,"div",[["class","-row -actions"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,5,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.newAddress()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"span",[["class","-img -new-address"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEmpty()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,4,"span",[],null,null,null,null,null)),r._8(13,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(14,{"-img":0,"-show-empty":1,"-hide-empty":2}),(t()(),r._31(15,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEncryption()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,4,"span",[],null,null,null,null,null)),r._8(24,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(25,{"-img":0,"-enable-encryption":1,"-disable-encryption":2}),(t()(),r._31(26,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,5,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.editWallet()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"span",[["class","-img -edit-wallet"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._4(16777216,null,null,1,null,af)),r._8(39,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,13,0,t(e,14,0,!0,n.wallet.hideEmpty,!n.wallet.hideEmpty)),t(e,24,0,t(e,25,0,!0,!n.wallet.encrypted,n.wallet.encrypted)),t(e,39,0,n.wallet?n.wallet.addresses:r._3)},function(t,e){var n=e.component;t(e,6,0,r._32(e,6,0,r._22(e,7).transform("wallet.new-address"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wallet."+(n.wallet.hideEmpty?"show":"hide")+"-empty"))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("wallet."+(n.wallet.encrypted?"decrypt":"encrypt")))),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("wallet.edit")))})}var uf=r._7({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function cf(t){return r._33(2,[(t()(),r._9(0,0,null,null,0,"div",[["class","mat-progress-bar-background mat-progress-bar-element"]],null,null,null,null,null)),(t()(),r._9(1,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),r._8(2,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(3,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),r._8(4,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(5,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,2,0,n._bufferTransform()),t(e,4,0,n._primaryTransform())},null)}var df=r._7({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function hf(t){return r._33(2,[r._21(null,0),r._21(null,1)],null,null)}var pf=r._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function ff(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(3,212992,null,0,Go,[r.l,r.B,$r,[2,Uo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,3,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,2,0,n._isRoundButton||n._isIconButton,r._22(e,3).unbounded)})}var _f=r._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function mf(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(3,212992,null,0,Go,[r.l,r.B,$r,[2,Uo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,3,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,2,0,n._isRoundButton||n._isIconButton,r._22(e,3).unbounded)})}var gf=function(t){this.appService=t},yf=r._7({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#fafafa;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function vf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,1)._emitHoverEvent()&&i),i},ef,tf)),r._8(1,180224,[[1,4]],0,Lu,[r.l],{disabled:[0,"disabled"]},null),(t()(),r._31(2,0,[" v"," "]))],function(t,e){t(e,1,0,!0)},function(t,e){var n=e.component;t(e,0,0,r._22(e,1)._highlighted,r._22(e,1)._triggersSubmenu,r._22(e,1)._getTabIndex(),r._22(e,1).disabled.toString(),r._22(e,1).disabled||null),t(e,2,0,n.appService.version.version)})}function bf(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(t()(),r._31(3,null,["\n ","\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(5,0,null,null,74,"div",[["class","buttons-right"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,34,"mat-menu",[],null,null,null,$p,Kp)),r._8(8,1228800,[["settingsMenu",4]],1,Su,[r.l,r.B,Cu],{overlapTrigger:[0,"overlapTrigger"]},null),r._29(603979776,1,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(11,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,12)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,12)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,13).onClick()&&i),i},ef,tf)),r._8(12,180224,[[1,4]],0,Lu,[r.l],null,null),r._8(13,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(14,1),(t()(),r._31(15,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(18,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,19)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,19)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,20).onClick()&&i),i},ef,tf)),r._8(19,180224,[[1,4]],0,Lu,[r.l],null,null),r._8(20,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(21,1),(t()(),r._31(22,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(25,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,26)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,26)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,27).onClick()&&i),i},ef,tf)),r._8(26,180224,[[1,4]],0,Lu,[r.l],null,null),r._8(27,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(28,1),(t()(),r._31(29,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(32,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,33)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,33)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,34).onClick()&&i),i},ef,tf)),r._8(33,180224,[[1,4]],0,Lu,[r.l],null,null),r._8(34,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(35,1),(t()(),r._31(36,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,vf)),r._8(40,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(43,0,null,null,15,"mat-menu",[],null,null,null,$p,Kp)),r._8(44,1228800,[["menuMenu",4]],1,Su,[r.l,r.B,Cu],{overlapTrigger:[0,"overlapTrigger"]},null),r._29(603979776,2,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(47,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,48)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,48)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,49).onClick()&&i),i},ef,tf)),r._8(48,180224,[[2,4]],0,Lu,[r.l],null,null),r._8(49,16384,null,0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(50,1),(t()(),r._31(51,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(54,0,null,0,3,"a",[["class","color-primary mat-menu-item"],["href","http://172.104.173.74:8001/app/blocks/1"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,55)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,55)._emitHoverEvent()&&i),i},ef,tf)),r._8(55,180224,[[2,4]],0,Lu,[r.l],null,null),(t()(),r._31(56,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(60,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,63)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,63)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,63)._handleClick(n)&&i),i},ff,pf)),r._8(61,180224,null,0,cl,[r.l,$r,To],null,null),r._8(62,16384,null,0,ul,[],null,null),r._8(63,1196032,null,0,Du,[$i,r.l,r.R,Tu,[2,Su],[8,null],[2,gi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(65,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(66,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["settings"])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(70,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,73)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,73)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,73)._handleClick(n)&&i),i},ff,pf)),r._8(71,180224,null,0,cl,[r.l,$r,To],null,null),r._8(72,16384,null,0,ul,[],null,null),r._8(73,1196032,null,0,Du,[$i,r.l,r.R,Tu,[2,Su],[8,null],[2,gi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(75,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(76,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["menu"])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,8,0,!1),t(e,13,0,t(e,14,0,"/settings/network")),t(e,20,0,t(e,21,0,"/settings/blockchain")),t(e,27,0,t(e,28,0,"/settings/outputs")),t(e,34,0,t(e,35,0,"/settings/pending-transactions")),t(e,40,0,n.appService.version),t(e,44,0,!1),t(e,49,0,t(e,50,0,"/settings/backup")),t(e,63,0,r._22(e,8)),t(e,66,0),t(e,73,0,r._22(e,44)),t(e,76,0)},function(t,e){t(e,3,0,e.component.headline),t(e,11,0,r._22(e,12)._highlighted,r._22(e,12)._triggersSubmenu,r._22(e,12)._getTabIndex(),r._22(e,12).disabled.toString(),r._22(e,12).disabled||null),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("title.network"))),t(e,18,0,r._22(e,19)._highlighted,r._22(e,19)._triggersSubmenu,r._22(e,19)._getTabIndex(),r._22(e,19).disabled.toString(),r._22(e,19).disabled||null),t(e,22,0,r._32(e,22,0,r._22(e,23).transform("title.blockchain"))),t(e,25,0,r._22(e,26)._highlighted,r._22(e,26)._triggersSubmenu,r._22(e,26)._getTabIndex(),r._22(e,26).disabled.toString(),r._22(e,26).disabled||null),t(e,29,0,r._32(e,29,0,r._22(e,30).transform("title.outputs"))),t(e,32,0,r._22(e,33)._highlighted,r._22(e,33)._triggersSubmenu,r._22(e,33)._getTabIndex(),r._22(e,33).disabled.toString(),r._22(e,33).disabled||null),t(e,36,0,r._32(e,36,0,r._22(e,37).transform("title.pending-txs"))),t(e,47,0,r._22(e,48)._highlighted,r._22(e,48)._triggersSubmenu,r._22(e,48)._getTabIndex(),r._22(e,48).disabled.toString(),r._22(e,48).disabled||null),t(e,51,0,r._32(e,51,0,r._22(e,52).transform("title.backup"))),t(e,54,0,r._22(e,55)._highlighted,r._22(e,55)._triggersSubmenu,r._22(e,55)._getTabIndex(),r._22(e,55).disabled.toString(),r._22(e,55).disabled||null),t(e,56,0,r._32(e,56,0,r._22(e,57).transform("title.explorer"))),t(e,60,0,r._22(e,61).disabled||null),t(e,70,0,r._22(e,71).disabled||null)})}var wf=r._7({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.1%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.01%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.01%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function Mf(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(t()(),r._9(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(t,e){var n=e.component;t(e,0,0,n._elementSize,n._elementSize,n._viewBox),t(e,1,0,n._circleRadius,"mat-progress-spinner-stroke-rotate-"+n.diameter,n._strokeDashOffset,n._strokeCircumference,n._circleStrokeWidth)})}var kf=r._7({encapsulation:0,styles:[[".button-container[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px 0;width:160px;overflow:hidden}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3;line-height:20px}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px;position:relative;top:-2px}"]],data:{}});function xf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(1,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["done"]))],function(t,e){t(e,1,0)},null)}function Lf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(1,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["error"]))],function(t,e){t(e,1,0)},null)}function Cf(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Mf,wf)),r._8(1,573440,null,0,Qu,[r.l,$r,[2,Dt]],null,null)],null,function(t,e){t(e,0,0,r._22(e,1)._elementSize,r._22(e,1)._elementSize)})}function Sf(t){return r._33(0,[r._29(402653184,1,{tooltip:0}),(t()(),r._9(1,0,null,null,21,"div",[["class","button-container"]],null,[[null,"mouseenter"],[null,"mouseleave"]],function(t,e,n){var r=!0,i=t.component;return"mouseenter"===e&&(r=0!=(i.mouseOver=!0)&&r),"mouseleave"===e&&(r=0!=(i.mouseOver=!1)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,16777216,null,null,18,"button",[["class","mat-button mat-raised-button"],["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,9).show()&&i),"keydown"===e&&(i=!1!==r._22(t,9)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,9).hide(1500)&&i),"click"===e&&(i=!1!==(0!==o.state?o.onClick():null)&&i),i},ff,pf)),r._8(4,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(5,{enabled:0}),r._8(6,180224,null,0,cl,[r.l,$r,To],{disabled:[0,"disabled"],color:[1,"color"]},null),r._8(7,16384,null,0,al,[],null,null),r._8(8,16384,null,0,ll,[],null,null),r._8(9,147456,[[1,4],["tooltip",4]],0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),(t()(),r._31(-1,0,["\n "])),r._21(0,0),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,xf)),r._8(14,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Lf)),r._8(17,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Cf)),r._8(20,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,t(e,5,0,!n.disabled)),t(e,6,0,n.disabled&&!n.forceEmitEvents,"primary"),t(e,9,0,n.error?n.error:null),t(e,14,0,1===n.state),t(e,17,0,2===n.state),t(e,20,0,0===n.state)},function(t,e){t(e,3,0,r._22(e,6).disabled||null)})}var Tf=r._7({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:transparent!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}.light.-buttons-container[_ngcontent-%COMP%]{background:#f7f7f7}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled{background-color:#fff!important}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled span{color:#1e2227}"]],data:{}});function Of(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[],[[8,"className",0]],null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onLeftClick()&&r),r},Sf,kf)),r._8(3,49152,null,0,Mc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._31(4,0,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onRightClick()&&r),r},Sf,kf)),r._8(7,49152,null,0,Mc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._31(8,0,["",""])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.activeButton!==n.ButtonState.LeftButton,!0),t(e,7,0,n.activeButton!==n.ButtonState.RightButton,!0)},function(t,e){var n=e.component;t(e,0,0,r._12(1,"-buttons-container ",n.className,"")),t(e,4,0,n.leftButtonText),t(e,8,0,n.rightButtonText)})}var Df={otcEnabled:!1},Yf=function(){function t(t){this.navbarService=t,this.otcEnabled=Df.otcEnabled}return t.prototype.changeActiveComponent=function(t){this.navbarService.setActiveComponent(t)},t}(),Pf=r._7({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;padding:0 20px}"]],data:{}});function Ef(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"div",[["class","-button"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[["class","secondary-color"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.buy-coin")))})}function Af(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"app-double-button",[["class","-switch"],["className","light"]],null,[[null,"onStateChange"]],function(t,e,n){var r=!0;return"onStateChange"===e&&(r=!1!==t.component.changeActiveComponent(n)&&r),r},Of,Tf)),r._8(1,49152,null,0,Sc,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,Lt,[r.h])],function(t,e){var n=e.component;t(e,1,0,r._32(e,1,0,r._22(e,2).transform(n.navbarService.rightText)),r._32(e,1,1,r._22(e,3).transform(n.navbarService.leftText)),r._32(e,1,2,r._22(e,4).transform(n.navbarService.activeComponent)),"light")},null)}function jf(t){return r._33(0,[(t()(),r._9(0,0,null,null,51,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,48,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,5).onClick()&&i),i},null,null)),r._8(5,16384,[[1,4]],0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(6,1720320,null,2,Bh,[Ih,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,1,{links:1}),r._29(603979776,2,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,18).onClick()&&i),i},null,null)),r._8(18,16384,[[3,4]],0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(19,1720320,null,2,Bh,[Ih,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,3,{links:1}),r._29(603979776,4,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(26,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,31).onClick()&&i),i},null,null)),r._8(31,16384,[[5,4]],0,Fh,[Ih,Kd,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(32,1720320,null,2,Bh,[Ih,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,5,{links:1}),r._29(603979776,6,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(38,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(39,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Ef)),r._8(46,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Af)),r._8(49,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,"/wallets"),t(e,6,0,"no-opacity"),t(e,18,0,"/send"),t(e,19,0,"no-opacity"),t(e,31,0,"/transactions"),t(e,32,0,"no-opacity"),t(e,46,0,n.otcEnabled),t(e,49,0,n.navbarService.switchVisible)},function(t,e){t(e,13,0,r._32(e,13,0,r._22(e,14).transform("title.wallets"))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("title.send"))),t(e,39,0,r._32(e,39,0,r._22(e,40).transform("title.history")))})}var If=function(){function t(t){this.total=t}return t.prototype.call=function(t,e){return e.subscribe(new Rf(t,this.total))},t}(),Rf=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(o.__extends)(e,t),e.prototype._next=function(t){++this.count>this.total&&this.destination.next(t)},e}(lr.a);s.a.prototype.skip=function(t){return function(t){return function(e){return e.lift(new If(t))}}(t)(this)},s.a.prototype.take=function(t){return Object(Ti.a)(t)(this)};var Hf=function(){function t(t,e,n,r,i,o,s){var a=this;this.appService=t,this.apiService=e,this.blockchainService=n,this.priceService=r,this.walletService=i,this.http=o,this.translateService=s,this.addresses=[],this.querying=!0,this.translateService.get("errors.fetch-version").subscribe(function(t){a.fetchVersionError=t})}return Object.defineProperty(t.prototype,"loading",{get:function(){return!this.current||!this.highest||this.current!==this.highest},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"coins",{get:function(){return this.addresses.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hours",{get:function(){return this.addresses.map(function(t){return t.hours>=0?t.hours:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.subscription=this.blockchainService.progress.filter(function(t){return!!t}).subscribe(function(e){t.querying=!1,t.highest=e.highest,t.current=e.current,t.percentage=t.current&&t.highest?t.current/t.highest:0}),this.setVersion(),this.subscription.add(this.priceService.price.subscribe(function(e){return t.price=e})),this.subscription.add(this.walletService.allAddresses().subscribe(function(e){t.addresses=e.reduce(function(t,e){return t.find(function(t){return t.address===e.address})||t.push(e),t},[])})),this.subscription.add(this.walletService.pendingTransactions().subscribe(function(e){t.hasPendingTxs=e.length>0}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.setVersion=function(){var t=this;setTimeout(function(){t.apiService.getVersion().first().subscribe(function(e){t.version=e.version,t.retrieveReleaseVersion()})},1e3)},t.prototype.retrieveReleaseVersion=function(){var t=this;this.http.get("https://api.github.com/repos/skycoin/skycoin/tags").map(function(t){return t.json()}).catch(function(e){return s.a.throw(e||t.fetchVersionError)}).subscribe(function(e){t.releaseVersion=e.find(function(t){return-1===t.name.indexOf("rc")}).name.substr(1),t.updateAvailable=function(e,n){for(var r=t.releaseVersion.split("."),i=e.split("-"),o=i[0].split("."),s=0;s<3;s++){var a=Number(r[s]),l=Number(o[s]);if(a>l)return!0;if(a6?{Invalid:!0}:null},t.prototype.resetForm=function(){this.form.get("wallet").setValue(""),this.form.get("address").setValue(""),this.form.get("amount").setValue("")},t}(),a_=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function l_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"option",[],[[8,"disabled",0]],null,null,null,null)),r._8(1,147456,null,0,da,[r.l,r.G,[2,ca]],{ngValue:[0,"ngValue"]},null),r._8(2,147456,null,0,fa,[r.l,r.G,[8,null]],{ngValue:[0,"ngValue"]},null),(t()(),r._31(3,null,["\n "," - "," ","\n "])),r._27(4,2),r._25(131072,mp.i,[mp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit),t(e,2,0,e.context.$implicit)},function(t,e){t(e,0,0,e.context.$implicit.coins<=0),t(e,3,0,e.context.$implicit.label,r._32(e,3,1,t(e,4,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,3,2,r._22(e,5).transform("common.coin-id")))})}function u_(t){return r._33(0,[r._25(0,Ct,[r.w]),r._29(402653184,1,{previewButton:0}),r._29(402653184,2,{sendButton:0}),(t()(),r._9(3,0,null,null,67,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,4).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,4).onReset()&&i),i},null,null)),r._8(4,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(6,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,10,"select",[["formControlName","wallet"],["id","wallet"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,17).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),i},null,null)),r._8(17,16384,null,0,ca,[r.G,r.l],null,null),r._28(1024,null,Ks,function(t){return[t]},[ca]),r._8(19,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(21,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,2,null,l_)),r._8(24,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Lt,[r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"label",[["for","address"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,37)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,37).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,37)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,37)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(37,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(39,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(41,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(46,0,null,null,2,"label",[["for","amount"]],null,null,null,null,null)),(t()(),r._31(47,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,51)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,51).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,51)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,51)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.preview()&&i),i},null,null)),r._8(51,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(53,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(55,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(58,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(60,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.preview()&&r),r},Sf,kf)),r._8(61,49152,[[1,4],["previewButton",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(62,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Sf,kf)),r._8(66,49152,[[2,4],["sendButton",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(67,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,n.form),t(e,19,0,"wallet"),t(e,24,0,r._32(e,24,0,r._22(e,25).transform(n.walletService.all()))),t(e,39,0,"address"),t(e,53,0,"amount"),t(e,61,0,!n.form.valid),t(e,66,0,!n.form.valid)},function(t,e){t(e,3,0,r._22(e,6).ngClassUntouched,r._22(e,6).ngClassTouched,r._22(e,6).ngClassPristine,r._22(e,6).ngClassDirty,r._22(e,6).ngClassValid,r._22(e,6).ngClassInvalid,r._22(e,6).ngClassPending),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("send.from-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("send.to-label"))),t(e,36,0,r._22(e,41).ngClassUntouched,r._22(e,41).ngClassTouched,r._22(e,41).ngClassPristine,r._22(e,41).ngClassDirty,r._22(e,41).ngClassValid,r._22(e,41).ngClassInvalid,r._22(e,41).ngClassPending),t(e,47,0,r._32(e,47,0,r._22(e,48).transform("send.amount-label"))),t(e,50,0,r._22(e,55).ngClassUntouched,r._22(e,55).ngClassTouched,r._22(e,55).ngClassPristine,r._22(e,55).ngClassDirty,r._22(e,55).ngClassValid,r._22(e,55).ngClassInvalid,r._22(e,55).ngClassPending),t(e,62,0,r._32(e,62,0,r._22(e,63).transform("send.preview-button"))),t(e,67,0,r._32(e,67,0,r._22(e,68).transform("send.send-button")))})}var c_=r._7({encapsulation:2,styles:[],data:{}});function d_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,f_,p_)),r._8(1,49152,null,0,qo,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(t,e){var n=e.component;t(e,1,0,n.selected?"checked":"",n.disabled)},function(t,e){t(e,0,0,"indeterminate"===r._22(e,1).state,"checked"===r._22(e,1).state,r._22(e,1).disabled)})}function h_(t){return r._33(2,[(t()(),r._4(16777216,null,null,1,null,d_)),r._8(1,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._9(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(5,212992,null,0,Go,[r.l,r.B,$r,[2,Uo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,1,0,n.multiple),t(e,5,0,n.disabled||n.disableRipple,n._getHostElement())},function(t,e){t(e,4,0,r._22(e,5).unbounded)})}var p_=r._7({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function f_(t){return r._33(2,[],null,null)}var __=r._7({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function m_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.placeholder||"\xa0")})}function g_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.triggerValue)})}function y_(t){return r._33(0,[r._21(null,0),(t()(),r._4(0,null,null,0))],null,null)}function v_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),r._8(1,16384,null,0,B,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._4(16777216,null,null,1,null,g_)),r._8(3,16384,null,0,W,[r.R,r.O,B],null,null),(t()(),r._4(16777216,null,null,1,null,y_)),r._8(5,278528,null,0,z,[r.R,r.O,B],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(t,e){t(e,1,0,!!e.component.customTrigger),t(e,5,0,!0)},null)}function b_(t){return r._33(0,[(t()(),r._9(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"]],function(t,e,n){var r=!0;return"@transformPanel.done"===e&&(r=!1!==t.component._onPanelDone()&&r),r},null,null)),r._8(1,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(t,e,n){var r=!0;return"@fadeInContent.done"===e&&(r=!1!==t.component._onFadeInDone()&&r),r},null,null)),r._21(null,1)],function(t,e){var n=e.component;t(e,1,0,r._12(1,"mat-select-panel ",n._getPanelTheme(),""),n.panelClass)},function(t,e){var n=e.component;t(e,0,0,n.multiple?"showing-multiple":"showing",n._transformOrigin,n._panelDoneAnimating,n._triggerFontSize),t(e,2,0,"showing")})}function w_(t){return r._33(2,[r._29(402653184,1,{trigger:0}),r._29(671088640,2,{panel:0}),r._29(402653184,3,{overlayDir:0}),(t()(),r._9(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggle()&&r),r},null,null)),r._8(4,16384,[["origin",4]],0,ro,[r.l],null,null),(t()(),r._9(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),r._8(6,16384,null,0,B,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._4(16777216,null,null,1,null,m_)),r._8(8,278528,null,0,z,[r.R,r.O,B],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._4(16777216,null,null,1,null,v_)),r._8(10,278528,null,0,z,[r.R,r.O,B],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._9(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(t()(),r._9(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(t()(),r._4(16777216,null,null,1,function(t,e,n){var r=!0,i=t.component;return"backdropClick"===e&&(r=!1!==i.close()&&r),"attach"===e&&(r=!1!==i._onAttached()&&r),"detach"===e&&(r=!1!==i.close()&&r),r},b_)),r._8(14,671744,[[3,4]],0,io,[$i,r.O,r.R,eo,[2,gi]],{_deprecatedOrigin:[0,"_deprecatedOrigin"],_deprecatedPositions:[1,"_deprecatedPositions"],_deprecatedOffsetY:[2,"_deprecatedOffsetY"],_deprecatedMinWidth:[3,"_deprecatedMinWidth"],_deprecatedBackdropClass:[4,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[5,"_deprecatedScrollStrategy"],_deprecatedOpen:[6,"_deprecatedOpen"],_deprecatedHasBackdrop:[7,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(t,e){var n=e.component;t(e,6,0,n.empty),t(e,8,0,!0),t(e,10,0,!1),t(e,14,0,r._22(e,4),n._positions,n._offsetY,null==n._triggerRect?null:n._triggerRect.width,"cdk-overlay-transparent-backdrop",n._scrollStrategy,n.panelOpen,"")},null)}var M_=r._7({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:-15px;top:-15px;height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function k_(t){return r._33(2,[r._29(402653184,1,{_inputElement:0}),r._29(402653184,2,{_ripple:0}),(t()(),r._9(2,0,[["label",1]],null,14,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(t()(),r._9(3,0,null,null,8,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(t()(),r._9(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(t,e,n){var r=!0,i=t.component;return"change"===e&&(r=!1!==i._onInteractionEvent(n)&&r),"click"===e&&(r=!1!==i._onInputClick(n)&&r),r},null,null)),(t()(),r._9(5,0,null,null,1,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(6,212992,[[2,4]],0,Go,[r.l,r.B,$r,[2,Uo]],{centered:[0,"centered"],radius:[1,"radius"],speedFactor:[2,"speedFactor"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),(t()(),r._9(7,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(t()(),r._9(8,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(t()(),r._9(9,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(t()(),r._9(10,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(t()(),r._9(11,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(t()(),r._9(12,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(t,e,n){var r=!0;return"cdkObserveContent"===e&&(r=!1!==t.component._onLabelTextChange()&&r),r},null,null)),r._8(13,1196032,null,0,vl,[yl,r.l,r.B],null,{event:"cdkObserveContent"}),(t()(),r._9(14,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\xa0"])),r._21(null,0)],function(t,e){var n=e.component;t(e,6,0,n._rippleConfig.centered,n._rippleConfig.radius,n._rippleConfig.speedFactor,n._isRippleDisabled(),r._22(e,2))},function(t,e){var n=e.component;t(e,2,0,n.inputId),t(e,3,0,!r._22(e,12).textContent||!r._22(e,12).textContent.trim()),t(e,4,1,[n.inputId,n.required,n.checked,n.value,n.disabled,n.name,n.tabIndex,n.indeterminate,n.ariaLabel,n.ariaLabelledby,n._getAriaChecked()]),t(e,5,0,r._22(e,6).unbounded)})}var x_=r._7({encapsulation:2,styles:[".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.cdk-keyboard-focused .mat-slider-focus-ring,.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label{cursor:-webkit-grab;cursor:grab}.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label:active,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb:active{cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(.7);transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),border-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform .4s cubic-bezier(.25,.8,.25,1),border-radius .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-sliding .mat-slider-thumb-container,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-track-fill{transition-duration:0s}.mat-slider-has-ticks .mat-slider-wrapper::after{content:'';position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}"],data:{}});function L_(t){return r._33(2,[r._29(402653184,1,{_sliderWrapper:0}),(t()(),r._9(1,0,[[1,0],["sliderWrapper",1]],null,16,"div",[["class","mat-slider-wrapper"]],null,null,null,null,null)),(t()(),r._9(2,0,null,null,4,"div",[["class","mat-slider-track-wrapper"]],null,null,null,null,null)),(t()(),r._9(3,0,null,null,1,"div",[["class","mat-slider-track-background"]],null,null,null,null,null)),r._8(4,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(5,0,null,null,1,"div",[["class","mat-slider-track-fill"]],null,null,null,null,null)),r._8(6,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(7,0,null,null,3,"div",[["class","mat-slider-ticks-container"]],null,null,null,null,null)),r._8(8,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(9,0,null,null,1,"div",[["class","mat-slider-ticks"]],null,null,null,null,null)),r._8(10,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(11,0,null,null,6,"div",[["class","mat-slider-thumb-container"]],null,null,null,null,null)),r._8(12,278528,null,0,U,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(13,0,null,null,0,"div",[["class","mat-slider-focus-ring"]],null,null,null,null,null)),(t()(),r._9(14,0,null,null,0,"div",[["class","mat-slider-thumb"]],null,null,null,null,null)),(t()(),r._9(15,0,null,null,2,"div",[["class","mat-slider-thumb-label"]],null,null,null,null,null)),(t()(),r._9(16,0,null,null,1,"span",[["class","mat-slider-thumb-label-text"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""]))],function(t,e){var n=e.component;t(e,4,0,n._trackBackgroundStyles),t(e,6,0,n._trackFillStyles),t(e,8,0,n._ticksContainerStyles),t(e,10,0,n._ticksStyles),t(e,12,0,n._thumbContainerStyles)},function(t,e){t(e,17,0,e.component.displayValue)})}var C_=function(){function t(t,e,n,i,o){this.walletService=t,this.formBuilder=e,this.dialog=n,this.snackbar=i,this.navbarService=o,this.onFormSubmitted=new r.o,this.addresses=[],this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5"}return t.prototype.ngOnInit=function(){var t=this;this.navbarService.showSwitch("send.simple","send.advanced"),this.form=this.formBuilder.group({wallet:["",Js.required],addresses:["",Js.required],changeAddress:[""],destinations:this.formBuilder.array([this.createDestinationFormGroup()],this.validateDestinations.bind(this))}),this.subscriptions=this.form.get("wallet").valueChanges.subscribe(function(e){t.addresses=e.addresses.filter(function(t){return t.coins>0}),t.form.get("addresses").setValue([]),t.form.get("destinations").updateValueAndValidity()}),this.subscriptions.add(this.form.get("addresses").valueChanges.subscribe(function(){t.form.get("destinations").updateValueAndValidity()})),this.formData&&this.fillForm()},t.prototype.ngOnDestroy=function(){this.subscriptions.unsubscribe(),this.navbarService.hideSwitch(),this.snackbar.dismiss()},t.prototype.preview=function(){this.previewTx=!0,this.unlockAndSend()},t.prototype.send=function(){this.previewTx=!1,this.unlockAndSend()},t.prototype.unlockAndSend=function(){var t=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.snackbar.dismiss(),this.previewButton.resetState(),this.sendButton.resetState(),this.form.get("wallet").value.encrypted?this.dialog.open(gp).componentInstance.passwordSubmit.subscribe(function(e){t.createTransaction(e)}):this.createTransaction())},t.prototype.addDestination=function(){this.form.get("destinations").push(this.createDestinationFormGroup())},t.prototype.removeDestination=function(t){this.form.get("destinations").removeAt(t)},t.prototype.setShareValue=function(t){this.autoShareValue=parseFloat(t.value).toFixed(2)},t.prototype.toggleOptions=function(t){t.stopPropagation(),t.preventDefault(),this.autoOptions=!this.autoOptions},t.prototype.setAutoHours=function(t){this.autoHours=t.checked,this.form.get("destinations").updateValueAndValidity(),this.autoHours||(this.autoOptions=!1)},t.prototype.fillForm=function(){var t=this;this.addresses=this.formData.form.wallet.addresses,["wallet","addresses","changeAddress"].forEach(function(e){t.form.get(e).setValue(t.formData.form[e])});for(var e=0;e6)return!0}else if("hours"===t&&(n<1||parseInt(n,10)!==parseFloat(n)))return!0;return!1}).find(function(t){return!0===t})}))return{Invalid:!0};var e=this.form.get("addresses").value.reduce(function(t,e){return t+e.coins},0),n=this.form.get("addresses").value.reduce(function(t,e){return t+e.hours},0),r=this.destControls.reduce(function(t,e){return t+parseFloat(e.value.coins)},0),i=this.destControls.reduce(function(t,e){return t+parseInt(e.value.hours,10)},0);return r>e||i>n?{Invalid:!0}:null},t.prototype.createDestinationFormGroup=function(){return this.formBuilder.group({address:"",coins:"",hours:""})},t.prototype.createTransaction=function(t){var e=this;t&&t.close(),this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.walletService.createTransaction(this.form.get("wallet").value,this.form.get("addresses").value.map(function(t){return t.address}),this.destinations,this.hoursSelection,this.form.get("changeAddress").value?this.form.get("changeAddress").value:null,t?t.password:null).toPromise().then(function(t){if(!e.previewTx)return e.walletService.injectTransaction(t.encoded).toPromise();e.onFormSubmitted.emit({form:{wallet:e.form.get("wallet").value,addresses:e.form.get("addresses").value,changeAddress:e.form.get("changeAddress").value,destinations:e.destinations,hoursSelection:e.hoursSelection,autoOptions:e.autoOptions},amount:e.destinations.reduce(function(t,e){return t+parseFloat(e.coins)},0),to:e.destinations.map(function(t){return t.address}),transaction:t})}).then(function(){e.sendButton.setSuccess(),e.resetForm(),setTimeout(function(){e.sendButton.resetState()},3e3)}).catch(function(t){wc(e.snackbar,t),e.previewButton.resetState().setEnabled(),e.sendButton.resetState().setEnabled()})},t.prototype.resetForm=function(){for(this.form.get("wallet").setValue("",{emitEvent:!1}),this.form.get("addresses").setValue([]),this.form.get("changeAddress").setValue("");this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5"},Object.defineProperty(t.prototype,"destinations",{get:function(){var t=this;return this.destControls.map(function(e){var n={address:e.get("address").value,coins:e.get("coins").value};return t.autoHours||(n.hours=e.get("hours").value),n})},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hoursSelection",{get:function(){var t={type:"manual"};return this.autoHours&&(t={type:"auto",mode:"share",share_factor:this.autoShareValue}),t},enumerable:!0,configurable:!0}),t}(),S_=r._7({encapsulation:0,styles:[[".-input-addon[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.-input-addon[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{border-top-right-radius:0;border-bottom-right-radius:0}.-input-addon[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border:2px;border-radius:0 6px 6px 0;background:#f1f1f1;padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:14px;-ms-flex-negative:0;flex-shrink:0}.-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;cursor:pointer}mat-checkbox[_ngcontent-%COMP%]{font-size:12px}mat-select[_ngcontent-%COMP%]{background:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#7a5917}.-autohours[_ngcontent-%COMP%]{margin:40px 0 20px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#7a5917!important}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-background, .-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-label{line-height:20px;font-size:13px;color:#1e2227;-webkit-box-flex:1;-ms-flex:1;flex:1}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .-options{color:#7a5917;cursor:pointer}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .-options mat-icon{display:inline;vertical-align:middle;font-size:13px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-layout{display:-webkit-box;display:-ms-flexbox;display:flex}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%]{width:100%;padding:0;height:40px;border:2px solid rgba(0,0,0,.05);border-radius:6px;background:#fff}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb-label{background-color:#7a5917!important;-webkit-transform:scale(1)!important;transform:scale(1)!important;border-width:0!important}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-background, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-fill{background-color:#fff!important}.-buttons[_ngcontent-%COMP%]{text-align:center}.-hidden[_ngcontent-%COMP%]{display:none}.-space-between[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function T_(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"option",[],[[8,"disabled",0]],null,null,null,null)),r._8(1,147456,null,0,da,[r.l,r.G,[2,ca]],{ngValue:[0,"ngValue"]},null),r._8(2,147456,null,0,fa,[r.l,r.G,[8,null]],{ngValue:[0,"ngValue"]},null),(t()(),r._31(3,null,["\n "," - "," ","\n ("," ",")\n "])),r._27(4,2),r._25(131072,mp.i,[mp.j,r.h]),r._27(6,2),r._25(131072,mp.i,[mp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit),t(e,2,0,e.context.$implicit)},function(t,e){t(e,0,0,e.context.$implicit.coins<=0),t(e,3,0,e.context.$implicit.label,r._32(e,3,1,t(e,4,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,3,2,r._22(e,5).transform("common.coin-id")),r._32(e,3,3,t(e,6,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,3,4,r._22(e,7).transform("common.coin-hours")))})}function O_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._selectViaInteraction()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),i},h_,c_)),r._8(1,49152,[[3,4]],0,ts,[r.l,r.h,[2,$o],[2,Ko]],{value:[0,"value"]},null),(t()(),r._31(2,0,["\n "," - "," ","\n ("," ",")\n "])),r._27(3,2),r._25(131072,mp.i,[mp.j,r.h]),r._27(5,2),r._25(131072,mp.i,[mp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit)},function(t,e){t(e,0,0,r._22(e,1)._getTabIndex(),r._22(e,1).selected,r._22(e,1).multiple,r._22(e,1).active,r._22(e,1).id,r._22(e,1).selected.toString(),r._22(e,1).disabled.toString(),r._22(e,1).disabled),t(e,2,0,e.context.$implicit.address,r._32(e,2,1,t(e,3,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,2,2,r._22(e,4).transform("common.coin-id")),r._32(e,2,3,t(e,5,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,2,4,r._22(e,6).transform("common.coin-hours")))})}function D_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"div",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," - "," ","\n ("," ",")\n "])),r._27(2,2),r._25(131072,mp.i,[mp.j,r.h]),r._27(4,2),r._25(131072,mp.i,[mp.j,r.h])],null,function(t,e){t(e,1,0,e.context.$implicit.address,r._32(e,1,1,t(e,2,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,1,2,r._22(e,3).transform("common.coin-id")),r._32(e,1,3,t(e,4,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,1,4,r._22(e,5).transform("common.coin-hours")))})}function Y_(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["alt","plus"],["src","../../../../../assets/img/plus-green.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.addDestination()&&r),r},null,null))],null,null)}function P_(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["alt","minus"],["src","../../../../../assets/img/minus-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.removeDestination(t.parent.context.index)&&r),r},null,null))],null,null)}function E_(t){return r._33(0,[(t()(),r._9(0,0,null,null,65,"div",[["class","-destination"],["formArrayName","destinations"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),r._8(1,212992,null,0,Wa,[[3,zs],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,zs,null,[Wa]),r._8(3,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,59,"div",[["class","row"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),r._8(6,212992,null,0,za,[[3,zs],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,zs,null,[za]),r._8(8,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,8,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,5,"input",[["formControlName","address"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,13)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,13).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,13)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,13)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(13,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(15,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(17,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,15,"div",[["class","col-md-3"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,12,"div",[["class","-input-addon"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,5,"input",[["formControlName","coins"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,25)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,25).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,25)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,25)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(25,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(27,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(29,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(31,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(32,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,17,"div",[["class","col-md-3"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(39,0,null,null,14,"div",[],null,null,null,null,null)),r._8(40,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(41,{"-input-addon":0,"-hidden":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,5,"input",[["formControlName","hours"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,44)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,44).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,44)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,44)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(44,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(46,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(48,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(51,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(56,0,null,null,7,"div",[["class","col-md-1 -icons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Y_)),r._8(59,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,P_)),r._8(62,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,1,0,"destinations"),t(e,6,0,e.context.index),t(e,15,0,"address"),t(e,27,0,"coins"),t(e,40,0,t(e,41,0,!0,n.autoHours)),t(e,46,0,"hours"),t(e,59,0,0===e.context.index),t(e,62,0,0!==e.context.index)},function(t,e){t(e,0,0,r._22(e,3).ngClassUntouched,r._22(e,3).ngClassTouched,r._22(e,3).ngClassPristine,r._22(e,3).ngClassDirty,r._22(e,3).ngClassValid,r._22(e,3).ngClassInvalid,r._22(e,3).ngClassPending),t(e,5,0,r._22(e,8).ngClassUntouched,r._22(e,8).ngClassTouched,r._22(e,8).ngClassPristine,r._22(e,8).ngClassDirty,r._22(e,8).ngClassValid,r._22(e,8).ngClassInvalid,r._22(e,8).ngClassPending),t(e,12,0,0===e.context.index?"destination":"",r._22(e,17).ngClassUntouched,r._22(e,17).ngClassTouched,r._22(e,17).ngClassPristine,r._22(e,17).ngClassDirty,r._22(e,17).ngClassValid,r._22(e,17).ngClassInvalid,r._22(e,17).ngClassPending),t(e,24,0,r._22(e,29).ngClassUntouched,r._22(e,29).ngClassTouched,r._22(e,29).ngClassPristine,r._22(e,29).ngClassDirty,r._22(e,29).ngClassValid,r._22(e,29).ngClassInvalid,r._22(e,29).ngClassPending),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("common.coin-id"))),t(e,43,0,r._22(e,48).ngClassUntouched,r._22(e,48).ngClassTouched,r._22(e,48).ngClassPristine,r._22(e,48).ngClassDirty,r._22(e,48).ngClassValid,r._22(e,48).ngClassInvalid,r._22(e,48).ngClassPending),t(e,51,0,r._32(e,51,0,r._22(e,52).transform("common.coin-hours")))})}function A_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"span",[["class","-options"]],null,[[null,"mousedown"],[null,"click"]],function(t,e,n){var r=!0,i=t.component;return"mousedown"===e&&(r=!1!==n.stopPropagation()&&r),"click"===e&&(r=!1!==i.toggleOptions(n)&&r),r},null,null)),(t()(),r._31(1,null,["\n "," "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(4,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,4,0)},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("send.options-label")))})}function j_(t){return r._33(0,[r._25(0,Ct,[r.w]),r._29(402653184,1,{previewButton:0}),r._29(402653184,2,{sendButton:0}),(t()(),r._9(3,0,null,null,156,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,4).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,4).onReset()&&i),i},null,null)),r._8(4,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(6,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"label",[["for","wallets"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,10,"select",[["formControlName","wallet"],["id","wallets"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,17).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),i},null,null)),r._8(17,16384,null,0,ca,[r.G,r.l],null,null),r._28(1024,null,Ks,function(t){return[t]},[ca]),r._8(19,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(21,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,2,null,T_)),r._8(24,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Lt,[r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(30,0,null,null,36,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,8,"label",[["for","addresses"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,49).open()&&i),i},null,null)),(t()(),r._31(33,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(35,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,37).show()&&i),"keydown"===e&&(i=!1!==r._22(t,37)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,37).hide(1500)&&i),i},Xp,Qp)),r._8(36,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(37,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(42,0,null,null,23,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,20,"mat-select",[["class","mat-select"],["formControlName","addresses"],["id","addresses"],["multiple",""],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(t,e,n){var i=!0;return"keydown"===e&&(i=!1!==r._22(t,49)._handleKeydown(n)&&i),"focus"===e&&(i=!1!==r._22(t,49)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,49)._onBlur()&&i),i},w_,__)),r._28(6144,null,$o,null,[Iu]),r._28(6144,null,nl,null,[Iu]),r._8(47,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(49,2080768,[["selectAddresses",4]],3,Iu,[pi,r.h,r.B,Ro,r.l,[2,gi],[2,Ha],[2,Ba],[2,ol],[2,oa],[8,null],Eu],{multiple:[0,"multiple"],compareWith:[1,"compareWith"],id:[2,"id"]},null),r._29(603979776,3,{options:1}),r._29(603979776,4,{optionGroups:1}),r._29(335544320,5,{customTrigger:0}),r._8(53,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,1,["\n "])),(t()(),r._4(16777216,null,1,1,null,O_)),r._8(56,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,1,["\n "])),(t()(),r._9(58,0,null,0,5,"mat-select-trigger",[],null,null,null,null,null)),r._8(59,16384,[[5,4]],0,ju,[],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,D_)),r._8(62,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,1,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(68,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(70,0,null,null,8,"label",[["for","destination"]],null,null,null,null,null)),(t()(),r._31(71,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(73,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,75).show()&&i),"keydown"===e&&(i=!1!==r._22(t,75)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,75).hide(1500)&&i),i},Xp,Qp)),r._8(74,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(75,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,E_)),r._8(81,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(84,0,null,null,18,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(86,0,null,null,8,"label",[["for","change-address"]],null,null,null,null,null)),(t()(),r._31(87,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(89,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,91).show()&&i),"keydown"===e&&(i=!1!==r._22(t,91)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,91).hide(1500)&&i),i},Xp,Qp)),r._8(90,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(91,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(96,0,null,null,5,"input",[["formControlName","changeAddress"],["id","change-address"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,97)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,97).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,97)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,97)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.preview()&&i),i},null,null)),r._8(97,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(99,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(101,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(104,0,null,null,54,"div",[["class","-autohours"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(106,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(108,0,null,null,16,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(110,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setAutoHours(n)&&r),r},k_,M_)),r._28(5120,null,Ks,function(t){return[t]},[xl]),r._8(112,4374528,null,0,xl,[r.l,r.h,To,[8,null],[2,wl]],{checked:[0,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(114,0,null,0,8,"div",[["class","-space-between"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(116,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(117,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,A_)),r._8(121,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(127,0,null,null,30,"div",[],null,null,null,null,null)),r._8(128,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(129,{"row -options-wrapper":0,"-hidden":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(131,0,null,null,25,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(133,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(135,0,null,null,15,"label",[["class","-space-between"],["for","value"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(137,0,null,null,8,"span",[],null,null,null,null,null)),(t()(),r._31(138,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(140,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,142).show()&&i),"keydown"===e&&(i=!1!==r._22(t,142)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,142).hide(1500)&&i),i},Xp,Qp)),r._8(141,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(142,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(147,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(148,null,["",""])),r._27(149,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(152,0,null,null,2,"mat-slider",[["class","-slider mat-slider"],["id","value"],["max","1"],["min","0.1"],["role","slider"],["step","0.01"]],[[8,"tabIndex",0],[1,"aria-disabled",0],[1,"aria-valuemax",0],[1,"aria-valuemin",0],[1,"aria-valuenow",0],[1,"aria-orientation",0],[2,"mat-slider-disabled",null],[2,"mat-slider-has-ticks",null],[2,"mat-slider-horizontal",null],[2,"mat-slider-axis-inverted",null],[2,"mat-slider-sliding",null],[2,"mat-slider-thumb-label-showing",null],[2,"mat-slider-vertical",null],[2,"mat-slider-min-value",null],[2,"mat-slider-hide-last-tick",null]],[[null,"input"],[null,"focus"],[null,"blur"],[null,"click"],[null,"keydown"],[null,"keyup"],[null,"mouseenter"],[null,"slide"],[null,"slideend"],[null,"slidestart"]],function(t,e,n){var i=!0,o=t.component;return"focus"===e&&(i=!1!==r._22(t,154)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,154)._onBlur()&&i),"click"===e&&(i=!1!==r._22(t,154)._onClick(n)&&i),"keydown"===e&&(i=!1!==r._22(t,154)._onKeydown(n)&&i),"keyup"===e&&(i=!1!==r._22(t,154)._onKeyup()&&i),"mouseenter"===e&&(i=!1!==r._22(t,154)._onMouseenter()&&i),"slide"===e&&(i=!1!==r._22(t,154)._onSlide(n)&&i),"slideend"===e&&(i=!1!==r._22(t,154)._onSlideEnd()&&i),"slidestart"===e&&(i=!1!==r._22(t,154)._onSlideStart(n)&&i),"input"===e&&(i=!1!==o.setShareValue(n)&&i),i},L_,x_)),r._28(5120,null,Ks,function(t){return[t]},[Ku]),r._8(154,245760,null,0,Ku,[r.l,To,r.h,[2,gi],[8,null]],{max:[0,"max"],min:[1,"min"],step:[2,"step"],value:[3,"value"]},{input:"input"}),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._9(161,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(163,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.preview()&&r),r},Sf,kf)),r._8(164,49152,[[1,4],["previewButton",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(165,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(168,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Sf,kf)),r._8(169,49152,[[2,4],["sendButton",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(170,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,n.form),t(e,19,0,"wallet"),t(e,24,0,r._32(e,24,0,r._22(e,25).transform(n.walletService.all()))),t(e,36,0),t(e,37,0,r._32(e,37,0,r._22(e,38).transform("send.addresses-help"))),t(e,47,0,"addresses"),t(e,49,0,"",n.addressCompare,"addresses"),t(e,56,0,n.addresses),t(e,62,0,n.form.get("addresses").value),t(e,74,0),t(e,75,0,r._32(e,75,0,r._22(e,76).transform("send.destinations-help"+(n.autoHours?"1":"2")))),t(e,81,0,n.destControls),t(e,90,0),t(e,91,0,r._32(e,91,0,r._22(e,92).transform("send.change-address-help"))),t(e,99,0,"changeAddress"),t(e,112,0,n.autoHours),t(e,121,0,n.autoHours),t(e,128,0,t(e,129,0,!0,!n.autoOptions)),t(e,141,0),t(e,142,0,r._32(e,142,0,r._22(e,143).transform("send.value-help"))),t(e,154,0,"1","0.1","0.01",n.autoShareValue),t(e,164,0,!n.form.valid),t(e,169,0,!n.form.valid)},function(t,e){var n=e.component;t(e,3,0,r._22(e,6).ngClassUntouched,r._22(e,6).ngClassTouched,r._22(e,6).ngClassPristine,r._22(e,6).ngClassDirty,r._22(e,6).ngClassValid,r._22(e,6).ngClassInvalid,r._22(e,6).ngClassPending),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("send.wallet-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("send.addresses-label"))),t(e,44,1,[r._22(e,49).id,r._22(e,49).tabIndex,r._22(e,49)._ariaLabel,r._22(e,49).ariaLabelledby,r._22(e,49).required.toString(),r._22(e,49).disabled.toString(),r._22(e,49).errorState,r._22(e,49).panelOpen?r._22(e,49)._optionIds:null,r._22(e,49).multiple,r._22(e,49)._ariaDescribedby||null,r._22(e,49)._getAriaActiveDescendant(),r._22(e,49).disabled,r._22(e,49).errorState,r._22(e,49).required,r._22(e,53).ngClassUntouched,r._22(e,53).ngClassTouched,r._22(e,53).ngClassPristine,r._22(e,53).ngClassDirty,r._22(e,53).ngClassValid,r._22(e,53).ngClassInvalid,r._22(e,53).ngClassPending]),t(e,71,0,r._32(e,71,0,r._22(e,72).transform("send.destinations-label"))),t(e,87,0,r._32(e,87,0,r._22(e,88).transform("send.change-address-label"))),t(e,96,0,r._22(e,101).ngClassUntouched,r._22(e,101).ngClassTouched,r._22(e,101).ngClassPristine,r._22(e,101).ngClassDirty,r._22(e,101).ngClassValid,r._22(e,101).ngClassInvalid,r._22(e,101).ngClassPending),t(e,110,0,r._22(e,112).id,r._22(e,112).indeterminate,r._22(e,112).checked,r._22(e,112).disabled,"before"==r._22(e,112).labelPosition),t(e,117,0,r._32(e,117,0,r._22(e,118).transform("send.hours-allocation-label"))),t(e,138,0,r._32(e,138,0,r._22(e,139).transform("send.value-label"))),t(e,148,0,r._32(e,148,0,t(e,149,0,r._22(e,0),n.autoShareValue,"1.0-2"))),t(e,152,1,[r._22(e,154).tabIndex,r._22(e,154).disabled,r._22(e,154).max,r._22(e,154).min,r._22(e,154).value,r._22(e,154).vertical?"vertical":"horizontal",r._22(e,154).disabled,r._22(e,154).tickInterval,!r._22(e,154).vertical,r._22(e,154)._invertAxis,r._22(e,154)._isSliding,r._22(e,154).thumbLabel,r._22(e,154).vertical,r._22(e,154)._isMinValue,r._22(e,154).disabled||r._22(e,154)._isMinValue&&r._22(e,154)._thumbGap&&r._22(e,154)._invertAxis]),t(e,165,0,r._32(e,165,0,r._22(e,166).transform("send.preview-button"))),t(e,170,0,r._32(e,170,0,r._22(e,171).transform("send.send-button")))})}var I_=function(){function t(t){var e=this;this.priceService=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(t){return e.price=t})}return t.prototype.ngOnInit=function(){var t=this;this.isPreview&&(this.transaction.hoursSent=this.transaction.outputs.filter(function(e){return t.transaction.to.find(function(t){return t===e.address})}).map(function(t){return parseInt(t.hours,10)}).reduce(function(t,e){return t+e},0))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.toggleInputsOutputs=function(t){t.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},t}(),R_=r._7({encapsulation:0,styles:[["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;-ms-flex-item-align:start;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:12px}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);display:inline-block;width:60px}.-data.-more[_ngcontent-%COMP%]{margin-bottom:0!important}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{width:auto!important;margin-top:30px;color:#7a5917;cursor:pointer}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;vertical-align:middle;font-size:13px}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.-tx-price[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:10px 0 5px}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:12px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]],data:{}});function H_(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,mp.i,[mp.j,r.h])],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("tx.confirm-transaction")))})}function F_(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,mp.i,[mp.j,r.h])],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("tx.transaction")))})}function N_(t){return r._33(0,[(t()(),r._9(0,0,null,null,15,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(7,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(12,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(14,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.from"))),t(e,7,0,n.transaction.from),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("tx.to"))),t(e,14,0,n.transaction.to.join(", "))})}function V_(t){return r._33(0,[(t()(),r._9(0,0,null,null,17,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(7,null,[" ","\n "])),r._27(8,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.date"))),t(e,7,0,r._32(e,7,0,t(e,8,0,r._22(e.parent,0),1e3*n.transaction.timestamp,"short"))),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.status"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform(n.transaction.confirmed?"tx.confirmed":"tx.pending")))})}function B_(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(5,null,["\n "," ","\n |\n "," ","\n "])),r._27(6,2),r._25(131072,mp.i,[mp.j,r.h]),r._27(8,2),r._25(131072,mp.i,[mp.j,r.h])],null,function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent,1),n.transaction.hoursSent,"1.0-6")),r._32(e,5,1,r._22(e,7).transform("tx.hours-sent")),r._32(e,5,2,t(e,8,0,r._22(e.parent,1),n.transaction.hoursBurned,"1.0-6")),r._32(e,5,3,r._22(e,9).transform("tx.hours-burned")))})}function z_(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[["class","-data -more"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"span",[],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleInputsOutputs(n)&&r),r},null,null)),(t()(),r._31(3,null,["\n "," "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(5,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Xp,Qp)),r._8(6,638976,null,0,_u,[r.l,du,[8,null]],null,null),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,6,0)},function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.show-more")))})}function W_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(5,null,[" ","\n "])),r._27(6,2)],null,function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.calculated_hours,"1.0-6")))})}function U_(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._27(16,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,W_)),r._8(19,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.component.isPreview)},function(t,e){var n=e.component;t(e,3,0,e.context.index+1),t(e,8,0,n.isPreview?e.context.$implicit.address:e.context.$implicit.owner),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.coins"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent.parent,1),e.context.$implicit.coins,"1.0-6")))})}function G_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(5,null,[" ","\n "])),r._27(6,2)],null,function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.hours,"1.0-6")))})}function J_(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._27(16,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,G_)),r._8(19,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.component.isPreview)},function(t,e){var n=e.component;t(e,3,0,e.context.index+1),t(e,8,0,n.isPreview?e.context.$implicit.address:e.context.$implicit.dst),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.coins"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent.parent,1),e.context.$implicit.coins,"1.0-6")))})}function q_(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,U_)),r._8(9,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,J_)),r._8(19,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,9,0,n.transaction.inputs),t(e,19,0,n.transaction.outputs)},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.inputs"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("tx.outputs")))})}function Q_(t){return r._33(0,[r._25(0,ut,[r.w]),r._25(0,Ct,[r.w]),(t()(),r._9(2,0,null,null,50,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,23,"div",[["class","col-md-9 -tx-meta"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,H_)),r._8(7,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,F_)),r._8(10,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,N_)),r._8(13,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,V_)),r._8(16,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,B_)),r._8(19,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(24,null,["",":"])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(26,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,13,"div",[["class","col-md-3 -tx-price"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(31,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._8(32,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(33,{"-incoming":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(38,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._31(39,null,[""," ",""])),r._27(40,2),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n \n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,4,"div",[["class","col-md-12"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,z_)),r._8(47,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,q_)),r._8(51,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,7,0,n.isPreview),t(e,10,0,!n.isPreview),t(e,13,0,n.isPreview),t(e,16,0,!n.isPreview),t(e,19,0,n.isPreview),t(e,32,0,"-icon",t(e,33,0,!n.isPreview&&n.transaction.balance>0)),t(e,47,0,!n.showInputsOutputs),t(e,51,0,n.showInputsOutputs)},function(t,e){var n=e.component;t(e,24,0,r._32(e,24,0,r._22(e,25).transform("tx.id"))),t(e,26,0,n.transaction.txid),t(e,39,0,r._32(e,39,0,t(e,40,0,r._22(e,1),n.transaction.balance,"1.0-6")),r._32(e,39,1,r._22(e,41).transform("common.coin-id")))})}var X_=function(){function t(t,e){this.walletService=t,this.snackbar=e,this.onBack=new r.o}return t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.send=function(){var t=this;this.sendButton.isLoading()||(this.snackbar.dismiss(),this.sendButton.resetState(),this.sendButton.setLoading(),this.backButton.setDisabled(),this.walletService.injectTransaction(this.transaction.encoded).subscribe(function(){t.sendButton.setSuccess(),t.sendButton.setDisabled(),t.walletService.startDataRefreshSubscription(),setTimeout(function(){t.onBack.emit(!0)},3e3)},function(e){wc(t.snackbar,e),t.sendButton.setError(e),t.backButton.setEnabled()}))},t.prototype.back=function(){this.onBack.emit(!1)},t}(),K_=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]],data:{}});function Z_(t){return r._33(0,[r._29(402653184,1,{sendButton:0}),r._29(402653184,2,{backButton:0}),(t()(),r._9(2,0,null,null,1,"app-transaction-info",[],null,null,null,Q_,R_)),r._8(3,245760,null,0,I_,[xp],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._9(5,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.back()&&r),r},Sf,kf)),r._8(8,49152,[[2,4],["backButton",4]],0,Mc,[],null,{action:"action"}),(t()(),r._31(9,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Sf,kf)),r._8(13,49152,[[1,4],["sendButton",4]],0,Mc,[],null,{action:"action"}),(t()(),r._31(14,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,e.component.transaction,!0)},function(t,e){t(e,9,0,r._32(e,9,0,r._22(e,10).transform("send.back-button"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("send.send-button")))})}var $_=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function tm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-form",[],null,[[null,"onFormSubmitted"]],function(t,e,n){var r=!0;return"onFormSubmitted"===e&&(r=!1!==t.component.onFormSubmitted(n)&&r),r},u_,a_)),r._8(1,245760,null,0,s_,[qa,Kr,Hs,pc,Lc],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(t,e){t(e,1,0,e.component.formData)},null)}function em(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-form-advanced",[],null,[[null,"onFormSubmitted"]],function(t,e,n){var r=!0;return"onFormSubmitted"===e&&(r=!1!==t.component.onFormSubmitted(n)&&r),r},j_,S_)),r._8(1,245760,null,0,C_,[Kr,qa,Hs,pc,Lc],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(t,e){t(e,1,0,e.component.formData)},null)}function nm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-preview",[],null,[[null,"onBack"]],function(t,e,n){var r=!0;return"onBack"===e&&(r=!1!==t.component.onBack(n)&&r),r},Z_,K_)),r._8(1,180224,null,0,X_,[Kr,pc],{transaction:[0,"transaction"]},{onBack:"onBack"})],function(t,e){t(e,1,0,e.component.transaction)},null)}function rm(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(1,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(4,0,null,null,13,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,10,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,tm)),r._8(9,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,em)),r._8(12,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,nm)),r._8(15,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,r._32(e,1,0,r._22(e,2).transform("title.wallets"))),t(e,9,0,n.showForm&&n.activeForm===n.activeForms.LeftButton),t(e,12,0,n.showForm&&n.activeForm===n.activeForms.RightButton),t(e,15,0,!n.showForm)},null)}var im=r._5("app-send-skycoin",Tc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-skycoin",[],null,null,null,rm,$_)),r._8(1,180224,null,0,Tc,[Lc],null,null)],null,null)},{},{},[]),om=function(){this.isLoading=!0},sm=r._7({encapsulation:0,styles:[[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;color:rgba(30,34,39,.5);font-size:13px}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);font-size:40px}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function am(t){return r._33(0,[(t()(),r._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,Mf,wf)),r._8(3,573440,null,0,Qu,[r.l,$r,[2,Dt]],{diameter:[0,"diameter"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,40)},function(t,e){t(e,2,0,r._22(e,3)._elementSize,r._22(e,3)._elementSize),t(e,6,0,r._32(e,6,0,r._22(e,7).transform("common.loading")))})}function lm(t){return r._33(0,[(t()(),r._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"i",[["class","material-icons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["announcement"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,6,0,r._32(e,6,0,r._22(e,7).transform(n.noDataText)))})}function um(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"div",[["class","-content"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,am)),r._8(3,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,lm)),r._8(6,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.isLoading),t(e,6,0,!n.isLoading)},null)}var cm=r._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}"]],data:{}});function dm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","history.no-txs"]],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.transactions,"history.no-txs")},null)}function hm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._27(6,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.sent")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function pm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.sending")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,r._22(e,6).transform("history.pending")))})}function fm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._27(6,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.received")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function _m(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.receiving")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,r._22(e,6).transform("history.pending")))})}function mm(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.context.$implicit)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,5,0,e.context.$implicit)})}function gm(t){return r._33(0,[(t()(),r._9(0,0,null,null,34,"div",[["class","-transaction"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showTransaction(t.parent.context.$implicit)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._8(3,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(4,{"-incoming":0,"-pending":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,16,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,hm)),r._8(12,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,pm)),r._8(15,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,fm)),r._8(18,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,_m)),r._8(21,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,mm)),r._8(24,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,6,"div",[["class","-balance"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._31(30,null,[""," ",""])),r._27(31,2),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n \n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,"-icon",t(e,4,0,e.parent.context.$implicit.balance>0,!e.parent.context.$implicit.confirmed)),t(e,12,0,e.parent.context.$implicit.balance<0&&e.parent.context.$implicit.confirmed),t(e,15,0,e.parent.context.$implicit.balance<0&&!e.parent.context.$implicit.confirmed),t(e,18,0,e.parent.context.$implicit.balance>0&&e.parent.context.$implicit.confirmed),t(e,21,0,e.parent.context.$implicit.balance>0&&!e.parent.context.$implicit.confirmed),t(e,24,0,e.parent.context.$implicit.addresses)},function(t,e){t(e,30,0,r._32(e,30,0,t(e,31,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.balance,"1.0-6")),r._32(e,30,1,r._22(e,32).transform("common.coin-id")))})}function ym(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,gm)),r._8(3,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,0!==e.context.$implicit.balance)},null)}function vm(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,ym)),r._8(3,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.transactions)},null)}function bm(t){return r._33(0,[r._25(0,ut,[r.w]),r._25(0,Ct,[r.w]),(t()(),r._9(2,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(3,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(6,0,null,null,7,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,dm)),r._8(9,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,vm)),r._8(12,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,r._22(e,4).transform("title.transactions"))),t(e,9,0,!n.transactions||0===n.transactions.length),t(e,12,0,n.transactions&&n.transactions.length>0)},null)}var wm=r._5("app-transaction-list",Cp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-transaction-list",[],null,null,null,bm,cm)),r._8(1,245760,null,0,Cp,[Hs,xp,Kr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Mm=function(){function t(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return t.prototype.transform=function(t){return this.statuses.find(function(e){return e===t})?"teller."+t.replace("_","-"):"teller.unknown"},t}(),km=r._7({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function xm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"option",[],null,null,null,null,null)),r._8(1,147456,null,0,da,[r.l,r.G,[2,ca]],{value:[0,"value"]},null),r._8(2,147456,null,0,fa,[r.l,r.G,[8,null]],{value:[0,"value"]},null),(t()(),r._31(3,null,["\n "," - "])),(t()(),r._9(4,0,null,null,2,"span",[["class","-coins"]],null,null,null,null,null)),(t()(),r._31(5,null,[""," ",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,1,0,e.context.$implicit.filename),t(e,2,0,e.context.$implicit.filename)},function(t,e){t(e,3,0,e.context.$implicit.label),t(e,5,0,e.context.$implicit.coins,r._32(e,5,1,r._22(e,6).transform("common.coin-id")))})}function Lm(t){return r._33(0,[(t()(),r._9(0,0,null,null,26,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["2"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,17,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,3,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._26(16,{rate:0}),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(20,null,["\n ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._31(23,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("buy.send"))),t(e,15,0,r._32(e,15,0,r._22(e,17).transform("buy.send-desc",t(e,16,0,n.config.sky_btc_exchange_rate)))),t(e,20,0,n.order.deposit_address),t(e,23,0,r._32(e,23,0,r._22(e,24).transform("buy.fraction-warning")))})}function Cm(t){return r._33(0,[(t()(),r._9(0,0,null,null,34,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["3"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,25,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(18,0,null,null,4,"span",[["class","-status"]],null,null,null,null,null)),(t()(),r._31(19,null,["\n "," ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),r._27(21,1),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.checkStatus()&&r),r},Sf,kf)),r._8(25,49152,[[1,4],["button",4]],0,Mc,[],null,{action:"action"}),(t()(),r._31(26,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.removeOrder()&&r),r},Sf,kf)),r._8(30,49152,[[1,4],["button",4]],0,Mc,[],null,{action:"action"}),(t()(),r._31(31,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("buy.receive"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("buy.receive-desc"))),t(e,19,0,r._32(e,19,0,r._22(e,20).transform("buy.status-button")),r._32(e,19,1,r._22(e,22).transform(r._32(e,19,1,t(e,21,0,r._22(e.parent.parent,0),n.order.status))))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("buy.check-status-button"))),t(e,31,0,r._32(e,31,0,r._22(e,32).transform("buy.new-order-button")))})}function Sm(t){return r._33(0,[(t()(),r._9(0,0,null,null,59,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,1).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,1).onReset()&&i),i},null,null)),r._8(1,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(3,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,47,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["1"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,38,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(16,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(20,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,23,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,17,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,28).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,28).onTouched()&&i),i},null,null)),r._8(28,16384,null,0,ca,[r.G,r.l],null,null),r._8(29,16384,null,0,Ja,[],{required:[0,"required"]},null),r._28(1024,null,Us,function(t){return[t]},[Ja]),r._28(1024,null,Ks,function(t){return[t]},[ca]),r._8(32,671744,null,0,Ga,[[3,zs],[2,Us],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(34,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,4,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),r._8(37,147456,null,0,da,[r.l,r.G,[2,ca]],null,null),r._8(38,147456,null,0,fa,[r.l,r.G,[8,null]],null,null),(t()(),r._31(39,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,xm)),r._8(43,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(48,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._31(49,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Lm)),r._8(55,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Cm)),r._8(58,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,1,0,n.form),t(e,29,0,""),t(e,32,0,"wallet"),t(e,43,0,n.wallets),t(e,55,0,n.order),t(e,58,0,n.order)},function(t,e){t(e,0,0,r._22(e,3).ngClassUntouched,r._22(e,3).ngClassTouched,r._22(e,3).ngClassPristine,r._22(e,3).ngClassDirty,r._22(e,3).ngClassValid,r._22(e,3).ngClassInvalid,r._22(e,3).ngClassPending),t(e,16,0,r._32(e,16,0,r._22(e,17).transform("buy.deposit-location"))),t(e,20,0,r._32(e,20,0,r._22(e,21).transform("buy.deposit-location-desc"))),t(e,27,0,r._22(e,29).required?"":null,r._22(e,34).ngClassUntouched,r._22(e,34).ngClassTouched,r._22(e,34).ngClassPristine,r._22(e,34).ngClassDirty,r._22(e,34).ngClassValid,r._22(e,34).ngClassInvalid,r._22(e,34).ngClassPending),t(e,39,0,r._32(e,39,0,r._22(e,40).transform("buy.make-choice"))),t(e,49,0,r._32(e,49,0,r._22(e,50).transform("buy.wallets-desc")))})}function Tm(t){return r._33(0,[r._25(0,Mm,[]),r._29(671088640,1,{button:0}),(t()(),r._9(2,0,null,null,1,"app-header",[],null,null,null,Zf,Ff)),r._8(3,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],null,null),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Sm)),r._8(10,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0),t(e,10,0,n.config)},null)}var Om=r._5("app-buy",kp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-buy",[],null,null,null,Tm,km)),r._8(1,245760,null,0,kp,[qa,Mp,pc,Kr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Dm=r._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px;margin:30px 30px 0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:first-child{margin-top:0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.-text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-text-right[_ngcontent-%COMP%]{text-align:right}.-link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function Ym(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","backup.no-wallets"]],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!1,"backup.no-wallets")},null)}function Pm(t){return r._33(0,[(t()(),r._9(0,0,null,null,14,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,5,"div",[["class","-flex-fill -text-right"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"span",[["class","-link"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showSeed(t.context.$implicit)&&r),r},null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,2,0,e.context.$implicit.label),t(e,3,0,e.context.$implicit.label),t(e,6,0,e.context.$implicit.filename),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("backup.show-seed")))})}function Em(t){return r._33(0,[(t()(),r._9(0,0,null,null,20,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,11,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Pm)),r._8(18,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,18,0,e.component.onlyEncrypted)},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("backup.wallet"))),t(e,9,0,r._32(e,9,0,r._22(e,10).transform("backup.filename")))})}function Am(t){return r._33(0,[(t()(),r._9(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(3,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(6,0,null,null,24,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,15,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(11,null,[""," ",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(18,0,null,null,4,"p",[["class","-text-muted"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,1,"small",[],[[8,"innerHTML",1]],null,null,null,null)),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Ym)),r._8(26,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Em)),r._8(29,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,r._22(e,4).transform("title.backup"))),t(e,26,0,0===n.onlyEncrypted.length),t(e,29,0,n.onlyEncrypted.length>0)},function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("backup.wallet-directory")),n.folder),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("backup.seed-warning"))),t(e,20,0,r._32(e,20,0,r._22(e,21).transform("backup.desc")))})}var jm=r._5("app-backup",yp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-backup",[],null,null,null,Am,Dm)),r._8(1,245760,null,0,yp,[Kr,Hs],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Im=function(){function t(){}return t.prototype.transform=function(t){return Oc.unix(t).format("YYYY-MM-DD HH:mm")},t}(),Rm=r._7({encapsulation:0,styles:[[".-wrapper[_ngcontent-%COMP%]{margin:30px}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function Hm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],null,null)],null,null)}function Fm(t){return r._33(0,[(t()(),r._9(0,0,null,null,101,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,98,"div",[["class","row -wrapper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,36,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,33,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._27(16,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(22,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(26,null,["",""])),r._27(27,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(37,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(42,0,null,null,57,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,54,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(46,0,null,null,51,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(48,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(52,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(53,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(56,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(57,null,["",""])),r._27(58,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(61,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(63,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(64,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(67,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(68,null,["",""])),r._27(69,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(73,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(75,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(77,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(78,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(81,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(82,null,["",""])),r._27(83,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(86,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(88,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(89,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(92,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(93,null,["",""])),r._27(94,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("blockchain.blocks"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent,0),n.block.header.seq))),t(e,22,0,r._32(e,22,0,r._22(e,23).transform("blockchain.time"))),t(e,26,0,r._32(e,26,0,t(e,27,0,r._22(e.parent,1),n.block.header.timestamp))),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("blockchain.hash"))),t(e,37,0,n.block.header.block_hash),t(e,53,0,r._32(e,53,0,r._22(e,54).transform("blockchain.current-supply"))),t(e,57,0,r._32(e,57,0,t(e,58,0,r._22(e.parent,0),n.coinSupply.current_supply))),t(e,64,0,r._32(e,64,0,r._22(e,65).transform("blockchain.total-supply"))),t(e,68,0,r._32(e,68,0,t(e,69,0,r._22(e.parent,0),n.coinSupply.total_supply))),t(e,78,0,r._32(e,78,0,r._22(e,79).transform("blockchain.current-coinhour-supply"))),t(e,82,0,r._32(e,82,0,t(e,83,0,r._22(e.parent,0),n.coinSupply.current_coinhour_supply))),t(e,89,0,r._32(e,89,0,r._22(e,90).transform("blockchain.total-coinhour-supply"))),t(e,93,0,r._32(e,93,0,t(e,94,0,r._22(e.parent,0),n.coinSupply.total_coinhour_supply)))})}function Nm(t){return r._33(0,[r._25(0,Ct,[r.w]),r._25(0,Im,[]),(t()(),r._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(5,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Hm)),r._8(9,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Fm)),r._8(12,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.blockchain"))),t(e,9,0,!(n.block&&n.block.header&&n.coinSupply)),t(e,12,0,n.block&&n.block.header&&n.coinSupply)},null)}var Vm=r._5("app-blockchain",fp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-blockchain",[],null,null,null,Nm,Rm)),r._8(1,114688,null,0,fp,[pp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Bm=function(){function t(){}return t.prototype.transform=function(t){return Oc.unix(t).fromNow()},t}(),zm=r._7({encapsulation:0,styles:[[".-last-seen[_ngcontent-%COMP%], .-port[_ngcontent-%COMP%], .-source[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-direction[_ngcontent-%COMP%]{width:72px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-direction[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-direction[_ngcontent-%COMP%] img.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.-last-seen[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:12px;line-height:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-last-seen[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-trusted[_ngcontent-%COMP%]{display:inline;color:#0072ff;font-size:13px;vertical-align:middle}.-text-right[_ngcontent-%COMP%]{text-align:right}.-pl-0[_ngcontent-%COMP%]{padding-left:0!important}"]],data:{}});function Wm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],null,null)],null,null)}function Um(t){return r._33(0,[(t()(),r._9(0,0,null,null,46,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,7,"div",[["class","-direction"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,16777216,null,null,4,"img",[["src","/assets/img/send-blue.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,7).show()&&i),"keydown"===e&&(i=!1!==r._22(t,7)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,7).hide(1500)&&i),i},null,null)),r._8(5,278528,null,0,j,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(6,{"-incoming":0}),r._8(7,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,4,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(t()(),r._31(12,null,["\n ",""])),(t()(),r._9(13,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(t()(),r._31(14,null,[":",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,2,"div",[["class","-flex-fill -source"]],null,null,null,null,null)),(t()(),r._31(18,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,1,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(22,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,21,"div",[["class","-width-200 -last-seen"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(26,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(28,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,30).show()&&i),"keydown"===e&&(i=!1!==r._22(t,30)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,30).hide(1500)&&i),i},Xp,Qp)),r._8(29,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(30,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["keyboard_arrow_up"])),(t()(),r._31(33,null,["\n ","\n "])),r._27(34,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(38,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,40).show()&&i),"keydown"===e&&(i=!1!==r._22(t,40)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,40).hide(1500)&&i),i},Xp,Qp)),r._8(39,638976,null,0,_u,[r.l,du,[8,null]],null,null),r._8(40,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(43,null,["\n ","\n "])),r._27(44,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,5,0,t(e,6,0,!e.context.$implicit.outgoing)),t(e,7,0,r._32(e,7,0,r._22(e,8).transform(e.context.$implicit.outgoing?"network.out":"network.in"))),t(e,29,0),t(e,30,0,r._32(e,30,0,r._22(e,31).transform("network.last-sent"))),t(e,39,0),t(e,40,0,r._32(e,40,0,r._22(e,41).transform("network.last-received")))},function(t,e){t(e,12,0,e.context.$implicit.address.split(":")[0]),t(e,14,0,e.context.$implicit.listen_port),t(e,18,0,r._32(e,18,0,r._22(e,19).transform("network.sources."+e.context.$implicit.source))),t(e,22,0,e.context.$implicit.height),t(e,33,0,r._32(e,33,0,t(e,34,0,r._22(e.parent.parent,0),e.context.$implicit.last_sent))),t(e,43,0,r._32(e,43,0,t(e,44,0,r._22(e.parent.parent,0),e.context.$implicit.last_received)))})}function Gm(t){return r._33(0,[(t()(),r._9(0,0,null,null,31,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,28,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,19,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"div",[["class","-direction"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,2,"div",[["class","-width-200"]],null,null,null,null,null)),(t()(),r._31(21,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Um)),r._8(28,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,28,0,e.component.peers)},function(t,e){t(e,9,0,r._32(e,9,0,r._22(e,10).transform("network.peer"))),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("network.source"))),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("network.block-height"))),t(e,21,0,r._32(e,21,0,r._22(e,22).transform("network.last-seen")))})}function Jm(t){return r._33(0,[r._25(0,Bm,[]),(t()(),r._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(4,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Wm)),r._8(8,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Gm)),r._8(11,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,r._32(e,4,0,r._22(e,5).transform("title.network"))),t(e,8,0,!n.peers),t(e,11,0,n.peers)},null)}var qm=r._5("app-network",wp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-network",[],null,null,null,Jm,zm)),r._8(1,245760,null,0,wp,[bp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Qm=r._7({encapsulation:0,styles:[[".-text-right[_ngcontent-%COMP%]{text-align:right}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-row.-small[_ngcontent-%COMP%]{height:40px;line-height:40px}.-hash[_ngcontent-%COMP%]{margin-left:27px}.-address[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function Xm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","errors.no-outputs"]],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.wallets,"errors.no-outputs")},null)}function Km(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,"div",[["class","-row -small"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-flex-fill -hash"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._27(7,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._27(11,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,3,0,e.context.$implicit.hash),t(e,6,0,r._32(e,6,0,t(e,7,0,r._22(e.parent.parent.parent.parent,0),e.context.$implicit.coins,"1.0-6"))),t(e,10,0,r._32(e,10,0,t(e,11,0,r._22(e.parent.parent.parent.parent,0),e.context.$implicit.calculated_hours,"1.0-6")))})}function Zm(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,3,"div",[["class","-flex-fill -address"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.context.$implicit.address)&&r),r},null,null)),(t()(),r._31(7,null,["\n ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Km)),r._8(11,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,11,0,e.context.$implicit.outputs)},function(t,e){t(e,7,0,e.context.$implicit.address)})}function $m(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,12,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"div",[["class","-flex-fill -label"]],[[1,"title",0]],null,null,null,null)),(t()(),r._31(5,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(12,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Zm)),r._8(19,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.context.$implicit.addresses)},function(t,e){t(e,4,0,e.context.$implicit.label),t(e,5,0,e.context.$implicit.label),t(e,8,0,r._32(e,8,0,r._22(e,9).transform("common.coin-id"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("common.coin-hours")))})}function tg(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,$m)),r._8(3,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.wallets)},null)}function eg(t){return r._33(0,[r._25(0,Ct,[r.w]),(t()(),r._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(4,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Xm)),r._8(8,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,tg)),r._8(11,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,r._32(e,4,0,r._22(e,5).transform("title.outputs"))),t(e,8,0,!n.wallets||0===n.wallets.length||0===n.wallets[0].addresses[0].outputs.length),t(e,11,0,n.wallets&&n.wallets.length>0)},null)}var ng=r._5("app-outputs",hp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-outputs",[],null,null,null,eg,Qm)),r._8(1,180224,null,0,hp,[Kr,Kd,Hs],null,null)],null,null)},{},{},[]),rg=r._7({encapsulation:0,styles:[[".-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function ig(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","pending-txs.none"]],null,null,null,um,sm)),r._8(1,49152,null,0,om,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.transactions,"pending-txs.none")},null)}function og(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._27(7,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"div",[["class","-width-150 -timestamp"]],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._27(11,1),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,3,0,e.context.$implicit.txid),t(e,6,0,r._32(e,6,0,t(e,7,0,r._22(e.parent.parent,0),e.context.$implicit.amount,"1.0-6"))),t(e,10,0,r._32(e,10,0,t(e,11,0,r._22(e.parent.parent,1),e.context.$implicit.timestamp)))})}function sg(t){return r._33(0,[(t()(),r._9(0,0,null,null,25,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,22,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,13,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,og)),r._8(22,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,22,0,e.component.transactions)},function(t,e){t(e,7,0,r._32(e,7,0,r._22(e,8).transform("pending-txs.txid"))),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("common.coin-id"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("pending-txs.timestamp")))})}function ag(t){return r._33(0,[r._25(0,Ct,[r.w]),r._25(0,Im,[]),(t()(),r._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"app-header",[],null,null,null,Zf,Ff)),r._8(5,245760,null,0,Hf,[Pp,er,pp,xp,Kr,Bn,mp.j],{headline:[0,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,ig)),r._8(9,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,sg)),r._8(12,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.pending-txs"))),t(e,9,0,!n.transactions||0===n.transactions.length),t(e,12,0,n.transactions&&n.transactions.length>0)},null)}var lg=r._5("app-pending-transactions",Dc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-pending-transactions",[],null,null,null,ag,rg)),r._8(1,245760,null,0,Dc,[Kr,Lc],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),ug=function(){function t(t){this.dialogRef=t,this.acceptSafe=!1}return t.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},t.prototype.setAccept=function(t){this.acceptSafe=t.checked},t}(),cg=function(){function t(t,e,n){this.dialog=t,this.apiService=e,this.formBuilder=n,this.fill=null,this.onLabelAndSeedCreated=new r.o,this.doubleButtonActive=Cc.LeftButton}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.initForm=function(){this.form=this.formBuilder.group({label:new Aa("",[Js.required]),seed:new Aa("",[Js.required]),confirm_seed:new Aa},{validator:this.showCreateForm?this.seedMatchValidator.bind(this):null}),this.fill?(this.form.get("label").setValue(this.fill.label),this.form.get("seed").setValue(this.fill.seed),this.form.get("confirm_seed").setValue(this.fill.seed),this.doubleButtonActive=this.fill.create?Cc.LeftButton:Cc.RightButton):this.showCreateForm&&this.generateSeed(128)},t.prototype.changeForm=function(t){this.doubleButtonActive=t,this.fill=null,this.initForm()},t.prototype.createWallet=function(){var t=this;this.showSafe().afterClosed().subscribe(function(e){e&&t.emitCreatedData()})},t.prototype.loadWallet=function(){this.emitCreatedData()},t.prototype.generateSeed=function(t){var e=this;this.apiService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},Object.defineProperty(t.prototype,"showCreateForm",{get:function(){return this.doubleButtonActive===Cc.LeftButton},enumerable:!0,configurable:!0}),t.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit([this.form.get("label").value,this.form.get("seed").value,this.doubleButtonActive===Cc.LeftButton])},t.prototype.seedMatchValidator=function(t){return t.get("seed").value===t.get("confirm_seed").value?null:{NotEqual:!0}},t.prototype.showSafe=function(){var t=new Ds;return t.width="450px",this.dialog.open(ug,t)},t}(),dg=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function hg(t){return r._33(0,[(t()(),r._9(0,0,null,null,16,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,3).show()&&i),"keydown"===e&&(i=!1!==r._22(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,3).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._8(3,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(5,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._31(-1,null,["|"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,12).show()&&i),"keydown"===e&&(i=!1!==r._22(t,12)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,12).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._8(12,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(14,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("wallet.new.generate-12-seed"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("wallet.new.generate-24-seed")))},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("wallet.new.12-words"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.24-words")))})}function pg(t){return r._33(0,[(t()(),r._9(0,0,null,null,101,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,15,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(16,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,9,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,6,"div",[["class","col-sm-4 -toggle-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(26,0,null,null,3,"app-double-button",[],null,[[null,"onStateChange"]],function(t,e,n){var r=!0;return"onStateChange"===e&&(r=!1!==t.component.changeForm(n)&&r),r},Of,Tf)),r._8(27,49152,null,0,Sc,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(33,0,null,null,59,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,56,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,53,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,39).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,39).onReset()&&i),i},null,null)),r._8(38,16384,null,0,Qa,[],null,null),r._8(39,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(41,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(45,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(46,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,50)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,50).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,50)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,50)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(50,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(52,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(54,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(57,0,null,null,18,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(59,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(61,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(62,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,hg)),r._8(66,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(69,0,null,null,5,"textarea",[["class","form-control"],["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,70)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,70).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,70)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,70)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(70,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(72,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(74,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(77,0,null,null,12,"div",[["class","form-field"]],[[4,"visibility",null]],null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(79,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._31(80,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(83,0,null,null,5,"textarea",[["class","form-control"],["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,84)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,84).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,84)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,84)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(84,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(86,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(88,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(94,0,null,null,6,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(96,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0,i=t.component;return"action"===e&&(r=!1!==(i.showCreateForm?i.createWallet():i.loadWallet())&&r),r},Sf,kf)),r._8(97,49152,null,0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(98,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,27,0,r._32(e,27,0,r._22(e,28).transform("common.load")),r._32(e,27,1,r._22(e,29).transform("common.new")),n.doubleButtonActive),t(e,39,0,n.form),t(e,52,0,"label"),t(e,66,0,n.showCreateForm),t(e,72,0,"seed"),t(e,86,0,"confirm_seed"),t(e,97,0,!n.form.valid)},function(t,e){var n=e.component;t(e,9,0,r._32(e,9,0,r._22(e,10).transform("wallet.new.create-title"))),t(e,16,0,r._32(e,16,0,r._22(e,17).transform("wizard.wallet-desc"))),t(e,37,0,r._22(e,41).ngClassUntouched,r._22(e,41).ngClassTouched,r._22(e,41).ngClassPristine,r._22(e,41).ngClassDirty,r._22(e,41).ngClassValid,r._22(e,41).ngClassInvalid,r._22(e,41).ngClassPending),t(e,46,0,r._32(e,46,0,r._22(e,47).transform("wallet.new.name-label"))),t(e,49,0,r._22(e,54).ngClassUntouched,r._22(e,54).ngClassTouched,r._22(e,54).ngClassPristine,r._22(e,54).ngClassDirty,r._22(e,54).ngClassValid,r._22(e,54).ngClassInvalid,r._22(e,54).ngClassPending),t(e,62,0,r._32(e,62,0,r._22(e,63).transform("wallet.new.seed-label"))),t(e,69,0,r._22(e,74).ngClassUntouched,r._22(e,74).ngClassTouched,r._22(e,74).ngClassPristine,r._22(e,74).ngClassDirty,r._22(e,74).ngClassValid,r._22(e,74).ngClassInvalid,r._22(e,74).ngClassPending),t(e,77,0,n.showCreateForm?"visible":"hidden"),t(e,80,0,r._32(e,80,0,r._22(e,81).transform("wallet.new.confirm-seed-label"))),t(e,83,0,r._22(e,88).ngClassUntouched,r._22(e,88).ngClassTouched,r._22(e,88).ngClassPristine,r._22(e,88).ngClassDirty,r._22(e,88).ngClassValid,r._22(e,88).ngClassInvalid,r._22(e,88).ngClassPending),t(e,98,0,r._32(e,98,0,r._22(e,99).transform("wallet.new.create-button")))})}var fg=function(){function t(t){this.formBuilder=t,this.onPasswordCreated=new r.o,this.onBack=new r.o}return t.prototype.ngOnInit=function(){this.initEncryptForm()},t.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new Aa("",Js.compose([Js.required,Js.minLength(2)])),confirm:new Aa("",Js.compose([Js.required,Js.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},t.prototype.setEncrypt=function(t){t.checked?this.form.enable():this.form.disable()},t.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},t.prototype.emitBack=function(){this.onBack.emit()},Object.defineProperty(t.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),t.prototype.passwordMatchValidator=function(t){return t.get("password").value===t.get("confirm").value?null:{mismatch:!0}},t}(),_g=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function mg(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,95,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,12,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,9,"div",[["class","col-sm-4 -check-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},k_,M_)),r._28(5120,null,Ks,function(t){return[t]},[xl]),r._8(29,4374528,null,0,xl,[r.l,r.h,To,[8,null],[2,wl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(31,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._31(32,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,43,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(39,0,null,null,40,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(41,0,null,null,37,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,43).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,43).onReset()&&i),i},null,null)),r._8(42,16384,null,0,Qa,[],null,null),r._8(43,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(45,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(47,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(50,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(53,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,56)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,56).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,56)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,56)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(54,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(55,{disable:0}),r._8(56,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(58,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(60,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(63,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(t()(),r._31(66,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(69,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,72)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,72).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,72)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,72)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.emitCreatedPassword()&&i),i},null,null)),r._8(70,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(71,{disable:0}),r._8(72,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(74,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(76,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(82,0,null,null,13,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(84,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitCreatedPassword()&&r),r},Sf,kf)),r._8(85,49152,[[1,4],["button",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(86,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(89,0,null,null,5,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitBack()&&r),r},Sf,kf)),r._8(90,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(91,{"-hidden":0}),r._8(92,49152,null,0,Mc,[],null,{action:"action"}),(t()(),r._31(93,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,29,0,"encrypt",!0),t(e,43,0,n.form),t(e,54,0,"-input",t(e,55,0,n.form.disabled)),t(e,58,0,"password"),t(e,70,0,"-input",t(e,71,0,n.form.disabled)),t(e,74,0,"confirm"),t(e,85,0,n.form.enabled&&!n.form.valid),t(e,90,0,"ghost -button-min-margin",t(e,91,0,n.isWorking))},function(t,e){t(e,10,0,r._32(e,10,0,r._22(e,11).transform("wallet.new.encrypt-title"))),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("wizard.encrypt-desc"))),t(e,27,0,r._22(e,29).id,r._22(e,29).indeterminate,r._22(e,29).checked,r._22(e,29).disabled,"before"==r._22(e,29).labelPosition),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("wallet.new.encrypt"))),t(e,41,0,r._22(e,45).ngClassUntouched,r._22(e,45).ngClassTouched,r._22(e,45).ngClassPristine,r._22(e,45).ngClassDirty,r._22(e,45).ngClassValid,r._22(e,45).ngClassInvalid,r._22(e,45).ngClassPending),t(e,50,0,r._32(e,50,0,r._22(e,51).transform("password.label"))),t(e,53,0,r._22(e,60).ngClassUntouched,r._22(e,60).ngClassTouched,r._22(e,60).ngClassPristine,r._22(e,60).ngClassDirty,r._22(e,60).ngClassValid,r._22(e,60).ngClassInvalid,r._22(e,60).ngClassPending),t(e,66,0,r._32(e,66,0,r._22(e,67).transform("password.confirm-label"))),t(e,69,0,r._22(e,76).ngClassUntouched,r._22(e,76).ngClassTouched,r._22(e,76).ngClassPristine,r._22(e,76).ngClassDirty,r._22(e,76).ngClassValid,r._22(e,76).ngClassInvalid,r._22(e,76).ngClassPending),t(e,86,0,r._32(e,86,0,r._22(e,87).transform("wizard.finish-button"))),t(e,93,0,r._32(e,93,0,r._22(e,94).transform("wizard.back-button")))})}var gg=r._7({encapsulation:0,styles:[[""]],data:{}});function yg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(t,e,n){var r=!0;return"onLabelAndSeedCreated"===e&&(r=!1!==t.component.onLabelAndSeedCreated(n)&&r),r},pg,dg)),r._8(1,114688,null,0,cg,[Hs,er,qa],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(t,e){t(e,1,0,e.component.fill)},null)}function vg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(t,e,n){var r=!0,i=t.component;return"onPasswordCreated"===e&&(r=!1!==i.onPasswordCreated(n)&&r),"onBack"===e&&(r=!1!==i.onBack()&&r),r},mg,_g)),r._8(1,114688,null,0,fg,[qa],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(t,e){t(e,1,0)},null)}function bg(t){return r._33(0,[(t()(),r._4(16777216,null,null,1,null,yg)),r._8(1,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._4(16777216,null,null,1,null,vg)),r._8(4,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,1===n.step),t(e,4,0,2===n.step)},null)}var wg=r._5("app-onboarding",Tp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding",[],null,null,null,bg,gg)),r._8(1,49152,null,0,Tp,[Ih,Kr],null,null)],null,null)},{},{},[]),Mg=function(){function t(t,e,n,r){this.walletService=t,this.dialogRef=e,this.formBuilder=n,this.purchaseService=r}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.generate=function(){var t=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return t.dialogRef.close()})},t.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Js.required]})},t}(),kg=r._7({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function xg(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._selectViaInteraction()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),i},h_,c_)),r._8(1,49152,[[1,4]],0,ts,[r.l,r.h,[2,$o],[2,Ko]],{value:[0,"value"]},null),(t()(),r._31(2,0,["\n ","\n "]))],function(t,e){t(e,1,0,e.context.$implicit.address)},function(t,e){t(e,0,0,r._22(e,1)._getTabIndex(),r._22(e,1).selected,r._22(e,1).multiple,r._22(e,1).active,r._22(e,1).id,r._22(e,1).selected.toString(),r._22(e,1).disabled.toString(),r._22(e,1).disabled),t(e,2,0,e.context.$implicit.address)})}function Lg(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(4,0,null,null,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,5).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,5).onReset()&&i),i},null,null)),r._8(5,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(7,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,15,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(t,e,n){var i=!0;return"keydown"===e&&(i=!1!==r._22(t,14)._handleKeydown(n)&&i),"focus"===e&&(i=!1!==r._22(t,14)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,14)._onBlur()&&i),i},w_,__)),r._28(6144,null,$o,null,[Iu]),r._28(6144,null,nl,null,[Iu]),r._8(12,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(14,2080768,null,3,Iu,[pi,r.h,r.B,Ro,r.l,[2,gi],[2,Ha],[2,Ba],[2,ol],[2,oa],[8,null],Eu],{placeholder:[0,"placeholder"]},null),r._29(603979776,1,{options:1}),r._29(603979776,2,{optionGroups:1}),r._29(335544320,3,{customTrigger:0}),r._25(131072,mp.i,[mp.j,r.h]),r._8(19,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,1,["\n "])),(t()(),r._4(16777216,null,1,2,null,xg)),r._8(22,802816,null,0,R,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Lt,[r.h]),(t()(),r._31(-1,1,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(27,0,null,null,7,"div",[["class","button-line"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,4,"a",[["class","mat-raised-button"],["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(t,e,n){var i=!0,o=t.component;return"click"===e&&(i=!1!==r._22(t,30)._haltDisabledEvents(n)&&i),"click"===e&&(i=!1!==o.generate()&&i),i},mf,_f)),r._8(30,180224,null,0,dl,[$r,To,r.l],null,null),r._8(31,16384,null,0,ll,[],null,null),(t()(),r._31(32,0,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,n.form),t(e,12,0,"address"),t(e,14,0,r._32(e,14,0,r._22(e,18).transform("buy.select-address"))),t(e,22,0,r._32(e,22,0,r._22(e,23).transform(n.walletService.allAddresses())))},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("buy.deposit-address"))),t(e,4,0,r._22(e,7).ngClassUntouched,r._22(e,7).ngClassTouched,r._22(e,7).ngClassPristine,r._22(e,7).ngClassDirty,r._22(e,7).ngClassValid,r._22(e,7).ngClassInvalid,r._22(e,7).ngClassPending),t(e,9,1,[r._22(e,14).id,r._22(e,14).tabIndex,r._22(e,14)._ariaLabel,r._22(e,14).ariaLabelledby,r._22(e,14).required.toString(),r._22(e,14).disabled.toString(),r._22(e,14).errorState,r._22(e,14).panelOpen?r._22(e,14)._optionIds:null,r._22(e,14).multiple,r._22(e,14)._ariaDescribedby||null,r._22(e,14)._getAriaActiveDescendant(),r._22(e,14).disabled,r._22(e,14).errorState,r._22(e,14).required,r._22(e,19).ngClassUntouched,r._22(e,19).ngClassTouched,r._22(e,19).ngClassPristine,r._22(e,19).ngClassDirty,r._22(e,19).ngClassValid,r._22(e,19).ngClassInvalid,r._22(e,19).ngClassPending]),t(e,29,0,r._22(e,30).disabled?-1:0,r._22(e,30).disabled||null,r._22(e,30).disabled.toString()),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("buy.generate")))})}var Cg=r._5("app-add-deposit-address",Mg,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,Lg,kg)),r._8(1,114688,null,0,Mg,[Kr,As,qa,Mp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Sg=function(){function t(){}return t.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},t.prototype.ngOnChanges=function(t){t.disableDismiss&&(this.dialog.disableClose=t.disableDismiss.currentValue)},t}(),Tg=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:30px}"]],data:{}});function Og(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null))],null,null)}function Dg(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(1,null,["\n ","\n "])),(t()(),r._4(16777216,null,null,1,null,Og)),r._8(3,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(6,0,null,null,3,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),r._21(null,0),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.disableDismiss)},function(t,e){t(e,1,0,e.component.headline)})}var Yg=function(){function t(t){this.el=t,t.nativeElement.autocomplete="new-password",t.nativeElement.readOnly=!0}return t.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},t}(),Pg=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:rgba(122,89,23,.7)}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-disabled[_ngcontent-%COMP%]{display:none}.-warning[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-passwords[_ngcontent-%COMP%] .-hidden[_ngcontent-%COMP%]{visibility:hidden}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#7a5917!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function Eg(t){return r._33(0,[(t()(),r._9(0,0,null,null,16,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,3).show()&&i),"keydown"===e&&(i=!1!==r._22(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,3).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._8(3,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(5,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._31(-1,null,["|"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,12).show()&&i),"keydown"===e&&(i=!1!==r._22(t,12)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,12).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._8(12,147456,null,0,Bu,[$i,r.l,di,r.R,r.B,$r,Mo,To,Nu,[2,gi]],{message:[0,"message"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(14,null,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("wallet.new.generate-12-seed"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("wallet.new.generate-24-seed")))},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("wallet.new.12-words"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.24-words")))})}function Ag(t){return r._33(0,[r._29(402653184,1,{createButton:0}),r._29(402653184,2,{cancelButton:0}),(t()(),r._9(2,0,null,null,137,"app-modal",[],null,null,null,Dg,Tg)),r._8(3,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(6,0,null,0,119,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,7).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,7).onReset()&&i),i},null,null)),r._8(7,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(9,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(14,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,18)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,18).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,18)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,18)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(18,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(20,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(22,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(30,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Eg)),r._8(34,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,38)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,38).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,38)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,38)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(38,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(40,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(42,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,2,"p",[["class","-warning"]],null,null,null,null,null)),(t()(),r._31(45,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),r._8(50,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(51,{"-disabled":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(53,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._31(54,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(57,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,58)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,58).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,58)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,58)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(58,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(60,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(62,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,9,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(67,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},k_,M_)),r._28(5120,null,Ks,function(t){return[t]},[xl]),r._8(69,4374528,null,0,xl,[r.l,r.h,To,[8,null],[2,wl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(71,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._31(72,0,[" ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(76,0,null,null,48,"div",[["class","row -passwords"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(78,0,null,null,5,"div",[["class","col-md-12"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(80,0,null,null,2,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(81,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(85,0,null,null,18,"div",[["class","col-md-6"]],null,null,null,null,null)),r._8(86,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(87,{"-hidden":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(89,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(91,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(92,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(95,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,96)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,96).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,96)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,96)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,101).onFocus()&&i),i},null,null)),r._8(96,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(98,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(100,16384,null,0,Ta,[oa],null,null),r._8(101,16384,null,0,Yg,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(105,0,null,null,18,"div",[["class","col-md-6"]],null,null,null,null,null)),r._8(106,278528,null,0,j,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(107,{"-hidden":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(109,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(111,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._31(112,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(115,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,116)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,116).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,116)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,116)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,121).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.createWallet()&&i),i},null,null)),r._8(116,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(118,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(120,16384,null,0,Ta,[oa],null,null),r._8(121,16384,null,0,Yg,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(127,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(129,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Sf,kf)),r._8(130,49152,[[2,4],["cancelButton",4]],0,Mc,[],null,{action:"action"}),(t()(),r._31(131,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(134,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.createWallet()&&r),r},Sf,kf)),r._8(135,49152,[[1,4],["createButton",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(136,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.dialogRef,r._32(e,3,1,r._22(e,4).transform("wallet.new."+(n.data.create?"create":"load")+"-title")),n.disableDismiss),t(e,7,0,n.form),t(e,20,0,"label"),t(e,34,0,n.data.create),t(e,40,0,"seed"),t(e,50,0,"form-field",t(e,51,0,!n.data.create)),t(e,60,0,"confirm_seed"),t(e,69,0,"encrypt",!0),t(e,86,0,"col-md-6",t(e,87,0,!n.encrypt)),t(e,98,0,"password"),t(e,106,0,"col-md-6",t(e,107,0,!n.encrypt)),t(e,118,0,"confirm_password"),t(e,135,0,!n.form.valid)},function(t,e){var n=e.component;t(e,6,0,r._22(e,9).ngClassUntouched,r._22(e,9).ngClassTouched,r._22(e,9).ngClassPristine,r._22(e,9).ngClassDirty,r._22(e,9).ngClassValid,r._22(e,9).ngClassInvalid,r._22(e,9).ngClassPending),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.name-label"))),t(e,17,0,r._22(e,22).ngClassUntouched,r._22(e,22).ngClassTouched,r._22(e,22).ngClassPristine,r._22(e,22).ngClassDirty,r._22(e,22).ngClassValid,r._22(e,22).ngClassInvalid,r._22(e,22).ngClassPending),t(e,30,0,r._32(e,30,0,r._22(e,31).transform("wallet.new.seed-label"))),t(e,37,0,r._22(e,42).ngClassUntouched,r._22(e,42).ngClassTouched,r._22(e,42).ngClassPristine,r._22(e,42).ngClassDirty,r._22(e,42).ngClassValid,r._22(e,42).ngClassInvalid,r._22(e,42).ngClassPending),t(e,45,0,r._32(e,45,0,r._22(e,46).transform("wallet.new.seed-warning"))),t(e,54,0,r._32(e,54,0,r._22(e,55).transform("wallet.new.confirm-seed-label"))),t(e,57,0,r._22(e,62).ngClassUntouched,r._22(e,62).ngClassTouched,r._22(e,62).ngClassPristine,r._22(e,62).ngClassDirty,r._22(e,62).ngClassValid,r._22(e,62).ngClassInvalid,r._22(e,62).ngClassPending),t(e,67,0,r._22(e,69).id,r._22(e,69).indeterminate,r._22(e,69).checked,r._22(e,69).disabled,"before"==r._22(e,69).labelPosition),t(e,72,0,r._32(e,72,0,r._22(e,73).transform("wallet.new.encrypt"))),t(e,81,0,r._32(e,81,0,r._22(e,82).transform("wallet.new.encrypt-warning"))),t(e,92,0,r._32(e,92,0,r._22(e,93).transform("password.label"))),t(e,95,0,r._22(e,100).ngClassUntouched,r._22(e,100).ngClassTouched,r._22(e,100).ngClassPristine,r._22(e,100).ngClassDirty,r._22(e,100).ngClassValid,r._22(e,100).ngClassInvalid,r._22(e,100).ngClassPending),t(e,112,0,r._32(e,112,0,r._22(e,113).transform("password.confirm-label"))),t(e,115,0,r._22(e,120).ngClassUntouched,r._22(e,120).ngClassTouched,r._22(e,120).ngClassPristine,r._22(e,120).ngClassDirty,r._22(e,120).ngClassValid,r._22(e,120).ngClassInvalid,r._22(e,120).ngClassPending),t(e,131,0,r._32(e,131,0,r._22(e,132).transform("wallet.new.cancel-button"))),t(e,136,0,r._32(e,136,0,r._22(e,137).transform("wallet.new."+(n.data.create?"create":"load")+"-button")))})}var jg=r._5("app-create-wallet",kc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-create-wallet",[],null,null,null,Ag,Pg)),r._8(1,114688,null,0,kc,[js,As,Kr,er],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Ig=r._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Rg(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,36,"app-modal",[],null,null,null,Dg,Tg)),r._8(2,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(5,0,null,0,18,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,6).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,6).onReset()&&i),i},null,null)),r._8(6,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(8,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,17)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,17)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,17)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.rename()&&i),i},null,null)),r._8(17,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(19,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(21,16384,null,0,Ta,[oa],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(25,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Sf,kf)),r._8(28,49152,null,0,Mc,[],null,{action:"action"}),(t()(),r._31(29,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.rename()&&r),r},Sf,kf)),r._8(33,49152,[[1,4],["button",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(34,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,r._32(e,2,1,r._22(e,3).transform("wallet.rename.title"))),t(e,6,0,n.form),t(e,19,0,"label"),t(e,33,0,!n.form.valid)},function(t,e){t(e,5,0,r._22(e,8).ngClassUntouched,r._22(e,8).ngClassTouched,r._22(e,8).ngClassPristine,r._22(e,8).ngClassDirty,r._22(e,8).ngClassValid,r._22(e,8).ngClassInvalid,r._22(e,8).ngClassPending),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("wallet.rename.name-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,29,0,r._32(e,29,0,r._22(e,30).transform("wallet.rename.cancel-button"))),t(e,34,0,r._32(e,34,0,r._22(e,35).transform("wallet.rename.rename-button")))})}var Hg=r._5("app-change-name",nf,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-change-name",[],null,null,null,Rg,Ig)),r._8(1,114688,null,0,nf,[As,js,qa,Kr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Fg=r._7({encapsulation:0,styles:[["#qr[_ngcontent-%COMP%]{height:300px}.address[_ngcontent-%COMP%]{font-size:80%;text-align:center;margin-top:30px}"]],data:{}});function Ng(t){return r._33(0,[r._29(402653184,1,{qr:0}),(t()(),r._9(1,0,null,null,8,"app-modal",[],null,null,null,Dg,Tg)),r._8(2,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(5,0,[[1,0],["qr",1]],0,0,"div",[["id","qr"]],null,null,null,null,null)),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(7,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,2,0,e.component.dialogRef,r._32(e,2,1,r._22(e,3).transform("title.qrcode")))},function(t,e){t(e,8,0,e.component.data.address)})}var Vg=r._5("app-qr-code",dp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-qr-code",[],null,null,null,Ng,Fg)),r._8(1,114688,null,0,dp,[js,As],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Bg=r._7({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%]{padding:24px;background-color:#fbfbfb}.-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}"]],data:{}});function zg(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._9(3,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null)),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(6,0,null,null,8,"div",[["class","-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),r._8(9,16384,null,0,Fs,[],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,1,"app-transaction-info",[],null,null,null,Q_,R_)),r._8(12,245760,null,0,I_,[xp],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,12,0,e.component.transaction,!1)},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.tx-detail")))})}var Wg=r._5("app-transaction-detail",Lp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-transaction-detail",[],null,null,null,zg,Bg)),r._8(1,49152,null,0,Lp,[js,As],null,null)],null,null)},{},{},[]),Ug=r._7({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function Gg(t){return r._33(0,[(t()(),r._9(0,0,null,null,27,"app-modal",[["class","-title"]],null,null,null,Dg,Tg)),r._8(1,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(4,0,null,0,14,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"span",[["class","-safe-description"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,4,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setAccept(n)&&r),r},k_,M_)),r._28(5120,null,Ks,function(t){return[t]},[xl]),r._8(14,4374528,null,0,xl,[r.l,r.h,To,[8,null],[2,wl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(15,0,["","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(20,0,null,0,6,"div",[["class","-text-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,3,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Sf,kf)),r._8(23,49152,null,0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(24,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,n.dialogRef,r._32(e,1,1,r._22(e,2).transform("wizard.confirm.title"))),t(e,14,0,"terms",n.acceptSafe),t(e,23,0,!n.acceptSafe)},function(t,e){t(e,7,0,r._32(e,7,0,r._22(e,8).transform("wizard.confirm.desc"))),t(e,12,0,r._22(e,14).id,r._22(e,14).indeterminate,r._22(e,14).checked,r._22(e,14).disabled,"before"==r._22(e,14).labelPosition),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wizard.confirm.checkbox"))),t(e,24,0,r._32(e,24,0,r._22(e,25).transform("wizard.confirm.button")))})}var Jg=r._5("app-onboarding-safeguard",ug,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,Gg,Ug)),r._8(1,49152,null,0,ug,[As],null,null)],null,null)},{},{},[]),qg=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function Qg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.description)})}function Xg(t){return r._33(0,[(t()(),r._9(0,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,7)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,7).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,7)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,7)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,12).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._8(7,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(9,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(11,16384,null,0,Ta,[oa],null,null),r._8(12,16384,null,0,Yg,[r.l],null,null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,9,0,"confirm_password")},function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("password.confirm-label"))),t(e,6,0,r._22(e,11).ngClassUntouched,r._22(e,11).ngClassTouched,r._22(e,11).ngClassPristine,r._22(e,11).ngClassDirty,r._22(e,11).ngClassValid,r._22(e,11).ngClassInvalid,r._22(e,11).ngClassPending)})}function Kg(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,39,"app-modal",[],null,null,null,Dg,Tg)),r._8(2,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),r._25(131072,mp.i,[mp.j,r.h]),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Qg)),r._8(7,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(9,0,null,0,22,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,10).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,10).onReset()&&i),i},null,null)),r._8(10,540672,null,0,Ba,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,zs,null,[Ba]),r._8(12,16384,null,0,Oa,[zs],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,21)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,21).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,21)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,21)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,26).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._8(21,16384,null,0,ta,[r.G,r.l,[2,$s]],null,null),r._28(1024,null,Ks,function(t){return[t]},[ta]),r._8(23,671744,null,0,Ga,[[3,zs],[8,null],[8,null],[2,Ks]],{name:[0,"name"]},null),r._28(2048,null,oa,null,[Ga]),r._8(25,16384,null,0,Ta,[oa],null,null),r._8(26,16384,null,0,Yg,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Xg)),r._8(30,16384,null,0,F,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(33,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.proceed()&&r),r},Sf,kf)),r._8(36,49152,[[1,4],["button",4]],0,Mc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(37,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,r._32(e,2,1,n.data.title?r._22(e,3).transform(n.data.title):r._22(e,4).transform("password.title")),n.disableDismiss),t(e,7,0,n.data.description),t(e,10,0,n.form),t(e,23,0,"password"),t(e,30,0,n.data.confirm),t(e,36,0,!n.form.valid)},function(t,e){t(e,9,0,r._22(e,12).ngClassUntouched,r._22(e,12).ngClassTouched,r._22(e,12).ngClassPristine,r._22(e,12).ngClassDirty,r._22(e,12).ngClassValid,r._22(e,12).ngClassInvalid,r._22(e,12).ngClassPending),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("password.label"))),t(e,20,0,r._22(e,25).ngClassUntouched,r._22(e,25).ngClassTouched,r._22(e,25).ngClassPristine,r._22(e,25).ngClassDirty,r._22(e,25).ngClassValid,r._22(e,25).ngClassInvalid,r._22(e,25).ngClassPending),t(e,37,0,r._32(e,37,0,r._22(e,38).transform("password.button")))})}var Zg=r._5("app-password-dialog",gp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-password-dialog",[],null,null,null,Kg,qg)),r._8(1,245760,null,0,gp,[js,As,pc,mp.j],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),$g=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function ty(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"app-modal",[],null,null,null,Dg,Tg)),r._8(1,573440,null,0,Sg,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(4,0,null,0,8,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(14,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.dialogRef.close()&&r),r},Sf,kf)),r._8(17,49152,null,0,Mc,[],null,{action:"action"}),(t()(),r._31(18,0,["\n ","\n "])),r._25(131072,mp.i,[mp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,1,0,e.component.dialogRef,r._32(e,1,1,r._22(e,2).transform("title.seed")))},function(t,e){var n=e.component;t(e,7,0,r._32(e,7,0,r._22(e,8).transform("backup.seed"))),t(e,11,0,n.data.seed),t(e,18,0,r._32(e,18,0,r._22(e,19).transform("backup.close-button")))})}var ey=r._5("app-seed-modal",_p,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-seed-modal",[],null,null,null,ty,$g)),r._8(1,180224,null,0,_p,[js,As],null,null)],null,null)},{},{},[]),ny=r._7({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function ry(t){return r._33(0,[(t()(),r._9(0,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),r._8(1,212992,null,0,Uh,[Wh,r.R,r.j,[8,null],r.h],null,null),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,1,0)},null)}var iy=r._5("app-root",Ep,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-root",[],null,null,null,ry,ny)),r._8(1,114688,null,0,Ep,[Pp,mp.j],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]);function oy(t){switch(t.length){case 0:return new Ss;case 1:return t[0];default:return new Ts(t)}}function sy(t,e,n,r,i,o){void 0===i&&(i={}),void 0===o&&(o={});var s=[],a=[],l=-1,u=null;if(r.forEach(function(t){var n=t.offset,r=n==l,c=r&&u||{};Object.keys(t).forEach(function(n){var r=n,a=t[n];if("offset"!==n)switch(r=e.normalizePropertyName(r,s),a){case Os:a=i[n];break;case ks:a=o[n];break;default:a=e.normalizeStyleValue(n,r,a,s)}c[r]=a}),r||a.push(c),u=c,l=n}),s.length)throw new Error("Unable to animate due to the following errors:\n - "+s.join("\n - "));return a}function ay(t,e,n,r){switch(e){case"start":t.onStart(function(){return r(n&&ly(n,"start",t.totalTime))});break;case"done":t.onDone(function(){return r(n&&ly(n,"done",t.totalTime))});break;case"destroy":t.onDestroy(function(){return r(n&&ly(n,"destroy",t.totalTime))})}}function ly(t,e,n){var r=uy(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,void 0==n?t.totalTime:n),i=t._data;return null!=i&&(r._data=i),r}function uy(t,e,n,r,i,o){return void 0===i&&(i=""),void 0===o&&(o=0),{element:t,triggerName:e,fromState:n,toState:r,phaseName:i,totalTime:o}}function cy(t,e,n){var r;return t instanceof Map?(r=t.get(e))||t.set(e,r=n):(r=t[e])||(r=t[e]=n),r}function dy(t){var e=t.indexOf(":");return[t.substring(1,e),t.substr(e+1)]}var hy=function(t,e){return!1},py=function(t,e){return!1},fy=function(t,e,n){return[]};if("undefined"!=typeof Element){if(hy=function(t,e){return t.contains(e)},Element.prototype.matches)py=function(t,e){return t.matches(e)};else{var _y=Element.prototype,my=_y.matchesSelector||_y.mozMatchesSelector||_y.msMatchesSelector||_y.oMatchesSelector||_y.webkitMatchesSelector;my&&(py=function(t,e){return my.apply(t,[e])})}fy=function(t,e,n){var r=[];if(n)r.push.apply(r,t.querySelectorAll(e));else{var i=t.querySelector(e);i&&r.push(i)}return r}}var gy=null,yy=!1;function vy(){return"undefined"!=typeof document?document.body:null}var by=py,wy=hy,My=fy,ky=function(){function t(){}return t.prototype.validateStyleProperty=function(t){return function(t){gy||(gy=vy()||{},yy=!!gy.style&&"WebkitAppearance"in gy.style);var e=!0;return gy.style&&!function(t){return"ebkit"==t.substring(1,6)}(t)&&!(e=t in gy.style)&&yy&&(e="Webkit"+t.charAt(0).toUpperCase()+t.substr(1)in gy.style),e}(t)},t.prototype.matchesElement=function(t,e){return by(t,e)},t.prototype.containsElement=function(t,e){return wy(t,e)},t.prototype.query=function(t,e,n){return My(t,e,n)},t.prototype.computeStyle=function(t,e,n){return n||""},t.prototype.animate=function(t,e,n,r,i,o){return void 0===o&&(o=[]),new Ss},t}(),xy=function(){function t(){}return t.NOOP=new ky,t}(),Ly=1e3;function Cy(t){if("number"==typeof t)return t;var e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Sy(parseFloat(e[1]),e[2])}function Sy(t,e){switch(e){case"s":return t*Ly;default:return t}}function Ty(t,e,n){return t.hasOwnProperty("duration")?t:function(t,e,n){var r,i=0,o="";if("string"==typeof t){var s=t.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===s)return e.push('The provided timing value "'+t+'" is invalid.'),{duration:0,delay:0,easing:""};r=Sy(parseFloat(s[1]),s[2]);var a=s[3];null!=a&&(i=Sy(Math.floor(parseFloat(a)),s[4]));var l=s[5];l&&(o=l)}else r=t;if(!n){var u=!1,c=e.length;r<0&&(e.push("Duration values below 0 are not allowed for this animation step."),u=!0),i<0&&(e.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&e.splice(c,0,'The provided timing value "'+t+'" is invalid.')}return{duration:r,delay:i,easing:o}}(t,e,n)}function Oy(t,e){return void 0===e&&(e={}),Object.keys(t).forEach(function(n){e[n]=t[n]}),e}function Dy(t,e,n){if(void 0===n&&(n={}),e)for(var r in t)n[r]=t[r];else Oy(t,n);return n}function Yy(t,e){t.style&&Object.keys(e).forEach(function(n){var r=Fy(n);t.style[r]=e[n]})}function Py(t,e){t.style&&Object.keys(e).forEach(function(e){var n=Fy(e);t.style[n]=""})}function Ey(t){return Array.isArray(t)?1==t.length?t[0]:xs(t):t}var Ay=new RegExp("{{\\s*(.+?)\\s*}}","g");function jy(t){var e=[];if("string"==typeof t){for(var n=t.toString(),r=void 0;r=Ay.exec(n);)e.push(r[1]);Ay.lastIndex=0}return e}function Iy(t,e,n){var r=t.toString(),i=r.replace(Ay,function(t,r){var i=e[r];return e.hasOwnProperty(r)||(n.push("Please provide a value for the animation param "+r),i=""),i.toString()});return i==r?t:i}function Ry(t){for(var e=[],n=t.next();!n.done;)e.push(n.value),n=t.next();return e}var Hy=/-+([a-z0-9])/g;function Fy(t){return t.replace(Hy,function(){for(var t=[],e=0;e *";case":leave":return"* => void";case":increment":return function(t,e){return parseFloat(e)>parseFloat(t)};case":decrement":return function(t,e){return parseFloat(e) *"}}(t,n);if("function"==typeof r)return void e.push(r);t=r}var i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==i||i.length<4)return n.push('The provided transition expression "'+t+'" is not supported'),e;var o=i[1],s=i[2],a=i[3];e.push(Wy(o,a)),"<"!=s[0]||o==Vy&&a==Vy||e.push(Wy(a,o))}(t,i,r)}):i.push(n),i),animation:o,queryCount:e.queryCount,depCount:e.depCount,options:Xy(t.options)}},t.prototype.visitSequence=function(t,e){var n=this;return{type:2,steps:t.steps.map(function(t){return Ny(n,t,e)}),options:Xy(t.options)}},t.prototype.visitGroup=function(t,e){var n=this,r=e.currentTime,i=0,o=t.steps.map(function(t){e.currentTime=r;var o=Ny(n,t,e);return i=Math.max(i,e.currentTime),o});return e.currentTime=i,{type:3,steps:o,options:Xy(t.options)}},t.prototype.visitAnimate=function(t,e){var n,r=function(t,e){var n=null;if(t.hasOwnProperty("duration"))n=t;else if("number"==typeof t)return Ky(Ty(t,e).duration,0,"");var r=t;if(r.split(/\s+/).some(function(t){return"{"==t.charAt(0)&&"{"==t.charAt(1)})){var i=Ky(0,0,"");return i.dynamic=!0,i.strValue=r,i}return Ky((n=n||Ty(r,e)).duration,n.delay,n.easing)}(t.timings,e.errors);e.currentAnimateTimings=r;var i=t.styles?t.styles:Ls({});if(5==i.type)n=this.visitKeyframes(i,e);else{var o=t.styles,s=!1;if(!o){s=!0;var a={};r.easing&&(a.easing=r.easing),o=Ls(a)}e.currentTime+=r.duration+r.delay;var l=this.visitStyle(o,e);l.isEmptyStep=s,n=l}return e.currentAnimateTimings=null,{type:4,timings:r,style:n,options:null}},t.prototype.visitStyle=function(t,e){var n=this._makeStyleAst(t,e);return this._validateStyleAst(n,e),n},t.prototype._makeStyleAst=function(t,e){var n=[];Array.isArray(t.styles)?t.styles.forEach(function(t){"string"==typeof t?t==ks?n.push(t):e.errors.push("The provided style string value "+t+" is not allowed."):n.push(t)}):n.push(t.styles);var r=!1,i=null;return n.forEach(function(t){if(Qy(t)){var e=t,n=e.easing;if(n&&(i=n,delete e.easing),!r)for(var o in e)if(e[o].toString().indexOf("{{")>=0){r=!0;break}}}),{type:6,styles:n,easing:i,offset:t.offset,containsDynamicStyles:r,options:null}},t.prototype._validateStyleAst=function(t,e){var n=this,r=e.currentAnimateTimings,i=e.currentTime,o=e.currentTime;r&&o>0&&(o-=r.duration+r.delay),t.styles.forEach(function(t){"string"!=typeof t&&Object.keys(t).forEach(function(r){if(n._driver.validateStyleProperty(r)){var s,a,l,u=e.collectedStyles[e.currentQuerySelector],c=u[r],d=!0;c&&(o!=i&&o>=c.startTime&&i<=c.endTime&&(e.errors.push('The CSS property "'+r+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+o+'ms" and "'+i+'ms"'),d=!1),o=c.startTime),d&&(u[r]={startTime:o,endTime:i}),e.options&&(s=e.errors,a=e.options.params||{},(l=jy(t[r])).length&&l.forEach(function(t){a.hasOwnProperty(t)||s.push("Unable to resolve the local animation param "+t+" in the given list of values")}))}else e.errors.push('The provided animation property "'+r+'" is not a supported CSS property for animations')})})},t.prototype.visitKeyframes=function(t,e){var n=this,r={type:5,styles:[],options:null};if(!e.currentAnimateTimings)return e.errors.push("keyframes() must be placed inside of a call to animate()"),r;var i=0,o=[],s=!1,a=!1,l=0,u=t.steps.map(function(t){var r=n._makeStyleAst(t,e),u=null!=r.offset?r.offset:function(t){if("string"==typeof t)return null;var e=null;if(Array.isArray(t))t.forEach(function(t){if(Qy(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}});else if(Qy(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}return e}(r.styles),c=0;return null!=u&&(i++,c=r.offset=u),a=a||c<0||c>1,s=s||c0&&i0?i==h?1:d*i:o[i],a=s*_;e.currentTime=p+f.delay+a,f.duration=a,n._validateStyleAst(t,e),t.offset=s,r.styles.push(t)}),r},t.prototype.visitReference=function(t,e){return{type:8,animation:Ny(this,Ey(t.animation),e),options:Xy(t.options)}},t.prototype.visitAnimateChild=function(t,e){return e.depCount++,{type:9,options:Xy(t.options)}},t.prototype.visitAnimateRef=function(t,e){return{type:10,animation:this.visitReference(t.animation,e),options:Xy(t.options)}},t.prototype.visitQuery=function(t,e){var n=e.currentQuerySelector,r=t.options||{};e.queryCount++,e.currentQuery=t;var i=function(t){var e=!!t.split(/\s*,\s*/).find(function(t){return":self"==t});return e&&(t=t.replace(Uy,"")),[t=t.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(t){return".ng-trigger-"+t.substr(1)}).replace(/:animating/g,".ng-animating"),e]}(t.selector),o=i[0],s=i[1];e.currentQuerySelector=n.length?n+" "+o:o,cy(e.collectedStyles,e.currentQuerySelector,{});var a=Ny(this,Ey(t.animation),e);return e.currentQuery=null,e.currentQuerySelector=n,{type:11,selector:o,limit:r.limit||0,optional:!!r.optional,includeSelf:s,animation:a,originalSelector:t.selector,options:Xy(t.options)}},t.prototype.visitStagger=function(t,e){e.currentQuery||e.errors.push("stagger() can only be used inside of query()");var n="full"===t.timings?{duration:0,delay:0,easing:"full"}:Ty(t.timings,e.errors,!0);return{type:12,animation:Ny(this,Ey(t.animation),e),timings:n,options:null}},t}(),qy=function(t){this.errors=t,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function Qy(t){return!Array.isArray(t)&&"object"==typeof t}function Xy(t){var e;return t?(t=Oy(t)).params&&(t.params=(e=t.params)?Oy(e):null):t={},t}function Ky(t,e,n){return{duration:t,delay:e,easing:n}}function Zy(t,e,n,r,i,o,s,a){return void 0===s&&(s=null),void 0===a&&(a=!1),{type:1,element:t,keyframes:e,preStyleProps:n,postStyleProps:r,duration:i,delay:o,totalTime:i+o,easing:s,subTimeline:a}}var $y=function(){function t(){this._map=new Map}return t.prototype.consume=function(t){var e=this._map.get(t);return e?this._map.delete(t):e=[],e},t.prototype.append=function(t,e){var n=this._map.get(t);n||this._map.set(t,n=[]),n.push.apply(n,e)},t.prototype.has=function(t){return this._map.has(t)},t.prototype.clear=function(){this._map.clear()},t}(),tv=new RegExp(":enter","g"),ev=new RegExp(":leave","g");function nv(t,e,n,r,i,o,s,a,l,u){return void 0===o&&(o={}),void 0===s&&(s={}),void 0===u&&(u=[]),(new rv).buildKeyframes(t,e,n,r,i,o,s,a,l,u)}var rv=function(){function t(){}return t.prototype.buildKeyframes=function(t,e,n,r,i,o,s,a,l,u){void 0===u&&(u=[]),l=l||new $y;var c=new ov(t,e,l,r,i,u,[]);c.options=a,c.currentTimeline.setStyles([o],null,c.errors,a),Ny(this,n,c);var d=c.timelines.filter(function(t){return t.containsAnimation()});if(d.length&&Object.keys(s).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([s],null,c.errors,a)}return d.length?d.map(function(t){return t.buildKeyframes()}):[Zy(e,[],[],[],0,0,"",!1)]},t.prototype.visitTrigger=function(t,e){},t.prototype.visitState=function(t,e){},t.prototype.visitTransition=function(t,e){},t.prototype.visitAnimateChild=function(t,e){var n=e.subInstructions.consume(e.element);if(n){var r=e.createSubContext(t.options),i=e.currentTimeline.currentTime,o=this._visitSubInstructions(n,r,r.options);i!=o&&e.transformIntoNewTimeline(o)}e.previousNode=t},t.prototype.visitAnimateRef=function(t,e){var n=e.createSubContext(t.options);n.transformIntoNewTimeline(),this.visitReference(t.animation,n),e.transformIntoNewTimeline(n.currentTimeline.currentTime),e.previousNode=t},t.prototype._visitSubInstructions=function(t,e,n){var r=e.currentTimeline.currentTime,i=null!=n.duration?Cy(n.duration):null,o=null!=n.delay?Cy(n.delay):null;return 0!==i&&t.forEach(function(t){var n=e.appendInstructionToTimeline(t,i,o);r=Math.max(r,n.duration+n.delay)}),r},t.prototype.visitReference=function(t,e){e.updateOptions(t.options,!0),Ny(this,t.animation,e),e.previousNode=t},t.prototype.visitSequence=function(t,e){var n=this,r=e.subContextCount,i=e,o=t.options;if(o&&(o.params||o.delay)&&((i=e.createSubContext(o)).transformIntoNewTimeline(),null!=o.delay)){6==i.previousNode.type&&(i.currentTimeline.snapshotCurrentStyles(),i.previousNode=iv);var s=Cy(o.delay);i.delayNextStep(s)}t.steps.length&&(t.steps.forEach(function(t){return Ny(n,t,i)}),i.currentTimeline.applyStylesToKeyframe(),i.subContextCount>r&&i.transformIntoNewTimeline()),e.previousNode=t},t.prototype.visitGroup=function(t,e){var n=this,r=[],i=e.currentTimeline.currentTime,o=t.options&&t.options.delay?Cy(t.options.delay):0;t.steps.forEach(function(s){var a=e.createSubContext(t.options);o&&a.delayNextStep(o),Ny(n,s,a),i=Math.max(i,a.currentTimeline.currentTime),r.push(a.currentTimeline)}),r.forEach(function(t){return e.currentTimeline.mergeTimelineCollectedStyles(t)}),e.transformIntoNewTimeline(i),e.previousNode=t},t.prototype._visitTiming=function(t,e){if(t.dynamic){var n=t.strValue;return Ty(e.params?Iy(n,e.params,e.errors):n,e.errors)}return{duration:t.duration,delay:t.delay,easing:t.easing}},t.prototype.visitAnimate=function(t,e){var n=e.currentAnimateTimings=this._visitTiming(t.timings,e),r=e.currentTimeline;n.delay&&(e.incrementTime(n.delay),r.snapshotCurrentStyles());var i=t.style;5==i.type?this.visitKeyframes(i,e):(e.incrementTime(n.duration),this.visitStyle(i,e),r.applyStylesToKeyframe()),e.currentAnimateTimings=null,e.previousNode=t},t.prototype.visitStyle=function(t,e){var n=e.currentTimeline,r=e.currentAnimateTimings;!r&&n.getCurrentStyleProperties().length&&n.forwardFrame();var i=r&&r.easing||t.easing;t.isEmptyStep?n.applyEmptyStep(i):n.setStyles(t.styles,i,e.errors,e.options),e.previousNode=t},t.prototype.visitKeyframes=function(t,e){var n=e.currentAnimateTimings,r=e.currentTimeline.duration,i=n.duration,o=e.createSubContext().currentTimeline;o.easing=n.easing,t.styles.forEach(function(t){o.forwardTime((t.offset||0)*i),o.setStyles(t.styles,t.easing,e.errors,e.options),o.applyStylesToKeyframe()}),e.currentTimeline.mergeTimelineCollectedStyles(o),e.transformIntoNewTimeline(r+i),e.previousNode=t},t.prototype.visitQuery=function(t,e){var n=this,r=e.currentTimeline.currentTime,i=t.options||{},o=i.delay?Cy(i.delay):0;o&&(6===e.previousNode.type||0==r&&e.currentTimeline.getCurrentStyleProperties().length)&&(e.currentTimeline.snapshotCurrentStyles(),e.previousNode=iv);var s=r,a=e.invokeQuery(t.selector,t.originalSelector,t.limit,t.includeSelf,!!i.optional,e.errors);e.currentQueryTotal=a.length;var l=null;a.forEach(function(r,i){e.currentQueryIndex=i;var a=e.createSubContext(t.options,r);o&&a.delayNextStep(o),r===e.element&&(l=a.currentTimeline),Ny(n,t.animation,a),a.currentTimeline.applyStylesToKeyframe(),s=Math.max(s,a.currentTimeline.currentTime)}),e.currentQueryIndex=0,e.currentQueryTotal=0,e.transformIntoNewTimeline(s),l&&(e.currentTimeline.mergeTimelineCollectedStyles(l),e.currentTimeline.snapshotCurrentStyles()),e.previousNode=t},t.prototype.visitStagger=function(t,e){var n=e.parentContext,r=e.currentTimeline,i=t.timings,o=Math.abs(i.duration),s=o*(e.currentQueryTotal-1),a=o*e.currentQueryIndex;switch(i.duration<0?"reverse":i.easing){case"reverse":a=s-a;break;case"full":a=n.currentStaggerTime}var l=e.currentTimeline;a&&l.delayNextStep(a);var u=l.currentTime;Ny(this,t.animation,e),e.previousNode=t,n.currentStaggerTime=r.currentTime-u+(r.startTime-n.currentTimeline.startTime)},t}(),iv={},ov=function(){function t(t,e,n,r,i,o,s,a){this._driver=t,this.element=e,this.subInstructions=n,this._enterClassName=r,this._leaveClassName=i,this.errors=o,this.timelines=s,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=iv,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=a||new sv(this._driver,e,0),s.push(this.currentTimeline)}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.updateOptions=function(t,e){var n=this;if(t){var r=t,i=this.options;null!=r.duration&&(i.duration=Cy(r.duration)),null!=r.delay&&(i.delay=Cy(r.delay));var o=r.params;if(o){var s=i.params;s||(s=this.options.params={}),Object.keys(o).forEach(function(t){e&&s.hasOwnProperty(t)||(s[t]=Iy(o[t],s,n.errors))})}}},t.prototype._copyOptions=function(){var t={};if(this.options){var e=this.options.params;if(e){var n=t.params={};Object.keys(e).forEach(function(t){n[t]=e[t]})}}return t},t.prototype.createSubContext=function(e,n,r){void 0===e&&(e=null);var i=n||this.element,o=new t(this._driver,i,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(i,r||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o},t.prototype.transformIntoNewTimeline=function(t){return this.previousNode=iv,this.currentTimeline=this.currentTimeline.fork(this.element,t),this.timelines.push(this.currentTimeline),this.currentTimeline},t.prototype.appendInstructionToTimeline=function(t,e,n){var r={duration:null!=e?e:t.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+t.delay,easing:""},i=new av(this._driver,t.element,t.keyframes,t.preStyleProps,t.postStyleProps,r,t.stretchStartingKeyframe);return this.timelines.push(i),r},t.prototype.incrementTime=function(t){this.currentTimeline.forwardTime(this.currentTimeline.duration+t)},t.prototype.delayNextStep=function(t){t>0&&this.currentTimeline.delayNextStep(t)},t.prototype.invokeQuery=function(t,e,n,r,i,o){var s=[];if(r&&s.push(this.element),t.length>0){t=(t=t.replace(tv,"."+this._enterClassName)).replace(ev,"."+this._leaveClassName);var a=this._driver.query(this.element,t,1!=n);0!==n&&(a=n<0?a.slice(a.length+n,a.length):a.slice(0,n)),s.push.apply(s,a)}return i||0!=s.length||o.push('`query("'+e+'")` returned zero elements. (Use `query("'+e+'", { optional: true })` if you wish to allow this.)'),s},t}(),sv=function(){function t(t,e,n,r){this._driver=t,this.element=e,this.startTime=n,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(e),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(e,this._localTimelineStyles)),this._loadKeyframe()}return t.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},t.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(t.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),t.prototype.delayNextStep=function(t){var e=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||e?(this.forwardTime(this.currentTime+t),e&&this.snapshotCurrentStyles()):this.startTime+=t},t.prototype.fork=function(e,n){return this.applyStylesToKeyframe(),new t(this._driver,e,n||this.currentTime,this._elementTimelineStylesLookup)},t.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},t.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},t.prototype.forwardTime=function(t){this.applyStylesToKeyframe(),this.duration=t,this._loadKeyframe()},t.prototype._updateStyle=function(t,e){this._localTimelineStyles[t]=e,this._globalTimelineStyles[t]=e,this._styleSummary[t]={time:this.currentTime,value:e}},t.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},t.prototype.applyEmptyStep=function(t){var e=this;t&&(this._previousKeyframe.easing=t),Object.keys(this._globalTimelineStyles).forEach(function(t){e._backFill[t]=e._globalTimelineStyles[t]||ks,e._currentKeyframe[t]=ks}),this._currentEmptyStepKeyframe=this._currentKeyframe},t.prototype.setStyles=function(t,e,n,r){var i=this;e&&(this._previousKeyframe.easing=e);var o=r&&r.params||{},s=function(t,e){var n,r={};return t.forEach(function(t){"*"===t?(n=n||Object.keys(e)).forEach(function(t){r[t]=ks}):Dy(t,!1,r)}),r}(t,this._globalTimelineStyles);Object.keys(s).forEach(function(t){var e=Iy(s[t],o,n);i._pendingStyles[t]=e,i._localTimelineStyles.hasOwnProperty(t)||(i._backFill[t]=i._globalTimelineStyles.hasOwnProperty(t)?i._globalTimelineStyles[t]:ks),i._updateStyle(t,e)})},t.prototype.applyStylesToKeyframe=function(){var t=this,e=this._pendingStyles,n=Object.keys(e);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){t._currentKeyframe[n]=e[n]}),Object.keys(this._localTimelineStyles).forEach(function(e){t._currentKeyframe.hasOwnProperty(e)||(t._currentKeyframe[e]=t._localTimelineStyles[e])}))},t.prototype.snapshotCurrentStyles=function(){var t=this;Object.keys(this._localTimelineStyles).forEach(function(e){var n=t._localTimelineStyles[e];t._pendingStyles[e]=n,t._updateStyle(e,n)})},t.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(t.prototype,"properties",{get:function(){var t=[];for(var e in this._currentKeyframe)t.push(e);return t},enumerable:!0,configurable:!0}),t.prototype.mergeTimelineCollectedStyles=function(t){var e=this;Object.keys(t._styleSummary).forEach(function(n){var r=e._styleSummary[n],i=t._styleSummary[n];(!r||i.time>r.time)&&e._updateStyle(n,i.value)})},t.prototype.buildKeyframes=function(){var t=this;this.applyStylesToKeyframe();var e=new Set,n=new Set,r=1===this._keyframes.size&&0===this.duration,i=[];this._keyframes.forEach(function(o,s){var a=Dy(o,!0);Object.keys(a).forEach(function(t){var r=a[t];r==Os?e.add(t):r==ks&&n.add(t)}),r||(a.offset=s/t.duration),i.push(a)});var o=e.size?Ry(e.values()):[],s=n.size?Ry(n.values()):[];if(r){var a=i[0],l=Oy(a);a.offset=0,l.offset=1,i=[a,l]}return Zy(this.element,i,o,s,this.duration,this.startTime,this.easing,!1)},t}(),av=function(t){function e(e,n,r,i,o,s,a){void 0===a&&(a=!1);var l=t.call(this,e,n,s.delay)||this;return l.element=n,l.keyframes=r,l.preStyleProps=i,l.postStyleProps=o,l._stretchStartingKeyframe=a,l.timings={duration:s.duration,delay:s.delay,easing:s.easing},l}return Object(o.__extends)(e,t),e.prototype.containsAnimation=function(){return this.keyframes.length>1},e.prototype.buildKeyframes=function(){var t=this.keyframes,e=this.timings,n=e.delay,r=e.duration,i=e.easing;if(this._stretchStartingKeyframe&&n){var o=[],s=r+n,a=n/s,l=Dy(t[0],!1);l.offset=0,o.push(l);var u=Dy(t[0],!1);u.offset=lv(a),o.push(u);for(var c=t.length-1,d=1;d<=c;d++){var h=Dy(t[d],!1);h.offset=lv((n+h.offset*r)/s),o.push(h)}r=s,n=0,i="",t=o}return Zy(this.element,t,this.preStyleProps,this.postStyleProps,r,n,i,!0)},e}(sv);function lv(t,e){void 0===e&&(e=3);var n=Math.pow(10,e-1);return Math.round(t*n)/n}var uv=function(){},cv=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.normalizePropertyName=function(t,e){return Fy(t)},e.prototype.normalizeStyleValue=function(t,e,n,r){var i="",o=n.toString().trim();if(dv[e]&&0!==n&&"0"!==n)if("number"==typeof n)i="px";else{var s=n.match(/^[+-]?[\d\.]+([a-z]*)$/);s&&0==s[1].length&&r.push("Please provide a CSS unit value for "+t+":"+n)}return o+i},e}(uv),dv=function(t){var e={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(t){return e[t]=!0}),e}();function hv(t,e,n,r,i,o,s,a,l,u,c,d){return{type:0,element:t,triggerName:e,isRemovalTransition:i,fromState:n,fromStyles:o,toState:r,toStyles:s,timelines:a,queriedElements:l,preStyleProps:u,postStyleProps:c,errors:d}}var pv={},fv=function(){function t(t,e,n){this._triggerName=t,this.ast=e,this._stateStyles=n}return t.prototype.match=function(t,e){return function(t,e,n){return t.some(function(t){return t(e,n)})}(this.ast.matchers,t,e)},t.prototype.buildStyles=function(t,e,n){var r=this._stateStyles["*"],i=this._stateStyles[t],o=r?r.buildStyles(e,n):{};return i?i.buildStyles(e,n):o},t.prototype.build=function(t,e,n,r,i,s,a,l,u){var c=[],d=this.ast.options&&this.ast.options.params||pv,h=this.buildStyles(n,a&&a.params||pv,c),p=l&&l.params||pv,f=this.buildStyles(r,p,c),_=new Set,m=new Map,g=new Map,y="void"===r,v={params:Object(o.__assign)({},d,p)},b=nv(t,e,this.ast.animation,i,s,h,f,v,u,c);if(c.length)return hv(e,this._triggerName,n,r,y,h,f,[],[],m,g,c);b.forEach(function(t){var n=t.element,r=cy(m,n,{});t.preStyleProps.forEach(function(t){return r[t]=!0});var i=cy(g,n,{});t.postStyleProps.forEach(function(t){return i[t]=!0}),n!==e&&_.add(n)});var w=Ry(_.values());return hv(e,this._triggerName,n,r,y,h,f,b,w,m,g)},t}(),_v=function(){function t(t,e){this.styles=t,this.defaultParams=e}return t.prototype.buildStyles=function(t,e){var n={},r=Oy(this.defaultParams);return Object.keys(t).forEach(function(e){var n=t[e];null!=n&&(r[e]=n)}),this.styles.styles.forEach(function(t){if("string"!=typeof t){var i=t;Object.keys(i).forEach(function(t){var o=i[t];o.length>1&&(o=Iy(o,r,e)),n[t]=o})}}),n},t}(),mv=function(){function t(t,e){var n=this;this.name=t,this.ast=e,this.transitionFactories=[],this.states={},e.states.forEach(function(t){n.states[t.name]=new _v(t.style,t.options&&t.options.params||{})}),gv(this.states,"true","1"),gv(this.states,"false","0"),e.transitions.forEach(function(e){n.transitionFactories.push(new fv(t,e,n.states))}),this.fallbackTransition=new fv(t,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(t,e){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(t.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),t.prototype.matchTransition=function(t,e){return this.transitionFactories.find(function(n){return n.match(t,e)})||null},t.prototype.matchStyles=function(t,e,n){return this.fallbackTransition.buildStyles(t,e,n)},t}();function gv(t,e,n){t.hasOwnProperty(e)?t.hasOwnProperty(n)||(t[n]=t[e]):t.hasOwnProperty(n)&&(t[e]=t[n])}var yv=new $y,vv=function(){function t(t,e){this._driver=t,this._normalizer=e,this._animations={},this._playersById={},this.players=[]}return t.prototype.register=function(t,e){var n=[],r=Gy(this._driver,e,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: "+n.join("\n"));this._animations[t]=r},t.prototype._buildPlayer=function(t,e,n){var r=t.element,i=sy(0,this._normalizer,0,t.keyframes,e,n);return this._driver.animate(r,i,t.duration,t.delay,t.easing,[])},t.prototype.create=function(t,e,n){var r=this;void 0===n&&(n={});var i,o=[],s=this._animations[t],a=new Map;if(s?(i=nv(this._driver,e,s,"ng-enter","ng-leave",{},{},n,yv,o)).forEach(function(t){var e=cy(a,t.element,{});t.postStyleProps.forEach(function(t){return e[t]=null})}):(o.push("The requested animation doesn't exist or has already been destroyed"),i=[]),o.length)throw new Error("Unable to create the animation due to the following errors: "+o.join("\n"));a.forEach(function(t,e){Object.keys(t).forEach(function(n){t[n]=r._driver.computeStyle(e,n,ks)})});var l=oy(i.map(function(t){var e=a.get(t.element);return r._buildPlayer(t,{},e)}));return this._playersById[t]=l,l.onDestroy(function(){return r.destroy(t)}),this.players.push(l),l},t.prototype.destroy=function(t){var e=this._getPlayer(t);e.destroy(),delete this._playersById[t];var n=this.players.indexOf(e);n>=0&&this.players.splice(n,1)},t.prototype._getPlayer=function(t){var e=this._playersById[t];if(!e)throw new Error("Unable to find the timeline player referenced by "+t);return e},t.prototype.listen=function(t,e,n,r){var i=uy(e,"","","");return ay(this._getPlayer(t),n,i,r),function(){}},t.prototype.command=function(t,e,n,r){if("register"!=n)if("create"!=n){var i=this._getPlayer(t);switch(n){case"play":i.play();break;case"pause":i.pause();break;case"reset":i.reset();break;case"restart":i.restart();break;case"finish":i.finish();break;case"init":i.init();break;case"setPosition":i.setPosition(parseFloat(r[0]));break;case"destroy":this.destroy(t)}}else this.create(t,e,r[0]||{});else this.register(t,r[0])},t}(),bv=[],wv={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},Mv={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},kv="__ng_removed",xv=function(){function t(t,e){void 0===e&&(e=""),this.namespaceId=e;var n=t&&t.hasOwnProperty("value");if(this.value=function(t){return null!=t?t:null}(n?t.value:t),n){var r=Oy(t);delete r.value,this.options=r}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.absorbOptions=function(t){var e=t.params;if(e){var n=this.options.params;Object.keys(e).forEach(function(t){null==n[t]&&(n[t]=e[t])})}},t}(),Lv=new xv("void"),Cv=new xv("DELETED"),Sv=function(){function t(t,e,n){this.id=t,this.hostElement=e,this._engine=n,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+t,jv(e,this._hostClassName)}return t.prototype.listen=function(t,e,n,r){var i,o=this;if(!this._triggers.hasOwnProperty(e))throw new Error('Unable to listen on the animation trigger event "'+n+'" because the animation trigger "'+e+"\" doesn't exist!");if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'+e+'" because the provided event is undefined!');if("start"!=(i=n)&&"done"!=i)throw new Error('The provided animation trigger event "'+n+'" for the animation trigger "'+e+'" is not supported!');var s=cy(this._elementListeners,t,[]),a={name:e,phase:n,callback:r};s.push(a);var l=cy(this._engine.statesByElement,t,{});return l.hasOwnProperty(e)||(jv(t,"ng-trigger"),jv(t,"ng-trigger-"+e),l[e]=Lv),function(){o._engine.afterFlush(function(){var t=s.indexOf(a);t>=0&&s.splice(t,1),o._triggers[e]||delete l[e]})}},t.prototype.register=function(t,e){return!this._triggers[t]&&(this._triggers[t]=e,!0)},t.prototype._getTrigger=function(t){var e=this._triggers[t];if(!e)throw new Error('The provided animation trigger "'+t+'" has not been registered!');return e},t.prototype.trigger=function(t,e,n,r){var i=this;void 0===r&&(r=!0);var o=this._getTrigger(e),s=new Ov(this.id,e,t),a=this._engine.statesByElement.get(t);a||(jv(t,"ng-trigger"),jv(t,"ng-trigger-"+e),this._engine.statesByElement.set(t,a={}));var l=a[e],u=new xv(n,this.id);if(!(n&&n.hasOwnProperty("value"))&&l&&u.absorbOptions(l.options),a[e]=u,l){if(l===Cv)return s}else l=Lv;if("void"===u.value||l.value!==u.value){var c=cy(this._engine.playersByElement,t,[]);c.forEach(function(t){t.namespaceId==i.id&&t.triggerName==e&&t.queued&&t.destroy()});var d=o.matchTransition(l.value,u.value),h=!1;if(!d){if(!r)return;d=o.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:t,triggerName:e,transition:d,fromState:l,toState:u,player:s,isFallbackTransition:h}),h||(jv(t,"ng-animate-queued"),s.onStart(function(){Iv(t,"ng-animate-queued")})),s.onDone(function(){var e=i.players.indexOf(s);e>=0&&i.players.splice(e,1);var n=i._engine.playersByElement.get(t);if(n){var r=n.indexOf(s);r>=0&&n.splice(r,1)}}),this.players.push(s),c.push(s),s}if(!function(t,e){var n=Object.keys(t),r=Object.keys(e);if(n.length!=r.length)return!1;for(var i=0;i=0){for(var r=!1,i=n;i>=0;i--)if(this.driver.containsElement(this._namespaceList[i].hostElement,e)){this._namespaceList.splice(i+1,0,t),r=!0;break}r||this._namespaceList.splice(0,0,t)}else this._namespaceList.push(t);return this.namespacesByHostElement.set(e,t),t},t.prototype.register=function(t,e){var n=this._namespaceLookup[t];return n||(n=this.createNamespace(t,e)),n},t.prototype.registerTrigger=function(t,e,n){var r=this._namespaceLookup[t];r&&r.register(e,n)&&this.totalAnimations++},t.prototype.destroy=function(t,e){var n=this;if(t){var r=this._fetchNamespace(t);this.afterFlush(function(){n.namespacesByHostElement.delete(r.hostElement),delete n._namespaceLookup[t];var e=n._namespaceList.indexOf(r);e>=0&&n._namespaceList.splice(e,1)}),this.afterFlushAnimationsDone(function(){return r.destroy(e)})}},t.prototype._fetchNamespace=function(t){return this._namespaceLookup[t]},t.prototype.fetchNamespacesByElement=function(t){var e=new Set,n=this.statesByElement.get(t);if(n)for(var r=Object.keys(n),i=0;i=0;L--)this._namespaceList[L].drainQueuedTransitions(e).forEach(function(t){var e=t.player;k.push(e);var o=t.element;if(h&&n.driver.containsElement(h,o)){var s=w.get(o),d=_.get(o),p=n._buildInstruction(t,r,d,s);if(p.errors&&p.errors.length)x.push(p);else{if(t.isFallbackTransition)return e.onStart(function(){return Py(o,p.fromStyles)}),e.onDestroy(function(){return Yy(o,p.toStyles)}),void i.push(e);p.timelines.forEach(function(t){return t.stretchStartingKeyframe=!0}),r.append(o,p.timelines),a.push({instruction:p,player:e,element:o}),p.queriedElements.forEach(function(t){return cy(l,t,[]).push(e)}),p.preStyleProps.forEach(function(t,e){var n=Object.keys(t);if(n.length){var r=u.get(e);r||u.set(e,r=new Set),n.forEach(function(t){return r.add(t)})}}),p.postStyleProps.forEach(function(t,e){var n=Object.keys(t),r=c.get(e);r||c.set(e,r=new Set),n.forEach(function(t){return r.add(t)})})}}else e.destroy()});if(x.length){var C=[];x.forEach(function(t){C.push("@"+t.triggerName+" has failed due to:\n"),t.errors.forEach(function(t){return C.push("- "+t+"\n")})}),k.forEach(function(t){return t.destroy()}),this.reportError(C)}var S=new Map,T=new Map;a.forEach(function(t){var e=t.element;r.has(e)&&(T.set(e,e),n._beforeAnimationBuild(t.player.namespaceId,t.instruction,S))}),i.forEach(function(t){var e=t.element;n._getPreviousPlayers(e,!1,t.namespaceId,t.triggerName,null).forEach(function(t){cy(S,e,[]).push(t),t.destroy()})});var O=g.filter(function(t){return Hv(t,u,c)}),D=new Map;Pv(D,this.driver,v,c,ks).forEach(function(t){Hv(t,u,c)&&O.push(t)});var Y=new Map;f.forEach(function(t,e){Pv(Y,n.driver,new Set(t),u,Os)}),O.forEach(function(t){var e=D.get(t),n=Y.get(t);D.set(t,Object(o.__assign)({},e,n))});var P=[],E=[],A={};a.forEach(function(t){var e=t.element,o=t.player,a=t.instruction;if(r.has(e)){if(d.has(e))return o.onDestroy(function(){return Yy(e,a.toStyles)}),void i.push(o);var l=A;if(T.size>1){for(var u=e,c=[];u=u.parentNode;){var h=T.get(u);if(h){l=h;break}c.push(u)}c.forEach(function(t){return T.set(t,l)})}var p=n._buildAnimation(o.namespaceId,a,S,s,Y,D);if(o.setRealPlayer(p),l===A)P.push(o);else{var f=n.playersByElement.get(l);f&&f.length&&(o.parentPlayer=oy(f)),i.push(o)}}else Py(e,a.fromStyles),o.onDestroy(function(){return Yy(e,a.toStyles)}),E.push(o),d.has(e)&&i.push(o)}),E.forEach(function(t){var e=s.get(t.element);if(e&&e.length){var n=oy(e);t.setRealPlayer(n)}}),i.forEach(function(t){t.parentPlayer?t.syncPlayerEvents(t.parentPlayer):t.destroy()});for(var j=0;j0?this.driver.animate(t.element,e,t.duration,t.delay,t.easing,n):new Ss},t}(),Ov=function(){function t(t,e,n){this.namespaceId=t,this.triggerName=e,this.element=n,this._player=new Ss,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return t.prototype.setRealPlayer=function(t){var e=this;this._containsRealPlayer||(this._player=t,Object.keys(this._queuedCallbacks).forEach(function(n){e._queuedCallbacks[n].forEach(function(e){return ay(t,n,void 0,e)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},t.prototype.getRealPlayer=function(){return this._player},t.prototype.syncPlayerEvents=function(t){var e=this,n=this._player;n.triggerCallback&&t.onStart(function(){return n.triggerCallback("start")}),t.onDone(function(){return e.finish()}),t.onDestroy(function(){return e.destroy()})},t.prototype._queueEvent=function(t,e){cy(this._queuedCallbacks,t,[]).push(e)},t.prototype.onDone=function(t){this.queued&&this._queueEvent("done",t),this._player.onDone(t)},t.prototype.onStart=function(t){this.queued&&this._queueEvent("start",t),this._player.onStart(t)},t.prototype.onDestroy=function(t){this.queued&&this._queueEvent("destroy",t),this._player.onDestroy(t)},t.prototype.init=function(){this._player.init()},t.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},t.prototype.play=function(){!this.queued&&this._player.play()},t.prototype.pause=function(){!this.queued&&this._player.pause()},t.prototype.restart=function(){!this.queued&&this._player.restart()},t.prototype.finish=function(){this._player.finish()},t.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},t.prototype.reset=function(){!this.queued&&this._player.reset()},t.prototype.setPosition=function(t){this.queued||this._player.setPosition(t)},t.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(t.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),t.prototype.triggerCallback=function(t){var e=this._player;e.triggerCallback&&e.triggerCallback(t)},t}();function Dv(t){return t&&1===t.nodeType}function Yv(t,e){var n=t.style.display;return t.style.display=null!=e?e:"none",n}function Pv(t,e,n,r,i){var o=[];n.forEach(function(t){return o.push(Yv(t))});var s=[];r.forEach(function(n,r){var o={};n.forEach(function(t){var n=o[t]=e.computeStyle(r,t,i);n&&0!=n.length||(r[kv]=Mv,s.push(r))}),t.set(r,o)});var a=0;return n.forEach(function(t){return Yv(t,o[a++])}),s}function Ev(t,e){var n=new Map;if(t.forEach(function(t){return n.set(t,[])}),0==e.length)return n;var r=new Set(e),i=new Map;return e.forEach(function(t){var e=function t(e){if(!e)return 1;var o=i.get(e);if(o)return o;var s=e.parentNode;return o=n.has(s)?s:r.has(s)?1:t(s),i.set(e,o),o}(t);1!==e&&n.get(e).push(t)}),n}var Av="$$classes";function jv(t,e){if(t.classList)t.classList.add(e);else{var n=t[Av];n||(n=t[Av]={}),n[e]=!0}}function Iv(t,e){if(t.classList)t.classList.remove(e);else{var n=t[Av];n&&delete n[e]}}function Rv(t,e,n){oy(n).onDone(function(){return t.processLeaveNode(e)})}function Hv(t,e,n){var r=n.get(t);if(!r)return!1;var i=e.get(t);return i?r.forEach(function(t){return i.add(t)}):e.set(t,r),n.delete(t),!0}var Fv=function(){function t(t,e){var n=this;this._driver=t,this._triggerCache={},this.onRemovalComplete=function(t,e){},this._transitionEngine=new Tv(t,e),this._timelineEngine=new vv(t,e),this._transitionEngine.onRemovalComplete=function(t,e){return n.onRemovalComplete(t,e)}}return t.prototype.registerTrigger=function(t,e,n,r,i){var o=t+"-"+r,s=this._triggerCache[o];if(!s){var a=[],l=Gy(this._driver,i,a);if(a.length)throw new Error('The animation trigger "'+r+'" has failed to build due to the following errors:\n - '+a.join("\n - "));s=function(t,e){return new mv(t,e)}(r,l),this._triggerCache[o]=s}this._transitionEngine.registerTrigger(e,r,s)},t.prototype.register=function(t,e){this._transitionEngine.register(t,e)},t.prototype.destroy=function(t,e){this._transitionEngine.destroy(t,e)},t.prototype.onInsert=function(t,e,n,r){this._transitionEngine.insertNode(t,e,n,r)},t.prototype.onRemove=function(t,e,n){this._transitionEngine.removeNode(t,e,n)},t.prototype.disableAnimations=function(t,e){this._transitionEngine.markElementAsDisabled(t,e)},t.prototype.process=function(t,e,n,r){if("@"==n.charAt(0)){var i=dy(n);this._timelineEngine.command(i[0],e,i[1],r)}else this._transitionEngine.trigger(t,e,n,r)},t.prototype.listen=function(t,e,n,r,i){if("@"==n.charAt(0)){var o=dy(n);return this._timelineEngine.listen(o[0],e,o[1],i)}return this._transitionEngine.listen(t,e,n,r,i)},t.prototype.flush=function(t){void 0===t&&(t=-1),this._transitionEngine.flush(t)},Object.defineProperty(t.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),t.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},t}(),Nv=function(t){function e(e,n){var i=t.call(this)||this;return i._nextAnimationId=0,i._renderer=e.createRenderer(n.body,{id:"0",encapsulation:r.S.None,styles:[],data:{animation:[]}}),i}return Object(o.__extends)(e,t),e.prototype.build=function(t){var e=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(t)?xs(t):t;return zv(this._renderer,null,e,"register",[n]),new Vv(e,this._renderer)},e}(Ms),Vv=function(t){function e(e,n){var r=t.call(this)||this;return r._id=e,r._renderer=n,r}return Object(o.__extends)(e,t),e.prototype.create=function(t,e){return new Bv(this._id,t,e||{},this._renderer)},e}(function(){}),Bv=function(){function t(t,e,n,r){this.id=t,this.element=e,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return t.prototype._listen=function(t,e){return this._renderer.listen(this.element,"@@"+this.id+":"+t,e)},t.prototype._command=function(t){for(var e=[],n=1;n=0&&t=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},z3hR:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?i[n][0]:i[n][1]}function n(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10;return n(0===e?t/10:e)}if(t<1e4){for(;t>=10;)t/=10;return n(t)}return n(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(t){return n(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t},past:function(t){return n(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t},s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d M\xe9int",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))}},[0]); \ No newline at end of file diff --git a/src/gui/static/dist/main.87fed2fa81359655e221.bundle.js b/src/gui/static/dist/main.87fed2fa81359655e221.bundle.js deleted file mode 100755 index 8a79ffc..0000000 --- a/src/gui/static/dist/main.87fed2fa81359655e221.bundle.js +++ /dev/null @@ -1 +0,0 @@ -webpackJsonp([0],{"+27R":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["thodde secondanim","thodde second"],ss:[t+" secondanim",t+" second"],m:["eka mintan","ek minute"],mm:[t+" mintanim",t+" mintam"],h:["eka horan","ek hor"],hh:[t+" horanim",t+" horam"],d:["eka disan","ek dis"],dd:[t+" disanim",t+" dis"],M:["eka mhoinean","ek mhoino"],MM:[t+" mhoineanim",t+" mhoine"],y:["eka vorsan","ek voros"],yy:[t+" vorsanim",t+" vorsam"]};return e?i[n][0]:i[n][1]}t.defineLocale("gom-latn",{months:"Janer_Febrer_Mars_Abril_Mai_Jun_Julai_Agost_Setembr_Otubr_Novembr_Dezembr".split("_"),monthsShort:"Jan._Feb._Mars_Abr._Mai_Jun_Jul._Ago._Set._Otu._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Aitar_Somar_Mongllar_Budvar_Brestar_Sukrar_Son'var".split("_"),weekdaysShort:"Ait._Som._Mon._Bud._Bre._Suk._Son.".split("_"),weekdaysMin:"Ai_Sm_Mo_Bu_Br_Su_Sn".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A h:mm [vazta]",LTS:"A h:mm:ss [vazta]",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY A h:mm [vazta]",LLLL:"dddd, MMMM[achea] Do, YYYY, A h:mm [vazta]",llll:"ddd, D MMM YYYY, A h:mm [vazta]"},calendar:{sameDay:"[Aiz] LT",nextDay:"[Faleam] LT",nextWeek:"[Ieta to] dddd[,] LT",lastDay:"[Kal] LT",lastWeek:"[Fatlo] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s",past:"%s adim",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}(er)/,ordinal:function(t,e){switch(e){case"D":return t+"er";default:case"M":case"Q":case"DDD":case"d":case"w":case"W":return t}},week:{dow:1,doy:4},meridiemParse:/rati|sokalli|donparam|sanje/,meridiemHour:function(t,e){return 12===t&&(t=0),"rati"===e?t<4?t:t+12:"sokalli"===e?t:"donparam"===e?t>12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(n("PJh5"))},"+3/4":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e){t.call(this),this.scheduler=e}return Object(r.b)(e,t),e.create=function(t){return new e(t)},e.dispatch=function(t){t.subscriber.complete()},e.prototype._subscribe=function(t){var n=this.scheduler;if(n)return n.schedule(e.dispatch,0,{subscriber:t});t.complete()},e}(n("YaPU").a)},"+7/x":function(t,e,n){!function(t){"use strict";var e={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};t.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(t){return t+"\u0bb5\u0ba4\u0bc1"},preparse:function(t){return t.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(t,e,n){return t<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":t<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":t<10?" \u0b95\u0bbe\u0bb2\u0bc8":t<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":t<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":t<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(t,e){return 12===t&&(t=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===e?t<2?t:t+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===e||"\u0b95\u0bbe\u0bb2\u0bc8"===e?t:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(n("PJh5"))},"+CnV":function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e,r=n("AMGY").a.Symbol;return"function"==typeof r?r.observable?e=r.observable:(e=r("observable"),r.observable=e):e="@@observable",e}()},"/6P1":function(t,e,n){!function(t){"use strict";var e={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function n(t,e,n,r){return e?i(n)[0]:r?i(n)[1]:i(n)[2]}function r(t){return t%10==0||t>10&&t<20}function i(t){return e[t].split("_")}function o(t,e,o,a){var s=t+" ";return 1===t?s+n(0,e,o[0],a):e?s+(r(t)?i(o)[1]:i(o)[0]):a?s+i(o)[1]:s+(r(t)?i(o)[1]:i(o)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(t,e,n,r){return e?"kelios sekund\u0117s":r?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:o,m:n,mm:o,h:n,hh:o,d:n,dd:o,M:n,MM:o,y:n,yy:o},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(n("PJh5"))},"/bsm":function(t,e,n){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n("PJh5"))},"/iUD":function(t,e,n){"use strict";e.a=function(t){return"function"==typeof t}},"/mhn":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u093f"===e?t<4?t:t+12:"\u092c\u093f\u0939\u093e\u0928"===e?t:"\u0926\u093f\u0909\u0901\u0938\u094b"===e?t>=10?t:t+12:"\u0938\u093e\u0901\u091d"===e?t+12:void 0},meridiem:function(t,e,n){return t<3?"\u0930\u093e\u0924\u093f":t<12?"\u092c\u093f\u0939\u093e\u0928":t<16?"\u0926\u093f\u0909\u0901\u0938\u094b":t<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n("PJh5"))},"/nXB":function(t,e,n){"use strict";e.a=function(){for(var t=[],e=0;e1&&"number"==typeof t[t.length-1]&&(n=t.pop())):"number"==typeof l&&(n=t.pop()),null===s&&1===t.length&&t[0]instanceof r.a?t[0]:Object(a.a)(n)(new i.a(t,s))};var r=n("YaPU"),i=n("Veqx"),o=n("1Q68"),a=n("8D5t")},0:function(t,e,n){t.exports=n("x35b")},"0X8Q":function(t,e,n){!function(t){"use strict";t.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"1Bqh":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.subject=e,this.subscriber=n,this.closed=!1}return Object(r.b)(e,t),e.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var t=this.subject,e=t.observers;if(this.subject=null,e&&0!==e.length&&!t.isStopped&&!t.closed){var n=e.indexOf(this.subscriber);-1!==n&&e.splice(n,1)}}},e}(n("VwZZ").a)},"1Q68":function(t,e,n){"use strict";e.a=function(t){return t&&"function"==typeof t.schedule}},"2pmY":function(t,e,n){!function(t){"use strict";var e={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};t.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(t){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(t)},meridiem:function(t,e,n){return t<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/[\u06f0-\u06f9]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n("PJh5"))},"2s1U":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i=t+" ";switch(n){case"s":return e||r?"nekaj sekund":"nekaj sekundami";case"ss":return i+(1===t?e?"sekundo":"sekundi":2===t?e||r?"sekundi":"sekundah":t<5?e||r?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return i+(1===t?e?"minuta":"minuto":2===t?e||r?"minuti":"minutama":t<5?e||r?"minute":"minutami":e||r?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return i+(1===t?e?"ura":"uro":2===t?e||r?"uri":"urama":t<5?e||r?"ure":"urami":e||r?"ur":"urami");case"d":return e||r?"en dan":"enim dnem";case"dd":return i+(1===t?e||r?"dan":"dnem":2===t?e||r?"dni":"dnevoma":e||r?"dni":"dnevi");case"M":return e||r?"en mesec":"enim mesecem";case"MM":return i+(1===t?e||r?"mesec":"mesecem":2===t?e||r?"meseca":"mesecema":t<5?e||r?"mesece":"meseci":e||r?"mesecev":"meseci");case"y":return e||r?"eno leto":"enim letom";case"yy":return i+(1===t?e||r?"leto":"letom":2===t?e||r?"leti":"letoma":t<5?e||r?"leta":"leti":e||r?"let":"leti")}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},"3CJN":function(t,e,n){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3IRH":function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},"3K28":function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3LKG":function(t,e,n){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"3MVc":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},o=function(t){return function(e,n,o,a){var s=r(e),l=i[t][r(e)];return 2===s&&(l=l[n?0:1]),l.replace(/%d/i,e)}},a=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar",{months:a,monthsShort:a,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},"3a3m":function(t,e,n){"use strict";var r=n("TToO"),i=n("g5jc"),o=n("YaPU"),a=n("OVmG"),s=n("VwZZ");function l(){return function(t){return t.lift(new u(t))}}var u=function(){function t(t){this.connectable=t}return t.prototype.call=function(t,e){var n=this.connectable;n._refCount++;var r=new c(t,n),i=e.subscribe(r);return r.closed||(r.connection=n.connect()),i},t}(),c=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.b)(e,t),e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._refCount;if(e<=0)this.connection=null;else if(t._refCount=e-1,e>1)this.connection=null;else{var n=this.connection,r=t._connection;this.connection=null,!r||n&&r!==n||r.unsubscribe()}}else this.connection=null},e}(a.a),d=function(t){function e(e,n){t.call(this),this.source=e,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}return Object(r.b)(e,t),e.prototype._subscribe=function(t){return this.getSubject().subscribe(t)},e.prototype.getSubject=function(){var t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject},e.prototype.connect=function(){var t=this._connection;return t||(this._isComplete=!1,(t=this._connection=new s.a).add(this.source.subscribe(new p(this.getSubject(),this))),t.closed?(this._connection=null,t=s.a.EMPTY):this._connection=t),t},e.prototype.refCount=function(){return l()(this)},e}(o.a).prototype,h={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:d._subscribe},_isComplete:{value:d._isComplete,writable:!0},getSubject:{value:d.getSubject},connect:{value:d.connect},refCount:{value:d.refCount}},p=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.b)(e,t),e.prototype._error=function(e){this._unsubscribe(),t.prototype._error.call(this,e)},e.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}},e}(i.b);function f(){return new i.a}e.a=function(){return function(t){return l()((e=f,function(t){var n;n="function"==typeof e?e:function(){return e};var r=Object.create(t,h);return r.source=t,r.subjectFactory=n,r})(t));var e}}},"3hfc":function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}t.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:e,mm:e,h:e,hh:e,d:"\u0434\u0437\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u044b":t<12?"\u0440\u0430\u043d\u0456\u0446\u044b":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-\u044b":t+"-\u0456";case"D":return t+"-\u0433\u0430";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},"5Omq":function(t,e,n){!function(t){"use strict";t.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"5SNd":function(t,e,n){!function(t){"use strict";var e={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};t.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0448\u0430\u0431"===e?t<4?t:t+12:"\u0441\u0443\u0431\u04b3"===e?t:"\u0440\u04ef\u0437"===e?t>=11?t:t+12:"\u0431\u0435\u0433\u043e\u04b3"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0448\u0430\u0431":t<11?"\u0441\u0443\u0431\u04b3":t<16?"\u0440\u04ef\u0437":t<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"5j66":function(t,e,n){!function(t){"use strict";var e={1:"\u17e1",2:"\u17e2",3:"\u17e3",4:"\u17e4",5:"\u17e5",6:"\u17e6",7:"\u17e7",8:"\u17e8",9:"\u17e9",0:"\u17e0"},n={"\u17e1":"1","\u17e2":"2","\u17e3":"3","\u17e4":"4","\u17e5":"5","\u17e6":"6","\u17e7":"7","\u17e8":"8","\u17e9":"9","\u17e0":"0"};t.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysMin:"\u17a2\u17b6_\u1785_\u17a2_\u1796_\u1796\u17d2\u179a_\u179f\u17bb_\u179f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u1796\u17d2\u179a\u17b9\u1780|\u179b\u17d2\u1784\u17b6\u1785/,isPM:function(t){return"\u179b\u17d2\u1784\u17b6\u1785"===t},meridiem:function(t,e,n){return t<12?"\u1796\u17d2\u179a\u17b9\u1780":"\u179b\u17d2\u1784\u17b6\u1785"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},dayOfMonthOrdinalParse:/\u1791\u17b8\d{1,2}/,ordinal:"\u1791\u17b8%d",preparse:function(t){return t.replace(/[\u17e1\u17e2\u17e3\u17e4\u17e5\u17e6\u17e7\u17e8\u17e9\u17e0]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n("PJh5"))},"5vPg":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function r(t,e,n,r){var i="";if(e)switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":i="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":i="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":i="%d \u0924\u093e\u0938";break;case"d":i="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":i="%d \u0926\u093f\u0935\u0938";break;case"M":i="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":i="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":i="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":i="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":i="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":i="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":i="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":i="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":i="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return i.replace(/%d/i,t)}t.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===e?t<4?t:t+12:"\u0938\u0915\u093e\u0933\u0940"===e?t:"\u0926\u0941\u092a\u093e\u0930\u0940"===e?t>=10?t:t+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924\u094d\u0930\u0940":t<10?"\u0938\u0915\u093e\u0933\u0940":t<17?"\u0926\u0941\u092a\u093e\u0930\u0940":t<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n("PJh5"))},"6cf8":function(t,e,n){!function(t){"use strict";var e={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};t.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"7LV+":function(t,e,n){!function(t){"use strict";var e="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function r(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function i(t,e,n){var i=t+" ";switch(n){case"ss":return i+(r(t)?"sekundy":"sekund");case"m":return e?"minuta":"minut\u0119";case"mm":return i+(r(t)?"minuty":"minut");case"h":return e?"godzina":"godzin\u0119";case"hh":return i+(r(t)?"godziny":"godzin");case"MM":return i+(r(t)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return i+(r(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,r){return t?""===r?"("+n[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(r)?n[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:i,m:i,mm:i,h:i,hh:i,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:i,y:"rok",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"7MHZ":function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"7OnE":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};t.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n("PJh5"))},"7Q8x":function(t,e,n){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,n){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n("PJh5"))},"8D5t":function(t,e,n){"use strict";var r=n("Qnch");function i(t){return t}e.a=function(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(r.a)(i,null,t)}},"8v14":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},ALEw:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},AMGY:function(t,e,n){"use strict";(function(t){n.d(e,"a",function(){return o});var r="undefined"!=typeof window&&window,i="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,o=r||"undefined"!=typeof t&&t||i}).call(e,n("DuR2"))},Ab7C:function(t,e,n){!function(t){"use strict";t.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},AoDM:function(t,e,n){!function(t){"use strict";t.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(n("PJh5"))},BEem:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n("PJh5"))},BX3T:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=Array.isArray||function(t){return t&&"number"==typeof t.length}},BbgG:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929] LT",nextDay:"[\u660e\u5929] LT",nextWeek:"[\u4e0b]dddd LT",lastDay:"[\u6628\u5929] LT",lastWeek:"[\u4e0a]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},Bp2f:function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},C7av:function(t,e,n){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},CFqe:function(t,e,n){!function(t){"use strict";t.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(t,e,n){return t>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(t){return"\u03bc"===(t+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n,r=this._calendarEl[t],i=e&&e.hours();return((n=r)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(r=r.apply(e)),r.replace("{}",i%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n("PJh5"))},CqHt:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){switch(n){case"s":return e?"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434":"\u0445\u044d\u0434\u0445\u044d\u043d \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d";case"ss":return t+(e?" \u0441\u0435\u043a\u0443\u043d\u0434":" \u0441\u0435\u043a\u0443\u043d\u0434\u044b\u043d");case"m":case"mm":return t+(e?" \u043c\u0438\u043d\u0443\u0442":" \u043c\u0438\u043d\u0443\u0442\u044b\u043d");case"h":case"hh":return t+(e?" \u0446\u0430\u0433":" \u0446\u0430\u0433\u0438\u0439\u043d");case"d":case"dd":return t+(e?" \u04e9\u0434\u04e9\u0440":" \u04e9\u0434\u0440\u0438\u0439\u043d");case"M":case"MM":return t+(e?" \u0441\u0430\u0440":" \u0441\u0430\u0440\u044b\u043d");case"y":case"yy":return t+(e?" \u0436\u0438\u043b":" \u0436\u0438\u043b\u0438\u0439\u043d");default:return t}}t.defineLocale("mn",{months:"\u041d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0425\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0413\u0443\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u04e9\u0440\u04e9\u0432\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0422\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0417\u0443\u0440\u0433\u0430\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0414\u043e\u043b\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u041d\u0430\u0439\u043c\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0415\u0441\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0430\u0432\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u043d\u044d\u0433\u0434\u04af\u0433\u044d\u044d\u0440 \u0441\u0430\u0440_\u0410\u0440\u0432\u0430\u043d \u0445\u043e\u0451\u0440\u0434\u0443\u0433\u0430\u0430\u0440 \u0441\u0430\u0440".split("_"),monthsShort:"1 \u0441\u0430\u0440_2 \u0441\u0430\u0440_3 \u0441\u0430\u0440_4 \u0441\u0430\u0440_5 \u0441\u0430\u0440_6 \u0441\u0430\u0440_7 \u0441\u0430\u0440_8 \u0441\u0430\u0440_9 \u0441\u0430\u0440_10 \u0441\u0430\u0440_11 \u0441\u0430\u0440_12 \u0441\u0430\u0440".split("_"),monthsParseExact:!0,weekdays:"\u041d\u044f\u043c_\u0414\u0430\u0432\u0430\u0430_\u041c\u044f\u0433\u043c\u0430\u0440_\u041b\u0445\u0430\u0433\u0432\u0430_\u041f\u04af\u0440\u044d\u0432_\u0411\u0430\u0430\u0441\u0430\u043d_\u0411\u044f\u043c\u0431\u0430".split("_"),weekdaysShort:"\u041d\u044f\u043c_\u0414\u0430\u0432_\u041c\u044f\u0433_\u041b\u0445\u0430_\u041f\u04af\u0440_\u0411\u0430\u0430_\u0411\u044f\u043c".split("_"),weekdaysMin:"\u041d\u044f_\u0414\u0430_\u041c\u044f_\u041b\u0445_\u041f\u04af_\u0411\u0430_\u0411\u044f".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D",LLL:"YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm",LLLL:"dddd, YYYY \u043e\u043d\u044b MMMM\u044b\u043d D HH:mm"},meridiemParse:/\u04ae\u04e8|\u04ae\u0425/i,isPM:function(t){return"\u04ae\u0425"===t},meridiem:function(t,e,n){return t<12?"\u04ae\u04e8":"\u04ae\u0425"},calendar:{sameDay:"[\u04e8\u043d\u04e9\u04e9\u0434\u04e9\u0440] LT",nextDay:"[\u041c\u0430\u0440\u0433\u0430\u0430\u0448] LT",nextWeek:"[\u0418\u0440\u044d\u0445] dddd LT",lastDay:"[\u04e8\u0447\u0438\u0433\u0434\u04e9\u0440] LT",lastWeek:"[\u04e8\u043d\u0433\u04e9\u0440\u0441\u04e9\u043d] dddd LT",sameElse:"L"},relativeTime:{future:"%s \u0434\u0430\u0440\u0430\u0430",past:"%s \u04e9\u043c\u043d\u04e9",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2} \u04e9\u0434\u04e9\u0440/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+" \u04e9\u0434\u04e9\u0440";default:return t}}})}(n("PJh5"))},DOkx:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},DSXN:function(t,e,n){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n("PJh5"))},DuR2:function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},ETHv:function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924"===e?t<4?t:t+12:"\u0938\u0941\u092c\u0939"===e?t:"\u0926\u094b\u092a\u0939\u0930"===e?t>=10?t:t+12:"\u0936\u093e\u092e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924":t<10?"\u0938\u0941\u092c\u0939":t<17?"\u0926\u094b\u092a\u0939\u0930":t<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n("PJh5"))},"F+2e":function(t,e,n){!function(t){"use strict";var e={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};t.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(t){return t.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n("PJh5"))},FKXc:function(t,e,n){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},FRPF:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n("PJh5"))},FlzV:function(t,e,n){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},Fpqq:function(t,e,n){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"e":1===e?"a":2===e?"a":"e")},week:{dow:1,doy:4}})}(n("PJh5"))},Frex:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},FuaP:function(t,e,n){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"G++c":function(t,e,n){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},GK6M:function(t,e,n){"use strict";e.a=function(t){return r=t,o};var r,i=n("fKB6");function o(){try{return r.apply(this,arguments)}catch(t){return i.a.e=t,i.a}}},GrS7:function(t,e,n){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(t){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(t)},meridiem:function(t){return t<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":t<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":t<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-\u056b\u0576":t+"-\u0580\u0564";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},INcR:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n("PJh5"))},Jnfr:function(t,e){function n(t){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+t+"'.")})}n.keys=function(){return[]},n.resolve=n,t.exports=n,n.id="Jnfr"},JwiF:function(t,e,n){!function(t){"use strict";t.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(t,e){return 12===t&&(t=0),"enjing"===e?t:"siyang"===e?t>=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n("PJh5"))},LT9G:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},Lgqo:function(t,e,n){!function(t){"use strict";t.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(t){return t+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(t){return"\u0db4.\u0dc0."===t||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===t},meridiem:function(t,e,n){return t>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n("PJh5"))},N3vo:function(t,e,n){!function(t){"use strict";t.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(t){return t+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(t)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(t)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n("PJh5"))},N4j0:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){return t&&"number"==typeof t.length}},Nd3h:function(t,e,n){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n("PJh5"))},Nlnz:function(t,e,n){!function(t){"use strict";t.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===e?t<4?t:t+12:"\u0c09\u0c26\u0c2f\u0c02"===e?t:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===e?t>=10?t:t+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":t<10?"\u0c09\u0c26\u0c2f\u0c02":t<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":t<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n("PJh5"))},Nzt2:function(t,e,n){!function(t){"use strict";t.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(t){return 2===t?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":t+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(t){return 2===t?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":t+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(t){return 2===t?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":t+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(t){return 2===t?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":t%10==0&&10!==t?t+" \u05e9\u05e0\u05d4":t+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(t){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(t)},meridiem:function(t,e,n){return t<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":t<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":t<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":t<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n("PJh5"))},ORgI:function(t,e,n){!function(t){"use strict";t.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 dddd HH:mm",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5(ddd) HH:mm"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(t){return"\u5348\u5f8c"===t},meridiem:function(t,e,n){return t<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:function(t){return t.week()9?t(e%10):e}(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(t){return t+(1===t?"a\xf1":"vet")},week:{dow:1,doy:4}})}(n("PJh5"))},OUMt:function(t,e,n){!function(t){"use strict";var e="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function r(t){return t>1&&t<5}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sek\xfand"):o+"sekundami";case"m":return e?"min\xfata":i?"min\xfatu":"min\xfatou";case"mm":return e||i?o+(r(t)?"min\xfaty":"min\xfat"):o+"min\xfatami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hod\xedn"):o+"hodinami";case"d":return e||i?"de\u0148":"d\u0148om";case"dd":return e||i?o+(r(t)?"dni":"dn\xed"):o+"d\u0148ami";case"M":return e||i?"mesiac":"mesiacom";case"MM":return e||i?o+(r(t)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return e||i?"rok":"rokom";case"yy":return e||i?o+(r(t)?"roky":"rokov"):o+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVPi:function(t,e,n){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVmG:function(t,e,n){"use strict";n.d(e,"a",function(){return l});var r=n("TToO"),i=n("/iUD"),o=n("VwZZ"),a=n("t7NR"),s=n("tLDX"),l=function(t){function e(e,n,r){switch(t.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=a.a;break;case 1:if(!e){this.destination=a.a;break}if("object"==typeof e){if(c(e)){var i=e[s.a]();this.syncErrorThrowable=i.syncErrorThrowable,this.destination=i,i.add(this)}else this.syncErrorThrowable=!0,this.destination=new u(this,e);break}default:this.syncErrorThrowable=!0,this.destination=new u(this,e,n,r)}}return Object(r.b)(e,t),e.prototype[s.a]=function(){return this},e.create=function(t,n,r){var i=new e(t,n,r);return i.syncErrorThrowable=!1,i},e.prototype.next=function(t){this.isStopped||this._next(t)},e.prototype.error=function(t){this.isStopped||(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,t.prototype.unsubscribe.call(this))},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){this.destination.error(t),this.unsubscribe()},e.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},e.prototype._unsubscribeAndRecycle=function(){var t=this._parent,e=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=t,this._parents=e,this},e}(o.a),u=function(t){function e(e,n,r,o){var s;t.call(this),this._parentSubscriber=e;var l=this;Object(i.a)(n)?s=n:n&&(s=n.next,r=n.error,o=n.complete,n!==a.a&&(l=Object.create(n),Object(i.a)(l.unsubscribe)&&this.add(l.unsubscribe.bind(l)),l.unsubscribe=this.unsubscribe.bind(this))),this._context=l,this._next=s,this._error=r,this._complete=o}return Object(r.b)(e,t),e.prototype.next=function(t){if(!this.isStopped&&this._next){var e=this._parentSubscriber;e.syncErrorThrowable?this.__tryOrSetError(e,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}},e.prototype.error=function(t){if(!this.isStopped){var e=this._parentSubscriber;if(this._error)e.syncErrorThrowable?(this.__tryOrSetError(e,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else{if(!e.syncErrorThrowable)throw this.unsubscribe(),t;e.syncErrorValue=t,e.syncErrorThrown=!0,this.unsubscribe()}}},e.prototype.complete=function(){var t=this;if(!this.isStopped){var e=this._parentSubscriber;if(this._complete){var n=function(){return t._complete.call(t._context)};e.syncErrorThrowable?(this.__tryOrSetError(e,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}},e.prototype.__tryOrUnsub=function(t,e){try{t.call(this._context,e)}catch(t){throw this.unsubscribe(),t}},e.prototype.__tryOrSetError=function(t,e,n){try{e.call(this._context,n)}catch(e){return t.syncErrorValue=e,t.syncErrorThrown=!0,!0}return!1},e.prototype._unsubscribe=function(){var t=this._parentSubscriber;this._context=null,this._parentSubscriber=null,t.unsubscribe()},e}(l);function c(t){return t instanceof l||"syncErrorThrowable"in t&&t[s.a]}},PIsA:function(t,e,n){"use strict";var r=n("AMGY"),i=n("N4j0"),o=n("cQXm"),a=n("dgOU"),s=n("YaPU"),l=n("etqZ"),u=n("TToO"),c=function(t){function e(e,n,r){t.call(this),this.parent=e,this.outerValue=n,this.outerIndex=r,this.index=0}return Object(u.b)(e,t),e.prototype._next=function(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)},e.prototype._error=function(t){this.parent.notifyError(t,this),this.unsubscribe()},e.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},e}(n("OVmG").a),d=n("+CnV");e.a=function(t,e,n,u){var h=new c(t,n,u);if(h.closed)return null;if(e instanceof s.a)return e._isScalar?(h.next(e.value),h.complete(),null):(h.syncErrorThrowable=!0,e.subscribe(h));if(Object(i.a)(e)){for(var p=0,f=e.length;p>>0,r=0;r0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,e-r.length)).toString().substr(1)+r}var F=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,z={},W={};function B(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(W[t]=i),e&&(W[e[0]]=function(){return N(i.apply(this,arguments),e[1],e[2])}),n&&(W[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=q(e,t.localeData()),z[e]=z[e]||function(t){var e,n,r,i=t.match(F);for(e=0,n=i.length;e=0&&V.test(t);)t=t.replace(V,r),V.lastIndex=0,n-=1;return t}var J=/\d/,G=/\d\d/,K=/\d{3}/,X=/\d{4}/,Z=/[+-]?\d{6}/,Q=/\d\d?/,$=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,rt=/[+-]?\d{1,6}/,it=/\d+/,ot=/[+-]?\d+/,at=/Z|[+-]\d\d:?\d\d/gi,st=/Z|[+-]\d\d(?::?\d\d)?/gi,lt=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function ct(t,e,n){ut[t]=O(e)?e:function(t,r){return t&&n?n:e}}function dt(t,e){return d(ut,t)?ut[t](e._strict,e._locale):new RegExp(ht(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i})))}function ht(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var pt={};function ft(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),l(e)&&(r=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Tt,Dt=Ot("FullYear",!0);function Ot(t,e){return function(n){return null!=n?(Pt(this,t,n),i.updateOffset(this,e),this):Yt(this,t)}}function Yt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Pt(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&St(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Et(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function Et(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%12+12)%12;return t+=(e-n)/12,1===n?St(t)?29:28:31-n%7%2}Tt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function Wt(t,e,n){var r=7+e-n;return-(7+zt(t,0,r).getUTCDay()-e)%7+r-1}function Bt(t,e,n,r,i){var o,a,s=1+7*(e-1)+(7+n-r)%7+Wt(t,r,i);return s<=0?a=Ct(o=t-1)+s:s>Ct(t)?(o=t+1,a=s-Ct(t)):(o=t,a=s),{year:o,dayOfYear:a}}function Ut(t,e,n){var r,i,o=Wt(t.year(),e,n),a=Math.floor((t.dayOfYear()-o-1)/7)+1;return a<1?r=a+qt(i=t.year()-1,e,n):a>qt(t.year(),e,n)?(r=a-qt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=a),{week:r,year:i}}function qt(t,e,n){var r=Wt(t,e,n),i=Wt(t+1,e,n);return(Ct(t)-r+i)/7}B("w",["ww",2],"wo","week"),B("W",["WW",2],"Wo","isoWeek"),j("week","w"),j("isoWeek","W"),R("week",5),R("isoWeek",5),ct("w",Q),ct("ww",Q,G),ct("W",Q),ct("WW",Q,G),_t(["w","ww","W","WW"],function(t,e,n,r){e[r.substr(0,1)]=k(t)}),B("d",0,"do","day"),B("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),B("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),B("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),B("e",0,0,"weekday"),B("E",0,0,"isoWeekday"),j("day","d"),j("weekday","e"),j("isoWeekday","E"),R("day",11),R("weekday",11),R("isoWeekday",11),ct("d",Q),ct("e",Q),ct("E",Q),ct("dd",function(t,e){return e.weekdaysMinRegex(t)}),ct("ddd",function(t,e){return e.weekdaysShortRegex(t)}),ct("dddd",function(t,e){return e.weekdaysRegex(t)}),_t(["dd","ddd","dddd"],function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:f(n).invalidWeekday=t}),_t(["d","e","E"],function(t,e,n,r){e[r]=k(t)});var Jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Gt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Kt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Xt=lt,Zt=lt,Qt=lt;function $t(){function t(t,e){return e.length-t.length}var e,n,r,i,o,a=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=p([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),o=this.weekdays(n,""),a.push(r),s.push(i),l.push(o),u.push(r),u.push(i),u.push(o);for(a.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=ht(s[e]),l[e]=ht(l[e]),u[e]=ht(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function te(){return this.hours()%12||12}function ee(t,e){B(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ne(t,e){return e._meridiemParse}B("H",["HH",2],0,"hour"),B("h",["hh",2],0,te),B("k",["kk",2],0,function(){return this.hours()||24}),B("hmm",0,0,function(){return""+te.apply(this)+N(this.minutes(),2)}),B("hmmss",0,0,function(){return""+te.apply(this)+N(this.minutes(),2)+N(this.seconds(),2)}),B("Hmm",0,0,function(){return""+this.hours()+N(this.minutes(),2)}),B("Hmmss",0,0,function(){return""+this.hours()+N(this.minutes(),2)+N(this.seconds(),2)}),ee("a",!0),ee("A",!1),j("hour","h"),R("hour",13),ct("a",ne),ct("A",ne),ct("H",Q),ct("h",Q),ct("k",Q),ct("HH",Q,G),ct("hh",Q,G),ct("kk",Q,G),ct("hmm",$),ct("hmmss",tt),ct("Hmm",$),ct("Hmmss",tt),ft(["H","HH"],bt),ft(["k","kk"],function(t,e,n){var r=k(t);e[bt]=24===r?0:r}),ft(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),ft(["h","hh"],function(t,e,n){e[bt]=k(t),f(n).bigHour=!0}),ft("hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r)),f(n).bigHour=!0}),ft("hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i)),f(n).bigHour=!0}),ft("Hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r))}),ft("Hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i))});var re,ie=Ot("Hours",!0),oe={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:At,monthsShort:It,week:{dow:0,doy:6},weekdays:Jt,weekdaysMin:Kt,weekdaysShort:Gt,meridiemParse:/[ap]\.?m?\.?/i},ae={},se={};function le(t){return t?t.toLowerCase().replace("_","-"):t}function ue(e){var r=null;if(!ae[e]&&"undefined"!=typeof t&&t&&t.exports)try{r=re._abbr,n("uslO")("./"+e),ce(r)}catch(t){}return ae[e]}function ce(t,e){var n;return t&&((n=s(e)?he(t):de(t,e))?re=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function de(t,e){if(null!==e){var n,r=oe;if(e.abbr=t,null!=ae[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=ae[t]._config;else if(null!=e.parentLocale)if(null!=ae[e.parentLocale])r=ae[e.parentLocale]._config;else{if(null==(n=ue(e.parentLocale)))return se[e.parentLocale]||(se[e.parentLocale]=[]),se[e.parentLocale].push({name:t,config:e}),null;r=n._config}return ae[t]=new P(Y(r,e)),se[t]&&se[t].forEach(function(t){de(t.name,t.config)}),ce(t),ae[t]}return delete ae[t],null}function he(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return re;if(!o(t)){if(e=ue(t))return e;t=[t]}return function(t){for(var e,n,r,i,o=0;o0;){if(r=ue(i.slice(0,e).join("-")))return r;if(n&&n.length>=e&&x(i,n,!0)>=e-1)break;e--}o++}return re}(t)}function pe(t){var e,n=t._a;return n&&-2===f(t).overflow&&(e=n[yt]<0||n[yt]>11?yt:n[vt]<1||n[vt]>Et(n[gt],n[yt])?vt:n[bt]<0||n[bt]>24||24===n[bt]&&(0!==n[wt]||0!==n[Mt]||0!==n[kt])?bt:n[wt]<0||n[wt]>59?wt:n[Mt]<0||n[Mt]>59?Mt:n[kt]<0||n[kt]>999?kt:-1,f(t)._overflowDayOfYear&&(evt)&&(e=vt),f(t)._overflowWeeks&&-1===e&&(e=xt),f(t)._overflowWeekday&&-1===e&&(e=Lt),f(t).overflow=e),t}function fe(t,e,n){return null!=t?t:null!=e?e:n}function _e(t){var e,n,r,o,a,s=[];if(!t._d){for(r=function(t){var e=new Date(i.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[vt]&&null==t._a[yt]&&function(t){var e,n,r,i,o,a,s,l;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)o=1,a=4,n=fe(e.GG,t._a[gt],Ut(De(),1,4).year),r=fe(e.W,1),((i=fe(e.E,1))<1||i>7)&&(l=!0);else{o=t._locale._week.dow,a=t._locale._week.doy;var u=Ut(De(),o,a);n=fe(e.gg,t._a[gt],u.year),r=fe(e.w,u.week),null!=e.d?((i=e.d)<0||i>6)&&(l=!0):null!=e.e?(i=e.e+o,(e.e<0||e.e>6)&&(l=!0)):i=o}r<1||r>qt(n,o,a)?f(t)._overflowWeeks=!0:null!=l?f(t)._overflowWeekday=!0:(s=Bt(n,r,i,o,a),t._a[gt]=s.year,t._dayOfYear=s.dayOfYear)}(t),null!=t._dayOfYear&&(a=fe(t._a[gt],r[gt]),(t._dayOfYear>Ct(a)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),n=zt(a,0,t._dayOfYear),t._a[yt]=n.getUTCMonth(),t._a[vt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=r[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[wt]&&0===t._a[Mt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?zt:function(t,e,n,r,i,o,a){var s=new Date(t,e,n,r,i,o,a);return t<100&&t>=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}).apply(null,s),o=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==o&&(f(t).weekdayMismatch=!0)}}var me=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ge=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/Z|[+-]\d\d(?::?\d\d)?/,ve=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],we=/^\/?Date\((\-?\d+)/i;function Me(t){var e,n,r,i,o,a,s=t._i,l=me.exec(s)||ge.exec(s);if(l){for(f(t).iso=!0,e=0,n=ve.length;e0&&f(t).unusedInput.push(a),s=s.slice(s.indexOf(n)+n.length),u+=n.length),W[o]?(n?f(t).empty=!1:f(t).unusedTokens.push(o),mt(o,n,t)):t._strict&&!n&&f(t).unusedTokens.push(o);f(t).charsLeftOver=l-u,s.length>0&&f(t).unusedInput.push(s),t._a[bt]<=12&&!0===f(t).bigHour&&t._a[bt]>0&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[bt]=(c=t._locale,d=t._a[bt],null==(h=t._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),_e(t),pe(t)}else Le(t);else Me(t);var c,d,h,p}function Se(t){var e=t._i,n=t._f;return t._locale=t._locale||he(t._l),null===e||void 0===n&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),w(e)?new b(pe(e)):(u(e)?t._d=e:o(n)?function(t){var e,n,r,i,o;if(0===t._f.length)return f(t).invalidFormat=!0,void(t._d=new Date(NaN));for(i=0;ithis?this:t:m()});function Pe(t,e){var n,r;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return De();for(n=e[0],r=1;r(o=qt(t,r,i))&&(e=o),(function(t,e,n,r,i){var o=Bt(t,e,n,r,i),a=zt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}).call(this,t,e,n,r,i))}B(0,["gg",2],0,function(){return this.weekYear()%100}),B(0,["GG",2],0,function(){return this.isoWeekYear()%100}),nn("gggg","weekYear"),nn("ggggg","weekYear"),nn("GGGG","isoWeekYear"),nn("GGGGG","isoWeekYear"),j("weekYear","gg"),j("isoWeekYear","GG"),R("weekYear",1),R("isoWeekYear",1),ct("G",ot),ct("g",ot),ct("GG",Q,G),ct("gg",Q,G),ct("GGGG",nt,X),ct("gggg",nt,X),ct("GGGGG",rt,Z),ct("ggggg",rt,Z),_t(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,r){e[r.substr(0,2)]=k(t)}),_t(["gg","GG"],function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)}),B("Q",0,"Qo","quarter"),j("quarter","Q"),R("quarter",7),ct("Q",J),ft("Q",function(t,e){e[yt]=3*(k(t)-1)}),B("D",["DD",2],"Do","date"),j("date","D"),R("date",9),ct("D",Q),ct("DD",Q,G),ct("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),ft(["D","DD"],vt),ft("Do",function(t,e){e[vt]=k(t.match(Q)[0])});var on=Ot("Date",!0);B("DDD",["DDDD",3],"DDDo","dayOfYear"),j("dayOfYear","DDD"),R("dayOfYear",4),ct("DDD",et),ct("DDDD",K),ft(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),B("m",["mm",2],0,"minute"),j("minute","m"),R("minute",14),ct("m",Q),ct("mm",Q,G),ft(["m","mm"],wt);var an=Ot("Minutes",!1);B("s",["ss",2],0,"second"),j("second","s"),R("second",15),ct("s",Q),ct("ss",Q,G),ft(["s","ss"],Mt);var sn,ln=Ot("Seconds",!1);for(B("S",0,0,function(){return~~(this.millisecond()/100)}),B(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),B(0,["SSS",3],0,"millisecond"),B(0,["SSSS",4],0,function(){return 10*this.millisecond()}),B(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),B(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),B(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),B(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),B(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),j("millisecond","ms"),R("millisecond",16),ct("S",et,J),ct("SS",et,G),ct("SSS",et,K),sn="SSSS";sn.length<=9;sn+="S")ct(sn,it);function un(t,e){e[kt]=k(1e3*("0."+t))}for(sn="S";sn.length<=9;sn+="S")ft(sn,un);var cn=Ot("Milliseconds",!1);B("z",0,0,"zoneAbbr"),B("zz",0,0,"zoneName");var dn=b.prototype;function hn(t){return t}dn.add=Xe,dn.calendar=function(t,e){var n=t||De(),r=Fe(n,this).startOf("day"),o=i.calendarFormat(this,r)||"sameElse",a=e&&(O(e[o])?e[o].call(this,n):e[o]);return this.format(a||this.localeData().calendar(o,this,De(n)))},dn.clone=function(){return new b(this)},dn.diff=function(t,e,n){var r,i,o;if(!this.isValid())return NaN;if(!(r=Fe(t,this)).isValid())return NaN;switch(i=6e4*(r.utcOffset()-this.utcOffset()),e=A(e)){case"year":o=Qe(this,r)/12;break;case"month":o=Qe(this,r);break;case"quarter":o=Qe(this,r)/3;break;case"second":o=(this-r)/1e3;break;case"minute":o=(this-r)/6e4;break;case"hour":o=(this-r)/36e5;break;case"day":o=(this-r-i)/864e5;break;case"week":o=(this-r-i)/6048e5;break;default:o=this-r}return n?o:M(o)},dn.endOf=function(t){return void 0===(t=A(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},dn.format=function(t){t||(t=this.isUtc()?i.defaultFormatUtc:i.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},dn.from=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||De(t).isValid())?Ue({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.fromNow=function(t){return this.from(De(),t)},dn.to=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||De(t).isValid())?Ue({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.toNow=function(t){return this.to(De(),t)},dn.get=function(t){return O(this[t=A(t)])?this[t]():this},dn.invalidAt=function(){return f(this).overflow},dn.isAfter=function(t,e){var n=w(t)?t:De(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=A(s(e)?"millisecond":e))?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):O(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},dn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(n+r+"-MM-DD[T]HH:mm:ss.SSS"+e+'[")]')},dn.toJSON=function(){return this.isValid()?this.toISOString():null},dn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},dn.unix=function(){return Math.floor(this.valueOf()/1e3)},dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},dn.year=Dt,dn.isLeapYear=function(){return St(this.year())},dn.weekYear=function(t){return rn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},dn.isoWeekYear=function(t){return rn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},dn.quarter=dn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},dn.month=Rt,dn.daysInMonth=function(){return Et(this.year(),this.month())},dn.week=dn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},dn.isoWeek=dn.isoWeeks=function(t){var e=Ut(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},dn.weeksInYear=function(){var t=this.localeData()._week;return qt(this.year(),t.dow,t.doy)},dn.isoWeeksInYear=function(){return qt(this.year(),1,4)},dn.date=on,dn.day=dn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},dn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},dn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},dn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},dn.hour=dn.hours=ie,dn.minute=dn.minutes=an,dn.second=dn.seconds=ln,dn.millisecond=dn.milliseconds=cn,dn.utcOffset=function(t,e,n){var r,o=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Ne(st,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=Ve(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),o!==t&&(!e||this._changeInProgress?Ke(this,Ue(t-o,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?o:Ve(this)},dn.utc=function(t){return this.utcOffset(0,t)},dn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ve(this),"m")),this},dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Ne(at,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},dn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?De(t).utcOffset():0,(this.utcOffset()-t)%60==0)},dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},dn.isUtc=ze,dn.isUTC=ze,dn.zoneAbbr=function(){return this._isUTC?"UTC":""},dn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},dn.dates=C("dates accessor is deprecated. Use date instead.",on),dn.months=C("months accessor is deprecated. Use month instead",Rt),dn.years=C("years accessor is deprecated. Use year instead",Dt),dn.zone=C("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),dn.isDSTShifted=C("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(y(t,this),(t=Se(t))._a){var e=t._isUTC?p(t._a):De(t._a);this._isDSTShifted=this.isValid()&&x(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pn=P.prototype;function fn(t,e,n,r){var i=he(),o=p().set(r,e);return i[n](o,t)}function _n(t,e,n){if(l(t)&&(e=t,t=void 0),t=t||"",null!=e)return fn(t,e,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=fn(t,r,n,"month");return i}function mn(t,e,n,r){"boolean"==typeof t?(l(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,l(e)&&(n=e,e=void 0),e=e||"");var i,o=he(),a=t?o._week.dow:0;if(null!=n)return fn(e,(n+a)%7,r,"day");var s=[];for(i=0;i<7;i++)s[i]=fn(e,(i+a)%7,r,"day");return s}pn.calendar=function(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return O(r)?r.call(e,n):r},pn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},pn.invalidDate=function(){return this._invalidDate},pn.ordinal=function(t){return this._ordinal.replace("%d",t)},pn.preparse=hn,pn.postformat=hn,pn.relativeTime=function(t,e,n,r){var i=this._relativeTime[n];return O(i)?i(t,e,n,r):i.replace(/%d/i,t)},pn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return O(n)?n(e):n.replace(/%s/i,e)},pn.set=function(t){var e,n;for(n in t)O(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pn.months=function(t,e){return t?o(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||jt).test(e)?"format":"standalone"][t.month()]:o(this._months)?this._months:this._months.standalone},pn.monthsShort=function(t,e){return t?o(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[jt.test(e)?"format":"standalone"][t.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pn.monthsParse=function(t,e,n){var r,i,o;if(this._monthsParseExact)return(function(t,e,n){var r,i,o,a=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)o=p([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(o,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(o,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,a))?i:null:-1!==(i=Tt.call(this._longMonthsParse,a))?i:null:"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,a))?i:-1!==(i=Tt.call(this._longMonthsParse,a))?i:null:-1!==(i=Tt.call(this._longMonthsParse,a))?i:-1!==(i=Tt.call(this._shortMonthsParse,a))?i:null}).call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=p([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(o="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(o.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}},pn.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Ft),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},pn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Nt),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},pn.week=function(t){return Ut(t,this._week.dow,this._week.doy).week},pn.firstDayOfYear=function(){return this._week.doy},pn.firstDayOfWeek=function(){return this._week.dow},pn.weekdays=function(t,e){return t?o(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},pn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},pn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},pn.weekdaysParse=function(t,e,n){var r,i,o;if(this._weekdaysParseExact)return(function(t,e,n){var r,i,o,a=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)o=p([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,a))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,a))?i:null:"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,a))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,a))?i:-1!==(i=Tt.call(this._minWeekdaysParse,a))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,a))?i:-1!==(i=Tt.call(this._weekdaysParse,a))?i:-1!==(i=Tt.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,a))?i:-1!==(i=Tt.call(this._weekdaysParse,a))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,a))?i:null}).call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=p([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[r]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[r].test(t))return r;if(n&&"ddd"===e&&this._shortWeekdaysParse[r].test(t))return r;if(n&&"dd"===e&&this._minWeekdaysParse[r].test(t))return r;if(!n&&this._weekdaysParse[r].test(t))return r}},pn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Xt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},pn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Zt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Qt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},pn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ce("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),i.lang=C("moment.lang is deprecated. Use moment.locale instead.",ce),i.langData=C("moment.langData is deprecated. Use moment.localeData instead.",he);var gn=Math.abs;function yn(t,e,n,r){var i=Ue(e,n);return t._milliseconds+=r*i._milliseconds,t._days+=r*i._days,t._months+=r*i._months,t._bubble()}function vn(t){return t<0?Math.floor(t):Math.ceil(t)}function bn(t){return 4800*t/146097}function wn(t){return 146097*t/4800}function Mn(t){return function(){return this.as(t)}}var kn=Mn("ms"),xn=Mn("s"),Ln=Mn("m"),Cn=Mn("h"),Sn=Mn("d"),Tn=Mn("w"),Dn=Mn("M"),On=Mn("y");function Yn(t){return function(){return this.isValid()?this._data[t]:NaN}}var Pn=Yn("milliseconds"),En=Yn("seconds"),jn=Yn("minutes"),An=Yn("hours"),In=Yn("days"),Hn=Yn("months"),Rn=Yn("years"),Nn=Math.round,Fn={ss:44,s:45,m:45,h:22,d:26,M:11},Vn=Math.abs;function zn(t){return(t>0)-(t<0)||+t}function Wn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=Vn(this._milliseconds)/1e3,r=Vn(this._days),i=Vn(this._months);e=M((t=M(n/60))/60),n%=60,t%=60;var o=M(i/12),a=i%=12,s=r,l=e,u=t,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=zn(this._months)!==zn(d)?"-":"",f=zn(this._days)!==zn(d)?"-":"",_=zn(this._milliseconds)!==zn(d)?"-":"";return h+"P"+(o?p+o+"Y":"")+(a?p+a+"M":"")+(s?f+s+"D":"")+(l||u||c?"T":"")+(l?_+l+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var Bn=je.prototype;return Bn.isValid=function(){return this._isValid},Bn.abs=function(){var t=this._data;return this._milliseconds=gn(this._milliseconds),this._days=gn(this._days),this._months=gn(this._months),t.milliseconds=gn(t.milliseconds),t.seconds=gn(t.seconds),t.minutes=gn(t.minutes),t.hours=gn(t.hours),t.months=gn(t.months),t.years=gn(t.years),this},Bn.add=function(t,e){return yn(this,t,e,1)},Bn.subtract=function(t,e){return yn(this,t,e,-1)},Bn.as=function(t){if(!this.isValid())return NaN;var e,n,r=this._milliseconds;if("month"===(t=A(t))||"year"===t)return n=this._months+bn(e=this._days+r/864e5),"month"===t?n:n/12;switch(e=this._days+Math.round(wn(this._months)),t){case"week":return e/7+r/6048e5;case"day":return e+r/864e5;case"hour":return 24*e+r/36e5;case"minute":return 1440*e+r/6e4;case"second":return 86400*e+r/1e3;case"millisecond":return Math.floor(864e5*e)+r;default:throw new Error("Unknown unit "+t)}},Bn.asMilliseconds=kn,Bn.asSeconds=xn,Bn.asMinutes=Ln,Bn.asHours=Cn,Bn.asDays=Sn,Bn.asWeeks=Tn,Bn.asMonths=Dn,Bn.asYears=On,Bn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},Bn._bubble=function(){var t,e,n,r,i,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*vn(wn(s)+a),a=0,s=0),l.milliseconds=o%1e3,t=M(o/1e3),l.seconds=t%60,e=M(t/60),l.minutes=e%60,n=M(e/60),l.hours=n%24,s+=i=M(bn(a+=M(n/24))),a-=vn(wn(i)),r=M(s/12),s%=12,l.days=a,l.months=s,l.years=r,this},Bn.clone=function(){return Ue(this)},Bn.get=function(t){return t=A(t),this.isValid()?this[t+"s"]():NaN},Bn.milliseconds=Pn,Bn.seconds=En,Bn.minutes=jn,Bn.hours=An,Bn.days=In,Bn.weeks=function(){return M(this.days()/7)},Bn.months=Hn,Bn.years=Rn,Bn.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var r=Ue(t).abs(),i=Nn(r.as("s")),o=Nn(r.as("m")),a=Nn(r.as("h")),s=Nn(r.as("d")),l=Nn(r.as("M")),u=Nn(r.as("y")),c=i<=Fn.ss&&["s",i]||i0,c[4]=n,(function(t,e,n,r,i){return i.relativeTime(e||1,!!n,t,r)}).apply(null,c)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},Bn.toISOString=Wn,Bn.toString=Wn,Bn.toJSON=Wn,Bn.locale=$e,Bn.localeData=en,Bn.toIsoString=C("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Wn),Bn.lang=tn,B("X",0,0,"unix"),B("x",0,0,"valueOf"),ct("x",ot),ct("X",/[+-]?\d+(\.\d{1,3})?/),ft("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),ft("x",function(t,e,n){n._d=new Date(k(t))}),i.version="2.22.1",e=De,i.fn=dn,i.min=function(){return Pe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Pe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=p,i.unix=function(t){return De(1e3*t)},i.months=function(t,e){return _n(t,e,"months")},i.isDate=u,i.locale=ce,i.invalid=m,i.duration=Ue,i.isMoment=w,i.weekdays=function(t,e,n){return mn(t,e,n,"weekdays")},i.parseZone=function(){return De.apply(null,arguments).parseZone()},i.localeData=he,i.isDuration=Ae,i.monthsShort=function(t,e){return _n(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return mn(t,e,n,"weekdaysMin")},i.defineLocale=de,i.updateLocale=function(t,e){if(null!=e){var n,r,i=oe;null!=(r=ue(t))&&(i=r._config),(n=new P(e=Y(i,e))).parentLocale=ae[t],ae[t]=n,ce(t)}else null!=ae[t]&&(null!=ae[t].parentLocale?ae[t]=ae[t].parentLocale:null!=ae[t]&&delete ae[t]);return ae[t]},i.locales=function(){return S(ae)},i.weekdaysShort=function(t,e,n){return mn(t,e,n,"weekdaysShort")},i.normalizeUnits=A,i.relativeTimeRounding=function(t){return void 0===t?Nn:"function"==typeof t&&(Nn=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Fn[t]&&(void 0===e?Fn[t]:(Fn[t]=e,"s"===t&&(Fn.ss=e-1),!0))},i.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},i.prototype=dn,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},i}()}).call(e,n("3IRH")(t))},QZk1:function(t,e,n){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},Qnch:function(t,e,n){"use strict";e.a=function(t,e,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof e&&(n=e,e=null),r.lift(new a(t,e,n))}};var r=n("TToO"),i=n("PIsA"),o=n("tZ2B"),a=function(){function t(t,e,n){void 0===n&&(n=Number.POSITIVE_INFINITY),this.project=t,this.resultSelector=e,this.concurrent=n}return t.prototype.call=function(t,e){return e.subscribe(new s(t,this.project,this.resultSelector,this.concurrent))},t}(),s=function(t){function e(e,n,r,i){void 0===i&&(i=Number.POSITIVE_INFINITY),t.call(this,e),this.project=n,this.resultSelector=r,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(r.b)(e,t),e.prototype._next=function(t){this.active0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(o.a)},Rf9G:function(t,e,n){"use strict";e.a=function(){return Object(r.a)()(this)};var r=n("3a3m")},RnJI:function(t,e,n){!function(t){"use strict";t.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(t)?t.replace(/\u10d8$/,"\u10e8\u10d8"):t+"\u10e8\u10d8"},past:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(t)?t.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10ec\u10d8\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(t)?t.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10ec\u10d8\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(t){return 0===t?t:1===t?t+"-\u10da\u10d8":t<20||t<=100&&t%20==0||t%100==0?"\u10db\u10d4-"+t:t+"-\u10d4"},week:{dow:1,doy:7}})}(n("PJh5"))},Sjoy:function(t,e,n){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},TILf:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.value=e,this.scheduler=n,this._isScalar=!0,n&&(this._isScalar=!1)}return Object(r.b)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){var e=t.value,n=t.subscriber;t.done?n.complete():(n.next(e),n.closed||(t.done=!0,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.value,r=this.scheduler;if(r)return r.schedule(e.dispatch,0,{done:!1,value:n,subscriber:t});t.next(n),t.closed||t.complete()},e}(n("YaPU").a)},TToO:function(t,e,n){"use strict";e.b=function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},n.d(e,"a",function(){return i});var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":r<900?"\u0633\u06d5\u06be\u06d5\u0631":r<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":r<1230?"\u0686\u06c8\u0634":r<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return t+"-\u06be\u06d5\u067e\u062a\u06d5";default:return t}},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n("PJh5"))},Tqun:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},V0td:function(t,e,n){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,n){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},V4qH:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},VK9h:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},Veqx:function(t,e,n){"use strict";n.d(e,"a",function(){return l});var r=n("TToO"),i=n("YaPU"),o=n("TILf"),a=n("+3/4"),s=n("1Q68"),l=function(t){function e(e,n){t.call(this),this.array=e,this.scheduler=n,n||1!==e.length||(this._isScalar=!0,this.value=e[0])}return Object(r.b)(e,t),e.create=function(t,n){return new e(t,n)},e.of=function(){for(var t=[],n=0;n1?new e(t,r):1===i?new o.a(t[0],r):new a.a(r)},e.dispatch=function(t){var e=t.array,n=t.index,r=t.subscriber;n>=t.count?r.complete():(r.next(e[n]),r.closed||(t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(e.dispatch,0,{array:n,index:0,count:r,subscriber:t});for(var o=0;o=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u5468";default:return t}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n("PJh5"))},WT6e:function(t,e,n){"use strict";(function(t){n.d(e,"g",function(){return $t}),n.d(e,"R",function(){return qt}),n.d(e,"U",function(){return Jt}),n.d(e,"Q",function(){return Kt}),n.d(e,"x",function(){return Gt}),n.d(e,"c",function(){return ot}),n.d(e,"B",function(){return lt}),n.d(e,"A",function(){return ut}),n.d(e,"b",function(){return ct}),n.d(e,"d",function(){return rt}),n.d(e,"e",function(){return it}),n.d(e,"T",function(){return be}),n.d(e,"L",function(){return Rt}),n.d(e,"W",function(){return Ft}),n.d(e,"t",function(){return We}),n.d(e,"f",function(){return Je}),n.d(e,"n",function(){return Ot}),n.d(e,"m",function(){return tt}),n.d(e,"F",function(){return Ke}),n.d(e,"G",function(){return Ge}),n.d(e,"a",function(){return h}),n.d(e,"O",function(){return p}),n.d(e,"M",function(){return f}),n.d(e,"S",function(){return D}),n.d(e,"q",function(){return j}),n.d(e,"p",function(){return u}),n.d(e,"o",function(){return m}),n.d(e,"z",function(){return g}),n.d(e,"H",function(){return v}),n.d(e,"y",function(){return Yt}),n.d(e,"C",function(){return re}),n.d(e,"D",function(){return ee}),n.d(e,"E",function(){return ne}),n.d(e,"i",function(){return pt}),n.d(e,"j",function(){return wt}),n.d(e,"k",function(){return ie}),n.d(e,"u",function(){return Lt}),n.d(e,"w",function(){return xt}),n.d(e,"v",function(){return oe}),n.d(e,"I",function(){return ue}),n.d(e,"J",function(){return se}),n.d(e,"K",function(){return de}),n.d(e,"N",function(){return he}),n.d(e,"l",function(){return fe}),n.d(e,"h",function(){return pe}),n.d(e,"r",function(){return He}),n.d(e,"s",function(){return Re}),n.d(e,"P",function(){return ke}),n.d(e,"V",function(){return ze}),n.d(e,"_9",function(){return Le}),n.d(e,"Y",function(){return dt}),n.d(e,"X",function(){return Mt}),n.d(e,"_6",function(){return M}),n.d(e,"_12",function(){return S}),n.d(e,"_26",function(){return T}),n.d(e,"_10",function(){return nt}),n.d(e,"_11",function(){return et}),n.d(e,"Z",function(){return Wn}),n.d(e,"_0",function(){return Bn}),n.d(e,"_1",function(){return ur}),n.d(e,"_2",function(){return mo}),n.d(e,"_3",function(){return fn}),n.d(e,"_4",function(){return Pr}),n.d(e,"_5",function(){return Un}),n.d(e,"_8",function(){return Vn}),n.d(e,"_13",function(){return tr}),n.d(e,"_14",function(){return $n}),n.d(e,"_16",function(){return ti}),n.d(e,"_17",function(){return br}),n.d(e,"_20",function(){return Er}),n.d(e,"_23",function(){return jr}),n.d(e,"_19",function(){return ri}),n.d(e,"_21",function(){return ii}),n.d(e,"_22",function(){return ni}),n.d(e,"_25",function(){return Kr}),n.d(e,"_27",function(){return ai}),n.d(e,"_28",function(){return dn}),n.d(e,"_29",function(){return ui}),n.d(e,"_15",function(){return Be}),n.d(e,"_18",function(){return Ue}),n.d(e,"_24",function(){return qe}),n.d(e,"_7",function(){return at});var r=n("TToO"),i=n("YaPU"),o=n("/nXB"),a=n("Rf9G"),s=n("g5jc"),l=n("VwZZ"),u=function(){function t(t){this._desc=t,this.ngMetadataName="InjectionToken"}return t.prototype.toString=function(){return"InjectionToken "+this._desc},t}(),c="__paramaters__";function d(t,e,n){var r=function(t){return function(){for(var e=[],n=0;n ");else if("object"==typeof e){var i=[];for(var o in e)if(e.hasOwnProperty(o)){var a=e[o];i.push(o+":"+("string"==typeof a?JSON.stringify(a):T(a)))}r="{"+i.join(", ")+"}"}return"StaticInjectorError"+(n?"("+n+")":"")+"["+r+"]: "+t.replace(z,"\n ")}function J(t,e){return new Error(q(t,e))}var G="ngDebugContext",K="ngOriginalError",X="ngErrorLogger";function Z(t){return t[G]}function Q(t){return t[K]}function $(t){for(var e=[],n=1;n0)t._bootstrapComponents.forEach(function(t){return e.bootstrap(t)});else{if(!t.instance.ngDoBootstrap)throw new Error("The module "+T(t.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');t.instance.ngDoBootstrap(e)}this._modules.push(t)},t.prototype.onDestroy=function(t){this._destroyListeners.push(t)},Object.defineProperty(t.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(t){return t.destroy()}),this._destroyListeners.forEach(function(t){return t()}),this._destroyed=!0},Object.defineProperty(t.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),t}();function Qt(t,e){return Array.isArray(e)?e.reduce(Qt,t):Object(r.a)({},t,e)}var $t=function(){function t(t,e,n,r,s,l){var u=this;this._zone=t,this._console=e,this._injector=n,this._exceptionHandler=r,this._componentFactoryResolver=s,this._initStatus=l,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=Jt(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new i.a(function(t){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){t.next(u._stable),t.complete()})}),d=new i.a(function(t){var e;u._zone.runOutsideAngular(function(){e=u._zone.onStable.subscribe(function(){Yt.assertNotInAngularZone(),C(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,t.next(!0))})})});var n=u._zone.onUnstable.subscribe(function(){Yt.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){t.next(!1)}))});return function(){e.unsubscribe(),n.unsubscribe()}});this.isStable=Object(o.a)(c,a.a.call(d))}return t.prototype.bootstrap=function(t,e){var n,r=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=t instanceof _t?t:this._componentFactoryResolver.resolveComponentFactory(t),this.componentTypes.push(n.componentType);var i=n instanceof kt?null:this._injector.get(xt),o=n.create(j.NULL,[],e||n.selector,i);o.onDestroy(function(){r._unloadComponent(o)});var a=o.injector.get(Rt,null);return a&&o.injector.get(Nt).registerApplication(o.location.nativeElement,a),this._loadComponent(o),Jt()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),o},t.prototype.tick=function(){var e=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var n=t._tickScope();try{this._runningTick=!0,this._views.forEach(function(t){return t.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(t){return t.checkNoChanges()})}catch(t){this._zone.runOutsideAngular(function(){return e._exceptionHandler.handleError(t)})}finally{this._runningTick=!1,Dt(n)}},t.prototype.attachView=function(t){var e=t;this._views.push(e),e.attachToAppRef(this)},t.prototype.detachView=function(t){var e=t;te(this._views,e),e.detachFromAppRef()},t.prototype._loadComponent=function(t){this.attachView(t.hostView),this.tick(),this.components.push(t),this._injector.get(ct,[]).concat(this._bootstrapListeners).forEach(function(e){return e(t)})},t.prototype._unloadComponent=function(t){this.detachView(t.hostView),te(this.components,t)},t.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(t){return t.destroy()})},Object.defineProperty(t.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),t._tickScope=Tt("ApplicationRef#tick()"),t}();function te(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var ee=function(){},ne=function(){var t={Important:1,DashCase:2};return t[t.Important]="Important",t[t.DashCase]="DashCase",t}(),re=function(){},ie=function(t){this.nativeElement=t},oe=function(){},ae=function(){function t(){this.dirty=!0,this._results=[],this.changes=new Ot,this.length=0}return t.prototype.map=function(t){return this._results.map(t)},t.prototype.filter=function(t){return this._results.filter(t)},t.prototype.find=function(t){return this._results.find(t)},t.prototype.reduce=function(t,e){return this._results.reduce(t,e)},t.prototype.forEach=function(t){this._results.forEach(t)},t.prototype.some=function(t){return this._results.some(t)},t.prototype.toArray=function(){return this._results.slice()},t.prototype[L()]=function(){return this._results[L()]()},t.prototype.toString=function(){return this._results.toString()},t.prototype.reset=function(t){this._results=function t(e){return e.reduce(function(e,n){var r=Array.isArray(n)?t(n):n;return e.concat(r)},[])}(t),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},t.prototype.notifyOnChanges=function(){this.changes.emit(this)},t.prototype.setDirty=function(){this.dirty=!0},t.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},t}(),se=function(){},le={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},ue=function(){function t(t,e){this._compiler=t,this._config=e||le}return t.prototype.load=function(t){return this._compiler instanceof pt?this.loadFactory(t):this.loadAndCompile(t)},t.prototype.loadAndCompile=function(t){var e=this,r=t.split("#"),i=r[0],o=r[1];return void 0===o&&(o="default"),n("Jnfr")(i).then(function(t){return t[o]}).then(function(t){return ce(t,i,o)}).then(function(t){return e._compiler.compileModuleAsync(t)})},t.prototype.loadFactory=function(t){var e=t.split("#"),r=e[0],i=e[1],o="NgFactory";return void 0===i&&(i="default",o=""),n("Jnfr")(this._config.factoryPathPrefix+r+this._config.factoryPathSuffix).then(function(t){return t[i+o]}).then(function(t){return ce(t,r,i)})},t}();function ce(t,e,n){if(!t)throw new Error("Cannot find '"+n+"' in '"+e+"'");return t}var de=function(){},he=function(){},pe=function(){},fe=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.b)(e,t),e}(function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.b)(e,t),e}(pe)),_e=function(){function t(t,e,n){this._debugContext=n,this.nativeNode=t,e&&e instanceof me?e.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(t.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),t}(),me=function(t){function e(e,n,r){var i=t.call(this,e,n,r)||this;return i.properties={},i.attributes={},i.classes={},i.styles={},i.childNodes=[],i.nativeElement=e,i}return Object(r.b)(e,t),e.prototype.addChild=function(t){t&&(this.childNodes.push(t),t.parent=this)},e.prototype.removeChild=function(t){var e=this.childNodes.indexOf(t);-1!==e&&(t.parent=null,this.childNodes.splice(e,1))},e.prototype.insertChildrenAfter=function(t,e){var n,r=this,i=this.childNodes.indexOf(t);-1!==i&&((n=this.childNodes).splice.apply(n,[i+1,0].concat(e)),e.forEach(function(t){t.parent&&t.parent.removeChild(t),t.parent=r}))},e.prototype.insertBefore=function(t,e){var n=this.childNodes.indexOf(t);-1===n?this.addChild(e):(e.parent&&e.parent.removeChild(e),e.parent=this,this.childNodes.splice(n,0,e))},e.prototype.query=function(t){return this.queryAll(t)[0]||null},e.prototype.queryAll=function(t){var e=[];return ge(this,t,e),e},e.prototype.queryAllNodes=function(t){var e=[];return ye(this,t,e),e},Object.defineProperty(e.prototype,"children",{get:function(){return this.childNodes.filter(function(t){return t instanceof e})},enumerable:!0,configurable:!0}),e.prototype.triggerEventHandler=function(t,e){this.listeners.forEach(function(n){n.name==t&&n.callback(e)})},e}(_e);function ge(t,e,n){t.childNodes.forEach(function(t){t instanceof me&&(e(t)&&n.push(t),ge(t,e,n))})}function ye(t,e,n){t instanceof me&&t.childNodes.forEach(function(t){e(t)&&n.push(t),t instanceof me&&ye(t,e,n)})}var ve=new Map;function be(t){return ve.get(t)||null}function we(t){ve.set(t.nativeNode,t)}function Me(t,e){var n=Le(t),r=Le(e);return n&&r?function(t,e,n){for(var r=t[L()](),i=e[L()]();;){var o=r.next(),a=i.next();if(o.done&&a.done)return!0;if(o.done||a.done)return!1;if(!n(o.value,a.value))return!1}}(t,e,Me):!(n||!t||"object"!=typeof t&&"function"!=typeof t||r||!e||"object"!=typeof e&&"function"!=typeof e)||S(t,e)}var ke=function(){function t(t){this.wrapped=t}return t.wrap=function(e){return new t(e)},t.unwrap=function(e){return t.isWrapped(e)?e.wrapped:e},t.isWrapped=function(e){return e instanceof t},t}(),xe=function(){function t(t,e,n){this.previousValue=t,this.currentValue=e,this.firstChange=n}return t.prototype.isFirstChange=function(){return this.firstChange},t}();function Le(t){return!!Ce(t)&&(Array.isArray(t)||!(t instanceof Map)&&L()in t)}function Ce(t){return null!==t&&("function"==typeof t||"object"==typeof t)}var Se=function(){function t(){}return t.prototype.supports=function(t){return Le(t)},t.prototype.create=function(t){return new De(t)},t}(),Te=function(t,e){return e},De=function(){function t(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||Te}return t.prototype.forEachItem=function(t){var e;for(e=this._itHead;null!==e;e=e._next)t(e)},t.prototype.forEachOperation=function(t){for(var e=this._itHead,n=this._removalsHead,r=0,i=null;e||n;){var o=!n||e&&e.currentIndex=n.length)&&(e=n.length-1),e<0)return null;var r=n[e];return r.viewContainerParent=null,sr(n,e),rn.dirtyParentQueries(r),or(r),r}function ir(t,e,n){var r=e?xn(e,e.def.lastRenderRootNode):t.renderElement;En(n,2,n.renderer.parentNode(r),n.renderer.nextSibling(r),void 0)}function or(t){En(t,3,null,null,void 0)}function ar(t,e,n){e>=t.length?t.push(n):t.splice(e,0,n)}function sr(t,e){e>=t.length-1?t.pop():t.splice(e,1)}var lr=new Object;function ur(t,e,n,r,i,o){return new cr(t,e,n,r,i,o)}var cr=function(t){function e(e,n,r,i,o,a){var s=t.call(this)||this;return s.selector=e,s.componentType=n,s._inputs=i,s._outputs=o,s.ngContentSelectors=a,s.viewDefFactory=r,s}return Object(r.b)(e,t),Object.defineProperty(e.prototype,"inputs",{get:function(){var t=[],e=this._inputs;for(var n in e)t.push({propName:n,templateName:e[n]});return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){var t=[];for(var e in this._outputs)t.push({propName:e,templateName:this._outputs[e]});return t},enumerable:!0,configurable:!0}),e.prototype.create=function(t,e,n,r){if(!r)throw new Error("ngModule should be provided");var i=Pn(this.viewDefFactory),o=i.nodes[0].element.componentProvider.nodeIndex,a=rn.createRootView(t,e||[],n,i,r,lr),s=tn(a,o).instance;return n&&a.renderer.setAttribute($e(a,0).renderElement,"ng-version",_.full),new dr(a,new _r(a),s)},e}(_t),dr=function(t){function e(e,n,r){var i=t.call(this)||this;return i._view=e,i._viewRef=n,i._component=r,i._elDef=i._view.def.nodes[0],i.hostView=n,i.changeDetectorRef=n,i.instance=r,i}return Object(r.b)(e,t),Object.defineProperty(e.prototype,"location",{get:function(){return new ie($e(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return new vr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this._viewRef.destroy()},e.prototype.onDestroy=function(t){this._viewRef.onDestroy(t)},e}(function(){});function hr(t,e,n){return new pr(t,e,n)}var pr=function(){function t(t,e,n){this._view=t,this._elDef=e,this._data=n,this._embeddedViews=[]}return Object.defineProperty(t.prototype,"element",{get:function(){return new ie(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new vr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentInjector",{get:function(){for(var t=this._view,e=this._elDef.parent;!e&&t;)e=kn(t),t=t.parent;return t?new vr(t,e):new vr(this._view,null)},enumerable:!0,configurable:!0}),t.prototype.clear=function(){for(var t=this._embeddedViews.length-1;t>=0;t--){var e=rr(this._data,t);rn.destroyView(e)}},t.prototype.get=function(t){var e=this._embeddedViews[t];if(e){var n=new _r(e);return n.attachToViewContainerRef(this),n}return null},Object.defineProperty(t.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),t.prototype.createEmbeddedView=function(t,e,n){var r=t.createEmbeddedView(e||{});return this.insert(r,n),r},t.prototype.createComponent=function(t,e,n,r,i){var o=n||this.parentInjector;i||t instanceof kt||(i=o.get(xt));var a=t.create(o,r,void 0,i);return this.insert(a.hostView,e),a},t.prototype.insert=function(t,e){if(t.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var n,r,i,o,a=t;return i=a._view,o=(n=this._data).viewContainer._embeddedViews,null!==(r=e)&&void 0!==r||(r=o.length),i.viewContainerParent=this._view,ar(o,r,i),function(t,e){var n=Mn(e);if(n&&n!==t&&!(16&e.state)){e.state|=16;var r=n.template._projectedViews;r||(r=n.template._projectedViews=[]),r.push(e),function(t,n){if(!(4&n.flags)){e.parent.def.nodeFlags|=4,n.flags|=4;for(var r=n.parent;r;)r.childFlags|=4,r=r.parent}}(0,e.parentNodeDef)}}(n,i),rn.dirtyParentQueries(i),ir(n,r>0?o[r-1]:null,i),a.attachToViewContainerRef(this),t},t.prototype.move=function(t,e){if(t.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var n,r,i,o,a,s=this._embeddedViews.indexOf(t._view);return i=e,a=(o=(n=this._data).viewContainer._embeddedViews)[r=s],sr(o,r),null==i&&(i=o.length),ar(o,i,a),rn.dirtyParentQueries(a),or(a),ir(n,i>0?o[i-1]:null,a),t},t.prototype.indexOf=function(t){return this._embeddedViews.indexOf(t._view)},t.prototype.remove=function(t){var e=rr(this._data,t);e&&rn.destroyView(e)},t.prototype.detach=function(t){var e=rr(this._data,t);return e?new _r(e):null},t}();function fr(t){return new _r(t)}var _r=function(){function t(t){this._view=t,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(t.prototype,"rootNodes",{get:function(){return En(this._view,0,void 0,void 0,t=[]),t;var t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),t.prototype.markForCheck=function(){vn(this._view)},t.prototype.detach=function(){this._view.state&=-5},t.prototype.detectChanges=function(){var t=this._view.root.rendererFactory;t.begin&&t.begin();try{rn.checkAndUpdateView(this._view)}finally{t.end&&t.end()}},t.prototype.checkNoChanges=function(){rn.checkNoChangesView(this._view)},t.prototype.reattach=function(){this._view.state|=4},t.prototype.onDestroy=function(t){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(t)},t.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),rn.destroyView(this._view)},t.prototype.detachFromAppRef=function(){this._appRef=null,or(this._view),rn.dirtyParentQueries(this._view)},t.prototype.attachToAppRef=function(t){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t},t.prototype.attachToViewContainerRef=function(t){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=t},t}();function mr(t,e){return new gr(t,e)}var gr=function(t){function e(e,n){var r=t.call(this)||this;return r._parentView=e,r._def=n,r}return Object(r.b)(e,t),e.prototype.createEmbeddedView=function(t){return new _r(rn.createEmbeddedView(this._parentView,this._def,this._def.element.template,t))},Object.defineProperty(e.prototype,"elementRef",{get:function(){return new ie($e(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),e}(de);function yr(t,e){return new vr(t,e)}var vr=function(){function t(t,e){this.view=t,this.elDef=e}return t.prototype.get=function(t,e){return void 0===e&&(e=j.THROW_IF_NOT_FOUND),rn.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:t,tokenKey:cn(t)},e)},t}();function br(t,e){var n=t.def.nodes[e];if(1&n.flags){var r=$e(t,n.nodeIndex);return n.element.template?r.template:r.renderElement}if(2&n.flags)return Qe(t,n.nodeIndex).renderText;if(20240&n.flags)return tn(t,n.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+e)}function wr(t){return new Mr(t.renderer)}var Mr=function(){function t(t){this.delegate=t}return t.prototype.selectRootElement=function(t){return this.delegate.selectRootElement(t)},t.prototype.createElement=function(t,e){var n=Nn(e),r=this.delegate.createElement(n[1],n[0]);return t&&this.delegate.appendChild(t,r),r},t.prototype.createViewRoot=function(t){return t},t.prototype.createTemplateAnchor=function(t){var e=this.delegate.createComment("");return t&&this.delegate.appendChild(t,e),e},t.prototype.createText=function(t,e){var n=this.delegate.createText(e);return t&&this.delegate.appendChild(t,n),n},t.prototype.projectNodes=function(t,e){for(var n=0;n0,e.provider.value,e.provider.deps);if(e.outputs.length)for(var r=0;r0,r=e.provider;switch(201347067&e.flags){case 512:return Vr(t,e.parent,n,r.value,r.deps);case 1024:return function(t,e,n,r,i){var o=i.length;switch(o){case 0:return r();case 1:return r(Wr(t,e,n,i[0]));case 2:return r(Wr(t,e,n,i[0]),Wr(t,e,n,i[1]));case 3:return r(Wr(t,e,n,i[0]),Wr(t,e,n,i[1]),Wr(t,e,n,i[2]));default:for(var a=Array(o),s=0;s0)u=_,ci(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&ci(u)?u.renderParent:u}}return{factory:null,nodeFlags:a,rootNodeFlags:s,nodeMatchedQueries:l,flags:t,nodes:e,updateDirectives:n||ln,updateRenderer:r||ln,handleEvent:function(t,n,r,i){return e[n].element.handleEvent(t,r,i)},bindingCount:i,outputCount:o,lastRenderRootNode:p}}function ci(t){return 0!=(1&t.flags)&&null===t.element.name}function di(t,e,n){var r=e.element&&e.element.template;if(r){if(!r.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(r.lastRenderRootNode&&16777216&r.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+e.nodeIndex+"!")}if(20224&e.flags&&0==(1&(t?t.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+e.nodeIndex+"!");if(e.query){if(67108864&e.flags&&(!t||0==(16384&t.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+e.nodeIndex+"!");if(134217728&e.flags&&t)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+e.nodeIndex+"!")}if(e.childCount){var i=t?t.nodeIndex+t.childCount:n-1;if(e.nodeIndex<=i&&e.nodeIndex+e.childCount>i)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+e.nodeIndex+"!")}}function hi(t,e,n,r){var i=_i(t.root,t.renderer,t,e,n);return mi(i,t.component,r),gi(i),i}function pi(t,e,n){var r=_i(t,t.renderer,null,null,e);return mi(r,n,n),gi(r),r}function fi(t,e,n,r){var i,o=e.element.componentRendererType;return i=o?t.root.rendererFactory.createRenderer(r,o):t.root.renderer,_i(t.root,i,t,e.element.componentProvider,n)}function _i(t,e,n,r,i){var o=new Array(i.nodes.length),a=i.outputCount?new Array(i.outputCount):null;return{def:i,parent:n,viewContainerParent:null,parentNodeDef:r,context:null,component:null,nodes:o,state:13,root:t,renderer:e,oldValues:new Array(i.bindingCount),disposables:a,initIndex:-1}}function mi(t,e,n){t.component=e,t.context=n}function gi(t){var e;Ln(t)&&(e=$e(t.parent,t.parentNodeDef.parent.nodeIndex).renderElement);for(var n=t.def,r=t.nodes,i=0;i0&&Kn(t,e,0,n)&&(p=!0),h>1&&Kn(t,e,1,r)&&(p=!0),h>2&&Kn(t,e,2,i)&&(p=!0),h>3&&Kn(t,e,3,o)&&(p=!0),h>4&&Kn(t,e,4,a)&&(p=!0),h>5&&Kn(t,e,5,s)&&(p=!0),h>6&&Kn(t,e,6,l)&&(p=!0),h>7&&Kn(t,e,7,u)&&(p=!0),h>8&&Kn(t,e,8,c)&&(p=!0),h>9&&Kn(t,e,9,d)&&(p=!0),p}(t,e,n,r,i,o,a,s,l,u,c,d);case 2:return function(t,e,n,r,i,o,a,s,l,u,c,d){var h=!1,p=e.bindings,f=p.length;if(f>0&&gn(t,e,0,n)&&(h=!0),f>1&&gn(t,e,1,r)&&(h=!0),f>2&&gn(t,e,2,i)&&(h=!0),f>3&&gn(t,e,3,o)&&(h=!0),f>4&&gn(t,e,4,a)&&(h=!0),f>5&&gn(t,e,5,s)&&(h=!0),f>6&&gn(t,e,6,l)&&(h=!0),f>7&&gn(t,e,7,u)&&(h=!0),f>8&&gn(t,e,8,c)&&(h=!0),f>9&&gn(t,e,9,d)&&(h=!0),h){var _=e.text.prefix;f>0&&(_+=li(n,p[0])),f>1&&(_+=li(r,p[1])),f>2&&(_+=li(i,p[2])),f>3&&(_+=li(o,p[3])),f>4&&(_+=li(a,p[4])),f>5&&(_+=li(s,p[5])),f>6&&(_+=li(l,p[6])),f>7&&(_+=li(u,p[7])),f>8&&(_+=li(c,p[8])),f>9&&(_+=li(d,p[9]));var m=Qe(t,e.nodeIndex).renderText;t.renderer.setValue(m,_)}return h}(t,e,n,r,i,o,a,s,l,u,c,d);case 16384:return function(t,e,n,r,i,o,a,s,l,u,c,d){var h=tn(t,e.nodeIndex),p=h.instance,f=!1,_=void 0,m=e.bindings.length;return m>0&&mn(t,e,0,n)&&(f=!0,_=Ur(t,h,e,0,n,_)),m>1&&mn(t,e,1,r)&&(f=!0,_=Ur(t,h,e,1,r,_)),m>2&&mn(t,e,2,i)&&(f=!0,_=Ur(t,h,e,2,i,_)),m>3&&mn(t,e,3,o)&&(f=!0,_=Ur(t,h,e,3,o,_)),m>4&&mn(t,e,4,a)&&(f=!0,_=Ur(t,h,e,4,a,_)),m>5&&mn(t,e,5,s)&&(f=!0,_=Ur(t,h,e,5,s,_)),m>6&&mn(t,e,6,l)&&(f=!0,_=Ur(t,h,e,6,l,_)),m>7&&mn(t,e,7,u)&&(f=!0,_=Ur(t,h,e,7,u,_)),m>8&&mn(t,e,8,c)&&(f=!0,_=Ur(t,h,e,8,c,_)),m>9&&mn(t,e,9,d)&&(f=!0,_=Ur(t,h,e,9,d,_)),_&&p.ngOnChanges(_),65536&e.flags&&Ze(t,256,e.nodeIndex)&&p.ngOnInit(),262144&e.flags&&p.ngDoCheck(),f}(t,e,n,r,i,o,a,s,l,u,c,d);case 32:case 64:case 128:return function(t,e,n,r,i,o,a,s,l,u,c,d){var h=e.bindings,p=!1,f=h.length;if(f>0&&gn(t,e,0,n)&&(p=!0),f>1&&gn(t,e,1,r)&&(p=!0),f>2&&gn(t,e,2,i)&&(p=!0),f>3&&gn(t,e,3,o)&&(p=!0),f>4&&gn(t,e,4,a)&&(p=!0),f>5&&gn(t,e,5,s)&&(p=!0),f>6&&gn(t,e,6,l)&&(p=!0),f>7&&gn(t,e,7,u)&&(p=!0),f>8&&gn(t,e,8,c)&&(p=!0),f>9&&gn(t,e,9,d)&&(p=!0),p){var _=en(t,e.nodeIndex),m=void 0;switch(201347067&e.flags){case 32:m=new Array(h.length),f>0&&(m[0]=n),f>1&&(m[1]=r),f>2&&(m[2]=i),f>3&&(m[3]=o),f>4&&(m[4]=a),f>5&&(m[5]=s),f>6&&(m[6]=l),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=n),f>1&&(m[h[1].name]=r),f>2&&(m[h[2].name]=i),f>3&&(m[h[3].name]=o),f>4&&(m[h[4].name]=a),f>5&&(m[h[5].name]=s),f>6&&(m[h[6].name]=l),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=n;switch(f){case 1:m=g.transform(n);break;case 2:m=g.transform(r);break;case 3:m=g.transform(r,i);break;case 4:m=g.transform(r,i,o);break;case 5:m=g.transform(r,i,o,a);break;case 6:m=g.transform(r,i,o,a,s);break;case 7:m=g.transform(r,i,o,a,s,l);break;case 8:m=g.transform(r,i,o,a,s,l,u);break;case 9:m=g.transform(r,i,o,a,s,l,u,c);break;case 10:m=g.transform(r,i,o,a,s,l,u,c,d)}}_.value=m}return p}(t,e,n,r,i,o,a,s,l,u,c,d);default:throw"unreachable"}}(t,e,r,i,o,a,s,l,u,c,d,h):function(t,e,n){switch(201347067&e.flags){case 1:return function(t,e,n){for(var r=!1,i=0;i0&&yn(t,e,0,n),h>1&&yn(t,e,1,r),h>2&&yn(t,e,2,i),h>3&&yn(t,e,3,o),h>4&&yn(t,e,4,a),h>5&&yn(t,e,5,s),h>6&&yn(t,e,6,l),h>7&&yn(t,e,7,u),h>8&&yn(t,e,8,c),h>9&&yn(t,e,9,d)}(t,e,r,i,o,a,s,l,u,c,d,h):function(t,e,n){for(var r=0;r20?e=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),t+e},week:{dow:1,doy:4}})}(n("PJh5"))},ZUyn:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},ZoSI:function(t,e,n){!function(t){"use strict";t.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},aM0x:function(t,e,n){!function(t){"use strict";var e={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};t.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(t){return t.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u09b0\u09be\u09a4"===e&&t>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===e&&t<5||"\u09ac\u09bf\u0995\u09be\u09b2"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u09b0\u09be\u09a4":t<10?"\u09b8\u0995\u09be\u09b2":t<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":t<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n("PJh5"))},aqvp:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},bXQP:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(n("PJh5"))},c1x4:function(t,e,n){!function(t){"use strict";var e={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"\u0434\u0430\u043d",dd:e.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:e.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},cQXm:function(t,e,n){"use strict";e.a=function(t){return t&&"function"!=typeof t.subscribe&&"function"==typeof t.then}},dURR:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-ma",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:6,doy:12}})}(n("PJh5"))},dgOU:function(t,e,n){"use strict";e.a=function(t){return null!=t&&"object"==typeof t}},dyB6:function(t,e,n){!function(t){"use strict";t.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},"e/KL":function(t,e,n){!function(t){"use strict";t.defineLocale("x-pseudo",{months:"J~\xe1\xf1\xfa\xe1~r\xfd_F~\xe9br\xfa~\xe1r\xfd_~M\xe1rc~h_\xc1p~r\xedl_~M\xe1\xfd_~J\xfa\xf1\xe9~_J\xfal~\xfd_\xc1\xfa~g\xfast~_S\xe9p~t\xe9mb~\xe9r_\xd3~ct\xf3b~\xe9r_\xd1~\xf3v\xe9m~b\xe9r_~D\xe9c\xe9~mb\xe9r".split("_"),monthsShort:"J~\xe1\xf1_~F\xe9b_~M\xe1r_~\xc1pr_~M\xe1\xfd_~J\xfa\xf1_~J\xfal_~\xc1\xfag_~S\xe9p_~\xd3ct_~\xd1\xf3v_~D\xe9c".split("_"),monthsParseExact:!0,weekdays:"S~\xfa\xf1d\xe1~\xfd_M\xf3~\xf1d\xe1\xfd~_T\xfa\xe9~sd\xe1\xfd~_W\xe9d~\xf1\xe9sd~\xe1\xfd_T~h\xfars~d\xe1\xfd_~Fr\xedd~\xe1\xfd_S~\xe1t\xfar~d\xe1\xfd".split("_"),weekdaysShort:"S~\xfa\xf1_~M\xf3\xf1_~T\xfa\xe9_~W\xe9d_~Th\xfa_~Fr\xed_~S\xe1t".split("_"),weekdaysMin:"S~\xfa_M\xf3~_T\xfa_~W\xe9_T~h_Fr~_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[T~\xf3d\xe1~\xfd \xe1t] LT",nextDay:"[T~\xf3m\xf3~rr\xf3~w \xe1t] LT",nextWeek:"dddd [\xe1t] LT",lastDay:"[\xdd~\xe9st~\xe9rd\xe1~\xfd \xe1t] LT",lastWeek:"[L~\xe1st] dddd [\xe1t] LT",sameElse:"L"},relativeTime:{future:"\xed~\xf1 %s",past:"%s \xe1~g\xf3",s:"\xe1 ~f\xe9w ~s\xe9c\xf3~\xf1ds",ss:"%d s~\xe9c\xf3\xf1~ds",m:"\xe1 ~m\xed\xf1~\xfat\xe9",mm:"%d m~\xed\xf1\xfa~t\xe9s",h:"\xe1~\xf1 h\xf3~\xfar",hh:"%d h~\xf3\xfars",d:"\xe1 ~d\xe1\xfd",dd:"%d d~\xe1\xfds",M:"\xe1 ~m\xf3\xf1~th",MM:"%d m~\xf3\xf1t~hs",y:"\xe1 ~\xfd\xe9\xe1r",yy:"%d \xfd~\xe9\xe1rs"},dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},"eBB/":function(t,e,n){!function(t){"use strict";t.defineLocale("ko",{months:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),monthsShort:"1\uc6d4_2\uc6d4_3\uc6d4_4\uc6d4_5\uc6d4_6\uc6d4_7\uc6d4_8\uc6d4_9\uc6d4_10\uc6d4_11\uc6d4_12\uc6d4".split("_"),weekdays:"\uc77c\uc694\uc77c_\uc6d4\uc694\uc77c_\ud654\uc694\uc77c_\uc218\uc694\uc77c_\ubaa9\uc694\uc77c_\uae08\uc694\uc77c_\ud1a0\uc694\uc77c".split("_"),weekdaysShort:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),weekdaysMin:"\uc77c_\uc6d4_\ud654_\uc218_\ubaa9_\uae08_\ud1a0".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY\ub144 MMMM D\uc77c",LLL:"YYYY\ub144 MMMM D\uc77c A h:mm",LLLL:"YYYY\ub144 MMMM D\uc77c dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY\ub144 MMMM D\uc77c",lll:"YYYY\ub144 MMMM D\uc77c A h:mm",llll:"YYYY\ub144 MMMM D\uc77c dddd A h:mm"},calendar:{sameDay:"\uc624\ub298 LT",nextDay:"\ub0b4\uc77c LT",nextWeek:"dddd LT",lastDay:"\uc5b4\uc81c LT",lastWeek:"\uc9c0\ub09c\uc8fc dddd LT",sameElse:"L"},relativeTime:{future:"%s \ud6c4",past:"%s \uc804",s:"\uba87 \ucd08",ss:"%d\ucd08",m:"1\ubd84",mm:"%d\ubd84",h:"\ud55c \uc2dc\uac04",hh:"%d\uc2dc\uac04",d:"\ud558\ub8e8",dd:"%d\uc77c",M:"\ud55c \ub2ec",MM:"%d\ub2ec",y:"\uc77c \ub144",yy:"%d\ub144"},dayOfMonthOrdinalParse:/\d{1,2}(\uc77c|\uc6d4|\uc8fc)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\uc77c";case"M":return t+"\uc6d4";case"w":case"W":return t+"\uc8fc";default:return t}},meridiemParse:/\uc624\uc804|\uc624\ud6c4/,isPM:function(t){return"\uc624\ud6c4"===t},meridiem:function(t,e,n){return t<12?"\uc624\uc804":"\uc624\ud6c4"}})}(n("PJh5"))},eHwN:function(t,e,n){!function(t){"use strict";var e={1:"-inci",5:"-inci",8:"-inci",70:"-inci",80:"-inci",2:"-nci",7:"-nci",20:"-nci",50:"-nci",3:"-\xfcnc\xfc",4:"-\xfcnc\xfc",100:"-\xfcnc\xfc",6:"-nc\u0131",9:"-uncu",10:"-uncu",30:"-uncu",60:"-\u0131nc\u0131",90:"-\u0131nc\u0131"};t.defineLocale("az",{months:"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr".split("_"),monthsShort:"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek".split("_"),weekdays:"Bazar_Bazar ert\u0259si_\xc7\u0259r\u015f\u0259nb\u0259 ax\u015fam\u0131_\xc7\u0259r\u015f\u0259nb\u0259_C\xfcm\u0259 ax\u015fam\u0131_C\xfcm\u0259_\u015e\u0259nb\u0259".split("_"),weekdaysShort:"Baz_BzE_\xc7Ax_\xc7\u0259r_CAx_C\xfcm_\u015e\u0259n".split("_"),weekdaysMin:"Bz_BE_\xc7A_\xc7\u0259_CA_C\xfc_\u015e\u0259".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[sabah saat] LT",nextWeek:"[g\u0259l\u0259n h\u0259ft\u0259] dddd [saat] LT",lastDay:"[d\xfcn\u0259n] LT",lastWeek:"[ke\xe7\u0259n h\u0259ft\u0259] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \u0259vv\u0259l",s:"birne\xe7\u0259 saniyy\u0259",ss:"%d saniy\u0259",m:"bir d\u0259qiq\u0259",mm:"%d d\u0259qiq\u0259",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir il",yy:"%d il"},meridiemParse:/gec\u0259|s\u0259h\u0259r|g\xfcnd\xfcz|ax\u015fam/,isPM:function(t){return/^(g\xfcnd\xfcz|ax\u015fam)$/.test(t)},meridiem:function(t,e,n){return t<4?"gec\u0259":t<12?"s\u0259h\u0259r":t<17?"g\xfcnd\xfcz":"ax\u015fam"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0131nc\u0131|inci|nci|\xfcnc\xfc|nc\u0131|uncu)/,ordinal:function(t){if(0===t)return t+"-\u0131nc\u0131";var n=t%10;return t+(e[n]||e[t%100-n]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},etqZ:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e=t.Symbol;if("function"==typeof e)return e.iterator||(e.iterator=e("iterator polyfill")),e.iterator;var n=t.Set;if(n&&"function"==typeof(new n)["@@iterator"])return"@@iterator";var r=t.Map;if(r)for(var i=Object.getOwnPropertyNames(r.prototype),o=0;o=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},f9aG:function(t,e,n){"use strict";function r(){}function i(t){return t?1===t.length?t[0]:function(e){return t.reduce(function(t,e){return e(t)},e)}:r}e.a=function(){for(var t=[],e=0;e=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},gEQe:function(t,e,n){!function(t){"use strict";var e={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};t.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(t){return t.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===e?t<4?t:t+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===e?t:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===e?t>=10?t:t+12:"\u0cb8\u0c82\u0c9c\u0cc6"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":t<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":t<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":t<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(t){return t+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n("PJh5"))},gEU3:function(t,e,n){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},gUgh:function(t,e,n){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hPuz:function(t,e,n){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hng5:function(t,e,n){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n("PJh5"))},iNtv:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[t+" m\xeduts",t+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[t+" \xfeoras",t+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return r?i[n][0]:e?i[n][0]:i[n][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,n){return t>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"j+vx":function(t,e,n){!function(t){"use strict";var e={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};t.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},j8cJ:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n("PJh5"))},jxEH:function(t,e,n){!function(t){"use strict";var e={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(t,e,n){return n?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function r(t,r,i){return t+" "+n(e[i],t,r)}function i(t,r,i){return n(e[i],t,r)}t.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(t,e){return e?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:r,m:i,mm:r,h:i,hh:r,d:i,dd:r,M:i,MM:r,y:i,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"k+5o":function(t,e,n){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};t.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(t,n){switch(n){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'\u0131nc\u0131";var r=t%10;return t+(e[r]||e[t%100-r]||e[t>=100?100:null])}},week:{dow:1,doy:7}})}(n("PJh5"))},krPU:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n("PJh5"))},lOED:function(t,e,n){!function(t){"use strict";t.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},m7yE:function(t,e,n){!function(t){"use strict";var e="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(t,n,r,i){var o=function(t){var n=Math.floor(t%1e3/100),r=Math.floor(t%100/10),i=t%10,o="";return n>0&&(o+=e[n]+"vatlh"),r>0&&(o+=(""!==o?" ":"")+e[r]+"maH"),i>0&&(o+=(""!==o?" ":"")+e[i]),""===o?"pagh":o}(t);switch(r){case"ss":return o+" lup";case"mm":return o+" tup";case"hh":return o+" rep";case"dd":return o+" jaj";case"MM":return o+" jar";case"yy":return o+" DIS"}}t.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"},past:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu\u2019":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},nE8X:function(t,e,n){!function(t){"use strict";t.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(t){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===t},meridiem:function(t,e,n){return t<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(t){return"\u0e97\u0eb5\u0ec8"+t}})}(n("PJh5"))},nLOz:function(t,e,n){!function(t){"use strict";t.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n("PJh5"))},nS2h:function(t,e,n){!function(t){"use strict";var e="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",e[7],e[8],e[9]];function r(t,r,i,o){var a="";switch(i){case"s":return o?"muutaman sekunnin":"muutama sekunti";case"ss":return o?"sekunnin":"sekuntia";case"m":return o?"minuutin":"minuutti";case"mm":a=o?"minuutin":"minuuttia";break;case"h":return o?"tunnin":"tunti";case"hh":a=o?"tunnin":"tuntia";break;case"d":return o?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":a=o?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return o?"kuukauden":"kuukausi";case"MM":a=o?"kuukauden":"kuukautta";break;case"y":return o?"vuoden":"vuosi";case"yy":a=o?"vuoden":"vuotta"}return function(t,r){return t<10?r?n[t]:e[t]:t}(t,o)+" "+a}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},ntHu:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?e?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:e?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}function n(t){return function(){return t+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}t.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(t,e){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return t?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(e)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:e,y:"\u0440\u0456\u043a",yy:e},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0456":t<12?"\u0440\u0430\u043d\u043a\u0443":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-\u0439";case"D":return t+"-\u0433\u043e";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},oCzW:function(t,e,n){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},oo1B:function(t,e,n){!function(t){"use strict";t.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===e&&t>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===e||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":t<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":t<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":t<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n("PJh5"))},ooba:function(t,e,n){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},pfs9:function(t,e,n){!function(t){"use strict";var e={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};t.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(t){return t.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0a30\u0a3e\u0a24"===e?t<4?t:t+12:"\u0a38\u0a35\u0a47\u0a30"===e?t:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===e?t>=10?t:t+12:"\u0a38\u0a3c\u0a3e\u0a2e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0a30\u0a3e\u0a24":t<10?"\u0a38\u0a35\u0a47\u0a30":t<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":t<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n("PJh5"))},rIuo:function(t,e,n){!function(t){"use strict";var e=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(t){return"\u0789\u078a"===t},meridiem:function(t,e,n){return t<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n("PJh5"))},rtsW:function(t,e,n){!function(t){"use strict";var e={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};t.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(t){return t.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0ab0\u0abe\u0aa4"===e?t<4?t:t+12:"\u0ab8\u0ab5\u0abe\u0ab0"===e?t:"\u0aac\u0aaa\u0acb\u0ab0"===e?t>=10?t:t+12:"\u0ab8\u0abe\u0a82\u0a9c"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0ab0\u0abe\u0aa4":t<10?"\u0ab8\u0ab5\u0abe\u0ab0":t<17?"\u0aac\u0aaa\u0acb\u0ab0":t<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n("PJh5"))},sqLM:function(t,e,n){!function(t){"use strict";t.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},ssxj:function(t,e,n){!function(t){"use strict";var e="leden_\xfanor_b\u0159ezen_duben_kv\u011bten_\u010derven_\u010dervenec_srpen_z\xe1\u0159\xed_\u0159\xedjen_listopad_prosinec".split("_"),n="led_\xfano_b\u0159e_dub_kv\u011b_\u010dvn_\u010dvc_srp_z\xe1\u0159_\u0159\xedj_lis_pro".split("_");function r(t){return t>1&&t<5&&1!=~~(t/10)}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sekund"):o+"sekundami";case"m":return e?"minuta":i?"minutu":"minutou";case"mm":return e||i?o+(r(t)?"minuty":"minut"):o+"minutami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hodin"):o+"hodinami";case"d":return e||i?"den":"dnem";case"dd":return e||i?o+(r(t)?"dny":"dn\xed"):o+"dny";case"M":return e||i?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return e||i?o+(r(t)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):o+"m\u011bs\xedci";case"y":return e||i?"rok":"rokem";case"yy":return e||i?o+(r(t)?"roky":"let"):o+"lety"}}t.defineLocale("cs",{months:e,monthsShort:n,monthsParse:function(t,e){var n,r=[];for(n=0;n<12;n++)r[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return r}(e,n),shortMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(n),longMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(e),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},svD2:function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},t7NR:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r={closed:!0,next:function(t){},error:function(t){throw t},complete:function(){}}},tLDX:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("AMGY").a.Symbol,i="function"==typeof r&&"function"==typeof r.for?r.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(){t.apply(this,arguments)}return Object(r.b)(e,t),e.prototype.notifyNext=function(t,e,n,r,i){this.destination.next(e)},e.prototype.notifyError=function(t,e){this.destination.error(t)},e.prototype.notifyComplete=function(t){this.destination.complete()},e}(n("OVmG").a)},tkWw:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(n("PJh5"))},tzHd:function(t,e,n){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},uSe8:function(t,e,n){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("PJh5"))},ulq9:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];t.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f, \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430, \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430, \u0432] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd, [\u0432] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd, [\u0432] LT":"[\u0412] dddd, [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd, [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd, [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd, [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0447\u0430\u0441",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0438":t<12?"\u0443\u0442\u0440\u0430":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-\u0439";case"D":return t+"-\u0433\u043e";case"w":case"W":return t+"-\u044f";default:return t}},week:{dow:1,doy:4}})}(n("PJh5"))},upln:function(t,e,n){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function n(t,n,r,i){var o=t+" ";switch(r){case"s":return n||i?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return e(t)?o+(n||i?"sek\xfandur":"sek\xfandum"):o+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return e(t)?o+(n||i?"m\xedn\xfatur":"m\xedn\xfatum"):n?o+"m\xedn\xfata":o+"m\xedn\xfatu";case"hh":return e(t)?o+(n||i?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return n?"dagur":i?"dag":"degi";case"dd":return e(t)?n?o+"dagar":o+(i?"daga":"d\xf6gum"):n?o+"dagur":o+(i?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":i?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return e(t)?n?o+"m\xe1nu\xf0ir":o+(i?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?o+"m\xe1nu\xf0ur":o+(i?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||i?"\xe1r":"\xe1ri";case"yy":return e(t)?o+(n||i?"\xe1r":"\xe1rum"):o+(n||i?"\xe1r":"\xe1ri")}}t.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},uslO:function(t,e,n){var r={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mn":"CqHt","./mn.js":"CqHt","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function i(t){return n(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="uslO"},w2Hs:function(t,e,n){!function(t){"use strict";var e={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};t.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(t){return t.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===e&&t>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===e&&t<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":t<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":t<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":t<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n("PJh5"))},wIgY:function(t,e,n){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(t,e){var n=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"\xe8";return"w"!==e&&"W"!==e||(n="a"),t+n},week:{dow:1,doy:4}})}(n("PJh5"))},wPpW:function(t,e,n){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(t){return function(e,i,o,a){var s=n(e),l=r[t][n(e)];return 2===s&&(l=l[i?0:1]),l.replace(/%d/i,e)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},wT5f:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=" ";return(t%100>=20||t>=100&&t%100==0)&&(r=" de "),t+r+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:e,m:"un minut",mm:e,h:"o or\u0103",hh:e,d:"o zi",dd:e,M:"o lun\u0103",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(n("PJh5"))},x35b:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("WT6e"),i={nodeUrl:"http://127.0.0.1:7220/",production:!0,tellerUrl:"https://event.skycoin.net/api/"},o=n("TToO"),a=n("YaPU"),s=function(){},l=new r.p("Location Initialized"),u=function(){},c=new r.p("appBaseHref"),d=function(){function t(e){var n=this;this._subject=new r.n,this._platformStrategy=e;var i=this._platformStrategy.getBaseHref();this._baseHref=t.stripTrailingSlash(h(i)),this._platformStrategy.onPopState(function(t){n._subject.emit({url:n.path(!0),pop:!0,type:t.type})})}return t.prototype.path=function(t){return void 0===t&&(t=!1),this.normalize(this._platformStrategy.path(t))},t.prototype.isCurrentPathEqualTo=function(e,n){return void 0===n&&(n=""),this.path()==this.normalize(e+t.normalizeQueryParams(n))},t.prototype.normalize=function(e){return t.stripTrailingSlash(function(t,e){return t&&e.startsWith(t)?e.substring(t.length):e}(this._baseHref,h(e)))},t.prototype.prepareExternalUrl=function(t){return t&&"/"!==t[0]&&(t="/"+t),this._platformStrategy.prepareExternalUrl(t)},t.prototype.go=function(t,e){void 0===e&&(e=""),this._platformStrategy.pushState(null,"",t,e)},t.prototype.replaceState=function(t,e){void 0===e&&(e=""),this._platformStrategy.replaceState(null,"",t,e)},t.prototype.forward=function(){this._platformStrategy.forward()},t.prototype.back=function(){this._platformStrategy.back()},t.prototype.subscribe=function(t,e,n){return this._subject.subscribe({next:t,error:e,complete:n})},t.normalizeQueryParams=function(t){return t&&"?"!==t[0]?"?"+t:t},t.joinWithSlash=function(t,e){if(0==t.length)return e;if(0==e.length)return t;var n=0;return t.endsWith("/")&&n++,e.startsWith("/")&&n++,2==n?t+e.substring(1):1==n?t+e:t+"/"+e},t.stripTrailingSlash=function(t){var e=t.match(/#|\?|$/),n=e&&e.index||t.length;return t.slice(0,n-("/"===t[n-1]?1:0))+t.slice(n)},t}();function h(t){return t.replace(/\/index.html$/,"")}var p=function(t){function e(e,n){var r=t.call(this)||this;return r._platformLocation=e,r._baseHref="",null!=n&&(r._baseHref=n),r}return Object(o.b)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.hash;return null==e&&(e="#"),e.length>0?e.substring(1):e},e.prototype.prepareExternalUrl=function(t){var e=d.joinWithSlash(this._baseHref,t);return e.length>0?"#"+e:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),f=function(t){function e(e,n){var r=t.call(this)||this;if(r._platformLocation=e,null==n&&(n=r._platformLocation.getBaseHrefFromDOM()),null==n)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=n,r}return Object(o.b)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.prepareExternalUrl=function(t){return d.joinWithSlash(this._baseHref,t)},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),n=this._platformLocation.hash;return n&&t?""+e+n:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),_=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(t){var e=Math.floor(Math.abs(t)),n=t.toString().replace(/^[^.]*\.?/,"").length;return 1===e&&0===n?1:5}],m={},g=function(){var t={Decimal:0,Percent:1,Currency:2,Scientific:3};return t[t.Decimal]="Decimal",t[t.Percent]="Percent",t[t.Currency]="Currency",t[t.Scientific]="Scientific",t}(),y=function(){var t={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return t[t.Zero]="Zero",t[t.One]="One",t[t.Two]="Two",t[t.Few]="Few",t[t.Many]="Many",t[t.Other]="Other",t}(),v=function(){var t={Format:0,Standalone:1};return t[t.Format]="Format",t[t.Standalone]="Standalone",t}(),b=function(){var t={Narrow:0,Abbreviated:1,Wide:2,Short:3};return t[t.Narrow]="Narrow",t[t.Abbreviated]="Abbreviated",t[t.Wide]="Wide",t[t.Short]="Short",t}(),w=function(){var t={Short:0,Medium:1,Long:2,Full:3};return t[t.Short]="Short",t[t.Medium]="Medium",t[t.Long]="Long",t[t.Full]="Full",t}(),M=function(){var t={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return t[t.Decimal]="Decimal",t[t.Group]="Group",t[t.List]="List",t[t.PercentSign]="PercentSign",t[t.PlusSign]="PlusSign",t[t.MinusSign]="MinusSign",t[t.Exponential]="Exponential",t[t.SuperscriptingExponent]="SuperscriptingExponent",t[t.PerMille]="PerMille",t[t.Infinity]="Infinity",t[t.NaN]="NaN",t[t.TimeSeparator]="TimeSeparator",t[t.CurrencyDecimal]="CurrencyDecimal",t[t.CurrencyGroup]="CurrencyGroup",t}();function k(t,e){return T(O(t)[10],e)}function x(t,e){return T(O(t)[11],e)}function L(t,e){return T(O(t)[12],e)}function C(t,e){var n=O(t),r=n[13][e];if("undefined"==typeof r){if(e===M.CurrencyDecimal)return n[13][M.Decimal];if(e===M.CurrencyGroup)return n[13][M.Group]}return r}function S(t){if(!t[18])throw new Error('Missing extra locale data for the locale "'+t[0]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function T(t,e){for(var n=e;n>-1;n--)if("undefined"!=typeof t[n])return t[n];throw new Error("Locale data API: locale data undefined")}function D(t){var e=t.split(":");return{hours:+e[0],minutes:+e[1]}}function O(t){var e=t.toLowerCase().replace(/_/g,"-"),n=m[e];if(n)return n;var r=e.split("-")[0];if(n=m[r])return n;if("en"===r)return _;throw new Error('Missing locale data for the locale "'+t+'".')}var Y=new r.p("UseV4Plurals"),P=function(){},E=function(t){function e(e,n){var r=t.call(this)||this;return r.locale=e,r.deprecatedPluralFn=n,r}return Object(o.b)(e,t),e.prototype.getPluralCategory=function(t,e){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(e||this.locale,t):function(t){return O(t)[17]}(e||this.locale)(t)){case y.Zero:return"zero";case y.One:return"one";case y.Two:return"two";case y.Few:return"few";case y.Many:return"many";default:return"other"}},e}(P);function j(t,e){e=encodeURIComponent(e);for(var n=0,r=t.split(";");n0||s>-n)&&(s+=n),t===K.Hours&&0===s&&-12===n&&(s=12),Q(s,e,C(a,M.MinusSign),r,i)}}function tt(t,e,n,r){return void 0===n&&(n=v.Format),void 0===r&&(r=!1),function(i,o){return function(t,e,n,r,i,o){switch(n){case X.Months:return function(t,e,n){var r=O(t);return T(T([r[5],r[6]],e),n)}(e,i,r)[t.getMonth()];case X.Days:return function(t,e,n){var r=O(t);return T(T([r[3],r[4]],e),n)}(e,i,r)[t.getDay()];case X.DayPeriods:var a=t.getHours(),s=t.getMinutes();if(o){var l,u=function(t){var e=O(t);return S(e),(e[18][2]||[]).map(function(t){return"string"==typeof t?D(t):[D(t[0]),D(t[1])]})}(e),c=function(t,e,n){var r=O(t);return S(r),T(T([r[18][0],r[18][1]],e)||[],n)||[]}(e,i,r);if(u.forEach(function(t,e){if(Array.isArray(t)){var n=t[0],r=t[1],i=r.hours;a>=n.hours&&s>=n.minutes&&(a0?Math.floor(i/60):Math.ceil(i/60);switch(t){case G.Short:return(i>=0?"+":"")+Q(a,2,o)+Q(Math.abs(i%60),2,o);case G.ShortGMT:return"GMT"+(i>=0?"+":"")+Q(a,1,o);case G.Long:return"GMT"+(i>=0?"+":"")+Q(a,2,o)+":"+Q(Math.abs(i%60),2,o);case G.Extended:return 0===r?"Z":(i>=0?"+":"")+Q(a,2,o)+":"+Q(Math.abs(i%60),2,o);default:throw new Error('Unknown zone width "'+t+'"')}}}var nt=0,rt=4;function it(t,e){return void 0===e&&(e=!1),function(n,r){var i,o,a,s;if(e){var l=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,u=n.getDate();i=1+Math.floor((u+l)/7)}else{var c=(a=n.getFullYear(),s=new Date(a,nt,1).getDay(),new Date(a,0,1+(s<=rt?rt:rt+7)-s)),d=(o=n,new Date(o.getFullYear(),o.getMonth(),o.getDate()+(rt-o.getDay()))).getTime()-c.getTime();i=1+Math.round(d/6048e5)}return Q(i,t,C(r,M.MinusSign))}}var ot={};function at(t,e){t=t.replace(/:/g,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(n)?e:n}function st(t,e){return Error("InvalidPipeArgument: '"+e+"' for pipe '"+Object(r._26)(t)+"'")}var lt=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,ut=function(){function t(t){this.locale=t}return t.prototype.transform=function(e,n,r,i){if(void 0===n&&(n="mediumDate"),null==e||""===e||e!=e)return null;var o,a;if("string"==typeof e&&(e=e.trim()),ct(e))o=e;else if(isNaN(e-parseFloat(e)))if("string"==typeof e&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(e)){var s=e.split("-").map(function(t){return+t});o=new Date(s[0],s[1]-1,s[2])}else o="string"==typeof e&&(a=e.match(lt))?function(t){var e=new Date(0),n=0,r=0,i=t[8]?e.setUTCHours:e.setHours;t[9]&&(n=+(t[9]+t[10]),r=+(t[9]+t[11])),(t[8]?e.setUTCFullYear:e.setFullYear).call(e,+t[1],+t[2]-1,+t[3]);var o=+(t[4]||"0")-n,a=+(t[5]||"0")-r,s=+(t[6]||"0"),l=Math.round(1e3*parseFloat("0."+(t[7]||0)));return i.call(e,o,a,s,l),e}(a):new Date(e);else o=new Date(parseFloat(e));if(!ct(o))throw st(t,e);return function(t,e,n,r){e=function t(e,n){var r=function(t){return O(t)[0]}(e);if(q[r]=q[r]||{},q[r][n])return q[r][n];var i="";switch(n){case"shortDate":i=k(e,w.Short);break;case"mediumDate":i=k(e,w.Medium);break;case"longDate":i=k(e,w.Long);break;case"fullDate":i=k(e,w.Full);break;case"shortTime":i=x(e,w.Short);break;case"mediumTime":i=x(e,w.Medium);break;case"longTime":i=x(e,w.Long);break;case"fullTime":i=x(e,w.Full);break;case"short":var o=t(e,"shortTime"),a=t(e,"shortDate");i=Z(L(e,w.Short),[o,a]);break;case"medium":var s=t(e,"mediumTime"),l=t(e,"mediumDate");i=Z(L(e,w.Medium),[s,l]);break;case"long":var u=t(e,"longTime"),c=t(e,"longDate");i=Z(L(e,w.Long),[u,c]);break;case"full":var d=t(e,"fullTime"),h=t(e,"fullDate");i=Z(L(e,w.Full),[d,h])}return i&&(q[r][n]=i),i}(n,e)||e;for(var i,o=[];e;){if(!(i=J.exec(e))){o.push(e);break}var a=(o=o.concat(i.slice(1))).pop();if(!a)break;e=a}var s=t.getTimezoneOffset();r&&(s=at(r,s),t=function(t,e,n){var r=t.getTimezoneOffset();return function(t,e){return(t=new Date(t.getTime())).setMinutes(t.getMinutes()+e),t}(t,-1*(at(e,r)-r))}(t,r));var l="";return o.forEach(function(e){var r=function(t){if(ot[t])return ot[t];var e;switch(t){case"G":case"GG":case"GGG":e=tt(X.Eras,b.Abbreviated);break;case"GGGG":e=tt(X.Eras,b.Wide);break;case"GGGGG":e=tt(X.Eras,b.Narrow);break;case"y":e=$(K.FullYear,1,0,!1,!0);break;case"yy":e=$(K.FullYear,2,0,!0,!0);break;case"yyy":e=$(K.FullYear,3,0,!1,!0);break;case"yyyy":e=$(K.FullYear,4,0,!1,!0);break;case"M":case"L":e=$(K.Month,1,1);break;case"MM":case"LL":e=$(K.Month,2,1);break;case"MMM":e=tt(X.Months,b.Abbreviated);break;case"MMMM":e=tt(X.Months,b.Wide);break;case"MMMMM":e=tt(X.Months,b.Narrow);break;case"LLL":e=tt(X.Months,b.Abbreviated,v.Standalone);break;case"LLLL":e=tt(X.Months,b.Wide,v.Standalone);break;case"LLLLL":e=tt(X.Months,b.Narrow,v.Standalone);break;case"w":e=it(1);break;case"ww":e=it(2);break;case"W":e=it(1,!0);break;case"d":e=$(K.Date,1);break;case"dd":e=$(K.Date,2);break;case"E":case"EE":case"EEE":e=tt(X.Days,b.Abbreviated);break;case"EEEE":e=tt(X.Days,b.Wide);break;case"EEEEE":e=tt(X.Days,b.Narrow);break;case"EEEEEE":e=tt(X.Days,b.Short);break;case"a":case"aa":case"aaa":e=tt(X.DayPeriods,b.Abbreviated);break;case"aaaa":e=tt(X.DayPeriods,b.Wide);break;case"aaaaa":e=tt(X.DayPeriods,b.Narrow);break;case"b":case"bb":case"bbb":e=tt(X.DayPeriods,b.Abbreviated,v.Standalone,!0);break;case"bbbb":e=tt(X.DayPeriods,b.Wide,v.Standalone,!0);break;case"bbbbb":e=tt(X.DayPeriods,b.Narrow,v.Standalone,!0);break;case"B":case"BB":case"BBB":e=tt(X.DayPeriods,b.Abbreviated,v.Format,!0);break;case"BBBB":e=tt(X.DayPeriods,b.Wide,v.Format,!0);break;case"BBBBB":e=tt(X.DayPeriods,b.Narrow,v.Format,!0);break;case"h":e=$(K.Hours,1,-12);break;case"hh":e=$(K.Hours,2,-12);break;case"H":e=$(K.Hours,1);break;case"HH":e=$(K.Hours,2);break;case"m":e=$(K.Minutes,1);break;case"mm":e=$(K.Minutes,2);break;case"s":e=$(K.Seconds,1);break;case"ss":e=$(K.Seconds,2);break;case"S":e=$(K.Milliseconds,1);break;case"SS":e=$(K.Milliseconds,2);break;case"SSS":e=$(K.Milliseconds,3);break;case"Z":case"ZZ":case"ZZZ":e=et(G.Short);break;case"ZZZZZ":e=et(G.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":e=et(G.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":e=et(G.Long);break;default:return null}return ot[t]=e,e}(e);l+=r?r(t,n,s):"''"===e?"'":e.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),l}(o,n,i||this.locale,r)},t}();function ct(t){return t instanceof Date&&!isNaN(t.valueOf())}var dt=/^(\d+)?\.((\d+)(-(\d+))?)?$/,ht=22,pt=".",ft="0",_t=";",mt=",",gt="#",yt="\xa4",vt="%";function bt(t,e,n,r,i){void 0===i&&(i=null);var o,a={str:null},s=function(t,e){return O(t)[14][e]}(e,n);if("string"!=typeof t||isNaN(+t-parseFloat(t))){if("number"!=typeof t)return a.error=t+" is not a number",a;o=t}else o=+t;var l=function(t,e){void 0===e&&(e="-");var n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},r=t.split(_t),i=r[0],o=r[1],a=-1!==i.indexOf(pt)?i.split(pt):[i.substring(0,i.lastIndexOf(ft)+1),i.substring(i.lastIndexOf(ft)+1)],s=a[0],l=a[1]||"";n.posPre=s.substr(0,s.indexOf(gt));for(var u=0;u-1&&(a=a.replace(pt,"")),(r=a.search(/e/i))>0?(n<0&&(n=r),n+=+a.slice(r+1),a=a.substring(0,r)):n<0&&(n=a.length),r=0;a.charAt(r)===ft;r++);if(r===(o=a.length))e=[0],n=1;else{for(o--;a.charAt(o)===ft;)o--;for(n-=r,e=[],i=0;r<=o;r++,i++)e[i]=+a.charAt(r)}return n>ht&&(e=e.splice(0,ht-1),s=n-1,n=1),{digits:e,exponent:s,integerLen:n}}(o);n===g.Percent&&(d=function(t){if(0===t.digits[0])return t;var e=t.digits.length-t.integerLen;return t.exponent?t.exponent+=2:(0===e?t.digits.push(0,0):1===e&&t.digits.push(0),t.integerLen+=2),t}(d));var h=l.minInt,p=l.minFrac,f=l.maxFrac;if(r){var _=r.match(dt);if(null===_)return a.error=r+" is not a valid digit info",a;var m=_[1],y=_[3],v=_[5];null!=m&&(h=wt(m)),null!=y&&(p=wt(y)),null!=v?f=wt(v):null!=y&&p>f&&(f=p)}!function(t,e,n){if(e>n)throw new Error("The minimum number of digits after fraction ("+e+") is higher than the maximum ("+n+").");var r=t.digits,i=r.length-t.integerLen,o=Math.min(Math.max(e,i),n),a=o+t.integerLen,s=r[a];if(a>0){r.splice(Math.max(t.integerLen,a));for(var l=a;l=5)if(a-1<0){for(var c=0;c>a;c--)r.unshift(0),t.integerLen++;r.unshift(1),t.integerLen++}else r[a-1]++;for(;i=h?r.pop():d=!1),e>=10?1:0},0);p&&(r.unshift(p),t.integerLen++)}(d,p,f);var b=d.digits,w=d.integerLen,k=d.exponent,x=[];for(c=b.every(function(t){return!t});w0?x=b.splice(w,b.length):(x=b,b=[0]);var L=[];for(b.length>=l.lgSize&&L.unshift(b.splice(-l.lgSize,b.length).join(""));b.length>l.gSize;)L.unshift(b.splice(-l.gSize,b.length).join(""));b.length&&L.unshift(b.join("")),u=L.join(C(e,i?M.CurrencyGroup:M.Group)),x.length&&(u+=C(e,i?M.CurrencyDecimal:M.Decimal)+x.join("")),k&&(u+=C(e,M.Exponential)+"+"+k)}else u=C(e,M.Infinity);return u=o<0&&!c?l.negPre+u+l.negSuf:l.posPre+u+l.posSuf,n===g.Currency&&null!==i?(a.str=u.replace(yt,i).replace(yt,""),a):n===g.Percent?(a.str=u.replace(new RegExp(vt,"g"),C(e,M.PercentSign)),a):(a.str=u,a)}function wt(t){var e=parseInt(t);if(isNaN(e))throw new Error("Invalid integer literal when parsing "+t);return e}var Mt=function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.subscribe({next:e,error:function(t){throw t}})},t.prototype.dispose=function(t){t.unsubscribe()},t.prototype.onDestroy=function(t){t.unsubscribe()},t}(),kt=new(function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.then(e,function(t){throw t})},t.prototype.dispose=function(t){},t.prototype.onDestroy=function(t){},t}()),xt=new Mt,Lt=function(){function t(t){this._ref=t,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return t.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},t.prototype.transform=function(t){return this._obj?t!==this._obj?(this._dispose(),this.transform(t)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,r.P.wrap(this._latestValue)):(t&&this._subscribe(t),this._latestReturnedValue=this._latestValue,this._latestValue)},t.prototype._subscribe=function(t){var e=this;this._obj=t,this._strategy=this._selectStrategy(t),this._subscription=this._strategy.createSubscription(t,function(n){return e._updateLatestValue(t,n)})},t.prototype._selectStrategy=function(e){if(Object(r._11)(e))return kt;if(Object(r._10)(e))return xt;throw st(t,e)},t.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},t.prototype._updateLatestValue=function(t,e){t===this._obj&&(this._latestValue=e,this._ref.markForCheck())},t}(),Ct=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Tt(e))return null;var i=bt(e,r=r||this._locale,g.Decimal,n),o=i.str,a=i.error;if(a)throw st(t,a);return o},t}(),St=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Tt(e))return null;var i=bt(e,r=r||this._locale,g.Percent,n),o=i.str,a=i.error;if(a)throw st(t,a);return o},t}();function Tt(t){return null==t||""===t||t!=t}var Dt=function(){},Ot=new r.p("DocumentToken"),Yt=null;function Pt(){return Yt}var Et,jt={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},At={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},It={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};r._6.Node&&(Et=r._6.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))});var Ht,Rt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),e.prototype.parse=function(t){throw new Error("parse not implemented")},e.makeCurrent=function(){var t;t=new e,Yt||(Yt=t)},e.prototype.hasProperty=function(t,e){return e in t},e.prototype.setProperty=function(t,e,n){t[e]=n},e.prototype.getProperty=function(t,e){return t[e]},e.prototype.invoke=function(t,e,n){var r;(r=t)[e].apply(r,n)},e.prototype.logError=function(t){window.console&&(console.error?console.error(t):console.log(t))},e.prototype.log=function(t){window.console&&window.console.log&&window.console.log(t)},e.prototype.logGroup=function(t){window.console&&window.console.group&&window.console.group(t)},e.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(e.prototype,"attrToPropMap",{get:function(){return jt},enumerable:!0,configurable:!0}),e.prototype.contains=function(t,e){return Et.call(t,e)},e.prototype.querySelector=function(t,e){return t.querySelector(e)},e.prototype.querySelectorAll=function(t,e){return t.querySelectorAll(e)},e.prototype.on=function(t,e,n){t.addEventListener(e,n,!1)},e.prototype.onAndCancel=function(t,e,n){return t.addEventListener(e,n,!1),function(){t.removeEventListener(e,n,!1)}},e.prototype.dispatchEvent=function(t,e){t.dispatchEvent(e)},e.prototype.createMouseEvent=function(t){var e=this.getDefaultDocument().createEvent("MouseEvent");return e.initEvent(t,!0,!0),e},e.prototype.createEvent=function(t){var e=this.getDefaultDocument().createEvent("Event");return e.initEvent(t,!0,!0),e},e.prototype.preventDefault=function(t){t.preventDefault(),t.returnValue=!1},e.prototype.isPrevented=function(t){return t.defaultPrevented||null!=t.returnValue&&!t.returnValue},e.prototype.getInnerHTML=function(t){return t.innerHTML},e.prototype.getTemplateContent=function(t){return"content"in t&&this.isTemplateElement(t)?t.content:null},e.prototype.getOuterHTML=function(t){return t.outerHTML},e.prototype.nodeName=function(t){return t.nodeName},e.prototype.nodeValue=function(t){return t.nodeValue},e.prototype.type=function(t){return t.type},e.prototype.content=function(t){return this.hasProperty(t,"content")?t.content:t},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.nextSibling=function(t){return t.nextSibling},e.prototype.parentElement=function(t){return t.parentNode},e.prototype.childNodes=function(t){return t.childNodes},e.prototype.childNodesAsList=function(t){for(var e=t.childNodes,n=new Array(e.length),r=0;r0},e.prototype.tagName=function(t){return t.tagName},e.prototype.attributeMap=function(t){for(var e=new Map,n=t.attributes,r=0;r0;s||(s=t[a]=[]);var u=be(e)?Zone.root:Zone.current;if(0===s.length)s.push({zone:u,handler:o});else{for(var c=!1,d=0;d-1},e}($t),Se=["alt","control","meta","shift"],Te={alt:function(t){return t.altKey},control:function(t){return t.ctrlKey},meta:function(t){return t.metaKey},shift:function(t){return t.shiftKey}},De=function(t){function e(e){return t.call(this,e)||this}return Object(o.b)(e,t),e.prototype.supports=function(t){return null!=e.parseEventName(t)},e.prototype.addEventListener=function(t,n,r){var i=e.parseEventName(n),o=e.eventCallback(i.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return Pt().onAndCancel(t,i.domEventName,o)})},e.parseEventName=function(t){var n=t.toLowerCase().split("."),r=n.shift();if(0===n.length||"keydown"!==r&&"keyup"!==r)return null;var i=e._normalizeKey(n.pop()),o="";if(Se.forEach(function(t){var e=n.indexOf(t);e>-1&&(n.splice(e,1),o+=t+".")}),o+=i,0!=n.length||0===i.length)return null;var a={};return a.domEventName=r,a.fullKey=o,a},e.getEventFullKey=function(t){var e="",n=Pt().getEventKey(t);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),Se.forEach(function(r){r!=n&&(0,Te[r])(t)&&(e+=r+".")}),e+=n},e.eventCallback=function(t,n,r){return function(i){e.getEventFullKey(i)===t&&r.runGuarded(function(){return n(i)})}},e._normalizeKey=function(t){switch(t){case"esc":return"escape";default:return t}},e}($t),Oe=function(){function t(t,e){this.defaultDoc=t,this.DOM=e;var n=this.DOM.createHtmlDocument();if(this.inertBodyElement=n.body,null==this.inertBodyElement){var r=this.DOM.createElement("html",n);this.inertBodyElement=this.DOM.createElement("body",n),this.DOM.appendChild(r,this.inertBodyElement),this.DOM.appendChild(n,r)}this.DOM.setInnerHTML(this.inertBodyElement,''),!this.inertBodyElement.querySelector||this.inertBodyElement.querySelector("svg")?(this.DOM.setInnerHTML(this.inertBodyElement,'

'),this.getInertBodyElement=this.inertBodyElement.querySelector&&this.inertBodyElement.querySelector("svg img")&&function(){try{return!!window.DOMParser}catch(t){return!1}}()?this.getInertBodyElement_DOMParser:this.getInertBodyElement_InertDocument):this.getInertBodyElement=this.getInertBodyElement_XHR}return t.prototype.getInertBodyElement_XHR=function(t){t=""+t+"";try{t=encodeURI(t)}catch(t){return null}var e=new XMLHttpRequest;e.responseType="document",e.open("GET","data:text/html;charset=utf-8,"+t,!1),e.send(null);var n=e.response.body;return n.removeChild(n.firstChild),n},t.prototype.getInertBodyElement_DOMParser=function(t){t=""+t+"";try{var e=(new window.DOMParser).parseFromString(t,"text/html").body;return e.removeChild(e.firstChild),e}catch(t){return null}},t.prototype.getInertBodyElement_InertDocument=function(t){var e=this.DOM.createElement("template");return"content"in e?(this.DOM.setInnerHTML(e,t),e):(this.DOM.setInnerHTML(this.inertBodyElement,t),this.defaultDoc.documentMode&&this.stripCustomNsAttrs(this.inertBodyElement),this.inertBodyElement)},t.prototype.stripCustomNsAttrs=function(t){var e=this;this.DOM.attributeMap(t).forEach(function(n,r){"xmlns:ns1"!==r&&0!==r.indexOf("ns1:")||e.DOM.removeAttribute(t,r)});for(var n=0,r=this.DOM.childNodesAsList(t);n")):this.sanitizedSomething=!0},t.prototype.endElement=function(t){var e=this.DOM.nodeName(t).toLowerCase();Ve.hasOwnProperty(e)&&!He.hasOwnProperty(e)&&(this.buf.push(""))},t.prototype.chars=function(t){this.buf.push(Ge(t))},t.prototype.checkClobberedElement=function(t,e){if(e&&this.DOM.contains(t,e))throw new Error("Failed to sanitize html because the element is clobbered: "+this.DOM.getOuterHTML(t));return e},t}(),qe=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Je=/([^\#-~ |!])/g;function Ge(t){return t.replace(/&/g,"&").replace(qe,function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"}).replace(Je,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}var Ke=new RegExp("^([-,.\"'%_!# a-zA-Z0-9]+|(?:(?:matrix|translate|scale|rotate|skew|perspective)(?:X|Y|3d)?|(?:rgb|hsl)a?|(?:repeating-)?(?:linear|radial)-gradient|(?:calc|attr))\\([-0-9.%, #a-zA-Z]+\\))$","g"),Xe=/^url\(([^)]+)\)$/,Ze=function(){},Qe=function(t){function e(e){var n=t.call(this)||this;return n._doc=e,n}return Object(o.b)(e,t),e.prototype.sanitize=function(t,e){if(null==e)return null;switch(t){case r.G.NONE:return e;case r.G.HTML:return e instanceof tn?e.changingThisBreaksApplicationSecurity:(this.checkNotSafeValue(e,"HTML"),function(t,e){var n=Pt(),i=null;try{Ie=Ie||new Oe(t,n);var o=e?String(e):"";i=Ie.getInertBodyElement(o);var a=5,s=o;do{if(0===a)throw new Error("Failed to sanitize html because the input is unstable");a--,o=s,s=n.getInnerHTML(i),i=Ie.getInertBodyElement(o)}while(o!==s);var l=new Ue,u=l.sanitizeChildren(n.getTemplateContent(i)||i);return Object(r.U)()&&l.sanitizedSomething&&n.log("WARNING: sanitizing HTML stripped some content (see http://g.co/ng/security#xss)."),u}finally{if(i)for(var c=n.getTemplateContent(i)||i,d=0,h=n.childNodesAsList(c);d0){var r=t.slice(0,e),i=t.slice(e+1).trim();n.set(r,i)}}),n},t.prototype.append=function(t,e){var n=this.getAll(t);null===n?this.set(t,e):n.push(e)},t.prototype.delete=function(t){var e=t.toLowerCase();this._normalizedNames.delete(e),this._headers.delete(e)},t.prototype.forEach=function(t){var e=this;this._headers.forEach(function(n,r){return t(n,e._normalizedNames.get(r),e._headers)})},t.prototype.get=function(t){var e=this.getAll(t);return null===e?null:e.length>0?e[0]:null},t.prototype.has=function(t){return this._headers.has(t.toLowerCase())},t.prototype.keys=function(){return Array.from(this._normalizedNames.values())},t.prototype.set=function(t,e){Array.isArray(e)?e.length&&this._headers.set(t.toLowerCase(),[e.join(",")]):this._headers.set(t.toLowerCase(),[e]),this.mayBeSetNormalizedName(t)},t.prototype.values=function(){return Array.from(this._headers.values())},t.prototype.toJSON=function(){var t=this,e={};return this._headers.forEach(function(n,r){var i=[];n.forEach(function(t){return i.push.apply(i,t.split(","))}),e[t._normalizedNames.get(r)]=i}),e},t.prototype.getAll=function(t){return this.has(t)&&this._headers.get(t.toLowerCase())||null},t.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},t.prototype.mayBeSetNormalizedName=function(t){var e=t.toLowerCase();this._normalizedNames.has(e)||this._normalizedNames.set(e,t)},t}(),mn=function(){function t(t){void 0===t&&(t={});var e=t.body,n=t.status,r=t.headers,i=t.statusText,o=t.type,a=t.url;this.body=null!=e?e:null,this.status=null!=n?n:null,this.headers=null!=r?r:null,this.statusText=null!=i?i:null,this.type=null!=o?o:null,this.url=null!=a?a:null}return t.prototype.merge=function(e){return new t({body:e&&null!=e.body?e.body:this.body,status:e&&null!=e.status?e.status:this.status,headers:e&&null!=e.headers?e.headers:this.headers,statusText:e&&null!=e.statusText?e.statusText:this.statusText,type:e&&null!=e.type?e.type:this.type,url:e&&null!=e.url?e.url:this.url})},t}(),gn=function(t){function e(){return t.call(this,{status:200,statusText:"Ok",type:hn.Default,headers:new _n})||this}return Object(o.b)(e,t),e}(mn),yn=function(){};function vn(t){if("string"!=typeof t)return t;switch(t.toUpperCase()){case"GET":return dn.Get;case"POST":return dn.Post;case"PUT":return dn.Put;case"DELETE":return dn.Delete;case"OPTIONS":return dn.Options;case"HEAD":return dn.Head;case"PATCH":return dn.Patch}throw new Error('Invalid request method. The method "'+t+'" is not supported.')}var bn=function(t){return t>=200&&t<300},wn=function(){function t(){}return t.prototype.encodeKey=function(t){return Mn(t)},t.prototype.encodeValue=function(t){return Mn(t)},t}();function Mn(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var kn=function(){function t(t,e){void 0===t&&(t=""),void 0===e&&(e=new wn),this.rawParams=t,this.queryEncoder=e,this.paramsMap=function(t){void 0===t&&(t="");var e=new Map;return t.length>0&&t.split("&").forEach(function(t){var n=t.indexOf("="),r=-1==n?[t,""]:[t.slice(0,n),t.slice(n+1)],i=r[0],o=r[1],a=e.get(i)||[];a.push(o),e.set(i,a)}),e}(t)}return t.prototype.clone=function(){var e=new t("",this.queryEncoder);return e.appendAll(this),e},t.prototype.has=function(t){return this.paramsMap.has(t)},t.prototype.get=function(t){var e=this.paramsMap.get(t);return Array.isArray(e)?e[0]:null},t.prototype.getAll=function(t){return this.paramsMap.get(t)||[]},t.prototype.set=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.length=0,n.push(e),this.paramsMap.set(t,n)}else this.delete(t)},t.prototype.setAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){var r=e.paramsMap.get(n)||[];r.length=0,r.push(t[0]),e.paramsMap.set(n,r)})},t.prototype.append=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.push(e),this.paramsMap.set(t,n)}},t.prototype.appendAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){for(var r=e.paramsMap.get(n)||[],i=0;i=200&&n.status<=299,n.statusText=e.statusText,n.headers=e.headers,n.type=e.type,n.url=e.url,n}return Object(o.b)(e,t),e.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},e}(xn),Cn=/^\)\]\}',?\n/,Sn=function(){function t(t,e,n){var r=this;this.request=t,this.response=new a.a(function(i){var o=e.build();o.open(dn[t.method].toUpperCase(),t.url),null!=t.withCredentials&&(o.withCredentials=t.withCredentials);var a=function(){var e=1223===o.status?204:o.status,r=null;204!==e&&"string"==typeof(r="undefined"==typeof o.response?o.responseText:o.response)&&(r=r.replace(Cn,"")),0===e&&(e=r?200:0);var a,s=_n.fromResponseHeaderString(o.getAllResponseHeaders()),l=("responseURL"in(a=o)?a.responseURL:/^X-Request-URL:/m.test(a.getAllResponseHeaders())?a.getResponseHeader("X-Request-URL"):null)||t.url,u=new mn({body:r,status:e,headers:s,statusText:o.statusText||"OK",url:l});null!=n&&(u=n.merge(u));var c=new Ln(u);if(c.ok=bn(e),c.ok)return i.next(c),void i.complete();i.error(c)},s=function(t){var e=new mn({body:t,type:hn.Error,status:o.status,statusText:o.statusText});null!=n&&(e=n.merge(e)),i.error(new Ln(e))};if(r.setDetectedContentType(t,o),null==t.headers&&(t.headers=new _n),t.headers.has("Accept")||t.headers.append("Accept","application/json, text/plain, */*"),t.headers.forEach(function(t,e){return o.setRequestHeader(e,t.join(","))}),null!=t.responseType&&null!=o.responseType)switch(t.responseType){case fn.ArrayBuffer:o.responseType="arraybuffer";break;case fn.Json:o.responseType="json";break;case fn.Text:o.responseType="text";break;case fn.Blob:o.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return o.addEventListener("load",a),o.addEventListener("error",s),o.send(r.request.getBody()),function(){o.removeEventListener("load",a),o.removeEventListener("error",s),o.abort()}})}return t.prototype.setDetectedContentType=function(t,e){if(null==t.headers||null==t.headers.get("Content-Type"))switch(t.contentType){case pn.NONE:break;case pn.JSON:e.setRequestHeader("content-type","application/json");break;case pn.FORM:e.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case pn.TEXT:e.setRequestHeader("content-type","text/plain");break;case pn.BLOB:var n=t.blob();n.type&&e.setRequestHeader("content-type",n.type)}},t}(),Tn=function(){function t(t,e){void 0===t&&(t="XSRF-TOKEN"),void 0===e&&(e="X-XSRF-TOKEN"),this._cookieName=t,this._headerName=e}return t.prototype.configureRequest=function(t){var e=Pt().getCookie(this._cookieName);e&&t.headers.set(this._headerName,e)},t}(),Dn=function(){function t(t,e,n){this._browserXHR=t,this._baseResponseOptions=e,this._xsrfStrategy=n}return t.prototype.createConnection=function(t){return this._xsrfStrategy.configureRequest(t),new Sn(t,this._browserXHR,this._baseResponseOptions)},t}(),On=function(){function t(t){void 0===t&&(t={});var e=t.method,n=t.headers,r=t.body,i=t.url,o=t.search,a=t.params,s=t.withCredentials,l=t.responseType;this.method=null!=e?vn(e):null,this.headers=null!=n?n:null,this.body=null!=r?r:null,this.url=null!=i?i:null,this.params=this._mergeSearchParams(a||o),this.withCredentials=null!=s?s:null,this.responseType=null!=l?l:null}return Object.defineProperty(t.prototype,"search",{get:function(){return this.params},set:function(t){this.params=t},enumerable:!0,configurable:!0}),t.prototype.merge=function(e){return new t({method:e&&null!=e.method?e.method:this.method,headers:e&&null!=e.headers?e.headers:new _n(this.headers),body:e&&null!=e.body?e.body:this.body,url:e&&null!=e.url?e.url:this.url,params:e&&this._mergeSearchParams(e.params||e.search),withCredentials:e&&null!=e.withCredentials?e.withCredentials:this.withCredentials,responseType:e&&null!=e.responseType?e.responseType:this.responseType})},t.prototype._mergeSearchParams=function(t){return t?t instanceof kn?t.clone():"string"==typeof t?new kn(t):this._parseParams(t):this.params},t.prototype._parseParams=function(t){var e=this;void 0===t&&(t={});var n=new kn;return Object.keys(t).forEach(function(r){var i=t[r];Array.isArray(i)?i.forEach(function(t){return e._appendParam(r,t,n)}):e._appendParam(r,i,n)}),n},t.prototype._appendParam=function(t,e,n){"string"!=typeof e&&(e=JSON.stringify(e)),n.append(t,e)},t}(),Yn=function(t){function e(){return t.call(this,{method:dn.Get,headers:new _n})||this}return Object(o.b)(e,t),e}(On),Pn=function(t){function e(e){var n=t.call(this)||this,r=e.url;n.url=e.url;var i,o=e.params||e.search;if(o&&(i="object"!=typeof o||o instanceof kn?o.toString():function(t){var e=new kn;return Object.keys(t).forEach(function(n){var r=t[n];r&&Array.isArray(r)?r.forEach(function(t){return e.append(n,t.toString())}):e.append(n,r.toString())}),e}(o).toString()).length>0){var a="?";-1!=n.url.indexOf("?")&&(a="&"==n.url[n.url.length-1]?"":"&"),n.url=r+a+i}return n._body=e.body,n.method=vn(e.method),n.headers=new _n(e.headers),n.contentType=n.detectContentType(),n.withCredentials=e.withCredentials,n.responseType=e.responseType,n}return Object(o.b)(e,t),e.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return pn.JSON;case"application/x-www-form-urlencoded":return pn.FORM;case"multipart/form-data":return pn.FORM_DATA;case"text/plain":case"text/html":return pn.TEXT;case"application/octet-stream":return this._body instanceof Hn?pn.ARRAY_BUFFER:pn.BLOB;default:return this.detectContentTypeFromBody()}},e.prototype.detectContentTypeFromBody=function(){return null==this._body?pn.NONE:this._body instanceof kn?pn.FORM:this._body instanceof An?pn.FORM_DATA:this._body instanceof In?pn.BLOB:this._body instanceof Hn?pn.ARRAY_BUFFER:this._body&&"object"==typeof this._body?pn.JSON:pn.TEXT},e.prototype.getBody=function(){switch(this.contentType){case pn.JSON:case pn.FORM:return this.text();case pn.FORM_DATA:return this._body;case pn.TEXT:return this.text();case pn.BLOB:return this.blob();case pn.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},e}(xn),En=function(){},jn="object"==typeof window?window:En,An=jn.FormData||En,In=jn.Blob||En,Hn=jn.ArrayBuffer||En;function Rn(t,e){return t.createConnection(e).response}function Nn(t,e,n,r){return t.merge(new On(e?{method:e.method||n,url:e.url||r,search:e.search,params:e.params,headers:e.headers,body:e.body,withCredentials:e.withCredentials,responseType:e.responseType}:{method:n,url:r}))}var Fn=function(){function t(t,e){this._backend=t,this._defaultOptions=e}return t.prototype.request=function(t,e){var n;if("string"==typeof t)n=Rn(this._backend,new Pn(Nn(this._defaultOptions,e,dn.Get,t)));else{if(!(t instanceof Pn))throw new Error("First argument must be a url string or Request instance.");n=Rn(this._backend,t)}return n},t.prototype.get=function(t,e){return this.request(new Pn(Nn(this._defaultOptions,e,dn.Get,t)))},t.prototype.post=function(t,e,n){return this.request(new Pn(Nn(this._defaultOptions.merge(new On({body:e})),n,dn.Post,t)))},t.prototype.put=function(t,e,n){return this.request(new Pn(Nn(this._defaultOptions.merge(new On({body:e})),n,dn.Put,t)))},t.prototype.delete=function(t,e){return this.request(new Pn(Nn(this._defaultOptions,e,dn.Delete,t)))},t.prototype.patch=function(t,e,n){return this.request(new Pn(Nn(this._defaultOptions.merge(new On({body:e})),n,dn.Patch,t)))},t.prototype.head=function(t,e){return this.request(new Pn(Nn(this._defaultOptions,e,dn.Head,t)))},t.prototype.options=function(t,e){return this.request(new Pn(Nn(this._defaultOptions,e,dn.Options,t)))},t}();function Vn(){return new Tn}function zn(t,e){return new Fn(t,e)}var Wn=function(){},Bn=function(t){function e(e,n){t.call(this),this.error=e,this.scheduler=n}return Object(o.b)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){t.subscriber.error(t.error)},e.prototype._subscribe=function(t){var n=this.error,r=this.scheduler;if(t.syncErrorThrowable=!0,r)return r.schedule(e.dispatch,0,{error:n,subscriber:t});t.error(n)},e}(a.a).create;a.a.throw=Bn;var Un=n("tZ2B"),qn=n("PIsA");function Jn(t){return function(e){var n=new Gn(t),r=e.lift(n);return n.caught=r}}var Gn=function(){function t(t){this.selector=t}return t.prototype.call=function(t,e){return e.subscribe(new Kn(t,this.selector,this.caught))},t}(),Kn=function(t){function e(e,n,r){t.call(this,e),this.selector=n,this.caught=r}return Object(o.b)(e,t),e.prototype.error=function(e){if(!this.isStopped){var n=void 0;try{n=this.selector(e,this.caught)}catch(e){return void t.prototype.error.call(this,e)}this._unsubscribeAndRecycle(),this.add(Object(qn.a)(this,n))}},e}(Un.a);function Xn(t){return Jn(t)(this)}a.a.prototype.catch=Xn,a.a.prototype._catch=Xn;var Zn=n("OVmG");function Qn(t,e){return function(n){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new $n(t,e))}}var $n=function(){function t(t,e){this.project=t,this.thisArg=e}return t.prototype.call=function(t,e){return e.subscribe(new tr(t,this.project,this.thisArg))},t}(),tr=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.count=0,this.thisArg=r||this}return Object(o.b)(e,t),e.prototype._next=function(t){var e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(Zn.a);function er(t,e){return Qn(t,e)(this)}a.a.prototype.map=er;var nr=function(){function t(t){this.http=t,this.url=i.nodeUrl}return t.prototype.getExplorerAddress=function(t){return this.get("explorer/address",{address:t.address}).map(function(t){return t.map(function(t){return{addresses:[],balance:0,block:t.status.block_seq,confirmed:t.status.confirmed,timestamp:t.timestamp,txid:t.txid,inputs:t.inputs,outputs:t.outputs}})})},t.prototype.getVersion=function(){return this.get("version")},t.prototype.getWalletNewSeed=function(t){return void 0===t&&(t=128),this.get("wallet/newSeed",{entropy:t}).map(function(t){return t.seed})},t.prototype.getWallets=function(){return this.get("wallets").map(function(t){var e=[];return t.forEach(function(t){e.push({label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted})}),e})},t.prototype.getWalletSeed=function(t,e){return this.post("wallet/seed",{id:t.filename,password:e}).map(function(t){return t.seed})},t.prototype.postWalletCreate=function(t,e,n,r){var i={label:t,seed:e,scan:n};return r&&(i.password=r,i.encrypt=!0),this.post("wallet/create",i).map(function(t){return{label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted}})},t.prototype.postWalletNewAddress=function(t,e){return this.post("wallet/newAddress",{id:t.filename,password:e}).map(function(t){return{address:t.addresses[0],coins:null,hours:null}})},t.prototype.postWalletToggleEncryption=function(t,e){return this.post("wallet/"+(t.encrypted?"decrypt":"encrypt"),{id:t.filename,password:e})},t.prototype.get=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n={}),this.http.get(this.getUrl(t,e),this.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return a.a.throw(t||"Server error")})},t.prototype.getCsrf=function(){return this.get("csrf").map(function(t){return t.csrf_token})},t.prototype.post=function(t,e,n){var r=this;return void 0===e&&(e={}),void 0===n&&(n={}),this.getCsrf().first().flatMap(function(i){return n.csrf=i,r.http.post(r.getUrl(t),n.json?JSON.stringify(e):r.getQueryString(e),r.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return a.a.throw(t||"Server error")})})},t.prototype.returnRequestOptions=function(t){var e=new On;return e.headers=this.getHeaders(t),t.csrf&&e.headers.append("X-CSRF-Token",t.csrf),e},t.prototype.getHeaders=function(t){var e=new _n;return e.append("Content-Type",t.json?"application/json":"application/x-www-form-urlencoded"),e},t.prototype.getQueryString=function(t){return void 0===t&&(t=null),t?Object.keys(t).reduce(function(e,n){return e.push(n+"="+encodeURIComponent(t[n])),e},[]).join("&"):""},t.prototype.getUrl=function(t,e){return void 0===e&&(e=null),this.url+t+"?"+this.getQueryString(e)},t}(),rr=n("+3/4"),ir=n("BX3T"),or=function(t){function e(e,n){t.call(this),this.sources=e,this.resultSelector=n}return Object(o.b)(e,t),e.create=function(){for(var t=[],n=0;n=0}a.a.prototype.mergeMap=kr,a.a.prototype.flatMap=kr;var Lr=n("AMGY"),Cr=n("VwZZ"),Sr=function(t){function e(e,n){t.call(this,e,n),this.scheduler=e,this.work=n,this.pending=!1}return Object(o.b)(e,t),e.prototype.schedule=function(t,e){if(void 0===e&&(e=0),this.closed)return this;this.state=t,this.pending=!0;var n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this},e.prototype.requestAsyncId=function(t,e,n){return void 0===n&&(n=0),Lr.a.setInterval(t.flush.bind(t,this),n)},e.prototype.recycleAsyncId=function(t,e,n){if(void 0===n&&(n=0),null!==n&&this.delay===n&&!1===this.pending)return e;Lr.a.clearInterval(e)},e.prototype.execute=function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},e.prototype._execute=function(t,e){var n=!1,r=void 0;try{this.work(t)}catch(t){n=!0,r=!!t&&t||new Error(t)}if(n)return this.unsubscribe(),r},e.prototype._unsubscribe=function(){var t=this.id,e=this.scheduler,n=e.actions,r=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==r&&n.splice(r,1),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null},e}(function(t){function e(e,n){t.call(this)}return Object(o.b)(e,t),e.prototype.schedule=function(t,e){return void 0===e&&(e=0),this},e}(Cr.a)),Tr=function(t){function e(){t.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(o.b)(e,t),e.prototype.flush=function(t){var e=this.actions;if(this.active)e.push(t);else{var n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}},e}(function(){function t(e,n){void 0===n&&(n=t.now),this.SchedulerAction=e,this.now=n}return t.prototype.schedule=function(t,e,n){return void 0===e&&(e=0),new this.SchedulerAction(this,t).schedule(n,e)},t.now=Date.now?Date.now:function(){return+new Date},t}()),Dr=new Tr(Sr),Or=n("1Q68");function Yr(t){return t instanceof Date&&!isNaN(+t)}var Pr=function(t){function e(e,n,r){void 0===e&&(e=0),t.call(this),this.period=-1,this.dueTime=0,xr(n)?this.period=Number(n)<1?1:Number(n):Object(Or.a)(n)&&(r=n),Object(Or.a)(r)||(r=Dr),this.scheduler=r,this.dueTime=Yr(e)?+e-this.scheduler.now():e}return Object(o.b)(e,t),e.create=function(t,n,r){return void 0===t&&(t=0),new e(t,n,r)},e.dispatch=function(t){var e=t.index,n=t.period,r=t.subscriber;if(r.next(e),!r.closed){if(-1===n)return r.complete();t.index=e+1,this.schedule(t,n)}},e.prototype._subscribe=function(t){return this.scheduler.schedule(e.dispatch,this.dueTime,{index:0,period:this.period,subscriber:t})},e}(a.a).create;a.a.timer=Pr;var Er=n("etqZ"),jr=function(){function t(t){this.project=t}return t.prototype.call=function(t,e){return e.subscribe(new Ar(t,this.project))},t}(),Ar=function(t){function e(e,n,r){void 0===r&&(r=Object.create(null)),t.call(this,e),this.iterators=[],this.active=0,this.project="function"==typeof n?n:null,this.values=r}return Object(o.b)(e,t),e.prototype._next=function(t){var e=this.iterators;Object(ir.a)(t)?e.push(new Hr(t)):e.push("function"==typeof t[Er.a]?new Ir(t[Er.a]()):new Rr(this.destination,this,t))},e.prototype._complete=function(){var t=this.iterators,e=t.length;if(0!==e){this.active=e;for(var n=0;nthis.index},t.prototype.hasCompleted=function(){return this.array.length===this.index},t}(),Rr=function(t){function e(e,n,r){t.call(this,e),this.parent=n,this.observable=r,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(o.b)(e,t),e.prototype[Er.a]=function(){return this},e.prototype.next=function(){var t=this.buffer;return 0===t.length&&this.isComplete?{value:null,done:!0}:{value:t.shift(),done:!1}},e.prototype.hasValue=function(){return this.buffer.length>0},e.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},e.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},e.prototype.notifyNext=function(t,e,n,r,i){this.buffer.push(e),this.parent.checkIterators()},e.prototype.subscribe=function(t,e){return Object(qn.a)(this,this.observable,this,e)},e}(Un.a);a.a.zip=function(){for(var t=[],e=0;e0?t.prototype.schedule.call(this,e,n):(this.delay=n,this.state=e,this.scheduler.flush(this),this)},e.prototype.execute=function(e,n){return n>0||this.closed?t.prototype.execute.call(this,e,n):this._execute(e,n)},e.prototype.requestAsyncId=function(e,n,r){return void 0===r&&(r=0),null!==r&&r>0||null===r&&this.delay>0?t.prototype.requestAsyncId.call(this,e,n,r):e.flush(this)},e}(Sr),zr=new(function(t){function e(){t.apply(this,arguments)}return Object(o.b)(e,t),e}(Tr))(Vr),Wr=function(){function t(t,e,n){this.kind=t,this.value=e,this.error=n,this.hasValue="N"===t}return t.prototype.observe=function(t){switch(this.kind){case"N":return t.next&&t.next(this.value);case"E":return t.error&&t.error(this.error);case"C":return t.complete&&t.complete()}},t.prototype.do=function(t,e,n){switch(this.kind){case"N":return t&&t(this.value);case"E":return e&&e(this.error);case"C":return n&&n()}},t.prototype.accept=function(t,e,n){return t&&"function"==typeof t.next?this.observe(t):this.do(t,e,n)},t.prototype.toObservable=function(){switch(this.kind){case"N":return a.a.of(this.value);case"E":return a.a.throw(this.error);case"C":return a.a.empty()}throw new Error("unexpected notification kind value")},t.createNext=function(e){return"undefined"!=typeof e?new t("N",e):t.undefinedValueNotification},t.createError=function(e){return new t("E",void 0,e)},t.createComplete=function(){return t.completeNotification},t.completeNotification=new t("C"),t.undefinedValueNotification=new t("N",void 0),t}(),Br=function(t){function e(e,n,r){void 0===r&&(r=0),t.call(this,e),this.scheduler=n,this.delay=r}return Object(o.b)(e,t),e.dispatch=function(t){t.notification.observe(t.destination),this.unsubscribe()},e.prototype.scheduleMessage=function(t){this.add(this.scheduler.schedule(e.dispatch,this.delay,new Ur(t,this.destination)))},e.prototype._next=function(t){this.scheduleMessage(Wr.createNext(t))},e.prototype._error=function(t){this.scheduleMessage(Wr.createError(t))},e.prototype._complete=function(){this.scheduleMessage(Wr.createComplete())},e}(Zn.a),Ur=function(t,e){this.notification=t,this.destination=e},qr=n("x6VL"),Jr=n("1Bqh"),Gr=function(t){function e(e,n,r){void 0===e&&(e=Number.POSITIVE_INFINITY),void 0===n&&(n=Number.POSITIVE_INFINITY),t.call(this),this.scheduler=r,this._events=[],this._bufferSize=e<1?1:e,this._windowTime=n<1?1:n}return Object(o.b)(e,t),e.prototype.next=function(e){var n=this._getNow();this._events.push(new Kr(n,e)),this._trimBufferThenGetEvents(),t.prototype.next.call(this,e)},e.prototype._subscribe=function(t){var e,n=this._trimBufferThenGetEvents(),r=this.scheduler;if(this.closed)throw new qr.a;this.hasError?e=Cr.a.EMPTY:this.isStopped?e=Cr.a.EMPTY:(this.observers.push(t),e=new Jr.a(this,t)),r&&t.add(t=new Br(t,r));for(var i=n.length,o=0;oe&&(o=Math.max(o,i-e)),o>0&&r.splice(0,o),r},e}(Fr.a),Kr=function(t,e){this.time=t,this.value=e},Xr=function(){function t(t){this.apiService=t,this.wallets=new Gr,this.pendingTxs=new Gr,this.loadData(),this.startDataRefreshSubscription()}return t.prototype.addressesAsString=function(){return this.allAddresses().map(function(t){return t.map(function(t){return t.address})}).map(function(t){return t.join(",")})},t.prototype.addAddress=function(t,e){var n=this;return this.apiService.postWalletNewAddress(t,e).do(function(e){t.addresses.push(e),n.refreshBalances()})},t.prototype.all=function(){return this.wallets.asObservable()},t.prototype.allAddresses=function(){return this.all().map(function(t){return t.reduce(function(t,e){return t.concat(e.addresses)},[])})},t.prototype.create=function(t,e,n,r){var i=this;return e=e.replace(/\r?\n|\r/g," ").replace(/ +/g," ").trim(),this.apiService.postWalletCreate(t||"undefined",e,n||100,r).do(function(t){console.log(t),i.wallets.first().subscribe(function(e){e.push(t),i.wallets.next(e),i.refreshBalances()})})},t.prototype.find=function(t){return this.all().map(function(e){return e.find(function(e){return e.filename===t})})},t.prototype.folder=function(){return this.apiService.get("wallets/folderName").map(function(t){return t.address})},t.prototype.generateSeed=function(t){return void 0===t&&(t=128),this.apiService.getWalletNewSeed(t)},t.prototype.outputs=function(){var t=this;return this.addressesAsString().filter(function(t){return!!t}).flatMap(function(e){return t.apiService.get("outputs",{addrs:e})})},t.prototype.outputsWithWallets=function(){return a.a.zip(this.all(),this.outputs(),function(t,e){return(t=JSON.parse(JSON.stringify(t)))?t.map(function(t){return t.addresses=t.addresses.map(function(t){return t.outputs=e.head_outputs.filter(function(e){return e.address===t.address}),t}),t}):[]})},t.prototype.allPendingTransactions=function(){return this.apiService.get("pendingTxs")},t.prototype.pendingTransactions=function(){return this.pendingTxs.asObservable()},t.prototype.refreshBalances=function(){var t=this;this.wallets.first().subscribe(function(e){a.a.forkJoin(e.map(function(e){return t.retrieveWalletBalance(e).map(function(t){return e.addresses=t,e.coins=t.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+e},0),e.hours=t.map(function(t){return t.hours>=0?t.hours:0}).reduce(function(t,e){return t+e},0),e})})).subscribe(function(e){return t.wallets.next(e)})})},t.prototype.renameWallet=function(t,e){var n=this;return this.apiService.post("wallet/update",{id:t.filename,label:e}).do(function(){t.label=e,n.updateWallet(t)})},t.prototype.toggleEncryption=function(t,e){var n=this;return this.apiService.postWalletToggleEncryption(t,e).do(function(e){t.encrypted=e.meta.encrypted,n.updateWallet(e)})},t.prototype.getWalletSeed=function(t,e){return this.apiService.getWalletSeed(t,e)},t.prototype.createTransaction=function(t,e,n,r){return this.apiService.post("wallet/transaction",{hours_selection:{type:"auto",mode:"share",share_factor:"0.5"},change_address:t.addresses[0].address,wallet:{id:t.filename,password:r},to:[{address:e,coins:n}]},{json:!0})},t.prototype.injectTransaction=function(t){return this.apiService.post("injectTransaction",{rawtx:t},{json:!0})},t.prototype.sum=function(){return this.all().map(function(t){return t.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+e},0)})},t.prototype.transaction=function(t){var e=this;return this.apiService.get("transaction",{txid:t}).flatMap(function(t){return t.txn.inputs&&!t.txn.inputs.length?a.a.of(t):a.a.forkJoin(t.txn.inputs.map(function(t){return e.retrieveInputAddress(t).map(function(t){return t.owner_address})})).map(function(e){return t.txn.inputs=e,t})})},t.prototype.transactions=function(){var t=this;return this.allAddresses().filter(function(t){return!!t.length}).first().flatMap(function(e){return t.addresses=e,a.a.forkJoin(e.map(function(e){return t.apiService.getExplorerAddress(e)}))}).map(function(t){return[].concat.apply([],t).sort(function(t,e){return e.timestamp-t.timestamp})}).map(function(t){return t.reduce(function(t,e){return t.find(function(t){return t.txid===e.txid})||t.push(e),t},[])}).map(function(e){return e.map(function(e){var n=!!t.addresses.find(function(t){return e.inputs[0].owner===t.address});return e.outputs.forEach(function(r){return n&&!t.addresses.find(function(t){return r.dst===t.address})&&(e.addresses.push(r.dst),e.balance=e.balance-parseFloat(r.coins)),!n&&t.addresses.find(function(t){return r.dst===t.address})&&(e.addresses.push(r.dst),e.balance=e.balance+parseFloat(r.coins)),e}),e})})},t.prototype.startDataRefreshSubscription=function(){var t=this;this.dataRefreshSubscription&&this.dataRefreshSubscription.unsubscribe(),this.dataRefreshSubscription=a.a.timer(0,1e4).subscribe(function(){t.refreshBalances(),t.refreshPendingTransactions()})},t.prototype.loadData=function(){var t=this;this.apiService.getWallets().first().subscribe(function(e){return t.wallets.next(e)})},t.prototype.retrieveAddressBalance=function(t){var e=Array.isArray(t)?t.map(function(t){return t.address}).join(","):t.address;return this.apiService.get("balance",{addrs:e})},t.prototype.retrieveInputAddress=function(t){return this.apiService.get("uxout",{uxid:t})},t.prototype.retrieveWalletBalance=function(t){var e=this;return a.a.forkJoin(t.addresses.map(function(t){return e.retrieveAddressBalance(t).map(function(e){return t.coins=e.confirmed.coins/1e6,t.hours=e.confirmed.hours,t})}))},t.prototype.updateWallet=function(t){var e=this;this.wallets.first().subscribe(function(n){n[n.findIndex(function(e){return e.filename===t.filename})]=t,e.wallets.next(n)})},t.prototype.refreshPendingTransactions=function(){var t=this;this.wallets.first().subscribe(function(e){a.a.forkJoin(e.map(function(e){return t.apiService.get("wallet/transactions",{id:e.filename})})).subscribe(function(e){t.pendingTxs.next([].concat.apply([],e.filter(function(t){return t.transactions.length>0}).map(function(t){return t.transactions})).reduce(function(t,e){return t.find(function(t){return t.transaction.txid===e.transaction.txid})||t.push(e),t},[]))})})},t}(),Zr="undefined"!=typeof Intl&&Intl.v8BreakIterator,Qr=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!Zr)&&"undefined"!=typeof CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function $r(){if(null==Nr&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return Nr=!0}}))}finally{Nr=Nr||!1}return Nr}var ti=function(){},ei=n("GK6M"),ni=n("/iUD"),ri=n("fKB6"),ii=Object.prototype.toString,oi=function(t){function e(e,n,r,i){t.call(this),this.sourceObj=e,this.eventName=n,this.selector=r,this.options=i}return Object(o.b)(e,t),e.create=function(t,n,r,i){return Object(ni.a)(r)&&(i=r,r=void 0),new e(t,n,i,r)},e.setupSubscription=function(t,n,r,i,o){var a;if(function(t){return!!t&&"[object NodeList]"===ii.call(t)}(t)||function(t){return!!t&&"[object HTMLCollection]"===ii.call(t)}(t))for(var s=0,l=t.length;s0?e._scrolled.pipe(li(t)).subscribe(n):e._scrolled.subscribe(n);return e._scrolledCount++,function(){r.unsubscribe(),e._scrolledCount--,e._scrolledCount||e._removeGlobalListener()}}):ur()},t.prototype.ngOnDestroy=function(){var t=this;this._removeGlobalListener(),this.scrollContainers.forEach(function(e,n){return t.deregister(n)})},t.prototype.ancestorScrolled=function(t,e){var n=this.getAncestorScrollContainers(t);return this.scrolled(e).pipe(fr(function(t){return!t||n.indexOf(t)>-1}))},t.prototype.getAncestorScrollContainers=function(t){var e=this,n=[];return this.scrollContainers.forEach(function(r,i){e._scrollableContainsElement(i,t)&&n.push(i)}),n},t.prototype._scrollableContainsElement=function(t,e){var n=e.nativeElement,r=t.getElementRef().nativeElement;do{if(n==r)return!0}while(n=n.parentElement);return!1},t.prototype._addGlobalListener=function(){var t=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return oi(window.document,"scroll").subscribe(function(){return t._scrolled.next()})})},t.prototype._removeGlobalListener=function(){this._globalSubscription&&(this._globalSubscription.unsubscribe(),this._globalSubscription=null)},t}();function di(t,e,n){return t||new ci(e,n)}var hi=function(){function t(t,e){var n=this;this._platform=t,this._change=t.isBrowser?e.runOutsideAngular(function(){return Object(ui.a)(oi(window,"resize"),oi(window,"orientationchange"))}):ur(),this._invalidateCache=this.change().subscribe(function(){return n._updateViewportSize()})}return t.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},t.prototype.getViewportSize=function(){this._viewportSize||this._updateViewportSize();var t={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),t},t.prototype.getViewportRect=function(){var t=this.getViewportScrollPosition(),e=this.getViewportSize(),n=e.width,r=e.height;return{top:t.top,left:t.left,bottom:t.top+r,right:t.left+n,height:r,width:n}},t.prototype.getViewportScrollPosition=function(){if(!this._platform.isBrowser)return{top:0,left:0};var t=document.documentElement.getBoundingClientRect();return{top:-t.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-t.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},t.prototype.change=function(t){return void 0===t&&(t=20),t>0?this._change.pipe(li(t)):this._change},t.prototype._updateViewportSize=function(){this._viewportSize=this._platform.isBrowser?{width:window.innerWidth,height:window.innerHeight}:{width:0,height:0}},t}();function pi(t,e,n){return t||new hi(e,n)}var fi=function(){},_i=new r.p("cdk-dir-doc"),mi=function(){return function(t){this.value="ltr",this.change=new r.n,t&&(this.value=(t.body?t.body.dir:null)||(t.documentElement?t.documentElement.dir:null)||"ltr")}}(),gi=function(){};function yi(){throw Error("Host already has a portal attached")}var vi=function(){function t(){}return t.prototype.attach=function(t){return null==t&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),t.hasAttached()&&yi(),this._attachedHost=t,t.attach(this)},t.prototype.detach=function(){var t=this._attachedHost;null==t?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,t.detach())},Object.defineProperty(t.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),t.prototype.setAttachedHost=function(t){this._attachedHost=t},t}(),bi=function(t){function e(e,n,r){var i=t.call(this)||this;return i.component=e,i.viewContainerRef=n,i.injector=r,i}return Object(o.b)(e,t),e}(vi),wi=function(t){function e(e,n,r){var i=t.call(this)||this;return i.templateRef=e,i.viewContainerRef=n,i.context=r,i}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),e.prototype.attach=function(e,n){return void 0===n&&(n=this.context),this.context=n,t.prototype.attach.call(this,e)},e.prototype.detach=function(){return this.context=void 0,t.prototype.detach.call(this)},e}(vi),Mi=function(){function t(){this._isDisposed=!1}return t.prototype.hasAttached=function(){return!!this._attachedPortal},t.prototype.attach=function(t){return t||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&yi(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),t instanceof bi?(this._attachedPortal=t,this.attachComponentPortal(t)):t instanceof wi?(this._attachedPortal=t,this.attachTemplatePortal(t)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},t.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},t.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},t.prototype.setDisposeFn=function(t){this._disposeFn=t},t.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},t}(),ki=function(t){function e(e,n,r,i){var o=t.call(this)||this;return o.outletElement=e,o._componentFactoryResolver=n,o._appRef=r,o._defaultInjector=i,o}return Object(o.b)(e,t),e.prototype.attachComponentPortal=function(t){var e,n=this,r=this._componentFactoryResolver.resolveComponentFactory(t.component);return t.viewContainerRef?(e=t.viewContainerRef.createComponent(r,t.viewContainerRef.length,t.injector||t.viewContainerRef.parentInjector),this.setDisposeFn(function(){return e.destroy()})):(e=r.create(t.injector||this._defaultInjector),this._appRef.attachView(e.hostView),this.setDisposeFn(function(){n._appRef.detachView(e.hostView),e.destroy()})),this.outletElement.appendChild(this._getComponentRootNode(e)),e},e.prototype.attachTemplatePortal=function(t){var e=this,n=t.viewContainerRef,r=n.createEmbeddedView(t.templateRef,t.context);return r.detectChanges(),r.rootNodes.forEach(function(t){return e.outletElement.appendChild(t)}),this.setDisposeFn(function(){var t=n.indexOf(r);-1!==t&&n.remove(t)}),r},e.prototype.dispose=function(){t.prototype.dispose.call(this),null!=this.outletElement.parentNode&&this.outletElement.parentNode.removeChild(this.outletElement)},e.prototype._getComponentRootNode=function(t){return t.hostView.rootNodes[0]},e}(Mi),xi=function(t){function e(e,n){var i=t.call(this)||this;return i._componentFactoryResolver=e,i._viewContainerRef=n,i._isInitialized=!1,i.attached=new r.n,i}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"portal",{get:function(){return this._attachedPortal},set:function(e){(!this.hasAttached()||e||this._isInitialized)&&(this.hasAttached()&&t.prototype.detach.call(this),e&&t.prototype.attach.call(this,e),this._attachedPortal=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"attachedRef",{get:function(){return this._attachedRef},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._isInitialized=!0},e.prototype.ngOnDestroy=function(){t.prototype.dispose.call(this),this._attachedPortal=null,this._attachedRef=null},e.prototype.attachComponentPortal=function(e){e.setAttachedHost(this);var n=null!=e.viewContainerRef?e.viewContainerRef:this._viewContainerRef,r=this._componentFactoryResolver.resolveComponentFactory(e.component),i=n.createComponent(r,n.length,e.injector||n.parentInjector);return t.prototype.setDisposeFn.call(this,function(){return i.destroy()}),this._attachedPortal=e,this._attachedRef=i,this.attached.emit(i),i},e.prototype.attachTemplatePortal=function(e){var n=this;e.setAttachedHost(this);var r=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context);return t.prototype.setDisposeFn.call(this,function(){return n._viewContainerRef.clear()}),this._attachedPortal=e,this._attachedRef=r,this.attached.emit(r),r},e}(Mi),Li=function(){},Ci=function(){function t(t,e){this._parentInjector=t,this._customTokens=e}return t.prototype.get=function(t,e){var n=this._customTokens.get(t);return"undefined"!=typeof n?n:this._parentInjector.get(t,e)},t}(),Si=function(t){function e(){var e=t.call(this,"argument out of range");this.name=e.name="ArgumentOutOfRangeError",this.stack=e.stack,this.message=e.message}return Object(o.b)(e,t),e}(Error);function Ti(t){return function(e){return 0===t?new rr.a:e.lift(new Di(t))}}var Di=function(){function t(t){if(this.total=t,this.total<0)throw new Si}return t.prototype.call=function(t,e){return e.subscribe(new Oi(t,this.total))},t}(),Oi=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(o.b)(e,t),e.prototype._next=function(t){var e=this.total,n=++this.count;n<=e&&(this.destination.next(t),n===e&&(this.destination.complete(),this.unsubscribe()))},e}(Zn.a);function Yi(t){return null!=t&&""+t!="false"}function Pi(t,e){return void 0===e&&(e=0),function(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}(t)?Number(t):e}function Ei(t){return Array.isArray(t)?t:[t]}var ji=27,Ai=function(){function t(){}return t.prototype.enable=function(){},t.prototype.disable=function(){},t.prototype.attach=function(){},t}(),Ii=function(){return function(t){var e=this;this.scrollStrategy=new Ai,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",t&&Object.keys(t).filter(function(e){return"undefined"!=typeof t[e]}).forEach(function(n){return e[n]=t[n]})}}(),Hi=function(t,e,n,r){this.offsetX=n,this.offsetY=r,this.originX=t.originX,this.originY=t.originY,this.overlayX=e.overlayX,this.overlayY=e.overlayY};function Ri(){return Error("Scroll strategy has already been attached.")}var Ni=function(){function t(t,e,n,r){var i=this;this._scrollDispatcher=t,this._ngZone=e,this._viewportRuler=n,this._config=r,this._scrollSubscription=null,this._detach=function(){i.disable(),i._overlayRef.hasAttached()&&i._ngZone.run(function(){return i._overlayRef.detach()})}}return t.prototype.attach=function(t){if(this._overlayRef)throw Ri();this._overlayRef=t},t.prototype.enable=function(){var t=this;if(!this._scrollSubscription){var e=this._scrollDispatcher.scrolled(0);this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(function(){var e=t._viewportRuler.getViewportScrollPosition().top;Math.abs(e-t._initialScrollPosition)>t._config.threshold?t._detach():t._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),Fi=function(){function t(t,e){this._viewportRuler=t,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1,this._document=e}return t.prototype.attach=function(){},t.prototype.enable=function(){if(this._canBeEnabled()){var t=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=t.style.left||"",this._previousHTMLStyles.top=t.style.top||"",t.style.left=-this._previousScrollPosition.left+"px",t.style.top=-this._previousScrollPosition.top+"px",t.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},t.prototype.disable=function(){if(this._isEnabled){var t=this._document.documentElement,e=this._document.body,n=t.style.scrollBehavior||"",r=e.style.scrollBehavior||"";this._isEnabled=!1,t.style.left=this._previousHTMLStyles.left,t.style.top=this._previousHTMLStyles.top,t.classList.remove("cdk-global-scrollblock"),t.style.scrollBehavior=e.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),t.style.scrollBehavior=n,e.style.scrollBehavior=r}},t.prototype._canBeEnabled=function(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var t=this._document.body,e=this._viewportRuler.getViewportSize();return t.scrollHeight>e.height||t.scrollWidth>e.width},t}();function Vi(t,e){return e.some(function(e){return t.bottome.bottom||t.righte.right})}function zi(t,e){return e.some(function(e){return t.tope.bottom||t.lefte.right})}var Wi=function(){function t(t,e,n,r){this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this._config=r,this._scrollSubscription=null}return t.prototype.attach=function(t){if(this._overlayRef)throw Ri();this._overlayRef=t},t.prototype.enable=function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(t._overlayRef.updatePosition(),t._config&&t._config.autoClose){var e=t._overlayRef.overlayElement.getBoundingClientRect(),n=t._viewportRuler.getViewportSize(),r=n.width,i=n.height;Vi(e,[{width:r,height:i,bottom:i,right:r,top:0,left:0}])&&(t.disable(),t._ngZone.run(function(){return t._overlayRef.detach()}))}}))},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),Bi=function(){return function(t,e,n,r){var i=this;this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this.noop=function(){return new Ai},this.close=function(t){return new Ni(i._scrollDispatcher,i._ngZone,i._viewportRuler,t)},this.block=function(){return new Fi(i._viewportRuler,i._document)},this.reposition=function(t){return new Wi(i._scrollDispatcher,i._viewportRuler,i._ngZone,t)},this._document=r}}(),Ui=function(){function t(t,e,n,r,i,o){this._portalOutlet=t,this._pane=e,this._config=n,this._ngZone=r,this._keyboardDispatcher=i,this._document=o,this._backdropElement=null,this._backdropClick=new Fr.a,this._attachments=new Fr.a,this._detachments=new Fr.a,this._keydownEvents=new Fr.a,n.scrollStrategy&&n.scrollStrategy.attach(this)}return Object.defineProperty(t.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"backdropElement",{get:function(){return this._backdropElement},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this,n=this._portalOutlet.attach(t);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Ti(1)).subscribe(function(){e.hasAttached()&&e.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(t){return e._pane.classList.add(t)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),n},t.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var t=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),t}},t.prototype.dispose=function(){var t=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),t&&this._detachments.next(),this._detachments.complete()},t.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},t.prototype.backdropClick=function(){return this._backdropClick.asObservable()},t.prototype.attachments=function(){return this._attachments.asObservable()},t.prototype.detachments=function(){return this._detachments.asObservable()},t.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},t.prototype.getConfig=function(){return this._config},t.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},t.prototype.updateSize=function(t){this._config=Object(o.a)({},this._config,t),this._updateElementSize()},t.prototype.setDirection=function(t){this._config=Object(o.a)({},this._config,{direction:t}),this._updateElementDirection()},t.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},t.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=qi(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=qi(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=qi(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=qi(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=qi(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=qi(this._config.maxHeight))},t.prototype._togglePointerEvents=function(t){this._pane.style.pointerEvents=t?"auto":"none"},t.prototype._attachBackdrop=function(){var t=this;this._backdropElement=this._document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(e){return t._backdropClick.next(e)}),"undefined"!=typeof requestAnimationFrame?this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){t._backdropElement&&t._backdropElement.classList.add("cdk-overlay-backdrop-showing")})}):this._backdropElement.classList.add("cdk-overlay-backdrop-showing")},t.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},t.prototype.detachBackdrop=function(){var t=this,e=this._backdropElement;if(e){var n=function(){e&&e.parentNode&&e.parentNode.removeChild(e),t._backdropElement==e&&(t._backdropElement=null)};e.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&e.classList.remove(this._config.backdropClass),e.addEventListener("transitionend",n),e.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(n,500)})}},t}();function qi(t){return"string"==typeof t?t:t+"px"}var Ji=function(){function t(t,e,n,r,i){this._connectedTo=n,this._viewportRuler=r,this._document=i,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=Cr.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new Fr.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(t,e)}return Object.defineProperty(t.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this;this._pane=t.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return e.apply()})},t.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe(),this._onPositionChange.complete()},t.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},t.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var t,e,n=this._pane,r=this._origin.getBoundingClientRect(),i=n.getBoundingClientRect(),o=this._viewportRuler.getViewportSize(),a=0,s=this._preferredPositions;a-1&&this._attachedOverlays.splice(e,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},t.prototype._subscribeToKeydownEvents=function(){var t=this,e=oi(this._document.body,"keydown",!0);this._keydownEventSubscription=e.pipe(fr(function(){return!!t._attachedOverlays.length})).subscribe(function(e){t._selectOverlayFromEvent(e)._keydownEvents.next(e)})},t.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},t.prototype._selectOverlayFromEvent=function(t){return this._attachedOverlays.find(function(e){return e.overlayElement===t.target||e.overlayElement.contains(t.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},t}();function Zi(t,e){return t||new Xi(e)}var Qi=function(){function t(t){this._document=t}return t.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},t.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},t.prototype._createContainer=function(){var t=this._document.createElement("div");t.classList.add("cdk-overlay-container"),this._document.body.appendChild(t),this._containerElement=t},t}();function $i(t,e){return t||new Qi(e)}var to=0,eo=function(){function t(t,e,n,r,i,o,a,s,l){this.scrollStrategies=t,this._overlayContainer=e,this._componentFactoryResolver=n,this._positionBuilder=r,this._keyboardDispatcher=i,this._appRef=o,this._injector=a,this._ngZone=s,this._document=l}return t.prototype.create=function(t){var e=this._createPaneElement(),n=this._createPortalOutlet(e);return new Ui(n,e,new Ii(t),this._ngZone,this._keyboardDispatcher,this._document)},t.prototype.position=function(){return this._positionBuilder},t.prototype._createPaneElement=function(){var t=this._document.createElement("div");return t.id="cdk-overlay-"+to++,t.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(t),t},t.prototype._createPortalOutlet=function(t){return new ki(t,this._componentFactoryResolver,this._appRef,this._injector)},t}(),no=[new Hi({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new Hi({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new Hi({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new Hi({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],ro=new r.p("cdk-connected-overlay-scroll-strategy");function io(t){return function(){return t.scrollStrategies.reposition()}}var oo=function(t){this.elementRef=t},ao=function(){function t(t,e,n,i,o){this._overlay=t,this._scrollStrategy=i,this._dir=o,this._hasBackdrop=!1,this._lockPosition=!1,this._backdropSubscription=Cr.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new r.n,this.positionChange=new r.n,this.attach=new r.n,this.detach=new r.n,this._templatePortal=new wi(e,n)}return Object.defineProperty(t.prototype,"offsetX",{get:function(){return this._offsetX},set:function(t){this._offsetX=t,this._position&&this._position.withOffsetX(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"offsetY",{get:function(){return this._offsetY},set:function(t){this._offsetY=t,this._position&&this._position.withOffsetY(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(t){this._hasBackdrop=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"lockPosition",{get:function(){return this._lockPosition},set:function(t){this._lockPosition=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(t){this.origin=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(t){this.positions=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(t){this.offsetX=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(t){this.offsetY=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(t){this.width=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(t){this.height=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(t){this.minWidth=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(t){this.minHeight=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(t){this.backdropClass=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(t){this.scrollStrategy=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(t){this.open=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(t){this.hasBackdrop=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnDestroy=function(){this._destroyOverlay()},t.prototype.ngOnChanges=function(t){this._position&&((t.positions||t._deprecatedPositions)&&this._position.withPositions(this.positions),t.lockPosition&&this._position.withLockedPosition(this.lockPosition),(t.origin||t._deprecatedOrigin)&&(this._position.setOrigin(this.origin.elementRef),this.open&&this._position.apply())),(t.open||t._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},t.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=no),this._overlayRef=this._overlay.create(this._buildConfig())},t.prototype._buildConfig=function(){var t=this._position=this._createPositionStrategy(),e=new Ii({positionStrategy:t,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(e.width=this.width),(this.height||0===this.height)&&(e.height=this.height),(this.minWidth||0===this.minWidth)&&(e.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(e.minHeight=this.minHeight),this.backdropClass&&(e.backdropClass=this.backdropClass),e},t.prototype._createPositionStrategy=function(){for(var t=this,e=this.positions[0],n={originX:e.originX,originY:e.originY},r={overlayX:e.overlayX,overlayY:e.overlayY},i=this._overlay.position().connectedTo(this.origin.elementRef,n,r).withOffsetX(this.offsetX).withOffsetY(this.offsetY).withLockedPosition(this.lockPosition),o=1;o=0},t.prototype.isFocusable=function(t){return function(t){return!function(t){return function(t){return"input"==t.nodeName.toLowerCase()}(t)&&"hidden"==t.type}(t)&&(function(t){var e=t.nodeName.toLowerCase();return"input"===e||"select"===e||"button"===e||"textarea"===e}(t)||function(t){return function(t){return"a"==t.nodeName.toLowerCase()}(t)&&t.hasAttribute("href")}(t)||t.hasAttribute("contenteditable")||fo(t))}(t)&&!this.isDisabled(t)&&this.isVisible(t)},t}();function fo(t){if(!t.hasAttribute("tabindex")||void 0===t.tabIndex)return!1;var e=t.getAttribute("tabindex");return"-32768"!=e&&!(!e||isNaN(parseInt(e,10)))}function _o(t){if(!fo(t))return null;var e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}var mo=function(){function t(t,e,n,r,i){void 0===i&&(i=!1),this._element=t,this._checker=e,this._ngZone=n,this._document=r,this._enabled=!0,i||this.attachAnchors()}return Object.defineProperty(t.prototype,"enabled",{get:function(){return this._enabled},set:function(t){this._enabled=t,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},t.prototype.attachAnchors=function(){var t=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){t._startAnchor.addEventListener("focus",function(){t.focusLastTabbableElement()}),t._endAnchor.addEventListener("focus",function(){t.focusFirstTabbableElement()}),t._element.parentNode&&(t._element.parentNode.insertBefore(t._startAnchor,t._element),t._element.parentNode.insertBefore(t._endAnchor,t._element.nextSibling))})},t.prototype.focusInitialElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusInitialElement())})})},t.prototype.focusFirstTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusFirstTabbableElement())})})},t.prototype.focusLastTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusLastTabbableElement())})})},t.prototype._getRegionBoundary=function(t){for(var e=this._element.querySelectorAll("[cdk-focus-region-"+t+"], [cdkFocusRegion"+t+"], [cdk-focus-"+t+"]"),n=0;n=0;n--){var r=e[n].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(e[n]):null;if(r)return r}return null},t.prototype._createAnchor=function(){var t=this._document.createElement("div");return t.tabIndex=this._enabled?0:-1,t.classList.add("cdk-visually-hidden"),t.classList.add("cdk-focus-trap-anchor"),t},t.prototype._executeOnStable=function(t){this._ngZone.isStable?t():this._ngZone.onStable.asObservable().pipe(Ti(1)).subscribe(t)},t}(),go=function(){function t(t,e,n){this._checker=t,this._ngZone=e,this._document=n}return t.prototype.create=function(t,e){return void 0===e&&(e=!1),new mo(t,this._checker,this._ngZone,this._document,e)},t}();function yo(t,e){return(t.getAttribute(e)||"").match(/\S+/g)||[]}var vo=0,bo=new Map,wo=null,Mo=function(){function t(t){this._document=t}return t.prototype.describe=function(t,e){this._canBeDescribed(t,e)&&(bo.has(e)||this._createMessageElement(e),this._isElementDescribedByMessage(t,e)||this._addMessageReference(t,e))},t.prototype.removeDescription=function(t,e){if(this._canBeDescribed(t,e)){this._isElementDescribedByMessage(t,e)&&this._removeMessageReference(t,e);var n=bo.get(e);n&&0===n.referenceCount&&this._deleteMessageElement(e),wo&&0===wo.childNodes.length&&this._deleteMessagesContainer()}},t.prototype.ngOnDestroy=function(){for(var t=this._document.querySelectorAll("[cdk-describedby-host]"),e=0;e-1&&n!==e._activeItemIndex&&(e._activeItemIndex=n)}})}return t.prototype.skipPredicate=function(t){return this._skipPredicateFn=t,this},t.prototype.withWrap=function(){return this._wrap=!0,this},t.prototype.withVerticalOrientation=function(t){return void 0===t&&(t=!0),this._vertical=t,this},t.prototype.withHorizontalOrientation=function(t){return this._horizontal=t,this},t.prototype.withTypeAhead=function(t){var e=this;if(void 0===t&&(t=200),this._items.length&&this._items.some(function(t){return"function"!=typeof t.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(cr(function(t){return e._pressedLetters.push(t)}),lo(t),fr(function(){return e._pressedLetters.length>0}),Qn(function(){return e._pressedLetters.join("")})).subscribe(function(t){for(var n=e._items.toArray(),r=1;r=65&&e<=90||e>=48&&e<=57)&&this._letterKeyStream.next(String.fromCharCode(e)))}this._pressedLetters=[],t.preventDefault()},Object.defineProperty(t.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),t.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},t.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},t.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},t.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},t.prototype.updateActiveItemIndex=function(t){this._activeItemIndex=t},t.prototype._setActiveItemByDelta=function(t,e){void 0===e&&(e=this._items.toArray()),this._wrap?this._setActiveInWrapMode(t,e):this._setActiveInDefaultMode(t,e)},t.prototype._setActiveInWrapMode=function(t,e){for(var n=1;n<=e.length;n++){var r=(this._activeItemIndex+t*n+e.length)%e.length;if(!this._skipPredicateFn(e[r]))return void this.setActiveItem(r)}},t.prototype._setActiveInDefaultMode=function(t,e){this._setActiveItemByIndex(this._activeItemIndex+t,t,e)},t.prototype._setActiveItemByIndex=function(t,e,n){if(void 0===n&&(n=this._items.toArray()),n[t]){for(;this._skipPredicateFn(n[t]);)if(!n[t+=e])return;this.setActiveItem(t)}},t}(),Lo=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),e.prototype.setActiveItem=function(e){this.activeItem&&this.activeItem.setInactiveStyles(),t.prototype.setActiveItem.call(this,e),this.activeItem&&this.activeItem.setActiveStyles()},e}(xo),Co=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._origin="program",e}return Object(o.b)(e,t),e.prototype.setFocusOrigin=function(t){return this._origin=t,this},e.prototype.setActiveItem=function(e){t.prototype.setActiveItem.call(this,e),this.activeItem&&this.activeItem.focus(this._origin)},e}(xo),So=new r.p("liveAnnouncerElement"),To=function(){function t(t,e){this._document=e,this._liveElement=t||this._createLiveElement()}return t.prototype.announce=function(t,e){var n=this;return void 0===e&&(e="polite"),this._liveElement.textContent="",this._liveElement.setAttribute("aria-live",e),new Promise(function(e){setTimeout(function(){n._liveElement.textContent=t,e()},100)})},t.prototype.ngOnDestroy=function(){this._liveElement&&this._liveElement.parentNode&&this._liveElement.parentNode.removeChild(this._liveElement)},t.prototype._createLiveElement=function(){var t=this._document.createElement("div");return t.classList.add("cdk-visually-hidden"),t.setAttribute("aria-atomic","true"),t.setAttribute("aria-live","polite"),this._document.body.appendChild(t),t},t}();function Do(t,e,n){return t||new To(e,n)}var Oo=function(){function t(t,e){this._ngZone=t,this._platform=e,this._origin=null,this._windowFocused=!1,this._elementInfo=new Map,this._unregisterGlobalListeners=function(){},this._monitoredElementCount=0}return t.prototype.monitor=function(t,e,n){var i=this;if(e instanceof r.C||(n=e),n=!!n,!this._platform.isBrowser)return ur(null);if(this._elementInfo.has(t)){var o=this._elementInfo.get(t);return o.checkChildren=n,o.subject.asObservable()}var a={unlisten:function(){},checkChildren:n,subject:new Fr.a};this._elementInfo.set(t,a),this._incrementMonitoredElementCount();var s=function(e){return i._onFocus(e,t)},l=function(e){return i._onBlur(e,t)};return this._ngZone.runOutsideAngular(function(){t.addEventListener("focus",s,!0),t.addEventListener("blur",l,!0)}),a.unlisten=function(){t.removeEventListener("focus",s,!0),t.removeEventListener("blur",l,!0)},a.subject.asObservable()},t.prototype.stopMonitoring=function(t){var e=this._elementInfo.get(t);e&&(e.unlisten(),e.subject.complete(),this._setClasses(t),this._elementInfo.delete(t),this._decrementMonitoredElementCount())},t.prototype.focusVia=function(t,e){this._setOriginForCurrentEventQueue(e),t.focus()},t.prototype.ngOnDestroy=function(){var t=this;this._elementInfo.forEach(function(e,n){return t.stopMonitoring(n)})},t.prototype._registerGlobalListeners=function(){var t=this;if(this._platform.isBrowser){var e=function(){t._lastTouchTarget=null,t._setOriginForCurrentEventQueue("keyboard")},n=function(){t._lastTouchTarget||t._setOriginForCurrentEventQueue("mouse")},r=function(e){null!=t._touchTimeoutId&&clearTimeout(t._touchTimeoutId),t._lastTouchTarget=e.target,t._touchTimeoutId=setTimeout(function(){return t._lastTouchTarget=null},650)},i=function(){t._windowFocused=!0,t._windowFocusTimeoutId=setTimeout(function(){return t._windowFocused=!1},0)};this._ngZone.runOutsideAngular(function(){document.addEventListener("keydown",e,!0),document.addEventListener("mousedown",n,!0),document.addEventListener("touchstart",r,!$r()||{passive:!0,capture:!0}),window.addEventListener("focus",i)}),this._unregisterGlobalListeners=function(){document.removeEventListener("keydown",e,!0),document.removeEventListener("mousedown",n,!0),document.removeEventListener("touchstart",r,!$r()||{passive:!0,capture:!0}),window.removeEventListener("focus",i),clearTimeout(t._windowFocusTimeoutId),clearTimeout(t._touchTimeoutId),clearTimeout(t._originTimeoutId)}}},t.prototype._toggleClass=function(t,e,n){n?t.classList.add(e):t.classList.remove(e)},t.prototype._setClasses=function(t,e){this._elementInfo.get(t)&&(this._toggleClass(t,"cdk-focused",!!e),this._toggleClass(t,"cdk-touch-focused","touch"===e),this._toggleClass(t,"cdk-keyboard-focused","keyboard"===e),this._toggleClass(t,"cdk-mouse-focused","mouse"===e),this._toggleClass(t,"cdk-program-focused","program"===e))},t.prototype._setOriginForCurrentEventQueue=function(t){var e=this;this._origin=t,this._originTimeoutId=setTimeout(function(){return e._origin=null},0)},t.prototype._wasCausedByTouch=function(t){var e=t.target;return this._lastTouchTarget instanceof Node&&e instanceof Node&&(e===this._lastTouchTarget||e.contains(this._lastTouchTarget))},t.prototype._onFocus=function(t,e){var n=this._elementInfo.get(e);n&&(n.checkChildren||e===t.target)&&(this._origin||(this._origin=this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:this._wasCausedByTouch(t)?"touch":"program"),this._setClasses(e,this._origin),n.subject.next(this._origin),this._lastFocusOrigin=this._origin,this._origin=null)},t.prototype._onBlur=function(t,e){var n=this._elementInfo.get(e);!n||n.checkChildren&&t.relatedTarget instanceof Node&&e.contains(t.relatedTarget)||(this._setClasses(e),n.subject.next(null))},t.prototype._incrementMonitoredElementCount=function(){1==++this._monitoredElementCount&&this._registerGlobalListeners()},t.prototype._decrementMonitoredElementCount=function(){--this._monitoredElementCount||(this._unregisterGlobalListeners(),this._unregisterGlobalListeners=function(){})},t}();function Yo(t,e,n){return t||new Oo(e,n)}var Po=function(){},Eo=new r.p("mat-sanity-checks"),jo=function(){function t(t){this._sanityChecksEnabled=t,this._hasDoneGlobalChecks=!1,this._hasCheckedHammer=!1,this._document="object"==typeof document&&document?document:null,this._window="object"==typeof window&&window?window:null,this._areChecksEnabled()&&!this._hasDoneGlobalChecks&&(this._checkDoctypeIsDefined(),this._checkThemeIsPresent(),this._hasDoneGlobalChecks=!0)}return t.prototype._areChecksEnabled=function(){return this._sanityChecksEnabled&&Object(r.U)()&&!this._isTestEnv()},t.prototype._isTestEnv=function(){return this._window&&(this._window.__karma__||this._window.jasmine)},t.prototype._checkDoctypeIsDefined=function(){this._document&&!this._document.doctype&&console.warn("Current document does not have a doctype. This may cause some Angular Material components not to behave as expected.")},t.prototype._checkThemeIsPresent=function(){if(this._document&&"function"==typeof getComputedStyle){var t=this._document.createElement("div");t.classList.add("mat-theme-loaded-marker"),this._document.body.appendChild(t);var e=getComputedStyle(t);e&&"none"!==e.display&&console.warn("Could not find Angular Material core theme. Most Material components may not work as expected. For more info refer to the theming guide: https://material.angular.io/guide/theming"),this._document.body.removeChild(t)}},t.prototype._checkHammerIsAvailable=function(){!this._hasCheckedHammer&&this._window&&(this._areChecksEnabled()&&!this._window.Hammer&&console.warn("Could not find HammerJS. Certain Angular Material components may not work correctly."),this._hasCheckedHammer=!0)},t}();function Ao(t){return function(t){function e(){for(var e=[],n=0;nga?ga:i:i}()),this.arr=t,this.idx=e,this.len=n}return t.prototype[Er.a]=function(){return this},t.prototype.next=function(){return this.idx=t.length?r.complete():(r.next(e[n]),t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(e.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:t});for(var o=0;o1?new lr.a(t,n):new rr.a(n),e)}}var xa=function(){},La="*";function Ca(t,e){return void 0===e&&(e=null),{type:2,steps:t,options:e}}function Sa(t){return{type:6,styles:t,offset:null}}function Ta(t){Promise.resolve(null).then(t)}var Da=function(){function t(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.init=function(){},t.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},t.prototype.triggerMicrotask=function(){var t=this;Ta(function(){return t._onFinish()})},t.prototype._onStart=function(){this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[]},t.prototype.pause=function(){},t.prototype.restart=function(){},t.prototype.finish=function(){this._onFinish()},t.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){},t.prototype.setPosition=function(t){},t.prototype.getPosition=function(){return 0},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Oa=function(){function t(t){var e=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=t;var n=0,r=0,i=0,o=this.players.length;0==o?Ta(function(){return e._onFinish()}):this.players.forEach(function(t){t.onDone(function(){++n==o&&e._onFinish()}),t.onDestroy(function(){++r==o&&e._onDestroy()}),t.onStart(function(){++i==o&&e._onStart()})}),this.totalTime=this.players.reduce(function(t,e){return Math.max(t,e.totalTime)},0)}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.init=function(){this.players.forEach(function(t){return t.init()})},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[])},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(t){return t.play()})},t.prototype.pause=function(){this.players.forEach(function(t){return t.pause()})},t.prototype.restart=function(){this.players.forEach(function(t){return t.restart()})},t.prototype.finish=function(){this._onFinish(),this.players.forEach(function(t){return t.finish()})},t.prototype.destroy=function(){this._onDestroy()},t.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(t){return t.destroy()}),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){this.players.forEach(function(t){return t.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},t.prototype.setPosition=function(t){var e=t*this.totalTime;this.players.forEach(function(t){var n=t.totalTime?Math.min(1,e/t.totalTime):1;t.setPosition(n)})},t.prototype.getPosition=function(){var t=0;return this.players.forEach(function(e){var n=e.getPosition();t=Math.min(n,t)}),t},t.prototype.beforeDestroy=function(){this.players.forEach(function(t){t.beforeDestroy&&t.beforeDestroy()})},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Ya="!",Pa=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0,this.closeOnNavigation=!0};function Ea(){throw Error("Attempting to attach dialog content after content is already attached")}var ja=function(t){function e(e,n,i,o){var a=t.call(this)||this;return a._elementRef=e,a._focusTrapFactory=n,a._changeDetectorRef=i,a._document=o,a._elementFocusedBeforeDialogWasOpened=null,a._state="enter",a._animationStateChanged=new r.n,a._ariaLabelledBy=null,a}return Object(o.b)(e,t),e.prototype.attachComponentPortal=function(t){return this._portalOutlet.hasAttached()&&Ea(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(t)},e.prototype.attachTemplatePortal=function(t){return this._portalOutlet.hasAttached()&&Ea(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(t)},e.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},e.prototype._restoreFocus=function(){var t=this._elementFocusedBeforeDialogWasOpened;t&&"function"==typeof t.focus&&t.focus(),this._focusTrap&&this._focusTrap.destroy()},e.prototype._savePreviouslyFocusedElement=function(){var t=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,this._elementRef.nativeElement.focus&&Promise.resolve().then(function(){return t._elementRef.nativeElement.focus()}))},e.prototype._onAnimationDone=function(t){"enter"===t.toState?this._trapFocus():"exit"===t.toState&&this._restoreFocus(),this._animationStateChanged.emit(t)},e.prototype._onAnimationStart=function(t){this._animationStateChanged.emit(t)},e.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},e}(Mi),Aa=0,Ia=function(){function t(t,e,n,r){void 0===r&&(r="mat-dialog-"+Aa++);var i=this;this._overlayRef=t,this._containerInstance=e,this.id=r,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new Fr.a,this._afterClosed=new Fr.a,this._beforeClose=new Fr.a,this._locationChanges=Cr.a.EMPTY,e._id=r,e._animationStateChanged.pipe(fr(function(t){return"done"===t.phaseName&&"enter"===t.toState}),Ti(1)).subscribe(function(){i._afterOpen.next(),i._afterOpen.complete()}),e._animationStateChanged.pipe(fr(function(t){return"done"===t.phaseName&&"exit"===t.toState}),Ti(1)).subscribe(function(){i._overlayRef.dispose(),i._locationChanges.unsubscribe(),i._afterClosed.next(i._result),i._afterClosed.complete(),i.componentInstance=null}),t.keydownEvents().pipe(fr(function(t){return t.keyCode===ji&&!i.disableClose})).subscribe(function(){return i.close()}),n&&(this._locationChanges=n.subscribe(function(){i._containerInstance._config.closeOnNavigation&&i.close()}))}return t.prototype.close=function(t){var e=this;this._result=t,this._containerInstance._animationStateChanged.pipe(fr(function(t){return"start"===t.phaseName}),Ti(1)).subscribe(function(){e._beforeClose.next(t),e._beforeClose.complete(),e._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},t.prototype.afterOpen=function(){return this._afterOpen.asObservable()},t.prototype.afterClosed=function(){return this._afterClosed.asObservable()},t.prototype.beforeClose=function(){return this._beforeClose.asObservable()},t.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},t.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},t.prototype.updatePosition=function(t){var e=this._getPositionStrategy();return t&&(t.left||t.right)?t.left?e.left(t.left):e.right(t.right):e.centerHorizontally(),t&&(t.top||t.bottom)?t.top?e.top(t.top):e.bottom(t.bottom):e.centerVertically(),this._overlayRef.updatePosition(),this},t.prototype.updateSize=function(t,e){return void 0===t&&(t="auto"),void 0===e&&(e="auto"),this._getPositionStrategy().width(t).height(e),this._overlayRef.updatePosition(),this},t.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},t}(),Ha=new r.p("MatDialogData"),Ra=new r.p("mat-dialog-default-options"),Na=new r.p("mat-dialog-scroll-strategy");function Fa(t){return function(){return t.scrollStrategies.block()}}var Va=function(){function t(t,e,n,r,i,o,a){var s=this;this._overlay=t,this._injector=e,this._location=n,this._defaultOptions=r,this._scrollStrategy=i,this._parentDialog=o,this._overlayContainer=a,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new Fr.a,this._afterOpenAtThisLevel=new Fr.a,this._ariaHiddenElements=new Map,this.afterAllClosed=aa(function(){return s.openDialogs.length?s._afterAllClosed:s._afterAllClosed.pipe(ka(void 0))})}return Object.defineProperty(t.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_afterAllClosed",{get:function(){var t=this._parentDialog;return t?t._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),t.prototype.open=function(t,e){var n=this;if((e=function(t,e){return Object(o.a)({},e,t)}(e,this._defaultOptions||new Pa)).id&&this.getDialogById(e.id))throw Error('Dialog with id "'+e.id+'" exists already. The dialog id must be unique.');var r=this._createOverlay(e),i=this._attachDialogContainer(r,e),a=this._attachDialogContent(t,i,r,e);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(a),a.afterClosed().subscribe(function(){return n._removeOpenDialog(a)}),this.afterOpen.next(a),a},t.prototype.closeAll=function(){for(var t=this.openDialogs.length;t--;)this.openDialogs[t].close()},t.prototype.getDialogById=function(t){return this.openDialogs.find(function(e){return e.id===t})},t.prototype._createOverlay=function(t){var e=this._getOverlayConfig(t);return this._overlay.create(e)},t.prototype._getOverlayConfig=function(t){var e=new Ii({positionStrategy:this._overlay.position().global(),scrollStrategy:t.scrollStrategy||this._scrollStrategy(),panelClass:t.panelClass,hasBackdrop:t.hasBackdrop,direction:t.direction,minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight});return t.backdropClass&&(e.backdropClass=t.backdropClass),e},t.prototype._attachDialogContainer=function(t,e){var n=new bi(ja,e.viewContainerRef),r=t.attach(n);return r.instance._config=e,r.instance},t.prototype._attachDialogContent=function(t,e,n,i){var o=new Ia(n,e,this._location,i.id);if(i.hasBackdrop&&n.backdropClick().subscribe(function(){o.disableClose||o.close()}),t instanceof r.K)e.attachTemplatePortal(new wi(t,null,{$implicit:i.data,dialogRef:o}));else{var a=this._createInjector(i,o,e),s=e.attachComponentPortal(new bi(t,void 0,a));o.componentInstance=s.instance}return o.updateSize(i.width,i.height).updatePosition(i.position),o},t.prototype._createInjector=function(t,e,n){var r=t&&t.viewContainerRef&&t.viewContainerRef.injector,i=new WeakMap;return i.set(ja,n).set(Ha,t.data).set(Ia,e),r&&r.get(mi,null)||i.set(mi,{value:t.direction,change:ur()}),new Ci(r||this._injector,i)},t.prototype._removeOpenDialog=function(t){var e=this.openDialogs.indexOf(t);e>-1&&(this.openDialogs.splice(e,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(t,e){t?e.setAttribute("aria-hidden",t):e.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},t.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var t=this._overlayContainer.getContainerElement();if(t.parentElement)for(var e=t.parentElement.children,n=e.length-1;n>-1;n--){var r=e[n];r===t||"SCRIPT"===r.nodeName||"STYLE"===r.nodeName||r.hasAttribute("aria-live")||(this._ariaHiddenElements.set(r,r.getAttribute("aria-hidden")),r.setAttribute("aria-hidden","true"))}},t}(),za=function(){},Wa=function(){},Ba=ca.create,Ua=function(){function t(){}return Object.defineProperty(t.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t.prototype.reset=function(t){void 0===t&&(t=void 0),this.control&&this.control.reset(t)},t.prototype.hasError=function(t,e){return!!this.control&&this.control.hasError(t,e)},t.prototype.getError=function(t,e){return this.control?this.control.getError(t,e):null},t}(),qa=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),e}(Ua);function Ja(t){return null==t||0===t.length}var Ga=new r.p("NgValidators"),Ka=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Xa=function(){function t(){}return t.min=function(t){return function(e){if(Ja(e.value)||Ja(t))return null;var n=parseFloat(e.value);return!isNaN(n)&&nt?{max:{max:t,actual:e.value}}:null}},t.required=function(t){return Ja(t.value)?{required:!0}:null},t.requiredTrue=function(t){return!0===t.value?null:{required:!0}},t.email=function(t){return Ka.test(t.value)?null:{email:!0}},t.minLength=function(t){return function(e){if(Ja(e.value))return null;var n=e.value?e.value.length:0;return nt?{maxlength:{requiredLength:t,actualLength:n}}:null}},t.pattern=function(e){return e?("string"==typeof e?(r="","^"!==e.charAt(0)&&(r+="^"),r+=e,"$"!==e.charAt(e.length-1)&&(r+="$"),n=new RegExp(r)):(r=e.toString(),n=e),function(t){if(Ja(t.value))return null;var e=t.value;return n.test(e)?null:{pattern:{requiredPattern:r,actualValue:e}}}):t.nullValidator;var n,r},t.nullValidator=function(t){return null},t.compose=function(t){if(!t)return null;var e=t.filter(Za);return 0==e.length?null:function(t){return $a(function(t,n){return e.map(function(e){return e(t)})}(t))}},t.composeAsync=function(t){if(!t)return null;var e=t.filter(Za);return 0==e.length?null:function(t){var n=function(t,n){return e.map(function(e){return e(t)})}(t).map(Qa);return er.call(sr(n),$a)}},t}();function Za(t){return null!=t}function Qa(t){var e=Object(r._11)(t)?Ba(t):t;if(!Object(r._10)(e))throw new Error("Expected validator to return Promise or Observable.");return e}function $a(t){var e=t.reduce(function(t,e){return null!=e?Object(o.a)({},t,e):t},{});return 0===Object.keys(e).length?null:e}var ts=new r.p("NgValueAccessor"),es=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"checked",t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}(),ns=new r.p("CompositionEventMode"),rs=function(){function t(t,e,n){var r;this._renderer=t,this._elementRef=e,this._compositionMode=n,this.onChange=function(t){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(r=Pt()?Pt().getUserAgent():"",!/android (\d+)/.test(r.toLowerCase())))}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._handleInput=function(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)},t.prototype._compositionStart=function(){this._composing=!0},t.prototype._compositionEnd=function(t){this._composing=!1,this._compositionMode&&this.onChange(t)},t}();function is(t){return t.validate?function(e){return t.validate(e)}:t}function os(t){return t.validate?function(e){return t.validate(e)}:t}var as=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function ss(){throw new Error("unimplemented")}var ls=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._parent=null,e.name=null,e.valueAccessor=null,e._rawValidators=[],e._rawAsyncValidators=[],e}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"validator",{get:function(){return ss()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return ss()},enumerable:!0,configurable:!0}),e}(Ua),us=function(){function t(){this._accessors=[]}return t.prototype.add=function(t,e){this._accessors.push([t,e])},t.prototype.remove=function(t){for(var e=this._accessors.length-1;e>=0;--e)if(this._accessors[e][1]===t)return void this._accessors.splice(e,1)},t.prototype.select=function(t){var e=this;this._accessors.forEach(function(n){e._isSameGroup(n,t)&&n[1]!==t&&n[1].fireUncheck(t.value)})},t.prototype._isSameGroup=function(t,e){return!!t[0].control&&t[0]._parent===e._control._parent&&t[1].name===e.name},t}(),cs=function(){function t(t,e,n,r){this._renderer=t,this._elementRef=e,this._registry=n,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return t.prototype.ngOnInit=function(){this._control=this._injector.get(ls),this._checkName(),this._registry.add(this._control,this)},t.prototype.ngOnDestroy=function(){this._registry.remove(this)},t.prototype.writeValue=function(t){this._state=t===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},t.prototype.registerOnChange=function(t){var e=this;this._fn=t,this.onChange=function(){t(e.value),e._registry.select(e)}},t.prototype.fireUncheck=function(t){this.writeValue(t)},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},t.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},t}(),ds=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(t))},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function hs(t,e){return null==t?""+e:(e&&"object"==typeof e&&(e="Object"),(t+": "+e).slice(0,50))}var ps=function(){function t(t,e){this._renderer=t,this._elementRef=e,this._optionMap=new Map,this._idCounter=0,this.onChange=function(t){},this.onTouched=function(){},this._compareWith=r._12}return Object.defineProperty(t.prototype,"compareWith",{set:function(t){if("function"!=typeof t)throw new Error("compareWith must be a function, but received "+JSON.stringify(t));this._compareWith=t},enumerable:!0,configurable:!0}),t.prototype.writeValue=function(t){this.value=t;var e=this._getOptionId(t);null==e&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=hs(e,t);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){e.value=e._getOptionValue(n),t(e.value)}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._registerOption=function(){return(this._idCounter++).toString()},t.prototype._getOptionId=function(t){for(var e=0,n=Array.from(this._optionMap.keys());e-1)}}else e=function(t,e){t._setSelected(!1)};this._optionMap.forEach(e)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){var r=[];if(n.hasOwnProperty("selectedOptions"))for(var i=n.selectedOptions,o=0;o1?"path: '"+t.path.join(" -> ")+"'":t.path[0]?"name: '"+t.path+"'":"unspecified name attribute",new Error(e+" "+n)}function xs(t){return null!=t?Xa.compose(t.map(is)):null}function Ls(t){return null!=t?Xa.composeAsync(t.map(os)):null}var Cs=[es,ds,as,ps,ms,cs];function Ss(t,e){t._syncPendingControls(),e.forEach(function(t){var e=t.control;"submit"===e.updateOn&&e._pendingChange&&(t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1)})}function Ts(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var Ds=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return ys(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return xs(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ls(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){},e}(qa),Os=function(){function t(t){this._cd=t}return Object.defineProperty(t.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),t}(),Ys=function(t){function e(e){return t.call(this,e)||this}return Object(o.b)(e,t),e}(Os),Ps=function(t){function e(e){return t.call(this,e)||this}return Object(o.b)(e,t),e}(Os);function Es(t){var e=As(t)?t.validators:t;return Array.isArray(e)?xs(e):e||null}function js(t,e){var n=As(e)?e.asyncValidators:t;return Array.isArray(n)?Ls(n):n||null}function As(t){return null!=t&&!Array.isArray(t)&&"object"==typeof t}var Is=function(){function t(t,e){this.validator=t,this.asyncValidator=e,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),t.prototype.setValidators=function(t){this.validator=Es(t)},t.prototype.setAsyncValidators=function(t){this.asyncValidator=js(t)},t.prototype.clearValidators=function(){this.validator=null},t.prototype.clearAsyncValidators=function(){this.asyncValidator=null},t.prototype.markAsTouched=function(t){void 0===t&&(t={}),this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)},t.prototype.markAsUntouched=function(t){void 0===t&&(t={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(t){t.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype.markAsDirty=function(t){void 0===t&&(t={}),this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)},t.prototype.markAsPristine=function(t){void 0===t&&(t={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(t){t.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype.markAsPending=function(t){void 0===t&&(t={}),this.status="PENDING",this._parent&&!t.onlySelf&&this._parent.markAsPending(t)},t.prototype.disable=function(t){void 0===t&&(t={}),this.status="DISABLED",this.errors=null,this._forEachChild(function(e){e.disable(Object(o.a)({},t,{onlySelf:!0}))}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(t),this._onDisabledChange.forEach(function(t){return t(!0)})},t.prototype.enable=function(t){void 0===t&&(t={}),this.status="VALID",this._forEachChild(function(e){e.enable(Object(o.a)({},t,{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors(t),this._onDisabledChange.forEach(function(t){return t(!1)})},t.prototype._updateAncestors=function(t){this._parent&&!t.onlySelf&&(this._parent.updateValueAndValidity(t),this._parent._updatePristine(),this._parent._updateTouched())},t.prototype.setParent=function(t){this._parent=t},t.prototype.updateValueAndValidity=function(t){void 0===t&&(t={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)},t.prototype._updateTreeValidity=function(t){void 0===t&&(t={emitEvent:!0}),this._forEachChild(function(e){return e._updateTreeValidity(t)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})},t.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},t.prototype._runValidator=function(){return this.validator?this.validator(this):null},t.prototype._runAsyncValidator=function(t){var e=this;if(this.asyncValidator){this.status="PENDING";var n=Qa(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){return e.setErrors(n,{emitEvent:t})})}},t.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},t.prototype.setErrors=function(t,e){void 0===e&&(e={}),this.errors=t,this._updateControlsErrors(!1!==e.emitEvent)},t.prototype.get=function(t){return function(t,e,n){return null==e?null:(e instanceof Array||(e=e.split(".")),e instanceof Array&&0===e.length?null:e.reduce(function(t,e){return t instanceof Rs?t.controls[e]||null:t instanceof Ns&&t.at(e)||null},t))}(this,t)},t.prototype.getError=function(t,e){var n=e?this.get(e):this;return n&&n.errors?n.errors[t]:null},t.prototype.hasError=function(t,e){return!!this.getError(t,e)},Object.defineProperty(t.prototype,"root",{get:function(){for(var t=this;t._parent;)t=t._parent;return t},enumerable:!0,configurable:!0}),t.prototype._updateControlsErrors=function(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)},t.prototype._initObservables=function(){this.valueChanges=new r.n,this.statusChanges=new r.n},t.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},t.prototype._anyControlsHaveStatus=function(t){return this._anyControls(function(e){return e.status===t})},t.prototype._anyControlsDirty=function(){return this._anyControls(function(t){return t.dirty})},t.prototype._anyControlsTouched=function(){return this._anyControls(function(t){return t.touched})},t.prototype._updatePristine=function(t){void 0===t&&(t={}),this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype._updateTouched=function(t){void 0===t&&(t={}),this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype._isBoxedValue=function(t){return"object"==typeof t&&null!==t&&2===Object.keys(t).length&&"value"in t&&"disabled"in t},t.prototype._registerOnCollectionChange=function(t){this._onCollectionChange=t},t.prototype._setUpdateStrategy=function(t){As(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)},t}(),Hs=function(t){function e(e,n,r){void 0===e&&(e=null);var i=t.call(this,Es(n),js(r,n))||this;return i._onChange=[],i._applyFormState(e),i._setUpdateStrategy(n),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i._initObservables(),i}return Object(o.b)(e,t),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this.value=this._pendingValue=t,this._onChange.length&&!1!==e.emitModelToViewChange&&this._onChange.forEach(function(t){return t(n.value,!1!==e.emitViewToModelChange)}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){void 0===e&&(e={}),this.setValue(t,e)},e.prototype.reset=function(t,e){void 0===t&&(t=null),void 0===e&&(e={}),this._applyFormState(t),this.markAsPristine(e),this.markAsUntouched(e),this.setValue(this.value,e),this._pendingChange=!1},e.prototype._updateValue=function(){},e.prototype._anyControls=function(t){return!1},e.prototype._allControlsDisabled=function(){return this.disabled},e.prototype.registerOnChange=function(t){this._onChange.push(t)},e.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},e.prototype.registerOnDisabledChange=function(t){this._onDisabledChange.push(t)},e.prototype._forEachChild=function(t){},e.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},e.prototype._applyFormState=function(t){this._isBoxedValue(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t},e}(Is),Rs=function(t){function e(e,n,r){var i=t.call(this,Es(n),js(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.b)(e,t),e.prototype.registerControl=function(t,e){return this.controls[t]?this.controls[t]:(this.controls[t]=e,e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange),e)},e.prototype.addControl=function(t,e){this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.removeControl=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],e&&this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.contains=function(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled},e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),Object.keys(t).forEach(function(r){n._throwIfControlMissing(r),n.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),Object.keys(t).forEach(function(r){n.controls[r]&&n.controls[r].patchValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this._reduceChildren({},function(t,e,n){return t[n]=e instanceof Hs?e.value:e.getRawValue(),t})},e.prototype._syncPendingControls=function(){var t=this._reduceChildren(!1,function(t,e){return!!e._syncPendingControls()||t});return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[t])throw new Error("Cannot find form control with name: "+t+".")},e.prototype._forEachChild=function(t){var e=this;Object.keys(this.controls).forEach(function(n){return t(e.controls[n],n)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){e.setParent(t),e._registerOnCollectionChange(t._onCollectionChange)})},e.prototype._updateValue=function(){this.value=this._reduceValue()},e.prototype._anyControls=function(t){var e=this,n=!1;return this._forEachChild(function(r,i){n=n||e.contains(i)&&t(r)}),n},e.prototype._reduceValue=function(){var t=this;return this._reduceChildren({},function(e,n,r){return(n.enabled||t.disabled)&&(e[r]=n.value),e})},e.prototype._reduceChildren=function(t,e){var n=t;return this._forEachChild(function(t,r){n=e(n,t,r)}),n},e.prototype._allControlsDisabled=function(){for(var t=0,e=Object.keys(this.controls);t0||this.disabled},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control with name: '"+n+"'.")})},e}(Is),Ns=function(t){function e(e,n,r){var i=t.call(this,Es(n),js(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.b)(e,t),e.prototype.at=function(t){return this.controls[t]},e.prototype.push=function(t){this.controls.push(t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.insert=function(t,e){this.controls.splice(t,0,e),this._registerControl(e),this.updateValueAndValidity()},e.prototype.removeAt=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),this.updateValueAndValidity()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),e&&(this.controls.splice(t,0,e),this._registerControl(e)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(e.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),t.forEach(function(t,r){n._throwIfControlMissing(r),n.at(r).setValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),t.forEach(function(t,r){n.at(r)&&n.at(r).patchValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t=[]),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this.controls.map(function(t){return t instanceof Hs?t.value:t.getRawValue()})},e.prototype._syncPendingControls=function(){var t=this.controls.reduce(function(t,e){return!!e._syncPendingControls()||t},!1);return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(t))throw new Error("Cannot find form control at index "+t)},e.prototype._forEachChild=function(t){this.controls.forEach(function(e,n){t(e,n)})},e.prototype._updateValue=function(){var t=this;this.value=this.controls.filter(function(e){return e.enabled||t.disabled}).map(function(t){return t.value})},e.prototype._anyControls=function(t){return this.controls.some(function(e){return e.enabled&&t(e)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){return t._registerControl(e)})},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control at index: "+n+".")})},e.prototype._allControlsDisabled=function(){for(var t=0,e=this.controls;t0||this.disabled},e.prototype._registerControl=function(t){t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)},e}(Is),Fs=Promise.resolve(null),Vs=function(t){function e(e,n){var i=t.call(this)||this;return i.submitted=!1,i._directives=[],i.ngSubmit=new r.n,i.form=new Rs({},xs(e),Ls(n)),i}return Object(o.b)(e,t),e.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this;Fs.then(function(){var n=e._findContainer(t.path);t.control=n.registerControl(t.name,t.control),vs(t.control,t),t.control.updateValueAndValidity({emitEvent:!1}),e._directives.push(t)})},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){var e=this;Fs.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name),Ts(e._directives,t)})},e.prototype.addFormGroup=function(t){var e=this;Fs.then(function(){var n=e._findContainer(t.path),r=new Rs({});ws(r,t),n.registerControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})},e.prototype.removeFormGroup=function(t){var e=this;Fs.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name)})},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){var n=this;Fs.then(function(){n.form.get(t.path).setValue(e)})},e.prototype.setValue=function(t){this.control.setValue(t)},e.prototype.onSubmit=function(t){return this.submitted=!0,Ss(this.form,this._directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},e.prototype._findContainer=function(t){return t.pop(),t.length?this.form.get(t):this.form},e}(qa),zs='\n

\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Ws='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',Bs=function(){function t(){}return t.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+zs)},t.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Ws+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n
\n
\n \n
\n
')},t.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+zs)},t.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Ws)},t.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},t.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},t}(),Us=function(t){function e(e,n){var i=t.call(this)||this;return i._validators=e,i._asyncValidators=n,i.submitted=!1,i.directives=[],i.form=null,i.ngSubmit=new r.n,i}return Object(o.b)(e,t),e.prototype.ngOnChanges=function(t){this._checkFormPresent(),t.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this.form.get(t.path);return vs(e,t),e.updateValueAndValidity({emitEvent:!1}),this.directives.push(t),e},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){Ts(this.directives,t)},e.prototype.addFormGroup=function(t){var e=this.form.get(t.path);ws(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormGroup=function(t){},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.addFormArray=function(t){var e=this.form.get(t.path);ws(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormArray=function(t){},e.prototype.getFormArray=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){this.form.get(t.path).setValue(e)},e.prototype.onSubmit=function(t){return this.submitted=!0,Ss(this.form,this.directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._updateDomValue=function(){var t=this;this.directives.forEach(function(e){var n=t.form.get(e.path);e.control!==n&&(function(t,e){e.valueAccessor.registerOnChange(function(){return Ms(e)}),e.valueAccessor.registerOnTouched(function(){return Ms(e)}),e._rawValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),e._rawAsyncValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),t&&t._clearChangeFns()}(e.control,e),n&&vs(n,e),e.control=n)}),this.form._updateTreeValidity({emitEvent:!1})},e.prototype._updateRegistrations=function(){var t=this;this.form._registerOnCollectionChange(function(){return t._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},e.prototype._updateValidators=function(){var t=xs(this._validators);this.form.validator=Xa.compose([this.form.validator,t]);var e=Ls(this._asyncValidators);this.form.asyncValidator=Xa.composeAsync([this.form.asyncValidator,e])},e.prototype._checkFormPresent=function(){this.form||Bs.missingFormException()},e}(qa),qs=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.b)(e,t),e.prototype._checkParentType=function(){Gs(this._parent)&&Bs.groupParentException()},e}(Ds),Js=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.b)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return ys(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return xs(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ls(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){Gs(this._parent)&&Bs.arrayParentException()},e}(qa);function Gs(t){return!(t instanceof qs||t instanceof Us||t instanceof Js)}var Ks=function(t){function e(e,n,i,o){var a=t.call(this)||this;return a._added=!1,a.update=new r.n,a._parent=e,a._rawValidators=n||[],a._rawAsyncValidators=i||[],a.valueAccessor=function(t,e){if(!e)return null;Array.isArray(e)||ks(t,"Value accessor was not provided as an array for form control with");var n=void 0,r=void 0,i=void 0;return e.forEach(function(e){var o;e.constructor===rs?n=e:(o=e,Cs.some(function(t){return o.constructor===t})?(r&&ks(t,"More than one built-in value accessor matches form control with"),r=e):(i&&ks(t,"More than one custom value accessor matches form control with"),i=e))}),i||r||n||(ks(t,"No valid value accessor for form control with"),null)}(a,o),a}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"isDisabled",{set:function(t){Bs.disabledAttrWarning()},enumerable:!0,configurable:!0}),e.prototype.ngOnChanges=function(t){this._added||this._setUpControl(),function(t,e){if(!t.hasOwnProperty("model"))return!1;var n=t.model;return!!n.isFirstChange()||!Object(r._12)(e,n.currentValue)}(t,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},e.prototype.viewToModelUpdate=function(t){this.viewModel=t,this.update.emit(t)},Object.defineProperty(e.prototype,"path",{get:function(){return ys(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return xs(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return Ls(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){!(this._parent instanceof qs)&&this._parent instanceof Ds?Bs.ngModelGroupException():this._parent instanceof qs||this._parent instanceof Us||this._parent instanceof Js||Bs.controlParentException()},e.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},e}(ls),Xs=function(){function t(){}return Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(t){this._required=null!=t&&!1!==t&&""+t!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),t.prototype.validate=function(t){return this.required?Xa.required(t):null},t.prototype.registerOnValidatorChange=function(t){this._onChange=t},t}(),Zs=function(){function t(){}return t.prototype.group=function(t,e){void 0===e&&(e=null);var n=this._reduceControls(t);return new Rs(n,null!=e?e.validator:null,null!=e?e.asyncValidator:null)},t.prototype.control=function(t,e,n){return new Hs(t,e,n)},t.prototype.array=function(t,e,n){var r=this,i=t.map(function(t){return r._createControl(t)});return new Ns(i,e,n)},t.prototype._reduceControls=function(t){var e=this,n={};return Object.keys(t).forEach(function(r){n[r]=e._createControl(t[r])}),n},t.prototype._createControl=function(t){return t instanceof Hs||t instanceof Rs||t instanceof Ns?t:Array.isArray(t)?this.control(t[0],t.length>1?t[1]:null,t.length>2?t[2]:null):this.control(t)},t}(),Qs=function(){},$s=function(){},tl=function(){};function el(t){if(t.startsWith("400")||t.startsWith("403")){var e=t.split(" - ",2);return 2===e.length?e[1].charAt(0).toUpperCase()+e[1].slice(1):t}return t}function nl(t,e){return function(n){return n.lift(new rl(t,e))}}var rl=function(){function t(t,e){this.project=t,this.resultSelector=e}return t.prototype.call=function(t,e){return e.subscribe(new il(t,this.project,this.resultSelector))},t}(),il=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.resultSelector=r,this.index=0}return Object(o.b)(e,t),e.prototype._next=function(t){var e,n=this.index++;try{e=this.project(t,n)}catch(t){return void this.destination.error(t)}this._innerSub(e,t,n)},e.prototype._innerSub=function(t,e,n){var r=this.innerSubscription;r&&r.unsubscribe(),this.add(this.innerSubscription=Object(qn.a)(this,t,e,n))},e.prototype._complete=function(){var e=this.innerSubscription;e&&!e.closed||t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){this.innerSubscription=null},e.prototype.notifyComplete=function(e){this.remove(e),this.innerSubscription=null,this.isStopped&&t.prototype._complete.call(this)},e.prototype.notifyNext=function(t,e,n,r,i){this.resultSelector?this._tryNotifyNext(t,e,n,r):this.destination.next(e)},e.prototype._tryNotifyNext=function(t,e,n,r){var i;try{i=this.resultSelector(t,e,n,r)}catch(t){return void this.destination.error(t)}this.destination.next(i)},e}(Un.a),ol=function(){function t(t,e){this.delay=t,this.scheduler=e}return t.prototype.call=function(t,e){return e.subscribe(new al(t,this.delay,this.scheduler))},t}(),al=function(t){function e(e,n,r){t.call(this,e),this.delay=n,this.scheduler=r,this.queue=[],this.active=!1,this.errored=!1}return Object(o.b)(e,t),e.dispatch=function(t){for(var e=t.source,n=e.queue,r=t.scheduler,i=t.destination;n.length>0&&n[0].time-r.now()<=0;)n.shift().notification.observe(i);if(n.length>0){var o=Math.max(0,n[0].time-r.now());this.schedule(t,o)}else e.active=!1},e.prototype._schedule=function(t){this.active=!0,this.add(t.schedule(e.dispatch,this.delay,{source:this,destination:this.destination,scheduler:t}))},e.prototype.scheduleNotification=function(t){if(!0!==this.errored){var e=this.scheduler,n=new sl(e.now()+this.delay,t);this.queue.push(n),!1===this.active&&this._schedule(e)}},e.prototype._next=function(t){this.scheduleNotification(Wr.createNext(t))},e.prototype._error=function(t){this.errored=!0,this.queue=[],this.destination.error(t)},e.prototype._complete=function(){this.scheduleNotification(Wr.createComplete())},e}(Zn.a),sl=function(t,e){this.time=t,this.notification=e},ll=function(){};function ul(t){return Error("A hint was already declared for 'align=\""+t+"\"'.")}var cl=0,dl=function(t){function e(e,n,r){var i=t.call(this,e)||this;return i._elementRef=e,i._changeDetectorRef=n,i._showAlwaysAnimate=!1,i._subscriptAnimationState="",i._hintLabel="",i._hintLabelId="mat-hint-"+cl++,i._labelOptions=r||{},i.floatLabel=i._labelOptions.float||"auto",i}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"dividerColor",{get:function(){return this.color},set:function(t){this.color=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(t){this._hideRequiredMarker=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(t){this._hintLabel=t,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(t){this.floatLabel=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(t){t!==this._floatLabel&&(this._floatLabel=t||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),e.prototype.ngAfterContentInit=function(){var t=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(ka(null)).subscribe(function(){t._validatePlaceholders(),t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()});var e=this._control.ngControl;e&&e.valueChanges&&e.valueChanges.subscribe(function(){t._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(ka(null)).subscribe(function(){t._processHints(),t._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(ka(null)).subscribe(function(){t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()})},e.prototype.ngAfterContentChecked=function(){this._validateControlChild()},e.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},e.prototype._shouldForward=function(t){var e=this._control?this._control.ngControl:null;return e&&e[t]},e.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},e.prototype._hasLabel=function(){return!!this._labelChild},e.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},e.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},e.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},e.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},e.prototype._animateAndLockLabel=function(){var t=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",oi(this._label.nativeElement,"transitionend").pipe(Ti(1)).subscribe(function(){t._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},e.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},e.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},e.prototype._validateHints=function(){var t,e,n=this;this._hintChildren&&this._hintChildren.forEach(function(r){if("start"===r.align){if(t||n.hintLabel)throw ul("start");t=r}else if("end"===r.align){if(e)throw ul("end");e=r}})},e.prototype._syncDescribedByIds=function(){if(this._control){var t=[];if("hint"===this._getDisplayedMessages()){var e=this._hintChildren?this._hintChildren.find(function(t){return"start"===t.align}):null,n=this._hintChildren?this._hintChildren.find(function(t){return"end"===t.align}):null;e?t.push(e.id):this._hintLabel&&t.push(this._hintLabelId),n&&t.push(n.id)}else this._errorChildren&&(t=this._errorChildren.map(function(t){return t.id}));this._control.setDescribedByIds(t)}},e.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},e}(Io(function(t){this._elementRef=t},"primary")),hl=function(){},pl="accent",fl="primary",_l=["mat-button","mat-flat-button","mat-icon-button","mat-raised-button","mat-stroked-button","mat-mini-fab","mat-fab"],ml=function(t){function e(e,n,r){var i=t.call(this,e)||this;i._platform=n,i._focusMonitor=r,i._isRoundButton=i._hasHostAttributes("mat-fab","mat-mini-fab"),i._isIconButton=i._hasHostAttributes("mat-icon-button");for(var o=0,a=_l;o1&&!this._multiple)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},t}(),bl=function(){function t(){this._listeners=[]}return t.prototype.notify=function(t,e){for(var n=0,r=this._listeners;n0?this._ngZone.runOutsideAngular(function(){t._debouncer.pipe(lo(t.debounce)).subscribe(function(e){return t.event.emit(e)})}):this._debouncer.subscribe(function(e){return t.event.emit(e)}),this._observer=this._ngZone.runOutsideAngular(function(){return t._mutationObserverFactory.create(function(e){t._debouncer.next(e)})}),this.disabled||this._enable()},t.prototype.ngOnChanges=function(t){t.disabled&&(t.disabled.currentValue?this._disable():this._enable())},t.prototype.ngOnDestroy=function(){this._disable(),this._debouncer.complete()},t.prototype._disable=function(){this._observer&&this._observer.disconnect()},t.prototype._enable=function(){this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},t}(),Cl=function(){},Sl=new r.p("mat-checkbox-click-action"),Tl=0,Dl=function(){var t={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return t[t.Init]="Init",t[t.Checked]="Checked",t[t.Unchecked]="Unchecked",t[t.Indeterminate]="Indeterminate",t}(),Ol=function(t){function e(e,n,i,o,a){var s=t.call(this,e)||this;return s._changeDetectorRef=n,s._focusMonitor=i,s._clickAction=a,s.ariaLabel="",s.ariaLabelledby=null,s._uniqueId="mat-checkbox-"+ ++Tl,s.id=s._uniqueId,s.labelPosition="after",s.name=null,s.change=new r.n,s.indeterminateChange=new r.n,s._onTouched=function(){},s._currentAnimationClass="",s._currentCheckState=Dl.Init,s._controlValueAccessorChangeFn=function(){},s._checked=!1,s._indeterminate=!1,s.tabIndex=parseInt(o)||0,s}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(t){this.labelPosition="start"==t?"after":"before"},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this;this._focusMonitor.monitor(this._inputElement.nativeElement).subscribe(function(e){return t._onInputFocusChange(e)})},e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(e.prototype,"checked",{get:function(){return this._checked},set:function(t){t!=this.checked&&(this._checked=t,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(t){var e=t!=this._indeterminate;this._indeterminate=t,e&&(this._transitionCheckState(this._indeterminate?Dl.Indeterminate:this.checked?Dl.Checked:Dl.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),e.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},e.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},e.prototype.writeValue=function(t){this.checked=!!t},e.prototype.registerOnChange=function(t){this._controlValueAccessorChangeFn=t},e.prototype.registerOnTouched=function(t){this._onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck()},e.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},e.prototype._transitionCheckState=function(t){var e=this._currentCheckState,n=this._elementRef.nativeElement;e!==t&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(e,t),this._currentCheckState=t,this._currentAnimationClass.length>0&&n.classList.add(this._currentAnimationClass))},e.prototype._emitChangeEvent=function(){var t=new function(){};t.source=this,t.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(t)},e.prototype._onInputFocusChange=function(t){this._focusRipple||"keyboard"!==t?t||(this._removeFocusRipple(),this._onTouched()):this._focusRipple=this.ripple.launch(0,0,{persistent:!0})},e.prototype.toggle=function(){this.checked=!this.checked},e.prototype._onInputClick=function(t){var e=this;t.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){e._indeterminate=!1,e.indeterminateChange.emit(e._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?Dl.Checked:Dl.Unchecked),this._emitChangeEvent())},e.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},e.prototype._onInteractionEvent=function(t){t.stopPropagation()},e.prototype._getAnimationClassForCheckStateTransition=function(t,e){var n="";switch(t){case Dl.Init:if(e===Dl.Checked)n="unchecked-checked";else{if(e!=Dl.Indeterminate)return"";n="unchecked-indeterminate"}break;case Dl.Unchecked:n=e===Dl.Checked?"unchecked-checked":"unchecked-indeterminate";break;case Dl.Checked:n=e===Dl.Unchecked?"checked-unchecked":"checked-indeterminate";break;case Dl.Indeterminate:n=e===Dl.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+n},e.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},e}(Ro(Io(Ho(Ao(function(t){this._elementRef=t})),"accent"))),Yl=function(){};function Pl(t){return function(e){return e.lift(new El(t))}}var El=function(){function t(t){this.notifier=t}return t.prototype.call=function(t,e){return e.subscribe(new jl(t,this.notifier))},t}(),jl=function(t){function e(e,n){t.call(this,e),this.notifier=n,this.add(Object(qn.a)(this,n))}return Object(o.b)(e,t),e.prototype.notifyNext=function(t,e,n,r,i){this.complete()},e.prototype.notifyComplete=function(){},e}(Un.a),Al=function(){},Il=function(){},Hl=function(){},Rl=function(){},Nl=function(){},Fl=function(){function t(t){this.callback=t}return t.prototype.call=function(t,e){return e.subscribe(new Vl(t,this.callback))},t}(),Vl=function(t){function e(e,n){t.call(this,e),this.add(new Cr.a(n))}return Object(o.b)(e,t),e}(Zn.a),zl=n("3a3m");function Wl(t,e){return function(t,e){return Object(Mr.a)(t,e,1)}(t,e)(this)}var Bl=function(){},Ul=function(){},ql=function(){function t(t){var e=this;this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?function(){e.headers=new Map,t.split("\n").forEach(function(t){var n=t.indexOf(":");if(n>0){var r=t.slice(0,n),i=r.toLowerCase(),o=t.slice(n+1).trim();e.maybeSetNormalizedName(r,i),e.headers.has(i)?e.headers.get(i).push(o):e.headers.set(i,[o])}})}:function(){e.headers=new Map,Object.keys(t).forEach(function(n){var r=t[n],i=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(e.headers.set(i,r),e.maybeSetNormalizedName(n,i))})}:this.headers=new Map}return t.prototype.has=function(t){return this.init(),this.headers.has(t.toLowerCase())},t.prototype.get=function(t){this.init();var e=this.headers.get(t.toLowerCase());return e&&e.length>0?e[0]:null},t.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},t.prototype.getAll=function(t){return this.init(),this.headers.get(t.toLowerCase())||null},t.prototype.append=function(t,e){return this.clone({name:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({name:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({name:t,value:e,op:"d"})},t.prototype.maybeSetNormalizedName=function(t,e){this.normalizedNames.has(e)||this.normalizedNames.set(e,t)},t.prototype.init=function(){var e=this;this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(t){return e.applyUpdate(t)}),this.lazyUpdate=null))},t.prototype.copyFrom=function(t){var e=this;t.init(),Array.from(t.headers.keys()).forEach(function(n){e.headers.set(n,t.headers.get(n)),e.normalizedNames.set(n,t.normalizedNames.get(n))})},t.prototype.clone=function(e){var n=new t;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([e]),n},t.prototype.applyUpdate=function(t){var e=t.name.toLowerCase();switch(t.op){case"a":case"s":var n=t.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(t.name,e);var r=("a"===t.op?this.headers.get(e):void 0)||[];r.push.apply(r,n),this.headers.set(e,r);break;case"d":var i=t.value;if(i){var o=this.headers.get(e);if(!o)return;0===(o=o.filter(function(t){return-1===i.indexOf(t)})).length?(this.headers.delete(e),this.normalizedNames.delete(e)):this.headers.set(e,o)}else this.headers.delete(e),this.normalizedNames.delete(e)}},t.prototype.forEach=function(t){var e=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return t(e.normalizedNames.get(n),e.headers.get(n))})},t}(),Jl=function(){function t(){}return t.prototype.encodeKey=function(t){return Gl(t)},t.prototype.encodeValue=function(t){return Gl(t)},t.prototype.decodeKey=function(t){return decodeURIComponent(t)},t.prototype.decodeValue=function(t){return decodeURIComponent(t)},t}();function Gl(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Kl=function(){function t(t){void 0===t&&(t={});var e,n,r,i=this;if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new Jl,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(e=t.fromString,n=this.encoder,r=new Map,e.length>0&&e.split("&").forEach(function(t){var e=t.indexOf("="),i=-1==e?[n.decodeKey(t),""]:[n.decodeKey(t.slice(0,e)),n.decodeValue(t.slice(e+1))],o=i[0],a=i[1],s=r.get(o)||[];s.push(a),r.set(o,s)}),r)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(function(e){var n=t.fromObject[e];i.map.set(e,Array.isArray(n)?n:[n])})):this.map=null}return t.prototype.has=function(t){return this.init(),this.map.has(t)},t.prototype.get=function(t){this.init();var e=this.map.get(t);return e?e[0]:null},t.prototype.getAll=function(t){return this.init(),this.map.get(t)||null},t.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},t.prototype.append=function(t,e){return this.clone({param:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({param:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({param:t,value:e,op:"d"})},t.prototype.toString=function(){var t=this;return this.init(),this.keys().map(function(e){var n=t.encoder.encodeKey(e);return t.map.get(e).map(function(e){return n+"="+t.encoder.encodeValue(e)}).join("&")}).join("&")},t.prototype.clone=function(e){var n=new t({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([e]),n},t.prototype.init=function(){var t=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(e){return t.map.set(e,t.cloneFrom.map.get(e))}),this.updates.forEach(function(e){switch(e.op){case"a":case"s":var n=("a"===e.op?t.map.get(e.param):void 0)||[];n.push(e.value),t.map.set(e.param,n);break;case"d":if(void 0===e.value){t.map.delete(e.param);break}var r=t.map.get(e.param)||[],i=r.indexOf(e.value);-1!==i&&r.splice(i,1),r.length>0?t.map.set(e.param,r):t.map.delete(e.param)}}),this.cloneFrom=null)},t}();function Xl(t){return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer}function Zl(t){return"undefined"!=typeof Blob&&t instanceof Blob}function Ql(t){return"undefined"!=typeof FormData&&t instanceof FormData}var $l=function(){function t(t,e,n,r){var i;if(this.url=e,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==n?n:null,i=r):i=n,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.params&&(this.params=i.params)),this.headers||(this.headers=new ql),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=e;else{var a=e.indexOf("?");this.urlWithParams=e+(-1===a?"?":a=200&&this.status<300}}(),nu=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=tu.ResponseHeader,n}return Object(o.b)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(eu),ru=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=tu.Response,n.body=void 0!==e.body?e.body:null,n}return Object(o.b)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(eu),iu=function(t){function e(e){var n=t.call(this,e,0,"Unknown Error")||this;return n.name="HttpErrorResponse",n.ok=!1,n.message=n.status>=200&&n.status<300?"Http failure during parsing for "+(e.url||"(unknown url)"):"Http failure response for "+(e.url||"(unknown url)")+": "+e.status+" "+e.statusText,n.error=e.error||null,n}return Object(o.b)(e,t),e}(eu);function ou(t,e){return{body:e,headers:t.headers,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials}}var au=function(){function t(t){this.handler=t}return t.prototype.request=function(t,e,n){var r,i=this;if(void 0===n&&(n={}),t instanceof $l)r=t;else{var o;o=n.headers instanceof ql?n.headers:new ql(n.headers);var a=void 0;n.params&&(a=n.params instanceof Kl?n.params:new Kl({fromObject:n.params})),r=new $l(t,e,void 0!==n.body?n.body:null,{headers:o,params:a,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials})}var s=Wl.call(ur(r),function(t){return i.handler.handle(t)});if(t instanceof $l||"events"===n.observe)return s;var l=gr.call(s,function(t){return t instanceof ru});switch(n.observe||"body"){case"body":switch(r.responseType){case"arraybuffer":return er.call(l,function(t){if(null!==t.body&&!(t.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return t.body});case"blob":return er.call(l,function(t){if(null!==t.body&&!(t.body instanceof Blob))throw new Error("Response is not a Blob.");return t.body});case"text":return er.call(l,function(t){if(null!==t.body&&"string"!=typeof t.body)throw new Error("Response is not a string.");return t.body});case"json":default:return er.call(l,function(t){return t.body})}case"response":return l;default:throw new Error("Unreachable: unhandled observe type "+n.observe+"}")}},t.prototype.delete=function(t,e){return void 0===e&&(e={}),this.request("DELETE",t,e)},t.prototype.get=function(t,e){return void 0===e&&(e={}),this.request("GET",t,e)},t.prototype.head=function(t,e){return void 0===e&&(e={}),this.request("HEAD",t,e)},t.prototype.jsonp=function(t,e){return this.request("JSONP",t,{params:(new Kl).append(e,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},t.prototype.options=function(t,e){return void 0===e&&(e={}),this.request("OPTIONS",t,e)},t.prototype.patch=function(t,e,n){return void 0===n&&(n={}),this.request("PATCH",t,ou(n,e))},t.prototype.post=function(t,e,n){return void 0===n&&(n={}),this.request("POST",t,ou(n,e))},t.prototype.put=function(t,e,n){return void 0===n&&(n={}),this.request("PUT",t,ou(n,e))},t}(),su=function(){function t(t,e){this.next=t,this.interceptor=e}return t.prototype.handle=function(t){return this.interceptor.intercept(t,this.next)},t}(),lu=new r.p("HTTP_INTERCEPTORS"),uu=function(){function t(){}return t.prototype.intercept=function(t,e){return e.handle(t)},t}(),cu=/^\)\]\}',?\n/,du=function(){},hu=function(){function t(){}return t.prototype.build=function(){return new XMLHttpRequest},t}(),pu=function(){function t(t){this.xhrFactory=t}return t.prototype.handle=function(t){var e=this;if("JSONP"===t.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new a.a(function(n){var r=e.xhrFactory.build();if(r.open(t.method,t.urlWithParams),t.withCredentials&&(r.withCredentials=!0),t.headers.forEach(function(t,e){return r.setRequestHeader(t,e.join(","))}),t.headers.has("Accept")||r.setRequestHeader("Accept","application/json, text/plain, */*"),!t.headers.has("Content-Type")){var i=t.detectContentTypeHeader();null!==i&&r.setRequestHeader("Content-Type",i)}if(t.responseType){var o=t.responseType.toLowerCase();r.responseType="json"!==o?o:"text"}var a=t.serializeBody(),s=null,l=function(){if(null!==s)return s;var e=1223===r.status?204:r.status,n=r.statusText||"OK",i=new ql(r.getAllResponseHeaders()),o=function(t){return"responseURL"in t&&t.responseURL?t.responseURL:/^X-Request-URL:/m.test(t.getAllResponseHeaders())?t.getResponseHeader("X-Request-URL"):null}(r)||t.url;return s=new nu({headers:i,status:e,statusText:n,url:o})},u=function(){var e=l(),i=e.headers,o=e.status,a=e.statusText,s=e.url,u=null;204!==o&&(u="undefined"==typeof r.response?r.responseText:r.response),0===o&&(o=u?200:0);var c=o>=200&&o<300;if("json"===t.responseType&&"string"==typeof u){var d=u;u=u.replace(cu,"");try{u=""!==u?JSON.parse(u):null}catch(t){u=d,c&&(c=!1,u={error:t,text:u})}}c?(n.next(new ru({body:u,headers:i,status:o,statusText:a,url:s||void 0})),n.complete()):n.error(new iu({error:u,headers:i,status:o,statusText:a,url:s||void 0}))},c=function(t){var e=new iu({error:t,status:r.status||0,statusText:r.statusText||"Unknown Error"});n.error(e)},d=!1,h=function(e){d||(n.next(l()),d=!0);var i={type:tu.DownloadProgress,loaded:e.loaded};e.lengthComputable&&(i.total=e.total),"text"===t.responseType&&r.responseText&&(i.partialText=r.responseText),n.next(i)},p=function(t){var e={type:tu.UploadProgress,loaded:t.loaded};t.lengthComputable&&(e.total=t.total),n.next(e)};return r.addEventListener("load",u),r.addEventListener("error",c),t.reportProgress&&(r.addEventListener("progress",h),null!==a&&r.upload&&r.upload.addEventListener("progress",p)),r.send(a),n.next({type:tu.Sent}),function(){r.removeEventListener("error",c),r.removeEventListener("load",u),t.reportProgress&&(r.removeEventListener("progress",h),null!==a&&r.upload&&r.upload.removeEventListener("progress",p)),r.abort()}})},t}(),fu=new r.p("XSRF_COOKIE_NAME"),_u=new r.p("XSRF_HEADER_NAME"),mu=function(){},gu=function(){function t(t,e,n){this.doc=t,this.platform=e,this.cookieName=n,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return t.prototype.getToken=function(){if("server"===this.platform)return null;var t=this.doc.cookie||"";return t!==this.lastCookieString&&(this.parseCount++,this.lastToken=j(t,this.cookieName),this.lastCookieString=t),this.lastToken},t}(),yu=function(){function t(t,e){this.tokenService=t,this.headerName=e}return t.prototype.intercept=function(t,e){var n=t.url.toLowerCase();if("GET"===t.method||"HEAD"===t.method||n.startsWith("http://")||n.startsWith("https://"))return e.handle(t);var r=this.tokenService.getToken();return null===r||t.headers.has(this.headerName)||(t=t.clone({headers:t.headers.set(this.headerName,r)})),e.handle(t)},t}(),vu=function(){function t(t,e){this.backend=t,this.injector=e,this.chain=null}return t.prototype.handle=function(t){if(null===this.chain){var e=this.injector.get(lu,[]);this.chain=e.reduceRight(function(t,e){return new su(t,e)},this.backend)}return this.chain.handle(t)},t}(),bu=function(){function t(){}return t.disable=function(){return{ngModule:t,providers:[{provide:yu,useClass:uu}]}},t.withOptions=function(e){return void 0===e&&(e={}),{ngModule:t,providers:[e.cookieName?{provide:fu,useValue:e.cookieName}:[],e.headerName?{provide:_u,useValue:e.headerName}:[]]}},t}(),wu=function(){};function Mu(t){return Error('Unable to find icon with the name "'+t+'"')}function ku(t){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+t+'".')}var xu=function(t){this.url=t,this.svgElement=null},Lu=function(){function t(t,e,n){this._httpClient=t,this._sanitizer=e,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons",this._document=n}return t.prototype.addSvgIcon=function(t,e){return this.addSvgIconInNamespace("",t,e)},t.prototype.addSvgIconInNamespace=function(t,e,n){var r=Tu(t,e);return this._svgIconConfigs.set(r,new xu(n)),this},t.prototype.addSvgIconSet=function(t){return this.addSvgIconSetInNamespace("",t)},t.prototype.addSvgIconSetInNamespace=function(t,e){var n=new xu(e),r=this._iconSetConfigs.get(t);return r?r.push(n):this._iconSetConfigs.set(t,[n]),this},t.prototype.registerFontClassAlias=function(t,e){return void 0===e&&(e=t),this._fontCssClassesByAlias.set(t,e),this},t.prototype.classNameForFontAlias=function(t){return this._fontCssClassesByAlias.get(t)||t},t.prototype.setDefaultFontSetClass=function(t){return this._defaultFontSetClass=t,this},t.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},t.prototype.getSvgIconFromUrl=function(t){var e=this,n=this._sanitizer.sanitize(r.G.RESOURCE_URL,t);if(!n)throw ku(t);var i=this._cachedIconsByUrl.get(n);return i?ur(Su(i)):this._loadSvgIconFromConfig(new xu(t)).pipe(cr(function(t){return e._cachedIconsByUrl.set(n,t)}),Qn(function(t){return Su(t)}))},t.prototype.getNamedSvgIcon=function(t,e){void 0===e&&(e="");var n=Tu(e,t),r=this._svgIconConfigs.get(n);if(r)return this._getSvgFromConfig(r);var i=this._iconSetConfigs.get(e);return i?this._getSvgFromIconSetConfigs(t,i):Bn(Mu(n))},t.prototype._getSvgFromConfig=function(t){return t.svgElement?ur(Su(t.svgElement)):this._loadSvgIconFromConfig(t).pipe(cr(function(e){return t.svgElement=e}),Qn(function(t){return Su(t)}))},t.prototype._getSvgFromIconSetConfigs=function(t,e){var n=this,i=this._extractIconWithNameFromAnySet(t,e);if(i)return ur(i);var o=e.filter(function(t){return!t.svgElement}).map(function(t){return n._loadSvgIconSetFromConfig(t).pipe(Jn(function(e){var i=n._sanitizer.sanitize(r.G.RESOURCE_URL,t.url);return console.log("Loading icon set URL: "+i+" failed: "+e),ur(null)}))});return sr(o).pipe(Qn(function(){var r=n._extractIconWithNameFromAnySet(t,e);if(!r)throw Mu(t);return r}))},t.prototype._extractIconWithNameFromAnySet=function(t,e){for(var n=e.length-1;n>=0;n--){var r=e[n];if(r.svgElement){var i=this._extractSvgIconFromSet(r.svgElement,t);if(i)return i}}return null},t.prototype._loadSvgIconFromConfig=function(t){var e=this;return this._fetchUrl(t.url).pipe(Qn(function(t){return e._createSvgElementForSingleIcon(t)}))},t.prototype._loadSvgIconSetFromConfig=function(t){var e=this;return t.svgElement?ur(t.svgElement):this._fetchUrl(t.url).pipe(Qn(function(n){return t.svgElement||(t.svgElement=e._svgElementFromString(n)),t.svgElement}))},t.prototype._createSvgElementForSingleIcon=function(t){var e=this._svgElementFromString(t);return this._setSvgAttributes(e),e},t.prototype._extractSvgIconFromSet=function(t,e){var n=t.querySelector("#"+e);if(!n)return null;var r=n.cloneNode(!0);if(r.id="","svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r));var i=this._svgElementFromString("");return i.appendChild(r),this._setSvgAttributes(i)},t.prototype._svgElementFromString=function(t){if(this._document||"undefined"!=typeof document){var e=(this._document||document).createElement("DIV");e.innerHTML=t;var n=e.querySelector("svg");if(!n)throw Error(" tag not found");return n}throw new Error("MatIconRegistry could not resolve document.")},t.prototype._toSvgElement=function(t){for(var e=this._svgElementFromString(""),n=0;n')}(),this._xPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"yPosition",{get:function(){return this._yPosition},set:function(t){"above"!==t&&"below"!==t&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(t){this._overlapTrigger=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"panelClass",{set:function(t){t&&t.length&&(this._classList=t.split(" ").reduce(function(t,e){return t[e]=!0,t},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"classList",{get:function(){return this.panelClass},set:function(t){this.panelClass=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._keyManager=new Co(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return t.close.emit("keydown")})},t.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},t.prototype._hovered=function(){var t=this;return this.items?this.items.changes.pipe(ka(this.items),nl(function(t){return ui.a.apply(void 0,t.map(function(t){return t._hovered}))})):this._ngZone.onStable.asObservable().pipe(Ti(1),nl(function(){return t._hovered()}))},t.prototype._handleKeydown=function(t){switch(t.keyCode){case ji:this.closed.emit("keydown"),t.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(t)}},t.prototype.focusFirstItem=function(t){var e=this;void 0===t&&(t="program"),this.lazyContent?this._ngZone.onStable.asObservable().pipe(Ti(1)).subscribe(function(){return e._keyManager.setFocusOrigin(t).setFirstItemActive()}):this._keyManager.setFocusOrigin(t).setFirstItemActive()},t.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},t.prototype.setPositionClasses=function(t,e){void 0===t&&(t=this.xPosition),void 0===e&&(e=this.yPosition),this._classList["mat-menu-before"]="before"===t,this._classList["mat-menu-after"]="after"===t,this._classList["mat-menu-above"]="above"===e,this._classList["mat-menu-below"]="below"===e},t.prototype.setElevation=function(t){var e="mat-elevation-z"+(2+t),n=Object.keys(this._classList).find(function(t){return t.startsWith("mat-elevation-z")});n&&n!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[e]=!0,this._previousElevation=e)},t.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},t.prototype._resetAnimation=function(){this._panelAnimationState="void"},t.prototype._onAnimationDone=function(t){"enter-start"===t.toState&&(this._panelAnimationState="enter")},t}(),Au=new r.p("mat-menu-scroll-strategy");function Iu(t){return function(){return t.scrollStrategies.reposition()}}var Hu=function(){function t(t,e,n,i,o,a,s,l){this._overlay=t,this._element=e,this._viewContainerRef=n,this._scrollStrategy=i,this._parentMenu=o,this._menuItemInstance=a,this._dir=s,this._focusMonitor=l,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=Cr.a.EMPTY,this._hoverSubscription=Cr.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new r.n,this.onMenuOpen=this.menuOpened,this.menuClosed=new r.n,this.onMenuClose=this.menuClosed,a&&(a._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(t.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(t){this.menu=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._checkMenu(),this.menu.close.subscribe(function(e){t._destroyMenu(),"click"===e&&t._parentMenu&&t._parentMenu.closed.emit(e)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(fr(function(e){return e===t._menuItemInstance})).subscribe(function(){t._openedByMouse=!0,t.openMenu()}))},t.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(t.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},t.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},t.prototype.openMenu=function(){var t=this;this._menuOpen||(this._createOverlay().attach(this._portal),this.menu.lazyContent&&this.menu.lazyContent.attach(this.menuData),this._closeSubscription=this._menuClosingActions().subscribe(function(){return t.closeMenu()}),this._initMenu(),this.menu instanceof ju&&this.menu._startAnimation())},t.prototype.closeMenu=function(){this.menu.close.emit()},t.prototype.focus=function(t){void 0===t&&(t="program"),this._focusMonitor?this._focusMonitor.focusVia(this._element.nativeElement,t):this._element.nativeElement.focus()},t.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof ju&&this.menu._resetAnimation())},t.prototype._initMenu=function(){this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this.menu.focusFirstItem(this._openedByMouse?"mouse":"program")},t.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var t=0,e=this.menu.parentMenu;e;)t++,e=e.parentMenu;this.menu.setElevation(t)}},t.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse?this.triggersSubmenu()||this.focus("mouse"):this.focus(),this._openedByMouse=!1},t.prototype._setIsMenuOpen=function(t){this._menuOpen=t,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=t)},t.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},t.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new wi(this.menu.templateRef,this._viewContainerRef);var t=this._getOverlayConfig();this._subscribeToPositions(t.positionStrategy),this._overlayRef=this._overlay.create(t)}return this._overlayRef},t.prototype._getOverlayConfig=function(){return new Ii({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},t.prototype._subscribeToPositions=function(t){var e=this;t.onPositionChange.subscribe(function(t){e.menu.setPositionClasses("start"===t.connectionPair.overlayX?"after":"before","top"===t.connectionPair.overlayY?"below":"above")})},t.prototype._getPosition=function(){var t="before"===this.menu.xPosition?["end","start"]:["start","end"],e=t[0],n=t[1],r="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],i=r[0],o=r[1],a=[i,o],s=a[0],l=a[1],u=[e,n],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=e="before"===this.menu.xPosition?"start":"end",n=c="end"===e?"start":"end",h="bottom"===i?8:-8):this.menu.overlapTrigger||(s="top"===i?"bottom":"top",l="top"===o?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:e,originY:s},{overlayX:c,overlayY:i}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:n,originY:s},{overlayX:d,overlayY:i}).withFallbackPosition({originX:e,originY:l},{overlayX:c,overlayY:o},void 0,-h).withFallbackPosition({originX:n,originY:l},{overlayX:d,overlayY:o},void 0,-h)},t.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},t.prototype._menuClosingActions=function(){var t=this,e=this._overlayRef.backdropClick(),n=this._overlayRef.detachments(),r=this._parentMenu?this._parentMenu.close:ur(),i=this._parentMenu?this._parentMenu._hovered().pipe(fr(function(e){return e!==t._menuItemInstance}),fr(function(){return t._menuOpen})):ur();return Object(ui.a)(e,r,i,n)},t.prototype._handleMousedown=function(t){(function(t){return 0===t.buttons})(t)||(this._openedByMouse=!0,this.triggersSubmenu()&&t.preventDefault())},t.prototype._handleKeydown=function(t){var e=t.keyCode;this.triggersSubmenu()&&(39===e&&"ltr"===this.dir||37===e&&"rtl"===this.dir)&&this.openMenu()},t.prototype._handleClick=function(t){this.triggersSubmenu()?(t.stopPropagation(),this.openMenu()):this.toggleMenu()},t}(),Ru=function(){},Nu=0,Fu=new r.p("mat-select-scroll-strategy");function Vu(t){return function(){return t.scrollStrategies.reposition()}}var zu=function(t){function e(e,n,i,o,a,s,l,u,c,d,h,p){var f=t.call(this,a,o,l,u,d)||this;return f._viewportRuler=e,f._changeDetectorRef=n,f._ngZone=i,f._dir=s,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(t,e){return t===e},f._uid="mat-select-"+Nu++,f._destroy=new Fr.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=aa(function(){return f.options?ui.a.apply(void 0,f.options.map(function(t){return t.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Ti(1),nl(function(){return f.optionSelectionChanges}))}),f.openedChange=new r.n,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new r.n,f.change=f.selectionChange,f.valueChange=new r.n,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"placeholder",{get:function(){return this._placeholder},set:function(t){this._placeholder=t,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Yi(t),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"multiple",{get:function(){return this._multiple},set:function(t){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"compareWith",{get:function(){return this._compareWith},set:function(t){if("function"!=typeof t)throw Error("`compareWith` must be a function.");this._compareWith=t,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(t){t!==this._value&&(this.writeValue(t),this._value=t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},set:function(t){this._id=t||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(fr(function(t){return t}),Qn(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(fr(function(t){return!t}),Qn(function(){}))},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._selectionModel=new vl(this.multiple,void 0,!1),this.stateChanges.next()},e.prototype.ngAfterContentInit=function(){var t=this;this._initKeyManager(),this.options.changes.pipe(ka(null),Pl(this._destroy)).subscribe(function(){t._resetOptions(),t._initializeSelection()})},e.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},e.prototype.ngOnChanges=function(t){t.disabled&&this.stateChanges.next()},e.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},e.prototype.toggle=function(){this.panelOpen?this.close():this.open()},e.prototype.open=function(){var t=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Ti(1)).subscribe(function(){t._triggerFontSize&&t.overlayDir.overlayRef&&t.overlayDir.overlayRef.overlayElement&&(t.overlayDir.overlayRef.overlayElement.style.fontSize=t._triggerFontSize+"px")}))},e.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched())},e.prototype.writeValue=function(t){this.options&&this._setSelectionByValue(t)},e.prototype.registerOnChange=function(t){this._onChange=t},e.prototype.registerOnTouched=function(t){this._onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(e.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var t=this._selectionModel.selected.map(function(t){return t.viewValue});return this._isRtl()&&t.reverse(),t.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),e.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},e.prototype._handleKeydown=function(t){this.disabled||(this.panelOpen?this._handleOpenKeydown(t):this._handleClosedKeydown(t))},e.prototype._handleClosedKeydown=function(t){var e=t.keyCode;13===e||32===e||(this.multiple||t.altKey)&&(40===e||38===e||37===e||39===e)?(t.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(t)},e.prototype._handleOpenKeydown=function(t){var e=t.keyCode,n=40===e||38===e,r=this._keyManager;if(36===e||35===e)t.preventDefault(),36===e?r.setFirstItemActive():r.setLastItemActive();else if(n&&t.altKey)t.preventDefault(),this.close();else if(13!==e&&32!==e||!r.activeItem){var i=r.activeItemIndex;r.onKeydown(t),this._multiple&&n&&t.shiftKey&&r.activeItem&&r.activeItemIndex!==i&&r.activeItem._selectViaInteraction()}else t.preventDefault(),r.activeItem._selectViaInteraction()},e.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},e.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},e.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},e.prototype._onBlur=function(){this.focused=!1,this.disabled||this.panelOpen||(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},e.prototype._onAttached=function(){var t=this;this.overlayDir.positionChange.pipe(Ti(1)).subscribe(function(){t._changeDetectorRef.detectChanges(),t._calculateOverlayOffsetX(),t.panel.nativeElement.scrollTop=t._scrollTop})},e.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(e.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),e.prototype._initializeSelection=function(){var t=this;Promise.resolve().then(function(){t._setSelectionByValue(t.ngControl?t.ngControl.value:t._value)})},e.prototype._setSelectionByValue=function(t,e){var n=this;if(void 0===e&&(e=!1),this.multiple&&t){if(!Array.isArray(t))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),t.forEach(function(t){return n._selectValue(t,e)}),this._sortValues()}else{this._clearSelection();var r=this._selectValue(t,e);r&&this._keyManager.setActiveItem(this.options.toArray().indexOf(r))}this._changeDetectorRef.markForCheck()},e.prototype._selectValue=function(t,e){var n=this;void 0===e&&(e=!1);var i=this.options.find(function(e){try{return null!=e.value&&n._compareWith(e.value,t)}catch(t){return Object(r.U)()&&console.warn(t),!1}});return i&&(e?i._selectViaInteraction():i.select(),this._selectionModel.select(i),this.stateChanges.next()),i},e.prototype._clearSelection=function(t){this._selectionModel.clear(),this.options.forEach(function(e){e!==t&&e.deselect()}),this.stateChanges.next()},e.prototype._initKeyManager=function(){var t=this;this._keyManager=new Lo(this.options).withTypeAhead().withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._keyManager.tabOut.pipe(Pl(this._destroy)).subscribe(function(){return t.close()}),this._keyManager.change.pipe(Pl(this._destroy)).subscribe(function(){t._panelOpen&&t.panel?t._scrollActiveOptionIntoView():t._panelOpen||t.multiple||!t._keyManager.activeItem||t._keyManager.activeItem._selectViaInteraction()})},e.prototype._resetOptions=function(){var t=this,e=Object(ui.a)(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(Pl(e),fr(function(t){return t.isUserInput})).subscribe(function(e){t._onSelect(e.source),!t.multiple&&t._panelOpen&&(t.close(),t.focus())}),ui.a.apply(void 0,this.options.map(function(t){return t._stateChanges})).pipe(Pl(e)).subscribe(function(){t._changeDetectorRef.markForCheck(),t.stateChanges.next()}),this._setOptionIds()},e.prototype._onSelect=function(t){var e=this._selectionModel.isSelected(t);this.multiple?(this._selectionModel.toggle(t),this.stateChanges.next(),e?t.deselect():t.select(),this._keyManager.setActiveItem(this._getOptionIndex(t)),this._sortValues()):(this._clearSelection(null==t.value?void 0:t),null==t.value?this._propagateChanges(t.value):(this._selectionModel.select(t),this.stateChanges.next())),e!==this._selectionModel.isSelected(t)&&this._propagateChanges()},e.prototype._sortValues=function(){var t=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(e){e.selected&&t._selectionModel.select(e)}),this.stateChanges.next())},e.prototype._propagateChanges=function(t){var e;e=this.multiple?this.selected.map(function(t){return t.value}):this.selected?this.selected.value:t,this._value=e,this.valueChange.emit(e),this._onChange(e),this.selectionChange.emit(new function(t,e){this.source=t,this.value=e}(this,e)),this._changeDetectorRef.markForCheck()},e.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(t){return t.id}).join(" ")},e.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},e.prototype._scrollActiveOptionIntoView=function(){var t,e,n,r=this._keyManager.activeItemIndex||0,i=na(r,this.options,this.optionGroups);this.panel.nativeElement.scrollTop=(256,(n=(r+i)*(t=this._getItemHeight()))<(e=this.panel.nativeElement.scrollTop)?n:n+t>e+256?Math.max(0,n-256+t):e)},e.prototype.focus=function(){this._elementRef.nativeElement.focus()},e.prototype._getOptionIndex=function(t){return this.options.reduce(function(e,n,r){return void 0===e?t===n?r:void 0:e},void 0)},e.prototype._calculateOverlayPosition=function(){var t=this._getItemHeight(),e=this._getItemCount(),n=Math.min(e*t,256),r=e*t-n,i=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);i+=na(i,this.options,this.optionGroups);var o=n/2;this._scrollTop=this._calculateOverlayScroll(i,o,r),this._offsetY=this._calculateOverlayOffsetY(i,o,r),this._checkOverlayWithinViewport(r)},e.prototype._calculateOverlayScroll=function(t,e,n){var r=this._getItemHeight();return Math.min(Math.max(0,r*t-e+r/2),n)},Object.defineProperty(e.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),e.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},e.prototype._calculateOverlayOffsetX=function(){var t,e=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),r=this._isRtl(),i=this.multiple?60:32;if(this.multiple)t=44;else{var o=this._selectionModel.selected[0]||this.options.first;t=o&&o.group?32:16}r||(t*=-1);var a=0-(e.left+t-(r?i:0)),s=e.right+t-n.width+(r?0:i);a>0?t+=a+8:s>0&&(t-=s+8),this.overlayDir.offsetX=t,this.overlayDir.overlayRef.updatePosition()},e.prototype._calculateOverlayOffsetY=function(t,e,n){var r=this._getItemHeight(),i=(r-this._triggerRect.height)/2,o=Math.floor(256/r);return-1*(0===this._scrollTop?t*r:this._scrollTop===n?(t-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-256)%r):e-r/2)-i},e.prototype._checkOverlayWithinViewport=function(t){var e=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),r=this._triggerRect.top-8,i=n.height-this._triggerRect.bottom-8,o=Math.abs(this._offsetY),a=Math.min(this._getItemCount()*e,256)-o-this._triggerRect.height;a>i?this._adjustPanelUp(a,i):o>r?this._adjustPanelDown(o,r,t):this._transformOrigin=this._getOriginBasedOnOption()},e.prototype._adjustPanelUp=function(t,e){var n=Math.round(t-e);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},e.prototype._adjustPanelDown=function(t,e,n){var r=Math.round(t-e);if(this._scrollTop+=r,this._offsetY+=r,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")},e.prototype._getOriginBasedOnOption=function(){var t=this._getItemHeight(),e=(t-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-e+t/2)+"px 0px"},e.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},e.prototype._getItemHeight=function(){return 3*this._triggerFontSize},e.prototype.setDescribedByIds=function(t){this._ariaDescribedby=t.join(" ")},e.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(e.prototype,"shouldPlaceholderFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),e}(Ho(Ro(Ao(function(t){return function(t){function e(){for(var e=[],n=0;n0&&i.afterOpened().subscribe(function(){return i._dismissAfter(r.duration)}),r.announcementMessage&&this._live.announce(r.announcementMessage,r.politeness),this._openedSnackBarRef=i,this._openedSnackBarRef},t.prototype.open=function(t,e,n){void 0===e&&(e="");var r=wc(n);return r.data={message:t,action:e},r.announcementMessage=t,this.openFromComponent(yc,r)},t.prototype.dismiss=function(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()},t.prototype._attachSnackBarContainer=function(t,e){var n=new bi(vc,e.viewContainerRef),r=t.attach(n);return r.instance.snackBarConfig=e,r.instance},t.prototype._attach=function(t,e){var n=this._createOverlay(e),r=this._attachSnackBarContainer(n,e),i=new _c(r,n),o=this._createInjector(e,i),a=new bi(t,void 0,o),s=r.attachComponentPortal(a);return i.instance=s.instance,this._breakpointObserver.observe(Qu.Handset).pipe(Pl(n.detachments().pipe(Ti(1)))).subscribe(function(t){t.matches?n.overlayElement.classList.add("mat-snack-bar-handset"):n.overlayElement.classList.remove("mat-snack-bar-handset")}),i},t.prototype._createOverlay=function(t){var e=new Ii;e.direction=t.direction;var n=this._overlay.position().global(),r="rtl"===t.direction,i="left"===t.horizontalPosition||"start"===t.horizontalPosition&&!r||"end"===t.horizontalPosition&&r,o=!i&&"center"!==t.horizontalPosition;return i?n.left("0"):o?n.right("0"):n.centerHorizontally(),"top"===t.verticalPosition?n.top("0"):n.bottom("0"),e.positionStrategy=n,this._overlay.create(e)},t.prototype._createInjector=function(t,e){var n=t&&t.viewContainerRef&&t.viewContainerRef.injector,r=new WeakMap;return r.set(_c,e),r.set(mc,t.data),new Ci(n||this._injector,r)},t}();function wc(t){return Object(o.a)({},new gc,t)}var Mc=function(){},kc=function(t){function e(e){t.call(this),this._value=e}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),e.prototype._subscribe=function(e){var n=t.prototype._subscribe.call(this,e);return n&&!n.closed&&e.next(this._value),n},e.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new qr.a;return this._value},e.prototype.next=function(e){t.prototype.next.call(this,this._value=e)},e}(Fr.a),xc=function(){},Lc=function(t){function e(e,n,r){var i=t.call(this,e)||this;return i._platform=n,i._document=r,i}return Object(o.b)(e,t),e.prototype.ngAfterViewInit=function(){var t=this;Object(r.U)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return t._checkToolbarMixedModes()}))},e.prototype._checkToolbarMixedModes=function(){var t=this;this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(t){return!(t.classList&&t.classList.contains("mat-toolbar-row"))}).filter(function(e){return e.nodeType!==(t._document?t._document.COMMENT_NODE:8)}).some(function(t){return t.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},e}(Io(function(t){this._elementRef=t})),Cc=function(){},Sc=function(){function t(){this.forceEmitEvents=!1,this.action=new r.n,this.mouseOver=!1}return t.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},t.prototype.setLoading=function(){this.state=0},t.prototype.setSuccess=function(){var t=this;this.state=1,setTimeout(function(){return t.state=null},3e3)},t.prototype.setError=function(t){var e=this;this.error="string"==typeof t?t:el(t._body),this.state=2,this.mouseOver&&setTimeout(function(){return e.tooltip.show()},50)},t.prototype.setDisabled=function(){this.disabled=!0},t.prototype.isLoading=function(){return 0===this.state},t.prototype.resetState=function(){this.state=null,this.error=""},t}(),Tc=function(){function t(t,e,n){this.data=t,this.dialogRef=e,this.walletService=n,this.encrypt=!0,this.disableDismiss=!1}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.createWallet=function(){var t=this;this.form.valid&&!this.createButton.isLoading()&&(this.createButton.resetState(),this.createButton.setLoading(),this.cancelButton.setDisabled(),this.disableDismiss=!0,this.walletService.create(this.form.value.label,this.form.value.seed,this.scan,this.encrypt?this.form.value.password:null).subscribe(function(){return t.dialogRef.close()},function(e){t.createButton.setError(e),t.cancelButton.disabled=!1,t.disableDismiss=!1}))},t.prototype.generateSeed=function(t){var e=this;this.walletService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},t.prototype.setEncrypt=function(t){this.encrypt=t.checked,this.form.updateValueAndValidity()},t.prototype.initForm=function(){this.form=new Rs({},[this.validatePasswords.bind(this),this.validateSeeds.bind(this)]),this.form.addControl("label",new Hs("",[Xa.required])),this.form.addControl("seed",new Hs("",[Xa.required])),this.form.addControl("confirm_seed",new Hs),this.form.addControl("password",new Hs),this.form.addControl("confirm_password",new Hs),this.data.create&&this.generateSeed(128),this.scan=100},t.prototype.validateSeeds=function(){return this.data.create&&this.form&&this.form.get("seed")&&this.form.get("confirm_seed")&&this.form.get("seed").value!==this.form.get("confirm_seed").value?{NotEqual:!0}:null},t.prototype.validatePasswords=function(){if(this.encrypt&&this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(!this.form.get("password").value)return{Required:!0};if(this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t}(),Dc=function(){function t(t,e){this.walletService=t,this.dialog=e}return t.prototype.addWallet=function(t){var e=new Pa;e.width="566px",e.data={create:t},this.dialog.open(Tc,e)},t.prototype.toggleWallet=function(t){t.opened=!t.opened},t}();a.a.prototype.delay=function(t,e){return void 0===e&&(e=Dr),function(t,e){void 0===e&&(e=Dr);var n=Yr(t)?+t-e.now():Math.abs(t);return function(t){return t.lift(new ol(n,e))}}(t,e)(this)};var Oc=function(){function t(t,e,n){var r=this;this.dialogRef=t,this.data=e,this.snackbar=n,this.disableDismiss=!1,this.passwordSubmit=a.a.create(function(t){r.passwordChanged=function(e){t.next({password:e,close:r.close.bind(r),error:r.error.bind(r)})}}),this.data=Object.assign({confirm:!1,description:null,title:null},e||{})}return t.prototype.ngOnInit=function(){var t=this;this.form=new Rs({},this.validateForm.bind(this)),this.form.addControl("password",new Hs("")),this.form.addControl("confirm_password",new Hs("")),["password","confirm_password"].forEach(function(e){t.form.get(e).valueChanges.subscribe(function(){2===t.button.state&&t.button.resetState()})}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},t.prototype.ngOnDestroy=function(){this.form.get("password").setValue(""),this.form.get("confirm_password").setValue("")},t.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.passwordChanged(this.form.get("password").value),this.disableDismiss=!0)},t.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t.prototype.close=function(){this.dialogRef.close()},t.prototype.error=function(t){if("object"==typeof t)switch(t.status){case 400:t=el(t._body);break;case 401:t="Incorrect password";break;case 403:t="API Disabled";break;case 404:t="Wallet does not exist";break;default:var e=new gc;e.duration=5e3,this.snackbar.open(el(t._body),null,e)}this.button.setError(t||"Incorrect password"),this.disableDismiss=!1},t}(),Yc=function(){function t(t,e,n,r){this.formBuilder=t,this.walletService=e,this.snackbar=n,this.dialog=r,this.transactions=[]}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.send=function(){var t=this;this.form.valid&&!this.button.isLoading()&&(this.button.resetState(),this.snackbar.dismiss(),this.form.value.wallet.encrypted?this.dialog.open(Oc).componentInstance.passwordSubmit.subscribe(function(e){t._send(e)}):this._send())},t.prototype._send=function(t){var e=this;t&&t.close(),this.button.setLoading(),this.walletService.createTransaction(this.form.value.wallet,this.form.value.address,this.form.value.amount,t?t.password:null).toPromise().then(function(t){return e.walletService.injectTransaction(t.encoded_transaction).toPromise()}).then(function(){e.resetForm(),e.button.setSuccess(),e.walletService.startDataRefreshSubscription()}).catch(function(t){var n=el(t._body),r=new gc;r.duration=3e5,e.snackbar.open(n,null,r),e.button.setError(n)})},t.prototype.initForm=function(){var t=this;this.form=this.formBuilder.group({wallet:["",Xa.required],address:["",Xa.required],amount:["",Xa.required],notes:[""]}),this.form.get("wallet").valueChanges.subscribe(function(e){console.log(e);var n=e&&e.coins?e.coins:0;t.form.get("amount").setValidators([Xa.required,Xa.max(n),t.validateAmount]),t.form.get("amount").updateValueAndValidity()})},t.prototype.resetForm=function(){this.form.get("wallet").reset(""),this.form.get("address").reset(""),this.form.get("amount").reset(""),this.form.get("notes").reset("")},t.prototype.validateAmount=function(t){if(isNaN(t.value))return{Invalid:!0};if(parseFloat(t.value)<=0)return{Invalid:!0};var e=t.value.split(".");return 2===e.length&&e[1].length>6?{Invalid:!0}:null},t}(),Pc=n("PJh5"),Ec=function(){function t(t){this.walletService=t,this.walletService.startDataRefreshSubscription()}return t.prototype.ngOnInit=function(){var t=this;this.walletService.pendingTransactions().subscribe(function(e){t.transactions=t.mapTransactions(e)})},t.prototype.mapTransactions=function(t){return t.map(function(t){return t.transaction.timestamp=Pc(t.received).unix(),t.transaction}).map(function(t){return t.amount=t.outputs.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+parseInt(e,10)},0),t})},t}();function jc(){return Ma()(this)}var Ac=function(){function t(t,e,n){this.predicate=t,this.thisArg=e,this.source=n}return t.prototype.call=function(t,e){return e.subscribe(new Ic(t,this.predicate,this.thisArg,this.source))},t}(),Ic=function(t){function e(e,n,r,i){t.call(this,e),this.predicate=n,this.thisArg=r,this.source=i,this.index=0,this.thisArg=r||this}return Object(o.b)(e,t),e.prototype.notifyComplete=function(t){this.destination.next(t),this.destination.complete()},e.prototype._next=function(t){var e=!1;try{e=this.predicate.call(this.thisArg,t,this.index++,this.source)}catch(t){return void this.destination.error(t)}e||this.notifyComplete(!1)},e.prototype._complete=function(){this.notifyComplete(!0)},e}(Zn.a);function Hc(t,e){return function(t,e){return function(n){return n.lift(new Ac(t,e,n))}}(t,e)(this)}var Rc=function(){function t(t,e,n,r){this.predicate=t,this.resultSelector=e,this.defaultValue=n,this.source=r}return t.prototype.call=function(t,e){return e.subscribe(new Nc(t,this.predicate,this.resultSelector,this.defaultValue,this.source))},t}(),Nc=function(t){function e(e,n,r,i,o){t.call(this,e),this.predicate=n,this.resultSelector=r,this.defaultValue=i,this.source=o,this.hasValue=!1,this.index=0,"undefined"!=typeof i&&(this.lastValue=i,this.hasValue=!0)}return Object(o.b)(e,t),e.prototype._next=function(t){var e=this.index++;if(this.predicate)this._tryPredicate(t,e);else{if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryPredicate=function(t,e){var n;try{n=this.predicate(t,e,this.source)}catch(t){return void this.destination.error(t)}if(n){if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryResultSelector=function(t,e){var n;try{n=this.resultSelector(t,e)}catch(t){return void this.destination.error(t)}this.lastValue=n,this.hasValue=!0},e.prototype._complete=function(){var t=this.destination;this.hasValue?(t.next(this.lastValue),t.complete()):t.error(new yr)},e}(Zn.a);function Fc(t,e,n){return function(t,e,n){return function(r){return r.lift(new Rc(t,e,n,r))}}(t,e,n)(this)}function Vc(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(wa.a)(t)(this)}function zc(t,e){var n=!1;return arguments.length>=2&&(n=!0),function(r){return r.lift(new Wc(t,e,n))}}var Wc=function(){function t(t,e,n){void 0===n&&(n=!1),this.accumulator=t,this.seed=e,this.hasSeed=n}return t.prototype.call=function(t,e){return e.subscribe(new Bc(t,this.accumulator,this.seed,this.hasSeed))},t}(),Bc=function(t){function e(e,n,r,i){t.call(this,e),this.accumulator=n,this._seed=r,this.hasSeed=i,this.index=0}return Object(o.b)(e,t),Object.defineProperty(e.prototype,"seed",{get:function(){return this._seed},set:function(t){this.hasSeed=!0,this._seed=t},enumerable:!0,configurable:!0}),e.prototype._next=function(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)},e.prototype._tryNext=function(t){var e,n=this.index++;try{e=this.accumulator(this.seed,t,n)}catch(t){this.destination.error(t)}this.seed=e,this.destination.next(e)},e}(Zn.a);function Uc(t){return function(e){return 0===t?new rr.a:e.lift(new qc(t))}}var qc=function(){function t(t){if(this.total=t,this.total<0)throw new Si}return t.prototype.call=function(t,e){return e.subscribe(new Jc(t,this.total))},t}(),Jc=function(t){function e(e,n){t.call(this,e),this.total=n,this.ring=new Array,this.count=0}return Object(o.b)(e,t),e.prototype._next=function(t){var e=this.ring,n=this.total,r=this.count++;e.length0)for(var n=this.count>=this.total?this.total:this.count,r=this.ring,i=0;i=2?function(n){return Object(Xc.a)(zc(t,e),Uc(1),(void 0===(r=e)&&(r=null),function(t){return t.lift(new Gc(r))}))(n);var r}:function(e){return Object(Xc.a)(zc(function(e,n,r){return t(e,n,r+1)}),Uc(1))(e)}}var Qc=function(t,e){this.id=t,this.url=e},$c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),e.prototype.toString=function(){return"NavigationStart(id: "+this.id+", url: '"+this.url+"')"},e}(Qc),td=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.urlAfterRedirects=r,i}return Object(o.b)(e,t),e.prototype.toString=function(){return"NavigationEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"')"},e}(Qc),ed=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.reason=r,i}return Object(o.b)(e,t),e.prototype.toString=function(){return"NavigationCancel(id: "+this.id+", url: '"+this.url+"')"},e}(Qc),nd=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.error=r,i}return Object(o.b)(e,t),e.prototype.toString=function(){return"NavigationError(id: "+this.id+", url: '"+this.url+"', error: "+this.error+")"},e}(Qc),rd=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.b)(e,t),e.prototype.toString=function(){return"RoutesRecognized(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Qc),id=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.b)(e,t),e.prototype.toString=function(){return"GuardsCheckStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Qc),od=function(t){function e(e,n,r,i,o){var a=t.call(this,e,n)||this;return a.urlAfterRedirects=r,a.state=i,a.shouldActivate=o,a}return Object(o.b)(e,t),e.prototype.toString=function(){return"GuardsCheckEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+", shouldActivate: "+this.shouldActivate+")"},e}(Qc),ad=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.b)(e,t),e.prototype.toString=function(){return"ResolveStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Qc),sd=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.b)(e,t),e.prototype.toString=function(){return"ResolveEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Qc),ld=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadStart(path: "+this.route.path+")"},t}(),ud=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadEnd(path: "+this.route.path+")"},t}(),cd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),dd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),hd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),pd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),fd="primary",_d=function(){function t(t){this.params=t||{}}return t.prototype.has=function(t){return this.params.hasOwnProperty(t)},t.prototype.get=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e[0]:e}return null},t.prototype.getAll=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e:[e]}return[]},Object.defineProperty(t.prototype,"keys",{get:function(){return Object.keys(this.params)},enumerable:!0,configurable:!0}),t}();function md(t){return new _d(t)}function gd(t,e,n){var r=n.path.split("/");if(r.length>t.length)return null;if("full"===n.pathMatch&&(e.hasChildren()||r.length0?t[t.length-1]:null}function Cd(t,e){for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)}function Sd(t){var e=Vc.call(t);return Hc.call(e,function(t){return!0===t})}function Td(t){return Object(r._10)(t)?t:Object(r._11)(t)?Ba(Promise.resolve(t)):ur(t)}function Dd(t,e,n){return n?function(t,e){return kd(t,e)}(t.queryParams,e.queryParams)&&function t(e,n){if(!Ed(e.segments,n.segments))return!1;if(e.numberOfChildren!==n.numberOfChildren)return!1;for(var r in n.children){if(!e.children[r])return!1;if(!t(e.children[r],n.children[r]))return!1}return!0}(t.root,e.root):function(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(function(n){return e[n]===t[n]})}(t.queryParams,e.queryParams)&&function t(e,n){return function e(n,r,i){if(n.segments.length>i.length)return!!Ed(a=n.segments.slice(0,i.length),i)&&!r.hasChildren();if(n.segments.length===i.length){if(!Ed(n.segments,i))return!1;for(var o in r.children){if(!n.children[o])return!1;if(!t(n.children[o],r.children[o]))return!1}return!0}var a=i.slice(0,n.segments.length),s=i.slice(n.segments.length);return!!Ed(n.segments,a)&&!!n.children[fd]&&e(n.children[fd],r,s)}(e,n,n.segments)}(t.root,e.root)}var Od=function(){function t(t,e,n){this.root=t,this.queryParams=e,this.fragment=n}return Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=md(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Hd.serialize(this)},t}(),Yd=function(){function t(t,e){var n=this;this.segments=t,this.children=e,this.parent=null,Cd(e,function(t,e){return t.parent=n})}return t.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(t.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Rd(this)},t}(),Pd=function(){function t(t,e){this.path=t,this.parameters=e}return Object.defineProperty(t.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=md(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Bd(this)},t}();function Ed(t,e){return t.length===e.length&&t.every(function(t,n){return t.path===e[n].path})}function jd(t,e){var n=[];return Cd(t.children,function(t,r){r===fd&&(n=n.concat(e(t,r)))}),Cd(t.children,function(t,r){r!==fd&&(n=n.concat(e(t,r)))}),n}var Ad=function(){},Id=function(){function t(){}return t.prototype.parse=function(t){var e=new Kd(t);return new Od(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())},t.prototype.serialize=function(t){var e,n;return"/"+function t(e,n){if(!e.hasChildren())return Rd(e);if(n){var r=e.children[fd]?t(e.children[fd],!1):"",i=[];return Cd(e.children,function(e,n){n!==fd&&i.push(n+":"+t(e,!1))}),i.length>0?r+"("+i.join("//")+")":r}var o=jd(e,function(n,r){return r===fd?[t(e.children[fd],!1)]:[r+":"+t(n,!1)]});return Rd(e)+"/("+o.join("//")+")"}(t.root,!0)+(e=t.queryParams,(n=Object.keys(e).map(function(t){var n=e[t];return Array.isArray(n)?n.map(function(e){return Fd(t)+"="+Fd(e)}).join("&"):Fd(t)+"="+Fd(n)})).length?"?"+n.join("&"):"")+("string"==typeof t.fragment?"#"+encodeURI(t.fragment):"")},t}(),Hd=new Id;function Rd(t){return t.segments.map(function(t){return Bd(t)}).join("/")}function Nd(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Fd(t){return Nd(t).replace(/%3B/gi,";")}function Vd(t){return Nd(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function zd(t){return decodeURIComponent(t)}function Wd(t){return zd(t.replace(/\+/g,"%20"))}function Bd(t){return""+Vd(t.path)+(e=t.parameters,Object.keys(e).map(function(t){return";"+Vd(t)+"="+Vd(e[t])}).join(""));var e}var Ud=/^[^\/()?;=&#]+/;function qd(t){var e=t.match(Ud);return e?e[0]:""}var Jd=/^[^=?&#]+/,Gd=/^[^?&#]+/,Kd=function(){function t(t){this.url=t,this.remaining=t}return t.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new Yd([],{}):new Yd([],this.parseChildren())},t.prototype.parseQueryParams=function(){var t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t},t.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null},t.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());var e={};this.peekStartsWith("/(")&&(this.capture("/"),e=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(t.length>0||Object.keys(e).length>0)&&(n[fd]=new Yd(t,e)),n},t.prototype.parseSegment=function(){var t=qd(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(t),new Pd(zd(t),this.parseMatrixParams())},t.prototype.parseMatrixParams=function(){for(var t={};this.consumeOptional(";");)this.parseParam(t);return t},t.prototype.parseParam=function(t){var e=qd(this.remaining);if(e){this.capture(e);var n="";if(this.consumeOptional("=")){var r=qd(this.remaining);r&&this.capture(n=r)}t[zd(e)]=zd(n)}},t.prototype.parseQueryParam=function(t){var e,n=(e=this.remaining.match(Jd))?e[0]:"";if(n){this.capture(n);var r="";if(this.consumeOptional("=")){var i=function(t){var e=t.match(Gd);return e?e[0]:""}(this.remaining);i&&this.capture(r=i)}var o=Wd(n),a=Wd(r);if(t.hasOwnProperty(o)){var s=t[o];Array.isArray(s)||(t[o]=s=[s]),s.push(a)}else t[o]=a}},t.prototype.parseParens=function(t){var e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=qd(this.remaining),r=this.remaining[n.length];if("/"!==r&&")"!==r&&";"!==r)throw new Error("Cannot parse url '"+this.url+"'");var i=void 0;n.indexOf(":")>-1?(i=n.substr(0,n.indexOf(":")),this.capture(i),this.capture(":")):t&&(i=fd);var o=this.parseChildren();e[i]=1===Object.keys(o).length?o[fd]:new Yd([],o),this.consumeOptional("//")}return e},t.prototype.peekStartsWith=function(t){return this.remaining.startsWith(t)},t.prototype.consumeOptional=function(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)},t.prototype.capture=function(t){if(!this.consumeOptional(t))throw new Error('Expected "'+t+'".')},t}(),Xd=function(t){this.segmentGroup=t||null},Zd=function(t){this.urlTree=t};function Qd(t){return new a.a(function(e){return e.error(new Xd(t))})}function $d(t){return new a.a(function(e){return e.error(new Zd(t))})}function th(t){return new a.a(function(e){return e.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+t+"'"))})}var eh=function(){function t(t,e,n,i,o){this.configLoader=e,this.urlSerializer=n,this.urlTree=i,this.config=o,this.allowRedirects=!0,this.ngModule=t.get(r.w)}return t.prototype.apply=function(){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,fd),n=er.call(e,function(e){return t.createUrlTree(e,t.urlTree.queryParams,t.urlTree.fragment)});return Xn.call(n,function(e){if(e instanceof Zd)return t.allowRedirects=!1,t.match(e.urlTree);if(e instanceof Xd)throw t.noMatchError(e);throw e})},t.prototype.match=function(t){var e=this,n=this.expandSegmentGroup(this.ngModule,this.config,t.root,fd),r=er.call(n,function(n){return e.createUrlTree(n,t.queryParams,t.fragment)});return Xn.call(r,function(t){if(t instanceof Xd)throw e.noMatchError(t);throw t})},t.prototype.noMatchError=function(t){return new Error("Cannot match any routes. URL Segment: '"+t.segmentGroup+"'")},t.prototype.createUrlTree=function(t,e,n){var r,i=t.segments.length>0?new Yd([],((r={})[fd]=t,r)):t;return new Od(i,e,n)},t.prototype.expandSegmentGroup=function(t,e,n,r){return 0===n.segments.length&&n.hasChildren()?er.call(this.expandChildren(t,e,n),function(t){return new Yd([],t)}):this.expandSegment(t,n,e,n.segments,r,!0)},t.prototype.expandChildren=function(t,e,n){var r=this;return function(n,i){if(0===Object.keys(n).length)return ur({});var o=[],a=[],s={};Cd(n,function(n,i){var l=er.call(r.expandSegmentGroup(t,e,n,i),function(t){return s[i]=t});i===fd?o.push(l):a.push(l)});var l=jc.call(ur.apply(void 0,o.concat(a))),u=Fc.call(l);return er.call(u,function(){return s})}(n.children)},t.prototype.expandSegment=function(t,e,n,r,i,o){var a=this,s=ur.apply(void 0,n),l=er.call(s,function(s){var l=a.expandSegmentAgainstRoute(t,e,n,s,r,i,o);return Xn.call(l,function(t){if(t instanceof Xd)return ur(null);throw t})}),u=jc.call(l),c=wr.call(u,function(t){return!!t});return Xn.call(c,function(t,n){if(t instanceof yr||"EmptyError"===t.name){if(a.noLeftoversInUrl(e,r,i))return ur(new Yd([],{}));throw new Xd(e)}throw t})},t.prototype.noLeftoversInUrl=function(t,e,n){return 0===e.length&&!t.children[n]},t.prototype.expandSegmentAgainstRoute=function(t,e,n,r,i,o,a){return oh(r)!==o?Qd(e):void 0===r.redirectTo?this.matchSegmentAgainstRoute(t,e,r,i):a&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o):Qd(e)},t.prototype.expandSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){return"**"===r.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,r,o):this.expandRegularSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o)},t.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(t,e,n,r){var i=this,o=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?$d(o):kr.call(this.lineralizeSegments(n,o),function(n){var o=new Yd(n,{});return i.expandSegment(t,o,e,n,r,!1)})},t.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){var a=this,s=nh(e,r,i),l=s.consumedSegments,u=s.lastChild,c=s.positionalParamSegments;if(!s.matched)return Qd(e);var d=this.applyRedirectCommands(l,r.redirectTo,c);return r.redirectTo.startsWith("/")?$d(d):kr.call(this.lineralizeSegments(r,d),function(r){return a.expandSegment(t,e,n,r.concat(i.slice(u)),o,!1)})},t.prototype.matchSegmentAgainstRoute=function(t,e,n,r){var i=this;if("**"===n.path)return n.loadChildren?er.call(this.configLoader.load(t.injector,n),function(t){return n._loadedConfig=t,new Yd(r,{})}):ur(new Yd(r,{}));var a=nh(e,n,r),s=a.consumedSegments,l=a.lastChild;if(!a.matched)return Qd(e);var u=r.slice(l),c=this.getChildConfig(t,n);return kr.call(c,function(t){var n=t.module,r=t.routes,a=function(t,e,n,r){return n.length>0&&function(t,e,n){return r.some(function(n){return ih(t,e,n)&&oh(n)!==fd})}(t,n)?{segmentGroup:rh(new Yd(e,function(t,e){var n={};n[fd]=e;for(var r=0,i=t;r1||!r.children[fd])return th(t.redirectTo);r=r.children[fd]}},t.prototype.applyRedirectCommands=function(t,e,n){return this.applyRedirectCreatreUrlTree(e,this.urlSerializer.parse(e),t,n)},t.prototype.applyRedirectCreatreUrlTree=function(t,e,n,r){var i=this.createSegmentGroup(t,e.root,n,r);return new Od(i,this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)},t.prototype.createQueryParams=function(t,e){var n={};return Cd(t,function(t,r){if("string"==typeof t&&t.startsWith(":")){var i=t.substring(1);n[r]=e[i]}else n[r]=t}),n},t.prototype.createSegmentGroup=function(t,e,n,r){var i=this,o=this.createSegments(t,e.segments,n,r),a={};return Cd(e.children,function(e,o){a[o]=i.createSegmentGroup(t,e,n,r)}),new Yd(o,a)},t.prototype.createSegments=function(t,e,n,r){var i=this;return e.map(function(e){return e.path.startsWith(":")?i.findPosParam(t,e,r):i.findOrReturn(e,n)})},t.prototype.findPosParam=function(t,e,n){var r=n[e.path.substring(1)];if(!r)throw new Error("Cannot redirect to '"+t+"'. Cannot find '"+e.path+"'.");return r},t.prototype.findOrReturn=function(t,e){for(var n=0,r=0,i=e;r0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var r=(e.matcher||gd)(n,t,e);return r?{matched:!0,consumedSegments:r.consumed,lastChild:r.consumed.length,positionalParamSegments:r.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function rh(t){if(1===t.numberOfChildren&&t.children[fd]){var e=t.children[fd];return new Yd(t.segments.concat(e.segments),e.children)}return t}function ih(t,e,n){return(!(t.hasChildren()||e.length>0)||"full"!==n.pathMatch)&&""===n.path&&void 0!==n.redirectTo}function oh(t){return t.outlet||fd}var ah=function(){function t(t){this._root=t}return Object.defineProperty(t.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),t.prototype.parent=function(t){var e=this.pathFromRoot(t);return e.length>1?e[e.length-2]:null},t.prototype.children=function(t){var e=sh(t,this._root);return e?e.children.map(function(t){return t.value}):[]},t.prototype.firstChild=function(t){var e=sh(t,this._root);return e&&e.children.length>0?e.children[0].value:null},t.prototype.siblings=function(t){var e=lh(t,this._root);return e.length<2?[]:e[e.length-2].children.map(function(t){return t.value}).filter(function(e){return e!==t})},t.prototype.pathFromRoot=function(t){return lh(t,this._root).map(function(t){return t.value})},t}();function sh(t,e){if(t===e.value)return e;for(var n=0,r=e.children;n=1;){var i=n[r],a=n[r-1];if(i.routeConfig&&""===i.routeConfig.path)r--;else{if(a.component)break;r--}}return function(t){return t.reduce(function(t,e){return{params:Object(o.a)({},t.params,e.params),data:Object(o.a)({},t.data,e.data),resolve:Object(o.a)({},t.resolve,e._resolvedData)}},{params:{},data:{},resolve:{}})}(n.slice(r))}var _h=function(){function t(t,e,n,r,i,o,a,s,l,u,c){this.url=t,this.params=e,this.queryParams=n,this.fragment=r,this.data=i,this.outlet=o,this.component=a,this.routeConfig=s,this._urlSegment=l,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(t.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=md(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=md(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return"Route(url:'"+this.url.map(function(t){return t.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},t}(),mh=function(t){function e(e,n){var r=t.call(this,n)||this;return r.url=e,gh(r,n),r}return Object(o.b)(e,t),e.prototype.toString=function(){return yh(this._root)},e}(ah);function gh(t,e){e.value._routerState=t,e.children.forEach(function(e){return gh(t,e)})}function yh(t){var e=t.children.length>0?" { "+t.children.map(yh).join(", ")+" } ":"";return""+t.value+e}function vh(t){if(t.snapshot){var e=t.snapshot,n=t._futureSnapshot;t.snapshot=n,kd(e.queryParams,n.queryParams)||t.queryParams.next(n.queryParams),e.fragment!==n.fragment&&t.fragment.next(n.fragment),kd(e.params,n.params)||t.params.next(n.params),function(t,e){if(t.length!==e.length)return!1;for(var n=0;n0&&wh(n[0]))throw new Error("Root segment cannot have matrix parameters");var r=n.find(function(t){return"object"==typeof t&&null!=t&&t.outlets});if(r&&r!==Ld(n))throw new Error("{outlets:{}} has to be the last command")}return t.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},t}(),xh=function(t,e,n){this.segmentGroup=t,this.processChildren=e,this.index=n};function Lh(t){return"object"==typeof t&&null!=t&&t.outlets?t.outlets[fd]:""+t}function Ch(t,e,n){if(t||(t=new Yd([],{})),0===t.segments.length&&t.hasChildren())return Sh(t,e,n);var r=function(t,e,n){for(var r=0,i=e,o={match:!1,pathIndex:0,commandIndex:0};i=n.length)return o;var a=t.segments[i],s=Lh(n[r]),l=r0&&void 0===s)break;if(s&&l&&"object"==typeof l&&void 0===l.outlets){if(!Yh(s,l,a))return o;r+=2}else{if(!Yh(s,{},a))return o;r++}i++}return{match:!0,pathIndex:i,commandIndex:r}}(t,e,n),i=n.slice(r.commandIndex);if(r.match&&r.pathIndex=2?Zc(t,e)(this):Zc(t)(this)}).call(r,function(t,e){return t})},t.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},t.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},t.prototype.setupChildRouteGuards=function(t,e,n,r){var i=this,o=ch(e);t.children.forEach(function(t){i.setupRouteGuards(t,o[t.value.outlet],n,r.concat([t.value])),delete o[t.value.outlet]}),Cd(o,function(t,e){return i.deactivateRouteAndItsChildren(t,n.getContext(e))})},t.prototype.setupRouteGuards=function(t,e,n,r){var i=t.value,o=e?e.value:null,a=n?n.getContext(t.value.outlet):null;if(o&&i.routeConfig===o.routeConfig){var s=this.shouldRunGuardsAndResolvers(o,i,i.routeConfig.runGuardsAndResolvers);s?this.canActivateChecks.push(new Ph(r)):(i.data=o.data,i._resolvedData=o._resolvedData),this.setupChildRouteGuards(t,e,i.component?a?a.children:null:n,r),s&&this.canDeactivateChecks.push(new Eh(a.outlet.component,o))}else o&&this.deactivateRouteAndItsChildren(e,a),this.canActivateChecks.push(new Ph(r)),this.setupChildRouteGuards(t,null,i.component?a?a.children:null:n,r)},t.prototype.shouldRunGuardsAndResolvers=function(t,e,n){switch(n){case"always":return!0;case"paramsOrQueryParamsChange":return!bh(t,e)||!kd(t.queryParams,e.queryParams);case"paramsChange":default:return!bh(t,e)}},t.prototype.deactivateRouteAndItsChildren=function(t,e){var n=this,r=ch(t),i=t.value;Cd(r,function(t,r){n.deactivateRouteAndItsChildren(t,i.component?e?e.children.getContext(r):null:e)}),this.canDeactivateChecks.push(new Eh(i.component&&e&&e.outlet&&e.outlet.isActivated?e.outlet.component:null,i))},t.prototype.runCanDeactivateChecks=function(){var t=this,e=ba(this.canDeactivateChecks),n=kr.call(e,function(e){return t.runCanDeactivate(e.component,e.route)});return Hc.call(n,function(t){return!0===t})},t.prototype.runCanActivateChecks=function(){var t=this,e=ba(this.canActivateChecks),n=Wl.call(e,function(e){return Sd(ba([t.fireChildActivationStart(e.route.parent),t.fireActivationStart(e.route),t.runCanActivateChild(e.path),t.runCanActivate(e.route)]))});return Hc.call(n,function(t){return!0===t})},t.prototype.fireActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new hd(t)),ur(!0)},t.prototype.fireChildActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new cd(t)),ur(!0)},t.prototype.runCanActivate=function(t){var e=this,n=t.routeConfig?t.routeConfig.canActivate:null;return n&&0!==n.length?Sd(er.call(ba(n),function(n){var r,i=e.getToken(n,t);return r=Td(i.canActivate?i.canActivate(t,e.future):i(t,e.future)),wr.call(r)})):ur(!0)},t.prototype.runCanActivateChild=function(t){var e=this,n=t[t.length-1],r=t.slice(0,t.length-1).reverse().map(function(t){return e.extractCanActivateChild(t)}).filter(function(t){return null!==t});return Sd(er.call(ba(r),function(t){return Sd(er.call(ba(t.guards),function(r){var i,o=e.getToken(r,t.node);return i=Td(o.canActivateChild?o.canActivateChild(n,e.future):o(n,e.future)),wr.call(i)}))}))},t.prototype.extractCanActivateChild=function(t){var e=t.routeConfig?t.routeConfig.canActivateChild:null;return e&&0!==e.length?{node:t,guards:e}:null},t.prototype.runCanDeactivate=function(t,e){var n=this,r=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!r||0===r.length)return ur(!0);var i=kr.call(ba(r),function(r){var i,o=n.getToken(r,e);return i=Td(o.canDeactivate?o.canDeactivate(t,e,n.curr,n.future):o(t,e,n.curr,n.future)),wr.call(i)});return Hc.call(i,function(t){return!0===t})},t.prototype.runResolve=function(t,e){return er.call(this.resolveNode(t._resolve,t),function(n){return t._resolvedData=n,t.data=Object(o.a)({},t.data,fh(t,e).resolve),null})},t.prototype.resolveNode=function(t,e){var n=this,r=Object.keys(t);if(0===r.length)return ur({});if(1===r.length){var i=r[0];return er.call(this.getResolver(t[i],e),function(t){return(e={})[i]=t,e;var e})}var o={},a=kr.call(ba(r),function(r){return er.call(n.getResolver(t[r],e),function(t){return o[r]=t,t})});return er.call(Fc.call(a),function(){return o})},t.prototype.getResolver=function(t,e){var n=this.getToken(t,e);return Td(n.resolve?n.resolve(e,this.future):n(e,this.future))},t.prototype.getToken=function(t,e){var n=function(t){if(!t)return null;for(var e=t.parent;e;e=e.parent){var n=e.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(e);return(n?n.module.injector:this.moduleInjector).get(t)},t}(),Ah=function(){},Ih=function(){function t(t,e,n,r,i){this.rootComponentType=t,this.config=e,this.urlTree=n,this.url=r,this.paramsInheritanceStrategy=i}return t.prototype.recognize=function(){try{var t=Nh(this.urlTree.root,[],[],this.config).segmentGroup,e=this.processSegmentGroup(this.config,t,fd),n=new _h([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},fd,this.rootComponentType,null,this.urlTree.root,-1,{}),r=new uh(n,e),i=new mh(this.url,r);return this.inheritParamsAndData(i._root),ur(i)}catch(t){return new a.a(function(e){return e.error(t)})}},t.prototype.inheritParamsAndData=function(t){var e=this,n=t.value,r=fh(n,this.paramsInheritanceStrategy);n.params=Object.freeze(r.params),n.data=Object.freeze(r.data),t.children.forEach(function(t){return e.inheritParamsAndData(t)})},t.prototype.processSegmentGroup=function(t,e,n){return 0===e.segments.length&&e.hasChildren()?this.processChildren(t,e):this.processSegment(t,e,e.segments,n)},t.prototype.processChildren=function(t,e){var n,r=this,i=jd(e,function(e,n){return r.processSegmentGroup(t,e,n)});return n={},i.forEach(function(t){var e=n[t.value.outlet];if(e){var r=e.url.map(function(t){return t.toString()}).join("/"),i=t.value.url.map(function(t){return t.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+r+"' and '"+i+"'.")}n[t.value.outlet]=t.value}),i.sort(function(t,e){return t.value.outlet===fd?-1:e.value.outlet===fd?1:t.value.outlet.localeCompare(e.value.outlet)}),i},t.prototype.processSegment=function(t,e,n,r){for(var i=0,o=t;i0?Ld(n).parameters:{};i=new _h(n,l,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,zh(t),r,t.component,t,Hh(e),Rh(e)+n.length,Wh(t))}else{var u=function(t,e,n){if(""===e.path){if("full"===e.pathMatch&&(t.hasChildren()||n.length>0))throw new Ah;return{consumedSegments:[],lastChild:0,parameters:{}}}var r=(e.matcher||gd)(n,t,e);if(!r)throw new Ah;var i={};Cd(r.posParams,function(t,e){i[e]=t.path});var a=r.consumed.length>0?Object(o.a)({},i,r.consumed[r.consumed.length-1].parameters):i;return{consumedSegments:r.consumed,lastChild:r.consumed.length,parameters:a}}(e,t,n);a=u.consumedSegments,s=n.slice(u.lastChild),i=new _h(a,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,zh(t),r,t.component,t,Hh(e),Rh(e)+a.length,Wh(t))}var c=function(t){return t.children?t.children:t.loadChildren?t._loadedConfig.routes:[]}(t),d=Nh(e,a,s,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new uh(i,f)]}if(0===c.length&&0===p.length)return[new uh(i,[])];var _=this.processSegment(c,h,p,fd);return[new uh(i,_)]},t}();function Hh(t){for(var e=t;e._sourceSegment;)e=e._sourceSegment;return e}function Rh(t){for(var e=t,n=e._segmentIndexShift?e._segmentIndexShift:0;e._sourceSegment;)n+=(e=e._sourceSegment)._segmentIndexShift?e._segmentIndexShift:0;return n-1}function Nh(t,e,n,r){if(n.length>0&&function(t,e,n){return r.some(function(n){return Fh(t,e,n)&&Vh(n)!==fd})}(t,n)){var i=new Yd(e,function(t,e,n,r){var i={};i[fd]=r,r._sourceSegment=t,r._segmentIndexShift=e.length;for(var o=0,a=n;o0)||"full"!==n.pathMatch)&&""===n.path&&void 0===n.redirectTo}function Vh(t){return t.outlet||fd}function zh(t){return t.data||{}}function Wh(t){return t.resolve||{}}var Bh=function(){},Uh=function(){function t(){}return t.prototype.shouldDetach=function(t){return!1},t.prototype.store=function(t,e){},t.prototype.shouldAttach=function(t){return!1},t.prototype.retrieve=function(t){return null},t.prototype.shouldReuseRoute=function(t,e){return t.routeConfig===e.routeConfig},t}(),qh=new r.p("ROUTES"),Jh=function(){function t(t,e,n,r){this.loader=t,this.compiler=e,this.onLoadStartListener=n,this.onLoadEndListener=r}return t.prototype.load=function(t,e){var n=this;this.onLoadStartListener&&this.onLoadStartListener(e);var r=this.loadModuleFactory(e.loadChildren);return er.call(r,function(r){n.onLoadEndListener&&n.onLoadEndListener(e);var i=r.create(t);return new yd(xd(i.injector.get(qh)).map(Md),i)})},t.prototype.loadModuleFactory=function(t){var e=this;return"string"==typeof t?Ba(this.loader.load(t)):kr.call(Td(t()),function(t){return t instanceof r.u?ur(t):Ba(e.compiler.compileModuleAsync(t))})},t}(),Gh=function(){},Kh=function(){function t(){}return t.prototype.shouldProcessUrl=function(t){return!0},t.prototype.extract=function(t){return t},t.prototype.merge=function(t,e){return t},t}();function Xh(t){throw t}function Zh(t){return ur(null)}var Qh=function(){function t(t,e,n,i,o,a,s,l){var u=this;this.rootComponentType=t,this.urlSerializer=e,this.rootContexts=n,this.location=i,this.config=l,this.navigations=new kc(null),this.navigationId=0,this.events=new Fr.a,this.errorHandler=Xh,this.navigated=!1,this.hooks={beforePreactivation:Zh,afterPreactivation:Zh},this.urlHandlingStrategy=new Kh,this.routeReuseStrategy=new Uh,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=o.get(r.w),this.resetConfig(l),this.currentUrlTree=new Od(new Yd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new Jh(a,s,function(t){return u.triggerEvent(new ld(t))},function(t){return u.triggerEvent(new ud(t))}),this.routerState=hh(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return t.prototype.resetRootComponentType=function(t){this.rootComponentType=t,this.routerState.root.component=this.rootComponentType},t.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},t.prototype.setUpLocationChangeListener=function(){var t=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(function(e){var n=t.urlSerializer.parse(e.url),r="popstate"===e.type?"popstate":"hashchange";setTimeout(function(){t.scheduleNavigation(n,r,{replaceUrl:!0})},0)}))},Object.defineProperty(t.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),t.prototype.triggerEvent=function(t){this.events.next(t)},t.prototype.resetConfig=function(t){vd(t),this.config=t.map(Md),this.navigated=!1},t.prototype.ngOnDestroy=function(){this.dispose()},t.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},t.prototype.createUrlTree=function(t,e){void 0===e&&(e={});var n=e.relativeTo,i=e.queryParams,a=e.fragment,s=e.preserveQueryParams,l=e.queryParamsHandling,u=e.preserveFragment;Object(r.U)()&&s&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=n||this.routerState.root,d=u?this.currentUrlTree.fragment:a,h=null;if(l)switch(l){case"merge":h=Object(o.a)({},this.currentUrlTree.queryParams,i);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=i||null}else h=s?this.currentUrlTree.queryParams:i||null;return null!==h&&(h=this.removeEmptyProps(h)),function(t,e,n,r,i){if(0===n.length)return Mh(e.root,e.root,e,r,i);var o=function(t){if("string"==typeof t[0]&&1===t.length&&"/"===t[0])return new kh(!0,0,t);var e=0,n=!1,r=t.reduce(function(t,r,i){if("object"==typeof r&&null!=r){if(r.outlets){var o={};return Cd(r.outlets,function(t,e){o[e]="string"==typeof t?t.split("/"):t}),t.concat([{outlets:o}])}if(r.segmentPath)return t.concat([r.segmentPath])}return"string"!=typeof r?t.concat([r]):0===i?(r.split("/").forEach(function(r,i){0==i&&"."===r||(0==i&&""===r?n=!0:".."===r?e++:""!=r&&t.push(r))}),t):t.concat([r])},[]);return new kh(n,e,r)}(n);if(o.toRoot())return Mh(e.root,new Yd([],{}),e,r,i);var a=function(t,n,r){if(t.isAbsolute)return new xh(e.root,!0,0);if(-1===r.snapshot._lastPathIndex)return new xh(r.snapshot._urlSegment,!0,0);var i=wh(t.commands[0])?0:1;return function(e,n,o){for(var a=r.snapshot._urlSegment,s=r.snapshot._lastPathIndex+i,l=t.numberOfDoubleDots;l>s;){if(l-=s,!(a=a.parent))throw new Error("Invalid number of '../'");s=a.segments.length}return new xh(a,!1,s-l)}()}(o,0,t),s=a.processChildren?Sh(a.segmentGroup,a.index,o.commands):Ch(a.segmentGroup,a.index,o.commands);return Mh(a.segmentGroup,s,e,r,i)}(c,this.currentUrlTree,t,h,d)},t.prototype.navigateByUrl=function(t,e){void 0===e&&(e={skipLocationChange:!1});var n=t instanceof Od?t:this.parseUrl(t),r=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(r,"imperative",e)},t.prototype.navigate=function(t,e){return void 0===e&&(e={skipLocationChange:!1}),function(t){for(var e=0;e0&&1===this.error&&(this.error=null)},t}(),Jp=function(){function t(t){this.appService=t}return t.prototype.ngOnInit=function(){this.appService.testBackend()},t}(),Gp=r._3({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap;margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function Kp(t){return r._29(0,[(t()(),r._0(0,null,null,0))],null,null)}function Xp(t){return r._29(0,[r._25(402653184,1,{_portalOutlet:0}),(t()(),r._0(16777216,null,null,1,null,Kp)),r._4(2,212992,[[1,4]],0,xi,[r.j,r.N],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var Zp=r._1("mat-dialog-container",ja,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"id",0],[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(t,e,n){var i=!0;return"component:@slideDialog.start"===e&&(i=!1!==r._17(t,1)._onAnimationStart(n)&&i),"component:@slideDialog.done"===e&&(i=!1!==r._17(t,1)._onAnimationDone(n)&&i),i},Xp,Gp)),r._4(1,49152,null,0,ja,[r.k,go,r.h,[2,Ot]],null,null)],null,function(t,e){t(e,0,0,r._17(e,1)._id,null==r._17(e,1)._config?null:r._17(e,1)._config.role,null!=r._17(e,1)._config&&r._17(e,1)._config.ariaLabel?null:r._17(e,1)._ariaLabelledBy,null==r._17(e,1)._config?null:r._17(e,1)._config.ariaLabel,(null==r._17(e,1)._config?null:r._17(e,1)._config.ariaDescribedBy)||null,r._17(e,1)._state)})},{},{},[]),Qp=r._3({encapsulation:2,styles:[".mat-snack-bar-container{border-radius:2px;box-sizing:border-box;display:block;margin:24px;max-width:568px;min-width:288px;padding:14px 24px;transform:translateY(100%) translateY(24px)}.mat-snack-bar-container.mat-snack-bar-center{margin:0;transform:translateY(100%)}.mat-snack-bar-container.mat-snack-bar-top{transform:translateY(-100%) translateY(-24px)}.mat-snack-bar-container.mat-snack-bar-top.mat-snack-bar-center{transform:translateY(-100%)}@media screen and (-ms-high-contrast:active){.mat-snack-bar-container{border:solid 1px}}.mat-snack-bar-handset{width:100%}.mat-snack-bar-handset .mat-snack-bar-container{margin:0;max-width:inherit;width:100%}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"visible-top, visible-bottom",styles:{type:6,styles:{transform:"translateY(0%)"},offset:null},options:void 0},{type:1,expr:"visible-top => hidden-top, visible-bottom => hidden-bottom",animation:{type:4,styles:null,timings:"195ms cubic-bezier(0.4,0.0,1,1)"},options:null},{type:1,expr:"void => visible-top, void => visible-bottom",animation:{type:4,styles:null,timings:"225ms cubic-bezier(0.0,0.0,0.2,1)"},options:null}],options:{}}]}});function $p(t){return r._29(0,[(t()(),r._0(0,null,null,0))],null,null)}function tf(t){return r._29(2,[r._25(402653184,1,{_portalOutlet:0}),(t()(),r._0(16777216,null,null,1,null,$p)),r._4(2,212992,[[1,4]],0,xi,[r.j,r.N],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var ef=r._1("snack-bar-container",vc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"snack-bar-container",[["class","mat-snack-bar-container"],["role","alert"]],[[40,"@state",0]],[["component","@state.done"]],function(t,e,n){var i=!0;return"component:@state.done"===e&&(i=!1!==r._17(t,1).onAnimationEnd(n)&&i),i},tf,Qp)),r._4(1,180224,null,0,vc,[r.y,r.k,r.h],null,null)],null,function(t,e){t(e,0,0,r._17(e,1)._animationState)})},{},{},[]),nf=r._3({encapsulation:2,styles:[".mat-simple-snackbar{display:flex;justify-content:space-between;line-height:20px;opacity:1}.mat-simple-snackbar-action{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;background:0 0;flex-shrink:0;margin-left:48px}[dir=rtl] .mat-simple-snackbar-action{margin-right:48px;margin-left:0}"],data:{animation:[{type:7,name:"contentFade",definitions:[{type:1,expr:":enter",animation:[{type:6,styles:{opacity:"0"},offset:null},{type:4,styles:null,timings:"375ms cubic-bezier(0.4,0.0,0.2,1)"}],options:null}],options:{}}]}});function rf(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"button",[["class","mat-simple-snackbar-action"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.action()&&r),r},null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.action)})}function of(t){return r._29(2,[(t()(),r._27(0,null,[""," "])),(t()(),r._0(16777216,null,null,1,null,rf)),r._4(2,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null)],function(t,e){t(e,2,0,e.component.hasAction)},function(t,e){t(e,0,0,e.component.data.message)})}var af=r._1("simple-snack-bar",yc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"simple-snack-bar",[["class","mat-simple-snackbar"]],[[40,"@contentFade",0]],null,null,of,nf)),r._4(1,49152,null,0,yc,[_c,mc],null,null)],null,function(t,e){t(e,0,0,void 0)})},{},{},[]),sf=r._3({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}.mat-tooltip-handset{margin:24px;padding-left:16px;padding-right:16px}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function lf(t){return r._29(2,[(t()(),r._5(0,0,null,null,3,"div",[["class","mat-tooltip"]],[[2,"mat-tooltip-handset",null],[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(t,e,n){var r=!0,i=t.component;return"@state.start"===e&&(r=!1!==i._animationStart()&&r),"@state.done"===e&&(r=!1!==i._animationDone(n)&&r),r},null,null)),r._4(1,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._20(131072,Lt,[r.h]),(t()(),r._27(3,null,["",""]))],function(t,e){t(e,1,0,"mat-tooltip",e.component.tooltipClass)},function(t,e){var n=e.component;t(e,0,0,r._28(e,0,0,r._17(e,2).transform(n._isHandset)).matches,n._transformOrigin,n._visibility),t(e,3,0,n.message)})}var uf=r._1("mat-tooltip-component",ac,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(t,e,n){var i=!0;return"body:click"===e&&(i=!1!==r._17(t,1)._handleBodyInteraction()&&i),i},lf,sf)),r._4(1,49152,null,0,ac,[r.h,Zu],null,null)],null,function(t,e){t(e,0,0,"visible"===r._17(e,1)._visibility?1:null)})},{},{},[]),cf=function(){function t(t,e,n,r){this.data=t,this.dialogRef=e,this.formBuilder=n,this.walletService=r}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.rename=function(){var t=this;this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.walletService.renameWallet(this.data,this.form.value.label).subscribe(function(){return t.dialogRef.close(t.form.value.label)}))},t.prototype.initForm=function(){this.form=this.formBuilder.group({label:[this.data.label,Xa.required]})},t}(),df=function(){function t(t,e,n){this.dialog=t,this.walletService=e,this.snackbar=n}return t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.editWallet=function(){var t=new Pa;t.width="566px",t.data=this.wallet,this.dialog.open(cf,t)},t.prototype.newAddress=function(){var t=this;this.snackbar.dismiss(),this.wallet.encrypted?this.dialog.open(Oc).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.addAddress(t.wallet,e.password).subscribe(function(){return e.close()},function(){return e.error()})}):this.walletService.addAddress(this.wallet).subscribe(null,function(e){var n=new gc;n.duration=3e5,t.snackbar.open(el(e._body),null,n)})},t.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},t.prototype.toggleEncryption=function(){var t=this,e=new Pa;e.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"Decrypt Wallet":"Encrypt Wallet"},this.wallet.encrypted||(e.data.description="We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet."),this.dialog.open(Oc,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.toggleEncryption(t.wallet,e.password).subscribe(function(){e.close()},function(t){return e.error(t)})})},t.prototype.copyAddress=function(t){var e=document.createElement("textarea");e.style.position="fixed",e.style.left="0",e.style.top="0",e.style.opacity="0",e.value=t.address,document.body.appendChild(e),e.focus(),e.select(),document.execCommand("copy"),document.body.removeChild(e),t.copying=!0,setTimeout(function(){t.copying=!1},500)},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Pa;n.data={address:e},this.dialog.open(Np,n).afterClosed().subscribe()},t}(),hf=r._3({encapsulation:0,styles:[[".-record[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px;line-height:60px;min-height:60px;padding:0 50px 0 20px}.-record[_ngcontent-%COMP%] .id-column[_ngcontent-%COMP%]{width:50px;color:rgba(30,34,39,.6)}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.6);-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{display:inline-block;line-height:60px;margin:0;vertical-align:middle}.-record[_ngcontent-%COMP%] .address-column[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{display:inline-block}.-record[_ngcontent-%COMP%] .hours-column[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);width:150px}.-record[_ngcontent-%COMP%] .coins-column[_ngcontent-%COMP%]{color:#000;width:150px}.-record[_ngcontent-%COMP%] .coins-column[_ngcontent-%COMP%]:hover .outputs-label[_ngcontent-%COMP%]{display:inline-block}.-record[_ngcontent-%COMP%] > img[_ngcontent-%COMP%]{display:inline-block;margin:14px 14px 14px 0;height:32px;width:32px}.-actions[_ngcontent-%COMP%]{border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:60px;padding:14px 0;width:32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;display:inline-block;font-size:12px;height:60px;line-height:60px;margin:0 5px}@keyframes floatup{20%{opacity:.999}100%{-webkit-transform:translate3d(-50%,-17px,0);transform:translate3d(-50%,-17px,0)}}@-webkit-keyframes floatup{20%{opacity:.999}100%{-webkit-transform:translate3d(-50%,-17px,0);transform:translate3d(-50%,-17px,0)}}.click-to-copy[_ngcontent-%COMP%]{cursor:pointer}.copy-label[_ngcontent-%COMP%]{color:#0072ff;display:none;font-size:12px;line-height:100%;position:relative;opacity:.999;-webkit-transition:opacity .2s ease-in-out;transition:opacity .2s ease-in-out;top:-1px;padding-left:10px}.copy-label.hidden[_ngcontent-%COMP%]{opacity:.001}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);color:#0072ff;display:inline-block;position:absolute;top:-2px;left:50%;opacity:.001;text-align:center;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);-webkit-backface-visibility:hidden;white-space:nowrap;padding-left:11px}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}.outputs-label[_ngcontent-%COMP%]{color:#0072ff;display:none;font-size:12px;padding-left:10px}"]],data:{}});function pf(t){return r._29(0,[(t()(),r._5(0,0,null,null,30,"div",[["class","-record"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"div",[["class","id-column"]],null,null,null,null,null)),(t()(),r._27(3,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,11,"div",[["class","address-column"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.copyAddress(t.parent.context.$implicit)&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,0,"img",[["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.parent.context.$implicit.address)&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,6,"p",[["class","click-to-copy"]],null,null,null,null,null)),r._4(10,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(11,{copying:0}),(t()(),r._27(12,null,["\n "," "])),(t()(),r._5(13,0,null,null,1,"span",[["class","copy-label"],["data-label","Copied"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Copy"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(18,0,null,null,2,"div",[["class","hours-column"]],null,null,null,null,null)),(t()(),r._27(19,null,["",""])),r._22(20,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(22,0,null,null,7,"div",[["class","coins-column"]],null,null,null,null,null)),(t()(),r._27(23,null,["\n ","\n "])),r._22(24,2),(t()(),r._5(25,0,null,null,3,"span",[["class","outputs-label"],["routerLink","/settings/outputs"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,26).onClick()&&i),i},null,null)),r._4(26,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),r._21(27,{addr:0}),(t()(),r._27(-1,null,["Outputs"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,10,0,"click-to-copy",t(e,11,0,e.parent.context.$implicit.copying)),t(e,26,0,t(e,27,0,e.parent.context.$implicit.address),"/settings/outputs")},function(t,e){t(e,3,0,e.parent.context.index+1),t(e,12,0,e.parent.context.$implicit.address),t(e,19,0,r._28(e,19,0,t(e,20,0,r._17(e.parent.parent,0),e.parent.context.$implicit.hours?e.parent.context.$implicit.hours:0,"1.0-6"))),t(e,23,0,r._28(e,23,0,t(e,24,0,r._17(e.parent.parent,0),e.parent.context.$implicit.coins?e.parent.context.$implicit.coins:0,"1.0-6")))})}function ff(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,pf)),r._4(3,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.wallet.hideEmpty||e.context.$implicit.coins)},null)}function _f(t){return r._29(0,[(t()(),r._5(0,0,null,null,6,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,0,"img",[["src","../../../../../assets/img/minus-grey.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Hide Empty"])),(t()(),r._27(-1,null,["\n "]))],null,null)}function mf(t){return r._29(0,[(t()(),r._5(0,0,null,null,6,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,0,"img",[["src","../../../../../assets/img/plus-grey.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Show Empty"])),(t()(),r._27(-1,null,["\n "]))],null,null)}function gf(t){return r._29(0,[r._20(0,Ct,[r.t]),(t()(),r._0(16777216,null,null,1,null,ff)),r._4(2,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(4,0,null,null,36,"div",[["class","-actions"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,6,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.newAddress()&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,0,"img",[["src","../../../../../assets/img/plus-grey.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["New Address"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEmpty()&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,_f)),r._4(17,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,mf)),r._4(20,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(25,0,null,null,6,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEncryption()&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(27,0,null,null,0,"img",[["src","../../../../../assets/img/unlock-grey.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(29,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(30,null,[""," Wallet"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(33,0,null,null,6,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.editWallet()&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(35,0,null,null,0,"img",[["src","../../../../../assets/img/edit-grey.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(37,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Edit Wallet"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.wallet?n.wallet.addresses:r.Z),t(e,17,0,!n.wallet.hideEmpty),t(e,20,0,n.wallet.hideEmpty)},function(t,e){t(e,30,0,e.component.wallet.encrypted?"Decrypt":"Encrypt")})}var yf=r._3({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{width:calc(100% + 10px)}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function vf(t){return r._29(2,[(t()(),r._5(0,0,null,null,4,":svg:svg",[["class","mat-progress-bar-background mat-progress-bar-element"],["focusable","false"],["height","5"],["width","100%"]],null,null,null,null,null)),(t()(),r._5(1,0,null,null,2,":svg:defs",[],null,null,null,null,null)),(t()(),r._5(2,0,null,null,1,":svg:pattern",[["height","5"],["patternUnits","userSpaceOnUse"],["width","10"],["x","5"],["y","0"]],[[8,"id",0]],null,null,null,null)),(t()(),r._5(3,0,null,null,0,":svg:circle",[["cx","2.5"],["cy","2.5"],["r","2.5"]],null,null,null,null,null)),(t()(),r._5(4,0,null,null,0,":svg:rect",[["height","100%"],["width","100%"]],[[1,"fill",0]],null,null,null,null)),(t()(),r._5(5,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),r._4(6,278528,null,0,U,[r.s,r.k,r.C],{ngStyle:[0,"ngStyle"]},null),(t()(),r._5(7,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),r._4(8,278528,null,0,U,[r.s,r.k,r.C],{ngStyle:[0,"ngStyle"]},null),(t()(),r._5(9,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,6,0,n._bufferTransform()),t(e,8,0,n._primaryTransform())},function(t,e){var n=e.component;t(e,2,0,n.progressbarId),t(e,4,0,"url(#"+n.progressbarId+")")})}var bf=r._3({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:599px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function wf(t){return r._29(2,[r._16(null,0),r._16(null,1)],null,null)}var Mf=r._3({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px;vertical-align:middle}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:16px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function kf(t){return r._29(0,[(t()(),r._5(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(t,e,n){var r=!0,i=t.component;return"keydown"===e&&(r=!1!==i._handleKeydown(n)&&r),"click"===e&&(r=!1!==i.closed.emit("click")&&r),"@transformMenu.done"===e&&(r=!1!==i._onAnimationDone(n)&&r),r},null,null)),r._4(1,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._5(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),r._16(null,0)],function(t,e){t(e,1,0,"mat-menu-panel",e.component._classList)},function(t,e){t(e,0,0,e.component._panelAnimationState),t(e,2,0,"showing")})}function xf(t){return r._29(2,[r._25(402653184,1,{templateRef:0}),(t()(),r._0(0,[[1,2]],null,0,null,kf))],null,null)}var Lf=r._3({encapsulation:2,styles:[],data:{}});function Cf(t){return r._29(2,[r._16(null,0),(t()(),r._5(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._4(2,212992,null,0,Jo,[r.k,r.y,Qr,[2,qo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,2,0,n.disableRipple||n.disabled,n._getHostElement())},function(t,e){t(e,1,0,r._17(e,2).unbounded)})}var Sf=r._3({encapsulation:2,styles:[".mat-button,.mat-flat-button,.mat-icon-button,.mat-stroked-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}.mat-button[disabled],.mat-flat-button[disabled],.mat-icon-button[disabled],.mat-stroked-button[disabled]{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner{border:0}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay,.mat-stroked-button:hover .mat-button-focus-overlay{opacity:1}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-raised-button[disabled]{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-raised-button[disabled]{box-shadow:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-flat-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab[disabled]{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-fab::-moz-focus-inner{border:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-fab[disabled]{box-shadow:none}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab[disabled]{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-mini-fab[disabled]{box-shadow:none}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function Tf(t){return r._29(2,[r._25(402653184,1,{ripple:0}),(t()(),r._5(1,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._16(null,0),(t()(),r._5(3,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._4(4,212992,[[1,4]],0,Jo,[r.k,r.y,Qr,[2,qo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._5(5,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,4,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,3,0,n._isRoundButton||n._isIconButton,r._17(e,4).unbounded)})}var Df=r._3({encapsulation:2,styles:[".mat-button,.mat-flat-button,.mat-icon-button,.mat-stroked-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}.mat-button[disabled],.mat-flat-button[disabled],.mat-icon-button[disabled],.mat-stroked-button[disabled]{cursor:default}.mat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-button.cdk-program-focused .mat-button-focus-overlay,.mat-flat-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-flat-button.cdk-program-focused .mat-button-focus-overlay,.mat-icon-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-icon-button.cdk-program-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-stroked-button.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-flat-button::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-stroked-button::-moz-focus-inner{border:0}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay,.mat-stroked-button:hover .mat-button-focus-overlay{opacity:1}.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-raised-button[disabled]{cursor:default}.mat-raised-button.cdk-keyboard-focused .mat-button-focus-overlay,.mat-raised-button.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-raised-button::-moz-focus-inner{border:0}.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-raised-button[disabled]{box-shadow:none}.mat-stroked-button{border:1px solid currentColor;padding:0 15px;line-height:34px}.mat-stroked-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-flat-button:not([class*=mat-elevation-z]){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab[disabled]{cursor:default}.mat-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-fab.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-fab::-moz-focus-inner{border:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-fab[disabled]{box-shadow:none}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px;transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab[disabled]{cursor:default}.mat-mini-fab.cdk-keyboard-focused .mat-button-focus-overlay,.mat-mini-fab.cdk-program-focused .mat-button-focus-overlay{opacity:1}.mat-mini-fab::-moz-focus-inner{border:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-mini-fab[disabled]{box-shadow:none}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-flat-button,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function Of(t){return r._29(2,[r._25(402653184,1,{ripple:0}),(t()(),r._5(1,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._16(null,0),(t()(),r._5(3,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._4(4,212992,[[1,4]],0,Jo,[r.k,r.y,Qr,[2,qo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._5(5,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,4,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,3,0,n._isRoundButton||n._isIconButton,r._17(e,4).unbounded)})}var Yf=r._3({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Pf(t){return r._29(2,[r._16(null,0)],null,null)}var Ef=function(t){this.appService=t},jf=r._3({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#9e6924;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function Af(t){return r._29(0,[(t()(),r._5(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,1)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,1)._emitHoverEvent()&&i),i},Cf,Lf)),r._4(1,180224,[[1,4]],0,Pu,[r.k,Ot,Oo],{disabled:[0,"disabled"]},null),(t()(),r._27(2,0,[" v"," "]))],function(t,e){t(e,1,0,!0)},function(t,e){var n=e.component;t(e,0,0,r._17(e,1)._highlighted,r._17(e,1)._triggersSubmenu,r._17(e,1)._getTabIndex(),r._17(e,1).disabled.toString(),r._17(e,1).disabled||null),t(e,2,0,n.appService.version.version)})}function If(t){return r._29(0,[(t()(),r._5(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(t()(),r._27(3,null,["\n ","\n"])),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(5,0,null,null,68,"div",[["class","buttons-right"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,31,"mat-menu",[],null,null,null,xf,Mf)),r._4(8,1228800,[["settingsMenu",4]],2,ju,[r.k,r.y,Eu],{overlapTrigger:[0,"overlapTrigger"]},null),r._25(603979776,1,{items:1}),r._25(335544320,2,{lazyContent:0}),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(12,0,null,0,4,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,13)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,13)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._17(t,14).onClick()&&i),i},Cf,Lf)),r._4(13,180224,[[1,4]],0,Pu,[r.k,Ot,Oo],null,null),r._4(14,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._19(15,1),(t()(),r._27(-1,0,[" Networking "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(18,0,null,0,4,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,19)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,19)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._17(t,20).onClick()&&i),i},Cf,Lf)),r._4(19,180224,[[1,4]],0,Pu,[r.k,Ot,Oo],null,null),r._4(20,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._19(21,1),(t()(),r._27(-1,0,[" Blockchain "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(24,0,null,0,4,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,25)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,25)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._17(t,26).onClick()&&i),i},Cf,Lf)),r._4(25,180224,[[1,4]],0,Pu,[r.k,Ot,Oo],null,null),r._4(26,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._19(27,1),(t()(),r._27(-1,0,[" Outputs "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(30,0,null,0,4,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,31)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,31)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._17(t,32).onClick()&&i),i},Cf,Lf)),r._4(31,180224,[[1,4]],0,Pu,[r.k,Ot,Oo],null,null),r._4(32,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._19(33,1),(t()(),r._27(-1,0,[" Pending Transactions "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,Af)),r._4(37,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(40,0,null,null,14,"mat-menu",[],null,null,null,xf,Mf)),r._4(41,1228800,[["menuMenu",4]],2,ju,[r.k,r.y,Eu],{overlapTrigger:[0,"overlapTrigger"]},null),r._25(603979776,3,{items:1}),r._25(335544320,4,{lazyContent:0}),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(45,0,null,0,4,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,46)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,46)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._17(t,47).onClick()&&i),i},Cf,Lf)),r._4(46,180224,[[3,4]],0,Pu,[r.k,Ot,Oo],null,null),r._4(47,16384,null,0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._19(48,1),(t()(),r._27(-1,0,[" Backup wallet "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(51,0,null,0,2,"a",[["class","color-primary mat-menu-item"],["href","http://172.104.173.74:8001"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,52)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._17(t,52)._emitHoverEvent()&&i),i},Cf,Lf)),r._4(52,180224,[[3,4]],0,Pu,[r.k,Ot,Oo],null,null),(t()(),r._27(-1,0,[" SolarBankersCoin Explorer "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(56,16777216,null,null,7,"button",[["aria-haspopup","true"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._17(t,58)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._17(t,58)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._17(t,58)._handleClick(n)&&i),i},Tf,Sf)),r._4(57,180224,null,0,ml,[r.k,Qr,Oo],null,null),r._4(58,1196032,null,0,Hu,[eo,r.k,r.N,Au,[2,ju],[8,null],[2,mi],Oo],{menu:[0,"menu"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(60,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Pf,Yf)),r._4(61,638976,null,0,Du,[r.k,Lu,[8,null]],null,null),(t()(),r._27(-1,0,["settings"])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(65,16777216,null,null,7,"button",[["aria-haspopup","true"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._17(t,67)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._17(t,67)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._17(t,67)._handleClick(n)&&i),i},Tf,Sf)),r._4(66,180224,null,0,ml,[r.k,Qr,Oo],null,null),r._4(67,1196032,null,0,Hu,[eo,r.k,r.N,Au,[2,ju],[8,null],[2,mi],Oo],{menu:[0,"menu"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(69,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Pf,Yf)),r._4(70,638976,null,0,Du,[r.k,Lu,[8,null]],null,null),(t()(),r._27(-1,0,["menu"])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,8,0,!1),t(e,14,0,t(e,15,0,"/settings/network")),t(e,20,0,t(e,21,0,"/settings/blockchain")),t(e,26,0,t(e,27,0,"/settings/outputs")),t(e,32,0,t(e,33,0,"/settings/pending-transactions")),t(e,37,0,n.appService.version),t(e,41,0,!1),t(e,47,0,t(e,48,0,"/settings/backup")),t(e,58,0,r._17(e,8)),t(e,61,0),t(e,67,0,r._17(e,41)),t(e,70,0)},function(t,e){t(e,3,0,e.component.title),t(e,12,0,r._17(e,13)._highlighted,r._17(e,13)._triggersSubmenu,r._17(e,13)._getTabIndex(),r._17(e,13).disabled.toString(),r._17(e,13).disabled||null),t(e,18,0,r._17(e,19)._highlighted,r._17(e,19)._triggersSubmenu,r._17(e,19)._getTabIndex(),r._17(e,19).disabled.toString(),r._17(e,19).disabled||null),t(e,24,0,r._17(e,25)._highlighted,r._17(e,25)._triggersSubmenu,r._17(e,25)._getTabIndex(),r._17(e,25).disabled.toString(),r._17(e,25).disabled||null),t(e,30,0,r._17(e,31)._highlighted,r._17(e,31)._triggersSubmenu,r._17(e,31)._getTabIndex(),r._17(e,31).disabled.toString(),r._17(e,31).disabled||null),t(e,45,0,r._17(e,46)._highlighted,r._17(e,46)._triggersSubmenu,r._17(e,46)._getTabIndex(),r._17(e,46).disabled.toString(),r._17(e,46).disabled||null),t(e,51,0,r._17(e,52)._highlighted,r._17(e,52)._triggersSubmenu,r._17(e,52)._getTabIndex(),r._17(e,52).disabled.toString(),r._17(e,52).disabled||null),t(e,56,0,r._17(e,57).disabled||null),t(e,65,0,r._17(e,66).disabled||null)})}var Hf={otcEnabled:!1},Rf=function(){function t(){this.otcEnabled=Hf.otcEnabled}return t.prototype.ngOnInit=function(){},t}(),Nf=r._3({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}"]],data:{}});function Ff(t){return r._29(0,[(t()(),r._5(0,0,null,null,6,"div",[["class","-button"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[["class","secondary-color"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Buy Skycoin"])),(t()(),r._27(-1,null,["\n "]))],null,null)}function Vf(t){return r._29(0,[(t()(),r._5(0,0,null,null,45,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,42,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,10,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,5).onClick()&&i),i},null,null)),r._4(5,16384,[[1,4]],0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._4(6,1720320,null,2,ip,[Qh,r.k,r.C,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._25(603979776,1,{links:1}),r._25(603979776,2,{linksWithHrefs:1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Wallets"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(16,0,null,null,10,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,17).onClick()&&i),i},null,null)),r._4(17,16384,[[3,4]],0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._4(18,1720320,null,2,ip,[Qh,r.k,r.C,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._25(603979776,3,{links:1}),r._25(603979776,4,{linksWithHrefs:1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(22,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(24,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Send"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(28,0,null,null,10,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,29).onClick()&&i),i},null,null)),r._4(29,16384,[[5,4]],0,ep,[Qh,ph,[8,null],r.C,r.k],{routerLink:[0,"routerLink"]},null),r._4(30,1720320,null,2,ip,[Qh,r.k,r.C,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._25(603979776,5,{links:1}),r._25(603979776,6,{linksWithHrefs:1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(34,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(36,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["History"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(40,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,Ff)),r._4(43,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,"/wallets"),t(e,6,0,"no-opacity"),t(e,17,0,"/send"),t(e,18,0,"no-opacity"),t(e,29,0,"/transactions"),t(e,30,0,"no-opacity"),t(e,43,0,n.otcEnabled)},null)}var zf=function(){function t(t){this.total=t}return t.prototype.call=function(t,e){return e.subscribe(new Wf(t,this.total))},t}(),Wf=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(o.b)(e,t),e.prototype._next=function(t){++this.count>this.total&&this.destination.next(t)},e}(Zn.a);a.a.prototype.skip=function(t){return function(t){return function(e){return e.lift(new zf(t))}}(t)(this)},a.a.prototype.take=function(t){return Ti(t)(this)};var Bf=function(){function t(t,e,n,r,i,o){this.appService=t,this.apiService=e,this.blockchainService=n,this.priceService=r,this.walletService=i,this.http=o,this.addresses=[],this.querying=!0}return Object.defineProperty(t.prototype,"loading",{get:function(){return!this.current||!this.highest||this.current!==this.highest},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"coins",{get:function(){return this.addresses.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hours",{get:function(){return this.addresses.map(function(t){return t.hours>=0?t.hours:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.blockchainService.progress.filter(function(t){return!!t}).subscribe(function(e){t.querying=!1,t.highest=e.highest,t.current=e.current,t.percentage=t.current&&t.highest?t.current/t.highest:0}),this.setVersion(),this.priceSubscription=this.priceService.price.subscribe(function(e){return t.price=e}),this.walletSubscription=this.walletService.allAddresses().subscribe(function(e){t.addresses=e.reduce(function(t,e){return t.find(function(t){return t.address===e.address})||t.push(e),t},[])}),this.walletService.pendingTransactions().subscribe(function(e){t.hasPendingTxs=e.length>0})},t.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe(),this.walletSubscription.unsubscribe()},t.prototype.setVersion=function(){var t=this;setTimeout(function(){t.apiService.getVersion().first().subscribe(function(e){t.version=e.version,t.retrieveReleaseVersion()})},1e3)},t.prototype.retrieveReleaseVersion=function(){var t=this;this.http.get("https://api.github.com/repos/skycoin/skycoin/tags").map(function(t){return t.json()}).catch(function(t){return a.a.throw(t||"Unable to fetch latest release version from github.")}).subscribe(function(e){t.releaseVersion=e.find(function(t){return-1===t.name.indexOf("rc")}).name.substr(1),t.updateAvailable=function(e,n){for(var r=t.releaseVersion.split("."),i=e.split("-"),o=i[0].split("."),a=0;a<3;a++){var s=Number(r[a]),l=Number(o[a]);if(s>l)return!0;if(s img[_ngcontent-%COMP%]{display:inline-block;margin:14px 14px 14px 0;height:32px;width:32px}.-wallet-detail[_ngcontent-%COMP%]{background-color:#fafafa}.action-buttons[_ngcontent-%COMP%]{margin-bottom:74px;padding:40px 0;text-align:center}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background-color:#f7f7f7;border:none;-webkit-box-shadow:none;box-shadow:none;color:rgba(30,34,39,.5);font-size:13px;margin:0 5px;min-width:140px}.action-buttons[_ngcontent-%COMP%] button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:28px;margin-left:-4px;width:28px}span[_ngcontent-%COMP%]{display:inline-block;width:50%}"]],data:{}});function o_(t){return r._29(0,[(t()(),r._5(0,0,null,null,0,"img",[["src","../../../../assets/img/lock-gold.png"]],null,null,null,null,null))],null,null)}function a_(t){return r._29(0,[(t()(),r._5(0,0,null,null,0,"img",[["src","../../../../assets/img/unlock-grey.png"]],null,null,null,null,null))],null,null)}function s_(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"div",[["class","-wallet-detail"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"app-wallet-detail",[],null,null,null,gf,hf)),r._4(3,180224,null,0,df,[Va,Xr,bc],{wallet:[0,"wallet"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,e.parent.context.$implicit)},null)}function l_(t){return r._29(0,[(t()(),r._5(0,0,null,null,31,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,25,"div",[["class","-wallet"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleWallet(t.context.$implicit)&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"div",[["class","-width-250 -label"]],null,null,null,null,null)),(t()(),r._27(5,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,7,"div",[["class","flex-fill -encryption"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,o_)),r._4(10,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,a_)),r._4(13,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(16,0,null,null,2,"div",[["class","-width-150 -hours"]],null,null,null,null,null)),(t()(),r._27(17,null,["",""])),r._22(18,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(20,0,null,null,2,"div",[["class","-width-150 -coins"]],null,null,null,null,null)),(t()(),r._27(21,null,["",""])),r._22(22,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(24,0,null,null,2,"img",[["src","../../../../assets/img/chevron-right-grey.png"]],null,null,null,null,null)),r._4(25,278528,null,0,A,[r.r,r.s,r.k,r.C],{ngClass:[0,"ngClass"]},null),r._21(26,{"rotate-270":0,"rotate-90":1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,s_)),r._4(30,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,10,0,e.context.$implicit.encrypted),t(e,13,0,!e.context.$implicit.encrypted),t(e,25,0,t(e,26,0,e.context.$implicit.opened,!e.context.$implicit.opened)),t(e,30,0,e.context.$implicit.opened)},function(t,e){t(e,5,0,e.context.$implicit.label),t(e,17,0,r._28(e,17,0,t(e,18,0,r._17(e.parent,0),e.context.$implicit.hours?e.context.$implicit.hours:0,"1.0-6"))),t(e,21,0,r._28(e,21,0,t(e,22,0,r._17(e.parent,0),e.context.$implicit.coins?e.context.$implicit.coins:0,"1.0-6")))})}function u_(t){return r._29(0,[r._20(0,Ct,[r.t]),(t()(),r._5(1,0,null,null,44,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(3,0,null,null,1,"app-header",[["title","Wallets"]],null,null,null,r_,Uf)),r._4(4,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,38,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,13,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,1,"div",[["class","-width-250"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Wallet"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,1,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Encryption"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(16,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._27(-1,null,["SLB Hours"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(19,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Balance"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,5,"div",[["class","-wallets"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,2,null,l_)),r._4(26,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),r._20(131072,Lt,[r.h]),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(30,0,null,null,13,"div",[["class","action-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(32,0,null,null,4,"button",[["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.addWallet(!0)&&r),r},Tf,Sf)),r._4(33,180224,null,0,ml,[r.k,Qr,Oo],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(35,0,null,0,0,"img",[["src","../../../../assets/img/plus-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,0,[" Add Wallet\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(38,0,null,null,4,"button",[["mat-button",""]],[[8,"disabled",0]],[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.addWallet(!1)&&r),r},Tf,Sf)),r._4(39,180224,null,0,ml,[r.k,Qr,Oo],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(41,0,null,0,0,"img",[["src","../../../../assets/img/load-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,0,[" Load Wallet\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,"Wallets"),t(e,26,0,r._28(e,26,0,r._17(e,27).transform(n.walletService.all())))},function(t,e){t(e,32,0,r._17(e,33).disabled||null),t(e,38,0,r._17(e,39).disabled||null)})}var c_=r._1("app-wallets",Dc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-wallets",[],null,null,null,u_,i_)),r._4(1,49152,null,0,Dc,[Xr,Va],null,null)],null,null)},{},{},[]),d_=r._3({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function h_(t){return r._29(2,[(t()(),r._5(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(t()(),r._5(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(t,e){var n=e.component;t(e,0,0,n._elementSize,n._elementSize,n._viewBox),t(e,1,0,n._circleRadius,"mat-progress-spinner-stroke-rotate-"+n.diameter,n._strokeDashOffset,n._strokeCircumference,n._circleStrokeWidth)})}var p_=r._3({encapsulation:0,styles:[["button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px;width:160px}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px}"]],data:{}});function f_(t){return r._29(0,[(t()(),r._5(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Pf,Yf)),r._4(1,638976,null,0,Du,[r.k,Lu,[8,null]],null,null),(t()(),r._27(-1,0,["done"]))],function(t,e){t(e,1,0)},null)}function __(t){return r._29(0,[(t()(),r._5(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Pf,Yf)),r._4(1,638976,null,0,Du,[r.k,Lu,[8,null]],null,null),(t()(),r._27(-1,0,["error"]))],function(t,e){t(e,1,0)},null)}function m_(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,h_,d_)),r._4(1,573440,null,0,pc,[r.k,Qr,[2,Ot]],null,null)],null,function(t,e){t(e,0,0,r._17(e,1)._elementSize,r._17(e,1)._elementSize)})}function g_(t){return r._29(0,[r._25(402653184,1,{tooltip:0}),(t()(),r._5(1,16777216,null,null,16,"button",[["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"mouseenter"],[null,"mouseleave"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._17(t,5).show()&&i),"keydown"===e&&(i=!1!==r._17(t,5)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._17(t,5)._handleTouchend()&&i),"click"===e&&(i=!1!==(0!==o.state?o.onClick():null)&&i),"mouseenter"===e&&(i=0!=(o.mouseOver=!0)&&i),"mouseleave"===e&&(i=0!=(o.mouseOver=!1)&&i),i},Tf,Sf)),r._4(2,278528,null,0,A,[r.r,r.s,r.k,r.C],{ngClass:[0,"ngClass"]},null),r._21(3,{enabled:0}),r._4(4,180224,null,0,ml,[r.k,Qr,Oo],{disabled:[0,"disabled"],color:[1,"color"]},null),r._4(5,147456,[[1,4],["tooltip",4]],0,oc,[eo,r.k,ci,r.N,r.y,Qr,Mo,Oo,nc,[2,mi],[2,ic]],{message:[0,"message"]},null),(t()(),r._27(-1,0,["\n "])),r._16(0,0),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,f_)),r._4(10,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,__)),r._4(13,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,m_)),r._4(16,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,t(e,3,0,!n.disabled)),t(e,4,0,n.disabled&&!n.forceEmitEvents,"primary"),t(e,5,0,n.error?n.error:null),t(e,10,0,1===n.state),t(e,13,0,2===n.state),t(e,16,0,0===n.state)},function(t,e){t(e,1,0,r._17(e,4).disabled||null)})}var y_=r._3({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function v_(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"option",[],[[8,"disabled",0]],null,null,null,null)),r._4(1,147456,null,0,fs,[r.k,r.C,[2,ps]],{ngValue:[0,"ngValue"]},null),r._4(2,147456,null,0,gs,[r.k,r.C,[8,null]],{ngValue:[0,"ngValue"]},null),(t()(),r._27(3,null,["\n "," - "," SLB\n "])),r._22(4,2)],function(t,e){t(e,1,0,e.context.$implicit),t(e,2,0,e.context.$implicit)},function(t,e){t(e,0,0,e.context.$implicit.balance<=0),t(e,3,0,e.context.$implicit.label,r._28(e,3,1,t(e,4,0,r._17(e.parent,0),e.context.$implicit.coins,"1.0-6")))})}function b_(t){return r._29(0,[r._20(0,Ct,[r.t]),r._25(402653184,1,{button:0}),(t()(),r._5(2,0,null,null,1,"app-header",[["title","Wallets"]],null,null,null,r_,Uf)),r._4(3,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(5,0,null,null,68,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,65,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,8).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,8).onReset()&&i),i},null,null)),r._4(8,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(10,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,16,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,1,"label",[["for","wallet"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Send from"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(17,0,null,null,10,"select",[["formControlName","wallet"],["id","wallet"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._17(t,18).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,18).onTouched()&&i),i},null,null)),r._4(18,16384,null,0,ps,[r.C,r.k],null,null),r._23(1024,null,ts,function(t){return[t]},[ps]),r._4(20,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(22,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,2,null,v_)),r._4(25,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),r._20(131072,Lt,[r.h]),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(30,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(32,0,null,null,1,"label",[["for","address"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Send to"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(35,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,36)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,36).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,36)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,36)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(36,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(38,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(40,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(43,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(45,0,null,null,1,"label",[["for","amount"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Amount"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(48,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,49)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,49).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,49)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,49)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.send()&&i),i},null,null)),r._4(49,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(51,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(53,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(56,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(58,0,null,null,1,"label",[["for","notes"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Notes"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(61,0,null,null,5,"textarea",[["formControlName","notes"],["id","notes"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,62)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,62).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,62)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,62)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(62,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(64,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(66,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(69,0,null,null,2,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},g_,p_)),r._4(70,49152,[[1,4],["button",4]],0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Send\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,"Wallets"),t(e,8,0,n.form),t(e,20,0,"wallet"),t(e,25,0,r._28(e,25,0,r._17(e,26).transform(n.walletService.all()))),t(e,38,0,"address"),t(e,51,0,"amount"),t(e,64,0,"notes"),t(e,70,0,!n.form.valid)},function(t,e){t(e,7,0,r._17(e,10).ngClassUntouched,r._17(e,10).ngClassTouched,r._17(e,10).ngClassPristine,r._17(e,10).ngClassDirty,r._17(e,10).ngClassValid,r._17(e,10).ngClassInvalid,r._17(e,10).ngClassPending),t(e,17,0,r._17(e,22).ngClassUntouched,r._17(e,22).ngClassTouched,r._17(e,22).ngClassPristine,r._17(e,22).ngClassDirty,r._17(e,22).ngClassValid,r._17(e,22).ngClassInvalid,r._17(e,22).ngClassPending),t(e,35,0,r._17(e,40).ngClassUntouched,r._17(e,40).ngClassTouched,r._17(e,40).ngClassPristine,r._17(e,40).ngClassDirty,r._17(e,40).ngClassValid,r._17(e,40).ngClassInvalid,r._17(e,40).ngClassPending),t(e,48,0,r._17(e,53).ngClassUntouched,r._17(e,53).ngClassTouched,r._17(e,53).ngClassPristine,r._17(e,53).ngClassDirty,r._17(e,53).ngClassValid,r._17(e,53).ngClassInvalid,r._17(e,53).ngClassPending),t(e,61,0,r._17(e,66).ngClassUntouched,r._17(e,66).ngClassTouched,r._17(e,66).ngClassPristine,r._17(e,66).ngClassDirty,r._17(e,66).ngClassValid,r._17(e,66).ngClassInvalid,r._17(e,66).ngClassPending)})}var w_=r._1("app-send-skycoin",Yc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-send-skycoin",[],null,null,null,b_,y_)),r._4(1,245760,null,0,Yc,[Zs,Xr,bc,Va],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),M_=r._3({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.2)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:100px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}"]],data:{}});function k_(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"h4",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Sent SLB "])),(t()(),r._5(2,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._27(3,null,["",""])),r._22(4,2)],null,function(t,e){t(e,3,0,r._28(e,3,0,t(e,4,0,r._17(e.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function x_(t){return r._29(0,[(t()(),r._5(0,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Sending SLB "])),(t()(),r._5(2,0,null,null,1,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Pending"]))],null,null)}function L_(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"h4",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Received SLB "])),(t()(),r._5(2,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._27(3,null,["",""])),r._22(4,2)],null,function(t,e){t(e,3,0,r._28(e,3,0,t(e,4,0,r._17(e.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function C_(t){return r._29(0,[(t()(),r._5(0,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Sent SLB "])),(t()(),r._5(2,0,null,null,1,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Pending"]))],null,null)}function S_(t){return r._29(0,[(t()(),r._5(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,0,"img",[["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.context.$implicit)&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(5,null,["",""])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){t(e,5,0,e.context.$implicit)})}function T_(t){return r._29(0,[(t()(),r._5(0,0,null,null,33,"div",[["class","-transaction"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showTransaction(t.parent.context.$implicit)&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._4(3,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(4,{"-incoming":0,"-pending":1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,16,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,k_)),r._4(12,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,x_)),r._4(15,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,L_)),r._4(18,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,C_)),r._4(21,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,S_)),r._4(24,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(27,0,null,null,5,"div",[["class","-balance"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(29,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._27(30,null,[""," SLB"])),r._22(31,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,"-icon",t(e,4,0,e.parent.context.$implicit.balance>0,!e.parent.context.$implicit.confirmed)),t(e,12,0,e.parent.context.$implicit.balance<0&&e.parent.context.$implicit.confirmed),t(e,15,0,e.parent.context.$implicit.balance<0&&!e.parent.context.$implicit.confirmed),t(e,18,0,e.parent.context.$implicit.balance>0&&e.parent.context.$implicit.confirmed),t(e,21,0,e.parent.context.$implicit.balance>0&&!e.parent.context.$implicit.confirmed),t(e,24,0,e.parent.context.$implicit.addresses)},function(t,e){t(e,30,0,r._28(e,30,0,t(e,31,0,r._17(e.parent.parent,1),e.parent.context.$implicit.balance,"1.0-6")))})}function D_(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,T_)),r._4(3,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,0!==e.context.$implicit.balance)},null)}function O_(t){return r._29(0,[r._20(0,ut,[r.t]),r._20(0,Ct,[r.t]),(t()(),r._5(2,0,null,null,1,"app-header",[["title","Transactions"]],null,null,null,r_,Uf)),r._4(3,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(5,0,null,null,7,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,D_)),r._4(10,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,"Transactions"),t(e,10,0,n.transactions)},null)}var Y_=r._1("app-transaction-list",Fp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-transaction-list",[],null,null,null,O_,M_)),r._4(1,245760,null,0,Fp,[Va,Hp,Xr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),P_=function(){function t(){}return t.prototype.transform=function(t){switch(t){case"done":return"Completed";case"waiting_confirm":return"Waiting for confirmation";case"waiting_deposit":return"Waiting for Bitcoin deposit";case"waiting_send":return"Waiting to send Skycoin";default:return"Unknown"}},t}(),E_=r._3({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function j_(t){return r._29(0,[(t()(),r._5(0,0,null,null,6,"option",[],null,null,null,null,null)),r._4(1,147456,null,0,fs,[r.k,r.C,[2,ps]],{value:[0,"value"]},null),r._4(2,147456,null,0,gs,[r.k,r.C,[8,null]],{value:[0,"value"]},null),(t()(),r._27(3,null,["\n "," - "])),(t()(),r._5(4,0,null,null,1,"span",[["class","-coins"]],null,null,null,null,null)),(t()(),r._27(5,null,[""," SKY"])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,1,0,e.context.$implicit.filename),t(e,2,0,e.context.$implicit.filename)},function(t,e){t(e,3,0,e.context.$implicit.label),t(e,5,0,e.context.$implicit.coins)})}function A_(t){return r._29(0,[(t()(),r._5(0,0,null,null,25,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._27(-1,null,["2"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,16,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Send Bitcoin"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,4,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet\n selected above at the current rate of "])),(t()(),r._5(15,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(16,null,[""," SKY/BTC"])),(t()(),r._27(-1,null,[".\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(t()(),r._27(20,null,["\n ","\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(22,0,null,null,1,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,16,0,n.config.sky_btc_exchange_rate),t(e,20,0,n.order.deposit_address)})}function I_(t){return r._29(0,[(t()(),r._5(0,0,null,null,28,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._27(-1,null,["3"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,19,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Receive Sky"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour\n to receive your SKY.\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(16,0,null,null,2,"span",[["class","-status"]],null,null,null,null,null)),(t()(),r._27(17,null,["\n Status: ","\n "])),r._22(18,1),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(20,0,null,null,2,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.checkStatus()&&r),r},g_,p_)),r._4(21,49152,[[1,4],["button",4]],0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n Check Status\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(24,0,null,null,2,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.removeOrder()&&r),r},g_,p_)),r._4(25,49152,[[1,4],["button",4]],0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n New Order\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,17,0,r._28(e,17,0,t(e,18,0,r._17(e.parent.parent,0),n.order.status)))})}function H_(t){return r._29(0,[(t()(),r._5(0,0,null,null,52,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,1).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,1).onReset()&&i),i},null,null)),r._4(1,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(3,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,40,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._27(-1,null,["1"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,31,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(15,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Deposit Location"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(18,0,null,null,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin."])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(21,0,null,null,19,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,16,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._17(t,24).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,24).onTouched()&&i),i},null,null)),r._4(24,16384,null,0,ps,[r.C,r.k],null,null),r._4(25,16384,null,0,Xs,[],{required:[0,"required"]},null),r._23(1024,null,Ga,function(t){return[t]},[Xs]),r._23(1024,null,ts,function(t){return[t]},[ps]),r._4(28,671744,null,0,Ks,[[3,qa],[2,Ga],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(30,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(32,0,null,null,3,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),r._4(33,147456,null,0,fs,[r.k,r.C,[2,ps]],null,null),r._4(34,147456,null,0,gs,[r.k,r.C,[8,null]],null,null),(t()(),r._27(-1,null,["Make a choice"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,j_)),r._4(38,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(42,0,null,null,1,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can\n have up to 5 BTC addresses assigned to it.\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,A_)),r._4(48,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,I_)),r._4(51,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,1,0,n.form),t(e,25,0,""),t(e,28,0,"wallet"),t(e,38,0,n.wallets),t(e,48,0,n.order),t(e,51,0,n.order)},function(t,e){t(e,0,0,r._17(e,3).ngClassUntouched,r._17(e,3).ngClassTouched,r._17(e,3).ngClassPristine,r._17(e,3).ngClassDirty,r._17(e,3).ngClassValid,r._17(e,3).ngClassInvalid,r._17(e,3).ngClassPending),t(e,23,0,r._17(e,25).required?"":null,r._17(e,30).ngClassUntouched,r._17(e,30).ngClassTouched,r._17(e,30).ngClassPristine,r._17(e,30).ngClassDirty,r._17(e,30).ngClassValid,r._17(e,30).ngClassInvalid,r._17(e,30).ngClassPending)})}function R_(t){return r._29(0,[r._20(0,P_,[]),r._25(671088640,1,{button:0}),(t()(),r._5(2,0,null,null,1,"app-header",[],null,null,null,r_,Uf)),r._4(3,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],null,null),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,H_)),r._4(10,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0),t(e,10,0,n.config)},null)}var N_=r._1("app-buy",Ip,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-buy",[],null,null,null,R_,E_)),r._4(1,114688,null,0,Ip,[Zs,Ap,bc,Xr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),F_=r._3({encapsulation:2,styles:[".mat-card{transition:box-shadow 280ms cubic-bezier(.4,0,.2,1);display:block;position:relative;padding:24px;border-radius:2px}.mat-card:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-card .mat-divider{position:absolute;left:0;width:100%}[dir=rtl] .mat-card .mat-divider{left:auto;right:0}.mat-card .mat-divider.mat-divider-inset{position:static;margin:0}@media screen and (-ms-high-contrast:active){.mat-card{outline:solid 1px}}.mat-card-flat{box-shadow:none}.mat-card-actions,.mat-card-content,.mat-card-subtitle,.mat-card-title{display:block;margin-bottom:16px}.mat-card-actions{margin-left:-16px;margin-right:-16px;padding:8px 0}.mat-card-actions-align-end{display:flex;justify-content:flex-end}.mat-card-image{width:calc(100% + 48px);margin:0 -24px 16px -24px}.mat-card-xl-image{width:240px;height:240px;margin:-8px}.mat-card-footer{display:block;margin:0 -24px -24px -24px}.mat-card-actions .mat-button,.mat-card-actions .mat-raised-button{margin:0 4px}.mat-card-header{display:flex;flex-direction:row}.mat-card-header-text{margin:0 8px}.mat-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0}.mat-card-lg-image,.mat-card-md-image,.mat-card-sm-image{margin:-8px 0}.mat-card-title-group{display:flex;justify-content:space-between;margin:0 -8px}.mat-card-sm-image{width:80px;height:80px}.mat-card-md-image{width:112px;height:112px}.mat-card-lg-image{width:152px;height:152px}@media (max-width:599px){.mat-card{padding:24px 16px}.mat-card-actions{margin-left:-8px;margin-right:-8px}.mat-card-image{width:calc(100% + 32px);margin:16px -16px}.mat-card-title-group{margin:0}.mat-card-xl-image{margin-left:0;margin-right:0}.mat-card-header{margin:-8px 0 0 0}.mat-card-footer{margin-left:-16px;margin-right:-16px}}.mat-card-content>:first-child,.mat-card>:first-child{margin-top:0}.mat-card-content>:last-child:not(.mat-card-footer),.mat-card>:last-child:not(.mat-card-footer){margin-bottom:0}.mat-card-image:first-child{margin-top:-24px}.mat-card>.mat-card-actions:last-child{margin-bottom:-16px;padding-bottom:0}.mat-card-actions .mat-button:first-child,.mat-card-actions .mat-raised-button:first-child{margin-left:0;margin-right:0}.mat-card-subtitle:not(:first-child),.mat-card-title:not(:first-child){margin-top:-4px}.mat-card-header .mat-card-subtitle:not(:first-child){margin-top:-8px}.mat-card>.mat-card-xl-image:first-child{margin-top:-8px}.mat-card>.mat-card-xl-image:last-child{margin-bottom:-8px}"],data:{}});function V_(t){return r._29(2,[r._16(null,0),r._16(null,1)],null,null)}var z_=r._3({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{margin:40px 20px 20px}.-table[_ngcontent-%COMP%] .-table-header[_ngcontent-%COMP%]{font-size:10px;color:rgba(30,34,39,.5);margin-bottom:20px}.-table[_ngcontent-%COMP%] .-table-row[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-table[_ngcontent-%COMP%] .-table-row[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{line-height:40px}.text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function W_(t){return r._29(0,[(t()(),r._5(0,0,null,null,16,"div",[["class","row -table-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,2,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._5(3,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(4,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,2,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._5(7,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(8,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,5,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,2,"button",[["color","primary"],["mat-raised-button",""]],[[8,"disabled",0]],[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showSeed(t.context.$implicit)&&r),r},Tf,Sf)),r._4(13,180224,null,0,ml,[r.k,Qr,Oo],{color:[0,"color"]},null),(t()(),r._27(-1,0,["Show seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,13,0,"primary")},function(t,e){t(e,4,0,e.context.$implicit.label),t(e,8,0,e.context.$implicit.filename),t(e,12,0,r._17(e,13).disabled||null)})}function B_(t){return r._29(0,[(t()(),r._5(0,0,null,null,39,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"app-header",[["title","Backup"]],null,null,null,r_,Uf)),r._4(3,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(5,0,null,null,14,"mat-card",[["class","mat-card"]],null,null,null,V_,F_)),r._4(6,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(8,0,null,0,1,"p",[],null,null,null,null,null)),(t()(),r._27(9,null,["Wallet Directory: ",""])),(t()(),r._27(-1,0,["\n\n "])),(t()(),r._5(11,0,null,0,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins."])),(t()(),r._27(-1,0,["\n\n "])),(t()(),r._5(14,0,null,0,4,"p",[["class","text-muted"]],null,null,null,null,null)),(t()(),r._5(15,0,null,null,3,"small",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Use the table below to get seeds from your encrypted wallets. "])),(t()(),r._5(17,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n To get seeds from unencrypted wallets, open the folder above,\n open the .wlt files in a text editor and recover the seeds.\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(21,0,null,null,17,"mat-card",[["class","-table mat-card"]],null,null,null,V_,F_)),r._4(22,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(24,0,null,0,10,"div",[["class","row -table-header"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(26,0,null,null,1,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Wallet Label"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(29,0,null,null,1,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Filename"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(32,0,null,null,1,"div",[["class","col-md-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,W_)),r._4(37,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,"Backup"),t(e,37,0,n.onlyEncrypted)},function(t,e){t(e,9,0,e.component.folder)})}var U_=r._1("app-backup",Yp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-backup",[],null,null,null,B_,z_)),r._4(1,114688,null,0,Yp,[Xr,Va],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),q_=function(){function t(){}return t.prototype.transform=function(t){return Pc.unix(t).fromNow()},t}(),J_=r._3({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}.skycoin-details[_ngcontent-%COMP%]{margin-top:40px;margin-bottom:20px;line-height:30px}.skycoin-detail-keys[_ngcontent-%COMP%]{display:inline-block;color:rgba(30,34,39,.5)}.skycoin-detail-values[_ngcontent-%COMP%]{display:inline-block}"]],data:{}});function G_(t){return r._29(0,[(t()(),r._5(0,0,null,null,7,"div",[["class","skycoin-detail-values"]],null,null,null,null,null)),(t()(),r._27(1,null,["\n "," "])),r._22(2,1),(t()(),r._5(3,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(4,null,["\n "," "])),r._22(5,1),(t()(),r._5(6,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(7,null,["\n ","\n "]))],null,function(t,e){var n=e.component;t(e,1,0,r._28(e,1,0,t(e,2,0,r._17(e.parent,0),n.block.header.seq))),t(e,4,0,r._28(e,4,0,t(e,5,0,r._17(e.parent,1),n.block.header.timestamp))),t(e,7,0,n.block.header.block_hash)})}function K_(t){return r._29(0,[r._20(0,Ct,[r.t]),r._20(0,q_,[]),(t()(),r._5(2,0,null,null,20,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"app-header",[["title","Blockchain"]],null,null,null,r_,Uf)),r._4(5,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(7,0,null,null,14,"mat-card",[["class","skycoin-details mat-card"]],null,null,null,V_,F_)),r._4(8,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(10,0,null,0,7,"div",[["class","skycoin-detail-keys"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Number of blocks: "])),(t()(),r._5(12,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Time since last block: "])),(t()(),r._5(14,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Hash of last block: "])),(t()(),r._5(16,0,null,null,0,"br",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,G_)),r._4(20,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,"Blockchain"),t(e,20,0,n.block&&n.block.header)},null)}var X_=r._1("app-blockchain",Dp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-blockchain",[],null,null,null,K_,J_)),r._4(1,114688,null,0,Dp,[Tp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Z_=r._3({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{margin-bottom:20px}mat-card[_ngcontent-%COMP%] .row[_ngcontent-%COMP%]{margin-bottom:-10px}mat-card[_ngcontent-%COMP%] .-peer[_ngcontent-%COMP%]{margin-bottom:10px;display:-webkit-box;display:-ms-flexbox;display:flex}mat-card[_ngcontent-%COMP%] .-peer[_ngcontent-%COMP%] .-port[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}h3[_ngcontent-%COMP%]{font-weight:400;margin-top:40px}h3[_ngcontent-%COMP%], mat-card[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}"]],data:{}});function Q_(t){return r._29(0,[(t()(),r._5(0,0,null,null,10,"div",[["class","col-lg-3"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,7,"div",[["class","-peer"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[["class","-ip"]],null,null,null,null,null)),(t()(),r._27(5,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(t()(),r._27(8,null,[":",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){t(e,5,0,e.context.$implicit.address.split(":")[0]),t(e,8,0,e.context.$implicit.listen_port)})}function $_(t){return r._29(0,[(t()(),r._5(0,0,null,null,10,"div",[["class","col-lg-3"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,7,"div",[["class","-peer"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"span",[["class","-ip"]],null,null,null,null,null)),(t()(),r._27(5,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(t()(),r._27(8,null,[":",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){t(e,5,0,e.context.$implicit.address.split(":")[0]),t(e,8,0,e.context.$implicit.listen_port)})}function tm(t){return r._29(0,[(t()(),r._5(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"app-header",[["title","Networking"]],null,null,null,r_,Uf)),r._4(3,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(5,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Automatic peers"])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(8,0,null,null,9,"mat-card",[["class","mat-card"]],null,null,null,V_,F_)),r._4(9,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(11,0,null,0,5,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,2,null,Q_)),r._4(14,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),r._20(131072,Lt,[r.h]),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(19,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Default peers"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(22,0,null,null,8,"mat-card",[["class","mat-card"]],null,null,null,V_,F_)),r._4(23,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(25,0,null,0,4,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,$_)),r._4(28,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,"Networking"),t(e,14,0,r._28(e,14,0,r._17(e,15).transform(n.networkService.automatic()))),t(e,28,0,n.defaultConnections)},null)}var em=r._1("app-network",jp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-network",[],null,null,null,tm,Z_)),r._4(1,114688,null,0,jp,[Ep],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),nm=r._3({encapsulation:0,styles:[[".-wallet[_ngcontent-%COMP%]{margin:40px 20px 0}.-wallet[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-weight:400}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{margin-bottom:20px}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] + .-output[_ngcontent-%COMP%]{margin-top:15px}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%]{border-top:1px solid #eee;padding:15px 0;font-size:14px}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%]:last-child{padding-bottom:0}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%] .-hash[_ngcontent-%COMP%]{margin-bottom:10px}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]{min-width:150px;padding-right:20px}.-wallet[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-output[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function rm(t){return r._29(0,[(t()(),r._5(0,0,null,null,19,"div",[["class","-output"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"div",[["class","-hash"]],null,null,null,null,null)),(t()(),r._27(3,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,13,"div",[["class","-balance"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,4,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._5(8,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Coins:"])),(t()(),r._27(10,null,[" ",""])),r._22(11,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,4,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._5(14,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Hours:"])),(t()(),r._27(16,null,[" ",""])),r._22(17,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){t(e,3,0,e.context.$implicit.hash),t(e,10,0,r._28(e,10,0,t(e,11,0,r._17(e.parent.parent.parent,0),e.context.$implicit.coins,"1.0-6"))),t(e,16,0,r._28(e,16,0,t(e,17,0,r._17(e.parent.parent.parent,0),e.context.$implicit.calculated_hours,"1.0-6")))})}function im(t){return r._29(0,[(t()(),r._5(0,0,null,null,8,"mat-card",[["class","-address mat-card"]],null,null,null,V_,F_)),r._4(1,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(3,0,null,0,1,"h4",[],null,null,null,null,null)),(t()(),r._27(4,null,["",""])),(t()(),r._27(-1,0,["\n\n "])),(t()(),r._0(16777216,null,0,1,null,rm)),r._4(7,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,0,["\n "]))],function(t,e){t(e,7,0,e.context.$implicit.outputs)},function(t,e){t(e,4,0,e.context.$implicit.address)})}function om(t){return r._29(0,[(t()(),r._5(0,0,null,null,7,"div",[["class","-wallet"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"h3",[],null,null,null,null,null)),(t()(),r._27(3,null,["",""])),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._0(16777216,null,null,1,null,im)),r._4(6,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,6,0,e.context.$implicit.addresses)},function(t,e){t(e,3,0,e.context.$implicit.label)})}function am(t){return r._29(0,[r._20(0,Ct,[r.t]),(t()(),r._5(1,0,null,null,7,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(3,0,null,null,1,"app-header",[["title","Outputs"]],null,null,null,r_,Uf)),r._4(4,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._0(16777216,null,null,1,null,om)),r._4(7,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,"Outputs"),t(e,7,0,n.wallets)},null)}var sm=r._1("app-outputs",Sp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-outputs",[],null,null,null,am,nm)),r._4(1,49152,null,0,Sp,[Xr,ph],null,null)],null,null)},{},{},[]),lm=function(){function t(){}return t.prototype.transform=function(t){return Pc.unix(t).format("YYYY-MM-DD HH:mm")},t}(),um=r._3({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{margin:40px 20px 20px}.-table[_ngcontent-%COMP%] .-table-header[_ngcontent-%COMP%]{font-size:10px;color:rgba(30,34,39,.5);margin-bottom:20px}.-table[_ngcontent-%COMP%] .-table-row[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}"]],data:{}});function cm(t){return r._29(0,[(t()(),r._5(0,0,null,null,15,"div",[["class","row -table-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,3,"div",[["class","col-md-2"]],null,null,null,null,null)),(t()(),r._5(3,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._27(4,null,["",""])),r._22(5,1),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,3,"div",[["class","col-md-2"]],null,null,null,null,null)),(t()(),r._5(8,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._27(9,null,["",""])),r._22(10,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,2,"div",[["class","col-md-8"]],null,null,null,null,null)),(t()(),r._5(13,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(14,null,["",""])),(t()(),r._27(-1,null,["\n "]))],null,function(t,e){t(e,4,0,r._28(e,4,0,t(e,5,0,r._17(e.parent.parent,0),e.context.$implicit.timestamp))),t(e,9,0,r._28(e,9,0,t(e,10,0,r._17(e.parent.parent,1),e.context.$implicit.amount,"1.0-6"))),t(e,14,0,e.context.$implicit.txid)})}function dm(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,cm)),r._4(3,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.transactions)},null)}function hm(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"div",[["class","row -table-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"div",[["class","col-lg-12"]],null,null,null,null,null)),(t()(),r._27(-1,null,["No pending transactions"])),(t()(),r._27(-1,null,["\n "]))],null,null)}function pm(t){return r._29(0,[r._20(0,lm,[]),r._20(0,Ct,[r.t]),(t()(),r._5(2,0,null,null,26,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,1,"app-header",[["title","Pending Transactions"]],null,null,null,r_,Uf)),r._4(5,245760,null,0,Bf,[qp,nr,Tp,Hp,Xr,Fn],{title:[0,"title"]},null),(t()(),r._27(-1,null,["\n\n "])),(t()(),r._5(7,0,null,null,20,"mat-card",[["class","-table mat-card"]],null,null,null,V_,F_)),r._4(8,49152,null,0,Ml,[],null,null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(10,0,null,0,10,"div",[["class","row -table-header"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,1,"div",[["class","col-md-2"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Timestamp"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(15,0,null,null,1,"div",[["class","col-md-2"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Amount"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(18,0,null,null,1,"div",[["class","col-md-8"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Transaction ID"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,dm)),r._4(23,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,hm)),r._4(26,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,"Pending Transactions"),t(e,23,0,n.transactions&&n.transactions.length),t(e,26,0,n.transactions&&!n.transactions.length)},null)}var fm=r._1("app-pending-transactions",Ec,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-pending-transactions",[],null,null,null,pm,um)),r._4(1,114688,null,0,Ec,[Xr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),_m=function(t){return t[t.RightButton=0]="RightButton",t[t.LeftButton=1]="LeftButton",t}({}),mm=function(){function t(){this.onStateChange=new r.n,this.ButtonState=_m}return t.prototype.onRightClick=function(){this.activeButton===_m.LeftButton&&(this.activeButton=_m.RightButton,this.onStateChange.emit(_m.RightButton))},t.prototype.onLeftClick=function(){this.activeButton===_m.RightButton&&(this.activeButton=_m.LeftButton,this.onStateChange.emit(_m.LeftButton))},t}(),gm=r._3({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:rgba(0,0,0,0)!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}"]],data:{}});function ym(t){return r._29(0,[(t()(),r._5(0,0,null,null,9,"div",[["class","-buttons-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onLeftClick()&&r),r},g_,p_)),r._4(3,49152,null,0,Sc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._27(4,0,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onRightClick()&&r),r},g_,p_)),r._4(7,49152,null,0,Sc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._27(8,0,["",""])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.activeButton!==n.ButtonState.LeftButton,!0),t(e,7,0,n.activeButton!==n.ButtonState.RightButton,!0)},function(t,e){var n=e.component;t(e,4,0,n.leftButtonText),t(e,8,0,n.rightButtonText)})}var vm=function(){function t(t){this.dialogRef=t,this.acceptSafe=!1}return t.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},t.prototype.setAccept=function(t){this.acceptSafe=t.checked},t}(),bm=function(){function t(t,e,n){this.dialog=t,this.walletService=e,this.formBuilder=n,this.fill=null,this.onLabelAndSeedCreated=new r.n,this.doubleButtonActive=_m.LeftButton}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.initForm=function(){this.form=this.formBuilder.group({label:new Hs("",Xa.compose([Xa.required,Xa.minLength(2)])),seed:new Hs("",Xa.compose([Xa.required,Xa.minLength(2)])),confirm_seed:new Hs("",Xa.compose(this.showCreateForm?[Xa.required,Xa.minLength(2)]:[]))},this.showCreateForm?{validator:this.seedMatchValidator.bind(this)}:{}),this.fill?(this.form.get("label").setValue(this.fill.label),this.form.get("seed").setValue(this.fill.seed),this.form.get("confirm_seed").setValue(this.fill.seed),this.doubleButtonActive=this.fill.create?_m.LeftButton:_m.RightButton):this.showCreateForm&&this.generateSeed(128)},t.prototype.changeForm=function(t){this.doubleButtonActive=t,this.fill=null,this.initForm()},t.prototype.createWallet=function(){var t=this;this.showSafe().afterClosed().subscribe(function(e){e&&t.emitCreatedData()})},t.prototype.loadWallet=function(){this.emitCreatedData()},t.prototype.generateSeed=function(t){var e=this;this.walletService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},Object.defineProperty(t.prototype,"showCreateForm",{get:function(){return this.doubleButtonActive===_m.LeftButton},enumerable:!0,configurable:!0}),t.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit([this.form.get("label").value,this.form.get("seed").value,this.doubleButtonActive===_m.LeftButton])},t.prototype.seedMatchValidator=function(t){return t.get("seed").value===t.get("confirm_seed").value?null:{mismatch:!0}},t.prototype.showSafe=function(){var t=new Pa;return t.width="450px",this.dialog.open(vm,t)},t}(),wm=r._3({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function Mm(t){return r._29(0,[(t()(),r._5(0,0,null,null,12,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,16777216,null,null,2,"span",[["matTooltip","Generate 12 word seed"]],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._17(t,3).show()&&i),"keydown"===e&&(i=!1!==r._17(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._17(t,3)._handleTouchend()&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._4(3,147456,null,0,oc,[eo,r.k,ci,r.N,r.y,Qr,Mo,Oo,nc,[2,mi],[2,ic]],{message:[0,"message"]},null),(t()(),r._27(-1,null,["12 words"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._27(-1,null,["|"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,16777216,null,null,2,"span",[["matTooltip","Generate 24 word seed"]],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._17(t,10).show()&&i),"keydown"===e&&(i=!1!==r._17(t,10)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._17(t,10)._handleTouchend()&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._4(10,147456,null,0,oc,[eo,r.k,ci,r.N,r.y,Qr,Mo,Oo,nc,[2,mi],[2,ic]],{message:[0,"message"]},null),(t()(),r._27(-1,null,["24 words"])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,"Generate 12 word seed"),t(e,10,0,"Generate 24 word seed")},null)}function km(t){return r._29(0,[(t()(),r._5(0,0,null,null,93,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,16,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,13,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Create a Wallet"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,4,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,['\n If you don\'t have a SolarBankerCoin wallet, use the generated seed to create a new one.\n If you already have a wallet, toggle over to "Load Wallet" and enter your seed.\n '])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(20,0,null,null,7,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(22,0,null,null,4,"div",[["class","col-sm-4 -toggle-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(24,0,null,null,1,"app-double-button",[["leftButtonText","New"],["rightButtonText","Load"]],null,[[null,"onStateChange"]],function(t,e,n){var r=!0;return"onStateChange"===e&&(r=!1!==t.component.changeForm(n)&&r),r},ym,gm)),r._4(25,49152,null,0,mm,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(29,0,null,null,56,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(31,0,null,null,53,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(33,0,null,null,50,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,35).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,35).onReset()&&i),i},null,null)),r._4(34,16384,null,0,Qs,[],null,null),r._4(35,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(37,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(39,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(41,0,null,null,1,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Name"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(44,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,45)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,45).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,45)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,45)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(45,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(47,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(49,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(52,0,null,null,17,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(54,0,null,null,7,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(56,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,Mm)),r._4(60,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(63,0,null,null,5,"textarea",[["class","form-control"],["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,64)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,64).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,64)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,64)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(64,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(66,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(68,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(71,0,null,null,11,"div",[["class","form-field"]],[[4,"visibility",null]],null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(73,0,null,null,1,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Confirm seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(76,0,null,null,5,"textarea",[["class","form-control"],["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,77)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,77).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,77)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,77)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(77,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(79,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(81,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(87,0,null,null,5,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(89,0,null,null,2,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0,i=t.component;return"action"===e&&(r=!1!==(i.showCreateForm?i.createWallet():i.loadWallet())&&r),r},g_,p_)),r._4(90,49152,null,0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Create\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,25,0,"Load","New",n.doubleButtonActive),t(e,35,0,n.form),t(e,47,0,"label"),t(e,60,0,n.showCreateForm),t(e,66,0,"seed"),t(e,79,0,"confirm_seed"),t(e,90,0,!n.form.valid)},function(t,e){var n=e.component;t(e,33,0,r._17(e,37).ngClassUntouched,r._17(e,37).ngClassTouched,r._17(e,37).ngClassPristine,r._17(e,37).ngClassDirty,r._17(e,37).ngClassValid,r._17(e,37).ngClassInvalid,r._17(e,37).ngClassPending),t(e,44,0,r._17(e,49).ngClassUntouched,r._17(e,49).ngClassTouched,r._17(e,49).ngClassPristine,r._17(e,49).ngClassDirty,r._17(e,49).ngClassValid,r._17(e,49).ngClassInvalid,r._17(e,49).ngClassPending),t(e,63,0,r._17(e,68).ngClassUntouched,r._17(e,68).ngClassTouched,r._17(e,68).ngClassPristine,r._17(e,68).ngClassDirty,r._17(e,68).ngClassValid,r._17(e,68).ngClassInvalid,r._17(e,68).ngClassPending),t(e,71,0,n.showCreateForm?"visible":"hidden"),t(e,76,0,r._17(e,81).ngClassUntouched,r._17(e,81).ngClassTouched,r._17(e,81).ngClassPristine,r._17(e,81).ngClassDirty,r._17(e,81).ngClassValid,r._17(e,81).ngClassInvalid,r._17(e,81).ngClassPending)})}var xm=r._3({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:calc(50% - 25px);top:calc(50% - 25px);height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function Lm(t){return r._29(2,[r._25(402653184,1,{_inputElement:0}),r._25(402653184,2,{ripple:0}),(t()(),r._5(2,0,[["label",1]],null,15,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(t()(),r._5(3,0,null,null,9,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(t()(),r._5(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(t,e,n){var r=!0,i=t.component;return"change"===e&&(r=!1!==i._onInteractionEvent(n)&&r),"click"===e&&(r=!1!==i._onInputClick(n)&&r),r},null,null)),(t()(),r._5(5,0,null,null,2,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._4(6,212992,[[2,4]],0,Jo,[r.k,r.y,Qr,[2,qo]],{centered:[0,"centered"],radius:[1,"radius"],animation:[2,"animation"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),r._21(7,{enterDuration:0}),(t()(),r._5(8,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(t()(),r._5(9,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(t()(),r._5(10,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(t()(),r._5(11,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(t()(),r._5(12,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(t()(),r._5(13,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(t,e,n){var r=!0;return"cdkObserveContent"===e&&(r=!1!==t.component._onLabelTextChange()&&r),r},null,null)),r._4(14,1720320,null,0,Ll,[xl,r.k,r.y],null,{event:"cdkObserveContent"}),(t()(),r._5(15,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\xa0"])),r._16(null,0)],function(t,e){var n=e.component;t(e,6,0,!0,25,t(e,7,0,150),n._isRippleDisabled(),r._17(e,2))},function(t,e){var n=e.component;t(e,2,0,n.inputId),t(e,3,0,!r._17(e,13).textContent||!r._17(e,13).textContent.trim()),t(e,4,1,[n.inputId,n.required,n.checked,n.value,n.disabled,n.name,n.tabIndex,n.indeterminate,n.ariaLabel,n.ariaLabelledby,n._getAriaChecked()]),t(e,5,0,r._17(e,6).unbounded)})}var Cm=function(){function t(t){this.formBuilder=t,this.onPasswordCreated=new r.n,this.onBack=new r.n}return t.prototype.ngOnInit=function(){this.initEncryptForm()},t.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new Hs("",Xa.compose([Xa.required,Xa.minLength(2)])),confirm:new Hs("",Xa.compose([Xa.required,Xa.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},t.prototype.setEncrypt=function(t){t.checked?this.form.enable():this.form.disable()},t.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},t.prototype.emitBack=function(){this.onBack.emit()},Object.defineProperty(t.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),t.prototype.passwordMatchValidator=function(t){return t.get("password").value===t.get("confirm").value?null:{mismatch:!0}},t}(),Sm=r._3({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function Tm(t){return r._29(0,[r._25(402653184,1,{button:0}),(t()(),r._5(1,0,null,null,87,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(3,0,null,null,16,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,13,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(7,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Encrypt your wallet"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(13,0,null,null,4,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(15,0,null,null,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Increase security of your wallet by encrypting it. By entering a password below, your wallet will be\n encrypted. Only those with the password will be able access the wallet and remove funds.\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(21,0,null,null,10,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,7,"div",[["class","col-sm-4 -check-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(25,0,null,null,4,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},Lm,xm)),r._23(5120,null,ts,function(t){return[t]},[Ol]),r._4(27,4374528,null,0,Ol,[r.k,r.h,Oo,[8,null],[2,Sl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._5(28,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,0,["Encrypt Wallet\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(33,0,null,null,41,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(35,0,null,null,38,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(37,0,null,null,35,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,39).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,39).onReset()&&i),i},null,null)),r._4(38,16384,null,0,Qs,[],null,null),r._4(39,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(41,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(43,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(45,0,null,null,1,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(48,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,51)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,51).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,51)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,51)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(49,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(50,{disable:0}),r._4(51,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(53,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(55,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(58,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(60,0,null,null,1,"label",[["for","confirm"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Confirm password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(63,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,66)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,66).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,66)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,66)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.emitCreatedPassword()&&i),i},null,null)),r._4(64,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(65,{disable:0}),r._4(66,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(68,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(70,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(76,0,null,null,11,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(78,0,null,null,2,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitCreatedPassword()&&r),r},g_,p_)),r._4(79,49152,[[1,4],["button",4]],0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Finish\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(82,0,null,null,4,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitBack()&&r),r},g_,p_)),r._4(83,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(84,{"-hidden":0}),r._4(85,49152,null,0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n Back\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,27,0,"encrypt",!0),t(e,39,0,n.form),t(e,49,0,"-input",t(e,50,0,n.form.disabled)),t(e,53,0,"password"),t(e,64,0,"-input",t(e,65,0,n.form.disabled)),t(e,68,0,"confirm"),t(e,79,0,n.form.enabled&&!n.form.valid),t(e,83,0,"ghost -button-min-margin",t(e,84,0,n.isWorking))},function(t,e){t(e,25,0,r._17(e,27).id,r._17(e,27).indeterminate,r._17(e,27).checked,r._17(e,27).disabled,"before"==r._17(e,27).labelPosition),t(e,37,0,r._17(e,41).ngClassUntouched,r._17(e,41).ngClassTouched,r._17(e,41).ngClassPristine,r._17(e,41).ngClassDirty,r._17(e,41).ngClassValid,r._17(e,41).ngClassInvalid,r._17(e,41).ngClassPending),t(e,48,0,r._17(e,55).ngClassUntouched,r._17(e,55).ngClassTouched,r._17(e,55).ngClassPristine,r._17(e,55).ngClassDirty,r._17(e,55).ngClassValid,r._17(e,55).ngClassInvalid,r._17(e,55).ngClassPending),t(e,63,0,r._17(e,70).ngClassUntouched,r._17(e,70).ngClassTouched,r._17(e,70).ngClassPristine,r._17(e,70).ngClassDirty,r._17(e,70).ngClassValid,r._17(e,70).ngClassInvalid,r._17(e,70).ngClassPending)})}var Dm=r._3({encapsulation:0,styles:[[""]],data:{}});function Om(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(t,e,n){var r=!0;return"onLabelAndSeedCreated"===e&&(r=!1!==t.component.onLabelAndSeedCreated(n)&&r),r},km,wm)),r._4(1,114688,null,0,bm,[Va,Xr,Zs],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(t,e){t(e,1,0,e.component.fill)},null)}function Ym(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(t,e,n){var r=!0,i=t.component;return"onPasswordCreated"===e&&(r=!1!==i.onPasswordCreated(n)&&r),"onBack"===e&&(r=!1!==i.onBack()&&r),r},Tm,Sm)),r._4(1,114688,null,0,Cm,[Zs],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(t,e){t(e,1,0)},null)}function Pm(t){return r._29(0,[(t()(),r._0(16777216,null,null,1,null,Om)),r._4(1,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n\n"])),(t()(),r._0(16777216,null,null,1,null,Ym)),r._4(4,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,1===n.step),t(e,4,0,2===n.step)},null)}var Em=r._1("app-onboarding",zp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-onboarding",[],null,null,null,Pm,Dm)),r._4(1,49152,null,0,zp,[Qh,Xr],null,null)],null,null)},{},{},[]),jm=r._3({encapsulation:2,styles:[".mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:0;display:flex;flex-direction:row;max-width:100%;box-sizing:border-box;align-items:center}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px;vertical-align:middle}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-option-ripple{opacity:.5}}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}"],data:{}});function Am(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,Rm,Hm)),r._4(1,49152,null,0,Ko,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(t,e){var n=e.component;t(e,1,0,n.selected?"checked":"",n.disabled)},function(t,e){t(e,0,0,"indeterminate"===r._17(e,1).state,"checked"===r._17(e,1).state,r._17(e,1).disabled)})}function Im(t){return r._29(2,[(t()(),r._0(16777216,null,null,1,null,Am)),r._4(1,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._5(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),r._16(null,0),(t()(),r._5(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._4(5,212992,null,0,Jo,[r.k,r.y,Qr,[2,qo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,1,0,n.multiple),t(e,5,0,n.disabled||n.disableRipple,n._getHostElement())},function(t,e){t(e,4,0,r._17(e,5).unbounded)})}var Hm=r._3({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function Rm(t){return r._29(2,[],null,null)}var Nm=r._3({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function Fm(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.placeholder||"\xa0")})}function Vm(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.triggerValue)})}function zm(t){return r._29(0,[r._16(null,0),(t()(),r._0(0,null,null,0))],null,null)}function Wm(t){return r._29(0,[(t()(),r._5(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),r._4(1,16384,null,0,z,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._0(16777216,null,null,1,null,Vm)),r._4(3,16384,null,0,B,[r.N,r.K,z],null,null),(t()(),r._0(16777216,null,null,1,null,zm)),r._4(5,278528,null,0,W,[r.N,r.K,z],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(t,e){t(e,1,0,!!e.component.customTrigger),t(e,5,0,!0)},null)}function Bm(t){return r._29(0,[(t()(),r._5(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"],[null,"keydown"]],function(t,e,n){var r=!0,i=t.component;return"@transformPanel.done"===e&&(r=!1!==i._onPanelDone()&&r),"keydown"===e&&(r=!1!==i._handleKeydown(n)&&r),r},null,null)),r._4(1,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._5(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(t,e,n){var r=!0;return"@fadeInContent.done"===e&&(r=!1!==t.component._onFadeInDone()&&r),r},null,null)),r._16(null,1)],function(t,e){var n=e.component;t(e,1,0,r._8(1,"mat-select-panel ",n._getPanelTheme(),""),n.panelClass)},function(t,e){var n=e.component;t(e,0,0,n.multiple?"showing-multiple":"showing",n._transformOrigin,n._panelDoneAnimating,n._triggerFontSize),t(e,2,0,"showing")})}function Um(t){return r._29(2,[r._25(402653184,1,{trigger:0}),r._25(671088640,2,{panel:0}),r._25(402653184,3,{overlayDir:0}),(t()(),r._5(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggle()&&r),r},null,null)),r._4(4,16384,[["origin",4]],0,oo,[r.k],null,null),(t()(),r._5(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),r._4(6,16384,null,0,z,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._0(16777216,null,null,1,null,Fm)),r._4(8,278528,null,0,W,[r.N,r.K,z],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._0(16777216,null,null,1,null,Wm)),r._4(10,278528,null,0,W,[r.N,r.K,z],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._5(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(t()(),r._5(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(t()(),r._0(16777216,null,null,1,function(t,e,n){var r=!0,i=t.component;return"backdropClick"===e&&(r=!1!==i.close()&&r),"attach"===e&&(r=!1!==i._onAttached()&&r),"detach"===e&&(r=!1!==i.close()&&r),r},Bm)),r._4(14,671744,[[3,4]],0,ao,[eo,r.K,r.N,ro,[2,mi]],{lockPosition:[0,"lockPosition"],_deprecatedOrigin:[1,"_deprecatedOrigin"],_deprecatedPositions:[2,"_deprecatedPositions"],_deprecatedOffsetY:[3,"_deprecatedOffsetY"],_deprecatedMinWidth:[4,"_deprecatedMinWidth"],_deprecatedBackdropClass:[5,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[6,"_deprecatedScrollStrategy"],_deprecatedOpen:[7,"_deprecatedOpen"],_deprecatedHasBackdrop:[8,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(t,e){var n=e.component;t(e,6,0,n.empty),t(e,8,0,!0),t(e,10,0,!1),t(e,14,0,"",r._17(e,4),n._positions,n._offsetY,null==n._triggerRect?null:n._triggerRect.width,"cdk-overlay-transparent-backdrop",n._scrollStrategy,n.panelOpen,"")},null)}var qm=function(){function t(t,e,n,r){this.walletService=t,this.dialogRef=e,this.formBuilder=n,this.purchaseService=r}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.generate=function(){var t=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return t.dialogRef.close()})},t.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Xa.required]})},t}(),Jm=r._3({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function Gm(t){return r._29(0,[(t()(),r._5(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._17(t,1)._selectViaInteraction()&&i),"keydown"===e&&(i=!1!==r._17(t,1)._handleKeydown(n)&&i),i},Im,jm)),r._4(1,8437760,[[1,4]],0,ea,[r.k,r.h,[2,ta],[2,Qo]],{value:[0,"value"]},null),(t()(),r._27(2,0,["\n ","\n "]))],function(t,e){t(e,1,0,e.context.$implicit.address)},function(t,e){t(e,0,0,r._17(e,1)._getTabIndex(),r._17(e,1).selected,r._17(e,1).multiple,r._17(e,1).active,r._17(e,1).id,r._17(e,1).selected.toString(),r._17(e,1).disabled.toString(),r._17(e,1).disabled),t(e,2,0,e.context.$implicit.address)})}function Km(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"p",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Choose an address to generate a BTC deposit link for:"])),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(3,0,null,null,20,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,4).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,4).onReset()&&i),i},null,null)),r._4(4,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(6,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,14,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["placeholder","Select Address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(t,e,n){var i=!0;return"keydown"===e&&(i=!1!==r._17(t,13)._handleKeydown(n)&&i),"focus"===e&&(i=!1!==r._17(t,13)._onFocus()&&i),"blur"===e&&(i=!1!==r._17(t,13)._onBlur()&&i),i},Um,Nm)),r._23(6144,null,ta,null,[zu]),r._23(6144,null,ll,null,[zu]),r._4(11,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(13,2080768,null,3,zu,[hi,r.h,r.y,No,r.k,[2,mi],[2,Vs],[2,Us],[2,dl],[2,ls],[8,null],Fu],{placeholder:[0,"placeholder"]},null),r._25(603979776,1,{options:1}),r._25(603979776,2,{optionGroups:1}),r._25(335544320,3,{customTrigger:0}),r._4(17,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,1,["\n "])),(t()(),r._0(16777216,null,1,2,null,Gm)),r._4(20,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),r._20(131072,Lt,[r.h]),(t()(),r._27(-1,1,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(25,0,null,null,5,"div",[["class","button-line"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(27,0,null,null,2,"a",[["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(t,e,n){var i=!0,o=t.component;return"click"===e&&(i=!1!==r._17(t,28)._haltDisabledEvents(n)&&i),"click"===e&&(i=!1!==o.generate()&&i),i},Of,Df)),r._4(28,180224,null,0,gl,[Qr,Oo,r.k],null,null),(t()(),r._27(-1,0,["Generate"])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,n.form),t(e,11,0,"address"),t(e,13,0,"Select Address"),t(e,20,0,r._28(e,20,0,r._17(e,21).transform(n.walletService.allAddresses())))},function(t,e){t(e,3,0,r._17(e,6).ngClassUntouched,r._17(e,6).ngClassTouched,r._17(e,6).ngClassPristine,r._17(e,6).ngClassDirty,r._17(e,6).ngClassValid,r._17(e,6).ngClassInvalid,r._17(e,6).ngClassPending),t(e,8,1,[r._17(e,13).id,r._17(e,13).tabIndex,r._17(e,13)._ariaLabel,r._17(e,13).ariaLabelledby,r._17(e,13).required.toString(),r._17(e,13).disabled.toString(),r._17(e,13).errorState,r._17(e,13).panelOpen?r._17(e,13)._optionIds:null,r._17(e,13).multiple,r._17(e,13)._ariaDescribedby||null,r._17(e,13)._getAriaActiveDescendant(),r._17(e,13).disabled,r._17(e,13).errorState,r._17(e,13).required,r._17(e,17).ngClassUntouched,r._17(e,17).ngClassTouched,r._17(e,17).ngClassPristine,r._17(e,17).ngClassDirty,r._17(e,17).ngClassValid,r._17(e,17).ngClassInvalid,r._17(e,17).ngClassPending]),t(e,27,0,r._17(e,28).disabled?-1:0,r._17(e,28).disabled||null,r._17(e,28).disabled.toString())})}var Xm=r._1("app-add-deposit-address",qm,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,Km,Jm)),r._4(1,114688,null,0,qm,[Xr,Ia,Zs,Ap],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Zm=function(){function t(){}return t.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},t.prototype.ngOnChanges=function(t){t.disableDismiss&&(this.dialog.disableClose=t.disableDismiss.currentValue)},t}(),Qm=r._3({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:30px}"]],data:{}});function $m(t){return r._29(0,[(t()(),r._5(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null))],null,null)}function tg(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._27(1,null,["\n ","\n "])),(t()(),r._0(16777216,null,null,1,null,$m)),r._4(3,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"])),(t()(),r._5(6,0,null,null,3,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),r._16(null,0),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.disableDismiss)},function(t,e){t(e,1,0,e.component.title)})}var eg=function(){function t(t){this.el=t,t.nativeElement.autocomplete="new-password",t.nativeElement.readOnly=!0}return t.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},t}(),ng=r._3({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:rgba(122,89,23,.7)}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-disabled[_ngcontent-%COMP%]{display:none}.-warning[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-passwords[_ngcontent-%COMP%] .-hidden[_ngcontent-%COMP%]{visibility:hidden}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#7a5917!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function rg(t){return r._29(0,[(t()(),r._5(0,0,null,null,12,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,16777216,null,null,2,"span",[["matTooltip","Generate 12 word seed"]],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._17(t,3).show()&&i),"keydown"===e&&(i=!1!==r._17(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._17(t,3)._handleTouchend()&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._4(3,147456,null,0,oc,[eo,r.k,ci,r.N,r.y,Qr,Mo,Oo,nc,[2,mi],[2,ic]],{message:[0,"message"]},null),(t()(),r._27(-1,null,["12 words"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(6,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._27(-1,null,["|"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,16777216,null,null,2,"span",[["matTooltip","Generate 24 word seed"]],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._17(t,10).show()&&i),"keydown"===e&&(i=!1!==r._17(t,10)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._17(t,10)._handleTouchend()&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._4(10,147456,null,0,oc,[eo,r.k,ci,r.N,r.y,Qr,Mo,Oo,nc,[2,mi],[2,ic]],{message:[0,"message"]},null),(t()(),r._27(-1,null,["24 words"])),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,"Generate 12 word seed"),t(e,10,0,"Generate 24 word seed")},null)}function ig(t){return r._29(0,[r._25(402653184,1,{createButton:0}),r._25(402653184,2,{cancelButton:0}),(t()(),r._5(2,0,null,null,126,"app-modal",[],null,null,null,tg,Qm)),r._4(3,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"],disableDismiss:[2,"disableDismiss"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(5,0,null,0,111,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,6).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,6).onReset()&&i),i},null,null)),r._4(6,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(8,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,1,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Name"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(15,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,16)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,16).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,16)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,16)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(16,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(18,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(20,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(25,0,null,null,7,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(27,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(-1,null,["Seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,rg)),r._4(31,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(34,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,35)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,35).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,35)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,35)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(35,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(37,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(39,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(41,0,null,null,1,"p",[["class","-warning"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Remember this seed! Keep it in a safe place.\n If you forget your seed, you will not be able to recover your wallet!\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(45,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),r._4(46,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(47,{"-disabled":0}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(49,0,null,null,1,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Confirm seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(52,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,53)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,53).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,53)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,53)._compositionEnd(n.target.value)&&i),i},null,null)),r._4(53,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(55,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(57,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(60,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(62,0,null,null,5,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},Lm,xm)),r._23(5120,null,ts,function(t){return[t]},[Ol]),r._4(64,4374528,null,0,Ol,[r.k,r.h,Oo,[8,null],[2,Sl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(66,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,0,["Encrypt Wallet\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(70,0,null,null,45,"div",[["class","row -passwords"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(72,0,null,null,4,"div",[["class","col-md-12"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(74,0,null,null,1,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n We suggest that you encrypt each one of your wallets with a password.\n If you forget your password, you can reset it with your seed.\n Make sure you have your seed saved somewhere safe before encrypting your wallet.\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(78,0,null,null,17,"div",[["class","col-md-6"]],null,null,null,null,null)),r._4(79,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(80,{"-hidden":0}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(82,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(84,0,null,null,1,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(87,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._17(t,88)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,88).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,88)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,88)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._17(t,93).onFocus()&&i),i},null,null)),r._4(88,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(90,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(92,16384,null,0,Ys,[ls],null,null),r._4(93,16384,null,0,eg,[r.k],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(97,0,null,null,17,"div",[["class","col-md-6"]],null,null,null,null,null)),r._4(98,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(99,{"-hidden":0}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(101,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(103,0,null,null,1,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Confirm password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(106,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,107)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,107).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,107)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,107)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._17(t,112).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.createWallet()&&i),i},null,null)),r._4(107,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(109,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(111,16384,null,0,Ys,[ls],null,null),r._4(112,16384,null,0,eg,[r.k],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(118,0,null,0,9,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(120,0,null,null,2,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},g_,p_)),r._4(121,49152,[[2,4],["cancelButton",4]],0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n Cancel\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(124,0,null,null,2,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.createWallet()&&r),r},g_,p_)),r._4(125,49152,[[1,4],["createButton",4]],0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(126,0,["\n ","\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.dialogRef,n.data.create?"Create Wallet":"Load Wallet",n.disableDismiss),t(e,6,0,n.form),t(e,18,0,"label"),t(e,31,0,n.data.create),t(e,37,0,"seed"),t(e,46,0,"form-field",t(e,47,0,!n.data.create)),t(e,55,0,"confirm_seed"),t(e,64,0,"encrypt",!0),t(e,79,0,"col-md-6",t(e,80,0,!n.encrypt)),t(e,90,0,"password"),t(e,98,0,"col-md-6",t(e,99,0,!n.encrypt)),t(e,109,0,"confirm_password"),t(e,125,0,!n.form.valid)},function(t,e){var n=e.component;t(e,5,0,r._17(e,8).ngClassUntouched,r._17(e,8).ngClassTouched,r._17(e,8).ngClassPristine,r._17(e,8).ngClassDirty,r._17(e,8).ngClassValid,r._17(e,8).ngClassInvalid,r._17(e,8).ngClassPending),t(e,15,0,r._17(e,20).ngClassUntouched,r._17(e,20).ngClassTouched,r._17(e,20).ngClassPristine,r._17(e,20).ngClassDirty,r._17(e,20).ngClassValid,r._17(e,20).ngClassInvalid,r._17(e,20).ngClassPending),t(e,34,0,r._17(e,39).ngClassUntouched,r._17(e,39).ngClassTouched,r._17(e,39).ngClassPristine,r._17(e,39).ngClassDirty,r._17(e,39).ngClassValid,r._17(e,39).ngClassInvalid,r._17(e,39).ngClassPending),t(e,52,0,r._17(e,57).ngClassUntouched,r._17(e,57).ngClassTouched,r._17(e,57).ngClassPristine,r._17(e,57).ngClassDirty,r._17(e,57).ngClassValid,r._17(e,57).ngClassInvalid,r._17(e,57).ngClassPending),t(e,62,0,r._17(e,64).id,r._17(e,64).indeterminate,r._17(e,64).checked,r._17(e,64).disabled,"before"==r._17(e,64).labelPosition),t(e,87,0,r._17(e,92).ngClassUntouched,r._17(e,92).ngClassTouched,r._17(e,92).ngClassPristine,r._17(e,92).ngClassDirty,r._17(e,92).ngClassValid,r._17(e,92).ngClassInvalid,r._17(e,92).ngClassPending),t(e,106,0,r._17(e,111).ngClassUntouched,r._17(e,111).ngClassTouched,r._17(e,111).ngClassPristine,r._17(e,111).ngClassDirty,r._17(e,111).ngClassValid,r._17(e,111).ngClassInvalid,r._17(e,111).ngClassPending),t(e,126,0,n.data.create?"Create":"Load")})}var og=r._1("app-create-wallet",Tc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-create-wallet",[],null,null,null,ig,ng)),r._4(1,114688,null,0,Tc,[Ha,Ia,Xr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),ag=r._3({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function sg(t){return r._29(0,[r._25(402653184,1,{button:0}),(t()(),r._5(1,0,null,null,32,"app-modal",[["title","Rename Wallet"]],null,null,null,tg,Qm)),r._4(2,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(4,0,null,0,17,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,5).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,5).onReset()&&i),i},null,null)),r._4(5,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(7,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,11,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(11,0,null,null,1,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Name"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,15)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,15).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,15)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,15)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.rename()&&i),i},null,null)),r._4(15,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(17,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(19,16384,null,0,Ys,[ls],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(23,0,null,0,9,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(25,0,null,null,2,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},g_,p_)),r._4(26,49152,null,0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n Cancel\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(29,0,null,null,2,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.rename()&&r),r},g_,p_)),r._4(30,49152,[[1,4],["button",4]],0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Rename\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,"Rename Wallet"),t(e,5,0,n.form),t(e,17,0,"label"),t(e,30,0,!n.form.valid)},function(t,e){t(e,4,0,r._17(e,7).ngClassUntouched,r._17(e,7).ngClassTouched,r._17(e,7).ngClassPristine,r._17(e,7).ngClassDirty,r._17(e,7).ngClassValid,r._17(e,7).ngClassInvalid,r._17(e,7).ngClassPending),t(e,14,0,r._17(e,19).ngClassUntouched,r._17(e,19).ngClassTouched,r._17(e,19).ngClassPristine,r._17(e,19).ngClassDirty,r._17(e,19).ngClassValid,r._17(e,19).ngClassInvalid,r._17(e,19).ngClassPending)})}var lg=r._1("app-change-name",cf,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-change-name",[],null,null,null,sg,ag)),r._4(1,114688,null,0,cf,[Ha,Ia,Zs,Xr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),ug=r._3({encapsulation:0,styles:[["#qr[_ngcontent-%COMP%]{height:300px}.address[_ngcontent-%COMP%]{font-size:80%;text-align:center;margin-top:30px}"]],data:{}});function cg(t){return r._29(0,[r._25(402653184,1,{qr:0}),(t()(),r._5(1,0,null,null,7,"app-modal",[["title","QR Code"]],null,null,null,tg,Qm)),r._4(2,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(4,0,[[1,0],["qr",1]],0,0,"div",[["id","qr"]],null,null,null,null,null)),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(6,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(t()(),r._27(7,null,["",""])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){t(e,2,0,e.component.dialogRef,"QR Code")},function(t,e){t(e,7,0,e.component.data.address)})}var dg=r._1("app-qr-code",Np,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-qr-code",[],null,null,null,cg,ug)),r._4(1,114688,null,0,Np,[Ia,Ha,r.k],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),hg=r._3({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%] .-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-container[_ngcontent-%COMP%] .-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%]{background-color:#fbfbfb;height:190px;text-align:center}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{height:22px;margin:55px 0 0}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:20px;font-weight:700;line-height:23px;margin:20px 0 0}.-container[_ngcontent-%COMP%] .-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;line-height:15px;margin:5px 0 0;opacity:.5}.-container[_ngcontent-%COMP%] .-footer[_ngcontent-%COMP%]{background-color:#f7f7f7}.-container[_ngcontent-%COMP%] .-footer[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%]{border-top:1px solid #eff0f0;color:#1e2227;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;line-height:14px;padding:13px 10px}.-container[_ngcontent-%COMP%] .-footer[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{opacity:.5;text-align:left}.-container[_ngcontent-%COMP%] .-footer[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-values[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:right}.-container[_ngcontent-%COMP%] .-footer[_ngcontent-%COMP%] .-row[_ngcontent-%COMP%] .-values[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:block}"]],data:{}});function pg(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.context.$implicit.owner)})}function fg(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.parent.context.$implicit.dst)})}function _g(t){return r._29(0,[(t()(),r._5(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,fg)),r._4(3,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.showOutput(e.context.$implicit))},null)}function mg(t){return r._29(0,[r._20(0,Ct,[r.t]),r._20(0,ut,[r.t]),(t()(),r._5(2,0,null,null,79,"div",[["class","-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(4,0,null,null,3,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n Transaction Detail "])),(t()(),r._5(6,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(9,0,null,null,12,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(11,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._4(12,278528,null,0,A,[r.r,r.s,r.k,r.C],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._21(13,{"-incoming":0,"-pending":1}),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(15,0,null,null,0,"img",[["src","/assets/img/send-gold.png"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(18,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._27(19,null,[""," SLB"])),r._22(20,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(23,0,null,null,57,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),r._4(24,16384,null,0,za,[],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(26,0,null,null,53,"div",[["class","-footer"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(28,0,null,null,8,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(30,0,null,null,1,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Date"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(33,0,null,null,2,"div",[["class","-values"]],null,null,null,null,null)),(t()(),r._27(34,null,["",""])),r._22(35,2),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(38,0,null,null,7,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(40,0,null,null,1,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._27(-1,null,["ID"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(43,0,null,null,1,"div",[["class","-values"]],null,null,null,null,null)),(t()(),r._27(44,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(47,0,null,null,7,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(49,0,null,null,1,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Status"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(52,0,null,null,1,"div",[["class","-values"]],null,null,null,null,null)),(t()(),r._27(53,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(56,0,null,null,10,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(58,0,null,null,1,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._27(-1,null,["From"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(61,0,null,null,4,"div",[["class","-values"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,pg)),r._4(64,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(68,0,null,null,10,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(70,0,null,null,1,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._27(-1,null,["To"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(73,0,null,null,4,"div",[["class","-values"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,_g)),r._4(76,802816,null,0,H,[r.N,r.K,r.r],{ngForOf:[0,"ngForOf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,12,0,"-icon",t(e,13,0,n.transaction.balance>0,!n.transaction.confirmed)),t(e,64,0,n.transaction.inputs),t(e,76,0,n.transaction.outputs)},function(t,e){var n=e.component;t(e,19,0,r._28(e,19,0,t(e,20,0,r._17(e,0),n.transaction.balance,"1.0-6"))),t(e,34,0,r._28(e,34,0,t(e,35,0,r._17(e,1),1e3*n.transaction.timestamp,"short"))),t(e,44,0,n.transaction.txid),t(e,53,0,n.transaction.confirmed?"Complete":"Pending")})}var gg=r._1("app-transaction-detail",Rp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-transaction-detail",[],null,null,null,mg,hg)),r._4(1,245760,null,0,Rp,[Ha,Ia,Hp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),yg=r._3({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function vg(t){return r._29(0,[(t()(),r._5(0,0,null,null,23,"app-modal",[["class","-title"],["title","Safeguard your seed!"]],null,null,null,tg,Qm)),r._4(1,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(3,0,null,0,12,"div",[],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,1,"span",[["class","-safe-description"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your SolarBankerCoin wallet!\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,6,"div",[["class","-check-container"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(10,0,null,null,3,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setAccept(n)&&r),r},Lm,xm)),r._23(5120,null,ts,function(t){return[t]},[Ol]),r._4(12,4374528,null,0,Ol,[r.k,r.h,Oo,[8,null],[2,Sl]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._27(-1,0,["It\u2019s safe, I swear.\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(17,0,null,0,5,"div",[["class","-text-center"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(19,0,null,null,2,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},g_,p_)),r._4(20,49152,null,0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Continue\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,n.dialogRef,"Safeguard your seed!"),t(e,12,0,"terms",n.acceptSafe),t(e,20,0,!n.acceptSafe)},function(t,e){t(e,10,0,r._17(e,12).id,r._17(e,12).indeterminate,r._17(e,12).checked,r._17(e,12).disabled,"before"==r._17(e,12).labelPosition)})}var bg=r._1("app-onboarding-safeguard",vm,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,vg,yg)),r._4(1,49152,null,0,vm,[Ia],null,null)],null,null)},{},{},[]),wg=r._3({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function Mg(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._27(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.description)})}function kg(t){return r._29(0,[(t()(),r._5(0,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(2,0,null,null,1,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Confirm password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,6)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,6).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,6)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,6)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._17(t,11).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._4(6,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(8,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(10,16384,null,0,Ys,[ls],null,null),r._4(11,16384,null,0,eg,[r.k],null,null),(t()(),r._27(-1,null,["\n "]))],function(t,e){t(e,8,0,"confirm_password")},function(t,e){t(e,5,0,r._17(e,10).ngClassUntouched,r._17(e,10).ngClassTouched,r._17(e,10).ngClassPristine,r._17(e,10).ngClassDirty,r._17(e,10).ngClassValid,r._17(e,10).ngClassInvalid,r._17(e,10).ngClassPending)})}function xg(t){return r._29(0,[r._25(402653184,1,{button:0}),(t()(),r._5(1,0,null,null,35,"app-modal",[],null,null,null,tg,Qm)),r._4(2,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"],disableDismiss:[2,"disableDismiss"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._0(16777216,null,0,1,null,Mg)),r._4(5,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(7,0,null,0,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._17(t,8).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._17(t,8).onReset()&&i),i},null,null)),r._4(8,540672,null,0,Us,[[8,null],[8,null]],{form:[0,"form"]},null),r._23(2048,null,qa,null,[Us]),r._4(10,16384,null,0,Ps,[qa],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(12,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,1,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Password"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(17,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._17(t,18)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._17(t,18).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._17(t,18)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._17(t,18)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._17(t,23).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._4(18,16384,null,0,rs,[r.C,r.k,[2,ns]],null,null),r._23(1024,null,ts,function(t){return[t]},[rs]),r._4(20,671744,null,0,Ks,[[3,qa],[8,null],[8,null],[2,ts]],{name:[0,"name"]},null),r._23(2048,null,ls,null,[Ks]),r._4(22,16384,null,0,Ys,[ls],null,null),r._4(23,16384,null,0,eg,[r.k],null,null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._0(16777216,null,null,1,null,kg)),r._4(27,16384,null,0,N,[r.N,r.K],{ngIf:[0,"ngIf"]},null),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(30,0,null,0,5,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(32,0,null,null,2,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.proceed()&&r),r},g_,p_)),r._4(33,49152,[[1,4],["button",4]],0,Sc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._27(-1,0,["\n Proceed\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,n.data.title?n.data.title:"Enter Password",n.disableDismiss),t(e,5,0,n.data.description),t(e,8,0,n.form),t(e,20,0,"password"),t(e,27,0,n.data.confirm),t(e,33,0,!n.form.valid)},function(t,e){t(e,7,0,r._17(e,10).ngClassUntouched,r._17(e,10).ngClassTouched,r._17(e,10).ngClassPristine,r._17(e,10).ngClassDirty,r._17(e,10).ngClassValid,r._17(e,10).ngClassInvalid,r._17(e,10).ngClassPending),t(e,17,0,r._17(e,22).ngClassUntouched,r._17(e,22).ngClassTouched,r._17(e,22).ngClassPristine,r._17(e,22).ngClassDirty,r._17(e,22).ngClassValid,r._17(e,22).ngClassInvalid,r._17(e,22).ngClassPending)})}var Lg=r._1("app-password-dialog",Oc,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-password-dialog",[],null,null,null,xg,wg)),r._4(1,245760,null,0,Oc,[Ia,Ha,bc],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Cg=r._3({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Sg(t){return r._29(0,[(t()(),r._5(0,0,null,null,18,"app-modal",[["title","Wallet Seed"]],null,null,null,tg,Qm)),r._4(1,573440,null,0,Zm,[],{dialog:[0,"dialog"],title:[1,"title"]},null),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(3,0,null,0,7,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(5,0,null,null,1,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._27(-1,null,["Seed"])),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(8,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(t()(),r._27(9,null,["",""])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n "])),(t()(),r._5(12,0,null,0,5,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._27(-1,null,["\n "])),(t()(),r._5(14,0,null,null,2,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.dialogRef.close()&&r),r},g_,p_)),r._4(15,49152,null,0,Sc,[],null,{action:"action"}),(t()(),r._27(-1,0,["\n Close\n "])),(t()(),r._27(-1,null,["\n "])),(t()(),r._27(-1,0,["\n"])),(t()(),r._27(-1,null,["\n"]))],function(t,e){t(e,1,0,e.component.dialogRef,"Wallet Seed")},function(t,e){t(e,9,0,e.component.data.seed)})}var Tg=r._1("app-seed-modal",Op,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-seed-modal",[],null,null,null,Sg,Cg)),r._4(1,180224,null,0,Op,[Ia,Ha],null,null)],null,null)},{},{},[]),Dg=r._3({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function Og(t){return r._29(0,[(t()(),r._5(0,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),r._4(1,212992,null,0,sp,[ap,r.N,r.j,[8,null],r.h],null,null),(t()(),r._27(-1,null,["\n"]))],function(t,e){t(e,1,0)},null)}var Yg=r._1("app-root",Jp,function(t){return r._29(0,[(t()(),r._5(0,0,null,null,1,"app-root",[],null,null,null,Og,Dg)),r._4(1,114688,null,0,Jp,[qp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]);function Pg(t){switch(t.length){case 0:return new Da;case 1:return t[0];default:return new Oa(t)}}function Eg(t,e,n,r,i,o){void 0===i&&(i={}),void 0===o&&(o={});var a=[],s=[],l=-1,u=null;if(r.forEach(function(t){var n=t.offset,r=n==l,c=r&&u||{};Object.keys(t).forEach(function(n){var r=n,s=t[n];if("offset"!==n)switch(r=e.normalizePropertyName(r,a),s){case Ya:s=i[n];break;case La:s=o[n];break;default:s=e.normalizeStyleValue(n,r,s,a)}c[r]=s}),r||s.push(c),u=c,l=n}),a.length)throw new Error("Unable to animate due to the following errors:\n - "+a.join("\n - "));return s}function jg(t,e,n,r){switch(e){case"start":t.onStart(function(){return r(n&&Ag(n,"start",t.totalTime))});break;case"done":t.onDone(function(){return r(n&&Ag(n,"done",t.totalTime))});break;case"destroy":t.onDestroy(function(){return r(n&&Ag(n,"destroy",t.totalTime))})}}function Ag(t,e,n){var r=Ig(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,void 0==n?t.totalTime:n),i=t._data;return null!=i&&(r._data=i),r}function Ig(t,e,n,r,i,o){return void 0===i&&(i=""),void 0===o&&(o=0),{element:t,triggerName:e,fromState:n,toState:r,phaseName:i,totalTime:o}}function Hg(t,e,n){var r;return t instanceof Map?(r=t.get(e))||t.set(e,r=n):(r=t[e])||(r=t[e]=n),r}function Rg(t){var e=t.indexOf(":");return[t.substring(1,e),t.substr(e+1)]}var Ng=function(t,e){return!1},Fg=function(t,e){return!1},Vg=function(t,e,n){return[]};if("undefined"!=typeof Element){if(Ng=function(t,e){return t.contains(e)},Element.prototype.matches)Fg=function(t,e){return t.matches(e)};else{var zg=Element.prototype,Wg=zg.matchesSelector||zg.mozMatchesSelector||zg.msMatchesSelector||zg.oMatchesSelector||zg.webkitMatchesSelector;Wg&&(Fg=function(t,e){return Wg.apply(t,[e])})}Vg=function(t,e,n){var r=[];if(n)r.push.apply(r,t.querySelectorAll(e));else{var i=t.querySelector(e);i&&r.push(i)}return r}}var Bg=null,Ug=!1;function qg(){return"undefined"!=typeof document?document.body:null}var Jg=Fg,Gg=Ng,Kg=Vg,Xg=function(){function t(){}return t.prototype.validateStyleProperty=function(t){return function(t){Bg||(Bg=qg()||{},Ug=!!Bg.style&&"WebkitAppearance"in Bg.style);var e=!0;return Bg.style&&!function(t){return"ebkit"==t.substring(1,6)}(t)&&!(e=t in Bg.style)&&Ug&&(e="Webkit"+t.charAt(0).toUpperCase()+t.substr(1)in Bg.style),e}(t)},t.prototype.matchesElement=function(t,e){return Jg(t,e)},t.prototype.containsElement=function(t,e){return Gg(t,e)},t.prototype.query=function(t,e,n){return Kg(t,e,n)},t.prototype.computeStyle=function(t,e,n){return n||""},t.prototype.animate=function(t,e,n,r,i,o){return void 0===o&&(o=[]),new Da},t}(),Zg=function(){function t(){}return t.NOOP=new Xg,t}(),Qg=1e3;function $g(t){if("number"==typeof t)return t;var e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:ty(parseFloat(e[1]),e[2])}function ty(t,e){switch(e){case"s":return t*Qg;default:return t}}function ey(t,e,n){return t.hasOwnProperty("duration")?t:function(t,e,n){var r,i=0,o="";if("string"==typeof t){var a=t.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===a)return e.push('The provided timing value "'+t+'" is invalid.'),{duration:0,delay:0,easing:""};r=ty(parseFloat(a[1]),a[2]);var s=a[3];null!=s&&(i=ty(Math.floor(parseFloat(s)),a[4]));var l=a[5];l&&(o=l)}else r=t;if(!n){var u=!1,c=e.length;r<0&&(e.push("Duration values below 0 are not allowed for this animation step."),u=!0),i<0&&(e.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&e.splice(c,0,'The provided timing value "'+t+'" is invalid.')}return{duration:r,delay:i,easing:o}}(t,e,n)}function ny(t,e){return void 0===e&&(e={}),Object.keys(t).forEach(function(n){e[n]=t[n]}),e}function ry(t,e,n){if(void 0===n&&(n={}),e)for(var r in t)n[r]=t[r];else ny(t,n);return n}function iy(t,e){t.style&&Object.keys(e).forEach(function(n){var r=hy(n);t.style[r]=e[n]})}function oy(t,e){t.style&&Object.keys(e).forEach(function(e){var n=hy(e);t.style[n]=""})}function ay(t){return Array.isArray(t)?1==t.length?t[0]:Ca(t):t}var sy=new RegExp("{{\\s*(.+?)\\s*}}","g");function ly(t){var e=[];if("string"==typeof t){for(var n=t.toString(),r=void 0;r=sy.exec(n);)e.push(r[1]);sy.lastIndex=0}return e}function uy(t,e,n){var r=t.toString(),i=r.replace(sy,function(t,r){var i=e[r];return e.hasOwnProperty(r)||(n.push("Please provide a value for the animation param "+r),i=""),i.toString()});return i==r?t:i}function cy(t){for(var e=[],n=t.next();!n.done;)e.push(n.value),n=t.next();return e}var dy=/-+([a-z0-9])/g;function hy(t){return t.replace(dy,function(){for(var t=[],e=0;e *";case":leave":return"* => void";case":increment":return function(t,e){return parseFloat(e)>parseFloat(t)};case":decrement":return function(t,e){return parseFloat(e) *"}}(t,n);if("function"==typeof r)return void e.push(r);t=r}var i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==i||i.length<4)return n.push('The provided transition expression "'+t+'" is not supported'),e;var o=i[1],a=i[2],s=i[3];e.push(gy(o,s)),"<"!=a[0]||o==fy&&s==fy||e.push(gy(s,o))}(t,i,r)}):i.push(n),i),animation:o,queryCount:e.queryCount,depCount:e.depCount,options:ky(t.options)}},t.prototype.visitSequence=function(t,e){var n=this;return{type:2,steps:t.steps.map(function(t){return py(n,t,e)}),options:ky(t.options)}},t.prototype.visitGroup=function(t,e){var n=this,r=e.currentTime,i=0,o=t.steps.map(function(t){e.currentTime=r;var o=py(n,t,e);return i=Math.max(i,e.currentTime),o});return e.currentTime=i,{type:3,steps:o,options:ky(t.options)}},t.prototype.visitAnimate=function(t,e){var n,r=function(t,e){var n=null;if(t.hasOwnProperty("duration"))n=t;else if("number"==typeof t)return xy(ey(t,e).duration,0,"");var r=t;if(r.split(/\s+/).some(function(t){return"{"==t.charAt(0)&&"{"==t.charAt(1)})){var i=xy(0,0,"");return i.dynamic=!0,i.strValue=r,i}return xy((n=n||ey(r,e)).duration,n.delay,n.easing)}(t.timings,e.errors);e.currentAnimateTimings=r;var i=t.styles?t.styles:Sa({});if(5==i.type)n=this.visitKeyframes(i,e);else{var o=t.styles,a=!1;if(!o){a=!0;var s={};r.easing&&(s.easing=r.easing),o=Sa(s)}e.currentTime+=r.duration+r.delay;var l=this.visitStyle(o,e);l.isEmptyStep=a,n=l}return e.currentAnimateTimings=null,{type:4,timings:r,style:n,options:null}},t.prototype.visitStyle=function(t,e){var n=this._makeStyleAst(t,e);return this._validateStyleAst(n,e),n},t.prototype._makeStyleAst=function(t,e){var n=[];Array.isArray(t.styles)?t.styles.forEach(function(t){"string"==typeof t?t==La?n.push(t):e.errors.push("The provided style string value "+t+" is not allowed."):n.push(t)}):n.push(t.styles);var r=!1,i=null;return n.forEach(function(t){if(My(t)){var e=t,n=e.easing;if(n&&(i=n,delete e.easing),!r)for(var o in e)if(e[o].toString().indexOf("{{")>=0){r=!0;break}}}),{type:6,styles:n,easing:i,offset:t.offset,containsDynamicStyles:r,options:null}},t.prototype._validateStyleAst=function(t,e){var n=this,r=e.currentAnimateTimings,i=e.currentTime,o=e.currentTime;r&&o>0&&(o-=r.duration+r.delay),t.styles.forEach(function(t){"string"!=typeof t&&Object.keys(t).forEach(function(r){if(n._driver.validateStyleProperty(r)){var a,s,l,u=e.collectedStyles[e.currentQuerySelector],c=u[r],d=!0;c&&(o!=i&&o>=c.startTime&&i<=c.endTime&&(e.errors.push('The CSS property "'+r+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+o+'ms" and "'+i+'ms"'),d=!1),o=c.startTime),d&&(u[r]={startTime:o,endTime:i}),e.options&&(a=e.errors,s=e.options.params||{},(l=ly(t[r])).length&&l.forEach(function(t){s.hasOwnProperty(t)||a.push("Unable to resolve the local animation param "+t+" in the given list of values")}))}else e.errors.push('The provided animation property "'+r+'" is not a supported CSS property for animations')})})},t.prototype.visitKeyframes=function(t,e){var n=this,r={type:5,styles:[],options:null};if(!e.currentAnimateTimings)return e.errors.push("keyframes() must be placed inside of a call to animate()"),r;var i=0,o=[],a=!1,s=!1,l=0,u=t.steps.map(function(t){var r=n._makeStyleAst(t,e),u=null!=r.offset?r.offset:function(t){if("string"==typeof t)return null;var e=null;if(Array.isArray(t))t.forEach(function(t){if(My(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}});else if(My(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}return e}(r.styles),c=0;return null!=u&&(i++,c=r.offset=u),s=s||c<0||c>1,a=a||c0&&i0?i==h?1:d*i:o[i],s=a*_;e.currentTime=p+f.delay+s,f.duration=s,n._validateStyleAst(t,e),t.offset=a,r.styles.push(t)}),r},t.prototype.visitReference=function(t,e){return{type:8,animation:py(this,ay(t.animation),e),options:ky(t.options)}},t.prototype.visitAnimateChild=function(t,e){return e.depCount++,{type:9,options:ky(t.options)}},t.prototype.visitAnimateRef=function(t,e){return{type:10,animation:this.visitReference(t.animation,e),options:ky(t.options)}},t.prototype.visitQuery=function(t,e){var n=e.currentQuerySelector,r=t.options||{};e.queryCount++,e.currentQuery=t;var i=function(t){var e=!!t.split(/\s*,\s*/).find(function(t){return":self"==t});return e&&(t=t.replace(yy,"")),[t=t.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(t){return".ng-trigger-"+t.substr(1)}).replace(/:animating/g,".ng-animating"),e]}(t.selector),o=i[0],a=i[1];e.currentQuerySelector=n.length?n+" "+o:o,Hg(e.collectedStyles,e.currentQuerySelector,{});var s=py(this,ay(t.animation),e);return e.currentQuery=null,e.currentQuerySelector=n,{type:11,selector:o,limit:r.limit||0,optional:!!r.optional,includeSelf:a,animation:s,originalSelector:t.selector,options:ky(t.options)}},t.prototype.visitStagger=function(t,e){e.currentQuery||e.errors.push("stagger() can only be used inside of query()");var n="full"===t.timings?{duration:0,delay:0,easing:"full"}:ey(t.timings,e.errors,!0);return{type:12,animation:py(this,ay(t.animation),e),timings:n,options:null}},t}(),wy=function(t){this.errors=t,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function My(t){return!Array.isArray(t)&&"object"==typeof t}function ky(t){var e;return t?(t=ny(t)).params&&(t.params=(e=t.params)?ny(e):null):t={},t}function xy(t,e,n){return{duration:t,delay:e,easing:n}}function Ly(t,e,n,r,i,o,a,s){return void 0===a&&(a=null),void 0===s&&(s=!1),{type:1,element:t,keyframes:e,preStyleProps:n,postStyleProps:r,duration:i,delay:o,totalTime:i+o,easing:a,subTimeline:s}}var Cy=function(){function t(){this._map=new Map}return t.prototype.consume=function(t){var e=this._map.get(t);return e?this._map.delete(t):e=[],e},t.prototype.append=function(t,e){var n=this._map.get(t);n||this._map.set(t,n=[]),n.push.apply(n,e)},t.prototype.has=function(t){return this._map.has(t)},t.prototype.clear=function(){this._map.clear()},t}(),Sy=new RegExp(":enter","g"),Ty=new RegExp(":leave","g");function Dy(t,e,n,r,i,o,a,s,l,u){return void 0===o&&(o={}),void 0===a&&(a={}),void 0===u&&(u=[]),(new Oy).buildKeyframes(t,e,n,r,i,o,a,s,l,u)}var Oy=function(){function t(){}return t.prototype.buildKeyframes=function(t,e,n,r,i,o,a,s,l,u){void 0===u&&(u=[]),l=l||new Cy;var c=new Py(t,e,l,r,i,u,[]);c.options=s,c.currentTimeline.setStyles([o],null,c.errors,s),py(this,n,c);var d=c.timelines.filter(function(t){return t.containsAnimation()});if(d.length&&Object.keys(a).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([a],null,c.errors,s)}return d.length?d.map(function(t){return t.buildKeyframes()}):[Ly(e,[],[],[],0,0,"",!1)]},t.prototype.visitTrigger=function(t,e){},t.prototype.visitState=function(t,e){},t.prototype.visitTransition=function(t,e){},t.prototype.visitAnimateChild=function(t,e){var n=e.subInstructions.consume(e.element);if(n){var r=e.createSubContext(t.options),i=e.currentTimeline.currentTime,o=this._visitSubInstructions(n,r,r.options);i!=o&&e.transformIntoNewTimeline(o)}e.previousNode=t},t.prototype.visitAnimateRef=function(t,e){var n=e.createSubContext(t.options);n.transformIntoNewTimeline(),this.visitReference(t.animation,n),e.transformIntoNewTimeline(n.currentTimeline.currentTime),e.previousNode=t},t.prototype._visitSubInstructions=function(t,e,n){var r=e.currentTimeline.currentTime,i=null!=n.duration?$g(n.duration):null,o=null!=n.delay?$g(n.delay):null;return 0!==i&&t.forEach(function(t){var n=e.appendInstructionToTimeline(t,i,o);r=Math.max(r,n.duration+n.delay)}),r},t.prototype.visitReference=function(t,e){e.updateOptions(t.options,!0),py(this,t.animation,e),e.previousNode=t},t.prototype.visitSequence=function(t,e){var n=this,r=e.subContextCount,i=e,o=t.options;if(o&&(o.params||o.delay)&&((i=e.createSubContext(o)).transformIntoNewTimeline(),null!=o.delay)){6==i.previousNode.type&&(i.currentTimeline.snapshotCurrentStyles(),i.previousNode=Yy);var a=$g(o.delay);i.delayNextStep(a)}t.steps.length&&(t.steps.forEach(function(t){return py(n,t,i)}),i.currentTimeline.applyStylesToKeyframe(),i.subContextCount>r&&i.transformIntoNewTimeline()),e.previousNode=t},t.prototype.visitGroup=function(t,e){var n=this,r=[],i=e.currentTimeline.currentTime,o=t.options&&t.options.delay?$g(t.options.delay):0;t.steps.forEach(function(a){var s=e.createSubContext(t.options);o&&s.delayNextStep(o),py(n,a,s),i=Math.max(i,s.currentTimeline.currentTime),r.push(s.currentTimeline)}),r.forEach(function(t){return e.currentTimeline.mergeTimelineCollectedStyles(t)}),e.transformIntoNewTimeline(i),e.previousNode=t},t.prototype._visitTiming=function(t,e){if(t.dynamic){var n=t.strValue;return ey(e.params?uy(n,e.params,e.errors):n,e.errors)}return{duration:t.duration,delay:t.delay,easing:t.easing}},t.prototype.visitAnimate=function(t,e){var n=e.currentAnimateTimings=this._visitTiming(t.timings,e),r=e.currentTimeline;n.delay&&(e.incrementTime(n.delay),r.snapshotCurrentStyles());var i=t.style;5==i.type?this.visitKeyframes(i,e):(e.incrementTime(n.duration),this.visitStyle(i,e),r.applyStylesToKeyframe()),e.currentAnimateTimings=null,e.previousNode=t},t.prototype.visitStyle=function(t,e){var n=e.currentTimeline,r=e.currentAnimateTimings;!r&&n.getCurrentStyleProperties().length&&n.forwardFrame();var i=r&&r.easing||t.easing;t.isEmptyStep?n.applyEmptyStep(i):n.setStyles(t.styles,i,e.errors,e.options),e.previousNode=t},t.prototype.visitKeyframes=function(t,e){var n=e.currentAnimateTimings,r=e.currentTimeline.duration,i=n.duration,o=e.createSubContext().currentTimeline;o.easing=n.easing,t.styles.forEach(function(t){o.forwardTime((t.offset||0)*i),o.setStyles(t.styles,t.easing,e.errors,e.options),o.applyStylesToKeyframe()}),e.currentTimeline.mergeTimelineCollectedStyles(o),e.transformIntoNewTimeline(r+i),e.previousNode=t},t.prototype.visitQuery=function(t,e){var n=this,r=e.currentTimeline.currentTime,i=t.options||{},o=i.delay?$g(i.delay):0;o&&(6===e.previousNode.type||0==r&&e.currentTimeline.getCurrentStyleProperties().length)&&(e.currentTimeline.snapshotCurrentStyles(),e.previousNode=Yy);var a=r,s=e.invokeQuery(t.selector,t.originalSelector,t.limit,t.includeSelf,!!i.optional,e.errors);e.currentQueryTotal=s.length;var l=null;s.forEach(function(r,i){e.currentQueryIndex=i;var s=e.createSubContext(t.options,r);o&&s.delayNextStep(o),r===e.element&&(l=s.currentTimeline),py(n,t.animation,s),s.currentTimeline.applyStylesToKeyframe(),a=Math.max(a,s.currentTimeline.currentTime)}),e.currentQueryIndex=0,e.currentQueryTotal=0,e.transformIntoNewTimeline(a),l&&(e.currentTimeline.mergeTimelineCollectedStyles(l),e.currentTimeline.snapshotCurrentStyles()),e.previousNode=t},t.prototype.visitStagger=function(t,e){var n=e.parentContext,r=e.currentTimeline,i=t.timings,o=Math.abs(i.duration),a=o*(e.currentQueryTotal-1),s=o*e.currentQueryIndex;switch(i.duration<0?"reverse":i.easing){case"reverse":s=a-s;break;case"full":s=n.currentStaggerTime}var l=e.currentTimeline;s&&l.delayNextStep(s);var u=l.currentTime;py(this,t.animation,e),e.previousNode=t,n.currentStaggerTime=r.currentTime-u+(r.startTime-n.currentTimeline.startTime)},t}(),Yy={},Py=function(){function t(t,e,n,r,i,o,a,s){this._driver=t,this.element=e,this.subInstructions=n,this._enterClassName=r,this._leaveClassName=i,this.errors=o,this.timelines=a,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=Yy,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=s||new Ey(this._driver,e,0),a.push(this.currentTimeline)}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.updateOptions=function(t,e){var n=this;if(t){var r=t,i=this.options;null!=r.duration&&(i.duration=$g(r.duration)),null!=r.delay&&(i.delay=$g(r.delay));var o=r.params;if(o){var a=i.params;a||(a=this.options.params={}),Object.keys(o).forEach(function(t){e&&a.hasOwnProperty(t)||(a[t]=uy(o[t],a,n.errors))})}}},t.prototype._copyOptions=function(){var t={};if(this.options){var e=this.options.params;if(e){var n=t.params={};Object.keys(e).forEach(function(t){n[t]=e[t]})}}return t},t.prototype.createSubContext=function(e,n,r){void 0===e&&(e=null);var i=n||this.element,o=new t(this._driver,i,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(i,r||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o},t.prototype.transformIntoNewTimeline=function(t){return this.previousNode=Yy,this.currentTimeline=this.currentTimeline.fork(this.element,t),this.timelines.push(this.currentTimeline),this.currentTimeline},t.prototype.appendInstructionToTimeline=function(t,e,n){var r={duration:null!=e?e:t.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+t.delay,easing:""},i=new jy(this._driver,t.element,t.keyframes,t.preStyleProps,t.postStyleProps,r,t.stretchStartingKeyframe);return this.timelines.push(i),r},t.prototype.incrementTime=function(t){this.currentTimeline.forwardTime(this.currentTimeline.duration+t)},t.prototype.delayNextStep=function(t){t>0&&this.currentTimeline.delayNextStep(t)},t.prototype.invokeQuery=function(t,e,n,r,i,o){var a=[];if(r&&a.push(this.element),t.length>0){t=(t=t.replace(Sy,"."+this._enterClassName)).replace(Ty,"."+this._leaveClassName);var s=this._driver.query(this.element,t,1!=n);0!==n&&(s=n<0?s.slice(s.length+n,s.length):s.slice(0,n)),a.push.apply(a,s)}return i||0!=a.length||o.push('`query("'+e+'")` returned zero elements. (Use `query("'+e+'", { optional: true })` if you wish to allow this.)'),a},t}(),Ey=function(){function t(t,e,n,r){this._driver=t,this.element=e,this.startTime=n,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(e),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(e,this._localTimelineStyles)),this._loadKeyframe()}return t.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},t.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(t.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),t.prototype.delayNextStep=function(t){var e=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||e?(this.forwardTime(this.currentTime+t),e&&this.snapshotCurrentStyles()):this.startTime+=t},t.prototype.fork=function(e,n){return this.applyStylesToKeyframe(),new t(this._driver,e,n||this.currentTime,this._elementTimelineStylesLookup)},t.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},t.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},t.prototype.forwardTime=function(t){this.applyStylesToKeyframe(),this.duration=t,this._loadKeyframe()},t.prototype._updateStyle=function(t,e){this._localTimelineStyles[t]=e,this._globalTimelineStyles[t]=e,this._styleSummary[t]={time:this.currentTime,value:e}},t.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},t.prototype.applyEmptyStep=function(t){var e=this;t&&(this._previousKeyframe.easing=t),Object.keys(this._globalTimelineStyles).forEach(function(t){e._backFill[t]=e._globalTimelineStyles[t]||La,e._currentKeyframe[t]=La}),this._currentEmptyStepKeyframe=this._currentKeyframe},t.prototype.setStyles=function(t,e,n,r){var i=this;e&&(this._previousKeyframe.easing=e);var o=r&&r.params||{},a=function(t,e){var n,r={};return t.forEach(function(t){"*"===t?(n=n||Object.keys(e)).forEach(function(t){r[t]=La}):ry(t,!1,r)}),r}(t,this._globalTimelineStyles);Object.keys(a).forEach(function(t){var e=uy(a[t],o,n);i._pendingStyles[t]=e,i._localTimelineStyles.hasOwnProperty(t)||(i._backFill[t]=i._globalTimelineStyles.hasOwnProperty(t)?i._globalTimelineStyles[t]:La),i._updateStyle(t,e)})},t.prototype.applyStylesToKeyframe=function(){var t=this,e=this._pendingStyles,n=Object.keys(e);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){t._currentKeyframe[n]=e[n]}),Object.keys(this._localTimelineStyles).forEach(function(e){t._currentKeyframe.hasOwnProperty(e)||(t._currentKeyframe[e]=t._localTimelineStyles[e])}))},t.prototype.snapshotCurrentStyles=function(){var t=this;Object.keys(this._localTimelineStyles).forEach(function(e){var n=t._localTimelineStyles[e];t._pendingStyles[e]=n,t._updateStyle(e,n)})},t.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(t.prototype,"properties",{get:function(){var t=[];for(var e in this._currentKeyframe)t.push(e);return t},enumerable:!0,configurable:!0}),t.prototype.mergeTimelineCollectedStyles=function(t){var e=this;Object.keys(t._styleSummary).forEach(function(n){var r=e._styleSummary[n],i=t._styleSummary[n];(!r||i.time>r.time)&&e._updateStyle(n,i.value)})},t.prototype.buildKeyframes=function(){var t=this;this.applyStylesToKeyframe();var e=new Set,n=new Set,r=1===this._keyframes.size&&0===this.duration,i=[];this._keyframes.forEach(function(o,a){var s=ry(o,!0);Object.keys(s).forEach(function(t){var r=s[t];r==Ya?e.add(t):r==La&&n.add(t)}),r||(s.offset=a/t.duration),i.push(s)});var o=e.size?cy(e.values()):[],a=n.size?cy(n.values()):[];if(r){var s=i[0],l=ny(s);s.offset=0,l.offset=1,i=[s,l]}return Ly(this.element,i,o,a,this.duration,this.startTime,this.easing,!1)},t}(),jy=function(t){function e(e,n,r,i,o,a,s){void 0===s&&(s=!1);var l=t.call(this,e,n,a.delay)||this;return l.element=n,l.keyframes=r,l.preStyleProps=i,l.postStyleProps=o,l._stretchStartingKeyframe=s,l.timings={duration:a.duration,delay:a.delay,easing:a.easing},l}return Object(o.b)(e,t),e.prototype.containsAnimation=function(){return this.keyframes.length>1},e.prototype.buildKeyframes=function(){var t=this.keyframes,e=this.timings,n=e.delay,r=e.duration,i=e.easing;if(this._stretchStartingKeyframe&&n){var o=[],a=r+n,s=n/a,l=ry(t[0],!1);l.offset=0,o.push(l);var u=ry(t[0],!1);u.offset=Ay(s),o.push(u);for(var c=t.length-1,d=1;d<=c;d++){var h=ry(t[d],!1);h.offset=Ay((n+h.offset*r)/a),o.push(h)}r=a,n=0,i="",t=o}return Ly(this.element,t,this.preStyleProps,this.postStyleProps,r,n,i,!0)},e}(Ey);function Ay(t,e){void 0===e&&(e=3);var n=Math.pow(10,e-1);return Math.round(t*n)/n}var Iy=function(){},Hy=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.b)(e,t),e.prototype.normalizePropertyName=function(t,e){return hy(t)},e.prototype.normalizeStyleValue=function(t,e,n,r){var i="",o=n.toString().trim();if(Ry[e]&&0!==n&&"0"!==n)if("number"==typeof n)i="px";else{var a=n.match(/^[+-]?[\d\.]+([a-z]*)$/);a&&0==a[1].length&&r.push("Please provide a CSS unit value for "+t+":"+n)}return o+i},e}(Iy),Ry=function(t){var e={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(t){return e[t]=!0}),e}();function Ny(t,e,n,r,i,o,a,s,l,u,c,d){return{type:0,element:t,triggerName:e,isRemovalTransition:i,fromState:n,fromStyles:o,toState:r,toStyles:a,timelines:s,queriedElements:l,preStyleProps:u,postStyleProps:c,errors:d}}var Fy={},Vy=function(){function t(t,e,n){this._triggerName=t,this.ast=e,this._stateStyles=n}return t.prototype.match=function(t,e){return function(t,e,n){return t.some(function(t){return t(e,n)})}(this.ast.matchers,t,e)},t.prototype.buildStyles=function(t,e,n){var r=this._stateStyles["*"],i=this._stateStyles[t],o=r?r.buildStyles(e,n):{};return i?i.buildStyles(e,n):o},t.prototype.build=function(t,e,n,r,i,a,s,l,u){var c=[],d=this.ast.options&&this.ast.options.params||Fy,h=this.buildStyles(n,s&&s.params||Fy,c),p=l&&l.params||Fy,f=this.buildStyles(r,p,c),_=new Set,m=new Map,g=new Map,y="void"===r,v={params:Object(o.a)({},d,p)},b=Dy(t,e,this.ast.animation,i,a,h,f,v,u,c);if(c.length)return Ny(e,this._triggerName,n,r,y,h,f,[],[],m,g,c);b.forEach(function(t){var n=t.element,r=Hg(m,n,{});t.preStyleProps.forEach(function(t){return r[t]=!0});var i=Hg(g,n,{});t.postStyleProps.forEach(function(t){return i[t]=!0}),n!==e&&_.add(n)});var w=cy(_.values());return Ny(e,this._triggerName,n,r,y,h,f,b,w,m,g)},t}(),zy=function(){function t(t,e){this.styles=t,this.defaultParams=e}return t.prototype.buildStyles=function(t,e){var n={},r=ny(this.defaultParams);return Object.keys(t).forEach(function(e){var n=t[e];null!=n&&(r[e]=n)}),this.styles.styles.forEach(function(t){if("string"!=typeof t){var i=t;Object.keys(i).forEach(function(t){var o=i[t];o.length>1&&(o=uy(o,r,e)),n[t]=o})}}),n},t}(),Wy=function(){function t(t,e){var n=this;this.name=t,this.ast=e,this.transitionFactories=[],this.states={},e.states.forEach(function(t){n.states[t.name]=new zy(t.style,t.options&&t.options.params||{})}),By(this.states,"true","1"),By(this.states,"false","0"),e.transitions.forEach(function(e){n.transitionFactories.push(new Vy(t,e,n.states))}),this.fallbackTransition=new Vy(t,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(t,e){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(t.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),t.prototype.matchTransition=function(t,e){return this.transitionFactories.find(function(n){return n.match(t,e)})||null},t.prototype.matchStyles=function(t,e,n){return this.fallbackTransition.buildStyles(t,e,n)},t}();function By(t,e,n){t.hasOwnProperty(e)?t.hasOwnProperty(n)||(t[n]=t[e]):t.hasOwnProperty(n)&&(t[e]=t[n])}var Uy=new Cy,qy=function(){function t(t,e){this._driver=t,this._normalizer=e,this._animations={},this._playersById={},this.players=[]}return t.prototype.register=function(t,e){var n=[],r=vy(this._driver,e,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: "+n.join("\n"));this._animations[t]=r},t.prototype._buildPlayer=function(t,e,n){var r=t.element,i=Eg(0,this._normalizer,0,t.keyframes,e,n);return this._driver.animate(r,i,t.duration,t.delay,t.easing,[])},t.prototype.create=function(t,e,n){var r=this;void 0===n&&(n={});var i,o=[],a=this._animations[t],s=new Map;if(a?(i=Dy(this._driver,e,a,"ng-enter","ng-leave",{},{},n,Uy,o)).forEach(function(t){var e=Hg(s,t.element,{});t.postStyleProps.forEach(function(t){return e[t]=null})}):(o.push("The requested animation doesn't exist or has already been destroyed"),i=[]),o.length)throw new Error("Unable to create the animation due to the following errors: "+o.join("\n"));s.forEach(function(t,e){Object.keys(t).forEach(function(n){t[n]=r._driver.computeStyle(e,n,La)})});var l=Pg(i.map(function(t){var e=s.get(t.element);return r._buildPlayer(t,{},e)}));return this._playersById[t]=l,l.onDestroy(function(){return r.destroy(t)}),this.players.push(l),l},t.prototype.destroy=function(t){var e=this._getPlayer(t);e.destroy(),delete this._playersById[t];var n=this.players.indexOf(e);n>=0&&this.players.splice(n,1)},t.prototype._getPlayer=function(t){var e=this._playersById[t];if(!e)throw new Error("Unable to find the timeline player referenced by "+t);return e},t.prototype.listen=function(t,e,n,r){var i=Ig(e,"","","");return jg(this._getPlayer(t),n,i,r),function(){}},t.prototype.command=function(t,e,n,r){if("register"!=n)if("create"!=n){var i=this._getPlayer(t);switch(n){case"play":i.play();break;case"pause":i.pause();break;case"reset":i.reset();break;case"restart":i.restart();break;case"finish":i.finish();break;case"init":i.init();break;case"setPosition":i.setPosition(parseFloat(r[0]));break;case"destroy":this.destroy(t)}}else this.create(t,e,r[0]||{});else this.register(t,r[0])},t}(),Jy=[],Gy={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},Ky={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},Xy="__ng_removed",Zy=function(){function t(t,e){void 0===e&&(e=""),this.namespaceId=e;var n=t&&t.hasOwnProperty("value");if(this.value=function(t){return null!=t?t:null}(n?t.value:t),n){var r=ny(t);delete r.value,this.options=r}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.absorbOptions=function(t){var e=t.params;if(e){var n=this.options.params;Object.keys(e).forEach(function(t){null==n[t]&&(n[t]=e[t])})}},t}(),Qy=new Zy("void"),$y=new Zy("DELETED"),tv=function(){function t(t,e,n){this.id=t,this.hostElement=e,this._engine=n,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+t,lv(e,this._hostClassName)}return t.prototype.listen=function(t,e,n,r){var i,o=this;if(!this._triggers.hasOwnProperty(e))throw new Error('Unable to listen on the animation trigger event "'+n+'" because the animation trigger "'+e+"\" doesn't exist!");if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'+e+'" because the provided event is undefined!');if("start"!=(i=n)&&"done"!=i)throw new Error('The provided animation trigger event "'+n+'" for the animation trigger "'+e+'" is not supported!');var a=Hg(this._elementListeners,t,[]),s={name:e,phase:n,callback:r};a.push(s);var l=Hg(this._engine.statesByElement,t,{});return l.hasOwnProperty(e)||(lv(t,"ng-trigger"),lv(t,"ng-trigger-"+e),l[e]=Qy),function(){o._engine.afterFlush(function(){var t=a.indexOf(s);t>=0&&a.splice(t,1),o._triggers[e]||delete l[e]})}},t.prototype.register=function(t,e){return!this._triggers[t]&&(this._triggers[t]=e,!0)},t.prototype._getTrigger=function(t){var e=this._triggers[t];if(!e)throw new Error('The provided animation trigger "'+t+'" has not been registered!');return e},t.prototype.trigger=function(t,e,n,r){var i=this;void 0===r&&(r=!0);var o=this._getTrigger(e),a=new nv(this.id,e,t),s=this._engine.statesByElement.get(t);s||(lv(t,"ng-trigger"),lv(t,"ng-trigger-"+e),this._engine.statesByElement.set(t,s={}));var l=s[e],u=new Zy(n,this.id);if(!(n&&n.hasOwnProperty("value"))&&l&&u.absorbOptions(l.options),s[e]=u,l){if(l===$y)return a}else l=Qy;if("void"===u.value||l.value!==u.value){var c=Hg(this._engine.playersByElement,t,[]);c.forEach(function(t){t.namespaceId==i.id&&t.triggerName==e&&t.queued&&t.destroy()});var d=o.matchTransition(l.value,u.value),h=!1;if(!d){if(!r)return;d=o.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:t,triggerName:e,transition:d,fromState:l,toState:u,player:a,isFallbackTransition:h}),h||(lv(t,"ng-animate-queued"),a.onStart(function(){uv(t,"ng-animate-queued")})),a.onDone(function(){var e=i.players.indexOf(a);e>=0&&i.players.splice(e,1);var n=i._engine.playersByElement.get(t);if(n){var r=n.indexOf(a);r>=0&&n.splice(r,1)}}),this.players.push(a),c.push(a),a}if(!function(t,e){var n=Object.keys(t),r=Object.keys(e);if(n.length!=r.length)return!1;for(var i=0;i=0){for(var r=!1,i=n;i>=0;i--)if(this.driver.containsElement(this._namespaceList[i].hostElement,e)){this._namespaceList.splice(i+1,0,t),r=!0;break}r||this._namespaceList.splice(0,0,t)}else this._namespaceList.push(t);return this.namespacesByHostElement.set(e,t),t},t.prototype.register=function(t,e){var n=this._namespaceLookup[t];return n||(n=this.createNamespace(t,e)),n},t.prototype.registerTrigger=function(t,e,n){var r=this._namespaceLookup[t];r&&r.register(e,n)&&this.totalAnimations++},t.prototype.destroy=function(t,e){var n=this;if(t){var r=this._fetchNamespace(t);this.afterFlush(function(){n.namespacesByHostElement.delete(r.hostElement),delete n._namespaceLookup[t];var e=n._namespaceList.indexOf(r);e>=0&&n._namespaceList.splice(e,1)}),this.afterFlushAnimationsDone(function(){return r.destroy(e)})}},t.prototype._fetchNamespace=function(t){return this._namespaceLookup[t]},t.prototype.fetchNamespacesByElement=function(t){var e=new Set,n=this.statesByElement.get(t);if(n)for(var r=Object.keys(n),i=0;i=0;L--)this._namespaceList[L].drainQueuedTransitions(e).forEach(function(t){var e=t.player;k.push(e);var o=t.element;if(h&&n.driver.containsElement(h,o)){var a=w.get(o),d=_.get(o),p=n._buildInstruction(t,r,d,a);if(p.errors&&p.errors.length)x.push(p);else{if(t.isFallbackTransition)return e.onStart(function(){return oy(o,p.fromStyles)}),e.onDestroy(function(){return iy(o,p.toStyles)}),void i.push(e);p.timelines.forEach(function(t){return t.stretchStartingKeyframe=!0}),r.append(o,p.timelines),s.push({instruction:p,player:e,element:o}),p.queriedElements.forEach(function(t){return Hg(l,t,[]).push(e)}),p.preStyleProps.forEach(function(t,e){var n=Object.keys(t);if(n.length){var r=u.get(e);r||u.set(e,r=new Set),n.forEach(function(t){return r.add(t)})}}),p.postStyleProps.forEach(function(t,e){var n=Object.keys(t),r=c.get(e);r||c.set(e,r=new Set),n.forEach(function(t){return r.add(t)})})}}else e.destroy()});if(x.length){var C=[];x.forEach(function(t){C.push("@"+t.triggerName+" has failed due to:\n"),t.errors.forEach(function(t){return C.push("- "+t+"\n")})}),k.forEach(function(t){return t.destroy()}),this.reportError(C)}var S=new Map,T=new Map;s.forEach(function(t){var e=t.element;r.has(e)&&(T.set(e,e),n._beforeAnimationBuild(t.player.namespaceId,t.instruction,S))}),i.forEach(function(t){var e=t.element;n._getPreviousPlayers(e,!1,t.namespaceId,t.triggerName,null).forEach(function(t){Hg(S,e,[]).push(t),t.destroy()})});var D=g.filter(function(t){return dv(t,u,c)}),O=new Map;ov(O,this.driver,v,c,La).forEach(function(t){dv(t,u,c)&&D.push(t)});var Y=new Map;f.forEach(function(t,e){ov(Y,n.driver,new Set(t),u,Ya)}),D.forEach(function(t){var e=O.get(t),n=Y.get(t);O.set(t,Object(o.a)({},e,n))});var P=[],E=[],j={};s.forEach(function(t){var e=t.element,o=t.player,s=t.instruction;if(r.has(e)){if(d.has(e))return o.onDestroy(function(){return iy(e,s.toStyles)}),void i.push(o);var l=j;if(T.size>1){for(var u=e,c=[];u=u.parentNode;){var h=T.get(u);if(h){l=h;break}c.push(u)}c.forEach(function(t){return T.set(t,l)})}var p=n._buildAnimation(o.namespaceId,s,S,a,Y,O);if(o.setRealPlayer(p),l===j)P.push(o);else{var f=n.playersByElement.get(l);f&&f.length&&(o.parentPlayer=Pg(f)),i.push(o)}}else oy(e,s.fromStyles),o.onDestroy(function(){return iy(e,s.toStyles)}),E.push(o),d.has(e)&&i.push(o)}),E.forEach(function(t){var e=a.get(t.element);if(e&&e.length){var n=Pg(e);t.setRealPlayer(n)}}),i.forEach(function(t){t.parentPlayer?t.syncPlayerEvents(t.parentPlayer):t.destroy()});for(var A=0;A0?this.driver.animate(t.element,e,t.duration,t.delay,t.easing,n):new Da},t}(),nv=function(){function t(t,e,n){this.namespaceId=t,this.triggerName=e,this.element=n,this._player=new Da,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return t.prototype.setRealPlayer=function(t){var e=this;this._containsRealPlayer||(this._player=t,Object.keys(this._queuedCallbacks).forEach(function(n){e._queuedCallbacks[n].forEach(function(e){return jg(t,n,void 0,e)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},t.prototype.getRealPlayer=function(){return this._player},t.prototype.syncPlayerEvents=function(t){var e=this,n=this._player;n.triggerCallback&&t.onStart(function(){return n.triggerCallback("start")}),t.onDone(function(){return e.finish()}),t.onDestroy(function(){return e.destroy()})},t.prototype._queueEvent=function(t,e){Hg(this._queuedCallbacks,t,[]).push(e)},t.prototype.onDone=function(t){this.queued&&this._queueEvent("done",t),this._player.onDone(t)},t.prototype.onStart=function(t){this.queued&&this._queueEvent("start",t),this._player.onStart(t)},t.prototype.onDestroy=function(t){this.queued&&this._queueEvent("destroy",t),this._player.onDestroy(t)},t.prototype.init=function(){this._player.init()},t.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},t.prototype.play=function(){!this.queued&&this._player.play()},t.prototype.pause=function(){!this.queued&&this._player.pause()},t.prototype.restart=function(){!this.queued&&this._player.restart()},t.prototype.finish=function(){this._player.finish()},t.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},t.prototype.reset=function(){!this.queued&&this._player.reset()},t.prototype.setPosition=function(t){this.queued||this._player.setPosition(t)},t.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(t.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),t.prototype.triggerCallback=function(t){var e=this._player;e.triggerCallback&&e.triggerCallback(t)},t}();function rv(t){return t&&1===t.nodeType}function iv(t,e){var n=t.style.display;return t.style.display=null!=e?e:"none",n}function ov(t,e,n,r,i){var o=[];n.forEach(function(t){return o.push(iv(t))});var a=[];r.forEach(function(n,r){var o={};n.forEach(function(t){var n=o[t]=e.computeStyle(r,t,i);n&&0!=n.length||(r[Xy]=Ky,a.push(r))}),t.set(r,o)});var s=0;return n.forEach(function(t){return iv(t,o[s++])}),a}function av(t,e){var n=new Map;if(t.forEach(function(t){return n.set(t,[])}),0==e.length)return n;var r=new Set(e),i=new Map;return e.forEach(function(t){var e=function t(e){if(!e)return 1;var o=i.get(e);if(o)return o;var a=e.parentNode;return o=n.has(a)?a:r.has(a)?1:t(a),i.set(e,o),o}(t);1!==e&&n.get(e).push(t)}),n}var sv="$$classes";function lv(t,e){if(t.classList)t.classList.add(e);else{var n=t[sv];n||(n=t[sv]={}),n[e]=!0}}function uv(t,e){if(t.classList)t.classList.remove(e);else{var n=t[sv];n&&delete n[e]}}function cv(t,e,n){Pg(n).onDone(function(){return t.processLeaveNode(e)})}function dv(t,e,n){var r=n.get(t);if(!r)return!1;var i=e.get(t);return i?r.forEach(function(t){return i.add(t)}):e.set(t,r),n.delete(t),!0}var hv=function(){function t(t,e){var n=this;this._driver=t,this._triggerCache={},this.onRemovalComplete=function(t,e){},this._transitionEngine=new ev(t,e),this._timelineEngine=new qy(t,e),this._transitionEngine.onRemovalComplete=function(t,e){return n.onRemovalComplete(t,e)}}return t.prototype.registerTrigger=function(t,e,n,r,i){var o=t+"-"+r,a=this._triggerCache[o];if(!a){var s=[],l=vy(this._driver,i,s);if(s.length)throw new Error('The animation trigger "'+r+'" has failed to build due to the following errors:\n - '+s.join("\n - "));a=function(t,e){return new Wy(t,e)}(r,l),this._triggerCache[o]=a}this._transitionEngine.registerTrigger(e,r,a)},t.prototype.register=function(t,e){this._transitionEngine.register(t,e)},t.prototype.destroy=function(t,e){this._transitionEngine.destroy(t,e)},t.prototype.onInsert=function(t,e,n,r){this._transitionEngine.insertNode(t,e,n,r)},t.prototype.onRemove=function(t,e,n){this._transitionEngine.removeNode(t,e,n)},t.prototype.disableAnimations=function(t,e){this._transitionEngine.markElementAsDisabled(t,e)},t.prototype.process=function(t,e,n,r){if("@"==n.charAt(0)){var i=Rg(n);this._timelineEngine.command(i[0],e,i[1],r)}else this._transitionEngine.trigger(t,e,n,r)},t.prototype.listen=function(t,e,n,r,i){if("@"==n.charAt(0)){var o=Rg(n);return this._timelineEngine.listen(o[0],e,o[1],i)}return this._transitionEngine.listen(t,e,n,r,i)},t.prototype.flush=function(t){void 0===t&&(t=-1),this._transitionEngine.flush(t)},Object.defineProperty(t.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),t.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},t}(),pv=function(t){function e(e,n){var i=t.call(this)||this;return i._nextAnimationId=0,i._renderer=e.createRenderer(n.body,{id:"0",encapsulation:r.O.None,styles:[],data:{animation:[]}}),i}return Object(o.b)(e,t),e.prototype.build=function(t){var e=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(t)?Ca(t):t;return mv(this._renderer,null,e,"register",[n]),new fv(e,this._renderer)},e}(xa),fv=function(t){function e(e,n){var r=t.call(this)||this;return r._id=e,r._renderer=n,r}return Object(o.b)(e,t),e.prototype.create=function(t,e){return new _v(this._id,t,e||{},this._renderer)},e}(function(){}),_v=function(){function t(t,e,n,r){this.id=t,this.element=e,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return t.prototype._listen=function(t,e){return this._renderer.listen(this.element,"@@"+this.id+":"+t,e)},t.prototype._command=function(t){for(var e=[],n=1;n=0&&t=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},z3hR:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?i[n][0]:i[n][1]}function n(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10;return n(0===e?t/10:e)}if(t<1e4){for(;t>=10;)t/=10;return n(t)}return n(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(t){return n(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t},past:function(t){return n(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t},s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d M\xe9int",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))}},[0]); \ No newline at end of file diff --git a/src/gui/static/dist/polyfills.c4b58e211f949e5897b0.bundle.js b/src/gui/static/dist/polyfills.c4b58e211f949e5897b0.bundle.js deleted file mode 100755 index a0b0d1e..0000000 --- a/src/gui/static/dist/polyfills.c4b58e211f949e5897b0.bundle.js +++ /dev/null @@ -1 +0,0 @@ -webpackJsonp([1],{"/whu":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"0Rih":function(t,e,n){"use strict";var r=n("OzIq"),o=n("Ds5P"),i=n("R3AP"),a=n("A16L"),c=n("1aA0"),u=n("vmSO"),s=n("9GpA"),f=n("UKM+"),l=n("zgIt"),p=n("qkyc"),h=n("yYvK"),v=n("kic5");t.exports=function(t,e,n,d,y,g){var k=r[t],_=k,m=y?"set":"add",b=_&&_.prototype,w={},T=function(t){var e=b[t];i(b,t,"delete"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof _&&(g||b.forEach&&!l(function(){(new _).entries().next()}))){var O=new _,D=O[m](g?{}:-0,1)!=O,E=l(function(){O.has(1)}),P=p(function(t){new _(t)}),S=!g&&l(function(){for(var t=new _,e=5;e--;)t[m](e,e);return!t.has(-0)});P||((_=e(function(e,n){s(e,_,t);var r=v(new k,e,_);return void 0!=n&&u(n,y,r[m],r),r})).prototype=b,b.constructor=_),(E||S)&&(T("delete"),T("has"),y&&T("get")),(S||D)&&T(m),g&&b.clear&&delete b.clear}else _=d.getConstructor(e,t,y,m),a(_.prototype,n),c.NEED=!0;return h(_,t),w[t]=_,o(o.G+o.W+o.F*(_!=k),w),g||d.setStrong(_,t,y),_}},1:function(t,e,n){t.exports=n("XS25")},"1aA0":function(t,e,n){var r=n("ulTY")("meta"),o=n("UKM+"),i=n("WBcL"),a=n("lDLk").f,c=0,u=Object.isExtensible||function(){return!0},s=!n("zgIt")(function(){return u(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&u(t)&&!i(t,r)&&f(t),t}}},"2p1q":function(t,e,n){var r=n("lDLk"),o=n("fU25");t.exports=n("bUqO")?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"2tFN":function(t,e,n){n("CVR+"),n("vmSu"),n("4ZU1"),n("yx1U"),n("X7aK"),n("SPtU"),n("A52B"),n("PuTd"),n("dm+7"),n("JG34"),n("Rw4K"),n("9mGU"),n("bUY0"),n("mTp7"),t.exports=n("7gX0").Reflect},"3q4u":function(t,e,n){var r=n("wCso"),o=n("DIVP"),i=r.key,a=r.map,c=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:i(arguments[2]),r=a(o(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=c.get(e);return u.delete(n),!!u.size||c.delete(e)}})},"4ZU1":function(t,e,n){var r=n("lDLk"),o=n("Ds5P"),i=n("DIVP"),a=n("s4j0");o(o.S+o.F*n("zgIt")(function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=a(e,!0),i(n);try{return r.f(t,e,n),!0}catch(t){return!1}}})},"7gX0":function(t,e){var n=t.exports={version:"2.5.6"};"number"==typeof __e&&(__e=n)},"7ylX":function(t,e,n){var r=n("DIVP"),o=n("twxM"),i=n("QKXm"),a=n("mZON")("IE_PROTO"),c=function(){},u=function(){var t,e=n("jhxf")("iframe"),r=i.length;for(e.style.display="none",n("d075").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("
+
{ beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ DoubleButtonComponent ] + declarations: [ DoubleButtonComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/layout/double-button/double-button.component.ts b/src/gui/static/src/app/components/layout/double-button/double-button.component.ts index de607ec..1f9cffe 100755 --- a/src/gui/static/src/app/components/layout/double-button/double-button.component.ts +++ b/src/gui/static/src/app/components/layout/double-button/double-button.component.ts @@ -12,6 +12,7 @@ export class DoubleButtonComponent { @Input() rightButtonText: any; @Input() leftButtonText: any; @Input() activeButton: DoubleButtonActive; + @Input() className = ''; @Output() onStateChange = new EventEmitter(); ButtonState = DoubleButtonActive; diff --git a/src/gui/static/src/app/components/layout/footer/footer.component.html b/src/gui/static/src/app/components/layout/footer/footer.component.html deleted file mode 100755 index f5cddb6..0000000 --- a/src/gui/static/src/app/components/layout/footer/footer.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/gui/static/src/app/components/layout/footer/footer.component.scss b/src/gui/static/src/app/components/layout/footer/footer.component.scss deleted file mode 100755 index 5f7ebe9..0000000 --- a/src/gui/static/src/app/components/layout/footer/footer.component.scss +++ /dev/null @@ -1,48 +0,0 @@ -@import '../../../../theme/_variables'; - -:host { - background-color: $white; - bottom: 0; - height: 66px; - left: 0; - padding: 4px 0; - position: fixed; - right: 0; - text-align: center; - width: 100%; - - button img { - max-height: 28px; - max-width: 28px; - } - - .-main { - background: $gradient-blue-dark; /* For browsers that do not support gradients */ - background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ - background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ - background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ - background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ - border-radius: 25px; - height: 50px; - margin: 13px 30px; - width: 100px; - - img { - -moz-transform: scaleX(-1); - -o-transform: scaleX(-1); - -webkit-transform: scaleX(-1); - transform: scaleX(-1); - filter: FlipH; - -ms-filter: "FlipH"; - } - } - - .-transparent { - background-color: $white; - border-radius: 25px; - box-shadow: none; - height: 50px; - margin: 13px 0; - width: 80px; - } -} diff --git a/src/gui/static/src/app/components/layout/footer/footer.component.spec.ts b/src/gui/static/src/app/components/layout/footer/footer.component.spec.ts deleted file mode 100755 index 01d35cc..0000000 --- a/src/gui/static/src/app/components/layout/footer/footer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FooterComponent } from './footer.component'; - -describe('FooterComponent', () => { - let component: FooterComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ FooterComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FooterComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/gui/static/src/app/components/layout/footer/footer.component.ts b/src/gui/static/src/app/components/layout/footer/footer.component.ts deleted file mode 100755 index 51b314a..0000000 --- a/src/gui/static/src/app/components/layout/footer/footer.component.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Component } from '@angular/core'; -import { Router } from '@angular/router'; -import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; -import { SendSkycoinComponent } from '../../pages/send-skycoin/send-skycoin.component'; - -@Component({ - selector: 'app-footer', - templateUrl: './footer.component.html', - styleUrls: ['./footer.component.scss'] -}) -export class FooterComponent { - - constructor( - private dialog: MatDialog, - private router: Router, - ) { } - - openWalletsPage() { - this.router.navigate(['/wallets']); - } - - openSendPage() { - const config = new MatDialogConfig(); - config.width = '566px'; - this.dialog.open(SendSkycoinComponent, config); - } - - openTransactions() { - this.router.navigate(['/transactions']); - } -} diff --git a/src/gui/static/src/app/components/layout/header/header.component.html b/src/gui/static/src/app/components/layout/header/header.component.html index 3acc43d..cab71bc 100755 --- a/src/gui/static/src/app/components/layout/header/header.component.html +++ b/src/gui/static/src/app/components/layout/header/header.component.html @@ -1,17 +1,21 @@
- +

{{ percentage | percent:'1.2-2' }}

-

{{ coins | number:'1.0-6' }} SLB

+

{{ coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

 

+
-
-

Syncing blocks {{ current && highest ? '(' + current + '/' + highest + ')' : '..' }}

-

{{ hours | number }} SLB Hours

+
+

+ {{ 'header.syncing-blocks' | translate }} + {{ current && highest ? '(' + current + '/' + highest + ')' : '..' }} +

+

{{ hours | number }} {{ 'common.coin-hours' | translate }}

@@ -21,20 +25,27 @@ color="primary" [mode]="querying ? 'query' : 'determinate'" [value]="percentage * 100"> - - -
- No connections active, your client is not connected to any other nodes! + +
+ {{ 'header.update1' | translate }} + v{{ releaseVersion }} + {{ 'header.update2' | translate }}
+
+ +
{{ 'header.errors.no-connections' | translate }}
- Cannot reach backend. Please restart the app and/or seek help on our - Telegram -
-
- Security vulnerability: CSRF is not working, please exit immediately. + {{ 'header.errors.no-backend1' | translate }} + {{ 'header.errors.no-backend2' | translate }} + {{ 'header.errors.no-backend3' | translate }}
+
{{ 'header.errors.csrf' | translate }}
-
There are some pending trasactions. Data you see may not be updated.
+
+ {{ 'header.pending-txs1' | translate }} + {{ 'header.pending-txs2' | translate }} + {{ 'header.pending-txs3' | translate }} +
diff --git a/src/gui/static/src/app/components/layout/header/header.component.scss b/src/gui/static/src/app/components/layout/header/header.component.scss index 8aeb05e..ce0c14b 100755 --- a/src/gui/static/src/app/components/layout/header/header.component.scss +++ b/src/gui/static/src/app/components/layout/header/header.component.scss @@ -6,8 +6,8 @@ } .large-header { - background: url('../../../../assets/img/header.png') center center no-repeat; /* For Safari 5.1 to 6.0 */ - background-size: 100% auto; + background: url('../../../../assets/img/header.png') center center no-repeat; /* For Safari 5.1 to 6.0 */ + background-size: 100% auto; display: flex; flex-flow: column; align-items: stretch; @@ -16,7 +16,7 @@ .balance-container { align-items: center; - color: #9e6924; + color: $white; display: flex; flex: 1 1 auto; font-size: 12px; @@ -27,7 +27,7 @@ .coins { line-height: 1; margin: 0 0 0.5em; - color: #9e6924; + span { font-size: 4em; } @@ -55,14 +55,15 @@ } .notification-bar { - background-color: #845415; - color:#9e6924; + background-color: #F44A4D; + color:#FBFBFB; + div { - margin:auto; + margin: auto; - a{ - text-decoration:none; - color:#9e6924; + a { + text-decoration: none; + color: #FFEBEE; } } } diff --git a/src/gui/static/src/app/components/layout/header/header.component.spec.ts b/src/gui/static/src/app/components/layout/header/header.component.spec.ts index a52be79..89380b4 100755 --- a/src/gui/static/src/app/components/layout/header/header.component.spec.ts +++ b/src/gui/static/src/app/components/layout/header/header.component.spec.ts @@ -8,7 +8,7 @@ describe('HeaderComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ HeaderComponent ] + declarations: [ HeaderComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/layout/header/header.component.ts b/src/gui/static/src/app/components/layout/header/header.component.ts index 3ca2b70..a3a31a2 100755 --- a/src/gui/static/src/app/components/layout/header/header.component.ts +++ b/src/gui/static/src/app/components/layout/header/header.component.ts @@ -10,14 +10,15 @@ import { AppService } from '../../../services/app.service'; import 'rxjs/add/operator/skip'; import 'rxjs/add/operator/take'; import { shouldUpgradeVersion } from '../../../utils/semver'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-header', templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'] + styleUrls: ['./header.component.scss'], }) export class HeaderComponent implements OnInit, OnDestroy { - @Input() title: string; + @Input() headline: string; addresses = []; current: number; @@ -30,8 +31,8 @@ export class HeaderComponent implements OnInit, OnDestroy { hasPendingTxs: boolean; price: number; - private priceSubscription: Subscription; - private walletSubscription: Subscription; + private subscription: Subscription; + private fetchVersionError: string; get loading() { return !this.current || !this.highest || this.current !== this.highest; @@ -52,10 +53,15 @@ export class HeaderComponent implements OnInit, OnDestroy { private priceService: PriceService, private walletService: WalletService, private http: Http, - ) { } + private translateService: TranslateService, + ) { + this.translateService.get('errors.fetch-version').subscribe(msg => { + this.fetchVersionError = msg; + }); + } ngOnInit() { - this.blockchainService.progress + this.subscription = this.blockchainService.progress .filter(response => !!response) .subscribe(response => { this.querying = false; @@ -65,24 +71,26 @@ export class HeaderComponent implements OnInit, OnDestroy { }); this.setVersion(); - this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); - this.walletSubscription = this.walletService.allAddresses().subscribe(addresses => { + + this.subscription.add(this.priceService.price.subscribe(price => this.price = price)); + + this.subscription.add(this.walletService.allAddresses().subscribe(addresses => { this.addresses = addresses.reduce((array, item) => { if (!array.find(addr => addr.address === item.address)) { array.push(item); } + return array; }, []); - }); + })); - this.walletService.pendingTransactions().subscribe(txs => { + this.subscription.add(this.walletService.pendingTransactions().subscribe(txs => { this.hasPendingTxs = txs.length > 0; - }); + })); } ngOnDestroy() { - this.priceSubscription.unsubscribe(); - this.walletSubscription.unsubscribe(); + this.subscription.unsubscribe(); } setVersion() { @@ -99,7 +107,7 @@ export class HeaderComponent implements OnInit, OnDestroy { private retrieveReleaseVersion() { this.http.get('https://api.github.com/repos/skycoin/skycoin/tags') .map((res: any) => res.json()) - .catch((error: any) => Observable.throw(error || 'Unable to fetch latest release version from github.')) + .catch((error: any) => Observable.throw(error || this.fetchVersionError)) .subscribe(response => { this.releaseVersion = response.find(element => element['name'].indexOf('rc') === -1)['name'].substr(1); this.updateAvailable = shouldUpgradeVersion(this.version, this.releaseVersion); diff --git a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html index 7702e51..d9b3978 100755 --- a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html +++ b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html @@ -2,20 +2,29 @@
- Wallets + {{ 'title.wallets' | translate }}
- Send + {{ 'title.send' | translate }}
- History + {{ 'title.history' | translate }}
- Buy Skycoin + {{ 'title.buy-coin' | translate }}
+
diff --git a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss index 0689658..ebd1b58 100755 --- a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss +++ b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss @@ -33,4 +33,9 @@ .-low-opacity { opacity: 0.2; } + + .-switch { + align-self: center; + padding: 0 20px; + } } diff --git a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts index 404ad99..98bcd49 100755 --- a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts +++ b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts @@ -8,7 +8,7 @@ describe('NavBarComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ NavBarComponent ] + declarations: [ NavBarComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts index 1a2f2ea..4b7bd36 100755 --- a/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts +++ b/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts @@ -1,18 +1,20 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { AppConfig } from '../../../../app.config'; +import { NavBarService } from '../../../../services/nav-bar.service'; @Component({ selector: 'app-nav-bar', templateUrl: './nav-bar.component.html', - styleUrls: ['./nav-bar.component.scss'] + styleUrls: ['./nav-bar.component.scss'], }) -export class NavBarComponent implements OnInit { - +export class NavBarComponent { otcEnabled = AppConfig.otcEnabled; - constructor() { } + constructor( + public navbarService: NavBarService, + ) { } - ngOnInit() { + changeActiveComponent(value) { + this.navbarService.setActiveComponent(value); } - } diff --git a/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html b/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html index ba6eb14..ea64b48 100755 --- a/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html +++ b/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html @@ -1,19 +1,19 @@
- {{ title }} + {{ headline }}
- - - - + + + + - - SolarBankersCoin Explorer + + {{ 'title.explorer' | translate }}
@@ -28,17 +27,12 @@

Deposit Location

2
-

Send Bitcoin

-

- Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet - selected above at the current rate of {{ config.sky_btc_exchange_rate }} SKY/BTC. -

+

{{ 'buy.send' | translate }}

+

{{ 'buy.send-desc' | translate:{rate: config.sky_btc_exchange_rate} }}

{{ order.deposit_address }} - - Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent! - + {{ 'buy.fraction-warning' | translate }}
@@ -46,19 +40,16 @@

Send Bitcoin

3
-

Receive Sky

-

- After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour - to receive your SKY. -

+

{{ 'buy.receive' | translate }}

+

{{ 'buy.receive-desc' | translate }}

- Status: {{ order.status | tellerStatus }} + {{ 'buy.status-button' | translate }} {{ order.status | tellerStatus | translate }} - Check Status + {{ 'buy.check-status-button' | translate }} - New Order + {{ 'buy.new-order-button' | translate }}
diff --git a/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts b/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts index 680cd4d..1d0cca4 100755 --- a/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts +++ b/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts @@ -8,7 +8,7 @@ describe('BuyComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BuyComponent ] + declarations: [ BuyComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/buy/buy.component.ts b/src/gui/static/src/app/components/pages/buy/buy.component.ts index 7ce611c..785d8b9 100755 --- a/src/gui/static/src/app/components/pages/buy/buy.component.ts +++ b/src/gui/static/src/app/components/pages/buy/buy.component.ts @@ -1,17 +1,18 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { PurchaseService } from '../../../services/purchase.service'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { WalletService } from '../../../services/wallet.service'; import { Address, PurchaseOrder, Wallet } from '../../../app.datatypes'; import { MatSnackBar } from '@angular/material/snack-bar'; import { ButtonComponent } from '../../layout/button/button.component'; +import { Subscription } from 'rxjs/Subscription'; @Component({ selector: 'app-buy', templateUrl: './buy.component.html', - styleUrls: ['./buy.component.scss'] + styleUrls: ['./buy.component.scss'], }) -export class BuyComponent implements OnInit { +export class BuyComponent implements OnInit, OnDestroy { @ViewChild('button') button: ButtonComponent; address: Address; @@ -20,6 +21,8 @@ export class BuyComponent implements OnInit { order: PurchaseOrder; wallets: Wallet[]; + private subscription: Subscription; + constructor( private formBuilder: FormBuilder, private purchaseService: PurchaseService, @@ -32,14 +35,18 @@ export class BuyComponent implements OnInit { this.loadData(); } + ngOnDestroy() { + this.subscription.unsubscribe(); + } + checkStatus() { this.button.setLoading(); - this.purchaseService.scan(this.order.recipient_address).first().subscribe( + this.purchaseService.scan(this.order.recipient_address).subscribe( response => { this.button.setSuccess(); this.order.status = response.status; }, - error => this.button.setError(error) + error => this.button.setError(error), ); } @@ -53,12 +60,12 @@ export class BuyComponent implements OnInit { wallet: ['', Validators.required], }); - this.form.get('wallet').valueChanges.subscribe(filename => { + this.subscription = this.form.get('wallet').valueChanges.subscribe(filename => { const wallet = this.wallets.find(wlt => wlt.filename === filename); console.log('changing wallet value', filename); this.purchaseService.generate(wallet).subscribe( order => this.saveData(order), - error => this.snackBar.open(error.toString()) + error => this.snackBar.open(error.toString()), ); }); } @@ -74,13 +81,13 @@ export class BuyComponent implements OnInit { this.loadConfig(); this.loadOrder(); - this.walletService.all().subscribe(wallets => { + this.subscription.add(this.walletService.all().subscribe(wallets => { this.wallets = wallets; if (this.order) { this.form.get('wallet').setValue(this.order.filename, { emitEvent: false }); } - }); + })); } private loadOrder() { @@ -99,7 +106,7 @@ export class BuyComponent implements OnInit { private updateOrder() { this.purchaseService.scan(this.order.recipient_address).first().subscribe( response => this.order.status = response.status, - error => console.log(error) + error => console.log(error), ); } } diff --git a/src/gui/static/src/app/components/pages/explorer/explorer.component.html b/src/gui/static/src/app/components/pages/explorer/explorer.component.html deleted file mode 100755 index 13ce357..0000000 --- a/src/gui/static/src/app/components/pages/explorer/explorer.component.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/gui/static/src/app/components/pages/explorer/explorer.component.spec.ts b/src/gui/static/src/app/components/pages/explorer/explorer.component.spec.ts deleted file mode 100755 index 39ead65..0000000 --- a/src/gui/static/src/app/components/pages/explorer/explorer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ExplorerComponent } from './explorer.component'; - -describe('ExplorerComponent', () => { - let component: ExplorerComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ExplorerComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ExplorerComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/gui/static/src/app/components/pages/explorer/explorer.component.ts b/src/gui/static/src/app/components/pages/explorer/explorer.component.ts deleted file mode 100755 index 575ba39..0000000 --- a/src/gui/static/src/app/components/pages/explorer/explorer.component.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { BlockchainService } from '../../../services/blockchain.service'; -import { Router } from '@angular/router'; - -@Component({ - selector: 'app-explorer', - templateUrl: './explorer.component.html', - styleUrls: ['./explorer.component.css'] -}) -export class ExplorerComponent implements OnInit { - - blocks: any[]; - - constructor( - public blockchainService: BlockchainService, - private router: Router, - ) { } - - ngOnInit() { - this.blockchainService.blocks().subscribe(data => this.blocks = data); - } - - onActivate(response) { - if (response.row && response.row.header) { - this.router.navigate(['/explorer', response.row.header.seq]); - } - } -} diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html index fc82d83..2e00da3 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html @@ -2,42 +2,47 @@
- Create a Wallet + {{ 'wallet.new.create-title' | translate }}
-

- If you don't have a SolarBankerCoin wallet, use the generated seed to create a new one. - If you already have a wallet, toggle over to "Load Wallet" and enter your seed. -

+

{{ 'wizard.wallet-desc' | translate }}

- +
- +
- +
@@ -46,7 +51,7 @@
diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss index 8c68e94..410aaf9 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss @@ -1,4 +1,4 @@ -@import '../../../../../theme/_variables'; +@import '../../../../../theme/variables'; .-header { color: $white; @@ -23,7 +23,9 @@ .-buttons-footer { align-items: center; flex-flow: column; + margin-bottom: 20px; } + .-toggle-container{ margin: 10px auto; } diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts index 265ed4d..e93dc61 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts @@ -8,7 +8,7 @@ describe('OnboardingCreateWalletComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ OnboardingCreateWalletComponent ] + declarations: [ OnboardingCreateWalletComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts index 29ae109..e69e4af 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts @@ -1,10 +1,10 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; -import { WalletService } from '../../../../services/wallet.service'; import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; import { OnboardingSafeguardComponent } from './onboarding-safeguard/onboarding-safeguard.component'; import { MatDialogRef } from '@angular/material'; +import { ApiService } from '../../../../services/api.service'; @Component({ selector: 'app-onboarding-create-wallet', @@ -19,7 +19,7 @@ export class OnboardingCreateWalletComponent implements OnInit { constructor( private dialog: MatDialog, - private walletService: WalletService, + private apiService: ApiService, private formBuilder: FormBuilder, ) { } @@ -28,18 +28,15 @@ export class OnboardingCreateWalletComponent implements OnInit { } initForm() { - this.form = this.formBuilder.group({ - label: new FormControl('', Validators.compose([ - Validators.required, Validators.minLength(2), - ])), - seed: new FormControl('', Validators.compose([ - Validators.required, Validators.minLength(2), - ])), - confirm_seed: new FormControl('', - Validators.compose(this.showCreateForm ? [Validators.required, Validators.minLength(2)] : []) - ), + this.form = this.formBuilder.group( + { + label: new FormControl('', [Validators.required]), + seed: new FormControl('', [Validators.required]), + confirm_seed: new FormControl(), + }, + { + validator: this.showCreateForm ? this.seedMatchValidator.bind(this) : null, }, - this.showCreateForm ? { validator: this.seedMatchValidator.bind(this) } : {}, ); if (this.fill) { @@ -71,7 +68,7 @@ export class OnboardingCreateWalletComponent implements OnInit { } generateSeed(entropy: number) { - this.walletService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); + this.apiService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); } get showCreateForm() { @@ -87,13 +84,13 @@ export class OnboardingCreateWalletComponent implements OnInit { } private seedMatchValidator(g: FormGroup) { - return g.get('seed').value === g.get('confirm_seed').value - ? null : { mismatch: true }; + return g.get('seed').value === g.get('confirm_seed').value ? null : { NotEqual: true }; } private showSafe(): MatDialogRef { const config = new MatDialogConfig(); config.width = '450px'; + return this.dialog.open(OnboardingSafeguardComponent, config); } } diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html index c52c0aa..980e908 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html @@ -1,17 +1,15 @@ - +
- - We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your SolarBankerCoin wallet! - + {{ 'wizard.confirm.desc' | translate }}
It’s safe, I swear. + type="checkbox" id="terms">{{ 'wizard.confirm.checkbox' | translate }}
- Continue + {{ 'wizard.confirm.button' | translate }}
diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts index 17da51f..39e1097 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts @@ -8,7 +8,7 @@ describe('OnboardingSafeguardComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ OnboardingSafeguardComponent ] + declarations: [ OnboardingSafeguardComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts index 8c8e29f..d4c7049 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts @@ -7,7 +7,6 @@ import { MatDialogRef } from '@angular/material/dialog'; styleUrls: ['./onboarding-safeguard.component.scss'], }) export class OnboardingSafeguardComponent { - public acceptSafe = false; constructor( @@ -21,5 +20,4 @@ export class OnboardingSafeguardComponent { setAccept(event) { this.acceptSafe = event.checked; } - } diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html index 1e11579..714d665 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html @@ -2,20 +2,18 @@
- Encrypt your wallet + {{ 'wallet.new.encrypt-title' | translate }}
-

- Increase security of your wallet by encrypting it. By entering a password below, your wallet will be - encrypted. Only those with the password will be able access the wallet and remove funds. -

+

{{ 'wizard.encrypt-desc' | translate }}

- Encrypt Wallet + + + {{ 'wallet.new.encrypt' | translate }}
@@ -23,11 +21,11 @@
- +
- +
@@ -36,10 +34,10 @@
diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss index 7e2e48c..1536dcf 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss @@ -1,4 +1,4 @@ -@import '../../../../../theme/_variables'; +@import '../../../../../theme/variables'; .-header { color: $white; @@ -23,6 +23,7 @@ .-buttons-footer { align-items: center; flex-flow: column; + margin-bottom: 20px; } .-check-container { diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts index 38341b2..ae851bb 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts @@ -8,7 +8,7 @@ describe('OnboardingEncryptWalletComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ OnboardingEncryptWalletComponent ] + declarations: [ OnboardingEncryptWalletComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts index d261461..bdc9740 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts @@ -13,7 +13,9 @@ export class OnboardingEncryptWalletComponent implements OnInit { @Output() onBack = new EventEmitter(); form: FormGroup; - constructor(private formBuilder: FormBuilder) { } + constructor( + private formBuilder: FormBuilder, + ) { } ngOnInit() { this.initEncryptForm(); diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts index 303f80a..b41b460 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts @@ -8,7 +8,7 @@ describe('OnboardingComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ OnboardingComponent ] + declarations: [ OnboardingComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts b/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts index e2def8b..23492bf 100755 --- a/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts +++ b/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts @@ -5,10 +5,9 @@ import { WalletService } from '../../../services/wallet.service'; @Component({ selector: 'app-onboarding', templateUrl: './onboarding.component.html', - styleUrls: ['./onboarding.component.scss'] + styleUrls: ['./onboarding.component.scss'], }) export class OnboardingComponent { - step = 1; label: string; seed: string; @@ -47,5 +46,4 @@ export class OnboardingComponent { this.router.navigate(['/wallets']); }); } - } diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html new file mode 100755 index 0000000..4294ae8 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html @@ -0,0 +1,114 @@ +
+
+ +
+ +
+
+ +
+ +
+ + + {{ addr.address }} - {{ addr.coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }} + ({{ addr.hours | number:'1.0-6' }} {{ 'common.coin-hours' | translate }}) + + +
+ {{ address.address }} - {{ address.coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }} + ({{ address.hours | number:'1.0-6' }} {{ 'common.coin-hours' | translate }}) +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+
+ + {{ 'common.coin-id' | translate }} +
+
+
+
+ + {{ 'common.coin-hours' | translate }} +
+
+
+ plus + minus +
+
+
+
+ +
+ + +
+ +
+
+
+ +
+ {{ 'send.hours-allocation-label' | translate }} + + {{ 'send.options-label' | translate }} keyboard_arrow_down + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss new file mode 100755 index 0000000..b20c963 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss @@ -0,0 +1,156 @@ +@import '../../../../../theme/variables'; + +.-input-addon { + display: flex; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + span { + border: 2px; + border-radius: 0 6px 6px 0; + background: #f1f1f1; + padding: 0 10px; + line-height: 44px; + color: $grey; + font-size: 14px; + flex-shrink: 0; + } +} + +.-destination { + &:not(:last-child) { + margin-bottom: 5px; + } + + .-icons { + text-align: right; + padding-top: 5px; + + img { + width: 32px; + cursor: pointer; + } + } +} + +mat-checkbox { + font-size: 12px; +} + +mat-select { + background: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.-autohours { + margin: 40px 0 20px; + + .-check ::ng-deep { + .mat-checkbox-checkmark-path { + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + .mat-checkbox-label { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + flex: 1; + } + + .-options { + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + + .mat-checkbox-layout { + display: flex; + } + } + + .-options-wrapper { + margin-top: 20px; + + mat-slider { + width: 100%; + padding: 0; + height: 40px; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + background: white; + + ::ng-deep { + .mat-slider-thumb, .mat-slider-thumb-label { + background-color: $gradient-blue-dark !important; + transform: scale(1) !important; + border-width: 0 !important; + } + + .mat-slider-thumb { + right: -6px; + width: 12px; + height: 32px; + border-radius: 3px; + } + + .mat-slider-track-fill, .mat-slider-track-background { + background-color: white !important; + } + } + } + } +} + +.-buttons { + text-align: center; +} + +.-hidden { + display: none; +} + +.-space-between { + display: flex; + justify-content: space-between; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts new file mode 100755 index 0000000..057bc47 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormAdvancedComponent } from './send-form-advanced.component'; + +describe('SendFormAdvancedComponent', () => { + let component: SendFormAdvancedComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormAdvancedComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormAdvancedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts new file mode 100755 index 0000000..abb7590 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts @@ -0,0 +1,335 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialog, MatSnackBar } from '@angular/material'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { showSnackbarError } from '../../../../utils/errors'; +import { Subscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; + +@Component({ + selector: 'app-send-form-advanced', + templateUrl: './send-form-advanced.component.html', + styleUrls: ['./send-form-advanced.component.scss'], +}) +export class SendFormAdvancedComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + form: FormGroup; + addresses = []; + autoHours = true; + autoOptions = false; + autoShareValue = '0.5'; + previewTx: boolean; + + private subscriptions: Subscription; + + constructor( + public walletService: WalletService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private snackbar: MatSnackBar, + private navbarService: NavBarService, + ) { } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + addresses: ['', Validators.required], + changeAddress: [''], + destinations: this.formBuilder.array( + [this.createDestinationFormGroup()], + this.validateDestinations.bind(this), + ), + }); + + this.subscriptions = this.form.get('wallet').valueChanges.subscribe(wallet => { + this.addresses = wallet.addresses.filter(addr => addr.coins > 0); + this.form.get('addresses').setValue([]); + this.form.get('destinations').updateValueAndValidity(); + }); + + this.subscriptions.add(this.form.get('addresses').valueChanges.subscribe(() => { + this.form.get('destinations').updateValueAndValidity(); + })); + + if (this.formData) { + this.fillForm(); + } + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + this.navbarService.hideSwitch(); + this.snackbar.dismiss(); + } + + preview() { + this.previewTx = true; + this.unlockAndSend(); + } + + send() { + this.previewTx = false; + this.unlockAndSend(); + } + + unlockAndSend() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.get('wallet').value.encrypted) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + this.createTransaction(); + } + } + + addDestination() { + const destinations = this.form.get('destinations') as FormArray; + destinations.push(this.createDestinationFormGroup()); + } + + removeDestination(index) { + const destinations = this.form.get('destinations') as FormArray; + destinations.removeAt(index); + } + + setShareValue(event) { + this.autoShareValue = parseFloat(event.value).toFixed(2); + } + + toggleOptions(event) { + event.stopPropagation(); + event.preventDefault(); + + this.autoOptions = !this.autoOptions; + } + + setAutoHours(event) { + this.autoHours = event.checked; + this.form.get('destinations').updateValueAndValidity(); + + if (!this.autoHours) { + this.autoOptions = false; + } + } + + private fillForm() { + this.addresses = this.formData.form.wallet.addresses; + + ['wallet', 'addresses', 'changeAddress'].forEach(name => { + this.form.get(name).setValue(this.formData.form[name]); + }); + + for (let i = 0; i < this.formData.form.destinations.length - 1; i++) { + this.addDestination(); + } + + this.destControls.forEach((destControl, i) => { + ['address', 'coins', 'hours'].forEach(name => { + destControl.get(name).setValue(this.formData.form.destinations[i][name]); + }); + }); + + if (this.formData.form.hoursSelection.type === 'auto') { + this.autoShareValue = this.formData.form.hoursSelection.share_factor; + this.autoHours = true; + } else { + this.autoHours = false; + } + + this.autoOptions = this.formData.form.autoOptions; + } + + addressCompare(a, b) { + return a.address === b.address; + } + + get destControls() { + return (this.form.get('destinations') as FormArray).controls; + } + + private validateDestinations() { + if (!this.form || !Array.isArray(this.form.get('addresses').value)) { + return { Required: true }; + } + + const invalidInput = this.destControls.find(control => { + const checkControls = ['coins']; + + if (!this.autoHours) { + checkControls.push('hours'); + } + + return checkControls.map(name => { + const value = control.get(name).value !== undefined + ? control.get(name).value.replace(' ', '=') + : ''; + + if (isNaN(value) || value.trim() === '') { + return true; + } + + if (parseFloat(value) <= 0) { + return true; + } + + if (name === 'coins') { + const parts = value.split('.'); + + if (parts.length === 2 && parts[1].length > 6) { + return true; + } + } else if (name === 'hours') { + if (value < 1 || parseInt(value, 10) !== parseFloat(value)) { + return true; + } + } + + return false; + }).find(e => e === true); + }); + + if (invalidInput) { + return { Invalid: true }; + } + + const coins = this.form.get('addresses').value.reduce((a, b) => a + b.coins, 0); + const hours = this.form.get('addresses').value.reduce((a, b) => a + b.hours, 0); + const destinationsCoins = this.destControls.reduce((a, b) => a + parseFloat(b.value.coins), 0); + const destinationsHours = this.destControls.reduce((a, b) => a + parseInt(b.value.hours, 10), 0); + + if (destinationsCoins > coins || destinationsHours > hours) { + return { Invalid: true }; + } + + return null; + } + + private createDestinationFormGroup() { + return this.formBuilder.group({ + address: '', + coins: '', + hours: '', + }); + } + + private createTransaction(passwordDialog?: any) { + if (passwordDialog) { + passwordDialog.close(); + } + + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + + this.walletService.createTransaction( + this.form.get('wallet').value, + this.form.get('addresses').value.map(addr => addr.address), + this.destinations, + this.hoursSelection, + this.form.get('changeAddress').value ? this.form.get('changeAddress').value : null, + passwordDialog ? passwordDialog.password : null, + ) + .toPromise() + .then(transaction => { + if (!this.previewTx) { + return this.walletService.injectTransaction(transaction.encoded).toPromise(); + } + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.get('wallet').value, + addresses: this.form.get('addresses').value, + changeAddress: this.form.get('changeAddress').value, + destinations: this.destinations, + hoursSelection: this.hoursSelection, + autoOptions: this.autoOptions, + }, + amount: this.destinations.reduce((a, b) => a + parseFloat(b.coins), 0), + to: this.destinations.map(d => d.address), + transaction, + }); + }) + .then(() => { + this.sendButton.setSuccess(); + this.resetForm(); + + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + }) + .catch(error => { + showSnackbarError(this.snackbar, error); + + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + }); + } + + private resetForm() { + this.form.get('wallet').setValue('', { emitEvent: false }); + this.form.get('addresses').setValue([]); + this.form.get('changeAddress').setValue(''); + + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + this.addDestination(); + + this.autoHours = true; + this.autoOptions = false; + this.autoShareValue = '0.5'; + } + + private get destinations() { + return this.destControls.map(destControl => { + const destination = { + address: destControl.get('address').value, + coins: destControl.get('coins').value, + }; + + if (!this.autoHours) { + destination['hours'] = destControl.get('hours').value; + } + + return destination; + }); + } + + private get hoursSelection() { + let hoursSelection = { + type: 'manual', + }; + + if (this.autoHours) { + hoursSelection = { + type: 'auto', + mode: 'share', + share_factor: this.autoShareValue, + }; + } + + return hoursSelection; + } +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html new file mode 100755 index 0000000..ea489c8 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html @@ -0,0 +1,28 @@ +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
+
diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss new file mode 100755 index 0000000..079dcb6 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss @@ -0,0 +1,3 @@ +.-buttons { + text-align: center; +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts new file mode 100755 index 0000000..40e927e --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormComponent } from './send-form.component'; + +describe('SendFormComponent', () => { + let component: SendFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts new file mode 100755 index 0000000..1901079 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts @@ -0,0 +1,188 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import 'rxjs/add/operator/delay'; +import 'rxjs/add/operator/filter'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { MatDialog, MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; + +@Component({ + selector: 'app-send-form', + templateUrl: './send-form.component.html', + styleUrls: ['./send-form.component.scss'], +}) +export class SendFormComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + form: FormGroup; + transactions = []; + previewTx: boolean; + + private subscription: ISubscription; + + constructor( + public formBuilder: FormBuilder, + public walletService: WalletService, + private dialog: MatDialog, + private snackbar: MatSnackBar, + private navbarService: NavBarService, + ) {} + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + this.initForm(); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + this.navbarService.hideSwitch(); + this.snackbar.dismiss(); + } + + preview() { + this.previewTx = true; + this.unlockAndSend(); + } + + send() { + this.previewTx = false; + this.unlockAndSend(); + } + + private unlockAndSend() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + this.createTransaction(); + } + } + + private createTransaction(passwordDialog?: any) { + if (passwordDialog) { + passwordDialog.close(); + } + + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + + this.walletService.createTransaction( + this.form.value.wallet, + null, + [{ + address: this.form.value.address, + coins: this.form.value.amount, + }], + { + type: 'auto', + mode: 'share', + share_factor: '0.5', + }, + null, + passwordDialog ? passwordDialog.password : null, + ) + .toPromise() + .then(transaction => { + if (!this.previewTx) { + return this.walletService.injectTransaction(transaction.encoded).toPromise(); + } + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.value.wallet, + address: this.form.value.address, + amount: this.form.value.amount, + }, + amount: this.form.value.amount, + to: [this.form.value.address], + transaction, + }); + }) + .then(() => { + this.sendButton.setSuccess(); + this.resetForm(); + + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + }) + .catch(error => { + showSnackbarError(this.snackbar, error); + + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + }); + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + address: ['', Validators.required], + amount: ['', Validators.required], + }); + + this.subscription = this.form.get('wallet').valueChanges.subscribe(value => { + const balance = value && value.coins ? value.coins : 0; + + this.form.get('amount').setValidators([ + Validators.required, + Validators.max(balance), + this.validateAmount, + ]); + + this.form.get('amount').updateValueAndValidity(); + }); + + if (this.formData) { + Object.keys(this.form.controls).forEach(control => { + this.form.get(control).setValue(this.formData.form[control]); + }); + } + } + + private validateAmount(amountControl: FormControl) { + if (isNaN(amountControl.value.replace(' ', '='))) { + return { Invalid: true }; + } + + if (parseFloat(amountControl.value) <= 0) { + return { Invalid: true }; + } + + const parts = amountControl.value.split('.'); + + if (parts.length === 2 && parts[1].length > 6) { + return { Invalid: true }; + } + + return null; + } + + private resetForm() { + this.form.get('wallet').setValue(''); + this.form.get('address').setValue(''); + this.form.get('amount').setValue(''); + } +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html new file mode 100755 index 0000000..0ba12a6 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html @@ -0,0 +1,9 @@ + + +
+ {{ 'send.back-button' | translate }} + {{ 'send.send-button' | translate }} +
diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss new file mode 100755 index 0000000..4bf1cca --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss @@ -0,0 +1,4 @@ +.-buttons { + margin-top: 10px; + text-align: center; +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts new file mode 100755 index 0000000..63db508 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendVerifyComponent } from './send-preview.component'; + +describe('SendVerifyComponent', () => { + let component: SendVerifyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendVerifyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendVerifyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts new file mode 100755 index 0000000..a87f64a --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts @@ -0,0 +1,58 @@ +import { Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { PreviewTransaction } from '../../../../app.datatypes'; + +@Component({ + selector: 'app-send-preview', + templateUrl: './send-preview.component.html', + styleUrls: ['./send-preview.component.scss'], +}) +export class SendVerifyComponent implements OnDestroy { + @ViewChild('sendButton') sendButton: ButtonComponent; + @ViewChild('backButton') backButton: ButtonComponent; + @Input() transaction: PreviewTransaction; + @Output() onBack = new EventEmitter(); + + constructor( + private walletService: WalletService, + private snackbar: MatSnackBar, + ) {} + + ngOnDestroy() { + this.snackbar.dismiss(); + } + + send() { + if (this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.sendButton.resetState(); + this.sendButton.setLoading(); + this.backButton.setDisabled(); + + this.walletService.injectTransaction(this.transaction.encoded).subscribe(() => { + this.sendButton.setSuccess(); + this.sendButton.setDisabled(); + + this.walletService.startDataRefreshSubscription(); + + setTimeout(() => { + this.onBack.emit(true); + }, 3000); + }, error => { + showSnackbarError(this.snackbar, error); + + this.sendButton.setError(error); + this.backButton.setEnabled(); + }); + } + + back() { + this.onBack.emit(false); + } +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html new file mode 100755 index 0000000..c0e24a9 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html @@ -0,0 +1,80 @@ +
+
+

{{ 'tx.confirm-transaction' | translate }}

+

{{ 'tx.transaction' | translate }}

+ + +
+ {{ 'tx.from' | translate }}: {{ transaction.from }} +
+
+ {{ 'tx.to' | translate }}: {{ transaction.to.join(', ') }} +
+
+ +
+ {{ 'tx.date' | translate }}: {{ transaction.timestamp * 1000 | date:'short' }} +
+
+ {{ 'tx.status' | translate }}: {{ (transaction.confirmed ? 'tx.confirmed' : 'tx.pending') | translate }} +
+
+
+ {{ 'tx.hours' | translate }}: + {{ transaction.hoursSent | number:'1.0-6' }} {{ 'tx.hours-sent' | translate }} + | + {{ transaction.hoursBurned | number:'1.0-6' }} {{ 'tx.hours-burned' | translate }} +
+
+ {{ 'tx.id' | translate }}: {{ transaction.txid }} +
+
+
+
+ +
+

{{ transaction.balance | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

+ +
+
+
+ + {{ 'tx.show-more' | translate }} keyboard_arrow_down + +
+
+ +
+

{{ 'tx.inputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? input.address : input.owner }}
+
+ {{ 'tx.coins' | translate }}: {{ input.coins | number:'1.0-6' }} +
+
+ {{ 'tx.hours' | translate }}: {{ input.calculated_hours | number:'1.0-6' }} +
+
+
+
+
+

{{ 'tx.outputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? output.address : output.dst }}
+
+ {{ 'tx.coins' | translate }}: {{ output.coins | number:'1.0-6' }} +
+
+ {{ 'tx.hours' | translate }}: {{ output.hours | number:'1.0-6' }} +
+
+
+
+
+
diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss new file mode 100755 index 0000000..87aa5d3 --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss @@ -0,0 +1,108 @@ +@import '../../../../../../theme/variables'; + +h4 { + font-size: 14px; + margin: 0 0 30px; +} + +.-item { + display: flex; + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 10px; + } + + .-number { + padding: 10px; + background: $grey-lightest; + align-self: flex-start; + border-radius: 10px; + } + + .-info { + margin-left: 10px; + display: flex; + flex-direction: column; + + .-address { + padding: 10px 0; + margin-bottom: 5px; + } + } +} + +.-data { + font-size: 12px; + + &:not(:last-child) { + margin-bottom: 5px; + } + + span:first-child { + color: $grey; + display: inline-block; + width: 60px; + } + + &.-more { + margin-bottom: 0 !important; + + span { + width: auto !important; + margin-top: 30px; + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + } +} + +.-tx-meta { + .-data:not(:last-child) { + margin-bottom: 10px; + } +} + +.-tx-price { + text-align: center; + display: flex; + flex-direction: column; + justify-content: flex-end; + + .-icon { + &.-incoming { + transform: rotate(180deg); + } + + img { + width: 30px; + } + } + + h4 { + color: $grey-dark; + font-size: 16px; + font-weight: 700; + margin: 10px 0 5px; + } + + p { + color: $grey; + font-size: 12px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } +} + +.-margin-top { + margin-top: 30px; +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts new file mode 100755 index 0000000..1637b8c --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionInfoComponent } from './transaction-info.component'; + +describe('TransactionInfoComponent', () => { + let component: TransactionInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionInfoComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts new file mode 100755 index 0000000..1f7b7fb --- /dev/null +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts @@ -0,0 +1,41 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PreviewTransaction, Transaction } from '../../../../../app.datatypes'; +import { PriceService } from '../../../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-transaction-info', + templateUrl: './transaction-info.component.html', + styleUrls: ['./transaction-info.component.scss'], +}) +export class TransactionInfoComponent implements OnInit, OnDestroy { + @Input() transaction: Transaction; + @Input() isPreview: boolean; + price: number; + showInputsOutputs = false; + + private subscription: ISubscription; + + constructor(private priceService: PriceService) { + this.subscription = this.priceService.price.subscribe(price => this.price = price); + } + + ngOnInit() { + if (this.isPreview) { + this.transaction.hoursSent = this.transaction.outputs + .filter(o => ( this.transaction).to.find(addr => addr === o.address)) + .map(o => parseInt(o.hours, 10)) + .reduce((a, b) => a + b, 0); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + toggleInputsOutputs(event) { + event.preventDefault(); + + this.showInputsOutputs = !this.showInputsOutputs; + } +} diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html index 19c1370..1acadd8 100755 --- a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html @@ -1,28 +1,20 @@ - +
-
-
- - -
-
- - -
-
- - -
-
- - -
- - Send - +
+ + +
diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts index b107bdb..97248ad 100755 --- a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts @@ -8,7 +8,7 @@ describe('SendSkycoinComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SendSkycoinComponent ] + declarations: [ SendSkycoinComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts index b6e4d97..daec923 100755 --- a/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts +++ b/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts @@ -1,130 +1,54 @@ -import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { WalletService } from '../../../services/wallet.service'; -import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar'; -import 'rxjs/add/operator/delay'; -import 'rxjs/add/operator/filter'; -import { ButtonComponent } from '../../layout/button/button.component'; -import { PasswordDialogComponent } from '../../layout/password-dialog/password-dialog.component'; -import { MatDialog } from '@angular/material'; -import { parseResponseMessage } from '../../../utils/index'; +import { Component, OnDestroy } from '@angular/core'; +import { NavBarService } from '../../../services/nav-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { DoubleButtonActive } from '../../layout/double-button/double-button.component'; @Component({ selector: 'app-send-skycoin', templateUrl: './send-skycoin.component.html', - styleUrls: ['./send-skycoin.component.scss'] + styleUrls: ['./send-skycoin.component.scss'], }) -export class SendSkycoinComponent implements OnInit, OnDestroy { - @ViewChild('button') button: ButtonComponent; +export class SendSkycoinComponent implements OnDestroy { + showForm = true; + formData: any; + activeForm: DoubleButtonActive; + activeForms = DoubleButtonActive; - form: FormGroup; - transactions = []; + private subscription: ISubscription; constructor( - public formBuilder: FormBuilder, - public walletService: WalletService, - private snackbar: MatSnackBar, - private dialog: MatDialog, - ) {} - - ngOnInit() { - this.initForm(); + private navbarService: NavBarService, + ) { + this.subscription = navbarService.activeComponent.subscribe(value => { + this.activeForm = value; + this.formData = null; + }); } ngOnDestroy() { - this.snackbar.dismiss(); + this.subscription.unsubscribe(); } - send() { - if (!this.form.valid || this.button.isLoading()) { - return; - } - - this.button.resetState(); - this.snackbar.dismiss(); - - if (this.form.value.wallet.encrypted) { - this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit - .subscribe(passwordDialog => { - this._send(passwordDialog); - }); - } else { - this._send(); - } + onFormSubmitted(data) { + this.formData = data; + this.showForm = false; } - private _send(passwordDialog?: any) { - if (passwordDialog) { - passwordDialog.close(); + onBack(deleteFormData) { + if (deleteFormData) { + this.formData = null; } - this.button.setLoading(); - - this.walletService.createTransaction( - this.form.value.wallet, - this.form.value.address, - this.form.value.amount, - passwordDialog ? passwordDialog.password : null - ) - .toPromise() - .then(response => { - return this.walletService.injectTransaction(response.encoded_transaction).toPromise(); - }) - .then(() => { - this.resetForm(); - this.button.setSuccess(); - this.walletService.startDataRefreshSubscription(); - }) - .catch(error => { - const errorMessage = parseResponseMessage(error['_body']); - const config = new MatSnackBarConfig(); - config.duration = 300000; - this.snackbar.open(errorMessage, null, config); - this.button.setError(errorMessage); - }); - } - - private initForm() { - this.form = this.formBuilder.group({ - wallet: ['', Validators.required], - address: ['', Validators.required], - amount: ['', Validators.required], - notes: [''], - }); - this.form.get('wallet').valueChanges.subscribe(value => { - console.log(value); - const balance = value && value.coins ? value.coins : 0; - this.form.get('amount').setValidators([ - Validators.required, - Validators.max(balance), - this.validateAmount, - ]); - this.form.get('amount').updateValueAndValidity(); - }); + this.showForm = true; } - private resetForm() { - this.form.get('wallet').reset(''); - this.form.get('address').reset(''); - this.form.get('amount').reset(''); - this.form.get('notes').reset(''); - } - - private validateAmount(amountControl: FormControl) { - if (isNaN(amountControl.value)) { - return { Invalid: true }; - } + get transaction() { + const transaction = this.formData.transaction; - if (parseFloat(amountControl.value) <= 0) { - return { Invalid: true }; - } - - const parts = amountControl.value.split('.'); - - if (parts.length === 2 && parts[1].length > 6) { - return { Invalid: true }; - } + transaction.from = this.formData.form.wallet.label; + transaction.to = this.formData.to; + transaction.balance = this.formData.amount; - return null; + return transaction; } } diff --git a/src/gui/static/src/app/components/pages/settings/backup/backup.component.html b/src/gui/static/src/app/components/pages/settings/backup/backup.component.html index f1dcaa6..2af4b72 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/backup.component.html +++ b/src/gui/static/src/app/components/pages/settings/backup/backup.component.html @@ -1,30 +1,36 @@
- + - -

Wallet Directory: {{ folder }}

- -

BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.

+
+
+

{{ 'backup.wallet-directory' | translate }} {{ folder }}

+

{{ 'backup.seed-warning' | translate }}

+

+ +

+
-

- Use the table below to get seeds from your encrypted wallets.
- To get seeds from unencrypted wallets, open the folder above, - open the .wlt files in a text editor and recover the seeds. -

- + - -
-
Wallet Label
-
Filename
-
Seed
-
-
-
{{ wallet.label }}
-
{{ wallet.filename }}
-
- +
+
+
{{ 'backup.wallet' | translate }}
+
{{ 'backup.filename' | translate }}
+
+
+
+
+
{{ wallet.label }}
+
{{ wallet.filename }}
+
+ {{ 'backup.show-seed' | translate }} +
+
- +
diff --git a/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss b/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss index a2aa1d9..99c14b9 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss +++ b/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss @@ -1,27 +1,39 @@ @import '../../../../../theme/variables'; -mat-card { - margin: 40px 20px 20px 20px; -} - -.-table { - .-table-header { - font-size: 10px; - color: $grey-dark; - margin-bottom: 20px; - } +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; + margin: 30px 30px 0; - .-table-row { - &:not(:last-child) { - margin-bottom: 10px; + p { + &:first-child { + margin-top: 0; } - span { - line-height: 40px; + &:last-child { + margin-bottom: 0; } } } -.text-muted { - color: $grey-dark; +.-text-muted { + color: $grey; +} + +.-text-right { + text-align: right; +} + +.-link { + color: $blue; + cursor: pointer; +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } diff --git a/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts b/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts index 7f7a08c..e7e4b77 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts @@ -8,7 +8,7 @@ describe('BackupComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BackupComponent ] + declarations: [ BackupComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts b/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts index 3f8a9f0..88bf75f 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts +++ b/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { WalletService } from '../../../../services/wallet.service'; import { Wallet } from '../../../../app.datatypes'; import { MatDialog, MatDialogConfig } from '@angular/material'; @@ -8,13 +8,14 @@ import { PasswordDialogComponent } from '../../../layout/password-dialog/passwor @Component({ selector: 'app-backup', templateUrl: './backup.component.html', - styleUrls: ['./backup.component.scss'] + styleUrls: ['./backup.component.scss'], }) -export class BackupComponent implements OnInit { - +export class BackupComponent implements OnInit, OnDestroy { folder: string; wallets: Wallet[] = []; + private walletSubscription; + constructor( public walletService: WalletService, private dialog: MatDialog, @@ -22,11 +23,16 @@ export class BackupComponent implements OnInit { ngOnInit() { this.walletService.folder().subscribe(folder => this.folder = folder); - this.walletService.all().subscribe(wallets => { + + this.walletSubscription = this.walletService.all().subscribe(wallets => { this.wallets = wallets; }); } + ngOnDestroy() { + this.walletSubscription.unsubscribe(); + } + get onlyEncrypted() { return this.wallets.filter(wallet => wallet.encrypted); } diff --git a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html index eadccce..12e4121 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html +++ b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html @@ -1,11 +1,11 @@ - +
- +
- Close + {{ 'backup.close-button' | translate }}
diff --git a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts index 1c3c5dd..e269ec5 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts @@ -8,7 +8,7 @@ describe('SeedModalComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ SeedModalComponent ] + declarations: [ SeedModalComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts index a3602d9..749726e 100755 --- a/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts +++ b/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts @@ -4,17 +4,15 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; @Component({ selector: 'app-seed-modal', templateUrl: './seed-modal.component.html', - styleUrls: ['./seed-modal.component.css'] + styleUrls: ['./seed-modal.component.css'], }) export class SeedModalComponent implements OnDestroy { - constructor( - public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, ) {} ngOnDestroy() { this.data.seed = null; } - } diff --git a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html index 4b76a34..53a4ed9 100755 --- a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html +++ b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html @@ -1,16 +1,52 @@
- + - -
- Number of blocks:
- Time since last block:
- Hash of last block:
-
-
- {{ block.header.seq | number }}
- {{ block.header.timestamp | dateFromNow }}
- {{ block.header.block_hash }} + + +
+
+
+
+
+
{{ 'blockchain.blocks' | translate }}
+
{{ block.header.seq | number }}
+
+
+
{{ 'blockchain.time' | translate }}
+
{{ block.header.timestamp | dateTime }}
+
+
+
{{ 'blockchain.hash' | translate }}
+
{{ block.header.block_hash }}
+
+
+
+
+
+
+
+
+
{{ 'blockchain.current-supply' | translate }}
+
{{ coinSupply.current_supply | number }}
+
+
+
{{ 'blockchain.total-supply' | translate }}
+
{{ coinSupply.total_supply | number }}
+
+
+
+
+
{{ 'blockchain.current-coinhour-supply' | translate }}
+
{{ coinSupply.current_coinhour_supply | number }}
+
+
+
{{ 'blockchain.total-coinhour-supply' | translate }}
+
{{ coinSupply.total_coinhour_supply | number }}
+
+
+
+
+
- +
diff --git a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss index abac330..eeb3316 100755 --- a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss +++ b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss @@ -1,21 +1,28 @@ -@import '../../../../../theme/_variables.scss'; +@import '../../../../../theme/variables'; -mat-card { - margin-left: 20px; - margin-right: 20px; +.-wrapper { + margin: 30px; } -.skycoin-details { - margin-top: 40px; - margin-bottom: 20px; - line-height: 30px; +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; } -.skycoin-detail-keys { - display: inline-block; - color: $grey-dark; -} +.-item { + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } -.skycoin-detail-values { - display: inline-block; + .-value { + word-break: break-all; + } } diff --git a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts index 6946554..e868709 100755 --- a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts @@ -8,7 +8,7 @@ describe('BlockchainComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ BlockchainComponent ] + declarations: [ BlockchainComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts index ae6125d..38643fc 100755 --- a/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts +++ b/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts @@ -4,11 +4,11 @@ import { BlockchainService } from '../../../../services/blockchain.service'; @Component({ selector: 'app-blockchain', templateUrl: './blockchain.component.html', - styleUrls: ['./blockchain.component.scss'] + styleUrls: ['./blockchain.component.scss'], }) export class BlockchainComponent implements OnInit { - block: any; + coinSupply: any; constructor( private blockchainService: BlockchainService, @@ -16,5 +16,6 @@ export class BlockchainComponent implements OnInit { ngOnInit() { this.blockchainService.lastBlock().subscribe(block => this.block = block); + this.blockchainService.coinSupply().subscribe(coinSupply => this.coinSupply = coinSupply); } } diff --git a/src/gui/static/src/app/components/pages/settings/network/network.component.html b/src/gui/static/src/app/components/pages/settings/network/network.component.html index fec9227..424b602 100755 --- a/src/gui/static/src/app/components/pages/settings/network/network.component.html +++ b/src/gui/static/src/app/components/pages/settings/network/network.component.html @@ -1,28 +1,40 @@
- + -

Automatic peers

+ - -
-
-
- {{ peer.address.split(':')[0] }} - :{{ peer.listen_port }} -
+
+
+
+
+
{{ 'network.peer' | translate }}
+
{{ 'network.source' | translate }}
+
{{ 'network.block-height' | translate }}
+
{{ 'network.last-seen' | translate }}
-
- - -

Default peers

- -
-
-
- {{ peer.address.split(':')[0] }} - :{{ peer.listen_port }} +
+
+
+ +
+
+ {{ peer.address.split(':')[0] }}:{{ peer.listen_port }} +
+
{{ ('network.sources.' + peer.source) | translate }}
+
{{ peer.height }}
+
+
+ keyboard_arrow_up + {{ peer.last_sent | dateFromNow }} +
+
+ keyboard_arrow_down + {{ peer.last_received | dateFromNow }} +
+
- +
diff --git a/src/gui/static/src/app/components/pages/settings/network/network.component.scss b/src/gui/static/src/app/components/pages/settings/network/network.component.scss index 865837d..8ee46bf 100755 --- a/src/gui/static/src/app/components/pages/settings/network/network.component.scss +++ b/src/gui/static/src/app/components/pages/settings/network/network.component.scss @@ -1,28 +1,50 @@ -@import '../../../../../theme/_variables.scss'; +@import '../../../../../theme/variables'; -mat-card { - margin-bottom: 20px; +.-port, .-last-seen, .-source { + color: $grey; +} - .row { - margin-bottom: -10px; - } +.-direction { + width: 72px; + display: flex; + justify-content: center; + align-items: center; - .-peer { - margin-bottom: 10px; - display: flex; + img { + width: 32px; - .-port { - color: $grey-dark; + &.-incoming { + transform: scaleX(-1); } } } -h3 { - font-weight: 400; - margin-top: 40px; +.-last-seen { + display: flex; + flex-direction: column; + font-size: 12px; + line-height: 1; + justify-content: center; + + mat-icon { + font-size: 12px; + display: inline; + vertical-align: middle; + padding-right: 5px; + } +} + +.-trusted { + display: inline; + color: $blue; + font-size: 13px; + vertical-align: middle; +} + +.-text-right { + text-align: right; } -mat-card, h3 { - margin-left: 20px; - margin-right: 20px; +.-pl-0 { + padding-left: 0 !important; } diff --git a/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts b/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts index 5eccc44..c1175d1 100755 --- a/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts @@ -8,7 +8,7 @@ describe('NetworkComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ NetworkComponent ] + declarations: [ NetworkComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/network/network.component.ts b/src/gui/static/src/app/components/pages/settings/network/network.component.ts index 20c9d0e..b2e5a47 100755 --- a/src/gui/static/src/app/components/pages/settings/network/network.component.ts +++ b/src/gui/static/src/app/components/pages/settings/network/network.component.ts @@ -1,20 +1,34 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { NetworkService } from '../../../../services/network.service'; +import { ISubscription } from 'rxjs/Subscription'; @Component({ selector: 'app-network', templateUrl: './network.component.html', - styleUrls: ['./network.component.scss'] + styleUrls: ['./network.component.scss'], }) -export class NetworkComponent implements OnInit { +export class NetworkComponent implements OnInit, OnDestroy { + peers: any; - defaultConnections; + private subscription: ISubscription; constructor( public networkService: NetworkService, ) { } ngOnInit() { - this.networkService.retrieveDefaultConnections().first().subscribe(output => this.defaultConnections = output); + this.networkService.retrieveDefaultConnections().subscribe(trusted => { + this.subscription = this.networkService.automatic().first().subscribe(peers => { + this.peers = peers.map(peer => { + peer.source = trusted.find(p => p.address === peer.address) ? 'default' : 'exchange'; + + return peer; + }).sort((a, b) => a.address.localeCompare(b.address)); + }); + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); } } diff --git a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html index 601abd0..3cb07b9 100755 --- a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html +++ b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html @@ -1,19 +1,34 @@
- + -
-

{{ wallet.label }}

+ - -

{{ address.address }}

- -
-
{{ output.hash }}
-
-
Coins: {{ output.coins | number:'1.0-6' }}
-
Hours: {{ output.calculated_hours | number:'1.0-6' }}
-
+
+
+
+
{{ wallet.label }}
+
{{ 'common.coin-id' | translate }}
+
{{ 'common.coin-hours' | translate }}
+
+
+ +
+
+ + {{ address.address }} +
+
+
+
{{ output.hash }}
+
{{ output.coins | number:'1.0-6' }}
+
{{ output.calculated_hours | number:'1.0-6' }}
+
+
- +
diff --git a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss index 820ef2e..b58dced 100755 --- a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss +++ b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss @@ -1,49 +1,34 @@ @import '../../../../../theme/variables'; -.-wallet { - margin: 40px 20px 0; - - h3 { - font-weight: 400; - } - - .-address { - margin-bottom: 20px; - - h4 { - margin: 0; - - & + .-output { - margin-top: 15px; - } - } - - .-output { - border-top: 1px solid #eee; - padding: 15px 0; - font-size: 14px; +.-text-right { + text-align: right; +} - &:last-child { - padding-bottom: 0; - } +.-grey { + color: $grey; +} - .-hash { - margin-bottom: 10px; - } +.-row.-small { + height: $row-height / 1.5; + line-height: $row-height / 1.5; +} - .-balance { - display: flex; - flex-direction: row; +.-hash { + margin-left: 27px; +} - .-item { - min-width: 150px; - padding-right: 20px; +.-address { + color: $grey; - span { - color: $grey-dark; - } - } - } - } + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; } } + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts index 44e16dc..6f43161 100755 --- a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts @@ -8,7 +8,7 @@ describe('OutputsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ OutputsComponent ] + declarations: [ OutputsComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts index 52dac40..1d59cf9 100755 --- a/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts +++ b/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts @@ -1,38 +1,57 @@ -import { Component } from '@angular/core'; +import { Component, OnDestroy } from '@angular/core'; import { WalletService } from '../../../../services/wallet.service'; import { ActivatedRoute } from '@angular/router'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { QrCodeComponent } from '../../../layout/qr-code/qr-code.component'; @Component({ selector: 'app-outputs', templateUrl: './outputs.component.html', - styleUrls: ['./outputs.component.scss'] + styleUrls: ['./outputs.component.scss'], }) -export class OutputsComponent { +export class OutputsComponent implements OnDestroy { + wallets: any[]|null; - wallets: any[]; + private outputsSubscription: ISubscription; constructor( public walletService: WalletService, private route: ActivatedRoute, + private dialog: MatDialog, ) { route.queryParams.subscribe(params => this.loadData(params)); } + ngOnDestroy() { + this.outputsSubscription.unsubscribe(); + } + loadData(params) { const addr = params['addr']; - this.walletService.outputsWithWallets().subscribe(wallets => { - if (addr) { - wallets = wallets.filter(wallet => { - return wallet.addresses.find(address => address.address === addr); - }).map(wallet => { - wallet.addresses = wallet.addresses.filter(address => address.address === addr); + this.wallets = null; + this.outputsSubscription = this.walletService.outputsWithWallets().subscribe(wallets => { + this.wallets = wallets + .map(wallet => Object.assign({}, wallet)) + .map(wallet => { + wallet.addresses = wallet.addresses.filter(address => { + if (address.outputs.length > 0) { + return addr ? address.address === addr : true; + } + }); return wallet; - }); - } - - this.wallets = wallets; + }) + .filter(wallet => wallet.addresses.length > 0); }); } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config = new MatDialogConfig(); + config.data = { address }; + this.dialog.open(QrCodeComponent, config); + } } diff --git a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html index f364560..ef9f5b5 100755 --- a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html +++ b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html @@ -1,21 +1,26 @@
- + - -
-
Timestamp
-
Amount
-
Transaction ID
-
- -
-
{{ tx.timestamp | dateTime }}
-
{{ tx.amount | number:'1.0-6' }}
-
{{ tx.txid }}
+ + +
+
+
+
{{ 'pending-txs.txid' | translate }}
+
{{ 'common.coin-id' | translate }}
+
{{ 'pending-txs.timestamp' | translate }}
+
+
+
+
{{ tx.txid }}
+
{{ tx.amount | number:'1.0-6' }}
+
{{ tx.timestamp | dateTime }}
+
- -
-
No pending transactions
- +
diff --git a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss index 9452054..1e655ec 100755 --- a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss +++ b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss @@ -1,17 +1,5 @@ -@import '../../../../../theme/_variables.scss'; +@import '../../../../../theme/variables'; -mat-card { - margin: 40px 20px 20px 20px; -} - -.-table { - .-table-header { - font-size: 10px; - color: $grey-dark; - margin-bottom: 20px; - } - - .-table-row:not(:last-child) { - margin-bottom: 10px; - } +.-timestamp { + color: $grey; } diff --git a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts index 381b803..9b19aaa 100755 --- a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts +++ b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts @@ -8,7 +8,7 @@ describe('PendingTransactionsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ PendingTransactionsComponent ] + declarations: [ PendingTransactionsComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts index d0db54b..2103323 100755 --- a/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts +++ b/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts @@ -1,24 +1,54 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { WalletService } from '../../../../services/wallet.service'; import * as moment from 'moment'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; @Component({ selector: 'app-pending-transactions', templateUrl: './pending-transactions.component.html', - styleUrls: ['./pending-transactions.component.scss'] + styleUrls: ['./pending-transactions.component.scss'], }) -export class PendingTransactionsComponent implements OnInit { +export class PendingTransactionsComponent implements OnInit, OnDestroy { + transactions = null; - transactions: any[]; + private transactionsSubscription: ISubscription; + private navbarSubscription: ISubscription; constructor( public walletService: WalletService, + private navbarService: NavBarService, ) { - this.walletService.startDataRefreshSubscription(); + this.navbarSubscription = this.navbarService.activeComponent.subscribe(value => { + this.loadTransactions(value); + }); } ngOnInit() { - this.walletService.pendingTransactions().subscribe(transactions => { + this.navbarService.showSwitch('pending-txs.my', 'pending-txs.all'); + } + + ngOnDestroy() { + this.transactionsSubscription.unsubscribe(); + this.navbarSubscription.unsubscribe(); + this.navbarService.hideSwitch(); + } + + private loadTransactions(value) { + const method = value === DoubleButtonActive.LeftButton ? 'pendingTransactions' : 'allPendingTransactions'; + + this.transactions = null; + + if (this.transactionsSubscription) { + this.transactionsSubscription.unsubscribe(); + } + + if (method === 'pendingTransactions') { + this.walletService.startDataRefreshSubscription(); + } + + this.transactionsSubscription = this.walletService[method]().subscribe(transactions => { this.transactions = this.mapTransactions(transactions); }); } @@ -26,11 +56,14 @@ export class PendingTransactionsComponent implements OnInit { private mapTransactions(transactions) { return transactions.map(transaction => { transaction.transaction.timestamp = moment(transaction.received).unix(); + return transaction.transaction; }) .map(transaction => { - transaction.amount = transaction.outputs.map(output => output.coins >= 0 ? output.coins : 0) - .reduce((a , b) => a + parseInt(b, 10), 0); + transaction.amount = transaction.outputs + .map(output => output.coins >= 0 ? output.coins : 0) + .reduce((a , b) => a + parseFloat(b), 0); + return transaction; }); } diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html index b0f36d3..c5b10af 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html @@ -1,41 +1,11 @@ +
+ {{ 'history.tx-detail' | translate }} +
-
- Transaction Detail -
-
-
- -
-

{{ transaction.balance | number:'1.0-6' }} SLB

-
- +
diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss index 9c9f491..b007799 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss @@ -1,87 +1,21 @@ .-container { - .-header { - background-color: #f7f7f7; - border-top-left-radius: 5px; - border-top-right-radius: 5px; - line-height: 50px; - position: relative; - text-align: center; - - img { - cursor: pointer; - height: 32px; - position: absolute; - right: 9px; - top: 9px; - } - } - - .-body { - background-color: #fbfbfb; - height: 190px; - text-align: center; - - .-icon { - img { - height: 22px; - margin: 55px 0 0 0; - } - - &.-incoming { - -moz-transform: scaleX(-1); - -o-transform: scaleX(-1); - -webkit-transform: scaleX(-1); - transform: scaleX(-1); - filter: FlipH; - -ms-filter: "FlipH"; - } - - &.-pending { - opacity: 0.5; - } - } - - h4 { - color: #1e2227; - font-size: 20px; - font-weight: 700; - line-height: 23px; - margin: 20px 0 0 0; - } - - p { - color: #1e2227; - font-size: 13px; - line-height: 15px; - margin: 5px 0 0 0; - opacity: 0.5; - } - } - - .-footer { - background-color: #f7f7f7; - - .-row { - border-top: 1px solid #eff0f0; - color: #1e2227; - display: flex; - font-size: 12px; - line-height: 14px; - padding: 13px 10px; - - .-key { - opacity: 0.5; - text-align: left; - } - - .-values { - flex: 1; - text-align: right; + padding: 24px; + background-color: #fbfbfb; +} - span { - display: block; - } - } - } +.-header { + background-color: #f7f7f7; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + line-height: 50px; + position: relative; + text-align: center; + + img { + cursor: pointer; + height: 32px; + position: absolute; + right: 9px; + top: 9px; } } diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts index 903bdcf..45138c8 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('TransactionDetailComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TransactionDetailComponent ] + declarations: [ TransactionDetailComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts index 6d8ac0d..60591d8 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts @@ -1,39 +1,19 @@ -import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Transaction } from '../../../../app.datatypes'; -import { PriceService } from '../../../../services/price.service'; -import { Subscription } from 'rxjs/Subscription'; +import { NormalTransaction } from '../../../../app.datatypes'; @Component({ selector: 'app-transaction-detail', templateUrl: './transaction-detail.component.html', - styleUrls: ['./transaction-detail.component.scss'] + styleUrls: ['./transaction-detail.component.scss'], }) -export class TransactionDetailComponent implements OnInit, OnDestroy { - - price: number; - - private priceSubscription: Subscription; - +export class TransactionDetailComponent { constructor( - @Inject(MAT_DIALOG_DATA) public transaction: Transaction, + @Inject(MAT_DIALOG_DATA) public transaction: NormalTransaction, public dialogRef: MatDialogRef, - private priceService: PriceService, ) {} - ngOnInit() { - this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); - } - - ngOnDestroy() { - this.priceSubscription.unsubscribe(); - } - closePopup() { this.dialogRef.close(); } - - showOutput(output) { - return !this.transaction.inputs.find(input => input.owner === output.dst); - } } diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html index 5b02d78..17b8af0 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html @@ -1,23 +1,42 @@ - +
-
+ + +
-

Sent SLB {{ transaction.timestamp * 1000 | date:'short' }}

-

Sending SLB Pending

-

Received SLB {{ transaction.timestamp * 1000 | date:'short' }}

-

Sent SLB Pending

+

+ {{ 'history.sent' | translate }} {{ 'common.coin-id' | translate }} + {{ transaction.timestamp * 1000 | date:'short' }} +

+

+ {{ 'history.sending' | translate }} {{ 'common.coin-id' | translate }} + {{ 'history.pending' | translate }} +

+

+ {{ 'history.received' | translate }} {{ 'common.coin-id' | translate }} + {{ transaction.timestamp * 1000 | date:'short' }} +

+

+ {{ 'history.receiving' | translate }} {{ 'common.coin-id' | translate }} + {{ 'history.pending' | translate }} +

- + {{ address }}
-

{{ transaction.balance | number:'1.0-6' }} SLB

+

{{ transaction.balance | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

+
diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss index c932a70..e00d378 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss @@ -1,4 +1,4 @@ -@import '../../../../theme/_variables.scss'; +@import '../../../../theme/variables'; .-paper { background-color: #fbfbfb; @@ -71,7 +71,7 @@ } .-timestamp { - color: rgba(30, 34, 39, 0.2); + color: $grey; } } @@ -99,7 +99,8 @@ } .-balance { - width: 100px; + width: 200px; + text-align: right; h4 { color: #1e2227; @@ -115,6 +116,10 @@ font-size: 13px; line-height: 15px; margin: 0; + + span { + color: lighten($grey, 40%); + } } } } diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts index a6febab..2b4a9a0 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts @@ -8,7 +8,7 @@ describe('TransactionListComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ TransactionListComponent ] + declarations: [ TransactionListComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts index 315768d..a5ec02a 100755 --- a/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts +++ b/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts @@ -1,22 +1,22 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { WalletService } from '../../../services/wallet.service'; import { PriceService } from '../../../services/price.service'; -import { Subscription } from 'rxjs/Subscription'; +import { ISubscription } from 'rxjs/Subscription'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; import { TransactionDetailComponent } from './transaction-detail/transaction-detail.component'; -import { Transaction } from '../../../app.datatypes'; +import { NormalTransaction } from '../../../app.datatypes'; import { QrCodeComponent } from '../../layout/qr-code/qr-code.component'; @Component({ selector: 'app-transaction-list', templateUrl: './transaction-list.component.html', - styleUrls: ['./transaction-list.component.scss'] + styleUrls: ['./transaction-list.component.scss'], }) export class TransactionListComponent implements OnInit, OnDestroy { - transactions: any[]; + transactions: NormalTransaction[]; private price: number; - private priceSubscription: Subscription; + private priceSubscription: ISubscription; constructor( private dialog: MatDialog, @@ -26,25 +26,25 @@ export class TransactionListComponent implements OnInit, OnDestroy { ngOnInit() { this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); - this.walletService.transactions().subscribe(transactions => this.transactions = transactions); + this.walletService.transactions().first().subscribe(transactions => this.transactions = transactions); } ngOnDestroy() { this.priceSubscription.unsubscribe(); } - showTransaction(transaction: Transaction) { + showTransaction(transaction: NormalTransaction) { const config = new MatDialogConfig(); - config.width = '566px'; + config.width = '800px'; config.data = transaction; this.dialog.open(TransactionDetailComponent, config); } - showQrCode($event: any, address: string) { - $event.stopPropagation(); + showQrCode(event: any, address: string) { + event.stopPropagation(); const config = new MatDialogConfig(); config.data = { address }; - this.dialog.open(QrCodeComponent, config).afterClosed().subscribe(); + this.dialog.open(QrCodeComponent, config); } } diff --git a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html index 8e15612..9953cce 100755 --- a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html +++ b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html @@ -1,16 +1,16 @@ - +
- +
- Cancel + {{ 'wallet.rename.cancel-button' | translate }} - Rename + {{ 'wallet.rename.rename-button' | translate }}
diff --git a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts index 2fed0dc..fae378f 100755 --- a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts +++ b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts @@ -8,7 +8,7 @@ describe('ChangeNameComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ ChangeNameComponent ] + declarations: [ ChangeNameComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts index 23e9b5a..a13ff12 100755 --- a/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts +++ b/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts @@ -8,21 +8,23 @@ import { ButtonComponent } from '../../../layout/button/button.component'; @Component({ selector: 'app-change-name', templateUrl: './change-name.component.html', - styleUrls: ['./change-name.component.css'] + styleUrls: ['./change-name.component.css'], }) export class ChangeNameComponent implements OnInit { @ViewChild('button') button: ButtonComponent; form: FormGroup; constructor( - @Inject(MAT_DIALOG_DATA) private data: Wallet, public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: Wallet, private formBuilder: FormBuilder, private walletService: WalletService, ) {} ngOnInit() { - this.initForm(); + this.form = this.formBuilder.group({ + label: [this.data.label, Validators.required], + }); } closePopup() { @@ -39,10 +41,4 @@ export class ChangeNameComponent implements OnInit { this.walletService.renameWallet(this.data, this.form.value.label) .subscribe(() => this.dialogRef.close(this.form.value.label)); } - - private initForm() { - this.form = this.formBuilder.group({ - label: [this.data.label, Validators.required], - }); - } } diff --git a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html index 459bfa0..b195bc4 100755 --- a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html +++ b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html @@ -1,50 +1,47 @@ - +
- +
-

- Remember this seed! Keep it in a safe place. - If you forget your seed, you will not be able to recover your wallet! -

+

{{ 'wallet.new.seed-warning' | translate }}

- +
- Encrypt Wallet + {{ 'wallet.new.encrypt' | translate }}
-

- We suggest that you encrypt each one of your wallets with a password. - If you forget your password, you can reset it with your seed. - Make sure you have your seed saved somewhere safe before encrypting your wallet. -

+

{{ 'wallet.new.encrypt-warning' | translate }}

- +
- +
@@ -52,10 +49,10 @@
- Cancel + {{ 'wallet.new.cancel-button' | translate }} - {{ data.create ? 'Create' : 'Load' }} + {{ 'wallet.new.' + (data.create ? 'create' : 'load') + '-button' | translate }}
diff --git a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss index 4a266be..550e5d9 100755 --- a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss +++ b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss @@ -29,7 +29,7 @@ label[for=seed] { .divider { padding: 0 5px; - color: $grey-normal; + color: $grey-dark; } } } @@ -50,7 +50,7 @@ label[for=seed] { .-info { margin: 5px 0 15px; - color: $grey-dark; + color: $grey; font-size: 12px; line-height: 1.5; } @@ -89,7 +89,7 @@ label[for=seed] { line-height: normal; font-size: 14px; - color: $grey-normal; + color: $grey-dark; img { width: 38px; diff --git a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts index ef25a4a..4ccb5db 100755 --- a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts +++ b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts @@ -8,7 +8,7 @@ describe('CreateWalletComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ CreateWalletComponent ] + declarations: [ CreateWalletComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts index 44312c4..66897c6 100755 --- a/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts +++ b/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts @@ -4,11 +4,12 @@ import { WalletService } from '../../../../services/wallet.service'; import { MatDialogRef } from '@angular/material/dialog'; import { ButtonComponent } from '../../../layout/button/button.component'; import { MAT_DIALOG_DATA } from '@angular/material'; +import { ApiService } from '../../../../services/api.service'; @Component({ selector: 'app-create-wallet', templateUrl: './create-wallet.component.html', - styleUrls: ['./create-wallet.component.scss'] + styleUrls: ['./create-wallet.component.scss'], }) export class CreateWalletComponent implements OnInit { @ViewChild('createButton') createButton: ButtonComponent; @@ -23,6 +24,7 @@ export class CreateWalletComponent implements OnInit { @Inject(MAT_DIALOG_DATA) public data, public dialogRef: MatDialogRef, private walletService: WalletService, + private apiService: ApiService, ) {} ngOnInit() { @@ -53,7 +55,7 @@ export class CreateWalletComponent implements OnInit { } generateSeed(entropy: number) { - this.walletService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); + this.apiService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); } setEncrypt(event) { diff --git a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html index 640f8a1..b7b608d 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html +++ b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html @@ -1,44 +1,47 @@ - -
-
{{ i + 1 }}
-
- -

- {{ address.address }} Copy -

-
-
{{ (address.hours ? address.hours : 0) | number:'1.0-6' }}
-
- {{ (address.coins ? address.coins : 0) | number:'1.0-6' }} - Outputs -
-
-
-
+
- - New Address + {{ 'wallet.new-address' | translate }}
- - - Hide Empty - - - - Show Empty - + + {{ 'wallet.' + (wallet.hideEmpty ? 'show' : 'hide') + '-empty' | translate }} +
- - {{ wallet.encrypted ? 'Decrypt' : 'Encrypt' }} Wallet + + {{ 'wallet.' + (wallet.encrypted ? 'decrypt' : 'encrypt') | translate }} +
- - Edit Wallet + {{ 'wallet.edit' | translate }}
+ + +
+
{{ i + 1 }}
+
+ + + {{ address.address }} + + {{ 'wallet.address.copy' | translate }} + + +
+
{{ (address.coins ? address.coins : 0) | number:'1.0-6' }}
+
{{ (address.hours ? address.hours : 0) | number:'1.0-6' }}
+
+ more_vert + + + + +
+
+
diff --git a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss index 3c67da6..5700043 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss +++ b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss @@ -1,164 +1,171 @@ -@import '../../../../../theme/_variables.scss'; +@import '../../../../../theme/variables'; -.-record { - background-color: $white; - border-bottom: 1px solid #eff0f0; - cursor: pointer; - display: flex; - font-size: $font-size-standard; - line-height: $row-height; - min-height: $row-height; - padding: 0 50px 0 20px; - - .id-column { - width: 50px; - color: rgba(30, 34, 39, 0.6); - } +.-row.-detail { + background-color: darken($white, 2%); +} - .address-column { - color: rgba(30, 34, 39, 0.6); - flex: 1 1 auto; +.-grey { + color: $grey; +} - img { - display: inline-block; - height: 17px; - vertical-align: middle; - width: 17px; - } +.-address { + padding-left: 0 !important; - p { - display: inline-block; - line-height: $row-height; - margin: 0; - vertical-align: middle; - } + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; + } + + > span { + display: inline-block; + line-height: $row-height; + cursor: pointer; &:hover .copy-label { - display: inline-block; + opacity: 1; } } +} - .hours-column { - color: rgba(30, 34, 39, 0.5); - width: 150px; - } +.-text-right { + text-align: right; +} - .coins-column { - color: black; - width: 150px; +.-options { + text-align: center; + + mat-icon { + color: lighten($grey, 30%); + cursor: pointer; + vertical-align: middle; &:hover { - .outputs-label { - display: inline-block; - } + color: $blue; } } - - > img { - display: inline-block; - margin: ($row-height - $row-detail-size) / 2; - margin-left: 0; - height: $row-detail-size; - width: $row-detail-size; - } } .-actions { + background-color: #fefefe; border-bottom: 1px solid #eff0f0; display: flex; width: 100%; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03) !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + z-index: 100; + position: relative; .-button { - cursor: pointer; - padding: 0 20px; + padding-right: 20px; - img { - display: inline-block; - float: left; - height: 60px; - padding: 14px 0; - width: 32px; + &:first-child { + padding-left: 5px; } span { color: #CECFD0; - display: inline-block; font-size: 12px; height: 60px; - line-height: 60px; margin: 0 5px; - } - } -} + cursor: pointer; + display: flex; + align-items: center; + &.-img::before { + content: ''; + display: inline-block; + height: 32px; + width: 32px; + margin-right: 5px; + background-repeat: no-repeat; + background-size: 32px 32px; + } -@keyframes floatup { - 20% { - opacity: .999 - } + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } - 100% { - -webkit-transform: translate3d(-50%, -17px, 0); - transform: translate3d(-50%, -17px, 0) + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-grey.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-grey.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-grey.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-grey.png); + } + + &:hover { + color: $grey; + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-red.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-gold.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-gold.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-blue.png); + } + } + } } } -@-webkit-keyframes floatup { - 20% { - opacity: .999 +@keyframes floatup { + 50% { + opacity: 1; } 100% { - -webkit-transform: translate3d(-50%, -17px, 0); - transform: translate3d(-50%, -17px, 0) + transform: translateY(-20px); + opacity: 0; } } -.click-to-copy { - cursor: pointer; -} - - .copy-label { - color: #0072ff; - display: none; + color: $blue; + opacity: 0; font-size: 12px; - line-height: 100%; position: relative; - opacity: .999; - transition: opacity .2s ease-in-out; - top: -1px; padding-left: 10px; - &.hidden{ - opacity: .001; - } - &::after { content: attr(data-label); - color: #0072ff; - display: inline-block; position: absolute; - top: -2px; - left: 50%; - opacity: .001; - text-align: center; - -webkit-transform: translate3d(-50%,0,0); - transform: translate3d(-50%,0,0); - -webkit-backface-visibility: hidden; - white-space: nowrap; - padding-left: 11px; + top: 0; + left: 4px; + opacity: 0; + line-height: 1; } } .copying .copy-label::after { - -webkit-animation: floatup .5s ease-in-out; animation: floatup .5s ease-in-out; } - -.outputs-label { - color: #0072ff; - display: none; - font-size: 12px; - padding-left: 10px; -} diff --git a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts index 7c6a1cb..32c805e 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts +++ b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts @@ -8,7 +8,7 @@ describe('WalletDetailComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ WalletDetailComponent ] + declarations: [ WalletDetailComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts index 8995509..2864b2a 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts +++ b/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts @@ -1,27 +1,37 @@ -import { Component, Input, OnDestroy } from '@angular/core'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Wallet } from '../../../../app.datatypes'; import { WalletService } from '../../../../services/wallet.service'; import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; import { ChangeNameComponent } from '../change-name/change-name.component'; import { QrCodeComponent } from '../../../layout/qr-code/qr-code.component'; import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; -import { MatSnackBar, MatSnackBarConfig } from '@angular/material'; -import { parseResponseMessage } from '../../../../utils/index'; +import { MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-wallet-detail', templateUrl: './wallet-detail.component.html', - styleUrls: ['./wallet-detail.component.scss'] + styleUrls: ['./wallet-detail.component.scss'], }) -export class WalletDetailComponent implements OnDestroy { +export class WalletDetailComponent implements OnInit, OnDestroy { @Input() wallet: Wallet; + private encryptionWarning: string; + constructor( private dialog: MatDialog, private walletService: WalletService, private snackbar: MatSnackBar, + private translateService: TranslateService, ) { } + ngOnInit() { + this.translateService.get('wallet.new.encrypt-warning').subscribe(msg => { + this.encryptionWarning = msg; + }); + } + ngOnDestroy() { this.snackbar.dismiss(); } @@ -43,11 +53,7 @@ export class WalletDetailComponent implements OnDestroy { .subscribe(() => passwordDialog.close(), () => passwordDialog.error()); }); } else { - this.walletService.addAddress(this.wallet).subscribe(null, err => { - const config = new MatSnackBarConfig(); - config.duration = 300000; - this.snackbar.open(parseResponseMessage(err['_body']), null, config); - }); + this.walletService.addAddress(this.wallet).subscribe(null, err => showSnackbarError(this.snackbar, err)); } } @@ -59,13 +65,11 @@ export class WalletDetailComponent implements OnDestroy { const config = new MatDialogConfig(); config.data = { confirm: !this.wallet.encrypted, - title: this.wallet.encrypted ? 'Decrypt Wallet' : 'Encrypt Wallet', + title: this.wallet.encrypted ? 'wallet.decrypt' : 'wallet.encrypt', }; if (!this.wallet.encrypted) { - config.data['description'] = 'We suggest that you encrypt each one of your wallets with a password. ' + - 'If you forget your password, you can reset it with your seed. ' + - 'Make sure you have your seed saved somewhere safe before encrypting your wallet.'; + config.data['description'] = this.encryptionWarning; } this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit @@ -76,7 +80,13 @@ export class WalletDetailComponent implements OnDestroy { }); } - copyAddress(address) { + copyAddress(event, address, duration = 500) { + event.stopPropagation(); + + if (address.copying) { + return; + } + const selBox = document.createElement('textarea'); selBox.style.position = 'fixed'; @@ -94,10 +104,9 @@ export class WalletDetailComponent implements OnDestroy { address.copying = true; - // wait for a while and then remove the 'copying' class - setTimeout(function () { + setTimeout(function() { address.copying = false; - }, 500); + }, duration); } showQrCode(event, address: string) { @@ -105,6 +114,6 @@ export class WalletDetailComponent implements OnDestroy { const config = new MatDialogConfig(); config.data = { address }; - this.dialog.open(QrCodeComponent, config).afterClosed().subscribe(); + this.dialog.open(QrCodeComponent, config); } } diff --git a/src/gui/static/src/app/components/pages/wallets/wallets.component.html b/src/gui/static/src/app/components/pages/wallets/wallets.component.html index e9f48e9..b25b49e 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallets.component.html +++ b/src/gui/static/src/app/components/pages/wallets/wallets.component.html @@ -1,36 +1,46 @@
- + +
-
-
Wallet
-
Encryption
-
SLB Hours
-
Balance
+
+
+
{{ 'wallet.wallet' | translate }}
+
+
{{ 'common.coin-id' | translate }}
+
{{ 'common.coin-hours' | translate }}
+
+
-
- -
-
{{ wallet.label }}
-
- - + +
+
+
+
{{ wallet.label }}
+
+ + +
+
{{ (wallet.coins ? wallet.coins : 0) | number:'1.0-6' }}
+
{{ (wallet.hours ? wallet.hours : 0) | number:'1.0-6' }}
+
+
-
{{ (wallet.hours ? wallet.hours : 0) | number:'1.0-6' }}
-
{{ (wallet.coins ? wallet.coins : 0) | number:'1.0-6' }}
- -
-
-
- + +
+
diff --git a/src/gui/static/src/app/components/pages/wallets/wallets.component.scss b/src/gui/static/src/app/components/pages/wallets/wallets.component.scss index 6fc5f43..46277f4 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallets.component.scss +++ b/src/gui/static/src/app/components/pages/wallets/wallets.component.scss @@ -1,83 +1,45 @@ -@import '../../../../theme/_variables.scss'; +@import '../../../../theme/variables'; -.-width-150 { - width: 150px; -} - -.-width-250 { - width: 250px; -} - -.-headers { - color: rgba(30, 34, 39, 0.2); - display: flex; - font-size: 12px; - font-weight: 700; - height: 50px; - line-height: 50px; - padding: 0 80px 0 50px; -} - -.-wallets { - border-radius: 15px; - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); - margin: 0 30px; -} - -.-wallet { - background-color: $white; - border-bottom: 1px solid #eff0f0; - cursor: pointer; - display: flex; - font-size: $font-size-standard; - line-height: $row-height; - height: $row-height; - padding-left: 20px; +.-table { + margin-bottom: 10px; &:first-child { - border-top-left-radius: 15px; - border-top-right-radius: 15px; + margin-bottom: 0; } - &:last-child { - border-bottom-left-radius: 15px; - border-bottom-right-radius: 15px; + .-row { + border-color: #f6f6f6; } +} - .label { - color: black; - font-weight: 700; - } +.-pointer { + cursor: pointer; +} - .hours { - color: rgba(30, 34, 39, 0.5); - } +.-text-right { + text-align: right; +} - .coins { - color: black; - } +.-grey { + color: $grey; +} - .-encryption img { - border-radius: 50%; - background-color: #f7f7f7; - display: inline-block; - height: 38px; - margin: 11px 0; - padding: 3px; - width: 38px; - } +.-expand img { + width: 30px; + vertical-align: middle; +} - > img { - display: inline-block; - margin: ($row-height - $row-detail-size) / 2; - margin-left: 0; - height: $row-detail-size; - width: $row-detail-size; - } +.-encryption img { + border-radius: 50%; + background-color: #f7f7f7; + width: 30px; + vertical-align: middle; } -.-wallet-detail { - background-color: $white; +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } .action-buttons { @@ -86,10 +48,10 @@ text-align: center; button { - background-color: $grey-light; + background-color: $grey-lightest; border: none; box-shadow: none; - color: $grey-dark; + color: $grey; font-size: 13px; margin: 0 5px; min-width: 140px; @@ -101,8 +63,3 @@ } } } - -span { - display: inline-block; - width: 50%; -} diff --git a/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts b/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts index cb50258..07abc90 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts +++ b/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts @@ -8,7 +8,7 @@ describe('WalletsComponent', () => { beforeEach(async(() => { TestBed.configureTestingModule({ - declarations: [ WalletsComponent ] + declarations: [ WalletsComponent ], }) .compileComponents(); })); diff --git a/src/gui/static/src/app/components/pages/wallets/wallets.component.ts b/src/gui/static/src/app/components/pages/wallets/wallets.component.ts index 8126e36..544a68e 100755 --- a/src/gui/static/src/app/components/pages/wallets/wallets.component.ts +++ b/src/gui/static/src/app/components/pages/wallets/wallets.component.ts @@ -7,10 +7,9 @@ import { Wallet } from '../../../app.datatypes'; @Component({ selector: 'app-wallets', templateUrl: './wallets.component.html', - styleUrls: ['./wallets.component.scss'] + styleUrls: ['./wallets.component.scss'], }) export class WalletsComponent { - constructor( public walletService: WalletService, private dialog: MatDialog, diff --git a/src/gui/static/src/app/directives/dontsavepassword.directive.ts b/src/gui/static/src/app/directives/dontsavepassword.directive.ts index 6e6dcca..3fc5880 100755 --- a/src/gui/static/src/app/directives/dontsavepassword.directive.ts +++ b/src/gui/static/src/app/directives/dontsavepassword.directive.ts @@ -1,11 +1,12 @@ import { Directive, ElementRef, HostListener } from '@angular/core'; @Directive({ - selector: '[appDontSavePassword]' + selector: '[appDontSavePassword]', }) export class DontsavepasswordDirective { - - constructor(private el: ElementRef) { + constructor( + private el: ElementRef, + ) { el.nativeElement.autocomplete = 'new-password'; el.nativeElement.readOnly = true; } @@ -13,5 +14,4 @@ export class DontsavepasswordDirective { @HostListener('focus') onFocus() { this.el.nativeElement.readOnly = false; } - } diff --git a/src/gui/static/src/app/models/connection.model.ts b/src/gui/static/src/app/models/connection.model.ts deleted file mode 100755 index 3c55fef..0000000 --- a/src/gui/static/src/app/models/connection.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ConnectionModel { - id: any[]; - address: number; - listen_port: boolean; -} diff --git a/src/gui/static/src/app/pipes/date-from-now.pipe.ts b/src/gui/static/src/app/pipes/date-from-now.pipe.ts index 691fba0..40b93a7 100755 --- a/src/gui/static/src/app/pipes/date-from-now.pipe.ts +++ b/src/gui/static/src/app/pipes/date-from-now.pipe.ts @@ -2,12 +2,10 @@ import { Pipe, PipeTransform } from '@angular/core'; import * as moment from 'moment'; @Pipe({ - name: 'dateFromNow' + name: 'dateFromNow', }) export class DateFromNowPipe implements PipeTransform { - transform(value: any) { return moment.unix(value).fromNow(); } - } diff --git a/src/gui/static/src/app/pipes/date-time.pipe.ts b/src/gui/static/src/app/pipes/date-time.pipe.ts index 429e3d1..2c2b355 100755 --- a/src/gui/static/src/app/pipes/date-time.pipe.ts +++ b/src/gui/static/src/app/pipes/date-time.pipe.ts @@ -2,10 +2,9 @@ import { Pipe, PipeTransform } from '@angular/core'; import * as moment from 'moment'; @Pipe({ - name: 'dateTime' + name: 'dateTime', }) export class DateTimePipe implements PipeTransform { - transform(value: any) { return moment.unix(value).format('YYYY-MM-DD HH:mm'); } diff --git a/src/gui/static/src/app/pipes/teller-status.pipe.ts b/src/gui/static/src/app/pipes/teller-status.pipe.ts index 1ecfe52..27bcfdb 100755 --- a/src/gui/static/src/app/pipes/teller-status.pipe.ts +++ b/src/gui/static/src/app/pipes/teller-status.pipe.ts @@ -1,22 +1,14 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ - name: 'tellerStatus' + name: 'tellerStatus', }) export class TellerStatusPipe implements PipeTransform { + private statuses = ['done', 'waiting_confirm', 'waiting_deposit', 'waiting_send']; transform(value: any): any { - switch (value) { - case 'done': - return 'Completed'; - case 'waiting_confirm': - return 'Waiting for confirmation'; - case 'waiting_deposit': - return 'Waiting for Bitcoin deposit'; - case 'waiting_send': - return 'Waiting to send Skycoin'; - default: - return 'Unknown'; - } + return this.statuses.find(status => status === value) + ? 'teller.' + value.replace('_', '-') + : 'teller.unknown'; } } diff --git a/src/gui/static/src/app/pipes/transactions-amount.pipe.spec.ts b/src/gui/static/src/app/pipes/transactions-amount.pipe.spec.ts deleted file mode 100755 index c2ff499..0000000 --- a/src/gui/static/src/app/pipes/transactions-amount.pipe.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TransactionsAmountPipe } from './transactions-amount.pipe'; - -describe('TransactionsAmountPipe', () => { - it('create an instance', () => { - const pipe = new TransactionsAmountPipe(); - expect(pipe).toBeTruthy(); - }); -}); diff --git a/src/gui/static/src/app/pipes/transactions-amount.pipe.ts b/src/gui/static/src/app/pipes/transactions-amount.pipe.ts deleted file mode 100755 index 120017e..0000000 --- a/src/gui/static/src/app/pipes/transactions-amount.pipe.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'transactionsAmount' -}) -export class TransactionsAmountPipe implements PipeTransform { - - transform(value: any): any { - return value.reduce((a, b) => a + b.outputs.reduce((c, d) => c + parseInt(d.coins, 10), 0), 0); - } -} diff --git a/src/gui/static/src/app/services/api.service.spec.ts b/src/gui/static/src/app/services/api.service.spec.ts index 65b6c71..9d17c0f 100755 --- a/src/gui/static/src/app/services/api.service.spec.ts +++ b/src/gui/static/src/app/services/api.service.spec.ts @@ -5,7 +5,7 @@ import { ApiService } from './api.service'; describe('ApiService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ApiService] + providers: [ApiService], }); }); diff --git a/src/gui/static/src/app/services/api.service.ts b/src/gui/static/src/app/services/api.service.ts index 7dbe7fb..4e833fc 100755 --- a/src/gui/static/src/app/services/api.service.ts +++ b/src/gui/static/src/app/services/api.service.ts @@ -6,20 +6,19 @@ import 'rxjs/add/observable/throw'; import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; import { - Address, GetWalletsResponseEntry, GetWalletsResponseWallet, PostWalletNewAddressResponse, Transaction, Version, - Wallet + Address, GetWalletsResponseEntry, GetWalletsResponseWallet, NormalTransaction, + PostWalletNewAddressResponse, Version, Wallet, } from '../app.datatypes'; @Injectable() export class ApiService { - private url = environment.nodeUrl; constructor( private http: Http, ) { } - getExplorerAddress(address: Address): Observable { + getExplorerAddress(address: Address): Observable { return this.get('explorer/address', {address: address.address}) .map(transactions => transactions.map(transaction => ({ addresses: [], @@ -37,9 +36,8 @@ export class ApiService { return this.get('version'); } - getWalletNewSeed(entropy: number = 128): Observable { - return this.get('wallet/newSeed', { entropy }) - .map(response => response.seed); + generateSeed(entropy: number = 128): Observable { + return this.get('wallet/newSeed', { entropy }).map(response => response.seed); } getWallets(): Observable { @@ -47,7 +45,7 @@ export class ApiService { .map((response: GetWalletsResponseWallet[]) => { const wallets: Wallet[] = []; response.forEach(wallet => { - wallets.push({ + wallets.push( { label: wallet.meta.label, filename: wallet.meta.filename, coins: null, @@ -62,6 +60,7 @@ export class ApiService { encrypted: wallet.meta.encrypted, }); }); + return wallets; }); } @@ -112,10 +111,11 @@ export class ApiService { post(url, params = {}, options: any = {}) { return this.getCsrf().first().flatMap(csrf => { options.csrf = csrf; + return this.http.post( this.getUrl(url), options.json ? JSON.stringify(params) : this.getQueryString(params), - this.returnRequestOptions(options) + this.returnRequestOptions(options), ) .map((res: any) => res.json()) .catch((error: any) => Observable.throw(error || 'Server error')); @@ -137,6 +137,7 @@ export class ApiService { private getHeaders(options) { const headers = new Headers(); headers.append('Content-Type', options.json ? 'application/json' : 'application/x-www-form-urlencoded'); + return headers; } @@ -147,6 +148,7 @@ export class ApiService { return Object.keys(parameters).reduce((array, key) => { array.push(key + '=' + encodeURIComponent(parameters[key])); + return array; }, []).join('&'); } diff --git a/src/gui/static/src/app/services/app.service.spec.ts b/src/gui/static/src/app/services/app.service.spec.ts index 741d9d2..dad1f42 100755 --- a/src/gui/static/src/app/services/app.service.spec.ts +++ b/src/gui/static/src/app/services/app.service.spec.ts @@ -5,7 +5,7 @@ import { AppService } from './app.service'; describe('AppService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [AppService] + providers: [AppService], }); }); diff --git a/src/gui/static/src/app/services/app.service.ts b/src/gui/static/src/app/services/app.service.ts index 839f36d..d97a667 100755 --- a/src/gui/static/src/app/services/app.service.ts +++ b/src/gui/static/src/app/services/app.service.ts @@ -1,18 +1,17 @@ -import { Injectable } from '@angular/core'; +import { Injectable, NgZone } from '@angular/core'; import { ApiService } from './api.service'; import { Observable } from 'rxjs/Observable'; import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; -import { ConnectionModel } from '../models/connection.model'; -import { Version } from '../app.datatypes'; +import { Connection, Version } from '../app.datatypes'; @Injectable() export class AppService { - error: number; version: Version; constructor( private apiService: ApiService, + private ngZone: NgZone, ) { this.monitorConnections(); } @@ -22,28 +21,32 @@ export class AppService { version => { this.version = version; this.apiService.getCsrf().subscribe(null, () => this.error = 3); - }, () => this.error = 2 + }, () => this.error = 2, ); } private monitorConnections() { this.retrieveConnections().subscribe(connections => this.setConnectionError(connections)); - IntervalObservable - .create(1500) - .flatMap(() => this.retrieveConnections()) - .subscribe(connections => this.setConnectionError(connections)); + this.ngZone.runOutsideAngular(() => { + IntervalObservable + .create(1500) + .flatMap(() => this.retrieveConnections()) + .subscribe(connections => this.ngZone.run(() => { + this.setConnectionError(connections); + })); + }); } - private retrieveConnections(): Observable { + private retrieveConnections(): Observable { return this.apiService.get('network/connections'); } private setConnectionError(response: any) { - if (response.connections.length === 0) { + if (response.connections === null || response.connections.length === 0) { this.error = 1; } - if (response.connections.length > 0 && this.error === 1) { + if (response.connections !== null && response.connections.length > 0 && this.error === 1) { this.error = null; } } diff --git a/src/gui/static/src/app/services/blockchain.service.spec.ts b/src/gui/static/src/app/services/blockchain.service.spec.ts index 55dca80..12065ef 100755 --- a/src/gui/static/src/app/services/blockchain.service.spec.ts +++ b/src/gui/static/src/app/services/blockchain.service.spec.ts @@ -5,7 +5,7 @@ import { BlockchainService } from './blockchain.service'; describe('BlockchainService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [BlockchainService] + providers: [BlockchainService], }); }); diff --git a/src/gui/static/src/app/services/blockchain.service.ts b/src/gui/static/src/app/services/blockchain.service.ts index b8bd49e..64a239a 100755 --- a/src/gui/static/src/app/services/blockchain.service.ts +++ b/src/gui/static/src/app/services/blockchain.service.ts @@ -1,15 +1,13 @@ -import { Injectable } from '@angular/core'; +import { Injectable, NgZone } from '@angular/core'; import { ApiService } from './api.service'; import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; -import { TellerConfig } from '../app.datatypes'; import { WalletService } from './wallet.service'; import 'rxjs/add/observable/timer'; @Injectable() export class BlockchainService { - private progressSubject: Subject = new BehaviorSubject(null); private refreshedBalance = false; @@ -20,30 +18,25 @@ export class BlockchainService { constructor( private apiService: ApiService, private walletService: WalletService, + private ngZone: NgZone, ) { - Observable.timer(0, 2000) - .flatMap(() => this.getBlockchainProgress()) - .takeWhile((response: any) => !response.current || response.current !== response.highest) - .subscribe( - response => { - this.progressSubject.next(response); - - if (! this.refreshedBalance) { - this.walletService.refreshBalances(); - this.refreshedBalance = true; - } - }, - error => console.log(error), - () => this.completeLoading() - ); - } + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 2000) + .flatMap(() => this.getBlockchainProgress()) + .takeWhile((response: any) => !response.current || response.current !== response.highest) + .subscribe( + response => this.ngZone.run(() => { + this.progressSubject.next(response); - addressTransactions(id): Observable { - return this.apiService.get('explorer/address', { address: id }); - } - - addressBalance(id): Observable { - return this.apiService.get('outputs', { addrs: id }); + if (!this.refreshedBalance) { + this.walletService.refreshBalances(); + this.refreshedBalance = true; + } + }), + error => console.log(error), + () => this.ngZone.run(() => this.completeLoading()), + ); + }); } block(id): Observable { @@ -52,14 +45,17 @@ export class BlockchainService { if (transaction.inputs && !transaction.inputs.length) { return Observable.of(transaction); } + return Observable.forkJoin(transaction.inputs.map(input => this.retrieveInputAddress(input).map(response => { return response.owner_address; }))).map(inputs => { transaction.inputs = inputs; + return transaction; }); })).map(transactions => { block.body.txns = transactions; + return block; }); }); @@ -77,6 +73,10 @@ export class BlockchainService { return this.apiService.get('blockchain/progress'); } + coinSupply() { + return this.apiService.get('coinSupply'); + } + private completeLoading() { this.progressSubject.next({ current: 999999999999, highest: 999999999999 }); this.walletService.refreshBalances(); diff --git a/src/gui/static/src/app/services/nav-bar.service.spec.ts b/src/gui/static/src/app/services/nav-bar.service.spec.ts new file mode 100755 index 0000000..f7c5861 --- /dev/null +++ b/src/gui/static/src/app/services/nav-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NavBarService } from './nav-bar.service'; + +describe('NavBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NavBarService], + }); + }); + + it('should be created', inject([NavBarService], (service: NavBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/gui/static/src/app/services/nav-bar.service.ts b/src/gui/static/src/app/services/nav-bar.service.ts new file mode 100755 index 0000000..2f17fe9 --- /dev/null +++ b/src/gui/static/src/app/services/nav-bar.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; + +@Injectable() +export class NavBarService { + switchVisible = false; + activeComponent = new BehaviorSubject(1); + leftText: string; + rightText: string; + + setActiveComponent(value) { + this.activeComponent.next(value); + } + + showSwitch(leftText, rightText) { + this.switchVisible = true; + this.leftText = leftText; + this.rightText = rightText; + } + + hideSwitch() { + this.switchVisible = false; + } +} diff --git a/src/gui/static/src/app/services/network.service.spec.ts b/src/gui/static/src/app/services/network.service.spec.ts index 9007a9b..dc00e8a 100755 --- a/src/gui/static/src/app/services/network.service.spec.ts +++ b/src/gui/static/src/app/services/network.service.spec.ts @@ -5,7 +5,7 @@ import { NetworkService } from './network.service'; describe('NetworkService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [NetworkService] + providers: [NetworkService], }); }); diff --git a/src/gui/static/src/app/services/network.service.ts b/src/gui/static/src/app/services/network.service.ts index e4042e1..ebb7c98 100755 --- a/src/gui/static/src/app/services/network.service.ts +++ b/src/gui/static/src/app/services/network.service.ts @@ -2,15 +2,14 @@ import { Injectable } from '@angular/core'; import { ApiService } from './api.service'; import { Subject } from 'rxjs/Subject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; -import { ConnectionModel } from '../models/connection.model'; import { Observable } from 'rxjs/Observable'; import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; import 'rxjs/add/operator/mergeMap'; +import { Connection } from '../app.datatypes'; @Injectable() export class NetworkService { - - private automaticPeers: Subject = new BehaviorSubject([]); + private automaticPeers: Subject = new BehaviorSubject([]); constructor( private apiService: ApiService, @@ -18,11 +17,11 @@ export class NetworkService { this.loadData(); } - automatic(): Observable { + automatic(): Observable { return this.automaticPeers.asObservable(); } - retrieveDefaultConnections(): Observable { + retrieveDefaultConnections(): Observable { return this.apiService.get('network/defaultConnections') .map(output => output.map((address, index) => ({ id: index + 1, @@ -39,7 +38,7 @@ export class NetworkService { .subscribe(connections => this.automaticPeers.next(connections)); } - private retrieveConnections(): Observable { + private retrieveConnections(): Observable { return this.apiService.get('network/connections') .map(response => response.connections.sort((a, b) => a.id - b.id)); } diff --git a/src/gui/static/src/app/services/price.service.spec.ts b/src/gui/static/src/app/services/price.service.spec.ts index fe373bc..8810350 100755 --- a/src/gui/static/src/app/services/price.service.spec.ts +++ b/src/gui/static/src/app/services/price.service.spec.ts @@ -5,7 +5,7 @@ import { PriceService } from './price.service'; describe('PriceService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [PriceService] + providers: [PriceService], }); }); diff --git a/src/gui/static/src/app/services/price.service.ts b/src/gui/static/src/app/services/price.service.ts index 4e9ce86..61e36b4 100755 --- a/src/gui/static/src/app/services/price.service.ts +++ b/src/gui/static/src/app/services/price.service.ts @@ -1,19 +1,27 @@ -import { Injectable } from '@angular/core'; +import { Injectable, NgZone } from '@angular/core'; import { Http } from '@angular/http'; import { Subject } from 'rxjs/Subject'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; @Injectable() export class PriceService { + readonly CMC_TICKER_ID = 1619; price: Subject = new BehaviorSubject(null); constructor( private http: Http, + private ngZone: NgZone, ) { - this.http.get('https://api.coinmarketcap.com/v1/ticker/skycoin/') - .map(response => response.json()[0]) - .subscribe(data => this.price.next(data.price_usd)); + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 10 * 60 * 1000).subscribe(() => { + this.http.get(`https://api.coinmarketcap.com/v2/ticker/${this.CMC_TICKER_ID}/`) + .map(response => response.json()) + .subscribe(response => this.ngZone.run(() => { + this.price.next(response.data.quotes.USD.price); + })); + }); + }); } - } diff --git a/src/gui/static/src/app/services/purchase.service.spec.ts b/src/gui/static/src/app/services/purchase.service.spec.ts index 3b69a6a..b69d48a 100755 --- a/src/gui/static/src/app/services/purchase.service.spec.ts +++ b/src/gui/static/src/app/services/purchase.service.spec.ts @@ -5,7 +5,7 @@ import { PurchaseService } from './purchase.service'; describe('PurchaseService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [PurchaseService] + providers: [PurchaseService], }); }); diff --git a/src/gui/static/src/app/services/purchase.service.ts b/src/gui/static/src/app/services/purchase.service.ts index c7d85e1..17420f3 100755 --- a/src/gui/static/src/app/services/purchase.service.ts +++ b/src/gui/static/src/app/services/purchase.service.ts @@ -9,7 +9,6 @@ import { Observable } from 'rxjs/Observable'; @Injectable() export class PurchaseService { - private configSubject: Subject = new BehaviorSubject(null); private purchaseOrders: Subject = new BehaviorSubject([]); private purchaseUrl = environment.tellerUrl; @@ -57,6 +56,7 @@ export class PurchaseService { if (!response.statuses || response.statuses.length > 1) { throw new Error('too many purchase orders found'); } + return response.statuses[0]; }); } @@ -68,5 +68,4 @@ export class PurchaseService { private post(url, parameters = {}): any { return this.httpClient.post(this.purchaseUrl + url, parameters); } - } diff --git a/src/gui/static/src/app/services/wallet.service.spec.ts b/src/gui/static/src/app/services/wallet.service.spec.ts index 5837f9a..d111e25 100755 --- a/src/gui/static/src/app/services/wallet.service.spec.ts +++ b/src/gui/static/src/app/services/wallet.service.spec.ts @@ -5,7 +5,7 @@ import { WalletService } from './wallet.service'; describe('WalletService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [WalletService] + providers: [WalletService], }); }); diff --git a/src/gui/static/src/app/services/wallet.service.ts b/src/gui/static/src/app/services/wallet.service.ts index a3cb376..23c83dd 100755 --- a/src/gui/static/src/app/services/wallet.service.ts +++ b/src/gui/static/src/app/services/wallet.service.ts @@ -1,8 +1,7 @@ -import { Injectable } from '@angular/core'; +import { Injectable, NgZone } from '@angular/core'; import { ApiService } from './api.service'; import { Subject } from 'rxjs/Subject'; import { Observable } from 'rxjs/Observable'; -import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; import 'rxjs/add/observable/forkJoin'; import 'rxjs/add/observable/of'; import 'rxjs/add/operator/do'; @@ -11,7 +10,7 @@ import 'rxjs/add/operator/first'; import 'rxjs/add/operator/mergeMap'; import 'rxjs/add/observable/timer'; import 'rxjs/add/observable/zip'; -import { Address, Wallet } from '../app.datatypes'; +import { Address, NormalTransaction, PreviewTransaction, Wallet } from '../app.datatypes'; import { ReplaySubject } from 'rxjs/ReplaySubject'; import { Subscription } from 'rxjs/Subscription'; @@ -23,10 +22,10 @@ export class WalletService { dataRefreshSubscription: Subscription; constructor( - private apiService: ApiService + private apiService: ApiService, + private ngZone: NgZone, ) { this.loadData(); - this.startDataRefreshSubscription(); } @@ -51,7 +50,7 @@ export class WalletService { } create(label, seed, scan, password) { - seed = seed.replace(/\r?\n|\r/g, ' ').replace(/ +/g, ' ').trim(); + seed = seed.replace(/(\n|\r\n)$/, ''); return this.apiService.postWalletCreate(label ? label : 'undefined', seed, scan ? scan : 100, password) .do(wallet => { @@ -64,29 +63,20 @@ export class WalletService { }); } - find(filename: string): Observable { - return this.all().map(wallets => wallets.find(wallet => wallet.filename === filename)); - } - folder(): Observable { return this.apiService.get('wallets/folderName').map(response => response.address); } - generateSeed(entropy: number = 128): Observable { - return this.apiService.getWalletNewSeed(entropy); - } - outputs(): Observable { return this.addressesAsString() + .first() .filter(addresses => !!addresses) .flatMap(addresses => this.apiService.get('outputs', {addrs: addresses})); } outputsWithWallets(): Observable { return Observable.zip(this.all(), this.outputs(), (wallets, outputs) => { - wallets = JSON.parse(JSON.stringify(wallets)); - - return !wallets ? [] : wallets.map(wallet => { + return wallets.map(wallet => { wallet.addresses = wallet.addresses.map(address => { address.outputs = outputs.head_outputs.filter(output => output.address === address.address); @@ -99,7 +89,7 @@ export class WalletService { } allPendingTransactions(): Observable { - return this.apiService.get('pendingTxs'); + return Observable.timer(0, 10000).flatMap(() => this.apiService.get('pendingTxs')); } pendingTransactions(): Observable { @@ -109,9 +99,12 @@ export class WalletService { refreshBalances() { this.wallets.first().subscribe(wallets => { Observable.forkJoin(wallets.map(wallet => this.retrieveWalletBalance(wallet).map(response => { - wallet.addresses = response; - wallet.coins = response.map(address => address.coins >= 0 ? address.coins : 0).reduce((a , b) => a + b, 0); - wallet.hours = response.map(address => address.hours >= 0 ? address.hours : 0).reduce((a , b) => a + b, 0); + wallet.coins = response.coins; + wallet.hours = response.hours; + wallet.addresses = wallet.addresses.map(address => { + return response.addresses.find(addr => addr.address === address.address); + }); + return wallet; }))) .subscribe(newWallets => this.wallets.next(newWallets)); @@ -138,80 +131,98 @@ export class WalletService { return this.apiService.getWalletSeed(wallet, password); } - createTransaction(wallet: Wallet, address: string, amount: string, password: string|null) { + createTransaction(wallet: Wallet, addresses: string[]|null, destinations: any[], hoursSelection: any, changeAddress: string|null, password: string|null): Observable { return this.apiService.post( 'wallet/transaction', { - hours_selection: { - type: 'auto', - mode: 'share', - share_factor: '0.5', - }, - change_address: wallet.addresses[0].address, + hours_selection: hoursSelection, wallet: { id: wallet.filename, password, + addresses, }, - to: [{ - address, - coins: amount, - }], + to: destinations, + change_address: changeAddress, }, { json: true, - } - ); + }, + ).map(response => { + return { + ...response.transaction, + hoursBurned: response.transaction.fee, + encoded: response.encoded_transaction, + }; + }); } injectTransaction(encodedTx: string) { return this.apiService.post('injectTransaction', { rawtx: encodedTx }, { json: true }); } - sum(): Observable { - return this.all().map(wallets => wallets.map(wallet => wallet.coins >= 0 ? wallet.coins : 0).reduce((a , b) => a + b, 0)); - } - transaction(txid: string): Observable { return this.apiService.get('transaction', {txid: txid}).flatMap(transaction => { if (transaction.txn.inputs && !transaction.txn.inputs.length) { return Observable.of(transaction); } + return Observable.forkJoin(transaction.txn.inputs.map(input => this.retrieveInputAddress(input).map(response => { return response.owner_address; }))).map(inputs => { transaction.txn.inputs = inputs; + return transaction; }); }); } - transactions(): Observable { - return this.allAddresses().filter(addresses => !!addresses.length).first().flatMap(addresses => { + transactions(): Observable { + return this.allAddresses().first().flatMap(addresses => { this.addresses = addresses; + return Observable.forkJoin(addresses.map(address => this.apiService.getExplorerAddress(address))); - }).map(transactions => [].concat.apply([], transactions).sort((a, b) => b.timestamp - a.timestamp)) - .map(transactions => transactions.reduce((array, item) => { - if (!array.find(trans => trans.txid === item.txid)) { - array.push(item); - } - return array; - }, [])) - .map(transactions => transactions.map(transaction => { - const outgoing = !!this.addresses.find(address => transaction.inputs[0].owner === address.address); - transaction.outputs.forEach(output => { - if (outgoing && !this.addresses.find(address => output.dst === address.address)) { - transaction.addresses.push(output.dst); - transaction.balance = transaction.balance - parseFloat(output.coins); - } - if (!outgoing && this.addresses.find(address => output.dst === address.address)) { - transaction.addresses.push(output.dst); - transaction.balance = transaction.balance + parseFloat(output.coins); + }).map(transactions => { + return [] + .concat.apply([], transactions) + .reduce((array, item) => { + if (!array.find(trans => trans.txid === item.txid)) { + array.push(item); } + + return array; + }, []) + .sort((a, b) => b.timestamp - a.timestamp) + .map(transaction => { + const outgoing = this.addresses.some(address => { + return transaction.inputs.some(input => input.owner === address.address); + }); + + const relevantOutputs = transaction.outputs.reduce((array, output) => { + const isMyOutput = this.addresses.some(address => address.address === output.dst); + + if ((outgoing && !isMyOutput) || (!outgoing && isMyOutput)) { + array.push(output); + } + + return array; + }, []); + + const calculatedOutputs = (outgoing && relevantOutputs.length === 0) + || (!outgoing && relevantOutputs.length === transaction.outputs.length) + ? transaction.outputs + : relevantOutputs; + + transaction.addresses.push( + ...calculatedOutputs + .map(output => output.dst) + .filter((dst, i, self) => self.indexOf(dst) === i), + ); + + transaction.balance += calculatedOutputs.reduce((a, b) => a + parseFloat(b.coins), 0) * (outgoing ? -1 : 1); + return transaction; }); - - return transaction; - })); + }); } startDataRefreshSubscription() { @@ -219,32 +230,35 @@ export class WalletService { this.dataRefreshSubscription.unsubscribe(); } - this.dataRefreshSubscription = Observable.timer(0, 10000) - .subscribe(() => { - this.refreshBalances(); - this.refreshPendingTransactions(); - }); + this.ngZone.runOutsideAngular(() => { + this.dataRefreshSubscription = Observable.timer(0, 10000) + .subscribe(() => this.ngZone.run(() => { + this.refreshBalances(); + this.refreshPendingTransactions(); + })); + }); } private loadData(): void { this.apiService.getWallets().first().subscribe(wallets => this.wallets.next(wallets)); } - private retrieveAddressBalance(address: any|any[]) { - const addresses = Array.isArray(address) ? address.map(addr => addr.address).join(',') : address.address; - return this.apiService.get('balance', {addrs: addresses}); - } - private retrieveInputAddress(input: string) { return this.apiService.get('uxout', {uxid: input}); } private retrieveWalletBalance(wallet: Wallet): Observable { - return Observable.forkJoin(wallet.addresses.map(address => this.retrieveAddressBalance(address).map(balance => { - address.coins = balance.confirmed.coins / 1000000; - address.hours = balance.confirmed.hours; - return address; - }))); + return this.apiService.get('wallet/balance', { id: wallet.filename }).map(balance => { + return { + coins: balance.confirmed.coins / 1000000, + hours: balance.confirmed.hours, + addresses: Object.keys(balance.addresses).map(address => ({ + address, + coins: balance.addresses[address].confirmed.coins / 1000000, + hours: balance.addresses[address].confirmed.hours, + })), + }; + }); } private updateWallet(wallet: Wallet) { @@ -263,11 +277,12 @@ export class WalletService { [], pending .filter(response => response.transactions.length > 0) - .map(response => response.transactions) + .map(response => response.transactions), ).reduce((txs, tx) => { if (!txs.find(t => t.transaction.txid === tx.transaction.txid)) { txs.push(tx); } + return txs; }, [])); }); diff --git a/src/gui/static/src/app/services/wizard-guard.service.spec.ts b/src/gui/static/src/app/services/wizard-guard.service.spec.ts index 789fa83..ce4788b 100755 --- a/src/gui/static/src/app/services/wizard-guard.service.spec.ts +++ b/src/gui/static/src/app/services/wizard-guard.service.spec.ts @@ -5,7 +5,7 @@ import { WizardGuardService } from './wizard-guard.service'; describe('WizardGuardService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [WizardGuardService] + providers: [WizardGuardService], }); }); diff --git a/src/gui/static/src/app/services/wizard-guard.service.ts b/src/gui/static/src/app/services/wizard-guard.service.ts index cd622c9..dafdcb6 100755 --- a/src/gui/static/src/app/services/wizard-guard.service.ts +++ b/src/gui/static/src/app/services/wizard-guard.service.ts @@ -11,9 +11,10 @@ export class WizardGuardService implements CanActivate { canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { return new Promise(resolve => { - this.walletService.all().subscribe(wallets => { + this.walletService.all().first().subscribe(wallets => { if (wallets.length === 0) { this.router.navigate(['/wizard']); + return resolve(false); } diff --git a/src/gui/static/src/app/utils/errors.spec.ts b/src/gui/static/src/app/utils/errors.spec.ts new file mode 100755 index 0000000..ec0f214 --- /dev/null +++ b/src/gui/static/src/app/utils/errors.spec.ts @@ -0,0 +1,16 @@ +import { parseResponseMessage } from './errors'; + +fdescribe('errors', () => { + const message1 = '400 Bad Request - error description'; + const message2 = '403 Forbidden - error description'; + const message3 = '500 Internal Server Error - error description'; + + it('parses message from 400 and 403 responses', () => { + expect(parseResponseMessage(message1)).toEqual('Error description'); + expect(parseResponseMessage(message2)).toEqual('Error description'); + }); + + it('does not parse message from other responses', () => { + expect(parseResponseMessage(message3)).toEqual(message3); + }); +}); diff --git a/src/gui/static/src/app/utils/errors.ts b/src/gui/static/src/app/utils/errors.ts new file mode 100755 index 0000000..a489a57 --- /dev/null +++ b/src/gui/static/src/app/utils/errors.ts @@ -0,0 +1,24 @@ +import { MatSnackBar, MatSnackBarConfig } from '@angular/material'; + +export function parseResponseMessage(body: string): string { + if (typeof body === 'object') { + body = body['_body']; + } + + if (body.startsWith('400') || body.startsWith('403')) { + const parts = body.split(' - ', 2); + + return parts.length === 2 + ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1) + : body; + } + + return body; +} + +export function showSnackbarError(snackbar: MatSnackBar, body: string, duration = 300000) { + const config = new MatSnackBarConfig(); + config.duration = duration; + + snackbar.open(parseResponseMessage(body), null, config); +} diff --git a/src/gui/static/src/app/utils/index.ts b/src/gui/static/src/app/utils/index.ts deleted file mode 100755 index f8b188f..0000000 --- a/src/gui/static/src/app/utils/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function parseResponseMessage(body: string): string { - if (body.startsWith('400') || body.startsWith('403')) { - const parts = body.split(' - ', 2); - - return parts.length === 2 - ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1) - : body; - } - - return body; -} diff --git a/src/gui/static/src/assets/header.png b/src/gui/static/src/assets/header.png index be1002a..56243b8 100755 Binary files a/src/gui/static/src/assets/header.png and b/src/gui/static/src/assets/header.png differ diff --git a/src/gui/static/src/assets/i18n/en.json b/src/gui/static/src/assets/i18n/en.json new file mode 100755 index 0000000..927bdc1 --- /dev/null +++ b/src/gui/static/src/assets/i18n/en.json @@ -0,0 +1,244 @@ +{ + "common": { + "coin-id": "SLB", + "coin-hours": "Coin Hours", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs" + }, + + "title": { + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy SLB", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "SolarBankersCoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your SLB after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single SLB address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the SLB to a new address in the wallet selected above at the current rate of {{ rate }} SLB/BTC.", + "fraction-warning": "Only send multiple of the SLB/BTC rate! SLB is sent in whole number; fractional SLB is not sent!", + "receive": "Receive SLB", + "receive-desc": "After receiving your Bitcoin, we'll send you your SLB. It may take anywhere between 20 minutes and an hour to receive your SLB.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a SLB wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your SLB wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "wallet": "Wallet", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "address": { + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "outputs": "Unspent Outputs" + } + }, + + "send": { + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "addresses-help": "Wallet addresses to send from", + "change-address-label": "Custom change address", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-sent": "sent", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SLB supply", + "total-supply": "Total SLB supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send SLB", + "unknown": "Unknown" + } +} diff --git a/src/gui/static/src/assets/img/edit-blue.png b/src/gui/static/src/assets/img/edit-blue.png new file mode 100755 index 0000000..de88a9a Binary files /dev/null and b/src/gui/static/src/assets/img/edit-blue.png differ diff --git a/src/gui/static/src/assets/img/header.png b/src/gui/static/src/assets/img/header.png index 6eaf10d..56243b8 100755 Binary files a/src/gui/static/src/assets/img/header.png and b/src/gui/static/src/assets/img/header.png differ diff --git a/src/gui/static/src/assets/img/lock-grey.png b/src/gui/static/src/assets/img/lock-grey.png new file mode 100755 index 0000000..3f835e7 Binary files /dev/null and b/src/gui/static/src/assets/img/lock-grey.png differ diff --git a/src/gui/static/src/assets/img/minus-red.png b/src/gui/static/src/assets/img/minus-red.png index 33677a7..6686a98 100755 Binary files a/src/gui/static/src/assets/img/minus-red.png and b/src/gui/static/src/assets/img/minus-red.png differ diff --git a/src/gui/static/src/assets/img/plus-green.png b/src/gui/static/src/assets/img/plus-green.png new file mode 100755 index 0000000..ab02079 Binary files /dev/null and b/src/gui/static/src/assets/img/plus-green.png differ diff --git a/src/gui/static/src/assets/img/unlock-gold.png b/src/gui/static/src/assets/img/unlock-gold.png new file mode 100755 index 0000000..3ecf4ae Binary files /dev/null and b/src/gui/static/src/assets/img/unlock-gold.png differ diff --git a/src/gui/static/src/current-skycoin.json b/src/gui/static/src/current-skycoin.json index 9418bd3..381e17e 100755 --- a/src/gui/static/src/current-skycoin.json +++ b/src/gui/static/src/current-skycoin.json @@ -1 +1 @@ -versionData='{ "version": "0.23.1-rc2" }'; +versionData='{ "version": "0.24.1" }'; diff --git a/src/gui/static/src/environments/environment.prod.ts b/src/gui/static/src/environments/environment.prod.ts index 5923596..af32bad 100755 --- a/src/gui/static/src/environments/environment.prod.ts +++ b/src/gui/static/src/environments/environment.prod.ts @@ -1,5 +1,5 @@ export const environment = { - nodeUrl: 'http://127.0.0.1:7220/', + nodeUrl: '/api/v1/', production: true, tellerUrl: 'https://event.skycoin.net/api/', }; diff --git a/src/gui/static/src/environments/environment.ts b/src/gui/static/src/environments/environment.ts index a34853c..db510b3 100755 --- a/src/gui/static/src/environments/environment.ts +++ b/src/gui/static/src/environments/environment.ts @@ -4,7 +4,7 @@ // The list of which env maps to which file can be found in `.angular-cli.json`. export const environment = { - nodeUrl: '/api/', + nodeUrl: '/api/v1/', production: false, tellerUrl: '/teller/', }; diff --git a/src/gui/static/src/index.html b/src/gui/static/src/index.html index ecf0e96..f32ae33 100755 --- a/src/gui/static/src/index.html +++ b/src/gui/static/src/index.html @@ -6,7 +6,6 @@ - diff --git a/src/gui/static/src/main.ts b/src/gui/static/src/main.ts index a9ca1ca..6b163a1 100755 --- a/src/gui/static/src/main.ts +++ b/src/gui/static/src/main.ts @@ -4,6 +4,8 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { AppModule } from './app/app.module'; import { environment } from './environments/environment'; +import 'hammerjs'; + if (environment.production) { enableProdMode(); } diff --git a/src/gui/static/src/styles.scss b/src/gui/static/src/styles.scss index 7d28ce9..63a158e 100755 --- a/src/gui/static/src/styles.scss +++ b/src/gui/static/src/styles.scss @@ -1,4 +1,5 @@ -@import 'theme/_variables'; +@import 'theme/variables'; +@import 'theme/tables'; @import '~bootstrap/scss/bootstrap-grid.scss'; /* You can add global styles to this file, and also import other style files */ @@ -130,11 +131,11 @@ mat-panel-title { min-height: 100%; &.sky-container-grey { - background-color: $grey-light; + background-color: $grey-lightest; } } -.flex-fill { +.flex-fill, .-flex-fill { flex: 1 1 auto; } @@ -168,7 +169,7 @@ mat-panel-title { line-height: 20px; padding: 10px 10px; width: 100%; - -webkit-appearance:none; + appearance: none; } textarea { @@ -300,3 +301,50 @@ On-boarding components color: black; } } + + +.-select { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + background: url('/assets/img/chevron-right-grey.png') no-repeat; + background-size: 32px 32px; + width: 32px; + height: 32px; + margin: 6px; + pointer-events: none; + transform: rotate(90deg); + } +} + +.mat-menu-panel { + border-radius: 5px !important; + background-color: #fefefe; + + .mat-menu-item { + font-family: Skycoin; + line-height: 50px; + } + + &.compact { + .mat-menu-item { + font-size: 13px; + height: 35px; + line-height: 35px; + } + } +} + +.qr-code-button { + opacity: 0.6; + cursor: pointer; + + &:hover { + opacity: 1; + } +} diff --git a/src/gui/static/src/test.ts b/src/gui/static/src/test.ts index cd612ee..0c45c2e 100755 --- a/src/gui/static/src/test.ts +++ b/src/gui/static/src/test.ts @@ -9,7 +9,7 @@ import 'zone.js/dist/fake-async-test'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, - platformBrowserDynamicTesting + platformBrowserDynamicTesting, } from '@angular/platform-browser-dynamic/testing'; // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. @@ -17,12 +17,12 @@ declare const __karma__: any; declare const require: any; // Prevent Karma from running prematurely. -__karma__.loaded = function () {}; +__karma__.loaded = function() {}; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); diff --git a/src/gui/static/src/theme/_tables.scss b/src/gui/static/src/theme/_tables.scss new file mode 100755 index 0000000..29971a8 --- /dev/null +++ b/src/gui/static/src/theme/_tables.scss @@ -0,0 +1,69 @@ +@import 'variables'; + +.-table { + &:last-of-type { + margin-bottom: 30px; + } + + .-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + margin: 0 30px; + + > div { + padding: 0 20px; + } + } + + .-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0 30px; + + .-row { + font-size: $font-size-standard; + line-height: $row-height; + height: $row-height; + background: $white; + display: flex; + + &:not(:last-child) { + border-bottom: 1px solid #eff0f0; + } + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 20px; + } + } + } + + .-width-70 { + width: 70px; + } + + .-width-150 { + width: 150px; + } + + .-width-200 { + width: 200px; + } + + .-width-250 { + width: 250px; + } +} diff --git a/src/gui/static/src/theme/_variables.scss b/src/gui/static/src/theme/_variables.scss index cbac2fa..4eef7fd 100755 --- a/src/gui/static/src/theme/_variables.scss +++ b/src/gui/static/src/theme/_variables.scss @@ -1,4 +1,3 @@ - // Backgrounds $gradient-blue-dark: #7a5917; $gradient-blue-dark-transparent: rgba(122, 89, 23, 0.7); @@ -7,18 +6,22 @@ $gradient-blue-light-transparent: rgba(158, 105, 36, 0.7); // Colors $black: #171a1d; -$grey-dark: rgba(30, 34, 39, 0.5); -$grey-light: #f7f7f7; -$grey-normal: #1e2227; + +$grey-lightest: #f7f7f7; +$grey-light: rgba(30, 34, 39, 0.2); +$grey: rgba(30, 34, 39, 0.5); +$grey-dark: #1e2227; + $white: #fafafa; $transparent: rgba(0,0,0,0); + $red: #ff004e; +$blue: #0072ff; // Grid $row-height: 60px; $row-detail-size: 32px; // Texts -$font-family: Montreal, sans-serif; $font-size-standard: 13px; $letter-spacing-wide: 1px; diff --git a/src/gui/static/src/typings.d.ts b/src/gui/static/src/typings.d.ts index ef5c7bd..bcc7cff 100755 --- a/src/gui/static/src/typings.d.ts +++ b/src/gui/static/src/typings.d.ts @@ -3,3 +3,8 @@ declare var module: NodeModule; interface NodeModule { id: string; } + +declare var System: System; +interface System { + import(request: string): Promise; +} diff --git a/src/gui/static/tslint.json b/src/gui/static/tslint.json index d6454c1..cd6c2c0 100755 --- a/src/gui/static/tslint.json +++ b/src/gui/static/tslint.json @@ -101,6 +101,13 @@ "parameter": "nospace", "property-declaration": "nospace", "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" } ], "typeof-compare": true, @@ -111,8 +118,11 @@ "check-branch", "check-decl", "check-operator", + "check-module", "check-separator", - "check-type" + "check-type", + "check-typecast", + "check-preblock" ], "directive-selector": [ true, @@ -134,6 +144,16 @@ "use-life-cycle-interface": true, "use-pipe-transform-interface": true, "component-class-suffix": true, - "directive-class-suffix": true + "directive-class-suffix": true, + "trailing-comma": [ + true, + { + "multiline": "always", + "esSpecCompliant": true + } + ], + "newline-before-return": true, + "space-before-function-paren": [true, "never"], + "prefer-method-signature": true } } diff --git a/src/gui/transaction.go b/src/gui/transaction.go deleted file mode 100755 index 2cf4caa..0000000 --- a/src/gui/transaction.go +++ /dev/null @@ -1,250 +0,0 @@ -package gui - -import ( - "encoding/hex" - "encoding/json" - "fmt" - "net/http" - "strconv" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/visor" - - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers -) - -// Returns pending transactions -func getPendingTxs(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - txns := gateway.GetAllUnconfirmedTxns() - ret := make([]*visor.ReadableUnconfirmedTxn, 0, len(txns)) - for _, unconfirmedTxn := range txns { - readable, err := visor.NewReadableUnconfirmedTxn(&unconfirmedTxn) - if err != nil { - wh.Error500(w, err.Error()) - return - } - ret = append(ret, readable) - } - - wh.SendJSONOr500(logger, w, &ret) - } -} - -func getTransactionByID(gate Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - txid := r.FormValue("txid") - if txid == "" { - wh.Error400(w, "txid is empty") - return - } - - h, err := cipher.SHA256FromHex(txid) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - tx, err := gate.GetTransaction(h) - if err != nil { - wh.Error400(w, err.Error()) - return - } - if tx == nil { - wh.Error404(w, "") - return - } - - rbTx, err := visor.NewReadableTransaction(tx) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - resTx := daemon.TransactionResult{ - Transaction: *rbTx, - Status: tx.Status, - } - wh.SendJSONOr500(logger, w, &resTx) - } -} - -// Returns transactions that match the filters. -// Method: GET -// URI: /transactions -// Args: -// addrs: Comma seperated addresses [optional, returns all transactions if no address provided] -// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] -func getTransactions(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - // Gets 'addrs' parameter value - addrs, err := parseAddressesFromStr(r.FormValue("addrs")) - if err != nil { - wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) - return - } - - // Initialize transaction filters - flts := []visor.TxFilter{visor.AddrsFilter(addrs)} - - // Gets the 'confirmed' parameter value - confirmedStr := r.FormValue("confirmed") - if confirmedStr != "" { - confirmed, err := strconv.ParseBool(confirmedStr) - if err != nil { - wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) - return - } - - flts = append(flts, visor.ConfirmedTxFilter(confirmed)) - } - - // Gets transactions - txns, err := gateway.GetTransactions(flts...) - if err != nil { - err = fmt.Errorf("gateway.GetTransactions failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - // Converts visor.Transaction to daemon.TransactionResult - txRlts, err := daemon.NewTransactionResults(txns) - if err != nil { - err = fmt.Errorf("daemon.NewTransactionResults failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, txRlts.Txns) - } -} - -// parseAddressesFromStr parses comma seperated addresses string into []cipher.Address -func parseAddressesFromStr(s string) ([]cipher.Address, error) { - addrsStr := splitCommaString(s) - - var addrs []cipher.Address - for _, s := range addrsStr { - a, err := cipher.DecodeBase58Address(s) - if err != nil { - return nil, err - } - - addrs = append(addrs, a) - } - - return addrs, nil -} - -func injectTransaction(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - // get the rawtransaction - v := struct { - Rawtx string `json:"rawtx"` - }{} - - if err := json.NewDecoder(r.Body).Decode(&v); err != nil { - wh.Error400(w, err.Error()) - return - } - - b, err := hex.DecodeString(v.Rawtx) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - txn, err := coin.TransactionDeserialize(b) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - // TODO -- move this to a more general verification layer, see https://github.com/skycoin/skycoin/issues/1342 - // Check that the transaction does not send to an empty address, - // if this is happening, assume there is a bug in the code that generated the transaction - for _, o := range txn.Out { - if o.Address.Null() { - wh.Error400(w, "Transaction.Out contains an output sending to an empty address") - return - } - } - - if err := gateway.InjectBroadcastTransaction(txn); err != nil { - err = fmt.Errorf("inject tx failed: %v", err) - wh.Error503(w, err.Error()) - return - } - - wh.SendJSONOr500(logger, w, txn.Hash().Hex()) - } -} - -func resendUnconfirmedTxns(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - rlt := gateway.ResendUnconfirmedTxns() - wh.SendJSONOr500(logger, w, rlt) - return - } -} - -func getRawTx(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - txid := r.FormValue("txid") - if txid == "" { - wh.Error400(w, "txid is empty") - return - } - - h, err := cipher.SHA256FromHex(txid) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - tx, err := gateway.GetTransaction(h) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - if tx == nil { - wh.Error404(w, "") - return - } - - d := tx.Txn.Serialize() - wh.SendJSONOr500(logger, w, hex.EncodeToString(d)) - return - } -} diff --git a/src/gui/transaction_test.go b/src/gui/transaction_test.go deleted file mode 100755 index a849f13..0000000 --- a/src/gui/transaction_test.go +++ /dev/null @@ -1,806 +0,0 @@ -package gui - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/stretchr/testify/require" - - "math" - - "time" - - "net/url" - - "errors" - - "bytes" - "encoding/hex" - - "github.com/stretchr/testify/mock" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/daemon" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/utc" - "github.com/skycoin/skycoin/src/visor" -) - -func createUnconfirmedTxn(t *testing.T) visor.UnconfirmedTxn { - ut := visor.UnconfirmedTxn{} - ut.Txn = coin.Transaction{} - ut.Txn.InnerHash = testutil.RandSHA256(t) - ut.Received = utc.Now().UnixNano() - ut.Checked = ut.Received - ut.Announced = time.Time{}.UnixNano() - return ut -} - -func makeTransaction(t *testing.T) coin.Transaction { - tx, _ := makeTransactionWithSecret(t) - return tx -} - -func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { - body, sec := makeUxBodyWithSecret(t) - return coin.UxOut{ - Head: coin.UxHead{ - Time: 100, - BkSeq: 2, - }, - Body: body, - }, sec -} - -func makeAddress() cipher.Address { - p, _ := cipher.GenerateKeyPair() - return cipher.AddressFromPubKey(p) -} - -func makeTransactionWithSecret(t *testing.T) (coin.Transaction, cipher.SecKey) { - tx := coin.Transaction{} - ux, s := makeUxOutWithSecret(t) - - tx.PushInput(ux.Hash()) - tx.SignInputs([]cipher.SecKey{s}) - tx.PushOutput(makeAddress(), 1e6, 50) - tx.PushOutput(makeAddress(), 5e6, 50) - tx.UpdateHeader() - return tx, s -} - -func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { - p, s := cipher.GenerateKeyPair() - return coin.UxBody{ - SrcTransaction: testutil.RandSHA256(t), - Address: cipher.AddressFromPubKey(p), - Coins: 1e6, - Hours: 100, - }, s -} - -func makeTransactionWithEmptyAddressOutput(t *testing.T) coin.Transaction { - tx := coin.Transaction{} - ux, s := makeUxOutWithSecret(t) - - tx.PushInput(ux.Hash()) - tx.SignInputs([]cipher.SecKey{s}) - tx.PushOutput(makeAddress(), 1e6, 50) - tx.PushOutput(cipher.Address{}, 5e6, 50) - tx.UpdateHeader() - return tx -} - -func TestGetPendingTxs(t *testing.T) { - invalidTxn := createUnconfirmedTxn(t) - invalidTxn.Txn.Out = append(invalidTxn.Txn.Out, coin.TransactionOutput{ - Coins: math.MaxInt64 + 1, - }) - - tt := []struct { - name string - method string - url string - status int - err string - getAllUnconfirmedTxnsResponse []visor.UnconfirmedTxn - httpResponse []*visor.ReadableUnconfirmedTxn - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, - }, - { - name: "500 - bad unconfirmedTxn", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", - getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{ - invalidTxn, - }, - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, - httpResponse: []*visor.ReadableUnconfirmedTxn{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/pendingTxs" - gateway := NewGatewayerMock() - gateway.On("GetAllUnconfirmedTxns").Return(tc.getAllUnconfirmedTxnsResponse) - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - rr := httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []*visor.ReadableUnconfirmedTxn - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} - -func TestGetTransactionByID(t *testing.T) { - oddHash := "cafcb" - invalidHash := "cabrca" - validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" - type httpBody struct { - txid string - } - - tt := []struct { - name string - method string - status int - err string - httpBody *httpBody - getTransactionArg cipher.SHA256 - getTransactionReponse *visor.Transaction - getTransactionError error - httpResponse daemon.TransactionResult - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - empty txid", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - txid is empty", - httpBody: &httpBody{ - txid: "", - }, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - invalid hash: odd length hex string", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: odd length hex string", - httpBody: &httpBody{ - txid: oddHash, - }, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - invalid hash: invalid byte: U+0072 'r'", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", - httpBody: &httpBody{ - txid: invalidHash, - }, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - getTransactionError", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - getTransactionError", - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - getTransactionError: errors.New("getTransactionError"), - }, - { - name: "404", - method: http.MethodGet, - status: http.StatusNotFound, - err: "404 Not Found", - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - getTransactionReponse: &visor.Transaction{}, - httpResponse: daemon.TransactionResult{ - Transaction: visor.ReadableTransaction{ - Sigs: []string{}, - In: []string{}, - Out: []visor.ReadableTransactionOutput{}, - Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", - InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", - }, - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/transaction" - gateway := NewGatewayerMock() - gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionReponse, tc.getTransactionError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.txid != "" { - v.Add("txid", tc.httpBody.txid) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg daemon.TransactionResult - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} - -func TestInjectTransaction(t *testing.T) { - validTransaction := makeTransaction(t) - type httpBody struct { - Rawtx string `json:"rawtx"` - } - - validTxBody := &httpBody{Rawtx: hex.EncodeToString(validTransaction.Serialize())} - validTxBodyJSON, err := json.Marshal(validTxBody) - require.NoError(t, err) - - b := &httpBody{Rawtx: hex.EncodeToString(testutil.RandBytes(t, 128))} - invalidTxBodyJSON, err := json.Marshal(b) - require.NoError(t, err) - - invalidTxEmptyAddress := makeTransactionWithEmptyAddressOutput(t) - invalidTxEmptyAddressBody := &httpBody{ - Rawtx: hex.EncodeToString(invalidTxEmptyAddress.Serialize()), - } - invalidTxEmptyAddressBodyJSON, err := json.Marshal(invalidTxEmptyAddressBody) - require.NoError(t, err) - - tt := []struct { - name string - method string - status int - err string - httpBody string - injectTransactionArg coin.Transaction - injectTransactionError error - httpResponse string - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - injectTransactionArg: validTransaction, - }, - { - name: "400 - EOF", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - EOF", - }, - { - name: "400 - Invalid transaction: Deserialization failed", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid transaction: Deserialization failed", - httpBody: `{"wrongKey":"wrongValue"}`, - }, - { - name: "400 - encoding/hex: odd length hex string", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: odd length hex string", - httpBody: `{"rawtx":"aab"}`, - }, - { - name: "400 - rawtx deserialization error", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid transaction: Deserialization failed", - httpBody: string(invalidTxBodyJSON), - }, - { - name: "400 - txn sends to empty address", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - Transaction.Out contains an output sending to an empty address", - httpBody: string(invalidTxEmptyAddressBodyJSON), - }, - { - name: "503 - injectTransactionError", - method: http.MethodPost, - status: http.StatusServiceUnavailable, - err: "503 Service Unavailable - inject tx failed: injectTransactionError", - httpBody: string(validTxBodyJSON), - injectTransactionArg: validTransaction, - injectTransactionError: errors.New("injectTransactionError"), - }, - { - name: "200", - method: http.MethodPost, - status: http.StatusOK, - httpBody: string(validTxBodyJSON), - injectTransactionArg: validTransaction, - httpResponse: validTransaction.Hash().Hex(), - }, - { - name: "200 - csrf disabled", - method: http.MethodPost, - status: http.StatusOK, - httpBody: string(validTxBodyJSON), - injectTransactionArg: validTransaction, - httpResponse: validTransaction.Hash().Hex(), - csrfDisabled: true, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/injectTransaction" - gateway := NewGatewayerMock() - gateway.On("InjectBroadcastTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") - require.NoError(t, err) - require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) - } - }) - } -} - -func TestResendUnconfirmedTxns(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - httpBody string - resendUnconfirmedTxnsResponse *daemon.ResendResult - httpResponse *daemon.ResendResult - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - resendUnconfirmedTxnsResponse: &daemon.ResendResult{}, - httpResponse: &daemon.ResendResult{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/resendUnconfirmedTxns" - gateway := NewGatewayerMock() - gateway.On("ResendUnconfirmedTxns").Return(tc.resendUnconfirmedTxnsResponse) - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *daemon.ResendResult - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} - -func TestGetRawTx(t *testing.T) { - oddHash := "cafcb" - invalidHash := "cabrca" - validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" - type httpBody struct { - txid string - } - - tt := []struct { - name string - method string - url string - status int - err string - httpBody *httpBody - getTransactionArg cipher.SHA256 - getTransactionResponse *visor.Transaction - getTransactionError error - httpResponse string - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - txid is empty", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - txid is empty", - httpBody: &httpBody{}, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - invalid hash: odd length hex string", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: odd length hex string", - httpBody: &httpBody{ - txid: oddHash, - }, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - invalid hash: invalid byte: U+0072 'r'", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", - httpBody: &httpBody{ - txid: invalidHash, - }, - getTransactionArg: testutil.RandSHA256(t), - }, - { - name: "400 - getTransactionError", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - getTransactionError", - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - getTransactionError: errors.New("getTransactionError"), - }, - { - name: "404", - method: http.MethodGet, - status: http.StatusNotFound, - err: "404 Not Found", - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - httpBody: &httpBody{ - txid: validHash, - }, - getTransactionArg: testutil.SHA256FromHex(t, validHash), - getTransactionResponse: &visor.Transaction{}, - httpResponse: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/rawtx" - gateway := NewGatewayerMock() - gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionResponse, tc.getTransactionError) - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.txid != "" { - v.Add("txid", tc.httpBody.txid) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") - require.NoError(t, err) - require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) - } - }) - } -} - -func TestGetTransactions(t *testing.T) { - invalidAddrsStr := "invalid,addrs" - addrsStr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ,2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE" - var addrs []cipher.Address - for _, item := range []string{"2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE"} { - addr, err := cipher.DecodeBase58Address(item) - require.NoError(t, err) - addrs = append(addrs, addr) - } - invalidTxn := makeTransaction(t) - invalidTxn.Out = append(invalidTxn.Out, coin.TransactionOutput{ - Coins: math.MaxInt64 + 1, - }) - type httpBody struct { - addrs string - confirmed string - } - - tt := []struct { - name string - method string - status int - err string - httpBody *httpBody - getTransactionsArg []visor.TxFilter - getTransactionsResponse []visor.Transaction - getTransactionsError error - httpResponse []visor.Transaction - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - invalid `addrs` param", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character", - httpBody: &httpBody{ - addrs: invalidAddrsStr, - }, - getTransactionsArg: []visor.TxFilter{ - visor.AddrsFilter(addrs), - }, - }, - { - name: "400 - invalid `confirmed` param", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid 'confirmed' value: strconv.ParseBool: parsing \"invalidConfirmed\": invalid syntax", - httpBody: &httpBody{ - addrs: addrsStr, - confirmed: "invalidConfirmed", - }, - getTransactionsArg: []visor.TxFilter{ - visor.AddrsFilter(addrs), - }, - }, - { - name: "500 - getTransactionsError", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetTransactions failed: getTransactionsError", - httpBody: &httpBody{ - addrs: addrsStr, - confirmed: "true", - }, - getTransactionsArg: []visor.TxFilter{ - visor.AddrsFilter(addrs), - visor.ConfirmedTxFilter(true), - }, - getTransactionsError: errors.New("getTransactionsError"), - }, - { - name: "500 - daemon.NewTransactionResults error", - method: http.MethodGet, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - daemon.NewTransactionResults failed: Droplet string conversion failed: Value is too large", - httpBody: &httpBody{ - addrs: addrsStr, - confirmed: "true", - }, - getTransactionsArg: []visor.TxFilter{ - visor.AddrsFilter(addrs), - visor.ConfirmedTxFilter(true), - }, - getTransactionsResponse: []visor.Transaction{ - { - Txn: invalidTxn, - Status: visor.TransactionStatus{ - Confirmed: true, - Height: 103, - }, - }, - }, - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - httpBody: &httpBody{ - addrs: addrsStr, - confirmed: "true", - }, - getTransactionsArg: []visor.TxFilter{ - visor.AddrsFilter(addrs), - visor.ConfirmedTxFilter(true), - }, - getTransactionsResponse: []visor.Transaction{}, - httpResponse: []visor.Transaction{}, - }, - } - - for _, tc := range tt { - endpoint := "/transactions" - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - gateway.On("GetTransactions", mock.Anything).Return(tc.getTransactionsResponse, tc.getTransactionsError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.addrs != "" { - v.Add("addrs", tc.httpBody.addrs) - } - if tc.httpBody.confirmed != "" { - v.Add("confirmed", tc.httpBody.confirmed) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []visor.Transaction - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} diff --git a/src/gui/uxout.go b/src/gui/uxout.go deleted file mode 100755 index 7ead75e..0000000 --- a/src/gui/uxout.go +++ /dev/null @@ -1,77 +0,0 @@ -package gui - -import ( - "net/http" - - "github.com/skycoin/skycoin/src/cipher" - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers - "github.com/skycoin/skycoin/src/visor/historydb" -) - -func getUxOutByID(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - uxid := r.FormValue("uxid") - if uxid == "" { - wh.Error400(w, "uxid is empty") - return - } - - id, err := cipher.SHA256FromHex(uxid) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - uxout, err := gateway.GetUxOutByID(id) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - if uxout == nil { - wh.Error404(w, "") - return - } - - wh.SendJSONOr500(logger, w, historydb.NewUxOutJSON(uxout)) - } -} - -func getAddrUxOuts(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - addr := r.FormValue("address") - if addr == "" { - wh.Error400(w, "address is empty") - return - } - - cipherAddr, err := cipher.DecodeBase58Address(addr) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - uxs, err := gateway.GetAddrUxOuts([]cipher.Address{cipherAddr}) - if err != nil { - wh.Error400(w, err.Error()) - return - } - - //Convert slice UxOut to slice of UxOutJson - uxsJSON := make([]*historydb.UxOutJSON, len(uxs)) - for i, ux := range uxs { - uxsJSON[i] = historydb.NewUxOutJSON(ux) - } - - wh.SendJSONOr500(logger, w, uxsJSON) - } -} diff --git a/src/gui/uxout_test.go b/src/gui/uxout_test.go deleted file mode 100755 index c0b8b80..0000000 --- a/src/gui/uxout_test.go +++ /dev/null @@ -1,280 +0,0 @@ -package gui - -import ( - "encoding/json" - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "errors" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/visor/historydb" -) - -func TestGetUxOutByID(t *testing.T) { - invalidHash := "carccb" - oddHash := "caccb" - validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" - - type httpBody struct { - uxid string - } - - tt := []struct { - name string - method string - url string - status int - err string - httpBody *httpBody - uxid string - getGetUxOutByIDArg cipher.SHA256 - getGetUxOutByIDResponse *historydb.UxOut - getGetUxOutByIDError error - httpResponse *historydb.UxOutJSON - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - empty uxin value", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - uxid is empty", - httpBody: &httpBody{ - uxid: "", - }, - }, - { - name: "400 - odd length uxin value", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: odd length hex string", - httpBody: &httpBody{ - uxid: oddHash, - }, - uxid: oddHash, - }, - { - name: "400 - invalid uxin value", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", - httpBody: &httpBody{ - uxid: invalidHash, - }, - uxid: invalidHash, - }, - { - name: "400 - getGetUxOutByIDError", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - getGetUxOutByIDError", - httpBody: &httpBody{ - uxid: validHash, - }, - uxid: validHash, - getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - getGetUxOutByIDError: errors.New("getGetUxOutByIDError"), - }, - { - name: "404 - uxout == nil", - method: http.MethodGet, - status: http.StatusNotFound, - err: "404 Not Found", - httpBody: &httpBody{ - uxid: validHash, - }, - uxid: validHash, - getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - err: "404 Not Found", - httpBody: &httpBody{ - uxid: validHash, - }, - uxid: validHash, - getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), - getGetUxOutByIDResponse: &historydb.UxOut{}, - httpResponse: historydb.NewUxOutJSON(&historydb.UxOut{}), - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - endpoint := "/uxout" - gateway.On("GetUxOutByID", tc.getGetUxOutByIDArg).Return(tc.getGetUxOutByIDResponse, tc.getGetUxOutByIDError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.uxid != "" { - v.Add("uxid", tc.httpBody.uxid) - } - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg *historydb.UxOutJSON - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} - -func TestGetAddrUxOuts(t *testing.T) { - addressForGwError := testutil.MakeAddress() - addressForGwResponse := testutil.MakeAddress() - type httpBody struct { - address string - } - - tt := []struct { - name string - method string - url string - status int - err string - httpBody *httpBody - getAddrUxOutsArg []cipher.Address - getAddrUxOutsResponse []*historydb.UxOut - getAddrUxOutsError error - httpResponse []*historydb.UxOutJSON - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - address is empty", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - address is empty", - httpBody: &httpBody{ - address: "", - }, - }, - { - name: "400 - cipher.DecodeBase58Address error", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - Invalid address length", - httpBody: &httpBody{ - address: "abcd", - }, - }, - { - name: "400 - gateway.GetAddrUxOuts error", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - getAddrUxOutsError", - httpBody: &httpBody{ - address: addressForGwError.String(), - }, - getAddrUxOutsArg: []cipher.Address{addressForGwError}, - getAddrUxOutsError: errors.New("getAddrUxOutsError"), - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - httpBody: &httpBody{ - address: addressForGwResponse.String(), - }, - getAddrUxOutsArg: []cipher.Address{addressForGwResponse}, - getAddrUxOutsResponse: []*historydb.UxOut{}, - httpResponse: []*historydb.UxOutJSON{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - endpoint := "/address_uxouts" - gateway := NewGatewayerMock() - gateway.On("GetAddrUxOuts", tc.getAddrUxOutsArg).Return(tc.getAddrUxOutsResponse, tc.getAddrUxOutsError) - - v := url.Values{} - if tc.httpBody != nil { - if tc.httpBody.address != "" { - v.Add("address", tc.httpBody.address) - } - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - rr := httptest.NewRecorder() - handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []*historydb.UxOutJSON - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - }) - } -} diff --git a/src/gui/wallet.go b/src/gui/wallet.go deleted file mode 100755 index fb66dc1..0000000 --- a/src/gui/wallet.go +++ /dev/null @@ -1,842 +0,0 @@ -package gui - -// Wallet-related information for the GUI -import ( - "fmt" - "net/http" - "sort" - "strconv" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/cipher/go-bip39" - - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" - - "github.com/skycoin/skycoin/src/util/fee" - wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers -) - -// HTTP401AuthHeader WWW-Authenticate value -const HTTP401AuthHeader = "SkycoinWallet" - -// SpendResult represents the result of spending -type SpendResult struct { - Balance *wallet.BalancePair `json:"balance,omitempty"` - Transaction *visor.ReadableTransaction `json:"txn,omitempty"` - Error string `json:"error,omitempty"` -} - -// UnconfirmedTxnsResponse contains unconfirmed transaction data -type UnconfirmedTxnsResponse struct { - Transactions []visor.ReadableUnconfirmedTxn `json:"transactions"` -} - -// WalletEntry the wallet entry struct -type WalletEntry struct { - Address string `json:"address"` - Public string `json:"public_key"` -} - -// WalletMeta the wallet meta struct -type WalletMeta struct { - Coin string `json:"coin"` - Filename string `json:"filename"` - Label string `json:"label"` - Type string `json:"type"` - Version string `json:"version"` - CryptoType string `json:"crypto_type"` - Timestamp int64 `json:"timestamp"` - Encrypted bool `json:"encrypted"` -} - -// WalletResponse wallet response struct for http apis -type WalletResponse struct { - Meta WalletMeta `json:"meta"` - Entries []WalletEntry `json:"entries"` -} - -// NewWalletResponse creates WalletResponse struct from *wallet.Wallet -func NewWalletResponse(w *wallet.Wallet) (*WalletResponse, error) { - var wr WalletResponse - - wr.Meta.Coin = w.Meta["coin"] - wr.Meta.Filename = w.Meta["filename"] - wr.Meta.Label = w.Meta["label"] - wr.Meta.Type = w.Meta["type"] - wr.Meta.Version = w.Meta["version"] - wr.Meta.CryptoType = w.Meta["cryptoType"] - - // Converts "encrypted" string to boolean if any - if encryptedStr, ok := w.Meta["encrypted"]; ok { - encrypted, err := strconv.ParseBool(encryptedStr) - if err != nil { - return nil, err - } - wr.Meta.Encrypted = encrypted - } - - if tmStr, ok := w.Meta["tm"]; ok { - // Converts "tm" string to integer timestamp. - tm, err := strconv.ParseInt(tmStr, 10, 64) - if err != nil { - return nil, err - } - wr.Meta.Timestamp = tm - } - - for _, e := range w.Entries { - wr.Entries = append(wr.Entries, WalletEntry{ - Address: e.Address.String(), - Public: e.Public.Hex(), - }) - } - - return &wr, nil -} - -// Returns the wallet's balance, both confirmed and predicted. The predicted -// balance is the confirmed balance minus the pending spends. -// URI: /wallet/balance -// Method: GET -// Args: -// id: wallet id [required] -func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, "missing wallet id") - return - } - - b, err := gateway.GetWalletBalance(wltID) - if err != nil { - logger.Errorf("Get wallet balance failed: %v", err) - switch err { - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - break - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - break - default: - wh.Error500(w, err.Error()) - } - return - } - - wh.SendJSONOr500(logger, w, b) - } -} - -// Creates and broadcasts a transaction sending money from one of our wallets -// to destination address. -// URI: /wallet/spend -// Method: POST -// Args: -// id: wallet id -// dst: recipient address -// coins: the number of droplet you will send -// password: wallet password -// Response: -// balance: new balance of the wallet -// txn: spent transaction -// error: an error that may have occured after broadcast the transaction to the network -// if this field is not empty, the spend succeeded, but the response data could not be prepared -func walletSpendHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, "missing wallet id") - return - } - - sdst := r.FormValue("dst") - if sdst == "" { - wh.Error400(w, "missing destination address \"dst\"") - return - } - dst, err := cipher.DecodeBase58Address(sdst) - if err != nil { - wh.Error400(w, fmt.Sprintf("invalid destination address: %v", err)) - return - } - - scoins := r.FormValue("coins") - coins, err := strconv.ParseUint(scoins, 10, 64) - if err != nil { - wh.Error400(w, `invalid "coins" value`) - return - } - - if coins <= 0 { - wh.Error400(w, `invalid "coins" value, must > 0`) - return - } - - tx, err := gateway.Spend(wltID, []byte(r.FormValue("password")), coins, dst) - switch err { - case nil: - case fee.ErrTxnNoFee, - wallet.ErrSpendingUnconfirmed, - wallet.ErrInsufficientBalance, - wallet.ErrWalletNotEncrypted, - wallet.ErrMissingPassword, - wallet.ErrWalletEncrypted: - wh.Error400(w, err.Error()) - return - case wallet.ErrInvalidPassword: - wh.Error401(w, HTTP401AuthHeader, err.Error()) - return - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - return - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - return - default: - wh.Error500(w, err.Error()) - return - } - - txStr, err := visor.TransactionToJSON(*tx) - if err != nil { - logger.Error(err) - wh.SendJSONOr500(logger, w, SpendResult{ - Error: err.Error(), - }) - return - } - - logger.Infof("Spend: \ntx= \n %s \n", txStr) - - var ret SpendResult - - ret.Transaction, err = visor.NewReadableTransaction(&visor.Transaction{Txn: *tx}) - if err != nil { - err = fmt.Errorf("Creation of new readable transaction failed: %v", err) - logger.Error(err) - ret.Error = err.Error() - wh.SendJSONOr500(logger, w, ret) - return - } - - // Get the new wallet balance - b, err := gateway.GetWalletBalance(wltID) - if err != nil { - err = fmt.Errorf("Get wallet balance failed: %v", err) - logger.Error(err) - ret.Error = err.Error() - wh.SendJSONOr500(logger, w, ret) - return - } - ret.Balance = &b - - wh.SendJSONOr500(logger, w, ret) - } -} - -// Loads wallet from seed, will scan ahead N address and -// load addresses till the last one that have coins. -// Method: POST -// Args: -// seed: wallet seed [required] -// label: wallet label [required] -// scan: the number of addresses to scan ahead for balances [optional, must be > 0] -// encrypt: bool value, whether encrypt the wallet [optional] -// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] -func walletCreate(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - seed := r.FormValue("seed") - if seed == "" { - wh.Error400(w, "missing seed") - return - } - - label := r.FormValue("label") - if label == "" { - wh.Error400(w, "missing label") - return - } - - password := r.FormValue("password") - defer func() { - password = "" - }() - - var encrypt bool - encryptStr := r.FormValue("encrypt") - if encryptStr != "" { - var err error - encrypt, err = strconv.ParseBool(encryptStr) - if err != nil { - wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) - return - } - } - - if encrypt && len(password) == 0 { - wh.Error400(w, "missing password") - return - } - - if !encrypt && len(password) > 0 { - wh.Error400(w, "encrypt must be true as password is provided") - return - } - - scanNStr := r.FormValue("scan") - var scanN uint64 = 1 - if scanNStr != "" { - var err error - scanN, err = strconv.ParseUint(scanNStr, 10, 64) - if err != nil { - wh.Error400(w, "invalid scan value") - return - } - } - - if scanN == 0 { - wh.Error400(w, "scan must be > 0") - return - } - - wlt, err := gateway.CreateWallet("", wallet.Options{ - Seed: seed, - Label: label, - Encrypt: encrypt, - Password: []byte(password), - ScanN: scanN, - }) - if err != nil { - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - return - default: - wh.Error400(w, err.Error()) - return - } - } - - rlt, err := NewWalletResponse(wlt) - if err != nil { - wh.Error500(w, err.Error()) - return - } - wh.SendJSONOr500(logger, w, rlt) - } -} - -// Genreates new addresses -// URI: /wallet/newAddress -// Method: POST -// Args: -// id: wallet id [required] -// num: number of address need to create [optional, if not set the default value is 1] -// password: wallet password [optional, must be provided if the wallet is encrypted] -func walletNewAddresses(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, "missing wallet id") - return - } - - // the number of address that need to create, default is 1 - var n uint64 = 1 - var err error - num := r.FormValue("num") - if num != "" { - n, err = strconv.ParseUint(num, 10, 64) - if err != nil { - wh.Error400(w, "invalid num value") - return - } - } - - password := r.FormValue("password") - defer func() { - password = "" - }() - - addrs, err := gateway.NewAddresses(wltID, []byte(password), n) - if err != nil { - switch err { - case wallet.ErrInvalidPassword: - wh.Error401(w, HTTP401AuthHeader, err.Error()) - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error400(w, err.Error()) - } - return - } - - var rlt = struct { - Addresses []string `json:"addresses"` - }{} - - for _, a := range addrs { - rlt.Addresses = append(rlt.Addresses, a.String()) - } - - wh.SendJSONOr500(logger, w, rlt) - return - } -} - -// Update wallet label -// URI: /wallet/update -// Method: POST -// Args: -// id: wallet id [required] -// label: the label the wallet will be updated to [required] -func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - // Update wallet - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, "missing wallet id") - return - } - - label := r.FormValue("label") - if label == "" { - wh.Error400(w, "missing label") - return - } - - if err := gateway.UpdateWalletLabel(wltID, label); err != nil { - logger.Errorf("update wallet label failed: %v", err) - - switch err { - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - wh.SendJSONOr500(logger, w, "success") - } -} - -// Returns a wallet by id -// URI: /wallet -// Method: GET -// Args: -// id: wallet id [required] -func walletGet(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, fmt.Sprintf("missing wallet id")) - return - } - - wlt, err := gateway.GetWallet(wltID) - if err != nil { - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error400(w, err.Error()) - } - return - } - rlt, err := NewWalletResponse(wlt) - if err != nil { - wh.Error500(w, err.Error()) - return - } - wh.SendJSONOr500(logger, w, rlt) - } -} - -// Returns JSON of unconfirmed transactions for user's wallet -// URI: /wallet/transactions -// Method: GET -// Args: -// id: wallet id [required] -func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - wltID := r.FormValue("id") - if wltID == "" { - wh.Error400(w, "missing wallet id") - return - } - - txns, err := gateway.GetWalletUnconfirmedTxns(wltID) - if err != nil { - logger.Errorf("get wallet unconfirmed transactions failed: %v", err) - switch err { - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - unconfirmedTxns, err := visor.NewReadableUnconfirmedTxns(txns) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - unconfirmedTxnResp := UnconfirmedTxnsResponse{ - Transactions: unconfirmedTxns, - } - wh.SendJSONOr500(logger, w, unconfirmedTxnResp) - } -} - -// Returns all loaded wallets -// URI: /wallets -// Method: GET -func walletsHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - wlts, err := gateway.GetWallets() - if err != nil { - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - wrs := make([]*WalletResponse, 0, len(wlts)) - for _, wlt := range wlts { - wr, err := NewWalletResponse(wlt) - if err != nil { - wh.Error500(w, err.Error()) - return - } - - wrs = append(wrs, wr) - } - - sort.Slice(wrs, func(i, j int) bool { - return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp - }) - - wh.SendJSONOr500(logger, w, wrs) - } -} - -// WalletFolder struct -type WalletFolder struct { - Address string `json:"address"` -} - -// Returns the wallet directory path -// URI: /wallets/folderName -// Method: GET -func getWalletFolder(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - addr, err := gateway.GetWalletDir() - if err != nil { - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - ret := WalletFolder{ - Address: addr, - } - wh.SendJSONOr500(logger, w, ret) - } -} - -// Generates wallet seed -// URI: /wallet/newSeed -// Method: GET -// Args: -// entropy: entropy bitsize [optional, default value of 128 will be used if not set] -func newWalletSeed(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodGet { - wh.Error405(w) - return - } - - if !gateway.IsWalletAPIEnabled() { - wh.Error403(w, "") - return - } - - entropyValue := r.FormValue("entropy") - if entropyValue == "" { - entropyValue = "128" - } - - entropyBits, err := strconv.Atoi(entropyValue) - if err != nil { - wh.Error400(w, "invalid entropy") - return - } - - // Entropy bit size can either be 128 or 256 - if entropyBits != 128 && entropyBits != 256 { - wh.Error400(w, "entropy length must be 128 or 256") - return - } - - entropy, err := bip39.NewEntropy(entropyBits) - if err != nil { - err = fmt.Errorf("bip39.NewEntropy failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - mnemonic, err := bip39.NewMnemonic(entropy) - if err != nil { - err = fmt.Errorf("bip39.NewDefaultMnemomic failed: %v", err) - wh.Error500(w, err.Error()) - return - } - - var rlt = struct { - Seed string `json:"seed"` - }{ - mnemonic, - } - wh.SendJSONOr500(logger, w, rlt) - } -} - -// Returns seed of wallet of given id -// URI: /wallet/seed -// Method: POST -// Args: -// id: wallet id -// password: wallet password -func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - id := r.FormValue("id") - if id == "" { - wh.Error400(w, "missing wallet id") - return - } - - password := r.FormValue("password") - defer func() { - password = "" - }() - - seed, err := gateway.GetWalletSeed(id, []byte(password)) - if err != nil { - switch err { - case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: - wh.Error400(w, err.Error()) - case wallet.ErrInvalidPassword: - wh.Error401(w, HTTP401AuthHeader, err.Error()) - case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: - wh.Error403(w, "") - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - v := struct { - Seed string `json:"seed"` - }{ - Seed: seed, - } - - wh.SendJSONOr500(logger, w, v) - } -} - -// Unloads wallet from the wallet service -// URI: /wallet/unload -// Method: POST -// Args: -// id: wallet id -func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - id := r.FormValue("id") - if id == "" { - wh.Error400(w, "missing wallet id") - return - } - - if err := gateway.UnloadWallet(id); err != nil { - switch err { - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - default: - wh.Error500(w, err.Error()) - } - } - } -} - -// Encrypts wallet -// URI: /wallet/encrypt -// Method: POST -// Args: -// id: wallet id -// password: wallet password -func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - id := r.FormValue("id") - if id == "" { - wh.Error400(w, "missing wallet id") - return - } - - password := r.FormValue("password") - defer func() { - password = "" - }() - - wlt, err := gateway.EncryptWallet(id, []byte(password)) - if err != nil { - switch err { - case wallet.ErrWalletEncrypted, wallet.ErrMissingPassword: - wh.Error400(w, err.Error()) - case wallet.ErrInvalidPassword: - wh.Error401(w, HTTP401AuthHeader, err.Error()) - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - // Make sure the sensitive data are wiped - rlt, err := NewWalletResponse(wlt) - if err != nil { - wh.Error500(w, err.Error()) - return - } - wh.SendJSONOr500(logger, w, rlt) - } -} - -// Decrypts wallet -// URI: /wallet/decrypt -// Method: POST -// Args: -// id: wallet id -// password: wallet password -func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - wh.Error405(w) - return - } - - id := r.FormValue("id") - if id == "" { - wh.Error400(w, "missing wallet id") - return - } - - password := r.FormValue("password") - defer func() { - password = "" - }() - - wlt, err := gateway.DecryptWallet(id, []byte(password)) - if err != nil { - switch err { - case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: - wh.Error400(w, err.Error()) - case wallet.ErrInvalidPassword: - wh.Error401(w, HTTP401AuthHeader, err.Error()) - case wallet.ErrWalletAPIDisabled: - wh.Error403(w, "") - case wallet.ErrWalletNotExist: - wh.Error404(w, "") - default: - wh.Error500(w, err.Error()) - } - return - } - - rlt, err := NewWalletResponse(wlt) - if err != nil { - wh.Error500(w, err.Error()) - return - } - wh.SendJSONOr500(logger, w, rlt) - } -} diff --git a/src/gui/wallet_test.go b/src/gui/wallet_test.go deleted file mode 100755 index 02c6bff..0000000 --- a/src/gui/wallet_test.go +++ /dev/null @@ -1,2557 +0,0 @@ -package gui - -import ( - "bytes" - "errors" - "net/http" - "net/http/httptest" - "net/url" - "strconv" - "strings" - "testing" - - "encoding/json" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/util/fee" - "github.com/skycoin/skycoin/src/visor" - "github.com/skycoin/skycoin/src/wallet" -) - -const configuredHost = "127.0.0.1:6420" - -var mxConfig = muxConfig{host: configuredHost, appLoc: "."} - -func TestWalletSpendHandler(t *testing.T) { - type httpBody struct { - WalletID string - Dst string - Coins string - Password string - } - - tt := []struct { - name string - method string - body *httpBody - status int - err string - walletID string - coins uint64 - dst string - password string - gatewaySpendResult *coin.Transaction - gatewaySpendErr error - gatewayGetWalletBalanceResult wallet.BalancePair - gatewayBalanceErr error - spendResult *SpendResult - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - walletID: "0", - }, - { - name: "400 - no walletID", - method: http.MethodPost, - body: &httpBody{}, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - walletID: "0", - }, - { - name: "400 - no dst", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing destination address \"dst\"", - walletID: "0", - }, - { - name: "400 - bad dst addr", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: " 2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid destination address: Invalid base58 character", - walletID: "0", - }, - { - name: "400 - no coins", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid \"coins\" value", - walletID: "0", - }, - { - name: "400 - coins is string", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "foo", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid \"coins\" value", - walletID: "0", - }, - { - name: "400 - coins is negative value", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "-123", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid \"coins\" value", - walletID: "0", - }, - { - name: "400 - zero coins", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "0", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid \"coins\" value, must > 0", - walletID: "0", - }, - { - name: "400 - gw spend error txn no fee", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - Transaction has zero coinhour fee", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: fee.ErrTxnNoFee, - spendResult: &SpendResult{ - Error: fee.ErrTxnNoFee.Error(), - }, - }, - { - name: "400 - gw spend error spending unconfirmed", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - please spend after your pending transaction is confirmed", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: wallet.ErrSpendingUnconfirmed, - spendResult: &SpendResult{ - Error: wallet.ErrSpendingUnconfirmed.Error(), - }, - }, - { - name: "400 - gw spend error insufficient balance", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - balance is not sufficient", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: wallet.ErrInsufficientBalance, - spendResult: &SpendResult{ - Error: wallet.ErrInsufficientBalance.Error(), - }, - }, - { - name: "404 - gw spend error wallet not exist", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusNotFound, - err: "404 Not Found", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: wallet.ErrWalletNotExist, - spendResult: &SpendResult{ - Error: wallet.ErrWalletNotExist.Error(), - }, - }, - { - name: "500 - gw spend error", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - Spend error", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: errors.New("Spend error"), - spendResult: &SpendResult{ - Error: "Spend error", - }, - }, - { - name: "200 - gw GetWalletBalance error", - method: http.MethodPost, - body: &httpBody{ - WalletID: "1234", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusOK, - walletID: "1234", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendResult: &coin.Transaction{}, - gatewayBalanceErr: errors.New("GetWalletBalance error"), - spendResult: &SpendResult{ - Error: "Get wallet balance failed: GetWalletBalance error", - Transaction: &visor.ReadableTransaction{ - Sigs: []string{}, - In: []string{}, - Out: []visor.ReadableTransactionOutput{}, - Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", - InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", - }, - }, - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodPost, - body: &httpBody{ - WalletID: "123", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "123", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendErr: wallet.ErrWalletAPIDisabled, - spendResult: &SpendResult{ - Error: wallet.ErrWalletAPIDisabled.Error(), - }, - }, - { - name: "200 - OK", - method: http.MethodPost, - body: &httpBody{ - WalletID: "1234", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusOK, - walletID: "1234", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendResult: &coin.Transaction{}, - spendResult: &SpendResult{ - Balance: &wallet.BalancePair{}, - Transaction: &visor.ReadableTransaction{ - Length: 0, - Type: 0, - Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", - InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", - Timestamp: 0, - Sigs: []string{}, - In: []string{}, - Out: []visor.ReadableTransactionOutput{}, - }, - }, - }, - { - name: "200 - OK - CSRF disabled", - method: http.MethodPost, - body: &httpBody{ - WalletID: "1234", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "12", - }, - status: http.StatusOK, - walletID: "1234", - coins: 12, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - gatewaySpendResult: &coin.Transaction{}, - spendResult: &SpendResult{ - Balance: &wallet.BalancePair{}, - Transaction: &visor.ReadableTransaction{ - Length: 0, - Type: 0, - Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", - InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", - Timestamp: 0, - Sigs: []string{}, - In: []string{}, - Out: []visor.ReadableTransactionOutput{}, - }, - }, - csrfDisabled: true, - }, - { - name: "400 - missing password", - method: http.MethodPost, - body: &httpBody{ - WalletID: "wallet.wlt", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "1", - }, - status: http.StatusBadRequest, - gatewaySpendErr: wallet.ErrMissingPassword, - err: "400 Bad Request - missing password", - walletID: "wallet.wlt", - coins: 1, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - spendResult: &SpendResult{ - Error: wallet.ErrMissingPassword.Error(), - }, - }, - { - name: "401 Unauthorized - invalid password", - method: http.MethodPost, - body: &httpBody{ - WalletID: "wallet.wlt", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "1", - Password: "pwd", - }, - password: "pwd", - status: http.StatusUnauthorized, - gatewaySpendErr: wallet.ErrInvalidPassword, - err: "401 Unauthorized - invalid password", - walletID: "wallet.wlt", - coins: 1, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - spendResult: &SpendResult{ - Error: wallet.ErrInvalidPassword.Error(), - }, - }, - { - name: "400 - wallet is encrypted", - method: http.MethodPost, - body: &httpBody{ - WalletID: "wallet.wlt", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "1", - }, - status: http.StatusBadRequest, - gatewaySpendErr: wallet.ErrWalletEncrypted, - err: "400 Bad Request - wallet is encrypted", - walletID: "wallet.wlt", - coins: 1, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - spendResult: &SpendResult{ - Error: wallet.ErrWalletEncrypted.Error(), - }, - }, - { - name: "400 - wallet is not encrypted", - method: http.MethodPost, - body: &httpBody{ - WalletID: "wallet.wlt", - Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - Coins: "1", - Password: "pwd", - }, - password: "pwd", - status: http.StatusBadRequest, - gatewaySpendErr: wallet.ErrWalletNotEncrypted, - err: "400 Bad Request - wallet is not encrypted", - walletID: "wallet.wlt", - coins: 1, - dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", - spendResult: &SpendResult{ - Error: wallet.ErrWalletNotEncrypted.Error(), - }, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - if tc.gatewaySpendResult == nil { - tc.gatewaySpendResult = &coin.Transaction{} - } - - gateway := &GatewayerMock{} - addr, _ := cipher.DecodeBase58Address(tc.dst) - gateway.On("Spend", tc.walletID, []byte(tc.password), tc.coins, addr).Return(tc.gatewaySpendResult, tc.gatewaySpendErr) - gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult, tc.gatewayBalanceErr) - - endpoint := "/wallet/spend" - - v := url.Values{} - if tc.body != nil { - if tc.body.WalletID != "" { - v.Add("id", tc.body.WalletID) - } - if tc.body.Dst != "" { - v.Add("dst", tc.body.Dst) - } - if tc.body.Coins != "" { - v.Add("coins", tc.body.Coins) - } - if tc.body.Password != "" { - v.Add("password", tc.body.Password) - } - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) - if status == http.StatusUnauthorized { - require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) - } - } else { - var msg SpendResult - err := json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, *tc.spendResult, msg) - } - }) - } -} - -func TestWalletGet(t *testing.T) { - entries, resEntries := makeEntries([]byte("seed"), 5) - type httpBody struct { - WalletID string - Dst string - Coins string - } - - tt := []struct { - name string - method string - url string - body *httpBody - status int - err string - walletID string - gatewayGetWalletResult wallet.Wallet - responseBody WalletResponse - gatewayGetWalletErr error - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - walletID: "0", - }, - { - name: "400 - no walletID", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - walletID: "", - }, - { - name: "400 - error from the `gateway.GetWallet(wltID)`", - method: http.MethodGet, - body: &httpBody{ - WalletID: "123", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - wallet 123 doesn't exist", - walletID: "123", - gatewayGetWalletErr: errors.New("wallet 123 doesn't exist"), - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodGet, - body: &httpBody{ - WalletID: "1234", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "1234", - gatewayGetWalletResult: wallet.Wallet{ - Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, - Entries: []wallet.Entry{}, - }, - gatewayGetWalletErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 - OK", - method: http.MethodGet, - body: &httpBody{ - WalletID: "1234", - }, - status: http.StatusOK, - walletID: "1234", - gatewayGetWalletResult: wallet.Wallet{ - Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, - Entries: cloneEntries(entries), - }, - responseBody: WalletResponse{Entries: resEntries[:]}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("GetWallet", tc.walletID).Return(&tc.gatewayGetWalletResult, tc.gatewayGetWalletErr) - v := url.Values{} - - endpoint := "/wallet" - - if tc.body != nil { - if tc.body.WalletID != "" { - v.Add("id", tc.body.WalletID) - } - } - - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), - "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var rlt WalletResponse - err = json.Unmarshal(rr.Body.Bytes(), &rlt) - require.NoError(t, err) - require.Equal(t, tc.responseBody, rlt) - } - }) - } -} - -func TestWalletBalanceHandler(t *testing.T) { - type httpBody struct { - WalletID string - Dst string - Coins string - } - - tt := []struct { - name string - method string - body *httpBody - status int - err string - walletID string - gatewayGetWalletBalanceResult wallet.BalancePair - gatewayBalanceErr error - result *wallet.BalancePair - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - walletID: "0", - }, - { - name: "400 - no walletID", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - walletID: "0", - }, - { - name: "404 - gw `wallet doesn't exist` error", - method: http.MethodGet, - body: &httpBody{ - WalletID: "notFoundId", - }, - status: http.StatusNotFound, - err: "404 Not Found", - walletID: "notFoundId", - gatewayGetWalletBalanceResult: wallet.BalancePair{ - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - gatewayBalanceErr: wallet.ErrWalletNotExist, - result: &wallet.BalancePair{ - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - }, - { - name: "500 - gw other error", - method: http.MethodGet, - body: &httpBody{ - WalletID: "someId", - }, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gatewayBalanceError", - walletID: "someId", - gatewayGetWalletBalanceResult: wallet.BalancePair{ - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - gatewayBalanceErr: errors.New("gatewayBalanceError"), - result: &wallet.BalancePair{ - Confirmed: wallet.Balance{Coins: 0, Hours: 0}, - Predicted: wallet.Balance{Coins: 0, Hours: 0}, - }, - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "foo", - gatewayGetWalletBalanceResult: wallet.BalancePair{}, - gatewayBalanceErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 - OK", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusOK, - err: "", - walletID: "foo", - result: &wallet.BalancePair{}, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult, tc.gatewayBalanceErr) - - endpoint := "/wallet/balance" - - v := url.Values{} - if tc.body != nil { - if tc.body.WalletID != "" { - v.Add("id", tc.body.WalletID) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - if status != tc.status { - t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - } - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg wallet.BalancePair - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.result, &msg, tc.name) - } - }) - } -} - -func TestUpdateWalletLabelHandler(t *testing.T) { - type httpBody struct { - WalletID string - Label string - } - - tt := []struct { - name string - method string - url string - body *httpBody - status int - err string - walletID string - label string - gatewayUpdateWalletLabelErr error - responseBody string - }{ - { - name: "405", - method: http.MethodGet, - body: &httpBody{}, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - missing wallet id", - method: http.MethodPost, - body: &httpBody{}, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - }, - { - name: "400 - missing label", - method: http.MethodPost, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing label", - walletID: "foo", - }, - { - name: "404 - gateway.UpdateWalletLabel ErrWalletNotExist", - method: http.MethodPost, - body: &httpBody{ - WalletID: "foo", - Label: "label", - }, - status: http.StatusNotFound, - err: "404 Not Found", - walletID: "foo", - label: "label", - gatewayUpdateWalletLabelErr: wallet.ErrWalletNotExist, - }, - { - name: "500 - gateway.UpdateWalletLabel error", - method: http.MethodPost, - body: &httpBody{ - WalletID: "foo", - Label: "label", - }, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.UpdateWalletLabel error", - walletID: "foo", - label: "label", - gatewayUpdateWalletLabelErr: errors.New("gateway.UpdateWalletLabel error"), - }, - { - name: "403 Forbidden - wallet API disabled", - method: http.MethodPost, - body: &httpBody{ - WalletID: "foo", - Label: "label", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "foo", - label: "label", - gatewayUpdateWalletLabelErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 OK", - method: http.MethodPost, - body: &httpBody{ - WalletID: "foo", - Label: "label", - }, - status: http.StatusOK, - err: "", - walletID: "foo", - label: "label", - gatewayUpdateWalletLabelErr: nil, - responseBody: "\"success\"", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("UpdateWalletLabel", tc.walletID, tc.label).Return(tc.gatewayUpdateWalletLabelErr) - - endpoint := "/wallet/update" - - v := url.Values{} - if tc.body != nil { - if tc.body.WalletID != "" { - v.Add("id", tc.body.WalletID) - } - if tc.body.Label != "" { - v.Add("label", tc.body.Label) - } - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - require.Equal(t, tc.responseBody, rr.Body.String(), tc.name) - } - }) - } -} - -func TestWalletTransactionsHandler(t *testing.T) { - type httpBody struct { - WalletID string - } - - unconfirmedTxn, _ := visor.NewReadableUnconfirmedTxn(&visor.UnconfirmedTxn{}) - tt := []struct { - name string - method string - body *httpBody - status int - err string - walletID string - gatewayGetWalletUnconfirmedTxnsResult []visor.UnconfirmedTxn - gatewayGetWalletUnconfirmedTxnsErr error - responseBody UnconfirmedTxnsResponse - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - missing wallet id", - method: http.MethodGet, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - }, - { - name: "500 - gateway.GetWalletUnconfirmedTxns error", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusInternalServerError, - err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTxns error", - walletID: "foo", - gatewayGetWalletUnconfirmedTxnsErr: errors.New("gateway.GetWalletUnconfirmedTxns error"), - }, - { - name: "404 - wallet doesn't exist", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusNotFound, - err: "404 Not Found", - walletID: "foo", - gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletNotExist, - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "foo", - gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 - OK", - method: http.MethodGet, - body: &httpBody{ - WalletID: "foo", - }, - status: http.StatusOK, - err: "", - walletID: "foo", - gatewayGetWalletUnconfirmedTxnsResult: make([]visor.UnconfirmedTxn, 1), - responseBody: UnconfirmedTxnsResponse{Transactions: []visor.ReadableUnconfirmedTxn{*unconfirmedTxn}}, - }, - } - - for _, tc := range tt { - gateway := &GatewayerMock{} - gateway.On("GetWalletUnconfirmedTxns", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsResult, tc.gatewayGetWalletUnconfirmedTxnsErr) - - endpoint := "/wallet/transactions" - - v := url.Values{} - if tc.body != nil { - if tc.body.WalletID != "" { - v.Add("id", tc.body.WalletID) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg UnconfirmedTxnsResponse - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response - require.IsType(t, msg, tc.responseBody) - require.Len(t, msg.Transactions, 1) - require.Equal(t, msg.Transactions[0].Txn, tc.responseBody.Transactions[0].Txn) - } - } -} - -func TestWalletCreateHandler(t *testing.T) { - entries, responseEntries := makeEntries([]byte("seed"), 5) - type httpBody struct { - Seed string - Label string - ScanN string - Encrypt bool - Password string - } - tt := []struct { - name string - method string - body *httpBody - status int - err string - wltName string - options wallet.Options - gatewayCreateWalletResult wallet.Wallet - gatewayCreateWalletErr error - scanWalletAddressesResult wallet.Wallet - scanWalletAddressesError error - responseBody WalletResponse - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - wltName: "foo", - }, - { - name: "400 - missing seed", - method: http.MethodPost, - body: &httpBody{}, - status: http.StatusBadRequest, - err: "400 Bad Request - missing seed", - wltName: "foo", - }, - { - name: "400 - missing label", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing label", - wltName: "foo", - }, - { - name: "400 - invalid scan value", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "bad scanN", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid scan value", - wltName: "foo", - }, - { - name: "400 - scan must be > 0", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "0", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - scan must be > 0", - wltName: "foo", - }, - { - name: "400 - gateway.CreateWallet error", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "1", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - gateway.CreateWallet error", - options: wallet.Options{ - Label: "bar", - Seed: "foo", - Password: []byte{}, - }, - gatewayCreateWalletErr: errors.New("gateway.CreateWallet error"), - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "2", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - wltName: "filename", - options: wallet.Options{ - Label: "bar", - Seed: "foo", - Password: []byte{}, - ScanN: 2, - }, - gatewayCreateWalletErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 - OK", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "2", - }, - status: http.StatusOK, - err: "", - wltName: "filename", - options: wallet.Options{ - Label: "bar", - Seed: "foo", - Password: []byte{}, - ScanN: 2, - }, - gatewayCreateWalletResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - }, - Entries: cloneEntries(entries), - }, - scanWalletAddressesResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - }, - Entries: cloneEntries(entries), - }, - responseBody: WalletResponse{ - Meta: WalletMeta{ - Filename: "filename", - }, - Entries: responseEntries[:], - }, - }, - // CSRF Tests - { - name: "200 - OK - CSRF disabled", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - ScanN: "2", - }, - status: http.StatusOK, - err: "", - wltName: "filename", - options: wallet.Options{ - Label: "bar", - Seed: "foo", - Password: []byte{}, - ScanN: 2, - }, - gatewayCreateWalletResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - }, - }, - scanWalletAddressesResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - }, - }, - responseBody: WalletResponse{ - Meta: WalletMeta{ - Filename: "filename", - }, - }, - csrfDisabled: true, - }, - { - name: "200 - OK - Encrypted", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - Encrypt: true, - Password: "pwd", - ScanN: "2", - }, - status: http.StatusOK, - err: "", - wltName: "filename", - options: wallet.Options{ - Label: "bar", - Seed: "foo", - Encrypt: true, - Password: []byte("pwd"), - ScanN: 2, - }, - gatewayCreateWalletResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - "label": "bar", - "encrypted": "true", - "secrets": "secrets", - }, - }, - scanWalletAddressesResult: wallet.Wallet{ - Meta: map[string]string{ - "filename": "filename", - "label": "bar", - "encrypted": "true", - "secrets": "secrets", - }, - }, - responseBody: WalletResponse{ - Meta: WalletMeta{ - Filename: "filename", - Label: "bar", - Encrypted: true, - }, - }, - }, - { - name: "400 Bad request - encrypt without password", - method: http.MethodPost, - body: &httpBody{ - Seed: "foo", - Label: "bar", - Encrypt: true, - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing password", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - if tc.options.ScanN == 0 { - tc.options.ScanN = 1 - } - gateway.On("CreateWallet", "", tc.options).Return(&tc.gatewayCreateWalletResult, tc.gatewayCreateWalletErr) - // gateway.On("ScanAheadWalletAddresses", tc.wltName, tc.options.Password, tc.scnN-1).Return(&tc.scanWalletAddressesResult, tc.scanWalletAddressesError) - - endpoint := "/wallet/create" - - v := url.Values{} - if tc.body != nil { - if tc.body.Seed != "" { - v.Add("seed", tc.body.Seed) - } - if tc.body.Label != "" { - v.Add("label", tc.body.Label) - } - if tc.body.ScanN != "" { - v.Add("scan", tc.body.ScanN) - } - - if tc.body.Encrypt { - v.Add("encrypt", strconv.FormatBool(tc.body.Encrypt)) - } - - if tc.body.Password != "" { - v.Add("password", tc.body.Password) - } - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), - "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg WalletResponse - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.responseBody, msg, tc.name) - } - - }) - } -} - -func TestWalletNewSeed(t *testing.T) { - type httpBody struct { - Entropy string - } - tt := []struct { - name string - method string - body *httpBody - status int - err string - entropy string - resultLen int - }{ - { - name: "405", - method: http.MethodPut, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - invalid entropy type", - method: http.MethodGet, - body: &httpBody{ - Entropy: "xx", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid entropy", - entropy: "xx", - }, - { - name: "400 - `wrong entropy length` error", - method: http.MethodGet, - body: &httpBody{ - Entropy: "200", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - entropy length must be 128 or 256", - entropy: "200", - }, - { - name: "200 - OK with no entropy", - method: http.MethodGet, - body: &httpBody{}, - status: http.StatusOK, - entropy: "128", - resultLen: 12, - }, - { - name: "200 - OK | 12 word seed", - method: http.MethodGet, - body: &httpBody{ - Entropy: "128", - }, - status: http.StatusOK, - entropy: "128", - resultLen: 12, - }, - { - name: "200 - OK | 24 word seed", - method: http.MethodGet, - body: &httpBody{ - Entropy: "256", - }, - status: http.StatusOK, - entropy: "256", - resultLen: 24, - }, - } - - // Loop over each test case - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("IsWalletAPIEnabled").Return(true) - - endpoint := "/wallet/newSeed" - - // Add request parameters to url - v := url.Values{} - if tc.body != nil { - if tc.body.Entropy != "" { - v.Add("entropy", tc.body.Entropy) - } - } - if len(v) > 0 { - endpoint += "?" + v.Encode() - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` expected `%v`", tc.name, status, tc.status) - if status != tc.status { - t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) - } - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, expected `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg struct { - Seed string `json:"seed"` - } - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - // check that expected length is equal to response length - require.Equal(t, tc.resultLen, len(strings.Fields(msg.Seed)), tc.name) - } - }) - } -} - -func TestGetWalletSeed(t *testing.T) { - type gatewayReturnPair struct { - seed string - err error - } - - tt := []struct { - name string - method string - wltID string - password string - gatewayReturnArgs []interface{} - expectStatus int - expectSeed string - expectErr string - csrfDisabled bool - }{ - { - name: "200 - OK", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturnArgs: []interface{}{ - "seed", - nil, - }, - expectStatus: http.StatusOK, - expectSeed: "seed", - }, - { - name: "200 - OK - CSRF disabled", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturnArgs: []interface{}{ - "seed", - nil, - }, - expectStatus: http.StatusOK, - expectSeed: "seed", - csrfDisabled: true, - }, - { - name: "400 - missing wallet id ", - method: http.MethodPost, - wltID: "", - password: "pwd", - gatewayReturnArgs: []interface{}{}, - expectStatus: http.StatusBadRequest, - expectErr: "400 Bad Request - missing wallet id", - }, - { - name: "400 - missing password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "", - gatewayReturnArgs: []interface{}{ - nil, - wallet.ErrMissingPassword, - }, - expectStatus: http.StatusBadRequest, - expectErr: "400 Bad Request - missing password", - }, - { - name: "401 Unauthorized - Invalid password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturnArgs: []interface{}{ - nil, - wallet.ErrInvalidPassword, - }, - expectStatus: http.StatusUnauthorized, - expectErr: "401 Unauthorized - invalid password", - }, - { - name: "400 - wallet not encrypted", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturnArgs: []interface{}{ - nil, - wallet.ErrWalletNotEncrypted, - }, - expectStatus: http.StatusBadRequest, - expectErr: "400 Bad Request - wallet is not encrypted", - }, - { - name: "404 - wallet does not exist", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturnArgs: []interface{}{ - nil, - wallet.ErrWalletNotExist, - }, - expectStatus: http.StatusNotFound, - expectErr: "404 Not Found", - }, - { - name: "405 - Method Not Allowed", - method: http.MethodGet, - expectStatus: http.StatusMethodNotAllowed, - expectErr: "405 Method Not Allowed", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - gateway.On("GetWalletSeed", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturnArgs...) - - endpoint := "/wallet/seed" - - v := url.Values{} - v.Add("id", tc.wltID) - if len(tc.password) > 0 { - v.Add("password", tc.password) - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.expectStatus, status) - - if status != http.StatusOK { - require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) - if status == http.StatusUnauthorized { - require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) - } - } else { - var r struct { - Seed string `json:"seed"` - } - err := json.Unmarshal(rr.Body.Bytes(), &r) - require.NoError(t, err) - require.Equal(t, tc.expectSeed, r.Seed) - } - }) - } -} - -func TestWalletNewAddressesHandler(t *testing.T) { - type httpBody struct { - ID string - Num string - Password string - } - type Addresses struct { - Address []string `json:"addresses"` - } - - var responseAddresses = Addresses{} - var responseEmptyAddresses = Addresses{} - - var emptyAddrs = make([]cipher.Address, 0) - var addrs = make([]cipher.Address, 3) - - for i := 0; i < 3; i++ { - pub, _ := cipher.GenerateDeterministicKeyPair(cipher.RandByte(32)) - addrs[i] = cipher.AddressFromPubKey(pub) - responseAddresses.Address = append(responseAddresses.Address, addrs[i].String()) - } - - tt := []struct { - name string - method string - body *httpBody - status int - err string - walletID string - n uint64 - password string - gatewayNewAddressesResult []cipher.Address - gatewayNewAddressesErr error - responseBody Addresses - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "400 - missing wallet id", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - }, - { - name: "400 - invalid num value", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "bar", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - invalid num value", - }, - { - name: "400 - gateway.NewAddresses error", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - gateway.NewAddresses error", - walletID: "foo", - n: 1, - gatewayNewAddressesErr: errors.New("gateway.NewAddresses error"), - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "foo", - n: 1, - gatewayNewAddressesErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "400 Bad Request - missing password", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusBadRequest, - err: "400 Bad Request - missing password", - walletID: "foo", - n: 1, - gatewayNewAddressesErr: wallet.ErrMissingPassword, - }, - { - name: "401 Unauthorized - Invalid password", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusUnauthorized, - err: "401 Unauthorized - invalid password", - walletID: "foo", - n: 1, - gatewayNewAddressesErr: wallet.ErrInvalidPassword, - }, - { - name: "200 - OK", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusOK, - walletID: "foo", - n: 1, - gatewayNewAddressesResult: addrs, - responseBody: responseAddresses, - }, - { - name: "200 - OK with password", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - Password: "pwd", - }, - status: http.StatusOK, - walletID: "foo", - n: 1, - gatewayNewAddressesResult: addrs, - responseBody: responseAddresses, - }, - { - name: "200 - OK empty addresses", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "0", - }, - status: http.StatusOK, - walletID: "foo", - n: 0, - gatewayNewAddressesResult: emptyAddrs, - responseBody: responseEmptyAddresses, - }, - { - name: "200 - OK - CSRF disabled", - method: http.MethodPost, - body: &httpBody{ - ID: "foo", - Num: "1", - }, - status: http.StatusOK, - walletID: "foo", - n: 1, - gatewayNewAddressesResult: addrs, - responseBody: responseAddresses, - csrfDisabled: true, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("NewAddresses", tc.walletID, []byte(tc.password), tc.n).Return(tc.gatewayNewAddressesResult, tc.gatewayNewAddressesErr) - - endpoint := "/wallet/newAddress" - - v := url.Values{} - if tc.body != nil { - if tc.body.ID != "" { - v.Add("id", tc.body.ID) - } - if tc.body.Num != "" { - v.Add("num", tc.body.Num) - } - } - - req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - if status == http.StatusUnauthorized { - require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) - } - } else { - var msg Addresses - err = json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.responseBody, msg, tc.name) - } - }) - } -} - -func TestGetWalletFolderHandler(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - getWalletDirResponse string - getWalletDirErr error - httpResponse WalletFolder - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - getWalletDirResponse: "/wallet/folder/address", - httpResponse: WalletFolder{ - Address: "/wallet/folder/address", - }, - }, - { - name: "403 - wallet API disabled", - method: http.MethodGet, - status: http.StatusForbidden, - err: "403 Forbidden", - getWalletDirErr: wallet.ErrWalletAPIDisabled, - }, - } - - for _, tc := range tt { - gateway := &GatewayerMock{} - gateway.On("GetWalletDir").Return(tc.getWalletDirResponse, tc.getWalletDirErr) - - endpoint := "/wallets/folderName" - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg WalletFolder - json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - } -} - -func TestGetWallets(t *testing.T) { - var pubkeys []cipher.PubKey - var seckeys []cipher.SecKey - var addrs []cipher.Address - - for i := 0; i < 4; i++ { - pubkey, seckey := cipher.GenerateKeyPair() - addr := cipher.AddressFromPubKey(pubkey) - pubkeys = append(pubkeys, pubkey) - seckeys = append(seckeys, seckey) - addrs = append(addrs, addr) - } - - cases := []struct { - name string - method string - status int - err string - getWalletsResponse wallet.Wallets - getWalletsErr error - httpResponse []*WalletResponse - }{ - { - name: "405", - method: http.MethodPost, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - }, - - { - name: "403 - wallet API disabled", - method: http.MethodGet, - status: http.StatusForbidden, - err: "403 Forbidden", - getWalletsErr: wallet.ErrWalletAPIDisabled, - }, - - { - name: "200 no wallets", - method: http.MethodGet, - status: http.StatusOK, - getWalletsResponse: nil, - httpResponse: []*WalletResponse{}, - }, - - { - name: "200 no wallets 2", - method: http.MethodGet, - status: http.StatusOK, - getWalletsResponse: wallet.Wallets{}, - httpResponse: []*WalletResponse{}, - }, - - { - name: "200", - method: http.MethodGet, - status: http.StatusOK, - getWalletsResponse: wallet.Wallets{ - "foofilename": { - Meta: map[string]string{ - "foo": "bar", - "seed": "fooseed", - "lastSeed": "foolastseed", - "coin": "foocoin", - "filename": "foofilename", - "label": "foolabel", - "type": "footype", - "version": "fooversion", - "cryptoType": "foocryptotype", - "tm": "345678", - "encrypted": "true", - }, - Entries: []wallet.Entry{ - { - Address: addrs[0], - Public: pubkeys[0], - Secret: seckeys[0], - }, - }, - }, - "foofilename2": { - Meta: map[string]string{ - "foo": "bar2", - "seed": "fooseed2", - "lastSeed": "foolastseed2", - "coin": "foocoin", - "filename": "foofilename2", - "label": "foolabel2", - "type": "footype", - "version": "fooversion", - "cryptoType": "foocryptotype", - "tm": "123456", - "encrypted": "false", - }, - Entries: []wallet.Entry{ - { - Address: addrs[1], - Public: pubkeys[1], - Secret: seckeys[1], - }, - }, - }, - "foofilename3": { - Meta: map[string]string{ - "foo": "bar3", - "seed": "fooseed3", - "lastSeed": "foolastseed3", - "coin": "foocoin", - "filename": "foofilename3", - "label": "foolabel3", - "type": "footype", - "version": "fooversion", - "cryptoType": "foocryptotype", - "tm": "234567", - "encrypted": "true", - }, - Entries: []wallet.Entry{ - { - Address: addrs[2], - Public: pubkeys[2], - Secret: seckeys[2], - }, - { - Address: addrs[3], - Public: pubkeys[3], - Secret: seckeys[3], - }, - }, - }, - }, - httpResponse: []*WalletResponse{ - { - Meta: WalletMeta{ - Coin: "foocoin", - Filename: "foofilename2", - Label: "foolabel2", - Type: "footype", - Version: "fooversion", - CryptoType: "foocryptotype", - Timestamp: 123456, - Encrypted: false, - }, - Entries: []WalletEntry{ - { - Address: addrs[1].String(), - Public: pubkeys[1].Hex(), - }, - }, - }, - { - Meta: WalletMeta{ - Coin: "foocoin", - Filename: "foofilename3", - Label: "foolabel3", - Type: "footype", - Version: "fooversion", - CryptoType: "foocryptotype", - Timestamp: 234567, - Encrypted: true, - }, - Entries: []WalletEntry{ - { - Address: addrs[2].String(), - Public: pubkeys[2].Hex(), - }, - { - Address: addrs[3].String(), - Public: pubkeys[3].Hex(), - }, - }, - }, - { - Meta: WalletMeta{ - Coin: "foocoin", - Filename: "foofilename", - Label: "foolabel", - Type: "footype", - Version: "fooversion", - CryptoType: "foocryptotype", - Timestamp: 345678, - Encrypted: true, - }, - Entries: []WalletEntry{ - { - Address: addrs[0].String(), - Public: pubkeys[0].Hex(), - }, - }, - }, - }, - }, - } - - for _, tc := range cases { - gateway := &GatewayerMock{} - gateway.On("GetWallets").Return(tc.getWalletsResponse, tc.getWalletsErr) - - endpoint := "/wallets" - - req, err := http.NewRequest(tc.method, endpoint, nil) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", - tc.name, status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } else { - var msg []*WalletResponse - json.Unmarshal(rr.Body.Bytes(), &msg) - require.NoError(t, err) - require.NotNil(t, msg) - require.Equal(t, tc.httpResponse, msg, tc.name) - } - } -} - -func TestWalletUnloadHandler(t *testing.T) { - tt := []struct { - name string - method string - status int - err string - walletID string - unloadWalletErr error - csrfDisabled bool - }{ - { - name: "405", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - err: "405 Method Not Allowed", - walletID: "wallet.wlt", - }, - { - name: "400 - missing wallet id", - method: http.MethodPost, - status: http.StatusBadRequest, - err: "400 Bad Request - missing wallet id", - }, - { - name: "403 - Forbidden - wallet API disabled", - method: http.MethodPost, - status: http.StatusForbidden, - err: "403 Forbidden", - walletID: "wallet.wlt", - unloadWalletErr: wallet.ErrWalletAPIDisabled, - }, - { - name: "200 - ok", - method: http.MethodPost, - status: http.StatusOK, - walletID: "wallet.wlt", - }, - { - name: "200 - ok, csrf disabled", - method: http.MethodPost, - status: http.StatusOK, - walletID: "wallet.wlt", - csrfDisabled: true, - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := &GatewayerMock{} - gateway.On("UnloadWallet", tc.walletID).Return(tc.unloadWalletErr) - - endpoint := "/wallet/unload" - v := url.Values{} - v.Add("id", tc.walletID) - - req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - if csrfStore.Enabled { - setCSRFParameters(csrfStore, tokenValid, req) - } else { - setCSRFParameters(csrfStore, tokenInvalid, req) - } - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", - tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) - } - }) - } -} - -func TestEncryptWallet(t *testing.T) { - entries, responseEntries := makeEntries([]byte("seed"), 5) - type gatewayReturnPair struct { - w *wallet.Wallet - err error - } - tt := []struct { - name string - method string - wltID string - password string - gatewayReturn gatewayReturnPair - status int - expectWallet WalletResponse - expectErr string - }{ - { - name: "200 - OK", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - w: &wallet.Wallet{ - Meta: map[string]string{ - "filename": "wallet.wlt", - "seed": "seed", - "lastSeed": "lastSeed", - "secrets": "secrets", - "encrypted": "true", - }, - Entries: cloneEntries(entries), - }, - }, - status: http.StatusOK, - expectWallet: WalletResponse{ - Meta: WalletMeta{ - Filename: "wallet.wlt", - Encrypted: true, - }, - Entries: responseEntries, - }, - }, - { - name: "403 Forbidden", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletAPIDisabled, - }, - status: http.StatusForbidden, - expectErr: "403 Forbidden", - }, - { - name: "405 Method Not Allowed", - method: http.MethodGet, - wltID: "wallet.wlt", - password: "pwd", - status: http.StatusMethodNotAllowed, - expectErr: "405 Method Not Allowed", - }, - { - name: "400 - Missing Password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrMissingPassword, - }, - status: http.StatusBadRequest, - expectErr: "400 Bad Request - missing password", - }, - { - name: "400 - Missing Wallet Id", - method: http.MethodPost, - wltID: "", - status: http.StatusBadRequest, - expectErr: "400 Bad Request - missing wallet id", - }, - { - name: "401 Unauthorized - Invalid Password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrInvalidPassword, - }, - status: http.StatusUnauthorized, - expectErr: "401 Unauthorized - invalid password", - }, - { - name: "404 - Wallet Not Found", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletNotExist, - }, - status: http.StatusNotFound, - expectErr: "404 Not Found", - }, - { - name: "400 - Wallet Is Encrypted", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletEncrypted, - }, - status: http.StatusBadRequest, - expectErr: "400 Bad Request - wallet is encrypted", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - gateway.On("EncryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) - - endpoint := "/wallet/encrypt" - v := url.Values{} - v.Add("id", tc.wltID) - v.Add("password", tc.password) - - req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: true, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`, body: %v", status, tc.status, rr.Body.String()) - - if status != http.StatusOK { - require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) - if status == http.StatusUnauthorized { - require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) - } - return - } - - var rlt WalletResponse - err = json.NewDecoder(rr.Body).Decode(&rlt) - require.NoError(t, err) - require.Equal(t, tc.expectWallet, rlt) - }) - } -} - -func TestDecryptWallet(t *testing.T) { - entries, responseEntries := makeEntries([]byte("seed"), 5) - type gatewayReturnPair struct { - w *wallet.Wallet - err error - } - - tt := []struct { - name string - method string - wltID string - password string - gatewayReturn gatewayReturnPair - status int - expectWallet WalletResponse - expectErr string - csrfDisabled bool - }{ - { - name: "200 OK", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - w: &wallet.Wallet{ - Meta: map[string]string{ - "filename": "wallet", - "seed": "seed", - "lastSeed": "lastSeed", - "secrets": "", - "encrypted": "false", - }, - Entries: cloneEntries(entries), - }, - }, - status: http.StatusOK, - expectWallet: WalletResponse{ - Meta: WalletMeta{ - Filename: "wallet", - Encrypted: false, - }, - Entries: responseEntries, - }, - }, - { - name: "200 OK CSRF disabled", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - w: &wallet.Wallet{ - Meta: map[string]string{ - "filename": "wallet", - "seed": "seed", - "lastSeed": "lastSeed", - "secrets": "", - "encrypted": "false", - }, - Entries: cloneEntries(entries), - }, - }, - status: http.StatusOK, - expectWallet: WalletResponse{ - Meta: WalletMeta{ - Filename: "wallet", - Encrypted: false, - }, - Entries: responseEntries, - }, - csrfDisabled: true, - }, - - { - name: "403 Forbidden", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletAPIDisabled, - }, - status: http.StatusForbidden, - expectErr: "403 Forbidden", - }, - { - name: "405 Method Not Allowed", - method: http.MethodGet, - status: http.StatusMethodNotAllowed, - expectErr: "405 Method Not Allowed", - }, - { - name: "400 - Missing Wallet ID", - method: http.MethodPost, - wltID: "", - password: "", - status: http.StatusBadRequest, - expectErr: "400 Bad Request - missing wallet id", - }, - { - name: "400 - Missing Password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrMissingPassword, - }, - status: http.StatusBadRequest, - expectErr: "400 Bad Request - missing password", - }, - { - name: "400 - Wallet IS Not Encrypted", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletNotEncrypted, - }, - status: http.StatusBadRequest, - expectErr: "400 Bad Request - wallet is not encrypted", - }, - { - name: "401 Unauthorized - Invalid Password", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrInvalidPassword, - }, - status: http.StatusUnauthorized, - expectErr: "401 Unauthorized - invalid password", - }, - { - name: "404 - Wallet Does Not Exist", - method: http.MethodPost, - wltID: "wallet.wlt", - password: "pwd", - gatewayReturn: gatewayReturnPair{ - err: wallet.ErrWalletNotExist, - }, - status: http.StatusNotFound, - expectErr: "404 Not Found", - }, - } - - for _, tc := range tt { - t.Run(tc.name, func(t *testing.T) { - gateway := NewGatewayerMock() - gateway.On("DecryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) - - endpoint := "/wallet/decrypt" - v := url.Values{} - v.Add("id", tc.wltID) - v.Add("password", tc.password) - - req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) - require.NoError(t, err) - req.Header.Add("Content-Type", "application/x-www-form-urlencoded") - - csrfStore := &CSRFStore{ - Enabled: !tc.csrfDisabled, - } - setCSRFParameters(csrfStore, tokenValid, req) - - rr := httptest.NewRecorder() - handler := newServerMux(mxConfig, gateway, csrfStore, nil) - - handler.ServeHTTP(rr, req) - - status := rr.Code - require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) - - if status != http.StatusOK { - require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) - if status == http.StatusUnauthorized { - require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) - } - return - } - - var r WalletResponse - err = json.NewDecoder(rr.Body).Decode(&r) - require.NoError(t, err) - require.Equal(t, tc.expectWallet, r) - }) - } -} - -// makeEntries derives N wallet address entries from given seed -// Returns set of wallet.Entry and wallet.ReadableEntry, the readable -// entries' secrets are removed. -func makeEntries(seed []byte, n int) ([]wallet.Entry, []WalletEntry) { - seckeys := cipher.GenerateDeterministicKeyPairs(seed, n) - var entries []wallet.Entry - var responseEntries []WalletEntry - for i, seckey := range seckeys { - pubkey := cipher.PubKeyFromSecKey(seckey) - entries = append(entries, wallet.Entry{ - Address: cipher.AddressFromPubKey(pubkey), - Public: pubkey, - Secret: seckey, - }) - responseEntries = append(responseEntries, WalletEntry{ - Address: entries[i].Address.String(), - Public: entries[i].Public.Hex(), - }) - } - return entries, responseEntries -} - -func cloneEntries(es []wallet.Entry) []wallet.Entry { - var entries []wallet.Entry - for _, e := range es { - entries = append(entries, e) - } - return entries -} diff --git a/src/gui/webrpc_test.go b/src/gui/webrpc_test.go deleted file mode 100755 index 17d8521..0000000 --- a/src/gui/webrpc_test.go +++ /dev/null @@ -1,90 +0,0 @@ -package gui - -import ( - "bytes" - "encoding/json" - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/api/webrpc" -) - -func TestWebRPC(t *testing.T) { - type args struct { - httpMethod string - req webrpc.Request - } - - cases := []struct { - name string - status int - args args - want webrpc.Response - }{ - { - name: "http GET", - status: http.StatusOK, - args: args{ - httpMethod: http.MethodGet, - req: webrpc.Request{}, - }, - want: webrpc.Response{ - Jsonrpc: "2.0", - Error: &webrpc.RPCError{ - Code: webrpc.ErrCodeInvalidRequest, - Message: webrpc.ErrMsgNotPost, - }, - }, - }, - - { - name: "invalid jsonrpc", - status: http.StatusOK, - args: args{ - httpMethod: http.MethodPost, - req: webrpc.Request{ - ID: "1", - Jsonrpc: "1.0", - Method: "get_status", - }, - }, - want: webrpc.MakeErrorResponse(webrpc.ErrCodeInvalidParams, webrpc.ErrMsgInvalidJsonrpc), - }, - } - - for _, tc := range cases { - t.Run(tc.name, func(t *testing.T) { - d, err := json.Marshal(tc.args.req) - require.NoError(t, err) - - req, err := http.NewRequest(tc.args.httpMethod, "/webrpc", bytes.NewBuffer(d)) - require.NoError(t, err) - - csrfStore := &CSRFStore{ - Enabled: false, - } - - gateway := NewGatewayerMock() - handler := newServerMux(muxConfig{ - host: configuredHost, - appLoc: ".", - enableJSON20RPC: true, - }, gateway, csrfStore, nil) - - rr := httptest.NewRecorder() - handler.ServeHTTP(rr, req) - - require.Equal(t, tc.status, rr.Code) - - if rr.Code == http.StatusOK { - var res webrpc.Response - err = json.NewDecoder(rr.Body).Decode(&res) - require.NoError(t, err) - require.Equal(t, res, tc.want) - } - }) - } -} diff --git a/src/skycoin/config.go b/src/skycoin/config.go new file mode 100755 index 0000000..1867c66 --- /dev/null +++ b/src/skycoin/config.go @@ -0,0 +1,410 @@ +package skycoin + +import ( + "flag" + "path/filepath" + "runtime" + "strings" + "time" + + "log" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +var ( + help = false +) + +// Config records skycoin node and build config +type Config struct { + Node NodeConfig + Build visor.BuildInfo +} + +// NodeConfig records the node's configuration +type NodeConfig struct { + // Disable peer exchange + DisablePEX bool + // Download peer list + DownloadPeerList bool + // Download the peers list from this URL + PeerListURL string + // Don't make any outgoing connections + DisableOutgoingConnections bool + // Don't allowing incoming connections + DisableIncomingConnections bool + // Disables networking altogether + DisableNetworking bool + // Enable wallet API + EnableWalletAPI bool + // Enable GUI + EnableGUI bool + // Disable CSRF check in the wallet API + DisableCSRF bool + // Enable /api/v1/wallet/seed API endpoint + EnableSeedAPI bool + // Enable unversioned API endpoints (without the /api/v1 prefix) + EnableUnversionedAPI bool + // Disable CSP disable content-security-policy in http response + DisableCSP bool + + // Only run on localhost and only connect to others on localhost + LocalhostOnly bool + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address string + // gnet uses this for TCP incoming and outgoing + Port int + // Maximum outgoing connections to maintain + MaxOutgoingConnections int + // Maximum default outgoing connections + MaxDefaultPeerOutgoingConnections int + // How often to make outgoing connections + OutgoingConnectionsRate time.Duration + // PeerlistSize represents the maximum number of peers that the pex would maintain + PeerlistSize int + // Wallet Address Version + //AddressVersion string + // Remote web interface + WebInterface bool + WebInterfacePort int + WebInterfaceAddr string + WebInterfaceCert string + WebInterfaceKey string + WebInterfaceHTTPS bool + + RPCInterface bool + + // Launch System Default Browser after client startup + LaunchBrowser bool + + // If true, print the configured client web interface address and exit + PrintWebInterfaceAddress bool + + // Data directory holds app data -- defaults to ~/.skycoin + DataDirectory string + // GUI directory contains assets for the HTML interface + GUIDirectory string + + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + + // Logging + ColorLog bool + // This is the value registered with flag, it is converted to LogLevel after parsing + LogLevel string + // Disable "Reply to ping", "Received pong" log messages + DisablePingPong bool + + // Verify the database integrity after loading + VerifyDB bool + // Reset the database if integrity checks fail, and continue running + ResetCorruptDB bool + + // Wallets + // Defaults to ${DataDirectory}/wallets/ + WalletDirectory string + // Wallet crypto type + WalletCryptoType string + + RunMaster bool + + /* Developer options */ + + // Enable cpu profiling + ProfileCPU bool + // Where the file is written to + ProfileCPUFile string + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf bool + + DBPath string + DBReadOnly bool + Arbitrating bool + LogToFile bool + Version bool // show node version + + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string + + genesisSignature cipher.Sig + genesisAddress cipher.Address + + blockchainPubkey cipher.PubKey + blockchainSeckey cipher.SecKey +} + +// NewNodeConfig returns a new node config instance +func NewNodeConfig(mode string, node NodeParameters) *NodeConfig { + nodeConfig := &NodeConfig{ + GenesisSignatureStr: node.GenesisSignatureStr, + GenesisAddressStr: node.GenesisAddressStr, + GenesisCoinVolume: node.GenesisCoinVolume, + GenesisTimestamp: node.GenesisTimestamp, + BlockchainPubkeyStr: node.BlockchainPubkeyStr, + BlockchainSeckeyStr: node.BlockchainSeckeyStr, + DefaultConnections: node.DefaultConnections, + // Disable peer exchange + DisablePEX: true, + // Don't make any outgoing connections + DisableOutgoingConnections: false, + // Don't allowing incoming connections + DisableIncomingConnections: false, + // Disables networking altogether + DisableNetworking: false, + // Enable wallet API + EnableWalletAPI: true, + // Enable GUI + EnableGUI: true, + // Enable unversioned API + EnableUnversionedAPI: false, + // Enable seed API + EnableSeedAPI: false, + // Disable CSRF check in the wallet API + DisableCSRF: true, + // DisableCSP disable content-security-policy in http reponse + DisableCSP: true, + // Only run on localhost and only connect to others on localhost + LocalhostOnly: false, + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address: "", + //gnet uses this for TCP incoming and outgoing + Port: node.Port, + // MaxOutgoingConnections is the maximum outgoing connections allowed. + MaxOutgoingConnections: 8, + // MaxDefaultOutgoingConnections is the maximum default outgoing connections allowed. + MaxDefaultPeerOutgoingConnections: 8, + DownloadPeerList: true, + PeerListURL: node.PeerListURL, + // How often to make outgoing connections, in seconds + OutgoingConnectionsRate: time.Second * 5, + PeerlistSize: 65535, + // Wallet Address Version + //AddressVersion: "test", + // Remote web interface + WebInterface: true, + WebInterfacePort: node.WebInterfacePort, + WebInterfaceAddr: "127.0.0.1", + WebInterfaceCert: "", + WebInterfaceKey: "", + WebInterfaceHTTPS: false, + + RPCInterface: true, + + LaunchBrowser: false, + // Data directory holds app data + DataDirectory: node.DataDirectory, + // Web GUI static resources + GUIDirectory: "./src/gui/static/", + // Logging + ColorLog: true, + LogLevel: "INFO", + LogToFile: false, + DisablePingPong: false, + + VerifyDB: true, + ResetCorruptDB: false, + + // Wallets + WalletDirectory: "", + WalletCryptoType: string(wallet.CryptoTypeScryptChacha20poly1305), + + // Timeout settings for http.Server + // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ + ReadTimeout: time.Second * 10, + WriteTimeout: time.Second * 60, + IdleTimeout: time.Second * 120, + + // Centralized network configuration + RunMaster: false, + /* Developer options */ + + // Enable cpu profiling + ProfileCPU: false, + // Where the file is written to + ProfileCPUFile: node.ProfileCPUFile, + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf: false, + } + + nodeConfig.applyConfigMode(mode) + + return nodeConfig +} + +func (c *Config) postProcess() { + var err error + if c.Node.GenesisSignatureStr != "" { + c.Node.genesisSignature, err = cipher.SigFromHex(c.Node.GenesisSignatureStr) + panicIfError(err, "Invalid Signature") + } + + if c.Node.GenesisAddressStr != "" { + c.Node.genesisAddress, err = cipher.DecodeBase58Address(c.Node.GenesisAddressStr) + panicIfError(err, "Invalid Address") + } + if c.Node.BlockchainPubkeyStr != "" { + c.Node.blockchainPubkey, err = cipher.PubKeyFromHex(c.Node.BlockchainPubkeyStr) + panicIfError(err, "Invalid Pubkey") + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey, err = cipher.SecKeyFromHex(c.Node.BlockchainSeckeyStr) + panicIfError(err, "Invalid Seckey") + c.Node.BlockchainSeckeyStr = "" + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey = cipher.SecKey{} + } + + home := file.UserHome() + c.Node.DataDirectory, err = file.InitDataDir(replaceHome(c.Node.DataDirectory, home)) + panicIfError(err, "Invalid DataDirectory") + + if c.Node.WebInterfaceCert == "" { + c.Node.WebInterfaceCert = filepath.Join(c.Node.DataDirectory, "cert.pem") + } else { + c.Node.WebInterfaceCert = replaceHome(c.Node.WebInterfaceCert, home) + } + + if c.Node.WebInterfaceKey == "" { + c.Node.WebInterfaceKey = filepath.Join(c.Node.DataDirectory, "key.pem") + } else { + c.Node.WebInterfaceKey = replaceHome(c.Node.WebInterfaceKey, home) + } + + if c.Node.WalletDirectory == "" { + c.Node.WalletDirectory = filepath.Join(c.Node.DataDirectory, "wallets") + } else { + c.Node.WalletDirectory = replaceHome(c.Node.WalletDirectory, home) + } + + if c.Node.DBPath == "" { + c.Node.DBPath = filepath.Join(c.Node.DataDirectory, "data.db") + } else { + c.Node.DBPath = replaceHome(c.Node.DBPath, home) + } + + if c.Node.RunMaster { + // Run in arbitrating mode if the node is master + c.Node.Arbitrating = true + } + + // Don't open browser to load wallets if wallet apis are disabled. + if !c.Node.EnableWalletAPI { + c.Node.EnableGUI = false + c.Node.LaunchBrowser = false + } + + if c.Node.EnableGUI { + c.Node.GUIDirectory = file.ResolveResourceDirectory(c.Node.GUIDirectory) + } +} + +func (c *Config) register() { + flag.BoolVar(&help, "help", false, "Show help") + flag.BoolVar(&c.Node.DisablePEX, "disable-pex", c.Node.DisablePEX, "disable PEX peer discovery") + flag.BoolVar(&c.Node.DownloadPeerList, "download-peerlist", c.Node.DownloadPeerList, "download a peers.txt from -peerlist-url") + flag.StringVar(&c.Node.PeerListURL, "peerlist-url", c.Node.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") + flag.BoolVar(&c.Node.DisableOutgoingConnections, "disable-outgoing", c.Node.DisableOutgoingConnections, "Don't make outgoing connections") + flag.BoolVar(&c.Node.DisableIncomingConnections, "disable-incoming", c.Node.DisableIncomingConnections, "Don't make incoming connections") + flag.BoolVar(&c.Node.DisableNetworking, "disable-networking", c.Node.DisableNetworking, "Disable all network activity") + flag.BoolVar(&c.Node.EnableWalletAPI, "enable-wallet-api", c.Node.EnableWalletAPI, "Enable the wallet API") + flag.BoolVar(&c.Node.EnableGUI, "enable-gui", c.Node.EnableGUI, "Enable GUI") + flag.BoolVar(&c.Node.EnableUnversionedAPI, "enable-unversioned-api", c.Node.EnableUnversionedAPI, "Enable the deprecated unversioned API endpoints without /api/v1 prefix") + flag.BoolVar(&c.Node.DisableCSRF, "disable-csrf", c.Node.DisableCSRF, "disable CSRF check") + flag.BoolVar(&c.Node.EnableSeedAPI, "enable-seed-api", c.Node.EnableSeedAPI, "enable /api/v1/wallet/seed api") + flag.BoolVar(&c.Node.DisableCSP, "disable-csp", c.Node.DisableCSP, "disable content-security-policy in http response") + flag.StringVar(&c.Node.Address, "address", c.Node.Address, "IP Address to run application on. Leave empty to default to a public interface") + flag.IntVar(&c.Node.Port, "port", c.Node.Port, "Port to run application on") + + flag.BoolVar(&c.Node.WebInterface, "web-interface", c.Node.WebInterface, "enable the web interface") + flag.IntVar(&c.Node.WebInterfacePort, "web-interface-port", c.Node.WebInterfacePort, "port to serve web interface on") + flag.StringVar(&c.Node.WebInterfaceAddr, "web-interface-addr", c.Node.WebInterfaceAddr, "addr to serve web interface on") + flag.StringVar(&c.Node.WebInterfaceCert, "web-interface-cert", c.Node.WebInterfaceCert, "cert.pem file for web interface HTTPS. If not provided, will use cert.pem in -data-directory") + flag.StringVar(&c.Node.WebInterfaceKey, "web-interface-key", c.Node.WebInterfaceKey, "key.pem file for web interface HTTPS. If not provided, will use key.pem in -data-directory") + flag.BoolVar(&c.Node.WebInterfaceHTTPS, "web-interface-https", c.Node.WebInterfaceHTTPS, "enable HTTPS for web interface") + + flag.BoolVar(&c.Node.RPCInterface, "rpc-interface", c.Node.RPCInterface, "enable the rpc interface") + + flag.BoolVar(&c.Node.LaunchBrowser, "launch-browser", c.Node.LaunchBrowser, "launch system default webbrowser at client startup") + flag.BoolVar(&c.Node.PrintWebInterfaceAddress, "print-web-interface-address", c.Node.PrintWebInterfaceAddress, "print configured web interface address and exit") + flag.StringVar(&c.Node.DataDirectory, "data-dir", c.Node.DataDirectory, "directory to store app data (defaults to ~/.skycoin)") + flag.StringVar(&c.Node.DBPath, "db-path", c.Node.DBPath, "path of database file (defaults to ~/.skycoin/data.db)") + flag.BoolVar(&c.Node.DBReadOnly, "db-read-only", c.Node.DBReadOnly, "open bolt db read-only") + flag.BoolVar(&c.Node.ProfileCPU, "profile-cpu", c.Node.ProfileCPU, "enable cpu profiling") + flag.StringVar(&c.Node.ProfileCPUFile, "profile-cpu-file", c.Node.ProfileCPUFile, "where to write the cpu profile file") + flag.BoolVar(&c.Node.HTTPProf, "http-prof", c.Node.HTTPProf, "Run the http profiling interface") + flag.StringVar(&c.Node.LogLevel, "log-level", c.Node.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") + flag.BoolVar(&c.Node.ColorLog, "color-log", c.Node.ColorLog, "Add terminal colors to log output") + flag.BoolVar(&c.Node.DisablePingPong, "no-ping-log", c.Node.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) + flag.BoolVar(&c.Node.LogToFile, "logtofile", c.Node.LogToFile, "log to file") + flag.StringVar(&c.Node.GUIDirectory, "gui-dir", c.Node.GUIDirectory, "static content directory for the HTML interface") + + flag.BoolVar(&c.Node.VerifyDB, "verify-db", c.Node.VerifyDB, "check the database for corruption") + flag.BoolVar(&c.Node.ResetCorruptDB, "reset-corrupt-db", c.Node.ResetCorruptDB, "reset the database if corrupted, and continue running instead of exiting") + + // Key Configuration Data + flag.BoolVar(&c.Node.RunMaster, "master", c.Node.RunMaster, "run the daemon as blockchain master server") + + flag.StringVar(&c.Node.BlockchainPubkeyStr, "master-public-key", c.Node.BlockchainPubkeyStr, "public key of the master chain") + flag.StringVar(&c.Node.BlockchainSeckeyStr, "master-secret-key", c.Node.BlockchainSeckeyStr, "secret key, set for master") + + flag.StringVar(&c.Node.GenesisAddressStr, "genesis-address", c.Node.GenesisAddressStr, "genesis address") + flag.StringVar(&c.Node.GenesisSignatureStr, "genesis-signature", c.Node.GenesisSignatureStr, "genesis block signature") + flag.Uint64Var(&c.Node.GenesisTimestamp, "genesis-timestamp", c.Node.GenesisTimestamp, "genesis block timestamp") + + flag.StringVar(&c.Node.WalletDirectory, "wallet-dir", c.Node.WalletDirectory, "location of the wallet files. Defaults to ~/.skycoin/wallet/") + flag.IntVar(&c.Node.MaxOutgoingConnections, "max-outgoing-connections", c.Node.MaxOutgoingConnections, "The maximum outgoing connections allowed") + flag.IntVar(&c.Node.MaxDefaultPeerOutgoingConnections, "max-default-peer-outgoing-connections", c.Node.MaxDefaultPeerOutgoingConnections, "The maximum default peer outgoing connections allowed") + flag.IntVar(&c.Node.PeerlistSize, "peerlist-size", c.Node.PeerlistSize, "The peer list size") + flag.DurationVar(&c.Node.OutgoingConnectionsRate, "connection-rate", c.Node.OutgoingConnectionsRate, "How often to make an outgoing connection") + flag.BoolVar(&c.Node.LocalhostOnly, "localhost-only", c.Node.LocalhostOnly, "Run on localhost and only connect to localhost peers") + flag.BoolVar(&c.Node.Arbitrating, "arbitrating", c.Node.Arbitrating, "Run node in arbitrating mode") + flag.StringVar(&c.Node.WalletCryptoType, "wallet-crypto-type", c.Node.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") + flag.BoolVar(&c.Node.Version, "version", false, "show node version") +} + +func (n *NodeConfig) applyConfigMode(configMode string) { + if runtime.GOOS == "windows" { + n.ColorLog = false + } + switch configMode { + case "": + case "STANDALONE_CLIENT": + n.EnableWalletAPI = true + n.EnableGUI = true + n.EnableSeedAPI = true + n.LaunchBrowser = true + n.DisableCSRF = false + n.DisableCSP = false + n.DownloadPeerList = true + n.RPCInterface = false + n.WebInterface = true + n.LogToFile = false + n.ResetCorruptDB = true + n.WebInterfacePort = 0 // randomize web interface port + default: + panic("Invalid ConfigMode") + } +} + +func panicIfError(err error, msg string, args ...interface{}) { // nolint: unparam + if err != nil { + log.Panicf(msg+": %v", append(args, err)...) + } +} + +func replaceHome(path, home string) string { + return strings.Replace(path, "$HOME", home, 1) +} diff --git a/src/skycoin/parameters.go b/src/skycoin/parameters.go new file mode 100755 index 0000000..f060424 --- /dev/null +++ b/src/skycoin/parameters.go @@ -0,0 +1,127 @@ +package skycoin + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" +) + +// Parameters records fiber coin parameters +type Parameters struct { + Node NodeParameters `mapstructure:"node"` + Build BuildParameters `mapstructure:"build"` + Visor VisorParameters `mapstructure:"visor"` +} + +// NodeParameters records the node's configurable parameters +type NodeParameters struct { + PeerListURL string `mapstructure:"peer_list_url"` + Port int `mapstructure:"port"` + WebInterfacePort int `mapstructure:"web_interface_port"` + GenesisSignatureStr string `mapstructure:"genesis_signature_str"` + GenesisAddressStr string `mapstructure:"genesis_address_str"` + BlockchainPubkeyStr string `mapstructure:"blockchain_pubkey_str"` + BlockchainSeckeyStr string `mapstructure:"blockchain_seckey_str"` + GenesisTimestamp uint64 `mapstructure:"genesis_timestamp"` + GenesisCoinVolume uint64 `mapstructure:"genesis_coin_volume"` + DefaultConnections []string `mapstructure:"default_connections"` + + DataDirectory string + ProfileCPUFile string +} + +// VisorParameters are the parameters used to generate parameters.go in visor +type VisorParameters struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 `mapstructure:"max_coin_supply"` + + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 `mapstructure:"distribution_addresses_total"` + + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 + + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 `mapstructure:"initial_unlocked_count"` + + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 `mapstructure:"unlock_address_rate"` + + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 `mapstructure:"unlock_time_interval"` + + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 `mapstructure:"max_droplet_precision"` + + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int `mapstructure:"default_max_block_size"` + + DistributionAddresses []string `mapstructure:"distribution_addresses"` +} + +// BuildParameters records build info +type BuildParameters struct { + Version string `mapstructure:"version"` // node version + Commit string `mapstructure:"commit"` // git commit id + Branch string `mapstructure:"branch"` // git branch name +} + +// NewParameters loads blockchain config parameters from a config file +// default file is: fiber.toml in the project root +// JSON, toml or yaml file can be used (toml preferred). +func NewParameters(configName, appDir string) (Parameters, error) { + // set viper parameters + // check that file is of supported type + confNameSplit := strings.Split(configName, ".") + fileType := confNameSplit[len(confNameSplit)-1] + switch fileType { + case "toml", "json", "yaml", "yml": + viper.SetConfigType(confNameSplit[len(confNameSplit)-1]) + default: + return Parameters{}, fmt.Errorf("invalid blockchain config file type: %s", fileType) + } + + configName = configName[:len(configName)-(len(fileType)+1)] + viper.SetConfigName(configName) + + viper.AddConfigPath(appDir) + viper.AddConfigPath(".") + + // set defaults + setDefaults() + + params := Parameters{} + + if err := viper.ReadInConfig(); err != nil { + return params, err + } + + if err := viper.Unmarshal(¶ms); err != nil { + return params, err + } + + return params, nil +} + +func setDefaults() { + // node defaults + viper.SetDefault("node.genesis_coin_volume", 300e12) + viper.SetDefault("node.port", 30000) + viper.SetDefault("node.web_interface_port", 7220) + + // build defaults + viper.SetDefault("build.commit", "") + viper.SetDefault("build.branch", "") + + // visor parameter defaults + viper.SetDefault("visor.max_coin_supply", 3e8) + viper.SetDefault("visor.distribution_addresses_total", 100) + viper.SetDefault("visor.initial_unlocked_count", 100) + viper.SetDefault("visor.unlock_address_rate", 0) + viper.SetDefault("visor.unlock_time_interval", 60*60*24*365) + viper.SetDefault("visor.max_droplet_precision", 3) + viper.SetDefault("visor.default_max_block_size", 32*1024) +} diff --git a/src/skycoin/parameters_test.go b/src/skycoin/parameters_test.go new file mode 100755 index 0000000..5a7e706 --- /dev/null +++ b/src/skycoin/parameters_test.go @@ -0,0 +1,50 @@ +package skycoin + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TODO(therealssj): write better tests +func TestNewParameters(t *testing.T) { + coinConfig, err := NewParameters("test.fiber.toml", "./testdata") + require.NoError(t, err) + require.Equal(t, Parameters{ + Node: NodeParameters{ + GenesisSignatureStr: "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700", + GenesisAddressStr: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + BlockchainPubkeyStr: "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a", + BlockchainSeckeyStr: "", + GenesisTimestamp: 1426562704, + GenesisCoinVolume: 100e12, + DefaultConnections: []string{ + "118.178.135.93:6000", + "47.88.33.156:6000", + "121.41.103.148:6000", + "120.77.69.188:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", + }, + Port: 6000, + PeerListURL: "https://downloads.skycoin.net/blockchain/peers.txt", + WebInterfacePort: 6420, + }, + Build: BuildParameters{ + Version: "0.23.1-rc2", + Commit: "0aab9bf7730827d6fd11beb0d02096b40cea1872", + Branch: "test-branch", + }, + Visor: VisorParameters{ + MaxCoinSupply: 1e8, + DistributionAddressesTotal: 100, + InitialUnlockedCount: 25, + UnlockAddressRate: 5, + UnlockTimeInterval: 60 * 60 * 24 * 365, + MaxDropletPrecision: 3, + DefaultMaxBlockSize: 32 * 1024, + }, + }, coinConfig) +} diff --git a/src/skycoin/skycoin.go b/src/skycoin/skycoin.go new file mode 100755 index 0000000..3acc223 --- /dev/null +++ b/src/skycoin/skycoin.go @@ -0,0 +1,427 @@ +package skycoin + +import ( + "flag" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "runtime/debug" + "runtime/pprof" + "sync" + "time" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/util/browser" + "github.com/skycoin/skycoin/src/util/cert" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/wallet" +) + +// Coin represents a fiber coin instance +type Coin struct { + config Config + logger *logging.Logger +} + +// Run starts the node +func (c *Coin) Run() { + defer func() { + // try catch panic in main thread + if r := recover(); r != nil { + c.logger.Errorf("recover: %v\nstack:%v", r, string(debug.Stack())) + } + }() + var db *dbutil.DB + var d *daemon.Daemon + var webInterface *api.Server + errC := make(chan error, 10) + + if c.config.Node.Version { + fmt.Println(c.config.Build.Version) + return + } + + logLevel, err := logging.LevelFromString(c.config.Node.LogLevel) + if err != nil { + c.logger.Error("Invalid -log-level:", err) + return + } + + logging.SetLevel(logLevel) + + if c.config.Node.ColorLog { + logging.EnableColors() + } else { + logging.DisableColors() + } + + var logFile *os.File + if c.config.Node.LogToFile { + var err error + logFile, err = c.initLogFile() + if err != nil { + c.logger.Error(err) + return + } + } + + var fullAddress string + scheme := "http" + if c.config.Node.WebInterfaceHTTPS { + scheme = "https" + } + host := fmt.Sprintf("%s:%d", c.config.Node.WebInterfaceAddr, c.config.Node.WebInterfacePort) + + c.initProfiling() + + var wg sync.WaitGroup + + quit := make(chan struct{}) + + // Catch SIGINT (CTRL-C) (closes the quit channel) + go apputil.CatchInterrupt(quit) + + // Catch SIGUSR1 (prints runtime stack to stdout) + go apputil.CatchDebug() + + // creates blockchain instance + dconf := c.ConfigureDaemon() + + c.logger.Infof("Opening database %s", dconf.Visor.DBPath) + db, err = visor.OpenDB(dconf.Visor.DBPath, c.config.Node.DBReadOnly) + if err != nil { + c.logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) + return + } + + if c.config.Node.ResetCorruptDB { + // Check the database integrity and recreate it if necessary + c.logger.Info("Checking database and resetting if corrupted") + if newDB, err := visor.RepairCorruptDB(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.Errorf("visor.ResetCorruptDB failed: %v", err) + } + goto earlyShutdown + } else { + db = newDB + } + } else if c.config.Node.VerifyDB { + c.logger.Info("Checking database") + if err := visor.CheckDatabase(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.Errorf("visor.CheckDatabase failed: %v", err) + } + goto earlyShutdown + } + } + + d, err = daemon.NewDaemon(dconf, db, c.config.Node.DefaultConnections) + if err != nil { + c.logger.Error(err) + goto earlyShutdown + } + + if c.config.Node.WebInterface { + webInterface, err = c.createGUI(d, host) + if err != nil { + c.logger.Error(err) + goto earlyShutdown + } + } + + fullAddress = fmt.Sprintf("%s://%s", scheme, webInterface.Addr()) + c.logger.Critical().Infof("Full address: %s", fullAddress) + if c.config.Node.PrintWebInterfaceAddress { + fmt.Println(fullAddress) + } + + wg.Add(1) + go func() { + defer wg.Done() + + if err := d.Run(); err != nil { + c.logger.Error(err) + errC <- err + } + }() + + if c.config.Node.WebInterface { + cancelLaunchBrowser := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + + if err := webInterface.Serve(); err != nil { + close(cancelLaunchBrowser) + c.logger.Error(err) + errC <- err + } + }() + + if c.config.Node.LaunchBrowser { + go func() { + select { + case <-cancelLaunchBrowser: + c.logger.Warning("Browser launching cancelled") + + // Wait a moment just to make sure the http interface is up + case <-time.After(time.Millisecond * 100): + c.logger.Infof("Launching System Browser with %s", fullAddress) + if err := browser.Open(fullAddress); err != nil { + c.logger.Error(err) + } + } + }() + } + } + + select { + case <-quit: + case err := <-errC: + c.logger.Error(err) + } + + c.logger.Info("Shutting down...") + + if webInterface != nil { + c.logger.Info("Closing web interface") + webInterface.Shutdown() + } + + c.logger.Info("Closing daemon") + d.Shutdown() + + c.logger.Info("Waiting for goroutines to finish") + wg.Wait() + +earlyShutdown: + if db != nil { + c.logger.Info("Closing database") + if err := db.Close(); err != nil { + c.logger.WithError(err).Error("Failed to close DB") + } + } + + c.logger.Info("Goodbye") + + if logFile != nil { + if err := logFile.Close(); err != nil { + fmt.Println("Failed to close log file") + } + } +} + +// NewCoin returns a new fiber coin instance +func NewCoin(config Config, logger *logging.Logger) *Coin { + return &Coin{ + config: config, + logger: logger, + } +} + +func (c *Coin) initLogFile() (*os.File, error) { + logDir := filepath.Join(c.config.Node.DataDirectory, "logs") + if err := createDirIfNotExist(logDir); err != nil { + c.logger.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + } + + // open log file + tf := "2006-01-02-030405" + logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), c.config.Build.Version)) + + f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + c.logger.Errorf("os.OpenFile(%s) failed: %v", logfile, err) + return nil, err + } + + hook := logging.NewWriteHook(f) + logging.AddHook(hook) + + return f, nil +} + +func (c *Coin) initProfiling() { + if c.config.Node.ProfileCPU { + f, err := os.Create(c.config.Node.ProfileCPUFile) + if err != nil { + log.Fatal(err) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + if c.config.Node.HTTPProf { + go func() { + log.Println(http.ListenAndServe("localhost:6060", nil)) + }() + } +} + +// ConfigureDaemon sets the daemon config values +func (c *Coin) ConfigureDaemon() daemon.Config { + //cipher.SetAddressVersion(c.AddressVersion) + dc := daemon.NewConfig() + + for _, c := range c.config.Node.DefaultConnections { + dc.Pool.DefaultPeerConnections[c] = struct{}{} + } + + dc.Pool.MaxDefaultPeerOutgoingConnections = c.config.Node.MaxDefaultPeerOutgoingConnections + + dc.Pex.DataDirectory = c.config.Node.DataDirectory + dc.Pex.Disabled = c.config.Node.DisablePEX + dc.Pex.Max = c.config.Node.PeerlistSize + dc.Pex.DownloadPeerList = c.config.Node.DownloadPeerList + dc.Pex.PeerListURL = c.config.Node.PeerListURL + dc.Daemon.DisableOutgoingConnections = c.config.Node.DisableOutgoingConnections + dc.Daemon.DisableIncomingConnections = c.config.Node.DisableIncomingConnections + dc.Daemon.DisableNetworking = c.config.Node.DisableNetworking + dc.Daemon.Port = c.config.Node.Port + dc.Daemon.Address = c.config.Node.Address + dc.Daemon.LocalhostOnly = c.config.Node.LocalhostOnly + dc.Daemon.OutgoingMax = c.config.Node.MaxOutgoingConnections + dc.Daemon.DataDirectory = c.config.Node.DataDirectory + dc.Daemon.LogPings = !c.config.Node.DisablePingPong + dc.Daemon.BlockchainPubkey = c.config.Node.blockchainPubkey + + if c.config.Node.OutgoingConnectionsRate == 0 { + c.config.Node.OutgoingConnectionsRate = time.Millisecond + } + dc.Daemon.OutgoingRate = c.config.Node.OutgoingConnectionsRate + dc.Visor.IsMaster = c.config.Node.RunMaster + + dc.Visor.BlockchainPubkey = c.config.Node.blockchainPubkey + dc.Visor.BlockchainSeckey = c.config.Node.blockchainSeckey + + dc.Visor.GenesisAddress = c.config.Node.genesisAddress + dc.Visor.GenesisSignature = c.config.Node.genesisSignature + dc.Visor.GenesisTimestamp = c.config.Node.GenesisTimestamp + dc.Visor.GenesisCoinVolume = c.config.Node.GenesisCoinVolume + dc.Visor.DBPath = c.config.Node.DBPath + dc.Visor.Arbitrating = c.config.Node.Arbitrating + dc.Visor.EnableWalletAPI = c.config.Node.EnableWalletAPI + dc.Visor.WalletDirectory = c.config.Node.WalletDirectory + dc.Visor.BuildInfo = visor.BuildInfo{ + Version: c.config.Build.Version, + Commit: c.config.Build.Commit, + Branch: c.config.Build.Branch, + } + dc.Visor.EnableSeedAPI = c.config.Node.EnableSeedAPI + + dc.Gateway.EnableWalletAPI = c.config.Node.EnableWalletAPI + dc.Gateway.DisableCSP = c.config.Node.DisableCSP + + // Initialize wallet default crypto type + cryptoType, err := wallet.CryptoTypeFromString(c.config.Node.WalletCryptoType) + if err != nil { + log.Panic(err) + } + + dc.Visor.WalletCryptoType = cryptoType + + return dc +} + +func (c *Coin) createGUI(d *daemon.Daemon, host string) (*api.Server, error) { + var s *api.Server + var err error + + config := api.Config{ + StaticDir: c.config.Node.GUIDirectory, + DisableCSRF: c.config.Node.DisableCSRF, + EnableWalletAPI: c.config.Node.EnableWalletAPI, + EnableJSON20RPC: c.config.Node.RPCInterface, + EnableGUI: c.config.Node.EnableGUI, + EnableUnversionedAPI: c.config.Node.EnableUnversionedAPI, + ReadTimeout: c.config.Node.ReadTimeout, + WriteTimeout: c.config.Node.WriteTimeout, + IdleTimeout: c.config.Node.IdleTimeout, + } + + if c.config.Node.WebInterfaceHTTPS { + // Verify cert/key parameters, and if neither exist, create them + if err := cert.CreateCertIfNotExists(host, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey, "Skycoind"); err != nil { + c.logger.Errorf("cert.CreateCertIfNotExists failure: %v", err) + return nil, err + } + + s, err = api.CreateHTTPS(host, config, d.Gateway, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + } else { + s, err = api.Create(host, config, d.Gateway) + } + if err != nil { + c.logger.Errorf("Failed to start web GUI: %v", err) + return nil, err + } + + return s, nil +} + +// ParseConfig prepare the config +func (c *Coin) ParseConfig() { + c.config.register() + flag.Parse() + if help { + flag.Usage() + os.Exit(0) + } + c.config.postProcess() +} + +// InitTransaction creates the initialize transaction +func InitTransaction(UxID string, genesisSecKey cipher.SecKey) coin.Transaction { + var tx coin.Transaction + + output := cipher.MustSHA256FromHex(UxID) + tx.PushInput(output) + + addrs := visor.GetDistributionAddresses() + + if len(addrs) != 100 { + log.Panic("Should have 100 distribution addresses") + } + + // 1 million per address, measured in droplets + if visor.DistributionAddressInitialBalance != 1e6 { + log.Panic("visor.DistributionAddressInitialBalance expected to be 1e6*1e6") + } + + for i := range addrs { + addr := cipher.MustDecodeBase58Address(addrs[i]) + tx.PushOutput(addr, visor.DistributionAddressInitialBalance*1e6, 1) + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + tx.SignInputs(seckeys) + + tx.UpdateHeader() + + err := tx.Verify() + + if err != nil { + log.Panic(err) + } + + log.Printf("signature= %s", tx.Sigs[0].Hex()) + return tx +} + +func createDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + return nil + } + + return os.Mkdir(dir, 0777) +} diff --git a/src/skycoin/testdata/test.fiber.toml b/src/skycoin/testdata/test.fiber.toml new file mode 100755 index 0000000..509e2a3 --- /dev/null +++ b/src/skycoin/testdata/test.fiber.toml @@ -0,0 +1,27 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +default_connections = [ + "118.178.135.93:6000", + "47.88.33.156:6000", + "121.41.103.148:6000", + "120.77.69.188:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", +] +launch_browser = true +peer_list_url = "https://downloads.skycoin.net/blockchain/peers.txt" + +[build] +version = "0.23.1-rc2" +commit = "0aab9bf7730827d6fd11beb0d02096b40cea1872" +branch = "test-branch" + diff --git a/src/testutil/blockchain.go b/src/testutil/blockchain.go deleted file mode 100755 index c8083b9..0000000 --- a/src/testutil/blockchain.go +++ /dev/null @@ -1,68 +0,0 @@ -package testutil - -import ( - "io/ioutil" - "math/rand" - "os" - "testing" - "time" - - "github.com/boltdb/bolt" - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/cipher" -) - -// set rand seed. -var _ = func() int64 { - t := time.Now().Unix() - rand.Seed(t) - return t -}() - -// PrepareDB creates and opens a temporary test DB and returns it with a cleanup callback -func PrepareDB(t *testing.T) (*bolt.DB, func()) { - f, err := ioutil.TempFile("", "testdb") - require.NoError(t, err) - - db, err := bolt.Open(f.Name(), 0700, nil) - require.NoError(t, err) - - return db, func() { - db.Close() - os.Remove(f.Name()) - } -} - -// RequireError requires that an error is not nil and that its message matches -func RequireError(t *testing.T, err error, msg string) { - t.Helper() - require.Error(t, err) - require.Equal(t, msg, err.Error()) -} - -// MakeAddress creates a cipher.Address -func MakeAddress() cipher.Address { - p, _ := cipher.GenerateKeyPair() - return cipher.AddressFromPubKey(p) -} - -// RandBytes returns n random bytes -func RandBytes(t *testing.T, n int) []byte { - b := make([]byte, n) - _, err := rand.Read(b) - require.NoError(t, err) - return b -} - -// RandSHA256 returns a random SHA256 hash -func RandSHA256(t *testing.T) cipher.SHA256 { - return cipher.SumSHA256(RandBytes(t, 128)) -} - -// SHA256FromHex converts an SHA256 hex string to a cipher.SHA256 -func SHA256FromHex(t *testing.T, hex string) cipher.SHA256 { - sha, err := cipher.SHA256FromHex(hex) - require.NoError(t, err) - return sha -} diff --git a/src/testutil/testutil.go b/src/testutil/testutil.go new file mode 100755 index 0000000..1c4f442 --- /dev/null +++ b/src/testutil/testutil.go @@ -0,0 +1,75 @@ +package testutil + +import ( + "io/ioutil" + "math/rand" + "os" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +// PrepareDB creates and opens a temporary test DB and returns it with a cleanup callback +func PrepareDB(t *testing.T) (*dbutil.DB, func()) { + f, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + db, err := bolt.Open(f.Name(), 0700, nil) + require.NoError(t, err) + + return dbutil.WrapDB(db), func() { + db.Close() + f.Close() + os.Remove(f.Name()) + } +} + +// RequireError requires that an error is not nil and that its message matches +func RequireError(t *testing.T, err error, msg string) { + t.Helper() + require.Error(t, err) + require.Equal(t, msg, err.Error()) +} + +// MakeAddress creates a cipher.Address +func MakeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +// RandBytes returns n random bytes +func RandBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + return b +} + +// RandSHA256 returns a random SHA256 hash +func RandSHA256(t *testing.T) cipher.SHA256 { + return cipher.SumSHA256(RandBytes(t, 128)) +} + +// SHA256FromHex converts an SHA256 hex string to a cipher.SHA256 +func SHA256FromHex(t *testing.T, hex string) cipher.SHA256 { + sha, err := cipher.SHA256FromHex(hex) + require.NoError(t, err) + return sha +} + +// RandSig returns a random cipher.Sig +func RandSig(t *testing.T) cipher.Sig { + return cipher.NewSig(RandBytes(t, 65)) +} diff --git a/src/util/apputil/apputil.go b/src/util/apputil/apputil.go new file mode 100755 index 0000000..2587adf --- /dev/null +++ b/src/util/apputil/apputil.go @@ -0,0 +1,56 @@ +package apputil + +import ( + "fmt" + "os" + "os/signal" + "runtime/pprof" + "syscall" +) + +// CatchInterrupt catches CTRL-C and closes the quit channel if it occurs. +// If CTRL-C is called again, the program stack is dumped and the process panics, +// so that shutdown hangs can be diagnosed. +func CatchInterrupt(quit chan<- struct{}) { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + close(quit) + + // If ctrl-c is called again, panic so that the program state can be examined. + // Ctrl-c would be called again if program shutdown was stuck. + go CatchInterruptPanic() +} + +// CatchInterruptPanic catches os.Interrupt and panics +func CatchInterruptPanic() { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + PrintProgramStatus() + panic("SIGINT") +} + +// CatchDebug catches SIGUSR1 and prints internal program state +func CatchDebug() { + sigchan := make(chan os.Signal, 1) + //signal.Notify(sigchan, syscall.SIGUSR1) + signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) + for { + select { + case <-sigchan: + PrintProgramStatus() + } + } +} + +// PrintProgramStatus prints all goroutine data to stdout +func PrintProgramStatus() { + p := pprof.Lookup("goroutine") + if err := p.WriteTo(os.Stdout, 2); err != nil { + fmt.Println("ERROR:", err) + return + } +} diff --git a/src/util/file/file.go b/src/util/file/file.go index 0d62066..67ed658 100755 --- a/src/util/file/file.go +++ b/src/util/file/file.go @@ -227,7 +227,6 @@ func ResolveResourceDirectory(path string) string { } // DetermineResourcePath DEPRECATE -// From src/gui/http.go and src/mesh/gui/http.go func DetermineResourcePath(staticDir string, resourceDir string, devDir string) (string, error) { //check "dev" directory first appLoc := filepath.Join(staticDir, devDir) diff --git a/src/util/file/file_test.go b/src/util/file/file_test.go index fe92141..7809229 100755 --- a/src/util/file/file_test.go +++ b/src/util/file/file_test.go @@ -31,7 +31,7 @@ func requireFileContentsBinary(t *testing.T, filename string, contents []byte) { require.True(t, bytes.Equal(b[:n], contents)) } -func requireFileContents(t *testing.T, filename, contents string) { +func requireFileContents(t *testing.T, filename, contents string) { // nolint: unparam requireFileContentsBinary(t, filename, []byte(contents)) } diff --git a/src/util/hexdump.go b/src/util/hexdump.go new file mode 100755 index 0000000..44ba337 --- /dev/null +++ b/src/util/hexdump.go @@ -0,0 +1,142 @@ +package util + +import ( + "bufio" + "io" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// Annotation : Denotes a chunk of data to be dumped +type Annotation struct { + Name string + Size int +} + +// IAnnotationsGenerator : Interface to implement by types to use HexDump +type IAnnotationsGenerator interface { + GenerateAnnotations() []Annotation +} + +// IAnnotationsIterator : Interface to implement by types to use HexDumpFromIterator +type IAnnotationsIterator interface { + Next() (Annotation, bool) +} + +func writeHexdumpMember(offset int, size int, writer io.Writer, buffer []byte, name string) { + var hexBuff = make([]string, size) + var j = 0 + if offset+size > len(buffer) { + panic(encoder.ErrBufferUnderflow) + } + for i := offset; i < offset+size; i++ { + hexBuff[j] = strconv.FormatInt(int64(buffer[i]), 16) + j++ + } + for i := 0; i < len(hexBuff); i++ { + if len(hexBuff[i]) == 1 { + hexBuff[i] = "0" + hexBuff[i] + } + } + + var sliceContents = getSliceContentsString(hexBuff, offset) + var serialized = encoder.Serialize(sliceContents + " " + name + "\n") + + f := bufio.NewWriter(writer) + defer f.Flush() + f.Write(serialized[4:]) + +} + +func getSliceContentsString(sl []string, offset int) string { + var res = "" + var counter = 0 + var currentOff = offset + if offset != -1 { + var hex = strconv.FormatInt(int64(offset), 16) + var l = len(hex) + for i := 0; i < 4-l; i++ { + hex = "0" + hex + } + hex = "0x" + hex + res += hex + " | " + } + for i := 0; i < len(sl); i++ { + counter++ + res += sl[i] + " " + if counter == 16 { + if i != len(sl)-1 { + res = strings.TrimRight(res, " ") + res += "\n" + currentOff += 16 + if offset != -1 { + //res += " " //9 spaces + var hex = strconv.FormatInt(int64(currentOff), 16) + var l = len(hex) + for i := 0; i < 4-l; i++ { + hex = "0" + hex + } + hex = "0x" + hex + res += hex + " | " + } + counter = 0 + } else { + res += "..." + return res + } + } + } + for i := 0; i < (16 - counter); i++ { + res += "..." + } + res += "..." + return res +} + +func printFinalHex(i int, writer io.Writer) { + var finalHex = strconv.FormatInt(int64(i), 16) + var l = len(finalHex) + for i := 0; i < 4-l; i++ { + finalHex = "0" + finalHex + } + finalHex = "0x" + finalHex + finalHex = finalHex + " | " + + var serialized = encoder.Serialize(finalHex) + + f := bufio.NewWriter(writer) + defer f.Flush() + f.Write(serialized[4:]) +} + +// HexDump : Returns hexdump of buffer according to annotations, via writer +func HexDump(buffer []byte, annotations []Annotation, writer io.Writer) { + var currentOffset = 0 + + for _, element := range annotations { + writeHexdumpMember(currentOffset, element.Size, writer, buffer, element.Name) + currentOffset += element.Size + } + + printFinalHex(currentOffset, writer) +} + +// HexDumpFromIterator : Returns hexdump of buffer according to annotationsIterator, via writer +func HexDumpFromIterator(buffer []byte, annotationsIterator IAnnotationsIterator, writer io.Writer) { + var currentOffset = 0 + + var current, valid = annotationsIterator.Next() + + for { + if !valid { + break + } + writeHexdumpMember(currentOffset, current.Size, writer, buffer, current.Name) + currentOffset += current.Size + current, valid = annotationsIterator.Next() + } + + printFinalHex(currentOffset, writer) +} diff --git a/src/util/http/error.go b/src/util/http/error.go index 9ae8da1..14e23d4 100755 --- a/src/util/http/error.go +++ b/src/util/http/error.go @@ -2,20 +2,16 @@ package httphelper import ( + "encoding/json" "fmt" "net/http" "github.com/skycoin/skycoin/src/util/logging" ) -var ( - logger = logging.MustGetLogger("gui") -) - // HTTPError wraps http.Error func HTTPError(w http.ResponseWriter, status int, httpMsg string) { msg := fmt.Sprintf("%d %s", status, httpMsg) - logger.Errorf(msg) http.Error(w, msg, status) } @@ -31,11 +27,30 @@ func errorXXXMsg(w http.ResponseWriter, status int, msg string) { HTTPError(w, status, httpMsg) } +func errorXXXJSONOr500(log *logging.Logger, w http.ResponseWriter, status int, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(status) + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http write failed") + } +} + // Error400 respond with a 400 error and include a message func Error400(w http.ResponseWriter, msg string) { errorXXXMsg(w, http.StatusBadRequest, msg) } +// Error400JSONOr500 returns a 400 error with an object as JSON, writting a 500 error if it fails +func Error400JSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + errorXXXJSONOr500(log, w, http.StatusBadRequest, m) +} + // Error401 respond with a 401 error func Error401(w http.ResponseWriter, auth, msg string) { w.Header().Set("WWW-Authenticate", auth) @@ -66,6 +81,16 @@ func Error415(w http.ResponseWriter) { httpError(w, http.StatusUnsupportedMediaType) } +// Error422 response with a 422 error and include a message +func Error422(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusUnprocessableEntity, msg) +} + +// Error422JSONOr500 returns a 422 error with an object as JSON, writting a 500 error if it fails +func Error422JSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + errorXXXJSONOr500(log, w, http.StatusUnprocessableEntity, m) +} + // Error501 respond with a 501 error func Error501(w http.ResponseWriter) { httpError(w, http.StatusNotImplemented) diff --git a/src/util/http/handler.go b/src/util/http/handler.go index b7ac7cb..222d47b 100755 --- a/src/util/http/handler.go +++ b/src/util/http/handler.go @@ -9,6 +9,10 @@ import ( "github.com/skycoin/skycoin/src/util/logging" ) +// ContentSecurityPolicy represents the value of content-security-policy +// header in http response +const ContentSecurityPolicy = "script-src 'self' 127.0.0.1" + // HostCheck checks that the request's Host header is 127.0.0.1:$port or localhost:$port // if the HTTP interface host is also a localhost address. // This prevents DNS rebinding attacks, where an attacker uses a DNS rebinding service @@ -46,3 +50,11 @@ func HostCheck(logger *logging.Logger, host string, handler http.Handler) http.H handler.ServeHTTP(w, r) }) } + +// CSPHandler enables CSP +func CSPHandler(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Security-Policy", ContentSecurityPolicy) + handler.ServeHTTP(w, r) + }) +} diff --git a/src/util/http/json.go b/src/util/http/json.go index 97087ca..6ddedfd 100755 --- a/src/util/http/json.go +++ b/src/util/http/json.go @@ -93,6 +93,34 @@ func (a Address) MarshalJSON() ([]byte, error) { return []byte(`"` + a.Address.String() + `"`), nil } +// SHA256 is a wrapper around cipher.SHA256 which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type SHA256 struct { + cipher.SHA256 +} + +// UnmarshalJSON unmarshals a string address to a cipher.SHA256 +func (a *SHA256) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.SHA256FromHex(s) + if err != nil { + return fmt.Errorf("invalid SHA256 hash: %v", err) + } + + a.SHA256 = tmp + + return nil +} + +// MarshalJSON marshals a cipher.SHA256 in its string representation +func (a SHA256) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.SHA256.Hex() + `"`), nil +} + // Coins is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. // It unmarshals a fixed-point decimal string to droplets and vice versa type Coins uint64 diff --git a/src/util/http/json_test.go b/src/util/http/json_test.go index 61ec88d..b4d28c8 100755 --- a/src/util/http/json_test.go +++ b/src/util/http/json_test.go @@ -256,3 +256,64 @@ func TestHoursUnmarshalJSON(t *testing.T) { err := c.UnmarshalJSON([]byte("invalidjson")) testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") } + +func TestSHA256MarshalJSON(t *testing.T) { + hash := "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d" + + c := SHA256{cipher.MustSHA256FromHex(hash)} + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"`, string(data)) +} + +func TestSHA256UnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected cipher.SHA256 + err string + }{ + { + c: "", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "foo", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+006F 'o'", + }, + + { + c: "97dd0628", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d97", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11Q", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+0051 'Q'", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + expected: cipher.MustSHA256FromHex("97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"), + }, + } + + for _, tc := range cases { + t.Run(tc.c, func(t *testing.T) { + var c SHA256 + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.SHA256) + } + }) + } +} diff --git a/src/util/iputil/iputil.go b/src/util/iputil/iputil.go index 8f84c4a..f367445 100755 --- a/src/util/iputil/iputil.go +++ b/src/util/iputil/iputil.go @@ -5,7 +5,6 @@ import ( "fmt" "net" "strconv" - "strings" ) // LocalhostIP returns the address for localhost on the machine @@ -29,19 +28,28 @@ func LocalhostIP() (string, error) { } // IsLocalhost returns true if addr is a localhost address +// Works for both ipv4 and ipv6 addresses. func IsLocalhost(addr string) bool { return net.ParseIP(addr).IsLoopback() || addr == "localhost" } -// SplitAddr splits an ip:port string to ip, port +// SplitAddr splits an ip:port string to ip, port. +// Works for both ipv4 and ipv6 addresses. +// If the IP is not specified, returns an error. func SplitAddr(addr string) (string, uint16, error) { - pts := strings.Split(addr, ":") - if len(pts) != 2 { - return pts[0], 0, fmt.Errorf("Invalid addr %s", addr) + ip, port, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, err + } + + if ip == "" { + return "", 0, fmt.Errorf("IP missing from %s", addr) } - port64, err := strconv.ParseUint(pts[1], 10, 16) + + port64, err := strconv.ParseUint(port, 10, 16) if err != nil { - return pts[0], 0, fmt.Errorf("Invalid port in %s", addr) + return "", 0, fmt.Errorf("Invalid port in %s", addr) } - return pts[0], uint16(port64), nil + + return ip, uint16(port64), nil } diff --git a/src/util/iputil/iputil_test.go b/src/util/iputil/iputil_test.go index 0b79410..bc2280e 100755 --- a/src/util/iputil/iputil_test.go +++ b/src/util/iputil/iputil_test.go @@ -2,10 +2,13 @@ package iputil import ( "fmt" + "net" "testing" + + "github.com/stretchr/testify/require" ) -func TestSplitAddr(t *testing.T) { +func TestIsLocalhost(t *testing.T) { testData := []struct { host string expected bool @@ -30,19 +33,33 @@ func TestSplitAddr(t *testing.T) { host: "85.56.12.34", expected: false, }, + { + host: "::1", + expected: true, + }, + { + host: "::", + expected: false, + }, + { + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + expected: false, + }, + { + host: "", + expected: false, + }, } - for _, test := range testData { - actual := IsLocalhost(test.host) - - if test.expected != actual { - t.Errorf("Expected %t is not equal to actual %t for host %s", - test.expected, actual, test.host) - } + for _, tc := range testData { + t.Run(tc.host, func(t *testing.T) { + actual := IsLocalhost(tc.host) + require.Equal(t, tc.expected, actual) + }) } } -func TestIsLocalhost(t *testing.T) { +func TestSplitAddr(t *testing.T) { testData := []struct { input string host string @@ -53,46 +70,55 @@ func TestIsLocalhost(t *testing.T) { input: "0.0.0.0:8888", host: "0.0.0.0", port: 8888, - err: nil, }, { input: "0.0.0.0:", - host: "0.0.0.0", err: fmt.Errorf("Invalid port in %s", "0.0.0.0:"), }, + { + input: "0.0.0.0:x", + err: fmt.Errorf("Invalid port in %s", "0.0.0.0:x"), + }, { input: ":9999", - port: 9999, - err: fmt.Errorf("Invalid port in %s", ":9999"), + err: fmt.Errorf("IP missing from %s", ":9999"), }, { input: "127.0.0.1", - host: "127.0.0.1", - err: fmt.Errorf("Invalid addr %s", "127.0.0.1"), + err: &net.AddrError{ + Err: "missing port in address", + Addr: "127.0.0.1", + }, + }, + { + input: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:1234", + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + port: 1234, + }, + { + input: "[::]:1234", + host: "::", + port: 1234, + }, + { + input: "[::]:x", + err: fmt.Errorf("Invalid port in %s", "[::]:x"), }, } - for _, test := range testData { - addr, port, err := SplitAddr(test.input) - - if test.err == nil && err != nil { - t.Errorf("Unexpected error %v", err) - return - } + for _, tc := range testData { + t.Run(tc.input, func(t *testing.T) { + addr, port, err := SplitAddr(tc.input) - if test.err != nil && err != nil && err.Error() != test.err.Error() { - t.Errorf("Expected error %v, actual %v", test.err, err) - return - } + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } - if addr != test.host { - t.Errorf("Wrong host, expected %s actual %s", test.host, addr) - return - } + require.NoError(t, err) - if port != test.port { - t.Errorf("Wrong port, expected %d actual %d", test.port, port) - return - } + require.Equal(t, tc.host, addr) + require.Equal(t, tc.port, port) + }) } } diff --git a/src/visor/blockchain.go b/src/visor/blockchain.go index b96b582..a01e332 100755 --- a/src/visor/blockchain.go +++ b/src/visor/blockchain.go @@ -5,12 +5,12 @@ import ( "errors" "sync" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/util/fee" "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" ) const ( @@ -18,9 +18,11 @@ const ( DebugLevel1 = true // DebugLevel2 enable checks for impossible conditions DebugLevel2 = true +) - // SigVerifyTheadNum signature verifycation goroutine number - SigVerifyTheadNum = 4 +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") ) //Warning: 10e6 is 10 million, 1e6 is 1 million @@ -43,201 +45,232 @@ const ( // chainStore type chainStore interface { - Head() (*coin.SignedBlock, error) // returns head block - HeadSeq() uint64 // returns head block sequence - Len() uint64 // returns blockchain lenght - AddBlockWithTx(tx *bolt.Tx, b *coin.SignedBlock) error - GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) - GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) - UnspentPool() blockdb.UnspentPool - GetGenesisBlock() *coin.SignedBlock + Head(*dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(*dbutil.Tx) (uint64, bool, error) + Len(*dbutil.Tx) (uint64, error) + AddBlock(*dbutil.Tx, *coin.SignedBlock) error + GetBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetSignedBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(*dbutil.Tx, uint64) (*coin.SignedBlock, error) + UnspentPool() blockdb.UnspentPooler + GetGenesisBlock(*dbutil.Tx) (*coin.SignedBlock, error) + GetBlockSignature(*dbutil.Tx, *coin.Block) (cipher.Sig, bool, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// DefaultWalker default blockchain walker +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + if len(hps) == 0 { + return cipher.SHA256{}, false + } + return hps[0].Hash, true } -// BlockListener notify the register when new block is appended to the chain -type BlockListener func(b coin.Block) +// CreateBuckets creates the buckets used by the blockdb +func CreateBuckets(db *dbutil.DB) error { + return db.Update("CreateBuckets", func(tx *dbutil.Tx) error { + if err := historydb.CreateBuckets(tx); err != nil { + return err + } -// Blockchain maintains blockchain and provides apis for accessing the chain. -type Blockchain struct { - db *bolt.DB - pubkey cipher.PubKey - blkListener []BlockListener + if err := blockdb.CreateBuckets(tx); err != nil { + return err + } - // arbitrating mode, if in arbitrating mode, when master node execute blocks, + return dbutil.CreateBuckets(tx, [][]byte{ + UnconfirmedTxnsBkt, + UnconfirmedUnspentsBkt, + }) + }) +} + +// BlockchainConfig configures Blockchain options +type BlockchainConfig struct { + // Arbitrating mode: if in arbitrating mode, when master node execute blocks, // the invalid transaction will be skipped and continue the next; otherwise, // node will throw the error and return. - arbitrating bool - store chainStore + Arbitrating bool + Pubkey cipher.PubKey } -// Option represents the option when creating the blockchain -type Option func(*Blockchain) - -// DefaultWalker default blockchain walker -func DefaultWalker(hps []coin.HashPair) cipher.SHA256 { - return hps[0].Hash +// Blockchain maintains blockchain and provides apis for accessing the chain. +type Blockchain struct { + db *dbutil.DB + cfg BlockchainConfig + store chainStore } -// NewBlockchain use the walker go through the tree and update the head and unspent outputs. -func NewBlockchain(db *bolt.DB, pubkey cipher.PubKey, ops ...Option) (*Blockchain, error) { +// NewBlockchain creates a Blockchain +func NewBlockchain(db *dbutil.DB, cfg BlockchainConfig) (*Blockchain, error) { chainstore, err := blockdb.NewBlockchain(db, DefaultWalker) if err != nil { return nil, err } - bc := &Blockchain{ - db: db, - pubkey: pubkey, - store: chainstore, - } - - for _, op := range ops { - op(bc) - } - - // verify signature - if err := bc.verifySigs(); err != nil { - return nil, err - } - - return bc, nil -} - -// Arbitrating option to change the mode -func Arbitrating(enable bool) Option { - return func(bc *Blockchain) { - bc.arbitrating = enable - } + return &Blockchain{ + cfg: cfg, + db: db, + store: chainstore, + }, nil } // GetGenesisBlock returns genesis block -func (bc *Blockchain) GetGenesisBlock() *coin.SignedBlock { - return bc.store.GetGenesisBlock() +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.GetGenesisBlock(tx) } -// GetBlockByHash returns block of given hash -func (bc *Blockchain) GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { - return bc.store.GetBlockByHash(hash) +// GetSignedBlockByHash returns block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockByHash(tx, hash) } -// GetBlockBySeq returns block of given seq -func (bc *Blockchain) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { - return bc.store.GetBlockBySeq(seq) +// GetSignedBlockBySeq returns block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockBySeq(tx, seq) } -func (bc *Blockchain) processBlock(b coin.SignedBlock) (coin.SignedBlock, error) { - if bc.Len() > 0 { - if !bc.isGenesisBlock(b.Block) { - if err := bc.verifyBlockHeader(b.Block); err != nil { - return coin.SignedBlock{}, err - } - - txns, err := bc.processTransactions(b.Body.Transactions) - if err != nil { - return coin.SignedBlock{}, err - } - b.Body.Transactions = txns - - if err := bc.verifyUxHash(b.Block); err != nil { - return coin.SignedBlock{}, err - } - - } - } - - return b, nil +// Head returns the most recent confirmed block +func (bc Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.Head(tx) } // Unspent returns the unspent outputs pool -func (bc *Blockchain) Unspent() blockdb.UnspentPool { +func (bc *Blockchain) Unspent() blockdb.UnspentPooler { return bc.store.UnspentPool() } // Len returns the length of current blockchain. -func (bc Blockchain) Len() uint64 { - return bc.store.Len() -} - -// Head returns the most recent confirmed block -func (bc Blockchain) Head() (*coin.SignedBlock, error) { - return bc.store.Head() +func (bc Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + return bc.store.Len(tx) } // HeadSeq returns the sequence of head block -func (bc *Blockchain) HeadSeq() uint64 { - return bc.store.HeadSeq() +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.store.HeadSeq(tx) } // Time returns time of last block // used as system clock indepedent clock for coin hour calculations // TODO: Deprecate -func (bc *Blockchain) Time() uint64 { - b, err := bc.Head() +func (bc *Blockchain) Time(tx *dbutil.Tx) (uint64, error) { + b, err := bc.Head(tx) if err != nil { - return 0 + if err == blockdb.ErrNoHeadBlock { + return 0, nil + } + return 0, err } - return b.Time() + return b.Time(), nil } // NewBlock creates a Block given an array of Transactions. // Only hard constraints are applied to transactions in the block. // The caller of this function should apply any additional soft constraints, // and choose which transactions to place into the block. -func (bc Blockchain) NewBlock(txns coin.Transactions, currentTime uint64) (*coin.Block, error) { - if currentTime <= bc.Time() { - return nil, errors.New("Time can only move forward") - } - +func (bc Blockchain) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { if len(txns) == 0 { return nil, errors.New("No transactions") } - txns, err := bc.processTransactions(txns) + + head, err := bc.store.Head(tx) if err != nil { return nil, err } - uxHash := bc.Unspent().GetUxHash() - head, err := bc.Head() + if currentTime <= head.Time() { + return nil, errors.New("Time can only move forward") + } + + txns, err = bc.processTransactions(tx, txns) if err != nil { return nil, err } - b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, bc.TransactionFee) + uxHash, err := bc.Unspent().GetUxHash(tx) if err != nil { return nil, err } - //make sure block is valid + feeCalc := bc.TransactionFee(tx, head.Time()) + + b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, feeCalc) + if err != nil { + return nil, err + } + + // make sure block is valid if DebugLevel2 == true { - if err := bc.verifyBlockHeader(*b); err != nil { + if err := bc.verifyBlockHeader(tx, *b); err != nil { return nil, err } - txns, err := bc.processTransactions(b.Body.Transactions) + txns, err := bc.processTransactions(tx, b.Body.Transactions) if err != nil { - logger.Panic("Impossible Error: not allowed to fail") + logger.Panicf("bc.processTransactions second verification call failed: %v", err) } b.Body.Transactions = txns } return b, nil } -// ExecuteBlockWithTx attempts to append block to blockchain with *bolt.Tx -func (bc *Blockchain) ExecuteBlockWithTx(tx *bolt.Tx, sb *coin.SignedBlock) error { - if bc.Len() > 0 { - head, err := bc.Head() +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b coin.SignedBlock) (coin.SignedBlock, error) { + length, err := bc.Len(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if length > 0 { + if isGenesis, err := bc.isGenesisBlock(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } else if isGenesis { + err := errors.New("Attempted to process genesis block after blockchain has genesis block") + logger.Warning(err.Error()) + return coin.SignedBlock{}, err + } else { + if err := bc.verifyBlockHeader(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + return coin.SignedBlock{}, err + } + + b.Body.Transactions = txns + + if err := bc.verifyUxHash(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + } + } + + return b, nil +} + +// ExecuteBlock attempts to append block to blockchain with *dbutil.Tx +func (bc *Blockchain) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + length, err := bc.Len(tx) + if err != nil { + return err + } + + if length > 0 { + head, err := bc.Head(tx) if err != nil { return err } + // TODO -- why do we modify the block here? sb.Head.PrevHash = head.HashHeader() } - nb, err := bc.processBlock(*sb) + nb, err := bc.processBlock(tx, *sb) if err != nil { return err } - if err := bc.store.AddBlockWithTx(tx, &nb); err != nil { + if err := bc.store.AddBlock(tx, &nb); err != nil { return err } @@ -245,32 +278,39 @@ func (bc *Blockchain) ExecuteBlockWithTx(tx *bolt.Tx, sb *coin.SignedBlock) erro } // isGenesisBlock checks if the block is genesis block -func (bc Blockchain) isGenesisBlock(b coin.Block) bool { - gb := bc.store.GetGenesisBlock() +func (bc Blockchain) isGenesisBlock(tx *dbutil.Tx, b coin.Block) (bool, error) { + gb, err := bc.store.GetGenesisBlock(tx) + if err != nil { + return false, err + } if gb == nil { - return false + return false, nil } - return gb.HashHeader() == b.HashHeader() + return gb.HashHeader() == b.HashHeader(), nil } // Compares the state of the current UxHash hash to state of unspent // output pool. -func (bc Blockchain) verifyUxHash(b coin.Block) error { - uxHash := bc.Unspent().GetUxHash() +func (bc Blockchain) verifyUxHash(tx *dbutil.Tx, b coin.Block) error { + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return err + } if !bytes.Equal(b.Head.UxHash[:], uxHash[:]) { return errors.New("UxHash does not match") } + return nil } // VerifyBlockTxnConstraints checks that the transaction does not violate hard constraints, // for transactions that are already included in a block. -func (bc Blockchain) VerifyBlockTxnConstraints(tx coin.Transaction) error { - // NOTE: Unspent().GetArray() returns an error if not all tx.In can be found +func (bc Blockchain) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found // This prevents double spends - uxIn, err := bc.Unspent().GetArray(tx.In) + uxIn, err := bc.Unspent().GetArray(tx, txn.In) if err != nil { switch err.(type) { case blockdb.ErrUnspentNotExist: @@ -280,16 +320,16 @@ func (bc Blockchain) VerifyBlockTxnConstraints(tx coin.Transaction) error { } } - head, err := bc.Head() + head, err := bc.Head(tx) if err != nil { return err } - return bc.verifyBlockTxnHardConstraints(tx, head, uxIn) + return bc.verifyBlockTxnHardConstraints(tx, txn, head, uxIn) } -func (bc Blockchain) verifyBlockTxnHardConstraints(tx coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { - if err := VerifyBlockTxnConstraints(tx, head, uxIn); err != nil { +func (bc Blockchain) verifyBlockTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifyBlockTxnConstraints(txn, head, uxIn); err != nil { return err } @@ -300,9 +340,11 @@ func (bc Blockchain) verifyBlockTxnHardConstraints(tx coin.Transaction, head *co // because it relies on the unspent pool to check for existence. // For remote callers such as the CLI, they'd need to download the whole // unspent pool or make a separate API call to check for duplicate unspents. - uxOut := coin.CreateUnspents(head.Head, tx) + uxOut := coin.CreateUnspents(head.Head, txn) for i := range uxOut { - if bc.Unspent().Contains(uxOut[i].Hash()) { + if contains, err := bc.Unspent().Contains(tx, uxOut[i].Hash()); err != nil { + return err + } else if contains { err := errors.New("New unspent collides with existing unspent") return NewErrTxnViolatesHardConstraint(err) } @@ -314,10 +356,10 @@ func (bc Blockchain) verifyBlockTxnHardConstraints(tx coin.Transaction, head *co // VerifySingleTxnHardConstraints checks that the transaction does not violate hard constraints. // for transactions that are not included in a block. -func (bc Blockchain) VerifySingleTxnHardConstraints(tx coin.Transaction) error { - // NOTE: Unspent().GetArray() returns an error if not all tx.In can be found +func (bc Blockchain) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found // This prevents double spends - uxIn, err := bc.Unspent().GetArray(tx.In) + uxIn, err := bc.Unspent().GetArray(tx, txn.In) if err != nil { switch err.(type) { case blockdb.ErrUnspentNotExist: @@ -327,40 +369,40 @@ func (bc Blockchain) VerifySingleTxnHardConstraints(tx coin.Transaction) error { } } - head, err := bc.Head() + head, err := bc.Head(tx) if err != nil { return err } - return bc.verifySingleTxnHardConstraints(tx, head, uxIn) + return bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn) } -// VerifySingleTxnAllConstraints checks that the transaction does not violate hard or soft constraints, +// VerifySingleTxnSoftHardConstraints checks that the transaction does not violate hard or soft constraints, // for transactions that are not included in a block. // Hard constraints are checked before soft constraints. -func (bc Blockchain) VerifySingleTxnAllConstraints(tx coin.Transaction, maxSize int) error { - // NOTE: Unspent().GetArray() returns an error if not all tx.In can be found +func (bc Blockchain) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, maxSize int) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found // This prevents double spends - uxIn, err := bc.Unspent().GetArray(tx.In) + uxIn, err := bc.Unspent().GetArray(tx, txn.In) if err != nil { return NewErrTxnViolatesHardConstraint(err) } - head, err := bc.Head() + head, err := bc.Head(tx) if err != nil { return err } // Hard constraints must be checked before soft constraints - if err := bc.verifySingleTxnHardConstraints(tx, head, uxIn); err != nil { + if err := bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn); err != nil { return err } - return VerifySingleTxnSoftConstraints(tx, head.Time(), uxIn, maxSize) + return VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, maxSize) } -func (bc Blockchain) verifySingleTxnHardConstraints(tx coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { - if err := VerifySingleTxnHardConstraints(tx, head, uxIn); err != nil { +func (bc Blockchain) verifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifySingleTxnHardConstraints(txn, head, uxIn); err != nil { return err } @@ -371,9 +413,11 @@ func (bc Blockchain) verifySingleTxnHardConstraints(tx coin.Transaction, head *c // because it relies on the unspent pool to check for existence. // For remote callers such as the CLI, they'd need to download the whole // unspent pool or make a separate API call to check for duplicate unspents. - uxOut := coin.CreateUnspents(head.Head, tx) + uxOut := coin.CreateUnspents(head.Head, txn) for i := range uxOut { - if bc.Unspent().Contains(uxOut[i].Hash()) { + if contains, err := bc.Unspent().Contains(tx, uxOut[i].Hash()); err != nil { + return err + } else if contains { err := errors.New("New unspent collides with existing unspent") return NewErrTxnViolatesHardConstraint(err) } @@ -384,15 +428,16 @@ func (bc Blockchain) verifySingleTxnHardConstraints(tx coin.Transaction, head *c } // GetBlocks return blocks whose seq are in the range of start and end. -func (bc Blockchain) GetBlocks(start, end uint64) ([]coin.SignedBlock, error) { +func (bc Blockchain) GetBlocks(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) { if start > end { return nil, nil } var blocks []coin.SignedBlock for i := start; i <= end; i++ { - b, err := bc.store.GetBlockBySeq(i) + b, err := bc.store.GetSignedBlockBySeq(tx, i) if err != nil { + logger.WithError(err).Error("bc.store.GetBlockBySeq failed") return nil, err } @@ -407,17 +452,25 @@ func (bc Blockchain) GetBlocks(start, end uint64) ([]coin.SignedBlock, error) { } // GetLastBlocks return the latest N blocks. -func (bc Blockchain) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { +func (bc Blockchain) GetLastBlocks(tx *dbutil.Tx, num uint64) ([]coin.SignedBlock, error) { if num == 0 { return nil, nil } - end := bc.HeadSeq() + end, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + start := int(end-num) + 1 if start < 0 { start = 0 } - return bc.GetBlocks(uint64(start), end) + + return bc.GetBlocks(tx, uint64(start), end) } /* Private */ @@ -432,71 +485,84 @@ func (bc Blockchain) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { // TODO: // - move arbitration to visor // - blockchain should have strict checking -func (bc Blockchain) processTransactions(txs coin.Transactions) (coin.Transactions, error) { - // copy txs so that the following code won't modify the origianl txs +func (bc Blockchain) processTransactions(tx *dbutil.Tx, txs coin.Transactions) (coin.Transactions, error) { + // copy txs so that the following code won't modify the original txns txns := make(coin.Transactions, len(txs)) copy(txns, txs) + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + // Transactions need to be sorted by fee and hash before arbitrating - if bc.arbitrating { - txns = coin.SortTransactions(txns, bc.TransactionFee) + if bc.cfg.Arbitrating { + txns = coin.SortTransactions(txns, bc.TransactionFee(tx, head.Time())) } + //TODO: audit if len(txns) == 0 { - if bc.arbitrating { + if bc.cfg.Arbitrating { return txns, nil } + // If there are no transactions, a block should not be made return nil, errors.New("No transactions") } skip := make(map[int]struct{}) uxHashes := make(coin.UxHashSet, len(txns)) - for i, tx := range txns { + for i, txn := range txns { // Check the transaction against itself. This covers the hash, // signature indices and duplicate spends within itself - err := bc.VerifyBlockTxnConstraints(tx) - if err != nil { - if bc.arbitrating { - skip[i] = struct{}{} - continue - } else { - return nil, err + if err := bc.VerifyBlockTxnConstraints(tx, txn); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } } + + return nil, err } // Check that each pending unspent will be unique uxb := coin.UxBody{ - SrcTransaction: tx.Hash(), + SrcTransaction: txn.Hash(), } - for _, to := range tx.Out { + + for _, to := range txn.Out { uxb.Coins = to.Coins uxb.Hours = to.Hours uxb.Address = to.Address + h := uxb.Hash() _, exists := uxHashes[h] if exists { - if bc.arbitrating { + if bc.cfg.Arbitrating { skip[i] = struct{}{} continue } else { - m := "Duplicate unspent output across transactions" - return nil, errors.New(m) + return nil, errors.New("Duplicate unspent output across transactions") } } + if DebugLevel1 { // Check that the expected unspent is not already in the pool. // This should never happen because its a hash collision - if bc.Unspent().Contains(h) { - if bc.arbitrating { + if contains, err := bc.Unspent().Contains(tx, h); err != nil { + return nil, err + } else if contains { + if bc.cfg.Arbitrating { skip[i] = struct{}{} continue } else { - m := "Output hash is in the UnspentPool" - return nil, errors.New(m) + return nil, errors.New("Output hash is in the UnspentPool") } } } + uxHashes[h] = struct{}{} } } @@ -536,15 +602,14 @@ func (bc Blockchain) processTransactions(txs coin.Transactions) (coin.Transactio for a := range s.In { for b := range t.In { if s.In[a] == t.In[b] { - if bc.arbitrating { + if bc.cfg.Arbitrating { // The txn with the highest fee and lowest hash // is chosen when attempting a double spend. // Since the txns are sorted, we skip the 2nd // iterable skip[j] = struct{}{} } else { - m := "Cannot spend output twice in the same block" - return nil, errors.New(m) + return nil, errors.New("Cannot spend output twice in the same block") } } } @@ -567,94 +632,155 @@ func (bc Blockchain) processTransactions(txs coin.Transactions) (coin.Transactio } // TransactionFee calculates the current transaction fee in coinhours of a Transaction -func (bc Blockchain) TransactionFee(t *coin.Transaction) (uint64, error) { - headTime := bc.Time() - inUxs, err := bc.Unspent().GetArray(t.In) - if err != nil { - return 0, err - } +func (bc Blockchain) TransactionFee(tx *dbutil.Tx, headTime uint64) coin.FeeCalculator { + return func(txn *coin.Transaction) (uint64, error) { + inUxs, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return 0, err + } - return fee.TransactionFee(t, headTime, inUxs) + return fee.TransactionFee(txn, headTime, inUxs) + } } -// verifySigs checks that BlockSigs state correspond with coin.Blockchain state +// VerifySignature checks that BlockSigs state correspond with coin.Blockchain state // and that all signatures are valid. -func (bc *Blockchain) verifySigs() error { - if bc.Len() == 0 { - return nil - } - - head, err := bc.Head() +func (bc *Blockchain) VerifySignature(block *coin.SignedBlock) error { + err := cipher.VerifySignature(bc.cfg.Pubkey, block.Sig, block.HashHeader()) if err != nil { - return err - } - - seqC := make(chan uint64) + logger.Errorf("Signature verification failed: %v", err) + } + return err +} + +// WalkChain walk through the blockchain concurrently +// The quit channel is optional and if closed, this method still stop. +func (bc *Blockchain) WalkChain(workers int, f func(*dbutil.Tx, *coin.SignedBlock) error, quit chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + signedBlockC := make(chan *coin.SignedBlock, 100) + errC := make(chan error, 100) + interrupt := make(chan struct{}) + verifyDone := make(chan struct{}) + + // Verify block signatures in a worker pool + var workerWg sync.WaitGroup + workerWg.Add(workers) + for i := 0; i < workers; i++ { + go func() { + defer workerWg.Done() + bc.db.View("WalkChain verify blocks", func(tx *dbutil.Tx) error { + for { + select { + case b, ok := <-signedBlockC: + if !ok { + return nil + } - shutdown, errC := bc.sigVerifier(seqC) + if err := f(tx, b); err != nil { + // if err := cipher.VerifySignature(bc.cfg.Pubkey, sh.sig, sh.hash); err != nil { + // logger.Errorf("Signature verification failed: %v", err) + select { + case errC <- err: + default: + } + } + } + } + }) + }() + } + + // Wait for verification worker goroutines to finish + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + workerWg.Wait() + close(verifyDone) + }() + + // Iterate all blocks stored in the "blocks" bucket + // * Detect if a corresponding signature is missing from the signatures bucket + // * Verify the signature for the block + wg.Add(1) + go func() { + bc.db.View("WalkChain get blocks", func(tx *dbutil.Tx) error { + if length, err := bc.Len(tx); err != nil { + return err + } else if length == 0 { + return nil + } + defer wg.Done() + defer close(signedBlockC) - for i := uint64(0); i <= head.Seq(); i++ { - seqC <- i - } + errInterrupted := errors.New("goroutine was stopped") - shutdown() + if err := bc.store.ForEachBlock(tx, func(block *coin.Block) error { + sig, ok, err := bc.store.GetBlockSignature(tx, block) + if err != nil { + return err + } + if !ok { + return blockdb.NewErrMissingSignature(block) + } - return <-errC -} + signedBlock := &coin.SignedBlock{ + Sig: sig, + Block: *block, + } -// signature verifier will get block seq from seqC channel, -// and have multiple thread to do signature verification. -func (bc *Blockchain) sigVerifier(seqC chan uint64) (func(), <-chan error) { - quitC := make(chan struct{}) - wg := sync.WaitGroup{} - errC := make(chan error, 1) - for i := 0; i < SigVerifyTheadNum; i++ { - wg.Add(1) - go func(id int) { - defer wg.Done() - for { select { - case seq := <-seqC: - if err := bc.verifyBlockSig(seq); err != nil { - errC <- err - return - } - case <-quitC: - return + case signedBlockC <- signedBlock: + return nil + case <-quit: + return errInterrupted + case <-interrupt: + return errInterrupted + } + }); err != nil && err != errInterrupted { + switch err.(type) { + case blockdb.ErrMissingSignature: + default: + logger.Errorf("bc.store.ForEachBlock failed: %v", err) + } + select { + case errC <- err: + default: } } - }(i) - } + return nil + }) + }() - return func() { - close(quitC) - wg.Wait() - select { - case errC <- nil: - // no error - default: - // already has error in errC + var err error + select { + case err = <-errC: + if err != nil { + break } - }, errC -} - -func (bc *Blockchain) verifyBlockSig(seq uint64) error { - sb, err := bc.store.GetBlockBySeq(seq) - if err != nil { - return err + case <-quit: + err = ErrVerifyStopped + break + case <-verifyDone: + break } - return sb.VerifySignature(bc.pubkey) + close(interrupt) + wg.Wait() + return err } // VerifyBlockHeader Returns error if the BlockHeader is not valid -func (bc Blockchain) verifyBlockHeader(b coin.Block) error { - //check BkSeq - head, err := bc.Head() +func (bc Blockchain) verifyBlockHeader(tx *dbutil.Tx, b coin.Block) error { + head, err := bc.Head(tx) if err != nil { return err } + //check BkSeq if b.Head.BkSeq != head.Head.BkSeq+1 { return errors.New("BkSeq invalid") } @@ -671,20 +797,3 @@ func (bc Blockchain) verifyBlockHeader(b coin.Block) error { } return nil } - -// BindListener register the listener to blockchain, when new block appended, the listener will be invoked. -func (bc *Blockchain) BindListener(ls BlockListener) { - bc.blkListener = append(bc.blkListener, ls) -} - -// Notify notifies the listener the new block. -func (bc *Blockchain) Notify(b coin.Block) { - for _, l := range bc.blkListener { - l(b) - } -} - -// UpdateDB updates db with given func -func (bc *Blockchain) UpdateDB(f func(t *bolt.Tx) error) error { - return bc.db.Update(f) -} diff --git a/src/visor/blockchain_parser.go b/src/visor/blockchain_parser.go deleted file mode 100755 index 1249f3f..0000000 --- a/src/visor/blockchain_parser.go +++ /dev/null @@ -1,99 +0,0 @@ -package visor - -import ( - "fmt" - - "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/historydb" -) - -// ParserOption option type which will be used when creating parser instance -type ParserOption func(*BlockchainParser) - -// BlockchainParser parses the blockchain and stores the data into historydb. -type BlockchainParser struct { - historyDB historyer - blkC chan coin.Block - quit chan struct{} - done chan struct{} - bc Blockchainer - - isStart bool -} - -// NewBlockchainParser create and init the parser instance. -func NewBlockchainParser(hisDB *historydb.HistoryDB, bc *Blockchain, ops ...ParserOption) *BlockchainParser { - bp := &BlockchainParser{ - bc: bc, - historyDB: hisDB, - quit: make(chan struct{}), - done: make(chan struct{}), - blkC: make(chan coin.Block, 10), - } - - for _, op := range ops { - op(bp) - } - - return bp -} - -// FeedBlock feeds block to the parser -func (bcp *BlockchainParser) FeedBlock(b coin.Block) { - bcp.blkC <- b -} - -// Run starts blockchain parser -func (bcp *BlockchainParser) Run() error { - logger.Info("Blockchain parser start") - defer close(bcp.done) - defer logger.Info("Blockchain parser closed") - - if err := bcp.historyDB.ResetIfNeed(); err != nil { - return err - } - - // parse to the blockchain head - headSeq := bcp.bc.HeadSeq() - if err := bcp.parseTo(headSeq); err != nil { - return err - } - - for { - select { - case <-bcp.quit: - return nil - case b := <-bcp.blkC: - if err := bcp.historyDB.ParseBlock(&b); err != nil { - return err - } - } - } -} - -// Shutdown close the block parsing process. -func (bcp *BlockchainParser) Shutdown() { - close(bcp.quit) - <-bcp.done -} - -func (bcp *BlockchainParser) parseTo(bcHeight uint64) error { - parsedHeight := bcp.historyDB.ParsedHeight() - - for i := int64(0); i < int64(bcHeight)-parsedHeight; i++ { - b, err := bcp.bc.GetBlockBySeq(uint64(parsedHeight + i + 1)) - if err != nil { - return err - } - - if b == nil { - return fmt.Errorf("no block exist in depth:%d", parsedHeight+i+1) - } - - if err := bcp.historyDB.ParseBlock(&b.Block); err != nil { - return err - } - } - - return nil -} diff --git a/src/visor/blockchain_test.go b/src/visor/blockchain_test.go index 6b065e5..ad70683 100755 --- a/src/visor/blockchain_test.go +++ b/src/visor/blockchain_test.go @@ -6,13 +6,11 @@ import ( "github.com/stretchr/testify/require" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/utc" "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var ( @@ -23,36 +21,25 @@ var ( var genTime uint64 = 1000 var genCoins uint64 = 1000e6 -func tNow() uint64 { - return uint64(utc.UnixNow()) -} - func feeCalc(t *coin.Transaction) (uint64, error) { return 0, nil } -func makeFeeCalc(fee uint64) coin.FeeCalculator { - return func(t *coin.Transaction) (uint64, error) { - return fee, nil - } -} - -func addGenesisBlock(t *testing.T, bc Blockchainer) *coin.SignedBlock { +func addGenesisBlockToBlockchain(t *testing.T, bc *Blockchain) *coin.SignedBlock { // create genesis block gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) require.NoError(t, err) gbSig := cipher.SignHash(gb.HashHeader(), genSecret) - bcc, ok := bc.(*Blockchain) - require.True(t, ok) - // add genesis block to blockchain - require.NoError(t, bcc.db.Update(func(tx *bolt.Tx) error { - return bcc.store.AddBlockWithTx(tx, &coin.SignedBlock{ + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ Block: *gb, Sig: gbSig, }) - })) + }) + require.NoError(t, err) + return &coin.SignedBlock{ Block: *gb, Sig: gbSig, @@ -84,41 +71,50 @@ func makeSpendTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr ci /* Helpers */ type fakeChainStore struct { - len uint64 blocks []coin.SignedBlock - up blockdb.UnspentPool } -func (fcs fakeChainStore) Head() (*coin.SignedBlock, error) { +func (fcs *fakeChainStore) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { l := len(fcs.blocks) if l == 0 { - return nil, errors.New("no head block") + return nil, blockdb.ErrNoHeadBlock } return &fcs.blocks[l-1], nil } -func (fcs fakeChainStore) HeadSeq() uint64 { - h, err := fcs.Head() +func (fcs *fakeChainStore) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + h, err := fcs.Head(tx) if err != nil { - return 0 + if err == blockdb.ErrNoHeadBlock { + return 0, false, nil + } + return 0, false, err } - return h.Seq() + return h.Seq(), true, nil } -func (fcs fakeChainStore) Len() uint64 { - return uint64(len(fcs.blocks)) +func (fcs *fakeChainStore) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fcs.blocks)), nil } -func (fcs fakeChainStore) AddBlockWithTx(tx *bolt.Tx, b *coin.SignedBlock) error { +func (fcs *fakeChainStore) AddBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { return nil } -func (fcs fakeChainStore) GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { +func (fcs *fakeChainStore) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return cipher.Sig{}, false, nil +} + +func (fcs *fakeChainStore) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { return nil, nil } -func (fcs fakeChainStore) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { +func (fcs *fakeChainStore) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { l := len(fcs.blocks) if seq >= uint64(l) { return nil, nil @@ -127,14 +123,18 @@ func (fcs fakeChainStore) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { return &fcs.blocks[seq], nil } -func (fcs fakeChainStore) UnspentPool() blockdb.UnspentPool { +func (fcs *fakeChainStore) UnspentPool() blockdb.UnspentPooler { return nil } -func (fcs fakeChainStore) GetGenesisBlock() *coin.SignedBlock { +func (fcs *fakeChainStore) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { if len(fcs.blocks) > 0 { - return &fcs.blocks[0] + return &fcs.blocks[0], nil } + return nil, nil +} + +func (fcs *fakeChainStore) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { return nil } @@ -188,11 +188,21 @@ func TestBlockchainTime(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + bc := Blockchain{ + db: db, store: tc.store, } - require.Equal(t, tc.time, bc.Time()) + err := db.View("", func(tx *dbutil.Tx) error { + tm, err := bc.Time(tx) + require.NoError(t, err) + require.Equal(t, tc.time, tm) + return nil + }) + require.NoError(t, err) }) } } @@ -235,7 +245,9 @@ func TestIsGenesisBlock(t *testing.T) { store: tc.store, } - require.Equal(t, tc.isGenesis, bc.isGenesisBlock(*tc.b)) + isGenesis, err := bc.isGenesisBlock(nil, *tc.b) + require.NoError(t, err) + require.Equal(t, tc.isGenesis, isGenesis) }) } } @@ -296,17 +308,26 @@ func TestVerifyBlockHeader(t *testing.T) { "empty blockchain", &fakeChainStore{}, coin.Block{}, - errors.New("no head block"), + blockdb.ErrNoHeadBlock, }, } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - bc := Blockchain{ + db, closeDB := prepareDB(t) + defer closeDB() + + bc := &Blockchain{ + db: db, store: tc.store, } - err := bc.verifyBlockHeader(tc.b) - require.Equal(t, tc.err, err) + + err := db.View("", func(tx *dbutil.Tx) error { + err := bc.verifyBlockHeader(tx, tc.b) + require.Equal(t, tc.err, err) + return nil + }) + require.NoError(t, err) }) } } @@ -396,14 +417,22 @@ func TestGetBlocks(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + bc := Blockchain{ + db: db, store: tc.store, } - bs, err := bc.GetBlocks(tc.req.st, tc.req.ed) + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetBlocks(tx, tc.req.st, tc.req.ed) + require.NoError(t, err) + require.Equal(t, len(tc.expect), len(bs)) + require.Equal(t, tc.expect, bs) + return nil + }) require.NoError(t, err) - require.Equal(t, len(tc.expect), len(bs)) - require.Equal(t, tc.expect, bs) }) } } @@ -450,15 +479,37 @@ func TestGetLastBlocks(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + bc := Blockchain{ + db: db, store: tc.store, } - bs, err := bc.GetLastBlocks(tc.n) + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetLastBlocks(tx, tc.n) + require.NoError(t, err) + require.Equal(t, tc.expect, bs) + return nil + }) require.NoError(t, err) - require.Equal(t, tc.expect, bs) }) } + +} + +// newBlock calls bc.NewBlock in a dbutil.Tx +func newBlock(t *testing.T, bc *Blockchain, txn coin.Transaction, timestamp uint64) *coin.Block { + var b *coin.Block + err := bc.db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, timestamp) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + return b } type spending struct { @@ -545,7 +596,7 @@ func TestProcessTransactions(t *testing.T) { errors.New("Cannot spend output twice in the same block"), }, { - "arbitratint no transactions", + "arbitrating no transactions", true, []spending{}, []spending{}, @@ -593,37 +644,42 @@ func TestProcessTransactions(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { // create test db - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + // create chain store store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) // create Blockchain bc := &Blockchain{ - arbitrating: tc.arbitrating, - db: db, - store: store, + cfg: BlockchainConfig{ + Arbitrating: tc.arbitrating, + }, + db: db, + store: store, } // init chain - head := addGenesisBlock(t, bc) + head := addGenesisBlockToBlockchain(t, bc) tm := head.Time() for i, spend := range tc.initChain { uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) tx := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) - b, err := bc.NewBlock(coin.Transactions{tx}, tm+uint64(i*100)) - require.NoError(t, err) + b := newBlock(t, bc, tx, tm+uint64(i*100)) sb := &coin.SignedBlock{ Block: *b, Sig: cipher.SignHash(b.HashHeader(), genSecret), } - db.Update(func(tx *bolt.Tx) error { - return bc.store.AddBlockWithTx(tx, sb) + err = db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, sb) }) + require.NoError(t, err) head = sb } @@ -635,17 +691,35 @@ func TestProcessTransactions(t *testing.T) { txs[i] = tx } - _, err = bc.processTransactions(txs) - require.EqualValues(t, tc.err, err) + err = db.View("", func(tx *dbutil.Tx) error { + _, err := bc.processTransactions(tx, txs) + require.EqualValues(t, tc.err, err) + return nil + }) + require.NoError(t, err) }) } } +func getUxHash(t *testing.T, db *dbutil.DB, bc *Blockchain) cipher.SHA256 { + var uxHash cipher.SHA256 + err := db.View("", func(tx *dbutil.Tx) error { + var err error + uxHash, err = bc.Unspent().GetUxHash(tx) + return err + }) + require.NoError(t, err) + return uxHash +} + func TestVerifyUxHash(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) @@ -654,26 +728,37 @@ func TestVerifyUxHash(t *testing.T) { store: store, } - gb := addGenesisBlock(t, bc) - uxHash := bc.Unspent().GetUxHash() - tx := coin.Transaction{} - b, err := coin.NewBlock(gb.Block, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + gb := addGenesisBlockToBlockchain(t, bc) + uxHash := getUxHash(t, db, bc) + txn := coin.Transaction{} + b, err := coin.NewBlock(gb.Block, genTime+100, uxHash, coin.Transactions{txn}, feeCalc) require.NoError(t, err) - err = bc.verifyUxHash(*b) + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b) + require.NoError(t, err) + return nil + }) require.NoError(t, err) - b2, err := coin.NewBlock(gb.Block, genTime+10, testutil.RandSHA256(t), coin.Transactions{tx}, feeCalc) + b2, err := coin.NewBlock(gb.Block, genTime+10, testutil.RandSHA256(t), coin.Transactions{txn}, feeCalc) require.NoError(t, err) - err = bc.verifyUxHash(*b2) - require.Equal(t, errors.New("UxHash does not match"), err) + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b2) + require.Equal(t, errors.New("UxHash does not match"), err) + return nil + }) + require.NoError(t, err) } -func TestProcessBlockWIthTx(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) +func TestProcessBlock(t *testing.T) { + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) @@ -690,37 +775,48 @@ func TestProcessBlockWIthTx(t *testing.T) { Sig: cipher.SignHash(gb.HashHeader(), genSecret), } - // test with empty blockchain - _, err = bc.processBlock(sb) + // Test with empty blockchain + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, sb) + require.NoError(t, err) + return nil + }) require.NoError(t, err) // Add genesis block to chain store - db.Update(func(tx *bolt.Tx) error { - err := bc.store.AddBlockWithTx(tx, &sb) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.store.AddBlock(tx, &sb) require.NoError(t, err) return nil }) + require.NoError(t, err) - // create new block + // Create new block uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) toAddr := testutil.MakeAddress() tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) - uxhash := bc.Unspent().GetUxHash() - b, err := coin.NewBlock(*gb, genTime+100, uxhash, coin.Transactions{tx}, feeCalc) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) require.NoError(t, err) - _, err = bc.processBlock(coin.SignedBlock{ - Block: *b, - Sig: cipher.SignHash(b.HashHeader(), genSecret), + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil }) require.NoError(t, err) - } -func TestExecuteBlockWithTx(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) +func TestExecuteBlock(t *testing.T) { + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) @@ -738,26 +834,27 @@ func TestExecuteBlockWithTx(t *testing.T) { } // test with empty chain - db.Update(func(tx *bolt.Tx) error { - err := bc.ExecuteBlockWithTx(tx, &sb) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &sb) require.NoError(t, err) return nil }) + require.NoError(t, err) // new block uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) toAddr := testutil.MakeAddress() tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) - uxhash := bc.Unspent().GetUxHash() - - b, err := coin.NewBlock(*gb, genTime+100, uxhash, coin.Transactions{tx}, feeCalc) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) require.NoError(t, err) - db.Update(func(tx *bolt.Tx) error { - err := bc.ExecuteBlockWithTx(tx, &coin.SignedBlock{ + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &coin.SignedBlock{ Block: *b, Sig: cipher.SignHash(b.HashHeader(), genSecret), }) require.NoError(t, err) return nil }) + require.NoError(t, err) } diff --git a/src/visor/blockchain_verify_test.go b/src/visor/blockchain_verify_test.go index 783c874..280c585 100755 --- a/src/visor/blockchain_verify_test.go +++ b/src/visor/blockchain_verify_test.go @@ -6,141 +6,212 @@ import ( "math" "testing" - "github.com/boltdb/bolt" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" "github.com/skycoin/skycoin/src/visor/blockdb" -) - -var ( - GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() - GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) + "github.com/skycoin/skycoin/src/visor/dbutil" ) const ( - TimeIncrement uint64 = 3600 * 1000 - GenesisTime uint64 = 1000 - GenesisCoins uint64 = 1000e6 + // GenesisTime is the time of the genesis block created in MakeBlockchain + GenesisTime uint64 = 1000 + // GenesisCoins is the amount of coins in the genesis block created in MakeBlockchain + GenesisCoins uint64 = 1000e6 + // GenesisCoinHours is the amount of coin hours in the genesis block created in MakeBlockchain GenesisCoinHours uint64 = 1000 * 1000 + // TimeIncrement is the default time increment used when creating a block with CreateGenesisSpendTransaction + TimeIncrement uint64 = 3600 * 1000 ) -func MakeTransactionForChain(t *testing.T, bc *Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { - chrs, err := ux.CoinHours(bc.Time()) - require.NoError(t, err) +var ( + // GenesisPublic is the public key used in the genesis block created in MakeBlockchain + GenesisPublic cipher.PubKey + // GenesisSecret is the secret key used in the genesis block created in MakeBlockchain + GenesisSecret cipher.SecKey + // GenesisAddress is the address used in the genesis block created in MakeBlockchain + GenesisAddress cipher.Address +) - require.Equal(t, cipher.AddressFromPubKey(cipher.PubKeyFromSecKey(sec)), ux.Body.Address) +func init() { + GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() + GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) +} - knownUx, exists := bc.Unspent().Get(ux.Hash()) - require.True(t, exists) - require.Equal(t, knownUx, ux) +// MakeBlockchain creates a new blockchain with a genesis block +func MakeBlockchain(t *testing.T, db *dbutil.DB, seckey cipher.SecKey) *Blockchain { + pubkey := cipher.PubKeyFromSecKey(seckey) + b, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) + if err != nil { + panic(fmt.Errorf("create genesis block failed: %v", err)) + } - tx := coin.Transaction{} - tx.PushInput(ux.Hash()) + sig := cipher.SignHash(gb.HashHeader(), seckey) + db.Update("", func(tx *dbutil.Tx) error { + return b.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: sig, + }) + }) + return b +} - tx.PushOutput(toAddr, amt, hours) +// CreateGenesisSpendTransaction creates the initial post-genesis transaction that moves genesis coins to another address +func CreateGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { + var txn coin.Transaction + err := db.View("", func(tx *dbutil.Tx) error { + uxOuts, err := bc.Unspent().GetAll(tx) + require.NoError(t, err) + require.Len(t, uxOuts, 1) - // Change output - coinsOut := ux.Body.Coins - amt - if coinsOut > 0 { - tx.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) - } + txn = makeTransactionForChain(t, tx, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) + require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) - tx.SignInputs([]cipher.SecKey{sec}) + if coins == GenesisCoins { + // No change output + require.Len(t, txn.Out, 1) + } else { + require.Len(t, txn.Out, 2) + require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) + } - require.Equal(t, len(tx.Sigs), 1) + return nil + }) + require.NoError(t, err) + return txn +} - err = cipher.ChkSig(ux.Body.Address, cipher.AddSHA256(tx.HashInner(), tx.In[0]), tx.Sigs[0]) +// ExecuteGenesisSpendTransaction executes a genesis block created with CreateGenesisSpendTransaction against a blockchain +// created with MakeBlockchain +func ExecuteGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, txn coin.Transaction) coin.UxOut { + var block *coin.Block + err := db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.NewBlock(tx, coin.Transactions{txn}, GenesisTime+TimeIncrement) + require.NoError(t, err) + return nil + }) require.NoError(t, err) + require.NotNil(t, block) - tx.UpdateHeader() + sig := cipher.SignHash(block.HashHeader(), GenesisSecret) + sb := coin.SignedBlock{ + Block: *block, + Sig: sig, + } - err = tx.Verify() + err = db.Update("", func(tx *dbutil.Tx) error { + err = bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) require.NoError(t, err) - err = bc.VerifySingleTxnHardConstraints(tx) + uxOut, err := coin.CreateUnspent(block.Head, txn, 0) require.NoError(t, err) - return tx + return uxOut } -func MakeBlockchain(t *testing.T, db *bolt.DB, seckey cipher.SecKey) *Blockchain { - pubkey := cipher.PubKeyFromSecKey(seckey) - b, err := NewBlockchain(db, pubkey) +func makeTransactionForChain(t *testing.T, tx *dbutil.Tx, bc *Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { + tim, err := bc.Time(tx) require.NoError(t, err) - gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) - if err != nil { - panic(fmt.Errorf("create genesis block failed: %v", err)) + + chrs, err := ux.CoinHours(tim) + require.NoError(t, err) + + require.Equal(t, cipher.AddressFromPubKey(cipher.PubKeyFromSecKey(sec)), ux.Body.Address) + + knownUx, err := bc.Unspent().Get(tx, ux.Hash()) + require.NoError(t, err) + require.NotNil(t, knownUx) + require.Equal(t, knownUx, &ux) + + txn := coin.Transaction{} + txn.PushInput(ux.Hash()) + + txn.PushOutput(toAddr, amt, hours) + + // Change output + coinsOut := ux.Body.Coins - amt + if coinsOut > 0 { + txn.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) } - sig := cipher.SignHash(gb.HashHeader(), seckey) - db.Update(func(tx *bolt.Tx) error { - return b.ExecuteBlockWithTx(tx, &coin.SignedBlock{ - Block: *gb, - Sig: sig, - }) - }) - return b -} + txn.SignInputs([]cipher.SecKey{sec}) + + require.Equal(t, len(txn.Sigs), 1) -func MakeAddress() (cipher.PubKey, cipher.SecKey, cipher.Address) { - p, s := cipher.GenerateKeyPair() - a := cipher.AddressFromPubKey(p) - return p, s, a + err = cipher.ChkSig(ux.Body.Address, cipher.AddSHA256(txn.HashInner(), txn.In[0]), txn.Sigs[0]) + require.NoError(t, err) + + txn.UpdateHeader() + + err = txn.Verify() + require.NoError(t, err) + + err = bc.VerifySingleTxnHardConstraints(tx, txn) + require.NoError(t, err) + + return txn } -func makeLostCoinTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { - tx := coin.Transaction{} +func makeLostCoinTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { // nolint: unparam + txn := coin.Transaction{} var totalCoins uint64 var totalHours uint64 for _, ux := range uxs { - tx.PushInput(ux.Hash()) + txn.PushInput(ux.Hash()) totalCoins += ux.Body.Coins totalHours += ux.Body.Hours } - tx.PushOutput(toAddr, coins, totalHours/4) + txn.PushOutput(toAddr, coins, totalHours/4) changeCoins := totalCoins - coins if changeCoins > 0 { - tx.PushOutput(uxs[0].Body.Address, changeCoins-1, totalHours/4) + txn.PushOutput(uxs[0].Body.Address, changeCoins-1, totalHours/4) } - tx.SignInputs(keys) - tx.UpdateHeader() - return tx + txn.SignInputs(keys) + txn.UpdateHeader() + return txn } -func makeDuplicateUxOutTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { - tx := coin.Transaction{} +func makeDuplicateUxOutTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { // nolint: unparam + txn := coin.Transaction{} var totalCoins uint64 var totalHours uint64 for _, ux := range uxs { - tx.PushInput(ux.Hash()) + txn.PushInput(ux.Hash()) totalCoins += ux.Body.Coins totalHours += ux.Body.Hours } - tx.PushOutput(toAddr, coins, totalHours/8) - tx.PushOutput(toAddr, coins, totalHours/8) + txn.PushOutput(toAddr, coins, totalHours/8) + txn.PushOutput(toAddr, coins, totalHours/8) changeCoins := totalCoins - coins if changeCoins > 0 { - tx.PushOutput(uxs[0].Body.Address, changeCoins, totalHours/4) + txn.PushOutput(uxs[0].Body.Address, changeCoins, totalHours/4) } - tx.SignInputs(keys) - tx.UpdateHeader() - return tx + txn.SignInputs(keys) + txn.UpdateHeader() + return txn } // makeUnspentsTx creates a transaction that has a configurable number of outputs sent to the same address. // The genesis block has only one unspent output, so only one transaction can be made from it. // This is useful for when multiple test transactions need to be made from the same block. // Coins and hours are distributed equally amongst all new outputs. -func makeUnspentsTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, nUnspents int, maxDivisor uint64) coin.Transaction { +func makeUnspentsTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, nUnspents int, maxDivisor uint64) coin.Transaction { // nolint: unparam // Add inputs to the transaction spendTx := coin.Transaction{} var totalHours uint64 @@ -213,7 +284,7 @@ func makeSpendTxWithFee(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, to } // makeSpendTxWithHoursBurned creates a txn specified with the total number of hours to burn -func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, hoursBurned uint64) coin.Transaction { +func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, hoursBurned uint64) coin.Transaction { // nolint: unparam spendTx := coin.Transaction{} var totalHours uint64 var totalCoins uint64 @@ -237,48 +308,6 @@ func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.Se return spendTx } -func createGenesisSpendTransaction(t *testing.T, bc *Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { - uxOuts, err := bc.Unspent().GetAll() - require.NoError(t, err) - require.Len(t, uxOuts, 1) - - txn := MakeTransactionForChain(t, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) - require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) - - if coins == GenesisCoins { - // No change output - require.Len(t, txn.Out, 1) - } else { - require.Len(t, txn.Out, 2) - require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) - } - - return txn -} - -func executeGenesisSpendTransaction(t *testing.T, db *bolt.DB, bc *Blockchain, txn coin.Transaction) coin.UxOut { - block, err := bc.NewBlock(coin.Transactions{txn}, GenesisTime+TimeIncrement) - require.NoError(t, err) - - sig := cipher.SignHash(block.HashHeader(), GenesisSecret) - sb := coin.SignedBlock{ - Block: *block, - Sig: sig, - } - - err = db.Update(func(tx *bolt.Tx) error { - err = bc.ExecuteBlockWithTx(tx, &sb) - require.NoError(t, err) - return nil - }) - require.NoError(t, err) - - uxOut, err := coin.CreateUnspent(block.Head, txn, 0) - require.NoError(t, err) - - return uxOut -} - func requireSoftViolation(t *testing.T, msg string, err error) { require.Equal(t, NewErrTxnViolatesSoftConstraint(errors.New(msg)), err) } @@ -287,10 +316,13 @@ func requireHardViolation(t *testing.T, msg string, err error) { require.Equal(t, NewErrTxnViolatesHardConstraint(errors.New(msg)), err) } -func TestVerifyTransactionAllConstraints(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) +func TestVerifyTransactionSoftHardConstraints(t *testing.T) { + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) @@ -299,19 +331,25 @@ func TestVerifyTransactionAllConstraints(t *testing.T) { store: store, } - gb := addGenesisBlock(t, bc) + gb := addGenesisBlockToBlockchain(t, bc) toAddr := testutil.MakeAddress() coins := uint64(10e6) - // create normal spending tx + verifySingleTxnSoftHardConstraints := func(txn coin.Transaction, maxBlockSize int) error { + return db.View("", func(tx *dbutil.Tx) error { + return bc.VerifySingleTxnSoftHardConstraints(tx, txn, maxBlockSize) + }) + } + + // create normal spending txn uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) - tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) - err = bc.VerifySingleTxnAllConstraints(tx, DefaultMaxBlockSize) + txn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) require.NoError(t, err) // Transaction size exceeds maxSize - err = bc.VerifySingleTxnAllConstraints(tx, tx.Size()-1) + err = verifySingleTxnSoftHardConstraints(txn, txn.Size()-1) requireSoftViolation(t, "Transaction size bigger than max block size", err) // Invalid transaction fee @@ -320,28 +358,40 @@ func TestVerifyTransactionAllConstraints(t *testing.T) { for _, ux := range uxs { hours += ux.Body.Hours } - tx = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 0) - err = bc.VerifySingleTxnAllConstraints(tx, DefaultMaxBlockSize) + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 0) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) requireSoftViolation(t, "Transaction has zero coinhour fee", err) + // Invalid transaction fee, part 2 + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 1) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + requireSoftViolation(t, "Transaction coinhour fee minimum not met", err) + // Transaction locking is tested by TestVerifyTransactionIsLocked // Test invalid header hash - originInnerHash := tx.InnerHash - tx.InnerHash = cipher.SHA256{} - err = bc.VerifySingleTxnAllConstraints(tx, DefaultMaxBlockSize) + originInnerHash := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) requireHardViolation(t, "Invalid header hash", err) // Set back the originInnerHash - tx.InnerHash = originInnerHash + txn.InnerHash = originInnerHash // Create new block to spend the coins - b, err := bc.NewBlock(coin.Transactions{tx}, genTime+100) + var b *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, genTime+100) + require.NoError(t, err) + return nil + }) require.NoError(t, err) + require.NotNil(t, b) // Add the block to blockchain - err = bc.db.Update(func(tx *bolt.Tx) error { - return bc.store.AddBlockWithTx(tx, &coin.SignedBlock{ + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ Block: *b, Sig: cipher.SignHash(b.HashHeader(), genSecret), }) @@ -349,30 +399,30 @@ func TestVerifyTransactionAllConstraints(t *testing.T) { require.NoError(t, err) // A UxOut does not exist, it was already spent - err = bc.VerifySingleTxnAllConstraints(tx, DefaultMaxBlockSize) - expectedErr := NewErrTxnViolatesHardConstraint(blockdb.NewErrUnspentNotExist(tx.In[0].Hex())) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + expectedErr := NewErrTxnViolatesHardConstraint(blockdb.NewErrUnspentNotExist(txn.In[0].Hex())) require.Equal(t, expectedErr, err) // Check invalid sig - uxs = coin.CreateUnspents(b.Head, tx) + uxs = coin.CreateUnspents(b.Head, txn) _, key := cipher.GenerateKeyPair() toAddr2 := testutil.MakeAddress() tx2 := makeSpendTx(t, uxs, []cipher.SecKey{key, key}, toAddr2, 5e6) - err = bc.VerifySingleTxnAllConstraints(tx2, DefaultMaxBlockSize) + err = verifySingleTxnSoftHardConstraints(tx2, DefaultMaxBlockSize) requireHardViolation(t, "Signature not valid for output being spent", err) // Create lost coin transaction - uxs2 := coin.CreateUnspents(b.Head, tx) + uxs2 := coin.CreateUnspents(b.Head, txn) toAddr3 := testutil.MakeAddress() lostCoinTx := makeLostCoinTx(coin.UxArray{uxs2[1]}, []cipher.SecKey{genSecret}, toAddr3, 10e5) - err = bc.VerifySingleTxnAllConstraints(lostCoinTx, DefaultMaxBlockSize) + err = verifySingleTxnSoftHardConstraints(lostCoinTx, DefaultMaxBlockSize) requireHardViolation(t, "Transactions may not destroy coins", err) // Create transaction with duplicate UxOuts - uxs = coin.CreateUnspents(b.Head, tx) + uxs = coin.CreateUnspents(b.Head, txn) toAddr4 := testutil.MakeAddress() dupUxOutTx := makeDuplicateUxOutTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr4, 1e6) - err = bc.VerifySingleTxnAllConstraints(dupUxOutTx, DefaultMaxBlockSize) + err = verifySingleTxnSoftHardConstraints(dupUxOutTx, DefaultMaxBlockSize) requireHardViolation(t, "Duplicate output in transaction", err) } @@ -380,9 +430,12 @@ func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { // Test that VerifySingleTxnSoftConstraints fails if a uxIn.CoinHours() call fails. // This is a separate test on its own, because it's not possible to reach the line // that is being tested through the blockchain verify API wrappers - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() + err := CreateBuckets(db) + require.NoError(t, err) + store, err := blockdb.NewBlockchain(db, DefaultWalker) require.NoError(t, err) @@ -391,20 +444,27 @@ func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { store: store, } - gb := addGenesisBlock(t, bc) + gb := addGenesisBlockToBlockchain(t, bc) toAddr := testutil.MakeAddress() coins := uint64(10e6) - // create normal spending tx + // create normal spending txn uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) - tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + txn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) - uxIn, err := bc.Unspent().GetArray(tx.In) - require.NoError(t, err) - require.NotEmpty(t, uxIn) + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) - head, err := bc.Head() + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) require.NoError(t, err) // Set the uxIn's hours high, so that uxIn.CoinHours() returns an error @@ -413,14 +473,14 @@ func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { testutil.RequireError(t, coinHoursErr, "UxOut.CoinHours addition of earned coin hours overflow") // VerifySingleTxnSoftConstraints should fail on this, when trying to calculate the TransactionFee - err = VerifySingleTxnSoftConstraints(tx, head.Time()+1e6, uxIn, DefaultMaxBlockSize) + err = VerifySingleTxnSoftConstraints(txn, head.Time()+1e6, uxIn, DefaultMaxBlockSize) testutil.RequireError(t, err, NewErrTxnViolatesSoftConstraint(coinHoursErr).Error()) // VerifySingleTxnHardConstraints should fail on this, when performing the extra check of // uxIn.CoinHours() errors, which is ignored by VerifyTransactionHoursSpending if the error // is because of the earned hours addition overflow head.Block.Head.Time += 1e6 - err = VerifySingleTxnHardConstraints(tx, head, uxIn) + err = VerifySingleTxnHardConstraints(txn, head, uxIn) testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(coinHoursErr).Error()) } @@ -444,7 +504,7 @@ func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedEr addr, err := cipher.DecodeBase58Address(toAddr) require.NoError(t, err) - db, close := testutil.PrepareDB(t) + db, close := prepareDB(t) defer close() _, s := cipher.GenerateKeyPair() @@ -457,15 +517,15 @@ func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedEr var hours uint64 = 1e6 var fee uint64 = 5e8 - txn := createGenesisSpendTransaction(t, bc, addr, coins, hours, fee) - uxOut := executeGenesisSpendTransaction(t, db, bc, txn) + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + uxOut := ExecuteGenesisSpendTransaction(t, db, bc, txn) // Create a transaction that spends from the locked address // The secret key for the locked address is obviously unavailable here, // instead, forge an invalid transaction. // Transaction.Verify() is called after TransactionIsLocked(), // so for this test it doesn't matter if transaction signature is wrong - _, _, randomAddress := MakeAddress() + randomAddress := testutil.MakeAddress() txn = coin.Transaction{ In: []cipher.SHA256{uxOut.Hash()}, Out: []coin.TransactionOutput{ @@ -477,10 +537,18 @@ func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedEr }, } - uxIn, err := bc.Unspent().GetArray(txn.In) - require.NoError(t, err) + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) - head, err := bc.Head() + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) require.NoError(t, err) err = VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, DefaultMaxBlockSize) diff --git a/src/visor/blockchainer_mock_test.go b/src/visor/blockchainer_mock_test.go index 76e759d..52e445c 100755 --- a/src/visor/blockchainer_mock_test.go +++ b/src/visor/blockchainer_mock_test.go @@ -10,11 +10,10 @@ import ( mock "github.com/stretchr/testify/mock" - bolt "github.com/boltdb/bolt" - cipher "github.com/skycoin/skycoin/src/cipher" coin "github.com/skycoin/skycoin/src/coin" blockdb "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" ) // BlockchainerMock mock @@ -26,15 +25,8 @@ func NewBlockchainerMock() *BlockchainerMock { return &BlockchainerMock{} } -// BindListener mocked method -func (m *BlockchainerMock) BindListener(p0 BlockListener) { - - m.Called(p0) - -} - -// ExecuteBlockWithTx mocked method -func (m *BlockchainerMock) ExecuteBlockWithTx(p0 *bolt.Tx, p1 *coin.SignedBlock) error { +// ExecuteBlock mocked method +func (m *BlockchainerMock) ExecuteBlock(p0 *dbutil.Tx, p1 *coin.SignedBlock) error { ret := m.Called(p0, p1) @@ -51,15 +43,15 @@ func (m *BlockchainerMock) ExecuteBlockWithTx(p0 *bolt.Tx, p1 *coin.SignedBlock) } -// GetBlockByHash mocked method -func (m *BlockchainerMock) GetBlockByHash(p0 cipher.SHA256) (*coin.SignedBlock, error) { +// GetBlocks mocked method +func (m *BlockchainerMock) GetBlocks(p0 *dbutil.Tx, p1 uint64, p2 uint64) ([]coin.SignedBlock, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1, p2) - var r0 *coin.SignedBlock + var r0 []coin.SignedBlock switch res := ret.Get(0).(type) { case nil: - case *coin.SignedBlock: + case []coin.SignedBlock: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -78,8 +70,8 @@ func (m *BlockchainerMock) GetBlockByHash(p0 cipher.SHA256) (*coin.SignedBlock, } -// GetBlockBySeq mocked method -func (m *BlockchainerMock) GetBlockBySeq(p0 uint64) (*coin.SignedBlock, error) { +// GetGenesisBlock mocked method +func (m *BlockchainerMock) GetGenesisBlock(p0 *dbutil.Tx) (*coin.SignedBlock, error) { ret := m.Called(p0) @@ -105,8 +97,8 @@ func (m *BlockchainerMock) GetBlockBySeq(p0 uint64) (*coin.SignedBlock, error) { } -// GetBlocks mocked method -func (m *BlockchainerMock) GetBlocks(p0 uint64, p1 uint64) ([]coin.SignedBlock, error) { +// GetLastBlocks mocked method +func (m *BlockchainerMock) GetLastBlocks(p0 *dbutil.Tx, p1 uint64) ([]coin.SignedBlock, error) { ret := m.Called(p0, p1) @@ -132,10 +124,10 @@ func (m *BlockchainerMock) GetBlocks(p0 uint64, p1 uint64) ([]coin.SignedBlock, } -// GetGenesisBlock mocked method -func (m *BlockchainerMock) GetGenesisBlock() *coin.SignedBlock { +// GetSignedBlockByHash mocked method +func (m *BlockchainerMock) GetSignedBlockByHash(p0 *dbutil.Tx, p1 cipher.SHA256) (*coin.SignedBlock, error) { - ret := m.Called() + ret := m.Called(p0, p1) var r0 *coin.SignedBlock switch res := ret.Get(0).(type) { @@ -146,19 +138,28 @@ func (m *BlockchainerMock) GetGenesisBlock() *coin.SignedBlock { panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } -// GetLastBlocks mocked method -func (m *BlockchainerMock) GetLastBlocks(p0 uint64) ([]coin.SignedBlock, error) { +// GetSignedBlockBySeq mocked method +func (m *BlockchainerMock) GetSignedBlockBySeq(p0 *dbutil.Tx, p1 uint64) (*coin.SignedBlock, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 []coin.SignedBlock + var r0 *coin.SignedBlock switch res := ret.Get(0).(type) { case nil: - case []coin.SignedBlock: + case *coin.SignedBlock: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -178,9 +179,9 @@ func (m *BlockchainerMock) GetLastBlocks(p0 uint64) ([]coin.SignedBlock, error) } // Head mocked method -func (m *BlockchainerMock) Head() (*coin.SignedBlock, error) { +func (m *BlockchainerMock) Head(p0 *dbutil.Tx) (*coin.SignedBlock, error) { - ret := m.Called() + ret := m.Called(p0) var r0 *coin.SignedBlock switch res := ret.Get(0).(type) { @@ -205,9 +206,9 @@ func (m *BlockchainerMock) Head() (*coin.SignedBlock, error) { } // HeadSeq mocked method -func (m *BlockchainerMock) HeadSeq() uint64 { +func (m *BlockchainerMock) HeadSeq(p0 *dbutil.Tx) (uint64, bool, error) { - ret := m.Called() + ret := m.Called(p0) var r0 uint64 switch res := ret.Get(0).(type) { @@ -218,14 +219,32 @@ func (m *BlockchainerMock) HeadSeq() uint64 { panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 } // Len mocked method -func (m *BlockchainerMock) Len() uint64 { +func (m *BlockchainerMock) Len(p0 *dbutil.Tx) (uint64, error) { - ret := m.Called() + ret := m.Called(p0) var r0 uint64 switch res := ret.Get(0).(type) { @@ -236,14 +255,23 @@ func (m *BlockchainerMock) Len() uint64 { panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } // NewBlock mocked method -func (m *BlockchainerMock) NewBlock(p0 coin.Transactions, p1 uint64) (*coin.Block, error) { +func (m *BlockchainerMock) NewBlock(p0 *dbutil.Tx, p1 coin.Transactions, p2 uint64) (*coin.Block, error) { - ret := m.Called(p0, p1) + ret := m.Called(p0, p1, p2) var r0 *coin.Block switch res := ret.Get(0).(type) { @@ -267,33 +295,8 @@ func (m *BlockchainerMock) NewBlock(p0 coin.Transactions, p1 uint64) (*coin.Bloc } -// Notify mocked method -func (m *BlockchainerMock) Notify(p0 coin.Block) { - - m.Called(p0) - -} - // Time mocked method -func (m *BlockchainerMock) Time() uint64 { - - ret := m.Called() - - var r0 uint64 - switch res := ret.Get(0).(type) { - case nil: - case uint64: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - -// TransactionFee mocked method -func (m *BlockchainerMock) TransactionFee(p0 *coin.Transaction) (uint64, error) { +func (m *BlockchainerMock) Time(p0 *dbutil.Tx) (uint64, error) { ret := m.Called(p0) @@ -319,15 +322,15 @@ func (m *BlockchainerMock) TransactionFee(p0 *coin.Transaction) (uint64, error) } -// Unspent mocked method -func (m *BlockchainerMock) Unspent() blockdb.UnspentPool { +// TransactionFee mocked method +func (m *BlockchainerMock) TransactionFee(p0 *dbutil.Tx, p1 uint64) coin.FeeCalculator { - ret := m.Called() + ret := m.Called(p0, p1) - var r0 blockdb.UnspentPool + var r0 coin.FeeCalculator switch res := ret.Get(0).(type) { case nil: - case blockdb.UnspentPool: + case coin.FeeCalculator: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -337,15 +340,15 @@ func (m *BlockchainerMock) Unspent() blockdb.UnspentPool { } -// UpdateDB mocked method -func (m *BlockchainerMock) UpdateDB(p0 func(tx *bolt.Tx) error) error { +// Unspent mocked method +func (m *BlockchainerMock) Unspent() blockdb.UnspentPooler { - ret := m.Called(p0) + ret := m.Called() - var r0 error + var r0 blockdb.UnspentPooler switch res := ret.Get(0).(type) { case nil: - case error: + case blockdb.UnspentPooler: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -355,8 +358,8 @@ func (m *BlockchainerMock) UpdateDB(p0 func(tx *bolt.Tx) error) error { } -// VerifySingleTxnAllConstraints mocked method -func (m *BlockchainerMock) VerifySingleTxnAllConstraints(p0 coin.Transaction, p1 int) error { +// VerifyBlockTxnConstraints mocked method +func (m *BlockchainerMock) VerifyBlockTxnConstraints(p0 *dbutil.Tx, p1 coin.Transaction) error { ret := m.Called(p0, p1) @@ -373,10 +376,10 @@ func (m *BlockchainerMock) VerifySingleTxnAllConstraints(p0 coin.Transaction, p1 } -// VerifySingleTxnHardConstraints mocked method -func (m *BlockchainerMock) VerifySingleTxnHardConstraints(p0 coin.Transaction) error { +// VerifySingleTxnSoftHardConstraints mocked method +func (m *BlockchainerMock) VerifySingleTxnSoftHardConstraints(p0 *dbutil.Tx, p1 coin.Transaction, p2 int) error { - ret := m.Called(p0) + ret := m.Called(p0, p1, p2) var r0 error switch res := ret.Get(0).(type) { @@ -391,10 +394,10 @@ func (m *BlockchainerMock) VerifySingleTxnHardConstraints(p0 coin.Transaction) e } -// VerifyBlockTxnConstraints mocked method -func (m *BlockchainerMock) VerifyBlockTxnConstraints(p0 coin.Transaction) error { +// VerifySingleTxnHardConstraints mocked method +func (m *BlockchainerMock) VerifySingleTxnHardConstraints(p0 *dbutil.Tx, p1 coin.Transaction) error { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 error switch res := ret.Get(0).(type) { diff --git a/src/visor/blockdb/README.md b/src/visor/blockdb/README.md deleted file mode 100755 index de23653..0000000 --- a/src/visor/blockdb/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -This stores blocks (and signatures) -- stores blocks by hash -- maintains an index of blocks -- maintains an index of the unspent output set (or allowed calculation of the unspent output set from snapshots) \ No newline at end of file diff --git a/src/visor/blockdb/block_tree.go b/src/visor/blockdb/block_tree.go index ff64c29..6397126 100755 --- a/src/visor/blockdb/block_tree.go +++ b/src/visor/blockdb/block_tree.go @@ -4,63 +4,33 @@ import ( "errors" "fmt" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var ( emptyHash cipher.SHA256 - errBlockExist = errors.New("block already exist") - errNoParent = errors.New("block is not genesis and have no parent") + errBlockExist = errors.New("block already exists") + errNoParent = errors.New("block is not genesis and has no parent") errWrongParent = errors.New("wrong parent") errHasChild = errors.New("remove block failed, it has children") -) - -// blockTree use the blockdb store all blocks and maintains the block tree struct. -type blockTree struct { - db *bolt.DB - blocks *bucket.Bucket - tree *bucket.Bucket -} - -// newBlockTree create buckets in blockdb if does not exist. -func newBlockTree(db *bolt.DB) (*blockTree, error) { - blocks, err := bucket.New([]byte("blocks"), db) - if err != nil { - return nil, err - } - tree, err := bucket.New([]byte("block_tree"), db) - if err != nil { - return nil, err - } - - return &blockTree{ - blocks: blocks, - tree: tree, - db: db, - }, nil -} + // BlocksBkt holds coin.Blocks + BlocksBkt = []byte("blocks") + // TreeBkt maps block height to a (prev, hash) pair for a block + TreeBkt = []byte("block_tree") +) -// AddBlock write the block into blocks bucket, add the pair of block hash and pre block hash into -// tree in the block depth. -func (bt *blockTree) AddBlock(b *coin.Block) error { - return bt.db.Update(func(tx *bolt.Tx) error { - return bt.AddBlockWithTx(tx, b) - }) -} +// Walker function for go through blockchain +type Walker func(*dbutil.Tx, []coin.HashPair) (cipher.SHA256, bool) -// AddBlockWithTx adds block with *bolt.Tx -func (bt *blockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { - bkt := tx.Bucket(bt.blocks.Name) - if bkt == nil { - return fmt.Errorf("bucket %s doesn't eist", bt.blocks.Name) - } +// blockTree use the blockdb store all blocks and maintains the block tree struct. +type blockTree struct{} +// AddBlock adds block with *dbutil.Tx +func (bt *blockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { // can't store block if it's not genesis block and has no parent. if b.Seq() > 0 && b.PreHashHeader() == emptyHash { return errNoParent @@ -68,22 +38,21 @@ func (bt *blockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { // check if the block already exist. hash := b.HashHeader() - if blk := bkt.Get(hash[:]); blk != nil { + if ok, err := dbutil.BucketHasKey(tx, BlocksBkt, hash[:]); err != nil { + return err + } else if ok { return errBlockExist } // write block into blocks bucket. - if err := setBlock(bkt, b); err != nil { + if err := dbutil.PutBucketValue(tx, BlocksBkt, hash[:], encoder.Serialize(b)); err != nil { return err } - // get tree bucket. - tree := tx.Bucket(bt.tree.Name) - // the pre hash must be in depth - 1. if b.Seq() > 0 { preHash := b.PreHashHeader() - parentHashPair, err := getHashPairInDepth(tree, b.Seq()-1, func(hp coin.HashPair) bool { + parentHashPair, err := getHashPairInDepth(tx, b.Seq()-1, func(hp coin.HashPair) bool { return hp.Hash == preHash }) if err != nil { @@ -94,10 +63,13 @@ func (bt *blockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { } } - hp := coin.HashPair{Hash: hash, PreHash: b.Head.PrevHash} + hp := coin.HashPair{ + Hash: hash, + PreHash: b.Head.PrevHash, + } // get block pairs in the depth - hashPairs, err := getHashPairInDepth(tree, b.Seq(), allPairs) + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) if err != nil { return err } @@ -105,7 +77,7 @@ func (bt *blockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { if len(hashPairs) == 0 { // no hash pair exist in the depth. // write the hash pair into tree. - return setHashPairInDepth(tree, b.Seq(), []coin.HashPair{hp}) + return setHashPairInDepth(tx, b.Seq(), []coin.HashPair{hp}) } // check dup block @@ -114,90 +86,101 @@ func (bt *blockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { } hashPairs = append(hashPairs, hp) - return setHashPairInDepth(tree, b.Seq(), hashPairs) + return setHashPairInDepth(tx, b.Seq(), hashPairs) } // RemoveBlock remove block from blocks bucket and tree bucket. // can't remove block if it has children. -func (bt *blockTree) RemoveBlock(b *coin.Block) error { - return bt.db.Update(func(tx *bolt.Tx) error { - // delete block in blocks bucket. - blocks := tx.Bucket(bt.blocks.Name) - hash := b.HashHeader() - if err := blocks.Delete(hash[:]); err != nil { - return err - } +func (bt *blockTree) RemoveBlock(tx *dbutil.Tx, b *coin.Block) error { + // delete block in blocks bucket. + hash := b.HashHeader() + if err := dbutil.Delete(tx, BlocksBkt, hash[:]); err != nil { + return err + } - // get tree bucket. - tree := tx.Bucket(bt.tree.Name) + // check if this block has children + if has, err := hasChild(tx, *b); err != nil { + return err + } else if has { + return errHasChild + } - // check if this block has children - has, err := hasChild(tree, *b) - if err != nil { - return err - } - if has { - return errHasChild - } + // get block hash pairs in depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } - // get block hash pairs in depth - hashPairs, err := getHashPairInDepth(tree, b.Seq(), func(hp coin.HashPair) bool { - return true - }) - if err != nil { - return err - } + // remove block hash pair in tree. + ps := removePairs(hashPairs, coin.HashPair{ + Hash: hash, + PreHash: b.PreHashHeader(), + }) - // remove block hash pair in tree. - ps := removePairs(hashPairs, coin.HashPair{Hash: hash, PreHash: b.PreHashHeader()}) - if len(ps) == 0 { - tree.Delete(bucket.Itob(b.Seq())) - return nil - } + if len(ps) == 0 { + return dbutil.Delete(tx, TreeBkt, dbutil.Itob(b.Seq())) + } - // update the hash pairs in tree. - return setHashPairInDepth(tree, b.Seq(), ps) - }) + // update the hash pairs in tree. + return setHashPairInDepth(tx, b.Seq(), ps) } // GetBlock get block by hash, return nil on not found -func (bt *blockTree) GetBlock(hash cipher.SHA256) *coin.Block { - return bt.getBlock(hash) +func (bt *blockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + var b coin.Block + + if ok, err := dbutil.GetBucketObjectDecoded(tx, BlocksBkt, hash[:], &b); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + if hash != b.HashHeader() { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, b.HashHeader()) + } + + return &b, nil } // GetBlockInDepth get block in depth, return nil on not found, // the filter is used to choose the appropriate block. -func (bt *blockTree) GetBlockInDepth(depth uint64, filter func(hps []coin.HashPair) cipher.SHA256) *coin.Block { - hash, err := bt.getHashInDepth(depth, filter) +func (bt *blockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + hash, ok, err := bt.getHashInDepth(tx, depth, filter) if err != nil { - return nil + return nil, fmt.Errorf("BlockTree.getHashInDepth failed: %v", err) + } else if !ok { + return nil, nil } - return bt.getBlock(hash) + return bt.GetBlock(tx, hash) } -func (bt *blockTree) getBlock(hash cipher.SHA256) *coin.Block { - bin := bt.blocks.Get(hash[:]) - if bin == nil { - return nil - } - block := coin.Block{} - if err := encoder.DeserializeRaw(bin, &block); err != nil { - return nil - } - return &block +// ForEachBlock iterates all blocks and calls f on them +func (bt *blockTree) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + var b coin.Block + if err := encoder.DeserializeRaw(v, &b); err != nil { + return err + } + + return f(&b) + }) } -func (bt *blockTree) getHashInDepth(depth uint64, filter func(ps []coin.HashPair) cipher.SHA256) (cipher.SHA256, error) { - key := bucket.Itob(depth) - pairsBin := bt.tree.Get(key) - pairs := []coin.HashPair{} - if err := encoder.DeserializeRaw(pairsBin, &pairs); err != nil { - return cipher.SHA256{}, err +func (bt *blockTree) getHashInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (cipher.SHA256, bool, error) { + var pairs []coin.HashPair + if ok, err := dbutil.GetBucketObjectDecoded(tx, TreeBkt, dbutil.Itob(depth), &pairs); err != nil { + return cipher.SHA256{}, false, err + } else if !ok { + return cipher.SHA256{}, false, nil } - hash := filter(pairs) - return hash, nil + hash, ok := filter(tx, pairs) + if !ok { + return cipher.SHA256{}, false, errors.New("No hash found in depth") + } + + return hash, true, nil } func containHash(hashPairs []coin.HashPair, pair coin.HashPair) bool { @@ -220,17 +203,15 @@ func removePairs(hps []coin.HashPair, pair coin.HashPair) []coin.HashPair { return pairs } -func getHashPairInDepth(tree *bolt.Bucket, dep uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { - v := tree.Get(bucket.Itob(dep)) - if v == nil { - return []coin.HashPair{}, nil - } - - hps := []coin.HashPair{} - if err := encoder.DeserializeRaw(v, &hps); err != nil { +func getHashPairInDepth(tx *dbutil.Tx, dep uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { + var hps []coin.HashPair + if ok, err := dbutil.GetBucketObjectDecoded(tx, TreeBkt, dbutil.Itob(dep), &hps); err != nil { return nil, err + } else if !ok { + return nil, nil } - pairs := []coin.HashPair{} + + var pairs []coin.HashPair for _, ps := range hps { if fn(ps) { pairs = append(pairs, ps) @@ -239,30 +220,22 @@ func getHashPairInDepth(tree *bolt.Bucket, dep uint64, fn func(hp coin.HashPair) return pairs, nil } -func setBlock(bkt *bolt.Bucket, b *coin.Block) error { - bin := encoder.Serialize(b) - key := b.HashHeader() - return bkt.Put(key[:], bin) -} - // check if this block has children -func hasChild(bkt *bolt.Bucket, b coin.Block) (bool, error) { +func hasChild(tx *dbutil.Tx, b coin.Block) (bool, error) { // get the child block hash pair, whose pre hash point to current block. - childHashPair, err := getHashPairInDepth(bkt, b.Head.BkSeq+1, func(hp coin.HashPair) bool { + childHashPair, err := getHashPairInDepth(tx, b.Head.BkSeq+1, func(hp coin.HashPair) bool { return hp.PreHash == b.HashHeader() }) if err != nil { - return false, nil + return false, err } return len(childHashPair) > 0, nil } -func setHashPairInDepth(bkt *bolt.Bucket, dep uint64, hps []coin.HashPair) error { - hpsBin := encoder.Serialize(hps) - key := bucket.Itob(dep) - return bkt.Put(key, hpsBin) +func setHashPairInDepth(tx *dbutil.Tx, dep uint64, hps []coin.HashPair) error { + return dbutil.PutBucketValue(tx, TreeBkt, dbutil.Itob(dep), encoder.Serialize(hps)) } func allPairs(hp coin.HashPair) bool { diff --git a/src/visor/blockdb/block_tree_test.go b/src/visor/blockdb/block_tree_test.go index 4cb8ac3..8e93227 100755 --- a/src/visor/blockdb/block_tree_test.go +++ b/src/visor/blockdb/block_tree_test.go @@ -1,14 +1,13 @@ package blockdb import ( - "fmt" "testing" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" ) type blockInfo struct { @@ -25,11 +24,10 @@ type blockCase struct { } func testCase(t *testing.T, cases []blockCase) { - db, close := testutil.PrepareDB(t) + db, close := prepareDB(t) defer close() - btree, err := newBlockTree(db) - assert.Nil(t, err) + btree := &blockTree{} blocks := make([]coin.Block, len(cases)) for i, d := range cases { var preHash cipher.SHA256 @@ -47,27 +45,31 @@ func testCase(t *testing.T, cases []blockCase) { } blocks[i] = b - switch d.Action { - case "add": - err := btree.AddBlock(&b) - if err != d.Err { - t.Fatal(fmt.Sprintf("expect err:%v, but get err:%v", d.Err, err)) + err := db.Update("", func(tx *dbutil.Tx) error { + switch d.Action { + case "add": + err := btree.AddBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Equal(t, b, *b1) + } + case "remove": + err := btree.RemoveBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Nil(t, b1) + } } - if err == nil { - b1 := btree.GetBlock(b.HashHeader()) - assert.Equal(t, *b1, b) - } - case "remove": - err := btree.RemoveBlock(&b) - if err != d.Err { - t.Fatal(fmt.Sprintf("expect err:%v, but get err:%v", d.Err, err)) - } - if err == nil { - b1 := btree.GetBlock(b.HashHeader()) - assert.Nil(t, b1) - } - } + return nil + }) + + require.NoError(t, err) } } @@ -159,11 +161,10 @@ func TestRemoveBlock(t *testing.T) { } func TestGetBlockInDepth(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - bc, err := newBlockTree(db) - assert.Nil(t, err) + bc := &blockTree{} blocks := []coin.Block{ coin.Block{ Head: coin.BlockHeader{ @@ -186,21 +187,42 @@ func TestGetBlockInDepth(t *testing.T) { }, } - assert.Nil(t, bc.AddBlock(&blocks[0])) - blocks[1].Head.PrevHash = blocks[0].HashHeader() - assert.Nil(t, bc.AddBlock(&blocks[1])) - blocks[2].Head.PrevHash = blocks[0].HashHeader() - assert.Nil(t, bc.AddBlock(&blocks[2])) - - block := bc.GetBlockInDepth(1, func(hps []coin.HashPair) cipher.SHA256 { - for _, hp := range hps { - b := bc.GetBlock(hp.Hash) - if b.Time() == 2 { - return b.HashHeader() + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &blocks[0]) + require.NoError(t, err) + + blocks[1].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[1]) + require.NoError(t, err) + + blocks[2].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[2]) + require.NoError(t, err) + + return nil + }) + + require.NoError(t, err) + + var block *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.GetBlockInDepth(tx, 1, func(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + for _, hp := range hps { + b, err := bc.GetBlock(tx, hp.Hash) + require.NoError(t, err) + if b.Time() == 2 { + return b.HashHeader(), true + } } - } - return cipher.SHA256{} + return cipher.SHA256{}, false + }) + require.NoError(t, err) + return err }) - assert.Equal(t, *block, blocks[2]) + require.NoError(t, err) + + require.NotNil(t, block) + require.Equal(t, blocks[2], *block) } diff --git a/src/visor/blockdb/blockchain.go b/src/visor/blockdb/blockchain.go index ec19198..13f6a72 100755 --- a/src/visor/blockdb/blockchain.go +++ b/src/visor/blockdb/blockchain.go @@ -3,100 +3,96 @@ package blockdb import ( "errors" "fmt" - "sync" - - "github.com/boltdb/bolt" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var ( - // blockchain meta info bucket - blockchainMetaBkt = []byte("blockchain_meta") - // blockchain head sequence number - headSeqKey = []byte("head_seq") + logger = logging.MustGetLogger("blockdb") + + // ErrNoHeadBlock is returned when calling Blockchain.Head() when no head block exists + ErrNoHeadBlock = fmt.Errorf("found no head block") ) -// ErrMissingSignature is returned if no matching signature is found for a block in the db +// ErrMissingSignature is returned if a block in the db does not have a corresponding signature in the db type ErrMissingSignature struct { - Seq uint64 - Hash string + b *coin.Block } -func (e ErrMissingSignature) Error() string { - msg := "find no signature of block" - if e.Hash != "" { - return fmt.Sprintf("%s: hash=%s", msg, e.Hash) +// NewErrMissingSignature creates ErrMissingSignature from *coin.Block +func NewErrMissingSignature(b *coin.Block) error { + return ErrMissingSignature{ + b: b, } - return fmt.Sprintf("%s: seq=%d", msg, e.Seq) } -type chainMeta struct { - bucket.Bucket -} - -func newChainMeta(db *bolt.DB) (*chainMeta, error) { - bkt, err := bucket.New(blockchainMetaBkt, db) - if err != nil { - return nil, err - } - - return &chainMeta{ - Bucket: *bkt, - }, nil +func (e ErrMissingSignature) Error() string { + return fmt.Sprintf("Signature not found for block seq=%d hash=%s", e.b.Head.BkSeq, e.b.HashHeader().Hex()) } -func (m chainMeta) setHeadSeqWithTx(tx *bolt.Tx, seq uint64) error { - return m.PutWithTx(tx, headSeqKey, bucket.Itob(seq)) +// CreateBuckets creates bolt.DB buckets used by the blockdb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + BlockSigsBkt, + BlocksBkt, + TreeBkt, + BlockchainMetaBkt, + UnspentPoolBkt, + UnspentPoolAddrIndexBkt, + UnspentMetaBkt, + }) } // BlockTree block storage type BlockTree interface { - AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error - GetBlock(hash cipher.SHA256) *coin.Block - GetBlockInDepth(dep uint64, filter func(hps []coin.HashPair) cipher.SHA256) *coin.Block + AddBlock(*dbutil.Tx, *coin.Block) error + GetBlock(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetBlockInDepth(*dbutil.Tx, uint64, Walker) (*coin.Block, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error } // BlockSigs block signature storage type BlockSigs interface { - AddWithTx(*bolt.Tx, cipher.SHA256, cipher.Sig) error - Get(hash cipher.SHA256) (cipher.Sig, bool, error) + Add(*dbutil.Tx, cipher.SHA256, cipher.Sig) error + Get(*dbutil.Tx, cipher.SHA256) (cipher.Sig, bool, error) + ForEach(*dbutil.Tx, func(cipher.SHA256, cipher.Sig) error) error } -// UnspentPool unspent outputs pool -type UnspentPool interface { - Len() uint64 // Len returns the length of unspent outputs pool - Get(cipher.SHA256) (coin.UxOut, bool) // Get returns outpus - GetAll() (coin.UxArray, error) - GetArray(hashes []cipher.SHA256) (coin.UxArray, error) - GetUxHash() cipher.SHA256 - GetUnspentsOfAddrs(addrs []cipher.Address) coin.AddressUxOuts - ProcessBlock(*coin.SignedBlock) bucket.TxHandler - Contains(cipher.SHA256) bool +// UnspentPooler unspent outputs pool +type UnspentPooler interface { + MaybeBuildIndexes(*dbutil.Tx, uint64) error + Len(*dbutil.Tx) (uint64, error) + Contains(*dbutil.Tx, cipher.SHA256) (bool, error) + Get(*dbutil.Tx, cipher.SHA256) (*coin.UxOut, error) + GetAll(*dbutil.Tx) (coin.UxArray, error) + GetArray(*dbutil.Tx, []cipher.SHA256) (coin.UxArray, error) + GetUxHash(*dbutil.Tx) (cipher.SHA256, error) + GetUnspentsOfAddrs(*dbutil.Tx, []cipher.Address) (coin.AddressUxOuts, error) + ProcessBlock(*dbutil.Tx, *coin.SignedBlock) error + AddressCount(*dbutil.Tx) (uint64, error) } -// Walker function for go through blockchain -type Walker func(hps []coin.HashPair) cipher.SHA256 +// ChainMeta blockchain metadata +type ChainMeta interface { + GetHeadSeq(*dbutil.Tx) (uint64, bool, error) + SetHeadSeq(*dbutil.Tx, uint64) error +} // Blockchain maintain the buckets for blockchain type Blockchain struct { - db *bolt.DB - meta *chainMeta - unspent UnspentPool + db *dbutil.DB + meta ChainMeta + unspent UnspentPooler tree BlockTree sigs BlockSigs walker Walker - cache struct { - headSeq uint64 // head block seq - genesisBlock *coin.SignedBlock - } - sync.RWMutex // cache lock } // NewBlockchain creates a new blockchain instance -func NewBlockchain(db *bolt.DB, walker Walker) (*Blockchain, error) { +func NewBlockchain(db *dbutil.DB, walker Walker) (*Blockchain, error) { if db == nil { return nil, errors.New("db is nil") } @@ -105,127 +101,119 @@ func NewBlockchain(db *bolt.DB, walker Walker) (*Blockchain, error) { return nil, errors.New("blockchain walker is nil") } - unspent, err := NewUnspentPool(db) - if err != nil { - return nil, err - } - - tree, err := newBlockTree(db) - if err != nil { - return nil, err - } - - sigs, err := newBlockSigs(db) - if err != nil { - return nil, err - } - - return createBlockchain(db, walker, tree, sigs, unspent) -} - -func createBlockchain(db *bolt.DB, - walker Walker, - tree BlockTree, - sigs BlockSigs, - unspent UnspentPool, -) (*Blockchain, error) { - meta, err := newChainMeta(db) - if err != nil { - return nil, err - } - - bc := &Blockchain{ + return &Blockchain{ db: db, - unspent: unspent, - meta: meta, - tree: tree, - sigs: sigs, + unspent: NewUnspentPool(), + meta: &chainMeta{}, + tree: &blockTree{}, + sigs: &blockSigs{}, walker: walker, - } - - if err := bc.syncCache(); err != nil { - return nil, err - } + }, nil +} - return bc, nil +// UnspentPool returns the unspent pool +func (bc *Blockchain) UnspentPool() UnspentPooler { + return bc.unspent } -// AddBlockWithTx adds signed block -func (bc *Blockchain) AddBlockWithTx(tx *bolt.Tx, sb *coin.SignedBlock) error { - if err := bc.sigs.AddWithTx(tx, sb.HashHeader(), sb.Sig); err != nil { +// AddBlock adds signed block +func (bc *Blockchain) AddBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + if err := bc.sigs.Add(tx, sb.HashHeader(), sb.Sig); err != nil { return fmt.Errorf("save signature failed: %v", err) } - if err := bc.tree.AddBlockWithTx(tx, &sb.Block); err != nil { + if err := bc.tree.AddBlock(tx, &sb.Block); err != nil { return fmt.Errorf("save block failed: %v", err) } // update block head seq and unspent pool - if err := bc.processBlockWithTx(tx, sb); err != nil { + if err := bc.processBlock(tx, sb); err != nil { return err } return nil } -// processBlockWithTx process block with *bolt.Tx -func (bc *Blockchain) processBlockWithTx(tx *bolt.Tx, b *coin.SignedBlock) error { - return bc.updateWithTx(tx, bc.updateHeadSeq(b), bc.unspent.ProcessBlock(b), bc.cacheGenesisBlock(b)) +// processBlock processes a block and updates the db +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if err := bc.unspent.ProcessBlock(tx, b); err != nil { + return err + } + + return bc.meta.SetHeadSeq(tx, b.Seq()) } -// Head returns head block, returns error if no block does exist -func (bc *Blockchain) Head() (*coin.SignedBlock, error) { - b, err := bc.GetBlockBySeq(bc.HeadSeq()) +// Head returns head block, returns error if no head block exists +func (bc *Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + seq, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, ErrNoHeadBlock + } + + b, err := bc.GetSignedBlockBySeq(tx, seq) if err != nil { return nil, err } if b == nil { - return nil, fmt.Errorf("found no head block: %v", bc.HeadSeq()) + return nil, ErrNoHeadBlock } return b, nil } // HeadSeq returns the head block sequence -func (bc *Blockchain) HeadSeq() uint64 { - bc.RLock() - defer bc.RUnlock() - return bc.cache.headSeq +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.meta.GetHeadSeq(tx) } -// UnspentPool returns the unspent pool -func (bc *Blockchain) UnspentPool() UnspentPool { - return bc.unspent +// Len returns blockchain length +func (bc *Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + seq, ok, err := bc.meta.GetHeadSeq(tx) + if err != nil { + return 0, err + } else if !ok { + return 0, nil + } + + return seq + 1, nil } -// Len returns blockchain length -func (bc *Blockchain) Len() uint64 { - bc.RLock() - defer bc.RUnlock() - if bc.cache.genesisBlock == nil { - return 0 +// GetBlockSignature returns the signature of a block +func (bc *Blockchain) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return bc.sigs.Get(tx, b.HashHeader()) +} + +// GetBlockByHash returns block of given hash +func (bc *Blockchain) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err } - return uint64(bc.cache.headSeq + 1) + + return b, nil } -// GetBlockByHash returns signed block of given hash -func (bc *Blockchain) GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { - b := bc.tree.GetBlock(hash) +// GetSignedBlockByHash returns signed block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } if b == nil { return nil, nil } // get signature - sig, ok, err := bc.sigs.Get(hash) + sig, ok, err := bc.sigs.Get(tx, hash) if err != nil { return nil, fmt.Errorf("find signature of block: %v failed: %v", hash.Hex(), err) } if !ok { - return nil, ErrMissingSignature{ - Hash: hash.Hex(), - } + return nil, NewErrMissingSignature(b) } return &coin.SignedBlock{ @@ -234,22 +222,23 @@ func (bc *Blockchain) GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, err }, nil } -// GetBlockBySeq returns signed block of given seq -func (bc *Blockchain) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { - b := bc.tree.GetBlockInDepth(seq, bc.walker) +// GetSignedBlockBySeq returns signed block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlockInDepth(tx, seq, bc.walker) + if err != nil { + return nil, fmt.Errorf("bc.tree.GetBlockInDepth failed: %v", err) + } if b == nil { return nil, nil } - sig, ok, err := bc.sigs.Get(b.HashHeader()) + sig, ok, err := bc.sigs.Get(tx, b.HashHeader()) if err != nil { return nil, fmt.Errorf("find signature of block: %v failed: %v", seq, err) } if !ok { - return nil, ErrMissingSignature{ - Seq: seq, - } + return nil, NewErrMissingSignature(b) } return &coin.SignedBlock{ @@ -259,103 +248,11 @@ func (bc *Blockchain) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { } // GetGenesisBlock returns genesis block -func (bc *Blockchain) GetGenesisBlock() *coin.SignedBlock { - bc.RLock() - defer bc.RUnlock() - return bc.cache.genesisBlock +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.GetSignedBlockBySeq(tx, 0) } -func (bc *Blockchain) syncCache() error { - // update head seq cache - bc.Lock() - defer bc.Unlock() - bc.cache.headSeq = bc.getHeadSeqFromDB() - - // load genesis block - if bc.cache.genesisBlock == nil { - b, err := bc.GetBlockBySeq(0) - if err != nil { - return err - } - - bc.cache.genesisBlock = b - } - return nil -} - -func (bc *Blockchain) getHeadSeqFromDB() uint64 { - if v := bc.meta.Get(headSeqKey); v != nil { - return bucket.Btoi(v) - } - - return 0 -} - -// dbUpdate will execute all processors in sequence, return error will rollback all -// updates to the db -func (bc *Blockchain) dbUpdate(ps ...bucket.TxHandler) error { - return bc.db.Update(func(tx *bolt.Tx) error { - return bc.updateWithTx(tx, ps...) - }) -} - -func (bc *Blockchain) updateWithTx(tx *bolt.Tx, ps ...bucket.TxHandler) error { - rollbackFuncs := []bucket.Rollback{} - for _, p := range ps { - rb, err := p(tx) - if err != nil { - // rollback previous updates if any - for _, r := range rollbackFuncs { - r() - } - return err - } - rollbackFuncs = append(rollbackFuncs, rb) - } - - return nil -} - -func (bc *Blockchain) updateHeadSeq(b *coin.SignedBlock) bucket.TxHandler { - return func(tx *bolt.Tx) (bucket.Rollback, error) { - // meta := chainMeta{tx.Bucket(bc.meta.Name)} - if err := bc.meta.setHeadSeqWithTx(tx, b.Seq()); err != nil { - return func() {}, err - } - - bc.Lock() - // get current head seq - seq := bc.cache.headSeq - - // update the cache head seq - bc.cache.headSeq = b.Seq() - bc.Unlock() - - return func() { - // reset the cache head seq - bc.Lock() - bc.cache.headSeq = seq - bc.Unlock() - }, nil - } -} - -// cacheGenesisBlock will cache genesis block if the current block is genesis -func (bc *Blockchain) cacheGenesisBlock(b *coin.SignedBlock) bucket.TxHandler { - return func(tx *bolt.Tx) (bucket.Rollback, error) { - bc.Lock() - defer bc.Unlock() - - seq := bc.cache.headSeq - originGenesisBlock := bc.cache.genesisBlock - if seq == 0 { - bc.cache.genesisBlock = b - } - - return func() { - bc.Lock() - bc.cache.genesisBlock = originGenesisBlock - bc.Unlock() - }, nil - } +// ForEachBlock iterates all blocks and calls f on them +func (bc *Blockchain) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return bc.tree.ForEachBlock(tx, f) } diff --git a/src/visor/blockdb/blockchain_test.go b/src/visor/blockdb/blockchain_test.go index fea996e..d115a35 100755 --- a/src/visor/blockdb/blockchain_test.go +++ b/src/visor/blockdb/blockchain_test.go @@ -7,86 +7,138 @@ import ( "github.com/stretchr/testify/require" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + var ( - genPublic, genSecret = cipher.GenerateKeyPair() - genAddress = cipher.AddressFromPubKey(genPublic) - genTime uint64 = 1000 - genCoinHours uint64 = 1000 * 1000 - failedWhenSave bool + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + + genTime uint64 = 1000 + genCoinHours uint64 = 1000 * 1000 ) -func _feeCalc(t *coin.Transaction) (uint64, error) { +func feeCalc(t *coin.Transaction) (uint64, error) { return 0, nil } -func cleanState() { - failedWhenSave = false +type fakeStorage struct { + tree *fakeBlockTree + sigs *fakeSignatureStore + unspent *fakeUnspentPool + chainMeta *fakeChainMeta +} + +func newFakeStorage() *fakeStorage { + var failedWhenSaved bool + return &fakeStorage{ + tree: newFakeBlockTree(&failedWhenSaved), + sigs: newFakeSigStore(&failedWhenSaved), + unspent: newFakeUnspentPool(&failedWhenSaved), + chainMeta: newFakeChainMeta(), + } } type fakeBlockTree struct { blocks map[string]*coin.Block saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool } -func newFakeBlockTree() *fakeBlockTree { +func newFakeBlockTree(failedWhenSaved *bool) *fakeBlockTree { return &fakeBlockTree{ - blocks: make(map[string]*coin.Block), + blocks: make(map[string]*coin.Block), + failedWhenSaved: failedWhenSaved, } } -func (bt fakeBlockTree) AddBlockWithTx(tx *bolt.Tx, b *coin.Block) error { +func (bt *fakeBlockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { if bt.saveFailed { - failedWhenSave = true - return errors.New("intentional failed") + if bt.failedWhenSaved != nil { + *bt.failedWhenSaved = true + } + return errors.New("intentionally failed") } bt.blocks[b.HashHeader().Hex()] = b return nil } -func (bt fakeBlockTree) GetBlock(hash cipher.SHA256) *coin.Block { - if failedWhenSave { - return nil +func (bt *fakeBlockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + return bt.blocks[hash.Hex()], nil +} + +func (bt *fakeBlockTree) GetBlockInDepth(tx *dbutil.Tx, dep uint64, filter Walker) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + + for _, b := range bt.blocks { + if b.Head.BkSeq == dep { + return b, nil + } } - return bt.blocks[hash.Hex()] + + return nil, nil } -func (bt fakeBlockTree) GetBlockInDepth(dep uint64, filter func(hps []coin.HashPair) cipher.SHA256) *coin.Block { +func (bt *fakeBlockTree) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { return nil } type fakeSignatureStore struct { - db *bolt.DB sigs map[string]cipher.Sig saveFailed bool getSigErr error + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool } -func newFakeSigStore() *fakeSignatureStore { +func newFakeSigStore(failedWhenSaved *bool) *fakeSignatureStore { return &fakeSignatureStore{ - sigs: make(map[string]cipher.Sig), + sigs: make(map[string]cipher.Sig), + failedWhenSaved: failedWhenSaved, } } -func (ss fakeSignatureStore) AddWithTx(tx *bolt.Tx, hash cipher.SHA256, sig cipher.Sig) error { +func (ss *fakeSignatureStore) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { if ss.saveFailed { - failedWhenSave = true - return errors.New("intentional failed") + if ss.failedWhenSaved != nil { + *ss.failedWhenSaved = true + } + return errors.New("intentionally failed") } ss.sigs[hash.Hex()] = sig return nil } -func (ss fakeSignatureStore) Get(hash cipher.SHA256) (cipher.Sig, bool, error) { - if failedWhenSave { +func (ss *fakeSignatureStore) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + if ss.failedWhenSaved != nil && *ss.failedWhenSaved { return cipher.Sig{}, false, nil } @@ -98,28 +150,44 @@ func (ss fakeSignatureStore) Get(hash cipher.SHA256) (cipher.Sig, bool, error) { return sig, ok, nil } +func (ss *fakeSignatureStore) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return nil +} + type fakeUnspentPool struct { outs map[cipher.SHA256]coin.UxOut uxHash cipher.SHA256 saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool } -func newFakeUnspentsPool() *fakeUnspentPool { +func newFakeUnspentPool(failedWhenSaved *bool) *fakeUnspentPool { return &fakeUnspentPool{ - outs: make(map[cipher.SHA256]coin.UxOut), + outs: make(map[cipher.SHA256]coin.UxOut), + failedWhenSaved: failedWhenSaved, } } -func (fup fakeUnspentPool) Len() uint64 { - return uint64(len(fup.outs)) +func (fup *fakeUnspentPool) MaybeBuildIndexes(tx *dbutil.Tx, height uint64) error { + return nil } -func (fup fakeUnspentPool) Get(h cipher.SHA256) (coin.UxOut, bool) { +func (fup *fakeUnspentPool) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fup.outs)), nil +} + +func (fup *fakeUnspentPool) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { out, ok := fup.outs[h] - return out, ok + if !ok { + return nil, nil + } + return &out, nil } -func (fup fakeUnspentPool) GetAll() (coin.UxArray, error) { +func (fup *fakeUnspentPool) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { outs := make(coin.UxArray, 0, len(fup.outs)) for _, out := range fup.outs { outs = append(outs, out) @@ -128,7 +196,7 @@ func (fup fakeUnspentPool) GetAll() (coin.UxArray, error) { return outs, nil } -func (fup fakeUnspentPool) GetArray(hashes []cipher.SHA256) (coin.UxArray, error) { +func (fup *fakeUnspentPool) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { outs := make(coin.UxArray, 0, len(hashes)) for _, h := range hashes { ux, ok := fup.outs[h] @@ -141,86 +209,74 @@ func (fup fakeUnspentPool) GetArray(hashes []cipher.SHA256) (coin.UxArray, error return outs, nil } -func (fup fakeUnspentPool) GetUxHash() cipher.SHA256 { - return fup.uxHash +func (fup *fakeUnspentPool) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return fup.uxHash, nil } -func (fup fakeUnspentPool) GetUnspentsOfAddrs(addrs []cipher.Address) coin.AddressUxOuts { - addrOutMap := map[cipher.Address]coin.UxArray{} +func (fup *fakeUnspentPool) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(coin.AddressUxOuts) for _, out := range fup.outs { addr := out.Body.Address addrOutMap[addr] = append(addrOutMap[addr], out) } - return addrOutMap + return addrOutMap, nil } -func (fup fakeUnspentPool) ProcessBlock(b *coin.SignedBlock) bucket.TxHandler { - return func(tx *bolt.Tx) (bucket.Rollback, error) { - if fup.saveFailed { - failedWhenSave = true - return func() {}, errors.New("intentional failed") +func (fup *fakeUnspentPool) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if fup.saveFailed { + if fup.failedWhenSaved != nil { + *fup.failedWhenSaved = true } - return func() {}, nil + return errors.New("intentionally failed") } + return nil } -func (fup fakeUnspentPool) Contains(h cipher.SHA256) bool { +func (fup *fakeUnspentPool) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { _, ok := fup.outs[h] - return ok -} - -func TestNewBlockchain(t *testing.T) { - // walker := func(hps []coin.HashPair) cipher.SHA256 { - // return hps[0].Hash - // } - - // tt := []struct { - // name string - // wlk func(hps []coin.HashPair) cipher.SHA256 - // tree blockTree - // sigs signatureStore - // err error - // }{ - // { - // "ok", - // false, - // walker, - // &fakeBlockTree{}, - // &fakeSignatureStore{}, - // nil, - // }, - // } - - // for _, tc := range tt { - // t.Run(tc.name, func(t *testing.T) { - // db, err := testutil.PrepareDB(t) - // require.NoError(t, err) - // bc, err := NewBlockchain(db, walker) - // require.Equal(t, , actual interface{}, msgAndArgs ...interface{}) - // }) - // } - - // bc, err := NewBlockchain(db, func(hps []coin.HashPair) cipher.SHA256 { - // return hps[0].Hash - // }) - - // assert.Nil(t, err) - // assert.NotNil(t, bc.db) - // assert.NotNil(t, bc.UnspentPool()) - // assert.NotNil(t, bc.meta) - - // // check the existence of buckets - // db.View(func(tx *bolt.Tx) error { - // assert.NotNil(t, tx.Bucket([]byte("unspent_pool"))) - // assert.NotNil(t, tx.Bucket([]byte("unspent_meta"))) - // assert.NotNil(t, tx.Bucket([]byte("blockchain_meta"))) - // return nil - // }) -} - -func DefaultWalker(hps []coin.HashPair) cipher.SHA256 { - return hps[0].Hash + return ok, nil +} + +func (fup *fakeUnspentPool) AddressCount(tx *dbutil.Tx) (uint64, error) { + addrs := make(map[cipher.Address]struct{}) + for _, out := range fup.outs { + addrs[out.Body.Address] = struct{}{} + } + + return uint64(len(addrs)), nil +} + +type fakeChainMeta struct { + headSeq uint64 + didSetSeq bool +} + +func newFakeChainMeta() *fakeChainMeta { + return &fakeChainMeta{} +} + +func (fcm *fakeChainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + if !fcm.didSetSeq { + return 0, false, nil + } + + return fcm.headSeq, true, nil +} + +func (fcm *fakeChainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + fcm.headSeq = seq + fcm.didSetSeq = true + return nil +} + +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + return hps[0].Hash, true } func makeGenesisBlock(t *testing.T) coin.SignedBlock { @@ -236,41 +292,43 @@ func makeGenesisBlock(t *testing.T) coin.SignedBlock { func TestBlockchainAddBlockWithTx(t *testing.T) { type expect struct { - err error - sigSaved bool - blockSaved bool - genesisCached bool - headSeq uint64 + err error + sigSaved bool + blockSaved bool + headSeq uint64 + } + + type failedSaves struct { + tree bool + sigs bool + unspent bool } tt := []struct { - name string - tree BlockTree - sigs BlockSigs - unspents UnspentPool - expect expect + name string + fakeStorage *fakeStorage + failedSaves failedSaves + expect expect }{ { "ok", - newFakeBlockTree(), - newFakeSigStore(), - newFakeUnspentsPool(), + newFakeStorage(), + failedSaves{}, expect{ nil, true, true, - true, uint64(0), }, }, { "save sig failed", - newFakeBlockTree(), - fakeSignatureStore{saveFailed: true}, - newFakeUnspentsPool(), + newFakeStorage(), + failedSaves{ + sigs: true, + }, expect{ - errors.New("save signature failed: intentional failed"), - false, + errors.New("save signature failed: intentionally failed"), false, false, uint64(0), @@ -278,12 +336,12 @@ func TestBlockchainAddBlockWithTx(t *testing.T) { }, { "save block failed", - fakeBlockTree{saveFailed: true}, - newFakeSigStore(), - newFakeUnspentsPool(), + newFakeStorage(), + failedSaves{ + tree: true, + }, expect{ - errors.New("save block failed: intentional failed"), - false, + errors.New("save block failed: intentionally failed"), false, false, uint64(0), @@ -291,12 +349,12 @@ func TestBlockchainAddBlockWithTx(t *testing.T) { }, { "unspent process block failed", - newFakeBlockTree(), - newFakeSigStore(), - fakeUnspentPool{saveFailed: true}, + newFakeStorage(), + failedSaves{ + unspent: true, + }, expect{ - errors.New("intentional failed"), - false, + errors.New("intentionally failed"), false, false, uint64(0), @@ -306,78 +364,137 @@ func TestBlockchainAddBlockWithTx(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - cleanState() - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() - bc, err := createBlockchain(db, - DefaultWalker, - tc.tree, - tc.sigs, - tc.unspents) - require.NoError(t, err) + + tc.fakeStorage.tree.saveFailed = tc.failedSaves.tree + tc.fakeStorage.sigs.saveFailed = tc.failedSaves.sigs + tc.fakeStorage.unspent.saveFailed = tc.failedSaves.unspent + + bc := &Blockchain{ + db: db, + unspent: tc.fakeStorage.unspent, + meta: tc.fakeStorage.chainMeta, + tree: tc.fakeStorage.tree, + sigs: tc.fakeStorage.sigs, + walker: DefaultWalker, + } gb := makeGenesisBlock(t) - err = db.Update(func(tx *bolt.Tx) error { - return bc.AddBlockWithTx(tx, &gb) + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.Equal(t, tc.expect.err, err) + return nil }) - - require.Equal(t, tc.expect.err, err) + require.NoError(t, err) // check sig - _, ok, err := tc.sigs.Get(gb.HashHeader()) + err = db.View("", func(tx *dbutil.Tx) error { + _, ok, err := tc.fakeStorage.sigs.Get(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.sigSaved, ok) + + // check block in tree + b, err := tc.fakeStorage.tree.GetBlock(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.blockSaved, b != nil) + + // check head seq + headSeq, ok, err := bc.HeadSeq(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.True(t, ok) + require.Equal(t, tc.expect.headSeq, headSeq) + } else { + require.False(t, ok) + } + + // check len + length, err := bc.Len(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.Equal(t, uint64(1), length) + } else { + require.Equal(t, uint64(0), length) + } + + // check genesis block + genesisBlock, err := bc.GetGenesisBlock(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.NotNil(t, genesisBlock) + require.Equal(t, gb, *genesisBlock) + } else { + require.Nil(t, genesisBlock) + } + + return nil + }) require.NoError(t, err) - require.Equal(t, tc.expect.sigSaved, ok) - - // check block in tree - b := tc.tree.GetBlock(gb.HashHeader()) - require.Equal(t, tc.expect.blockSaved, b != nil) - - // check cache of head seq - require.Equal(t, tc.expect.headSeq, bc.cache.headSeq) - - require.Equal(t, tc.expect.genesisCached, bc.cache.genesisBlock != nil) - if tc.expect.genesisCached { - require.Equal(t, gb.HashHeader().Hex(), bc.cache.genesisBlock.HashHeader().Hex()) - } }) } } func TestBlockchainHead(t *testing.T) { - cleanState() - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() bc, err := NewBlockchain(db, DefaultWalker) require.NoError(t, err) - _, err = bc.Head() - require.EqualError(t, err, "found no head block: 0") + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = bc.Head(tx) + require.Equal(t, err, ErrNoHeadBlock) - gb := makeGenesisBlock(t) - db.Update(func(tx *bolt.Tx) error { - err := bc.AddBlockWithTx(tx, &gb) + gb := makeGenesisBlock(t) + + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + + b, err := bc.Head(tx) require.NoError(t, err) + require.Equal(t, gb.HashHeader().Hex(), b.HashHeader().Hex()) + return nil }) - - b, err := bc.Head() require.NoError(t, err) - require.Equal(t, gb.HashHeader().Hex(), b.HashHeader().Hex()) } func TestBlockchainLen(t *testing.T) { - bc := Blockchain{} - require.Equal(t, uint64(0), bc.Len()) + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) gb := makeGenesisBlock(t) - bc.cache.genesisBlock = &gb - require.Equal(t, uint64(1), bc.Len()) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) - bc.cache.headSeq = 1 - require.Equal(t, uint64(2), bc.Len()) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) } func TestBlockchainGetBlockByHash(t *testing.T) { @@ -439,7 +556,7 @@ func TestBlockchainGetBlockByHash(t *testing.T) { }, gb.HashHeader(), expect{ - ErrMissingSignature{Hash: gb.HashHeader().Hex()}, + NewErrMissingSignature(&gb.Block), nil, }, }, @@ -464,16 +581,22 @@ func TestBlockchainGetBlockByHash(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - cleanState() + db, closeDB := prepareDB(t) + defer closeDB() - bc := Blockchain{ - tree: tc.tree, - sigs: tc.sigs, - } + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) - b, err := bc.GetBlockByHash(tc.hash) - require.Equal(t, tc.expect.err, err) - require.Equal(t, tc.expect.b, b) + bc.tree = tc.tree + bc.sigs = tc.sigs + + err = db.View("", func(tx *dbutil.Tx) error { + b, err := bc.GetSignedBlockByHash(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.b, b) + return nil + }) + require.NoError(t, err) }) } } diff --git a/src/visor/blockdb/blockdb.go b/src/visor/blockdb/blockdb.go deleted file mode 100755 index 65db517..0000000 --- a/src/visor/blockdb/blockdb.go +++ /dev/null @@ -1,5 +0,0 @@ -package blockdb - -//https://github.com/boltdb/bolt -//https://github.com/abhigupta912/mbuckets -//https://github.com/asdine/storm diff --git a/src/visor/blockdb/blocksigs.go b/src/visor/blockdb/blocksigs.go index 2384258..502d9e1 100755 --- a/src/visor/blockdb/blocksigs.go +++ b/src/visor/blockdb/blocksigs.go @@ -1,11 +1,14 @@ package blockdb import ( - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockSigsBkt holds block signatures + BlockSigsBkt = []byte("block_sigs") ) // blockSigs manages known blockSigs as received. @@ -18,40 +21,39 @@ import ( // blockSigs per BkSeq, or use hashes as keys. For now, this is not a // problem assuming the signed blocks created from master are valid blocks, // because we can check the signature independently of the blockchain. -type blockSigs struct { - Sigs *bucket.Bucket -} +type blockSigs struct{} -var ( - blockSigsBkt = []byte("block_sigs") -) +// Get returns the signature of a specific block +func (bs blockSigs) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + var sig cipher.Sig -// newBlockSigs create block signature buckets -func newBlockSigs(db *bolt.DB) (*blockSigs, error) { - sigs, err := bucket.New(blockSigsBkt, db) - if err != nil { - return nil, err + if ok, err := dbutil.GetBucketObjectDecoded(tx, BlockSigsBkt, hash[:], &sig); err != nil { + return cipher.Sig{}, false, err + } else if !ok { + return cipher.Sig{}, false, nil } - return &blockSigs{ - Sigs: sigs, - }, nil + return sig, true, nil } -// Get returns signature of specific block -func (bs blockSigs) Get(hash cipher.SHA256) (cipher.Sig, bool, error) { - bin := bs.Sigs.Get(hash[:]) - if bin == nil { - return cipher.Sig{}, false, nil - } - var sig cipher.Sig - if err := encoder.DeserializeRaw(bin, &sig); err != nil { - return cipher.Sig{}, false, err - } - return sig, true, nil +// Add adds a signed block to the db +func (bs *blockSigs) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + return dbutil.PutBucketValue(tx, BlockSigsBkt, hash[:], encoder.Serialize(sig)) } -// AddWithTx add signed block with bolt.Tx -func (bs *blockSigs) AddWithTx(tx *bolt.Tx, hash cipher.SHA256, sig cipher.Sig) error { - return bs.Sigs.PutWithTx(tx, hash[:], encoder.Serialize(sig)) +// ForEach iterates all signatures and calls f on them +func (bs *blockSigs) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return dbutil.ForEach(tx, BlockSigsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var sig cipher.Sig + if err := encoder.DeserializeRaw(v, &sig); err != nil { + return err + } + + return f(hash, sig) + }) } diff --git a/src/visor/blockdb/blocksigs_test.go b/src/visor/blockdb/blocksigs_test.go index cc3c570..09f7112 100755 --- a/src/visor/blockdb/blocksigs_test.go +++ b/src/visor/blockdb/blocksigs_test.go @@ -3,32 +3,14 @@ package blockdb import ( "testing" - "github.com/boltdb/bolt" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -func TestNewBlockSigs(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) - defer closeDB() - - sigs, err := newBlockSigs(db) - require.NoError(t, err) - require.NotNil(t, sigs) - - // check the bucket - require.NotNil(t, sigs.Sigs) - - db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket(blockSigsBkt) - require.NotNil(t, bkt) - return nil - }) -} - func TestBlockSigsGet(t *testing.T) { type hashSig struct { hash cipher.SHA256 @@ -83,12 +65,12 @@ func TestBlockSigsGet(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() // init db - db.Update(func(tx *bolt.Tx) error { - bkt, err := tx.CreateBucketIfNotExists(blockSigsBkt) + err := db.Update("", func(tx *dbutil.Tx) error { + bkt, err := tx.CreateBucketIfNotExists(BlockSigsBkt) require.NoError(t, err) for _, hs := range tc.init { err = bkt.Put(hs.hash[:], encoder.Serialize(hs.sig)) @@ -96,37 +78,43 @@ func TestBlockSigsGet(t *testing.T) { } return nil }) + require.NoError(t, err) + + sigs := &blockSigs{} - sigs, err := newBlockSigs(db) + err = db.View("", func(tx *dbutil.Tx) error { + sg, ok, err := sigs.Get(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.exist, ok) + if ok { + require.Equal(t, tc.expect.sig, sg) + } + + return nil + }) require.NoError(t, err) - sg, ok, err := sigs.Get(tc.hash) - require.Equal(t, tc.expect.err, err) - require.Equal(t, tc.expect.exist, ok) - if ok { - require.Equal(t, tc.expect.sig, sg) - } }) } } func TestBlockSigsAddWithTx(t *testing.T) { - db, closeDB := testutil.PrepareDB(t) + db, closeDB := prepareDB(t) defer closeDB() _, s := cipher.GenerateKeyPair() h := testutil.RandSHA256(t) sig := cipher.SignHash(h, s) - sigs, err := newBlockSigs(db) - require.NoError(t, err) + sigs := &blockSigs{} - db.Update(func(tx *bolt.Tx) error { - return sigs.AddWithTx(tx, h, sig) + err := db.Update("", func(tx *dbutil.Tx) error { + return sigs.Add(tx, h, sig) }) + require.NoError(t, err) // check the db - db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket(blockSigsBkt) + err = db.View("", func(tx *dbutil.Tx) error { + bkt := tx.Bucket(BlockSigsBkt) v := bkt.Get(h[:]) require.NotNil(t, v) var s cipher.Sig @@ -135,4 +123,5 @@ func TestBlockSigsAddWithTx(t *testing.T) { require.Equal(t, sig, s) return nil }) + require.NoError(t, err) } diff --git a/src/visor/blockdb/chain_meta.go b/src/visor/blockdb/chain_meta.go new file mode 100755 index 0000000..fdfaf33 --- /dev/null +++ b/src/visor/blockdb/chain_meta.go @@ -0,0 +1,29 @@ +package blockdb + +import ( + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockchainMetaBkt holds blockchain metadata + BlockchainMetaBkt = []byte("blockchain_meta") + // blockchain head sequence number + headSeqKey = []byte("head_seq") +) + +type chainMeta struct{} + +func (m chainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + return dbutil.PutBucketValue(tx, BlockchainMetaBkt, headSeqKey, dbutil.Itob(seq)) +} + +func (m chainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, BlockchainMetaBkt, headSeqKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} diff --git a/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db b/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db new file mode 100755 index 0000000..dcd9ede Binary files /dev/null and b/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db differ diff --git a/src/visor/blockdb/unspent.go b/src/visor/blockdb/unspent.go index e6cca4f..a3a316d 100755 --- a/src/visor/blockdb/unspent.go +++ b/src/visor/blockdb/unspent.go @@ -1,24 +1,26 @@ package blockdb import ( + "bytes" + "errors" "fmt" - "sync" - - "github.com/boltdb/bolt" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var ( - xorhashKey = []byte("xorhash") - - // bucket for unspent pool - unspentPoolBkt = []byte("unspent_pool") - // bucket for unspent meta info - unspentMetaBkt = []byte("unspent_meta") + xorhashKey = []byte("xorhash") + addrIndexHeightKey = []byte("addr_index_height") + + // UnspentPoolBkt holds unspent outputs, indexed by unspent output hash + UnspentPoolBkt = []byte("unspent_pool") + // UnspentPoolAddrIndexBkt maps addresses to their unspent outputs + UnspentPoolAddrIndexBkt = []byte("unspent_pool_addr_index") + // UnspentMetaBkt holds unspent output metadata + UnspentMetaBkt = []byte("unspent_meta") ) // ErrUnspentNotExist is returned if an unspent is not found in the pool @@ -37,368 +39,446 @@ func (e ErrUnspentNotExist) Error() string { return fmt.Sprintf("unspent output of %s does not exist", e.UxID) } -// UnspentGetter provides unspend pool related -// querying methods -type UnspentGetter interface { - // GetUnspentsOfAddrs returns all unspent outputs of given addresses - GetUnspentsOfAddrs(addrs []cipher.Address) coin.AddressUxOuts - Get(cipher.SHA256) (coin.UxOut, bool) -} +type unspentMeta struct{} -// Unspents unspent outputs pool -type Unspents struct { - db *bolt.DB - pool *pool - meta *unspentMeta - cache struct { - pool map[string]coin.UxOut - uxhash cipher.SHA256 - } - sync.Mutex +func (m unspentMeta) getXorHash(tx *dbutil.Tx) (cipher.SHA256, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, xorhashKey) + if err != nil { + return cipher.SHA256{}, err + } else if v == nil { + return cipher.SHA256{}, nil + } + + return cipher.SHA256FromBytes(v) } -type unspentMeta struct { - bucket.Bucket +func (m *unspentMeta) setXorHash(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, xorhashKey, hash[:]) } -func newUnspentMeta(db *bolt.DB) (*unspentMeta, error) { - bkt, err := bucket.New(unspentMetaBkt, db) +func (m *unspentMeta) getAddrIndexHeight(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey) if err != nil { - return nil, fmt.Errorf("failed to create unspent_meta bucket: %v", err) + return 0, false, err + } else if v == nil { + return 0, false, nil } - return &unspentMeta{ - Bucket: *bkt, - }, nil + return dbutil.Btoi(v), true, nil } -func (m unspentMeta) getXorHashWithTx(tx *bolt.Tx) (cipher.SHA256, error) { - if v := m.GetWithTx(tx, xorhashKey); v != nil { - var hash cipher.SHA256 - copy(hash[:], v[:]) - return hash, nil +func (m *unspentMeta) setAddrIndexHeight(tx *dbutil.Tx, height uint64) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey, dbutil.Itob(height)) +} + +type pool struct{} + +func (pl pool) get(tx *dbutil.Tx, hash cipher.SHA256) (*coin.UxOut, error) { + var out coin.UxOut + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnspentPoolBkt, hash[:], &out); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return &out, nil +} + +func (pl pool) getAll(tx *dbutil.Tx) (coin.UxArray, error) { + var uxa coin.UxArray + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRaw(v, &ux); err != nil { + return err + } + + uxa = append(uxa, ux) + return nil + }); err != nil { + return nil, err } - return cipher.SHA256{}, nil + return uxa, nil } -func (m *unspentMeta) setXorHashWithTx(tx *bolt.Tx, hash cipher.SHA256) error { - return m.PutWithTx(tx, xorhashKey, hash[:]) +func (pl pool) set(tx *dbutil.Tx, hash cipher.SHA256, ux coin.UxOut) error { + return dbutil.PutBucketValue(tx, UnspentPoolBkt, hash[:], encoder.Serialize(ux)) } -type pool struct { - bucket.Bucket +func (pl *pool) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnspentPoolBkt, hash[:]) } -func newPool(db *bolt.DB) (*pool, error) { - bkt, err := bucket.New(unspentPoolBkt, db) - if err != nil { +type poolAddrIndex struct{} + +func (p poolAddrIndex) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), &hashes); err != nil { return nil, err + } else if !ok { + return nil, nil } - return &pool{ - Bucket: *bkt, - }, nil + return hashes, nil } -func (pl pool) getWithTx(tx *bolt.Tx, hash cipher.SHA256) (*coin.UxOut, bool, error) { - if v := pl.GetWithTx(tx, hash[:]); v != nil { - var out coin.UxOut - if err := encoder.DeserializeRaw(v, &out); err != nil { - return nil, false, err +func (p poolAddrIndex) set(tx *dbutil.Tx, addr cipher.Address, hashes []cipher.SHA256) error { + if len(hashes) == 0 { + return errors.New("poolAddrIndex.set cannot set to empty hash array") + } + + hashesMap := make(map[cipher.SHA256]struct{}, len(hashes)) + for _, h := range hashes { + if _, ok := hashesMap[h]; ok { + return errors.New("poolAddrIndex.set: hashes array contains duplicate") } - return &out, true, nil + + hashesMap[h] = struct{}{} } - return nil, false, nil + + encodedHashes := encoder.Serialize(hashes) + return dbutil.PutBucketValue(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), encodedHashes) } -func (pl pool) setWithTx(tx *bolt.Tx, hash cipher.SHA256, ux coin.UxOut) error { - v := encoder.Serialize(ux) - return pl.PutWithTx(tx, hash[:], v) +// adjust adds and removes hashes from an address -> hashes index +// TODO -- if necessary, this can be optimized further to accept multiple addresses at once, +// so that all get queries can be performed before the set +func (p poolAddrIndex) adjust(tx *dbutil.Tx, addr cipher.Address, addHashes, rmHashes []cipher.SHA256) error { + if len(addHashes) == 0 && len(rmHashes) == 0 { + return nil + } + + existingHashes, err := p.get(tx, addr) + if err != nil { + return err + } + + rmHashesMap := make(map[cipher.SHA256]struct{}, len(rmHashes)) + for _, h := range rmHashes { + rmHashesMap[h] = struct{}{} + } + + if len(rmHashesMap) != len(rmHashes) { + return errors.New("poolAddrIndex.adjust: rmHashes contains duplicates") + } + + newHashesSize := len(existingHashes) - len(rmHashes) + if newHashesSize < 0 { + return errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes") + } + + newHashes := make([]cipher.SHA256, 0, newHashesSize) + newHashesMap := make(map[cipher.SHA256]struct{}, newHashesSize) + + rmHashesCount := 0 + for _, h := range existingHashes { + if _, ok := rmHashesMap[h]; ok { + rmHashesCount++ + } else { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } + } + + if rmHashesCount != len(rmHashes) { + return fmt.Errorf("poolAddrIndex.adjust: rmHashes contains %d hashes not indexed for address %s", len(rmHashes)-rmHashesCount, addr.String()) + } + + for _, h := range addHashes { + if _, ok := rmHashesMap[h]; ok { + return errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes") + } + + if _, ok := newHashesMap[h]; !ok { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } else { + return fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", h.Hex(), addr.String()) + } + } + + // Delete the row if hashes is empty, so that the length of the bucket can + // be used to determine the number of addresses with unspents + if len(newHashes) == 0 { + return dbutil.Delete(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + } + + return p.set(tx, addr, newHashes) } -func (pl *pool) deleteWithTx(tx *bolt.Tx, hash cipher.SHA256) error { - return pl.DeleteWithTx(tx, hash[:]) +// Unspents unspent outputs pool +type Unspents struct { + pool *pool + poolAddrIndex *poolAddrIndex + meta *unspentMeta } // NewUnspentPool creates new unspent pool instance -func NewUnspentPool(db *bolt.DB) (*Unspents, error) { - up := &Unspents{db: db} - up.cache.pool = make(map[string]coin.UxOut) +func NewUnspentPool() *Unspents { + return &Unspents{ + pool: &pool{}, + poolAddrIndex: &poolAddrIndex{}, + meta: &unspentMeta{}, + } +} + +// MaybeBuildIndexes builds indexes if necessary +func (up *Unspents) MaybeBuildIndexes(tx *dbutil.Tx, headSeq uint64) error { + logger.Info("Unspents.MaybeBuildIndexes") - pool, err := newPool(db) + // Compare the addrIndexHeight to the head block, + // if not equal, rebuild the address index + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) if err != nil { - return nil, err + return err } - up.pool = pool - meta, err := newUnspentMeta(db) - if err != nil { - return nil, err + if ok && addrIndexHeight == headSeq { + return nil } - up.meta = meta - // load from db - if err := up.syncCache(); err != nil { - return nil, err + if addrIndexHeight > headSeq { + logger.Critical().Warningf("addrIndexHeight > headSeq (%d > %d)", addrIndexHeight, headSeq) } - return up, nil + logger.Infof("Rebuilding unspent_pool_addr_index (addrHeightIndexExists=%v, addrIndexHeight=%d, headSeq=%d)", ok, addrIndexHeight, headSeq) + + return up.buildAddrIndex(tx) } -func (up *Unspents) syncCache() error { - // load unspent outputs - if err := up.pool.ForEach(func(k, v []byte) error { - var hash cipher.SHA256 - copy(hash[:], k[:]) +func (up *Unspents) buildAddrIndex(tx *dbutil.Tx) error { + logger.Info("Building unspent address index") + if err := dbutil.Reset(tx, UnspentPoolAddrIndexBkt); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + var maxBlockSeq uint64 + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { var ux coin.UxOut if err := encoder.DeserializeRaw(v, &ux); err != nil { - return fmt.Errorf("load unspent outputs from db failed: %v", err) + return err + } + + if ux.Head.BkSeq > maxBlockSeq { + maxBlockSeq = ux.Head.BkSeq } - up.cache.pool[hash.Hex()] = ux + h := ux.Hash() + + if bytes.Compare(k[:], h[:]) != 0 { + return errors.New("Unspent pool uxout.Hash() does not match its key") + } + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + return nil }); err != nil { return err } - // load uxhash - uxhash, err := up.getUxHashFromDB() - if err != nil { + if len(addrHashes) == 0 { + logger.Infof("No unspents to index") + return nil + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.set(tx, addr, hashes); err != nil { + return err + } + } + + if err := up.meta.setAddrIndexHeight(tx, maxBlockSeq); err != nil { return err } - up.cache.uxhash = uxhash + logger.Infof("Indexed unspents for %d addresses", len(addrHashes)) + return nil } -// ProcessBlock updates the unspent pool based upon the published block -func (up *Unspents) ProcessBlock(b *coin.SignedBlock) bucket.TxHandler { - return func(tx *bolt.Tx) (bucket.Rollback, error) { - var ( - delUxs []coin.UxOut - addUxs []coin.UxOut - uxHash cipher.SHA256 - oldUxHash = up.cache.uxhash - ) - - for _, txn := range b.Body.Transactions { - // get uxouts that need to be deleted - uxs, err := up.getArray(txn.In) - if err != nil { - return func() {}, err - } +// ProcessBlock adds unspents from a block to the unspent pool +func (up *Unspents) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Gather all transaction inputs + var inputs []cipher.SHA256 + var txnUxs coin.UxArray + for _, txn := range b.Body.Transactions { + inputs = append(inputs, txn.In...) + txnUxs = append(txnUxs, coin.CreateUnspents(b.Head, txn)...) + } - delUxs = append(delUxs, uxs...) + uxs, err := up.GetArray(tx, inputs) + if err != nil { + return err + } - // Remove spent outputs - if _, err = up.deleteWithTx(tx, txn.In); err != nil { - return func() {}, err - } + xorHash, err := up.meta.getXorHash(tx) + if err != nil { + return err + } - // Create new outputs - txUxs := coin.CreateUnspents(b.Head, txn) - addUxs = append(addUxs, txUxs...) - for i := range txUxs { - uxHash, err = up.addWithTx(tx, txUxs[i]) - if err != nil { - return func() {}, err - } - } - } + // Remove spent outputs + rmAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, ux := range uxs { + xorHash = xorHash.Xor(ux.SnapshotHash()) - // update caches - up.Lock() - up.deleteUxFromCache(delUxs) - up.addUxToCache(addUxs) - up.updateUxHashInCache(uxHash) - up.Unlock() - - return func() { - up.Lock() - // reverse the cache - up.deleteUxFromCache(addUxs) - up.addUxToCache(delUxs) - up.updateUxHashInCache(oldUxHash) - up.Unlock() - }, nil - } -} + h := ux.Hash() -func (up *Unspents) addWithTx(tx *bolt.Tx, ux coin.UxOut) (uxhash cipher.SHA256, err error) { - // will rollback all updates if return is not nil - // in case of unexpected panic, we must catch it and return error - defer func() { - if r := recover(); r != nil { - err = fmt.Errorf("unspent pool add uxout failed: %v", err) + if err := up.pool.delete(tx, h); err != nil { + return err } - }() - // check if the uxout does exist in the pool - h := ux.Hash() - if up.Contains(h) { - return cipher.SHA256{}, fmt.Errorf("attemps to insert uxout:%v twice into the unspent pool", h.Hex()) + rmAddrHashes[ux.Body.Address] = append(rmAddrHashes[ux.Body.Address], h) } - xorhash, err := up.meta.getXorHashWithTx(tx) - if err != nil { - return cipher.SHA256{}, err + // Create new outputs + txnUxHashes := make([]cipher.SHA256, len(txnUxs)) + addAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for i, ux := range txnUxs { + h := ux.Hash() + txnUxHashes[i] = h + addAddrHashes[ux.Body.Address] = append(addAddrHashes[ux.Body.Address], h) } - xorhash = xorhash.Xor(ux.SnapshotHash()) - if err := up.meta.setXorHashWithTx(tx, xorhash); err != nil { - return cipher.SHA256{}, err - } - - err = up.pool.setWithTx(tx, h, ux) - if err != nil { - return cipher.SHA256{}, err + // Check that the uxout exists in the pool already, otherwise xorHash will be calculated wrong + for _, h := range txnUxHashes { + if hasKey, err := up.Contains(tx, h); err != nil { + return err + } else if hasKey { + return fmt.Errorf("attempted to insert uxout:%v twice into the unspent pool", h.Hex()) + } } - return xorhash, nil -} + for i, ux := range txnUxs { + // Add new outputs + if err := up.pool.set(tx, txnUxHashes[i], ux); err != nil { + return err + } -func (up *Unspents) deleteUxFromCache(uxs []coin.UxOut) { - for _, ux := range uxs { - delete(up.cache.pool, ux.Hash().Hex()) + // Recalculate xorHash + xorHash = xorHash.Xor(ux.SnapshotHash()) } -} -func (up *Unspents) addUxToCache(uxs []coin.UxOut) { - for i, ux := range uxs { - up.cache.pool[ux.Hash().Hex()] = uxs[i] + // Set xorHash + if err := up.meta.setXorHash(tx, xorHash); err != nil { + return err } -} - -func (up *Unspents) updateUxHashInCache(hash cipher.SHA256) { - up.cache.uxhash = hash -} -// GetArray returns UxOut by given hash array, will return error when -// if any of the hashes do not exist. -// It MUST return this error, to prevent double spend attacks. -func (up *Unspents) GetArray(hashes []cipher.SHA256) (coin.UxArray, error) { - up.Lock() - defer up.Unlock() - return up.getArray(hashes) -} + // Update indexes + for addr, rmHashes := range rmAddrHashes { + addHashes := addAddrHashes[addr] -func (up *Unspents) getArray(hashes []cipher.SHA256) (coin.UxArray, error) { - uxs := make(coin.UxArray, 0, len(hashes)) - for i := range hashes { - ux, ok := up.cache.pool[hashes[i].Hex()] - if !ok { - return nil, NewErrUnspentNotExist(hashes[i].Hex()) + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, rmHashes); err != nil { + return err } - uxs = append(uxs, ux) + delete(addAddrHashes, addr) } - return uxs, nil -} -// Get returns the uxout value of given hash -func (up *Unspents) Get(h cipher.SHA256) (coin.UxOut, bool) { - up.Lock() - ux, ok := up.cache.pool[h.Hex()] - up.Unlock() + for addr, addHashes := range addAddrHashes { + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, nil); err != nil { + return err + } + } - return ux, ok -} + // Check that the addrIndexHeight is incremental + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } -// GetAll returns Pool as an array. Note: they are not in any particular order. -func (up *Unspents) GetAll() (coin.UxArray, error) { - up.Lock() - arr := make(coin.UxArray, 0, len(up.cache.pool)) - for _, ux := range up.cache.pool { - arr = append(arr, ux) + if b.Block.Head.BkSeq == 0 { + if ok { + err := errors.New("addrIndexHeight is set but no block has been indexed yet") + logger.Critical().Error(err.Error()) + return err + } + } else if b.Block.Head.BkSeq != addrIndexHeight+1 { + err := errors.New("unspent pool processing blocks out of order") + logger.Critical().Error(err.Error()) + return err } - up.Unlock() - return arr, nil + // Update the addrIndexHeight + return up.meta.setAddrIndexHeight(tx, b.Block.Head.BkSeq) } -// delete delete unspent of given hashes -func (up *Unspents) deleteWithTx(tx *bolt.Tx, hashes []cipher.SHA256) (cipher.SHA256, error) { - var uxHash cipher.SHA256 - for _, hash := range hashes { - ux, ok, err := up.pool.getWithTx(tx, hash) - if err != nil { - return cipher.SHA256{}, err - } - - if !ok { - continue - } +// GetArray returns UxOut for a set of hashes, will return error if any of the hashes do not exist in the pool. +func (up *Unspents) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + var uxa coin.UxArray - uxHash, err = up.meta.getXorHashWithTx(tx) + for _, h := range hashes { + ux, err := up.pool.get(tx, h) if err != nil { - return cipher.SHA256{}, err + return nil, err + } else if ux == nil { + return nil, NewErrUnspentNotExist(h.Hex()) } - uxHash = uxHash.Xor(ux.SnapshotHash()) + uxa = append(uxa, *ux) + } - // update uxhash - if err = up.meta.setXorHashWithTx(tx, uxHash); err != nil { - return cipher.SHA256{}, err - } + return uxa, nil +} - if err := up.pool.deleteWithTx(tx, hash); err != nil { - return cipher.SHA256{}, err - } - } +// Get returns the uxout value of given hash +func (up *Unspents) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + return up.pool.get(tx, h) +} - return uxHash, nil +// GetAll returns Pool as an array. Note: they are not in any particular order. +func (up *Unspents) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + return up.pool.getAll(tx) } // Len returns the unspent outputs num -func (up *Unspents) Len() uint64 { - up.Lock() - defer up.Unlock() - return uint64(len(up.cache.pool)) +func (up *Unspents) Len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolBkt) } // Contains check if the hash of uxout does exist in the pool -func (up *Unspents) Contains(h cipher.SHA256) bool { - up.Lock() - _, ok := up.cache.pool[h.Hex()] - up.Unlock() - return ok +func (up *Unspents) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnspentPoolBkt, h[:]) } -// GetUnspentsOfAddrs returns unspent outputs map of given addresses, -// the address as return map key, unspent outputs as value. -func (up *Unspents) GetUnspentsOfAddrs(addrs []cipher.Address) coin.AddressUxOuts { - up.Lock() - addrm := make(map[cipher.Address]struct{}, len(addrs)) - for _, a := range addrs { - addrm[a] = struct{}{} - } +// GetUnspentsOfAddrs returns a map of addresses to their unspent outputs +func (up *Unspents) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrUxs := make(coin.AddressUxOuts, len(addrs)) - addrUxs := coin.AddressUxOuts{} - for _, ux := range up.cache.pool { - if _, ok := addrm[ux.Body.Address]; ok { - addrUxs[ux.Body.Address] = append(addrUxs[ux.Body.Address], ux) + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err } + + uxa, err := up.GetArray(tx, hashes) + if err != nil { + switch e := err.(type) { + case ErrUnspentNotExist: + logger.Critical().Errorf("Unspent hash %s indexed under address %s does not exist in unspent pool", e.UxID, addr.String()) + } + return nil, err + } + + addrUxs[addr] = uxa } - up.Unlock() - return addrUxs + + return addrUxs, nil } // GetUxHash returns unspent output checksum for the Block. // Must be called after Block is fully initialized, // and before its outputs are added to the unspent pool -func (up *Unspents) GetUxHash() cipher.SHA256 { - up.Lock() - defer up.Unlock() - return up.cache.uxhash +func (up *Unspents) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return up.meta.getXorHash(tx) } -func (up *Unspents) getUxHashFromDB() (cipher.SHA256, error) { - if v := up.meta.Get(xorhashKey); v != nil { - var hash cipher.SHA256 - copy(hash[:], v[:]) - return hash, nil - } - return cipher.SHA256{}, nil +// AddressCount returns the total number of addresses with unspents +func (up *Unspents) AddressCount(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolAddrIndexBkt) } diff --git a/src/visor/blockdb/unspent_test.go b/src/visor/blockdb/unspent_test.go index c27d3d7..368b758 100755 --- a/src/visor/blockdb/unspent_test.go +++ b/src/visor/blockdb/unspent_test.go @@ -1,132 +1,75 @@ package blockdb import ( + "bytes" "errors" - "testing" - - "github.com/stretchr/testify/require" - "fmt" - + "io" + "io/ioutil" + "os" + "sort" + "testing" "time" "github.com/boltdb/bolt" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -type spending struct { - ToAddr cipher.Address - Coins uint64 -} - func makeUxBody(t *testing.T) coin.UxBody { - body, _ := makeUxBodyWithSecret(t) - return body -} - -func makeUxOut(t *testing.T) coin.UxOut { - ux, _ := makeUxOutWithSecret(t) - return ux -} - -func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { - p, s := cipher.GenerateKeyPair() + p, _ := cipher.GenerateKeyPair() return coin.UxBody{ SrcTransaction: testutil.RandSHA256(t), Address: cipher.AddressFromPubKey(p), Coins: 1e6, Hours: 100, - }, s + } } -func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { - body, sec := makeUxBodyWithSecret(t) +func makeUxOut(t *testing.T) coin.UxOut { + body := makeUxBody(t) return coin.UxOut{ Head: coin.UxHead{ Time: 100, BkSeq: 2, }, Body: body, - }, sec + } } func TestNewUnspentPool(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() - assert.Equal(t, 0, up.pool.Len()) - v := up.meta.Get(xorhashKey) - assert.Nil(t, v) -} + err := db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) -func addUxOut(up *Unspents, ux coin.UxOut) error { - var uxHash cipher.SHA256 - var err error - if err := up.db.Update(func(tx *bolt.Tx) error { - uxHash, err = up.addWithTx(tx, ux) - return err - }); err != nil { - return err - } - up.addUxToCache([]coin.UxOut{ux}) - up.updateUxHashInCache(uxHash) - - return nil -} + h, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, cipher.SHA256{}, h) + return nil -func TestUnspentPoolSyncCache(t *testing.T) { - var uxs coin.UxArray - for i := 0; i < 5; i++ { - ux := makeUxOut(t) - uxs = append(uxs, ux) - } - - db, closedb := testutil.PrepareDB(t) - defer closedb() - - up, err := NewUnspentPool(db) - assert.Nil(t, err) - - for _, ux := range uxs { - assert.Nil(t, addUxOut(up, ux)) - } - - up2, err := NewUnspentPool(db) + }) require.NoError(t, err) - for k, v := range up.cache.pool { - v2, ok := up2.cache.pool[k] - require.True(t, ok) - require.Equal(t, v, v2) - } } -func TestUnspentPoolRemoveUxFromCache(t *testing.T) { - var uxs coin.UxArray - for i := 0; i < 5; i++ { - ux := makeUxOut(t) - uxs = append(uxs, ux) - } - - db, closedb := testutil.PrepareDB(t) - defer closedb() - - up, err := NewUnspentPool(db) - assert.Nil(t, err) - - for _, ux := range uxs { - assert.Nil(t, addUxOut(up, ux)) - } +func addUxOut(db *dbutil.DB, up *Unspents, ux coin.UxOut) error { + return db.Update("", func(tx *dbutil.Tx) error { + if err := up.pool.set(tx, ux.Hash(), ux); err != nil { + return err + } - up.deleteUxFromCache(uxs[:1]) - _, ok := up.cache.pool[uxs[0].Hash().Hex()] - require.False(t, ok) + return up.poolAddrIndex.adjust(tx, ux.Body.Address, []cipher.SHA256{ux.Hash()}, nil) + }) } func TestUnspentPoolGet(t *testing.T) { @@ -140,43 +83,40 @@ func TestUnspentPoolGet(t *testing.T) { name string unspents coin.UxArray hash cipher.SHA256 - ux coin.UxOut - exist bool + ux *coin.UxOut }{ { "not exist", uxs[:2], uxs[2].Hash(), - coin.UxOut{}, - false, + nil, }, { "find one", uxs[:2], uxs[1].Hash(), - uxs[1], - true, + &uxs[1], }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range tc.unspents { - assert.Nil(t, addUxOut(up, ux)) + err := addUxOut(db, up, ux) + require.NoError(t, err) } - ux, ok := up.Get(tc.hash) - assert.Nil(t, err) - if err != nil { - return - } - assert.Equal(t, tc.ux, ux) - assert.Equal(t, tc.exist, ok) + err := db.View("", func(tx *dbutil.Tx) error { + ux, err := up.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.ux, ux) + return nil + }) + require.NoError(t, err) }) } } @@ -188,17 +128,23 @@ func TestUnspentPoolLen(t *testing.T) { uxs = append(uxs, ux) } - db, closedb := testutil.PrepareDB(t) + db, closedb := prepareDB(t) defer closedb() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range uxs { - assert.Nil(t, addUxOut(up, ux)) + err := addUxOut(db, up, ux) + require.NoError(t, err) } - require.Equal(t, uint64(5), up.Len()) + err := db.View("", func(tx *dbutil.Tx) error { + length, err := up.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(5), length) + return nil + }) + require.NoError(t, err) } func TestUnspentPoolGetUxHash(t *testing.T) { @@ -208,36 +154,38 @@ func TestUnspentPoolGetUxHash(t *testing.T) { uxs = append(uxs, ux) } - db, closedb := testutil.PrepareDB(t) + db, closedb := prepareDB(t) defer closedb() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range uxs { - assert.Nil(t, addUxOut(up, ux)) - uxHash := up.GetUxHash() - db.Update(func(tx *bolt.Tx) error { - xorhash, err := up.meta.getXorHashWithTx(tx) + err := addUxOut(db, up, ux) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) require.NoError(t, err) - require.Equal(t, xorhash.Hex(), uxHash.Hex()) + + xorHash, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, xorHash.Hex(), uxHash.Hex()) return nil }) + require.NoError(t, err) } } func TestUnspentPoolGetArray(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() var uxs coin.UxArray for i := 0; i < 5; i++ { ux := makeUxOut(t) - err = addUxOut(up, ux) - assert.Nil(t, err) + err := addUxOut(db, up, ux) + require.NoError(t, err) uxs = append(uxs, ux) } @@ -273,22 +221,19 @@ func TestUnspentPoolGetArray(t *testing.T) { NewErrUnspentNotExist(outsideUx.Hash().Hex()), coin.UxArray{}, }, - { - "get not exist with others that exist", - []cipher.SHA256{uxs[1].Hash(), outsideUx.Hash(), uxs[0].Hash()}, - NewErrUnspentNotExist(outsideUx.Hash().Hex()), - coin.UxArray{}, - }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - uxs, err := up.GetArray(tc.hashes) - assert.Equal(t, tc.err, err) - if err != nil { - return - } - assert.Equal(t, tc.unspents, uxs) + err := db.View("", func(tx *dbutil.Tx) error { + uxs, err := up.GetArray(tx, tc.hashes) + require.Equal(t, tc.err, err) + if err == nil { + require.Equal(t, tc.unspents, uxs) + } + return nil + }) + require.NoError(t, err) }) } } @@ -324,50 +269,56 @@ func TestUnspentPoolGetAll(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range tc.unspents { - assert.Nil(t, addUxOut(up, ux)) + err := addUxOut(db, up, ux) + require.NoError(t, err) } - unspents, err := up.GetAll() - assert.Nil(t, err) - uxm := make(map[cipher.SHA256]byte) - for _, ux := range unspents { - uxm[ux.Hash()] = byte(1) - } + err := db.View("", func(tx *dbutil.Tx) error { + unspents, err := up.GetAll(tx) + require.NoError(t, err) - for _, ux := range tc.expect { - _, ok := uxm[ux.Hash()] - assert.True(t, ok) - } + uxm := make(map[cipher.SHA256]struct{}) + for _, ux := range unspents { + uxm[ux.Hash()] = struct{}{} + } + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + + return nil + }) + require.NoError(t, err) }) } } func BenchmarkUnspentPoolGetAll(b *testing.B) { var t testing.T - db, teardown := testutil.PrepareDB(&t) + db, teardown := prepareDB(&t) defer teardown() - up, err := NewUnspentPool(db) - if err != nil { - b.Fatal(err) - } + up := NewUnspentPool() for i := 0; i < 1000; i++ { ux := makeUxOut(&t) - if err := addUxOut(up, ux); err != nil { + if err := addUxOut(db, up, ux); err != nil { b.Fatal(err) } } start := time.Now() for i := 0; i < b.N; i++ { - _, err = up.GetAll() + err := db.View("", func(tx *dbutil.Tx) error { + _, err := up.GetAll(tx) + return err + }) if err != nil { b.Fatal(err) } @@ -375,97 +326,6 @@ func BenchmarkUnspentPoolGetAll(b *testing.B) { fmt.Println(time.Since(start)) } -func TestUnspentPoolDeleteWithTx(t *testing.T) { - var uxs coin.UxArray - for i := 0; i < 5; i++ { - ux := makeUxOut(t) - uxs = append(uxs, ux) - } - - testCases := []struct { - name string - unspents coin.UxArray - deleteHashes []cipher.SHA256 - error - xorhash cipher.SHA256 - }{ - { - "delete one ok", - uxs[:2], - []cipher.SHA256{uxs[0].Hash()}, - nil, - uxs[1].SnapshotHash(), - }, - { - "delete multilpe ok", - uxs[:3], - []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, - nil, - uxs[2].SnapshotHash(), - }, - { - "delete all ok", - uxs[:3], - []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash(), uxs[2].Hash()}, - nil, - cipher.SHA256{}, - }, - { - "delete middle one", - uxs[:3], - []cipher.SHA256{uxs[1].Hash()}, - nil, - func() cipher.SHA256 { - h := uxs[0].SnapshotHash() - return h.Xor(uxs[2].SnapshotHash()) - }(), - }, - { - "delete unknow hash", - uxs[:2], - []cipher.SHA256{uxs[2].Hash()}, - nil, - func() cipher.SHA256 { - h := uxs[0].SnapshotHash() - return h.Xor(uxs[1].SnapshotHash()) - }(), - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - db, teardown := testutil.PrepareDB(t) - defer teardown() - - up, err := NewUnspentPool(db) - assert.Nil(t, err) - for _, ux := range tc.unspents { - assert.Nil(t, addUxOut(up, ux)) - } - - err = up.db.Update(func(tx *bolt.Tx) error { - if _, err := up.deleteWithTx(tx, tc.deleteHashes); err != nil { - return err - } - - // meta := unspentMeta{tx.Bucket(up.meta.Name)} - xorhash, err := up.meta.getXorHashWithTx(tx) - assert.Nil(t, err) - - assert.Equal(t, tc.xorhash, xorhash) - - for _, hash := range tc.deleteHashes { - _, ok, err := up.pool.getWithTx(tx, hash) - assert.Nil(t, err) - assert.False(t, ok) - } - return nil - }) - assert.Equal(t, tc.error, err) - }) - } -} - func TestGetUnspentOfAddrs(t *testing.T) { var uxs coin.UxArray for i := 0; i < 5; i++ { @@ -482,35 +342,35 @@ func TestGetUnspentOfAddrs(t *testing.T) { expect coin.UxArray }{ { - "one one addr one unspent", - uxs[:], - []cipher.Address{uxs[1].Body.Address}, - uxs[1:2], + name: "one one addr one unspent", + unspents: uxs[:], + addrs: []cipher.Address{uxs[1].Body.Address}, + expect: uxs[1:2], }, { - "one addr two unspents", - uxs[:], - []cipher.Address{uxs[0].Body.Address}, - []coin.UxOut{ + name: "one addr two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address}, + expect: []coin.UxOut{ uxs[0], uxs[4], }, }, { - "two addrs three unspents", - uxs[:], - []cipher.Address{uxs[0].Body.Address, uxs[1].Body.Address}, - []coin.UxOut{ + name: "two addrs three unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ uxs[0], uxs[1], uxs[4], }, }, { - "two addrs two unspents", - uxs[:], - []cipher.Address{uxs[2].Body.Address, uxs[1].Body.Address}, - []coin.UxOut{ + name: "two addrs two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[2].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ uxs[1], uxs[2], }, @@ -519,29 +379,36 @@ func TestGetUnspentOfAddrs(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range tc.unspents { - assert.Nil(t, addUxOut(up, ux)) + err := addUxOut(db, up, ux) + require.NoError(t, err) } - unspents := up.GetUnspentsOfAddrs(tc.addrs) - assert.Nil(t, err) - uxm := make(map[cipher.SHA256]byte, len(unspents)) + var unspents coin.AddressUxOuts + err := db.View("", func(tx *dbutil.Tx) error { + var err error + unspents, err = up.GetUnspentsOfAddrs(tx, tc.addrs) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}, len(unspents)) for _, uxs := range unspents { for _, ux := range uxs { - uxm[ux.Hash()] = byte(1) + uxm[ux.Hash()] = struct{}{} } } - assert.Equal(t, len(uxm), len(tc.expect)) + require.Equal(t, len(uxm), len(tc.expect)) for _, ux := range tc.expect { _, ok := uxm[ux.Hash()] - assert.True(t, ok) + require.True(t, ok) } }) } @@ -554,77 +421,136 @@ func TestUnspentProcessBlock(t *testing.T) { uxs = append(uxs, ux) } + type testOutputs struct { + addr cipher.Address + coins uint64 + hours uint64 + } + + addr := testutil.MakeAddress() + tt := []struct { - name string - init coin.UxArray - inputs coin.UxArray - // rollback bool - err error + name string + init coin.UxArray + inputs coin.UxArray + outputs []testOutputs + nIndexedAddrs uint64 }{ { - "ok", - uxs, - uxs[:1], - // false, - nil, + name: "spend one create one", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6, + hours: uxs[0].Body.Hours / 2, + }, + }, + nIndexedAddrs: 5, }, + { - "rollback", - uxs[1:], - uxs[:1], - // true, - errors.New("rollback"), + name: "spend one create two", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + }, + nIndexedAddrs: 6, + }, + + { + name: "spend one create three - two to the same new address and one to the spending address ", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 16, + }, + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + { + addr: uxs[0].Body.Address, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + }, + nIndexedAddrs: 6, }, } for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { - db, closedb := testutil.PrepareDB(t) + db, closedb := prepareDB(t) defer closedb() - up, err := NewUnspentPool(db) - assert.Nil(t, err) + up := NewUnspentPool() for _, ux := range tc.init { - assert.Nil(t, addUxOut(up, ux)) + err := addUxOut(db, up, ux) + require.NoError(t, err) } - tx := coin.Transaction{} + txn := coin.Transaction{} for _, in := range tc.inputs { - tx.PushInput(in.Hash()) + txn.PushInput(in.Hash()) } - a := testutil.MakeAddress() - tx.PushOutput(a, 1e6, uxs[0].Body.Hours/2) + for _, o := range tc.outputs { + txn.PushOutput(o.addr, o.coins, o.hours) + } - block, err := coin.NewBlock(coin.Block{}, - uint64(time.Now().Unix()), - up.GetUxHash(), - coin.Transactions{tx}, _feeCalc) + var block *coin.Block + var oldUxHash cipher.SHA256 + + err := db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + block, err = coin.NewBlock(coin.Block{}, uint64(time.Now().Unix()), uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + oldUxHash, err = up.GetUxHash(tx) + require.NoError(t, err) + + err = up.ProcessBlock(tx, &coin.SignedBlock{ + Block: *block, + }) + require.NoError(t, err) + + return nil + }) require.NoError(t, err) - txOuts := coin.CreateUnspents(block.Head, tx) - err = db.Update(func(tx *bolt.Tx) error { - oldUxHash := up.GetUxHash() - txHandler := up.ProcessBlock(&coin.SignedBlock{Block: *block}) - rb, err := txHandler(tx) - if err != nil { - rb() - - // new created output should not exist - require.False(t, up.Contains(txOuts[0].Hash())) - require.Equal(t, oldUxHash.Hex(), up.GetUxHash().Hex()) - return errors.New("rollback") - } + txOuts := coin.CreateUnspents(block.Head, txn) + err = db.View("", func(tx *dbutil.Tx) error { // check that the inputs should already been deleted from unspent pool for _, in := range tc.inputs { - _, ok := up.Get(in.Hash()) - require.False(t, ok) + v, err := up.Get(tx, in.Hash()) + require.NoError(t, err) + require.Nil(t, v) } // check the new generate unspent - require.True(t, up.Contains(txOuts[0].Hash())) + hasKey, err := up.Contains(tx, txOuts[0].Hash()) + require.NoError(t, err) + require.True(t, hasKey) // check uxHash for _, in := range tc.inputs { @@ -632,13 +558,560 @@ func TestUnspentProcessBlock(t *testing.T) { } uxHash := oldUxHash.Xor(txOuts[0].SnapshotHash()) - require.Equal(t, uxHash.Hex(), up.GetUxHash().Hex()) + for _, o := range txOuts[1:] { + uxHash = uxHash.Xor(o.SnapshotHash()) + } + + newUxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + require.Equal(t, uxHash.Hex(), newUxHash.Hex()) + + // addr index height should equal the number of blocks added + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(1), addrIndexHeight) + + // addr index should have 5 rows (5 initial addrs, 1 removed as input, 1 added as output) + addrIndexLength, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, tc.nIndexedAddrs, addrIndexLength) + + // new outputs should be added to addr index cache + expectedAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, o := range txOuts { + expectedAddrHashes[o.Body.Address] = append(expectedAddrHashes[o.Body.Address], o.Hash()) + } + + for addr, hashes := range expectedAddrHashes { + addrUxHashes, err := up.poolAddrIndex.get(tx, addr) + require.NoError(t, err) + + require.Equal(t, len(hashes), len(addrUxHashes)) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + sort.Slice(addrUxHashes, func(i, j int) bool { + return bytes.Compare(addrUxHashes[i][:], addrUxHashes[j][:]) < 1 + }) + + require.Equal(t, hashes, addrUxHashes) + } + + // used up inputs should be removed from addr index cache + for _, o := range tc.inputs { + // input addresses that appear in outputs should not be removed + if _, ok := expectedAddrHashes[o.Body.Address]; ok { + continue + } + + addrUxHashes, err := up.poolAddrIndex.get(tx, o.Body.Address) + require.NoError(t, err) + require.Nil(t, addrUxHashes) + } + + // none of the rows in the addr index should have empty arrays of hashes + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + _, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var uxHashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &uxHashes) + require.NoError(t, err) + require.NotEmpty(t, uxHashes) + + return nil + }) + require.NoError(t, err) return nil }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolAddrIndex(t *testing.T) { + addrs := make([]cipher.Address, 10) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 30) + hashesMap := make(map[cipher.SHA256]struct{}) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + _, ok := hashesMap[hashes[i]] + require.False(t, ok) + hashesMap[hashes[i]] = struct{}{} + } + + type addrHashMap map[cipher.Address][]cipher.SHA256 + + copyHashMap := func(hm addrHashMap) addrHashMap { + out := make(addrHashMap, len(hm)) - require.Equal(t, tc.err, err) + for addr, hashes := range hm { + copiedHashes := make([]cipher.SHA256, len(hashes)) + copy(copiedHashes[:], hashes[:]) + out[addr] = copiedHashes + } + + return out + } + + dup := func(h []cipher.SHA256) []cipher.SHA256 { + i := make([]cipher.SHA256, len(h)) + copy(i[:], h[:]) + return i + } + + cases := []struct { + name string + init addrHashMap + add addrHashMap + remove addrHashMap + expect addrHashMap + setErr error + adjustErr error + }{ + { + name: "no initial, add only", + add: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + expect: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + }, + + { + name: "initial, add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:3]), // add one to here + addrs[1]: dup(hashes[3:6]), // remove one from here + addrs[2]: dup(hashes[6:9]), // add and remove one from here + addrs[3]: dup(hashes[9:12]), // remove all from here + addrs[4]: dup(hashes[12:15]), // remove all from here and add one + }, + add: addrHashMap{ + addrs[0]: dup(hashes[16:17]), + addrs[2]: dup(hashes[17:18]), + addrs[4]: dup(hashes[18:19]), + }, + remove: addrHashMap{ + addrs[1]: dup(hashes[4:5]), + addrs[2]: dup(hashes[6:7]), + addrs[3]: dup(hashes[9:12]), + addrs[4]: dup(hashes[12:15]), + }, + expect: addrHashMap{ + addrs[0]: append(dup(hashes[0:3]), dup(hashes[16:17])...), + addrs[1]: append(dup(hashes[3:4]), dup(hashes[5:6])...), + addrs[2]: append(dup(hashes[7:9]), dup(hashes[17:18])...), + addrs[4]: dup(hashes[18:19]), + }, + }, + + { + name: "set error duplicate", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + setErr: errors.New("poolAddrIndex.set: hashes array contains duplicate"), + }, + + { + name: "set error empty array", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{}, + }, + setErr: errors.New("poolAddrIndex.set cannot set to empty hash array"), + }, + + { + name: "adjust error removes have duplicates", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes contains duplicates"), + }, + + { + name: "adjust error removing more than exists", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes"), + }, + + { + name: "adjust error removing hash that does not exist", + init: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[11]}, + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: rmHashes contains 1 hashes not indexed for address %s", addrs[0].String()), + }, + + { + name: "adjust error hash in both add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[1:5]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes"), + }, + + { + name: "adjust error adding hash already indexed", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", hashes[4].Hex(), addrs[0].String()), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + tc.init = copyHashMap(tc.init) + tc.add = copyHashMap(tc.add) + tc.remove = copyHashMap(tc.remove) + tc.expect = copyHashMap(tc.expect) + + p := &poolAddrIndex{} + m := &unspentMeta{} + + // Initialize the data, test that set() works + err := db.Update("", func(tx *dbutil.Tx) error { + for addr, hashes := range tc.init { + if err := p.set(tx, addr, hashes); err != nil { + return err + } + } + + return m.setAddrIndexHeight(tx, uint64(len(tc.init))) + }) + + if tc.setErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.setErr, err) + return + } + + // Check the initialized data, test that get() works + err = db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(len(tc.init)), length) + + height, ok, err := m.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, length, height) + + for addr, expectHashes := range tc.init { + hashes, err := p.get(tx, addr) + require.NoError(t, err) + require.Equal(t, expectHashes, hashes) + } + return nil + }) + require.NoError(t, err) + + // Adjust the data, test that adjust() works + err = db.Update("", func(tx *dbutil.Tx) error { + for addr, addHashes := range tc.add { + rmHashes := tc.remove[addr] + delete(tc.remove, addr) + + err := p.adjust(tx, addr, addHashes, rmHashes) + if err != nil { + return err + } + } + + for addr, rmHashes := range tc.remove { + err := p.adjust(tx, addr, nil, rmHashes) + if err != nil { + return err + } + } + + return nil + }) + + if tc.adjustErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.adjustErr, err) + return + } + + addrHashes := make(addrHashMap) + err = db.View("", func(tx *dbutil.Tx) error { + return dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &hashes) + require.NoError(t, err) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + addrHashes[addr] = hashes + + return nil + }) + }) + require.NoError(t, err) + + for addr, hashes := range tc.expect { + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + tc.expect[addr] = hashes + } + + require.Equal(t, len(tc.expect), len(addrHashes)) + require.Equal(t, tc.expect, addrHashes) }) } +} +func TestUnspentMaybeBuildIndexesNoIndexNoHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 0, nil) +} + +func TestUnspentMaybeBuildIndexesNoIndexHaveHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 10, nil) +} + +func TestUnspentMaybeBuildIndexesPartialIndex(t *testing.T) { + // Test with a database that has an unspent addr index but the height is wrong + headHeight := uint64(3) + testUnspentMaybeBuildIndexes(t, headHeight+1, func(db *dbutil.DB) { + up := NewUnspentPool() + + // Index the first few blocks + err := db.Update("", func(tx *dbutil.Tx) error { + if err := dbutil.CreateBuckets(tx, [][]byte{UnspentPoolAddrIndexBkt}); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRaw(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > headHeight { + return nil + } + + h := ux.Hash() + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.set(tx, addr, hashes); err != nil { + return err + } + } + + return up.meta.setAddrIndexHeight(tx, headHeight) + }) + require.NoError(t, err) + }) +} + +func testUnspentMaybeBuildIndexes(t *testing.T, headIndex uint64, setupDB func(*dbutil.DB)) { + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + if setupDB != nil { + setupDB(db) + } + + u := NewUnspentPool() + + // Create the indexes + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.MaybeBuildIndexes(tx, headIndex) + }) + require.NoError(t, err) + + // Check the address->hashes index + addrHashes := make(map[cipher.Address][]cipher.SHA256) + err = db.View("", func(tx *dbutil.Tx) error { + // Perform the unspent lookup the slow way, to confirm it matches the hashed data + err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + require.NoError(t, err) + + var ux coin.UxOut + err = encoder.DeserializeRaw(v, &ux) + require.NoError(t, err) + + require.Equal(t, hash, ux.Hash()) + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], hash) + + return nil + }) + require.NoError(t, err) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + + require.Equal(t, uint64(len(addrHashes)), length) + + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(180), height) + + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &hashes) + require.NoError(t, err) + + expectedHashes, ok := addrHashes[addr] + require.True(t, ok) + + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 1 + }) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + require.Equal(t, expectedHashes, hashes) + + delete(addrHashes, addr) + + return nil + }) + require.NoError(t, err) + + require.Empty(t, addrHashes) + + return nil + }) + require.NoError(t, err) +} + +func TestUnspentMaybeBuildIndexesNoRebuild(t *testing.T) { + // Set addrIndexHeight to head block height, but don't populate the addr index + // Check that the addr index was not populated, so we know that the index did not get rebuilt if the height matches + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + u := NewUnspentPool() + + // Create the bucket and artifically set the indexed height, without indexing + headSeq := uint64(180) + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.meta.setAddrIndexHeight(tx, headSeq) + }) + require.NoError(t, err) + + // Attempt to build index based upon the headSeq that we set + err = db.Update("", func(tx *dbutil.Tx) error { + return u.MaybeBuildIndexes(tx, headSeq) + }) + require.NoError(t, err) + + // Check that the addr index is still empty, because the height was the same + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, headSeq, height) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func setupNoUnspentAddrIndexDB(t *testing.T) (*dbutil.DB, func()) { + // Open a test database file that lacks UnspentPoolAddrIndexBkt, + // copy it to a temp file and open a database around the temp file + dbFilename := "./testdata/blockchain-180.no-unspent-addr-index.db" + dbFile, err := os.Open(dbFilename) + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + _, err = io.Copy(tmpFile, dbFile) + require.NoError(t, err) + + err = dbFile.Close() + require.NoError(t, err) + + err = tmpFile.Sync() + require.NoError(t, err) + + boltDB, err := bolt.Open(tmpFile.Name(), 0700, nil) + require.NoError(t, err) + + db := dbutil.WrapDB(boltDB) + + return db, func() { + db.Close() + tmpFile.Close() + os.Remove(tmpFile.Name()) + } } diff --git a/src/visor/bucket/bucket.go b/src/visor/bucket/bucket.go deleted file mode 100755 index 1fe0d64..0000000 --- a/src/visor/bucket/bucket.go +++ /dev/null @@ -1,239 +0,0 @@ -package bucket - -import ( - "encoding/binary" - "fmt" - - "github.com/boltdb/bolt" -) - -// Bucket used for grouping the key values in boltdb. -// Also wrap some helper functions. -type Bucket struct { - Name []byte - db *bolt.DB -} - -// New create bucket of specific name. -func New(name []byte, db *bolt.DB) (*Bucket, error) { - if db.IsReadOnly() { - return &Bucket{name, db}, nil - } - - err := db.Update(func(tx *bolt.Tx) error { - if _, err := tx.CreateBucketIfNotExists(name); err != nil { - return err - } - return nil - }) - if err != nil { - return nil, err - } - return &Bucket{name, db}, nil -} - -// Reset resets the bucket -func (b *Bucket) Reset() error { - return b.db.Update(func(tx *bolt.Tx) error { - if err := tx.DeleteBucket(b.Name); err != nil { - return err - } - - _, err := tx.CreateBucketIfNotExists(b.Name) - return err - }) -} - -// Get value of specific key in the bucket. -func (b Bucket) Get(key []byte) []byte { - var value []byte - b.db.View(func(tx *bolt.Tx) error { - value = tx.Bucket(b.Name).Get(key) - return nil - }) - return value -} - -// GetWithTx gets value -func (b Bucket) GetWithTx(tx *bolt.Tx, key []byte) []byte { - return tx.Bucket(b.Name).Get(key) -} - -// GetAll returns all values -func (b *Bucket) GetAll() map[interface{}][]byte { - values := map[interface{}][]byte{} - b.db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket(b.Name) - bkt.ForEach(func(k, v []byte) error { - values[string(k)] = v - return nil - }) - return nil - }) - return values -} - -// GetSlice returns values by key slice -func (b *Bucket) GetSlice(keys [][]byte) [][]byte { - var values [][]byte - b.db.View(func(tx *bolt.Tx) error { - for _, k := range keys { - v := tx.Bucket(b.Name).Get(k) - if v != nil { - values = append(values, v) - } - } - return nil - }) - - return values -} - -// Put key value in the bucket. -func (b Bucket) Put(key []byte, value []byte) error { - return b.db.Update(func(tx *bolt.Tx) error { - return tx.Bucket(b.Name).Put(key, value) - }) -} - -// PutWithTx put key value with bolt.Tx -func (b Bucket) PutWithTx(tx *bolt.Tx, key []byte, value []byte) error { - bkt := tx.Bucket(b.Name) - if bkt == nil { - return fmt.Errorf("bucket %s does not exist", b.Name) - } - - return bkt.Put(key, value) -} - -// Find find value that match the filter in the bucket. -func (b Bucket) Find(filter func(key, value []byte) bool) []byte { - var value []byte - b.db.View(func(tx *bolt.Tx) error { - bt := tx.Bucket(b.Name) - - c := bt.Cursor() - for k, v := c.First(); k != nil; k, v = c.Next() { - if filter(k, v) { - value = v - break - } - } - return nil - }) - return value -} - -// Update use callback func to update the value of given key -func (b *Bucket) Update(key []byte, f func([]byte) ([]byte, error)) error { - return b.db.Update(func(tx *bolt.Tx) error { - // get the value of given key - bkt := tx.Bucket(b.Name) - v, err := f(bkt.Get(key)) - if err != nil { - return err - } - return bkt.Put(key, v) - }) -} - -// Delete removes value of given key -func (b *Bucket) Delete(key []byte) error { - return b.db.Update(func(tx *bolt.Tx) error { - return tx.Bucket(b.Name).Delete(key) - }) -} - -// DeleteWithTx remove from bucket with tx -func (b *Bucket) DeleteWithTx(tx *bolt.Tx, key []byte) error { - bkt := tx.Bucket(b.Name) - if bkt == nil { - return fmt.Errorf("bucket %s doesn't exist", b.Name) - } - - return bkt.Delete(key) -} - -// RangeUpdate updates range of the values -func (b *Bucket) RangeUpdate(f func(k, v []byte) ([]byte, error)) error { - return b.db.Update(func(tx *bolt.Tx) error { - bkt := tx.Bucket(b.Name) - c := bkt.Cursor() - for k, v := c.First(); k != nil; k, v = c.Next() { - v, err := f(k, v) - if err != nil { - return err - } - - if err := bkt.Put(k, v); err != nil { - return err - } - } - return nil - }) -} - -// IsExist check if the value exist of the given key -func (b *Bucket) IsExist(k []byte) bool { - var exist bool - b.db.View(func(tx *bolt.Tx) error { - v := tx.Bucket(b.Name).Get(k) - if v != nil { - exist = true - } - return nil - }) - return exist -} - -// IsEmpty check if the bucket is empty -func (b *Bucket) IsEmpty() bool { - var empty = true - b.db.View(func(tx *bolt.Tx) error { - c := tx.Bucket(b.Name).Cursor() - k, _ := c.First() - if k != nil { - empty = false - } - - return nil - }) - return empty -} - -// ForEach iterate the whole bucket -func (b *Bucket) ForEach(f func(k, v []byte) error) error { - return b.db.View(func(tx *bolt.Tx) error { - return tx.Bucket(b.Name).ForEach(f) - }) -} - -// Len returns the number of key value pairs -func (b *Bucket) Len() (len int) { - b.db.View(func(tx *bolt.Tx) error { - c := tx.Bucket(b.Name).Cursor() - for k, _ := c.First(); k != nil; k, _ = c.Next() { - len++ - } - return nil - }) - return -} - -// Itob converts uint64 to bytes -func Itob(v uint64) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(v)) - return b -} - -// Btoi converts bytes to uint64 -func Btoi(v []byte) uint64 { - return binary.BigEndian.Uint64(v) -} - -// Rollback callback function type -type Rollback func() - -// TxHandler function type for processing bolt transaction -type TxHandler func(tx *bolt.Tx) (Rollback, error) diff --git a/src/visor/bucket/bucket_test.go b/src/visor/bucket/bucket_test.go deleted file mode 100755 index 4c64b69..0000000 --- a/src/visor/bucket/bucket_test.go +++ /dev/null @@ -1,390 +0,0 @@ -package bucket - -import ( - "fmt" - "testing" - - "encoding/json" - - "bytes" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/skycoin/skycoin/src/testutil" -) - -type person struct { - Name string - Age int -} - -func TestBktUpdate(t *testing.T) { - testCases := []struct { - Init map[string]person - UpdateAge map[string]int - }{ - { - map[string]person{ - "1": person{"p1", 10}, - "2": person{"p2", 11}, - }, - map[string]int{ - "1": 20, - "2": 21, - }, - }, - } - - for _, tc := range testCases { - t.Run("", func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - // init value - for k, v := range tc.Init { - d, err := json.Marshal(v) - assert.Nil(t, err) - bkt.Put([]byte(k), d) - } - - // update value - for k, v := range tc.UpdateAge { - err := bkt.Update([]byte(k), func(val []byte) ([]byte, error) { - var p person - if err := json.NewDecoder(bytes.NewReader(val)).Decode(&p); err != nil { - return nil, err - } - p.Age = v - d, err := json.Marshal(p) - if err != nil { - return nil, err - } - return d, nil - }) - assert.Nil(t, err) - } - - // check the updated value - for k, v := range tc.UpdateAge { - val := bkt.Get([]byte(k)) - var p person - err := json.NewDecoder(bytes.NewReader(val)).Decode(&p) - assert.Nil(t, err) - assert.Equal(t, v, p.Age) - } - }) - } -} - -func TestReset(t *testing.T) { - db, cancel := testutil.PrepareDB(t) - defer cancel() - - bkt, err := New([]byte("tete"), db) - assert.Nil(t, err) - - assert.Nil(t, bkt.Put([]byte("k1"), []byte("v1"))) - - assert.Nil(t, bkt.Put([]byte("k2"), []byte("v2"))) - - assert.Equal(t, []byte("v1"), bkt.Get([]byte("k1"))) - assert.Equal(t, []byte("v2"), bkt.Get([]byte("k2"))) - - assert.Nil(t, bkt.Reset()) - - v1 := bkt.Get([]byte("k1")) - if v1 != nil { - t.Fatal("bucket reset failed") - } - - v2 := bkt.Get([]byte("k2")) - if v2 != nil { - t.Fatal("bucket reset failed") - } - -} - -func TestDelete(t *testing.T) { - testCases := []struct { - Name string - Init map[string]string - Del string - Err error - }{ - { - "Delete exist", - map[string]string{ - "a": "1", - "b": "2", - }, - "a", - nil, - }, - { - "Delete none exist", - map[string]string{ - "a": "1", - }, - "b", - nil, - }, - } - for _, tc := range testCases { - t.Run(tc.Name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - for k, v := range tc.Init { - err := bkt.Put([]byte(k), []byte(v)) - assert.Nil(t, err) - } - - err = bkt.Delete([]byte(tc.Del)) - assert.Equal(t, tc.Err, err) - - // check if this value is deleted - v := bkt.Get([]byte(tc.Del)) - assert.Nil(t, v) - }) - } -} - -func TestGetAll(t *testing.T) { - testCases := []struct { - init map[string]string - }{ - { - map[string]string{ - "a": "1", - "b": "2", - "c": "3", - }, - }, - } - - for _, tc := range testCases { - name := fmt.Sprintf("with item num=%v", len(tc.init)) - t.Run(name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - // init bkt - for k, v := range tc.init { - bkt.Put([]byte(k), []byte(v)) - } - - // get all - vs := bkt.GetAll() - for k, v := range vs { - assert.Equal(t, string(v), tc.init[k.(string)]) - } - }) - } -} - -func TestRangeUpdate(t *testing.T) { - testCases := []struct { - init map[string]string - up map[string]string - }{ - { - map[string]string{ - "a": "1", - "b": "2", - "c": "3", - }, - map[string]string{ - "a": "10", - "b": "20", - "c": "30", - }, - }, - } - - for _, tc := range testCases { - name := fmt.Sprintf("with item num=%v", len(tc.up)) - t.Run(name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - for k, v := range tc.init { - bkt.Put([]byte(k), []byte(v)) - } - - // range update - bkt.RangeUpdate(func(k, v []byte) ([]byte, error) { - return []byte(tc.up[string(k)]), nil - }) - - // check if the value has been updated - for k, v := range tc.up { - assert.Equal(t, []byte(v), bkt.Get([]byte(k))) - } - }) - } -} - -func TestIsExsit(t *testing.T) { - testCases := []struct { - init map[string]string - k string - exist bool - }{ - { - map[string]string{ - "a": "1", - "b": "2", - }, - "a", - true, - }, - { - map[string]string{ - "a": "1", - "b": "2", - }, - "b", - true, - }, - { - map[string]string{ - "a": "1", - "b": "2", - }, - "c", - false, - }, - { - map[string]string{}, - "c", - false, - }, - } - - for _, tc := range testCases { - name := fmt.Sprintf("exist=%v", tc.exist) - t.Run(name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - - // init the bucket - for k, v := range tc.init { - bkt.Put([]byte(k), []byte(v)) - } - - assert.Equal(t, tc.exist, bkt.IsExist([]byte(tc.k))) - }) - } -} - -func TestForEach(t *testing.T) { - testCases := []struct { - init map[string]string - }{ - { - map[string]string{ - "a": "1", - "b": "2", - "c": "3", - }, - }, - { - map[string]string{}, - }, - } - for _, tc := range testCases { - name := fmt.Sprintf("with item num=%v", len(tc.init)) - t.Run(name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - // Creates new bucket - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - - // Writes data into the bucket - for k, v := range tc.init { - bkt.Put([]byte(k), []byte(v)) - } - - var count int - bkt.ForEach(func(k, v []byte) error { - count++ - assert.Equal(t, string(v), tc.init[string(k)]) - return nil - }) - - assert.Equal(t, len(tc.init), count) - }) - } -} - -func TestLen(t *testing.T) { - testCases := []struct { - data map[string]string - len int - }{ - { - map[string]string{}, - 0, - }, - { - map[string]string{ - "a": "1", - }, - 1, - }, - { - map[string]string{ - "a": "1", - "b": "2", - "c": "3", - "d": "4", - }, - 4, - }, - } - - for _, tc := range testCases { - name := fmt.Sprintf("len=%v", tc.len) - t.Run(name, func(t *testing.T) { - db, close := testutil.PrepareDB(t) - defer close() - - bkt, err := New([]byte("bkt"), db) - assert.Nil(t, err) - for k, v := range tc.data { - bkt.Put([]byte(k), []byte(v)) - } - - assert.Equal(t, tc.len, bkt.Len()) - }) - } -} - -func TestBucketIsEmpty(t *testing.T) { - db, td := testutil.PrepareDB(t) - defer td() - - bkt, err := New([]byte("bkt1"), db) - require.Nil(t, err) - - require.True(t, bkt.IsEmpty()) - - require.Nil(t, bkt.Put([]byte("k1"), []byte("v1"))) - - require.False(t, bkt.IsEmpty()) - - bkt.Reset() - require.True(t, bkt.IsEmpty()) -} diff --git a/src/visor/daemon_visor_test.go b/src/visor/daemon_visor_test.go new file mode 100755 index 0000000..1e148fb --- /dev/null +++ b/src/visor/daemon_visor_test.go @@ -0,0 +1,168 @@ +package visor + +/* +These are tests that used to be in daemon/visor_test.go, +but belong in package visor instead. + +They have been moved here without checking if they duplicate any +existing test in visor_test.go. + +It is assumed that these tests may provide coverage not present in visor_test.go + +They could be merged into visor_test.go, but for simplicity they were only moved here +*/ + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func setupSimpleVisor(t *testing.T, db *dbutil.DB, bc *Blockchain) *Visor { + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + + pool, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + return &Visor{ + Config: cfg, + Unconfirmed: pool, + Blockchain: bc, + DB: db, + } +} + +func TestVerifyTransactionInvalidFee(t *testing.T) { + // Test that a soft constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) +} + +func TestVerifyTransactionInvalidSignature(t *testing.T) { + // Test that a hard constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Invalidate signatures + txn.Sigs = nil + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectTransaction(txn) + require.Nil(t, softErr) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(errors.New("Invalid number of signatures")).Error()) +} + +func TestInjectValidTransaction(t *testing.T) { + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectTransaction(txn) + require.Nil(t, softErr) + require.NoError(t, err) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 1) + require.Equal(t, txns[0].Txn, txn) +} + +func TestInjectTransactionSoftViolationNoFee(t *testing.T) { + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 1) +} diff --git a/src/visor/db.go b/src/visor/db.go index ec52bfd..e4ad510 100755 --- a/src/visor/db.go +++ b/src/visor/db.go @@ -3,74 +3,215 @@ package visor import ( "crypto/sha1" "encoding/base64" + "errors" "fmt" "io" "os" "path/filepath" + "sync" "time" "github.com/boltdb/bolt" "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" ) -// loadBlockchain loads blockchain from DB and if any error occurs then delete -// the db and create an empty blockchain. -func loadBlockchain(db *bolt.DB, pubkey cipher.PubKey, arbitrating bool) (*bolt.DB, *Blockchain, error) { - logger.Info("Loading blockchain") +var ( + // BlockchainVerifyTheadNum number of goroutines to use for signature and historydb verification + BlockchainVerifyTheadNum = 4 +) + +// ErrCorruptDB is returned if the database is corrupted +// The original corruption error is embedded +type ErrCorruptDB struct { + error +} + +// CheckDatabase checks the database for corruption, rebuild history if corrupted +func CheckDatabase(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) error { + var blocksBktExist bool + db.View("CheckDatabase", func(tx *dbutil.Tx) error { + blocksBktExist = dbutil.Exists(tx, blockdb.BlocksBkt) + return nil + }) - bc, err := NewBlockchain(db, pubkey, Arbitrating(arbitrating)) - if err == nil { - return db, bc, nil + // Don't verify the db if the blocks bucket does not exist + if !blocksBktExist { + return nil } + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return err + } + + history := historydb.New() + indexesMap := historydb.NewIndexesMap() + + var historyVerifyErr error + var lock sync.Mutex + verifyFunc := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Verify signature + if err := bc.VerifySignature(b); err != nil { + return err + } + + // Verify historydb, we don't return the error of history.Verify here, + // as we have to check all signature, if we return error early here, the + // potential bad signature won't be detected. + lock.Lock() + defer lock.Unlock() + if historyVerifyErr == nil { + historyVerifyErr = history.Verify(tx, b, indexesMap) + } + return nil + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, verifyFunc, quit) switch err.(type) { - case blockdb.ErrMissingSignature: + case nil: + lock.Lock() + err = historyVerifyErr + lock.Unlock() + return err default: - return nil, nil, err + return err } +} - // Recreate the block database if ErrMissingSignature occurs - dbPath := db.Path() +// backup the corrypted db first, then rebuild the history DB. +func rebuildHistoryDB(db *dbutil.DB, history *historydb.HistoryDB, bc *Blockchain, quit chan struct{}) (*dbutil.DB, error) { + db, err := backupDB(db) + if err != nil { + return nil, err + } + + if err := db.Update("Rebuild history db", func(tx *dbutil.Tx) error { + if err := history.Erase(tx); err != nil { + return err + } + + headSeq, ok, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if !ok { + return errors.New("head block does not exist") + } + + for i := uint64(0); i <= headSeq; i++ { + select { + case <-quit: + return nil + default: + b, err := bc.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + + if i%1000 == 0 { + logger.Critical().Infof("Parse block: %d", i) + } + } + } + return nil + }); err != nil { + return nil, err + } + return db, nil +} + +// backupDB makes a backup copy of the DB +func backupDB(db *dbutil.DB) (*dbutil.DB, error) { + // backup the corrupted database dbReadOnly := db.IsReadOnly() - logger.Critical().Errorf("Block database signature missing, recreating db: %v", err) + dbPath := db.Path() + if err := db.Close(); err != nil { - return nil, nil, fmt.Errorf("failed to close db: %v", err) + return nil, fmt.Errorf("Failed to close db: %v", err) } - corruptDBPath, err := moveCorruptDB(dbPath) + corruptDBPath, err := copyCorruptDB(dbPath) if err != nil { - return nil, nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) } - logger.Critical().Errorf("Moved corrupted db to %s", corruptDBPath) + logger.Critical().Infof("Copy corrupted db to %s", corruptDBPath) - db, err = OpenDB(dbPath, dbReadOnly) + // Open the database again + return OpenDB(dbPath, dbReadOnly) +} + +// RepairCorruptDB checks the database for corruption and if corrupted and +// is ErrMissingSignature, then then it erases the db and starts over. +// If it's ErrHistoryDBCorrupted, then rebuild historydb from scratch. +// A copy of the corrupted database is saved. +func RepairCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + err := CheckDatabase(db, pubkey, quit) + switch err.(type) { + case nil: + return db, nil + case blockdb.ErrMissingSignature: + logger.Critical().Errorf("Database is corrupted, recreating db: %v", err) + return resetCorruptDB(db) + case historydb.ErrHistoryDBCorrupted: + logger.Critical().Errorf("Database is corrupted, rebuilding db: %v", err) + return rebuildCorruptDB(db, pubkey, quit) + default: + return nil, err + } +} + +func rebuildCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + history := historydb.New() + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) if err != nil { - return nil, nil, err + return nil, err + } + + return rebuildHistoryDB(db, history, bc, quit) +} + +// resetCorruptDB recreates the DB, making a backup copy marked as corrupted +func resetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dbReadOnly := db.IsReadOnly() + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) } - bc, err = NewBlockchain(db, pubkey, Arbitrating(arbitrating)) + corruptDBPath, err := moveCorruptDB(dbPath) if err != nil { - return nil, nil, err + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) } - return db, bc, nil + logger.Critical().Infof("Moved corrupted db to %s", corruptDBPath) + + return OpenDB(dbPath, dbReadOnly) } // OpenDB opens the blockdb -func OpenDB(dbFile string, readOnly bool) (*bolt.DB, error) { +func OpenDB(dbFile string, readOnly bool) (*dbutil.DB, error) { db, err := bolt.Open(dbFile, 0600, &bolt.Options{ - Timeout: 500 * time.Millisecond, + Timeout: 5000 * time.Millisecond, ReadOnly: readOnly, }) if err != nil { return nil, fmt.Errorf("Open boltdb failed, %v", err) } - return db, nil + return dbutil.WrapDB(db), nil } // moveCorruptDB moves a file to makeCorruptDBPath(dbPath) @@ -81,7 +222,39 @@ func moveCorruptDB(dbPath string) (string, error) { } if err := os.Rename(dbPath, newDBPath); err != nil { - logger.Infof("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + logger.Errorf("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + return "", err + } + + return newDBPath, nil +} + +// copyCorruptDB copy a file to makeCorruptDBPath(dbPath) +func copyCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + in, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer in.Close() + + out, err := os.Create(newDBPath) + if err != nil { + return "", err + } + defer out.Close() + logger.Critical().Info(out.Name()) + + _, err = io.Copy(in, out) + if err != nil { + return "", err + } + + if err := out.Close(); err != nil { return "", err } @@ -104,7 +277,7 @@ func makeCorruptDBPath(dbPath string) (string, error) { } // shaFileID return the first 8 bytes of the SHA1 hash of the file, -// base64-encoded +// hex-encoded func shaFileID(dbPath string) (string, error) { fi, err := os.Open(dbPath) if err != nil { @@ -118,7 +291,6 @@ func shaFileID(dbPath string) (string, error) { } sum := h.Sum(nil) - encodedSum := base64.RawStdEncoding.EncodeToString(sum[:8]) - + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) return encodedSum, nil } diff --git a/src/visor/dbutil/dbutil.go b/src/visor/dbutil/dbutil.go new file mode 100755 index 0000000..dbd7782 --- /dev/null +++ b/src/visor/dbutil/dbutil.go @@ -0,0 +1,355 @@ +package dbutil + +import ( + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "runtime/debug" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("dbutil") + txViewLog = false + txViewTrace = false + txUpdateLog = false + txUpdateTrace = false + txDurationLog = true + txDurationReportingThreshold = time.Millisecond * 100 +) + +// Tx wraps a Tx +type Tx struct { + *bolt.Tx +} + +// String is implemented to prevent a panic when mocking methods with *Tx arguments. +// The mock library forces arguments to be printed with %s which causes Tx to panic. +// See https://github.com/stretchr/testify/pull/596 +func (tx *Tx) String() string { + return fmt.Sprintf("%v", tx.Tx) +} + +// DB wraps a bolt.DB to add logging +type DB struct { + ViewLog bool + ViewTrace bool + UpdateLog bool + UpdateTrace bool + DurationLog bool + DurationReportingThreshold time.Duration + + *bolt.DB + + // shutdownLock is added to prevent closing the database while a View transaction is in progress + // bolt.DB will block for Update transactions but not for View transactions, and if + // the database is closed while in a View transaction, it will panic + // This will be fixed in coreos's bbolt after this PR is merged: + // https://github.com/coreos/bbolt/pull/91 + // When coreos has this feature, we can switch to coreos's bbolt and remove this lock + shutdownLock sync.RWMutex +} + +// WrapDB returns WrapDB +func WrapDB(db *bolt.DB) *DB { + return &DB{ + ViewLog: txViewLog, + UpdateLog: txUpdateLog, + ViewTrace: txViewTrace, + UpdateTrace: txUpdateTrace, + DurationLog: txDurationLog, + DurationReportingThreshold: txDurationReportingThreshold, + DB: db, + } +} + +// View wraps *bolt.DB.View to add logging +func (db *DB) View(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.ViewLog { + logger.Debug("db.View [%s] starting", name) + defer logger.Debug("db.View [%s] done", name) + } + if db.ViewTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.View(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.View [%s] elapsed %s", name, delta) + } + + return err +} + +// Update wraps *bolt.DB.Update to add logging +func (db *DB) Update(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.UpdateLog { + logger.Debug("db.Update [%s] starting", name) + defer logger.Debug("db.Update [%s] done", name) + } + if db.UpdateTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.Update(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.Update [%s] elapsed %s", name, delta) + } + + return err +} + +// Close closes the underlying *bolt.DB +func (db *DB) Close() error { + db.shutdownLock.Lock() + defer db.shutdownLock.Unlock() + + return db.DB.Close() +} + +// ErrCreateBucketFailed is returned if creating a bolt.DB bucket fails +type ErrCreateBucketFailed struct { + Bucket string + Err error +} + +func (e ErrCreateBucketFailed) Error() string { + return fmt.Sprintf("Create bucket \"%s\" failed: %v", e.Bucket, e.Err) +} + +// NewErrCreateBucketFailed returns an ErrCreateBucketFailed +func NewErrCreateBucketFailed(bucket []byte, err error) error { + return ErrCreateBucketFailed{ + Bucket: string(bucket), + Err: err, + } +} + +// ErrBucketNotExist is returned if a bolt.DB bucket does not exist +type ErrBucketNotExist struct { + Bucket string +} + +func (e ErrBucketNotExist) Error() string { + return fmt.Sprintf("Bucket \"%s\" doesn't exist", e.Bucket) +} + +// NewErrBucketNotExist returns an ErrBucketNotExist +func NewErrBucketNotExist(bucket []byte) error { + return ErrBucketNotExist{ + Bucket: string(bucket), + } +} + +// CreateBuckets creates multiple buckets +func CreateBuckets(tx *Tx, buckets [][]byte) error { + for _, b := range buckets { + if _, err := tx.CreateBucketIfNotExists(b); err != nil { + return NewErrCreateBucketFailed(b, err) + } + } + + return nil +} + +// GetBucketObjectDecoded returns an encoder-serialized value from a bucket, decoded to an object +func GetBucketObjectDecoded(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := encoder.DeserializeRaw(v, obj); err != nil { + return false, fmt.Errorf("encoder.DeserializeRaw failed: %v", err) + } + + return true, nil +} + +// GetBucketObjectJSON returns a JSON value from a bucket, unmarshaled to an object +func GetBucketObjectJSON(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := json.Unmarshal(v, obj); err != nil { + return false, fmt.Errorf("json.Unmarshal failed: %v", err) + } + + return true, nil +} + +// GetBucketString returns a string value from a bucket +func GetBucketString(tx *Tx, bktName, key []byte) (string, bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return "", false, err + } else if v == nil { + return "", false, nil + } + + return string(v), true, nil +} + +// GetBucketValue returns a []byte value from a bucket +func GetBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + // Bytes returned from boltdb are not valid outside of the transaction + // they are called in, make a copy + w := make([]byte, len(v)) + copy(w[:], v[:]) + + return w, nil +} + +// getBucketValue returns a value from a bucket. If the value does not exist, +// it returns an error of type ErrBucketNotExist +func getBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return nil, NewErrBucketNotExist(bktName) + } + + return bkt.Get(key), nil +} + +// PutBucketValue puts a value into a bucket under key. +func PutBucketValue(tx *Tx, bktName, key, val []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Put(key, val) +} + +// BucketHasKey returns true if a bucket has a non-nil value for a key +func BucketHasKey(tx *Tx, bktName, key []byte) (bool, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return false, NewErrBucketNotExist(bktName) + } + + v := bkt.Get(key) + return v != nil, nil +} + +// NextSequence returns the NextSequence() from the bucket +func NextSequence(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + return bkt.NextSequence() +} + +// ForEach calls ForEach on the bucket +func ForEach(tx *Tx, bktName []byte, f func(k, v []byte) error) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.ForEach(f) +} + +// Delete deletes from a bucket +func Delete(tx *Tx, bktName, key []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Delete(key) +} + +// Len returns the number of keys in a bucket +func Len(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + bstats := bkt.Stats() + + if bstats.KeyN < 0 { + return 0, errors.New("Negative length queried from db stats") + } + + return uint64(bstats.KeyN), nil +} + +// IsEmpty returns true if the bucket is empty +func IsEmpty(tx *Tx, bktName []byte) (bool, error) { + length, err := Len(tx, bktName) + if err != nil { + return false, err + } + return length == 0, nil +} + +// Exists returns true if the bucket exists +func Exists(tx *Tx, bktName []byte) bool { + return tx.Bucket(bktName) != nil +} + +// Reset resets the bucket +func Reset(tx *Tx, bktName []byte) error { + if err := tx.DeleteBucket(bktName); err != nil { + return err + } + + _, err := tx.CreateBucket(bktName) + return err +} + +// Itob converts uint64 to bytes +func Itob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, uint64(v)) + return b +} + +// Btoi converts bytes to uint64 +func Btoi(v []byte) uint64 { + return binary.BigEndian.Uint64(v) +} diff --git a/src/visor/distribution.go b/src/visor/distribution.go index 4541f10..f94c340 100755 --- a/src/visor/distribution.go +++ b/src/visor/distribution.go @@ -4,27 +4,8 @@ import ( "github.com/skycoin/skycoin/src/coin" ) -const ( - // MaxCoinSupply is the maximum supply of skycoins - MaxCoinSupply uint64 = 1e8 // 100,000,000 million - - // DistributionAddressesTotal is the number of distribution addresses - DistributionAddressesTotal uint64 = 100 - - // DistributionAddressInitialBalance is the initial balance of each distribution address - DistributionAddressInitialBalance uint64 = MaxCoinSupply / DistributionAddressesTotal - - // InitialUnlockedCount is the initial number of unlocked addresses - InitialUnlockedCount uint64 = 25 - - // UnlockAddressRate is the number of addresses to unlock per unlock time interval - UnlockAddressRate uint64 = 5 - - // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds - // Once the InitialUnlockedCount is exhausted, - // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval - UnlockTimeInterval uint64 = 60 * 60 * 24 * 365 // 1 year -) +// Note: parameters.go contains many constants used in this file +// they are the ones generated from the fiber config file. func init() { if MaxCoinSupply%DistributionAddressesTotal != 0 { @@ -91,106 +72,3 @@ func TransactionIsLocked(inUxs coin.UxArray) bool { return false } - -var distributionAddresses = [DistributionAddressesTotal]string{ - "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", - "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", - "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", - "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", - "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", - "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", - "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", - "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", - "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", - "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", - "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", - "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", - "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", - "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", - "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", - "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", - "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", - "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", - "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", - "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", - "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", - "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", - "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", - "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", - "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", - "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", - "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", - "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", - "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", - "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", - "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", - "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", - "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", - "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", - "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", - "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", - "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", - "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", - "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", - "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", - "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", - "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", - "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", - "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", - "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", - "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", - "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", - "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", - "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", - "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", - "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", - "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", - "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", - "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", - "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", - "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", - "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", - "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", - "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", - "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", - "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", - "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", - "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", - "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", - "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", - "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", - "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", - "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", - "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", - "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", - "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", - "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", - "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", - "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", - "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", - "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", - "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", - "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", - "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", - "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", - "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", - "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", - "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", - "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", - "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", - "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", - "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", - "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", - "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", - "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", - "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", - "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", - "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", - "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", - "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", - "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", - "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", - "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", - "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", - "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", -} diff --git a/src/visor/historydb/address_txn.go b/src/visor/historydb/address_txn.go index 7388d3e..28f3161 100755 --- a/src/visor/historydb/address_txn.go +++ b/src/visor/historydb/address_txn.go @@ -1,70 +1,38 @@ package historydb import ( - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -var addressTxnsBktName = []byte("address_txns") +// AddressTxnsBkt maps addresses to transaction hashes +var AddressTxnsBkt = []byte("address_txns") // addressTxn buckets for storing address related transactions // address as key, transaction id slice as value -type addressTxns struct { - bkt *bucket.Bucket -} - -func newAddressTxnsBkt(db *bolt.DB) (*addressTxns, error) { - bkt, err := bucket.New(addressTxnsBktName, db) - if err != nil { - return nil, err - } - - return &addressTxns{bkt}, nil -} +type addressTxns struct{} // Get returns the transaction hashes of given address -func (atx *addressTxns) Get(address cipher.Address) ([]cipher.SHA256, error) { +func (atx *addressTxns) Get(tx *dbutil.Tx, address cipher.Address) ([]cipher.SHA256, error) { var txHashes []cipher.SHA256 - v := atx.bkt.Get(address.Bytes()) - if v == nil { - return []cipher.SHA256{}, nil - } - - if err := encoder.DeserializeRaw(v, &txHashes); err != nil { - return []cipher.SHA256{}, err + if ok, err := dbutil.GetBucketObjectDecoded(tx, AddressTxnsBkt, address.Bytes(), &txHashes); err != nil { + return nil, err + } else if !ok { + return nil, nil } return txHashes, nil } -// IsEmpty checks if address transactions bucket is empty -func (atx *addressTxns) IsEmpty() bool { - return atx.bkt.IsEmpty() -} - -// Reset resets the bucket -func (atx *addressTxns) Reset() error { - return atx.bkt.Reset() -} - -func setAddressTxns(bkt *bolt.Bucket, addr cipher.Address, hash cipher.SHA256) error { - // get hashes - addrBytes := addr.Bytes() - v := bkt.Get(addrBytes) - if v == nil { - bin := encoder.Serialize([]cipher.SHA256{hash}) - return bkt.Put(addrBytes, bin) - } - - var hashes []cipher.SHA256 - if err := encoder.DeserializeRaw(v, &hashes); err != nil { +// Add adds a hash to an address's hash list +func (atx *addressTxns) Add(tx *dbutil.Tx, addr cipher.Address, hash cipher.SHA256) error { + hashes, err := atx.Get(tx, addr) + if err != nil { return err } - // check dup + // check for duplicates for _, u := range hashes { if u == hash { return nil @@ -72,6 +40,15 @@ func setAddressTxns(bkt *bolt.Bucket, addr cipher.Address, hash cipher.SHA256) e } hashes = append(hashes, hash) - bin := encoder.Serialize(hashes) - return bkt.Put(addrBytes, bin) + return dbutil.PutBucketValue(tx, AddressTxnsBkt, addr.Bytes(), encoder.Serialize(hashes)) +} + +// IsEmpty checks if address transactions bucket is empty +func (atx *addressTxns) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressTxnsBkt) +} + +// Reset resets the bucket +func (atx *addressTxns) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressTxnsBkt) } diff --git a/src/visor/historydb/address_txn_test.go b/src/visor/historydb/address_txn_test.go index a84cda8..6488d67 100755 --- a/src/visor/historydb/address_txn_test.go +++ b/src/visor/historydb/address_txn_test.go @@ -4,29 +4,12 @@ import ( "fmt" "testing" - "github.com/boltdb/bolt" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/cipher/encoder" - "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -func TestNewAddressTxns(t *testing.T) { - db, td := testutil.PrepareDB(t) - defer td() - - _, err := newAddressTxnsBkt(db) - require.Nil(t, err) - - // the address_txns bucket must be exist - db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket([]byte("address_txns")) - require.NotNil(t, bkt) - return nil - }) -} - func TestAddAddressTxns(t *testing.T) { var preAddrs []cipher.Address var preTxHashes []cipher.SHA256 @@ -120,30 +103,28 @@ func TestAddAddressTxns(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, td := testutil.PrepareDB(t) + db, td := prepareDB(t) defer td() - _, err := newAddressTxnsBkt(db) - require.Nil(t, err) + addrTxns := &addressTxns{} - require.Nil(t, db.Update(func(tx *bolt.Tx) error { - bkt := tx.Bucket(addressTxnsBktName) + err := db.Update("", func(tx *dbutil.Tx) error { for _, pr := range tc.addPairs { - require.Nil(t, setAddressTxns(bkt, pr.addr, pr.txHash)) + err := addrTxns.Add(tx, pr.addr, pr.txHash) + require.NoError(t, err) } return nil - })) + }) + require.NoError(t, err) for _, e := range tc.expect { - db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket(addressTxnsBktName) - v := bkt.Get(e.addr.Bytes()) - require.NotNil(t, v) - var hashes []cipher.SHA256 - require.Nil(t, encoder.DeserializeRaw(v, &hashes)) + err := db.View("", func(tx *dbutil.Tx) error { + hashes, err := addrTxns.Get(tx, e.addr) + require.NoError(t, err) require.Equal(t, e.txs, hashes) return nil }) + require.NoError(t, err) } }) @@ -243,29 +224,30 @@ func TestGetAddressTxns(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, td := testutil.PrepareDB(t) + db, td := prepareDB(t) defer td() - addrTxnsBkt, err := newAddressTxnsBkt(db) - require.Nil(t, err) - - require.Nil(t, db.Update(func(tx *bolt.Tx) error { - bkt := tx.Bucket(addressTxnsBktName) + addrTxns := &addressTxns{} + err := db.Update("", func(tx *dbutil.Tx) error { for _, pr := range tc.addPairs { - if err := setAddressTxns(bkt, pr.addr, pr.txHash); err != nil { - return err - } + err := addrTxns.Add(tx, pr.addr, pr.txHash) + require.NoError(t, err) } return nil - })) + }) + require.NoError(t, err) - for _, e := range tc.expect { - hashes, err := addrTxnsBkt.Get(e.addr) - require.Nil(t, err) - require.Equal(t, e.txs, hashes) - } + err = db.View("", func(tx *dbutil.Tx) error { + for _, e := range tc.expect { + hashes, err := addrTxns.Get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + } + return nil + }) + require.NoError(t, err) }) } diff --git a/src/visor/historydb/address_uxout.go b/src/visor/historydb/address_uxout.go index cb78c20..044d00d 100755 --- a/src/visor/historydb/address_uxout.go +++ b/src/visor/historydb/address_uxout.go @@ -1,53 +1,38 @@ package historydb import ( - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -// bucket for storing address with UxOut, key as address, value as UxOut. -type addressUx struct { - bkt *bucket.Bucket -} - -// create address affected UxOuts bucket. -func newAddressUxBkt(db *bolt.DB) (*addressUx, error) { - bkt, err := bucket.New([]byte("address_in"), db) - if err != nil { - return nil, err - } +// AddressUxBkt maps addresses to unspent outputs +var AddressUxBkt = []byte("address_in") - return &addressUx{bkt}, nil -} +// bucket for storing address with UxOut, key as address, value as UxOut. +type addressUx struct{} // Get return nil on not found. -func (au *addressUx) Get(address cipher.Address) ([]cipher.SHA256, error) { - uxHashes := []cipher.SHA256{} - bin := au.bkt.Get(address.Bytes()) - if bin == nil { - return nil, nil - } - if err := encoder.DeserializeRaw(bin, &uxHashes); err != nil { +func (au *addressUx) Get(tx *dbutil.Tx, address cipher.Address) ([]cipher.SHA256, error) { + var uxHashes []cipher.SHA256 + + if ok, err := dbutil.GetBucketObjectDecoded(tx, AddressUxBkt, address.Bytes(), &uxHashes); err != nil { return nil, err + } else if !ok { + return nil, nil } + return uxHashes, nil } -func (au *addressUx) Add(address cipher.Address, uxHash cipher.SHA256) error { - hashes, err := au.Get(address) +// Add adds a hash to an address's hash list +func (au *addressUx) Add(tx *dbutil.Tx, address cipher.Address, uxHash cipher.SHA256) error { + hashes, err := au.Get(tx, address) if err != nil { return err } - if hashes == nil { - bin := encoder.Serialize([]cipher.SHA256{uxHash}) - return au.bkt.Put(address.Bytes(), bin) - } - - // check dup + // check for duplicate hashes for _, u := range hashes { if u == uxHash { return nil @@ -55,38 +40,15 @@ func (au *addressUx) Add(address cipher.Address, uxHash cipher.SHA256) error { } hashes = append(hashes, uxHash) - bin := encoder.Serialize(hashes) - return au.bkt.Put(address.Bytes(), bin) + return dbutil.PutBucketValue(tx, AddressUxBkt, address.Bytes(), encoder.Serialize(hashes)) } // IsEmpty checks if the addressUx bucket is empty -func (au *addressUx) IsEmpty() bool { - return au.bkt.IsEmpty() +func (au *addressUx) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressUxBkt) } // Reset resets the bucket -func (au *addressUx) Reset() error { - return au.bkt.Reset() -} - -func setAddressUx(bkt *bolt.Bucket, addr cipher.Address, uxHash cipher.SHA256) error { - bin := bkt.Get(addr.Bytes()) - if bin == nil { - return bkt.Put(addr.Bytes(), encoder.Serialize([]cipher.SHA256{uxHash})) - } - - uxHashes := []cipher.SHA256{} - if err := encoder.DeserializeRaw(bin, &uxHashes); err != nil { - return err - } - - // check dup - for _, u := range uxHashes { - if u == uxHash { - return nil - } - } - - uxHashes = append(uxHashes, uxHash) - return bkt.Put(addr.Bytes(), encoder.Serialize(uxHashes)) +func (au *addressUx) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressUxBkt) } diff --git a/src/visor/historydb/history_meta.go b/src/visor/historydb/history_meta.go index 0ea42a9..e6e3b39 100755 --- a/src/visor/historydb/history_meta.go +++ b/src/visor/historydb/history_meta.go @@ -1,60 +1,41 @@ package historydb import ( - "fmt" - - "github.com/boltdb/bolt" - - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var ( - historyMetaBkt = []byte("history_meta") + // HistoryMetaBkt holds history metadata + HistoryMetaBkt = []byte("history_meta") parsedHeightKey = []byte("parsed_height") ) // historyMeta bucket for storing block history meta info -type historyMeta struct { - v *bucket.Bucket -} +type historyMeta struct{} -func newHistoryMeta(db *bolt.DB) (*historyMeta, error) { - bkt, err := bucket.New(historyMetaBkt, db) +// Height returns history parsed block seq +func (hm *historyMeta) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, HistoryMetaBkt, parsedHeightKey) if err != nil { - return nil, err + return 0, false, err + } else if v == nil { + return 0, false, nil } - return &historyMeta{v: bkt}, nil -} -// Height returns history parsed height, if no block was parsed, return -1. -func (hm *historyMeta) ParsedHeight() int64 { - if v := hm.v.Get(parsedHeightKey); v != nil { - return int64(bucket.Btoi(v)) - } - return -1 + return dbutil.Btoi(v), true, nil } -// SetParsedHeight updates history parsed height -func (hm *historyMeta) SetParsedHeight(h uint64) error { - return hm.v.Put(parsedHeightKey, bucket.Itob(h)) -} - -// SetParsedHeightWithTx updates history parsed height with *bolt.Tx -func (hm *historyMeta) SetParsedHeightWithTx(tx *bolt.Tx, h uint64) error { - bkt := tx.Bucket(historyMetaBkt) - if bkt == nil { - return fmt.Errorf("set parsed height failed, bucket: %s does not exist", string(historyMetaBkt)) - } - - return bkt.Put(parsedHeightKey, bucket.Itob(h)) +// SetParsedHeight updates history parsed block seq +func (hm *historyMeta) SetParsedBlockSeq(tx *dbutil.Tx, h uint64) error { + return dbutil.PutBucketValue(tx, HistoryMetaBkt, parsedHeightKey, dbutil.Itob(h)) } // IsEmpty checks if history meta bucket is empty -func (hm *historyMeta) IsEmpty() bool { - return hm.v.IsEmpty() +func (hm *historyMeta) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, HistoryMetaBkt) } // Reset resets the bucket -func (hm *historyMeta) Reset() error { - return hm.v.Reset() +func (hm *historyMeta) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, HistoryMetaBkt) } diff --git a/src/visor/historydb/history_meta_test.go b/src/visor/historydb/history_meta_test.go index 3116990..3f42c85 100755 --- a/src/visor/historydb/history_meta_test.go +++ b/src/visor/historydb/history_meta_test.go @@ -3,52 +3,56 @@ package historydb import ( "testing" - "github.com/boltdb/bolt" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" - "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) -func TestNewHistoryMeta(t *testing.T) { - db, td := testutil.PrepareDB(t) +func TestHistoryMetaGetSetParsedHeight(t *testing.T) { + db, td := prepareDB(t) defer td() - hm, err := newHistoryMeta(db) - assert.Nil(t, err) - db.View(func(tx *bolt.Tx) error { - bkt := tx.Bucket([]byte("history_meta")) - assert.NotNil(t, bkt) - return nil - }) - - v := hm.v.Get(parsedHeightKey) - assert.Nil(t, v) -} - -func TestHistoryMetaGetParsedHeight(t *testing.T) { - db, td := testutil.PrepareDB(t) - defer td() - - hm, err := newHistoryMeta(db) - assert.Nil(t, err) - - assert.Equal(t, int64(-1), hm.ParsedHeight()) + hm := &historyMeta{} - assert.Nil(t, hm.v.Put(parsedHeightKey, bucket.Itob(10))) - assert.Equal(t, int64(10), hm.ParsedHeight()) -} + err := db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.False(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) -func TestHistoryMetaSetParsedHeight(t *testing.T) { - db, td := testutil.PrepareDB(t) - defer td() + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.SetParsedBlockSeq(tx, 10) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(10), height) + return err + }) + require.NoError(t, err) - hm, err := newHistoryMeta(db) - assert.Nil(t, err) - assert.Nil(t, hm.SetParsedHeight(0)) - assert.Equal(t, uint64(0), bucket.Btoi(hm.v.Get(parsedHeightKey))) + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.SetParsedBlockSeq(tx, 0) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) - // set 10 - hm.SetParsedHeight(10) - assert.Equal(t, uint64(10), bucket.Btoi(hm.v.Get(parsedHeightKey))) } diff --git a/src/visor/historydb/historydb.go b/src/visor/historydb/historydb.go index 8448f53..c3061c6 100755 --- a/src/visor/historydb/historydb.go +++ b/src/visor/historydb/historydb.go @@ -4,225 +4,374 @@ package historydb import ( "errors" - - "github.com/boltdb/bolt" + "fmt" + "sync" "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" ) var logger = logging.MustGetLogger("historydb") -// Blockchainer interface for isolating the detail of blockchain. -type Blockchainer interface { - Head() *coin.Block - GetBlockInDepth(dep uint64) *coin.Block - ExecuteBlock(b *coin.Block) (coin.UxArray, error) - CreateGenesisBlock(genAddress cipher.Address, genCoins, timestamp uint64) coin.Block - GetBlock(hash cipher.SHA256) *coin.Block +// CreateBuckets creates bolt.DB buckets used by the historydb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + AddressTxnsBkt, + AddressUxBkt, + HistoryMetaBkt, + UxOutsBkt, + TransactionsBkt, + }) } -// HistoryDB provides apis for blockchain explorer. +// HistoryDB provides APIs for blockchain explorer type HistoryDB struct { - db *bolt.DB // bolt db instance. - txns *transactions // transactions bucket. - outputs *UxOuts // outputs bucket. - addrUx *addressUx // bucket which stores all UxOuts that address recved. - addrTxns *addressTxns // address related transaction bucket + txns *transactions // transactions bucket + outputs *UxOuts // outputs bucket + addrUx *addressUx // bucket which stores all UxOuts that address received + addrTxns *addressTxns // address related transaction bucket *historyMeta // stores history meta info } -// New create historydb instance and create corresponding buckets if does not exist. -func New(db *bolt.DB) (*HistoryDB, error) { - hd := HistoryDB{db: db} - var err error - - hd.txns, err = newTransactionsBkt(db) - if err != nil { - return nil, err +// New create HistoryDB instance +func New() *HistoryDB { + return &HistoryDB{ + outputs: &UxOuts{}, + txns: &transactions{}, + addrUx: &addressUx{}, + addrTxns: &addressTxns{}, } +} - // create the output instance - hd.outputs, err = newOutputsBkt(db) +// NeedsReset checks if need to reset the parsed block history, +// If we have a new added bucket, we need to reset to parse +// blockchain again to get the new bucket filled. +func (hd *HistoryDB) NeedsReset(tx *dbutil.Tx) (bool, error) { + _, ok, err := hd.historyMeta.ParsedBlockSeq(tx) if err != nil { - return nil, err + return false, err + } else if !ok { + return true, nil } - // create the toAddressTx instance. - hd.addrUx, err = newAddressUxBkt(db) + // if any of the following buckets are empty, need to reset + addrTxnsEmpty, err := hd.addrTxns.IsEmpty(tx) if err != nil { - return nil, err + return false, err } - hd.historyMeta, err = newHistoryMeta(db) + addrUxEmpty, err := hd.addrUx.IsEmpty(tx) if err != nil { - return nil, err + return false, err } - hd.addrTxns, err = newAddressTxnsBkt(db) + txnsEmpty, err := hd.txns.IsEmpty(tx) if err != nil { - return nil, err + return false, err } - return &hd, nil -} - -// ResetIfNeed checks if need to reset the parsed block history, -// If we have a new added bucket, we need to reset to parse -// blockchain again to get the new bucket filled. -func (hd *HistoryDB) ResetIfNeed() error { - if hd.historyMeta.ParsedHeight() == 0 { - return nil + outputsEmpty, err := hd.outputs.IsEmpty(tx) + if err != nil { + return false, err } - // if any of the following buckets are empty, need to reset - if hd.addrTxns.IsEmpty() || - hd.addrUx.IsEmpty() || - hd.txns.IsEmpty() || - hd.outputs.IsEmpty() { - return hd.reset() + if addrTxnsEmpty || addrUxEmpty || txnsEmpty || outputsEmpty { + return true, nil } - return nil + return false, nil } -func (hd *HistoryDB) reset() error { - logger.Info("History db reset") - if err := hd.addrTxns.Reset(); err != nil { +// Erase erases the entire HistoryDB +func (hd *HistoryDB) Erase(tx *dbutil.Tx) error { + logger.Debug("HistoryDB.reset") + if err := hd.addrTxns.Reset(tx); err != nil { return err } - if err := hd.addrUx.Reset(); err != nil { + if err := hd.addrUx.Reset(tx); err != nil { return err } - if err := hd.outputs.Reset(); err != nil { + if err := hd.outputs.Reset(tx); err != nil { return err } - if err := hd.historyMeta.Reset(); err != nil { + if err := hd.historyMeta.Reset(tx); err != nil { return err } - return hd.txns.Reset() + return hd.txns.Reset(tx) } -// GetUxout get UxOut of specific uxID. -func (hd *HistoryDB) GetUxout(uxID cipher.SHA256) (*UxOut, error) { - return hd.outputs.Get(uxID) +// GetUxOuts get UxOut of specific uxIDs. +func (hd *HistoryDB) GetUxOuts(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]*UxOut, error) { + return hd.outputs.GetArray(tx, uxIDs) } -// ParseBlock will index the transaction, outputs,etc. -func (hd *HistoryDB) ParseBlock(b *coin.Block) error { - if b == nil { - return errors.New("process nil block") - } +// ParseBlock builds indexes out of the block data +func (hd *HistoryDB) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + for _, t := range b.Body.Transactions { + txn := Transaction{ + Tx: t, + BlockSeq: b.Seq(), + } - // index the transactions - return hd.db.Update(func(tx *bolt.Tx) error { - // all updates will rollback if return error is not nil - for _, t := range b.Body.Transactions { - txn := Transaction{ - Tx: t, - BlockSeq: b.Seq(), + if err := hd.txns.Add(tx, &txn); err != nil { + return err + } + + for _, in := range t.In { + o, err := hd.outputs.Get(tx, in) + if err != nil { + return err } - txnsBkt := tx.Bucket(hd.txns.bkt.Name) - outputsBkt := tx.Bucket(hd.outputs.bkt.Name) - addrUxBkt := tx.Bucket(hd.addrUx.bkt.Name) - addrTxnsBkt := tx.Bucket(hd.addrTxns.bkt.Name) + if o == nil { + return errors.New("HistoryDB.ParseBlock: transaction input not found in outputs bucket") + } - if err := addTransaction(txnsBkt, &txn); err != nil { + // update the output's spent block seq and txid + o.SpentBlockSeq = b.Seq() + o.SpentTxID = t.Hash() + if err := hd.outputs.Set(tx, *o); err != nil { return err } - // handle tx in, genesis transaction's vin is empty, so should be ignored. - if b.Seq() > 0 { - for _, in := range t.In { - o, err := getOutput(outputsBkt, in) - if err != nil { - return err - } - // update output's spent block seq and txid. - o.SpentBlockSeq = b.Seq() - o.SpentTxID = t.Hash() - if err := setOutput(outputsBkt, *o); err != nil { - return err - } - - // store the IN address with txid - if err := setAddressTxns(addrTxnsBkt, o.Out.Body.Address, t.Hash()); err != nil { - return err - } - } + // store the IN address with txid + if err := hd.addrTxns.Add(tx, o.Out.Body.Address, t.Hash()); err != nil { + return err } + } - // handle the tx out - uxArray := coin.CreateUnspents(b.Head, t) - for _, ux := range uxArray { - uxOut := UxOut{ - Out: ux, - } - if err := setOutput(outputsBkt, uxOut); err != nil { - return err - } + // handle the tx out + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + if err := hd.outputs.Set(tx, UxOut{ + Out: ux, + }); err != nil { + return err + } - if err := setAddressUx(addrUxBkt, ux.Body.Address, ux.Hash()); err != nil { - return err - } + if err := hd.addrUx.Add(tx, ux.Body.Address, ux.Hash()); err != nil { + return err + } - if err := setAddressTxns(addrTxnsBkt, ux.Body.Address, t.Hash()); err != nil { - return err - } + if err := hd.addrTxns.Add(tx, ux.Body.Address, t.Hash()); err != nil { + return err } } + } - return hd.SetParsedHeightWithTx(tx, b.Seq()) - }) + return hd.SetParsedBlockSeq(tx, b.Seq()) } // GetTransaction get transaction by hash. -func (hd HistoryDB) GetTransaction(hash cipher.SHA256) (*Transaction, error) { - return hd.txns.Get(hash) +func (hd HistoryDB) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + return hd.txns.Get(tx, hash) } // GetAddrUxOuts get all uxout that the address affected. -func (hd HistoryDB) GetAddrUxOuts(address cipher.Address) ([]*UxOut, error) { - hashes, err := hd.addrUx.Get(address) +func (hd HistoryDB) GetAddrUxOuts(tx *dbutil.Tx, address cipher.Address) ([]*UxOut, error) { + hashes, err := hd.addrUx.Get(tx, address) if err != nil { - return []*UxOut{}, err - } - uxOuts := make([]*UxOut, len(hashes)) - for i, hash := range hashes { - ux, err := hd.outputs.Get(hash) - if err != nil { - return []*UxOut{}, err - } - uxOuts[i] = ux + return nil, err } - return uxOuts, nil + + return hd.outputs.GetArray(tx, hashes) } -// GetAddrTxns returns all the address related transactions -func (hd HistoryDB) GetAddrTxns(address cipher.Address) ([]Transaction, error) { - hashes, err := hd.addrTxns.Get(address) +// GetAddressTxns returns all the address related transactions +func (hd HistoryDB) GetAddressTxns(tx *dbutil.Tx, address cipher.Address) ([]Transaction, error) { + hashes, err := hd.addrTxns.Get(tx, address) if err != nil { - return []Transaction{}, err + return nil, err } - return hd.txns.GetSlice(hashes) + return hd.txns.GetSlice(tx, hashes) +} + +// ForEachTxn traverses the transactions bucket +func (hd HistoryDB) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return hd.txns.ForEach(tx, f) +} + +// IndexesMap is a goroutine safe address indexes map +type IndexesMap struct { + value map[cipher.Address]AddressIndexes + lock sync.RWMutex +} + +// NewIndexesMap creates a IndexesMap instance +func NewIndexesMap() *IndexesMap { + return &IndexesMap{ + value: make(map[cipher.Address]AddressIndexes), + } } -// ForEach traverses the transactions in db -func (hd HistoryDB) ForEach(f func(tx *Transaction) error) error { - return hd.txns.bkt.ForEach(func(k []byte, v []byte) error { - var tx Transaction - if err := encoder.DeserializeRaw(v, &tx); err != nil { +// Load returns value of given key +func (im *IndexesMap) Load(address cipher.Address) (AddressIndexes, bool) { + im.lock.RLock() + v, ok := im.value[address] + im.lock.RUnlock() + return v, ok +} + +// Store saves address with indexes +func (im *IndexesMap) Store(address cipher.Address, indexes AddressIndexes) { + im.lock.Lock() + im.value[address] = indexes + im.lock.Unlock() +} + +// AddressIndexes represents the address indexes struct +type AddressIndexes struct { + TxnHashes map[cipher.SHA256]struct{} + UxHashes map[cipher.SHA256]struct{} +} + +// Verify checks if the historydb is corrupted +func (hd HistoryDB) Verify(tx *dbutil.Tx, b *coin.SignedBlock, indexesMap *IndexesMap) error { + for _, t := range b.Body.Transactions { + txnHash := t.Hash() + txn, err := hd.txns.Get(tx, txnHash) + if err != nil { return err } - return f(&tx) - }) + if txn == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction %v does not exist in historydb", txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + for _, in := range t.In { + // Checks the existence of transaction input + o, err := hd.outputs.Get(tx, in) + if err != nil { + return err + } + + if o == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction input %v does not exist in historydb", in.Hex()) + return ErrHistoryDBCorrupted{err} + } + + // Checks the output's spend block seq + if o.SpentBlockSeq != b.Seq() { + err := fmt.Errorf("HistoryDB.Verify: spend block seq of transaction input %v is wrong, should be: %v, but is %v", + in.Hex(), b.Seq(), o.SpentBlockSeq) + return ErrHistoryDBCorrupted{err} + } + + addr := o.Out.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + + // Checks if the address indexes already loaded into memory + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + if _, ok := uxHashesMap[in]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address uxout [%s:%s] does not exist in historydb", + addr, in.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + + // Checks the transaction outs + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + uxHash := ux.Hash() + out, err := hd.outputs.Get(tx, uxHash) + if err != nil { + return err + } + + if out == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction output %s does not exist in historydb", uxHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + addr := ux.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.Get(tx, addr) + if err != nil { + return err + } + + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + } + return nil +} + +// ErrHistoryDBCorrupted is returned when found the historydb is corrupted +type ErrHistoryDBCorrupted struct { + error +} + +// NewErrHistoryDBCorrupted is for user to be able to create ErrHistoryDBCorrupted instance +// outside of the package +func NewErrHistoryDBCorrupted(err error) ErrHistoryDBCorrupted { + return ErrHistoryDBCorrupted{err} } diff --git a/src/visor/historydb/historydb_test.go b/src/visor/historydb/historydb_test.go index 7360574..29940e4 100755 --- a/src/visor/historydb/historydb_test.go +++ b/src/visor/historydb/historydb_test.go @@ -3,44 +3,46 @@ package historydb import ( "errors" "fmt" + "log" "math/rand" "testing" "time" - "github.com/boltdb/bolt" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" - "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" - "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" ) +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + var ( genPublic, genSecret = cipher.GenerateKeyPair() genAddress = cipher.AddressFromPubKey(genPublic) - transactionBkt = []byte("transactions") - outputBkt = []byte("uxouts") - addressInBkt = []byte("address_in") - log = logging.MustGetLogger("historydb_test") ) -var _genTime uint64 = 1000 -var _incTime uint64 = 3600 * 1000 -var _genCoins uint64 = 1000e6 +var genTime uint64 = 1000 +var incTime uint64 = 3600 * 1000 +var genCoins uint64 = 1000e6 -func _feeCalc(t *coin.Transaction) (uint64, error) { +func feeCalc(t *coin.Transaction) (uint64, error) { return 0, nil } -func _makeFeeCalc(fee uint64) coin.FeeCalculator { - return func(t *coin.Transaction) (uint64, error) { - return fee, nil - } -} - // set rand seed. var _ = func() int64 { t := time.Now().Unix() @@ -48,13 +50,23 @@ var _ = func() int64 { return t }() +// Blockchainer interface for isolating the detail of blockchain. +type Blockchainer interface { + Head() *coin.Block + GetBlockInDepth(dep uint64) *coin.Block + ExecuteBlock(b *coin.Block) (coin.UxArray, error) + CreateGenesisBlock(genAddress cipher.Address, genCoins, timestamp uint64) coin.Block + VerifyTransaction(tx coin.Transaction) error + GetBlock(hash cipher.SHA256) *coin.Block +} + type fakeBlockchain struct { blocks []coin.Block unspent map[string]coin.UxOut uxhash cipher.SHA256 } -func newBlockchain(db *bolt.DB) *fakeBlockchain { +func newBlockchain() *fakeBlockchain { return &fakeBlockchain{ unspent: make(map[string]coin.UxOut), } @@ -166,33 +178,29 @@ func (fbc fakeBlockchain) GetBlock(hash cipher.SHA256) *coin.Block { } func TestProcessGenesisBlock(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - bc := newBlockchain(db) - gb := bc.CreateGenesisBlock(genAddress, _genCoins, _genTime) - hisDB, err := New(db) - if err != nil { - t.Fatal(err) - } + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + hisDB := New() - if err := hisDB.ParseBlock(&gb); err != nil { - t.Fatal(err) - } + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) // check transactions bucket. var tx Transaction txHash := gb.Body.Transactions[0].Hash() - if err := getBucketValue(db, transactionBkt, txHash[:], &tx); err != nil { - t.Fatal(err) - } - assert.Equal(t, tx.Tx, gb.Body.Transactions[0]) + mustGetBucketValue(t, db, TransactionsBkt, txHash[:], &tx) + require.Equal(t, tx.Tx, gb.Body.Transactions[0]) // check address in outID := []cipher.SHA256{} - if err := getBucketValue(db, addressInBkt, genAddress.Bytes(), &outID); err != nil { - t.Fatal(err) - } + mustGetBucketValue(t, db, AddressUxBkt, genAddress.Bytes(), &outID) ux, ok := bc.unspent[outID[0].Hex()] require.True(t, ok) @@ -200,10 +208,9 @@ func TestProcessGenesisBlock(t *testing.T) { // check outputs output := UxOut{} - err = getBucketValue(db, outputBkt, outID[0][:], &output) - require.Nil(t, err) + mustGetBucketValue(t, db, UxOutsBkt, outID[0][:], &output) - assert.Equal(t, output.Out, ux) + require.Equal(t, output.Out, ux) } type testData struct { @@ -232,10 +239,12 @@ func getUx(bc Blockchainer, seq uint64, txID cipher.SHA256, addr string) (*coin. if b == nil { return nil, fmt.Errorf("no block in depth:%v", seq) } + tx, ok := b.GetTransaction(txID) if !ok { return nil, errors.New("found transaction failed") } + uxs := coin.CreateUnspents(b.Head, tx) for _, u := range uxs { if u.Body.Address.String() == addr { @@ -246,26 +255,26 @@ func getUx(bc Blockchainer, seq uint64, txID cipher.SHA256, addr string) (*coin. } func TestProcessBlock(t *testing.T) { - db, teardown := testutil.PrepareDB(t) + db, teardown := prepareDB(t) defer teardown() - bc := newBlockchain(db) - gb := bc.CreateGenesisBlock(genAddress, _genCoins, _genTime) + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) // create - hisDB, err := New(db) - if err != nil { - t.Fatal(err) - } + hisDB := New() - if err := hisDB.ParseBlock(&gb); err != nil { - t.Fatal(err) - } + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) /* - |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS - genesisAddr ==>| |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS - |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm ==>| - |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm + |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + genesisAddr ==>| |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm ==>| + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm */ testData := []testData{ { @@ -284,7 +293,7 @@ func TestProcessBlock(t *testing.T) { }, { ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", - Coins: _genCoins - 10e6, + Coins: genCoins - 10e6, Hours: 400, }, }, @@ -327,12 +336,11 @@ func TestProcessBlock(t *testing.T) { testEngine(t, testData, bc, hisDB, db) } -func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB, db *bolt.DB) { +func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB, db *dbutil.DB) { for i, td := range tds { - b, tx, err := addBlock(bc, td, _incTime*(uint64(i)+1)) - if err != nil { - t.Fatal(err) - } + b, tx, err := addBlock(bc, td, incTime*(uint64(i)+1)) + require.NoError(t, err) + // update the next block test data. if i+1 < len(tds) { // update UxOut of next test data. @@ -340,47 +348,42 @@ func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB tds[i+1].PreBlockHash = b.HashHeader() } - if err := hdb.ParseBlock(b); err != nil { - t.Fatal(err) - } + err = db.Update("", func(tx *dbutil.Tx) error { + err := hdb.ParseBlock(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) // check tx txInBkt := Transaction{} k := tx.Hash() - if err := getBucketValue(db, transactionBkt, k[:], &txInBkt); err != nil { - t.Fatal(err) - } - assert.Equal(t, &txInBkt.Tx, tx) + mustGetBucketValue(t, db, TransactionsBkt, k[:], &txInBkt) + require.Equal(t, &txInBkt.Tx, tx) // check outputs for _, o := range td.Vouts { ux, err := getUx(bc, uint64(i+1), tx.Hash(), o.ToAddr) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) uxInDB := UxOut{} uxKey := ux.Hash() - if err = getBucketValue(db, outputBkt, uxKey[:], &uxInDB); err != nil { - t.Fatal(err) - } - assert.Equal(t, &uxInDB.Out, ux) + mustGetBucketValue(t, db, UxOutsBkt, uxKey[:], &uxInDB) + require.Equal(t, &uxInDB.Out, ux) } // check addr in for _, o := range td.Vouts { addr := cipher.MustDecodeBase58Address(o.ToAddr) uxHashes := []cipher.SHA256{} - if err := getBucketValue(db, addressInBkt, addr.Bytes(), &uxHashes); err != nil { - t.Fatal(err) - } - assert.Equal(t, len(uxHashes), td.AddrInNum[o.ToAddr]) + mustGetBucketValue(t, db, AddressUxBkt, addr.Bytes(), &uxHashes) + require.Equal(t, len(uxHashes), td.AddrInNum[o.ToAddr]) } } } func addBlock(bc *fakeBlockchain, td testData, tm uint64) (*coin.Block, *coin.Transaction, error) { - tx := coin.Transaction{} + txn := coin.Transaction{} // get unspent output ux, err := getUx(bc, td.Vin.BlockSeq, td.Vin.TxID, td.Vin.Addr) if err != nil { @@ -390,42 +393,40 @@ func addBlock(bc *fakeBlockchain, td testData, tm uint64) (*coin.Block, *coin.Tr return nil, nil, errors.New("no unspent output") } - tx.PushInput(ux.Hash()) + txn.PushInput(ux.Hash()) for _, o := range td.Vouts { addr, err := cipher.DecodeBase58Address(o.ToAddr) if err != nil { return nil, nil, err } - tx.PushOutput(addr, o.Coins, o.Hours) + txn.PushOutput(addr, o.Coins, o.Hours) } sigKey := cipher.MustSecKeyFromHex(td.Vin.SigKey) - tx.SignInputs([]cipher.SecKey{sigKey}) - tx.UpdateHeader() - if err := bc.VerifyTransaction(tx); err != nil { + txn.SignInputs([]cipher.SecKey{sigKey}) + txn.UpdateHeader() + if err := bc.VerifyTransaction(txn); err != nil { return nil, nil, err } preBlock := bc.GetBlock(td.PreBlockHash) - b := newBlock(*preBlock, tm, bc.uxhash, coin.Transactions{tx}, _feeCalc) + b := newBlock(*preBlock, tm, bc.uxhash, coin.Transactions{txn}, feeCalc) // uxs, err := bc.ExecuteBlock(&b) _, err = bc.ExecuteBlock(&b) if err != nil { return nil, nil, err } - return &b, &tx, nil + return &b, &txn, nil } -func getBucketValue(db *bolt.DB, name []byte, key []byte, value interface{}) error { - return db.View(func(tx *bolt.Tx) error { - b := tx.Bucket(name) - bin := b.Get(key) - if bin == nil { - value = nil - return nil - } - return encoder.DeserializeRaw(bin, value) +func mustGetBucketValue(t *testing.T, db *dbutil.DB, name []byte, key []byte, value interface{}) { + err := db.View("", func(tx *dbutil.Tx) error { + ok, err := dbutil.GetBucketObjectDecoded(tx, name, key, value) + require.NoError(t, err) + require.True(t, ok) + return err }) + require.NoError(t, err) } func newBlock(prev coin.Block, currentTime uint64, uxHash cipher.SHA256, txns coin.Transactions, calc coin.FeeCalculator) coin.Block { diff --git a/src/visor/historydb/output.go b/src/visor/historydb/output.go index 69c5dd0..225bd41 100755 --- a/src/visor/historydb/output.go +++ b/src/visor/historydb/output.go @@ -1,14 +1,17 @@ package historydb import ( - "github.com/boltdb/bolt" + "fmt" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) +// UxOutsBkt holds unspent outputs +var UxOutsBkt = []byte("uxouts") + // UxOut expend coin.UxOut struct type UxOut struct { Out coin.UxOut @@ -54,64 +57,64 @@ func (o UxOut) Hash() cipher.SHA256 { } // UxOuts bucket stores outputs, UxOut hash as key and Output as value. -type UxOuts struct { - bkt *bucket.Bucket -} - -func newOutputsBkt(db *bolt.DB) (*UxOuts, error) { - bkt, err := bucket.New([]byte("uxouts"), db) - if err != nil { - return nil, err - } - return &UxOuts{bkt}, nil -} +type UxOuts struct{} // Set sets out value -func (ux *UxOuts) Set(out UxOut) error { - key := out.Hash() - bin := encoder.Serialize(out) - return ux.bkt.Put(key[:], bin) +func (ux *UxOuts) Set(tx *dbutil.Tx, out UxOut) error { + hash := out.Hash() + return dbutil.PutBucketValue(tx, UxOutsBkt, hash[:], encoder.Serialize(out)) } // Get gets UxOut of given id -func (ux *UxOuts) Get(uxID cipher.SHA256) (*UxOut, error) { - bin := ux.bkt.Get(uxID[:]) - if bin == nil { - return nil, nil - } +func (ux *UxOuts) Get(tx *dbutil.Tx, uxID cipher.SHA256) (*UxOut, error) { + var out UxOut - out := UxOut{} - if err := encoder.DeserializeRaw(bin, &out); err != nil { + if ok, err := dbutil.GetBucketObjectDecoded(tx, UxOutsBkt, uxID[:], &out); err != nil { return nil, err + } else if !ok { + return nil, nil } return &out, nil } +// GetArray returns UxOuts for a set of uxids, will return error if any of the uxids do not exist +func (ux *UxOuts) GetArray(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]*UxOut, error) { + var outs []*UxOut + for _, uxID := range uxIDs { + out, err := ux.Get(tx, uxID) + if err != nil { + return nil, err + } else if out == nil { + return nil, NewErrUxOutNotExist(uxID.Hex()) + } + + outs = append(outs, out) + } + + return outs, nil +} + // IsEmpty checks if the uxout bucekt is empty -func (ux *UxOuts) IsEmpty() bool { - return ux.bkt.IsEmpty() +func (ux *UxOuts) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, UxOutsBkt) } // Reset resets the bucket -func (ux *UxOuts) Reset() error { - return ux.bkt.Reset() +func (ux *UxOuts) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, UxOutsBkt) } -func getOutput(bkt *bolt.Bucket, hash cipher.SHA256) (*UxOut, error) { - bin := bkt.Get(hash[:]) - if bin != nil { - var out UxOut - if err := encoder.DeserializeRaw(bin, &out); err != nil { - return nil, err - } - return &out, nil - } +// ErrUxOutNotExist is returned if an uxout is not found in historydb +type ErrUxOutNotExist struct { + UxID string +} - return nil, nil +// NewErrUxOutNotExist creates ErrUxOutNotExist from a UxID +func NewErrUxOutNotExist(uxID string) error { + return ErrUxOutNotExist{UxID: uxID} } -func setOutput(bkt *bolt.Bucket, ux UxOut) error { - hash := ux.Hash() - return bkt.Put(hash[:], encoder.Serialize(ux)) +func (e ErrUxOutNotExist) Error() string { + return fmt.Sprintf("uxout of %s does not exist", e.UxID) } diff --git a/src/visor/historydb/transaction.go b/src/visor/historydb/transaction.go index 3010ed7..addca18 100755 --- a/src/visor/historydb/transaction.go +++ b/src/visor/historydb/transaction.go @@ -6,18 +6,17 @@ package historydb // transaction hash, and get the tx value from transactions bucket. import ( - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" ) +// TransactionsBkt holds Transactions +var TransactionsBkt = []byte("transactions") + // Transactions transaction bucket instance. -type transactions struct { - bkt *bucket.Bucket -} +type transactions struct{} // Transaction contains transaction info and the seq of block which executed this block. type Transaction struct { @@ -31,69 +30,70 @@ func (tx *Transaction) Hash() cipher.SHA256 { } // New create a transaction db instance. -func newTransactionsBkt(db *bolt.DB) (*transactions, error) { - txBkt, err := bucket.New([]byte("transactions"), db) - if err != nil { - return nil, nil - } - - return &transactions{bkt: txBkt}, nil -} - -func addTransaction(b *bolt.Bucket, tx *Transaction) error { - hash := tx.Hash() - return b.Put(hash[:], encoder.Serialize(tx)) +func newTransactions() *transactions { + return &transactions{} } // Add transaction to the db. -func (txs *transactions) Add(t *Transaction) error { - key := t.Hash() - v := encoder.Serialize(t) - return txs.bkt.Put(key[:], v) +func (txs *transactions) Add(tx *dbutil.Tx, txn *Transaction) error { + hash := txn.Hash() + return dbutil.PutBucketValue(tx, TransactionsBkt, hash[:], encoder.Serialize(txn)) } -// Get get transaction by tx hash, return nil on not found. -func (txs *transactions) Get(hash cipher.SHA256) (*Transaction, error) { - bin := txs.bkt.Get(hash[:]) - if bin == nil { - return nil, nil - } +// Get gets transaction by tx hash, return nil on not found. +func (txs *transactions) Get(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + var txn Transaction - // deserialize tx - var tx Transaction - if err := encoder.DeserializeRaw(bin, &tx); err != nil { + if ok, err := dbutil.GetBucketObjectDecoded(tx, TransactionsBkt, hash[:], &txn); err != nil { return nil, err + } else if !ok { + return nil, nil } - return &tx, nil + return &txn, nil } // GetSlice returns transactions slice of given hashes -func (txs *transactions) GetSlice(hashes []cipher.SHA256) ([]Transaction, error) { - keys := [][]byte{} - for i := range hashes { - keys = append(keys, hashes[i][:]) - } - - vs := txs.bkt.GetSlice(keys) - txns := make([]Transaction, 0, len(vs)) - for i := range vs { - var tx Transaction - if err := encoder.DeserializeRaw(vs[i], &tx); err != nil { - return []Transaction{}, err +func (txs *transactions) GetSlice(tx *dbutil.Tx, hashes []cipher.SHA256) ([]Transaction, error) { + var txns []Transaction + for _, h := range hashes { + var txn Transaction + + if ok, err := dbutil.GetBucketObjectDecoded(tx, TransactionsBkt, h[:], &txn); err != nil { + return nil, err + } else if !ok { + continue } - txns = append(txns, tx) + + txns = append(txns, txn) } return txns, nil } // IsEmpty checks if transaction bucket is empty -func (txs *transactions) IsEmpty() bool { - return txs.bkt.IsEmpty() +func (txs *transactions) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, TransactionsBkt) } // Reset resets the bucket -func (txs *transactions) Reset() error { - return txs.bkt.Reset() +func (txs *transactions) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, TransactionsBkt) +} + +// ForEach traverses the transactions in db +func (txs *transactions) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return dbutil.ForEach(tx, TransactionsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var txn Transaction + if err := encoder.DeserializeRaw(v, &txn); err != nil { + return err + } + + return f(hash, &txn) + }) } diff --git a/src/visor/historydb/transaction_test.go b/src/visor/historydb/transaction_test.go index b2c15f7..dc234d6 100755 --- a/src/visor/historydb/transaction_test.go +++ b/src/visor/historydb/transaction_test.go @@ -10,6 +10,7 @@ import ( "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" ) // set rand seed. @@ -20,9 +21,9 @@ var _ = func() int64 { }() func TestTransactionGet(t *testing.T) { - txs := make([]Transaction, 0, 3) + txns := make([]Transaction, 0, 3) for i := 0; i < 3; i++ { - txs = append(txs, makeTransaction()) + txns = append(txns, makeTransaction(t)) } testCases := []struct { @@ -32,45 +33,54 @@ func TestTransactionGet(t *testing.T) { }{ { "get first", - txs[0].Hash(), - &txs[0], + txns[0].Hash(), + &txns[0], }, { "get second", - txs[1].Hash(), - &txs[1], + txns[1].Hash(), + &txns[1], }, { "not exist", - txs[2].Hash(), + txns[2].Hash(), nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, td := testutil.PrepareDB(t) + db, td := prepareDB(t) defer td() - txsBkt, err := newTransactionsBkt(db) - require.Nil(t, err) + + txsBkt := newTransactions() // init the bkt - for _, tx := range txs[:2] { - require.Nil(t, txsBkt.Add(&tx)) - } + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:2] { + err := txsBkt.Add(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) // get slice - ts, err := txsBkt.Get(tc.hash) - require.Nil(t, err) - require.Equal(t, tc.expect, ts) + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) }) } } func TestTransactionGetSlice(t *testing.T) { - txs := make([]Transaction, 0, 4) + txns := make([]Transaction, 0, 4) for i := 0; i < 4; i++ { - txs = append(txs, makeTransaction()) + txns = append(txns, makeTransaction(t)) } testCases := []struct { @@ -81,59 +91,67 @@ func TestTransactionGetSlice(t *testing.T) { { "get one", []cipher.SHA256{ - txs[0].Hash(), + txns[0].Hash(), }, - txs[:1], + txns[:1], }, { "get two", []cipher.SHA256{ - txs[0].Hash(), - txs[1].Hash(), + txns[0].Hash(), + txns[1].Hash(), }, - txs[:2], + txns[:2], }, { "get all", []cipher.SHA256{ - txs[0].Hash(), - txs[1].Hash(), - txs[2].Hash(), + txns[0].Hash(), + txns[1].Hash(), + txns[2].Hash(), }, - txs[:3], + txns[:3], }, { "not exist", []cipher.SHA256{ - txs[3].Hash(), + txns[3].Hash(), }, - []Transaction{}, + nil, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - db, td := testutil.PrepareDB(t) + db, td := prepareDB(t) defer td() - txsBkt, err := newTransactionsBkt(db) - require.Nil(t, err) + txsBkt := newTransactions() // init the bkt - for _, tx := range txs[:3] { - require.Nil(t, txsBkt.Add(&tx)) - } + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:3] { + err := txsBkt.Add(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) // get slice - ts, err := txsBkt.GetSlice(tc.hashes) - require.Nil(t, err) - require.Equal(t, tc.expect, ts) + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.GetSlice(tx, tc.hashes) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) }) } } -func makeTransaction() Transaction { +func makeTransaction(t *testing.T) Transaction { tx := Transaction{} - ux, s := makeUxOutWithSecret() + ux, s := makeUxOutWithSecret(t) tx.Tx.PushInput(ux.Hash()) tx.Tx.SignInputs([]cipher.SecKey{s}) tx.Tx.PushOutput(makeAddress(), 1e6, 50) @@ -147,18 +165,18 @@ func makeAddress() cipher.Address { return cipher.AddressFromPubKey(p) } -func makeUxBodyWithSecret() (coin.UxBody, cipher.SecKey) { +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { p, s := cipher.GenerateKeyPair() return coin.UxBody{ - SrcTransaction: cipher.SumSHA256(randBytes(128)), + SrcTransaction: testutil.RandSHA256(t), Address: cipher.AddressFromPubKey(p), Coins: 1e6, Hours: 100, }, s } -func makeUxOutWithSecret() (coin.UxOut, cipher.SecKey) { - body, sec := makeUxBodyWithSecret() +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) return coin.UxOut{ Head: coin.UxHead{ Time: 100, @@ -167,9 +185,3 @@ func makeUxOutWithSecret() (coin.UxOut, cipher.SecKey) { Body: body, }, sec } - -func randBytes(n int) []byte { - b := make([]byte, n) - rand.Read(b) - return b -} diff --git a/src/visor/historyer_mock_test.go b/src/visor/historyer_mock_test.go index 6c1113d..6ecfaa8 100755 --- a/src/visor/historyer_mock_test.go +++ b/src/visor/historyer_mock_test.go @@ -12,20 +12,21 @@ import ( cipher "github.com/skycoin/skycoin/src/cipher" coin "github.com/skycoin/skycoin/src/coin" + dbutil "github.com/skycoin/skycoin/src/visor/dbutil" historydb "github.com/skycoin/skycoin/src/visor/historydb" ) -// historyerMock mock -type historyerMock struct { +// HistoryerMock mock +type HistoryerMock struct { mock.Mock } -func newHistoryerMock() *historyerMock { - return &historyerMock{} +func NewHistoryerMock() *HistoryerMock { + return &HistoryerMock{} } -// ForEach mocked method -func (m *historyerMock) ForEach(p0 func(tx *historydb.Transaction) error) error { +// Erase mocked method +func (m *HistoryerMock) Erase(p0 *dbutil.Tx) error { ret := m.Called(p0) @@ -42,15 +43,33 @@ func (m *historyerMock) ForEach(p0 func(tx *historydb.Transaction) error) error } -// GetAddrTxns mocked method -func (m *historyerMock) GetAddrTxns(p0 cipher.Address) ([]historydb.Transaction, error) { +// ForEachTxn mocked method +func (m *HistoryerMock) ForEachTxn(p0 *dbutil.Tx, p1 func(cipher.SHA256, *historydb.Transaction) error) error { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 []historydb.Transaction + var r0 error switch res := ret.Get(0).(type) { case nil: - case []historydb.Transaction: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetAddrUxOuts mocked method +func (m *HistoryerMock) GetAddrUxOuts(p0 *dbutil.Tx, p1 cipher.Address) ([]*historydb.UxOut, error) { + + ret := m.Called(p0, p1) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -69,15 +88,15 @@ func (m *historyerMock) GetAddrTxns(p0 cipher.Address) ([]historydb.Transaction, } -// GetAddrUxOuts mocked method -func (m *historyerMock) GetAddrUxOuts(p0 cipher.Address) ([]*historydb.UxOut, error) { +// GetAddressTxns mocked method +func (m *HistoryerMock) GetAddressTxns(p0 *dbutil.Tx, p1 cipher.Address) ([]historydb.Transaction, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 []*historydb.UxOut + var r0 []historydb.Transaction switch res := ret.Get(0).(type) { case nil: - case []*historydb.UxOut: + case []historydb.Transaction: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -97,9 +116,9 @@ func (m *historyerMock) GetAddrUxOuts(p0 cipher.Address) ([]*historydb.UxOut, er } // GetTransaction mocked method -func (m *historyerMock) GetTransaction(p0 cipher.SHA256) (*historydb.Transaction, error) { +func (m *HistoryerMock) GetTransaction(p0 *dbutil.Tx, p1 cipher.SHA256) (*historydb.Transaction, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 *historydb.Transaction switch res := ret.Get(0).(type) { @@ -123,15 +142,15 @@ func (m *historyerMock) GetTransaction(p0 cipher.SHA256) (*historydb.Transaction } -// GetUxout mocked method -func (m *historyerMock) GetUxout(p0 cipher.SHA256) (*historydb.UxOut, error) { +// GetUxOuts mocked method +func (m *HistoryerMock) GetUxOuts(p0 *dbutil.Tx, p1 []cipher.SHA256) ([]*historydb.UxOut, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 *historydb.UxOut + var r0 []*historydb.UxOut switch res := ret.Get(0).(type) { case nil: - case *historydb.UxOut: + case []*historydb.UxOut: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -150,33 +169,42 @@ func (m *historyerMock) GetUxout(p0 cipher.SHA256) (*historydb.UxOut, error) { } -// ParseBlock mocked method -func (m *historyerMock) ParseBlock(p0 *coin.Block) error { +// NeedsReset mocked method +func (m *HistoryerMock) NeedsReset(p0 *dbutil.Tx) (bool, error) { ret := m.Called(p0) - var r0 error + var r0 bool switch res := ret.Get(0).(type) { case nil: - case error: + case bool: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } -// ParsedHeight mocked method -func (m *historyerMock) ParsedHeight() int64 { +// ParseBlock mocked method +func (m *HistoryerMock) ParseBlock(p0 *dbutil.Tx, p1 coin.Block) error { - ret := m.Called() + ret := m.Called(p0, p1) - var r0 int64 + var r0 error switch res := ret.Get(0).(type) { case nil: - case int64: + case error: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -186,20 +214,38 @@ func (m *historyerMock) ParsedHeight() int64 { } -// ResetIfNeed mocked method -func (m *historyerMock) ResetIfNeed() error { +// ParsedBlockSeq mocked method +func (m *HistoryerMock) ParsedBlockSeq(p0 *dbutil.Tx) (uint64, bool, error) { - ret := m.Called() + ret := m.Called(p0) - var r0 error + var r0 uint64 switch res := ret.Get(0).(type) { case nil: - case error: + case uint64: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 } diff --git a/src/visor/parameters.go b/src/visor/parameters.go new file mode 100755 index 0000000..3b589e9 --- /dev/null +++ b/src/visor/parameters.go @@ -0,0 +1,130 @@ +package visor + +/* +* CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +* AVOID EDITING THIS MANUALLY + */ + +const ( + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 = 300000000 + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 = 100 + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 = MaxCoinSupply / DistributionAddressesTotal + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 = 100 + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 = 0 + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 = 31536000 // in seconds + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 = 3 + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int = 32768 // in bytes +) + +var distributionAddresses = [DistributionAddressesTotal]string{ + "4EmJ5dfx3wsHwWKsMTfQ31p5uYJfJdkohh", +"QuoFvFwtkekMEYRhXyX6FLdZgYaepwHLrR", +"pUCFtuV98KHrTucKPRgjCGZge5ADGNWJKZ", +"vZjW1xFWefDdkjZjBirsBbLx4ShmqMLPXc", +"29kPNEyTUXbAQsfDBRYwvjxv7AUsEfkHF2W", +"2KFTykHNkeT2ab2rXR4trNgqbsnyGihXR5i", +"qMkYYXpHYxnQF82dGSU1NPZC5rnrcMKLuq", +"22upsW6afi8XeHbKGA6LXQRLuMQJxrbZNSC", +"2KfCbr4u41Kwwd9p2qFAYi8q846vuBhEdf7", +"2LUkM89FH73aDLNLYHeSAXznpMkfZYZworz", +"CeYwWAnzzHq2AKVjraYQHke1koewCaAtYi", +"HV3a26bJydKEyFo9KshRNKM93YXYZSnLeL", +"UwukfXR39CimFfDkBCyh2uE2j7DW45PNv5", +"2SkYKxbWU9PeWaXczT3wMNZAUuFt6hm97yp", +"2UKw1dPW8ih2ECSwhSbsvW2VS6KNGpktiw4", +"2KE3JCVhWpuKesiC1W8kzHXEMi3crwAVPVJ", +"2UzqsvDfesa4TEWpmEiDHVNDNXzrxEXhwGp", +"Ut6UTqYbcu8QVYB9qnh6Sgrq5ztKRKjXy7", +"2R7ukNJG2ELVUsX2GJwNvoy7FgQQE3yMVpv", +"DrxrNGUWUujcA5etb9fi2KtimkDmidBDry", +"2iYrEDYjMizGZxFgqb4msocd6yDYYzUH8UC", +"dS67qDfqTod2viEScxm57oCnGogD5sk1Wp", +"gr6RVkPzR8gB8w1a2fJ4f6Uv3hwa8WHKZm", +"aeHM9sEPzJ8nW5g9msXEb1DHoRgg7HD2Uo", +"kTxV9FvMXqRtSMRxA8BVnYbPnC1GGcGEwZ", +"jZ8365eMAMtjVTcvxATYh1Z13iSwE4DM1w", +"2NJGW1RbbRFh6Bqjf33cs4f1QHtBEZHSkK2", +"2EULQ7JMpfut1fCCieLa1QG3Emh1R3emJYV", +"wXnFqaJ5t4YKuYtts1vjNmn22yHrMDwHdL", +"yjczN2BwDA8DSjs1aDJ72vPm6mBp6YzwNB", +"gz6J6eaf7v5wWrBH6uA8rEwCeEtE6m4uTZ", +"2L3UoEFAkjSvw1xp2HX7EfLR7MmtmuKEF4K", +"2bUjBYtansT9j9qBGjoXf5NM818rs465L69", +"TQwgQFP5rhSfnDLXZvX2BvN76PbUw6TPw", +"2FR126USk7RHzTZFfneEsnXtfi2fA7rBrJg", +"pvo9qDEMgxJ8sVp823UGECvxyHepsYmGy5", +"dWqXe4cWjP8dpypTdo1WgBQWgkRge83RYx", +"2frwoqsfxnaEZUTQMSyt8zPRisk37AudWHZ", +"dU9ZF6ymfAzaX8JUwAPwysxf3e63t6aJvB", +"5XuNJ735yoM8pMptV8Xb86XeQTqDeLNhad", +"GCoLLGVccM55uqAydu2sEuTKTboPYcjLSq", +"gVqLaT3m25XSuCkTKL81oa6GQZtHEUghCv", +"2FL8aRBu6PkJtbUtrP2FrjA6RfMMuMGrogb", +"RNKy29dcpByB1vNzwS3MBSAVmLeNEL5r1u", +"FAtwXixRrwCof2Q8d1G9oRRL21Pu97QzYE", +"2jnFU4WhTspT5xF9xBmEGCyjBzGrpwV9KmU", +"2LPpaLNr1SGRANSjtrBNdyQ3CsLiuJrJ9vG", +"29CWC1Q5mwuvGkcUzNsUeKYpDGTYQwKHUz5", +"2VzVTqprsaxX83Ty3RDB8qxxj8okCsX1uZV", +"Pi5PEQWLzM6VAx3teH5njsfS3aRe8uM33d", +"2hkYymVJnTkFRNNaizTvTtCfZjnXUJdB4Vd", +"Bd8NgUn7M2AZ5DhJcptMSt18ktawytraRm", +"N1crujfwpmE5GYxiCyNNhNawr3WR5o8DEN", +"Qrmf84dw5qhWAFsCRE8jGwZNkdjtuD2tVs", +"CRofzyPh9trHsmE9Me5BZtDYFrZHbWeeiR", +"joMkrn1dDQ6HXijZ4N2c6w18B87mStsrYk", +"4hhUdCSnA8Am15GsuMxZH5UDcuTr224JEf", +"zFPE7UnL4D61XhocQTdd7aWU61qDcP1axo", +"6UEW22dRvEdXegvE9RvP86cjHQjfYMaBF3", +"2Ukg5PK8ur3ufhV728zh2w1giBTuhrudy7u", +"h3MmQzJyXRkkZQtcsqexp1fZEs1M2uPFAD", +"2MeTkW453oaHXZpQz1RXm9fT85VBxKxEVy6", +"29nCVWPwzGqJqyzbmiHmmmipm7vb7H3hv1m", +"2VLfYZauxkN3AiVxdCmRD2KTbrLCQyHQin4", +"YjmWMwGwkyMg1wFNRKWDwCwHf3Pb116PxC", +"yxocxuh2U7SdwfNGXD6ntsQVsQTpyLS56i", +"s4obnTHe4Kuokn3MdxW7o9whzeMycv7hr2", +"At5XWpAgdFBoYKadcVTfTqaZfHu57ozFHu", +"ySUjssfqfHW2dcV6MKj4K6gqWAc1BDZsGw", +"AY96pFVKHAK2WzjhP9UDkv4pG2j5bqBVmi", +"gnVeepuUGh31tcyWTK3Tz2FQJ14euVdKK8", +"pAJTiVpQzX14LEKMB8Bz1ExGaJ3jDY1VGf", +"BVDEFRqgEyVvFsFx6fgBHCE5Y5RWgfBA1n", +"29qvewmoSV6NHifFLA76pYbSM6QawE2adKC", +"2hTQQCkfzp55LvysLeFzps5yY8WBboEjZ9e", +"WS57hc5SpncSrFkFpfa72PcJdyCyeKh1P1", +"2K1MQ58KbvyC1BWh9ptwHkBN5PnPhdsizJH", +"22DFsFEDcEKzLC5wN9qGAJP39myGB7pNLf2", +"2QxWANHhQDEKX3KVFiJADFGWHLeptXmH6Bb", +"2aTnyKGwZTqVkfmf1wfSGDAmyatdY2meaS3", +"2G1dQFH7rwyDpgLkgxWqUnVJhEP5nRsqkgS", +"23gkEujwMYDq1NZMpyQ6rNmiAYpZNCroTSd", +"6HdUiFNTKZStZecVkC4VahcQ7wZ4MJattr", +"25RAFrzh85QEQBP54HN4gtpE6dUdNFKLH87", +"CFr84AHkbdL8CzFdHbbMGZLT5CFAiLSKaG", +"21fU9ALUcFrQNQ1CQZv7n3JJitZYUsnbPZR", +"hs6me1EvzJPSMnGZJVG3Ucn5x8xviJUgig", +"RV4TvVCbyvLfcuPPoXJjpGNNwBy7Nm5Pau", +"28wAXi74mQdfUKBVVS6TcdZ8qFJSnPhP5cz", +"zT7hSSsYf5erHMQRAENauNox3AfJ6dguKE", +"c3xiX4PyKiAJf9Kug4iuSD4iTKWfDpDdG", +"xFJocvPFCYP3EP2r2Nv1PjNuCwFeGRhKDp", +"kmoacFgosG6KJMHe9KDiR2tzRwWmgPmfsB", +"2DZrmXmMPUe43ZHnef35NZg9ktk35c7r3Ep", +"mHoGgj8ahJanEFMDpoxey2KKupqS81bucM", +"2iY6RrqftgfS4o66eg93yehmSWTvuzHTrF2", +"KBuWGafcLr4ht1BT8ykbgiCpQNj4Bore1g", +"F94opeQNavbkh7eZKsk4EJ3Lx38p3AYvCE", +"RA9VsokcqMgnRow5osuUV8zwQdrHntMxaZ", +"uN7JuRyBtbMvRfP26Ui3pnexch8WgoGfdf", +} diff --git a/src/visor/readable.go b/src/visor/readable.go index c26153b..9a7c0dc 100755 --- a/src/visor/readable.go +++ b/src/visor/readable.go @@ -25,16 +25,11 @@ type BlockchainMetadata struct { } // NewBlockchainMetadata creates blockchain meta data -func NewBlockchainMetadata(v *Visor) (*BlockchainMetadata, error) { - head, err := v.Blockchain.Head() - if err != nil { - return nil, err - } - +func NewBlockchainMetadata(head *coin.SignedBlock, unconfirmedLen, unspentsLen uint64) (*BlockchainMetadata, error) { return &BlockchainMetadata{ Head: NewReadableBlockHeader(&head.Head), - Unspents: v.Blockchain.Unspent().Len(), - Unconfirmed: uint64(v.Unconfirmed.Len()), + Unspents: unspentsLen, + Unconfirmed: unconfirmedLen, }, nil } @@ -44,7 +39,6 @@ type Transaction struct { Txn coin.Transaction //`json:"txn"` Status TransactionStatus //`json:"status"` Time uint64 //`json:"time"` - Size int } // TransactionStatus represents the transaction status @@ -108,13 +102,14 @@ type ReadableTransactionOutput struct { // ReadableTransactionInput readable transaction input type ReadableTransactionInput struct { - Hash string `json:"uxid"` - Address string `json:"owner"` - Coins string `json:"coins"` - Hours uint64 `json:"hours"` + Hash string `json:"uxid"` + Address string `json:"owner"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` } -// NewReadableTransactionOutput creates readable transaction outputs +// NewReadableTransactionOutput creates ReadableTransactionOutput func NewReadableTransactionOutput(t *coin.TransactionOutput, txid cipher.SHA256) (*ReadableTransactionOutput, error) { coinStr, err := droplet.ToString(t.Coins) if err != nil { @@ -123,25 +118,33 @@ func NewReadableTransactionOutput(t *coin.TransactionOutput, txid cipher.SHA256) return &ReadableTransactionOutput{ Hash: t.UxID(txid).Hex(), - Address: t.Address.String(), // Destination Address + Address: t.Address.String(), Coins: coinStr, Hours: t.Hours, }, nil } -// NewReadableTransactionInput creates readable transaction input -func NewReadableTransactionInput(uxID, ownerAddress string, coins, hours uint64) (*ReadableTransactionInput, error) { - coinVal, err := droplet.ToString(coins) +// NewReadableTransactionInput creates ReadableTransactionInput +func NewReadableTransactionInput(ux coin.UxOut, calculateHoursTime uint64) (*ReadableTransactionInput, error) { + coinVal, err := droplet.ToString(ux.Body.Coins) if err != nil { logger.Errorf("Failed to convert coins to string: %v", err) return nil, err } + // The overflow bug causes this to fail for some transactions, allow it to pass + calculatedHours, err := ux.CoinHours(calculateHoursTime) + if err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransactionInput ux.CoinHours failed: %v", err) + calculatedHours = 0 + } + return &ReadableTransactionInput{ - Hash: uxID, - Address: ownerAddress, //Destination Address - Coins: coinVal, - Hours: hours, + Hash: ux.Hash().Hex(), + Address: ux.Body.Address.String(), + Coins: coinVal, + Hours: ux.Body.Hours, + CalculatedHours: calculatedHours, }, nil } @@ -180,8 +183,15 @@ func (ros ReadableOutputs) Balance() (wallet.Balance, error) { return wallet.Balance{}, err } - bal.Coins += coins - bal.Hours += out.CalculatedHours + bal.Coins, err = coin.AddUint64(bal.Coins, coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Hours, err = coin.AddUint64(bal.Hours, out.CalculatedHours) + if err != nil { + return wallet.Balance{}, err + } } return bal, nil @@ -248,7 +258,7 @@ func (os ReadableOutputSet) ExpectedOutputs() ReadableOutputs { return append(os.SpendableOutputs(), os.IncomingOutputs...) } -// AggregateUnspentOutputs aggregate unspent output +// AggregateUnspentOutputs builds a map from address to coins func (os ReadableOutputSet) AggregateUnspentOutputs() (map[string]uint64, error) { allAccounts := map[string]uint64{} for _, out := range os.HeadOutputs { @@ -257,7 +267,10 @@ func (os ReadableOutputSet) AggregateUnspentOutputs() (map[string]uint64, error) return nil, err } if _, ok := allAccounts[out.Address]; ok { - allAccounts[out.Address] += amt + allAccounts[out.Address], err = coin.AddUint64(allAccounts[out.Address], amt) + if err != nil { + return nil, err + } } else { allAccounts[out.Address] = amt } @@ -416,45 +429,14 @@ func NewReadableUnconfirmedTxns(txs []UnconfirmedTxn) ([]ReadableUnconfirmedTxn, return rut, nil } -// NewGenesisReadableTransaction creates genesis readable transaction -func NewGenesisReadableTransaction(t *Transaction) (*ReadableTransaction, error) { +// NewReadableTransaction creates readable transaction +func NewReadableTransaction(t *Transaction) (*ReadableTransaction, error) { + // Genesis transaction use empty SHA256 as txid txid := cipher.SHA256{} - sigs := make([]string, len(t.Txn.Sigs)) - for i := range t.Txn.Sigs { - sigs[i] = t.Txn.Sigs[i].Hex() + if t.Status.BlockSeq != 0 { + txid = t.Txn.Hash() } - in := make([]string, len(t.Txn.In)) - for i := range t.Txn.In { - in[i] = t.Txn.In[i].Hex() - } - - out := make([]ReadableTransactionOutput, len(t.Txn.Out)) - for i := range t.Txn.Out { - o, err := NewReadableTransactionOutput(&t.Txn.Out[i], txid) - if err != nil { - return nil, err - } - - out[i] = *o - } - - return &ReadableTransaction{ - Length: t.Txn.Length, - Type: t.Txn.Type, - Hash: t.Txn.TxIDHex(), - InnerHash: t.Txn.InnerHash.Hex(), - Timestamp: t.Time, - - Sigs: sigs, - In: in, - Out: out, - }, nil -} - -// NewReadableTransaction creates readable transaction -func NewReadableTransaction(t *Transaction) (*ReadableTransaction, error) { - txid := t.Txn.Hash() sigs := make([]string, len(t.Txn.Sigs)) for i := range t.Txn.Sigs { sigs[i] = t.Txn.Sigs[i].Hex() @@ -521,20 +503,16 @@ type ReadableBlockBody struct { func NewReadableBlockBody(b *coin.Block) (*ReadableBlockBody, error) { txns := make([]ReadableTransaction, len(b.Body.Transactions)) for i := range b.Body.Transactions { - if b.Seq() == uint64(0) { - // genesis block - tx, err := NewGenesisReadableTransaction(&Transaction{Txn: b.Body.Transactions[i]}) - if err != nil { - return nil, err - } - txns[i] = *tx - } else { - tx, err := NewReadableTransaction(&Transaction{Txn: b.Body.Transactions[i]}) - if err != nil { - return nil, err - } - txns[i] = *tx + t := Transaction{ + Txn: b.Body.Transactions[i], + Status: TransactionStatus{BlockSeq: b.Seq()}, + } + + tx, err := NewReadableTransaction(&t) + if err != nil { + return nil, err } + txns[i] = *tx } return &ReadableBlockBody{ Transactions: txns, diff --git a/src/visor/readable_test.go b/src/visor/readable_test.go index 4ea5606..eddef11 100755 --- a/src/visor/readable_test.go +++ b/src/visor/readable_test.go @@ -2,62 +2,47 @@ package visor import ( "encoding/json" - "fmt" "io/ioutil" "reflect" "testing" - "github.com/boltdb/bolt" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor/dbutil" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/testutil" ) -func prepareWltDir() string { +func prepareWltDir(t *testing.T) string { dir, err := ioutil.TempDir("", "wallets") - if err != nil { - panic(err) - } - + require.NoError(t, err) return dir } -func createGenesisSignature(t *testing.T) cipher.Sig { - - _, s := cipher.GenerateKeyPair() - gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) - if err != nil { - panic(fmt.Errorf("create genesis block failed: %v", err)) - } - - sig := cipher.SignHash(gb.HashHeader(), s) - return sig -} - // Returns an appropriate VisorConfig and a master visor func setupVisorConfig(t *testing.T) Config { - wltDir := prepareWltDir() + wltDir := prepareWltDir(t) c := NewVisorConfig() c.WalletDirectory = wltDir - c.GenesisSignature = createGenesisSignature(t) + c.BlockchainSeckey = genSecret + c.BlockchainPubkey = genPublic + c.GenesisAddress = genAddress return c } -func setupVisor(t *testing.T) (v *Visor, close func()) { - db, close := testutil.PrepareDB(t) +func setupVisor(t *testing.T) (*Visor, func()) { + db, shutdown := prepareDB(t) vc := setupVisorConfig(t) v, err := NewVisor(vc, db) require.NoError(t, err) - return + return v, shutdown } -func transferCoins(t *testing.T, v *Visor) error { - head := addGenesisBlock(t, v.Blockchain) +func transferCoins(t *testing.T, v *Visor) { + head := addGenesisBlockToVisor(t, v) toAddrs := make([]cipher.Address, 10) keys := make([]cipher.SecKey, 10) for i := 0; i < 10; i++ { @@ -75,43 +60,51 @@ func transferCoins(t *testing.T, v *Visor) error { } // create normal spending tx uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[0]) - tx := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) - b, err := v.Blockchain.NewBlock(coin.Transactions{tx}, head.Time()+uint64(100)) + txn := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + + var b *coin.Block + err := v.DB.View("", func(tx *dbutil.Tx) error { + var err error + b, err = v.Blockchain.NewBlock(tx, coin.Transactions{txn}, head.Time()+uint64(100)) + require.NoError(t, err) + return nil + }) require.NoError(t, err) sb := &coin.SignedBlock{ Block: *b, Sig: cipher.SignHash(b.HashHeader(), genSecret), } - v.db.Update(func(tx *bolt.Tx) error { + v.DB.Update("", func(tx *dbutil.Tx) error { bcc, ok := v.Blockchain.(*Blockchain) require.True(t, ok) - return bcc.store.AddBlockWithTx(tx, sb) + return bcc.store.AddBlock(tx, sb) }) head = sb - return nil + } func assertJSONSerializability(t *testing.T, thing interface{}) { b, err := json.Marshal(thing) - assert.Nil(t, err) + require.NoError(t, err) rt := reflect.TypeOf(reflect.Indirect(reflect.ValueOf(thing)).Interface()) newThing := reflect.New(rt).Interface() err = json.Unmarshal(b, newThing) - assert.Nil(t, err) - assert.True(t, reflect.DeepEqual(thing, newThing)) + require.NoError(t, err) + require.True(t, reflect.DeepEqual(thing, newThing)) } func TestNewBlockchainMetadata(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) - bcm, err := NewBlockchainMetadata(v) + bcm, err := v.GetBlockchainMetadata() require.NoError(t, err) - assert.Equal(t, uint64(2), bcm.Unspents) - assert.Equal(t, uint64(0), bcm.Unconfirmed) - b, err := v.Blockchain.Head() + require.Equal(t, uint64(2), bcm.Unspents) + require.Equal(t, uint64(0), bcm.Unconfirmed) + b, err := v.GetHeadBlock() require.NoError(t, err) assertReadableBlockHeader(t, bcm.Head, b.Block.Head) assertJSONSerializability(t, &bcm) @@ -119,47 +112,49 @@ func TestNewBlockchainMetadata(t *testing.T) { func TestNewTransactionStatus(t *testing.T) { ts := NewUnconfirmedTransactionStatus() - assert.True(t, ts.Unconfirmed) - assert.False(t, ts.Unknown) - assert.False(t, ts.Confirmed) - assert.Equal(t, ts.Height, uint64(0)) + require.True(t, ts.Unconfirmed) + require.False(t, ts.Unknown) + require.False(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(0)) assertJSONSerializability(t, &ts) ts = NewUnknownTransactionStatus() - assert.False(t, ts.Unconfirmed) - assert.True(t, ts.Unknown) - assert.False(t, ts.Confirmed) - assert.Equal(t, ts.Height, uint64(0)) + require.False(t, ts.Unconfirmed) + require.True(t, ts.Unknown) + require.False(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(0)) assertJSONSerializability(t, &ts) ts = NewConfirmedTransactionStatus(uint64(7), uint64(7)) - assert.False(t, ts.Unconfirmed) - assert.False(t, ts.Unknown) - assert.True(t, ts.Confirmed) - assert.Equal(t, ts.Height, uint64(7)) + require.False(t, ts.Unconfirmed) + require.False(t, ts.Unknown) + require.True(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(7)) assertJSONSerializability(t, &ts) - assert.Panics(t, func() { NewConfirmedTransactionStatus(uint64(0), uint64(0)) }) + require.Panics(t, func() { + NewConfirmedTransactionStatus(uint64(0), uint64(0)) + }) } func assertReadableTransactionOutput(t *testing.T, rto ReadableTransactionOutput, to coin.TransactionOutput) { - assert.NotPanics(t, func() { - assert.Equal(t, cipher.MustDecodeBase58Address(rto.Address), - to.Address) + require.NotPanics(t, func() { + require.Equal(t, cipher.MustDecodeBase58Address(rto.Address), to.Address) }) coins, err := droplet.ToString(to.Coins) require.NoError(t, err) - assert.Equal(t, rto.Coins, coins) - assert.Equal(t, rto.Hours, to.Hours) + require.Equal(t, rto.Coins, coins) + require.Equal(t, rto.Hours, to.Hours) assertJSONSerializability(t, &rto) } func TestReadableTransactionOutput(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) - b, err := v.Blockchain.Head() + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() require.NoError(t, err) to := b.Body.Transactions[0].Out[0] @@ -168,27 +163,27 @@ func TestReadableTransactionOutput(t *testing.T) { } func assertReadableTransactionInput(t *testing.T, rti string, ti cipher.SHA256) { - assert.NotPanics(t, func() { - assert.Equal(t, cipher.MustSHA256FromHex(rti), ti) + require.NotPanics(t, func() { + require.Equal(t, cipher.MustSHA256FromHex(rti), ti) }) assertJSONSerializability(t, &rti) } func TestReadableTransactionInput(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) - b, err := v.Blockchain.Head() + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() require.NoError(t, err) ti := b.Body.Transactions[0].In[0] rti := ti.Hex() assertReadableTransactionInput(t, rti, ti) } -func assertReadableTransaction(t *testing.T, rtx ReadableTransaction, - tx coin.Transaction) { - assert.Equal(t, len(tx.In), len(rtx.In)) - assert.Equal(t, len(tx.Out), len(rtx.Out)) +func assertReadableTransaction(t *testing.T, rtx ReadableTransaction, tx coin.Transaction) { + require.Equal(t, len(tx.In), len(rtx.In)) + require.Equal(t, len(tx.Out), len(rtx.Out)) for i, ti := range rtx.In { assertReadableTransactionInput(t, ti, tx.In[i]) } @@ -199,44 +194,47 @@ func assertReadableTransaction(t *testing.T, rtx ReadableTransaction, } func TestReadableTransaction(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) - b, err := v.Blockchain.Head() + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() require.NoError(t, err) tx := b.Body.Transactions[0] - rtx, err := NewReadableTransaction(&Transaction{Txn: tx}) + rtx, err := NewReadableTransaction(&Transaction{ + Txn: tx, + }) assertReadableTransaction(t, *rtx, tx) } -func assertReadableBlockHeader(t *testing.T, rb ReadableBlockHeader, - bh coin.BlockHeader) { - assert.Equal(t, rb.Version, bh.Version) - assert.Equal(t, rb.Time, bh.Time) - assert.Equal(t, rb.BkSeq, bh.BkSeq) - assert.Equal(t, rb.Fee, bh.Fee) - assert.NotPanics(t, func() { - assert.Equal(t, cipher.MustSHA256FromHex(rb.PreviousBlockHash), bh.PrevHash) - assert.Equal(t, cipher.MustSHA256FromHex(rb.BodyHash), bh.BodyHash) +func assertReadableBlockHeader(t *testing.T, rb ReadableBlockHeader, bh coin.BlockHeader) { + require.Equal(t, rb.Version, bh.Version) + require.Equal(t, rb.Time, bh.Time) + require.Equal(t, rb.BkSeq, bh.BkSeq) + require.Equal(t, rb.Fee, bh.Fee) + require.NotPanics(t, func() { + require.Equal(t, cipher.MustSHA256FromHex(rb.PreviousBlockHash), bh.PrevHash) + require.Equal(t, cipher.MustSHA256FromHex(rb.BodyHash), bh.BodyHash) }) assertJSONSerializability(t, &rb) } func TestNewReadableBlockHeader(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) - bh, err := v.Blockchain.Head() + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + + bh, err := v.GetHeadBlock() require.NoError(t, err) - assert.Equal(t, bh.Head.BkSeq, uint64(1)) + require.Equal(t, bh.Head.BkSeq, uint64(1)) rb := NewReadableBlockHeader(&bh.Head) assertReadableBlockHeader(t, rb, bh.Head) } -func assertReadableBlockBody(t *testing.T, rbb ReadableBlockBody, - bb coin.BlockBody) { - assert.Equal(t, len(rbb.Transactions), len(bb.Transactions)) +func assertReadableBlockBody(t *testing.T, rbb ReadableBlockBody, bb coin.BlockBody) { + require.Equal(t, len(rbb.Transactions), len(bb.Transactions)) for i, rt := range rbb.Transactions { assertReadableTransaction(t, rt, bb.Transactions[i]) } @@ -250,12 +248,13 @@ func assertReadableBlock(t *testing.T, rb ReadableBlock, b coin.Block) { } func TestNewReadableBlock(t *testing.T) { - v, close := setupVisor(t) - defer close() - assert.Nil(t, transferCoins(t, v)) - sb, err := v.Blockchain.Head() + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + sb, err := v.GetHeadBlock() require.NoError(t, err) - assert.Equal(t, sb.Head.BkSeq, uint64(1)) + require.Equal(t, sb.Head.BkSeq, uint64(1)) rb, err := NewReadableBlock(&sb.Block) assertReadableBlock(t, *rb, sb.Block) } diff --git a/src/visor/testdata/data.db.no-addr-txn-index b/src/visor/testdata/data.db.no-addr-txn-index new file mode 100755 index 0000000..11f547d Binary files /dev/null and b/src/visor/testdata/data.db.no-addr-txn-index differ diff --git a/src/visor/testdata/data.db.no-addr-uxout-index b/src/visor/testdata/data.db.no-addr-uxout-index new file mode 100755 index 0000000..bf4ef82 Binary files /dev/null and b/src/visor/testdata/data.db.no-addr-uxout-index differ diff --git a/src/visor/testdata/data.db.notxn b/src/visor/testdata/data.db.notxn new file mode 100755 index 0000000..86fa646 Binary files /dev/null and b/src/visor/testdata/data.db.notxn differ diff --git a/src/visor/testdata/data.db.nouxout b/src/visor/testdata/data.db.nouxout new file mode 100755 index 0000000..21ebfa7 Binary files /dev/null and b/src/visor/testdata/data.db.nouxout differ diff --git a/src/visor/testdata/data.db.ok b/src/visor/testdata/data.db.ok new file mode 100755 index 0000000..47780f8 Binary files /dev/null and b/src/visor/testdata/data.db.ok differ diff --git a/src/visor/unconfirmed.go b/src/visor/unconfirmed.go index abc7dca..6bb9169 100755 --- a/src/visor/unconfirmed.go +++ b/src/visor/unconfirmed.go @@ -1,17 +1,23 @@ package visor import ( - "fmt" + "errors" "time" - "github.com/boltdb/bolt" - "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/cipher/encoder" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/util/utc" - "github.com/skycoin/skycoin/src/visor/blockdb" - "github.com/skycoin/skycoin/src/visor/bucket" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // UnconfirmedTxnsBkt holds unconfirmed transactions + UnconfirmedTxnsBkt = []byte("unconfirmed_txns") + // UnconfirmedUnspentsBkt holds unconfirmed unspent outputs + UnconfirmedUnspentsBkt = []byte("unconfirmed_unspents") + + errUpdateObjectDoesNotExist = errors.New("object does not exist in bucket") ) // TxnUnspents maps from coin.Transaction hash to its expected unspents. The unspents' @@ -50,164 +56,117 @@ func (ut *UnconfirmedTxn) Hash() cipher.SHA256 { } // unconfirmed transactions bucket -type uncfmTxnBkt struct { - txns *bucket.Bucket -} - -func newUncfmTxBkt(db *bolt.DB) *uncfmTxnBkt { - bkt, err := bucket.New([]byte("unconfirmed_txns"), db) - if err != nil { - panic(err) - } +type unconfirmedTxns struct{} - return &uncfmTxnBkt{txns: bkt} -} +func (utb *unconfirmedTxns) get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) { + var txn UnconfirmedTxn -func (utb *uncfmTxnBkt) get(hash cipher.SHA256) (*UnconfirmedTxn, bool) { - v := utb.txns.Get([]byte(hash.Hex())) - if v == nil { - return nil, false - } - var tx UnconfirmedTxn - if err := encoder.DeserializeRaw(v, &tx); err != nil { - return nil, false + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnconfirmedTxnsBkt, []byte(hash.Hex()), &txn); err != nil { + return nil, err + } else if !ok { + return nil, nil } - return &tx, true + + return &txn, nil } -func (utb *uncfmTxnBkt) putWithTx(tx *bolt.Tx, v *UnconfirmedTxn) error { - key := []byte(v.Hash().Hex()) - d := encoder.Serialize(v) - return utb.txns.PutWithTx(tx, key, d) +func (utb *unconfirmedTxns) put(tx *dbutil.Tx, v *UnconfirmedTxn) error { + return dbutil.PutBucketValue(tx, UnconfirmedTxnsBkt, []byte(v.Hash().Hex()), encoder.Serialize(v)) } -func (utb *uncfmTxnBkt) update(key cipher.SHA256, f func(v *UnconfirmedTxn)) error { - updateFun := func(v []byte) ([]byte, error) { - if v == nil { - return nil, fmt.Errorf("%s does not exist in bucket %s", key.Hex(), utb.txns.Name) - } +func (utb *unconfirmedTxns) update(tx *dbutil.Tx, hash cipher.SHA256, f func(v *UnconfirmedTxn) error) error { + txn, err := utb.get(tx, hash) + if err != nil { + return err + } - var tx UnconfirmedTxn - if err := encoder.DeserializeRaw(v, &tx); err != nil { - return nil, err - } + if txn == nil { + return errUpdateObjectDoesNotExist + } - f(&tx) - return encoder.Serialize(tx), nil + if err := f(txn); err != nil { + return err } - return utb.txns.Update([]byte(key.Hex()), updateFun) + return utb.put(tx, txn) } -func (utb *uncfmTxnBkt) delete(key cipher.SHA256) error { - return utb.txns.Delete([]byte(key.Hex())) +func (utb *unconfirmedTxns) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) } -func (utb *uncfmTxnBkt) deleteWithTx(tx *bolt.Tx, key cipher.SHA256) error { - return utb.txns.DeleteWithTx(tx, []byte(key.Hex())) -} +func (utb *unconfirmedTxns) getAll(tx *dbutil.Tx) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn -func (utb *uncfmTxnBkt) getAll() ([]UnconfirmedTxn, error) { - vs := utb.txns.GetAll() - txns := make([]UnconfirmedTxn, 0, len(vs)) - for _, u := range vs { - var tx UnconfirmedTxn - if err := encoder.DeserializeRaw(u, &tx); err != nil { - return nil, err + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + var txn UnconfirmedTxn + if err := encoder.DeserializeRaw(v, &txn); err != nil { + return err } - txns = append(txns, tx) + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err } return txns, nil } -func (utb *uncfmTxnBkt) rangeUpdate(f func(key cipher.SHA256, tx *UnconfirmedTxn) error) error { - return utb.txns.RangeUpdate(func(k, v []byte) ([]byte, error) { - key, err := cipher.SHA256FromHex(string(k)) - if err != nil { - return nil, err - } - - var tx UnconfirmedTxn - if err := encoder.DeserializeRaw(v, &tx); err != nil { - return nil, err - } - - if err := f(key, &tx); err != nil { - return nil, err - } - - // encode the tx - d := encoder.Serialize(tx) - return d, nil - }) -} - -func (utb *uncfmTxnBkt) isExist(key cipher.SHA256) bool { - return utb.txns.IsExist([]byte(key.Hex())) +func (utb *unconfirmedTxns) hasKey(tx *dbutil.Tx, hash cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) } -func (utb *uncfmTxnBkt) forEach(f func(key cipher.SHA256, tx *UnconfirmedTxn) error) error { - return utb.txns.ForEach(func(k, v []byte) error { - key, err := cipher.SHA256FromHex(string(k)) +func (utb *unconfirmedTxns) forEach(tx *dbutil.Tx, f func(hash cipher.SHA256, tx UnconfirmedTxn) error) error { + return dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) if err != nil { return err } - var tx UnconfirmedTxn - if err := encoder.DeserializeRaw(v, &tx); err != nil { + + var txn UnconfirmedTxn + if err := encoder.DeserializeRaw(v, &txn); err != nil { return err } - return f(key, &tx) + return f(hash, txn) }) } -func (utb *uncfmTxnBkt) len() int { - // exclude the index - return utb.txns.Len() +func (utb *unconfirmedTxns) length(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedTxnsBkt) } -type txUnspents struct { - bkt *bucket.Bucket -} - -func newTxUnspents(db *bolt.DB) *txUnspents { - bkt, err := bucket.New([]byte("unconfirmed_unspents"), db) - if err != nil { - panic(err) - } - - return &txUnspents{bkt: bkt} -} +type txUnspents struct{} -func (txus *txUnspents) putWithTx(tx *bolt.Tx, key cipher.SHA256, uxs coin.UxArray) error { - v := encoder.Serialize(uxs) - return txus.bkt.PutWithTx(tx, []byte(key.Hex()), v) +func (txus *txUnspents) put(tx *dbutil.Tx, hash cipher.SHA256, uxs coin.UxArray) error { + return dbutil.PutBucketValue(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), encoder.Serialize(uxs)) } -func (txus *txUnspents) get(key cipher.SHA256) (coin.UxArray, error) { - v := txus.bkt.Get([]byte(key.Hex())) +func (txus *txUnspents) get(tx *dbutil.Tx, hash cipher.SHA256) (coin.UxArray, error) { var uxs coin.UxArray - if err := encoder.DeserializeRaw(v, &uxs); err != nil { - return coin.UxArray{}, err + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), &uxs); err != nil { + return nil, err + } else if !ok { + return nil, nil } + return uxs, nil } -func (txus *txUnspents) len() int { - return txus.bkt.Len() +func (txus *txUnspents) length(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedUnspentsBkt) } -func (txus *txUnspents) delete(key cipher.SHA256) error { - return txus.bkt.Delete([]byte(key.Hex())) +func (txus *txUnspents) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex())) } -func (txus *txUnspents) deleteWithTx(tx *bolt.Tx, key cipher.SHA256) error { - return txus.bkt.DeleteWithTx(tx, []byte(key.Hex())) -} +func (txus *txUnspents) getByAddr(tx *dbutil.Tx, a cipher.Address) (coin.UxArray, error) { + var uxo coin.UxArray -func (txus *txUnspents) getByAddr(a cipher.Address) (uxo coin.UxArray) { - txus.bkt.ForEach(func(k, v []byte) error { + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { var uxa coin.UxArray if err := encoder.DeserializeRaw(v, &uxa); err != nil { return err @@ -218,13 +177,17 @@ func (txus *txUnspents) getByAddr(a cipher.Address) (uxo coin.UxArray) { uxo = append(uxo, uxa[i]) } } + return nil - }) - return + }); err != nil { + return nil, err + } + + return uxo, nil } -func (txus *txUnspents) forEach(f func(cipher.SHA256, coin.UxArray)) error { - return txus.bkt.ForEach(func(k, v []byte) error { +func (txus *txUnspents) forEach(tx *dbutil.Tx, f func(cipher.SHA256, coin.UxArray) error) error { + return dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(k, v []byte) error { hash, err := cipher.SHA256FromHex(string(k)) if err != nil { return err @@ -235,14 +198,14 @@ func (txus *txUnspents) forEach(f func(cipher.SHA256, coin.UxArray)) error { return err } - f(hash, uxa) - return nil + return f(hash, uxa) }) } // UnconfirmedTxnPool manages unconfirmed transactions type UnconfirmedTxnPool struct { - txns *uncfmTxnBkt + db *dbutil.DB + txns *unconfirmedTxns // Predicted unspents, assuming txns are valid. Needed to predict // our future balance and avoid double spending our own coins // Maps from Transaction.Hash() to UxArray. @@ -250,25 +213,59 @@ type UnconfirmedTxnPool struct { } // NewUnconfirmedTxnPool creates an UnconfirmedTxnPool instance -func NewUnconfirmedTxnPool(db *bolt.DB) *UnconfirmedTxnPool { - return &UnconfirmedTxnPool{ - txns: newUncfmTxBkt(db), - unspent: newTxUnspents(db), +func NewUnconfirmedTxnPool(db *dbutil.DB) (*UnconfirmedTxnPool, error) { + if err := db.View("Check unconfirmed txn pool size", func(tx *dbutil.Tx) error { + n, err := dbutil.Len(tx, UnconfirmedTxnsBkt) + if err != nil { + return err + } + + logger.Infof("Unconfirmed transaction pool size: %d", n) + return nil + }); err != nil { + return nil, err } + + return &UnconfirmedTxnPool{ + db: db, + txns: &unconfirmedTxns{}, + unspent: &txUnspents{}, + }, nil } -// SetAnnounced updates announced time of specific tx -func (utp *UnconfirmedTxnPool) SetAnnounced(h cipher.SHA256, t int64) error { - return utp.txns.update(h, func(tx *UnconfirmedTxn) { - tx.Announced = t - }) +// SetTxnsAnnounced updates announced time of specific tx +func (utp *UnconfirmedTxnPool) SetTxnsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + var txns []*UnconfirmedTxn + for h, t := range hashes { + txn, err := utp.txns.get(tx, h) + if err != nil { + return err + } + + if txn == nil { + logger.Warningf("UnconfirmedTxnPool.SetTxnsAnnounced: UnconfirmedTxn %s not found in DB", h.Hex()) + continue + } + + if t > txn.Announced { + txn.Announced = t + txns = append(txns, txn) + } + } + + for _, txn := range txns { + if err := utp.txns.put(tx, txn); err != nil { + return err + } + } + + return nil } -// Creates an unconfirmed transaction -func (utp *UnconfirmedTxnPool) createUnconfirmedTxn(t coin.Transaction) UnconfirmedTxn { +func createUnconfirmedTxn(txn coin.Transaction) UnconfirmedTxn { now := utc.Now() return UnconfirmedTxn{ - Txn: t, + Txn: txn, Received: now.UnixNano(), Checked: now.UnixNano(), Announced: time.Time{}.UnixNano(), @@ -280,11 +277,11 @@ func (utp *UnconfirmedTxnPool) createUnconfirmedTxn(t coin.Transaction) Unconfir // existed in the pool. // If the transaction violates hard constraints, it is rejected. // Soft constraints violations mark a txn as invalid, but the txn is inserted. The soft violation is returned. -func (utp *UnconfirmedTxnPool) InjectTransaction(bc Blockchainer, t coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) { +func (utp *UnconfirmedTxnPool) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, txn coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) { var isValid int8 = 1 var softErr *ErrTxnViolatesSoftConstraint - if err := bc.VerifySingleTxnAllConstraints(t, maxSize); err != nil { - logger.Warningf("bc.VerifySingleTxnAllConstraints failed for txn %s: %v", t.TxIDHex(), err) + if err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, maxSize); err != nil { + logger.Warningf("bc.VerifySingleTxnSoftHardConstraints failed for txn %s: %v", txn.TxIDHex(), err) switch err.(type) { case ErrTxnViolatesSoftConstraint: e := err.(ErrTxnViolatesSoftConstraint) @@ -297,38 +294,48 @@ func (utp *UnconfirmedTxnPool) InjectTransaction(bc Blockchainer, t coin.Transac } } - // Update if we already have this txn - h := t.Hash() - known := false - utp.txns.update(h, func(tx *UnconfirmedTxn) { - known = true - now := utc.Now().UnixNano() - tx.Received = now - tx.Checked = now - tx.IsValid = isValid - }) + hash := txn.Hash() + known, err := utp.txns.hasKey(tx, hash) + if err != nil { + logger.Errorf("InjectTransaction check txn exists failed: %v", err) + return false, nil, err + } + + // Update if we already have this txn if known { + if err := utp.txns.update(tx, hash, func(utxn *UnconfirmedTxn) error { + now := utc.Now().UnixNano() + utxn.Received = now + utxn.Checked = now + utxn.IsValid = isValid + return nil + }); err != nil { + logger.Errorf("InjectTransaction update known txn failed: %v", err) + return false, nil, err + } + return true, softErr, nil } - utx := utp.createUnconfirmedTxn(t) + utx := createUnconfirmedTxn(txn) utx.IsValid = isValid - if err := bc.UpdateDB(func(tx *bolt.Tx) error { - // add txn to index - if err := utp.txns.putWithTx(tx, &utx); err != nil { - return err - } + // add txn to index + if err := utp.txns.put(tx, &utx); err != nil { + logger.Errorf("InjectTransaction put new unconfirmed txn failed: %v", err) + return false, nil, err + } - // update unconfirmed unspent - head, err := bc.Head() - if err != nil { - return err - } + head, err := bc.Head(tx) + if err != nil { + logger.Errorf("InjectTransaction bc.Head() failed: %v", err) + return false, nil, err + } - return utp.unspent.putWithTx(tx, h, coin.CreateUnspents(head.Head, t)) - }); err != nil { + // update unconfirmed unspent + if err := utp.unspent.put(tx, hash, coin.CreateUnspents(head.Head, txn)); err != nil { + logger.Errorf("InjectTransaction put new unspent outputs: %v", err) return false, nil, err } @@ -336,34 +343,32 @@ func (utp *UnconfirmedTxnPool) InjectTransaction(bc Blockchainer, t coin.Transac } // RawTxns returns underlying coin.Transactions -func (utp *UnconfirmedTxnPool) RawTxns() coin.Transactions { - utxns, err := utp.txns.getAll() +func (utp *UnconfirmedTxnPool) RawTxns(tx *dbutil.Tx) (coin.Transactions, error) { + utxns, err := utp.txns.getAll(tx) if err != nil { - return coin.Transactions{} + return nil, err } txns := make(coin.Transactions, len(utxns)) for i := range utxns { txns[i] = utxns[i].Txn } - return txns + return txns, nil } // Remove a single txn by hash -func (utp *UnconfirmedTxnPool) removeTxn(bc *Blockchain, txHash cipher.SHA256) { - // delete(utp.Txns, txHash) - utp.txns.delete(txHash) - utp.unspent.delete(txHash) +func (utp *UnconfirmedTxnPool) removeTxn(tx *dbutil.Tx, txHash cipher.SHA256) error { + if err := utp.txns.delete(tx, txHash); err != nil { + return err + } + + return utp.unspent.delete(tx, txHash) } -// Removes multiple txns at once. Slightly more efficient than a series of -// single RemoveTxns. Hashes is an array of Transaction hashes. -func (utp *UnconfirmedTxnPool) removeTxns(hashes []cipher.SHA256) error { - for i := range hashes { - if err := utp.txns.delete(hashes[i]); err != nil { - return err - } - if err := utp.unspent.delete(hashes[i]); err != nil { +// RemoveTransactions remove transactions with dbutil.Tx +func (utp *UnconfirmedTxnPool) RemoveTransactions(tx *dbutil.Tx, txHashes []cipher.SHA256) error { + for i := range txHashes { + if err := utp.removeTxn(tx, txHashes[i]); err != nil { return err } } @@ -371,51 +376,38 @@ func (utp *UnconfirmedTxnPool) removeTxns(hashes []cipher.SHA256) error { return nil } -func (utp *UnconfirmedTxnPool) removeTxnsWithTx(tx *bolt.Tx, hashes []cipher.SHA256) { - for i := range hashes { - utp.txns.deleteWithTx(tx, hashes[i]) - utp.unspent.deleteWithTx(tx, hashes[i]) - } -} - -// RemoveTransactions removes confirmed txns from the pool -func (utp *UnconfirmedTxnPool) RemoveTransactions(txns []cipher.SHA256) error { - return utp.removeTxns(txns) -} - -// RemoveTransactionsWithTx remove transactions with bolt.Tx -func (utp *UnconfirmedTxnPool) RemoveTransactionsWithTx(tx *bolt.Tx, txns []cipher.SHA256) { - utp.removeTxnsWithTx(tx, txns) -} - // Refresh checks all unconfirmed txns against the blockchain. // If the transaction becomes invalid it is marked invalid. // If the transaction becomes valid it is marked valid and is returned to the caller. -func (utp *UnconfirmedTxnPool) Refresh(bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) { - now := utc.Now() +func (utp *UnconfirmedTxnPool) Refresh(tx *dbutil.Tx, bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + now := utc.Now() var nowValid []cipher.SHA256 - if err := utp.txns.rangeUpdate(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - tx.Checked = now.UnixNano() + for _, utxn := range utxns { + utxn.Checked = now.UnixNano() - err := bc.VerifySingleTxnAllConstraints(tx.Txn, maxBlockSize) + err := bc.VerifySingleTxnSoftHardConstraints(tx, utxn.Txn, maxBlockSize) switch err.(type) { case ErrTxnViolatesSoftConstraint, ErrTxnViolatesHardConstraint: - tx.IsValid = 0 + utxn.IsValid = 0 case nil: - if tx.IsValid == 0 { - nowValid = append(nowValid, tx.Hash()) + if utxn.IsValid == 0 { + nowValid = append(nowValid, utxn.Hash()) } - tx.IsValid = 1 + utxn.IsValid = 1 default: - return err + return nil, err } - return nil - }); err != nil { - return nil, err + if err := utp.txns.put(tx, &utxn); err != nil { + return nil, err + } } return nowValid, nil @@ -424,65 +416,75 @@ func (utp *UnconfirmedTxnPool) Refresh(bc Blockchainer, maxBlockSize int) ([]cip // RemoveInvalid checks all unconfirmed txns against the blockchain. // If a transaction violates hard constraints it is removed from the pool. // The transactions that were removed are returned. -func (utp *UnconfirmedTxnPool) RemoveInvalid(bc Blockchainer) ([]cipher.SHA256, error) { - var removeTxs []cipher.SHA256 +func (utp *UnconfirmedTxnPool) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + var removeUtxns []cipher.SHA256 - if err := utp.txns.forEach(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - err := bc.VerifySingleTxnHardConstraints(tx.Txn) + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } - switch err.(type) { - case ErrTxnViolatesHardConstraint: - removeTxs = append(removeTxs, tx.Hash()) - default: - return err + for _, utxn := range utxns { + err := bc.VerifySingleTxnHardConstraints(tx, utxn.Txn) + if err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint: + removeUtxns = append(removeUtxns, utxn.Hash()) + default: + return nil, err + } } - - return nil - }); err != nil { - return nil, err } - if err := utp.RemoveTransactions(removeTxs); err != nil { + if err := utp.RemoveTransactions(tx, removeUtxns); err != nil { return nil, err } - return removeTxs, nil + return removeUtxns, nil } -// FilterKnown returns txn hashes with known ones removed -func (utp *UnconfirmedTxnPool) FilterKnown(txns []cipher.SHA256) []cipher.SHA256 { +// GetUnknown returns txn hashes with known ones removed +func (utp *UnconfirmedTxnPool) GetUnknown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { var unknown []cipher.SHA256 + for _, h := range txns { - if !utp.txns.isExist(h) { + if hasKey, err := utp.txns.hasKey(tx, h); err != nil { + return nil, err + } else if !hasKey { unknown = append(unknown, h) } } - return unknown + + return unknown, nil } // GetKnown returns all known coin.Transactions from the pool, given hashes to select -func (utp *UnconfirmedTxnPool) GetKnown(txns []cipher.SHA256) coin.Transactions { +func (utp *UnconfirmedTxnPool) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { var known coin.Transactions + for _, h := range txns { - if tx, ok := utp.txns.get(h); ok { + if tx, err := utp.txns.get(tx, h); err != nil { + return nil, err + } else if tx != nil { known = append(known, tx.Txn) } } - return known + + return known, nil } // RecvOfAddresses returns unconfirmed receiving uxouts of addresses -func (utp *UnconfirmedTxnPool) RecvOfAddresses(bh coin.BlockHeader, - addrs []cipher.Address) (coin.AddressUxOuts, error) { +func (utp *UnconfirmedTxnPool) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { addrm := make(map[cipher.Address]struct{}, len(addrs)) for _, addr := range addrs { addrm[addr] = struct{}{} } + auxs := make(coin.AddressUxOuts, len(addrs)) - if err := utp.txns.forEach(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - for i, o := range tx.Txn.Out { + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + for i, o := range txn.Txn.Out { if _, ok := addrm[o.Address]; ok { - uxout, err := coin.CreateUnspent(bh, tx.Txn, i) + uxout, err := coin.CreateUnspent(bh, txn.Txn, i) if err != nil { return err } @@ -498,109 +500,97 @@ func (utp *UnconfirmedTxnPool) RecvOfAddresses(bh coin.BlockHeader, return auxs, nil } -// UnspentGetFunc callback function for querying unspent output of given hash -type UnspentGetFunc func(hash cipher.SHA256) (coin.UxOut, bool) +// txnOutputsForAddrs returns unspent outputs assigned to addresses in addrs, created by a set of transactions +func txnOutputsForAddrs(bh coin.BlockHeader, addrs []cipher.Address, txns []coin.Transaction) (coin.AddressUxOuts, error) { + if len(txns) == 0 || len(addrs) == 0 { + return nil, nil + } -// SpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses -// Looks at all inputs for unconfirmed txns, gets their source UxOut from the -// blockchain's unspent pool, and returns as coin.AddressUxOuts -func (utp *UnconfirmedTxnPool) SpendsOfAddresses(addrs []cipher.Address, - unspent blockdb.UnspentGetter) (coin.AddressUxOuts, error) { addrm := make(map[cipher.Address]struct{}, len(addrs)) for _, addr := range addrs { addrm[addr] = struct{}{} } auxs := make(coin.AddressUxOuts, len(addrs)) - if err := utp.txns.forEach(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - for _, h := range tx.Txn.In { - ux, ok := unspent.Get(h) - if !ok { - // unconfirm transaction's IN is not in the unspent pool, this should not happen - return fmt.Errorf("unconfirmed transaction's IN: %s is not in unspent pool", h.Hex()) - } - if _, ok := addrm[ux.Body.Address]; ok { - auxs[ux.Body.Address] = append(auxs[ux.Body.Address], ux) + for _, txn := range txns { + for i, o := range txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn, i) + if err != nil { + return nil, err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) } } - return nil - }); err != nil { - return coin.AddressUxOuts{}, fmt.Errorf("get unconfirmed spend error:%v", err) } + return auxs, nil } -// GetSpendingOutputs returns all spending outputs in unconfirmed tx pool. -func (utp *UnconfirmedTxnPool) GetSpendingOutputs(bcUnspent blockdb.UnspentPool) (coin.UxArray, error) { - outs := coin.UxArray{} - err := utp.txns.forEach(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - uxs, err := bcUnspent.GetArray(tx.Txn.In) - if err != nil { - return err - } +// GetIncomingOutputs returns all predicted incoming outputs. +func (utp *UnconfirmedTxnPool) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + var outs coin.UxArray - outs = append(outs, uxs...) + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + uxOuts := coin.CreateUnspents(bh, txn.Txn) + outs = append(outs, uxOuts...) return nil - }) - - if err != nil { - return coin.UxArray{}, fmt.Errorf("get unconfirmed spending outputs failed: %v", err) + }); err != nil { + return nil, err } return outs, nil } -// GetIncomingOutputs returns all predicted incoming outputs. -func (utp *UnconfirmedTxnPool) GetIncomingOutputs(bh coin.BlockHeader) coin.UxArray { - outs := coin.UxArray{} - utp.txns.forEach(func(_ cipher.SHA256, tx *UnconfirmedTxn) error { - uxOuts := coin.CreateUnspents(bh, tx.Txn) - outs = append(outs, uxOuts...) - return nil - }) - return outs -} - // Get returns the unconfirmed transaction of given tx hash. -func (utp *UnconfirmedTxnPool) Get(key cipher.SHA256) (*UnconfirmedTxn, bool) { - return utp.txns.get(key) +func (utp *UnconfirmedTxnPool) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) { + return utp.txns.get(tx, hash) } // GetTxns returns all transactions that can pass the filter -func (utp *UnconfirmedTxnPool) GetTxns(filter func(tx UnconfirmedTxn) bool) (txns []UnconfirmedTxn) { - if err := utp.txns.forEach(func(hash cipher.SHA256, tx *UnconfirmedTxn) error { - if filter(*tx) { - txns = append(txns, *tx) +func (utp *UnconfirmedTxnPool) GetTxns(tx *dbutil.Tx, filter func(UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + if filter(txn) { + txns = append(txns, txn) } return nil }); err != nil { - logger.Debugf("GetTxns error:%v", err) + logger.Errorf("GetTxns error: %v", err) + return nil, err } - return + + return txns, nil } // GetTxHashes returns transaction hashes that can pass the filter -func (utp *UnconfirmedTxnPool) GetTxHashes(filter func(tx UnconfirmedTxn) bool) (hashes []cipher.SHA256) { - if err := utp.txns.forEach(func(hash cipher.SHA256, tx *UnconfirmedTxn) error { - if filter(*tx) { +func (utp *UnconfirmedTxnPool) GetTxHashes(tx *dbutil.Tx, filter func(UnconfirmedTxn) bool) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := utp.txns.forEach(tx, func(hash cipher.SHA256, txn UnconfirmedTxn) error { + if filter(txn) { hashes = append(hashes, hash) } return nil }); err != nil { - logger.Debugf("GetTxHashes error:%v", err) + logger.Errorf("GetTxHashes error: %v", err) + return nil, err } - return + + return hashes, nil } -// ForEach iterate the pool with given callback function, -func (utp *UnconfirmedTxnPool) ForEach(f func(cipher.SHA256, *UnconfirmedTxn) error) error { - return utp.txns.forEach(f) +// ForEach iterate the pool with given callback function +func (utp *UnconfirmedTxnPool) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTxn) error) error { + return utp.txns.forEach(tx, f) } // GetUnspentsOfAddr returns unspent outputs of given address in unspent tx pool -func (utp *UnconfirmedTxnPool) GetUnspentsOfAddr(addr cipher.Address) coin.UxArray { - return utp.unspent.getByAddr(addr) +func (utp *UnconfirmedTxnPool) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + return utp.unspent.getByAddr(tx, addr) } // IsValid can be used as filter function @@ -614,8 +604,8 @@ func All(tx UnconfirmedTxn) bool { } // Len returns the number of unconfirmed transactions -func (utp *UnconfirmedTxnPool) Len() int { - return utp.txns.len() +func (utp *UnconfirmedTxnPool) Len(tx *dbutil.Tx) (uint64, error) { + return utp.txns.length(tx) } func nanoToTime(n int64) time.Time { diff --git a/src/visor/unconfirmed_txn_pooler_mock_test.go b/src/visor/unconfirmed_txn_pooler_mock_test.go index 1f5d823..ac7daed 100755 --- a/src/visor/unconfirmed_txn_pooler_mock_test.go +++ b/src/visor/unconfirmed_txn_pooler_mock_test.go @@ -10,11 +10,9 @@ import ( mock "github.com/stretchr/testify/mock" - bolt "github.com/boltdb/bolt" - cipher "github.com/skycoin/skycoin/src/cipher" coin "github.com/skycoin/skycoin/src/coin" - blockdb "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" ) // UnconfirmedTxnPoolerMock mock @@ -26,28 +24,10 @@ func NewUnconfirmedTxnPoolerMock() *UnconfirmedTxnPoolerMock { return &UnconfirmedTxnPoolerMock{} } -// FilterKnown mocked method -func (m *UnconfirmedTxnPoolerMock) FilterKnown(p0 []cipher.SHA256) []cipher.SHA256 { - - ret := m.Called(p0) - - var r0 []cipher.SHA256 - switch res := ret.Get(0).(type) { - case nil: - case []cipher.SHA256: - r0 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } - - return r0 - -} - // ForEach mocked method -func (m *UnconfirmedTxnPoolerMock) ForEach(p0 func(cipher.SHA256, *UnconfirmedTxn) error) error { +func (m *UnconfirmedTxnPoolerMock) ForEach(p0 *dbutil.Tx, p1 func(cipher.SHA256, UnconfirmedTxn) error) error { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 error switch res := ret.Get(0).(type) { @@ -63,9 +43,9 @@ func (m *UnconfirmedTxnPoolerMock) ForEach(p0 func(cipher.SHA256, *UnconfirmedTx } // Get mocked method -func (m *UnconfirmedTxnPoolerMock) Get(p0 cipher.SHA256) (*UnconfirmedTxn, bool) { +func (m *UnconfirmedTxnPoolerMock) Get(p0 *dbutil.Tx, p1 cipher.SHA256) (*UnconfirmedTxn, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 *UnconfirmedTxn switch res := ret.Get(0).(type) { @@ -76,10 +56,10 @@ func (m *UnconfirmedTxnPoolerMock) Get(p0 cipher.SHA256) (*UnconfirmedTxn, bool) panic(fmt.Sprintf("unexpected type: %v", res)) } - var r1 bool + var r1 error switch res := ret.Get(1).(type) { case nil: - case bool: + case error: r1 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -90,9 +70,9 @@ func (m *UnconfirmedTxnPoolerMock) Get(p0 cipher.SHA256) (*UnconfirmedTxn, bool) } // GetIncomingOutputs mocked method -func (m *UnconfirmedTxnPoolerMock) GetIncomingOutputs(p0 coin.BlockHeader) coin.UxArray { +func (m *UnconfirmedTxnPoolerMock) GetIncomingOutputs(p0 *dbutil.Tx, p1 coin.BlockHeader) (coin.UxArray, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 coin.UxArray switch res := ret.Get(0).(type) { @@ -103,37 +83,28 @@ func (m *UnconfirmedTxnPoolerMock) GetIncomingOutputs(p0 coin.BlockHeader) coin. panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 - -} - -// GetKnown mocked method -func (m *UnconfirmedTxnPoolerMock) GetKnown(p0 []cipher.SHA256) coin.Transactions { - - ret := m.Called(p0) - - var r0 coin.Transactions - switch res := ret.Get(0).(type) { + var r1 error + switch res := ret.Get(1).(type) { case nil: - case coin.Transactions: - r0 = res + case error: + r1 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + return r0, r1 } -// GetSpendingOutputs mocked method -func (m *UnconfirmedTxnPoolerMock) GetSpendingOutputs(p0 blockdb.UnspentPool) (coin.UxArray, error) { +// GetKnown mocked method +func (m *UnconfirmedTxnPoolerMock) GetKnown(p0 *dbutil.Tx, p1 []cipher.SHA256) (coin.Transactions, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 coin.UxArray + var r0 coin.Transactions switch res := ret.Get(0).(type) { case nil: - case coin.UxArray: + case coin.Transactions: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -153,9 +124,9 @@ func (m *UnconfirmedTxnPoolerMock) GetSpendingOutputs(p0 blockdb.UnspentPool) (c } // GetTxHashes mocked method -func (m *UnconfirmedTxnPoolerMock) GetTxHashes(p0 func(tx UnconfirmedTxn) bool) []cipher.SHA256 { +func (m *UnconfirmedTxnPoolerMock) GetTxHashes(p0 *dbutil.Tx, p1 func(tx UnconfirmedTxn) bool) ([]cipher.SHA256, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 []cipher.SHA256 switch res := ret.Get(0).(type) { @@ -166,14 +137,23 @@ func (m *UnconfirmedTxnPoolerMock) GetTxHashes(p0 func(tx UnconfirmedTxn) bool) panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } // GetTxns mocked method -func (m *UnconfirmedTxnPoolerMock) GetTxns(p0 func(tx UnconfirmedTxn) bool) []UnconfirmedTxn { +func (m *UnconfirmedTxnPoolerMock) GetTxns(p0 *dbutil.Tx, p1 func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) var r0 []UnconfirmedTxn switch res := ret.Get(0).(type) { @@ -184,37 +164,55 @@ func (m *UnconfirmedTxnPoolerMock) GetTxns(p0 func(tx UnconfirmedTxn) bool) []Un panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } -// GetUnspentsOfAddr mocked method -func (m *UnconfirmedTxnPoolerMock) GetUnspentsOfAddr(p0 cipher.Address) coin.UxArray { +// GetUnknown mocked method +func (m *UnconfirmedTxnPoolerMock) GetUnknown(p0 *dbutil.Tx, p1 []cipher.SHA256) ([]cipher.SHA256, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1) - var r0 coin.UxArray + var r0 []cipher.SHA256 switch res := ret.Get(0).(type) { case nil: - case coin.UxArray: + case []cipher.SHA256: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 } -// InjectTxn mocked method -func (m *UnconfirmedTxnPoolerMock) InjectTxn(p0 Blockchainer, p1 coin.Transaction) (bool, error) { +// GetUnspentsOfAddr mocked method +func (m *UnconfirmedTxnPoolerMock) GetUnspentsOfAddr(p0 *dbutil.Tx, p1 cipher.Address) (coin.UxArray, error) { ret := m.Called(p0, p1) - var r0 bool + var r0 coin.UxArray switch res := ret.Get(0).(type) { case nil: - case bool: + case coin.UxArray: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -233,51 +231,51 @@ func (m *UnconfirmedTxnPoolerMock) InjectTxn(p0 Blockchainer, p1 coin.Transactio } -// Len mocked method -func (m *UnconfirmedTxnPoolerMock) Len() int { +// InjectTransaction mocked method +func (m *UnconfirmedTxnPoolerMock) InjectTransaction(p0 *dbutil.Tx, p1 Blockchainer, p2 coin.Transaction, p3 int) (bool, *ErrTxnViolatesSoftConstraint, error) { - ret := m.Called() + ret := m.Called(p0, p1, p2, p3) - var r0 int + var r0 bool switch res := ret.Get(0).(type) { case nil: - case int: + case bool: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 - -} - -// RawTxns mocked method -func (m *UnconfirmedTxnPoolerMock) RawTxns() coin.Transactions { - - ret := m.Called() + var r1 *ErrTxnViolatesSoftConstraint + switch res := ret.Get(1).(type) { + case nil: + case *ErrTxnViolatesSoftConstraint: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } - var r0 coin.Transactions - switch res := ret.Get(0).(type) { + var r2 error + switch res := ret.Get(2).(type) { case nil: - case coin.Transactions: - r0 = res + case error: + r2 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + return r0, r1, r2 } -// RecvOfAddresses mocked method -func (m *UnconfirmedTxnPoolerMock) RecvOfAddresses(p0 coin.BlockHeader, p1 []cipher.Address) (coin.AddressUxOuts, error) { +// Len mocked method +func (m *UnconfirmedTxnPoolerMock) Len(p0 *dbutil.Tx) (uint64, error) { - ret := m.Called(p0, p1) + ret := m.Called(p0) - var r0 coin.AddressUxOuts + var r0 uint64 switch res := ret.Get(0).(type) { case nil: - case coin.AddressUxOuts: + case uint64: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -296,15 +294,15 @@ func (m *UnconfirmedTxnPoolerMock) RecvOfAddresses(p0 coin.BlockHeader, p1 []cip } -// Refresh mocked method -func (m *UnconfirmedTxnPoolerMock) Refresh(p0 Blockchainer, p1 int) ([]cipher.SHA256, error) { +// RawTxns mocked method +func (m *UnconfirmedTxnPoolerMock) RawTxns(p0 *dbutil.Tx) (coin.Transactions, error) { - ret := m.Called(p0, p1) + ret := m.Called(p0) - var r0 []cipher.SHA256 + var r0 coin.Transactions switch res := ret.Get(0).(type) { case nil: - case []cipher.SHA256: + case coin.Transactions: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -323,15 +321,15 @@ func (m *UnconfirmedTxnPoolerMock) Refresh(p0 Blockchainer, p1 int) ([]cipher.SH } -// RemoveInvalid mocked method -func (m *UnconfirmedTxnPoolerMock) RemoveInvalid(p0 Blockchainer) ([]cipher.SHA256, error) { +// RecvOfAddresses mocked method +func (m *UnconfirmedTxnPoolerMock) RecvOfAddresses(p0 *dbutil.Tx, p1 coin.BlockHeader, p2 []cipher.Address) (coin.AddressUxOuts, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1, p2) - var r0 []cipher.SHA256 + var r0 coin.AddressUxOuts switch res := ret.Get(0).(type) { case nil: - case []cipher.SHA256: + case coin.AddressUxOuts: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -350,58 +348,42 @@ func (m *UnconfirmedTxnPoolerMock) RemoveInvalid(p0 Blockchainer) ([]cipher.SHA2 } -// RemoveTransactions mocked method -func (m *UnconfirmedTxnPoolerMock) RemoveTransactions(p0 []cipher.SHA256) error { +// Refresh mocked method +func (m *UnconfirmedTxnPoolerMock) Refresh(p0 *dbutil.Tx, p1 Blockchainer, p2 int) ([]cipher.SHA256, error) { - ret := m.Called(p0) + ret := m.Called(p0, p1, p2) - var r0 error + var r0 []cipher.SHA256 switch res := ret.Get(0).(type) { case nil: - case error: + case []cipher.SHA256: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 - -} - -// RemoveTransactionsWithTx mocked method -func (m *UnconfirmedTxnPoolerMock) RemoveTransactionsWithTx(p0 *bolt.Tx, p1 []cipher.SHA256) { - - m.Called(p0, p1) - -} - -// SetAnnounced mocked method -func (m *UnconfirmedTxnPoolerMock) SetAnnounced(p0 cipher.SHA256, p1 int64) error { - - ret := m.Called(p0, p1) - - var r0 error - switch res := ret.Get(0).(type) { + var r1 error + switch res := ret.Get(1).(type) { case nil: case error: - r0 = res + r1 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0 + return r0, r1 } -// SpendsOfAddresses mocked method -func (m *UnconfirmedTxnPoolerMock) SpendsOfAddresses(p0 []cipher.Address, p1 blockdb.UnspentGetter) (coin.AddressUxOuts, error) { +// RemoveInvalid mocked method +func (m *UnconfirmedTxnPoolerMock) RemoveInvalid(p0 *dbutil.Tx, p1 Blockchainer) ([]cipher.SHA256, error) { ret := m.Called(p0, p1) - var r0 coin.AddressUxOuts + var r0 []cipher.SHA256 switch res := ret.Get(0).(type) { case nil: - case coin.AddressUxOuts: + case []cipher.SHA256: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) @@ -420,38 +402,38 @@ func (m *UnconfirmedTxnPoolerMock) SpendsOfAddresses(p0 []cipher.Address, p1 blo } -// InjectTransaction mocked method -func (m *UnconfirmedTxnPoolerMock) InjectTransaction(p0 Blockchainer, p1 coin.Transaction, p2 int) (bool, *ErrTxnViolatesSoftConstraint, error) { +// RemoveTransactions mocked method +func (m *UnconfirmedTxnPoolerMock) RemoveTransactions(p0 *dbutil.Tx, p1 []cipher.SHA256) error { - ret := m.Called(p0, p1, p2) + ret := m.Called(p0, p1) - var r0 bool + var r0 error switch res := ret.Get(0).(type) { case nil: - case bool: + case error: r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - var r1 *ErrTxnViolatesSoftConstraint - switch res := ret.Get(1).(type) { - case nil: - case *ErrTxnViolatesSoftConstraint: - r1 = res - default: - panic(fmt.Sprintf("unexpected type: %v", res)) - } + return r0 - var r2 error - switch res := ret.Get(2).(type) { +} + +// SetTxnsAnnounced mocked method +func (m *UnconfirmedTxnPoolerMock) SetTxnsAnnounced(p0 *dbutil.Tx, p1 map[cipher.SHA256]int64) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { case nil: case error: - r2 = res + r0 = res default: panic(fmt.Sprintf("unexpected type: %v", res)) } - return r0, r1, r2 + return r0 } diff --git a/src/visor/unspent_pooler_mock_test.go b/src/visor/unspent_pooler_mock_test.go new file mode 100755 index 0000000..0061373 --- /dev/null +++ b/src/visor/unspent_pooler_mock_test.go @@ -0,0 +1,277 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package visor + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + dbutil "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// UnspentPoolerMock mock +type UnspentPoolerMock struct { + mock.Mock +} + +func NewUnspentPoolerMock() *UnspentPoolerMock { + return &UnspentPoolerMock{} +} + +// AddressCount mocked method +func (m *UnspentPoolerMock) AddressCount(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Contains mocked method +func (m *UnspentPoolerMock) Contains(p0 *dbutil.Tx, p1 cipher.SHA256) (bool, error) { + + ret := m.Called(p0, p1) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Get mocked method +func (m *UnspentPoolerMock) Get(p0 *dbutil.Tx, p1 cipher.SHA256) (*coin.UxOut, error) { + + ret := m.Called(p0, p1) + + var r0 *coin.UxOut + switch res := ret.Get(0).(type) { + case nil: + case *coin.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAll mocked method +func (m *UnspentPoolerMock) GetAll(p0 *dbutil.Tx) (coin.UxArray, error) { + + ret := m.Called(p0) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetArray mocked method +func (m *UnspentPoolerMock) GetArray(p0 *dbutil.Tx, p1 []cipher.SHA256) (coin.UxArray, error) { + + ret := m.Called(p0, p1) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnspentsOfAddrs mocked method +func (m *UnspentPoolerMock) GetUnspentsOfAddrs(p0 *dbutil.Tx, p1 []cipher.Address) (coin.AddressUxOuts, error) { + + ret := m.Called(p0, p1) + + var r0 coin.AddressUxOuts + switch res := ret.Get(0).(type) { + case nil: + case coin.AddressUxOuts: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUxHash mocked method +func (m *UnspentPoolerMock) GetUxHash(p0 *dbutil.Tx) (cipher.SHA256, error) { + + ret := m.Called(p0) + + var r0 cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Len mocked method +func (m *UnspentPoolerMock) Len(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// MaybeBuildIndexes mocked method +func (m *UnspentPoolerMock) MaybeBuildIndexes(p0 *dbutil.Tx, p1 uint64) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ProcessBlock mocked method +func (m *UnspentPoolerMock) ProcessBlock(p0 *dbutil.Tx, p1 *coin.SignedBlock) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/src/visor/verify.go b/src/visor/verify.go index b1f991d..ddda6a9 100755 --- a/src/visor/verify.go +++ b/src/visor/verify.go @@ -61,7 +61,7 @@ NOTE: Due to a bug which allowed overflowing output coin hours to be included in When creating or receiving a single transaction from the network, it is treated as a HARD constraint. These methods should be called via the Blockchain object when possible, -using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnAllConstraints +using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnSoftHardConstraints since data from the blockchain and unspent output set are required to fully validate a transaction. */ @@ -109,6 +109,25 @@ func (e ErrTxnViolatesSoftConstraint) Error() string { return fmt.Sprintf("Transaction violates soft constraint: %v", e.Err) } +// ErrTxnViolatesUserConstraint is returned when a transaction violates user constraints +type ErrTxnViolatesUserConstraint struct { + Err error +} + +// NewErrTxnViolatesUserConstraint creates ErrTxnViolatesUserConstraint +func NewErrTxnViolatesUserConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesUserConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesUserConstraint) Error() string { + return fmt.Sprintf("Transaction violates user constraint: %v", e.Err) +} + // VerifySingleTxnSoftConstraints returns an error if any "soft" constraint are violated. // "soft" constaints are enforced at the network and block publication level, // but are not enforced at the blockchain level. @@ -269,3 +288,18 @@ func verifyTxnHardConstraints(txn coin.Transaction, head *coin.SignedBlock, uxIn // to allow existing blocks which violate the overflow rules to pass. return coin.VerifyTransactionHoursSpending(head.Time(), uxIn, uxOut) } + +// VerifySingleTxnUserConstraints applies additional verification for a +// transaction created by the user. +// This is distinct from transactions created by other users (i.e. received over the network), +// and from transactions included in blocks. +func VerifySingleTxnUserConstraints(txn coin.Transaction) error { + for _, o := range txn.Out { + if o.Address.Null() { + err := errors.New("Transaction output is sent to the null address") + return NewErrTxnViolatesUserConstraint(err) + } + } + + return nil +} diff --git a/src/visor/visor.go b/src/visor/visor.go index 3ed3633..423a5d1 100755 --- a/src/visor/visor.go +++ b/src/visor/visor.go @@ -7,27 +7,20 @@ import ( "time" - "github.com/boltdb/bolt" + "github.com/sirupsen/logrus" "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" "github.com/skycoin/skycoin/src/util/droplet" "github.com/skycoin/skycoin/src/util/utc" "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" "github.com/skycoin/skycoin/src/visor/historydb" "github.com/skycoin/skycoin/src/wallet" "github.com/skycoin/skycoin/src/util/logging" ) -const ( - // MaxDropletPrecision represents the decimal precision of droplets - MaxDropletPrecision uint64 = 3 - - //DefaultMaxBlockSize is max block size - DefaultMaxBlockSize int = 32 * 1024 -) - var ( logger = logging.MustGetLogger("visor") @@ -46,10 +39,25 @@ func MaxDropletDivisor() uint64 { } func init() { + sanityCheck() // Compute maxDropletDivisor from precision maxDropletDivisor = calculateDivisor(MaxDropletPrecision) } +func sanityCheck() { + if InitialUnlockedCount > DistributionAddressesTotal { + logger.Panic("unlocked addresses > total distribution addresses") + } + + if uint64(len(distributionAddresses)) != DistributionAddressesTotal { + logger.Panic("available distribution addresses > total allowed distribution addresses") + } + + if DistributionAddressInitialBalance*DistributionAddressesTotal > MaxCoinSupply { + logger.Panic("total balance in distribution addresses > max coin supply") + } +} + func calculateDivisor(precision uint64) uint64 { if precision > droplet.Exponent { logger.Panic("precision must be <= droplet.Exponent") @@ -89,18 +97,6 @@ type Config struct { //Secret key of blockchain authority (if master) BlockchainSeckey cipher.SecKey - // How often new blocks are created by the master, in seconds - BlockCreationInterval uint64 - // How often an unconfirmed txn is checked against the blockchain - UnconfirmedCheckInterval time.Duration - // How long we'll hold onto an unconfirmed txn - UnconfirmedMaxAge time.Duration - // How often to check the unconfirmed pool for transactions that become valid - UnconfirmedRefreshRate time.Duration - // How often to remove transactions that become permanently invalid from the unconfirmed pool - UnconfirmedRemoveInvalidRate time.Duration - // How often to rebroadcast unconfirmed transactions - UnconfirmedResendPeriod time.Duration // Maximum size of a block, in bytes. MaxBlockSize int @@ -119,8 +115,6 @@ type Config struct { GenesisCoinVolume uint64 // bolt db file path DBPath string - // open bolt db read-only - DBReadOnly bool // enable arbitrating mode Arbitrating bool // wallet directory @@ -145,15 +139,7 @@ func NewVisorConfig() Config { BlockchainPubkey: cipher.PubKey{}, BlockchainSeckey: cipher.SecKey{}, - BlockCreationInterval: 10, - //BlockCreationForceInterval: 120, //create block if no block within this many seconds - - UnconfirmedCheckInterval: time.Hour * 2, - UnconfirmedMaxAge: time.Hour * 48, - UnconfirmedRefreshRate: time.Minute, - UnconfirmedRemoveInvalidRate: time.Minute, - UnconfirmedResendPeriod: time.Minute, - MaxBlockSize: DefaultMaxBlockSize, + MaxBlockSize: DefaultMaxBlockSize, GenesisAddress: cipher.Address{}, GenesisSignature: cipher.Sig{}, @@ -175,124 +161,145 @@ func (c Config) Verify() error { return nil } -// historyer is the interface that provides methods for accessing history data that are parsed from blockchain. -type historyer interface { - GetUxout(uxid cipher.SHA256) (*historydb.UxOut, error) - ParseBlock(b *coin.Block) error - GetTransaction(hash cipher.SHA256) (*historydb.Transaction, error) - GetAddrUxOuts(address cipher.Address) ([]*historydb.UxOut, error) - GetAddrTxns(address cipher.Address) ([]historydb.Transaction, error) - ForEach(f func(tx *historydb.Transaction) error) error - ResetIfNeed() error - ParsedHeight() int64 +//go:generate go install +//go:generate goautomock -template=testify Historyer + +// Historyer is the interface that provides methods for accessing history data that are parsed from blockchain. +type Historyer interface { + GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]*historydb.UxOut, error) + ParseBlock(tx *dbutil.Tx, b coin.Block) error + GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) + GetAddrUxOuts(tx *dbutil.Tx, address cipher.Address) ([]*historydb.UxOut, error) + GetAddressTxns(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) + NeedsReset(tx *dbutil.Tx) (bool, error) + Erase(tx *dbutil.Tx) error + ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) + ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error } // Blockchainer is the interface that provides methods for accessing the blockchain data type Blockchainer interface { - GetGenesisBlock() *coin.SignedBlock - GetBlocks(start, end uint64) ([]coin.SignedBlock, error) - GetLastBlocks(n uint64) ([]coin.SignedBlock, error) - GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) - GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) - Unspent() blockdb.UnspentPool - Len() uint64 - Head() (*coin.SignedBlock, error) - HeadSeq() uint64 - Time() uint64 - NewBlock(txns coin.Transactions, currentTime uint64) (*coin.Block, error) - ExecuteBlockWithTx(tx *bolt.Tx, sb *coin.SignedBlock) error - VerifyBlockTxnConstraints(tx coin.Transaction) error - VerifySingleTxnHardConstraints(tx coin.Transaction) error - VerifySingleTxnAllConstraints(tx coin.Transaction, maxSize int) error - TransactionFee(t *coin.Transaction) (uint64, error) - Notify(b coin.Block) - BindListener(bl BlockListener) - UpdateDB(f func(tx *bolt.Tx) error) error + GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) + GetBlocks(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) + GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) + GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) + Unspent() blockdb.UnspentPooler + Len(tx *dbutil.Tx) (uint64, error) + Head(tx *dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(tx *dbutil.Tx) (uint64, bool, error) + Time(tx *dbutil.Tx) (uint64, error) + NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) + ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, maxSize int) error + TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator } // UnconfirmedTxnPooler is the interface that provides methods for // accessing the unconfirmed transaction pool type UnconfirmedTxnPooler interface { - SetAnnounced(hash cipher.SHA256, t int64) error - InjectTransaction(bc Blockchainer, t coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) - RawTxns() coin.Transactions - RemoveTransactions(txns []cipher.SHA256) error - RemoveTransactionsWithTx(tx *bolt.Tx, txns []cipher.SHA256) - Refresh(bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) - RemoveInvalid(bc Blockchainer) ([]cipher.SHA256, error) - FilterKnown(txns []cipher.SHA256) []cipher.SHA256 - GetKnown(txns []cipher.SHA256) coin.Transactions - RecvOfAddresses(bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) - SpendsOfAddresses(addrs []cipher.Address, unspent blockdb.UnspentGetter) (coin.AddressUxOuts, error) - GetSpendingOutputs(unspent blockdb.UnspentPool) (coin.UxArray, error) - GetIncomingOutputs(bh coin.BlockHeader) coin.UxArray - Get(hash cipher.SHA256) (*UnconfirmedTxn, bool) - GetTxns(filter func(tx UnconfirmedTxn) bool) []UnconfirmedTxn - GetTxHashes(filter func(tx UnconfirmedTxn) bool) []cipher.SHA256 - ForEach(f func(cipher.SHA256, *UnconfirmedTxn) error) error - GetUnspentsOfAddr(addr cipher.Address) coin.UxArray - Len() int + SetTxnsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error + InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) + RawTxns(tx *dbutil.Tx) (coin.Transactions, error) + RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error + Refresh(tx *dbutil.Tx, bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) + RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) + GetUnknown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) + GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) + RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) + GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) + Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) + GetTxns(tx *dbutil.Tx, filter func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) + GetTxHashes(tx *dbutil.Tx, filter func(tx UnconfirmedTxn) bool) ([]cipher.SHA256, error) + ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTxn) error) error + GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) + Len(tx *dbutil.Tx) (uint64, error) } // Visor manages the Blockchain as both a Master and a Normal type Visor struct { Config Config + DB *dbutil.DB // Unconfirmed transactions, held for relay until we get block confirmation Unconfirmed UnconfirmedTxnPooler Blockchain Blockchainer Wallets *wallet.Service StartedAt time.Time - history historyer - bcParser *BlockchainParser - db *bolt.DB + history Historyer } // NewVisor creates a Visor for managing the blockchain database -func NewVisor(c Config, db *bolt.DB) (*Visor, error) { - logger.Debug("Creating new visor") +func NewVisor(c Config, db *dbutil.DB) (*Visor, error) { + logger.Info("Creating new visor") if c.IsMaster { - logger.Debug("Visor is master") + logger.Info("Visor is master") } if err := c.Verify(); err != nil { return nil, err } - db, bc, err := loadBlockchain(db, c.BlockchainPubkey, c.Arbitrating) + // Loads wallet + wltServConfig := wallet.Config{ + WalletDir: c.WalletDirectory, + CryptoType: c.WalletCryptoType, + EnableWalletAPI: c.EnableWalletAPI, + EnableSeedAPI: c.EnableSeedAPI, + } + + wltServ, err := wallet.NewService(wltServConfig) if err != nil { return nil, err } - history, err := historydb.New(db) + if !db.IsReadOnly() { + if err := CreateBuckets(db); err != nil { + logger.WithError(err).Error("CreateBuckets failed") + return nil, err + } + } + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: c.BlockchainPubkey, + Arbitrating: c.Arbitrating, + }) if err != nil { return nil, err } - // creates blockchain parser instance - bp := NewBlockchainParser(history, bc) + history := historydb.New() - bc.BindListener(bp.FeedBlock) + if !db.IsReadOnly() { + if err := db.Update("build unspent indexes and init history", func(tx *dbutil.Tx) error { + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } - wltServConfig := wallet.Config{ - WalletDir: c.WalletDirectory, - CryptoType: c.WalletCryptoType, - EnableWalletAPI: c.EnableWalletAPI, - EnableSeedAPI: c.EnableSeedAPI, + if err := bc.Unspent().MaybeBuildIndexes(tx, headSeq); err != nil { + return err + } + + return initHistory(tx, bc, history) + }); err != nil { + return nil, err + } } - wltServ, err := wallet.NewService(wltServConfig) + utp, err := NewUnconfirmedTxnPool(db) if err != nil { return nil, err } v := &Visor{ Config: c, - db: db, + DB: db, Blockchain: bc, - Unconfirmed: NewUnconfirmedTxnPool(db), + Unconfirmed: utp, history: history, - bcParser: bp, Wallets: wltServ, StartedAt: time.Now(), } @@ -300,39 +307,99 @@ func NewVisor(c Config, db *bolt.DB) (*Visor, error) { return v, nil } -// Run starts the visor -func (vs *Visor) Run() error { - if err := vs.maybeCreateGenesisBlock(); err != nil { +// Init initializes starts the visor +func (vs *Visor) Init() error { + logger.Info("Visor init") + + if vs.DB.IsReadOnly() { + return nil + } + + return vs.DB.Update("visor init", func(tx *dbutil.Tx) error { + if err := vs.maybeCreateGenesisBlock(tx); err != nil { + return err + } + + removed, err := vs.Unconfirmed.RemoveInvalid(tx, vs.Blockchain) + if err != nil { + return err + } + logger.Infof("Removed %d invalid txns from pool", len(removed)) + + return nil + }) +} + +func initHistory(tx *dbutil.Tx, bc *Blockchain, history *historydb.HistoryDB) error { + logger.Info("Visor initHistory") + + shouldReset, err := history.NeedsReset(tx) + if err != nil { + return err + } + + if !shouldReset { + return nil + } + + logger.Info("Resetting historyDB") + + if err := history.Erase(tx); err != nil { return err } - removed, err := vs.RemoveInvalidUnconfirmed() + // Reparse the history up to the blockchain head + headSeq, _, err := bc.HeadSeq(tx) if err != nil { return err } - logger.Infof("Removed %d invalid txns from pool", len(removed)) - return vs.bcParser.Run() + if err := parseHistoryTo(tx, history, bc, headSeq); err != nil { + logger.WithError(err).Error("parseHistoryTo failed") + return err + } + + return nil } -// Shutdown shuts down the visor -func (vs *Visor) Shutdown() { - defer logger.Info("DB and BlockchainParser closed") +func parseHistoryTo(tx *dbutil.Tx, history *historydb.HistoryDB, bc *Blockchain, height uint64) error { + logger.Info("Visor parseHistoryTo") - vs.bcParser.Shutdown() + parsedBlockSeq, _, err := history.ParsedBlockSeq(tx) + if err != nil { + return err + } + + for i := uint64(0); i < height-parsedBlockSeq; i++ { + b, err := bc.GetSignedBlockBySeq(tx, parsedBlockSeq+i+1) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("no block exists in depth: %d", parsedBlockSeq+i+1) + } - if err := vs.db.Close(); err != nil { - logger.Errorf("db.Close() error: %v", err) + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } } + + return nil } // maybeCreateGenesisBlock creates a genesis block if necessary -func (vs *Visor) maybeCreateGenesisBlock() error { - if vs.Blockchain.GetGenesisBlock() != nil { +func (vs *Visor) maybeCreateGenesisBlock(tx *dbutil.Tx) error { + logger.Info("Visor maybeCreateGenesisBlock") + gb, err := vs.Blockchain.GetGenesisBlock(tx) + if err != nil { + return err + } + if gb != nil { return nil } - logger.Debug("Create genesis block") + logger.Info("Create genesis block") vs.GenesisPreconditions() b, err := coin.NewGenesisBlock(vs.Config.GenesisAddress, vs.Config.GenesisCoinVolume, vs.Config.GenesisTimestamp) if err != nil { @@ -342,7 +409,7 @@ func (vs *Visor) maybeCreateGenesisBlock() error { var sb coin.SignedBlock // record the signature of genesis block if vs.Config.IsMaster { - sb = vs.SignBlock(*b) + sb = vs.signBlock(*b) logger.Infof("Genesis block signature=%s", sb.Sig.Hex()) } else { sb = coin.SignedBlock{ @@ -351,7 +418,7 @@ func (vs *Visor) maybeCreateGenesisBlock() error { } } - return vs.ExecuteSignedBlock(sb) + return vs.executeSignedBlock(tx, sb) } // GenesisPreconditions panics if conditions for genesis block are not met @@ -366,29 +433,48 @@ func (vs *Visor) GenesisPreconditions() { // RefreshUnconfirmed checks unconfirmed txns against the blockchain and returns // all transaction that turn to valid. func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { - return vs.Unconfirmed.Refresh(vs.Blockchain, vs.Config.MaxBlockSize) + var hashes []cipher.SHA256 + if err := vs.DB.Update("RefreshUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.Refresh(tx, vs.Blockchain, vs.Config.MaxBlockSize) + return err + }); err != nil { + return nil, err + } + + return hashes, nil } // RemoveInvalidUnconfirmed removes transactions that become permanently invalid // (by violating hard constraints) from the pool. // Returns the transaction hashes that were removed. func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { - return vs.Unconfirmed.RemoveInvalid(vs.Blockchain) + var hashes []cipher.SHA256 + if err := vs.DB.Update("RemoveInvalidUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.RemoveInvalid(tx, vs.Blockchain) + return err + }); err != nil { + return nil, err + } + + return hashes, nil } // CreateBlock creates a SignedBlock from pending transactions -func (vs *Visor) CreateBlock(when uint64) (coin.SignedBlock, error) { +func (vs *Visor) createBlock(tx *dbutil.Tx, when uint64) (coin.SignedBlock, error) { if !vs.Config.IsMaster { logger.Panic("Only master chain can create blocks") } - var sb coin.SignedBlock - // Gather all unconfirmed transactions - txns := vs.Unconfirmed.RawTxns() + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return coin.SignedBlock{}, err + } if len(txns) == 0 { - return sb, errors.New("No transactions") + return coin.SignedBlock{}, errors.New("No transactions") } logger.Infof("Unconfirmed pool has %d transactions pending", len(txns)) @@ -396,8 +482,13 @@ func (vs *Visor) CreateBlock(when uint64) (coin.SignedBlock, error) { // Filter transactions that violate all constraints var filteredTxns coin.Transactions for _, txn := range txns { - if err := vs.Blockchain.VerifySingleTxnAllConstraints(txn, vs.Config.MaxBlockSize); err != nil { - logger.Warningf("Transaction %s violates constraints: %v", txn.TxIDHex(), err) + if err := vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.MaxBlockSize); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + logger.Warningf("Transaction %s violates constraints: %v", txn.TxIDHex(), err) + default: + return coin.SignedBlock{}, err + } } else { filteredTxns = append(filteredTxns, txn) } @@ -412,11 +503,16 @@ func (vs *Visor) CreateBlock(when uint64) (coin.SignedBlock, error) { if len(txns) == 0 { logger.Info("No transactions after filtering for constraint violations") - return sb, errors.New("No transactions after filtering for constraint violations") + return coin.SignedBlock{}, errors.New("No transactions after filtering for constraint violations") + } + + head, err := vs.Blockchain.Head(tx) + if err != nil { + return coin.SignedBlock{}, err } // Sort them by highest fee per kilobyte - txns = coin.SortTransactions(txns, vs.Blockchain.TransactionFee) + txns = coin.SortTransactions(txns, vs.Blockchain.TransactionFee(tx, head.Time())) // Apply block size transaction limit txns = txns.TruncateBytesTo(vs.Config.MaxBlockSize) @@ -427,21 +523,28 @@ func (vs *Visor) CreateBlock(when uint64) (coin.SignedBlock, error) { logger.Infof("Creating new block with %d transactions, head time %d", len(txns), when) - b, err := vs.Blockchain.NewBlock(txns, when) + b, err := vs.Blockchain.NewBlock(tx, txns, when) if err != nil { logger.Warningf("Blockchain.NewBlock failed: %v", err) - return sb, err + return coin.SignedBlock{}, err } - return vs.SignBlock(*b), nil + return vs.signBlock(*b), nil } // CreateAndExecuteBlock creates a SignedBlock from pending transactions and executes it func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { - sb, err := vs.CreateBlock(uint64(utc.UnixNow())) - if err == nil { - return sb, vs.ExecuteSignedBlock(sb) - } + var sb coin.SignedBlock + + err := vs.DB.Update("CreateAndExecuteBlock", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.createBlock(tx, uint64(utc.UnixNow())) + if err != nil { + return err + } + + return vs.executeSignedBlock(tx, sb) + }) return sb, err } @@ -449,33 +552,38 @@ func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { // ExecuteSignedBlock adds a block to the blockchain, or returns error. // Blocks must be executed in sequence, and be signed by the master server func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { + return vs.DB.Update("ExecuteSignedBlock", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, b) + }) +} + +// executeSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by the master server +func (vs *Visor) executeSignedBlock(tx *dbutil.Tx, b coin.SignedBlock) error { if err := b.VerifySignature(vs.Config.BlockchainPubkey); err != nil { return err } - if err := vs.db.Update(func(tx *bolt.Tx) error { - if err := vs.Blockchain.ExecuteBlockWithTx(tx, &b); err != nil { - return err - } + if err := vs.Blockchain.ExecuteBlock(tx, &b); err != nil { + return err + } - // Remove the transactions in the Block from the unconfirmed pool - txHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) - for _, tx := range b.Block.Body.Transactions { - txHashes = append(txHashes, tx.Hash()) - } - vs.Unconfirmed.RemoveTransactionsWithTx(tx, txHashes) + // Remove the transactions in the Block from the unconfirmed pool + txHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) + for _, tx := range b.Block.Body.Transactions { + txHashes = append(txHashes, tx.Hash()) + } - return nil - }); err != nil { + if err := vs.Unconfirmed.RemoveTransactions(tx, txHashes); err != nil { return err } - vs.Blockchain.Notify(b.Block) - return nil + // Update the HistoryDB + return vs.history.ParseBlock(tx, b.Block) } -// SignBlock signs a block for master. Will panic if anything is invalid -func (vs *Visor) SignBlock(b coin.Block) coin.SignedBlock { +// signBlock signs a block for master. Will panic if anything is invalid +func (vs *Visor) signBlock(b coin.Block) coin.SignedBlock { if !vs.Config.IsMaster { logger.Panic("Only master chain can sign blocks") } @@ -492,85 +600,199 @@ func (vs *Visor) SignBlock(b coin.Block) coin.SignedBlock { Return Data */ -// GetUnspentOutputs makes local copy and update when block header changes -// update should lock -// isolate effect of threading -// call .Array() to get []UxOut array -func (vs *Visor) GetUnspentOutputs() ([]coin.UxOut, error) { - return vs.Blockchain.Unspent().GetAll() +// GetAllUnspentOutputs returns all unspent outputs +func (vs *Visor) GetAllUnspentOutputs() (coin.UxArray, error) { + var ux []coin.UxOut + if err := vs.DB.View("GetAllUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + ux, err = vs.Blockchain.Unspent().GetAll(tx) + return err + }); err != nil { + return nil, err + } + + return ux, nil +} + +// GetUnspentOutputs returns unspent outputs from the pool, queried by hashes. +// If any do not exist, ErrUnspentNotExist is returned +func (vs *Visor) GetUnspentOutputs(hashes []cipher.SHA256) (coin.UxArray, error) { + var outputs coin.UxArray + if err := vs.DB.View("GetUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + outputs, err = vs.Blockchain.Unspent().GetArray(tx, hashes) + return err + }); err != nil { + return nil, err + } + + return outputs, nil } // UnconfirmedSpendingOutputs returns all spending outputs in unconfirmed tx pool func (vs *Visor) UnconfirmedSpendingOutputs() (coin.UxArray, error) { - return vs.Unconfirmed.GetSpendingOutputs(vs.Blockchain.Unspent()) + var uxa coin.UxArray + + if err := vs.DB.View("UnconfirmedSpendingOutputs", func(tx *dbutil.Tx) error { + var inputs []cipher.SHA256 + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return err + } + + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err = vs.Blockchain.Unspent().GetArray(tx, inputs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil } // UnconfirmedIncomingOutputs returns all predicted outputs that are in pending tx pool func (vs *Visor) UnconfirmedIncomingOutputs() (coin.UxArray, error) { - head, err := vs.Blockchain.Head() - if err != nil { - return coin.UxArray{}, err - } + var uxa coin.UxArray - return vs.Unconfirmed.GetIncomingOutputs(head.Head), nil -} + if err := vs.DB.View("UnconfirmedIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } -// GetSignedBlocksSince returns signed blocks in an inclusive range of [seq+1, seq+ct] -func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { - avail := uint64(0) - head, err := vs.Blockchain.Head() - if err != nil { + uxa, err = vs.Unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { return nil, err } - headSeq := head.Seq() - if headSeq > seq { - avail = headSeq - seq - } - if avail < ct { - ct = avail - } - if ct == 0 { - return nil, nil - } + return uxa, nil +} + +// GetSignedBlocksSince returns N signed blocks more recent than Seq. Does not return nil. +func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock - blocks := make([]coin.SignedBlock, 0, ct) - for j := uint64(0); j < ct; j++ { - i := seq + 1 + j - b, err := vs.Blockchain.GetBlockBySeq(i) + if err := vs.DB.View("GetSignedBlocksSince", func(tx *dbutil.Tx) error { + avail := uint64(0) + head, err := vs.Blockchain.Head(tx) if err != nil { - return nil, err + return err + } + + headSeq := head.Seq() + if headSeq > seq { + avail = headSeq - seq + } + if avail < ct { + ct = avail + } + if ct == 0 { + return nil + } + + blocks = make([]coin.SignedBlock, 0, ct) + for j := uint64(0); j < ct; j++ { + i := seq + 1 + j + b, err := vs.Blockchain.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + blocks = append(blocks, *b) } - blocks = append(blocks, *b) + return nil + }); err != nil { + return nil, err } + return blocks, nil } -// HeadBkSeq returns the highest BkSeq we know, returns -1 if the chain is empty -func (vs *Visor) HeadBkSeq() uint64 { - return vs.Blockchain.HeadSeq() +// HeadBkSeq returns the highest BkSeq we know, returns false in the 2nd return value +// if the blockchain is empty +func (vs *Visor) HeadBkSeq() (uint64, bool, error) { + var headSeq uint64 + var ok bool + + if err := vs.DB.View("HeadBkSeq", func(tx *dbutil.Tx) error { + var err error + headSeq, ok, err = vs.Blockchain.HeadSeq(tx) + return err + }); err != nil { + return 0, false, err + } + + return headSeq, ok, nil } // GetBlockchainMetadata returns descriptive Blockchain information func (vs *Visor) GetBlockchainMetadata() (*BlockchainMetadata, error) { - return NewBlockchainMetadata(vs) + var head *coin.SignedBlock + var unconfirmedLen, unspentsLen uint64 + + if err := vs.DB.View("GetBlockchainMetadata", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + unconfirmedLen, err = vs.Unconfirmed.Len(tx) + if err != nil { + return err + } + + unspentsLen, err = vs.Blockchain.Unspent().Len(tx) + return err + }); err != nil { + return nil, err + } + + return NewBlockchainMetadata(head, unconfirmedLen, unspentsLen) } // GetBlock returns a copy of the block at seq. Returns error if seq out of range -// Move to blockdb func (vs *Visor) GetBlock(seq uint64) (*coin.SignedBlock, error) { - var b coin.SignedBlock - if seq > vs.Blockchain.HeadSeq() { - return &b, errors.New("Block seq out of range") + var b *coin.SignedBlock + + if err := vs.DB.View("GetBlock", func(tx *dbutil.Tx) error { + headSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } + + if !ok || seq > headSeq { + return errors.New("Block seq out of range") + } + + b, err = vs.Blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err } - return vs.Blockchain.GetBlockBySeq(seq) + return b, nil } -// GetBlocks returns multiple blocks between start and end (not including end). +// GetBlocks returns multiple blocks between start and end (not including end). Returns +// empty slice if unable to fulfill request, it does not return nil. func (vs *Visor) GetBlocks(start, end uint64) ([]coin.SignedBlock, error) { - return vs.Blockchain.GetBlocks(start, end) + var blocks []coin.SignedBlock + + if err := vs.DB.View("GetBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.Blockchain.GetBlocks(tx, start, end) + return err + }); err != nil { + return nil, err + } + + return blocks, nil } // InjectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not @@ -579,7 +801,18 @@ func (vs *Visor) GetBlocks(start, end uint64) ([]coin.SignedBlock, error) { // If the transaction violates hard constraints, it is rejected, and error will not be nil. // If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. func (vs *Visor) InjectTransaction(txn coin.Transaction) (bool, *ErrTxnViolatesSoftConstraint, error) { - return vs.Unconfirmed.InjectTransaction(vs.Blockchain, txn, vs.Config.MaxBlockSize) + var known bool + var softErr *ErrTxnViolatesSoftConstraint + + if err := vs.DB.Update("InjectTransaction", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = vs.Unconfirmed.InjectTransaction(tx, vs.Blockchain, txn, vs.Config.MaxBlockSize) + return err + }); err != nil { + return false, nil, err + } + + return known, softErr, nil } // InjectTransactionStrict records a coin.Transaction to the UnconfirmedTxnPool if the txn is not @@ -587,12 +820,25 @@ func (vs *Visor) InjectTransaction(txn coin.Transaction) (bool, *ErrTxnViolatesS // The bool return value is whether or not the transaction was already in the pool. // If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. func (vs *Visor) InjectTransactionStrict(txn coin.Transaction) (bool, error) { - if err := vs.Blockchain.VerifySingleTxnAllConstraints(txn, vs.Config.MaxBlockSize); err != nil { + if err := VerifySingleTxnUserConstraints(txn); err != nil { + return false, err + } + + var known bool + + if err := vs.DB.Update("InjectTransactionStrict", func(tx *dbutil.Tx) error { + err := vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.MaxBlockSize) + if err != nil { + return err + } + + known, _, err = vs.Unconfirmed.InjectTransaction(tx, vs.Blockchain, txn, vs.Config.MaxBlockSize) + return err + }); err != nil { return false, err } - known, _, err := vs.Unconfirmed.InjectTransaction(vs.Blockchain, txn, vs.Config.MaxBlockSize) - return known, err + return known, nil } // GetAddressTxns returns the Transactions whose unspents give coins to a cipher.Address. @@ -600,87 +846,138 @@ func (vs *Visor) InjectTransactionStrict(txn coin.Transaction) (bool, error) { func (vs *Visor) GetAddressTxns(a cipher.Address) ([]Transaction, error) { var txns []Transaction - mxSeq := vs.HeadBkSeq() - txs, err := vs.history.GetAddrTxns(a) - if err != nil { - return []Transaction{}, err - } - - for _, tx := range txs { - h := mxSeq - tx.BlockSeq + 1 - - bk, err := vs.GetBlockBySeq(tx.BlockSeq) + if err := vs.DB.View("GetAddressTxns", func(tx *dbutil.Tx) error { + txs, err := vs.history.GetAddressTxns(tx, a) if err != nil { - return []Transaction{}, err + return err } - if bk == nil { - return []Transaction{}, fmt.Errorf("No block exsit in depth:%d", tx.BlockSeq) + mxSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } else if !ok { + if len(txns) > 0 { + return fmt.Errorf("Found %d txns for addresses but block head seq is missing", len(txns)) + } + return nil } - txns = append(txns, Transaction{ - Txn: tx.Tx, - Status: NewConfirmedTransactionStatus(h, tx.BlockSeq), - Time: bk.Time(), - }) - } - - // Look in the unconfirmed pool - uxs := vs.Unconfirmed.GetUnspentsOfAddr(a) - for _, ux := range uxs { - tx, ok := vs.Unconfirmed.Get(ux.Body.SrcTransaction) - if !ok { - logger.Critical().Error("Unconfirmed unspent missing unconfirmed txn") - continue - } - txns = append(txns, Transaction{ - Txn: tx.Txn, - Status: NewUnconfirmedTransactionStatus(), - Time: uint64(nanoToTime(tx.Received).Unix()), - }) - } + for _, txn := range txs { + if mxSeq < txn.BlockSeq { + return fmt.Errorf("Blockchain head seq %d is earlier than history txn seq %d", mxSeq, txn.BlockSeq) + } + h := mxSeq - txn.BlockSeq + 1 - return txns, nil -} + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) + if err != nil { + return err + } -// GetTransaction returns a Transaction by hash. -func (vs *Visor) GetTransaction(txHash cipher.SHA256) (*Transaction, error) { - // Look in the unconfirmed pool - tx, ok := vs.Unconfirmed.Get(txHash) - if ok { - return &Transaction{ - Txn: tx.Txn, - Status: NewUnconfirmedTransactionStatus(), - Time: uint64(nanoToTime(tx.Received).Unix()), - }, nil - } + if bk == nil { + return fmt.Errorf("No block exists in depth: %d", txn.BlockSeq) + } - txn, err := vs.history.GetTransaction(txHash) - if err != nil { - return nil, err - } + txns = append(txns, Transaction{ + Txn: txn.Tx, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), + Time: bk.Time(), + }) + } - if txn == nil { - return nil, nil - } + // Look in the unconfirmed pool + uxs, err := vs.Unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return err + } - headSeq := vs.HeadBkSeq() + for _, ux := range uxs { + utxn, err := vs.Unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return err + } - confirms := headSeq - txn.BlockSeq + 1 - b, err := vs.GetBlockBySeq(txn.BlockSeq) - if err != nil { + if utxn == nil { + logger.Critical().Error("Unconfirmed unspent missing unconfirmed txn") + continue + } + + txns = append(txns, Transaction{ + Txn: utxn.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(utxn.Received).Unix()), + }) + } + + return nil + }); err != nil { return nil, err } - if b == nil { - return nil, fmt.Errorf("found no block in seq %v", txn.BlockSeq) + return txns, nil +} + +// GetTransaction returns a Transaction by hash. +func (vs *Visor) GetTransaction(txHash cipher.SHA256) (*Transaction, error) { + var txn *Transaction + + if err := vs.DB.View("GetTransaction", func(tx *dbutil.Tx) error { + // Look in the unconfirmed pool + utxn, err := vs.Unconfirmed.Get(tx, txHash) + if err != nil { + return err + } + + if utxn != nil { + txn = &Transaction{ + Txn: utxn.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(utxn.Received).Unix()), + } + return nil + } + + htxn, err := vs.history.GetTransaction(tx, txHash) + if err != nil { + return err + } + + if htxn == nil { + return nil + } + + headSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } else if !ok { + return errors.New("Blockchain is empty but history has transactions") + } + + b, err := vs.Blockchain.GetSignedBlockBySeq(tx, htxn.BlockSeq) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("found no block in seq %v", htxn.BlockSeq) + } + + if headSeq < htxn.BlockSeq { + return fmt.Errorf("Blockchain head seq %d is earlier than history txn seq %d", headSeq, htxn.BlockSeq) + } + + confirms := headSeq - htxn.BlockSeq + 1 + txn = &Transaction{ + Txn: htxn.Tx, + Status: NewConfirmedTransactionStatus(confirms, htxn.BlockSeq), + Time: b.Time(), + } + + return nil + }); err != nil { + return nil, err } - return &Transaction{ - Txn: txn.Tx, - Status: NewConfirmedTransactionStatus(confirms, txn.BlockSeq), - Time: b.Time(), - }, nil + return txn, nil } // TxFilter transaction filter type @@ -740,15 +1037,41 @@ func (vs *Visor) GetTransactions(flts ...TxFilter) ([]Transaction, error) { // Traverses all transactions to do collection if there's no address filter. if len(addrs) == 0 { - return vs.traverseTxns(otherFlts...) + var txns []Transaction + if err := vs.DB.View("GetTransactions traverseTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.traverseTxns(tx, otherFlts...) + return err + }); err != nil { + return nil, err + } + return txns, nil } // Gets addresses related transactions - txns, err := getTransactionsOfAddrs(vs, addrs) - if err != nil { + var addrTxns map[cipher.Address][]Transaction + if err := vs.DB.View("GetTransactions getTransactionsOfAddrs", func(tx *dbutil.Tx) error { + var err error + addrTxns, err = vs.getTransactionsOfAddrs(tx, addrs) + return err + }); err != nil { return nil, err } + // Converts address transactions map into []Transaction, + // and remove duplicate txns + txnMap := make(map[cipher.SHA256]struct{}, 0) + var txns []Transaction + for _, txs := range addrTxns { + for _, tx := range txs { + if _, exist := txnMap[tx.Txn.Hash()]; exist { + continue + } + txnMap[tx.Txn.Hash()] = struct{}{} + txns = append(txns, tx) + } + } + // Checks other filters var retTxns []Transaction f := func(tx *Transaction, flts ...TxFilter) bool { @@ -786,74 +1109,77 @@ func accumulateAddressInFilter(afs []addrsFilter) []cipher.Address { return addrs } -func getTransactionsOfAddrs(vs *Visor, addrs []cipher.Address) ([]Transaction, error) { - addrTxns, err := vs.getTransactionsOfAddrs(addrs) - if err != nil { - return nil, err - } - - // Converts address transactions map into []Transaction, - // and remove duplicate txns - txnMap := make(map[cipher.SHA256]struct{}, 0) - var txns []Transaction - for _, txs := range addrTxns { - for _, tx := range txs { - if _, exist := txnMap[tx.Txn.Hash()]; exist { - continue - } - txnMap[tx.Txn.Hash()] = struct{}{} - txns = append(txns, tx) - } - } - return txns, nil -} - // getTransactionsOfAddrs returns all addresses related transactions. // Including both confirmed and unconfirmed transactions. -func (vs *Visor) getTransactionsOfAddrs(addrs []cipher.Address) (map[cipher.Address][]Transaction, error) { +func (vs *Visor) getTransactionsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (map[cipher.Address][]Transaction, error) { // Initialize the address transactions map addrTxs := make(map[cipher.Address][]Transaction) - // Get the head block seq, for caculating the tx status - headBkSeq := vs.HeadBkSeq() + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.Blockchain.HeadSeq(tx) + + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + for _, a := range addrs { var txns []Transaction - txs, err := vs.history.GetAddrTxns(a) + addrTxns, err := vs.history.GetAddressTxns(tx, a) if err != nil { return nil, err } - for _, tx := range txs { - h := headBkSeq - tx.BlockSeq + 1 + for _, txn := range addrTxns { + if headBkSeq < txn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": txn.BlockSeq, + }).Error() + return nil, err + } + h := headBkSeq - txn.BlockSeq + 1 - bk, err := vs.GetBlockBySeq(tx.BlockSeq) + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) if err != nil { return nil, err } if bk == nil { - return nil, fmt.Errorf("block of seq: %d doesn't exist", tx.BlockSeq) + return nil, fmt.Errorf("block of seq: %d doesn't exist", txn.BlockSeq) } txns = append(txns, Transaction{ - Txn: tx.Tx, - Status: NewConfirmedTransactionStatus(h, tx.BlockSeq), + Txn: txn.Tx, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), Time: bk.Time(), }) } // Look in the unconfirmed pool - uxs := vs.Unconfirmed.GetUnspentsOfAddr(a) + uxs, err := vs.Unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return nil, err + } + for _, ux := range uxs { - tx, ok := vs.Unconfirmed.Get(ux.Body.SrcTransaction) - if !ok { + txn, err := vs.Unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return nil, err + } + + if txn == nil { logger.Critical().Error("Unconfirmed unspent missing unconfirmed txn") continue } + txns = append(txns, Transaction{ - Txn: tx.Txn, + Txn: txn.Txn, Status: NewUnconfirmedTransactionStatus(), - Time: uint64(nanoToTime(tx.Received).Unix()), + Time: uint64(nanoToTime(txn.Received).Unix()), }) } @@ -865,23 +1191,42 @@ func (vs *Visor) getTransactionsOfAddrs(addrs []cipher.Address) (map[cipher.Addr // traverseTxns traverses transactions in historydb and unconfirmed tx pool in db, // returns transactions that can pass the filters. -func (vs *Visor) traverseTxns(flts ...TxFilter) ([]Transaction, error) { - headBkSeq := vs.HeadBkSeq() +func (vs *Visor) traverseTxns(tx *dbutil.Tx, flts ...TxFilter) ([]Transaction, error) { + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + var txns []Transaction - err := vs.history.ForEach(func(tx *historydb.Transaction) error { - h := headBkSeq - tx.BlockSeq + 1 - bk, err := vs.GetBlockBySeq(tx.BlockSeq) + + if err := vs.history.ForEachTxn(tx, func(_ cipher.SHA256, hTxn *historydb.Transaction) error { + if headBkSeq < hTxn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": hTxn.BlockSeq, + }).Error() + return err + } + + h := headBkSeq - hTxn.BlockSeq + 1 + + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, hTxn.BlockSeq) if err != nil { - return fmt.Errorf("get block of seq: %v failed: %v", tx.BlockSeq, err) + return fmt.Errorf("get block of seq: %v failed: %v", hTxn.BlockSeq, err) } if bk == nil { - return fmt.Errorf("block of seq: %d doesn't exist", tx.BlockSeq) + return fmt.Errorf("block of seq: %d doesn't exist", hTxn.BlockSeq) } txn := Transaction{ - Txn: tx.Tx, - Status: NewConfirmedTransactionStatus(h, tx.BlockSeq), + Txn: hTxn.Tx, + Status: NewConfirmedTransactionStatus(h, hTxn.BlockSeq), Time: bk.Time(), } @@ -894,18 +1239,22 @@ func (vs *Visor) traverseTxns(flts ...TxFilter) ([]Transaction, error) { txns = append(txns, txn) return nil - }) - - if err != nil { + }); err != nil { return nil, err } txns = sortTxns(txns) // Gets all unconfirmed transactions - unconfirmedTxns := vs.Unconfirmed.GetTxns(func(tx UnconfirmedTxn) bool { return true }) + unconfirmedTxns, err := vs.Unconfirmed.GetTxns(tx, func(txn UnconfirmedTxn) bool { + return true + }) + if err != nil { + return nil, err + } + for _, ux := range unconfirmedTxns { - tx := Transaction{ + txn := Transaction{ Txn: ux.Txn, Status: NewUnconfirmedTransactionStatus(), Time: uint64(nanoToTime(ux.Received).Unix()), @@ -913,24 +1262,15 @@ func (vs *Visor) traverseTxns(flts ...TxFilter) ([]Transaction, error) { // Checks filters for _, f := range flts { - if !f.Match(&tx) { + if !f.Match(&txn) { continue } - txns = append(txns, tx) + txns = append(txns, txn) } } return txns, nil } -func txMatchFilters(tx *Transaction, flts ...TxFilter) bool { - for _, f := range flts { - if !f.Match(tx) { - return false - } - } - return true -} - // Sort transactions by block seq, if equal then compare hash func sortTxns(txns []Transaction) []Transaction { sort.Slice(txns, func(i, j int) bool { @@ -949,8 +1289,8 @@ func sortTxns(txns []Transaction) []Transaction { } // AddressBalance computes the total balance for cipher.Addresses and their coin.UxOuts -func (vs *Visor) AddressBalance(auxs coin.AddressUxOuts) (uint64, uint64, error) { - prevTime := vs.Blockchain.Time() +func (vs *Visor) AddressBalance(head *coin.SignedBlock, auxs coin.AddressUxOuts) (uint64, uint64, error) { + prevTime := head.Time() var coins uint64 var hours uint64 for _, uxs := range auxs { @@ -975,8 +1315,18 @@ func (vs *Visor) AddressBalance(auxs coin.AddressUxOuts) (uint64, uint64, error) } // GetUnconfirmedTxns gets all confirmed transactions of specific addresses -func (vs *Visor) GetUnconfirmedTxns(filter func(UnconfirmedTxn) bool) []UnconfirmedTxn { - return vs.Unconfirmed.GetTxns(filter) +func (vs *Visor) GetUnconfirmedTxns(filter func(UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := vs.DB.View("GetUnconfirmedTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.Unconfirmed.GetTxns(tx, filter) + return err + }); err != nil { + return nil, err + } + + return txns, nil } // ToAddresses represents a filter that check if tx has output to the given addresses @@ -995,69 +1345,354 @@ func ToAddresses(addresses []cipher.Address) func(UnconfirmedTxn) bool { } // GetAllUnconfirmedTxns returns all unconfirmed transactions -func (vs *Visor) GetAllUnconfirmedTxns() []UnconfirmedTxn { - return vs.Unconfirmed.GetTxns(All) +func (vs *Visor) GetAllUnconfirmedTxns() ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := vs.DB.View("GetAllUnconfirmedTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.Unconfirmed.GetTxns(tx, All) + return err + }); err != nil { + return nil, err + } + + return txns, nil } // GetAllValidUnconfirmedTxHashes returns all valid unconfirmed transaction hashes -func (vs *Visor) GetAllValidUnconfirmedTxHashes() []cipher.SHA256 { - return vs.Unconfirmed.GetTxHashes(IsValid) +func (vs *Visor) GetAllValidUnconfirmedTxHashes() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.DB.View("GetAllValidUnconfirmedTxHashes", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetTxHashes(tx, IsValid) + return err + }); err != nil { + return nil, err + } + + return hashes, nil } -// GetBlockByHash get block of specific hash header, return nil on not found. -func (vs *Visor) GetBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { - return vs.Blockchain.GetBlockByHash(hash) +// GetSignedBlockByHash get block of specific hash header, return nil on not found. +func (vs *Visor) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var sb *coin.SignedBlock + + if err := vs.DB.View("GetSignedBlockByHash", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.Blockchain.GetSignedBlockByHash(tx, hash) + return err + }); err != nil { + return nil, err + } + + return sb, nil } -// GetBlockBySeq get block of speicific seq, return nil on not found. -func (vs *Visor) GetBlockBySeq(seq uint64) (*coin.SignedBlock, error) { - return vs.Blockchain.GetBlockBySeq(seq) +// GetSignedBlockBySeq get block of specific seq, return nil on not found. +func (vs *Visor) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.DB.View("GetSignedBlockBySeq", func(tx *dbutil.Tx) error { + var err error + b, err = vs.Blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil } // GetLastBlocks returns last N blocks func (vs *Visor) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { - return vs.Blockchain.GetLastBlocks(num) + var blocks []coin.SignedBlock + + if err := vs.DB.View("GetLastBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.Blockchain.GetLastBlocks(tx, num) + return err + }); err != nil { + return nil, err + } + + return blocks, nil } // GetHeadBlock gets head block. func (vs Visor) GetHeadBlock() (*coin.SignedBlock, error) { - return vs.Blockchain.Head() + var b *coin.SignedBlock + + if err := vs.DB.View("GetHeadBlock", func(tx *dbutil.Tx) error { + var err error + b, err = vs.Blockchain.Head(tx) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetHeadBlockTime returns the time of the head block. +func (vs Visor) GetHeadBlockTime() (uint64, error) { + var t uint64 + + if err := vs.DB.View("GetHeadBlockTime", func(tx *dbutil.Tx) error { + var err error + t, err = vs.Blockchain.Time(tx) + return err + }); err != nil { + return 0, err + } + + return t, nil } // GetUxOutByID gets UxOut by hash id. func (vs Visor) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { - return vs.history.GetUxout(id) + var outs []*historydb.UxOut + + if err := vs.DB.View("GetUxOutByID", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.history.GetUxOuts(tx, []cipher.SHA256{id}) + return err + }); err != nil { + return nil, err + } + + if len(outs) == 0 { + return nil, nil + } + + return outs[0], nil } // GetAddrUxOuts gets all the address affected UxOuts. func (vs Visor) GetAddrUxOuts(address cipher.Address) ([]*historydb.UxOut, error) { - return vs.history.GetAddrUxOuts(address) + var out []*historydb.UxOut + + if err := vs.DB.View("GetAddrUxOuts", func(tx *dbutil.Tx) error { + var err error + out, err = vs.history.GetAddrUxOuts(tx, address) + return err + }); err != nil { + return nil, err + } + + return out, nil } -// CreateWallet creates wallet and scans ahead N addresses to look for a none-empty balance -func (vs *Visor) CreateWallet(wltName string, opts wallet.Options) (*wallet.Wallet, error) { - return vs.Wallets.CreateWallet(wltName, opts, vs) +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (vs *Visor) RecvOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxouts coin.AddressUxOuts + + if err := vs.DB.View("RecvOfAddresses", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxouts, err = vs.Unconfirmed.RecvOfAddresses(tx, head.Head, addrs) + return err + }); err != nil { + return nil, err + } + + return uxouts, nil } -// GetBalanceOfAddrs returns balance pairs of given addreses -func (vs Visor) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) { - var bps []wallet.BalancePair - auxs := vs.Blockchain.Unspent().GetUnspentsOfAddrs(addrs) - spendUxs, err := vs.Unconfirmed.SpendsOfAddresses(addrs, vs.Blockchain.Unspent()) - if err != nil { - return nil, fmt.Errorf("get unconfirmed spending failed when checking addresses balance: %v", err) +// GetIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) GetIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.DB.View("GetIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.Unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err } - head, err := vs.Blockchain.Head() + return uxa, nil +} + +// GetUnconfirmedTxn gets an unconfirmed transaction from the DB +func (vs *Visor) GetUnconfirmedTxn(hash cipher.SHA256) (*UnconfirmedTxn, error) { + var txn *UnconfirmedTxn + + if err := vs.DB.View("GetUnconfirmedTxn", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.Unconfirmed.Get(tx, hash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// GetUnconfirmedUnknown returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.DB.View("GetUnconfirmedUnknown", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetUnknown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetUnconfirmedKnown returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) { + var hashes coin.Transactions + + if err := vs.DB.View("GetUnconfirmedKnown", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// UnconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) UnconfirmedSpendsOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var outs coin.AddressUxOuts + + if err := vs.DB.View("UnconfirmedSpendsOfAddresses", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.unconfirmedSpendsOfAddresses(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return outs, nil +} + +// unconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) unconfirmedSpendsOfAddresses(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + txns, err := vs.Unconfirmed.RawTxns(tx) if err != nil { return nil, err } - recvUxs, err := vs.Unconfirmed.RecvOfAddresses(head.Head, addrs) + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err := vs.Blockchain.Unspent().GetArray(tx, inputs) if err != nil { - return nil, fmt.Errorf("get unconfirmed receiving failed when checking addresses balance: %v", err) + return nil, err + } + + outs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + outs[ux.Body.Address] = append(outs[ux.Body.Address], ux) + } + } + + return outs, nil +} + +// SetTxnsAnnounced updates announced time of specific tx +func (vs *Visor) SetTxnsAnnounced(hashes map[cipher.SHA256]int64) error { + if len(hashes) == 0 { + return nil + } + + return vs.DB.Update("SetTxnsAnnounced", func(tx *dbutil.Tx) error { + return vs.Unconfirmed.SetTxnsAnnounced(tx, hashes) + }) +} + +// GetBalanceOfAddrs returns balance pairs of given addreses +func (vs Visor) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) { + if len(addrs) == 0 { + return nil, nil + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + recvUxs := make(coin.AddressUxOuts, len(addrs)) + var uxa coin.UxArray + var head *coin.SignedBlock + + if err := vs.DB.View("GetBalanceOfAddrs", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + // Get all transactions from the unconfirmed pool + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return err + } + + // Create predicted unspent outputs from the unconfirmed transactions + recvUxs, err = txnOutputsForAddrs(head.Head, addrs, txns) + if err != nil { + return err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + // Get unspents for the inputs being spent + uxa, err = vs.Blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return fmt.Errorf("GetArray failed when checking addresses balance: %v", err) + } + + // Get unspents owned by the addresses + auxs, err = vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + return fmt.Errorf("GetUnspentsOfAddrs failed when checking addresses balance: %v", err) + } + + return nil + }); err != nil { + return nil, err } + // Build all unconfirmed transaction inputs that are associated with the addresses + spendUxs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + spendUxs[ux.Body.Address] = append(spendUxs[ux.Body.Address], ux) + } + } + + var bps []wallet.BalancePair + headTime := head.Time() for _, addr := range addrs { uxs, ok := auxs[addr] @@ -1115,19 +1750,356 @@ func (vs Visor) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, bps = append(bps, bp) } + return bps, nil } -// GetUnconfirmedSpends returns unspent outputs that are spent in unconfirmed transactions -func (vs *Visor) GetUnconfirmedSpends(addrs []cipher.Address) (coin.AddressUxOuts, error) { - return vs.Unconfirmed.SpendsOfAddresses(addrs, vs.Blockchain.Unspent()) +// GetUnspentsOfAddrs returns unspent outputs of multiple addresses +func (vs *Visor) GetUnspentsOfAddrs(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxa coin.AddressUxOuts + + if err := vs.DB.View("GetUnspentsOfAddrs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// VerifyTxnVerbose verifies a transaction, it returns transaction's input uxouts, whether the +// transaction is confirmed, and error if any +func (vs *Visor) VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) { + var uxa coin.UxArray + var head *coin.SignedBlock + var isTxnConfirmed bool + err := vs.DB.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.Blockchain.Unspent().GetArray(tx, txn.In) + switch err.(type) { + case nil: + case blockdb.ErrUnspentNotExist: + uxid := err.(blockdb.ErrUnspentNotExist).UxID + // Gets uxouts of txn.In from historydb + outs, err := vs.history.GetUxOuts(tx, txn.In) + if err != nil { + return err + } + + if len(outs) == 0 { + err = fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", uxid) + return NewErrTxnViolatesHardConstraint(err) + } + + uxa = coin.UxArray{} + for _, out := range outs { + uxa = append(uxa, out.Out) + } + + // Checks if the transaction is confirmed + txnHash := txn.Hash() + historyTxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return fmt.Errorf("get transaction of %v from historydb failed: %v", txnHash, err) + } + + if historyTxn != nil { + // Transaction is confirmed + isTxnConfirmed = true + } + + return nil + default: + return err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + + if err := VerifySingleTxnSoftConstraints(*txn, head.Time(), uxa, vs.Config.MaxBlockSize); err != nil { + return err + } + + return VerifySingleTxnHardConstraints(*txn, head, uxa) + }) + + // If we were able to query the inputs, return the verbose inputs to the caller + // even if the transaction failed validation + var uxs []wallet.UxBalance + if len(uxa) != 0 { + var otherErr error + uxs, otherErr = wallet.NewUxBalances(head.Time(), uxa) + if otherErr != nil { + return nil, isTxnConfirmed, otherErr + } + } + + return uxs, isTxnConfirmed, err +} + +// AddressCount returns the total number of addresses with unspents +func (vs *Visor) AddressCount() (uint64, error) { + var count uint64 + if err := vs.DB.View("AddressCount", func(tx *dbutil.Tx) error { + var err error + count, err = vs.Blockchain.Unspent().AddressCount(tx) + return err + }); err != nil { + return 0, err + } + + return count, nil +} + +// CreateTransactionDeprecated creates a transaction using an entire wallet, +// specifying only coins and one destination +func (vs *Visor) CreateTransactionDeprecated(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) { + w, err := vs.Wallets.GetWallet(wltID) + if err != nil { + logger.WithError(err).Error("Wallets.GetWallet failed") + return nil, err + } + + // Get all addresses from the wallet for checking params against + addrs := w.GetAddresses() + + var auxs coin.AddressUxOuts + var head *coin.SignedBlock + + if err := vs.DB.View("CreateTransactionDeprecated", func(tx *dbutil.Tx) error { + head, err = vs.Blockchain.Head(tx) + if err != nil { + logger.Errorf("Blockchain.Head failed: %v", err) + return err + } + + // Get unspent outputs, while checking that there are no unconfirmed outputs + auxs, err = vs.getUnspentsForSpending(tx, addrs, false) + if err != nil { + if err != wallet.ErrSpendingUnconfirmed { + logger.WithError(err).Error("getUnspentsForSpending failed") + } + return err + } + + return nil + }); err != nil { + return nil, err + } + + // Create and sign transaction + var txn *coin.Transaction + if err := vs.Wallets.ViewWallet(w, password, func(w *wallet.Wallet) error { + var err error + txn, err = w.CreateAndSignTransaction(auxs, head.Time(), coins, dest) + return err + }); err != nil { + logger.WithError(err).Error("CreateAndSignTransaction failed") + return nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // NOTE: this isn't inside the database transaction, but it's safe, + // if a racing database write caused this transaction to be invalid, it would be caught here + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, err + } + if err := vs.DB.View("VerifySingleTxnSoftHardConstraints", func(tx *dbutil.Tx) error { + return vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.MaxBlockSize) + }); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, err + } + + return txn, nil +} + +// CreateTransaction creates a transaction based upon the parameters in wallet.CreateTransactionParams +func (vs *Visor) CreateTransaction(params wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { + if err := params.Validate(); err != nil { + return nil, nil, err + } + + w, err := vs.Wallets.GetWallet(params.Wallet.ID) + if err != nil { + logger.WithError(err).Error("Wallets.GetWallet failed") + return nil, nil, err + } + + // Get all addresses from the wallet for checking params against + allAddrs := w.GetAddresses() + + var auxs coin.AddressUxOuts + var head *coin.SignedBlock + + if err := vs.DB.View("CreateTransaction", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("Blockchain.Head failed") + return err + } + + auxs, err = vs.getCreateTransactionAuxs(tx, params, allAddrs) + return err + }); err != nil { + return nil, nil, err + } + + // Create and sign transaction + var txn *coin.Transaction + var inputs []wallet.UxBalance + if err := vs.Wallets.ViewWallet(w, params.Wallet.Password, func(w *wallet.Wallet) error { + var err error + txn, inputs, err = w.CreateAndSignTransactionAdvanced(params, auxs, head.Time()) + return err + }); err != nil { + logger.WithError(err).Error("CreateAndSignTransactionAdvanced failed") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // NOTE: this isn't inside the database transaction, but it's safe, + // if a racing database write caused this transaction to be invalid, it would be caught here + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, nil, err + } + if err := vs.DB.View("VerifySingleTxnSoftHardConstraints", func(tx *dbutil.Tx) error { + return vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.MaxBlockSize) + }); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) getCreateTransactionAuxs(tx *dbutil.Tx, params wallet.CreateTransactionParams, allAddrs []cipher.Address) (coin.AddressUxOuts, error) { + allAddrsMap := make(map[cipher.Address]struct{}, len(allAddrs)) + for _, a := range allAddrs { + allAddrsMap[a] = struct{}{} + } + + var auxs coin.AddressUxOuts + if len(params.Wallet.UxOuts) != 0 { + // Check if any of the outputs are in an unconfirmed spend + hashesMap := make(map[cipher.SHA256]struct{}, len(params.Wallet.UxOuts)) + for _, h := range params.Wallet.UxOuts { + hashesMap[h] = struct{}{} + } + + // Get all unconfirmed spending uxouts + unconfirmedTxns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return nil, err + } + + var unconfirmedSpends []cipher.SHA256 + for _, txn := range unconfirmedTxns { + unconfirmedSpends = append(unconfirmedSpends, txn.In...) + } + + if params.IgnoreUnconfirmed { + // Filter unconfirmed spends + prevLen := len(hashesMap) + for _, h := range unconfirmedSpends { + delete(hashesMap, h) + } + + if prevLen != len(hashesMap) { + params.Wallet.UxOuts = make([]cipher.SHA256, 0, len(hashesMap)) + for h := range hashesMap { + params.Wallet.UxOuts = append(params.Wallet.UxOuts, h) + } + } + } else { + for _, h := range unconfirmedSpends { + if _, ok := hashesMap[h]; ok { + return nil, wallet.ErrSpendingUnconfirmed + } + } + } + + // Retrieve the uxouts from the pool. + // An error is returned if any do not exist + uxouts, err := vs.Blockchain.Unspent().GetArray(tx, params.Wallet.UxOuts) + if err != nil { + return nil, err + } + + // Build coin.AddressUxOuts map, and check that the address is in the wallets + auxs = make(coin.AddressUxOuts) + for _, o := range uxouts { + if _, ok := allAddrsMap[o.Body.Address]; !ok { + return nil, wallet.ErrUnknownUxOut + } + auxs[o.Body.Address] = append(auxs[o.Body.Address], o) + } + + } else { + addrs := params.Wallet.Addresses + if len(addrs) == 0 { + addrs = allAddrs + } else { + // Check that requested addresses are in the wallet + for _, a := range addrs { + if _, ok := allAddrsMap[a]; !ok { + return nil, wallet.ErrUnknownAddress + } + } + } + + // Get unspent outputs, while checking that there are no unconfirmed outputs + var err error + auxs, err = vs.getUnspentsForSpending(tx, addrs, params.IgnoreUnconfirmed) + if err != nil { + return nil, err + } + } + + return auxs, nil } -// GetUnconfirmedReceiving returns unspents outputs that are created by unconfirmed transactions -func (vs *Visor) GetUnconfirmedReceiving(addrs []cipher.Address) (coin.AddressUxOuts, error) { - head, err := vs.Blockchain.Head() +// getUnspentsForSpending returns the unspent outputs for a set of addresses, +// but returns an error if any of the unspents are in the unconfirmed outputs pool +func (vs *Visor) getUnspentsForSpending(tx *dbutil.Tx, addrs []cipher.Address, ignoredUnconfirmed bool) (coin.AddressUxOuts, error) { + unconfirmedAuxs, err := vs.unconfirmedSpendsOfAddresses(tx, addrs) if err != nil { + err = fmt.Errorf("UnconfirmedSpendsOfAddresses failed: %v", err) return nil, err } - return vs.Unconfirmed.RecvOfAddresses(head.Head, addrs) + + if !ignoredUnconfirmed { + // Check that this is not trying to spend unconfirmed outputs + if len(unconfirmedAuxs) > 0 { + return nil, wallet.ErrSpendingUnconfirmed + } + } + + auxs, err := vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + err = fmt.Errorf("GetUnspentsOfAddrs failed: %v", err) + return nil, err + } + + // Filter unconfirmed + if ignoredUnconfirmed && len(unconfirmedAuxs) > 0 { + auxs = auxs.Sub(unconfirmedAuxs) + } + + return auxs, nil } diff --git a/src/visor/visor_test.go b/src/visor/visor_test.go index 39056bd..5035316 100755 --- a/src/visor/visor_test.go +++ b/src/visor/visor_test.go @@ -2,9 +2,11 @@ package visor import ( "bytes" + "errors" "fmt" "io" "io/ioutil" + "math" "os" "path/filepath" "sort" @@ -12,6 +14,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "github.com/skycoin/skycoin/src/cipher" @@ -21,13 +24,27 @@ import ( "github.com/skycoin/skycoin/src/util/fee" "github.com/skycoin/skycoin/src/util/utc" "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" ) const ( blockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" ) +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := CreateBuckets(db) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + func readAll(t *testing.T, f string) []byte { fi, err := os.Open(f) require.NoError(t, err) @@ -71,7 +88,28 @@ func removeCorruptDBFiles(t *testing.T, badDBFile string) { } } -func TestErrSignatureLostRecreateDB(t *testing.T) { +func addGenesisBlockToVisor(t *testing.T, vs *Visor) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.SignHash(gb.HashHeader(), genSecret) + vs.Config.GenesisSignature = gbSig + + sb := coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } + + // add genesis block to blockchain + err = vs.DB.Update("", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, sb) + }) + require.NoError(t, err) + + return &sb +} + +func TestErrMissingSignatureRecreateDB(t *testing.T) { badDBFile := "./testdata/data.db.nosig" // about 8MB size badDBData := readAll(t, badDBFile) @@ -100,12 +138,24 @@ func TestErrSignatureLostRecreateDB(t *testing.T) { assert.NoError(t, err) }() - _, err = NewBlockchain(db, pubkey, Arbitrating(false)) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + + // err = db.View("", func(tx *dbutil.Tx) error { + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return bc.VerifySignature(b) + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, f, nil) + require.Error(t, err) require.IsType(t, blockdb.ErrMissingSignature{}, err) }() - // Loading this invalid db should cause loadBlockchain() to recreate the db + // Loading this invalid db should cause ResetCorruptDB() to recreate the db t.Logf("Loading the corrupted db from %s", badDBFile) badDB, err := OpenDB(badDBFile, false) require.NoError(t, err) @@ -113,14 +163,13 @@ func TestErrSignatureLostRecreateDB(t *testing.T) { require.NotEmpty(t, badDB.Path()) t.Logf("badDB.Path() == %s", badDB.Path()) - db, bc, err := loadBlockchain(badDB, pubkey, false) + db, err := RepairCorruptDB(badDB, pubkey, nil) require.NoError(t, err) err = db.Close() require.NoError(t, err) require.NotNil(t, db) - require.NotNil(t, bc) // A corrupted database file should exist corruptFiles = findCorruptDBFiles(t, badDBFile) @@ -137,22 +186,94 @@ func TestErrSignatureLostRecreateDB(t *testing.T) { }() // The new db is not corrupted and loads without error - bc, err := NewBlockchain(db, pubkey, Arbitrating(false)) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) require.NoError(t, err) require.NotNil(t, bc) }() } +func TestHistorydbVerifier(t *testing.T) { + tt := []struct { + name string + dbPath string + expectErr error + }{ + { + name: "db is ok", + dbPath: "./testdata/data.db.ok", + }, + { + name: "missing transaction", + dbPath: "./testdata/data.db.notxn", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction 98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb does not exist in historydb")), + }, + { + name: "missing uxout", + dbPath: "./testdata/data.db.nouxout", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction (input|output) 2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0 does not exist in historydb")), + }, + { + name: "missing addr transaction index", + dbPath: "./testdata/data.db.no-addr-txn-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address transaction \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb\] does not exist in historydb`)), + }, + { + name: "missing addr uxout index", + dbPath: "./testdata/data.db.no-addr-uxout-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address uxout \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0\] does not exist in historydb`)), + }, + } + + pubKeyStr := "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + pubkey := cipher.MustPubKeyFromHex(pubKeyStr) + history := historydb.New() + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, err := OpenDB(tc.dbPath, true) + require.NoError(t, err) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + + indexesMap := historydb.NewIndexesMap() + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return history.Verify(tx, b, indexesMap) + } + + err = bc.WalkChain(2, f, nil) + if tc.expectErr == nil { + require.Nil(t, err) + return + } + + // Confirms that the error type is matched + require.IsType(t, tc.expectErr, err) + // Confirms the error message is matched + require.Regexp(t, tc.expectErr.Error(), err.Error()) + }) + } + +} + func TestVisorCreateBlock(t *testing.T) { when := uint64(time.Now().UTC().Unix()) - db, shutdown := testutil.PrepareDB(t) + db, shutdown := prepareDB(t) defer shutdown() - db, bc, err := loadBlockchain(db, genPublic, false) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + + unconfirmed, err := NewUnconfirmedTxnPool(db) require.NoError(t, err) - unconfirmed := NewUnconfirmedTxnPool(db) + his := historydb.New() cfg := NewVisorConfig() cfg.DBPath = db.Path() @@ -164,40 +285,71 @@ func TestVisorCreateBlock(t *testing.T) { Config: cfg, Unconfirmed: unconfirmed, Blockchain: bc, - db: db, + DB: db, + history: his, } // CreateBlock panics if called when not master _require.PanicsWithLogMessage(t, "Only master chain can create blocks", func() { - v.CreateBlock(when) + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) }) v.Config.IsMaster = true v.Config.BlockchainSeckey = genSecret - addGenesisBlock(t, v.Blockchain) - gb := v.Blockchain.GetGenesisBlock() + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) require.NotNil(t, gb) // If no transactions in the unconfirmed pool, return an error - _, err = v.CreateBlock(when) - testutil.RequireError(t, err, "No transactions") + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = v.createBlock(tx, when) + testutil.RequireError(t, err, "No transactions") + return nil + }) + require.NoError(t, err) // Create enough unspent outputs to create all of these transactions uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) nUnspents := 100 txn := makeUnspentsTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, nUnspents, maxDropletDivisor) - known, softErr, err := unconfirmed.InjectTransaction(bc, txn, v.Config.MaxBlockSize) + + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, v.Config.MaxBlockSize) + return err + }) + require.NoError(t, err) require.False(t, known) require.Nil(t, softErr) - require.NoError(t, err) v.Config.MaxBlockSize = txn.Size() sb, err := v.CreateAndExecuteBlock() require.NoError(t, err) require.Equal(t, 1, len(sb.Body.Transactions)) - require.Equal(t, 0, unconfirmed.Len()) + + var length uint64 + err = db.View("", func(tx *dbutil.Tx) error { + var err error + length, err = unconfirmed.Len(tx) + return err + }) + require.NoError(t, err) + + require.Equal(t, uint64(0), length) v.Config.MaxBlockSize = 1024 * 4 // Create various transactions and add them to unconfirmed pool @@ -257,12 +409,21 @@ func TestVisorCreateBlock(t *testing.T) { // Inject transactions into the unconfirmed pool for _, txn := range txns { - known, _, err := unconfirmed.InjectTransaction(bc, txn, v.Config.MaxBlockSize) + var known bool + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, _, err = unconfirmed.InjectTransaction(tx, bc, txn, v.Config.MaxBlockSize) + return err + }) require.False(t, known) require.NoError(t, err) } - sb, err = v.CreateBlock(when + 100) + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + sb, err = v.createBlock(tx, when+100) + return err + }) require.NoError(t, err) require.Equal(t, when+100, sb.Block.Head.Time) @@ -271,19 +432,25 @@ func TestVisorCreateBlock(t *testing.T) { require.Equal(t, 18, len(blockTxns)) // Check fee ordering - inUxs, err := v.Blockchain.Unspent().GetArray(blockTxns[0].In) - require.NoError(t, err) - prevFee, err := fee.TransactionFee(&blockTxns[0], sb.Head.Time, inUxs) - require.NoError(t, err) - - for i := 1; i < len(blockTxns); i++ { - inUxs, err := v.Blockchain.Unspent().GetArray(blockTxns[i].In) + err = db.View("", func(tx *dbutil.Tx) error { + inUxs, err := v.Blockchain.Unspent().GetArray(tx, blockTxns[0].In) require.NoError(t, err) - f, err := fee.TransactionFee(&blockTxns[i], sb.Head.Time, inUxs) + prevFee, err := fee.TransactionFee(&blockTxns[0], sb.Head.Time, inUxs) require.NoError(t, err) - require.True(t, f <= prevFee) - prevFee = f - } + + for i := 1; i < len(blockTxns); i++ { + inUxs, err := v.Blockchain.Unspent().GetArray(tx, blockTxns[i].In) + require.NoError(t, err) + f, err := fee.TransactionFee(&blockTxns[i], sb.Head.Time, inUxs) + require.NoError(t, err) + require.True(t, f <= prevFee) + prevFee = f + } + + return nil + }) + + require.NoError(t, err) // Check that decimal rules are enforced for i, txn := range blockTxns { @@ -297,13 +464,18 @@ func TestVisorCreateBlock(t *testing.T) { func TestVisorInjectTransaction(t *testing.T) { when := uint64(time.Now().UTC().Unix()) - db, shutdown := testutil.PrepareDB(t) + db, shutdown := prepareDB(t) defer shutdown() - db, bc, err := loadBlockchain(db, genPublic, false) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) require.NoError(t, err) - unconfirmed := NewUnconfirmedTxnPool(db) + unconfirmed, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + his := historydb.New() cfg := NewVisorConfig() cfg.DBPath = db.Path() @@ -315,23 +487,38 @@ func TestVisorInjectTransaction(t *testing.T) { Config: cfg, Unconfirmed: unconfirmed, Blockchain: bc, - db: db, + DB: db, + history: his, } // CreateBlock panics if called when not master _require.PanicsWithLogMessage(t, "Only master chain can create blocks", func() { - v.CreateBlock(when) + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) }) v.Config.IsMaster = true v.Config.BlockchainSeckey = genSecret - addGenesisBlock(t, v.Blockchain) - gb := v.Blockchain.GetGenesisBlock() + addGenesisBlockToVisor(t, v) + + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) require.NotNil(t, gb) // If no transactions in the unconfirmed pool, return an error - _, err = v.CreateBlock(when) + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) testutil.RequireError(t, err, "No transactions") uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) @@ -351,28 +538,53 @@ func TestVisorInjectTransaction(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(sb.Body.Transactions)) require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) - require.Equal(t, 0, unconfirmed.Len()) - require.Equal(t, uint64(2), bc.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) // Check transactions with overflowing output coins fail - txn = makeOverflowCoinsSpendTx(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + txn = makeOverflowCoinsSpendTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) _, softErr, err = v.InjectTransaction(txn) require.IsType(t, ErrTxnViolatesHardConstraint{}, err) testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Output coins overflow") require.Nil(t, softErr) - require.Equal(t, 0, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) // Check transactions with overflowing output hours fail // It should not be injected; when injecting a txn, the overflowing output hours is treated // as a hard constraint. It is only a soft constraint when the txn is included in a signed block. - txn = makeOverflowHoursSpendTx(t, coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + txn = makeOverflowHoursSpendTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) _, softErr, err = v.InjectTransaction(txn) require.Nil(t, softErr) require.IsType(t, ErrTxnViolatesHardConstraint{}, err) testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Transaction output hours overflow") - require.Equal(t, 0, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) // Create a transaction with invalid decimal places // It's still injected, because this is considered a soft error @@ -381,10 +593,26 @@ func TestVisorInjectTransaction(t *testing.T) { _, softErr, err = v.InjectTransaction(txn) require.NoError(t, err) testutil.RequireError(t, softErr.Err, errInvalidDecimals.Error()) - require.Equal(t, 1, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with null address output + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn = makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + txn.Out[0].Address = cipher.Address{} + known, err = v.InjectTransactionStrict(txn) + require.False(t, known) + require.IsType(t, ErrTxnViolatesUserConstraint{}, err) + testutil.RequireError(t, err, "Transaction violates user constraint: Transaction output is sent to the null address") } -func makeOverflowCoinsSpendTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { +func makeOverflowCoinsSpendTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { spendTx := coin.Transaction{} var totalHours uint64 var totalCoins uint64 @@ -405,7 +633,7 @@ func makeOverflowCoinsSpendTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecK return spendTx } -func makeOverflowHoursSpendTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { +func makeOverflowHoursSpendTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { spendTx := coin.Transaction{} var totalHours uint64 var totalCoins uint64 @@ -453,8 +681,7 @@ func TestVisorCalculatePrecision(t *testing.T) { }) } -func makeTestData(t *testing.T, n int) ([]historydb.Transaction, - []coin.SignedBlock, []UnconfirmedTxn, uint64) { +func makeTestData(t *testing.T, n int) ([]historydb.Transaction, []coin.SignedBlock, []UnconfirmedTxn, uint64) { // nolint: unparam var txs []historydb.Transaction var blocks []coin.SignedBlock var uncfmTxs []UnconfirmedTxn @@ -512,7 +739,7 @@ type expectTxResult struct { err error } -func TestGetTransctions(t *testing.T) { +func TestGetTransactions(t *testing.T) { // Generates test data txs, blocks, uncfmTxs, headSeq := makeTestData(t, 10) // Generates []Transaction @@ -1616,27 +1843,35 @@ func TestGetTransctions(t *testing.T) { for _, tc := range tt { t.Run(tc.name, func(t *testing.T) { + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + his := newHistoryerMock2() uncfmTxPool := NewUnconfirmedTxnPoolerMock2() for addr, txs := range tc.addrTxns { - his.On("GetAddrTxns", addr).Return(txs.Txs, nil) + his.On("GetAddressTxns", matchTx, addr).Return(txs.Txs, nil) his.txs = append(his.txs, txs.Txs...) - uncfmTxPool.On("GetUnspentsOfAddr", addr).Return(makeUncfmUxs(txs.UncfmTxs)) + uncfmTxPool.On("GetUnspentsOfAddr", matchTx, addr).Return(makeUncfmUxs(txs.UncfmTxs), nil) for i, uncfmTx := range txs.UncfmTxs { - uncfmTxPool.On("Get", uncfmTx.Hash()).Return(&txs.UncfmTxs[i], true) + uncfmTxPool.On("Get", matchTx, uncfmTx.Hash()).Return(&txs.UncfmTxs[i], nil) } uncfmTxPool.txs = append(uncfmTxPool.txs, txs.UncfmTxs...) } bc := NewBlockchainerMock() for i, b := range tc.blocks { - bc.On("GetBlockBySeq", b.Seq()).Return(&tc.blocks[i], nil) + bc.On("GetSignedBlockBySeq", matchTx, b.Seq()).Return(&tc.blocks[i], nil) } - bc.On("HeadSeq").Return(tc.bcHeadSeq) + bc.On("HeadSeq", matchTx).Return(tc.bcHeadSeq, true, nil) + + db, shutdown := prepareDB(t) + defer shutdown() v := &Visor{ + DB: db, history: his, Unconfirmed: uncfmTxPool, Blockchain: bc, @@ -1679,13 +1914,18 @@ func TestGetTransctions(t *testing.T) { } func TestRefreshUnconfirmed(t *testing.T) { - db, shutdown := testutil.PrepareDB(t) + db, shutdown := prepareDB(t) defer shutdown() - db, bc, err := loadBlockchain(db, genPublic, false) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTxnPool(db) require.NoError(t, err) - unconfirmed := NewUnconfirmedTxnPool(db) + his := historydb.New() cfg := NewVisorConfig() cfg.DBPath = db.Path() @@ -1698,11 +1938,18 @@ func TestRefreshUnconfirmed(t *testing.T) { Config: cfg, Unconfirmed: unconfirmed, Blockchain: bc, - db: db, + DB: db, + history: his, } - addGenesisBlock(t, v.Blockchain) - gb := v.Blockchain.GetGenesisBlock() + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) require.NotNil(t, gb) uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) @@ -1716,7 +1963,14 @@ func TestRefreshUnconfirmed(t *testing.T) { require.False(t, known) require.Nil(t, softErr) require.NoError(t, err) - require.Equal(t, 1, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) // Create a transaction with invalid decimal places // It's still injected, because this is considered a soft error @@ -1726,7 +1980,14 @@ func TestRefreshUnconfirmed(t *testing.T) { _, softErr, err = v.InjectTransaction(alwaysInvalidTxn) require.NoError(t, err) testutil.RequireError(t, softErr.Err, errInvalidDecimals.Error()) - require.Equal(t, 2, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) // Create a transaction that exceeds MaxBlockSize // It's still injected, because this is considered a soft error @@ -1736,7 +1997,14 @@ func TestRefreshUnconfirmed(t *testing.T) { _, softErr, err = v.InjectTransaction(sometimesInvalidTxn) require.NoError(t, err) testutil.RequireError(t, softErr.Err, errTxnExceedsMaxBlockSize.Error()) - require.Equal(t, 3, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(3), length) + return nil + }) + require.NoError(t, err) // The first txn remains valid, // the second txn remains invalid, @@ -1775,17 +2043,24 @@ func TestRefreshUnconfirmed(t *testing.T) { } func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { - db, shutdown := testutil.PrepareDB(t) + db, shutdown := prepareDB(t) defer shutdown() - db, bc, err := loadBlockchain(db, genPublic, true) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + Arbitrating: true, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTxnPool(db) require.NoError(t, err) - unconfirmed := NewUnconfirmedTxnPool(db) + his := historydb.New() cfg := NewVisorConfig() cfg.DBPath = db.Path() cfg.IsMaster = true + cfg.Arbitrating = true cfg.BlockchainPubkey = genPublic cfg.GenesisAddress = genAddress cfg.BlockchainSeckey = genSecret @@ -1794,11 +2069,18 @@ func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { Config: cfg, Unconfirmed: unconfirmed, Blockchain: bc, - db: db, + DB: db, + history: his, } - addGenesisBlock(t, v.Blockchain) - gb := v.Blockchain.GetGenesisBlock() + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) require.NotNil(t, gb) uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) @@ -1814,7 +2096,14 @@ func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { require.False(t, known) require.Nil(t, softErr) require.NoError(t, err) - require.Equal(t, 1, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) var fee uint64 = 1 txn2 := makeSpendTxWithFee(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins, fee) @@ -1822,27 +2111,913 @@ func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { require.False(t, known) require.Nil(t, softErr) require.NoError(t, err) - require.Equal(t, 2, unconfirmed.Len()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) // Execute a block, txn2 should be included because it has a higher fee sb, err := v.CreateAndExecuteBlock() require.NoError(t, err) require.Equal(t, 1, len(sb.Body.Transactions)) require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) - require.Equal(t, 1, unconfirmed.Len()) - require.Equal(t, uint64(2), bc.Len()) require.Equal(t, txn2.TxIDHex(), sb.Body.Transactions[0].TxIDHex()) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + // Call RemoveInvalidUnconfirmed, the first txn will be removed because it is now a double-spend txn removed, err := v.RemoveInvalidUnconfirmed() require.NoError(t, err) require.Equal(t, []cipher.SHA256{txn1.Hash()}, removed) - require.Equal(t, 0, unconfirmed.Len()) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func TestGetCreateTransactionAuxs(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + params wallet.CreateTransactionParams + addrs []cipher.Address + expectedAuxs coin.AddressUxOuts + err error + + rawTxnsRet coin.Transactions + getArrayInputs []cipher.SHA256 + getArrayRet coin.UxArray + getUnspentsOfAddrsRet coin.AddressUxOuts + }{ + { + name: "all addresses, ok", + addrs: allAddrs, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "all addresses, unconfirmed spends", + addrs: allAddrs, + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: allAddrs[3], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + + { + name: "some addresses, ok", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:4], + }, + }, + addrs: allAddrs[0:4], + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "some addresses, unconfirmed spends", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:4], + }, + }, + addrs: allAddrs[0:4], + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: allAddrs[3], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + + { + name: "some addresses, unconfirmed spends ignored", + params: wallet.CreateTransactionParams{ + IgnoreUnconfirmed: true, + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:5], + }, + }, + addrs: allAddrs[0:5], + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + }, + getArrayInputs: hashes[0:2], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[7], + Address: allAddrs[4], + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + allAddrs[4]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[7], + Address: allAddrs[4], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "some addresses, unknown address", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + }, + }, + addrs: allAddrs, + err: wallet.ErrUnknownAddress, + }, + + { + name: "uxouts specified, ok", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[0:4], + }, + }, + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[6:10], + }, + coin.Transaction{ + In: hashes[3:6], + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend ignored", + params: wallet.CreateTransactionParams{ + IgnoreUnconfirmed: true, + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + }, + getArrayInputs: hashes[5:8], // the 8th & 9th hash are filtered because it is an unconfirmed spend + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unknown uxout", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + err: wallet.ErrUnknownUxOut, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + } + + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := NewUnconfirmedTxnPoolerMock() + bc := NewBlockchainerMock() + unspent := NewUnspentPoolerMock() + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + } + + unconfirmed.On("RawTxns", matchTx).Return(tc.rawTxnsRet, nil) + unspent.On("GetArray", matchTx, mock.MatchedBy(func(args []cipher.SHA256) bool { + // Compares two []coin.UxOuts for equality, ignoring the order of elements in the slice + if len(args) != len(tc.getArrayInputs) { + return false + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(tc.getArrayInputs)) + for _, h := range tc.getArrayInputs { + _, ok := inputsMap[h] + require.False(t, ok) + inputsMap[h] = struct{}{} + } + + for _, h := range args { + _, ok := inputsMap[h] + if !ok { + return false + } + } + + return true + })).Return(tc.getArrayRet, nil) + if tc.getUnspentsOfAddrsRet != nil { + unspent.On("GetUnspentsOfAddrs", matchTx, tc.addrs).Return(tc.getUnspentsOfAddrsRet, nil) + } + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.DB.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxs(tx, tc.params, allAddrs) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +func makeTxn(t *testing.T, headTime uint64, in, out []coin.UxOut, keys []cipher.SecKey) (coin.Transaction, []wallet.UxBalance) { + inputs := make([]cipher.SHA256, len(in)) + for i, input := range in { + inputs[i] = input.Hash() + } + + outputs := make([]coin.TransactionOutput, len(out)) + for i, output := range out { + outputs[i] = coin.TransactionOutput{ + Address: output.Body.Address, + Coins: output.Body.Coins, + Hours: output.Body.Hours, + } + } + + txn := coin.Transaction{ + In: inputs, + Out: outputs, + } + + txn.SignInputs(keys) + txn.UpdateHeader() + + inbalances, err := wallet.NewUxBalances(headTime, in) + require.NoError(t, err) + return txn, inbalances +} + +func TestVerifyTxnVerbose(t *testing.T) { + head := coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(utc.UnixNow()), + }, + }, + } + + hashes := make([]cipher.SHA256, 20) + for i := 0; i < 20; i++ { + hashes[i] = testutil.RandSHA256(t) + } + + keys := make([]cipher.SecKey, 5) + for i := 0; i < 5; i++ { + _, keys[i] = cipher.GenerateKeyPair() + } + + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = cipher.AddressFromSecKey(keys[i]) + } + + srcTxnHashes := make([]cipher.SHA256, 5) + inputs := make([]coin.UxOut, 5) + historyOutputs := make([]*historydb.UxOut, 5) + // intputHashes := make([]cipher.SHA256, 5) + for i := 0; i < 5; i++ { + srcTxnHashes[i] = testutil.RandSHA256(t) + inputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + SrcTransaction: srcTxnHashes[i], + Address: addrs[i], + Coins: 10e6, + Hours: 1000, + }, + } + + historyOutputs[i] = &historydb.UxOut{ + Out: inputs[i], + } + } + + outputs := make([]coin.UxOut, 5) + for i := 0; i < 5; i++ { + outputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: 400 + uint64(i)*200, + }, + } + } + + // add uxout with math.MaxUint64 hours + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: math.MaxUint64, + }, + }) + + // add output which has 11e6 coins + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 500, + }, + }) + + // create a transaction + txn, spentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + + // create a transaction which sends coin to null address + toNullAddrTxn, toNullAddrSpentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + toNullAddrTxn.Out[0].Address = cipher.Address{} + + // create a transaction with insufficient coin hours + inSufficientCoinHoursTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:5], keys[:1]) + + // create a transaction with zero fee + zeroFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[3:4], keys[:1]) + + // create a transaction with output coin hours overflow + coinHourOverflowTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:], keys[:1]) + + // create a transaction with insufficient fee + insufficientFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[2:3], keys[:1]) + + // create a transaction with insufficient coins + insufficientCoinsTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[6:], keys[:1]) + + // create a transaction with invalid signature + badSigTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[1:2]) + + cases := []struct { + name string + txn coin.Transaction + isConfirmed bool + balances []wallet.UxBalance + err error + + maxBlockSize int + + getArrayRet coin.UxArray + getArrayErr error + + getHistoryTxnRet *historydb.Transaction + getHistoryTxnErr error + + getHistoryUxOutsRet []*historydb.UxOut + getHistoryUxOutsErr error + }{ + { + name: "transaction has been spent", + txn: txn, + isConfirmed: true, + balances: spentUxBalances[:], + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{Tx: txn}, + getHistoryUxOutsRet: historyOutputs[:1], + }, + { + name: "transaction does not exist in either unspents or historydb", + txn: txn, + isConfirmed: false, + err: ErrTxnViolatesHardConstraint{fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", inputs[0].Hash().Hex())}, + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + }, + { + name: "transaction violate user constratins, send to null address", + txn: toNullAddrTxn, + isConfirmed: false, + err: ErrTxnViolatesUserConstraint{errors.New("Transaction output is sent to the null address")}, + balances: toNullAddrSpentUxBalances[:], + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, transaction size bigger than max block size", + maxBlockSize: 1, + txn: txn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction size bigger than max block size")}, + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, Insufficient coinhours for transaction outputs", + txn: inSufficientCoinHoursTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientCoinHours}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, zero fee", + txn: zeroFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnNoFee}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, coin hour overflow", + txn: coinHourOverflowTxn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction output hours overflow")}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, insufficient fee", + txn: insufficientFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientFee}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, insufficient coin", + txn: insufficientCoinsTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Insufficient coins")}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, bad signature", + txn: badSigTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Signature not valid for output being spent")}, + getArrayRet: inputs[:1], + }, + { + name: "ok", + txn: txn, + balances: spentUxBalances, + getArrayRet: inputs[:1], + }, + } + + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + history := NewHistoryerMock() + bc := NewBlockchainerMock() + unspent := NewUnspentPoolerMock() + + bc.On("Unspent").Return(unspent) + bc.On("Head", matchTx).Return(&head, nil) + + unspent.On("GetArray", matchTx, tc.txn.In).Return(tc.getArrayRet, tc.getArrayErr) + + history.On("GetTransaction", matchTx, tc.txn.Hash()).Return(tc.getHistoryTxnRet, tc.getHistoryTxnErr) + history.On("GetUxOuts", matchTx, tc.txn.In).Return(tc.getHistoryUxOutsRet, tc.getHistoryUxOutsErr) + + v := &Visor{ + Blockchain: bc, + DB: db, + history: history, + Config: Config{ + MaxBlockSize: tc.maxBlockSize, + }, + } + + if v.Config.MaxBlockSize == 0 { + v.Config.MaxBlockSize = DefaultMaxBlockSize + } + + var isConfirmed bool + var balances []wallet.UxBalance + err := v.DB.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + balances, isConfirmed, err = v.VerifyTxnVerbose(&tc.txn) + return err + }) + + require.Equal(t, tc.err, err) + if tc.err != nil { + return + } + + require.NoError(t, err) + require.Equal(t, tc.isConfirmed, isConfirmed) + require.Equal(t, tc.balances, balances) + }) + } } // historyerMock2 embeds historyerMock, and rewrite the ForEach method type historyerMock2 struct { - historyerMock + HistoryerMock txs []historydb.Transaction } @@ -1850,9 +3025,9 @@ func newHistoryerMock2() *historyerMock2 { return &historyerMock2{} } -func (h *historyerMock2) ForEach(f func(tx *historydb.Transaction) error) error { +func (h *historyerMock2) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { for i := range h.txs { - if err := f(&h.txs[i]); err != nil { + if err := f(h.txs[i].Hash(), &h.txs[i]); err != nil { return err } } @@ -1869,12 +3044,12 @@ func NewUnconfirmedTxnPoolerMock2() *UnconfirmedTxnPoolerMock2 { return &UnconfirmedTxnPoolerMock2{} } -func (m *UnconfirmedTxnPoolerMock2) GetTxns(f func(tx UnconfirmedTxn) bool) []UnconfirmedTxn { +func (m *UnconfirmedTxnPoolerMock2) GetTxns(tx *dbutil.Tx, f func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { var txs []UnconfirmedTxn for i := range m.txs { if f(m.txs[i]) { txs = append(txs, m.txs[i]) } } - return txs + return txs, nil } diff --git a/src/wallet/balance.go b/src/wallet/balance.go index 40d13bb..397631f 100755 --- a/src/wallet/balance.go +++ b/src/wallet/balance.go @@ -15,6 +15,9 @@ type BalancePair struct { Predicted Balance `json:"predicted"` //do "pending" } +// AddressBalance represents a map of address balances +type AddressBalance map[string]BalancePair + // Balance is consisted of Coins and Hours type Balance struct { Coins uint64 `json:"coins"` diff --git a/src/wallet/readable.go b/src/wallet/readable.go index cc128d8..fd39582 100755 --- a/src/wallet/readable.go +++ b/src/wallet/readable.go @@ -145,8 +145,10 @@ func NewReadableWallet(w *Wallet) *ReadableWallet { // LoadReadableWallet loads a ReadableWallet from disk func LoadReadableWallet(filename string) (*ReadableWallet, error) { w := &ReadableWallet{} - err := w.Load(filename) - return w, err + if err := w.Load(filename); err != nil { + return nil, fmt.Errorf("load wallet %s failed: %v", filename, err) + } + return w, nil } // ToWallet convert readable wallet to Wallet diff --git a/src/wallet/service.go b/src/wallet/service.go index acba838..fc4d22e 100755 --- a/src/wallet/service.go +++ b/src/wallet/service.go @@ -7,7 +7,6 @@ import ( "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/blockdb" ) // BalanceGetter interface for getting the balance of given addresses @@ -304,10 +303,24 @@ func (serv *Service) ReloadWallets() error { return nil } +// ViewWallet will unlock a wallet for viewing if necessary, and call f +func (serv *Service) ViewWallet(w *Wallet, password []byte, f func(w *Wallet) error) error { + // NOTE: Does not need to use the mutex, because we are not accessing the wallets storage + + if w.IsEncrypted() { + return w.GuardView(password, f) + } + + if len(password) != 0 { + return ErrWalletNotEncrypted + } + + return f(w) +} + // CreateAndSignTransaction creates and signs a transaction from wallet. // Set the password as nil if the wallet is not encrypted, otherwise the password must be provided -func (serv *Service) CreateAndSignTransaction(wltID string, password []byte, vld Validator, unspent blockdb.UnspentGetter, - headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { +func (serv *Service) CreateAndSignTransaction(wltID string, password []byte, auxs coin.AddressUxOuts, headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { serv.RLock() defer serv.RUnlock() if !serv.enableWalletAPI { @@ -322,7 +335,7 @@ func (serv *Service) CreateAndSignTransaction(wltID string, password []byte, vld var tx *coin.Transaction f := func(wlt *Wallet) error { var err error - tx, err = wlt.CreateAndSignTransaction(vld, unspent, headTime, coins, dest) + tx, err = wlt.CreateAndSignTransaction(auxs, headTime, coins, dest) return err } @@ -340,8 +353,7 @@ func (serv *Service) CreateAndSignTransaction(wltID string, password []byte, vld // CreateAndSignTransactionAdvanced creates and signs a transaction based upon CreateTransactionParams. // Set the password as nil if the wallet is not encrypted, otherwise the password must be provided -func (serv *Service) CreateAndSignTransactionAdvanced(params CreateTransactionParams, vld Validator, - unspent blockdb.UnspentGetter, headTime uint64) (*coin.Transaction, []UxBalance, error) { +func (serv *Service) CreateAndSignTransactionAdvanced(params CreateTransactionParams, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { serv.RLock() defer serv.RUnlock() @@ -374,11 +386,11 @@ func (serv *Service) CreateAndSignTransactionAdvanced(params CreateTransactionPa if w.IsEncrypted() { err = w.GuardView(params.Wallet.Password, func(wlt *Wallet) error { var err error - tx, inputs, err = wlt.CreateAndSignTransactionAdvanced(params, vld, unspent, headTime) + tx, inputs, err = wlt.CreateAndSignTransactionAdvanced(params, auxs, headTime) return err }) } else { - tx, inputs, err = w.CreateAndSignTransactionAdvanced(params, vld, unspent, headTime) + tx, inputs, err = w.CreateAndSignTransactionAdvanced(params, auxs, headTime) } if err != nil { return nil, nil, err diff --git a/src/wallet/service_test.go b/src/wallet/service_test.go index 8b0916a..576a19d 100755 --- a/src/wallet/service_test.go +++ b/src/wallet/service_test.go @@ -693,7 +693,6 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { opts Options pwd []byte unspents []coin.UxOut - vld Validator coins uint64 dest cipher.Address disableWalletAPI bool @@ -705,11 +704,8 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 2e6, - dest: addrs[0], + coins: 2e6, + dest: addrs[0], }, { name: "encrypted=true has change=no", @@ -720,11 +716,8 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { }, pwd: []byte("pwd"), unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 2e6, - dest: addrs[0], + coins: 2e6, + dest: addrs[0], }, { name: "encrypted=false has change=yes", @@ -732,38 +725,8 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 1e6, - dest: addrs[0], - }, - { - name: "encrypted=false has unconfirmed spending transaction", - opts: Options{ - Seed: string(seed), - }, - unspents: uxouts[:], - vld: &dummyValidator{ - ok: true, - }, - coins: 2e6, - dest: addrs[0], - err: ErrSpendingUnconfirmed, - }, - { - name: "encrypted=false unconfirmed spend failed", - opts: Options{ - Seed: string(seed), - }, - unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - err: errors.New("fail intentionally"), - }, - coins: 2e6, - dest: addrs[0], - err: errors.New("checking unconfirmed spending failed: fail intentionally"), + coins: 1e6, + dest: addrs[0], }, { name: "encrypted=false spend zero", @@ -771,11 +734,8 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - dest: addrs[0], - err: ErrZeroSpend, + dest: addrs[0], + err: ErrZeroSpend, }, { name: "encrypted=false spend fractional coins", @@ -783,11 +743,8 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 1e3, - dest: addrs[0], + coins: 1e3, + dest: addrs[0], }, { name: "encrypted=false not enough confirmed coins", @@ -795,12 +752,9 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxouts[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 100e6, - dest: addrs[0], - err: ErrInsufficientBalance, + coins: 100e6, + dest: addrs[0], + err: ErrInsufficientBalance, }, { name: "encrypted=false no coin hours in inputs", @@ -808,12 +762,9 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), }, unspents: uxoutsNoHours[:], - vld: &dummyValidator{ - ok: false, - }, - coins: 1e6, - dest: addrsNoHours[0], - err: fee.ErrTxnNoFee, + coins: 1e6, + dest: addrsNoHours[0], + err: fee.ErrTxnNoFee, }, { name: "disable wallet api=true", @@ -821,7 +772,6 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { Seed: string(seed), Label: "label", }, - vld: &dummyValidator{}, disableWalletAPI: true, err: ErrWalletAPIDisabled, }, @@ -831,15 +781,16 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { for ct := range cryptoTable { name := fmt.Sprintf("crypto=%v %v", ct, tc.name) t.Run(name, func(t *testing.T) { - unspents := &dummyUnspentGetter{ - addrUnspents: coin.AddressUxOuts{ - addr: tc.unspents, - }, - unspents: map[cipher.SHA256]coin.UxOut{}, + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, } - for _, ux := range tc.unspents { - unspents.unspents[ux.Hash()] = ux + unspents := make(map[cipher.SHA256]coin.UxOut) + + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } } dir := prepareWltDir() @@ -851,7 +802,7 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { require.NoError(t, err) if tc.disableWalletAPI { - _, err = s.CreateAndSignTransaction("", tc.pwd, tc.vld, unspents, uint64(headTime), tc.coins, tc.dest) + _, err = s.CreateAndSignTransaction("", tc.pwd, addrUxOuts, uint64(headTime), tc.coins, tc.dest) require.Equal(t, tc.err, err) return } @@ -861,9 +812,10 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { w, err := s.CreateWallet(wltName, tc.opts, nil) require.NoError(t, err) - tx, err := s.CreateAndSignTransaction(w.Filename(), tc.pwd, tc.vld, unspents, uint64(headTime), tc.coins, tc.dest) + tx, err := s.CreateAndSignTransaction(w.Filename(), tc.pwd, addrUxOuts, uint64(headTime), tc.coins, tc.dest) if tc.err != nil { + require.Error(t, err) require.Equal(t, tc.err, err, err.Error()) return } @@ -872,7 +824,7 @@ func TestServiceCreateAndSignTransaction(t *testing.T) { // check the IN of tx for _, inUxid := range tx.In { - _, ok := unspents.unspents[inUxid] + _, ok := unspents[inUxid] require.True(t, ok) } @@ -912,10 +864,9 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { } // shuffle the uxouts to test that the uxout sorting during spend selection is working - for i := range uxouts { - j := rand.Intn(i + 1) + rand.Shuffle(len(uxouts), func(i, j int) { uxouts[i], uxouts[j] = uxouts[j], uxouts[i] - } + }) // Create extra unspent outputs. These have the same value as uxouts, but are spendable by // keys held in extraWalletAddrs @@ -942,10 +893,9 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { } // shuffle the uxouts to test that the uxout sorting during spend selection is working - for i := range uxoutsNoHours { - j := rand.Intn(i + 1) + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] - } + }) changeAddress := testutil.MakeAddress() @@ -953,7 +903,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{ { Address: addrs[0], @@ -972,6 +922,23 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { return &d } + firstAddress := func(uxa coin.UxArray) cipher.Address { + require.NotEmpty(t, uxa) + + addresses := make([]cipher.Address, len(uxa)) + for i, a := range uxa { + addresses[i] = a.Body.Address + } + + sort.Slice(addresses, func(i, j int) bool { + x := addresses[i].Bytes() + y := addresses[j].Bytes() + return bytes.Compare(x, y) < 0 + }) + + return addresses[0] + } + cases := []struct { name string err error @@ -998,7 +965,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "params invalid", params: CreateTransactionParams{}, - err: NewError(errors.New("ChangeAddress is required")), + err: NewError(errors.New("To is required")), }, { @@ -1026,28 +993,10 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { err: ErrWalletNotEncrypted, }, - { - name: "unconfirmed validator failed", - params: validParams, - vld: &dummyValidator{ - err: errors.New("validator failed"), - }, - err: errors.New("checking unconfirmed spending failed: validator failed"), - }, - - { - name: "has unconfirmed transactions", - params: validParams, - vld: &dummyValidator{ - ok: true, - }, - err: ErrSpendingUnconfirmed, - }, - { name: "overflowing coin hours in params", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1070,7 +1019,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "overflowing coins in params", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1093,7 +1042,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "no unspents", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1111,7 +1060,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "insufficient coins", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1130,7 +1079,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "insufficient hours", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1146,10 +1095,62 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { err: ErrInsufficientHours, }, + { + name: "insufficient coins for specified uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 1, + Coins: 3e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + }, + err: ErrInsufficientBalance, + }, + + { + name: "insufficient hours for specified uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 200, + Coins: 1e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + }, + err: ErrInsufficientHours, + }, + { name: "manual, 1 output, no change", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1166,15 +1167,13 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "manual, 1 output, no change, unknown address", + name: "manual, 1 output, no change, unknown address in auxs", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, - Wallet: CreateTransactionWalletParams{ - Addresses: append(extraWalletAddrs, testutil.MakeAddress()), - }, + Wallet: CreateTransactionWalletParams{}, To: []coin.TransactionOutput{ { Address: addrs[0], @@ -1183,13 +1182,16 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, }, }, + addressUnspents: coin.AddressUxOuts{ + testutil.MakeAddress(): []coin.UxOut{extraUxouts[0][0]}, + }, err: ErrUnknownAddress, }, { name: "manual, 1 output, change", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1210,12 +1212,35 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, }, + { + name: "manual, 1 output, change, unspecified change address", + params: CreateTransactionParams{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: firstAddress([]coin.UxOut{originalUxouts[0], originalUxouts[1]}), + Hours: 50, + Coins: 2e6 - 1, + }, + }, + { // there are leftover coin hours and an additional input is added // to force change to save the leftover coin hours name: "manual, 1 output, forced change", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1241,7 +1266,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { // but there are no more unspents to use to force a change output name: "manual, 1 output, forced change rejected no more unspents", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1263,7 +1288,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { // but the hours cost of saving them with an additional input is less than is leftover name: "manual, 1 output, forced change rejected", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1283,7 +1308,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { { name: "manual, multiple outputs", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, @@ -1315,15 +1340,13 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "manual, multiple outputs, specific spend addresses", + name: "manual, multiple outputs, varied addressUnspents", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, - Wallet: CreateTransactionWalletParams{ - Addresses: extraWalletAddrs, - }, + Wallet: CreateTransactionWalletParams{}, To: []coin.TransactionOutput{ { Address: addrs[0], @@ -1345,7 +1368,6 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { addressUnspents: coin.AddressUxOuts{ extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, - addr: []coin.UxOut{originalUxouts[3], originalUxouts[4], originalUxouts[5]}, extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, }, chosenUnspents: []coin.UxOut{extraUxouts[0][0], extraUxouts[3][1], extraUxouts[3][2], extraUxouts[5][6]}, @@ -1357,9 +1379,65 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "auto, multiple outputs, split even, share factor 0.5", + name: "manual, multiple uxouts, varied addressUnspents, wallet outputs specified", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + extraUxouts[3][1].Hash(), + extraUxouts[3][2].Hash(), + extraUxouts[5][6].Hash(), + + // this extra output is not necessary to satisfy the spend, + // it is included to test that when UxOuts are specified, + // only a subset is used + extraUxouts[0][8].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0], extraUxouts[0][8]}, + extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, + extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, + }, + chosenUnspents: []coin.UxOut{ + extraUxouts[0][0], + extraUxouts[3][1], + extraUxouts[3][2], + extraUxouts[5][6], + }, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 34, + Coins: 4e6 - 1, + }, + }, + + { + name: "auto, multiple outputs, share factor 0.5", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeAuto, Mode: HoursSelectionModeShare, @@ -1395,13 +1473,50 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "encrypted, auto, multiple outputs, split even, share factor 0.5", + name: "auto, multiple outputs, share factor 0.5, switch to 1.0 because no change could be made", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e6 - 1e3, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + toExpectedHours: []uint64{25, 50, 50, 25, 1}, + }, + + { + name: "encrypted, auto, multiple outputs, share factor 0.5", opts: Options{ Encrypt: true, Password: []byte("password"), }, params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeAuto, Mode: HoursSelectionModeShare, @@ -1440,9 +1555,9 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "auto, multiple outputs, split even, share factor 0", + name: "auto, multiple outputs, share factor 0", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeAuto, Mode: HoursSelectionModeShare, @@ -1478,9 +1593,9 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { }, { - name: "auto, multiple outputs, split even, share factor 1", + name: "auto, multiple outputs, share factor 1", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, HoursSelection: HoursSelection{ Type: HoursSelectionTypeAuto, Mode: HoursSelectionModeShare, @@ -1522,7 +1637,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { HoursSelection: HoursSelection{ Type: HoursSelectionTypeManual, }, - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{ { Address: addrs[0], @@ -1550,28 +1665,22 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { name := fmt.Sprintf("crypto=%v %v", ct, tc.name) fmt.Println(name) t.Run(name, func(t *testing.T) { - if tc.vld == nil { - tc.vld = &dummyValidator{} - } - if tc.headTime == 0 { tc.headTime = headTime } - unspents := &dummyUnspentGetter{ - addrUnspents: coin.AddressUxOuts{ - addr: tc.unspents, - }, - unspents: map[cipher.SHA256]coin.UxOut{}, + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, } if tc.addressUnspents != nil { - unspents.addrUnspents = tc.addressUnspents + addrUxOuts = tc.addressUnspents } - for _, uxs := range unspents.addrUnspents { + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { for _, ux := range uxs { - unspents.unspents[ux.Hash()] = ux + unspents[ux.Hash()] = ux } } @@ -1601,6 +1710,15 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { if !w.IsEncrypted() { _, err := s.NewAddresses(w.Filename(), nil, 10) require.NoError(t, err) + + w, err = s.GetWallet(wltName) + require.NoError(t, err) + + require.Equal(t, 11, len(w.Entries)) + require.Equal(t, w.Entries[0].Address, addr) + for i, e := range w.Entries[1:] { + require.Equal(t, e.Address, extraWalletAddrs[i]) + } } tc.params.Wallet.ID = wltName @@ -1608,7 +1726,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { s.enableWalletAPI = !tc.disableWalletAPI - txn, inputs, err := s.CreateAndSignTransactionAdvanced(tc.params, tc.vld, unspents, tc.headTime) + txn, inputs, err := s.CreateAndSignTransactionAdvanced(tc.params, addrUxOuts, tc.headTime) if tc.err != nil { require.Equal(t, tc.err, err) return @@ -1630,7 +1748,7 @@ func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { } for i, inUxid := range txn.In { - _, ok := unspents.unspents[inUxid] + _, ok := unspents[inUxid] require.True(t, ok) require.Equal(t, inUxid, inputs[i].Hash) @@ -2437,36 +2555,7 @@ func TestGetWalletSeed(t *testing.T) { } } -type dummyValidator struct { - ok bool - err error -} - -func (dvld dummyValidator) HasUnconfirmedSpendTx(addr []cipher.Address) (bool, error) { - return dvld.ok, dvld.err -} - -type dummyUnspentGetter struct { - addrUnspents coin.AddressUxOuts - unspents map[cipher.SHA256]coin.UxOut -} - -func (dug dummyUnspentGetter) GetUnspentsOfAddrs(addrs []cipher.Address) coin.AddressUxOuts { - out := coin.AddressUxOuts{} - for _, a := range addrs { - if x, ok := dug.addrUnspents[a]; ok { - out[a] = x - } - } - return out -} - -func (dug dummyUnspentGetter) Get(uxid cipher.SHA256) (coin.UxOut, bool) { - uxout, ok := dug.unspents[uxid] - return uxout, ok -} - -func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { // nolint: unparam body := makeUxBody(t, s, coins, hours) tm := rand.Int31n(1000) seq := rand.Int31n(100) diff --git a/src/wallet/wallet.go b/src/wallet/wallet.go index af6dc9d..7d944ff 100755 --- a/src/wallet/wallet.go +++ b/src/wallet/wallet.go @@ -17,7 +17,6 @@ import ( "github.com/skycoin/skycoin/src/cipher" "github.com/skycoin/skycoin/src/coin" - "github.com/skycoin/skycoin/src/visor/blockdb" "github.com/shopspring/decimal" @@ -85,7 +84,9 @@ var ( // ErrInvalidHoursSelectionType for invalid HoursSelection type values ErrInvalidHoursSelectionType = NewError(errors.New("invalid hours selection type")) // ErrUnknownAddress is returned if an address is not found in a wallet - ErrUnknownAddress = NewError(errors.New("Address not found in wallet")) + ErrUnknownAddress = NewError(errors.New("address not found in wallet")) + // ErrUnknownUxOut is returned if a uxout is not owned by any address in a wallet + ErrUnknownUxOut = NewError(errors.New("uxout is not owned by any address in the wallet")) // ErrNoUnspents is returned if a wallet has no unspents to spend ErrNoUnspents = NewError(errors.New("no unspents to spend")) ) @@ -98,7 +99,7 @@ const ( WalletTimestampFormat = "2006_01_02" // CoinTypeSkycoin skycoin type - CoinTypeSkycoin CoinType = "solarbankerscoin" + CoinTypeSkycoin CoinType = "skycoin" // CoinTypeBitcoin bitcoin type CoinTypeBitcoin CoinType = "bitcoin" ) @@ -152,22 +153,24 @@ type HoursSelection struct { // CreateTransactionWalletParams defines a wallet to spend from and optionally which addresses in the wallet type CreateTransactionWalletParams struct { ID string + UxOuts []cipher.SHA256 Addresses []cipher.Address Password []byte } // CreateTransactionParams defines control parameters for transaction construction type CreateTransactionParams struct { - HoursSelection HoursSelection - Wallet CreateTransactionWalletParams - ChangeAddress cipher.Address - To []coin.TransactionOutput + IgnoreUnconfirmed bool + HoursSelection HoursSelection + Wallet CreateTransactionWalletParams + ChangeAddress *cipher.Address + To []coin.TransactionOutput } // Validate validates CreateTransactionParams func (c CreateTransactionParams) Validate() error { - if c.ChangeAddress.Null() { - return NewError(errors.New("ChangeAddress is required")) + if c.ChangeAddress != nil && c.ChangeAddress.Null() { + return NewError(errors.New("ChangeAddress must not be the null address")) } if len(c.To) == 0 { @@ -202,10 +205,17 @@ func (c CreateTransactionParams) Validate() error { return NewError(errors.New("Wallet.ID is required")) } + addressMap := make(map[cipher.Address]struct{}, len(c.Wallet.Addresses)) for _, a := range c.Wallet.Addresses { if a.Null() { return NewError(errors.New("Wallet.Addresses must not contain the null address")) } + + addressMap[a] = struct{}{} + } + + if len(addressMap) != len(c.Wallet.Addresses) { + return NewError(errors.New("Wallet.Addresses contains duplicate values")) } switch c.HoursSelection.Type { @@ -249,6 +259,20 @@ func (c CreateTransactionParams) Validate() error { } } + if len(c.Wallet.UxOuts) != 0 && len(c.Wallet.Addresses) != 0 { + return NewError(errors.New("Wallet.UxOuts and Wallet.Addresses cannot be combined")) + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(c.Wallet.UxOuts)) + for _, o := range c.Wallet.UxOuts { + uxouts[o] = struct{}{} + } + + if len(uxouts) != len(c.Wallet.UxOuts) { + return NewError(errors.New("Wallet.UxOuts contains duplicate values")) + } + return nil } @@ -584,10 +608,7 @@ func (w *Wallet) GuardView(password []byte, f func(w *Wallet) error) error { defer wlt.erase() - if err := f(wlt); err != nil { - return err - } - return nil + return f(wlt) } // Load loads wallet from a given file @@ -939,25 +960,21 @@ type Validator interface { // CreateAndSignTransaction Creates a Transaction // spending coins and hours from wallet -func (w *Wallet) CreateAndSignTransaction(vld Validator, unspent blockdb.UnspentGetter, - headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { +func (w *Wallet) CreateAndSignTransaction(auxs coin.AddressUxOuts, headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { if w.IsEncrypted() { return nil, ErrWalletEncrypted } - addrs := w.GetAddresses() - ok, err := vld.HasUnconfirmedSpendTx(addrs) - if err != nil { - return nil, fmt.Errorf("checking unconfirmed spending failed: %v", err) - } - - if ok { - return nil, ErrSpendingUnconfirmed + entriesMap := make(map[cipher.Address]Entry) + for a := range auxs { + e, ok := w.GetEntry(a) + // Check that auxs does not contain addresses that are not known to this wallet + if !ok { + return nil, ErrUnknownAddress + } + entriesMap[e.Address] = e } - txn := coin.Transaction{} - auxs := unspent.GetUnspentsOfAddrs(addrs) - // Determine which unspents to spend. // Use the MaximizeUxOuts strategy, this will keep the uxout pool smaller uxa := auxs.Flatten() @@ -972,20 +989,17 @@ func (w *Wallet) CreateAndSignTransaction(vld Validator, unspent blockdb.Unspent } // Add these unspents as tx inputs + var txn coin.Transaction toSign := make([]cipher.SecKey, len(spends)) spending := Balance{Coins: 0, Hours: 0} for i, au := range spends { - entry, exists := w.GetEntry(au.Address) - if !exists { - return nil, NewError(fmt.Errorf("address:%v does not exist in wallet: %v", au.Address, w.Filename())) + entry, ok := entriesMap[au.Address] + if !ok { + return nil, NewError(fmt.Errorf("address %v does not exist in wallet %v", au.Address, w.Filename())) } txn.PushInput(au.Hash) - if w.IsEncrypted() { - return nil, ErrWalletEncrypted - } - toSign[i] = entry.Secret spending.Coins += au.Coins @@ -1021,9 +1035,9 @@ func (w *Wallet) CreateAndSignTransaction(vld Validator, unspent blockdb.Unspent } // CreateAndSignTransactionAdvanced creates and signs a transaction based upon CreateTransactionParams. -// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided -func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams, vld Validator, - unspent blockdb.UnspentGetter, headTime uint64) (*coin.Transaction, []UxBalance, error) { +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// NOTE: Caller must ensure that auxs correspond to params.Wallet.Addresses and params.Wallet.UxOuts options +func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { if err := params.Validate(); err != nil { return nil, nil, err } @@ -1036,37 +1050,17 @@ func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams return nil, nil, ErrWalletEncrypted } - addrList := make([]cipher.Address, 0) entriesMap := make(map[cipher.Address]Entry) - if len(params.Wallet.Addresses) == 0 { - for _, e := range w.Entries { - addrList = append(addrList, e.Address) - entriesMap[e.Address] = e - } - } else { - for _, a := range params.Wallet.Addresses { - e, ok := w.GetEntry(a) - if !ok { - return nil, nil, ErrUnknownAddress - } - addrList = append(addrList, e.Address) - entriesMap[e.Address] = e + for a := range auxs { + // Check that auxs does not contain addresses that are not known to this wallet + e, ok := w.GetEntry(a) + if !ok { + return nil, nil, ErrUnknownAddress } - } - - ok, err := vld.HasUnconfirmedSpendTx(addrList) - if err != nil { - // The error from HasUnconfirmedSpendTx isn't wrapped with wallet.Error because - // it is from outside the wallet package and is likely some database or other - // unexpected failure - return nil, nil, fmt.Errorf("checking unconfirmed spending failed: %v", err) - } - if ok { - return nil, nil, ErrSpendingUnconfirmed + entriesMap[e.Address] = e } txn := &coin.Transaction{} - auxs := unspent.GetUnspentsOfAddrs(addrList) // Determine which unspents to spend uxa := auxs.Flatten() @@ -1103,7 +1097,6 @@ func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams // Use the MinimizeUxOuts strategy, to use least possible uxouts // this will allow more frequent spending // we don't need to check whether we have sufficient balance beforehand as ChooseSpends already checks that - spends, err := ChooseSpendsMinimizeUxOuts(uxb, totalOutCoins, requestedHours) if err != nil { return nil, nil, err @@ -1124,7 +1117,12 @@ func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams return nil, nil, err } - toSign[i] = entriesMap[spend.Address].Secret + entry, ok := entriesMap[spend.Address] + if !ok { + return nil, nil, fmt.Errorf("spend address %s not found in entriesMap", spend.Address.String()) + } + + toSign[i] = entry.Secret txn.PushInput(spend.Hash) } @@ -1184,18 +1182,18 @@ func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams return nil, nil, err } - // Make sure we have enough coinhours - // If we don't at this point, then ChooseSpends has a bug, it should have returned this error already - if totalOutHours > remainingHours { - logger.WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") - return nil, nil, fee.ErrTxnInsufficientCoinHours - } - + // Make sure we have enough coins and coin hours + // If we don't, and we called ChooseSpends, then ChooseSpends has a bug, as it should have returned this error already if totalOutCoins > totalInputCoins { logger.WithError(ErrInsufficientBalance).Error("Insufficient coins after choosing spends, this should not occur") return nil, nil, ErrInsufficientBalance } + if totalOutHours > remainingHours { + logger.WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") + return nil, nil, fee.ErrTxnInsufficientCoinHours + } + // create change output changeCoins := totalInputCoins - totalOutCoins changeHours := remainingHours - totalOutHours @@ -1246,14 +1244,58 @@ func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams return nil, nil, err } - toSign = append(toSign, entriesMap[extra.Address].Secret) + entry, ok := entriesMap[extra.Address] + if !ok { + return nil, nil, fmt.Errorf("extra spend address %s not found in entriesMap", extra.Address.String()) + } + + toSign = append(toSign, entry.Secret) txn.PushInput(extra.Hash) } } } + // With auto share mode, if there are leftover hours and change couldn't be force-added, + // recalculate that share ratio at 100% + if changeCoins == 0 && changeHours > 0 && params.HoursSelection.Type == HoursSelectionTypeAuto && params.HoursSelection.Mode == HoursSelectionModeShare { + oneDecimal := decimal.New(1, 0) + if params.HoursSelection.ShareFactor.Equal(oneDecimal) { + return nil, nil, errors.New("share factor is 1.0 but changeHours > 0 unexpectedly") + } + params.HoursSelection.ShareFactor = &oneDecimal + return w.CreateAndSignTransactionAdvanced(params, auxs, headTime) + } + if changeCoins > 0 { - txn.PushOutput(params.ChangeAddress, changeCoins, changeHours) + var changeAddress cipher.Address + if params.ChangeAddress != nil { + changeAddress = *params.ChangeAddress + } else { + // Choose a change address from the unspent outputs + // Sort spends by address, comparing bytes, and use the first + // This provides deterministic change address selection from a set of unspent outputs + if len(spends) == 0 { + return nil, nil, errors.New("spends is unexpectedly empty when choosing an automatic change address") + } + + addressBytes := make([][]byte, len(spends)) + for i, s := range spends { + addressBytes[i] = s.Address.Bytes() + } + + sort.Slice(addressBytes, func(i, j int) bool { + return bytes.Compare(addressBytes[i], addressBytes[j]) < 0 + }) + + var err error + changeAddress, err = cipher.AddressFromBytes(addressBytes[0]) + if err != nil { + logger.Critical().Errorf("cipher.AddressFromBytes failed for change address converted to bytes: %v", err) + return nil, nil, err + } + } + + txn.PushOutput(changeAddress, changeCoins, changeHours) } txn.SignInputs(toSign) diff --git a/src/wallet/wallet_test.go b/src/wallet/wallet_test.go index 29fe464..065b833 100755 --- a/src/wallet/wallet_test.go +++ b/src/wallet/wallet_test.go @@ -506,7 +506,7 @@ func TestLockAndUnLock(t *testing.T) { } } -func makeWallet(t *testing.T, opts Options, addrNum uint64) *Wallet { +func makeWallet(t *testing.T, opts Options, addrNum uint64) *Wallet { // nolint: unparam // Create an unlocked wallet, then generate addresses, lock if the options.Encrypt is true. preOpts := opts opts.Encrypt = false @@ -1364,10 +1364,9 @@ func TestWalletSortSpendsHighToLow(t *testing.T) { uxb := make([]UxBalance, len(orderedUxb)) copy(uxb, orderedUxb) - for i := range uxb { - j := rand.Intn(i + 1) + rand.Shuffle(len(uxb), func(i, j int) { uxb[i], uxb[j] = uxb[j], uxb[i] - } + }) if !uxBalancesEqual(uxb, orderedUxb) { shuffleWorked = true @@ -1405,7 +1404,7 @@ func TestWalletChooseSpendsMaximizeUxOuts(t *testing.T) { } } -func TestWalletChooseSpendsMinimizeUxOuts(t *testing.T) { +func TestWalletChooseSpendsMinimizeUxOutsRandom(t *testing.T) { nRand := 10000 for i := 0; i < nRand; i++ { coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 @@ -1899,6 +1898,7 @@ func verifySortedCoinsHighToLow(t *testing.T, uxb []UxBalance) { func TestCreateWalletParamsVerify(t *testing.T) { changeAddress := testutil.MakeAddress() + toManual := []coin.TransactionOutput{ { Address: testutil.MakeAddress(), @@ -1928,20 +1928,25 @@ func TestCreateWalletParamsVerify(t *testing.T) { onePointOne := decimal.New(11, -1) pointOneOne := decimal.New(11, -2) + uxoutHash := testutil.RandSHA256(t) + cases := []struct { name string params CreateTransactionParams err string }{ { - name: "no change address", - err: "ChangeAddress is required", + name: "null change address", + params: CreateTransactionParams{ + ChangeAddress: &cipher.Address{}, + }, + err: "ChangeAddress must not be the null address", }, { name: "no to destinations", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, }, err: "To is required", }, @@ -1949,7 +1954,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "missing to coins", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{ { Address: testutil.MakeAddress(), @@ -1963,7 +1968,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "missing to address", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{ { Coins: 5, @@ -1977,7 +1982,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "missing wallet id", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, }, err: "Wallet.ID is required", @@ -1986,7 +1991,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "wallet addresses contains empty value", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -1999,7 +2004,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "nonzero to hours for auto selection", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2015,7 +2020,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "mode missing for auto selection", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2031,7 +2036,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "mode set for manual selection", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2048,7 +2053,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "missing hours selection type", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2064,7 +2069,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "invalid hours selection type", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2080,7 +2085,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "invalid hours selection mode", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2097,7 +2102,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "share factor not set for split even mode", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2114,7 +2119,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "share factor set but not split even mode", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2131,7 +2136,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "share factor less than 0", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2149,7 +2154,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "share factor greater than 1", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2167,7 +2172,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "duplicate output when manual", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{toManual[0], toManual[0]}, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2182,7 +2187,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "duplicate output when auto", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: []coin.TransactionOutput{toAuto[0], toAuto[0]}, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2196,10 +2201,59 @@ func TestCreateWalletParamsVerify(t *testing.T) { err: "To contains duplicate values", }, + { + name: "both uxouts and addresses specified", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{changeAddress}, + UxOuts: []cipher.SHA256{uxoutHash}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.UxOuts and Wallet.Addresses cannot be combined", + }, + + { + name: "duplicate uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + UxOuts: []cipher.SHA256{uxoutHash, uxoutHash}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.UxOuts contains duplicate values", + }, + + { + name: "duplicate addresses", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{changeAddress, changeAddress}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.Addresses contains duplicate values", + }, + { name: "valid auto split even share factor", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toAuto, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", @@ -2216,7 +2270,7 @@ func TestCreateWalletParamsVerify(t *testing.T) { { name: "valid manual", params: CreateTransactionParams{ - ChangeAddress: changeAddress, + ChangeAddress: &changeAddress, To: toManual, Wallet: CreateTransactionWalletParams{ ID: "foo.wlt", diff --git a/src/wallet/wallets.go b/src/wallet/wallets.go index 21bbc72..1b28d60 100755 --- a/src/wallet/wallets.go +++ b/src/wallet/wallets.go @@ -52,7 +52,7 @@ func LoadWallets(dir string) (Wallets, error) { return wallets, nil } -func backupWltFile(src, dst string) error { +func backupWltFile(src, dst string) error { //nolint: deadcode if _, err := os.Stat(dst); err == nil { return fmt.Errorf("%v file already exist", dst) } diff --git a/template/coin.template b/template/coin.template new file mode 100755 index 0000000..a21a9c9 --- /dev/null +++ b/template/coin.template @@ -0,0 +1,82 @@ +package main + +import ( + _ "net/http/pprof" + "github.com/skycoin/skycoin/src/skycoin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" +) + + +var ( + // Version of the node. Can be set by -ldflags + Version = "{{.Version}}" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "{{.GenesisSignatureStr}}" + // GenesisAddressStr genesis address string + GenesisAddressStr = "{{.GenesisAddressStr}}" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "{{.BlockchainPubkeyStr}}" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "{{.BlockchainSeckeyStr}}" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = {{.GenesisTimestamp}} + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = {{.GenesisCoinVolume}} + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + {{- range $index, $address := .DefaultConnections}} + "{{$address -}}", + {{- end}} + } +) + +func main() { + // get node config + nodeConfig := skycoin.NewNodeConfig(ConfigMode, skycoin.NodeParameters{ + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "{{.PeerListURL}}", + Port: {{.Port}}, + WebInterfacePort: {{.WebInterfacePort}}, + DataDirectory: "{{.DataDirectory}}", + ProfileCPUFile: "{{.ProfileCPUFile}}", + }) + + // create a new fiber coin instance + coin := skycoin.NewCoin( + skycoin.Config{ + Node: *nodeConfig, + Build: visor.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, + logger, + ) + + // parse config values + coin.ParseConfig() + + // run fiber coin node + coin.Run() +} diff --git a/template/visor.template b/template/visor.template new file mode 100755 index 0000000..6c9a2fe --- /dev/null +++ b/template/visor.template @@ -0,0 +1,33 @@ +package visor + +/* +* CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +* AVOID EDITING THIS MANUALLY +*/ + +const ( + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 = {{.MaxCoinSupply}} + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 = {{.DistributionAddressesTotal}} + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 = MaxCoinSupply / DistributionAddressesTotal + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 = {{.InitialUnlockedCount}} + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 = {{.UnlockAddressRate}} + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 = {{.UnlockTimeInterval}} // in seconds + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 = {{.MaxDropletPrecision}} + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int = {{.DefaultMaxBlockSize}} // in bytes +) + +var distributionAddresses = [DistributionAddressesTotal]string{ +{{- range $index, $address := .DistributionAddresses}} + "{{$address -}}", +{{- end}} +} diff --git a/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/NYTimes/gziphandler/.gitignore new file mode 100755 index 0000000..1377554 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/NYTimes/gziphandler/.travis.yml new file mode 100755 index 0000000..d2b67f6 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.7 + - 1.8 + - tip diff --git a/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md new file mode 100755 index 0000000..cdbca19 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +--- +layout: code-of-conduct +version: v1.0 +--- + +This code of conduct outlines our expectations for participants within the **NYTimes/gziphandler** community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community. + +Our open source community strives to: + +* **Be friendly and patient.** +* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. +* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. +* **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. +* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. +* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. + +## Definitions + +Harassment includes, but is not limited to: + +- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation +- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment +- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle +- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*” or “*backrub*”) without consent or after a request to stop +- Threats of violence, both physical and psychological +- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm +- Deliberate intimidation +- Stalking or following +- Harassing photography or recording, including logging online activity for harassment purposes +- Sustained disruption of discussion +- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour +- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others +- Continued one-on-one communication after requests to cease +- Deliberate “outing” of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse +- Publication of non-harassing private communication + +Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding: + +- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’ +- Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you” +- Refusal to explain or debate social justice concepts +- Communicating in a ‘tone’ you don’t find congenial +- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions + + +### Diversity Statement + +We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong. + +Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected +characteristics above, including participants with disabilities. + +### Reporting Issues + +If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via **code@nytimes.com**. All reports will be handled with discretion. In your report please include: + +- Your contact information. +- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please +include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link. +- Any additional information that may be helpful. + +After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse. + +### Attribution & Acknowledgements + +We all stand on the shoulders of giants across many open source communities. We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration: + +* [Django](https://www.djangoproject.com/conduct/reporting/) +* [Python](https://www.python.org/community/diversity/) +* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct) +* [Contributor Covenant](http://contributor-covenant.org/) +* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/) +* [Citizen Code of Conduct](http://citizencodeofconduct.org/) + +This Code of Conduct was based on https://github.com/todogroup/opencodeofconduct diff --git a/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md new file mode 100755 index 0000000..b89a9eb --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md @@ -0,0 +1,30 @@ +# Contributing to NYTimes/gziphandler + +This is an open source project started by handful of developers at The New York Times and open to the entire Go community. + +We really appreciate your help! + +## Filing issues + +When filing an issue, make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +## Contributing code + +Before submitting changes, please follow these guidelines: + +1. Check the open issues and pull requests for existing discussions. +2. Open an issue to discuss a new feature. +3. Write tests. +4. Make sure code follows the ['Go Code Review Comments'](https://github.com/golang/go/wiki/CodeReviewComments). +5. Make sure your changes pass `go test`. +6. Make sure the entire test suite passes locally and on Travis CI. +7. Open a Pull Request. +8. [Squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) after receiving feedback and add a [great commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +Unless otherwise noted, the gziphandler source files are distributed under the Apache 2.0-style license found in the LICENSE.md file. diff --git a/vendor/github.com/NYTimes/gziphandler/LICENSE b/vendor/github.com/NYTimes/gziphandler/LICENSE new file mode 100755 index 0000000..df6192d --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/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 2016-2017 The New York Times Company + + 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/NYTimes/gziphandler/README.md b/vendor/github.com/NYTimes/gziphandler/README.md new file mode 100755 index 0000000..6d72460 --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/README.md @@ -0,0 +1,52 @@ +Gzip Handler +============ + +This is a tiny Go package which wraps HTTP handlers to transparently gzip the +response body, for clients which support it. Although it's usually simpler to +leave that to a reverse proxy (like nginx or Varnish), this package is useful +when that's undesirable. + + +## Usage + +Call `GzipHandler` with any handler (an object which implements the +`http.Handler` interface), and it'll return a new handler which gzips the +response. For example: + +```go +package main + +import ( + "io" + "net/http" + "github.com/NYTimes/gziphandler" +) + +func main() { + withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + io.WriteString(w, "Hello, World") + }) + + withGz := gziphandler.GzipHandler(withoutGz) + + http.Handle("/", withGz) + http.ListenAndServe("0.0.0.0:8000", nil) +} +``` + + +## Documentation + +The docs can be found at [godoc.org][docs], as usual. + + +## License + +[Apache 2.0][license]. + + + + +[docs]: https://godoc.org/github.com/nytimes/gziphandler +[license]: https://github.com/nytimes/gziphandler/blob/master/LICENSE.md diff --git a/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/NYTimes/gziphandler/gzip.go new file mode 100755 index 0000000..f91dcfa --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/gzip.go @@ -0,0 +1,429 @@ +package gziphandler + +import ( + "bufio" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" +) + +const ( + vary = "Vary" + acceptEncoding = "Accept-Encoding" + contentEncoding = "Content-Encoding" + contentType = "Content-Type" + contentLength = "Content-Length" +) + +type codings map[string]float64 + +const ( + // DefaultQValue is the default qvalue to assign to an encoding if no explicit qvalue is set. + // This is actually kind of ambiguous in RFC 2616, so hopefully it's correct. + // The examples seem to indicate that it is. + DefaultQValue = 1.0 + + // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. + // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. + // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. + DefaultMinSize = 1400 +) + +// gzipWriterPools stores a sync.Pool for each compression level for reuse of +// gzip.Writers. Use poolIndex to covert a compression level to an index into +// gzipWriterPools. +var gzipWriterPools [gzip.BestCompression - gzip.BestSpeed + 2]*sync.Pool + +func init() { + for i := gzip.BestSpeed; i <= gzip.BestCompression; i++ { + addLevelPool(i) + } + addLevelPool(gzip.DefaultCompression) +} + +// poolIndex maps a compression level to its index into gzipWriterPools. It +// assumes that level is a valid gzip compression level. +func poolIndex(level int) int { + // gzip.DefaultCompression == -1, so we need to treat it special. + if level == gzip.DefaultCompression { + return gzip.BestCompression - gzip.BestSpeed + 1 + } + return level - gzip.BestSpeed +} + +func addLevelPool(level int) { + gzipWriterPools[poolIndex(level)] = &sync.Pool{ + New: func() interface{} { + // NewWriterLevel only returns error on a bad level, we are guaranteeing + // that this will be a valid level so it is okay to ignore the returned + // error. + w, _ := gzip.NewWriterLevel(nil, level) + return w + }, + } +} + +// GzipResponseWriter provides an http.ResponseWriter interface, which gzips +// bytes before writing them to the underlying response. This doesn't close the +// writers, so don't forget to do that. +// It can be configured to skip response smaller than minSize. +type GzipResponseWriter struct { + http.ResponseWriter + index int // Index for gzipWriterPools. + gw *gzip.Writer + + code int // Saves the WriteHeader value. + + minSize int // Specifed the minimum response size to gzip. If the response length is bigger than this value, it is compressed. + buf []byte // Holds the first part of the write before reaching the minSize or the end of the write. + + contentTypes []string // Only compress if the response is one of these content-types. All are accepted if empty. +} + +type GzipResponseWriterWithCloseNotify struct { + *GzipResponseWriter +} + +func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool { + return w.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +// Write appends data to the gzip writer. +func (w *GzipResponseWriter) Write(b []byte) (int, error) { + // If content type is not set. + if _, ok := w.Header()[contentType]; !ok { + // It infer it from the uncompressed body. + w.Header().Set(contentType, http.DetectContentType(b)) + } + + // GZIP responseWriter is initialized. Use the GZIP responseWriter. + if w.gw != nil { + n, err := w.gw.Write(b) + return n, err + } + + // Save the write into a buffer for later use in GZIP responseWriter (if content is long enough) or at close with regular responseWriter. + // On the first write, w.buf changes from nil to a valid slice + w.buf = append(w.buf, b...) + + // If the global writes are bigger than the minSize and we're about to write + // a response containing a content type we want to handle, enable + // compression. + if len(w.buf) >= w.minSize && handleContentType(w.contentTypes, w) && w.Header().Get(contentEncoding) == "" { + err := w.startGzip() + if err != nil { + return 0, err + } + } + + return len(b), nil +} + +// startGzip initialize any GZIP specific informations. +func (w *GzipResponseWriter) startGzip() error { + + // Set the GZIP header. + w.Header().Set(contentEncoding, "gzip") + + // if the Content-Length is already set, then calls to Write on gzip + // will fail to set the Content-Length header since its already set + // See: https://github.com/golang/go/issues/14975. + w.Header().Del(contentLength) + + // Write the header to gzip response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + + // Initialize the GZIP response. + w.init() + + // Flush the buffer into the gzip response. + n, err := w.gw.Write(w.buf) + + // This should never happen (per io.Writer docs), but if the write didn't + // accept the entire buffer but returned no specific error, we have no clue + // what's going on, so abort just to be safe. + if err == nil && n < len(w.buf) { + return io.ErrShortWrite + } + + w.buf = nil + return err +} + +// WriteHeader just saves the response code until close or GZIP effective writes. +func (w *GzipResponseWriter) WriteHeader(code int) { + if w.code == 0 { + w.code = code + } +} + +// init graps a new gzip writer from the gzipWriterPool and writes the correct +// content encoding header. +func (w *GzipResponseWriter) init() { + // Bytes written during ServeHTTP are redirected to this gzip writer + // before being written to the underlying response. + gzw := gzipWriterPools[w.index].Get().(*gzip.Writer) + gzw.Reset(w.ResponseWriter) + w.gw = gzw +} + +// Close will close the gzip.Writer and will put it back in the gzipWriterPool. +func (w *GzipResponseWriter) Close() error { + if w.gw == nil { + // Gzip not trigged yet, write out regular response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + if w.buf != nil { + _, writeErr := w.ResponseWriter.Write(w.buf) + // Returns the error if any at write. + if writeErr != nil { + return fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", writeErr.Error()) + } + } + return nil + } + + err := w.gw.Close() + gzipWriterPools[w.index].Put(w.gw) + w.gw = nil + return err +} + +// Flush flushes the underlying *gzip.Writer and then the underlying +// http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter +// an http.Flusher. +func (w *GzipResponseWriter) Flush() { + if w.gw == nil { + // Only flush once startGzip has been called. + // + // Flush is thus a no-op until the written body + // exceeds minSize. + return + } + + w.gw.Flush() + + if fw, ok := w.ResponseWriter.(http.Flusher); ok { + fw.Flush() + } +} + +// Hijack implements http.Hijacker. If the underlying ResponseWriter is a +// Hijacker, its Hijack method is returned. Otherwise an error is returned. +func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := w.ResponseWriter.(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, fmt.Errorf("http.Hijacker interface is not supported") +} + +// verify Hijacker interface implementation +var _ http.Hijacker = &GzipResponseWriter{} + +// MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in +// an error case it panics rather than returning an error. +func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler { + wrap, err := NewGzipLevelHandler(level) + if err != nil { + panic(err) + } + return wrap +} + +// NewGzipLevelHandler returns a wrapper function (often known as middleware) +// which can be used to wrap an HTTP handler to transparently gzip the response +// body if the client supports it (via the Accept-Encoding header). Responses will +// be encoded at the given gzip compression level. An error will be returned only +// if an invalid gzip compression level is given, so if one can ensure the level +// is valid, the returned error can be safely ignored. +func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) { + return NewGzipLevelAndMinSize(level, DefaultMinSize) +} + +// NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller +// specify the minimum size before compression. +func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error) { + return GzipHandlerWithOpts(CompressionLevel(level), MinSize(minSize)) +} + +func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error) { + c := &config{ + level: gzip.DefaultCompression, + minSize: DefaultMinSize, + } + + for _, o := range opts { + o(c) + } + + if err := c.validate(); err != nil { + return nil, err + } + + return func(h http.Handler) http.Handler { + index := poolIndex(c.level) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add(vary, acceptEncoding) + if acceptsGzip(r) { + gw := &GzipResponseWriter{ + ResponseWriter: w, + index: index, + minSize: c.minSize, + contentTypes: c.contentTypes, + } + defer gw.Close() + + if _, ok := w.(http.CloseNotifier); ok { + gwcn := GzipResponseWriterWithCloseNotify{gw} + h.ServeHTTP(gwcn, r) + } else { + h.ServeHTTP(gw, r) + } + + } else { + h.ServeHTTP(w, r) + } + }) + }, nil +} + +// Used for functional configuration. +type config struct { + minSize int + level int + contentTypes []string +} + +func (c *config) validate() error { + if c.level != gzip.DefaultCompression && (c.level < gzip.BestSpeed || c.level > gzip.BestCompression) { + return fmt.Errorf("invalid compression level requested: %d", c.level) + } + + if c.minSize < 0 { + return fmt.Errorf("minimum size must be more than zero") + } + + return nil +} + +type option func(c *config) + +func MinSize(size int) option { + return func(c *config) { + c.minSize = size + } +} + +func CompressionLevel(level int) option { + return func(c *config) { + c.level = level + } +} + +func ContentTypes(types []string) option { + return func(c *config) { + c.contentTypes = []string{} + for _, v := range types { + c.contentTypes = append(c.contentTypes, strings.ToLower(v)) + } + } +} + +// GzipHandler wraps an HTTP handler, to transparently gzip the response body if +// the client supports it (via the Accept-Encoding header). This will compress at +// the default compression level. +func GzipHandler(h http.Handler) http.Handler { + wrapper, _ := NewGzipLevelHandler(gzip.DefaultCompression) + return wrapper(h) +} + +// acceptsGzip returns true if the given HTTP request indicates that it will +// accept a gzipped response. +func acceptsGzip(r *http.Request) bool { + acceptedEncodings, _ := parseEncodings(r.Header.Get(acceptEncoding)) + return acceptedEncodings["gzip"] > 0.0 +} + +// returns true if we've been configured to compress the specific content type. +func handleContentType(contentTypes []string, w http.ResponseWriter) bool { + // If contentTypes is empty we handle all content types. + if len(contentTypes) == 0 { + return true + } + + ct := strings.ToLower(w.Header().Get(contentType)) + for _, c := range contentTypes { + if c == ct { + return true + } + } + + return false +} + +// parseEncodings attempts to parse a list of codings, per RFC 2616, as might +// appear in an Accept-Encoding header. It returns a map of content-codings to +// quality values, and an error containing the errors encountered. It's probably +// safe to ignore those, because silently ignoring errors is how the internet +// works. +// +// See: http://tools.ietf.org/html/rfc2616#section-14.3. +func parseEncodings(s string) (codings, error) { + c := make(codings) + var e []string + + for _, ss := range strings.Split(s, ",") { + coding, qvalue, err := parseCoding(ss) + + if err != nil { + e = append(e, err.Error()) + } else { + c[coding] = qvalue + } + } + + // TODO (adammck): Use a proper multi-error struct, so the individual errors + // can be extracted if anyone cares. + if len(e) > 0 { + return c, fmt.Errorf("errors while parsing encodings: %s", strings.Join(e, ", ")) + } + + return c, nil +} + +// parseCoding parses a single conding (content-coding with an optional qvalue), +// as might appear in an Accept-Encoding header. It attempts to forgive minor +// formatting errors. +func parseCoding(s string) (coding string, qvalue float64, err error) { + for n, part := range strings.Split(s, ";") { + part = strings.TrimSpace(part) + qvalue = DefaultQValue + + if n == 0 { + coding = strings.ToLower(part) + } else if strings.HasPrefix(part, "q=") { + qvalue, err = strconv.ParseFloat(strings.TrimPrefix(part, "q="), 64) + + if qvalue < 0.0 { + qvalue = 0.0 + } else if qvalue > 1.0 { + qvalue = 1.0 + } + } + } + + if coding == "" { + err = fmt.Errorf("empty content-coding") + } + + return +} diff --git a/vendor/github.com/NYTimes/gziphandler/gzip_go18.go b/vendor/github.com/NYTimes/gziphandler/gzip_go18.go new file mode 100755 index 0000000..fa9665b --- /dev/null +++ b/vendor/github.com/NYTimes/gziphandler/gzip_go18.go @@ -0,0 +1,43 @@ +// +build go1.8 + +package gziphandler + +import "net/http" + +// Push initiates an HTTP/2 server push. +// Push returns ErrNotSupported if the client has disabled push or if push +// is not supported on the underlying connection. +func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error { + pusher, ok := w.ResponseWriter.(http.Pusher) + if ok && pusher != nil { + return pusher.Push(target, setAcceptEncodingForPushOptions(opts)) + } + return http.ErrNotSupported +} + +// setAcceptEncodingForPushOptions sets "Accept-Encoding" : "gzip" for PushOptions without overriding existing headers. +func setAcceptEncodingForPushOptions(opts *http.PushOptions) *http.PushOptions { + + if opts == nil { + opts = &http.PushOptions{ + Header: http.Header{ + acceptEncoding: []string{"gzip"}, + }, + } + return opts + } + + if opts.Header == nil { + opts.Header = http.Header{ + acceptEncoding: []string{"gzip"}, + } + return opts + } + + if encoding := opts.Header.Get(acceptEncoding); encoding == "" { + opts.Header.Add(acceptEncoding, "gzip") + return opts + } + + return opts +} diff --git a/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/boltdb/bolt/README.md index 8523e33..7d43a15 100755 --- a/vendor/github.com/boltdb/bolt/README.md +++ b/vendor/github.com/boltdb/bolt/README.md @@ -15,11 +15,11 @@ and setting values. That's it. ## Project Status -Bolt is stable and the API is fixed. Full unit test coverage and randomized -black box testing are used to ensure database consistency and thread safety. -Bolt is currently in high-load production environments serving databases as -large as 1TB. Many companies such as Shopify and Heroku use Bolt-backed -services every day. +Bolt is stable, the API is fixed, and the file format is fixed. Full unit +test coverage and randomized black box testing are used to ensure database +consistency and thread safety. Bolt is currently used in high-load production +environments serving databases as large as 1TB. Many companies such as +Shopify and Heroku use Bolt-backed services every day. ## Table of Contents @@ -209,7 +209,7 @@ and then safely close your transaction if an error is returned. This is the recommended way to use Bolt transactions. However, sometimes you may want to manually start and end your transactions. -You can use the `Tx.Begin()` function directly but **please** be sure to close +You can use the `DB.Begin()` function directly but **please** be sure to close the transaction. ```go @@ -395,7 +395,7 @@ db.View(func(tx *bolt.Tx) error { c := tx.Bucket([]byte("MyBucket")).Cursor() prefix := []byte("1234") - for k, v := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, v = c.Next() { + for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { fmt.Printf("key=%s, value=%s\n", k, v) } @@ -448,6 +448,10 @@ db.View(func(tx *bolt.Tx) error { }) ``` +Please note that keys and values in `ForEach()` are only valid while +the transaction is open. If you need to use a key or value outside of +the transaction, you must use `copy()` to copy it to another byte +slice. ### Nested buckets @@ -460,6 +464,55 @@ func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) func (*Bucket) DeleteBucket(key []byte) error ``` +Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. + +```go + +// createUser creates a new user in the given account. +func createUser(accountID int, u *User) error { + // Start the transaction. + tx, err := db.Begin(true) + if err != nil { + return err + } + defer tx.Rollback() + + // Retrieve the root bucket for the account. + // Assume this has already been created when the account was set up. + root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) + + // Setup the users bucket. + bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) + if err != nil { + return err + } + + // Generate an ID for the new user. + userID, err := bkt.NextSequence() + if err != nil { + return err + } + u.ID = userID + + // Marshal and save the encoded user. + if buf, err := json.Marshal(u); err != nil { + return err + } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { + return err + } + + // Commit the transaction. + if err := tx.Commit(); err != nil { + return err + } + + return nil +} + +``` + + + ### Database backups @@ -715,6 +768,9 @@ Here are a few things to note when evaluating and using Bolt: can be reused by a new page or can be unmapped from virtual memory and you'll see an `unexpected fault address` panic when accessing it. +* Bolt uses an exclusive write lock on the database file so it cannot be + shared by multiple processes. + * Be careful when using `Bucket.FillPercent`. Setting a high fill percent for buckets that have random inserts will cause your database to have very poor page utilization. @@ -848,5 +904,13 @@ Below is a list of public, open source projects that use Bolt: * [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. * [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. * [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. +* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. +* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains +* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. +* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. +* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. +* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies +* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB +* [Ponzu CMS](https://ponzu-cms.org) - Headless CMS + automatic JSON API with auto-HTTPS, HTTP/2 Server Push, and flexible server framework. If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/boltdb/bolt/bolt_386.go index e659bfb..820d533 100755 --- a/vendor/github.com/boltdb/bolt/bolt_386.go +++ b/vendor/github.com/boltdb/bolt/bolt_386.go @@ -5,3 +5,6 @@ const maxMapSize = 0x7FFFFFFF // 2GB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/boltdb/bolt/bolt_amd64.go index cca6b7e..98fafdb 100755 --- a/vendor/github.com/boltdb/bolt/bolt_amd64.go +++ b/vendor/github.com/boltdb/bolt/bolt_amd64.go @@ -5,3 +5,6 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/boltdb/bolt/bolt_arm.go index e659bfb..7e5cb4b 100755 --- a/vendor/github.com/boltdb/bolt/bolt_arm.go +++ b/vendor/github.com/boltdb/bolt/bolt_arm.go @@ -1,7 +1,28 @@ package bolt +import "unsafe" + // maxMapSize represents the largest mmap size supported by Bolt. const maxMapSize = 0x7FFFFFFF // 2GB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned bool + +func init() { + // Simple check to see whether this arch handles unaligned load/stores + // correctly. + + // ARM9 and older devices require load/stores to be from/to aligned + // addresses. If not, the lower 2 bits are cleared and that address is + // read in a jumbled up order. + + // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html + + raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11} + val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2)) + + brokenUnaligned = val != 0x11222211 +} diff --git a/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/boltdb/bolt/bolt_arm64.go index 6d23093..b26d84f 100755 --- a/vendor/github.com/boltdb/bolt/bolt_arm64.go +++ b/vendor/github.com/boltdb/bolt/bolt_arm64.go @@ -7,3 +7,6 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/boltdb/bolt/bolt_ppc64.go index 2dc6be0..9331d97 100755 --- a/vendor/github.com/boltdb/bolt/bolt_ppc64.go +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64.go @@ -7,3 +7,6 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go index 8351e12..8c143bc 100755 --- a/vendor/github.com/boltdb/bolt/bolt_ppc64le.go +++ b/vendor/github.com/boltdb/bolt/bolt_ppc64le.go @@ -7,3 +7,6 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/boltdb/bolt/bolt_s390x.go index f4dd26b..d7c39af 100755 --- a/vendor/github.com/boltdb/bolt/bolt_s390x.go +++ b/vendor/github.com/boltdb/bolt/bolt_s390x.go @@ -7,3 +7,6 @@ const maxMapSize = 0xFFFFFFFFFFFF // 256TB // maxAllocSize is the size used when creating array pointers. const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/boltdb/bolt/bolt_windows.go index d538e6a..b00fb07 100755 --- a/vendor/github.com/boltdb/bolt/bolt_windows.go +++ b/vendor/github.com/boltdb/bolt/bolt_windows.go @@ -89,7 +89,7 @@ func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) erro func funlock(db *DB) error { err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) db.lockfile.Close() - os.Remove(db.path+lockExt) + os.Remove(db.path + lockExt) return err } diff --git a/vendor/github.com/boltdb/bolt/bucket.go b/vendor/github.com/boltdb/bolt/bucket.go index d2f8c52..0c5bf27 100755 --- a/vendor/github.com/boltdb/bolt/bucket.go +++ b/vendor/github.com/boltdb/bolt/bucket.go @@ -130,9 +130,17 @@ func (b *Bucket) Bucket(name []byte) *Bucket { func (b *Bucket) openBucket(value []byte) *Bucket { var child = newBucket(b.tx) + // If unaligned load/stores are broken on this arch and value is + // unaligned simply clone to an aligned byte array. + unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0 + + if unaligned { + value = cloneBytes(value) + } + // If this is a writable transaction then we need to copy the bucket entry. // Read-only transactions can point directly at the mmap entry. - if b.tx.writable { + if b.tx.writable && !unaligned { child.bucket = &bucket{} *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) } else { @@ -167,9 +175,8 @@ func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { if bytes.Equal(key, k) { if (flags & bucketLeafFlag) != 0 { return nil, ErrBucketExists - } else { - return nil, ErrIncompatibleValue } + return nil, ErrIncompatibleValue } // Create empty, inline bucket. @@ -329,6 +336,28 @@ func (b *Bucket) Delete(key []byte) error { return nil } +// Sequence returns the current integer for the bucket without incrementing it. +func (b *Bucket) Sequence() uint64 { return b.bucket.sequence } + +// SetSequence updates the sequence number for the bucket. +func (b *Bucket) SetSequence(v uint64) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence = v + return nil +} + // NextSequence returns an autoincrementing integer for the bucket. func (b *Bucket) NextSequence() (uint64, error) { if b.tx.db == nil { diff --git a/vendor/github.com/boltdb/bolt/db.go b/vendor/github.com/boltdb/bolt/db.go index 1223493..f352ff1 100755 --- a/vendor/github.com/boltdb/bolt/db.go +++ b/vendor/github.com/boltdb/bolt/db.go @@ -552,7 +552,10 @@ func (db *DB) removeTx(tx *Tx) { // Remove the transaction. for i, t := range db.txs { if t == tx { - db.txs = append(db.txs[:i], db.txs[i+1:]...) + last := len(db.txs) - 1 + db.txs[i] = db.txs[last] + db.txs[last] = nil + db.txs = db.txs[:last] break } } @@ -952,7 +955,7 @@ func (s *Stats) Sub(other *Stats) Stats { diff.PendingPageN = s.PendingPageN diff.FreeAlloc = s.FreeAlloc diff.FreelistInuse = s.FreelistInuse - diff.TxN = other.TxN - s.TxN + diff.TxN = s.TxN - other.TxN diff.TxStats = s.TxStats.Sub(&other.TxStats) return diff } diff --git a/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/boltdb/bolt/freelist.go index 1b7ba91..aba48f5 100755 --- a/vendor/github.com/boltdb/bolt/freelist.go +++ b/vendor/github.com/boltdb/bolt/freelist.go @@ -24,7 +24,12 @@ func newFreelist() *freelist { // size returns the size of the page after serialization. func (f *freelist) size() int { - return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * f.count()) + n := f.count() + if n >= 0xFFFF { + // The first element will be used to store the count. See freelist.write. + n++ + } + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n) } // count returns count of pages on the freelist @@ -46,16 +51,15 @@ func (f *freelist) pending_count() int { return count } -// all returns a list of all free ids and all pending ids in one sorted list. -func (f *freelist) all() []pgid { - m := make(pgids, 0) - +// copyall copies into dst a list of all free ids and all pending ids in one sorted list. +// f.count returns the minimum length required for dst. +func (f *freelist) copyall(dst []pgid) { + m := make(pgids, 0, f.pending_count()) for _, list := range f.pending { m = append(m, list...) } - sort.Sort(m) - return pgids(f.ids).merge(m) + mergepgids(dst, f.ids, m) } // allocate returns the starting page id of a contiguous list of pages of a given size. @@ -186,22 +190,22 @@ func (f *freelist) read(p *page) { // become free. func (f *freelist) write(p *page) error { // Combine the old free pgids and pgids waiting on an open transaction. - ids := f.all() // Update the header flag. p.flags |= freelistPageFlag // The page.count can only hold up to 64k elements so if we overflow that // number then we handle it by putting the size in the first element. - if len(ids) == 0 { - p.count = uint16(len(ids)) - } else if len(ids) < 0xFFFF { - p.count = uint16(len(ids)) - copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids) + lenids := f.count() + if lenids == 0 { + p.count = uint16(lenids) + } else if lenids < 0xFFFF { + p.count = uint16(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:]) } else { p.count = 0xFFFF - ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(len(ids)) - copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:], ids) + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:]) } return nil @@ -236,7 +240,7 @@ func (f *freelist) reload(p *page) { // reindex rebuilds the free cache based on available and pending free lists. func (f *freelist) reindex() { - f.cache = make(map[pgid]bool) + f.cache = make(map[pgid]bool, len(f.ids)) for _, id := range f.ids { f.cache[id] = true } diff --git a/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/boltdb/bolt/page.go index 7651a6b..cde403a 100755 --- a/vendor/github.com/boltdb/bolt/page.go +++ b/vendor/github.com/boltdb/bolt/page.go @@ -145,12 +145,33 @@ func (a pgids) merge(b pgids) pgids { // Return the opposite slice if one is nil. if len(a) == 0 { return b - } else if len(b) == 0 { + } + if len(b) == 0 { return a } + merged := make(pgids, len(a)+len(b)) + mergepgids(merged, a, b) + return merged +} + +// mergepgids copies the sorted union of a and b into dst. +// If dst is too small, it panics. +func mergepgids(dst, a, b pgids) { + if len(dst) < len(a)+len(b) { + panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b))) + } + // Copy in the opposite slice if one is nil. + if len(a) == 0 { + copy(dst, b) + return + } + if len(b) == 0 { + copy(dst, a) + return + } - // Create a list to hold all elements from both lists. - merged := make(pgids, 0, len(a)+len(b)) + // Merged will hold all elements from both lists. + merged := dst[:0] // Assign lead to the slice with a lower starting value, follow to the higher value. lead, follow := a, b @@ -172,7 +193,5 @@ func (a pgids) merge(b pgids) pgids { } // Append what's left in follow. - merged = append(merged, follow...) - - return merged + _ = append(merged, follow...) } diff --git a/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/boltdb/bolt/tx.go index 1cfb4cd..6700308 100755 --- a/vendor/github.com/boltdb/bolt/tx.go +++ b/vendor/github.com/boltdb/bolt/tx.go @@ -381,7 +381,9 @@ func (tx *Tx) Check() <-chan error { func (tx *Tx) check(ch chan error) { // Check if any pages are double freed. freed := make(map[pgid]bool) - for _, id := range tx.db.freelist.all() { + all := make([]pgid, tx.db.freelist.count()) + tx.db.freelist.copyall(all) + for _, id := range all { if freed[id] { ch <- fmt.Errorf("page %d: already freed", id) } diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig new file mode 100755 index 0000000..ba49e3c --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore new file mode 100755 index 0000000..4cd0cba --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml new file mode 100755 index 0000000..981d1bb --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.travis.yml @@ -0,0 +1,30 @@ +sudo: false +language: go + +go: + - 1.8.x + - 1.9.x + - tip + +matrix: + allow_failures: + - go: tip + fast_finish: true + +before_script: + - go get -u github.com/golang/lint/golint + +script: + - go test -v --race ./... + +after_script: + - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" + - test -z "$(golint ./... | tee /dev/stderr)" + - go vet ./... + +os: + - linux + - osx + +notifications: + email: false diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS new file mode 100755 index 0000000..5ab5d41 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/AUTHORS @@ -0,0 +1,52 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Aaron L +Adrien Bustany +Amit Krishnan +Anmol Sethi +Bjørn Erik Pedersen +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Evan Phoenix +Francisco Souza +Hari haran +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Nathan Youngman +Nickolai Zeldovich +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pursuit92 +Riku Voipio +Rob Figueiredo +Rodrigo Chiossi +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Tom Payne +Travis Cline +Tudor Golubenco +Vahe Khachikyan +Yukang +bronze1man +debrando +henrikedwards +铁哥 diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md new file mode 100755 index 0000000..be4d7ea --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -0,0 +1,317 @@ +# Changelog + +## v1.4.7 / 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## v1.4.2 / 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## v1.4.0 / 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## v1.3.1 / 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## v1.3.0 / 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## v1.2.10 / 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## v1.2.9 / 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## v1.2.8 / 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## v1.2.5 / 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## v1.2.1 / 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## v1.2.0 / 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## v1.1.1 / 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## v1.1.0 / 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v1.0.4 / 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## v1.0.3 / 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## v1.0.2 / 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## v1.0.0 / 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## v0.9.3 / 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v0.9.2 / 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## v0.9.1 / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md new file mode 100755 index 0000000..828a60b --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -0,0 +1,77 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, macOS and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. + +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. +* When you're done, you will want to halt or destroy the Vagrant boxes. + +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. + +Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). + +[hub]: https://github.com/github/hub +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE new file mode 100755 index 0000000..f21e540 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify 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/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md new file mode 100755 index 0000000..3993207 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -0,0 +1,79 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) + +fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: + +```console +go get -u golang.org/x/sys/... +``` + +Cross platform: Windows, Linux, BSD and macOS. + +|Adapter |OS |Status | +|----------|----------|----------| +|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| +|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| +|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| +|fanotify |Linux 2.6.37+ | | +|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| +|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| + +\* Android and iOS are untested. + +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. + +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## Example + +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#18]: https://github.com/fsnotify/fsnotify/issues/18 +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go new file mode 100755 index 0000000..ced39cb --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fen.go @@ -0,0 +1,37 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go new file mode 100755 index 0000000..190bf0d --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -0,0 +1,66 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "errors" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} + +// Common errors that can be reported by a watcher +var ErrEventOverflow = errors.New("fsnotify queue overflow") diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go new file mode 100755 index 0000000..d9fd1b8 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/inotify.go @@ -0,0 +1,337 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + return nil +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + + if mask&unix.IN_Q_OVERFLOW != 0 { + select { + case w.Errors <- ErrEventOverflow: + case <-w.done: + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go new file mode 100755 index 0000000..cc7db4b --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + poller.fd = fd + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(0) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go new file mode 100755 index 0000000..86e76a3 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/kqueue.go @@ -0,0 +1,521 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + for _, name := range pathsToRemove { + w.Remove(name) + } + + // send a "quit" message to the reader goroutine + close(w.done) + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + +loop: + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + break loop + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + select { + case w.Errors <- err: + case <-w.done: + break loop + } + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel. + select { + case w.Events <- event: + case <-w.done: + break loop + } + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } + + // cleanup + err := unix.Close(w.kq) + if err != nil { + // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. + select { + case w.Errors <- err: + default: + } + } + close(w.Events) + close(w.Errors) +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + select { + case w.Errors <- err: + case <-w.done: + return + } + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + select { + case w.Events <- newCreateEvent(filePath): + case <-w.done: + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go new file mode 100755 index 0000000..7d8de14 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go new file mode 100755 index 0000000..9139e17 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go new file mode 100755 index 0000000..09436f3 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/windows.go @@ -0,0 +1,561 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/hashicorp/hcl/.gitignore new file mode 100755 index 0000000..822fa09 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.gitignore @@ -0,0 +1,9 @@ +y.output + +# ignore intellij files +.idea +*.iml +*.ipr +*.iws + +*.test diff --git a/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/hashicorp/hcl/.travis.yml new file mode 100755 index 0000000..cb63a32 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/.travis.yml @@ -0,0 +1,13 @@ +sudo: false + +language: go + +go: + - 1.x + - tip + +branches: + only: + - master + +script: make test diff --git a/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/hashicorp/hcl/LICENSE new file mode 100755 index 0000000..c33dcc7 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/LICENSE @@ -0,0 +1,354 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/hashicorp/hcl/Makefile new file mode 100755 index 0000000..9fafd50 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/Makefile @@ -0,0 +1,18 @@ +TEST?=./... + +default: test + +fmt: generate + go fmt ./... + +test: generate + go get -t ./... + go test $(TEST) $(TESTARGS) + +generate: + go generate ./... + +updatedeps: + go get -u golang.org/x/tools/cmd/stringer + +.PHONY: default generate test updatedeps diff --git a/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/hashicorp/hcl/README.md new file mode 100755 index 0000000..c822332 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/README.md @@ -0,0 +1,125 @@ +# HCL + +[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) + +HCL (HashiCorp Configuration Language) is a configuration language built +by HashiCorp. The goal of HCL is to build a structured configuration language +that is both human and machine friendly for use with command-line tools, but +specifically targeted towards DevOps tools, servers, etc. + +HCL is also fully JSON compatible. That is, JSON can be used as completely +valid input to a system expecting HCL. This helps makes systems +interoperable with other systems. + +HCL is heavily inspired by +[libucl](https://github.com/vstakhov/libucl), +nginx configuration, and others similar. + +## Why? + +A common question when viewing HCL is to ask the question: why not +JSON, YAML, etc.? + +Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) +used a variety of configuration languages from full programming languages +such as Ruby to complete data structure languages such as JSON. What we +learned is that some people wanted human-friendly configuration languages +and some people wanted machine-friendly languages. + +JSON fits a nice balance in this, but is fairly verbose and most +importantly doesn't support comments. With YAML, we found that beginners +had a really hard time determining what the actual structure was, and +ended up guessing more often than not whether to use a hyphen, colon, etc. +in order to represent some configuration key. + +Full programming languages such as Ruby enable complex behavior +a configuration language shouldn't usually allow, and also forces +people to learn some set of Ruby. + +Because of this, we decided to create our own configuration language +that is JSON-compatible. Our configuration language (HCL) is designed +to be written and modified by humans. The API for HCL allows JSON +as an input so that it is also machine-friendly (machines can generate +JSON instead of trying to generate HCL). + +Our goal with HCL is not to alienate other configuration languages. +It is instead to provide HCL as a specialized language for our tools, +and JSON as the interoperability layer. + +## Syntax + +For a complete grammar, please see the parser itself. A high-level overview +of the syntax and grammar is listed here. + + * Single line comments start with `#` or `//` + + * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments + are not allowed. A multi-line comment (also known as a block comment) + terminates at the first `*/` found. + + * Values are assigned with the syntax `key = value` (whitespace doesn't + matter). The value can be any primitive: a string, number, boolean, + object, or list. + + * Strings are double-quoted and can contain any UTF-8 characters. + Example: `"Hello, World"` + + * Multi-line strings start with `<- + echo %Path% + + go version + + go env + + go get -t ./... + +build_script: +- cmd: go test -v ./... diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go new file mode 100755 index 0000000..bed9ebb --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/decoder.go @@ -0,0 +1,729 @@ +package hcl + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" + "github.com/hashicorp/hcl/hcl/token" +) + +// This is the tag to use with structures to have settings for HCL +const tagName = "hcl" + +var ( + // nodeType holds a reference to the type of ast.Node + nodeType reflect.Type = findNodeType() +) + +// Unmarshal accepts a byte slice as input and writes the +// data to the value pointed to by v. +func Unmarshal(bs []byte, v interface{}) error { + root, err := parse(bs) + if err != nil { + return err + } + + return DecodeObject(v, root) +} + +// Decode reads the given input and decodes it into the structure +// given by `out`. +func Decode(out interface{}, in string) error { + obj, err := Parse(in) + if err != nil { + return err + } + + return DecodeObject(out, obj) +} + +// DecodeObject is a lower-level version of Decode. It decodes a +// raw Object into the given output. +func DecodeObject(out interface{}, n ast.Node) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + + // If we have the file, we really decode the root node + if f, ok := n.(*ast.File); ok { + n = f.Node + } + + var d decoder + return d.decode("root", n, val.Elem()) +} + +type decoder struct { + stack []reflect.Kind +} + +func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { + k := result + + // If we have an interface with a valid value, we use that + // for the check. + if result.Kind() == reflect.Interface { + elem := result.Elem() + if elem.IsValid() { + k = elem + } + } + + // Push current onto stack unless it is an interface. + if k.Kind() != reflect.Interface { + d.stack = append(d.stack, k.Kind()) + + // Schedule a pop + defer func() { + d.stack = d.stack[:len(d.stack)-1] + }() + } + + switch k.Kind() { + case reflect.Bool: + return d.decodeBool(name, node, result) + case reflect.Float32, reflect.Float64: + return d.decodeFloat(name, node, result) + case reflect.Int, reflect.Int32, reflect.Int64: + return d.decodeInt(name, node, result) + case reflect.Interface: + // When we see an interface, we make our own thing + return d.decodeInterface(name, node, result) + case reflect.Map: + return d.decodeMap(name, node, result) + case reflect.Ptr: + return d.decodePtr(name, node, result) + case reflect.Slice: + return d.decodeSlice(name, node, result) + case reflect.String: + return d.decodeString(name, node, result) + case reflect.Struct: + return d.decodeStruct(name, node, result) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), + } + } +} + +func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.BOOL { + v, err := strconv.ParseBool(n.Token.Text) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER { + v, err := strconv.ParseFloat(n.Token.Text, 64) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + v, err := strconv.ParseInt(n.Token.Text, 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + case token.STRING: + v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { + // When we see an ast.Node, we retain the value to enable deferred decoding. + // Very useful in situations where we want to preserve ast.Node information + // like Pos + if result.Type() == nodeType && result.CanSet() { + result.Set(reflect.ValueOf(node)) + return nil + } + + var set reflect.Value + redecode := true + + // For testing types, ObjectType should just be treated as a list. We + // set this to a temporary var because we want to pass in the real node. + testNode := node + if ot, ok := node.(*ast.ObjectType); ok { + testNode = ot.List + } + + switch n := testNode.(type) { + case *ast.ObjectList: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) + set = result + } + case *ast.ObjectType: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 1) + set = result + } + case *ast.ListType: + var temp []interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 0) + set = result + case *ast.LiteralType: + switch n.Token.Type { + case token.BOOL: + var result bool + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.FLOAT: + var result float64 + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.NUMBER: + var result int + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.STRING, token.HEREDOC: + set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), + } + } + default: + return fmt.Errorf( + "%s: cannot decode into interface: %T", + name, node) + } + + // Set the result to what its supposed to be, then reset + // result so we don't reflect into this method anymore. + result.Set(set) + + if redecode { + // Revisit the node so that we can use the newly instantiated + // thing and populate it. + if err := d.decode(name, node, result); err != nil { + return err + } + } + + return nil +} + +func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { + if item, ok := node.(*ast.ObjectItem); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + n, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), + } + } + + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + resultType := result.Type() + resultElemType := resultType.Elem() + resultKeyType := resultType.Key() + if resultKeyType.Kind() != reflect.String { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Make a map if it is nil + resultMap := result + if result.IsNil() { + resultMap = reflect.MakeMap( + reflect.MapOf(resultKeyType, resultElemType)) + } + + // Go through each element and decode it. + done := make(map[string]struct{}) + for _, item := range n.Items { + if item.Val == nil { + continue + } + + // github.com/hashicorp/terraform/issue/5740 + if len(item.Keys) == 0 { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Get the key we're dealing with, which is the first item + keyStr := item.Keys[0].Token.Value().(string) + + // If we've already processed this key, then ignore it + if _, ok := done[keyStr]; ok { + continue + } + + // Determine the value. If we have more than one key, then we + // get the objectlist of only these keys. + itemVal := item.Val + if len(item.Keys) > 1 { + itemVal = n.Filter(keyStr) + done[keyStr] = struct{}{} + } + + // Make the field name + fieldName := fmt.Sprintf("%s.%s", name, keyStr) + + // Get the key/value as reflection values + key := reflect.ValueOf(keyStr) + val := reflect.Indirect(reflect.New(resultElemType)) + + // If we have a pre-existing value in the map, use that + oldVal := resultMap.MapIndex(key) + if oldVal.IsValid() { + val.Set(oldVal) + } + + // Decode! + if err := d.decode(fieldName, itemVal, val); err != nil { + return err + } + + // Set the value on the map + resultMap.SetMapIndex(key, val) + } + + // Set the final map if we can + set.Set(resultMap) + return nil +} + +func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + resultType := result.Type() + resultElemType := resultType.Elem() + val := reflect.New(resultElemType) + if err := d.decode(name, node, reflect.Indirect(val)); err != nil { + return err + } + + result.Set(val) + return nil +} + +func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + // Create the slice if it isn't nil + resultType := result.Type() + resultElemType := resultType.Elem() + if result.IsNil() { + resultSliceType := reflect.SliceOf(resultElemType) + result = reflect.MakeSlice( + resultSliceType, 0, 0) + } + + // Figure out the items we'll be copying into the slice + var items []ast.Node + switch n := node.(type) { + case *ast.ObjectList: + items = make([]ast.Node, len(n.Items)) + for i, item := range n.Items { + items[i] = item + } + case *ast.ObjectType: + items = []ast.Node{n} + case *ast.ListType: + items = n.List + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("unknown slice type: %T", node), + } + } + + for i, item := range items { + fieldName := fmt.Sprintf("%s[%d]", name, i) + + // Decode + val := reflect.Indirect(reflect.New(resultElemType)) + + // if item is an object that was decoded from ambiguous JSON and + // flattened, make sure it's expanded if it needs to decode into a + // defined structure. + item := expandObject(item, val) + + if err := d.decode(fieldName, item, val); err != nil { + return err + } + + // Append it onto the slice + result = reflect.Append(result, val) + } + + set.Set(result) + return nil +} + +// expandObject detects if an ambiguous JSON object was flattened to a List which +// should be decoded into a struct, and expands the ast to properly deocode. +func expandObject(node ast.Node, result reflect.Value) ast.Node { + item, ok := node.(*ast.ObjectItem) + if !ok { + return node + } + + elemType := result.Type() + + // our target type must be a struct + switch elemType.Kind() { + case reflect.Ptr: + switch elemType.Elem().Kind() { + case reflect.Struct: + //OK + default: + return node + } + case reflect.Struct: + //OK + default: + return node + } + + // A list value will have a key and field name. If it had more fields, + // it wouldn't have been flattened. + if len(item.Keys) != 2 { + return node + } + + keyToken := item.Keys[0].Token + item.Keys = item.Keys[1:] + + // we need to un-flatten the ast enough to decode + newNode := &ast.ObjectItem{ + Keys: []*ast.ObjectKey{ + &ast.ObjectKey{ + Token: keyToken, + }, + }, + Val: &ast.ObjectType{ + List: &ast.ObjectList{ + Items: []*ast.ObjectItem{item}, + }, + }, + } + + return newNode +} + +func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) + return nil + case token.STRING, token.HEREDOC: + result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type for string %T", name, node), + } +} + +func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { + var item *ast.ObjectItem + if it, ok := node.(*ast.ObjectItem); ok { + item = it + node = it.Val + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + // Handle the special case where the object itself is a literal. Previously + // the yacc parser would always ensure top-level elements were arrays. The new + // parser does not make the same guarantees, thus we need to convert any + // top-level literal elements into a list. + if _, ok := node.(*ast.LiteralType); ok && item != nil { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + list, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), + } + } + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = result + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") + + // Ignore fields with tag name "-" + if tagParts[0] == "-" { + continue + } + + if fieldType.Anonymous { + fieldKind := fieldType.Type.Kind() + if fieldKind != reflect.Struct { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unsupported type to struct: %s", + fieldType.Name, fieldKind), + } + } + + // We have an embedded field. We "squash" the fields down + // if specified in the tag. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + structs = append( + structs, result.FieldByName(fieldType.Name)) + continue + } + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + usedKeys := make(map[string]struct{}) + decodedFields := make([]string, 0, len(fields)) + decodedFieldsVal := make([]reflect.Value, 0) + unusedKeysVal := make([]reflect.Value, 0) + for _, f := range fields { + field, fieldValue := f.field, f.val + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + fieldName := field.Name + + tagValue := field.Tag.Get(tagName) + tagParts := strings.SplitN(tagValue, ",", 2) + if len(tagParts) >= 2 { + switch tagParts[1] { + case "decodedFields": + decodedFieldsVal = append(decodedFieldsVal, fieldValue) + continue + case "key": + if item == nil { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: %s asked for 'key', impossible", + name, fieldName), + } + } + + fieldValue.SetString(item.Keys[0].Token.Value().(string)) + continue + case "unusedKeys": + unusedKeysVal = append(unusedKeysVal, fieldValue) + continue + } + } + + if tagParts[0] != "" { + fieldName = tagParts[0] + } + + // Determine the element we'll use to decode. If it is a single + // match (only object with the field), then we decode it exactly. + // If it is a prefix match, then we decode the matches. + filter := list.Filter(fieldName) + + prefixMatches := filter.Children() + matches := filter.Elem() + if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { + continue + } + + // Track the used key + usedKeys[fieldName] = struct{}{} + + // Create the field name and decode. We range over the elements + // because we actually want the value. + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + if len(prefixMatches.Items) > 0 { + if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil { + return err + } + } + for _, match := range matches.Items { + var decodeNode ast.Node = match.Val + if ot, ok := decodeNode.(*ast.ObjectType); ok { + decodeNode = &ast.ObjectList{Items: ot.List.Items} + } + + if err := d.decode(fieldName, decodeNode, fieldValue); err != nil { + return err + } + } + + decodedFields = append(decodedFields, field.Name) + } + + if len(decodedFieldsVal) > 0 { + // Sort it so that it is deterministic + sort.Strings(decodedFields) + + for _, v := range decodedFieldsVal { + v.Set(reflect.ValueOf(decodedFields)) + } + } + + return nil +} + +// findNodeType returns the type of ast.Node +func findNodeType() reflect.Type { + var nodeContainer struct { + Node ast.Node + } + value := reflect.ValueOf(nodeContainer).FieldByName("Node") + return value.Type() +} diff --git a/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/hashicorp/hcl/hcl.go new file mode 100755 index 0000000..575a20b --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl.go @@ -0,0 +1,11 @@ +// Package hcl decodes HCL into usable Go structures. +// +// hcl input can come in either pure HCL format or JSON format. +// It can be parsed into an AST, and then decoded into a structure, +// or it can be decoded directly from a string into a structure. +// +// If you choose to parse HCL into a raw AST, the benefit is that you +// can write custom visitor implementations to implement custom +// semantic checks. By default, HCL does not perform any semantic +// checks. +package hcl diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go new file mode 100755 index 0000000..6e5ef65 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go @@ -0,0 +1,219 @@ +// Package ast declares the types used to represent syntax trees for HCL +// (HashiCorp Configuration Language) +package ast + +import ( + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +// Node is an element in the abstract syntax tree. +type Node interface { + node() + Pos() token.Pos +} + +func (File) node() {} +func (ObjectList) node() {} +func (ObjectKey) node() {} +func (ObjectItem) node() {} +func (Comment) node() {} +func (CommentGroup) node() {} +func (ObjectType) node() {} +func (LiteralType) node() {} +func (ListType) node() {} + +// File represents a single HCL file +type File struct { + Node Node // usually a *ObjectList + Comments []*CommentGroup // list of all comments in the source +} + +func (f *File) Pos() token.Pos { + return f.Node.Pos() +} + +// ObjectList represents a list of ObjectItems. An HCL file itself is an +// ObjectList. +type ObjectList struct { + Items []*ObjectItem +} + +func (o *ObjectList) Add(item *ObjectItem) { + o.Items = append(o.Items, item) +} + +// Filter filters out the objects with the given key list as a prefix. +// +// The returned list of objects contain ObjectItems where the keys have +// this prefix already stripped off. This might result in objects with +// zero-length key lists if they have no children. +// +// If no matches are found, an empty ObjectList (non-nil) is returned. +func (o *ObjectList) Filter(keys ...string) *ObjectList { + var result ObjectList + for _, item := range o.Items { + // If there aren't enough keys, then ignore this + if len(item.Keys) < len(keys) { + continue + } + + match := true + for i, key := range item.Keys[:len(keys)] { + key := key.Token.Value().(string) + if key != keys[i] && !strings.EqualFold(key, keys[i]) { + match = false + break + } + } + if !match { + continue + } + + // Strip off the prefix from the children + newItem := *item + newItem.Keys = newItem.Keys[len(keys):] + result.Add(&newItem) + } + + return &result +} + +// Children returns further nested objects (key length > 0) within this +// ObjectList. This should be used with Filter to get at child items. +func (o *ObjectList) Children() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) > 0 { + result.Add(item) + } + } + + return &result +} + +// Elem returns items in the list that are direct element assignments +// (key length == 0). This should be used with Filter to get at elements. +func (o *ObjectList) Elem() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) == 0 { + result.Add(item) + } + } + + return &result +} + +func (o *ObjectList) Pos() token.Pos { + // always returns the uninitiliazed position + return o.Items[0].Pos() +} + +// ObjectItem represents a HCL Object Item. An item is represented with a key +// (or keys). It can be an assignment or an object (both normal and nested) +type ObjectItem struct { + // keys is only one length long if it's of type assignment. If it's a + // nested object it can be larger than one. In that case "assign" is + // invalid as there is no assignments for a nested object. + Keys []*ObjectKey + + // assign contains the position of "=", if any + Assign token.Pos + + // val is the item itself. It can be an object,list, number, bool or a + // string. If key length is larger than one, val can be only of type + // Object. + Val Node + + LeadComment *CommentGroup // associated lead comment + LineComment *CommentGroup // associated line comment +} + +func (o *ObjectItem) Pos() token.Pos { + // I'm not entirely sure what causes this, but removing this causes + // a test failure. We should investigate at some point. + if len(o.Keys) == 0 { + return token.Pos{} + } + + return o.Keys[0].Pos() +} + +// ObjectKeys are either an identifier or of type string. +type ObjectKey struct { + Token token.Token +} + +func (o *ObjectKey) Pos() token.Pos { + return o.Token.Pos +} + +// LiteralType represents a literal of basic type. Valid types are: +// token.NUMBER, token.FLOAT, token.BOOL and token.STRING +type LiteralType struct { + Token token.Token + + // comment types, only used when in a list + LeadComment *CommentGroup + LineComment *CommentGroup +} + +func (l *LiteralType) Pos() token.Pos { + return l.Token.Pos +} + +// ListStatement represents a HCL List type +type ListType struct { + Lbrack token.Pos // position of "[" + Rbrack token.Pos // position of "]" + List []Node // the elements in lexical order +} + +func (l *ListType) Pos() token.Pos { + return l.Lbrack +} + +func (l *ListType) Add(node Node) { + l.List = append(l.List, node) +} + +// ObjectType represents a HCL Object Type +type ObjectType struct { + Lbrace token.Pos // position of "{" + Rbrace token.Pos // position of "}" + List *ObjectList // the nodes in lexical order +} + +func (o *ObjectType) Pos() token.Pos { + return o.Lbrace +} + +// Comment node represents a single //, # style or /*- style commment +type Comment struct { + Start token.Pos // position of / or # + Text string +} + +func (c *Comment) Pos() token.Pos { + return c.Start +} + +// CommentGroup node represents a sequence of comments with no other tokens and +// no empty lines between. +type CommentGroup struct { + List []*Comment // len(List) > 0 +} + +func (c *CommentGroup) Pos() token.Pos { + return c.List[0].Pos() +} + +//------------------------------------------------------------------- +// GoStringer +//------------------------------------------------------------------- + +func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } +func (o *ObjectList) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go new file mode 100755 index 0000000..ba07ad4 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go @@ -0,0 +1,52 @@ +package ast + +import "fmt" + +// WalkFunc describes a function to be called for each node during a Walk. The +// returned node can be used to rewrite the AST. Walking stops the returned +// bool is false. +type WalkFunc func(Node) (Node, bool) + +// Walk traverses an AST in depth-first order: It starts by calling fn(node); +// node must not be nil. If fn returns true, Walk invokes fn recursively for +// each of the non-nil children of node, followed by a call of fn(nil). The +// returned node of fn can be used to rewrite the passed node to fn. +func Walk(node Node, fn WalkFunc) Node { + rewritten, ok := fn(node) + if !ok { + return rewritten + } + + switch n := node.(type) { + case *File: + n.Node = Walk(n.Node, fn) + case *ObjectList: + for i, item := range n.Items { + n.Items[i] = Walk(item, fn).(*ObjectItem) + } + case *ObjectKey: + // nothing to do + case *ObjectItem: + for i, k := range n.Keys { + n.Keys[i] = Walk(k, fn).(*ObjectKey) + } + + if n.Val != nil { + n.Val = Walk(n.Val, fn) + } + case *LiteralType: + // nothing to do + case *ListType: + for i, l := range n.List { + n.List[i] = Walk(l, fn) + } + case *ObjectType: + n.List = Walk(n.List, fn).(*ObjectList) + default: + // should we panic here? + fmt.Printf("unknown type: %T\n", n) + } + + fn(nil) + return rewritten +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go new file mode 100755 index 0000000..5c99381 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go @@ -0,0 +1,17 @@ +package parser + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/token" +) + +// PosError is a parse error that contains a position. +type PosError struct { + Pos token.Pos + Err error +} + +func (e *PosError) Error() string { + return fmt.Sprintf("At %s: %s", e.Pos, e.Err) +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go new file mode 100755 index 0000000..64c83bc --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -0,0 +1,532 @@ +// Package parser implements a parser for HCL (HashiCorp Configuration +// Language) +package parser + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/scanner" + "github.com/hashicorp/hcl/hcl/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + comments []*ast.CommentGroup + leadComment *ast.CommentGroup // last lead comment + lineComment *ast.CommentGroup // last line comment + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + // normalize all line endings + // since the scanner and output only work with "\n" line endings, we may + // end up with dangling "\r" characters in the parsed data. + src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1) + + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = &PosError{Pos: pos, Err: errors.New(msg)} + } + + f.Node, err = p.objectList(false) + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + f.Comments = p.comments + return f, nil +} + +// objectList parses a list of items within an object (generally k/v pairs). +// The parameter" obj" tells this whether to we are within an object (braces: +// '{', '}') or just at the top level. If we're within an object, we end +// at an RBRACE. +func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + if obj { + tok := p.scan() + p.unscan() + if tok.Type == token.RBRACE { + break + } + } + + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // object lists can be optionally comma-delimited e.g. when a list of maps + // is being expressed, so a comma is allowed here - it's simply consumed + tok := p.scan() + if tok.Type != token.COMMA { + p.unscan() + } + } + return node, nil +} + +func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { + endline = p.tok.Pos.Line + + // count the endline if it's multiline comment, ie starting with /* + if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { + // don't use range here - no need to decode Unicode code points + for i := 0; i < len(p.tok.Text); i++ { + if p.tok.Text[i] == '\n' { + endline++ + } + } + } + + comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} + p.tok = p.sc.Scan() + return +} + +func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { + var list []*ast.Comment + endline = p.tok.Pos.Line + + for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { + var comment *ast.Comment + comment, endline = p.consumeComment() + list = append(list, comment) + } + + // add comment group to the comments list + comments = &ast.CommentGroup{List: list} + p.comments = append(p.comments, comments) + + return +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if len(keys) > 0 && err == errEofToken { + // We ignore eof token here since it is an error if we didn't + // receive a value (but we did receive a key) for the item. + err = nil + } + if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { + // This is a strange boolean statement, but what it means is: + // We have keys with no value, and we're likely in an object + // (since RBrace ends an object). For this, we set err to nil so + // we continue and get the error below of having the wrong value + // type. + err = nil + + // Reset the token type so we don't think it completed fine. See + // objectType which uses p.tok.Type to check if we're done with + // the object. + p.tok.Type = token.EOF + } + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + if p.leadComment != nil { + o.LeadComment = p.leadComment + p.leadComment = nil + } + + switch p.tok.Type { + case token.ASSIGN: + o.Assign = p.tok.Pos + o.Val, err = p.object() + if err != nil { + return nil, err + } + case token.LBRACE: + o.Val, err = p.objectType() + if err != nil { + return nil, err + } + default: + keyStr := make([]string, 0, len(keys)) + for _, k := range keys { + keyStr = append(keyStr, k.Token.Text) + } + + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf( + "key '%s' expected start of object ('{') or assignment ('=')", + strings.Join(keyStr, " ")), + } + } + + // key=#comment + // val + if p.lineComment != nil { + o.LineComment, p.lineComment = p.lineComment, nil + } + + // do a look-ahead for line comment + p.scan() + if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { + o.LineComment = p.lineComment + p.lineComment = nil + } + p.unscan() + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + // It is very important to also return the keys here as well as + // the error. This is because we need to be able to tell if we + // did parse keys prior to finding the EOF, or if we just found + // a bare EOF. + return keys, errEofToken + case token.ASSIGN: + // assignment or object only, but not nested objects. this is not + // allowed: `foo bar = {}` + if keyCount > 1 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), + } + } + + if keyCount == 0 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: errors.New("no object keys found!"), + } + } + + return keys, nil + case token.LBRACE: + var err error + + // If we have no keys, then it is a syntax error. i.e. {{}} is not + // allowed. + if len(keys) == 0 { + err = &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING got: %s", p.tok.Type), + } + } + + // object + return keys, err + case token.IDENT, token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{Token: p.tok}) + case token.ILLEGAL: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("illegal character"), + } + default: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), + } + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (ast.Node, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.COMMENT: + // implement comment + case token.EOF: + return nil, errEofToken + } + + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("Unknown token: %+v", tok), + } +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{ + Lbrace: p.tok.Pos, + } + + l, err := p.objectList(true) + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + // No error, scan and expect the ending to be a brace + if tok := p.scan(); tok.Type != token.RBRACE { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type), + } + } + + o.List = l + o.Rbrace = p.tok.Pos // advanced via parseObjectList + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{ + Lbrack: p.tok.Pos, + } + + needComma := false + for { + tok := p.scan() + if needComma { + switch tok.Type { + case token.COMMA, token.RBRACK: + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error parsing list, expected comma or list end, got: %s", + tok.Type), + } + } + } + switch tok.Type { + case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: + node, err := p.literalType() + if err != nil { + return nil, err + } + + // If there is a lead comment, apply it + if p.leadComment != nil { + node.LeadComment = p.leadComment + p.leadComment = nil + } + + l.Add(node) + needComma = true + case token.COMMA: + // get next list item or we are at the end + // do a look-ahead for line comment + p.scan() + if p.lineComment != nil && len(l.List) > 0 { + lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) + if ok { + lit.LineComment = p.lineComment + l.List[len(l.List)-1] = lit + p.lineComment = nil + } + } + p.unscan() + + needComma = false + continue + case token.LBRACE: + // Looks like a nested object, so parse it out + node, err := p.objectType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse object within list: %s", err), + } + } + l.Add(node) + needComma = true + case token.LBRACK: + node, err := p.listType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse list within list: %s", err), + } + } + l.Add(node) + case token.RBRACK: + // finished + l.Rbrack = p.tok.Pos + return l, nil + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), + } + } + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok, + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. In the process, it collects any +// comment groups encountered, and remembers the last lead and line comments. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + // Otherwise read the next token from the scanner and Save it to the buffer + // in case we unscan later. + prev := p.tok + p.tok = p.sc.Scan() + + if p.tok.Type == token.COMMENT { + var comment *ast.CommentGroup + var endline int + + // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", + // p.tok.Pos.Line, prev.Pos.Line, endline) + if p.tok.Pos.Line == prev.Pos.Line { + // The comment is on same line as the previous token; it + // cannot be a lead comment but may be a line comment. + comment, endline = p.consumeCommentGroup(0) + if p.tok.Pos.Line != endline { + // The next token is on a different line, thus + // the last comment group is a line comment. + p.lineComment = comment + } + } + + // consume successor comments, if any + endline = -1 + for p.tok.Type == token.COMMENT { + comment, endline = p.consumeCommentGroup(1) + } + + if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { + switch p.tok.Type { + case token.RBRACE, token.RBRACK: + // Do not count for these cases + default: + // The next token is following on the line immediately after the + // comment group, thus the last comment group is a lead comment. + p.leadComment = comment + } + } + + } + + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go new file mode 100755 index 0000000..7c038d1 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go @@ -0,0 +1,789 @@ +package printer + +import ( + "bytes" + "fmt" + "sort" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +const ( + blank = byte(' ') + newline = byte('\n') + tab = byte('\t') + infinity = 1 << 30 // offset or line +) + +var ( + unindent = []byte("\uE123") // in the private use space +) + +type printer struct { + cfg Config + prev token.Pos + + comments []*ast.CommentGroup // may be nil, contains all comments + standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) + + enableTrace bool + indentTrace int +} + +type ByPosition []*ast.CommentGroup + +func (b ByPosition) Len() int { return len(b) } +func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } + +// collectComments comments all standalone comments which are not lead or line +// comment +func (p *printer) collectComments(node ast.Node) { + // first collect all comments. This is already stored in + // ast.File.(comments) + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.File: + p.comments = t.Comments + return nn, false + } + return nn, true + }) + + standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) + for _, c := range p.comments { + standaloneComments[c.Pos()] = c + } + + // next remove all lead and line comments from the overall comment map. + // This will give us comments which are standalone, comments which are not + // assigned to any kind of node. + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.LiteralType: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + case *ast.ObjectItem: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + } + + return nn, true + }) + + for _, c := range standaloneComments { + p.standaloneComments = append(p.standaloneComments, c) + } + + sort.Sort(ByPosition(p.standaloneComments)) +} + +// output prints creates b printable HCL output and returns it. +func (p *printer) output(n interface{}) []byte { + var buf bytes.Buffer + + switch t := n.(type) { + case *ast.File: + // File doesn't trace so we add the tracing here + defer un(trace(p, "File")) + return p.output(t.Node) + case *ast.ObjectList: + defer un(trace(p, "ObjectList")) + + var index int + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is at "infinity" + var nextItem token.Pos + if index != len(t.Items) { + nextItem = t.Items[index].Pos() + } else { + nextItem = token.Pos{Offset: infinity, Line: infinity} + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + // Go through all the comments in the group. The group + // should be printed together, not separated by double newlines. + printed := false + newlinePrinted := false + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // if we hit the end add newlines so we can print the comment + // we don't do this if prev is invalid which means the + // beginning of the file since the first comment should + // be at the first line. + if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { + buf.Write([]byte{newline, newline}) + newlinePrinted = true + } + + // Write the actual comment. + buf.WriteString(comment.Text) + buf.WriteByte(newline) + + // Set printed to true to note that we printed something + printed = true + } + } + + // If we're not at the last item, write a new line so + // that there is a newline separating this comment from + // the next object. + if printed && index != len(t.Items) { + buf.WriteByte(newline) + } + } + + if index == len(t.Items) { + break + } + + buf.Write(p.output(t.Items[index])) + if index != len(t.Items)-1 { + // Always write a newline to separate us from the next item + buf.WriteByte(newline) + + // Need to determine if we're going to separate the next item + // with a blank line. The logic here is simple, though there + // are a few conditions: + // + // 1. The next object is more than one line away anyways, + // so we need an empty line. + // + // 2. The next object is not a "single line" object, so + // we need an empty line. + // + // 3. This current object is not a single line object, + // so we need an empty line. + current := t.Items[index] + next := t.Items[index+1] + if next.Pos().Line != t.Items[index].Pos().Line+1 || + !p.isSingleLineObject(next) || + !p.isSingleLineObject(current) { + buf.WriteByte(newline) + } + } + index++ + } + case *ast.ObjectKey: + buf.WriteString(t.Token.Text) + case *ast.ObjectItem: + p.prev = t.Pos() + buf.Write(p.objectItem(t)) + case *ast.LiteralType: + buf.Write(p.literalType(t)) + case *ast.ListType: + buf.Write(p.list(t)) + case *ast.ObjectType: + buf.Write(p.objectType(t)) + default: + fmt.Printf(" unknown type: %T\n", n) + } + + return buf.Bytes() +} + +func (p *printer) literalType(lit *ast.LiteralType) []byte { + result := []byte(lit.Token.Text) + switch lit.Token.Type { + case token.HEREDOC: + // Clear the trailing newline from heredocs + if result[len(result)-1] == '\n' { + result = result[:len(result)-1] + } + + // Poison lines 2+ so that we don't indent them + result = p.heredocIndent(result) + case token.STRING: + // If this is a multiline string, poison lines 2+ so we don't + // indent them. + if bytes.IndexRune(result, '\n') >= 0 { + result = p.heredocIndent(result) + } + } + + return result +} + +// objectItem returns the printable HCL form of an object item. An object type +// starts with one/multiple keys and has a value. The value might be of any +// type. +func (p *printer) objectItem(o *ast.ObjectItem) []byte { + defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) + var buf bytes.Buffer + + if o.LeadComment != nil { + for _, comment := range o.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + // If key and val are on different lines, treat line comments like lead comments. + if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line { + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range o.Keys { + buf.WriteString(k.Token.Text) + buf.WriteByte(blank) + + // reach end of key + if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + buf.Write(p.output(o.Val)) + + if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line { + buf.WriteByte(blank) + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + } + } + + return buf.Bytes() +} + +// objectType returns the printable HCL form of an object type. An object type +// begins with a brace and ends with a brace. +func (p *printer) objectType(o *ast.ObjectType) []byte { + defer un(trace(p, "ObjectType")) + var buf bytes.Buffer + buf.WriteString("{") + + var index int + var nextItem token.Pos + var commented, newlinePrinted bool + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is the closing brace + if index != len(o.List.Items) { + nextItem = o.List.Items[index].Pos() + } else { + nextItem = o.Rbrace + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + printed := false + var lastCommentPos token.Pos + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // If there are standalone comments and the initial newline has not + // been printed yet, do it now. + if !newlinePrinted { + newlinePrinted = true + buf.WriteByte(newline) + } + + // add newline if it's between other printed nodes + if index > 0 { + commented = true + buf.WriteByte(newline) + } + + // Store this position + lastCommentPos = comment.Pos() + + // output the comment itself + buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) + + // Set printed to true to note that we printed something + printed = true + + /* + if index != len(o.List.Items) { + buf.WriteByte(newline) // do not print on the end + } + */ + } + } + + // Stuff to do if we had comments + if printed { + // Always write a newline + buf.WriteByte(newline) + + // If there is another item in the object and our comment + // didn't hug it directly, then make sure there is a blank + // line separating them. + if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { + buf.WriteByte(newline) + } + } + } + + if index == len(o.List.Items) { + p.prev = o.Rbrace + break + } + + // At this point we are sure that it's not a totally empty block: print + // the initial newline if it hasn't been printed yet by the previous + // block about standalone comments. + if !newlinePrinted { + buf.WriteByte(newline) + newlinePrinted = true + } + + // check if we have adjacent one liner items. If yes we'll going to align + // the comments. + var aligned []*ast.ObjectItem + for _, item := range o.List.Items[index:] { + // we don't group one line lists + if len(o.List.Items) == 1 { + break + } + + // one means a oneliner with out any lead comment + // two means a oneliner with lead comment + // anything else might be something else + cur := lines(string(p.objectItem(item))) + if cur > 2 { + break + } + + curPos := item.Pos() + + nextPos := token.Pos{} + if index != len(o.List.Items)-1 { + nextPos = o.List.Items[index+1].Pos() + } + + prevPos := token.Pos{} + if index != 0 { + prevPos = o.List.Items[index-1].Pos() + } + + // fmt.Println("DEBUG ----------------") + // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) + // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) + // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) + + if curPos.Line+1 == nextPos.Line { + aligned = append(aligned, item) + index++ + continue + } + + if curPos.Line-1 == prevPos.Line { + aligned = append(aligned, item) + index++ + + // finish if we have a new line or comment next. This happens + // if the next item is not adjacent + if curPos.Line+1 != nextPos.Line { + break + } + continue + } + + break + } + + // put newlines if the items are between other non aligned items. + // newlines are also added if there is a standalone comment already, so + // check it too + if !commented && index != len(aligned) { + buf.WriteByte(newline) + } + + if len(aligned) >= 1 { + p.prev = aligned[len(aligned)-1].Pos() + + items := p.alignedItems(aligned) + buf.Write(p.indent(items)) + } else { + p.prev = o.List.Items[index].Pos() + + buf.Write(p.indent(p.objectItem(o.List.Items[index]))) + index++ + } + + buf.WriteByte(newline) + } + + buf.WriteString("}") + return buf.Bytes() +} + +func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { + var buf bytes.Buffer + + // find the longest key and value length, needed for alignment + var longestKeyLen int // longest key length + var longestValLen int // longest value length + for _, item := range items { + key := len(item.Keys[0].Token.Text) + val := len(p.output(item.Val)) + + if key > longestKeyLen { + longestKeyLen = key + } + + if val > longestValLen { + longestValLen = val + } + } + + for i, item := range items { + if item.LeadComment != nil { + for _, comment := range item.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range item.Keys { + keyLen := len(k.Token.Text) + buf.WriteString(k.Token.Text) + for i := 0; i < longestKeyLen-keyLen+1; i++ { + buf.WriteByte(blank) + } + + // reach end of key + if i == len(item.Keys)-1 && len(item.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + val := p.output(item.Val) + valLen := len(val) + buf.Write(val) + + if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { + for i := 0; i < longestValLen-valLen+1; i++ { + buf.WriteByte(blank) + } + + for _, comment := range item.LineComment.List { + buf.WriteString(comment.Text) + } + } + + // do not print for the last item + if i != len(items)-1 { + buf.WriteByte(newline) + } + } + + return buf.Bytes() +} + +// list returns the printable HCL form of an list type. +func (p *printer) list(l *ast.ListType) []byte { + if p.isSingleLineList(l) { + return p.singleLineList(l) + } + + var buf bytes.Buffer + buf.WriteString("[") + buf.WriteByte(newline) + + var longestLine int + for _, item := range l.List { + // for now we assume that the list only contains literal types + if lit, ok := item.(*ast.LiteralType); ok { + lineLen := len(lit.Token.Text) + if lineLen > longestLine { + longestLine = lineLen + } + } + } + + haveEmptyLine := false + for i, item := range l.List { + // If we have a lead comment, then we want to write that first + leadComment := false + if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { + leadComment = true + + // Ensure an empty line before every element with a + // lead comment (except the first item in a list). + if !haveEmptyLine && i != 0 { + buf.WriteByte(newline) + } + + for _, comment := range lit.LeadComment.List { + buf.Write(p.indent([]byte(comment.Text))) + buf.WriteByte(newline) + } + } + + // also indent each line + val := p.output(item) + curLen := len(val) + buf.Write(p.indent(val)) + + // if this item is a heredoc, then we output the comma on + // the next line. This is the only case this happens. + comma := []byte{','} + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + comma = p.indent(comma) + } + + buf.Write(comma) + + if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { + // if the next item doesn't have any comments, do not align + buf.WriteByte(blank) // align one space + for i := 0; i < longestLine-curLen; i++ { + buf.WriteByte(blank) + } + + for _, comment := range lit.LineComment.List { + buf.WriteString(comment.Text) + } + } + + buf.WriteByte(newline) + + // Ensure an empty line after every element with a + // lead comment (except the first item in a list). + haveEmptyLine = leadComment && i != len(l.List)-1 + if haveEmptyLine { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// isSingleLineList returns true if: +// * they were previously formatted entirely on one line +// * they consist entirely of literals +// * there are either no heredoc strings or the list has exactly one element +// * there are no line comments +func (printer) isSingleLineList(l *ast.ListType) bool { + for _, item := range l.List { + if item.Pos().Line != l.Lbrack.Line { + return false + } + + lit, ok := item.(*ast.LiteralType) + if !ok { + return false + } + + if lit.Token.Type == token.HEREDOC && len(l.List) != 1 { + return false + } + + if lit.LineComment != nil { + return false + } + } + + return true +} + +// singleLineList prints a simple single line list. +// For a definition of "simple", see isSingleLineList above. +func (p *printer) singleLineList(l *ast.ListType) []byte { + buf := &bytes.Buffer{} + + buf.WriteString("[") + for i, item := range l.List { + if i != 0 { + buf.WriteString(", ") + } + + // Output the item itself + buf.Write(p.output(item)) + + // The heredoc marker needs to be at the end of line. + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// indent indents the lines of the given buffer for each non-empty line +func (p *printer) indent(buf []byte) []byte { + var prefix []byte + if p.cfg.SpacesWidth != 0 { + for i := 0; i < p.cfg.SpacesWidth; i++ { + prefix = append(prefix, blank) + } + } else { + prefix = []byte{tab} + } + + var res []byte + bol := true + for _, c := range buf { + if bol && c != '\n' { + res = append(res, prefix...) + } + + res = append(res, c) + bol = c == '\n' + } + return res +} + +// unindent removes all the indentation from the tombstoned lines +func (p *printer) unindent(buf []byte) []byte { + var res []byte + for i := 0; i < len(buf); i++ { + skip := len(buf)-i <= len(unindent) + if !skip { + skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) + } + if skip { + res = append(res, buf[i]) + continue + } + + // We have a marker. we have to backtrace here and clean out + // any whitespace ahead of our tombstone up to a \n + for j := len(res) - 1; j >= 0; j-- { + if res[j] == '\n' { + break + } + + res = res[:j] + } + + // Skip the entire unindent marker + i += len(unindent) - 1 + } + + return res +} + +// heredocIndent marks all the 2nd and further lines as unindentable +func (p *printer) heredocIndent(buf []byte) []byte { + var res []byte + bol := false + for _, c := range buf { + if bol && c != '\n' { + res = append(res, unindent...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// isSingleLineObject tells whether the given object item is a single +// line object such as "obj {}". +// +// A single line object: +// +// * has no lead comments (hence multi-line) +// * has no assignment +// * has no values in the stanza (within {}) +// +func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { + // If there is a lead comment, can't be one line + if val.LeadComment != nil { + return false + } + + // If there is assignment, we always break by line + if val.Assign.IsValid() { + return false + } + + // If it isn't an object type, then its not a single line object + ot, ok := val.Val.(*ast.ObjectType) + if !ok { + return false + } + + // If the object has no items, it is single line! + return len(ot.List.Items) == 0 +} + +func lines(txt string) int { + endline := 1 + for i := 0; i < len(txt); i++ { + if txt[i] == '\n' { + endline++ + } + } + return endline +} + +// ---------------------------------------------------------------------------- +// Tracing support + +func (p *printer) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + i := 2 * p.indentTrace + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *printer, msg string) *printer { + p.printTrace(msg, "(") + p.indentTrace++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *printer) { + p.indentTrace-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go new file mode 100755 index 0000000..6617ab8 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go @@ -0,0 +1,66 @@ +// Package printer implements printing of AST nodes to HCL format. +package printer + +import ( + "bytes" + "io" + "text/tabwriter" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" +) + +var DefaultConfig = Config{ + SpacesWidth: 2, +} + +// A Config node controls the output of Fprint. +type Config struct { + SpacesWidth int // if set, it will use spaces instead of tabs for alignment +} + +func (c *Config) Fprint(output io.Writer, node ast.Node) error { + p := &printer{ + cfg: *c, + comments: make([]*ast.CommentGroup, 0), + standaloneComments: make([]*ast.CommentGroup, 0), + // enableTrace: true, + } + + p.collectComments(node) + + if _, err := output.Write(p.unindent(p.output(node))); err != nil { + return err + } + + // flush tabwriter, if any + var err error + if tw, _ := output.(*tabwriter.Writer); tw != nil { + err = tw.Flush() + } + + return err +} + +// Fprint "pretty-prints" an HCL node to output +// It calls Config.Fprint with default settings. +func Fprint(output io.Writer, node ast.Node) error { + return DefaultConfig.Fprint(output, node) +} + +// Format formats src HCL and returns the result. +func Format(src []byte) ([]byte, error) { + node, err := parser.Parse(src) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err := DefaultConfig.Fprint(&buf, node); err != nil { + return nil, err + } + + // Add trailing newline to result + buf.WriteString("\n") + return buf.Bytes(), nil +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go new file mode 100755 index 0000000..624a18f --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go @@ -0,0 +1,652 @@ +// Package scanner implements a scanner for HCL (HashiCorp Configuration +// Language) source text. +package scanner + +import ( + "bytes" + "fmt" + "os" + "regexp" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/hcl/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == utf8.RuneError && size == 1 { + s.err("illegal UTF-8 encoding") + return ch + } + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + if ch == '\x00' { + s.err("unexpected null character (0x00)") + return eof + } + + if ch == '\uE123' { + s.err("unicode code point U+E123 reserved for internal use") + return utf8.RuneError + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + tok = token.IDENT + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '#', '/': + tok = token.COMMENT + s.scanComment(ch) + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '<': + tok = token.HEREDOC + s.scanHeredoc() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case '=': + tok = token.ASSIGN + case '+': + tok = token.ADD + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + tok = token.SUB + } + default: + s.err("illegal char") + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +func (s *Scanner) scanComment(ch rune) { + // single line comments + if ch == '#' || (ch == '/' && s.peek() != '*') { + if ch == '/' && s.peek() != '/' { + s.err("expected '/' for comment") + return + } + + ch = s.next() + for ch != '\n' && ch >= 0 && ch != eof { + ch = s.next() + } + if ch != eof && ch >= 0 { + s.unread() + } + return + } + + // be sure we get the character after /* This allows us to find comment's + // that are not erminated + if ch == '/' { + s.next() + ch = s.next() // read character after "/*" + } + + // look for /* - style comments + for { + if ch < 0 || ch == eof { + s.err("comment not terminated") + break + } + + ch0 := ch + ch = s.next() + if ch0 == '*' && ch == '/' { + break + } + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + if ch == '0' { + // check for hexadecimal, octal or float + ch = s.next() + if ch == 'x' || ch == 'X' { + // hexadecimal + ch = s.next() + found := false + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + s.err("illegal hexadecimal number") + } + + if ch != eof { + s.unread() + } + + return token.NUMBER + } + + // now it's either something like: 0421(octal) or 0.1231(float) + illegalOctal := false + for isDecimal(ch) { + ch = s.next() + if ch == '8' || ch == '9' { + // this is just a possibility. For example 0159 is illegal, but + // 0159.23 is valid. So we mark a possible illegal octal. If + // the next character is not a period, we'll print the error. + illegalOctal = true + } + } + + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if illegalOctal { + s.err("illegal octal number") + } + + if ch != eof { + s.unread() + } + return token.NUMBER + } + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanHeredoc scans a heredoc string +func (s *Scanner) scanHeredoc() { + // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { + break + } + + // Not an anchor match, record the start of a new line + lineStart = s.srcPos.Offset + } + + if ch == eof { + s.err("heredoc not terminated") + return + } + } + + return +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if (ch == '\n' && braces == 0) || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + start := n + for n > 0 && digitVal(ch) < base { + ch = s.next() + if ch == eof { + // If we see an EOF, we halt any more scanning of digits + // immediately. + break + } + + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + if n != start && ch != eof { + // we scanned all digits, put the last non digit char back, + // only if we read anything at all + s.unread() + } + + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isDigit returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isDecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go new file mode 100755 index 0000000..5f981ea --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go @@ -0,0 +1,241 @@ +package strconv + +import ( + "errors" + "unicode/utf8" +) + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// Unquote interprets s as a single-quoted, double-quoted, +// or backquoted Go string literal, returning the string value +// that s quotes. (If s is single-quoted, it would be a Go +// character literal; Unquote returns the corresponding +// one-character string.) +func Unquote(s string) (t string, err error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' { + return "", ErrSyntax + } + if !contains(s, '$') && !contains(s, '{') && contains(s, '\n') { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { + switch quote { + case '"': + return s, nil + case '\'': + r, size := utf8.DecodeRuneInString(s) + if size == len(s) && (r != utf8.RuneError || size != 1) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + // If we're starting a '${}' then let it through un-unquoted. + // Specifically: we don't unquote any characters within the `${}` + // section. + if s[0] == '$' && len(s) > 1 && s[1] == '{' { + buf = append(buf, '$', '{') + s = s[2:] + + // Continue reading until we find the closing brace, copying as-is + braces := 1 + for len(s) > 0 && braces > 0 { + r, size := utf8.DecodeRuneInString(s) + if r == utf8.RuneError { + return "", ErrSyntax + } + + s = s[size:] + + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + + switch r { + case '{': + braces++ + case '}': + braces-- + } + } + if braces != 0 { + return "", ErrSyntax + } + if len(s) == 0 { + // If there's no string left, we're done! + break + } else { + // If there's more left, we need to pop back up to the top of the loop + // in case there's another interpolation in this string. + continue + } + } + + if s[0] == '\n' { + return "", ErrSyntax + } + + c, multibyte, ss, err := unquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + if quote == '\'' && len(s) != 0 { + // single-quoted must be single character + return "", ErrSyntax + } + } + return string(buf), nil +} + +// contains reports whether the string contains the byte c. +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} + +func unhex(b byte) (v rune, ok bool) { + c := rune(b) + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + return +} + +func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { + // easy cases + switch c := s[0]; { + case c == quote && (quote == '\'' || quote == '"'): + err = ErrSyntax + return + case c >= utf8.RuneSelf: + r, size := utf8.DecodeRuneInString(s) + return r, true, s[size:], nil + case c != '\\': + return rune(s[0]), false, s[1:], nil + } + + // hard case: c is backslash + if len(s) <= 1 { + err = ErrSyntax + return + } + c := s[1] + s = s[2:] + + switch c { + case 'a': + value = '\a' + case 'b': + value = '\b' + case 'f': + value = '\f' + case 'n': + value = '\n' + case 'r': + value = '\r' + case 't': + value = '\t' + case 'v': + value = '\v' + case 'x', 'u', 'U': + n := 0 + switch c { + case 'x': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + var v rune + if len(s) < n { + err = ErrSyntax + return + } + for j := 0; j < n; j++ { + x, ok := unhex(s[j]) + if !ok { + err = ErrSyntax + return + } + v = v<<4 | x + } + s = s[n:] + if c == 'x' { + // single-byte string, possibly not UTF-8 + value = v + break + } + if v > utf8.MaxRune { + err = ErrSyntax + return + } + value = v + multibyte = true + case '0', '1', '2', '3', '4', '5', '6', '7': + v := rune(c) - '0' + if len(s) < 2 { + err = ErrSyntax + return + } + for j := 0; j < 2; j++ { // one digit already; two more + x := rune(s[j]) - '0' + if x < 0 || x > 7 { + err = ErrSyntax + return + } + v = (v << 3) | x + } + s = s[2:] + if v > 255 { + err = ErrSyntax + return + } + value = v + case '\\': + value = '\\' + case '\'', '"': + if c != quote { + err = ErrSyntax + return + } + value = rune(c) + default: + err = ErrSyntax + return + } + tail = s + return +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/hashicorp/hcl/hcl/token/position.go new file mode 100755 index 0000000..59c1bb7 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/hashicorp/hcl/hcl/token/token.go new file mode 100755 index 0000000..e37c066 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/hcl/token/token.go @@ -0,0 +1,219 @@ +// Package token defines constants representing the lexical tokens for HCL +// (HashiCorp Configuration Language) +package token + +import ( + "fmt" + "strconv" + "strings" + + hclstrconv "github.com/hashicorp/hcl/hcl/strconv" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string + JSON bool +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + COMMENT + + identifier_beg + IDENT // literals + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + HEREDOC // < 0 { + // Pop the current item + n := len(frontier) + item := frontier[n-1] + frontier = frontier[:n-1] + + switch v := item.Val.(type) { + case *ast.ObjectType: + items, frontier = flattenObjectType(v, item, items, frontier) + case *ast.ListType: + items, frontier = flattenListType(v, item, items, frontier) + default: + items = append(items, item) + } + } + + // Reverse the list since the frontier model runs things backwards + for i := len(items)/2 - 1; i >= 0; i-- { + opp := len(items) - 1 - i + items[i], items[opp] = items[opp], items[i] + } + + // Done! Set the original items + list.Items = items + return n, true + }) +} + +func flattenListType( + ot *ast.ListType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list is empty, keep the original list + if len(ot.List) == 0 { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List { + if _, ok := subitem.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, elem := range ot.List { + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: item.Keys, + Assign: item.Assign, + Val: elem, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} + +func flattenObjectType( + ot *ast.ObjectType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list has no items we do not have to flatten anything + if ot.List.Items == nil { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List.Items { + if _, ok := subitem.Val.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, subitem := range ot.List.Items { + // Copy the new key + keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) + copy(keys, item.Keys) + copy(keys[len(item.Keys):], subitem.Keys) + + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: keys, + Assign: item.Assign, + Val: subitem.Val, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/hashicorp/hcl/json/parser/parser.go new file mode 100755 index 0000000..125a5f0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/parser/parser.go @@ -0,0 +1,313 @@ +package parser + +import ( + "errors" + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hcltoken "github.com/hashicorp/hcl/hcl/token" + "github.com/hashicorp/hcl/json/scanner" + "github.com/hashicorp/hcl/json/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = fmt.Errorf("%s: %s", pos, msg) + } + + // The root must be an object in JSON + object, err := p.object() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + // We make our final node an object list so it is more HCL compatible + f.Node = object.List + + // Flatten it, which finds patterns and turns them into more HCL-like + // AST trees. + flattenObjects(f.Node) + + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // Check for a followup comma. If it isn't a comma, then we're done + if tok := p.scan(); tok.Type != token.COMMA { + break + } + } + + return node, nil +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + switch p.tok.Type { + case token.COLON: + pos := p.tok.Pos + o.Assign = hcltoken.Pos{ + Filename: pos.Filename, + Offset: pos.Offset, + Line: pos.Line, + Column: pos.Column, + } + + o.Val, err = p.objectValue() + if err != nil { + return nil, err + } + } + + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + return nil, errEofToken + case token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{ + Token: p.tok.HCLToken(), + }) + case token.COLON: + // If we have a zero keycount it means that we never got + // an object key, i.e. `{ :`. This is a syntax error. + if keyCount == 0 { + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + + // Done + return keys, nil + case token.ILLEGAL: + return nil, errors.New("illegal") + default: + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) objectValue() (ast.Node, error) { + defer un(trace(p, "ParseObjectValue")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (*ast.ObjectType, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.LBRACE: + return p.objectType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{} + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + o.List = l + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{} + + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING: + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.COMMA: + continue + case token.LBRACE: + node, err := p.objectType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + return l, nil + default: + return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) + } + + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok.HCLToken(), + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + p.tok = p.sc.Scan() + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go new file mode 100755 index 0000000..fe3f0f0 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go @@ -0,0 +1,451 @@ +package scanner + +import ( + "bytes" + "fmt" + "os" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/json/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + if ch == utf8.RuneError && size == 1 { + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + s.err("illegal UTF-8 encoding") + return ch + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } else if lit == "null" { + tok = token.NULL + } else { + s.err("illegal char") + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case ':': + tok = token.COLON + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + s.err("illegal char") + } + default: + s.err("illegal char: " + string(ch)) + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + zero := ch == '0' + pos := s.srcPos + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + + // If we have a larger number and this is zero, error + if zero && pos != s.srcPos { + s.err("numbers cannot start with 0") + } + + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isHexadecimal returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isHexadecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/hashicorp/hcl/json/token/position.go new file mode 100755 index 0000000..59c1bb7 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/hashicorp/hcl/json/token/token.go new file mode 100755 index 0000000..95a0c3e --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/json/token/token.go @@ -0,0 +1,118 @@ +package token + +import ( + "fmt" + "strconv" + + hcltoken "github.com/hashicorp/hcl/hcl/token" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + + identifier_beg + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + NULL // null + literal_end + identifier_end + + operator_beg + LBRACK // [ + LBRACE // { + COMMA // , + PERIOD // . + COLON // : + + RBRACK // ] + RBRACE // } + + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + + NUMBER: "NUMBER", + FLOAT: "FLOAT", + BOOL: "BOOL", + STRING: "STRING", + NULL: "NULL", + + LBRACK: "LBRACK", + LBRACE: "LBRACE", + COMMA: "COMMA", + PERIOD: "PERIOD", + COLON: "COLON", + + RBRACK: "RBRACK", + RBRACE: "RBRACE", +} + +// String returns the string corresponding to the token tok. +func (t Type) String() string { + s := "" + if 0 <= t && t < Type(len(tokens)) { + s = tokens[t] + } + if s == "" { + s = "token(" + strconv.Itoa(int(t)) + ")" + } + return s +} + +// IsIdentifier returns true for tokens corresponding to identifiers and basic +// type literals; it returns false otherwise. +func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } + +// IsLiteral returns true for tokens corresponding to basic type literals; it +// returns false otherwise. +func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } + +// String returns the token's literal text. Note that this is only +// applicable for certain token types, such as token.IDENT, +// token.STRING, etc.. +func (t Token) String() string { + return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) +} + +// HCLToken converts this token to an HCL token. +// +// The token type must be a literal type or this will panic. +func (t Token) HCLToken() hcltoken.Token { + switch t.Type { + case BOOL: + return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} + case FLOAT: + return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} + case NULL: + return hcltoken.Token{Type: hcltoken.STRING, Text: ""} + case NUMBER: + return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} + case STRING: + return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} + default: + panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) + } +} diff --git a/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/hashicorp/hcl/lex.go new file mode 100755 index 0000000..d9993c2 --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/lex.go @@ -0,0 +1,38 @@ +package hcl + +import ( + "unicode" + "unicode/utf8" +) + +type lexModeValue byte + +const ( + lexModeUnknown lexModeValue = iota + lexModeHcl + lexModeJson +) + +// lexMode returns whether we're going to be parsing in JSON +// mode or HCL mode. +func lexMode(v []byte) lexModeValue { + var ( + r rune + w int + offset int + ) + + for { + r, w = utf8.DecodeRune(v[offset:]) + offset += w + if unicode.IsSpace(r) { + continue + } + if r == '{' { + return lexModeJson + } + break + } + + return lexModeHcl +} diff --git a/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/hashicorp/hcl/parse.go new file mode 100755 index 0000000..1fca53c --- /dev/null +++ b/vendor/github.com/hashicorp/hcl/parse.go @@ -0,0 +1,39 @@ +package hcl + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hclParser "github.com/hashicorp/hcl/hcl/parser" + jsonParser "github.com/hashicorp/hcl/json/parser" +) + +// ParseBytes accepts as input byte slice and returns ast tree. +// +// Input can be either JSON or HCL +func ParseBytes(in []byte) (*ast.File, error) { + return parse(in) +} + +// ParseString accepts input as a string and returns ast tree. +func ParseString(input string) (*ast.File, error) { + return parse([]byte(input)) +} + +func parse(in []byte) (*ast.File, error) { + switch lexMode(in) { + case lexModeHcl: + return hclParser.Parse(in) + case lexModeJson: + return jsonParser.Parse(in) + } + + return nil, fmt.Errorf("unknown config format") +} + +// Parse parses the given input and returns the root object. +// +// The input format can be either HCL or JSON. +func Parse(input string) (*ast.File, error) { + return parse([]byte(input)) +} diff --git a/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/magiconair/properties/.gitignore new file mode 100755 index 0000000..e7081ff --- /dev/null +++ b/vendor/github.com/magiconair/properties/.gitignore @@ -0,0 +1,6 @@ +*.sublime-project +*.sublime-workspace +*.un~ +*.swp +.idea/ +*.iml diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml new file mode 100755 index 0000000..3e7c3d2 --- /dev/null +++ b/vendor/github.com/magiconair/properties/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.4.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - "1.10.x" + - tip diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md new file mode 100755 index 0000000..f83adc2 --- /dev/null +++ b/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -0,0 +1,131 @@ +## Changelog + +### [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 + + This adds the option to disable property expansion during loading. + + Thanks to [@kmala](https://github.com/kmala) for the patch. + +### [1.7.6](https://github.com/magiconair/properties/tree/v1.7.6) - 14 Feb 2018 + + * [PR #29](https://github.com/magiconair/properties/pull/29): Reworked expansion logic to handle more complex cases. + + See PR for an example. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.5](https://github.com/magiconair/properties/tree/v1.7.5) - 13 Feb 2018 + + * [PR #28](https://github.com/magiconair/properties/pull/28): Support duplicate expansions in the same value + + Values which expand the same key multiple times (e.g. `key=${a} ${a}`) will no longer fail + with a `circular reference error`. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.4](https://github.com/magiconair/properties/tree/v1.7.4) - 31 Oct 2017 + + * [Issue #23](https://github.com/magiconair/properties/issues/23): Ignore blank lines with whitespaces + + * [PR #24](https://github.com/magiconair/properties/pull/24): Update keys when DisableExpansion is enabled + + Thanks to [@mgurov](https://github.com/mgurov) for the fix. + +### [1.7.3](https://github.com/magiconair/properties/tree/v1.7.3) - 10 Jul 2017 + + * [Issue #17](https://github.com/magiconair/properties/issues/17): Add [SetValue()](http://godoc.org/github.com/magiconair/properties#Properties.SetValue) method to set values generically + * [Issue #22](https://github.com/magiconair/properties/issues/22): Add [LoadMap()](http://godoc.org/github.com/magiconair/properties#LoadMap) function to load properties from a string map + +### [1.7.2](https://github.com/magiconair/properties/tree/v1.7.2) - 20 Mar 2017 + + * [Issue #15](https://github.com/magiconair/properties/issues/15): Drop gocheck dependency + * [PR #21](https://github.com/magiconair/properties/pull/21): Add [Map()](http://godoc.org/github.com/magiconair/properties#Properties.Map) and [FilterFunc()](http://godoc.org/github.com/magiconair/properties#Properties.FilterFunc) + +### [1.7.1](https://github.com/magiconair/properties/tree/v1.7.1) - 13 Jan 2017 + + * [Issue #14](https://github.com/magiconair/properties/issues/14): Decouple TestLoadExpandedFile from `$USER` + * [PR #12](https://github.com/magiconair/properties/pull/12): Load from files and URLs + * [PR #16](https://github.com/magiconair/properties/pull/16): Keep gofmt happy + * [PR #18](https://github.com/magiconair/properties/pull/18): Fix Delete() function + +### [1.7.0](https://github.com/magiconair/properties/tree/v1.7.0) - 20 Mar 2016 + + * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#LoadURL) method to load properties from a URL. + * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#LoadString) method to load properties from an UTF8 string. + * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe) + +### [1.6.0](https://github.com/magiconair/properties/tree/v1.6.0) - 11 Dec 2015 + + * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags. + +### [1.5.6](https://github.com/magiconair/properties/tree/v1.5.6) - 18 Oct 2015 + + * Vendored in gopkg.in/check.v1 + +### [1.5.5](https://github.com/magiconair/properties/tree/v1.5.5) - 31 Jul 2015 + + * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs) + +### [1.5.4](https://github.com/magiconair/properties/tree/v1.5.4) - 23 Jun 2015 + + * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references. + +### [1.5.3](https://github.com/magiconair/properties/tree/v1.5.3) - 02 Jun 2015 + + * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) + +### [1.5.2](https://github.com/magiconair/properties/tree/v1.5.2) - 10 Apr 2015 + + * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty + * Add clickable links to README + +### [1.5.1](https://github.com/magiconair/properties/tree/v1.5.1) - 08 Dec 2014 + + * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with + [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration). + +### [1.5.0](https://github.com/magiconair/properties/tree/v1.5.0) - 18 Nov 2014 + + * Added support for single and multi-line comments (reading, writing and updating) + * The order of keys is now preserved + * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry + * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method + * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1) + +### [1.4.2](https://github.com/magiconair/properties/tree/v1.4.2) - 15 Nov 2014 + + * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one + +### [1.4.1](https://github.com/magiconair/properties/tree/v1.4.1) - 13 Nov 2014 + + * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string + +### [1.4.0](https://github.com/magiconair/properties/tree/v1.4.0) - 23 Sep 2014 + + * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys + * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties + +### [1.3.0](https://github.com/magiconair/properties/tree/v1.3.0) - 18 Mar 2014 + +* Added support for time.Duration +* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tree/vior configurable (log.Fatal, panic) - custom) +* Changed default of MustXXX() failure from panic to log.Fatal + +### [1.2.0](https://github.com/magiconair/properties/tree/v1.2.0) - 05 Mar 2014 + +* Added MustGet... functions +* Added support for int and uint with range checks on 32 bit platforms + +### [1.1.0](https://github.com/magiconair/properties/tree/v1.1.0) - 20 Jan 2014 + +* Renamed from goproperties to properties +* Added support for expansion of environment vars in + filenames and value expressions +* Fixed bug where value expressions were not at the + start of the string + +### [1.0.0](https://github.com/magiconair/properties/tree/v1.0.0) - 7 Jan 2014 + +* Initial release diff --git a/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/magiconair/properties/LICENSE new file mode 100755 index 0000000..b387087 --- /dev/null +++ b/vendor/github.com/magiconair/properties/LICENSE @@ -0,0 +1,25 @@ +goproperties - properties file decoder for Go + +Copyright (c) 2013-2018 - Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY 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/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md new file mode 100755 index 0000000..2c05f29 --- /dev/null +++ b/vendor/github.com/magiconair/properties/README.md @@ -0,0 +1,129 @@ +[![](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") +[![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) + +# Overview + +#### Please run `git pull --tags` to update the tags. See [below](#updated-git-tags) why. + +properties is a Go library for reading and writing properties files. + +It supports reading from multiple files or URLs and Spring style recursive +property expansion of expressions like `${key}` to their corresponding value. +Value expressions can refer to other keys like in `${key}` or to environment +variables like in `${USER}`. Filenames can also contain environment variables +like in `/home/${USER}/myapp.properties`. + +Properties can be decoded into structs, maps, arrays and values through +struct tags. + +Comments and the order of keys are preserved. Comments can be modified +and can be written to the output. + +The properties library supports both ISO-8859-1 and UTF-8 encoded data. + +Starting from version 1.3.0 the behavior of the MustXXX() functions is +configurable by providing a custom `ErrorHandler` function. The default has +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) + +## Getting Started + +```go +import ( + "flag" + "github.com/magiconair/properties" +) + +func main() { + // init from a file + p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8) + + // or multiple files + p = properties.MustLoadFiles([]string{ + "${HOME}/config.properties", + "${HOME}/config-${USER}.properties", + }, properties.UTF8, true) + + // or from a map + p = properties.LoadMap(map[string]string{"key": "value", "abc": "def"}) + + // or from a string + p = properties.MustLoadString("key=value\nabc=def") + + // or from a URL + p = properties.MustLoadURL("http://host/path") + + // or from multiple URLs + p = properties.MustLoadURL([]string{ + "http://host/config", + "http://host/config-${USER}", + }, true) + + // or from flags + p.MustFlag(flag.CommandLine) + + // get values through getters + host := p.MustGetString("host") + port := p.GetInt("port", 8080) + + // or through Decode + type Config struct { + Host string `properties:"host"` + Port int `properties:"port,default=9000"` + Accept []string `properties:"accept,default=image/png;image;gif"` + Timeout time.Duration `properties:"timeout,default=5s"` + } + var cfg Config + if err := p.Decode(&cfg); err != nil { + log.Fatal(err) + } +} + +``` + +## Installation and Upgrade + +``` +$ go get -u github.com/magiconair/properties +``` + +## License + +2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details. + +## ToDo + +* Dump contents with passwords and secrets obscured + +## Updated Git tags + +#### 13 Feb 2018 + +I realized that all of the git tags I had pushed before v1.7.5 were lightweight tags +and I've only recently learned that this doesn't play well with `git describe` 😞 + +I have replaced all lightweight tags with signed tags using this script which should +retain the commit date, name and email address. Please run `git pull --tags` to update them. + +Worst case you have to reclone the repo. + +```shell +#!/bin/bash +tag=$1 +echo "Updating $tag" +date=$(git show ${tag}^0 --format=%aD | head -1) +email=$(git show ${tag}^0 --format=%aE | head -1) +name=$(git show ${tag}^0 --format=%aN | head -1) +GIT_COMMITTER_DATE="$date" GIT_COMMITTER_NAME="$name" GIT_COMMITTER_EMAIL="$email" git tag -s -f ${tag} ${tag}^0 -m ${tag} +``` + +I apologize for the inconvenience. + +Frank + diff --git a/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/magiconair/properties/decode.go new file mode 100755 index 0000000..3ebf804 --- /dev/null +++ b/vendor/github.com/magiconair/properties/decode.go @@ -0,0 +1,289 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +// Decode assigns property values to exported fields of a struct. +// +// Decode traverses v recursively and returns an error if a value cannot be +// converted to the field type or a required value is missing for a field. +// +// The following type dependent decodings are used: +// +// String, boolean, numeric fields have the value of the property key assigned. +// The property key name is the name of the field. A different key and a default +// value can be set in the field's tag. Fields without default value are +// required. If the value cannot be converted to the field type an error is +// returned. +// +// time.Duration fields have the result of time.ParseDuration() assigned. +// +// time.Time fields have the vaule of time.Parse() assigned. The default layout +// is time.RFC3339 but can be set in the field's tag. +// +// Arrays and slices of string, boolean, numeric, time.Duration and time.Time +// fields have the value interpreted as a comma separated list of values. The +// individual values are trimmed of whitespace and empty values are ignored. A +// default value can be provided as a semicolon separated list in the field's +// tag. +// +// Struct fields are decoded recursively using the field name plus "." as +// prefix. The prefix (without dot) can be overridden in the field's tag. +// Default values are not supported in the field's tag. Specify them on the +// fields of the inner struct instead. +// +// Map fields must have a key of type string and are decoded recursively by +// using the field's name plus ".' as prefix and the next element of the key +// name as map key. The prefix (without dot) can be overridden in the field's +// tag. Default values are not supported. +// +// Examples: +// +// // Field is ignored. +// Field int `properties:"-"` +// +// // Field is assigned value of 'Field'. +// Field int +// +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` +// +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` +// +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` +// +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` +// +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct +// +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` +// +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string +// +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` +func (p *Properties) Decode(x interface{}) error { + t, v := reflect.TypeOf(x), reflect.ValueOf(x) + if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer to struct: %s", t) + } + if err := dec(p, "", nil, nil, v); err != nil { + return err + } + return nil +} + +func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error { + t := v.Type() + + // value returns the property value for key or the default if provided. + value := func() (string, error) { + if val, ok := p.Get(key); ok { + return val, nil + } + if def != nil { + return *def, nil + } + return "", fmt.Errorf("missing required key %s", key) + } + + // conv converts a string to a value of the given type. + conv := func(s string, t reflect.Type) (val reflect.Value, err error) { + var v interface{} + + switch { + case isDuration(t): + v, err = time.ParseDuration(s) + + case isTime(t): + layout := opts["layout"] + if layout == "" { + layout = time.RFC3339 + } + v, err = time.Parse(layout, s) + + case isBool(t): + v, err = boolVal(s), nil + + case isString(t): + v, err = s, nil + + case isFloat(t): + v, err = strconv.ParseFloat(s, 64) + + case isInt(t): + v, err = strconv.ParseInt(s, 10, 64) + + case isUint(t): + v, err = strconv.ParseUint(s, 10, 64) + + default: + return reflect.Zero(t), fmt.Errorf("unsupported type %s", t) + } + if err != nil { + return reflect.Zero(t), err + } + return reflect.ValueOf(v).Convert(t), nil + } + + // keydef returns the property key and the default value based on the + // name of the struct field and the options in the tag. + keydef := func(f reflect.StructField) (string, *string, map[string]string) { + _key, _opts := parseTag(f.Tag.Get("properties")) + + var _def *string + if d, ok := _opts["default"]; ok { + _def = &d + } + if _key != "" { + return _key, _def, _opts + } + return f.Name, _def, _opts + } + + switch { + case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t): + s, err := value() + if err != nil { + return err + } + val, err := conv(s, t) + if err != nil { + return err + } + v.Set(val) + + case isPtr(t): + return dec(p, key, def, opts, v.Elem()) + + case isStruct(t): + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + fk, def, opts := keydef(t.Field(i)) + if !fv.CanSet() { + return fmt.Errorf("cannot set %s", t.Field(i).Name) + } + if fk == "-" { + continue + } + if key != "" { + fk = key + "." + fk + } + if err := dec(p, fk, def, opts, fv); err != nil { + return err + } + } + return nil + + case isArray(t): + val, err := value() + if err != nil { + return err + } + vals := split(val, ";") + a := reflect.MakeSlice(t, 0, len(vals)) + for _, s := range vals { + val, err := conv(s, t.Elem()) + if err != nil { + return err + } + a = reflect.Append(a, val) + } + v.Set(a) + + case isMap(t): + valT := t.Elem() + m := reflect.MakeMap(t) + for postfix := range p.FilterStripPrefix(key + ".").m { + pp := strings.SplitN(postfix, ".", 2) + mk, mv := pp[0], reflect.New(valT) + if err := dec(p, key+"."+mk, nil, nil, mv); err != nil { + return err + } + m.SetMapIndex(reflect.ValueOf(mk), mv.Elem()) + } + v.Set(m) + + default: + return fmt.Errorf("unsupported type %s", t) + } + return nil +} + +// split splits a string on sep, trims whitespace of elements +// and omits empty elements +func split(s string, sep string) []string { + var a []string + for _, v := range strings.Split(s, sep) { + if v = strings.TrimSpace(v); v != "" { + a = append(a, v) + } + } + return a +} + +// parseTag parses a "key,k=v,k=v,..." +func parseTag(tag string) (key string, opts map[string]string) { + opts = map[string]string{} + for i, s := range strings.Split(tag, ",") { + if i == 0 { + key = s + continue + } + + pp := strings.SplitN(s, "=", 2) + if len(pp) == 1 { + opts[pp[0]] = "" + } else { + opts[pp[0]] = pp[1] + } + } + return key, opts +} + +func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice } +func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool } +func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) } +func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map } +func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr } +func isString(t reflect.Type) bool { return t.Kind() == reflect.String } +func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct } +func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) } +func isFloat(t reflect.Type) bool { + return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64 +} +func isInt(t reflect.Type) bool { + return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64 +} +func isUint(t reflect.Type) bool { + return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64 +} diff --git a/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/magiconair/properties/doc.go new file mode 100755 index 0000000..f8822da --- /dev/null +++ b/vendor/github.com/magiconair/properties/doc.go @@ -0,0 +1,156 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package properties provides functions for reading and writing +// ISO-8859-1 and UTF-8 encoded .properties files and has +// support for recursive property expansion. +// +// Java properties files are ISO-8859-1 encoded and use Unicode +// literals for characters outside the ISO character set. Unicode +// literals can be used in UTF-8 encoded properties files but +// aren't necessary. +// +// To load a single properties file use MustLoadFile(): +// +// p := properties.MustLoadFile(filename, properties.UTF8) +// +// To load multiple properties files use MustLoadFiles() +// which loads the files in the given order and merges the +// result. Missing properties files can be ignored if the +// 'ignoreMissing' flag is set to true. +// +// Filenames can contain environment variables which are expanded +// before loading. +// +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// +// All of the different key/value delimiters ' ', ':' and '=' are +// supported as well as the comment characters '!' and '#' and +// multi-line values. +// +// ! this is a comment +// # and so is this +// +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue +// +// Properties stores all comments preceding a key and provides +// GetComments() and SetComments() methods to retrieve and +// update them. The convenience functions GetComment() and +// SetComment() allow access to the last comment. The +// WriteComment() method writes properties files including +// the comments and with the keys in the original order. +// This can be used for sanitizing properties files. +// +// Property expansion is recursive and circular references +// and malformed expressions are not allowed and cause an +// error. Expansion of environment variables is supported. +// +// # standard property +// key = value +// +// # property expansion: key2 = value +// key2 = ${key} +// +// # recursive expansion: key3 = value +// key3 = ${key2} +// +// # circular reference (error) +// key = ${key} +// +// # malformed expression (error) +// key = ${ke +// +// # refers to the users' home dir +// home = ${HOME} +// +// # local key takes precedence over env var: u = foo +// USER = foo +// u = ${USER} +// +// The default property expansion format is ${key} but can be +// changed by setting different pre- and postfix values on the +// Properties object. +// +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" +// +// Properties provides convenience functions for getting typed +// values with default values if the key does not exist or the +// type conversion failed. +// +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) +// +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) +// +// As an alternative properties may be applied with the standard +// library's flag implementation at any time. +// +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() +// +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) +// +// Properties provides several MustXXX() convenience functions +// which will terminate the app if an error occurs. The behavior +// of the failure is configurable and the default is to call +// log.Fatal(err). To have the MustXXX() functions panic instead +// of logging the error set a different ErrorHandler before +// you use the Properties package. +// +// properties.ErrorHandler = properties.PanicHandler +// +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") +// +// You can also provide your own ErrorHandler function. The only requirement +// is that the error handler function must exit after handling the error. +// +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } +// +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") +// +// Properties can also be loaded into a struct via the `Decode` +// method, e.g. +// +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } +// +// See `Decode()` method for the full documentation. +// +// The following documents provide a description of the properties +// file format. +// +// http://en.wikipedia.org/wiki/.properties +// +// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 +// +package properties diff --git a/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/magiconair/properties/integrate.go new file mode 100755 index 0000000..74d38dc --- /dev/null +++ b/vendor/github.com/magiconair/properties/integrate.go @@ -0,0 +1,34 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import "flag" + +// MustFlag sets flags that are skipped by dst.Parse when p contains +// the respective key for flag.Flag.Name. +// +// It's use is recommended with command line arguments as in: +// flag.Parse() +// p.MustFlag(flag.CommandLine) +func (p *Properties) MustFlag(dst *flag.FlagSet) { + m := make(map[string]*flag.Flag) + dst.VisitAll(func(f *flag.Flag) { + m[f.Name] = f + }) + dst.Visit(func(f *flag.Flag) { + delete(m, f.Name) // overridden + }) + + for name, f := range m { + v, ok := p.Get(name) + if !ok { + continue + } + + if err := f.Value.Set(v); err != nil { + ErrorHandler(err) + } + } +} diff --git a/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/magiconair/properties/lex.go new file mode 100755 index 0000000..367166d --- /dev/null +++ b/vendor/github.com/magiconair/properties/lex.go @@ -0,0 +1,407 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// Parts of the lexer are from the template/text/parser package +// For these parts the following applies: +// +// 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 of the go 1.2 +// distribution. + +package properties + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos int // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemEOF + itemKey // a key + itemValue // a value + itemComment // a comment +) + +// defines a constant for EOF +const eof = -1 + +// permitted whitespace characters space, FF and TAB +const whitespace = " \f\t" + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + input string // the string being scanned + state stateFn // the next lexing function to enter + pos int // current position in the input + start int // start position of this item + width int // width of last rune read from input + lastPos int // position of most recent item returned by nextItem + runes []rune // scanned runes for this item + items chan item // channel of scanned items +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if l.pos >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = w + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + i := item{t, l.start, string(l.runes)} + l.items <- i + l.start = l.pos + l.runes = l.runes[:0] +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// appends the rune to the current value +func (l *lexer) appendRune(r rune) { + l.runes = append(l.runes, r) +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.ContainsRune(valid, l.next()) { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.ContainsRune(valid, l.next()) { + } + l.backup() +} + +// acceptRunUntil consumes a run of runes up to a terminator. +func (l *lexer) acceptRunUntil(term rune) { + for term != l.next() { + } + l.backup() +} + +// hasText returns true if the current parsed text is not empty. +func (l *lexer) isNotEmpty() bool { + return l.pos > l.start +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + i := <-l.items + l.lastPos = i.pos + return i +} + +// lex creates a new scanner for the input string. +func lex(input string) *lexer { + l := &lexer{ + input: input, + items: make(chan item), + runes: make([]rune, 0, 32), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexBeforeKey(l); l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +// lexBeforeKey scans until a key begins. +func lexBeforeKey(l *lexer) stateFn { + switch r := l.next(); { + case isEOF(r): + l.emit(itemEOF) + return nil + + case isEOL(r): + l.ignore() + return lexBeforeKey + + case isComment(r): + return lexComment + + case isWhitespace(r): + l.ignore() + return lexBeforeKey + + default: + l.backup() + return lexKey + } +} + +// lexComment scans a comment line. The comment character has already been scanned. +func lexComment(l *lexer) stateFn { + l.acceptRun(whitespace) + l.ignore() + for { + switch r := l.next(); { + case isEOF(r): + l.ignore() + l.emit(itemEOF) + return nil + case isEOL(r): + l.emit(itemComment) + return lexBeforeKey + default: + l.appendRune(r) + } + } +} + +// lexKey scans the key up to a delimiter +func lexKey(l *lexer) stateFn { + var r rune + +Loop: + for { + switch r = l.next(); { + + case isEscape(r): + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + + case isEndOfKey(r): + l.backup() + break Loop + + case isEOF(r): + break Loop + + default: + l.appendRune(r) + } + } + + if len(l.runes) > 0 { + l.emit(itemKey) + } + + if isEOF(r) { + l.emit(itemEOF) + return nil + } + + return lexBeforeValue +} + +// lexBeforeValue scans the delimiter between key and value. +// Leading and trailing whitespace is ignored. +// We expect to be just after the key. +func lexBeforeValue(l *lexer) stateFn { + l.acceptRun(whitespace) + l.accept(":=") + l.acceptRun(whitespace) + l.ignore() + return lexValue +} + +// lexValue scans text until the end of the line. We expect to be just after the delimiter. +func lexValue(l *lexer) stateFn { + for { + switch r := l.next(); { + case isEscape(r): + if isEOL(l.peek()) { + l.next() + l.acceptRun(whitespace) + } else { + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + } + + case isEOL(r): + l.emit(itemValue) + l.ignore() + return lexBeforeKey + + case isEOF(r): + l.emit(itemValue) + l.emit(itemEOF) + return nil + + default: + l.appendRune(r) + } + } +} + +// scanEscapeSequence scans either one of the escaped characters +// or a unicode literal. We expect to be after the escape character. +func (l *lexer) scanEscapeSequence() error { + switch r := l.next(); { + + case isEscapedCharacter(r): + l.appendRune(decodeEscapedCharacter(r)) + return nil + + case atUnicodeLiteral(r): + return l.scanUnicodeLiteral() + + case isEOF(r): + return fmt.Errorf("premature EOF") + + // silently drop the escape character and append the rune as is + default: + l.appendRune(r) + return nil + } +} + +// scans a unicode literal in the form \uXXXX. We expect to be after the \u. +func (l *lexer) scanUnicodeLiteral() error { + // scan the digits + d := make([]rune, 4) + for i := 0; i < 4; i++ { + d[i] = l.next() + if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) { + return fmt.Errorf("invalid unicode literal") + } + } + + // decode the digits into a rune + r, err := strconv.ParseInt(string(d), 16, 0) + if err != nil { + return err + } + + l.appendRune(rune(r)) + return nil +} + +// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character. +func decodeEscapedCharacter(r rune) rune { + switch r { + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + default: + return r + } +} + +// atUnicodeLiteral reports whether we are at a unicode literal. +// The escape character has already been consumed. +func atUnicodeLiteral(r rune) bool { + return r == 'u' +} + +// isComment reports whether we are at the start of a comment. +func isComment(r rune) bool { + return r == '#' || r == '!' +} + +// isEndOfKey reports whether the rune terminates the current key. +func isEndOfKey(r rune) bool { + return strings.ContainsRune(" \f\t\r\n:=", r) +} + +// isEOF reports whether we are at EOF. +func isEOF(r rune) bool { + return r == eof +} + +// isEOL reports whether we are at a new line character. +func isEOL(r rune) bool { + return r == '\n' || r == '\r' +} + +// isEscape reports whether the rune is the escape character which +// prefixes unicode literals and other escaped characters. +func isEscape(r rune) bool { + return r == '\\' +} + +// isEscapedCharacter reports whether we are at one of the characters that need escaping. +// The escape character has already been consumed. +func isEscapedCharacter(r rune) bool { + return strings.ContainsRune(" :=fnrt", r) +} + +// isWhitespace reports whether the rune is a whitespace character. +func isWhitespace(r rune) bool { + return strings.ContainsRune(whitespace, r) +} diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go new file mode 100755 index 0000000..c8e1b58 --- /dev/null +++ b/vendor/github.com/magiconair/properties/load.go @@ -0,0 +1,292 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// Encoding specifies encoding of the input data. +type Encoding uint + +const ( + // utf8Default is a private placeholder for the zero value of Encoding to + // ensure that it has the correct meaning. UTF8 is the default encoding but + // was assigned a non-zero value which cannot be changed without breaking + // existing code. Clients should continue to use the public constants. + utf8Default Encoding = iota + + // UTF8 interprets the input data as UTF-8. + UTF8 + + // ISO_8859_1 interprets the input data as ISO-8859-1. + ISO_8859_1 +) + +type Loader struct { + // Encoding determines how the data from files and byte buffers + // is interpreted. For URLs the Content-Type header is used + // to determine the encoding of the data. + Encoding Encoding + + // DisableExpansion configures the property expansion of the + // returned property object. When set to true, the property values + // will not be expanded and the Property object will not be checked + // for invalid expansion expressions. + DisableExpansion bool + + // IgnoreMissing configures whether missing files or URLs which return + // 404 are reported as errors. When set to true, missing files and 404 + // status codes are not reported as errors. + IgnoreMissing bool +} + +// Load reads a buffer into a Properties struct. +func (l *Loader) LoadBytes(buf []byte) (*Properties, error) { + return l.loadBytes(buf, l.Encoding) +} + +// LoadAll reads the content of multiple URLs or files in the given order into +// a Properties struct. If IgnoreMissing is true then a 404 status code or +// missing file will not be reported as error. Encoding sets the encoding for +// files. For the URLs see LoadURL for the Content-Type header and the +// encoding. +func (l *Loader) LoadAll(names []string) (*Properties, error) { + all := NewProperties() + for _, name := range names { + n, err := expandName(name) + if err != nil { + return nil, err + } + + var p *Properties + switch { + case strings.HasPrefix(n, "http://"): + p, err = l.LoadURL(n) + case strings.HasPrefix(n, "https://"): + p, err = l.LoadURL(n) + default: + p, err = l.LoadFile(n) + } + if err != nil { + return nil, err + } + all.Merge(p) + } + + all.DisableExpansion = l.DisableExpansion + if all.DisableExpansion { + return all, nil + } + return all, all.check() +} + +// LoadFile reads a file into a Properties struct. +// If IgnoreMissing is true then a missing file will not be +// reported as error. +func (l *Loader) LoadFile(filename string) (*Properties, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + if l.IgnoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + return NewProperties(), nil + } + return nil, err + } + return l.loadBytes(data, l.Encoding) +} + +// LoadURL reads the content of the URL into a Properties struct. +// +// The encoding is determined via the Content-Type header which +// should be set to 'text/plain'. If the 'charset' parameter is +// missing, 'iso-8859-1' or 'latin1' the encoding is set to +// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the +// encoding is set to UTF-8. A missing content type header is +// interpreted as 'text/plain; charset=utf-8'. +func (l *Loader) LoadURL(url string) (*Properties, error) { + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) + } + + if resp.StatusCode == 404 && l.IgnoreMissing { + LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) + return NewProperties(), nil + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode) + } + + body, err := ioutil.ReadAll(resp.Body) + 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 + switch strings.ToLower(ct) { + case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + enc = ISO_8859_1 + case "", "text/plain; charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + return l.loadBytes(body, enc) +} + +func (l *Loader) loadBytes(buf []byte, enc Encoding) (*Properties, error) { + p, err := parse(convert(buf, enc)) + if err != nil { + return nil, err + } + p.DisableExpansion = l.DisableExpansion + if p.DisableExpansion { + return p, nil + } + return p, p.check() +} + +// Load reads a buffer into a Properties struct. +func Load(buf []byte, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadBytes(buf) +} + +// LoadString reads an UTF8 string into a properties struct. +func LoadString(s string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadBytes([]byte(s)) +} + +// LoadMap creates a new Properties struct from a string map. +func LoadMap(m map[string]string) *Properties { + p := NewProperties() + for k, v := range m { + p.Set(k, v) + } + return p +} + +// LoadFile reads a file into a Properties struct. +func LoadFile(filename string, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadAll([]string{filename}) +} + +// LoadFiles reads multiple files in the given order into +// a Properties struct. If 'ignoreMissing' is true then +// non-existent files will not be reported as error. +func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(filenames) +} + +// LoadURL reads the content of the URL into a Properties struct. +// See Loader#LoadURL for details. +func LoadURL(url string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadAll([]string{url}) +} + +// LoadURLs reads the content of multiple URLs in the given order into a +// Properties struct. If IgnoreMissing is true then a 404 status code will +// not be reported as error. See Loader#LoadURL for the Content-Type header +// and the encoding. +func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: UTF8, IgnoreMissing: ignoreMissing} + return l.LoadAll(urls) +} + +// LoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. +func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(names) +} + +// MustLoadString reads an UTF8 string into a Properties struct and +// panics on error. +func MustLoadString(s string) *Properties { + return must(LoadString(s)) +} + +// MustLoadFile reads a file into a Properties struct and +// panics on error. +func MustLoadFile(filename string, enc Encoding) *Properties { + return must(LoadFile(filename, enc)) +} + +// MustLoadFiles reads multiple files in the given order into +// a Properties struct and panics on error. If 'ignoreMissing' +// is true then non-existent files will not be reported as error. +func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadFiles(filenames, enc, ignoreMissing)) +} + +// MustLoadURL reads the content of a URL into a Properties struct and +// panics on error. +func MustLoadURL(url string) *Properties { + return must(LoadURL(url)) +} + +// MustLoadURLs reads the content of multiple URLs in the given order into a +// Properties struct and panics on error. If 'ignoreMissing' is true then a 404 +// status code will not be reported as error. +func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { + return must(LoadURLs(urls, ignoreMissing)) +} + +// MustLoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. It panics on error. +func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadAll(names, enc, ignoreMissing)) +} + +func must(p *Properties, err error) *Properties { + if err != nil { + ErrorHandler(err) + } + return p +} + +// expandName expands ${ENV_VAR} expressions in a name. +// If the environment variable does not exist then it will be replaced +// with an empty string. Malformed expressions like "${ENV_VAR" will +// be reported as error. +func expandName(name string) (string, error) { + return expand(name, []string{}, "${", "}", make(map[string]string)) +} + +// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. +// For ISO-8859-1 we can convert each byte straight into a rune since the +// first 256 unicode code points cover ISO-8859-1. +func convert(buf []byte, enc Encoding) string { + switch enc { + case utf8Default, UTF8: + return string(buf) + case ISO_8859_1: + runes := make([]rune, len(buf)) + for i, b := range buf { + runes[i] = rune(b) + } + return string(runes) + default: + ErrorHandler(fmt.Errorf("unsupported encoding %v", enc)) + } + panic("ErrorHandler should exit") +} diff --git a/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/magiconair/properties/parser.go new file mode 100755 index 0000000..cdc4a80 --- /dev/null +++ b/vendor/github.com/magiconair/properties/parser.go @@ -0,0 +1,95 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "runtime" +) + +type parser struct { + lex *lexer +} + +func parse(input string) (properties *Properties, err error) { + p := &parser{lex: lex(input)} + defer p.recover(&err) + + properties = NewProperties() + key := "" + comments := []string{} + + for { + token := p.expectOneOf(itemComment, itemKey, itemEOF) + switch token.typ { + case itemEOF: + goto done + case itemComment: + comments = append(comments, token.val) + continue + case itemKey: + key = token.val + if _, ok := properties.m[key]; !ok { + properties.k = append(properties.k, key) + } + } + + token = p.expectOneOf(itemValue, itemEOF) + if len(comments) > 0 { + properties.c[key] = comments + comments = []string{} + } + switch token.typ { + case itemEOF: + properties.m[key] = "" + goto done + case itemValue: + properties.m[key] = token.val + } + } + +done: + return properties, nil +} + +func (p *parser) errorf(format string, args ...interface{}) { + format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +func (p *parser) expect(expected itemType) (token item) { + token = p.lex.nextItem() + if token.typ != expected { + p.unexpected(token) + } + return token +} + +func (p *parser) expectOneOf(expected ...itemType) (token item) { + token = p.lex.nextItem() + for _, v := range expected { + if token.typ == v { + return token + } + } + p.unexpected(token) + panic("unexpected token") +} + +func (p *parser) unexpected(token item) { + p.errorf(token.String()) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (p *parser) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + *errp = e.(error) + } + return +} diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go new file mode 100755 index 0000000..cb3d1a3 --- /dev/null +++ b/vendor/github.com/magiconair/properties/properties.go @@ -0,0 +1,833 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer. +// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. + +import ( + "fmt" + "io" + "log" + "os" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +const maxExpansionDepth = 64 + +// ErrorHandlerFunc defines the type of function which handles failures +// of the MustXXX() functions. An error handler function must exit +// the application after handling the error. +type ErrorHandlerFunc func(error) + +// ErrorHandler is the function which handles failures of the MustXXX() +// functions. The default is LogFatalHandler. +var ErrorHandler ErrorHandlerFunc = LogFatalHandler + +// LogHandlerFunc defines the function prototype for logging errors. +type LogHandlerFunc func(fmt string, args ...interface{}) + +// LogPrintf defines a log handler which uses log.Printf. +var LogPrintf LogHandlerFunc = log.Printf + +// LogFatalHandler handles the error by logging a fatal error and exiting. +func LogFatalHandler(err error) { + log.Fatal(err) +} + +// PanicHandler handles the error by panicking. +func PanicHandler(err error) { + panic(err) +} + +// ----------------------------------------------------------------------------- + +// A Properties contains the key/value pairs from the properties input. +// All values are stored in unexpanded form and are expanded at runtime +type Properties struct { + // Pre-/Postfix for property expansion. + Prefix string + Postfix string + + // DisableExpansion controls the expansion of properties on Get() + // and the check for circular references on Set(). When set to + // true Properties behaves like a simple key/value store and does + // not check for circular references on Get() or on Set(). + DisableExpansion bool + + // Stores the key/value pairs + m map[string]string + + // Stores the comments per key. + c map[string][]string + + // Stores the keys in order of appearance. + k []string +} + +// NewProperties creates a new Properties struct with the default +// configuration for "${key}" expressions. +func NewProperties() *Properties { + return &Properties{ + Prefix: "${", + Postfix: "}", + m: map[string]string{}, + c: map[string][]string{}, + k: []string{}, + } +} + +// Load reads a buffer into the given Properties struct. +func (p *Properties) Load(buf []byte, enc Encoding) error { + l := &Loader{Encoding: enc, DisableExpansion: p.DisableExpansion} + newProperties, err := l.LoadBytes(buf) + if err != nil { + return err + } + p.Merge(newProperties) + return nil +} + +// Get returns the expanded value for the given key if exists. +// Otherwise, ok is false. +func (p *Properties) Get(key string) (value string, ok bool) { + v, ok := p.m[key] + if p.DisableExpansion { + return v, ok + } + if !ok { + return "", false + } + + expanded, err := p.expand(key, v) + + // we guarantee that the expanded value is free of + // circular references and malformed expressions + // so we panic if we still get an error here. + if err != nil { + ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v)) + } + + return expanded, true +} + +// MustGet returns the expanded value for the given key if exists. +// Otherwise, it panics. +func (p *Properties) MustGet(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// ClearComments removes the comments for all keys. +func (p *Properties) ClearComments() { + p.c = map[string][]string{} +} + +// ---------------------------------------------------------------------------- + +// GetComment returns the last comment before the given key or an empty string. +func (p *Properties) GetComment(key string) string { + comments, ok := p.c[key] + if !ok || len(comments) == 0 { + return "" + } + return comments[len(comments)-1] +} + +// ---------------------------------------------------------------------------- + +// GetComments returns all comments that appeared before the given key or nil. +func (p *Properties) GetComments(key string) []string { + if comments, ok := p.c[key]; ok { + return comments + } + return nil +} + +// ---------------------------------------------------------------------------- + +// SetComment sets the comment for the key. +func (p *Properties) SetComment(key, comment string) { + p.c[key] = []string{comment} +} + +// ---------------------------------------------------------------------------- + +// SetComments sets the comments for the key. If the comments are nil then +// all comments for this key are deleted. +func (p *Properties) SetComments(key string, comments []string) { + if comments == nil { + delete(p.c, key) + return + } + p.c[key] = comments +} + +// ---------------------------------------------------------------------------- + +// GetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the default value is returned. +func (p *Properties) GetBool(key string, def bool) bool { + v, err := p.getBool(key) + if err != nil { + return def + } + return v +} + +// MustGetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the function panics. +func (p *Properties) MustGetBool(key string) bool { + v, err := p.getBool(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getBool(key string) (value bool, err error) { + if v, ok := p.Get(key); ok { + return boolVal(v), nil + } + return false, invalidKeyError(key) +} + +func boolVal(v string) bool { + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "yes" || v == "on" +} + +// ---------------------------------------------------------------------------- + +// GetDuration parses the expanded value as an time.Duration (in ns) if the +// key exists. If key does not exist or the value cannot be parsed the default +// value is returned. In almost all cases you want to use GetParsedDuration(). +func (p *Properties) GetDuration(key string, def time.Duration) time.Duration { + v, err := p.getInt64(key) + if err != nil { + return def + } + return time.Duration(v) +} + +// MustGetDuration parses the expanded value as an time.Duration (in ns) if +// the key exists. If key does not exist or the value cannot be parsed the +// function panics. In almost all cases you want to use MustGetParsedDuration(). +func (p *Properties) MustGetDuration(key string) time.Duration { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return time.Duration(v) +} + +// ---------------------------------------------------------------------------- + +// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration { + s, ok := p.Get(key) + if !ok { + return def + } + v, err := time.ParseDuration(s) + if err != nil { + return def + } + return v +} + +// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetParsedDuration(key string) time.Duration { + s, ok := p.Get(key) + if !ok { + ErrorHandler(invalidKeyError(key)) + } + v, err := time.ParseDuration(s) + if err != nil { + ErrorHandler(err) + } + return v +} + +// ---------------------------------------------------------------------------- + +// GetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetFloat64(key string, def float64) float64 { + v, err := p.getFloat64(key) + if err != nil { + return def + } + return v +} + +// MustGetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetFloat64(key string) float64 { + v, err := p.getFloat64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getFloat64(key string) (value float64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseFloat(v, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetInt(key string, def int) int { + v, err := p.getInt64(key) + if err != nil { + return def + } + return intRangeCheck(key, v) +} + +// MustGetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetInt(key string) int { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return intRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetInt64 parses the expanded value as an int64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetInt64(key string, def int64) int64 { + v, err := p.getInt64(key) + if err != nil { + return def + } + return v +} + +// MustGetInt64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetInt64(key string) int64 { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getInt64(key string) (value int64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetUint parses the expanded value as an uint if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetUint(key string, def uint) uint { + v, err := p.getUint64(key) + if err != nil { + return def + } + return uintRangeCheck(key, v) +} + +// MustGetUint parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetUint(key string) uint { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return uintRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetUint64 parses the expanded value as an uint64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetUint64(key string, def uint64) uint64 { + v, err := p.getUint64(key) + if err != nil { + return def + } + return v +} + +// MustGetUint64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetUint64(key string) uint64 { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getUint64(key string) (value uint64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetString returns the expanded value for the given key if exists or +// the default value otherwise. +func (p *Properties) GetString(key, def string) string { + if v, ok := p.Get(key); ok { + return v + } + return def +} + +// MustGetString returns the expanded value for the given key if exists or +// panics otherwise. +func (p *Properties) MustGetString(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// Filter returns a new properties object which contains all properties +// for which the key matches the pattern. +func (p *Properties) Filter(pattern string) (*Properties, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + return p.FilterRegexp(re), nil +} + +// FilterRegexp returns a new properties object which contains all properties +// for which the key matches the regular expression. +func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties { + pp := NewProperties() + for _, k := range p.k { + if re.MatchString(k) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterPrefix returns a new properties object with a subset of all keys +// with the given prefix. +func (p *Properties) FilterPrefix(prefix string) *Properties { + pp := NewProperties() + for _, k := range p.k { + if strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterStripPrefix returns a new properties object with a subset of all keys +// with the given prefix and the prefix removed from the keys. +func (p *Properties) FilterStripPrefix(prefix string) *Properties { + pp := NewProperties() + n := len(prefix) + for _, k := range p.k { + if len(k) > len(prefix) && strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference + // TODO(fs): this function should probably return an error but the signature is fixed + pp.Set(k[n:], p.m[k]) + } + } + return pp +} + +// Len returns the number of keys. +func (p *Properties) Len() int { + return len(p.m) +} + +// Keys returns all keys in the same order as in the input. +func (p *Properties) Keys() []string { + keys := make([]string, len(p.k)) + copy(keys, p.k) + return keys +} + +// Set sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. If the value contains a +// circular reference or a malformed expression then +// an error is returned. +// An empty key is silently ignored. +func (p *Properties) Set(key, value string) (prev string, ok bool, err error) { + if key == "" { + return "", false, nil + } + + // if expansion is disabled we allow circular references + if p.DisableExpansion { + prev, ok = p.Get(key) + p.m[key] = value + if !ok { + p.k = append(p.k, key) + } + return prev, ok, nil + } + + // to check for a circular reference we temporarily need + // to set the new value. If there is an error then revert + // to the previous state. Only if all tests are successful + // then we add the key to the p.k list. + prev, ok = p.Get(key) + p.m[key] = value + + // now check for a circular reference + _, err = p.expand(key, value) + if err != nil { + + // revert to the previous state + if ok { + p.m[key] = prev + } else { + delete(p.m, key) + } + + return "", false, err + } + + if !ok { + p.k = append(p.k, key) + } + + return prev, ok, nil +} + +// SetValue sets property key to the default string value +// as defined by fmt.Sprintf("%v"). +func (p *Properties) SetValue(key string, value interface{}) error { + _, _, err := p.Set(key, fmt.Sprintf("%v", value)) + return err +} + +// MustSet sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. An empty key is silently ignored. +func (p *Properties) MustSet(key, value string) (prev string, ok bool) { + prev, ok, err := p.Set(key, value) + if err != nil { + ErrorHandler(err) + } + return prev, ok +} + +// String returns a string of all expanded 'key = value' pairs. +func (p *Properties) String() string { + var s string + for _, key := range p.k { + value, _ := p.Get(key) + s = fmt.Sprintf("%s%s = %s\n", s, key, value) + } + return s +} + +// Write writes all unexpanded 'key = value' pairs to the given writer. +// Write returns the number of bytes written and any write error encountered. +func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { + return p.WriteComment(w, "", enc) +} + +// WriteComment writes all unexpanced 'key = value' pairs to the given writer. +// If prefix is not empty then comments are written with a blank line and the +// given prefix. The prefix should be either "# " or "! " to be compatible with +// the properties file format. Otherwise, the properties parser will not be +// able to read the file back in. It returns the number of bytes written and +// any write error encountered. +func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) { + var x int + + for _, key := range p.k { + value := p.m[key] + + if prefix != "" { + if comments, ok := p.c[key]; ok { + // don't print comments if they are all empty + allEmpty := true + for _, c := range comments { + if c != "" { + allEmpty = false + break + } + } + + if !allEmpty { + // add a blank line between entries but not at the top + if len(comments) > 0 && n > 0 { + x, err = fmt.Fprintln(w) + if err != nil { + return + } + n += x + } + + for _, c := range comments { + x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc)) + if err != nil { + return + } + n += x + } + } + } + } + + x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc)) + if err != nil { + return + } + n += x + } + return +} + +// Map returns a copy of the properties as a map. +func (p *Properties) Map() map[string]string { + m := make(map[string]string) + for k, v := range p.m { + m[k] = v + } + return m +} + +// FilterFunc returns a copy of the properties which includes the values which passed all filters. +func (p *Properties) FilterFunc(filters ...func(k, v string) bool) *Properties { + pp := NewProperties() +outer: + for k, v := range p.m { + for _, f := range filters { + if !f(k, v) { + continue outer + } + pp.Set(k, v) + } + } + return pp +} + +// ---------------------------------------------------------------------------- + +// Delete removes the key and its comments. +func (p *Properties) Delete(key string) { + delete(p.m, key) + delete(p.c, key) + newKeys := []string{} + for _, k := range p.k { + if k != key { + newKeys = append(newKeys, k) + } + } + p.k = newKeys +} + +// Merge merges properties, comments and keys from other *Properties into p +func (p *Properties) Merge(other *Properties) { + for k, v := range other.m { + p.m[k] = v + } + for k, v := range other.c { + p.c[k] = v + } + +outer: + for _, otherKey := range other.k { + for _, key := range p.k { + if otherKey == key { + continue outer + } + } + p.k = append(p.k, otherKey) + } +} + +// ---------------------------------------------------------------------------- + +// check expands all values and returns an error if a circular reference or +// a malformed expression was found. +func (p *Properties) check() error { + for key, value := range p.m { + if _, err := p.expand(key, value); err != nil { + return err + } + } + return nil +} + +func (p *Properties) expand(key, input string) (string, error) { + // no pre/postfix -> nothing to expand + if p.Prefix == "" && p.Postfix == "" { + return input, nil + } + + return expand(input, []string{key}, p.Prefix, p.Postfix, p.m) +} + +// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values. +// The function keeps track of the keys that were already expanded and stops if it +// detects a circular reference or a malformed expression of the form '(prefix)key'. +func expand(s string, keys []string, prefix, postfix string, values map[string]string) (string, error) { + if len(keys) > maxExpansionDepth { + return "", fmt.Errorf("expansion too deep") + } + + for { + start := strings.Index(s, prefix) + if start == -1 { + return s, nil + } + + keyStart := start + len(prefix) + keyLen := strings.Index(s[keyStart:], postfix) + if keyLen == -1 { + return "", fmt.Errorf("malformed expression") + } + + end := keyStart + keyLen + len(postfix) - 1 + key := s[keyStart : keyStart+keyLen] + + // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key) + + for _, k := range keys { + if key == k { + return "", fmt.Errorf("circular reference") + } + } + + val, ok := values[key] + if !ok { + val = os.Getenv(key) + } + new_val, err := expand(val, append(keys, key), prefix, postfix, values) + if err != nil { + return "", err + } + s = s[:start] + new_val + s[end+1:] + } + return s, nil +} + +// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters. +func encode(s string, special string, enc Encoding) string { + switch enc { + case UTF8: + return encodeUtf8(s, special) + case ISO_8859_1: + return encodeIso(s, special) + default: + panic(fmt.Sprintf("unsupported encoding %v", enc)) + } +} + +func encodeUtf8(s string, special string) string { + v := "" + for pos := 0; pos < len(s); { + r, w := utf8.DecodeRuneInString(s[pos:]) + pos += w + v += escape(r, special) + } + return v +} + +func encodeIso(s string, special string) string { + var r rune + var w int + var v string + for pos := 0; pos < len(s); { + switch r, w = utf8.DecodeRuneInString(s[pos:]); { + case r < 1<<8: // single byte rune -> escape special chars only + v += escape(r, special) + case r < 1<<16: // two byte rune -> unicode literal + v += fmt.Sprintf("\\u%04x", r) + default: // more than two bytes per rune -> can't encode + v += "?" + } + pos += w + } + return v +} + +func escape(r rune, special string) string { + switch r { + case '\f': + return "\\f" + case '\n': + return "\\n" + case '\r': + return "\\r" + case '\t': + return "\\t" + default: + if strings.ContainsRune(special, r) { + return "\\" + string(r) + } + return string(r) + } +} + +func invalidKeyError(key string) error { + return fmt.Errorf("unknown property: %s", key) +} diff --git a/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/magiconair/properties/rangecheck.go new file mode 100755 index 0000000..b013a2e --- /dev/null +++ b/vendor/github.com/magiconair/properties/rangecheck.go @@ -0,0 +1,31 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "math" +) + +// make this a var to overwrite it in a test +var is32Bit = ^uint(0) == math.MaxUint32 + +// intRangeCheck checks if the value fits into the int type and +// panics if it does not. +func intRangeCheck(key string, v int64) int { + if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return int(v) +} + +// uintRangeCheck checks if the value fits into the uint type and +// panics if it does not. +func uintRangeCheck(key string, v uint64) uint { + if is32Bit && v > math.MaxUint32 { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return uint(v) +} diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml new file mode 100755 index 0000000..d9deadb --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -0,0 +1,8 @@ +language: go + +go: + - 1.9.x + - tip + +script: + - go test diff --git a/vendor/github.com/mitchellh/mapstructure/LICENSE b/vendor/github.com/mitchellh/mapstructure/LICENSE new file mode 100755 index 0000000..f9c841a --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/mitchellh/mapstructure/README.md new file mode 100755 index 0000000..0018dc7 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/README.md @@ -0,0 +1,46 @@ +# mapstructure [![Godoc](https://godoc.org/github.com/mitchellh/mapstructure?status.svg)](https://godoc.org/github.com/mitchellh/mapstructure) + +mapstructure is a Go library for decoding generic map values to structures +and vice versa, while providing helpful error handling. + +This library is most useful when decoding values from some data stream (JSON, +Gob, etc.) where you don't _quite_ know the structure of the underlying data +until you read a part of it. You can therefore read a `map[string]interface{}` +and use this library to decode it into the proper underlying native Go +structure. + +## Installation + +Standard `go get`: + +``` +$ go get github.com/mitchellh/mapstructure +``` + +## Usage & Example + +For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure). + +The `Decode` function has examples associated with it there. + +## But Why?! + +Go offers fantastic standard libraries for decoding formats such as JSON. +The standard method is to have a struct pre-created, and populate that struct +from the bytes of the encoded format. This is great, but the problem is if +you have configuration or an encoding that changes slightly depending on +specific fields. For example, consider this JSON: + +```json +{ + "type": "person", + "name": "Mitchell" +} +``` + +Perhaps we can't populate a specific structure without first reading +the "type" field from the JSON. We could always do two passes over the +decoding of the JSON (reading the "type" first, and the rest later). +However, it is much simpler to just decode this into a `map[string]interface{}` +structure, read the "type" key, then use something like this library +to decode it into the proper structure. diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go new file mode 100755 index 0000000..2a72757 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -0,0 +1,171 @@ +package mapstructure + +import ( + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +// typedDecodeHook takes a raw DecodeHookFunc (an interface{}) and turns +// it into the proper DecodeHookFunc type, such as DecodeHookFuncType. +func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { + // Create variables here so we can reference them with the reflect pkg + var f1 DecodeHookFuncType + var f2 DecodeHookFuncKind + + // Fill in the variables into this interface and the rest is done + // automatically using the reflect package. + potential := []interface{}{f1, f2} + + v := reflect.ValueOf(h) + vt := v.Type() + for _, raw := range potential { + pt := reflect.ValueOf(raw).Type() + if vt.ConvertibleTo(pt) { + return v.Convert(pt).Interface() + } + } + + return nil +} + +// DecodeHookExec executes the given decode hook. This should be used +// since it'll naturally degrade to the older backwards compatible DecodeHookFunc +// that took reflect.Kind instead of reflect.Type. +func DecodeHookExec( + raw DecodeHookFunc, + from reflect.Type, to reflect.Type, + data interface{}) (interface{}, error) { + switch f := typedDecodeHook(raw).(type) { + case DecodeHookFuncType: + return f(from, to, data) + case DecodeHookFuncKind: + return f(from.Kind(), to.Kind(), data) + default: + return nil, errors.New("invalid decode hook signature") + } +} + +// ComposeDecodeHookFunc creates a single DecodeHookFunc that +// automatically composes multiple DecodeHookFuncs. +// +// The composed funcs are called in order, with the result of the +// previous transformation. +func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + var err error + for _, f1 := range fs { + data, err = DecodeHookExec(f1, f, t, data) + if err != nil { + return nil, err + } + + // Modify the from kind to be correct with the new data + f = nil + if val := reflect.ValueOf(data); val.IsValid() { + f = val.Type() + } + } + + return data, nil + } +} + +// StringToSliceHookFunc returns a DecodeHookFunc that converts +// string to []string by splitting on the given sep. +func StringToSliceHookFunc(sep string) DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + if f != reflect.String || t != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + +// StringToTimeDurationHookFunc returns a DecodeHookFunc that converts +// strings to time.Duration. +func StringToTimeDurationHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Duration(5)) { + return data, nil + } + + // Convert it by parsing + return time.ParseDuration(data.(string)) + } +} + +// StringToTimeHookFunc returns a DecodeHookFunc that converts +// strings to time.Time. +func StringToTimeHookFunc(layout string) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Time{}) { + return data, nil + } + + // Convert it by parsing + return time.Parse(layout, data.(string)) + } +} + +// WeaklyTypedHook is a DecodeHookFunc which adds support for weak typing to +// the decoder. +// +// Note that this is significantly different from the WeaklyTypedInput option +// of the DecoderConfig. +func WeaklyTypedHook( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + dataVal := reflect.ValueOf(data) + switch t { + case reflect.String: + switch f { + case reflect.Bool: + if dataVal.Bool() { + return "1", nil + } + return "0", nil + case reflect.Float32: + return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil + case reflect.Int: + return strconv.FormatInt(dataVal.Int(), 10), nil + case reflect.Slice: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + if elemKind == reflect.Uint8 { + return string(dataVal.Interface().([]uint8)), nil + } + case reflect.Uint: + return strconv.FormatUint(dataVal.Uint(), 10), nil + } + } + + return data, nil +} diff --git a/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/mitchellh/mapstructure/error.go new file mode 100755 index 0000000..47a99e5 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/error.go @@ -0,0 +1,50 @@ +package mapstructure + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Error implements the error interface and can represents multiple +// errors that occur in the course of a single decode. +type Error struct { + Errors []string +} + +func (e *Error) Error() string { + points := make([]string, len(e.Errors)) + for i, err := range e.Errors { + points[i] = fmt.Sprintf("* %s", err) + } + + sort.Strings(points) + return fmt.Sprintf( + "%d error(s) decoding:\n\n%s", + len(e.Errors), strings.Join(points, "\n")) +} + +// WrappedErrors implements the errwrap.Wrapper interface to make this +// return value more useful with the errwrap and go-multierror libraries. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + + result := make([]error, len(e.Errors)) + for i, e := range e.Errors { + result[i] = errors.New(e) + } + + return result +} + +func appendErrors(errors []string, err error) []string { + switch e := err.(type) { + case *Error: + return append(errors, e.Errors...) + default: + return append(errors, e.Error()) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go new file mode 100755 index 0000000..13cc5e3 --- /dev/null +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -0,0 +1,1061 @@ +// Package mapstructure exposes functionality to convert an arbitrary +// map[string]interface{} into a native Go structure. +// +// The Go structure can be arbitrarily complex, containing slices, +// other structs, etc. and the decoder will properly decode nested +// maps and so on into the proper structures in the native Go struct. +// See the examples to see what the decoder is capable of. +package mapstructure + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" +) + +// DecodeHookFunc is the callback function that can be used for +// data transformations. See "DecodeHook" in the DecoderConfig +// struct. +// +// The type should be DecodeHookFuncType or DecodeHookFuncKind. +// Either is accepted. Types are a superset of Kinds (Types can return +// Kinds) and are generally a richer thing to use, but Kinds are simpler +// if you only need those. +// +// The reason DecodeHookFunc is multi-typed is for backwards compatibility: +// we started with Kinds and then realized Types were the better solution, +// but have a promise to not break backwards compat so we now support +// both. +type DecodeHookFunc interface{} + +// DecodeHookFuncType is a DecodeHookFunc which has complete information about +// the source and target types. +type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error) + +// DecodeHookFuncKind is a DecodeHookFunc which knows only the Kinds of the +// source and target types. +type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) + +// DecoderConfig is the configuration that is used to create a new decoder +// and allows customization of various aspects of decoding. +type DecoderConfig struct { + // DecodeHook, if set, will be called before any decoding and any + // type conversion (if WeaklyTypedInput is on). This lets you modify + // the values before they're set down onto the resulting struct. + // + // If an error is returned, the entire decode will fail with that + // error. + DecodeHook DecodeHookFunc + + // If ErrorUnused is true, then it is an error for there to exist + // keys in the original map that were unused in the decoding process + // (extra keys). + ErrorUnused bool + + // ZeroFields, if set to true, will zero fields before writing them. + // For example, a map will be emptied before decoded values are put in + // it. If this is false, a map will be merged. + ZeroFields bool + + // If WeaklyTypedInput is true, the decoder will make the following + // "weak" conversions: + // + // - bools to string (true = "1", false = "0") + // - numbers to string (base 10) + // - bools to int/uint (true = 1, false = 0) + // - strings to int/uint (base implied by prefix) + // - int to bool (true if value != 0) + // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, + // FALSE, false, False. Anything else is an error) + // - empty array = empty map and vice versa + // - negative numbers to overflowed uint values (base 10) + // - slice of maps to a merged map + // - single values are converted to slices if required. Each + // element is weakly decoded. For example: "4" can become []int{4} + // if the target type is an int slice. + // + WeaklyTypedInput bool + + // Metadata is the struct that will contain extra metadata about + // the decoding. If this is nil, then no metadata will be tracked. + Metadata *Metadata + + // Result is a pointer to the struct that will contain the decoded + // value. + Result interface{} + + // The tag name that mapstructure reads for field names. This + // defaults to "mapstructure" + TagName string +} + +// A Decoder takes a raw interface value and turns it into structured +// data, keeping track of rich error information along the way in case +// anything goes wrong. Unlike the basic top-level Decode method, you can +// more finely control how the Decoder behaves using the DecoderConfig +// structure. The top-level Decode method is just a convenience that sets +// up the most basic Decoder. +type Decoder struct { + config *DecoderConfig +} + +// Metadata contains information about decoding a structure that +// is tedious or difficult to get otherwise. +type Metadata struct { + // Keys are the keys of the structure which were successfully decoded + Keys []string + + // Unused is a slice of keys that were found in the raw value but + // weren't decoded since there was no matching field in the result interface + Unused []string +} + +// Decode takes an input structure and uses reflection to translate it to +// the output structure. output must be a pointer to a map or struct. +func Decode(input interface{}, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecode is the same as Decode but is shorthand to enable +// WeaklyTypedInput. See DecoderConfig for more info. +func WeakDecode(input, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// DecodeMetadata is the same as Decode, but is shorthand to +// enable metadata collection. See DecoderConfig for more info. +func DecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecodeMetadata is the same as Decode, but is shorthand to +// enable both WeaklyTypedInput and metadata collection. See +// DecoderConfig for more info. +func WeakDecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// NewDecoder returns a new decoder for the given configuration. Once +// a decoder has been returned, the same configuration must not be used +// again. +func NewDecoder(config *DecoderConfig) (*Decoder, error) { + val := reflect.ValueOf(config.Result) + if val.Kind() != reflect.Ptr { + return nil, errors.New("result must be a pointer") + } + + val = val.Elem() + if !val.CanAddr() { + return nil, errors.New("result must be addressable (a pointer)") + } + + if config.Metadata != nil { + if config.Metadata.Keys == nil { + config.Metadata.Keys = make([]string, 0) + } + + if config.Metadata.Unused == nil { + config.Metadata.Unused = make([]string, 0) + } + } + + if config.TagName == "" { + config.TagName = "mapstructure" + } + + result := &Decoder{ + config: config, + } + + return result, nil +} + +// Decode decodes the given raw interface to the target pointer specified +// by the configuration. +func (d *Decoder) Decode(input interface{}) error { + return d.decode("", input, reflect.ValueOf(d.config.Result).Elem()) +} + +// Decodes an unknown data type into a specific reflection value. +func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error { + if input == nil { + // If the data is nil, then we don't set anything, unless ZeroFields is set + // to true. + if d.config.ZeroFields { + outVal.Set(reflect.Zero(outVal.Type())) + + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + } + return nil + } + + inputVal := reflect.ValueOf(input) + if !inputVal.IsValid() { + // If the input value is invalid, then we just set the value + // to be the zero value. + outVal.Set(reflect.Zero(outVal.Type())) + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + return nil + } + + if d.config.DecodeHook != nil { + // We have a DecodeHook, so let's pre-process the input. + var err error + input, err = DecodeHookExec( + d.config.DecodeHook, + inputVal.Type(), outVal.Type(), input) + if err != nil { + return fmt.Errorf("error decoding '%s': %s", name, err) + } + } + + var err error + inputKind := getKind(outVal) + switch inputKind { + case reflect.Bool: + err = d.decodeBool(name, input, outVal) + case reflect.Interface: + err = d.decodeBasic(name, input, outVal) + case reflect.String: + err = d.decodeString(name, input, outVal) + case reflect.Int: + err = d.decodeInt(name, input, outVal) + case reflect.Uint: + err = d.decodeUint(name, input, outVal) + case reflect.Float32: + err = d.decodeFloat(name, input, outVal) + case reflect.Struct: + err = d.decodeStruct(name, input, outVal) + case reflect.Map: + err = d.decodeMap(name, input, outVal) + case reflect.Ptr: + err = d.decodePtr(name, input, outVal) + case reflect.Slice: + err = d.decodeSlice(name, input, outVal) + case reflect.Array: + err = d.decodeArray(name, input, outVal) + case reflect.Func: + err = d.decodeFunc(name, input, outVal) + default: + // If we reached this point then we weren't able to decode it + return fmt.Errorf("%s: unsupported type: %s", name, inputKind) + } + + // If we reached here, then we successfully decoded SOMETHING, so + // mark the key as used if we're tracking metainput. + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + + return err +} + +// This decodes a basic type (bool, int, string, etc.) and sets the +// value to "data" of that type. +func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { + if val.IsValid() && val.Elem().IsValid() { + return d.decode(name, data, val.Elem()) + } + dataVal := reflect.ValueOf(data) + if !dataVal.IsValid() { + dataVal = reflect.Zero(val.Type()) + } + + dataValType := dataVal.Type() + if !dataValType.AssignableTo(val.Type()) { + return fmt.Errorf( + "'%s' expected type '%s', got '%s'", + name, val.Type(), dataValType) + } + + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + converted := true + switch { + case dataKind == reflect.String: + val.SetString(dataVal.String()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetString("1") + } else { + val.SetString("0") + } + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatInt(dataVal.Int(), 10)) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) + case dataKind == reflect.Slice && d.config.WeaklyTypedInput, + dataKind == reflect.Array && d.config.WeaklyTypedInput: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + switch elemKind { + case reflect.Uint8: + var uints []uint8 + if dataKind == reflect.Array { + uints = make([]uint8, dataVal.Len(), dataVal.Len()) + for i := range uints { + uints[i] = dataVal.Index(i).Interface().(uint8) + } + } else { + uints = dataVal.Interface().([]uint8) + } + val.SetString(string(uints)) + default: + converted = false + } + default: + converted = false + } + + if !converted { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetInt(dataVal.Int()) + case dataKind == reflect.Uint: + val.SetInt(int64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetInt(int64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetInt(1) + } else { + val.SetInt(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetInt(i) + } else { + return fmt.Errorf("cannot parse '%s' as int: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetInt(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + i := dataVal.Int() + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) + case dataKind == reflect.Uint: + val.SetUint(dataVal.Uint()) + case dataKind == reflect.Float32: + f := dataVal.Float() + if f < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %f overflows uint", + name, f) + } + val.SetUint(uint64(f)) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetUint(1) + } else { + val.SetUint(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetUint(i) + } else { + return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Bool: + val.SetBool(dataVal.Bool()) + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Int() != 0) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Uint() != 0) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Float() != 0) + case dataKind == reflect.String && d.config.WeaklyTypedInput: + b, err := strconv.ParseBool(dataVal.String()) + if err == nil { + val.SetBool(b) + } else if dataVal.String() == "" { + val.SetBool(false) + } else { + return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetFloat(float64(dataVal.Int())) + case dataKind == reflect.Uint: + val.SetFloat(float64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetFloat(dataVal.Float()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetFloat(1) + } else { + val.SetFloat(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + if err == nil { + val.SetFloat(f) + } else { + return fmt.Errorf("cannot parse '%s' as float: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Float64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetFloat(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // By default we overwrite keys in the current map + valMap := val + + // If the map is nil or we're purposely zeroing fields, make a new map + if valMap.IsNil() || d.config.ZeroFields { + // Make a new map to hold our result + mapType := reflect.MapOf(valKeyType, valElemType) + valMap = reflect.MakeMap(mapType) + } + + // Check input type and based on the input type jump to the proper func + dataVal := reflect.Indirect(reflect.ValueOf(data)) + switch dataVal.Kind() { + case reflect.Map: + return d.decodeMapFromMap(name, dataVal, val, valMap) + + case reflect.Struct: + return d.decodeMapFromStruct(name, dataVal, val, valMap) + + case reflect.Array, reflect.Slice: + if d.config.WeaklyTypedInput { + return d.decodeMapFromSlice(name, dataVal, val, valMap) + } + + fallthrough + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + // Special case for BC reasons (covered by tests) + if dataVal.Len() == 0 { + val.Set(valMap) + return nil + } + + for i := 0; i < dataVal.Len(); i++ { + err := d.decode( + fmt.Sprintf("%s[%d]", name, i), + dataVal.Index(i).Interface(), val) + if err != nil { + return err + } + } + + return nil +} + +func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // Accumulate errors + errors := make([]string, 0) + + for _, k := range dataVal.MapKeys() { + fieldName := fmt.Sprintf("%s[%s]", name, k) + + // First decode the key into the proper type + currentKey := reflect.Indirect(reflect.New(valKeyType)) + if err := d.decode(fieldName, k.Interface(), currentKey); err != nil { + errors = appendErrors(errors, err) + continue + } + + // Next decode the data into the proper type + v := dataVal.MapIndex(k).Interface() + currentVal := reflect.Indirect(reflect.New(valElemType)) + if err := d.decode(fieldName, v, currentVal); err != nil { + errors = appendErrors(errors, err) + continue + } + + valMap.SetMapIndex(currentKey, currentVal) + } + + // Set the built up map to the value + val.Set(valMap) + + // If we had errors, return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + typ := dataVal.Type() + for i := 0; i < typ.NumField(); i++ { + // Get the StructField first since this is a cheap operation. If the + // field is unexported, then ignore it. + f := typ.Field(i) + if f.PkgPath != "" { + continue + } + + // Next get the actual value of this field and verify it is assignable + // to the map value. + v := dataVal.Field(i) + if !v.Type().AssignableTo(valMap.Type().Elem()) { + return fmt.Errorf("cannot assign type '%s' to map value field of type '%s'", v.Type(), valMap.Type().Elem()) + } + + tagValue := f.Tag.Get(d.config.TagName) + tagParts := strings.Split(tagValue, ",") + + // Determine the name of the key in the map + keyName := f.Name + if tagParts[0] != "" { + if tagParts[0] == "-" { + continue + } + keyName = tagParts[0] + } + + // If "squash" is specified in the tag, we squash the field down. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } + + switch v.Kind() { + // this is an embedded struct, so handle it differently + case reflect.Struct: + x := reflect.New(v.Type()) + x.Elem().Set(v) + + vType := valMap.Type() + vKeyType := vType.Key() + vElemType := vType.Elem() + mType := reflect.MapOf(vKeyType, vElemType) + vMap := reflect.MakeMap(mType) + + err := d.decode(keyName, x.Interface(), vMap) + if err != nil { + return err + } + + if squash { + for _, k := range vMap.MapKeys() { + valMap.SetMapIndex(k, vMap.MapIndex(k)) + } + } else { + valMap.SetMapIndex(reflect.ValueOf(keyName), vMap) + } + + default: + valMap.SetMapIndex(reflect.ValueOf(keyName), v) + } + } + + if val.CanAddr() { + val.Set(valMap) + } + + return nil +} + +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + + if val.CanSet() { + realVal := val + if realVal.IsNil() || d.config.ZeroFields { + realVal = reflect.New(valElemType) + } + + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return err + } + + val.Set(realVal) + } else { + if err := d.decode(name, data, reflect.Indirect(val)); err != nil { + return err + } + } + return nil +} + +func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + dataVal := reflect.Indirect(reflect.ValueOf(data)) + if val.Type() != dataVal.Type() { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + sliceType := reflect.SliceOf(valElemType) + + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty slices + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.MakeSlice(sliceType, 0, 0)) + return nil + } + case dataValKind == reflect.String && valElemType.Kind() == reflect.Uint8: + return d.decodeSlice(name, []byte(dataVal.String()), val) + // All other types we try to convert to the slice type + // and "lift" it into it. i.e. a string becomes a string slice. + default: + // Just re-try this function with data as a slice. + return d.decodeSlice(name, []interface{}{data}, val) + } + } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + + // Make a new slice to hold our result, same size as the original data. + valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + for valSlice.Len() <= i { + valSlice = reflect.Append(valSlice, reflect.Zero(valElemType)) + } + currentField := valSlice.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the slice we built up + val.Set(valSlice) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + arrayType := reflect.ArrayOf(valType.Len(), valElemType) + + valArray := val + + if valArray.Interface() == reflect.Zero(valArray.Type()).Interface() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty arrays + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.Zero(arrayType)) + return nil + } + + // All other types we try to convert to the array type + // and "lift" it into it. i.e. a string becomes a string array. + default: + // Just re-try this function with data as a slice. + return d.decodeArray(name, []interface{}{data}, val) + } + } + + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + if dataVal.Len() > arrayType.Len() { + return fmt.Errorf( + "'%s': expected source data to have length less or equal to %d, got %d", name, arrayType.Len(), dataVal.Len()) + + } + + // Make a new array to hold our result, same size as the original data. + valArray = reflect.New(arrayType).Elem() + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + currentField := valArray.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the array we built up + val.Set(valArray) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + + // If the type of the value to write to and the data match directly, + // then we just set it directly instead of recursing into the structure. + if dataVal.Type() == val.Type() { + val.Set(dataVal) + return nil + } + + dataValKind := dataVal.Kind() + if dataValKind != reflect.Map { + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataValKind) + } + + dataValType := dataVal.Type() + if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface { + return fmt.Errorf( + "'%s' needs a map with string keys, has '%s' keys", + name, dataValType.Key().Kind()) + } + + dataValKeys := make(map[reflect.Value]struct{}) + dataValKeysUnused := make(map[interface{}]struct{}) + for _, dataValKey := range dataVal.MapKeys() { + dataValKeys[dataValKey] = struct{}{} + dataValKeysUnused[dataValKey.Interface()] = struct{}{} + } + + errors := make([]string, 0) + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = val + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + fieldKind := fieldType.Type.Kind() + + // If "squash" is specified in the tag, we squash the field down. + squash := false + tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + if fieldKind != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + } else { + structs = append(structs, structVal.FieldByName(fieldType.Name)) + } + continue + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + // for fieldType, field := range fields { + for _, f := range fields { + field, fieldValue := f.field, f.val + fieldName := field.Name + + tagValue := field.Tag.Get(d.config.TagName) + tagValue = strings.SplitN(tagValue, ",", 2)[0] + if tagValue != "" { + fieldName = tagValue + } + + rawMapKey := reflect.ValueOf(fieldName) + rawMapVal := dataVal.MapIndex(rawMapKey) + if !rawMapVal.IsValid() { + // Do a slower search by iterating over each key and + // doing case-insensitive search. + for dataValKey := range dataValKeys { + mK, ok := dataValKey.Interface().(string) + if !ok { + // Not a string key + continue + } + + if strings.EqualFold(mK, fieldName) { + rawMapKey = dataValKey + rawMapVal = dataVal.MapIndex(dataValKey) + break + } + } + + if !rawMapVal.IsValid() { + // There was no matching key in the map for the value in + // the struct. Just ignore. + continue + } + } + + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + // If the name is empty string, then we're at the root, and we + // don't dot-join the fields. + if name != "" { + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + } + + if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { + errors = appendErrors(errors, err) + } + } + + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { + keys := make([]string, 0, len(dataValKeysUnused)) + for rawKey := range dataValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if len(errors) > 0 { + return &Error{errors} + } + + // Add the unused keys to the list of unused keys if we're tracking metadata + if d.config.Metadata != nil { + for rawKey := range dataValKeysUnused { + key := rawKey.(string) + if name != "" { + key = fmt.Sprintf("%s.%s", name, key) + } + + d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) + } + } + + return nil +} + +func getKind(val reflect.Value) reflect.Kind { + kind := val.Kind() + + switch { + case kind >= reflect.Int && kind <= reflect.Int64: + return reflect.Int + case kind >= reflect.Uint && kind <= reflect.Uint64: + return reflect.Uint + case kind >= reflect.Float32 && kind <= reflect.Float64: + return reflect.Float32 + default: + return kind + } +} diff --git a/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/pelletier/go-toml/.gitignore new file mode 100755 index 0000000..99e38bb --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.gitignore @@ -0,0 +1,2 @@ +test_program/test_program_bin +fuzz/ diff --git a/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/pelletier/go-toml/.travis.yml new file mode 100755 index 0000000..ab2775d --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/.travis.yml @@ -0,0 +1,22 @@ +sudo: false +language: go +go: + - 1.8.5 + - 1.9.2 + - tip +matrix: + allow_failures: + - go: tip + fast_finish: true +script: + - if [ -n "$(go fmt ./...)" ]; then exit 1; fi + - ./test.sh + - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git +before_install: + - go get github.com/axw/gocov/gocov + - go get github.com/mattn/goveralls + - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi +branches: + only: [master] +after_success: + - $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/pelletier/go-toml/LICENSE b/vendor/github.com/pelletier/go-toml/LICENSE new file mode 100755 index 0000000..583bdae --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +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/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md new file mode 100755 index 0000000..0d357ac --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -0,0 +1,131 @@ +# go-toml + +Go library for the [TOML](https://github.com/mojombo/toml) format. + +This library supports TOML version +[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) + +[![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) +[![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) +[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) +[![Coverage Status](https://coveralls.io/repos/github/pelletier/go-toml/badge.svg?branch=master)](https://coveralls.io/github/pelletier/go-toml?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) + +## Features + +Go-toml provides the following features for using data parsed from TOML documents: + +* Load TOML documents from files and string data +* Easily navigate TOML structure using Tree +* Mashaling and unmarshaling to and from data structures +* Line & column position data for all parsed elements +* [Query support similar to JSON-Path](query/) +* Syntax errors contain line and column numbers + +## Import + +```go +import "github.com/pelletier/go-toml" +``` + +## Usage example + +Read a TOML document: + +```go +config, _ := toml.Load(` +[postgres] +user = "pelletier" +password = "mypassword"`) +// retrieve data directly +user := config.Get("postgres.user").(string) + +// or using an intermediate object +postgresConfig := config.Get("postgres").(*toml.Tree) +password := postgresConfig.Get("password").(string) +``` + +Or use Unmarshal: + +```go +type Postgres struct { + User string + Password string +} +type Config struct { + Postgres Postgres +} + +doc := []byte(` +[Postgres] +User = "pelletier" +Password = "mypassword"`) + +config := Config{} +toml.Unmarshal(doc, &config) +fmt.Println("user=", config.Postgres.User) +``` + +Or use a query: + +```go +// use a query to gather elements without walking the tree +q, _ := query.Compile("$..[user,password]") +results := q.Execute(config) +for ii, item := range results.Values() { + fmt.Println("Query result %d: %v", ii, item) +} +``` + +## Documentation + +The documentation and additional examples are available at +[godoc.org](http://godoc.org/github.com/pelletier/go-toml). + +## Tools + +Go-toml provides two handy command line tools: + +* `tomll`: Reads TOML files and lint them. + + ``` + go install github.com/pelletier/go-toml/cmd/tomll + tomll --help + ``` +* `tomljson`: Reads a TOML file and outputs its JSON representation. + + ``` + go install github.com/pelletier/go-toml/cmd/tomljson + tomljson --help + ``` + +## Contribute + +Feel free to report bugs and patches using GitHub's pull requests system on +[pelletier/go-toml](https://github.com/pelletier/go-toml). Any feedback would be +much appreciated! + +### Run tests + +You have to make sure two kind of tests run: + +1. The Go unit tests +2. The TOML examples base + +You can run both of them using `./test.sh`. + +### Fuzzing + +The script `./fuzz.sh` is available to +run [go-fuzz](https://github.com/dvyukov/go-fuzz) on go-toml. + +## Versioning + +Go-toml follows [Semantic Versioning](http://semver.org/). The supported version +of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of +this document. The last two major versions of Go are supported +(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)). + +## License + +The MIT License (MIT). Read [LICENSE](LICENSE). diff --git a/vendor/github.com/pelletier/go-toml/benchmark.json b/vendor/github.com/pelletier/go-toml/benchmark.json new file mode 100755 index 0000000..86f99c6 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/benchmark.json @@ -0,0 +1,164 @@ +{ + "array": { + "key1": [ + 1, + 2, + 3 + ], + "key2": [ + "red", + "yellow", + "green" + ], + "key3": [ + [ + 1, + 2 + ], + [ + 3, + 4, + 5 + ] + ], + "key4": [ + [ + 1, + 2 + ], + [ + "a", + "b", + "c" + ] + ], + "key5": [ + 1, + 2, + 3 + ], + "key6": [ + 1, + 2 + ] + }, + "boolean": { + "False": false, + "True": true + }, + "datetime": { + "key1": "1979-05-27T07:32:00Z", + "key2": "1979-05-27T00:32:00-07:00", + "key3": "1979-05-27T00:32:00.999999-07:00" + }, + "float": { + "both": { + "key": 6.626e-34 + }, + "exponent": { + "key1": 5e+22, + "key2": 1000000, + "key3": -0.02 + }, + "fractional": { + "key1": 1, + "key2": 3.1415, + "key3": -0.01 + }, + "underscores": { + "key1": 9224617.445991227, + "key2": 1e+100 + } + }, + "fruit": [{ + "name": "apple", + "physical": { + "color": "red", + "shape": "round" + }, + "variety": [{ + "name": "red delicious" + }, + { + "name": "granny smith" + } + ] + }, + { + "name": "banana", + "variety": [{ + "name": "plantain" + }] + } + ], + "integer": { + "key1": 99, + "key2": 42, + "key3": 0, + "key4": -17, + "underscores": { + "key1": 1000, + "key2": 5349221, + "key3": 12345 + } + }, + "products": [{ + "name": "Hammer", + "sku": 738594937 + }, + {}, + { + "color": "gray", + "name": "Nail", + "sku": 284758393 + } + ], + "string": { + "basic": { + "basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + }, + "literal": { + "multiline": { + "lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n", + "regex2": "I [dw]on't need \\d{2} apples" + }, + "quoted": "Tom \"Dubs\" Preston-Werner", + "regex": "\u003c\\i\\c*\\s*\u003e", + "winpath": "C:\\Users\\nodejs\\templates", + "winpath2": "\\\\ServerX\\admin$\\system32\\" + }, + "multiline": { + "continued": { + "key1": "The quick brown fox jumps over the lazy dog.", + "key2": "The quick brown fox jumps over the lazy dog.", + "key3": "The quick brown fox jumps over the lazy dog." + }, + "key1": "One\nTwo", + "key2": "One\nTwo", + "key3": "One\nTwo" + } + }, + "table": { + "inline": { + "name": { + "first": "Tom", + "last": "Preston-Werner" + }, + "point": { + "x": 1, + "y": 2 + } + }, + "key": "value", + "subtable": { + "key": "another value" + } + }, + "x": { + "y": { + "z": { + "w": {} + } + } + } +} diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh new file mode 100755 index 0000000..8b8bb52 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +reference_ref=${1:-master} +reference_git=${2:-.} + +if ! `hash benchstat 2>/dev/null`; then + echo "Installing benchstat" + go get golang.org/x/perf/cmd/benchstat + go install golang.org/x/perf/cmd/benchstat +fi + +tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` +ref_tempdir="${tempdir}/ref" +ref_benchmark="${ref_tempdir}/benchmark-`echo -n ${reference_ref}|tr -s '/' '-'`.txt" +local_benchmark="`pwd`/benchmark-local.txt" + +echo "=== ${reference_ref} (${ref_tempdir})" +git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null +pushd ${ref_tempdir} >/dev/null +git checkout ${reference_ref} >/dev/null 2>/dev/null +go test -bench=. -benchmem | tee ${ref_benchmark} +popd >/dev/null + +echo "" +echo "=== local" +go test -bench=. -benchmem | tee ${local_benchmark} + +echo "" +echo "=== diff" +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} \ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/benchmark.toml b/vendor/github.com/pelletier/go-toml/benchmark.toml new file mode 100755 index 0000000..dfd77e0 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/benchmark.toml @@ -0,0 +1,244 @@ +################################################################################ +## Comment + +# Speak your mind with the hash symbol. They go from the symbol to the end of +# the line. + + +################################################################################ +## Table + +# Tables (also known as hash tables or dictionaries) are collections of +# key/value pairs. They appear in square brackets on a line by themselves. + +[table] + +key = "value" # Yeah, you can do this. + +# Nested tables are denoted by table names with dots in them. Name your tables +# whatever crap you please, just don't use #, ., [ or ]. + +[table.subtable] + +key = "another value" + +# You don't need to specify all the super-tables if you don't want to. TOML +# knows how to do it for you. + +# [x] you +# [x.y] don't +# [x.y.z] need these +[x.y.z.w] # for this to work + + +################################################################################ +## Inline Table + +# Inline tables provide a more compact syntax for expressing tables. They are +# especially useful for grouped data that can otherwise quickly become verbose. +# Inline tables are enclosed in curly braces `{` and `}`. No newlines are +# allowed between the curly braces unless they are valid within a value. + +[table.inline] + +name = { first = "Tom", last = "Preston-Werner" } +point = { x = 1, y = 2 } + + +################################################################################ +## String + +# There are four ways to express strings: basic, multi-line basic, literal, and +# multi-line literal. All strings must contain only valid UTF-8 characters. + +[string.basic] + +basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + +[string.multiline] + +# The following strings are byte-for-byte equivalent: +key1 = "One\nTwo" +key2 = """One\nTwo""" +key3 = """ +One +Two""" + +[string.multiline.continued] + +# The following strings are byte-for-byte equivalent: +key1 = "The quick brown fox jumps over the lazy dog." + +key2 = """ +The quick brown \ + + + fox jumps over \ + the lazy dog.""" + +key3 = """\ + The quick brown \ + fox jumps over \ + the lazy dog.\ + """ + +[string.literal] + +# What you see is what you get. +winpath = 'C:\Users\nodejs\templates' +winpath2 = '\\ServerX\admin$\system32\' +quoted = 'Tom "Dubs" Preston-Werner' +regex = '<\i\c*\s*>' + + +[string.literal.multiline] + +regex2 = '''I [dw]on't need \d{2} apples''' +lines = ''' +The first newline is +trimmed in raw strings. + All other whitespace + is preserved. +''' + + +################################################################################ +## Integer + +# Integers are whole numbers. Positive numbers may be prefixed with a plus sign. +# Negative numbers are prefixed with a minus sign. + +[integer] + +key1 = +99 +key2 = 42 +key3 = 0 +key4 = -17 + +[integer.underscores] + +# For large numbers, you may use underscores to enhance readability. Each +# underscore must be surrounded by at least one digit. +key1 = 1_000 +key2 = 5_349_221 +key3 = 1_2_3_4_5 # valid but inadvisable + + +################################################################################ +## Float + +# A float consists of an integer part (which may be prefixed with a plus or +# minus sign) followed by a fractional part and/or an exponent part. + +[float.fractional] + +key1 = +1.0 +key2 = 3.1415 +key3 = -0.01 + +[float.exponent] + +key1 = 5e+22 +key2 = 1e6 +key3 = -2E-2 + +[float.both] + +key = 6.626e-34 + +[float.underscores] + +key1 = 9_224_617.445_991_228_313 +key2 = 1e1_00 + + +################################################################################ +## Boolean + +# Booleans are just the tokens you're used to. Always lowercase. + +[boolean] + +True = true +False = false + + +################################################################################ +## Datetime + +# Datetimes are RFC 3339 dates. + +[datetime] + +key1 = 1979-05-27T07:32:00Z +key2 = 1979-05-27T00:32:00-07:00 +key3 = 1979-05-27T00:32:00.999999-07:00 + + +################################################################################ +## Array + +# Arrays are square brackets with other primitives inside. Whitespace is +# ignored. Elements are separated by commas. Data types may not be mixed. + +[array] + +key1 = [ 1, 2, 3 ] +key2 = [ "red", "yellow", "green" ] +key3 = [ [ 1, 2 ], [3, 4, 5] ] +#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok + +# Arrays can also be multiline. So in addition to ignoring whitespace, arrays +# also ignore newlines between the brackets. Terminating commas are ok before +# the closing bracket. + +key5 = [ + 1, 2, 3 +] +key6 = [ + 1, + 2, # this is ok +] + + +################################################################################ +## Array of Tables + +# These can be expressed by using a table name in double brackets. Each table +# with the same double bracketed name will be an element in the array. The +# tables are inserted in the order encountered. + +[[products]] + +name = "Hammer" +sku = 738594937 + +[[products]] + +[[products]] + +name = "Nail" +sku = 284758393 +color = "gray" + + +# You can create nested arrays of tables as well. + +[[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + +[[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" diff --git a/vendor/github.com/pelletier/go-toml/benchmark.yml b/vendor/github.com/pelletier/go-toml/benchmark.yml new file mode 100755 index 0000000..0bd19f0 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/benchmark.yml @@ -0,0 +1,121 @@ +--- +array: + key1: + - 1 + - 2 + - 3 + key2: + - red + - yellow + - green + key3: + - - 1 + - 2 + - - 3 + - 4 + - 5 + key4: + - - 1 + - 2 + - - a + - b + - c + key5: + - 1 + - 2 + - 3 + key6: + - 1 + - 2 +boolean: + 'False': false + 'True': true +datetime: + key1: '1979-05-27T07:32:00Z' + key2: '1979-05-27T00:32:00-07:00' + key3: '1979-05-27T00:32:00.999999-07:00' +float: + both: + key: 6.626e-34 + exponent: + key1: 5.0e+22 + key2: 1000000 + key3: -0.02 + fractional: + key1: 1 + key2: 3.1415 + key3: -0.01 + underscores: + key1: 9224617.445991227 + key2: 1.0e+100 +fruit: +- name: apple + physical: + color: red + shape: round + variety: + - name: red delicious + - name: granny smith +- name: banana + variety: + - name: plantain +integer: + key1: 99 + key2: 42 + key3: 0 + key4: -17 + underscores: + key1: 1000 + key2: 5349221 + key3: 12345 +products: +- name: Hammer + sku: 738594937 +- {} +- color: gray + name: Nail + sku: 284758393 +string: + basic: + basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + literal: + multiline: + lines: | + The first newline is + trimmed in raw strings. + All other whitespace + is preserved. + regex2: I [dw]on't need \d{2} apples + quoted: Tom "Dubs" Preston-Werner + regex: "<\\i\\c*\\s*>" + winpath: C:\Users\nodejs\templates + winpath2: "\\\\ServerX\\admin$\\system32\\" + multiline: + continued: + key1: The quick brown fox jumps over the lazy dog. + key2: The quick brown fox jumps over the lazy dog. + key3: The quick brown fox jumps over the lazy dog. + key1: |- + One + Two + key2: |- + One + Two + key3: |- + One + Two +table: + inline: + name: + first: Tom + last: Preston-Werner + point: + x: 1 + y: 2 + key: value + subtable: + key: another value +x: + y: + z: + w: {} diff --git a/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/pelletier/go-toml/doc.go new file mode 100755 index 0000000..d5fd98c --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/doc.go @@ -0,0 +1,23 @@ +// Package toml is a TOML parser and manipulation library. +// +// This version supports the specification as described in +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md +// +// Marshaling +// +// Go-toml can marshal and unmarshal TOML documents from and to data +// structures. +// +// TOML document as a tree +// +// Go-toml can operate on a TOML document as a tree. Use one of the Load* +// functions to parse TOML data and obtain a Tree instance, then one of its +// methods to manipulate the tree. +// +// JSONPath-like queries +// +// The package github.com/pelletier/go-toml/query implements a system +// similar to JSONPath to quickly retrieve elements of a TOML document using a +// single expression. See the package documentation for more information. +// +package toml diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml new file mode 100755 index 0000000..3d902f2 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml new file mode 100755 index 0000000..3d902f2 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/example.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/pelletier/go-toml/fuzz.go b/vendor/github.com/pelletier/go-toml/fuzz.go new file mode 100755 index 0000000..14570c8 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzz.go @@ -0,0 +1,31 @@ +// +build gofuzz + +package toml + +func Fuzz(data []byte) int { + tree, err := LoadBytes(data) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + str, err := tree.ToTomlString() + if err != nil { + if str != "" { + panic(`str must be "" if there is an error`) + } + panic(err) + } + + tree, err = Load(str) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + return 1 +} diff --git a/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/pelletier/go-toml/fuzz.sh new file mode 100755 index 0000000..3204b4c --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzz.sh @@ -0,0 +1,15 @@ +#! /bin/sh +set -eu + +go get github.com/dvyukov/go-fuzz/go-fuzz +go get github.com/dvyukov/go-fuzz/go-fuzz-build + +if [ ! -e toml-fuzz.zip ]; then + go-fuzz-build github.com/pelletier/go-toml +fi + +rm -fr fuzz +mkdir -p fuzz/corpus +cp *.toml fuzz/corpus + +go-fuzz -bin=toml-fuzz.zip -workdir=fuzz diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go new file mode 100755 index 0000000..284db64 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -0,0 +1,85 @@ +// Parsing keys handling both bare and quoted keys. + +package toml + +import ( + "bytes" + "errors" + "fmt" + "unicode" +) + +// Convert the bare key group string to an array. +// The input supports double quotation to allow "." inside the key name, +// but escape sequences are not supported. Lexers must unescape them beforehand. +func parseKey(key string) ([]string, error) { + groups := []string{} + var buffer bytes.Buffer + inQuotes := false + wasInQuotes := false + ignoreSpace := true + expectDot := false + + for _, char := range key { + if ignoreSpace { + if char == ' ' { + continue + } + ignoreSpace = false + } + switch char { + case '"': + if inQuotes { + groups = append(groups, buffer.String()) + buffer.Reset() + wasInQuotes = true + } + inQuotes = !inQuotes + expectDot = false + case '.': + if inQuotes { + buffer.WriteRune(char) + } else { + if !wasInQuotes { + if buffer.Len() == 0 { + return nil, errors.New("empty table key") + } + groups = append(groups, buffer.String()) + buffer.Reset() + } + ignoreSpace = true + expectDot = false + wasInQuotes = false + } + case ' ': + if inQuotes { + buffer.WriteRune(char) + } else { + expectDot = true + } + default: + if !inQuotes && !isValidBareChar(char) { + return nil, fmt.Errorf("invalid bare character: %c", char) + } + if !inQuotes && expectDot { + return nil, errors.New("what?") + } + buffer.WriteRune(char) + expectDot = false + } + } + if inQuotes { + return nil, errors.New("mismatched quotes") + } + if buffer.Len() > 0 { + groups = append(groups, buffer.String()) + } + if len(groups) == 0 { + return nil, errors.New("empty key") + } + return groups, nil +} + +func isValidBareChar(r rune) bool { + return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) +} diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go new file mode 100755 index 0000000..d11de42 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -0,0 +1,750 @@ +// TOML lexer. +// +// Written using the principles developed by Rob Pike in +// http://www.youtube.com/watch?v=HxaD_trXwRE + +package toml + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +var dateRegexp *regexp.Regexp + +// Define state functions +type tomlLexStateFn func() tomlLexStateFn + +// Define lexer +type tomlLexer struct { + inputIdx int + input []rune // Textual source + currentTokenStart int + currentTokenStop int + tokens []token + depth int + line int + col int + endbufferLine int + endbufferCol int +} + +// Basic read operations on input + +func (l *tomlLexer) read() rune { + r := l.peek() + if r == '\n' { + l.endbufferLine++ + l.endbufferCol = 1 + } else { + l.endbufferCol++ + } + l.inputIdx++ + return r +} + +func (l *tomlLexer) next() rune { + r := l.read() + + if r != eof { + l.currentTokenStop++ + } + return r +} + +func (l *tomlLexer) ignore() { + l.currentTokenStart = l.currentTokenStop + l.line = l.endbufferLine + l.col = l.endbufferCol +} + +func (l *tomlLexer) skip() { + l.next() + l.ignore() +} + +func (l *tomlLexer) fastForward(n int) { + for i := 0; i < n; i++ { + l.next() + } +} + +func (l *tomlLexer) emitWithValue(t tokenType, value string) { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: t, + val: value, + }) + l.ignore() +} + +func (l *tomlLexer) emit(t tokenType) { + l.emitWithValue(t, string(l.input[l.currentTokenStart:l.currentTokenStop])) +} + +func (l *tomlLexer) peek() rune { + if l.inputIdx >= len(l.input) { + return eof + } + return l.input[l.inputIdx] +} + +func (l *tomlLexer) peekString(size int) string { + maxIdx := len(l.input) + upperIdx := l.inputIdx + size // FIXME: potential overflow + if upperIdx > maxIdx { + upperIdx = maxIdx + } + return string(l.input[l.inputIdx:upperIdx]) +} + +func (l *tomlLexer) follow(next string) bool { + return next == l.peekString(len(next)) +} + +// Error management + +func (l *tomlLexer) errorf(format string, args ...interface{}) tomlLexStateFn { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: tokenError, + val: fmt.Sprintf(format, args...), + }) + return nil +} + +// State functions + +func (l *tomlLexer) lexVoid() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '[': + return l.lexTableKey + case '#': + return l.lexComment(l.lexVoid) + case '=': + return l.lexEqual + case '\r': + fallthrough + case '\n': + l.skip() + continue + } + + if isSpace(next) { + l.skip() + } + + if l.depth > 0 { + return l.lexRvalue + } + + if isKeyStartChar(next) { + return l.lexKey + } + + if next == eof { + l.next() + break + } + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexRvalue() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '.': + return l.errorf("cannot start float with a dot") + case '=': + return l.lexEqual + case '[': + l.depth++ + return l.lexLeftBracket + case ']': + l.depth-- + return l.lexRightBracket + case '{': + return l.lexLeftCurlyBrace + case '}': + return l.lexRightCurlyBrace + case '#': + return l.lexComment(l.lexRvalue) + case '"': + return l.lexString + case '\'': + return l.lexLiteralString + case ',': + return l.lexComma + case '\r': + fallthrough + case '\n': + l.skip() + if l.depth == 0 { + return l.lexVoid + } + return l.lexRvalue + case '_': + return l.errorf("cannot start number with underscore") + } + + if l.follow("true") { + return l.lexTrue + } + + if l.follow("false") { + return l.lexFalse + } + + if l.follow("inf") { + return l.lexInf + } + + if l.follow("nan") { + return l.lexNan + } + + if isSpace(next) { + l.skip() + continue + } + + if next == eof { + l.next() + break + } + + possibleDate := l.peekString(35) + dateMatch := dateRegexp.FindString(possibleDate) + if dateMatch != "" { + l.fastForward(len(dateMatch)) + return l.lexDate + } + + if next == '+' || next == '-' || isDigit(next) { + return l.lexNumber + } + + if isAlphanumeric(next) { + return l.lexKey + } + + return l.errorf("no value can start with %c", next) + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenLeftCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenRightCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexDate() tomlLexStateFn { + l.emit(tokenDate) + return l.lexRvalue +} + +func (l *tomlLexer) lexTrue() tomlLexStateFn { + l.fastForward(4) + l.emit(tokenTrue) + return l.lexRvalue +} + +func (l *tomlLexer) lexFalse() tomlLexStateFn { + l.fastForward(5) + l.emit(tokenFalse) + return l.lexRvalue +} + +func (l *tomlLexer) lexInf() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenInf) + return l.lexRvalue +} + +func (l *tomlLexer) lexNan() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenNan) + return l.lexRvalue +} + +func (l *tomlLexer) lexEqual() tomlLexStateFn { + l.next() + l.emit(tokenEqual) + return l.lexRvalue +} + +func (l *tomlLexer) lexComma() tomlLexStateFn { + l.next() + l.emit(tokenComma) + return l.lexRvalue +} + +// Parse the key and emits its value without escape sequences. +// bare keys, basic string keys and literal string keys are supported. +func (l *tomlLexer) lexKey() tomlLexStateFn { + growingString := "" + + for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() { + if r == '"' { + l.next() + str, err := l.lexStringAsString(`"`, false, true) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\'' { + l.next() + str, err := l.lexLiteralStringAsString(`'`, false) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\n' { + return l.errorf("keys cannot contain new lines") + } else if isSpace(r) { + break + } else if !isValidBareChar(r) { + return l.errorf("keys cannot contain %c character", r) + } + growingString += string(r) + l.next() + } + l.emitWithValue(tokenKey, growingString) + return l.lexVoid +} + +func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { + return func() tomlLexStateFn { + for next := l.peek(); next != '\n' && next != eof; next = l.peek() { + if next == '\r' && l.follow("\r\n") { + break + } + l.next() + } + l.ignore() + return previousState + } +} + +func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { + l.next() + l.emit(tokenLeftBracket) + return l.lexRvalue +} + +func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + // find end of string + for { + if l.follow(terminator) { + return growingString, nil + } + + next := l.peek() + if next == eof { + break + } + growingString += string(l.next()) + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexLiteralString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := "'" + discardLeadingNewLine := false + if l.follow("''") { + l.skip() + l.skip() + terminator = "'''" + discardLeadingNewLine = true + } + + str, err := l.lexLiteralStringAsString(terminator, discardLeadingNewLine) + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +// Lex a string and return the results as a string. +// Terminator is the substring indicating the end of the token. +// The resulting string does not include the terminator. +func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + for { + if l.follow(terminator) { + return growingString, nil + } + + if l.follow("\\") { + l.next() + switch l.peek() { + case '\r': + fallthrough + case '\n': + fallthrough + case '\t': + fallthrough + case ' ': + // skip all whitespace chars following backslash + for strings.ContainsRune("\r\n\t ", l.peek()) { + l.next() + } + case '"': + growingString += "\"" + l.next() + case 'n': + growingString += "\n" + l.next() + case 'b': + growingString += "\b" + l.next() + case 'f': + growingString += "\f" + l.next() + case '/': + growingString += "/" + l.next() + case 't': + growingString += "\t" + l.next() + case 'r': + growingString += "\r" + l.next() + case '\\': + growingString += "\\" + l.next() + case 'u': + l.next() + code := "" + for i := 0; i < 4; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 32) + if err != nil { + return "", errors.New("invalid unicode escape: \\u" + code) + } + growingString += string(rune(intcode)) + case 'U': + l.next() + code := "" + for i := 0; i < 8; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 64) + if err != nil { + return "", errors.New("invalid unicode escape: \\U" + code) + } + growingString += string(rune(intcode)) + default: + return "", errors.New("invalid escape sequence: \\" + string(l.peek())) + } + } else { + r := l.peek() + + if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + return "", fmt.Errorf("unescaped control character %U", r) + } + l.next() + growingString += string(r) + } + + if l.peek() == eof { + break + } + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := `"` + discardLeadingNewLine := false + acceptNewLines := false + if l.follow(`""`) { + l.skip() + l.skip() + terminator = `"""` + discardLeadingNewLine = true + acceptNewLines = true + } + + str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) + + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +func (l *tomlLexer) lexTableKey() tomlLexStateFn { + l.next() + + if l.peek() == '[' { + // token '[[' signifies an array of tables + l.next() + l.emit(tokenDoubleLeftBracket) + return l.lexInsideTableArrayKey + } + // vanilla table key + l.emit(tokenLeftBracket) + return l.lexInsideTableKey +} + +// Parse the key till "]]", but only bare keys are supported +func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroupArray) + } + l.next() + if l.peek() != ']' { + break + } + l.next() + l.emit(tokenDoubleRightBracket) + return l.lexVoid + case '[': + return l.errorf("table array key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table array key") +} + +// Parse the key till "]" but only bare keys are supported +func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroup) + } + l.next() + l.emit(tokenRightBracket) + return l.lexVoid + case '[': + return l.errorf("table key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table key") +} + +func (l *tomlLexer) lexRightBracket() tomlLexStateFn { + l.next() + l.emit(tokenRightBracket) + return l.lexRvalue +} + +type validRuneFn func(r rune) bool + +func isValidHexRune(r rune) bool { + return r >= 'a' && r <= 'f' || + r >= 'A' && r <= 'F' || + r >= '0' && r <= '9' || + r == '_' +} + +func isValidOctalRune(r rune) bool { + return r >= '0' && r <= '7' || r == '_' +} + +func isValidBinaryRune(r rune) bool { + return r == '0' || r == '1' || r == '_' +} + +func (l *tomlLexer) lexNumber() tomlLexStateFn { + r := l.peek() + + if r == '0' { + follow := l.peekString(2) + if len(follow) == 2 { + var isValidRune validRuneFn + switch follow[1] { + case 'x': + isValidRune = isValidHexRune + case 'o': + isValidRune = isValidOctalRune + case 'b': + isValidRune = isValidBinaryRune + default: + if follow[1] >= 'a' && follow[1] <= 'z' || follow[1] >= 'A' && follow[1] <= 'Z' { + return l.errorf("unknown number base: %s. possible options are x (hex) o (octal) b (binary)", string(follow[1])) + } + } + + if isValidRune != nil { + l.next() + l.next() + digitSeen := false + for { + next := l.peek() + if !isValidRune(next) { + break + } + digitSeen = true + l.next() + } + + if !digitSeen { + return l.errorf("number needs at least one digit") + } + + l.emit(tokenInteger) + + return l.lexRvalue + } + } + } + + if r == '+' || r == '-' { + l.next() + if l.follow("inf") { + return l.lexInf + } + if l.follow("nan") { + return l.lexNan + } + } + + pointSeen := false + expSeen := false + digitSeen := false + for { + next := l.peek() + if next == '.' { + if pointSeen { + return l.errorf("cannot have two dots in one float") + } + l.next() + if !isDigit(l.peek()) { + return l.errorf("float cannot end with a dot") + } + pointSeen = true + } else if next == 'e' || next == 'E' { + expSeen = true + l.next() + r := l.peek() + if r == '+' || r == '-' { + l.next() + } + } else if isDigit(next) { + digitSeen = true + l.next() + } else if next == '_' { + l.next() + } else { + break + } + if pointSeen && !digitSeen { + return l.errorf("cannot start float with a dot") + } + } + + if !digitSeen { + return l.errorf("no digit in that number") + } + if pointSeen || expSeen { + l.emit(tokenFloat) + } else { + l.emit(tokenInteger) + } + return l.lexRvalue +} + +func (l *tomlLexer) run() { + for state := l.lexVoid; state != nil; { + state = state() + } +} + +func init() { + dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) +} + +// Entry point +func lexToml(inputBytes []byte) []token { + runes := bytes.Runes(inputBytes) + l := &tomlLexer{ + input: runes, + tokens: make([]token, 0, 256), + line: 1, + col: 1, + endbufferLine: 1, + endbufferCol: 1, + } + l.run() + return l.tokens +} diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go new file mode 100755 index 0000000..b5a2415 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -0,0 +1,600 @@ +package toml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "time" +) + +type tomlOpts struct { + name string + comment string + commented bool + include bool + omitempty bool +} + +type encOpts struct { + quoteMapKeys bool + arraysOneElementPerLine bool +} + +var encOptsDefaults = encOpts{ + quoteMapKeys: false, +} + +var timeType = reflect.TypeOf(time.Time{}) +var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() + +// Check if the given marshall type maps to a Tree primitive +func isPrimitive(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isPrimitive(mtype.Elem()) + case reflect.Bool: + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Struct: + return mtype == timeType || isCustomMarshaler(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree slice +func isTreeSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Slice: + return !isOtherSlice(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a non-Tree slice +func isOtherSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSlice(mtype.Elem()) + case reflect.Slice: + return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem()) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree +func isTree(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Map: + return true + case reflect.Struct: + return !isPrimitive(mtype) + default: + return false + } +} + +func isCustomMarshaler(mtype reflect.Type) bool { + return mtype.Implements(marshalerType) +} + +func callCustomMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(Marshaler).MarshalTOML() +} + +// Marshaler is the interface implemented by types that +// can marshal themselves into valid TOML. +type Marshaler interface { + MarshalTOML() ([]byte, error) +} + +/* +Marshal returns the TOML encoding of v. Behavior is similar to the Go json +encoder, except that there is no concept of a Marshaler interface or MarshalTOML +function for sub-structs, and currently only definite types can be marshaled +(i.e. no `interface{}`). + +The following struct annotations are supported: + + toml:"Field" Overrides the field's name to output. + omitempty When set, empty values and groups are not emitted. + comment:"comment" Emits a # comment on the same line. This supports new lines. + commented:"true" Emits the value as commented. + +Note that pointers are automatically assigned the "omitempty" option, as TOML +explicitly does not handle null values (saying instead the label should be +dropped). + +Tree structural types and corresponding marshal types: + + *Tree (*)struct, (*)map[string]interface{} + []*Tree (*)[](*)struct, (*)[](*)map[string]interface{} + []interface{} (as interface{}) (*)[]primitive, (*)[]([]interface{}) + interface{} (*)primitive + +Tree primitive types and corresponding marshal types: + + uint64 uint, uint8-uint64, pointers to same + int64 int, int8-uint64, pointers to same + float64 float32, float64, pointers to same + string string, pointers to same + bool bool, pointers to same + time.Time time.Time{}, pointers to same +*/ +func Marshal(v interface{}) ([]byte, error) { + return NewEncoder(nil).marshal(v) +} + +// Encoder writes TOML values to an output stream. +type Encoder struct { + w io.Writer + encOpts +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + encOpts: encOptsDefaults, + } +} + +// Encode writes the TOML encoding of v to the stream. +// +// See the documentation for Marshal for details. +func (e *Encoder) Encode(v interface{}) error { + b, err := e.marshal(v) + if err != nil { + return err + } + if _, err := e.w.Write(b); err != nil { + return err + } + return nil +} + +// QuoteMapKeys sets up the encoder to encode +// maps with string type keys with quoted TOML keys. +// +// This relieves the character limitations on map keys. +func (e *Encoder) QuoteMapKeys(v bool) *Encoder { + e.quoteMapKeys = v + return e +} + +// ArraysWithOneElementPerLine sets up the encoder to encode arrays +// with more than one element on multiple lines instead of one. +// +// For example: +// +// A = [1,2,3] +// +// Becomes +// +// A = [ +// 1, +// 2, +// 3 +// ] +func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder { + e.arraysOneElementPerLine = v + return e +} + +func (e *Encoder) marshal(v interface{}) ([]byte, error) { + mtype := reflect.TypeOf(v) + if mtype.Kind() != reflect.Struct { + return []byte{}, errors.New("Only a struct can be marshaled to TOML") + } + sval := reflect.ValueOf(v) + if isCustomMarshaler(mtype) { + return callCustomMarshaler(sval) + } + t, err := e.valueToTree(mtype, sval) + if err != nil { + return []byte{}, err + } + + var buf bytes.Buffer + _, err = t.writeTo(&buf, "", "", 0, e.arraysOneElementPerLine) + + return buf.Bytes(), err +} + +// Convert given marshal struct or map value to toml tree +func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToTree(mtype.Elem(), mval.Elem()) + } + tval := newTree() + switch mtype.Kind() { + case reflect.Struct: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef) + if opts.include && (!opts.omitempty || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + tval.SetWithComment(opts.name, opts.comment, opts.commented, val) + } + } + case reflect.Map: + for _, key := range mval.MapKeys() { + mvalf := mval.MapIndex(key) + val, err := e.valueToToml(mtype.Elem(), mvalf) + if err != nil { + return nil, err + } + if e.quoteMapKeys { + keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + if err != nil { + return nil, err + } + tval.SetPath([]string{keyStr}, val) + } else { + tval.Set(key.String(), val) + } + } + } + return tval, nil +} + +// Convert given marshal slice to slice of Toml trees +func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*Tree, error) { + tval := make([]*Tree, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToTree(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal slice to slice of toml values +func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + tval := make([]interface{}, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToToml(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal value to toml value +func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTree(mtype): + return e.valueToTree(mtype, mval) + case isTreeSlice(mtype): + return e.valueToTreeSlice(mtype, mval) + case isOtherSlice(mtype): + return e.valueToOtherSlice(mtype, mval) + default: + switch mtype.Kind() { + case reflect.Bool: + return mval.Bool(), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return mval.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return mval.Uint(), nil + case reflect.Float32, reflect.Float64: + return mval.Float(), nil + case reflect.String: + return mval.String(), nil + case reflect.Struct: + return mval.Interface().(time.Time), nil + default: + return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) + } + } +} + +// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. +// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for +// sub-structs, and only definite types can be unmarshaled. +func (t *Tree) Unmarshal(v interface{}) error { + d := Decoder{tval: t} + return d.unmarshal(v) +} + +// Marshal returns the TOML encoding of Tree. +// See Marshal() documentation for types mapping table. +func (t *Tree) Marshal() ([]byte, error) { + var buf bytes.Buffer + err := NewEncoder(&buf).Encode(t) + return buf.Bytes(), err +} + +// Unmarshal parses the TOML-encoded data and stores the result in the value +// pointed to by v. Behavior is similar to the Go json encoder, except that there +// is no concept of an Unmarshaler interface or UnmarshalTOML function for +// sub-structs, and currently only definite types can be unmarshaled to (i.e. no +// `interface{}`). +// +// The following struct annotations are supported: +// +// toml:"Field" Overrides the field's name to map to. +// +// See Marshal() documentation for types mapping table. +func Unmarshal(data []byte, v interface{}) error { + t, err := LoadReader(bytes.NewReader(data)) + if err != nil { + return err + } + return t.Unmarshal(v) +} + +// Decoder reads and decodes TOML values from an input stream. +type Decoder struct { + r io.Reader + tval *Tree + encOpts +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + r: r, + encOpts: encOptsDefaults, + } +} + +// Decode reads a TOML-encoded value from it's input +// and unmarshals it in the value pointed at by v. +// +// See the documentation for Marshal for details. +func (d *Decoder) Decode(v interface{}) error { + var err error + d.tval, err = LoadReader(d.r) + if err != nil { + return err + } + return d.unmarshal(v) +} + +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") + } + + sval, err := d.valueFromTree(mtype.Elem(), d.tval) + if err != nil { + return err + } + reflect.ValueOf(v).Elem().Set(sval) + return nil +} + +// Convert toml tree to marshal struct or map, using marshal type +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + var mval reflect.Value + switch mtype.Kind() { + case reflect.Struct: + mval = reflect.New(mtype).Elem() + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + opts := tomlOptions(mtypef) + if opts.include { + baseKey := opts.name + keysToTry := []string{baseKey, strings.ToLower(baseKey), strings.ToTitle(baseKey)} + for _, key := range keysToTry { + exists := tval.Has(key) + if !exists { + continue + } + val := tval.Get(key) + mvalf, err := d.valueFromToml(mtypef.Type, val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.Field(i).Set(mvalf) + break + } + } + } + case reflect.Map: + mval = reflect.MakeMap(mtype) + for _, key := range tval.Keys() { + // TODO: path splits key + val := tval.GetPath([]string{key}) + mvalf, err := d.valueFromToml(mtype.Elem(), val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.SetMapIndex(reflect.ValueOf(key), mvalf) + } + } + return mval, nil +} + +// Convert toml value to marshal struct/map slice, using marshal type +func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromTree(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromToml(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + + switch tval.(type) { + case *Tree: + if isTree(mtype) { + return d.valueFromTree(mtype, tval.(*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) + case []*Tree: + if isTreeSlice(mtype) { + return d.valueFromTreeSlice(mtype, tval.([]*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) + case []interface{}: + if isOtherSlice(mtype) { + return d.valueFromOtherSlice(mtype, tval.([]interface{})) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) + default: + switch mtype.Kind() { + case reflect.Bool, reflect.Struct: + val := reflect.ValueOf(tval) + // if this passes for when mtype is reflect.Struct, tval is a time.Time + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.String: + val := reflect.ValueOf(tval) + // stupidly, int64 is convertible to string. So special case this. + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Int()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if val.Int() < 0 { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Int())) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Float32, reflect.Float64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Float()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + default: + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) + } + } +} + +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val, err := d.valueFromToml(mtype.Elem(), tval) + if err != nil { + return reflect.ValueOf(nil), err + } + mval := reflect.New(mtype.Elem()) + mval.Elem().Set(val) + return mval, nil +} + +func tomlOptions(vf reflect.StructField) tomlOpts { + tag := vf.Tag.Get("toml") + parse := strings.Split(tag, ",") + var comment string + if c := vf.Tag.Get("comment"); c != "" { + comment = c + } + commented, _ := strconv.ParseBool(vf.Tag.Get("commented")) + result := tomlOpts{name: vf.Name, comment: comment, commented: commented, include: true, omitempty: false} + if parse[0] != "" { + if parse[0] == "-" && len(parse) == 1 { + result.include = false + } else { + result.name = strings.Trim(parse[0], " ") + } + } + if vf.PkgPath != "" { + result.include = false + } + if len(parse) > 1 && strings.Trim(parse[1], " ") == "omitempty" { + result.omitempty = true + } + if vf.Type.Kind() == reflect.Ptr { + result.omitempty = true + } + return result +} + +func isZero(val reflect.Value) bool { + switch val.Type().Kind() { + case reflect.Map: + fallthrough + case reflect.Array: + fallthrough + case reflect.Slice: + return val.Len() == 0 + default: + return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) + } +} + +func formatError(err error, pos Position) error { + if err.Error()[0] == '(' { // Error already contains position information + return err + } + return fmt.Errorf("%s: %s", pos, err) +} diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml new file mode 100755 index 0000000..1c5f98e --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -0,0 +1,38 @@ +title = "TOML Marshal Testing" + +[basic] + bool = true + date = 1979-05-27T07:32:00Z + float = 123.4 + int = 5000 + string = "Bite me" + uint = 5001 + +[basic_lists] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + floats = [12.3,45.6,78.9] + ints = [8001,8001,8002] + strings = ["One","Two","Three"] + uints = [5002,5003] + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.first] + name = "First" + + [subdoc.second] + name = "Second" + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" + +[[subdocptrs]] + name = "Second" diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go new file mode 100755 index 0000000..2d27599 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -0,0 +1,430 @@ +// TOML Parser. + +package toml + +import ( + "errors" + "fmt" + "math" + "reflect" + "regexp" + "strconv" + "strings" + "time" +) + +type tomlParser struct { + flowIdx int + flow []token + tree *Tree + currentTable []string + seenTableKeys []string +} + +type tomlParserStateFn func() tomlParserStateFn + +// Formats and panics an error message based on a token +func (p *tomlParser) raiseError(tok *token, msg string, args ...interface{}) { + panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...)) +} + +func (p *tomlParser) run() { + for state := p.parseStart; state != nil; { + state = state() + } +} + +func (p *tomlParser) peek() *token { + if p.flowIdx >= len(p.flow) { + return nil + } + return &p.flow[p.flowIdx] +} + +func (p *tomlParser) assume(typ tokenType) { + tok := p.getToken() + if tok == nil { + p.raiseError(tok, "was expecting token %s, but token stream is empty", tok) + } + if tok.typ != typ { + p.raiseError(tok, "was expecting token %s, but got %s instead", typ, tok) + } +} + +func (p *tomlParser) getToken() *token { + tok := p.peek() + if tok == nil { + return nil + } + p.flowIdx++ + return tok +} + +func (p *tomlParser) parseStart() tomlParserStateFn { + tok := p.peek() + + // end of stream, parsing is finished + if tok == nil { + return nil + } + + switch tok.typ { + case tokenDoubleLeftBracket: + return p.parseGroupArray + case tokenLeftBracket: + return p.parseGroup + case tokenKey: + return p.parseAssign + case tokenEOF: + return nil + default: + p.raiseError(tok, "unexpected token") + } + return nil +} + +func (p *tomlParser) parseGroupArray() tomlParserStateFn { + startToken := p.getToken() // discard the [[ + key := p.getToken() + if key.typ != tokenKeyGroupArray { + p.raiseError(key, "unexpected token %s, was expecting a table array key", key) + } + + // get or create table array element at the indicated part in the path + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + p.tree.createSubTree(keys[:len(keys)-1], startToken.Position) // create parent entries + destTree := p.tree.GetPath(keys) + var array []*Tree + if destTree == nil { + array = make([]*Tree, 0) + } else if target, ok := destTree.([]*Tree); ok && target != nil { + array = destTree.([]*Tree) + } else { + p.raiseError(key, "key %s is already assigned and not of type table array", key) + } + p.currentTable = keys + + // add a new tree to the end of the table array + newTree := newTree() + newTree.position = startToken.Position + array = append(array, newTree) + p.tree.SetPath(p.currentTable, array) + + // remove all keys that were children of this table array + prefix := key.val + "." + found := false + for ii := 0; ii < len(p.seenTableKeys); { + tableKey := p.seenTableKeys[ii] + if strings.HasPrefix(tableKey, prefix) { + p.seenTableKeys = append(p.seenTableKeys[:ii], p.seenTableKeys[ii+1:]...) + } else { + found = (tableKey == key.val) + ii++ + } + } + + // keep this key name from use by other kinds of assignments + if !found { + p.seenTableKeys = append(p.seenTableKeys, key.val) + } + + // move to next parser state + p.assume(tokenDoubleRightBracket) + return p.parseStart +} + +func (p *tomlParser) parseGroup() tomlParserStateFn { + startToken := p.getToken() // discard the [ + key := p.getToken() + if key.typ != tokenKeyGroup { + p.raiseError(key, "unexpected token %s, was expecting a table key", key) + } + for _, item := range p.seenTableKeys { + if item == key.val { + p.raiseError(key, "duplicated tables") + } + } + + p.seenTableKeys = append(p.seenTableKeys, key.val) + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + if err := p.tree.createSubTree(keys, startToken.Position); err != nil { + p.raiseError(key, "%s", err) + } + p.assume(tokenRightBracket) + p.currentTable = keys + return p.parseStart +} + +func (p *tomlParser) parseAssign() tomlParserStateFn { + key := p.getToken() + p.assume(tokenEqual) + + value := p.parseRvalue() + var tableKey []string + if len(p.currentTable) > 0 { + tableKey = p.currentTable + } else { + tableKey = []string{} + } + + // find the table to assign, looking out for arrays of tables + var targetNode *Tree + switch node := p.tree.GetPath(tableKey).(type) { + case []*Tree: + targetNode = node[len(node)-1] + case *Tree: + targetNode = node + default: + p.raiseError(key, "Unknown table type for path: %s", + strings.Join(tableKey, ".")) + } + + // assign value to the found table + keyVals := []string{key.val} + if len(keyVals) != 1 { + p.raiseError(key, "Invalid key") + } + keyVal := keyVals[0] + localKey := []string{keyVal} + finalKey := append(tableKey, keyVal) + if targetNode.GetPath(localKey) != nil { + p.raiseError(key, "The following key was defined twice: %s", + strings.Join(finalKey, ".")) + } + var toInsert interface{} + + switch value.(type) { + case *Tree, []*Tree: + toInsert = value + default: + toInsert = &tomlValue{value: value, position: key.Position} + } + targetNode.values[keyVal] = toInsert + return p.parseStart +} + +var numberUnderscoreInvalidRegexp *regexp.Regexp +var hexNumberUnderscoreInvalidRegexp *regexp.Regexp + +func numberContainsInvalidUnderscore(value string) error { + if numberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in number") + } + return nil +} + +func hexNumberContainsInvalidUnderscore(value string) error { + if hexNumberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in hex number") + } + return nil +} + +func cleanupNumberToken(value string) string { + cleanedVal := strings.Replace(value, "_", "", -1) + return cleanedVal +} + +func (p *tomlParser) parseRvalue() interface{} { + tok := p.getToken() + if tok == nil || tok.typ == tokenEOF { + p.raiseError(tok, "expecting a value") + } + + switch tok.typ { + case tokenString: + return tok.val + case tokenTrue: + return true + case tokenFalse: + return false + case tokenInf: + if tok.val[0] == '-' { + return math.Inf(-1) + } + return math.Inf(1) + case tokenNan: + return math.NaN() + case tokenInteger: + cleanedVal := cleanupNumberToken(tok.val) + var err error + var val int64 + if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { + switch cleanedVal[1] { + case 'x': + err = hexNumberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 16, 64) + case 'o': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 8, 64) + case 'b': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 2, 64) + default: + panic("invalid base") // the lexer should catch this first + } + } else { + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal, 10, 64) + } + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenFloat: + err := numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + cleanedVal := cleanupNumberToken(tok.val) + val, err := strconv.ParseFloat(cleanedVal, 64) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenDate: + val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLeftBracket: + return p.parseArray() + case tokenLeftCurlyBrace: + return p.parseInlineTable() + case tokenEqual: + p.raiseError(tok, "cannot have multiple equals for the same key") + case tokenError: + p.raiseError(tok, "%s", tok) + } + + p.raiseError(tok, "never reached") + + return nil +} + +func tokenIsComma(t *token) bool { + return t != nil && t.typ == tokenComma +} + +func (p *tomlParser) parseInlineTable() *Tree { + tree := newTree() + var previous *token +Loop: + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated inline table") + } + switch follow.typ { + case tokenRightCurlyBrace: + p.getToken() + break Loop + case tokenKey: + if !tokenIsComma(previous) && previous != nil { + p.raiseError(follow, "comma expected between fields in inline table") + } + key := p.getToken() + p.assume(tokenEqual) + value := p.parseRvalue() + tree.Set(key.val, value) + case tokenComma: + if previous == nil { + p.raiseError(follow, "inline table cannot start with a comma") + } + if tokenIsComma(previous) { + p.raiseError(follow, "need field between two commas in inline table") + } + p.getToken() + default: + p.raiseError(follow, "unexpected token type in inline table: %s", follow.String()) + } + previous = follow + } + if tokenIsComma(previous) { + p.raiseError(previous, "trailing comma at the end of inline table") + } + return tree +} + +func (p *tomlParser) parseArray() interface{} { + var array []interface{} + arrayType := reflect.TypeOf(nil) + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ == tokenRightBracket { + p.getToken() + break + } + val := p.parseRvalue() + if arrayType == nil { + arrayType = reflect.TypeOf(val) + } + if reflect.TypeOf(val) != arrayType { + p.raiseError(follow, "mixed types in array") + } + array = append(array, val) + follow = p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ != tokenRightBracket && follow.typ != tokenComma { + p.raiseError(follow, "missing comma") + } + if follow.typ == tokenComma { + p.getToken() + } + } + // An array of Trees is actually an array of inline + // tables, which is a shorthand for a table array. If the + // array was not converted from []interface{} to []*Tree, + // the two notations would not be equivalent. + if arrayType == reflect.TypeOf(newTree()) { + tomlArray := make([]*Tree, len(array)) + for i, v := range array { + tomlArray[i] = v.(*Tree) + } + return tomlArray + } + return array +} + +func parseToml(flow []token) *Tree { + result := newTree() + result.position = Position{1, 1} + parser := &tomlParser{ + flowIdx: 0, + flow: flow, + tree: result, + currentTable: make([]string, 0), + seenTableKeys: make([]string, 0), + } + parser.run() + return result +} + +func init() { + numberUnderscoreInvalidRegexp = regexp.MustCompile(`([^\d]_|_[^\d])|_$|^_`) + hexNumberUnderscoreInvalidRegexp = regexp.MustCompile(`(^0x_)|([^\da-f]_|_[^\da-f])|_$|^_`) +} diff --git a/vendor/github.com/pelletier/go-toml/position.go b/vendor/github.com/pelletier/go-toml/position.go new file mode 100755 index 0000000..c17bff8 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/position.go @@ -0,0 +1,29 @@ +// Position support for go-toml + +package toml + +import ( + "fmt" +) + +// Position of a document element within a TOML document. +// +// Line and Col are both 1-indexed positions for the element's line number and +// column number, respectively. Values of zero or less will cause Invalid(), +// to return true. +type Position struct { + Line int // line within the document + Col int // column within the line +} + +// String representation of the position. +// Displays 1-indexed line and column numbers. +func (p Position) String() string { + return fmt.Sprintf("(%d, %d)", p.Line, p.Col) +} + +// Invalid returns whether or not the position is valid (i.e. with negative or +// null values) +func (p Position) Invalid() bool { + return p.Line <= 0 || p.Col <= 0 +} diff --git a/vendor/github.com/pelletier/go-toml/test.sh b/vendor/github.com/pelletier/go-toml/test.sh new file mode 100755 index 0000000..a70a8b0 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/test.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# fail out of the script if anything here fails +set -e +set -o pipefail + +# set the path to the present working directory +export GOPATH=`pwd` + +function git_clone() { + path=$1 + branch=$2 + version=$3 + if [ ! -d "src/$path" ]; then + mkdir -p src/$path + git clone https://$path.git src/$path + fi + pushd src/$path + git checkout "$branch" + git reset --hard "$version" + popd +} + +# Remove potential previous runs +rm -rf src test_program_bin toml-test + +# Run go vet +go vet ./... + +go get github.com/pelletier/go-buffruneio +go get github.com/davecgh/go-spew/spew +go get gopkg.in/yaml.v2 +go get github.com/BurntSushi/toml + +# get code for BurntSushi TOML validation +# pinning all to 'HEAD' for version 0.3.x work (TODO: pin to commit hash when tests stabilize) +git_clone github.com/BurntSushi/toml master HEAD +git_clone github.com/BurntSushi/toml-test master HEAD #was: 0.2.0 HEAD + +# build the BurntSushi test application +go build -o toml-test github.com/BurntSushi/toml-test + +# vendorize the current lib for testing +# NOTE: this basically mocks an install without having to go back out to github for code +mkdir -p src/github.com/pelletier/go-toml/cmd +mkdir -p src/github.com/pelletier/go-toml/query +cp *.go *.toml src/github.com/pelletier/go-toml +cp -R cmd/* src/github.com/pelletier/go-toml/cmd +cp -R query/* src/github.com/pelletier/go-toml/query +go build -o test_program_bin src/github.com/pelletier/go-toml/cmd/test_program.go + +# Run basic unit tests +go test github.com/pelletier/go-toml -covermode=count -coverprofile=coverage.out +go test github.com/pelletier/go-toml/cmd/tomljson +go test github.com/pelletier/go-toml/query + +# run the entire BurntSushi test suite +if [[ $# -eq 0 ]] ; then + echo "Running all BurntSushi tests" + ./toml-test ./test_program_bin | tee test_out +else + # run a specific test + test=$1 + test_path='src/github.com/BurntSushi/toml-test/tests' + valid_test="$test_path/valid/$test" + invalid_test="$test_path/invalid/$test" + + if [ -e "$valid_test.toml" ]; then + echo "Valid Test TOML for $test:" + echo "====" + cat "$valid_test.toml" + + echo "Valid Test JSON for $test:" + echo "====" + cat "$valid_test.json" + + echo "Go-TOML Output for $test:" + echo "====" + cat "$valid_test.toml" | ./test_program_bin + fi + + if [ -e "$invalid_test.toml" ]; then + echo "Invalid Test TOML for $test:" + echo "====" + cat "$invalid_test.toml" + + echo "Go-TOML Output for $test:" + echo "====" + echo "go-toml Output:" + cat "$invalid_test.toml" | ./test_program_bin + fi +fi diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go new file mode 100755 index 0000000..1a90813 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/token.go @@ -0,0 +1,144 @@ +package toml + +import ( + "fmt" + "strconv" + "unicode" +) + +// Define tokens +type tokenType int + +const ( + eof = -(iota + 1) +) + +const ( + tokenError tokenType = iota + tokenEOF + tokenComment + tokenKey + tokenString + tokenInteger + tokenTrue + tokenFalse + tokenFloat + tokenInf + tokenNan + tokenEqual + tokenLeftBracket + tokenRightBracket + tokenLeftCurlyBrace + tokenRightCurlyBrace + tokenLeftParen + tokenRightParen + tokenDoubleLeftBracket + tokenDoubleRightBracket + tokenDate + tokenKeyGroup + tokenKeyGroupArray + tokenComma + tokenColon + tokenDollar + tokenStar + tokenQuestion + tokenDot + tokenDotDot + tokenEOL +) + +var tokenTypeNames = []string{ + "Error", + "EOF", + "Comment", + "Key", + "String", + "Integer", + "True", + "False", + "Float", + "Inf", + "NaN", + "=", + "[", + "]", + "{", + "}", + "(", + ")", + "]]", + "[[", + "Date", + "KeyGroup", + "KeyGroupArray", + ",", + ":", + "$", + "*", + "?", + ".", + "..", + "EOL", +} + +type token struct { + Position + typ tokenType + val string +} + +func (tt tokenType) String() string { + idx := int(tt) + if idx < len(tokenTypeNames) { + return tokenTypeNames[idx] + } + return "Unknown" +} + +func (t token) Int() int { + if result, err := strconv.Atoi(t.val); err != nil { + panic(err) + } else { + return result + } +} + +func (t token) String() string { + switch t.typ { + case tokenEOF: + return "EOF" + case tokenError: + return t.val + } + + return fmt.Sprintf("%q", t.val) +} + +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +func isAlphanumeric(r rune) bool { + return unicode.IsLetter(r) || r == '_' +} + +func isKeyChar(r rune) bool { + // Keys start with the first character that isn't whitespace or [ and end + // with the last non-whitespace character before the equals sign. Keys + // cannot contain a # character." + return !(r == '\r' || r == '\n' || r == eof || r == '=') +} + +func isKeyStartChar(r rune) bool { + return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[') +} + +func isDigit(r rune) bool { + return unicode.IsNumber(r) +} + +func isHexDigit(r rune) bool { + return isDigit(r) || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go new file mode 100755 index 0000000..05493a4 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -0,0 +1,309 @@ +package toml + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "strings" +) + +type tomlValue struct { + value interface{} // string, int64, uint64, float64, bool, time.Time, [] of any of this list + comment string + commented bool + position Position +} + +// Tree is the result of the parsing of a TOML file. +type Tree struct { + values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree + comment string + commented bool + position Position +} + +func newTree() *Tree { + return &Tree{ + values: make(map[string]interface{}), + position: Position{}, + } +} + +// TreeFromMap initializes a new Tree object using the given map. +func TreeFromMap(m map[string]interface{}) (*Tree, error) { + result, err := toTree(m) + if err != nil { + return nil, err + } + return result.(*Tree), nil +} + +// Position returns the position of the tree. +func (t *Tree) Position() Position { + return t.position +} + +// Has returns a boolean indicating if the given key exists. +func (t *Tree) Has(key string) bool { + if key == "" { + return false + } + return t.HasPath(strings.Split(key, ".")) +} + +// HasPath returns true if the given path of keys exists, false otherwise. +func (t *Tree) HasPath(keys []string) bool { + return t.GetPath(keys) != nil +} + +// Keys returns the keys of the toplevel tree (does not recurse). +func (t *Tree) Keys() []string { + keys := make([]string, len(t.values)) + i := 0 + for k := range t.values { + keys[i] = k + i++ + } + return keys +} + +// Get the value at key in the Tree. +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// If you need to retrieve non-bare keys, use GetPath. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) Get(key string) interface{} { + if key == "" { + return t + } + return t.GetPath(strings.Split(key, ".")) +} + +// GetPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.value + default: + return node + } +} + +// GetPosition returns the position of the given key. +func (t *Tree) GetPosition(key string) Position { + if key == "" { + return t.position + } + return t.GetPositionPath(strings.Split(key, ".")) +} + +// GetPositionPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPositionPath(keys []string) Position { + if len(keys) == 0 { + return t.position + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return Position{0, 0} + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + subtree = node[len(node)-1] + default: + return Position{0, 0} + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.position + case *Tree: + return node.position + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + return node[len(node)-1].position + default: + return Position{0, 0} + } +} + +// GetDefault works like Get but with a default value +func (t *Tree) GetDefault(key string, def interface{}) interface{} { + val := t.Get(key) + if val == nil { + return def + } + return val +} + +// Set an element in the tree. +// Key is a dot-separated path (e.g. a.b.c). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) Set(key string, value interface{}) { + t.SetWithComment(key, "", false, value) +} + +// SetWithComment is the same as Set, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetWithComment(key string, comment string, commented bool, value interface{}) { + t.SetPathWithComment(strings.Split(key, "."), comment, commented, value) +} + +// SetPath sets an element in the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) SetPath(keys []string, value interface{}) { + t.SetPathWithComment(keys, "", false, value) +} + +// SetPathWithComment is the same as SetPath, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) { + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + nextTree = newTree() + subtree.values[intermediateKey] = nextTree // add new element here + } + switch node := nextTree.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + // create element if it does not exist + subtree.values[intermediateKey] = append(node, newTree()) + } + subtree = node[len(node)-1] + } + } + + var toInsert interface{} + + switch value.(type) { + case *Tree: + tt := value.(*Tree) + tt.comment = comment + toInsert = value + case []*Tree: + toInsert = value + case *tomlValue: + tt := value.(*tomlValue) + tt.comment = comment + toInsert = tt + default: + toInsert = &tomlValue{value: value, comment: comment, commented: commented} + } + + subtree.values[keys[len(keys)-1]] = toInsert +} + +// createSubTree takes a tree and a key and create the necessary intermediate +// subtrees to create a subtree at that point. In-place. +// +// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b] +// and tree[a][b][c] +// +// Returns nil on success, error object on failure +func (t *Tree) createSubTree(keys []string, pos Position) error { + subtree := t + for _, intermediateKey := range keys { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + tree := newTree() + tree.position = pos + subtree.values[intermediateKey] = tree + nextTree = tree + } + + switch node := nextTree.(type) { + case []*Tree: + subtree = node[len(node)-1] + case *Tree: + subtree = node + default: + return fmt.Errorf("unknown type for path %s (%s): %T (%#v)", + strings.Join(keys, "."), intermediateKey, nextTree, nextTree) + } + } + return nil +} + +// LoadBytes creates a Tree from a []byte. +func LoadBytes(b []byte) (tree *Tree, err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + err = errors.New(r.(string)) + } + }() + tree = parseToml(lexToml(b)) + return +} + +// LoadReader creates a Tree from any io.Reader. +func LoadReader(reader io.Reader) (tree *Tree, err error) { + inputBytes, err := ioutil.ReadAll(reader) + if err != nil { + return + } + tree, err = LoadBytes(inputBytes) + return +} + +// Load creates a Tree from a string. +func Load(content string) (tree *Tree, err error) { + return LoadBytes([]byte(content)) +} + +// LoadFile creates a Tree from a file. +func LoadFile(path string) (tree *Tree, err error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + return LoadReader(file) +} diff --git a/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/pelletier/go-toml/tomltree_create.go new file mode 100755 index 0000000..79610e9 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomltree_create.go @@ -0,0 +1,142 @@ +package toml + +import ( + "fmt" + "reflect" + "time" +) + +var kindToType = [reflect.String + 1]reflect.Type{ + reflect.Bool: reflect.TypeOf(true), + reflect.String: reflect.TypeOf(""), + reflect.Float32: reflect.TypeOf(float64(1)), + reflect.Float64: reflect.TypeOf(float64(1)), + reflect.Int: reflect.TypeOf(int64(1)), + reflect.Int8: reflect.TypeOf(int64(1)), + reflect.Int16: reflect.TypeOf(int64(1)), + reflect.Int32: reflect.TypeOf(int64(1)), + reflect.Int64: reflect.TypeOf(int64(1)), + reflect.Uint: reflect.TypeOf(uint64(1)), + reflect.Uint8: reflect.TypeOf(uint64(1)), + reflect.Uint16: reflect.TypeOf(uint64(1)), + reflect.Uint32: reflect.TypeOf(uint64(1)), + reflect.Uint64: reflect.TypeOf(uint64(1)), +} + +// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found. +// supported values: +// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32 +func typeFor(k reflect.Kind) reflect.Type { + if k > 0 && int(k) < len(kindToType) { + return kindToType[k] + } + return nil +} + +func simpleValueCoercion(object interface{}) (interface{}, error) { + switch original := object.(type) { + case string, bool, int64, uint64, float64, time.Time: + return original, nil + case int: + return int64(original), nil + case int8: + return int64(original), nil + case int16: + return int64(original), nil + case int32: + return int64(original), nil + case uint: + return uint64(original), nil + case uint8: + return uint64(original), nil + case uint16: + return uint64(original), nil + case uint32: + return uint64(original), nil + case float32: + return float64(original), nil + case fmt.Stringer: + return original.String(), nil + default: + return nil, fmt.Errorf("cannot convert type %T to Tree", object) + } +} + +func sliceToTree(object interface{}) (interface{}, error) { + // arrays are a bit tricky, since they can represent either a + // collection of simple values, which is represented by one + // *tomlValue, or an array of tables, which is represented by an + // array of *Tree. + + // holding the assumption that this function is called from toTree only when value.Kind() is Array or Slice + value := reflect.ValueOf(object) + insideType := value.Type().Elem() + length := value.Len() + if length > 0 { + insideType = reflect.ValueOf(value.Index(0).Interface()).Type() + } + if insideType.Kind() == reflect.Map { + // this is considered as an array of tables + tablesArray := make([]*Tree, 0, length) + for i := 0; i < length; i++ { + table := value.Index(i) + tree, err := toTree(table.Interface()) + if err != nil { + return nil, err + } + tablesArray = append(tablesArray, tree.(*Tree)) + } + return tablesArray, nil + } + + sliceType := typeFor(insideType.Kind()) + if sliceType == nil { + sliceType = insideType + } + + arrayValue := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, length) + + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return &tomlValue{value: arrayValue.Interface(), position: Position{}}, nil +} + +func toTree(object interface{}) (interface{}, error) { + value := reflect.ValueOf(object) + + if value.Kind() == reflect.Map { + values := map[string]interface{}{} + keys := value.MapKeys() + for _, key := range keys { + if key.Kind() != reflect.String { + if _, ok := key.Interface().(string); !ok { + return nil, fmt.Errorf("map key needs to be a string, not %T (%v)", key.Interface(), key.Kind()) + } + } + + v := value.MapIndex(key) + newValue, err := toTree(v.Interface()) + if err != nil { + return nil, err + } + values[key.String()] = newValue + } + return &Tree{values: values, position: Position{}}, nil + } + + if value.Kind() == reflect.Array || value.Kind() == reflect.Slice { + return sliceToTree(object) + } + + simpleValue, err := simpleValueCoercion(object) + if err != nil { + return nil, err + } + return &tomlValue{value: simpleValue, position: Position{}}, nil +} diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go new file mode 100755 index 0000000..d322a97 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -0,0 +1,289 @@ +package toml + +import ( + "bytes" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +// encodes a string to a TOML-compliant string value +func encodeTomlString(value string) string { + var b bytes.Buffer + + for _, rr := range value { + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString(`\t`) + case '\n': + b.WriteString(`\n`) + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString(`\r`) + case '"': + b.WriteString(`\"`) + case '\\': + b.WriteString(`\\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { + switch value := v.(type) { + case uint64: + return strconv.FormatUint(value, 10), nil + case int64: + return strconv.FormatInt(value, 10), nil + case float64: + // Ensure a round float does contain a decimal point. Otherwise feeding + // the output back to the parser would convert to an integer. + if math.Trunc(value) == value { + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + } + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + case string: + return "\"" + encodeTomlString(value) + "\"", nil + case []byte: + b, _ := v.([]byte) + return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + case bool: + if value { + return "true", nil + } + return "false", nil + case time.Time: + return value.Format(time.RFC3339), nil + case nil: + return "", nil + } + + rv := reflect.ValueOf(v) + + if rv.Kind() == reflect.Slice { + var values []string + for i := 0; i < rv.Len(); i++ { + item := rv.Index(i).Interface() + itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + if err != nil { + return "", err + } + values = append(values, itemRepr) + } + if arraysOneElementPerLine && len(values) > 1 { + stringBuffer := bytes.Buffer{} + valueIndent := indent + ` ` // TODO: move that to a shared encoder state + + stringBuffer.WriteString("[\n") + + for i, value := range values { + stringBuffer.WriteString(valueIndent) + stringBuffer.WriteString(value) + if i != len(values)-1 { + stringBuffer.WriteString(`,`) + } + stringBuffer.WriteString("\n") + } + + stringBuffer.WriteString(indent + "]") + + return stringBuffer.String(), nil + } + return "[" + strings.Join(values, ",") + "]", nil + } + return "", fmt.Errorf("unsupported value type %T: %v", v, v) +} + +func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { + simpleValuesKeys := make([]string, 0) + complexValuesKeys := make([]string, 0) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree, []*Tree: + complexValuesKeys = append(complexValuesKeys, k) + default: + simpleValuesKeys = append(simpleValuesKeys, k) + } + } + + sort.Strings(simpleValuesKeys) + sort.Strings(complexValuesKeys) + + for _, k := range simpleValuesKeys { + v, ok := t.values[k].(*tomlValue) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + + repr, err := tomlValueStringRepresentation(v.value, indent, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + + if v.comment != "" { + comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n") + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + + var commented string + if v.commented { + commented = "# " + } + writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + } + + for _, k := range complexValuesKeys { + v := t.values[k] + + combinedKey := k + if keyspace != "" { + combinedKey = keyspace + "." + combinedKey + } + var commented string + if t.commented { + commented = "# " + } + + switch node := v.(type) { + // node has to be of those two types given how keys are sorted above + case *Tree: + tv, ok := t.values[k].(*Tree) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + if tv.comment != "" { + comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + bytesCount, err = node.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + case []*Tree: + for _, subTree := range node { + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + + bytesCount, err = subTree.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + } + } + } + + return bytesCount, nil +} + +func writeStrings(w io.Writer, s ...string) (int, error) { + var n int + for i := range s { + b, err := io.WriteString(w, s[i]) + n += b + if err != nil { + return n, err + } + } + return n, nil +} + +// WriteTo encode the Tree as Toml and writes it to the writer w. +// Returns the number of bytes written in case of success, or an error if anything happened. +func (t *Tree) WriteTo(w io.Writer) (int64, error) { + return t.writeTo(w, "", "", 0, false) +} + +// ToTomlString generates a human-readable representation of the current tree. +// Output spans multiple lines, and is suitable for ingest by a TOML parser. +// If the conversion cannot be performed, ToString returns a non-nil error. +func (t *Tree) ToTomlString() (string, error) { + var buf bytes.Buffer + _, err := t.WriteTo(&buf) + if err != nil { + return "", err + } + return buf.String(), nil +} + +// String generates a human-readable representation of the current tree. +// Alias of ToString. Present to implement the fmt.Stringer interface. +func (t *Tree) String() string { + result, _ := t.ToTomlString() + return result +} + +// ToMap recursively generates a representation of the tree using Go built-in structures. +// The following types are used: +// +// * bool +// * float64 +// * int64 +// * string +// * uint64 +// * time.Time +// * map[string]interface{} (where interface{} is any of this list) +// * []interface{} (where interface{} is any of this list) +func (t *Tree) ToMap() map[string]interface{} { + result := map[string]interface{}{} + + for k, v := range t.values { + switch node := v.(type) { + case []*Tree: + var array []interface{} + for _, item := range node { + array = append(array, item.ToMap()) + } + result[k] = array + case *Tree: + result[k] = node.ToMap() + case *tomlValue: + result[k] = node.value + } + } + return result +} diff --git a/vendor/github.com/shopspring/decimal/README.md b/vendor/github.com/shopspring/decimal/README.md index be9cb5e..54c1a6b 100755 --- a/vendor/github.com/shopspring/decimal/README.md +++ b/vendor/github.com/shopspring/decimal/README.md @@ -24,30 +24,30 @@ Run `go get github.com/shopspring/decimal` package main import ( - "fmt" - "github.com/shopspring/decimal" + "fmt" + "github.com/shopspring/decimal" ) func main() { price, err := decimal.NewFromString("136.02") - if err != nil { - panic(err) - } + if err != nil { + panic(err) + } quantity := decimal.NewFromFloat(3) fee, _ := decimal.NewFromString(".035") taxRate, _ := decimal.NewFromString(".08875") - subtotal := price.Mul(quantity) + subtotal := price.Mul(quantity) - preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) + preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) - total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) + total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 - fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 + fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 fmt.Println("Total:", total) // Total: 459.824961375 fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 } diff --git a/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/shopspring/decimal/decimal.go index 1729b61..20aa608 100755 --- a/vendor/github.com/shopspring/decimal/decimal.go +++ b/vendor/github.com/shopspring/decimal/decimal.go @@ -55,10 +55,16 @@ var MarshalJSONWithoutQuotes = false // Zero constant, to make computations faster. var Zero = New(0, 1) +// fiveDec used in Cash Rounding +var fiveDec = New(5, 0) + var zeroInt = big.NewInt(0) var oneInt = big.NewInt(1) +var twoInt = big.NewInt(2) +var fourInt = big.NewInt(4) var fiveInt = big.NewInt(5) var tenInt = big.NewInt(10) +var twentyInt = big.NewInt(20) // Decimal represents a fixed-point decimal. It is immutable. // number = value * 10 ^ exp @@ -147,6 +153,22 @@ func NewFromString(value string) (Decimal, error) { }, nil } +// RequireFromString returns a new Decimal from a string representation +// or panics if NewFromString would have returned an error. +// +// Example: +// +// d := RequireFromString("-123.45") +// d2 := RequireFromString(".0001") +// +func RequireFromString(value string) Decimal { + dec, err := NewFromString(value) + if err != nil { + panic(err) + } + return dec +} + // NewFromFloat converts a float64 to Decimal. // // Example: @@ -154,24 +176,12 @@ func NewFromString(value string) (Decimal, error) { // NewFromFloat(123.45678901234567).String() // output: "123.4567890123456" // NewFromFloat(.00000000000000001).String() // output: "0.00000000000000001" // +// NOTE: some float64 numbers can take up about 300 bytes of memory in decimal representation. +// Consider using NewFromFloatWithExponent if space is more important than precision. +// // NOTE: this will panic on NaN, +/-inf func NewFromFloat(value float64) Decimal { - floor := math.Floor(value) - - // fast path, where float is an int - if floor == value && value <= math.MaxInt64 && value >= math.MinInt64 { - return New(int64(value), 0) - } - - // slow path: float is a decimal - // HACK(vadim): do this the slow hacky way for now because the logic to - // convert a base-2 float to base-10 properly is not trivial - str := strconv.FormatFloat(value, 'f', -1, 64) - dec, err := NewFromString(str) - if err != nil { - panic(err) - } - return dec + return NewFromFloatWithExponent(value, math.MinInt32) } // NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary @@ -182,15 +192,82 @@ func NewFromFloat(value float64) Decimal { // NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" // func NewFromFloatWithExponent(value float64, exp int32) Decimal { - mul := math.Pow(10, -float64(exp)) - floatValue := value * mul - if math.IsNaN(floatValue) || math.IsInf(floatValue, 0) { - panic(fmt.Sprintf("Cannot create a Decimal from %v", floatValue)) + if math.IsNaN(value) || math.IsInf(value, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) + } + + bits := math.Float64bits(value) + mant := bits & (1<<52 - 1) + exp2 := int32((bits >> 52) & (1<<11 - 1)) + sign := bits >> 63 + + if exp2 == 0 { + // specials + if mant == 0 { + return Decimal{} + } else { + // subnormal + exp2++ + } + } else { + // normal + mant |= 1 << 52 + } + + exp2 -= 1023 + 52 + + // normalizing base-2 values + for mant&1 == 0 { + mant = mant >> 1 + exp2++ + } + + // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 + if exp < 0 && exp < exp2 { + if exp2 < 0 { + exp = exp2 + } else { + exp = 0 + } + } + + // representing 10^M * 2^N as 5^M * 2^(M+N) + exp2 -= exp + + temp := big.NewInt(1) + dMant := big.NewInt(int64(mant)) + + // applying 5^M + if exp > 0 { + temp = temp.SetInt64(int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + } else if exp < 0 { + temp = temp.SetInt64(-int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + dMant = dMant.Mul(dMant, temp) + temp = temp.SetUint64(1) + } + + // applying 2^(M+N) + if exp2 > 0 { + dMant = dMant.Lsh(dMant, uint(exp2)) + } else if exp2 < 0 { + temp = temp.Lsh(temp, uint(-exp2)) + } + + // rounding and downscaling + if exp > 0 || exp2 < 0 { + halfDown := new(big.Int).Rsh(temp, 1) + dMant = dMant.Add(dMant, halfDown) + dMant = dMant.Quo(dMant, temp) + } + + if sign == 1 { + dMant = dMant.Neg(dMant) } - dValue := big.NewInt(round(floatValue)) return Decimal{ - value: dValue, + value: dMant, exp: exp, } } @@ -272,6 +349,7 @@ func (d Decimal) Sub(d2 Decimal) Decimal { // Neg returns -d. func (d Decimal) Neg() Decimal { + d.ensureInitialized() val := new(big.Int).Neg(d.value) return Decimal{ value: val, @@ -557,6 +635,13 @@ func (d Decimal) StringFixedBank(places int32) string { return rounded.string(false) } +// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For +// more details see the documentation at function RoundCash. +func (d Decimal) StringFixedCash(interval uint8) string { + rounded := d.RoundCash(interval) + return rounded.string(false) +} + // Round rounds the decimal to places decimal places. // If places < 0, it will round the integer part to the nearest 10^(-places). // @@ -606,7 +691,8 @@ func (d Decimal) RoundBank(places int32) Decimal { round := d.Round(places) remainder := d.Sub(round).Abs() - if remainder.value.Cmp(fiveInt) == 0 && round.value.Bit(0) != 0 { + half := New(5, -places-1) + if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { if round.value.Sign() < 0 { round.value.Add(round.value, oneInt) } else { @@ -617,10 +703,62 @@ func (d Decimal) RoundBank(places int32) Decimal { return round } +// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific +// interval. The amount payable for a cash transaction is rounded to the nearest +// multiple of the minimum currency unit available. The following intervals are +// available: 5, 10, 15, 25, 50 and 100; any other number throws a panic. +// 5: 5 cent rounding 3.43 => 3.45 +// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) +// 15: 10 cent rounding 3.45 => 3.40 (5 gets rounded down) +// 25: 25 cent rounding 3.41 => 3.50 +// 50: 50 cent rounding 3.75 => 4.00 +// 100: 100 cent rounding 3.50 => 4.00 +// For more details: https://en.wikipedia.org/wiki/Cash_rounding +func (d Decimal) RoundCash(interval uint8) Decimal { + var iVal *big.Int + switch interval { + case 5: + iVal = twentyInt + case 10: + iVal = tenInt + case 15: + if d.exp < 0 { + // TODO: optimize and reduce allocations + orgExp := d.exp + dOne := New(10^-int64(orgExp), orgExp) + d2 := d + d2.exp = 0 + if d2.Mod(fiveDec).Equal(Zero) { + d2.exp = orgExp + d2 = d2.Sub(dOne) + d = d2 + } + } + iVal = tenInt + case 25: + iVal = fourInt + case 50: + iVal = twoInt + case 100: + iVal = oneInt + default: + panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 15, 25, 50, 100", interval)) + } + dVal := Decimal{ + value: iVal, + } + // TODO: optimize those calculations to reduce the high allocations (~29 allocs). + return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) +} + // Floor returns the nearest integer value less than or equal to d. func (d Decimal) Floor() Decimal { d.ensureInitialized() + if d.exp >= 0 { + return d + } + exp := big.NewInt(10) // NOTE(vadim): must negate after casting to prevent int32 overflow @@ -634,6 +772,10 @@ func (d Decimal) Floor() Decimal { func (d Decimal) Ceil() Decimal { d.ensureInitialized() + if d.exp >= 0 { + return d + } + exp := big.NewInt(10) // NOTE(vadim): must negate after casting to prevent int32 overflow @@ -901,13 +1043,6 @@ func min(x, y int32) int32 { return x } -func round(n float64) int64 { - if n < 0 { - return int64(n - 0.5) - } - return int64(n + 0.5) -} - func unquoteIfQuoted(value interface{}) (string, error) { var bytes []byte @@ -928,8 +1063,8 @@ func unquoteIfQuoted(value interface{}) (string, error) { return string(bytes), nil } -// NullDecimal represents a fixed-point decimal. It is immutable. -// number = value * 10 ^ exp +// NullDecimal represents a nullable decimal with compatibility for +// scanning null values from the database. type NullDecimal struct { Decimal Decimal Valid bool @@ -952,3 +1087,21 @@ func (d NullDecimal) Value() (driver.Value, error) { } return d.Decimal.Value() } + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.UnmarshalJSON(decimalBytes) +} + +// MarshalJSON implements the json.Marshaler interface. +func (d NullDecimal) MarshalJSON() ([]byte, error) { + if !d.Valid { + return []byte("null"), nil + } + return d.Decimal.MarshalJSON() +} diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/add-key.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/add-key.sh new file mode 100755 index 0000000..b051270 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/add-key.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +KEY_CHAIN=login.keychain +echo "security create keychain" +security create-keychain -p travis $KEY_CHAIN +# Make the keychain the default so identities are found +echo "security default-keychain" +security default-keychain -s $KEY_CHAIN +# Unlock the keychain +echo "unlock the keychain" +security unlock-keychain -p travis $KEY_CHAIN +# Set keychain locking timeout to 3600 seconds +echo "set keychain locking timeout to 3600" +security set-keychain-settings -t 3600 -u $KEY_CHAIN + +# Add certificates to keychain and allow codesign to access them +# security import ./electron/ci-scripts/certs/dist.cer -k $KEY_CHAIN -T /usr/bin/codesign +# security import ./electron/ci-scripts/certs/dev.cer -k $KEY_CHAIN -T /usr/bin/codesign +echo "import distp12" +security import $GOPATH/src/github.com/skycoin/skycoin/ci-scripts/certs/dist.p12 -k $KEY_CHAIN -P $CERT_PWD -A /usr/bin/codesign +# security import ./scripts/certs/dev.p12 -k $KEY_CHAIN -P DEVELOPMENT_KEY_PASSWORD -T /usr/bin/codesign +echo "set key partition list" +security set-key-partition-list -S apple-tool:,apple: -s -k travis $KEY_CHAIN + +echo "list keychains: " +security list-keychains +echo " ****** " + +echo "find indentities keychains: " +security find-identity -p codesigning ~/Library/Keychains/$KEY_CHAIN +echo " ****** " diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/build-wallet.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/build-wallet.sh new file mode 100755 index 0000000..8c1210d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/build-wallet.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +echo "start to build wallets..." +pushd "electron" +if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./build.sh 'linux/amd64 linux/arm' ;fi +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./build.sh 'darwin/amd64' ;fi +ls release/ +popd \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/certs/dist.p12 b/vendor/github.com/skycoin/skycoin/ci-scripts/certs/dist.p12 new file mode 100755 index 0000000..03e1889 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/ci-scripts/certs/dist.p12 differ diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-gui.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-gui.sh new file mode 100755 index 0000000..9c80af3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-gui.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Runs "disable-gui"-mode tests against a skycoin node configured with -enable-gui=false +# and /api/v1/api endpoint should return 404 Not Found error + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-gui" +BINARY="skycoin-integration" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-wallet-api=true \ + -enable-seed-api=true \ + -enable-gui=false& +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +else + exit 0 +fi \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-wallet-api.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-wallet-api.sh new file mode 100755 index 0000000..d49c697 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-disable-wallet-api.sh @@ -0,0 +1,105 @@ +#!/bin/bash +# Runs "disable-wallet-api"-mode tests against a skycoin node configured with -enable-wallet-api=false +# "disable-wallet-api"-mode confirms that no wallet related apis work, that the main index.html page +# does not load, and that a new wallet file is not created. + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="disable-wallet-api" +BINARY="skycoin-integration" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +FAILFAST="" + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-f -- Run test with -failfast flag" + exit 1 +} + +while getopts "h?t:r:uvf" args; do + case $args in + h|\?) + usage; + exit;; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + f ) FAILFAST="-failfast" + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" -ldflags "${GOLDFLAGS}" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-unversioned-api=true \ + -enable-wallet-api=false & +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test ./src/api/integration/... $FAILFAST $UPDATE -timeout=30s $VERBOSE $RUN_TESTS + +FAIL=$? + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + +exit $FAIL diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-enable-seed-api.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-enable-seed-api.sh new file mode 100755 index 0000000..3614699 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-enable-seed-api.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# Runs "enable-seed-api"-mode tests against a skycoin node configured with -enable-seed-api=true +# and /api/v1/wallet/seed api endpoint should return coresponding seed + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="enable-seed-api" +BINARY="skycoin-integration" +TEST="" +RUN_TESTS="" +# run go test with -v flag +VERBOSE="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-v -- Run test with -v flag" + exit 1 +} + +while getopts "h?t:r:v" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + v ) VERBOSE="-v";; + r ) RUN_TESTS="-run ${OPTARG}";; + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -wallet-dir="$WALLET_DIR" \ + -enable-wallet-api=true \ + -enable-seed-api=true & +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST WALLET_DIR=$WALLET_DIR \ + go test ./src/api/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +# SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR \ +# go test ./src/cli/integration/... -timeout=30s $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-live.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-live.sh new file mode 100755 index 0000000..525f975 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-live.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +# Runs "live"-mode tests against a skycoin node that is already running +# "live" mode tests assume the blockchain data is active and may change at any time +# Data is checked for the appearance of correctness but the values themselves are not verified +# The skycoin node must be run with -enable-wallet-api=true + +#Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` +PORT="6420" +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="live" +TEST="" +UPDATE="" +TIMEOUT="10m" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +# run wallet tests +TEST_LIVE_WALLET="" +# run tests with csrf enabled +USE_CSRF="" +FAILFAST="" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-w -- Run wallet tests." + echo "-f -- Run test with -failfast flag" + echo "-c -- Run tests with CSRF enabled. If not set, node must be run with -disable-csrf" + exit 1 +} + +while getopts "h?t:r:uvwfc" args; do +case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + w ) TEST_LIVE_WALLET="--test-live-wallet";; + f ) FAILFAST="-failfast";; + c ) USE_CSRF="1" + esac +done + +set -euxo pipefail + +echo "checking if skycoin node is running" + +HEALTH="$HOST/api/v1/health" + +http_proxy="" https_proxy="" wget -O- $HEALTH 2>&1 >/dev/null + +if [ ! $? -eq 0 ]; then + echo "Skycoin node is not running on $HOST" + exit 1 +fi + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + go test ./src/api/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR SKYCOIN_NODE_HOST=$HOST USE_CSRF=$USE_CSRF \ + go test ./src/cli/integration/... $FAILFAST $UPDATE -timeout=$TIMEOUT $VERBOSE $RUN_TESTS $TEST_LIVE_WALLET + +fi diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-stable.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-stable.sh new file mode 100755 index 0000000..20ff4e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/integration-test-stable.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# Runs "stable"-mode tests against a skycoin node configured with a pinned database +# "stable" mode tests assume the blockchain data is static, in order to check API responses more precisely +# $TEST defines which test to run i.e, cli or api; If empty both are run + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_PORT="$PORT" +HOST="http://127.0.0.1:$PORT" +RPC_ADDR="http://127.0.0.1:$RPC_PORT" +MODE="stable" +BINARY="skycoin-integration" +TEST="" +UPDATE="" +# run go test with -v flag +VERBOSE="" +# run go test with -run flag +RUN_TESTS="" +# run tests with csrf enabled +USE_CSRF="" +DISABLE_CSRF="-disable-csrf" + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +usage () { + echo "Usage: $SCRIPT" + echo "Optional command line arguments" + echo "-t -- Test to run, api or cli; empty runs both tests" + echo "-r -- Run test with -run flag" + echo "-u -- Update stable testdata" + echo "-v -- Run test with -v flag" + echo "-c -- Run tests with CSRF enabled" + exit 1 +} + +while getopts "h?t:r:uvc" args; do + case $args in + h|\?) + usage; + exit;; + t ) TEST=${OPTARG};; + r ) RUN_TESTS="-run ${OPTARG}";; + u ) UPDATE="--update";; + v ) VERBOSE="-v";; + c ) USE_CSRF="1"; DISABLE_CSRF=""; + esac +done + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Compile the skycoin node +# We can't use "go run" because this creates two processes which doesn't allow us to kill it at the end +echo "compiling skycoin" +go build -o "$BINARY" -ldflags "${GOLDFLAGS}" cmd/skycoin/skycoin.go + +# Run skycoin node with pinned blockchain database +echo "starting skycoin node in background with http listener on $HOST" + +./skycoin-integration -disable-networking=true \ + -web-interface-port=$PORT \ + -download-peerlist=false \ + -db-path=./src/api/integration/testdata/blockchain-180.db \ + -db-read-only=true \ + -rpc-interface=true \ + -launch-browser=false \ + -data-dir="$DATA_DIR" \ + -enable-wallet-api=true \ + -wallet-dir="$WALLET_DIR" \ + $DISABLE_CSRF & +SKYCOIN_PID=$! + +echo "skycoin node pid=$SKYCOIN_PID" + +echo "sleeping for startup" +sleep 3 +echo "done sleeping" + +set +e + +if [[ -z $TEST || $TEST = "api" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE SKYCOIN_NODE_HOST=$HOST \ + go test ./src/api/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS + +API_FAIL=$? + +fi + +if [[ -z $TEST || $TEST = "cli" ]]; then + +SKYCOIN_INTEGRATION_TESTS=1 SKYCOIN_INTEGRATION_TEST_MODE=$MODE RPC_ADDR=$RPC_ADDR USE_CSRF=$USE_CSRF \ + go test ./src/cli/integration/... $UPDATE -timeout=3m $VERBOSE $RUN_TESTS + +CLI_FAIL=$? + +fi + + +echo "shutting down skycoin node" + +# Shutdown skycoin node +kill -s SIGINT $SKYCOIN_PID +wait $SKYCOIN_PID + +rm "$BINARY" + + +if [[ (-z $TEST || $TEST = "api") && $API_FAIL -ne 0 ]]; then + exit $API_FAIL +elif [[ (-z $TEST || $TEST = "cli") && $CLI_FAIL -ne 0 ]]; then + exit $CLI_FAIL +else + exit 0 +fi +# exit $FAIL diff --git a/vendor/github.com/skycoin/skycoin/ci-scripts/ui-e2e.sh b/vendor/github.com/skycoin/skycoin/ci-scripts/ui-e2e.sh new file mode 100755 index 0000000..b5878b8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/ci-scripts/ui-e2e.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Runs UI e2e tests against a skycoin node configured with a pinned database + +# Set Script Name variable +SCRIPT=`basename ${BASH_SOURCE[0]}` + +# Find unused port +PORT="1024" +while $(lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null) ; do + PORT=$((PORT+1)) +done + +RPC_ADDR="127.0.0.1:$PORT" +HOST="http://127.0.0.1:$PORT" +BINARY="skycoin-integration" +E2E_PROXY_CONFIG=$(mktemp -t e2e-proxy.config.XXXXXX.js) + +COMMIT=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +GOLDFLAGS="-X main.Commit=${COMMIT} -X main.Branch=${BRANCH}" + +set -euxo pipefail + +DATA_DIR=$(mktemp -d -t skycoin-data-dir.XXXXXX) +WALLET_DIR="${DATA_DIR}/wallets" + +if [[ ! "$DATA_DIR" ]]; then + echo "Could not create temp dir" + exit 1 +fi + +# Create a dummy wallet with an address existing in the blockchain-180.db dataset +mkdir "$WALLET_DIR" +cat >"${WALLET_DIR}/test_wallet.wlt" <$E2E_PROXY_CONFIG < + +//Base64 char table function - used internally for decoding +unsigned int b64_int(unsigned int ch); + +// in_size : the number bytes to be encoded. +// Returns the recommended memory size to be allocated for the output buffer excluding the null byte +unsigned int b64e_size(unsigned int in_size); + +// in_size : the number bytes to be decoded. +// Returns the recommended memory size to be allocated for the output buffer +unsigned int b64d_size(unsigned int in_size); + +// in : buffer of "raw" binary to be encoded. +// in_len : number of bytes to be encoded. +// out : pointer to buffer with enough memory, user is responsible for memory allocation, receives null-terminated string +// returns size of output including null byte +unsigned int b64_encode(const unsigned char* in, unsigned int in_len, unsigned char* out); + +// in : buffer of base64 string to be decoded. +// in_len : number of bytes to be decoded. +// out : pointer to buffer with enough memory, user is responsible for memory allocation, receives "raw" binary +// returns size of output excluding null byte +unsigned int b64_decode(const unsigned char* in, unsigned int in_len, unsigned char* out); + +// file-version b64_encode +// Input : filenames +// returns size of output +unsigned int b64_encodef(char *InFile, char *OutFile); + +// file-version b64_decode +// Input : filenames +// returns size of output +unsigned int b64_decodef(char *InFile, char *OutFile); + diff --git a/vendor/github.com/skycoin/skycoin/include/cipher.address.go.h b/vendor/github.com/skycoin/skycoin/include/cipher.address.go.h new file mode 100755 index 0000000..462feb9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/cipher.address.go.h @@ -0,0 +1,14 @@ +/** + * Integrity checksum, 4-bytes long. + */ +typedef unsigned char cipher__Checksum[4]; + +/** + * Addresses of SKY accounts + */ +typedef struct { + unsigned char Version; ///< Address version identifier. + ///< Used to differentiate testnet + ///< vs mainnet addresses, for instance. + cipher__Ripemd160 Key; ///< Address hash identifier. +} cipher__Address; diff --git a/vendor/github.com/skycoin/skycoin/include/cipher.crypto.go.h b/vendor/github.com/skycoin/skycoin/include/cipher.crypto.go.h new file mode 100755 index 0000000..17f3923 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/cipher.crypto.go.h @@ -0,0 +1,20 @@ +/** + * Hash signed using a secret key, 65 bytes long. + */ +typedef unsigned char cipher__Sig[65]; + +/** + * Public key, 33-bytes long. + */ +typedef unsigned char cipher__PubKey[33]; + +/** + * Container type suitable for storing a variable number of + * public keys. + */ +typedef GoSlice_ cipher__PubKeySlice; + +/** + * Secret key, 32 bytes long. + */ +typedef unsigned char cipher__SecKey[32]; diff --git a/vendor/github.com/skycoin/skycoin/include/cipher.hash.go.h b/vendor/github.com/skycoin/skycoin/include/cipher.hash.go.h new file mode 100755 index 0000000..8746569 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/cipher.hash.go.h @@ -0,0 +1,9 @@ +/** + * Hash obtained using SHA256 algorithm, 32 bytes long. + */ +typedef unsigned char cipher__SHA256[32]; + +/** + * RIPEMD-160 hash. + */ +typedef unsigned char cipher__Ripemd160[20]; diff --git a/vendor/github.com/skycoin/skycoin/include/cipher.testsuite.testsuite.go.h b/vendor/github.com/skycoin/skycoin/include/cipher.testsuite.testsuite.go.h new file mode 100755 index 0000000..0802f98 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/cipher.testsuite.testsuite.go.h @@ -0,0 +1,99 @@ + +#ifndef CIPHER_TESTSUITE_TESTSUITE +#define CIPHER_TESTSUITE_TESTSUITE + +#include +#include + +#include "base64.h" +#include "json.h" +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +#define BUFFER_SIZE 1024 +#define STRING_SIZE 128 +#define JSON_FILE_SIZE 4096 +#define JSON_BIG_FILE_SIZE 32768 + +// FIXME: Does not work on e.g. Windowa +#define FILEPATH_SEPARATOR "/" +#define TEST_DATA_DIR "src/cipher/testsuite/testdata/" +#define MANY_ADDRESSES_FILENAME "many-addresses.golden" +#define INPUT_HASHES_FILENAME "input-hashes.golden" +#define SEED_FILE_REGEX "seed-\d+.golden" + +//------------------------------------------------------------------------------ +// Data types +//------------------------------------------------------------------------------ + +// InputTestData contains hashes to be signed +typedef struct { + // Slice data is an array of cipher.SHA256's + GoSlice Hashes; +} InputTestData; + +// InputTestDataJSON contains hashes to be signed +typedef struct { + // Slice data is an array of GoString's + GoSlice Hashes; +} InputTestDataJSON; + +// KeysTestData contains address, public key, secret key and list of signatures +typedef struct { + cipher__Address Address; + cipher__SecKey Secret; + cipher__PubKey Public; + // Slice data is an array of cipher.Sig's + GoSlice Signatures; +} KeysTestData; + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +typedef struct { + GoString Address; + GoString Secret; + GoString Public; + // Slice data is an array of GoString's + GoSlice Signatures; +} KeysTestDataJSON; + +// SeedTestDataJSON contains data generated by Seed +typedef struct { + GoString Seed; + // Slice data is an array of KeysTestDataJSON's + GoSlice Keys; +} SeedTestDataJSON; + +// SeedTestData contains data generated by Seed +typedef struct { + // Slice data is a bytes array buffer + GoSlice Seed; + // Slice data is an array of KeysTestData + GoSlice Keys; +} SeedTestData; + +//------------------------------------------------------------------------------ +// Functions +//------------------------------------------------------------------------------ + +json_value* loadGoldenFile(const char* file); +InputTestDataJSON* jsonToInputTestData(json_value* json, InputTestDataJSON* input_data); +InputTestData* registerInputTestDataCleanup(InputTestData* input_data); +InputTestDataJSON* registerInputTestDataJSONCleanup(InputTestDataJSON* input_data); +void InputTestDataToJSON(InputTestData* input_data, InputTestDataJSON* json_data); +GoUint32 InputTestDataFromJSON(InputTestDataJSON* json_data, InputTestData* input_data); +KeysTestDataJSON* jsonToKeysTestData(json_value* json, KeysTestDataJSON* input_data); +KeysTestData* registerKeysTestDataCleanup(KeysTestData* input_data); +KeysTestDataJSON* registerKeysTestDataJSONCleanup(KeysTestDataJSON* input_data); +void KeysTestDataToJson(KeysTestData* input_data, KeysTestDataJSON* json_data); +GoUint32 KeysTestDataFromJSON(KeysTestDataJSON* json_data, KeysTestData* input_data); +SeedTestDataJSON* jsonToSeedTestData(json_value* json, SeedTestDataJSON* input_data); +SeedTestData* registerSeedTestDataCleanup(SeedTestData* input_data); +SeedTestDataJSON* registerSeedTestDataJSONCleanup(SeedTestDataJSON* input_data); +void SeedTestDataToJson(SeedTestData* input_data, SeedTestDataJSON* json_data); +GoUint32 SeedTestDataFromJSON(SeedTestDataJSON* json_data, SeedTestData* input_data); +void ValidateSeedData(SeedTestData* seedData, InputTestData* inputData); + +#endif + diff --git a/vendor/github.com/skycoin/skycoin/include/cli.create_rawtx.go.h b/vendor/github.com/skycoin/skycoin/include/cli.create_rawtx.go.h new file mode 100755 index 0000000..48dfa5c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/cli.create_rawtx.go.h @@ -0,0 +1,7 @@ +/** + * Structure used to specify amounts transferred in a transaction. + */ +typedef struct { + GoString_ Addr; ///< Sender / receipient address. + GoInt64_ Coins; ///< Amount transferred (e.g. measured in SKY) +} cli__SendAmount; diff --git a/vendor/github.com/skycoin/skycoin/include/coin.outputs.go.h b/vendor/github.com/skycoin/skycoin/include/coin.outputs.go.h new file mode 100755 index 0000000..2893219 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/coin.outputs.go.h @@ -0,0 +1,18 @@ +typedef struct{ + GoUint64_ Time; + GoUint64_ BkSeq; +} coin__UxHead; + +typedef GoSlice_ coin__UxArray; + +typedef struct{ + cipher__SHA256 SrcTransaction; + cipher__Address Address; + GoUint64_ Coins; + GoUint64_ Hours; +} coin__UxBody; + +typedef struct{ + coin__UxHead Head; + coin__UxBody Body; +} coin__UxOut; diff --git a/vendor/github.com/skycoin/skycoin/include/coin.transactions.go.h b/vendor/github.com/skycoin/skycoin/include/coin.transactions.go.h new file mode 100755 index 0000000..0fa66ca --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/coin.transactions.go.h @@ -0,0 +1,25 @@ +/** + * Skycoin transaction output. + * + * Instances are integral part of transactions included in blocks. + */ +typedef struct { + cipher__Address Address; ///< Receipient address. + GoInt64_ Coins; ///< Amount sent to the receipient address. + GoInt64_ Hours; ///< Amount of Coin Hours sent to the receipient address. +} coin__TransactionOutput; + +/** + * Skycoin transaction. + * + * Instances of this struct are included in blocks. + */ +typedef struct { + GoInt32_ Length; ///< Current transaction's length expressed in bytes. + GoInt8_ Type; ///< Transaction's version. When a node tries to process a transaction, it must verify whether it supports the transaction's type. This is intended to provide a way to update skycoin clients and servers without crashing the network. If the transaction is not compatible with the node, it should not process it. + cipher__SHA256 InnerHash; ///< It's a SHA256 hash of the inputs and outputs of the transaction. It is used to protect against transaction mutability. This means that the transaction cannot be altered after its creation. + + GoSlice_ Sigs; ///< A list of digital signiatures generated by the skycoin client using the private key. It is used by Skycoin servers to verify the authenticy of the transaction. Each input requires a different signature. + GoSlice_ In; ///< A list of references to unspent transaction outputs. Unlike other cryptocurrencies, such as Bitcoin, Skycoin unspent transaction outputs (UX) and Skycoin transactions (TX) are separated in the blockchain protocol, allowing for lighter transactions, thus reducing the broadcasting costs across the network. + GoSlice_ Out; ///< Outputs: A list of outputs created by the client, that will be recorded in the blockchain if transactions are confirmed. An output consists of a data structure representing an UTXT, which is composed by a Skycoin address to be sent to, the amount in Skycoin to be sent, and the amount of Coin Hours to be sent, and the SHA256 hash of the previous fields. +} coin__Transaction; diff --git a/vendor/github.com/skycoin/skycoin/include/json.h b/vendor/github.com/skycoin/skycoin/include/json.h new file mode 100755 index 0000000..c00193a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/json.h @@ -0,0 +1,283 @@ + +/* vim: set et ts=3 sw=3 sts=3 ft=c: + * + * Copyright (C) 2012, 2013, 2014 James McLaughlin et al. All rights reserved. + * https://github.com/udp/json-parser + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _JSON_H +#define _JSON_H + +#ifndef json_char + #define json_char char +#endif + +#ifndef json_int_t + #ifndef _MSC_VER + #include + #define json_int_t int64_t + #else + #define json_int_t __int64 + #endif +#endif + +#include + +#ifdef __cplusplus + + #include + + extern "C" + { + +#endif + +typedef struct +{ + unsigned long max_memory; + int settings; + + /* Custom allocator support (leave null to use malloc/free) + */ + + void * (* mem_alloc) (size_t, int zero, void * user_data); + void (* mem_free) (void *, void * user_data); + + void * user_data; /* will be passed to mem_alloc and mem_free */ + + size_t value_extra; /* how much extra space to allocate for values? */ + +} json_settings; + +#define json_enable_comments 0x01 + +typedef enum +{ + json_none, + json_object, + json_array, + json_integer, + json_double, + json_string, + json_boolean, + json_null + +} json_type; + +extern const struct _json_value json_value_none; + +typedef struct _json_object_entry +{ + json_char * name; + unsigned int name_length; + + struct _json_value * value; + +} json_object_entry; + +typedef struct _json_value +{ + struct _json_value * parent; + + json_type type; + + union + { + int boolean; + json_int_t integer; + double dbl; + + struct + { + unsigned int length; + json_char * ptr; /* null terminated */ + + } string; + + struct + { + unsigned int length; + + json_object_entry * values; + + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin () const + { return values; + } + decltype(values) end () const + { return values + length; + } + #endif + + } object; + + struct + { + unsigned int length; + struct _json_value ** values; + + #if defined(__cplusplus) && __cplusplus >= 201103L + decltype(values) begin () const + { return values; + } + decltype(values) end () const + { return values + length; + } + #endif + + } array; + + } u; + + union + { + struct _json_value * next_alloc; + void * object_mem; + + } _reserved; + + #ifdef JSON_TRACK_SOURCE + + /* Location of the value in the source JSON + */ + unsigned int line, col; + + #endif + + + /* Some C++ operator sugar */ + + #ifdef __cplusplus + + public: + + inline _json_value () + { memset (this, 0, sizeof (_json_value)); + } + + inline const struct _json_value &operator [] (int index) const + { + if (type != json_array || index < 0 + || ((unsigned int) index) >= u.array.length) + { + return json_value_none; + } + + return *u.array.values [index]; + } + + inline const struct _json_value &operator [] (const char * index) const + { + if (type != json_object) + return json_value_none; + + for (unsigned int i = 0; i < u.object.length; ++ i) + if (!strcmp (u.object.values [i].name, index)) + return *u.object.values [i].value; + + return json_value_none; + } + + inline operator const char * () const + { + switch (type) + { + case json_string: + return u.string.ptr; + + default: + return ""; + }; + } + + inline operator json_int_t () const + { + switch (type) + { + case json_integer: + return u.integer; + + case json_double: + return (json_int_t) u.dbl; + + default: + return 0; + }; + } + + inline operator BOOL () const + { + if (type != json_boolean) + return false; + + return u.boolean != 0; + } + + inline operator double () const + { + switch (type) + { + case json_integer: + return (double) u.integer; + + case json_double: + return u.dbl; + + default: + return 0; + }; + } + + #endif + +} json_value; + +json_value * json_parse (const json_char * json, + size_t length); + +#define json_error_max 128 +json_value * json_parse_ex (json_settings * settings, + const json_char * json, + size_t length, + char * error); + +void json_value_free (json_value *); + + +/* Not usually necessary, unless you used a custom mem_alloc and now want to + * use a custom mem_free. + */ +void json_value_free_ex (json_settings * settings, + json_value *); + + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif + + diff --git a/vendor/github.com/skycoin/skycoin/include/skycriterion.h b/vendor/github.com/skycoin/skycoin/include/skycriterion.h new file mode 100755 index 0000000..ecdf227 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/skycriterion.h @@ -0,0 +1,36 @@ +#ifndef LIBCRITERION_H +#define LIBCRITERION_H + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" + +extern int cr_user_cipher__Address_eq(cipher__Address *addr1, cipher__Address *addr2); +extern char *cr_user_cipher__Address_tostr(cipher__Address *addr1); +extern int cr_user_cipher__Address_noteq(cipher__Address *addr1, cipher__Address *addr2); + +extern int cr_user_GoString_eq(GoString *string1, GoString *string2); +extern int cr_user_GoString__eq(GoString_ *string1, GoString_ *string2); + +extern char *cr_user_GoString_tostr(GoString *string); +extern char *cr_user_GoString__tostr(GoString_ *string) ; + +extern int cr_user_cipher__SecKey_eq(cipher__SecKey *seckey1, cipher__SecKey *seckey2); +extern char *cr_user_cipher__SecKey_tostr(cipher__SecKey *seckey1); + +extern int cr_user_cipher__Ripemd160_noteq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2); +extern int cr_user_cipher__Ripemd160_eq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2); +extern char *cr_user_cipher__Ripemd160_tostr(cipher__Ripemd160 *rp1); + +extern int cr_user_GoSlice_eq(GoSlice *slice1, GoSlice *slice2); +extern char *cr_user_GoSlice_tostr(GoSlice *slice1); +extern int cr_user_GoSlice_noteq(GoSlice *slice1, GoSlice *slice2); + +extern int cr_user_cipher__SHA256_noteq(cipher__SHA256 *sh1, cipher__SHA256 *sh2); +extern int cr_user_cipher__SHA256_eq(cipher__SHA256 *sh1, cipher__SHA256 *sh2); +extern char *cr_user_cipher__SHA256_tostr(cipher__SHA256 *sh1); + + +#endif //LIBCRITERION_H diff --git a/vendor/github.com/skycoin/skycoin/include/skyerrors.h b/vendor/github.com/skycoin/skycoin/include/skyerrors.h new file mode 100755 index 0000000..181de4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/skyerrors.h @@ -0,0 +1,9 @@ + +#ifndef SKY_ERRORS_H +#define SKY_ERRORS_H + +#define SKY_OK 0 +#define SKY_ERROR 0xFFFFFFFF + +#endif + diff --git a/vendor/github.com/skycoin/skycoin/include/skystring.h b/vendor/github.com/skycoin/skycoin/include/skystring.h new file mode 100755 index 0000000..b49114a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/skystring.h @@ -0,0 +1,15 @@ +#ifndef LIBSKY_STRING_H +#define LIBSKY_STRING_H + +#include +#include +#include "libskycoin.h" + +extern void randBytes(GoSlice *bytes, size_t n); + +extern void strnhex(unsigned char* buf, char *str, int n); + +extern void strhex(unsigned char* buf, char *str); + + +#endif //LIBSKY_STRING_H diff --git a/vendor/github.com/skycoin/skycoin/include/skytest.h b/vendor/github.com/skycoin/skycoin/include/skytest.h new file mode 100755 index 0000000..ebd25d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/skytest.h @@ -0,0 +1,48 @@ + +#include + +#include "json.h" +#include "skycriterion.h" + +#ifndef LIBSKY_TESTING_H +#define LIBSKY_TESTING_H + +/*---------------------------------------------------------------------- + * I/O + *---------------------------------------------------------------------- + */ +void fprintbuff(FILE *f, void *buff, size_t n); +json_value* loadJsonFile(const char* filename); + +/*---------------------------------------------------------------------- + * Memory handling + *---------------------------------------------------------------------- + */ +void * registerMemCleanup(void *p); +extern void toGoString(GoString_ *s, GoString *r); + +/*---------------------------------------------------------------------- + * JSON helpers + *---------------------------------------------------------------------- + */ +json_value* json_get_string(json_value* value, const char* key); +int json_set_string(json_value* value, const char* new_string_value); +int registerJsonFree(void *p); +void freeRegisteredJson(void *p); + +json_value* loadJsonFile(const char* filename); +int compareJsonValues(json_value* value1, json_value* value2); +json_value* get_json_value(json_value* node, const char* path, + json_type type); +json_value* get_json_value_not_strict(json_value* node, const char* path, + json_type type, int allow_null); + +/*---------------------------------------------------------------------- + * JSON helpers + *---------------------------------------------------------------------- + */ +void setup(void); +void teardown(void); + +#endif + diff --git a/vendor/github.com/skycoin/skycoin/include/skytypes.h b/vendor/github.com/skycoin/skycoin/include/skytypes.h new file mode 100755 index 0000000..b15d846 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/skytypes.h @@ -0,0 +1,155 @@ + +#ifndef SKYTYPES_H +#define SKYTYPES_H + +/** + * Go 8-bit signed integer values. + */ +typedef signed char GoInt8_; +/** + * Go 8-bit unsigned integer values. + */ +typedef unsigned char GoUint8_; +/** + * Go 16-bit signed integer values. + */ +typedef short GoInt16_; +/** + * Go 16-bit unsigned integer values. + */ +typedef unsigned short GoUint16_; +/** + * Go 32-bit signed integer values. + */ +typedef int GoInt32_; +/** + * Go 32-bit unsigned integer values. + */ +typedef unsigned int GoUint32_; +/** + * Go 64-bit signed integer values. + */ +typedef long long GoInt64_; +/** + * Go 64-bit unsigned integer values. + */ +typedef unsigned long long GoUint64_; +/** + * Go integer values aligned to the word size of the underlying architecture. + */ +typedef GoInt64_ GoInt_; +/** + * Go unsigned integer values aligned to the word size of the underlying + * architecture. + */ +typedef GoUint64_ GoUint_; +/** + * Architecture-dependent type representing instances Go `uintptr` type. + * Used as a generic representation of pointer types. + */ +typedef __SIZE_TYPE__ GoUintptr_; +/** + * Go single precision 32-bits floating point values. + */ +typedef float GoFloat32_; +/** + * Go double precision 64-bits floating point values. + */ +typedef double GoFloat64_; +/** + * Instances of Go `complex` type. + */ +typedef float _Complex GoComplex64_; +/** + * Instances of Go `complex` type. + */ +typedef double _Complex GoComplex128_; + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt._ +*/ +typedef char _check_for_64_bit_pointer_matchingGoInt[sizeof(void*)==64/8 ? 1:-1]; + +/** + * Instances of Go `string` type. + */ +typedef struct { + const char *p; ///< Pointer to string characters buffer. + GoInt_ n; ///< String size not counting trailing `\0` char + ///< if at all included. +} GoString_; +/** + * Instances of Go `map` type. + */ +typedef void *GoMap_; +/** + * Instances of Go `chan` channel types. + */ +typedef void *GoChan_; +/** + * Instances of Go interface types. + */ +typedef struct { + void *t; ///< Pointer to the information of the concrete Go type + ///< bound to this interface reference. + void *v; ///< Pointer to the data corresponding to the value + ///< bound to this interface type. +} GoInterface_; +/** + * Instances of Go slices + */ +typedef struct { + void *data; ///< Pointer to buffer containing slice data. + GoInt_ len; ///< Number of items stored in slice buffer + GoInt_ cap; ///< Maximum number of items that fits in this slice + ///< considering allocated memory and item type's + ///< size. +} GoSlice_; + + +/** + * Memory handles returned back to the caller and manipulated + * internally by API functions. Usually used to avoid type dependencies + * with internal implementation types. + */ +typedef GoInt64_ Handle; + +/** + * Memory handle for internal object retrieving password to read + * encrypted wallets. + */ +typedef Handle PasswordReader__Handle; + +/** + * Memory handle to perform Skycoin RPC API calls + * encrypted wallets. + */ +typedef Handle WebRpcClient__Handle; + +/** + * Memory handle providing access to wallet data + */ +typedef Handle Wallet__Handle; + +/** + * Memory handle Options Handle +*/ +typedef Handle Options__Handle; + +/** + * Memory handle to access to Skycoin CLI configuration + */ +typedef Handle Config__Handle; + +#include "cipher.hash.go.h" +#include "cipher.crypto.go.h" +#include "cipher.address.go.h" +#include "cli.create_rawtx.go.h" +#include "coin.outputs.go.h" +#include "coin.transactions.go.h" +#include "wallet.entry.go.h" +#include "wallet.wallet.go.h" + +#endif + diff --git a/vendor/github.com/skycoin/skycoin/include/wallet.entry.go.h b/vendor/github.com/skycoin/skycoin/include/wallet.entry.go.h new file mode 100755 index 0000000..362bb76 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/wallet.entry.go.h @@ -0,0 +1,8 @@ +/** + * Wallet entry. + */ +typedef struct { + cipher__Address Address; ///< Wallet address. + cipher__PubKey Public; ///< Public key used to generate address. + cipher__SecKey Secret; ///< Secret key used to generate address. +} wallet__Entry; diff --git a/vendor/github.com/skycoin/skycoin/include/wallet.wallet.go.h b/vendor/github.com/skycoin/skycoin/include/wallet.wallet.go.h new file mode 100755 index 0000000..2605cde --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/include/wallet.wallet.go.h @@ -0,0 +1,19 @@ +/** + * Intermediate representation of a UxOut for sorting and spend choosing. + */ +typedef struct { + cipher__SHA256 Hash; ///< Hash of underlying UxOut. + GoInt64_ BkSeq; ///< Block height corresponding to the + ///< moment balance calculation is performed at. + cipher__Address Address; ///< Account holder address. + GoInt64_ Coins; ///< Coins amount (e.g. in SKY). + GoInt64_ Hours; ///< Balance of Coin Hours generated by underlying UxOut, depending on UxOut's head time. +} wallet__UxBalance; + +/** + * Internal representation of a Skycoin wallet. + */ +typedef struct { + GoMap_ Meta; ///< Records items that are not deterministic, like filename, lable, wallet type, secrets, etc. + GoSlice_ Entries; ///< Entries field stores the address entries that are deterministically generated from seed. +} wallet__Wallet; diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/README.md b/vendor/github.com/skycoin/skycoin/lib/cgo/README.md new file mode 100755 index 0000000..0acc28e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/README.md @@ -0,0 +1,101 @@ + +# Skycoin C client library + +[![Build Status](https://travis-ci.org/skycoin/skycoin.svg)](https://travis-ci.org/skycoin/skycoin) +[![GoDoc](https://godoc.org/github.com/skycoin/skycoin?status.svg)](https://godoc.org/github.com/skycoin/skycoin) +[![Go Report Card](https://goreportcard.com/badge/github.com/skycoin/skycoin)](https://goreportcard.com/report/github.com/skycoin/skycoin) + +Skycoin C client library (a.k.a libskycoin) provides access to Skycoin Core +internal and API functions for implementing third-party applications. + +## API Interface + +The API interface is defined in the [libskycoin header file](/include/libskycoin.h). + +## Building + +```sh +$ make build-libc +``` + +This command compiles wrappers partially generated by [cgogen](https://github.com/simelo/cgogen) tool. + +**Important** : `libskycoin.so` shared library +[can not be compiled on Windows 64 bit systems](t.me/skycoindev/925) due to +[lack of support for c-shared buildmode in golang 1.9](https://github.com/golang/go/issues/23582). +Make sure you have installed a go version higher than `1.10`. + +## Testing + +In order to test the C client libraries follow these steps + +- Install [Criterion](https://github.com/Snaipe/Criterion) + * locally by executing `make instal-deps-libc` command + * or by [installing Criterion system-wide](https://github.com/Snaipe/Criterion#packages) +- Run `make test-libc` command + +## Binary distribution + +The following files will be generated + +- `include/libskycoin.h` - Platform-specific header file for including libskycoin symbols in your app code +- `build/libskycoin.a` - Static library. +- `build/libskycoin.so` - Shared library object. + +In Mac OS X the linker will need extra `-framework CoreFoundation -framework Security` +options. + +In GNU/Linux distributions it will be necessary to load symbols in `pthread` +library e.g. by supplying extra `-lpthread` to the linker toolchain. + + +## API usage + +The C API (a.k.a libskycoin) exposes the internals of Skycoin core +classes and objects. This makes it suitable for writing third-party +applications and integrations. The notable differences between go lang +and C languages have consequences for the consumers of the API. + +### Data types + +Skycoin core objects may not be passed across API boundaries. Therefore +equivalent C types are defined for each Skycoin core struct that +might be needed by developers. The result of this translation is +available in [skytpes.h](../../include/skytypes.h). + +### Memory management + +Caller is responsible for allocating memory for objects meant to be +created by libskycoin API. Different approaches are chosen to avoid +segmentation faults and memory corruption. + +API functions perform memory allocation for output `GoString *` arguments. +In that case new memory is allocated dynamically by `libskycoin` code. +The caller C code is responsible for releasing that memory by passing the pointer +in `p` field in to [free()](http://en.cppreference.com/w/c/memory/free). + +The parameters corresponding to slices returned by `libskycoin` are +of `GoSlice *` type. Aforementioned approach is also implemented for slices +with `cap` field set to `0` prior to function invocation. +Otherwise their `data` field must always be +set consistently to point at the buffer memory address whereas +`cap` must always be set to the number of items of the +target element type that will fit in the memory +area reserved in advance for that buffer. If the size of the data +to be returned by a given libskycoin function exceeds the value +set in `cap` then libskycoin will copy `cap` items in available +memory space and will set `len` to a negative value representing +the number of extra items that could not be copied due to +overflow. + +For instance if `100` bytes have been allocated in advance +by the caller for a struct type that occupies `25` bytes then only +`4` items fit in that memory and `cap` should be set accordingly. +In the hypothetical situation that `libskycoin` result occupies +`125` bytes (e.g. a slice of same type including `5` items) then +the first `100` bytes will be copied onto C-allocated `data` buffer +and `len` field will be set to `-1` as a side-effect of function +invocation. The caller will be responsible for +[reallocating another memory buffer](http://en.cppreference.com/w/c/memory/realloc) +using a higher `cap` and retry. + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/api.webrpc.client.go b/vendor/github.com/skycoin/skycoin/lib/cgo/api.webrpc.client.go new file mode 100755 index 0000000..a185aa0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/api.webrpc.client.go @@ -0,0 +1,47 @@ +package main + +import ( + webrpc "github.com/skycoin/skycoin/src/api/webrpc" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_webrpc_NewClient +func SKY_webrpc_NewClient(_addr string, _arg1 *C.WebRpcClient__Handle) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + addr := _addr + __arg1, ____return_err := webrpc.NewClient(addr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWebRpcClientHandle(__arg1) + } + return +} + +//export SKY_webrpc_Client_CSRF +func SKY_webrpc_Client_CSRF(_c C.WebRpcClient__Handle, _arg0 *C.GoString_) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + __arg0, ____return_err := c.CSRF() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyString(__arg0, _arg0) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.address.go b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.address.go new file mode 100755 index 0000000..8c1abeb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.address.go @@ -0,0 +1,145 @@ +package main + +/* +#include +#include + +#include "skytypes.h" + +*/ +import "C" + +import ( + "reflect" + "unsafe" + + "github.com/skycoin/skycoin/src/cipher" +) + +/** + * Functions in github.com/skycoin/skycoin/src/cipher/address.go + */ + +//export SKY_cipher_DecodeBase58Address +func SKY_cipher_DecodeBase58Address(_addr string, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.DecodeBase58Address(_addr) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_AddressFromPubKey +func SKY_cipher_AddressFromPubKey(_pubKey *C.cipher__PubKey, _arg1 *C.cipher__Address) { + pubKey := (*cipher.PubKey)(unsafe.Pointer(_pubKey)) + + addr := cipher.AddressFromPubKey(*pubKey) + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) +} + +//export SKY_cipher_AddressFromSecKey +func SKY_cipher_AddressFromSecKey(_secKey *C.cipher__SecKey, _arg1 *C.cipher__Address) { + var secKey cipher.SecKey + secKey = *(*cipher.SecKey)(unsafe.Pointer(_secKey)) + addr := cipher.AddressFromSecKey(secKey) + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) +} + +//export SKY_cipher_BitcoinDecodeBase58Address +func SKY_cipher_BitcoinDecodeBase58Address(_addr string, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.BitcoinDecodeBase58Address(_addr) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_Address_Bytes +func SKY_cipher_Address_Bytes(_addr *C.cipher__Address, _arg0 *C.GoSlice_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + bytes := addr.Bytes() + copyToGoSlice(reflect.ValueOf(bytes), _arg0) +} + +//export SKY_cipher_Address_BitcoinBytes +func SKY_cipher_Address_BitcoinBytes(_addr *C.cipher__Address, _arg0 *C.GoSlice_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + bytes := addr.BitcoinBytes() + copyToGoSlice(reflect.ValueOf(bytes), _arg0) +} + +//export SKY_cipher_Address_Verify +func SKY_cipher_Address_Verify(_addr *C.cipher__Address, _key *C.cipher__PubKey) uint32 { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + key := (*cipher.PubKey)(unsafe.Pointer(_key)) + err := addr.Verify(*key) + return libErrorCode(err) +} + +//export SKY_cipher_Address_String +func SKY_cipher_Address_String(_addr *C.cipher__Address, _arg1 *C.GoString_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + s := addr.String() + copyString(s, _arg1) +} + +//export SKY_cipher_Address_BitcoinString +func SKY_cipher_Address_BitcoinString(_addr *C.cipher__Address, _arg1 *C.GoString_) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + s := addr.BitcoinString() + copyString(s, _arg1) +} + +//export SKY_cipher_Address_Checksum +func SKY_cipher_Address_Checksum(_addr *C.cipher__Address, _arg0 *C.cipher__Checksum) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + cs := addr.Checksum() + C.memcpy(unsafe.Pointer(_arg0), unsafe.Pointer(&cs[0]), C.size_t(len(cs))) +} + +//export SKY_cipher_Address_BitcoinChecksum +func SKY_cipher_Address_BitcoinChecksum(_addr *C.cipher__Address, _arg0 *C.cipher__Checksum) { + addr := (*cipher.Address)(unsafe.Pointer(_addr)) + cs := addr.BitcoinChecksum() + C.memcpy(unsafe.Pointer(_arg0), unsafe.Pointer(&cs[0]), C.size_t(len(cs))) +} + +/* +Bitcoin Functions +*/ + +//export SKY_cipher_BitcoinAddressFromPubkey +func SKY_cipher_BitcoinAddressFromPubkey(_pubkey *C.cipher__PubKey, _arg1 *C.GoString_) { + pubkey := (*cipher.PubKey)(unsafe.Pointer(_pubkey)) + s := cipher.BitcoinAddressFromPubkey(*pubkey) + copyString(s, _arg1) +} + +//export SKY_cipher_BitcoinWalletImportFormatFromSeckey +func SKY_cipher_BitcoinWalletImportFormatFromSeckey(_seckey *C.cipher__SecKey, _arg1 *C.GoString_) { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + s := cipher.BitcoinWalletImportFormatFromSeckey(*seckey) + copyString(s, _arg1) +} + +//export SKY_cipher_BitcoinAddressFromBytes +func SKY_cipher_BitcoinAddressFromBytes(_b []byte, _arg1 *C.cipher__Address) uint32 { + addr, err := cipher.BitcoinAddressFromBytes(_b) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__Address)(unsafe.Pointer(&addr)) + } + return errcode +} + +//export SKY_cipher_SecKeyFromWalletImportFormat +func SKY_cipher_SecKeyFromWalletImportFormat(_input string, _arg1 *C.cipher__SecKey) uint32 { + seckey, err := cipher.SecKeyFromWalletImportFormat(_input) + errcode := libErrorCode(err) + if err == nil { + *_arg1 = *(*C.cipher__SecKey)(unsafe.Pointer(&seckey)) + } + return errcode +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.crypto.go b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.crypto.go new file mode 100755 index 0000000..15910e0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.crypto.go @@ -0,0 +1,278 @@ +package main + +import ( + cipher "github.com/skycoin/skycoin/src/cipher" + + "reflect" + "unsafe" +) + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_cipher_PubKeySlice_Len +func SKY_cipher_PubKeySlice_Len(_slice *C.cipher__PubKeySlice) int { + slice := inplacePubKeySlice(_slice) + return slice.Len() +} + +//export SKY_cipher_PubKeySlice_Less +func SKY_cipher_PubKeySlice_Less(_slice *C.cipher__PubKeySlice, _i, _j int) bool { + slice := inplacePubKeySlice(_slice) + return slice.Less(_i, _j) +} + +//export SKY_cipher_PubKeySlice_Swap +func SKY_cipher_PubKeySlice_Swap(_slice *C.cipher__PubKeySlice, _i, _j int) { + slice := inplacePubKeySlice(_slice) + slice.Swap(_i, _j) +} + +//export SKY_cipher_RandByte +func SKY_cipher_RandByte(_n int, _arg1 *C.GoSlice_) { + b := cipher.RandByte(_n) + copyToGoSlice(reflect.ValueOf(b), _arg1) +} + +//export SKY_cipher_NewPubKey +func SKY_cipher_NewPubKey(_b []byte, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + pubkey := cipher.NewPubKey(_b) + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + return libErrorCode(nil) +} + +//export SKY_cipher_PubKeyFromHex +func SKY_cipher_PubKeyFromHex(_s string, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + pubkey, err := cipher.PubKeyFromHex(_s) + errcode = libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + } + return errcode +} + +//export SKY_cipher_PubKeyFromSecKey +func SKY_cipher_PubKeyFromSecKey(_seckey *C.cipher__SecKey, _arg1 *C.cipher__PubKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + + pubkey := cipher.PubKeyFromSecKey(*seckey) + + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + return libErrorCode(nil) +} + +//export SKY_cipher_PubKeyFromSig +func SKY_cipher_PubKeyFromSig(_sig *C.cipher__Sig, _hash *C.cipher__SHA256, _arg2 *C.cipher__PubKey) uint32 { + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + pubkey, err := cipher.PubKeyFromSig(*sig, *hash) + + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(pubkey[:]), unsafe.Pointer(_arg2), uint(SizeofPubKey)) + } + return errcode +} + +//export SKY_cipher_PubKey_Verify +func SKY_cipher_PubKey_Verify(_pk *C.cipher__PubKey) uint32 { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + + err := pk.Verify() + errcode := libErrorCode(err) + return errcode +} + +//export SKY_cipher_PubKey_Hex +func SKY_cipher_PubKey_Hex(_pk *C.cipher__PubKey, _arg1 *C.GoString_) { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + s := pk.Hex() + copyString(s, _arg1) +} + +//export SKY_cipher_PubKey_ToAddressHash +func SKY_cipher_PubKey_ToAddressHash(_pk *C.cipher__PubKey, _arg0 *C.cipher__Ripemd160) { + pk := (*cipher.PubKey)(unsafe.Pointer(_pk)) + h := pk.ToAddressHash() + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg0), uint(SizeofRipemd160)) +} + +//export SKY_cipher_NewSecKey +func SKY_cipher_NewSecKey(_b []byte, _arg1 *C.cipher__SecKey) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + sk := cipher.NewSecKey(_b) + copyToBuffer(reflect.ValueOf(sk[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) + return SKY_OK +} + +//export SKY_cipher_SecKeyFromHex +func SKY_cipher_SecKeyFromHex(_s string, _arg1 *C.cipher__SecKey) uint32 { + sk, err := cipher.SecKeyFromHex(_s) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(sk[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) + } + return errcode +} + +//export SKY_cipher_SecKey_Verify +func SKY_cipher_SecKey_Verify(_sk *C.cipher__SecKey) uint32 { + sk := (*cipher.SecKey)(unsafe.Pointer(_sk)) + err := sk.Verify() + return libErrorCode(err) +} + +//export SKY_cipher_SecKey_Hex +func SKY_cipher_SecKey_Hex(_sk *C.cipher__SecKey, _arg1 *C.GoString_) { + sk := (*cipher.SecKey)(unsafe.Pointer(_sk)) + s := sk.Hex() + copyString(s, _arg1) +} + +//export SKY_cipher_ECDH +func SKY_cipher_ECDH(_pub *C.cipher__PubKey, _sec *C.cipher__SecKey, _arg2 *C.GoSlice_) { + pub := (*cipher.PubKey)(unsafe.Pointer(_pub)) + sec := (*cipher.SecKey)(unsafe.Pointer(_sec)) + b := cipher.ECDH(*pub, *sec) + copyToGoSlice(reflect.ValueOf(b), _arg2) +} + +//export SKY_cipher_NewSig +func SKY_cipher_NewSig(_b []byte, _arg1 *C.cipher__Sig) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + s := cipher.NewSig(_b) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSig)) + + return SKY_OK +} + +//export SKY_cipher_SigFromHex +func SKY_cipher_SigFromHex(_s string, _arg1 *C.cipher__Sig) uint32 { + s, err := cipher.SigFromHex(_s) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSig)) + } + return errcode +} + +//export SKY_cipher_Sig_Hex +func SKY_cipher_Sig_Hex(_s *C.cipher__Sig, _arg1 *C.GoString_) { + s := (*cipher.Sig)(unsafe.Pointer(_s)) + copyString(s.Hex(), _arg1) +} + +//export SKY_cipher_SignHash +func SKY_cipher_SignHash(_hash *C.cipher__SHA256, _sec *C.cipher__SecKey, _arg2 *C.cipher__Sig) { + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sec := (*cipher.SecKey)(unsafe.Pointer(_sec)) + s := cipher.SignHash(*hash, *sec) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg2), uint(SizeofSig)) +} + +//export SKY_cipher_ChkSig +func SKY_cipher_ChkSig(_address *C.cipher__Address, _hash *C.cipher__SHA256, _sig *C.cipher__Sig) uint32 { + address := inplaceAddress(_address) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + + err := cipher.ChkSig(*address, *hash, *sig) + return libErrorCode(err) +} + +//export SKY_cipher_VerifySignedHash +func SKY_cipher_VerifySignedHash(_sig *C.cipher__Sig, _hash *C.cipher__SHA256) uint32 { + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + + err := cipher.VerifySignedHash(*sig, *hash) + return libErrorCode(err) +} + +//export SKY_cipher_VerifySignature +func SKY_cipher_VerifySignature(_pubkey *C.cipher__PubKey, _sig *C.cipher__Sig, _hash *C.cipher__SHA256) uint32 { + pubkey := (*cipher.PubKey)(unsafe.Pointer(_pubkey)) + sig := (*cipher.Sig)(unsafe.Pointer(_sig)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + err := cipher.VerifySignature(*pubkey, *sig, *hash) + return libErrorCode(err) +} + +//export SKY_cipher_GenerateKeyPair +func SKY_cipher_GenerateKeyPair(_arg0 *C.cipher__PubKey, _arg1 *C.cipher__SecKey) { + p, s := cipher.GenerateKeyPair() + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg0), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg1), uint(SizeofSecKey)) +} + +//export SKY_cipher_GenerateDeterministicKeyPair +func SKY_cipher_GenerateDeterministicKeyPair(_seed []byte, _arg1 *C.cipher__PubKey, _arg2 *C.cipher__SecKey) { + p, s := cipher.GenerateDeterministicKeyPair(_seed) + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg1), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg2), uint(SizeofSecKey)) +} + +//export SKY_cipher_DeterministicKeyPairIterator +func SKY_cipher_DeterministicKeyPairIterator(_seed []byte, _arg1 *C.GoSlice_, _arg2 *C.cipher__PubKey, _arg3 *C.cipher__SecKey) { + h, p, s := cipher.DeterministicKeyPairIterator(_seed) + + copyToGoSlice(reflect.ValueOf(h), _arg1) + copyToBuffer(reflect.ValueOf(p[:]), unsafe.Pointer(_arg2), uint(SizeofPubKey)) + copyToBuffer(reflect.ValueOf(s[:]), unsafe.Pointer(_arg3), uint(SizeofSecKey)) +} + +//export SKY_cipher_GenerateDeterministicKeyPairs +func SKY_cipher_GenerateDeterministicKeyPairs(_seed []byte, _n int, _arg2 *C.GoSlice_) { + sks := cipher.GenerateDeterministicKeyPairs(_seed, _n) + copyToGoSlice(reflect.ValueOf(sks), _arg2) +} + +//export SKY_cipher_GenerateDeterministicKeyPairsSeed +func SKY_cipher_GenerateDeterministicKeyPairsSeed(_seed []byte, _n int, _arg2 *C.GoSlice_, _arg3 *C.GoSlice_) { + h, sks := cipher.GenerateDeterministicKeyPairsSeed(_seed, _n) + copyToGoSlice(reflect.ValueOf(h), _arg2) + copyToGoSlice(reflect.ValueOf(sks), _arg3) +} + +//export SKY_cipher_TestSecKey +func SKY_cipher_TestSecKey(_seckey *C.cipher__SecKey) uint32 { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + + err := cipher.TestSecKey(*seckey) + return libErrorCode(err) +} + +//export SKY_cipher_TestSecKeyHash +func SKY_cipher_TestSecKeyHash(_seckey *C.cipher__SecKey, _hash *C.cipher__SHA256) uint32 { + seckey := (*cipher.SecKey)(unsafe.Pointer(_seckey)) + hash := (*cipher.SHA256)(unsafe.Pointer(_hash)) + + err := cipher.TestSecKeyHash(*seckey, *hash) + return libErrorCode(err) +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.hash.go b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.hash.go new file mode 100755 index 0000000..59ab70e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/cipher.hash.go @@ -0,0 +1,107 @@ +package main + +import ( + cipher "github.com/skycoin/skycoin/src/cipher" + + "reflect" + "unsafe" +) + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_cipher_Ripemd160_Set +func SKY_cipher_Ripemd160_Set(_rd *C.cipher__Ripemd160, _b []byte) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + rd := (*cipher.Ripemd160)(unsafe.Pointer(_rd)) + + rd.Set(_b) + return libErrorCode(nil) +} + +//export SKY_cipher_HashRipemd160 +func SKY_cipher_HashRipemd160(_data []byte, _arg1 *C.cipher__Ripemd160) { + rd := cipher.HashRipemd160(_data) + + copyToBuffer(reflect.ValueOf(rd[:]), unsafe.Pointer(_arg1), uint(SizeofRipemd160)) +} + +//export SKY_cipher_SHA256_Set +func SKY_cipher_SHA256_Set(_g *C.cipher__SHA256, _b []byte) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + + g.Set(_b) + return libErrorCode(nil) +} + +//export SKY_cipher_SHA256_Hex +func SKY_cipher_SHA256_Hex(_g *C.cipher__SHA256, _arg1 *C.GoString_) { + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + copyString(g.Hex(), _arg1) +} + +//export SKY_cipher_SHA256_Xor +func SKY_cipher_SHA256_Xor(_g *C.cipher__SHA256, _b *C.cipher__SHA256, _arg1 *C.cipher__SHA256) { + g := (*cipher.SHA256)(unsafe.Pointer(_g)) + b := (*cipher.SHA256)(unsafe.Pointer(_b)) + + x := g.Xor(*b) + copyToBuffer(reflect.ValueOf(x[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} + +//export SKY_cipher_SumSHA256 +func SKY_cipher_SumSHA256(_b []byte, _arg1 *C.cipher__SHA256) (errcode uint32) { + defer func() { + errcode = catchApiPanic(errcode, recover()) + }() + + h := cipher.SumSHA256(_b) + + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) + return libErrorCode(nil) +} + +//export SKY_cipher_SHA256FromHex +func SKY_cipher_SHA256FromHex(_hs string, _arg1 *C.cipher__SHA256) uint32 { + h, err := cipher.SHA256FromHex(_hs) + errcode := libErrorCode(err) + if err == nil { + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) + } + return errcode +} + +//export SKY_cipher_DoubleSHA256 +func SKY_cipher_DoubleSHA256(_b []byte, _arg1 *C.cipher__SHA256) { + h := cipher.DoubleSHA256(_b) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} + +//export SKY_cipher_AddSHA256 +func SKY_cipher_AddSHA256(_a *C.cipher__SHA256, _b *C.cipher__SHA256, _arg2 *C.cipher__SHA256) { + a := (*cipher.SHA256)(unsafe.Pointer(_a)) + b := (*cipher.SHA256)(unsafe.Pointer(_b)) + + h := cipher.AddSHA256(*a, *b) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg2), uint(SizeofSHA256)) +} + +//export SKY_cipher_Merkle +func SKY_cipher_Merkle(_h0 *[]C.cipher__SHA256, _arg1 *C.cipher__SHA256) { + h0 := (*[]cipher.SHA256)(unsafe.Pointer(_h0)) + h := cipher.Merkle(*h0) + copyToBuffer(reflect.ValueOf(h[:]), unsafe.Pointer(_arg1), uint(SizeofSHA256)) +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/cli.create_rawtx.go b/vendor/github.com/skycoin/skycoin/lib/cgo/cli.create_rawtx.go new file mode 100755 index 0000000..fe416fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/cli.create_rawtx.go @@ -0,0 +1,108 @@ +package main + +import ( + "unsafe" + + cipher "github.com/skycoin/skycoin/src/cipher" + cli "github.com/skycoin/skycoin/src/cli" + coin "github.com/skycoin/skycoin/src/coin" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + + #include + #include + + #include "../../include/skytypes.h" +*/ +import "C" + +//export SKY_cli_CreateRawTxFromWallet +func SKY_cli_CreateRawTxFromWallet(_c C.WebRpcClient__Handle, _walletFile, _chgAddr string, _toAddrs []C.cli__SendAmount, pwd string, _arg4 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + walletFile := _walletFile + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + pr := cli.NewPasswordReader([]byte(pwd)) + __arg4, ____return_err := cli.CreateRawTxFromWallet(c, walletFile, chgAddr, toAddrs, pr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg4 = *(*C.coin__Transaction)(unsafe.Pointer(__arg4)) + } + return +} + +//export SKY_cli_CreateRawTxFromAddress +func SKY_cli_CreateRawTxFromAddress(_c C.WebRpcClient__Handle, _addr, _walletFile, _chgAddr string, _toAddrs []C.cli__SendAmount, pwd string, _arg4 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + addr := _addr + walletFile := _walletFile + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + pr := cli.NewPasswordReader([]byte(pwd)) + __arg4, ____return_err := cli.CreateRawTxFromAddress(c, addr, walletFile, chgAddr, toAddrs, pr) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg4 = *(*C.coin__Transaction)(unsafe.Pointer(__arg4)) + } + return +} + +//export SKY_cli_CreateRawTx +func SKY_cli_CreateRawTx(_c C.WebRpcClient__Handle, _wlt C.Wallet__Handle, _inAddrs []string, _chgAddr string, _toAddrs []C.cli__SendAmount, _password []byte, _arg6 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + c, okc := lookupWebRpcClientHandle(_c) + if !okc { + ____error_code = SKY_ERROR + return + } + wlt, okwlt := lookupWalletHandle(_wlt) + if !okwlt { + ____error_code = SKY_ERROR + return + } + inAddrs := *(*[]string)(unsafe.Pointer(&_inAddrs)) + chgAddr := _chgAddr + toAddrs := *(*[]cli.SendAmount)(unsafe.Pointer(&_toAddrs)) + password := *(*[]byte)(unsafe.Pointer(&_password)) + __arg6, ____return_err := cli.CreateRawTx(c, wlt, inAddrs, chgAddr, toAddrs, password) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg6 = *(*C.coin__Transaction)(unsafe.Pointer(__arg6)) + } + return +} + +//export SKY_cli_NewTransaction +func SKY_cli_NewTransaction(_utxos []C.wallet__UxBalance, _keys []C.cipher__SecKey, _outs []C.coin__TransactionOutput, _arg3 *C.coin__Transaction) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + utxos := *(*[]wallet.UxBalance)(unsafe.Pointer(&_utxos)) + keys := *(*[]cipher.SecKey)(unsafe.Pointer(&_keys)) + outs := *(*[]coin.TransactionOutput)(unsafe.Pointer(&_outs)) + __arg3 := cli.NewTransaction(utxos, keys, outs) + *_arg3 = *(*C.coin__Transaction)(unsafe.Pointer(__arg3)) + return +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/coin.outputs.go b/vendor/github.com/skycoin/skycoin/lib/cgo/coin.outputs.go new file mode 100755 index 0000000..66aac97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/coin.outputs.go @@ -0,0 +1,157 @@ +package main + +import ( + "reflect" + "unsafe" + + coin "github.com/skycoin/skycoin/src/coin" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_coin_UxOut_Hash +func SKY_coin_UxOut_Hash(_uo *C.coin__UxOut, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + __arg0 := uo.Hash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxOut_SnapshotHash +func SKY_coin_UxOut_SnapshotHash(_uo *C.coin__UxOut, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + __arg0 := uo.SnapshotHash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxBody_Hash +func SKY_coin_UxBody_Hash(_ub *C.coin__UxBody, _arg0 *C.cipher__SHA256) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ub := (*coin.UxBody)(unsafe.Pointer(_ub)) + __arg0 := ub.Hash() + *_arg0 = *(*C.cipher__SHA256)(unsafe.Pointer(&__arg0)) + return +} + +//export SKY_coin_UxOut_CoinHours +func SKY_coin_UxOut_CoinHours(_uo *C.coin__UxOut, _t uint64, _arg1 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uo := (*coin.UxOut)(unsafe.Pointer(_uo)) + t := _t + __arg1, ____return_err := uo.CoinHours(t) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = __arg1 + } + return +} + +//export SKY_coin_UxArray_Hashes +func SKY_coin_UxArray_Hashes(_ua *C.coin__UxArray, _arg0 *C.GoSlice_) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + __arg0 := ua.Hashes() + copyToGoSlice(reflect.ValueOf(__arg0), _arg0) + return +} + +//export SKY_coin_UxArray_HasDupes +func SKY_coin_UxArray_HasDupes(_ua *C.coin__UxArray) bool { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.HasDupes() +} + +//export SKY_coin_UxArray_Sort +func SKY_coin_UxArray_Sort(_ua *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + ua.Sort() +} + +//export SKY_coin_UxArray_Len +func SKY_coin_UxArray_Len(_ua *C.coin__UxArray) int { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.Len() +} + +//export SKY_coin_UxArray_Less +func SKY_coin_UxArray_Less(_ua *C.coin__UxArray, _i, _j int) bool { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + return ua.Less(_i, _j) +} + +//export SKY_coin_UxArray_Swap +func SKY_coin_UxArray_Swap(_ua *C.coin__UxArray, _i, _j int) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + ua.Swap(_i, _j) +} + +//export SKY_coin_UxArray_Coins +func SKY_coin_UxArray_Coins(_ua *C.coin__UxArray, _arg0 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + __arg0, ____return_err := ua.Coins() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg0 = __arg0 + } + return +} + +//export SKY_coin_UxArray_CoinHours +func SKY_coin_UxArray_CoinHours(_ua *C.coin__UxArray, _headTime uint64, _arg1 *uint64) (____error_code uint32) { + ____error_code = 0 + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + headTime := _headTime + __arg1, ____return_err := ua.CoinHours(headTime) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = __arg1 + } + return +} + +//export SKY_coin_UxArray_Sub +func SKY_coin_UxArray_Sub(_ua *C.coin__UxArray, _other *C.coin__UxArray, _arg1 *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + other := *(*coin.UxArray)(unsafe.Pointer(_other)) + __arg1 := ua.Sub(other) + *_arg1 = *(*C.coin__UxArray)(unsafe.Pointer(&__arg1)) +} + +//export SKY_coin_UxArray_Add +func SKY_coin_UxArray_Add(_ua *C.coin__UxArray, _other *C.coin__UxArray, _arg1 *C.coin__UxArray) { + ua := *(*coin.UxArray)(unsafe.Pointer(_ua)) + other := *(*coin.UxArray)(unsafe.Pointer(_other)) + __arg1 := ua.Add(other) + *_arg1 = *(*C.coin__UxArray)(unsafe.Pointer(&__arg1)) +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_error.go b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_error.go new file mode 100755 index 0000000..b0aa4c0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_error.go @@ -0,0 +1,34 @@ +package main + +const ( + SKY_ERROR = 0xFFFFFFFF + SKY_OK = 0 +) + +func libErrorCode(err error) uint32 { + if err == nil { + return SKY_OK + } + // TODO: Implement error codes + return SKY_ERROR +} + +// Catch panic signals emitted by internal implementation +// of API methods. This function is mainly used in defer statements +// exceuted immediately before returning from API calls. +// +// @param errcode error status in function body +// @param err `recover()` result +// +func catchApiPanic(errcode uint32, err interface{}) uint32 { + if errcode != SKY_OK { + // Error already detected in function body + // Return right away + return errcode + } + if err != nil { + // TODO: Fix to be like retVal = libErrorCode(err) + return SKY_ERROR + } + return SKY_OK +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_handle.go b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_handle.go new file mode 100755 index 0000000..698bce7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_handle.go @@ -0,0 +1,115 @@ +package main + +/* + + #include + #include + + #include "skytypes.h" +*/ +import "C" + +import ( + "unsafe" + + webrpc "github.com/skycoin/skycoin/src/api/webrpc" + cli "github.com/skycoin/skycoin/src/cli" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +type Handle uint64 + +var ( + handleMap = make(map[Handle]interface{}) +) + +func registerHandle(obj interface{}) Handle { + ptr := &obj + handle := *(*Handle)(unsafe.Pointer(&ptr)) + handleMap[handle] = obj + return handle +} + +func lookupHandle(handle Handle) (interface{}, bool) { + obj, ok := handleMap[handle] + return obj, ok +} + +func registerWebRpcClientHandle(obj *webrpc.Client) C.WebRpcClient__Handle { + return (C.WebRpcClient__Handle)(registerHandle(obj)) +} + +func lookupWebRpcClientHandle(handle C.WebRpcClient__Handle) (*webrpc.Client, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*webrpc.Client); isOK { + return obj, true + } + } + return nil, false +} + +func registerWalletHandle(obj *wallet.Wallet) C.Wallet__Handle { + return (C.Wallet__Handle)(registerHandle(obj)) +} + +func lookupWalletHandle(handle C.Wallet__Handle) (*wallet.Wallet, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*wallet.Wallet); isOK { + return obj, true + } + } + return nil, false +} + +func registerOptionsHandle(obj *wallet.Options) C.Options__Handle { + return (C.Options__Handle)(registerHandle(obj)) +} + +func lookupOptionsHandle(handle C.Options__Handle) (*wallet.Options, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*wallet.Options); isOK { + return obj, true + } + } + return nil, false +} + +func registerConfigHandle(obj *cli.Config) C.Config__Handle { + return (C.Config__Handle)(registerHandle(obj)) +} + +func lookupConfigHandle(handle C.Config__Handle) (*cli.Config, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(*cli.Config); isOK { + return obj, true + } + } + return nil, false +} + +func registerPasswordReaderHandle(obj cli.PasswordReader) C.PasswordReader__Handle { + return (C.PasswordReader__Handle)(registerHandle(obj)) +} + +func lookupPasswordReaderHandle(handle C.PasswordReader__Handle) (cli.PasswordReader, bool) { + obj, ok := lookupHandle(Handle(handle)) + if ok { + if obj, isOK := (obj).(cli.PasswordReader); isOK { + return obj, true + } + } + return nil, false +} + +func closeHandle(handle Handle) { + delete(handleMap, handle) +} + +//export SKY_handle_close +func SKY_handle_close(handle C.Handle) { + closeHandle(Handle(handle)) +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_mem.go b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_mem.go new file mode 100755 index 0000000..74eca3f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/libsky_mem.go @@ -0,0 +1,123 @@ +package main + +import ( + "reflect" + "unsafe" + + "github.com/skycoin/skycoin/src/cipher" +) + +/* + #include + + #include "skytypes.h" + + void eos(char *str, int len) { + str[len] = 0; + } + +*/ +import "C" + +const ( + SizeofRipemd160 = unsafe.Sizeof(C.cipher__Ripemd160{}) + SizeOfAddress = unsafe.Sizeof(C.cipher__Address{}) + SizeofPubKey = unsafe.Sizeof(C.cipher__PubKey{}) + SizeofPubKeySlice = unsafe.Sizeof(C.cipher__PubKeySlice{}) + SizeofSecKey = unsafe.Sizeof(C.cipher__SecKey{}) + SizeofSig = unsafe.Sizeof(C.cipher__Sig{}) + SizeofChecksum = unsafe.Sizeof(C.cipher__Checksum{}) + SizeofSendAmount = unsafe.Sizeof(C.cli__SendAmount{}) + SizeofSHA256 = unsafe.Sizeof(C.cipher__SHA256{}) + SizeofTransactionOutput = unsafe.Sizeof(C.coin__TransactionOutput{}) + SizeofTransaction = unsafe.Sizeof(C.coin__Transaction{}) + SizeofWallet = unsafe.Sizeof(C.wallet__Wallet{}) + SizeofEntry = unsafe.Sizeof(C.wallet__Entry{}) + SizeofUxBalance = unsafe.Sizeof(C.wallet__UxBalance{}) +) + +/** + * Inplace memory references + */ + +func inplacePubKeySlice(p *C.cipher__PubKeySlice) *cipher.PubKeySlice { + return (*cipher.PubKeySlice)(unsafe.Pointer(p)) +} + +func inplaceAddress(p *C.cipher__Address) *cipher.Address { + return (*cipher.Address)(unsafe.Pointer(p)) +} + +func nop(p unsafe.Pointer) { + // Do nothing +} + +/** + * Copy helpers + */ + +func copyString(src string, dest *C.GoString_) { + strAddr := (*C.GoString_)(unsafe.Pointer(&src)) + srcLen := len(src) + dest.p = (*C.char)(C.memcpy( + C.malloc(C.size_t(srcLen+1)), + unsafe.Pointer(strAddr.p), + C.size_t(srcLen), + )) + C.eos(dest.p, C.int(srcLen)) + dest.n = C.GoInt_(srcLen) +} + +// Determine the memory address of a slice buffer and the +// size of its underlaying element type +func getBufferData(src reflect.Value) (bufferAddr unsafe.Pointer, elemSize C.size_t) { + firstElem := src.Index(0) + elemSize = C.size_t(firstElem.Type().Size()) + bufferAddr = unsafe.Pointer(src.Pointer()) + return +} + +// Copy n items in source slice/array/string onto C-managed memory buffer +// +// This function takes for granted that all values in src +// will be instances of the same type, and that src and dest +// element types will be aligned exactly the same +// in memory of the same size +func copyToBuffer(src reflect.Value, dest unsafe.Pointer, n uint) { + srcLen := src.Len() + if srcLen == 0 { + return + } + srcAddr, elemSize := getBufferData(src) + nop(C.memcpy(dest, srcAddr, C.size_t(n)*elemSize)) +} + +// Copy source slice/array/string onto instance of C.GSlice struct +// +// This function takes for granted that all values in src +// will be instances of the same type, and that src and dest +// element types will be aligned exactly the same +// in memory of the same size +func copyToGoSlice(src reflect.Value, dest *C.GoSlice_) { + srcLen := src.Len() + if srcLen == 0 { + dest.len = 0 + return + } + srcAddr, elemSize := getBufferData(src) + if dest.cap == 0 { + dest.data = C.malloc(C.size_t(srcLen) * elemSize) + dest.cap = C.GoInt_(srcLen) + } + n, overflow := srcLen, srcLen > int(dest.cap) + if overflow { + n = int(dest.cap) + } + nop(C.memcpy(dest.data, srcAddr, C.size_t(n)*elemSize)) + // Do not modify slice metadata until memory is actually copied + if overflow { + dest.len = dest.cap - C.GoInt_(srcLen) + } else { + dest.len = C.GoInt_(srcLen) + } +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/main.go b/vendor/github.com/skycoin/skycoin/lib/cgo/main.go new file mode 100755 index 0000000..8c04e9f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/main.go @@ -0,0 +1,6 @@ +package main + +// #cgo CFLAGS: -I../../include +import "C" + +func main() {} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.address.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.address.c new file mode 100755 index 0000000..6d5d5f5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.address.c @@ -0,0 +1,337 @@ + +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +#define SKYCOIN_ADDRESS_VALID "2GgFvqoyk9RjwVzj8tqfcXVXB4orBwoc9qv" + +TestSuite(cipher_address, .init = setup, .fini = teardown); + +// buffer big enough to hold all kind of data needed by test cases +unsigned char buff[1024]; + +Test(cipher_address, TestDecodeBase58Address) { + + GoString strAddr = { + SKYCOIN_ADDRESS_VALID, + 35 + }; + cipher__Address addr; + + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_OK, "accept valid address"); + + char tempStr[50]; + + // preceding whitespace is invalid + strcpy(tempStr, " "); + strcat(tempStr, SKYCOIN_ADDRESS_VALID); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, "preceding whitespace is invalid"); + + // preceding zeroes are invalid + strcpy(tempStr, "000"); + strcat(tempStr, SKYCOIN_ADDRESS_VALID); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, "leading zeroes prefix are invalid"); + + // trailing whitespace is invalid + strcpy(tempStr, SKYCOIN_ADDRESS_VALID); + strcat(tempStr, " "); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, " trailing whitespace is invalid"); + + // trailing zeroes are invalid + strcpy(tempStr, SKYCOIN_ADDRESS_VALID); + strcat(tempStr, "000"); + strAddr.p = tempStr; + strAddr.n = strlen(tempStr); + cr_assert( SKY_cipher_DecodeBase58Address(strAddr, &addr) == SKY_ERROR, " trailing zeroes suffix are invalid"); + +} + +Test(cipher_address, TestAddressFromBytes){ + GoString strAddr = { + SKYCOIN_ADDRESS_VALID, + 35 + }; + cipher__Address addr, addr2; + GoSlice bytes; + + bytes.data = buff; + bytes.len = 0; + bytes.cap = sizeof(buff); + + SKY_cipher_DecodeBase58Address(strAddr, &addr); + SKY_cipher_Address_BitcoinBytes(&addr, (GoSlice_ *)&bytes); + cr_assert(bytes.len > 0, "address bytes written"); + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_OK, "convert bytes to SKY address"); + + cr_assert(eq(type(cipher__Address), addr, addr2)); + + int bytes_len = bytes.len; + + bytes.len = bytes.len - 2; + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_ERROR, "no SKY address due to short bytes length"); + + bytes.len = bytes_len; + ((char *) bytes.data)[bytes.len - 1] = '2'; + cr_assert(SKY_cipher_BitcoinAddressFromBytes(bytes, &addr2) == SKY_ERROR, "no SKY address due to corrupted bytes"); +} + +Test(cipher_address, TestAddressVerify){ + + cipher__PubKey pubkey; + cipher__SecKey seckey; + cipher__PubKey pubkey2; + cipher__SecKey seckey2; + cipher__Address addr; + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey); + SKY_cipher_AddressFromPubKey(&pubkey,&addr); + + // Valid pubkey+address + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_OK ,"Valid pubkey + address"); + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey2); + // // Invalid pubkey + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_ERROR," Invalid pubkey"); + + // Bad version + addr.Version = 0x01; + cr_assert( SKY_cipher_Address_Verify(&addr,&pubkey) == SKY_ERROR," Bad version"); +} + +Test(cipher_address,TestAddressString){ + +} + +Test (cipher, TestBitcoinAddress1){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + + GoString str = { + "1111111111111111111111111111111111111111111111111111111111111111", + 64 + }, s1, s2; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + GoString pubkeyStr = { "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", 66 }; + + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *) &s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *) &s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); +} + +Test (cipher, TestBitcoinAddress2){ + + cipher__SecKey seckey; + cipher__PubKey pubkey ; + GoString str = { + "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + 64 + }, s1, s2; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + char strBuff[101]; + GoString pubkeyStr = { + "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + 66 + }; + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *) &s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *) &s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); + +} + +Test (cipher, TestBitcoinAddress3){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + GoString str = { + "47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012", + 64 + }; + + unsigned int error; + error = SKY_cipher_SecKeyFromHex(str, &seckey); + cr_assert(error == SKY_OK, "Create SecKey from Hex"); + error = SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + cr_assert(error == SKY_OK, "Create PubKey from SecKey"); + + char strBuff[101]; + GoString pubkeyStr = { + "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + 66 + }, s1, s2; + + SKY_cipher_PubKey_Hex(&pubkey, (GoString_ *)&s1); + registerMemCleanup((void *) s1.p); + cr_assert(eq(type(GoString), pubkeyStr, s1)); + + GoString bitcoinStr = {"19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV",34}; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *)&s2); + registerMemCleanup((void *) s2.p); + cr_assert(eq(type(GoString), bitcoinStr, s2)); + +} + +Test(cipher_address, TestBitcoinWIPRoundTrio){ + + cipher__SecKey seckey; + cipher__PubKey pubkey; + GoSlice slice; + slice.data = buff; + slice.cap = sizeof(buff); + slice.len = 33; + + SKY_cipher_GenerateKeyPair(&pubkey,&seckey); + + GoString_ wip1; + + SKY_cipher_BitcoinWalletImportFormatFromSeckey(&seckey,&wip1); + + cipher__SecKey seckey2; + + unsigned int err; + + err = SKY_cipher_SecKeyFromWalletImportFormat( (*((GoString *) &wip1)) ,&seckey2); + + GoString_ wip2; + + SKY_cipher_BitcoinWalletImportFormatFromSeckey(&seckey2,&wip2); + + cr_assert(err == SKY_OK); + + cr_assert(eq(u8[sizeof(cipher__SecKey)],seckey,seckey2)); + + GoString_ seckeyhex1; + GoString_ seckeyhex2; + + SKY_cipher_SecKey_Hex(&seckey,&seckeyhex1); + SKY_cipher_SecKey_Hex(&seckey2,&seckeyhex2); + cr_assert(eq(type(GoString), (*(GoString*)&seckeyhex1),(*(GoString*)&seckeyhex2) )); + cr_assert(eq(type(GoString), (*(GoString*)&wip1),(*(GoString*)&wip2) )); + +} + + +Test(cipher_address, TestBitcoinWIP ){ + + //wallet input format string + GoString wip[3]; + + wip[0].p = "KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp"; + wip[1].p = "L4ezQvyC6QoBhxB4GVs9fAPhUKtbaXYUn8YTqoeXwbevQq4U92vN"; + wip[2].p = "KydbzBtk6uc7M6dXwEgTEH2sphZxSPbmDSz6kUUHi4eUpSQuhEbq"; + wip[0].n = 52; + wip[1].n = 52; + wip[2].n = 52; + + // // //the expected pubkey to generate + GoString_ pub[3]; + + pub[0].p="034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa"; + pub[1].p="02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd"; + pub[2].p="032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3"; + + pub[0].n = 66; + pub[1].n = 66; + pub[2].n = 66; + + + // //the expected addrss to generate + + GoString addr[3]; + + addr[0].p="1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9"; + addr[1].p="1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a"; + addr[2].p="19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV"; + + addr[0].n =34; + addr[1].n=34; + addr[2].n=34; + + + for (int i = 0; i < 3; i++) + { + cipher__SecKey seckey; + unsigned int err; + + err = SKY_cipher_SecKeyFromWalletImportFormat(wip[i],&seckey); + cr_assert(err==SKY_OK); + + cipher__PubKey pubkey; + + SKY_cipher_PubKeyFromSecKey(&seckey,&pubkey); + + unsigned char * pubkeyhextmp; + GoString_ string; + + SKY_cipher_PubKey_Hex(&pubkey,&string); + cr_assert(eq(type(GoString), (*(GoString*)&string),(*(GoString*)&pub[i]) )); + GoString bitcoinAddr; + SKY_cipher_BitcoinAddressFromPubkey(&pubkey, (GoString_ *)&bitcoinAddr); + cr_assert(eq(type(GoString),addr[i],bitcoinAddr)); + + } +} + +Test(cipher_address, TestAddressBulk){ + + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50 }; + + for (int i = 0; i < 1024; ++i) + { + randBytes(&slice,32); + cipher__PubKey pubkey; + cipher__SecKey seckey; + SKY_cipher_GenerateDeterministicKeyPair( slice,&pubkey,&seckey); + cipher__Address addr; + SKY_cipher_AddressFromPubKey(&pubkey,&addr); + unsigned int err; + err = SKY_cipher_Address_Verify(&addr,&pubkey); + cr_assert(err == SKY_OK); + GoString strAddr; + SKY_cipher_Address_String(&addr, (GoString_ *)&strAddr); + registerMemCleanup((void *) strAddr.p); + cipher__Address addr2; + + err = SKY_cipher_DecodeBase58Address(strAddr,&addr2); + cr_assert(err == SKY_OK); + cr_assert(eq(type(cipher__Address),addr,addr2)); + } + +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.crypto.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.crypto.c new file mode 100755 index 0000000..b8e2b1d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.crypto.c @@ -0,0 +1,734 @@ + +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +TestSuite(cipher_crypto, .init = setup, .fini = teardown); + +Test(cipher_crypto, TestNewPubKey) { + unsigned char buff[101]; + GoSlice slice; + cipher__PubKey pk; + + slice.data = buff; + slice.cap = 101; + + randBytes(&slice, 31); + slice.len = 31; + unsigned int errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "31 random bytes"); + + randBytes(&slice, 32); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "32 random bytes"); + + randBytes(&slice, 34); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "34 random bytes"); + + slice.len = 0; + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "0 random bytes"); + + randBytes(&slice, 100); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_ERROR, "100 random bytes"); + + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &pk); + cr_assert(errcode == SKY_OK, "33 random bytes"); + + cr_assert(eq(u8[33], pk, buff)); +} + +Test(cipher_crypto, TestPubKeyFromHex) { + cipher__PubKey p, p1; + GoString s; + unsigned char buff[51]; + char sbuff[101]; + GoSlice slice = { (void *)buff, 0, 51 }; + unsigned int errcode; + + // Invalid hex + s.n = 0; + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex. Empty string"); + + s.p = "cascs"; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex. Bad chars"); + + // Invalid hex length + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + strnhex(&p[0], sbuff, slice.len / 2); + s.p = sbuff; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_ERROR, "TestPubKeyFromHex: Invalid hex length"); + + // Valid + strnhex(p, sbuff, sizeof(p)); + s.p = sbuff; + s.n = strlen(s.p); + errcode = SKY_cipher_PubKeyFromHex(s, &p1); + cr_assert(errcode == SKY_OK, "TestPubKeyFromHex: Valid. No panic."); + cr_assert(eq(u8[33], p, p1)); +} + +Test(cipher_crypto, TestPubKeyHex) { + cipher__PubKey p, p2; + GoString s3, s4; + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50}; + unsigned int errcode; + + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + SKY_cipher_PubKey_Hex(&p, (GoString_ *) &s3); + registerMemCleanup((void *) s3.p); + errcode = SKY_cipher_PubKeyFromHex(s3, &p2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], p, p2)); + + SKY_cipher_PubKey_Hex(&p2, (GoString_ *)&s4); + registerMemCleanup((void *) s4.p); + // TODO: Translate into cr_assert(eq(type(GoString), s3, s4)); + cr_assert(s3.n == s4.n); + cr_assert(eq(str, ((char *) s3.p), ((char *) s4.p))); +} + +Test(cipher_crypto, TestPubKeyVerify) { + cipher__PubKey p; + unsigned char buff[50]; + GoSlice slice = { buff, 0, 50 }; + unsigned int errcode; + + int i = 0; + for (; i < 10; i++) { + randBytes(&slice, 33); + errcode = SKY_cipher_NewPubKey(slice, &p); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_ERROR); + } +} + +Test(cipher_crypto, TestPubKeyVerifyNil) { + cipher__PubKey p = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 + }; + unsigned int errcode; + + errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestPubKeyVerifyDefault1) { + cipher__PubKey p; + cipher__SecKey s; + + SKY_cipher_GenerateKeyPair(&p, &s); + unsigned int errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyVerifyDefault2) { + cipher__PubKey p; + cipher__SecKey s; + int i; + + for (i = 0; i < 1024; ++i) { + SKY_cipher_GenerateKeyPair(&p, &s); + unsigned int errcode = SKY_cipher_PubKey_Verify(&p); + cr_assert(errcode == SKY_OK); + } +} + +Test(cipher_crypto, TestPubKeyToAddressHash) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Ripemd160 h; + + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_PubKey_ToAddressHash(&p, &h); + // TODO: Translate code snippet + // + // x := sha256.Sum256(p[:]) + // x = sha256.Sum256(x[:]) + // rh := ripemd160.New() + // rh.Write(x[:]) + // y := rh.Sum(nil) + // assert.True(t, bytes.Equal(h[:], y)) + // + // +} + +Test(cipher_crypto, TestPubKeyToAddress) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Address addr; + cipher__Ripemd160 h; + int errcode; + + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_AddressFromPubKey(&p, &addr); + errcode = SKY_cipher_Address_Verify(&addr, &p); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyToAddress2) { + cipher__PubKey p; + cipher__SecKey s; + cipher__Address addr; + GoString_ addrStr; + int i, errcode; + + for (i = 0; i < 1024; i++) { + SKY_cipher_GenerateKeyPair(&p, &s); + SKY_cipher_AddressFromPubKey(&p, &addr); + //func (self Address) Verify(key PubKey) error + errcode = SKY_cipher_Address_Verify(&addr, &p); + cr_assert(errcode == SKY_OK); + SKY_cipher_Address_String(&addr, &addrStr); + registerMemCleanup((void *) addrStr.p); + errcode = SKY_cipher_DecodeBase58Address( + *((GoString*)&addrStr), &addr); + //func DecodeBase58Address(addr string) (Address, error) + cr_assert(errcode == SKY_OK); + } +} + +Test(cipher_crypto, TestMustNewSecKey) { + unsigned char buff[101]; + GoSlice b; + cipher__SecKey sk; + int errcode; + + b.data = buff; + b.cap = 101; + + randBytes(&b, 31); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 33); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 34); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 0); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 100); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 32); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, buff)); +} + +Test(cipher_crypto, TestMustSecKeyFromHex) { + GoString str; + cipher__SecKey sk, sk1; + unsigned int buff[50]; + GoSlice b; + char strBuff[101]; + GoString s; + int errcode; + + // Invalid hex + s.p = ""; + s.n = strlen(s.p); + errcode = SKY_cipher_SecKeyFromHex(s, &sk); + cr_assert(errcode == SKY_ERROR); + + s.p = "cascs"; + s.n = strlen(s.p); + errcode = SKY_cipher_SecKeyFromHex(s, &sk); + cr_assert(errcode == SKY_ERROR); + + // Invalid hex length + b.data = buff; + b.cap = 50; + randBytes(&b, 32); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_OK); + strnhex(sk, strBuff, 16); + s.p = strBuff; + s.n = strlen(strBuff); + errcode = SKY_cipher_SecKeyFromHex(s, &sk1); + cr_assert(errcode == SKY_ERROR); + + // Valid + strnhex(sk, strBuff, 32); + s.p = strBuff; + s.n = strlen(strBuff); + errcode = SKY_cipher_SecKeyFromHex(s, &sk1); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, sk1)); +} + +Test(cipher_crypto, TestSecKeyHex) { + cipher__SecKey sk, sk2; + unsigned char buff[101]; + char strBuff[50]; + GoSlice b; + GoString str, h; + int errcode; + + b.data = buff; + b.cap = 50; + h.p = strBuff; + h.n = 0; + + randBytes(&b, 32); + SKY_cipher_NewSecKey(b, &sk); + SKY_cipher_SecKey_Hex(&sk, (GoString_ *)&str); + registerMemCleanup((void *) str.p); + + // Copy early to ensure memory is released + strncpy((char *) h.p, str.p, str.n); + h.n = str.n; + + errcode = SKY_cipher_SecKeyFromHex(h, &sk2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[32], sk, sk2)); +} + +Test(cipher_crypto, TestSecKeyVerify) { + cipher__SecKey sk; + cipher__PubKey pk; + int errcode; + + // Empty secret key should not be valid + memset(sk, 0, 32); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_ERROR); + + // Generated sec key should be valid + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + // Random bytes are usually valid +} + +Test(cipher_crypto, TestECDHonce) { + cipher__PubKey pub1, pub2; + cipher__SecKey sec1, sec2; + unsigned char buff1[50], buff2[50]; + GoSlice_ buf1, buf2; + + buf1.data = buff1; + buf1.len = 0; + buf1.cap = 50; + buf2.data = buff2; + buf2.len = 0; + buf2.cap = 50; + + SKY_cipher_GenerateKeyPair(&pub1, &sec1); + SKY_cipher_GenerateKeyPair(&pub2, &sec2); + + SKY_cipher_ECDH(&pub2, &sec1, &buf1); + SKY_cipher_ECDH(&pub1, &sec2, &buf2); + + // ECDH shared secrets are 32 bytes SHA256 hashes in the end + cr_assert(eq(u8[32], buff1, buff2)); +} + +Test(cipher_crypto, TestECDHloop) { + int i; + cipher__PubKey pub1, pub2; + cipher__SecKey sec1, sec2; + unsigned char buff1[50], buff2[50]; + GoSlice_ buf1, buf2; + + buf1.data = buff1; + buf1.len = 0; + buf1.cap = 50; + buf2.data = buff2; + buf2.len = 0; + buf2.cap = 50; + + for (i = 0; i < 128; i++) { + SKY_cipher_GenerateKeyPair(&pub1, &sec1); + SKY_cipher_GenerateKeyPair(&pub2, &sec2); + SKY_cipher_ECDH(&pub2, &sec1, &buf1); + SKY_cipher_ECDH(&pub1, &sec2, &buf2); + cr_assert(eq(u8[32], buff1, buff2)); + } +} + +Test(cipher_crypto, TestNewSig) { + unsigned char buff[101]; + GoSlice b; + cipher__Sig s; + int errcode; + + b.data = buff; + b.len = 0; + b.cap = 101; + + randBytes(&b, 64); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 66); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 67); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 0); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 100); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], buff, s)); +} + +Test(cipher_crypto, TestMustSigFromHex) { + unsigned char buff[101]; + char strBuff[257]; + GoSlice b = { buff, 0, 101 }; + GoString str; + cipher__Sig s, s2; + int errcode; + + // Invalid hex + str.p = ""; + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + str.p = "cascs"; + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + // Invalid hex length + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + cr_assert(errcode == SKY_OK); + str.p = strBuff; + str.n = 0; + strnhex(s, (char *) str.p, 32); + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_ERROR); + + // Valid + strnhex(s, (char *) str.p, 65); + str.n = strlen(str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], s2, s)); +} + +Test(cipher_crypto, TestSigHex) { + unsigned char buff[66]; + GoSlice b = {buff, 0, 66}; + char strBuff[150], + strBuff2[150]; + GoString str = {NULL, 0}, + str2 = {NULL, 0}; + cipher__Sig s, s2; + int errcode; + + randBytes(&b, 65); + errcode = SKY_cipher_NewSig(b, &s); + + cr_assert(errcode == SKY_OK); + SKY_cipher_Sig_Hex(&s, (GoString_ *) &str); + registerMemCleanup((void *) str.p); + errcode = SKY_cipher_SigFromHex(str, &s2); + + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[65], s, s2)); + + SKY_cipher_Sig_Hex(&s2, (GoString_ *) &str2); + registerMemCleanup((void *) str2.p); + cr_assert(eq(type(GoString), str, str2)); +} + +Test(cipher_crypto, TestChkSig) { + cipher__PubKey pk, pk2; + cipher__SecKey sk, sk2; + cipher__Address addr, addr2; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + cipher__SHA256 h, h2; + cipher__Sig sig, sig2; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + SKY_cipher_AddressFromPubKey(&pk, &addr); + errcode = SKY_cipher_Address_Verify(&addr, &pk); + cr_assert(errcode == SKY_OK); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + + // Empty sig should be invalid + memset(&sig, 0, sizeof(sig)); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_ERROR); + + // Random sigs should not pass + int i; + for (i = 0; i < 100; i++) { + randBytes(&b, 65); + SKY_cipher_NewSig(b, &sig); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_ERROR); + } + + // Sig for one hash does not work for another hash + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h2); + SKY_cipher_SignHash(&h2, &sk, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h2, &sig2); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig2); + cr_assert(errcode == SKY_ERROR); + errcode = SKY_cipher_ChkSig(&addr, &h2, &sig); + cr_assert(errcode == SKY_ERROR); + + // Different secret keys should not create same sig + SKY_cipher_GenerateKeyPair(&pk2, &sk2); + SKY_cipher_AddressFromPubKey(&pk2, &addr2); + memset(&h, 0, sizeof(h)); + SKY_cipher_SignHash(&h, &sk, &sig); + SKY_cipher_SignHash(&h, &sk2, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig2); + cr_assert(errcode == SKY_OK); + cr_assert(not(eq(u8[65], sig, sig2))); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + SKY_cipher_SignHash(&h, &sk2, &sig2); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig2); + cr_assert(errcode == SKY_OK); + cr_assert(not(eq(u8[65], sig, sig2))); + + // Bad address should be invalid + errcode = SKY_cipher_ChkSig(&addr, &h, &sig2); + cr_assert(errcode == SKY_ERROR); + errcode = SKY_cipher_ChkSig(&addr2, &h, &sig); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestSignHash) { + cipher__PubKey pk; + cipher__SecKey sk; + cipher__Address addr; + unsigned char buff[257]; + GoSlice b = { buff, 0, 101 }; + cipher__SHA256 h; + cipher__Sig sig, sig2; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + SKY_cipher_AddressFromPubKey(&pk, &addr); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + memset((void *) &sig2, 0, 65); + cr_assert(not(eq(u8[65], sig2, sig))); + errcode = SKY_cipher_ChkSig(&addr, &h, &sig); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestPubKeyFromSecKey) { + cipher__PubKey pk, pk2; + cipher__SecKey sk; + unsigned char buff[101]; + GoSlice b = { buff, 0, 101 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKeyFromSecKey(&sk, &pk2); + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], pk, pk2)); + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_PubKeyFromSecKey(&sk, &pk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 99); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); + + randBytes(&b, 31); + errcode = SKY_cipher_NewSecKey(b, &sk); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestPubKeyFromSig) { + cipher__PubKey pk, pk2; + cipher__SecKey sk; + cipher__SHA256 h; + cipher__Sig sig; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_PubKeyFromSig(&sig, &h, &pk2); + + cr_assert(errcode == SKY_OK); + cr_assert(eq(u8[33], pk, pk2)); + + memset(&sig, 0, sizeof(sig)); + errcode = SKY_cipher_PubKeyFromSig(&sig, &h, &pk2); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestVerifySignature) { + cipher__PubKey pk, pk2; + cipher__SecKey sk, sk2; + cipher__SHA256 h, h2; + cipher__Sig sig, sig2; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257 }; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h2); + SKY_cipher_SignHash(&h, &sk, &sig); + errcode = SKY_cipher_VerifySignature(&pk, &sig, &h); + cr_assert(errcode == SKY_OK); + + memset(&sig2, 0, sizeof(sig2)); + errcode = SKY_cipher_VerifySignature(&pk, &sig2, &h); + cr_assert(errcode == SKY_ERROR); + + errcode = SKY_cipher_VerifySignature(&pk, &sig, &h2); + cr_assert(errcode == SKY_ERROR); + + SKY_cipher_GenerateKeyPair(&pk2, &sk2); + errcode = SKY_cipher_VerifySignature(&pk2, &sig, &h); + cr_assert(errcode == SKY_ERROR); + + memset(&pk2, 0, sizeof(pk2)); + errcode = SKY_cipher_VerifySignature(&pk2, &sig, &h); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestGenerateKeyPair) { + cipher__PubKey pk; + cipher__SecKey sk; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestGenerateDeterministicKeyPair) { + cipher__PubKey pk; + cipher__SecKey sk; + unsigned char buff[33]; + GoSlice seed = { buff, 0, 33 }; + int errcode; + + // TODO -- deterministic key pairs are useless as is because we can't + // generate pair n+1, only pair 0 + randBytes(&seed, 32); + SKY_cipher_GenerateDeterministicKeyPair(seed, &pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); + + SKY_cipher_GenerateDeterministicKeyPair(seed, &pk, &sk); + errcode = SKY_cipher_PubKey_Verify(&pk); + cr_assert(errcode == SKY_OK); + errcode = SKY_cipher_SecKey_Verify(&sk); + cr_assert(errcode == SKY_OK); +} + +Test(cipher_crypto, TestSecKeTest) { + cipher__PubKey pk; + cipher__SecKey sk; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + errcode = SKY_cipher_TestSecKey(&sk); + cr_assert(errcode == SKY_OK); + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_TestSecKey(&sk); + cr_assert(errcode == SKY_ERROR); +} + +Test(cipher_crypto, TestSecKeyHashTest) { + cipher__PubKey pk; + cipher__SecKey sk; + cipher__SHA256 h; + unsigned char buff[257]; + GoSlice b = { buff, 0, 257}; + int errcode; + + SKY_cipher_GenerateKeyPair(&pk, &sk); + randBytes(&b, 256); + SKY_cipher_SumSHA256(b, &h); + errcode = SKY_cipher_TestSecKeyHash(&sk, &h); + cr_assert(errcode == SKY_OK); + + + memset(&sk, 0, sizeof(sk)); + errcode = SKY_cipher_TestSecKeyHash(&sk, &h); + cr_assert(errcode == SKY_ERROR); +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.hash.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.hash.c new file mode 100755 index 0000000..0021920 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.hash.c @@ -0,0 +1,345 @@ +#include +#include + +#include +#include + +#include "libskycoin.h" +#include "skyerrors.h" +#include "skystring.h" +#include "skytest.h" + +TestSuite(cipher_hash, .init = setup, .fini = teardown); + +void freshSumRipemd160(GoSlice bytes, cipher__Ripemd160 *rp160){ + + SKY_cipher_HashRipemd160(bytes, rp160); +} + +void freshSumSHA256(GoSlice bytes, cipher__SHA256 *sha256){ + + SKY_cipher_SumSHA256(bytes, sha256); +} + +Test(cipher,TestHashRipemd160){ + cipher__Ripemd160 tmp; + cipher__Ripemd160 r; + cipher__Ripemd160 r2; + unsigned char buff[257]; + GoSlice slice = { buff, 0, 257 }; + + randBytes(&slice,128); + SKY_cipher_HashRipemd160(slice,&tmp); + randBytes(&slice,160); + SKY_cipher_HashRipemd160(slice,&r); + cr_assert(not(eq(u8[sizeof(cipher__Ripemd160)],tmp,r))); + + unsigned char buff1[257]; + GoSlice b = { buff1, 0, 257 }; + randBytes(&b,256); + SKY_cipher_HashRipemd160(b,&r2); + cr_assert(not(eq(u8[sizeof(cipher__Ripemd160)],r2,tmp))); + freshSumRipemd160(b,&tmp); + cr_assert(eq(u8[20],tmp,r2)); +} + +Test(cipher_hash,TestRipemd160Set){ + + cipher__Ripemd160 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + memset(h, 0, sizeof(cipher__Ripemd160)); + randBytes(&slice,21); + + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert( error == SKY_ERROR); + + randBytes(&slice,100); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,19); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,0); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,20); + error = SKY_cipher_Ripemd160_Set(&h,slice); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[20], h, buff)); +} + +Test(cipher_hash,TestSHA256Set){ + + cipher__SHA256 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + randBytes(&slice,33); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,100); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,31); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,0); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_ERROR); + + randBytes(&slice,32); + error=SKY_cipher_SHA256_Set(&h,slice); + cr_assert(error == SKY_OK); + + cr_assert(eq(u8[32], h, slice.data)); +} + +Test(cipher_hash,TestSHA256Hex){ + + cipher__SHA256 h; + unsigned char buff[101]; + GoSlice slice = { buff, 0, 101 }; + int error; + + memset(&h, 0, sizeof(h)); + randBytes(&slice,32); + SKY_cipher_SHA256_Set(&h,slice); + GoString s; + + SKY_cipher_SHA256_Hex(&h, (GoString_ *)&s); + registerMemCleanup((void*) s.p); + + cipher__SHA256 h2; + + error = SKY_cipher_SHA256FromHex(s, &h2 ); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[32],h,h2)); + + GoString s2; + + SKY_cipher_SHA256_Hex(&h2, (GoString_ *) &s2); + registerMemCleanup((void*) s2.p); + cr_assert(eq(type(GoString),s,s2)); +} + +Test(cipher_hash,TestSHA256KnownValue){ + + + typedef struct + { + char *input; + char *output; + } tmpstruct; + + tmpstruct vals[3]; + + vals[0].input = "skycoin"; + vals[0].output = "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d"; + + vals[1].input = "hello world"; + vals[1].output = "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"; + + vals[2].input = "hello world asd awd awd awdapodawpokawpod "; + vals[2].output = "99d71f95cafe05ea2dddebc35b6083bd5af0e44850c9dc5139b4476c99950be4"; + + for (int i = 0; i < 3; ++i) + { + GoSlice slice_input; + GoSlice slice_output; + + slice_input.data = vals[i].input; + slice_input.len = strlen(vals[i].input); + slice_input.cap = strlen(vals[i].input)+1; + + cipher__SHA256 sha; + + SKY_cipher_SumSHA256(slice_input,&sha); + + GoString_ tmp_output; + + SKY_cipher_SHA256_Hex(&sha,&tmp_output); + registerMemCleanup((void*) tmp_output.p); + + cr_assert(strcmp(tmp_output.p,vals[i].output)== SKY_OK); + } +} + +Test(cipher_hash,TestSumSHA256){ + + unsigned char bbuff[257], + cbuff[257]; + GoSlice b = { bbuff, 0, 257 }; + cipher__SHA256 h1; + randBytes(&b,256); + SKY_cipher_SumSHA256(b,&h1); + cipher__SHA256 tmp; + cr_assert(not(eq(u8[32],h1,tmp))); + GoSlice c = { cbuff, 0, 257 }; + randBytes(&c,256); + cipher__SHA256 h2; + SKY_cipher_SumSHA256(c,&h2); + cr_assert(not(eq(u8[32],h2,tmp))); + cipher__SHA256 tmp_h2; + freshSumSHA256(c,&tmp_h2); + cr_assert(eq(u8[32],h2,tmp_h2)); +} + +Test(cipher_hash,TestSHA256FromHex){ + unsigned int error; + cipher__SHA256 tmp; + // Invalid hex hash + GoString tmp_string = {"cawcd",5}; + error = SKY_cipher_SHA256FromHex(tmp_string,&tmp); + cr_assert(error == SKY_ERROR); + // Truncated hex hash + cipher__SHA256 h; + unsigned char buff[130]; + char sbuff[300]; + GoSlice slice = { buff,0,130 }; + randBytes(&slice,128); + SKY_cipher_SumSHA256(slice,&h); + strnhex(h,sbuff,sizeof(h) >> 1); + GoString s1 = { sbuff, strlen(sbuff) }; + error = SKY_cipher_SHA256FromHex(s1,&h); + cr_assert(error == SKY_ERROR); + + // Valid hex hash + // char sbuff1[300]; + GoString_ s2; + // strnhex(h,sbuff1,sizeof(h)); + SKY_cipher_SHA256_Hex(&h, &s2 ); + cipher__SHA256 h2; + error = SKY_cipher_SHA256FromHex((*((GoString *) &s2)),&h2); + cr_assert(error == SKY_OK); + cr_assert(eq(u8[32],h,h2)); +} + + +Test(cipher_hash,TestDoubleSHA256){ + unsigned char bbuff[130]; + GoSlice b = { bbuff, 0, 130 }; + randBytes(&b,128); + cipher__SHA256 h; + cipher__SHA256 tmp; + SKY_cipher_DoubleSHA256(b,&h); + cr_assert(not(eq(u8[32],tmp,h))); + freshSumSHA256(b,&tmp); + cr_assert(not(eq(u8[32],tmp,h))); +} + +Test(cipher_hash,TestAddSHA256){ + + unsigned char bbuff[130]; + GoSlice b = { bbuff, 0, 130 }; + randBytes(&b,128); + cipher__SHA256 h; + SKY_cipher_SumSHA256(b,&h); + + unsigned char cbuff[130]; + GoSlice c = { cbuff, 0, 130 }; + randBytes(&c,64); + cipher__SHA256 i; + SKY_cipher_SumSHA256(c,&i); + + cipher__SHA256 add; + cipher__SHA256 tmp; + + SKY_cipher_AddSHA256(&h,&i,&add); + + cr_assert(not(eq(u8[32],add,tmp))); + cr_assert(not(eq(u8[32],add,h))); + cr_assert(not(eq(u8[32],add,i))); +} + +Test(cipher_hash,TestXorSHA256){ + + unsigned char bbuff[129], + cbuff[129]; + GoSlice b = { bbuff, 0, 129 } ; + GoSlice c = { cbuff, 0, 129 }; + cipher__SHA256 h, i; + + randBytes(&b,128); + SKY_cipher_SumSHA256(b,&h); + randBytes(&c,128); + SKY_cipher_SumSHA256(c,&i); + + cipher__SHA256 tmp_xor1; + cipher__SHA256 tmp_xor2; + cipher__SHA256 tmp; + + SKY_cipher_SHA256_Xor(&h,&i,&tmp_xor1); + SKY_cipher_SHA256_Xor(&i,&h,&tmp_xor2); + + cr_assert(not(eq(u8[32],tmp_xor1,h))); + cr_assert(not(eq(u8[32],tmp_xor1,i))); + cr_assert(not(eq(u8[32],tmp_xor1,tmp))); + cr_assert(eq(u8[32],tmp_xor1,tmp_xor2)); + +} + +Test(cipher_hash,TestMerkle){ + unsigned char buff[129]; + cipher__SHA256 hashlist[5]; + GoSlice b = { buff, 0, 129 }, + hashes = { hashlist, 0, 5 }; + cipher__SHA256 h, zero, out, out1, out2, out3, out4; + int i; + + memset(zero, 0, sizeof(zero)); + + for (i = 0; i < 5; i++) { + randBytes(&b, 128); + SKY_cipher_SumSHA256(b, &hashlist[i]); + } + + // Single hash input returns hash + hashes.len = 1; + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], hashlist[0], h)); + + // 2 hashes should be Addcipher__SHA256 of them + hashes.len = 2; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 3 hashes should be Add(Add()) + hashes.len = 3; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &zero, &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 4 hashes should be Add(Add()) + hashes.len = 4; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &hashlist[3], &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); + + // 5 hashes + hashes.len = 5; + SKY_cipher_AddSHA256(&hashlist[0], &hashlist[1], &out1); + SKY_cipher_AddSHA256(&hashlist[2], &hashlist[3], &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out3); + SKY_cipher_AddSHA256(&hashlist[4], &zero, &out1); + SKY_cipher_AddSHA256(&zero, &zero, &out2); + SKY_cipher_AddSHA256(&out1, &out2, &out4); + SKY_cipher_AddSHA256(&out3, &out4, &out); + SKY_cipher_Merkle(&hashes, &h); + cr_assert(eq(u8[32], out, h)); +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.testsuite.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.testsuite.c new file mode 100755 index 0000000..d6b635d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/check_cipher.testsuite.c @@ -0,0 +1,83 @@ + +#include +#include + +#include "cipher.testsuite.testsuite.go.h" + +// TODO: File path utils. Move elsewhere. + +// Determine if a file name matches pattern for golden dataset +// i.e. matches 'seed-\d+.golden' regex +bool isGoldenFile(const char* filename) { + if (strncmp(filename, "seed-", 5) != 0) + return false; + char* ptr = (char*) filename + 5; + if (*ptr < '0' || *ptr > '9') + return false; + while (*++ptr >= '0' && *ptr <='9') {} + return strcmp(ptr, ".golden") == 0; +} + +TestSuite(cipher_testsuite, .init = setup, .fini = teardown); + +Test(cipher_testsuite, TestManyAddresses) { + SeedTestDataJSON dataJSON; + SeedTestData data; + GoUint32 err; + + json_value* json = loadGoldenFile(MANY_ADDRESSES_FILENAME); + cr_assert(json != NULL, "Error loading file %s", MANY_ADDRESSES_FILENAME); + registerJsonFree(json); + SeedTestDataJSON* dataset = jsonToSeedTestData(json, &dataJSON); + cr_assert(dataset != NULL, "Loaded JSON golden dataset must not be NULL"); + registerSeedTestDataJSONCleanup(&dataJSON); + err = SeedTestDataFromJSON(&dataJSON, &data); + registerSeedTestDataCleanup(&data); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + ValidateSeedData(&data, NULL); +} + +GoUint32 traverseGoldenFiles(const char *path, InputTestData* inputData) { + char* _path[2]; + _path[0] = (char *) path; + _path[1] = NULL; + size_t i = 0; + FTS* tree = fts_open(_path, FTS_NOCHDIR, NULL); + + if (!tree) + return 1; + FTSENT* node; + while ((node = fts_read(tree))) { + if ((node->fts_info & FTS_F) && isGoldenFile(node->fts_name)) { + char fn[FILENAME_MAX]; + fprintf(stderr, "Golden data set %s\n", node->fts_path); + SeedTestDataJSON seedDataJSON; + SeedTestData seedData; + + json_value* json = loadGoldenFile(node->fts_name); + cr_assert(json != NULL, "Error loading file %s", node->fts_name); + SeedTestDataJSON* dataset = jsonToSeedTestData(json, &seedDataJSON); + cr_assert(dataset != NULL, "Loaded JSON seed golden dataset must not be NULL"); + GoUint32 err = SeedTestDataFromJSON(&seedDataJSON, &seedData); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + ValidateSeedData(&seedData, inputData); + } + } + return 0; +} + +Test(cipher_testsuite, TestSeedSignatures) { + InputTestDataJSON inputDataJSON; + InputTestData inputData; + GoUint32 err; + + json_value* json = loadGoldenFile(INPUT_HASHES_FILENAME); + cr_assert(json != NULL, "Error loading file %s", INPUT_HASHES_FILENAME); + InputTestDataJSON* dataset = jsonToInputTestData(json, &inputDataJSON); + cr_assert(dataset != NULL, "Loaded JSON input golden dataset must not be NULL"); + err = InputTestDataFromJSON(&inputDataJSON, &inputData); + cr_assert(err == SKY_OK, "Deserializing seed test data from JSON ... %d", err); + err = traverseGoldenFiles(TEST_DATA_DIR, &inputData); + cr_assert(err == 0); +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/cipher.testsuite.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/cipher.testsuite.c new file mode 100755 index 0000000..7a4bae2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/cipher.testsuite.c @@ -0,0 +1,493 @@ + +#include "cipher.testsuite.testsuite.go.h" + +void empty_gostring(GoString *s) { + s->n = 0; + // FIXME: this satisfies 'all buffers allocated' contract + s->p = calloc(1, sizeof(char)); +} + +void empty_keysdataJSON(KeysTestDataJSON* kdj) { + empty_gostring(&kdj->Address); + empty_gostring(&kdj->Secret); + empty_gostring(&kdj->Public); + kdj->Signatures.len = 0; + kdj->Signatures.cap = 1; + kdj->Signatures.data = calloc(1, sizeof(GoString)); +} + +void json_get_gostring(json_value* value, GoString* s) { + if (value == NULL || value->type != json_string) { + empty_gostring(s); + } else { + s->n = value->u.string.length; + s->p = (const char *) calloc(s->n + 1, sizeof(char)); + memcpy((void *) s->p, (void *)value->u.string.ptr, s->n); + // Append NULL char , just in case + ((char *) s->p)[s->n] = 0; + } +} + +// FIXME: Move elsewhere +json_value* loadGoldenFile(const char* file) { + char path[FILENAME_MAX]; + if(strlen(TEST_DATA_DIR) + strlen(file) < FILENAME_MAX){ + strcat( strcpy(path, TEST_DATA_DIR) , file ); + return loadJsonFile(path); + } + return NULL; +} + +// Deserialize InputTestData JSON representation +InputTestDataJSON* jsonToInputTestData(json_value* json, InputTestDataJSON* input_data) { + if (!json || json->type != json_object) { + return NULL; + } + json_value* hashes = get_json_value(json, "hashes", json_array); + if (hashes == NULL) { + return NULL; + } + int i = 0, + length = hashes->u.array.length; + json_value** hashstr_value = hashes->u.array.values; + input_data->Hashes.len = input_data->Hashes.cap = length; + input_data->Hashes.data = calloc(length, sizeof(GoString)); + GoString* s = (GoString *) input_data->Hashes.data; + for (; i < length; i++, hashstr_value++, s++) { + if ((*hashstr_value)->type != json_string) { + // String value expected. Replace with empty string. + empty_gostring(s); + } else { + json_get_gostring(*hashstr_value, s); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with InputTestDataToJSON +InputTestData* registerInputTestDataCleanup(InputTestData* input_data) { + registerMemCleanup(input_data->Hashes.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with InputTestDataFromJSON +InputTestDataJSON* registerInputTestDataJSONCleanup(InputTestDataJSON* input_data) { + int i = 0, + length = input_data->Hashes.len; + GoString* s = input_data->Hashes.data; + for (; i < length; ++i, s++) { + registerMemCleanup((void *) s->p); + } + registerMemCleanup(input_data->Hashes.data); + return input_data; +} + +// InputTestDataToJSON converts InputTestData to InputTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - input_data.len * sizeof(GoString_) bytes for the strings slice data +// - Buffers to store individual string data +void InputTestDataToJSON(InputTestData* input_data, InputTestDataJSON* json_data) { + GoSlice* hashes = &input_data->Hashes; + GoSlice* hexstrings = &json_data->Hashes; + GoString_* s = hexstrings->data = calloc(hashes->len, sizeof(GoString_)); + hexstrings->len = hexstrings->cap = hashes->len; + + cipher__SHA256* hash = hashes->data; + + int i; + for (i = 0; i < hashes->len; i++, hash++, s++) { + SKY_cipher_SHA256_Hex(hash, s); + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +// +// Allocated memory has to be disposed for: +// +// - json_data.len * sizeof(cipher_SHA256) bytes for the strings slice data +GoUint32 InputTestDataFromJSON(InputTestDataJSON* json_data, InputTestData* input_data) { + GoSlice *hexstrings = &json_data->Hashes; + GoSlice* hashes = &input_data->Hashes; + cipher__SHA256* hash = hashes->data = calloc(hexstrings->len, sizeof(cipher__SHA256)); + hashes->len = hashes->cap = hexstrings->len; + + GoString* s = hexstrings->data; + + int i; + GoUint32 err = SKY_OK; + for (i = 0; i < hexstrings->len && err == SKY_OK; i++, s++, hash++) { + err = SKY_cipher_SHA256FromHex(*s, hash); + } + if (err != SKY_OK) + free(hashes->data); + return err; +} + +// Deserialize KeysTestData JSON representation +KeysTestDataJSON* jsonToKeysTestData(json_value* json, KeysTestDataJSON* input_data) { + if (json->type != json_object) { + return NULL; + } + json_value* value = json_get_string(json, "address"); + json_get_gostring(value, &input_data->Address); + value = json_get_string(json, "secret"); + json_get_gostring(value, &input_data->Secret); + value = json_get_string(json, "public"); + json_get_gostring(value, &input_data->Public); + + value = get_json_value(json, "signatures", json_array); + if (value == NULL) { + return input_data; + } + int i = 0, + length = value->u.array.length; + json_value** array_value = value->u.array.values; + input_data->Signatures.len = input_data->Signatures.cap = length; + input_data->Signatures.data = calloc(length, sizeof(GoString)); + GoString* s = (GoString *) input_data->Signatures.data; + for (; i < length; i++, array_value++, s++) { + if ((*array_value)->type != json_string) { + // String value expected. Replace with empty string + empty_gostring(s); + } else { + json_get_gostring(*array_value, s); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with KeysTestDataFromJSON +KeysTestData* registerKeysTestDataCleanup(KeysTestData* input_data) { + registerMemCleanup(input_data->Signatures.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with KeysTestDataFromJSON +KeysTestDataJSON* registerKeysTestDataJSONCleanup(KeysTestDataJSON* input_data) { + registerMemCleanup((void*) input_data->Address.p); + registerMemCleanup((void*) input_data->Secret.p); + registerMemCleanup((void*) input_data->Public.p); + + int i = 0, + length = input_data->Signatures.len; + GoString* s = input_data->Signatures.data; + for (; i < length; ++i, s++) { + registerMemCleanup((void *) s->p); + } + registerMemCleanup(input_data->Signatures.data); + return input_data; +} + +// KeysTestDataToJSON converts KeysTestData to KeysTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - input_data.Signatures.len * sizeof(GoString_) bytes for the strings slice data +// - Buffers to store individual string data +// - Buffer to store address hex string data +// - Buffer to store pubkey hex string data +// - Buffer to store seckey secret hex string data +void KeysTestDataToJson(KeysTestData* input_data, KeysTestDataJSON* json_data) { + SKY_cipher_Address_String(&input_data->Address, (GoString_*) &json_data->Address); + SKY_cipher_SecKey_Hex(&input_data->Secret, (GoString_*) &json_data->Secret); + SKY_cipher_PubKey_Hex(&input_data->Public, (GoString_*) &json_data->Public); + + json_data->Signatures.len = json_data->Signatures.cap = input_data->Signatures.len; + GoString* s = json_data->Signatures.data = calloc(input_data->Signatures.len, sizeof(GoString)); + + cipher__Sig* sig = (cipher__Sig*) input_data->Signatures.data; + int i; + + for (i = 0; i < input_data->Signatures.len; i++, sig++, s++) { + SKY_cipher_Sig_Hex(sig, (GoString_*) s); + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +// +// +// Allocated memory has to be disposed for: +// +// - json_data.Signatures.len * sizeof(cipher__Sig) bytes for sigs slice data +GoUint32 KeysTestDataFromJSON(KeysTestDataJSON* json_data, KeysTestData* input_data) { + GoUint32 err = SKY_cipher_DecodeBase58Address(json_data->Address, &input_data->Address); + if (err != SKY_OK) + return err; + err = SKY_cipher_SecKeyFromHex(json_data->Secret, &input_data->Secret); + if (err != SKY_OK) + return err; + err = SKY_cipher_PubKeyFromHex(json_data->Public, &input_data->Public); + if (err != SKY_OK) + return err; + + input_data->Signatures.len = input_data->Signatures.cap = json_data->Signatures.len; + input_data->Signatures.data = calloc(input_data->Signatures.cap, sizeof(cipher__Sig)); + cipher__Sig* sig = (cipher__Sig*) input_data->Signatures.data; + + GoString* s = (GoString*) json_data->Signatures.data; + int i; + err = SKY_OK; + + for (i = 0; i < json_data->Signatures.len && err == SKY_OK; i++, sig++, s++) { + SKY_cipher_SigFromHex(*s, sig); + } + if (err != SKY_OK) + free(input_data->Signatures.data); + return err; +} + +// Deserialize SeedTestData JSON representation +SeedTestDataJSON* jsonToSeedTestData(json_value* json, SeedTestDataJSON* input_data) { + if (json->type != json_object) { + return NULL; + } + json_value* value = json_get_string(json, "seed"); + json_get_gostring(value, &(input_data->Seed)); + + value = get_json_value(json, "keys", json_array); + int i = 0, + length = value->u.array.length; + json_value** array_value = value->u.array.values; + input_data->Keys.len = input_data->Keys.cap = length; + input_data->Keys.data = calloc(length, sizeof(KeysTestDataJSON)); + KeysTestDataJSON* kd = (KeysTestDataJSON*) input_data->Keys.data; + for (; i < length; i++, array_value++, kd++) { + if ((*array_value)->type != json_object) { + // String value expected. Replace with empty string + empty_keysdataJSON(kd); + } else { + jsonToKeysTestData(*array_value, kd); + } + } + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with SeedTestDataFromJSON +SeedTestData* registerSeedTestDataCleanup(SeedTestData* input_data) { + registerMemCleanup(input_data->Seed.data); + + int i = 0, + length = input_data->Keys.len; + KeysTestData* kd = input_data->Keys.data; + for (; i < length; ++i, kd++) { + registerKeysTestDataCleanup(kd); + } + registerMemCleanup(input_data->Keys.data); + return input_data; +} + +// Mark all elements of input data for disposal +// +// Cleanup is consistent with SeedTestDataFromJSON +SeedTestDataJSON* registerSeedTestDataJSONCleanup(SeedTestDataJSON* input_data) { + registerMemCleanup((void*) input_data->Seed.p); + + int i = 0, + length = input_data->Keys.len; + KeysTestDataJSON* kd = input_data->Keys.data; + for (; i < length; ++i, kd++) { + registerKeysTestDataJSONCleanup((void*) kd); + } + registerMemCleanup(input_data->Keys.data); + return input_data; +} + +// SeedTestDataToJSON converts SeedTestData to SeedTestDataJSON +// +// Allocated memory has to be disposed for: +// +// - Buffer to store seed hex data +// - input_data.Keys.len * sizeof(KeysTestDataJSON) bytes for keys test data slice +// - Memory requirements to allocate JSON data for instances of KeysTestDataJSON in Keys +// see KeysTestDataToJSON +void SeedTestDataToJson(SeedTestData* input_data, SeedTestDataJSON* json_data) { + json_data->Keys.len = json_data->Keys.cap = input_data->Keys.len; + json_data->Keys.data = calloc(input_data->Keys.len, sizeof(KeysTestDataJSON)); + KeysTestDataJSON* kj = (KeysTestDataJSON*) json_data->Keys.data; + + KeysTestData* k = (KeysTestData*) input_data->Keys.data; + int i; + + for (i = 0; i < input_data->Keys.len; i++, k++, kj++) { + KeysTestDataToJson(k, kj); + } + + unsigned int b64seed_size = b64e_size(input_data->Seed.len + 1) + 1; + json_data->Seed.p = malloc(b64seed_size); + json_data->Seed.n = b64_encode((const unsigned char*) input_data->Seed.data, + input_data->Seed.len, input_data->Seed.data); +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +// +// +// Allocated memory has to be disposed for: +// +// - Seed slice bytes buffer +// - json_data.Keys.len * sizeof(cipher__KeysTestData) bytes for keys test slice data +// - Memory requirements to allocate individual instances of KeyTestData in Keys +// see KeysTestDataFromJSON +GoUint32 SeedTestDataFromJSON(SeedTestDataJSON* json_data, SeedTestData* input_data) { + input_data->Seed.cap = b64d_size(json_data->Seed.n); + input_data->Seed.data = malloc(input_data->Seed.cap); + input_data->Seed.len = b64_decode((const unsigned char *)json_data->Seed.p, + json_data->Seed.n, input_data->Seed.data); + + input_data->Keys.len = input_data->Keys.cap = json_data->Keys.len; + input_data->Keys.data = calloc(input_data->Keys.cap, sizeof(KeysTestData)); + KeysTestData* k = (KeysTestData*) input_data->Keys.data; + + KeysTestDataJSON* kj = (KeysTestDataJSON*) json_data->Keys.data; + int i; + GoUint32 err = SKY_OK; + + for (i = 0; i < json_data->Keys.len && err == SKY_OK; i++, k++, kj++) { + err = KeysTestDataFromJSON(kj, k); + } + if (err != SKY_OK) + free(input_data->Keys.data); + return err; +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +void ValidateSeedData(SeedTestData* seedData, InputTestData* inputData) { + cipher__PubKey pubkey; + cipher__SecKey seckey; + GoSlice keys; + + // Force allocation of memory for slice buffer + keys.len = keys.cap = 0; + keys.data = NULL; + + SKY_cipher_GenerateDeterministicKeyPairs(seedData->Seed, seedData->Keys.len, (GoSlice_*) &keys); + + cr_assert(keys.data != NULL, + "SKY_cipher_GenerateDeterministicKeyPairs must allocate memory slice with zero cap"); + // Ensure buffer allocated for generated keys is disposed after testing + registerMemCleanup(keys.data); + cr_assert(seedData->Keys.len - keys.len == 0, + "SKY_cipher_GenerateDeterministicKeyPairs must generate expected number of keys"); + + cipher__SecKey skNull; + cipher__PubKey pkNull; + cipher__Address addrNull; + cipher__Sig sigNull; + + struct cr_mem mem_actual; + struct cr_mem mem_expect; + + memset((void *)&skNull, 0, sizeof(cipher__SecKey)); + memset((void *)&pkNull, 0, sizeof(cipher__PubKey)); + memset((void *)&addrNull, 0, sizeof(cipher__Address)); + memset((void *)&sigNull, 0, sizeof(cipher__Sig)); + + int i = 0; + KeysTestData* expected = (KeysTestData*) seedData->Keys.data; + cipher__SecKey *s = (cipher__SecKey*) keys.data; + for (; i < keys.len; i++, s++, expected++) { + mem_expect.data = skNull; + mem_actual.data = *s; + mem_actual.size = mem_expect.size = sizeof(cipher__SecKey); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th secret key must not be null", i); + cr_assert(eq(u8[32], (*s), expected->Secret), + "%d-th generated secret key must match provided secret key", i); + + cipher__PubKey p; + SKY_cipher_PubKeyFromSecKey(s, &p); + mem_expect.data = pkNull; + mem_actual.data = p; + mem_actual.size = mem_expect.size = sizeof(cipher__PubKey); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th public key must not be null", i); + cr_assert(eq(u8[33], expected->Public, p), + "%d-th derived public key must match provided public key", i); + + cipher__Address addr1; + SKY_cipher_AddressFromPubKey(&p, &addr1); + cr_assert(ne(type(cipher__Address), addrNull, addr1), + "%d-th address from pubkey must not be null", i); + cr_assert(eq(type(cipher__Address), expected->Address, addr1), + "%d-th derived address must match provided address", i); + + cipher__Address addr2; + SKY_cipher_AddressFromSecKey(s, &addr2); + cr_assert(ne(type(cipher__Address), addrNull, addr1), + "%d-th address from sec key must not be null", i); + cr_assert(eq(type(cipher__Address), addr1, addr2), + "%d-th SKY_cipher_AddressFromPubKey and SKY_cipher_AddressFromSecKey must generate same addresses", i); + + // TODO : Translate once secp256k1 be part of libskycoin + /* + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + */ + + // FIXME: without cond : 'not give a valid preprocessing token' + bool cond = (!(inputData == NULL && expected->Signatures.len != 0)); + cr_assert(cond, "%d seed data contains signatures but input data was not provided", i); + + if (inputData != NULL) { + cr_assert(expected->Signatures.len == inputData->Hashes.len, + "Number of signatures in %d-th seed data does not match number of hashes in input data", i); + + cipher__SHA256* h = (cipher__SHA256*) inputData->Hashes.data; + cipher__Sig* sig = (cipher__Sig*) expected->Signatures.data; + int j = 0; + for (; j < inputData->Hashes.len; j++, h++, sig++) { + mem_expect.data = sigNull; + mem_actual.data = *sig; + mem_actual.size = mem_expect.size = sizeof(cipher__Sig); + cr_assert(ne(mem, mem_actual, mem_expect), + "%d-th provided signature for %d-th data set must not be null", j, i); + GoUint32 err = SKY_cipher_VerifySignature(&p, sig, h); + cr_assert(err == SKY_OK, + "SKY_cipher_VerifySignature failed: error=%d dataset=%d hashidx=%d", err, i, j); + err = SKY_cipher_ChkSig(&addr1, h, sig); + cr_assert(err == SKY_OK, "SKY_cipher_ChkSig failed: error=%d dataset=%d hashidx=%d", err, i, j); + err = SKY_cipher_VerifySignedHash(sig, h); + cr_assert(err == SKY_OK, + "SKY_cipher_VerifySignedHash failed: error=%d dataset=%d hashidx=%d", err, i, j); + + cipher__PubKey p2; + err = SKY_cipher_PubKeyFromSig(sig, h, &p2); + cr_assert(err == SKY_OK, + "SKY_cipher_PubKeyFromSig failed: error=%d dataset=%d hashidx=%d", err, i, j); + cr_assert(eq(u8[32], p, p2), + "public key derived from %d-th signature in %d-th dataset must match public key derived from secret", + j, i); + + cipher__Sig sig2; + SKY_cipher_SignHash(h, s, &sig2); + mem_expect.data = sigNull; + mem_actual.data = sig2; + mem_actual.size = mem_expect.size = sizeof(cipher__Sig); + cr_assert(ne(mem, mem_actual, mem_expect), + "created signature for %d-th hash in %d-th dataset is null", j, i); + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_criterion.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_criterion.c new file mode 100755 index 0000000..80e7bcf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_criterion.c @@ -0,0 +1,104 @@ + +#include +#include "skycriterion.h" +#include "skystring.h" + +int cr_user_cipher__Address_eq(cipher__Address *addr1, cipher__Address *addr2){ + if(addr1->Version != addr2->Version) + return 0; + for (int i = 0; i < sizeof(cipher__Ripemd160); ++i) { + if(addr1->Key[i] != addr2->Key[i]) + return 0; + } + return 1; +} + +char *cr_user_cipher__Address_tostr(cipher__Address *addr1) +{ + char *out; + + cr_asprintf(&out, "(cipher__Address) { .Key = %s, .Version = %llu }", addr1->Key, (unsigned long long) addr1->Version); + return out; +} + +int cr_user_cipher__Address_noteq(cipher__Address *addr1, cipher__Address *addr2){ + if(addr1->Version != addr2->Version) + return 0; + for (int i = 0; i < sizeof(cipher__Ripemd160); ++i) { + if(addr1->Key[i] != addr2->Key[i]) + return 0; + } + return 1; +} + +int cr_user_GoString_eq(GoString *string1, GoString *string2){ + return (string1->n == string2->n) && + (strcmp( (char *) string1->p, (char *) string2->p) == 0); +} + +char *cr_user_GoString_tostr(GoString *string) +{ + char *out; + cr_asprintf(&out, "(GoString) { .Data = %s, .Length = %llu }", + string->p, (unsigned long long) string->n); + return out; +} + +int cr_user_GoString__eq(GoString_ *string1, GoString_ *string2){ + return cr_user_GoString_eq((GoString *) &string1, (GoString *) &string2); +} + +char *cr_user_GoString__tostr(GoString_ *string) { + return cr_user_GoString_tostr((GoString *)string); +} + +int cr_user_cipher__SecKey_eq(cipher__SecKey *seckey1, cipher__SecKey *seckey2){ + return memcmp((void *)seckey1,(void *)seckey2, sizeof(cipher__SecKey)) == 0; +} + +char *cr_user_cipher__SecKey_tostr(cipher__SecKey *seckey1) +{ + char *out; + char hexdump[101]; + + strnhex((unsigned char *)seckey1, hexdump, sizeof(cipher__SecKey)); + cr_asprintf(&out, "(cipher__SecKey) { %s }", hexdump); + return out; +} + + +int cr_user_cipher__Ripemd160_noteq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2){ + return memcmp((void *)rp1,(void *)rp2, sizeof(cipher__Ripemd160)) != 0; +} + +int cr_user_cipher__Ripemd160_eq(cipher__Ripemd160 *rp1, cipher__Ripemd160 *rp2){ + return memcmp((void *)rp1,(void *)rp2, sizeof(cipher__Ripemd160)) == 0; +} + +char *cr_user_cipher__Ripemd160_tostr(cipher__Ripemd160 *rp1) +{ + char *out; + char hexdump[101]; + + strnhex((unsigned char *)rp1, hexdump, sizeof(cipher__Ripemd160)); + cr_asprintf(&out, "(cipher__Ripemd160) { %s }", hexdump ); + return out; +} + +int cr_user_cipher__SHA256_noteq(cipher__SHA256 *sh1, cipher__SHA256 *sh2){ + return memcmp((void *)sh1,(void *)sh1, sizeof(cipher__SHA256)) != 0; +} + +int cr_user_cipher__SHA256_eq(cipher__SHA256 *sh1, cipher__SHA256 *sh2){ + return memcmp((void *)sh1,(void *)sh1, sizeof(cipher__SHA256)) == 0; +} + +char *cr_user_cipher__SHA256_tostr(cipher__SHA256 *sh1) { + char *out; + char hexdump[101]; + + strnhex((unsigned char *)sh1, hexdump, sizeof(cipher__SHA256)); + cr_asprintf(&out, "(cipher__SHA256) { %s }", hexdump); + return out; +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_string.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_string.c new file mode 100755 index 0000000..5cf44ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_string.c @@ -0,0 +1,30 @@ + +#include "skystring.h" + +#define ALPHANUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +#define ALPHANUM_LEN 62 +#define SIZE_ALL -1 + +void randBytes(GoSlice *bytes, size_t n) { + size_t i = 0; + unsigned char *ptr = (unsigned char *) bytes->data; + for (; i < n; ++i, ++ptr) { + *ptr = ALPHANUM[rand() % ALPHANUM_LEN]; + } + bytes->len = (GoInt) n; +} + +void strnhex(unsigned char* buf, char *str, int n){ + unsigned char * pin = buf; + const char * hex = "0123456789ABCDEF"; + char * pout = str; + for(; *pin && n; --n){ + *pout++ = hex[(*pin>>4)&0xF]; + *pout++ = hex[(*pin++)&0xF]; + } + *pout = 0; +} + +void strhex(unsigned char* buf, char *str){ + strnhex(buf, str, SIZE_ALL); +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_testutil.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_testutil.c new file mode 100755 index 0000000..b38a03b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/libsky_testutil.c @@ -0,0 +1,121 @@ + +#include +#include +#include +#include +#include + +#include "json.h" +#include "skytest.h" +#include "skytypes.h" + +int MEMPOOLIDX = 0; +void *MEMPOOL[1024 * 256]; + +int JSONPOOLIDX = 0; +json_value* JSON_POOL[128]; + +void* registerMemCleanup(void* p) { + int i; + for (i = 0; i < MEMPOOLIDX; i++) { + if(MEMPOOL[i] == NULL){ + MEMPOOL[i] = p; + return p; + } + } + MEMPOOL[MEMPOOLIDX++] = p; + return p; +} + +int registerJsonFree(void *p){ + int i; + for (i = 0; i < JSONPOOLIDX; i++) { + if(JSON_POOL[i] == NULL){ + JSON_POOL[i] = p; + return i; + } + } + JSON_POOL[JSONPOOLIDX++] = p; + return JSONPOOLIDX-1; +} + +void cleanupMem() { + int i; + void **ptr; + + for (i = MEMPOOLIDX, ptr = MEMPOOL; i; --i) { + if( *ptr ) { + free(*ptr); + *ptr = NULL; + } + ptr++; + } + MEMPOOLIDX = 0; + for (i = JSONPOOLIDX, ptr = (void*)JSON_POOL; i; --i) { + if( *ptr ) { + json_value_free(*ptr); + *ptr = NULL; + } + ptr++; + } + JSONPOOLIDX = 0; +} + +json_value* loadJsonFile(const char* filename){ + FILE *fp; + struct stat filestatus; + int file_size; + char* file_contents; + json_char* json; + json_value* value; + + if ( stat(filename, &filestatus) != 0) { + return NULL; + } + file_size = filestatus.st_size; + file_contents = (char*)malloc(filestatus.st_size); + if ( file_contents == NULL) { + return NULL; + } + fp = fopen(filename, "rt"); + if (fp == NULL) { + free(file_contents); + return NULL; + } + if ( fread(file_contents, file_size, 1, fp) != 1 ) { + fclose(fp); + free(file_contents); + return NULL; + } + fclose(fp); + + json = (json_char*)file_contents; + value = json_parse(json, file_size); + free(file_contents); + return value; +} + +void setup(void) { + srand ((unsigned int) time (NULL)); +} + +void teardown(void) { + cleanupMem(); +} + +// TODO: Move to libsky_io.c +void fprintbuff(FILE *f, void *buff, size_t n) { + unsigned char *ptr = (unsigned char *) buff; + fprintf(f, "[ "); + for (; n; --n, ptr++) { + fprintf(f, "%02d ", *ptr); + } + fprintf(f, "]"); +} + + +void toGoString(GoString_ *s, GoString *r){ +GoString * tmp = r; + + *tmp = (*(GoString *) s); +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/base64.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/base64.c new file mode 100755 index 0000000..fa9585b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/base64.c @@ -0,0 +1,187 @@ +/* +base64.c - by Joe DF (joedf@ahkscript.org) +Released under the MIT License + +See "base64.h", for more information. + +Thank you for inspiration: +http://www.codeproject.com/Tips/813146/Fast-base-functions-for-encode-decode +*/ + +#include "base64.h" +#include + +//Base64 char table - used internally for encoding +unsigned char b64_chr[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +unsigned int b64_int(unsigned int ch) { + // ASCII to base64_int + // 65-90 Upper Case >> 0-25 + // 97-122 Lower Case >> 26-51 + // 48-57 Numbers >> 52-61 + // 43 Plus (+) >> 62 + // 47 Slash (/) >> 63 + // 61 Equal (=) >> 64~ + if (ch==43) + return 62; + if (ch==47) + return 63; + if (ch==61) + return 64; + if ((ch>47) && (ch<58)) + return ch + 4; + if ((ch>64) && (ch<91)) + return ch - 'A'; + if ((ch>96) && (ch<123)) + return (ch - 'a') + 26; + return 0; +} + +unsigned int b64e_size(unsigned int in_size) { + // size equals 4*floor((1/3)*(in_size+2)); + int i, j = 0; + for (i=0;i>2 ]; + out[k+1] = b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ]; + out[k+2] = b64_chr[ ((s[1]&0x0F)<<2)+((s[2]&0xC0)>>6) ]; + out[k+3] = b64_chr[ s[2]&0x3F ]; + j=0; k+=4; + } + } + + if (j) { + if (j==1) + s[1] = 0; + out[k+0] = b64_chr[ (s[0]&255)>>2 ]; + out[k+1] = b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ]; + if (j==2) + out[k+2] = b64_chr[ ((s[1]&0x0F)<<2) ]; + else + out[k+2] = '='; + out[k+3] = '='; + k+=4; + } + + out[k] = '\0'; + + return k; +} + +unsigned int b64_decode(const unsigned char* in, unsigned int in_len, unsigned char* out) { + + unsigned int i=0, j=0, k=0, s[4]; + for (i=0;i>4); + if (s[2]!=64) { + out[k+1] = ((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2); + if ((s[3]!=64)) { + out[k+2] = ((s[2]&0x03)<<6)+(s[3]); k+=3; + } else { + k+=2; + } + } else { + k+=1; + } + j=0; + } + } + + return k; +} + +unsigned int b64_encodef(char *InFile, char *OutFile) { + + FILE *pInFile = fopen(InFile,"rb"); + FILE *pOutFile = fopen(OutFile,"wb"); + if ( (pInFile==NULL) || (pOutFile==NULL) ) + return 0; + + unsigned int i=0, j=0, c=0, s[3]; + + while(c!=EOF) { + c=fgetc(pInFile); + if (c==EOF) + break; + s[j++]=c; + if (j==3) { + fputc(b64_chr[ (s[0]&255)>>2 ],pOutFile); + fputc(b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ],pOutFile); + fputc(b64_chr[ ((s[1]&0x0F)<<2)+((s[2]&0xC0)>>6) ],pOutFile); + fputc(b64_chr[ s[2]&0x3F ],pOutFile); + j=0; i+=4; + } + } + + if (j) { + if (j==1) + s[1] = 0; + fputc(b64_chr[ (s[0]&255)>>2 ],pOutFile); + fputc(b64_chr[ ((s[0]&0x03)<<4)+((s[1]&0xF0)>>4) ],pOutFile); + if (j==2) + fputc(b64_chr[ ((s[1]&0x0F)<<2) ],pOutFile); + else + fputc('=',pOutFile); + fputc('=',pOutFile); + i+=4; + } + + fclose(pInFile); + fclose(pOutFile); + + return i; +} + +unsigned int b64_decodef(char *InFile, char *OutFile) { + + FILE *pInFile = fopen(InFile,"rb"); + FILE *pOutFile = fopen(OutFile,"wb"); + if ( (pInFile==NULL) || (pOutFile==NULL) ) + return 0; + + unsigned int c=0, j=0, k=0, s[4]; + + while(c!=EOF) { + c=fgetc(pInFile); + if (c==EOF) + break; + s[j++]=b64_int(c); + if (j==4) { + fputc(((s[0]&255)<<2)+((s[1]&0x30)>>4),pOutFile); + if (s[2]!=64) { + fputc(((s[1]&0x0F)<<4)+((s[2]&0x3C)>>2),pOutFile); + if ((s[3]!=64)) { + fputc(((s[2]&0x03)<<6)+(s[3]),pOutFile); k+=3; + } else { + k+=2; + } + } else { + k+=1; + } + j=0; + } + } + + fclose(pInFile); + fclose(pOutFile); + + return k; +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json.c new file mode 100755 index 0000000..bae4b35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json.c @@ -0,0 +1,1012 @@ + +/* vim: set et ts=3 sw=3 sts=3 ft=c: + * + * Copyright (C) 2012, 2013, 2014 James McLaughlin et al. All rights reserved. + * https://github.com/udp/json-parser + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "json.h" + +#ifdef _MSC_VER + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif +#endif + +const struct _json_value json_value_none; + +#include +#include +#include +#include + +typedef unsigned int json_uchar; + +static unsigned char hex_value (json_char c) +{ + if (isdigit(c)) + return c - '0'; + + switch (c) { + case 'a': case 'A': return 0x0A; + case 'b': case 'B': return 0x0B; + case 'c': case 'C': return 0x0C; + case 'd': case 'D': return 0x0D; + case 'e': case 'E': return 0x0E; + case 'f': case 'F': return 0x0F; + default: return 0xFF; + } +} + +typedef struct +{ + unsigned long used_memory; + + unsigned int uint_max; + unsigned long ulong_max; + + json_settings settings; + int first_pass; + + const json_char * ptr; + unsigned int cur_line, cur_col; + +} json_state; + +static void * default_alloc (size_t size, int zero, void * user_data) +{ + return zero ? calloc (1, size) : malloc (size); +} + +static void default_free (void * ptr, void * user_data) +{ + free (ptr); +} + +static void * json_alloc (json_state * state, unsigned long size, int zero) +{ + if ((state->ulong_max - state->used_memory) < size) + return 0; + + if (state->settings.max_memory + && (state->used_memory += size) > state->settings.max_memory) + { + return 0; + } + + return state->settings.mem_alloc (size, zero, state->settings.user_data); +} + +static int new_value (json_state * state, + json_value ** top, json_value ** root, json_value ** alloc, + json_type type) +{ + json_value * value; + int values_size; + + if (!state->first_pass) + { + value = *top = *alloc; + *alloc = (*alloc)->_reserved.next_alloc; + + if (!*root) + *root = value; + + switch (value->type) + { + case json_array: + + if (value->u.array.length == 0) + break; + + if (! (value->u.array.values = (json_value **) json_alloc + (state, value->u.array.length * sizeof (json_value *), 0)) ) + { + return 0; + } + + value->u.array.length = 0; + break; + + case json_object: + + if (value->u.object.length == 0) + break; + + values_size = sizeof (*value->u.object.values) * value->u.object.length; + + if (! (value->u.object.values = (json_object_entry *) json_alloc + (state, values_size + ((unsigned long) value->u.object.values), 0)) ) + { + return 0; + } + + value->_reserved.object_mem = (*(char **) &value->u.object.values) + values_size; + + value->u.object.length = 0; + break; + + case json_string: + + if (! (value->u.string.ptr = (json_char *) json_alloc + (state, (value->u.string.length + 1) * sizeof (json_char), 0)) ) + { + return 0; + } + + value->u.string.length = 0; + break; + + default: + break; + }; + + return 1; + } + + if (! (value = (json_value *) json_alloc + (state, sizeof (json_value) + state->settings.value_extra, 1))) + { + return 0; + } + + if (!*root) + *root = value; + + value->type = type; + value->parent = *top; + + #ifdef JSON_TRACK_SOURCE + value->line = state->cur_line; + value->col = state->cur_col; + #endif + + if (*alloc) + (*alloc)->_reserved.next_alloc = value; + + *alloc = *top = value; + + return 1; +} + +#define whitespace \ + case '\n': ++ state.cur_line; state.cur_col = 0; \ + case ' ': case '\t': case '\r' + +#define string_add(b) \ + do { if (!state.first_pass) string [string_length] = b; ++ string_length; } while (0); + +#define line_and_col \ + state.cur_line, state.cur_col + +static const long + flag_next = 1 << 0, + flag_reproc = 1 << 1, + flag_need_comma = 1 << 2, + flag_seek_value = 1 << 3, + flag_escaped = 1 << 4, + flag_string = 1 << 5, + flag_need_colon = 1 << 6, + flag_done = 1 << 7, + flag_num_negative = 1 << 8, + flag_num_zero = 1 << 9, + flag_num_e = 1 << 10, + flag_num_e_got_sign = 1 << 11, + flag_num_e_negative = 1 << 12, + flag_line_comment = 1 << 13, + flag_block_comment = 1 << 14; + +json_value * json_parse_ex (json_settings * settings, + const json_char * json, + size_t length, + char * error_buf) +{ + json_char error [json_error_max]; + const json_char * end; + json_value * top, * root, * alloc = 0; + json_state state = { 0 }; + long flags; + long num_digits = 0, num_e = 0; + json_int_t num_fraction = 0; + + /* Skip UTF-8 BOM + */ + if (length >= 3 && ((unsigned char) json [0]) == 0xEF + && ((unsigned char) json [1]) == 0xBB + && ((unsigned char) json [2]) == 0xBF) + { + json += 3; + length -= 3; + } + + error[0] = '\0'; + end = (json + length); + + memcpy (&state.settings, settings, sizeof (json_settings)); + + if (!state.settings.mem_alloc) + state.settings.mem_alloc = default_alloc; + + if (!state.settings.mem_free) + state.settings.mem_free = default_free; + + memset (&state.uint_max, 0xFF, sizeof (state.uint_max)); + memset (&state.ulong_max, 0xFF, sizeof (state.ulong_max)); + + state.uint_max -= 8; /* limit of how much can be added before next check */ + state.ulong_max -= 8; + + for (state.first_pass = 1; state.first_pass >= 0; -- state.first_pass) + { + json_uchar uchar; + unsigned char uc_b1, uc_b2, uc_b3, uc_b4; + json_char * string = 0; + unsigned int string_length = 0; + + top = root = 0; + flags = flag_seek_value; + + state.cur_line = 1; + + for (state.ptr = json ;; ++ state.ptr) + { + json_char b = (state.ptr == end ? 0 : *state.ptr); + + if (flags & flag_string) + { + if (!b) + { sprintf (error, "Unexpected EOF in string (at %d:%d)", line_and_col); + goto e_failed; + } + + if (string_length > state.uint_max) + goto e_overflow; + + if (flags & flag_escaped) + { + flags &= ~ flag_escaped; + + switch (b) + { + case 'b': string_add ('\b'); break; + case 'f': string_add ('\f'); break; + case 'n': string_add ('\n'); break; + case 'r': string_add ('\r'); break; + case 't': string_add ('\t'); break; + case 'u': + + if (end - state.ptr <= 4 || + (uc_b1 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b2 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b3 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b4 = hex_value (*++ state.ptr)) == 0xFF) + { + sprintf (error, "Invalid character value `%c` (at %d:%d)", b, line_and_col); + goto e_failed; + } + + uc_b1 = (uc_b1 << 4) | uc_b2; + uc_b2 = (uc_b3 << 4) | uc_b4; + uchar = (uc_b1 << 8) | uc_b2; + + if ((uchar & 0xF800) == 0xD800) { + json_uchar uchar2; + + if (end - state.ptr <= 6 || (*++ state.ptr) != '\\' || (*++ state.ptr) != 'u' || + (uc_b1 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b2 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b3 = hex_value (*++ state.ptr)) == 0xFF || + (uc_b4 = hex_value (*++ state.ptr)) == 0xFF) + { + sprintf (error, "Invalid character value `%c` (at %d:%d)", b, line_and_col); + goto e_failed; + } + + uc_b1 = (uc_b1 << 4) | uc_b2; + uc_b2 = (uc_b3 << 4) | uc_b4; + uchar2 = (uc_b1 << 8) | uc_b2; + + uchar = 0x010000 | ((uchar & 0x3FF) << 10) | (uchar2 & 0x3FF); + } + + if (sizeof (json_char) >= sizeof (json_uchar) || (uchar <= 0x7F)) + { + string_add ((json_char) uchar); + break; + } + + if (uchar <= 0x7FF) + { + if (state.first_pass) + string_length += 2; + else + { string [string_length ++] = 0xC0 | (uchar >> 6); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + } + + if (uchar <= 0xFFFF) { + if (state.first_pass) + string_length += 3; + else + { string [string_length ++] = 0xE0 | (uchar >> 12); + string [string_length ++] = 0x80 | ((uchar >> 6) & 0x3F); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + } + + if (state.first_pass) + string_length += 4; + else + { string [string_length ++] = 0xF0 | (uchar >> 18); + string [string_length ++] = 0x80 | ((uchar >> 12) & 0x3F); + string [string_length ++] = 0x80 | ((uchar >> 6) & 0x3F); + string [string_length ++] = 0x80 | (uchar & 0x3F); + } + + break; + + default: + string_add (b); + }; + + continue; + } + + if (b == '\\') + { + flags |= flag_escaped; + continue; + } + + if (b == '"') + { + if (!state.first_pass) + string [string_length] = 0; + + flags &= ~ flag_string; + string = 0; + + switch (top->type) + { + case json_string: + + top->u.string.length = string_length; + flags |= flag_next; + + break; + + case json_object: + + if (state.first_pass) + (*(json_char **) &top->u.object.values) += string_length + 1; + else + { + top->u.object.values [top->u.object.length].name + = (json_char *) top->_reserved.object_mem; + + top->u.object.values [top->u.object.length].name_length + = string_length; + + (*(json_char **) &top->_reserved.object_mem) += string_length + 1; + } + + flags |= flag_seek_value | flag_need_colon; + continue; + + default: + break; + }; + } + else + { + string_add (b); + continue; + } + } + + if (state.settings.settings & json_enable_comments) + { + if (flags & (flag_line_comment | flag_block_comment)) + { + if (flags & flag_line_comment) + { + if (b == '\r' || b == '\n' || !b) + { + flags &= ~ flag_line_comment; + -- state.ptr; /* so null can be reproc'd */ + } + + continue; + } + + if (flags & flag_block_comment) + { + if (!b) + { sprintf (error, "%d:%d: Unexpected EOF in block comment", line_and_col); + goto e_failed; + } + + if (b == '*' && state.ptr < (end - 1) && state.ptr [1] == '/') + { + flags &= ~ flag_block_comment; + ++ state.ptr; /* skip closing sequence */ + } + + continue; + } + } + else if (b == '/') + { + if (! (flags & (flag_seek_value | flag_done)) && top->type != json_object) + { sprintf (error, "%d:%d: Comment not allowed here", line_and_col); + goto e_failed; + } + + if (++ state.ptr == end) + { sprintf (error, "%d:%d: EOF unexpected", line_and_col); + goto e_failed; + } + + switch (b = *state.ptr) + { + case '/': + flags |= flag_line_comment; + continue; + + case '*': + flags |= flag_block_comment; + continue; + + default: + sprintf (error, "%d:%d: Unexpected `%c` in comment opening sequence", line_and_col, b); + goto e_failed; + }; + } + } + + if (flags & flag_done) + { + if (!b) + break; + + switch (b) + { + whitespace: + continue; + + default: + + sprintf (error, "%d:%d: Trailing garbage: `%c`", + state.cur_line, state.cur_col, b); + + goto e_failed; + }; + } + + if (flags & flag_seek_value) + { + switch (b) + { + whitespace: + continue; + + case ']': + + if (top && top->type == json_array) + flags = (flags & ~ (flag_need_comma | flag_seek_value)) | flag_next; + else + { sprintf (error, "%d:%d: Unexpected ]", line_and_col); + goto e_failed; + } + + break; + + default: + + if (flags & flag_need_comma) + { + if (b == ',') + { flags &= ~ flag_need_comma; + continue; + } + else + { + sprintf (error, "%d:%d: Expected , before %c", + state.cur_line, state.cur_col, b); + + goto e_failed; + } + } + + if (flags & flag_need_colon) + { + if (b == ':') + { flags &= ~ flag_need_colon; + continue; + } + else + { + sprintf (error, "%d:%d: Expected : before %c", + state.cur_line, state.cur_col, b); + + goto e_failed; + } + } + + flags &= ~ flag_seek_value; + + switch (b) + { + case '{': + + if (!new_value (&state, &top, &root, &alloc, json_object)) + goto e_alloc_failure; + + continue; + + case '[': + + if (!new_value (&state, &top, &root, &alloc, json_array)) + goto e_alloc_failure; + + flags |= flag_seek_value; + continue; + + case '"': + + if (!new_value (&state, &top, &root, &alloc, json_string)) + goto e_alloc_failure; + + flags |= flag_string; + + string = top->u.string.ptr; + string_length = 0; + + continue; + + case 't': + + if ((end - state.ptr) < 3 || *(++ state.ptr) != 'r' || + *(++ state.ptr) != 'u' || *(++ state.ptr) != 'e') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_boolean)) + goto e_alloc_failure; + + top->u.boolean = 1; + + flags |= flag_next; + break; + + case 'f': + + if ((end - state.ptr) < 4 || *(++ state.ptr) != 'a' || + *(++ state.ptr) != 'l' || *(++ state.ptr) != 's' || + *(++ state.ptr) != 'e') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_boolean)) + goto e_alloc_failure; + + flags |= flag_next; + break; + + case 'n': + + if ((end - state.ptr) < 3 || *(++ state.ptr) != 'u' || + *(++ state.ptr) != 'l' || *(++ state.ptr) != 'l') + { + goto e_unknown_value; + } + + if (!new_value (&state, &top, &root, &alloc, json_null)) + goto e_alloc_failure; + + flags |= flag_next; + break; + + default: + + if (isdigit (b) || b == '-') + { + if (!new_value (&state, &top, &root, &alloc, json_integer)) + goto e_alloc_failure; + + if (!state.first_pass) + { + while (isdigit (b) || b == '+' || b == '-' + || b == 'e' || b == 'E' || b == '.') + { + if ( (++ state.ptr) == end) + { + b = 0; + break; + } + + b = *state.ptr; + } + + flags |= flag_next | flag_reproc; + break; + } + + flags &= ~ (flag_num_negative | flag_num_e | + flag_num_e_got_sign | flag_num_e_negative | + flag_num_zero); + + num_digits = 0; + num_fraction = 0; + num_e = 0; + + if (b != '-') + { + flags |= flag_reproc; + break; + } + + flags |= flag_num_negative; + continue; + } + else + { sprintf (error, "%d:%d: Unexpected %c when seeking value", line_and_col, b); + goto e_failed; + } + }; + }; + } + else + { + switch (top->type) + { + case json_object: + + switch (b) + { + whitespace: + continue; + + case '"': + + if (flags & flag_need_comma) + { sprintf (error, "%d:%d: Expected , before \"", line_and_col); + goto e_failed; + } + + flags |= flag_string; + + string = (json_char *) top->_reserved.object_mem; + string_length = 0; + + break; + + case '}': + + flags = (flags & ~ flag_need_comma) | flag_next; + break; + + case ',': + + if (flags & flag_need_comma) + { + flags &= ~ flag_need_comma; + break; + } + + default: + sprintf (error, "%d:%d: Unexpected `%c` in object", line_and_col, b); + goto e_failed; + }; + + break; + + case json_integer: + case json_double: + + if (isdigit (b)) + { + ++ num_digits; + + if (top->type == json_integer || flags & flag_num_e) + { + if (! (flags & flag_num_e)) + { + if (flags & flag_num_zero) + { sprintf (error, "%d:%d: Unexpected `0` before `%c`", line_and_col, b); + goto e_failed; + } + + if (num_digits == 1 && b == '0') + flags |= flag_num_zero; + } + else + { + flags |= flag_num_e_got_sign; + num_e = (num_e * 10) + (b - '0'); + continue; + } + + top->u.integer = (top->u.integer * 10) + (b - '0'); + continue; + } + + num_fraction = (num_fraction * 10) + (b - '0'); + continue; + } + + if (b == '+' || b == '-') + { + if ( (flags & flag_num_e) && !(flags & flag_num_e_got_sign)) + { + flags |= flag_num_e_got_sign; + + if (b == '-') + flags |= flag_num_e_negative; + + continue; + } + } + else if (b == '.' && top->type == json_integer) + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit before `.`", line_and_col); + goto e_failed; + } + + top->type = json_double; + top->u.dbl = (double) top->u.integer; + + num_digits = 0; + continue; + } + + if (! (flags & flag_num_e)) + { + if (top->type == json_double) + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit after `.`", line_and_col); + goto e_failed; + } + + //top->u.dbl += ((double) num_fraction) / (pow (10.0, (double) num_digits)); + } + + if (b == 'e' || b == 'E') + { + flags |= flag_num_e; + + if (top->type == json_integer) + { + top->type = json_double; + top->u.dbl = (double) top->u.integer; + } + + num_digits = 0; + flags &= ~ flag_num_zero; + + continue; + } + } + else + { + if (!num_digits) + { sprintf (error, "%d:%d: Expected digit after `e`", line_and_col); + goto e_failed; + } + + /*top->u.dbl *= pow (10.0, (double) + (flags & flag_num_e_negative ? - num_e : num_e));*/ + } + + if (flags & flag_num_negative) + { + if (top->type == json_integer) + top->u.integer = - top->u.integer; + else + top->u.dbl = - top->u.dbl; + } + + flags |= flag_next | flag_reproc; + break; + + default: + break; + }; + } + + if (flags & flag_reproc) + { + flags &= ~ flag_reproc; + -- state.ptr; + } + + if (flags & flag_next) + { + flags = (flags & ~ flag_next) | flag_need_comma; + + if (!top->parent) + { + /* root value done */ + + flags |= flag_done; + continue; + } + + if (top->parent->type == json_array) + flags |= flag_seek_value; + + if (!state.first_pass) + { + json_value * parent = top->parent; + + switch (parent->type) + { + case json_object: + + parent->u.object.values + [parent->u.object.length].value = top; + + break; + + case json_array: + + parent->u.array.values + [parent->u.array.length] = top; + + break; + + default: + break; + }; + } + + if ( (++ top->parent->u.array.length) > state.uint_max) + goto e_overflow; + + top = top->parent; + + continue; + } + } + + alloc = root; + } + + return root; + +e_unknown_value: + + sprintf (error, "%d:%d: Unknown value", line_and_col); + goto e_failed; + +e_alloc_failure: + + strcpy (error, "Memory allocation failure"); + goto e_failed; + +e_overflow: + + sprintf (error, "%d:%d: Too long (caught overflow)", line_and_col); + goto e_failed; + +e_failed: + + if (error_buf) + { + if (*error) + strcpy (error_buf, error); + else + strcpy (error_buf, "Unknown error"); + } + + if (state.first_pass) + alloc = root; + + while (alloc) + { + top = alloc->_reserved.next_alloc; + state.settings.mem_free (alloc, state.settings.user_data); + alloc = top; + } + + if (!state.first_pass) + json_value_free_ex (&state.settings, root); + + return 0; +} + +json_value * json_parse (const json_char * json, size_t length) +{ + json_settings settings = { 0 }; + return json_parse_ex (&settings, json, length, 0); +} + +void json_value_free_ex (json_settings * settings, json_value * value) +{ + json_value * cur_value; + + if (!value) + return; + + value->parent = 0; + + while (value) + { + switch (value->type) + { + case json_array: + + if (!value->u.array.length) + { + settings->mem_free (value->u.array.values, settings->user_data); + break; + } + + value = value->u.array.values [-- value->u.array.length]; + continue; + + case json_object: + + if (!value->u.object.length) + { + settings->mem_free (value->u.object.values, settings->user_data); + break; + } + + value = value->u.object.values [-- value->u.object.length].value; + continue; + + case json_string: + + settings->mem_free (value->u.string.ptr, settings->user_data); + break; + + default: + break; + }; + + cur_value = value; + value = value->parent; + settings->mem_free (cur_value, settings->user_data); + } +} + +void json_value_free (json_value * value) +{ + json_settings settings = { 0 }; + settings.mem_free = default_free; + json_value_free_ex (&settings, value); +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json_util.c b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json_util.c new file mode 100755 index 0000000..f617cd1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/tests/testutils/json_util.c @@ -0,0 +1,137 @@ +#include "json.h" +#include +#include + +json_value* json_get_string(json_value* value, const char* key){ + int length, x; + if (value == NULL) { + return NULL; + } + if (value->type != json_object) { + return NULL; + } + length = value->u.object.length; + for (x = 0; x < length; x++) { + if( strcmp( value->u.object.values[x].name, key) == 0){ + if( value->u.object.values[x].value->type == json_string){ + return value->u.object.values[x].value; + } + } + } + return NULL; +} + +int json_set_string(json_value* value, const char* new_string_value){ + if( value->type == json_string){ + int length = strlen(new_string_value); + if( length > value->u.string.length ){ + value->u.string.ptr = malloc(length + 1); + } + strcpy( value->u.string.ptr, new_string_value ); + value->u.string.length = length; + } + return 0; +} + +int compareJsonValues(json_value* value1, json_value* value2); + +int compareJsonObjects(json_value* value1, json_value* value2){ + int length1 = value1->u.object.length; + int length2 = value2->u.object.length; + if( length1 != length2 ) + return 0; + for (int x = 0; x < length1; x++) { + char* name = value1->u.object.values[x].name; + int found = 0; + for( int y = 0; y < length2; y++){ + if( strcmp( value2->u.object.values[y].name, name ) == 0){ + if( !compareJsonValues( value1->u.object.values[x].value, + value2->u.object.values[y].value ) ) + return 0; + found = 1; + break; + } + } + if( !found ) + return 0; + } + return 1; +} + +int compareJsonArrays(json_value* value1, json_value* value2){ + int length1 = value1->u.array.length; + int length2 = value2->u.array.length; + if( length1 != length2 ) + return 0; + for (int x = 0; x < length1; x++) { + if( !compareJsonValues(value1->u.array.values[x], value2->u.array.values[x]) ) + return 0; + } + return 1; +} + +int compareJsonValues(json_value* value1, json_value* value2){ + if( value1 == NULL && value2 == NULL) + return 1; + if( value1 == NULL || value2 == NULL) + return 0; + if( value1->type != value2->type) + return 0; + switch (value1->type) { + case json_null: + return value2->type == json_null; + case json_none: + return 1; + case json_object: + return compareJsonObjects(value1, value2); + case json_array: + return compareJsonArrays(value1, value2); + case json_integer: + return value1->u.integer == value2->u.integer; + case json_double: + return fabs(value1->u.dbl - value2->u.dbl) < 0.000001; + case json_string: + return strcmp(value1->u.string.ptr, value2->u.string.ptr) == 0; + case json_boolean: + return value1->u.boolean == value2->u.boolean; + } + return 1; +} + + +json_value* get_json_value_not_strict(json_value* node, const char* path, + json_type type, int allow_null){ + int n; + const char* p = strchr(path, '/'); + if( p == NULL ) + n = strlen(path); + else + n = p - path; + if( n > 0 ) { + if( node->type == json_object){ + for (int x = 0; x < node->u.object.length; x++) { + json_object_entry * entry = &node->u.object.values[x]; + char* name = entry->name; + json_value* value = entry->value; + if( strncmp( path, name, n ) == 0){ + if( p == NULL){ + if( value->type == type || + (allow_null && value->type == json_null)) + return value; + }else + return get_json_value_not_strict( + value, p + 1, type, allow_null); + } + } + } else { + return NULL; + } + } + return NULL; +} + +json_value* get_json_value(json_value* node, const char* path, + json_type type){ + return get_json_value_not_strict(node, path, type, 1); +} + diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/wallet.wallet.go b/vendor/github.com/skycoin/skycoin/lib/cgo/wallet.wallet.go new file mode 100755 index 0000000..22b1a3c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/wallet.wallet.go @@ -0,0 +1,382 @@ +package main + +import ( + "reflect" + "unsafe" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_wallet_NewWallet +func SKY_wallet_NewWallet(_wltName string, _opts C.Options__Handle, _arg2 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + wltName := _wltName + __opts, okopts := lookupOptionsHandle(_opts) + if !okopts { + ____error_code = SKY_ERROR + return + } + opts := *__opts + __arg2, ____return_err := wallet.NewWallet(wltName, opts) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg2 = registerWalletHandle(__arg2) + } + return +} + +//export SKY_wallet_Wallet_Lock +func SKY_wallet_Wallet_Lock(_w C.Wallet__Handle, _password []byte, _cryptoType string) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + password := *(*[]byte)(unsafe.Pointer(&_password)) + cryptoType := wallet.CryptoType(_cryptoType) + ____return_err := w.Lock(password, cryptoType) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Unlock +func SKY_wallet_Wallet_Unlock(_w C.Wallet__Handle, _password []byte, _arg1 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + password := *(*[]byte)(unsafe.Pointer(&_password)) + __arg1, ____return_err := w.Unlock(password) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWalletHandle(__arg1) + } + return +} + +//export SKY_wallet_Load +func SKY_wallet_Load(_wltFile string, _arg1 *C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + wltFile := _wltFile + __arg1, ____return_err := wallet.Load(wltFile) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg1 = registerWalletHandle(__arg1) + } + return +} + +//export SKY_wallet_Wallet_Save +func SKY_wallet_Wallet_Save(_w C.Wallet__Handle, _dir string) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + dir := _dir + ____return_err := w.Save(dir) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Validate +func SKY_wallet_Wallet_Validate(_w C.Wallet__Handle) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + ____return_err := w.Validate() + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_Wallet_Type +func SKY_wallet_Wallet_Type(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Type() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Version +func SKY_wallet_Wallet_Version(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Version() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Filename +func SKY_wallet_Wallet_Filename(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Filename() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_Label +func SKY_wallet_Wallet_Label(_w C.Wallet__Handle, _argSKY_OK *C.GoString_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.Label() + copyString(__argSKY_OK, _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_IsEncrypted +func SKY_wallet_Wallet_IsEncrypted(_w C.Wallet__Handle, _argSKY_OK *bool) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.IsEncrypted() + *_argSKY_OK = __argSKY_OK + return +} + +//export SKY_wallet_Wallet_GenerateAddresses +func SKY_wallet_Wallet_GenerateAddresses(_w C.Wallet__Handle, _num uint64, _arg1 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + num := _num + __arg1, ____return_err := w.GenerateAddresses(num) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg1), _arg1) + } + return +} + +//export SKY_wallet_Wallet_GetAddresses +func SKY_wallet_Wallet_GetAddresses(_w C.Wallet__Handle, _argSKY_OK *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + __argSKY_OK := w.GetAddresses() + copyToGoSlice(reflect.ValueOf(__argSKY_OK), _argSKY_OK) + return +} + +//export SKY_wallet_Wallet_GetEntry +func SKY_wallet_Wallet_GetEntry(_w C.Wallet__Handle, _a *C.cipher__Address, _arg1 *C.wallet__Entry, _arg2 *bool) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + a := *(*cipher.Address)(unsafe.Pointer(_a)) + __arg1, __arg2 := w.GetEntry(a) + *_arg1 = *(*C.wallet__Entry)(unsafe.Pointer(&__arg1)) + *_arg2 = __arg2 + return +} + +//export SKY_wallet_Wallet_AddEntry +func SKY_wallet_Wallet_AddEntry(_w C.Wallet__Handle, _entry *C.wallet__Entry) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + w, okw := lookupWalletHandle(_w) + if !okw { + ____error_code = SKY_ERROR + return + } + entry := *(*wallet.Entry)(unsafe.Pointer(_entry)) + ____return_err := w.AddEntry(entry) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + } + return +} + +//export SKY_wallet_DistributeSpendHours +func SKY_wallet_DistributeSpendHours(_inputHours, _nAddrs uint64, _haveChange bool, _arg2 *uint64, _arg3 *C.GoSlice_, _arg4 *uint64) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + inputHours := _inputHours + nAddrs := _nAddrs + haveChange := _haveChange + __arg2, __arg3, __arg4 := wallet.DistributeSpendHours(inputHours, nAddrs, haveChange) + *_arg2 = __arg2 + copyToGoSlice(reflect.ValueOf(__arg3), _arg3) + *_arg4 = __arg4 + return +} + +//export SKY_wallet_DistributeCoinHoursProportional +func SKY_wallet_DistributeCoinHoursProportional(_coins []uint64, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + coins := *(*[]uint64)(unsafe.Pointer(&_coins)) + hours := _hours + __arg2, ____return_err := wallet.DistributeCoinHoursProportional(coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_NewUxBalances +func SKY_wallet_NewUxBalances(_headTime uint64, _uxa *C.coin__UxArray, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + headTime := _headTime + uxa := *(*coin.UxArray)(unsafe.Pointer(_uxa)) + __arg2, ____return_err := wallet.NewUxBalances(headTime, uxa) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_NewUxBalance +func SKY_wallet_NewUxBalance(_headTime uint64, _ux *C.coin__UxOut, _arg2 *C.wallet__UxBalance) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + headTime := _headTime + ux := *(*coin.UxOut)(unsafe.Pointer(_ux)) + __arg2, ____return_err := wallet.NewUxBalance(headTime, ux) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + *_arg2 = *(*C.wallet__UxBalance)(unsafe.Pointer(&__arg2)) + } + return +} + +//export SKY_wallet_ChooseSpendsMinimizeUxOuts +func SKY_wallet_ChooseSpendsMinimizeUxOuts(_uxa []C.wallet__UxBalance, _coins, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uxa := *(*[]wallet.UxBalance)(unsafe.Pointer(&_uxa)) + coins := _coins + hours := _hours + __arg2, ____return_err := wallet.ChooseSpendsMinimizeUxOuts(uxa, coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} + +//export SKY_wallet_ChooseSpendsMaximizeUxOuts +func SKY_wallet_ChooseSpendsMaximizeUxOuts(_uxa []C.wallet__UxBalance, _coins, _hours uint64, _arg2 *C.GoSlice_) (____error_code uint32) { + ____error_code = SKY_OK + defer func() { + ____error_code = catchApiPanic(____error_code, recover()) + }() + uxa := *(*[]wallet.UxBalance)(unsafe.Pointer(&_uxa)) + coins := _coins + hours := _hours + __arg2, ____return_err := wallet.ChooseSpendsMaximizeUxOuts(uxa, coins, hours) + ____error_code = libErrorCode(____return_err) + if ____return_err == nil { + copyToGoSlice(reflect.ValueOf(__arg2), _arg2) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/lib/cgo/wallet_option.go b/vendor/github.com/skycoin/skycoin/lib/cgo/wallet_option.go new file mode 100755 index 0000000..f5db19c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/lib/cgo/wallet_option.go @@ -0,0 +1,27 @@ +package main + +import ( + wallet "github.com/skycoin/skycoin/src/wallet" +) + +/* + #include + #include + + #include "skytypes.h" +*/ +import "C" + +//export SKY_wallet_CreateOptionsHandle +func SKY_wallet_CreateOptionsHandle(coin string, label string, seed string, encrypt bool, pwd string, cryptoType string, scanN uint64, _opts *C.Options__Handle) uint32 { + var walletOptions wallet.Options + walletOptions.Coin = (wallet.CoinType)(coin) + walletOptions.Label = label + walletOptions.Seed = seed + walletOptions.Encrypt = encrypt + walletOptions.Password = []byte(pwd) + walletOptions.CryptoType = (wallet.CryptoType)(cryptoType) + walletOptions.ScanN = scanN + *_opts = registerOptionsHandle(&walletOptions) + return SKY_OK +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/address.go b/vendor/github.com/skycoin/skycoin/src/api/address.go new file mode 100755 index 0000000..8b61544 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/address.go @@ -0,0 +1,63 @@ +package api + +import ( + "encoding/json" + "net/http" + + "github.com/skycoin/skycoin/src/cipher" + //http,json helpers +) + +// VerifyAddressRequest is the request data for POST /api/v2/address/verify +type VerifyAddressRequest struct { + Address string `json:"address"` +} + +// VerifyAddressResponse is returned by POST /api/v2/address/verify +type VerifyAddressResponse struct { + Version byte `json:"version"` +} + +// addressVerify verifies a Skycoin address +// Method: POST +// URI: /api/v2/address/verify +func addressVerify(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyAddressRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + if req.Address == "" { + resp := NewHTTPErrorResponse(http.StatusBadRequest, "address is required") + writeHTTPResponse(w, resp) + return + } + + addr, err := cipher.DecodeBase58Address(req.Address) + + if err != nil { + resp := NewHTTPErrorResponse(http.StatusUnprocessableEntity, err.Error()) + writeHTTPResponse(w, resp) + return + } + + writeHTTPResponse(w, HTTPResponse{ + Data: VerifyAddressResponse{ + Version: addr.Version, + }, + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/address_test.go b/vendor/github.com/skycoin/skycoin/src/api/address_test.go new file mode 100755 index 0000000..9bff220 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/address_test.go @@ -0,0 +1,153 @@ +package api + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestVerifyAddress(t *testing.T) { + toJSON := func(r VerifyAddressRequest) string { + b, err := json.Marshal(r) + require.NoError(t, err) + return string(b) + } + + cases := []struct { + name string + method string + status int + contentType string + csrfDisabled bool + httpBody string + httpResponse HTTPResponse + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "application/x-www-form-urlencoded", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + + { + name: "400 - EOF", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + + { + name: "400 - Missing address", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: "{}", + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "address is required"), + }, + + { + name: "422 - Invalid checksum", + method: http.MethodPost, + status: http.StatusUnprocessableEntity, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: NewHTTPErrorResponse(http.StatusUnprocessableEntity, "Invalid checksum"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: toJSON(VerifyAddressRequest{ + Address: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }), + httpResponse: HTTPResponse{ + Data: VerifyAddressResponse{ + Version: 0, + }, + }, + csrfDisabled: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/address/verify" + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = "application/json" + } + + req.Header.Set("Content-Type", contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + cfg := muxConfig{host: configuredHost, appLoc: "."} + handler := newServerMux(cfg, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.NewDecoder(rr.Body).Decode(&rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var addrRsp VerifyAddressResponse + err := json.Unmarshal(rsp.Data, &addrRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyAddressResponse), addrRsp) + } + + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/blockchain.go b/vendor/github.com/skycoin/skycoin/src/api/blockchain.go new file mode 100755 index 0000000..8f640f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/blockchain.go @@ -0,0 +1,160 @@ +package api + +// APIs for blockchain related information + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" //http,json helpers +) + +func blockchainHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + metadata, err := gateway.GetBlockchainMetadata() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainMetadata failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, metadata) + } +} + +func blockchainProgressHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + progress, err := gateway.GetBlockchainProgress() + if err != nil { + err = fmt.Errorf("gateway.GetBlockchainProgress failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, progress) + } +} + +// get block by hash or seq +// method: GET +// url: /block?hash=[:hash] or /block?seq[:seq] +// params: hash or seq, should only specify one filter. +func getBlock(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + hash := r.FormValue("hash") + seq := r.FormValue("seq") + var b *coin.SignedBlock + switch { + case hash == "" && seq == "": + wh.Error400(w, "should specify one filter, hash or seq") + return + case hash != "" && seq != "": + wh.Error400(w, "should only specify one filter, hash or seq") + return + case hash != "": + h, err := cipher.SHA256FromHex(hash) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err = gateway.GetSignedBlockByHash(h) + if err != nil { + wh.Error500(w, err.Error()) + return + } + case seq != "": + uSeq, err := strconv.ParseUint(seq, 10, 64) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err = gateway.GetSignedBlockBySeq(uSeq) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + if b == nil { + wh.Error404(w, "") + return + } + + rb, err := visor.NewReadableBlock(&b.Block) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} + +func getBlocks(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + sstart := r.FormValue("start") + start, err := strconv.ParseUint(sstart, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid start value \"%s\"", sstart)) + return + } + + send := r.FormValue("end") + end, err := strconv.ParseUint(send, 10, 64) + if err != nil { + wh.Error400(w, fmt.Sprintf("Invalid end value \"%s\"", send)) + return + } + rb, err := gateway.GetBlocks(start, end) + if err != nil { + wh.Error400(w, fmt.Sprintf("Get blocks failed: %v", err)) + return + } + wh.SendJSONOr500(logger, w, rb) + } +} + +// get last N blocks +func getLastBlocks(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + num := r.FormValue("num") + if num == "" { + wh.Error400(w, "Param: num is empty") + return + } + + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + rb, err := gateway.GetLastBlocks(n) + if err != nil { + wh.Error400(w, fmt.Sprintf("Get last %v blocks failed: %v", n, err)) + return + } + + wh.SendJSONOr500(logger, w, rb) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/blockchain_test.go b/vendor/github.com/skycoin/skycoin/src/api/blockchain_test.go new file mode 100755 index 0000000..ae0d4e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/blockchain_test.go @@ -0,0 +1,491 @@ +package api + +import ( + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "encoding/json" + + "math" + + "github.com/stretchr/testify/require" + + "errors" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor" +) + +func makeBadBlock(t *testing.T) *coin.Block { + genPublic, _ := cipher.GenerateKeyPair() + genAddress := cipher.AddressFromPubKey(genPublic) + var genCoins uint64 = 1000e6 + var genTime uint64 = 1000 + now := genTime + 100 + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + uxHash := testutil.RandSHA256(t) + tx := coin.Transaction{} + tx.PushOutput(genAddress, math.MaxInt64+1, 255) + b, err := coin.NewBlock(*preBlock, now, uxHash, coin.Transactions{tx}, func(t *coin.Transaction) (uint64, error) { + return 0, nil + }) + require.NoError(t, err) + return b +} + +func TestGetBlock(t *testing.T) { + + badBlock := makeBadBlock(t) + validHashString := testutil.RandSHA256(t).Hex() + validSHA256, err := cipher.SHA256FromHex(validHashString) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + hash string + sha256 cipher.SHA256 + seqStr string + seq uint64 + gatewayGetBlockByHashResult *coin.SignedBlock + gatewayGetBlockByHashErr error + gatewayGetBlockBySeqResult *coin.SignedBlock + gatewayGetBlockBySeqErr error + response *visor.ReadableBlock + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - no seq and hash", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should specify one filter, hash or seq", + }, + { + name: "400 - seq and hash simultaneously", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - should only specify one filter, hash or seq", + hash: "hash", + seqStr: "seq", + }, + { + name: "400 - hash error: encoding/hex err invalid byte: U+0068 'h'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0068 'h'", + hash: "hash", + }, + { + name: "400 - hash error: encoding/hex: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + hash: "1234abc", + }, + { + name: "400 - hash error: Invalid hex length", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid hex length", + hash: "1234abcd", + }, + { + name: "404 - block by hash does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + hash: validHashString, + sha256: validSHA256, + }, + { + name: "400 - seq error: invalid syntax", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - strconv.ParseUint: parsing \"seq\": invalid syntax", + seqStr: "seq", + }, + { + name: "404 - block by seq does not exist", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + seqStr: "1", + seq: 1, + }, + { + name: "500 - NewReadableBlock error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{ + Block: *badBlock, + }, + }, + { + name: "500 - get block by hash error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockByHash failed", + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashErr: errors.New("GetSignedBlockByHash failed"), + }, + { + name: "500 - get block by seq error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetSignedBlockBySeq failed", + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqErr: errors.New("GetSignedBlockBySeq failed"), + }, + { + name: "200 - got block by seq", + method: http.MethodGet, + status: http.StatusOK, + seqStr: "1", + seq: 1, + gatewayGetBlockBySeqResult: &coin.SignedBlock{}, + response: &visor.ReadableBlock{ + Head: visor.ReadableBlockHeader{ + BkSeq: 0x0, + BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: visor.ReadableBlockBody{ + Transactions: []visor.ReadableTransaction{}, + }, + }, + }, + { + name: "200 - got block by hash", + method: http.MethodGet, + status: http.StatusOK, + hash: validHashString, + sha256: validSHA256, + gatewayGetBlockByHashResult: &coin.SignedBlock{}, + response: &visor.ReadableBlock{ + Head: visor.ReadableBlockHeader{ + BkSeq: 0x0, + BlockHash: "7b8ec8dd836b564f0c85ad088fc744de820345204e154bc1503e04e9d6fdd9f1", + PreviousBlockHash: "0000000000000000000000000000000000000000000000000000000000000000", + Time: 0x0, + Fee: 0x0, + Version: 0x0, + BodyHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + Body: visor.ReadableBlockBody{ + Transactions: []visor.ReadableTransaction{}, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + + gateway.On("GetSignedBlockByHash", tc.sha256).Return(tc.gatewayGetBlockByHashResult, tc.gatewayGetBlockByHashErr) + gateway.On("GetSignedBlockBySeq", tc.seq).Return(tc.gatewayGetBlockBySeqResult, tc.gatewayGetBlockBySeqErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/block" + + v := url.Values{} + if tc.hash != "" { + v.Add("hash", tc.hash) + } + if tc.seqStr != "" { + v.Add("seq", tc.seqStr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlock + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} + +func TestGetBlocks(t *testing.T) { + type httpBody struct { + Start string + End string + } + + tt := []struct { + name string + method string + status int + err string + body *httpBody + start uint64 + end uint64 + gatewayGetBlocksResult *visor.ReadableBlocks + gatewayGetBlocksError error + response *visor.ReadableBlocks + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty start/end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"\"", + }, + { + name: "400 - bad start", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid start value \"badStart\"", + body: &httpBody{ + Start: "badStart", + }, + }, + { + name: "400 - bad end", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid end value \"badEnd\"", + body: &httpBody{ + Start: "1", + End: "badEnd", + }, + start: 1, + }, + { + name: "400 - gatewayGetBlocksError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Get blocks failed: gatewayGetBlocksError", + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksError: errors.New("gatewayGetBlocksError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: &httpBody{ + Start: "1", + End: "3", + }, + start: 1, + end: 3, + gatewayGetBlocksResult: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, + response: &visor.ReadableBlocks{Blocks: []visor.ReadableBlock{visor.ReadableBlock{}}}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetBlocks", tc.start, tc.end).Return(tc.gatewayGetBlocksResult, tc.gatewayGetBlocksError) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/blocks" + + v := url.Values{} + if tc.body != nil { + if tc.body.Start != "" { + v.Add("start", tc.body.Start) + } + if tc.body.End != "" { + v.Add("end", tc.body.End) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + type httpBody struct { + Num string + } + tt := []struct { + name string + method string + url string + status int + err string + body httpBody + num uint64 + gatewayGetLastBlocksResult *visor.ReadableBlocks + gatewayGetLastBlocksError error + response *visor.ReadableBlocks + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + body: httpBody{ + Num: "1", + }, + num: 1, + }, + { + name: "400 - empty num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Param: num is empty", + num: 1, + }, + { + name: "400 - bad num value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - strconv.ParseUint: parsing \"badNumValue\": invalid syntax", + body: httpBody{ + Num: "badNumValue", + }, + num: 1, + }, + { + name: "400 - gatewayGetLastBlocksError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Get last 1 blocks failed: gatewayGetLastBlocksError", + body: httpBody{ + Num: "1", + }, + num: 1, + gatewayGetLastBlocksError: errors.New("gatewayGetLastBlocksError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + body: httpBody{ + Num: "1", + }, + num: 1, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/last_blocks" + gateway := NewGatewayerMock() + + gateway.On("GetLastBlocks", tc.num).Return(tc.gatewayGetLastBlocksResult, tc.gatewayGetLastBlocksError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableBlocks + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.response, msg) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/client.go b/vendor/github.com/skycoin/skycoin/src/api/client.go new file mode 100755 index 0000000..fc196fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/client.go @@ -0,0 +1,956 @@ +package api + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "net/url" + "strings" + "time" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second +) + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +func (e ClientError) Error() string { + return e.Message +} + +// ReceivedHTTPResponse parsed a HTTPResponse received by the Client, for the V2 API +type ReceivedHTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data json.RawMessage `json:"data"` +} + +// Client provides an interface to a remote node's HTTP API +type Client struct { + HTTPClient *http.Client + Addr string +} + +// NewClient creates a Client +func NewClient(addr string) *Client { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + } +} + +// Get makes a GET request to an endpoint and unmarshals the response to obj. +// If the response is not 200 OK, returns an error +func (c *Client) Get(endpoint string, obj interface{}) error { + resp, err := c.get(endpoint) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + if obj == nil { + return nil + } + return json.NewDecoder(resp.Body).Decode(obj) +} + +// get makes a GET request to an endpoint. Caller must close response body. +func (c *Client) get(endpoint string) (*http.Response, error) { + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return nil, err + } + + return c.HTTPClient.Do(req) +} + +// PostForm makes a POST request to an endpoint with body of "application/x-www-form-urlencoded" formated data. +func (c *Client) PostForm(endpoint string, body io.Reader, obj interface{}) error { + return c.post(endpoint, "application/x-www-form-urlencoded", body, obj) +} + +// PostJSON makes a POST request to an endpoint with body of json data. +func (c *Client) PostJSON(endpoint string, reqObj, respObj interface{}) error { + body, err := json.Marshal(reqObj) + if err != nil { + return err + } + + return c.post(endpoint, "application/json", bytes.NewReader(body), respObj) +} + +// post makes a POST request to an endpoint. +func (c *Client) post(endpoint string, contentType string, body io.Reader, obj interface{}) error { + csrf, err := c.CSRF() + if err != nil { + return err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, body) + if err != nil { + return err + } + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", contentType) + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + return ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + if obj == nil { + return nil + } + + decoder := json.NewDecoder(resp.Body) + decoder.DisallowUnknownFields() + return decoder.Decode(obj) +} + +// PostJSONV2 makes a POST request to an endpoint with body of json data, +// and parses the standard JSON response. +func (c *Client) PostJSONV2(endpoint string, reqObj, respObj interface{}) (bool, error) { + body, err := json.Marshal(reqObj) + if err != nil { + return false, err + } + + csrf, err := c.CSRF() + if err != nil { + return false, err + } + + endpoint = strings.TrimLeft(endpoint, "/") + endpoint = c.Addr + endpoint + + req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewReader(body)) + if err != nil { + return false, err + } + + if csrf != "" { + req.Header.Set(CSRFHeaderName, csrf) + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + + resp, err := c.HTTPClient.Do(req) + if err != nil { + return false, err + } + + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + return false, err + } + + decoder := json.NewDecoder(bytes.NewReader(respBody)) + decoder.DisallowUnknownFields() + + var wrapObj ReceivedHTTPResponse + if err := decoder.Decode(&wrapObj); err != nil { + // In some cases, the server can send an error response in a non-JSON format, + // such as a 404 when the endpoint is not registered, or if a 500 error + // occurs in the go HTTP stack, outside of the application's control. + // If this happens, treat the entire response body as the error message. + if resp.StatusCode != http.StatusOK { + return false, ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + return false, err + } + + var rspErr error + if resp.StatusCode != http.StatusOK { + rspErr = ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: wrapObj.Error.Message, + } + } + + if wrapObj.Data == nil { + return false, rspErr + } + + decoder = json.NewDecoder(bytes.NewReader(wrapObj.Data)) + decoder.DisallowUnknownFields() + + if err := decoder.Decode(respObj); err != nil { + return false, err + } + + return true, rspErr +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + resp, err := c.get("/api/v1/csrf") + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: string(body), + } + } + + var m map[string]string + if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// Version makes a request to GET /api/v1/version +func (c *Client) Version() (*visor.BuildInfo, error) { + var bi visor.BuildInfo + if err := c.Get("/api/v1/version", &bi); err != nil { + return nil, err + } + return &bi, nil +} + +// Outputs makes a request to GET /api/v1/outputs +func (c *Client) Outputs() (*visor.ReadableOutputSet, error) { + var o visor.ReadableOutputSet + if err := c.Get("/api/v1/outputs", &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForAddresses makes a request to GET /api/v1/outputs?addrs=xxx +func (c *Client) OutputsForAddresses(addrs []string) (*visor.ReadableOutputSet, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/outputs?" + v.Encode() + + var o visor.ReadableOutputSet + if err := c.Get(endpoint, &o); err != nil { + return nil, err + } + return &o, nil +} + +// OutputsForHashes makes a request to GET /api/v1/outputs?hashes=zzz +func (c *Client) OutputsForHashes(hashes []string) (*visor.ReadableOutputSet, error) { + v := url.Values{} + v.Add("hashes", strings.Join(hashes, ",")) + endpoint := "/api/v1/outputs?" + v.Encode() + + var o visor.ReadableOutputSet + if err := c.Get(endpoint, &o); err != nil { + return nil, err + } + return &o, nil +} + +// CoinSupply makes a request to GET /api/v1/coinSupply +func (c *Client) CoinSupply() (*CoinSupply, error) { + var cs CoinSupply + if err := c.Get("/api/v1/coinSupply", &cs); err != nil { + return nil, err + } + return &cs, nil +} + +// BlockByHash makes a request to GET /api/v1/block?hash=xxx +func (c *Client) BlockByHash(hash string) (*visor.ReadableBlock, error) { + v := url.Values{} + v.Add("hash", hash) + endpoint := "/api/v1/block?" + v.Encode() + + var b visor.ReadableBlock + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockBySeq makes a request to GET /api/v1/block?seq=xxx +func (c *Client) BlockBySeq(seq uint64) (*visor.ReadableBlock, error) { + v := url.Values{} + v.Add("seq", fmt.Sprint(seq)) + endpoint := "/api/v1/block?" + v.Encode() + + var b visor.ReadableBlock + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Blocks makes a request to GET /api/v1/blocks +func (c *Client) Blocks(start, end int) (*visor.ReadableBlocks, error) { + v := url.Values{} + v.Add("start", fmt.Sprint(start)) + v.Add("end", fmt.Sprint(end)) + endpoint := "/api/v1/blocks?" + v.Encode() + + var b visor.ReadableBlocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// LastBlocks makes a request to GET /api/v1/last_blocks +func (c *Client) LastBlocks(n int) (*visor.ReadableBlocks, error) { + v := url.Values{} + v.Add("num", fmt.Sprint(n)) + endpoint := "/api/v1/last_blocks?" + v.Encode() + + var b visor.ReadableBlocks + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainMetadata makes a request to GET /api/v1/blockchain/metadata +func (c *Client) BlockchainMetadata() (*visor.BlockchainMetadata, error) { + var b visor.BlockchainMetadata + if err := c.Get("/api/v1/blockchain/metadata", &b); err != nil { + return nil, err + } + return &b, nil +} + +// BlockchainProgress makes a request to GET /api/v1/blockchain/progress +func (c *Client) BlockchainProgress() (*daemon.BlockchainProgress, error) { + var b daemon.BlockchainProgress + if err := c.Get("/api/v1/blockchain/progress", &b); err != nil { + return nil, err + } + return &b, nil +} + +// Balance makes a request to GET /api/v1/balance?addrs=xxx +func (c *Client) Balance(addrs []string) (*wallet.BalancePair, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/balance?" + v.Encode() + + var b wallet.BalancePair + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// UxOut makes a request to GET /api/v1/uxout?uxid=xxx +func (c *Client) UxOut(uxID string) (*historydb.UxOutJSON, error) { + v := url.Values{} + v.Add("uxid", uxID) + endpoint := "/api/v1/uxout?" + v.Encode() + + var b historydb.UxOutJSON + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// AddressUxOuts makes a request to GET /api/v1/address_uxouts +func (c *Client) AddressUxOuts(addr string) ([]*historydb.UxOutJSON, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/address_uxouts?" + v.Encode() + + var b []*historydb.UxOutJSON + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// Wallet makes a request to GET /api/v1/wallet +func (c *Client) Wallet(id string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet?" + v.Encode() + + var wr WalletResponse + if err := c.Get(endpoint, &wr); err != nil { + return nil, err + } + + return &wr, nil +} + +// Wallets makes a request to GET /api/v1/wallets +func (c *Client) Wallets() ([]*WalletResponse, error) { + var wrs []*WalletResponse + if err := c.Get("/api/v1/wallets", &wrs); err != nil { + return nil, err + } + + return wrs, nil +} + +// CreateUnencryptedWallet makes a request to POST /api/v1/wallet/create and creates +// a wallet without encryption. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateUnencryptedWallet(seed, label string, scanN int) (*WalletResponse, error) { + v := url.Values{} + v.Add("seed", seed) + v.Add("label", label) + v.Add("encrypt", "false") + + if scanN > 0 { + v.Add("scan", fmt.Sprint(scanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// CreateEncryptedWallet makes a request to POST /api/v1/wallet/create and try to create +// a wallet with encryption. +// If scanN is <= 0, the scan number defaults to 1 +func (c *Client) CreateEncryptedWallet(seed, label, password string, scanN int) (*WalletResponse, error) { + v := url.Values{} + v.Add("seed", seed) + v.Add("label", label) + v.Add("encrypt", "true") + v.Add("password", password) + + if scanN > 0 { + v.Add("scan", fmt.Sprint(scanN)) + } + + var w WalletResponse + if err := c.PostForm("/api/v1/wallet/create", strings.NewReader(v.Encode()), &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewWalletAddress makes a request to POST /api/v1/wallet/newAddress +// if n is <= 0, defaults to 1 +func (c *Client) NewWalletAddress(id string, n int, password string) ([]string, error) { + v := url.Values{} + v.Add("id", id) + if n > 0 { + v.Add("num", fmt.Sprint(n)) + } + + v.Add("password", password) + + var obj struct { + Addresses []string `json:"addresses"` + } + if err := c.PostForm("/api/v1/wallet/newAddress", strings.NewReader(v.Encode()), &obj); err != nil { + return nil, err + } + return obj.Addresses, nil +} + +// WalletBalance makes a request to GET /api/v1/wallet/balance +func (c *Client) WalletBalance(id string) (*BalanceResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/balance?" + v.Encode() + + var b BalanceResponse + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return &b, nil +} + +// Spend makes a request to POST /api/v1/wallet/spend +func (c *Client) Spend(id, dst string, coins uint64, password string) (*SpendResult, error) { + v := url.Values{} + v.Add("id", id) + v.Add("dst", dst) + v.Add("coins", fmt.Sprint(coins)) + v.Add("password", password) + + var r SpendResult + endpoint := "/api/v1/wallet/spend" + if err := c.PostForm(endpoint, strings.NewReader(v.Encode()), &r); err != nil { + return nil, err + } + + return &r, nil +} + +// CreateTransactionRequest is sent to /wallet/transaction +type CreateTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection HoursSelection `json:"hours_selection"` + Wallet CreateTransactionRequestWallet `json:"wallet"` + ChangeAddress *string `json:"change_address,omitempty"` + To []Receiver `json:"to"` +} + +// CreateTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet +type CreateTransactionRequestWallet struct { + ID string `json:"id"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + Password string `json:"password"` +} + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor string `json:"share_factor,omitempty"` +} + +// Receiver specifies a spend destination +type Receiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` +} + +// CreateTransaction makes a request to POST /api/v1/wallet/transaction +func (c *Client) CreateTransaction(req CreateTransactionRequest) (*CreateTransactionResponse, error) { + var r CreateTransactionResponse + endpoint := "/api/v1/wallet/transaction" + if err := c.PostJSON(endpoint, req, &r); err != nil { + return nil, err + } + + return &r, nil +} + +// WalletTransactions makes a request to GET /api/v1/wallet/transactions +func (c *Client) WalletTransactions(id string) (*UnconfirmedTxnsResponse, error) { + v := url.Values{} + v.Add("id", id) + endpoint := "/api/v1/wallet/transactions?" + v.Encode() + + var utx *UnconfirmedTxnsResponse + if err := c.Get(endpoint, &utx); err != nil { + return nil, err + } + return utx, nil +} + +// UpdateWallet makes a request to POST /api/v1/wallet/update +func (c *Client) UpdateWallet(id, label string) error { + v := url.Values{} + v.Add("id", id) + v.Add("label", label) + + return c.PostForm("/api/v1/wallet/update", strings.NewReader(v.Encode()), nil) +} + +// WalletFolderName makes a request to GET /api/v1/wallets/folderName +func (c *Client) WalletFolderName() (*WalletFolder, error) { + var w WalletFolder + if err := c.Get("/api/v1/wallets/folderName", &w); err != nil { + return nil, err + } + return &w, nil +} + +// NewSeed makes a request to GET /api/v1/wallet/newSeed +// entropy must be 128 or 256 +func (c *Client) NewSeed(entropy int) (string, error) { + v := url.Values{} + v.Add("entropy", fmt.Sprint(entropy)) + endpoint := "/api/v1/wallet/newSeed?" + v.Encode() + + var r struct { + Seed string `json:"seed"` + } + if err := c.Get(endpoint, &r); err != nil { + return "", err + } + return r.Seed, nil +} + +// GetWalletSeed makes a request to POST /api/v1/wallet/seed +func (c *Client) GetWalletSeed(id string, password string) (string, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + + var r struct { + Seed string `json:"seed"` + } + if err := c.PostForm("/api/v1/wallet/seed", strings.NewReader(v.Encode()), &r); err != nil { + return "", err + } + + return r.Seed, nil +} + +// NetworkConnection makes a request to GET /api/v1/network/connection +func (c *Client) NetworkConnection(addr string) (*daemon.Connection, error) { + v := url.Values{} + v.Add("addr", addr) + endpoint := "/api/v1/network/connection?" + v.Encode() + + var dc daemon.Connection + if err := c.Get(endpoint, &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkConnections makes a request to GET /api/v1/network/connections +func (c *Client) NetworkConnections() (*Connections, error) { + var dc Connections + if err := c.Get("/api/v1/network/connections", &dc); err != nil { + return nil, err + } + return &dc, nil +} + +// NetworkDefaultConnections makes a request to GET /api/v1/network/defaultConnections +func (c *Client) NetworkDefaultConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/defaultConnections", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkTrustedConnections makes a request to GET /api/v1/network/connections/trust +func (c *Client) NetworkTrustedConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/trust", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// NetworkExchangeableConnections makes a request to GET /api/v1/network/connections/exchange +func (c *Client) NetworkExchangeableConnections() ([]string, error) { + var dc []string + if err := c.Get("/api/v1/network/connections/exchange", &dc); err != nil { + return nil, err + } + return dc, nil +} + +// PendingTransactions makes a request to GET /api/v1/pendingTxs +func (c *Client) PendingTransactions() ([]*visor.ReadableUnconfirmedTxn, error) { + var v []*visor.ReadableUnconfirmedTxn + if err := c.Get("/api/v1/pendingTxs", &v); err != nil { + return nil, err + } + return v, nil +} + +// Transaction makes a request to GET /api/v1/transaction +func (c *Client) Transaction(txid string) (*daemon.TransactionResult, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/transaction?" + v.Encode() + + var r daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// Transactions makes a request to GET /api/v1/transactions +func (c *Client) Transactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// ConfirmedTransactions makes a request to GET /api/v1/transactions?confirmed=true +func (c *Client) ConfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "true") + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// UnconfirmedTransactions makes a request to GET /api/v1/transactions?confirmed=false +func (c *Client) UnconfirmedTransactions(addrs []string) (*[]daemon.TransactionResult, error) { + v := url.Values{} + v.Add("addrs", strings.Join(addrs, ",")) + v.Add("confirmed", "false") + endpoint := "/api/v1/transactions?" + v.Encode() + + var r []daemon.TransactionResult + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// InjectTransaction makes a request to POST /api/v1/injectTransaction +func (c *Client) InjectTransaction(rawTx string) (string, error) { + v := struct { + Rawtx string `json:"rawtx"` + }{ + Rawtx: rawTx, + } + + var txid string + if err := c.PostJSON("/api/v1/injectTransaction", v, &txid); err != nil { + return "", err + } + return txid, nil +} + +// ResendUnconfirmedTransactions makes a request to GET /api/v1/resendUnconfirmedTxns +func (c *Client) ResendUnconfirmedTransactions() (*daemon.ResendResult, error) { + var r daemon.ResendResult + if err := c.Get("/api/v1/resendUnconfirmedTxns", &r); err != nil { + return nil, err + } + return &r, nil +} + +// RawTransaction makes a request to GET /api/v1/rawtx +func (c *Client) RawTransaction(txid string) (string, error) { + v := url.Values{} + v.Add("txid", txid) + endpoint := "/api/v1/rawtx?" + v.Encode() + + var rawTx string + if err := c.Get(endpoint, &rawTx); err != nil { + return "", err + } + return rawTx, nil +} + +// VerifyTransaction makes a request to POST /api/v2/transaction/verify. +func (c *Client) VerifyTransaction(encodedTxn string) (*VerifyTxnResponse, error) { + req := VerifyTxnRequest{ + EncodedTransaction: encodedTxn, + } + + var rsp VerifyTxnResponse + ok, err := c.PostJSONV2("/api/v2/transaction/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// VerifyAddress makes a request to POST /api/v2/address/verify +// The API may respond with an error but include data useful for processing, +// so both return values may be non-nil. +func (c *Client) VerifyAddress(addr string) (*VerifyAddressResponse, error) { + req := VerifyAddressRequest{ + Address: addr, + } + + var rsp VerifyAddressResponse + ok, err := c.PostJSONV2("/api/v2/address/verify", req, &rsp) + if ok { + return &rsp, err + } + + return nil, err +} + +// AddressTransactions makes a request to GET /api/v1/explorer/address +func (c *Client) AddressTransactions(addr string) ([]daemon.ReadableTransaction, error) { + v := url.Values{} + v.Add("address", addr) + endpoint := "/api/v1/explorer/address?" + v.Encode() + + var b []daemon.ReadableTransaction + if err := c.Get(endpoint, &b); err != nil { + return nil, err + } + return b, nil +} + +// RichlistParams are arguments to the /richlist endpoint +type RichlistParams struct { + N int + IncludeDistribution bool +} + +// Richlist makes a request to GET /api/v1/richlist +func (c *Client) Richlist(params *RichlistParams) (*Richlist, error) { + endpoint := "/api/v1/richlist" + + if params != nil { + v := url.Values{} + v.Add("n", fmt.Sprint(params.N)) + v.Add("include-distribution", fmt.Sprint(params.IncludeDistribution)) + endpoint = "/api/v1/richlist?" + v.Encode() + } + + var r Richlist + if err := c.Get(endpoint, &r); err != nil { + return nil, err + } + return &r, nil +} + +// AddressCount makes a request to GET /api/v1/addresscount +func (c *Client) AddressCount() (uint64, error) { + var r struct { + Count uint64 `json:"count"` + } + if err := c.Get("/api/v1/addresscount", &r); err != nil { + return 0, err + } + return r.Count, nil + +} + +// UnloadWallet makes a request to POST /api/v1/wallet/unload +func (c *Client) UnloadWallet(id string) error { + v := url.Values{} + v.Add("id", id) + return c.PostForm("/api/v1/wallet/unload", strings.NewReader(v.Encode()), nil) +} + +// Health makes a request to GET /api/v1/health +func (c *Client) Health() (*HealthResponse, error) { + var r HealthResponse + if err := c.Get("/api/v1/health", &r); err != nil { + return nil, err + } + + return &r, nil +} + +// EncryptWallet makes a request to POST /api/v1/wallet/encrypt to encrypt a specific wallet with the given password +func (c *Client) EncryptWallet(id string, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/encrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} + +// DecryptWallet makes a request to POST /api/v1/wallet/decrypt to decrypt a wallet +func (c *Client) DecryptWallet(id string, password string) (*WalletResponse, error) { + v := url.Values{} + v.Add("id", id) + v.Add("password", password) + var wlt WalletResponse + if err := c.PostForm("/api/v1/wallet/decrypt", strings.NewReader(v.Encode()), &wlt); err != nil { + return nil, err + } + + return &wlt, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/csrf.go b/vendor/github.com/skycoin/skycoin/src/api/csrf.go new file mode 100755 index 0000000..e35f443 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/csrf.go @@ -0,0 +1,177 @@ +package api + +import ( + "crypto/subtle" + "encoding/base64" + "errors" + "net/http" + "net/url" + "sync" + "time" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +const ( + // CSRFHeaderName is the name of the CSRF header + CSRFHeaderName = "X-CSRF-Token" + + // CSRFMaxAge is the lifetime of a CSRF token in seconds + CSRFMaxAge = time.Second * 30 + + csrfTokenLength = 64 +) + +// CSRFToken csrf token +type CSRFToken struct { + Value []byte + ExpiresAt time.Time +} + +// newCSRFToken generates a new CSRF Token +func newCSRFToken() CSRFToken { + return CSRFToken{ + Value: cipher.RandByte(csrfTokenLength), + ExpiresAt: time.Now().Add(CSRFMaxAge), + } +} + +// String returns the token in base64 URL-safe encoded format +func (c *CSRFToken) String() string { + return base64.RawURLEncoding.EncodeToString(c.Value) +} + +// CSRFStore encapsulates a single CSRFToken +type CSRFStore struct { + token *CSRFToken + Enabled bool + sync.RWMutex +} + +// getTokenValue returns a url safe base64 encoded token +func (c *CSRFStore) getTokenValue() string { + c.RLock() + defer c.RUnlock() + return c.token.String() +} + +// setToken sets a new CSRF token +// if the value is changing the expire time should also change +// so there is no explicit method to just set the value of the token +func (c *CSRFStore) setToken(token CSRFToken) { + c.Lock() + defer c.Unlock() + c.token = &token +} + +// expired checks if token expiry time is greater than current time +func (c *CSRFStore) expired() bool { + return c.token == nil || time.Now().After(c.token.ExpiresAt) +} + +// verifyToken checks that the given token is same as the internal token +func (c *CSRFStore) verifyToken(headerToken string) error { + c.RLock() + defer c.RUnlock() + + // check if token is initialized + if c.token == nil || len(c.token.Value) == 0 { + return errors.New("token not initialized") + } + + a, err := base64.RawURLEncoding.DecodeString(headerToken) + if err != nil { + return err + } + + // check if token values are same, using a constant time comparison + if subtle.ConstantTimeCompare(a, c.token.Value) != 1 { + return errors.New("invalid token") + } + + // make sure token is still valid + if c.expired() { + return errors.New("token has expired") + } + + return nil +} + +// Creates a new CSRF token. Previous CSRF tokens are invalidated by this call. +// URI: /api/v1/csrf +// Method: GET +// Response: +// csrf_token: CSRF token to use in POST requests +func getCSRFToken(store *CSRFStore) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if !store.Enabled { + logger.Warning("CSRF check disabled") + wh.Error404(w, "") + return + } + + // generate a new token + store.setToken(newCSRFToken()) + + wh.SendJSONOr500(logger, w, &map[string]string{"csrf_token": store.getTokenValue()}) + } +} + +// CSRFCheck verifies X-CSRF-Token header value +func CSRFCheck(store *CSRFStore, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if store.Enabled { + switch r.Method { + case http.MethodPost, http.MethodPut, http.MethodDelete: + token := r.Header.Get(CSRFHeaderName) + if err := store.verifyToken(token); err != nil { + logger.Errorf("CSRF token invalid: %v", err) + wh.Error403(w, "invalid CSRF token") + return + } + } + } + + handler.ServeHTTP(w, r) + }) +} + +// OriginRefererCheck checks the Origin header if present, falling back on Referer. +// The Origin or Referer hostname must match the configured host. +// If neither are present, the request is allowed. All major browsers will set +// at least one of these values. If neither are set, assume it is a request +// from curl/wget. +func OriginRefererCheck(host string, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + origin := r.Header.Get("Origin") + referer := r.Header.Get("Referer") + + toCheck := origin + if toCheck == "" { + toCheck = referer + } + + if toCheck != "" { + u, err := url.Parse(toCheck) + if err != nil { + logger.Critical().Errorf("Invalid URL in Origin or Referer header: %s %v", toCheck, err) + wh.Error403(w, "") + return + } + + if u.Host != host { + //logger.Critical().Errorf("Origin or Referer header value %s does not match host", toCheck) + //wh.Error403(w, "") + //return + } + } + + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/csrf_test.go b/vendor/github.com/skycoin/skycoin/src/api/csrf_test.go new file mode 100755 index 0000000..29ce447 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/csrf_test.go @@ -0,0 +1,379 @@ +package api + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +const ( + tokenValid = "token_valid" + tokenInvalid = "token_invalid" + tokenExpired = "token_expired" + tokenEmpty = "token_empty" + tokenNotGenerated = "token_not_generated" +) + +func setCSRFParameters(csrfStore *CSRFStore, tokenType string, req *http.Request) { + token := newCSRFToken() + // token check + switch tokenType { + case tokenValid: + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", token.String()) + case tokenInvalid: + // set invalid token value + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", "xcasadsadsa") + case tokenExpired: + csrfStore.setToken(token) + csrfStore.token.ExpiresAt = time.Unix(1517509381, 10) + req.Header.Set("X-CSRF-Token", token.String()) + // set some old unix time + case tokenEmpty: + // set empty token + csrfStore.setToken(token) + req.Header.Set("X-CSRF-Token", "") + case tokenNotGenerated: + // don't set token + csrfStore.token = nil + req.Header.Set("X-CSRF-Token", token.String()) + } +} + +var endpoints = []string{ + "/address_uxouts", + "/addresscount", + "/balance", + "/block", + "/blockchain/metadata", + "/blockchain/progress", + "/blocks", + "/coinSupply", + "/explorer/address", + "/health", + "/injectTransaction", + "/last_blocks", + "/version", + "/network/connection", + "/network/connections", + "/network/connections/exchange", + "/network/connections/trust", + "/network/defaultConnections", + "/outputs", + "/pendingTxs", + "/rawtx", + "/richlist", + "/resendUnconfirmedTxns", + "/transaction", + "/transactions", + "/uxout", + "/wallet", + "/wallet/balance", + "/wallet/create", + "/wallet/newAddress", + "/wallet/newSeed", + "/wallet/seed", + "/wallet/spend", + "/wallet/transaction", + "/wallet/transactions", + "/wallet/unload", + "/wallet/update", + "/wallets", + "/wallets/folderName", + "/webrpc", + + "/api/v1/address_uxouts", + "/api/v1/addresscount", + "/api/v1/balance", + "/api/v1/block", + "/api/v1/blockchain/metadata", + "/api/v1/blockchain/progress", + "/api/v1/blocks", + "/api/v1/coinSupply", + "/api/v1/explorer/address", + "/api/v1/health", + "/api/v1/injectTransaction", + "/api/v1/last_blocks", + "/api/v1/version", + "/api/v1/network/connection", + "/api/v1/network/connections", + "/api/v1/network/connections/exchange", + "/api/v1/network/connections/trust", + "/api/v1/network/defaultConnections", + "/api/v1/outputs", + "/api/v1/pendingTxs", + "/api/v1/rawtx", + "/api/v1/richlist", + "/api/v1/resendUnconfirmedTxns", + "/api/v1/transaction", + "/api/v1/transactions", + "/api/v1/uxout", + "/api/v1/wallet", + "/api/v1/wallet/balance", + "/api/v1/wallet/create", + "/api/v1/wallet/newAddress", + "/api/v1/wallet/newSeed", + "/api/v1/wallet/seed", + "/api/v1/wallet/spend", + "/api/v1/wallet/transaction", + "/api/v1/wallet/transactions", + "/api/v1/wallet/unload", + "/api/v1/wallet/update", + "/api/v1/wallets", + "/api/v1/wallets/folderName", + "/api/v1/webrpc", + + "/api/v2/transaction/verify", + "/api/v2/address/verify", +} + +func TestCSRFWrapper(t *testing.T) { + methods := []string{http.MethodPost, http.MethodPut, http.MethodDelete} + cases := []string{tokenInvalid, tokenExpired, tokenEmpty, tokenNotGenerated} + + for _, endpoint := range endpoints { + for _, method := range methods { + for _, c := range cases { + name := fmt.Sprintf("%s %s %s", method, endpoint, c) + t.Run(name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, c, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + enableUnversionedAPI: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + }) + } + } + } +} + +func TestOriginRefererCheck(t *testing.T) { + cases := []struct { + name string + origin string + referer string + }{ + { + name: "mismatched origin header", + origin: "http://example.com/", + }, + { + name: "mismatched referer header", + referer: "http://example.com/", + }, + } + + for _, endpoint := range endpoints { + for _, tc := range cases { + name := fmt.Sprintf("%s %s", tc.name, endpoint) + t.Run(name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + if tc.origin != "" { + req.Header.Set("Origin", tc.origin) + } + if tc.referer != "" { + req.Header.Set("Referer", tc.referer) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden\n", rr.Body.String()) + }) + } + } +} + +func TestHostCheck(t *testing.T) { + for _, endpoint := range endpoints { + t.Run(endpoint, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + req.Host = "example.com" + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, http.StatusForbidden, status, "wrong status code: got `%v` want `%v`", status, http.StatusForbidden) + require.Equal(t, "403 Forbidden\n", rr.Body.String()) + }) + } +} + +func TestCSRF(t *testing.T) { + csrfStore := &CSRFStore{ + Enabled: true, + } + + updateWalletLabel := func(csrfToken string) *httptest.ResponseRecorder { + gateway := &GatewayerMock{} + gateway.On("UpdateWalletLabel", "fooid", "foolabel").Return(nil) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + v.Add("id", "fooid") + v.Add("label", "foolabel") + + req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + if csrfToken != "" { + req.Header.Set("X-CSRF-Token", csrfToken) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + return rr + } + + // First request to POST /wallet/update is rejected because of missing CSRF + rr := updateWalletLabel("") + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) + + // Make a request to /csrf to get a token + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + // non-GET request to /csrf is invalid + req, err := http.NewRequest(http.MethodPost, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusMethodNotAllowed, rr.Code) + require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") + + // CSRF disabled 404s + csrfStore.Enabled = false + + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusNotFound, rr.Code) + require.Nil(t, csrfStore.token, "csrfStore.token should not be set yet") + + csrfStore.Enabled = true + + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + + token := msg["csrf_token"] + require.NotEmpty(t, token) + + req, err = http.NewRequest(http.MethodPost, "/api/v1/version", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + // Make a request to POST /wallet/update again, using the CSRF token + rr = updateWalletLabel(token) + require.Equal(t, http.StatusOK, rr.Code) + + // Make another call to /csrf, this will invalidate the first token + // Request a CSRF token, use it in a request + req, err = http.NewRequest(http.MethodGet, "/api/v1/csrf", nil) + require.NoError(t, err) + + rr = httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var msg2 map[string]string + err = json.Unmarshal(rr.Body.Bytes(), &msg2) + require.NoError(t, err) + require.NotEmpty(t, msg2["csrf_token"]) + require.NotEqual(t, msg["csrf_token"], msg2["csrf_token"]) + + rr = updateWalletLabel(token) + require.Equal(t, http.StatusForbidden, rr.Code) + require.Equal(t, "403 Forbidden - invalid CSRF token\n", rr.Body.String()) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/explorer.go b/vendor/github.com/skycoin/skycoin/src/api/explorer.go new file mode 100755 index 0000000..a0fb19d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/explorer.go @@ -0,0 +1,252 @@ +package api + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/droplet" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor" +) + +// CoinSupply records the coin supply info +type CoinSupply struct { + // Coins distributed beyond the project: + CurrentSupply string `json:"current_supply"` + // TotalSupply is CurrentSupply plus coins held by the distribution addresses that are spendable + TotalSupply string `json:"total_supply"` + // MaxSupply is the maximum number of coins to be distributed ever + MaxSupply string `json:"max_supply"` + // CurrentCoinHourSupply is coins hours in non distribution addresses + CurrentCoinHourSupply string `json:"current_coinhour_supply"` + // TotalCoinHourSupply is coin hours in all addresses including unlocked distribution addresses + TotalCoinHourSupply string `json:"total_coinhour_supply"` + // Distribution addresses which count towards total supply + UnlockedAddresses []string `json:"unlocked_distribution_addresses"` + // Distribution addresses which are locked and do not count towards total supply + LockedAddresses []string `json:"locked_distribution_addresses"` +} + +func getCoinSupply(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + supply := coinSupply(gateway, w, r) + if supply != nil { + wh.SendJSONOr500(logger, w, supply) + } + } +} + +func coinSupply(gateway Gatewayer, w http.ResponseWriter, r *http.Request) *CoinSupply { + if r.Method != http.MethodGet { + wh.Error405(w) + return nil + } + + allUnspents, err := gateway.GetUnspentOutputs() + if err != nil { + err = fmt.Errorf("gateway.GetUnspentOutputs failed: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) + + var unlockedSupply uint64 + // check confirmed unspents only + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrMap[u.Address]; ok { + coins, err := droplet.FromString(u.Coins) + if err != nil { + err = fmt.Errorf("Invalid unlocked output balance string %s: %v", u.Coins, err) + wh.Error500(w, err.Error()) + return nil + } + unlockedSupply += coins + } + } + + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distributed from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + totalSupplyStr, err := droplet.ToString(totalSupply) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) + if err != nil { + err = fmt.Errorf("Failed to convert coins to string: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + // locked distribution addresses + lockedAddrs := visor.GetLockedDistributionAddresses() + lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrMap[out.Address]; !ok { + totalCoinHours += out.CalculatedHours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrMap[out.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrMap[out.Address]; !ok { + currentCoinHours += out.CalculatedHours + } + } + } + + if err != nil { + err = fmt.Errorf("Failed to get total coinhours: %v", err) + wh.Error500(w, err.Error()) + return nil + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: unlockedAddrs, + LockedAddresses: visor.GetLockedDistributionAddresses(), + } + + return &cs +} + +// method: GET +// url: /explorer/address?address=${address} +func getTransactionsForAddress(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, "invalid address") + return + } + + txns, err := gateway.GetTransactionsForAddress(cipherAddr) + if err != nil { + err = fmt.Errorf("gateway.GetTransactionsForAddress failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txns) + } +} + +// Richlist is the API response for /richlist, contains top address balances +type Richlist struct { + Richlist visor.Richlist `json:"richlist"` +} + +// method: GET +// url: /richlist?n=${number}&include-distribution=${bool} +func getRichlist(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var topn int + topnStr := r.FormValue("n") + if topnStr == "" { + topn = 20 + } else { + var err error + topn, err = strconv.Atoi(topnStr) + if err != nil { + wh.Error400(w, "invalid n") + return + } + } + + var includeDistribution bool + includeDistributionStr := r.FormValue("include-distribution") + if includeDistributionStr == "" { + includeDistribution = false + } else { + var err error + includeDistribution, err = strconv.ParseBool(includeDistributionStr) + if err != nil { + wh.Error400(w, "invalid include-distribution") + return + } + } + + richlist, err := gateway.GetRichlist(includeDistribution) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + if topn > 0 && topn < len(richlist) { + richlist = richlist[:topn] + } + + wh.SendJSONOr500(logger, w, Richlist{ + Richlist: richlist, + }) + } +} + +// method: GET +// url: /addresscount +func getAddressCount(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrCount, err := gateway.GetAddressCount() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, &map[string]uint64{"count": addrCount}) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/explorer_test.go b/vendor/github.com/skycoin/skycoin/src/api/explorer_test.go new file mode 100755 index 0000000..2ba3aac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/explorer_test.go @@ -0,0 +1,625 @@ +package api + +import ( + "errors" + "net/http" + "testing" + + "encoding/json" + "net/http/httptest" + "net/url" + "strings" + + "github.com/stretchr/testify/require" + + "github.com/stretchr/testify/mock" + + "strconv" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor" +) + +func makeSuccessCoinSupplyResult(t *testing.T, allUnspents visor.ReadableOutputSet) *CoinSupply { + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + var unlockedSupply uint64 + // check confirmed unspents only + // Search map of unlocked addresses + // used to filter unspents + unlockedAddrMap := daemon.MakeSearchMap(unlockedAddrs) + for _, u := range allUnspents.HeadOutputs { + // check if address is an unlocked distribution address + if _, ok := unlockedAddrMap[u.Address]; ok { + coins, err := droplet.FromString(u.Coins) + require.NoError(t, err) + unlockedSupply += coins + } + } + // "total supply" is the number of coins unlocked. + // Each distribution address was allocated visor.DistributionAddressInitialBalance coins. + totalSupply := uint64(len(unlockedAddrs)) * visor.DistributionAddressInitialBalance + totalSupply *= droplet.Multiplier + + // "current supply" is the number of coins distribution from the unlocked pool + currentSupply := totalSupply - unlockedSupply + + currentSupplyStr, err := droplet.ToString(currentSupply) + require.NoError(t, err) + + totalSupplyStr, err := droplet.ToString(totalSupply) + require.NoError(t, err) + + maxSupplyStr, err := droplet.ToString(visor.MaxCoinSupply * droplet.Multiplier) + require.NoError(t, err) + + // locked distribution addresses + lockedAddrs := visor.GetLockedDistributionAddresses() + lockedAddrMap := daemon.MakeSearchMap(lockedAddrs) + + // get total coins hours which excludes locked distribution addresses + var totalCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + if _, ok := lockedAddrMap[out.Address]; !ok { + totalCoinHours += out.Hours + } + } + + // get current coin hours which excludes all distribution addresses + var currentCoinHours uint64 + for _, out := range allUnspents.HeadOutputs { + // check if address not in locked distribution addresses + if _, ok := lockedAddrMap[out.Address]; !ok { + // check if address not in unlocked distribution addresses + if _, ok := unlockedAddrMap[out.Address]; !ok { + currentCoinHours += out.Hours + } + } + } + + cs := CoinSupply{ + CurrentSupply: currentSupplyStr, + TotalSupply: totalSupplyStr, + MaxSupply: maxSupplyStr, + CurrentCoinHourSupply: strconv.FormatUint(currentCoinHours, 10), + TotalCoinHourSupply: strconv.FormatUint(totalCoinHours, 10), + UnlockedAddresses: unlockedAddrs, + LockedAddresses: visor.GetLockedDistributionAddresses(), + } + return &cs +} + +func TestGetTransactionsForAddress(t *testing.T) { + address := testutil.MakeAddress() + successAddress := "111111111111111111111691FSP" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + tt := []struct { + name string + method string + status int + err string + addressParam string + gatewayGetTransactionsForAddressErr error + result []daemon.ReadableTransaction + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + addressParam: "0", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + addressParam: "", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address", + addressParam: "badAddress", + }, + { + name: "500 - gw GetTransactionsForAddress error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetTransactionsForAddress failed: gatewayGetTransactionsForAddressErr", + addressParam: address.String(), + gatewayGetTransactionsForAddressErr: errors.New("gatewayGetTransactionsForAddressErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + addressParam: address.String(), + result: []daemon.ReadableTransaction{ + { + In: []visor.ReadableTransactionInput{ + { + Hash: validHash, + Address: successAddress, + Coins: "0.000000", + Hours: 0, + }, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/explorer/address" + gateway := NewGatewayerMock() + gateway.On("GetTransactionsForAddress", address).Return(tc.result, tc.gatewayGetTransactionsForAddressErr) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.addressParam != "" { + v.Add("address", tc.addressParam) + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []daemon.ReadableTransaction + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestCoinSupply(t *testing.T) { + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + successGatewayGetUnspentOutputsResult := visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "0", + }, + visor.ReadableOutput{ + Coins: "0", + }, + }, + } + var filterInUnlocked []daemon.OutputsFilter + filterInUnlocked = append(filterInUnlocked, daemon.FbyAddresses(unlockedAddrs)) + tt := []struct { + name string + method string + status int + err string + gatewayGetUnspentOutputsArg []daemon.OutputsFilter + gatewayGetUnspentOutputsResult *visor.ReadableOutputSet + gatewayGetUnspentOutputsErr error + result *CoinSupply + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - gatewayGetUnspentOutputsErr", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetUnspentOutputs failed: gatewayGetUnspentOutputsErr", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsErr: errors.New("gatewayGetUnspentOutputsErr"), + }, + { + name: "500 - too large HeadOutputs item", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Invalid unlocked output balance string 9223372036854775807: Droplet string conversion failed: Value is too large", + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "9223372036854775807", + Address: unlockedAddrs[0], + }, + visor.ReadableOutput{ + Coins: "1", + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + + gatewayGetUnspentOutputsArg: filterInUnlocked, + gatewayGetUnspentOutputsResult: &visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + visor.ReadableOutput{ + Coins: "0", + }, + visor.ReadableOutput{ + Coins: "0", + }, + }, + }, + result: makeSuccessCoinSupplyResult(t, successGatewayGetUnspentOutputsResult), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/coinSupply" + gateway := NewGatewayerMock() + gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.gatewayGetUnspentOutputsResult, tc.gatewayGetUnspentOutputsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *CoinSupply + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetRichlist(t *testing.T) { + type httpParams struct { + topn string + includeDistribution string + } + tt := []struct { + name string + method string + status int + err string + httpParams *httpParams + includeDistribution bool + gatewayGetRichlistResult visor.Richlist + gatewayGetRichlistErr error + result Richlist + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - bad topn param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid n", + httpParams: &httpParams{ + topn: "bad topn", + }, + }, + { + name: "400 - include-distribution", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid include-distribution", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "bad include-distribution", + }, + }, + { + name: "500 - gw GetRichlist error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetRichlistErr", + httpParams: &httpParams{ + topn: "1", + includeDistribution: "false", + }, + gatewayGetRichlistErr: errors.New("gatewayGetRichlistErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "3", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + result: Richlist{ + Richlist: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + }, + }, + }, + { + name: "200 no limit", + method: http.MethodGet, + status: http.StatusOK, + httpParams: &httpParams{ + topn: "0", + includeDistribution: "false", + }, + gatewayGetRichlistResult: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + result: Richlist{ + Richlist: visor.Richlist{ + { + Address: "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + Coins: "1000000.000000", + Locked: false, + }, + { + Address: "27jg25DZX21MXMypVbKJMmgCJ5SPuEunMF1", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2fGi2jhvp6ppHg3DecguZgzqvpJj2Gd4KHW", + Coins: "500000.000000", + Locked: false, + }, + { + Address: "2TmvdBWJgxMwGs84R4drS9p5fYkva4dGdfs", + Coins: "244458.000000", + Locked: false, + }, + { + Address: "24gvUHXHtSg5drKiFsMw7iMgoN2PbLub53C", + Coins: "195503.000000", + Locked: false, + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/richlist" + gateway := NewGatewayerMock() + gateway.On("GetRichlist", tc.includeDistribution).Return(tc.gatewayGetRichlistResult, tc.gatewayGetRichlistErr) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpParams != nil { + if tc.httpParams.topn != "" { + v.Add("n", tc.httpParams.topn) + } + if tc.httpParams.includeDistribution != "" { + v.Add("include-distribution", tc.httpParams.includeDistribution) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Richlist + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetAddressCount(t *testing.T) { + type Result struct { + Count uint64 + } + tt := []struct { + name string + method string + status int + err string + gatewayGetAddressCountResult uint64 + gatewayGetAddressCountErr error + result Result + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 - gw GetAddressCount error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayGetAddressCountErr", + gatewayGetAddressCountErr: errors.New("gatewayGetAddressCountErr"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + gatewayGetAddressCountResult: 1, + result: Result{ + Count: 1, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/addresscount" + gateway := NewGatewayerMock() + gateway.On("GetAddressCount").Return(tc.gatewayGetAddressCountResult, tc.gatewayGetAddressCountErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg Result + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/gateway.go b/vendor/github.com/skycoin/skycoin/src/api/gateway.go new file mode 100755 index 0000000..ab634cf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/gateway.go @@ -0,0 +1,59 @@ +package api + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +//go:generate go install +//go:generate goautomock -template=testify Gatewayer + +// Gatewayer interface for Gateway methods +type Gatewayer interface { + Spend(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) + CreateTransaction(w wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) + GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalance, error) + GetWallet(wltID string) (*wallet.Wallet, error) + GetWallets() (wallet.Wallets, error) + UpdateWalletLabel(wltID, label string) error + GetWalletUnconfirmedTxns(wltID string) ([]visor.UnconfirmedTxn, error) + CreateWallet(wltName string, options wallet.Options) (*wallet.Wallet, error) + NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) + GetWalletDir() (string, error) + IsWalletAPIEnabled() bool + EncryptWallet(wltID string, password []byte) (*wallet.Wallet, error) + DecryptWallet(wltID string, password []byte) (*wallet.Wallet, error) + GetWalletSeed(wltID string, password []byte) (string, error) + GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) + GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) + GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) + GetBuildInfo() visor.BuildInfo + GetUnspentOutputs(filters ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) + GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) + GetBlockchainMetadata() (*visor.BlockchainMetadata, error) + GetBlockchainProgress() (*daemon.BlockchainProgress, error) + GetConnection(addr string) *daemon.Connection + GetConnections() *daemon.Connections + GetDefaultConnections() []string + GetTrustConnections() []string + GetExchgConnection() []string + GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + GetTransactions(flts ...visor.TxFilter) ([]visor.Transaction, error) + InjectBroadcastTransaction(txn coin.Transaction) error + ResendUnconfirmedTxns() (*daemon.ResendResult, error) + GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) + GetAddrUxOuts(addr []cipher.Address) ([]*historydb.UxOut, error) + GetTransactionsForAddress(a cipher.Address) ([]daemon.ReadableTransaction, error) + GetRichlist(includeDistribution bool) (visor.Richlist, error) + GetAddressCount() (uint64, error) + GetHealth() (*daemon.Health, error) + UnloadWallet(id string) error + VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) + IsCSPEnabled() bool +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/gatewayer_mock_test.go b/vendor/github.com/skycoin/skycoin/src/api/gatewayer_mock_test.go new file mode 100755 index 0000000..ce81229 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/gatewayer_mock_test.go @@ -0,0 +1,1090 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package api + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + daemon "github.com/skycoin/skycoin/src/daemon" + visor "github.com/skycoin/skycoin/src/visor" + historydb "github.com/skycoin/skycoin/src/visor/historydb" + wallet "github.com/skycoin/skycoin/src/wallet" +) + +// GatewayerMock mock +type GatewayerMock struct { + mock.Mock +} + +func NewGatewayerMock() *GatewayerMock { + return &GatewayerMock{} +} + +// CreateTransaction mocked method +func (m *GatewayerMock) CreateTransaction(p0 wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { + + ret := m.Called(p0) + + var r0 *coin.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *coin.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 []wallet.UxBalance + switch res := ret.Get(1).(type) { + case nil: + case []wallet.UxBalance: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// CreateWallet mocked method +func (m *GatewayerMock) CreateWallet(p0 string, p1 wallet.Options) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// DecryptWallet mocked method +func (m *GatewayerMock) DecryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// EncryptWallet mocked method +func (m *GatewayerMock) EncryptWallet(p0 string, p1 []byte) (*wallet.Wallet, error) { + + ret := m.Called(p0, p1) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAddrUxOuts mocked method +func (m *GatewayerMock) GetAddrUxOuts(p0 []cipher.Address) ([]*historydb.UxOut, error) { + + ret := m.Called(p0) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAddressCount mocked method +func (m *GatewayerMock) GetAddressCount() (uint64, error) { + + ret := m.Called() + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAllUnconfirmedTxns mocked method +func (m *GatewayerMock) GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) { + + ret := m.Called() + + var r0 []visor.UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case []visor.UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBalanceOfAddrs mocked method +func (m *GatewayerMock) GetBalanceOfAddrs(p0 []cipher.Address) ([]wallet.BalancePair, error) { + + ret := m.Called(p0) + + var r0 []wallet.BalancePair + switch res := ret.Get(0).(type) { + case nil: + case []wallet.BalancePair: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlockchainMetadata mocked method +func (m *GatewayerMock) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { + + ret := m.Called() + + var r0 *visor.BlockchainMetadata + switch res := ret.Get(0).(type) { + case nil: + case *visor.BlockchainMetadata: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlockchainProgress mocked method +func (m *GatewayerMock) GetBlockchainProgress() (*daemon.BlockchainProgress, error) { + + ret := m.Called() + + var r0 *daemon.BlockchainProgress + switch res := ret.Get(0).(type) { + case nil: + case *daemon.BlockchainProgress: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlocks mocked method +func (m *GatewayerMock) GetBlocks(p0 uint64, p1 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0, p1) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBuildInfo mocked method +func (m *GatewayerMock) GetBuildInfo() visor.BuildInfo { + + ret := m.Called() + + var r0 visor.BuildInfo + switch res := ret.Get(0).(type) { + case nil: + case visor.BuildInfo: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetConnection mocked method +func (m *GatewayerMock) GetConnection(p0 string) *daemon.Connection { + + ret := m.Called(p0) + + var r0 *daemon.Connection + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Connection: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetConnections mocked method +func (m *GatewayerMock) GetConnections() *daemon.Connections { + + ret := m.Called() + + var r0 *daemon.Connections + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Connections: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetDefaultConnections mocked method +func (m *GatewayerMock) GetDefaultConnections() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetExchgConnection mocked method +func (m *GatewayerMock) GetExchgConnection() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetHealth mocked method +func (m *GatewayerMock) GetHealth() (*daemon.Health, error) { + + ret := m.Called() + + var r0 *daemon.Health + switch res := ret.Get(0).(type) { + case nil: + case *daemon.Health: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetLastBlocks mocked method +func (m *GatewayerMock) GetLastBlocks(p0 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetRichlist mocked method +func (m *GatewayerMock) GetRichlist(p0 bool) (visor.Richlist, error) { + + ret := m.Called(p0) + + var r0 visor.Richlist + switch res := ret.Get(0).(type) { + case nil: + case visor.Richlist: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockByHash mocked method +func (m *GatewayerMock) GetSignedBlockByHash(p0 cipher.SHA256) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockBySeq mocked method +func (m *GatewayerMock) GetSignedBlockBySeq(p0 uint64) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransaction mocked method +func (m *GatewayerMock) GetTransaction(p0 cipher.SHA256) (*visor.Transaction, error) { + + ret := m.Called(p0) + + var r0 *visor.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *visor.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransactions mocked method +func (m *GatewayerMock) GetTransactions(p0 ...visor.TxFilter) ([]visor.Transaction, error) { + + ret := m.Called(p0) + + var r0 []visor.Transaction + switch res := ret.Get(0).(type) { + case nil: + case []visor.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransactionsForAddress mocked method +func (m *GatewayerMock) GetTransactionsForAddress(p0 cipher.Address) ([]daemon.ReadableTransaction, error) { + + ret := m.Called(p0) + + var r0 []daemon.ReadableTransaction + switch res := ret.Get(0).(type) { + case nil: + case []daemon.ReadableTransaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTrustConnections mocked method +func (m *GatewayerMock) GetTrustConnections() []string { + + ret := m.Called() + + var r0 []string + switch res := ret.Get(0).(type) { + case nil: + case []string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetUnspentOutputs mocked method +func (m *GatewayerMock) GetUnspentOutputs(p0 ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableOutputSet + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableOutputSet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUxOutByID mocked method +func (m *GatewayerMock) GetUxOutByID(p0 cipher.SHA256) (*historydb.UxOut, error) { + + ret := m.Called(p0) + + var r0 *historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case *historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWallet mocked method +func (m *GatewayerMock) GetWallet(p0 string) (*wallet.Wallet, error) { + + ret := m.Called(p0) + + var r0 *wallet.Wallet + switch res := ret.Get(0).(type) { + case nil: + case *wallet.Wallet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletBalance mocked method +func (m *GatewayerMock) GetWalletBalance(p0 string) (wallet.BalancePair, wallet.AddressBalance, error) { + + ret := m.Called(p0) + + var r0 wallet.BalancePair + switch res := ret.Get(0).(type) { + case nil: + case wallet.BalancePair: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 wallet.AddressBalance + switch res := ret.Get(1).(type) { + case nil: + case wallet.AddressBalance: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// GetWalletDir mocked method +func (m *GatewayerMock) GetWalletDir() (string, error) { + + ret := m.Called() + + var r0 string + switch res := ret.Get(0).(type) { + case nil: + case string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletSeed mocked method +func (m *GatewayerMock) GetWalletSeed(p0 string, p1 []byte) (string, error) { + + ret := m.Called(p0, p1) + + var r0 string + switch res := ret.Get(0).(type) { + case nil: + case string: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWalletUnconfirmedTxns mocked method +func (m *GatewayerMock) GetWalletUnconfirmedTxns(p0 string) ([]visor.UnconfirmedTxn, error) { + + ret := m.Called(p0) + + var r0 []visor.UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case []visor.UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetWallets mocked method +func (m *GatewayerMock) GetWallets() (wallet.Wallets, error) { + + ret := m.Called() + + var r0 wallet.Wallets + switch res := ret.Get(0).(type) { + case nil: + case wallet.Wallets: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// InjectBroadcastTransaction mocked method +func (m *GatewayerMock) InjectBroadcastTransaction(p0 coin.Transaction) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsCSPEnabled mocked method +func (m *GatewayerMock) IsCSPEnabled() bool { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsWalletAPIEnabled mocked method +func (m *GatewayerMock) IsWalletAPIEnabled() bool { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// NewAddresses mocked method +func (m *GatewayerMock) NewAddresses(p0 string, p1 []byte, p2 uint64) ([]cipher.Address, error) { + + ret := m.Called(p0, p1, p2) + + var r0 []cipher.Address + switch res := ret.Get(0).(type) { + case nil: + case []cipher.Address: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// ResendUnconfirmedTxns mocked method +func (m *GatewayerMock) ResendUnconfirmedTxns() (*daemon.ResendResult, error) { + + ret := m.Called() + + var r0 *daemon.ResendResult + switch res := ret.Get(0).(type) { + case nil: + case *daemon.ResendResult: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Spend mocked method +func (m *GatewayerMock) Spend(p0 string, p1 []byte, p2 uint64, p3 cipher.Address) (*coin.Transaction, error) { + + ret := m.Called(p0, p1, p2, p3) + + var r0 *coin.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *coin.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// UnloadWallet mocked method +func (m *GatewayerMock) UnloadWallet(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// UpdateWalletLabel mocked method +func (m *GatewayerMock) UpdateWalletLabel(p0 string, p1 string) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// VerifyTxnVerbose mocked method +func (m *GatewayerMock) VerifyTxnVerbose(p0 *coin.Transaction) ([]wallet.UxBalance, bool, error) { + + ret := m.Called(p0) + + var r0 []wallet.UxBalance + switch res := ret.Get(0).(type) { + case nil: + case []wallet.UxBalance: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/health.go b/vendor/github.com/skycoin/skycoin/src/api/health.go new file mode 100755 index 0000000..90cfacb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/health.go @@ -0,0 +1,56 @@ +package api + +import ( + "fmt" + "net/http" + "time" + + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/visor" +) + +// BlockchainMetadata extends visor.BlockchainMetadata to include the time since the last block +type BlockchainMetadata struct { + *visor.BlockchainMetadata + TimeSinceLastBlock wh.Duration `json:"time_since_last_block"` +} + +// HealthResponse is returned by the /health endpoint +type HealthResponse struct { + BlockchainMetadata BlockchainMetadata `json:"blockchain"` + Version visor.BuildInfo `json:"version"` + OpenConnections int `json:"open_connections"` + Uptime wh.Duration `json:"uptime"` +} + +// Returns node health data. +// URI: /api/v1/health +// Method: GET +func healthCheck(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + health, err := gateway.GetHealth() + if err != nil { + err = fmt.Errorf("gateway.GetHealth failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + elapsedBlockTime := time.Now().UTC().Unix() - int64(health.BlockchainMetadata.Head.Time) + timeSinceLastBlock := time.Second * time.Duration(elapsedBlockTime) + + wh.SendJSONOr500(logger, w, HealthResponse{ + BlockchainMetadata: BlockchainMetadata{ + BlockchainMetadata: health.BlockchainMetadata, + TimeSinceLastBlock: wh.FromDuration(timeSinceLastBlock), + }, + Version: health.Version, + OpenConnections: health.OpenConnections, + Uptime: wh.FromDuration(health.Uptime), + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/health_test.go b/vendor/github.com/skycoin/skycoin/src/api/health_test.go new file mode 100755 index 0000000..3970890 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/health_test.go @@ -0,0 +1,120 @@ +package api + +import ( + "errors" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "encoding/json" + "net/http/httptest" + + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" +) + +func TestHealthCheckHandler(t *testing.T) { + + cases := []struct { + name string + method string + code int + getHealthErr error + }{ + { + name: "valid response", + method: http.MethodGet, + code: http.StatusOK, + }, + { + name: "403 method not allowed", + method: http.MethodPost, + code: http.StatusMethodNotAllowed, + }, + { + name: "gateway.GetHealth error", + method: http.MethodGet, + code: http.StatusInternalServerError, + getHealthErr: errors.New("GetHealth failed"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unspents := uint64(10) + unconfirmed := uint64(20) + + metadata := &visor.BlockchainMetadata{ + Head: visor.ReadableBlockHeader{ + BkSeq: 21175, + BlockHash: "8a3e0aac619551ae009cfb28c2b36bb1300925f74da770d1512072314f6a4c80", + PreviousBlockHash: "001eb7911b6a6ab7c75feb88726dd2bc8b87133aebc82201c4404537eb74f7ac", + Time: 1523168686, + Fee: 2, + Version: 0, + BodyHash: "36be8d70d1e9f70b340ea7ecf0b247c27086bad10568044c1196fe150f6cea1b", + }, + Unspents: unspents, + Unconfirmed: unconfirmed, + } + + buildInfo := visor.BuildInfo{ + Version: "1.0.0", + Commit: "abcdef", + Branch: "develop", + } + + health := &daemon.Health{ + BlockchainMetadata: metadata, + OpenConnections: 3, + Version: buildInfo, + Uptime: time.Second * 4, + } + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + if tc.getHealthErr != nil { + gateway.On("GetHealth").Return(nil, tc.getHealthErr) + } else { + gateway.On("GetHealth").Return(health, nil) + } + + endpoint := "/api/v1/health" + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + cfg := muxConfig{ + host: configuredHost, + appLoc: ".", + } + handler := newServerMux(cfg, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + if tc.code != http.StatusOK { + require.Equal(t, tc.code, rr.Code) + return + } + + require.Equal(t, http.StatusOK, rr.Code) + + r := &HealthResponse{} + err = json.Unmarshal(rr.Body.Bytes(), r) + require.NoError(t, err) + + require.Equal(t, buildInfo.Version, r.Version.Version) + require.Equal(t, buildInfo.Commit, r.Version.Commit) + require.Equal(t, buildInfo.Branch, r.Version.Branch) + require.Equal(t, health.Uptime, r.Uptime.Duration) + + require.Equal(t, health.OpenConnections, r.OpenConnections) + + require.Equal(t, unconfirmed, r.BlockchainMetadata.Unconfirmed) + require.Equal(t, unspents, r.BlockchainMetadata.Unspents) + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + require.Equal(t, metadata.Head, r.BlockchainMetadata.Head) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/http.go b/vendor/github.com/skycoin/skycoin/src/api/http.go new file mode 100755 index 0000000..75512ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/http.go @@ -0,0 +1,573 @@ +package api + +import ( + "crypto/tls" + "fmt" + "io/ioutil" + "net" + "net/http" + "path/filepath" + "strings" + "time" + "unicode" + + "github.com/NYTimes/gziphandler" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/file" + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("api") +) + +const ( + resourceDir = "dist/" + devDir = "dev/" + indexPage = "index.html" + + defaultReadTimeout = time.Second * 10 + defaultWriteTimeout = time.Second * 60 + defaultIdleTimeout = time.Second * 120 +) + +// Server exposes an HTTP API +type Server struct { + server *http.Server + listener net.Listener + done chan struct{} +} + +// Config configures Server +type Config struct { + StaticDir string + DisableCSRF bool + EnableWalletAPI bool + EnableJSON20RPC bool + EnableGUI bool + EnableUnversionedAPI bool + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration +} + +type muxConfig struct { + host string + appLoc string + enableGUI bool + enableJSON20RPC bool + enableUnversionedAPI bool +} + +// HTTPResponse represents the http response struct +type HTTPResponse struct { + Error *HTTPError `json:"error,omitempty"` + Data interface{} `json:"data,omitempty"` +} + +// HTTPError is included in an HTTPResponse +type HTTPError struct { + Message string `json:"message"` + Code int `json:"code"` +} + +// NewHTTPErrorResponse returns an HTTPResponse with the Error field populated +func NewHTTPErrorResponse(code int, msg string) HTTPResponse { + if msg == "" { + msg = http.StatusText(code) + } + + return HTTPResponse{ + Error: &HTTPError{ + Code: code, + Message: msg, + }, + } +} + +func create(host string, c Config, gateway Gatewayer) (*Server, error) { + var appLoc string + if c.EnableGUI { + var err error + appLoc, err = file.DetermineResourcePath(c.StaticDir, resourceDir, devDir) + if err != nil { + return nil, err + } + logger.Infof("Web resources directory: %s", appLoc) + } + + csrfStore := &CSRFStore{ + Enabled: !c.DisableCSRF, + } + if c.DisableCSRF { + logger.Warning("CSRF check disabled") + } + + var rpc *webrpc.WebRPC + if c.EnableJSON20RPC { + logger.Info("JSON 2.0 RPC enabled") + var err error + // TODO: change webprc to use http.Gatewayer + rpc, err = webrpc.New(gateway.(*daemon.Gateway)) + if err != nil { + return nil, err + } + } + + if c.ReadTimeout == 0 { + c.ReadTimeout = defaultReadTimeout + } + if c.WriteTimeout == 0 { + c.WriteTimeout = defaultWriteTimeout + } + if c.IdleTimeout == 0 { + c.IdleTimeout = defaultIdleTimeout + } + + mc := muxConfig{ + host: host, + appLoc: appLoc, + enableGUI: c.EnableGUI, + enableJSON20RPC: c.EnableJSON20RPC, + enableUnversionedAPI: c.EnableUnversionedAPI, + } + + srvMux := newServerMux(mc, gateway, csrfStore, rpc) + srv := &http.Server{ + Handler: srvMux, + ReadTimeout: c.ReadTimeout, + WriteTimeout: c.WriteTimeout, + IdleTimeout: c.IdleTimeout, + } + + return &Server{ + server: srv, + done: make(chan struct{}), + }, nil +} + +// Create creates a new Server instance that listens on HTTP +func Create(host string, c Config, gateway Gatewayer) (*Server, error) { + logger.Warning("HTTPS not in use!") + + listener, err := net.Listen("tcp", host) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + s.listener.Close() + return nil, err + } + + s.listener = listener + + return s, nil +} + +// CreateHTTPS creates a new Server instance that listens on HTTPS +func CreateHTTPS(host string, c Config, gateway Gatewayer, certFile, keyFile string) (*Server, error) { + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + logger.Infof("Using %s for the certificate", certFile) + logger.Infof("Using %s for the key", keyFile) + + listener, err := tls.Listen("tcp", host, &tls.Config{ + Certificates: []tls.Certificate{cert}, + }) + if err != nil { + return nil, err + } + + // If the host did not specify a port, allowing the kernel to assign one, + // we need to get the assigned address to know the full hostname + host = listener.Addr().String() + + s, err := create(host, c, gateway) + if err != nil { + s.listener.Close() + return nil, err + } + + s.listener = listener + + return s, nil +} + +// Addr returns the listening address of the Server +func (s *Server) Addr() string { + return s.listener.Addr().String() +} + +// Serve serves the web interface on the configured host +func (s *Server) Serve() error { + logger.Infof("Starting web interface on %s", s.listener.Addr()) + defer logger.Info("Web interface closed") + defer close(s.done) + + if err := s.server.Serve(s.listener); err != nil { + if err != http.ErrServerClosed { + return err + } + } + return nil +} + +// Shutdown closes the HTTP service. This can only be called after Serve or ServeHTTPS has been called. +func (s *Server) Shutdown() { + if s == nil { + return + } + + logger.Info("Shutting down web interface") + defer logger.Info("Web interface shut down") + s.listener.Close() + <-s.done +} + +// newServerMux creates an http.ServeMux with handlers registered +func newServerMux(c muxConfig, gateway Gatewayer, csrfStore *CSRFStore, rpc *webrpc.WebRPC) *http.ServeMux { + mux := http.NewServeMux() + + headerCheck := func(host string, handler http.Handler) http.Handler { + handler = OriginRefererCheck(host, handler) + handler = wh.HostCheck(logger, host, handler) + return handler + } + + webHandler := func(endpoint string, handler http.Handler) { + handler = wh.ElapsedHandler(logger, handler) + handler = CSRFCheck(csrfStore, handler) + handler = headerCheck(c.host, handler) + handler = gziphandler.GzipHandler(handler) + mux.Handle(endpoint, handler) + } + + webHandlerV1 := func(endpoint string, handler http.Handler) { + if c.enableUnversionedAPI { + webHandler(endpoint, handler) + } + webHandler("/api/v1"+endpoint, handler) + } + + webHandlerV2 := func(endpoint string, handler http.Handler) { + webHandler("/api/v2"+endpoint, handler) + } + + indexHandler := newIndexHandler(c.appLoc, c.enableGUI) + if gateway.IsCSPEnabled() { + indexHandler = wh.CSPHandler(indexHandler) + } + webHandler("/", indexHandler) + + if c.enableGUI { + fileInfos, _ := ioutil.ReadDir(c.appLoc) + + fs := http.FileServer(http.Dir(c.appLoc)) + if gateway.IsCSPEnabled() { + fs = wh.CSPHandler(fs) + } + + for _, fileInfo := range fileInfos { + route := fmt.Sprintf("/%s", fileInfo.Name()) + if fileInfo.IsDir() { + route = route + "/" + } + + webHandler(route, fs) + } + } + + if c.enableJSON20RPC { + webHandlerV1("/webrpc", http.HandlerFunc(rpc.Handler)) + } + + // get the current CSRF token + csrfHandler := headerCheck(c.host, getCSRFToken(csrfStore)) + mux.Handle("/csrf", csrfHandler) + mux.Handle("/api/v1/csrf", csrfHandler) + + webHandlerV1("/version", versionHandler(gateway)) + + // get set of unspent outputs + webHandlerV1("/outputs", getOutputsHandler(gateway)) + + // get balance of addresses + webHandlerV1("/balance", getBalanceHandler(gateway)) + + // Wallet interface + + // Returns wallet info + // Method: GET + // Args: + // id - Wallet ID [required] + webHandlerV1("/wallet", walletGet(gateway)) + + // Loads wallet from seed, will scan ahead N address and + // load addresses till the last one that have coins. + // Method: POST + // Args: + // seed: wallet seed [required] + // label: wallet label [required] + // scan: the number of addresses to scan ahead for balances [optional, must be > 0] + webHandlerV1("/wallet/create", walletCreate(gateway)) + + webHandlerV1("/wallet/newAddress", walletNewAddresses(gateway)) + + // Returns the confirmed and predicted balance for a specific wallet. + // The predicted balance is the confirmed balance minus any pending + // spent amount. + // GET arguments: + // id: Wallet ID + webHandlerV1("/wallet/balance", walletBalanceHandler(gateway)) + + // Sends coins&hours to another address. + // POST arguments: + // id: Wallet ID + // coins: Number of coins to spend + // dst: Destination address + // Returns total amount spent if successful, otherwise error describing + // failure status. + webHandlerV1("/wallet/spend", walletSpendHandler(gateway)) + + // Creates a transaction from a wallet + webHandlerV1("/wallet/transaction", createTransactionHandler(gateway)) + + // GET Arguments: + // id: Wallet ID + // Returns all pending transanction for all addresses by selected Wallet + webHandlerV1("/wallet/transactions", walletTransactionsHandler(gateway)) + + // Update wallet label + // POST Arguments: + // id: wallet id + // label: wallet label + webHandlerV1("/wallet/update", walletUpdateHandler(gateway)) + + // Returns all loaded wallets + // returns sensitive information + webHandlerV1("/wallets", walletsHandler(gateway)) + + // Returns wallets directory path + webHandlerV1("/wallets/folderName", getWalletFolder(gateway)) + + // Generate wallet seed + // GET Arguments: + // entropy: entropy bitsize. + webHandlerV1("/wallet/newSeed", newWalletSeed(gateway)) + + // Gets seed of wallet of given id + // GET Arguments: + // id: wallet id + // password: wallet password + webHandlerV1("/wallet/seed", walletSeedHandler(gateway)) + + // unload wallet + // POST Argument: + // id: wallet id + webHandlerV1("/wallet/unload", walletUnloadHandler(gateway)) + + // Encrypts wallet + // POST arguments: + // id: wallet id + // password: wallet password + // Returns an encrypted wallet json without sensitive data + webHandlerV1("/wallet/encrypt", walletEncryptHandler(gateway)) + + // Decrypts wallet + // POST arguments: + // id: wallet id + // password: wallet password + webHandlerV1("/wallet/decrypt", walletDecryptHandler(gateway)) + + // Blockchain interface + + webHandlerV1("/blockchain/metadata", blockchainHandler(gateway)) + webHandlerV1("/blockchain/progress", blockchainProgressHandler(gateway)) + + // get block by hash or seq + webHandlerV1("/block", getBlock(gateway)) + // get blocks in specific range + webHandlerV1("/blocks", getBlocks(gateway)) + // get last N blocks + webHandlerV1("/last_blocks", getLastBlocks(gateway)) + + // Network stats interface + webHandlerV1("/network/connection", connectionHandler(gateway)) + webHandlerV1("/network/connections", connectionsHandler(gateway)) + webHandlerV1("/network/defaultConnections", defaultConnectionsHandler(gateway)) + webHandlerV1("/network/connections/trust", trustConnectionsHandler(gateway)) + webHandlerV1("/network/connections/exchange", exchgConnectionsHandler(gateway)) + + // Transaction handler + + // get set of pending transactions + webHandlerV1("/pendingTxs", getPendingTxns(gateway)) + // get txn by txid + webHandlerV1("/transaction", getTransactionByID(gateway)) + + // parse and verify transaction + webHandlerV2("/transaction/verify", verifyTxnHandler(gateway)) + + // Health check handler + webHandlerV1("/health", healthCheck(gateway)) + + // Returns transactions that match the filters. + // Method: GET + // Args: + // addrs: Comma seperated addresses [optional, returns all transactions if no address is provided] + // confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] + webHandlerV1("/transactions", getTransactions(gateway)) + // inject a transaction into network + webHandlerV1("/injectTransaction", injectTransaction(gateway)) + webHandlerV1("/resendUnconfirmedTxns", resendUnconfirmedTxns(gateway)) + // get raw tx by txid. + webHandlerV1("/rawtx", getRawTxn(gateway)) + + // UxOut api handler + + // get uxout by id. + webHandlerV1("/uxout", getUxOutByID(gateway)) + // get all the address affected uxouts. + webHandlerV1("/address_uxouts", getAddrUxOuts(gateway)) + + webHandlerV2("/address/verify", http.HandlerFunc(addressVerify)) + + // Explorer handler + + // get set of pending transactions + webHandlerV1("/explorer/address", getTransactionsForAddress(gateway)) + + webHandlerV1("/coinSupply", getCoinSupply(gateway)) + + webHandlerV1("/richlist", getRichlist(gateway)) + + webHandlerV1("/addresscount", getAddressCount(gateway)) + + return mux +} + +// Returns a http.HandlerFunc for index.html, where index.html is in appLoc +func newIndexHandler(appLoc string, enableGUI bool) http.Handler { + // Serves the main page + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !enableGUI { + wh.Error404(w, "") + return + } + + if r.URL.Path != "/" { + wh.Error404(w, "") + return + } + + if r.URL.Path == "/" { + page := filepath.Join(appLoc, indexPage) + logger.Debugf("Serving index page: %s", page) + http.ServeFile(w, r, page) + } + }) +} + +func splitCommaString(s string) []string { + words := strings.FieldsFunc(s, func(r rune) bool { + return r == ',' || unicode.IsSpace(r) + }) + + // Deduplicate + var dedupWords []string + wordsMap := make(map[string]struct{}) + for _, w := range words { + if _, ok := wordsMap[w]; !ok { + dedupWords = append(dedupWords, w) + } + wordsMap[w] = struct{}{} + } + + return dedupWords +} + +// getOutputsHandler returns UxOuts filtered by a set of addresses or a set of hashes +// URI: /api/v1/outputs +// Method: GET +// Args: +// addrs: comma-separated list of addresses +// hashes: comma-separated list of uxout hashes +// If neither addrs nor hashes are specificed, return all unspent outputs. +// If only one filter is specified, then return outputs match the filter. +// Both filters cannot be specified. +func getOutputsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + var addrs []string + var hashes []string + + addrStr := r.FormValue("addrs") + hashStr := r.FormValue("hashes") + + if addrStr != "" && hashStr != "" { + wh.Error400(w, "addrs and hashes cannot be specified together") + return + } + + filters := []daemon.OutputsFilter{} + + if addrStr != "" { + addrs = splitCommaString(addrStr) + + for _, a := range addrs { + if _, err := cipher.DecodeBase58Address(a); err != nil { + wh.Error400(w, "addrs contains invalid address") + return + } + } + + if len(addrs) > 0 { + filters = append(filters, daemon.FbyAddresses(addrs)) + } + } + + if hashStr != "" { + hashes = splitCommaString(hashStr) + if len(hashes) > 0 { + filters = append(filters, daemon.FbyHashes(hashes)) + } + } + + outs, err := gateway.GetUnspentOutputs(filters...) + if err != nil { + err = fmt.Errorf("get unspent outputs failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, outs) + } +} + +func versionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wh.SendJSONOr500(logger, w, gateway.GetBuildInfo()) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/http_test.go b/vendor/github.com/skycoin/skycoin/src/api/http_test.go new file mode 100755 index 0000000..35a0afc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/http_test.go @@ -0,0 +1,446 @@ +package api + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "math" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "sync" + "testing" + + "errors" + + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +func TestGetOutputsHandler(t *testing.T) { + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + invalidAddr := "invalidAddr" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + addrs string + hashStr string + } + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getUnspentOutputsResponse *visor.ReadableOutputSet + getUnspentOutputsError error + httpResponse *visor.ReadableOutputSet + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - addrs and hashes together", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs and hashes cannot be specified together", + httpBody: &httpBody{ + addrs: validAddr, + hashStr: validHash, + }, + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs contains invalid address", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "500 - getUnspentOutputsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - get unspent outputs failed: getUnspentOutputsError", + getUnspentOutputsResponse: nil, + getUnspentOutputsError: errors.New("getUnspentOutputsError"), + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + getUnspentOutputsResponse: &visor.ReadableOutputSet{}, + httpResponse: &visor.ReadableOutputSet{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/outputs" + gateway.On("GetUnspentOutputs", mock.Anything).Return(tc.getUnspentOutputsResponse, tc.getUnspentOutputsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.hashStr != "" { + v.Add("hashes", tc.httpBody.hashStr) + } + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *visor.ReadableOutputSet + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetBalanceHandler(t *testing.T) { + type httpBody struct { + addrs string + } + invalidAddr := "invalidAddr" + validAddr := "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf" + address, err := cipher.DecodeBase58Address(validAddr) + require.NoError(t, err) + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getBalanceOfAddrsArg []cipher.Address + getBalanceOfAddrsResponse []wallet.BalancePair + getBalanceOfAddrsError error + httpResponse wallet.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid address", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address invalidAddr is invalid: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddr, + }, + }, + { + name: "400 - no addresses", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addrs is required", + httpBody: &httpBody{}, + }, + { + name: "500 - GetBalanceOfAddrsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetBalanceOfAddrs failed: GetBalanceOfAddrsError", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsError: errors.New("GetBalanceOfAddrsError"), + }, + { + name: "500 - balance Confirmed coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + }, + { + name: "500 - balance Predicted coins uint64 addition overflow", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - uint64 addition overflow", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: math.MaxInt64 + 1, Hours: 0}, + }, + }, + }, + { + name: "200 - OK", + method: http.MethodGet, + status: http.StatusOK, + err: "200 - OK", + httpBody: &httpBody{ + addrs: validAddr, + }, + getBalanceOfAddrsArg: []cipher.Address{address}, + getBalanceOfAddrsResponse: []wallet.BalancePair{ + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + { + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + httpResponse: wallet.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/balance" + gateway.On("GetBalanceOfAddrs", tc.getBalanceOfAddrsArg).Return(tc.getBalanceOfAddrsResponse, tc.getBalanceOfAddrsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg wallet.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +// TestEnableGUI tests enable gui option, EnableGUI isn't part of Gateway API, +// we can't control the output by mocking the Gateway like other tests. Instead, +// we create a full webserver for each test case. +func TestEnableGUI(t *testing.T) { + tt := []struct { + name string + enableGUI bool + endpoint string + appLoc string + expectCode int + expectBody string + }{ + { + name: "disable gui GET /", + enableGUI: false, + endpoint: "/", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "disable gui GET /invalid-path", + enableGUI: false, + endpoint: "/invalid-path", + appLoc: "", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + { + name: "enable gui GET /", + enableGUI: true, + endpoint: "/", + appLoc: "../gui/static", + expectCode: http.StatusOK, + expectBody: "", + }, + { + name: "enable gui GET /invalid-path", + enableGUI: true, + endpoint: "/invalid-path", + appLoc: "../gui/static", + expectCode: http.StatusNotFound, + expectBody: "404 Not Found\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: tc.appLoc}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + c := Config{ + EnableGUI: tc.enableGUI, + DisableCSRF: true, + StaticDir: tc.appLoc, + } + + host := "127.0.0.1:6423" + s, err := Create(host, c, gateway) + require.NoError(t, err) + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + s.Serve() + }() + + defer func() { + s.listener.Close() + wg.Wait() + }() + + url := fmt.Sprintf("http://%s/%s", host, tc.endpoint) + rsp, err := http.Get(url) + require.NoError(t, err) + + defer rsp.Body.Close() + require.Equal(t, tc.expectCode, rsp.StatusCode) + + body, err := ioutil.ReadAll(rr.Body) + require.NoError(t, err) + + if rsp.StatusCode != http.StatusOK { + require.Equal(t, tc.expectBody, string(body)) + } + }) + } +} + +func TestContentSecurityPolicy(t *testing.T) { + tt := []struct { + name string + endpoint string + enableCSP bool + appLoc string + expectCSPHeader string + }{ + { + name: "enable CSP GET /", + endpoint: "/", + enableCSP: true, + appLoc: "../gui/static/dist", + expectCSPHeader: "script-src 'self' 127.0.0.1", + }, + { + name: "disable CSP GET /", + endpoint: "/", + enableCSP: false, + appLoc: "../gui/static/dist", + expectCSPHeader: "", + }, + { + // Confirms that the /csrf api won't be affected by the csp setting + name: "enable CSP GET /csrf", + endpoint: "/api/v1/csrf", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + }, + { + // Confirms that the /version api won't be affected by the csp setting + name: "enable CSP GET /version", + endpoint: "/api/v1/version", + enableCSP: true, + appLoc: "", + expectCSPHeader: "", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + req, err := http.NewRequest(http.MethodGet, tc.endpoint, nil) + require.NoError(t, err) + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(tc.enableCSP) + gateway.On("GetBuildInfo").Return(visor.BuildInfo{}) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: tc.appLoc, enableGUI: true}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + csp := rr.Header().Get("Content-Security-Policy") + require.Equal(t, tc.expectCSPHeader, csp) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/empty.go b/vendor/github.com/skycoin/skycoin/src/api/integration/empty.go new file mode 100755 index 0000000..76ab1b7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/empty.go @@ -0,0 +1 @@ +package integration diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/integration_test.go b/vendor/github.com/skycoin/skycoin/src/api/integration/integration_test.go new file mode 100755 index 0000000..4464146 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/integration_test.go @@ -0,0 +1,4019 @@ +// package integration_test implements API integration tests +package integration_test + +import ( + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "io/ioutil" + "math" + "math/rand" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "sort" + "strconv" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" //http,json helpers + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +/* Runs HTTP API tests against a running skycoin node + +Set envvar SKYCOIN_INTEGRATION_TESTS=1 to enable them +Set SKYCOIN_NODE_HOST to the node's address (defaults to http://127.0.0.1:6420) +Set SKYCOIN_INTEGRATION_TEST_MODE to either "stable" or "live" (defaults to "stable") + +Each test has two modes: + 1. against a stable, pinned blockchain + 2. against a live, active blockchain + +When running mode 1, API responses do not change. The exact responses are compared to saved responses on disk. +Make sure the skycoin node is running against the pinned blockchain data provided in this package's folder. + +When running mode 2, API responses may change (such as /coinSupply). The exact responses are not compared, +but the response is checked to be unmarshallable to a known JSON object. + +When update flag is set to true all tests pass +*/ + +const ( + testModeStable = "stable" + testModeLive = "live" + testModeDisableWalletAPI = "disable-wallet-api" + testModeEnableSeedAPI = "enable-seed-api" + testModeDisableGUI = "disable-gui" + + testFixturesDir = "testdata" +) + +type TestData struct { + actual interface{} + expected interface{} +} + +var update = flag.Bool("update", false, "update golden files") +var testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + +func nodeAddress() string { + addr := os.Getenv("SKYCOIN_NODE_HOST") + if addr == "" { + return "http://127.0.0.1:6420" + } + return addr +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, + testModeStable, + testModeDisableWalletAPI, + testModeEnableSeedAPI, + testModeDisableGUI: + default: + t.Fatal("Invalid test mode, must be stable, live or disable-wallet-api") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doDisableWalletAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableWalletAPI { + return true + } + + t.Skip("DisableWalletApi tests disabled") + return false +} + +func doEnableSeedAPI(t *testing.T) bool { + if enabled() && mode(t) == testModeEnableSeedAPI { + return true + } + + t.Skip("EnableSeedAPI tests disabled") + return false +} + +func doDisableGUI(t *testing.T) bool { + if enabled() && mode(t) == testModeDisableGUI { + return true + } + + t.Skip("DisableGUIAPI tests disabled") + return false +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + d := json.NewDecoder(f) + d.DisallowUnknownFields() + + err = d.Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + require.Equal(t, string(c), string(b)+"\n", "json struct output differs from golden file, was a field added to the struct?") +} + +func assertResponseError(t *testing.T, err error, errCode int, errMsg string) { + require.Error(t, err) + require.IsType(t, api.ClientError{}, err) + require.Equal(t, errCode, err.(api.ClientError).StatusCode) + require.Equal(t, errMsg, err.(api.ClientError).Message) +} + +func TestStableCoinSupply(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cs, err := c.CoinSupply() + require.NoError(t, err) + + var expected api.CoinSupply + checkGoldenFile(t, "coinsupply.golden", TestData{*cs, &expected}) +} + +func TestLiveCoinSupply(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cs, err := c.CoinSupply() + require.NoError(t, err) + + require.NotEmpty(t, cs.CurrentSupply) + require.NotEmpty(t, cs.TotalSupply) + require.NotEmpty(t, cs.MaxSupply) + require.Equal(t, "100000000.000000", cs.MaxSupply) + require.NotEmpty(t, cs.CurrentCoinHourSupply) + require.NotEmpty(t, cs.TotalCoinHourSupply) + require.Equal(t, 100, len(cs.UnlockedAddresses)+len(cs.LockedAddresses)) +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + v, err := c.Version() + require.NoError(t, err) + + require.NotEmpty(t, v.Version) +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addr string + errCode int + errMsg string + }{ + { + name: "valid address", + golden: "verify-address.golden", + addr: "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + }, + + { + name: "invalid address", + addr: "7apQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + errCode: http.StatusUnprocessableEntity, + errMsg: "Invalid checksum", + }, + + { + name: "missing address", + addr: "", + errCode: http.StatusBadRequest, + errMsg: "address is required", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + resp, err := c.VerifyAddress(tc.addr) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected api.VerifyAddressResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } +} + +func TestStableVerifyTransaction(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + badSigStr := "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + badSigBytes, err := hex.DecodeString(badSigStr) + require.NoError(t, err) + badSig := cipher.NewSig(badSigBytes) + + inputHash := "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e" + input := testutil.SHA256FromHex(t, inputHash) + + destAddrStr := "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD" + destAddr, err := cipher.DecodeBase58Address(destAddrStr) + require.NoError(t, err) + + inputAddrStr := "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5" + inputAddr, err := cipher.DecodeBase58Address(inputAddrStr) + require.NoError(t, err) + + badSignatureTxn := coin.Transaction{ + Sigs: []cipher.Sig{badSig}, + In: []cipher.SHA256{input}, + Out: []coin.TransactionOutput{ + { + Address: destAddr, + Coins: 1e3, + Hours: 10, + }, + { + Address: inputAddr, + Coins: 22100e6 - 1e3, + Hours: 188761, + }, + }, + } + badSignatureTxn.UpdateHeader() + + cases := []struct { + name string + golden string + txn coin.Transaction + errCode int + errMsg string + }{ + { + name: "invalid transaction empty", + txn: coin.Transaction{}, + golden: "verify-transaction-invalid-empty.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates soft constraint: Transaction has zero coinhour fee", + }, + + { + name: "invalid transaction bad signature", + txn: badSignatureTxn, + golden: "verify-transaction-invalid-bad-sig.golden", + errCode: http.StatusUnprocessableEntity, + errMsg: "Transaction violates hard constraint: Signature invalid for hash", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + encodedTxn := hex.EncodeToString(tc.txn.Serialize()) + + resp, err := c.VerifyTransaction(encodedTxn) + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + if tc.errCode != http.StatusUnprocessableEntity { + return + } + } + + if tc.errCode != http.StatusUnprocessableEntity { + require.NoError(t, err) + } + + var expected api.VerifyTxnResponse + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + }) + } + +} + +func TestStableOutputs(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addrs []string + hashes []string + errCode int + errMsg string + }{ + { + name: "no addrs or hashes", + golden: "outputs-noargs.golden", + }, + { + name: "only addrs", + addrs: []string{ + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + }, + golden: "outputs-addrs.golden", + }, + { + name: "only hashes", + hashes: []string{ + "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + golden: "outputs-hashes.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, tc.addrs != nil && tc.hashes != nil) + + var outputs *visor.ReadableOutputSet + var err error + switch { + case tc.addrs == nil && tc.hashes == nil: + outputs, err = c.Outputs() + case tc.addrs != nil: + outputs, err = c.OutputsForAddresses(tc.addrs) + case tc.hashes != nil: + outputs, err = c.OutputsForHashes(tc.hashes) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected visor.ReadableOutputSet + checkGoldenFile(t, tc.golden, TestData{*outputs, &expected}) + + require.Equal(t, len(expected.HeadOutputs), len(outputs.HeadOutputs)) + require.Equal(t, len(expected.OutgoingOutputs), len(outputs.OutgoingOutputs)) + require.Equal(t, len(expected.IncomingOutputs), len(outputs.IncomingOutputs)) + + for i, o := range expected.HeadOutputs { + require.Equal(t, o, outputs.HeadOutputs[i], "mismatch at index %d", i) + } + }) + } +} + +func TestLiveOutputs(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Request all outputs and check that HeadOutputs is not empty + // OutgoingOutputs and IncomingOutputs are variable and could be empty + outputs, err := c.Outputs() + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForAddresses(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) + + outputs, err = c.OutputsForHashes(nil) + require.NoError(t, err) + require.NotEmpty(t, outputs.HeadOutputs) +} + +func TestStableBlock(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) +} + +func TestLiveBlock(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []uint64{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + c := api.NewClient(nodeAddress()) + for _, seq := range blockSeqs { + b, err := c.BlockBySeq(seq) + require.NoError(t, err) + require.Equal(t, seq, b.Head.BkSeq) + } +} + +func testKnownBlocks(t *testing.T) { + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + hash string + seq uint64 + errCode int + errMsg string + }{ + { + name: "unknown hash", + hash: "80744ec25e6233f40074d35bf0bfdbddfac777869b954a96833cb89f44204444", + errCode: http.StatusNotFound, + errMsg: "404 Not Found\n", + }, + { + name: "valid hash", + golden: "block-hash.golden", + hash: "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + }, + { + name: "genesis hash", + golden: "block-hash-genesis.golden", + hash: "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + }, + { + name: "genesis seq", + golden: "block-seq-0.golden", + seq: 0, + }, + { + name: "seq 100", + golden: "block-seq-100.golden", + seq: 100, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var b *visor.ReadableBlock + var err error + + if tc.hash != "" { + b, err = c.BlockByHash(tc.hash) + } else { + b, err = c.BlockBySeq(tc.seq) + } + + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NotNil(t, b) + + var expected visor.ReadableBlock + checkGoldenFile(t, tc.golden, TestData{*b, &expected}) + }) + } + + t.Logf("Querying every block in the blockchain") + + // Scan every block by seq + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var prevBlock *visor.ReadableBlock + for i := uint64(0); i < progress.Current; i++ { + t.Run(fmt.Sprintf("block-seq-%d", i), func(t *testing.T) { + b, err := c.BlockBySeq(i) + require.NoError(t, err) + require.NotNil(t, b) + require.Equal(t, i, b.Head.BkSeq) + + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, bHash) + + prevBlock = b + }) + } +} + +func TestStableBlockchainMetadata(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + var expected visor.BlockchainMetadata + checkGoldenFile(t, "blockchain-metadata.golden", TestData{*metadata, &expected}) +} + +func TestLiveBlockchainMetadata(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + metadata, err := c.BlockchainMetadata() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), metadata.Head.BkSeq) +} + +func TestStableBlockchainProgress(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + var expected daemon.BlockchainProgress + checkGoldenFile(t, "blockchain-progress.golden", TestData{*progress, &expected}) +} + +func TestLiveBlockchainProgress(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + require.NotEqual(t, uint64(0), progress.Current) + require.True(t, progress.Current <= progress.Highest) + require.NotEmpty(t, progress.Peers) +} + +func TestStableBalance(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + addrs []string + }{ + { + name: "unknown address", + addrs: []string{"prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9"}, + golden: "balance-noaddrs.golden", + }, + { + name: "one address", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "duplicate addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf"}, + golden: "balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden", + }, + { + name: "two addresses", + addrs: []string{"2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5"}, + golden: "balance-two-addrs.golden", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + balance, err := c.Balance(tc.addrs) + require.NoError(t, err) + + var expected wallet.BalancePair + checkGoldenFile(t, tc.golden, TestData{*balance, &expected}) + }) + } +} + +func TestLiveBalance(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Genesis address check, should not have a balance + b, err := c.Balance([]string{"2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6"}) + require.NoError(t, err) + require.Equal(t, wallet.BalancePair{}, *b) + + // Balance of final distribution address. Should have the same coins balance + // for the next 15-20 years. + b, err = c.Balance([]string{"ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}) + require.NoError(t, err) + require.Equal(t, b.Confirmed, b.Predicted) + require.NotEmpty(t, b.Confirmed.Hours) + require.Equal(t, uint64(1e6*1e6), b.Confirmed.Coins) + + // Check that the balance is queryable for addresses known to be affected + // by the coinhour overflow problem + addrs := []string{ + "n7AR1VMW1pK7F9TxhYdnr3HoXEQ3g9iTNP", + "2aTzmXi9jyiq45oTRFCP9Y7dcvnT6Rsp7u", + "FjFLnus2ePxuaPTXFXfpw6cVAE5owT1t3P", + "KT9vosieyWhn9yWdY8w7UZ6tk31KH4NAQK", + } + for _, a := range addrs { + _, err := c.Balance([]string{a}) + require.NoError(t, err, "Failed to get balance of address %s", a) + } + _, err = c.Balance(addrs) + require.NoError(t, err) +} + +func TestStableUxOut(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + golden string + uxID string + }{ + { + name: "valid uxID", + golden: "uxout.golden", + uxID: "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.UxOut(tc.uxID) + require.NoError(t, err) + + var expected historydb.UxOutJSON + checkGoldenFile(t, tc.golden, TestData{*ux, &expected}) + }) + } + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func TestLiveUxOut(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // A spent uxout should never change + ux, err := c.UxOut("fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20") + require.NoError(t, err) + + var expected historydb.UxOutJSON + checkGoldenFile(t, "uxout-spent.golden", TestData{*ux, &expected}) + require.NotEqual(t, uint64(0), ux.SpentBlockSeq) + + // Scan all uxouts from the result of /outputs + scanUxOuts(t) +} + +func scanUxOuts(t *testing.T) { + c := api.NewClient(nodeAddress()) + + outputs, err := c.Outputs() + require.NoError(t, err) + + for _, ux := range outputs.HeadOutputs { + t.Run(ux.Hash, func(t *testing.T) { + foundUx, err := c.UxOut(ux.Hash) + require.NoError(t, err) + + require.Equal(t, ux.Hash, foundUx.Uxid) + require.Equal(t, ux.Time, foundUx.Time) + require.Equal(t, ux.BkSeq, foundUx.SrcBkSeq) + require.Equal(t, ux.SourceTransaction, foundUx.SrcTx) + require.Equal(t, ux.Address, foundUx.OwnerAddress) + require.Equal(t, ux.Hours, foundUx.Hours) + coinsStr, err := droplet.ToString(foundUx.Coins) + require.NoError(t, err) + require.Equal(t, ux.Coins, coinsStr) + + if foundUx.SpentBlockSeq == 0 { + require.Equal(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) + } else { + require.NotEqual(t, "0000000000000000000000000000000000000000000000000000000000000000", foundUx.SpentTxID) + } + }) + } +} + +func TestStableAddressUxOuts(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + errCode int + errMsg string + golden string + addr string + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty\n", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + golden: "uxout-noaddr.golden", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + golden: "uxout-addr.golden", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + var expected []*historydb.UxOutJSON + checkGoldenFile(t, tc.golden, TestData{ux, &expected}) + }) + } +} + +func TestLiveAddressUxOuts(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + cases := []struct { + name string + errCode int + errMsg string + addr string + moreThanZero bool + }{ + { + name: "no addresses", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - address is empty\n", + }, + { + name: "invalid address length", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid address length\n", + addr: "prRXwTcDK24hs6AFxj", + }, + { + name: "unknown address", + addr: "prRXwTcDK24hs6AFxj69UuWae3LzhrsPW9", + }, + { + name: "one address", + addr: "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + ux, err := c.AddressUxOuts(tc.addr) + if tc.errCode != 0 && tc.errCode != http.StatusOK { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + require.NoError(t, err) + if tc.moreThanZero { + require.NotEqual(t, 0, len(ux)) + } + }) + } +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + progress, err := c.BlockchainProgress() + require.NoError(t, err) + + lastNBlocks := 10 + require.True(t, int(progress.Current) > lastNBlocks+1) + + cases := []struct { + name string + golden string + start int + end int + errCode int + errMsg string + }{ + { + name: "first 10", + golden: "blocks-first-10.golden", + start: 1, + end: 10, + }, + { + name: "last 10", + golden: "blocks-last-10.golden", + start: int(progress.Current) - lastNBlocks, + end: int(progress.Current), + }, + { + name: "first block", + golden: "blocks-first-1.golden", + start: 1, + end: 1, + }, + { + name: "all blocks", + golden: "blocks-all.golden", + start: 0, + end: int(progress.Current), + }, + { + name: "start > end", + golden: "blocks-end-less-than-start.golden", + start: 10, + end: 9, + }, + { + name: "start negative", + start: -10, + end: 9, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid start value \"-10\"\n", + }, + { + name: "end negative", + start: 10, + end: -9, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - Invalid end value \"-9\"\n", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.errMsg == "" { + resp := testBlocks(t, tc.start, tc.end) + + var expected visor.ReadableBlocks + checkGoldenFile(t, tc.golden, TestData{*resp, &expected}) + } else { + _, err := c.Blocks(tc.start, tc.end) + assertResponseError(t, err, tc.errCode, tc.errMsg) + } + }) + } +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testBlocks(t, 1, 10) +} + +func testBlocks(t *testing.T, start, end int) *visor.ReadableBlocks { + c := api.NewClient(nodeAddress()) + + blocks, err := c.Blocks(start, end) + require.NoError(t, err) + + if start > end { + require.Empty(t, blocks.Blocks) + } else { + require.Len(t, blocks.Blocks, end-start+1) + } + + var prevBlock *visor.ReadableBlock + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.Equal(t, uint64(idx+start), b.Head.BkSeq) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + + return blocks +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + blocks, err := c.LastBlocks(1) + require.NoError(t, err) + + var expected *visor.ReadableBlocks + checkGoldenFile(t, "block-last.golden", TestData{blocks, &expected}) + + var prevBlock *visor.ReadableBlock + blocks, err = c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } + +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + var prevBlock *visor.ReadableBlock + blocks, err := c.LastBlocks(10) + require.NoError(t, err) + require.Equal(t, 10, len(blocks.Blocks)) + for idx, b := range blocks.Blocks { + if prevBlock != nil { + require.Equal(t, prevBlock.Head.BlockHash, b.Head.PreviousBlockHash) + } + + bHash, err := c.BlockByHash(b.Head.BlockHash) + require.NoError(t, err) + require.NotNil(t, bHash) + require.Equal(t, b, *bHash) + + prevBlock = &blocks.Blocks[idx] + } +} + +func TestStableNetworkConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkConnections() + require.NoError(t, err) + require.Empty(t, connections.Connections) + + connection, err := c.NetworkConnection("127.0.0.1:4444") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") + require.Nil(t, connection) +} + +func TestLiveNetworkConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkConnections() + require.NoError(t, err) + require.NotEmpty(t, connections.Connections) + + for _, cc := range connections.Connections { + connection, err := c.NetworkConnection(cc.Addr) + require.NoError(t, err) + require.NotEmpty(t, cc.Addr) + require.Equal(t, cc.Addr, connection.Addr) + require.Equal(t, cc.ID, connection.ID) + require.Equal(t, cc.ListenPort, connection.ListenPort) + require.Equal(t, cc.Mirror, connection.Mirror) + require.Equal(t, cc.Introduced, connection.Introduced) + require.Equal(t, cc.Outgoing, connection.Outgoing) + require.True(t, cc.LastReceived <= connection.LastReceived) + require.True(t, cc.LastSent <= connection.LastSent) + require.True(t, cc.Height >= 0) + } +} + +func TestNetworkDefaultConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkDefaultConnections() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-default-connections.golden", TestData{connections, &expected}) +} + +func TestNetworkTrustedConnections(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkTrustedConnections() + require.NoError(t, err) + require.NotEmpty(t, connections) + sort.Strings(connections) + + var expected []string + checkGoldenFile(t, "network-trusted-connections.golden", TestData{connections, &expected}) +} + +func TestStableNetworkExchangeableConnections(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + connections, err := c.NetworkExchangeableConnections() + require.NoError(t, err) + + var expected []string + checkGoldenFile(t, "network-exchangeable-connections.golden", TestData{connections, &expected}) +} + +func TestLiveNetworkExchangeableConnections(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + _, err := c.NetworkExchangeableConnections() + require.NoError(t, err) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + goldenFile string + }{ + { + name: "invalid txID", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "empty txID", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txID is empty\n", + }, + }, + { + name: "OK", + txID: "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + goldenFile: "./transaction.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + var expected *visor.ReadableTransaction + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, expected, &tx.Transaction) + }) + } +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + goldenFile string + }{ + { + name: "invalid txId", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + goldenFile: "", + }, + { + name: "not exist", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found\n", + }, + goldenFile: "", + }, + { + name: "empty txId", + txID: "", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txid is empty\n", + }, + goldenFile: "", + }, + { + name: "genesis transaction", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + goldenFile: "genesis-transaction.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + tx, err := c.Transaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err) + return + } + + var expected *visor.ReadableTransaction + loadGoldenFile(t, tc.goldenFile, TestData{tx, &expected}) + require.Equal(t, expected, &tx.Transaction) + }) + } +} + +func TestLiveTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + addrs := []string{ + "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + } + txns, err := c.Transactions(addrs) + require.NoError(t, err) + require.True(t, len(*txns) > 0) +} + +func TestStableTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - txId is empty\n", + }, + goldenFile: "./empty-addrs.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "./single-addr.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.Transactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestLiveConfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + + ctxsSingle, err := c.ConfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(*ctxsSingle) > 0) + + ctxsAll, err := c.ConfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(*ctxsAll) > 0) + require.True(t, len(*ctxsAll) > len(*ctxsSingle)) +} + +func TestStableConfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "./empty-addrs.golden", + }, + { + name: "single addr", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "./single-addr.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.ConfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestStableUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + cases := []struct { + name string + addrs []string + err api.ClientError + goldenFile string + }{ + { + name: "invalid addr length", + addrs: []string{"abcd"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid address length\n", + }, + }, + { + name: "invalid addr character", + addrs: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character\n", + }, + }, + { + name: "invalid checksum", + addrs: []string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKk"}, + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - parse parameter: 'addrs' failed: Invalid checksum\n", + }, + }, + { + name: "empty addrs", + addrs: []string{}, + goldenFile: "./empty-addrs-unconfirmed-txs.golden", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.UnconfirmedTransactions(tc.addrs) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + + var expected *[]daemon.TransactionResult + checkGoldenFile(t, tc.goldenFile, TestData{txResult, &expected}) + }) + } +} + +func TestLiveUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + + cTxsSingle, err := c.UnconfirmedTransactions([]string{"2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}) + require.NoError(t, err) + require.True(t, len(*cTxsSingle) >= 0) + + cTxsAll, err := c.UnconfirmedTransactions([]string{}) + require.NoError(t, err) + require.True(t, len(*cTxsAll) >= 0) + require.True(t, len(*cTxsAll) >= len(*cTxsSingle)) +} + +func TestStableResendUnconfirmedTransactions(t *testing.T) { + if !doStable(t) { + return + } + c := api.NewClient(nodeAddress()) + res, err := c.ResendUnconfirmedTransactions() + require.NoError(t, err) + require.True(t, len(res.Txids) == 0) +} + +func TestLiveResendUnconfirmedTransactions(t *testing.T) { + if !doLive(t) { + return + } + c := api.NewClient(nodeAddress()) + _, err := c.ResendUnconfirmedTransactions() + require.NoError(t, err) +} + +func TestStableRawTransaction(t *testing.T) { + if !doStable(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + rawTx string + }{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "not found", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + err: api.ClientError{ + Status: "404 Not Found", + StatusCode: http.StatusNotFound, + Message: "404 Not Found\n", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string\n", + }, + }, + { + name: "OK", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) + }) + } +} + +func TestLiveRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + cases := []struct { + name string + txID string + err api.ClientError + rawTx string + }{ + { + name: "invalid hex length", + txID: "abcd", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - Invalid hex length\n", + }, + }, + { + name: "odd length hex string", + txID: "abcdeffedca", + err: api.ClientError{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Message: "400 Bad Request - encoding/hex: odd length hex string\n", + }, + }, + { + name: "OK - genesis tx", + txID: "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + rawTx: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000f8f9c644772dc5373d85e11094e438df707a42c900407a10f35a000000407a10f35a0000", + }, + { + name: "OK", + txID: "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + rawTx: "dc00000000f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124010000003981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f320001000000fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f2002000000003be2537f8c0893fddcddc878518f38ea493d949e008988068d0000002739570000000000009037ff169fbec6db95e2537e4ff79396c050aeeb00e40b54020000002739570000000000", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txResult, err := c.RawTransaction(tc.txID) + if err != nil { + require.Equal(t, tc.err, err, "case: "+tc.name) + return + } + require.Equal(t, tc.rawTx, txResult, "case: "+tc.name) + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + cases := []struct { + name string + entropy int + numWords int + errCode int + errMsg string + }{ + { + name: "entropy 128", + entropy: 128, + numWords: 12, + }, + { + name: "entropy 256", + entropy: 256, + numWords: 24, + }, + { + name: "entropy 100", + entropy: 100, + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - entropy length must be 128 or 256\n", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + seed, err := c.NewSeed(tc.entropy) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + words := strings.Split(seed, " ") + require.Len(t, words, tc.numWords) + + // no extra whitespace on the seed + require.Equal(t, seed, strings.TrimSpace(seed)) + + // should generate a different seed each time + seed2, err := c.NewSeed(tc.entropy) + require.NoError(t, err) + require.NotEqual(t, seed, seed2) + }) + } +} + +type addressTransactionsTestCase struct { + name string + address string + golden string + errCode int + errMsg string +} + +func TestStableAddressTransactions(t *testing.T) { + if !doStable(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + address: "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + golden: "address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden", + }, + { + name: "address without transactions", + address: "2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9", + golden: "address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - invalid address\n", + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.AddressTransactions(tc.address) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []daemon.ReadableTransaction + checkGoldenFile(t, tc.golden, TestData{txns, &expected}) + }) + } +} + +func TestLiveAddressTransactions(t *testing.T) { + if !doLive(t) { + return + } + + cases := []addressTransactionsTestCase{ + { + name: "address with transactions", + // This is the first distribution address which has spent all of its coins + // It's transactions list should not change, unless someone sends coins to it + address: "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + golden: "address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden", + }, + { + name: "address without transactions", + // This is a randomly generated address, never used + // It should never see new transactions + // (if it ever does, somebody managed to generate this address for use and there is a serious bug) + address: "2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D", + golden: "address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden", + }, + { + name: "invalid address", + address: "prRXwTcDK24hs6AFxj", + errCode: http.StatusBadRequest, + errMsg: "400 Bad Request - invalid address\n", + }, + } + + c := api.NewClient(nodeAddress()) + // Get current blockchain height + bp, err := c.BlockchainProgress() + require.NoError(t, err) + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns, err := c.AddressTransactions(tc.address) + if tc.errMsg != "" { + assertResponseError(t, err, tc.errCode, tc.errMsg) + return + } + + require.NoError(t, err) + + var expected []daemon.ReadableTransaction + loadGoldenFile(t, tc.golden, TestData{txns, &expected}) + + // Recaculate the height if it's live test + for i := range expected { + expected[i].Status.Height = bp.Current - expected[i].Status.BlockSeq + 1 + } + + require.Equal(t, expected, txns) + }) + } +} + +func TestStableRichlist(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + var expected api.Richlist + checkGoldenFile(t, "richlist-default.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 0, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-all-include-distribution.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 8, + IncludeDistribution: false, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-8.golden", TestData{*richlist, &expected}) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + expected = api.Richlist{} + checkGoldenFile(t, "richlist-150-include-distribution.golden", TestData{*richlist, &expected}) +} + +func TestLiveRichlist(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + richlist, err := c.Richlist(nil) + require.NoError(t, err) + + require.NotEmpty(t, richlist.Richlist) + require.Len(t, richlist.Richlist, 20) + + richlist, err = c.Richlist(&api.RichlistParams{ + N: 150, + IncludeDistribution: true, + }) + require.NoError(t, err) + + require.Len(t, richlist.Richlist, 150) +} + +func TestStableAddressCount(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + count, err := c.AddressCount() + require.NoError(t, err) + + require.Equal(t, uint64(155), count) +} + +func TestLiveAddressCount(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + count, err := c.AddressCount() + require.NoError(t, err) + + // 5296 addresses as of 2018-03-06, the count could decrease but is unlikely to + require.True(t, count > 5000) +} + +func TestStablePendingTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + txns, err := c.PendingTransactions() + require.NoError(t, err) + require.Empty(t, txns) +} + +func TestLivePendingTransactions(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + _, err := c.PendingTransactions() + require.NoError(t, err) +} + +func TestLiveWalletSpend(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + w, totalCoins, _, password := prepareAndCheckWallet(t, c, 2e6, 2) + + tt := []struct { + name string + to string + coins uint64 + errMsg []byte + checkTx func(t *testing.T, tx *daemon.TransactionResult) + }{ + { + name: "send all coins to the first address", + to: w.Entries[0].Address.String(), + coins: totalCoins, + checkTx: func(t *testing.T, tx *daemon.TransactionResult) { + // Confirms the total output coins are equal to the totalCoins + var coins uint64 + for _, o := range tx.Transaction.Out { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + coins, err = coin.AddUint64(coins, c) + require.NoError(t, err) + } + + // Confirms the address balance are equal to the totalCoins + coins, _ = getAddressBalance(t, c, w.Entries[0].Address.String()) + require.Equal(t, totalCoins, coins) + }, + }, + { + // send 0.003 coin to the second address, + // this amount is chosen to not interfere with TestLiveWalletCreateTransaction + name: "send 0.003 coin to second address", + to: w.Entries[1].Address.String(), + coins: 3e3, + checkTx: func(t *testing.T, tx *daemon.TransactionResult) { + // Confirms there're two outputs, one to the second address, one as change output to the first address. + require.Len(t, tx.Transaction.Out, 2) + + // Gets the output of the second address in the transaction + getAddrOutputInTx := func(t *testing.T, tx *daemon.TransactionResult, addr string) *visor.ReadableTransactionOutput { + for _, output := range tx.Transaction.Out { + if output.Address == addr { + return &output + } + } + t.Fatalf("transaction doesn't have output to address: %v", addr) + return nil + } + + out := getAddrOutputInTx(t, tx, w.Entries[1].Address.String()) + + // Confirms the second address has 0.003 coin + require.Equal(t, out.Coins, "0.003000") + require.Equal(t, out.Address, w.Entries[1].Address.String()) + + coin, err := droplet.FromString(out.Coins) + require.NoError(t, err) + + // Gets the expected change coins + expectChangeCoins := totalCoins - coin + + // Gets the real change coins + changeOut := getAddrOutputInTx(t, tx, w.Entries[0].Address.String()) + changeCoins, err := droplet.FromString(changeOut.Coins) + require.NoError(t, err) + // Confirms the change coins are matched. + require.Equal(t, expectChangeCoins, changeCoins) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + result, err := c.Spend(w.Filename(), tc.to, tc.coins, password) + if err != nil { + t.Fatalf("spend failed: %v", err) + } + + tk := time.NewTicker(time.Second) + var tx *daemon.TransactionResult + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Waiting for transaction to be confirmed timeout") + case <-tk.C: + tx = getTransaction(t, c, result.Transaction.Hash) + if tx.Status.Confirmed { + break loop + } + } + } + tc.checkTx(t, tx) + }) + } + + // Return if wallet is encrypted, cause the rest of the tests will spend a lot of time. + if w.IsEncrypted() { + return + } + + // Confirms sending coins less than 0.001 is not allowed + errMsg := "500 Internal Server Error - Transaction violates soft constraint: invalid amount, too many decimal places\n" + for i := uint64(1); i < uint64(1000); i++ { + cs, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send invalid coin %v", cs) + t.Run(name, func(t *testing.T) { + result, err := c.Spend(w.Filename(), w.Entries[0].Address.String(), i, password) + if w.IsEncrypted() && len(password) == 0 { + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + return + } + assertResponseError(t, err, http.StatusInternalServerError, errMsg) + require.Nil(t, result) + }) + } +} + +func TestLiveWalletCreateTransactionSpecific(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + remainingHours := fee.RemainingHours(totalHours) + require.True(t, remainingHours > 1) + + addresses := make([]string, len(w.Entries)) + addressMap := make(map[string]struct{}, len(w.Entries)) + for i, e := range w.Entries { + addresses[i] = e.Address.String() + addressMap[e.Address.String()] = struct{}{} + } + + // Get all outputs + outputs, err := c.Outputs() + require.NoError(t, err) + + // Split outputs into those held by the wallet and those not + var walletOutputHashes []string + var walletOutputs visor.ReadableOutputs + walletAuxs := make(map[string][]string) + var nonWalletOutputs visor.ReadableOutputs + for _, o := range outputs.HeadOutputs { + if _, ok := addressMap[o.Address]; ok { + walletOutputs = append(walletOutputs, o) + walletOutputHashes = append(walletOutputHashes, o.Hash) + walletAuxs[o.Address] = append(walletAuxs[o.Address], o.Hash) + } else { + nonWalletOutputs = append(nonWalletOutputs, o) + } + } + + require.NotEmpty(t, walletOutputs) + require.NotEmpty(t, nonWalletOutputs) + + unknownOutput := testutil.RandSHA256(t) + + toDropletString := func(i uint64) string { + x, err := droplet.ToString(i) + require.NoError(t, err) + return x + } + + defaultChangeAddress := w.Entries[0].Address.String() + + type testCase struct { + name string + req api.CreateTransactionRequest + outputs []coin.TransactionOutput + outputsSubset []coin.TransactionOutput + err string + code int + ignoreHours bool + additionalRespVerify func(t *testing.T, r *api.CreateTransactionResponse) + } + + cases := []testCase{ + { + name: "invalid decimals", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "0.0001", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - to[0].coins has too many decimal places\n", + code: http.StatusBadRequest, + }, + + { + name: "overflowing hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: "1", + }, + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64)), + }, + { + Address: w.Entries[0].Address.String(), + Coins: "0.001", + Hours: fmt.Sprint(uint64(math.MaxUint64) - 1), + }, + }, + }, + err: "400 Bad Request - total output hours error: uint64 addition overflow\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient coins", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: fmt.Sprint(totalCoins + 1), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - balance is not sufficient\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient hours", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: toDropletString(totalCoins), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "400 Bad Request - hours are not sufficient\n", + code: http.StatusBadRequest, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + // NOTE: this test will fail if "totalCoins - 1e3" does not require + // all of the outputs to be spent, e.g. if there is an output with + // "totalCoins - 1e3" coins in it. + // TODO -- Check that the wallet does not have an output of 0.001, + // because then this test cannot be performed, since there is no + // way to use all outputs and produce change in that case. + name: "valid request, manual one output with change, spend all, unspecified change address", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + // Address omitted -- will be check later in the test body + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + + { + name: "valid request, manual one output with change, don't spend all", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + Hours: "1", + }, + }, + }, + outputsSubset: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: 1e3, + Hours: 1, + }, + // NOTE: change omitted, + // change is too difficult to predict in this case, we are + // just checking that not all uxouts get spent in the transaction + }, + }, + + { + name: "valid request, manual one output no change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + // NOTE: no reliable way to test the ignore unconfirmed behavior, + // this test only checks that if IgnoreUnconfirmed is specified, + // the API doesn't throw up some parsing error + name: "valid request, manual one output no change, ignore unconfirmed", + req: api.CreateTransactionRequest{ + IgnoreUnconfirmed: true, + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: 1, + }, + }, + }, + + { + name: "valid request, auto one output no change, share factor recalculates to 1.0", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins, + Hours: remainingHours, + }, + }, + }, + + { + name: "valid request, auto two outputs with change", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0.5", + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + }, + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 2e3), + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: 1e3, + }, + { + Address: w.Entries[1].Address, + Coins: totalCoins - 2e3, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + }, + }, + ignoreHours: true, // the hours are too unpredictable + }, + + { + name: "uxout does not exist", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{unknownOutput.Hex()}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: fmt.Sprintf("400 Bad Request - unspent output of %s does not exist\n", unknownOutput.Hex()), + code: http.StatusBadRequest, + }, + + { + name: "uxout not held by the wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{nonWalletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - uxout is not owned by any address in the wallet\n", + code: http.StatusBadRequest, + }, + + { + name: "insufficient balance with uxouts", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{walletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins + 1e3), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - balance is not sufficient\n", + code: http.StatusBadRequest, + }, + + { + // NOTE: expects wallet to have multiple outputs with non-zero coins + name: "insufficient hours with uxouts", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + UxOuts: []string{walletOutputs[0].Hash}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(1e3), + Hours: fmt.Sprint(totalHours + 1), + }, + }, + }, + err: "400 Bad Request - hours are not sufficient\n", + code: http.StatusBadRequest, + }, + + { + name: "valid request, uxouts specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + // NOTE: all uxouts are provided, which has the same behavior as + // not providing any uxouts or addresses. + // Using a subset of uxouts makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + UxOuts: walletOutputHashes, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + additionalRespVerify: func(t *testing.T, r *api.CreateTransactionResponse) { + require.Equal(t, len(walletOutputHashes), len(r.Transaction.In)) + }, + }, + + { + name: "specified addresses not in wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + Addresses: []string{testutil.MakeAddress().String()}, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins), + Hours: "1", + }, + }, + }, + err: "400 Bad Request - address not found in wallet\n", + code: http.StatusBadRequest, + }, + + { + name: "valid request, addresses specified", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + // NOTE: all addresses are provided, which has the same behavior as + // not providing any addresses. + // Using a subset of addresses makes the wallet setup very + // difficult, especially to make deterministic, in the live test + // More complex cases should be covered by unit tests + Addresses: addresses, + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[1].Address.String(), + Coins: toDropletString(totalCoins - 1e3), + Hours: "1", + }, + }, + }, + outputs: []coin.TransactionOutput{ + { + Address: w.Entries[1].Address, + Coins: totalCoins - 1e3, + Hours: 1, + }, + { + Address: w.Entries[0].Address, + Coins: 1e3, + Hours: remainingHours - 1, + }, + }, + }, + } + + if w.IsEncrypted() { + cases = append(cases, testCase{ + name: "invalid password", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password + "foo", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "401 Unauthorized - invalid password\n", + code: http.StatusUnauthorized, + }) + + cases = append(cases, testCase{ + name: "password not provided", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: "", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - missing password\n", + code: http.StatusBadRequest, + }) + + } else { + cases = append(cases, testCase{ + name: "password provided for unencrypted wallet", + req: api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password + "foo", + }, + ChangeAddress: &defaultChangeAddress, + To: []api.Receiver{ + { + Address: w.Entries[0].Address.String(), + Coins: "1000", + Hours: "1", + }, + }, + }, + err: "400 Bad Request - wallet is not encrypted\n", + code: http.StatusBadRequest, + }) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + require.False(t, len(tc.outputs) != 0 && len(tc.outputsSubset) != 0, "outputs and outputsSubset can't both be set") + + result, err := c.CreateTransaction(tc.req) + if tc.err != "" { + assertResponseError(t, err, tc.code, tc.err) + return + } + + require.NoError(t, err) + + d, err := json.MarshalIndent(result, "", " ") + require.NoError(t, err) + fmt.Println(string(d)) + + if len(tc.outputsSubset) == 0 { + require.Equal(t, len(tc.outputs), len(result.Transaction.Out)) + } + + for i, o := range tc.outputs { + // The final change output may not have the address specified, + // if the ChangeAddress was not specified in the wallet params. + // Calculate it automatically based upon the transaction inputs + if o.Address.Null() { + require.Equal(t, i, len(tc.outputs)-1) + require.Nil(t, tc.req.ChangeAddress) + + changeAddr := result.Transaction.Out[i].Address + // The changeAddr must be associated with one of the transaction inputs + changeAddrFound := false + for _, x := range result.Transaction.In { + require.NotNil(t, x.Address) + if changeAddr == x.Address { + changeAddrFound = true + break + } + } + + require.True(t, changeAddrFound) + } else { + require.Equal(t, o.Address.String(), result.Transaction.Out[i].Address) + } + + coins, err := droplet.FromString(result.Transaction.Out[i].Coins) + require.NoError(t, err) + require.Equal(t, o.Coins, coins, "[%d] %d != %d", i, o.Coins, coins) + + if !tc.ignoreHours { + hours, err := strconv.ParseUint(result.Transaction.Out[i].Hours, 10, 64) + require.NoError(t, err) + require.Equal(t, o.Hours, hours, "[%d] %d != %d", i, o.Hours, hours) + } + } + + assertEncodeTxnMatchesTxn(t, result) + assertRequestedCoins(t, tc.req.To, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + if tc.req.HoursSelection.Type == wallet.HoursSelectionTypeManual { + assertRequestedHours(t, tc.req.To, result.Transaction.Out) + } + + if tc.additionalRespVerify != nil { + tc.additionalRespVerify(t, result) + } + }) + } +} + +func TestLiveWalletCreateTransactionRandom(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + + w, totalCoins, totalHours, password := prepareAndCheckWallet(t, c, 2e6, 20) + + if w.IsEncrypted() { + t.Skip("Skipping TestLiveWalletCreateTransactionRandom tests with encrypted wallet") + return + } + + remainingHours := fee.RemainingHours(totalHours) + require.True(t, remainingHours > 1) + + assertTxnOutputCount := func(t *testing.T, changeAddress string, nOutputs int, result *api.CreateTransactionResponse) { + nResultOutputs := len(result.Transaction.Out) + require.True(t, nResultOutputs == nOutputs || nResultOutputs == nOutputs+1) + hasChange := nResultOutputs == nOutputs+1 + changeOutput := result.Transaction.Out[nResultOutputs-1] + if hasChange { + require.Equal(t, changeOutput.Address, changeAddress) + } + + t.Log("hasChange", hasChange) + if hasChange { + t.Log("changeCoins", changeOutput.Coins) + t.Log("changeHours", changeOutput.Hours) + } + } + + iterations := 250 + maxOutputs := 10 + destAddrs := make([]cipher.Address, maxOutputs) + for i := range destAddrs { + destAddrs[i] = testutil.MakeAddress() + } + + for i := 0; i < iterations; i++ { + t.Log("iteration", i) + t.Log("totalCoins", totalCoins) + t.Log("totalHours", totalHours) + + spendableHours := fee.RemainingHours(totalHours) + t.Log("spendableHours", spendableHours) + + coins := rand.Intn(int(totalCoins)) + 1 + coins -= coins % int(visor.MaxDropletDivisor()) + if coins == 0 { + coins = int(visor.MaxDropletDivisor()) + } + hours := rand.Intn(int(spendableHours + 1)) + nOutputs := rand.Intn(maxOutputs) + 1 + + t.Log("sendCoins", coins) + t.Log("sendHours", hours) + + changeAddress := w.Entries[0].Address.String() + + shareFactor := strconv.FormatFloat(rand.Float64(), 'f', 8, 64) + + t.Log("shareFactor", shareFactor) + + to := make([]api.Receiver, 0, nOutputs) + remainingHours := hours + remainingCoins := coins + for i := 0; i < nOutputs; i++ { + if remainingCoins == 0 { + break + } + + receiver := api.Receiver{} + receiver.Address = destAddrs[rand.Intn(len(destAddrs))].String() + + if i == nOutputs-1 { + var err error + receiver.Coins, err = droplet.ToString(uint64(remainingCoins)) + require.NoError(t, err) + receiver.Hours = fmt.Sprint(remainingHours) + + remainingCoins = 0 + remainingHours = 0 + } else { + receiverCoins := rand.Intn(remainingCoins) + 1 + receiverCoins -= receiverCoins % int(visor.MaxDropletDivisor()) + if receiverCoins == 0 { + receiverCoins = int(visor.MaxDropletDivisor()) + } + + var err error + receiver.Coins, err = droplet.ToString(uint64(receiverCoins)) + require.NoError(t, err) + remainingCoins -= receiverCoins + + receiverHours := rand.Intn(remainingHours + 1) + receiver.Hours = fmt.Sprint(receiverHours) + remainingHours -= receiverHours + } + + to = append(to, receiver) + } + + // Remove duplicate outputs + dup := make(map[api.Receiver]struct{}, len(to)) + newTo := make([]api.Receiver, 0, len(dup)) + for _, o := range to { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newTo = append(newTo, o) + } + } + to = newTo + + nOutputs = len(to) + t.Log("nOutputs", nOutputs) + + rand.Shuffle(len(to), func(i, j int) { + to[i], to[j] = to[j], to[i] + }) + + for i, o := range to { + t.Logf("to[%d].Hours %s\n", i, o.Hours) + } + + autoTo := make([]api.Receiver, len(to)) + for i, o := range to { + autoTo[i] = api.Receiver{ + Address: o.Address, + Coins: o.Coins, + Hours: "", + } + } + + // Remove duplicate outputs + dup = make(map[api.Receiver]struct{}, len(autoTo)) + newAutoTo := make([]api.Receiver, 0, len(dup)) + for _, o := range autoTo { + if _, ok := dup[o]; !ok { + dup[o] = struct{}{} + newAutoTo = append(newAutoTo, o) + } + } + autoTo = newAutoTo + + nAutoOutputs := len(autoTo) + t.Log("nAutoOutputs", nAutoOutputs) + + for i, o := range autoTo { + t.Logf("autoTo[%d].Coins %s\n", i, o.Coins) + } + + // Auto, random share factor + + result, err := c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: shareFactor, + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Auto, share factor 0 + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "0", + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Check that the non-change outputs have 0 hours + for _, o := range result.Transaction.Out[:nAutoOutputs] { + require.Equal(t, "0", o.Hours) + } + + // Auto, share factor 1 + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: "1", + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: autoTo, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nAutoOutputs, result) + assertRequestedCoins(t, autoTo, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + + // Check that the change output has 0 hours + if len(result.Transaction.Out) > nAutoOutputs { + require.Equal(t, "0", result.Transaction.Out[nAutoOutputs].Hours) + } + + // Manual + + result, err = c.CreateTransaction(api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + Wallet: api.CreateTransactionRequestWallet{ + ID: w.Filename(), + Password: password, + }, + To: to, + }) + require.NoError(t, err) + + assertEncodeTxnMatchesTxn(t, result) + assertTxnOutputCount(t, changeAddress, nOutputs, result) + assertRequestedCoins(t, to, result.Transaction.Out) + assertRequestedHours(t, to, result.Transaction.Out) + assertCreatedTransactionValid(t, result.Transaction) + } +} + +func assertEncodeTxnMatchesTxn(t *testing.T, result *api.CreateTransactionResponse) { + require.NotEmpty(t, result.EncodedTransaction) + emptyTxn := &coin.Transaction{} + require.NotEqual(t, hex.EncodeToString(emptyTxn.Serialize()), result.EncodedTransaction) + txn, err := result.Transaction.ToTransaction() + require.NoError(t, err) + + serializedTxn := txn.Serialize() + require.Equal(t, hex.EncodeToString(serializedTxn), result.EncodedTransaction) + + require.Equal(t, int(txn.Length), len(serializedTxn)) +} + +func assertRequestedCoins(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + var requestedCoins uint64 + for _, o := range to { + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + requestedCoins += c + } + + var sentCoins uint64 + for _, o := range out[:len(to)] { // exclude change output + c, err := droplet.FromString(o.Coins) + require.NoError(t, err) + sentCoins += c + } + + require.Equal(t, requestedCoins, sentCoins) +} + +func assertRequestedHours(t *testing.T, to []api.Receiver, out []api.CreatedTransactionOutput) { + for i, o := range out[:len(to)] { // exclude change output + toHours, err := strconv.ParseUint(to[i].Hours, 10, 64) + require.NoError(t, err) + + outHours, err := strconv.ParseUint(o.Hours, 10, 64) + + require.Equal(t, toHours, outHours) + } +} + +func assertCreatedTransactionValid(t *testing.T, r api.CreatedTransaction) { + require.NotEmpty(t, r.In) + require.NotEmpty(t, r.Out) + + fee, err := strconv.ParseUint(r.Fee, 10, 64) + require.NoError(t, err) + + require.NotEqual(t, uint64(0), fee) + + var inputHours uint64 + var inputCoins uint64 + for _, in := range r.In { + require.NotNil(t, in.CalculatedHours) + calculatedHours, err := strconv.ParseUint(in.CalculatedHours, 10, 64) + require.NoError(t, err) + inputHours, err = coin.AddUint64(inputHours, calculatedHours) + require.NoError(t, err) + + require.NotNil(t, in.Hours) + hours, err := strconv.ParseUint(in.Hours, 10, 64) + require.NoError(t, err) + + require.True(t, hours <= calculatedHours) + + require.NotNil(t, in.Coins) + coins, err := droplet.FromString(in.Coins) + require.NoError(t, err) + inputCoins, err = coin.AddUint64(inputCoins, coins) + require.NoError(t, err) + } + + var outputHours uint64 + var outputCoins uint64 + for _, out := range r.Out { + hours, err := strconv.ParseUint(out.Hours, 10, 64) + require.NoError(t, err) + outputHours, err = coin.AddUint64(outputHours, hours) + require.NoError(t, err) + + coins, err := droplet.FromString(out.Coins) + require.NoError(t, err) + outputCoins, err = coin.AddUint64(outputCoins, coins) + require.NoError(t, err) + } + + require.True(t, inputHours > outputHours) + require.Equal(t, inputHours-outputHours, fee) + + require.Equal(t, inputCoins, outputCoins) + + require.Equal(t, uint8(0), r.Type) + require.NotEmpty(t, r.Length) +} + +func TestCreateWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + w, seed, clean := createWallet(t, c, false, "", "") + defer clean() + require.False(t, w.Meta.Encrypted) + + walletDir := getWalletDir(t, c) + + // Confirms the wallet does exist + walletPath := filepath.Join(walletDir, w.Meta.Filename) + _, err := os.Stat(walletPath) + require.NoError(t, err) + + // Loads the wallet and confirms that the wallet has the same seed + lw, err := wallet.Load(walletPath) + require.NoError(t, err) + require.False(t, lw.IsEncrypted()) + require.Equal(t, seed, lw.Meta["seed"]) + require.Equal(t, len(w.Entries), len(lw.Entries)) + + for i := range w.Entries { + require.Equal(t, w.Entries[i].Address, lw.Entries[i].Address.String()) + require.Equal(t, w.Entries[i].Public, lw.Entries[i].Public.Hex()) + } + + // Creates wallet with encryption + encW, _, encWClean := createWallet(t, c, true, "pwd", "") + defer encWClean() + require.True(t, encW.Meta.Encrypted) + + walletPath = filepath.Join(walletDir, encW.Meta.Filename) + encLW, err := wallet.Load(walletPath) + require.NoError(t, err) + + // Confirms the loaded wallet is encrypted and has the same address entries + require.True(t, encLW.IsEncrypted()) + require.Equal(t, len(encW.Entries), len(encLW.Entries)) + + for i := range encW.Entries { + require.Equal(t, encW.Entries[i].Address, encLW.Entries[i].Address.String()) + require.Equal(t, encW.Entries[i].Public, encLW.Entries[i].Public.Hex()) + } +} + +func TestGetWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create a wallet + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + // Confirms the wallet can be acquired + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, *w, *w1) +} + +func TestGetWallets(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Creates 2 new wallets + var ws []api.WalletResponse + for i := 0; i < 2; i++ { + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + // cleaners = append(cleaners, clean) + ws = append(ws, *w) + } + + // Gets wallet from node + wlts, err := c.Wallets() + require.NoError(t, err) + + // Create the wallet map + walletMap := make(map[string]api.WalletResponse) + for _, w := range wlts { + walletMap[w.Meta.Filename] = *w + } + + // Confirms the returned wallets contains the wallet we created. + for _, w := range ws { + retW, ok := walletMap[w.Meta.Filename] + require.True(t, ok) + require.Equal(t, w, retW) + } +} + +// TestWalletNewAddress will generate 30 wallets for testing, and they will +// be removed automatically after testing. +func TestWalletNewAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // We only test 30 cases, cause the more addresses we generate, the longer + // it takes, we don't want to spend much time here. + for i := 1; i <= 30; i++ { + name := fmt.Sprintf("generate %v addresses", i) + t.Run(name, func(t *testing.T) { + c := api.NewClient(nodeAddress()) + var encrypt bool + var password string + // Test wallet with encryption only when i == 2, so that + // the tests won't time out. + if i == 2 { + encrypt = true + password = "pwd" + } + + w, seed, clean := createWallet(t, c, encrypt, password, "") + defer clean() + + addrs, err := c.NewWalletAddress(w.Meta.Filename, i, password) + if err != nil { + t.Fatalf("%v", err) + return + } + require.NoError(t, err) + + seckeys := cipher.GenerateDeterministicKeyPairs([]byte(seed), i+1) + var as []string + for _, k := range seckeys { + as = append(as, cipher.AddressFromSecKey(k).String()) + } + + // Confirms thoses new generated addresses are the same. + require.Equal(t, len(addrs), len(as)-1) + for i := range addrs { + require.Equal(t, as[i+1], addrs[i]) + } + }) + } +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "casino away claim road artist where blossom warrior demise royal still palm") + defer clean() + + bp, err := c.WalletBalance(w.Meta.Filename) + require.NoError(t, err) + + var expect api.BalanceResponse + checkGoldenFile(t, "wallet-balance.golden", TestData{*bp, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + _, walletName, _ := getWalletFromEnv(t, c) + bp, err := c.WalletBalance(walletName) + require.NoError(t, err) + require.NotNil(t, bp) + require.NotNil(t, bp.Addresses) +} + +func TestWalletUpdate(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + err := c.UpdateWallet(w.Meta.Filename, "new wallet") + require.NoError(t, err) + + // Confirms the wallet has label of "new wallet" + w1, err := c.Wallet(w.Meta.Filename) + require.NoError(t, err) + require.Equal(t, w1.Meta.Label, "new wallet") +} + +func TestStableWalletTransactions(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + txns, err := c.WalletTransactions(w.Meta.Filename) + require.NoError(t, err) + + var expect api.UnconfirmedTxnsResponse + checkGoldenFile(t, "wallet-transactions.golden", TestData{*txns, &expect}) +} + +func TestLiveWalletTransactions(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(nodeAddress()) + w, _, _, _ := prepareAndCheckWallet(t, c, 1e6, 1) + txns, err := c.WalletTransactions(w.Filename()) + require.NoError(t, err) + + bp, err := c.WalletBalance(w.Filename()) + require.NoError(t, err) + // There's pending transactions if predicted coins are not the same as confirmed coins + if bp.Predicted.Coins != bp.Confirmed.Coins { + require.NotEmpty(t, txns.Transactions) + return + } + + require.Empty(t, txns.Transactions) +} + +func TestWalletFolderName(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + folderName, err := c.WalletFolderName() + require.NoError(t, err) + + require.NotNil(t, folderName) + require.NotEmpty(t, folderName.Address) +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create a unencrypted wallet + w, _, clean := createWallet(t, c, false, "", "") + defer clean() + + // Encrypts the wallet + rlt, err := c.EncryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.NotEmpty(t, rlt.Meta.CryptoType) + require.True(t, rlt.Meta.Encrypted) + + // Encrypt the wallet again, should returns error + _, err = c.EncryptWallet(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is encrypted\n") + + // Confirms that no sensitive data do exist in wallet file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + require.Empty(t, lw.Meta["seed"]) + require.Empty(t, lw.Meta["lastSeed"]) + require.NotEmpty(t, lw.Meta["secrets"]) + + // Decrypts the wallet, and confirms that the + // seed and address entries are the same as it was before being encrypted. + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + require.Equal(t, w, dw) +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + w, seed, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + // Decrypt wallet with different password, must fail + _, err := c.DecryptWallet(w.Meta.Filename, "pwd1") + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") + + // Decrypt wallet with no password, must fail + _, err = c.DecryptWallet(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + + // Decrypts wallet with correct password + dw, err := c.DecryptWallet(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms that no sensitive data are returned + require.Empty(t, dw.Meta.CryptoType) + require.False(t, dw.Meta.Encrypted) + + // Loads wallet from file + wf, err := c.WalletFolderName() + require.NoError(t, err) + wltPath := filepath.Join(wf.Address, w.Meta.Filename) + lw, err := wallet.Load(wltPath) + require.NoError(t, err) + + require.Equal(t, lw.Meta["seed"], seed) + require.Len(t, lw.Entries, 1) + + // Confirms the last seed is matched + lseed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 1) + require.Equal(t, hex.EncodeToString(lseed), lw.Meta["lastSeed"]) + + // Confirms that the first address is derivied from the private key + pubkey := cipher.PubKeyFromSecKey(seckeys[0]) + require.Equal(t, w.Entries[0].Address, cipher.AddressFromPubKey(pubkey).String()) + require.Equal(t, lw.Entries[0].Address.String(), w.Entries[0].Address) +} + +func TestGetWalletSeedDisabledAPI(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create an encrypted wallet + w, _, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + _, err := c.GetWalletSeed(w.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusForbidden, "403 Forbidden\n") +} + +func TestGetWalletSeedEnabledAPI(t *testing.T) { + if !doEnableSeedAPI(t) { + return + } + + c := api.NewClient(nodeAddress()) + + // Create an encrypted wallet + w, seed, clean := createWallet(t, c, true, "pwd", "") + defer clean() + + require.NotEmpty(t, seed) + + sd, err := c.GetWalletSeed(w.Meta.Filename, "pwd") + require.NoError(t, err) + + // Confirms the seed are matched + require.Equal(t, seed, sd) + + // Get seed of wrong wallet id + _, err = c.GetWalletSeed("w.wlt", "pwd") + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") + + // Check with invalid password + _, err = c.GetWalletSeed(w.Meta.Filename, "wrong password") + assertResponseError(t, err, http.StatusUnauthorized, "401 Unauthorized - invalid password\n") + + // Check with missing password + _, err = c.GetWalletSeed(w.Meta.Filename, "") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - missing password\n") + + // Create unencrypted wallet to check against + nw, _, nclean := createWallet(t, c, false, "", "") + defer nclean() + _, err = c.GetWalletSeed(nw.Meta.Filename, "pwd") + assertResponseError(t, err, http.StatusBadRequest, "400 Bad Request - wallet is not encrypted\n") +} + +// prepareAndCheckWallet gets wallet from environment, and confirms: +// 1. The minimal coins and coin hours requirements are met. +// 2. The wallet has at least two address entry. +// Returns the loaded wallet, total coins, total coin hours and password of the wallet. +func prepareAndCheckWallet(t *testing.T, c *api.Client, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64, string) { + walletDir, walletName, password := getWalletFromEnv(t, c) + walletPath := filepath.Join(walletDir, walletName) + + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet %v doesn't exist", walletPath) + } + + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet %v failed: %v", walletPath, err) + } + + if w.IsEncrypted() && password == "" { + t.Fatalf("Wallet is encrypted, must set WALLET_PASSWORD env var") + } + + // Generate more addresses if address entries less than 2. + if len(w.Entries) < 2 { + _, err := c.NewWalletAddress(w.Filename(), 2-len(w.Entries), password) + if err != nil { + t.Fatalf("New wallet address failed: %v", err) + } + + w, err = wallet.Load(walletPath) + if err != nil { + t.Fatalf("Reload wallet %v failed: %v", walletPath, err) + } + } + + coins, hours := getWalletBalance(t, c, walletName) + if coins < miniCoins { + t.Fatalf("Wallet must have at least %d coins", miniCoins) + } + + if hours < miniCoinHours { + t.Fatalf("Wallet must have at least %d coin hours", miniCoinHours) + } + + if err := w.Save(walletDir); err != nil { + t.Fatalf("%v", err) + } + + return w, coins, hours, password +} + +// getWalletFromEnv loads wallet from envrionment variables. +// Returns wallet dir, wallet name and wallet password is any. +func getWalletFromEnv(t *testing.T, c *api.Client) (string, string, string) { + walletDir := getWalletDir(t, c) + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("Missing WALLET_NAME environment value") + } + + walletPassword := os.Getenv("WALLET_PASSWORD") + return walletDir, walletName, walletPassword +} + +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } +} + +// getWalletBalance gets wallet balance. +// Returns coins and hours +func getWalletBalance(t *testing.T, c *api.Client, walletName string) (uint64, uint64) { + wp, err := c.WalletBalance(walletName) + if err != nil { + t.Fatalf("Get wallet balance of %v failed: %v", walletName, err) + } + + return wp.Confirmed.Coins, wp.Confirmed.Hours +} + +func getTransaction(t *testing.T, c *api.Client, txid string) *daemon.TransactionResult { + tx, err := c.Transaction(txid) + if err != nil { + t.Fatalf("%v", err) + } + + return tx +} + +// getAddressBalance gets balance of given address. +// Returns coins and coin hours. +func getAddressBalance(t *testing.T, c *api.Client, addr string) (uint64, uint64) { // nolint: unparam + bp, err := c.Balance([]string{addr}) + if err != nil { + t.Fatalf("%v", err) + } + return bp.Confirmed.Coins, bp.Confirmed.Hours +} + +// createWallet creates a wallet with rand seed. +// Returns the generated wallet, seed and clean up function. +func createWallet(t *testing.T, c *api.Client, encrypt bool, password string, seed string) (*api.WalletResponse, string, func()) { + if seed == "" { + seed = hex.EncodeToString(cipher.RandByte(32)) + } + // Use the first 6 letter of the seed as label. + var w *api.WalletResponse + var err error + if encrypt { + w, err = c.CreateEncryptedWallet(seed, seed[:6], password, 0) + } else { + w, err = c.CreateUnencryptedWallet(seed, seed[:6], 0) + } + + require.NoError(t, err) + + walletDir := getWalletDir(t, c) + + return w, seed, func() { + // Cleaner function to delete the wallet and bak wallet + walletPath := filepath.Join(walletDir, w.Meta.Filename) + err = os.Remove(walletPath) + require.NoError(t, err) + + bakWalletPath := walletPath + ".bak" + if _, err := os.Stat(bakWalletPath); !os.IsNotExist(err) { + // Return directly if no .bak file does exist + err = os.Remove(bakWalletPath) + } + + require.NoError(t, err) + + // Removes the wallet from memory + c.UnloadWallet(w.Meta.Filename) + } +} + +func getWalletDir(t *testing.T, c *api.Client) string { + wf, err := c.WalletFolderName() + if err != nil { + t.Fatalf("%v", err) + } + return wf.Address +} + +func TestDisableWalletApi(t *testing.T) { + if !doDisableWalletAPI(t) { + return + } + + changeAddress := testutil.MakeAddress().String() + + type testCase struct { + name string + method string + endpoint string + contentType string + body func() io.Reader + json func() interface{} + expectErr string + code int + } + + tt := []testCase{ + { + name: "get wallet", + method: http.MethodGet, + endpoint: "/api/v1/wallet?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "create wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/create", + body: func() io.Reader { + v := url.Values{} + v.Add("seed", "seed") + v.Add("label", "label") + v.Add("scan", "1") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "generate new address", + method: http.MethodPost, + endpoint: "/api/v1/wallet/newAddress", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet balance", + method: http.MethodGet, + endpoint: "/api/v1/wallet/balance?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "wallet spending", + method: http.MethodPost, + endpoint: "/api/v1/wallet/spend", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("coins", "100000") // 1e5 + v.Add("dst", "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet unconfirmed transactions", + method: http.MethodGet, + endpoint: "/api/v1/wallet/transactions?id=test.wlt", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "update wallet label", + method: http.MethodPost, + endpoint: "/api/v1/wallet/update", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("label", "label") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "new seed", + method: http.MethodGet, + endpoint: "/api/v1/wallet/newSeed", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallets", + method: http.MethodGet, + endpoint: "/api/v1/wallets", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallets folder name", + method: http.MethodGet, + endpoint: "/api/v1/wallets/folderName", + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "main index.html 404 not found", + method: http.MethodGet, + endpoint: "/api/v1/", + expectErr: "404 Not Found\n", + code: http.StatusNotFound, + }, + { + name: "encrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/encrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "decrypt wallet", + method: http.MethodPost, + endpoint: "/api/v1/wallet/decrypt", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "get wallet seed", + method: http.MethodPost, + endpoint: "/api/v1/wallet/seed", + body: func() io.Reader { + v := url.Values{} + v.Add("id", "test.wlt") + v.Add("password", "pwd") + return strings.NewReader(v.Encode()) + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + { + name: "create transaction", + method: http.MethodPost, + endpoint: "/api/v1/wallet/transaction", + contentType: "application/json", + json: func() interface{} { + return api.CreateTransactionRequest{ + HoursSelection: api.HoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: api.CreateTransactionRequestWallet{ + ID: "test.wlt", + }, + ChangeAddress: &changeAddress, + To: []api.Receiver{ + { + Address: changeAddress, + Coins: "0.001", + Hours: "1", + }, + }, + } + }, + expectErr: "403 Forbidden\n", + code: http.StatusForbidden, + }, + } + + c := api.NewClient(nodeAddress()) + for _, tc := range tt { + f := func(tc testCase) func(t *testing.T) { + return func(t *testing.T) { + var err error + switch tc.method { + case http.MethodGet: + err = c.Get(tc.endpoint, nil) + case http.MethodPost: + switch tc.contentType { + case "application/json": + err = c.PostJSON(tc.endpoint, tc.json(), nil) + default: + err = c.PostForm(tc.endpoint, tc.body(), nil) + } + } + assertResponseError(t, err, tc.code, tc.expectErr) + } + } + + t.Run(tc.name, f(tc)) + + if strings.HasPrefix(tc.endpoint, "/api/v1") { + tc.endpoint = strings.TrimPrefix(tc.endpoint, "/api/v1") + t.Run(tc.name, f(tc)) + } + } + + // Confirms that no new wallet is created + // WALLET_DIR environment variable is set in ci-script/integration-test-disable-wallet-api.sh + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("WALLET_DIR is not set") + } + + // Confirms that the wallet directory does not exist + _, err := os.Stat(walletDir) + require.True(t, os.IsNotExist(err)) +} + +func checkHealthResponse(t *testing.T, r *api.HealthResponse) { + require.NotEmpty(t, r.BlockchainMetadata.Unspents) + require.NotEmpty(t, r.BlockchainMetadata.Head.BkSeq) + require.NotEmpty(t, r.BlockchainMetadata.Head.Time) + require.NotEmpty(t, r.Version.Version) + require.True(t, r.Uptime.Duration > time.Duration(0)) +} + +func TestStableHealth(t *testing.T) { + if !doStable(t) { + return + } + + c := api.NewClient(nodeAddress()) + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.Equal(t, 0, r.OpenConnections) + + require.True(t, r.BlockchainMetadata.TimeSinceLastBlock.Duration > time.Duration(0)) + + // The stable node is always run with the commit and branch ldflags, so they should appear + require.NotEmpty(t, r.Version.Commit) + require.NotEmpty(t, r.Version.Branch) +} + +func TestLiveHealth(t *testing.T) { + if !doLive(t) { + return + } + + c := api.NewClient(nodeAddress()) + + r, err := c.Health() + require.NoError(t, err) + + checkHealthResponse(t, r) + + require.NotEqual(t, 0, r.OpenConnections) + + // The TimeSinceLastBlock can be any value, including negative values, due to clock skew + // The live node is not necessarily run with the commit and branch ldflags, so don't check them +} + +func TestDisableGUIAPI(t *testing.T) { + if !doDisableGUI(t) { + return + } + + c := api.NewClient(nodeAddress()) + err := c.Get("/", nil) + assertResponseError(t, err, http.StatusNotFound, "404 Not Found\n") +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2RRpfMDmPHEyG4LWmNYT6eWj5VcmUfCJY6D.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-2b8ourW8fbTkC1yQBSLseVt6srhXvNMHvn9.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden new file mode 100755 index 0000000..f563060 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od.golden @@ -0,0 +1,631 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1, + "unknown": false + }, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "fee": 100037880222122, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100037880222222 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden new file mode 100755 index 0000000..ff5a323 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/address-transactions-R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ.golden @@ -0,0 +1,6892 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46450, + "block_seq": 1, + "unknown": false + }, + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "fee": 100037880222122, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000, + "calculated_hours": 100037880222222 + } + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46449, + "block_seq": 2, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "timestamp": 1427927651, + "fee": 349722, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 349723 + } + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46448, + "block_seq": 3, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "timestamp": 1427927671, + "fee": 0, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46447, + "block_seq": 4, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "timestamp": 1428793611, + "fee": 240538336, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1, + "calculated_hours": 240542040 + } + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46446, + "block_seq": 5, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "timestamp": 1428798821, + "fee": 1449243, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 2419 + }, + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704, + "calculated_hours": 1450897 + } + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46434, + "block_seq": 17, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "timestamp": 1428989855, + "fee": 49022445, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073, + "calculated_hours": 53063235 + } + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46433, + "block_seq": 18, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "timestamp": 1428989925, + "fee": 0, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 0 + } + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46425, + "block_seq": 26, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "timestamp": 1429011077, + "fee": 8799264, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790, + "calculated_hours": 9935082 + }, + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 58 + } + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46424, + "block_seq": 27, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "timestamp": 1429011137, + "fee": 442618, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938, + "calculated_hours": 584602 + } + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46413, + "block_seq": 38, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "timestamp": 1429058484, + "fee": 12441684, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992, + "calculated_hours": 13220174 + } + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46412, + "block_seq": 39, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "timestamp": 1429058494, + "fee": 294709, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245, + "calculated_hours": 392019 + } + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46411, + "block_seq": 40, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "timestamp": 1429058514, + "fee": 41986, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655, + "calculated_hours": 54148 + } + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46410, + "block_seq": 41, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "timestamp": 1429058524, + "fee": 7279, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081, + "calculated_hours": 8799 + } + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46406, + "block_seq": 45, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "timestamp": 1429071074, + "fee": 2580615, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760, + "calculated_hours": 3381555 + } + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46405, + "block_seq": 46, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "timestamp": 1429077374, + "fee": 1953736, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470, + "calculated_hours": 2053852 + } + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46404, + "block_seq": 47, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "timestamp": 1429077384, + "fee": 40168, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058, + "calculated_hours": 52682 + } + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46403, + "block_seq": 48, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "timestamp": 1429077394, + "fee": 7317, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257, + "calculated_hours": 8881 + } + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46402, + "block_seq": 49, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "timestamp": 1429077404, + "fee": 3212, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782, + "calculated_hours": 3406 + } + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46398, + "block_seq": 53, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "timestamp": 1429077514, + "fee": 23036, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97, + "calculated_hours": 28964 + } + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46394, + "block_seq": 57, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "timestamp": 1429077584, + "fee": 17952, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964, + "calculated_hours": 21314 + } + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46390, + "block_seq": 61, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "timestamp": 1429077654, + "fee": 16974, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681, + "calculated_hours": 20012 + } + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46387, + "block_seq": 64, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "timestamp": 1429077694, + "fee": 9642, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519, + "calculated_hours": 11982 + } + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46384, + "block_seq": 67, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "timestamp": 1429077874, + "fee": 45303, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170, + "calculated_hours": 48207 + } + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46383, + "block_seq": 68, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "timestamp": 1429077914, + "fee": 11531, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452, + "calculated_hours": 11893 + } + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46382, + "block_seq": 69, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "timestamp": 1429077944, + "fee": 7959, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181, + "calculated_hours": 8003 + } + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46381, + "block_seq": 70, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "timestamp": 1429077964, + "fee": 5094, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22, + "calculated_hours": 5098 + } + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46380, + "block_seq": 71, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "timestamp": 1429077974, + "fee": 2470, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2, + "calculated_hours": 2470 + } + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46374, + "block_seq": 77, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "timestamp": 1429147880, + "fee": 14818951, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0, + "calculated_hours": 16772585 + } + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46370, + "block_seq": 81, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "timestamp": 1429164440, + "fee": 4694075, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817, + "calculated_hours": 4945467 + } + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46366, + "block_seq": 85, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "timestamp": 1429164620, + "fee": 128383, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696, + "calculated_hours": 168783 + } + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46365, + "block_seq": 86, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "timestamp": 1429164720, + "fee": 39068, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200, + "calculated_hours": 44118 + } + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46361, + "block_seq": 90, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "timestamp": 1429164810, + "fee": 18618, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525, + "calculated_hours": 24026 + } + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46357, + "block_seq": 94, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "timestamp": 1429164870, + "fee": 13363, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704, + "calculated_hours": 17021 + } + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46353, + "block_seq": 98, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "timestamp": 1429274566, + "fee": 26123869, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829, + "calculated_hours": 26147565 + } + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46352, + "block_seq": 99, + "unknown": false + }, + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "timestamp": 1429274616, + "fee": 52573, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0, + "calculated_hours": 701 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058, + "calculated_hours": 50605 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257, + "calculated_hours": 6804 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782, + "calculated_hours": 1329 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "owner": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97, + "calculated_hours": 644 + } + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46350, + "block_seq": 101, + "unknown": false + }, + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "timestamp": 1429274666, + "fee": 720560, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "owner": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220, + "calculated_hours": 823465 + } + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46345, + "block_seq": 106, + "unknown": false + }, + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "timestamp": 1429279796, + "fee": 1140626, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848, + "calculated_hours": 1258331 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848, + "calculated_hours": 11920 + }, + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510, + "calculated_hours": 7581 + }, + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905, + "calculated_hours": 141380 + } + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46344, + "block_seq": 107, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "timestamp": 1429280596, + "fee": 301137, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293, + "calculated_hours": 335959 + } + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46342, + "block_seq": 109, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "timestamp": 1429302756, + "fee": 5450278, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411, + "calculated_hours": 5464462 + } + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46340, + "block_seq": 111, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "timestamp": 1429348072, + "fee": 150348, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848, + "calculated_hours": 154810 + } + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46339, + "block_seq": 112, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "timestamp": 1429348102, + "fee": 8340296, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092, + "calculated_hours": 11115602 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231, + "calculated_hours": 2314 + } + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46338, + "block_seq": 113, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "timestamp": 1429348172, + "fee": 1058600, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810, + "calculated_hours": 1405802 + } + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46337, + "block_seq": 114, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "timestamp": 1429348502, + "fee": 210299, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601, + "calculated_hours": 253699 + } + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46336, + "block_seq": 115, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "timestamp": 1429348712, + "fee": 67241, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700, + "calculated_hours": 72665 + } + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46334, + "block_seq": 117, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "timestamp": 1429351912, + "fee": 737315, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712, + "calculated_hours": 779245 + } + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46330, + "block_seq": 121, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "timestamp": 1429382678, + "fee": 6644094, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965, + "calculated_hours": 7401386 + } + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46329, + "block_seq": 122, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "timestamp": 1429382898, + "fee": 332972, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646, + "calculated_hours": 427632 + } + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46328, + "block_seq": 123, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "timestamp": 1429451746, + "fee": 14677172, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330, + "calculated_hours": 14689004 + } + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46327, + "block_seq": 124, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "timestamp": 1429522086, + "fee": 14768022, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916, + "calculated_hours": 14769500 + } + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46326, + "block_seq": 125, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "timestamp": 1429578056, + "fee": 11670300, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739, + "calculated_hours": 11670484 + } + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46324, + "block_seq": 127, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "timestamp": 1429848410, + "fee": 4600910, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231, + "calculated_hours": 1767312 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810, + "calculated_hours": 3890350 + } + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46323, + "block_seq": 128, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "timestamp": 1429849170, + "fee": 42124753, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92, + "calculated_hours": 55585992 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376, + "calculated_hours": 528397 + } + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46320, + "block_seq": 131, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "timestamp": 1430330041, + "fee": 80047494, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818, + "calculated_hours": 105466512 + } + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46319, + "block_seq": 132, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "timestamp": 1430330311, + "fee": 9587333, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509, + "calculated_hours": 12764709 + } + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46318, + "block_seq": 133, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "timestamp": 1430330421, + "fee": 1213974, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688, + "calculated_hours": 1611146 + } + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46317, + "block_seq": 134, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "timestamp": 1430330481, + "fee": 161181, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586, + "calculated_hours": 210827 + } + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46316, + "block_seq": 135, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "timestamp": 1430330591, + "fee": 41059, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823, + "calculated_hours": 47263 + } + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46315, + "block_seq": 136, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "timestamp": 1430330851, + "fee": 55295, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102, + "calculated_hours": 56069 + } + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46314, + "block_seq": 137, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "timestamp": 1430504186, + "fee": 35264333, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387, + "calculated_hours": 35264429 + } + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46313, + "block_seq": 138, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "timestamp": 1430504236, + "fee": 10194, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48, + "calculated_hours": 10206 + } + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46312, + "block_seq": 139, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "timestamp": 1430504536, + "fee": 60856, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6, + "calculated_hours": 60856 + } + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46311, + "block_seq": 140, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "timestamp": 1430504746, + "fee": 42536, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0, + "calculated_hours": 42536 + } + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46310, + "block_seq": 141, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "timestamp": 1430504846, + "fee": 20227, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0, + "calculated_hours": 20227 + } + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46309, + "block_seq": 142, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "timestamp": 1430504966, + "fee": 24190, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0, + "calculated_hours": 24190 + } + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46308, + "block_seq": 143, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "timestamp": 1430505086, + "fee": 24156, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0, + "calculated_hours": 24156 + } + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46307, + "block_seq": 144, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "timestamp": 1430505176, + "fee": 18105, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0, + "calculated_hours": 18105 + } + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46305, + "block_seq": 146, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "timestamp": 1430641376, + "fee": 25062898, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0, + "calculated_hours": 27361066 + } + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46304, + "block_seq": 147, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "timestamp": 1430641536, + "fee": 893911, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084, + "calculated_hours": 1181181 + } + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46303, + "block_seq": 148, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "timestamp": 1430642006, + "fee": 201883, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635, + "calculated_hours": 237791 + } + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46302, + "block_seq": 149, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "timestamp": 1430642106, + "fee": 33471, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954, + "calculated_hours": 37959 + } + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46301, + "block_seq": 150, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "timestamp": 1430642306, + "fee": 41639, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244, + "calculated_hours": 42199 + } + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46300, + "block_seq": 151, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "timestamp": 1430642426, + "fee": 24180, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280, + "calculated_hours": 24250 + } + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46299, + "block_seq": 152, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "timestamp": 1430642546, + "fee": 23963, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35, + "calculated_hours": 23971 + } + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46298, + "block_seq": 153, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "timestamp": 1430642816, + "fee": 53786, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4, + "calculated_hours": 53786 + } + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46297, + "block_seq": 154, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "timestamp": 1430643706, + "fee": 177035, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0, + "calculated_hours": 177035 + } + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46296, + "block_seq": 155, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "timestamp": 1430643906, + "fee": 39727, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0, + "calculated_hours": 39727 + } + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46295, + "block_seq": 156, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "timestamp": 1430644036, + "fee": 25812, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0, + "calculated_hours": 25812 + } + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46294, + "block_seq": 157, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "timestamp": 1430673946, + "fee": 5930488, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0, + "calculated_hours": 5930488 + } + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46293, + "block_seq": 158, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "timestamp": 1430674696, + "fee": 144958, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0, + "calculated_hours": 144958 + } + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46292, + "block_seq": 159, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "timestamp": 1430715196, + "fee": 7546500, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0, + "calculated_hours": 7546500 + } + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46291, + "block_seq": 160, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "timestamp": 1430784172, + "fee": 12731130, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0, + "calculated_hours": 12731130 + } + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46290, + "block_seq": 161, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "timestamp": 1430784312, + "fee": 25801, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0, + "calculated_hours": 25801 + } + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46289, + "block_seq": 162, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "timestamp": 1430784372, + "fee": 11041, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0, + "calculated_hours": 11041 + } + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46288, + "block_seq": 163, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "timestamp": 1430784932, + "fee": 103026, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0, + "calculated_hours": 103026 + } + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46287, + "block_seq": 164, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "timestamp": 1430790052, + "fee": 940535, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0, + "calculated_hours": 940535 + } + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46286, + "block_seq": 165, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "timestamp": 1430790152, + "fee": 18342, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0, + "calculated_hours": 18342 + } + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46284, + "block_seq": 167, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "timestamp": 1430791902, + "fee": 253195, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0, + "calculated_hours": 320499 + } + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46283, + "block_seq": 168, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "timestamp": 1430792072, + "fee": 56369, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652, + "calculated_hours": 64781 + } + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46280, + "block_seq": 171, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "timestamp": 1430870562, + "fee": 12326841, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206, + "calculated_hours": 14355099 + } + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46278, + "block_seq": 173, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "timestamp": 1430871512, + "fee": 930183, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129, + "calculated_hours": 1185063 + } + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46276, + "block_seq": 175, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "timestamp": 1430908702, + "fee": 6658374, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440, + "calculated_hours": 6695090 + } + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46272, + "block_seq": 179, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "timestamp": 1431339429, + "fee": 63843789, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358, + "calculated_hours": 74887085 + } + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46270, + "block_seq": 181, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947", + "inner_hash": "f8293dbfdddcc56a97664655ceee650715d35a0dda32a9f0ce0e2e99d4899124", + "timestamp": 1431757585, + "fee": 65605413, + "sigs": [ + "3981061c7275ae9cc936e902a5367fdd87ef779bbdb31e1e10d325d17a129abb34f6e597ceeaf67bb051774b41c58276004f6a63cb81de61d4693bc7a5536f3200" + ], + "inputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 77037939 + } + ], + "outputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263 + }, + { + "uxid": "32a060b2e2025cceb40f3f982c887952d3358d468db1719dd892eab575c14c14", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10000.000000", + "hours": 5716263 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46267, + "block_seq": 184, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "a230d5b5b745bb51d40e86b11e6508dc84a486f5ffd3584b0d45818ab8520802", + "inner_hash": "e6acee381aaefcd94f28b3a7ef5e6c34232fd5e78e96816d71c9c60248d6c5c6", + "timestamp": 1432327272, + "fee": 93088328, + "sigs": [ + "2e70883dc210920e639b5f22efd820a5f04b5290bc65b6ef4c52cd6283ef7a2e580fec499d33a71700a61dcab9200ee09a08a695affa9c12ef00d6d07cb0164001" + ], + "inputs": [ + { + "uxid": "8f9c09c37e0c636178e4229e2e8212c067ef0a8c501be9e2757a97b980d7a98a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "605700.000000", + "hours": 5716263, + "calculated_hours": 101566100 + } + ], + "outputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886 + }, + { + "uxid": "d66dad2d285942e38e13fd5d921cd142e86489a16b0f83ece7249e72704f6536", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "40000.000000", + "hours": 4238886 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46261, + "block_seq": 190, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "655651b51d288fae2ca80dd8231fbc8927e7f0203d698bdf0dc47e1e9c63652d", + "inner_hash": "472ae342c5dcb47ec7cf0b63fba1414d5e4a32c63e974ce390d55fb668972151", + "timestamp": 1433229543, + "fee": 109516348, + "sigs": [ + "7dfbaddfb6b73fd84f23644a755c025b8480ab8754ad2e1a1c95d53ff52ed87e45030465ead44995235678e6e53ead91926da4af940367bef53ba7ae229edb7901" + ], + "inputs": [ + { + "uxid": "d620b98b74f27e2afc0fcd750037de5d157666d2dae15817348059d23ec97f52", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565700.000000", + "hours": 4238886, + "calculated_hours": 146020748 + } + ], + "outputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200 + }, + { + "uxid": "8cb546636d5039df6d4bda41a10322ea6dcd0fa0c766d3e2f45a6f30040765e0", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "600.000000", + "hours": 18252200 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46259, + "block_seq": 192, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cff22d57daf828015489bba3b01538369f5627cc89ad0f139261bb0be0dac4a8", + "inner_hash": "4fd9cd0aab064ef8cf67e2b6b0102aa1cd4df52cf60b00206cc7b5619bcf5acc", + "timestamp": 1433331745, + "fee": 28712805, + "sigs": [ + "36a79d8ce7050bf1df11c9e839ecbb75f889161c7f3a81539a5da630953dad30159d0db804123c48f3bcabe2314887614bd57be64f951f7162ffc08f5810d23101" + ], + "inputs": [ + { + "uxid": "30e062105d7ef8c4981932d80d904bee2270c238bc36a6532a8917cce05f17b4", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "565100.000000", + "hours": 18252200, + "calculated_hours": 34295075 + } + ], + "outputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135 + }, + { + "uxid": "79fc203078f4a201ed7bfb09977a75a5b22794645606aef22824d3fda9285932", + "dst": "2fcUG6oQSsaWZK9Crqkh6LzGfZexqUqtHWg", + "coins": "1000.000000", + "hours": 2791135 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46258, + "block_seq": 193, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "1b83454b4e61348b9c643815c26350b4e34796170593895961f329a759cbadf8", + "inner_hash": "d551018fa96bcf1df6ae0136f75bfb5db002e6e41723fa80ab4fb5a1857bfcde", + "timestamp": 1433334775, + "fee": 2568137, + "sigs": [ + "9c02e3b3c6cc517badf9a4408bb9bf9d8d72fad0e2cc3f04f2e176bcfc2a7fee1b4740c4bc4eaa4ae008a9a18eda3f0cace91199613b14d2c34178cca1ac8ac500" + ], + "inputs": [ + { + "uxid": "32463caca7ea96e2fb3fb03502b29513bb9e6385cb6097c4ba411ea808b6e5e1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "564100.000000", + "hours": 2791135, + "calculated_hours": 3265919 + } + ], + "outputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891 + }, + { + "uxid": "6a349ba12c5d2827de6c24773d3dd8f6572e86adba4c8954a6d6e68df9e165e2", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "2400.000000", + "hours": 348891 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46256, + "block_seq": 195, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "fa7a60f6d4a22404e28ce9d1600442c19237552d8678bd610793cb8e6b3353d4", + "inner_hash": "cc33e2831789b20ec4eb187a6b44a9f772aa243f3f5f6262cb46087a0a6ac3f5", + "timestamp": 1437050608, + "fee": 495228940, + "sigs": [ + "9b8e90365377deb3da537fdda4653f117c1c7de525b611d9d07f23139b5d4c642af80ad70779aa012b6399e73af8e08e87952f085edf8060f0832635e3244cb400" + ], + "inputs": [ + { + "uxid": "3fa8d60e34b1195ee24fde2c4594b8c0eaf06cb114b395bbce6bebeeccf709b6", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561700.000000", + "hours": 348891, + "calculated_hours": 580122056 + } + ], + "outputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558 + }, + { + "uxid": "054e39b1d37f10a4e1ee6598d66bd7cdd8f97b5ef0de2666120ef710c053af98", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "100.000000", + "hours": 42446558 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46254, + "block_seq": 197, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b18ed75097ed7910315e3be9042c0ca0b734d30a1afb8f9346bbe18acddd3a8a", + "inner_hash": "847e1acbed683214ad9e0fe164204db0ae8f2ce1cc420cb25aa63c76a4739580", + "timestamp": 1437051128, + "fee": 31904730, + "sigs": [ + "523ef82bcc586c5c885ca0fc7f2ffe5057573556a8bfaa3d9eb30b6316e698e93ac11a9e0d8a3c2a8ace763d80edd8e059153b61a4a35fa6f0b214d8ba0c485d00" + ], + "inputs": [ + { + "uxid": "ac638ce4f15f749b3ef4168fed59a9ae0e8b5f8894b27b151fae31af102d245a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "561600.000000", + "hours": 42446558, + "calculated_hours": 42527678 + } + ], + "outputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474 + }, + { + "uxid": "bd55382fd8ca5b623b167dd7180ee0165eca5e74a6b2be453536ce8b5e1231e0", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "34080.000000", + "hours": 5311474 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46253, + "block_seq": 198, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "cd6fae6c021e64768cbb2e0a17ec6853db94b5dde52b417f872371dc3c24a27f", + "inner_hash": "8dde5734f617c1313288ac9d1b762a7d1e88b68846945b83c35935bcce1fdd8a", + "timestamp": 1437139506, + "fee": 16933928, + "sigs": [ + "1221df811e418338ca156c42fc881d1cd7384b819a6683d4a54ab6e78521e32761452bcbb7ad856fa345a8f80c6206b19bd178c09975b87180f86448994ba07c00" + ], + "inputs": [ + { + "uxid": "6d453ceff872a65be937598159fac754390c00e7731cc73c72169c476d1625c5", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527520.000000", + "hours": 5311474, + "calculated_hours": 18261796 + } + ], + "outputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934 + }, + { + "uxid": "42ec7e7302b1464d94e99c7b842e477d10e55328257aa5d1987052a3bdcc8690", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "300.000000", + "hours": 663934 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46251, + "block_seq": 200, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "2e05ca5b53cdaf3d65102aa6a4a707a324e5bfa7fa46e9b3b7328d1e0363822a", + "inner_hash": "08832259284fe4965625e2ef97d1ff3b40d7832b159b3d5369fc086ebb95479f", + "timestamp": 1438939186, + "fee": 54694521, + "sigs": [ + "820dc5d47540b0978818356b512731ae47517c061a1b660e7fd47e8f3d6420700377fd2ec04b618504cd3dadf642111df2f6c1f6edf2a4067fd460c69e8eb07301" + ], + "inputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 70389941 + } + ], + "outputs": [ + { + "uxid": "6e4110a8ed6f2b8b8772516466032a99b4851de65cf9ce1b5c5673946b7408a9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25400.000000", + "hours": 7847710 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46226, + "block_seq": 225, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "5a348a2f9d4e70f1f0d68fa9abc66d8eb4adcd45942c89d79a4121033e7dfc39", + "inner_hash": "a282319ed05751e5df08ece9dfe9fdcc73ee03b3efa2227c78ed1fd65a072c23", + "timestamp": 1440298886, + "fee": 356772925, + "sigs": [ + "c2e5060c13dbcbe8bd76cbe8d7fa2aab8a8738bc6b1c1acf50366f211cbda18611feb1e218df129d1e6a6f957310ad08a139c03555d6ba2b99f52fd988e0a96800", + "90ed23dacf21e05817442155cf7ae9867a9531ee0e1c4b575caaec7c65ede2f73344e1b12e093b4d1ebb11e457f066560d1a280cf8cb48fbf7e937202c329fa001" + ], + "inputs": [ + { + "uxid": "bd9c90d1c11fd00392db236d4c7fc06da07806c1676e4cc6df25c9df35e75d9d", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "527220.000000", + "hours": 663934, + "calculated_hours": 463355135 + }, + { + "uxid": "50e534ebc9c3f0b99461ad70b01d415eabfc046e824a5d1ba46854c913928612", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 7847710, + "calculated_hours": 8225404 + } + ], + "outputs": [ + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807 + }, + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46225, + "block_seq": 226, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "e91d2553c18538d90847e7d432c75978abb0f6f84edeea2f942d018e7306074b", + "inner_hash": "e16c45b163f87caefb9d231d4608e6a9b67b5d379a7bff3aebd6587cfa349df6", + "timestamp": 1440299046, + "fee": 86129188, + "sigs": [ + "cdcc51cad962fa4c6da30a44222c1a7d91501d07ba358c5a017b1105ec6f95091ba4ed430a95220492b228cd1b48a74f19c08ef550108cb639a7451e6d80cb1100", + "6969d30799e0687d3c80ce026bc510f920171ed4fb592ce3bf7ba1c142ec515230856a3c5b618495b449f264dd4ca1c1cea6e0e95756b2d0201d280571ba41e301" + ], + "inputs": [ + { + "uxid": "44233d76c4cfcf6d45efd339ea004c41a3c21f5e9b1919484f4256c53e8aa5a7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 57403807, + "calculated_hours": 57404251 + }, + { + "uxid": "75323e65eec723bb62819835a2e9ae9d7aff770fcf076dd0325e03abec471bb9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "518220.000000", + "hours": 57403807, + "calculated_hours": 57426839 + } + ], + "outputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951 + }, + { + "uxid": "dfb90c1854bbf56bb87452a2870b4270214ca163df7d77f37c6bbf9d4ee2878a", + "dst": "2F4uJss1tkD7LNUp5RmxF1DPqgyzKVJm5tb", + "coins": "50.000000", + "hours": 14350951 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46224, + "block_seq": 227, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "71f762590ff2ca5e0591405ca5bb81aa2540981ea6e5cb71da1b30e4f91124a0", + "inner_hash": "024a7d284281f46931f4068a7dc377064aaf51b1c841e8d43a9f80f19aa52a8e", + "timestamp": 1440299156, + "fee": 10779353, + "sigs": [ + "dac9b5146b34a81f1c167cb54a15584e4323cb1910bf8de6c3b999f903a88b25473df3474c5ebce317dc40b121c632a79ecc8e9081406cc5d4b7a9848bd13d0f01" + ], + "inputs": [ + { + "uxid": "7d9bc531b7a990d565c3f8d64de6861a2c619c80ad5014685548261fa13c4b78", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528170.000000", + "hours": 14350951, + "calculated_hours": 14367089 + } + ], + "outputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868 + }, + { + "uxid": "b79723cfa4ff5c819de20392e8f73e16d353dc4af31eb0c7857735d74f0b1469", + "dst": "ywucfMPRof9HqQPXM9xaY865THKsK2bgsS", + "coins": "50.000000", + "hours": 1793868 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46223, + "block_seq": 228, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ca1a46e2ea862c0886adccc211140ff394315c580a8f2da711eeed39d6326eb", + "inner_hash": "e026ab911b2370df6ef3cf8ee91e2005ab9fa978efd4074a8415aa272b0c19a9", + "timestamp": 1440299256, + "fee": 1360072, + "sigs": [ + "2805ab4816da23f9e1fc26c8940b5b5b27f90c910201229e239fa2b8f3cb4f9a5d1b57a62c48d5fc21ed11ccc121d22a8269af51a9de1359dd897a78a068d9a300" + ], + "inputs": [ + { + "uxid": "e07733e150eee8faacba13e00b2719618f44c57311881b450eff03a8a7fad882", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528120.000000", + "hours": 1793868, + "calculated_hours": 1808538 + } + ], + "outputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233 + }, + { + "uxid": "03db7662bf54eadcf812dc76fad91d4022dc55b895ce8be3a4f13bda048bd281", + "dst": "23t2jE6DAMUUan6bgqQZchHtwtZo5sRUgR7", + "coins": "50.000000", + "hours": 224233 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46222, + "block_seq": 229, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ac0737f4a51a7274f6a32f337d21af0681eff77276f6365c1809a1a73564e850", + "inner_hash": "b0faed6dd74071ff4e4083f9e5f73ff5af90fda24b4e52a00962bae7eaadf5f8", + "timestamp": 1440339226, + "fee": 6031218, + "sigs": [ + "34abcaa9a093713d2a19323e234d216169d3f75336b3170c1ab7c281386d42da0e97cf5e444a7473a0b1806d3d887e9622a329770c57f27c7532f3b69e3a6b9100" + ], + "inputs": [ + { + "uxid": "ad55899c8170d5a577e2a501698002d83dcbf46a72ee351c1f45b366e91ec29c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "528070.000000", + "hours": 224233, + "calculated_hours": 6087276 + } + ], + "outputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029 + }, + { + "uxid": "db47ae0c8f6fb640a199a01ceb12c63c26303fd866840f964b634b2f1a7490ab", + "dst": "2bJVVKi3UU9FKEAnZpvNQRWMom9Pp1SYp8k", + "coins": "1100.000000", + "hours": 28029 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46221, + "block_seq": 230, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "26746e5734590a1ef50f6d8ec6f58c25ed4b2bc57324f9e321f5543807f8830a", + "inner_hash": "66744475146d04a7d95866e1e19b97e1d903e95bc5e8ea96223b281b7b95dbf7", + "timestamp": 1440400166, + "fee": 8941454, + "sigs": [ + "199134f5ee986ec6a7a86d01920a98c8930be6f224dfeddece5c94155c9b4cea59b78c855887769f00aa6aeb76eb8e632f25b58bd5409fd481fb6663c30db67201" + ], + "inputs": [ + { + "uxid": "daf47014d9191ccfe8bc920aed20088f40c404dbf1836596f021bdd65bdf3467", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526970.000000", + "hours": 28029, + "calculated_hours": 8948460 + } + ], + "outputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503 + }, + { + "uxid": "10c9fb1e6e6eb1a70af6e6714c1c0edb9588478cddfdbccb9ac5b2194abcbbfd", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "50.000000", + "hours": 3503 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46220, + "block_seq": 231, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4553ac3bd00bc61bb9deb8a2bf3c606ecf78b857da710728f5b86fdd20434958", + "inner_hash": "0a23fd3f113c52b6b36d397256fe0161a3d7edc77f128ac974173fac90927fb9", + "timestamp": 1440400256, + "fee": 15802, + "sigs": [ + "883145c4d76b5032ab0489407e991b247edeac0f89334c0588b8ede6d4ea052a2c330a94598fc9953cf9d25afeee7cf00ecea4d14744657ec9d888fe39b0d55c01" + ], + "inputs": [ + { + "uxid": "8421f4591fa459bba5bb36d8e3465253ae6fa8ce66682a50bbab92bfeb0eac5f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526920.000000", + "hours": 3503, + "calculated_hours": 16676 + } + ], + "outputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437 + }, + { + "uxid": "e161482d33d132611f343987fc55f400d83de9ce3e51b1e5bd47e2b526c1c567", + "dst": "mkzYUmbUSnBAvweQ3QqqHZM3esy97ubWwQ", + "coins": "50.000000", + "hours": 437 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46219, + "block_seq": 232, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ca448d0b9f00c3f779acd75ea6e5d09cb93b4dee8ae417e43cecc58b121155f2", + "inner_hash": "bdcb4cfeae31a07ac42547510c4763b26b139ae2b61d411d7d4a78678a89f4e4", + "timestamp": 1440412792, + "fee": 1835007, + "sigs": [ + "8d5c007633116141c43ff4c87e1394052c4b6832c250ebf5f49781c7b0879ab12261bfd92f41fa6963c4b74e96c2bf8c96e8708f5dd04d4781fdb780c8307bb001" + ], + "inputs": [ + { + "uxid": "fa71bd8cc9a8ec39da2b9eb1d6f50d1c79f3c527e0feb4a121c87a82a337106c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526870.000000", + "hours": 437, + "calculated_hours": 1835115 + } + ], + "outputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46218, + "block_seq": 233, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "688395456432e777e9bcef2482950d047259da990199d26d88f113ba37e870e6", + "inner_hash": "97a6db93329382d3a23dad5caf203056e6747dca4722c7e8e8d1f316b5f79503", + "timestamp": 1440510872, + "fee": 14354361, + "sigs": [ + "b3a6984d1440aeceb4dac0304215a1bf8d017ab581f19c550b4d8f859f9a15270b54a8e599bff4f4a3a5fb3fcbe2f5bb95b7d61d4d48735696d7dd3c16f8fa7a01", + "5209b5d255a1308f3e25ad6115ed005e34479f4b9155c16c27b40b28da08332b646cc7fb29d82e07f6e8f0de780a4e6a6980ccf4c80214c9fbd0a3fe7eadf84900" + ], + "inputs": [ + { + "uxid": "61d2b0b56b48f446cde90400e87ecd005c555ccc376bbc08208b682c4bafe937", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "511870.000000", + "hours": 54, + "calculated_hours": 13945667 + }, + { + "uxid": "bc2efd372485b52b954f4bde244c776af12529ba1382ee3e343087754365c3fc", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "15000.000000", + "hours": 54, + "calculated_hours": 408720 + } + ], + "outputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13 + }, + { + "uxid": "121d93a2019c2bdcd69d58ca47cd4087c5ccc56c5ddc2486885dff8a6febcfb7", + "dst": "2N1izdmWPnPLUSvkRH8Q7aKES7crLYxBo5k", + "coins": "777.000000", + "hours": 13 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46217, + "block_seq": 234, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "036ad7678b828002f9f75645cd66e8c4a2d2ef66d4866bf7cfe5797be691a648", + "inner_hash": "0751142c1e40396fb2ea4e03cc64f8a7fabc12c1466d44726fa0dd9b2fab4b9e", + "timestamp": 1440543822, + "fee": 4006005, + "sigs": [ + "9093c6beef08fc75a1341830aa8da696a9a1f6e043ab8abc48c63f8527c186b26e7f5e802e1743e095031a94b1fee4876245285de8bc76133ea78b403b34b38800" + ], + "inputs": [ + { + "uxid": "18ffebf7d8410a48f00b6bbfa5272ba374c0b70c6c31172975b4c503542d4193", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25390.000000", + "hours": 980963, + "calculated_hours": 5263875 + } + ], + "outputs": [ + { + "uxid": "a715e01bf641734804ed64e468ec35aa43658dc618784e6aed2f67d10c811f5d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "24390.000000", + "hours": 628935 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46213, + "block_seq": 238, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "768dc6803457ca6ba774e251f0a8f482d8f7134a5a8347831ae1d84ff39040b3", + "inner_hash": "63020c4af6f170888d1ed626be016d895568d3a0aead892b979e55e5d0bd8800", + "timestamp": 1440675932, + "fee": 18591357, + "sigs": [ + "442db1af0d6925a01bf9510a5b8ba1dc1787373ba0851b99825533c2bc02f5246cdd56ac98ca2c1039d010f52e7a153c4118fe00dce63692b63dd04cefcce0f701", + "9d3c03789af3832c7cae849eed9ac2b1d5b1c3f89daee13ad46f10d256cd8774431d60b98ab3803709430cceefe1cdb55543064843240af9123ab9ffbb2ffccf01" + ], + "inputs": [ + { + "uxid": "f0521d23d6178c3bcf37bbf9755c5e6fc286ae286908fd970bba69fd44cd4f1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "526093.000000", + "hours": 13, + "calculated_hours": 24121377 + }, + { + "uxid": "b20f489859a7f5236c3cdb5ed9ed7b49fb086622e251c9c73bced00d4de84648", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 628935, + "calculated_hours": 665632 + } + ], + "outputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826 + }, + { + "uxid": "2b724147fb8daced3ad03b0a94e291410ab70df7f22346ed836bb864904a24ab", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 3097826 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46212, + "block_seq": 239, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "60ba5bab66295f08c5c96411f53bdf38bdf2b985b6dec3989b7754a8e2919ef8", + "inner_hash": "e765990d43208cc3e4f2168abd1139b36eeb280d18d8f98b13c14708371a5109", + "timestamp": 1440676112, + "fee": 2349099, + "sigs": [ + "91a610f22d4aec320cb9a39a831eea7ff8b5fe5e18d402fda01bf732ccce2ad801d3709a073d0a95d18c8424ea8cb69cce38194a5b12ab11f6bb5278f9a7941d01" + ], + "inputs": [ + { + "uxid": "cfe2c8e49c9de33d4a589a1413f125c6e297aa4c65c220cf3cb14d77ad399950", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514593.000000", + "hours": 3097826, + "calculated_hours": 3123555 + } + ], + "outputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228 + }, + { + "uxid": "52d2c4bda60fcd5e144d1c229a4d31c559a3d1f060b689737148918d4c04e128", + "dst": "Zu5GRV7HcKu1zV4ymwXUBCNogbwFW1sbhA", + "coins": "500.000000", + "hours": 387228 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46211, + "block_seq": 240, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8839c0de129a84bb3025f8e314dae4d331b0da6a446a9893ad11225eec650e5e", + "inner_hash": "dd8ca4280d163c57c12c9792b544df85a2535e06b20b2c661d91b6aec80ba8fc", + "timestamp": 1440677762, + "fee": 526047, + "sigs": [ + "7ab23848784fdf05602660e838be997277a7c33b2907ba81ae324d735b39864a2235ed3a0bfff86fa3cd7dcec7c6ab519d78e5f42b39443ee3aa4a1e44b9e26400" + ], + "inputs": [ + { + "uxid": "621e724988e58bf27ec29a910b7a53ed028ee2185a77e727f5612be31886b658", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "514093.000000", + "hours": 387228, + "calculated_hours": 622853 + } + ], + "outputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403 + }, + { + "uxid": "3e2b813ec4bdb29dd5bc232e00722c00beabf7cbbc2ca8b4e348f2f083978bd3", + "dst": "X7y5AqjNaLEuBGPxF2Rpip7d1AByHWWaXz", + "coins": "300.000000", + "hours": 48403 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46210, + "block_seq": 241, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6cf290b9b63988d6126b6101c10992f6d9340988731e67867f011790f1fdf8de", + "inner_hash": "7e4018b41a6906ddfd84f67d271d79ae89ade34ed5de0ae609a6eeddb37f5991", + "timestamp": 1440677792, + "fee": 40584, + "sigs": [ + "da30c4a5cd8670d84a8f7f8b7c7cf9ae0da0f5bf806720824ad2d59716b200d349070158bbac66723c1a434747a8c438dec3e40c9e199cf8a2ee6d5622eb6b5901" + ], + "inputs": [ + { + "uxid": "4e421d6b25d84e7bfb4561465e15867cc751cd2527e99901f5afc538a344ee57", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "513793.000000", + "hours": 48403, + "calculated_hours": 52684 + } + ], + "outputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050 + }, + { + "uxid": "3a87d255b1d892d58d606d622196b75e818690e55e74db6e0173b1e28b58e2a9", + "dst": "vneQ7V3nuPwRbSRqvFXhWkXaVou11ynXfC", + "coins": "1000.000000", + "hours": 6050 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46209, + "block_seq": 242, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ca9114947a591d12c8bcb3aed6c2b6f6f50c13ebea44fe62fcfd783b4716166", + "inner_hash": "0aa4f96969cccacc1c03e2d7f8a1719ffb6de7c85ee563f6d55f3da14a377502", + "timestamp": 1440679322, + "fee": 222475, + "sigs": [ + "2373f45b0d10eb272c0304af8b75bac0570fc265ae3a446ec74b0bea87e494d86101e9b0c042a84fb20bd2061e694f2791cc76c734e8dcba0f3a601651cd405601" + ], + "inputs": [ + { + "uxid": "899150e09c28e157df0548f505d6ede097274c9ed69b269085d03c0582141d81", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512793.000000", + "hours": 6050, + "calculated_hours": 223987 + } + ], + "outputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756 + }, + { + "uxid": "051a357d1fe7f7b417a5892531f1e8b25b5bb78011ed4b440a5af47cfe241605", + "dst": "26AzDqDncyr5VKg5PfAxfTVdDtJf9AnMvoV", + "coins": "50.000000", + "hours": 756 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46208, + "block_seq": 243, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6b056847543ff37d8dbb7506d85514b3e18001ce973b7aac2a1a198a7f3be318", + "inner_hash": "583525d962728c33c80c1a511f3f407df0b09f0b22d571b9b857dba3488c0b13", + "timestamp": 1440682532, + "fee": 457763, + "sigs": [ + "b625dcc6040f599b04f00e9812f93f6e087a68b8277a03efcb49a2e88cf86ea4314ac1d50e5299b9ec48921fed1b56e0221bbb8df5a3df386d524fbcb9fe9aa100" + ], + "inputs": [ + { + "uxid": "1df6bca39e9eb5491a5cc5c5960277e5da2d3eb7dcba02346a88b8097e9f85cb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "512743.000000", + "hours": 756, + "calculated_hours": 457951 + } + ], + "outputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94 + }, + { + "uxid": "e7a20c799176f6567f3ad37f67ef0bfe5dd957404bd436d12f378eb35e624430", + "dst": "23HBeFsA4E7g4pwJpbmQjtmDSHhhi47is1B", + "coins": "12500.000000", + "hours": 94 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46207, + "block_seq": 244, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7732aba0b8f9773c975158578159f5f6e98e9864d1cd2b0cef23cac03783cb99", + "inner_hash": "0337a9c8ebc9c389166e782b1da8777b01c29894b19d2c34290d9a3b81cd2ee1", + "timestamp": 1440911542, + "fee": 31822474, + "sigs": [ + "c185a7bac79fa042884330bf37c97ad27d9b4726ced145d91aec91dfb1cd9bf71e2c2e0de33837b43b241eddff2ac7067144ab3859859bef3e926b99aab4e5da01" + ], + "inputs": [ + { + "uxid": "7d72885b66c4b55fa019a084fe867ec0133ccf69a47dc007a6063a98235f2c0c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500243.000000", + "hours": 94, + "calculated_hours": 31822496 + } + ], + "outputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11 + }, + { + "uxid": "5b9ecc773b66edd04478a15c82f019986b973fbc24be45c933e1e8ef62e0b223", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "2400.000000", + "hours": 11 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46203, + "block_seq": 248, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c8cbf96c9875e5a7f9f20cc301e9541f41182ac02747953f299d97a971e861e8", + "inner_hash": "f2c27d1b408cdd4796f628bff892e43cdfaeb8725b3a83bd0eddc374d9ce3ad1", + "timestamp": 1441590662, + "fee": 81345481, + "sigs": [ + "314620c86df48d65a6fcfeb82d028f48660f01b78004a01c0b5e8d5ba5e38e297331862b3f2786cf682e03e81fab3a413068f4eb72991d574b90d6a857b32d6201" + ], + "inputs": [ + { + "uxid": "273800d205c2cde0dd2bdd7d942a394108479e1d0fe7c2d665044f078ee654eb", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "497843.000000", + "hours": 11, + "calculated_hours": 93915327 + } + ], + "outputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923 + }, + { + "uxid": "6ade5ea7988126cda24ab050d714172ce41b0ba33359e0d06d319be60e83db9d", + "dst": "SiS1P3maLEzpscmggF6yvBHQ3yn7tA5ZdJ", + "coins": "5000.000000", + "hours": 6284923 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46200, + "block_seq": 251, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7c2da40e69c1ab57129cda200cbc4916fc67673436209b549c0496a4991f73be", + "inner_hash": "2d2c7b9c7e9e7c2dac513d277e2ed378a4ccdc5263560e2173b6507e4d70670d", + "timestamp": 1441735522, + "fee": 19597209, + "sigs": [ + "9de55cef7a0e80984d48ecfd30acf98d220bb5556d456af477c6879e80ba1bf143e75d6b64a018c1023f1854e538f1b72df3efe932db13d0eb20adf31c38ff9f01" + ], + "inputs": [ + { + "uxid": "a7ae18a9ac1e1787fc13d28cfb6de19711ba19a6737a66aaf29d1577e967c4f3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "492843.000000", + "hours": 6284923, + "calculated_hours": 26116377 + } + ], + "outputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584 + }, + { + "uxid": "5e41c4784a2ed9b538d07c20c2cadc89e3566ea17653b965715dd8db2015b986", + "dst": "KXSR2KLsButg6ndwUDYoyJ4FE9vGPLvtAj", + "coins": "1000.000000", + "hours": 3259584 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46199, + "block_seq": 252, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6638eac25e01cb7aabc20e0bd8fff66267bfa88ef4d3b021cda4248f6c8538a3", + "inner_hash": "ce2201218b3d8b5c734bc18666e409174b77ae022c0e48c30c5a9949edff6b0d", + "timestamp": 1441735692, + "fee": 2467913, + "sigs": [ + "94a8d11ba959af4d2160d141989d9a3e21f875b829d07969d1be040b54317c901c47ebcc9431f3cc0af88d4fbc0ac924785de50d27a3af4e4e4dc31a9980e0eb01" + ], + "inputs": [ + { + "uxid": "78523dd46614ec8b6aead939096a0dc77580475ff4ef6029cf15cc6af6121b4c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491843.000000", + "hours": 3259584, + "calculated_hours": 3282809 + } + ], + "outputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448 + }, + { + "uxid": "4ce358e15868adaf6c5ca420f900d3dd0f737510b5412646e10548fa3d37653d", + "dst": "29vxf99tti4sFPZpg8ghEWV9fhoHSbjeRYd", + "coins": "100.000000", + "hours": 407448 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46191, + "block_seq": 260, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "22b65c63f88e188f8da71f42e41102cde030d9550cfc990b4391e0339a4cb2dd", + "inner_hash": "0f2f563f1fdf52d53dcc414228d347dc677c4143cb3be4471945709fed3d29f0", + "timestamp": 1444883250, + "fee": 331657183, + "sigs": [ + "f0ace9ccccb936a5b46073085d83ca357692dfe0de9635d36292289f6d3a6e4505bd42c7de08dc8642823b8ee2b986c0b926c62df834f694a4d44695ced6690000" + ], + "inputs": [ + { + "uxid": "92b97e2593356de140619f723ff1dceeb586ddc074c6d28b638ee21a6c545558", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "491743.000000", + "hours": 407448, + "calculated_hours": 430349007 + } + ], + "outputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912 + }, + { + "uxid": "d79a747561a4ae09c22e5ec0baf0eb861b56b1d9b1411868c474d32e9ef392dc", + "dst": "6QpWfvS8PxrWVJLKLFtQVUHvAwUg2oX6GW", + "coins": "12500.000000", + "hours": 49345912 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46189, + "block_seq": 262, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "bc35493562cbe89797ce21a6202c8b43fc8514910ccb197c2f971c624b1fa5dd", + "inner_hash": "ff7c2bc8682df6f1a080061ca6d646c47636474b9e291dbf9d549fe5e63fddfe", + "timestamp": 1447060608, + "fee": 302141105, + "sigs": [ + "d1ffeea69fb213eaa7aea1e5f0d5a09e414247ba07a3860fb66c3af0b7ed611e2e630bfd292b4013e0d1bd9234290f068d49f5922ce895785c18cc4ada578a0e00" + ], + "inputs": [ + { + "uxid": "ad23f4d4cfba4a4f531a072bac6b7f3b5002ca97f3bc8a6064d556f404df197c", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "479243.000000", + "hours": 49345912, + "calculated_hours": 339202461 + } + ], + "outputs": [ + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678 + }, + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46188, + "block_seq": 263, + "unknown": false + }, + "length": 317, + "type": 0, + "txid": "32c585c56c5879158e3075f299998f6cf922b06b9620f272ebb4cb4a2353d4eb", + "inner_hash": "e0dcb3b201be487c7feaf513b3f245b08e0f86335fd2bd9a9dba7ca70684e8a7", + "timestamp": 1448245188, + "fee": 185490927, + "sigs": [ + "2b0585dc3ac3d497e9b139be51a0e5f6e0520c54e244678459169a82d386f5050f23dd92685efee03bad45f7e166992fb34c3fc036c1fd9204bc0280decb7c8000", + "adcd4b6cb6dc7816416f44649ce1dc4ce3489e9dbac70f4de610d0663e12ed556f3d1fda1781ecb6237652358cd6d1118ec9c2b5795dde594d92c47830c493f500" + ], + "inputs": [ + { + "uxid": "1a736e8db443d47be27b5772d3d7ef80afd09c5f44bffe2390056e2ba0378679", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "500.000000", + "hours": 18530678, + "calculated_hours": 18695203 + }, + { + "uxid": "5405881c286f02327718b8124e1b421123dfe3905fe60b2272ffe7632f4102e9", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478743.000000", + "hours": 18530678, + "calculated_hours": 176061062 + } + ], + "outputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669 + }, + { + "uxid": "08c0b08d114154a06a39cf418dd39eb018a55c1c4ee7a96257b33bc6f413d577", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 4632669 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46187, + "block_seq": 264, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "97ed144d626d0ff6fca09745735aec22a103d182971a45989500a3aa757358d4", + "inner_hash": "4bafee81f542c63b988af48da3250dd56215a42b520892b1ebbb8e9c5271588b", + "timestamp": 1450942022, + "fee": 361736164, + "sigs": [ + "c4047afd7722520fea778426868ef461a602a3954b82051c2245107491efdfff54d701d18f5408ef20a7dcea37ae4c1c3555bfe1bc387b1f3a516d076420139e00" + ], + "inputs": [ + { + "uxid": "f98bd5645556fc85678355430dcae91b13bb48a257e51fe4c94565bb450aab3a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "478243.000000", + "hours": 4632669, + "calculated_hours": 362894330 + } + ], + "outputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083 + }, + { + "uxid": "8745efaccbb21edd35d337233d7d1ae0e2c75723e72767c9b42cd27c46146abc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "2000.000000", + "hours": 579083 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46186, + "block_seq": 265, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "b5ffbbb48c9900feb663f79c3b3e1c89328a08b592f96071fd4d3171197a5ff7", + "inner_hash": "b6d4ab02e9b05a532402a1b65185e098d4c730854c6f34d20e71da1262524195", + "timestamp": 1450942402, + "fee": 484583, + "sigs": [ + "b116c94fd9e32cc371bba4f9a88ad672112d53be861aaa5c77cd335d1553fe0a24fc334d79c61aed344b618a3de49e791cc8aebe83bead076ed2f38dccd9aaee00" + ], + "inputs": [ + { + "uxid": "019d3c48e4f48ae4c7d2c60ba8ba3d6a821cd1f34cc8d7dcae0e99e448aea268", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "476243.000000", + "hours": 579083, + "calculated_hours": 629353 + } + ], + "outputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385 + }, + { + "uxid": "c33a3ad731a1375220c0701da00a462e13a11bab4cff684061ce173982227a2d", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "19980.000000", + "hours": 72385 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46185, + "block_seq": 266, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "981c2bb64f9e6717353cad40e21f3e97bd188381fde77862298488a516c31252", + "inner_hash": "cae5fc5f829da5ccb165c97b1140ed161e22e4ba290b1bee703b31a986c3c45c", + "timestamp": 1453191853, + "fee": 285149083, + "sigs": [ + "e3fb8400221770861288bcb1018a495548af5cd617724aa22efd219f350047086ea0ed5aa7f95e488045d5c31d8551a6cffcdf796d91ebbf573c1ef6492bb25701" + ], + "inputs": [ + { + "uxid": "4cac2776f179bf3b38d862158871a117bde8ca8bd3185490861138b4862ba997", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "456263.000000", + "hours": 72385, + "calculated_hours": 285167179 + } + ], + "outputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048 + }, + { + "uxid": "d7eb0e6bd0ccbf9fd59e314999c37e8f97c652001e1ac1834f9b3c95665a746d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "1000.000000", + "hours": 9048 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46184, + "block_seq": 267, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4edf7e4859bd537481164719a563af45b2603d2caf1b676d6fe1e08713b0d6f3", + "inner_hash": "ac615d16f9c8be45bc50359496bdd6d489b374846f11586c19dc865c3217c1b9", + "timestamp": 1461084047, + "fee": 998068985, + "sigs": [ + "7ae17fdc81bb3b71304db642c6af046e67ca00e8499d8f3d19f7489cd13ca4b75f2415d1e9639e0a7a26791852331189f5e2bfdde574ccf6c0adbca2fb0c933100" + ], + "inputs": [ + { + "uxid": "9eb9840cfe5e9c546b2db592420d4651433a6913eb46a50500834fcde4989af2", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "455263.000000", + "hours": 9048, + "calculated_hours": 998071247 + } + ], + "outputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131 + }, + { + "uxid": "fd99ca48c87575437fcbedd1bf05cf5c4f6a2d199616119ec99dfe61eb085ee5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5000.000000", + "hours": 1131 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46183, + "block_seq": 268, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "76b704d474896c5a3179b45a48c3ad327d5ebc27a6681ea7f514a90ba625bac3", + "inner_hash": "a60b2257f963b247a98f083828bf58d88aa3f327839c599bf1eaf0ee55a325a1", + "timestamp": 1461280957, + "fee": 24628984, + "sigs": [ + "15e30848b1d0aaf92e13f8927115314341ab4452a31f0a61f665c986c952ef6838753688759e98f393b5af088ad0fa4e9aa4e83695afe5734c45e4eb6c15b76f01" + ], + "inputs": [ + { + "uxid": "a6624db7b164d43f52d38f9584a7e79377e46077ee23823b61a53948678e28e7", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "450263.000000", + "hours": 1131, + "calculated_hours": 24629266 + } + ], + "outputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141 + }, + { + "uxid": "c85d1d533bf13c0725af9a30bb101670505ed192f6987d55c1db5dd70fb2e4b3", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "12931.000000", + "hours": 141 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46182, + "block_seq": 269, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "8ecc2fb1efa47e6ad0c4670281b364a2828bfe86d59fbc14105c5b3a3c34fd17", + "inner_hash": "0600d27b083aea0d64ba83749b3bb60cbde6dd2cdaa4ec2101adb8de668cdeec", + "timestamp": 1461296767, + "fee": 1920723, + "sigs": [ + "aaa9847aead8e1e43fdeb1548317046c252ddc8b61e9447c18006b8af5805f5c1dbf81b898f25ecbbd0bb97c2d6d89da0e25f7da979932b2a774c7c5e6f2281d01" + ], + "inputs": [ + { + "uxid": "36a9b21493d059479a71e7f0cffc8b9a920d572eca50b73483e64dc7facf087a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "437332.000000", + "hours": 141, + "calculated_hours": 1920757 + } + ], + "outputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17 + }, + { + "uxid": "7bb51af714bcae27ed5c092c6e721f10ca1ac167a61add8bd2989f15c968bab8", + "dst": "28nWDjroTJGr3rmZj9iiiVQK1wEVURcvsSc", + "coins": "2500.000000", + "hours": 17 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46177, + "block_seq": 274, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "2c97923aba19d8846f8f90db6dc89da7d433ead3ea8dc3155294ab4c9e7e61a4", + "inner_hash": "7d3af96a796daba12cbb863731c09e148f21302064d65945316473ad522e8ca8", + "timestamp": 1461749167, + "fee": 40993499, + "sigs": [ + "6f3c6fb3e971ec8b4eb3a352c94b2abcb347a3f476d1b5e3097ce239a32467bd0703a4436ce7c9b4beb1668a9056f6d93055b53aa7a36374c2b3d12793a6ea3900" + ], + "inputs": [ + { + "uxid": "23bdbe3b210b25da017917ea4345d589adea792ad156dcfd875a55d9509bbe5b", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "434832.000000", + "hours": 17, + "calculated_hours": 54643905 + } + ], + "outputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203 + }, + { + "uxid": "df7cae650d11e13a5308ea9f10662060c57ad749538d5ea1f476556de3257270", + "dst": "A19fNE1BNGAELCJ5bCVgo8t5Y9UPtoxy2F", + "coins": "1000.000000", + "hours": 6825203 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46167, + "block_seq": 284, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7c3f991c9cb5098648da480666613a048267678dcf7033c6138b0ac619003bcb", + "inner_hash": "35e2f253fd5936f6086464b4f3bae2a39770f91b2d846533bdd677554a760bbf", + "timestamp": 1462264727, + "fee": 65048877, + "sigs": [ + "bd5e540c58e54ccc58d1f7021657665d1f7a1770cc575b47a46bc16f5e3f3c86338f61be266c851201e8441ea5aa3ac91fa1cbf3b77365826c3b76f8f6441b0700" + ], + "inputs": [ + { + "uxid": "5ec2fea3fa7c2b44b2c2b0dfc8b3085d091eb6b6a9bb2d3330a7c6ff57bd61de", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "433832.000000", + "hours": 6825203, + "calculated_hours": 68954765 + } + ], + "outputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944 + }, + { + "uxid": "fba32b8a7e10d7aad23bb8511dd61b9ad67b844142b5acd7ef22d03e540888fb", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "100000.000000", + "hours": 1952944 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46163, + "block_seq": 288, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "4c41f200b398abbba12cb9ad5b935a5dad3bb6283093f062c82ae7c7904747a5", + "inner_hash": "5263bdcff23761f158c7286664908839983135936f1e53bdd2513e7fa317d05f", + "timestamp": 1462711117, + "fee": 37342376, + "sigs": [ + "39c94d70cedadb426004bea6137aa774ba757b78c44aad072143eb55cb9207aa7f02be91cd67c27f39f898a2303791665bfb5414a18df62a304c9cbdd4ffb5ff00" + ], + "inputs": [ + { + "uxid": "8ed671db62d7a541aebcfcbdf4e677d9d5c49979e3dfbc94e532b32b9273b4cd", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333832.000000", + "hours": 1952944, + "calculated_hours": 43347184 + } + ], + "outputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404 + }, + { + "uxid": "111b2d823bc70d9e8f42063eca3a457abe385b994d59f602d35bafe3e1402233", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 3002404 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46162, + "block_seq": 289, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "6778a6900cf26b0ad69d2ead927663bd2bbaccd9b97d0dffb74655a08757ee5a", + "inner_hash": "53e042fba89ab6233f73a2bd08df87d84d5979b7a1bed5705156b8badc44f5b3", + "timestamp": 1462711187, + "fee": 2258293, + "sigs": [ + "006025e5067252a8e37eb4c911d7e2c5283b137f0be2c8ffae27cac8f5a21f723d25745c157e49783354751f3e0bf4ce25fe6271748bd78d31487e826685a59801" + ], + "inputs": [ + { + "uxid": "af7420cde3eec0f8ca1b1aa5bc6c47c89055877be61863a50e0665ee4fd2d737", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "333732.000000", + "hours": 3002404, + "calculated_hours": 3008893 + } + ], + "outputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300 + }, + { + "uxid": "4729461061ba3e308d1fea8846b8326bb8300d3dcc8b66b242323ba0aa5a3ccb", + "dst": "2Rjx22U3oDAv1sK5kNRGbr8ohLZPf7tY5Qa", + "coins": "50000.000000", + "hours": 375300 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46161, + "block_seq": 290, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "99988a504cb60473ad8b5047a9be9049dff3dd2ee13879707a12736ed52ea9a5", + "inner_hash": "13285dd910aca69020333f17bc6d0a9ad3424bba2610acbd062712a3b4b46b6b", + "timestamp": 1462715237, + "fee": 600674, + "sigs": [ + "cc4df545eddf94086f0aaf2bb28321d8e3822f835bb3a71ab51674a3a7dc305c57df3609b6dc3a434fa8e2a4c36b5406cdf2fe6833c74049b4b77cf098ca664c01" + ], + "inputs": [ + { + "uxid": "621e418133fa0e18013978ea4cb8d8de33d00174d5f41ef11c8750a178b20cd3", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "283732.000000", + "hours": 375300, + "calculated_hours": 694498 + } + ], + "outputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912 + }, + { + "uxid": "a0e76e9cfd75deeb37f2db7bd67c95c95c3896c635ef104a548b77cafa65dd04", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 46912 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46160, + "block_seq": 291, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "714a3b2ba4479d0a95ad0ebae11bc1198eabc6392dabe776c15e7a68e0d82cf8", + "inner_hash": "32aa300316d5aff19a3aa0a99bfbca6398eef9462cc6c975fe7f41d1ecb9f6d5", + "timestamp": 1462715257, + "fee": 36732, + "sigs": [ + "a886ba759476985a6aec555b7acb5b3f7ea7d14201b66bd043bc172206bf4b7c0269959f3f8aac5c7a06a376a628221c67ae89cbd141c96987f852c2e2f4e73400" + ], + "inputs": [ + { + "uxid": "eacaf7455ea2fb2a028fe670f7bb578c4c1ca767cea247ebfc7e3fecd8f1d5e8", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278732.000000", + "hours": 46912, + "calculated_hours": 48460 + } + ], + "outputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864 + }, + { + "uxid": "0637e5ea11dba513d8839c02e4d564ec31a8377e5aca51fdef4c854cb5eaa332", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 5864 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46159, + "block_seq": 292, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7e8d02180c5e49cd36b545c8986ffaadc7e90840259d3fe10ceaff3e4cd931c4", + "inner_hash": "8e1d9f79f43372290c3d497314271a711c33474fdec555b4be6f3f0d7c608d76", + "timestamp": 1462715267, + "fee": 5170, + "sigs": [ + "61f0c36e996c391c61daaddd6dced605e79cdabc643d994d99c7a6a479aad25c4030619f1cf7420dbe2d673a2e124f2bae744277b246173342d7fdbddea78bc200" + ], + "inputs": [ + { + "uxid": "7802f51a5010ce9397a73aabe79ebc1c4ad4bb79f1352cf01064f7657d392079", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "278232.000000", + "hours": 5864, + "calculated_hours": 6636 + } + ], + "outputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733 + }, + { + "uxid": "9ab52d70129ef181bbd69a630a3fa929bb12357c5c31bc70173388b71327dab7", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "500.000000", + "hours": 733 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46130, + "block_seq": 321, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7388dab349f2d2a59ab071fc592c0173acfa357f23fd17dae1561089da55e74f", + "inner_hash": "a0f3bfacdee3107342adb96e8dcb38a265af8054624dadc0b27d71c55854e6b5", + "timestamp": 1467090951, + "fee": 282914895, + "sigs": [ + "dda5202c4c44a5ab8eceb8cf8a7acc1c2714529eee0a69bd396cb74a98706dfe1c7686c1b0f2bf760b5d211ce535c21077944bd1d89bc0baade9606cd561147800" + ], + "inputs": [ + { + "uxid": "bb95e005de46b18783350e39ab6f0f969db253445c99e5b97d172dee6f81a4db", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277732.000000", + "hours": 733, + "calculated_hours": 337575029 + } + ], + "outputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067 + }, + { + "uxid": "f16b87d2e0ea2e7f43434d058fb4435705cb15f4d01de6c6aa242ab7fcd9a80b", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "100.000000", + "hours": 27330067 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46129, + "block_seq": 322, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "5733f006dda42be6198d3fb035170c9160428ad321c8255b851574776e03c34f", + "inner_hash": "993a366ebfc7210951eeda4c459389f396a2038f41025f4b729edab75d1dc9c5", + "timestamp": 1469074433, + "fee": 173463682, + "sigs": [ + "0612105a7d427841f1f9038bbb778c8c1db52e0dfe5fd7c9409b44bb03fc72a74d60913ad46fef4a525d3314a48e1ee49d4a5da69941075fe816c02ef691979001" + ], + "inputs": [ + { + "uxid": "d187d4cd730f2634e9f8bbd9e5a87eb37d1e319dbcc3d8bd9fe07cbf36f04438", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "277632.000000", + "hours": 27330067, + "calculated_hours": 180296198 + } + ], + "outputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258 + }, + { + "uxid": "02b48571a1a1f628a0e78b5b158a682262a88610cd0614697e17201f35c9ee98", + "dst": "22cmbaPHWozJRJfbxTUbfoy2FfM3oFvFs7k", + "coins": "1000.000000", + "hours": 3416258 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46128, + "block_seq": 323, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "725698203caf11e909360449956f0285735d44f4573c81413852d25b220e61b0", + "inner_hash": "ef1dc1d55aa04aa6a240a796f6f9c47af2317fdfa7f4843f3884e71cdb79c442", + "timestamp": 1469074773, + "fee": 2588320, + "sigs": [ + "77fd6d8da8b2efd32dd50ca558e44fde0f62d8cd15ab084650759ff61d51e3200b7c025488908a7d0f784de819764506ab8a67f9d5c384ab7962c30908695d3700" + ], + "inputs": [ + { + "uxid": "d75874d45892d08632c1b9ee89f2137c21491a70f95bf7c04b4f0d65e465c3f1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "276632.000000", + "hours": 3416258, + "calculated_hours": 3442384 + } + ], + "outputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032 + }, + { + "uxid": "f575c8f632e92d9e3c7335f68e4e6c24d69d20fddbd05f794016b4d18d4d9c66", + "dst": "8CHWZqQEnBj9dTdZ78iqs1MVy83qgCuTs4", + "coins": "1000.000000", + "hours": 427032 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46124, + "block_seq": 327, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "823a284da9b7e49180e599552e824c60c23d28cc9fd4915e57037ac6ba5e364f", + "inner_hash": "83da271ca66c1da0f8ba30224552791e51f5334fb2868c01a95aa09aa5d8f8c4", + "timestamp": 1469463291, + "fee": 22630464, + "sigs": [ + "bd8a3cfd554c7fcf06c2fbdb0efe399f31d30373c96a0846edd52a3163dca1b43060014bda1db9abbacda35addcd3cd89625fe8e4753067aaf9a2de226fd692c01" + ], + "inputs": [ + { + "uxid": "92bc1ce78fd98223f4c27438e22214117952de08798c2c5557f3e3350deee45f", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275632.000000", + "hours": 427032, + "calculated_hours": 30173696 + } + ], + "outputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616 + }, + { + "uxid": "f809efa66df51ff86023c6a514e91274a93dc303c34a191c37deb7e3467b9944", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1.000000", + "hours": 3771616 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46101, + "block_seq": 350, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ccf809db24bde3af9083bb6ba590e91f71cd93335c945ccae3f815ef68994843", + "inner_hash": "18e96e61845c7f9134eec568476ae5f8909417230382a261384a4116cb6ea980", + "timestamp": 1471358102, + "fee": 120495261, + "sigs": [ + "07220c9f545b585905db91d51aa1b00bd3c3c4ad251bd88c48cc1377c2ea86702ac6fb8354188abdf228cd9c05c8d8c0c8185e337f60fb824b06ca5c3893757f00" + ], + "inputs": [ + { + "uxid": "e4cd8349646afcc6fca01e94e0e247a22d447d0a3e6bef728854ebf3fe0a1507", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 3771616, + "calculated_hours": 148846241 + } + ], + "outputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490 + }, + { + "uxid": "6e269a47dc13704da1058890e839f246fe6f57c52718687c863e0d16adbfbb3e", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 14175490 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46097, + "block_seq": 354, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "e348450f03f57e10e3cb1227b6874186d72f090c1cb6468b400b4906807cef02", + "inner_hash": "79e866fddd91dea1ba6c8bdb88bc880216d25c812145bb476e91590396146b3f", + "timestamp": 1472066732, + "fee": 62149533, + "sigs": [ + "67d3293742ce7cd95612d1a01c0b307a94166fc0b7bdc01efcd312606f88a5a474affc18a56adf6fece4f9b6b593dd1479a70fac8d92d4d285e1af579eafb90b01" + ], + "inputs": [ + { + "uxid": "46eec2ffbdaa24e27231765678002ee7c9ac4aeea7bb6df14f66bfa957e58d1a", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "274631.000000", + "hours": 14175490, + "calculated_hours": 68234313 + } + ], + "outputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390 + }, + { + "uxid": "26974a5d7ccd20eebd9c832b5fd40d62fb6bae48227fffa65dd4e5be26d12f84", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000.000000", + "hours": 3042390 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46096, + "block_seq": 355, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c97bf2e161844d70686539eaec694b32678b130539946af8c3ec36f905e47d9a", + "inner_hash": "1e1f7265be9a1806a23a7f490fbd2f5c179e910102509dc4667e631115cad927", + "timestamp": 1472069152, + "fee": 22968235, + "sigs": [ + "085b5436b72b9ccd1b0e8001c42408ff90ecb544a027da4e18dd550933a7ef8f7a9b5a44939856f9f8d47a8805091696148ba86cc174cfe73604f0b34e43290400" + ], + "inputs": [ + { + "uxid": "a0ba6219e79ab6470430b6b387602b58c96ef57a850e9dc94af8da0dfedfcad1", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25314.000000", + "hours": 10499712, + "calculated_hours": 30618639 + } + ], + "outputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46095, + "block_seq": 356, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "7ca2667f49dc21f893f2273c592618b0238959ec9aecc881150d6507c6a1755e", + "inner_hash": "06516c42bb9cd1d9584281fc41497afbcdbcf50d227e33d56016d003f426e262", + "timestamp": 1472069172, + "fee": 2869037, + "sigs": [ + "8172d96cbb9f33bbe1a2852745015abd99c4702af53aa10a0124efe0a3e1a32766ec459367d62f21dce3b08361feda40eef78dc273577ee4c8f7a0ee5551bc6d00" + ], + "inputs": [ + { + "uxid": "207fcc6aa056e56256b21b73410f679d7e1e1af414e95891e23cd689affdefb9", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24314.000000", + "hours": 3825202, + "calculated_hours": 3825337 + } + ], + "outputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46094, + "block_seq": 357, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "ccf714517563cfb8a9d694a7a0ac534da01cb74e18d8a9cd0d410081970d8015", + "inner_hash": "0470dddb1c719ccb518dc8df7d0150373c61e19e3bbe0d2ced04a6ca66d71215", + "timestamp": 1472069232, + "fee": 359002, + "sigs": [ + "8d29d25b00cd13891c3af52b6481d173d186ac4281afdf5a9c0646a55664addd0edbde30ce3d51c3952571ba37f056f289adefc1dedb1dde3465d2a16de6a02c01" + ], + "inputs": [ + { + "uxid": "b636238d9d3c0eba57aeb47daa7a23bef5aac4021b636568d56c8428f62c6827", + "owner": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23314.000000", + "hours": 478150, + "calculated_hours": 478538 + } + ], + "outputs": [ + { + "uxid": "7e527dff560de74654aada4257259085486ea81716b577f7d8519a44beff78da", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22314.000000", + "hours": 59768 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46077, + "block_seq": 374, + "unknown": false + }, + "length": 511, + "type": 0, + "txid": "7a05ca15c9860700b34642339e91427ce0b211a8fe14805751d730f8ca0e5363", + "inner_hash": "34ef2b9ef8af1fb8d76b9ea9690356f2e0c20d1f672598020fa4e65aff25a9f5", + "timestamp": 1473696472, + "fee": 103067908, + "sigs": [ + "a45592c587087f22e42bbf5ea9061e0668bd7e8fb3daa9c8bde6a1f2644c2a373c91d0b874a2fa95a4ce94284cf663035f83bba786c0c356ae055b89cedd623301", + "d422b1658a5a49642bd1126a269eaa1c939849dd9ca179db7992f0c274a16d313c4b2c9bb8dba458895ad7f12590da944af0880cb75592c0f4185c9b510747c900", + "a4250a03285edf63270784bc3e0d655b709622dfdfdd99af0b6f85060d3f540e36eeba0ed719a415f67d3c542e2efdc93c0fcfd9b0c946cca5c0fa5abc9837d901", + "e89be88a2dfd2beb052d0b628a2b4c09c38c3d19751e0551a65a22b6d9b4ed305974e673c7cb5d7c0259eeea76f2044f708c1ea2abf8cf5d92c84c81eed30b4201" + ], + "inputs": [ + { + "uxid": "d13c10539700b17635d5ca63adb79f7da7faaab1d1c415fdf68e9a70ed5c633e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "273631.000000", + "hours": 3042390, + "calculated_hours": 126916663 + }, + { + "uxid": "059f33c1a1a9e33c2518a6ea915534d5093f8aaec9b1c69a82e5348dcac52f6e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 3825202, + "calculated_hours": 4277235 + }, + { + "uxid": "c91cd337ffa1a0e7d09ecd3c2f74c2932a5b7d9266b2e85205f64e5a7e8c5426", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 478150, + "calculated_hours": 930177 + }, + { + "uxid": "886eaf65af6434d07ca20fd4789825bbe87a61ff633fe1df15b69b9024b3cb99", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000.000000", + "hours": 59768, + "calculated_hours": 511779 + } + ], + "outputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973 + }, + { + "uxid": "aa975eb226edc45f46bc54bbbf08143ae1cc0cfedea598c536e1810b36d26258", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "1000.000000", + "hours": 14783973 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46076, + "block_seq": 375, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "9da07bf85e25c466daeb9e4bb8825161e2f2eb60ce470fecff30a557d8ab8d58", + "inner_hash": "2bf9ee9274c70c66f52d81df6b1f56bdbba9b17d3a67371ee45c94c0d91ffdad", + "timestamp": 1473696502, + "fee": 11090277, + "sigs": [ + "13d93765e882705c482307678fc2d7d4d10ec733626066d59a6ee0d83be0c3840f66e43dec32bc09b2dea074675e8cf1fb0e768891191657ff1e8895f6d24edc01" + ], + "inputs": [ + { + "uxid": "7cf5efd1f59555771e82dfbf11047cd856e554daac323e8224c174796b58cef1", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "275631.000000", + "hours": 14783973, + "calculated_hours": 14786269 + } + ], + "outputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996 + }, + { + "uxid": "cb7e5dd3539b632b7c8de80bdd2bede4890d306ddde001854b21003546bdeb4a", + "dst": "bVMBhye4BsMtB9bC6t6VnQoYkbLH5JEb5A", + "coins": "10000.000000", + "hours": 1847996 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46028, + "block_seq": 423, + "unknown": false + }, + "length": 220, + "type": 0, + "txid": "c0b00aa1fac000b225f3d59983d7be04b41dded7e70549cd118648c0f4120622", + "inner_hash": "409996e4103fb8a6d0a508cd1b4b3f3c0145f255461ed590e013a4a1cec87f53", + "timestamp": 1474976262, + "fee": 72562563, + "sigs": [ + "f11babcb58c0526909ab684968566c79f015a35eb5e800382847c58c12cd198b53cd8f5513139ba289ee547cbbbda6313516a8d18e10ee5497805d135020171c01" + ], + "inputs": [ + { + "uxid": "00813b3eebc56b3269dc82324b708ed031f816276eef23d2ec4dbaed0fe6be68", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "265631.000000", + "hours": 1847996, + "calculated_hours": 96276865 + } + ], + "outputs": [ + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151 + }, + { + "uxid": "9e5bd56c83575b8628dc1c497b7987bccd3cea12267782be95bf7cc9b47d6364", + "dst": "kW69Hh12ng6hqD6GsScVq6Bo6VDGTgq7Gx", + "coins": "20800.000000", + "hours": 11857151 + } + ] + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45960, + "block_seq": 491, + "unknown": false + }, + "length": 414, + "type": 0, + "txid": "127cae7ab2e851738fc4c9894dade853173c658317e5e551c0618f3c14de0c6e", + "inner_hash": "ae44ad68c8a6f83d22436a19ff274d5eeeceb7c515348c910cf09abea87b4449", + "timestamp": 1478603012, + "fee": 258641221, + "sigs": [ + "0a332a5c2c501b5fcf6d8ce21ef1aa6c82324dcaf5a4162a0ab8f6cada1ae56b19be195564263ace98db8a0b0b4c37a5ac080c5a55c76b2c9315980a025307b001", + "b2a3d81f2a2bd12ed1fc0d5bb9daa781a2553410902a25cfcf4c179165ef52936b86c4774ad3e9a4fbc2188f8fe7e5ad1949715c307ab4499b4d2bc2536bb2b600", + "e660d1823b2d2637c2da6080443410dadf90c8559e17b37b17fe51d553e2f26c0b71ee1b3a652b522b0f1cc17baef65f63457259b06fd6126fe4e2b1bf101e7d01" + ], + "inputs": [ + { + "uxid": "22f6cbb46c9d8566f6cdb3882dbd77bc473432c097b704c14457babd66da993d", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 3128290, + "calculated_hours": 3397718 + }, + { + "uxid": "d0e6c3ff06b1125d70a707f57b4888a96aa56fe26fbf0fc80ce7d560acc77f63", + "owner": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "400.000000", + "hours": 27225, + "calculated_hours": 489288 + }, + { + "uxid": "b220185a9f0f1a6af34e4b1ad882b7634d2fe9db3d1f8d7fdbc0815856abc06e", + "owner": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "244831.000000", + "hours": 11857151, + "calculated_hours": 258507381 + } + ], + "outputs": [ + { + "uxid": "4594bb2382ac97aa0cf3ae0eeeae2d2a0dbe96a6293d0bd715e2ce7165080977", + "dst": "2X6eRFh6pp6rUHj74NJXLcmTg1TnDaPyYCw", + "coins": "1000.000000", + "hours": 1876583 + }, + { + "uxid": "931267f628963f9faccfaaa4973cb20a4d28a02a8c97a89f83f91d3413af7af7", + "dst": "Qq7dG2S5jwNgpayJzBf7kTtfWmpfSQPCQ6", + "coins": "244631.000000", + "hours": 1876583 + } + ] + } +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden new file mode 100755 index 0000000..d5d5327 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf.golden @@ -0,0 +1,10 @@ +{ + "confirmed": { + "coins": 1000000000000, + "hours": 1013371112 + }, + "predicted": { + "coins": 1000000000000, + "hours": 1013371112 + } +} diff --git a/src/gui/integration/test-fixtures/wallet-balance.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-noaddrs.golden similarity index 100% rename from src/gui/integration/test-fixtures/wallet-balance.golden rename to vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-noaddrs.golden diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-two-addrs.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-two-addrs.golden new file mode 100755 index 0000000..9e35c7b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/balance-two-addrs.golden @@ -0,0 +1,10 @@ +{ + "confirmed": { + "coins": 1022100000000, + "hours": 1013748655 + }, + "predicted": { + "coins": 1022100000000, + "hours": 1013748655 + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash-genesis.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash-genesis.golden new file mode 100755 index 0000000..096c42b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash-genesis.golden @@ -0,0 +1,32 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash.golden new file mode 100755 index 0000000..498bc72 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-hash.golden @@ -0,0 +1,42 @@ +{ + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-last.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-last.golden new file mode 100755 index 0000000..ef9a824 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-last.golden @@ -0,0 +1,46 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-0.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-0.golden new file mode 100755 index 0000000..096c42b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-0.golden @@ -0,0 +1,32 @@ +{ + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-100.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-100.golden new file mode 100755 index 0000000..59fbc97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/block-seq-100.golden @@ -0,0 +1,36 @@ +{ + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-180.db b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-180.db new file mode 100755 index 0000000..f0908f2 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-180.db differ diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-metadata.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-metadata.golden new file mode 100755 index 0000000..38272ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-metadata.golden @@ -0,0 +1,13 @@ +{ + "head": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "unspents": 218, + "unconfirmed": 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-progress.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-progress.golden new file mode 100755 index 0000000..68f9318 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blockchain-progress.golden @@ -0,0 +1,5 @@ +{ + "current": 180, + "highest": 180, + "peers": null +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-all.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-all.golden new file mode 100755 index 0000000..faba6e2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-all.golden @@ -0,0 +1,8146 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 11, + "block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "previous_block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "timestamp": 1428808851, + "fee": 0, + "version": 0, + "tx_body_hash": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 12, + "block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "previous_block_hash": "70584db7fb8ab88b8dbcfed72ddc42a1aeb8c4882266dbb78439ba3efcd0458d", + "timestamp": 1428814821, + "fee": 0, + "version": 0, + "tx_body_hash": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 13, + "block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "previous_block_hash": "f8da14563b2fe7d532125e5c29be7f544d31d900e4703400cbcbf303f8703a04", + "timestamp": 1428814891, + "fee": 2, + "version": 0, + "tx_body_hash": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 14, + "block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "previous_block_hash": "3351bc6352bf9272c62d72869659d0013786485ef076e8727e03f561f819a06c", + "timestamp": 1428815131, + "fee": 0, + "version": 0, + "tx_body_hash": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 15, + "block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "previous_block_hash": "89ab3029eaf4fb979e29dfba29b41ed1b8734f2991098879ac239b2ee4d61c04", + "timestamp": 1428820169, + "fee": 51, + "version": 0, + "tx_body_hash": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 16, + "block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "previous_block_hash": "3b452626e9d6ee1e10e8619fcfd546623ff42bea2053f3b413b719c501edd195", + "timestamp": 1428820629, + "fee": 0, + "version": 0, + "tx_body_hash": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 17, + "block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "previous_block_hash": "4281345d031e0698c18e51f97aa78bbf05672b024209a296acb82ef62c15cf26", + "timestamp": 1428989855, + "fee": 2020394, + "version": 0, + "tx_body_hash": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 18, + "block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "previous_block_hash": "eba02044b893c04609b8a6486a5cbc58bf98dbe8bb970ff9bc23c8cde95576da", + "timestamp": 1428989925, + "fee": 0, + "version": 0, + "tx_body_hash": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 19, + "block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "previous_block_hash": "b2b1eb77b4bd3876b2cb33e97e436f2e66a9bc60e7221b6f2bfec19c0ca0fa63", + "timestamp": 1428990115, + "fee": 1134, + "version": 0, + "tx_body_hash": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 20, + "block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "previous_block_hash": "68d19da9e71cbe45ac65906d399e3be68591b26d05a4dff39e696ecec36f81f0", + "timestamp": 1428990135, + "fee": 756, + "version": 0, + "tx_body_hash": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 21, + "block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "previous_block_hash": "ff403326d2bd8a047f65ffb4aff00e155d58aebf7feddcd91e290d694c0c5773", + "timestamp": 1428991365, + "fee": 504, + "version": 0, + "tx_body_hash": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 22, + "block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "previous_block_hash": "7f3053b91f6e33a53f9bf7e908f8872b109462d1e2ee394f575bff805a31890a", + "timestamp": 1428991585, + "fee": 0, + "version": 0, + "tx_body_hash": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 23, + "block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "previous_block_hash": "357e1da88c19175600e9f071a6b4984f7ed2c0532f3678122fd8547e441cac74", + "timestamp": 1428991605, + "fee": 0, + "version": 0, + "tx_body_hash": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 24, + "block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "previous_block_hash": "4e0f335204906a11c17ac9837ac911b33309e5c8466e9b05fd3c6010990da342", + "timestamp": 1428991635, + "fee": 0, + "version": 0, + "tx_body_hash": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 25, + "block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "previous_block_hash": "1de41dd34dac9a54143fdfb8cb59957cb0865bf2d7e17e4d7b44523ee87a2f54", + "timestamp": 1428991665, + "fee": 0, + "version": 0, + "tx_body_hash": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 26, + "block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "previous_block_hash": "fadde28e30972cab6974572e6d19b6ecf367c126b3cff677731e33ceafde6c28", + "timestamp": 1429011077, + "fee": 3407635, + "version": 0, + "tx_body_hash": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 27, + "block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "previous_block_hash": "5bba72f7f8eedda5ac16ee86f344e396172d57e0f32d8f90af68d05790590727", + "timestamp": 1429011137, + "fee": 425954, + "version": 0, + "tx_body_hash": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 28, + "block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "previous_block_hash": "ad03a81878334d1340e7304524bfda3eda386016170543605218cb7e580da2cc", + "timestamp": 1429020387, + "fee": 214, + "version": 0, + "tx_body_hash": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 29, + "block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "previous_block_hash": "1a6309d7463f89b08b1e89d6688a13e4901eb457aa48450fd4f5d85d93d4c2b3", + "timestamp": 1429020687, + "fee": 551, + "version": 0, + "tx_body_hash": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 30, + "block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "previous_block_hash": "75b035753c6099f478cdda4f3ac0001d2a3627280df12dd20207e229eac4daee", + "timestamp": 1429021044, + "fee": 31, + "version": 0, + "tx_body_hash": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 31, + "block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "previous_block_hash": "47695088da9067532b6733366f5b3379c9946721a0bba7dae98d697391a4546b", + "timestamp": 1429021184, + "fee": 60, + "version": 0, + "tx_body_hash": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 32, + "block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "previous_block_hash": "59770eade7313701b4470c4128cc418ecb5958675d71b7fbfb3cac38b3668741", + "timestamp": 1429021214, + "fee": 8, + "version": 0, + "tx_body_hash": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 33, + "block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "previous_block_hash": "cf47f574509b704cf4fc7ed787de91cfd14e8e7fed745fab27db54311cd4a9d2", + "timestamp": 1429021674, + "fee": 9, + "version": 0, + "tx_body_hash": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 34, + "block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "previous_block_hash": "ab7c5b8eefedea15e05e0fcd52a01b3b87f009c4c9f53127272b8804d00bfd74", + "timestamp": 1429021994, + "fee": 1, + "version": 0, + "tx_body_hash": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 35, + "block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "previous_block_hash": "ffc59d36008eb3bae90c37e4942a884ab8a51c87370243ecab2f6ce4a45cbc87", + "timestamp": 1429022034, + "fee": 0, + "version": 0, + "tx_body_hash": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 36, + "block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "previous_block_hash": "18d0cf1ff691931a24fcf4b7870d68da6487f3f4595cbf68df854da2972d919f", + "timestamp": 1429022064, + "fee": 0, + "version": 0, + "tx_body_hash": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 37, + "block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "previous_block_hash": "e2fb290dd1103f2fa0ed51279d0a1d4631c0535a6e9abf95d94cabab485f8d2b", + "timestamp": 1429022094, + "fee": 0, + "version": 0, + "tx_body_hash": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 38, + "block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "previous_block_hash": "87ea823bf69a2e24b92fda4b8150d1318df8fde8f4443354df604e76b497d7a0", + "timestamp": 1429058484, + "fee": 2335473, + "version": 0, + "tx_body_hash": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 39, + "block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "previous_block_hash": "812d40f14869b362f41859db216ade292a60db6f3d567e308e08fbd07b032892", + "timestamp": 1429058494, + "fee": 291935, + "version": 0, + "tx_body_hash": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 40, + "block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "previous_block_hash": "08a109060182ac50db40931ddfbafe8733a0817f1b0dcd83ac692d466c48a1e1", + "timestamp": 1429058514, + "fee": 36493, + "version": 0, + "tx_body_hash": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 41, + "block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "previous_block_hash": "fad5aca57144cbc86ad916492e814ec84c825d9870a86beac81980de30b0ae60", + "timestamp": 1429058524, + "fee": 4561, + "version": 0, + "tx_body_hash": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 42, + "block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "previous_block_hash": "08f89cfe92be09e9848ba4d77c300908761354933f80401c107644feab1f4c9e", + "timestamp": 1429058594, + "fee": 292512, + "version": 0, + "tx_body_hash": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 43, + "block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "previous_block_hash": "60a17e0cf411e5db7150272e597d343beaa5fbce5d61f6f647a14288262593b1", + "timestamp": 1429070374, + "fee": 1596, + "version": 0, + "tx_body_hash": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 44, + "block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "previous_block_hash": "b98060fcb099ad4dcb6c5f7654bcad99be31375a72a2d30b4e90af4597091149", + "timestamp": 1429070414, + "fee": 199, + "version": 0, + "tx_body_hash": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 45, + "block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "previous_block_hash": "9fd770857cc65c7d7865a318ea1f6df00a9b589937e2c583188f9301c96f2f7f", + "timestamp": 1429071074, + "fee": 2402820, + "version": 0, + "tx_body_hash": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 46, + "block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "previous_block_hash": "90a6673c7f7c70884c2ff52a40f6b1de2d0e5e9f763787c7467d6f27d968f187", + "timestamp": 1429077374, + "fee": 300354, + "version": 0, + "tx_body_hash": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 47, + "block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "previous_block_hash": "9ac2b1b1d2a7ea6bbc6049f174ba1d82e7bc381438fddad5868d0b2554389aa6", + "timestamp": 1429077384, + "fee": 37544, + "version": 0, + "tx_body_hash": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 48, + "block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "previous_block_hash": "5709133095b892fee42c20c0b1264e923a0abf75f752768824d86f76d08d9280", + "timestamp": 1429077394, + "fee": 4693, + "version": 0, + "tx_body_hash": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 49, + "block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "previous_block_hash": "aced5a17671fa788542d5c6d5bd1ff8b65714c77a463eeb788e2eb459d710aaf", + "timestamp": 1429077404, + "fee": 588, + "version": 0, + "tx_body_hash": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 50, + "block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "previous_block_hash": "e74d6630120b2c1f57a7176ef763246609165c33b8974fa29fad95c9654d894f", + "timestamp": 1429077474, + "fee": 71833, + "version": 0, + "tx_body_hash": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 51, + "block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "previous_block_hash": "96d249272364547bf1bb6626b99568415384db2bffa0a45c721a62cae6e76ceb", + "timestamp": 1429077484, + "fee": 44061, + "version": 0, + "tx_body_hash": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 52, + "block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "previous_block_hash": "616d09296fd9dfa108d859a8fc5042252e1a9b88277df2e5adef2336559b52f5", + "timestamp": 1429077494, + "fee": 8996, + "version": 0, + "tx_body_hash": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 53, + "block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "previous_block_hash": "8536b8ff98e646a4a56c5a1a6a8ab72a41a48b72dea6fb35748e5dd4ee8e2e0d", + "timestamp": 1429077514, + "fee": 17787, + "version": 0, + "tx_body_hash": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 54, + "block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "previous_block_hash": "a8f4e293af2cec10febbd7b632c8ed15477cae6dfd98060d007fc2538a4d2b39", + "timestamp": 1429077524, + "fee": 1153, + "version": 0, + "tx_body_hash": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 55, + "block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "previous_block_hash": "a6f4b95091450f21961f12aabd6ff7791aec37b775a9728a0fd970124aa82e85", + "timestamp": 1429077544, + "fee": 5583, + "version": 0, + "tx_body_hash": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 56, + "block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "previous_block_hash": "62cdb4edf2a82b894ee0540a494979007ea32ada552321c3daf00700659652b3", + "timestamp": 1429077554, + "fee": 76179, + "version": 0, + "tx_body_hash": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 57, + "block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "previous_block_hash": "8ffb8910411fee24ddbed4b8775a2d9254f644b12c48f05b3edc6aaf5c0161b1", + "timestamp": 1429077584, + "fee": 10088, + "version": 0, + "tx_body_hash": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 58, + "block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "previous_block_hash": "371e2ba60743ca0c07e2fd88b3b53ba39fb0cb9e6aad12a7761e6821903ed25c", + "timestamp": 1429077604, + "fee": 220, + "version": 0, + "tx_body_hash": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 59, + "block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "previous_block_hash": "f1ac8e75dc1d735737bd0d6f7bbecec46283352f100a70b5b8d26835640c210e", + "timestamp": 1429077614, + "fee": 799, + "version": 0, + "tx_body_hash": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 60, + "block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "previous_block_hash": "439660598874b2e404075928f537ae474b5239ce650f24507429f47f292d3dff", + "timestamp": 1429077624, + "fee": 9636, + "version": 0, + "tx_body_hash": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 61, + "block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "previous_block_hash": "5461cd2134a695ade2c7bdf53f7ad18bbc6635d4241e609e7612ac2a7387ba37", + "timestamp": 1429077654, + "fee": 9118, + "version": 0, + "tx_body_hash": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 62, + "block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "previous_block_hash": "bd5ecd0a7a96b94b93406a27ddcf4155db32ae7434e19d1210412f86d62401cc", + "timestamp": 1429077664, + "fee": 79, + "version": 0, + "tx_body_hash": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 63, + "block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "previous_block_hash": "e103dbe63feed4fab951dd5de742ace3fd72750f7d48c4940f55f65bd7dca7b1", + "timestamp": 1429077684, + "fee": 1271, + "version": 0, + "tx_body_hash": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 64, + "block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "previous_block_hash": "cf9cdcc235d2bb70cf8ef1420d42f35893fe0c2645540bde77694a000f63c274", + "timestamp": 1429077694, + "fee": 7026, + "version": 0, + "tx_body_hash": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 65, + "block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "previous_block_hash": "b6692c358b6642ca1321509e032a479086ff3ebeb596957e12c4c2e5b68c24be", + "timestamp": 1429077724, + "fee": 36, + "version": 0, + "tx_body_hash": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 66, + "block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "previous_block_hash": "a8dd413f76f33d5cc1abd6d429098a75805137a02d8100fbd98f1b2fca62af70", + "timestamp": 1429077734, + "fee": 259, + "version": 0, + "tx_body_hash": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 67, + "block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "previous_block_hash": "0816061820617c7318004eb8893b7b7c49fcac1fda0c655d6f75c57edcf5a1a5", + "timestamp": 1429077874, + "fee": 8718, + "version": 0, + "tx_body_hash": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 68, + "block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "previous_block_hash": "7b9a543120ed5b65c8b988b763e09b4ddc9c36eabe1c56d0fd7b26072eaf9fe9", + "timestamp": 1429077914, + "fee": 1090, + "version": 0, + "tx_body_hash": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 69, + "block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "previous_block_hash": "0916d93411a574d88a89d8b7646b1876b036e10905cb8fc04d81e1f09a1c3459", + "timestamp": 1429077944, + "fee": 137, + "version": 0, + "tx_body_hash": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 70, + "block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "previous_block_hash": "8a65ad3031102e032275f0c24bcda248a5af548eef4cff5570f9530ced70ce5a", + "timestamp": 1429077964, + "fee": 18, + "version": 0, + "tx_body_hash": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 71, + "block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "previous_block_hash": "3ef495620acbcd39eb8a0ecbcac390b72be620c81c2e5c8730bd7457bd1ecb3e", + "timestamp": 1429077974, + "fee": 2, + "version": 0, + "tx_body_hash": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 72, + "block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "previous_block_hash": "1ce626f7ffc4affe11bcbac9b0eea5d23383803c714be1af8f97b1e58aef1138", + "timestamp": 1429078004, + "fee": 558, + "version": 0, + "tx_body_hash": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43" + }, + "body": { + "txns": [ + { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + ] + }, + "size": 414 + }, + { + "header": { + "seq": 73, + "block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "previous_block_hash": "8daa2e02f6154135a2ecb309ab14a1a3af7101d53ee1a35c15335e463b21c883", + "timestamp": 1429091164, + "fee": 2326, + "version": 0, + "tx_body_hash": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 74, + "block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "previous_block_hash": "21ac5c256658c7758d4f6dccc34e209bc9ef1433f4036cdd7eff722c9f29a83e", + "timestamp": 1429091944, + "fee": 43640, + "version": 0, + "tx_body_hash": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 75, + "block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "previous_block_hash": "bc712ef025d1281c3fc4922d64f1afdcf1bc6750b15239239a19d02c11284842", + "timestamp": 1429096344, + "fee": 5455, + "version": 0, + "tx_body_hash": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 76, + "block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "previous_block_hash": "ef4a2e771d88df1deea69cd55f952bc5e9e6f32424e6f4b5ff35ba05602a9584", + "timestamp": 1429110544, + "fee": 432263, + "version": 0, + "tx_body_hash": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 77, + "block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "previous_block_hash": "bc51c3788411589efac68dcaef915a14d83aecdbeb250cc48073774997e6cb28", + "timestamp": 1429147880, + "fee": 5860904, + "version": 0, + "tx_body_hash": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 78, + "block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "previous_block_hash": "fc15f0118c4aafe443e8bd919355a89d61c88d22cc63b024ebb7872dbdb60497", + "timestamp": 1429147900, + "fee": 407859, + "version": 0, + "tx_body_hash": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 79, + "block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "previous_block_hash": "6b8644bdfe7c2542fdcc03e15cf453d9d66604b728014fa4999797a89909bd0c", + "timestamp": 1429147950, + "fee": 466755, + "version": 0, + "tx_body_hash": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 80, + "block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "previous_block_hash": "1313f73aa897ea032ac1de0741d0b026617933f863f59c4cfd0a3c7cf764f02e", + "timestamp": 1429148000, + "fee": 51265, + "version": 0, + "tx_body_hash": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 81, + "block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "previous_block_hash": "c3979d6a8c7b58e677c39350f3aea483ee4ca197d5e76d4a91f1abfdec9e4dc7", + "timestamp": 1429164440, + "fee": 754183, + "version": 0, + "tx_body_hash": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 82, + "block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "previous_block_hash": "44462e4f9906885068ab6e00e4d84ecfc2c17dfa599e41fb75805e035cb7b60d", + "timestamp": 1429164460, + "fee": 558303, + "version": 0, + "tx_body_hash": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 83, + "block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "previous_block_hash": "d85c2e5a18844748cf354231f22106bf82ff6f860414d5b7d5e2afd52ea7c221", + "timestamp": 1429164480, + "fee": 164971, + "version": 0, + "tx_body_hash": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 84, + "block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "previous_block_hash": "af3db7055c27674d622fe70a3037e704900cdc4ec250972896df53da5f3d8755", + "timestamp": 1429164590, + "fee": 20623, + "version": 0, + "tx_body_hash": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 85, + "block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "previous_block_hash": "65d91ebf581ddf3b620d960d20130e6ef881530b64030648330896b8a0bc0c29", + "timestamp": 1429164620, + "fee": 121202, + "version": 0, + "tx_body_hash": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 86, + "block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "previous_block_hash": "fcd2ae4cba80370929bc573a2ddeedc6b57750e4b58e5c063c5f17bb66e938ff", + "timestamp": 1429164720, + "fee": 15150, + "version": 0, + "tx_body_hash": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 87, + "block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "previous_block_hash": "21213b77aac2c84f332a43cbb89d7dbbb56e4de7c294fa50573d5f4165504d57", + "timestamp": 1429164730, + "fee": 96974, + "version": 0, + "tx_body_hash": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 88, + "block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "previous_block_hash": "60279d08fadb94691ae4a32b29f69688dcc5e7b6f8e8d03fb3ff398d2c6f8456", + "timestamp": 1429164790, + "fee": 71476, + "version": 0, + "tx_body_hash": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 89, + "block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "previous_block_hash": "5a708b4af0e1db02adb4016fb035b1df8bb3fe968b5de2c5c98178c4f3a209f9", + "timestamp": 1429164800, + "fee": 3816, + "version": 0, + "tx_body_hash": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 90, + "block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "previous_block_hash": "4fc95139dde67484d9613adb8d235ae42f8e6ec690377daf5f7e6afd375d3624", + "timestamp": 1429164810, + "fee": 16229, + "version": 0, + "tx_body_hash": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 91, + "block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "previous_block_hash": "67d69d26e52c111625cb26629f53fb9d1fc350e584b14a42749a50a26bd0bb47", + "timestamp": 1429164830, + "fee": 12539, + "version": 0, + "tx_body_hash": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 92, + "block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "previous_block_hash": "b3d041858a5865ead4edad6acb81406ee59c8b32013e4de96405bb40929f24e0", + "timestamp": 1429164850, + "fee": 9176, + "version": 0, + "tx_body_hash": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 93, + "block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "previous_block_hash": "32487462ed6177eadb936cc788ecd6be103f4ee7f2fc16082b99132343ef8fc3", + "timestamp": 1429164860, + "fee": 775, + "version": 0, + "tx_body_hash": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 94, + "block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "previous_block_hash": "2721f47fc405131d29c5eddcca1a1d13e508444b9b24e999d1d67e1ddd4ecabb", + "timestamp": 1429164870, + "fee": 10977, + "version": 0, + "tx_body_hash": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 95, + "block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "previous_block_hash": "05e3a9d7a0ddbc08fb514ab0d8033a71540b16a317170bd2a3db762ea1a1928d", + "timestamp": 1429164880, + "fee": 1767, + "version": 0, + "tx_body_hash": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 96, + "block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "previous_block_hash": "a054e14b9c7b9e298b04ba7f3a68270fe9e5fd8184b992917519bd7c038bc53c", + "timestamp": 1429164900, + "fee": 1322, + "version": 0, + "tx_body_hash": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 97, + "block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "previous_block_hash": "2e30e4dc35301e6f227149d29acbcd9d3f6847963cd4ef8ec31a7bad8b57c534", + "timestamp": 1429165260, + "fee": 328, + "version": 0, + "tx_body_hash": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 98, + "block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "previous_block_hash": "fcc06bfe75b62dcb87e2dcb31f6c1a58d5ba2f2b85576938a9dc49b971b60a75", + "timestamp": 1429274566, + "fee": 71088, + "version": 0, + "tx_body_hash": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 99, + "block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "previous_block_hash": "0f4c792700593207a217101aa6349e2737a519de1d5f9f670aa1f550d52cc615", + "timestamp": 1429274616, + "fee": 52573, + "version": 0, + "tx_body_hash": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a" + }, + "body": { + "txns": [ + { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + ] + }, + "size": 571 + }, + { + "header": { + "seq": 100, + "block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "previous_block_hash": "5c06896760ace71b02edab01700ff9ca8c32ef1d647e14c3e0d5fa751e47867e", + "timestamp": 1429274636, + "fee": 613712, + "version": 0, + "tx_body_hash": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 101, + "block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "previous_block_hash": "725e76907998485d367a847b0fb49f08536c592247762279fcdbd9907fee5607", + "timestamp": 1429274666, + "fee": 720335, + "version": 0, + "tx_body_hash": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 102, + "block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "previous_block_hash": "8156057fc823589288f66c91edb60c11ff004465bcbe3a402b1328be7f0d6ce0", + "timestamp": 1429274686, + "fee": 710046, + "version": 0, + "tx_body_hash": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 103, + "block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "previous_block_hash": "311f4b83b4fdb9fd1d45648115969cf4b3aab2d1acad9e2aa735829245c525f3", + "timestamp": 1429278106, + "fee": 76077, + "version": 0, + "tx_body_hash": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 104, + "block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "previous_block_hash": "db1e858f66b595214807404728ec4b608d208f1c1f211d1785213b6a09091106", + "timestamp": 1429278406, + "fee": 82382, + "version": 0, + "tx_body_hash": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 105, + "block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "previous_block_hash": "a67dbd55b75c2613280d3bda4b84d33bc3df5105012a345009a96589d1429374", + "timestamp": 1429278556, + "fee": 11173, + "version": 0, + "tx_body_hash": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 106, + "block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "previous_block_hash": "08622b79bb7e9b79e043152dd8ef759cf9ee8871449d80cc31343736b5aa16c0", + "timestamp": 1429279796, + "fee": 835759, + "version": 0, + "tx_body_hash": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf" + }, + "body": { + "txns": [ + { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + ] + }, + "size": 511 + }, + { + "header": { + "seq": 107, + "block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "previous_block_hash": "6a6db10e08b05f6ccb228ab7fee8b2e3ea10e47c126a43ec8bb6ecf13595329f", + "timestamp": 1429280596, + "fee": 104471, + "version": 0, + "tx_body_hash": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 108, + "block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "previous_block_hash": "c3e1ef118832446f245de2abcfeb0ef1569f1d4861f6571a63b9d969b275e118", + "timestamp": 1429280756, + "fee": 20746, + "version": 0, + "tx_body_hash": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 109, + "block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "previous_block_hash": "19daeb3b8c9a1c1c30c4c190eec4496c729c7a32e90245b106e252c908fc5053", + "timestamp": 1429302756, + "fee": 42555, + "version": 0, + "tx_body_hash": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 110, + "block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "previous_block_hash": "387c3847ecb312cc873beacaa6cc6e4b71b9fc11532c6b6683e80707a99a0bb5", + "timestamp": 1429326351, + "fee": 107094, + "version": 0, + "tx_body_hash": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 111, + "block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "previous_block_hash": "9ba608780f4f2a6652b689e61d2d522059e93c0a0bd25c1b40502d127d824c33", + "timestamp": 1429348072, + "fee": 13386, + "version": 0, + "tx_body_hash": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 112, + "block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "previous_block_hash": "8be6b19ea7791d7fe43c49191cd3d73f182dc11cef660046e5450d2b56d0843c", + "timestamp": 1429348102, + "fee": 8332864, + "version": 0, + "tx_body_hash": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 113, + "block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "previous_block_hash": "e824946623309bf11d149b257ccd65d66dda02a693e83ecc0cd4429f53b472d7", + "timestamp": 1429348172, + "fee": 1041608, + "version": 0, + "tx_body_hash": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 114, + "block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "previous_block_hash": "46c2b611585a58ba3cb400970c3ff156fb62b7ca40bd9f8ab37979ebbc69e27d", + "timestamp": 1429348502, + "fee": 130201, + "version": 0, + "tx_body_hash": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 115, + "block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "previous_block_hash": "559fbe3f6619596631de1c1ea3e81b170cfe73fcc3ea08588897da22baab8e19", + "timestamp": 1429348712, + "fee": 16276, + "version": 0, + "tx_body_hash": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 116, + "block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "previous_block_hash": "504fd4a569f4b3ee5182b12fb082dba7d4853fa40977a4a2dad43143ee616db3", + "timestamp": 1429349392, + "fee": 388717, + "version": 0, + "tx_body_hash": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 117, + "block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "previous_block_hash": "87ac9b17ffc3169eb0ac6e758e62a37f9034c294a8fe5b223d9b127fbb7a9f25", + "timestamp": 1429351912, + "fee": 125795, + "version": 0, + "tx_body_hash": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 118, + "block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "previous_block_hash": "0c20262e8f6a28d63f1b7f9a8b0e4bc6801ffb0c6a3676c06a5b2903f865416a", + "timestamp": 1429364072, + "fee": 184620, + "version": 0, + "tx_body_hash": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 119, + "block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "previous_block_hash": "d041c16ee3e7ea54503cddfc4ade9b21b3dce9cb17ebd531a2d52fa122aaee69", + "timestamp": 1429364282, + "fee": 23077, + "version": 0, + "tx_body_hash": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 120, + "block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "previous_block_hash": "47c5bf33a544cb4f0a8e7ecfea9db40f43467ae8b8c80ba1d1cc8a39063ea05c", + "timestamp": 1429364452, + "fee": 3366, + "version": 0, + "tx_body_hash": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 121, + "block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "previous_block_hash": "644bd4cc468983f429fc64e2ed43338eb0c5def9e12c6b7a0784c4fa928abff6", + "timestamp": 1429382678, + "fee": 2271879, + "version": 0, + "tx_body_hash": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 122, + "block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "previous_block_hash": "48a34e6f6371d5e93cea488f9615bc64b305b47d82cd813218bfc92e5fad2a3e", + "timestamp": 1429382898, + "fee": 283986, + "version": 0, + "tx_body_hash": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 123, + "block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "previous_block_hash": "42a88e86cb431b2464cd40554a46374775854e588df3c0ec3164b55290c95fec", + "timestamp": 1429451746, + "fee": 35498, + "version": 0, + "tx_body_hash": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 124, + "block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "previous_block_hash": "d6be10dec288c68139841963f3bca742ed29a1a042658ed699bbfad206cb3f4d", + "timestamp": 1429522086, + "fee": 4438, + "version": 0, + "tx_body_hash": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 125, + "block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "previous_block_hash": "d01a6811cc796d32d915257986177c5cf12dbd5f010bfff736457a114f9b6eb2", + "timestamp": 1429578056, + "fee": 555, + "version": 0, + "tx_body_hash": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 126, + "block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "previous_block_hash": "7f18db3c23f1c460e331749b92b08495b33f9da515e821f6faba239dfc1aaf9d", + "timestamp": 1429680646, + "fee": 103861, + "version": 0, + "tx_body_hash": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 127, + "block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "previous_block_hash": "c25b843a329012e23094468a8485c6d989645478307e717db2b17c265d38646a", + "timestamp": 1429848410, + "fee": 3170256, + "version": 0, + "tx_body_hash": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 128, + "block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "previous_block_hash": "a5bea6636befe12f8eaef92076d54e95c00c83724d6a00a78027c0b656cf0e0e", + "timestamp": 1429849170, + "fee": 41968911, + "version": 0, + "tx_body_hash": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 129, + "block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "previous_block_hash": "c55baca575f3902afc4865ccd856eae4833c7484524483df172a175c3e1a7d3c", + "timestamp": 1429849180, + "fee": 401128, + "version": 0, + "tx_body_hash": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 130, + "block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "previous_block_hash": "41bf956d514a87cff4231377b2d3487eb40ef2d804be347237caf75884f4cb4b", + "timestamp": 1430311531, + "fee": 50142, + "version": 0, + "tx_body_hash": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 131, + "block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "previous_block_hash": "b591d8741ee1c0996048ec1abf04fee1f46beac77636169f1e2399d275391bd4", + "timestamp": 1430330041, + "fee": 76257058, + "version": 0, + "tx_body_hash": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 132, + "block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "previous_block_hash": "c81304abb915e3332344b876e675628dd3af311f03e975013d45fef36724bf7b", + "timestamp": 1430330311, + "fee": 9532133, + "version": 0, + "tx_body_hash": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 133, + "block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "previous_block_hash": "cdfc8bac020e63a5735750e39bc23e4a309cdc4014e025268020a8019fa33c99", + "timestamp": 1430330421, + "fee": 1191516, + "version": 0, + "tx_body_hash": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 134, + "block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "previous_block_hash": "5377b5ef4c36dffa9e699a532e927898084d1a101cf557880bbc50b51a733de5", + "timestamp": 1430330481, + "fee": 148940, + "version": 0, + "tx_body_hash": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 135, + "block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "previous_block_hash": "d42fdd801ccc75cb92fcf63cddbe05adfe6e8d580ea65de0f94332db3f2fd79f", + "timestamp": 1430330591, + "fee": 18619, + "version": 0, + "tx_body_hash": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 136, + "block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "previous_block_hash": "6ff9e724f389a79b0f36dbda6c527a77a5ea848c514c5f96b67c659b57146750", + "timestamp": 1430330851, + "fee": 2328, + "version": 0, + "tx_body_hash": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 137, + "block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "previous_block_hash": "227f82c4b9f509c3f346f0222855b3311924dc8bbcfca3e2e7431592373df2d5", + "timestamp": 1430504186, + "fee": 291, + "version": 0, + "tx_body_hash": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 138, + "block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "previous_block_hash": "7597c9f66417a8899eda6964240907092e878cc192b235b6e1a06a288de2d733", + "timestamp": 1430504236, + "fee": 36, + "version": 0, + "tx_body_hash": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 139, + "block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "previous_block_hash": "205b52696e2ddc66a276041abeaff192865672a34678046e7b88c4c8d64543b1", + "timestamp": 1430504536, + "fee": 6, + "version": 0, + "tx_body_hash": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 140, + "block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "previous_block_hash": "9c31d9340bc0aab07837b78625468101d643044d4b38d3a63ec3af92007ae9d7", + "timestamp": 1430504746, + "fee": 0, + "version": 0, + "tx_body_hash": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 141, + "block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "previous_block_hash": "939d45a9e5f77daf83af0dd2346f69d92a2ee7cc118038bd20d16ccf848ad344", + "timestamp": 1430504846, + "fee": 0, + "version": 0, + "tx_body_hash": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 142, + "block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "previous_block_hash": "71ad597d194d7090c1b3bbb8b37dc281fede373eaa81dab6d07226460f36e7b5", + "timestamp": 1430504966, + "fee": 0, + "version": 0, + "tx_body_hash": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 143, + "block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "previous_block_hash": "5415760993e68334d9c577322e1c0b81f16ca724417174193c243ad8acef5765", + "timestamp": 1430505086, + "fee": 0, + "version": 0, + "tx_body_hash": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 144, + "block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "previous_block_hash": "a6f2d5edeea837fd64c910f9dd0f09cb28f689e014a4f602376aeb7bd36ebc37", + "timestamp": 1430505176, + "fee": 0, + "version": 0, + "tx_body_hash": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 145, + "block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "previous_block_hash": "ad7799389d51ded0047284b4ab00fef54496c30b7ec21c5d22bb93431f5601a6", + "timestamp": 1430550936, + "fee": 693939, + "version": 0, + "tx_body_hash": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275" + }, + "body": { + "txns": [ + { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + ] + }, + "size": 280 + }, + { + "header": { + "seq": 146, + "block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "previous_block_hash": "cb389e98bed24ef05313da0275c4b8e4d8038442b06d49fafa6217531fbc9963", + "timestamp": 1430641376, + "fee": 6894507, + "version": 0, + "tx_body_hash": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 147, + "block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "previous_block_hash": "2e2d340c74deff80c804908b46a355605fdad219e70839d2288dfaffd5d8ff3b", + "timestamp": 1430641536, + "fee": 861814, + "version": 0, + "tx_body_hash": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 148, + "block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "previous_block_hash": "cf865cf260b6cf99c38563043300120213ddd03e385210e26c8b5ce8de212834", + "timestamp": 1430642006, + "fee": 107727, + "version": 0, + "tx_body_hash": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 149, + "block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "previous_block_hash": "89f6c33a3c65eadc28e5f84fb25422d21fd06f98ae60b824b8eccfddaaa24fb9", + "timestamp": 1430642106, + "fee": 13466, + "version": 0, + "tx_body_hash": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 150, + "block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "previous_block_hash": "4756bf71efc974ffaa99a1e06a9ca9cbe57784979cf270e72cd0e1955e777db5", + "timestamp": 1430642306, + "fee": 1684, + "version": 0, + "tx_body_hash": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 151, + "block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "previous_block_hash": "746494f2e6aaa279cabea4cc0d46b1d95044e3f778fa26d39d21f5bf505cf2dc", + "timestamp": 1430642426, + "fee": 210, + "version": 0, + "tx_body_hash": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 152, + "block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "previous_block_hash": "8fe743db56634fe05a28ac3479ff4b35c2324f8fde1115b582f85e42eda95482", + "timestamp": 1430642546, + "fee": 27, + "version": 0, + "tx_body_hash": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 153, + "block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "previous_block_hash": "febfd5d251995c214b17c3d71972f7048a171982fe7f4f7abb6998b485b95cd1", + "timestamp": 1430642816, + "fee": 4, + "version": 0, + "tx_body_hash": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 154, + "block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "previous_block_hash": "84dbe57c5d58b0b412d23e66e47578df7be40779c3dfb55178e08d1aa7921df5", + "timestamp": 1430643706, + "fee": 0, + "version": 0, + "tx_body_hash": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 155, + "block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "previous_block_hash": "54c4a6402aa7074c6857844f64e185401d674c4e6f15627b5c1a8fd3e0e568f1", + "timestamp": 1430643906, + "fee": 0, + "version": 0, + "tx_body_hash": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 156, + "block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "previous_block_hash": "04d1b2a0a9e6ab9035cb8265cb2f75af6a5c31bb9a6f927f545be08a9b1379cf", + "timestamp": 1430644036, + "fee": 0, + "version": 0, + "tx_body_hash": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 157, + "block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "previous_block_hash": "ce3bfce7158586ef1c9080fd8e8dd2017ebb7ec2a9634b03cc2c359fa4cefba6", + "timestamp": 1430673946, + "fee": 0, + "version": 0, + "tx_body_hash": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 158, + "block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "previous_block_hash": "05187ea3b0ba876a138a518ac4d1ff1100251701481d348e8c94864bb2b00435", + "timestamp": 1430674696, + "fee": 0, + "version": 0, + "tx_body_hash": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 159, + "block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "previous_block_hash": "3437e493d6e8a8a970b549eca7592ae46da9e243c75694de0e214f82740a0199", + "timestamp": 1430715196, + "fee": 0, + "version": 0, + "tx_body_hash": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 160, + "block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "previous_block_hash": "ff9538e4db5d5e121eca8a500c56842ce413d9a28187afeea2057bc16daf1eee", + "timestamp": 1430784172, + "fee": 0, + "version": 0, + "tx_body_hash": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 161, + "block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "previous_block_hash": "a1c8c6cb45bb12cb563b9554d71c9fb8fe9c4d6e902b664d2a5ca6007256d75a", + "timestamp": 1430784312, + "fee": 0, + "version": 0, + "tx_body_hash": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 162, + "block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "previous_block_hash": "fe3bc8a9bd17eb6583d9f4e806c20c8d8f89382df32f6a3b6bb8de6a2faf1ee6", + "timestamp": 1430784372, + "fee": 0, + "version": 0, + "tx_body_hash": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 163, + "block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "previous_block_hash": "2aaa458d90b3377fd219aef75821b4c8dbd61dafea93deb70ec6282adb08cf7c", + "timestamp": 1430784932, + "fee": 0, + "version": 0, + "tx_body_hash": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 164, + "block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "previous_block_hash": "64a69161afc94dc8abf04dae5e1db3dd37a1bc6d92721301262e3b5b97b2ed7e", + "timestamp": 1430790052, + "fee": 0, + "version": 0, + "tx_body_hash": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 165, + "block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "previous_block_hash": "da48eaee8f9f968a7a13d3a480eba216342593079cc3877bd08b7121589d1e09", + "timestamp": 1430790152, + "fee": 0, + "version": 0, + "tx_body_hash": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 166, + "block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "previous_block_hash": "f2df5ef2ee10bb6c302f205d97bde35caa2527db769d87ea02d3892259f3daf2", + "timestamp": 1430791622, + "fee": 2964031, + "version": 0, + "tx_body_hash": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 167, + "block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "previous_block_hash": "7b56941017940ca11f48cb71f0830f3aa06489942d118e9e2782ea040568c1c3", + "timestamp": 1430791902, + "fee": 201915, + "version": 0, + "tx_body_hash": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 168, + "block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "previous_block_hash": "0f3d6d37388d2a11c7f3532b279d73e01b84987a6a270e920d8f4c30e15ad4c4", + "timestamp": 1430792072, + "fee": 25240, + "version": 0, + "tx_body_hash": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 169, + "block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "previous_block_hash": "28b685d4f92a59a055f2e8154da0650a81e912616e90ca21d6949a3cd75634e4", + "timestamp": 1430836392, + "fee": 421, + "version": 0, + "tx_body_hash": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden new file mode 100755 index 0000000..b5b27b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-end-less-than-start.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-1.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-1.golden new file mode 100755 index 0000000..c7676fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-1.golden @@ -0,0 +1,634 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-10.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-10.golden new file mode 100755 index 0000000..ab74d67 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-first-10.golden @@ -0,0 +1,1008 @@ +{ + "blocks": [ + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + }, + { + "header": { + "seq": 6, + "block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "previous_block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "timestamp": 1428806251, + "fee": 0, + "version": 0, + "tx_body_hash": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 7, + "block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "previous_block_hash": "103949030e90fcebc5d8ca1c9c59f30a31aa71911401d22a2422e4571b035701", + "timestamp": 1428807671, + "fee": 0, + "version": 0, + "tx_body_hash": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 8, + "block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "previous_block_hash": "6cb71b57c998a5367101e01d48c097eccd4f5abf311c89bcca8ee213581f355f", + "timestamp": 1428807691, + "fee": 0, + "version": 0, + "tx_body_hash": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 9, + "block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "previous_block_hash": "34ec53ac5b15e8c0c60312f67e209318c3b09c5ecbaabf0843a161f889614584", + "timestamp": 1428807711, + "fee": 0, + "version": 0, + "tx_body_hash": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 10, + "block_hash": "5c5e6b0f6620a3af54a3259222a5269e60db768d7f805edce3f3e29f2597a487", + "previous_block_hash": "d33c2466840a09e10efe3736f3aaad05b6b8d05cedcdd0099f84fd1ec6f55282", + "timestamp": 1428807771, + "fee": 0, + "version": 0, + "tx_body_hash": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-last-10.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-last-10.golden new file mode 100755 index 0000000..f0eff68 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/blocks-last-10.golden @@ -0,0 +1,480 @@ +{ + "blocks": [ + { + "header": { + "seq": 170, + "block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "previous_block_hash": "e266c8beae9f650a3f1cdfa611d9016d99e2ba4b4a67b5d6c4629bc6e66f5f9e", + "timestamp": 1430836422, + "fee": 62, + "version": 0, + "tx_body_hash": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 171, + "block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "previous_block_hash": "e854e12b5ed0bcb26b2348448fa2af1cd30cf371763fa91019d62a950bf36c95", + "timestamp": 1430870562, + "fee": 6084778, + "version": 0, + "tx_body_hash": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 172, + "block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "previous_block_hash": "a58ab1c90b6564043f375c48413800c33ff05c9eef017250672ea5a0dd11bf17", + "timestamp": 1430870592, + "fee": 849078, + "version": 0, + "tx_body_hash": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 173, + "block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "previous_block_hash": "78ae70c3a0f403b6b5d14dab13e3d29f151a0e279a8a4818fa0fe9becb639dc2", + "timestamp": 1430871512, + "fee": 764646, + "version": 0, + "tx_body_hash": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 174, + "block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "previous_block_hash": "55b1be7e73d1ec35d71c8bc6f62e1788ded35752b39188c98cab6c9347f77ead", + "timestamp": 1430871622, + "fee": 111521, + "version": 0, + "tx_body_hash": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 175, + "block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "previous_block_hash": "0a4f2c0ea33c75ae7af4eb743935f53f0953e26fec3bf7128f0a88fdb879f497", + "timestamp": 1430908702, + "fee": 110149, + "version": 0, + "tx_body_hash": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 176, + "block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "previous_block_hash": "218d3fadc712eec96e1ca2f68adbb468092c597f269fb3a3702b77c2b80665af", + "timestamp": 1431162639, + "fee": 2711954, + "version": 0, + "tx_body_hash": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913" + }, + "body": { + "txns": [ + { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + ] + }, + "size": 1481 + }, + { + "header": { + "seq": 177, + "block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "previous_block_hash": "7ca9af9ed16449652da34d3ab49f3d6fc6be8cc1af3d31be81043e684f14de37", + "timestamp": 1431162689, + "fee": 338994, + "version": 0, + "tx_body_hash": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 178, + "block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "previous_block_hash": "3e8ac6b4c715bd92db824163770e28ee1b5362d449241f77719f13614b3c320a", + "timestamp": 1431162729, + "fee": 395493, + "version": 0, + "tx_body_hash": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/coinsupply.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/coinsupply.golden new file mode 100755 index 0000000..2ac17eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/coinsupply.golden @@ -0,0 +1,111 @@ +{ + "current_supply": "384300.000000", + "total_supply": "25000000.000000", + "max_supply": "100000000.000000", + "current_coinhour_supply": "202549286", + "total_coinhour_supply": "24569186081", + "unlocked_distribution_addresses": [ + "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm" + ], + "locked_distribution_addresses": [ + "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm" + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs-unconfirmed-txs.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs-unconfirmed-txs.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs-unconfirmed-txs.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs.golden new file mode 100755 index 0000000..30dc011 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/empty-addrs.golden @@ -0,0 +1,7239 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 180, + "block_seq": 1, + "unknown": false + }, + "time": 1427926392, + "txn": { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "timestamp": 1427926392, + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 179, + "block_seq": 2, + "unknown": false + }, + "time": 1427927651, + "txn": { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "timestamp": 1427927651, + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 178, + "block_seq": 3, + "unknown": false + }, + "time": 1427927671, + "txn": { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "timestamp": 1427927671, + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 177, + "block_seq": 4, + "unknown": false + }, + "time": 1428793611, + "txn": { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "timestamp": 1428793611, + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 176, + "block_seq": 5, + "unknown": false + }, + "time": 1428798821, + "txn": { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "timestamp": 1428798821, + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 175, + "block_seq": 6, + "unknown": false + }, + "time": 1428806251, + "txn": { + "length": 220, + "type": 0, + "txid": "03b3ab821cdaf0ab8cc1a9e2dd30108772ec3bda09e9d3a8c48df9f30d213b38", + "inner_hash": "e49bf8f45cb6664d36ec632e37bd91566d8bd4ea9ce209a0a955323a94dd744f", + "timestamp": 1428806251, + "sigs": [ + "0a0d9a3fa0597667fb991bbe047ff93c591313faf759fcec2f47138bc0666b333b7689ad527ddb8ef135897be41016f755eb14e46cd327fc5eb196bce80c3cd400" + ], + "inputs": [ + "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1" + ], + "outputs": [ + { + "uxid": "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "95.000000", + "hours": 0 + }, + { + "uxid": "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 174, + "block_seq": 7, + "unknown": false + }, + "time": 1428807671, + "txn": { + "length": 220, + "type": 0, + "txid": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "inner_hash": "f440c514779522a6387edda9b9d9835f00680fb314546efb7bc9762a17884156", + "timestamp": 1428807671, + "sigs": [ + "8fe96f5502270e4efa962b2aef2b81795fe26a8f0c9a494e2ae9c7e624af455c49396270ae7a25b41d439fd56dea9d556a135129122de1b1274b1e2a5d75f2ea01" + ], + "inputs": [ + "8ff8a647e4542fab01e078ac467b2c9f2e5f7de55d77ec2711f8abc718e2c91b" + ], + "outputs": [ + { + "uxid": "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "90.000000", + "hours": 0 + }, + { + "uxid": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 173, + "block_seq": 8, + "unknown": false + }, + "time": 1428807691, + "txn": { + "length": 220, + "type": 0, + "txid": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "inner_hash": "68fb8cd96b0d2a94838183ab24f36f71006383add373837d448a7584ef69bc6c", + "timestamp": 1428807691, + "sigs": [ + "b859da7c65d6525247973fc62d274343feb3fe6fd76ab392dc30d7cdc609a7e45018b425fbdc3e79647e43b99d25bfab6c23d60495e5e0ce3cf06b6ce2c4897d00" + ], + "inputs": [ + "17090c40091d009d6a684043d3be2e9cb1dc60a664a9c2e388af1f3a7345724b" + ], + "outputs": [ + { + "uxid": "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "85.000000", + "hours": 0 + }, + { + "uxid": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 172, + "block_seq": 9, + "unknown": false + }, + "time": 1428807711, + "txn": { + "length": 220, + "type": 0, + "txid": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "inner_hash": "f60dd876ff32adc5e20759f45c04075f46796b0ca2b76a490d5d1e2d5b18424a", + "timestamp": 1428807711, + "sigs": [ + "be2ea2bcb4be07705cd034579d77c2fe0f9c7bb29dad0e690f38f8a2e098041c396820004975298d9d3647dfec7cbb610452e294381b898f28d48f166aaea5a500" + ], + "inputs": [ + "999cc56deae71486a28e19d1ed8d585c2cf07d5ee27d1c33bea186d23aaca06a" + ], + "outputs": [ + { + "uxid": "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "80.000000", + "hours": 0 + }, + { + "uxid": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 171, + "block_seq": 10, + "unknown": false + }, + "time": 1428807771, + "txn": { + "length": 220, + "type": 0, + "txid": "98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb", + "inner_hash": "affafab93dc807a9306d1f3c6a19066aca57f284825420fb01e48200349f7ba2", + "timestamp": 1428807771, + "sigs": [ + "71008403c675d9b3fdf8c09cc6caa64c681b78ba588fe20abb568e318d2e40b55c44ea614efc475c408e1e6e15cc0df753e6d3f04cb521078e6c928d5aa64c3200" + ], + "inputs": [ + "2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0" + ], + "outputs": [ + { + "uxid": "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "75.000000", + "hours": 0 + }, + { + "uxid": "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 170, + "block_seq": 11, + "unknown": false + }, + "time": 1428808851, + "txn": { + "length": 220, + "type": 0, + "txid": "4a87de6869c974099e3f5522404fbc7b23f90a8f8dec958bf725317454036cdc", + "inner_hash": "53ecc82b426d4b806eb1c743e892edbc7eb7051c88f3fa8afc74a6a5b80cc57a", + "timestamp": 1428808851, + "sigs": [ + "dbbb5acf0130c39a6b2fd760dda1df5aaefd94d8a0904e6faf959feade87d17a5c754459b635e0048e1019dadb9815a54d8bca4cf234f6876b19b5a0df5e494a00" + ], + "inputs": [ + "ec2c2238793d71240502de3e7c46ec1d5bf938c76541185f1c3fdf0d99a90795" + ], + "outputs": [ + { + "uxid": "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953", + "dst": "2M2VC93aQv5asdcNKt7pzJdkxeL6xLw9JPp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 169, + "block_seq": 12, + "unknown": false + }, + "time": 1428814821, + "txn": { + "length": 183, + "type": 0, + "txid": "9ea7b912cbfca157ef5fe9c59dd2407302d1b4d95414829d93c45bde6c2d42c8", + "inner_hash": "8a294b39558a38da2c996a7ce12eb6e045b44ce3b3a153bcfdc664a246b1a46d", + "timestamp": 1428814821, + "sigs": [ + "81d65e0a176c322059776922be59a385f3d5f430502e51b94dba78662a42161805bea61e646fdd9cad314fcfea00d6f790f758c4e3c8b22ec3bfcf73c79033c100" + ], + "inputs": [ + "3f8c01eefca28ec6d89d34b899fecb5c97f9348b412c61e7c863310b8a85b953" + ], + "outputs": [ + { + "uxid": "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8", + "dst": "2AsyTLyWNR3FGhaMbLckaJyAZN46mrqFfXA", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 168, + "block_seq": 13, + "unknown": false + }, + "time": 1428814891, + "txn": { + "length": 220, + "type": 0, + "txid": "fa33df7c4316cea05095e6c7ce86f361847893d26fe2255af118593a33686c52", + "inner_hash": "2e88fb3c0f9eaa317794e966e4275cfe62949eed43fa2987729b877178fb9951", + "timestamp": 1428814891, + "sigs": [ + "25df6c1b4ae2c0cfac2f3ac608b108e5a83ef07c19a125dd098729734bdd6a1f65ca8a3f34878b07f6cd3e7d3e21ab432b1dec68f273dbb52a0ff90b253b6f9201" + ], + "inputs": [ + "9c7d3674d7a6b28a559a052e6d354ec13d2e0396739973c9f0dce08f8c7d157c" + ], + "outputs": [ + { + "uxid": "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "3.000000", + "hours": 4 + }, + { + "uxid": "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 167, + "block_seq": 14, + "unknown": false + }, + "time": 1428815131, + "txn": { + "length": 183, + "type": 0, + "txid": "b68d78c9a4610b540933eaa550fbb1c473f5cf749eb522882f8154d495453e7d", + "inner_hash": "aeb75b736b0467e49884795158dfc6ea5c6cfe2b4f696d9d5b29c1fcac503834", + "timestamp": 1428815131, + "sigs": [ + "dc926994a9bdd69aca5887edab30fbcbe9fc008328424ca0a38a258bd8c78b543af0e8aaa4195ef9e7c4fb7009f1dbdbb322894be8a319f4dff3809a3592a81400" + ], + "inputs": [ + "34de4a6d093e880f813b4dc466b51f6814923e157ffbba0e9abbc4bfbd938de8" + ], + "outputs": [ + { + "uxid": "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 166, + "block_seq": 15, + "unknown": false + }, + "time": 1428820169, + "txn": { + "length": 220, + "type": 0, + "txid": "70dd5840d7260cf584457c76d3226312f4d033c023caf8c0ab3a65f9b831e9e0", + "inner_hash": "4357c427cbc4b55139089389858dd8245464f674d4fff82e5daba9e18384a0b3", + "timestamp": 1428820169, + "sigs": [ + "964c4b0c6cde6625863adebd74910851a440a636823dab9d0cf0fbc4581e3dcb486be22ba19d0c6d6eb17db22d1b1389589ec4b6cff8e8a9b231c66fe40c565500" + ], + "inputs": [ + "0c5d1b6a61c32f9bcc62d3583ac957b3374f0daf1a14fd08679bff2554449840" + ], + "outputs": [ + { + "uxid": "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "70.000000", + "hours": 102 + }, + { + "uxid": "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 165, + "block_seq": 16, + "unknown": false + }, + "time": 1428820629, + "txn": { + "length": 220, + "type": 0, + "txid": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "inner_hash": "3153d35c8b133bc76ea6bef8799c9fbfd36a3cd3e8e42e170ab131eb309acea8", + "timestamp": 1428820629, + "sigs": [ + "11813ce8ce2db73c23a8167696621443e0d80ec878d964d5164da33f259f55d17e5f1fc2292709542015c7bd86874ed855c0c80406a53a35759722d014a8c31300" + ], + "inputs": [ + "4a06f4b59bc5626e6a92704b4e4441096e909b884eab84505699a3136abb69b3" + ], + "outputs": [ + { + "uxid": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "dst": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 164, + "block_seq": 17, + "unknown": false + }, + "time": 1428989855, + "txn": { + "length": 220, + "type": 0, + "txid": "d952ef4cc45a89c14230ba0f7e30b782fad83cb6506ac0f503a242c568c1287a", + "inner_hash": "8fc48920982066fd4c69e2d2c0c5239cca7c296f0e3ad30e9b976c1230967478", + "timestamp": 1428989855, + "sigs": [ + "b7eb93bcebb6df3dcad48afd66dd60bd42b1fbcdf52aa5e0c7e455e791f64a976fa416534b4e08bf3e62a2df83e13754119634c4255dd1e2e08be447d4d5b47201" + ], + "inputs": [ + "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e" + ], + "outputs": [ + { + "uxid": "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 4040790 + }, + { + "uxid": "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 163, + "block_seq": 18, + "unknown": false + }, + "time": 1428989925, + "txn": { + "length": 183, + "type": 0, + "txid": "686db0a8cd429970bb91163033703410d4750c86ba485709fe1a3faabbbb42f6", + "inner_hash": "76732ac6a9936242193011d78a0f2849529aee767a569c9c6bb25b3bbae15cee", + "timestamp": 1428989925, + "sigs": [ + "d74dcfdc8401a29b1dccc728b40b6b79faea147c65b4a859063ad77cc63aa9a62417c63b91b94678b6656fdba2f242d836b6914e77d244fbd16aaab014ddb44300" + ], + "inputs": [ + "c603e99ceae4d15c20360714ee07ba6e3a944a97ea9285d164c23252e93958b6" + ], + "outputs": [ + { + "uxid": "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 162, + "block_seq": 19, + "unknown": false + }, + "time": 1428990115, + "txn": { + "length": 220, + "type": 0, + "txid": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "inner_hash": "736a1b4f415c1b0968470fac4d123ec52943b9d2ea7d2ce376307b2477a29acd", + "timestamp": 1428990115, + "sigs": [ + "3660a24958b1b20beabb7f77d2ee1ddd91f1e40e8393b48d5ed4722d97bd1430150c5ea0f8ea1a2688a0d9f336c9c1f78a214150cc1ca3d895a694edde65ac0700" + ], + "inputs": [ + "acd35cec566de86b4ed464b6cf3c3ec561140c070134d1e03094775454da2159" + ], + "outputs": [ + { + "uxid": "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "65.000000", + "hours": 2268 + }, + { + "uxid": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 161, + "block_seq": 20, + "unknown": false + }, + "time": 1428990135, + "txn": { + "length": 220, + "type": 0, + "txid": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "inner_hash": "3d516c76b1f147942f2237a2c07f9626624385fb858199ba63ec2d39112b6dfd", + "timestamp": 1428990135, + "sigs": [ + "94e1b26e60d075536abd602ae88015f73ce638e49ec4e6be358cea8950853d0b4174aeeb0391ea05a9c62a6d37164c1fbab1d1ab53c9e2efd80ca4738ec3480e00" + ], + "inputs": [ + "af7deecc9b45c4696ad50246c8aa06b17aa8280b2574f295697a4210fc45f57d" + ], + "outputs": [ + { + "uxid": "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "60.000000", + "hours": 1512 + }, + { + "uxid": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 160, + "block_seq": 21, + "unknown": false + }, + "time": 1428991365, + "txn": { + "length": 220, + "type": 0, + "txid": "67f180076fed1599152c62337a12deee7e1a468b19f7e720df51415c28bfb986", + "inner_hash": "1d676e397e50442c001f98385b525f8df39ef7189ebb0744cb3f868d8c96f00c", + "timestamp": 1428991365, + "sigs": [ + "797c7987aab5c7a6a63eb06d514063a31b27beed8bfe22f15fbdf7b08c65702903d778d48e8cd027a9569c9973d0e52234977df7e0b9391967c913985ef860a700" + ], + "inputs": [ + "ec9bbaf9309772ade9860f145705b9e9ee4a70ed1eeed1983d058ccaafd6c02c" + ], + "outputs": [ + { + "uxid": "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 1008 + }, + { + "uxid": "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "5.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 159, + "block_seq": 22, + "unknown": false + }, + "time": 1428991585, + "txn": { + "length": 220, + "type": 0, + "txid": "c820bf59805b4889e59ce5fa320dcccfce5180de5f0f8baef7b391049ea8e286", + "inner_hash": "6fab8afaec00c1604f67fa7ecdfc968fa870662a46b714a88865e6b83ca555c3", + "timestamp": 1428991585, + "sigs": [ + "0fafbcb51bcdf3e797059c26ec09574b9b02672453e31fdc5b8b5debc507dfe917208b33632e7905c9b02252a675b7bd22578686e2882277ac077af86fcaa49a00" + ], + "inputs": [ + "1f4f952c6304e3991cf33519f1084921d50ecfd845edc48bd3b7b7229e28f2a6" + ], + "outputs": [ + { + "uxid": "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "4.000000", + "hours": 0 + }, + { + "uxid": "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 158, + "block_seq": 23, + "unknown": false + }, + "time": 1428991605, + "txn": { + "length": 220, + "type": 0, + "txid": "eb0a48072c5da37962c07d205a1843311f98e886cfcbdb2813359677f36bebc2", + "inner_hash": "104c51c380f54913954c2e16a8cf35dd585666a6e7b67116c05f490e06e5e1e1", + "timestamp": 1428991605, + "sigs": [ + "6615ef5540b366a45895feeb91f16a5226d5022737e59ab1b9825843ff54dd7e281f2f014fc95641e3bc6ddda433b86e0c79d87a5b9b8b23fa5e234e5a41da1601" + ], + "inputs": [ + "4c84a4bf9a1b1a3a53d8bf78e8823ca3135321089968068ac60da32083027846" + ], + "outputs": [ + { + "uxid": "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "hours": 0 + }, + { + "uxid": "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "1.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 157, + "block_seq": 24, + "unknown": false + }, + "time": 1428991635, + "txn": { + "length": 280, + "type": 0, + "txid": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "inner_hash": "02b721422fcadeb8c3217d9b972c81fe9042a32871a180fb1237e213a543cc9d", + "timestamp": 1428991635, + "sigs": [ + "fa3ccaecf3a01525fd617fe74971ff2f7270e88f92f17a0f7748c1b258e007fd0fd10a582cc406d7806fd7794e20c4a3178b71cc1cb9f59c3c7d36a4e34d962100", + "23530a4d36d65cb37fc366a8c4a61d47dfd4fbf3b268bd66fd960bcff1b91db419d039049b8f816bedbd73d6baeaea77c5907c0df5b47724ad07420dd225cdaf01" + ], + "inputs": [ + "182b4c32bb5fe0e6809a19db63eecbeefde97a6c043b9248da94d428ab5a94c2", + "20900f1d317e0b10ebab7190a34265f52783ff4f85675398b497ab8eb3723a3c" + ], + "outputs": [ + { + "uxid": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 156, + "block_seq": 25, + "unknown": false + }, + "time": 1428991665, + "txn": { + "length": 220, + "type": 0, + "txid": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "inner_hash": "be34076fd999f7030f2a51866d641f8a783deb2204a9a93a8b64377a95546916", + "timestamp": 1428991665, + "sigs": [ + "880b044ee5559510010d6d5cb4d7b50cb3e5323e5037daf3a048f3fab70254d34ff258aea85ec8ce264679bfb35df4590cd4dcaa527d89f9fb65fa50234dfc2e01" + ], + "inputs": [ + "f3ce12886e74d6407f9580b47e72156a917083b66ebaa46263c7fde2df35116e" + ], + "outputs": [ + { + "uxid": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "dst": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0 + }, + { + "uxid": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "dst": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 155, + "block_seq": 26, + "unknown": false + }, + "time": 1429011077, + "txn": { + "length": 317, + "type": 0, + "txid": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "inner_hash": "2894cfa31c21eb04c33f89263aa1e4caae625ceaf30539b82b39ccf79dffa816", + "timestamp": 1429011077, + "sigs": [ + "6aedcd617e69aab9724b6a52e0e71f4f087a2fa84a283ac685c17e274b49cf617e58dbbd6c45a8e2c1c31832a1193ba119f0cb238fd83b9d7eb029dcedbeba0800", + "f1f26b84f247c409d308bf0992c2a044ce649fc09169d5fe4843f22b855f911d6c73b92f679346d30ec6663aa5d0387189935ce8e2f2256dd13e59cbdae7b89e00" + ], + "inputs": [ + "4168b9378363cd81939e667cf78055d35a60d3101f5f9e3d2ae709e3981e29fc", + "d9dae1f82177f979b07016a341ed5c281ed6ed8eaa785a8a107ec16efbe541ef" + ], + "outputs": [ + { + "uxid": "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999880.000000", + "hours": 567938 + }, + { + "uxid": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 154, + "block_seq": 27, + "unknown": false + }, + "time": 1429011137, + "txn": { + "length": 220, + "type": 0, + "txid": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "inner_hash": "09382455a4e78c62bd0c254e106d349f648944c3747b066a23cc64d9392c6c05", + "timestamp": 1429011137, + "sigs": [ + "ade8874855f58653ef198e005a7ec82de992cddb50a4bb5ce8a0ec1cfa7b44086883ad1c85c63128dad5426b8b22873c349e0535191b80b3e92035b120cada7a01" + ], + "inputs": [ + "8793a3782bf673393a8f909f267f3bfcc713b600460893b571fd55f675ac65ba" + ], + "outputs": [ + { + "uxid": "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999790.000000", + "hours": 70992 + }, + { + "uxid": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "dst": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 153, + "block_seq": 28, + "unknown": false + }, + "time": 1429020387, + "txn": { + "length": 220, + "type": 0, + "txid": "f2f9926afcd29405327ddb772988a73dc13a67b1fcaa42ad98a416060e96adce", + "inner_hash": "1e46ec99a425796960a928a95b64be87b568d160c9533a5399d25141b60f74af", + "timestamp": 1429020387, + "sigs": [ + "1b59327011b10a2896962898bafd8d587710fb6d99b1b565777e0713a8e5fa072f7f60043c9823d2bcfc589b283e99da90d0649c472199a683428b14bd75374301" + ], + "inputs": [ + "778048daec0c83f89525a6d69b60c407d090bb1666711b1c560e6ebee8dcc452" + ], + "outputs": [ + { + "uxid": "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "3.000000", + "hours": 35 + }, + { + "uxid": "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 152, + "block_seq": 29, + "unknown": false + }, + "time": 1429020687, + "txn": { + "length": 183, + "type": 0, + "txid": "260d249883165aa9e59e17fb2bd8ba8995d2c3644993530985f8b813ed378650", + "inner_hash": "c5a9b2a4d2100d45a97a0131f3ffa79fbc4bb37b8969e8a1d5059055ca169c6c", + "timestamp": 1429020687, + "sigs": [ + "661c14759218ac72f4b06ac96bce6db7e20cfae5f23643cc4dae2641893ca3686682cb1e3cc3f384afe549a87209e4104ed7d163af8af3be4762686719541e8900" + ], + "inputs": [ + "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f" + ], + "outputs": [ + { + "uxid": "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 78 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 151, + "block_seq": 30, + "unknown": false + }, + "time": 1429021044, + "txn": { + "length": 183, + "type": 0, + "txid": "044a75b1d3d273cae560ca43f9351d9acde206b0ad5578eb3adc2598886b5134", + "inner_hash": "61a1297a213a7642daf445350b49b2df9ccade45cc1498b91f80fceefcad5adf", + "timestamp": 1429021044, + "sigs": [ + "ef33f4e1a053728e779296e912df149ad7e20167bd79ae88db24c52da558c6cc0dffaa3aeb9b4aa507865855f7172bb7ac72040dafb56bc2612d152d51e8008000" + ], + "inputs": [ + "92ae7cf57ad1363a60ce019818f7304040959329b6513f9a2d0f6b464bacafea" + ], + "outputs": [ + { + "uxid": "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "3.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 150, + "block_seq": 31, + "unknown": false + }, + "time": 1429021184, + "txn": { + "length": 220, + "type": 0, + "txid": "9004c779cff67b3895500ec14b2c2e566127bb11a8af3358fe8a63dcfae9badc", + "inner_hash": "9e1eed08b004316812f4ad574f3d0f96959b2a335cdda77113abfd1673a8859d", + "timestamp": 1429021184, + "sigs": [ + "6b3a3b3374c641ca252ee32cceab1b37c4c395b411e4d2515bc51f2a8ec12b9c440d25dee1b94a0231dd9492ab3e07c7a5dc054a0da987d6bf0ba6fc8de6f42000" + ], + "inputs": [ + "18ea1b3cceb2ca40c01efc8f3cfd7d1d0dd69430ecdf655515aa4f8b21bd2644" + ], + "outputs": [ + { + "uxid": "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5.000000", + "hours": 9 + }, + { + "uxid": "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 9 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 149, + "block_seq": 32, + "unknown": false + }, + "time": 1429021214, + "txn": { + "length": 183, + "type": 0, + "txid": "327375203f20cb68847351c30a48597c0588a8c14319a4eb47bf440207fd045a", + "inner_hash": "217a070c0edd70fc0eaa7f858308444f32bbfe4b48e128b6fa876f60c4639bfb", + "timestamp": 1429021214, + "sigs": [ + "de82c42e2523b512c0ffea3c91244dc905f59264f3c59e2f82efc3fdb7f446c728afb08bbc3478462cf25b96848da9dc4dd6b87cab569715ebd33e8102c552d101" + ], + "inputs": [ + "64194899d317e2a007f89df14538795547e927c242a92f83180e6cc952304964" + ], + "outputs": [ + { + "uxid": "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "5.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 148, + "block_seq": 33, + "unknown": false + }, + "time": 1429021674, + "txn": { + "length": 280, + "type": 0, + "txid": "e89ee3e90e72108e4cd6ccb95c9f8d2b18ccfaa7ce61a7d297454debd69cebbf", + "inner_hash": "dac67377dd9d8247db41f3380288730de2e51514ec3a2986072719553b9f9e27", + "timestamp": 1429021674, + "sigs": [ + "7df848876a507f4b2855818f059e62e6d2f5924af148607a0c6004b7231fdce920ac80e800a833e55cbce9938b5d8cb755b0dc434c22b03a5037972ff2d6444801", + "6499aeee3ba19247d1ef2d3ec13e46031adf0dd6a383785272776a93621f21696cf217b7375e5721e51133fc3d9806200d2aded757118fbe27a719ebf4ceaea001" + ], + "inputs": [ + "569aa1260e734017c4eee06d84ab4a6285e2ca2041940b2915d9141527caf179", + "eb446b8372559249c8e269b6cd028588e2e9e4f8fe9357719da9d1c22aa29911" + ], + "outputs": [ + { + "uxid": "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 1 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 147, + "block_seq": 34, + "unknown": false + }, + "time": 1429021994, + "txn": { + "length": 220, + "type": 0, + "txid": "08bf0f8f4a8547bcab1fef035adac2a66c80369b4485a736bdd676e782bbb037", + "inner_hash": "8fd6f4e5428c170dede16e8c02596ab0c490dd5c418d003d9232d8c2caedec9c", + "timestamp": 1429021994, + "sigs": [ + "f68d819dbda0bbf7cd5e2de8088267c5b3a744bbe2d7737c7dc52060b6344a25180cc1081e5c7dadab94763d158e303f697d1d275685b32bfd1de123a376697501" + ], + "inputs": [ + "e702df2703c3de180f3e4a0e9a503bd534037c2d68e858e97a317575c5a97d95" + ], + "outputs": [ + { + "uxid": "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6.000000", + "hours": 0 + }, + { + "uxid": "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "4.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 146, + "block_seq": 35, + "unknown": false + }, + "time": 1429022034, + "txn": { + "length": 183, + "type": 0, + "txid": "3170f0635cc40aded3a38f84f2ae07bd2238550ea4ee867328d0f891ea9abf14", + "inner_hash": "1cebcd96c2847d219b658733012921d6e10a6c55439736833dd0ae97b898f72a", + "timestamp": 1429022034, + "sigs": [ + "179826a9f244005b2b34d145948b178533805953adff8ab924a6fd67538daaa4384d67a24473de6bb01d441e4d979e520b055cd9304188d00255eab7c04bf45701" + ], + "inputs": [ + "10998e83dc5dfe3c3f5f28ef3e5e2fced4dbd1da389678b0ea3ddb552851b6bf" + ], + "outputs": [ + { + "uxid": "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "6.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 145, + "block_seq": 36, + "unknown": false + }, + "time": 1429022064, + "txn": { + "length": 280, + "type": 0, + "txid": "fba515a9eeaedb891c4dca862bd06108e0452270890b362f0b353b4c86845618", + "inner_hash": "3c24f665a7a02308fe6938ef3ce7e38dfe72644b1d71c5aefbe3d6844c609d58", + "timestamp": 1429022064, + "sigs": [ + "faf14290ac158576f0dd4311ee4835a2542ae8b52d9ec7ab36d1af938a117f382c42855dec9b980f282e7ff8d7e19d469b084a7d44e38022e246c365368cc07d00", + "52cfd88d334818382413dfa45dd8e00a2136c352b7547dcf97894bf3eaa152cc5b10bf9f35c4dc8c75e7bb62543bd244a7c1de588b2a606aa1eb0b32c9c4ca1501" + ], + "inputs": [ + "41c6d29aa5de770de684ab19b40bd75b99ec7f1a5ff7d15288ae4bfff568eabd", + "9e5779445f60d62b471862339d7a83dd8355c7a89d5fc3b751f98e9414628ec2" + ], + "outputs": [ + { + "uxid": "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 144, + "block_seq": 37, + "unknown": false + }, + "time": 1429022094, + "txn": { + "length": 183, + "type": 0, + "txid": "9fb039cd90a4e9b85669bd6ef878b98a9e84eec7d4804e2bff6f0dc9c2739c44", + "inner_hash": "5bc5636489d4ba7d36b4429cd3ec71491c9fa6f442fede1ea696428b574e0d13", + "timestamp": 1429022094, + "sigs": [ + "3127749c2123db967563b9726cf5d6daa3ae755ec74f5e5fbc3dcfb10ececc231f5d61de693355aa5c8ade13c4c31ddc3bf9864e87139fdcd64c513702f7425600" + ], + "inputs": [ + "d46e91fea3c8a6428885f941e5152dbc7f9abd356ad4d054bf20e0e806f1ec99" + ], + "outputs": [ + { + "uxid": "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 143, + "block_seq": 38, + "unknown": false + }, + "time": 1429058484, + "txn": { + "length": 220, + "type": 0, + "txid": "a76cd63b71f1f5425941cd567627e1dcdc8c34306a7945ea48755f5a46efb6f5", + "inner_hash": "39c3ed7f2dfb26d02c9fcbbe853db5c3031644b4a66844a717d8795c6d954d65", + "timestamp": 1429058484, + "sigs": [ + "844af158e935a38f034778a78b646a167b5758df65212546f2eb1c7e838216ad7aa6e7571d1e81d8836808d4315846fe97489bdf2e6d2159a2af77a15a9a2bcb00" + ], + "inputs": [ + "ad742bbc7420c08881e6ccf35e34e8472c0dd6386792359aedcfb752ca618c33" + ], + "outputs": [ + { + "uxid": "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "998790.000000", + "hours": 389245 + }, + { + "uxid": "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 389245 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 142, + "block_seq": 39, + "unknown": false + }, + "time": 1429058494, + "txn": { + "length": 220, + "type": 0, + "txid": "c38b47bd576e3bced2a9309c3df7622064e71177f54020d77193d5cac310719c", + "inner_hash": "7f02ba6476946668f3adcbb35e113531e6788cee4fe94bf8d8da4803e3baa7e3", + "timestamp": 1429058494, + "sigs": [ + "2a31eb55da895c59654ad3f1a11efa11b04787ab78dcf8221aeeccf137adec543765f761363390c97f429310fcb39db305494a94b30af906a2d43d5de1effbb701" + ], + "inputs": [ + "108520145179c00f581d91e273714811fe6e82ee059d65218eea91154ebd8205" + ], + "outputs": [ + { + "uxid": "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "988790.000000", + "hours": 48655 + }, + { + "uxid": "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "10000.000000", + "hours": 48655 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 141, + "block_seq": 40, + "unknown": false + }, + "time": 1429058514, + "txn": { + "length": 220, + "type": 0, + "txid": "b56f3e9239da5c5f9bb5ca80226b8454ba36ce6012f8e323a50c9d9c4eb4a834", + "inner_hash": "bdcf8f2f2b960cfee6b3b1124a554ef4747fe43ac9452d897bd8dedcd643e1ae", + "timestamp": 1429058514, + "sigs": [ + "809029f12d5f38906306610feae26c0623bffe63218c8019060ae2d164cc29352066efd20567e3c37837230e74b481730b0fc71bcafe3b3b9f5eb4a7fb42f69101" + ], + "inputs": [ + "e79c94aa7013c7611901839236b8a1cdf70e8ef7c40b9e33f99359136de981d6" + ], + "outputs": [ + { + "uxid": "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "978790.000000", + "hours": 6081 + }, + { + "uxid": "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "10000.000000", + "hours": 6081 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 140, + "block_seq": 41, + "unknown": false + }, + "time": 1429058524, + "txn": { + "length": 220, + "type": 0, + "txid": "cf4fe76a08e3296b6f6abdb949604409be66574f211d9d14fde39103c4cfe1d6", + "inner_hash": "2f5942207104d52dbd6191684b2a97392e616b7fa51dde314dbddd58d34b8027", + "timestamp": 1429058524, + "sigs": [ + "b2b8c8ec1e1dfdeac4690e88d4ef9fcc4b52fcb771153f391cbcb58d651505a94c6263b6dc15a948c0396c0d8be20d9e0d1993b494bd9189c778d3673363bfc401" + ], + "inputs": [ + "c65a9e6aa33244958e9595e9eceed678f9f17761753bf77000c5474f7696da53" + ], + "outputs": [ + { + "uxid": "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "969790.000000", + "hours": 760 + }, + { + "uxid": "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 760 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 139, + "block_seq": 42, + "unknown": false + }, + "time": 1429058594, + "txn": { + "length": 317, + "type": 0, + "txid": "0e91a08561e85a36ddf44e77b9228f7d561c18c0b46d19083d4af511085b697e", + "inner_hash": "d78230e22b358d7cc8d491adb3c0ec1e77a5170602a4ec92d700c4b4bb101f98", + "timestamp": 1429058594, + "sigs": [ + "17ba9c495e4d396a37eaf062e1806a13b3bdc91a83151c2455cf948a7e6d91882dc02ec6443970517f0f7daf59ce9b89658a17f5d51c0cbc18056811d0f3006501", + "e4e8f28801fe461cc8097b29cfe1307739bdfbdd6b20c31e04eef89aede641a6407fa0c41b0ad5ef167e3255e1916c0bbd358ffd70f34dc7944ffe67514bc5f501" + ], + "inputs": [ + "f48432d381a10abecbd1357d81705ea922246e92170fe405d1a4a35c5ceef6a4", + "6bbf13da052e1baade111ae8bb85548732532c8f5286eba8345d436d315d1c93" + ], + "outputs": [ + { + "uxid": "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "9000.000000", + "hours": 48752 + }, + { + "uxid": "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "hours": 48752 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 138, + "block_seq": 43, + "unknown": false + }, + "time": 1429070374, + "txn": { + "length": 414, + "type": 0, + "txid": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "inner_hash": "acb0cc7def6ebcfd45b1490aa60d6cb84fc3621bf34be5ab84910a1929efccf5", + "timestamp": 1429070374, + "sigs": [ + "9d1fcf32769b70f2eeb88b70434010c5ac5844031d85c515f7854b0aa5b91de7035f4fa3802ebcc6a7e064b4ebf16be5b1ed9a85b31bbb46ceb11694e14648eb00", + "40303be55ccfaef337b8810405d522c2a32a4d86acc5e474626666f3999533b55a33c546b04472e3d10a7870e0435968ce88ac7fbea6fecb8617a680957752ce01", + "3c1d5a5e076cb1274fb478c6c3bd4e0f724106f71edbd16eed7e2b13aabb69a53f7e91df5af8c611ffd2ca9114cd4d4be7df70ccf541606c781af41f986ea51700" + ], + "inputs": [ + "e3e95cd390c42d2f08e2c173135620e09c7a2ec1cf80ff75fbc3940fa5712b3c", + "7f44d7ef014419278137cbaa344cb550fc3c07355ec619d917bea3bc15fb8817", + "61c61dfe5b82fde557a698b402c82ac0205929478e705cbadec7f5d47a51d403" + ], + "outputs": [ + { + "uxid": "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "55.000000", + "hours": 265 + }, + { + "uxid": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "dst": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 137, + "block_seq": 44, + "unknown": false + }, + "time": 1429070414, + "txn": { + "length": 220, + "type": 0, + "txid": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "inner_hash": "f3a57ef9c95bf41b758b317169e29596448640aad207b88a21b45b1ea46e9a99", + "timestamp": 1429070414, + "sigs": [ + "fa16091cb778d496199d0b59f934d38891ff0b3aad42be78565a4f5a9880b9063a8e423fa7dacc624e0ffb01931bbdf4bed0fef8044f9280c8cd562b2f3bb0bd00" + ], + "inputs": [ + "88162721a552b1422546024772fc822faa187e897754e0a579e5e4a92a7cf4c9" + ], + "outputs": [ + { + "uxid": "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "50.000000", + "hours": 33 + }, + { + "uxid": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 136, + "block_seq": 45, + "unknown": false + }, + "time": 1429071074, + "txn": { + "length": 220, + "type": 0, + "txid": "df622e8c9dfaed1d7dca83ad7f6d8946bb86b81398bad521d858cbefef8e4688", + "inner_hash": "91ab4f29d84e9ffba56a108e01984e7b483729da4e61b6976c018fa11ace36a8", + "timestamp": 1429071074, + "sigs": [ + "d0726d81cb1cdce6028668d0d95ceccf39cc9d655a7bff143573b9f52d0586232bbb7bd494df8b9bb5155a271446cfaff1550d5ccf314dd35f044226f98d14e201" + ], + "inputs": [ + "195f5e50b4eed1ec7ff968feca90356285437adc8ccfcf6623b55a4eebf7bbb5" + ], + "outputs": [ + { + "uxid": "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944790.000000", + "hours": 400470 + }, + { + "uxid": "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25000.000000", + "hours": 400470 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 135, + "block_seq": 46, + "unknown": false + }, + "time": 1429077374, + "txn": { + "length": 220, + "type": 0, + "txid": "0a2da0489b14156fad8fb863d051a4dac1f645f144c1e5bb65a44478623b8e4b", + "inner_hash": "787ae7cb222a23641bb33751d1428dc8e07a2f2cf11ee6293a54100836209d09", + "timestamp": 1429077374, + "sigs": [ + "9bc3b6d7cb1d66d52fc993d0799baafa1056992049fa86ce76d5909690e88c4a19920b69e2463cf34d1dddb545b61ee38fb2f9b33f92626da8afdd934c353c8e00" + ], + "inputs": [ + "cb8efc0b1082c39258cb6efd59f64d88b36fcb60143c826829fc5f0ed5c0d668" + ], + "outputs": [ + { + "uxid": "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944780.000000", + "hours": 50058 + }, + { + "uxid": "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 50058 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 134, + "block_seq": 47, + "unknown": false + }, + "time": 1429077384, + "txn": { + "length": 220, + "type": 0, + "txid": "a4a202bc4431d95c307d151dea764bfc6d9ceb7e82b3eb50dc8604050622a22c", + "inner_hash": "836145a3e62a7e055acc3404c1fd6ecb237e3251e6f8b39fd526a7f48f21daa8", + "timestamp": 1429077384, + "sigs": [ + "f826793e63a3b0b837070e8876461c47af6be7a6898c370c70430b1491457cda76fc3b34e08bff41a336277ec1e93cc008f9c08ca295b418488b1ac92a5f5a4000" + ], + "inputs": [ + "a6061defc41a8a55e37eaf56ebaa1177446f61719b1d5126698e79a6023f5367" + ], + "outputs": [ + { + "uxid": "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944770.000000", + "hours": 6257 + }, + { + "uxid": "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 6257 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 133, + "block_seq": 48, + "unknown": false + }, + "time": 1429077394, + "txn": { + "length": 220, + "type": 0, + "txid": "4e6b363423633ad51114b250478ee7645fbd184066fa41c29e5b14d0728cdfec", + "inner_hash": "8cf88a9e5140d5e01af412c956b3de7c93bfebbb4c5993b9b0285812208f5b33", + "timestamp": 1429077394, + "sigs": [ + "670abb369c25a655b0f22c069a9523d439b8a03d122bc9f0861aff796ab965fd5e1b79812b6f458ebc0a1cd4cc223d0137eb22e1bf1cbb40265ac7301018897000" + ], + "inputs": [ + "3b5f72e772ea886dd872b9087395398133576a6561072d5294fbcd04b49e1d95" + ], + "outputs": [ + { + "uxid": "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944760.000000", + "hours": 782 + }, + { + "uxid": "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 782 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 132, + "block_seq": 49, + "unknown": false + }, + "time": 1429077404, + "txn": { + "length": 220, + "type": 0, + "txid": "edc27c6ecc1f76d0f23489ad7bbbdb8c653af37cc4b8f18197400aea2011ed83", + "inner_hash": "5432e686f984075091a8d3686d959b63ef620382fcb2b86794ba8dc0fb9656e7", + "timestamp": 1429077404, + "sigs": [ + "c1902b37a95c5327b0e5a1f05de551d4135831b787c86562867344ee7f06235374dc1618c6b4a8e077041723bc731db72dab5554a808b1ba77d305309144bf5e01" + ], + "inputs": [ + "f265bea876ffcfb8cf64df3aca4dae4a8d7f424ff495d91fb322feddb3a7e505" + ], + "outputs": [ + { + "uxid": "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "944750.000000", + "hours": 97 + }, + { + "uxid": "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10.000000", + "hours": 97 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 131, + "block_seq": 50, + "unknown": false + }, + "time": 1429077474, + "txn": { + "length": 220, + "type": 0, + "txid": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "inner_hash": "158b0ca1e5055c4abb6729eeb187d9fc592c425c8f1eaf07c3d64e17e1d1615d", + "timestamp": 1429077474, + "sigs": [ + "3624a41ca94d80e7f13ea09f3acdfd701b9425af1a43c62e08a98744f31c651b1f9d2183c35f64aea01431e1c0c3a12d2f63d2c88ff9bd1a124b895a4bfabc6b01" + ], + "inputs": [ + "19efa2bd8c59623a092612c511fb66333e2049a57d546269c19255852056fead" + ], + "outputs": [ + { + "uxid": "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "8000.000000", + "hours": 11972 + }, + { + "uxid": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 130, + "block_seq": 51, + "unknown": false + }, + "time": 1429077484, + "txn": { + "length": 220, + "type": 0, + "txid": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "inner_hash": "10daee0ac47006149435adf9655dbc8796eece3d075f93af9810b204f90003ab", + "timestamp": 1429077484, + "sigs": [ + "9cfad1cc126d0b33d6e44b5cf99672c0bbb088dd2ed01090365292d4ba1c188f18772aacbc7931e81202c11d7eb977a8f00bae86ce5b40479482bbbd883dfcaf01" + ], + "inputs": [ + "f8ad5c72e7822c7ac9a1dce8de583e34f6f830052bc0a02d749e9e81790dae86" + ], + "outputs": [ + { + "uxid": "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "9000.000000", + "hours": 7343 + }, + { + "uxid": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 129, + "block_seq": 52, + "unknown": false + }, + "time": 1429077494, + "txn": { + "length": 220, + "type": 0, + "txid": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "inner_hash": "ddddc962f9ad468e32f141dcf8479e2ec2293d42a32b2085fbaa0b5e9f80a267", + "timestamp": 1429077494, + "sigs": [ + "7cb704180d085d04db6816852111cf3dad3c911337af4e22596c42efe77a45983539abe92b0f08993559f87ac2e4ddb907e46c36c6a746920f2fd0c89b0b7fc201" + ], + "inputs": [ + "5fa90c22a26ecec8c03696a018b590a5e1679efa9cb5e8263facf9bcc6628db6" + ], + "outputs": [ + { + "uxid": "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "7000.000000", + "hours": 1499 + }, + { + "uxid": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53, + "unknown": false + }, + "time": 1429077514, + "txn": { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "timestamp": 1429077514, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 127, + "block_seq": 54, + "unknown": false + }, + "time": 1429077524, + "txn": { + "length": 220, + "type": 0, + "txid": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "inner_hash": "bbb61ff8c3b3361e77eae47d4a65c4073e45ded96994efbe605fa7639486b2ba", + "timestamp": 1429077524, + "sigs": [ + "c627aa6233c7bc436f7569399554ead829bd21244cb1f938cecde96b493d1ac84099844dc91bbdcf72593285c33f124dba2d3aa1b7807532d647484492b8760900" + ], + "inputs": [ + "e4fa8fe06d04bb438323f295eea23535856be08b369be71a2ce3e9e7bc0b1e09" + ], + "outputs": [ + { + "uxid": "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "6000.000000", + "hours": 192 + }, + { + "uxid": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 126, + "block_seq": 55, + "unknown": false + }, + "time": 1429077544, + "txn": { + "length": 220, + "type": 0, + "txid": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "inner_hash": "1789978d61189b7e49bea67d8a1d1f0341da0242cb0b801c4d8bc346ec2fd618", + "timestamp": 1429077544, + "sigs": [ + "f706829ee37d3f4467aae6341bd20c0455ae172a947ca372028db7f9b1dd2d7a4123b109eba8d4add2f695f6a7aa5806840551096f5357ce09be55e1877fb70c00" + ], + "inputs": [ + "f37efd851f76854852fdb8b8ba9afa2c5b7859315cc1fd12c12bf6831c59beb2" + ], + "outputs": [ + { + "uxid": "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "8000.000000", + "hours": 930 + }, + { + "uxid": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 125, + "block_seq": 56, + "unknown": false + }, + "time": 1429077554, + "txn": { + "length": 220, + "type": 0, + "txid": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "inner_hash": "dc25f33c3b93678ccc3449a318d55782a274c17cd2f45089018bd7c55b21dd96", + "timestamp": 1429077554, + "sigs": [ + "6fbe79a6f32b242f97f7e7662e6f7eb5aff065e8063864fc52159071005ffb2570c26a2d8b21a7826cf18c15f4f4ed9b718a7a9fdf1b4d5ac63bdb632452c82401" + ], + "inputs": [ + "df5d6e09da2585a6ac1a37aea2370fa25e9049b549049202d5417138bf033cfa" + ], + "outputs": [ + { + "uxid": "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "9000.000000", + "hours": 12696 + }, + { + "uxid": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 124, + "block_seq": 57, + "unknown": false + }, + "time": 1429077584, + "txn": { + "length": 220, + "type": 0, + "txid": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "inner_hash": "32d2dce8e8043e544b3cb2145b0bfb9d4cfdb7ae8e20437d075f76b75d8e088e", + "timestamp": 1429077584, + "sigs": [ + "990bf0a8c74b0b4c4d05f463a0a50e311a6ae27b5d327dcb906bb6e42330709d48998eed6e7cbdf35caeab6d90fac3e56fb222032aefa7b1d4d9c7653aca9fe600" + ], + "inputs": [ + "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea" + ], + "outputs": [ + { + "uxid": "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "942750.000000", + "hours": 1681 + }, + { + "uxid": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 123, + "block_seq": 58, + "unknown": false + }, + "time": 1429077604, + "txn": { + "length": 220, + "type": 0, + "txid": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "inner_hash": "34ee80da7f19e17ab8b49569ad514135f6e6120c67288c8f613b758b9db8658c", + "timestamp": 1429077604, + "sigs": [ + "228340c209abeb45fe25b93bfccbf08cc4faa1abcd89c95bf0332de0f9846f642c68fb68f49f4dfe6ed556c2e8b86bab6127d47de518179ad467af637e264c7d00" + ], + "inputs": [ + "f5beae016bda8260218fc05468c300fa71ddd46f4c6337fffac8d83229461f5f" + ], + "outputs": [ + { + "uxid": "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "5000.000000", + "hours": 36 + }, + { + "uxid": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 122, + "block_seq": 59, + "unknown": false + }, + "time": 1429077614, + "txn": { + "length": 220, + "type": 0, + "txid": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "inner_hash": "d81940dc03cf3fa1fd3eeadb84ae46e472bf3e281754a79eade7029b5ae1f639", + "timestamp": 1429077614, + "sigs": [ + "dbc7327f85a323193b59dde59d2656c8dfeb2b94c40dd01ca70f379d14a7b9123473b7cdf38df1196b55f2c01c4a31ed1c9ba7d75f6670deef3b9816656add2d01" + ], + "inputs": [ + "298fabb8217a2b0322f104b0cb295383bfdbc599d6a81e07610e0922eb99f89a" + ], + "outputs": [ + { + "uxid": "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "7000.000000", + "hours": 132 + }, + { + "uxid": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 121, + "block_seq": 60, + "unknown": false + }, + "time": 1429077624, + "txn": { + "length": 220, + "type": 0, + "txid": "77a69f4c8afd858a2f6767bb9980d4af6520e02b076bf2a78b935021e1147c71", + "inner_hash": "65f97c460ed99ea47ea2cdfd0780af2338f78d80bff93b92dc2ccc8f2411abec", + "timestamp": 1429077624, + "sigs": [ + "7c32e34864bc9659222cb26f10058df5cf2fe0c7b78b1d067a7b5af80f4a2b146f8914f4424d9e80a3303d3d2531ddf9d60489011c607ecd5f92cefa5105eee501" + ], + "inputs": [ + "3d7dd4d41e613fe8153f5e5f62b79494e9db9ed98f875d929ca1f90ecfe2d50b" + ], + "outputs": [ + { + "uxid": "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "8000.000000", + "hours": 1605 + }, + { + "uxid": "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 1605 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 120, + "block_seq": 61, + "unknown": false + }, + "time": 1429077654, + "txn": { + "length": 220, + "type": 0, + "txid": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "inner_hash": "bc6119c006f7c54c8608cc8050f47c43e6c079397f607f8c9e90d3072a10eca5", + "timestamp": 1429077654, + "sigs": [ + "0309322d16d48a35bd42c2ae6a76b240b21974d073f81f440e04431941fc9d550de92dcbcb226ad3baae2b3cbae51db28b2dc8d3e1b51cdd559cbbb6e4b71eda00" + ], + "inputs": [ + "c5150380691c542b9bdf4cf2280ac612e0576c349f99d47d0a03c77eedc48731" + ], + "outputs": [ + { + "uxid": "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "941750.000000", + "hours": 1519 + }, + { + "uxid": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 119, + "block_seq": 62, + "unknown": false + }, + "time": 1429077664, + "txn": { + "length": 220, + "type": 0, + "txid": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "inner_hash": "7b253041d4c467262bd144354f1584fc37b1b3a2934b0230919838e60a4320dc", + "timestamp": 1429077664, + "sigs": [ + "7587f95e4036b310ce3bafbd1248ae62210120c14c2569d358f0f1363120626060e0797c9728a2cf3cef7839fa6e9d42d31ca899cfab82fa3eb8a0401c3cb8e301" + ], + "inputs": [ + "53ea8733d94ae54bade0b55df03a03b3c0f6e6683b9260c36b14e3fc311d6f49" + ], + "outputs": [ + { + "uxid": "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "4000.000000", + "hours": 13 + }, + { + "uxid": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 118, + "block_seq": 63, + "unknown": false + }, + "time": 1429077684, + "txn": { + "length": 220, + "type": 0, + "txid": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "inner_hash": "929218d56de3e94d277827c857a657ef8b1352f75e6938ff5cf10ac4c54d4039", + "timestamp": 1429077684, + "sigs": [ + "6c8892c3277b90f5ca71a42515706de993c459f094282fa99168359f00c5cb862811c4225cc1448e99ba2755e9f9eb241ad0df25b20f1a6ec035a673cf42ab2f00" + ], + "inputs": [ + "77769e6a01cf3dca201ade501767d0abf20dea19d694f3272b647a9a651fdee9" + ], + "outputs": [ + { + "uxid": "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "7000.000000", + "hours": 211 + }, + { + "uxid": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 117, + "block_seq": 64, + "unknown": false + }, + "time": 1429077694, + "txn": { + "length": 220, + "type": 0, + "txid": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "inner_hash": "bc02dde29d200fa6bc0497f2ddd5e52007aef9b6482d40953fbd44ed88e3cf78", + "timestamp": 1429077694, + "sigs": [ + "0674c0617c9e6109ca9af404d446777943bb6aaa5dcb223da63bff1a305498972735e0b2a601cc9c6ee2231ad5fdd025fb92cbb00e200860a2ebde924f76499400" + ], + "inputs": [ + "9bbb8d620aae3efc7c21bb7d6a7159eda441a83e0fef2cd98f8240b38857d648" + ], + "outputs": [ + { + "uxid": "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "940750.000000", + "hours": 1170 + }, + { + "uxid": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 116, + "block_seq": 65, + "unknown": false + }, + "time": 1429077724, + "txn": { + "length": 220, + "type": 0, + "txid": "e3b7236ad4b209d664ee1e2549f2a0d34a3ba58b12ee46f98fba73c01574e484", + "inner_hash": "30b5c520717641fa7a5b11c5340e6f239d1502d90809e919003004048582e8de", + "timestamp": 1429077724, + "sigs": [ + "3c90ea0882c24e0e17f9f453f7777eba42aa5fea386f21f8f873969a0118d12f0a81169e3600d68026cbbe300b63568db468cbd931087eb0de8635a8453efe3201" + ], + "inputs": [ + "83b5fa4051dbfd50ba903374e5e583a9345c6a980505ee56963de9bd8e539e36" + ], + "outputs": [ + { + "uxid": "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "3000.000000", + "hours": 5 + }, + { + "uxid": "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 5 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 115, + "block_seq": 66, + "unknown": false + }, + "time": 1429077734, + "txn": { + "length": 220, + "type": 0, + "txid": "bbd1d4b6fe89a5986efbea9f7996cca2a515c3f0788cedccc21990dc78d83509", + "inner_hash": "f5b418d7156e6ad70bbde6d90be61d4ab2fce406890a3fe764ae2a43da12440d", + "timestamp": 1429077734, + "sigs": [ + "1fd3e13f0e55364107d6916ab5002bcc434889e5f5355751f1f688ac469f336d09161f516770cc78f1ece3cb790a1ded56e25948a46546c8d521dea6b3141fad00" + ], + "inputs": [ + "1efc8693845733061e1407a74e86976a52a69c63a14d6a79e1f3e45277662900" + ], + "outputs": [ + { + "uxid": "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "6000.000000", + "hours": 43 + }, + { + "uxid": "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 43 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 114, + "block_seq": 67, + "unknown": false + }, + "time": 1429077874, + "txn": { + "length": 220, + "type": 0, + "txid": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "inner_hash": "a7a9ea6466bef6cd63f671ae5dd1aafbeb251a717c7da331d40ec376ad0e89ec", + "timestamp": 1429077874, + "sigs": [ + "b4a141eb037a4debd99c347f337f67662a3feeb96112d7b05fc035a3556419dc3a9b35028327d925ca5eb9da018371bc333b7365f06ea22366169af6f066524701" + ], + "inputs": [ + "25ad0d5ae6a1a9bc61c6b9099fb7829111977a59e1183de4227a0a5352555639" + ], + "outputs": [ + { + "uxid": "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "939750.000000", + "hours": 1452 + }, + { + "uxid": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 113, + "block_seq": 68, + "unknown": false + }, + "time": 1429077914, + "txn": { + "length": 220, + "type": 0, + "txid": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "inner_hash": "611f096c50da1d98c29b8c9bdc6b7f7c98d96061ab126c66716f17a2fc495166", + "timestamp": 1429077914, + "sigs": [ + "d264a023bc6986c1bf16e2e697f4df8b6e33ae2d4b1ddd4e207cb5f902fed54c1234c3ef2429d82507f5c10c0fb4320d753f3bf6b5e155fa3ec03bc91dd8206a00" + ], + "inputs": [ + "acc75d51ff9f18a224d1ca0481917e2a67298de40955711cd97a08f6733b5b6a" + ], + "outputs": [ + { + "uxid": "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "938750.000000", + "hours": 181 + }, + { + "uxid": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 112, + "block_seq": 69, + "unknown": false + }, + "time": 1429077944, + "txn": { + "length": 220, + "type": 0, + "txid": "3bf485890e91268452dc3136c0b294dc9909b3aaa10b9c936743e6e9b1a56f61", + "inner_hash": "e952e5d86f3cff105dab78a455691c871f3b0fd09558e367833c4743339b94d3", + "timestamp": 1429077944, + "sigs": [ + "632771f1bdae7454911dcb6462aee56827f949dae18e8a98168b57864a62333f4251e17efa15a53ec12ab6980ea72838e9bb0e64aad82ad9e6a0a2a33b3006cd00" + ], + "inputs": [ + "5c1069a3aa6628ed7f9bdb300bec1a7e7ca6fb4645528a8c6a27c167e7dfe698" + ], + "outputs": [ + { + "uxid": "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "913750.000000", + "hours": 22 + }, + { + "uxid": "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 22 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 111, + "block_seq": 70, + "unknown": false + }, + "time": 1429077964, + "txn": { + "length": 220, + "type": 0, + "txid": "f51e2ce31961b0186e04cc9d78857c3c21d3e2afb25c050d8c1d67d3320fcc07", + "inner_hash": "4a8b13ea0c8a993b3455a374e847bcbea7e7a20392c7cc169cbc41778e65d6e3", + "timestamp": 1429077964, + "sigs": [ + "74f886780a9df8f6987c8c60bf5d9ad0fc25a502ba8f681188923d3a85f74bb87d57b067e53ed0f423ee7fbb352f3260e65c38e44cc7eec8fe8224374fd77cc800" + ], + "inputs": [ + "8190fd31c005510d550c8a241b127fad2558c82aed9483fb4423193d5f4429e3" + ], + "outputs": [ + { + "uxid": "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "888750.000000", + "hours": 2 + }, + { + "uxid": "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "25000.000000", + "hours": 2 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 110, + "block_seq": 71, + "unknown": false + }, + "time": 1429077974, + "txn": { + "length": 220, + "type": 0, + "txid": "abed13c2a552633d26b5b51c3ac5abf9808756c0203869ed185a7cd673702ba2", + "inner_hash": "c176a1a85f716055a9e8060c2a4245db0d7f71f4ac5387d4a51d173db467150a", + "timestamp": 1429077974, + "sigs": [ + "40e8340047f08afd483b2867166e15ae751bb7272a2c24f68ae8561d3619ea021363e987118a2fe516cacff1946d4d6c4c249038581ee2f58f8feea4bcffc3b100" + ], + "inputs": [ + "450cd7795bb3625daa99d6b64b9a8786d593bf1cad986d6c2933dae04b74a593" + ], + "outputs": [ + { + "uxid": "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863750.000000", + "hours": 0 + }, + { + "uxid": "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 109, + "block_seq": 72, + "unknown": false + }, + "time": 1429078004, + "txn": { + "length": 414, + "type": 0, + "txid": "3872797c8f9964e6ad19552b9b88d2af07be32866bdb9b9c60aa7086f253af43", + "inner_hash": "5784542f1b1f9284f25c8d3995429e77b1c0cbdf4b1eeb6a1737f5f19b0b576f", + "timestamp": 1429078004, + "sigs": [ + "cf51ea4b5631baaa43dcf258cf08f6f87fe4fa9afb2d081e7eeacf6be3b1239058e30d931d22d3befcbde12b51399b438cd8726670f10c0da3889bc08917fb5601", + "bfa55b86721bd2d92144e2108123cc33b62ef50da580fed9d6787cbcc1674f63761ef4d39592f060e98b415c22d272066c36f6499ceb5571b19b4eae1c3110be00", + "3b50522194013cf9ea2dfc387be85c79c7e2379c1936d654c14921cdcbbbaab047a2ab1e09f3a190a09d12f70b41d6428b2e171732630b6a74eeb269853a404500" + ], + "inputs": [ + "3fe6b13824f28d69588c309278420069bc0efae95367d0d6f93cb40af15eeaa6", + "5a7b2b6568cfa4ff5d44e98446aed92438ede0103b9994cfa3389bd02a35239b", + "9639a86df8da288fb0fc6a92fa086f3cd5a8387705a14ddd2aa5e30c6c3fc3fb" + ], + "outputs": [ + { + "uxid": "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "31000.000000", + "hours": 93 + }, + { + "uxid": "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 93 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73, + "unknown": false + }, + "time": 1429091164, + "txn": { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "timestamp": 1429091164, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 107, + "block_seq": 74, + "unknown": false + }, + "time": 1429091944, + "txn": { + "length": 317, + "type": 0, + "txid": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "inner_hash": "873d38a9ff804dab8d83013a6e6b4132d0b0dde6439de24f2190ecd1d31f9ab6", + "timestamp": 1429091944, + "sigs": [ + "0c3ca0de3f369e03859d710b18656c92c96b11b8c0e15e31b337293e59776b905f6ce7f91f7b3c9c268b6cb1673b8ef2ffe2dd7f059f7833b62284168bf2065601", + "7755689ff9c10e672b3311b1b69ed69ff82dbcc168683b75e77491c9d36f7a7f1ddd0801b5acbafb467baca8ab9f28cf7189be701bdf169749290ad4cb58e2a801" + ], + "inputs": [ + "9953e00abe05db134510693a44b8928ca9b29d0009b38d9c4f8dcdedee7edc35", + "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad" + ], + "outputs": [ + { + "uxid": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273 + }, + { + "uxid": "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "50.000000", + "hours": 7273 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 106, + "block_seq": 75, + "unknown": false + }, + "time": 1429096344, + "txn": { + "length": 220, + "type": 0, + "txid": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "inner_hash": "f752c579e2f7663b3e13371c7bb94b09cb047f1cdb597bd52b79c8c81f557b9c", + "timestamp": 1429096344, + "sigs": [ + "d12daa336401481611bf15edf07cfa0b181a1f3e2e8d062c6e8b04d690242cd87db5fd5aebda3bb06c49e8450c18c5c0360d6c4b14686cbb361feb394b5c26f501" + ], + "inputs": [ + "e2807345a3e76b7050038a9ec40d5a62bd4dcc6b1ed79f186213a32caf7008a1" + ], + "outputs": [ + { + "uxid": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "dst": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909 + }, + { + "uxid": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 105, + "block_seq": 76, + "unknown": false + }, + "time": 1429110544, + "txn": { + "length": 317, + "type": 0, + "txid": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "inner_hash": "08a8ae61257645c212216e63a96673001fa581c286eaa4ddcb81f6ffaaff8c1a", + "timestamp": 1429110544, + "sigs": [ + "75489dbb081962833ce1fffbc393f0040e5c75bf45564a3757573eba816b71bd63e8178eef8add2277864d6d251013b6197bd80efdc069b7c5adf27b0372703c01", + "4587b09d2e08de8379fd1505748ea21db3995f2dd18b04ca729f2ebf76c2645a21acc2e5ca5f4b79f6381b91ef21fe4bb72d2415b74f38fc1569b90233211c8d01" + ], + "inputs": [ + "73ad63090201c13e6fb55d2e51ec5606fe49a40640bea995e347e7389fcea6c6", + "4aca4c715985da352bd9aa84787868dac4f4e305c420fe79e6f05acee3bba14a" + ], + "outputs": [ + { + "uxid": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043 + }, + { + "uxid": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 104, + "block_seq": 77, + "unknown": false + }, + "time": 1429147880, + "txn": { + "length": 220, + "type": 0, + "txid": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "inner_hash": "23ab44d59346b369d258cce6d5142ca7e1b52dd09a1512d8a618e08ae7346004", + "timestamp": 1429147880, + "sigs": [ + "6e0bd761d2d9eeb207f0c4cf9f13d1407f33b5f50e72c3462225c8041882ddcd078a02720d533801a433d917674e3d68a98bb997e9b06664a73a9bdeae46404601" + ], + "inputs": [ + "b44ee00208690c2123989f40edaff0224825afb20ca0952fbd90bddfd3213642" + ], + "outputs": [ + { + "uxid": "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "862750.000000", + "hours": 976817 + }, + { + "uxid": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 103, + "block_seq": 78, + "unknown": false + }, + "time": 1429147900, + "txn": { + "length": 317, + "type": 0, + "txid": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "inner_hash": "283b6b1141f7b09348804d18171ec9b0d20446725df1265932a4064385c9c295", + "timestamp": 1429147900, + "sigs": [ + "d16d6a7cd11064a91a6ca4917efe946cc38cb4e7dd59281a4b4098e39bdc151036b72fbf9db4f3ca2b97bdb56a861e8fbe010e52926b176172d3e68b85c7b04501", + "5cd9b19556656a6914d2f8a3daf556220e34eb567a741f015a9de0d53920bfff0e0cb3513551ed7ad95301ac8852487b76a3509832379c57572b46e75f0946cc00" + ], + "inputs": [ + "70dfcdd1a8a321ffd22c4ce313763464f78c2f85a97bb369ac8b82f76d2ea961", + "a96ca17d6af858af8c6f24f607a742ae2979ab8f660b8363b7fbe18625c8a048" + ], + "outputs": [ + { + "uxid": "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "27000.000000", + "hours": 67976 + }, + { + "uxid": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 102, + "block_seq": 79, + "unknown": false + }, + "time": 1429147950, + "txn": { + "length": 317, + "type": 0, + "txid": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "inner_hash": "37931a3c0b9fe54ebfd93e70c5e872ea8f68669bcd38176bc223be01f7e43aa0", + "timestamp": 1429147950, + "sigs": [ + "1d2fa9d76a29f3ce2eda062afe42f3718db434863955ed4f43a83f79dd372a922fd2774d7f5227fa253c65537418b30309932f404e788db91fac1d580d83b28101", + "471ae24bbebd78b5d298edb81e07cc282ce8c1517a2d7426f91f177f111c93873c594e04a215bcd982220b0e6967bd328ec494811cf5eb854091e1d4552545e700" + ], + "inputs": [ + "f5867b05823c81fc53de36b140415b3b98e4f4cec5883512f8553f70c550d8e7", + "22edb5931e1c54382f18e41ef774931efb08c278209a1fe8a34100147b707220" + ], + "outputs": [ + { + "uxid": "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "31000.000000", + "hours": 77792 + }, + { + "uxid": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 101, + "block_seq": 80, + "unknown": false + }, + "time": 1429148000, + "txn": { + "length": 220, + "type": 0, + "txid": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "inner_hash": "3e77cc0080eaa29331c9206044e731992369bf84c89262c80d68b39b68ce77e9", + "timestamp": 1429148000, + "sigs": [ + "94e4ecd0016b2c5b10f55941cc0355a2c248eaa04566dedcf84e83cfee959d50578cb85ca0ee6170060e97a6fc766fa79a4f6e0942605681178d4bb8009b31e501" + ], + "inputs": [ + "dbe677fec72761ed99467a4d45871aafe173d7dc133e8db0346e3f262ae2598a" + ], + "outputs": [ + { + "uxid": "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "26000.000000", + "hours": 8543 + }, + { + "uxid": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 100, + "block_seq": 81, + "unknown": false + }, + "time": 1429164440, + "txn": { + "length": 220, + "type": 0, + "txid": "0cded82aa3ac92d78e23d2d0d7faf93c675fc9a321ad55105f65b6fca444b1e7", + "inner_hash": "0ca2ed02f9155bf69af2fd27b40b0300e0c9804cbd2507389d930ef186f48794", + "timestamp": 1429164440, + "sigs": [ + "68a82ec4421a37b8116c8bad98d2568802973dbce6f0166b3a9504110ee4873239953c3e8baf3a20d599e300c8b2c524d672c46ed593e126adc908f1decbbf5100" + ], + "inputs": [ + "6060c983054614b8801e405de697c443a1edebd3236582f89f01c6cf6a165c3f" + ], + "outputs": [ + { + "uxid": "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861750.000000", + "hours": 125696 + }, + { + "uxid": "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 125696 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 99, + "block_seq": 82, + "unknown": false + }, + "time": 1429164460, + "txn": { + "length": 220, + "type": 0, + "txid": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "inner_hash": "3b3cc2ad41e6248b46bd71e14f91eb2296b730426a8f0481c440271920ddbe27", + "timestamp": 1429164460, + "sigs": [ + "e5711c06db00c26d91126e9d024189c1a494ae1357b55247955a4b3bda219e8905dfa03875c1224e754e5e8b4d475d1ce335f2699cd9d490583cd6a0d1e1338c01" + ], + "inputs": [ + "3a7e60306a5fc882d0c4edcb2990d14be6b80dad1a41b06f8ae5e0308078bafa" + ], + "outputs": [ + { + "uxid": "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "30000.000000", + "hours": 93050 + }, + { + "uxid": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "dst": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 98, + "block_seq": 83, + "unknown": false + }, + "time": 1429164480, + "txn": { + "length": 220, + "type": 0, + "txid": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "inner_hash": "ddf70f29cbcb9ab5d04848c77bb605849c5d831c80afed10f64ea2bde710b7bd", + "timestamp": 1429164480, + "sigs": [ + "21ccec8663f52b64e6d1983c5c715fc360ef1a01a0f4fce857fe7151e59b4cc87a5b6cc18f770eac98ef640eb15d572ea96b81e90a793bb01ac905778c10f0da00" + ], + "inputs": [ + "09661724179523e8aec95862a5fd12dd1aa50f39f193f81eece0d7aea6197103" + ], + "outputs": [ + { + "uxid": "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "30000.000000", + "hours": 27495 + }, + { + "uxid": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 97, + "block_seq": 84, + "unknown": false + }, + "time": 1429164590, + "txn": { + "length": 220, + "type": 0, + "txid": "8374d85130bbcf496bff138cd040f91fa362eb1b6b6a1c7c9285523437d5589c", + "inner_hash": "3188ba9148add7f2811180f130de2c0668fc21c031a7329993b61bfe35f860f1", + "timestamp": 1429164590, + "sigs": [ + "93edab2b508cd33cd76c50a5aeabcbcf35472d25ba2b3f268d1cc0a4a813fbe907f4c0e645893b4efd524d30fabb6ba62d65c2ee050057885eea2ca0d2d1c21500" + ], + "inputs": [ + "6a8bc7ef9e8e7b67fd270cf37022edadb13f1fc2ba4e7a026f7ce2ab30cc4572" + ], + "outputs": [ + { + "uxid": "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "29700.000000", + "hours": 3436 + }, + { + "uxid": "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 3436 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 96, + "block_seq": 85, + "unknown": false + }, + "time": 1429164620, + "txn": { + "length": 220, + "type": 0, + "txid": "b7b42b1b29acab0a2328aaf368ec74be49b4d4caf827e82b439ef4d8be976a55", + "inner_hash": "8b5eec10f63b31e72d4dba2c71fb0f7bc230e58f497e255352f02eee965d3595", + "timestamp": 1429164620, + "sigs": [ + "82587c832f0c74f185603b934a32a28624712373d188caad0355314ea621a4af3e96dbd1c37e889f630d90047c79b39c495b49964eca20172bb900db1df48b3a01" + ], + "inputs": [ + "129726406b3101d51ffd5bfca59a501184d6c8ca363be4ef1b8d8bf48a6c70e0" + ], + "outputs": [ + { + "uxid": "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "861050.000000", + "hours": 20200 + }, + { + "uxid": "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "700.000000", + "hours": 20200 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 95, + "block_seq": 86, + "unknown": false + }, + "time": 1429164720, + "txn": { + "length": 220, + "type": 0, + "txid": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "inner_hash": "47500bd3c5f74835a01b0f696e15780baec2ca3723f45355c9e8cd1c71564d18", + "timestamp": 1429164720, + "sigs": [ + "fdbc112b10354be2b85b2f9131a3927e7b4e87ff8ddef91b849a71e0b1445ebc410b61d85ff7af1834b54febf89d903e3151f5a74ccef4e9607851c9005454d001" + ], + "inputs": [ + "05f42f22f5fea4b5cac8182dc2b4f280149c686434c6d4195a119a8d02ab24b2" + ], + "outputs": [ + { + "uxid": "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "860050.000000", + "hours": 2525 + }, + { + "uxid": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 94, + "block_seq": 87, + "unknown": false + }, + "time": 1429164730, + "txn": { + "length": 220, + "type": 0, + "txid": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "inner_hash": "937bb1627381dc0e982b5b33a119a458db7605a5ff11df1b7a81957460157bad", + "timestamp": 1429164730, + "sigs": [ + "53f091d0b653d50c32aa9bd24c09aa1671b2a8686f744a769a9568d3ea28f7852370d83429dfff6b16b9a721f2ecdf40fe799006229d575cec6e73174e7b84b500" + ], + "inputs": [ + "fa761f3b902ced1ad8e94231af3447315a8c8bcdbbdcfcd69bb74ca5ae66f6e9" + ], + "outputs": [ + { + "uxid": "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "25000.000000", + "hours": 16162 + }, + { + "uxid": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "dst": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 93, + "block_seq": 88, + "unknown": false + }, + "time": 1429164790, + "txn": { + "length": 220, + "type": 0, + "txid": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "inner_hash": "0134889df5d1e5c7a545f1cd6239ea51513534ed08acd503cc77e0b9d74ebcc2", + "timestamp": 1429164790, + "sigs": [ + "9a2582b47df81a77ab148fabe81fa6b1c490b213e0cd79aba779be1c56c225d5591bc6674a08bce27103ce7e1e85756d31c96635ecc07ae40c53ccabb20d254d01" + ], + "inputs": [ + "dc8162cf85ce1a434adebab2d13abffb587c0e50b86fd1a997bca67f07a66ebd" + ], + "outputs": [ + { + "uxid": "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "29000.000000", + "hours": 11912 + }, + { + "uxid": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 92, + "block_seq": 89, + "unknown": false + }, + "time": 1429164800, + "txn": { + "length": 220, + "type": 0, + "txid": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "inner_hash": "0fd405b4d4a74b417a27d0bfd2f0d1acf4ed0499a000e94c64a1443c5bb440bd", + "timestamp": 1429164800, + "sigs": [ + "9bd640adcf2e1870dd4cdd93f007759626ed9fd87dd8e0485888612ea660435a3104889820e6dab8d692efc3e4afb892de622c46b5f5c25718dfb78d4882d2ec01" + ], + "inputs": [ + "15700b88043b3c08a46c3c4e36e7f431291a26aef1ef26c44ee413feee14b950" + ], + "outputs": [ + { + "uxid": "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "28700.000000", + "hours": 635 + }, + { + "uxid": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 91, + "block_seq": 90, + "unknown": false + }, + "time": 1429164810, + "txn": { + "length": 220, + "type": 0, + "txid": "bd617ec27c2bea642fad8c153178e11ca08456d752249324e3011f27c845f87a", + "inner_hash": "f8ce5c9cc22005d7f63c0400132b0e70a6a8af574f1a5c1ffb0404f228a02949", + "timestamp": 1429164810, + "sigs": [ + "b471a7bdde8b1427f8081d9e91250fd89cdd4dd23062796fe2ee973c612eb28b76f6c7ab4f3fbb7c7f9627c52158066d13d9fbe34dfdb6e77c02d84ff4d45d7d01" + ], + "inputs": [ + "4e1a98a72639efa6253a7cbea0f3b499fa24fb88612ad81414d20e46d2b5784e" + ], + "outputs": [ + { + "uxid": "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "859050.000000", + "hours": 2704 + }, + { + "uxid": "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 2704 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 90, + "block_seq": 91, + "unknown": false + }, + "time": 1429164830, + "txn": { + "length": 220, + "type": 0, + "txid": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "inner_hash": "8fdb3ac7731310281c5e67ca521d5b925aee8c7dd34b7b8249ae522ccd450943", + "timestamp": 1429164830, + "sigs": [ + "c1f82dfa176134077c4512421b01bec50360dae178e43ec9ceb70d24ff38301a33c6780db5b80afb49b08d15b303217ce206601c1a29bfef4f3bbdf6ccdf779200" + ], + "inputs": [ + "a68c6c646b6bd42f509a82d0218c8ee648b4a40da20eb0599449a7249b10fee9" + ], + "outputs": [ + { + "uxid": "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "24000.000000", + "hours": 2089 + }, + { + "uxid": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 89, + "block_seq": 92, + "unknown": false + }, + "time": 1429164850, + "txn": { + "length": 220, + "type": 0, + "txid": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "inner_hash": "d8f2215fee34a1104826266582d525f9c267d3a726732ed532fb6572d09b82b6", + "timestamp": 1429164850, + "sigs": [ + "9d5aa480261d4d2dfbb8264ccb2bf8944b6abb5267ad89dda83760273abb8c0116f172e257a661a4d3d89c9c2caf237a13519545173c0df741a7dd18770176a401" + ], + "inputs": [ + "b187246f68a768f65663b8a208ab107a9bc24af6a062acf3ad41aeb899315a49" + ], + "outputs": [ + { + "uxid": "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "28000.000000", + "hours": 1529 + }, + { + "uxid": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "dst": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 88, + "block_seq": 93, + "unknown": false + }, + "time": 1429164860, + "txn": { + "length": 220, + "type": 0, + "txid": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "inner_hash": "72974683d8244d927c63440a169a438611ef88b250f20df2711d83a9f61a75c9", + "timestamp": 1429164860, + "sigs": [ + "1c72245ae55779445ae5a6c030ea7f01cee7c29dd6189d0dcb383ec8438297e635b314c44bb0c4173c9e30d225774ee0334cee186e603a61c171af4db3eb961e01" + ], + "inputs": [ + "24c49699aab32caf9456a6b4dacd4d820c853c7639e5500b3be6326660312917" + ], + "outputs": [ + { + "uxid": "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "27700.000000", + "hours": 129 + }, + { + "uxid": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "dst": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 87, + "block_seq": 94, + "unknown": false + }, + "time": 1429164870, + "txn": { + "length": 220, + "type": 0, + "txid": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "inner_hash": "89c71b68262f8e3acddcec032b4209220ac7b794d1cefa62b45c71b94e017cad", + "timestamp": 1429164870, + "sigs": [ + "ede880d4422a1102280918227157997bb7a36d26a358a71bf016963d29e8403d2298754039d8dd14c0b05d776d05bebadb919a620e87439c93008e292086c94d01" + ], + "inputs": [ + "33e0c4c9536afffd491fef6294f22ffb0d16902493946a051db0b218728a1c44" + ], + "outputs": [ + { + "uxid": "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858050.000000", + "hours": 1829 + }, + { + "uxid": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 86, + "block_seq": 95, + "unknown": false + }, + "time": 1429164880, + "txn": { + "length": 220, + "type": 0, + "txid": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "inner_hash": "20a707a3ccfe4ab0884697e4d9013da5c15f062b0a6f1395086503f2c4d6efb2", + "timestamp": 1429164880, + "sigs": [ + "5fa7614080d2b044f1edce8bc42961d311db3fa4596fa14973261272980c37b0776099a37d758c20a2d45ee73aaed7d007e58f9f15191233f4f27b266fb2866c01" + ], + "inputs": [ + "d45d0597c7d41fdc69ed09a139925327142589f1e4fb877285fa63c6fa126d38" + ], + "outputs": [ + { + "uxid": "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 294 + }, + { + "uxid": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "dst": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 85, + "block_seq": 96, + "unknown": false + }, + "time": 1429164900, + "txn": { + "length": 220, + "type": 0, + "txid": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "inner_hash": "3a68e8622eaf49013554114c0dac32c444998ef6c65ff1afc399bc772787f502", + "timestamp": 1429164900, + "sigs": [ + "8925bcbda7785c7a83a77bd5ce16542e91a8f046163d429fcf9c466ca6a9b1fa5f6b693a19b7d8127717821ae247ba30401068d447d0fde4136c0e49f5e7e57900" + ], + "inputs": [ + "74f7dcc6e516634b5d5722d8664ffabaca3b708a53497bb420ced7c300c39806" + ], + "outputs": [ + { + "uxid": "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4", + "dst": "2M1C5LSZ4Pvu5RWS44bCdY6or3R8grQw7ez", + "coins": "27000.000000", + "hours": 220 + }, + { + "uxid": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "dst": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 84, + "block_seq": 97, + "unknown": false + }, + "time": 1429165260, + "txn": { + "length": 220, + "type": 0, + "txid": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "inner_hash": "d6cfcef60d17c03b68b94c4284746bc70e8ef66cb6d2bd370094a7e4b19dbaed", + "timestamp": 1429165260, + "sigs": [ + "de36c5fac7db61c7a47827e1a9ad1b717d5fa904b69283598eab6003ba1b1e264856f30a6afe0881675e8f11a86e666cec09b789f3971a6ec4ba25183684a18900" + ], + "inputs": [ + "fb4d5dcc1c3ac97444e96aa7da392b0d7faf7b7373504c70e497228a4695a7f1" + ], + "outputs": [ + { + "uxid": "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 54 + }, + { + "uxid": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "dst": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 83, + "block_seq": 98, + "unknown": false + }, + "time": 1429274566, + "txn": { + "length": 220, + "type": 0, + "txid": "fe01250cfdf84eb0182c033c216891e7e6971cc85976c4c46d9e3c608974d233", + "inner_hash": "2400f3951d454f663d5097060267f8e31e86e1c3f10391c8a06ed79fd72fe49b", + "timestamp": 1429274566, + "sigs": [ + "6ecee1ca0e86de9bf6da9a21e49b1cfade8f1a279f7fc58834c15184bec1de634c82faf30bdab34083bc1f32f87d27daa1987a525db83100f88b9103efbc007701" + ], + "inputs": [ + "f32f03f28eece9ddcdc488a85100c94a7c924c185ae560363518dae5e2aacccb" + ], + "outputs": [ + { + "uxid": "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "858000.000000", + "hours": 11848 + }, + { + "uxid": "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 11848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 82, + "block_seq": 99, + "unknown": false + }, + "time": 1429274616, + "txn": { + "length": 571, + "type": 0, + "txid": "819106dc50373e5293a7e79f179693e85536e8206d82272930ec08410d92402a", + "inner_hash": "02e9a06b0ca7f91255107993e00f09e9ef983559088c5febff264c17952033c4", + "timestamp": 1429274616, + "sigs": [ + "efb713e6a1e5d328e94a51fbeb0f73e2a3b7a54e15db75797f0b709f698b16eb26e522f187a98144807e0e6cd294686ff19037975abb6d44b20b2899968954f400", + "b5d011c60020ce591a21db15823c06188515a63ca95d573c36b3af83d634fc6f1c1125db197f6283510ee33890ac168513254ad37524c77294bb5a12e8ff23f300", + "00d87b91eda33f627f6cd28cc673daf929fbec36e7bcfdf894f7491618a68b5755b5baadedc106d53d2da924fcbedbd106eadc50ec611d426720f67426c7286500", + "e64cf7e74363cfd381a3aa6fd17d7c415d6034b26b93017acaf9cf3475ccdffc53c3714d1d13409323cf77ccc81596f6e6edcec11d890979a436ef960bcb5f6900", + "fc2eb05241afdd15cdbd28cc7158d7eb4442f21a678c52332762b23ac6c2fcc76b0f79731987df0ba84d82044cd474d4cda9afda778a21b78a0659c5b588664301" + ], + "inputs": [ + "2987e7c89d353ad5d63cea2bf2724dc5f7a5ef5fb81f5ea160a307f0726ac2f5", + "a52408daa8ce7026c70b61d4df4212fb577462060f340bfce779225b3e18193d", + "dc73aac74348dd285a1456c1fae2204d7c2039d50a765bdaae0c31f7c7e059db", + "e4e375b9dc55ff53d6de9120f1a87ff00e00a779835f8320f2c6b3090d0466e6", + "d11b05345917d171f60c31bd2634041b73b97eae364724369ddb8d53369397fb" + ], + "outputs": [ + { + "uxid": "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "50.000000", + "hours": 7510 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 81, + "block_seq": 100, + "unknown": false + }, + "time": 1429274636, + "txn": { + "length": 183, + "type": 0, + "txid": "9f20b52befed2cbaaa4a066de7119b7fdbff09a83d8e2a82628671f51f3f6551", + "inner_hash": "c2e60dbb6ad5095985d21391cbeb679fd0787c4a20471340d63f8de437d915df", + "timestamp": 1429274636, + "sigs": [ + "2fefd2da9d3b4af87c4157f87da0b1bf82e3d6c9f6427572bd768cf85900d15d36971ffa17eb3b486f7692584102a7a58d9fb3ef57fa24d9a4ab02eba811ef4f00" + ], + "inputs": [ + "aee4af7e06c24bccc2f87b16d0708bfea68ac1b420f97914965f4a23ad9e11d6" + ], + "outputs": [ + { + "uxid": "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23000.000000", + "hours": 87673 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 80, + "block_seq": 101, + "unknown": false + }, + "time": 1429274666, + "txn": { + "length": 183, + "type": 0, + "txid": "e8fe5290afba3933389fd5860dca2cbcc81821028be9c65d0bb7cf4e8d2c4c18", + "inner_hash": "45da31b68748eafdb08ef8bf1ebd1c07c0f14fcb0d66759d6cf4642adc956d06", + "timestamp": 1429274666, + "sigs": [ + "09bce2c888ceceeb19999005cceb1efdee254cacb60edee118b51ffd740ff6503a8f9cbd60a16c7581bfd64f7529b649d0ecc8adbe913686da97fe8c6543189001" + ], + "inputs": [ + "6002f3afc7054c0e1161bcf2b4c1d4d1009440751bc1fe806e0eae33291399f4" + ], + "outputs": [ + { + "uxid": "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "27000.000000", + "hours": 102905 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 79, + "block_seq": 102, + "unknown": false + }, + "time": 1429274686, + "txn": { + "length": 183, + "type": 0, + "txid": "7b13cab45b52dd2df291ec97cf000bf6ea1b647d6fdf0261a7527578d8b71b9d", + "inner_hash": "73bfee3a7c8d4f8a68657ebcaf69a59639f762bfc1a6f4468f3ca4724bc5b9f8", + "timestamp": 1429274686, + "sigs": [ + "c4bcada17604a4a62baf50f929655027f2913639c27b773871f2135b72553c1959737e39d50e8349ffa5a7679de845aa6370999dbaaff4c7f9fd01260818683901" + ], + "inputs": [ + "4e75b4bced3404590d38ca06440c275d7fd86618a84966a0a1053fb18164e898" + ], + "outputs": [ + { + "uxid": "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26700.000000", + "hours": 101435 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 78, + "block_seq": 103, + "unknown": false + }, + "time": 1429278106, + "txn": { + "length": 220, + "type": 0, + "txid": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "inner_hash": "83e206eb05ce5708efd174bb9df2c0bc0741c1775e50d139aebf37ed6c46381d", + "timestamp": 1429278106, + "sigs": [ + "a6206409a077ec30fe7f0b0ad5162805dffbff743afbc9e8e926d72ae38d15f80ab8183150caa4d745125c1c6e733428e299742d10e07a64ba5bd21d4e5ee06f00" + ], + "inputs": [ + "0a5603a1a5aeda575aa498cdaec5a4c893a28669dba84163eba2e90db3d9f39d" + ], + "outputs": [ + { + "uxid": "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26600.000000", + "hours": 12679 + }, + { + "uxid": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "dst": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 77, + "block_seq": 104, + "unknown": false + }, + "time": 1429278406, + "txn": { + "length": 220, + "type": 0, + "txid": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "inner_hash": "4a9c25a15fe166d87b3fb6474360b39aa52703b70b961212f9494393a3c71c80", + "timestamp": 1429278406, + "sigs": [ + "0c8c4e941af19993051d5e7d0aba7414e066d15dcee9bd3eb1f7fab3259fe0345dff7ed1fa68eb243883a3793f3febc7b7eeb7a619601ec9248ec5c063707e2b01" + ], + "inputs": [ + "194cc596d2beda803d8142ddc455872082f84b09a5edd8085082b60d314c1e29" + ], + "outputs": [ + { + "uxid": "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22900.000000", + "hours": 13730 + }, + { + "uxid": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 76, + "block_seq": 105, + "unknown": false + }, + "time": 1429278556, + "txn": { + "length": 220, + "type": 0, + "txid": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "inner_hash": "614d7754fa0633e1a701eea3b3a2ce1c2815360f311cd1cb6cf46d5ae94304ba", + "timestamp": 1429278556, + "sigs": [ + "bd20e6b6754308d192ba734a573ec4363dae5326b9b21a7203904c076b067bf9313df1df8ac8960f12d9d8b642deb411a504512990181bc2e53264cf661b868f00" + ], + "inputs": [ + "1e30e9dfe00e055404063e52a4154a72492b13de6acf4871ec5ea6d7c0fcc968" + ], + "outputs": [ + { + "uxid": "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26500.000000", + "hours": 1861 + }, + { + "uxid": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 75, + "block_seq": 106, + "unknown": false + }, + "time": 1429279796, + "txn": { + "length": 511, + "type": 0, + "txid": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "inner_hash": "2ab03a15a9f312d27919ec42a27dfefc5fc5e0b8bf451eb81ef545bf4497f524", + "timestamp": 1429279796, + "sigs": [ + "9dd44c7d76d454c7c658649d94e08f75354ba568aae069b38da012f07eacbcfe2a5bbe9b4444f566336c23a03f3625eb4306791437e1bfe69f43efa0c109ec2d01", + "211d2607cef832c989563a3475daf6aa1fec6d73893a72666b5428c6bd93217605990bc3b45f4cf4863a648708ca3bf3526eb1644679f313a297daf82b1865bf01", + "f7e77964485e36b15ade78aacc17407af265c7144767e3f39bfd9765869f90cd0f33120ca996154db82d5462d626f3ae299c8f3b8cc862284432919cfeb6613d01", + "3a1e491d35ad5daa1af54872b5ec1d02c6654cad8f2bcd94c2a624c1a3cd5c9163c373f06a931b5de526654bdbc5cdd221b7fcf7b77329d452562080216ca8fe00" + ], + "inputs": [ + "99b4e51e1afd04813656e6202c7e462d88ce87ba980da7a62591190d72d1073c", + "f12164a6ea6ce65ff2ca1f2be7251bece8f7c5747ba8ec68e1ec3b27d45d7b9c", + "427462efeb07a6803f013c789ea43d93240f74f886bf9afd63dc1936a7574a37", + "f9bffdcbe252acb1c3a8a1e8c99829342ba1963860d5692eebaeb9bcfbcaf274" + ], + "outputs": [ + { + "uxid": "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "885000.000000", + "hours": 139293 + }, + { + "uxid": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 74, + "block_seq": 107, + "unknown": false + }, + "time": 1429280596, + "txn": { + "length": 220, + "type": 0, + "txid": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "inner_hash": "9566ef1826b7f518c043395c2b7a37014f77f8e23796c1c78e55d1fc443a02da", + "timestamp": 1429280596, + "sigs": [ + "2773830af5e34a3de4a3ce935ee08c189feaa30ab41ced8f78f9a6434198d9775c58a0b9bcc2931f3d0dfde541ef7f5d3c1cfcf5415776dbd9d871ce036ec42900" + ], + "inputs": [ + "dfd2834342f3a7caf183472c17801aafacd1775378eb843509d17ad858456cb0" + ], + "outputs": [ + { + "uxid": "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "884900.000000", + "hours": 17411 + }, + { + "uxid": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "dst": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 73, + "block_seq": 108, + "unknown": false + }, + "time": 1429280756, + "txn": { + "length": 220, + "type": 0, + "txid": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "inner_hash": "6daf17a44251b984449effe21e605ab556ef565940043cff6cc75cb042028783", + "timestamp": 1429280756, + "sigs": [ + "dd67813bd08a88b24f695ac10d4390598b25cf19e4edad19091f3b723c4780653a62639153b9bbb53331b66b46dc8c84e719178a96bcd001eb7f2e147268bb2e00" + ], + "inputs": [ + "aa1133a42417332af8b58e71cc14a651e2731563eaea35f0feacc1e97fac6eef" + ], + "outputs": [ + { + "uxid": "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22800.000000", + "hours": 3457 + }, + { + "uxid": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 72, + "block_seq": 109, + "unknown": false + }, + "time": 1429302756, + "txn": { + "length": 220, + "type": 0, + "txid": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "inner_hash": "1d2404a84798154867ab461179a2b4300d65e4886cbb0220f0d5d0b16bbb7628", + "timestamp": 1429302756, + "sigs": [ + "3fcfe6d7fe59b9998ac4260c3b788384b2ebb7137e08e3ffc8d8b6efa23490e71f94f381c61af4966ba6a4fb4173079d5a7f31518030900f6c10d64ceb0b774f00" + ], + "inputs": [ + "8ac39d41ec014ca6625e5f17e1fbe62db7a4ac154e0e42a017efa037935ae968" + ], + "outputs": [ + { + "uxid": "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "881900.000000", + "hours": 7092 + }, + { + "uxid": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "dst": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 71, + "block_seq": 110, + "unknown": false + }, + "time": 1429326351, + "txn": { + "length": 220, + "type": 0, + "txid": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "inner_hash": "bcc319504908b93f4418244049157875514fed19ce76977435d00b7ab712254a", + "timestamp": 1429326351, + "sigs": [ + "41b8178ba19326c7f61b5327846c8057bef05c47f2068ff3eaef80bb26bde18642d444647f8c623ca8a3abb040f3527c28737534bc2d1b8c5d53bf71f4c1628c00" + ], + "inputs": [ + "4326c936322df6d59b3b539ea340eb9630c7f8484eba2aeba1a0ed4d431ab614" + ], + "outputs": [ + { + "uxid": "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22700.000000", + "hours": 17848 + }, + { + "uxid": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "dst": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 70, + "block_seq": 111, + "unknown": false + }, + "time": 1429348072, + "txn": { + "length": 220, + "type": 0, + "txid": "6ce27da2ddbc15f03330960b4201dbb3a066ad2e9bbd5366a9564f6befdcae2e", + "inner_hash": "2db237d697bd17aab9121cdfc4d72fa1cbfe7fd37d7f71b1a857833bb56b7dd7", + "timestamp": 1429348072, + "sigs": [ + "c50715bd2e53ed971b7559ccaf8a930dae335dc45cad18a25ccfea3209ea2c971e0dc6cc57ff1dbcde49ddfdc612e71e923adcd21b68eaa0eb239bc83a50ff2b01" + ], + "inputs": [ + "f9bf35f993452b3d490668bb579fd272da969a1bcca8de0c25000ee57b5d7f54" + ], + "outputs": [ + { + "uxid": "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "12700.000000", + "hours": 2231 + }, + { + "uxid": "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10000.000000", + "hours": 2231 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 69, + "block_seq": 112, + "unknown": false + }, + "time": 1429348102, + "txn": { + "length": 317, + "type": 0, + "txid": "f8a24a25a8e3b206db7ea8a0bd8eeb0f8087f50d230c81a538316bcc5152da3d", + "inner_hash": "cfca9a1aa2ab7ea4d643700ac89e9544f1d4e9ef85e28d1cedeece11469fb885", + "timestamp": 1429348102, + "sigs": [ + "5b68d315f4e84cdae4936db6bb7c8466977e784851b605d1fbc1e0bb65fe259d58d6be37228c96bccb1a1c1e9d316d9102fcfaefeda614e67af20464bc877f2101", + "fdd919590553d428d9b8121644127651c68b5207af9798aaaa6ed18134c5835b5311bb547e07e47157a4fd89867c88a48700255610efd2a3e3f77dc82f5fb3ba01" + ], + "inputs": [ + "bae0e928b795e2a80c88161afcbc102dcad6644386f6f44050dde8d586750140", + "94889dbe1c20eb942b7932c5301737537ac33abd9c81d72e1642ddc70ce320e0" + ], + "outputs": [ + { + "uxid": "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873900.000000", + "hours": 1388810 + }, + { + "uxid": "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "18000.000000", + "hours": 1388810 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113, + "unknown": false + }, + "time": 1429348172, + "txn": { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "timestamp": 1429348172, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 67, + "block_seq": 114, + "unknown": false + }, + "time": 1429348502, + "txn": { + "length": 220, + "type": 0, + "txid": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "inner_hash": "b62f9938b195211810976e1719b152fe6c381879adba6061f4ca36d74c06bea2", + "timestamp": 1429348502, + "sigs": [ + "9d40ed257bb7586c7d72e90bd99c6883fb836d400107686ba477850c2b63a86b5ad885aa37f352d334d930ea3814844e67a6ac438c36b919daff273a66f21e5201" + ], + "inputs": [ + "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9" + ], + "outputs": [ + { + "uxid": "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873700.000000", + "hours": 21700 + }, + { + "uxid": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 66, + "block_seq": 115, + "unknown": false + }, + "time": 1429348712, + "txn": { + "length": 220, + "type": 0, + "txid": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "inner_hash": "253c14d68558b09c034d4945284f5cc3025b9e05723c6e4fa7d95f1e68edb211", + "timestamp": 1429348712, + "sigs": [ + "4920f49d47105801fab73c2398bee61ce56bb0b58dd69ab35ec1f959a3b8a8003c2821510d3a97d09f7a4a9f943b04d888b1327539ff48216f148fca693dde5d01" + ], + "inputs": [ + "6ad7993fb2728c2c53ac2c8395a6c62d03c5ef9298ca467e7998fb64fd0c90b4" + ], + "outputs": [ + { + "uxid": "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873600.000000", + "hours": 2712 + }, + { + "uxid": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 65, + "block_seq": 116, + "unknown": false + }, + "time": 1429349392, + "txn": { + "length": 220, + "type": 0, + "txid": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "inner_hash": "d78596837a36ece9a8bc3a8eed424612651039f4f229969c42ec3d7fd1aceff2", + "timestamp": 1429349392, + "sigs": [ + "e22e89ecb303d5eee59eca8a75e0d5b4fdfa3a256576d7ac91264b4c3bf882ce7186572ab68fd1ad4dc837039ef4d7063ead72365506aed71cfe4de0b0449b4900" + ], + "inputs": [ + "2426f768e00345b641f5b4b4b058c308d528e22437bc6e552f0a9d5bd665e14a" + ], + "outputs": [ + { + "uxid": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "dst": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785 + }, + { + "uxid": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 64, + "block_seq": 117, + "unknown": false + }, + "time": 1429351912, + "txn": { + "length": 220, + "type": 0, + "txid": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "inner_hash": "258acd45e194051214c9783184c2a9157558e595c4e4da814258f0ffd0e9dd64", + "timestamp": 1429351912, + "sigs": [ + "9f44be793a0cb218b6836dfa52e5b8c38fe2b1257d27fcea49f4c6a6ed910f446e8a96a987fc06c6b6ae13ea8ea0290e91ea40b6f8eeaf8054e8efd17306573201" + ], + "inputs": [ + "0976005ab4540e8211cd929f19634bfaa2f5d8e24177ddb5b803b447ea91f8c3" + ], + "outputs": [ + { + "uxid": "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "863600.000000", + "hours": 20965 + }, + { + "uxid": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "dst": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118, + "unknown": false + }, + "time": 1429364072, + "txn": { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "timestamp": 1429364072, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 62, + "block_seq": 119, + "unknown": false + }, + "time": 1429364282, + "txn": { + "length": 220, + "type": 0, + "txid": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "inner_hash": "bd2066b342e0af8c4bfecd15d3a87f168cac47d1f900642b69b23fbf18bfed05", + "timestamp": 1429364282, + "sigs": [ + "ea1adfe309f30a15691fc3e267b19d7b765983694245adbebd92924db1adb67668d4dc8a6467e54323d245a35c0ed822593e10de2fd6c4674d3040b53099a6aa01" + ], + "inputs": [ + "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd" + ], + "outputs": [ + { + "uxid": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846 + }, + { + "uxid": "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b", + "dst": "f38daJDg8rpwL5xWgMY78fBHncQ1N5gQZ7", + "coins": "38.000000", + "hours": 3846 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120, + "unknown": false + }, + "time": 1429364452, + "txn": { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "timestamp": 1429364452, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121, + "unknown": false + }, + "time": 1429382678, + "txn": { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "timestamp": 1429382678, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 59, + "block_seq": 122, + "unknown": false + }, + "time": 1429382898, + "txn": { + "length": 220, + "type": 0, + "txid": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "inner_hash": "586a8297d8d148f79d8529fbc3e356f5de9570a3c34bc1ba8494b8269b03d0f2", + "timestamp": 1429382898, + "sigs": [ + "cccee00def7817ec1b36ba5b02066f82eae188afc3e05e61524c62d19fe095e0363db085da6591841314da5f836f2f0068eae522e3d3937d2f96de99f924af6a01" + ], + "inputs": [ + "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c" + ], + "outputs": [ + { + "uxid": "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "765600.000000", + "hours": 47330 + }, + { + "uxid": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 58, + "block_seq": 123, + "unknown": false + }, + "time": 1429451746, + "txn": { + "length": 220, + "type": 0, + "txid": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "inner_hash": "2a87bcb0049b9971713a2e46b75b348785adca751b151290a411bfa5a0ed2287", + "timestamp": 1429451746, + "sigs": [ + "0da91c351fb050c243c7b587005bee14ccc2951897ffdf720ad9c757c5946e516a20ca0d92c5f84957161d10a74deab05a2b530ab5bbcd7ad01266213b5eb38401" + ], + "inputs": [ + "998487775c0e58420673b70204b83c1d6bb5b70e34b1aa0f8169c85ecec2438e" + ], + "outputs": [ + { + "uxid": "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "755600.000000", + "hours": 5916 + }, + { + "uxid": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 57, + "block_seq": 124, + "unknown": false + }, + "time": 1429522086, + "txn": { + "length": 220, + "type": 0, + "txid": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "inner_hash": "9cdad9a848f5b2993d1e5d0593e952b39ccdf7ae56bd13851449797cccdced5f", + "timestamp": 1429522086, + "sigs": [ + "1f3d02abe6811c83b4f4b2e270366e8d4c591866b6e984cb8bdea5d80ca1edbb04d651449070bbca22a8c7cfb3d23a6f85c0a5a7e3226e2d0520330faf16291401" + ], + "inputs": [ + "6fb116c110fe391448a1dcb985b67439c2e9a71d8bb2fd1cf345ac73ada6166a" + ], + "outputs": [ + { + "uxid": "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "750600.000000", + "hours": 739 + }, + { + "uxid": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "dst": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 56, + "block_seq": 125, + "unknown": false + }, + "time": 1429578056, + "txn": { + "length": 220, + "type": 0, + "txid": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "inner_hash": "1090d10a5a2210dc205d6f8447918670f9351feed057c76423629b4699777dcb", + "timestamp": 1429578056, + "sigs": [ + "39817412c5edb4cd928aa3b79a022d4b3276af74eb377d3821c1e95e4d6c6acd61ebbf5eb5d32f87686b6cb4f09c2660e1f148192873208fc963d67a6945fe0101" + ], + "inputs": [ + "04471fb0797bb931e883f7b95cfff6ee4fea5e19a352ca5425fcd353c4f6aba4" + ], + "outputs": [ + { + "uxid": "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "738100.000000", + "hours": 92 + }, + { + "uxid": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "dst": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 55, + "block_seq": 126, + "unknown": false + }, + "time": 1429680646, + "txn": { + "length": 317, + "type": 0, + "txid": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "inner_hash": "3587ee0a091f047bce0dc6f3a45ba08a0c95db33790c53185f6dfd626040b306", + "timestamp": 1429680646, + "sigs": [ + "7753de16df3b46c78529de293ed45ab7d566f3a2fdeeff381aa8bc903111e62c117ce54623e582dceab853fd4d9431e05bd003ae0f470db915e555d3d6dea80500", + "414a1f765e1f437799d095f76a3e0ce23ab9ebe150be93e4f3d0abd72eb403ed32ddb15d36956fc9142cd4b5875d5769803e197bab3ecf91f6b72e75087f40b000" + ], + "inputs": [ + "e2512ec90800147d0d9ddbd0778511ee5a45a25efcb354c50a101738a65462c5", + "6e2abc4bc7820178358a603b7d99c4b39735dd1685d0c5a778ab63f29c9e93d9" + ], + "outputs": [ + { + "uxid": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310 + }, + { + "uxid": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "dst": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 54, + "block_seq": 127, + "unknown": false + }, + "time": 1429848410, + "txn": { + "length": 317, + "type": 0, + "txid": "243e1baa955c3f0af42d7acc4c920437dd0a99c754d6c5c2b7defcd143ff288d", + "inner_hash": "e7e030478e5828f44ec15b734638e8c2828f015b2fa5ca2823d24af3ad111ae6", + "timestamp": 1429848410, + "sigs": [ + "1519c5c730648e7be553b2738aaeff38266735276e640c8f8d455f33c4fc07283ae5a7da47742df118337ff0548efebb1c75d0350a4e578ff95269182779db2201", + "ee099f6f42c813d13f097e9b3a8604067d6afd3718e6eeacd88fb25050d42b8603a42c4f7d24058483f70328a24fc91cd6ef190286c4a678e28b757143e23dc701" + ], + "inputs": [ + "c5df36ce47f6f183475317ab1c53eaa65428c142cb3e3906bf162d80519a203f", + "53b376413d550663ab51b229df8b0f55e4055d6577c2d8b5cec8ff748fe0e958" + ], + "outputs": [ + { + "uxid": "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "30600.000000", + "hours": 528376 + }, + { + "uxid": "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "100.000000", + "hours": 528376 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 53, + "block_seq": 128, + "unknown": false + }, + "time": 1429849170, + "txn": { + "length": 317, + "type": 0, + "txid": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "inner_hash": "e23ed05dee949be1aabf237db1fd81be8d73c838eb0ee3026104807053269431", + "timestamp": 1429849170, + "sigs": [ + "8e9b1733227a841009881663a50e1e01ac2790f16416c6f973c89e15a8fc216044e156cc8fee84d3e3cc6371e4da340f5312726bfd66f16a635542d63c869c7101", + "d1f6b7078a9032159a165ffbfb1e0665bf9ced2c3d5db795fd5bd11fc53d790f56589cbbffd117eec50aa0dc8c0e65eccb13c5ccb5d39dc9bae739a49dda03b201" + ], + "inputs": [ + "6b616ad99a946538c3ab101f245bcab211ab39507848425e80cbfc8ec5bdbc67", + "ef488d5f4a019502115d3b6b50bd364692315c3954d7e93c3ca22e11b92fc528" + ], + "outputs": [ + { + "uxid": "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "737200.000000", + "hours": 6994818 + }, + { + "uxid": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "dst": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 52, + "block_seq": 129, + "unknown": false + }, + "time": 1429849180, + "txn": { + "length": 220, + "type": 0, + "txid": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "inner_hash": "3381919a36bb294377845155efa9f6ebb9314abbe5f9904b20ece45eb0960dc6", + "timestamp": 1429849180, + "sigs": [ + "0a7f9eb68798320106f652933bd07181c80571a6f66215a5b10531f1205e0f300c702324cf9c368e67fef67dc42fbfee5bb13377c435873e549d9fd6962bad9501" + ], + "inputs": [ + "8169bf7f8fa21dc6400b60678b302946cf2765f44893ec8466262fc69b710591" + ], + "outputs": [ + { + "uxid": "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29600.000000", + "hours": 66854 + }, + { + "uxid": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 51, + "block_seq": 130, + "unknown": false + }, + "time": 1430311531, + "txn": { + "length": 220, + "type": 0, + "txid": "2df67e974b03b46be4e59fcf2f8b751d501f17f8610d5adf94551a7ecc6a58af", + "inner_hash": "be6b1ad4d9985314d2bc6434f8a49cef708e7461f047154c7283e2a4ed13aae4", + "timestamp": 1430311531, + "sigs": [ + "abbfcf7922d466e79c976809cf58932a7030db6b54465a2166168617e6acdafd3d7d62391c626e9c150155c63bee7cc887d84fb5f017298a0ce7c33859b21a4500" + ], + "inputs": [ + "78126a08c4dd4ea7ca2d6c9f9d4614fa58896ec4ea301cb9b450104b00bc1b94" + ], + "outputs": [ + { + "uxid": "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28600.000000", + "hours": 8356 + }, + { + "uxid": "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "1000.000000", + "hours": 8356 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 50, + "block_seq": 131, + "unknown": false + }, + "time": 1430330041, + "txn": { + "length": 220, + "type": 0, + "txid": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "inner_hash": "4854d5689f4c2b770d887ebf7f7d3fb975b295b0180d9354d69f2e322ae8b7b7", + "timestamp": 1430330041, + "sigs": [ + "d213d50e53ceffd053571431b78fa6417abae8a7c5080dd3f8cece59dc61ad2444dd541540f5734d34dca94b3b975b613da0800121af8ec83b6f20d81cd53ffd01" + ], + "inputs": [ + "ecb92dc2f43d4c6ca124575d8456d8894f3cb137875287beaa73180fcae2b3ca" + ], + "outputs": [ + { + "uxid": "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "736000.000000", + "hours": 12709509 + }, + { + "uxid": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 49, + "block_seq": 132, + "unknown": false + }, + "time": 1430330311, + "txn": { + "length": 220, + "type": 0, + "txid": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "inner_hash": "3a4ac407aeec6233d3edf787d5b1f4d8257b594e9ee9d0ad3c32781053579b36", + "timestamp": 1430330311, + "sigs": [ + "f37f3398240cee8e38c41945db72d4feda20f88a2250528fe1165533acdc7dfc0f99c7db0fc965847a100d0a2f598537cdd8c73a96c5fbb4e5e85dbfd9a4384701" + ], + "inputs": [ + "6b4ca83b3f73b62161c90c6da03dff460ca9a5a3ccd6fafca140137416dedc58" + ], + "outputs": [ + { + "uxid": "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "735000.000000", + "hours": 1588688 + }, + { + "uxid": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 48, + "block_seq": 133, + "unknown": false + }, + "time": 1430330421, + "txn": { + "length": 220, + "type": 0, + "txid": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "inner_hash": "58e355edef48ff22e9a83952130c1bd8fe9a7f9bec7b2e0535c103c0146604c6", + "timestamp": 1430330421, + "sigs": [ + "09baa4739816e5a86a46ecc30df8c00a5f046ad687f0674250640b6df2361dfe3723667872e0f6deb1d3447948e30b06f02b056a62da9dbaaef4db000eab747e01" + ], + "inputs": [ + "2cd58783beb8a9f6278f7a097151531091b5f15afd7735e1facf02aa720c1191" + ], + "outputs": [ + { + "uxid": "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734500.000000", + "hours": 198586 + }, + { + "uxid": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 47, + "block_seq": 134, + "unknown": false + }, + "time": 1430330481, + "txn": { + "length": 220, + "type": 0, + "txid": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "inner_hash": "44886be6952cd483b9425d314836714af65037b58923aa2432ea946131ae10f6", + "timestamp": 1430330481, + "sigs": [ + "7990cb04634a5e0de397917e56480805915c73d265fe466757a9e677067483787d457c7e9931a89daa6260c7a262f49ef1503cc88008809c193f1f949badcfbb01" + ], + "inputs": [ + "52288a441c70260f6a3eab0e271969d54492377615a6fba8ec3ad26f11dc9768" + ], + "outputs": [ + { + "uxid": "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "734400.000000", + "hours": 24823 + }, + { + "uxid": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 46, + "block_seq": 135, + "unknown": false + }, + "time": 1430330591, + "txn": { + "length": 220, + "type": 0, + "txid": "072f0738f834db0030d777e6ec0e0443627c51cecffcc55e41d43b0b8edd40d1", + "inner_hash": "e87dc97ec672bb45a3417f307e6f6a1cd75b26f508f188c0554484740ffea8cd", + "timestamp": 1430330591, + "sigs": [ + "da4e898bdf324ab50d8f007ee4c65ab832ba64cf86fd0a601e7007a4c3ac2eaa6f1304a3fc8088b108e3f417e5b7c90cbc7d80c059885d397ae978da89c92d5f00" + ], + "inputs": [ + "e29ec214f4afd79e6465d03e4d88e552dc69654750a725d74873ee366c58e552" + ], + "outputs": [ + { + "uxid": "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "733400.000000", + "hours": 3102 + }, + { + "uxid": "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 3102 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 45, + "block_seq": 136, + "unknown": false + }, + "time": 1430330851, + "txn": { + "length": 220, + "type": 0, + "txid": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "inner_hash": "8096fec4a2738f5b79df5359724f6cd7597c0d8c5bc18419f5825c5312e1dac0", + "timestamp": 1430330851, + "sigs": [ + "315cc1de04ad6d1d68e9d63027cff2abc74d5b11a376623d70211ac0e8b9feed4c7f7952634d60b57604edfbe63f02bef172486320e9790d0bb6e44099d6473500" + ], + "inputs": [ + "8ea58a3736b35f0e3781e94198e8b73bba2536704b84b15900fb32701db8893e" + ], + "outputs": [ + { + "uxid": "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "732400.000000", + "hours": 387 + }, + { + "uxid": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "dst": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 44, + "block_seq": 137, + "unknown": false + }, + "time": 1430504186, + "txn": { + "length": 220, + "type": 0, + "txid": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "inner_hash": "a7ef2323ca6ef0a15173dcc2ef44c0abd10933be70337360408ffb4087affb80", + "timestamp": 1430504186, + "sigs": [ + "9a30550db56d9c9ae901d835f856761b9c4298d56ffa94bf41eff5550ac180851189f2adf2e184b6f23485a1405eacb2d4cc937ff05490fb0bc609e654effd7900" + ], + "inputs": [ + "a1ed39cded6d9a0605b52f25cbedb363e57a168d1ad1d1db437816a401c061ab" + ], + "outputs": [ + { + "uxid": "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "731400.000000", + "hours": 48 + }, + { + "uxid": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 43, + "block_seq": 138, + "unknown": false + }, + "time": 1430504236, + "txn": { + "length": 220, + "type": 0, + "txid": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "inner_hash": "feeb2f638e91dd685e6fe179edc7622ef3fcc8a5a7e795c07be12e03f221f67f", + "timestamp": 1430504236, + "sigs": [ + "a0c15d7d5f36afc4c78045aae19c8d41a8652f0cb6d633622a1e55b4e54cd5a33113b02c24b02cca10797043d992aaac98bdbb33addd038611ac324795733c0b00" + ], + "inputs": [ + "f89c968840831d03abaf3c41cf8a405e4b4ddbfb19f5ba300a8ea8e4dcb1d9a4" + ], + "outputs": [ + { + "uxid": "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "730200.000000", + "hours": 6 + }, + { + "uxid": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "dst": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 42, + "block_seq": 139, + "unknown": false + }, + "time": 1430504536, + "txn": { + "length": 220, + "type": 0, + "txid": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "inner_hash": "eead8ec3c5e86e73f1e7add274fdbe0cecd5cd68c4fcd3cf17c1c7af9c5ee43d", + "timestamp": 1430504536, + "sigs": [ + "d6331b6d3270100b8b009bbd343d6b82208d622b27ca3a4b371492b9c792f8433c981c57dfc760a3974f13acd86bbb24555b958e0c67e247c5a39d97295022d601" + ], + "inputs": [ + "36972dc046829caa340eaecbfeb42f4174bcdecfb87296d56503e5fb10e9de8d" + ], + "outputs": [ + { + "uxid": "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "729200.000000", + "hours": 0 + }, + { + "uxid": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "dst": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 41, + "block_seq": 140, + "unknown": false + }, + "time": 1430504746, + "txn": { + "length": 220, + "type": 0, + "txid": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "inner_hash": "efeb898fd032831cdd6d7c311f496f4c2622ee11bedc2831b6411cab51d44736", + "timestamp": 1430504746, + "sigs": [ + "1646b02579d23e2350e2bc47340e027ad5f74bf55aba41fc1244631ba1e0577b681d364c3802017b5cc5d5fda972d23ac9bffabd6159384223a26aba5f08406401" + ], + "inputs": [ + "6962c7c1fcc98f532a9003990163bb251811a4700257968a641b1fe975cfc51d" + ], + "outputs": [ + { + "uxid": "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "728200.000000", + "hours": 0 + }, + { + "uxid": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 40, + "block_seq": 141, + "unknown": false + }, + "time": 1430504846, + "txn": { + "length": 220, + "type": 0, + "txid": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "inner_hash": "529b1fd21087bf52cb3ebcf02dbe1e3ce5de9daefa9754e5b6cde7be2d8ab0c7", + "timestamp": 1430504846, + "sigs": [ + "8612c9e160f3e0d7cdcb2adf3611bde867dcb766c63ec4312a9251ba9b6ea6997c0d9a6ce26beaae01e82c22d2b61e5ae7f87aeaf0679fde395888aebafde94500" + ], + "inputs": [ + "d53fae3b48bde2d1328964a2e7f42e8e833983db159ba30f627926dea0db7df0" + ], + "outputs": [ + { + "uxid": "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "725700.000000", + "hours": 0 + }, + { + "uxid": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "dst": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 39, + "block_seq": 142, + "unknown": false + }, + "time": 1430504966, + "txn": { + "length": 220, + "type": 0, + "txid": "030177271beee04f1a0974d0c5042f07c7ca1db1c5d496fbee3c441b1b7c5bee", + "inner_hash": "d954f0ee1a437cf3809961063145bb205633ac66d9a29e1386eddb13503ddac1", + "timestamp": 1430504966, + "sigs": [ + "6e5661f0212dfa0800df968dac30f931335d7fe99d23932878d7d2c06bf69691328d66897c3a5c023535035ed95de3b396ea162e4482e70cda5ec9d4c8e36d4b01" + ], + "inputs": [ + "228794e6b3eb69aecc5334e140afbad22883326dcf229bd3092f238ed9ec800f" + ], + "outputs": [ + { + "uxid": "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724700.000000", + "hours": 0 + }, + { + "uxid": "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 38, + "block_seq": 143, + "unknown": false + }, + "time": 1430505086, + "txn": { + "length": 220, + "type": 0, + "txid": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "inner_hash": "8fa5487fbcb62adb17287cc80ea02f113f036035e486fe7a37a96a98d32582b8", + "timestamp": 1430505086, + "sigs": [ + "ba2442a6f68ef825f2921dc135eca398904426f8d225eb122b210670d1b3bf1b2279abcd5cce5c18533dd8ca0286b23e2be9605f1cb6a5820bc1c783e95b833401" + ], + "inputs": [ + "6efc30b4c943ba4de8d2c89901a0b2a4d9a0ecf34713917eae37c6debca616ed" + ], + "outputs": [ + { + "uxid": "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "724200.000000", + "hours": 0 + }, + { + "uxid": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "dst": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 37, + "block_seq": 144, + "unknown": false + }, + "time": 1430505176, + "txn": { + "length": 220, + "type": 0, + "txid": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "inner_hash": "111d56ae43b76740e905717e1e440f7611e922c50e83cf84b9edc51efa0271f2", + "timestamp": 1430505176, + "sigs": [ + "18f2b86a6b51999f0fdc73d411c1db827730652ba2c098f1ff3f3dc0d409d6cf745d18d66bf25dae7e5a975e33f32e8d2b352c025a8e20ff15a68aaa60b1bbb700" + ], + "inputs": [ + "6c8b1ba9dc7e8900b42d55e9fbe6ea0e00d7eaccf67a7b66c0a2b771cf88ea05" + ], + "outputs": [ + { + "uxid": "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "723200.000000", + "hours": 0 + }, + { + "uxid": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "dst": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 36, + "block_seq": 145, + "unknown": false + }, + "time": 1430550936, + "txn": { + "length": 280, + "type": 0, + "txid": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "inner_hash": "c41100ec46608d1982d52cce518abf64c3853a0fff71349c001accff2204de2a", + "timestamp": 1430550936, + "sigs": [ + "f5521c2b488dbbd7bd856275b903e176f61a5cc940855d502493b834755fa9037cdf484fef8b3c7950ee166fa1db7bacc5ed18f96b48e13f849c96d76463dd6800", + "f324406fc1ad817ad53cd6d7718b914172ed80828650a6c7a4bd69143dd6be5e681ad4cc897ba5f237bb40836368c580e3fc8231c80ad0f91bf1fd17df28f3b800" + ], + "inputs": [ + "c2fcd55cf6b73e863c96f7c2d6251069199bfd43688d2515f5c6631688aadcbc", + "06292fe8a2036c38f28c4d2f355d9e86e2b55b9d85f84613a64cf5c35d192b28" + ], + "outputs": [ + { + "uxid": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 35, + "block_seq": 146, + "unknown": false + }, + "time": 1430641376, + "txn": { + "length": 220, + "type": 0, + "txid": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "inner_hash": "b792056beaf4a864c92e40ad63f9117fae52f4bfda9f88aa74f1255490c28ef6", + "timestamp": 1430641376, + "sigs": [ + "1d98fdd17853e4265c17644a993fdbe5047418b7be96258fdf3c2b3e9c739b1d72c5acc23981dac2d478966834fafa1f98aab2402ce37fe818d3919cf490a5e900" + ], + "inputs": [ + "59d44fefbe86ebae4118dee90609d6a1c08c36f259c65e3fad63b9e41c37bf0c" + ], + "outputs": [ + { + "uxid": "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "722200.000000", + "hours": 1149084 + }, + { + "uxid": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 34, + "block_seq": 147, + "unknown": false + }, + "time": 1430641536, + "txn": { + "length": 220, + "type": 0, + "txid": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "inner_hash": "aeceb514529fcf9de954599318d804301689818b8d5c90cdbd3bdf6ce3768c47", + "timestamp": 1430641536, + "sigs": [ + "b6b837c14a65c31150c24f93ac60a9b49baeb963cf49a8d97e817883ca46a3763168988b69542c5a52b7501674271ded3888bccda558aad004902ab7b7010f5501" + ], + "inputs": [ + "5baf8c8ab1a01d80a6f496144815cf6bda5289b34055010e21324ea3950d3299" + ], + "outputs": [ + { + "uxid": "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "721200.000000", + "hours": 143635 + }, + { + "uxid": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 33, + "block_seq": 148, + "unknown": false + }, + "time": 1430642006, + "txn": { + "length": 220, + "type": 0, + "txid": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "inner_hash": "b06c37ee520387277d5c174e0fefb11dbbbee9c7ffe53715b7b5bab8f4693dfe", + "timestamp": 1430642006, + "sigs": [ + "150ffd203e65dac9dbfcaffb384a9233a274e0ced5a0c2fc9a3127e7a85df894124a5c1f0501c60640dce7d7c09cd1783ed61461f285fa89e6227ba1b427e81d00" + ], + "inputs": [ + "dd07d759d92e3d628a35c467dcd919dcae825a9fa79a14855714270dae08c0ce" + ], + "outputs": [ + { + "uxid": "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "720200.000000", + "hours": 17954 + }, + { + "uxid": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 32, + "block_seq": 149, + "unknown": false + }, + "time": 1430642106, + "txn": { + "length": 220, + "type": 0, + "txid": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "inner_hash": "a6d1d92496583cefdf9a9d4e278cdeac9d8e7c31eec3061f0a91bc0116ced8e4", + "timestamp": 1430642106, + "sigs": [ + "d98168e1f19fbabcf0ec9fdf21d36486a2d70b13624bd2ec765bc773a08c7f5c09c7df2664e3205c7555bd3c5cb64ca78f5f0a81613ef4a7d740348e0132caf901" + ], + "inputs": [ + "c739b518f3f700e810f81523d81b15f968fbf202f389ceaa9d9f303319a00275" + ], + "outputs": [ + { + "uxid": "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719200.000000", + "hours": 2244 + }, + { + "uxid": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "dst": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 31, + "block_seq": 150, + "unknown": false + }, + "time": 1430642306, + "txn": { + "length": 220, + "type": 0, + "txid": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "inner_hash": "9b4783f4cd11a81e945a2d09b699f76254caa3bbf22ce8533f3b9f179c207702", + "timestamp": 1430642306, + "sigs": [ + "8bd5632a52c39ef9e9ce90ebabd119c8f93e32a5a5b6e8fe80c58163b4adcc040725f18321894b59c3546c8ce9fb182e1a4dd6a3b4405229635e3ac3d80213a700" + ], + "inputs": [ + "95694746f813d018be7988aec666b52924a7815adabe9cbdac3f6ab0f51bd1ab" + ], + "outputs": [ + { + "uxid": "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "719100.000000", + "hours": 280 + }, + { + "uxid": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "dst": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 30, + "block_seq": 151, + "unknown": false + }, + "time": 1430642426, + "txn": { + "length": 220, + "type": 0, + "txid": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "inner_hash": "dbbf7608b67e82363ced90b364a9b8c91029b336ef2b68182d986e399eacb41a", + "timestamp": 1430642426, + "sigs": [ + "1972310d45a5baf10a8d929a132c725c51cdd19daae3baa640570aeadbb08ea700fbe46e6649289bec61065b05250b84872002f93634e6be81bae042cf80854b01" + ], + "inputs": [ + "be958e5c47415291a781648335db24e448e1f4f09aa5e9c3f055fbc906b574d7" + ], + "outputs": [ + { + "uxid": "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "718100.000000", + "hours": 35 + }, + { + "uxid": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "dst": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 29, + "block_seq": 152, + "unknown": false + }, + "time": 1430642546, + "txn": { + "length": 220, + "type": 0, + "txid": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "inner_hash": "821dfa6422bb093a528a2ec2bedd0566599cef3e2f4f91441f3073888e092832", + "timestamp": 1430642546, + "sigs": [ + "1bb9e5e58a4a7dfc9a29bb22eabb2ee4dc6e40dd71b35962adf95d1c1208309727f070257b4591e959a4965cb8d22710233dd1f65c3b58ec47bb71e3d7ebd3e700" + ], + "inputs": [ + "68165429853e18e4414ec6c15630262ebcaa802ff1d83b6cbe116db51cb32066" + ], + "outputs": [ + { + "uxid": "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "717100.000000", + "hours": 4 + }, + { + "uxid": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "dst": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 28, + "block_seq": 153, + "unknown": false + }, + "time": 1430642816, + "txn": { + "length": 220, + "type": 0, + "txid": "b0d7ff47658b3e32d8457eb62f6df0c7caaf7feadcbf8cc0c713976026f0404c", + "inner_hash": "5154559a3393277ed8db279bf27a9572c9aeebe81f321d9fb07a5e4313005a90", + "timestamp": 1430642816, + "sigs": [ + "a3edf9a3203fc696aefde6180d6c28fbaf3f4ee662ea90d82a93c3a8485593465f956713abfea8322b952d61969b29267f3826775638da77a1bf8567a40564e500" + ], + "inputs": [ + "46aeb9ea01bb04e28c55ef11f8e75434dbeee546f7e06bdef332c604590c48a1" + ], + "outputs": [ + { + "uxid": "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "716100.000000", + "hours": 0 + }, + { + "uxid": "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 27, + "block_seq": 154, + "unknown": false + }, + "time": 1430643706, + "txn": { + "length": 220, + "type": 0, + "txid": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "inner_hash": "957140523c9acc14a4f6b6a2fd05e70c58d2ed51f43b4e88b1406b398f4e7b2e", + "timestamp": 1430643706, + "sigs": [ + "ee25ac881aa867780086df4716864a9ec524deeecc140faa60b9f9b87805816c22659836b5169f8eab0977a2337638b6ed7cd7c4a5d4ee3664e7ad28e91dd5b901" + ], + "inputs": [ + "598503902d2e6cb62d6f6478f09d8da05af6fd2da92b50825da3b7f74b2df34c" + ], + "outputs": [ + { + "uxid": "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "715100.000000", + "hours": 0 + }, + { + "uxid": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "dst": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 26, + "block_seq": 155, + "unknown": false + }, + "time": 1430643906, + "txn": { + "length": 220, + "type": 0, + "txid": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "inner_hash": "ecd6b0cab28125e3ec1fe23a046c259a7d608802da7d6397dbd8b410de03b94d", + "timestamp": 1430643906, + "sigs": [ + "95e5d5d0856bf5387de8fbdae05f5953510fd85ec346e65fa5fb68984bdb1ab83aa7807e57f00354d934f84a0034ecf8aa74fe3b8e9e480021873f62827770ab01" + ], + "inputs": [ + "4b917e7bd3409c43f9f670f2846ce74f9288708df5aa1d9ae142f2411ce426da" + ], + "outputs": [ + { + "uxid": "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "714800.000000", + "hours": 0 + }, + { + "uxid": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "dst": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 25, + "block_seq": 156, + "unknown": false + }, + "time": 1430644036, + "txn": { + "length": 220, + "type": 0, + "txid": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "inner_hash": "bf3a81668fb27c0f55d9ec33490cb4c91ec7636ec1f85761fadbfebc020a618a", + "timestamp": 1430644036, + "sigs": [ + "970a22ba9a849caf00fc787a182dd67a3be794db9d66c691e9d904a78f90397542dee63e801c8b7f4077060fda76f0ac56a67b30865cc4634679f118abe04fc101" + ], + "inputs": [ + "d50a372f8f8cd1e0b10d847613b68ee760f195f5f212d6c59e86312c84dd07ac" + ], + "outputs": [ + { + "uxid": "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "713800.000000", + "hours": 0 + }, + { + "uxid": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "dst": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 24, + "block_seq": 157, + "unknown": false + }, + "time": 1430673946, + "txn": { + "length": 220, + "type": 0, + "txid": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "inner_hash": "5a975ee4a0f95c51a0a847b1d082bc4859a4b7904acbaece151c58e01f26a870", + "timestamp": 1430673946, + "sigs": [ + "06c22eb6cb03468010ffbd2b54faa5835ea44cf552779b0adb09817db7e5494d49031d2e4b8994b670857b193766a1f430857955edd627f290f71f970407139b01" + ], + "inputs": [ + "896865f9b610f9fb69a741596b3ecb9fff3790d40476a9f7852831bdf477aaee" + ], + "outputs": [ + { + "uxid": "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "695800.000000", + "hours": 0 + }, + { + "uxid": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "dst": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 23, + "block_seq": 158, + "unknown": false + }, + "time": 1430674696, + "txn": { + "length": 220, + "type": 0, + "txid": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "inner_hash": "ef7915c2cc32cfd043bf60533a563a89ee68a7b2f88e9e1e55e6a54494bde805", + "timestamp": 1430674696, + "sigs": [ + "6d2993d471d4b27d4b0c2beef286dab7e38013853926fef032a8a10d9161fbff59b4eba58d7578182f9f1e79ee763ab409aec46748351b0a7d1a020a3fe3824100" + ], + "inputs": [ + "272d5bbd86a87796a20e3e4debc46a2076718800343bee4f72fc0217a98a10a3" + ], + "outputs": [ + { + "uxid": "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "670800.000000", + "hours": 0 + }, + { + "uxid": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "dst": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 22, + "block_seq": 159, + "unknown": false + }, + "time": 1430715196, + "txn": { + "length": 220, + "type": 0, + "txid": "d720ca0efb19b964f481724e5d3f932841e9e75a69b998baf4b575cf3298cb87", + "inner_hash": "b35da2487dfd396bc01b5296fab691557760886b23ba5bd18e52808549dbfef2", + "timestamp": 1430715196, + "sigs": [ + "9cb0a128d17a9c42f3e4e44f4da9106ef11407da8d9a434745add4c5f7a8e379325976d8c2222c3328acdc2c6ca597fab4fae292c5529e07c55919ce0e0320ca01" + ], + "inputs": [ + "60906201d3e7c67ddb976972460b2b8ed093e1f6720a784cbaea376ca13e6cef" + ], + "outputs": [ + { + "uxid": "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "664464.000000", + "hours": 0 + }, + { + "uxid": "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "6336.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 21, + "block_seq": 160, + "unknown": false + }, + "time": 1430784172, + "txn": { + "length": 220, + "type": 0, + "txid": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "inner_hash": "49571d7e7c6b3e473b938f1cf4748c67f9301ca710f26ee56d0d8e231cb4515f", + "timestamp": 1430784172, + "sigs": [ + "8d4556a22c5fb84792cc88bfb47f795e6ba9fc211933776acd89b6da9aff71ea7803bf5b0e1d9afef2f3f77bbc4a7633c459ab9cb11a06723c4cad570717edfd00" + ], + "inputs": [ + "4912e9dbbb5a4cc7472c27b0212ab443e7b5499207b10666a66257005e182714" + ], + "outputs": [ + { + "uxid": "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "663464.000000", + "hours": 0 + }, + { + "uxid": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 20, + "block_seq": 161, + "unknown": false + }, + "time": 1430784312, + "txn": { + "length": 220, + "type": 0, + "txid": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "inner_hash": "7a000aaa5751b65d3bccd4d307b7b8602aae539971de3af3baa3e126d52a54f2", + "timestamp": 1430784312, + "sigs": [ + "693d3153218a69e2ef1e676d6c124dd7fab7ee312d41fd9dbe005a0e681a8b052708a9559fc08e8173e1ef83e45f838742e4a1af765ea7f0fddb38cee2cced8000" + ], + "inputs": [ + "659bac1636b64087ad5d3cb0ae78c52f28ad920016ec67e08415a537e0343072" + ], + "outputs": [ + { + "uxid": "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662464.000000", + "hours": 0 + }, + { + "uxid": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "dst": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 19, + "block_seq": 162, + "unknown": false + }, + "time": 1430784372, + "txn": { + "length": 220, + "type": 0, + "txid": "30e66ff45cfb145eb465e2ebdef0bb10005138bc1727c83888785b04d548e85b", + "inner_hash": "c87fb6e81fc1d99b16958d4626aa0e5ec4033443230bbc8b35e2882c078bf868", + "timestamp": 1430784372, + "sigs": [ + "b4feadec09b450b99795044931a94f7b8549bf876db7c62132df60056dd0c88e3821d1656407b1572fbb04eb71f6de57db43c997501989f44042d04fc3afdf4201" + ], + "inputs": [ + "97f64c3c636e5fc997e277cd48644055ef51045ed9c473c05dd6e699872a6c3d" + ], + "outputs": [ + { + "uxid": "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "662314.000000", + "hours": 0 + }, + { + "uxid": "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "150.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 18, + "block_seq": 163, + "unknown": false + }, + "time": 1430784932, + "txn": { + "length": 220, + "type": 0, + "txid": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "inner_hash": "ed6a317c8ea3624337463c1cca78bdcf87bf80dace1bccad050d27a49d3ea1d2", + "timestamp": 1430784932, + "sigs": [ + "c0548625b3bc88308155f598c3304a124632c0faef8005b8f9306b229b632b253c5e163a02409ba40b01560f77a6acde2ccc48cb0efedd4feb68ecbd925917fa00" + ], + "inputs": [ + "122b7a9a61ee04e071002d74ffb26b12ed7952ff9a138b5437f990f4678cc2e5" + ], + "outputs": [ + { + "uxid": "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "661314.000000", + "hours": 0 + }, + { + "uxid": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "dst": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 17, + "block_seq": 164, + "unknown": false + }, + "time": 1430790052, + "txn": { + "length": 220, + "type": 0, + "txid": "743bf1eede313145824db1c4f8d683b74ab5e0bc825082d986308b73fd52f1d7", + "inner_hash": "a0427c37a8ca9f8205630cc8d4c6d95200413d3397a0de9bf015763107b8fc80", + "timestamp": 1430790052, + "sigs": [ + "dc400e921f7f94da5f353846f1340e039b4527fff121a56579390fb4fa4154634e3b3aad44ddf0aaebea5abc1dc5ba2a00540fd2888ed5c4ab7b20c51255086a01" + ], + "inputs": [ + "c07593d4329f82da243e4bbd7430e4b10e7b35f9ce0a3718d0e6d25d20b4939b" + ], + "outputs": [ + { + "uxid": "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "660314.000000", + "hours": 0 + }, + { + "uxid": "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 16, + "block_seq": 165, + "unknown": false + }, + "time": 1430790152, + "txn": { + "length": 220, + "type": 0, + "txid": "3991a257eee265481e713917a3a9c15756f61175bcfc7acfdbe84158e43fd5e6", + "inner_hash": "dea502923be2dd8b4c48eb7ed2b146793ef840e9749d129bf7f6bda0fdcc43de", + "timestamp": 1430790152, + "sigs": [ + "dbb23f6d22438c10b98b437fe2ee4d7c5513aba7b0b6141648ac22f07e3768fc5d8d80f9dbcaa95edf925668b6018793a01ca70cf7b48d7c7deac106557ebf7f00" + ], + "inputs": [ + "4d52106e41dba0099549fd81fb8feb6915225b0125c53faa0f7c578ea78f213a" + ], + "outputs": [ + { + "uxid": "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659314.000000", + "hours": 0 + }, + { + "uxid": "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 0 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 15, + "block_seq": 166, + "unknown": false + }, + "time": 1430791622, + "txn": { + "length": 317, + "type": 0, + "txid": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "inner_hash": "140c70de73812b1da58d3df6c62696a0ced32ac1ea0818c3c53da4968407eae4", + "timestamp": 1430791622, + "sigs": [ + "c9198240191df5c8b107cb7b6fcb5f4a572d8ae2ac85dd0def832df2f9cd7d806594c1ad2bf2279507de1b9f1e7cb067a4c5562dedf3e40c29fb23387e28277c00", + "cd4e83142b6592dae1d61f92a82b0e17ae43a34207c69e1970cc5e8e8badc06f4067f36da90a142e963d5e35228c0f405482e38064c69eb5d882b6d619109baf00" + ], + "inputs": [ + "37cc43693a024f9122f5e1fcabeab5d53a4d58590df30a934fc7bc545936e049", + "903a1bca9b81ed76179cbcffe6e3c8eff269c94826148286f7be0b6038ee4ccb" + ], + "outputs": [ + { + "uxid": "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "29100.000000", + "hours": 494004 + }, + { + "uxid": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "dst": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 14, + "block_seq": 167, + "unknown": false + }, + "time": 1430791902, + "txn": { + "length": 220, + "type": 0, + "txid": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "inner_hash": "61c38575be160010335d96cf7c6ef0608cdb7b85079f2518532d00b6f42f13d0", + "timestamp": 1430791902, + "sigs": [ + "cb5c75671164755516cbf4d94e2288d56985b4d3113538bc818d1aa1c944a76b1beae28964c8e596ab0cd252cda6cf2a5468cbd0dbeff21e35609b5a6577eb0a01" + ], + "inputs": [ + "fef9dd3b633274743099e607d9229717a001d6de6a4031479cc30d31d65e8396" + ], + "outputs": [ + { + "uxid": "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "659214.000000", + "hours": 33652 + }, + { + "uxid": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "dst": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 13, + "block_seq": 168, + "unknown": false + }, + "time": 1430792072, + "txn": { + "length": 220, + "type": 0, + "txid": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "inner_hash": "c356824e25deeecd3f531eb56a26d5875b7b81743e9c8f3d6beff5f634bf5e3f", + "timestamp": 1430792072, + "sigs": [ + "ac3b968f82649fac3822db1af5c0be17fc20cf86e091362b1584a2b66c033b10541f70fb6f55d8e1b3c57161ce37412a52d2009dd8abc9ef7ab038b19d8d644401" + ], + "inputs": [ + "21f0fb666dca05d7a43ab26a378f7f7eaedfacde22fa047ca72857e9509cc748" + ], + "outputs": [ + { + "uxid": "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "658214.000000", + "hours": 4206 + }, + { + "uxid": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 12, + "block_seq": 169, + "unknown": false + }, + "time": 1430836392, + "txn": { + "length": 220, + "type": 0, + "txid": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "inner_hash": "85c5d3963f2dce44e99500967e8b8b1943839537fb198186131459a3022d161a", + "timestamp": 1430836392, + "sigs": [ + "473114dcb42e2091f3d0396ecd16ee2685e0a6074c7de218cbd7e7c4335d89146455bc6c259c77f40d4af769e241aba1e3a102c5755946b1783c817ffafa67d101" + ], + "inputs": [ + "bc513a68461d5c401e65a500baf7dfa163735ef63b817bb7b73c4139d5c29d18" + ], + "outputs": [ + { + "uxid": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70 + }, + { + "uxid": "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3", + "dst": "jtuSERvfzN3kUYekg8LemCQ5kF5g97N8ZL", + "coins": "10.000000", + "hours": 70 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 11, + "block_seq": 170, + "unknown": false + }, + "time": 1430836422, + "txn": { + "length": 183, + "type": 0, + "txid": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "inner_hash": "c13b7e1722f3616f61948ed42382d4ed41164e7e2110d2d60bf86725f32531de", + "timestamp": 1430836422, + "sigs": [ + "cb7da0e16b83f1717614c7f160580ac0048a4276682ac4046c3324ba6f4e24901d162f7ec81a8e5cdf3676df6ace9a73c77e4d3ab7f03a4f0272c75f3715665001" + ], + "inputs": [ + "bffea1990d71311b695b2d343b9f09a216b7a8257c1cdcb01b2ab9459e1490e3" + ], + "outputs": [ + { + "uxid": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "dst": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 10, + "block_seq": 171, + "unknown": false + }, + "time": 1430870562, + "txn": { + "length": 220, + "type": 0, + "txid": "fb495093f2f4e5c6555c50150ea60c0a6f430e53aa971ebb3e2b5412866a1f06", + "inner_hash": "05596340e51ad628080101c8e92a60f27e0f5ab509e892f9b65a0988b1575ddb", + "timestamp": 1430870562, + "sigs": [ + "068a56e916267a1756d9348bb965f3ed2dcba956fe4c626cd4836921dd836f7c0fa923d6451d5c87aa2eab528ff19ec332434bd12e197eeafbf0896e84940c4401" + ], + "inputs": [ + "6b3a0cab1d9ad6fd011a3bac5e6ff4e3f7903bce911dc7fe83926eae557c34c3" + ], + "outputs": [ + { + "uxid": "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "647750.000000", + "hours": 1014129 + }, + { + "uxid": "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "10464.000000", + "hours": 1014129 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 9, + "block_seq": 172, + "unknown": false + }, + "time": 1430870592, + "txn": { + "length": 220, + "type": 0, + "txid": "7abef7e4080bf2cbe9f147d7c9cbe4c950b38f8477d304466c938b937cd379ba", + "inner_hash": "f28366f7590220cd42faaf9ea041c8ca4460707e0dbfe1d3ac67da8d9dda268c", + "timestamp": 1430870592, + "sigs": [ + "e9ff8a0ce6c5e8b09936e031ef8cc6a0f3f3ed0a5360dcf2f649db3a2da958441c20916b27d1ad2ea8415679755b36967074e20feab7271528cb6b3266268ec201" + ], + "inputs": [ + "074645413ab2aae818e657f6f36420447a872e7cdd2ff64324b486be4d4d1edd" + ], + "outputs": [ + { + "uxid": "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "28100.000000", + "hours": 141512 + }, + { + "uxid": "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "1000.000000", + "hours": 141512 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 8, + "block_seq": 173, + "unknown": false + }, + "time": 1430871512, + "txn": { + "length": 220, + "type": 0, + "txid": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "inner_hash": "5bd2503c4ff78e7c9d182bfe5e62e54f1bfb944bb526d97b272021d8ccfa9359", + "timestamp": 1430871512, + "sigs": [ + "dbd1e8763cb9681aeb96edc0c8483decee30b670778bec88da249f9d4f2201c330d2a16349608ba51eb8a387805dce9618810c4e6fd7af548cccee7d2c9c5dd201" + ], + "inputs": [ + "372703f8109295f0f58fbee58795979e10dd887869f4fc1da4881ce8a3c0aeb4" + ], + "outputs": [ + { + "uxid": "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "635750.000000", + "hours": 127440 + }, + { + "uxid": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 7, + "block_seq": 174, + "unknown": false + }, + "time": 1430871622, + "txn": { + "length": 220, + "type": 0, + "txid": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "inner_hash": "af11c711190f9b52114dd31dcc4dbcdff3f169c6ce2559ff5baf14032e057145", + "timestamp": 1430871622, + "sigs": [ + "fd019f0cc492d5b6ba1bab0e3c77659b0e4773ea9b7dbe9808ea1392bfcd41e20aec3438076cb6ae4104bb6730b47ad1f1cfe878155f984ee380da10991b2a5601" + ], + "inputs": [ + "b1b832a911d45aeaab73676caad794fe2ab99d423f80c4ff58cfb269656b03dd" + ], + "outputs": [ + { + "uxid": "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "23100.000000", + "hours": 18586 + }, + { + "uxid": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "dst": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 6, + "block_seq": 175, + "unknown": false + }, + "time": 1430908702, + "txn": { + "length": 220, + "type": 0, + "txid": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "inner_hash": "a55922b0495d39c8e9db70ac9aca99266d5a7f3644106b4b5468345d955acf41", + "timestamp": 1430908702, + "sigs": [ + "cecae09b7925e9f6db1ccf5ef9a93687a43bbeaefe2888abcc07411c71f850c80c05ed573abd67bf9f0e8a096a1aba8187547e3d062e5ed147ac51961cc3559701" + ], + "inputs": [ + "14027340f6e1d98bba3f7f5f3b50e3588f8a19e4d021db944e7a28b2643640e1" + ], + "outputs": [ + { + "uxid": "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "625750.000000", + "hours": 18358 + }, + { + "uxid": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "dst": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 5, + "block_seq": 176, + "unknown": false + }, + "time": 1431162639, + "txn": { + "length": 1481, + "type": 0, + "txid": "a17cf54c20ac7ec6e1362acf24c5e5589ed8b49bdba791a87430de160a473913", + "inner_hash": "71127fa12d9ca390715586fe313b4e130b24614e0eaec276dc2dd25b7228c39f", + "timestamp": 1431162639, + "sigs": [ + "95855ae7d279d4797bafe542fd1803eb6a89533f29ae0d89d3f51256feeacc343dbd3da0d8d104e436c04643c72b5dab7a74634befc942ef9d96ded3e235ab4b01", + "55222337fce2733e7a3f92bf808da32759f33327c616828bdb0a350e5d3567b34fdef1a55340d7f857c4daed9735ad64394697ad941fc883f9365693991299a500", + "950281f4acb6cb8176929740aa90fa8729ac5687ef6500bc087429c43f5414e319c26142fca51c0ed9e5d434a6c83d2e3c837d7c9213398ae2104429d03f35dc01", + "c41f7425ecb51359a1da6ccf090a565beed72c891c49a8c81939a46f914c55de5766e99f1519302bfeef2224f856c859391d1f531004ee088083259fca82b17400", + "ed7085f8ceb26060851a71f665387d7c44774c6b9ddfc8d3a06e1fe50168d48510f63f5b6a0998c2a30d24bf37f1c6030035ef8df6efe6dfdcae38beeaf3a5a701", + "a88fefcc8f2809a288a275aac579f340c5138f8bfedf02964d4e3ed0492ee54e696de7e6f7f0b3f315461fb5df4f8e5e5fc7a5339ca6899c6ca7b122c54c90db00", + "ad9b245807ab8c5c5a713ab7e3bfbbba8af032bc4915c1824d95e95827d95be473eb1f6952ee489ddad59049364220bab124182251142b849235ed552404ba3d01", + "7a403c671ec5a6a6622ff63e4d482d51fda747cbe85cf8ef642aa840154be435409df707aa81a3c4e553e0c2c250a452e8416dc38697c35f830de27924a052fc01", + "06b5966aa7c7dfd425e773aafd46fdf29b41734b73f84ef1cd8941e617e0d6245e99f6d8be8b9609686b0faee4923b8bc149078ebb18c1b2e8f6318c846675e801", + "c5634bef581b26d600ed6f4cea47f402633e74ab8f5497b2c2ca69a01e3dfeda0a38308a4a96cfe58857e4c0c2311ecf4e3f4eef69aa771a1db89c360892492200", + "4807a114ffe9e44797843f76c74e81d72324885a67d560c4e1d6e4cadd271b637176a932dc045844b52a4c92f6892ebb0265838366827fd0e0b6b7e20e4e1ff501", + "bc1ca4e3d0afd920bad8c4ef8a6b847c71f75ae8ca913ddb5d976dca42af12ea3ec3a2e59ec8f57fe4fb41af3f439387272ea847240ee89468c4d808303cf9be00", + "366f0f68a36bccd22e829eb05f960a8015466bb5eeb8e553dd37b52ab624d1756f68501db2a8d14fda04d1adf3239a9785ec142c14c5bb34cb8d47629c191dc901", + "146eed504f7acbbece951bfea4eb426e80852e3dc6ae9c8a68480fdf4e07ddd73a5709e2f9df0154380d837a5ff66582c07a0fc27d0df4e7d6d28bbcb90e3c8d00" + ], + "inputs": [ + "04c0cd4cbee1e5414791d9e0b9ae4f889bc52d253b5f70b09fbc32c88fb415ae", + "f3034ffe54e869315f8e11801d3e755352fb75b878b24313302273c1b7ea62cb", + "3538af0016ec0f4d0e943c5d49daf280b416701fde4040fa72710c0ca1b5b559", + "0560bae3917bca7581af9b6c5a58e395c701ce9ed0241dac2de8a3e93c0b839b", + "3fe7d61ffa993e00200ce6be7ba347c603032ac3f8c4ace07767e630fe94d76c", + "2a09e97f7725a35af1357842206875a023252da4ebfce129eaf4cb87119cfd41", + "617b584bb9e6b1d80daac915fb3079b22a326777d1515a40e7b7eddf427f4099", + "18293d947aadf89d9e57d18fa01408867a9abe267504edbdabf8c2a57d9a6323", + "045dc2e76321e37884588093083ce1b21be12f20ba1fa36f2a755b894229e3cf", + "b1e5c694c30326cda3df2e634723999befbcbb141415e9a36bdbf18d7bea9870", + "db7a63750db787959a9e0d2d6be9a1ba8bb3d6015bae2353a27ae9eb55b39d22", + "5954742a6ca4e3e872d12d4a93436451ad52e6d25e5ac28371e308b2d7ce75a3", + "a35044035cce79cb988c757dcaf5d9a065957c0fbc1a3559d08ed46831504fc2", + "c31c199a54ecbea5e57bf7f5e73d231a09e11713dd0ee70e340e4b0a9c9f9fdc" + ], + "outputs": [ + { + "uxid": "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "24950.000000", + "hours": 451992 + }, + { + "uxid": "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914", + "dst": "v4qF7Ceq276tZpTS3HKsZbDguMAcAGAG1q", + "coins": "5.000000", + "hours": 451992 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 4, + "block_seq": 177, + "unknown": false + }, + "time": 1431162689, + "txn": { + "length": 220, + "type": 0, + "txid": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "inner_hash": "1a07c8a17c429aec5c0725dc6e4891f4e304a483211f99b847a6820e410b56ef", + "timestamp": 1431162689, + "sigs": [ + "e7d92fbcc6716645c2c28a66ac289453b2967c620e105c7699cee251aa6916227057789d10889689a3f3c743dadfea09e1cf747cc7b7ccb5381fe1af1069e06201" + ], + "inputs": [ + "d6735d3ad70dbf553048faf1c529d047ab12282d04e320bd67c915779fc4e3fd" + ], + "outputs": [ + { + "uxid": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499 + }, + { + "uxid": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "dst": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 3, + "block_seq": 178, + "unknown": false + }, + "time": 1431162729, + "txn": { + "length": 183, + "type": 0, + "txid": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "inner_hash": "41bc4ea9ec8214b461a5377d0ae0da38831bc972b8dd54becaf195b5943dd55e", + "timestamp": 1431162729, + "sigs": [ + "4a604f9845e202871ac8741962280bb5db6f1295353042922a6f46671f27cc1d6cd4085aec390205aa5ba08f2c841295b4c86d2fab81d6e29fc958dfe9712e2301" + ], + "inputs": [ + "a5f3c513b5a01dc5e943a5cae91f54b54cde55e984a9480d68d690f40dfb7914" + ], + "outputs": [ + { + "uxid": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "dst": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 2, + "block_seq": 179, + "unknown": false + }, + "time": 1431339429, + "txn": { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "timestamp": 1431339429, + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 1, + "block_seq": 180, + "unknown": false + }, + "time": 1431574528, + "txn": { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "timestamp": 1431574528, + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + } +] diff --git a/src/gui/static/src/app/components/pages/explorer/explorer.component.css b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/genesis-raw-tx.golden similarity index 100% rename from src/gui/static/src/app/components/pages/explorer/explorer.component.css rename to vendor/github.com/skycoin/skycoin/src/api/integration/testdata/genesis-raw-tx.golden diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/genesis-transaction.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/genesis-transaction.golden new file mode 100755 index 0000000..38d8c07 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/genesis-transaction.golden @@ -0,0 +1,17 @@ +{ + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-default-connections.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-default-connections.golden new file mode 100755 index 0000000..2e4248e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-default-connections.golden @@ -0,0 +1,10 @@ +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "120.77.69.188:6000", + "121.41.103.148:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-exchangeable-connections.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-exchangeable-connections.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-exchangeable-connections.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-trusted-connections.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-trusted-connections.golden new file mode 100755 index 0000000..2e4248e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/network-trusted-connections.golden @@ -0,0 +1,10 @@ +[ + "104.237.142.206:6000", + "118.178.135.93:6000", + "120.77.69.188:6000", + "121.41.103.148:6000", + "139.162.7.132:6000", + "172.104.85.6:6000", + "176.58.126.224:6000", + "47.88.33.156:6000" +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-addrs.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-addrs.golden new file mode 100755 index 0000000..08bbd0e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-addrs.golden @@ -0,0 +1,36 @@ +{ + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-hashes.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-hashes.golden new file mode 100755 index 0000000..d853018 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-hashes.golden @@ -0,0 +1,46 @@ +{ + "head_outputs": [ + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-noargs.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-noargs.golden new file mode 100755 index 0000000..94ebc39 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/outputs-noargs.golden @@ -0,0 +1,2186 @@ +{ + "head_outputs": [ + { + "hash": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "time": 1431574528, + "block_seq": 180, + "src_tx": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543, + "calculated_hours": 377543 + }, + { + "hash": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648, + "calculated_hours": 6177966 + }, + { + "hash": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648, + "calculated_hours": 45730107 + }, + { + "hash": "ba1adbf3006a239fb7ef6efb1f9390a25951a5185dc312dd81bf88025f838456", + "time": 1431162729, + "block_seq": 178, + "src_tx": "ecd101a6af263973ab75f87a3116231e6fe84a2281d0001c9aa2d7195545e78e", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "5.000000", + "hours": 56499, + "calculated_hours": 57070 + }, + { + "hash": "ec439e7c7d8517824885ae1520fa5b19f991d7ade3a12209c0e87f6ad1d30229", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4950.000000", + "hours": 56499, + "calculated_hours": 622777 + }, + { + "hash": "f5e7796297b7201b1ea87736fadddc7b451f9ed7d4529cfe9f03082e80917628", + "time": 1431162689, + "block_seq": 177, + "src_tx": "e4850021fb706f2b7a94fec9ade3c166823dcd980dc3954437471d98fb9d2280", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "20000.000000", + "hours": 56499, + "calculated_hours": 2344493 + }, + { + "hash": "d91e07318227651129b715d2db448ae245b442acd08c8b4525a934f0e87efce9", + "time": 1430908702, + "block_seq": 175, + "src_tx": "9364ed6cfcc289df74dc6bac1993f7ab3441b898cb3f06918198d2476c83dbac", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "10000.000000", + "hours": 18358, + "calculated_hours": 1867874 + }, + { + "hash": "2d3f7890d11efedd4cee3a7ab4a5cbc56d2c8df4f02124bdad9ec839400053ba", + "time": 1430871622, + "block_seq": 174, + "src_tx": "ad44a8027a825e82a20cdd910d9bd41d74025601b7668c80655e9b45afb8bb93", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "5000.000000", + "hours": 18586, + "calculated_hours": 994844 + }, + { + "hash": "793f3f0e41c9d1de391d864792b79ed8c24dde5ff84a73c161d660a73ed70c90", + "time": 1430871512, + "block_seq": 173, + "src_tx": "a7665cec98224150968ec1ef9ef2d6b3175c9de8f9f8c7bc786b30cc74997c57", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "12000.000000", + "hours": 127440, + "calculated_hours": 2470826 + }, + { + "hash": "be081639ea8da63d8542707e9ea9625f6afc97da132f43ed061645c359bb1e65", + "time": 1430836422, + "block_seq": 170, + "src_tx": "95d847102c01d071982e67b8e7dfae50715b0fc0179d33f4b050974e634905e1", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "10.000000", + "hours": 8, + "calculated_hours": 2058 + }, + { + "hash": "639e69c4a223b5082b9274caf3e56ecff2ab55cd90cac94fdb4c383a1013ba1f", + "time": 1430836392, + "block_seq": 169, + "src_tx": "acfb61f7ca39d5dfe33e8ed66f73ab181da0a3206d457bf055dcc4b9731a3ec8", + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "990.000000", + "hours": 70, + "calculated_hours": 203057 + }, + { + "hash": "a02148f770788851a35fb90567510044e37f8db930deab7a2b584af67c8efb2f", + "time": 1430792072, + "block_seq": 168, + "src_tx": "50fc81b0ba25669105a169a969459ccdb10278051b604a3f91467c2528c83652", + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "1000.000000", + "hours": 4206, + "calculated_hours": 221554 + }, + { + "hash": "0b5e5259c276ac949de97062492ea6dc93ae6215c8dd1615862907e3c3ae9cf0", + "time": 1430791902, + "block_seq": 167, + "src_tx": "b29222c08f10b8bc4ea18981519a3b0e02b9c9cec63ee28d9ffa2efcaf2a8e5a", + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "hours": 33652, + "calculated_hours": 55391 + }, + { + "hash": "b945bacb354173c33bc41503f50c29ad5d1d333ecab66b0c70d0ed9e6eec7f3a", + "time": 1430791622, + "block_seq": 166, + "src_tx": "41589644ea3a344fc616bec0058cf916b8efa5da7c3539241244827bd7e19811", + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "hours": 494004, + "calculated_hours": 602740 + }, + { + "hash": "250543215c71a1a9ab7740fff25c3bf9695fcde10bceba3717aef9d0f6dd40d8", + "time": 1430784932, + "block_seq": 163, + "src_tx": "ec79854fade530d84099d5619864a8e1e8ec9d27a086917a239500cada43c6e8", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219332 + }, + { + "hash": "0c19e689e0e34639c71b0136ce336121b042b6d4ac185ac1f9e94ec7535e781f", + "time": 1430784312, + "block_seq": 161, + "src_tx": "d5091ca65ff61998dfb4535a7927fb736abf2a81140a11322dcf8226de27cf92", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219504 + }, + { + "hash": "ea18f151bbdb611f73596b61ebb0546b9e91281ccb0bbe07a18e7fa69142bb5b", + "time": 1430784172, + "block_seq": 160, + "src_tx": "0e8e352b1f2cd419bca619918ce6d5ec1eac0ba7252d76eef5d9d8f8186f737a", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 219543 + }, + { + "hash": "c61f27a2247831679d8df293bf9351b16e8429778c875be2cb64224bcb842ed4", + "time": 1430674696, + "block_seq": 158, + "src_tx": "3d9f1aa1b6206275081cb9c26155f6261be1ef9c94b4eaadb1a7e8277a2099fa", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "25000.000000", + "hours": 0, + "calculated_hours": 6248833 + }, + { + "hash": "25130a18aca13a37e4f4c08733cdda6a8629759f27ecba775999486c9deffa5e", + "time": 1430673946, + "block_seq": 157, + "src_tx": "c3fd04cd27ea311b1a67d40cd3dbb2ea8ae2c6f6139620cb86be29f33ed99171", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "18000.000000", + "hours": 0, + "calculated_hours": 4502910 + }, + { + "hash": "a34cfb6f175323917dfda72d58ddcfb86363cc43d22a0c6c3141810f5cac5aa6", + "time": 1430644036, + "block_seq": 156, + "src_tx": "29a883ef9dc67bc683014187b9865c827b5e2f8afd7bf6f3787483318063789e", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258470 + }, + { + "hash": "25a72cc385c1cdabd0ffd7c141ae205d767f3d016c281f835b9f58f9325bd2a5", + "time": 1430643906, + "block_seq": 155, + "src_tx": "c9582c8134fa64fdf08cd93d42035adcced3f16aa8ee1a1393e3fcd7c07aa40c", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "300.000000", + "hours": 0, + "calculated_hours": 77551 + }, + { + "hash": "dbc58940c2457359501c9906589c3d0a0ab7695b983ad79f2bcc087a675671f6", + "time": 1430643706, + "block_seq": 154, + "src_tx": "be0957035ed2ac444f67273fc5c1c6a39ee373f6f83d1604d0023742a8cd7e42", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 258561 + }, + { + "hash": "c0548bf35c950a74c206d2c565e3bcac1f2abe170ebabdb7b74e439b642dd9fd", + "time": 1430642546, + "block_seq": 152, + "src_tx": "dc10e0565a14dfecda066577581f3e2d073de34ed3e911ed94413d38fc0a33d2", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 4, + "calculated_hours": 258887 + }, + { + "hash": "efcb1b5f54bceb2d0124d2f89c47d071c2943fb228c2eee62bfddf6e1418cfc8", + "time": 1430642426, + "block_seq": 151, + "src_tx": "18607765c3fbd45eafa15d2d62ab3cbc7ba7bd80c42931aae4db75aa02898671", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 35, + "calculated_hours": 258952 + }, + { + "hash": "0fa23085def7c1dbc95587d3f0f58cbc30b09e099ee1afa42d9120452777740a", + "time": 1430642306, + "block_seq": 150, + "src_tx": "3e228564e3c187e22bd489857fdb1db7036021e19f688aad56cfee57d5e13ac5", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "100.000000", + "hours": 280, + "calculated_hours": 26175 + }, + { + "hash": "eb57ec196fe95a09be19b62b6837d5d12f99568ad0e5e198f70f55083acd656e", + "time": 1430642106, + "block_seq": 149, + "src_tx": "b69536fbec9911da41e9d0c5ca73459f5e692ba155f8b72c0972792e9937a0fe", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 2244, + "calculated_hours": 261250 + }, + { + "hash": "5233e499bd3e38ec4d4fa4d750290f25271c91b4903630d461be51f3c2c02ebd", + "time": 1430642006, + "block_seq": 148, + "src_tx": "79681167a7681edecb998e4a6dccdd0b7be45f163c8f6db23436517936269fb8", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 17954, + "calculated_hours": 276987 + }, + { + "hash": "3ec30639c24acce65054bdb0d7ab0539199b64cabfcad83c2ed7f266fb8849a6", + "time": 1430641536, + "block_seq": 147, + "src_tx": "3fae944ef07d9bcba1bcbc8bde87da50a1232132074803f8442deb563ed2da51", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 143635, + "calculated_hours": 402799 + }, + { + "hash": "3dd82b00ef4d1e3b1c71be5f13c0c82b3e2b17af4a6b3eb4c966490f47866ccd", + "time": 1430641376, + "block_seq": 146, + "src_tx": "5701965d326520f86335da87c6d1781fd49f1e66520b94e1783711eba724f482", + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "1000.000000", + "hours": 1149084, + "calculated_hours": 1408292 + }, + { + "hash": "7afab03c823346ff8b00c29df6acc05841583d90dfd451ba09e66884a48e83f7", + "time": 1430550936, + "block_seq": 145, + "src_tx": "f25c1a8a4ae37e8e2b4a0ec6f2553cf11c57fa77de9556cd227857ca270a0275", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "2000.000000", + "hours": 99134, + "calculated_hours": 667796 + }, + { + "hash": "d8ee5dc5cabcf179365345167d39977ae38a71e55cf357881258be32a45732bc", + "time": 1430505176, + "block_seq": 144, + "src_tx": "3bb9fc516dc2c522e28f99e6833253863c550547ce0e0a2dd963a0118b7a44a7", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297042 + }, + { + "hash": "456bcb0a2e57a5c20f2757c8fc7669af1f969bb5a57f89965210daf7107993aa", + "time": 1430505086, + "block_seq": 143, + "src_tx": "57150aecde96bde972183b9b0d7d27dda2c0179fb71630e92c27856d211335cd", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "500.000000", + "hours": 0, + "calculated_hours": 148533 + }, + { + "hash": "908fe94bd28886547f1b7b4fc98d0990a08a216b70877341f566b6b4685de364", + "time": 1430504846, + "block_seq": 141, + "src_tx": "16f8b9369f76ef6a0c1ecf82e1c18d5bc8ae5ef8b01b6530096cb1ff70bbd3fd", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "2500.000000", + "hours": 0, + "calculated_hours": 742834 + }, + { + "hash": "cfdefd8d167947190a223882d20c8ac7880e550ad1a3494bb05bff4b1df4e3ff", + "time": 1430504746, + "block_seq": 140, + "src_tx": "de45a24c9c32f808a3d928f30ba8e1b6ef8117a7c0b7a5d616734d9b121d0c30", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297161 + }, + { + "hash": "278b0caa6dddf4ce74772471b15fb9a8c364362b0ae3eeb9379e980504d8d512", + "time": 1430504536, + "block_seq": 139, + "src_tx": "578075959959db70ae86f4f60d2ae3ff245727d086eef86ed80db5e1c7c9fbaf", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 0, + "calculated_hours": 297220 + }, + { + "hash": "bceafc261a2250f1bfb8154aea88370acfe6a41a4216bcb76c2016451cbcffd1", + "time": 1430504236, + "block_seq": 138, + "src_tx": "9880bebc51471e0b3c520920db836d674f652503314cd74069a59ccad0d0967a", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 6, + "calculated_hours": 356770 + }, + { + "hash": "b6b6188973b600af774ad8a7b6d454f77713a51463b9a9a70c901ec5280a9789", + "time": 1430504186, + "block_seq": 137, + "src_tx": "fc02772662176c282c2b6538732d3d6eb1399f006a0b52e64d07fc104038f638", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 48, + "calculated_hours": 297365 + }, + { + "hash": "e00c292e151fdafd24984b2dc08a4a328150006f95afaac9909dbffae1f07eaf", + "time": 1430330851, + "block_seq": 136, + "src_tx": "b9a795552bec1a722718b44a08ad152656242b1d23afb53d2247b3016d920b7e", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 387, + "calculated_hours": 345852 + }, + { + "hash": "d95d422fb8fe4ad9ce1052e566ec8a5ad7953ceb253366814b3d32e9a1da1f13", + "time": 1430330481, + "block_seq": 134, + "src_tx": "44d05abc2637d9cd2047984023eb5cfa0a146e58821117de30f9c81703189cde", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 24823, + "calculated_hours": 59379 + }, + { + "hash": "8b3d335360effd00cabcae13c2495f26f81743b82958629378b7bc78a7e460fe", + "time": 1430330421, + "block_seq": 133, + "src_tx": "d30cec3ad3a66562d2513a3656b366ea7da583e6ba45214ac12b9c2219b4c5ea", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "500.000000", + "hours": 198586, + "calculated_hours": 371378 + }, + { + "hash": "333156ed20ba6937d3720af3a81939362b9f4ad1e9591bc676945ff0d202131e", + "time": 1430330311, + "block_seq": 132, + "src_tx": "3dfdfea4614d05c2f5eddf5773ef0afc745f1afe585141659df8e03e82897606", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 1588688, + "calculated_hours": 1934303 + }, + { + "hash": "e7756fa7a5c067d595f7300828bc4c70152653700844130d88174ba37237e2a3", + "time": 1430330041, + "block_seq": 131, + "src_tx": "6538399868cf772fcfa96e68c51aa6aa66faa95d7c685432e4005880932be134", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1200.000000", + "hours": 12709509, + "calculated_hours": 13124338 + }, + { + "hash": "169e9a77557283e0d158fe6e35c439d729d73acfd00e2969147dacbdd599817e", + "time": 1429849180, + "block_seq": 129, + "src_tx": "66d415598af081f8a7bd7f292468e67f380d06bf5896eb8152d4d9e8bcdf289e", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 66854, + "calculated_hours": 546117 + }, + { + "hash": "6143275de37a2b5ec802eeeb8d38a3dfb2db6629128e44c4f9ffc0ce8ddad629", + "time": 1429849170, + "block_seq": 128, + "src_tx": "c2c9fe882df3b44fbb125b251a7604a7a4f4195dddff6e5396b7f130744e2b27", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1000.000000", + "hours": 6994818, + "calculated_hours": 7474084 + }, + { + "hash": "bca6e6b24cdabecd77186a61168dd3e2290b2fda1b7a79eb3856ca4cc9f589e2", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "990.000000", + "hours": 17310, + "calculated_hours": 538127 + }, + { + "hash": "e4a83076c2ce1bd83953c1c0443054d7f5b0843c551d35b3fc3c116e9a9134d7", + "time": 1429680646, + "block_seq": 126, + "src_tx": "a67ed00f815a2fd20d0efd18ac04663f0ee3d5621fbfdcdc6af250f19e3cfc53", + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "hours": 17310, + "calculated_hours": 22570 + }, + { + "hash": "a08089cd67896683d5dcb2d50256354e0d086b9854eb22bb6022cc459d447211", + "time": 1429578056, + "block_seq": 125, + "src_tx": "1ca0a2d44b6439b91eb839e0f99405abdcafe2c1a49c8b49b1739498129bd1a6", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "12500.000000", + "hours": 92, + "calculated_hours": 6932286 + }, + { + "hash": "a4fdfce34725eb63941ac576651fa406272565a344ffb21435d285111efbc4db", + "time": 1429522086, + "block_seq": 124, + "src_tx": "e9a6dd585b564b19c55d9f56188a45bfad32fa75703fa6336830035f6fa92e3d", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5000.000000", + "hours": 739, + "calculated_hours": 2851352 + }, + { + "hash": "8e764a87cee9f26b902f748c28a5a49de5c383e5f155129eec84474a3d0349cc", + "time": 1429451746, + "block_seq": 123, + "src_tx": "9003d3caba9587d46d000cc614bb52bed34adcc5ea404c560c986eb6dd756e6b", + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "hours": 5916, + "calculated_hours": 5902532 + }, + { + "hash": "1e0cf4e3ed49b52944f533a212e6412291e369ac3e7a8c4440424f475f2983b3", + "time": 1429382898, + "block_seq": 122, + "src_tx": "211f5fc97ba1797d78f84d4e4db78415b5ff4121f78369535fe3f8015571c6df", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "36000.000000", + "hours": 47330, + "calculated_hours": 21963630 + }, + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "cbe8b620c1468dbb1e69e6da63831bde5828db313879a36f783a1f16f2b86541", + "time": 1429364282, + "block_seq": 119, + "src_tx": "4d080ff1f8ac21d8c09a2dca99d28ae88e9441d7a4757dca68469ad64838cb55", + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "hours": 3846, + "calculated_hours": 11213 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "2010952c33c83599fa14bfa5982d59865f2a362c97270dacb4c180a485ee5096", + "time": 1429351912, + "block_seq": 117, + "src_tx": "345488861ad3f0d93024c367990e64ef0f7a95bd8b8589f554172f9439808263", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10000.000000", + "hours": 20965, + "calculated_hours": 6194898 + }, + { + "hash": "6c34016037cd17622846e71bc635914d4d8f256c147aa5a0b84a896e83229480", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "hours": 64785, + "calculated_hours": 16382449 + }, + { + "hash": "ab12f4eadaf956be371ff8f239956e33d1cd2fd4b497ca04c9501baf6f241618", + "time": 1429349392, + "block_seq": 116, + "src_tx": "491130fc9f69d101df220116356e82e2ff21dac1167e6da81c95dd4cc417b3d9", + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "100.000000", + "hours": 64785, + "calculated_hours": 126594 + }, + { + "hash": "de995d2361e810cfba1b9b1141413367a722f51c7555b1685f6e68129dfb2679", + "time": 1429348712, + "block_seq": 115, + "src_tx": "bb700553c3e1a32346912ab311fa38793d929f311daeee0b167fa81c1369717e", + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "100.000000", + "hours": 2712, + "calculated_hours": 64540 + }, + { + "hash": "5b0801ec545b132eeafa61bee8f645df7e1e358321ef830a4247fe541c211139", + "time": 1429348502, + "block_seq": 114, + "src_tx": "e8765b4e6fbca87144df59a6f66815b175e81999509504b117636edc34cbe2af", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "100.000000", + "hours": 21700, + "calculated_hours": 83534 + }, + { + "hash": "a7dc3318a975546b7662f0a867c60a4d7e9b4d1d89ab87be8c78b09ffe8852ff", + "time": 1429326351, + "block_seq": 110, + "src_tx": "552a4b194478325ee9f3e4a8648d94bc8eb26432be6fecc881bf71ff9ca15356", + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "hours": 17848, + "calculated_hours": 80297 + }, + { + "hash": "4ca22a0fa2acbd0c9e90c4ae83496d05e122deb1a17c670e9c785479d115e824", + "time": 1429302756, + "block_seq": 109, + "src_tx": "a4c15ae4743246709ec335d33c289576c8893e71f5c3dcee1db6e43eec9242ee", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3000.000000", + "hours": 7092, + "calculated_hours": 1900235 + }, + { + "hash": "9404837ee44bc6aaa8c1ad963c8fa7a050e497f89f941fdc7248930ed4e0d5a6", + "time": 1429280756, + "block_seq": 108, + "src_tx": "a8d6420d4f64fad1b698bd77cae5a92aa125f806fb184389edcc278e5cb460fa", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "100.000000", + "hours": 3457, + "calculated_hours": 67172 + }, + { + "hash": "ec4b791f2fa22a986d6035e34f5025c3da0398cb2acc59a54d495d4eaacdee8a", + "time": 1429280596, + "block_seq": 107, + "src_tx": "6546dfbe6e61e81f3e9f6c9afdfee1c07758f2e486d731ae4d19b40602367656", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "100.000000", + "hours": 17411, + "calculated_hours": 81131 + }, + { + "hash": "3bfbe4e80894862d60a053ffb47b8f1749e281603cd6376c8fc6b5e2cec0c843", + "time": 1429279796, + "block_seq": 106, + "src_tx": "8de17dff34a8798f2ac89584f5c559e3bb82c280a3f6890386b4dbc5fef0e8cf", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "100.000000", + "hours": 139293, + "calculated_hours": 203035 + }, + { + "hash": "8f4435cc1cb45453f1ee8e836a74bdec313a6d3aa1879be24e2ba261d474bf36", + "time": 1429278556, + "block_seq": 105, + "src_tx": "41ec724bd40c852096379d1ae57d3f27606877fa95ac9c082fbf63900e6c5cb5", + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "100.000000", + "hours": 1861, + "calculated_hours": 65638 + }, + { + "hash": "52088c63431b6109537bce1e582775f319c9833990c94cc2e8e0dbb8b48b9c27", + "time": 1429278406, + "block_seq": 104, + "src_tx": "44d56cfa9f83d874ee10fb32f0d40458f6bf3e86528592c9a9abf3c960fcb278", + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "100.000000", + "hours": 13730, + "calculated_hours": 77511 + }, + { + "hash": "435c7095e2531b88feb76f32fc34fac3406882cdf71e17fecdba196aa5bc059a", + "time": 1429278106, + "block_seq": 103, + "src_tx": "9150311508851ca989efb5f82b5a7201724514b6b9f84ec1620c18673462126b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "100.000000", + "hours": 12679, + "calculated_hours": 76468 + }, + { + "hash": "1f9fb89f5b7c41d3df6d72b1f02c998196bc79ec20c3949693b4f5a2c1aae44f", + "time": 1429165260, + "block_seq": 97, + "src_tx": "a689a3589730a351f880176b2c15b395967b38a90950e0491e7a1e5531f020a9", + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "hours": 54, + "calculated_hours": 669295 + }, + { + "hash": "63768bd1402317f7d3f0a38c9897e609bb72b7d334e54bd4c609292487264c22", + "time": 1429164900, + "block_seq": 96, + "src_tx": "0301358c2db5314ca43c442bac3c1daf31f4b39f9ac9e22dc157687212cab703", + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "hours": 220, + "calculated_hours": 669561 + }, + { + "hash": "f9653d496ee2e6499a68a1172e5d60b60758b1edcd02d95a3388b29e113a9041", + "time": 1429164880, + "block_seq": 95, + "src_tx": "c93f8bb30e75ffbc0075a4baf57a0f536e4a9123395b13ce67af5cd2dd0f8cd4", + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "hours": 294, + "calculated_hours": 669640 + }, + { + "hash": "24c4cfc628a0f77ce2e878c6ffa9d4dbd85325f8a5e0b5df970a3a2c36033519", + "time": 1429164870, + "block_seq": 94, + "src_tx": "0f4958d590ed4ac9aca79d848731b358b1c01fab9717775cf6515f2bf2706dc8", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 1829, + "calculated_hours": 671178 + }, + { + "hash": "4a5c1b09ef2216ba2fdae735ec8c6ad404bb61bfbeb7407dee9d6e3578762ffb", + "time": 1429164860, + "block_seq": 93, + "src_tx": "e2d9da9342b21659da0a679536f9d6f533a4ce7dc33a7f768c3441ca3640458d", + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "hours": 129, + "calculated_hours": 669481 + }, + { + "hash": "3109e04b5baef2423f4d6d2d639464286c24ef9defa612d3b598802d761b670a", + "time": 1429164850, + "block_seq": 92, + "src_tx": "54e65c445d0af9dda82085ca4bfe0f326ae54ea2a03bd37e07f81d937de97777", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1000.000000", + "hours": 1529, + "calculated_hours": 670884 + }, + { + "hash": "535987a7896501a8a69c1904c0bf98e2ef1fc493bf998c78ee420ef154868731", + "time": 1429164830, + "block_seq": 91, + "src_tx": "98baeb9799902593d0f61ee22947089a798c6adafd05dc6a5ea918d982a19857", + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "1000.000000", + "hours": 2089, + "calculated_hours": 671449 + }, + { + "hash": "63154895637eb000146996ffaeb7cc1a547e409d0a2038650e990e7cc9b36826", + "time": 1429164800, + "block_seq": 89, + "src_tx": "a0956843d442bd4b592d0c1323d153c3c1b2d7d52a86629444de6d1d1b6a4c33", + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "1000.000000", + "hours": 635, + "calculated_hours": 670003 + }, + { + "hash": "f713b6bde2e1956615b23021d20aeb829611d231e2e85b8204c01e5719ac8639", + "time": 1429164790, + "block_seq": 88, + "src_tx": "efc98a4f94ffda2f1d6575048d75728f228a0bef0467c331f085a0f41f97ae45", + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "1000.000000", + "hours": 11912, + "calculated_hours": 681283 + }, + { + "hash": "f98e302e74d8972254b1cdc4de3ca78ff1e60f3f1b7083af397f3bcb219e9454", + "time": 1429164730, + "block_seq": 87, + "src_tx": "cf5a1fad27f8f874f67d3162ae6347154c980ebd97c668d610280418f0f53ce7", + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "hours": 16162, + "calculated_hours": 685550 + }, + { + "hash": "ee69cfd4f15d16ded96745a35ef150f679b5b79cc0fd4009a2d02cdccd81ca3e", + "time": 1429164720, + "block_seq": 86, + "src_tx": "ca51f9d0a19bf326d6dd39a1e4dd240adaaae279411093d4a5b20f54cddabb95", + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "1000.000000", + "hours": 2525, + "calculated_hours": 671916 + }, + { + "hash": "a733e89023ccc12587d0849f9baeda0d2fad640c1cbe97e24ffc531859fd83fd", + "time": 1429164480, + "block_seq": 83, + "src_tx": "d80d49958166fd7b35cee63cfc4a4fdd434484f9bfd9444f62a1b856da36e9c7", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "1000.000000", + "hours": 27495, + "calculated_hours": 696952 + }, + { + "hash": "9bfa6dd7ff610b2e8ba036594244e70d427398eab8607d39be0e45303d45d4d8", + "time": 1429164460, + "block_seq": 82, + "src_tx": "0ad2691de38a15ec31b0fbe9a0c1175138c9d7b7558db2f016a23619f3dbbc6d", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1000.000000", + "hours": 93050, + "calculated_hours": 762513 + }, + { + "hash": "e16c0ebbfba61c49b0e98bf8336bc4d8a33ca30386c4d875bba2ec4bf4a59147", + "time": 1429148000, + "block_seq": 80, + "src_tx": "5db4378f5abcbb48774fc3731a164fb7bbdccf410c3ff829c5706e4d9ef1b1c6", + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "1000.000000", + "hours": 8543, + "calculated_hours": 682578 + }, + { + "hash": "2a886bcedf8862c351cc4087b89e902202b08b164363567a9be47908e938f280", + "time": 1429147950, + "block_seq": 79, + "src_tx": "2558a7cd524acdb58f822a56bd51e8905182b2b35fbfdb1246ce6dc9930d14eb", + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "1000.000000", + "hours": 77792, + "calculated_hours": 751841 + }, + { + "hash": "ce4ca78d810564568c936554d0b6c1a50d91b273648314ffa3fcc1b2d72ac334", + "time": 1429147900, + "block_seq": 78, + "src_tx": "c1fb9372439d7f43d17809afc2d1bc9b2aa81fa9fccc1d837c79e649ec4843db", + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1000.000000", + "hours": 67976, + "calculated_hours": 742039 + }, + { + "hash": "08723ed501e11c2053bab6b500f820dd7ae2aeb4a3c9d5109845bb46afebde97", + "time": 1429147880, + "block_seq": 77, + "src_tx": "29798149e90f6442489bcc3294f455441a5a401e81491ed06bdc2c850756f0d9", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 976817, + "calculated_hours": 1650885 + }, + { + "hash": "50386f195b367f8261e66e3fdfbc942fbacfe25e117e554ca1c1caf899345476", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "25045.000000", + "hours": 72043, + "calculated_hours": 17213842 + }, + { + "hash": "9c3119ad3edbd17a2135cac6d24ef43c6d7e599710b2aab4e97e731e64c13acb", + "time": 1429110544, + "block_seq": 76, + "src_tx": "5369348d67b2dd30dd9164657e372304f81ea10dfe1914ba874d46cd659f52c5", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 72043, + "calculated_hours": 75465 + }, + { + "hash": "ead07056919be961a9e812a7832356d806d551096284648756b3642a3d4a5570", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "45.000000", + "hours": 909, + "calculated_hours": 31886 + }, + { + "hash": "ec41341d4c9d69e150079550a9051c4cb7cc3e2da49deb2c0faaa632cb1958f8", + "time": 1429096344, + "block_seq": 75, + "src_tx": "3122b6b29ac470bfa18fbd1ef6d5ff76717e18ba25374215a5003557b4524f22", + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "hours": 909, + "calculated_hours": 4350 + }, + { + "hash": "5f75082377566cf140c8f158e160ab6ecd1cdf02224c66865106fa1a75b39dc2", + "time": 1429091944, + "block_seq": 74, + "src_tx": "edca397ceedb5fb4462b0aff8fe7f9da5091a4e68f11a34c79daf2c5ae7dd748", + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "955.000000", + "hours": 7273, + "calculated_hours": 665847 + }, + { + "hash": "3c56fa9d161783d6fe5c8b055c6d20bae27097e7bcc44d9ece5c94df182ee5bf", + "time": 1429077914, + "block_seq": 68, + "src_tx": "d803ab903f68f7861cd8eff93b3c097c5b8f6a697ca67bb01e7e645060839fd0", + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "1000.000000", + "hours": 181, + "calculated_hours": 693684 + }, + { + "hash": "8bdd2662d7ed495ff82daef9198ee23ac0c75417607675a8da3dd673952c0e39", + "time": 1429077874, + "block_seq": 67, + "src_tx": "42227683dd9c149859d0578ab300d8509d513afadf7834fd8ae7a321cc07d833", + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "1000.000000", + "hours": 1452, + "calculated_hours": 694967 + }, + { + "hash": "47c74a6d7f1f54cf0a7ac45ec00277539079810068dd95a29a202c43780d65a0", + "time": 1429077694, + "block_seq": 64, + "src_tx": "29c229c97d27bcaf842a367520e1916fb855921906bddf4a3b0413ad3f11517b", + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "1000.000000", + "hours": 1170, + "calculated_hours": 694735 + }, + { + "hash": "9011fbc6e82dce0656e7ffc76afb014d2ad70aa4663e7b687d3212e12f8965e2", + "time": 1429077684, + "block_seq": 63, + "src_tx": "8d10b0ba11d9dd63d3a3522bc35bd260e8da9109298aa488355ea7201eb961b7", + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1000.000000", + "hours": 211, + "calculated_hours": 693778 + }, + { + "hash": "b9853ab091bdb295de20d765e9bce2d86870791a6a15b8ef9e9dddb71c4cba95", + "time": 1429077664, + "block_seq": 62, + "src_tx": "057ae2bee6e1fc2c9997d48aab3e348a7f17ad0305d6e6a14f4f663404b4a00a", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 13, + "calculated_hours": 693586 + }, + { + "hash": "2480aeed2dc47c692e4bce61fb3ee44c4992ea39b0a167235e501330d7ddac62", + "time": 1429077654, + "block_seq": 61, + "src_tx": "4aeafd20b9df56ec852a2c257ff1630b9530d8375a4e72f20238ea36835f76d5", + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "1000.000000", + "hours": 1519, + "calculated_hours": 695095 + }, + { + "hash": "53d7b4778ee9b9537c0439666ca124d81bcaf4195d080ef61fade8c3eae6322e", + "time": 1429077614, + "block_seq": 59, + "src_tx": "4ce860140dbb5f90f39086b0c51323005145a95b365204bd33e3d90fbdc35f51", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 132, + "calculated_hours": 693719 + }, + { + "hash": "d58f3facfb4c9c9459e6fae3000886acb2b1f81322725cdc32cc09a49bb81e43", + "time": 1429077604, + "block_seq": 58, + "src_tx": "5d1cb86b48c8834c8c12fc36a83259609300f2f6a148faa1492a473cee21bc02", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 36, + "calculated_hours": 693626 + }, + { + "hash": "3b9059ec909faf64d652dae78944f4a2737df95a3215bf98e2ff33e02e2b377f", + "time": 1429077584, + "block_seq": 57, + "src_tx": "61a33b49e97bfe2d5f026bf45fae43a1b9bdf08c60ec8db017da720a69790c7f", + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "1000.000000", + "hours": 1681, + "calculated_hours": 695276 + }, + { + "hash": "9e53268a18f8d32a44b4fb183033b49bebfe9d0da3bf3ef2ad1d560500aa54c6", + "time": 1429077554, + "block_seq": 56, + "src_tx": "8fba29db2e3e8cad785e723f95aa5fa46ae0dd8b2bb62586977f20e698642cfb", + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "1000.000000", + "hours": 12696, + "calculated_hours": 706299 + }, + { + "hash": "2f1de81eaa83eda52d8eaf44b12599b23134a38b7d55f67de8881ddafbec278b", + "time": 1429077544, + "block_seq": 55, + "src_tx": "374f01de8274656147be0a23ccc5677773da6f32b071ee796bda0851b6dcd2ac", + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "1000.000000", + "hours": 930, + "calculated_hours": 694536 + }, + { + "hash": "470b293870b663b84e1f677e1bc0e486d0b5f412b0562b078a7a1045f7785d7a", + "time": 1429077524, + "block_seq": 54, + "src_tx": "88d239f2584c78b73a1905fd0dcce3beabfdfc5a9c54518862b009e22e972c68", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 192, + "calculated_hours": 693804 + }, + { + "hash": "cec910b5d672e216db306389dc9ebb08f9d37485fbc3ac6aa7a8c37f60be844c", + "time": 1429077494, + "block_seq": 52, + "src_tx": "231254039042675300dbdd61a6ca54941214e383b5f6380323f848482b4f4628", + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "1000.000000", + "hours": 1499, + "calculated_hours": 695119 + }, + { + "hash": "2f4daff744e7fd81ceea34ecfb0e383a65ecda1c55f32a0bef313d29b0795eab", + "time": 1429077484, + "block_seq": 51, + "src_tx": "814694a8e32f1c81b627f8eb704622c8893d197bf32bbd7e1bf73bec9a831d7d", + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1000.000000", + "hours": 7343, + "calculated_hours": 700966 + }, + { + "hash": "5afa88b6a9ef9168d15d9a0bbc87dd5ab30badc01773460f92703a9c829358c0", + "time": 1429077474, + "block_seq": 50, + "src_tx": "be27621ad46680b343cc1406f5c6a1717704ce169e988ed7afb586f8112ae6f0", + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "1000.000000", + "hours": 11972, + "calculated_hours": 705598 + }, + { + "hash": "85fcb22c416b7d430076bb80a324734cb97483cb4544192df252b89ba8f7fd61", + "time": 1429070414, + "block_seq": 44, + "src_tx": "ced30c4ac3107997efa90faa40c8baed47dafc8ddb4feae3ba21275401c36280", + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "5.000000", + "hours": 33, + "calculated_hours": 3510 + }, + { + "hash": "e64fa1f60e905f1d7b7a8f0ca134ab2b7a467f7363ec9c03628d559e1230eb68", + "time": 1429070374, + "block_seq": 43, + "src_tx": "d368fc3112b522c52a5b191981ca52678cc7db29bdc3493cf551be88d109ef9c", + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "hours": 265, + "calculated_hours": 3742 + }, + { + "hash": "3e475e76c226a70c87d030d8fc6b8b1c2cc654ba9eaf3bed08be5bd603aec0b7", + "time": 1429011137, + "block_seq": 27, + "src_tx": "cff53a059d55f2c90f6dd7ce7de2cc07cbdbd50b25867cba0f41cd0192614d0d", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "90.000000", + "hours": 70992, + "calculated_hours": 135076 + }, + { + "hash": "339aeec109a26bab65e618d73ebba16e5b8fc18f7dc1fe502ca891ad5b0f4d5f", + "time": 1429011077, + "block_seq": 26, + "src_tx": "56e7bd13dc4c6e1cd80aba66a0a9fed650d0646659ac774e3f1b415848755d85", + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "10.000000", + "hours": 567938, + "calculated_hours": 575058 + }, + { + "hash": "ebedac42a639f0d0a196b47676cb757b95046f0403f74baa5b15e98753ee2d58", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "f910d0e633735df5f041fdb7ffcb9cc8988b71c9375c52ababb54238be4d6852", + "time": 1428991665, + "block_seq": 25, + "src_tx": "917510897f5d8a018ad8d447876a15e2e1f68d42e71b6f75d89b02c4a599c537", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "1.000000", + "hours": 0, + "calculated_hours": 717 + }, + { + "hash": "fbe00b341f3e798c3e7e5eea04ffd8f3e70f0e78bc38f9a4927bae7eed6a1411", + "time": 1428991635, + "block_seq": 24, + "src_tx": "f935cd91736604989c08448a2d83d6b044c3198ac1a7483a3b9846f8848a7d84", + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1434 + }, + { + "hash": "e55a8d2ebe0f48f17a175fdd67d47deb5015b2ee8e91de16b2b121c8ad830e40", + "time": 1428990135, + "block_seq": 20, + "src_tx": "22766105d0f93d01fed7bed2dcabedfd89fe846621c912b0af845d8ba5d265f8", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "b56517b7803a4b2cca522e1cca5f75894db174c97d0e127826f5414544eccb72", + "time": 1428990115, + "block_seq": 19, + "src_tx": "c6eccf17b4b952f19548b1924126c9dc409b45f9e6fcc0954a3494e7399f5fd4", + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3589 + }, + { + "hash": "0b720d05d44354ff0c6c75d55f1cd4e5945bc2ca80f2ba840545205362202925", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "2.000000", + "hours": 0, + "calculated_hours": 1529 + }, + { + "hash": "e72d8ba4ce2d3b37aeb71df2e3bed80ee07204b3fa633f56cbce7bca836bd39c", + "time": 1428820629, + "block_seq": 16, + "src_tx": "e96e157b685c28847d6758e2ba326ad59cf2661c926fb08000d4b40d78a9eee3", + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "hours": 0, + "calculated_hours": 2294 + }, + { + "hash": "9e8997e53d2e61955da71dbbc6ba5b0da799eaace0f45870a4e42276a6fdaefa", + "time": 1428807711, + "block_seq": 9, + "src_tx": "9d87d7bb9e56a3588bacb478c7556280b28c0a49f6e09db8b54a84c20d865f2f", + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "1f810bdd1c65ad50f27f2c47a000150877fdba2fdb78b9d8cae39946be6a9e33", + "time": 1428807691, + "block_seq": 8, + "src_tx": "7229422f3a0afb5f3a9596ed50146440c17a3d54abda0f3c70cd9dc58de96374", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "f9e7a412cdff80e95ddbe1d76fcc73f967cb99d383b0659e1355c8e623f02b62", + "time": 1428807671, + "block_seq": 7, + "src_tx": "f832428481690fa918d6d29946e191f2c8c89b2388a906e0c53dceee6070a24b", + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "5.000000", + "hours": 0, + "calculated_hours": 3842 + }, + { + "hash": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + }, + { + "hash": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden new file mode 100755 index 0000000..87d270c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-150-include-distribution.golden @@ -0,0 +1,754 @@ +{ + "richlist": [ + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-8.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-8.golden new file mode 100755 index 0000000..7aade80 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-8.golden @@ -0,0 +1,44 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden new file mode 100755 index 0000000..24d5177 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all-include-distribution.golden @@ -0,0 +1,779 @@ +{ + "richlist": [ + { + "address": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "locked": true + }, + { + "address": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "locked": false + }, + { + "address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "locked": false + }, + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all.golden new file mode 100755 index 0000000..c6bb6a9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-all.golden @@ -0,0 +1,279 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + }, + { + "address": "2iJPqYVuQvFoG1pim4bjoyxWK8uwGmznWaV", + "coins": "3000.000000", + "locked": false + }, + { + "address": "3iEkvqSQCNrm8tMVf5ABAx2Bp6EGL9wyMP", + "coins": "3000.000000", + "locked": false + }, + { + "address": "vdLGAnCfbBkxabcVk6tEsa6RH99JTxdzbt", + "coins": "3000.000000", + "locked": false + }, + { + "address": "22WGCstVJGVyqnBuvGHt17L5aNNMpURvckd", + "coins": "2000.000000", + "locked": false + }, + { + "address": "PCAtFnGVujpALXB1Gqb9CEMRMVXfVGu6iM", + "coins": "2000.000000", + "locked": false + }, + { + "address": "XnKU1htBL5wFSMX8oytZBsBMeaBSbVNivT", + "coins": "2000.000000", + "locked": false + }, + { + "address": "pMub1Pz3SLVaSwHoomgp5oDVxdkVxLkW6L", + "coins": "2000.000000", + "locked": false + }, + { + "address": "tG8F6fuw3KEUStpa85EFQDMHVw9piTzZ2g", + "coins": "2000.000000", + "locked": false + }, + { + "address": "2jNYhHCuqQtU8kKkLf8ZZmKj6fywTL7fw2e", + "coins": "1500.000000", + "locked": false + }, + { + "address": "YLT4buWf3kYDV9QddnC5iXTj881Eniuvrx", + "coins": "1290.000000", + "locked": false + }, + { + "address": "2acnXsnJ2k8jxiUahtBe8h4xouPAnpbwwjc", + "coins": "1100.000000", + "locked": false + }, + { + "address": "VD98Qt2f2UeUbUKcCJEaKxqEewExgCyiVh", + "coins": "1100.000000", + "locked": false + }, + { + "address": "sV8sVBgs11uHQtZK5MPbYem2iJ6Hehghv7", + "coins": "1100.000000", + "locked": false + }, + { + "address": "9vNYwzpjSgw4dRyTc7SAP4z9Jh8bhwURnu", + "coins": "1010.000000", + "locked": false + }, + { + "address": "ZWhZtjwXMS46cpDxfRwQyxxKPhqwsQu8oN", + "coins": "1002.000000", + "locked": false + }, + { + "address": "212mwY3Dmey6vwnWpiph99zzCmopXTqeVEN", + "coins": "1000.000000", + "locked": false + }, + { + "address": "22Piwuzo8ZfoXfpMghhbzGz3ptmTeiDhLbg", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2H7mA88ireMKHqP9LYWK5opnU176v7eYqrn", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2LZzgdFYNhsBBSLATkV6PA1zk6DvWNghP2", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2U1B6EE5ZCXWJJSyEndouuCk434xpvYqYDF", + "coins": "1000.000000", + "locked": false + }, + { + "address": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "locked": false + }, + { + "address": "FtdApqw416skWtXM7ExanZWFmiHNPZ1Ft6", + "coins": "1000.000000", + "locked": false + }, + { + "address": "2kN23viEG7Kn3Utuwz9voM4Z8ohLR9Y8L2v", + "coins": "500.000000", + "locked": false + }, + { + "address": "WADSeEwEQVbtUy8CfcVimyxX1KjTRkvfoK", + "coins": "110.000000", + "locked": false + }, + { + "address": "2A2YC8kxWnUDbscpzZ6UPfNAmx5ddKBeYNs", + "coins": "100.000000", + "locked": false + }, + { + "address": "aPF9pL9sVEiyEVhynp3s1dmqLetP1BJrW6", + "coins": "100.000000", + "locked": false + }, + { + "address": "bFTFUB3zdwZcwWQTewXZnVS7UykkTb7zqa", + "coins": "100.000000", + "locked": false + }, + { + "address": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "12.000000", + "locked": false + }, + { + "address": "odhAMxHhXoBdx1RHNmfu7dTZ1LZivfsbiH", + "coins": "10.000000", + "locked": false + }, + { + "address": "2apVG7f24ezDK13yCDTqBWYrTZpuj94KnCN", + "coins": "5.000000", + "locked": false + }, + { + "address": "j6pa8kdKqHbxRm2VXJVbzigQDFzqTVfvfq", + "coins": "5.000000", + "locked": false + }, + { + "address": "Kb9SqqTVA3XyQjZYb4wYrBVUeZWRKEQyzZ", + "coins": "3.000000", + "locked": false + }, + { + "address": "PRXLNyB64cqaiG4pCoFZZ8Tuv7LWYPpa7m", + "coins": "3.000000", + "locked": false + }, + { + "address": "2bvEzLx4mgyQkYL5bkSc2rD9V1nqWBqn8vp", + "coins": "2.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-default.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-default.golden new file mode 100755 index 0000000..b4f4a1d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/richlist-default.golden @@ -0,0 +1,104 @@ +{ + "richlist": [ + { + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "63083.000000", + "locked": false + }, + { + "address": "LzniV6G4nVVvRBNo7NcCUvAz1Tzo5MajqZ", + "coins": "38105.000000", + "locked": false + }, + { + "address": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "27045.000000", + "locked": false + }, + { + "address": "bNQHMc2nM8x2fssmyUp6QWY1ow6LzB7kZz", + "coins": "27000.000000", + "locked": false + }, + { + "address": "2JJ8pgq8EDAnrzf9xxBJapE2qkYLefW4uF8", + "coins": "26400.000000", + "locked": false + }, + { + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "locked": false + }, + { + "address": "wLhHnBXzdhzFcuWRmfLCG5DTnPVEtHdhzB", + "coins": "22000.000000", + "locked": false + }, + { + "address": "G5XZCdcjcnKqPkeLjZShMz112avsgSo8EW", + "coins": "21500.000000", + "locked": false + }, + { + "address": "wYRMGKCkEpWD3v9Pz3Lqvk3u5HJpp4YaGK", + "coins": "18000.000000", + "locked": false + }, + { + "address": "2hVtXZWjGWsTfrV1Tj4KLaxCfiAoBzqw1Vw", + "coins": "14600.000000", + "locked": false + }, + { + "address": "2j7twMgd2kfeU2Jww37cWH7GY79hX73MSVs", + "coins": "12000.000000", + "locked": false + }, + { + "address": "8MQsjc5HYbSjPTZikFZYeHHDtLungBEHYS", + "coins": "10100.000000", + "locked": false + }, + { + "address": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10060.000000", + "locked": false + }, + { + "address": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "10000.000000", + "locked": false + }, + { + "address": "2J3rWX7pciQwmvcATSnxEeCHRs1mSkWmt4L", + "coins": "6700.000000", + "locked": false + }, + { + "address": "v7Bma8dYdBMx7RQ2NohXXDUo7eR5TWBscF", + "coins": "5100.000000", + "locked": false + }, + { + "address": "NGLS4CYvBdV9HXJDpeY8jrdQDqLeBvfAwc", + "coins": "4955.000000", + "locked": false + }, + { + "address": "2iwB1VmUWbCoVd4gNstB9LKctw3htFhVmuV", + "coins": "3400.000000", + "locked": false + }, + { + "address": "Vq7DUM8vGL81QS8S4SXBNTBvLHpkLf9Eaj", + "coins": "3100.000000", + "locked": false + }, + { + "address": "2ZZHJVrHvkSrUL4bDpjaqnfq6oHYzbgxghD", + "coins": "3000.000000", + "locked": false + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/single-addr.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/single-addr.golden new file mode 100755 index 0000000..f93e7b5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/single-addr.golden @@ -0,0 +1,220 @@ +[ + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 128, + "block_seq": 53, + "unknown": false + }, + "time": 1429077514, + "txn": { + "length": 220, + "type": 0, + "txid": "d154d8262abbf517c67d529b0fea7cdf097433bd296d5795b17c6379cb1b1430", + "inner_hash": "b69070b10e6bbc276bf155361d7f3238fec46b9d865075c1dc0fc20d81ab0a42", + "timestamp": 1429077514, + "sigs": [ + "0a4b7f385a164f5718794382d49c14a6623e7af5f1ddbefe4871c756b754457a7075e822603bd3b22b313278abebe756be92367ef7a81a8c4adf992842c2058601" + ], + "inputs": [ + "e6d9b56e075a6adf520d1ae7fbab9ae06353ae0b93dc8cb17d82cc3628009a50" + ], + "outputs": [ + { + "uxid": "2df1e88589be43c55d7c6c3dbcbd663fb759b3245eb8d86b0b9cdaa989556aea", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "943750.000000", + "hours": 2964 + }, + { + "uxid": "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1000.000000", + "hours": 2964 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 108, + "block_seq": 73, + "unknown": false + }, + "time": 1429091164, + "txn": { + "length": 220, + "type": 0, + "txid": "a95317361364e8cc08a150840bac8a97ea1f56278f8834ca2a2f16c24c4a7f0f", + "inner_hash": "90c166e92a7883037f9634704923d986976ac814f28e4761309bf86d77cdb755", + "timestamp": 1429091164, + "sigs": [ + "27ee3b614e5362462bc20c23e873e380b5bcc880053436a640286ead5fe2dcd00094e0eade532ffbfc8ba95d5e3540968b2fff64e19e0e772342aceb3c5d3ce100" + ], + "inputs": [ + "c7919b892eeb751456d456b37ccde7350a3fca0dda03b17ec426a56f12dcf192" + ], + "outputs": [ + { + "uxid": "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "995.000000", + "hours": 387 + }, + { + "uxid": "8f52e126bbc359bc3bfd230d82649c3d1c622e8f9c20dae7ccd73bd0b4ee2bad", + "dst": "4EHiTjCsxQmt4wRy5yJxBMcxsM5yGqtuqu", + "coins": "5.000000", + "hours": 387 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 68, + "block_seq": 113, + "unknown": false + }, + "time": 1429348172, + "txn": { + "length": 220, + "type": 0, + "txid": "1f27afc41896d2c7fdbd2620e606440ad12557e9a4bdd6808dcc2c23d4e32978", + "inner_hash": "4d53c05c731409feef7606cf9514904f4c7704537efb453ac2c439fcfe77a455", + "timestamp": 1429348172, + "sigs": [ + "e36cef84c1c6f999dba462f3134131c105da2255eaf21550ce30ee52a14a33d529a7cd0c37b3883d0d57429b163b4905271c7b1a4d951b4a521f245c7857dd5c01" + ], + "inputs": [ + "1d4595b9fa1c6c3d64f48b6ae5f8f861b1c08a022cbcb04b279df448da3db660" + ], + "outputs": [ + { + "uxid": "412eff3eef889c682da8db3608fce37d1c5ee2cc297bc88d901648e6ccd418f9", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "873800.000000", + "hours": 173601 + }, + { + "uxid": "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "100.000000", + "hours": 173601 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 63, + "block_seq": 118, + "unknown": false + }, + "time": 1429364072, + "txn": { + "length": 317, + "type": 0, + "txid": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "inner_hash": "86b47008bbeb60335762ba70b5bdf8128f09b3f8fff6ec6e5d9553763a5b5cef", + "timestamp": 1429364072, + "sigs": [ + "48312c1abe5617609f70a882689f194e8d18c0b56d153adfae4be08bf00d723c6cda6dbd885e7ed7f92c7b7065d583adfd5f18bb37da9b796a394f4a388e978d01", + "4826477aed0387ca448b8225a5d27ebe6824b460d0581fb8ccb5078a865cd8171e7f5c860091a99cc85b1571dce8a550659cb3d02902a77cd1f6d0d27277bdee01" + ], + "inputs": [ + "7b132c07322babefa83ab64971b7bfb29bf2cb9ffe9c42dc7e2975a185dcd8b8", + "c961ba554ae30b0edcdf71e834ab2b26d7dff5bcf5955d4874cdba89170392bf" + ], + "outputs": [ + { + "uxid": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769 + }, + { + "uxid": "ba0a94662846565969d361b1b7c248847a48e69f2b9eefb4ffb0bc2efc56a8fd", + "dst": "38cVLswijqC2ANV5HxTroeapQzqeoBR88C", + "coins": "50.000000", + "hours": 30769 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 61, + "block_seq": 120, + "unknown": false + }, + "time": 1429364452, + "txn": { + "length": 183, + "type": 0, + "txid": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "inner_hash": "12d27fdba804c648b8f72d9740d4021b05c88c95d3595af4afab2150092c5eee", + "timestamp": 1429364452, + "sigs": [ + "2baa243ca1b82bd9fc1a31a0b53c9f7eb0ad62b19d6a4d3af62579cc2dc455d81d8ed82ba342dc650d4ae38718d81a8df6a93a9a809749a2f5391894bbaf298400" + ], + "inputs": [ + "f480c6097568036b90a2e019f9ee68c0812b2da8828be33a005a7427caf14a2b" + ], + "outputs": [ + { + "uxid": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480 + } + ] + } + }, + { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 60, + "block_seq": 121, + "unknown": false + }, + "time": 1429382678, + "txn": { + "length": 220, + "type": 0, + "txid": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "inner_hash": "c98f858a27e76b0b565baaa3dffc6cfc7b0ffe9dd7d2d71f4bb0ad4d1c439ca2", + "timestamp": 1429382678, + "sigs": [ + "15fccdc36c966a9571196a3f727ebda47162441df2d9965ac27109ac56d22cb41638b404e84b5b388d809b814ade18022cba0a6e021140c6b7d0144a6facd6d501" + ], + "inputs": [ + "6beca9fb58a327580c614d7fb5622916849756790b661bcabc880666364fdf47" + ], + "outputs": [ + { + "uxid": "f8a1990492f970227ec29e6e095fa724d66fa2d6883bd8723773098d08ca8b3c", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "801600.000000", + "hours": 378646 + }, + { + "uxid": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "dst": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646 + } + ] + } + } +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/transaction.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/transaction.golden new file mode 100755 index 0000000..6fa6d58 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/transaction.golden @@ -0,0 +1,29 @@ +{ + "length": 317, + "type": 0, + "txid": "76ecbabc53ea2a3be46983058433dda6a3cf7ea0b86ba14d90b932fa97385de7", + "inner_hash": "5d55837bb0cbda9c9323ff9aafd7c3d31d0d38638346172fbe2d9078ebaa892a", + "timestamp": 1479100522, + "sigs": [ + "464b7724302178c1cfeacadaaf3556a3b7e5259adf51919476c3acc695747ed244b5ce2187ce7bedb6ad65c71f7f7ff3fa6805e64fe5da3aaa00ad563c7424f600", + "1155537b0391d4a6ee5eac07dee5798e953dca3a7c30643403dd2d326582c7d35080a16dc22644782ce1087bfc3bd06c2bf68e9a98e3989d90831646a9be2c9101" + ], + "inputs": [ + "782a8662efb0e933cab7d3ae9429ab53c4208cf44d8cdc07c2fbd7204b6b5cad", + "2f6b61a44086588c4eaa56a5dd9f1e0be2528861a6731608fcec38891b95db91" + ], + "outputs": [ + { + "uxid": "bd302ef776efa8548183b89f21e90649f21b90fe2d2e90ecc1b880f2d995f226", + "dst": "2UXZTg4ZHF6715b6tRhtaqceuQQ3G79GiZg", + "coins": "998.000000", + "hours": 247538 + }, + { + "uxid": "31058b6bfb30bfd441aec00929e75782bce47c8a75787ba519dbb268f89d2c4b", + "dst": "2awsJ2CR5H6QXCF2hwDjcvcAH9SgyfxCxgz", + "coins": "1.000000", + "hours": 247538 + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-addr.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-addr.golden new file mode 100755 index 0000000..c9d3596 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-addr.golden @@ -0,0 +1,13 @@ +[ + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "time": 1427926392, + "src_block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "owner_address": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": 1000000000000, + "hours": 1, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" + } +] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-noaddr.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-noaddr.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-noaddr.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-spent.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-spent.golden new file mode 100755 index 0000000..4ed814e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout-spent.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 181, + "spent_tx": "701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947" +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout.golden new file mode 100755 index 0000000..b45c139 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/uxout.golden @@ -0,0 +1,11 @@ +{ + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "time": 1431339429, + "src_block_seq": 179, + "src_tx": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "owner_address": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": 615700000000, + "hours": 5521648, + "spent_block_seq": 0, + "spent_tx": "0000000000000000000000000000000000000000000000000000000000000000" +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-address.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-address.golden new file mode 100755 index 0000000..268bb84 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-address.golden @@ -0,0 +1,3 @@ +{ + "version": 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden new file mode 100755 index 0000000..5295a26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-bad-sig.golden @@ -0,0 +1,39 @@ +{ + "confirmed": false, + "transaction": { + "length": 220, + "type": 0, + "txid": "de977ea93c0090ebe6e0c2dea002ffaf4fc314d08d06534120d96b96cc0042ce", + "inner_hash": "c30ba73f9422e909c601777ace12c777db329e06875cc6b29383bac3766acdc7", + "fee": "188772", + "sigs": [ + "71f2c01516fe696328e79bcf464eb0db374b63d494f7a307d1e77114f18581d7a81eed5275a9e04a336292dd2fd16977d9bef2a54ea3161d0876603d00c53bc9dd" + ], + "inputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": "377543", + "calculated_hours": "377543", + "timestamp": 1431574528, + "block": 180, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + } + ], + "outputs": [ + { + "uxid": "4ac148c444b86560bde4005fcf5d9f53ae18226b35a60911ab777dfe00e4cb89", + "address": "7cpQ7t3PZZXvjTst8G7Uvs7XH4LeM8fBPD", + "coins": "0.001000", + "hours": "10" + }, + { + "uxid": "a7369917d622df48d8f205e0935144a825df4d8318d82c8bd9492ab3ee11f102", + "address": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22099.999000", + "hours": "188761" + } + ] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden new file mode 100755 index 0000000..24a0f4c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/verify-transaction-invalid-empty.golden @@ -0,0 +1,13 @@ +{ + "confirmed": false, + "transaction": { + "length": 0, + "type": 0, + "txid": "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "fee": "0", + "sigs": [], + "inputs": [], + "outputs": [] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-balance.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-balance.golden new file mode 100755 index 0000000..3b86145 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-balance.golden @@ -0,0 +1,22 @@ +{ + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + }, + "addresses": { + "27nAhbBjHLcvD3UdbrH1YouKWYwmG94K9cw": { + "confirmed": { + "coins": 0, + "hours": 0 + }, + "predicted": { + "coins": 0, + "hours": 0 + } + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-transactions.golden b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-transactions.golden new file mode 100755 index 0000000..f3d2101 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/integration/testdata/wallet-transactions.golden @@ -0,0 +1,3 @@ +{ + "transactions": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/network.go b/vendor/github.com/skycoin/skycoin/src/api/network.go new file mode 100755 index 0000000..a42db7a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/network.go @@ -0,0 +1,136 @@ +package api + +// APIs for network-related information + +import ( + "net/http" + "sort" + + daemon "github.com/skycoin/skycoin/src/daemon" //http,json helpers + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// Connection wrapper around daemon connection with info about block height added +type Connection struct { + *daemon.Connection + Height uint64 `json:"height"` +} + +// Connections an array of connections +// Arrays must be wrapped in structs to avoid certain javascript exploits +type Connections struct { + Connections []Connection `json:"connections"` +} + +func connectionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr := r.FormValue("addr") + if addr == "" { + wh.Error400(w, "addr is required") + return + } + + c := gateway.GetConnection(addr) + if c == nil { + wh.Error404(w, "") + return + } + cnx := Connection{ + Connection: c, + Height: 0, + } + bcp, err := gateway.GetBlockchainProgress() + if err != nil { + wh.Error500(w, err.Error()) + return + } + for _, ph := range bcp.Peers { + if ph.Address == c.Addr { + cnx.Height = ph.Height + break + } + } + + wh.SendJSONOr500(logger, w, cnx) + } +} + +func connectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + dcnxs := gateway.GetConnections() + bcp, err := gateway.GetBlockchainProgress() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + peerHeights := bcp.Peers + index := make(map[string]uint64, len(peerHeights)) + + for i := 0; i < len(peerHeights); i++ { + index[peerHeights[i].Address] = peerHeights[i].Height + } + + cnxs := Connections{} + for _, c := range dcnxs.Connections { + cnx := Connection{ + Connection: c, + Height: index[c.Addr], + } + cnxs.Connections = append(cnxs.Connections, cnx) + } + wh.SendJSONOr500(logger, w, cnxs) + } +} + +func defaultConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetDefaultConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +func trustConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetTrustConnections() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} + +func exchgConnectionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + conns := gateway.GetExchgConnection() + sort.Strings(conns) + + wh.SendJSONOr500(logger, w, conns) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/network_test.go b/vendor/github.com/skycoin/skycoin/src/api/network_test.go new file mode 100755 index 0000000..e21c863 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/network_test.go @@ -0,0 +1,453 @@ +package api + +import ( + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/daemon" +) + +func TestConnection(t *testing.T) { + bp := daemon.BlockchainProgress{ + Current: 35, + Highest: 39, + Peers: nil} + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.3.5.1", + Height: 39, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.0.1", + Height: 12, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.5.1", + Height: 13, + }) + + tt := []struct { + name string + method string + status int + err string + addr string + gatewayGetConnectionResult *daemon.Connection + gatewayGetBlockchainProgressResult *daemon.BlockchainProgress + gatewayGetBlockchainProgressError error + result *daemon.Connection + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty addr", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - addr is required", + addr: "", + gatewayGetConnectionResult: nil, + result: nil, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + addr: "addr", + gatewayGetBlockchainProgressResult: &bp, + gatewayGetBlockchainProgressError: nil, + gatewayGetConnectionResult: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + result: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + { + name: "500 - blockchain progress failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - some error", + addr: "addr", + gatewayGetBlockchainProgressResult: nil, + gatewayGetBlockchainProgressError: errors.New("some error"), + gatewayGetConnectionResult: &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connection" + gateway := NewGatewayerMock() + gateway.On("GetConnection", tc.addr).Return(tc.gatewayGetConnectionResult) + gateway.On("GetBlockchainProgress").Return( + tc.gatewayGetBlockchainProgressResult, + tc.gatewayGetBlockchainProgressError, + ) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.addr != "" { + v.Add("addr", tc.addr) + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.Connection + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestConnections(t *testing.T) { + bp := daemon.BlockchainProgress{ + Current: 35, + Highest: 39, + Peers: nil} + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.3.5.1", + Height: 39, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.0.1", + Height: 12, + }) + bp.Peers = append(bp.Peers, struct { + Address string `json:"address"` + Height uint64 `json:"height"` + }{ + Address: "127.0.5.1", + Height: 13, + }) + + tt := []struct { + name string + method string + status int + err string + gatewayGetConnectionsResult *daemon.Connections + gatewayGetBlockchainProgressResult *daemon.BlockchainProgress + gatewayGetBlockchainProgressError error + result *daemon.Connections + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetBlockchainProgressResult: &bp, + gatewayGetBlockchainProgressError: nil, + gatewayGetConnectionsResult: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + result: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + }, + { + name: "500 - blockchain progress failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - some error", + gatewayGetBlockchainProgressResult: nil, + gatewayGetBlockchainProgressError: errors.New("some error"), + gatewayGetConnectionsResult: &daemon.Connections{ + Connections: []*daemon.Connection{ + &daemon.Connection{ + ID: 1, + Addr: "127.0.0.1", + LastSent: 99999, + LastReceived: 1111111, + Outgoing: true, + Introduced: true, + Mirror: 9876, + ListenPort: 9877, + }, + }, + }, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections" + gateway := NewGatewayerMock() + gateway.On("GetConnections").Return(tc.gatewayGetConnectionsResult) + gateway.On("GetBlockchainProgress").Return( + tc.gatewayGetBlockchainProgressResult, + tc.gatewayGetBlockchainProgressError, + ) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.Connections + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestDefaultConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetDefaultConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetDefaultConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/defaultConnections" + gateway := NewGatewayerMock() + gateway.On("GetDefaultConnections").Return(tc.gatewayGetDefaultConnectionsResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetTrustConnections(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetTrustConnectionsResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetTrustConnectionsResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/trust" + gateway := NewGatewayerMock() + gateway.On("GetTrustConnections").Return(tc.gatewayGetTrustConnectionsResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} + +func TestGetExchgConnection(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + gatewayGetExchgConnectionResult []string + result []string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "", + gatewayGetExchgConnectionResult: []string{"44.33.22.11", "11.44.66.88"}, + result: []string{"11.44.66.88", "44.33.22.11"}, + }, + } + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/network/connections/exchange" + gateway := NewGatewayerMock() + gateway.On("GetExchgConnection").Return(tc.gatewayGetExchgConnectionResult) + gateway.On("IsCSPEnabled").Return(false) + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, &CSRFStore{}, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []string + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, msg) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/notes.go b/vendor/github.com/skycoin/skycoin/src/api/notes.go new file mode 100755 index 0000000..ff2c684 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/notes.go @@ -0,0 +1,65 @@ +package api + +// NotesRPC note rpc +// type NotesRPC struct { +// Notes wallet.Notes +// WalletDirectory string +// } + +// // Ng global note +// var Ng *NotesRPC + +// // InitWalletRPC init wallet rpc +// func InitWalletRPC(walletDir string, options ...wallet.Option) { +// Ng = NewNotesRPC(walletDir) +// } + +// // NewNotesRPC new notes rpc +// func NewNotesRPC(walletDir string) *NotesRPC { +// rpc := &NotesRPC{} +// if err := os.MkdirAll(walletDir, os.FileMode(0700)); err != nil { +// logger.Panicf("Failed to create notes directory %s: %v", walletDir, err) +// } +// rpc.WalletDirectory = walletDir +// w, err := wallet.LoadNotes(rpc.WalletDirectory) +// if err != nil { +// logger.Panicf("Failed to load all notes: %v", err) +// } +// wallet.CreateNoteFileIfNotExist(walletDir) +// rpc.Notes = w +// return rpc +// } + +// GetNotesReadable returns readable notes +// func (nt *NotesRPC) GetNotesReadable() wallet.ReadableNotes { +// return nt.Notes.ToReadable() +// } + +// // Create a wallet Name is set by creation date +// func notesCreate(gateway *daemon.Gateway) http.HandlerFunc { +// return func(w http.ResponseWriter, r *http.Request) { +// logger.Info("API request made to create a note") +// note := r.FormValue("note") +// transactionID := r.FormValue("transaction_id") +// newNote := wallet.Note{ +// TxID: transactionID, +// Value: note, +// } +// Ng.Notes.SaveNote(Ng.WalletDirectory, newNote) +// rlt := Ng.GetNotesReadable() +// wh.SendOr500(w, rlt) +// } +// } + +// // Returns a wallet by ID if GET. Creates or updates a wallet if POST. +// func notesHandler(gateway *daemon.Gateway) http.HandlerFunc { +// return func(w http.ResponseWriter, r *http.Request) { +// //ret := wallet.Wallets.ToPublicReadable() +// ret := Ng.GetNotesReadable() +// wh.SendOr404(w, ret) +// } +// } + +// mux.Handle("/notes", notesHandler(gateway)) + +// mux.Handle("/notes/create", notesCreate(gateway)) diff --git a/vendor/github.com/skycoin/skycoin/src/api/spend.go b/vendor/github.com/skycoin/skycoin/src/api/spend.go new file mode 100755 index 0000000..8aaf04d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/spend.go @@ -0,0 +1,530 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/shopspring/decimal" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/wallet" +) + +// CreateTransactionResponse is returned by /wallet/transaction +type CreateTransactionResponse struct { + Transaction CreatedTransaction `json:"transaction"` + EncodedTransaction string `json:"encoded_transaction"` +} + +// NewCreateTransactionResponse creates a CreateTransactionResponse +func NewCreateTransactionResponse(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreateTransactionResponse, error) { + cTxn, err := NewCreatedTransaction(txn, inputs) + if err != nil { + return nil, err + } + + return &CreateTransactionResponse{ + Transaction: *cTxn, + EncodedTransaction: hex.EncodeToString(txn.Serialize()), + }, nil +} + +// CreatedTransaction represents a transaction created by /wallet/transaction +type CreatedTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + TxID string `json:"txid"` + InnerHash string `json:"inner_hash"` + Fee string `json:"fee"` + + Sigs []string `json:"sigs"` + In []CreatedTransactionInput `json:"inputs"` + Out []CreatedTransactionOutput `json:"outputs"` +} + +// NewCreatedTransaction returns a CreatedTransaction +func NewCreatedTransaction(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + for _, o := range txn.Out { + var err error + outputHours, err = coin.AddUint64(outputHours, o.Hours) + if err != nil { + return nil, err + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = coin.AddUint64(inputHours, i.Hours) + if err != nil { + return nil, err + } + } + + if inputHours < outputHours { + return nil, errors.New("inputHours unexpectedly less than output hours") + } + + fee := inputHours - outputHours + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txid := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txid) + if err != nil { + return nil, err + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(inputs)) + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + return nil, err + } + in[i] = *ci + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txid.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ToTransaction converts a CreatedTransaction back to a coin.Transaction +func (r *CreatedTransaction) ToTransaction() (*coin.Transaction, error) { + t := coin.Transaction{} + + t.Length = r.Length + t.Type = r.Type + + var err error + t.InnerHash, err = cipher.SHA256FromHex(r.InnerHash) + if err != nil { + return nil, err + } + + sigs := make([]cipher.Sig, len(r.Sigs)) + for i, s := range r.Sigs { + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + + t.Sigs = sigs + + in := make([]cipher.SHA256, len(r.In)) + for i, n := range r.In { + in[i], err = cipher.SHA256FromHex(n.UxID) + if err != nil { + return nil, err + } + } + + t.In = in + + out := make([]coin.TransactionOutput, len(r.Out)) + for i, o := range r.Out { + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + hours, err := strconv.ParseUint(o.Hours, 10, 64) + if err != nil { + return nil, err + } + + out[i] = coin.TransactionOutput{ + Address: addr, + Coins: coins, + Hours: hours, + } + } + + t.Out = out + + hash, err := cipher.SHA256FromHex(r.TxID) + if err != nil { + return nil, err + } + if t.Hash() != hash { + return nil, errors.New("ReadableTransaction.Hash does not match parsed transaction hash") + } + + return &t, nil +} + +// CreatedTransactionOutput is a transaction output +type CreatedTransactionOutput struct { + UxID string `json:"uxid"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// NewCreatedTransactionOutput creates CreatedTransactionOutput +func NewCreatedTransactionOutput(out coin.TransactionOutput, txid cipher.SHA256) (*CreatedTransactionOutput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + return &CreatedTransactionOutput{ + UxID: out.UxID(txid).Hex(), + Address: out.Address.String(), + Coins: coins, + Hours: fmt.Sprint(out.Hours), + }, nil +} + +// CreatedTransactionInput is a verbose transaction input +type CreatedTransactionInput struct { + UxID string `json:"uxid"` + Address string `json:"address,omitempty"` + Coins string `json:"coins,omitempty"` + Hours string `json:"hours,omitempty"` + CalculatedHours string `json:"calculated_hours,omitempty"` + Time uint64 `json:"timestamp,omitempty"` + Block uint64 `json:"block,omitempty"` + TxID string `json:"txid,omitempty"` +} + +// NewCreatedTransactionInput creates CreatedTransactionInput +func NewCreatedTransactionInput(out wallet.UxBalance) (*CreatedTransactionInput, error) { + coins, err := droplet.ToString(out.Coins) + if err != nil { + return nil, err + } + + if out.SrcTransaction.Null() { + return nil, errors.New("NewCreatedTransactionInput UxOut.SrcTransaction is not initialized") + } + + addr := out.Address.String() + hours := fmt.Sprint(out.InitialHours) + calculatedHours := fmt.Sprint(out.Hours) + txID := out.SrcTransaction.Hex() + + return &CreatedTransactionInput{ + UxID: out.Hash.Hex(), + Address: addr, + Coins: coins, + Hours: hours, + CalculatedHours: calculatedHours, + Time: out.Time, + Block: out.BkSeq, + TxID: txID, + }, nil +} + +// createTransactionRequest is sent to /wallet/transaction +type createTransactionRequest struct { + IgnoreUnconfirmed bool `json:"ignore_unconfirmed"` + HoursSelection hoursSelection `json:"hours_selection"` + Wallet createTransactionRequestWallet `json:"wallet"` + ChangeAddress *wh.Address `json:"change_address,omitempty"` + To []receiver `json:"to"` +} + +// createTransactionRequestWallet defines a wallet to spend from and optionally which addresses in the wallet +type createTransactionRequestWallet struct { + ID string `json:"id"` + UxOuts []wh.SHA256 `json:"unspents,omitempty"` + Addresses []wh.Address `json:"addresses,omitempty"` + Password string `json:"password"` +} + +// hoursSelection defines options for hours distribution +type hoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *decimal.Decimal `json:"share_factor,omitempty"` +} + +// receiver specifies a spend destination +type receiver struct { + Address wh.Address `json:"address"` + Coins wh.Coins `json:"coins"` + Hours *wh.Hours `json:"hours,omitempty"` +} + +// Validate validates createTransactionRequest data +func (r createTransactionRequest) Validate() error { + switch r.HoursSelection.Type { + case wallet.HoursSelectionTypeAuto: + for i, to := range r.To { + if to.Hours != nil { + return fmt.Errorf("to[%d].hours must not be specified for auto hours_selection.mode", i) + } + } + + switch r.HoursSelection.Mode { + case wallet.HoursSelectionModeShare: + case "": + return errors.New("missing hours_selection.mode") + default: + return errors.New("invalid hours_selection.mode") + } + + case wallet.HoursSelectionTypeManual: + for i, to := range r.To { + if to.Hours == nil { + return fmt.Errorf("to[%d].hours must be specified for manual hours_selection.mode", i) + } + } + + if r.HoursSelection.Mode != "" { + return errors.New("hours_selection.mode cannot be used for manual hours_selection.type") + } + + case "": + return errors.New("missing hours_selection.type") + default: + return errors.New("invalid hours_selection.type") + } + + if r.HoursSelection.ShareFactor == nil { + if r.HoursSelection.Mode == wallet.HoursSelectionModeShare { + return errors.New("missing hours_selection.share_factor when hours_selection.mode is share") + } + } else { + if r.HoursSelection.Mode != wallet.HoursSelectionModeShare { + return errors.New("hours_selection.share_factor can only be used when hours_selection.mode is share") + } + + switch { + case r.HoursSelection.ShareFactor.LessThan(decimal.New(0, 0)): + return errors.New("hours_selection.share_factor cannot be negative") + case r.HoursSelection.ShareFactor.GreaterThan(decimal.New(1, 0)): + return errors.New("hours_selection.share_factor cannot be more than 1") + } + } + + if r.ChangeAddress != nil && r.ChangeAddress.Null() { + return errors.New("change_address must not be the null address") + } + + if r.Wallet.ID == "" { + return errors.New("missing wallet.id") + } + + addressMap := make(map[cipher.Address]struct{}, len(r.Wallet.Addresses)) + for i, a := range r.Wallet.Addresses { + if a.Null() { + return fmt.Errorf("wallet.addresses[%d] is empty", i) + } + + addressMap[a.Address] = struct{}{} + } + + if len(addressMap) != len(r.Wallet.Addresses) { + return errors.New("wallet.addresses contains duplicate values") + } + + if len(r.To) == 0 { + return errors.New("to is empty") + } + + for i, to := range r.To { + if to.Address.Null() { + return fmt.Errorf("to[%d].address is empty", i) + } + + if to.Coins == 0 { + return fmt.Errorf("to[%d].coins must not be zero", i) + } + + if to.Coins.Value()%visor.MaxDropletDivisor() != 0 { + return fmt.Errorf("to[%d].coins has too many decimal places", i) + } + } + + // Check for duplicate created outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(r.To)) + for _, to := range r.To { + var hours uint64 + if to.Hours != nil { + hours = to.Hours.Value() + } + + outputs[coin.TransactionOutput{ + Address: to.Address.Address, + Coins: to.Coins.Value(), + Hours: hours, + }] = struct{}{} + } + + if len(outputs) != len(r.To) { + return errors.New("to contains duplicate values") + } + + if len(r.Wallet.UxOuts) != 0 && len(r.Wallet.Addresses) != 0 { + return errors.New("wallet.unspents and wallet.addresses cannot be combined") + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(r.Wallet.UxOuts)) + for _, o := range r.Wallet.UxOuts { + uxouts[o.SHA256] = struct{}{} + } + + if len(uxouts) != len(r.Wallet.UxOuts) { + return errors.New("wallet.unspents contains duplicate values") + } + + return nil +} + +// ToWalletParams converts createTransactionRequest to wallet.CreateTransactionParams +func (r createTransactionRequest) ToWalletParams() wallet.CreateTransactionParams { + addresses := make([]cipher.Address, len(r.Wallet.Addresses)) + for i, a := range r.Wallet.Addresses { + addresses[i] = a.Address + } + + uxouts := make([]cipher.SHA256, len(r.Wallet.UxOuts)) + for i, o := range r.Wallet.UxOuts { + uxouts[i] = o.SHA256 + } + + walletParams := wallet.CreateTransactionWalletParams{ + ID: r.Wallet.ID, + Addresses: addresses, + UxOuts: uxouts, + Password: []byte(r.Wallet.Password), + } + + to := make([]coin.TransactionOutput, len(r.To)) + for i, t := range r.To { + var hours uint64 + if t.Hours != nil { + hours = t.Hours.Value() + } + + to[i] = coin.TransactionOutput{ + Address: t.Address.Address, + Coins: t.Coins.Value(), + Hours: hours, + } + } + + var changeAddress *cipher.Address + if r.ChangeAddress != nil { + changeAddress = &r.ChangeAddress.Address + } + + return wallet.CreateTransactionParams{ + IgnoreUnconfirmed: r.IgnoreUnconfirmed, + HoursSelection: wallet.HoursSelection{ + Type: r.HoursSelection.Type, + Mode: r.HoursSelection.Mode, + ShareFactor: r.HoursSelection.ShareFactor, + }, + Wallet: walletParams, + ChangeAddress: changeAddress, + To: to, + } +} + +func createTransactionHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + wh.Error415(w) + return + } + + var params createTransactionRequest + err := json.NewDecoder(r.Body).Decode(¶ms) + if err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + if err := params.Validate(); err != nil { + logger.WithError(err).Error("Invalid create transaction request") + wh.Error400(w, err.Error()) + return + } + + txn, inputs, err := gateway.CreateTransaction(params.ToWalletParams()) + if err != nil { + switch err.(type) { + case wallet.Error: + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, err.Error()) + default: + wh.Error400(w, err.Error()) + } + case blockdb.ErrUnspentNotExist: + wh.Error400(w, err.Error()) + default: + switch err { + case fee.ErrTxnNoFee, + fee.ErrTxnInsufficientCoinHours, + wallet.ErrSpendingUnconfirmed: + wh.Error400(w, err.Error()) + default: + wh.Error500(w, err.Error()) + } + } + return + } + + txnResp, err := NewCreateTransactionResponse(txn, inputs) + if err != nil { + err = fmt.Errorf("NewCreateTransactionResponse failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnResp) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/spend_test.go b/vendor/github.com/skycoin/skycoin/src/api/spend_test.go new file mode 100755 index 0000000..50f08ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/spend_test.go @@ -0,0 +1,904 @@ +package api + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" //http,json helpers + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/wallet" +) + +func TestCreateTransaction(t *testing.T) { + type rawRequestWallet struct { + ID string `json:"id"` + UxOuts []string `json:"unspents,omitempty"` + Addresses []string `json:"addresses,omitempty"` + Password string `json:"password"` + } + + type rawHoursSelection struct { + Type string `json:"type"` + Mode string `json:"mode"` + ShareFactor *string `json:"share_factor,omitempty"` + } + + type rawReceiver struct { + Address string `json:"address"` + Coins string `json:"coins"` + Hours string `json:"hours,omitempty"` + } + + type rawRequest struct { + HoursSelection rawHoursSelection `json:"hours_selection"` + Wallet rawRequestWallet `json:"wallet"` + ChangeAddress string `json:"change_address,omitempty"` + To []rawReceiver `json:"to"` + Password string `json:"password"` + } + + changeAddress := testutil.MakeAddress() + destinationAddress := testutil.MakeAddress() + emptyAddress := cipher.Address{} + + txn := &coin.Transaction{ + Length: 100, + Type: 0, + InnerHash: testutil.RandSHA256(t), + In: []cipher.SHA256{testutil.RandSHA256(t)}, + Out: []coin.TransactionOutput{ + { + Address: destinationAddress, + Coins: 1e6, + Hours: 100, + }, + }, + } + + inputs := []wallet.UxBalance{ + { + Hash: testutil.RandSHA256(t), + Time: uint64(time.Now().UTC().Unix()), + BkSeq: 9999, + SrcTransaction: testutil.RandSHA256(t), + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 200, + InitialHours: 100, + }, + } + + createdTxn, err := NewCreatedTransaction(txn, inputs) + require.NoError(t, err) + + createTxnResponse := &CreateTransactionResponse{ + Transaction: *createdTxn, + EncodedTransaction: hex.EncodeToString(txn.Serialize()), + } + + validBody := &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + } + + walletInput := testutil.RandSHA256(t) + + tt := []struct { + name string + method string + body *rawRequest + status int + err string + gatewayCreateTransactionResult *coin.Transaction + gatewayCreateTransactionInputs []wallet.UxBalance + gatewayCreateTransactionErr error + createTransactionResponse *CreateTransactionResponse + csrfDisabled bool + contentType string + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + + { + name: "415", + method: http.MethodPost, + status: http.StatusUnsupportedMediaType, + contentType: "application/x-www-form-urlencoded", + err: "415 Unsupported Media Type", + }, + + { + name: "400 - missing hours selection type", + method: http.MethodPost, + body: &rawRequest{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.type", + }, + + { + name: "400 - invalid hours selection type", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: "foo", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.type", + }, + + { + name: "400 - missing hours selection mode", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.mode", + }, + + { + name: "400 - invalid hours selection mode", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: "foo", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours_selection.mode", + }, + + { + name: "400 - missing hours selection share factor", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing hours_selection.share_factor when hours_selection.mode is share", + }, + + { + name: "400 - share factor set but mode is not share", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + ShareFactor: newStrPtr("0.5"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor can only be used when hours_selection.mode is share", + }, + + { + name: "400 - negative share factor", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("-1"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be negative", + }, + + { + name: "400 - share factor greater than 1", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("1.1"), + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.share_factor cannot be more than 1", + }, + + { + name: "400 - empty sender address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: rawRequestWallet{ + Addresses: []string{""}, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid base58 string", + }, + + { + name: "400 - invalid sender address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + Wallet: rawRequestWallet{ + Addresses: []string{"xxx"}, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - invalid change address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: "xxx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid address: Invalid address length", + }, + + { + name: "400 - empty change address", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: emptyAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - change_address must not be the null address", + }, + + { + name: "400 - auto type destination has hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Hours: "100", + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must not be specified for auto hours_selection.mode", + }, + + { + name: "400 - manual type destination missing hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].hours must be specified for manual hours_selection.mode", + }, + + { + name: "400 - manual type has mode set", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + Mode: wallet.HoursSelectionModeShare, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + }, + status: http.StatusBadRequest, + err: "400 Bad Request - hours_selection.mode cannot be used for manual hours_selection.type", + }, + + { + name: "400 - missing wallet ID", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{}, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet.id", + }, + + { + name: "400 - wallet address is empty", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{emptyAddress.String()}, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.addresses[0] is empty", + }, + + { + name: "400 - to address is empty", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: emptyAddress.String(), + Coins: "1.01", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].address is empty", + }, + + { + name: "400 - to coins is zero", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins must not be zero", + }, + + { + name: "400 - invalid to coins", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1a", + Hours: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert 0.1a to decimal", + }, + + { + name: "400 - invalid to hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "0.1", + Hours: "100.1", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid hours value: strconv.ParseUint: parsing \"100.1\": invalid syntax", + }, + + { + name: "400 - empty string to coins", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "", + Hours: "", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - can't convert to decimal", + }, + + { + name: "400 - coins has too many decimals", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.1234", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to[0].coins has too many decimal places", + }, + + { + name: "400 - empty to", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to is empty", + }, + + { + name: "400 - manual duplicate outputs", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + Hours: "100", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - auto duplicate outputs", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - to contains duplicate values", + }, + + { + name: "400 - both wallet uxouts and wallet addresses specified", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{destinationAddress.String()}, + UxOuts: []string{walletInput.Hex()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.unspents and wallet.addresses cannot be combined", + }, + + { + name: "400 - duplicate wallet uxouts", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + UxOuts: []string{walletInput.Hex(), walletInput.Hex()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.unspents contains duplicate values", + }, + + { + name: "400 - duplicate wallet addresses", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + Addresses: []string{destinationAddress.String(), destinationAddress.String()}, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "1.2", + }, + }, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet.addresses contains duplicate values", + }, + + { + name: "200 - auto type split even", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeAuto, + Mode: wallet.HoursSelectionModeShare, + ShareFactor: newStrPtr("0.5"), + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type zero hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "0", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours", + method: http.MethodPost, + body: &rawRequest{ + HoursSelection: rawHoursSelection{ + Type: wallet.HoursSelectionTypeManual, + }, + To: []rawReceiver{ + { + Address: destinationAddress.String(), + Coins: "100", + Hours: "10", + }, + }, + ChangeAddress: changeAddress.String(), + Wallet: rawRequestWallet{ + ID: "foo.wlt", + }, + }, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + }, + + { + name: "200 - manual type nonzero hours - csrf disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusOK, + gatewayCreateTransactionResult: txn, + gatewayCreateTransactionInputs: inputs, + createTransactionResponse: createTxnResponse, + csrfDisabled: true, + }, + + { + name: "500 - misc error", + method: http.MethodPost, + body: validBody, + status: http.StatusInternalServerError, + gatewayCreateTransactionErr: errors.New("unhandled error"), + err: "500 Internal Server Error - unhandled error", + }, + + { + name: "400 - no fee", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnNoFee, + err: "400 Bad Request - Transaction has zero coinhour fee", + }, + + { + name: "400 - insufficient coin hours", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: fee.ErrTxnInsufficientCoinHours, + err: "400 Bad Request - Insufficient coinhours for transaction outputs", + }, + + { + name: "400 - uxout doesn't exist", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: blockdb.NewErrUnspentNotExist("foo"), + err: "400 Bad Request - unspent output of foo does not exist", + }, + + { + name: "400 - other wallet error", + method: http.MethodPost, + body: validBody, + status: http.StatusBadRequest, + gatewayCreateTransactionErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + }, + + { + name: "404 - wallet not found", + method: http.MethodPost, + body: validBody, + status: http.StatusNotFound, + gatewayCreateTransactionErr: wallet.ErrWalletNotExist, + err: "404 Not Found - wallet doesn't exist", + }, + + { + name: "403 - wallet API disabled", + method: http.MethodPost, + body: validBody, + status: http.StatusForbidden, + gatewayCreateTransactionErr: wallet.ErrWalletAPIDisabled, + err: "403 Forbidden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsCSPEnabled").Return(false) + + // If the rawRequestBody can be deserialized to CreateTransactionRequest, use it to mock gateway.CreateTransaction + serializedBody, err := json.Marshal(tc.body) + require.NoError(t, err) + var body createTransactionRequest + err = json.Unmarshal(serializedBody, &body) + if err == nil { + gateway.On("CreateTransaction", body.ToWalletParams()).Return(tc.gatewayCreateTransactionResult, tc.gatewayCreateTransactionInputs, tc.gatewayCreateTransactionErr) + } + + endpoint := "/api/v1/wallet/transaction" + + requestJSON, err := json.Marshal(tc.body) + require.NoError(t, err) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBuffer(requestJSON)) + require.NoError(t, err) + + contentType := tc.contentType + if contentType == "" { + contentType = "application/json" + } + + req.Header.Add("Content-Type", contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + } else { + var msg CreateTransactionResponse + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, tc.createTransactionResponse) + require.Equal(t, *tc.createTransactionResponse, msg) + } + }) + } +} + +func newStrPtr(s string) *string { + return &s +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/transaction.go b/vendor/github.com/skycoin/skycoin/src/api/transaction.go new file mode 100755 index 0000000..da578c0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/transaction.go @@ -0,0 +1,471 @@ +package api + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// Returns pending transactions +func getPendingTxns(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txns, err := gateway.GetAllUnconfirmedTxns() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + ret := make([]*visor.ReadableUnconfirmedTxn, 0, len(txns)) + for _, unconfirmedTxn := range txns { + readable, err := visor.NewReadableUnconfirmedTxn(&unconfirmedTxn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + ret = append(ret, readable) + } + + wh.SendJSONOr500(logger, w, &ret) + } +} + +func getTransactionByID(gate Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gate.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + if txn == nil { + wh.Error404(w, "") + return + } + + rbTxn, err := visor.NewReadableTransaction(txn) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + resTxn := daemon.TransactionResult{ + Transaction: *rbTxn, + Status: txn.Status, + Time: txn.Time, + } + wh.SendJSONOr500(logger, w, &resTxn) + } +} + +// Returns transactions that match the filters. +// Method: GET +// URI: /api/v1/transactions +// Args: +// addrs: Comma seperated addresses [optional, returns all transactions if no address provided] +// confirmed: Whether the transactions should be confirmed [optional, must be 0 or 1; if not provided, returns all] +func getTransactions(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + // Gets 'addrs' parameter value + addrs, err := parseAddressesFromStr(r.FormValue("addrs")) + if err != nil { + wh.Error400(w, fmt.Sprintf("parse parameter: 'addrs' failed: %v", err)) + return + } + + // Initialize transaction filters + flts := []visor.TxFilter{visor.AddrsFilter(addrs)} + + // Gets the 'confirmed' parameter value + confirmedStr := r.FormValue("confirmed") + if confirmedStr != "" { + confirmed, err := strconv.ParseBool(confirmedStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid 'confirmed' value: %v", err)) + return + } + + flts = append(flts, visor.ConfirmedTxFilter(confirmed)) + } + + // Gets transactions + txns, err := gateway.GetTransactions(flts...) + if err != nil { + err = fmt.Errorf("gateway.GetTransactions failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // Converts visor.Transaction to daemon.TransactionResult + txnRlts, err := daemon.NewTransactionResults(txns) + if err != nil { + err = fmt.Errorf("daemon.NewTransactionResults failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txnRlts.Txns) + } +} + +// parseAddressesFromStr parses comma seperated addresses string into []cipher.Address +func parseAddressesFromStr(s string) ([]cipher.Address, error) { + addrsStr := splitCommaString(s) + + var addrs []cipher.Address + for _, s := range addrsStr { + a, err := cipher.DecodeBase58Address(s) + if err != nil { + return nil, err + } + + addrs = append(addrs, a) + } + + return addrs, nil +} + +// URI: /api/v1/injectTransaction +// Method: POST +// Content-Type: application/json +// Body: {"rawtx": ""} +// Response: +// 400 - bad transaction +// 503 - network unavailable for broadcasting transaction +// 200 - ok, returns the transaction hash in hex as string +func injectTransaction(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + // get the rawtransaction + v := struct { + Rawtx string `json:"rawtx"` + }{} + + if err := json.NewDecoder(r.Body).Decode(&v); err != nil { + wh.Error400(w, err.Error()) + return + } + + b, err := hex.DecodeString(v.Rawtx) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := coin.TransactionDeserialize(b) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + err = fmt.Errorf("inject tx failed: %v", err) + wh.Error503(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, txn.Hash().Hex()) + } +} + +func resendUnconfirmedTxns(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + rlt, err := gateway.ResendUnconfirmedTxns() + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wh.SendJSONOr500(logger, w, rlt) + return + } +} + +func getRawTxn(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + txid := r.FormValue("txid") + if txid == "" { + wh.Error400(w, "txid is empty") + return + } + + h, err := cipher.SHA256FromHex(txid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + txn, err := gateway.GetTransaction(h) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if txn == nil { + wh.Error404(w, "") + return + } + + d := txn.Txn.Serialize() + wh.SendJSONOr500(logger, w, hex.EncodeToString(d)) + return + } +} + +// VerifyTxnRequest represents the data struct of the request for /api/v2/transaction/verify +type VerifyTxnRequest struct { + EncodedTransaction string `json:"encoded_transaction"` +} + +// VerifyTxnResponse the response data struct for /api/v2/transaction/verify +type VerifyTxnResponse struct { + Confirmed bool `json:"confirmed"` + Transaction CreatedTransaction `json:"transaction"` +} + +func writeHTTPResponse(w http.ResponseWriter, resp HTTPResponse) { + out, err := json.MarshalIndent(resp, "", " ") + if err != nil { + wh.Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if resp.Error == nil { + w.WriteHeader(http.StatusOK) + } else { + if resp.Error.Code < 400 || resp.Error.Code >= 600 { + logger.Critical().Errorf("writeHTTPResponse invalid error status code: %d", resp.Error.Code) + w.WriteHeader(http.StatusInternalServerError) + } else { + w.WriteHeader(resp.Error.Code) + } + } + + if _, err := w.Write(out); err != nil { + logger.WithError(err).Error("http Write failed") + } +} + +// Decode and verify an encoded transaction +// Method: POST +// URI: /api/v2/transaction/verify +func verifyTxnHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + resp := NewHTTPErrorResponse(http.StatusMethodNotAllowed, "") + writeHTTPResponse(w, resp) + return + } + + if r.Header.Get("Content-Type") != "application/json" { + resp := NewHTTPErrorResponse(http.StatusUnsupportedMediaType, "") + writeHTTPResponse(w, resp) + return + } + + var req VerifyTxnRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, err.Error()) + writeHTTPResponse(w, resp) + return + } + + txn, err := decodeTxn(req.EncodedTransaction) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusBadRequest, fmt.Sprintf("decode transaction failed: %v", err)) + writeHTTPResponse(w, resp) + return + } + + var resp HTTPResponse + inputs, isTxnConfirmed, err := gateway.VerifyTxnVerbose(txn) + if err != nil { + switch err.(type) { + case visor.ErrTxnViolatesSoftConstraint, + visor.ErrTxnViolatesHardConstraint, + visor.ErrTxnViolatesUserConstraint: + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: err.Error(), + } + default: + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + } + + verifyTxnResp := VerifyTxnResponse{ + Confirmed: isTxnConfirmed, + } + + if len(inputs) != len(txn.In) { + inputs = nil + } + verboseTxn, err := newCreatedTransactionFuzzy(txn, inputs) + if err != nil { + resp := NewHTTPErrorResponse(http.StatusInternalServerError, err.Error()) + writeHTTPResponse(w, resp) + return + } + + verifyTxnResp.Transaction = *verboseTxn + + resp.Data = verifyTxnResp + + if isTxnConfirmed && resp.Error == nil { + resp.Error = &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "transaction has been spent", + } + } + + writeHTTPResponse(w, resp) + } +} + +func decodeTxn(encodedTxn string) (*coin.Transaction, error) { + var txn coin.Transaction + b, err := hex.DecodeString(encodedTxn) + if err != nil { + return nil, err + } + + txn, err = coin.TransactionDeserialize(b) + if err != nil { + return nil, err + } + + return &txn, nil +} + +// newCreatedTransactionFuzzy creates a CreatedTransaction but accomodates possibly invalid txn input +func newCreatedTransactionFuzzy(txn *coin.Transaction, inputs []wallet.UxBalance) (*CreatedTransaction, error) { + if len(txn.In) != len(inputs) && len(inputs) != 0 { + return nil, errors.New("len(txn.In) != len(inputs)") + } + + var outputHours uint64 + var feeInvalid bool + for _, o := range txn.Out { + var err error + outputHours, err = coin.AddUint64(outputHours, o.Hours) + if err != nil { + feeInvalid = true + } + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = coin.AddUint64(inputHours, i.Hours) + if err != nil { + feeInvalid = true + } + } + + if inputHours < outputHours { + feeInvalid = true + } + + var fee uint64 + if !feeInvalid { + fee = inputHours - outputHours + } + + sigs := make([]string, len(txn.Sigs)) + for i, s := range txn.Sigs { + sigs[i] = s.Hex() + } + + txid := txn.Hash() + out := make([]CreatedTransactionOutput, len(txn.Out)) + for i, o := range txn.Out { + co, err := NewCreatedTransactionOutput(o, txid) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionOutput failed") + continue + } + out[i] = *co + } + + in := make([]CreatedTransactionInput, len(txn.In)) + if len(inputs) == 0 { + for i, h := range txn.In { + in[i] = CreatedTransactionInput{ + UxID: h.Hex(), + } + } + } else { + for i, o := range inputs { + ci, err := NewCreatedTransactionInput(o) + if err != nil { + logger.WithError(err).Error("NewCreatedTransactionInput failed") + continue + } + in[i] = *ci + } + } + + return &CreatedTransaction{ + Length: txn.Length, + Type: txn.Type, + TxID: txid.Hex(), + InnerHash: txn.InnerHash.Hex(), + Fee: fmt.Sprint(fee), + + Sigs: sigs, + In: in, + Out: out, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/transaction_test.go b/vendor/github.com/skycoin/skycoin/src/api/transaction_test.go new file mode 100755 index 0000000..284db49 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/transaction_test.go @@ -0,0 +1,1045 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "math" + + "time" + + "net/url" + + "errors" + + "bytes" + "encoding/hex" + + "github.com/stretchr/testify/mock" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +func createUnconfirmedTxn(t *testing.T) visor.UnconfirmedTxn { + ut := visor.UnconfirmedTxn{} + ut.Txn = coin.Transaction{} + ut.Txn.InnerHash = testutil.RandSHA256(t) + ut.Received = utc.Now().UnixNano() + ut.Checked = ut.Received + ut.Announced = time.Time{}.UnixNano() + return ut +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeTransaction(t *testing.T) coin.Transaction { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(makeAddress(), 5e6, 50) + txn.UpdateHeader() + return txn +} + +func TestGetPendingTxs(t *testing.T) { + invalidTxn := createUnconfirmedTxn(t) + invalidTxn.Txn.Out = append(invalidTxn.Txn.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + + tt := []struct { + name string + method string + url string + status int + err string + getAllUnconfirmedTxnsResponse []visor.UnconfirmedTxn + getAllUnconfirmedTxnsErr error + httpResponse []*visor.ReadableUnconfirmedTxn + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, + }, + { + name: "500 - bad unconfirmedTxn", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Droplet string conversion failed: Value is too large", + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{ + invalidTxn, + }, + }, + { + name: "500 - get unconfirmedTxn error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - GetAllUnconfirmedTxns failed", + getAllUnconfirmedTxnsErr: errors.New("GetAllUnconfirmedTxns failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getAllUnconfirmedTxnsResponse: []visor.UnconfirmedTxn{}, + httpResponse: []*visor.ReadableUnconfirmedTxn{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/pendingTxs" + gateway := NewGatewayerMock() + gateway.On("GetAllUnconfirmedTxns").Return(tc.getAllUnconfirmedTxnsResponse, tc.getAllUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*visor.ReadableUnconfirmedTxn + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetTransactionByID(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionReponse *visor.Transaction + getTransactionError error + httpResponse daemon.TransactionResult + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - empty txid", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{ + txid: "", + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionReponse: &visor.Transaction{}, + httpResponse: daemon.TransactionResult{ + Transaction: visor.ReadableTransaction{ + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/transaction" + gateway := NewGatewayerMock() + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionReponse, tc.getTransactionError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg daemon.TransactionResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestInjectTransaction(t *testing.T) { + validTransaction := makeTransaction(t) + type httpBody struct { + Rawtx string `json:"rawtx"` + } + + validTxnBody := &httpBody{Rawtx: hex.EncodeToString(validTransaction.Serialize())} + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{Rawtx: hex.EncodeToString(testutil.RandBytes(t, 128))} + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + tt := []struct { + name string + method string + status int + err string + httpBody string + injectTransactionArg coin.Transaction + injectTransactionError error + httpResponse string + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + injectTransactionArg: validTransaction, + }, + { + name: "400 - EOF", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - EOF", + }, + { + name: "400 - Invalid transaction: Deserialization failed", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Deserialization failed", + httpBody: `{"wrongKey":"wrongValue"}`, + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: `{"rawtx":"aab"}`, + }, + { + name: "400 - rawtx deserialization error", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid transaction: Deserialization failed", + httpBody: string(invalidTxnBodyJSON), + }, + { + name: "503 - injectTransactionError", + method: http.MethodPost, + status: http.StatusServiceUnavailable, + err: "503 Service Unavailable - inject tx failed: injectTransactionError", + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + injectTransactionError: errors.New("injectTransactionError"), + }, + { + name: "200", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + }, + { + name: "200 - csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + injectTransactionArg: validTransaction, + httpResponse: validTransaction.Hash().Hex(), + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/injectTransaction" + gateway := NewGatewayerMock() + gateway.On("InjectBroadcastTransaction", tc.injectTransactionArg).Return(tc.injectTransactionError) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestResendUnconfirmedTxns(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + httpBody string + resendUnconfirmedTxnsResponse *daemon.ResendResult + resendUnconfirmedTxnsErr error + httpResponse *daemon.ResendResult + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "500 resend failed", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - ResendUnconfirmedTxns failed", + resendUnconfirmedTxnsErr: errors.New("ResendUnconfirmedTxns failed"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + resendUnconfirmedTxnsResponse: &daemon.ResendResult{}, + httpResponse: &daemon.ResendResult{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/resendUnconfirmedTxns" + gateway := NewGatewayerMock() + gateway.On("ResendUnconfirmedTxns").Return(tc.resendUnconfirmedTxnsResponse, tc.resendUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *daemon.ResendResult + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetRawTx(t *testing.T) { + oddHash := "cafcb" + invalidHash := "cabrca" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + type httpBody struct { + txid string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + getTransactionArg cipher.SHA256 + getTransactionResponse *visor.Transaction + getTransactionError error + httpResponse string + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - txid is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - txid is empty", + httpBody: &httpBody{}, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: odd length hex string", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + txid: oddHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - invalid hash: invalid byte: U+0072 'r'", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + txid: invalidHash, + }, + getTransactionArg: testutil.RandSHA256(t), + }, + { + name: "400 - getTransactionError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getTransactionError", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionError: errors.New("getTransactionError"), + }, + { + name: "404", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + txid: validHash, + }, + getTransactionArg: testutil.SHA256FromHex(t, validHash), + getTransactionResponse: &visor.Transaction{}, + httpResponse: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/rawtx" + gateway := NewGatewayerMock() + gateway.On("GetTransaction", tc.getTransactionArg).Return(tc.getTransactionResponse, tc.getTransactionError) + gateway.On("IsCSPEnabled").Return(false) + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.txid != "" { + v.Add("txid", tc.httpBody.txid) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + expectedResponse, err := json.MarshalIndent(tc.httpResponse, "", " ") + require.NoError(t, err) + require.Equal(t, string(expectedResponse), rr.Body.String(), tc.name) + } + }) + } +} + +func TestGetTransactions(t *testing.T) { + invalidAddrsStr := "invalid,addrs" + addrsStr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ,2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE" + var addrs []cipher.Address + for _, item := range []string{"2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE"} { + addr, err := cipher.DecodeBase58Address(item) + require.NoError(t, err) + addrs = append(addrs, addr) + } + invalidTxn := makeTransaction(t) + invalidTxn.Out = append(invalidTxn.Out, coin.TransactionOutput{ + Coins: math.MaxInt64 + 1, + }) + type httpBody struct { + addrs string + confirmed string + } + + tt := []struct { + name string + method string + status int + err string + httpBody *httpBody + getTransactionsArg []visor.TxFilter + getTransactionsResponse []visor.Transaction + getTransactionsError error + httpResponse []visor.Transaction + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid `addrs` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - parse parameter: 'addrs' failed: Invalid base58 character", + httpBody: &httpBody{ + addrs: invalidAddrsStr, + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + }, + }, + { + name: "400 - invalid `confirmed` param", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid 'confirmed' value: strconv.ParseBool: parsing \"invalidConfirmed\": invalid syntax", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "invalidConfirmed", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + }, + }, + { + name: "500 - getTransactionsError", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetTransactions failed: getTransactionsError", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsError: errors.New("getTransactionsError"), + }, + { + name: "500 - daemon.NewTransactionResults error", + method: http.MethodGet, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - daemon.NewTransactionResults failed: Droplet string conversion failed: Value is too large", + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{ + { + Txn: invalidTxn, + Status: visor.TransactionStatus{ + Confirmed: true, + Height: 103, + }, + }, + }, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + addrs: addrsStr, + confirmed: "true", + }, + getTransactionsArg: []visor.TxFilter{ + visor.AddrsFilter(addrs), + visor.ConfirmedTxFilter(true), + }, + getTransactionsResponse: []visor.Transaction{}, + httpResponse: []visor.Transaction{}, + }, + } + + for _, tc := range tt { + endpoint := "/api/v1/transactions" + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("GetTransactions", mock.Anything).Return(tc.getTransactionsResponse, tc.getTransactionsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.addrs != "" { + v.Add("addrs", tc.httpBody.addrs) + } + if tc.httpBody.confirmed != "" { + v.Add("confirmed", tc.httpBody.confirmed) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []visor.Transaction + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +type transactionAndInputs struct { + txn coin.Transaction + inputs []wallet.UxBalance +} + +func newVerifyTxnResponseJSON(t *testing.T, txn *coin.Transaction, inputs []wallet.UxBalance, isTxnConfirmed bool) VerifyTxnResponse { + ctxn, err := newCreatedTransactionFuzzy(txn, inputs) + require.NoError(t, err) + return VerifyTxnResponse{ + Transaction: *ctxn, + Confirmed: isTxnConfirmed, + } +} + +func prepareTxnAndInputs(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(makeAddress(), 5e6, 50) + txn.UpdateHeader() + + input, err := wallet.NewUxBalance(uint64(utc.UnixNow()), ux) + require.NoError(t, err) + + return transactionAndInputs{txn: txn, inputs: []wallet.UxBalance{input}} +} + +func makeTransactionWithEmptyAddressOutput(t *testing.T) transactionAndInputs { + txn := coin.Transaction{} + ux, s := makeUxOutWithSecret(t) + + txn.PushInput(ux.Hash()) + txn.SignInputs([]cipher.SecKey{s}) + txn.PushOutput(makeAddress(), 1e6, 50) + txn.PushOutput(cipher.Address{}, 5e6, 50) + txn.UpdateHeader() + + input, err := wallet.NewUxBalance(uint64(utc.UnixNow()), ux) + require.NoError(t, err) + + return transactionAndInputs{txn: txn, inputs: []wallet.UxBalance{input}} +} + +func TestVerifyTransaction(t *testing.T) { + txnAndInputs := prepareTxnAndInputs(t) + type httpBody struct { + EncodedTransaction string `json:"encoded_transaction"` + } + + validTxnBody := &httpBody{EncodedTransaction: hex.EncodeToString(txnAndInputs.txn.Serialize())} + validTxnBodyJSON, err := json.Marshal(validTxnBody) + require.NoError(t, err) + + b := &httpBody{EncodedTransaction: hex.EncodeToString(testutil.RandBytes(t, 128))} + invalidTxnBodyJSON, err := json.Marshal(b) + require.NoError(t, err) + + invalidTxnEmptyAddress := makeTransactionWithEmptyAddressOutput(t) + invalidTxnEmptyAddressBody := &httpBody{ + EncodedTransaction: hex.EncodeToString(invalidTxnEmptyAddress.txn.Serialize()), + } + invalidTxnEmptyAddressBodyJSON, err := json.Marshal(invalidTxnEmptyAddressBody) + require.NoError(t, err) + + type verifyTxnVerboseResult struct { + Uxouts []wallet.UxBalance + IsTxnConfirmed bool + Err error + } + + tt := []struct { + name string + method string + contentType string + status int + err string + httpBody string + gatewayVerifyTxnVerboseArg coin.Transaction + gatewayVerifyTxnVerboseResult verifyTxnVerboseResult + httpResponse HTTPResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + httpResponse: NewHTTPErrorResponse(http.StatusMethodNotAllowed, ""), + }, + { + name: "400 - EOF", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "EOF"), + }, + { + name: "415 - Unsupported Media Type", + method: http.MethodPost, + contentType: "", + status: http.StatusUnsupportedMediaType, + httpResponse: NewHTTPErrorResponse(http.StatusUnsupportedMediaType, ""), + }, + { + name: "400 - Invalid transaction: Deserialization failed", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: `{"wrongKey":"wrongValue"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Deserialization failed"), + }, + { + name: "400 - encoding/hex: odd length hex string", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: `{"encoded_transaction":"aab"}`, + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: encoding/hex: odd length hex string"), + }, + { + name: "400 - deserialization error", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusBadRequest, + httpBody: string(invalidTxnBodyJSON), + httpResponse: NewHTTPErrorResponse(http.StatusBadRequest, "decode transaction failed: Invalid transaction: Deserialization failed"), + }, + { + name: "422 - txn sends to empty address", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusUnprocessableEntity, + httpBody: string(invalidTxnEmptyAddressBodyJSON), + gatewayVerifyTxnVerboseArg: invalidTxnEmptyAddress.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: invalidTxnEmptyAddress.inputs, + Err: visor.NewErrTxnViolatesUserConstraint(errors.New("Transaction.Out contains an output sending to an empty address")), + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &invalidTxnEmptyAddress.txn, invalidTxnEmptyAddress.inputs, false), + Error: &HTTPError{ + Code: http.StatusUnprocessableEntity, + Message: "Transaction violates user constraint: Transaction.Out contains an output sending to an empty address", + }, + }, + }, + { + name: "500 - internal server error", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusInternalServerError, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Err: errors.New("verify transaction failed"), + }, + httpResponse: NewHTTPErrorResponse(http.StatusInternalServerError, "verify transaction failed"), + }, + { + name: "422 - txn is confirmed", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusUnprocessableEntity, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + IsTxnConfirmed: true, + }, + httpResponse: HTTPResponse{ + Error: &HTTPError{ + Message: "transaction has been spent", + Code: http.StatusUnprocessableEntity, + }, + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, true), + }, + }, + { + name: "200", + method: http.MethodPost, + contentType: "application/json", + status: http.StatusOK, + httpBody: string(validTxnBodyJSON), + gatewayVerifyTxnVerboseArg: txnAndInputs.txn, + gatewayVerifyTxnVerboseResult: verifyTxnVerboseResult{ + Uxouts: txnAndInputs.inputs, + }, + httpResponse: HTTPResponse{ + Data: newVerifyTxnResponseJSON(t, &txnAndInputs.txn, txnAndInputs.inputs, false), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v2/transaction/verify" + gateway := NewGatewayerMock() + gateway.On("VerifyTxnVerbose", &tc.gatewayVerifyTxnVerboseArg).Return(tc.gatewayVerifyTxnVerboseResult.Uxouts, + tc.gatewayVerifyTxnVerboseResult.IsTxnConfirmed, tc.gatewayVerifyTxnVerboseResult.Err) + gateway.On("IsCSPEnabled").Return(false) + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(tc.httpBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", tc.contentType) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + var rsp ReceivedHTTPResponse + err = json.NewDecoder(rr.Body).Decode(&rsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Error, rsp.Error) + + if rsp.Data == nil { + require.Nil(t, tc.httpResponse.Data) + } else { + require.NotNil(t, tc.httpResponse.Data) + + var txnRsp VerifyTxnResponse + err := json.Unmarshal(rsp.Data, &txnRsp) + require.NoError(t, err) + + require.Equal(t, tc.httpResponse.Data.(VerifyTxnResponse), txnRsp) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/uxout.go b/vendor/github.com/skycoin/skycoin/src/api/uxout.go new file mode 100755 index 0000000..e6819f9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/uxout.go @@ -0,0 +1,77 @@ +package api + +import ( + "net/http" + + "github.com/skycoin/skycoin/src/cipher" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func getUxOutByID(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + uxid := r.FormValue("uxid") + if uxid == "" { + wh.Error400(w, "uxid is empty") + return + } + + id, err := cipher.SHA256FromHex(uxid) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxout, err := gateway.GetUxOutByID(id) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + if uxout == nil { + wh.Error404(w, "") + return + } + + wh.SendJSONOr500(logger, w, historydb.NewUxOutJSON(uxout)) + } +} + +func getAddrUxOuts(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + addr := r.FormValue("address") + if addr == "" { + wh.Error400(w, "address is empty") + return + } + + cipherAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + uxs, err := gateway.GetAddrUxOuts([]cipher.Address{cipherAddr}) + if err != nil { + wh.Error400(w, err.Error()) + return + } + + //Convert slice UxOut to slice of UxOutJson + uxsJSON := make([]*historydb.UxOutJSON, len(uxs)) + for i, ux := range uxs { + uxsJSON[i] = historydb.NewUxOutJSON(ux) + } + + wh.SendJSONOr500(logger, w, uxsJSON) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/uxout_test.go b/vendor/github.com/skycoin/skycoin/src/api/uxout_test.go new file mode 100755 index 0000000..3c8bd26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/uxout_test.go @@ -0,0 +1,282 @@ +package api + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "testing" + + "errors" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func TestGetUxOutByID(t *testing.T) { + invalidHash := "carccb" + oddHash := "caccb" + validHash := "79216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b" + + type httpBody struct { + uxid string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + uxid string + getGetUxOutByIDArg cipher.SHA256 + getGetUxOutByIDResponse *historydb.UxOut + getGetUxOutByIDError error + httpResponse *historydb.UxOutJSON + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - empty uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - uxid is empty", + httpBody: &httpBody{ + uxid: "", + }, + }, + { + name: "400 - odd length uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: odd length hex string", + httpBody: &httpBody{ + uxid: oddHash, + }, + uxid: oddHash, + }, + { + name: "400 - invalid uxin value", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - encoding/hex: invalid byte: U+0072 'r'", + httpBody: &httpBody{ + uxid: invalidHash, + }, + uxid: invalidHash, + }, + { + name: "400 - getGetUxOutByIDError", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getGetUxOutByIDError", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDError: errors.New("getGetUxOutByIDError"), + }, + { + name: "404 - uxout == nil", + method: http.MethodGet, + status: http.StatusNotFound, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + err: "404 Not Found", + httpBody: &httpBody{ + uxid: validHash, + }, + uxid: validHash, + getGetUxOutByIDArg: testutil.SHA256FromHex(t, validHash), + getGetUxOutByIDResponse: &historydb.UxOut{}, + httpResponse: historydb.NewUxOutJSON(&historydb.UxOut{}), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + endpoint := "/api/v1/uxout" + gateway.On("GetUxOutByID", tc.getGetUxOutByIDArg).Return(tc.getGetUxOutByIDResponse, tc.getGetUxOutByIDError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.uxid != "" { + v.Add("uxid", tc.httpBody.uxid) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg *historydb.UxOutJSON + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} + +func TestGetAddrUxOuts(t *testing.T) { + addressForGwError := testutil.MakeAddress() + addressForGwResponse := testutil.MakeAddress() + type httpBody struct { + address string + } + + tt := []struct { + name string + method string + url string + status int + err string + httpBody *httpBody + getAddrUxOutsArg []cipher.Address + getAddrUxOutsResponse []*historydb.UxOut + getAddrUxOutsError error + httpResponse []*historydb.UxOutJSON + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - address is empty", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - address is empty", + httpBody: &httpBody{ + address: "", + }, + }, + { + name: "400 - cipher.DecodeBase58Address error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - Invalid address length", + httpBody: &httpBody{ + address: "abcd", + }, + }, + { + name: "400 - gateway.GetAddrUxOuts error", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - getAddrUxOutsError", + httpBody: &httpBody{ + address: addressForGwError.String(), + }, + getAddrUxOutsArg: []cipher.Address{addressForGwError}, + getAddrUxOutsError: errors.New("getAddrUxOutsError"), + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + httpBody: &httpBody{ + address: addressForGwResponse.String(), + }, + getAddrUxOutsArg: []cipher.Address{addressForGwResponse}, + getAddrUxOutsResponse: []*historydb.UxOut{}, + httpResponse: []*historydb.UxOutJSON{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + endpoint := "/api/v1/address_uxouts" + gateway := NewGatewayerMock() + gateway.On("GetAddrUxOuts", tc.getAddrUxOutsArg).Return(tc.getAddrUxOutsResponse, tc.getAddrUxOutsError) + gateway.On("IsCSPEnabled").Return(false) + + v := url.Values{} + if tc.httpBody != nil { + if tc.httpBody.address != "" { + v.Add("address", tc.httpBody.address) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + rr := httptest.NewRecorder() + handler := newServerMux(muxConfig{host: configuredHost, appLoc: "."}, gateway, csrfStore, nil) + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*historydb.UxOutJSON + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/wallet.go b/vendor/github.com/skycoin/skycoin/src/api/wallet.go new file mode 100755 index 0000000..5bd16e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/wallet.go @@ -0,0 +1,919 @@ +package api + +// APIs for wallet-related information + +import ( + "fmt" + "net/http" + "sort" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/go-bip39" + + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/util/fee" + wh "github.com/skycoin/skycoin/src/util/http" //http,json helpers +) + +// HTTP401AuthHeader WWW-Authenticate value +const HTTP401AuthHeader = "SkycoinWallet" + +// SpendResult represents the result of spending +type SpendResult struct { + Balance *wallet.BalancePair `json:"balance,omitempty"` + Transaction *visor.ReadableTransaction `json:"txn,omitempty"` + Error string `json:"error,omitempty"` +} + +// UnconfirmedTxnsResponse contains unconfirmed transaction data +type UnconfirmedTxnsResponse struct { + Transactions []visor.ReadableUnconfirmedTxn `json:"transactions"` +} + +// WalletEntry the wallet entry struct +type WalletEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` +} + +// WalletMeta the wallet meta struct +type WalletMeta struct { + Coin string `json:"coin"` + Filename string `json:"filename"` + Label string `json:"label"` + Type string `json:"type"` + Version string `json:"version"` + CryptoType string `json:"crypto_type"` + Timestamp int64 `json:"timestamp"` + Encrypted bool `json:"encrypted"` +} + +// WalletResponse wallet response struct for http apis +type WalletResponse struct { + Meta WalletMeta `json:"meta"` + Entries []WalletEntry `json:"entries"` +} + +// BalanceResponse address balance summary struct +type BalanceResponse struct { + wallet.BalancePair + Addresses wallet.AddressBalance `json:"addresses"` +} + +// NewWalletResponse creates WalletResponse struct from *wallet.Wallet +func NewWalletResponse(w *wallet.Wallet) (*WalletResponse, error) { + var wr WalletResponse + + wr.Meta.Coin = w.Meta["coin"] + wr.Meta.Filename = w.Meta["filename"] + wr.Meta.Label = w.Meta["label"] + wr.Meta.Type = w.Meta["type"] + wr.Meta.Version = w.Meta["version"] + wr.Meta.CryptoType = w.Meta["cryptoType"] + + // Converts "encrypted" string to boolean if any + if encryptedStr, ok := w.Meta["encrypted"]; ok { + encrypted, err := strconv.ParseBool(encryptedStr) + if err != nil { + return nil, err + } + wr.Meta.Encrypted = encrypted + } + + if tmStr, ok := w.Meta["tm"]; ok { + // Converts "tm" string to integer timestamp. + tm, err := strconv.ParseInt(tmStr, 10, 64) + if err != nil { + return nil, err + } + wr.Meta.Timestamp = tm + } + + for _, e := range w.Entries { + wr.Entries = append(wr.Entries, WalletEntry{ + Address: e.Address.String(), + Public: e.Public.Hex(), + }) + } + + return &wr, nil +} + +// Returns the wallet's balance, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/wallet/balance +// Method: GET +// Args: +// id: wallet id [required] +func walletBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + walletBalance, addressBalances, err := gateway.GetWalletBalance(wltID) + if err != nil { + logger.Errorf("Get wallet balance failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + break + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + break + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: walletBalance, + Addresses: addressBalances, + }) + } +} + +// Returns the balance of one or more addresses, both confirmed and predicted. The predicted +// balance is the confirmed balance minus the pending spends. +// URI: /api/v1/balance +// Method: GET +// Args: +// addrs: command separated list of addresses [required] +func getBalanceHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addrsParam := r.FormValue("addrs") + addrsStr := splitCommaString(addrsParam) + + addrs := make([]cipher.Address, 0, len(addrsStr)) + for _, addr := range addrsStr { + a, err := cipher.DecodeBase58Address(addr) + if err != nil { + wh.Error400(w, fmt.Sprintf("address %s is invalid: %v", addr, err)) + return + } + addrs = append(addrs, a) + } + + if len(addrs) == 0 { + wh.Error400(w, "addrs is required") + return + } + + bals, err := gateway.GetBalanceOfAddrs(addrs) + if err != nil { + err = fmt.Errorf("gateway.GetBalanceOfAddrs failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + // create map of address to balance + addressBalances := make(wallet.AddressBalance, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = bals[idx] + } + + var balance wallet.BalancePair + for _, bal := range bals { + var err error + balance.Confirmed, err = balance.Confirmed.Add(bal.Confirmed) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + balance.Predicted, err = balance.Predicted.Add(bal.Predicted) + if err != nil { + wh.Error500(w, err.Error()) + return + } + } + + wh.SendJSONOr500(logger, w, BalanceResponse{ + BalancePair: balance, + Addresses: addressBalances, + }) + } +} + +// Creates and broadcasts a transaction sending money from one of our wallets +// to destination address. +// URI: /api/v1/wallet/spend +// Method: POST +// Args: +// id: wallet id +// dst: recipient address +// coins: the number of droplet you will send +// password: wallet password +// Response: +// balance: new balance of the wallet +// txn: spent transaction +// error: an error that may have occured after broadcast the transaction to the network +// if this field is not empty, the spend succeeded, but the response data could not be prepared +func walletSpendHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + sdst := r.FormValue("dst") + if sdst == "" { + wh.Error400(w, "missing destination address \"dst\"") + return + } + dst, err := cipher.DecodeBase58Address(sdst) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid destination address: %v", err)) + return + } + + scoins := r.FormValue("coins") + coins, err := strconv.ParseUint(scoins, 10, 64) + if err != nil { + wh.Error400(w, `invalid "coins" value`) + return + } + + if coins <= 0 { + wh.Error400(w, `invalid "coins" value, must > 0`) + return + } + + tx, err := gateway.Spend(wltID, []byte(r.FormValue("password")), coins, dst) + switch err { + case nil: + case fee.ErrTxnNoFee, + wallet.ErrSpendingUnconfirmed, + wallet.ErrInsufficientBalance, + wallet.ErrWalletNotEncrypted, + wallet.ErrMissingPassword, + wallet.ErrWalletEncrypted: + wh.Error400(w, err.Error()) + return + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + return + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + return + default: + wh.Error500(w, err.Error()) + return + } + + txStr, err := visor.TransactionToJSON(*tx) + if err != nil { + logger.Error(err) + wh.SendJSONOr500(logger, w, SpendResult{ + Error: err.Error(), + }) + return + } + + logger.Infof("Spend: \ntx= \n %s \n", txStr) + + var ret SpendResult + + ret.Transaction, err = visor.NewReadableTransaction(&visor.Transaction{Txn: *tx}) + if err != nil { + err = fmt.Errorf("Creation of new readable transaction failed: %v", err) + logger.Error(err) + ret.Error = err.Error() + wh.SendJSONOr500(logger, w, ret) + return + } + + // Get the new wallet balance + walletBalance, _, err := gateway.GetWalletBalance(wltID) + if err != nil { + err = fmt.Errorf("Get wallet balance failed: %v", err) + logger.Error(err) + ret.Error = err.Error() + wh.SendJSONOr500(logger, w, ret) + return + } + ret.Balance = &walletBalance + + wh.SendJSONOr500(logger, w, ret) + } +} + +// Loads wallet from seed, will scan ahead N address and +// load addresses till the last one that have coins. +// Method: POST +// Args: +// seed: wallet seed [required] +// label: wallet label [required] +// scan: the number of addresses to scan ahead for balances [optional, must be > 0] +// encrypt: bool value, whether encrypt the wallet [optional] +// password: password for encrypting wallet [optional, must be provided if "encrypt" is set] +func walletCreate(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + seed := r.FormValue("seed") + if seed == "" { + wh.Error400(w, "missing seed") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + var encrypt bool + encryptStr := r.FormValue("encrypt") + if encryptStr != "" { + var err error + encrypt, err = strconv.ParseBool(encryptStr) + if err != nil { + wh.Error400(w, fmt.Sprintf("invalid encrypt value: %v", err)) + return + } + } + + if encrypt && len(password) == 0 { + wh.Error400(w, "missing password") + return + } + + if !encrypt && len(password) > 0 { + wh.Error400(w, "encrypt must be true as password is provided") + return + } + + scanNStr := r.FormValue("scan") + var scanN uint64 = 1 + if scanNStr != "" { + var err error + scanN, err = strconv.ParseUint(scanNStr, 10, 64) + if err != nil { + wh.Error400(w, "invalid scan value") + return + } + } + + if scanN == 0 { + wh.Error400(w, "scan must be > 0") + return + } + + wlt, err := gateway.CreateWallet("", wallet.Options{ + Seed: seed, + Label: label, + Encrypt: encrypt, + Password: []byte(password), + ScanN: scanN, + }) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + return + default: + wh.Error400(w, err.Error()) + return + } + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Genreates new addresses +// URI: /api/v1/wallet/newAddress +// Method: POST +// Args: +// id: wallet id [required] +// num: number of address need to create [optional, if not set the default value is 1] +// password: wallet password [optional, must be provided if the wallet is encrypted] +func walletNewAddresses(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + // the number of address that need to create, default is 1 + var n uint64 = 1 + var err error + num := r.FormValue("num") + if num != "" { + n, err = strconv.ParseUint(num, 10, 64) + if err != nil { + wh.Error400(w, "invalid num value") + return + } + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + addrs, err := gateway.NewAddresses(wltID, []byte(password), n) + if err != nil { + switch err { + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + + var rlt = struct { + Addresses []string `json:"addresses"` + }{} + + for _, a := range addrs { + rlt.Addresses = append(rlt.Addresses, a.String()) + } + + wh.SendJSONOr500(logger, w, rlt) + return + } +} + +// Update wallet label +// URI: /api/v1/wallet/update +// Method: POST +// Args: +// id: wallet id [required] +// label: the label the wallet will be updated to [required] +func walletUpdateHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + // Update wallet + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + label := r.FormValue("label") + if label == "" { + wh.Error400(w, "missing label") + return + } + + if err := gateway.UpdateWalletLabel(wltID, label); err != nil { + logger.Errorf("update wallet label failed: %v", err) + + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wh.SendJSONOr500(logger, w, "success") + } +} + +// Returns a wallet by id +// URI: /api/v1/wallet +// Method: GET +// Args: +// id: wallet id [required] +func walletGet(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, fmt.Sprintf("missing wallet id")) + return + } + + wlt, err := gateway.GetWallet(wltID) + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error400(w, err.Error()) + } + return + } + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Returns JSON of unconfirmed transactions for user's wallet +// URI: /api/v1/wallet/transactions +// Method: GET +// Args: +// id: wallet id [required] +func walletTransactionsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wltID := r.FormValue("id") + if wltID == "" { + wh.Error400(w, "missing wallet id") + return + } + + txns, err := gateway.GetWalletUnconfirmedTxns(wltID) + if err != nil { + logger.Errorf("get wallet unconfirmed transactions failed: %v", err) + switch err { + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + unconfirmedTxns, err := visor.NewReadableUnconfirmedTxns(txns) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + unconfirmedTxnResp := UnconfirmedTxnsResponse{ + Transactions: unconfirmedTxns, + } + wh.SendJSONOr500(logger, w, unconfirmedTxnResp) + } +} + +// Returns all loaded wallets +// URI: /api/v1/wallets +// Method: GET +func walletsHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + wlts, err := gateway.GetWallets() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + wrs := make([]*WalletResponse, 0, len(wlts)) + for _, wlt := range wlts { + wr, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + + wrs = append(wrs, wr) + } + + sort.Slice(wrs, func(i, j int) bool { + return wrs[i].Meta.Timestamp < wrs[j].Meta.Timestamp + }) + + wh.SendJSONOr500(logger, w, wrs) + } +} + +// WalletFolder struct +type WalletFolder struct { + Address string `json:"address"` +} + +// Returns the wallet directory path +// URI: /api/v1/wallets/folderName +// Method: GET +func getWalletFolder(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + addr, err := gateway.GetWalletDir() + if err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + ret := WalletFolder{ + Address: addr, + } + wh.SendJSONOr500(logger, w, ret) + } +} + +// Generates wallet seed +// URI: /api/v1/wallet/newSeed +// Method: GET +// Args: +// entropy: entropy bitsize [optional, default value of 128 will be used if not set] +func newWalletSeed(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet { + wh.Error405(w) + return + } + + if !gateway.IsWalletAPIEnabled() { + wh.Error403(w, "") + return + } + + entropyValue := r.FormValue("entropy") + if entropyValue == "" { + entropyValue = "128" + } + + entropyBits, err := strconv.Atoi(entropyValue) + if err != nil { + wh.Error400(w, "invalid entropy") + return + } + + // Entropy bit size can either be 128 or 256 + if entropyBits != 128 && entropyBits != 256 { + wh.Error400(w, "entropy length must be 128 or 256") + return + } + + entropy, err := bip39.NewEntropy(entropyBits) + if err != nil { + err = fmt.Errorf("bip39.NewEntropy failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + err = fmt.Errorf("bip39.NewDefaultMnemonic failed: %v", err) + wh.Error500(w, err.Error()) + return + } + + var rlt = struct { + Seed string `json:"seed"` + }{ + mnemonic, + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Returns seed of wallet of given id +// URI: /api/v1/wallet/seed +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletSeedHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + seed, err := gateway.GetWalletSeed(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled, wallet.ErrSeedAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + v := struct { + Seed string `json:"seed"` + }{ + Seed: seed, + } + + wh.SendJSONOr500(logger, w, v) + } +} + +// Unloads wallet from the wallet service +// URI: /api/v1/wallet/unload +// Method: POST +// Args: +// id: wallet id +func walletUnloadHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + if err := gateway.UnloadWallet(id); err != nil { + switch err { + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + default: + wh.Error500(w, err.Error()) + } + } + } +} + +// Encrypts wallet +// URI: /api/v1/wallet/encrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletEncryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.EncryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrWalletEncrypted, wallet.ErrMissingPassword: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + // Make sure the sensitive data are wiped + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} + +// Decrypts wallet +// URI: /api/v1/wallet/decrypt +// Method: POST +// Args: +// id: wallet id +// password: wallet password +func walletDecryptHandler(gateway Gatewayer) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + wh.Error405(w) + return + } + + id := r.FormValue("id") + if id == "" { + wh.Error400(w, "missing wallet id") + return + } + + password := r.FormValue("password") + defer func() { + password = "" + }() + + wlt, err := gateway.DecryptWallet(id, []byte(password)) + if err != nil { + switch err { + case wallet.ErrMissingPassword, wallet.ErrWalletNotEncrypted: + wh.Error400(w, err.Error()) + case wallet.ErrInvalidPassword: + wh.Error401(w, HTTP401AuthHeader, err.Error()) + case wallet.ErrWalletAPIDisabled: + wh.Error403(w, "") + case wallet.ErrWalletNotExist: + wh.Error404(w, "") + default: + wh.Error500(w, err.Error()) + } + return + } + + rlt, err := NewWalletResponse(wlt) + if err != nil { + wh.Error500(w, err.Error()) + return + } + wh.SendJSONOr500(logger, w, rlt) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/wallet_test.go b/vendor/github.com/skycoin/skycoin/src/api/wallet_test.go new file mode 100755 index 0000000..fde88df --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/wallet_test.go @@ -0,0 +1,2558 @@ +package api + +import ( + "bytes" + "errors" + "net/http" + "net/http/httptest" + "net/url" + "strconv" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +const configuredHost = "127.0.0.1:6420" + +var mxConfig = muxConfig{host: configuredHost, appLoc: "."} + +func TestWalletSpendHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + Password string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + coins uint64 + dst string + password string + gatewaySpendResult *coin.Transaction + gatewaySpendErr error + gatewayGetWalletBalanceResult BalanceResponse + gatewayBalanceErr error + spendResult *SpendResult + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "400 - no dst", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing destination address \"dst\"", + walletID: "0", + }, + { + name: "400 - bad dst addr", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: " 2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid destination address: Invalid base58 character", + walletID: "0", + }, + { + name: "400 - no coins", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - coins is string", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - coins is negative value", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "-123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value", + walletID: "0", + }, + { + name: "400 - zero coins", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid \"coins\" value, must > 0", + walletID: "0", + }, + { + name: "400 - gw spend error txn no fee", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - Transaction has zero coinhour fee", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: fee.ErrTxnNoFee, + spendResult: &SpendResult{ + Error: fee.ErrTxnNoFee.Error(), + }, + }, + { + name: "400 - gw spend error spending unconfirmed", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - please spend after your pending transaction is confirmed", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrSpendingUnconfirmed, + spendResult: &SpendResult{ + Error: wallet.ErrSpendingUnconfirmed.Error(), + }, + }, + { + name: "400 - gw spend error insufficient balance", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - balance is not sufficient", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrInsufficientBalance, + spendResult: &SpendResult{ + Error: wallet.ErrInsufficientBalance.Error(), + }, + }, + { + name: "404 - gw spend error wallet not exist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrWalletNotExist, + spendResult: &SpendResult{ + Error: wallet.ErrWalletNotExist.Error(), + }, + }, + { + name: "500 - gw spend error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - Spend error", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: errors.New("Spend error"), + spendResult: &SpendResult{ + Error: "Spend error", + }, + }, + { + name: "200 - gw GetWalletBalance error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + gatewayBalanceErr: errors.New("GetWalletBalance error"), + spendResult: &SpendResult{ + Error: "Get wallet balance failed: GetWalletBalance error", + Transaction: &visor.ReadableTransaction{ + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + }, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "123", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "123", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendErr: wallet.ErrWalletAPIDisabled, + spendResult: &SpendResult{ + Error: wallet.ErrWalletAPIDisabled.Error(), + }, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + spendResult: &SpendResult{ + Balance: &wallet.BalancePair{}, + Transaction: &visor.ReadableTransaction{ + Length: 0, + Type: 0, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Timestamp: 0, + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + }, + }, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "1234", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "12", + }, + status: http.StatusOK, + walletID: "1234", + coins: 12, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + gatewaySpendResult: &coin.Transaction{}, + spendResult: &SpendResult{ + Balance: &wallet.BalancePair{}, + Transaction: &visor.ReadableTransaction{ + Length: 0, + Type: 0, + Hash: "78877fa898f0b4c45c9c33ae941e40617ad7c8657a307db62bc5691f92f4f60e", + InnerHash: "0000000000000000000000000000000000000000000000000000000000000000", + Timestamp: 0, + Sigs: []string{}, + In: []string{}, + Out: []visor.ReadableTransactionOutput{}, + }, + }, + csrfDisabled: true, + }, + { + name: "400 - missing password", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + }, + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrMissingPassword, + err: "400 Bad Request - missing password", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrMissingPassword.Error(), + }, + }, + { + name: "401 Unauthorized - invalid password", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + Password: "pwd", + }, + password: "pwd", + status: http.StatusUnauthorized, + gatewaySpendErr: wallet.ErrInvalidPassword, + err: "401 Unauthorized - invalid password", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrInvalidPassword.Error(), + }, + }, + { + name: "400 - wallet is encrypted", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + }, + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrWalletEncrypted, + err: "400 Bad Request - wallet is encrypted", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrWalletEncrypted.Error(), + }, + }, + { + name: "400 - wallet is not encrypted", + method: http.MethodPost, + body: &httpBody{ + WalletID: "wallet.wlt", + Dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + Coins: "1", + Password: "pwd", + }, + password: "pwd", + status: http.StatusBadRequest, + gatewaySpendErr: wallet.ErrWalletNotEncrypted, + err: "400 Bad Request - wallet is not encrypted", + walletID: "wallet.wlt", + coins: 1, + dst: "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ", + spendResult: &SpendResult{ + Error: wallet.ErrWalletNotEncrypted.Error(), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + if tc.gatewaySpendResult == nil { + tc.gatewaySpendResult = &coin.Transaction{} + } + + gateway := &GatewayerMock{} + addr, _ := cipher.DecodeBase58Address(tc.dst) + gateway.On("Spend", tc.walletID, []byte(tc.password), tc.coins, addr).Return(tc.gatewaySpendResult, tc.gatewaySpendErr) + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/spend" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Dst != "" { + v.Add("dst", tc.body.Dst) + } + if tc.body.Coins != "" { + v.Add("coins", tc.body.Coins) + } + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var msg SpendResult + err := json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, *tc.spendResult, msg) + } + }) + } +} + +func TestWalletGet(t *testing.T) { + entries, resEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + url string + body *httpBody + status int + err string + walletID string + gatewayGetWalletResult wallet.Wallet + responseBody WalletResponse + gatewayGetWalletErr error + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "", + }, + { + name: "400 - error from the `gateway.GetWallet(wltID)`", + method: http.MethodGet, + body: &httpBody{ + WalletID: "123", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - wallet 123 doesn't exist", + walletID: "123", + gatewayGetWalletErr: errors.New("wallet 123 doesn't exist"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "1234", + gatewayGetWalletResult: wallet.Wallet{ + Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, + Entries: []wallet.Entry{}, + }, + gatewayGetWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "1234", + }, + status: http.StatusOK, + walletID: "1234", + gatewayGetWalletResult: wallet.Wallet{ + Meta: map[string]string{"seed": "seed", "lastSeed": "seed"}, + Entries: cloneEntries(entries), + }, + responseBody: WalletResponse{Entries: resEntries[:]}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetWallet", tc.walletID).Return(&tc.gatewayGetWalletResult, tc.gatewayGetWalletErr) + gateway.On("IsCSPEnabled").Return(false) + v := url.Values{} + + endpoint := "/api/v1/wallet" + + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var rlt WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &rlt) + require.NoError(t, err) + require.Equal(t, tc.responseBody, rlt) + } + }) + } +} + +func TestWalletBalanceHandler(t *testing.T) { + type httpBody struct { + WalletID string + Dst string + Coins string + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletBalanceResult BalanceResponse + gatewayBalanceErr error + result *wallet.BalancePair + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "0", + }, + { + name: "400 - no walletID", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + walletID: "0", + }, + { + name: "404 - gw `wallet doesn't exist` error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "notFoundId", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "notFoundId", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: wallet.ErrWalletNotExist, + result: &wallet.BalancePair{ + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "500 - gw other error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "someId", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gatewayBalanceError", + walletID: "someId", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: errors.New("gatewayBalanceError"), + result: &wallet.BalancePair{ + Confirmed: wallet.Balance{Coins: 0, Hours: 0}, + Predicted: wallet.Balance{Coins: 0, Hours: 0}, + }, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletBalanceResult: BalanceResponse{}, + gatewayBalanceErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + result: &wallet.BalancePair{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("GetWalletBalance", tc.walletID).Return(tc.gatewayGetWalletBalanceResult.BalancePair, + tc.gatewayGetWalletBalanceResult.Addresses, tc.gatewayBalanceErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/balance" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg wallet.BalancePair + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.result, &msg, tc.name) + } + }) + } +} + +func TestUpdateWalletLabelHandler(t *testing.T) { + type httpBody struct { + WalletID string + Label string + } + + tt := []struct { + name string + method string + url string + body *httpBody + status int + err string + walletID string + label string + gatewayUpdateWalletLabelErr error + responseBody string + }{ + { + name: "405", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + walletID: "foo", + }, + { + name: "404 - gateway.UpdateWalletLabel ErrWalletNotExist", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletNotExist, + }, + { + name: "500 - gateway.UpdateWalletLabel error", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.UpdateWalletLabel error", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: errors.New("gateway.UpdateWalletLabel error"), + }, + { + name: "403 Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 OK", + method: http.MethodPost, + body: &httpBody{ + WalletID: "foo", + Label: "label", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + label: "label", + gatewayUpdateWalletLabelErr: nil, + responseBody: "\"success\"", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("UpdateWalletLabel", tc.walletID, tc.label).Return(tc.gatewayUpdateWalletLabelErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/update" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + require.Equal(t, tc.responseBody, rr.Body.String(), tc.name) + } + }) + } +} + +func TestWalletTransactionsHandler(t *testing.T) { + type httpBody struct { + WalletID string + } + + unconfirmedTxn, _ := visor.NewReadableUnconfirmedTxn(&visor.UnconfirmedTxn{}) + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + gatewayGetWalletUnconfirmedTxnsResult []visor.UnconfirmedTxn + gatewayGetWalletUnconfirmedTxnsErr error + responseBody UnconfirmedTxnsResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodGet, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "500 - gateway.GetWalletUnconfirmedTxns error", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusInternalServerError, + err: "500 Internal Server Error - gateway.GetWalletUnconfirmedTxns error", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: errors.New("gateway.GetWalletUnconfirmedTxns error"), + }, + { + name: "404 - wallet doesn't exist", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusNotFound, + err: "404 Not Found", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletNotExist, + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodGet, + body: &httpBody{ + WalletID: "foo", + }, + status: http.StatusOK, + err: "", + walletID: "foo", + gatewayGetWalletUnconfirmedTxnsResult: make([]visor.UnconfirmedTxn, 1), + responseBody: UnconfirmedTxnsResponse{Transactions: []visor.ReadableUnconfirmedTxn{*unconfirmedTxn}}, + }, + } + + for _, tc := range tt { + gateway := &GatewayerMock{} + gateway.On("GetWalletUnconfirmedTxns", tc.walletID).Return(tc.gatewayGetWalletUnconfirmedTxnsResult, tc.gatewayGetWalletUnconfirmedTxnsErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/transactions" + + v := url.Values{} + if tc.body != nil { + if tc.body.WalletID != "" { + v.Add("id", tc.body.WalletID) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg UnconfirmedTxnsResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // require.Equal on whole response might result in flaky tests as there is a time field attached to unconfirmed txn response + require.IsType(t, msg, tc.responseBody) + require.Len(t, msg.Transactions, 1) + require.Equal(t, msg.Transactions[0].Txn, tc.responseBody.Transactions[0].Txn) + } + } +} + +func TestWalletCreateHandler(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type httpBody struct { + Seed string + Label string + ScanN string + Encrypt bool + Password string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + wltName string + options wallet.Options + gatewayCreateWalletResult wallet.Wallet + gatewayCreateWalletErr error + scanWalletAddressesResult wallet.Wallet + scanWalletAddressesError error + responseBody WalletResponse + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + wltName: "foo", + }, + { + name: "400 - missing seed", + method: http.MethodPost, + body: &httpBody{}, + status: http.StatusBadRequest, + err: "400 Bad Request - missing seed", + wltName: "foo", + }, + { + name: "400 - missing label", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing label", + wltName: "foo", + }, + { + name: "400 - invalid scan value", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "bad scanN", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid scan value", + wltName: "foo", + }, + { + name: "400 - scan must be > 0", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "0", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - scan must be > 0", + wltName: "foo", + }, + { + name: "400 - gateway.CreateWallet error", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.CreateWallet error", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + }, + gatewayCreateWalletErr: errors.New("gateway.CreateWallet error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + Entries: cloneEntries(entries), + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + }, + Entries: responseEntries[:], + }, + }, + // CSRF Tests + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Password: []byte{}, + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + }, + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + }, + }, + csrfDisabled: true, + }, + { + name: "200 - OK - Encrypted", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + Encrypt: true, + Password: "pwd", + ScanN: "2", + }, + status: http.StatusOK, + err: "", + wltName: "filename", + options: wallet.Options{ + Label: "bar", + Seed: "foo", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 2, + }, + gatewayCreateWalletResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + }, + scanWalletAddressesResult: wallet.Wallet{ + Meta: map[string]string{ + "filename": "filename", + "label": "bar", + "encrypted": "true", + "secrets": "secrets", + }, + }, + responseBody: WalletResponse{ + Meta: WalletMeta{ + Filename: "filename", + Label: "bar", + Encrypted: true, + }, + }, + }, + { + name: "400 Bad request - encrypt without password", + method: http.MethodPost, + body: &httpBody{ + Seed: "foo", + Label: "bar", + Encrypt: true, + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + if tc.options.ScanN == 0 { + tc.options.ScanN = 1 + } + gateway.On("CreateWallet", "", tc.options).Return(&tc.gatewayCreateWalletResult, tc.gatewayCreateWalletErr) + // gateway.On("ScanAheadWalletAddresses", tc.wltName, tc.options.Password, tc.scnN-1).Return(&tc.scanWalletAddressesResult, tc.scanWalletAddressesError) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/create" + + v := url.Values{} + if tc.body != nil { + if tc.body.Seed != "" { + v.Add("seed", tc.body.Seed) + } + if tc.body.Label != "" { + v.Add("label", tc.body.Label) + } + if tc.body.ScanN != "" { + v.Add("scan", tc.body.ScanN) + } + + if tc.body.Encrypt { + v.Add("encrypt", strconv.FormatBool(tc.body.Encrypt)) + } + + if tc.body.Password != "" { + v.Add("password", tc.body.Password) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), + "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletResponse + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + + }) + } +} + +func TestWalletNewSeed(t *testing.T) { + type httpBody struct { + Entropy string + } + tt := []struct { + name string + method string + body *httpBody + status int + err string + entropy string + resultLen int + }{ + { + name: "405", + method: http.MethodPut, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - invalid entropy type", + method: http.MethodGet, + body: &httpBody{ + Entropy: "xx", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid entropy", + entropy: "xx", + }, + { + name: "400 - `wrong entropy length` error", + method: http.MethodGet, + body: &httpBody{ + Entropy: "200", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - entropy length must be 128 or 256", + entropy: "200", + }, + { + name: "200 - OK with no entropy", + method: http.MethodGet, + body: &httpBody{}, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 12 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "128", + }, + status: http.StatusOK, + entropy: "128", + resultLen: 12, + }, + { + name: "200 - OK | 24 word seed", + method: http.MethodGet, + body: &httpBody{ + Entropy: "256", + }, + status: http.StatusOK, + entropy: "256", + resultLen: 24, + }, + } + + // Loop over each test case + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("IsWalletAPIEnabled").Return(true) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/newSeed" + + // Add request parameters to url + v := url.Values{} + if tc.body != nil { + if tc.body.Entropy != "" { + v.Add("entropy", tc.body.Entropy) + } + } + if len(v) > 0 { + endpoint += "?" + v.Encode() + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` expected `%v`", tc.name, status, tc.status) + if status != tc.status { + t.Errorf("case: %s, handler returned wrong status code: got `%v` want `%v`", tc.name, status, tc.status) + } + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, expected `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg struct { + Seed string `json:"seed"` + } + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + // check that expected length is equal to response length + require.Equal(t, tc.resultLen, len(strings.Fields(msg.Seed)), tc.name) + } + }) + } +} + +func TestGetWalletSeed(t *testing.T) { + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturnArgs []interface{} + expectStatus int + expectSeed string + expectErr string + csrfDisabled bool + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + "seed", + nil, + }, + expectStatus: http.StatusOK, + expectSeed: "seed", + csrfDisabled: true, + }, + { + name: "400 - missing wallet id ", + method: http.MethodPost, + wltID: "", + password: "pwd", + gatewayReturnArgs: []interface{}{}, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - missing password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrMissingPassword, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "401 Unauthorized - Invalid password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrInvalidPassword, + }, + expectStatus: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "400 - wallet not encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrWalletNotEncrypted, + }, + expectStatus: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "404 - wallet does not exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturnArgs: []interface{}{ + nil, + wallet.ErrWalletNotExist, + }, + expectStatus: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "405 - Method Not Allowed", + method: http.MethodGet, + expectStatus: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("GetWalletSeed", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturnArgs...) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/seed" + + v := url.Values{} + v.Add("id", tc.wltID) + if len(tc.password) > 0 { + v.Add("password", tc.password) + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.expectStatus, status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var r struct { + Seed string `json:"seed"` + } + err := json.Unmarshal(rr.Body.Bytes(), &r) + require.NoError(t, err) + require.Equal(t, tc.expectSeed, r.Seed) + } + }) + } +} + +func TestWalletNewAddressesHandler(t *testing.T) { + type httpBody struct { + ID string + Num string + Password string + } + type Addresses struct { + Address []string `json:"addresses"` + } + + var responseAddresses = Addresses{} + var responseEmptyAddresses = Addresses{} + + var emptyAddrs = make([]cipher.Address, 0) + var addrs = make([]cipher.Address, 3) + + for i := 0; i < 3; i++ { + pub, _ := cipher.GenerateDeterministicKeyPair(cipher.RandByte(32)) + addrs[i] = cipher.AddressFromPubKey(pub) + responseAddresses.Address = append(responseAddresses.Address, addrs[i].String()) + } + + tt := []struct { + name string + method string + body *httpBody + status int + err string + walletID string + n uint64 + password string + gatewayNewAddressesResult []cipher.Address + gatewayNewAddressesErr error + responseBody Addresses + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "400 - invalid num value", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "bar", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - invalid num value", + }, + { + name: "400 - gateway.NewAddresses error", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - gateway.NewAddresses error", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: errors.New("gateway.NewAddresses error"), + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "400 Bad Request - missing password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusBadRequest, + err: "400 Bad Request - missing password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrMissingPassword, + }, + { + name: "401 Unauthorized - Invalid password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusUnauthorized, + err: "401 Unauthorized - invalid password", + walletID: "foo", + n: 1, + gatewayNewAddressesErr: wallet.ErrInvalidPassword, + }, + { + name: "200 - OK", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK with password", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + Password: "pwd", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + }, + { + name: "200 - OK empty addresses", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "0", + }, + status: http.StatusOK, + walletID: "foo", + n: 0, + gatewayNewAddressesResult: emptyAddrs, + responseBody: responseEmptyAddresses, + }, + { + name: "200 - OK - CSRF disabled", + method: http.MethodPost, + body: &httpBody{ + ID: "foo", + Num: "1", + }, + status: http.StatusOK, + walletID: "foo", + n: 1, + gatewayNewAddressesResult: addrs, + responseBody: responseAddresses, + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("NewAddresses", tc.walletID, []byte(tc.password), tc.n).Return(tc.gatewayNewAddressesResult, tc.gatewayNewAddressesErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/newAddress" + + v := url.Values{} + if tc.body != nil { + if tc.body.ID != "" { + v.Add("id", tc.body.ID) + } + if tc.body.Num != "" { + v.Add("num", tc.body.Num) + } + } + + req, err := http.NewRequest(tc.method, endpoint, bytes.NewBufferString(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + } else { + var msg Addresses + err = json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.responseBody, msg, tc.name) + } + }) + } +} + +func TestGetWalletFolderHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + getWalletDirResponse string + getWalletDirErr error + httpResponse WalletFolder + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletDirResponse: "/wallet/folder/address", + httpResponse: WalletFolder{ + Address: "/wallet/folder/address", + }, + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletDirErr: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + gateway := &GatewayerMock{} + gateway.On("GetWalletDir").Return(tc.getWalletDirResponse, tc.getWalletDirErr) + gateway.On("IsCSPEnabled").Return(false) + endpoint := "/api/v1/wallets/folderName" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg WalletFolder + json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestGetWallets(t *testing.T) { + var pubkeys []cipher.PubKey + var seckeys []cipher.SecKey + var addrs []cipher.Address + + for i := 0; i < 4; i++ { + pubkey, seckey := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubkey) + pubkeys = append(pubkeys, pubkey) + seckeys = append(seckeys, seckey) + addrs = append(addrs, addr) + } + + cases := []struct { + name string + method string + status int + err string + getWalletsResponse wallet.Wallets + getWalletsErr error + httpResponse []*WalletResponse + }{ + { + name: "405", + method: http.MethodPost, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + }, + { + name: "403 - wallet API disabled", + method: http.MethodGet, + status: http.StatusForbidden, + err: "403 Forbidden", + getWalletsErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 no wallets", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: nil, + httpResponse: []*WalletResponse{}, + }, + { + name: "200 no wallets 2", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{}, + httpResponse: []*WalletResponse{}, + }, + { + name: "200", + method: http.MethodGet, + status: http.StatusOK, + getWalletsResponse: wallet.Wallets{ + "foofilename": { + Meta: map[string]string{ + "foo": "bar", + "seed": "fooseed", + "lastSeed": "foolastseed", + "coin": "foocoin", + "filename": "foofilename", + "label": "foolabel", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "345678", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[0], + Public: pubkeys[0], + Secret: seckeys[0], + }, + }, + }, + "foofilename2": { + Meta: map[string]string{ + "foo": "bar2", + "seed": "fooseed2", + "lastSeed": "foolastseed2", + "coin": "foocoin", + "filename": "foofilename2", + "label": "foolabel2", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "123456", + "encrypted": "false", + }, + Entries: []wallet.Entry{ + { + Address: addrs[1], + Public: pubkeys[1], + Secret: seckeys[1], + }, + }, + }, + "foofilename3": { + Meta: map[string]string{ + "foo": "bar3", + "seed": "fooseed3", + "lastSeed": "foolastseed3", + "coin": "foocoin", + "filename": "foofilename3", + "label": "foolabel3", + "type": "footype", + "version": "fooversion", + "cryptoType": "foocryptotype", + "tm": "234567", + "encrypted": "true", + }, + Entries: []wallet.Entry{ + { + Address: addrs[2], + Public: pubkeys[2], + Secret: seckeys[2], + }, + { + Address: addrs[3], + Public: pubkeys[3], + Secret: seckeys[3], + }, + }, + }, + }, + httpResponse: []*WalletResponse{ + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename2", + Label: "foolabel2", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 123456, + Encrypted: false, + }, + Entries: []WalletEntry{ + { + Address: addrs[1].String(), + Public: pubkeys[1].Hex(), + }, + }, + }, + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename3", + Label: "foolabel3", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 234567, + Encrypted: true, + }, + Entries: []WalletEntry{ + { + Address: addrs[2].String(), + Public: pubkeys[2].Hex(), + }, + { + Address: addrs[3].String(), + Public: pubkeys[3].Hex(), + }, + }, + }, + { + Meta: WalletMeta{ + Coin: "foocoin", + Filename: "foofilename", + Label: "foolabel", + Type: "footype", + Version: "fooversion", + CryptoType: "foocryptotype", + Timestamp: 345678, + Encrypted: true, + }, + Entries: []WalletEntry{ + { + Address: addrs[0].String(), + Public: pubkeys[0].Hex(), + }, + }, + }, + }, + }, + } + + for _, tc := range cases { + gateway := &GatewayerMock{} + gateway.On("GetWallets").Return(tc.getWalletsResponse, tc.getWalletsErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallets" + + req, err := http.NewRequest(tc.method, endpoint, nil) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "case: %s, handler returned wrong status code: got `%v` want `%v`", + tc.name, status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %s, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } else { + var msg []*WalletResponse + json.Unmarshal(rr.Body.Bytes(), &msg) + require.NoError(t, err) + require.NotNil(t, msg) + require.Equal(t, tc.httpResponse, msg, tc.name) + } + } +} + +func TestWalletUnloadHandler(t *testing.T) { + tt := []struct { + name string + method string + status int + err string + walletID string + unloadWalletErr error + csrfDisabled bool + }{ + { + name: "405", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + err: "405 Method Not Allowed", + walletID: "wallet.wlt", + }, + { + name: "400 - missing wallet id", + method: http.MethodPost, + status: http.StatusBadRequest, + err: "400 Bad Request - missing wallet id", + }, + { + name: "403 - Forbidden - wallet API disabled", + method: http.MethodPost, + status: http.StatusForbidden, + err: "403 Forbidden", + walletID: "wallet.wlt", + unloadWalletErr: wallet.ErrWalletAPIDisabled, + }, + { + name: "200 - ok", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + }, + { + name: "200 - ok, csrf disabled", + method: http.MethodPost, + status: http.StatusOK, + walletID: "wallet.wlt", + csrfDisabled: true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := &GatewayerMock{} + gateway.On("UnloadWallet", tc.walletID).Return(tc.unloadWalletErr) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/unload" + v := url.Values{} + v.Add("id", tc.walletID) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + if csrfStore.Enabled { + setCSRFParameters(csrfStore, tokenValid, req) + } else { + setCSRFParameters(csrfStore, tokenInvalid, req) + } + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.err, strings.TrimSpace(rr.Body.String()), "case: %s, handler returned wrong error message: got `%v`| %d, want `%v`", + tc.name, strings.TrimSpace(rr.Body.String()), status, tc.err) + } + }) + } +} + +func TestEncryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w *wallet.Wallet + err error + } + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + }{ + { + name: "200 - OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet.wlt", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "secrets", + "encrypted": "true", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet.wlt", + Encrypted: true, + }, + Entries: responseEntries, + }, + }, + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + wltID: "wallet.wlt", + password: "pwd", + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Missing Wallet Id", + method: http.MethodPost, + wltID: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "401 Unauthorized - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "404 - Wallet Not Found", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + { + name: "400 - Wallet Is Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is encrypted", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("EncryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/encrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: true, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`, body: %v", status, tc.status, rr.Body.String()) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + return + } + + var rlt WalletResponse + err = json.NewDecoder(rr.Body).Decode(&rlt) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, rlt) + }) + } +} + +func TestDecryptWallet(t *testing.T) { + entries, responseEntries := makeEntries([]byte("seed"), 5) + type gatewayReturnPair struct { + w *wallet.Wallet + err error + } + + tt := []struct { + name string + method string + wltID string + password string + gatewayReturn gatewayReturnPair + status int + expectWallet WalletResponse + expectErr string + csrfDisabled bool + }{ + { + name: "200 OK", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + }, + { + name: "200 OK CSRF disabled", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + w: &wallet.Wallet{ + Meta: map[string]string{ + "filename": "wallet", + "seed": "seed", + "lastSeed": "lastSeed", + "secrets": "", + "encrypted": "false", + }, + Entries: cloneEntries(entries), + }, + }, + status: http.StatusOK, + expectWallet: WalletResponse{ + Meta: WalletMeta{ + Filename: "wallet", + Encrypted: false, + }, + Entries: responseEntries, + }, + csrfDisabled: true, + }, + + { + name: "403 Forbidden", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletAPIDisabled, + }, + status: http.StatusForbidden, + expectErr: "403 Forbidden", + }, + { + name: "405 Method Not Allowed", + method: http.MethodGet, + status: http.StatusMethodNotAllowed, + expectErr: "405 Method Not Allowed", + }, + { + name: "400 - Missing Wallet ID", + method: http.MethodPost, + wltID: "", + password: "", + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing wallet id", + }, + { + name: "400 - Missing Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrMissingPassword, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - missing password", + }, + { + name: "400 - Wallet IS Not Encrypted", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotEncrypted, + }, + status: http.StatusBadRequest, + expectErr: "400 Bad Request - wallet is not encrypted", + }, + { + name: "401 Unauthorized - Invalid Password", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrInvalidPassword, + }, + status: http.StatusUnauthorized, + expectErr: "401 Unauthorized - invalid password", + }, + { + name: "404 - Wallet Does Not Exist", + method: http.MethodPost, + wltID: "wallet.wlt", + password: "pwd", + gatewayReturn: gatewayReturnPair{ + err: wallet.ErrWalletNotExist, + }, + status: http.StatusNotFound, + expectErr: "404 Not Found", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gateway := NewGatewayerMock() + gateway.On("DecryptWallet", tc.wltID, []byte(tc.password)).Return(tc.gatewayReturn.w, tc.gatewayReturn.err) + gateway.On("IsCSPEnabled").Return(false) + + endpoint := "/api/v1/wallet/decrypt" + v := url.Values{} + v.Add("id", tc.wltID) + v.Add("password", tc.password) + + req, err := http.NewRequest(tc.method, endpoint, strings.NewReader(v.Encode())) + require.NoError(t, err) + req.Header.Add("Content-Type", "application/x-www-form-urlencoded") + + csrfStore := &CSRFStore{ + Enabled: !tc.csrfDisabled, + } + setCSRFParameters(csrfStore, tokenValid, req) + + rr := httptest.NewRecorder() + handler := newServerMux(mxConfig, gateway, csrfStore, nil) + + handler.ServeHTTP(rr, req) + + status := rr.Code + require.Equal(t, tc.status, status, "wrong status code: got `%v` want `%v`", status, tc.status) + + if status != http.StatusOK { + require.Equal(t, tc.expectErr, strings.TrimSpace(rr.Body.String())) + if status == http.StatusUnauthorized { + require.Equal(t, HTTP401AuthHeader, rr.Header().Get("WWW-Authenticate")) + } + return + } + + var r WalletResponse + err = json.NewDecoder(rr.Body).Decode(&r) + require.NoError(t, err) + require.Equal(t, tc.expectWallet, r) + }) + } +} + +// makeEntries derives N wallet address entries from given seed +// Returns set of wallet.Entry and wallet.ReadableEntry, the readable +// entries' secrets are removed. +func makeEntries(seed []byte, n int) ([]wallet.Entry, []WalletEntry) { // nolint: unparam + seckeys := cipher.GenerateDeterministicKeyPairs(seed, n) + var entries []wallet.Entry + var responseEntries []WalletEntry + for i, seckey := range seckeys { + pubkey := cipher.PubKeyFromSecKey(seckey) + entries = append(entries, wallet.Entry{ + Address: cipher.AddressFromPubKey(pubkey), + Public: pubkey, + Secret: seckey, + }) + responseEntries = append(responseEntries, WalletEntry{ + Address: entries[i].Address.String(), + Public: entries[i].Public.Hex(), + }) + } + return entries, responseEntries +} + +func cloneEntries(es []wallet.Entry) []wallet.Entry { + var entries []wallet.Entry + for _, e := range es { + entries = append(entries, e) + } + return entries +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/README.md b/vendor/github.com/skycoin/skycoin/src/api/webrpc/README.md new file mode 100755 index 0000000..26b8efb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/README.md @@ -0,0 +1,123 @@ +# JSON 2.0 RPC API Documentation + +**WARNING: The JSON-RPC 2.0 API interface is deprecated. Do not interface with it directly** + +This is a description about skycoin webrpc, which implemented the [json-rpc 2.0](http://www.jsonrpc.org/specification) protocol. +The rpc service entry point is /webrpc, and only accept the HTTP `POST` requests. +The rpc service is exposed on port `6420` by default. + +## Get Status + +Get status of rpc server. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_status" +} +``` + +## Get last blocks + +Get last `N` blocks. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_lastblocks", + "params": [3] +} +``` + +The params must be an array with one integer value. + +## Get blocks + +Get blocks in specific range, inclusive. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_blocks", + "params": [2, 10] +} +``` + +The params must be an array with two integer values. + +## Get blocks by sequence number + +Get blocks at specific sequence numbers. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_blocks", + "params": [133, 401, 212] +} +``` + +The params must be an array of integer values. + +## Get outputs + +Get unspent outputs of specific addresses. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_outputs", + "params": ["fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4C", "fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B"] +} +``` + +The params must be an array of strings. + +## Inject transaction + +Broadcast raw transaction. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "inject_transaction", + "params": ["dc0000000010e05181fd4023f865a84359bf72a304e687b6f00e42f93ad9a4b8ee5a64aabc01000000dcb5b236eecd97a36c7d0a0b8ed68bb5df6274433a51fddf911f02f3926d20bf6eaabdc21529b7696f498545b06cc7e69f2f08b4dc5fa823c5b3f03da06794a300010000006d8a9c89177ce5e9d3b4b59fff67c00f0471fdebdfbb368377841b03fc7d688b02000000005771eeda2e253697cf5368f16fe05210d5cd319040420f0000000000af010000000000000060dfa95881cdc827b45a6d49b11dbc152ecd4de600093d0000000000af01000000000000"] +} +``` + +The params must be an array with one raw transaction string. + +## Get transaction + +Get transaction verbose info of specific transaction id. + +request: + +```json +{ + "id": "1", + "jsonrpc": "2.0", + "method": "get_transaction", + "params": ["bdc4a85a3e9d17a8fe00aa7430d0347c7f1dd6480a16da7147b6e43905057d43"] +} +``` + +The params must be an array with one txid string. diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/block.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/block.go new file mode 100755 index 0000000..95057a7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/block.go @@ -0,0 +1,56 @@ +package webrpc + +// request params: [seq1, seq2, seq3...] +func getBlocksBySeqHandler(req Request, gateway Gatewayer) Response { + var seqs []uint64 + if err := req.DecodeParams(&seqs); err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(seqs) == 0 { + return MakeErrorResponse(ErrCodeInvalidParams, "empty params") + } + blocks, err := gateway.GetBlocksInDepth(seqs) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + return makeSuccessResponse(req.ID, blocks) +} + +// request params: [number] +func getLastBlocksHandler(req Request, gateway Gatewayer) Response { + // validate the req params + var num []uint64 + if err := req.DecodeParams(&num); err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(num) != 1 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + blocks, err := gateway.GetLastBlocks(num[0]) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + return makeSuccessResponse(req.ID, blocks) +} + +func getBlocksHandler(req Request, gateway Gatewayer) Response { + var params []uint64 + if err := req.DecodeParams(¶ms); err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(params) != 2 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + blocks, err := gateway.GetBlocks(params[0], params[1]) + if err != nil { + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + return makeSuccessResponse(req.ID, blocks) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/block_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/block_test.go new file mode 100755 index 0000000..98282c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/block_test.go @@ -0,0 +1,335 @@ +package webrpc + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/visor" +) + +var blockString = `{ + "blocks": [ + { + "header": { + "version": 0, + "timestamp": 1477295242, + "seq": 454, + "fee": 20732, + "prev_hash": "f680fe1f068a1cd5c3ef9194f91a9bc3cacffbcae4a32359a3c014da4ef7516f", + "hash": "662835cc081e037561e1fe05860fdc4b426f6be562565bfaa8ec91be5675064a" + }, + "body": { + "txns": [ + { + "length": 608, + "type": 0, + "txid": "662835cc081e037561e1fe05860fdc4b426f6be562565bfaa8ec91be5675064a", + "inner_hash": "37f1111bd83d9c995b9e48511bd52de3b0e440dccbf6d2cfd41dee31a10f1aa4", + "sigs": [ + "ef0b8e1465557e6f21cb2bfad17136188f0b9bd54bba3db76c3488eb8bc900bc7662e3fe162dd6c236d9e52a7051a2133855081a91f6c1a63e1fce2ae9e3820e00", + "800323c8c22a2c078cecdfad35210902f91af6f97f0c63fe324e0a9c2159e9356f2fbbfff589edea5a5c24453ef5fc0cd5929f24bebee28e37057acd6d42f3d700", + "ca6a6ef5f5fb67490d88ddeeee5e5d11055246613b03e7ed2ad5cc82d01077d262e2da56560083928f5389580ae29500644719cf0e82a5bf065cecbed857598400", + "78ddc117607159c7b4c76fc91deace72425f21f2df5918d44d19a377da68cc610668c335c84e2bb7a8f16cd4f9431e900585fc0a3f1024b722b974fcef59dfd500", + "4c484d44072e23e97a437deb03a85e3f6eca0bd8875031efe833e3c700fc17f91491969b9864b56c280ef8a68d18dd728b211ce1d46fe477fe3104d73d55ad6501" + ], + "inputs": [ + "4bd7c68ecf3039c2b2d8c26a5e2983e20cf53b6d62b099e7786546b3c3f600f9", + "f9e39908677cae43832e1ead2514e01eaae48c9a3614a97970f381187ee6c4b1", + "7e8ac23a2422b4666ff45192fe36b1bd05f1285cf74e077ac92cabf5a7c1100e", + "b3606a4f115d4161e1c8206f4fb5ac0e91551c40d0ee6fe40c86040d2faacac0", + "305f1983f5b630bba27e2777c229c725b6b57f37a6ddee138d1d82ae56311909" + ], + "outputs": [ + { + "uxid": "574d7e5afaefe4ee7e0adf6ce1971d979f038adc8ebbd35771b2c19b0bad7e3d", + "dst": "cBnu9sUvv12dovBmjQKTtfE4rbjMmf3fzW", + "coins": "1", + "hours": 3455 + }, + { + "uxid": "6d8a9c89177ce5e9d3b4b59fff67c00f0471fdebdfbb368377841b03fc7d688b", + "dst": "fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B", + "coins": "5", + "hours": 3455 + } + ] + } + ] + } + } + ] +}` + +var emptyBlockString = `{ + "blocks":[] + }` + +func decodeBlock(str string) *visor.ReadableBlocks { + var blocks visor.ReadableBlocks + if err := json.Unmarshal([]byte(str), &blocks); err != nil { + panic(err) + } + return &blocks +} + +func Test_getLastBlocksHandler(t *testing.T) { + type args struct { + req Request + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_lastblocks", + Params: []byte("[1]"), + }, + gateway: &fakeGateway{}, + }, + makeSuccessResponse("1", decodeBlock(blockString)), + }, + { + "invalid params: num value", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_lastblocks", + Params: []byte(`[1a]`), // invalid params + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params: no num value", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_lastblocks", + Params: []byte(`{"foo": 1}`), // invalid params + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params: empty params", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_lastblocks", + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params: more than one param", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_lastblocks", + Params: []byte("[1,2]"), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getLastBlocksHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} + +func Test_getBlocksHandler(t *testing.T) { + type args struct { + req Request + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + Params: []byte("[0, 1]"), + }, + gateway: &fakeGateway{}, + }, + makeSuccessResponse("1", decodeBlock(blockString)), + }, + { + "invalid params: lost end", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + Params: []byte("[0]"), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params:lost start", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + Params: []byte("[1]"), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params: start = abc", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + Params: []byte(`{ "start": "abc"}`), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "empty params", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "start > end", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks", + Params: []byte(`[2, 1]`), + }, + gateway: &fakeGateway{}, + }, + makeSuccessResponse("1", nil), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getBlocksHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} + +func Test_getBlocksBySeqHandler(t *testing.T) { + m := NewGatewayerMock() + m.On("GetBlocksInDepth", []uint64{454}).Return(decodeBlock(blockString), nil) + m.On("GetBlocksInDepth", []uint64{1000}).Return(decodeBlock(emptyBlockString), nil) + + type args struct { + req Request + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks_by_seq", + Params: []byte(`[454]`), + }, + gateway: m, + }, + makeSuccessResponse("1", decodeBlock(blockString)), + }, + { + "none exist seq", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks_by_seq", + Params: []byte(`[1000]`), + }, + gateway: m, + }, + makeSuccessResponse("1", decodeBlock(emptyBlockString)), + }, + { + "invalid request param", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks_by_seq", + Params: []byte(`["454"]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "empty param", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_blocks_by_seq", + Params: []byte(`[]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, "empty params"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getBlocksBySeqHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/client.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/client.go new file mode 100755 index 0000000..411d80f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/client.go @@ -0,0 +1,297 @@ +package webrpc + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor" +) + +const ( + dialTimeout = 60 * time.Second + httpClientTimeout = 120 * time.Second + tlsHandshakeTimeout = 60 * time.Second +) + +// ErrJSONUnmarshal is returned if JSON unmarshal fails +var ErrJSONUnmarshal = errors.New("JSON unmarshal failed") + +// ClientError is used for non-200 API responses +type ClientError struct { + Status string + StatusCode int + Message string +} + +func (e ClientError) Error() string { + return e.Message +} + +// Client is an RPC client +type Client struct { + Addr string + HTTPClient *http.Client + UseCSRF bool + reqIDCtr int +} + +// NewClient creates a Client +func NewClient(addr string) (*Client, error) { + transport := &http.Transport{ + Dial: (&net.Dialer{ + Timeout: dialTimeout, + }).Dial, + TLSHandshakeTimeout: tlsHandshakeTimeout, + } + httpClient := &http.Client{ + Transport: transport, + Timeout: httpClientTimeout, + } + addr = strings.TrimRight(addr, "/") + addr += "/" + + if _, err := url.Parse(addr); err != nil { + return nil, err + } + + return &Client{ + Addr: addr, + HTTPClient: httpClient, + }, nil +} + +// Do makes an RPC request +func (c *Client) Do(obj interface{}, method string, params interface{}) error { + c.reqIDCtr++ + + var csrf string + if c.UseCSRF { + var err error + csrf, err = c.CSRF() + if err != nil { + return err + } + + if csrf == "" { + return errors.New("Remote node has CSRF disabled") + } + } + + req, err := NewRequest(method, params, strconv.Itoa(c.reqIDCtr)) + if err != nil { + return err + } + + rsp, err := do(c.HTTPClient, req, c.Addr, csrf) + if err != nil { + return err + } + + if rsp.Error != nil { + return rsp.Error + } + + return decodeJSON(rsp.Result, obj) +} + +// CSRF returns a CSRF token. If CSRF is disabled on the node, returns an empty string and nil error. +func (c *Client) CSRF() (string, error) { + endpoint := c.Addr + "csrf" + req, err := http.NewRequest(http.MethodGet, endpoint, nil) + if err != nil { + return "", err + } + + resp, err := c.HTTPClient.Do(req) + + if err != nil { + return "", err + } + + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + case http.StatusNotFound: + // CSRF is disabled on the node + return "", nil + default: + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return "", fmt.Errorf("%d %s: %s", resp.StatusCode, resp.Status, string(body)) + } + + var m map[string]string + if err := json.NewDecoder(resp.Body).Decode(&m); err != nil { + return "", err + } + + token, ok := m["csrf_token"] + if !ok { + return "", errors.New("csrf_token not found in response") + } + + return token, nil +} + +// GetUnspentOutputs returns unspent outputs for a set of addresses +// TODO -- what is the difference between this and GetAddressUxOuts? +func (c *Client) GetUnspentOutputs(addrs []string) (*OutputsResult, error) { + outputs := OutputsResult{} + if err := c.Do(&outputs, "get_outputs", addrs); err != nil { + return nil, err + } + + return &outputs, nil +} + +// InjectTransactionString injects a hex-encoded transaction string to the network +func (c *Client) InjectTransactionString(rawtx string) (string, error) { + params := []string{rawtx} + rlt := TxIDJson{} + + if err := c.Do(&rlt, "inject_transaction", params); err != nil { + return "", err + } + + return rlt.Txid, nil +} + +// InjectTransaction injects a *coin.Transaction to the network +func (c *Client) InjectTransaction(tx *coin.Transaction) (string, error) { + d := tx.Serialize() + rawTx := hex.EncodeToString(d) + return c.InjectTransactionString(rawTx) +} + +// GetStatus returns status info for a skycoin node +func (c *Client) GetStatus() (*StatusResult, error) { + status := StatusResult{} + if err := c.Do(&status, "get_status", nil); err != nil { + return nil, err + } + + return &status, nil +} + +// GetTransactionByID returns a transaction given a txid +func (c *Client) GetTransactionByID(txid string) (*TxnResult, error) { + txn := TxnResult{} + if err := c.Do(&txn, "get_transaction", []string{txid}); err != nil { + return nil, err + } + + return &txn, nil +} + +// GetAddressUxOuts returns unspent outputs for a set of addresses +// TODO -- what is the difference between this and GetUnspentOutputs? +func (c *Client) GetAddressUxOuts(addrs []string) ([]AddrUxoutResult, error) { + uxouts := []AddrUxoutResult{} + if err := c.Do(&uxouts, "get_address_uxouts", addrs); err != nil { + return nil, err + } + + return uxouts, nil +} + +// GetBlocks returns a range of blocks +func (c *Client) GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) { + param := []uint64{start, end} + blocks := visor.ReadableBlocks{} + + if err := c.Do(&blocks, "get_blocks", param); err != nil { + return nil, err + } + + return &blocks, nil +} + +// GetBlocksBySeq returns blocks for a set of block sequences (heights) +func (c *Client) GetBlocksBySeq(ss []uint64) (*visor.ReadableBlocks, error) { + blocks := visor.ReadableBlocks{} + + if err := c.Do(&blocks, "get_blocks_by_seq", ss); err != nil { + return nil, err + } + + return &blocks, nil +} + +// GetLastBlocks returns the last n blocks +func (c *Client) GetLastBlocks(n uint64) (*visor.ReadableBlocks, error) { + param := []uint64{n} + blocks := visor.ReadableBlocks{} + if err := c.Do(&blocks, "get_lastblocks", param); err != nil { + return nil, err + } + + return &blocks, nil +} + +// do send request to web. rpcAddress should have forward slash appended +func do(httpClient *http.Client, rpcReq *Request, rpcAddress, csrf string) (*Response, error) { + d, err := json.Marshal(rpcReq) + if err != nil { + return nil, err + } + + url := rpcAddress + "api/v1/webrpc" + body := bytes.NewBuffer(d) + req, err := http.NewRequest(http.MethodPost, url, body) + if err != nil { + return nil, err + } + + req.Header.Set("Content-Type", "application/json") + + if csrf != "" { + req.Header.Set("X-CSRF-Token", csrf) + } + + resp, err := httpClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return nil, ClientError{ + Status: resp.Status, + StatusCode: resp.StatusCode, + Message: strings.TrimSpace(string(body)), + } + } + + res := Response{} + if err := json.NewDecoder(resp.Body).Decode(&res); err != nil { + return nil, err + } + return &res, nil +} + +func decodeJSON(data []byte, obj interface{}) error { + if err := json.NewDecoder(bytes.NewBuffer(data)).Decode(obj); err != nil { + return ErrJSONUnmarshal + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/client_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/client_test.go new file mode 100755 index 0000000..eb0bce4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/client_test.go @@ -0,0 +1,438 @@ +package webrpc + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "sort" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor" +) + +func TestClientGetUnspentOutputs(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + headTime := uint64(time.Now().UTC().Unix()) + uxouts := make([]coin.UxOut, 5) + addrs := make([]cipher.Address, 5) + rbOutputs := make(visor.ReadableOutputs, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxouts[i] = coin.UxOut{} + uxouts[i].Body.Address = addrs[i] + rbOut, err := visor.NewReadableOutput(headTime, uxouts[i]) + require.NoError(t, err) + rbOutputs[i] = rbOut + } + + s.Gateway = &fakeGateway{ + uxouts: uxouts, + } + + cases := []struct { + name string + params []string + errMsg string + }{ + { + name: "valid, multiple addresses", + params: []string{addrs[0].String(), addrs[1].String()}, + }, + { + name: "invalid addresses", + params: []string{"invalid-address-foo"}, + errMsg: "invalid address: invalid-address-foo", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + rpcReq, err := NewRequest("get_outputs", tc.params, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + if tc.errMsg != "" { + require.NotNil(t, resp.Error) + require.NotEmpty(t, resp.Error.Code) + require.Equal(t, tc.errMsg, resp.Error.Message) + return + } + + require.Nil(t, resp.Error) + + var outputs OutputsResult + err = json.Unmarshal(resp.Result, &outputs) + require.NoError(t, err) + + require.Len(t, outputs.Outputs.HeadOutputs, 2) + require.Len(t, outputs.Outputs.IncomingOutputs, 0) + require.Len(t, outputs.Outputs.OutgoingOutputs, 0) + + // GetUnspentOutputs sorts outputs by most recent time first, then by hash + expectedOutputs := rbOutputs[:2] + sort.Slice(expectedOutputs, func(i, j int) bool { + if expectedOutputs[i].Time == expectedOutputs[j].Time { + return strings.Compare(expectedOutputs[i].Hash, expectedOutputs[j].Hash) < 1 + } + + return expectedOutputs[i].Time > expectedOutputs[j].Time + }) + + require.Equal(t, rbOutputs[:2], outputs.Outputs.HeadOutputs) + }) + } +} + +func TestClientInjectTransaction(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + s.Gateway.(*fakeGateway).injectRawTxMap = map[string]bool{ + rawTxID: true, + } + require.Empty(t, s.Gateway.(*fakeGateway).injectedTransactions) + + rpcReq, err := NewRequest("inject_transaction", []string{rawTxStr}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + var txidJSON TxIDJson + err = json.Unmarshal(resp.Result, &txidJSON) + require.NoError(t, err) + require.NotEmpty(t, txidJSON.Txid) + + require.Len(t, s.Gateway.(*fakeGateway).injectedTransactions, 1) + require.Contains(t, s.Gateway.(*fakeGateway).injectedTransactions, rawTxID) +} + +func TestClientGetStatus(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + rpcReq, err := NewRequest("get_status", nil, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + var result StatusResult + err = json.Unmarshal(resp.Result, &result) + require.NoError(t, err) + + // values derived from hardcoded `blockString` + require.Equal(t, StatusResult{ + Running: true, + BlockNum: 455, + LastBlockHash: "", + TimeSinceLastBlock: "18446744072232256374s", + }, result) +} + +func TestClientGetTransactionByID(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + cases := []struct { + name string + txid string + errMsg string + gatewayTransactions map[string]string + }{ + { + name: "invalid txn id", + txid: "foo", + errMsg: "invalid transaction hash", + }, + { + name: "valid txn id, but does not exist", + txid: rawTxID, + errMsg: "transaction doesn't exist", + }, + { + name: "valid txn id exists", + txid: rawTxID, + gatewayTransactions: map[string]string{ + rawTxID: rawTxStr, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + if tc.gatewayTransactions != nil { + s.Gateway.(*fakeGateway).transactions = tc.gatewayTransactions + } + + rpcReq, err := NewRequest("get_transaction", []string{tc.txid}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + if tc.errMsg != "" { + require.NotNil(t, resp.Error) + require.Equal(t, tc.errMsg, resp.Error.Message) + return + } + + var txn TxnResult + err = json.Unmarshal(resp.Result, &txn) + require.NoError(t, err) + + expectedTxn := decodeRawTransaction(rawTxStr) + rbTx, err := visor.NewReadableTransaction(expectedTxn) + require.NoError(t, err) + require.Equal(t, &daemon.TransactionResult{ + Status: expectedTxn.Status, + Time: 0, + Transaction: *rbTx, + }, txn.Transaction) + }) + } +} + +func TestClientGetAddressUxOuts(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + cases := []struct { + name string + addr string + errMsg string + }{ + { + name: "valid address", + addr: "2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT", + }, + { + name: "invalid address", + addr: "foo", + errMsg: "Invalid address length", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + gatewayerMock, mockData := newUxOutMock() + s.Gateway = gatewayerMock + + rpcReq, err := NewRequest("get_address_uxouts", []string{tc.addr}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + if tc.errMsg != "" { + require.NotNil(t, resp.Error) + require.Equal(t, tc.errMsg, resp.Error.Message) + return + } + + var uxouts []AddrUxoutResult + err = json.Unmarshal(resp.Result, &uxouts) + require.NoError(t, err) + + require.Equal(t, []AddrUxoutResult{{ + Address: tc.addr, + UxOuts: mockData(tc.addr), + }}, uxouts) + }) + } +} + +func TestClientGetBlocks(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + // blockString borrowed from block_test.go + rpcReq, err := NewRequest("get_blocks", []uint64{0, 1}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.Unmarshal(resp.Result, &blocks) + require.NoError(t, err) + + require.NotNil(t, blocks.Blocks) + require.Equal(t, decodeBlock(blockString), &blocks) +} + +func TestClientGetBlocksBySeq(t *testing.T) { + s := setupWebRPC(t) + + gatewayerMock := NewGatewayerMock() + s.Gateway = gatewayerMock + gatewayerMock.On("GetBlocksInDepth", []uint64{454}).Return(decodeBlock(blockString), nil) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + // blockString and seq borrowed from block_test.go + var seq uint64 = 454 + rpcReq, err := NewRequest("get_blocks_by_seq", []uint64{seq}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.Unmarshal(resp.Result, &blocks) + require.NoError(t, err) + + require.NotNil(t, blocks.Blocks) + require.Equal(t, decodeBlock(blockString), &blocks) +} + +func TestClientGetLastBlocks(t *testing.T) { + s := setupWebRPC(t) + + mux := http.NewServeMux() + mux.Handle("/api/v1/webrpc", http.HandlerFunc(s.Handler)) + + var n uint64 = 1 + rpcReq, err := NewRequest("get_lastblocks", []uint64{n}, "1") + require.NoError(t, err) + + body, err := json.Marshal(rpcReq) + require.NoError(t, err) + + req, err := http.NewRequest(http.MethodPost, "/api/v1/webrpc", bytes.NewReader(body)) + require.NoError(t, err) + + rr := httptest.NewRecorder() + + mux.ServeHTTP(rr, req) + + require.Equal(t, http.StatusOK, rr.Code) + + var resp Response + err = json.Unmarshal(rr.Body.Bytes(), &resp) + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.Unmarshal(resp.Result, &blocks) + require.NoError(t, err) + + require.Len(t, blocks.Blocks, 1) + require.Equal(t, decodeBlock(blockString), &blocks) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/gateway.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/gateway.go new file mode 100755 index 0000000..562a8e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/gateway.go @@ -0,0 +1,23 @@ +package webrpc + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +//go:generate goautomock -template=testify Gatewayer + +// Gatewayer provides interfaces for getting skycoin related info. +type Gatewayer interface { + GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) + GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) + GetBlocksInDepth(vs []uint64) (*visor.ReadableBlocks, error) + GetUnspentOutputs(filters ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) + GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) + InjectBroadcastTransaction(tx coin.Transaction) error + GetAddrUxOuts(addr []cipher.Address) ([]*historydb.UxOut, error) + GetTimeNow() uint64 +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/gatewayer_mock_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/gatewayer_mock_test.go new file mode 100755 index 0000000..cb0bcbd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/gatewayer_mock_test.go @@ -0,0 +1,225 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package webrpc + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + daemon "github.com/skycoin/skycoin/src/daemon" + visor "github.com/skycoin/skycoin/src/visor" + historydb "github.com/skycoin/skycoin/src/visor/historydb" +) + +// GatewayerMock mock +type GatewayerMock struct { + mock.Mock +} + +func NewGatewayerMock() *GatewayerMock { + return &GatewayerMock{} +} + +// GetAddrUxOuts mocked method +func (m *GatewayerMock) GetAddrUxOuts(p0 []cipher.Address) ([]*historydb.UxOut, error) { + + ret := m.Called(p0) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlocks mocked method +func (m *GatewayerMock) GetBlocks(p0 uint64, p1 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0, p1) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetBlocksInDepth mocked method +func (m *GatewayerMock) GetBlocksInDepth(p0 []uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetLastBlocks mocked method +func (m *GatewayerMock) GetLastBlocks(p0 uint64) (*visor.ReadableBlocks, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableBlocks + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableBlocks: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTimeNow mocked method +func (m *GatewayerMock) GetTimeNow() uint64 { + + ret := m.Called() + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetTransaction mocked method +func (m *GatewayerMock) GetTransaction(p0 cipher.SHA256) (*visor.Transaction, error) { + + ret := m.Called(p0) + + var r0 *visor.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *visor.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnspentOutputs mocked method +func (m *GatewayerMock) GetUnspentOutputs(p0 ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) { + + ret := m.Called(p0) + + var r0 *visor.ReadableOutputSet + switch res := ret.Get(0).(type) { + case nil: + case *visor.ReadableOutputSet: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// InjectBroadcastTransaction mocked method +func (m *GatewayerMock) InjectBroadcastTransaction(p0 coin.Transaction) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs.go new file mode 100755 index 0000000..90e6cd7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs.go @@ -0,0 +1,45 @@ +package webrpc + +import ( + "fmt" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" +) + +// OutputsResult the output json format +type OutputsResult struct { + Outputs visor.ReadableOutputSet `json:"outputs"` +} + +func getOutputsHandler(req Request, gateway Gatewayer) Response { + var addrs []string + if err := req.DecodeParams(&addrs); err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(addrs) == 0 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + for i, a := range addrs { + addrs[i] = strings.Trim(a, " ") + } + + // validate those addresses + for _, a := range addrs { + if _, err := cipher.DecodeBase58Address(a); err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, fmt.Sprintf("invalid address: %v", a)) + } + } + + outs, err := gateway.GetUnspentOutputs(daemon.FbyAddresses(addrs)) + if err != nil { + logger.Errorf("get unspent outputs failed: %v", err) + return MakeErrorResponse(ErrCodeInternalError, fmt.Sprintf("gateway.GetUnspentOutputs failed: %v", err)) + } + + return makeSuccessResponse(req.ID, OutputsResult{*outs}) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs_test.go new file mode 100755 index 0000000..a9d8570 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/outputs_test.go @@ -0,0 +1,103 @@ +package webrpc + +import ( + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor" +) + +func filterOut(headTime uint64, outs []coin.UxOut, f func(out coin.UxOut) bool) visor.ReadableOutputSet { + os := []coin.UxOut{} + for _, o := range outs { + if f(o) { + os = append(os, o) + } + } + + headOuts, err := visor.NewReadableOutputs(headTime, os) + if err != nil { + panic(err) + } + return visor.ReadableOutputSet{ + HeadOutputs: headOuts, + } +} + +func Test_getOutputsHandler(t *testing.T) { + uxouts := make([]coin.UxOut, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxouts[i] = coin.UxOut{} + uxouts[i].Body.Address = addrs[i] + } + + headTime := uint64(time.Now().UTC().Unix()) + + type args struct { + addrs []string + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "invalid address", + args{ + addrs: []string{"fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4C"}, + }, + MakeErrorResponse(ErrCodeInvalidParams, "invalid address: fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4C"), + }, + { + "invalid params: empty addresses", + args{}, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "single address", + args{ + addrs: []string{addrs[0].String()}, + gateway: &fakeGateway{uxouts: uxouts}, + }, + makeSuccessResponse("1", OutputsResult{filterOut(headTime, uxouts[:], func(out coin.UxOut) bool { + return out.Body.Address == addrs[0] + })}), + }, + { + "multiple addresses", + args{ + addrs: []string{addrs[0].String(), addrs[1].String()}, + gateway: &fakeGateway{uxouts: uxouts}, + }, + makeSuccessResponse("1", OutputsResult{filterOut(headTime, uxouts, func(out coin.UxOut) bool { + return out.Body.Address == addrs[0] || out.Body.Address == addrs[1] + })}), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + params, err := json.Marshal(tt.args.addrs) + require.NoError(t, err) + req := Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_outputs", + Params: params, + } + + got := getOutputsHandler(req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/status.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/status.go new file mode 100755 index 0000000..e128f3a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/status.go @@ -0,0 +1,36 @@ +package webrpc + +import ( + "fmt" +) + +// StatusResult result struct of get_status +type StatusResult struct { + Running bool `json:"running"` + BlockNum uint64 `json:"num_of_blocks"` + LastBlockHash string `json:"hash_of_last_block"` + TimeSinceLastBlock string `json:"time_since_last_block"` +} + +func getStatusHandler(req Request, gw Gatewayer) Response { + if len(req.Params) > 0 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + blocks, err := gw.GetLastBlocks(1) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + if len(blocks.Blocks) == 0 { + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + + b := blocks.Blocks[0] + return makeSuccessResponse(req.ID, StatusResult{ + Running: true, + BlockNum: b.Head.BkSeq + 1, + LastBlockHash: b.Head.BlockHash, + TimeSinceLastBlock: fmt.Sprintf("%vs", gw.GetTimeNow()-b.Head.Time), + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/status_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/status_test.go new file mode 100755 index 0000000..3fb8730 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/status_test.go @@ -0,0 +1,116 @@ +package webrpc + +import ( + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +var lastBlockStr = ` +{ + "blocks": [ + { + "header": { + "seq": 571, + "block_hash": "8b677839c52d04f3d33373d2c39ac8f2c9ec2cbaf15cbd5d12e5d9557c9705bf", + "previous_block_hash": "e2074ed9e090a8770dc3c53f27262762ce006e0ddec3c81f823b6b2790aa256e", + "timestamp": 1482970140, + "fee": 13004, + "version": 0, + "tx_body_hash": "dc486954796df209bda87947e5c877445c3d4508485e83ddf407f4505366bf74" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "dc486954796df209bda87947e5c877445c3d4508485e83ddf407f4505366bf74", + "inner_hash": "8fc6b76d6e861e719142507baccd3c75d4eb09ee76856084be20af31b3db6220", + "sigs": [ + "6df7b96b463bdc354054ef5ac3a8b4fe7586e8cc55ffa50f05d973bd9d228a0c4566f101f29f5e66765e9ecc0893e18a114e8b75503174c193206dc8f0267ece01", + "e79c4a98cce98dac4d9aca7bda7f98b202521ff61f4abd521673c1ca0394b87f75dc55eded93c8f87ebf71eb2b69195b6a8a99410753da7200dda43844b199d701" + ], + "inputs": [ + "93b907eb6c22475322b19f9812d065cde8635986267b85960d8bd7521f7622d6", + "37469c7964ae16f2f29a2afdc94fd6b8db217a00161ceeac5c0b59d92f652d41" + ], + "outputs": [ + { + "uxid": "a4131b92b3629fe9614f840986d56ed0d85c9d26839430468fc005fe689b0523", + "dst": "Yk1kPnXauZDLBS4ZoA3SFv6avR2HoqAaHP", + "coins": "5", + "hours": 0 + }, + { + "uxid": "ea9c516eb27f8ee1793cbc9ef6b0a9a18e521ab974887a3e45f679da81a6fa6c", + "dst": "fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B", + "coins": "55", + "hours": 0 + } + ] + } + ] + } + } + ] + }` + +func Test_getStatusHandler(t *testing.T) { + b := decodeBlock(lastBlockStr) + now := time.Now().Unix() + m := NewGatewayerMock() + m.On("GetLastBlocks", uint64(1)).Return(b, nil) + m.On("GetTimeNow").Return(uint64(now)) + + type args struct { + req Request + in1 Gatewayer + } + + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Method: "get_status", + Jsonrpc: jsonRPC, + }, + in1: m, + }, + makeSuccessResponse("1", StatusResult{ + Running: true, + BlockNum: b.Blocks[0].Head.BkSeq + 1, + LastBlockHash: b.Blocks[0].Head.BlockHash, + TimeSinceLastBlock: fmt.Sprintf("%vs", uint64(now)-b.Blocks[0].Head.Time), + }), + }, + { + "invalid params", + args{ + req: Request{ + ID: "1", + Method: "get_status", + Jsonrpc: jsonRPC, + Params: []byte(`{"abc": "123"}`), + }, + in1: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getStatusHandler(tt.args.req, tt.args.in1) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction.go new file mode 100755 index 0000000..1eda056 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction.go @@ -0,0 +1,83 @@ +package webrpc + +import ( + "encoding/hex" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" +) + +// TxnResult wraps the daemon.TransactionResult +type TxnResult struct { + Transaction *daemon.TransactionResult `json:"transaction"` +} + +// TxIDJson wraps txid with json tags +type TxIDJson struct { + Txid string `json:"txid"` +} + +func getTransactionHandler(req Request, gateway Gatewayer) Response { + var txid []string + if err := req.DecodeParams(&txid); err != nil { + logger.Critical().Errorf("decode params failed: %v", err) + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(txid) != 1 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + t, err := cipher.SHA256FromHex(txid[0]) + if err != nil { + logger.Critical().Errorf("decode txid err: %v", err) + return MakeErrorResponse(ErrCodeInvalidParams, "invalid transaction hash") + } + txn, err := gateway.GetTransaction(t) + if err != nil { + logger.Debug(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + + if txn == nil { + return MakeErrorResponse(ErrCodeInvalidRequest, "transaction doesn't exist") + } + + tx, err := daemon.NewTransactionResult(txn) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + + return makeSuccessResponse(req.ID, TxnResult{tx}) +} + +func injectTransactionHandler(req Request, gateway Gatewayer) Response { + var rawtx []string + if err := req.DecodeParams(&rawtx); err != nil { + logger.Critical().Errorf("decode params failed: %v", err) + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(rawtx) != 1 { + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + b, err := hex.DecodeString(rawtx[0]) + if err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, fmt.Sprintf("invalid raw transaction: %v", err)) + } + + txn, err := coin.TransactionDeserialize(b) + if err != nil { + return MakeErrorResponse(ErrCodeInvalidParams, fmt.Sprintf("%v", err)) + } + + if err := gateway.InjectBroadcastTransaction(txn); err != nil { + return MakeErrorResponse(ErrCodeInternalError, fmt.Sprintf("inject transaction failed: %v", err)) + } + + return makeSuccessResponse(req.ID, TxIDJson{txn.Hash().Hex()}) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction_test.go new file mode 100755 index 0000000..a3fa4b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/transaction_test.go @@ -0,0 +1,225 @@ +package webrpc + +import ( + "encoding/hex" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" +) + +const ( + rawTxStr = "dc00000000a8558b814926ed0062cd720a572bd67367aa0d01c0769ea4800adcc89cdee524010000008756e4bde4ee1c725510a6a9a308c6a90d949de7785978599a87faba601d119f27e1be695cbb32a1e346e5dd88653a97006bf1a93c9673ac59cf7b5db7e07901000100000079216473e8f2c17095c6887cc9edca6c023afedfac2e0c5460e8b6f359684f8b020000000060dfa95881cdc827b45a6d49b11dbc152ecd4de640420f00000000000000000000000000006409744bcacb181bf98b1f02a11e112d7e4fa9f940f1f23a000000000000000000000000" + rawTxID = "bdc4a85a3e9d17a8fe00aa7430d0347c7f1dd6480a16da7147b6e43905057d43" + txHeight = uint64(103) + txConfirmed = true +) + +func decodeRawTransaction(rawTxStr string) *visor.Transaction { + rawTx, err := hex.DecodeString(rawTxStr) + if err != nil { + panic(fmt.Sprintf("invalid raw transaction:%v", err)) + } + + tx := coin.MustTransactionDeserialize(rawTx) + return &visor.Transaction{ + Txn: tx, + Status: visor.TransactionStatus{ + Confirmed: txConfirmed, + Height: txHeight, + }, + } +} + +func Test_getTransactionHandler(t *testing.T) { + type args struct { + req Request + gateway Gatewayer + } + + tx := decodeRawTransaction(rawTxStr) + rbTx, err := visor.NewReadableTransaction(tx) + require.NoError(t, err) + txRlt := daemon.TransactionResult{ + Status: visor.TransactionStatus{ + Confirmed: true, + Height: 103, + }, + Transaction: *rbTx, + } + + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_transaction", + Params: []byte(fmt.Sprintf(`["%s"]`, rawTxID)), + }, + gateway: &fakeGateway{transactions: map[string]string{ + rawTxID: rawTxStr, + }}, + }, + makeSuccessResponse("1", TxnResult{&txRlt}), + }, + { + "transaction hash not exist", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_transaction", + Params: []byte(`["bdc4a85a3e9d17a8fe00aa7430d0347c7f1dd6480a16da7147b6e43905057d44"]`), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidRequest, "transaction doesn't exist"), + }, + { + "invalid params: invalid transaction hash", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_transaction", + Params: []byte(`["bdc4a85a3e9d17a8fe00aa7430d0347c7f1dd6480a16da7147b6e43905057d4h"]`), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, "invalid transaction hash"), + }, + { + "invalid params: decode failed", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_transaction", + Params: []byte("aoo"), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "empty params", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_transaction", + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getTransactionHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} + +func Test_injectTransactionHandler(t *testing.T) { + var rawTx = `dc0000000010e05181fd4023f865a84359bf72a304e687b6f00e42f93ad9a4b8ee5a64aabc01000000dcb5b236eecd97a36c7d0a0b8ed68bb5df6274433a51fddf911f02f3926d20bf6eaabdc21529b7696f498545b06cc7e69f2f08b4dc5fa823c5b3f03da06794a300010000006d8a9c89177ce5e9d3b4b59fff67c00f0471fdebdfbb368377841b03fc7d688b02000000005771eeda2e253697cf5368f16fe05210d5cd319040420f0000000000af010000000000000060dfa95881cdc827b45a6d49b11dbc152ecd4de600093d0000000000af01000000000000` + var txid = "3e52703a21bf9462799f52ab0cedb314efcf7c43aadb815429cd79f35f040954" + + type args struct { + req Request + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "inject_transaction", + Params: []byte(fmt.Sprintf("[%q]", rawTx)), + }, + gateway: &fakeGateway{ + injectRawTxMap: map[string]bool{ + txid: true, + }, + }, + }, + makeSuccessResponse("1", TxIDJson{txid}), + }, + { + "invalid params: invalid raw transaction", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "inject_transaction", + Params: []byte(`["abcdeffedca"]`), + }, + }, + MakeErrorResponse(ErrCodeInvalidParams, "invalid raw transaction: encoding/hex: odd length hex string"), + }, + { + "invalid params type", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "inject_transaction", + Params: []byte("abcdeffedca"), + }, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "invalid params: more than one raw transaction", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "inject_transaction", + Params: []byte(fmt.Sprintf("[%q,%q]", rawTx, rawTx)), + }, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "internal error", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "inject_transaction", + Params: []byte(fmt.Sprintf("[%q]", rawTx)), + }, + gateway: &fakeGateway{}, + }, + MakeErrorResponse(ErrCodeInternalError, "inject transaction failed: fake gateway inject transaction failed"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := injectTransactionHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout.go new file mode 100755 index 0000000..809c600 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout.go @@ -0,0 +1,54 @@ +package webrpc + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +// AddrUxoutResult the address uxout json format +type AddrUxoutResult struct { + Address string `json:"address"` + UxOuts []*historydb.UxOutJSON `json:"uxouts"` +} + +func getAddrUxOutsHandler(req Request, gateway Gatewayer) Response { + var addrs []string + if err := req.DecodeParams(&addrs); err != nil { + logger.Critical().Errorf("decode params failed: %v", err) + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + if len(addrs) == 0 { + logger.Error("empty request params") + return MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams) + } + + results := make([]AddrUxoutResult, len(addrs)) + + for i, addr := range addrs { + // decode address + a, err := cipher.DecodeBase58Address(addr) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInvalidParams, fmt.Sprintf("%v", err)) + } + results[i].Address = addr + uxouts, err := gateway.GetAddrUxOuts([]cipher.Address{a}) + if err != nil { + logger.Error(err) + return MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError) + } + + //Convert slice UxOut to slice of UxOutJson + uxs := make([]*historydb.UxOutJSON, len(uxouts)) + for i, ux := range uxouts { + uxs[i] = historydb.NewUxOutJSON(ux) + } + + results[i].UxOuts = append(results[i].UxOuts, uxs...) + } + + return makeSuccessResponse(req.ID, &results) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout_test.go new file mode 100755 index 0000000..c69b017 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/uxout_test.go @@ -0,0 +1,171 @@ +package webrpc + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func Test_getAddrUxOutsHandler(t *testing.T) { + m, mockData := newUxOutMock() + type args struct { + req Request + gateway Gatewayer + } + tests := []struct { + name string + args args + want Response + }{ + // TODO: Add test cases. + { + "normal", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`["2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT"]`), + }, + gateway: m, + }, + makeSuccessResponse("1", []AddrUxoutResult{{ + Address: "2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT", + UxOuts: mockData("2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT")}}), + }, + { + "internal server error", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`["fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B"]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInternalError, ErrMsgInternalError), + }, + { + "invalid address length", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`["fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4BBB"]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, "Invalid address length"), + }, + { + "invalid address version", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`["111X5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B"]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, "Invalid address length"), + }, + { + "invalid params", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`[]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + { + "decode params error", + args{ + req: Request{ + ID: "1", + Jsonrpc: jsonRPC, + Method: "get_address_uxouts", + Params: []byte(`[invalid params]`), + }, + gateway: m, + }, + MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidParams), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getAddrUxOutsHandler(tt.args.req, tt.args.gateway) + require.Equal(t, tt.want, got) + }) + } +} + +func newUxOutMock() (*GatewayerMock, func(addr string) []*historydb.UxOutJSON) { + m := NewGatewayerMock() + + hash, _ := cipher.SHA256FromHex("31a21a4dd8331ce68756ddbb21f2c66279d5f5526e936f550e49e29b840ac1ff") + address, _ := cipher.DecodeBase58Address("2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT") + srcTxHash, _ := cipher.SHA256FromHex("ec9e876d4bb33beec203de769b0d3b23de21052de0e4df06b1444bcfec773c46") + + mockData := map[string]struct { + ret []*historydb.UxOut + err error + }{ + "2kmKohJrwURrdcVtDNaWK6hLCNsWWbJhTqT": { + []*historydb.UxOut{ + { + Out: coin.UxOut{ + Head: coin.UxHead{ + Time: 1482042899, + BkSeq: 562, + }, + Body: coin.UxBody{ + SrcTransaction: srcTxHash, + Address: address, + Coins: 1000000, + Hours: 0, + }, + }, + SpentTxID: hash, + SpentBlockSeq: 563, + }, + }, + nil, + }, + "fyqX5YuwXMUs4GEUE3LjLyhrqvNztFHQ4B": { + nil, + errors.New("internal server error"), + }, + } + + for addr, d := range mockData { + a := cipher.MustDecodeBase58Address(addr) + m.On("GetAddrUxOuts", []cipher.Address{a}).Return(d.ret, d.err) + } + + f := func(addr string) []*historydb.UxOutJSON { + // Convert UxOut to UxOutJson for handler test + uxouts := mockData[addr].ret + uxs := make([]*historydb.UxOutJSON, len(uxouts)) + + for i, ux := range uxouts { + uxs[i] = historydb.NewUxOutJSON(ux) + } + + return uxs + } + return m, f +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc.go new file mode 100755 index 0000000..042ab56 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc.go @@ -0,0 +1,217 @@ +package webrpc + +import ( + "bytes" + "encoding/json" + "fmt" + "net/http" + "strings" + + wh "github.com/skycoin/skycoin/src/util/http" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + // ErrCodeParseError parse JSON error + ErrCodeParseError = -32700 // Parse error Invalid JSON was received by the server. An error occurred on the server while parsing the JSON text. + // ErrCodeInvalidRequest invalid JSON object format + ErrCodeInvalidRequest = -32600 // Invalid Request The JSON sent is not a valid Request object. + // ErrCodeMethodNotFound unknown method + ErrCodeMethodNotFound = -32601 // Method not found The method does not exist / is not available. + // ErrCodeInvalidParams invalid method parameters + ErrCodeInvalidParams = -32602 // Invalid params Invalid method parameter(s). + // ErrCodeInternalError internal error + ErrCodeInternalError = -32603 // Internal error Internal JSON-RPC error. + + // ErrMsgParseError parse error message + ErrMsgParseError = "Parse error" + // ErrMsgMethodNotFound method not found message + ErrMsgMethodNotFound = "Method not found" + // ErrMsgInvalidParams invalid params message + ErrMsgInvalidParams = "Invalid params" + // ErrMsgInternalError internal error message + ErrMsgInternalError = "Internal error" + // ErrMsgNotPost not an HTTP POST request message + ErrMsgNotPost = "only support http POST" + // ErrMsgInvalidJsonrpc invalid jsonrpc message + ErrMsgInvalidJsonrpc = "invalid jsonrpc" + + // -32000 to -32099 Server error Reserved for implementation-defined server-errors. + + jsonRPC = "2.0" + + logger = logging.MustGetLogger("webrpc") +) + +// Request rpc request struct +type Request struct { + ID string `json:"id"` + Jsonrpc string `json:"jsonrpc"` + Method string `json:"method"` + Params json.RawMessage `json:"params,omitempty"` +} + +// RPCError response error +type RPCError struct { + Code int `json:"code"` + Message string `json:"message"` + Data string `json:"data,omitempty"` +} + +func (e RPCError) Error() string { + return fmt.Sprintf("%s [code: %d]", e.Message, e.Code) +} + +// Response rpc response struct +type Response struct { + ID *string `json:"id"` + Jsonrpc string `json:"jsonrpc"` + Error *RPCError `json:"error,omitempty"` + Result json.RawMessage `json:"result,omitempty"` +} + +// NewRequest create new webrpc request. +func NewRequest(method string, params interface{}, id string) (*Request, error) { + var p json.RawMessage + if params != nil { + var err error + p, err = json.Marshal(params) + if err != nil { + return nil, err + } + } + + return &Request{ + Jsonrpc: jsonRPC, + Method: method, + Params: p, + ID: id, + }, nil +} + +// DecodeParams decodes request params to specific value. +func (r *Request) DecodeParams(v interface{}) error { + return json.NewDecoder(bytes.NewBuffer(r.Params)).Decode(v) +} + +func makeSuccessResponse(id string, result interface{}) Response { + // TODO -- don't ignore error + rlt, _ := json.Marshal(result) + return Response{ + ID: &id, + Result: rlt, + Jsonrpc: jsonRPC, + } +} + +// MakeErrorResponse creates an error Response +func MakeErrorResponse(code int, msg string, msgs ...string) Response { + msg = strings.Join(append([]string{msg}, msgs[:]...), "\n") + return Response{ + Error: &RPCError{Code: code, Message: msg}, + Jsonrpc: jsonRPC, + } +} + +// HandlerFunc represents the function type for processing the request +type HandlerFunc func(req Request, gateway Gatewayer) Response + +// WebRPC manage the web rpc state and handles +type WebRPC struct { + Gateway Gatewayer + handlers map[string]HandlerFunc +} + +// New returns a new WebRPC object +func New(gw Gatewayer) (*WebRPC, error) { + rpc := &WebRPC{ + Gateway: gw, + handlers: make(map[string]HandlerFunc), + } + + if err := rpc.initHandlers(); err != nil { + return nil, err + } + + return rpc, nil +} + +// initHandlers initialize webrpc handlers +func (rpc *WebRPC) initHandlers() error { + handles := map[string]HandlerFunc{ + // get service status + "get_status": getStatusHandler, + // get blocks by seq + "get_blocks_by_seq": getBlocksBySeqHandler, + // get last N blocks + "get_lastblocks": getLastBlocksHandler, + // get blocks in specific seq range + "get_blocks": getBlocksHandler, + // get unspent outputs of address + "get_outputs": getOutputsHandler, + // get transaction by txid + "get_transaction": getTransactionHandler, + // broadcast transaction + "inject_transaction": injectTransactionHandler, + // get address affected uxouts + "get_address_uxouts": getAddrUxOutsHandler, + } + + // register handlers + for path, handle := range handles { + if err := rpc.HandleFunc(path, handle); err != nil { + return err + } + } + + return nil +} + +// HandleFunc registers handler function +func (rpc *WebRPC) HandleFunc(method string, h HandlerFunc) error { + if _, ok := rpc.handlers[method]; ok { + return fmt.Errorf("%s method already exist", method) + } + + rpc.handlers[method] = h + return nil +} + +// Handler processes the http request +func (rpc *WebRPC) Handler(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + res := MakeErrorResponse(ErrCodeInvalidRequest, ErrMsgNotPost) + logger.Error("Only POST is allowed") + wh.SendJSONOr500(logger, w, &res) + return + } + + req := Request{} + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + res := MakeErrorResponse(ErrCodeParseError, ErrMsgParseError) + logger.WithError(err).Error("Invalid request body") + wh.SendJSONOr500(logger, w, &res) + return + } + + if req.Jsonrpc != jsonRPC { + res := MakeErrorResponse(ErrCodeInvalidParams, ErrMsgInvalidJsonrpc) + logger.Error("Invalid JSON-RPC version") + wh.SendJSONOr500(logger, w, &res) + return + } + + var res Response + if handler, ok := rpc.handlers[req.Method]; ok { + logger.Infof("Handling method: %s", req.Method) + res = handler(req, rpc.Gateway) + } else { + res = MakeErrorResponse(ErrCodeMethodNotFound, ErrMsgMethodNotFound) + } + + if res.Error != nil { + logger.Errorf("%d %s", res.Error.Code, res.Error.Message) + } + + wh.SendJSONOr500(logger, w, &res) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc_test.go new file mode 100755 index 0000000..4442db8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc/webrpc_test.go @@ -0,0 +1,110 @@ +package webrpc + +import ( + "encoding/hex" + "encoding/json" + "errors" + "testing" + + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +func setupWebRPC(t *testing.T) *WebRPC { + rpc, err := New(&fakeGateway{}) + require.NoError(t, err) + return rpc +} + +type fakeGateway struct { + transactions map[string]string + injectRawTxMap map[string]bool // key: transaction hash, value indicates whether the injectTransaction should return error. + injectedTransactions map[string]string + uxouts []coin.UxOut +} + +func (fg fakeGateway) GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) { // nolint: unparam + var blocks visor.ReadableBlocks + if err := json.Unmarshal([]byte(blockString), &blocks); err != nil { + return nil, err + } + + return &blocks, nil +} + +func (fg fakeGateway) GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) { + var blocks visor.ReadableBlocks + if start > end { + return nil, nil + } + + if err := json.Unmarshal([]byte(blockString), &blocks); err != nil { + return nil, err + } + + return &blocks, nil +} + +func (fg fakeGateway) GetBlocksInDepth(vs []uint64) (*visor.ReadableBlocks, error) { + return nil, nil +} + +func (fg fakeGateway) GetUnspentOutputs(filters ...daemon.OutputsFilter) (*visor.ReadableOutputSet, error) { + outs := []coin.UxOut{} + for _, f := range filters { + outs = f(fg.uxouts) + } + + headTime := uint64(time.Now().UTC().Unix()) + + rbOuts, err := visor.NewReadableOutputs(headTime, outs) + if err != nil { + return nil, err + } + + return &visor.ReadableOutputSet{ + HeadOutputs: rbOuts, + }, nil +} + +func (fg fakeGateway) GetTransaction(txid cipher.SHA256) (*visor.Transaction, error) { + str, ok := fg.transactions[txid.Hex()] + if ok { + return decodeRawTransaction(str), nil + } + return nil, nil +} + +func (fg *fakeGateway) InjectBroadcastTransaction(txn coin.Transaction) error { + if _, v := fg.injectRawTxMap[txn.Hash().Hex()]; v { + if fg.injectedTransactions == nil { + fg.injectedTransactions = make(map[string]string) + } + fg.injectedTransactions[txn.Hash().Hex()] = hex.EncodeToString(txn.Serialize()) + return nil + } + + return errors.New("fake gateway inject transaction failed") +} + +func (fg fakeGateway) GetAddrUxOuts(addr []cipher.Address) ([]*historydb.UxOut, error) { + return nil, nil +} + +func (fg fakeGateway) GetTimeNow() uint64 { + return 0 +} + +func Test_rpcHandler_HandlerFunc(t *testing.T) { + rpc := setupWebRPC(t) + rpc.HandleFunc("get_status", getStatusHandler) + err := rpc.HandleFunc("get_status", getStatusHandler) + require.Error(t, err) +} diff --git a/vendor/github.com/skycoin/skycoin/src/api/webrpc_test.go b/vendor/github.com/skycoin/skycoin/src/api/webrpc_test.go new file mode 100755 index 0000000..44823bd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/api/webrpc_test.go @@ -0,0 +1,90 @@ +package api + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api/webrpc" +) + +func TestWebRPC(t *testing.T) { + type args struct { + httpMethod string + req webrpc.Request + } + + cases := []struct { + name string + status int + args args + want webrpc.Response + }{ + { + name: "http GET", + status: http.StatusOK, + args: args{ + httpMethod: http.MethodGet, + req: webrpc.Request{}, + }, + want: webrpc.Response{ + Jsonrpc: "2.0", + Error: &webrpc.RPCError{ + Code: webrpc.ErrCodeInvalidRequest, + Message: webrpc.ErrMsgNotPost, + }, + }, + }, + { + name: "invalid jsonrpc", + status: http.StatusOK, + args: args{ + httpMethod: http.MethodPost, + req: webrpc.Request{ + ID: "1", + Jsonrpc: "1.0", + Method: "get_status", + }, + }, + want: webrpc.MakeErrorResponse(webrpc.ErrCodeInvalidParams, webrpc.ErrMsgInvalidJsonrpc), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + d, err := json.Marshal(tc.args.req) + require.NoError(t, err) + + req, err := http.NewRequest(tc.args.httpMethod, "/api/v1/webrpc", bytes.NewBuffer(d)) + require.NoError(t, err) + + csrfStore := &CSRFStore{ + Enabled: false, + } + + gateway := NewGatewayerMock() + gateway.On("IsCSPEnabled").Return(false) + handler := newServerMux(muxConfig{ + host: configuredHost, + appLoc: ".", + enableJSON20RPC: true, + }, gateway, csrfStore, nil) + + rr := httptest.NewRecorder() + handler.ServeHTTP(rr, req) + + require.Equal(t, tc.status, rr.Code) + + if rr.Code == http.StatusOK { + var res webrpc.Response + err = json.NewDecoder(rr.Body).Decode(&res) + require.NoError(t, err) + require.Equal(t, res, tc.want) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/address.go b/vendor/github.com/skycoin/skycoin/src/cipher/address.go new file mode 100755 index 0000000..b9c15cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/address.go @@ -0,0 +1,294 @@ +package cipher + +import ( + "bytes" + "errors" + "fmt" + "log" + + "github.com/skycoin/skycoin/src/cipher/base58" +) + +/* +Addresses are the Ripemd160 of the double SHA256 of the public key +- public key must be in compressed format + +In the block chain the address is 20+1 bytes +- the first byte is the version byte +- the next twenty bytes are RIPMD160(SHA256(SHA256(pubkey))) + +In base 58 format the address is 20+1+4 bytes +- the first 20 bytes are RIPMD160(SHA256(SHA256(pubkey))). +-- this is to allow for any prefix in vanity addresses +- the next byte is the version byte +- the next 4 bytes are a checksum +-- the first 4 bytes of the SHA256 of the 21 bytes that come before + +*/ + +// Checksum 4 bytes +type Checksum [4]byte + +// Address version is after Key to enable better vanity address generation +// Address stuct is a 25 byte with a 20 byte publickey hash, 1 byte address +// type and 4 byte checksum. +type Address struct { + Version byte //1 byte + Key Ripemd160 //20 byte pubkey hash +} + +// AddressFromPubKey creates Address from PubKey as ripemd160(sha256(sha256(pubkey))) +func AddressFromPubKey(pubKey PubKey) Address { + addr := Address{ + Version: 0, + Key: pubKey.ToAddressHash(), + } + return addr +} + +// AddressFromSecKey generates address from secret key +func AddressFromSecKey(secKey SecKey) Address { + return AddressFromPubKey(PubKeyFromSecKey(secKey)) +} + +// DecodeBase58Address creates an Address from its base58 encoding +func DecodeBase58Address(addr string) (Address, error) { + b, err := base58.Base582Hex(addr) + if err != nil { + return Address{}, err + } + return AddressFromBytes(b) +} + +// MustDecodeBase58Address creates an Address from its base58 encoding. Will panic if the addr is +// invalid +func MustDecodeBase58Address(addr string) Address { + a, err := DecodeBase58Address(addr) + if err != nil { + log.Panicf("Invalid address %s: %v", addr, err) + } + return a +} + +// BitcoinDecodeBase58Address decode bitcoin address from string +func BitcoinDecodeBase58Address(addr string) (Address, error) { + b, err := base58.Base582Hex(addr) + if err != nil { + return Address{}, err + } + return BitcoinAddressFromBytes(b) +} + +// BitcoinMustDecodeBase58Address must decodes bitcoin address from string +func BitcoinMustDecodeBase58Address(addr string) Address { + a, err := BitcoinDecodeBase58Address(addr) + if err != nil { + log.Panicf("Invalid address %s: %v", addr, err) + } + return a +} + +// AddressFromBytes converts []byte to an Address +func AddressFromBytes(b []byte) (addr Address, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("%v", r) + } + }() + + if len(b) != 20+1+4 { + return Address{}, errors.New("Invalid address length") + } + a := Address{} + copy(a.Key[0:20], b[0:20]) + a.Version = b[20] + + chksum := a.Checksum() + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != chksum { + return Address{}, errors.New("Invalid checksum") + } + + if a.Version != 0 { + return Address{}, errors.New("Invalid version") + } + + return a, nil +} + +// MustAddressFromBytes converts []byte to an Address, panicking on error +func MustAddressFromBytes(b []byte) (Address, error) { + addr, err := AddressFromBytes(b) + if err != nil { + panic(err) + } + + return addr, err +} + +// Null returns true if the address is null (0x0000....) +func (addr Address) Null() bool { + return addr == Address{} +} + +// Bytes return address as a byte slice +func (addr *Address) Bytes() []byte { + b := make([]byte, 20+1+4) + copy(b[0:20], addr.Key[0:20]) + b[20] = addr.Version + chksum := addr.Checksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// BitcoinBytes returns bitcoin address as byte slice +func (addr *Address) BitcoinBytes() []byte { + b := make([]byte, 20+1+4) + b[0] = addr.Version + copy(b[1:21], addr.Key[0:20]) + // b[20] = self.Version + chksum := addr.BitcoinChecksum() + copy(b[21:25], chksum[0:4]) + return b +} + +// Verify checks that the address appears valid for the public key +func (addr Address) Verify(key PubKey) error { + if addr.Version != 0x00 { + return errors.New("Address version invalid") + } + if addr.Key != key.ToAddressHash() { + return errors.New("Public key invalid for address") + } + return nil +} + +// String address as Base58 encoded string +// Returns address as printable +// version is first byte in binary format +// in printed address its key, version, checksum +func (addr Address) String() string { + return string(base58.Hex2Base58(addr.Bytes())) +} + +// BitcoinString convert bitcoin address to hex string +func (addr Address) BitcoinString() string { + return string(base58.Hex2Base58(addr.BitcoinBytes())) +} + +// Checksum returns Address Checksum which is the first 4 bytes of sha256(key+version) +func (addr *Address) Checksum() Checksum { + // Version comes after the address to support vanity addresses + r1 := append(addr.Key[:], []byte{addr.Version}...) + r2 := SumSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} + +// BitcoinChecksum bitcoin checksum +func (addr *Address) BitcoinChecksum() Checksum { + // Version comes after the address to support vanity addresses + r1 := append([]byte{addr.Version}, addr.Key[:]...) + r2 := DoubleSHA256(r1[:]) + c := Checksum{} + copy(c[:], r2[:len(c)]) + return c +} + +/* +Bitcoin Functions +*/ + +// BitcoinAddressFromPubkey prints the bitcoin address for a seckey +func BitcoinAddressFromPubkey(pubkey PubKey) string { + b1 := SumSHA256(pubkey[:]) + b2 := HashRipemd160(b1[:]) + b3 := append([]byte{byte(0)}, b2[:]...) + b4 := DoubleSHA256(b3) + b5 := append(b3, b4[0:4]...) + return string(base58.Hex2Base58(b5)) + // return Address{ + // Version: 0, + // Key: b2, + // } +} + +// BitcoinWalletImportFormatFromSeckey exports seckey in wallet import format +// key must be compressed +func BitcoinWalletImportFormatFromSeckey(seckey SecKey) string { + b1 := append([]byte{byte(0x80)}, seckey[:]...) + b2 := append(b1[:], []byte{0x01}...) + b3 := DoubleSHA256(b2) //checksum + b4 := append(b2, b3[0:4]...) + return string(base58.Hex2Base58(b4)) +} + +// BitcoinAddressFromBytes Returns an address given an Address.Bytes() +func BitcoinAddressFromBytes(b []byte) (Address, error) { + if len(b) != 20+1+4 { + return Address{}, errors.New("Invalid address length") + } + a := Address{} + copy(a.Key[0:20], b[1:21]) + a.Version = b[0] + + chksum := a.BitcoinChecksum() + var checksum [4]byte + copy(checksum[0:4], b[21:25]) + + if checksum != chksum { + return Address{}, errors.New("Invalid checksum") + } + + if a.Version != 0 { + return Address{}, errors.New("Invalid version") + } + + return a, nil +} + +// SecKeyFromWalletImportFormat extracts a seckey from wallet import format +func SecKeyFromWalletImportFormat(input string) (SecKey, error) { + b, err := base58.Base582Hex(input) + if err != nil { + return SecKey{}, err + } + + //1+32+1+4 + if len(b) != 38 { + //log.Printf("len= %v ", len(b)) + return SecKey{}, errors.New("invalid length") + } + if b[0] != 0x80 { + return SecKey{}, errors.New("first byte invalid") + } + + if b[1+32] != 0x01 { + return SecKey{}, errors.New("invalid 33rd byte") + } + + b2 := DoubleSHA256(b[0:34]) + chksum := b[34:38] + + if !bytes.Equal(chksum, b2[0:4]) { + return SecKey{}, errors.New("checksum fail") + } + + seckey := b[1:33] + if len(seckey) != 32 { + log.Panic("...") + } + return NewSecKey(b[1:33]), nil +} + +// MustSecKeyFromWalletImportFormat SecKeyFromWalletImportFormat or panic +func MustSecKeyFromWalletImportFormat(input string) SecKey { + seckey, err := SecKeyFromWalletImportFormat(input) + if err != nil { + log.Panicf("MustSecKeyFromWalletImportFormat, invalid seckey, %v", err) + } + return seckey +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/address_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/address_test.go new file mode 100755 index 0000000..29454cb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/address_test.go @@ -0,0 +1,281 @@ +package cipher + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher/base58" +) + +func TestMustDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + require.Panics(t, func() { MustDecodeBase58Address("") }) + require.Panics(t, func() { MustDecodeBase58Address("cascs") }) + b := a.Bytes() + h := string(base58.Hex2Base58(b[:len(b)/2])) + require.Panics(t, func() { MustDecodeBase58Address(h) }) + h = string(base58.Hex2Base58(b)) + require.NotPanics(t, func() { MustDecodeBase58Address(h) }) + a2 := MustDecodeBase58Address(h) + require.Equal(t, a, a2) + + require.NotPanics(t, func() { MustDecodeBase58Address(a.String()) }) + a2 = MustDecodeBase58Address(a.String()) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + badAddr := " " + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // preceding zeroes are invalid + badAddr = "000" + a.String() + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing whitespace is invalid + badAddr = a.String() + " " + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) + + // trailing zeroes are invalid + badAddr = a.String() + "000" + require.Panics(t, func() { MustDecodeBase58Address(badAddr) }) +} + +func TestDecodeBase58Address(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + require.NoError(t, a.Verify(p)) + + a2, err := DecodeBase58Address("") + require.Error(t, err) + a2, err = DecodeBase58Address("cascs") + require.Error(t, err) + b := a.Bytes() + h := string(base58.Hex2Base58(b[:len(b)/2])) + a2, err = DecodeBase58Address(h) + require.Error(t, err) + h = string(base58.Hex2Base58(b)) + a2, err = DecodeBase58Address(h) + require.NoError(t, err) + require.Equal(t, a, a2) + + as := a.String() + a2, err = DecodeBase58Address(as) + require.NoError(t, err) + require.Equal(t, a, a2) + + // preceding whitespace is invalid + as2 := " " + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // preceding zeroes are invalid + as2 = "000" + as + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing whitespace is invalid + as2 = as + " " + _, err = DecodeBase58Address(as2) + require.Error(t, err) + + // trailing zeroes are invalid + as2 = as + "000" + _, err = DecodeBase58Address(as2) + require.Error(t, err) +} + +func TestAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.Bytes() + _, err = AddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.Bytes() + _, err = AddressFromBytes(b) + require.EqualError(t, err, "Invalid version") +} + +func TestBitcoinAddressFromBytes(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := BitcoinAddressFromBytes(a.BitcoinBytes()) + require.NoError(t, err) + require.Equal(t, a2, a) + + // Invalid number of bytes + b := a.BitcoinBytes() + _, err = BitcoinAddressFromBytes(b[:len(b)-2]) + require.EqualError(t, err, "Invalid address length") + + // Invalid checksum + b[len(b)-1] += byte(1) + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid checksum") + + a.Version = 2 + b = a.BitcoinBytes() + _, err = BitcoinAddressFromBytes(b) + require.EqualError(t, err, "Invalid version") +} + +func TestAddressRoundtrip(t *testing.T) { + // Tests encode and decode + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + a2, err := AddressFromBytes(a.Bytes()) + require.NoError(t, err) + require.Equal(t, a, a2) + require.Equal(t, a.String(), a2.String()) +} + +func TestAddressVerify(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + // Valid pubkey+address + require.NoError(t, a.Verify(p)) + // Invalid pubkey + require.Error(t, a.Verify(PubKey{})) + p2, _ := GenerateKeyPair() + require.Error(t, a.Verify(p2)) + // Bad version + a.Version = 0x01 + require.Error(t, a.Verify(p)) +} + +func TestAddressString(t *testing.T) { + p, _ := GenerateKeyPair() + a := AddressFromPubKey(p) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + s2 := a2.String() + a3, err := DecodeBase58Address(s2) + require.NoError(t, err) + require.Equal(t, a2, a3) +} + +func TestBitcoinAddress1(t *testing.T) { + seckey := MustSecKeyFromHex("1111111111111111111111111111111111111111111111111111111111111111") + pubkey := PubKeyFromSecKey(seckey) + pubkeyStr := "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa" + require.Equal(t, pubkeyStr, pubkey.Hex()) + bitcoinStr := "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9" + bitcoinAddr := BitcoinAddressFromPubkey(pubkey) + require.Equal(t, bitcoinStr, bitcoinAddr) +} + +func TestBitcoinAddress2(t *testing.T) { + seckey := MustSecKeyFromHex("dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd") + pubkey := PubKeyFromSecKey(seckey) + pubkeyStr := "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd" + require.Equal(t, pubkeyStr, pubkey.Hex()) + bitcoinStr := "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a" + bitcoinAddr := BitcoinAddressFromPubkey(pubkey) + require.Equal(t, bitcoinStr, bitcoinAddr) +} + +func TestBitcoinAddress3(t *testing.T) { + seckey := MustSecKeyFromHex("47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012") + pubkey := PubKeyFromSecKey(seckey) + pubkeyStr := "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3" + require.Equal(t, pubkeyStr, pubkey.Hex()) + bitcoinStr := "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV" + bitcoinAddr := BitcoinAddressFromPubkey(pubkey) + require.Equal(t, bitcoinStr, bitcoinAddr) +} + +func TestBitcoinWIPRoundTrio(t *testing.T) { + + _, seckey1 := GenerateKeyPair() + wip1 := BitcoinWalletImportFormatFromSeckey(seckey1) + seckey2, err := SecKeyFromWalletImportFormat(wip1) + wip2 := BitcoinWalletImportFormatFromSeckey(seckey2) + + require.NoError(t, err) + require.Equal(t, seckey1, seckey2) + require.Equal(t, seckey1.Hex(), seckey2.Hex()) + require.Equal(t, wip1, wip2) + +} + +func TestBitcoinWIP(t *testing.T) { + //wallet input format string + var wip = []string{ + "KwntMbt59tTsj8xqpqYqRRWufyjGunvhSyeMo3NTYpFYzZbXJ5Hp", + "L4ezQvyC6QoBhxB4GVs9fAPhUKtbaXYUn8YTqoeXwbevQq4U92vN", + "KydbzBtk6uc7M6dXwEgTEH2sphZxSPbmDSz6kUUHi4eUpSQuhEbq", + } + //the expected pubkey to generate + var pub = []string{ + "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa", + "02ed83704c95d829046f1ac27806211132102c34e9ac7ffa1b71110658e5b9d1bd", + "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3", + } + //the expected addrss to generate + var addr = []string{ + "1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9", + "1NKRhS7iYUGTaAfaR5z8BueAJesqaTyc4a", + "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV", + } + + for i := range wip { + seckey, err := SecKeyFromWalletImportFormat(wip[i]) + require.Equal(t, nil, err) + _ = MustSecKeyFromWalletImportFormat(wip[i]) + pubkey := PubKeyFromSecKey(seckey) + require.Equal(t, pub[i], pubkey.Hex()) + bitcoinAddr := BitcoinAddressFromPubkey(pubkey) + require.Equal(t, addr[i], bitcoinAddr) + } + + /* + seckey := MustSecKeyFromHex("47f7616ea6f9b923076625b4488115de1ef1187f760e65f89eb6f4f7ff04b012") + pubkey := PubKeyFromSecKey(seckey) + pubkey_str := "032596957532fc37e40486b910802ff45eeaa924548c0e1c080ef804e523ec3ed3" + require.Equal(t, pubkey_str, pubkey.Hex()) + bitcoin_str := "19ck9VKC6KjGxR9LJg4DNMRc45qFrJguvV" + bitcoin_addr := BitcoinAddressFromPubkey(pubkey) + require.Equal(t, bitcoin_str, bitcoin_addr) + */ +} + +func TestAddressBulk(t *testing.T) { + + for i := 0; i < 1024; i++ { + pub, _ := GenerateDeterministicKeyPair(RandByte(32)) + + a := AddressFromPubKey(pub) + require.NoError(t, a.Verify(pub)) + s := a.String() + a2, err := DecodeBase58Address(s) + require.NoError(t, err) + require.Equal(t, a2, a) + + } +} + +func TestAddressNull(t *testing.T) { + var a Address + require.True(t, a.Null()) + + p, _ := GenerateKeyPair() + a = AddressFromPubKey(p) + require.False(t, a.Null()) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE new file mode 100755 index 0000000..a6a0607 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2012 ThePiachu. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * The name of ThePiachu may not be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +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/skycoin/skycoin/src/cipher/base58/base58.go b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58.go new file mode 100755 index 0000000..aaa8b62 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/base58/base58.go @@ -0,0 +1,226 @@ +// Copyright 2011 ThePiachu. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package base58 + +//Subpackage for encoding data (namely Bitcoin Addresses) into base58 strings + +import ( + "encoding/hex" + "errors" + "math/big" +) + +//Useful materials: +//https://en.bitcoin.it/wiki/Base_58_Encoding +//http://www.strongasanox.co.uk/2011/03/11/base58-encoding-in-python/ + +//alphabet used by Bitcoins +var alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" + +// Base58 type to hold the Base58 string +type Base58 string + +//reverse alphabet used for quckly converting base58 strings into numbers +var revalp = map[string]int{ + "1": 0, "2": 1, "3": 2, "4": 3, "5": 4, "6": 5, "7": 6, "8": 7, "9": 8, "A": 9, + "B": 10, "C": 11, "D": 12, "E": 13, "F": 14, "G": 15, "H": 16, "J": 17, "K": 18, "L": 19, + "M": 20, "N": 21, "P": 22, "Q": 23, "R": 24, "S": 25, "T": 26, "U": 27, "V": 28, "W": 29, + "X": 30, "Y": 31, "Z": 32, "a": 33, "b": 34, "c": 35, "d": 36, "e": 37, "f": 38, "g": 39, + "h": 40, "i": 41, "j": 42, "k": 43, "m": 44, "n": 45, "o": 46, "p": 47, "q": 48, "r": 49, + "s": 50, "t": 51, "u": 52, "v": 53, "w": 54, "x": 55, "y": 56, "z": 57, +} + +// Hex2Big converts hex to big +func Hex2Big(b []byte) *big.Int { + answer := big.NewInt(0) + + for i := 0; i < len(b); i++ { + answer.Lsh(answer, 8) + answer.Add(answer, big.NewInt(int64(b[i]))) + } + + return answer +} + +// String2Hex converts string to hex +func String2Hex(s string) []byte { + answer, _ := hex.DecodeString(s) + return answer +} + +// ToBig convert base58 to big.Int +func (b Base58) ToBig() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errors.New("Invalid base58 character") + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// ToInt converts base58 to int +func (b Base58) ToInt() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errors.New("Invalid base58 character") + } + answer += c //add value of the current letter + } + return answer, nil +} + +//ToHex converts base58 to hex bytes +func (b Base58) ToHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + oneCount := 0 + bs := string(b) + if len(bs) == 0 { + return nil, errors.New("Invalid base58 string") + } + for bs[oneCount] == '1' { + oneCount++ + if oneCount >= len(bs) { + return nil, errors.New("Invalid base58 string") + } + } + //convert big.Int to bytes + return append(make([]byte, oneCount), value.Bytes()...), nil +} + +// Base582Big converts base58 to big +func (b Base58) Base582Big() (*big.Int, error) { + answer := new(big.Int) + for i := 0; i < len(b); i++ { + answer.Mul(answer, big.NewInt(58)) //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return nil, errors.New("Invalid base58 character") + } + answer.Add(answer, big.NewInt(int64(c))) //add value of the current letter + } + return answer, nil +} + +// Base582Int converts base58 to int +func (b Base58) Base582Int() (int, error) { + answer := 0 + for i := 0; i < len(b); i++ { + answer *= 58 //multiply current value by 58 + c, ok := revalp[string(b[i:i+1])] + if !ok { + return 0, errors.New("Invalid base58 character") + } + answer += c //add value of the current letter + } + return answer, nil +} + +// Base582Hex converts base58 to hex bytes +func Base582Hex(b string) ([]byte, error) { + return Base58(b).ToHex() +} + +// BitHex converts base58 to hexes used by Bitcoins (keeping the zeroes on the front, 25 bytes long) +func (b Base58) BitHex() ([]byte, error) { + value, err := b.ToBig() //convert to big.Int + if err != nil { + return nil, err + } + + tmp := value.Bytes() //convert to hex bytes + if len(tmp) == 25 { //if it is exactly 25 bytes, return + return tmp, nil + } else if len(tmp) > 25 { //if it is longer than 25, return nothing + return nil, errors.New("base58 invalid length") + } + answer := make([]byte, 25) //make 25 byte container + for i := 0; i < len(tmp); i++ { //copy converted bytes + answer[24-i] = tmp[len(tmp)-1-i] + } + return answer, nil +} + +// Big2Base58 encodes big.Int to base58 string +func Big2Base58(val *big.Int) Base58 { + answer := "" + valCopy := new(big.Int).Abs(val) //copies big.Int + + if val.Cmp(big.NewInt(0)) <= 0 { //if it is less than 0, returns empty string + return Base58("") + } + + tmpStr := "" + tmp := new(big.Int) + for valCopy.Cmp(big.NewInt(0)) > 0 { //converts the number into base58 + tmp.Mod(valCopy, big.NewInt(58)) //takes modulo 58 value + valCopy.Div(valCopy, big.NewInt(58)) //divides the rest by 58 + tmpStr += alphabet[tmp.Int64() : tmp.Int64()+1] //encodes + } + for i := (len(tmpStr) - 1); i > -1; i-- { + answer += tmpStr[i : i+1] //reverses the order + } + return Base58(answer) //returns +} + +// Int2Base58 encodes int to base58 string +func Int2Base58(val int) Base58 { + answer := "" + + if val <= 0 { //if it is less than 0, returns empty string + return Base58("") + } + valCopy := val + + tmpStr := "" + tmp := 0 + for valCopy > 0 { //converts the number into base58 + tmp = valCopy % 58 //takes modulo 58 value + valCopy /= 58 //divides the rest by 58 + + tmpStr += alphabet[tmp : tmp+1] //encodes + } + for i := (len(tmpStr) - 1); i > -1; i-- { + answer += tmpStr[i : i+1] //reverses the order + } + + return Base58(answer) //returns +} + +// Hex2Base58 encodes hex bytes into base58 +func Hex2Base58(val []byte) Base58 { + tmp := Big2Base58(Hex2Big(val)) //encoding of the number without zeroes in front + + //looking for zeros at the beginning + i := 0 + for i = 0; val[i] == 0 && i < len(val); i++ { + } + answer := "" + for j := 0; j < i; j++ { //adds zeroes from the front + answer += alphabet[0:1] + } + answer += string(tmp) //concatenates + + return Base58(answer) //returns +} + +// Hex2Base58String converts hex to Base58 string +func Hex2Base58String(val []byte) string { + return string(Hex2Base58(val)) +} + +// Hex2Base58Str converts hex to Base58 string +func Hex2Base58Str(val []byte) string { + return string(Hex2Base58(val)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go new file mode 100755 index 0000000..b3a33ae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305.go @@ -0,0 +1,83 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20poly1305 implements the ChaCha20-Poly1305 AEAD as specified in RFC 7539. +package chacha20poly1305 // import "github.com/skycoin/skycoin/src/cipher/chacha20poly1305" + +import ( + "crypto/cipher" + "errors" +) + +const ( + // KeySize is the size of the key used by this AEAD, in bytes. + KeySize = 32 + // NonceSize is the size of the nonce used with this AEAD, in bytes. + NonceSize = 12 +) + +type chacha20poly1305 struct { + key [32]byte +} + +// New returns a ChaCha20-Poly1305 AEAD that uses the given, 256-bit key. +func New(key []byte) (cipher.AEAD, error) { + if len(key) != KeySize { + return nil, errors.New("chacha20poly1305: bad key length") + } + ret := new(chacha20poly1305) + copy(ret.key[:], key) + return ret, nil +} + +func (c *chacha20poly1305) NonceSize() int { + return NonceSize +} + +func (c *chacha20poly1305) Overhead() int { + return 16 +} + +func (c *chacha20poly1305) Seal(dst, nonce, plaintext, additionalData []byte) []byte { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Seal") + } + + if uint64(len(plaintext)) > (1<<38)-64 { + panic("chacha20poly1305: plaintext too large") + } + + return c.seal(dst, nonce, plaintext, additionalData) +} + +var errOpen = errors.New("chacha20poly1305: message authentication failed") + +func (c *chacha20poly1305) Open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + if len(nonce) != NonceSize { + panic("chacha20poly1305: bad nonce length passed to Open") + } + if len(ciphertext) < 16 { + return nil, errOpen + } + if uint64(len(ciphertext)) > (1<<38)-48 { + panic("chacha20poly1305: ciphertext too large") + } + + return c.open(dst, nonce, ciphertext, additionalData) +} + +// sliceForAppend takes a slice and a requested number of bytes. It returns a +// slice with the contents of the given slice followed by that many bytes and a +// second slice that aliases into it and contains only the extra bytes. If the +// original slice has sufficient capacity then no allocation is performed. +func sliceForAppend(in []byte, n int) (head, tail []byte) { + if total := len(in) + n; cap(in) >= total { + head = in[:total] + } else { + head = make([]byte, total) + copy(head, in) + } + tail = head[len(in):] + return +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go new file mode 100755 index 0000000..7cd7ad8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_amd64.go @@ -0,0 +1,127 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7,amd64,!gccgo,!appengine + +package chacha20poly1305 + +import "encoding/binary" + +//go:noescape +func chacha20Poly1305Open(dst []byte, key []uint32, src, ad []byte) bool + +//go:noescape +func chacha20Poly1305Seal(dst []byte, key []uint32, src, ad []byte) + +// cpuid is implemented in chacha20poly1305_amd64.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in chacha20poly1305_amd64.s. +func xgetbv() (eax, edx uint32) + +var ( + useASM bool + useAVX2 bool +) + +func init() { + detectCPUFeatures() +} + +// detectCPUFeatures is used to detect if cpu instructions +// used by the functions implemented in assembler in +// chacha20poly1305_amd64.s are supported. +func detectCPUFeatures() { + maxID, _, _, _ := cpuid(0, 0) + if maxID < 1 { + return + } + + _, _, ecx1, _ := cpuid(1, 0) + + haveSSSE3 := isSet(9, ecx1) + useASM = haveSSSE3 + + haveOSXSAVE := isSet(27, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if haveOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + haveAVX := isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + haveAVX2 := isSet(5, ebx7) && haveAVX + haveBMI2 := isSet(8, ebx7) + + useAVX2 = haveAVX2 && haveBMI2 +} + +// isSet checks if bit at bitpos is set in value. +func isSet(bitpos uint, value uint32) bool { + return value&(1<+0x00(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 +// <<< 16 with PSHUFB +DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A +DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 +DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A +// <<< 8 with PSHUFB +DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B +DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 +DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B + +DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 +DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 +DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 + +DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 +DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 +DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 +// Poly1305 key clamp +DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF +DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF + +DATA ·sseIncMask<>+0x00(SB)/8, $0x1 +DATA ·sseIncMask<>+0x08(SB)/8, $0x0 +// To load/store the last < 16 bytes in a buffer +DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 +DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff +DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff +DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff + +GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 +GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 +GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 +GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 +GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 +// No PALIGNR in Go ASM yet (but VPALIGNR is present). +#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 +#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 +#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 +#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 +#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 +#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 +#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 +#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 +#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 +#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 +#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 +#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 +#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 +#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 +#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 +#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 +#define shiftC0Right shiftC0Left +#define shiftC1Right shiftC1Left +#define shiftC2Right shiftC2Left +#define shiftC3Right shiftC3Left +#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 +#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 +#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 +#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 +// Some macros +#define chachaQR(A, B, C, D, T) \ + PADDD B, A; PXOR A, D; PSHUFB ·rol16<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ + PADDD B, A; PXOR A, D; PSHUFB ·rol8<>(SB), D \ + PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B + +#define chachaQR_AVX2(A, B, C, D, T) \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ + VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ + VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B + +#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 +#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX +#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 +#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t2:t3; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 + +#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 +#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 +#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 + +#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage +#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage +// ---------------------------------------------------------------------------- +TEXT polyHashADInternal<>(SB), NOSPLIT, $0 + // adp points to beginning of additional data + // itr2 holds ad length + XORQ acc0, acc0 + XORQ acc1, acc1 + XORQ acc2, acc2 + CMPQ itr2, $13 + JNE hashADLoop + +openFastTLSAD: + // Special treatment for the TLS case of 13 bytes + MOVQ (adp), acc0 + MOVQ 5(adp), acc1 + SHRQ $24, acc1 + MOVQ $1, acc2 + polyMul + RET + +hashADLoop: + // Hash in 16 byte chunks + CMPQ itr2, $16 + JB hashADTail + polyAdd(0(adp)) + LEAQ (1*16)(adp), adp + SUBQ $16, itr2 + polyMul + JMP hashADLoop + +hashADTail: + CMPQ itr2, $0 + JE hashADDone + + // Hash last < 16 byte tail + XORQ t0, t0 + XORQ t1, t1 + XORQ t2, t2 + ADDQ itr2, adp + +hashADTailLoop: + SHLQ $8, t1:t0 + SHLQ $8, t0 + MOVB -1(adp), t2 + XORQ t2, t0 + DECQ adp + DECQ itr2 + JNE hashADTailLoop + +hashADTailFinish: + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Finished AD +hashADDone: + RET + +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Open(dst, key, src, ad []byte) bool +TEXT ·chacha20Poly1305Open(SB), 0, $288-97 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + // Check for AVX2 support + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Open_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE openSSE128 // About 16% faster + + // For long buffers, prepare the poly key first + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + MOVO D0, T1 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + MOVO D0, ctr3Store + MOVQ $10, itr2 + +openSSEPreparePolyKey: + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + DECQ itr2 + JNE openSSEPreparePolyKey + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore; MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSEMainLoop: + CMPQ inl, $256 + JB openSSEMainLoopDone + + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $4, itr1 + MOVQ inp, itr2 + +openSSEInternalLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(itr2)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(itr2), itr2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr1 + JGE openSSEInternalLoop + + polyAdd(0(itr2)) + polyMul + LEAQ (2*8)(itr2), itr2 + + CMPQ itr1, $-6 + JG openSSEInternalLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Load - xor - store + MOVO D3, tmpStore + MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) + MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) + MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) + MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) + MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) + MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) + MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) + MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) + MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) + MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) + MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) + MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) + MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) + MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) + LEAQ 256(inp), inp + LEAQ 256(oup), oup + SUBQ $256, inl + JMP openSSEMainLoop + +openSSEMainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $64 + JBE openSSETail64 + CMPQ inl, $128 + JBE openSSETail128 + CMPQ inl, $192 + JBE openSSETail192 + JMP openSSETail256 + +openSSEFinalize: + // Hash in the PT, AAD lengths + ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally, constant time compare to the tag at the end of the message + XORQ AX, AX + MOVQ $1, DX + XORQ (0*8)(inp), acc0 + XORQ (1*8)(inp), acc1 + ORQ acc1, acc0 + CMOVQEQ DX, AX + + // Return true iff tags are equal + MOVB AX, ret+96(FP) + RET + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 129 bytes +openSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +openSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE openSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore; MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openSSE128Open: + CMPQ inl, $16 + JB openSSETail16 + SUBQ $16, inl + + // Load for hashing + polyAdd(0(inp)) + + // Load for decryption + MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP openSSE128Open + +openSSETail16: + TESTQ inl, inl + JE openSSEFinalize + + // We can safely load the CT from the end, because it is padded with the MAC + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVOU (inp), T0 + ADDQ inl, inp + PAND -16(t0)(itr2*1), T0 + MOVO T0, 0+tmpStore + MOVQ T0, t0 + MOVQ 8+tmpStore, t1 + PXOR A1, T0 + + // We can only store one byte at a time, since plaintext can be shorter than 16 bytes +openSSETail16Store: + MOVQ T0, t3 + MOVB t3, (oup) + PSRLDQ $1, T0 + INCQ oup + DECQ inl + JNE openSSETail16Store + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + JMP openSSEFinalize + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of ciphertext +openSSETail64: + // Need to decrypt up to 64 bytes - prepare single block + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + XORQ itr2, itr2 + MOVQ inl, itr1 + CMPQ itr1, $16 + JB openSSETail64LoopB + +openSSETail64LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + SUBQ $16, itr1 + +openSSETail64LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0) + shiftB0Left; shiftC0Left; shiftD0Left + chachaQR(A0, B0, C0, D0, T0) + shiftB0Right; shiftC0Right; shiftD0Right + + CMPQ itr1, $16 + JAE openSSETail64LoopA + + CMPQ itr2, $160 + JNE openSSETail64LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + +openSSETail64DecLoop: + CMPQ inl, $16 + JB openSSETail64DecLoopDone + SUBQ $16, inl + MOVOU (inp), T0 + PXOR T0, A0 + MOVOU A0, (oup) + LEAQ 16(inp), inp + LEAQ 16(oup), oup + MOVO B0, A0 + MOVO C0, B0 + MOVO D0, C0 + JMP openSSETail64DecLoop + +openSSETail64DecLoopDone: + MOVO A0, A1 + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openSSETail128: + // Need to decrypt up to 128 bytes - prepare two blocks + MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSETail128LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + CMPQ itr2, itr1 + JB openSSETail128LoopA + + CMPQ itr2, $160 + JNE openSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr1Store, D0; PADDL ctr0Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + + SUBQ $64, inl + LEAQ 64(inp), inp + LEAQ 64(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of ciphertext +openSSETail192: + // Need to decrypt up to 192 bytes - prepare three blocks + MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store + MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store + + MOVQ inl, itr1 + MOVQ $160, itr2 + CMPQ itr1, $160 + CMOVQGT itr2, itr1 + ANDQ $-16, itr1 + XORQ itr2, itr2 + +openSSLTail192LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMul + +openSSLTail192LoopB: + ADDQ $16, itr2 + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + CMPQ itr2, itr1 + JB openSSLTail192LoopA + + CMPQ itr2, $160 + JNE openSSLTail192LoopB + + CMPQ inl, $176 + JB openSSLTail192Store + + polyAdd(160(inp)) + polyMul + + CMPQ inl, $192 + JB openSSLTail192Store + + polyAdd(176(inp)) + polyMul + +openSSLTail192Store: + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 + MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) + + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + SUBQ $128, inl + LEAQ 128(inp), inp + LEAQ 128(oup), oup + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openSSETail256: + // Need to decrypt up to 256 bytes - prepare four blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + XORQ itr2, itr2 + +openSSETail256Loop: + // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication + polyAdd(0(inp)(itr2*1)) + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulStage3 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + ADDQ $2*8, itr2 + CMPQ itr2, $160 + JB openSSETail256Loop + MOVQ inl, itr1 + ANDQ $-16, itr1 + +openSSETail256HashLoop: + polyAdd(0(inp)(itr2*1)) + polyMul + ADDQ $2*8, itr2 + CMPQ itr2, itr1 + JB openSSETail256HashLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + LEAQ 192(inp), inp + LEAQ 192(oup), oup + SUBQ $192, inl + MOVO A3, A0 + MOVO B3, B0 + MOVO C3, C0 + MOVO tmpStore, D0 + + JMP openSSETail64DecLoop + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Open_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimization, for very short buffers + CMPQ inl, $192 + JBE openAVX2192 + CMPQ inl, $320 + JBE openAVX2320 + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, state2StoreAVX2 + VMOVDQA DD0, ctr3StoreAVX2 + MOVQ $10, itr2 + +openAVX2PreparePolyKey: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + DECQ itr2 + JNE openAVX2PreparePolyKey + + VPADDD ·chacha20Constants<>(SB), AA0, AA0 + VPADDD state1StoreAVX2, BB0, BB0 + VPADDD state2StoreAVX2, CC0, CC0 + VPADDD ctr3StoreAVX2, DD0, DD0 + + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for the first 64 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + + // Hash AD + first 64 bytes + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +openAVX2InitialHash64: + polyAdd(0(inp)(itr1*1)) + polyMulAVX2 + ADDQ $16, itr1 + CMPQ itr1, $64 + JNE openAVX2InitialHash64 + + // Decrypt the first 64 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), BB0, BB0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU BB0, (1*32)(oup) + LEAQ (2*32)(inp), inp + LEAQ (2*32)(oup), oup + SUBQ $64, inl + +openAVX2MainLoop: + CMPQ inl, $512 + JB openAVX2MainLoopDone + + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + +openAVX2InternalLoop: + // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications + // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext + polyAdd(0*8(inp)(itr1*1)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(inp)(itr1*1)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(inp)(itr1*1)) + LEAQ (6*8)(itr1), itr1 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + CMPQ itr1, $480 + JNE openAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(480(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(496(inp)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + LEAQ (32*16)(oup), oup + SUBQ $(32*16), inl + JMP openAVX2MainLoop + +openAVX2MainLoopDone: + // Handle the various tail sizes efficiently + TESTQ inl, inl + JE openSSEFinalize + CMPQ inl, $128 + JBE openAVX2Tail128 + CMPQ inl, $256 + JBE openAVX2Tail256 + CMPQ inl, $384 + JBE openAVX2Tail384 + JMP openAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +openAVX2192: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +openAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE openAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +openAVX2ShortOpen: + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + +openAVX2ShortOpenLoop: + CMPQ inl, $32 + JB openAVX2ShortTail32 + SUBQ $32, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + polyAdd(2*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP openAVX2ShortOpenLoop + +openAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2ShortDone + + SUBQ $16, inl + + // Load for hashing + polyAdd(0*8(inp)) + polyMulAVX2 + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2ShortDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +openAVX2320: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +openAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE openAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP openAVX2ShortOpen + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +openAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD1 + VMOVDQA DD1, DD0 + + XORQ itr2, itr2 + MOVQ inl, itr1 + ANDQ $-16, itr1 + TESTQ itr1, itr1 + JE openAVX2Tail128LoopB + +openAVX2Tail128LoopA: + // Perform ChaCha rounds, while hashing the remaining input + polyAdd(0(inp)(itr2*1)) + polyMulAVX2 + +openAVX2Tail128LoopB: + ADDQ $16, itr2 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail128LoopA + CMPQ itr2, $160 + JNE openAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC1, CC1 + VPADDD DD0, DD1, DD1 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + +openAVX2TailLoop: + CMPQ inl, $32 + JB openAVX2Tail + SUBQ $32, inl + + // Load for decryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + LEAQ (1*32)(oup), oup + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + JMP openAVX2TailLoop + +openAVX2Tail: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB openAVX2TailDone + SUBQ $16, inl + + // Load for decryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +openAVX2TailDone: + VZEROUPPER + JMP openSSETail16 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +openAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare four blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + + // Compute the number of iterations that will hash data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $128, itr1 + SHRQ $4, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + +openAVX2Tail256LoopA: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + CMPQ itr2, itr1 + JB openAVX2Tail256LoopA + + CMPQ itr2, $10 + JNE openAVX2Tail256LoopB + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + + // Hash the remainder of data (if any) +openAVX2Tail256Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail256HashEnd + polyAdd (0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail256Hash + +// Store 128 bytes safely, then go to store loop +openAVX2Tail256HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + + VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 + VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) + LEAQ (4*32)(inp), inp + LEAQ (4*32)(oup), oup + SUBQ $4*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +openAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare six blocks + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, ctr0StoreAVX2 + VMOVDQA DD1, ctr1StoreAVX2 + VMOVDQA DD2, ctr2StoreAVX2 + + // Compute the number of iterations that will hash two blocks of data + MOVQ inl, tmpStoreAVX2 + MOVQ inl, itr1 + SUBQ $256, itr1 + SHRQ $4, itr1 + ADDQ $6, itr1 + MOVQ $10, itr2 + CMPQ itr1, $10 + CMOVQGT itr2, itr1 + MOVQ inp, inl + XORQ itr2, itr2 + + // Perform ChaCha rounds, while hashing the remaining input +openAVX2Tail384LoopB: + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + +openAVX2Tail384LoopA: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + polyAdd(0(inl)) + polyMulAVX2 + LEAQ 16(inl), inl + INCQ itr2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + + CMPQ itr2, itr1 + JB openAVX2Tail384LoopB + + CMPQ itr2, $10 + JNE openAVX2Tail384LoopA + + MOVQ inl, itr2 + SUBQ inp, inl + MOVQ inl, itr1 + MOVQ tmpStoreAVX2, inl + +openAVX2Tail384Hash: + ADDQ $16, itr1 + CMPQ itr1, inl + JGT openAVX2Tail384HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + JMP openAVX2Tail384Hash + +// Store 256 bytes safely, then go to store loop +openAVX2Tail384HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + LEAQ (8*32)(inp), inp + LEAQ (8*32)(oup), oup + SUBQ $8*32, inl + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +openAVX2Tail512: + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + XORQ itr1, itr1 + MOVQ inp, itr2 + +openAVX2Tail512LoopB: + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ (2*8)(itr2), itr2 + +openAVX2Tail512LoopA: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(itr2)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(itr2)) + polyMulAVX2 + LEAQ (4*8)(itr2), itr2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + INCQ itr1 + CMPQ itr1, $4 + JLT openAVX2Tail512LoopB + + CMPQ itr1, $10 + JNE openAVX2Tail512LoopA + + MOVQ inl, itr1 + SUBQ $384, itr1 + ANDQ $-16, itr1 + +openAVX2Tail512HashLoop: + TESTQ itr1, itr1 + JE openAVX2Tail512HashEnd + polyAdd(0(itr2)) + polyMulAVX2 + LEAQ 16(itr2), itr2 + SUBQ $16, itr1 + JMP openAVX2Tail512HashLoop + +openAVX2Tail512HashEnd: + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + LEAQ (12*32)(inp), inp + LEAQ (12*32)(oup), oup + SUBQ $12*32, inl + + JMP openAVX2TailLoop + +// ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// func chacha20Poly1305Seal(dst, key, src, ad []byte) +TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 + // For aligned stack access + MOVQ SP, BP + ADDQ $32, BP + ANDQ $-32, BP + MOVQ dst+0(FP), oup + MOVQ key+24(FP), keyp + MOVQ src+48(FP), inp + MOVQ src_len+56(FP), inl + MOVQ ad+72(FP), adp + + CMPB ·useAVX2(SB), $1 + JE chacha20Poly1305Seal_AVX2 + + // Special optimization, for very short buffers + CMPQ inl, $128 + JBE sealSSE128 // About 15% faster + + // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration + MOVOU ·chacha20Constants<>(SB), A0 + MOVOU (1*16)(keyp), B0 + MOVOU (2*16)(keyp), C0 + MOVOU (3*16)(keyp), D0 + + // Store state on stack for future use + MOVO B0, state1Store + MOVO C0, state2Store + + // Load state, increment counter blocks + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVQ $10, itr2 + +sealSSEIntroLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JNE sealSSEIntroLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + + // Clamp and store the key + PAND ·polyClampMask<>(SB), A0 + MOVO A0, rStore + MOVO B0, sStore + + // Hash AAD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) + + MOVQ $128, itr1 + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 + + CMPQ inl, $64 + JBE sealSSE128SealHash + + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) + + ADDQ $64, itr1 + SUBQ $64, inl + LEAQ 64(inp), inp + + MOVQ $2, itr1 + MOVQ $8, itr2 + + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + CMPQ inl, $192 + JBE sealSSETail192 + +sealSSEMainLoop: + // Load state, increment counter blocks + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + + // Store counters + MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + +sealSSEInnerLoop: + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyAdd(0(oup)) + shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left + shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left + shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left + polyMulStage1 + polyMulStage2 + LEAQ (2*8)(oup), oup + MOVO C3, tmpStore + chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) + MOVO tmpStore, C3 + MOVO C1, tmpStore + polyMulStage3 + chachaQR(A3, B3, C3, D3, C1) + MOVO tmpStore, C1 + polyMulReduceStage + shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right + shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right + shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right + DECQ itr2 + JGE sealSSEInnerLoop + polyAdd(0(oup)) + polyMul + LEAQ (2*8)(oup), oup + DECQ itr1 + JG sealSSEInnerLoop + + // Add in the state + PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 + PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 + PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 + PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + MOVO D3, tmpStore + + // Load - xor - store + MOVOU (0*16)(inp), D3; PXOR D3, A0 + MOVOU (1*16)(inp), D3; PXOR D3, B0 + MOVOU (2*16)(inp), D3; PXOR D3, C0 + MOVOU (3*16)(inp), D3; PXOR D3, D0 + MOVOU A0, (0*16)(oup) + MOVOU B0, (1*16)(oup) + MOVOU C0, (2*16)(oup) + MOVOU D0, (3*16)(oup) + MOVO tmpStore, D3 + + MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 + PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 + PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 + MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) + ADDQ $192, inp + MOVQ $192, itr1 + SUBQ $192, inl + MOVO A3, A1 + MOVO B3, B1 + MOVO C3, C1 + MOVO D3, D1 + CMPQ inl, $64 + JBE sealSSE128SealHash + MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 + PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 + MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) + LEAQ 64(inp), inp + SUBQ $64, inl + MOVQ $6, itr1 + MOVQ $4, itr2 + CMPQ inl, $192 + JG sealSSEMainLoop + + MOVQ inl, itr1 + TESTQ inl, inl + JE sealSSE128SealHash + MOVQ $6, itr1 + CMPQ inl, $64 + JBE sealSSETail64 + CMPQ inl, $128 + JBE sealSSETail128 + JMP sealSSETail192 + +// ---------------------------------------------------------------------------- +// Special optimization for the last 64 bytes of plaintext +sealSSETail64: + // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A1 + MOVO state1Store, B1 + MOVO state2Store, C1 + MOVO ctr3Store, D1 + PADDL ·sseIncMask<>(SB), D1 + MOVO D1, ctr0Store + +sealSSETail64LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail64LoopB: + chachaQR(A1, B1, C1, D1, T1) + shiftB1Left; shiftC1Left; shiftD1Left + chachaQR(A1, B1, C1, D1, T1) + shiftB1Right; shiftC1Right; shiftD1Right + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + DECQ itr1 + JG sealSSETail64LoopA + + DECQ itr2 + JGE sealSSETail64LoopB + PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B1 + PADDL state2Store, C1 + PADDL ctr0Store, D1 + + JMP sealSSE128Seal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of plaintext +sealSSETail128: + // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + +sealSSETail128LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail128LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + + DECQ itr1 + JG sealSSETail128LoopA + + DECQ itr2 + JGE sealSSETail128LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 + PADDL state1Store, B0; PADDL state1Store, B1 + PADDL state2Store, C0; PADDL state2Store, C1 + PADDL ctr0Store, D0; PADDL ctr1Store, D1 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + + MOVQ $64, itr1 + LEAQ 64(inp), inp + SUBQ $64, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 192 bytes of plaintext +sealSSETail192: + // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes + MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + +sealSSETail192LoopA: + // Perform ChaCha rounds, while hashing the previously encrypted ciphertext + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealSSETail192LoopB: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftC0Left; shiftD0Left + shiftB1Left; shiftC1Left; shiftD1Left + shiftB2Left; shiftC2Left; shiftD2Left + + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftC0Right; shiftD0Right + shiftB1Right; shiftC1Right; shiftD1Right + shiftB2Right; shiftC2Right; shiftD2Right + + DECQ itr1 + JG sealSSETail192LoopA + + DECQ itr2 + JGE sealSSETail192LoopB + + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 + PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 + PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 + + MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 + PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 + MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) + MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 + PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 + MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) + + MOVO A2, A1 + MOVO B2, B1 + MOVO C2, C1 + MOVO D2, D1 + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + + JMP sealSSE128SealHash + +// ---------------------------------------------------------------------------- +// Special seal optimization for buffers smaller than 129 bytes +sealSSE128: + // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks + MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 + MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 + MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 + MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 + MOVQ $10, itr2 + +sealSSE128InnerCipherLoop: + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Left; shiftB1Left; shiftB2Left + shiftC0Left; shiftC1Left; shiftC2Left + shiftD0Left; shiftD1Left; shiftD2Left + chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) + shiftB0Right; shiftB1Right; shiftB2Right + shiftC0Right; shiftC1Right; shiftC2Right + shiftD0Right; shiftD1Right; shiftD2Right + DECQ itr2 + JNE sealSSE128InnerCipherLoop + + // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded + PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 + PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 + PADDL T2, C1; PADDL T2, C2 + PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PAND ·polyClampMask<>(SB), A0 + MOVOU A0, rStore + MOVOU B0, sStore + + // Hash + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealSSE128SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealSSE128Seal + polyAdd(0(oup)) + polyMul + + SUBQ $16, itr1 + ADDQ $16, oup + + JMP sealSSE128SealHash + +sealSSE128Seal: + CMPQ inl, $16 + JB sealSSETail + SUBQ $16, inl + + // Load for decryption + MOVOU (inp), T0 + PXOR T0, A1 + MOVOU A1, (oup) + LEAQ (1*16)(inp), inp + LEAQ (1*16)(oup), oup + + // Extract for hashing + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + // Shift the stream "left" + MOVO B1, A1 + MOVO C1, B1 + MOVO D1, C1 + MOVO A2, D1 + MOVO B2, A2 + MOVO C2, B2 + MOVO D2, C2 + JMP sealSSE128Seal + +sealSSETail: + TESTQ inl, inl + JE sealSSEFinalize + + // We can only load the PT one byte at a time to avoid read after end of buffer + MOVQ inl, itr2 + SHLQ $4, itr2 + LEAQ ·andMask<>(SB), t0 + MOVQ inl, itr1 + LEAQ -1(inp)(inl*1), inp + XORQ t2, t2 + XORQ t3, t3 + XORQ AX, AX + +sealSSETailLoadLoop: + SHLQ $8, t2, t3 + SHLQ $8, t2 + MOVB (inp), AX + XORQ AX, t2 + LEAQ -1(inp), inp + DECQ itr1 + JNE sealSSETailLoadLoop + MOVQ t2, 0+tmpStore + MOVQ t3, 8+tmpStore + PXOR 0+tmpStore, A1 + MOVOU A1, (oup) + MOVOU -16(t0)(itr2*1), T0 + PAND T0, A1 + MOVQ A1, t0 + PSRLDQ $8, A1 + MOVQ A1, t1 + ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 + polyMul + + ADDQ inl, oup + +sealSSEFinalize: + // Hash in the buffer lengths + ADDQ ad_len+80(FP), acc0 + ADCQ src_len+56(FP), acc1 + ADCQ $1, acc2 + polyMul + + // Final reduce + MOVQ acc0, t0 + MOVQ acc1, t1 + MOVQ acc2, t2 + SUBQ $-5, acc0 + SBBQ $-1, acc1 + SBBQ $3, acc2 + CMOVQCS t0, acc0 + CMOVQCS t1, acc1 + CMOVQCS t2, acc2 + + // Add in the "s" part of the key + ADDQ 0+sStore, acc0 + ADCQ 8+sStore, acc1 + + // Finally store the tag at the end of the message + MOVQ acc0, (0*8)(oup) + MOVQ acc1, (1*8)(oup) + RET + +// ---------------------------------------------------------------------------- +// ------------------------- AVX2 Code ---------------------------------------- +chacha20Poly1305Seal_AVX2: + VZEROUPPER + VMOVDQU ·chacha20Constants<>(SB), AA0 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 + BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 + BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 + VPADDD ·avx2InitMask<>(SB), DD0, DD0 + + // Special optimizations, for very short buffers + CMPQ inl, $192 + JBE seal192AVX2 // 33% faster + CMPQ inl, $320 + JBE seal320AVX2 // 17% faster + + // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream + VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 + VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 + VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr2 + +sealAVX2IntroLoop: + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr2 + JNE sealAVX2IntroLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + + VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 + VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key + VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), DD0, DD0 + VMOVDQA DD0, rsStoreAVX2 + + // Hash AD + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + + // Can store at least 320 bytes + VPXOR (0*32)(inp), AA0, AA0 + VPXOR (1*32)(inp), CC0, CC0 + VMOVDQU AA0, (0*32)(oup) + VMOVDQU CC0, (1*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 + VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 + VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) + + MOVQ $320, itr1 + SUBQ $320, inl + LEAQ 320(inp), inp + + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 + CMPQ inl, $128 + JBE sealAVX2SealHash + + VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 + VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) + SUBQ $128, inl + LEAQ 128(inp), inp + + MOVQ $8, itr1 + MOVQ $2, itr2 + + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + CMPQ inl, $512 + JBE sealAVX2Tail512 + + // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 + VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 + VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 + VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 + + VMOVDQA CC3, tmpStoreAVX2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) + VMOVDQA tmpStoreAVX2, CC3 + VMOVDQA CC1, tmpStoreAVX2 + chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) + VMOVDQA tmpStoreAVX2, CC1 + + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 + VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 + VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 + VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + + SUBQ $16, oup // Adjust the pointer + MOVQ $9, itr1 + JMP sealAVX2InternalLoopStart + +sealAVX2MainLoop: + // Load state, increment counter blocks, store the incremented counters + VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + MOVQ $10, itr1 + +sealAVX2InternalLoop: + polyAdd(0*8(oup)) + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage1_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulStage2_AVX2 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyMulStage3_AVX2 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + +sealAVX2InternalLoopStart: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + polyAdd(2*8(oup)) + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage1_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage2_AVX2 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + polyMulStage3_AVX2 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + polyMulReduceStage + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(4*8(oup)) + LEAQ (6*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulStage1_AVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + polyMulStage2_AVX2 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + polyMulStage3_AVX2 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyMulReduceStage + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + DECQ itr1 + JNE sealAVX2InternalLoop + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + + // We only hashed 480 of the 512 bytes available - hash the remaining 32 here + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 + VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 + VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + // and here + polyAdd(-2*8(oup)) + polyMulAVX2 + VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 + VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) + LEAQ (32*16)(inp), inp + SUBQ $(32*16), inl + CMPQ inl, $512 + JG sealAVX2MainLoop + + // Tail can only hash 480 bytes + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ 32(oup), oup + + MOVQ $10, itr1 + MOVQ $0, itr2 + CMPQ inl, $128 + JBE sealAVX2Tail128 + CMPQ inl, $256 + JBE sealAVX2Tail256 + CMPQ inl, $384 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 193 bytes +seal192AVX2: + // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks + VMOVDQA AA0, AA1 + VMOVDQA BB0, BB1 + VMOVDQA CC0, CC1 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2 + VMOVDQA BB0, BB2 + VMOVDQA CC0, CC2 + VMOVDQA DD0, DD2 + VMOVDQA DD1, TT3 + MOVQ $10, itr2 + +sealAVX2192InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr2 + JNE sealAVX2192InnerCipherLoop + VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 + VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 + VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 + VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + + // Clamp and store poly key + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 192 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + +sealAVX2ShortSeal: + // Hash aad + MOVQ ad_len+80(FP), itr2 + CALL polyHashADInternal<>(SB) + XORQ itr1, itr1 + +sealAVX2SealHash: + // itr1 holds the number of bytes encrypted but not yet hashed + CMPQ itr1, $16 + JB sealAVX2ShortSealLoop + polyAdd(0(oup)) + polyMul + SUBQ $16, itr1 + ADDQ $16, oup + JMP sealAVX2SealHash + +sealAVX2ShortSealLoop: + CMPQ inl, $32 + JB sealAVX2ShortTail32 + SUBQ $32, inl + + // Load for encryption + VPXOR (inp), AA0, AA0 + VMOVDQU AA0, (oup) + LEAQ (1*32)(inp), inp + + // Now can hash + polyAdd(0*8(oup)) + polyMulAVX2 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (1*32)(oup), oup + + // Shift stream left + VMOVDQA BB0, AA0 + VMOVDQA CC0, BB0 + VMOVDQA DD0, CC0 + VMOVDQA AA1, DD0 + VMOVDQA BB1, AA1 + VMOVDQA CC1, BB1 + VMOVDQA DD1, CC1 + VMOVDQA AA2, DD1 + VMOVDQA BB2, AA2 + JMP sealAVX2ShortSealLoop + +sealAVX2ShortTail32: + CMPQ inl, $16 + VMOVDQA A0, A1 + JB sealAVX2ShortDone + + SUBQ $16, inl + + // Load for encryption + VPXOR (inp), A0, T0 + VMOVDQU T0, (oup) + LEAQ (1*16)(inp), inp + + // Hash + polyAdd(0*8(oup)) + polyMulAVX2 + LEAQ (1*16)(oup), oup + VPERM2I128 $0x11, AA0, AA0, AA0 + VMOVDQA A0, A1 + +sealAVX2ShortDone: + VZEROUPPER + JMP sealSSETail + +// ---------------------------------------------------------------------------- +// Special optimization for buffers smaller than 321 bytes +seal320AVX2: + // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks + VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 + MOVQ $10, itr2 + +sealAVX2320InnerCipherLoop: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr2 + JNE sealAVX2320InnerCipherLoop + + VMOVDQA ·chacha20Constants<>(SB), TT0 + VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 + VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 + VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 + VMOVDQA ·avx2IncMask<>(SB), TT0 + VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 + VPADDD TT3, DD2, DD2 + + // Clamp and store poly key + VPERM2I128 $0x02, AA0, BB0, TT0 + VPAND ·polyClampMask<>(SB), TT0, TT0 + VMOVDQA TT0, rsStoreAVX2 + + // Stream for up to 320 bytes + VPERM2I128 $0x13, AA0, BB0, AA0 + VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x02, AA1, BB1, CC0 + VPERM2I128 $0x02, CC1, DD1, DD0 + VPERM2I128 $0x13, AA1, BB1, AA1 + VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x02, AA2, BB2, CC1 + VPERM2I128 $0x02, CC2, DD2, DD1 + VPERM2I128 $0x13, AA2, BB2, AA2 + VPERM2I128 $0x13, CC2, DD2, BB2 + JMP sealAVX2ShortSeal + +// ---------------------------------------------------------------------------- +// Special optimization for the last 128 bytes of ciphertext +sealAVX2Tail128: + // Need to decrypt up to 128 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0 + VMOVDQA state1StoreAVX2, BB0 + VMOVDQA state2StoreAVX2, CC0 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VMOVDQA DD0, DD1 + +sealAVX2Tail128LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail128LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $12, DD0, DD0, DD0 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0 + VPALIGNR $8, CC0, CC0, CC0 + VPALIGNR $4, DD0, DD0, DD0 + DECQ itr1 + JG sealAVX2Tail128LoopA + DECQ itr2 + JGE sealAVX2Tail128LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA1 + VPADDD state1StoreAVX2, BB0, BB1 + VPADDD state2StoreAVX2, CC0, CC1 + VPADDD DD1, DD0, DD1 + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + JMP sealAVX2ShortSealLoop + +// ---------------------------------------------------------------------------- +// Special optimization for the last 256 bytes of ciphertext +sealAVX2Tail256: + // Need to decrypt up to 256 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD1 + VMOVDQA DD0, TT1 + VMOVDQA DD1, TT2 + +sealAVX2Tail256LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail256LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 + DECQ itr1 + JG sealAVX2Tail256LoopA + DECQ itr2 + JGE sealAVX2Tail256LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + MOVQ $128, itr1 + LEAQ 128(inp), inp + SUBQ $128, inl + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 384 bytes of ciphertext +sealAVX2Tail384: + // Need to decrypt up to 384 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 + VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + +sealAVX2Tail384LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail384LoopB: + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(0(oup)) + polyMul + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 + chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) + polyAdd(16(oup)) + polyMul + LEAQ 32(oup), oup + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 + DECQ itr1 + JG sealAVX2Tail384LoopA + DECQ itr2 + JGE sealAVX2Tail384LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 + VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 + VPERM2I128 $0x02, AA0, BB0, TT0 + VPERM2I128 $0x02, CC0, DD0, TT1 + VPERM2I128 $0x13, AA0, BB0, TT2 + VPERM2I128 $0x13, CC0, DD0, TT3 + VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 + VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) + VPERM2I128 $0x02, AA1, BB1, TT0 + VPERM2I128 $0x02, CC1, DD1, TT1 + VPERM2I128 $0x13, AA1, BB1, TT2 + VPERM2I128 $0x13, CC1, DD1, TT3 + VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 + VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) + MOVQ $256, itr1 + LEAQ 256(inp), inp + SUBQ $256, inl + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + + JMP sealAVX2SealHash + +// ---------------------------------------------------------------------------- +// Special optimization for the last 512 bytes of ciphertext +sealAVX2Tail512: + // Need to decrypt up to 512 bytes - prepare two blocks + // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed + // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed + VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 + VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 + VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 + VMOVDQA ctr3StoreAVX2, DD0 + VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 + VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + +sealAVX2Tail512LoopA: + polyAdd(0(oup)) + polyMul + LEAQ 16(oup), oup + +sealAVX2Tail512LoopB: + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + polyAdd(0*8(oup)) + polyMulAVX2 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + polyAdd(2*8(oup)) + polyMulAVX2 + LEAQ (4*8)(oup), oup + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 + VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 + VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 + VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 + VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 + VMOVDQA CC3, tmpStoreAVX2 + VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 + VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 + VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 + VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 + VMOVDQA tmpStoreAVX2, CC3 + VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 + VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 + VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 + + DECQ itr1 + JG sealAVX2Tail512LoopA + DECQ itr2 + JGE sealAVX2Tail512LoopB + + VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 + VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 + VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 + VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 + VMOVDQA CC3, tmpStoreAVX2 + VPERM2I128 $0x02, AA0, BB0, CC3 + VPXOR (0*32)(inp), CC3, CC3 + VMOVDQU CC3, (0*32)(oup) + VPERM2I128 $0x02, CC0, DD0, CC3 + VPXOR (1*32)(inp), CC3, CC3 + VMOVDQU CC3, (1*32)(oup) + VPERM2I128 $0x13, AA0, BB0, CC3 + VPXOR (2*32)(inp), CC3, CC3 + VMOVDQU CC3, (2*32)(oup) + VPERM2I128 $0x13, CC0, DD0, CC3 + VPXOR (3*32)(inp), CC3, CC3 + VMOVDQU CC3, (3*32)(oup) + + VPERM2I128 $0x02, AA1, BB1, AA0 + VPERM2I128 $0x02, CC1, DD1, BB0 + VPERM2I128 $0x13, AA1, BB1, CC0 + VPERM2I128 $0x13, CC1, DD1, DD0 + VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 + VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + + VPERM2I128 $0x02, AA2, BB2, AA0 + VPERM2I128 $0x02, CC2, DD2, BB0 + VPERM2I128 $0x13, AA2, BB2, CC0 + VPERM2I128 $0x13, CC2, DD2, DD0 + VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 + VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) + + MOVQ $384, itr1 + LEAQ 384(inp), inp + SUBQ $384, inl + VPERM2I128 $0x02, AA3, BB3, AA0 + VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 + VPERM2I128 $0x13, AA3, BB3, CC0 + VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 + + JMP sealAVX2SealHash + +// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), NOSPLIT, $0-24 + MOVL eaxArg+0(FP), AX + MOVL ecxArg+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv() (eax, edx uint32) +TEXT ·xgetbv(SB),NOSPLIT,$0-8 + MOVL $0, CX + XGETBV + MOVL AX, eax+0(FP) + MOVL DX, edx+4(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go new file mode 100755 index 0000000..6b6d99b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_generic.go @@ -0,0 +1,70 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +import ( + "encoding/binary" + + "github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20" + "github.com/skycoin/skycoin/src/cipher/poly1305" +) + +func roundTo16(n int) int { + return 16 * ((n + 15) / 16) +} + +func (c *chacha20poly1305) sealGeneric(dst, nonce, plaintext, additionalData []byte) []byte { + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + ret, out := sliceForAppend(dst, len(plaintext)+poly1305.TagSize) + counter[0] = 1 + chacha20.XORKeyStream(out, plaintext, &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(plaintext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], out[:len(plaintext)]) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(plaintext))) + + var tag [poly1305.TagSize]byte + poly1305.Sum(&tag, polyInput, &polyKey) + copy(out[len(plaintext):], tag[:]) + + return ret +} + +func (c *chacha20poly1305) openGeneric(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + var tag [poly1305.TagSize]byte + copy(tag[:], ciphertext[len(ciphertext)-16:]) + ciphertext = ciphertext[:len(ciphertext)-16] + + var counter [16]byte + copy(counter[4:], nonce) + + var polyKey [32]byte + chacha20.XORKeyStream(polyKey[:], polyKey[:], &counter, &c.key) + + polyInput := make([]byte, roundTo16(len(additionalData))+roundTo16(len(ciphertext))+8+8) + copy(polyInput, additionalData) + copy(polyInput[roundTo16(len(additionalData)):], ciphertext) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-16:], uint64(len(additionalData))) + binary.LittleEndian.PutUint64(polyInput[len(polyInput)-8:], uint64(len(ciphertext))) + + ret, out := sliceForAppend(dst, len(ciphertext)) + if !poly1305.Verify(&tag, polyInput, &polyKey) { + for i := range out { + out[i] = 0 + } + return nil, errOpen + } + + counter[0] = 1 + chacha20.XORKeyStream(out, ciphertext, &counter, &c.key) + return ret, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go new file mode 100755 index 0000000..4c2eb70 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_noasm.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64 !go1.7 gccgo appengine + +package chacha20poly1305 + +func (c *chacha20poly1305) seal(dst, nonce, plaintext, additionalData []byte) []byte { + return c.sealGeneric(dst, nonce, plaintext, additionalData) +} + +func (c *chacha20poly1305) open(dst, nonce, ciphertext, additionalData []byte) ([]byte, error) { + return c.openGeneric(dst, nonce, ciphertext, additionalData) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go new file mode 100755 index 0000000..78f981a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_test.go @@ -0,0 +1,182 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +import ( + "bytes" + cr "crypto/rand" + "encoding/hex" + mr "math/rand" + "testing" +) + +func TestVectors(t *testing.T) { + for i, test := range chacha20Poly1305Tests { + key, _ := hex.DecodeString(test.key) + nonce, _ := hex.DecodeString(test.nonce) + ad, _ := hex.DecodeString(test.aad) + plaintext, _ := hex.DecodeString(test.plaintext) + + aead, err := New(key) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce, plaintext, ad) + if ctHex := hex.EncodeToString(ct); ctHex != test.out { + t.Errorf("#%d: got %s, want %s", i, ctHex, test.out) + continue + } + + plaintext2, err := aead.Open(nil, nonce, ct, ad) + if err != nil { + t.Errorf("#%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("#%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce, ct, ad); err == nil { + t.Errorf("#%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func TestRandom(t *testing.T) { + // Some random tests to verify Open(Seal) == Plaintext + for i := 0; i < 256; i++ { + var nonce [12]byte + var key [32]byte + + al := mr.Intn(128) + pl := mr.Intn(16384) + ad := make([]byte, al) + plaintext := make([]byte, pl) + cr.Read(key[:]) + cr.Read(nonce[:]) + cr.Read(ad) + cr.Read(plaintext) + + aead, err := New(key[:]) + if err != nil { + t.Fatal(err) + } + + ct := aead.Seal(nil, nonce[:], plaintext, ad) + + plaintext2, err := aead.Open(nil, nonce[:], ct, ad) + if err != nil { + t.Errorf("Random #%d: Open failed", i) + continue + } + + if !bytes.Equal(plaintext, plaintext2) { + t.Errorf("Random #%d: plaintext's don't match: got %x vs %x", i, plaintext2, plaintext) + continue + } + + if len(ad) > 0 { + alterAdIdx := mr.Intn(len(ad)) + ad[alterAdIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering additional data", i) + } + ad[alterAdIdx] ^= 0x80 + } + + alterNonceIdx := mr.Intn(aead.NonceSize()) + nonce[alterNonceIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering nonce", i) + } + nonce[alterNonceIdx] ^= 0x80 + + alterCtIdx := mr.Intn(len(ct)) + ct[alterCtIdx] ^= 0x80 + if _, err := aead.Open(nil, nonce[:], ct, ad); err == nil { + t.Errorf("Random #%d: Open was successful after altering ciphertext", i) + } + ct[alterCtIdx] ^= 0x80 + } +} + +func benchamarkChaCha20Poly1305Seal(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var out []byte + + aead, _ := New(key[:]) + b.ResetTimer() + for i := 0; i < b.N; i++ { + out = aead.Seal(out[:0], nonce[:], buf[:], ad[:]) + } +} + +func benchamarkChaCha20Poly1305Open(b *testing.B, buf []byte) { + b.SetBytes(int64(len(buf))) + + var key [32]byte + var nonce [12]byte + var ad [13]byte + var ct []byte + var out []byte + + aead, _ := New(key[:]) + ct = aead.Seal(ct[:0], nonce[:], buf[:], ad[:]) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out, _ = aead.Open(out[:0], nonce[:], ct[:], ad[:]) + } +} + +func BenchmarkChacha20Poly1305Open_64(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Seal_64(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 64)) +} + +func BenchmarkChacha20Poly1305Open_1350(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Seal_1350(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 1350)) +} + +func BenchmarkChacha20Poly1305Open_8K(b *testing.B) { + benchamarkChaCha20Poly1305Open(b, make([]byte, 8*1024)) +} + +func BenchmarkChacha20Poly1305Seal_8K(b *testing.B) { + benchamarkChaCha20Poly1305Seal(b, make([]byte, 8*1024)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go new file mode 100755 index 0000000..49f0da6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/chacha20poly1305_vectors_test.go @@ -0,0 +1,332 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20poly1305 + +var chacha20Poly1305Tests = []struct { + plaintext, aad, key, nonce, out string +}{ + { + "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "50515253c0c1c2c3c4c5c6c7", + "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "070000004041424344454647", + "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b61161ae10b594f09e26a7e902ecbd0600691", + }, + { + "1400000cebccee3bf561b292340fec60", + "00000000000000001603030010", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2b487a2941bc07f3cc76d1a531662588ee7c2598e59778c24d5b27559a80d163", + }, + { + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "3f487a25aa70e9c8391763370569c9e83b7650dd1921c8b78869f241f25d2096c910b180930c5b8747fd90959fe8ca2dcadb4fa50fa1439f916b2301e1cc0810d6725775d3ab86721700f96e22709b0a7a8bef32627dd929b2dd3ba15772b669062bb558bc92e6c241a1d60d9f0035e80c335f854815fe1138ab8af653eab3e122135feeec7dfaba1cc24af82a2b7acccdd824899a7e03cc29c25be8a4f56a66673845b93bae1556f09dafc89a0d22af207718e2a6bb022e9d917597295992ea3b750cc0e7a7c3d33b23c5a8aeab45f5bb542f6c9e6c1747ae5a344aff483ba38577ad534b33b3abc7d284776ea33ed488c2a2475648a4fcda561745ea7787ed60f2368deb27c75adce6ff9b6cc6de1f5e72a741e2d59f64751b3ae482d714e0c90e83c671ff98ed611823afb39e6e5019a6ba548a2a72e829c7b7b4a101ac9deb90a25d3e0c50d22e1fc26c7c02296fa13c6d9c14767f68aaf46450a8d0fd5feb60d9d73c6e68623425b4984a79d619dd6bf896459aa77a681ec9c1a97f645e121f47779b051f8948a817f84d1f55da170d5bbbaf2f64e18b97ed3fd822db2819f523314f1e5ac72e8f69bbe6c87c22daddb0e1ac6790f8534071de2f258064b99789bfb165b065b8fe96f9127cd7dca9f7cb0368420f1e802faa3ca23792f2a5b93773dd405e71c320b211b54f7a26626b03c060e1ab87f32ac588abfa056ce090bd7c69913a700c80f325bfe824fa", + }, + { + "0967de57eefe1aaa999b9b746d88a1a248000d8734e0e938c6aa87", + "e4f0a3a4f90a8250f8806aa319053e8d73c62f150e2f239563037e9cc92823ad18c65111d0d462c954cc6c6ed2aafb45702a5a7e597d13bd8091594ab97cf7d1", + "f2db28620582e05f00f31c808475ca3df1c20e340bf14828352499466d79295f", + "4349e2131d44dc711148dfe3", + "bd06cc144fdc0d8b735fa4452eabbf78fd4ad2966ea41a84f68da40ca2da439777bc2ba6c4ec2de0d003eb", + }, + { + "c4c920fb52a56fe66eaa8aa3fa187c543e3db8e5c8094c4313dc4ed35dfc5821c5791d171e8cfe8d37883031a0ad", + "85deea3dc4", + "05ff881d1e151bab4ca3db7d44880222733fe62686f71ce1e4610f2ea19599a7", + "b34710f65aed442e4a40866b", + "b154452fb7e85d175dd0b0db08591565c5587a725cf22386922f5d27a01015aba778975510b38754b2182e24352f019b7ad493e1ed255906715644aec6e0", + }, + { + "c4b337df5e83823900c6c202e93541cf5bc8c677a9aad8b8d87a4d7221e294e595cbc4f34e462d4e0def50f62491c57f598cf60236cfba0f4908816aea154f80e013732e59a07c668fcc5cb35d2232b7ae29b9e4f874f3417c74ab6689fae6690d5a9766fa13cd8adf293d3d4b70f4f999adde9121d1d29d467d04cf77ea398444d0ea3fe4b7c9c3e106002c76f4260fa204a0c3d5", + "72611bef65eb664f24ea94f4d5d3d88c9c9c6da29c9a1991c02833c4c9f6993b57b5", + "dd0f2d4bb1c9e5ca5aa5f38d69bc8402f7dbb7229857b4a41b3044d481b7655e", + "2bbca0910cc47ca0b8517391", + "83aa28d6d98901e2981d21d3758ae4db8cce07fe08d82ca6f036a68daa88a7dda56eeb38040c942bdda0fd2d369eec44bd070e2c9314992f68dc16989a6ac0c3912c378cf3254f4bae74a66b075e828df6f855c0d8a827ffed3c03582c12a9112eeb7be43dfe8bd78beb2d1e56678b99a0372531727cb7f2b98d2f917ec10de93fe86267100c20356e80528c5066688c8b7acba76e591449952343f663993d5b642e59eb0f", + }, + { + "a9775b8e42b63335439cf1c79fe8a3560b3baebfdfc9ef239d70da02cea0947817f00659a63a8ee9d67fb1756854cc738f7a326e432191e1916be35f0b78d72268de7c0e180af7ee8aa864f2fc30658baa97f9edb88ace49f5b2a8002a8023925e9fa076a997643340c8253cf88ac8a221c190d94c5e224110cb423a4b65cca9046c1fad0483e1444c0680449148e7b20a778c56d5ae97e679d920c43eed6d42598cf05d10d1a15cd722a0686a871b74fea7cad45562bacf3bda937ac701bc218dac7e9d7d20f955429abdac21d821207febf4d54daea4898837035038bf71c66cef63e90f5d3e51f7fcfe18d41f38540a2c2958dacde16304e4b33da324030f1366f923c337", + "74ba3372d308910b5c9c3885f41252d57556", + "9cf77bd06a4ed8fb59349791b98ba40b6019611942f5768e8be2ee88477149e3", + "b928935c4c966c60fd6583c0", + "ec7fd64fd75b254961a2b7fc942470d8620f439258b871d0d00f58028b5e0bee5e139e8108ac439391465d6658f559b1df57aa21cf826ede1a28bc11af885e13eebfc009870928fae8abfdd943a60c54fca93f0502dc23d29c2fd5340f9bc0e6ef2a18b66ef627af95f796d5bbca50de22c8ec802da9397089b25c6ba5262468e3977b45dc112e51896c70731b0a52d7efec7c93b41995823436bf4b0c477ae79684407c9831b487928b2b8303caca752b3edf1f0598e15831155462706f94ef3fa3a9e5f937f37085afa9b4bbf939d275796a61b78f70597acfd25cd87f967021cd99328fc371b5eb5739869520657b30e4a5b0db7c8715cbe275dee78e719b357d3a9731f9eaba95986479bb2004a77822fc115a3d", + }, + { + "b3d3128bce6bbf66fd78f1a18352bae56bfcdae18b65c379ee0aeb37ee54fba1270d2df578ec5b75654d16e89fd1cd0acda7ec580dafd2fbbabd32a8112d49383a762db2638928c8d63eb0750f7e7fdd256b35321b072dd5c45f7dd58cc60dc63d3b79a0c4a1689adf180fef968eccbcfa01ee15091ceacd7b67a3082db0ce6aeb470aafe87249c88b58b721e783dde184ccf68de8e05b6347fe6b74ae3adf9a81e9496a5c9332e7ebe908d26ce6b3f0b2a97e9a89d9fdd0d7694585a3241f240d698e69fcc050e7a959ba153f6d06f117848ba05d887134f1b6b994dad9b9e74247513e08a125b1fadfc7394dcd2a6451b504ae3e75e22f2b9bc405747dedb6c43ef4ccdf1a7edaf9451346123eaa63f3af113124f361508e255503a242b96680ae3360c8b13ac1f64d08088bb26b7f617cb0866f11d6fd362b00d86eba3fee68724e302388f119d6f92161ac8ce00d08919377a26974d99575b1032ff0f1976240c785c8b89e9eb2bf005e4be06b5371ffca14683fedfdb49e00e38ff27af1324177faf91599abd5990920797574eb743effdc7decda318ada1419cc8e0bfecf82f9c99792746c2b", + "7e8da4f3018f673f8e43bd7a1dee05f8031ec49129c361abbc2a434e9eaf791c3c1d0f3dad767d3bba3ab6d728bbcf2bd994bd03571eae1348f161e6a1da03ddf7121ba4", + "7ee32dd501dce849cd492f6e23324c1a4567bfceff9f11d1352bcb8615f1b093", + "8998e043d2961afa51ea262a", + "ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7", + }, + { + "68d5ba501e87994ef6bc8042d7c5a99693a835a4796ad044f0e536a0790a7ee1e03832fec0cb4cb688cdf85f92a1f526492acac2949a0684803c24f947a3da27db0c259bd87251603f49bfd1eab4f733dec2f5725cfcf6dc381ad57fbdb0a699bccc34943e86f47dcfb34eba6746ed4508e3b764dfad4117c8169785c63d1e8309531747d90cc4a8bf13622759506c613324c512d10629991dc01fe3fe3d6607907e4f698a1312492674707fc4dde0f701a609d2ac336cc9f38badf1c813f9599148c21b5bd4658249d5010db2e205b3880e863441f2fe357dab2645be1f9e5067616bc335d0457ea6468c5828910cb09f92e5e184e316018e3c464c5ce59cc34608867bd8cbfa7e1286d73a17e3ebb675d097f9b3adfa41ea408d46252a096b3290e70a5be1896d6760a87e439334b863ccb11679ab5763ebe4a9110eb37c4043634b9e44d40cab34b42977475e2faa2ae0c0a38b170776fbb0870a63044aa6679545ac6951579d0581144cdf43f60923b6acaecdb325c864acd2c7b01d6e18b2b3c41c041bb9099cce557b114b84350131e3cee4089648b5691065867e7d38314154355d0e3ef9dc9375eddef922df2a06ad0f0e4357c3ac672932e5a66b16e8bf4b45cd893ea91cb397faadb9d9d7bf86e6ceca3e9176a5baa98b6114a149d3ed8ea176cc4a9380e18d2d9b67045aedeb28b729ba2ece74d759d5ebfb1ebee8ac5f5e79aaf1f98b7f2626e62a81d315a98b3e", + "63b90dd89066ad7b61cc39497899a8f14399eace1810f5fe3b76d2501f5d8f83169c5ba602082164d45aad4df3553e36ef29050739fa067470d8c58f3554124bf06df1f27612564a6c04976059d69648ff9b50389556ad052e729563c6a7", + "7d5c4314a542aff57a454b274a7999dfdc5f878a159c29be27dabdfcf7c06975", + "aeb6159fa88bb1ffd51d036d", + "7597f7f44191e815a409754db7fea688e0105c987fa065e621823ea6dea617aed613092ad566c487cfa1a93f556615d2a575fb30ac34b11e19cd908d74545906f929dc9e59f6f1e1e6eaaabe182748ef87057ef7820ffcf254c40237d3ea9ff004472db783ed54b5a294a46cf90519bf89367b04fc01ce544c5bcdd3197eb1237923ce2c0c99921ca959c53b54176d292e97f6d9696ded6054711721aebda543e3e077c90e6f216cdc275b86d45603521c5aab24f08fd06833b0743c388382f941e19e0283ac7c4ef22383e1b9b08572882769c1382bab9ad127e7f3e09b5330b82d3e0c7d6f0df46edc93265999eef8e7afa0cb1db77df7accf5bff8631a320d146a5c751a637a80f627b0c9a41b44f09212f38c154226de02f4906ef34139bbeacc3f06739c8540e37334392d38ba1cbf4bc7debe77c09b35d2200216db15ed4389f43bfd8ae9bf76fd8243c3d869546e16b8e44a6cd1edbd2c58ef890b5a84cda889131e5cd9402ca4d8271052c6b4fe3f2dff54fb77bcb575c315b9109f90b14bc8e109919808a581c1809e2a188d29fd34ce639088a6683f641925f5b4b3529baa34e080bb47fb7ad9b43d0d67c9e6ae7cacb50527fa74e56d0c8b20149f5d332d686d48ebbe634c2b5d35fc84c69a5bcc93b93dedcf9fdf19a1fb9b75f6df9692d16f6c3490377a06294499e4b8ebeaa0cfd840bfa05fde21c0b5e94d13063b3f5da7b537caefe89069cfa9de9eb8f06e4d30125de64716f821bcc8279c0c7ea2e", + }, + { + "89c1ee38b6697d0190c87a2aa756892ee09fca095df1e31aeedbda5750f604d9b8f2116e5b8f70ec57ea16fe419f2d213ef72b9be90eb5d7e98f2e398632123e2524ac80b31c6c0a07820848223569602d94fc16a3b1ed8c411bc6c74ed80573fcb1f3afce60b9d5e2c21d04f78665241b613abe12274a5343101a91e91f04e5d1f7959f574e743a10913e0817a32c320467f0178e3b6ad14b856234a4661a755eaf14b5fd88ef0e192e1631d14263d6a954ed388f5709dadc6c0f81d229f630d80be6d593d5e3ad03f9ded53c41abe595981d24ef27ffcc930e4d653743960f4e7ce4e251c88f55c16d2afdaed5e3446d00685c276728ba757520acb9b6bb0732a0e9836878d829e5022794d70ad8440a40a132a8c9ec1d3f0ccaf8c285fff425e9788d6150b74753dedb2ae8b36ff2f310249bd911b9181d8310e00810d42ef94cbb5a9d72a1f0507c1a382f892b23994fbe7360778b7efa9c5e03ac3231a57fecff1c5fa10caf1d26e84db0137049622ebcc3a64841a0e49fa390d1d43550c1346c20d578cff39fb7404fcab0982dde55f0849d312581d0c811a19d46f25e7a5e7e50d74d43760583c5cf335dfc11b2ec964f1dbbd0ed83e18f2027817ea2dffcf2b64a352c4fb8f11eeb4f1bfc01079251254d2112d103a1f12a2270cc026cbeb8b6f3e505abd62496253f93274625786b73997e449c1f35c742a593441252fcc845e1cef1b8f287dd311a0477407ce3b31661f7b2802c79c2d20d06e45f03aca4e47a959c6c1d7a9d377e1577fbf82a115921c3d94e3d9c204aa204a9a5b04d8a2be3269700a035371f4aaf1a42d92b9bfbee74492b106975b36d1e581d6ce2484f09e04fa91586c85f35e2a10f0d3c0afcb05327c1bc9d7429bbcc4627af8f76b86fc561844c2ae3810c84901ac09a1670ed3d31a9daa5d296", + "7219bd21a834d917f93a9b45647ec77102578bc2f2a132dfde6489b9095b4f7b740c9c1c4075333ab0ce7f14", + "a7f849b054982cc8a4c8e5e53e181feee79e0233e58882839892134ad582da7c", + "4c46854e9e101090b1436f90", + "ab2e189baf60886bed88eb751bf3560a8bd3cdb6ee621d8c18b5fb3aa418f350048ecf359a7d542daf7090ec8688c3b0fe85914aa49d83be4ae3396f7bdc48051afae6a97fca7b42c0bf612a42d3c79ef6aadceb57f5cfe8d67f89d49add0ea1ffd423da058297239e72a85fa6cd1d82e243a503b1b0e12d7510a9ee98d7921dae2754d7581e52acb8ab9e7f9df3c73410789115cef6ce7c937a5441ad4edf2b7a8c0c6d152d5a5909c4ce839d59594a6163364038c4c71a1507389717f61e2bda1ea66a83ef477762e7834ebcfaa8f2ee61ced1605ba1380108236e1763bf40af5259da07dd3e3d0fb2801868c2e7c839e318678687cbe33384e2ef5750a0a0e2d2e19e869a4277e32a315ed4de79357f6a12a8a25d5b18291316d9bf40dad2d05d1b523ade76650669c700a1c2965f4e51337aa5d45ec7b4981072779401d6d30ed69034053334bccb18425ac68460becf2aeccc75aacd3d6709f07ee10366ed848c8a54904af4ea71fc2117de133f01e1cc031f2a4d0779b997b82682433ee615202d5dfffba6c916f11a00551d56ffde8c36b303263e14adaf45b6eab0bedf344e5214ce52f071d2f40154d788c6870020791a03d2fd4ec5879d9026241954ed45cfddef4937ea3d0d45647f252be31411237983a1be340fc65ebab9a5620abb0e8d475af4e89e842e895eda0cbd283bb5d0bf20236c62d956de733d60ebceb42fc0c9adbf9b69f8d66551b0aca0e260625ad41cad75d752a234af7caf7902c2c5b62f04b6a8e019a6179d44feeb2ad5859ef1c45371e66f1af1fe0de63997266c290e27f0dd62185c53f81e0a50c296a51ace7c90d9cf0dda8b2d7e72a347f64c44262e2a544d1acc7bb05734dc1783bbc1903279092fe7fe434610aa95fc2ce5fc5ee45858f5e8337d8fcb0a468464becb1cef6b7e5ea48ba383ad8a406df9c581f1cac057d8711fcb", + }, + { + "2dcfbb59975f217c445f95634d7c0250afe7d8316a70c47dba99ff94167ab74349729ce1d2bd5d161df27a6a6e7cba1e63924fcd03134abdad4952c3c409060d7ca2ee4e5f4c647c3edee7ad5aa1cbbd341a8a372ed4f4db1e469ee250a4efcc46de1aa52a7e22685d0915b7aae075defbff1529d40a04f250a2d4a046c36c8ca18631cb055334625c4919072a8ee5258efb4e6205525455f428f63aeb62c68de9f758ee4b8c50a7d669ae00f89425868f73e894c53ce9b964dff34f42b9dc2bb03519fbc169a397d25197cae5bc50742f3808f474f2add8d1a0281359043e0a395705fbc0a89293fa2a5ddfe6ae5416e65c0a5b4eb83320585b33b26072bc99c9c1948a6a271d64517a433728974d0ff4586a42109d6268f9961a5908d6f2d198875b02ae7866fff3a9361b41842a35dc9477ec32da542b706f8478457649ddfda5dfab1d45aa10efe12c3065566541ebdc2d1db6814826f0cc9e3642e813408df3ebaa3896bb2777e757dc3dbc1d28994a454fcb8d76bc5914f29cfc05dc89f8c734315def58d4d6b0b0136ccd3c05178155e30fcb9f68df9104dc96e0658fa899c0058818da5ec88a723558ae3a6f2f8f523e5af1a73a82ab16198c7ba8341568399d8013fc499e6e7ef61cb8654b48b88aa2a931dc2cdcf245686eed9c8355d620d5e91c1e878a9c7da655e3f29d9b7c3f44ad1c70890eb5f27ca28efff76420cd4e3cebd5c788536ddd365f7ad1dbb91588d58612e43b0460de9260d5f780a245bc8e1a83166df1f3a3506d742c268ab4fc10c6e04bca40295da0ff5420a199dd2fb36045215138c4a2a539ceccc382c8d349a81e13e848708947c4a9e85d861811e75d323896f6da3b2fa807f22bcfc57477e487602cf8e973bc925b1a19732b00d15d38675313a283bbaa75e6793b5af11fe2514bda3abe96cc19b0e58ddbe55e381ec58c31670fec1184d38bbf2d7cde0fcd29e907e780d30130b98e0c9eec44bcb1d0ed18dfda2a64adb523da3102eafe2bd3051353d8148491a290308ed4ec3fa5da5784b481e861360c3b670e256539f96a4c4c4360d0d40260049035f1cfdacb275e7fa847e0df531b466141ac9a3a16e7865947572e4ab732daec23aac6eed1256d796c4d58bf699f20aa4bbae461a16abbe9c1e9", + "33791b0d653fb72c2d88519b02bde85a7c51f99cfb4456dfa6f84a61e10b4a14846521", + "a0a7b73ca2fc9282a28acc036bd74d7f5cb2a146577a5c29dbc3963fe7ebfd87", + "eaa4d916d261676d632455be", + "c9a631de470fd04dcbf8ea9f4d8ac37c3988878b6381707ac2c91d3720edbb31576ba90731f433a5e13582aca2b3c76ae75ca8881a463ecfa789910d3a776a9ad4800521c6baa120b2f1afd10f32ef8da63f5b69f5e5fd88ee84bf66b0666b15d05c4050f5358a050b9d5cf1503719f56cd48ceba78f29efe2ae8092e37f5134df526831532f86ccb9339637e2c9e9b9036f83cc058fda23e826a188456e7fd3f4ee20f4e4a3221883fe3232b49db607b90a8956133ab95051c9ec33a908ea7e81a1bfa7bd06c09f0143d07bb23a3feeac7f0d7720269c93e2df19d03605828c8713b84d183c9a50954c12fe3b047511ad15ef03a63355520cbd224d06a34de67a671368e6a8f9feeefe48fc273764a8c69c00314e5d693f159cb5270544f3c4e1760b0529e3303ab308e9a6d03835a3a42aef2df5f7643696f707a574d1dcc676aeecdd9947ebe8c13bcf15d30b2d10d2cd95445a307c1d22d39450615ad38f9302c6eb9dc05764b0503d6a7eaff9feb94834853b47bc25660207be3e7c0e27cb3127b5402cb016396e5ff07ddc3df29861dd68a17f53bf660b23352b739d6da72381b8d19a9fc95da7efb79330a2b360dce4309860af429e3fd10cab235c4acc1d80d9e20d67019375bd161ab65648400f308815afe63cfc717f7d0eea150e687caac25b6603287d44dca4a7cc2f67c3bdd54450bd3170340253b03ba054ec003070eddf9c14fb9dc595e228e4968524900cb5d85af6d1e658a42d744e0e7eb6995023823a8dc33528c6715b2e1aa607782c8e1ddddad72026d657bf122ece8685f6e92236e809139325e4a3c069facf94c10b7896995bba01eb22c7b3a87ea2114a7649d7ed3e83d223e5e785c66a75119beab0968d3eaf0cbcc2d7ede95d024041e6db39a880ce3e19efea32fb89a40a2aae22f407e5fd615e51e48dbd50a8b4ec27ce95e2ba1928bf699d0418705482ed0ed7acc858dfbd690403c74667a88dd5221bb79940c6c4a268379c10343aaefb635982c14f33ad83d47ced9682961540bd4f75804d3d48ba8aa67fb2e3a1db83fbcbe57fec9e4ffb1b575e947f8bd8263c680357960e3a39382974774b5a013f2f8514b3c63c21dbfd314fd5d927d82ba616d76629ac018879f54ff84b5808e94af4fcfe1cf8845b65208ca5510b5b593ce6c109611652cd", + }, + { + "c335b055b752e083554b5aa2cbb6556cfcace658d5c11b6b000256fd89e9b24c1e62a2d5b582580acdb2ad9869020465aeeabe83acd9eeacdc44aa652d5cb24bbe542073d6787ea32b2b3c942d40f9db2bb75ed7914c836d902dd2be89840948d82abbaea23952cd648e6191ce5b6cf912cad0a3165410a781e3650b676e5340980eee3b484008acce6a3e9dc5aa96d775677b8bbb8b323c6e9747d6069a169ea904d9f145e29d134cdbb0118647e8fbae638669efb9a55d50ed33568749f5304ece2193b0bfa6fc9a570d209ef61b4c59a2b5485b5aa6ab47d902cf23f7ff71c5210476e0aa727a01809b9f76b6ebcf58a018b3fbbe5f42976111ba58112b1d322f9312da068cdb86277bfcde66cb3607e3ea02a1494439aa56f302671f1f994eb3ab28b937043f5f7f3b3de50673ecea5dee8ba633c45089b852f0d772892525344ede6b521dcad15807b65e7ba348d891d47fc498cf4d50223d2794c64db9fa9b9766edb430be0c38746ab317b38ba9870a6d1fdabb70fcf89790bfe449b97fe01f6c94502aa0889f0a3bb6bdc65f44d1cd64ab88d4a7806b373f5080f9cf60183cf4686694f0059e2bbc5cf21ba0c3e8046e70d815f1444c3094cc29632c429f20aa06b49b0b52c6c7aeb8e34f7bcb53e93c2cfe2d704a5d0416876742c90762730d160e1869d5e0178dc366098ebaf2cae6f1f7563b555a52dcc194a5c8f718d50d27ee76fcce8e8991f4921fae85ea9476e1eab1364403120698b7ce8fd0a49cf79213f360a17cf1950f104494fad80adcc3bb1207bf250d57dcdce6ac8082a312959672361363cc227310b66ee8c04aab7b5cb33a81c0915e9c770a1cfaae2e8f44a0c65703927977a22fe58aef2f366b8be9a50da9376b46ae7562a82391386831febf359039ac326891bc58c0f2c34bdb6858859fc3cb4e392df65cbe2ec4f02c8425bcbdd1ee2562ab7d229d406d79a9c6fe4889c996c2f68d1fb5bbe3a5e867caa4249b934afd3ec71fdb088c54b15252f9dc1b909e121dbdc7d8a16cc00836652dd1f877ce363eed11467966f7ccb8f1a8d48146e69e04ad76a51937ad4f9cda209451eeca90dbdbd65441ce20fabfc8ce400fb4de136154b87a8b65c92740e9bb91d78521b261f806a2c6279c85ef6ac5fe1ea3117ff7c9f9832fc2aa6fab660082eb22344c1a3befe0628b6551f62a5014cd6194c42b8d475a50f2c9fb58c97e43ebb29005ed7fe54f0a4aa10074f1154152a9067d364dd7863fa082976a00db55b26b5ba0ea40eff48b90", + "f5ff810a41d4b34751e9942970d4c9f26b33f24689a4b1e4449b243490afc485af468ff01a42376b2bcb949b9f5e8d0b917f511a", + "a74271c184a82cb074c14b131fd91eb05870cb7c73c9e511ec8140bfe2f34089", + "2403fe689e239c2ed261b381", + "af9be893d5fd23aab42e6a2e59a8e7cb13d4f543db02af87cb0802bc1af7c717cd0093cc8244994cf21189146922b69927ffd5745e57118bea07a6afe7c21d952c13ab636b3c2e461dc9ffb3ae701175360156338be94b1fa7115799831019455cfaf5114010fe45f8fb9c77ec50fe06f2c5a32423edccb3b2210ee1200a78e1a3130c567542377827586ca8cf0c14c19fa1449a2cce9c039bb441b04e9c0a3f9a743b31c828032174fcdb7c894349aa68f5adf97dfe9294d24e6b5fed95eb994397883f58487bf5c57b0aea5268be7cee9efeab370f89805ebe5373ab2e93658fc078955ccf68b554dd5605005751ee8531c35ca5336a5d0ce273370c0dc9307779b86e96d2d1daf2620d67d43e1fb7800ccf250ca3c02eb74047c1d2a2bc7f29fff8320301694b80d0fd975f834337d00d5f0e4215044d52aa4ca21e6a9d7e03f186d7cdd5c48e3765dc926fb0a46bb0f05c50d9f69c9c507527a60366b7dc251aae1d6bb0d9c73735dcfab959f6fd4382fe2a1f6ad07affb0601bb9040f81b55a48f6a6c5f8ac4a2acc2b0c9a6c439198f7926460695fa11e0b0b017e39de5cf0d5d5f84d972b5eee7b5d1e0343b5485cd84b92ad892e5b23f3e803f5b363f2398c11c15be9f13e59922b0d49902dc8483fb142850b4226da2fb84e9b434a34f6bb67f575a9e57fde3354bc3077a876e260311bb2481bb139aa9af55df5074749fe532d7b8a554218a90cc7e7ac69db280bae5d55a174dfc8d325b9909a8da1016d4e162fe5ba70cf8726cdf291f5e47083d9929cd5e32021cbfd982fd0975f6f9baf4322b553cb3174b11c007559879f308419ff9e4e18eee8d3640cec8aea082b90f69cf3c7676c28af0265c24c91cd58a06513198892ce6ce1ab3ee9ac0a2e937b973a9cac06a039a54f8d994c13d42c59187f677352e5feb32a417aebec4d852b2595e7e67450e06dbd183279e3b63022a3813b37257b085bf8454d6890875a2950d20210a8df4f9da746722f62687e92f0e9efc3e5d526d65ccfbcc042fcac7964dbe147932c73924bdcdf62f9eae58d29e8567ffed90048bcf0566b952e986efeae4c477944af18bd243c3eccf8d88c06d07279adad037450cb8547a8aa0a74223f4851747c803cb21a2dd027e7080aed75038cdcecbc4639d87763cdd41829a1b72cedf0d722b180d0d492a5740ea7607b95f3201df352fb1ab28149124d2df5d5ec106867897b537302c3431402348f94d28eebc701ae1b49d10adedea38f1654fbc48885e59e6e6dfd413c6b5a97d8c35dfb07a6cdefe317bf61cf91", + }, + { + "4aba5a776ace38b6e2578f0007e770d264e39c49f588ca3547ad2888365e3a811994f8836330394587c8458eb0b6611499fd5d8e8527c3cdd4ec550b4a8f8c632384e786b420cb3be911c999c72aad60270aefad31b27a069ecf11e95e9d4c81213308d554d3103de4d9d6ab04830c2b8dfbd8bead52c44c21d5357f72810193b5096809dc7846c1521c6c569f78812c735aea21acaf6dce84a24df7234e8ad857f3e1346b27f5bd436113e2da950e4deff96e9ba8db692c7db723a105ae795da15b910c8286cac6e7dda8c172b70f61b07dfd58596684d61da8772356f180f74c1103ce97cd947eab3d401df44f7fa4cc7cfc25e280fc002873237e64a375b0b4797f4b4613c9f150090f44588ee8250ae44aec6546ec8dba0f0c1eb281cf66fa4eb141617b32b28441f6ddcfdf02d9c34cc62893b2b64dc2c26b74433adb3e888c7fea07b19c8cf39269c2716b9c35b7625d4a141397d6d5034b193d2657c6b2d6b0ba874c467adeaf3d501ad985d13be21c4ff6b326cbb671e4f4973bba49116a0399b6491394f850e4122969e4644c00b442b3da0d6a4bf25ee22d182b3f822fd83878ebcc713cb183651a67ca66677ea81b58b685a3a8e385d5fbb0147ddfecb558d881c914324c794db443b31bc15c361912bbbcba9e418f99f2a416d190cb29684df27c7f3ff6ccf339800efbdc4514ee00d1a89f12373804db4fd66c1affd467f251e73147b3248033327b0f7790fd7861a51773dd4f78b89e4e24b94df9203f4a077091bb9411eec78dfe3e1dfbb67ea1cdf17e1d6936bbb75b74055495449e9cb52f5749404610cd444fea3f0568e0d35a5ef0c395ab7bf0208044b5c4e2517911a9c351efd31f33220972287253fbccb1eb8f46960a36b68a7a6b4f5cbdc86d668bbf555fde8881e7faa9594da425ff8fb54526bf7cdc4af64899530561c06bed7fc04c5d48cd4542779e901bc48fab79d4d13850ad8247f51b9afa7d5a656ada25b6376d837cb0fa1b4016dfcfc158a39290f43f133b352ed52fab2f951509bacb41284fbdd849d8185fb7e7200f8ab2a07ef2b3b927e18e568dbeeba2c7a66e08cebdc6a6069ebe6656a586652f3905ae2bb867529af6a827b494c97b3a378408f44aaefbe86c613e11e7a44020a9ee4b62569dfc4c462300daec7b1424ff1c1849ca1332367470475c14877cbe76c820cc651c18ab3f18852b93994f93b568dc7f7b0eb5f07ffc4c9384c851fa9071c6f68ddea1ccf627f889c0471c76aff9f52b07ab1b86a7671a2b2f6b25c0ddebb66ac95737bf7e2f493f7665b5265eaa5166556cecfdd3062802724ec24f3978b903d0f0c24e1f0b8d967142bccfed0d354279223f4c28684e9ab611e9ef89a3f25993b5a8b3c0354931780501651236a78b58e7d7814f251b053605f4c0a8e7193b9cc1ee5cf7378e6f3c8fd44ec57bd91e62b09fb1d6bab60cbfabcc6792e6a32ea7918a9ec9180d05a7e1546d5d2d8bbfde2a71b4e427c0a4d28d0b6473ae", + "921a401db90935c60edda8624a0590d5c46eff3522e35de2872f6f9394e24126fd8143b68a797c995624fba0298b75eef974", + "6a4d35ae03bf277f587da4541dcddf92bbd906dff45d5ff23c0f60ae53b062be", + "231b5780fedfb06d724450b3", + "ba40968282d98849b19d867f8b564ea5a81d657516099362926bca4cb6e9ae02719d10c8061f53008c727a0eeea5e1e36c9e55c117e9434e213316c96840231a1e356b254a9981d4a6ca3c66cfc61018bcaade1a4486506559e6aa3a86bac980d391d835fd5ded98d10f1394d84bf1bbf2cd3397890d704154802f7864ecc753db782fd3d19213ae65ace4770e1bacf32d61c6730aa5adcab4d7e2e437888c11c29abba4890a17a00f67a53b660becd94092df0598df5ac57326f6860593a519e28bd4a39f6481e1a4748881fd5f0456a3cd9f28d1d1e78dc64030cbd8fdb2c5abdab3f13d6ccccd187e71e989f8c486929efcdbf2a763effa95af62db5cef95e9081b818275c69267022fda4b7fdb8c650b491a785b03d4d0186625962b6326ec3f4e176373da4dc1f83a14815adf82c6bffa7c6967d77528d0249754bb4d17656bc4a89449b16152a4a1aea7eb0054a8892f271138971507d2f3b237ba5b620f444544e4a8c2b1ab4f9168762c27478c9f776c47ee2e9ff05bfa35ed127f0cabe7cc053640bb8aa01f8359b74bf89ef43ca94c48fcd201eae39d1835957eeccd6b3a852f4e1bbfef9a469f42c764481ff8408fe5871afeeae7676b58f4202199aad50a596626dff97c8e60d750cc59da9f595ce12ce9afdce14481cb1e39994de8fe4cce07845110d6703dc59d34734e93e9e57e1c52d61f44143a2d290220a4bad5098d098ee65ea4b6757d8a9bf5485aa3d697a7826d4a285186f5da10eff707566c23c6a15033365bcb498c44487c72d96402d1834753fdbf86770239761f03e0dc8963766441da99c0813e4f1df5a1d018c8799861a396562eb24ce305ca15f4022d83ea3c56b68d9a7ceac4742ec0ce50f4d36273df26005ec2b051fa071b319be2d8a5ed26eb75bc1ea83761b8454db234d15d84d6706cd178981c1f156e6d28f774aee3e9a4fade022e71b52b50aa532b8bc7fe464f22d6eb169c69671875d614e987658820c2f584a4fea3008afdcbb646dba3d69020fbf503f121be3480344db23efdda0d255aa058c3ff66abd3a5fe35db977521608bba7eddae72ae801f4fbb12a1de4133039e046ceb8db87e465e5ede1d79a08c857d59076d7ff858942c31e15cbbdae6fc15c3f9545a0825d6ff8583c0aba8a7d143d27b93f6caefb98c0d83bd8715abcab2a49087f55a9daf9090eacdf45be08ad80b5df5070e1719f68c4cc8f8711083f0f7823a09ec092f22df95fe9e95114fdf82a3f6eed0bfc9c0aa65222609442776154a474dbc9e662cd5dce66846572e52417ee5d7eb59287d07ef60a9537fe1f85c7fa74fe84dea0da235ac7574335e6649b54a6bd33397df4bf4a7976c4ab868aa702766d2bc8d2c82c2d1c2653fc8428b8d1e61852ac185a3a0b416dbcf8eb54c44967ff43c44f2b32c6d4a9dbf2c2f3a587b430aef50f0375cdb4c1b319ac9aca486d9bb321141b065f52f7b6decaf1985531ca7bbc3772a561eb1efb8a6297075920bc432131a5b211bf25e35fa31e12833bc77a9de14c7", + }, + { + "6c0056937faf1023032df1e2bfacbbc58bb022eba25ffa020d4eb26f0caf0678af5d0b2f0c1b520f4843f107f0adcc7b5dee66ff4d61025bafb4cabb64d133132e3e423a599549a1d83aa8c8e774444462aa44b00b460bbafad5755ea6a872d4e6b40e3f4957e0229288ea79fc2ebe5fd9020fe4481a9f42ef14a196bd136aa3c779e311d0c333624c1ddc484c9aa7259cb609e4d0a826c0bdc7567adac01da23900b30ac4e66c100348584fe200747eb67e6287268947e3509d5d2b5d7bcd977b80a13f660d4f6956a8b938a82db75eab19e5d2a22cb5f3c9131e278eebbe096b5f49d16c983ac240f3fbe821b247cccb2c9e6e59546122677f49f56a07fed56647a6d3e0e09520d49009f54250c10e7c607cd5b4ddf81b5c4110c6490e9baf56418236211856f5a85feaebafacf92c0c7501c052f9dbae3beb7484f90f334f50b68571cedc67763b5161ebfd5a1709cf18c92112a4cf4d8f43d1895204d8a2ba5e14883a7bff75cc6060cabb77d38a909daca2417befd1bfc05a11c432b47f90c807ca4306400f67a0d92218adaca84a584a8bd4395c93f9b6a4bde9583c79204444634a8473b1244cd33cf980e443d82ecfac672b3f60e2e41ecb3c5a445d9e88c0e90c339a31806e6d79ee52bdc6808c73e8b7b24899966664d3c1a9305f31f0483e24e36fa451dc1d3f2eda05af6678971e2bdfb7c1461c9407c5c466f6b5af34d992a37de3809a22ae75275ddba0f4f9cbd4b18c1acd212192e587889a36bd73c860f0abe08bcd8f00f5ecdb95e1d560b586eccf530df0e5f3776d8dae2a01768bf1226b7ceffa7ce4e75879c82dd97db3c64c06d33cebc6b35854618355d80e46fa79c3e9743fce5b974723c421a077e7ec7dba286881dbc1d53d442a1552700fcb33f83f73c69a0a0ebdcf2f5d461649c4d0712c514ded268a31509f83c1ae4ff4a68e676d29727be641aa4487c08d4b90ff78e24c6508d69759751a1a23690ec9f8763621e8b107295b4bb01bd9fcacd8748e24d996fa70ef6f8b0992f4185bec8e920d7643159f9f604fba394b6611bff435998b2f097a9e948430899c8c752a1e83a061983f00f88ebb32da214399167932a1a83c1b47d09f77593b03cf6521520583ea4483e2d33e14ad60584676d1791779b532c085d238df0d3bae735d0078e0eabd63cc90a2e13d023983780afc8f83b1c14437937c16a1b7c41414c48cf4ae49587ad9fa5b16fc949a749e96032248c4667f58e295f999590dae1d99a2cbe3fa45bcf4a1d3f0356d64d40367f64b2c5cca843e5f7dd7b88a85d52328a00622e6c317879607bc036c9006d38652ffe21c83207c00f8348a7d0aaea5aab4c89077df170de6d41052641726eb6925cd85a9ee01a9e636346340e209ea96d17b0eb0921b96662ce9cb430fb6ac348331dd7133875769bbbba99dc49333950e4145a15ddb0789c4d2ccd38878080ca9e57ddc6cd5452790eec45482f8e990392e319609391fce0beba19463a9a00d8f1de9fbf22f23821de7d69fdfbf3019ed61aff79acfc5a6ba663a1e10da2b9ff7149aea43bd6c61a543008402309df0924de72c1cacd2d6120cf422e61fc1de345cc8771934d8be77d9437a09e06a9b2d51c849fd9a200fa714328d34f36b684f33df6968b827df916a599a4bc3367814fec21198e2213ff653cd2a463892966c72ffd42a26b3bb91", + "0d55dcd08b54e58916f622f81761ef6a2e19b167ac47d3", + "e42e1d6d44138f3d2bf12c951f454686f18d590fd30057405b5a3dc2b317fa97", + "1e46a7486c5a03fd6758d938", + "fd3c1fac10cc82e49235fd57f5aea0ee7a7bd6d539b138d4b3fb623aee591615c1a61228ef9673113a3a90a3687a12d4c6367d5f7bc67d422fdc4106455084d79c2c42c5e86368dd164bcbce7925bfffe7d96c13a2f49aac8e9d1ada3554e3fdc21aab00455a0f33b0c1fdea91b3588e7ad301bfccf9940027332fbdf966463491f7a33c093e0a13831ea9d2183294f89f414cf7b5876af04fa68d594430194429df74fa5915394427259e832bc545c13400aef6cf16620d48280798a6e49773c9316d79fa1dc758e54cde2e2cdb856092d83f4e9b698385cb976fd6cc2538abe055273a5b34a784182ea5e7d3ac9019a05de5e5afe4308a7ed2d363cd50ed6a52df1c616e4a82f607ced768445d13ae4884f2ae1f9fd8313924e8a1a8a23905c92eb231f638dfa6f4cb27bbb9844e05afbbe2ca4d1a3b3a5b371bf33c9ab6f82a7387d61cf8bf662097624145a983839b0cb9f4bd07556800b4054fb3d0bac94f44bcc9b4ac49c39f5571fac4e02ff09f08b3ed5add4bf8bba934e9feb773c0590b45c45fa036382f3fe9782ad19107d4630321e414b7b442b64f18fdd5219039e5740f34b3ce8925d1afe8a39e35ce8db086060bab63b9720700499f82db19a62897c6d845389461260303f9cf2bc7235a898b4620c2191ef05604a5c8c783d58009533a86b27c12b0772635d34ac53993ccf174c9087073e5e69b26c0c3d9f768507ac4d4e2af847b65e3a6e1b7a6dafb0aefc190871cdae6c60f0b1d6137c351d4cb211870791cf4cb8af2ea446f6401eb9ec8a5bcebccce898d1dfb13454df6b35b81ed6d7637e6e261e004080c60944f3a08e8e5fc7e2e4939e7c2607c8cf07d1d10883ba3ad43e2611826f245df571857ae0a7a867df9659f2082c19f94ce400132e48c7f8de2b102c7f83ba5cd1e785597a0ba0d73bb81bba0c00300d4bcd6ec25fb73105a46122873bfa729c0979d8d314ab7ea52391aabab513dbfd1cf01c2990c0a3612f4511c2bcf0f5a07e659a881a7f99c3f1fc4a46e66904427fe26a4a80a904c047d090c861a075c0ae4e29bfbc18b9620aaa42237f4c6fa76ee7491ee638ab5f1cf0b440759828e1ec519679efc776eb1468999a00f667e87199ad6891e98b95fb682e02517b024a6bb803ed23c944010cb7bad0733eccc12d6ab6030c6e88d510ce92e2f98fdcfaa1e37e41fbfb4e99589c0e8efbefd40473db42b3a73b57b22a2f8c9bdaab16831f1b117dd83a77dd01ee8d0c2e92203adb670f4fd65e618823ad196220d70e014c1aafd8863797c61c16382c2600062683ed3a180c70891717c52da15191b02f25d1715ebf33a5e6037092421989c942082f4b836423cc3e976c9bcda185de36f06265dfc250a27d2de0bc48c73b3bff704f3b386f962522f572108458bdb283c6ab3fd33b3ac13a406268fd5d97e17db9c0f780b4b2a8f761d15a4d8b3a0cd73357ecf4d26a6492ee069f19325823ef50bcb2f73326719a57b67eeef506fe8915a1b1ba1a637592268257b91e9c7c5d33cdd947967efc1952005d82ccef9a3ad7ef8ffbb6b658983d64c51242ba53f8f8963245b87a25aa9324c527e53f8c11d55f30aab598401589acd13f090541b3b057b162190f27910718b02a6b8ddbb8ca6cf40bf0d2848f4b76341bd5e78f476862bcdbe2d1bac84c0566fb45b21388221ecd8483d99fe603646b1a9f38a49230cf4dbe5d7883d73eece01bf", + }, + { + "04892b94c65685f2eba438322b29bf8439938590d3e0eb10a29e279d356cb439f6dfcdbc3552af21f7e753221012a649a52bda780bc589ae63b04b981dffd113df9fcf14f17e35e865880a769bb1bf40dc99b9e85e4296c1f2e1590fe02b22bfcaf2d4bb7009a4d692ae4c2d5f0b6d3ca526240368bac55b9b1e6a7b498d3b137f0fcfef1873c5aa2111d7811d45bdc26be1c5d49b8a2f36a999b1f226ec06a5fbd59514485abe696c96ea89dba74b4688101a239b495944e30b3609f73caff3114407599ec5c30a5bad933655de7dddef97018ae15acec46504cd5d417c5052c057ac5f1c6f69781cfdae71db2b4fcac35054a4aa22681027356d68b2bdba721466d130d53ba8f23857631382b2de450232e9ad5551bd7c872ae439e79eabfb057d2bdab8d4ccf02b3003ade2e1f3e514dc92692e4fe5b579c9ee6067995b6c168647ce5a13be8543c23326a3260bb7029d2030ec05e565ced3c5366d20a283a6e95201fd108640d2b96676df712de20e4e12fa53f85f22cb24583844fabcebe40eece11e7221f12c88670bf994ed08e2000236f86258c386b0fccbaab8b68ec6a26fe41491d540193c4c12d1391ab3391de9317f41f505f1f1d09ca9862a6f289a533d2b297d4465c956360371ea3c8ed36e0d1563120654e3a2fd69cd6c9267bfcf92e84cd64e162c84199d6e552b42c33857264b5d7a2e007797cde32934a3f8c68b459cd95bc85e7466ccc9910e8dca65b315c32e43c3a5da908904c42cfc8ab74126919ceeef1054bbdae6ca67b02f1ac5f24808b5eee24577e609a3e3935a24b9ebc1a8dad1fc96abe26012928f2d5782755f3763427dda28867d0b1ad830d3c3f17b9ec278346e5a9480ed23ad44a523a4dd86e65a610ee0de1afab64ace7a3b4918fdc14c6b1ce0ec0903994da9bcf18643d7e0a4e6c08200bb394a89b385d2cb829417eeb0f7dab9fa7306a330f82973cf0917b5ca99b585d2ff0e8584e050077467f5245ecfdd5942e4fc72dc26e5ab2ffc61f996167e68168cee9a6d3ea1e1a696060465e35da8c75a1aa380004faffcb0a992c627fbdcb4e97721271802cdaf08d214ec2fbcb389d75709d7a6b9d35662661c8961f93d4a705e7188613f3769114c55400809cadf60d3b6068c8a5ceef078785171b59be1140c6a754ba1de5ced349df63d67d59d3a8ca3c716ffb506772d57e9e3f2caf7fe346c4ad64aa6c37e43b9bbaa8f58e51bfbac31fa6137728f8e5b728025697e5ad5c8301f6ff39eb2ad595d3cb24257adee88a84fbf1ade4d7550cd9ab94bf48e1424ae83184c35c5a5920157d45805c2e0ad129fc7f0ec3c41b9d6fa04cb8918ef379b0783d1cc2863cd80382585fa05320ca4f9fd90353e490b384ed6c166c6f802cd7bd39aa43667246e8da96992db7537d472c709b01114e95febaac5b1a3c77e1e9a18c2d180e63f0d8fa89f6a1ed63e909e4741af5c2a0e47d4d3f8779b7696358f58060f3f461cceeebb390c92779d30bfdedf1b08ed62dcc05a545bd0ea915f42976e81dd8a50cc4689d8d8007508bf53e7da5bd43c3894968cf0677681c6b818353af6bf8ac205139add1310e5d363ccadbfa0eaf735808325e7f9a6aeb1bee3ebb4a27576a88811859c216b6f84371c43d8063a0d87bd326eb6d81c6896ff534ba2c9c14a51d2cfedf33a5c787279bb4a7ff65706b389756a6191d2f791254233ee047d40d64c2dca878a42f903fd4382f39a89a723fe11848fe37b2008be53f7c2d037981d6462a4eea49df1a2e074957afd3c9dfb4d218a309cab395afe301ccf", + "67b5eccb1790babc2dab5e0d1ff3871c3024177d45a2ae", + "259603e1c3af3fd0ce3257eb627b02e0c0a48ea2f175de3d8c36570a445e5369", + "e14de73c4b17581a7e0d0649", + "33522e67ef932da5fa8abe628b51f3abd5049951dbc982ea95b7769652d4830c588fa45e3fcff094c8602b9008d7b2f9bf6c1c4a8cfb515401c7c44a7ec42ccb967722a710199e121a41160b1ec581507e9bd2e2e506b10c4b5a8d6977435aa08e27504957cd49e756e1574c4ccbbdde937de35128b7ee3455d2e665c596c2e97c253c94e405f85eb5de84874c099b4a97eb8f492d28f2e4bc64b228dd5984e76ca08376d7f1355ba8e0fa60fca96635075417d8b436278e0fb91e3bfc7d61ca8c7407086933c061b2d318f46f352099e1d317d6c44098539d1d2c1b7894db668e7a82ff991864fae236570cc420a4229883f1e2242d05aa07e175bc6abe11cc643cf1786a4456a2de8c066fb1a70fe387f149ffbe8cca7b110e256fd0c09b1d3bd7381cfa82fa700c8db1e79809ccf75ea52d0b349264557046e8703a191ddaace00ccfc513db5e78810eaac0a99d7bb1a5725e722d4e595216a0e12f3a7aab2e623ea9e1dad06169914bcd51b643016fea7dc3f2743b1e65877f1fd5581bee5ef206d86494a587ec8462a170746fcedb2c9f99090674ee687382711b4610ddac599732453dc063518aa36f5b4129098fb9fddc02eb8f8cfc2fdf0d904ef4d6d06014f977b29d0e9aab4044ce9c662a18b1a8db1ceea97854e90704430fe9b1046b221b27ac79054fcc68c3abd6fab7da66e255ff0cbd0506c852e961e619615c944cd9a05c25abb63742f5da7bd9939feb0f2f2208c8ce82f551a9d4d70e935dad018e3e4e6998e39670221601c3e34716ba75eb4e2fdf53c4d471c444330514986de45cf44d77f793c17e36a271fc65e6bf08943aef4c66547dc310c7a430e3fe7a54898de48f69f282f52bbdc4daabdb325cec7ab66fce1aea4e2fd932dc1a316c821f5220ea437447feae2fa478adade7cd515a27d8c132d0299b3ca1bc8516c9d9e7c65c38c238c69f03e104eb42a29cacc8d79b808ea6fb233a5056201e3697f81a2d49ccd8b8efd1ab0fd407c16a210767d1d3ca798ee53a4bbf1ce5090d321b1a64fc2c5f013c23829f5b0d2737936ca71595a1d02711c8a7b0e74654e5d76376ae26977dd49c68e3c0a7b36e047d44be42d732c31f681bd7b1b4b339f004ecd847960377acd005debfab13d0fb88355025877630aff753a7cfddf6851e8bcc8ec37b8f9149830f47e6b601098b2ba19a4c0808e31e8927b2525cb82bfddc9b4bcba2b46bbe768ee278fb89010243d16f9679f5ba4f13cfe76b5beb16c7b28daf99b0873098115c2233ee3402ac0f6c899a2cfcc83b2ccc06676999ad48017c4ace507080a26501993327ebdcbd1e2eaaaa99f4998b716cd9e36eb26b4573a03fd1d18047198fdf675ef4f979864ac85d230a011c69d8b6c45e9efbdc2a03f195c9731b4cefa60208ba845c0978e73d082bf6d6a513b93dc805a4f5973f4158f60a200167ca88704a15ac5ab1f38ed455a426f7c6a96b6bfea2ebc1ae1247cfe5ff29ee81bdbcb53b03b89568bae9a6f311d2b20e31c2d91bd18fd93a37be266d0de8015d52e325f78356dea0b77cc76f28e0f06e4ec705d1328340013a77b0b6196f44b7712fff4ae0ac7f6afab9456a95012b7c6d387285487476d189977e28f6c9d1a3f736320d61302c2d627d5a7ac8cde4988056b55eeba27efe7e640f94c115762ad5849423ae138c76f15b47bd2a2bde2c492489b7980aaf1c4e32a155f858d7be4fcd0f8a18e7b5d97c5a08d7885d6d56222ef49542c7f80498a14a8eed1c092543aac3439966d5b5d0cb9e602f4fd795c09d652b64f9ab67e38f48c88d18e30a9774f37e9c77b7a94cc7310d", + }, + { + "4ab8068988d4bbe0bf1e5bc2fe1c668cbe58019c958dd2ec97164aea7f3f41c9f747527f1c0e5fdb2cbb9d2ad704b6955cb731f14403dddb1a28c5996707635e4eb5dd6ac33d46eff8e319cfe7cf6443869534ca9812a5b23a6b4ca172afffc064dc2b28197117115431e03c00447f87d9b45172c6f724006270a1d41fa094847cbfac9630c3a785f488c1f5cc407ca6f4cd18bac43cba26ad5bfaccfb8f50784efc0e7fc0b504b43dc5a90a0525b0faf3c8b4b7046fdeb1cad87ec667ce3eb6cb4c358b01393f3ffee949030ef9fd01c1b2b9c5219777eb6ff5b1d7c3ef8d8e3bc2193dfb597cf942c5fc50befa527fac0b44cda2bbb811b06ae87459750295371cd232754e2bb7132807d1225950ce64949b0650531800bd0074177677acad937ee008cc0bbfdf33c6b0552000238494be8be412a3e5cfa359e619d092c76310a76bdcb22abbe6f16b3b116b5f95001d20e42fc3c9ff6723e580f378475788eec265a1ed2087de8cc2eff72184f73fa5dc6e68a56dcfc85350bccb97135386d5b827c2d9aea065708f5c921454d1b9303f21d5adf19e00415acbd86d1e5e42d78505b033a515a435713649c50702f54623cbf31469f355c3be2e30dd8c72b4127764451d79e952ea1f9bb0269da56dc07060d5d9542a9c1258ccefe53fa3f7b6073cd38026256b45c01b6c5dc0d91e3139f30a8d1da7a076738f5bb23352693a8e3cbbb46226fa22416680013f9e3278913d06aee4a62457357f0a68d173a360af5e1411840e34c574b4c6b352f92ce33632911ad8b6710d357b7607ee19679e777baffb8ae3c0fe9786b2e97fdeccb5105ecfe81441f549bc6b50ab84b749fb33f8f6bddcb6bb733d6d5dbc4b29725b8741439b8239e53fa435ea29ed3324202b1bdd07d1987b0e06d8cb51013dad897ef02401290940ce3f2af72c5d1b4c8836299008c10b16c7e3e119e41ec66d9db6929ee09bdeaeda08a50665c052edf77b7dff3d8815046bf71d5015e3bdb29a4f507aeb2e28c536cdcc9b8d1e89849a0683d78f99dbfa90f94aa5dc08587657a8f042d718080de5d4a973f232f78c387b63c7143fc2a4380c491414a18b6c4a7bae2194b62e798ad7ec7d09e409425f6d0973accb17e4d860f8ec0283584cff076d93bd9b0c4873f9c57cddcebe3c3bc8afe793c6cb6b26c4582847b07446b7e1d9757de6bdf0df826cbc502bf88cf3a773866d3ff293034abc4afa3091b2126a278f50e47f2f66ebebb616e342098ab690f7f5828bf8cc4742c677d378893e9f188e8397bee983a9a0998de2a31798330f8db59a8581e1c847589bc0e2d95ffa68e39226cc15cf6cae5c4f5174e7848375391dfabafec202565ec2383721339f04c5c5d1da953d88f18cda65745ee8e99805e35203a6545a0416923b38c5db3c8aa00d64354bed27d7c78c4b257534bd7a18107ebe64d8c27b6afdb330d8efba79fd1fae480cd51fd3626bf8d79fb651b7c6cf752aa737a5123558420d48fc86451b358d270aacfa6c17f343b7a9956e6f64e4990c1b3f1e5097605edf5ce4247819b19f245e9a90758dd42c36699ba5cd7f3ed99a7df7eb155749f4b42d192c47cacb6b2865fb9ef2cfca283865cd06e40cdf7f89d76a9e2eb393e2e0ac0e2776da929f3f8e3d325d075a966d289c51347bd0bd523a5c81edef63ce9b72f5114c88b08b16edbd73f518096240a5b37421843173be8df4ac7c587a17ca6f2916f7d9a10dc75f81bc778a1eb730d12b51555cc414eab9c066113a7edba9a7f1a18092ae47f12f0368ba211feaf34a3b48a7ff5c91b81cf7c95675a4001c95a19d284fe4197fe8823909a123fcec5e45935da12416be1bdf14918414ad19b54a41052f5b8417ddbd207ee01d6a3e62fd9b0321b1c13d91d6ce15ea7b2ea0c670a5f5cb290ca8e62c26c6499104ab8e9fafb05170ede246bbf7313625d1fc9576f1609ffd08852a2f4b73c04f1f4eeecefe3f3eeb2185a618b6dd3e87d9d3fdcb349cc83c21f26b6c662bbb857aa95378e991640a160a23cce76153c134508c68ec54a5", + "0d471079ad3c3432b6de852ec71692d12d9df4f984554d458a9dd1f28a2697976da8111ae4454c9a23d1c8eae75bbc14f8b00e7c065bc290f8938282b91a1a26c22b40a6708c40945d087e45633a595beb67d8f1c29a81", + "f3dac58738ce057d3140d68d2b3e651c00ff9dbb2ca0f913be50219dd36f23c6", + "bb2d033de71d570ddf824e85", + "238c4e6be84bfb151557327095c88f6dc2889bce2d6f0329e0c42a5cd7554ab16c8b5a4db26eab30f519c24766b1085e11d40823053ca77adfe2af387b4dcde12bc38502229510606ff086265f45b1087375dc4a022eb0b641101c74ad566ab6f230133b7aa61861aa8202b67beddc30dda506691a42032357010d45adc7ee633b536a2fefb3b2143837bb46db04f66a6e2bc628d6041b3d306ff78e96205ab66847036efa1fb6e6a387cf8d5a105738be7163df9da0db48e3d8fd6a786f0f887968e180ad6888e110fb3d7919c42a7f8c92491d795c813f30ea645fafcddf877f5035f133f864fd0ba1415b3d698f2349ebe03d9e76610355e7fc23221c5c72b1b2628a40b14badf93288fc4abeaff5306d274f21938650ab236a39496d3f8a6e9086eac058e365d4335b51eafac813f9175bb7bebb75605909ec3fde6515694e119f7b6e96aa1d6d6454c3a7dddeacc83bf0c1f5f6c2a9dd2f460f3e5b074a33b8d7904e6988ae43a22a87f0933f812e45c4c518bf83e606bad4c3c55422ab2207e9d3cfcbc5819049f55e35b9663273d9d3a6f8a897fa38b0dca77eb6c344290cc007b68d913187f2cd480a40262623a4e95d90d5701ac2b9d858d70a27f0672f919c2ded1fb89134ac9a8ba6ac62931c832372abb70e811dc50cce264ece65e87338231f18ac007c5f68f3b1c5904ffbb2e1dc361d53914917770d66afe28c547d8cd5896d892cbdadc34cd6af348c93bdb8b072f38b085361e62ded7a38b4368824c759ec7d2cf4caddb9191e5deedc8b8388bc4ba2c0672321bcda3a7343c9ea71ef03750912f35624d81da5fa8a6ee676c4efd99d0c7258b844ded7b35d8c8233a316b508d79c7c0b3edabad5db9543615179b1c111bfd78b79327ac5b4155336d670baa592d441c810cb1b7c07f3d35473a45b57e780b7d997782aeecfc0363976fb608d6967844ed00b63ba75996054d090aeb605c195b1ff86f9d9ab5892d27632cbb59c06b3ccd69d33ed5dea9398f00b7c6404fcfe2fcb5924e4cb75cbcae0a1b084ea8b15eaa5847431e9ab70e4afe15b4c82239f6165e243e3b76d6c91d23b16edecad8bcb16898641f8e323671452034a8ec9b42b29cec0db210bad0444f1c5bf3505cc41d514d5a270d556f0a34333bd06cd6509ba253a6ba7a6db8f1a60c99f0c3d566a038a72f1271a178cc3ff890b0df1e7438c0c1a12d9873643e2d7bfeb92379545de50834abe2a345faf7ca49beeab87ee516dd8598b71196b8cdb15e7200cb5bd814338babd74c565faaf33d9a8ed4209b417345a1ae611880ea22ab2e894d5d14a28fe3835d3b2718125f0e6daabd85327455646290ceab89e579ed5e1d72a0172e4a6d8da70290b5022c941f3866f96cc4218de5d2622d13af6dab15760a1ec5d10918267f9585284058aba611ba07b1d5711cef505869831699bedc2b190fe1d578814065c91d87a8c8dc9b0d4dae0c80cd241f0bda3a6d5e714c894b7a48b1e5eed4555f103eb03c9db30efcb855df422d7451a6d70f28174c7ebff536dd2cd2891f6c3f264d632ca924c4e0d84b37cf8e06e6f2e29efac6cf008cc27f062441278dbc9f09cf44987e0e9ca088a48437b0b89efb9cf00d3d0c5fb449fd4b64e21dc48cf300c2d80a502cb583219f1881e78e647783d91dd2f3b389a1594eefd8ea07d4786f983d13e33cf7a34e4c9a0ec4b791f1666a4eef4e63bde7a241f49b5cf615888bd8130743bc8a6d502bfc73ab64d1184ead9a611832b7e24483a1a0fc475d9ff6166b86a18a3dc96910ff182cf326456c4461ce8acb3467f801890eaf1ce0b24791da9c650876e718c0bf43c475174f9712dd4a228695e8f8b2b23fc4a06358b4a6a8e1afa87a0280c3e098f218f7a6d6bd716f8c105a7eb799ba0220837fa5a96c8a22a826a6f7ea9d7216a24acbc7b0133210cc17c8190507badb421bc54997ff9340cdc1ee415126ac46a4fec9fee12d40f06300f7e397b228250f36d6f0d2ddad5fe1898ea690e4c7cc3a116a70bfaf6d2dc996753fffae40ba5280b8356b7ab4ffbc914ec74eaa070581fdd1d9e5aa2", + }, + { + "4d81b652fee892d575bd13dad913d976cf0517c819d5183a72eba995b1f27efe743451721ce34791a15a6b7a6e44f13d4a080563dd1d9d4f0946e5ba3863b9ac970a1fb4ed66458ec1b1092ff5fa6c3f0271a2df8e3f2e97851352be760b6a0e1589c202f00791b1b89ae0ae944ced96bd90754bcfa3e355b735132d407d3b5507fd57f705e8a8bd82886b16d459ac91e921dcb8c5bf0d7cf420a9349ee589a5e2e19ce7c944a54ccc1062a0690f3152300d0bf5cd1871c1391bf6d7007f7ce26018ca2a5c6f76287fd8c8e9e7f93b1806460dd35f7f95989a8b6f9a0aeb7c6b0346955fb50b8735e34f1ecb4859e34ea0f022ff6fb797094206a34cf120b7f4664c531c57da513b296f0671c8e9bf68d9e1674998fe52da04f627f516dee97c2b3c988216e9bd3f58c3b021ac70898651f1cfeaef21c4f417ebe92dcad3aaf50f4277262c356584f816a5a5862f2bd720fac10f1b86033371ed603bc00a30cf4da8f579dd5bfdd571a37af7d2a5cef29f9001bb1605ee87f24ec3b259f381a69b771f78d21c4e43bfc83a916e08830d9885c8ae8ab6367c05f92e5eecaf0488262300f83f4e3bff177590857e149216995bc52311fb9f16f4cd74e07c7868a39b699bdbb7d7dace4c6a53ca7ee6e11741a63a52a1d96995a6dd752356dec6f14761ccfe38a6cd8511204f8f0630a747d6e19a77bb030c61e0828436604a28a7acf4a5e49b7269ac93b93b99e9e2e1c0c47b377f7e44e05ec6659526afbdcd5bb172404ce5a9f8786234114c16f20cda6d4359eb873a4a4d9fdf734e9c40aa4db3ea9a98939210f6c62142dd144eb78191116d194bb766ea96da38321ae27fcdcc196560ac75567297984fabe6072c771899906350f74de6d18518eb6898b934b11e945d94ead02b821fd6682602e03e9c70a1ec67eed33874eb24dc83dd1035fba5928f8f62ba1282907aa8935ae72fcb881b3277ee6bebda8fc75d6cd792677c25f70c87b11e094298b2d5f39904be211ff0980e5b83e8ea4a455622d8be9efdb5aa8466c88ea861407d54d98112faa10293af5e16974861dc9f83b45d21b112cc367894c421f5049e49dd205bd7c15e6a70bc810704e2e3a3659800864912527f8be743acdc474a26246a81fc2bdf669b9be7a2a0c986432e1e44b5675607e7e1ee2a8dcb72d8f1964272926e52f909ede0ac8daa32d1d850158db76b959e4d83c9da4e3bb23fd1f5b26463045d6cf13d187fe74a50c09a654d52d0e2f01d66b9f8b4f4aaf4c69fa62a02aa876f9bc4871aacd26a6c6ccfb9bea09cafbd0268b5b65d60aa23ff504d02fad4719698f8b044ca1bb037ea6af58a06a448080dfdbe6a5d698d5db9da5fb4aed04a46c8fa8b93153bca00a5bf8aab64d2b371d072db2ddb688a9442e948f0b99236828dc115a2fddfa2a29e2d4e02ff0173cf734efd4eb687e3f8712be82abe1fac4be0c1eddda090803fbdce41bccfb58c43038991ba1074b281a09bac5eba58a99a1a9678ba26f8f9e3c63ba095f02cd8f3b56aadc5de60477efbf3dcb54b854f651cc72042bf19268554c61b44f2f338a75de56c3c45b3ba40a697f5f21c4557380c777bcc91a151e5676c2a59606200bd476cf98d20b4cdc64bc3b8670810a014871be018bc32fe239e287cfe8a7cbcd1e8b55e08692ccfb4ef871cf797bc0b1fd7ec37931e35b6bc5d32bbe7ae77b9962c179f96436e4a32f566298d2235acf921e38c3f1942fb7674b65e222d17b95a2e58f072c63aa4bba1ce48c303f4bd24d84963f18c5e670015c52342dcdc9c0b348c7dfac721b568effe2bf2f2e816ca3279bbbed823beede8e12fc5bdccd0f1584deb1f6ea1875e9fb350919b675ccde0178bb83a4aa5232bd5e8e9a1b8daf905c6197367a0d106532297ef89f3bc690b48224592c768bd9c50a63d0881370d475081aef052b444744b33fd3fef674a37898fc950f887ed482d2a51ae615ef5b1dfa3a23257e6a6a319a4e2080b2c4094bb09e4b390d1fcbefc4d6c5dab620f8b05b1bd5d976300b007e2b8120ef8a6c9028b7d925c795058c6bdb6711fc5fc2476b9810d1d81bd24637537716edd3b7068b802c531531df710d3682f9865530e1ed51b3b56d860ba4e972bbc74662cdd1e2ea24f81bf469193afc02b14143a32e9556e3f2ecef97c65", + "2538d98b64b6aa9258f9141840a5abef66d6037a10356366a3a294719c10d6c148b04cac66f63ebff052d730f8821f5e5822d869573bcffbdd636c7973433abbf38767597da5186df8ef9df071bc4ecade2633366102313e659db8d8e0f293d379fa2df79f456497", + "a5049b0aa153e282457555bf6f82b60fc81aa6fd1c2ea3db031478ffb74b5b5d", + "350287a6bed5709dfba3d35c", + "849670914f5fe318eb01e8849e536374ec11e813acdbbe6a5e82a506f6aef4f916a3a7fb2e41db3adf990175e21f2386d1805af9bbc32a6ac156b13b1a9505958f68599019c4b7297314229c467114754277b10e9f49a4d12837ef24184629c8902ebe2a23f740dc826b01f8963d47100bf617b314835e436104eb207fa9a1079b8feba06d9369b9aa8222d38d87096b73678bc5db9a1add59394530e678b6ec93a80efc6e8320f2909e3e891306d69b016ade0d30cde64c2c903b401f9d01a29b5cb8619dc68ad6c21900b365a6b657f7d9ca4c145fe598a94eeea741e20a9329996b17aba5d7115c93623f2f5d6927068d0f190b49eb885429d771bbbb3980e9293e4d664a71c3cb629d869dc97e58fc3d328331b11df19a38d61e1705ec4c3d779168abe049e9d675337ff658e00d2d610c8f227d1341d1c41f1c01d8b5d83c4b1b30ae4318da9822f46402ee8cd5cfe9f3f22d90a5ec2d0aaa0baa85e10f5295cc6005c5a0887287b0c867a23da1a4c2196f91fe0bd4f0db1ab324c26fe6088d7583f3cd052b7f6fca38e8b21f98fd07fe78b7657da1f586f1fbd3d2b4079e20f21dccc0d269d53a29deb7c7fb63cc291d1d2c50ff163e08ce612310d3bd622f2416e193078ce4e1463f8a3490578af96ca98e665468281f1af9117a2ed23367df19b570885de9d6594f09aaba4090bdd1079720b08d54311793c97bbe14433b031c865b059cb4f75db74779b82c4f83eb4bd829c62eab995027b548063d7cab7d1a6f9642da6cf7181c0ac71594b97fc2c84b1768f81eb287091f63c76623c61e7ba90c922c74d46b9ae5d8094d9752bc1e8020a82601c356a201e0473d540053c707a88f4baad37826152dd245c4cee6b0019583c61e4327fdf6bdcae53584cdba8a503b835bfb5df9d649705fcc1f09376eec96c3da1e105accc1cbc21d90f527041a9beb85f8cbb1ee8db798838bb45374b741618f83b5d0801a3af2f640abdbe74ec3dc15d6711b4c1480aa8d6084defba82ed221ba359c9744705c4feee0955c27ef468cbb816694516f73fb541e0ad4ccf99ec8b67ef090505d1f7c4c3a8ed7e291c820261f12d92bbc6609da6c275349819848c9112826674f243acb9a29ab73f17c8f8af12c7437c11972c824f00db7ad284e51b9b508a925f0664bb259b4443d56463bffc9e5d845c9b9f79b24c1f457088fadd281f48238866e0b92d6253638eb188bbaa8bf6a81d2b1087904974752697cffb00b4ba05e5b7b842a3d2c0a743e4bd691625788fbe9df14600643b1d161bb2916176b6ee40aee38dbb594ec2735d41369ed3a0c6dd9073f1eb51d1b77eb9a967b53670a8ed755f3b2b73a6cb50a9e1ea7549346646dbe4b801c8aa642779d8761b6c2d2e1a9995e758ab92f07c4eb4a23c042171a4b354f434ced5f6d9ccd26cd6c2506e5023dc076ced15566fdabc7364f4a8594cd6ec404e1a9470f52a83052390e4f7789ade9179b069d9f84ca2c7ac9eea51035db817845aded7405bee90cbe92364c8c7cf8a366cbebd7a972438f2a9881395a8610a2cd0c06c46b60cdae5b1f473f4fd6ec48479cf35101656f05485198a470cd36af22838e7ba3e28863cd8ba7bbba7e3c2625c1106a6be44c9e3d9b9938679b26f0713c62c3757a2dc8b2d9eed5e652220a7711cd220bc91a9afd7c940dd8be71616ebb8b2cb0686dfa161c6ef56994a3cafaec5e79bd0a2531fd1c1a42771acb101a38988bcba51ad85bffcd8c67aebec5b37d526b29f7b9d31388e1e7ad7154f8e65516f0d80a30b88c2b868be2541d19ea1d2bcbadd30e2fbb1b4678bfef7f200e0f8309ac0701000c52ebbcd6fa00cb85c8d3ea9c5aceeb3adcf3773cfb3bfc9ac764d031d7c63ab888e9b03eb9fa74554dab4719d426d0875a508c8c86b22cabfeeb70b0f1461db4e5f639d2a2d28a089dbcc48e3f34394ff1acb887b89f75d3236c8143bb9b06273c3878744340ea1858a9f383f8bbdc259250e23a3c3992bf8b7ca7e1a66913547710402bb538a8866772d11cf4214060ed091d403e1c9ca3af75859259f88656a1cfecfdb49d57c193e60a2223627c681a2fbc7390140aeddc19df035a5207adde4f5736bc542bfdc943ae8b094f4a8701618688fadc2284fb423f602c41ad8ee11e5d9fdfa67fb7dc7d4dce7847d4875b3af667168ebb6082f6911c95", + }, + { + "67f0494a728fbfc84e2f4a043e121ee40f3b12b31616c78e157ed970db28674318b08d8b3f4c538d7b9d91b9b0b09ebfebb07201c6398fdbb8684c9390b3d6a8636333a3b086302b24c2e5d47283935d33065efa3fedd5f755218be5d4618d38c5c1db75470ba06bcd853f3f08d39c3cd9fa3618e70b103c2d9b2101fcaf39c1701436b720d723ed5c622d6535c9a10ec4d727abe237e80fd20911ceb84a90285fc6e07f9d036cfa65995f9b6300a927d7d0d2b907bac9d9c4daa87c2438a583fe85029c886f96ed08f5886bf53292cc0265850a1f4ee3e3288b604dc305d0c28ad35e1242f4ff4ae988b6deba48aabcad2fc6cd7eaab0a63510f3f915c4bb9f9719b1d90db123f639d9d4f3227eafcfad769c2b204dd2555dc54e738909122022c4f92f751d25aef6f9a1187750e825c68450e6d1223c2fe88aa27194b492b6788be6eda80b9b9f053cb77c8d9fa15324f23af5147624fc00c66e947b004bf38b31e1343c7cd341b98abe462a5f994e51d343664968624a2ed0dea9d0299d5c5a7e9097fa63d8b3ed96f917f693654766a9adb01110fa3fe0d8e9b102860d5c049df3fe00ccb2ed62ab05583e6aa0a5134d55245d4f643e274def29d3fc86d79979d599458786a8338b0071f6a01609ee6b2e4bba9289e2df780bb27491890d0b5ea650e62df819b8f98aae99a1b8870ce6d3c7785ca957d5b4094946925751f0fda1d62a9aefe3937a912c1b49b4272f87eea7e397feb84c0702929959e38a568460811e5064b1caf5dee53f920c6e19fb16fc9214b5de1cb770b510533f66d8a0e7f6f04ba8ba41869f8018abee31a6042d3919e217359988eaa9db2a10b3caf7aaba43527484d81304f0bef22165f74e9e1031b545ca3d2f74195984cc237b76ddbec85142a06446902339b1883000264031db85fb19b46f320ef3fe316f750f2d3d6070dec5b66ee8ef20701f20965f5171e44c8a99bcbca7afbbd81e30e74c6d48bc4b0d72baf562da6581fafbe14b6cc597f75e53b305036ede219ec56d0c0d29571a9c110ffeeb747fe56f6030dc26c8d3841b868a1ef56840932dad9f3bd7f75573086571f4d9f0d949510a2577d2f8fbed7e850c73ed4c071bf9a656d09dab43a610b49aeaa57333f67d586d4f50683dceee4942db9549f68eef4c5f8df8a2330857cdf2fc4025f2be7d5f0dcdc74a9cb593de91282787b716d416a3ccb8d6d40fa3c70be4ecfda26a5caf3724fad3d98db16ab6d8f26defc68392923b69664b0c2d56f01a549284b042bbd43c8faec940187f190aec08d06f9a62ab03c9f610f64c0010a0939451d5502511dfd3da1fec5a38f64640c7b6db2961def257eee9a3eff944828e9557deba68bd8e42dc7a9c1570e35537993061fa0f5351fd3cf4ec36386ec4cdc5a2882d5f16703b900c5000efa63888d69982e5ecd3e329c8cf5f003e23ce03c55631246ca15ffcadb0fc9d5634252ccda812ba7bf5e343c44244026512062a68374ed4d8add0855dcc22b30148e0cef0f2886be76bafabadf3ae1205b43c6deb8a41c338114895dd6b49deb329ada31b350e02a1bdad4eb05b61b50f9d22fa2863bd607406f552713e302467ddc78213d584b4933202438d63f99d011b97297f5589f35b7e45ccbd76f02453b7a7668c2b1a1f5d1d63eb805c8881771faaf67433eacfb22f9b6fa58b93f9423a5fcf667aeec39751ae17ad36992556431bca77059a29353598dac12bd3036633d2ccadc18f44123e5bc074f4e5ca380095af062fd83b647015259be929011cfbcdc9bc5d0dcf9b688f0f5d74da95746f447a9e1cb5028ccb2827b45129d04cf6990953a6d8ee0e67fe6bdbd8004f4744cae5607fe7ec4a0f14fe603dcead3367b6870d8e751cf57387d04b881f92cce9772d695f19b36e2db2cf6a807c9ee83225f5c09a11b50e99855921a4eced8e631af7c234aa31615c00ccdd7c6ac5ae8fba6e29cc233765a891864c7d73dae08ed1a3c27cd423d8d4efb550597afee8356c12018f496637daec83575f5e38ed2fdbafabafd38483c239d31cb4d104e93d16eacc6050033a3c86929be4ca8914a538bf540b43d7ce7daaea317bee1ab80504846554879f900d312bf2fbb406a0edc5f4f809cbc68675b0b7f09fd1a8a4d52c0929b3a8b9c1dae4b3d599b976867e6a7e8736450dabf5c49c949544386a71419324ea4ce5c4319899ca510f50d07ace57b013655b0929f79dbf3cd629ad17bdd10109b7c53a4f5f04a16e5471e823c898362df43f57ebdd1627b33fd4cafca6cc065d9140acf0454d5f99be47bc87e0f3b4d4320bbf0f21e7c261bb8d5d615963beeaa46bdbe9b83a8277813ffe6132b23564bef5", + "74dfdc364097c39ef91c01b707a522e28edb1c11529d5050ff820234e6c0295aa00591e09d547e9671804d7825705ab44b76c59d1315ed1297ef477db070d85076693013bdafa92e2ff6a654660008b176cd4e8ae23b9c792be3f7db54cf2bca385bddf50a8624397cca8ee3cb96944164e3cb461e68", + "b3b5ccd7ef49a27d2c6d13c0ae77a37abec2e27e0b2d3530cdbb7f36792a7d2c", + "c0494bb7249f864f69beab46", + "ed8d6e964bcde1df68e7f362243073941fd68ac77929c8e480c89f519f748b3dc337b1af6231632c975167a8425b174b42c2c60dfc0ec85a0a212bf5c9aada818a83f9664c8712d96de1036b5e5d8c8298786b753638de3a8da958549f16eb9c723355cdf7b999aac464ec39df7d6c1607e81b88b63043d1c847dab618f1b19336911b4b0145c2a694e61db71e021282006d48e37f10f3b6314dd012a07618228532c28ca84a936e0eff83723d117b2f2db857d14af5bbd5948a0e53018b31e57cc2a81f36aa013a844990753ccb347fe98fab294cbd252a8b8f7246276275d2780511fd3cb7baa2fd1548184f968c422230f7ad73ae9dde91295f79f6b799e7d234dfd6573fee6d6ae748b0a8cd7ed4862ebd957390826f276c2afb01fbb4b64b61a1bfc138508efd630e77580867bdc1e96a48a694cf0db6c2a11f05dd0bc8769e7200bb0749f5798b6f3559de55d0c281eb5df22b731fbbc109da9c68f209b888e61240c4c0ca006d105c0a7f43144021547d3316e5a99f6c429f9ea2f17d77dc68bc9d5125b6260f79bc8b3b8061972e6757d87b6544f21645c0b4debe5224f7c48142c09f35b8e144c0c1e6521f04c170519ff744d61abd59a56d25a26c5ed5972191b25e78e2140f3ce68fe17be9e59a79f6c69619a79b83614c670c7736d19c27fd22515fb5b896a6418cc0b4850e85c07b38b995cffafd9f69763cbbcfa9d1bbea6868244a66a5cc82e815fae09f5775d28437634926d571c2b0d200855e09cbdc67d10f85bd4cc334ded4c83aeea57f8e373a950f135997666b653e8de47a3bc0059525720045996bff500a47baeec97808fe971d7693dfde339e8beca3598fbc053121536c30d0af10f8f5d8e5eeaaaa9586d7abb563fd69e88351f93bcc46520f6d97c1a49ba9f8f6a25cdcfc11b2a722910aabe7435ac8f0dcda9f824fdde80850f21a2d4bcbfd2e9fcbd14dec05c117a9796db49e2f0dc55e74c7f0f615bd049fa7d0bfcf197dcda3ef3de90762e6f6f9f8a8936bd04fcf2a97cf18ecc8f2f118ffbf02b67f252097e4289d02f264161f6f90f79e1e1ef8414b01a9e1a77b88c039ad6eda6df1e28fcfe9370f0d574aa9e857dcebb19eb7ce8af9b19b4481c9fb3e1f0db3b02af483f737ce3ea824b2165e7c0fca8585383d4b0a16eab2c7e3ee5c038f939a97bc8e1c093cc5372ee45d81836c988f3ab3e6ee0e5f9549e4b7bc381a2afac2074cf75ed56b0e757e7966cb253d549fb0902da98294c6dd4de3c2e166b7e45098d2729b1393deb68471d4d3218dea3dfd0183b654ae4092a79357945eea4b28cfd06b40d30d1b4b8f19827895f6f908f0fe511f74ec84cbab2483ca4bdfc6ef50178eabad79b18b58529c9328c13c52c2869858cc20ec36ef7717e1c743d13f9607bbdb0b701d9df6aca7366814e883d23e51ee5b0f20ef70e2c4134ab037d213315fddc89009260981329a1872e541767adbd5ee9501e7df4ef0cdfae9769961f8716ee7dfbab0ec89b3f62e987387d5842e124a69b07245d359052ada50cfd67472d27ce2c4eacb5421b62dd7331da54ebf0989803797f4c8c781d0e2e6477b421c7d5cefc8146aacc0012af3f1f7cd71ce2b1045d86bf48c9a13fe469a1865294e160b4975023d0eb24ed26837afefc250a914f86f8b1f5d67d65e9737e841519148d4dd5dbf2b5a8b073861288ec9793d4b113d71c01727f67d791852fc3946dc912d60fc66bffccf4c45d859eed9f0bfc7f89086df5d5cd830ac919aa7cdb4504018052d67f6a3ca012ed69187cd5fbe91875cfade381bff1e804ba59cd59f0f75cb46dcfba234ab9832c3fb9aa8dde19fc1fb30677ac1793a38d94aefd9ffcd4e777e9e4f6d49e0cdac6c16a36bc2f3ed8e23b80350e3be6d866aaafbc8cbf7c69fe44c2aa80651164803150c23ebe262aa669c77ca94d215895d2ee9c3e325a0bf2c61e419a41e0f7b1ba8ee0508307d49301abccd5b74c054b6c7bd1aa67cffeafee033761d8226d9dbd7214b130a867764062cf4da685deefa23693b8549d5ef5e53df85c19bfb3c43c6bd073e7a836f849587a4747e1a9a3c7194f6d5472d2e3e4c81784a3061fc9bd3b94862c4784974d859134369486f2651f1db94f511c6f59f41da0d75307191602730b88e4e6101fc8d392c87687f3be454dd92fb8ec380715bcd88aadb63717cbce4db91a36821a572c363759d8d0a2ab007e5981b78731dfdea20d900b14f0c5ee6a4a9b532ed2134e6edb4dc267f001cb88dbe43aac4aad453b839d035697df7de98ca7a9ee7601228a79004b89796e9ab971aeb8e62c789bb21f38b77b492c57db402bf6a42ad0cee169e9251d865ea3e5f79b1801ef1e53797aa6c7060d6f9486081", + }, + { + "04cf92a64cbe135f7fc1d7223b95e41d13f04b482018039f4e7ccacba8aa15ac79a752c5666524e527fb076290ec80a3dccbebfce3ee9b316a65fd130f12bf88b9124d1f7772049e6d0c01fef881a1d44c8dd02f7b6b60e6d15df9e06fb86929cab64842284de09659e19451623525aec2f5dd3e603e24319b1d120bd57b34a0317ce25ac9c2f022a4847306b998b57c8d92baeed0de1f6cfb3177d0acab70de275238f1152813b9ac87bf651f74e1ad079b9bd779ba4374ecba459865b5768d08ae7e1dd691d6821895e8380ac9e5116580e8de3a2c5326e698bf4c4d35d955e45772bae8483d01de2539e8ee1ef9539ee132d80d85fff41dbe406af319c0d7703292587bcf5959f49241e2b03a364e1b682729ed261d0ae45d74d77634afe667413ee210983b042a7ce6dbb61c29d18450fa7176177b5a74f032ea24e1d08b220f6d32a7a836d1241cacda39d6acbd26a62f9dbeaaf7329a291dbf0aed4a2cfcb85ea360947585b1215feaf70ba71eb2d6bb7081b2a21bdcbfdae6ad2513a9dd714d3d06c2c2b7e322a1db2d48f9df1fb44fa066f2bb42b196295ebb3c0898ad55d5b317986afaba0bd5e754cec773821613e908ce2bba6454181f9020b73e758df18c255c87df675cc6bb2b8d2eada44196ac10c26674167f94a79f4be515d8d6a1fd3228dc9a85a355b030845dd4c5f481d5b6e74acc66de730629581b022fbcff61e5dcfb6a7f511aafd577849a6b057021ecbaee53986159c1ba74c3e930c34a159f467f1e9799cd6c1151067c56769e43308c96c8edef8aa7634d909310dba9af2128cdb8c29b24d3ec2a4f43a1ed86d1791c9a670b240e6e719f01827aaa319bd3ff53959a776886a1b7c942a54f141e6bae8576d294e44333e6c5ad90f74863f69bf890126016b318e0f6bd2f0adb9bb861118af5f6cd28dc93d56c8a1dd080b8c810ca29267d410673fe367dd9d1353ae2bf2fd88d57b4202c21aa49f12a01b93acbe260492367bc219d3afb6e6f35502f6529bcbcdddce9fe8632efb034a9eaff8b4a48afb105d04e3fcbbcae010ddd6636992213750b12fb3e01ab72aa957136e0bae591bfb5e0fe819cac82a98ae8df230af399160594540640c6b1d537e7b5f1cc47b08127ae02c35b846de56c4c08773fa18d4436e14b76a7fc4bdee301d0af4880306f2f33328ab79f6f24ec779b2b1928704f09bbc5b0b7108e9a115e4959df79c80eacfb98649a0788867e23b2974b22e654ddab0494bc922ecdf17727d0f0efde9dea7601857d890bfbacbd93f7df794bbc254f50e1e17eaed2f5d5a2e6c58083aff68434730d406fb9fd02b0dd7bfb99a04aea812b6830fe5e05a044ca21c77a174bae8b58eefa11ecfcc1c977bc6218064c9931b5c92f13cfd05799f11e130869c293c1b08dd29c899365014fc8195514b286c97cb6dc4b8633e47751f87fbaba137b6aa04d072ae06c2b2f34448449f60b1272c1efbd4722a2be749a3d2e5450aabef1f7c51bd8324607668a8caf8097c2f358b1b09fd3525d47ec9a7640eb20ffdc17c4f7eff63df75dc7830c471ace3a727feb11533d6e9a2a08106af33069cf482ec63724032e81cab18e12cb5c4c3ddc374e2f75bcc99fc5da09b80a738852a14e8ac552b8471c6ad52e35317b730db2c13c277e06c643e0d0fbea43833de4d2c7a9247ff040e9c56f1ff7ea92049c5341c4d1478a14275a10119d934e8165152b89951bca7ee1399dd8232fdcbf831d8354640e698b68799d060ceb877201b2fb96cec514affeb28721e163e1648164b9e5722271db9b0ee1a7f96819fa1b1590e9daa598d9571ffa3882db9d034056e9b2785a8d13686eba61d7d45cf2e9ecdbc391739ce89297211472be18b21401658c5bf29fc3615924382d802a166d05dafe7876e70a0d081e80c63632da379766928a0555eb5e7a238cfa4da267527c66caf34dd40055f2801b29b3f5604a5bf3d46048bfbec2e24abd2fed2481698a4b5cd71f5d2c12dd473b903c9bdb978eaff7d76fb69951005681ed7b0257054eb3dd6d10097fee51ba7e8d565925e4091cbb78d255c9d3ab4ac0264d172c9bcb0908db1288c9634248f198a1167daa323822058decd83936985f83b08b1e7b942756a7af200af168fb8a091107b4443fd649cdc22106f9b9657c69f19be485c23b2c715b3762c332eccc44f380883357d10019f20612ab6b8f155c2af9e2ec340e5d8f45bf5278ac1fbc9f9f44d2f615d21007d822b244b1c7a0dbc182c7f5912485d6e4d74e90f60a2f964e028c63d49c6aadbf1df170e4914ca514139ba538207b1cf7caaceed4db8423dd1086b2adf15f6c0e50dcf2e12898f53c339a745316904ae03c38b417bcd7f5cd5ea77a4f06e65d56c24f37ebe72d271ac79b6ddd2bb8bd67f0727ead49737aa71af4f620da53769ca3ae878adbaea5a249128074ca3ddbbbaf5a68f9cde2a0e8d69708b0ea7f4c8d2dd4180882bdaacccf2a409a681c551776bd10439fb12b7548342532b371c0e045d8e8c895929464bdd4fe25f0533c66104daaaffed52446094978bcbb389c", + "001084c8a5175c0ad43108f9215c35886c82321c800740c6118a3fcd45776a4588ee0e2d056a37d99b40d2bd9c0845088a77240b7e65d18fef105d3488c77910b5873dbbf275948db5", + "d614d2e671066e387f7eee07bca9f9313d86e6a4d1371360900d670e11ecf1e7", + "674a516f8f59f9067e0485e3", + "1ee376e9e3c89b2147bcf75480ff0dec1d0e8cd45ba812f34c84124871d484b4ca87bfc8cf99f85ad452c482933801426e2737a97468809fa36caebebe8eed07a626b3bc3614ef1ceb54f9221ecb16f413f0bd9ed4b3010c40632f05223484af7bf5948c2fb8a3d2ce04c53e3f2682494f3969a0f8eb738cf93c0141799c9e6b68924433f0326991e19626bb19e6fbb5dd46baf39f92e830f9b1ff465a007f031891fb1f1799cc122d3ae7a55624356b5297bd5d948d9ff2e414cd8adf00a53524df43f398938d33c93b2c06bcde2679566c0a7b0177b4a873f35874739d550712d5cfe3d25c19292ba97c01d84224738bb25546e5c252fe5e5f260ca881aaf176a271a6fca2edbb2cf23ae6d4c56c20daadadb8205c2e33881867cd67ae6e59132edccc3601f014b744ff8eb6aef5e09b358607695d3af42ab8fa30e9fdf99ce54427ba9da3699de19f7a8f9be368df47ff0607601a91e7a5fa6e72be50bb32b825427cdeda3972a18a23af290986cde14f5fb9cbddad336f5efcd2d7a0cf3d5b23e54b702352fd5ee52d7e3479441497d56e17d5868574c56cfc421ee47bb00e9c75b84262a1b9e2cbfcccfed9c4c386ef0d2c1be9a7b7556909b5d72a38b7258acdd624de2396c75386e077c34f005f92a2203c82d1072c8998f03b1df22de832ac733977705453b1d72336b8d371cf1ed3923f462ecd22075de5df68c83ab1e6648ede7fd5ee5794a744abcb32af73bcb182cf97d36f37c15535c4107b7c8f2321f9fe0e2b6ccbe74204df3d748c05bc1e0e2c55ae1aee2d4aa4a52e98ca7229d6d06576196ac8e4b14a9ce807075cdc876aaf904c9962741efa8c6caf41e6b87b2ecd6636e2e58f3ecf576e5d8b895162545e618960ff6e336ff17eacd5a1eb335001633fa78c41ed05466d904ef9b81b643a043298c0e291a085e4e67da72e329adfccc407f800709865147db49cbdf4232073b7bc7ad89b3dd901d927ee08ae6497e0f2f9d052ca8d7444d2e2ae2197f930a7b1c8af38d8739ad298464169823684612cb628c484f710cf9c552551b6837b575a43275100bf800b7a3d777adc44d07f67cee5000422b9049dcfbedfccded0f2aa4d189621579b01e3fdaedc4d772dcc593316ca85e7aa248d219dac21c561d318a4936ac0d3bd5c75311486c174e0e2182affdf69bdd6a086534e4a602efba2b9363beeb5346539b45336cbaf479da6b15b226a9ac026482216dedb84ae3443b306820d9f05f78dca7090d727c7481d82c6e5df80e189e24e46f5758e453e542bd91a58eb51a89e07c50afb543c6b998704432e863dc4c0d0236e0672835a7b0b64e14f5ced2904e54da4287597f920bb4d542c35d3b0271cf0eec055656d523d7d2cbd667445d3e8634854f8616b7d7a7f3e14fd32651e9df40e1daedfdff1371f16d5549ed5646adf2d417e4b3a4d145bbe0974ab388c2716861a08296b862e4fd035163281457877eff89dadb160eb2b780414435784804bf4fd36602699d8c2f6a8cbcb509198c38e2df2edaae7bd7c93313ca98a9c2d24419a12ce35b0b3d68c18840e3ff8739d70969927c7db9a6569787bdedf5c99948a9e79b2302a83a71159f4c789b3b3f05f1e574f8a24c899ae3457f8e73f9bd86976fbddd83b1af337eb8da4c0dbac3792921597e18a2fd3a0ac89a270794529d370d36bb6dc7452e754e903781cbf57c8646b92d5d02842e7df229b3d721f9b981f9d61a48f00e53948a5dbc4f739849609d94aba3e3f5f8163d40321576cb8eb8e89953b608a01184d41aafc13f40c47b12240e3ad49413473c26b6843f4514be221c2af632d1a54cba230457f23f00b2608485c381ae03b389ad0a1671fb416de4659cc7f7a9c4b6d9807789c307d061fcf613b96a2d79e5e3e20b863c8b1b75f35c982b40ac8dcb7d2712ef7df94901facef783e8015a9a48574aa6f0cfb0bf6c1a3409028f8d62137c347f5a35ad6a3cd60d71aeb29bae56bb4590f69226fb4e08fab7a9f41e58f4d5784540a70e7a97720c549c8440b089eabd0eb3e4d37a2e54b1160572ce568f4256dd244decec31fec555017ebf488e878945383750eff26a8a1cca73e7d6f52d8cb229d5603360a3bffec23029ee34145c4aade82d486758e0aea9e1b7bf0b4bfbd4fcc96aab66a27fb463b48c6a6c5c5a60253e2fbc5716ef55629277a5f3b89c300e21bf1226241ce0d587fe3f5b11e47f35614169dcfaa375ee1aa589be33a4363765368f5666d155cf72e851d426fa67b982aac4dbbc29356d71deb0715b34e00b9fd8876bbb09ca0701b15615f05cc45e128b3864b26003e6ffe801c4e27402f37b8997e0c29ebc273dc03358cd22fdb68d9cd3b56ff8248a727c2d4ac65acda4d0e0f511bc07ab06cefcf444f1002c151b953d7f7b19695668a86683497c2a2d2e69f19a4997148d2e8d158da859c8f44437d9ce9db92f84a88e89cbffc74c0ef4295088e2543a4f7c6ae9c908bd987bcfd7a074f83ffaf3888bd7f430dc5a5bb70d223c21b1bcd8bff2103408460df864dcc168486f6a66d67ded366c6e10f50bcddada93627cda711764a57ec36035ebc", + }, + { + "ce72c93caa49bb9850774149a87fcf8e23a0c53701554468645554553d54190bc6e247712b02097b794bc421ca94afed34742435ca689d2ebef183fb469c060c7f4d7daa508726c9d2eaeb9c7e9a89b30faee8d9168607d4778acfbd27d5caa623475073ce763ca061273cdfc2c692d1747baa8a01b15f783b2e36620400082747599a16cfd6b630fef310c0b9a2912d1d3bb71eec16972745cd8a49cd927014eb0a2abbe0e1ebded4fb9e8d9e2fbabb6a71da5688717ecd3e08160b9a861f86904a41702b2c4fff28ed8cc61d468187b75bde3fcc5c0c0a642215fea83584387fc5a9aaf2f8a91ae535e0027b618a32bd687289c47e9428a1a92649deab825d702b076223b07c08e55c0b60be95937bfd0504c18398e924420f6e20baf07e2b1b858d3e360a461b66517c24e60f9fe314a4a4973c8dbc7e9d2a9f571a1d8235a21073d81ab9f4800b70a5f17f44d593e8792a2507e6a3a41042fb2a5f7e5f028ed2daa88cce28973ecd88bd125d50fad77b1fde61c38272057d9c65fbfc6789ce41315a105af14e277a0c39d75c34aed7538c39160eab1c8c47818743e8111229426c399c5e88c4d894fdaff0315ec885ea019bf9acb785f3380c37201d494a60b583fc130bc0eb9fbe9b90eff95874e35910dc05c761f8006e2f208b786aeb2eeee841f9a82d9966c82956c181caa4dada81dfa2e2d7a25007c2dc7f2dc7ad1bafef14581cadbee4d614a557df4931b9ca105bade8fdfdefc0d96eeda11c08500b1ca827ca670ba07bb0f85af92914c43a6f71226d6e112d487f1ae99b2239a63ee2cd0849d8a9c488a11f82ca334604a2b7260f25373c6db75656527890f9b772c6bfbb9f687f27099ea9d4d1efd874a6ff83cc36c039ed1690408f20394692ff054d9e6eccc6776b6f4b3c5f24b0052334d159f40b470a9b8799bbc0df4dbfe59a5e536624cad193160ef23abef85df2c9b6e6d4fdf16f848a2a446a77044f1162a278866c491982570cbc16041908cdd0efa2cde011526a3c96d4b39a23c5fcc53d8232869cb4dea871f4ac8afc795aeb1b28cb2d7a3669100a1cab2ee1a7f31e2a25a5c6da836e4b771ad57393305faf582adcd26045e26b618d9943358c615fb206258c8993d700adac7440dcd3ef34fdcb065e10e9c9727662b5abee160aa01d2f2ca6c203a76fb01bb08cee9fc1eb6bc7497bb012ed2774a2d263b9dd03d60c307ccf33233ee33eee702c8e3118f9f86174a97462d0e804a24bbd7f4f938c7f105bb23399967288069e1637b60f2f1883d88ce5a874ea4bc0a7ca0f3b568e4bb1407e4bd6f0d3dc8fe91345f8435d7b1be961c45e4b0f1ef2d92d2d30bb78e1fbf72cd2e7ffae76e8c2bce005195c2003bde46108f37ffacdac28fd67a0de62970b347f0ae3f5f3a5b1d3aacb2fcaceecaf2ff4a2aeef6f5a176cc1b74b234f5658ce603bc353e075278a4056540e43033d37a6eb2615453d8206f5cd294423811283bcd5d79c4afe268a547b98977ed5cf24c0f53a0533bc0b2889356cacb67e2f7353060f9e04362859b1c1f02f96bf5457b58e5ce84a6810d39d7c7f53faaec64db5d6ebb90c1412bdd503ec6bc240c277ce1f5f18876feb24eb6a77e5193e33ce141e8720329add079dc9735f0a35d7d85436f1dba6dcff9147777760b5aa2ec9c8b5e9fb4fc602ec8f754c99ab2372ff5963dbff3fda91865108e606b214cf7acab875197e78060eed52a798751998ce7c73cebc4d5f429f6729a5193d7593072d0921ac8127ba6e796107ee7b9fbcf7128ab35fe9f6fe501fa4695c19fd64460685f287acacf5250efc13899bcf80ad5a340d432a0b9449affda5c8fa090f008e01873aae7d5fbc7972451542c5c29cf9cfdf23db736c8a7112536b1b626caa63f3e4117044cdeab612fff8d8c194d19174f56ce761f6587349c48fab30390f231d209461ee7e18007d10d83ea5aacf199f3b00003259747b1d03274d3c3670595604bb4482d345ffe31d3e88c70da16649a2677bfbdbf618de1d651a53d573aada2eee5c01335ce5519a6d18a70f7ff0b1e66bacc162c49f7f29b9d3fe2c7dd85b6b355c9f9141f02baf08d2be87c36f6d2e1b2e90dfcd100886e306b360df0ecb146a6aa5ac5ad05b63a219ea65885894a386248254348ada17908d776f9b438306ad28b208f80d6b9b265500aead945134b9d388ed5d6205edf07c5d8bbfe0916d0943750150e09c76359d24e3317517ea489fd8a501dd93f159f07d19d00e86d952fbdba2db771910143df346b30a30fba908a1abe5349c3f241958f428dece7ad9a91cb42035c43573b87b26c2ab216cb4c21799f6b3d81acd300ff50edd6fe7868b9ba6c160db3418565ada027b46b63e5d4f3411284fde585ed3673b424ec1cdea678e4a43c262991c3c9b988351d6e0a10af1c959cf21b7a288f2e4d7b3b2c11b400b5e036df71fa993b72ce48d0d8598fe4ef1ce70a970f89b55cf4f07906a479bc84a08bf6ab25221de37afebbc47ea0b38b87be128737d7d43cc84d336cc6ffe1677bd802910a2084751f30398dd0ed09589b2befd2f3b40fbc013318c822fa2faec2323fcc52b43161f47aefc557e92df3050dc5f8b1c5a4b2f8bd7b2ba7aaca79dcfa362fbe7781a2e261683a4a862d5f83e34845a8fcf8a1aa73cd521e87cbeb71f20b20698cc34bee3b8628b1a3784596c", + "08b3fbd73d157e79ea9f61665d19867dcb8c1598c1d37b793606936d8aecd992a0d46addeae857d488b83be5d1c1639d4d78350e4cb08782b61bef4107c9d3a79d3d85", + "a56f38b4bbe83b3d9e562cdf5ef5b30593f08a1a166676c4fb0d5861654e640b", + "8726dc5cae9497936658f603", + "88420357d1ad70e7c7bfd55b3cfd4bf06cd4e9b4ed5cba681045199a06985956d35fe86b28b9a4599964930d05d230a23c55a6a152f67082a453fc31f68489df05c553f9ae5cdb3f611445db384d79af865e52440a876fc4153d896b7a2318dbc2a4495ecdbb2e9dc68022326d35289e82aa55197aedc266dd91ba3018c7b474ba22b4e773773f3e9890ea84bc16a6b235e4bb69e785c40c1adc15b0e0ef03aa147b0d14e62341e27398b84a53f72c9199cc1c94cbcad2bd31aa69c96b06d01775b8c0f80278a43f526664bdd430164863c9c9140ad87798a5b8f38dfe90d37f54d1137709d5311136b728e6c799da244294daa4c8b44bfb0acc603a16c088a081129a0d2cff55ce1c4ccb486fa0ecc3098ef2196f47c49f9d253112bd5746fd99df5d2be577617dc2519c0ad04ee49ee1d7be3d50492017108fffc9a414ea227af39fe49fb2c895fcf00d927bf4a2d78c466fd44df4768e6775d39fa5c834b60979ca27ee9f00faf37a090838f56275a894ddadd265a8d2de74265e4d8d286639ce8f01eccd4f551cf6b4429eae3f08902b6ce6ef422cf91ce8946d9403fe8064784895b62a7f5df76ea294132c59da6b9f53d4195c1e9000bec499c14cf8bad460aebb024a76ac50616f0dcda71c0f56dd3239b11764f3ed6ed06c049b2ad673e4beea391dbb854fde1f01b1900858b9809259f3906b34f95a1c6ce8d24fdf0cf7c2ab7bde2202a7f1482baa6e51caaccef9f541c377da620bfbc63955cae0e6644ec8ed6878f704f1dea30d6b50d4291892bad19b0234582d50c6cc0b4165322cff24a9dc2ce1be35be0fdb3bb7abb777ff0b2f4cf16277388af5a89220d59f1f45ee9cc2a0fd7af9aa8e9e8d548fd65be4e47e7f8ef58f7701f93a42e7ff78f70e807fb63513157fcba96ad9731b2e8f80da85ef407d5c368ad16f0657620bfc122ba1b10d7ac2bf46d8133a9c6fec1fe04882f3d5765da8f825e1984a4313f72b67d806ed45c000dd3ddedd524d474b9b5788547d0712e8edb4c6c586d0cdf8f2384f1e093a7f6dffea6e79df9cb9398f5d0b9a7cbd63d489430fbfa397a0d03ef916b7702f33a54ebab84a7055b7ec6179b0ab7722f03e126ed343b1cdf2af3763df7e3a070162535514b01ad86c6cb051859aba1cc4766b12c8cd57b73fdd3c65af6961c45395aa7b885dd59e115db885f644e1c94bfa26b3804f767601c86e2c7dcecd4daa59955e6a40991a4b4701e63fc82b46dc0ccf59af40a8583171375551c868436ede535705f2e6380c5899cddfcaf9e94314794bab98846cd5ba9e9afbdbe1ea7fec5e22e7b2aae59fa598f4d6c0cc6f936a616e11bf01a2acc891cbfa2bc53c511a8a3a3da2e3aa5907d123ab2a4a3c0009fdb5235a3c33718fe4c504e1539abac6370e06150c402b5fc2f8c32608db4ce2eca9d1e4b96371ee195f6cd632f5b972385f9d5d357b87c78cb4e2c27aa9851534de14de923543f5fd9d55e34d6e8b7e1f3f2735df80046de01f79d0321066f9bbd76299c7386d285f7bf4ac15e033e89a040710c90f87aacc09fb8159f93c8b4860247eef079e32d05707e88aac734a2eadaa853f528d9986e0af3435b5c5f44ddfdab9b0c9ab3eea97676e920f80d1794740067f9b229fb018c804e595aa997533a5e967cb79ee58eea18995a90ac08333f1c69600b17ef4f454f540dbfa8b502457761bc4daa876d9053ae1f55001b6916ce559dc6268d01841255990e56614e6f4ee4ce04472dff0657360d75da4e83a71c852a2585110e53137e91bd89d64d99b5614ab2a5691c876f15d9931b092fc6729c0732db5cc40f966fe440ff99d7d05b24a872f552c27fb0cf2af443340b153214b407fb9ca3750d9c157aa75763b0b7600959663889d00f392d6ebc12835bd2f03ad802a21d0228f1d2e9731d0f0051eb2d5369ab790d1134c38e28d2bc2d5d57d6d897244742c176559961a1e40c84ee5c8225c8d72b92352a011e3785c262aac115cafccc2fe1b5e81a677a0220f207ebadd786b93f58e40eb6ade68ddda5b66c5f0f6b4b95cdb8241156110ba3303beb79acbd54423315768bb43b4fe8c4a465e50c4e63bce272c4d731ea4c797e14b2de31ce4264e2479179b906f67af4a23c56e817abafedc2c7a65aa45f0c89fcd0baba60561a8d013e2d5e0bdf9fbcc1346d3edb20e6e9f9c410982e1ac43039ad8fd0ebd453a6788376951fc20374b59946a6803498929d9fdf2e0f5e58c441329a79d1232e957b3a9ed17231c663b4819dcb6b4e33d205edaeb7d7ec466930bd84a064b40aa67fd76f6ca005408062b45b5aed6f8161836c7160a8c8313dc9aa1c6d42c2c16972a1065e41aea9c58db7916e1670cb42a8b54d85498561b4401761506860b19b446655f8988101fb4c45067e30edc3f00df8d88ee34111dd6626d605d993ff207be09704fd8dc242ce514bae77cecd20f10d4a38435a3f5e545882fdc224586a04ca6a162e118d23716240fa67892b78faf98a17916471f7f121fb9f85497a0b34bf5aaa4ee1ed8a4681bec55d1b4973d4368600115bea70f20a37c9e942b87f6cd1e2ab70fd401e703e3c8334c75fc338508e06d6370779578fbe737a75954b4701bfd92028ec32d3d7ae606caaf9f049d9774f70efa707c1c1174d9fcb5b0a0ae2a961c6f58e48ba82c2db14ebbbdc24288e42879f547b855c86dea9a3b9877e4b105515bd78cc43465", + }, + { + "bf7884fab52251e202afd7b5b46aa53f85bca5fb80a009d8016e276579e401385d853312a884f4aa33cc5fe7360426bbc0ccb7416cc0196e2e40d3a825d5e0825a1394029789acca550bb28b10d847d0a4fe1111be2b7fec6b5294902775128288a784203031ea853c9c104c75571d19552e2a1359a900c5fc9455230968a5920f2ab23f5b9cc49739d4e4ae2c01c7812ff295899b954e9729a3bb330b60c51a8a7759e5131d7d4cf261fa1e62c29f91b4341a4fc968e7f30ca2261702eb328d628b7275a9efc29b50bcb9b27e5844328d5e8256c76949d30b6fea0d5a1c9abca80d3251fcf4ec4db0a5ff2ffd43618aa2e3e1694c2a3c579a2665f443ffb1eb0ce33c09d7285687cd55b6ca9918553bfb36a44860e09ffa0604ef4904a034108370195a986fe165c598305eb08599abbb3df31b1d93162397056d9ba5a1ac2812c582aa356310fafb4058abc5f157802e4a9b4bddb16e75b6db105b7dbc838f820539b76949b1648909104efa67ce28b16a738f1be104d2bd142d3ad1b1c953b6020a1f4cbb84d5c49424befbf2e6ac5c593b783a3f4af75477312528fa78dffd82fe493d821e011642bf1135a5be91fef909383953308dcb61b2f35c2ad259acd1a2e953c0ea6a03a97b384e39c94c33d3846c26b4f9f116abe572d5b7cb81886d6adc2d544630fdc1684bfb32972e051b9a2bd0931de63e025813b923944290fe1ebd5264ee4f25569a2088314e8d4ce8b91c7bd602b9d85acc917d60d30d5ef1cbb055b9ff7b0f999b98caea2517d2de334eb436078c90d41e0e34f11b93e3e643389f43b3afdc4f47a7396cbe0b4bf159ff27618cb835aac6699be1fc7ec840b767836a165fb95d06f2cac4fe15b65714ddb8a095ed4a5b57e63d536405931b6c168683763fe07c32aa4130bff787d4d440746a2dbfc584a502d809076b257482abf7f8ead7741c82b54c41acd41581148aeb4149b0c6eeb39ef7ba091c2e8bc72583b2fdf8ce7fad1bc05aefd6db0360c644a9760a9729a88ee4b2ab123d7238c12435b9f3b4660e74c0fd4a9b00aa614453d84fea01f779e5a924f8e79630a8bb6561ae19c7bc8d88b9d823b98285fdd65d4cc05e443944ed5d3cd4f46c7cafd1dd5deaa519772dd24f508bd2d588a832d5689119a2d506ff11dbf37d57a24e35ff38da18af07eaff5775d12dfe795fd3e1f0ec83c5f283d6cd76532519a15a18d93431893b1b88929159bf8fd21f62b30f4e37d540baab0e30ff3349a08d627ac19303fcae8b8e3fe44eceb66d30697c7ea051bf5afdcd8bfc00d49c8d36164ec9194a78a4d8b78826863e93b6a810354861f4a35ec12e5ac102f74e390d9c0227e67acbbe3254e5b892786e3a88a383ea9726485854a319569a678fa70392cee90c9aa83eee8df6800565bb8e083e78a064c0f8b863120efd799ea57d3073663c0d0e7bfb9b717ca1d6372fdf75a77fd9677791cb899fc8033d6d806de1e6aaeef525ea909666316d9d604c1207cbeb6f427c3acc1b02cf59704fc65135703f2a9529bb2c8fec992c4de53e54b029c3f2a5fdbec1008d1a70dce0c11251003ce62af712b9e4abe631902485404e4933f346f1b4467fceb65baf776d0078aae6a2a1f95b85a441b635663c75b485a8a7cb9a5c12192ac874d940e2d9b88cc05a2db9b5b35df769925da508112ab0b8f64a1408633fd0d81810baf2c846b222736bd826c8cf905b2c35633d6013f5565e0a5ec1492e99613f53530799052a0d70023339d1c394fdf9f73a590a2faf68390d2a823bc3e47a173782b03dacbdadaef1e67fb47a7cad71b6067ce5b5e41fc20ea1fed28578e9bdfa99faa657a754488ed3fc084faa7a05b0f6eb66da0a28e9ab26bb319fa4ee993de840948f94dc1d68d926b783a0bd3396a89970b2c2595de8148e87b87c21f664618af4f567115d403715c3d7d2f66d7a90de2c5237893a4c18c20494e3faf94485ed39ecfe972c36acef0d7ee57bf8755924c790ad02dcc5c4e15aa7db53eb6040244c3ebb7874676782e54dfdddc256018ae6af8cc37450a4cef77f21e2e061062ca0c2a514290c960f5993ec1ce9eea6d09d3293118237e079b6015b966361c3032368174d74ae5cce4148ea2b3690fbd3c28ee544c5c5bd7bc618122979d52c9d3d44eab1f2467f338e695ec5f95998bbe77dffac42bc2809d43a324e0f5feb4ca3d5fd951b7dc8a9e6276ee080079b68849b14c7573cd02c76027a856165d1043acf99554c62fe32896d120974ae71f84986bfa0c28fcc399246bef3ab90f8e55f913aabf339dd7ca6f0861a9ef712e77dd28740615479f39a37e746c7df2b267066d1649fafe0459f665f3d5e7124db43ab1ba5ff94989acc7fe0935e0bbacf718b33103a1355d97ab416d8263ab369e6cf0ee563a77f2f265fc3856b7d54dc0887ed439a421c14f733ec1d6da086536f9539d23cb8026218c5e783423b5f4ac24c8d5d8faa7186dd5ea34afe299e6dbed73ffa8f415da706442a48808a9342d6209f65ca11eba76f8ef26db890da76671971f65bce9e6112c8aa92523dd5295d748e28857acff408c161c0513b37b855a8afb0764d118815bb1b68f8f09156641f7eea994ddea20f4062607b9919d041c880b71592402a4d5b92464b239caf431a99dc67787e76b8e1d7337af004bcb88473cd16b3f7640e8aaa59ad4609f060a2cdc71a4b3ed22c1506a7050a63bd8ed68aa58a8109980bb3f2b9f9fba9599d7620b8c25e8aee739095789af83529cfbfce5941d7f14c8ae30583deafdc7c25fc34e75bbed6ce4f6b47e9647c12333ce08c7db77dc94161cfc43f7ea0bba39def8bf8ae61c6fdcc0de6308af963c6d9ef43916d0cd2cedb970d5937c9fdd4b888cc66e99363b5a04ae62a4349f01c3933ada64080741b1781754e4a722303faef69e382cd9823177e4d5ac83e76017124a7b1a41bcdbb9c4209e7b42c", + "eaae1c53919e2029c137a80f91704d0871be2c1870d0333d8bcf7f94", + "4c434cddb399e52457113cc7e16f046c3f8301f5b6c296979f8a091a9ea557ea", + "b633c1a0e1ddf4727b149b3d", + "f1de487001a580cee6edadb1ef6b700c861a70c6ef16274447b8c61bb10d2d1efbf104d5f7d7172c6a5cf9c06d886165a2919ee9418e2e8f803d47832dae5ef232ee300d1f973a6298c22d777a1b16264353cc731a7a683cfe31e0abc704460788c555c0c24f281b81d7761235a955c736f17f213a896b40a034609ca8456ec3cf5906d01121b7580ce19d89347b6a59c81add318df487b2442a7a8b5e30df78467abbf46bcd5ee5b994a39ca5bd8846caba6f02f4f1335b73d4e20be0b6ad85966f86d1bb857713ebf947ae936782f1f4929498bbd66bdd5ad6fa252364a5a6b46180e93b54cc321b3cf63cf23d55392475c6b8c8c9dc707924b55544151c7c55ae0bf391f793e52bed70829fcd32b2926600f65be0943d6a9a96547675426b0dca9cc7b0f5dbc9d5439d0281014c6c159d055d6bd89d67828ba7fd2a0570ba82996037f7dcce297fe6518331270f6fd5ee63d406cc5081472bc5f2298a9208dba9398ccf807ce9af982885897715b3c5742456f756d79c70434a9baf7b4b6664c9d9f5696c5256b74099e593f97a2d4a469cb3430d0c3eb06083398cabd58af598945a85c9235a3fdd9ba7686e54d0de9afb594b1bb030be8e6bb839f6b45699dbcd2f771db64b0c62bbf6c8672fb412d60c00b3d87f82ffff6512e8308877573323c5a2d6a216ce3e2ce07c9763835ae59d44d7958fd873e3995b62b1b347e489ce86e023ae27a6cb03ddec27a38fb233499a714acd89232a91d38abce30299f38f437f7a46df647f2be862c1e7bcc1e4263c2147b13ee5b345b7fcb973f3ac71db8bc12309f67ddb62659bd73fbd20664eadcd23a79233386aeec1a6fcc8c592053954ee53826cb9b6bba22400648887311cdfa5414c96d5956fe193a3729be1434d923a3f9849f6c419f77ea05fb72f3c4f75ccec03b7f7aef8c8e55c8c5480ee505ae1a7594e6a911dfbc39dbb0ae8656f5972eb644c64203a920fe0078f3d050cc5666ed9747c23df7853d6913005d0156e741a5ead3bb1b22e5bd802c303a73a961f0b60d0fa698041c22577b44eba5d6071de4b545d9f5de24944c151de6a189bfdc223e0507c74ff929f06a2e7497e8c63073294b4aba110a006a6e9510a9617405d9ee711831e085940006761822672549d1d1c70e50002c2227f6f304b9a7f11dc05751be2dfd297087044d2e20ecfa0c091478d62c1bf5f0aacd25bb0384853762a51144b77d30418b633c4c10a6eda7b2eac46905641da0b685f85349749a91cdbaa4027fc50eb97a7dea9e8cbb5b5f386ace0363803ba579cd16ef80dc40ba1044b4ecd0e81e382635d7855e2341b18e0ca705ff46990282fe25093a248ca04a1fff64ebee25065350ea4b9e5990da4dd2e28688ab08b6d6fcb54d70f6d74fd7e5e05d21c12f5b140839aa966aea9ee094a923ee5ec704b5b709ff009c20ed89a75468c48b505d07c7a5ba1ad54ed610886c9d84468eaa598c71b017578404c909dbca431703e0cb1cfb975a696a1677bc015a75db007eccdcb21b9e5e119c48f148c2cffcf29e245e52156ba5ba0a8b0031570e4cbe7b3ac4646353594f0c4a9424c9d97845c5e1a4b4016df9be8df3013e5269484cf32258849afbdd733189ea11783f0f64d3aba9b4f48818011e868cc03ecaa44ff0ab83ed12981a6df445294ff672f3a16d6e0d19b90007d4646e967e0fb1763b3c879f548e1103a75c94f3a7f72be78555eafc086c1c58d1761aac60b843704f234c55b951a1303a12705f2120f784c2bc1494432a94c835d908f0edd5cbb169afd2d38087ca5bc5e5df9c3bd970dd2da4fb2a00933538148ebf669a20b5beef0402e53dbfc3a0f289b33b41ca27eb2f036a22f0d02e0617bd01e8c74be264515c9b46b9ab6fc67403a35837844580794088a9d3c14ad9309435daa0396f48017be524856ab6c191350529962ead64bab33171a01bb3c144b23bed406cb05102c693ce5df36eb541c47e871acf56f2b47de687eb9b3511ae83d06b1f69fbcef3225c3469c304741437fcd0ff4ae3484c117f51d24b6ae1363beb7d85d9b61e01e3dee901b90f2d3272eedb384ddb4d3b9594b9c0926595e500f8ce2e5cd407bd7a4e2c8e6f4315bf693e8c961ba5b8a6c7f5030c68a6b995e9d3f9eaee9eebc9d679eaf72a5f1cb6b2fc66edc7dffa2370dd778ea7ff446121999afba7bb35ceabf626c6269bc466d65f7f812c663bcb2fd87d3e09ab7d71e727f66d20ec48a5d2bf0aaf0aca05d1546d6e974f90df85c1393e3d45731f71ec7b5cb6cfb4e5c29976ead6944a99df2045056e198b19905362d4e9b765adb65eb089233a8b3777352665489c9456cceed593c6590d9f3cc4024d0bb92e1a0dc619bf8ae65be77456c18f8171e4d2d846073cf5c57ba93adbc0db9799e3d98934aa6899372acfa4d7d2ea32e20164b79c71d7bd33c94f9a781a25cbcafe563462eeacaec0e8d9d6c0199de85558a3a05d1ee3483351915d8a4e65ca0ab129a2386a9e26aff9b912c588babbcf25f8c467145061b9b8fbbff19d8c6ded8527d457be7c926c8f490bbcd627b3002044b7729a52e94147f95772591616f6074047e758597f410b3100f9efafaa4137dedfd0edfa85b0927804f0b4fcea1a174622116222004d42b36c2c73d04781f2f49d080f351e57154a3980005bcfb0ea34288e2fafec5bfd01e1f7901b3efc71ae58bf8df4cd7c045856103b77bd78073f0174aaaef4a3c0e8b5b46dc92db55478f012dc1b7d513e215e735573257f105d2390b5366f49b61809033c13ed4e1ebe19ab89313c947f2585f0788a0c5de90b41ad0dbbfc604a0d414d0e5390a0f3c9616cfce4097e38e05888b8bc6e55e40368bacdba7e5b76f4bd8fe619746155c30b38807a1ad325b00ecc3dbcf23014e79f1c39af7cdd0dc7ea58ce733e6611b7eae069deb047aeadfc21960e614db19d2e7e0905a9873268b9a24f856c28059321a742cd6cb3d1527", + }, + { + "c89c3cadc094bffd5ba06c600dabe30ea19ad037316fc13b895fe0e14ac8841264c1bf25557e22b01f8e102c3af43adb8e0a12bf79d3fa0232dae37ca3688e07294e2c7ecc4e2eebdd3f17173351f2c15b0480d4d77bd70955ba86f82214004b622cc92f7bf81a5837326f6a83612bdf65abb33c268a457c45cb7467e074b342a17c711c748c74abbee31541444020a9ecd4e5125e2a8ea3f6030bd677be18183a8a34af16a85ad48b7015cfb036789c0a5daf68883d0c7e401754b8d56cd00ff605be0cad19e03989f608392c81d636de859e66c2aae403c138bb96a58ba69b9064a83e7d8877067e7f40aa0016e0df9b7f455d292a60eb621b8107a727a3378c4b7509d3ec10526c50fc6c66dd4b015c915e85bbbf701ddaf2258119c8b9a5132eafe61bbf38870f35f375123f766ed0d4f38b9364a86e56cdef6f95a815a8d7c48ff283c77992fc6c070eab7d7c7b517006e5d4af532a7c429912ebaebac27249b4f5112d870d998e1c450b98c05d08c742dc769506f2d7a004c24ebf84c10838b619653e27ffcc4344d8db0435e4cb77c0410cc734e36738a6b5f72a7600632d19c86b40c737830b0f5f104443dbbb031dc7ca51ab318951e7817b5d81de8a9aa7f5db6e2d5e7a3cbd8a8100653c048204ced3af005d00e7de7b445f5acff901c4d46ff133e92ef073aff1d9ebf55befc32f9ec38c9eaa6a1aefc974bec2758297e474cacea2ba4151ab1a3ca0762c64a5ca273169d29b83c164f77f266c01bd5075871e17426068ed7aa58ef0d1f2959b19c604eb6187acc57e2becea2da93ba23159ba73b9226034c7ee2498e0ba34fa8038e5e2c092a73ebd9329ea3d648d6ebd47e1776941ab3130cfc91089fd0a0a36f0ecf68293343f275d2a64c1b7d27ffeb3f667f4a19824706235fa5f3f04952ff08bb183c0f1aa1d1b0edfd2e05ed093543788f5d0ac6532e15f912163275053b202d772f381900e906fe070cdb00421e78c16b7387be91adb7b3b3ea28b92548d69c780ea578e7ac66eeb931eefb4067bcabdb345a7cd2022085fc494f118215adfa2443630bffc9faa8fbd9943c3140d81c7532895734a9dd20e31c326531d06f5623c252139c4cbc882640c457819c63f6ceed4e03872b246a3766df69373ebf5af1116e8d5e1b15745bd9dbdd663fd4352d1238a43d5d1e74b3edddfb1c9d460daeb49afccfa0712b7a4cf8d07ccd0599ef3e4e1c9b5c814f3a6f3a46fc80449b34df87f47ff91fea3618cab2d5c04cb50e8ad199d752d901b21348ae939d39c86cc1bcecbadcc6f0e581a3bb51e070507b41ea4294b35456c69cf55a2a3f1296f0df73abac3a9c81cc303d1e20ad6e9bef48de83fc22dac2cfc01ce9ff3f70e00ee49bab2f282ceb6859f989075814e690e36a8d16354fd6056cbff49c30e49b1570363498531ff0ad0979a4518e9ae271f57f883abf5e301c0e24a83f09335479698911bca90269a28c0e040a98e67c9e55f4c91542f921511dd980270cd490766da22306b48ca9309aad3b2393b7b1e9ac7afeff64204081f9c0a8f6a5396d02eb9009901ca2c0a75ffbdae3a38ccd5007cc4f6bec8fedd64086cce5c039e8abc9e23bd694fc8de4e858c89bd585ebdd422b492eab26f4ebbdc1d17dfbba19b5ac458c31320a161a52dea638548205a6ad4ec54875ca34238c059177bfab2d5be0a98d12b3932d0661d33ec655446d0283224af8ec7f1c6874add03448fd8029a71d3c5aa06951123c9fd881d435845757df50444e6cacc31a8cf7537a778d1184b96c3512cd474f5d1fd1214555789d24c8d173358e36400b2d937595109729d9f35eecb0963c0da60d2eeb52a778876059fa95d820d5d34e7948d389dffd53d34c4083d27c917879b053cc57dc43c8263e5dfe5f33c19dad0a7126ea6e8abdbacb318d37c305a183596ddb25b1934beff13a4f24fbdcc2064de8e0bc639e672ecfe45692e9f8164365e1691784b4f775ef369aeb135ce15135c20da95064c810592ea33316b9767caaef842f948b9573b2205ec57d3026a2f2244c42991462e233061549cf9bc66a7b4a8a0fc61f73883fd24dad02644004989c4721a0aa03d3b0191d7fa4d3da102e541fe463936c9365ba30681e706ca70cb3c8ad5dcc710de59e7d8a6247aa809bba74ff4dd182a38bb31baa337841302c19ed89d65e87bbed05465f4ce0dfe89b44d7e9266a8ca21d984c41109d813ca76eb67dbd4e39aa437ff98050c968ec1e40c534ab51d6b8ea2309fab08b3757e9edc5972bff316f6f2affbff458ac0299613734b30dfdad20f797d172cf295cbcfee3d8ee25485d40380d3480a9372a1a6e5ecd7c4c6a9d34027ea6c197f37e86e757750c9fc24cc7cf814878b8628326c140930dbb2041bd9ee87f36ebfdbdc34522cfd4e50c9cb48dd52d4647a06d08e0f0069c104849bf30c8e61cb693dffbc69fc0ab9c5d502a227d606a1dcd630ebd799acdb1e47ce2ad52ff53f6cf4fbd5f0058fb5db915702675ea44334d42e0b6ddae78b22b5b5f7e5aa36519e31278e37b64312479b14aef9b8f12d8c1f39faf920851bd53b13bae5490c847b3312b2e956c430f1d8deea91cf171dee5017e7709d0346d81600bd5f0c41da3f548c28aa50589b293685ba059cd7f3edefdb5d8cdea364f4a42153b0632ef0b7ba18610b71fc34a781eead1dc5a00ab47b6840590ba44dafc6a16029cf50e089684194d93dc881beb62edb7ccee6304a4e71a35915f109db92690461b9e4ea21257ffb62477c20feaafc7a78e2aac2301b66893157920ce9fb114ab4f534d61bb3d17dfb4d9ef9f79a736f7c1d32ac3998356aefc876d8c38722787d564e980a1f15056cb3fe634d71d2c98e0475c79cab318b73a863362f85aeacdcfc44e61b5aeb870de9ea5b5abd24e8c19ab05e45e1e9b8894deeb9d29d65ae99aa94b5047f3c1168276cc2e491aba52b5b03703ced28c63a167f0cb3e4bb4d8e4f0292cf3ea4376510fa49a1a5efcc00f23c3cdf6402197b81262e66e17bf4307d87ffbc2b37213b316bddd65aa9d64ce6122c4a1545c5966bf4fc4c6ff17ded787ca9a3b3cadee435bbba8f6590dc4ba30895b84d5b4eb94f4b05be3c", + "82abb4ff5457b21f359754f151e456e2c0a185c8363d15918bcee0d6d49f12564ac655", + "b63b577e719494032062e3f63682098dcdcfe26cedea2a40893c847a331e4ce9", + "9f1d08be539f1244f0f69ad2", + "88dcdb0309f8c4a96ad5560f8210eda1f5afb31b85b7a8b15525777748967d4ed77c063f65d64ef19b31044f2adc690f5e457faa1abe2e127b38c626eaa94053c9ae1b6b4d0db1f02c8404b50f58210cc9fcc6fa4ecc615631da631031cd6253b4a13a3e88295ffdc775fd4bdf29655d9780dbe02b0a82aad4c4088e90b51f170909c0f98ff93ca3926067ec94be05841603db4f913b7025a9ee34b8d8bc629ed827a2a9857e0814d36b83cba21e670f8f94ceb4be5757e0b8782895b5d8605868e4f584b5bb6a5f3a94edd9b23fc2b6fa06914aec970c260fc370aa245ca68888c90c43eecb68474c9e45c53a7da055f5bfe39b56769fa56264dc8bf4c1616e30262bd501ff9fc5cd78f73ad89e093feba0393a11c6b2cbca765ba025c40dd0417dfa644fce96db5a0362235ad37a317145e7b5f3c7213c7fb3c393be57a1cb55035f06da1f0bf665653c5fe8a0f3ca67dbcbfc59852694d34819d0978cd09b508d103017168f6848258493be737cc24c2112f2afeabf41038bea1f74bc8656d9910b77d33cc691a0d9b12f7c518ecef93423cb4871949a518d2f06e5427823324275b97110f8f88b0d14788741e617f4b194e679a1627da50376a08d4f23b005c0446b46d4f534ed85e4692e7946ec818437089425ee30e47de995e8774b61003801de67939d9fed7bf0cdaf625798d0d0d04a61a2482217b890168e36f20cf1d6b81f9daf1a49a781567c4363ac2f3ebf0252d5adfbed17f98cc264ed2765aa279b7437410ee8b4cf42932e5055f4884deefd2a979ab1328f97cb750b3b7e4615b9c1c61659c90a5ff6d1c736e785587ec85040fb2c6decf789c2707974bfcbd0c7f699627b31e0762321d55bcc6acf1aabbd44abd7766d397bfbb68c424b311611d9eeb6598ca3126f569f688455da8d5ab86eb01f9c96186858c4b5e447aa2b9ca11aa5453f731beed4e09f95bb7376e200212e2f03551b8b09a19d6910f25898d692bc20bf6ed3ac9a0276db560de5c9e264f4db8fec6577042fbbd4510bb7070086508ac451a1fda26582c259412fbf1bd60cd5e921160c2604fde559b5ed4df52b805010b225f999450adadc6e108b70f169a3d8da6efbe1cce1c4908b004e928e3cdfdd0b4c5f742fd72a11c9585aa3517486201b6d9a98739b77970a88072750d29d005a291546f13b576b4249d71f04a9abf8f653ca206d98f738af2a1203bf0975f0a40138df054ee834ab73a3b1d7036567369a7ae15f808904e08adfc84b34a0e1356009d8a82e51c3e8f2170908179bfe47be8ad819cb12e85b6b76bba7c9b9398dfc00f550e32c171b4d5f2d9676063efee0b0b49660c10260ce052dd00addc3359e35c25dc33066d4b05bec7d93f71e0ad7d5ab83d844c7f33137894327f464260688ea4ce9847046e7dd0bfa48d4e15277a9586b4742daf0c5ecc59aceea6867068b03c20aad38d04a814472287d809a9285cd4dcdbf68f3f4ffb794701f4c265b2dff4aee55c9815938689162e08309df150538e60dccc03d495adcc560fb831444b922a6375845cef5dec56eff2910b5bde5f25f0e550ab5a13205de91d20896fe04a8ecc2c83d1371cf381424f8c43d2a5ced374878405f52bb92f4fa3c15d29ec151508488f9b4e42527921e245a8ee4b5d6ee95797f6ec4374d79acd7b467454a1d7eda05a8ae104534b23c46b27581abed6afc3ca555202dda94fc2b93501fe78867730a84f6f726dfd7364bc240b65d6c3022a04e09c89e36a809fbf244cc5522315110e9e33c8a4e1f1396e3e51fcdd53d9ae94fe7bf6c6ccef0ce02048a11441de3c25aa9787c577501977e486f8dfaa4c81e3183e648311148ce5cf3de56878847a9d14c0645777022c158670377dd9553eb63eb17e19ebb06202be8fd9bc2b24878cc86f9938e5996751ad9ca04b636497199f7f27dfa0f5ba2a01c3a491bec6dc5113d127f6aae38fa07ce7539a0c1817f7f0de0da538f4d85ffa394784a42eb50994e28530e3997e3345db28bafbb836fa463d34146d9f46d8d2b28b3954b9bc7f84046828e9b55e2fd663e562aa95caa97873f48f0a003d2251fb3ddbce0b6072fc17e0d3f99b655b8f41e8e6986ef7526544222e2d402489eabed4c219540605b9f5dd321ad902708601e85bc874c11efedd072aab7e10272c87b08b9457223de9fbc3abc2d1346656a524e9c67d79d4053c4257e886d6b430f5b7f57b2e5e92ae69273c1705a3074d5066def69fadea1af8fa9b3bf4890f9cda4b1833e5ed27f22bc4fe4cf452880c7b53320bc7cb748c0af6e7550ffa84e4714ec18d208131ae9e3edc6cd6fa2c60ab8ebc1ee56eafc01fbfba061e55014b9711eb58fdd01f8936d29dd081565de0b175b02989c5ff374e6f58c3383e9bc00d8a93903e6a221c7475e15aaef77594849af877f3807a76e03bdd54ff0b192bf34385d24d858d6f454810ee48141d73e3acf1aa3d19cd4c723a634cd8e25b4fb604c744e408dfd82961e46e8444f001d0991af24b3b6ec57ba41fb45122afc73ec6b25f501f1abd46181247945729337bf5083e5821968502a5a696043ee696c290095feac000957f968ac61ccb572ab2f37008830ab9a81d02456190af99873450b52df1888c3d8b6b13df65a9bb36a4b6d0538a0f179daebca2bed6f94b4670560fc5471c3770f2d004b6a138b8243068d754fd246e9881242638c6675f1611f237146f6e0f72ff2fba96f479fe0a662a81f40928f5400a0bbfb5ed07a87f457d5febdbdd6f323e2a59f749e6fc8a51d08b023734c762a91cc517401be57ffdf6a52b9174ea153abf2190ae2642955c3c02b4a15d72456c9d2f323de6fabbf56dfa3b566f1aa688c86b662bd34cf2511cc4a30621b6f1f1ac382bc1c4fa4c0d4d5a30ae90a5e54a9fb4afc1475e7c612eeb7f0e09e894c2004cd04126df9359d525d7f090e4b531916207c38c3512341c84218c86fc50061043ba1b89ddfb21cd756b391cb53e8c1cd55352be05efe562669e3986c022e30c79a97bdf087889a392e6da0d72cc7ea208aaf23408df23f3a9ea9bf9a935e49c9994a37a5dd0faf1267d5f7db47cf64ae1d3ec166466b2f882eb21698aa375cb50146c0e660e9bbb38d7bbc1c1c6d8333f7031d6a", + }, + { + "68ca38fccd585eb14f953358220027046c14ef965478d3d8f206f63fef4fe3571a1b53e774b298c347cc1b69cc426d39575ccfabd5a284c7a87a0698cae9efe40543cb79f5643c3c3057a5fc991235f06f059c44a7200b509a12e864fbd748001a14790f78b54ba80cf0a4a603da9672df32b68652c1d6edd3be51cf969acfb0ae49c026fe0bce0bfc72b1ff4c47712b7a27b2cce888b9bc470b8bdda55a8d53a34d79a25947ad55b95e5406a5c5311fece3ecd46ca590b3b01b9055761da8196b21bbc468681922c66d286c32598b1e3d77f2a91d835ccd9eec231409cb2e74ede9385552517718be9f84f0f9100e368701dfa4843b7222279537306065a54d4edda3a02f1ab9edba3ddeb34dece9d5edc8797103eb942a80cb5ae130ff2e7eddd11f0cecd8f9a615d75963c44238b10ab1230d9db7371d8291feb2912d306efe4f7aea2773903d4be9a00f2bd8c03589e342269a79441c0b42ce9c6fff0a6e4e845876f7e9b342d25351fe2b1233b4f576db90ef1facfa617b96d17aa03fc824973e1c80f15e5344b0516fc28424b7faff47ea1ef4e47f6f7b50e91b8fb14027f05ca7e1bafa266a4b952cd0b9e4cab82bb4d61f99568e14a6772f36296f5d19cb04fa86ff20f04ab61d1a6f01e5282c99fe4c3254da46fb5276317be58e94b1928e3791af27dc6544f6d445dbfc7275fbbea74f98ee4aea647b654909f9fa9c88312d3759099c9d0070e3db6d55506813f8b7abe602964a7dfb9387f58e237dbf50b4185a50b65ac099352dee8695017e4dac644f42aecc3e415333cf76b08fc764a721b45d7b74f6b0a2e43637e5b4849218d3d4c6a01208f345d76af56631590e520d6bcd82627d2446b45b2c68e0be81b3924753a54f47ea27b1e08de2399b34470701c9697eedaf3248db9b28991cdc2c632fd1b376bbda279b6709d5033d1c0a3ee573bdd222ef1afe8a4397a61fc30a4e94bdc55097ecebfef6c00133dc0b72c17e2f93a11eae9fa9f1364f10fa595e8e1623dead10caac068aad3967b9ab2837dabcd8f96a77a25baef16ba84bc93661ed150ffddfbb0369683cd021e8f959c2b531bb1fa95d7a574fe5ff9aae35fb9b4a0a9829c59b932ed8634fc05ca88211da3e30839baadaea8fd9843e0e80d9598a7282500d157ee579cda5d57628e7506617d301c2adec5186708f94f069ed7bdb70cbe88549cefe1673d48c9bbbdc01d2af03945cefe6e25f757750de64cbb9d496a25adf7058f5e32c827fe75e80ba0e834e6a72344dd2aac4228828ed42fd83e4576254af5737dcd9b6c338377d46baccb02d00fdffaac12133ea0e75e791593ef3aded4ae4c9249b8d5cd20aa28cd652b9d750b88111d9b4fbe729e27882206b2f0eb614d7daaf6436816fd80d452ac71c7a7f9e8c595287407c6ab9fe8a242e98da4270b4f1d4ea7243c27f89ed46a567c643f31f967b5f12e518106f3d3e08178078cc714cb6e39079631966a9becd6f02c18e983ceeaa2106ba9043f9985b791027eb5dddceed563106bcdbc48a4ac64bd95e87c708a8cdc33811bcd16c35e193203e70ef2bc7203183fbf60d46bc581f1bdfe62387b3e6c0c4a29130d872c3f8b134e7dcfb080e7e03048c49c0e468dbc44eff4b02e50bc6889cf7600fba58c0ee409ce948aa684baef4956fd8fd4a9c4c49e84e2ff314b7900b179fc66f5fb4affb9ef7a6064354fad8c3d2d50e6f2157576f864a843dda8f547955c4d80a73d4a86b7aaeaecea886927a5ba0e97df740ec7e8b70bb650010df55d4b75f478b07b205b560d45de666d84206c1bffd02ab7b8d1c37f21c47d1711b89d16214d8151a8e75eeeb5c54c39e5a855d578708d314240a064051d8b26c6183ce755be38fe9597dd5b5d198532b1db083a4b856b8dd60bf1db197cf1df852eb6daecffd97287a6cdd4c05307722e0fac798507f75b03e9361d5627ecdb56a3b633938fa61b2673efe6c6e768e4e7055e6c1d55c7113efd3e95151b606bbf169f4296455dccb93da370150c54fc11b3682f092f30381c6ecd218a3d9d39442c8bea61d9a71b174a8b2c56e028689380879cafb7c4bc2691dda0cf6ada039755edf93f851446df9f63267f8b8f030c069fabbe6457d4f63575b5905fb927a5a720d52c351bfbc48f12440a91471697e6b2564b1a2b314fa0e6dff090079637287b635d875f120671561102ad27aa83d9f0cee41bf023bcd703ad670b43ae23bf01713650834cc1e95dd486757f0a4f6fc9337bb95738805ad5e756198579c886eb0ee77e4ba957997dde0eecd84e4c9171c84ad8f0cb23c6a289e037f3a8beeea7965ce34fa47cbd727baa4ac9e6dc3baf17049fd2386674b246aca5ef6b8496f1d17a3175f6fee86299232c7fff682f066cbed895155d475bf9fd4b5571d257534c88c93377b1a600d4c280d42aafda975eb32c740073cffa610b5fd2dda7262a2fff5da7a0f3a875c62949e0c9247827d7a49bd8185bc27967124c34b9725ee961bc8102a029786652c2571be6cf33be63cf867c2b48e5826b31b714a415fe05c27f0862a870d8fb33200719ef4ac8530a4ecf2597b4a7f2e66f078a7505803774889a1cf963083c831f46725a1ec5545d8489e53921d81f80ef99f5e51a2d5992c7769c2a7ec8bd8e0f2fd81de53c7b69b650a2d838b269185c5efd668c470943bd956e3c5e1bba5d3b927b10cee68a75372d4d6fdfa6782c05659281bc9bc56a2123967f4f50cc7ae3379ba21e1617553354b5030b3d3f0092c1824f5d47b97e6b4fedaa90aa2573e1b115ffc72d44fa8209fd8d372c8dc9ee00193b47c2a9a302875da331731713243d02eb5a57d5dc51c35988ffd742ddd75c191f1eb2c2214a1fc47b82db8ea708818262d9583f2b1b98a40b6ff6e94742f25661a51882ef28475aab12d9422b6ac48e341cbd6f38460333b5fa1cfd4d0f43aeb46c21938468fe3f7bc771972246156652d2c58b18c8cecec2dbbc0feb0fae9f6bc022e029111f94e8913c0ad741612a1426b53cff73fbb24fb7b22ab750ba1310ecf339fe12ced6a3fae17b4c429550794a8d68be891b0e30cd28e81de2fb2ecfee58bdf11794951276005eb8a5af21e03c8aaeb595ace652c5ce60a8b98f6897d82698ffbb2e02213e50d9d3f00bb42c8652d22bffb87ec576ef6e206ed6c846fd5136a87f38c9ad899371799f35a6258878418830b04da79fabd80e7290456fe17c0850a4c20e2e657f97f4a53e1a3db65bb5e71bf38eab9f56aa11e6ef71c85b8a28f04c271", + "ea196b6a64be4b0799b1c2f72281300c3a2577db44e5d3606b8b02fa8fc46c7aded7e442", + "7c86a2c06b7520d60023d18fe73d09c514ed07a91d50d8fd5bff00e7550faed1", + "952f492fe00b26028c560fc6", + "b3f3294815ce461c8843172efe93f73a8254e58a0e71953e35c15aa89a7bd9dfee967853dcbfba73d3b87fa60449cbcabf13b1206d0cb27d2c3fedcfa695b6d41efda37bb6db35449bd470a23787619ee48f981d3f0b1c8e121725b2289b6d67858a4f9ab41683bdaec8a913ca2cc292a9640efe50fb85a1d1f7b286f45d4448f85b3242f45ab44e3281d759db24dfabbae4259f127d6546ecb914d7e93e2c19230c67fba8a6cba6069023ff7ea3d8a170289c2b4391bb97a7b899228d032b36186dfbb29ae8f0e6c06d753f4c6b21982d49ee682bef50a5c2c8434510c5fa2b9c0349592f33f8d7ad6f7243d42b292aee6d210c61e3f898875b91a17a89148275031b74cb34e628d7b701775dbfcf87c79ab279a73dad14d8eed365eb9f29a007b7d2ccc07ceb8cdcdaece67fa0166e135c9a4b939426882eeca98ab887ed2e4888bbebd5afc9f2da3e9162527262b0fa85903246bc8b80df3060c890ebaa516781a2b2a138b98001287e12a9c68471912dd297bc0beadccdc31a27b7c726baf31510cd355a28e4ef786b30084af66ef135909795aa73814cbbc6552270d5e11d46e9497ba30d6d8cecf343d16e7e3357bc9bbfbc7c1dcaa5fafd8a9b07056129da02e6228886463474c5af1d670bc14cf2868b816cc71578ad807a37477341c8192bfc2e8b1f7bfd58827e041f70384f92bb4c6acc415dde5099a1c2b27b709f9e53d1dab07c87a042ca4af7a2a6ee57b37bf2bb42259d372ecfeaf1dc55ac3a9f211f16fef3b2d5f11dc19fd1f425c14779580b2501ec6e0a84220e7e12baf9e0fee3e8cf499a7fba6721a746f598f04ee8ab4df31fb8fa5ce2d2419d5551155c009f2780cdd225ec2c19f94fb9c8b785ad4574b4da766eabfa696a1994e64a2518d1bcade6390cc683a6e80cf8b163c3e58cfa1134ee743079347f08a89c81478668df32ce9cdd7b853db5cf7af13436f3bbb11bcfa8f6b6d727a1df84f99fb3a5c248b8fd5baf669b68fd9af45298030f3251bf0351fa9b58b0b9fba53ecfd838300790ebd689744c1b7b333fbed76c8fb96fc669ecc6695ff5bf8379dd2a3c270af858cc60894be8922d69fb9707bd2a7825f2eec4a5056e5e91714f4dcfa86974259fcbfd5f20d55923a0a9936fb20e5ae9670e2019336e15f530c0be449fe355a7a02c0938d60720d5b8f4f59d2e4213ad5251c6058312b43d47c44ffc8946a98797f5ace279d3e126da63633c0eff1c412febdd47817aaee466c639e43637c1e179f606780ab490d3f0b3c2d79709f1262305fc87c02f68da2dc32f8c544e7b358c3a5d2c27986a19d13fe736c60a3524e94caa55e853eedeece985d16bfa6c487bed6583436cf82077fcdcf90a05f49db50588f46550f7a0c3a1cfca902d66d25dba8d2c53bb5557cc1d87c8a407898b3c30c4f0852df92d839859c191228d0a47324ea9ec2e0ae84513cbe4ff4aff85e77b8587f1044bcb9775099ebc2f28fbcd1cad58a8ce1f072f2228f559fbfdd8405d86f8262c27c3d95e01016b343c6a4e59dec81b59bb6e3c6109a4cffffa85e9752ed2149b5624417c0dfd1a27bd2630bf59814f15820c43bfa317be59ef6f433c95e8be154a8ae94765bcedadebb717f0d8c24e01e1952bd104ba9620f067554ae0faeb78f13c622c45d97b2b5774a3e30cb07f2cf0e8b19d1266d8a8861f3772305e24ec5c9cb714806c7d705a3bed6385f8be4e12562e17ec3df01afb4ef6f7427c48a1bc0e64fc65eb1c3d3ff2d6687e4c275a019f5ab5c63bbe47e3680fb1802d5835c4d494f0f394de1ae47f81eef005127d0971c4589c456ae6a69855f35635c28b590c1b93f155fabcab59b6c7cd8ea1c4ed1f67093aa782c54329cdcf9bf84a40400de707b894587d6e08cf7fd72fa45b6709a26e97ff5ec1269b8042358f872a79e8c2db1c7ebffac014d6b6f71b0c1c1945ddedaf5b6911668059b61b55eea4737aa307c829309c9ea548fba2bede023849bd61b5a467cd1ab1c61205ce64301e2531e5d58d03c74ecdafe1f5b74627be8716cad0d0a0be60984c9f9dfeae24a6c4949170ce2f589326e0a76c447a578ea3a5e4bd9f18884f18843eb1a78aa2fae06a7569a97551b227c34d429c8e1c8c5417ced93c30dcc607cb32a365d87328aaecb4ce57ab8e74f0d9099e267cfb747a3bca9f76b5f6dfb543bc4b5c06c3646062ec14f511058eb2939601913f8a0f1785249cb72b0bb1c12a9508b23caf490537eec53f614f3e06592eb61f75c1cecfa514cf7b500b0375095d5db74556220131390b77d0db72711c0c7229a5769b1d2b3f5105f3a4370beb1cacbd93ce32f89f1fc833c7949211dd204616c013a3399a22f5325f1a00008f4c8ee7dc5bd7476848721fef843123a6213cb0c0b6ae84233ed01a77a115d06e08990b8e60cfa4f41dbc9505cfae76463278b6c6b5ac7c3b83284caaba4a6a1d739c392528ff5b06bc3b82e98060e3001279a44aabaacc661fb14e7581d1235940cbe067c6b386da09454e0467c785ed0b65d41ff4cf36ba5f63d3ff2b45c11c6c22d3ea8ebbf1d52d770e0ebf2ba0c67c7d3641c145cab474a88119335990137fa82a340c2cc8c453752a3aa801127a47aeefe66d1af1a26ee1cd0e6d935bd548f6ce33a9c204be02ba08f9fa03c685665375db7c0c656ddf3e441ddd96b0d2018beff5086cc63339f26bc8332a5e6a1422bfedb69187a3443c23b630a28b02f8075faf3ff2fbeef6cdf02ba4af47a765003de2254b69f487bb5d038759a33ce6885611198b81b0b6fc5d7a531a7a90dbc3556aa758db1657698cb3698b8207b1c1b589efe5d52790667ac483dde9543953c6392d5eb8afdafa205d325e314f810e9c7722cbf5bb76fd6502733149bf21c60717ff5bc366b85ee9f206bb1f330ea72f61a9766090eabde747b1eb9c046cc8713d5a4f8d4b7dcd7c61f2496c5b467608cd9260382b8f11b04c318a5ebb6411a4c7fa060e08c295c6062ac644bd3d10bcbfcfe2e3748eba66f65d904ff21147faa8475f508f21238d42f62b697249b9fceb905127f7684c8130cb8663f09cd25ea038078e1980237389337d1446c3a77bce41b37b50b9c3a020526e7b7b3bef370cd7af71b225700627060eb65693899d277ed130ec5ed9eee75d4886f31aa93bbf302e0c69c9c4499396b43dceb67c02fafaff8b56698308393a03f60babde883f00de2c66831f024fafaf98b2fcf37a9ce01d4f34e95c9408395716dcf83fe86c7a0f5e3e6741c3b63b6ebe9964f1d5005eeb732ce66402007beb3e6a087053", + }, + { + "9100c5b2d7c5d5a854bce55e82f94b89a268da7b66357a661dcf75cba10a1b320ae0e4e1a5b989f9766e57f867a3810a0b5b857191ffd7aece4c796f5694a2617486421940cc12b63a6aaea20d2fac188b318a1c3061cafeae436e04d710654b96a864d674768caee03a50ed6afc06f52d90115df1db5c9f1ecaa4f5da094070b1a447251ad3d4fb0e24e87821ee6d4e7e7eac7059080f77d2b36cacbdac1c6e5063946a376865458c4ebdad3c2afcbba8a82b01b03a7882eee42eab904a19e0aead4ae515b02aa2fee74f3a114bf5b9f320baa35b3225491653f4a69e0d864cbbd031d0805b727e42c2b9530dae0c01cfc6a42af8ca730e1d67b4bb743a072f0a38008b937209d534c2284271344340fae76af2b1dd00cf44b48ab8ee92e8f9cae8845e5a8d338f505cd1c19014018bfb6b7dad487e7c8c32064421982c1a63149ec16f2bf4fe7b50cf3ce1e33d6cdea8e98bf067077c9a0ec1bba6edd5090273ca719ebf6f1a0f3e56f021945cff3c468b2dad92a947a06a024758d7505a4a1bcbe9da3a03e97859da99ed36982a7c23572ab60071566b749dc34bee1d9609e87fe32282cc9adba633c9ddcbf359ef4a83a54af5fbb5699978b487954a907dc9739f4b3f3927e66cf0c338e31c272da0cc7795c72dfe60a5b2e73bfd77b8c6ea58122a913910fe29d3360cef5d398f29b024f0dd225183d538bed2b076989aceaac460e3d45e0ca7941897f151261a024b0adf6d5b62429420144497adde6557a3c53b7723471fb760b6a8b1dcc2b327cd939528f5d7bc16ec00ad99df12f082d82bf9fb7318b3d3ce5b84ab1e38d2ebcb6713c03fd0d62bd083c4af96b4316ee02b6953431c261278aabd96e28f81adf7946e3664446135c825e45ed916ccb941350c84523296cadd5360bfe3e16dda75db10da1f710fe796f3456f0911294a4735cf9968656345b9c3049ca47176194c86f36cf702538df699fcffaa254af15b198ac37eed0837b00cd3547e496ecacf6136c6648a535a235059cd75a3bfd0bc49933b379b72e7a8463c268faaf05f0b27256fb179c9d4c923a13ec6600f83aaa2bee13e30c8e676040c06aefc65ba238a29d403f3a8cc164a0bdcaa1a5f54bc1d35fa4efee0c402eccab1e92f6b0cba94e1bd87898a9dd3957a7eafd9d26bf70866450646090833d4b91c032428bdb9097b409305de669a58e44931b7b428bf1a6dc56177cd944b87b04eabd80c64e287a5758c83db26dbc06f0c772335363ea2fb9f19c833644fe3b3fbbbbf5f9d460412d287eef862ae676f258aa45bc8465667601e9ac46e7d77693936c8d67ccde94e54d746b785ad26aa38ca0500105b6870790235e780ac50b9e3198f5fe678ae3a4ff4f1d4a2177edae183daf2de42625845973fc544907e27a90d868f8634c9d529bbaacbd228a5b4ac7fa68ac208e207a022cce4b24a0b5b5791eaddc6b3b3ef6e5dba41855ff531de9bbca0a39ea743c0732772bd32cd15c4b7f28a6ba579d902331a88920fb970aa75114e14b891d42cb947e9eb14feafccf1393796b21099e52b21773adae8e550f93364b1c438dd7d7fc76994c51860b652974d04a7e6ead207610de149f231422595f4e9ced1674d98d0e15ee841143ad8613f804729524e8a5f30d451611676f70a60c5dcc7127497f4d27f35e7ba0e48f98e9022e0deac400e809170970867a1682c7d2f3ef2c632c44568abff76f4f804841ae462c7247147b6e1debe48802674fd55b2ef1be5b4604d5f60c35358c7d773ab3a3ad0ab81868c6044d4e06a48ddbffacddadf813a2ce09aef34f3b60b666245a032f021b87c81fc506166983f25930cff728d399f6dd48ea1c745ad2da7f2cdd9e3ee915f708db0d1f3481018db1c174ea950ed17247bb8ebc065186758e5403bd4d19a445e4a15519326696e4280bcecd1a903f525bbe1e521f94d79df8db4b35f4ef7bd990c0f2c32789a75f95761ca0064bf251fa00b409a58b979e56d2c44bc2302552f118162891bd78272384c739c0c98bbaca3fc46fbb5bfe123eb25df0e27343e38b5a0c2d0774443af91b64b9d4e0649f20290edb84fcedb3bf4ba491bee8754a32716739e5ab64deb6c9888bb9fd2ada1629a59b16934ec5dee3678dcbdcc7fe5e2f3833da9d1281669b1d108837eaae5180396813883de26b957037623825b0675df431fb06b35191c06229f84cc849ccf1b1e079efc2e575331cd77b3297d2908c048b82b7dd14883f3e707bf6ca38f87c19625bec47c11f54988a97205d27ac51a32f19704391af72021b78cc4461386dc3844a1b45596fede3f70e311eba92b1d9ac221d3dc19f3fdd080c2169348f2cc8c9380e12a7ebf69efa37bda4ca6f7e66919b94532ac43022c0518c04d0a8cd99e0cbac88b7a317a1dac5469534b4fbc64080196b44498e149b0a196bb2d6f59392a21c4a4523ec1ff922a52de790e42810fd9355471169d22b734dde4a3361ecd57e271a92132a8b35cfa91d508d45618ad8c6c1ea209405a3d1d3ee1535caeaa3f20546052fc13aff7a584ff79db1726678344098d8563caa2a2abf6fe5aa03d7af49dccf1b17be85600e7cfdbfff54282394b0fbeafda615185574fdff78d59ec2a26dddba1c531a1ac007cabf5be2e2f0a3dedb9174e0a9da5597c9de6d68911fc66ec9d2b1e3fd71ebb83147ab14384ee303d067f47a324a01fc187f54a98f1b0848fdba2ceb3c18936d503e71887d548c4dbc70b7eecac9ead3393f8cb85a84f1484f2e237b36b6d886f54a0f629e8bb05b0c6839c722149a5b541703aeac04e6eb230a5659b12ed0a668d018f75bc94258218c1f5390b9aee4c0b2836cb76a47da649e2425bcf4cc15c4d51d109e5f78cfdb88137c31b2510264e46f1c4eb6e6b3450ad901ff9517b47a24d508844dc85fc5dbcc079e2d09f301691f401ff5f36500cc66f0617eb4dba389d427c7ac778d78438506608f0961f818a2080ea56d0f61c40fc342b49ee63e730df61f757387b9089e1987977b7fa02d87aec2e4be24b8bdf7fb6286d190f9df870944fa910df32f178ab692fa56b071f57366a3981f51800ab416dc4500abcc19e0c6aaeeb9ca063470993ec749a0bcbd07604516b1d51175ebedbaec8986f67a4d9158f75b5f3bcbe86a83220b4fdf12a0242951f94ac7d52882b1b209b82c4749753ea4d46a60bcc4f3eed033bde2d3d20c25cb46fd907f7052217a0a4db143b2efe8875a59441f4d22ef70d0c244b2de6a7e15581e84c860a6326ae3e3aea6d3972e2de0623d2d852c9e65eed318bd3d86d29595575df60d9050e1740f884796b6657718a294adcf2303adf61c6b23933db93885172e82a78f741b8efc6315a2c88ccb6b11692a346cd82a79334e0c610734e61e6378b5e2ecc161d924778bfcf4475805a0823a0d5a54768d9272ee99b7c4a81b3d5dfe1a2f5ff34", + "3c77f30bbb698b1571aeb54653fcae2c23dc16be58603f0c361eedd813ec0c4f63005a1e69e533da93e820e6e4ce1308aa29c60289060ebf24fc9738e8a4874ca4e26a0dc79ee75b8607416bd554737f", + "0223c0a6052bb3cdc99a284fa169ba76be2df53b677642a606090a9267a60769", + "7d3981073f90c6648c5e9c74", + "61ec5230306b70113f67b340575b77ef76d521ff75b754d551e4177591a02351ad382b2a4067f2b3af7e8e15431c7133e98be9d8293d17ef40161dbad9a4f1a4f30cdd557bb9a8b03b5f1b277c850e23ecfa0fc2ab1102e4b1d5e836a606883c3d43527fc3aa26955964b144a9a56cafa7b174d72a0635b80e7b4f871ead3838a955a14c4b8c5c3c66fd86a5e4ff10dfaa92105378bbc5f76ad29727e5bc4779ba3e6dc19bf45020f6ce4dfb3400df05cac51577d58eec21b22839b8f055226b204e641783bb3305b4461172f1c1d48eec56fe6f82aae564ac6688d7b0994747d9b23a24418e69f8a4fc548f854f86baacbdec78b7597b138c453349034c8cad2ff272781e0e6799ef2f8addaf18528736aef21ef8c2d213161e36b2c7815fcfc40747626e0165684e46a9a2275c533d548e52a9952a556168195d602ead86f6bd699e97ca59f4cb2050ff148f5bdfec358dc4542ff2f700db9861dfe5ba377ec7fdc0fcb2501e72fe6873c7cc76b95b4f300857f76e6e6e370119f403b556115b19fee7009f4f6675ad2d174f44002e35ddc360f309f20a3a1dbf39d90d7e5fa2106c53afb0bf445e4cede59cb50b8a7a2c0961d00b2c251f2d815309f74a46a424838ee87f1229273ff3b66dfb79e3b1ce11bd60e061e60e3f37bd7ac896b618cd78388590f44b1a276b965a4b95f2e3a7a175b30fb45dc7a71d4b3a1a33e98af30dbb46a217c50046ac21b8bbe9537c02f05a5780c8a5d796bd6424fd9e9f3ed5932069bc050bf4a1898a0ef0ca756aa2e2269b709cc92e0c5192ab49d692143388ede2bde4923c85eae8f59db5c7711dabeb33743c692be6dfebd815456958b5e1384a109f891f433e7b4a1031d4f30478b05766dd97eb964a28f2f7b55aa6c27c7f4ebf4d47ee8709bf99915426b3896412a855798e392e111789213af537cff7a976b4509e0eb6ffbb8e886a3596a242d16d95109b0ff562c624e06636a3611f804f9b2e252afe8a4e5e868b48e9e734f688f2da2012d7fdfe2d3aca75fd74730a85aae90353417fd52b92d28a5098b6af358a096b859859916bcd5a8f779676c6e04ea461fe62872050af92d08cdf1124bde1e889ace3c923457ecfe0a635ec757907a131ad7c2ca3f60e1317880f843c5e63f4ba59ab2882a492dd1e070b070af6f60e18cca29541206a7b267c3f75a5327fd9b8ffc9b36b57b73b36e586541d15c85253e17a2581e8f8a1518f275cc79afcf2b5c88a16e9bf553e757df089b5db90a9dcdc1867b788fe75abb5161dd7ee1cf37d3f0faa793ddb1bbf1eca13f4220ea63af8ef7c0e7144d999ba1c5a983e74d48cef708c1d28d3c0a168ab87d0ef70f381693f0d438ce013ffa2cba65a8cf6b498a7120209564535b7372690329cdbd74eaa76765962720f06aae58338a10064ad80f5a67395db2c31d36b1f5eb777306395f192599d2f737327afdcd9f14b3f24155a3f974915d3302427494fad756703b13afcd1764ef9735e7dbff920f1253cb668e9f40632aea1e0b4620db162138e4a97e6f0729b14be4a7c3256250d5e7423ba1238c704503c51cfc9cb68db7001b2f597a15e77138beea02e11e0bb98a72f2a77b7260e9172fe7e60483114ddd836addd966b69570db5eb26a0cfc4f8a8b80d26357ed51a70165bc0dd11ad7467688025bdb532e7222ea12f23c44d08d111b0ad4acb2f5b3d6b45c387d541ffc84466ed57acacefb1436ef00bcb5b6211dfd0650113ac369b9f3e4891acb2693c377467b1e9c949cc0ea6c4a72ef9292964275ed397cd2b1ed25fe1aa8f47e90cde362392da5e53893eef6e4f61decae1a75e3b726f0596f09c3cba62aa08bea89984b484d5768296a5afa8b0759dceba530a169d22b81979212b3343db35ce4e4766dd251ea6a47f5033cc090d6577efbed441bb4f8944937e812f12ef17ede76df621bd4cfa31567ade18b74583a2b783279150d584ca13c0d4784b70156afdf9be8ae96666b82def888465cd3df349de427d5f5b3572e4f963d33f968e6780e381ca196bc04a6664fe93fdc8558b21b84130dfa2a646950eb2e927885925af46d7a28d1507bcc3c02ba98318bfebe5b9eea1bd47935ad869eb701cbc35a9aef5efad88ff54eb350a34ccef2e159de8e16135b81105bf799fbd86aa11653b5ef93a1ab1c367231d61b42b8bdb4f04d8d05396d53247d51890be9b56c51cb19eec0fd1e6b8cdc98376b6c6b30963ac7ab02656ff94dec0e3a0eb3f3ffb8bebd99d5889df98e6c77093c370373dd5f17871fb334c7eb12c6ca22deb75bdac9eaf24281c965dffe03da9c940e13fb382fb6be332797813710a7cd2e7720f5b9e53fc0d98fcceeea4a8e9f787e670d60bfc4a849f34571e5d09b9e9c28cdf2b2d888eca9bb31ea8b9239bd19dca86880ad3e12b1583acc3a6d1f0a438ce3b5a337487279dc4ead1b214272d455e6a2c8cce4ae3bb29abfdbe77a67ababeaff5dd9c96b17f589cd4615c0209eba5e4b1c7167b4b739ca4b9957185961529d1082226f85068890c94aa1f1c244259ef7b120e40114926a49c4412b67b4caef1ff3ce6f3aea3c6107b830cd34df9f4d73d7d978b6b9d5c481e9d76e83d649e742b098334838fe50d80975fb567642d3b72c461ef3072ebb1d03c0099e97575bae6a12cd2352d9d296351df6965d736d7568c2911394a73d199743526ba54dd62c56c598f4e78495c0172739274c0b8c96755e489765723a24a8704093a94544f6c8764dcd1ce6b4bf2917cfad27d85e4442b4e5bd577ea1a88c2b79d61cc1be01ee9028235b36444483b4e45da1087bf6d45ca540620de5aacc644a0d5c4b807b582c7b058e140eebca539947502bf73c9abc81a0e3a618b39d3a38c4ff7f94767fd7e6b9eb61e629806bc3d183bdade7e369d180dd2f57fef677e22ce41be7224f11723a85a3f1d14d7b72dc98ccb2816b77e625ce3db3e2c5753af8b079e0d63939079a01910ee4699cb405d4d9c60e4ac86a7fda3a4c9c290662afbdb7678c3a84c87ff83470fa8a416511a06d3216a1445699d7ad7e6980491fd596d39762d576b08fcbf0825243c1fc01ec8300780857c429c607113160a8354f6699b368a87983464472a5754fd58943fca6f6779764fbe6cbb510d5280292df02c4a7ed9acec8c95ad67ebcda71d0f519ac18db9b43b28244cd34fe02c5d694df57410eb54c5e1ca0f8501e7776a811d7ee81eb9d8c80b2ca50a012b5eecd5428af965b217e7fdac80be88a01f76d473105b027eb557a523f13c55e1670ff34627667649573e0f19dda41c525a8c96c2866a88bd73e66c786767e1657960f6676d8a22be1c6024158a0f0e4ec761148b5a3d8ea481d8fed94855be82479ba23213190054f937838f0e35e00aa74c89b294c29ea25ad7e96b4b6fa952ea8f1cbe5397b7c86d0b74ccc25e22c88736b045fe86110bffa0679f28a1f27162b51410498cb7", + }, + { + "0fcff2c29cbb5cc40bfd2ec573ecf368275ade6a00e5730b77dab17e437b46524b3814e7f470acff6ddac4e0c6b748ed112657120bca1d83a4ce01e74a473995804d7c74bd28732a02370ac8ef52b600790d1284d82f077cfe096448509dddd0eb5944a882b7d384efdd4dde3003dea910f12de82035651e3ec9668e66435f519da3fa1f5bcda34aaaf028daf3068304f7b1ec18e65136241a9db281e011d27db5cc9c1099405a4430821e2488a228805314983966ce5d806b0f014c21d4c9d6a066e63aa6407ed6c29cfa4a3e22ca913762ca9d31271d9c371fe858f3b22e931814cdbe544b9416e88f6026b12bb8e88d8285beaaa35be1c24339b5f567480d7b16cbcf6160e549ef4570a0702889feaa0ebc54b11735735b6e2850d5715e5087291fe8890432784aa219bacaa2b874b075c9628cfed5e76dfe38426f9693f6bfb2de49b710c101b2dabb7c7c74f12de9ba8f75b8645d25629568d12bfbc7eaada63364b6f56569cf21e54c95d6797e9008f3496c506ecfe5d6a010d168fb7f0e2ee3c423492df36a133fffe9b87d7ac070c32cc131fba6089cb7d904b25812e03cd6048504f7ef1736ee00ee6b7aaedb3dda9c6fd6437772fa5076aca9888ce55e906a62875979bd477aabb2f4598d32342aa10a6d187c6768f213117a9ff6d830603bb7b9b475002e20b2237a4055ae6af6b8d70e343e76265188a0f07e7820dfb3d898684d99966d4bb9e78b0e95f5044dcc12810a89a75b11474c8fc06c6e734407db91a072ffeb2be6773a7c6c3ec939514b43daf29feb3aeb7afa57e96d9cf0492d90bb2c7be613f2208f5f5f5898b0a3db8a967a75d065efcabdd83759c88086583bb3d422c6c6425525a1adbd515199dbe71350b77940813618b88fe139153974c80d968ed4d9e3f97a91b7cce250a7c963f880dc38011250b9a131f2b76b677f78fd0e4cd6f1465182fd1d644dc42db0bcad8df4ae9f456841765af8e1c1775abf85a69577ece6f9e9035e36c88be784397479e713be4f5434aa4c166bc4702a4916c0c003a6baecaa182372a30af6dc7e6fc4912d13e662bd327829f6e85340fe130001babaee64d211d6761bcc52993c162a692a10cbe7434310392b64792a777a2b31341995072a6b7d4538cfde74e609dd1019a9f75cec0896186c0f42e3896d15be87aac5b11642f74e11d5c2f7de9f07f848ff543507ea4d73fa8f5683fc6b41831606352c482c7a5a013c51e0db59d824582c595f17a6d2113528943194d6b5aadcead62516507f178cd0f76729cf8b81fce4e0138ab224bfdbb8f16f8ea6196b90ef90a63f0fbdcbdfb5320984be8a80a26b932d1db7ecf870dd67fe838069136ff9b9ae087779e82cacf1b06a7b310ce6c439047c26fcec0364ea87e4549a544d540256cb7c3ef7282fa792aad89e919dd89519fe910501f5ef88da43232e917730e742ac2539d454e066feb9058f56dd246fdbb674dcab636585a788b338ffe41f4190447a65985acb9613d02669ad4ad888004c65acb0ca315752e58f51c9ae9259f20cbe8a668a207a5a46e30891bc909108f53db8bf6f0f11549e621d4cf4763e0035c867bfe9e1192fc421c080b25289a78f4167fe517852efdb6f3ccfe67ad01b4337da2c18f35bdc151c5dc76ee66efd27d5fc784e4e6829bea4f8a41ec8bf61ff998d178ce9f4a10551687337d7705eac6cd7fabb3f2379e31c1d01e4dc63e475f0fb01d9efa3de400b5177e2c2d68f2ead89e9ecad62cfc97fd0ad5b3391d0248dd2fd7c75dcbd802d3463ef0af21eb77b07a3286a72f1e9439f457630159abde7983a5c74f7dda12b40913632afedadb691d62003c70a46664fbd976457544cef8ea863858505b1c596e7f745d4a5fb657b1c694226afa9756c40d9c49425b323ce17a8531c5919b24010f715b5f27a300ee37334931ca9ff5c83c3f0a87713768ebccaaa15e35c56f3536ba945e5d954c94c885c68325bc4b51fb55d96c8d424849ece9a812af0747d5b1dc240f71609439f65acd1c17086e025e376eeb79a7255680cd692fc4b0f5768d1985fe8a1a387074f58c8bfdea8e5c11ed379b845ce2052a5b24ef0c1a658923eb87adf5b01e6aa59ae6937564ef97421722c67404cb9e5fe07d5bfad2e52ebe6cccb41ceb1eb2760545fb6a3582bc4ca572b0aa4e4f0a2ecc56299f3b485d980501a4e010576615ad518fd2d43c1f79aed013ed1f1e1bdb74357aaf7dc84772c9ec62da43c8ffe11a7fb3eeabc3584a936c37b28a438dfe78f89de6b0d5597ac1bc55057544e68fb49a6e505db69af122c2a3ad06219b7f2a2955db0ebf55c06baac5e0efac609436dee484857f75a8421945484ad0c7650a1d3008cc85c938208f19002b7994524878d6ddf85c763a65cb72a09c3a059657459f13cb584bfbd754fbf2de904517092be4f1786b2bde26ae8eb2d884592fc9e84395408f8117e47d1ab30d5fca167bbf07e41a33c230d240e3aac53cda9f251e24659da57d721288252fe7ff3653ae3e47b86209e9344accef0009b99f2ec7b3845558f1d77b89fc9b61ebc1b589fffd3261f71b9631e87541e22ed100e694854bed771358f10fe452fba61875a605b8080cc39e3eac13708e32518f28e60464c38b782c7c7800df63b6e7e95ced9154ea54e32900f6998f38eb1e51c112b6949e2eb11a96b1ea0a68c1e3b5af750a99c9fdb2cae44c5a1d37686ef87b158d19343e23daf00dd558cfb91e6f2e18f8e806abb2faf80d082f657717d08ca4e9c0d30d9bc30b612bcb1a3a3a3843231059dec344c6c04ce625b3fe064092e00175fd9d38f8fe54c4088efe30d211412be01460a6d4ad8d0a618b00a21de0a383de30ccd72f119b27a08958729a999e8aadff21829cbe8cfe398d90476e33db4c64981383a9aeab4a27f3bcb29d4b3d3b3a6ebdd71d3ac546b8658e269959630de176819b153cd53d2091efbddd2cf9178ba6ee98e1a3df9a095db0a2b713a0988a22239f5f08cc8f9abc3d67d9267f54dd5dedbf01bd490b0b09adb21d4e5aa7707e36cf77034f01bf8c7988a2e8dd7046bb2f486878436371f1258f3f7026afee6d7f6560be67103ad098edc9665e00118d4879f58bdd677cf2e6bc631d5c517acbb6db8a1debb4fe7492b7daf0b7ec7df056637c23caf926a1a589bef1db29cd81f547afd0fc9e459f46108ffdfcfdee43515a771c439dbde9177ceaf296a8749be0146cdca2b26be8c2ebd6cfd9b5032b1f7a375307f54c2f622711f8cf8684afaaf17c4da3e83666c40d26adc239c8d1a40024bbf560db5787ed404763d4e70ec6635c6a4b82c10f8ff7ad42217613c57648716ba94cb33129f3789dc86f9c8ec2e8e90e6bba0dfba1bb3dc3215188979a09f33346a6647099ed0e624c9ae10f83da0def840bdb25b718e8d86a616ff46b5327b1f99c22937920f5b5bbd6b53fa0b32f24befa4a7603234e6d94be51f00189a20b15c49e8ee58434a15ae9d10b9cf0204bfa7ab1fd9e006b22bebd22b036c4bb4c9949cb7ecdf01028d9f12466e144b2dbbf64d95d65347013e192d428678f64f0d9306f97208fb00a70d4615229143dd8890725ee3ba6021d38d6359055aa812edaf", + "0c5fb7075f5e15a6733737b614bf46871e29417e4b140bae6e10081623f5c52f557c36b4da4b5a4e82920497514b1e6f745fedbf73f86ee10976f82c6cbd5bc13a917514ddd062", + "e70954c812cac03e367e99f7b82a6dcc073d2f679f965d524872756ee58654cc", + "5f6267f6b3b21423267310e6", + "c53868c0fdc14e891ae1bc257fbb13be210a5d9cdbd9d18fe1b474f9a1929dbba3f25222d8fe8c1be3eef22352100064b922fd9642ad128a202b6382ae0a67c8affb0c5bfa1a80e55c1084cc372485243df872d677a80a3ef1ca3589908bca621f6f50133eb762cb9c05775d13db7dd3eb65ffd3eef96e8dd42928facc68390f6bbc50b17e1ef5ea6310d8756dd177be2cceb63a97bcceaa046794915589ca022d90756b02c22e8634c0ed44192abc3b8b1e2814c855ab27aaae3bdd801a73e6209fdd559ceb59a94fd98a66d12a31a643ca2f4b07ed910bc390f77ab89395d5cd1d783d8940dad4447f0452991b209cfcd998b0c814cebd08f9ff15052818bab0bf51c3b72ac1020d3b0974fbdf4ff941b1ab9c01f284fe82f2fd89c0aeb4b9fbb0a74ece08b3debc7b65e7263e2922fd4aba15ae3cba7885d04127c8e06a67f244e7aa4556f8694a5db6653f6e48d6de54f9e4024d25d3236d4f933205b6a358aa1506f832ef7d556c6a1bfe4aabfce51f3b5ac64bf6ab1e665bddb12fe13db9f07a55db3da3886df36ddb89f3a4939b1e9e5b701301570e3d01c0b947f498dcc6af438cc15e6038cb78a78986da0316cab67bca3e28c95e6b7e6b36cae9202cf4a77a0e15d3c3291d267aeee172dd587a944719b9fbe077603b4d39d4302b9a6415aa07af309a5e1cf7a9379552becdb4bc6a0b5c85d2e63bb141c405afc58a8b2b4188b3883a24eedf98dd50fc54725c440ccdb03514a6f37cab49296b6826b6bc7d7ad8cac0a3425eeb6866d94119acdad468cefe162a29e8831c77aa83321e8ae3e20e968cfe51dbf2b63f4e26c61536e6be4f63d61bbd06af38023b15f4fccb8ae0356d924dbf646bff69d1ac0d6e1c7f40b12d6d16e52d1c15958add5708bd38c514e47fe623a67c9ec211cd625b398fa7fd67a23e6e9f65d42dda2bae94524372fbc1a7e0ab3f1c451c126135536e73c573749aa60177dfb68843752b010e2cb9c1afaf51c94a48cf8ac7aab3fb200aaebcedefc6cccb581848da0121af92d9f4be002f0c2beffdfa65c36bec80e7f62d7009b1eb719d24b96e97059e6b50a52662c2c833738849f342391514349305228b29bfa9c7cf2a931558ca8e704c600148a28bd871465b23af499c11784aa45acd051f276d82789c58b14f12619372be4bc3a285f6cee21d65648d18e61752d6e7957736d3385f8ad36702c451c61ed475997d6d9f11c8be5257d8febce329aa701028aa2b5644b8515a95b5e866780e32754ac2e6f2e31b2c04a4ad35cbcbc25b23e9bf49cb1a5d877ca30880741757c29303af8676546760016f1538991b37cf0cd24ad3b1d877e5e1bd083e4b990af6ff5c0b28e530db3f463d21e76c928c8e1ffaa6c045937ea171a9071827a173e231f50e95430ae4895932c88ce048058ce6d0a50ca5c1842506158e98bb2912a61c7991a2256c97cb9050a4bb3ca32594622756291340561e9e584dd2e096263b6ff8eb898ae86f5f24500320d2d0ebb30d84cb4ef876a877dad23a611b39bf0cba5e22f2850e11c298fa23fed40691b83acc87136f8fa540b1dc40d1b0d0bd489ee9dad785c121955a094a2c6bd3353e142c04f7b88b2eb3305fd00d5eddb391b73fa2b16a6357aaa2abf2059ec979bd3ce06d5fff1c325bbe5c833a101615750613047d8155ac0c3a0734cc6aaeae7cb65d7501cb95f9d6d1161d09c961c0681547faf7983ed2efaf4e0fbb87a06169ecff1d0ee540a9223a73f75584441d4669cac09c2dbdb8aa2aed74eb9a2870f2021eb16e5f5c3e79a24d7110af4bece22a1086d27642550cadfa4f0e03f2c032a2745e1c9277a4f67fa4dc74ba056110fed3a63f643567d079c9430b8d5b3bf57a9b3f02d486d870229fee5462043b6bda8d265c745ddc1b8952bf91828d6db2edcfca7051e74df9dd456dca5e04ba469b9ff6a8130aab3903c05659b8f31cf4ba4c22511493a36541ff9d88c708dfb714d52a3c0356543e6efad37530b598bb63c3724772907abe4cad39c896c62daf5b30cd7d37eb36a7be2494353028c76e8d148b018c7bb755c45d2a33f61944071bae8316881e9aa37e4ec2374aac4f8436ed3c7db2092326538f07fc6644e0239899e3335f73c1e3c4602b12d19d7b639d4968974b6b2703ec1add8cd930cbafff4158f68f06aaac83bb4a2e31466e2ddc247ad71c5f4c49af7defd1394e21819cc24c78380caefb2ce87c0d1050680313037def12ca21cf67bb6692d6e4a9e90a9c9a0b7118ac300c6c6f636337aa25bc59cf1d9749dc183803cc0ccd1ff53210352795c6edb49ff1e5e8ebaee7b3eda6e3c0c340fa60594115e37fab60133b8a3b39d2e63db0bc6a03973e236fca801553912f93feafd8b96766049dd2066f3c5ac9222121ee9d36cbcd8f713adc8779949941f8a8dcc92ade62e46e9f1b292d5f7eced14c3bff50a811cb762ced1f103652773ef946e18569eb5892626627e085d4ffb3102c1586ddf88acbaeed903b22d3e7ccd8b8ddcdfddb872403240bc8e0e46a068f55bbddaf90fffb9a914187aac2ceedf21fefa1fe32fc7bdbb9fd76dcda1fca7b39107d308d11a118e47499dc4092ef0cd28d0d9af84440f095b4feb7adcba198894cd89a324c60ed0b996c520d4b33391bbbef1997256af7ba7ec1069244359066af81543ca23105742fee3480f890373d3205236bed566cd22a62bf69f8c0f27b714f84a203bca1605865e2cc2f9211389e0df7a4b3aab9d10826639357efe1f5fe64a1bd6d06d0b5605658c4d2d12e1bec77e70ea393b0a09043dd7d6684bd53f4c883f2f6928d99ba91873d063d43600f9105d503b11d8dc2b05e34b4fcf18e78b2b6c97d3b2c9249a2f6566ddab2a8a67fed6c9f8af2f4ef98dd579f2d4fb572e178489c503df5d5f03bee9920db347a6e734ed72ec7233387f1579c13725599a33a90915ddf03725dce20fd3806abc1029a20732380596057830ed63b6edcaa4d4418871bbfd58de1d1f2800588ed207f2016e11abd1baf1895f6096e2c75cc5916836a9ddc09cab4c28e53fadbd7d3080088131cc270095315b61011b0cea5b4d64b647bbcea54d20be1eec0992c72fc9c9771cae19191cf6a6f1840acec1deff605626d0a0d79ea8fe0af63ea75e80f8141fa8d7ca6f4c99dc7e78aeacc67762ed0134f1a0b053debfb9ccb145800b9818c2deb46f7124e8655f37c3291af107ed75384afcedb44518ca14cdea341c9657ec638531011cb957ed6b3434b736ae8c8199684cc58862638c5f6c07e1cbe8ae68c5582b1697ca9dbdd01e97023138a9173d6b1294cd99514a28102e6912b1c87ef22cdc611133bcc111e95c355a26b20a3d6f0ead66e932c5e1229b0fc17a7d6f78134c69beb362ca75017b1bf1105ac8970fad48acb8313cb3ff10e9d72c4ff11f95c2dab59575525c98653a9c7d31585a3742267c062d6ffc7a4303a3e81a45bf39e1ce2097623bba70f216aa612c64ba06ed6d596ad6abbdde69d56ab45e25ebcd4e485824449550232be26f987c14008f67c9db9d0f709f567fa44502b9e0839457e5f0aadec0395bf5c38ed8de7529708e58c0a895198fc8b2570fb6e68547630ca7f313526d392ac4776be973205f971854c300454d5", + }, + { + "95a17355dfa9d378a18ba20e58aa4b8711ea1d6e3c65e0b2d3c6382892c7d02768437d47ed50bf8edc619c340be7bb1cd1d88b0d3d6bbf1031f738c4be09eb264c686d39b92cc7958e63c9994a84b61b5c412999ace8a9dee0e2a29eeb8dc537f63271af5f3844ed9c0d86e6913c02ed7d2b862a132f08f311aa92fc3757342d89a5dce8dd20d5792d5c60be9862ab168d3140a061489472f2266f297da357064833ef2554c49f8120ff40b961ebcfee1d0f8e7e5722f049485f72c502c9cc4afdbb70517f0fd2a00e12596ffe285d1b37eb998e0e89d756e9491ceb13e83610a3a66122b533c2c3461b3244438f5f7a7af8088881dfdf6a29fb563ce38c4c8632ada8e7e06baa2686dc6aca6bc944e5c14d6e432c4dad554803912b8fddb1c18a59a86bc452914b2efc1599c5597f87a6edcad33a7728827bbaad0a975ecc22b7748d7cc71ec7f51adc8fe0350e67dcfb31af35a8d7b72391642e29c2fa4b796ed8f535f6bc2b1198baf1cec858aac38959f83130af55c21383ebd57d364eeb0e442104004c1599060667ce5e1191e76a89199a386e5c4bf147206e7d6e598bb27a90b3c6a54cccacb39a0ac42bf22eb40bc8ec7925376a6c57d8eac6317578ac052b72ab773f572ad961ee05531cb95ee5a6d70add4176351960fb4bd673f7db9f698616a8dd41823f2f87924c40f131e6c83bc40ab1f92312f46ee86765c306cf4a1d77275ef9668d80f9d9c1ea0aa7b2456bbcf764e009584ef1c0b4b4c683fee3fa2641f48ccf7485a8356fb3dd22f848deefadbef8050de9c5c19e8c449c6f3ec2b1324f80a7d428dc44dbb966d40244c3af03bcb410a57ad1430615e07553a22686f1a62dc6cf090aaac3707ec5b44274b7fe28c7a3a298e7a8adc71e016944875bebb421babd2b64809be3454f25b90723e2cec68467ad2d14744b15de8f9c397a505a340e85998e207cd46fa18d76c46f458af4ac3821c0ac6cd68afb72c376c31daad1a2435fc2bf333260c1a82430edaf2499e7455a93b1301eada2e12365ffcd36a1119664d0c996318a3e55bb2c04dfc5eb251f7fd64f9d83f27ea6577d748e1f85248355ed19867857dc3383e01249cc37684b0eb8e891aa663801e4ac8f0331b38686a19f0d19f6e94c7ac95ec395962be0a4e3c8358d2f6d8f13191e164ad29cd1733bde8c31c7d8ab90366e26cc9a06707dcfa60bfe139a112db827778ac348fdfe26892fed61db7e9849a464e3aad561797b6c778e0688bbbeaf3349727b4670a2d0a08f317b0dc9c4b12ea85c0309d57e754d0c7bd5c83985fb82f776c968189908a8ca83b5944767c2efc3c5f898436de54fe8bb17224012a437896d9fa106a749d12aff657266276129ec5ac12fc7a77eb06296d2a2a876d931e479d3ea201cbb4b1b20bd81471eaa33786c624013e1f07577c2171f38f0511c6924078a40c2d55ce392dd2ab0885e29f4c06907a1597c181b933853838970edad7777ed394c491cde27478eafa5b7a36520aa0779261f94b957e83ce058298dcfa07b08ecc425caeb6c599a11103d7631e77daa0d9d3fc6f42703d57f2c624ecddd56b9a27b848de7dd28f8ed656f1e4decc95a8908217e2f2453ae50b5fc1d9352d735ce5bc2b538eaae25501d449d090df793151811443c64f28d19eeaaac4081e10edca4c4148e723ade8f7e7b988b732ba08b3ce4c8a0d655bac4ff66048148135decd7727a49ac59d82ad470b5479c55d3d8399b790ff033d3ef99d770e1eacecdc140480aeca1e2167553cbbdef2090c7592b40681b733b0a0d127beefd49bcbe8904c975a5ab8b1afe56d7ed7667b5cf92f537ad6972b876843364817c20400524097ac9b405e4b35bbba0d12355a0b54bd763b4491b2acd4e8e4fcaaf8fcfd398499d4c4e81ffa93ca07a5ff51a1540f178f43a931e07e1ad56ab5ce57a2f7dc3ccca114dc9ba8a6934e95f4efe9f3f76947909b280ea5fd795bbbc0feb3ad2b704e305cd9d8f37d178961f77355eedc9d7f77c58e1db2f7797eb8682255939293c3ef7dacd2eab46c4cbbdf929aac301a13f59831a88fab173803399d96dc216abb9f079e79bbfab667ca590266891c8a7ea4bc1724573e5c5a67e9f1341b5bffaa538e240f78da7733237999ac86141b2ac0324f17609b71c885630c90befc3b027a5f01e33979165ce2a00968c414838446c2aba76e1d7fe3707c742f68af21d30e23b637accc848f6c8df820a27bb4e94e5090ac6e008fde7cf3fdd5931fa891335ec8d01b5d6f77db57a87dc35d6701adf7ae0bf82dda6511c83ab4d7d3460b221eeb3d6c4aa537924db5559b1c6739040534fc330f5144c78bf99f5f4faa715e85aebac043e2529197a82ca40f65a8149a9447a9e58c61618600b0c5ab221420c0cee114a133a648dbc2eceb2894ffc329376d1eb3ce7039cf30ff6a53038b23c26c38739fdebc7b919956ca2e468d577dea6621a8d66b78075ad26a6e6d8e20c9b694698540d516ea2bd108625e5fd038b5f1e19c5d5993b82bfe16897c375322dbbca81c81cef6ad900f0ffe5ed02714c208a12f5234d78e32ee07af155ad1e1077a0d8938f426d8f326c751f6ee66c8f707e8493cbfc76f9ddf1ea329e094315a91ba9385e16c890823db0f0231c7f939a042665009d5edd8e48102c515341fa6eea33cc00fb5d82380d735b29f2eec3f61428f7b186d43fcee46b2037ad1aa6974d729848cf1a80dc8ddb0580c9c876def06d8f7642cf45263a655ee77f047fcd76171546319622bf71283f3bf0b519e123a85765779c8bb201e99981ed184e642f63aa61f9cc206bf45fa6e514bfc637671d9cdfba2891bb112a3cff438a6372ee0dd3e7d9f352ce52f8b367b7799e1f963bfe50638f0c74b94873fcd3d66fc1e342a8bd36fb8b88f33eefabb78eca4dc9c89e2c57aaa010f2140dc5ea7c86cebe2f8bf42a167d1d546cc80bfa9258c35af6efb1a090c293a4cf588e4bdf5c090ee7fe38fd7b5551e71e5ce2b0b5a50bab95bc4c257edfc94d37579816b4a2249ba05c991bb2ea02d047e480fc8a8ba71f48f344c6d20d140a64ac20184e45b4eea14d0953370c237ef0a47a7a2f22997715dd3ee8ea52f24ffe12674d571b3bf968454ca051701e411499bc43bb55bbd033f9b81d4baa6c49bdd49614efd20d58175af868ca16a9deaf65216abbdc3beed5f30b209e786a5b4c006f3bd27d93e9d78b51a1a2fb7f5160a0bc1b7df70952ea1573888ddde3d9dd5314b0d0a899a733eb48d5e6c7274667e362e4da6b37c480aa4d0d8730e66483fb1453a3aefad69942ac7f09d3c571b6275590938c541336a121bdd20722550236a9a5e4a37c7de628fceffbc260b1e9b6417c4295907937b13609b8585ebb8f076073abdcf19104ed80ffafe1b09997f115d987a552be5689c70fe125ca702d2ae4d807d5690bc2e90b72cabb0b61ad203b34c68df21c16b92bf8def5680b204ce327214c32e4363d5600f96162a6819dda472acc6441858f396385a16fa5ee52cc0f9ffef3d53c49d535aa37db2cd4b573ff81d74006677969ec1ad891082b5d18ca5b0b9f975574ccffaca72b805c9f7fdd76bfe3dd384dc953255a5b50b7731a137fb9aad42e77d3da1eff5a7b9eda5814993cf2d289bb25ae1680ffcdf419e073d38b4701021adb2019359bb70ff4cca930be7bb979a0678f20665d14803d8753c8ce54cae92feb026486ba747a861daa449863bd38cb4d5831aa6db1e7f404b0c3587aac8765aeecec686066ee7d11321574f04d3f3da571e71222ce07277eca7ff97607", + "5e24f34a8d53b17bd0c2aee5369e3276dbd7e7c2ea0990f1300fbbb00831b76655aab1e2fd625ecd", + "c1d796f1e651a1ee825855d80206baff6818cc8c247ee6ce62b7531e6e9ac32f", + "240cb25aaae4d085bbb747a5", + "319e968ad291ea5d4a057c38f7afa4ddb9c9565962fa1a7b231e397a268ad8e0c5030a2df09dc4f99402ddf2e0d06e753bf55e1b318b3e5ff0108de2328d3b8d53e23e08bf7d84d59fededd60d47bbb52736b0491f82c616eb5f779c496abd6499555035e4513c8613e7204e6bff8d06dfecd9ce38c6b83efd8d0e41f84f7cfc9ae07113237987a4b2eaa87f7e0a310155e282e57858244e9071712fa026cb781e5a4bfe6fa1bc480e534096394459a3d1354e2d9a54aac6926a60b388410fd0b53f7a3a9116292f37406369c22ea674418c4deeead171e00f74f5cabae5d24a0686a4bcd8ba99aea613a23edd0a019a319daa3779c212fbdca9d772fc3fe612cf178c2aca2aeaf6bce2433494027a474eff699bba95fc7dcf79ca1d77b1e097439a9050a5cc78e0b78bf2e7f50f959ea2986a59be3880519cd84d0a673acb0432feb1945c603e70748445c74600ccfec60efcf9e4d02a7df5f967de4b473f63b0b0499ff4ba350ec1182f3a0ac17ef9ae28945fc9bc714c49909a7c1e2f311aa6ad7652e22e1f48bb51cf53814a2125152813752d86c7f9468a991d0ac84b1a2f3969b8081c228b7f5760718036e26a10e211ff04ea323acdaaddf9b06a08c92ed663d0fdf13fa601cda45c416c2d3803dd9b5ca29cba57e59cf4ad93176c65c64507b1995d638541c90b381ff758833a2ad67b0de44c280fdfd82b3c6d4353ae30b33768863cd3169a2032f26e37ddd57e7da1673cfc7375bf6e6792495a2b434155d684f2a6f2b919f944469d47be5aa7da74eed69d871e6f65c3ae08904a9ad042ba39905188f0b9158fd14094bd6a408fba6ef57566d69eccda86bb54cd3ca7381f51bffeaf8bcc1ae8df91d22c359888e21b70f640d6f3726a34e6100ee269124747f0ca05110f63deee07e3628bd6aacf926036ccec02c0b6bd7259db52ea8b7a686b36ba1d0296c85e43e25d72ce46c66a1e646301dafd2f4c502281e6f949011cea69459c026c65bd130d6ef06be17b23a9c9a84746e39d017b144135025ac527c1e653f233770cd68e9f232c3b623ceda836843b3e9ea313cc6a57d28ce71ccfb7265ce73b06bce1447220645e6f66caeb06b55129b97c8dd8db54c94d771504d24cedc86a8ec706a9f7dcbbcd7fc7cf38005b2913b1cfb77370bd23183ac7b5ca5135a2738cc91d05b2b22640469e3daeb6a7b0f14fc6652563663520f7754aba624a35e5d24529a6ee9f5ef0d019d83c04f5a93a38b68cbce0cecd42a11aae305475806326aebb4f673791f50c9f90894add51a0fd7c02807efd8c1bd21fa717a860e224bc9fa3f40975fd8d558e4844a09f8920256528450d77e546604e2ce2d38efadaf39a0ea3ea12156174aa8a20481e6c1190e448564675f9ca60bcef37cacec5aa218122e7bd25b571ff10f54979d62018b779a2a3d5d7d6cd56ae31efef2c844ba50ff9da88eba7a8e0d9fc5388a805ba4ad35eaa4798e395d2fe112083cce2f11cc850d25ca5c6e60a9996cee4789ca99d519daedb62f4fb1e535b742a35d71d7390117e93821ff18948a78c1fcdcb90a5f1211327d7ee0663ef16ff446e0e22d8cb7b2d3d05469b1c02864f4a87e2d9715f60c9e7be841e308d0a5f6c50161a4a0464aebafb88e0d2df8cefcead93c9623106d5518a9852f320235594be10c45bc0cf06c9daa007100ff97959357f9be8e49c870d0a11c884213e266c35e9131439fb3654fd5f1abd1e778ccb02b8c262753a22653a09272a0c33b6b2683c9045e8f967af756b98dc1797ff605c64ac5bda8252e9ebfe0e4d8d7ca754fcca5e3de3c4b63678da095281d76d60fa12ff4ca818825f346b9c4e426cee16db5818d78a527a901cd088bc2983f9b83430b50683018996996717a1738439680b68e3f61cbdcd0f0e1a6b436af8fa05d3ce2228054e319bad1dc6ac970c75313c552fc1136fabc302fcd1d09ef1b9138d18133a772cbd9cb197ff58c6e898f9e83e4e27206f3b15b6bf2778aaf9fb38e0d50152f8dbf5763816132a04b4b2e9639584b3dc8ea6d95ade024f9497944200ab0aeab206ef099859b9240aaa15f737c1e0fe6d015d04f47261ade4928e3c2ca21d1f5ab4a3f571f2ed92ebeeebf2493e6e39f0063ba931e165384ee1b5081f5f8d26ec24716757037f5158d35effbe67009080ad7b0381292a513f312eb28328cf5ff47a6599e36c14277c3eb5053c5aca530ff5954c21c03fb3fd5fc0facdac36dd819b0495fde421411e0440991da0cc4a20d294446115c0b79045037fbfacfeac574da3bf192fec4bf38c27cef71d03787430223b6069ba6d9273ec8679736a832277c657862ca791b559a5054ee8c7c07618083f75480c8aa01cb086c7317315911802e6cefb15bbe20494b14d97e3a885806db775c216dc15949e3b724f7cbb30bd2c46bd5a2fd6132352c2b21cc2b47891dd9794975f70a6fa7a0791ee761ccf4c263f27f64790826c1aa656c39483e029baef0855935e7e6c133a4035a3699925fbde131ca62948879373346af35bd7fa52b8d6c3338f213bbd9c79977c0d710028d1d386df614c5faf4a1f8fe5506a9af7059370893ff6d07d91383baba67a617b5d829e0e2eb20e541ed5c34be7ef0eaf6c6f6f52d7ca01933a2a4e8de46e422dc95161ba8ad354f6bc7c8e4cf8ab5e08607530147fcd7c9481afc621c5a3230a05e2c4db79db9e1e73f43556a8e8f0dff7ffe420282212f23d4c5f6f8d2febe129b9fe5ba7ddf27f72ae898a4eba270b5d2bb3b6b06e38c546ba80a9b2bc46097d0b47db5ae72485ef2c6419e856c33c2d66a861b9d474699e730eb8a8992e3ea9c1ed74316687d5d9fc611189eba2aa31af5ba8e81179866dc016bda977c59c595e40001c8ab3a4a44cec00ff84c6dbd9ad4be30bcc080e69b9398089d6ea464a70f536ace3b447693301c94850606d0de1299770b5f45e6d28f8ab83e3ffe52178522eb91fdaa9e4a696674ba0f52ee18e960b04415782f018d67479081b1bf9b4c9b90de026cbb66bf7d9d12cddccdd9b2c8ee2f010892571c6f0c0feac9555c71bf61f9cd69553cf7fc2be8d058e0c3430e134adb1ba28985fdc4f0cf71bd3cd09f5f82f303cded0de62f98404477bdd0a846c6c51e3e82ebf72f475afc8e6388aec57206018ba2528ede194345cc1ee95cb2023793f692f708aac3c9e8a682af36b078f5d6c7a3ed07475e9fe73b95d1eee048ab898edfee3fac4beda45f03eeb64b2128f6df9453ed77c6010e13c0270c068f704f49e62fb7410be90ffee47584ca2efc5287dae1f63bcc1819e7548eb9f0d8a3182f9ed00da3817255a2ff735876b75cd21cb25e86aa4b2893f9e5089dfac76194563f9a14335dd37ef06a501c89623caaf6feb4afb792092dfed515ba7518e278c341834a9dd17b50a0fc860b62ec621b69408cb3fbf7d4ab88a3e367fda84c82357376fa9b1161b739361c313b99dcbf4122f3870c8175093298cf432174217398928983ab6cea4759f18e7a21d71fe1b0f3cda05d241e12db0818b8763bd23d958d6e52981ce8d84cd6d82640d2000874a53c0bd14949ec99e48ce6c954ef0d08e6e319de5ebf7e142f25c0f50ff13f6acecde6a270c8d8de05ef4c310ce9e92f40f6f2b77d6e7aa3f056d4a20f7faa7cd0b93d82e3972343a50a26ff462caada10621bc953b73913944246d2a4da25fa52cc6ee1293c436ab9031ee2dc79cce39f139f44d473c236731257c6f65ca4d383e39cf8d33923afea3c80244021d36e0ed43230c44e7d1a1297d35464861f9149d869f26cc51879027169803e43c898d1b4a2a2480197500", + }, + { + "2158abc2472e1b9c061da2c01d0ad9e996fd687cccca331fe8a2baacd12c06f284b1b5cbdfd067e5ed09a60a137ff4a97c5c26482659680ffb22bbcd4ec1bfd272749e52440537320fdd3c225c30ccd98cf221b34b89c247ab7d14f93ed3ccb0486a028c6f3abe7e17fba1742b6d4db85f6e6baaf82df1a3aa059de8d9699821d39bad42d56cc1ec67626092cfad4a2e1cb5d814e2cab78ccf5474a8bd0dc990a877d37de394694af6cadcc57727f393dccba7bf955f4b65b3c00d71cdd701754ed4f231685b7b5e2557239d7e16305be2d81a773765dcea25ea5bf2c15d670f3159409ab5bbf8da121c779132a8ec1480068cb76b68a19152fd83135aeb228b446225f91d1ed4303a4bc16cf3ad8173b30d2a1e75ccafc8c933db231efeae6260d45c7ef230ae2c7b6f986f1c19e2cf260ded9cd99d64a2d03fc5ee3d73509e47ac1c39dcca655839fec75517a9243eb611da8fae3e317e7df66cbb6abd59b16975eb463f509e784e65cd660ef1a4c5027e54b1bc862f397c9cf4e6594d98c2c2830801d3a679220b46881a372cdf3aaa33eb66b91a9f36b6941c0fe1b4d2a437daa50b811f2d8c65b5a69de185d78bb9c2f172dc90a89324c5a2067974aab14f4fbcd06ee95cd49e03717f88480a410afbb4e68b5c79b0211cb69b90604cdfaf08af1ef10cf28f0f630e97ab18d9b5138d9b9ee9154e0b3104a6c164f2a114fa5032eb5c247a6b87880332a0dce7b36982515297a05dc8a4038a09f52b1def7b4fdad8735443fadc462c7c22132f8b9581de2d213bf5c53f7fce34aaeb24263afefead5341a72f88d3acaae6db367c5c14a97d4f9e438e1e11c3c8fde7ee37e5ece5382e8c68b660146046ef96c24caa6bc9fa0a0c88281e4bf01b32df5218cb3750f9c4b8af24cc106abca62d085198d14ba2ded3cafc1fbb17519a696965a1ba5f65720e893f1ef3fbc5200316b9d4615bb23426ae53e1c5a57b2f0ee0d0c83f353b4ebe7a6cb17531d278478b4ca8e6ffdd0cad30ed73d568a2e44972ac88a7e7d665614316d674e84ebc739b645a9a4166477254ba47bc5c2b05ced88e75bf64da21a7f1f71cd946d84de13ca77b7e0dc2f0617d371ed96323a83bb11dfa16f81bbde913d9c259b10f3aeeb6b56cc4775c25f49343cef667763118932c2e8b47ec745ac537b37746ed65fda2d1c11a2de60ec02adcb79152e8a9e614d8715cc4e6b6891d6a0063576560fa3621146308222432ffdbc351c36c37d844a934088fea92ac54920facf870a62e91ba9299dcb6cbdb918e2d54fb642c3f0d60489c4bda489f6c584b64c8f19359ab25f388dbbe636c4d90c048f5ed87024dcf9f98a9e738163f837a07750d61203254a80d120c795f9c3aa791272f9474fe330da81a45be5ac838613d46c25e781606862912ff88af393040605fd4d55d07e2052227c37ceffcdd2d42a08bbab69140dfa4406853799893daf768af546f915a91b81d0da719ebd45b8b5f1641f15621959689e810217bea18e3996c532ac6e4e2e4f289fddd5e5968bd6fa9aec5ca435c532b6c74a7568c8aeff9dd19bfc2fba3b484a191e2faf9a069a24e2e6d928ac0bdf635644cc1ef3bbacc547a8e4f1d42d4bed3b6b8cc56216fa550dc37da9cf4d1d1591d9348594d14adc7a3fde5e5d1a3b9875c85de7df483cdd0baa86dae793e0796d14fef1f649de6079acbec6b6fa5f2cb2bd0481f5316f00dbe5dbc379bc3cd6d13bd8c775a727ef43e6a5fad1051783b22c05a75d64a8394a73fcb430299b015563c8cb0ae0aa4ec750399855411c076d21aeca8656f3d0cae084fb0a1ffc6f73b52a7ea5d4bd6d24e7057a3811719533105fc967439a32241f2d3e3f299da2deb821748cdee1a1c5e71bfdf88d833bade2f505268f375a9e6488cd8e16705cce91d15b60b2fd269a19148296a7be348aa349a12270fbc0d5748e538afeb0598081a4f1349217ceab3c4141d40f765ea2bfffd530fb9606601469fb131a44939be984c07bac8f26d8c068accfdefb729eeb47cfd6ddc646e22031f53a7698c6501d86cbba05e282d64b2f962a1b08b9064078dd1e3f14006f45f599bc8e600cabe6d855fcbae8c3060859202361d929a241f6c0711ac0d050b67a1d44da19e0b0e236adad1f60a327c9c34b2b9c64cdde5b8e4f664f2fc70599d44a63ee2b14d051c27d71231098ecd3d4086038d63e84547dfaa39db1a92785e38b640ea0345062a1c185b25a72862e7ae6574114eba592d6492087e2580dc5d361c473a614d647e66c0a30de806f4976b69a8b92301e68794ee05b96ee116a5fd5edf5eab43dc1103801eec861383f17c2bab9f2d9126c1802b7aee0c909309ee72679ab644abb9c4caa54add283b5954e6f881781e42f849bce6554c7a5e3becc5d5a209805ccd4a0117272a53807e3978ffb19641a9dffd9034490a9284f658599961daf52f24f6464c2099cc9ed3459d84dbde2ebbdbbeef25c882a9beda03573bdd4c6a0143b14d634a1a021d5f9fa23a7ed0f5598ee57e56672814412b6c7c08b8e709fb98575fe2716100d000a20a7e7200d800e556564c7e6a8da9d609b18ff0bb8a8812e96b834a6b534b0d5dc97f5da17f42f8d58e763f1b201625d1a5158c2f9e9e190921637474ae81d278002f197f7211540088931ca8a941794e56067ef4a497fdc6fa713aa9f20c21f23c3a71ae4cc5aed459ca7c020bf55162fbcf56a066546660c5a009b8ad2aaae9651c97b1e145853a10013d1bf68e7df25dd492c328f823ed982da54557502ebc6cc56d4d0bf2881bf3c536ea53b4dcb0886e73b066969dfec343441b9372d7ff38454c4337d45e2b999415ec48f19cd05f0f80c5a61ec369610784f47a5cf3b2a13ff5d8145303ade7189a300936006846812dec9ff15500f8daf47236e724d72619af3a6cb3e854cb8284d5b8843dfe056beaa45c40a4541a98c7507feb27a605d6e07189c8c5554a492a03ce6701d3d2ec782e2c1c8346b54a963435bdda3a93bbac1d837172cebb9cd18903d25cd6bed404eaf18730a6d1c6da0783b5411770ed34f35fa6c11a4292a34565ff1b23d4200ec5a73e6b7905458088fac19f6aafd35e0e791f28bbb2cb0117ca1c3a9e3c4863e487ce5d8c14dd140e9eb4794d87d75b01f683bca84ebdbf19dafab716421bfac9e95755fd346a0cd31e8520a55c7ca652ff63fb4e20ba67fab41e11f7390bc02363162097802c6a9eb18b430d07ea60064d5b546d15bb68cada79c113848136e797577f1783e9b53574f9427be3a28230fdd69d139205dd6c7e9e7f031fb6eab70d69ce905384c5c77d084360aac590a89b2dbb2d339899b13619b455cf9f0cdc08db6c5b5f3223dc3a663ce42bcc8cc6f947f42cdf8dde15a6926b753177513a52be95b1f0b88d2a1ec90e49959b108fe204bbc29199d7382c42ad5dbaff970cbd2dbeade54bd70415e54daa805d396361f525f38efc2bba3fd818f9d7af0594dcc341c20f18c624fe13ce7e7108e1d2fd06c58b03f04642c95e3ba00d4035ea0476ac138f72378d85050bf60dedc90af38e96f67fdc38483a73e847b41d31b894ddcb234f02b0d507bbcb15a8941f9c23b592a291cbeacb3ed213f2f044aa842275a7717757467f121294bba6b357c969e96bfab455c6f328d9e5181d909c3f0543b17d9af7fcac099067b043be79aca8e5a75c3a6d4f6246357a63c516a3ca595447f34b43a055d3070517c67ec36e636aca9ed71a001d4f7b81149124deeb7826dec3697e183d861d544c9c17baff82849d599e9e77ed19f801aa1ce095940674576ff270ac788d00c429187e299a03c6f3a1646a8f7d6290287e70bd1276316ae624da929c67936191abdfba45e2803884e5a3136205a38a841448968a7900709dda033a42969bd3417a8d865d0dbee1f261f4556797dfebab278136a182a63e5ca9789e3f1371808efe06eb0cc5ccfe26c0538d573378035afa39fb7cdf3ad889b277c8c6e84954e74f3ff3140bf13bcb45c822784125d23b5eceb73e", + "088fc7ba068f80efd8d4d62813c93c1eba77e9ff400c7781314abc901873ce200295da09245bf8fd2fce254397616151d94b511957c89a881256182ac9e64acb7b25d4a080cc9daf9ac2f231235483fc9fd415f69caf7eaf0597", + "78d5f86b071bbf8a185e5e2d54faddd2a9e26983b1e7a74be0f0b979b9f4af31", + "d9ce7d249af9496e99c93b36", + "ad542824b49fc520f0b7ff8ce2bff8b3d47baacb4a1c95ed56a306483aac551fffba48e8a8f5e4cc536e9266182f6811d070fb9282f5c542cefb4993ccc7044b42cfd6fc71793dc8dd2de23c630f9ceaeddba45efed9d7fca25fcb07d193c000822478b19c2ee9fb31760cfe01475ba8a003db469d1130318a79345a29d054a9f9412dca1edf6d8f1498af5bb6fdbbd3d5f9a244ff176f62742c53779291ef6294df6540d841f4ee8c7c58fc8497ba74d9cf7947add5373427d81ae928305b93dd26cfc65e63b0ed0812ce759511bfbb10aca98f2abdbc9055c4e5ab82637f6a965bb74f592bdf11118b8eb79d50331e76cb4d10c6b4428cd4ec2ef4cb727bdba2b5375f5184d77772d0f9fd3a3c579a4a548b9c2dadc22c805ae959617af49a514b43f47af834313ed2e4d1fcec2c4b9ea87f328fa3d23129a36e6c54bcd08f7e30645de86e98ebb11bcaf99543503eb1e024bc9fd51fe6bd5e6d749033f2452cdf28b3d0f8a304111bdd26dbde641c02fcb15dc21b1a9baac5e86d35b4126ed1cc8a2c3c2a5b94c99fb9b2008daf1a0c090633bf9e31326428c75a50e821b1e72a6504c9d7bcfcaabecd929163d365832e8971f5efebff99ee3f5b95f957e8904d05b410936d8a81c60b4947f8605c58e5b727d491995c76fbe06e556c8ab5cc661a0c09ebc98d61010050f68b31fbe1f9de8f6481b2704204b0164d8433ba4dc1076908c782826e9b555e8d608463581099a466f92bfd6ac9796eacc0ab771a3f11d03806b0f33ec04c69cef6b87d58c11acb5d1374450ce61ba159456b915043c5c17cb03f0ba66d027105bb6fff41e6422f13e2a466f073358bf68149a3b577cfba7ea08b42f83fbc5a2aff17c5ee7dbdac3ff97389f5b8d1f3750e5c9be651209eeb9574127ea81bd7619da16d1cfab85754883543f6474c8c0cc9d5b80e34bf8262d2b4798f9917bcab4b880339397907a5bafe7d149247fd735523df3cbb17ae5e298846ad3bfb7d4f902aa549b7667d3ea945b002e7b209bc83842a7b120d6d27ce80631404371f31d1f61efc5423e1822032a1cbf4fa1a6b6fe79934a202d5add8c6e3595e49be3dd9553a569521c50e9653bc684ef2b73c3526ff7a0843fcac9cc9ecf46e63df5b9328a54c576bd299a366bbdc0f83a9de67b03f1da16244bd6d52e7e4b52c4ed693827735554b05b3a260cd01a41d7c944d0b7b58ae4b0eb052da34bc22b779d7ad46f90f3d4049c097e0adeaf71bbb30ed24b32ff5c7a65177db77492c2571e9cd99f15e613797e319ea7377038d53b28a4cd66a697e5e8f84cf16bd0f0430b34826114b4e1d1ebaaf2939dff7f9f4ce7c0861e51701c42d9cc9e871018b447ccaf4e402e3d63be164dcdf6799314a389ada8bf5e51a35148acf627e51481b9b0e4bec09c9e6d59229721b151fa9adf8323001fcf33afbc9a949643172f39b0d10ef57b37973683fdd9b9eb46e63054fd05ffbef889ff8fc8f251b0ab41fb00757ec1964ef373fceb8f6d148a7f7c89944b3cfc240d091601b23046188ba70a7cdf7b6f96eb93dcd3d24d4aebdc4a29a749bfe3cf5f6e1a025b62982ce188e6b57245d829c9fc1dcaaa5309a8b9557b8824a78eceef6e977721de4065b474ae008642b974001a5565ef5fe4250194e8b861cc45a8691c461817f10b646fb526bf0fe7790bb0db29d1356e8c7a197ec78df8310431d632a032b5490c2a458eb8d4327a9679d7e8ef8739797b0e820e2c567ce3562592e862a1dfcecd50bf77fcfcd00518db65ee0effb9eb3655d5d401a4a47808faa596d17b316f828cbbc14a7e018a0593da9320140a752f3824b5fcb66aa4c3cb94366ee8b821b09e7bea2c04ece15e8a7be1f58463b525e8cfcfc3fdd395ec5b0575094313557e632d0a65e3099e3c653111a5fb4f0eb2aa710229fc055a2bfd8a7147cbecc10823f1244fbb6894af1408ff9047d6483ef83573b5421b9798ee387dc38f166b11de6c33e9785e9b3d9d28bc24c37890e4f8f8ff24cca298b44d6fb1c6aad28cc634a67dd427205285521a172c2a4884ac5b038e261e38faf0086a02aa29195713cea335c47d03d67fa0dec7a8cb21db741519f5f0ba0143f14d71e33d82c75d6a19b3f7a42e6c16d762354daa2670ffa55bd400637de9cddf9e7964a03b4c8956f36bf54d89cf16de23e8c52957b52eb4572a11d1398be72bdb129e2c1abb58c65cc291bb7b0d2dc326c6125a441863a6c92de0f47a355222d58bf10af0d297a86a98b4e933a8f844fc7f1bbc8ba77919dfc50c41219e3db309b92ba056349faa758daf360b8ac05e43fc2069cd46e63fec399cd7764b111467fc65407ac06f5f84a3179930f6215ac5ec906146c19e0d3e162e77a2bca3582128284282b251cdcac03ecc204266ac3a9cfe8d8854008baf89c0ea0096a400d6a0d2f7c681c99462cf0105f7a3dde690ece0438fbb820b9c73c6cdf6208c336831101b904526cf8ac331d879d71615d8b1f750ac7f0ec692d97a5e21e17e194a98c10172b5c4bc1049a8743188ae7c4d70384a7e68c1353aab7882bb91aa383821046ed0ebabb4b2dd126ccb935f48646b299095cdb71ecd5cc402e4635a3f7a3c8a6f54f4076ba028dedb402bcc92f5668dec3d91dda7319f58382017e306237e42480ee2c1f5930564cf16fdf37a3434585336b8e4535bba87311cd47722b9da727250560624a5dde48a2090ee44592d2fc06edda634b600fad9f843c6b2eaa0697b42858afee8191dd2a31e5685bd104188e2ccb057dd0a8d4d1205d7c846f5b8ec0f06bff61c7f47ac4da30e1bc80a4e95af79b14a83e9af2e0f195cb92d14f752a5f12ff90a05765be453075d799694848fcddb07859336ec101c8052bdc273d4abc313cfb351b543fa340dcd01bf32fea59881ddb8f33c6023ccea70532814ce4a2d0c66c846347b86c29dfc34f6fa4db298911d4367c59939020a3d078194e6a3a3c5126c24ed182398468e77fd61a5b1271f5cb2a97868876954c3f7179d6a045f4bd770f681cd82216cd2b1ceeb4e724b3fddeb74481e662fbd7f5dd45bed6d4f89d21b8dd9c1009ad2b0b16954e97993ab8f3fdd9d61f8db102a945591b4552f419971a9e46a792dd8392c8d9502767c82d9b4f69e66071eb579859e9ca070cad5fe3b7fcb77b8474926ea991ce7ad201421f8a79c051b762a066027ab2b9595a1c97ad57f3149f5872ed4d8e99195d47bd3c03bbee590a50a99d8048e912aaeed797977b52f0240a6cf2c865b108456881adbfda60cf701454da17bae879cf098df808f34e50bccaada2d3edeb1aa73cfe3c512d814eb33897b6ff9d67d3d682517cc333c3c2552adc99860b1f0d1076390de9f84fcc9e802581f77e14f5254da01831c70cb8581630dadb44209377d90447a1a21cc8a2d6d897db62d8420afbcc6ed85ce42f3281255bd43e0afd3e86b27d3b957104ef54959282b0e1b381a26f16057246704c7888126055af5a1f494540f01897e8781e1a5c0193b7bef4b5588d0e9b9c8de74dcdb63f03f7b15cf48fbb71c7c3bbe9329e3d326988bad7d0cb85537c1e0b3cd88f37a3c7765f548f99e495ddc29daed8c7f15dadf2e5b79def91dbbea277c51a5da250e66c305604bcce4789ca2df9a10614d72824ba8e4f179f35ccae7119fd962cce13b282f0f970ca6c4776374c4bc438f0de98aa04fb3cf23d2c6800a4a666c15bd20c486e88e688ff9e5fce906b4ae96ec7c3388d7567ce6c8bc61f6d2373b93f9ddbb02b384084b3f28f54c9ddda232d3084daa5fac5ca356ac0059f2fd3fde5d6a9516d0954653b699aa986f70733538e19721daa41329abb95058450e602eb5726ad5a8b81aa474650659c6f7f6f53f8a6e635bf35f4b1191e0dbefad3be756c6141c7d55f007f4fd131e5d5eaa120ba31cc32b8d4c69d4fa784fe0af7dc272898789c774e7995cb252eb6c8e8053c9e7adb59c27f675952d161dba78bdfb15859fdfe4fe4a44c01efd394bf51d43c600aa9a527d9c490971e188e28b980e77a9c6ea0a4ef6bd38d11b47f5745ecdb", + }, + { + "9cd1c25b5bdab9b9080db3e5e05dc749e0783087c310777d89307138613bdffe0ca259677c13208420d4690031314a11a97a986d8b0fea143f5b4da0972c9ea3cef80b4b0b2bcf2bff392c306a764113f0d9807be86a9027c6ddc85d096600d85e0b236937f295362bc1679537a8a9278229a36a9433925a105ab719c0b7f11fc31488fa071d3032de97c81540713dc29ae02c2e13be8823183f3cd9f72ef8ba4280b4499ee47c7c7c4492bcb5cf7e4fafaa7ec26906e58146215a3d4f52f792d3abdb718f57ed0b9b7fc7504e45a0fdf01ebf5924a4da6ac635a715879ea75a4983cbd9dab9e47638acc687f16684e184443aa9e81513ae4abbc4d1596b2ca3eef77cc9b0603fe90c0570fe6cf4dff0381a99212fadcf7968934ac1ff7664ed6ee0b61e41f5074dfb774b676c2b57a445f1c5749e95ed062837c727ae2c151c0ccb3a4dc1429bbcb9e62325117aca566b8fca0924b70f4defd7749d0389b90f55f35d1635f8d2efdef514f06fde46db6e11e492c8f4dfb7cb5454cedd0ddd32013a4836321a25110f3a017f18475a86583e192132f8d8fd4c2dcb2a3aa95c3be3a57216bf9727cfd1284eea6fa870c8e689e91982c116ceeee2f8298b55646efad684b96eab883fd3d629437e9a0b6523f47ea5b59474a4766ccd01c13170bb08f47576a0fdb573d4dfb65279c1b79cb535426bcab60f4022dc42e40db29f15a6148b461241bae62070389932f035e7257752ef2d6130503d72344b24d360cae8ec11fa2dcbe04d3b18e66d081b552e93a71dc0094d1046bf4491e318f2ae00debffa0b8ada58c5f23e33fb598829ec2f46ad3894bd7f530210371a02e51ae0a414eb2eee43f3e08126dbdbae04c7de4b7416df32953234a6694ea84e6889f27c74206ab8144a393a2614e92adcc77550dd54827387b619f004c13f6c4a31e8bf525277669db0a0c3c589eda15063f12eb774a13e2aba2f2f7b6e9bc69f8485f1d6fc5773acf83671812412d28704003e78a17da25bacd1d61a6d9cb9f121abc71d023bcafa713b7c954e4e1c524e5bcaefd86c4a843e209eabbd579cde0263fc059ec6ff10017ba54fc9c2a1171d6b06f5d85079167117c12e6e5d0c71c008765fce756fd0f1141fbad6c1d2f32cd8e80429611a9a78dbc8e738d458f9ddce58ab43c77b34db9befb25cc1a588998e8dc2efa75c6883244fbbf9a7b4d6750c81b8d3fdedaf98dc61f49d067c369409f984b155ec347a3bef73e2a44957b0ca0f84c7fc335fd89453759ad0ac2fd9a5b38afa9fbe74daaee7bc52301302fb2286c21fb922f74d756de84519171fbecaa9b869682d431614ff6845126a4034f10253aa244bf89ab8e0dfd1f7fe8fc1a8472a10746d26896c8ece7ef80eb2e910069435518ccf096caeda63ad692455b04e6525bb8bae27197ca5118a57fb9a5d8fcfae1b9eb7874d91eafafa0e4fab5cb4d0173f7e3e58fae369843a641e98f3ee460e8cfe95d98f7fd38a8d2235e9d6050015833e6d7d21d7015c3b1ff42f0d3a3d9a38d373c8524752e06987c9408cca550f08c38c2a9a8d86d5ac7a04bab44254ed15c7b5670e0747788e11b81adb0d29e3d0b50d6a429340ee0d44a8c286fcaf9bc46403d26b4a4af95b021336103c1ae0f1274b33bb8b21c8cfca8a56c639f18a9df45d083fa7019aaa14d1ba50eb9a4112e574cd70969640602096265a87b1f77c0e00bbb501555f1626196611b4a824991cf10ab2874a12a8e0390267eaf9e3f8f99eadfbf40d111a26772cda1f50743c417eeec9c80171a83a730f246cf31c6691c96185d672a0fde9ccd7091c4b455dc93326913497396e0a4992773caeddcd783e534eb0f34b99bf23a2db6ee738381b5fc94ff603be014c507888ff55557793a8c5439b11dc5a347f35a2666eda81cda4d1c3a78fc4f3df3c7bde91d05524791b67142c446f60c3a4022912ddabdf817ca3280b671beaa496c935661e5adf39c1f4650563c5c807c8f21aa59df926199c4e2404690ea8ffd7dd65f637452ff93995fe9c5ac7a322b9bdc756b7ed6f533b9357a4a1ffa379dd096f144e9e0d87330c238ed3c6b08c8478e23b65518ea1e4e64585e5e9fec2f26dd7400ce4c73ff0eacdc3b07e4f34f6316f5b82fefc66e442ecc92bea8c1d58635d644724a3380e71fbbeef4bf3e57c6240ff603d65447f510eaa3c9ac794fd24f844489b7c560c7814fbc307e03f6a213eca5ea40fddf51d8731b74ec5b472bdf8ba59751065ed2461b02c41ef96622e60c0d26f9dc78c24f94372bef7e47cf09ed565ae3a52d39b02ffddf1953f1ff500f1659db9f1c2b23534702c19ec1cb7c18166fcd33997d53874c7cdb4e6c2b4d82751911913434e48b37a61a0971861187e5decb7f5c1ef6988bc1d6f7fd147a623d8bf361b0d7ece88df6e1ff8d037762d232e22e51d8c6ddaa9dc597b23ff9efbbfd416cc53e5543253732a23aba151cecf73b3ecff21c6a9fd1f24211fc21cde9633aae918ff1c6b72468f1de7e0ecb6539fa353c069fcbe8920dfa8e2fb86782e3062462f7eb2a2c441bfac21ab62744b05c70b6fc3c9f8e3a8a0c5a4263ed256a019861ecb28e20ce78e2d93f1a1def669e9652cb35d105bfdd5ff2313d27ab3eb00d1b628b4c20f42efa23390802af96a8f261ded3678ea0b780e1f4a88d23588a4ebb058adbf9a9c62ce2ce2f8264c874c697482e25f8d5a6daca4f57fd97d23c42d7b71ec150d4ee33931db5f7d63abe7d72dc936bb23a367c798e6a01509644284d52f9ae27d7d1bae597b2cbc26139354dcca0fff6d76c6065d661b66ca5eeb9f8d85810a029cb95b17e5173ef8ab92d475a1d3e21799e874ff04dbc962c668ef4be9f94d85b2a99d97c0db8f6b6d63e00e36c325cfab9aceaf7597113bff0086e8fad36eac7c0b443de6d3a8533789616d4c863df7200ba795a3b8d0a2b9568bb32af95fa604a3e3ea778c3dae159e1b612458584564ffda07b8aba9710134242b2d83d23127b51b9e41584c56f667b71bc01060240f3a2bc7e5d438e7095c1236e0e468079a83a5dbdcf132d258e9ed18f94d3c098867d06d3c09544565677b454be34ce567f1c143e2f3153bdc0353d65090dfd8f7af4633b89a781e01f4634dd7b0323ea1f38184e697bfc39a1299eaa278c39a2709cde0a346fea53a61f211112450b318d137fe68f6c102085aedabd2b045fab912da5c58d8019239f3a44b18f4fe30c5352e2e2bf030334a1dde1dcd23178636f1e38ec9e42102d8c54df0b94b207e804eacab3edddf89fabda6c8e1bd4e17ae31a57716c679ee8bc7de4412fec3934c6f3e8b4c1d1447dbba0fbc775dd3258f789ca53f1593cadc710fef6fd282bb41c0468ede5ad5b914e4758b4148b0d0c04c75ff6208ca3e79d92de8abafa4ec70ea7a4e454f0759337ce575c4954584e2bb8444c34e823d27b025d25fc9becfb4391df9882452bca0373164cd76e9af316df3f5bb7532e22557b485217254d5ab72ce349620f03758219b259784d4c9f1c7beac3cf08e624742e768b53b3d60ad0b94442c847b84a516a93d9b7d068c44c43980b4c7e2fb0ac964bf05a11fb2adb4f6d938715dde88061b238321afc7e5e84799b02a94baf3f879f89a98ab474ca12085137d639b837ebe069f6dcd8456141d063eb1c032aa392a44d1d58b1e77aba38a280625ab84e3b123507ea7a692c4acd1756c031fa52d637703ee957a993804c13e296cc20c1de55c9b8c032e50afffc51c02e5c12f48383237cdacd005b09243d9fe05e51cea42b77645e5c6f4e48c10e671d216b90a48f0d8f5c1dda553217f5126646d11a62587eb0a4ee0efdaf0d54bc2eb04cd34f5a529b682ce09a34d5acab2c8db58ed6244f7b024e68a14bcd5d7a7daa4dbcf490485cbd38e6f20e839d2b0142b9d766f9527937bb1a737877edf6122ba306bbfb5379243a6b22bdf85dcf3b079691f0e90b28a4259c1c9d8a02afa5b5a661a0f9dac52435e7d22e3591593d37eb2e10f646b51be2d1a96cd4490289ef642ad93eeffd64d7cf830d60dc4a98c768a9bdbf6ec9923062ff04abf19e8b65b95494a9420971018c7e6268b8fb2021a4ddd103976333fa52389643c711a980664e29a8479aa9c4091c2cc2074ce3ac1ab4afa217d39c6a1", + "c22add33457539a957d32dd07ec9110f8cdd2f00ab6ac256b4bc7732f63dd3b867b0ecac262555", + "e71f9a3dd457b4064df1d9055889f105af175a2d10dd7b8729da0d0116c2d9fd", + "7df9824e774c5f86d83cb5d8", + "689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681c4d0d51f9aa42fb20f48ae3f7065664aeff5d8349624a5d79eb0bef3cbb2a1244ee445f560a6bf7a796b2c950a37dfb85ed5be11e8e305e835c9e077e676aa5ce23edb1f74806278548e3fa35059abc2f032289f9bd76043c8dd1352b6131cf34f66bcd0e7f1d13081f5b08ed0c69136f3b7ad8e05e9fe99a9b73624095f96740c1f40074e5d92ffeccdc0f15502082fdfcfc97a800be511c22b875f2832b2b891cb1aad2a17c7bd0be4427a4549404172f7c14d5e425e14498237c26a7813cd8612d048703cb180f1a6194f688b4644304950b078692faec7a2a5c5bbc482f3a7e8ef2825c4c19032a7a79a2908ca9774c6403e6b15625c485f2dd078902aff769dfee2dca9373704bf63ad981b51f61253910fd48c49ef10e3938f35ca8dd491a8e569baef675df30367b093f1088ebe8f876191dc32055481d074e5e47a4bd728efaea9fee3e83d8556255ffb2fa08194bdc66897d97d1557186d5f873169461494a83368ed8065b9a033fa4c2f07f7c60f945b60479e3c89233d58f674c0c6fa5918150bae0c6de2b65a09ccd490e2ad8571745bc37e70982411af667f3e8e9b9f7f75d863e5fef05c1f0d2acc7c86585a83ee32e0a64a9e67e75b80def5bfeb7cffe6e6822efa7a9cf049689b58336b081c039696e0fd3b2a2a6b0d177c9b3f8fe5cbb1c69ea93c1235b2c5b6934f603127eeafc4ed0728161612acdb2ba894a5ac376c4ef1fa8d49b4722379e5cb39752837395c413dd29a2a88c03849b6fb2221fd85ba6d5a50ba7ee9c09ecc5e6dc66afdaa1b021282cadc68f19529eadab809341187d57cfdfe01d0798ab8a94277b9b868612e575bd98f70de80ebe5f57637c511800373262eb5ac3836b03808ca5d5f732f286a5f18a7b7fb8cd8f60e4debe54731c9c524b84694c5469975443964ed28ccff2f4e8e0cf4c60c1c8a092e986cf12fa90a994e4f26ac89fabe8a0d1e27fdc00f1d3d3fdb73bb76809f93ea113e336cb0a5438147e454e262fbb7d656aa1be1288839bc342b48ba7d0e72c85a2e24be1a97dfb2db85b5d850481e62f3b11a28c6407686e73d550b9f1d0f010602e82af26813d2484a8db2da0814782c8404b2865abfbe3c98a07ffb37eea6de7992cad73a9b81ae96a9acb13ba213eb4111d868cc73b0432d2b6c2d7e0e0ca7ccbdce86d01576e1136871a07c76498eae53fb7ebf2e85fb8561d10dfba740400ef4495ece7eb33ce3bce26344eddd88cf1ed8028ec5fe8e71edda54dbdae08f50f8df6295f6d7ef1163f62262a200456a7777d0565d7f5832fcc7ac144b5c3e0ce3e5c9b7f880a54ed5e80662e96b356ff58f2e372b1dc0d73cb8b96c72caa9e5dd312841a8be23f838bc706d893e1a8a48b2c069874c293c41d00226f73f987aec8686046ac4c0c972c991c38b98cabce30e7255dbf16039b95dc7d103fde630b03441b15bd2c214763fece9d6778d1c6354d2c9478c226175c02cb006006715fffc879a6a2b4111f6234ee330d6c84d453c9ffac08efda1f380110a8ef8c2fe44e2ed644cc3e0146b4d02f76586fbb6d69b827be38b9add444e2bac4d7165007cdbf2ea8c4b967fc1bb70c68b229f19bc3f79cb13ee6265264885f04c09a96583f331ed46de3e5dcaf08313ba6053f3d0c1916a0f", + }, + { + "3ab6cbeebc18df951d371e0f3cce2697fb367476bd9d50ca9e668c77636eeb9d24b68be0ce6a75eca194fbde6221755d57e9d3148623de24896a9becd98789fd3d14de0c7e53f81fe7f3fd491472a66b5b797fe19c5d0525c7a111a0289a9e65ae7c712ccf694cb75c490070bca7db17205af9bdb7fee27f9ff41fc78ebd2d3d399e690908b5c064ffc0d5bb67b0d2880bcb45c2ca2741691b6131aa1e5ee758fc50610406216905e13ec049ee92d1f95e16bc283dfd91595ec2037d20ead51d3a362140578a4538c80581b79852b0f6686c1ea66aafffc872024592ec1aaf2650d167a75bace024b261db4ab48b401cf85ec2620dc12a7fc37012af8ac1d6db923d82eee962129bc4ede578782594708357d29118fd10dc6d228bf7e461d2769e556488b776237b6309f3dc2e884cb2df1f43f71c53d389765f805ac053d05fa835e75fab0adb0f13ceeb425637f43556372d728a00fb005f7c5a20cf2b7f776066d60b70b11a848005c6d63dba0c93f139067b39017c997dd6b94c0138c3619e9a6d0e4b8792cb8d58a2ca12ae5d03e7637f2065fbb9e2d1722fd3aaf234488ca157d829e9a3b642458054f3dd58da41d7fba6d2b488a327b776d1aaab1a364c710e755ab22b9cf7abf1eb8949c5ca20c070f275f8959cb00c6d5ab7879003f89f795351a4ef4850e033d929f9a349b9133b2e0bd1cabbdd381594bfa697b845100b96b5fade05db12de040b814ec49489f39f5abd5b37f570cbb516636d5b7378f12872d02d4de20b52ed8ca0b12029a4c084621bbb578b870ca2ea79fd5df1ef8664bfb3b1a1bf038e4ba33f6ccde42c5146470c9dd293aa747d2372db1561617920142ac1d32e4f1fd18e8b9e72b7efb8fefc56d08f00450d23b7e8381849b1385ddcf9310a4850dbd6db7a4992690190655760f557a5027b5ceab3743365ac9041a5c14bed1126c4eca00d7e0a0e0e6f666f64bd1466387150ece5835192149237d5dd25e703e9d3a4f652ae04601d6acf8228e4e86055394c3abc9dccd02f04a60c298d101260b408b2620c137f77e2019fc6eaff1b234c56dfe922b0192656254fe3356143e969f64b7609cbedebcc8cb2b68bcdd9d723b9c14669da6cbfffbca2351de51e87db6afde435ead0017682b8014f91d9734a9ab9b374257273e114a8fffac786d53183ba666d8a67e30c1fe45bb1bdcefb5787afcbad213f8e36e78d30ae1305df96bf450349ade655cccbb17d887f79e00728abb449ea427fd2d0af80e3b5607a74a57dbe5264131f2fc49cb74415974b3d43ff872d4106ff11b680f56be06fdf85ec9dd850b1f77f759337b9a9ce04e611036d3f45743e562abe4b959eba7424a712fcf7c3f3773886aef22f7cf6168efa83cd3ff70b9521cae1b6689b2b8c423d883a007bb138025f2a31db2147691bcb365ac242efe40cd09a746cc501ae0289e80205993b07f86538d486803da14b74fb0db6ebf1c2bb8c36275137d654c1be56c65891cd50f705247d85621fd0d61ade8c05cf4ec15b84e8adbcbe017d7d5743d5e91025e0154a5d9bac7c6b8297490e9c195c5d74e046219c042219817a5c56636c7c4382c6a01d721d88f4b4d20250eb5eae5f3ef481dbf8a3f47a1d51d080bd4cc33f12645c8481e57835b77a85a2d83301172782f22026e69a43376ac4f5b78734c9eb914e6c76c6a12d4127cf195ad030825322a279093cbc40a680355d086a27f3fb7560713b019e7c286d96833dc60590e9a709f2e3c632894668e74ed20e42cd83a23ebea3dc3bcc49d14f8697541780fb2072dee6a5672d0d4e7bdf5cbdacdf5fea9e03c6d9cf0faa1e954172acc26dcd344bb3d9b2e0e6015cc55d19713d795bdb7c21b44b305e69c69fdb7261483f9693f36f45d356462f1ba4498de1c2e8bc3e0a70893acef2006dcd73cf15b265a8a5d4ed792a34a846d8f1d3b9b3bb75f1c5e57a00b36c00203973ef4e2654f6cb29e4445318ed99f0de6ca992281e83ed03feedb66aeed6a461c6f2871ae95343cd9797e58430d5639d7ef5c59c78b29f76a055e18e2b85eff177770c60ca4f2d61e612e617e749b4653e7901b62ba02dcbf50e59219349120ac01e6b8a6e98eb54abd16b921a1ff85898f90fc49a3c8f8f4ae9b0dd32c3e7f2e1527c4feb67a496390f28532f20acc71abb8bb4f71b434104f41e36b705289858a4e8430b8cd9449b0198ca2244923cff1df0f63833373c275572de5a9a77b23e5ff54aebce8e86d02651f26ae32e69001e5f3951967579ebe8574682cef8c12dee0b18bc999f8cc0f07e2ad3ac94d3caf30c1c8a8295756aecbbecbbb4ade8a2b8015e52a0eb1290693c6316d036e0c443fc4ec591c32f7e7f1b3933c921d5812233d3c21ee5528822b59ef2ec7eb62f7b04f40cc8238a473ec37a07e54f8907825ccaa1421c2964d2c756be450dedc011e1cdd9045720421b9a4a00e9d3076c2fd10d71ee36d5c0fd2c7e42396b034a4cd0245027449242dfdc42c8af4a34df1b4150097726c9745247b78bb2bad5fe8af94eb13ee1f41dbd36e56d801a4c9c5b9ca5d3c26f4714b6fe9f69b87567426eb6f4ac97e8c9541eafc19fc90d3b24aae0f76c4f3f81063d206ff695d638048c2cb023147a78332939d2f2470d16f1ed0e5d3d4dde438affb2809488b99815e54938fac3b02deceaffde310cf422f9027f364f5e79da5d2b5af1b4138ac9f9d301f396b220829c1f60cd2b54ef24576e5ba6ccd4802900db1bb4eea57de7787eda0e30fa90cc19f099444488699bf7c442c398c2ed989d084c8cadc97325484e337848c34562b3dea6f7670f935ed3d5216c970e04351651c1c31a34e862821bdbcbde202d91fed38965e31cc3b6f1e52288f327bd0a787ecd92b3b6f535d1d000b0f02d41ee01ca54e4e6179ad7fcbd60f0e41dfa5c9cc7ee4f7de3844fb385ffa3b24092b30be697f1fd32c9faef29ead346e42fe2ab1d312901b678b43b7758edb7eaa1c2d038b4cd6a7dc759a6b12cec955bcf4179006a7ab6e22ef15986df107080d340b8870e2304d57caa87a9961c04655d7d66c7f71ca9260e02aced131d6de65d256d6b487141c51bc86eb1e4721742f07d09e799b30da7b5ba94c8d701ae34271ba06f8ce134a7a9a2598d1570cf05edd9ec868cfa2e41b4c20a8bc4b8bfebd45f5a60408f08e931617746d1464bbe1f3844ab3272ede635f771f9af30e483903ee4d0cdecbaff4d31451e7791dc97c92042fb932fe1c82652c1d682a55912e33de3b1299db076cef594458670dc4f911f4a244e2bec757dad4b0052a41235e2f5e60b929682608c16a61287826218a1ac3cf0d8286555d5b0552754685c365d4342f0d9c45065daf6786179da791a86b50a5edd6fb4b21f09d9747136aacf79ecbf52b00fb88b0630ec7f0a6699901ba4eff913a3ab33ac85a71ebb51ed343eac86eebb3e79c16e664078ccda09e77ef8e0919b8cc447116b65ccbd5200fbfe86e9bac5637b33c9bcac9596b57c14ad5da548e96a8ffad5f5c69247c68d464c770011da7b45a337f138cda6b4e15311879bfaf12af4c61fba596780e6adcd5dadde372823da6014122dbac70f0dd896a8d387d3c74df282a659028d06cfeab3ae22dcd1fc3ce60f69a0d678aeae0e5681952949e31ccb8975cd167c9d012f4b230b1c1f47022eb1a3042951b338a734cdd17db0ed483a621650deb3510efe74191a94611dc212c0c73b117a73b8ae41892cf176742bd98a7cb73dcdc53b42df56d640739852335f8d44d901fc884286b433fc285fd5b3db8df0a8522cea3182c071f559c328b8516c9252681a94eecec7ebf626c0a9014d9aaaa0c694d14855433dae06656657d1f8a939123d28e00513d72bd3802d211ad7c1e06b9228c0d5656edccad5339bcdddd5e01afdc01f10974be3187804324fc513ba583b7b2da1e9096bbe3d078c1adc6c34d92c54e9c49fccdc17d10e66962120ee5d9b1cfe852569436270cf7c4c3bb12568050e2ca4db08bbac16214238413195dd4d936272fca5d56d7551b9b002df1807ed44abc84c66746387b79bc9e830a635c308a7bfad7c2c22cee6d3d0c5ebd8b230837b7ceaefdf71a67a3a8eaae0c36de86b2d96e759b8b53f8b8604775eb7a7e13223cb21033dc87d775628581a954085c2d66c1c8f225b1aa86091061738e7495cb36a5ff032dc678904bfa39a00285cd6947865b6d4805e3411644b4a4c94a6fffe05ef31e156bae6165d801685dcec195552d029d22e5de393a82ddf3cd3de3ad8cd6bba2325a03982204f07fc3c21518ef17a601fd743b27f7191bb446ff61d3c61d7608777990997e911932532e5b3235f13423756f5b6c786720cf6682932c90092", + "50772c5a0e156ba13a9d86edc0e600021d56f7d31e7e452a74ad53a6775339c7ca6521d87a8c79b42900a1e9e6a1ec03f7e3d615611c3fd5c9927c40e5b508af1a298794b60148df01e9c9e78ab5ea8198c097fadcd6cfa6694be64e00eefe1a1885aece86f6ad87df766e692b58ebc41982bef5", + "93a2561a9904a1787a10e2a668cd6a814f2877a7b512698e94796805875c8d1a", + "588d9bc1d98210d9700ef488", + "165d8c9eabcd5e93e6eff7be122c8c242e1a7f284790c93324f924efabcec4a4ce48262011b7360c2833143d645ff295453853c92f0c48c6dfc2af7ec58d9bec0d13239c7e5593cdb39d49376c6341263df80c0ed2ed79fe9899d0c07de93f6ea95a5dfd307e49bdb5672b158a4df623ee86d54cd1a0fa9a60ce39d1f5f4b6b0ce9daf2a61a907cff3bdd3f29156ac439638e0910d728843ae17ea7368814ad7734732e7c023d4954e1cd5fd19fc9b76e9bb84b61dd4371478917757b14b366b4bfab4eab0d9de746088ad43d8742e2b9e58faff15c2eff084df5f4316111d5dd7d23cc0b1ee1000253f26cd260aa636f03f64a8342e531ca1515b3beecc3ee07a29184988325322d5c09754c278231f92c0d980adc919d4fccf4a1da1d37f1ddb58ca997d6d700946199fa007c43853b6caf5f8049233584087fb23c3952414ac487e452f0c3898486d04e5b008b843122501f9c8a294da9159a04119ad5c8e9f5c211411e34559d3a7bcf2ac10e0174f94f3f2968c80ebdf4498de172884dbdad0acc3a887f9bfe896a6004d54cc424567d53f1198ba33c56aa460edc6af0e437b34322c1144854bafb2434f00703c1992dbad0ceaa0616aec60a380676ca11558cece57a936959d6c2ffe0647eeffd37524fbafa9691f31499701b202d9dc9980e79ea517089eced779aa45b522c9ad193e63ea8b64e8a942f630d44370f23b7e9acfedac51dd9f139f8806b09a8fbbabc76fec3c3721fad5087a6d41f93973af8d787d8bc74a3122d99ea14e2f30a3c90be4b695c8b269784eefafa52d6a79e785eb47a23d72f037ca572b7029d2f37baabce57658119fb02c5b659e3aadfe0052f1cc3c0afc6fe4624533d9700388713945c20c1d175da53738fc73f48fe57fef8305e796b474b6f8d3fc5040042373a13384237d95bb045ce0c20934a964a8372acedfd6e559aa84180a86311a3996cc17bf7f73e5d85d4db2529989e5836edad490aaa5f56d17326825aa20608fd209903335de4b36b79f68b6a52194f6ea8ce42570533df650e65b50c367f69b9f08c32b3ce3e75318106b8b2c6b6d09369c781fbf2aaa35053af215b621f833814ec4778ac683de0dc22c418b077a917a6e405ccbde9f72ed523aa696be1a6f247b096b9235217bcf19b88d43178cce5a7d82335fccb4c079e00280bfd272b9f16ffefa7fea38d09dfb2e4874553b135052595812aed3fa15096abf1eebf9abd598289e0d156974de4c2654c60825d42b662ca7439816d9d3a0255f40a4965504f643f029da535d4b109e8658ec570e99859382ca0ede0b0495d508c63c7f1eff3f648c60e9b773590cc663a751178ba7603a11985ff519056661b9460c1aabc30e83bb0073a927682a06d1b8050c345f7920c1a37546d79587fae2a92c803a986248f90547f0b6c0ad0552d8260d2a0dc3cc76d092ab76b8c12f05dcf141167a6ea300bc23227933396ef6fe9d51a1ba5a754485950f06cfa6964db2d0fd1d4393cc36f0592fca25ac1a6aacda2a32f548ed20287e3d291661848a62d41504e4fcb1cd1785617fa5786712b3005f1a1041733df6cf838ea3ea0b93685889bc6b2857d80a9bc0e7a66f7fb3d805770402f049889311fc112dccc72a25bd127777fd87bf5ab56d39bfe6be2b45a8301c2f324dcc50b27540200d522c24941701f7293b8877ac84cf35638507c7d912a3a94e4384b68c507412df65d0c4ca8ec2da704bd4483eb2e0d13b68c0c2b68c106a55b9710ad0a1436d655a3cf3c419d5e6f027ddf5dcfc896a5b316a7dae9290a7bf81aed539a647c8c98e24e7ed6a4f7f00a11134ca715e5826625c250500f8f16b40de048b095b5dd08268407f58a91c86c36ca5a2bf4f8fc682adf1bf601da24414c74956e1a8fd2888b5260e980c32f6678a4dc4ff73220c22593d23144b84c2ff56920342248876d15ea54fc100c09a81b802dd15f030bda9aa08727ea49e34f0ca8693e0a06d0af06ea7ceddbf0584adfdebeb20510bbac683451d9f84cf0f4e85c34d979e550e07e7f414d6f1011cb3dc28d0df6d4aac113f2d5b04e4486ee2cdcd4157dafcbbd55e8330a7176d1b231d9f47a63da9ee30fec6cc2c5aba3a8c6154f79997af89d972743255355647235ee939f4f305ec655271e0cd562ff6f401b86dd5826c769298445108ad0d9e13c504551f74c507436911331db60ef0ea99dc259b13cfcb0596fa9b3c95cd7fc3b1611e3b012b6719afbcee7548939676dffc372276aecd08e6a14251407cf995266545427d49ae5ab245cd5d534c52542fc71b3973f0b766f3d234c8baaec8b74eaa8ba90abe160b4504769d02e08d7af4e7ecc167780c619cefa58865169b674b2b1e10d82f6560ba0be41a781f4afa46bd722566d941a8e6f87e4a5c03d89685a22a3470354f2922e2915f9d46288a5e8896ed13617dce694a595e379f25fe621dde8ba73d865976950954e5bd07db147a0fb74f87cb06aba49b073942b82fab33a878651df73df2721ef800b658bdc6c359d396f684598e93f38e79639b8736b02dfcc124fb9fc199c35f2fa1d0dc39939c57286e58a7deed7b6c76e02b99a14d9bbf11f65d8eb7fa096fe4baf0f78cb34736499a0ca550f10d7edc8909dc34b039e3abdf1aa67a51d37a2eaf4c07022897d4d8355d3325bcf392d91d02d462488ead90b366e9645b956c3802e4249d34b5b2b2484a1dec15a9477821df6bef5e1626ec5ee9832fc3bd0b63a3c4100d32fac3e9085f0b5ba43123f54beaa7ccbe6ba68231649f35a28acfcbbf97dea2d6cfd96025032b3950ec8437108d0f07baf1bc89e3afbc2cdbb5031d3cd9e20b19018adda466382059229e4c8c54b455eda4280bde43b36afa96e146e408c7104523d5f565d22ef86d4c7cbf9c6e0d0b30e37b37feb9332939c642eacfe19d0dae1259d3267635051ea5f9b518dd74786e45fb8bdf72cbe3753bd50bea2a961b49cc0e2d589e77fd25ebd962463fc728b1d288c38a79a182b124d345872afbcfe792d259e7e5334311244edc75d05f9a12eadb61fd3ff79fe8c097eb01a4ac1f0c339d3be74be3d96b0b6a15e8868d043a0f2007ee8aa51756d78b7a78ad90fd9a26afbcb51fdc20ed7a3947f715c833e363bb87504d8efc9f8b93a993e2e26430f79f3cce203b09093c9b456b1967212eb0db4f7688d4dccd4a523866f75c9d9e7ce07825ae34399c5607a60b771866a647b6d5e1e20795ca906e451f367d8c40ffe79a2cecfe7aa47a402f8d49be9084661c96ebb11f1b48e7e8abd2978ee626f962e98f99db4eb3c6a52aa2bb2e62194120ce1e773b9db784e8c9b5adcfb70e3bd5717293eebf014e9872c5c1bdf3fb296cb88eab5e97a5ac320092033b49f37d840dac23021c19ab2a89190f3c8dde927f6e6b41874bf71ba7747a616682bd5b3f17a1dad40f4993a1b186ce4f44afb4e36af7715450bac62cb1527eb8db1d87bbc4d9c99415d16660e48efd911e02f5777a77e72733af3c3f5315dd0c785d5212b79c46c3bccd74582c57cfac0d50fc0c85370476913f9d8e8e10d0f6602f2271994972de49ab1a91728713c3cfcedb0e61c270b5fb331a980965bcfe10b41251a0f7915d5943f49fb139626f1c424524f2fba3a407e77dd7513669894fd09fff4185fbb997b4e4677f6ea0b52892f013f1691bdb38eee9307a565e396bab484d91cea9268f49aed29e319b0add900b6a75f7461db5486aaf5366f98df05674361308931de753c70777de73337a996f6d4b0e06d63a69849ba7533bb0e446f062edbd6250e61a49f4120f84efc1cf74c1bd30cc61a2d719fa76991dab119fc814a7c56f48bd584c7935679c53bb0ac78905b5d961fcd89a4b567d17a5182651cb07146aa9a94972ce613e8ff9c878a8433c0244052f09980a52d800e97ba65e8ac186862def58c72b9feec91266e26aa5075b3337c7bb8716b3acafe666ffe2df32b78f9995661d3ba28f8a8780436aae1da2a3e6a0a16dc562b8d5df6f68391aab73a10508e0f55208f974a0505f0fc0d8a55049a7b631fc94fab91459ae1f199527362695b41972e50faee34c5cca9e35e8682099f5e9652f88cfe9fa990ff2154c89c1c2a4ed6bb8a889fecfdf048ee0aae7798c55d6cdfd062cbca97ca289578c832d658ceaf26faba54c9c3ee9eb5bac80698c1441b9cba287f749a5e30d5cc715a01c89353ceab0974ae77fecc1d2dfb31a5101783cbc002c73cd155dfd14685c2f9acc170dc437c649b6b4720b676848a7f9b56cc4787eabe72f6e3f2aed776f9bb1432fba93a63bfa44fbcfcb6eaa9ef4b79b32bdbd68cddbb9897cf5a02c6f99fc765790092edf0d5bca7c55cf232a03fbb6f3eae09b12e09a9b49a538e0589394700d16ebd3", + }, + { + "3497e8d61062e6f2084ebf72d00e9a47b550591edeee9746f31ea28039a1646d384c4348af293ab778f92a4807c48fbd14e8dbf3d67339c991dc4aca7dae38b5fb7bfeaaa538611d328b653950f4f664dcd257b345917cd66dc6a1ea75d99f70549d1af9d67b1608077b41576f38bb4c0a13ff4fa47b251142c6fbb79f9a27f43841ed0ebc0416c37f571aef8fd63b99e93ae88db50e9ef7d499ae7433d5686b165579d3598f96d9e7b1c876870310703df8fdf2069beadb34984f676eb7d3840c4c5766dcee3fc39f0739260a499647429339482e232362bc72c92a299cae36e9069cc5f4db8893e2c1b9ec0b4f334de26c951090b9724c2b3b7655d8248bc12a27861e020eb1e4cf6ad0dab903279b6fbdabff761d4ba159c1f631e681f210a8782faa86e08e554b5e30046157a0d1144bd08a691c2cc2dd22f3c3a4e5d44c5d03f7e3e385382ee4683345c0d316d41ee75f87038b49e0ad3ca45121789e7e7b95615e1a9a8dfe02c044c2935a97b141f639448182252ebfc980e0411e5fbcb3c01acd5aa7cc5d67101ffa6ab6acacace5f02d67155c26dedc071ffa66dbad26f67a819d46de0556fdffc1b4ab6d60905d8ef873ea1e51c62571c08b4c6db242e733e02e11e5840ee445c290b2232010b118839b37d4615c4521e8928e9ad475cdb4a3de9928ec7e6daf0e20d22e308347b31e7e877fdacda0c25f2e5c33a329e84707816ff4ffdca30dfc753c2cf883df16016795db34359e9363fac60624ae4d2b30bc1f2f99c23d953779c22ffca145fd08dad83c0f76cf727196799544c6c07483e0a41ca2e1b1da5a730956154f531d292b5a39a229ab13bf24a804eb68786e481c8aebfd3bc557afceadc41d00e1472c3b80ce652be1245089283bf1a1a93abd3325bb6eea121db8c0e1d6c0c31decfe9dba63c89b881824b0531651fc500f2f75ca9e5fdcbb179c9ded5d600a495ea704c2709f4a88c4fadcda4cd82a5b089f25a6fe0161159efe03fb5e0d44bdb5487f25e8c9adacc389860f62b06a6a4f8f104d9171622f70652ace736e8b28b70a4d9fd3fa4b9784d1a6e6811150d0a0601d31d17f6041e58a1058f99b80b0a6cd4f79c79a104b6bb731ecc881bc68e1d99ab358faf43d8504957ea0152e46e27dbfaa17d0f58287276e4fa82ab78a03513d5b4c3199d1362e4fd6447d1c26fadbd011abc69332ed0181952b391f2e8a5c89d68e22a7c451f69a9573b6bb6d918c7e3d52116f3f12f1d43d2af46bb450f58bde1732a268293cfd9cf2b90a844588c1979a30d6ac21aaea4b9e5500ef4a8bcd62bd70cae6acc8839f818d23c615e45daf14335c36dd46817c9b816be60c3848caa812b055da33f45bc01721d6fb7e850fb1e1458f27c70bc34876a955aef11f5703cfacde03a039c3b75b99b2d91fc18b00071a28ce25eb169b946b49858aa0885a4c665deca020a3fbba55d4d9175fd91e7901ec9eec0239806e8305f8238e5270f4af5c94d0008f8a5564636cc33c8a3d3e76db2a7915abe798b0dfbb3e322b33e188c7b188573bddbb9e4a7edbd4bb194b9743c4aceeab449f8affddbc2b109eb3d84f3b2f8b18ea2962680437241d82bb6146674ff1abee7baacc38d5dcd688b425c3e3b0dccdda3e36de755afcf7155d3d7cac2e279baad167e2a743b82ff8ddf3db8ecfa9680ddf468339427a4e9fb8ca4ce6f1e790c24e7269912a9989088c65965b0efe68ed44eb26876674261e3e72042f5995f1a7075b3932f4c23a8027d0db35ce4322122f489995bcc0b3fa32b7298c4c1b3354766c866a2fc0ea5690c58c5e08ae7037f70accb3ca7faefc37d78883f2bcd768285dd2571dbcaead813a0b8ae87cc1df868e93500d414c4418d5c80b919f73b9fd46111a02bfc884f9d30ee14fcfc1d55d54256b9572afad4777b8d8172c911472a22e7461f6f85aca063c19d6fdef3351149ee6864e93cdc54ca5dc7837f0ead91f5e3b155795df5dd1f933cee8671ffc05058353995019e5f6f55d2de6470605a5411afcd7fa5aa8f38d77dbf496d7fa9c5a4d35ab661aa15c77ce42bed44763166160ed5bba954e470c293ca301363f5b837406ea8ea746057588c34acf266030864d8c40e2da88ef04c49205fad1607d456767d30eadd884359bce04c12e35487bc1885d9b104c9fd4dea4ceaf054cf46cb3c77a619ffe963acc9bfcfad0447591ccd32cdd1fccb1fe7080ad75cca2e17f695ce0095a774327123f21e2839773506a9f2d896bde87dc5e35512ad733aa408f8a49e9018d1013cc32f550c968a03308cdbc73ab444f0a79a13450d4de906369da4c6a675d7e338f738358dc238be4f047579c8ba7a60448da541cb9e57f22bfcb8c26280a59b77edd0f5a009a3ef1e2958d6d3c3372840dc6a0c6ab1fe86aeb7590137feacbfdc7da57c77595b8572b45c4677836ec86fd8c4ca8ac351397aaa3aa298d752754507e1cc514d41c3f1ae0a692179218141f65bccb9acf6244730c6d00829455d21371972745b3665f930cf2aa9f0abebe6f7b89094aeb4dbdf7bbbe794f134b6284e289c995ef2929fc1bd39b259259950de29e57cdec15c4a7d33ef6e689596a6ce23301d25c2ace77fe699d90c2329da4d0f471bc093563dc735ac2fdb32c6995606a67bc953534939ed1236003c004d3b47590beabf39a1e4d5d1b00898496e9effda68433da17d1ab3a32aefa3681aeac116c5705077552649153ed15e9d704e67d8819579feb02d91db0d3533182ff43ee5648f5cc9a595ded4772d61e77bd9bffd6f29fc1f478dea44c32d5ce3118bc8860b254fb0bb1e85223bf709a7c0b9a52fd3914f1b1f295fd246bcb568388dee43a32df45e3c798068608a102143b5511746903255b98238003eed68776b46bb0e64af6c9118ecf9896709aaaabefbc1f58bf45b45768345b560ae2cdbe4d7da497736da8013c4098addb4258cafe7823bdbdd715250b707b155248d39fc6773639e4de3b201fd3cdfa1526c4149ee7d15bbee680c956fbdea844b1470a287d430c5c7e2d7b51fa756720397bbe214c19df3399a989958732d93979e361f7266e53a59bcef695435db67cd8749d258e7d582726e1bcad1395e68d7848849fb6d74451a53ae6e8989c64701102959f7fedc6a5cf8352e218396f9181f33037ca74886fae6e57460bbcb71cbe4cbb3d3a81e2090434eb1d6d5baeee4ede251952ad88001ce047279cfe435a4afe97847f798d84ad79a11bd44f09222d2f3b7fdcc47ff8a4c61f40c4629a0f603193e0aa2164579a05726e547c9081abcc0087907f8034469f740a020e19623fad42e9cea64068abb3d6ff2f6680da328061c200e1f646816a5083786ae5b71728a0e5cee14d7a942379c389fa9dbc7afe7e7ae075c061df11e4587bc90f92f1b077c091c43a25e7b3e870ad852c2883aba2632063c4ff74a857ef7267816317f823a8bc5dcda311b513be3a40e6bdeb89210bece50a608e624f00c9d063e0c8878884e45527f50a3ab4447a9a01652322700f087b6f96ddbe96a68ef98656800eda6563015a6d3c0eb1b6a9b21cccd58cdcdd074b73e40a098a980210ef831ec9e881cb42ee07519fbdfa52d9c62766a2046dee7752f880dc9082ed7f050b49ed8d14307b1b811bd87b6db2419418e49885d20fd7ca8fb45a11a1da17ac2304393734b552b5d02a303ddc72d1f456697a287851f207054c18a6262f5349348c806841d21e11fd4e4ed9c01fce1688483e009930079f7d2045a34f98ed83256dec66400a783d58c61619e6e42f6e2c6e6fc69e76651b96aabfe643ac69681955ce595f4696b80dadd1f3910061be6ed0840d47e928dd93e7c3d6932d3ead820d06e2539d9a604a6b53db6bb599da851de7cc060faa9af76d708a9aaf371dbc3eff0fdb99702504c3006f789a49feb730cabe40745837e2c8c17c77f999333798431231b337357637a5efd1eeed891fb7475f2c9f960e67578adf50241287bc5599ee08d0237f08c86ed9b75b62d612a9353e48cb4cb022d78f73fba1fab7f794a5ff64c97e6c91ec464847a81e5a5253989a1ee54a41bcd9b4b77bae6e72421471a7ddf0136edc59b72402d57e542916ee47fb3988b7123c6e8debddff2df171d4ce61e83c3d41f36143c9df97f2f68639f1bfc2a9d1fe175fe9f45e17e5cfebb330d3f06e15e3cf58acaff09ea576d896359a3f06985765824bc499319384e4c458d4326db801c564b0b503552bdbec60752b670d82cc8fce9028ff24ade3e805b81a72701b37d4ccedd72118b20d792739e035bbacc4893ded88619a6c499f246311947e48684a35406c4ef279c71ab2a74f6e5313f7900080f19aec3a39109d4aa41c930c66c84cd2163f4cdd59fe84a86cd8bb6468bce45a56d09490e032da844e6d90b436dd874c1cd32a75d1ae1d3e86d8a2ef948649eb56dd7b360f55ba5dc34a12f9279945436c6fb83d1ed57ba4ae1d9342a3dc2df9baa82fc9fee927c13439ba5bd2ff9f3e6f577b8d2df731db14c51db8a14bb15bf3e125f1ca4cb2fe856c5a576cf995db5010687d0799581c5e76d400c1855bb46680a631cc582f51c589a831", + "823d0cd34e7450550da9716c1f456ce0cbc79431483a6214939266581b0e899e4c95719a09c1ef166a618289a6ee6971b6fea3fe380512cb977823b387ac51d341c26d4a835c61eebde37764d2e1d588df7886177e98e3151106c898b3196bf4dbd83f5f", + "a4639c22fc7f370d8500a53819102df5e86c541c0ca10e8f6564e50b90c28f34", + "34a04df283c45655a52bdd84", + "cd8d1b2e5f65ddb3c0da8f12096134da22ad4d541444964077610aafc1f77f8da5ffc75bee807541cb6eb0526e78d57fd88fa9d9608914cf391ae7ccb8eedb0aa711889f9b6192601163b271c90df5d69fef487b6c05a24fc667469cf16cbd5afd58fc830119fc9f61b26dd50a96ed84c96825a615a3aee84ea4c950152323b20884346b25c9e2a6be3a93505ba059fbb114c224bed8f05f54eab76b2c9c23a0fd942eef9696ff67484b542c8347f1b1fd7df7242872b3528c9e45030447b2bc85eaf191963291e4223b75778335e5f1256618ff87bbd68b5a9e5cbd2ca1dc8aff4625c834edf8fb0d879b1f75ba9b85895a6bb4d7569a41bb3be6cdd020065bcc69b44a8fa335d9418ea2d090d8061e042e8e1a6ac03a6d5525079f14274079734ed42c5c9ab9986f0fee6bc9ee6c485e233e9b4d6de70664902529a135a5675ae129353eb2c00b73f226e84fe8c594272d6eceaca28b6da30492c92074250ec80beddb7208f9b5418944305b0864009b3bbb3dfbfb4cc2bba3313f8f7c6c19860f1dc0f5d7aa06e3b551adfc63dddac980a79d72bd2225d54a87a93717291c7b78bdfc5521f7f3239d5564fe9c9559dfefe76b77efc2e75991f31a0134529a6611ab9ef076491f2d2d81ffc5774ba8f8009dd7e5881e09ddf5116fcb5a44e576aef6cea91ebf52c56c742049639392cfb8b280dc2229252e04d8d394ffafa539290acdd8118656e7e1a4f7bfc0bb689448379e8cedff7590a09a3f5a29bf819fd87297b96ca07431a29a07ae126eb9d65e21824c16707db89868e127f17614a536de6ed268b1600a8b02aac2bca54a09b7cccf8e184448df334f95b9f0221187d56da7bd422f09b4d94228098b563df53414a5a86728962a2ea63023d8c3f03847b36db7cd189ccfef3e623b14842b8cccb18b4f80f01b32a4cec48f3009b98ffa25dbad76089c8700e90848da74aeca81d01f4dab2b7e844a3e48bef21f33c92734b821ab382bdf6d0b1048a9866e676b78ac9398678ff626d5c173a15a0a7514b2544405dd54eccaa2791605c87d7117bc9f8c0ad84623a9d3a2b1733304b492d4dec38f7981db9361b03a2837a95fe937976c7f4341a802dbf583366fbe368a3af3f92618046bb55696cf7af1f465a5a57ec5908621f431ffc762f35abe892f772a60a3f75ad8401321f67981e90083fdd1cce40903ce56a629120d6e13c8871523c4d848664331966298c8b31a5bc8174a8c14f61cbe98ae7ee3e90bc832b04318864d19a9b8b6d49a260f42bb120cef9afbe704faecf0f428d917ead9f020f5e9d772bc8f29600f8a7623d8971c1e3c5f1a3b094191e497bd70f85de124137cc4b9fe0617cb73cd44b89aada072625e25976e7aaa5a8fe9d9e3f32db47d1565aaef0e84d256bfce6aedfa1a2dce5a94976a2bb9a0da95941fb7ed444990b0e0e87627e35f3235a998019650a5e5cae804ecab8cf729a5c712f1e7d17486082dd50cbeb2ee1b0be6a7bf08a66ab3cf1fe9f49c7083f5b8ad183f32fb35fb8a41230e4041bcf0e5ef54bc3d21ecc1fceb08d95d745a997e8f2fc3c0f6b1b6c1c02e03ff02ae0d879d13eedd42d9f9949ca7ebb785764162ceb6c6f9944dcb3927b2f4eab23ab566b2b2bcc0c7d77b82579e88203602264064ce98b5b1ed992c1bb13edce579ae7f5e11697b493749f308b33e47512533350df5c07c3dadff656197884f359cdfcb736d29231aea1524b56e06c92f5a98ea663543f67e44003f5b41907a951dd792468c84c5e0e1b46149a5c9751295e153990b78c0cc712889a21b299b0315150dc50aa3b4f7fb0079ddd39d263a754b1dcc595c76ea9fea6c120384afb38d4bd40491c4689b1afc9dd096dd0327c84802bda6bb6b7a8830bc6c06b308ae9665a8666a5551ec954eb72adb827ef38f036c51698a28c92dc1c9e25c267532da2c04c1bf27f5b683ac750c3ef53a8460dc186331549bf82868f9327422c09afe1cd15e161bc41a70cab2f973efcfc8f01a380b86a432e1ae540e09d404d93d22a20dd5f685a52f0acb863dadea236288b1714700f23d1c19e40e219e8ed21f6a393e541abba850ffbbd4030e5f6567b7202fb66d86cc2a0beabd495814f6a50690e8d74cb8b093e4d43261fff80e7a67ca06dfe808899cbef84c09ece01414baac740cbe4c656b17991868e2a136f4785a0de311aeb18cc95ed33fbece22aaed8cc1e47f58cf6c09a6f92c96f37d2d2485b369093506f5e9f8534f8569655277d0399ddd3d33861bd40c71ac53a44d1981cd744d79202322d47a0228356c0e27efa2ff1009cf2a416fb6e8844eb76b8077a4a3961ff193e1c95b222e72688ba48be82ec5da498e58861ea613782ed1ab50a95b5cc236834af98e61528ab18453c20ff978551b81e1bcc0ff4b7092bdd9ab0b946b7324b7361ef05e1f7d7f6a336281b4bb2c671a95a6ab84be6bef1b9c8c3d2536edb8d79b40637e16d7281ec5243016232d7c9fc07ed9dfcf555055d8ae65f12ad150da81f62f2e1e82b3adacf6d623ee4759ad61a09038905bcf1dbbab671dd28fc1d10a0b7eaaef73a5862ab449bd84c8698d061e79fbe52a86739ba945a01353e0f3916667bd7b4356cc65451c7003927f2aa738d98245760550156dda529be741ce3ae1afdea0de35ada26ac241fcb5d518e6ee7f9930baf88bacf8bdaccbecfdb920f3b26285439912a8902ae029b07f28c1dbcfde780cd2bee6c6e5f4520c5c7ff3ab5448ec86cfb270c39586f80041f3764b5dc77dc5ced0695c89671cf90ed34c4067b4bd938b1493c7902dd94be824810a00bbde4915d138fcc7584790bb0b6682fc0799cd415441ac90c1caa008c7fde3ab4a3aae478c64991ebe07e6c4587d3046c9ebb8e125e795f0be9266bcee5a4e4355a2830c5b34e583b0355b34b89c08011db6f6b8371de003074704e8cdda37ce42c7e395b6a37bae3dfbe67bcfd1f125c9a262d56883ddc028773988270aa30c6dd326cbffee589f38286533e1d5c9486011170be591beab5e0ce98837cf91f0a58d69d872e364aa88daf9cfa71bad167129420282d99ed5884a1276dfffb2c4100c74a8b863b063c07937f2e9c12523deac4ea16178863d975e3a5be5efb5ffbea994d07f7ddc5326bed1f5c9415c1d4ee1667e3a581499bb573595158636ad94d84f7c6e4b8efc2b141f2bfab7932a050fd88a8c7b21877cddd488543db5b11138cc808e1248b6e2ef492faa8a32f9d93e3c060b5cec10f03794248f9662ed8c283a8e0eb493824e2750ec75b3b1292d80ce002083a3c64cc487afc31b20f84a778f386b012ef7bef46e638d0f1cd75487ea46e05621d608482637b3e642a9a2c5371bead4386eff968b3e007fc263086d8a930dc76a8431a4e6907ae35c7b3291075d1c723f02e4895714803c0e97d65b04c0f27d01d5d68001bdb3bbd44dfee1eff1754fe8c182cd9bc6ee273beb2a444ca1766f747d86f36cd8cef6eb1dafe0c38b9327a8cac6e83e076099188f02721cc4de3d940c3ef19d9b067be07b890c798a79ee8c44d96c5e05ee5d5202d941a674378386233a83bc85134dc8c46a7531b2b952fb277d8089cfb13e882bcf7545f0605271fe38bf4754f98dfa13fe6b635a62bcf962553882a8f28a9a5fc0b3f85509b702d4a7555d40c4f7d10fbe80d48b4826995fda7d15f14aa9b95fc6526101cf09c97fd74baca6bd26b4fce8a57b0726e0f68118969ec067e9ca39b2ba59fb0d78eb5cec5b872613b1b76763b3217d859bd6d991bbb5448bd4e49dd6597ddec9e46afb3f71d254aba828c91de51904139ab19138e36e6996a207da80323d96077c97a3e8994296376d4dcb602f1e77371efe8b020b7b6f6f7bd2bd733ad9c06c45b77a2893d73b4a8a57707969af74ba06b2fe7d4079bcad1cfeb3689ab95c8b1215fe0a855eb431f67df4ea589dadbf055086924e42cb142c9031e25b81e8e1167a54008ba1ad7fec6794f203b27f3092dd72bb766c9653a72b2e25c965f53487cf3baf74eb7742702380303af8c0a61cca3eec78d4b709e35e2cc5bd586263d9f56fc12454547bc6165e3f070ce7b2bcace5c8cbf52f987568dd90237cf190dabd4ee7a80494692a5379b013611f4eebeef8e1ab9a9c5ba61926095545e19c3dd61b7b404230729aff7d82b6bbbed6b4a926f6e49189e3bccb578fcb3537951fe9c78ac842350ddd80133275ac0bce3a669183776fee8288f874d29190b452d65bb7d8edfedc6fa0ae147102b92041af6dd8a566932e016763b60a5b9b1e3667f228cab075f966d1c525ac19d12046c6409345799adfd7154b6d8b51eeb1eab3a132ac6a2e08acd1a34bbbbdd019195af9f8a93c6ed5463765173e669cb0d42b6cffee1a4b45987853d43c02f920819f45a4fe0905d8c65aca182b4bf56fa0dc51cb53c642fef003d92c13ef4bc1bac571cbe2ba3673a49694f6311b7dfc17a4069759177930b179748d4403c7259e10a5d221cd0a6b745966e598f894e607b779dd5289fbdae0b4348141ad373a62c76aa454b35b39a7be875598bb30007fc300606ee2537cfcd7c22b6149880fb3cd8eb53054d698a0d20f26a5c3ce468255737a68706784", + }, + { + "5622aa8d2f308dd468a7e4959ccc01f0e80d91f79df65b8201eb44911f6abc758c6703bb97908fff377395d33f96c328a4541f414b7ac34c6607dd85729afbfe01feba988e4997c6bd2c99fcc35d2467b143a8fcbe6b49247226a9e4c0a4e3c1a29d5931e6f1f7a31d90a0e0edc4479f08ef9bc65ae4eacd0b93b1cb38948dda31e60b18d702bbf5935bd580201d1f280cbbee679fd834aa6be576a37a037eabe989c3c18c7fb61fda8b9ffaa8bf22b57a101c19e850c454353af7af3d755b26ff1ee78b9d9daa78294972d108958682a5a29c8ef260e2289ad9d7d74f32fd4e51e5d9ee828366abccd97dd56e035713a6f3a1985383c0ed5d98c4accac2fa1ba7d30a295670d5224952f7b7554fcbfb426c9496f054834dec48f9b70af3d2b1c6dcda1c4daf3e9601364e57851952c785e65d753be1c22729bbde33aeb1e4748dbe90da6ecf716f05bfc68ad819515dffafd33a909562b95140ecfff1d0747f8e0459fcd3ca6cd8893262614bb4bf4b639285f327e7ac782898781968ec98f6f0f2f3c4bc5f9c4691ffa7ddb3662816f8ad092095b598bd4d10d6b5fc6fabed619eb11dfd4d638f4c0b6cff7194156a411e8ad6d3229320336ad52fd9811c3a1fcd571d1bbbac67c6186737ac7ca1ed9b2bc46e4e578f81c164b09ae5cdd4059a2c22b5e7ce1dade684e49200867f9bb1430aff9b99805cfd31f7e3fecbe898f70a4eded86b8bbeef7050eff6cf8ba71395a7ae2e270a2b58010e56cdf6efc4003da3d8a82e96979ee68694b6113cc9a6e377d40a810063830eb95005a81405e5b7de8de67424845bab1911bc55da6338513742d237a555465fa54b07ba50ed712e7a57a39fdcfe4af50f064ae969823aa1c40cd86a621ec90769d0c1babd33e8388a8bd76689215b9827a5819127bb32ecc80a562a291f3192eff34cad2635e5b0c0bc174add72e2041864953f1fc72be7d28111fba0438d9036da3d5c0f220ccfde2319bb96fcbfae6055ed7f1c1967ee9a78e93bbb77cbf151084d602a5a2f087d49c3134582c1a5d7af24f4c88be26204cc9dbf4368b19470fef49a5823a2d66c65e9b1e8ab56bf5a7bb3220696840a6222caa58a7b39fb792d95d25038a8bd9d916e853cc5459640f8b8468e3d51f05f1b95e996cee40ffb7ae14cb289094f1b77d5573c1aee7c12a6c3a1e31491422f272cc5f510d4f18ab63d3c3f468c5abd61b2fa7ba0768d46392e2a4dc06c7ce79841dca916cd33cc0a700b50fc660e5d1808d8b87e65feb89428055495823b2dc317d6d9e50aa5ef7ab14076174ed32f56abe7d410e58ca40e92f8a31433d0d74ba7b130b1561f2b075fa11ead744d031f34d82f1a64d428f6cccb0a009be24b42937bf3e99a1ef1fabf0fa7335dab52918382abe756d3de229ee8223aca6d7c5de87047838e387d4e472481a4cfd4365256e13aacb518ce5300f18dcb5e0a28477a6fca08a74756ef6bd8933bacc98d02abc7ae60df7cb3e06d41abcc4bd313c543ddcdea2424d98ffc6dcaa83658aae11f5841ffd4f5df42368a0e815d2146a0fe138b223764b133d17cdb08d485e9f3dd2bf2b220d1f4565b02d7b9231d592130e4436849f49b1a70772244fc0c38da372a8c57fc80ad57828410a5a16ac6d14e093997fdd5b26e4cd4b248e0ea221715ae6e112e1b68b09f795540e31b1231244bc922207b906c4f42b5302dd7474286b653b4d1bb657134bab117d6c349fa0f121c2f8dac9cdcef510c1c28545eae0ab163db6cc84ca182feb858c10153d0136f00a01c9c7d0bed892715dd85c4e73627c3a2ef0f43710dfccacffd1d9f118c9fb1a83b2eb328b8da3e955f027d95294038184f7b895d77532c7570cb86fd6b37a5a66659cf1e330db3930f302838706050c0dcd91d532d49c89d144e9a7f864026ec99f50acc02bd5f11ee88495ee8991ec4723b189f84e03d992fd718b5173ea1b033ab7d3568dc4656648fb54d28d3119b0f293a930a772c394f45ee66838f17b73a94eca27033f9d5c2ae22eb813386905dc024673850a087958eed191d04d05798bcf909eff2deb2a0009d223323b290e3d6f71b2797a2bc2590d54294a5992d629336518514032614a04847c3fad8a7d1cfc2f86765b48cf58acf892f68b691fbece38100e6a71487ef5c4ae934f1ba03b4b26a1967f70ef1c697202e4eb22a3a95ab3b7b524f0241ab4d2adf3ee5e3f2974d0bfe4419ef0ab11039ffc26339570e74d260c4d5a16f22cb4f60b03253487f5e46c47836ce29460728086a615f78d631d89a06790928455889f58adc3d0a3a84ceb2ba9cdb00a403080e6567873b985fd59fd9dec71e375013c12c51cb67d599198f36f58fdaf897e85dfe6f9896cf6d35a84cfdc6834dd9447a2a10e1ffa9fa8edfef1db9e8b4a245b211de49e04b7e88977b4e1ac9285f43526f2452181ee0f80efeb1f6b2533b656519ae45652ccefca81c17714476b497e5d8e9fdf6c9f504c7a7fa7afa36df5f4f8da5b4b973b1618fc8d2d43e866b235e5420551d1659e5bd545fb78a3e17d9cbbc8e842f3fe6be07b892453ffd689d5188f26f9e4c545ba0b3132af12a03bce6914015d026d3d7df661c1e6384bbb50dae24abfa78079a2b1ac41c44c7d82a59183f293f12011e781d3cdca2f791afa5b55a9f2d6139587bfd74bfc54ce91e642847a33b48c1b366fd8f08f520b79ad5113a0273735aee71ceae361a97547fc09b22fbe4e4ae4ae13e52d65e0971341aab368d1e917c8f5f2ac57ac119f981b51b7c99ff2be3e16935b7c73e28fb58d332e6f2c36281228c479c4d6095cf15b14baeb0769191dfc649a70471a25d45d4433797a5b8ba31ff567e60ec4d759d99244d0fb5dfef7c2896809938ddde0d2015a4c5ce5ef6cdb5752da1c2a33e5bc78b6b7c6a5af892f0792c28560a357720da3cee3833bbeda8e98e6a8cccc6535831cfc28bc8557b4181a3978bd90eabb34b99eb7e55d9263e6790ca34561d8c87ec4e12b4a38df524318db00a9b5bbde6f5a8644a818a88e91b521d716fa9f95bf70b109b9905bfca926fd42ecb9114c039790abb0392a41ee4c190536a89ae6194befc2dc4bcf7562bcb84f65c99b69612c0511552f53436b6c489204d3881e1f67e0fba3a061165d2955c2e2e12c440d31556250a8a5cc04ee5e09b1d627c14e08bce1a92df7f6475db92a3ee57e4c16c3ae677c44237122818ad457a29595ab528744707f3ab7ccf3d20bd94047e013e647802a7af14cfc7c11441ea6e9b9f960fe69d03911ad2cf3a8f633e0d647c71dc7e188c92e75353fc953d6a30dd0040c39d4355b71524f1a4872fb1ecab22c8293b54bb22a80e1e3d4c886d2988adec26f041dd0565cfa9edfe5ad9aa7da1d3b8f68fda9e9df9dbe98148120af6ff30e6400deca6dc9593dbf06c856d0d582503e7ffa185f87c6e7ac58184bb80b4a1c0c18d669e23f9791365fe807356a5763ea418c39d94311759b29b14324fb6f3104359ae66532779b825f92b7c9ea2ba43ba7de04eaef7a86192bc93e17286f1b6e0a01c33c796ebed8f17692eb9237173a051c14e4869afda2643bb98c9ac4ea94c6bdc1401c80190df6abe988d2f0b2d80cc7bc8362ba25c6e5df4370a43e156aebd6aaf856b3f64d5fefc622d078faed40b760a361966a4765adb809dbcd74b7a41faffad3a64823860e5656874133c7f8a46b5a3ac591906359aa4f171ef6bb2ea6b5f24cfe25c2fc7c1973bd5d3bb5f197002c5ca1bccffb570f0265f5cd949c7386d961ac9c5e18b5d1d6030d8bf4a48c10f12dcdb11924b02b8ab5e91f425ca62bbe42b80c6b6dde3160ebbd55803966716734327058e29bd39874f2eac199067fdbbe8c372c5a688d3615e2b65f4937b67d6a26c64cc2a9e5379cc00925c678f174f538915f912e85b7014c064a73bcc7ddd38e1a9627ffddb4bfd6da764fdbfb45048c9495ab1a4cac5642f6c9ffbe97d33cb26964a23719620df3d85dcfc392c4502759fb31a6a797e99e51e94cf9bc79ac15de4e5cf7a05aeb88a8ab4c3b6f9c52b99794503f2c49cd7e230a67df7403e552523249f29d257b35c0c7712053c3d9eb583a1a7473d7f296d25a66566e4ba8b08de2a31b082e40c8e5b1e93985b324dded3f52511744e7e99f4e3ffd99d8ae17bb5122b37f637c5525558eab18a378f5e2cb56fa003ed3af8d139d16ec4b2ea79c415b0ba4d750ca2cdf653582ee3b65a9825fb9b123593e36e645232163cabda515b959ed0a1419e9894f6c677ac200fd11babe3503ec7bfa319f1b9559d94a6f82945c9ca8667621a5d28920949a1da644cbdb58b84742e9d65e7f2027b99fba4dec46f642bd17e88fa109143b26ba7fe285c89add0b74a369f3d381ad633bfb4f72e1822ff96aaf9a73b3c59a6e457cf40e17c1198c64737037f52d9b3118daa3fa5cd3e3c7738e3b3743c595893289974a4aa0d6bf1446e70964823a7d5cee67b9b25b7125d9ac5d1d61f2a6947c3deec6deb575e2fc5cec60df26de3c0545e5b79156dd6af33a78552d1ee9994cc8501b7dc5fe7a22eadaf201a92e06ef03be705a8bdb4db65392d3628c7cbf44cccac292c93cb5a407a7a5a0d5ac9fd95b0033d6eb719d3f14609190dd40d5aa1b983cd4c4e278cc8a1e7d5fbb0d39060d6cdce8de6a17e2dab973a7fa594205e17edab6514372eb51e03b0ced6402fac0efd3af49fb8214a505cc9f5f0ea5308d7fe6dec369ba154", + "9f522375925222a04f5c95ee14b6386412025903ecad0bc3ab78afe1145136b3a3592835ab4ad6faa66be9", + "d1ba82b3ced3e9817642aaacedf482e79bedd0560ef2754215ee792514bbf8e6", + "bb21211f342379370f2642d3", + "1a6683805d3f478ca1c1512b9846468378f83be27393db63956e151ec408368b47334afe610249182f54c4d0a01b704db2aa90a9755b8feb67ef9301f0715d7d6bdfa5cc4497cef1142a43eeb42f7c413e8f489af30d742a706d05a40a0c4a5991f9e2cc5d9fbca6ad3767682e20c146ac35aef38dfb2a77388b738fa022158d5c802e5f0761096bb45b50815ebf09172759521b5c5d459703ebe9ff669ee4d14a86e5d0650b597f4a082ba0aef366a924ea378b91c3262d99f48189eea19c76c0f644079f8415c11033cf24d30d6c149ab13ca5c29deafdc816e457257361c1af4b915da312d2e6c7fc712faa27be3e67c893f9005a0e2c28369991c1dab22d38961d1abd6d94c4d549cf491aa1f8d522be3ffa6d214825a5fde3c94c4e35c29b8d05b2627eb12c9d94f450a85eec6bc963a279a37c2344ca36eb604c4bd11c2bf2ecc0dc16c2c365bbbcad3541bd54f8d0bdbb3ca4a087b62fc19fcc1c13984eab807d2a6a1386643d90d412d027bcd0a638765498cdbb1f4cc1b91b69bd241eab3645f225ece85a56e5008d6094041f8cca6b9a0ae3b15585de6fe0695d79d348f8619431ece40e736957a7627224fe92bbe30df5124f476d97e36b5b08b3787e8e00f0c10013068eb156f82f3494a35d6edd5f7048d1e91954f1013ede22eca8b4ba41699ee08decedde87139180a567c6d169b672af0f12aa09ce20e9cac4e78b8067d31ba4f63606c00d1d787b868cf7643fbb170f8074667c9f7584d36af80b4e6557724013618c28d0dd40bfe9d4b25761b3c99558af528c2d290d04b09821bd7f992c044dd61dde9395bd0c9ddec6d0bf6e044ddf0b4b2d6753f5acf2e9c904caa4e9f310578527b85e6738803758da646919989f735b09c9a5744e63fed2c3982e59fd29d2baeb9771316bf8d29213a4956b66c78d5654436ffdd82d0d572530fd09507b988d13fd743f35333237681f8abbb301a8ea870159f802a57760659094d0e4902036c5a62c563f1fc86c4238e1ce89f5176ecaea194ca112fbdeefbef4fa7c203678cafd34486fe58b2af04f84a1cb620c6e123bfd96301e0a5e5e5abcc95d28b852d0cee2f51faa73e42f22fc335f50de4c3812ee14038633a195083f3944284c1086c34995832c3cceb7d385b4ce86af10685c16005495121105272d1d739c584a07ec7801c3667bb280987a8aa41f9537e9d1812a5dba5b385a0b71d2e9573c6f3e9ebf0bf7267528946a6aa6f43efce908d32525cdc3b825bb11c7239f1de412704d24c17455b9382fd6a873180f0d5d44dc449320973d5cd0d4e67e83946b6ef47e5fc3dabadd80751f1421404e56b1bce748b7bde63c6975ca81f3eaf52586a55242c9745dee3f7c796d4508e818eaa4fa50490c1a79624561b98d2e1139a328806414c905372356a22393ea0da51c83957029edd8c2dfcf46d9564264d74c1c0497034ec018b1dd4c14acebc34b6d2c1a616937c37b8b4a0ee5dcdf787a0de1173798ab929b72e0fa83a6c9b9a99d8024328d9c236a8f57550a4f83e8071eac76adb55939f85f5b5f514174b670a3e8dc2b54656f6201940a81fe4953d2680ae4ec58635ba74d15efab3e06dca6ac269711ef2d4dd49f731e24a92a3b935ebbb3fe8d001cd4062669ae4baa62c2947033afcfaca227d88a11769f87456d5cd1bb6606891e71d63aff9cd5a7d23263a78768ac2ac54ece1441fd37d096cd27e916e68891137fc3cca427febd1947cfb4d7ccfad75b2ec5e809c132111eadf25a73043d68333139bd2435de9941bbc61c5c509897cfc19a21645019eaaccb6d06371e3d0570c09c7556e41a727e44d9bd672fccd1f89cc7d58761c16df8fb75fb8a1dde2caaf088f02dad91b6489114398740e6798f3ea8c7b0cfd974e160a0106d703d9589ab09aae79108e3212f19cb950ea9c0798a1532bc2a065d5900a12054395c0545b0878ac0b1d461f553dccfc2a22bf254ced88dcb538e3889549960b77ba6237ab1458e158f4f46606372e797ec9d9ecc6534acaa1218e7540eef11030bb9c3e5a7816f3b33a590d970619bdd2dc04d5c6f4ec38b7cb4d525234b836eab57f65dd045e02367eede9049e219b8712b8d6fe178080c5f77b821f1a475259ae571a5578eb3b48863162d45486f71a28ecbcedb35b320e5b6401f9e7870aa5418449bf47502626e1f42abf481b48d5a6819c640bfdb64f873d583fc4e40187940a6c3373ea7b47195270a8657898f55568985018abcea9bce1c155d95b426f91a734b2a14ec2c7ca2011a4d30019fd9b3ef63a804e9c30c3de2651c4213e90285a4ba100b31ee402e8a7f23cf9d4dba003bbf982526bc63be5af102dca34e7d362d6fbf6f56046160d7af33b364f2a86074d1c0fdd54aae89b19480efde2a9caef9de7c0f9491e1cf43a48752cef405a0ff16b0fc67bbe433a3c1b9661406c3726092efdc076febd60c436476f24dab1b0b8f8893986d951ed72282990e8b1526f4dcf539b22c01c6a7eb5577cd540a16a81296ebeeb7ddda72e60fcf2840c5b42c5cba30eaea5402f267d1d04bc80da5ef0dd2bf3c7a2be986507617c9bdbc96c6273a0c9e586a0c48c98b4552113149c6f79557fc8ace0b1a512fec3aa09ef191f95c2163113ac5cdd940f0c2120509bc53c3ea493c54703effb902ef752c830c61e85636ca95429bf16937bf6786b3eae1b277bf08dcd69f521a0078d633beb33c9aa0cb33b238e1021ca67df122a403a3698452740bdcac81d22ccfe4ab5f835d1961708d1faf6d40f115f16c6094ea37a7ff15e0534f62c19a6f4ded0967be337cdbdd2a7c58ba16ba2e4c3686e9d075c6fa7d29b2a0335ab4940d2a95c4500295f4db84ae65e46c54b7300909cc5411c725a31fd962d239aa0e2007c285586b4c778e2ac7afec42cd8409a63d7cd9c677031f43f4aaf04258dcf1270c02a4764177aa66db2d8f860eeb1fd06d0b27587537410bcb641f90aaa7bfc6f12bd143f66e7c933a0f3ce6b5048913e1b2d79eaa6c19e7255d5eabd24d5f12426339541a22d600cdfd1781a1a3894740887840aa82e5a461fc324285b0223ac9b95c3eb88160353f168b3d4ae8a2e87b7715b5fd2671f66e6eaaf9365b3d9e3acd9a749faefba6009783771177aa4dc91f72fed7a5bf6b1b7738b84ac0a07b4a5a3f0a9134a39e1e7e3e2f9a92d5644295f31c5a356092bf07c709b4c34305ebf50e857a4f593dd1cce0439d3fd125c1ede1a48f583bbbe0eec7058345129ef78868a96f8a76ba7fbfd1c5eebf75f3e0eeeb9db87474b96f321b87fffc02433513fb467fb74e2fc8feb498d51530c753e9a173e95e0edc5ba9802641a45db281b2e2d87d409057b4fb1925e834e90fa5619ae3a9237d5b104e7ac67c2bdc31001eedb4ec7064b2f72e0379bf8780f67ec4b195db014a2d130e77b1778efe3dc703f1310a566a6d3b5c9b12b1d4e25815493ed1510a516a31ced3b64ca49a783ad63ea71a57290727fa31386d2fbfe41f12d36a618c6c28d8f10405eb3e0a33e8ac2e4133ba75c688c8c9a2bb33c8fa032eaf3ea0d2c27bf89269c4aec55f8232b292e7fa9fc24527184f19187d9d8a3f52335e2feb5dc6d997b9b773a79a31db832b752e5738963ee5d61a1b426414975693f986e165e52d46cb059fdd4f48f008e96d4c1a48306b7c002fd0c861721656074cf11173ca65cbdb694c79f58a3f3365e872b24670b691682c10261eb1ffb2b65da031d070e31542f49704b77970a78bcfb4c4ca517b4c966a4e8e27664704f633e90cb7d7917dc1d3a8b8b7fcf59ea3a8a81305761923cb182cebdd59255803a14ca8a75fd007670d79a25eacda1138d67a0fd1da981529dbf182fc4d7a700ba498e4476a1d415381c9e2ffa3bd46201cf2e454c4aaedbbe3893bb4121a6de02cbecc1f319155eb8c99d1030103bb6194bee51e74fa01f28dbe16092955b9599d5c1f1c3f356e26d48fcad7c4cdf0eef25c25273dd62171785c9d2c5a01b1f3da9b4786b1b399d890e2049b73c12de2fb7177f2bc3d9c645398111ebcfd83b73119897bb994f998f4a6fae1b3d6361e171059dba0bf9de9af7a5a1b21641790baf82a36278945d649cf5d310f3792fdefe8c58986a48118fd94647b786e47733ae703701e18992bc1b143b1da6110a98030bb9895c14d7b8eae1a155a550e219a5b6301b6d26d7956ecfe4c7023eec1ff62538b3606ebc7906a1243bf8357f593b6cfff32e3fc6b51f6a0ffaecb658d526f7a5e9faa6294e4808b779f4832318cc184e49e8957b72bea0d67366e040cf76a85889fc6b04e84afab0d02947d0d83e0de19f12966fa8372f6e82ff402bd7a69195eb1a7864a3375aa9e23736fa4d4b0224647e416474c01f72b7d4af240d7f43395b5b04c8fdef1165ce1d56ee8ba0e350e6ada893e0594facbfb5f0d8829ae203929525951584c21371b86deb0f76ef5daad5e847135a6488b35ea33e3a165fea502975d6421d4567a229bf3ce94605885453610eb9c82f9ea743bee9e14776bc3076a29af268cc72d9092a492d9ff08c345dc2eb2f8003b561d9912ae1198c58107f8b37a08b35075af9863110e6770425e9d59c2dfff9d9942c8bc3bf7904c2a952bcd573706caf1ee14420564ffc433c0f5871c4bda916f2530ac75819ade49fa1de21edacbbf6b7075dba21a84989411c566b7c356b81803c7215ab0f326a6b8910dbc62c1bee3af51f105fcdebc0dbc56a50b22cf81eda563bf8c2eff98b476e8", + }, + { + "99444e82c6c4c47070b164f298ffdf6955ee5bcb3070b9aa95ce658db4db084d2056cfe61a93568b44ba7ddcba5d450f4ba0da7b119425a6628b3416663c638692326cacc5c237097db5e537122b465dcb21d8dcb5fe831789b72deff3907685c2e23187a56990221e755930a09f8d6cc065487563cb8cec82b9dc754952fa0b342c92d99522fbb39854e338f470a4b4d5ed2a39b8b6253b7001b0b953abc588d757616c7a5d1f12b1024aa572ef5a47dc8480943aa6cfaaa78064fb2b29830280e46efa418d0cf38f57980146f2482276c9b6b16f865b1606bf1131e894336979a163ba2e70adbdc746be0d38062fafcfe5603e6bbb55717b66a263fbd5cc7476302ea4a0dc6167221f745a26a309f5886934f4258965a0ef0803eaddd05e54008df8a0695a078b797be59f1eef95a658c99a7d52001d4108212ce5f18a39f1173291808c980b0513f1a531e03ad7380372b65572d3967af4c25fe54d99d664cb67e557fff05c12e10143c13b1bfa3e8db093ff832a7978ecd85d3971349e3c9b83939b73f0ad55f1f1162d0c106b99c0ff98442911bc15e9194f5b4ded97e9702b84e31b31380c224f392e5fa5c720a45f64cd7020e25a3931b5871e4c708e77f4729225aa9f48f9d876597d3e79219dddee0efdd16836021dbd21692dafe121217347cc128fc5eb051e6843978ae17478ef714957a84c74656ddd931cbeb43e32fb0a448acf2f90ee98d38522b4fa9aa36be4fa13306e799d4c0cb90ac0f73cbc018146d1b0d6bf48aa446a5e3e0502aae9fcbd196b36b6b7426fc10367febf687f05392fdcf878863de2e47be7e625d0e3e3e94e199f055c0fc65f76c41ede43231873ff10eb854dcd6ac9b550ee8533d16f81eb0e86471d4da69311c47255e78ac8e79ab36ce880d6b135279fbb5a712adc5c3862a356af49e9c10d5b16f4e5dedb80914868111e194745b802a0292c7c8564de28ba8e71a44f7eff6573e5434e65d496cde5b5e62cfa9e2e9ac85a164dbff5767983e71dd2661d37d9027a27674ebe3433731a606db88e0880e91ecea8134421962b3f68915c9f6a5e1992c56750f99bc313fb30cb89384c72571a1a6a5e3c01897b691bd70985352217fa8a67f3252a06205bd1a9931d1cea3736559572561fedbf3ac4c8bff9ebd7f3753ee69a69ecbac4be6357db7f4213b697a828edc716ac01da75c1d46098c7d5d6ae6f3f9a2903588c5b340c9d47c234efea21b700cdb8db4279afa2117677e824e627bf0f2b179c864ba823926a57825478395545f130886bdf2a7c55a2647a888c3998b750343d9cdc602e46b7b09a2fe9ef74db1ffc46fe27c254c927ce51b307e96a571da7f3f907223fbed2daedbcc96197e95edde7859f3b4ec6099f791089e368a68a5ba0917ddf4f50b93c0c839ea36cfc8053811f8fcfe6986e5fa9f743119ecd6c3e5fea1dae3ad7eb465a89e9c68569190688a8d56e4143ceea3b11fbd9de67173d5134ec8b0bd7d16560ba2be52345ebacedc01a2e03e8183ef91317d87b2e15cc6301586ed829d438e4ff1d074408b332c8ce60ccb6790ab08c228807509dd4b39f2c227755f6b039f5cd413ad6f46c9ec2cc6a79457529d297b1d9e74ead9bedd9bd652fb31568a8e2a9e2b89e4e57601bc1d960360232cdb30cb502b950ef930d54c2c0692a684cd44b0472995bd2b41dac1553ae47216253d6640d2653a033a862f3118c5b5d60a662d240bda5f4da51092eff514f61a425c5b14b19517ec1b371d240cc30a0739273b34f18a72a69b1586802a7caa6cc8f5817a8a995695d063c9dd26c3d45feb0f84dc8a0773151cf9a537664f942f351599cfbee0558f441f5c7ad320cabe305f9aba570ddf6407749b6db42f9ce94526a8f4170e735b1dcfc5f0e090af10e039db3747aa9b4f1f26acc34639ac8b60557f7753e2c261a29852932901a4093b7f307319cbb228e26eec289898b3f8ee236032163293b8caf64be3f7ffed236f1da688d958a1bbb79dd45026884904bbb936c1ebca7aa6b0c68aa8b667dc1575729e4ecb4ffa82ddced2f4571bf902c52fc4a0ea3f47aaf5c243ac2a1fc19f825fde5d9fc8d06d97a351eebf4ae1846aa62554d57cffdb3f3377695338f8d598d723289ff3962796e8065632e7da9d8dffe2636cd23eac15a60568eefe3e77c561906555268cfc1e9342417b1cdf090cc16c79939b15a9311b0210094087dea22833f74eb0e35d44259ecf327dc84f3f24b8c2bfce7be0d97e00d2be88a150a0d557ff963b4cda60eb99935951d288768b4b2649b717133517f5e3909744417c9c3102c77ddd285976cba2c89e2b4f297665632d7c8652847c4625038a6670169772de0550066ec6c2018f503cce79a333ecc0a0632334df6959d2e3b052fa47c5c84d15ceabdc80bd6be0ea2a5a8d5e374e0e9a613369ca8d4cae3d9f98755560b27b2f6e47b01ba390f5ddeb732c22b12abd225e26ecdb639b08f3237e488430b3b39f0b63aaaef4907cd003a8f2b4c3bfd721d6c3fd3a5f062d72746606a529ba34251ddec4026f40d262e9d527ad84fecf5bb2cc8601c2a38437098aec2335104842ff1c455e5d17c136ece8d461d7a3bd9a60339c22d71059e09b3603c0565c0345684893b56054ec4d3db0bf15546cafb4a03bd7775c3157e7676bb7bdb7baf3100396c563eba1a12952503eb6ccde6b6d0a42d456743c4ddb97f5994fa08c5fa41315080eb6b928090956bfc6252b232f6e0785d233c3adcbb9370b59c35b0dd66005d516befd1fc843df8e68fab19858b91e2aecd1c8a88b0fa3d4c2fed2995ee87e65976b755fbf44ee183f9fa08848bea325807bce0b7b61e03e50b2c7af9b360532a17a8250cf6068fef0198738c82a5e58961c54017e343fcef7076e823d63b4deee472fada7989ca7a213d06a4e3eb2d44b16e5c94b1588321cf6c45a5a792938b058d667e1730f8386dfedc50ea0a959b78f12f2949b34b181f90bec622515227dfb8a5f6e89d2e559c0ba686153b218d2c50b67503018e22914ce9b49d3bdb7cf38172db1ea130baacd640c111614e3db204b3b50641d8978dc14b2afc27a7efa819cac6bafa8166d1c127e2237520d57ad38a80146217a12363cb1f8a720e328cd8f846d379ada43bd4865e4aa633c479bd448d205b2e43befa63486c717af84a733f1dececc127c047850aeeb8ce677612f5966e23d92c1d3c758aaeef82f862c1154fadd6766e1dfc780bb447732a5968c0c78b9af4a9d669338458b57cbb77910a24678092857c0b903152035bab6b1c73f7b667a08cd0d31128888de3ff1fed24866eb60beac19c1b139f77bf0b9332024999a2d56975e691fd7475fd93622119d0d725bb99c1d6ac604d6b6be09d6d29360fff9f84e5318259a67fec08a006d9772b9410ec6abd4cb828b898c625c2fc35c19cb9a6cd3b0073baec7b5af254d21de8e209539f560bc80ea38e33658a68262622cdf35dcd6618b9e272ac3644c91f27d372c6297d8e37201c6a86a7d3accdf579c15246276a0009ddac4021755f4848d10f714e9da86eba13f461e6a12edb1aef2d6117986120750d609682bfdfcb90ee3cde8be54d45f841a6dee2d5b9fdc4e65edb7ebffcf3cc5c8a4e1c6919ac57568be23bd8283319ce11fca3caf968b057432f163f22e29cac30b8154a646ca0ef4fdbc7770ee1451fdde9e9d651992d94c843d4eb2570975528ad9f8c193f7c681a43df28242547010e30d75fca04f39247c77d6c3715c25fc261ecdba16844bbab23e4d0482bd1565ca9b526ada9b8f5703661a84b23070d85f3e8265b2ce10750c5d798f1a8ef4d51a473ff4d2bf4be615566ac796db9fe61a224bcce05c31ecb9ab7bc43a609944a7c9398a7875609ddbcb556296f548a117847df7d0afe48a5b504e85b0d7ca589103d3197933a744fefca795e1e036f964a4f14554d5cfa0261e25d6e5e02f86e402906d3637a2352459cb1639f20faea6f0e3fbc6a39becb1b1b3a791e32e85e5bee31be685410adf0c11190e20b7a5119b90e83f2cc4f0de8898606bb6e64165c95d4c5eae472daa6836a888ee4d9a79de72b8fb47a9c9c0323a2be9106d4ee9ba8b3858c256032a9caba37af94df4c7b0adc2f8478cb879b6d452d73191b0fc1ce944df3f4809cbf3ad46eceb3ba4abd9679410f45c8aab20dd72626f235e7c0c934b4beb4507def24ebbdd7a507943c81d54bc69df578aacd9ed0bfd3b7809dec345ba084d88fa9c34d80685415a4d5eaef9b88e51432b2b2037186baf123a6257e47aa56d6531923d38178e8264dd315e95bfafd8dacaf901e354b0f58f135d638df2c0f32453205c7aaeeedf8c102e11cfddea9a98d3ac7c385d71b760cf2afeb1ebe1d64f0222b9b101893d11a74ed175297c1dfd188a2565fbecc6bb07b56ce3973322a965dc5a675587890cc65a71efc68fdcdf1a023505ef0bc0e6b12dca5860fcf1c6c94c2e2ec3a72b8a019d69c82d36a73738dc3d17d7fdfe992bc8e18cb5d3437f1f619dd318b95d1a56b6d273ed79ab2655d83e2dd63cb6f1f5987eab6bb21a7b13b84e2c619b36b842192c3f82c755d8af840675b0bd67a655d641b1886c3c9c147ac87615ff3e58085a879b21dd63c1616a3712279ec87d650a2eed665b797ad631f0ec312f343979cbc49b99385cfa92841cba12d52777df565545a1deb07800a15431c0987b4a543fd5ed6832e80ab6f4b4d9c9ec419932a6ded4759f5c7630a0b80139234b8d53117acb4452c60b477ad50157169a89bd796e2308baa9395b513a94747611c7978c82dbdf48d716c3ac181ac2b2a4702c02a324bd4c5e089d989d020ebec9963b5c721a95492158f54973b7fc1828181acb3cc8078ac095136d97221c60b847bd2a52427383ab68cd1f10b92738c13203fdfa0b78baa09c1837be2498667c459", + "0ce980442336d0f427db869a6799baa6785b5e030567c588e2a7d2680e96c11b7f415fa27730969e0b1c3973b5f3192d4e773153def6dcc09dae29ac44eac7c42c2666a356fd4262197bd5cf6eeefcbd662d104423ec05c19a2e6ddf1834a3445a09e8b1062a1320a5e8ef13d6ebd03c19e1813ccd86fd68b46a", + "1ac8a509db7bf4acb80d8d394a5abf47c273b2093f50f35049e749f3e16cb0fb", + "47cc9eea11f9f3f9aafa23bd", + "088888333340b3a057b05491fb2402301c8654948aa6d5ee1ec75eb045858c22056fef0873d6675f897126052923a47a30675b266ffb6181cbd29ce2da3720e36a227e4c6e53328d789913c0d9cd149a6e49293996b1be7d6c513b24d876445a950e723ade3efc36907c840b9b8cfdb1503811b4044d931a0009b381fd60a5bf1e73d16348cb57eea672709875fb9d56908dbc729d5d7d322a17a41d0f62c9af9a013ab1e19fb7b6c6e7fa0c0b18bec5e3d3e92546c77e3753193389e5fcdb6a6a1896cba461343e71ef7a156b136b27ae6f45be9368301cfade203e9b53824d70f07de9abfea1968b8ff8489b9804422ba05ac3c3adf23ba0848817fa51febab5e9b5500100310479e710b663f064c1ef101c9a5320367cd8bc6e52081a32f070e7d3fd6f4210cdffdb9fcab1de4af5b06a7c6d191dcc12b25b3053e58952bfd1f723afbf570796946c1df9579ad14ea9c8c30389c1de4d1e845c764fec5eb8faaf4c558c5eb5113018c6a21ef653ac7d7f5b6c7e1a8fd48c6f423e9913436202da176a86731287db7331db055508acc94168888040ee37b3c119c8a0d88360241d68745825fe480324a944d56e7cd0375d4d33a5fe7a3863c2aaa899b2d24f65b70bd804039116fe959c32442c9f0b5470463523eb4336985b71125fe5235cbca0c88a6f92416d038e144de5ff8ef6ca749a9e239f02db505bff8e16fad1cba8b1500445f067a674142b6413e9dc0f432242d8301879bfc11fa86d1ac9992ab12319fea8b703e10a13bfd4b017496222be26b56af3ef67610f904f0ca8a3e7cc249ca8122735a542b289f13922904ff23dd197f8883c7ac77150d7331316ef94e0cf13b6ad95070420513599100b0a6d117640b781c622ed7ef7ead29476b3c835bd9dbda2203930bcee7ac01c3b9c89da405ee436ee652ddcc3e96c7f1a94e200eec9a4a226f3cf7ae5725068916e73b61149497d11dd85157f895669f51978d1bea8fd2afabb18d082365daba2682ef623109988b7d0e27ae57bc14d86603f93b5ac040ae52d8db404ee27e6c34cd4246f40eccf9d3f8637a4615a4006918b01d34709bcbebd02ea72958d54db3e87d69e6d783de2f1841029d6975eb11f9b076c247108797d5368c656f888092b82aa81aa26e164e038b359bd68801c22fc107e4083a9d85fc254b002ece9d4545310b0cb22ec1af04a7ee31d210ede4b605dbdbcb70e4301989422ef46edf63f9c96de9cb3f70638b51df5c0abe79b7af8cd97148f2b7bf394bea0f7bbbf6925f83b901b87a6079f2c3b38a98fe1a86dc7f48bf97553701834f557451df4b41e7db984a34432823585380b45c1b84813d6aa21107cae252923fb4673cf660a541e65610ac0127d238285f53bf329b62169f3e42d5efe268dea62578e97da59a58a1314a1bd46cf7a7cae772814130b51411082e30062fdbda1c9e14d6b2bfff89d0379d32461f3b8e833b105f6a89532ae748b5fb43f283fc86450404e8befb8442b65e338aa0408303a70e9c27a1d923d9f2a06e7c6159c50bf2e3ba5b035420ecbd9d0b5fae478eb1ab72fa714f99d00188bb10e60380fa3a3a318c2d359ea3805c2fa0dde17ee52a504f70d6b466bd38d1dd4196be336a9ab4a9e573d1bc6404018a119f688c1dc2a8ed1433e8a8ebf455ce3808c245f0220f0c12d28c771757763bd111ab829294e2429a6f7a59858dfa1fe0b806e986d40aaff934589fefd75ab91097a979f26bc9352267efb2d82c4738e4e6c451b0d5adc398f546c646b9e6b8fc84e91651a1252d5b805a857c7798d102d1e6f90749252bc53588348ecec0897c79f514442fe3b27608c95d0cba999a7e0fbd7f601689b4dc63ecb9ff553ff12eca3e9b26e3eccbde28770bb6aff7c864ad6be77fc09f81f90df6efd0c4025d0916ab5197ab846dfe6121c462761d9cc87112ebbca197b0a222fd34a15b824b7eda06a56a6ffda760fae5f0b527e2798f01e205a3f47947a4bd190f6abfb1dab2e3a53131af95d593bb57e4f4af506440cf20636d9fccc449d9565bf43dec8b6877337ca5a43900c1dc600c877b290342914e909aad8c5f0755bc25652781535c057ed5ab2ff8ad4322a8edf3fc1b5311dae6361a7395919725f4cd87ce0ccba37c64eb3618f9c5a53644ada569b90cd07184fc048f1b589eb29852909e75e7116ef96a268ea85c2bd257cefdde9222d7eda875a2a3abcd3a02a1fb470ba967b20beb54914b8b0c6ed464ba978088d7f8b30d098966b0bde82a8f1210f5d0c3405c9bc73f703134d0b6ee13326f65fa0b8154f4e30808997d4afbd060285942ca1dededc3410a099881492b5730ab7bdc2a4cfd0068f67766d60b5d4945f121459d2083334ac878d067bef644b9ee427bbbd6c9351d7b019bfc051c05ac301ff3792a1c687546dbf6a07a0cf56717374bfa1191c22b7753f6ae02392f8aac9207d1ad0fcd57c5c8b35817574b7dd90a00cab75f508f8a234eabce6618305f94746cb6a8573389d336bb67e1b0d2b6e9bd3959ef344e1eb245b522c35222813b8c6e82df48987436b5592025e9786ca63b6d1a064223bfacf59ada713c2a3116611393aa8446ea79b3cb21e96d13b659ada2d6524686fd46ec66c1b4d8f5ae7831840c9e3db64d528f83a1cef1e0a586a783f8306cb261ed9c2905493e74d35883fcb39cfc5745c282104cc3ce804999231d13e1bc6f2c022f05999fb57575bbdaf00d7a990e17dd2f8b9dfe66a637b42f58ee49ba60f2dd9718d09d7025b6061b2087bc35f0a8c884f5b67a5e18c2b4e857d3b48b79dc7cab6b72f572d22987566238a7153ed6264578424f1ce091fd05b7f14563fe12c76104d3373367af3ed3aca694a21127b5912c0b7eb1ddf9d4a9f03f660d49f7a7f0fb42797fd112414c3eba2b75a04282dcb9645191fd3dbe376e7f60ab40bb7ca1e991053a1912854a68d7dcf854201d1f2c26c6cfaea32e29d80847e6288274713d2ca973b91dab97884326b280c6f06c65b8fd25d314be29139961051a1d8699467d02b67991baabc9b05629660c243ca3b0477362d5e6bf9eaa33beeb52cf399846c77fcae11a89cbfdb2058e443ddd44fe202a3ba5c2efce937d78b9639781b8b2b99077b433189cf3b0733ed73b59bb194c9a98c5aa0cba6e71d1c5522f193defb9e31fd2cd60f22bedaf7008c2fb0b55a8dd52731dfa2bc69b40f835ae95db040cda6a4a1588a5ba4769edfeb7369c1e9a3b1cda293255b4942881d94d771b7b82460004875e71be64c582f2830c5e80dd6de421a311c5852f4912bea1451b0328d01c7029867cf9af99284cdfc1e1f0aa0d8c19ba9bc035dc270b45724247137da5d3fc4daa09e7014fe1439889968eb23fe124f067825d5f7b304f17a983580e009e0e51630ea0006dbc74a30b512cd9eb4d0b315a0ffdbfb581609ea9661b0007cd234ce43c17c92269a7519bfe99c2ca94b5cd3e7654946e67b37d4270a369266db6804336a446022677a024d44cc02cb04108292dc12f790578a0d61cb6fada738902eed3afdf1850bafcb279f18b5798d7466752c6368a594533baff5dbd17974638ecc41753b184845206c79bbab84dfef148eb7f1390f8cb7346a14c88caf540c241cad11ce8869be3bec85d029ef490fc5edacf94fa962be39a33c8efefcbb6b43960d5bc35f8fb72038af3801466aed141b50e9ac7dcf1921f7a6abaf320ff02ac34bbfac265e05e27495e6e027e673a48a874e6f0c33827a050fa21c2efa789c1e3df2ecda95fc52ca7be35dbf17ff6c73f37cb236e5131542e002913d177ffb21ac450e2542e24b894650007c36c52d90f83731009a7c3239ccf11829cf0fb6510d9924e927f14d6a06f8dc772fc9b028a8bbd2d3388985f3e2609abbd08434c46642b97240c9380a831bbafdc5db77be63a1400cc9a4f7362a689b07a77162022c6ba7a1bb9f0446a0b6b460ebdd9111132694fa5f1b29da39be66c5179849ae9720b2da0a012d4bdfd1b18b8fbef0d5c32b92c351dcf2c599f069c3b53f622fc8e904f27584b2d97d43f779abcde6dc1413c0a677dd187b28cfbcf7fa6316f0967b53977432d45944ce8ebd2e265c0bf6b2870c75ae808fed52aa35421ef55667ecd6f9d279c9b91c9314bd9411bce267d6ad52b1d910b3e65147c3eb6021a0af98707408e66bb11ca5abf5e34b2bc85b144fd06ea56f5d7f8939fe0cfa4862e7f306de069cf85f4aa7aa97c6848594f5a6dbcc718d2af77497f4b9d5ffa217fc301127071e9bc9c2c9222ba90e286506e384f321e622f05d81c114953d0f7e9626b74f4a6bea8cfb86ceb4575e5cf4fb84e9efac8291d1f4153ad3cd9a34ce0ffcfbe30b6829c0f986a4f85d63b602ab99ff3934b1e0c46e55d56eb479b79ca0729beb59aed783e9a3ccd55db8d884733dbd93f9fd7a7209fb92fcc49826b2d4356ca676f01b0981637897b3d2f90f37bfd73b214a398a8e4e2f9e5abec01d8192ca690191255dd8304a2d95a69331288bce00385f462e942f4d694dc3560a263c8ac2b5cd1d2c63b90ec67c32eaf5bd947bd8ac730da9c09ebc6888b0b4f3bead157aa9d31c2802df8ff0e4d69b7abfed6f184bf35a16ffb5677ddfc4682322128932d57fe4c32f21e190e1147d8e673ae407b1dbbca31331310b299e9f3db08ebfd2dad3158562c2e47addcbcc831cef0194ac8ba9778d0103c2955c886d439967bf788eae688f2a7459b0ef3bd16808e8d768b8962a24588d918ceb2cd1cd611b504019f65216beca212f44600cb7fac77216b7645c49f18064a3acdc01399315084dc9ea151ee28534fb31628d190bc540ac6b6aba572ba51aee89544015e6fbca2b3c2330f2ac1f68849e99e1a1f7f523599eaee22720392ea52259e26f1101614d4edae481b3783af4e99082d75dcca549049290731bbadd1ec0a93789ad5c9afe8bae44e35b3e59e562362964", + }, + { + "0410d1f8bc890649c250a3819766f4496f339a6384e34acdd72b3a87266edd2a7eae223a372883f978277a108d6e59fca1f35f25d7a9f3aed42d35fa9b12241ac04754f76fd8f0e8ff6af88cd851887a45e89f1c9192ca66bfff605b128575d2ccc9ca3ba1ba23a0251b2cfd6db577b29d17ce2ea998946997f5c4a97a397c46024681a400a54425c071232d269adfc3b1adf15b4586c4dd7b8886f5c1023bc348bc674961ac6e221d914f432c2f06dddcf738227dfcfff88485ed45882809d0e57019461c88683919b87c45e78223c37a5be5f758e4f0dc6add22f2062bc2eb9bdc31b8649af17d526ec339f0e6fc6a41e26299c65276302f982235c3e5205ec1521625ec08a23e766577664b73d18d5533261c859c4cb4346feaf7540a56155c6c3a4874dc86ea42fd518d71221ac65541e2dadd2f8e129e7809f2835f07dfcc4128401dae2b5fac7ced1d9e07e3f348c6cd26f55b3893d4418557a18c366dcd5eadea0dd84ab95437d6f23eb9e5877fb2ad740ee507e2268c39c7186f34e5cee2d0dbba1a940f516a018f23e716a399c317a7a81f89cfabc296c432cba900ad79db67936f76e4d97874fc5f8a9ff84eb7a0f6d629c581ec5c451e27ef1ed468f93bfc68b2e0412a543d89dfdd812d9421236a4be9eb374531556c207340886c7b84d42d651557b952e0982f62c5c383e92dced21905174a5a836acdc3f2393e770d6cdc22c39575a42ea406f36889dc9558aeae5dc5f8b84862850b55bf4accccb6a8ef793d641d6b08235f70ad3b0605eab462afad1af80fa003645f4d302b03d81a7d167e9a8187bee0f76b1cfd7006b2d2b55fedad6e8db1d3ecfe031702dc327ff2b0197337d7542f42702cb276de852b3d72d9acff8a7feb8882028a5e340950e523c41cfa184b3d8878effe56742994e60240e58cbfd01541d39fa007a9f0ecccb409c6cc540354ccf35223677cb74e7ef7330bb60420f7d7bf97de6888cb343cd4fb0928fe5df5f1b018592ccfa7aac6dab57cded573b5950b94fd935f32cf332dd85b2b36501de6687612371dbcfdf77279d647ed8bdcf81fda8b7e0c5ab139330d64695d814fc6f761fd141dfb0c8f74e2d7616db3598d8de40b993fbdd272ca37db27b82aedb08bebc4a8e6d0385ab20fbc20c215ad50fab8e93975bcab3ff38667abb0545b3b3f20e325f01b80a32a3cc3ed51703d4b2826849ee22fddd5b544816599dca0d8fc84feed9f7e90caba53b70bc3f457eb1adb89fd0b67d2c0ab53264430c61d2c4a1b19ea99a9b453fc6b5ebf5fb5ab799134769c9b495c479c828bcc49a8f993c3127d5cbc31afb89c0e78fbc323755457ebf0f3344d3ad1cfc59d186e96ac31a9298e655b3d1df74b95f30fb868631053540388a13d597002f689708d35a2365e309bb96db8b1b94ea4c8060c2b165f7f19e72056409159371ac9c44f6bfaad9b9567094d18c29bbc8aa2c8b5b82735d20f55284fe68186004b4a4fb644fd52d9645b277c1dc238a764005c1d2791ef36e71786cd990ccee4571d9a9b1aec757e479cfa645e320bc33268e05af9cf90e0e616ae7f237c637a99fe15b4ea8a3232262d96855fa248920a28ec03f77ce4dd93925db60ec030a7be455ba9d08edbf6bb717b1a13c3ac1deb9821e21505c0a8971d5ea5dd8e4c9cd3a845a336209af191150ba5d9b8c2c450e3a765e8670d7f846b2461f971fdcd1942704f620a40f4204b99f9035bbd543f64b927cbc7a74f32cbb12c3caef955f169a45374e4479430e08d333c4a877baf41a27a0849ca3a157b6651295fa71ac94b6e3d30b5d160965e93d2a81b4d575cefd264399c9e4e17059f4064465b2d92c96ac27e3b221499b5e642d033992c236b905c072faa1e34495f9890bac6228330e4016c061605bbfc478c30e1b8534c49af54785972aca2d144328b0a540e3b3810a73e26acfa22f48652d53ea521875475ffade8ab50b9f08245fad753350f63dc4e898948ac7dcefe520ca47394f8e993a6d13ff68a2f78cf294f235f5f863bad10c4f5bc41c3ba93cf5e076357f0f7fdc136f34b656b1b8ebb3eed1ac429c7d4edbc902f7f4bc24ea9c9b200b9a9fd7adff0c6445ce1d2171fc031e3e9f8b8d6b448053393c8813d91333d4bdc3bc5bb2b8bff876cd29e8b92cf6f7bc727517b6f57ae031f3040b0637dfb40b8c1fbe44cfb6bb9cd0a445fd9b3daa1da2b1c4a82cb4da1fb8d525e0a4d9ec30e9aa75b951214621c58c1f60c9b97e6c6b330497e7dea790a3cd8158a76d898107ff3a5910707ae60c8a46c633b522aee83736d005de60b9abe202435f8bc4577b0eb08b7f2b617bb5a831e95d6488459bbf15919d764b39684d7cb7c9310f343fbfcfbeeb212a90d96c7a26c1026c5cb171ee4ef839785076e5084026077455c73404a2653f333e9bad555cafc1a9613387a02bb1287c380d7478238bec8943208de585bd18b448b6099565cb3ec70ec6672a778fa6af9d1b17b0970439da24c7bfaa74c85ecd8e5852e42391ab2258024ccf91e37f2f0e86df958b197fafd12f4a45f7990375f1665a14f7f5374ff7740f89677ea8660587fb80916b30629a7aa88213bbf80512421a0a37414a2eb549b81cc85072cdd87e4e69d97ecc63f974e60d20de0233101c3d475d777602b12e2f797e9237570085b0e9f48d4dedf233eb1301ed4621f9736946eadf599bfd79157c0b4cc31bc273f5c6f133a4e3679ff6797d3c9b76aff4bd8ad40726c1703c3d8b78f0974b748d0265b0a75928374f91b48c2d2b2c11d8b6e5efddb75009e4db72e562be59efb0bfa06808c89f585a43d4776ef08947a77f277526777f0b52f1e0b5a03aa560fa45c8f30e584b58ac1fc00b104942b7b86a3cdee1abea349dcaea4e058faeffc567e2c3b03e1c5c4ddc675e25aa15de1442bcf5ee972a8c5204ca5794694759c13a2d716839dda61635043bdf1a09e35cb6d93b4df3b7a00871f79cdb4ee69c79041dd14deb7754107b8fef8589d2d240ac1d8eafc52ea847263512651bbede2fccaf6da816b1b892319817bb6af9fc17078ab6cca95f03cf8426249fd4f2bf91921d39b8cee24af07a52bbe54ca7fc4422a310dbf2149b763ac0060fb2c59154d2cb0da1ad4892279b4e0ce7f5f92c189c3ce48e518ff48c4ffa9bf2b02d4792f84534958dc6bd2914ba010aa32d133f6a07bdbb87a237c7acc3ba5cf101efe947147ed4eb3bfdffe5fefa991c0dc8760586218d286944c52d0f221e0101f74826761d01a20af187f9ec1115e9e98bff6fbd7c8816c15d33c07f51c171490997bf269951218ae92b66fa3150d3bd40336abccb717e18b53e8806fff94009910f202a5041b5396d1c339e6d075bad4ab66a0637d81eed1696e4068024001123204b8371f0bcdf0ce07d79f7c917327f7138a75947846fde68665e9c767fbf96bb3308abffe7a8d05512c81e39fa8dab2334f46ab9543921ca97be31076dc7b2a0d05e90b7f7610d1a391b442398ef56cde3b18737faa8f282572389b4fb3c55cb8ae6737257708c808bc0a414bffae293bc69cba702ce2959e1a30edcdf64985a4b0bcc927c5912f819c71cc9b1ff5d6e5929055be72ea5c8c1a4a591093deb5449b7e6b60109be1ac0cae472ba31e1035ae65f3214f50ad699a077a2de52f7180addde0bd78c2698470b1af13cfbf497d243c9e738c4cdc265356543885c5b933a299f01a5b5a9ecb0b4ddfda0c28573064f6a3f142801795d66bcd5c31868fd3207fee7bd98c47e4da26bee64e1617b20cbaa34e3abbe31126b06d5737fc2b577b19d255a519397f3ff8668d0e7d401a37e368729e4b83c5fbf01c32ec478967605cbc0675f685b5eeeb42fc688216a0667e1204c995c9c485e6f7712d80d88edc9594528b1907790549756dcc8b0d32091f36d2b4009639e68daa130e83a1ea18353ca34f431c548d91c1591ccf8b25eec1f7a3c18ddca71b87bb290a5c13229250c5e193e1352072f6798ec504b3b4c6aa578737332f52baea7bc4468fe6d8dfabb9728cee93fee50c8caa113f5ed7e9b55e21e98d73a377ef68be7e4e965dfa50cf863e6285236f11ce80512c573ae2b55bcb43cf6ebabed6783c250f991f5f68a59dcb2ac13a3c8fba8dbb11c79dc6236809f2d7c4b0ad3cecd24b85f1aaed9748b8c109f2fd98ac8a53bd52f18475598d67305117de8e03b0d988a2847539cc2efad520f86dcd82c08ad4b10e490b9cb03bedc7197bcaca55526cd9c8a5a5f69f7a1697e7e31aa76eee597c386418e89f06b0b9817a83d6cdefaf9594548b33cea1cbb585e55df3d3b66f0b1a88f4b98ea4720f1ef5e6ebe4958078ea0bacb8ad776e325ccb252f81943b9b1c2f54aad3c7baf1bca0dda1355d191f69c5d8163c464898116dc89201032d1e3281c8054882f60522d3a65831bf779a854fb0c195f85aa66522386625658457e74d5c2fcf5234f226da4a579ac1f11f11a1e0a6993a4dfe5c856481ebe9d8d2363401058736f7ad104104aa03f5c91496aaba2fe4072d418d91c2787a9b4ab0cf4bb65681ad0392ef073cf2fc060692b0c0c194c8eed5558098cdfa3317ab02626159e40e5c76fd64b2ef60b8f5f368b6b4fd7ea3d2d3236aa01d9db7c8a01929f9fd38557335b926251ade1a0d47d0c1444e6416218781c1a51e786dbe9297b78fcf0d0304c62929e00744ed4e14af926313a9849b2a464048bead075044bee013cbe318920c4172138560629a0ff4fd229d81bdc7c7fd1086ab17d6efd5b603a1991b33a55ca5b9e2051b7c140f7937adfaf474c2f284489d9b1e8c71d58f126eaa451407eacde9f0e86504f7de3ba4d830199a229de2bf39014baad6dbbc448501588ceb2575db0ddae005b81ba9914bc22b6d600e2c990f7843e553ff29d8008265eba7dac7b5b5a7ba6dc263fe0e262a7b8638a81f4720622c7361554b61d7b04c7f8b133440baeead7d51ac8b77d606fd0eae1c55ce7e8141dfd68d40ae3d8d2dc8a061085b4fb6d8a06263183869154618329be6b01c2890f2b5d0a0f25dcdbbfe2ec3597d79311edb943613fd4b59157df4fc2e1024be03d98ea3cbec7186ea9f4a431dc3743b9f0871b205bc0c1b3a001768", + "113b261414b4b7dfa028668ac8b0cde5734120124991c54f4dd16a87d181efe2bc15f6d0caaeaf6ad615f59ec5c2833904a34b4d34109c82e10609b387f995430e8c13d83ac34310d838af9efa32d7fed6224c0a33", + "cd762390b93369f1e207eb15deeaeb0036f5331e82480d180f84a76c3e44550b", + "e88c14ef96c7768f5dba9de9", + "8d6aaa27892a76fb05a2e96cef9a9b4b7ae0670a12cff95f7b076372456889fbd3b9b4fb5fd98b3bd85b247f15009be2f4e7a0329dd118b6872199b314e159618ede0381dd97db28743461ace1a694c0383d8458150a501d6c45f4b50d5b1bd47e61a51f9ed4929bf2e564f201ed0e6825170027d93e482c1ce268459d2f81cab41f0e7ff281430c16b34a29b5c76630dba72ab9e751bae41122b26121d91f2af271a23e818263f46e05fdd52f319d58330bcabf66637a368c0a8aeeb20cad1916d966e5e0b0de74cc67ebe57e3d1fe01e9743d42a931cb4b98bb762ea43ab937d1e5c42eb08fd56e70e911bdcc1ca4ca0604a329c5364b262ce2de282b4732ea657b89300cc7b7127ba4a2d08c13f581f024fd093ac09c2bc245be60c80e102405597fa8082f4d28cc954a93217edffaba3d2a397bb59ee89c8cc0f33eded78f21183bd1acdce64a923dd609a0620d2911f61e81fb2c8ccad8ad9d81157223253a121ea2bc60d6a3670c563fe06bd75688572b3be83cd31dfeac6b17cf8455267b481219c42034b2252977f32b8e6588fb05166498fa37d17c2b002a655b5711bbc21175348225fdcca041b1f97fae48fb1e222c5bb46b5202191c00666b7e1b2d84aca3edbee7a97dc0f6d1330e929226f8a76c155e973c1ab62c867e1f87be37788754e51825ba31af9f4722b5782ef782fbb70c391a664f252d14e49a805e94790135ff6bd881a687f98b42da96fd34bf240eae4914488af739ec15f13f048a7eb5fa94af14e8b6ac5fae714cbef6268b114813ca2a3920a7a9d5eb506a2ca211758de292047eefdb5a97e18530dcd8410495fc42abed91b1204d9b8ba9d6aed11d2d0fa0d931d46f93f2c1a560ef9f5f7cee1497be770d3cb07c534215cec12c1458bb57aab4d95cf4a15a5e3a3bf8e650206d5cac4af3193d169f1a57638d9a50f6b7c6985d42f7138b9226451670d7359351c2affbca65680557693d03458341198b8e13d0ea6abb7496edea3cd4dee2eb93695e668c7c0901c6809b8ef434e88b85a8b22cab6508b9560fae62900056b7c5c29a8c899bed45a2b5159a1d4929476ef350101317f77f02d48a039cf4cf01c56319cbba16fe908c49ed6f3face88867c0ad3703452baa7b86fe58a00ab8f740b4e8055164b0385dd3fa44502ffbb99cdd843bc3287ea468aafe4cc298a3fc180f284dbf78aa09e0a2f7d8593356eab016ad8dc505420edd376b66598a3d0aaa848fd68c4e07419b8b50e40febe2b6b17ad07726fae1f87e86abd01490a0ce24fb57b533c765504ee0a9ca154187bcf5e6828e3addc7597532643cfd992558d63b1acd00e7aa41b9765094217480c08c43f4f0b3f0127120699b7f2a5ac07c655b6143e467777cdad4bc21d4b57da4d8f9b9a7e4523d8c6fba3614b7f7281e80ff0f9004577adcff1b79fe443c80ca9655ecc102d5df6aab2ff6c3401f344b77666c59ac7d5b92bf4f1e2322f74b75e6ef2bf43ad9e018f164ae76a91451e5221bdf5b65a4fbbaa8dc31e6063b451edbbf4965307f8e65bfae87b15f2453083bea8484017228a9cdc6edab1a28834eed8ce07430f776b916b3bdd2340798955ce9ffcf114c3f6a88bcc4c7b6f2e3842426488c340d00f2c4d2d6fd3b6263dcf7a57f5cea6c77efba7013297bd3320accf033acc0833aaa8e8f95cecba469704214f54a1ed581349878a591f9993371f1daf92e55b2a4faf8f952cf785c687a59b3c258daef1b6d7bf9f904123c7384a859933c3ac31e33edf648a1be4d6264ffade860915bd118f0b9aaec2eb8e16b2015fc25e68caac77a3accea53b9b178f6cf48d15029fac12963b4277df037b7a494cb29b1d9e6d2148531a1f7360519cba5657c080254f130a1cc3ccaadb4298d7ea0223897e63d798b4f4909577cf9b491a82de0275a246bb1211bc4144574c8ef176b382262c0e087975cbef33cc616d32e0131a9efdbe8ad3d9cb5f935d3f4f409852acca22ae2a6e7450e9a426ec3b9183f93b4b7f89d850e1c7053c661936e0cde23e831a261b319b430da45772f0fc0113679d06f025983bbf37ecfba35eeca28de5ff4815a490570491266e92faaf8d0ad4ac8df106faff8fe3c8d050ae9dfc03a01ad177c21d7b653509a80369a668a97eaa532dc9867c32aebaf89ed36586e1ebbe1045347766a354a86ec1e8b2f30c8fdfbb6c5d549e7a84db81b73fb828499c5c4be0d4b2b7ffb197133a0ee18abb5a4e371be0ec0a6535507029316f8decde30833ca47493ffcab781d028edfb91c138609baf1054ad52a5d8ccb98b3ca5b138f253d99bd556afd80f71b39f36e0d96fba4e0cbdb18926894968aa825392f12d98b6497ff85a0e4a91c97f37ba1dcad30fe688b54008b925805104a61dc22b712685202ecdb073fad9b10b5b9ee2ff781f23fd41ecdec87f85b369a304b85bd2af126d08f79d8a9e2bff0b18607a95c4efe35941c5493c94e3f2f3902e79f4cfe84c138b83c7f32d7c5a125b28c6107921e8ac92f1af7da015b46a2f9169369cede770292eee8a5f40d080ea1c267c33cb7d4187093d486dc3911bb2d6cae036cb508e81ca783ab5e95cec751e39f3038003081a252eefa7cd913baf136d4e27076251da9cbf0c7d2586fe02b62ec786790ef08fb3ff3d79bd06868eb1abd9875920e14fccf6dc144e898f578b7295fb5f4e84cbf683722ce3597aafe3195e194736fc317ed03ebbb00d956ce89f7a41a334020e1a88da355d3b47d5bd3965a290f6fbf5dfdc8c8e6347b4eb85151e53a960311582235f3b546ca80a670dcb628fef572dfae0c101bc08c80f78d5630a793bdfe402592c316227f2333b386839a67e6ee8d9396fabc9648ea656a407670efaf80966034958f4a70fe7b920c79dea3d5a0ff05f3ed0516537d51a686efcb258520936fdd415345251c9ac1143a41be295cf12da5d4319e78e1c57ce20507490e5213ca7be92afca8ec8b6a07b33571afe6940daa2afb0dd4dcc1c329474ff8e13d740488e5ced552074fff695a04fc1b70755245895a1e9c387fd9514261dbb0f600ae03f4896e795d1e72f421d8572543243d662f6811eb9402b6a3b8dbb0f32de95bb1ac01b1287663d3b6a3f52339a4f6b27789e15519b2b59f2f4fc8fd33ad1a6e4d02cf0ddf8499f45746da424ee78e72847e3cd3833551b6e6fd6b1aa98c688252b57a1d97660ff006ea1b970a0b8fc7d2e313ffd0b0b85299ded47b60cd2fe9bdd7ebace4b0c1072cdf67231a475045990b35ec761e1dc1dfbd0c402296566eb4b9462979d33c9d652a9295ae70943f38adb212b48bd8ebe82722b1712ab6a3be6060297e2aa54e7d0158e4aba6975237e7c7a1e22b29560b8d262125ff2a6e5c1332acd0f6b5ba15b4a82d3631891a01530321830aa8f2e8ab6b41bc5b5356957a4d0c3bc3eab04df7700305a95d0f9cd18d486c675c963876b25b1a0f78e245deb40dedd14dafdaa9d614fb06eb2538c5411e13be116c76fbd3377ff212eb07c5c035612e4cd7a1de2ceafe95832eff88a9bdb3595cc19287fa40b8d244afe9bd24dca40db49893602a59640d7a1b8e7475825b09cb0cee111864deba9d3d1beac03664279910accb9fac534ef099e398d7f6e3235cef7685fd1ae46e47da093135741894273c0c3486197c26057044b10faa57244721328b47e611633d16d3e4776d90309d68ce4a60d3ecda26c9f39c1c6da67ff79fde4977efc5653d79ad86c3b53090003bb72e78aeedcf4c8107185d9aa65221df4e2104640a1a083845c01000370371fea2a6bc8ae43fbe290949da4e559d3867c16df16b143fdc807616f51ebce8d05bb03c2b0bd587b95e3f6a15d907aa9a5b11622ddf4c81ff9fda4bb49d3e9577551bae649cf64ac0cfd646b02f6f16cdefde09a55e77afd16c74e8a3d777d80b7cc42c51f618a3c467968631119f11ca4385f0f5713e37ab1133b692de475db1d44fbfe9d274b9a09e673dac88aea74ba88cde8db3c831e9b5a0f1e40261281e5aea9d4dfd48c5d9e173f4d9cd56fe7fd610909c838bcbe1d6c729e151ecb4caef511a36a14b03cca7ec5d0feacb4647ea5212a11d18cbcbedf78443127680ac0b1bb65120b4197570288226830e2a92b380e32387bbcd3be2c77d6c7722054d849be9de459cc1832ec3ac8e7f60fba9c81cf5fbad37d228eba137a23227d56cd24970340f2b7599aada9d2424cdba8b50c2b97244dc83f7391e2ceba5bc0a11ba547c142126c791265b33a3db6238321a5f3273ffb01e42adee17b898153e41818b91413ec4f6386ab3dd48db875afe659db9eac94d16f850ac179d087d93784d607349e8711f5f96fd514e8d096de8b4a74122ba914520e93a11fa4adf006700e122e2531e1f39340cccbab4862708d69c117d3efbebabc14a0231916ae1ee8285727c9fc980051360346d53dfc76aa5a11fb1fc8f36f95f741e913bd2cd1031e508b320abd2d3a62baa400dc439969eb44e6abf8223b29d4025c3d1ca08d2dbdbbf9927c625270543e8c0cb5ac5bb5d504d224e66a1895719e4f975d819a95e54cecfa59ec8e385aaacbb023772fdddbe093afaf5a75e63a62d51926254e5b47da1e9b05851196644b9180734d05810dcf3502747c4ece652b67674c02aae74f20d07de2ad5993b3a68d10207eab6be5be34e52ada655aa96c1d82df9b24c2acec35e8f0bec9131c20d0ad8936880af87215611b80d07d7a741a12d8145bd05066c6ac171afd8684b92f72237bb0e4ca4aec1ec280e39f36928852d5d8d02fe463acbad8ecefc103083fd4298f399bb254e7bfa166638460b760ccf2b0f5fec0e3875206bdc8ce096274643824acfad71ba06441c74788356caebdd2208f6f077b056fa9d85aa4357e93bf064a776f5f3b0f288d0afdc51558c8f25cbee17247364c2bb24637dd69017f92bbb43024d9c773439626a02bd0cd44136a642c9c5ae593f32eada790c31a6704030f2e07f1173cbc0dabc410bf9864214c298a6283b3631acbf94b8371681ba81eed1aa81ccf258252d7f90fe733ac770b9744d0170cb554b39e6c72e05919cc237f8f4d7f3545f4d2732f4c9473c77401dcba04c0fd33efc73219f31c08dfab26abee9a7cd4ad3584730768fae899fc", + }, + { + "9c73ac05648e0c50a3ea3a8eea70841e8e06669c1e7520c5e25e093769c4b005375c0a9cea16ec8e00261ceb96a00924a66fc0c4e4e089c63e93fea857aead8e0ab82af4ce1682cf3c9fbad23fc3f7e632b7aa169834ddd6c7db7e1e892cac93e4d787b2ed0a812aa93bfce8fef3ce30ab794743ad241974ff989288c43e1ba815a25a03acdc2d5517293e161d0c46c8858d0b32b124a6b0bc3838807753288cf6838fa25fbcf876e6368c0342d3cbc860d6fa12faa1c2b7d9fb37504e60dd44e36ce74229dfb80f1545125718dd1f78b31a8aadbb4d6494489ce596fcc2dbdf2ec22157a1d966b61e780d36552daf084739b602861a96ceb67b65b23d40916c02b2c3a38c2a59aaa266e1f8939000dac9b6dc50d1731e87ee833a2cc3cb98c57e5b680a85c1b428289520bb252096efd7723fa8e55d2fd4e16900a435986ab3f3d2bd799471a1bc07c1772ce10d1bb8805a6065b8903999f9393d2ed1a7e1c57a9e3e0e10dfca17a04143814f5f3acfb99a34712a6e0a24a7485279ef343e69d27c77e25b41f9fb833d7cd29cb6a15551d5c77b43d19feb19f2640926a272f81eeadb792bd474ae11f080ada72103f8f7ca733a9b1325b50589be2b2b3023491afec246d336f4e4277592ce9695c68d5f39c8fa4cedaf51776d7ca29ea0ecb89eaefe71e5f3560c68e8dafe7da08cdcd954d626418677b8f3f45b9194474a32f548a4da3bfae6a3e2c0a25f602e3b3a821160c397d77c8bcbd71c5f1e669213af36eeea30d48e12953071f55eac2fe0bd8fa355671fe032f6fc9214632428125a16fc8aea8a9c7fba0d7518b9a4f876349ccb9bbbabcdb2a85fc60b83ee1ddd041967efa4036e5e10e377c9886f40bc0b0b57c7b724795f843f6a072e87e532a04c21445090a360731a2afb896ab795750e5c2c33d58bb714f5be427ca3751df09661402604a09a1eca95a8344d3daa5b99d68e6e6245825704c5d4a73af197d052d7f75778917542261d77735a21cff3f75d6159a3e4b1a7a9854ee376e6b3c8bdaa1f353b957862b2efd50d10a40007026261a546124cef979ad20d8085d53e30f5736b8aebcd3cdaa349ea474af249ac53eef2653ae1fcd5b3095538de9368d307d45df2a19acd44e3b78c2da9d5d9fcc4cb61feac5dd35f66299845bc0018c3d476b6761083baf33a4621e41cfae0e0c642de729fb2d206db6a4b976a635b3fd911b5e9946fddceb6feb2d2f893b2bed590317442037a1d6dc5b5d72910160221cbecb53bc983f1c736c3bfc9757e9e05af1248b28d651f521af67b2a0d7e4bd86a0013338404fabac7b9833c372142e6338a98c0efb7130aae8e34bb0c80937680a7a904aba3be735d41af9462f17b967b13566bcb697579f8a9340429c77baa6e24ae1ac86d8d25ae3cb9112e34a7a948fd141367898c5f33c0635c87de06f603b510cb229df0d0d9a9e107de88b12686c539ed4fc54c8285afde0c8ee502919a125cbcaf4c8c89f56e90d3f641f97c07326956f7b5d87c65b689f39b8b84359ee0f14d2c7ed621ec67f5e2a8ee5faf21c805187edd95e3941ed62fa95a65473a569566d46b87c0d27ca37b6b022a8cca30a4480d392ba15701d1015b3648958cddfb614983211bffc4966ac6c1f691f19bd9fed405a02c06712d62a775f73353f3949c76b6b7757a4ee0410fd6d20071abfe46b09e72b70f9f19b61410ea67037e037934bbefaf09cff018a5c218176d165d1eb5cfd5c46eee7b82fe65ea02e3ed7b18a86ac7b139b7c9df79e1f6e6f85304ad22d97190c7ec12c651fcc835ea434d92ae1444e7cb0dc644efbc2ae70f2f94310805c1d0f2d49643d05e78baa1c54d4fd99137a49efde88dba1374c94208fb4a0ebc1a0090b043610ebc1bb08168ff5bf936ff9834e825eefb9ab73da2b287b06fa2b0ff52f46061b07c1131e4108cde478c767b749b696f3520acd8d3338842d53941282da289dd1e9a0e02aa9be0f127566c9bf2d50a27f6b6ffc9e9880bbfc14ce7eeee70cb0c0ad90fb474efa69b46123638e8405fdef65fa7e0e7b29fa8fe8696edf661f9003a08b4aff85a4a3e6d817655c1d533b834da981b8c37c38abd5977b3ba71b3f57967a471c2eeaf2f6f258431fbb7e92f91814b1db80ea775681f282290db170942bb7b04aa2a331950b74a4b6e337affb4c51c6cd4c4e13ce3095e73e4767c2731f72bdb225ff572163fbd8573378427fda194d165750d487f6bbb63e1378a132fb6ee5115e3c32b2380b096b735bdb4d651853bc7928346fe3ea9df7534f2a4eae1f5ffc4b82ae738db7df0103ba4e68c2a2153bca499bae2439a57778cfc616df16032aa8a19e26597d275d2775b5ea17cb25d204b18028eb25a053e5666ac47c6def151f7d4b68ea62c601d87bfbe04711c24bc34274be6815024d7b7d01e7dae10cea6e485348ab195a83854663cc5826181b688cc9c091dc1e0d491fe51400e20e6f2a51a7d56af258e038bcbc80e2c4ac4b41661bd33229d07b39b59f3aa79d99c1ef41974a33e02a7cacd6fd8f9b99cadd0fd6a031f070bd3a364c64ddda0e9fb94036f374171de0b3f4ee3380780e6d77d50db9d58e670fb4a364827d631226a3491a27602808141ce657ad6e560ad62b088ff086e6f03b8a64bdf7c7d01e7b19289279509a9d6d80e50aef3b05b5561e4556952c46d0b6ab8eae735eccee77e570e1360b7ea38c53ae6b8eb420e4c2663b57827228392db6e79105a47f7d89e06ecfebdd63783101d3bfb5f494785acfdfed41f8166faefdf0b49260222c4080ec2c6e4f949f41784f076ce37fc7a34fa4e547bb44e6b9359b4b95cd67d64e4402ac83973bd50f8adc7c6e4c34019bd8f6d3843bba3d7155890712e0ed5134e00db877398d86b459f312a6272431f01b057446bfb1b8053acf181bac79408c7708f3a0867a64e06d7786849bb874a6bdf8fd6daaa572d5648ae100f4318d6b3a811bb0fb709168e817ed83c0622a7e5b17ebf5cd5ecb21d9ac32ddddb039083144c93cb55a95ad72732132d54bb120639d1620ebd142b58d75835b35cc6367012c93c6772963e9ac852c71c0dda2246ab845469997fc170d8f62334bc5aa4ce23e036967674303ec6f75bd3d17d197d026de69beda70bc59d2ff95a899d28ac7e5e42f4d37233996a8e6d3b0b86b80df49ea8e145b4a6e3e39f3d6c3c6518bac45baf97cde23037709d737b242b8918ca31f90fe59ff2c83e2f347a954d3559a8e4f075c620ad36be20b1e24b3afa156cf3255192171ad0474e4adc9b7f35436325b92945665f038611e5d14bdfe7b7d20c09642323346a717f460dfe7b5062a0098be66febe9f5fccfc747aeaeff81ba08e5dd2b1a489c998ea9970afaf9aa03859073707a686c492fb3f7ddb27897ba5e75e578bd82114b2ba85525a2002927909c970a04035334b64b1169c3a923211e0999db8baa26b6537cdcf57c051c0ca1b317a5b66ad96cb5ebd57994f99ab202348d8ddeb343312f1f26ab2442b8c5f5cf6bab394418ef2fed68c3e60275e836027515b6b946e5d86d91fdaf49c2a5182d5051726840a156a8653cabda25e1dd9af693533d782caa09295952ebfe6a194fbc8bb7fc2c0da5914a506c6f31490928dc5d6554890f5eb268b09d671bb6b6d7416dd36e7b78ffc5c86b34fab43d22909a87e5239643d5fef373650e291be56b89b9d90431d8c9fa44fdf4f83a1689d59d6ef833b1ce31a44197b36ab298d53b51ae3f8387087dcb0571c340874c1524ba0d576bdb88101c1fc387d25b5c0dad0b4d309255ad5d5b1e209ba56db0c927bd209399a8a3b5c8663c9ac199a76ea4f49e364a4b93a569b3400e20f0d748adf7db46a07efc68e43802a5d1a914759eb2abe8fe3e8d67f2cd7612bd4d5a6a4535b1e5b3ad4d97e54f3db7f8512c9603d87e01160b6908d8df1b952c750071abb1565e5ea3f643f233faeb84278187ff0089150bf21ee4d13979fdae796f592ac5b88869aecc5be1c64665edc8ececc87502d36720b73859313607aaa561d56a195dd3c7292fa8f0750ddd3df9ca056fccd9d6ec900f45c1454c6ceaad4154c69e288dc85735b8cc42950a3c5f0fab2be8811779905c3ad5a9a6bf56e7141d863caa4e93e0065f229b695efb790926618b3eda1b9a15f143bbb09aa3c4b72900617793417df364185cc213d5cc3a375778117212266356e214f085d8a7aed908256c4aa25faebabc70ce913c08c89380da06920069e8e27dd867567f152f883a9bd2dcfb8097b7f065482d6d11c0edebc67feb3068cead403503c04b324885ce1a62c99af9808a5ec8b7cbd978b8c43e37b06e9f7e1ce0b31fa0fe52e8842002e6e99cdf69263d31de080b56c0cf94f77f0397fd1f77b13e17af90ff33b00119999df802c33534a13d3ff7fd0e8cf58e8f8c8bae033cec1aec7d191f2d1a39c7b731c97a67fd1ca43c13a24b9f97d92e2364dc26a1c9408d4659ac7373e53a2a1704a47e01c0223ed4c489735b62a27ec67ea46747e4f48d3da101b0863bda9d3f7f1b413f3e7f130208875e6a29dc30a78198ef658c7ca32d7d53b4b92e51f8ad6d39ecabb800adc0870b2ab0e85b5769f346ce7fc371ad40c561f9f3b2f2a01f2b8ccae48c78a41383cfc36b2a1bd41d61a39c24144965d9aa5ecc5d506c7c7cf9476085bf049942d35caefd77821ad925b7fd3a006213abc1e008114c848d45cbedcb8af264cdc5c07bc338fddd1123940e5d95717040325048439dccd1e298bead22b011ef76d26a390a68161b8bab29e8409a5880cca9c8104694e1282c9fd64f50e73ec6b9a9ffc31115de9cc0088400a2dc806f85487fcbdd60f409ffca584fb197156b40142e512a0dedea1571ebb74d6b26d3b4a59e9105929a055cf3540e8a6a79ca7ea71ba8b40893c9797e81c6e9a7999d4d382e52cac95727bcac354616ae1094552b3d0a33d0d3ac4e547237fc0cd54944039b0eccf335889f6aceb518de496e0986783c564be8a4a05bdc9c67b1e5abb480b98173ef091259d8c772b611e0c09758fceea3e59243406edfa71fc452d4450b55b8fa5ecb543692c6eda3a6ad3bfea929a18ebbe5ce2ac4754989c71dced37286cdd1512107e4e7f4878da1c28b4beb2dd9a712a8d1d61d1a5fe5382db8aab4857b05a783e98e77711c1933a7641fd43dc6e6e597bd03b11ce8e94aa094fe250f03cc92ed5b0a5e7723911e87b0f3c476d9aa0d96adbfb395a8fd353cfb5a4cfe27deeb82e849f90bdb17928b0a5702e4010f7aaece2d43772a78b325d2ff24f9de0f7bc65974d2348c64", + "bf96bbc17abcd1f56a9f22ad164d25ca72f8c996f1a7a66d6effe140336da4f20460b47e1c8573872496343be35a055552ceec437692b0e4919224c4ffc8b603286a8245eff5cc148b004f6e5a54c4ac22b0f09842a07cd332a09732694d3591b8b7d6a7ada2bb38a30aa7fd5e6baa811b9a195d3a96306d", + "aa2f714d3a184a9883f4199e8e33fbc9c92b36fff2d59f07a9d0d335d7476e81", + "36c79f9f14d431cc8c077439", + "873d0617c986dc9d83e9cdfc50b1f916626a9d9e1c595dc7ccd99d1e993d25d89b04a893c89e205952eef8f1733054bbb55fa5e1b07135787d4fcfae226737b50cafa2c11276e8708451be9b4d7f662e98ef6b705c5c4fc64588728eab1dfee22a0a92bae61828a7394977b0ae8a3b6d0126a23583fec025becf0a72a28891391ac1495732a7a4a1d43a63ed8eb37b280b6d886096fbc4f77aadbc5e441e996334d0e10cd7f3dbba9bb7efb147297986509a07735385c681e0543186dc166291edc3b4664f5c8ffb0965c85bc30ff5e7769a69609c69ebb68f35d104bafe3dbd3e2a40e13865f19bca3612e48592aa930eaee29440b4ebc1c0a59f1c54519857c929709b086bfddd6d4a30940b592be48e0067976099efe71f45f956182dbb300e8076e1207baa32d59c1afef7f34171bd66099d2d7f07b39d16d0f8b085185bf2554c6ad66bcd656f07979e8f19575a116f5c4fb9700ec3b46a3254f28afa1ed51348c1af6dba26fd398098a76d7bfa2ff195eebab41330ef290bf75205a2ee570a2fa46bbaa74aa6ba68a0e63e2731dc1974eb44794f3c89ba58cf96f7a070fcca678185711d97cd9d7d8202351ed589e0b05a7a190e60ae4aa109254a7bcf7013f8addd07a64145e21226795ff7c7b1c225f40ed7c3552da8eb18b9bc9bc70c2e7ecb10c8b20c54f04b6e27b5044a7a67b558407eb330f2083444375c022565c45fe817dc00c7d24c23db320d15949b0b64fbbaedd310e73e423fcebe6e1e98a5cd232d97e6466642e5e3b23f06525ac1cdf8688650cd366b1b7ba2a9033e62d836b14bb73717757b76b9673671bd3d3b2a56628f5a309f3b86ad32abac0590c50f7c5a22e0a920d88dc9fbcb3add08b900a2a2fae4178aa100a0e645ab428e0e79bd90baf4af2755e48262b64838a6fbc21226e323c0a1ba5703e30738fc7b5a7df9eabec6199df5ff6ad58f9df5a734ccd6509e53ecb3de1c881732e26e52ab848a0335b04b25f2254aaf8c130c78b0c9a40b60d402673ac7ec7311d0b00c45bd176bc73ad81c2478611804f59e3c145110aacce922e473ef346f8acaabdbb9f313dd3f8d0a937d0c048e5af789e2e09a816146f9ea28170909caf2572a2f6e2d0d511242909de2815e9ec586b2d12183ddbeb7dd70f32424097e2ec28b4ba62cf78f547e2057a4c050cccdf6b582172343742ec8c85e2847efb1595bccf89ece3b3ebba824d2f097b1987ec26c6e5710544739d54a714060fa91b7995cff0161415eaf55758078772c0271d9d282354e47a25b673eb11497a6ed8db82267d65ad47412300ed525af96f943c5336b1de88676dc346e7339230032463d305b0442f934018bdf0242768511d20474c6ecc82fd752c0c0ca5cee1f3e06e679fa5835540f97870d47ccc6bab233290be7a3bbd4a73f1dc7682049bf7b3cbfb6687479c18d246e3c07161df5c889ee95d39cccd989625a8c9e80f951f8b1832f6378e05daa8566477d7fe547e49ae6e822a68de4df9fc4d6500d5219c3d3bd8887bd7f695151ba378da17c2e750399f7482973510a386721c59683a86003edb9f0ce1ea89bd7bb8a25c222df7ebedcc1b56c8ce18f367b2cae720e0591b477f6ffb498c3d7ce59cabb1b01d7cba84d7180b4b2a165d4b889a6ac361720e768f2913aa50b0b5c88e55c35bb4df4fbc4460338809605f1fd445a2bcd97ec1d2f269b5e779a18c8f215bbc5555c745424484ee5436119eb8754f5e9e91f51fe715353596baa1fbb0a690e99691636e6027cbd4b7be752bc278661e2677070ddc12dccc262d3dd47160345de51359ee8dcf2f61044f95dfdaf323881b2bbff68af6572348f786f6e52d1309cff871ad58148307d7eaedc93ef037922b6092ac62171433adc4934884efdee3052ebd60ee115f76f9dbd0eab7c4c0a77b4ce8078209d23d81d957335f331965b556ebd54732327b5aacc899f9ed0edacad9eb98cb845867f249efb0e1a5fa2483227f78decbf7f1f32d060ab0c01eb985d83920b2cc24b5f9a0d5d869e980129d3b78277fb87e5cda61e340a729d86b6617b8828dffc7c37d4c38080ef3515c2784935973dd184e0a8160f84bb78bcd8a5e691760be4a4d41ed6512ee436ce24650c0e17e7d74b5e01cc39b21e21514a84db262d673f24a82cfd5dfe2a162976171c538b24af16429bf8ed5fa8e37f89ec6e7d63ea1d83ac1087cf89e8f43161f225108889e922493d973e36b510074533cb1cb22174d21c4076959e4191a5df880a8b868b95a9cb5151a7ad47375fcd87725660cc0b59c88ceb86984941268493c49b8aa2baa8c531ecf497853ffc3d26b926a379e72188e246d42073041fbca453bd558f328881c8f8d9e099e898a912530c4be499f2b32229c359ea10e0befe6d94cba5ddafe51d164898166e890b22fd1eebd5724451511dce1f8f7431d712a3f1e50fa5f609da686253311af255b84b2106b09b803e94b51729cfa0826869945d46b9606547e7e33fd9961cf15b400d0f5e01d8fd4d92a83ae526934059d4514b9e0005317a70466aa0b6086d5fcfed201d958a0de55fd23f0919ea29b8aa02440031a9fc206b9feef362a73430a4204869354ec81b6fff92eca97e7f1bb12d25228eae466b8137b4806895ce34b57dc14bdcd107fe160776b0e5daab150ba06976eb884eaa574da393af4de355381c7caa4f611a2ee70a0c78df93a4276f55e6281997b4aeb36888a6d9638cc95444047e5202f41f8bdd787f1ff44a648cc7d39f05e49e5d6989fedb194c526780709763da81a780db0d1534a466cce57e11dd3a4c0e273d9873af1040d52a90e20101e1f80ef296d45769d204cd5417a84e022b6b336675d36d9cbdb16b0cbb08f5e240012967c8067c92f97f981cd19d449084400d76adfb7c610abb73bf21e161db04debe6665fca79d71c8cc50adc3ecf0e52d07773478ca97b8e9821a5704dc58acc647a5bc618d2b681f17942c46c266c73ec211ca403a7d47e42e12c775b370cd500d70a4aac7124f5f6d2d4ca78e1c17a96426c326bb60379ceb0c84a86200f3b450e5e9aaa11f45440f5260eee7675a8b9c47fbc58cf18a651a1dc7b39a911442504f12c103054bb50f15381e512dc6e3af7b414b3db26fe767d83a2a53d7181fec8f6b196c7874befd6628b31797ee3c9260c7b7853b137893e36696e2a47277add98462ea9a0edeb7d2d3c0f2805fd7db64c2c7eff353ff2b36f4de862a42779ffd4dbe77b6a79bc9f4ea3e909474ead915fa3fa990bc82b83a670b163e79300b627fb91c4502e96bb9dde00f716ae6ad14dac647c9f7c2e5b2e505708b5fee996b8e9113a8f4f2caaf414061ee72e76b8bf47ec4f781bd7c589adebc2c267448247e30d659998d8037783494a1fdadcc819d7ad7ea2674f75e10639c3d3055046a00814ddda0e463185454a4455d60b9780250183d591c3db6f27373cd2ce4f02f206ae10a8c32d71226e7cb8d5b05909445977164983c0073434d6c0f2bb62bda66a16792d6e53a49ccb5ac3e285a6baba935f30e9d1ddb812a018ce04f29e2009ad678ba72b6a7112d6e7cfcd3ee7b058ec954a6fd7fd01018a6eba6209687c3130de58147b07bcfa02ec1caf30b59daf87db4618b4a5fad34cbc8014a7529b9458e05eccb9a77ef1621aa95513c6fa4003b0877ffa6d48805e7867dcf53447caf348228ce926233f65d553146584d6ff3dc3ed3296db9bfe69dec6a07add13037b3aade118b2ac3c52350b9691a6cb32356ad93377059fb8ceab68de38d96876d6d383db01f3cf620e47cbfd471bf6dd1f601210482f7c3bdd4c3bd37dd0a7507e1f0fe515151634813dd4ecefe97b52eda28e7a7129993b0af311abd3a07bc463f3cbbcb4fb0eb265a5835663fdbab0d8b8b5a73837ac98ced6582348fdeb41ac8ea9e36f9818ab9c0a41bac1389a6b518ea17df043dd50550f32471645791bf59855ed695b84919aa5cb688e569122786660f06e3a919ef9cf18c355bb397b86710c367362cddb0239aa1d32d489328e4bf92b3abdc3d0dacd76ef1a1efa28fdb848e708aed6780e2d8efb19a2e26fea56b4440dc3eafd796896d73fd150bbd967871f5e6ee5db58995f2f85cc2a15077d7d472bec2e30430af6891193ef03dfc7761e2b3b3b54a72d4f1084a8fc541526fdeb0633dcba14e9485b43065aee8750397ea88d9ff13417149e0fa145be666e6f4afdabe7ad8e4864e777c20ee7a2842db44dedee22f3ce2f97d72919b9ff6059352083be816a7515c48c5140a99af8e81b9e18b10074dc73dab55fae66261421629c8e323d8134f08beefbda555660a51e4b55a9ba4573bdf0396cc413145a941c4175aa672586f7676027f9fe211db87fe07a23962f5b1ad8f566f0d5b13c5146457276f307a02e1e13d00c5032a06d225248215e4bc4be1b672f1eaff16ca95da42513fc4315c7a6663f9101aba80224acbf0c87fd3a2ee9dedd1808c1247c5bebf3cb8d77377a508ddb484ed91203a438ef5ed3ca14e087102bc5f3828d8c3437ecf5c92eeec0331ed93ae33520740abae9b7bfc45f097da70adbb9b9b879e46a7d655dbf75d89773f737b66fd8a8c13506cff7b44bd85dee279ea7053f3ed8447fe79c400cf23726fae800449d27af5e342ecf776378e2eb449a3af27a40fe4a9806487b81c942bfe1a4b0fc146c971a13f83669e0189e337cc9fa2024864436189a9165ade6b864698ecb797ea05fed0d60f0ab4b92cbae36c72ccb5aa45337cc02dd086afed9e5522ecdb75ccf389fcd63c5a4abbf60908e39cb3268c76a08687588be67a856a841eeaaee8ed016f6640ef0f5acce12ab8bb58dda380696e3fb22d0bae0788c4fb79d00cfa5ae3e479dcf7d08b45f4592c2d2a7f8081d5a9398659613ba4932ebfd7382d516b2648ec4ff4477648069b9b2e4decc89547c16ab82a0ad9cf293fee5adb17cea4c95ab7b8e386dcae6acac63ad0d1d13656dfd97d5623dbe45230de597751321bbe5a03c879c303fd7a0d837d48141decb6df4f0865717628c85dbfda29df9a8a69b2c956c75fc66e45c08960c23bbbc706e48395057f989dfe675305067b3ed8d046db339e504d5b2bc978ab4dc261d8afb325c5e794ec79d63d8db53f9dd24b623fbcc202679fae8f7d39f7f7e0667b142c714b6a723996e5254ad2ebafd63c3577f8909981ce6b3eb1a6ad67a4e93c45ac3b34587d153ec5ab67a2697a9741610d5a176cb9b5856bdccb98f69421061c84811dd6660495d9f30548efaa69e36ead246d997c95bad0ca3fdc1a08b4be31b12daf211d3e29d585cdac48af8f2268ec304bb35d", + }, + { + "ceb1f819497c0d631a9c9616655f419b5e3470fd3b19cd0e4fa556bd26cd9df57e960ec7121b2a2cb7c0421c1f84b77eb8277bf341490190ee574d1424eb09a281176a933394bfea5502077486bef23ee66e3127b732b7a58a04b9aeefc35170dabb030d4fc3f8a4c5ff194bbd0b89a379baca30ec81d576868f25755276e62c31e93a80ac322571313ebcee494592c3ff5cf3ecdec962645887d9aafdbfd62ea910af5542d4c7731283625bc9f41ec85012b42edb1792339e6cdd9c2bb3cad4c4792a064df17a5f74dcbb3dd0d90620ebba4fc6d1e1f9704dd60c798ad64d4e5077549d68cefdddaab81a7a91209b7ddbea43accb3d1c191328929dffdfeb4f5740ecbf0ee99cb9a1b73333d7ceb0b2b8f35f84307b9d44a42fe1a30ecdf2650dde251bc8c1d46978089c50d64c028f40611370ddb0b481df9624ed63165370f4788bbc396026b268c2023e0f04cd4f66e0bf439074c46f0ae85d6dfeb0ddf22868af61c8d5133097156fa61a3cf5801db5c3ad29871d336f7aa06d2a7d5f52e50eb3aee3c7de7bdc4d21f68a1776a7cc3954f5c071282febc89c1545fc672a0a1bd8eee2b769be048ab58ea12b356d658a6225fb8a55e752f1fc97ed64c2f87f9ae661514f1f56d9d4e47b001ae865a44b8a9fd5df8628d183bfbee781b6661c9cc76debe6c3c5bba840bbc228206673aa05498a8c715b0f3019f6b2d05cce6c233b5809ff1dc4a75d7f69859fcff94ad442d460b32f6fe348659518c16385e49fddee9efab2455732aedcd17dd51b5117efb2ca1e21ae6787437f48a7042d46e11be4dbcd2932ffd70fd154e4eca5fcdc57c6fa79746100b8e1485fe575a5c79089a25eb2d55d89e42eddc81b82c4f7da8bf153ff5353b7349b161911bbe0a14483fff6585d7f3c8b5c04a6dfc99db9548f0c53e25f0b16fa212f0bdd10ad2193ac18eb09972795f42b3bd3f4d98c4868989c4af7a760f1c88ffda59faac73256df1d607644f56a70303d6409c9ad716149bb58f01b4ab8ab475e4af1257d47049aa77adf9ce54fcd22b3d6ec60484da903a6991ff052ca37b01428d5916fd92c17530bb3385a805b0d57476e9f9417a23ab1c12a038b61b3a0898831f9615d10b468c3edc24448d09b8f3e3a2355dc5e069e880929eabcc97344fb6ca5587c5ac1404783848f531f1e915941e7359fedd328f7fd12b3c685f8c1f29d1a6ef7dbae3e5e32cdb251eb43aa2d2ae0cc18b3f40fb006c2778cba387e5852ec4f2d9b8e8ccd5b3e1f4781c974aca940c45d35d30d3b9584c750bd45a80f32f73dcd85c99ae107b92888839c342cdcf88911cb974d611b14b1d85a59e88c502559d6eef3b7f5addf7d307bb25c57aae669767db6d798ca887124e159b0317e09076cfdbe61aa9ddeda189036703b1cd9b1998f88325910a37ef1fc2e227a382ae635e847df8625b99eb6ef0ef10ce7a2a5762ad7d03a7a4e2b767c4df0b477d6e9601dc8e6438184f97193ea7d7a8c22f1b6fac1f0740f1beb8b68db40e0b22940cff2261273aa0be43df561b88184a9377e6a27f27942dd04abb9448b6b6ecb3a60f14dd39b58b8d94e1991cf9d3a071ba42e0e1d71eb211ca466a70fd4724a34639707feefbfd73dd9680d76a214924642a063b38b85cf30eb763fbfe889f34b20fa4a10ba214d938a5a092c6e9b73b13bd664c75b34f746aa360593c0f8dee0f328f0ad4a3e40d498490007e573b8204a1ce7a550deecfb15f18ed5ea6cb5dd95a68adfe4cab37c13b383f8273b1971580016a8df02a3f4f431c9de9e7ebb33244512080fc5852278081b9f4434109c3427441329e8071d19d0fbb74fb6ea73fbfc7c0ac1012d3a0948d94d7ceae9b0112ec43a16cb582f9c53e7eb0ad15e05ceda108fdb3dc9e585a332018d1cb19e4a75d86041308fdd8476c88e4826931601a3a5dce06fc16512f4669f10183d5a8d15bace4649abcac07358089aeb1e9b8fc3776f3239d5442d3be33d532097e13651af7c9a5b465ace9e626889800318447b8876b45dbbe1989e1eecbfb5cdf5067c71a0d7b7fba6555d0edede12f7228d7f9841dc532274f24060b1f52da6fbaa179b81ce962723f43601d248f8f4d5778c1653e038c8d27828836d562968004003810e9aa9318edf3260272b54fca2e012f6c04abe92c2e6152f3c3e973c7e9abe8c3467bdc246f0226d1b7669bd577bb317c571aa8758bfb694fe4dd17ce78f091cf6c6de3cb601a9d177128fce8d42e652b490d90c4f8fa04ddc71cac300d3dff699be3250bfdb2136edb0057af3ebcca77ba5b3ca34531810c5e2d4c5b5b3bc4e71ee9e30cac067b7706c326357fe0ad2a4bd9cd811b4e9d696bd9b4b70579ae246381210f879c769e5f9cc3cf8d70e9c94ab74a55f5d7bf61a17418b6edb6db4147fc40cf98c75de85421b7d192919add48e5334ebce2a06e56b915447fe085b7dcd677659dd55de1f705c389975e56e0338a2ef07ccf5ec3786407e8449d9011641786f1ecd4d3d3da975d61f5a442293e6119ab20686ea8cc7681010421226838a95a157e2de948c536aabadafcd4095dfda48e5613272289a8238dc945e5f1ef30075d5de096131740cdf23da1fb8b9fa009e5b321083cd93bba9271909460c09bbe1e8c54319394ff85c291814e21215816d4791f01424abbe4cc4c792d0d04db1b812f4d24b44caa76de2bc50f4d1d1611862512d87fcebd3c0b2659082b2423bc5360d107ad7b8e8ba7438ae4509105d6b618af25e75c51e272aafaaddf1e5a227f2b2a2c96a8a83dec23223cb428136a30b290181ee20a819cf52f6c03798e7294a89f3b5137693d5a8b7a0ea38d78e43008fc4eeaf6d077ebffd3ef7952620e0af1395c38a289832df391d1710ab5b103a1ffeea8c06684c03a74399cd63797c770e3f0136d8331611502d21fb883136a82f2034358880392fc3d2fc274b799e59b89f8f90d2a5a123d3c21e5bf3540323743858fdb8912c7c6329a3aea241075ae097ebb23c8cd50f4ff46b42486e65bda6beba5f4fe6dbb30f7e61b1bf690c9f00f7513c83274cd21bb71563257a20cc38da2b88c1063bd0849c8243058ee205853342085a8edb7545f0d96a6af936a3d4612b95676665eb02e72e0875100dfa444f039eddde1422ceed8d38e6c3dbba25064f8c6cb5786f9ca67712b7840cfbd40f99b1edadd4bb9a61f48124cf3b49d68bd642404eb1dcf428eeabadfba6810a4032f8ed06b38867a7098c7744d54dcfab8f0ff941ecee69da9916d54097e080cad86dd08bf53833fec4aa4399f7124586223ec70e2c31e8c647be06df9e86a976f37901e9b134e775de2a0fd53d545c5f92236dbf5455859c138b7bb1112427049d29ed4f5dd5c43cffd3113c276d9bba910879e55efe817189fc239a204a9ebe738c0dd161d10d60a51e9dcc8c38861d41ff029ffd841086803320a17ebf5ff14b6cc2ac3dcf0ce2eea9af7ae23597233599c2321dd2b99e06d93f84989e75e30a388f47079c2af545d96f270e064a43a00c76bddf2f5be5089a69a138de844216148a1eb0b413f58d831d9b8967df297455e7538442388cdda12d157fb25896c6e2b47696c76b234a88bed4f09dfd64f2e4b77627ef03049030190fe271a5a853591ee9218a0c6b12cb3f02683d665b211dd1480cd44c9c0566ace7d751902babae14cc3821374bec774d54b4b4afd5d1811ede556a7a5ad02642a878d2d32380e7efb9082604f49d51495105f827d77945b5cfaf2f2980566b28ce3dfbf1bee2e077eb067bdfa4cc28f5d2211ca99a615e69118d9391e3feb9b13cb4a2fa9682718189ec612db889228aaa3f3345a091aeb11f41420240fbb47caf567646d9e7c762d3288f8bb2b1165cf049a191db5042fa9185fcd180b04d3007c376e0aa3d427d66d10918821f74736816044366463df7cb3ac94cea167cf1daf2d1842f130295e40bad672a22da9238ded69e241395f04d5e3c3875b8294faafbd3d90ed56ff3e01c5a0a3e349d761273143686aa26d408620c7d1a35ccc430a09e3f750d3256298c6068c0fdded270f308f79d2fcba591d723ac0cef703d8f0e7c051bae5b453abbadfab98bcc297ed4201b03ebc195c2e441cfd3b10c63c08868db36c320707ecd6a37593661d70a81f30e6db4a32f98e4fe6b950ace55923631c8f95138781fa2af78d8104fe39242f1fff6942e8e782dfa0d37c863caff9492f8e5cb70046d207c4630cc29c20e1ac105aef093261d8d335456961e552ab14d107cbe14e9de912f0e5d58d16b729270208204469f917af4e710123c3bc38a4b3f485f2926f058344db105b9239829441a2d8ababf04aea615c0e350846d9bc3b5faecdbeb450f38f615f119ad1b5dc748e88107ec2fae01f0915174feec37b3e7248ed2699d0a5fb2fc785f17d6275fbea867aad815acc8a6fd3ca4ea7357d197e5a30082ad5f35a9d894c0aebb206c6487163c9cc20442c040e6aab33d7b4b221e4ba4cbabd975836e353129559d8ddcb3c97876cdba360da0e0c1dd5b0cff7957a444027db985ebefb6154453a221076c997d3954b347f49308d2ee14d1676b75ab6ef365f3de54aaf398fd96b9040253813ba734829bc78a6db59e3f1c0ab4c878a72d6b8681157919130fd3171126994dcdcdcf68955ad64af8156702c92f7a715ce6f7ddfb70f60e80c92691efbfdebc8cae252108fb6c0010d303d9027d4a5e63413b5fb2316d32fb93c3ea52a2a7df50cc0058c76c58d73f5bb041d9fb9f3c3cda9bee0c0920079ce4f1ef8698ced664ce2e2b3b86027ae2b3bcbbae5bf7ea3693d9429cf94938dd3a2763d3f53937c46763ffee6579d018358bc69182b1c7158a09b18352ea618c11c45f07fe97cb65faca535f43237879ae3e0a31efd14679daf8fd2ce25eb8f32218fa20afc586a98fd908d3fd804cabbf56dcae272328011b252dfd83e5f0a5fdebc6acb04c5540255e1322de5fce9db5aa4cdccd74dde8990ae51cefd6c1edc1879971d3efb1f94dc41b2b23e9c9d89415b46189914a229b2f3e8b05ff78c68711385a00e9534dae6f79d15842aaec575e4ee0f098028bc74016cd3f8e93c6a0cb21a0b574ee63e367343ca9de28003d76e02d0ee2b8d622cfa3615d3628fd02499eb7bd8c1aa1f34edd9c2d059c6a7c7c978a5e4f60801e03e17c3a09793c5217f310a30db1965b8e328893cef20f4a899aa8d9fa28f7fe0a733813ed7466046776a874273ecfb57158483f4a588ad4f232adec5ba4ea651822780596de09fd54b1717bf04130619979a0e3d12ab7c35d64afb8099a1d21bc952653742f50c8e1c244d10374329cedd27fbefd37815a9b3112a4cb2fc587c4ebda381b2b01fced45cdf0b9ff8ca7d10b65ce42e728de183a82e369486a2e3345664e70674a5dac174d6616d90de8e472b62759df057119875483cfbfb103041751747f9cd12bb31e91caf79eb2db1168026a4707dc618f30", + "e45eef9561f3acb3672b4f38570256e8cc4d877e2998e72b022e33de8fc20f7320fe0882f2b53559e084923786e8205336a7d15f3fb88a41e7bd20767f2feaa02df2221fa7577988db0bbf61f3dfb429868688c53e130725d0279c505686f083", + "475a44cde0cc931edf9a44b0c1e0001766f09ade023dfe6b59a6af800e549b55", + "7812a320691ca8442767a51a", + "eaa577bd67fe79ce4586f43355c94528e306c1678946e4f7a907d2a8ee7f4281270502522119a8b09b6f05d864921cb515fddf6a1000fc2f67b52d0627998591e2acf5b6faf71c278e5754b2703662ce670dd049da8d6e280c2b84d6a9b29ce28980563c40e03381a49c54608b72faec9b272ef05cfa41957d9eaf3e944b22610c725d8efea90aaac6e782848d368ffc08784d7fe37ea1effbbbb34952def29fc511fb10a1282bb0b6334328e4d00529a44de3259b522553a07d524dc75f431cc9670127c15670c0df419826617cfb5ebdd8788d5f528a9eb1e61324eac5c1746f339aae2e2e2fae598642a389da671482128acf2d69814258d83de98f186468136868b729aa5f0874fef2ff2575a1f87439d64e049e4d0637e9c99ecb7275417af654541306615f30b75a6caaa563e4790dfb28fe9f0e7881ea2d885eefdba99efa7f878925ce7d33e86d888154a1b03189429fe20af8fa3a68d65ced9b690a709031121425cfcd7e1890ed9614f9dc3ecbd0e38c6c84e453e3204978ddc1ef8d7fc6cae28c61a472d8e089e23209f0c36e80c994af771e6505e72ba90e5543f6bad6dcd31fdd468b13533a0254e44797825764ac1f63747d8d6ca019ff16fa732068ee94be382c46b168050ba725379df31a98ab81ec8eb266a3c3f2e1cd95e5f12b3bc79b8b435e4d94098c6184631cec57e9d8913458889223a2a4541f34d2f9df380f34c3e541fc587f0a6cf08c82e99476060eb84709a292f4c7a8551bda3a9eb6735787dbb9d7f1e83937c2e0e49f2cf6e0ab0ad84c40fbafc3c7e61886a8629bea816972fa0afd0f617b6340b1af19e341875e97565c8eb0b25fcf68696ee674d2abdc29396bfd0f282543d2b72a239c6470f76d3b5bff6d1d064e6e2d06f9deef2aae8a259c034373efc820f9a2fdbce36cc27f35dd6386de3b49509d0c305757257f8674d958c580a09e768c0f6ef237416fd53c31511badb2e7cdfee636508482f01899e72052b46b5d844799cf94708520178cfec2b61c8980fa7dfaad8915b0b75ce6eb57ed4a01edcb4a35c1dfcdf8d60f3191bbcdfd522a0e321ea41c2cd87a303522d0f98b82dcbe53232ecbf0e2528de7e1be75569584bf2ec574687fde67ffe9827ebbe78f2e5bc4fb368f3c9b0f588c97f7a139bd82fe86eb605b8e29cee75d07b510da1b24fd62cd2fb366f1621e7dbf268b15937f7f7ea4acf6e615775a32c90733769996dd2c5aebe08ecba73e0bc4781d33971992b2764c1b08aa972859cb61b003406479423254a01ea85a348ef249d408157cc0962d1e24cd9c426e6e6a3784dec6fe935be1f6730b01e8683d97e21d8774b2e2655f85db7149e930a44524d4f86004cd687d8a528b6ceadd890707458cab62809110ee28f61a7277ed79dc41e573fd4a59fabf15393ed4c21bf4d5138ac843e80bbf5e1c39ac2d7f2147f35996eb51a9e835db63faaa196b8aef1823ad72523fbfcb35b5560582a48a25ab770e7528e4b3ef291e6f62f5fac916e2162b3b56304287e46839858daf322b0de083d1691d6bda44d66d085ef0d0ad364eebacdd0a43a4456035e58910d0b2dacce45b1c0beabc784f3620a3e4390c345df6117b86d4fc386523b7ceeaecc21233a2865ec6b63bffba6689fb3323402119db8f0665a4730b2e26ca6411db04f1bcc78ce6272159ed2665a286f1ad7758d6d90090a6fd320e697dafbdfef575077e282b825bd64a4dbcf92d1fc0c6f795154e8466ee4b318f2d44b6f81c52523ab68ff8367e01090c2623e00b4008e784049df873a35c29e0abcfae7acbf27236adba0b913d19a15b4af4996669aba4c656c317084347ca962ac8df15cd2f849f522016eb92de4de62944b917d88200ef9aa2def0d13e5f4ae09d2eb4a2d0800af1d704cb01975f6d59768a2b50e39e78116147fd6dcdfbc08354c1b4033bf6772fa127856a4072556a9f07bd7516d01ef41bcb519005c0a3b2a04400427ec033f1b52fe5fdc1aed8e2521fd0fff663e203defc39d7546281a98a502b8a470af16cc62a6581c9985d7ca516864b799fcc55a803ce80711484f6b81591d2402bb1499c95dfb1dee9846679c22853be87c84b4547138dc4fd46b4e79ad12773a5392540a595954112f0cb1d9be4d4eb3aaa4286b6c01520558d58587d9d7f0df3a0282011ce01c9c17111d10ad61b3675b1826c1ad37fc562bdde951b43f890555d6f74ac4fbdb9abbe8bc1e80bb6d52c13de8960a3ff8f65201265e82981dbe39e0d65cf3f1fb6c56e11f9786210383d0150a5e0cbbdb52ca8b2bc45c12fb572657380df369082685b3de9847d5014beaeef815d63e203cc911061eb53d89a312d187f9f02760bfa71083fb643f5d8c324c410070b7ebde250a185e7359837899bb1568a43fa3418f39c12feb03b148b924bfb98b99352b1fbad3f07ac8e4302f85d1fe9ee4bf7507972670ff8beca105cdeb037f1cc4f944d6ca869d0281653de5ee93a7362420fdba8b01a375ff08fe27873655953ec1c00f53613c6ab8b244e2fc1b6babdca5311428d06f57aa4882dc870165deff75ba877dd2a04d1799f26ebfac97a1be53a83ab77dbc2cd4aa45bd779f61b1283eae1a1866ec8a9c150dd0a4deceb2ddea1bc0f4206cd435600a8f190b999b952337d9eb2bdeb3aba2cb2e7000319056629dc1f00901f0880278509417223a3ea0919fcdcf12bff0771c7cc725bdca292068478ccb2e1f35ae8964e0601789a73e7e7c1769ba53f865910fc3d0085c922d7f7849d27b6e7503d521371351f9d7dfd5afc5df0effdf6ac49617fa228501ad72154a73e07781dc4b07765dbfa721d95cf1dc41e161cbd34fc7883a25e3ba6b03e504b2c3b98c8b12ff629b965c2aefc26d74faff7f784baf09c3fc38c487a9d1f5818261162f97e9dff70cf42eb5dbcd7bebb66d68f26d917ddf2a3efc0db1e3372b170b4cd18da507e44c467943f73648dba74db1053b53f989e481c3054bac22c6342fca2c26d30a859a1312e9c353bf921f68136de2b1589747bc765153927c31ebe749dcdff98b5da84c4b66085451b4c87fe1ba2142f98636bcb268c33f7b8c2b96a6525298814578377aa189dd73d5bb27ec5cd2110d8751c18a3110273df2595d4c3a00809bdeda70d86c4a8169b7010c9cdeabfbc3dd3266518226d0ade9bcc4825f18198c854de329fb8fe456dd3bf35d89bd9d2384f3f3282f6872351a18a2f852bf173ea4426de6d01b3ef4b4685aa82df7dc45b99617a8b8c8a0c65a2237b3eaae8267e1f6c453f485432529d973924a080f6a1cc2cc18f804f53209383ce3601ad9361afc331707be1c88b4370404cb7fe0bc538df04adc5c8d9ced94b4c474b19619a53dca3fddb434cac09ce10c0293fea04e8e1b19fd3ff3d174baa988d91cb604fadc59ac0b61f4f87bfd07eee20f7f3ffd96766dd6f3555cd48da7ecd71d2fef34ab082678bfc4dd007669b3fc7a937a5a46269baa7e4e4e43eff1b2b847ea70b6c6c23905d6fb2fbccd944251087ac00c35c2eedba30641797d36ef9d3cb1afc0e3e8930f5b605a847ee77106995bd44047294d04350194369c5a7bf246d1108e1d18d9a638be0c051f695ce86579db613cd8922e86c683c91800b9a34fe6339e0dd79472daa662f78f04f0151a3acd18f11faa4e1216222843b521fb998c8490ab8bab27fde36395b456501307d07b484b453b189fa339282a634af30fea99c9af8f877e61871fe743238b2cee6cb69dbd17d574b5106ebe4b0fde4ef42fab469a5ba7d62c23b67d857f1af6ac981c320db70cdbb6be41bbca60bb7a159ee1c85cb82e0a220064359c06c660b75de6b49839eea68c80283b75d9d627aa4500c0c0f21edafe4a2cf7ee079d5310479da06ba58b142614fe69cb236c51447d63db31cdff91485b46325c26d40dc6d608d46a5e2fb01df06064a022ddf6d5cce0147d5b2a5aba5f9fadc5e778010a924e00a13e21daeea2cd330f45536ef4f42c2e77be00bb53b3f9a93d3eb327dbf30baccee5d26849cfad654ff3ef2b035b78dd3ef42de3302e5514551a968a205b823dffb040ac9452ae3efb43219b02436d0761ca11470405510e534d56caeaacc40eaf9c47a39475adad266f5ddc813e71223800dd46fa7c02b078353f870049806ed7ba57b40b7c3c6272296667500c4b97dd2d7026698b6bc4985bc01be99e0097013a2632c71740888ffaf902a02bf644b38cf9a42528880d9dd142de967cc2ad3e1f1737f0cb8dc5c59c252496e8cfe4e53c82f4a28d9ba2bfa62b6415ba3e5e09040d7f3e3abfeba53e46575e8817ac5eca806ec8a84c7cf77c9fa86c9dd2940f5b96b25a92d4a8f894d4717c8f80a62a35a51d8511f1e822fd79e6fc27cc3f3097d9e3272447de6f223971657ded9e660ee4f8836359742ce7616fd0ca2de6656c71b212b34b8edc71ff36bc84ac4af58eb1adcba4b2c0cb31468dbd2c2b7ee6752981ee1d152c4e4a9b25b2ce87796820def34b662381806d2e4fc77f0b69d7a87de43d94d62a6a6526a7f8c588392890e96f9c51bb58b4f438eb5d197477ce9b160d1c898c89ab408b3c1d648be93b531a5bb4988592c5a8999ae3acbe586d947fe6dd507cddb92dff4974ae17ab99aad5aec9d07b96bd29489876f51afa67570e86b69321d9e565d86001514638403f86666dbf93f18e0a62bf65db333bb85a3ae12d8411aa3c2a423a29bacbbfeebb8a5bafd90436bfded16f992232360211086a3084d9fd1980dd96631820a2cf25c3ac5c19d164cf5ab9a852399491962100ca4fd640146b7ea5460b4fb9e46bf8d23d508a4eeb8a3e9fad8249ece3648c2ec7705a7414eb8e8d602549204cb437f589161fe40de1447d14efa4d738b775d0333526c845cef5ffcbaf5c957df1d8022176b56eeb198e7ad2dfc3d7ea46b125ed432cd04c77efc011a2dad8573345080d7c3cdf5cc160fbc86c4ee1959ee1b8258056b0f3d9343c22dbb2f7858c5f162f08cffdca1acc866aa68e5f1c00b74f66544e8a61e429335adf6f73e32fa87e48e1adf15bb6c7aeacc93713dbc31cdccc9b0e52f922842679494039c395cc1d95eb97ae4df3bb8aba9a2584d97a236f87cb22f00c0a078b045044a5c456e22b2b94a76a559de2672c880660f9785b76bcc2aaed780e05212415c6e73880ca110654ed155a1004af45d5f15ae8e5bfd4817440c5d3d5589eea2c6c344ca0d85d91460638b37f877ea4cbbed35ea75678ef2335a5922cc8541987cc256c8f58045028d33a1c4899cc32265c619ac782ff998a478996be6a0c5b102a664831b395a884f18e77885d860d6b236c52a8066d2ced25432bce79a31b23117f405ef4ebdf3517de98d288f8c3baf04b63b6817c46c14b646308e9f97170b7dbbf9d1a36480338d8eb7466df56feb6baef42cba75512954fd7e33961d247b7393726e46c6e94e156d5776a89ad3e288554470ca0bc4cf4d2d2b0c01ae4fcafcb65ccd6ead03df1d4d6577bb", + }, + { + "228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1e", + "ade72c2ea29cf829ffe99c2d63840b2eef9b51a9919c02128347d2e88e9f063b86326928cf6252ce4beefbae7206dc61a22d0b33c90d464d551835e3b73c1e3d6e88663deab80c35a607e4180ec079b0ee84e3b7922904e7423acaf976e837", + "43348cf32211d7daa300de8a4218543c8e3c7373ad10950765c39760f80b733c", + "e4709d225a552e90fb357413", + "562050bfb40451f27b1181c389508550a0f46b53d14ca73143da9dae3d3d2b466e9618db39e3219675d2b6eadded7dd9c741d7c9bf3c5619a521189607acbcf6b3964d469d966fa134444aa06d80749c873f0f976e0c5efc5be8d00a2729f03eda6a7b8630575df8b3a19388ff88daf0d00bb3e7c35a525ded90a4511ce815fe6c8904406cf72d7bfa14ca533566f7b54268835285c5402e22a63f98b5d90c86dae0a76d65eacc1ba85b3f5a1499d5f3432dd5455fab9e8bfbd266e99283c2bddf9b556410956b2f061603d1fc91194766f90da841699ba7da3d53ed5abdd8e98034f8fe734446d92b458a731aa4c578552ec1ac5d1baaccc4153a67b48a290602d5f955d61a08436b27cfb0786a80afef76e1266310a42d90feeb3bcc40ae5c4506432dcc92f7e5758ceaf277255401f5c5f4b10df93a249e38edd9effe7bacdf7fecc451d3b2cea77c9bab0403450c41929775b8c0ace46f6928f4d9cf3adf86832d298ea32b236d3201464e2ff506ef01da0e1e389e26e2b3ddc553b369b48d1aa5dd43edd5cab065e276aeff72a4c43206063fc7eea3bcc783ba2221f5b615a7a43a75cecda6bca5aa159e9208bf66af61e2e465c2daee630c4c62077ea6ef0e8b4b4e272d4e93a5f5284f9da463e1a60f815a8a31698ecdc09dff2b62f00e37aea5fd4b07a110cef27e12466c1814d3b10017cb9b8e12f2f38f10cbe31296de2570d5662b16639fcdc05db81e0d48178d055ef873501148d00903ec771400fa4873c5579dc3265028f531538f6dab1e5607a15c8b90cbfa4835107cba6f453bbdc71d08c7e423f58b44be38a9c8a610469f2551ee6177edf639cde35fe8e02f76b7ed106d691a876a4fda3b42d8ace3e0d3d4e026206c5d7d4d56fdda9dcd30fd7b74217fab3c617903f1aeffb8363443ed128af94c391810e327704d6f655e57dece97658d41e074029823850ddf7c5937af41c64465046d8544bba65c691ac69121bd272107f7eef8cfdb6a25da5da16d1033cede09129d51f6abfe63905a6fba9a64d7832fa35825447150595a60163af848eea878fb31a5fb97b1859efbfcc8586eebce8cfe64386461a9b88aa5efc1db43c64dfd5d4a45aa74803fd178f9e16a3f59acfb6e13a564d645cedd73890d0a82fb6dffeef527694a7cf2a89aed9750c3675a67505bff77de8d046087bd39a85c90aedb085e99baf04c7e3bf92e350b332da1b8af85550a00d68904ca426da61add864496d6ff442bb0b848e9aa463bb0c2085cff1a83a47d6f702bd184cfb5c139752754c8978d27b58d364bd88722b9097ee3a6ae28eabb14ca7c31e40461101e92448dbbc63b55cfe56efd078d0058c5e6146c73bcd949c4b3ec9f881b9a5f7b41ca83301261e0c674f2d35d96761baa00ce0675c082bf73dc52dc726a3e605067569a372d2bb47fc8fe1e74f00078ce6f352a6d9d97fd2834670ba3a45aa6751eafc7ed6694e1e07542860c8ea516f296ee901a3ee16b00b40419c74bf6db12c7230325e85a918f412bc2f6469c1a13a5aa77f028e327749efd05b91053f49d9f1edf49aa552c58c68257233a168db60ac55b4086ddaea275b078869cda7b69493c4b371b4e9c8361357a7ac7d3d3bbb464c960addfa8df2b208b21b090d540c440241598212d33273203d484e0930e22469c2a8e866579a4a2b3db8f8344dbf8baa1b97be0c4d976f6aaf14cc09ec52630139b894b2b6f4dad3a205a7b286253f1522b1d6e43bfa37beaf06f831c6f0945cefb2593b9b298da13b0d910582086c5d7e256ed4067bfb476dbe01bcddb437d46ba716d6ace2ff9912c8e460ad33ab3d8f97b7b08dd4ba9e01968d1949ff85b4b9d5b8da291fc0f90ab1eab1d246f67d76092b7a37528ceb388dd76f8a8f0aabb7490f02a2c8bc6498cb26350d859c466dd611bf0ceb81a8b7899c67742c22697ccee21c4963acb003d15c1a2078112bab05595917584e417db3872a0ff0a29138bbca7314449b19827525340370d7e48fdf9f7c6b4a280e78d00775a291081a5e78e7a00ff915015dd5af5f0a45690baba8b1b503bf85f326c23136f4424be4a559aed03fbc81400ac27a33dadb2155d1704950d98043dcd86df1eee78f3f266c4d14deb8126708f74b59aa15e8b497c6a52924a473f999aaf0abd3d148fee8503a1568efec7bfb0bd463402f563e4019cc9c9e1eb498aa54dcb659f43b86df0a34de4e51ec558bbbade3d69511d3fea2baf44f67e85ada7398d7f72ecadcd9e981f82b0743ed74bd33088ba4cbc85b0c99dc5382c599706dd2d51aa9f470c25a98e7e8248dec216a155495630662bf6ba0b7a4baa2cdad30e9ce3e1a65e3c23d69d5f946606ee8504dd70830aa5a8ddd84f10e064695469727d2efeb46186c9d3b7a170057636f05b9ec4c2de7d935fba504a1e7eddf7a5a95226b253b0b9eccec976ca3c57599850db40c27a51ae755c1f30d392467cb74e5c8235861d11d0f8461b0e1d84f5718d64ea92da62f4de184a6499dba473e82b3d197305de0e494f118a263237c7b4c0652327977edb427ccded35552c00a5804b9557ccf2bca2484d9da2c33f6c1bbf2c666ea10b4644a21e3905e5c4eb417ac3572e783428d23dd7222e75c356b99e8183d033034e29e618c90e66ec2f1e9fca47d82c1cffda8ad14c96045159d9437e91ecef41d24cff89009ff57e18c1a422860aa9cd31dd2a85b07422c72a5decc614a9742e62a4988f394421b6918e51c2412d749bb53b1e8fed7b2ef0873ffe14fa77bc366bbd5fa1432be465f5e25266c6c12b55df1f19b1a491acfc5c9019f122c422243d751d8eaa8ff721397915171556e999b34425f7d3ad6f6c3323b8133b4618c65ac16cb5941edc979472734bdccafc73c08939c0b1e306ae3015faa9cfa09ed6560269a1dc54c2c046a12a178144f4381f7b6fd3fd2d28f778d444d9f7a0dae00ea96c6969b78ef326a962d23275f1518f0e6a2469440612f3710b53538fe99a6179471be8c5b2d682ab3e9a5126e41ed6de000cd9e92fec3974e0f4cb2d2245d03d6ee80d6a793b16efa829d75c796f34d4e918250f457703559bb48ff78f0896be1bda403b7f1fd6a319d68478ff70d88238f2b8afc7d20e51757bb9db3bffb35a8040fc0db913c4f03d48619af7fd24cb8986b3e139058be3cc253b3de9b3bb3f8dab7b8818638279b2e6a0c29cfe16fa7250d3c74362ffa07e2977cf562140fe28afba8f61d81f7c73bdd4a2faddb00752bb049d0a57d05c6475c7387e6716ee31974169930c9fd830cef138659cf56f2212de185186c3d683fc6b7fd36e7821f69d0de041a569765066dc4a1934870a7b80f174e8f9e484942e62404a42b21658467873865ef94fc262c231527f39e82dfec91215947b99567daf75c6a28073ee4e67d4307e4b35b46f85433abd9812f35438b34598ff3b6dbd60b60747ad64565391df45ac80b272d0141702ab807fa27c6a6ba2f42c3facfae0c773940cb2943bb1353b41298258bc0d07542b69483e17ab9ce709e4160b80a0968dae9af8fc7c0324c753ca4a11a6df32dfa79a87b445c988154bb3c503e6884cf6d8f5e062a16b4ff230fbda109a6127d35e3bf2b29bfd3b18ba275af773b1981d603300035e046ef023d51874aa105d136bfcc9c7323bd0513a6b2b397ffea71afb7a8d4695411d86164917099eef504f6cff3c5cefb88f23f56c4ae3e2b09a3f353fa55630f45f06c29e8912e8c3c4f493f25eda781680585580595bba43dca9cfd400d9eaf5081d2c6697da59e012dfd0b875336b88fe16609c2e9876737b9afb868ed52417ed0c6b359d582d585ff82d98edd4e63c6b65cf43d4f69eee2af4819157b8a433966953862d1ff2c6d0cba382644a1b0033ddb7be3d1fa9a204042d7b821b293bd659dca980c108ad1db740800b9bd2fc1a163f9b4066f7604f160a7910bd947cb48ce6c81e680fc6571ff0cd12a3ded9c8cd560970ca5cb480a70a8322d5072edcd257604eba8dcf55f9ec97ea2b14fdcc72fbf615131836fb14e42b8d7171d0a06d2fb3caec2e0759e86b0d8f21e312d9211ed7fe0b48669934ffb892baf1db9aa457c07820723e5446420334bf6479f2099e01ef8adf273adfdd9ed0b741931284515d69c211cc2efead8339e450b13be71b35c36c1f00c2b8ed0cfa9792e422912e14b5b1455ef6abdbbec0035480c6cb69d21321d12ee19d528dd48f43b142cf0502eae5304ce52b7fb827552db9ab885b93e83d56a33346135aef11b7e48efca7cd52e2499a7edab0bd0562862187ff4599b2446bff11c37181092fbb05d0e05220ca6bc37f529d6599e8c29acb9f25616c27df291d4fb07430188e6470df7002f73cfe5fe6907dab0b4f90bb58130fe90241c29c6063a22c9f45d032b282eb92c93736692bd5cbde2a17552e942b595b08e6ba0c91a03b9079e9117fbba8f26ce6c5d0500c69bb6e22e3562a50baece49109c2d42b6714250665afd0f0a7e951182012f21aef4b917cd434d9ca22661437608e32666497516be34652500def6c28ef8f56f2273de5416142ce9606faf7df92ab779ed6aa74cb99bb1bfe758ffd344e1d31f479807326d1a7b98f6811e275545d69198707b0fbf027dc6a5e4815d62ef191535569a452c27c4e25ecf139df949d70dd5935bddc04f33b2f0bcf5073c51fc51c15067963a20569b5659f0e7413b347d6d5ee38a92b7e6e656c199149f07ebafe5281db6b1b2ecd9e0384b6f5a8e27ecea9a0249c61b16564964054f5f9621471a98de132e102f518c1419829e2ae2c8c5fffd1270f0a0b33a383437b0034783d50bce8bd7420c059d16364eecbd55b6ac8df8a70382734d8127f4f5895cc9e508b13c000ea053ab59b87ee639745418ffc566ceebad37a17b842d24d3423ac3f086142c622eceaadc4106f8c90c5dae1f52f407fa0bf1e6bf9385cbcbf3b61006ea3b1e66b693ce704577ca9598587f41e05d36d1de424e0e51290a5f2e2f99f1960c0253a046a49b19eef249ca2dda2af1e8dd78411088eff1e9c23c31bd20abd4fc9e7eab19500827d202f76270fe9f90e95309516343e0fca48e5a12182e91c78ebf2cdd4644629afdc90bbccb77546cd765135910ba1cd8a3e3c00fa77e585865e898bfecd06c01a0a4d7be483801099c61941c4967154af5620b171b426cf229df59d2944ba50754140c3f305c16956953be376fe6e7cf31a2e9c276bb09cc24c4b86b2b26f039b0d8511853adcb7feb8502e7641a34e3242bf2c538006bb1983345ec3cacbf219ef10efc1681d52e6e1b1c60bb556b6b8a63d1d1f6869077841d1b816f3165a35833e33d39a8c6e62a2f7c482c395768fc6a0e3cbfc7a1a6d64da53adad66c8016f76eaa73df1b8ef83012ecbe75c92a8e39b48169433f951a539b28a034d5fdd00639a5e3e17ef14dafe869064d130c90c68be4d5ceddabed1bc94e97e2cdf7313f780cd6e175a9e3eba3eaed896fe464073fcf07ae7b5bd41d58c3160f66ac95a76fdaa7a8cbaebb304fe3c8f03cef927a1182ac2281c3b32378813b24bb99e42cb0774331ad78b74d46b8ce48bbf4ef8431a82d4240edfd61b910c38570ba0bfbd4a41665117e6d5f5a97908462e62d0b76160d06aa56cc6e17aaf4607ba8263648f2a0077e306c25486f5f39a75", + }, + { + "2f6210063cb3071b3d49339185c2cef8357b08ca826d8d1acd852540c16540f1c850f70404fe1f414853d3cd15a1c64a1cce149e3ca1b80926de4ae8438ad90bdad010decf2f201782f3e49794aae1b079f54eb59607bebde508a528927e346d4e444b1d736b34f65e198df2c36fa23c64f1f1fbf8b0b8ddb85d054bdb39b8297d0347f16f7be7cd9474c058e36294485386434b36fb28ee582e393367f15ce5f5a3d6641fbd31b331f10b1554a05da726a0f35c9b1b4af3498426b17582966a266cce452900f85af1046f45a4ccedca6ce02607fb70fa45f420f66aa38cd4c9f8a30e21a3067b940aebdaaeb7c77824a79e2ba20f26e70346dd6de96942b261e5c08288c7fe1cd1e9f680a0bdf8c46497f007a616eea95ccc17463559f8973eb919c68017e25100d9d1a196ca65fb615502076bf0b0c8bcc70ef22006895ebfa2243fba0791bae0625b762cc1718d1673948264454a200c58122d5e9b8b1e3eb05df8b7eeb297510e0d7dcf7f0be5f29f6756e4b177f109891e6825a9866359e35b10d20da7231bb5a0ea34abd0264b377d2fe9f420f27d3e5aa2e8e00541c46052966ef9b989ae5974e2054409507b867f647aa057f7deb19ac6929f0856005aec6e53a5f702fe6be403afed532b73d38fed73e6e551987f182a1e20801e7a6c8ccd1184cf0fefb4139fa166ca15395902ac40e7fed8661602853682a3b0ee307dffb44d0ea3012142a2880cb7c166ba6ea6a16c7e0882808db8023068f060e5ef1432fdb8331ffad6a7078d686d47d613e94291f1c4117e7c13aee4030fcaf223fcefdb300ed606b5dd931e4adbf45dc437eeb5fbff337812e15c15f026071423f6ef5305c559baa2ecd8ecc7cd498b043740ff3673774855d45d45fa64591d5b4970600ec91ab1b6f39d7dc0e709c41e49c355bd3b9d120ffb57095fb127bafa971a086135b917285794e83e9dac5ce76fb1a4aa4fb6b94a0dc3a9beea64b8817ec1e2b37af9dbd18ec30f2b6f6c12df1db6896c6c43b67a066038f0c4f17142b254f62c4dd1fedb950d07047919e397d06d033cb0bab6b61aefa6dee01720926b16beb9e8bc947dca9b8143b565da85d2dec182987838b267de9047f5b0d961c7971aaf54ae2c1e4aad61ff123c84e41a4566b2bd9e64247cf46b72a444d36bdced1a309b464ee5f4afe406eb68eb05ae51b76bf01b906c0ffbdeb440b11f1c9e3a4c3a809a1f7449047b356c663a1ab7f286a70d16141d11f2d151a4f06d422ab97cab539c1f9da09ad20c000c27b8fead5f0cc37329d466fa260aea934c154dc9c0a065df3d057a0f117a1c38321ae59226a8054f7d6b49a3753436c249838b0924f0e861f5627106dd8d3f0fa724a1cecda71d4a1267ed889b234ae4a7d5edcbc5d52cba389dc0152aff24d224c6a0f16dbd3b7f242807bf4b51a3f22690bdeb66eaa59e8766b3b265d784899d247a0ae1b58a06dd91c529e3691b09f9d9f55fc39afd4a00b0fc668880ef25a46a30861fba8cfd4b51262eba4138b41a2d13ddc71128c8c1242e49a51d6f49879fcfa7595ba4a4adcad3670b0b1b26382f03ff402bc70150f54bf513ba3e9a590e41b269e55616af297ebb3499e16cc8e46c0810330a602955553c0f93d668a1181a0bfd7021ad9a9f68ce39493b012da70a3dda149d0369f23f788616e0272efa322b6a54d804f340d32c890e2eb7b538f48f4c9293b584d22d0ae80d321607644271b81a76ac5b49d8e457069b0c3e909b8a222e3fa6016cb1e979e300804742f2005c68acb7b1849c088b3714c9c7af54e9de9390df0041c87924c8fa6b0aec6b6754171e059cba0d27f221f0b9d044a3aed8338dd8745651981e4b0329376f908b86ae9022699d495bbe3a148f7eb73d56eacb2e5e2180f63fcbfa680369f88eefa71f1210bc5b6b7b957f0a1437476a2112998033197673e470dbe7d9d476c97b95db8b5136f6cccc75d6e0ac1e4ace30e34e64fcc4d7e135b2c80e863ed701d3b28c25e982f1b5f8c895a4e6df7216c3c07abf8551a0ba0469c88aa7a08c7b5218a03b9b91f0935985373f65aa56286ad0e7ef2288a926f172b098123c136455b3a0f04590839e16bade7b6434a3cf048abe2612684c03dafd9cec39af508e63f07ea881014697bc24122058b5ef5d3fae835216d055f0cdf1dc06a12c95041d13ac9e15f235d11747f16ffce1cc3b8f508da520e395edd471f3759d8879ba9c2558b1188d822fd4739ed0546b0ce3bb9988db7c1dc8518ebbc62c4440e6e0653f917dcc13aca1864b71dbb67dbe7117474c936414e4f3cfab1f13eb05f3504484ce11977ab21ec523f97ba1b7ecb8fe384b634c30561cdb752fc67a2316bfa7e4d03f5f825d24a556a0460d8cfe0cc54a6f117ac52d553a5d1bb48031732716436675c5c3996b1939b127c6b0338bfaa29c7467cac9a127e455a715c9ce2b0c35a0d2f83a3d1273ee39399e6cc4980e610c752bd51652b96bf9cf34c7fa41fc9b13f5d55007483e4082ddac4675baa7822fd257452411b01de0e5e5da26e17539d64a89dd93c71d15a4c95b1a83039cb2d5f3f7fa04a817e48dfcbfb3de34ecb47f7592123caf27e17982fbfc8597af5b8aa6558f4e6c73db69328e47677afbe6ef8df82c3d1f0db6a108b2279f61822908d7b856432c32ac5ec0f3c53befab2a7ca356b9c2636f646b228b0a830d348be4ece2271814d477d4c73c0fb6e83a338b90ec4ef45cb25f7e3d6a014a9e8d2e8a6f55a383291a57f15667a73ea1daca31c7182523ca85a107efa2518d2f7f179ed4ba21fed479ef2be09669817133b2384bd85b155dfc1c4c9e6dd9ceecf06cc1ab8ebf7f07aeaae7441468b5471aed93f248a84f44c59be33274b11f651de010ab9f8fb24d3a99914e0147951c34280e7dd15ec196f9a4c86e55e7d373c7e31e6672d1b3ac6a45fa6c8c9088c0b8963d89f4ff1feea3e85cf9cf2f6c97128afd845bb131c6f62b3282bbba42745080fd457f1d3322058f1bd4be876bd01269546d1a853310b165926c1fd4e07054deb5d3fbe8f6007711d435994005aba95918c3df4cd390b165fcd139dd418ebbf661b6de57b655698a8a02ca8fad73e8c536c7110957c36e5494a831d536eccb97a2a9ef58fe58e2885aad170720ffcc57c7de601ea1cf723577a30aad8fd544317e33897c8b6c04e5191bec391ab990e197f10038c0726d371677e4a54c28d7ca5c6046e7cc4acde565b91f7f72af6109a0614160d3ae97e9257b8f71a4663b00c681e793cbb478306e97b0e04711eae7722b4845dadf2fff5bbe71ff24acffea2ee67df99bf62a098ddae9d4ebd3bc5dff04a2d9e3d1d83e8f493db3f63c9e24231b1dbe1147c79f21b0730c842f6983330c5c17dd34556d7e932074cfbe98f2dab5b0ebfd778a1e28fe2bac2d942f61a08b787ebfcdeb3d600bb130ca4922a4ffd38ffc4a1a1a7218451e45da4da67ad81ef898ece3d54cef877cb9d09f5dcf72eccbbc06e62f1e2b4d64059b0a807329780b155ce1614b68de04387d6108ef4dd3ab54b9da72e528d6eac3e16a360ae3421f3f23808a8b5e8ec3dbefcbca3c9f76905850033d78d9283bba9272c475b4e3b4d7643e62c2cc259ebbf168f890de88e82f8b26a7654ee31fe055e45609c70ae02b4942ee15678cd158f4c9e8d351d102ddf7a942458c6125e1457bea0d86ca38cf0c26e474b2b5cca77eb57ad0867cad7d25efc2b250e79396637ea3e948dbb855029cc9b452955bd04ad5a0d0514d4d773c0f298df7bc235a3ac64383a1fbd8a397a158e936b3ba81895a51daa89f51e4ae7a71a53794ff715a42f4fc3dcc9fd56df7bea4ab782534d3760e7b15605fc4dad16911656983c0ab77bce9445bbeb1537c55fef57a32c8f1404306a0a2ca7b73348cd99d0f9948875531cbb0ef7c036cd201614c33293d746c44140e0e8f82421c5bdf2bf428b249597df949fafdb5ccfe1618323f56a6ab9abab9a84a3beb6696ca918af244d34cc1cd95bbca4a87c860a0fa9ff6a04a905b0338a53f230bd5ee9c60e0e0332ca200c15dca0be5936b858d0a7b2e540b8958432e9767396c55d5cc35b60062580023b5cb2f9a5e9a1feba59a19f9a5a251e9d0e8500955a5df21da95213ced2260a2ed8f3d4b295c36cef750c89cf21985c302d5cc577aab7855409a912dbcf1d0a9800df4aa692a78607a40fd6d5a82305c58fcb3d2a82b27e8c5b91681aae62a2bf31ed55c494dbdc38eba30e83c6044945df76705228eede8470369f2e9941ddcb2f239fb3ff6bfcdb0efb5ec50f981adf0e8b213769ffbbea364b08cf8cd69abbfa2a6fe9865cc48558134a57bb5526b9d047e14a379d246de82d3d64f3c810ede280c768dd8bee25af287d5a8d94045ddbf5981382bc716ad9aedfcd66e0ab496172a24efe80649db8e1e83675fc8451e22c6564d8d6dfb285af7fec802b35f19dd8308c68952a11770247fcfecc4ed0e8a445c17b1573f0b4e3ed350f13269ceb572943fc435563459d5044699f1542335b03be6077af156b8c5a6a9f71078ad820cec4642427a9b187ee1b17036d5a5e6108cee8a7d444342eaec3afa64e77c71d3c2b3153d4e2dbb30df2b66b4d14cc45d3a4eda7e911d697e5763e23ee05311a20626df55549b8533c6ebe79737abf472f9cff08bec590943bdeb819d3f923f45b81f9a0cba1f3f800a261842d10cb4cbdba456c7fe5f0abb4a8b58891d97cfd6b669e2708922f1934809d51a1589e5f12e3bb82c9ac3e7e44e3f6e6cd63d428da624fd2f46eec38ff798a90d228efe50c9b67c63796347c8a2b53478f27605999a03c8e1f18b70e92419f646a7f49670aa12d324751aec17d0208fc296955b3098241189af8172d39a6819415cafb107c1842b369f174d6f37dd31cd728dfd0ab10f93609006342b6e4d6ccbfd1ed2bea2fdf5411442b04b1fe218916f159b20242f80b535b4e0a3024c6eff6a40bd0d3db24e51f5ff9c14e1b4a650ca4170ee70f0a3a5a58349a7d0b7a63af86347351696870b95231f76d8c5c6a20736907726341dcbb76672871d18c2157c094b929fd29d34f5bcaacd82706f89a60000cd341d98eb830b73a12335b69f3e0131ded3ce12c98bbd960d2d0696d40696a13ab43925374498d868cd8f070c9039ea6407fc2d92b9c39fe7c935bbcfcc5c0980952fb7dac79042951f49a1af828b138a87401c4104bc28cdf1e39dbd3fa63dd4d5f5ae9d85f032a43ad353bc5e6746e5a76326ab1f4e79103116ce70bc0b459200f32f85e461291e347dda92e421778b849e37a3ecb0b31ec6818e828dd3148dc74313aba43cc9d8b9a36a9dc4e229488060eb6c109f8ad6201958adec6d3bb3b04e5e558a272d44cb98e18f7a0ad8fa6ac3667a62f150830aa930f6166baac6b9081b44304988fbe1698a5b746255de26bb5988aca90bb6523cad68a7572f615f4aa58f932d8a749615cf0a7724e99de042268ceb31433e6df0a61547d576a6201b36b348c028ded5f7e94d1cd2eafc141088ff42cb3dafbbe4c402b93aa9d955df8d9d9fb57c75ac65c2c837acc44bbd4d4aff1888aed46c73d625ad7fff035e8ca0fe411c73ed8135b6b8e17a039ec74e9de0d64cb442bf8a676c0a666f68f21066332cd921ae0ed766f0516a8e19b82cf98e78add0373737a3419e13aa902310c44feae5fdf8bc64e80dce772686a31f141bcce452041bf545b908ef4a2b000e7beaf378e2afdccbbcaa42e330e5024400cf2852d3444718", + "fd5008477b0855f6f2486fd4f74b9fb4f6e19726c6996bc66893183bd76054d5b05c1c2b64722256ba912ab2dcca66d2abfdf972966438fff7513acfb18ea461eac08c4e32aea4ed3fcf9f1c9905ee4402e7b6984bef974340d212f160b6524b76de99a98d3e96cc0d35e8a63ad7ea3cbea1d40a906c4dd03e5fc19e1513e9", + "390a5e75c9ff4ad38fb6205ff47f209294337c1f25ff54a3c01eee8e1e220257", + "8bf183347ec1ca4bceff3374", + "19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b", + "0942e506c433afcda3847f2dad", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff4b4086fbbd1b6cec23e45481eac5a25d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f685eb7731024bbf6794c3f4c7c5a1cf925", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314", + "d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc07cbb", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68a12d0f1cc99e132db9014100d9668c91", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9b", + "bc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32d4d00a24b826b6efb16013ef54cbe170", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525cf08f5e9e25e5360aad2b2d085fa54d835e8d466826498d9a8877565705a8a3f62802944de7ca5894e5759d351adac869580ec17e485f18c0c66f17cc0", + "7cbb22fce466da610b63af62bc83b4692f3affaf271693ac071fb86d11342d", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb37d04f8272e741da2802c54a9d9aaf8ecf38b36fc9ad0079523f6a4abd5281a22697a3180bc02662a7c13ee23599d18e5c48300dbb831509df4c172f53e524b3c15124a87ac73e5028cde6c94d8d", + }, + { + "67c6697351ff4aec29cdbaabf2fbe3467cc254f81be8e78d765a2e63339fc99a66320db73158a35a255d051758e95ed4abb2cdc69bb454110e827441213ddc8770e93ea141e1fc673e017e97eadc6b968f385c2aecb03bfb32af3c54ec18db5c021afe43fbfaaa3afb29d1e6053c7c9475d8be6189f95cbba8990f95b1ebf1b305eff700e9a13ae5ca0bcbd0484764bd1f231ea81c7b64c514735ac55e4b79633b706424119e09dcaad4acf21b10af3b33cde3504847155cbb6f2219ba9b7df50be11a1c7f23f829f8a41b13b5ca4ee8983238e0794d3d34bc5f4e77facb6c05ac86212baa1a55a2be70b5733b045cd33694b3afe2f0e49e4f321549fd824ea90870d4b28a2954489a0abcd50e18a844ac5bf38e4cd72d9b0942e506c433afcda3847f2dadd47647de321cec4ac430f62023856cfbb20704f4ec0bb920ba86c33e05f1ecd96733b79950a3e314d3d934f75ea0f210a8f6059401beb4bc4478fa4969e623d01ada696a7e4c7e5125b34884533a94fb319990325744ee9bbce9e525", + "", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "588e1356fb8fa32410dad99cf7922aae47b4042502c92f3afe33dc22c1c2e90caf22bc37a254f8dd62a09582c70194f9616982639415178e9fe95740c0f1d497a69b69d4924a7a15290187f9c8acf09cf5b3b3188ecde2d2807207f5bb6a6d3504314b1b47684cf8ba8807eb9a3c497c79ebe1e4c1eca2aa90328563e201425227fca8ee05dcc05fd6c98128626c1e71d2fb3a21860567093db1012dfabe13055c48219d2a301c8a5a49033a811d8d9413bafbb2eefc177226fe578e93c2ef1f309416dc98843bfac387debb1b610b1d2366178ce7212a7312057a3d058357a629f18c78e129e60979a2310455a76207be5611e8b4b840629564020c17f5c9446882e23f610e931246ec434e62de765bf22954cfae02b2ff7c59dfe246e4bb2d6a8afcebdc2beeaabf2a3f43f95a5ea639853f38719875ecdd2bbc0d81bb2a5ed59553b1e76b6365b74f618f68d1f05b5662cd6e04de896d3ef5dae4149485a5a2093ff4ec74b20b5e5bf8e61b5c65515938c202beab3eea5a498d2f32c38dbb370a9bbc3187cc260ddac991f94ce4f0d5", + }, + { + "0fb826ddb2eb5e708de203d0438be12cf708d635ebdbae56278be09077009586b9bc646ba7c2db35a5de05e86ae71461efea96dac64430edcf117d461113cccacf303576f310ab98efb180599894ba877e50614494923163a3afa9b4c2757f91a6b40799c5b331b464b10dfc45c783c317e408ab76390e19e8b7ceaa2c4d3bd201436bc6f69c7a5a4d8756924ed95665bd5e1034971e4d80d51b2a", + "026866d46aa940309fdcabf92a324fbc", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "30f05cf8189bb7b8b4f560e746e228c4cc7e86e8f2fa66e1afe212d1855db51070acd5eb34ce80b2e223957df50fde4c2531d97fc9e573725e7a5e47f0dfc4da1942620320bb2deaf8b17937bae4218d04db8e76f6efe84a117292159507c9f8a09fb2c17921d7762510dbf1dac7b62b1bd7572e3e2cf008d01c445c7fa78833235034281ae180e051451c6a64f22ca9708634bd0d604e4cfcd971b13742efa5b6363e662a875daccb2b00", + }, + { + "c7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a3524ccb752f71316ed9d007e521cb5a0cf429c79d4351b02ee7fb60c7be636a10af3586dfa7b74d80875466a820c0b514e97cb12cce615ab55cba7c1b1de72bcd1cb1acc368f944ef4eaa986e6a4d8253c9337f9795d94df193c90cb0b0387dcde929905223d441717ed9dfe826613bf094ba872993d41b269e27d74e5f541b497eac9ba180dc12ffb6f1e7dc5223cce6dd541071282b97c6526e15b2c330fb41dc96e25d72f45c28e543053766d11d44252db54e584c14abbb295d7e5a58bf36eea1936095ef897a338eb1995fcedd85fc92d354dfe7ff9a115c186bb4d7a1a27835030d248c87571a38f17906cefe0261d15740b9", + "56", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e3017ccac5b", + }, + { + "135a28170fe89066da7bcff3a9ccc1b27dfe942a6f47b23835ef746aaea63dc10066d90f4e697528e5451b8e11dd408fdbd4b94a1c6c82515bf7bc099df9cb9d5fa4acad0d22d5f267f18078cec107a995c1f3b12d7603886dbf910ab85ca7180053c50e759b00dc8c81555a425c03d71df6894a6c8cd2d94b64e303c08a1bc1dee1cf537ccf300850856292e1656aff5bf349c87f1ca1ca8085cd400fe901edcad04146a0714ef0f6b083d715edd670e020385f3cda29bc5ff6fc6edffe5ca9ce9def6e0e3d5f04ede2db02cfb2", + "73afd2ab0e0e8537cae42dc6530dc4afb6934ca6", + "a5117e70953568bf750862df9e6f92af81677c3a188e847917a4a915bda7792e", + "129039b5572e8a7a8131f76a", + "2c125232a59879aee36cacc4aca5085a4688c4f776667a8fbd86862b5cfb1d57c976688fdd652eafa2b88b1b8e358aa2110ff6ef13cdc1ceca9c9f087c35c38d89d6fbd8de89538070f17916ecb19ca3ef4a1c834f0bdaa1df62aaabef2e117106787056c909e61ecd208357dd5c363f11c5d6cf24992cc873cf69f59360a820fcf290bd90b2cab24c47286acb4e1033962b6d41e562a206a94796a8ab1c6b8bade804ff9bdf5ba6062d2c1f8fe0f4dfc05720bd9a612b92c26789f9f6a7ce43f5e8e3aee99a9cd7d6c11eaa611983c36935b0dda57d898a60a0ab7c4b54", + }, +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go new file mode 100755 index 0000000..b017a73 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_generic.go @@ -0,0 +1,199 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package chacha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3. +package chacha20 + +import "encoding/binary" + +const rounds = 20 + +// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k, +// and 16-byte constant c, and puts the result into 64-byte array out. +func core(out *[64]byte, in *[16]byte, k *[32]byte) { + j0 := uint32(0x61707865) + j1 := uint32(0x3320646e) + j2 := uint32(0x79622d32) + j3 := uint32(0x6b206574) + j4 := binary.LittleEndian.Uint32(k[0:4]) + j5 := binary.LittleEndian.Uint32(k[4:8]) + j6 := binary.LittleEndian.Uint32(k[8:12]) + j7 := binary.LittleEndian.Uint32(k[12:16]) + j8 := binary.LittleEndian.Uint32(k[16:20]) + j9 := binary.LittleEndian.Uint32(k[20:24]) + j10 := binary.LittleEndian.Uint32(k[24:28]) + j11 := binary.LittleEndian.Uint32(k[28:32]) + j12 := binary.LittleEndian.Uint32(in[0:4]) + j13 := binary.LittleEndian.Uint32(in[4:8]) + j14 := binary.LittleEndian.Uint32(in[8:12]) + j15 := binary.LittleEndian.Uint32(in[12:16]) + + x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7 + x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15 + + for i := 0; i < rounds; i += 2 { + x0 += x4 + x12 ^= x0 + x12 = (x12 << 16) | (x12 >> (16)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 12) | (x4 >> (20)) + x0 += x4 + x12 ^= x0 + x12 = (x12 << 8) | (x12 >> (24)) + x8 += x12 + x4 ^= x8 + x4 = (x4 << 7) | (x4 >> (25)) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 16) | (x13 >> 16) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 12) | (x5 >> 20) + x1 += x5 + x13 ^= x1 + x13 = (x13 << 8) | (x13 >> 24) + x9 += x13 + x5 ^= x9 + x5 = (x5 << 7) | (x5 >> 25) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 16) | (x14 >> 16) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 12) | (x6 >> 20) + x2 += x6 + x14 ^= x2 + x14 = (x14 << 8) | (x14 >> 24) + x10 += x14 + x6 ^= x10 + x6 = (x6 << 7) | (x6 >> 25) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 16) | (x15 >> 16) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 12) | (x7 >> 20) + x3 += x7 + x15 ^= x3 + x15 = (x15 << 8) | (x15 >> 24) + x11 += x15 + x7 ^= x11 + x7 = (x7 << 7) | (x7 >> 25) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 16) | (x15 >> 16) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 12) | (x5 >> 20) + x0 += x5 + x15 ^= x0 + x15 = (x15 << 8) | (x15 >> 24) + x10 += x15 + x5 ^= x10 + x5 = (x5 << 7) | (x5 >> 25) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 16) | (x12 >> 16) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 12) | (x6 >> 20) + x1 += x6 + x12 ^= x1 + x12 = (x12 << 8) | (x12 >> 24) + x11 += x12 + x6 ^= x11 + x6 = (x6 << 7) | (x6 >> 25) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 16) | (x13 >> 16) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 12) | (x7 >> 20) + x2 += x7 + x13 ^= x2 + x13 = (x13 << 8) | (x13 >> 24) + x8 += x13 + x7 ^= x8 + x7 = (x7 << 7) | (x7 >> 25) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 16) | (x14 >> 16) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 12) | (x4 >> 20) + x3 += x4 + x14 ^= x3 + x14 = (x14 << 8) | (x14 >> 24) + x9 += x14 + x4 ^= x9 + x4 = (x4 << 7) | (x4 >> 25) + } + + x0 += j0 + x1 += j1 + x2 += j2 + x3 += j3 + x4 += j4 + x5 += j5 + x6 += j6 + x7 += j7 + x8 += j8 + x9 += j9 + x10 += j10 + x11 += j11 + x12 += j12 + x13 += j13 + x14 += j14 + x15 += j15 + + binary.LittleEndian.PutUint32(out[0:4], x0) + binary.LittleEndian.PutUint32(out[4:8], x1) + binary.LittleEndian.PutUint32(out[8:12], x2) + binary.LittleEndian.PutUint32(out[12:16], x3) + binary.LittleEndian.PutUint32(out[16:20], x4) + binary.LittleEndian.PutUint32(out[20:24], x5) + binary.LittleEndian.PutUint32(out[24:28], x6) + binary.LittleEndian.PutUint32(out[28:32], x7) + binary.LittleEndian.PutUint32(out[32:36], x8) + binary.LittleEndian.PutUint32(out[36:40], x9) + binary.LittleEndian.PutUint32(out[40:44], x10) + binary.LittleEndian.PutUint32(out[44:48], x11) + binary.LittleEndian.PutUint32(out[48:52], x12) + binary.LittleEndian.PutUint32(out[52:56], x13) + binary.LittleEndian.PutUint32(out[56:60], x14) + binary.LittleEndian.PutUint32(out[60:64], x15) +} + +// XORKeyStream crypts bytes from in to out using the given key and counters. +// In and out may be the same slice but otherwise should not overlap. Counter +// contains the raw ChaCha20 counter bytes (i.e. block counter followed by +// nonce). +func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { + var block [64]byte + var counterCopy [16]byte + copy(counterCopy[:], counter[:]) + + for len(in) >= 64 { + core(&block, &counterCopy, key) + for i, x := range block { + out[i] = in[i] ^ x + } + u := uint32(1) + for i := 0; i < 4; i++ { + u += uint32(counterCopy[i]) + counterCopy[i] = byte(u) + u >>= 8 + } + in = in[64:] + out = out[64:] + } + + if len(in) > 0 { + core(&block, &counterCopy, key) + for i, v := range in { + out[i] = v ^ block[i] + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go new file mode 100755 index 0000000..b80d34c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/chacha20poly1305/internal/chacha20/chacha_test.go @@ -0,0 +1,33 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package chacha20 + +import ( + "encoding/hex" + "testing" +) + +func TestCore(t *testing.T) { + // This is just a smoke test that checks the example from + // https://tools.ietf.org/html/rfc7539#section-2.3.2. The + // chacha20poly1305 package contains much more extensive tests of this + // code. + var key [32]byte + for i := range key { + key[i] = byte(i) + } + + var input [16]byte + input[0] = 1 + input[7] = 9 + input[11] = 0x4a + + var out [64]byte + XORKeyStream(out[:], out[:], &input, &key) + const expected = "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e" + if result := hex.EncodeToString(out[:]); result != expected { + t.Errorf("wanted %x but got %x", expected, result) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go new file mode 100755 index 0000000..b852f34 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/crypto.go @@ -0,0 +1,484 @@ +package cipher + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "hash" + "log" + "time" + + "github.com/skycoin/skycoin/src/cipher/ripemd160" + + "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +var ( + // DebugLevel1 debug level one + DebugLevel1 = true //checks for extremely unlikely conditions (10e-40) + // DebugLevel2 debug level two + DebugLevel2 = true //enable checks for impossible conditions +) + +// PubKey public key +type PubKey [33]byte + +// PubKeySlice PubKey slice +type PubKeySlice []PubKey + +// Len returns length for sorting +func (slice PubKeySlice) Len() int { + return len(slice) +} + +// Less for sorting +func (slice PubKeySlice) Less(i, j int) bool { + return bytes.Compare(slice[i][:], slice[j][:]) < 0 +} + +// Swap for sorting +func (slice PubKeySlice) Swap(i, j int) { + slice[i], slice[j] = slice[j], slice[i] +} + +// RandByte returns rand N bytes +func RandByte(n int) []byte { + return secp256k1.RandByte(n) +} + +// NewPubKey converts []byte to a PubKey. Panics is []byte is not the exact size +func NewPubKey(b []byte) PubKey { + p := PubKey{} + if len(b) != len(p) { + log.Panic("Invalid public key length") + } + copy(p[:], b[:]) + return p +} + +// MustPubKeyFromHex decodes a hex encoded PubKey, or panics +func MustPubKeyFromHex(s string) PubKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return NewPubKey(b) +} + +// PubKeyFromHex generates PubKey from hex string +func PubKeyFromHex(s string) (PubKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return PubKey{}, errors.New("Invalid public key") + } + return NewPubKey(b), nil +} + +// PubKeyFromSecKey recovers the public key for a secret key +func PubKeyFromSecKey(seckey SecKey) PubKey { + if seckey == (SecKey{}) { + log.Panic("PubKeyFromSecKey, attempt to load null seckey, unsafe") + } + b := secp256k1.PubkeyFromSeckey(seckey[:]) + if b == nil { + log.Panic("PubKeyFromSecKey, pubkey recovery failed. Function " + + "assumes seckey is valid. Check seckey") + } + return NewPubKey(b) +} + +// PubKeyFromSig recovers the public key from a signed hash +func PubKeyFromSig(sig Sig, hash SHA256) (PubKey, error) { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return PubKey{}, errors.New("Invalig sig: PubKey recovery failed") + } + return NewPubKey(rawPubKey), nil +} + +// Verify attempts to determine if pubkey is valid. Returns nil on success +func (pk PubKey) Verify() error { + if secp256k1.VerifyPubkey(pk[:]) != 1 { + return errors.New("Invalid public key") + } + return nil +} + +// Hex returns a hex encoded PubKey string +func (pk PubKey) Hex() string { + return hex.EncodeToString(pk[:]) +} + +// ToAddressHash returns the public key as ripemd160(sha256(sha256(key))) +func (pk *PubKey) ToAddressHash() Ripemd160 { + r1 := SumSHA256(pk[:]) + r2 := SumSHA256(r1[:]) + return HashRipemd160(r2[:]) +} + +// SecKey secret key +type SecKey [32]byte + +// NewSecKey converts []byte to a SecKey. Panics is []byte is not the exact size +func NewSecKey(b []byte) SecKey { + p := SecKey{} + if len(b) != len(p) { + log.Panic("Invalid secret key length") + } + copy(p[:], b[:]) + return p +} + +// MustSecKeyFromHex decodes a hex encoded SecKey, or panics +func MustSecKeyFromHex(s string) SecKey { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + return NewSecKey(b) +} + +// SecKeyFromHex decodes a hex encoded SecKey, or panics +func SecKeyFromHex(s string) (SecKey, error) { + b, err := hex.DecodeString(s) + if err != nil { + return SecKey{}, errors.New("Invalid SecKey: not valid hex") + } + if len(b) != 32 { + return SecKey{}, errors.New("Invalid SecKey: invalid length") + } + return NewSecKey(b), nil +} + +// Verify attempts to determine if SecKey is valid. Returns nil on success. +// If DebugLevel2, will do additional sanity checking +func (sk SecKey) Verify() error { + if secp256k1.VerifySeckey(sk[:]) != 1 { + return errors.New("Invalid SecKey") + } + if DebugLevel2 { + err := TestSecKey(sk) + if err != nil { + log.Panic("DebugLevel2, WARNING CRYPTO ARMAGEDDON") + } + } + return nil +} + +// Hex returns a hex encoded SecKey string +func (sk SecKey) Hex() string { + return hex.EncodeToString(sk[:]) +} + +//ECDH generates a shared secret +// A: pub1,sec1 +// B: pub2,sec2 +// person A sends their public key pub1 +// person B sends an emphameral pubkey pub2 +// person A computes cipher.ECDH(pub2, sec1) +// person B computes cipher.ECDH(pub1, sec2) +// cipher.ECDH(pub2, sec1) equals cipher.ECDH(pub1, sec2) +// This is their shared secret +func ECDH(pub PubKey, sec SecKey) []byte { + + if err := pub.Verify(); err != nil { + log.Panic("ECDH invalid pubkey input") + } + + if err := sec.Verify(); err != nil { + log.Panic("ECDH invalid seckey input") + } + + buff := secp256k1.ECDH(pub[:], sec[:]) + ret := SumSHA256(buff) //hash this so they cant screw up + return ret[:] + +} + +// Sig signature +type Sig [64 + 1]byte //64 byte signature with 1 byte for key recovery + +// NewSig converts []byte to a Sig. Panics is []byte is not the exact size +func NewSig(b []byte) Sig { + s := Sig{} + if len(b) != len(s) { + log.Panic("Invalid secret key length") + } + copy(s[:], b[:]) + return s +} + +// MustSigFromHex decodes a hex-encoded Sig, panicing if invalid +func MustSigFromHex(s string) Sig { + b, err := hex.DecodeString(s) + if err != nil { + log.Panic(err) + } + if len(b) != 65 { + log.Panic("Signature Length is Invalid") + } + return NewSig(b) +} + +// SigFromHex generates signature from hex string +func SigFromHex(s string) (Sig, error) { + b, err := hex.DecodeString(s) + if err != nil { + return Sig{}, err + } + if len(b) != 65 { + return Sig{}, errors.New("Signature Length is Invalid") + } + return NewSig(b), nil +} + +// Hex converts signature to hex string +func (s Sig) Hex() string { + return hex.EncodeToString(s[:]) +} + +// SignHash sign hash +func SignHash(hash SHA256, sec SecKey) Sig { + sig := NewSig(secp256k1.Sign(hash[:], sec[:])) + + if DebugLevel2 || DebugLevel1 { //!!! Guard against coin loss + pubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + log.Panic("SignHash, error: pubkey from sig recovery failure") + } + if VerifySignature(pubkey, sig, hash) != nil { + log.Panic("SignHash, error: secp256k1.Sign returned non-null " + + "invalid non-null signature") + } + if ChkSig(AddressFromPubKey(pubkey), hash, sig) != nil { + log.Panic("SignHash error: ChkSig failed for signature") + } + } + return sig +} + +// ChkSig checks whether PubKey corresponding to address hash signed hash +// - recovers the PubKey from sig and hash +// - fail if PubKey cannot be be recovered +// - computes the address from the PubKey +// - fail if recovered address does not match PubKey hash +// - verify that signature is valid for hash for PubKey +func ChkSig(address Address, hash SHA256, sig Sig) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return errors.New("Invalig sig: PubKey recovery failed") + } + if address != AddressFromPubKey(NewPubKey(rawPubKey)) { + return errors.New("Invalid sig: address does not match output address") + } + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey[:]) != 1 { + return errors.New("Invalid sig: invalid for hash") + } + return nil +} + +// VerifySignedHash this only checks that the signature can be converted to a public key +// Since there is no pubkey or address argument, it cannot check that the +// signature is valid in that context. +func VerifySignedHash(sig Sig, hash SHA256) error { + rawPubKey := secp256k1.RecoverPubkey(hash[:], sig[:]) + if rawPubKey == nil { + return errors.New("Failed to recover public key") + } + if secp256k1.VerifySignature(hash[:], sig[:], rawPubKey) != 1 { + // If this occurs, secp256k1 is bugged + log.Printf("Recovered public key is not valid for signed hash") + return errors.New("Signature invalid for hash") + } + return nil +} + +// VerifySignature verifies that hash was signed by PubKey +func VerifySignature(pubkey PubKey, sig Sig, hash SHA256) error { + //pubkeyRec, err := PubKeyFromSig(sig, hash) //recovered pubkey + //if err != nil { + // return errors.New("Invalid sig: PubKey recovery failed") + //} + //if pubkeyRec != pubkey { + // return errors.New("Recovered pubkey does not match pubkey") + //} + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + if DebugLevel2 { + if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) == 1 { + log.Panic("VerifySignature warning, ") + } + } + return errors.New("VerifySignature, secp256k1.VerifyPubkey failed") + } + if secp256k1.VerifySignatureValidity(sig[:]) != 1 { + return errors.New("VerifySignature, VerifySignatureValidity failed") + } + //if secp256k1.VerifySignature(hash[:], sig[:], pubkey[:]) != 1 { + // return errors.New("Invalid signature for this message") + //} + return nil +} + +// GenerateKeyPair creates key pair +func GenerateKeyPair() (PubKey, SecKey) { + public, secret := secp256k1.GenerateKeyPair() + + if DebugLevel1 { + if TestSecKey(NewSecKey(secret)) != nil { + log.Panic("DebugLevel1, GenerateKeyPair, generated private key " + + "failed TestSecKey") + } + } + + return NewPubKey(public), NewSecKey(secret) +} + +// GenerateDeterministicKeyPair generates deterministic key pair +func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { + public, secret := secp256k1.GenerateDeterministicKeyPair(seed) + + if DebugLevel1 { + + if TestSecKey(NewSecKey(secret)) != nil { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + "seckey invalid, failed TestSecKey") + } + if TestSecKey(NewSecKey(secret)) != nil { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + "generated private key failed TestSecKey") + } + if PubKeyFromSecKey(NewSecKey(secret)) != NewPubKey(public) { + //s1 := NewSecKey(secret).Hex() + //s2 := NewPubKey(public).Hex() + //s3 := PubKeyFromSecKey(NewSecKey(secret)).Hex() + //log.Printf("sec= %s, pub= %s recpub= %s \n", s1,s2, s3 ) + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + "public key does not match private key") + } + } + return NewPubKey(public), NewSecKey(secret) +} + +// DeterministicKeyPairIterator takes SHA256 value, returns a new +// SHA256 value and publickey and private key. Apply multiple times +// feeding the SHA256 value back into generate sequence of keys +func DeterministicKeyPairIterator(seed []byte) ([]byte, PubKey, SecKey) { + hash, public, secret := secp256k1.DeterministicKeyPairIterator(seed) + if DebugLevel1 { + if TestSecKey(NewSecKey(secret)) != nil { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + "generated private key failed TestSecKey") + } + if PubKeyFromSecKey(NewSecKey(secret)) != NewPubKey(public) { + log.Panic("DebugLevel1, GenerateDeterministicKeyPair, " + + "public key does not match private key") + } + } + return hash, NewPubKey(public), NewSecKey(secret) +} + +// GenerateDeterministicKeyPairs returns sequence of n private keys from initial seed +func GenerateDeterministicKeyPairs(seed []byte, n int) []SecKey { + var keys []SecKey + var seckey SecKey + for i := 0; i < n; i++ { + seed, _, seckey = DeterministicKeyPairIterator(seed) + keys = append(keys, seckey) + } + return keys +} + +// GenerateDeterministicKeyPairsSeed returns sequence of n private keys from initial seed, and return the new seed +func GenerateDeterministicKeyPairsSeed(seed []byte, n int) ([]byte, []SecKey) { + var keys []SecKey + var seckey SecKey + for i := 0; i < n; i++ { + seed, _, seckey = DeterministicKeyPairIterator(seed) + keys = append(keys, seckey) + } + return seed, keys +} + +// TestSecKey test seckey hash +func TestSecKey(seckey SecKey) error { + hash := SumSHA256([]byte(time.Now().String())) + return TestSecKeyHash(seckey, hash) +} + +// TestSecKeyHash performs a series of tests to determine if a seckey is valid. +// All generated keys and keys loaded from disc must pass the TestSecKey suite. +// TestPrivKey returns error if a key fails any test in the test suite. +func TestSecKeyHash(seckey SecKey, hash SHA256) error { + //check seckey with verify + if secp256k1.VerifySeckey(seckey[:]) != 1 { + return errors.New("Seckey verification failed") + } + + //check pubkey recovery + pubkey := PubKeyFromSecKey(seckey) + if pubkey == (PubKey{}) { + return errors.New("impossible error, TestSecKey, nil pubkey recovered") + } + //verify recovered pubkey + if secp256k1.VerifyPubkey(pubkey[:]) != 1 { + return errors.New("impossible error, TestSecKey, Derived Pubkey verification failed") + } + + //check signature production + sig := SignHash(hash, seckey) + pubkey2, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("PubKeyFromSig failed: %v", err) + } + if pubkey != pubkey2 { + return errors.New("Recovered pubkey does not match signed hash") + } + + //check pubkey recovered from sig + recoveredPubkey, err := PubKeyFromSig(sig, hash) + if err != nil { + return fmt.Errorf("impossible error, TestSecKey, pubkey recovery from signature failed: %v", err) + } + if pubkey != recoveredPubkey { + return errors.New("impossible error TestSecKey, pubkey does not match recovered pubkey") + } + + //verify produced signature + err = VerifySignature(pubkey, sig, hash) + if err != nil { + return fmt.Errorf("impossible error, TestSecKey, verify signature failed for sig: %v", err) + } + + //verify ChkSig + addr := AddressFromPubKey(pubkey) + err = ChkSig(addr, hash, sig) + if err != nil { + return fmt.Errorf("impossible error TestSecKey, ChkSig Failed, should not get this far: %v", err) + } + + //verify VerifySignedHash + err = VerifySignedHash(sig, hash) + if err != nil { + return fmt.Errorf("VerifySignedHash failed: %v", err) + } + + return nil +} + +//do not allow program to start if crypto tests fail +func init() { + // init the reuse hash pool. + sha256HashChan = make(chan hash.Hash, poolsize) + ripemd160HashChan = make(chan hash.Hash, poolsize) + for i := 0; i < poolsize; i++ { + sha256HashChan <- sha256.New() + ripemd160HashChan <- ripemd160.New() + } + + _, seckey := GenerateKeyPair() + if err := TestSecKey(seckey); err != nil { + log.Fatalf("CRYPTOGRAPHIC INTEGRITY CHECK FAILED: TERMINATING PROGRAM TO PROTECT COINS: %v", err) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/crypto_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/crypto_test.go new file mode 100755 index 0000000..91ff956 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/crypto_test.go @@ -0,0 +1,344 @@ +package cipher + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher/ripemd160" +) + +func TestNewPubKey(t *testing.T) { + assert.Panics(t, func() { NewPubKey(randBytes(t, 31)) }) + assert.Panics(t, func() { NewPubKey(randBytes(t, 32)) }) + assert.Panics(t, func() { NewPubKey(randBytes(t, 34)) }) + assert.Panics(t, func() { NewPubKey(randBytes(t, 0)) }) + assert.Panics(t, func() { NewPubKey(randBytes(t, 100)) }) + assert.NotPanics(t, func() { NewPubKey(randBytes(t, 33)) }) + b := randBytes(t, 33) + p := NewPubKey(b) + assert.True(t, bytes.Equal(p[:], b)) +} + +func TestPubKeyFromHex(t *testing.T) { + // Invalid hex + assert.Panics(t, func() { MustPubKeyFromHex("") }) + assert.Panics(t, func() { MustPubKeyFromHex("cascs") }) + // Invalid hex length + p := NewPubKey(randBytes(t, 33)) + s := hex.EncodeToString(p[:len(p)/2]) + assert.Panics(t, func() { MustPubKeyFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + assert.NotPanics(t, func() { MustPubKeyFromHex(s) }) + assert.Equal(t, p, MustPubKeyFromHex(s)) +} + +func TestPubKeyHex(t *testing.T) { + b := randBytes(t, 33) + p := NewPubKey(b) + h := p.Hex() + p2 := MustPubKeyFromHex(h) + assert.Equal(t, p2, p) + assert.Equal(t, p2.Hex(), h) +} + +func TestPubKeyVerify(t *testing.T) { + // Random bytes should not be valid, most of the time + failed := false + for i := 0; i < 10; i++ { + b := randBytes(t, 33) + if NewPubKey(b).Verify() != nil { + failed = true + break + } + } + assert.True(t, failed) +} + +func TestPubKeyVerifyNil(t *testing.T) { + // Empty public key should not be valid + p := PubKey{} + assert.NotNil(t, p.Verify()) +} + +func TestPubKeyVerifyDefault1(t *testing.T) { + // Generated pub key should be valid + p, _ := GenerateKeyPair() + assert.Nil(t, p.Verify()) +} + +func TestPubKeyVerifyDefault2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + assert.Nil(t, p.Verify()) + } +} + +func TestPubKeyToAddressHash(t *testing.T) { + p, _ := GenerateKeyPair() + h := p.ToAddressHash() + // Should be Ripemd160(SHA256(SHA256())) + x := sha256.Sum256(p[:]) + x = sha256.Sum256(x[:]) + rh := ripemd160.New() + rh.Write(x[:]) + y := rh.Sum(nil) + assert.True(t, bytes.Equal(h[:], y)) +} + +func TestPubKeyToAddress(t *testing.T) { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + assert.Nil(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + assert.Nil(t, err) +} + +func TestPubKeyToAddress2(t *testing.T) { + for i := 0; i < 1024; i++ { + p, _ := GenerateKeyPair() + addr := AddressFromPubKey(p) + //func (self Address) Verify(key PubKey) error { + err := addr.Verify(p) + assert.Nil(t, err) + addrStr := addr.String() + _, err = DecodeBase58Address(addrStr) + //func DecodeBase58Address(addr string) (Address, error) { + assert.Nil(t, err) + } +} + +func TestMustNewSecKey(t *testing.T) { + assert.Panics(t, func() { NewSecKey(randBytes(t, 31)) }) + assert.Panics(t, func() { NewSecKey(randBytes(t, 33)) }) + assert.Panics(t, func() { NewSecKey(randBytes(t, 34)) }) + assert.Panics(t, func() { NewSecKey(randBytes(t, 0)) }) + assert.Panics(t, func() { NewSecKey(randBytes(t, 100)) }) + assert.NotPanics(t, func() { NewSecKey(randBytes(t, 32)) }) + b := randBytes(t, 32) + p := NewSecKey(b) + assert.True(t, bytes.Equal(p[:], b)) +} + +func TestMustSecKeyFromHex(t *testing.T) { + // Invalid hex + assert.Panics(t, func() { MustSecKeyFromHex("") }) + assert.Panics(t, func() { MustSecKeyFromHex("cascs") }) + // Invalid hex length + p := NewSecKey(randBytes(t, 32)) + s := hex.EncodeToString(p[:len(p)/2]) + assert.Panics(t, func() { MustSecKeyFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + assert.NotPanics(t, func() { MustSecKeyFromHex(s) }) + assert.Equal(t, p, MustSecKeyFromHex(s)) +} + +func TestSecKeyHex(t *testing.T) { + b := randBytes(t, 32) + p := NewSecKey(b) + h := p.Hex() + p2 := MustSecKeyFromHex(h) + assert.Equal(t, p2, p) + assert.Equal(t, p2.Hex(), h) +} + +func TestSecKeyVerify(t *testing.T) { + // Empty secret key should not be valid + p := SecKey{} + assert.NotNil(t, p.Verify()) + + // Generated sec key should be valid + _, p = GenerateKeyPair() + assert.Nil(t, p.Verify()) + + // Random bytes are usually valid +} + +func TestECDHonce(t *testing.T) { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + + buf1 := ECDH(pub2, sec1) + buf2 := ECDH(pub1, sec2) + + assert.True(t, bytes.Equal(buf1, buf2)) +} + +func TestECDHloop(t *testing.T) { + for i := 0; i < 128; i++ { + pub1, sec1 := GenerateKeyPair() + pub2, sec2 := GenerateKeyPair() + buf1 := ECDH(pub2, sec1) + buf2 := ECDH(pub1, sec2) + assert.True(t, bytes.Equal(buf1, buf2)) + } +} + +func TestNewSig(t *testing.T) { + assert.Panics(t, func() { NewSig(randBytes(t, 64)) }) + assert.Panics(t, func() { NewSig(randBytes(t, 66)) }) + assert.Panics(t, func() { NewSig(randBytes(t, 67)) }) + assert.Panics(t, func() { NewSig(randBytes(t, 0)) }) + assert.Panics(t, func() { NewSig(randBytes(t, 100)) }) + assert.NotPanics(t, func() { NewSig(randBytes(t, 65)) }) + b := randBytes(t, 65) + p := NewSig(b) + assert.True(t, bytes.Equal(p[:], b)) +} + +func TestMustSigFromHex(t *testing.T) { + // Invalid hex + assert.Panics(t, func() { MustSigFromHex("") }) + assert.Panics(t, func() { MustSigFromHex("cascs") }) + // Invalid hex length + p := NewSig(randBytes(t, 65)) + s := hex.EncodeToString(p[:len(p)/2]) + assert.Panics(t, func() { MustSigFromHex(s) }) + // Valid + s = hex.EncodeToString(p[:]) + assert.NotPanics(t, func() { MustSigFromHex(s) }) + assert.Equal(t, p, MustSigFromHex(s)) +} + +func TestSigHex(t *testing.T) { + b := randBytes(t, 65) + p := NewSig(b) + h := p.Hex() + p2 := MustSigFromHex(h) + assert.Equal(t, p2, p) + assert.Equal(t, p2.Hex(), h) +} + +func TestChkSig(t *testing.T) { + p, s := GenerateKeyPair() + assert.Nil(t, p.Verify()) + assert.Nil(t, s.Verify()) + a := AddressFromPubKey(p) + assert.Nil(t, a.Verify(p)) + b := randBytes(t, 256) + h := SumSHA256(b) + sig := SignHash(h, s) + assert.Nil(t, ChkSig(a, h, sig)) + // Empty sig should be invalid + assert.NotNil(t, ChkSig(a, h, Sig{})) + // Random sigs should not pass + for i := 0; i < 100; i++ { + assert.NotNil(t, ChkSig(a, h, NewSig(randBytes(t, 65)))) + } + // Sig for one hash does not work for another hash + h2 := SumSHA256(randBytes(t, 256)) + sig2 := SignHash(h2, s) + assert.Nil(t, ChkSig(a, h2, sig2)) + assert.NotNil(t, ChkSig(a, h, sig2)) + assert.NotNil(t, ChkSig(a, h2, sig)) + + // Different secret keys should not create same sig + p2, s2 := GenerateKeyPair() + a2 := AddressFromPubKey(p2) + h = SHA256{} + sig = SignHash(h, s) + sig2 = SignHash(h, s2) + assert.Nil(t, ChkSig(a, h, sig)) + assert.Nil(t, ChkSig(a2, h, sig2)) + assert.NotEqual(t, sig, sig2) + h = SumSHA256(randBytes(t, 256)) + sig = SignHash(h, s) + sig2 = SignHash(h, s2) + assert.Nil(t, ChkSig(a, h, sig)) + assert.Nil(t, ChkSig(a2, h, sig2)) + assert.NotEqual(t, sig, sig2) + + // Bad address should be invalid + assert.NotNil(t, ChkSig(a, h, sig2)) + assert.NotNil(t, ChkSig(a2, h, sig)) +} + +func TestSignHash(t *testing.T) { + p, s := GenerateKeyPair() + a := AddressFromPubKey(p) + h := SumSHA256(randBytes(t, 256)) + sig := SignHash(h, s) + assert.NotEqual(t, sig, Sig{}) + assert.Nil(t, ChkSig(a, h, sig)) +} + +func TestPubKeyFromSecKey(t *testing.T) { + p, s := GenerateKeyPair() + assert.Equal(t, PubKeyFromSecKey(s), p) + assert.Panics(t, func() { PubKeyFromSecKey(SecKey{}) }) + assert.Panics(t, func() { PubKeyFromSecKey(NewSecKey(randBytes(t, 99))) }) + assert.Panics(t, func() { PubKeyFromSecKey(NewSecKey(randBytes(t, 31))) }) +} + +func TestPubKeyFromSig(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + sig := SignHash(h, s) + p2, err := PubKeyFromSig(sig, h) + assert.Equal(t, p, p2) + assert.Nil(t, err) + _, err = PubKeyFromSig(Sig{}, h) + assert.NotNil(t, err) +} + +func TestVerifySignature(t *testing.T) { + p, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + h2 := SumSHA256(randBytes(t, 256)) + sig := SignHash(h, s) + assert.Nil(t, VerifySignature(p, sig, h)) + assert.NotNil(t, VerifySignature(p, Sig{}, h)) + assert.NotNil(t, VerifySignature(p, sig, h2)) + p2, _ := GenerateKeyPair() + assert.NotNil(t, VerifySignature(p2, sig, h)) + assert.NotNil(t, VerifySignature(PubKey{}, sig, h)) +} + +func TestGenerateKeyPair(t *testing.T) { + p, s := GenerateKeyPair() + assert.Nil(t, p.Verify()) + assert.Nil(t, s.Verify()) +} + +func TestGenerateDeterministicKeyPair(t *testing.T) { + // TODO -- deterministic key pairs are useless as is because we can't + // generate pair n+1, only pair 0 + seed := randBytes(t, 32) + p, s := GenerateDeterministicKeyPair(seed) + assert.Nil(t, p.Verify()) + assert.Nil(t, s.Verify()) + p, s = GenerateDeterministicKeyPair(seed) + assert.Nil(t, p.Verify()) + assert.Nil(t, s.Verify()) +} + +func TestSecKeTest(t *testing.T) { + _, s := GenerateKeyPair() + assert.Nil(t, TestSecKey(s)) + assert.NotNil(t, TestSecKey(SecKey{})) +} + +func TestSecKeyHashTest(t *testing.T) { + _, s := GenerateKeyPair() + h := SumSHA256(randBytes(t, 256)) + assert.Nil(t, TestSecKeyHash(s, h)) + assert.NotNil(t, TestSecKeyHash(SecKey{}, h)) +} + +func TestGenerateDeterministicKeyPairsUsesAllBytes(t *testing.T) { + // Tests that if a seed >128 bits is used, the generator does not ignore bits >128 + seed := "property diet little foster provide disagree witness mountain alley weekend kitten general" + seckeys := GenerateDeterministicKeyPairs([]byte(seed), 3) + seckeys2 := GenerateDeterministicKeyPairs([]byte(seed[:16]), 3) + require.NotEqual(t, seckeys, seckeys2) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md new file mode 100755 index 0000000..3aa1c31 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/README.md @@ -0,0 +1,8 @@ +encoder +======= + +[![GoDoc](http://godoc.org/github.com//skycoin/skycoin/src/cipher/encoder?status.png)](http://godoc.org/github.com/skycoin/skycoin/src/cipher/encoder) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/skycoin/src/cipher/encoder) + +Binary struct encoder for Go. Fork of go's pkg encoding/binary. diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go new file mode 100755 index 0000000..70b89e0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder.go @@ -0,0 +1,1147 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package encoder binary implements translation between numbers and byte sequences +// and encoding and decoding of varints. +// +// Numbers are translated by reading and writing fixed-size values. +// A fixed-size value is either a fixed-size arithmetic +// type (int8, uint8, int16, float32, complex64, ...) +// or an array or struct containing only fixed-size values. +// +// Varints are a method of encoding integers using one or more bytes; +// numbers with smaller absolute value take a smaller number of bytes. +// For a specification, see http://code.google.com/apis/protocolbuffers/docs/encoding.html. +// +// Fields can be ignored with the struct tag `enc:"-"` . +// Unexported struct fields are ignored by default . +// +// Fields can be skipped if empty with the struct tag `enc:",omitempty"` +// Note the comma, which follows package json's conventions. +// Only Slice, Map and String types recognize the omitempty tag. +// When omitempty is set, the no data will be written if the value is empty. +// If the value is empty and omitempty is not set, then a length prefix with value 0 would be written. +// omitempty can only be used for the last field in the struct +package encoder + +import ( + "errors" + "fmt" + "io" + "log" + "math" + "reflect" + "strings" +) + +/* +Todo: +- ensure that invalid input from foreign server cannot crash +- validate packet legnth for incoming +*/ + +var ( + // ErrBufferUnderflow bytes in input buffer not enough to deserialize expected type + ErrBufferUnderflow = errors.New("Not enough buffer data to deserialize") + // ErrInvalidOmitEmpty field tagged with omitempty and it's not last one in struct + ErrInvalidOmitEmpty = errors.New("omitempty only supported for the final field in the struct") +) + +// TODO: constant length byte arrays must not be prefixed + +// EncodeInt encodes an Integer type contained in `data` +// into buffer `b`. If `data` is not an Integer type, +// panic message is logged. +func EncodeInt(b []byte, data interface{}) { + //var b [8]byte + var bs []byte + switch v := data.(type) { + + case int8: + bs = b[:1] + b[0] = byte(v) + case uint8: + bs = b[:1] + b[0] = byte(v) + case int16: + bs = b[:2] + lePutUint16(bs, uint16(v)) + case uint16: + bs = b[:2] + lePutUint16(bs, v) + case int32: + bs = b[:4] + lePutUint32(bs, uint32(v)) + case uint32: + bs = b[:4] + lePutUint32(bs, v) + case int64: + bs = b[:8] + lePutUint64(bs, uint64(v)) + case uint64: + bs = b[:8] + lePutUint64(bs, v) + default: + log.Panic("PushAtomic, case not handled") + } +} + +// DecodeInt decodes `in` buffer into `data` parameter. +// If `data` is not an Integer type, panic message is logged. +func DecodeInt(in []byte, data interface{}) { + + n := intDestSize(data) + if len(in) < n { + log.Panic() + } + if n != 0 { + var b [8]byte + copy(b[0:n], in[0:n]) + bs := b[:n] + + switch v := data.(type) { + case *int8: + *v = int8(b[0]) + case *uint8: + *v = b[0] + case *int16: + *v = int16(leUint16(bs)) + case *uint16: + *v = leUint16(bs) + case *int32: + *v = int32(leUint32(bs)) + case *uint32: + *v = leUint32(bs) + case *int64: + *v = int64(leUint64(bs)) + case *uint64: + *v = leUint64(bs) + default: + //FIX: this does not get triggered on invalid type in + // pass in struct on unit test + log.Panic("PopAtomic, case not handled") + + } + + } +} + +// DeserializeAtomic deserializes `in` buffer into `data` +// parameter. If `data` is not an atomic type +// (i.e., Integer type or Boolean type), panic message is logged. +func DeserializeAtomic(in []byte, data interface{}) { + n := intDestSize(data) + if len(in) < n { + log.Panic(ErrBufferUnderflow) + } + if n != 0 { + var b [8]byte + copy(b[0:n], in[0:n]) + bs := b[:n] + + switch v := data.(type) { + case *bool: + if b[0] == 1 { + *v = true + } else { + *v = false + } + case *int8: + *v = int8(b[0]) + case *uint8: + *v = b[0] + case *int16: + *v = int16(leUint16(bs)) + case *uint16: + *v = leUint16(bs) + case *int32: + *v = int32(leUint32(bs)) + case *uint32: + *v = leUint32(bs) + case *int64: + *v = int64(leUint64(bs)) + case *uint64: + *v = leUint64(bs) + default: + //FIX: this does not get triggered on invalid type in + // pass in struct on unit test + log.Panic("type not atomic") + } + } +} + +// DeserializeRaw deserializes `in` buffer into return +// parameter. If `data` is not either a Pointer type, +// a Slice type or a Struct type, an error message +// is returned. If `in` buffer can't be deserialized, +// an error message is returned. +func DeserializeRaw(in []byte, data interface{}) error { + v := reflect.ValueOf(data) + switch v.Kind() { + case reflect.Ptr: + v = v.Elem() + case reflect.Slice: + case reflect.Struct: + case reflect.Map: + default: + return fmt.Errorf("Invalid type %s", reflect.TypeOf(v).String()) + } + + d1 := &decoder{buf: make([]byte, len(in))} + copy(d1.buf, in) + + //check if can deserialize + d2 := &decoder{buf: make([]byte, len(in))} + copy(d2.buf, in) + if d2.dchk(v) != 0 { + return errors.New("Deserialization failed") + } + + return d1.value(v) +} + +// Deserialize reads `dsize` bytes from `r` and deserializes +// the resulting buffer into return parameter. If `data` +// is not either a Pointer type, a Slice type or a Struct type, +// an error message is returned. If `in` buffer can't be deserialized, +// an error message is returned. +func Deserialize(r io.Reader, dsize int, data interface{}) error { + // Fallback to reflect-based decoding. + //fmt.Printf("A1 v is type %s \n", reflect.TypeOf(data).String() ) + //fmt.Printf("A2 v is value/type %s \n", reflect.ValueOf(data).Type().String() ) + //fmt.Printf("A2 v is value,kind %s \n", reflect.ValueOf(data).Kind().String() ) + + var v reflect.Value + switch d := reflect.ValueOf(data); d.Kind() { + //case reflect. + + case reflect.Ptr: + v = d.Elem() + case reflect.Slice: + v = d + case reflect.Struct: + + default: + return errors.New("binary.Read: invalid type " + reflect.TypeOf(d).String()) + } + //size, err := datasizeWrite(v) + //if err != nil { + // return errors.New("binary.Read: " + err.Error()) + //} + + //fmt.Printf("B v is type %s \n", v.Type().String() ) + //fmt.Printf("C v is type %s \n", reflect.TypeOf(v).String() ) + //fmt.Printf("D v is type %s \n", reflect.TypeOf(reflect.TypeOf(v)).String() ) + + d1 := &decoder{buf: make([]byte, dsize)} + if _, err := io.ReadFull(r, d1.buf); err != nil { + return err + } + + //check if can deserialize + d2 := &decoder{buf: make([]byte, dsize)} + copy(d2.buf, d1.buf) + if d2.dchk(v) != 0 { + return errors.New("Deserialization failed") + } + + return d1.value(v) +} + +// CanDeserialize returns true if `in` buffer can be +// deserialized into `dst`'s type. Returns false in any +// other case. +func CanDeserialize(in []byte, dst reflect.Value) bool { + d1 := &decoder{buf: make([]byte, len(in))} + copy(d1.buf, in) + if d1.dchk(dst) != 0 { + return false + } + return true +} + +// DeserializeRawToValue deserializes `in` buffer into +// `dst`'s type and returns the number of bytes used and +// the value of the buffer. If `data` is not either a +// Pointer type, a Slice type or a Struct type, 0 and an error +// message are returned. If `in` buffer can't be deserialized, 0 and +// an error message are returned. +func DeserializeRawToValue(in []byte, dst reflect.Value) (int, error) { + var v reflect.Value + switch dst.Kind() { + case reflect.Ptr: + v = dst.Elem() + case reflect.Slice: + v = dst + case reflect.Struct: + default: + return 0, errors.New("binary.Read: invalid type " + reflect.TypeOf(dst).String()) + } + + inlen := len(in) + d1 := &decoder{buf: make([]byte, inlen)} + copy(d1.buf, in) + + //check if can deserialize + d2 := &decoder{buf: make([]byte, inlen)} + copy(d2.buf, d1.buf) + if d2.dchk(v) != 0 { + return 0, errors.New("Deserialization failed") + } + + err := d1.value(v) + return inlen - len(d1.buf), err +} + +// DeserializeToValue reads `dsize` bytes from `r`, +// deserializes the resulting buffer into `dst`'s type and +// returns the value of the buffer. If `data` is not either +// a Pointer type, a Slice type or a Struct type, an error +// message is returned. If `in` buffer can't be deserialized, an +// error message is returned. +func DeserializeToValue(r io.Reader, dsize int, dst reflect.Value) error { + + //fmt.Printf("*A1 v is type %s \n", data.Type().String() ) //this is the type of the value + + var v reflect.Value + switch dst.Kind() { + case reflect.Ptr: + v = dst.Elem() + case reflect.Slice: + v = dst + case reflect.Struct: + + default: + return errors.New("binary.Read: invalid type " + reflect.TypeOf(dst).String()) + } + + //fmt.Printf("*A2 v is type %s \n", v.Type().String() ) //this is the type of the value + + d1 := &decoder{buf: make([]byte, dsize)} + if _, err := io.ReadFull(r, d1.buf); err != nil { + return err + } + + return d1.value(v) +} + +// SerializeAtomic returns serialization of `data` +// parameter. If `data` is not an atomic type, panic message is logged. +func SerializeAtomic(data interface{}) []byte { + var b [8]byte + var bs []byte + switch v := data.(type) { + case *bool: + bs = b[:1] + if *v { + b[0] = 1 + } else { + b[0] = 0 + } + case bool: + bs = b[:1] + if v { + b[0] = 1 + } else { + b[0] = 0 + } + case *int8: + bs = b[:1] + b[0] = byte(*v) + case int8: + bs = b[:1] + b[0] = byte(v) + case *uint8: + bs = b[:1] + b[0] = *v + case uint8: + bs = b[:1] + b[0] = byte(v) + case *int16: + bs = b[:2] + lePutUint16(bs, uint16(*v)) + case int16: + bs = b[:2] + lePutUint16(bs, uint16(v)) + case *uint16: + bs = b[:2] + lePutUint16(bs, *v) + case uint16: + bs = b[:2] + lePutUint16(bs, v) + case *int32: + bs = b[:4] + lePutUint32(bs, uint32(*v)) + case int32: + bs = b[:4] + lePutUint32(bs, uint32(v)) + case *uint32: + bs = b[:4] + lePutUint32(bs, *v) + case uint32: + bs = b[:4] + lePutUint32(bs, v) + case *int64: + bs = b[:8] + lePutUint64(bs, uint64(*v)) + case int64: + bs = b[:8] + lePutUint64(bs, uint64(v)) + case *uint64: + bs = b[:8] + lePutUint64(bs, *v) + case uint64: + bs = b[:8] + lePutUint64(bs, v) + default: + log.Panic("type not atomic") + } + return bs +} + +// Serialize returns serialized basic type-based `data` +// parameter. Encoding is reflect-based. +func Serialize(data interface{}) []byte { + // Fast path for basic types. + // Fallback to reflect-based encoding. + v := reflect.Indirect(reflect.ValueOf(data)) + size, err := datasizeWrite(v) + if err != nil { + log.Panic(err) + } + buf := make([]byte, size) + e := &encoder{buf: buf} + e.value(v) + return buf +} + +// Size returns how many bytes would it take to encode the +// value v, which must be a fixed-size value (struct) or a +// slice of fixed-size values, or a pointer to such data. +// Reflect-based encoding is used. +func Size(v interface{}) int { + n, err := datasizeWrite(reflect.Indirect(reflect.ValueOf(v))) + if err != nil { + return -1 + } + return n +} + +// isEmpty returns true if a value is "empty". +// Only supports Slice, Map and String. +// All other values are never considered empty. +func isEmpty(v reflect.Value) bool { + t := v.Type() + switch t.Kind() { + case reflect.String: + return v.Len() == 0 + case reflect.Map: + return v.IsNil() || v.Len() == 0 + case reflect.Slice: + return v.IsNil() || v.Len() == 0 + default: + return false + } +} + +// datasizeWrite returns the number of bytes the actual data represented by v occupies in memory. +// For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice +// it returns the length of the slice times the element size and does not count the memory +// occupied by the header. +func datasizeWrite(v reflect.Value) (int, error) { + t := v.Type() + switch t.Kind() { + case reflect.Interface: + return datasizeWrite(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + size := 0 + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s, err := datasizeWrite(elem) + if err != nil { + return 0, err + } + size += s + } + return size, nil + + case reflect.Slice: + size := 0 + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + s, err := datasizeWrite(elem) + if err != nil { + return 0, err + } + size += s + } + return 4 + size, nil + + case reflect.Map: + // length prefix + size := 4 + for _, key := range v.MapKeys() { + s, err := datasizeWrite(key) + if err != nil { + return 0, err + } + size += s + elem := v.MapIndex(key) + s, err = datasizeWrite(elem) + if err != nil { + return 0, err + } + size += s + } + return size, nil + + case reflect.Struct: + sum := 0 + nFields := t.NumField() + for i, n := 0, nFields; i < n; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !omitempty || !isEmpty(fv) { + s, err := datasizeWrite(fv) + if err != nil { + return 0, err + } + sum += s + } + } + } + return sum, nil + + case reflect.Bool: + return 1, nil + + case reflect.String: + return len(v.String()) + 4, nil + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Float32, reflect.Float64: + return int(t.Size()), nil + + default: + return 0, errors.New("invalid type " + t.String()) + } +} + +// ParseTag to extract encoder args from raw string +func ParseTag(tag string) (string, bool) { + tagSplit := strings.Split(tag, ",") + name := tagSplit[0] + + omitempty := false + if len(tagSplit) > 1 && tagSplit[1] == "omitempty" { + omitempty = true + } + + return name, omitempty +} + +/* + Internals +*/ + +func leUint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 } + +func lePutUint16(b []byte, v uint16) { + b[0] = byte(v) + b[1] = byte(v >> 8) +} + +func leUint32(b []byte) uint32 { + return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 +} + +func lePutUint32(b []byte, v uint32) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) +} + +func leUint64(b []byte) uint64 { + return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | + uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 +} + +func lePutUint64(b []byte, v uint64) { + b[0] = byte(v) + b[1] = byte(v >> 8) + b[2] = byte(v >> 16) + b[3] = byte(v >> 24) + b[4] = byte(v >> 32) + b[5] = byte(v >> 40) + b[6] = byte(v >> 48) + b[7] = byte(v >> 56) +} + +type coder struct { + buf []byte //nolint: structcheck +} + +type decoder coder +type encoder coder + +func (d *decoder) bool() bool { + x := d.buf[0] + d.buf = d.buf[1:] //advance slice + if x == 0 { + return false + } + return true +} + +func (e *encoder) bool(x bool) { + if x { + e.buf[0] = 1 + } else { + e.buf[0] = 0 + } + e.buf = e.buf[1:] +} + +func (d decoder) string() string { + l := int(d.uint32()) //pop length + t := d.buf[:l] + d.buf = d.buf[l:] + return string(t) +} + +func (e encoder) string(xs string) { + x := []byte(xs) + l := len(x) + for i := 0; i < l; i++ { + e.buf[i] = x[i] + } //memcpy + e.buf = e.buf[l:] //advance slice l bytes + +} //write this + +func (d *decoder) uint8() uint8 { + x := d.buf[0] + d.buf = d.buf[1:] //advance slice + return x +} + +func (e *encoder) uint8(x uint8) { + e.buf[0] = x + e.buf = e.buf[1:] +} + +func (d *decoder) uint16() uint16 { + x := leUint16(d.buf[0:2]) + d.buf = d.buf[2:] + return x +} + +func (e *encoder) uint16(x uint16) { + lePutUint16(e.buf[0:2], x) + e.buf = e.buf[2:] +} + +func (d *decoder) uint32() uint32 { + x := leUint32(d.buf[0:4]) + d.buf = d.buf[4:] + return x +} + +func (e *encoder) uint32(x uint32) { + lePutUint32(e.buf[0:4], x) + e.buf = e.buf[4:] +} + +func (d *decoder) uint64() uint64 { + x := leUint64(d.buf[0:8]) + d.buf = d.buf[8:] + return x +} + +func (e *encoder) uint64(x uint64) { + lePutUint64(e.buf[0:8], x) + e.buf = e.buf[8:] +} + +//v.SetBytes(d.bytes()) +func (d decoder) bytes() []byte { + l := int(d.uint32()) //pop length + t := d.buf[:l] + d.buf = d.buf[l:] + return t +} + +func (e encoder) bytes(x []byte) { + l := len(x) + for i := 0; i < l; i++ { + e.buf[i] = x[i] + } //memcpy + e.buf = e.buf[l:] //advance slice l bytes + +} //write this + +func (d *decoder) int8() int8 { return int8(d.uint8()) } + +func (e *encoder) int8(x int8) { e.uint8(uint8(x)) } + +func (d *decoder) int16() int16 { return int16(d.uint16()) } + +func (e *encoder) int16(x int16) { e.uint16(uint16(x)) } + +func (d *decoder) int32() int32 { return int32(d.uint32()) } + +func (e *encoder) int32(x int32) { e.uint32(uint32(x)) } + +func (d *decoder) int64() int64 { return int64(d.uint64()) } + +func (e *encoder) int64(x int64) { e.uint64(uint64(x)) } + +func (d *decoder) value(v reflect.Value) error { + kind := v.Kind() + switch kind { + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + for i := 0; i < v.Len(); i++ { + if err := d.value(v.Index(i)); err != nil { + return err + } + } + + case reflect.Map: + if len(d.buf) < 4 { + return ErrBufferUnderflow + } + length := int(d.uint32()) + if length < 0 || length > len(d.buf) { + return fmt.Errorf("Invalid length: %d", length) + } + t := v.Type() + key := t.Key() + elem := t.Elem() + if v.IsNil() { + v.Set(reflect.Indirect(reflect.MakeMap(t))) + } + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + if err := d.value(keyv); err != nil { + return err + } + if err := d.value(elemv); err != nil { + return err + } + v.SetMapIndex(keyv, elemv) + } + + case reflect.Slice: + if len(d.buf) < 4 { + return ErrBufferUnderflow + } + length := int(d.uint32()) + if length < 0 || length > len(d.buf) { + return fmt.Errorf("Invalid length: %d", length) + } + elem := v.Type().Elem() + if elem.Kind() == reflect.Uint8 { + v.SetBytes(d.buf[:length]) + d.buf = d.buf[length:] + } else { + for i := 0; i < length; i++ { + elemv := reflect.Indirect(reflect.New(elem)) + if err := d.value(elemv); err != nil { + return err + } + v.Set(reflect.Append(v, elemv)) + } + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if fv.CanSet() && ff.Name != "_" { + if err := d.value(fv); err != nil { + // omitempty fields at the end of the buffer are ignored + if !(omitempty && len(d.buf) == 0) { + return err + } + } + } else { + //dont decode anything + //d.skip(fv) //BUG!? + } + } + } + + case reflect.String: + if len(d.buf) < 4 { + return ErrBufferUnderflow + } + length := int(d.uint32()) + if length < 0 || length > len(d.buf) { + return fmt.Errorf("Invalid length: %d", length) + } + v.SetString(string(d.buf[:length])) + d.buf = d.buf[length:] + + case reflect.Bool: + v.SetBool(d.bool()) + case reflect.Int8: + v.SetInt(int64(d.int8())) + case reflect.Int16: + v.SetInt(int64(d.int16())) + case reflect.Int32: + v.SetInt(int64(d.int32())) + case reflect.Int64: + v.SetInt(d.int64()) + + case reflect.Uint8: + v.SetUint(uint64(d.uint8())) + case reflect.Uint16: + v.SetUint(uint64(d.uint16())) + case reflect.Uint32: + v.SetUint(uint64(d.uint32())) + case reflect.Uint64: + v.SetUint(d.uint64()) + + case reflect.Float32: + v.SetFloat(float64(math.Float32frombits(d.uint32()))) + case reflect.Float64: + v.SetFloat(math.Float64frombits(d.uint64())) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + return nil +} + +//advance, returns -1 on failure +//returns 0 on success +func (d *decoder) adv(n int) int { + if n > len(d.buf) { + n = len(d.buf) + d.buf = d.buf[n:] + return -1 + } + d.buf = d.buf[n:] + return 0 +} + +//recursive size +func (d *decoder) dchk(v reflect.Value) int { + kind := v.Kind() + switch kind { + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + for i := 0; i < v.Len(); i++ { + if d.dchk(v.Index(i)) < 0 { + return -1 + } + } + return 0 + + case reflect.Map: + if len(d.buf) < 4 { + return -1 //error + } + + length := int(leUint32(d.buf[0:4])) + if d.adv(4) < 0 { + return -1 + } + + key := v.Type().Key() + elem := v.Type().Elem() + + for i := 0; i < length; i++ { + keyv := reflect.Indirect(reflect.New(key)) + elemv := reflect.Indirect(reflect.New(elem)) + + if d.dchk(keyv) < 0 { + return -1 + } + + if d.dchk(elemv) < 0 { + return -1 + } + } + return 0 + case reflect.Slice: + if len(d.buf) < 4 { + return -1 + } + + length := int(leUint32(d.buf[0:4])) + if d.adv(4) < 0 { + return -1 + } + + if length < 0 || length > len(d.buf) { + return -1 + } + + elem := v.Type().Elem() + if elem.Kind() == reflect.Uint8 { + return d.adv(length) + } + + for i := 0; i < length; i++ { + elemv := reflect.Indirect(reflect.New(elem)) + + if d.dchk(elemv) < 0 { + return -1 + } + } + return 0 + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !omitempty && fv.CanSet() && ff.Name != "_" { + if d.dchk(fv) < 0 { + return -1 + } + } else { + //dont try to decode anything + //d.skip(fv) //BUG!? + } + } + } + return 0 + + case reflect.Bool: + return d.adv(1) + case reflect.String: + if len(d.buf) < 4 { + return -1 + } + + length := int(leUint32(d.buf[0:4])) + if d.adv(4) < 0 { + return -1 + } + + return d.adv(length) + case reflect.Int8: + return d.adv(1) + case reflect.Int16: + return d.adv(2) + case reflect.Int32: + return d.adv(4) + case reflect.Int64: + return d.adv(8) + + case reflect.Uint8: + return d.adv(1) + case reflect.Uint16: + return d.adv(2) + case reflect.Uint32: + return d.adv(4) + case reflect.Uint64: + return d.adv(8) + + case reflect.Float32: + return d.adv(4) + case reflect.Float64: + return d.adv(8) + + default: + log.Panicf("Decode error: kind %s not handled", v.Kind().String()) + } + + log.Panic() + return 0 +} + +func (e *encoder) value(v reflect.Value) { + + switch v.Kind() { + case reflect.Interface: + e.value(v.Elem()) + + case reflect.Array: + // Arrays are a fixed size, so the length is not written + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + + case reflect.Slice: + e.uint32(uint32(v.Len())) + for i := 0; i < v.Len(); i++ { + e.value(v.Index(i)) + } + + case reflect.Map: + e.uint32(uint32(v.Len())) + for _, key := range v.MapKeys() { + e.value(key) + e.value(v.MapIndex(key)) + } + + case reflect.Struct: + t := v.Type() + nFields := v.NumField() + for i := 0; i < nFields; i++ { + // see comment for corresponding code in decoder.value() + ff := t.Field(i) + // Skip unexported fields + if ff.PkgPath != "" { + continue + } + + tag, omitempty := ParseTag(ff.Tag.Get("enc")) + + if omitempty && i != nFields-1 { + log.Panic(ErrInvalidOmitEmpty) + } + + if tag != "-" { + fv := v.Field(i) + if !(omitempty && isEmpty(fv)) && (fv.CanSet() || ff.Name != "_") { + e.value(fv) + } else { + //dont write anything + //e.skip(v) + } + } + } + + case reflect.Bool: + e.bool(v.Bool()) + + case reflect.String: + vb := []byte(v.String()) + e.uint32(uint32(len(vb))) + for i := 0; i < len(vb); i++ { + e.uint8(vb[i]) + } + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch v.Type().Kind() { + case reflect.Int8: + e.int8(int8(v.Int())) + case reflect.Int16: + e.int16(int16(v.Int())) + case reflect.Int32: + e.int32(int32(v.Int())) + case reflect.Int64: + e.int64(v.Int()) + } + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch v.Type().Kind() { + case reflect.Uint8: + e.uint8(uint8(v.Uint())) + case reflect.Uint16: + e.uint16(uint16(v.Uint())) + case reflect.Uint32: + e.uint32(uint32(v.Uint())) + case reflect.Uint64: + e.uint64(v.Uint()) + } + + case reflect.Float32, reflect.Float64: + switch v.Type().Kind() { + case reflect.Float32: + e.uint32(math.Float32bits(float32(v.Float()))) + case reflect.Float64: + e.uint64(math.Float64bits(v.Float())) + } + + default: + log.Panic("Encoding unhandled type " + v.Type().Name()) + + } + +} + +func (d *decoder) skip(v reflect.Value) { + n, _ := datasizeWrite(v) + d.buf = d.buf[n:] +} + +//skip with byte size return +/* +func (d *decoder) skipn(v reflect.Value) int { + n := intDestSize(&v) + if n == 0 { + log.Panic() + } + d.buf = d.buf[n:] + return n +} +*/ +func (e *encoder) skip(v reflect.Value) { + n, _ := datasizeWrite(v) + for i := range e.buf[0:n] { + e.buf[i] = 0 + } + e.buf = e.buf[n:] +} + +// intDestSize returns the size of the integer that ptrType points to, +// or 0 if the type is not supported. +func intDestSize(ptrType interface{}) int { + switch ptrType.(type) { + case *bool: + return 1 + case *int8, *uint8: + return 1 + case *int16, *uint16: + return 2 + case *int32, *uint32: + return 4 + case *int64, *uint64: + return 8 + } + return 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder_test.go new file mode 100755 index 0000000..901ef9b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/encoder_test.go @@ -0,0 +1,894 @@ +package encoder + +import ( + "bytes" + "crypto/rand" + "encoding/hex" + "log" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" +) + +func randBytes(n int) []byte { // nolint: unparam + const alphanum = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + var bytes = make([]byte, n) + rand.Read(bytes) + for i, b := range bytes { + bytes[i] = alphanum[b%byte(len(alphanum))] + } + return bytes +} + +/* +* the file name has to end with _test.go to be picked up as a set of tests by go test +* the package name has to be the same as in the source file that has to be tested +* you have to import the package testing +* all test functions should start with Test to be run as a test +* the tests will be executed in the same order that they are appear in the source +* the test function TestXxx functions take a pointer to the type testing.T. You use it to record the test status and also for logging. +* the signature of the test function should always be func TestXxx ( *testing.T). You can have any combination of alphanumeric characters and the hyphen for the Xxx part, the only constraint that it should not begin with a small alphabet, [a-z]. +* a call to any of the following functions of testing.T within the test code Error, Errorf, FailNow, Fatal, FatalIf will indicate to go test that the test has failed. + */ + +//Size of= 13 +type TestStruct struct { + X int32 + Y int64 + Z uint8 + K []byte + W bool + T string + U cipher.PubKey +} + +type TestStruct2 struct { + X int32 + Y int64 + Z uint8 + K [8]byte + W bool +} + +type TestStructIgnore struct { + X int32 + Y int64 + Z uint8 `enc:"-"` + K []byte +} + +type TestStructWithoutIgnore struct { + X int32 + Y int64 + K []byte +} + +//func (*B) Fatal + +func Test_Encode_1(T *testing.T) { //test function starts with "Test" and takes a pointer to type testing.T + var t TestStruct + t.X = 345535 + t.Y = 23432435443 + t.Z = 255 + t.K = []byte("TEST6") + t.W = true + t.T = "hello" + t.U = cipher.PubKey{1, 2, 3, 0, 5, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + + b := Serialize(t) + + var buf bytes.Buffer + buf.Write(b) + + var t2 TestStruct + err := Deserialize(&buf, len(b), &t2) + if err != nil { + T.Fatal(err) + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +func Test_Encode_2a(T *testing.T) { //test function starts with "Test" and takes a pointer to type testing.T + var t TestStruct2 + t.X = 345535 + t.Y = 23432435443 + t.Z = 255 + t.W = false + _tt := []byte("ASDSADFSDFASDFSD") + for i := 0; i < 8; i++ { + t.K[i] = _tt[i] + } + + b := Serialize(t) + + var buf bytes.Buffer + buf.Write(b) + + var t2 TestStruct2 + err := Deserialize(&buf, len(b), &t2) + if err != nil { + T.Fatal(err) + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +func Test_Encode_2b(T *testing.T) { //test function starts with "Test" and takes a pointer to type testing.T + var t TestStruct2 + t.X = 345535 + t.Y = 23432435443 + t.Z = 255 + _tt := []byte("ASDSADFSDFASDFSD") + for i := 0; i < 8; i++ { + t.K[i] = _tt[i] + } + + b := Serialize(t) + + var t2 TestStruct2 + err := DeserializeRaw(b, &t2) + if err != nil { + T.Fatal(err) + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +type TestStruct3 struct { + X int32 + K []byte +} + +func Test_Encode_3a(T *testing.T) { //test function starts with "Test" and takes a pointer to type testing.T + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(32) + + b := Serialize(t1) + + var buf bytes.Buffer + buf.Write(b) + + var t2 TestStruct3 + err := Deserialize(&buf, len(b), &t2) + if err != nil { + T.Fatal(err) + } + + if t1.X != t2.X || len(t1.K) != len(t2.K) || bytes.Compare(t1.K, t2.K) != 0 { + T.Fatal() + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +func Test_Encode_3b(T *testing.T) { //test function starts with "Test" and takes a pointer to type testing.T + var t1 TestStruct3 + t1.X = 345535 + t1.K = randBytes(32) + + b := Serialize(t1) + + var t2 TestStruct3 + err := DeserializeRaw(b, &t2) + if err != nil { + T.Fatal(err) + } + + if t1.X != t2.X || len(t1.K) != len(t2.K) || bytes.Compare(t1.K, t2.K) != 0 { + T.Fatal() + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +type TestStruct4 struct { + X int32 + Y int32 +} + +type TestStruct5 struct { + X int32 + A []TestStruct4 +} + +func Test_Encode_4(T *testing.T) { + var t1 TestStruct5 + t1.X = 345535 + + const NUM = 8 + t1.A = make([]TestStruct4, NUM) + + b := Serialize(t1) + + var t2 TestStruct5 + err := DeserializeRaw(b, &t2) + if err != nil { + T.Fatal(err) + } + + if t1.X != t2.X { + T.Fatal("TestStruct5.X not equal") + } + + if len(t1.A) != len(t2.A) { + T.Fatal("Slice lengths not equal") + } + + for i, ts := range t1.A { + if ts != t2.A[i] { + T.Fatal("Slice values not equal") + } + } + + b2 := Serialize(t2) + + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +// type TestStruct2 struct { +// X int32 +// Y int64 +// Z uint8 +// K [8]byte +// } + +func Test_Encode_5(T *testing.T) { + + var ts TestStruct2 + ts.X = 345535 + ts.Y = 23432435443 + ts.Z = 255 + + b1 := Serialize(ts) + + var t = reflect.TypeOf(ts) + var v = reflect.New(t) //pointer to type t + + //New returns a Value representing a pointer to a new zero value for the specified type. + //That is, the returned Value's Type is PtrTo(t). + + _, err := DeserializeRawToValue(b1, v) + if err != nil { + T.Fatal(err) + } + + v = reflect.Indirect(v) + if v.FieldByName("X").Int() != int64(ts.X) { + T.Fatalf("X not equal") + } + if v.FieldByName("Y").Int() != ts.Y { + T.Fatalf("Y not equal") + } + if v.FieldByName("Z").Uint() != uint64(ts.Z) { + T.Fatalf("Z not equal") + } +} + +func Test_Encode_IgnoreTagSerialize(T *testing.T) { + var t TestStructIgnore + t.X = 345535 + t.Y = 23432435443 + t.Z = 255 + t.K = []byte("TEST6") + + b := Serialize(t) + var buf bytes.Buffer + buf.Write(b) + + var t2 TestStructIgnore + t.X = 0 + t.Y = 0 + t.Z = 0 + t.K = []byte("") + err := Deserialize(&buf, len(b), &t2) + if err != nil { + T.Fatal(err) + } + + if t2.Z != 0 { + T.Fatalf("Z should not deserialize. It is %d", t2.Z) + } + + buf.Reset() + buf.Write(b) + + var t3 TestStructWithoutIgnore + err = Deserialize(&buf, len(b), &t3) + if err != nil { + T.Fatal(err) + } + + b2 := Serialize(t2) + if bytes.Compare(b, b2) != 0 { + T.Fatal() + } +} + +type Contained struct { + X uint32 + Y uint64 + Bytes []uint8 + Ints []uint16 +} + +type Container struct { + Elements []Contained +} + +func TestEncodeNestedSlice(t *testing.T) { + size := 0 + elems := make([]Contained, 4) + for i := range elems { + elems[i].X = uint32(i) + size += 4 + elems[i].Y = uint64(i) + size += 8 + elems[i].Bytes = make([]uint8, i) + for j := range elems[i].Bytes { + elems[i].Bytes[j] = uint8(j) + } + size += 4 + i*1 + elems[i].Ints = make([]uint16, i) + for j := range elems[i].Ints { + elems[i].Ints[j] = uint16(j) + } + size += 4 + i*2 + } + c := Container{elems} + n, err := datasizeWrite(reflect.ValueOf(c)) + if err != nil { + t.Fatalf("datasizeWrite failed: %v", err) + } + if n != size+4 { + t.Fatal("Wrong data size") + } + b := Serialize(c) + d := Container{} + err = DeserializeRaw(b, &d) + if err != nil { + t.Fatalf("DeserializeRaw failed: %v", err) + } + for i, e := range d.Elements { + if c.Elements[i].X != e.X || c.Elements[i].Y != e.Y { + t.Fatalf("Deserialized x, y to invalid value. "+ + "Expected %d,%d but got %d,%d", c.Elements[i].X, + c.Elements[i].Y, e.X, e.Y) + } + if len(c.Elements[i].Bytes) != len(e.Bytes) { + t.Fatal("Deserialized Bytes to invalid length") + } + for j, b := range c.Elements[i].Bytes { + if c.Elements[i].Bytes[j] != b { + t.Fatal("Deserialized to invalid value") + } + } + if len(c.Elements[i].Ints) != len(e.Ints) { + t.Fatal("Deserialized Ints to invalid length") + } + for j, b := range c.Elements[i].Ints { + if c.Elements[i].Ints[j] != b { + t.Fatal("Deserialized Ints to invalid value") + } + } + } +} + +type Array struct { + Arr []int +} + +func TestDecodeNotEnoughLength(t *testing.T) { + b := make([]byte, 2) + var d Array + err := DeserializeRaw(b, &d) + if err == nil { + t.Fatal("Expected error") + } else if err.Error() != "Deserialization failed" { + t.Fatalf("Expected different error, but got %s", err.Error()) + } + + // Test with slice + thing := make([]int, 3) + err = DeserializeRaw(b, thing) + if err == nil { + t.Fatal("Expected error") + } else if err.Error() != "Deserialization failed" { + t.Fatal("Expected different error") + } +} + +func TestFlattenMultidimensionalBytes(t *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + expect := 16 * 16 + if len(b) != expect { + t.Fatalf("Expected %d bytes, decoded to %d bytes", expect, len(b)) + } + +} + +func TestMultiArrays(T *testing.T) { + var data [16][16]byte + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + data[i][j] = byte(i * j) + } + } + + b := Serialize(data) + + var data2 [16][16]byte + + err := DeserializeRaw(b, &data2) + if err != nil { + T.Fatal(err) + } + + for i := 0; i < 16; i++ { + for j := 0; j < 16; j++ { + if data[i][j] != data2[i][j] { + T.Fatalf("failed round trip test") + } + } + } + + b2 := Serialize(data2) + if !bytes.Equal(b, b2) { + T.Fatalf("Failed round trip test") + } + + if len(b) != 256 { + T.Fatalf("decoded to wrong byte length") + } + +} + +func TestSerializeAtomic(t *testing.T) { + + var sp uint64 = 0x000C8A9E1809F720 + b := SerializeAtomic(sp) + + var i uint64 + DeserializeAtomic(b, &i) + + if i != sp { + t.Fatal("round trip atomic fail") + } +} + +func TestPushPop(t *testing.T) { + var sp uint64 = 0x000C8A9E1809F720 + + var d [8]byte + EncodeInt(d[0:8], sp) + + //fmt.Printf("d= %X \n", d[:]) + + var ti uint64 + DecodeInt(d[0:8], &ti) + + if ti != sp { + //fmt.Printf("sp= %X ti= %X \n", sp,ti) + t.Error("roundtrip failed") + } +} + +type TestStruct5a struct { + Test uint64 +} + +func TestPanicTest(t *testing.T) { + + defer func() { + if r := recover(); r == nil { + t.Error("EncodeInt Did not panic") + } + }() + + log.Panic() +} + +func TestPushPopNegative(t *testing.T) { + + defer func() { + if r := recover(); r == nil { + t.Error("EncodeInt Did not panic on invalid input type") + } + }() + + var tst TestStruct5a + //var sp uint64 = 0x000C8A9E1809F720 + var d [8]byte + EncodeInt(d[0:8], &tst) //attemp to encode invalid type + +} + +func TestByteArray(t *testing.T) { + + tstr := "7105a46cb4c2810f0c916e0bb4b4e4ef834ad42040c471b42c96d356a9fd1b21" + + d, err := hex.DecodeString(tstr) + if err != nil { + t.Fail() + } + + buff := Serialize(d) + var buff2 [32]byte + copy(buff2[0:32], buff[0:32]) + + if len(buff2) != 32 { + t.Errorf("incorrect serialization length for fixed sized arrays: %d byte fixed sized array serialized to %d bytes \n", len(d), len(buff2)) + } + +} + +func TestEncodeDictInt2Int(t *testing.T) { + m1 := map[uint8]uint64{0: 0, 1: 1, 2: 2} + buff := Serialize(m1) + if len(buff) != 4 /* Length */ +(1+8)*len(m1) /* 1b key + 8b value per entry */ { + t.Fail() + } + m2 := make(map[uint8]uint64) + if DeserializeRaw(buff, m2) != nil { + t.Fail() + } + if len(m1) != len(m2) { + t.Errorf("Expected length %d but got %d", len(m1), len(m2)) + } + for key := range m1 { + if m1[key] != m2[key] { + t.Errorf("Expected value %d for key %d but got %d", m1[key], key, m2[key]) + } + } +} + +type TestStructWithDict struct { + X int32 + Y int64 + M map[uint8]TestStruct + K []byte +} + +func TestEncodeDictNested(t *testing.T) { + s1 := TestStructWithDict{ + 0x01234567, + 0x0123456789ABCDEF, + map[uint8]TestStruct{ + 0x01: TestStruct{ + 0x01234567, + 0x0123456789ABCDEF, + 0x01, + []byte{0, 1, 2}, + true, + "ab", + cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 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, + }, + }, + 0x23: TestStruct{ + 0x01234567, + 0x0123456789ABCDEF, + 0x01, + []byte{0, 1, 2}, + true, + "cd", + cipher.PubKey{ + 0, 1, 2, 3, 4, 5, 6, 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, + }, + }, + }, + []byte{0, 1, 2, 3, 4}, + } + buff := Serialize(s1) + if len(buff) == 0 { + t.Fail() + } + + s2 := TestStructWithDict{} + if DeserializeRaw(buff, &s2) != nil { + t.Fail() + } + if !reflect.DeepEqual(s1, s2) { + t.Errorf("Expected %v but got %v", s1, s2) + } +} + +func TestEncodeDictString2Int64(t *testing.T) { + v := map[string]int64{ + "foo": 1, + "bar": 2, + } + + b := Serialize(v) + + v2 := make(map[string]int64) + err := DeserializeRaw(b, &v2) + require.NoError(t, err) + + require.Equal(t, v, v2) +} + +func TestOmitEmptyString(t *testing.T) { + + type omitString struct { + A string `enc:"a,omitempty"` + } + + cases := []struct { + name string + input omitString + outputShouldBeEmpty bool + }{ + { + name: "string not empty", + input: omitString{ + A: "foo", + }, + }, + + { + name: "string empty", + input: omitString{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitString + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + require.Equal(t, tc.input, y) + }) + } + +} + +func TestOmitEmptySlice(t *testing.T) { + type omitSlice struct { + B []byte `enc:"b,omitempty"` + } + + cases := []struct { + name string + input omitSlice + expect *omitSlice + outputShouldBeEmpty bool + }{ + { + name: "slice not empty", + input: omitSlice{ + B: []byte("foo"), + }, + }, + + { + name: "slice nil", + input: omitSlice{}, + outputShouldBeEmpty: true, + }, + + { + name: "slice empty but not nil", + input: omitSlice{ + B: []byte{}, + }, + expect: &omitSlice{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitSlice + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMap(t *testing.T) { + + type omitMap struct { + C map[string]int64 `enc:"d,omitempty"` + } + + cases := []struct { + name string + input omitMap + expect *omitMap + outputShouldBeEmpty bool + }{ + { + name: "map not empty", + input: omitMap{ + C: map[string]int64{"foo": 1}, + }, + }, + + { + name: "map nil", + input: omitMap{}, + outputShouldBeEmpty: true, + }, + + { + name: "map empty but not nil", + input: omitMap{ + C: map[string]int64{}, + }, + expect: &omitMap{}, + outputShouldBeEmpty: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + + if tc.outputShouldBeEmpty { + require.Empty(t, b) + } else { + require.NotEmpty(t, b) + } + + var y omitMap + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + expect := tc.expect + if expect == nil { + expect = &tc.input + } + + require.Equal(t, *expect, y) + }) + } +} + +func TestOmitEmptyMixedFinalByte(t *testing.T) { + type omitMixed struct { + A string + B []byte `enc:",omitempty"` + } + + cases := []struct { + name string + input omitMixed + expect omitMixed + }{ + { + name: "none empty", + input: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + expect: omitMixed{ + A: "foo", + B: []byte("foo"), + }, + }, + + { + name: "byte nil", + input: omitMixed{ + A: "foo", + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "byte empty but not nil", + input: omitMixed{ + A: "foo", + B: []byte{}, + }, + expect: omitMixed{ + A: "foo", + }, + }, + + { + name: "first string empty but not omitted", + input: omitMixed{ + B: []byte("foo"), + }, + expect: omitMixed{ + B: []byte("foo"), + }, + }, + + { + name: "all empty", + input: omitMixed{}, + expect: omitMixed{}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + b := Serialize(tc.input) + require.NotEmpty(t, b) + + var y omitMixed + err := DeserializeRaw(b, &y) + require.NoError(t, err) + + require.Equal(t, tc.expect, y) + }) + } +} + +func TestOmitEmptyFinalFieldOnly(t *testing.T) { + type bad struct { + A string + B string `enc:",omitempty"` + C string + } + + require.Panics(t, func() { + var b bad + Serialize(b) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encoder/field.go b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/field.go new file mode 100755 index 0000000..a561c6a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encoder/field.go @@ -0,0 +1,115 @@ +package encoder + +import ( + "fmt" + "log" + "reflect" + "strconv" + + "github.com/skycoin/skycoin/src/cipher" +) + +// StructField field struct +type StructField struct { + Name string `json:"name"` + Kind uint32 `json:"kind"` + Type string `json:"type"` + Tag string `json:"tag"` +} + +func (s *StructField) String() string { + return fmt.Sprintln(s.Name, s.Type, s.Tag) +} + +//TODO: replace fieldType on reflect.Kind +func getFieldSize(d *decoder, fieldType reflect.Kind, s int) int { + switch fieldType { + case reflect.Slice, reflect.String: + length := int(leUint32(d.buf[s : s+4])) + s += 4 + length + case reflect.Struct, reflect.Array: + s += 32 + case reflect.Bool, reflect.Int8, reflect.Uint8: + s++ + case reflect.Int16, reflect.Uint16: + s += 2 + case reflect.Int32, reflect.Uint32: + s += 4 + case reflect.Int64, reflect.Uint64, reflect.Float64: + s += 8 + default: + fmt.Println(fieldType) + log.Panicf("Decode error: kind %s not handled", fieldType) + } + return s +} + +//TODO: replace fieldType on reflect.Kind +func getFieldValue(in []byte, d *decoder, fieldType reflect.Kind, s int) string { + fd := &decoder{buf: make([]byte, len(in)-s)} + copy(fd.buf, d.buf[s:]) + switch fieldType { + case reflect.Slice, reflect.String: + length := int(leUint32(fd.buf[0:4])) + return string(fd.buf[4 : 4+length]) + case reflect.Struct, reflect.Array: + s := cipher.SHA256{} + s.Set(fd.buf[0:32]) + return s.Hex() + case reflect.Bool: + return strconv.FormatBool(fd.bool()) + case reflect.Int8: + return strconv.Itoa(int(fd.int8())) + case reflect.Int16: + return strconv.Itoa(int(fd.int16())) + case reflect.Int32: + return strconv.Itoa(int(fd.int32())) + case reflect.Int64: + return strconv.Itoa(int(fd.int64())) + case reflect.Uint8: + return strconv.Itoa(int(fd.uint8())) + case reflect.Uint16: + return strconv.Itoa(int(fd.uint16())) + case reflect.Uint32: + return strconv.Itoa(int(fd.uint32())) + case reflect.Uint64: + return strconv.Itoa(int(fd.uint64())) + default: + log.Panicf("Decode error: kind %s not handled", fieldType) + } + return "" +} + +// DeserializeField deserialize field +func DeserializeField(in []byte, fields []StructField, fieldName string, field interface{}) error { + + d := &decoder{buf: make([]byte, len(in))} + copy(d.buf, in) + fv := reflect.ValueOf(field).Elem() + s := 0 + for _, f := range fields { + if f.Name == fieldName { + fd := &decoder{buf: make([]byte, len(in)-s)} + copy(fd.buf, d.buf[s:]) + fd.value(fv) + return nil + } + res := getFieldSize(d, reflect.Kind(f.Kind), s) + s = res + } + return nil +} + +// ParseFields parse fields +func ParseFields(in []byte, fields []StructField) map[string]string { + result := map[string]string{} + d := &decoder{buf: make([]byte, len(in))} + copy(d.buf, in) + s := 0 + for _, f := range fields { + resShift := getFieldSize(d, reflect.Kind(f.Kind), s) + result[f.Name] = getFieldValue(in, d, reflect.Kind(f.Kind), s) + s = resShift + } + return result +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go new file mode 100755 index 0000000..1764b59 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305.go @@ -0,0 +1,160 @@ +// uses scrypt for password key derivation, and chacha20poly1305 for +// encryption/decryption + +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "math" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/chacha20poly1305" + "github.com/skycoin/skycoin/src/cipher/scrypt" +) + +const ( + scryptChacha20MetaLengthSize = 2 // meta data length field size in bytes + scryptChacha20SaltSize = 32 // salt bytes number +) + +// Default scrypt paramenters +const ( + // ScryptN: scrypt N paramenter. 1<<20 is the recommended value for file encryption, it takes about 3 seconds in 2.9 GHz Intel core i7. + ScryptN = 1 << 20 + // ScryptR: scrypt r paramenter. Cache line size have not significantly increased since 2009, 8 should still be optimal for r. + ScryptR = 8 + // ScryptP: scrypt p paramenter. The parallel difficulty, 1 is still optimal. + ScryptP = 1 + // ScryptKeyLen: The length of returned byte slice that can be used as cryptographic key. + ScryptKeyLen = 32 +) + +// DefaultScryptChacha20poly1305 default ScryptChacha20poly1305 encryptor +var DefaultScryptChacha20poly1305 = ScryptChacha20poly1305{ + N: ScryptN, + R: ScryptR, + P: ScryptP, + KeyLen: ScryptKeyLen, +} + +// ScryptChacha20poly1305 provides methods for encryption/decryption with scrypt and chacha20poly1305 +type ScryptChacha20poly1305 struct { + N int + R int + P int + KeyLen int +} + +type meta struct { + N int `json:"n"` + R int `json:"r"` + P int `json:"p"` + KeyLen int `json:"keyLen"` + Salt []byte `json:"salt"` + Nonce []byte `json:"nonce"` +} + +// Encrypt encrypts data with password, +// 1. Scrypt derives the key from password +// 2. Chacha20poly1305 generates AEAD from the derived key +// 4. Puts scrypt paramenters, salt and nonce into metadata, json serialize it and get the serialized metadata length +// 5. AEAD.Seal encrypts the data, and use [length][metadata] as additional data +// 6. Final format: base64([[length][metadata]][ciphertext]), length is 2 bytes. +func (s ScryptChacha20poly1305) Encrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + // Scyrpt derives key from password + salt := cipher.RandByte(scryptChacha20SaltSize) + dk, err := scrypt.Key(password, salt, s.N, s.R, s.P, s.KeyLen) + if err != nil { + return nil, err + } + + // Prepare metadata + m := meta{ + N: s.N, + R: s.R, + P: s.P, + KeyLen: s.KeyLen, + Salt: salt, + Nonce: cipher.RandByte(chacha20poly1305.NonceSize), + } + // json serialize the metadata + ms, err := json.Marshal(m) + if err != nil { + return nil, err + } + + if len(ms) > math.MaxUint16 { + return nil, errors.New("metadata length beyond the math.MaxUint16") + } + + length := make([]byte, scryptChacha20MetaLengthSize) + binary.LittleEndian.PutUint16(length, uint16(len(ms))) + + // Additional data for AEAD + ad := append(length, ms...) + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + ciphertext := aead.Seal(nil, m.Nonce, data, ad) + + // Base64 encode the [[length][metadata]][ciphertext] + rawData := append(ad, ciphertext...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rawData))) + enc.Encode(buf, rawData) + return buf, nil +} + +// Decrypt decrypts the data with password +// 1. Base64 decodes the data +// 2. Reads the first [metaLengthSize] bytes data to get the metadata length, and reads out the metadata. +// 3. Scrypt derives key from password and paramenters in metadata +// 4. Chacha20poly1305 geneates AEAD +// 5. AEAD decrypts ciphertext with nonce in metadata and [length][metadata] as additional data. +func (s ScryptChacha20poly1305) Decrypt(data, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + encData = encData[:n] + + length := binary.LittleEndian.Uint16(encData[:scryptChacha20MetaLengthSize]) + if int(scryptChacha20MetaLengthSize+length) > len(encData) { + return nil, errors.New("invalid metadata length") + } + + var m meta + if err := json.Unmarshal(encData[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+length], &m); err != nil { + return nil, err + } + + ad := encData[:scryptChacha20MetaLengthSize+length] + // Scrypt derives key + dk, err := scrypt.Key(password, m.Salt, m.N, m.R, m.P, m.KeyLen) + if err != nil { + return nil, err + } + + // Geneates AEAD + aead, err := chacha20poly1305.New(dk) + if err != nil { + return nil, err + } + + return aead.Open(nil, m.Nonce, encData[scryptChacha20MetaLengthSize+length:], ad) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go new file mode 100755 index 0000000..b098f7b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/scrypt_chacha20poly1305_test.go @@ -0,0 +1,87 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestScryptChacha20poly1305Encrypt(t *testing.T) { + for i := uint(1); i < 20; i++ { + name := fmt.Sprintf("N=1<<%v r=%v p=%v keyLen=%v", i, 8, 1, 32) + t.Run(name, func(t *testing.T) { + crypto := ScryptChacha20poly1305{N: 1 << i, R: 8, P: 1, KeyLen: 32} + encData, err := crypto.Encrypt([]byte("plaintext"), []byte("password")) + require.NoError(t, err) + + data, err := base64.StdEncoding.DecodeString(string(encData)) + require.NoError(t, err) + // Checks the prefix + ml := binary.LittleEndian.Uint16(data[:scryptChacha20MetaLengthSize]) + require.True(t, ml <= math.MaxUint16) + require.True(t, int(scryptChacha20MetaLengthSize+ml) <= len(data)) + var m meta + require.NoError(t, json.Unmarshal(data[scryptChacha20MetaLengthSize:scryptChacha20MetaLengthSize+ml], &m)) + require.Equal(t, m.N, 1< Add 32 bits length prefix to indicate the length of data. +// 2> Pad the length + data to 32 bytes with nulls at end +// 2> SHA256() and prefix the hash. +// 3> Split the whole data(hash+length+data+padding) into 256 bits(32 bytes) blocks +// 4> Each block is encrypted by XORing the unencrypted block with SHA256(SHA256(password), SHA256(index, SHA256(nonce)) +// - index is 0 for the first block of 32 bytes, 1 for the second block of 32 bytes, 2 for third block +// 5> Prefix nonce and SHA256 the nonce with blocks to get checksum, and prefix the checksum +// 6> Finally, the data format is: base64() +func (s Sha256Xor) Encrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + if uint(len(data)) > math.MaxUint32 { + return nil, errors.New("data length overflowed, it must <= math.MaxUint32(4294967295)") + } + + // Sets data length prefix + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, uint32(len(data))) + + // Prefixes data with length + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := cipher.RandByte(sha256XorNonceSize) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + + finalData := append(checkSum[:], nonceAndDataBytes...) + + // Base64 encodes the data + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(finalData))) + enc.Encode(buf, finalData) + return buf, nil +} + +// Decrypt decrypts the data +func (s Sha256Xor) Decrypt(data []byte, password []byte) ([]byte, error) { + if len(password) == 0 { + return nil, errors.New("missing password") + } + + // Base64 decodes data + enc := base64.StdEncoding + encData := make([]byte, enc.DecodedLen(len(data))) + n, err := enc.Decode(encData, data) + if err != nil { + return nil, err + } + + encData = encData[:n] + + // Derives key by secp256k1 hashing password + key := secp256k1.Secp256k1Hash(password) + + buf := bytes.NewBuffer(encData) + + // Gets checksum + var checkSum cipher.SHA256 + n, err = buf.Read(checkSum[:]) + if err != nil { + return nil, err + } + + if n != sha256XorChecksumSize { + return nil, errors.New("invalid checksum length") + } + + // Checks the checksum + csh := cipher.SumSHA256(buf.Bytes()) + if csh != checkSum { + return nil, errors.New("invalid data, checksum is not matched") + } + + // Gets the nonce + nonce := make([]byte, sha256XorNonceSize) + n, err = buf.Read(nonce) + if err != nil { + return nil, err + } + + if n != sha256XorNonceSize { + return nil, errors.New("invalid nonce length") + } + + var decodeData []byte + hashNonce := cipher.SumSHA256(nonce) + i := 0 + for { + var block cipher.SHA256 + n, err := buf.Read(block[:]) + if err == io.EOF { + break + } + + if n != sha256XorBlockSize { + return nil, errors.New("invalid block size, must be multiple of 32 bytes") + } + + // Decodes the block + dataHash := block.Xor(hashKeyIndexNonce(key, int64(i), hashNonce)) + decodeData = append(decodeData, dataHash[:]...) + i++ + } + + buf = bytes.NewBuffer(decodeData) + + // Gets the hash + var dataHash cipher.SHA256 + n, err = buf.Read(dataHash[:]) + if err != nil { + return nil, fmt.Errorf("read data hash failed: %v", err) + } + + if n != 32 { + return nil, errors.New("read data hash failed: read length != 32") + } + + // Checks the hash + if dataHash != cipher.SumSHA256(buf.Bytes()) { + return nil, errors.New("invalid password") + } + + // Reads out the data length + dataLenBytes := make([]byte, sha256XorDataLengthSize) + n, err = buf.Read(dataLenBytes) + if err != nil { + return nil, err + } + + if n != sha256XorDataLengthSize { + return nil, errors.New("read data length failed") + } + + l := binary.LittleEndian.Uint32(dataLenBytes) + if l > math.MaxUint32 { + return nil, errors.New("data length overflowed, it must <= math.MaxUint32(4294967295)") + } + + if l > uint32(buf.Len()) { + return nil, errors.New("invalid data length") + } + + // Reads out the raw data + rawData := make([]byte, l) + n, err = buf.Read(rawData) + if err != nil { + return nil, err + } + + if uint32(n) != l { + return nil, fmt.Errorf("read data failed, expect %d bytes, but get %d bytes", l, n) + } + + return rawData, nil +} + +// hash(password, hash(index, hash(nonce))) +func hashKeyIndexNonce(key []byte, index int64, nonceHash cipher.SHA256) cipher.SHA256 { + // convert index to 256bit number + indexBytes := make([]byte, 32) + binary.PutVarint(indexBytes, index) + + // hash(index, nonceHash) + indexNonceHash := cipher.SumSHA256(append(indexBytes, nonceHash[:]...)) + + // hash(hash(password), indexNonceHash) + var keyHash cipher.SHA256 + copy(keyHash[:], key[:]) + return cipher.AddSHA256(keyHash, indexNonceHash) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor_test.go new file mode 100755 index 0000000..2d0e22f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/encrypt/sha256xor_test.go @@ -0,0 +1,248 @@ +package encrypt + +import ( + "encoding/base64" + "encoding/binary" + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + "github.com/skycoin/skycoin/src/testutil" +) + +func TestEncrypt(t *testing.T) { + tt := []struct { + name string + data []byte + password []byte + err error + }{ + { + "data length=1 password is empty=true", + testutil.RandBytes(t, 1), + nil, + errors.New("missing password"), + }, + { + "data length=1 password is empty=false", + testutil.RandBytes(t, 1), + []byte("key"), + nil, + }, + { + "data length<32 password is empty=false", + testutil.RandBytes(t, 2), + []byte("pwd"), + nil, + }, + { + "data length=32 password is empty=false", + testutil.RandBytes(t, 32), + []byte("pwd"), + nil, + }, + { + "data length=2*32 password is empty=false", + testutil.RandBytes(t, 64), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + { + "data length>2*32 password is empty=false", + testutil.RandBytes(t, 65), + []byte("9JMkCPphe73NQvGhmab"), + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata, err := Sha256Xor{}.Encrypt(tc.data, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + n := (sha256XorDataLengthSize + len(tc.data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(tc.data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } + + // test data of length range in 32 to 64, for testing the 32 bytes padding. + pwd := []byte("pwd") + for i := 33; i <= 64; i++ { + name := fmt.Sprintf("data length=%d password is empty=false", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata, err := Sha256Xor{}.Encrypt(data, pwd) + require.NoError(t, err) + + n := (sha256XorDataLengthSize + len(data)) / sha256XorBlockSize + m := (sha256XorDataLengthSize + len(data)) % sha256XorBlockSize + if m > 0 { + n++ + } + + rdata, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + + totalEncryptedDataLen := sha256XorChecksumSize + sha256XorNonceSize + 32 + n*sha256XorBlockSize // 32 is the hash data length + require.Equal(t, totalEncryptedDataLen, len(rdata)) + var checksum cipher.SHA256 + copy(checksum[:], rdata[:sha256XorChecksumSize]) + require.Equal(t, checksum, cipher.SumSHA256(rdata[sha256XorChecksumSize:])) + }) + } +} + +func TestDecrypt(t *testing.T) { + data := testutil.RandBytes(t, 32) + tt := []struct { + name string + encryptedData func() []byte // encrypted data + password []byte + err error + }{ + { + "invalid data length", + func() []byte { + return makeEncryptedData(t, data, 65, []byte("pwd")) + }, + []byte("pwd"), + errors.New("invalid data length"), + }, + { + "invalid checksum", + func() []byte { + edata := makeEncryptedData(t, data, 32, []byte("pwd")) + // Changes the encrypted data, so that the checksum could not match + rd, err := base64.StdEncoding.DecodeString(string(edata)) + require.NoError(t, err) + rd[len(rd)-1]++ + return []byte(base64.StdEncoding.EncodeToString(rd)) + }, + []byte("pwd"), + errors.New("invalid data, checksum is not matched"), + }, + { + "empty password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte(""), + errors.New("missing password"), + }, + { + "nil password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + nil, + errors.New("missing password"), + }, + { + "invalid password", + func() []byte { + return makeEncryptedData(t, data, 32, []byte("pwd")) + }, + []byte("wrong password"), + errors.New("invalid password"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + edata := tc.encryptedData() + d, err := Sha256Xor{}.Decrypt(edata, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Equal(t, d, data) + }) + } + + // test data of length in range of 0 to 64 + for i := 0; i <= 64; i++ { + name := fmt.Sprintf("data length=%d", i) + t.Run(name, func(t *testing.T) { + data := testutil.RandBytes(t, i) + edata := makeEncryptedData(t, data, uint32(len(data)), []byte("pwd")) + d, err := Sha256Xor{}.Decrypt(edata, []byte("pwd")) + require.NoError(t, err) + require.Equal(t, data, d) + }) + } +} + +// encrypts data, manually set the data length, so we could test invalid data length cases. +func makeEncryptedData(t *testing.T, data []byte, dataLength uint32, password []byte) []byte { + dataLenBytes := make([]byte, sha256XorDataLengthSize) + binary.LittleEndian.PutUint32(dataLenBytes, dataLength) + + ldata := append(dataLenBytes, data...) + + // Pads length + data with null to 32 bytes + l := len(ldata) // hash + length + data + n := l / sha256XorBlockSize + m := l % sha256XorBlockSize + if m > 0 { + paddingNull := make([]byte, sha256XorBlockSize-m) + ldata = append(ldata, paddingNull...) + n++ + } + + // Hash(length+data+padding) + dataHash := cipher.SumSHA256(ldata) + + // Initialize blocks with data hash + blocks := []cipher.SHA256{dataHash} + for i := 0; i < n; i++ { + var b cipher.SHA256 + copy(b[:], ldata[i*sha256XorBlockSize:(i+1)*sha256XorBlockSize]) + blocks = append(blocks, b) + } + + // Generates a nonce + nonce := testutil.RandBytes(t, int(sha256XorNonceSize)) + // Hash the nonce + hashNonce := cipher.SumSHA256(nonce) + // Hash the password + key := secp256k1.Secp256k1Hash(password) + + var encryptedData []byte + // Encodes the blocks + for i := range blocks { + // Hash(password, hash(index, hash(nonce))) + h := hashKeyIndexNonce(key, int64(i), hashNonce) + encryptedHash := blocks[i].Xor(h) + encryptedData = append(encryptedData, encryptedHash[:]...) + } + + // Prefix the nonce + nonceAndDataBytes := append(nonce, encryptedData...) + // Calculates the checksum + checkSum := cipher.SumSHA256(nonceAndDataBytes) + rd := append(checkSum[:], nonceAndDataBytes...) + enc := base64.StdEncoding + buf := make([]byte, enc.EncodedLen(len(rd))) + enc.Encode(buf, rd) + return buf +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/LICENSE b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/LICENSE new file mode 100755 index 0000000..44de214 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Tyler Smith + +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/skycoin/skycoin/src/cipher/go-bip39/bip39.go b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/bip39.go new file mode 100755 index 0000000..c81a92e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/bip39.go @@ -0,0 +1,268 @@ +package bip39 + +import ( + "crypto/sha256" + "encoding/binary" + "errors" + "fmt" + "math/big" + "strings" + + "github.com/skycoin/skycoin/src/cipher" +) + +// Some bitwise operands for working with big.Ints +var ( + Last11BitsMask = big.NewInt(2047) + RightShift11BitsDivider = big.NewInt(2048) + BigOne = big.NewInt(1) + BigTwo = big.NewInt(2) +) + +// DefaultMnemonicEntropyBitSize is the default bit size for NewDefaultMnemonic's entropy +const DefaultMnemonicEntropyBitSize = 128 + +// NewDefaultMnemonic returns a generated mnemomic using entropy with bitSize 128 +func NewDefaultMnemonic() (string, error) { + entropy, err := NewEntropy(DefaultMnemonicEntropyBitSize) + if err != nil { + return "", err + } + + return NewMnemonic(entropy) +} + +// MustNewDefaultMnemonic returns a generated mnemomic using entropy with bitSize 128 and panics if there is an error +func MustNewDefaultMnemonic() string { + seed, err := NewDefaultMnemonic() + if err != nil { + panic(err) + } + return seed +} + +// NewEntropy will create random entropy bytes +// so long as the requested size bitSize is an appropriate size. +func NewEntropy(bitSize int) ([]byte, error) { + err := validateEntropyBitSize(bitSize) + if err != nil { + return nil, err + } + + entropy := cipher.RandByte(bitSize / 8) + return entropy, err +} + +// NewMnemonic will return a string consisting of the mnemonic words for +// the given entropy. +// If the provide entropy is invalid, an error will be returned. +func NewMnemonic(entropy []byte) (string, error) { + // Compute some lengths for convenience + entropyBitLength := len(entropy) * 8 + checksumBitLength := entropyBitLength / 32 + sentenceLength := (entropyBitLength + checksumBitLength) / 11 + + err := validateEntropyBitSize(entropyBitLength) + if err != nil { + return "", err + } + + // Add checksum to entropy + entropy = addChecksum(entropy) + + // Break entropy up into sentenceLength chunks of 11 bits + // For each word AND mask the rightmost 11 bits and find the word at that index + // Then bitshift entropy 11 bits right and repeat + // Add to the last empty slot so we can work with LSBs instead of MSB + + // Entropy as an int so we can bitmask without worrying about bytes slices + entropyInt := new(big.Int).SetBytes(entropy) + + // Slice to hold words in + words := make([]string, sentenceLength) + + // Throw away big int for AND masking + word := big.NewInt(0) + + for i := sentenceLength - 1; i >= 0; i-- { + // Get 11 right most bits and bitshift 11 to the right for next time + word.And(entropyInt, Last11BitsMask) + entropyInt.Div(entropyInt, RightShift11BitsDivider) + + // Get the bytes representing the 11 bits as a 2 byte slice + wordBytes := padByteSlice(word.Bytes(), 2) + + // Convert bytes to an index and add that word to the list + words[i] = WordList[binary.BigEndian.Uint16(wordBytes)] + } + + return strings.Join(words, " "), nil +} + +// MnemonicToByteArray takes a mnemonic string and turns it into a byte array +// suitable for creating another mnemonic. +// An error is returned if the mnemonic is invalid. +// FIXME +// This does not work for all values in +// the test vectors. Namely +// Vectors 0, 4, and 8. +// This is not really important because BIP39 doesnt really define a conversion +// from string to bytes. +func MnemonicToByteArray(mnemonic string) ([]byte, error) { + if IsMnemonicValid(mnemonic) == false { + return nil, fmt.Errorf("Invalid mnemonic") + } + mnemonicSlice := strings.Split(mnemonic, " ") + + bitSize := len(mnemonicSlice) * 11 + err := validateEntropyWithChecksumBitSize(bitSize) + if err != nil { + return nil, err + } + checksumSize := bitSize % 32 + + b := big.NewInt(0) + modulo := big.NewInt(2048) + for _, v := range mnemonicSlice { + index, found := ReverseWordMap[v] + if found == false { + return nil, fmt.Errorf("Word `%v` not found in reverse map", v) + } + add := big.NewInt(int64(index)) + b = b.Mul(b, modulo) + b = b.Add(b, add) + } + hex := b.Bytes() + checksumModulo := big.NewInt(0).Exp(big.NewInt(2), big.NewInt(int64(checksumSize)), nil) + entropy, _ := big.NewInt(0).DivMod(b, checksumModulo, big.NewInt(0)) + + entropyHex := entropy.Bytes() + + byteSize := bitSize/8 + 1 + if len(hex) != byteSize { + tmp := make([]byte, byteSize) + diff := byteSize - len(hex) + for i := 0; i < len(hex); i++ { + tmp[i+diff] = hex[i] + } + hex = tmp + } + + validationHex := addChecksum(entropyHex) + if len(validationHex) != byteSize { + tmp2 := make([]byte, byteSize) + diff2 := byteSize - len(validationHex) + for i := 0; i < len(validationHex); i++ { + tmp2[i+diff2] = validationHex[i] + } + validationHex = tmp2 + } + + if len(hex) != len(validationHex) { + panic("[]byte len mismatch - it shouldn't happen") + } + for i := range validationHex { + if hex[i] != validationHex[i] { + return nil, fmt.Errorf("Invalid byte at position %v", i) + } + } + return hex, nil +} + +// NewSeedWithErrorChecking creates a hashed seed output given the mnemonic string and a password. +// An error is returned if the mnemonic is not convertible to a byte array. +// func NewSeedWithErrorChecking(mnemonic string, password string) ([]byte, error) { +// _, err := MnemonicToByteArray(mnemonic) +// if err != nil { +// return nil, err +// } +// return NewSeed(mnemonic, password), nil +// } + +// NewSeed creates a hashed seed output given a provided string and password. +// No checking is performed to validate that the string provided is a valid mnemonic. +// func NewSeed(mnemonic string, password string) []byte { +// return pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New) +// } + +// Appends to data the first (len(data) / 32)bits of the result of sha256(data) +// Currently only supports data up to 32 bytes +func addChecksum(data []byte) []byte { + // Get first byte of sha256 + hasher := sha256.New() + hasher.Write(data) + hash := hasher.Sum(nil) + firstChecksumByte := hash[0] + + // len() is in bytes so we divide by 4 + checksumBitLength := uint(len(data) / 4) + + // For each bit of check sum we want we shift the data one the left + // and then set the (new) right most bit equal to checksum bit at that index + // staring from the left + dataBigInt := new(big.Int).SetBytes(data) + for i := uint(0); i < checksumBitLength; i++ { + // Bitshift 1 left + dataBigInt.Mul(dataBigInt, BigTwo) + + // Set rightmost bit if leftmost checksum bit is set + if uint8(firstChecksumByte&(1<<(7-i))) > 0 { + dataBigInt.Or(dataBigInt, BigOne) + } + } + + return dataBigInt.Bytes() +} + +func padByteSlice(slice []byte, length int) []byte { // nolint: unparam + newSlice := make([]byte, length-len(slice)) + return append(newSlice, slice...) +} + +func validateEntropyBitSize(bitSize int) error { + if (bitSize%32) != 0 || bitSize < 128 || bitSize > 256 { + return errors.New("Entropy length must be [128, 256] and a multiple of 32") + } + return nil +} + +func validateEntropyWithChecksumBitSize(bitSize int) error { + if (bitSize != 128+4) && (bitSize != 160+5) && (bitSize != 192+6) && (bitSize != 224+7) && (bitSize != 256+8) { + return fmt.Errorf("Wrong entropy + checksum size - expected %v, got %v", int((bitSize-bitSize%32)+(bitSize-bitSize%32)/32), bitSize) + } + return nil +} + +// IsMnemonicValid attempts to verify that the provided mnemonic is valid. +// Validity is determined by both the number of words being appropriate, +// and that all the words in the mnemonic are present in the word list. +func IsMnemonicValid(mnemonic string) bool { + // Create a list of all the words in the mnemonic sentence + words := strings.Fields(mnemonic) + + //Get num of words + numOfWords := len(words) + + // The number of words should be 12, 15, 18, 21 or 24 + if numOfWords%3 != 0 || numOfWords < 12 || numOfWords > 24 { + return false + } + + // Check if all words belong in the wordlist + for i := 0; i < numOfWords; i++ { + if !contains(WordList, words[i]) { + return false + } + } + + return true +} + +func contains(s []string, e string) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/wordlist.go b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/wordlist.go new file mode 100755 index 0000000..f4d7e96 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/go-bip39/wordlist.go @@ -0,0 +1,2068 @@ +package bip39 + +import ( + "strings" +) + +// WordList The wordlist to use +var WordList = EnglishWordList + +// ReverseWordMap reverse word map +var ReverseWordMap = map[string]int{} + +func init() { + for i, v := range WordList { + ReverseWordMap[v] = i + } +} + +// EnglishWordList Language-specific wordlists +var EnglishWordList = strings.Split(englishWordList, "\n") +var englishWordList = `abandon +ability +able +about +above +absent +absorb +abstract +absurd +abuse +access +accident +account +accuse +achieve +acid +acoustic +acquire +across +act +action +actor +actress +actual +adapt +add +addict +address +adjust +admit +adult +advance +advice +aerobic +affair +afford +afraid +again +age +agent +agree +ahead +aim +air +airport +aisle +alarm +album +alcohol +alert +alien +all +alley +allow +almost +alone +alpha +already +also +alter +always +amateur +amazing +among +amount +amused +analyst +anchor +ancient +anger +angle +angry +animal +ankle +announce +annual +another +answer +antenna +antique +anxiety +any +apart +apology +appear +apple +approve +april +arch +arctic +area +arena +argue +arm +armed +armor +army +around +arrange +arrest +arrive +arrow +art +artefact +artist +artwork +ask +aspect +assault +asset +assist +assume +asthma +athlete +atom +attack +attend +attitude +attract +auction +audit +august +aunt +author +auto +autumn +average +avocado +avoid +awake +aware +away +awesome +awful +awkward +axis +baby +bachelor +bacon +badge +bag +balance +balcony +ball +bamboo +banana +banner +bar +barely +bargain +barrel +base +basic +basket +battle +beach +bean +beauty +because +become +beef +before +begin +behave +behind +believe +below +belt +bench +benefit +best +betray +better +between +beyond +bicycle +bid +bike +bind +biology +bird +birth +bitter +black +blade +blame +blanket +blast +bleak +bless +blind +blood +blossom +blouse +blue +blur +blush +board +boat +body +boil +bomb +bone +bonus +book +boost +border +boring +borrow +boss +bottom +bounce +box +boy +bracket +brain +brand +brass +brave +bread +breeze +brick +bridge +brief +bright +bring +brisk +broccoli +broken +bronze +broom +brother +brown +brush +bubble +buddy +budget +buffalo +build +bulb +bulk +bullet +bundle +bunker +burden +burger +burst +bus +business +busy +butter +buyer +buzz +cabbage +cabin +cable +cactus +cage +cake +call +calm +camera +camp +can +canal +cancel +candy +cannon +canoe +canvas +canyon +capable +capital +captain +car +carbon +card +cargo +carpet +carry +cart +case +cash +casino +castle +casual +cat +catalog +catch +category +cattle +caught +cause +caution +cave +ceiling +celery +cement +census +century +cereal +certain +chair +chalk +champion +change +chaos +chapter +charge +chase +chat +cheap +check +cheese +chef +cherry +chest +chicken +chief +child +chimney +choice +choose +chronic +chuckle +chunk +churn +cigar +cinnamon +circle +citizen +city +civil +claim +clap +clarify +claw +clay +clean +clerk +clever +click +client +cliff +climb +clinic +clip +clock +clog +close +cloth +cloud +clown +club +clump +cluster +clutch +coach +coast +coconut +code +coffee +coil +coin +collect +color +column +combine +come +comfort +comic +common +company +concert +conduct +confirm +congress +connect +consider +control +convince +cook +cool +copper +copy +coral +core +corn +correct +cost +cotton +couch +country +couple +course +cousin +cover +coyote +crack +cradle +craft +cram +crane +crash +crater +crawl +crazy +cream +credit +creek +crew +cricket +crime +crisp +critic +crop +cross +crouch +crowd +crucial +cruel +cruise +crumble +crunch +crush +cry +crystal +cube +culture +cup +cupboard +curious +current +curtain +curve +cushion +custom +cute +cycle +dad +damage +damp +dance +danger +daring +dash +daughter +dawn +day +deal +debate +debris +decade +december +decide +decline +decorate +decrease +deer +defense +define +defy +degree +delay +deliver +demand +demise +denial +dentist +deny +depart +depend +deposit +depth +deputy +derive +describe +desert +design +desk +despair +destroy +detail +detect +develop +device +devote +diagram +dial +diamond +diary +dice +diesel +diet +differ +digital +dignity +dilemma +dinner +dinosaur +direct +dirt +disagree +discover +disease +dish +dismiss +disorder +display +distance +divert +divide +divorce +dizzy +doctor +document +dog +doll +dolphin +domain +donate +donkey +donor +door +dose +double +dove +draft +dragon +drama +drastic +draw +dream +dress +drift +drill +drink +drip +drive +drop +drum +dry +duck +dumb +dune +during +dust +dutch +duty +dwarf +dynamic +eager +eagle +early +earn +earth +easily +east +easy +echo +ecology +economy +edge +edit +educate +effort +egg +eight +either +elbow +elder +electric +elegant +element +elephant +elevator +elite +else +embark +embody +embrace +emerge +emotion +employ +empower +empty +enable +enact +end +endless +endorse +enemy +energy +enforce +engage +engine +enhance +enjoy +enlist +enough +enrich +enroll +ensure +enter +entire +entry +envelope +episode +equal +equip +era +erase +erode +erosion +error +erupt +escape +essay +essence +estate +eternal +ethics +evidence +evil +evoke +evolve +exact +example +excess +exchange +excite +exclude +excuse +execute +exercise +exhaust +exhibit +exile +exist +exit +exotic +expand +expect +expire +explain +expose +express +extend +extra +eye +eyebrow +fabric +face +faculty +fade +faint +faith +fall +false +fame +family +famous +fan +fancy +fantasy +farm +fashion +fat +fatal +father +fatigue +fault +favorite +feature +february +federal +fee +feed +feel +female +fence +festival +fetch +fever +few +fiber +fiction +field +figure +file +film +filter +final +find +fine +finger +finish +fire +firm +first +fiscal +fish +fit +fitness +fix +flag +flame +flash +flat +flavor +flee +flight +flip +float +flock +floor +flower +fluid +flush +fly +foam +focus +fog +foil +fold +follow +food +foot +force +forest +forget +fork +fortune +forum +forward +fossil +foster +found +fox +fragile +frame +frequent +fresh +friend +fringe +frog +front +frost +frown +frozen +fruit +fuel +fun +funny +furnace +fury +future +gadget +gain +galaxy +gallery +game +gap +garage +garbage +garden +garlic +garment +gas +gasp +gate +gather +gauge +gaze +general +genius +genre +gentle +genuine +gesture +ghost +giant +gift +giggle +ginger +giraffe +girl +give +glad +glance +glare +glass +glide +glimpse +globe +gloom +glory +glove +glow +glue +goat +goddess +gold +good +goose +gorilla +gospel +gossip +govern +gown +grab +grace +grain +grant +grape +grass +gravity +great +green +grid +grief +grit +grocery +group +grow +grunt +guard +guess +guide +guilt +guitar +gun +gym +habit +hair +half +hammer +hamster +hand +happy +harbor +hard +harsh +harvest +hat +have +hawk +hazard +head +health +heart +heavy +hedgehog +height +hello +helmet +help +hen +hero +hidden +high +hill +hint +hip +hire +history +hobby +hockey +hold +hole +holiday +hollow +home +honey +hood +hope +horn +horror +horse +hospital +host +hotel +hour +hover +hub +huge +human +humble +humor +hundred +hungry +hunt +hurdle +hurry +hurt +husband +hybrid +ice +icon +idea +identify +idle +ignore +ill +illegal +illness +image +imitate +immense +immune +impact +impose +improve +impulse +inch +include +income +increase +index +indicate +indoor +industry +infant +inflict +inform +inhale +inherit +initial +inject +injury +inmate +inner +innocent +input +inquiry +insane +insect +inside +inspire +install +intact +interest +into +invest +invite +involve +iron +island +isolate +issue +item +ivory +jacket +jaguar +jar +jazz +jealous +jeans +jelly +jewel +job +join +joke +journey +joy +judge +juice +jump +jungle +junior +junk +just +kangaroo +keen +keep +ketchup +key +kick +kid +kidney +kind +kingdom +kiss +kit +kitchen +kite +kitten +kiwi +knee +knife +knock +know +lab +label +labor +ladder +lady +lake +lamp +language +laptop +large +later +latin +laugh +laundry +lava +law +lawn +lawsuit +layer +lazy +leader +leaf +learn +leave +lecture +left +leg +legal +legend +leisure +lemon +lend +length +lens +leopard +lesson +letter +level +liar +liberty +library +license +life +lift +light +like +limb +limit +link +lion +liquid +list +little +live +lizard +load +loan +lobster +local +lock +logic +lonely +long +loop +lottery +loud +lounge +love +loyal +lucky +luggage +lumber +lunar +lunch +luxury +lyrics +machine +mad +magic +magnet +maid +mail +main +major +make +mammal +man +manage +mandate +mango +mansion +manual +maple +marble +march +margin +marine +market +marriage +mask +mass +master +match +material +math +matrix +matter +maximum +maze +meadow +mean +measure +meat +mechanic +medal +media +melody +melt +member +memory +mention +menu +mercy +merge +merit +merry +mesh +message +metal +method +middle +midnight +milk +million +mimic +mind +minimum +minor +minute +miracle +mirror +misery +miss +mistake +mix +mixed +mixture +mobile +model +modify +mom +moment +monitor +monkey +monster +month +moon +moral +more +morning +mosquito +mother +motion +motor +mountain +mouse +move +movie +much +muffin +mule +multiply +muscle +museum +mushroom +music +must +mutual +myself +mystery +myth +naive +name +napkin +narrow +nasty +nation +nature +near +neck +need +negative +neglect +neither +nephew +nerve +nest +net +network +neutral +never +news +next +nice +night +noble +noise +nominee +noodle +normal +north +nose +notable +note +nothing +notice +novel +now +nuclear +number +nurse +nut +oak +obey +object +oblige +obscure +observe +obtain +obvious +occur +ocean +october +odor +off +offer +office +often +oil +okay +old +olive +olympic +omit +once +one +onion +online +only +open +opera +opinion +oppose +option +orange +orbit +orchard +order +ordinary +organ +orient +original +orphan +ostrich +other +outdoor +outer +output +outside +oval +oven +over +own +owner +oxygen +oyster +ozone +pact +paddle +page +pair +palace +palm +panda +panel +panic +panther +paper +parade +parent +park +parrot +party +pass +patch +path +patient +patrol +pattern +pause +pave +payment +peace +peanut +pear +peasant +pelican +pen +penalty +pencil +people +pepper +perfect +permit +person +pet +phone +photo +phrase +physical +piano +picnic +picture +piece +pig +pigeon +pill +pilot +pink +pioneer +pipe +pistol +pitch +pizza +place +planet +plastic +plate +play +please +pledge +pluck +plug +plunge +poem +poet +point +polar +pole +police +pond +pony +pool +popular +portion +position +possible +post +potato +pottery +poverty +powder +power +practice +praise +predict +prefer +prepare +present +pretty +prevent +price +pride +primary +print +priority +prison +private +prize +problem +process +produce +profit +program +project +promote +proof +property +prosper +protect +proud +provide +public +pudding +pull +pulp +pulse +pumpkin +punch +pupil +puppy +purchase +purity +purpose +purse +push +put +puzzle +pyramid +quality +quantum +quarter +question +quick +quit +quiz +quote +rabbit +raccoon +race +rack +radar +radio +rail +rain +raise +rally +ramp +ranch +random +range +rapid +rare +rate +rather +raven +raw +razor +ready +real +reason +rebel +rebuild +recall +receive +recipe +record +recycle +reduce +reflect +reform +refuse +region +regret +regular +reject +relax +release +relief +rely +remain +remember +remind +remove +render +renew +rent +reopen +repair +repeat +replace +report +require +rescue +resemble +resist +resource +response +result +retire +retreat +return +reunion +reveal +review +reward +rhythm +rib +ribbon +rice +rich +ride +ridge +rifle +right +rigid +ring +riot +ripple +risk +ritual +rival +river +road +roast +robot +robust +rocket +romance +roof +rookie +room +rose +rotate +rough +round +route +royal +rubber +rude +rug +rule +run +runway +rural +sad +saddle +sadness +safe +sail +salad +salmon +salon +salt +salute +same +sample +sand +satisfy +satoshi +sauce +sausage +save +say +scale +scan +scare +scatter +scene +scheme +school +science +scissors +scorpion +scout +scrap +screen +script +scrub +sea +search +season +seat +second +secret +section +security +seed +seek +segment +select +sell +seminar +senior +sense +sentence +series +service +session +settle +setup +seven +shadow +shaft +shallow +share +shed +shell +sheriff +shield +shift +shine +ship +shiver +shock +shoe +shoot +shop +short +shoulder +shove +shrimp +shrug +shuffle +shy +sibling +sick +side +siege +sight +sign +silent +silk +silly +silver +similar +simple +since +sing +siren +sister +situate +six +size +skate +sketch +ski +skill +skin +skirt +skull +slab +slam +sleep +slender +slice +slide +slight +slim +slogan +slot +slow +slush +small +smart +smile +smoke +smooth +snack +snake +snap +sniff +snow +soap +soccer +social +sock +soda +soft +solar +soldier +solid +solution +solve +someone +song +soon +sorry +sort +soul +sound +soup +source +south +space +spare +spatial +spawn +speak +special +speed +spell +spend +sphere +spice +spider +spike +spin +spirit +split +spoil +sponsor +spoon +sport +spot +spray +spread +spring +spy +square +squeeze +squirrel +stable +stadium +staff +stage +stairs +stamp +stand +start +state +stay +steak +steel +stem +step +stereo +stick +still +sting +stock +stomach +stone +stool +story +stove +strategy +street +strike +strong +struggle +student +stuff +stumble +style +subject +submit +subway +success +such +sudden +suffer +sugar +suggest +suit +summer +sun +sunny +sunset +super +supply +supreme +sure +surface +surge +surprise +surround +survey +suspect +sustain +swallow +swamp +swap +swarm +swear +sweet +swift +swim +swing +switch +sword +symbol +symptom +syrup +system +table +tackle +tag +tail +talent +talk +tank +tape +target +task +taste +tattoo +taxi +teach +team +tell +ten +tenant +tennis +tent +term +test +text +thank +that +theme +then +theory +there +they +thing +this +thought +three +thrive +throw +thumb +thunder +ticket +tide +tiger +tilt +timber +time +tiny +tip +tired +tissue +title +toast +tobacco +today +toddler +toe +together +toilet +token +tomato +tomorrow +tone +tongue +tonight +tool +tooth +top +topic +topple +torch +tornado +tortoise +toss +total +tourist +toward +tower +town +toy +track +trade +traffic +tragic +train +transfer +trap +trash +travel +tray +treat +tree +trend +trial +tribe +trick +trigger +trim +trip +trophy +trouble +truck +true +truly +trumpet +trust +truth +try +tube +tuition +tumble +tuna +tunnel +turkey +turn +turtle +twelve +twenty +twice +twin +twist +two +type +typical +ugly +umbrella +unable +unaware +uncle +uncover +under +undo +unfair +unfold +unhappy +uniform +unique +unit +universe +unknown +unlock +until +unusual +unveil +update +upgrade +uphold +upon +upper +upset +urban +urge +usage +use +used +useful +useless +usual +utility +vacant +vacuum +vague +valid +valley +valve +van +vanish +vapor +various +vast +vault +vehicle +velvet +vendor +venture +venue +verb +verify +version +very +vessel +veteran +viable +vibrant +vicious +victory +video +view +village +vintage +violin +virtual +virus +visa +visit +visual +vital +vivid +vocal +voice +void +volcano +volume +vote +voyage +wage +wagon +wait +walk +wall +walnut +want +warfare +warm +warrior +wash +wasp +waste +water +wave +way +wealth +weapon +wear +weasel +weather +web +wedding +weekend +weird +welcome +west +wet +whale +what +wheat +wheel +when +where +whip +whisper +wide +width +wife +wild +will +win +window +wine +wing +wink +winner +winter +wire +wisdom +wise +wish +witness +wolf +woman +wonder +wood +wool +word +work +world +worry +worth +wrap +wreck +wrestle +wrist +write +wrong +yard +year +yellow +you +young +youth +zebra +zero +zone +zoo` diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/hash.go b/vendor/github.com/skycoin/skycoin/src/cipher/hash.go new file mode 100755 index 0000000..ec304c5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/hash.go @@ -0,0 +1,181 @@ +package cipher + +import ( + "encoding/hex" + "errors" + "hash" + "log" +) + +// var ( +// sha256Hash hash.Hash = sha256.New() +// ripemd160Hash hash.Hash = ripemd160.New() +// ) + +var ( + poolsize = 10 + sha256HashChan chan hash.Hash // reuse the hash thread safely. + ripemd160HashChan chan hash.Hash +) + +// Ripemd160 ripemd160 +type Ripemd160 [20]byte + +// Set sets value +func (rd *Ripemd160) Set(b []byte) { + if len(b) != 20 { + log.Panic("Invalid ripemd160 length") + } + copy(rd[:], b[:]) +} + +// HashRipemd160 hash data to Ripemd160 +func HashRipemd160(data []byte) Ripemd160 { + ripemd160Hash := <-ripemd160HashChan + ripemd160Hash.Reset() + ripemd160Hash.Write(data) + sum := ripemd160Hash.Sum(nil) + ripemd160HashChan <- ripemd160Hash + + h := Ripemd160{} + h.Set(sum) + return h +} + +// SHA256 32 bytes +type SHA256 [32]byte + +// Set sets value +func (g *SHA256) Set(b []byte) { + if len(b) != 32 { + log.Panic("Invalid sha256 length") + } + copy(g[:], b[:]) +} + +// Hex encode sha256 to hex string +func (g SHA256) Hex() string { + return hex.EncodeToString(g[:]) +} + +// Null returns true if the hash is null (0x0000..) +func (g SHA256) Null() bool { + return g == SHA256{} +} + +// Xor xor +func (g *SHA256) Xor(b SHA256) SHA256 { + c := SHA256{} + for i := 0; i < 32; i++ { + c[i] = g[i] ^ b[i] + } + return c +} + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) SHA256 { + sha256Hash := <-sha256HashChan + sha256Hash.Reset() + sha256Hash.Write(b) + sum := sha256Hash.Sum(nil) + sha256HashChan <- sha256Hash + + h := SHA256{} + h.Set(sum) + return h +} + +// SHA256FromHex decodes a hex encoded SHA256 hash to bytes. If invalid, will return error. +// Does not panic. +func SHA256FromHex(hs string) (SHA256, error) { + h := SHA256{} + b, err := hex.DecodeString(hs) + if err != nil { + return h, err + } + if len(b) != len(h) { + return h, errors.New("Invalid hex length") + } + h.Set(b) + return h, nil +} + +// MustSHA256FromHex same as SHA256FromHex, except will panic when detect error +func MustSHA256FromHex(hs string) SHA256 { + h, err := SHA256FromHex(hs) + if err != nil { + log.Panic(err) + } + return h +} + +// SHA256FromBytes converts []byte to SHA256 +func SHA256FromBytes(b []byte) (SHA256, error) { + h := SHA256{} + + if len(b) != len(h) { + return h, errors.New("Invalid bytes length") + } + + h.Set(b) + return h, nil +} + +// MustSHA256FromBytes is the same as SHA256FromBytes, except it will panic when it detects an error +func MustSHA256FromBytes(b []byte) SHA256 { + h, err := SHA256FromBytes(b) + if err != nil { + log.Panic(err) + } + return h +} + +// MustSumSHA256 like SumSHA256, but len(b) must equal n, or panic +func MustSumSHA256(b []byte, n int) SHA256 { + if len(b) != n { + log.Panicf("Invalid sumsha256 byte length. Expected %d, have %d", + n, len(b)) + } + return SumSHA256(b) +} + +// DoubleSHA256 double SHA256 +func DoubleSHA256(b []byte) SHA256 { + //h := SumSHA256(b) + //return AddSHA256(h, h) + h1 := SumSHA256(b) + h2 := SumSHA256(h1[:]) + return h2 +} + +// AddSHA256 returns the SHA256 hash of to two concatenated hashes +func AddSHA256(a SHA256, b SHA256) SHA256 { + c := append(a[:], b[:]...) + return SumSHA256(c) +} + +// Returns the next highest power of 2 above n, if n is not already a +// power of 2 +func nextPowerOfTwo(n uint64) uint64 { + var k uint64 = 1 + for k < n { + k *= 2 + } + return k +} + +// Merkle computes the merkle root of a hash array +// Array of hashes is padded with 0 hashes until next power of 2 +func Merkle(h0 []SHA256) SHA256 { + lh := uint64(len(h0)) + np := nextPowerOfTwo(lh) + h1 := append(h0, make([]SHA256, np-lh)...) + for len(h1) != 1 { + h2 := make([]SHA256, len(h1)/2) + for i := 0; i < len(h2); i++ { + h2[i] = AddSHA256(h1[2*i], h1[2*i+1]) + } + h1 = h2 + } + return h1[0] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/hash_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/hash_test.go new file mode 100755 index 0000000..d57be0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/hash_test.go @@ -0,0 +1,271 @@ +package cipher + +import ( + "bytes" + "crypto/rand" + "crypto/sha256" + "encoding/hex" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher/ripemd160" +) + +func freshSumRipemd160(b []byte) Ripemd160 { + sh := ripemd160.New() + sh.Write(b) + h := Ripemd160{} + h.Set(sh.Sum(nil)) + return h +} + +func freshSumSHA256(b []byte) SHA256 { + sh := sha256.New() + sh.Write(b) + h := SHA256{} + h.Set(sh.Sum(nil)) + return h +} + +func randBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + x, err := rand.Read(b) + assert.Equal(t, n, x) + assert.Nil(t, err) + return b +} + +func TestHashRipemd160(t *testing.T) { + assert.NotPanics(t, func() { HashRipemd160(randBytes(t, 128)) }) + r := HashRipemd160(randBytes(t, 160)) + assert.NotEqual(t, r, Ripemd160{}) + // 2nd hash should not be affected by previous + b := randBytes(t, 256) + r2 := HashRipemd160(b) + assert.NotEqual(t, r2, Ripemd160{}) + assert.Equal(t, r2, freshSumRipemd160(b)) +} + +func TestRipemd160Set(t *testing.T) { + h := Ripemd160{} + assert.Panics(t, func() { + h.Set(randBytes(t, 21)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 100)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 19)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 0)) + }) + assert.NotPanics(t, func() { + h.Set(randBytes(t, 20)) + }) + b := randBytes(t, 20) + h.Set(b) + assert.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256Set(t *testing.T) { + h := SHA256{} + assert.Panics(t, func() { + h.Set(randBytes(t, 33)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 100)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 31)) + }) + assert.Panics(t, func() { + h.Set(randBytes(t, 0)) + }) + assert.NotPanics(t, func() { + h.Set(randBytes(t, 32)) + }) + b := randBytes(t, 32) + h.Set(b) + assert.True(t, bytes.Equal(h[:], b)) +} + +func TestSHA256Hex(t *testing.T) { + h := SHA256{} + h.Set(randBytes(t, 32)) + s := h.Hex() + h2, err := SHA256FromHex(s) + assert.Nil(t, err) + assert.Equal(t, h, h2) + assert.Equal(t, h2.Hex(), s) +} + +func TestSHA256KnownValue(t *testing.T) { + vals := []struct { + input string + output string + }{ + // These values are generated by + // echo -n input | sha256sum + { + "skycoin", + "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d", + }, + { + "hello world", + "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", + }, + { + "hello world asd awd awd awdapodawpokawpod ", + "99d71f95cafe05ea2dddebc35b6083bd5af0e44850c9dc5139b4476c99950be4", + }, + } + for _, io := range vals { + assert.Equal(t, io.output, SumSHA256([]byte(io.input)).Hex()) + } +} + +func TestSumSHA256(t *testing.T) { + b := randBytes(t, 256) + h1 := SumSHA256(b) + assert.NotEqual(t, h1, SHA256{}) + // A second call to Sum should not be influenced by the original + c := randBytes(t, 256) + h2 := SumSHA256(c) + assert.NotEqual(t, h2, SHA256{}) + assert.Equal(t, h2, freshSumSHA256(c)) +} + +func TestSHA256FromHex(t *testing.T) { + // Invalid hex hash + _, err := SHA256FromHex("cawcd") + assert.NotNil(t, err) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + _, err = SHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + assert.NotNil(t, err) + + // Valid hex hash + h2, err := SHA256FromHex(hex.EncodeToString(h[:])) + assert.Equal(t, h, h2) + assert.Nil(t, err) +} + +func TestMustSHA256FromHex(t *testing.T) { + // Invalid hex hash + assert.Panics(t, func() { MustSHA256FromHex("cawcd") }) + + // Truncated hex hash + h := SumSHA256(randBytes(t, 128)) + assert.Panics(t, func() { + MustSHA256FromHex(hex.EncodeToString(h[:len(h)/2])) + }) + + // Valid hex hash + h2 := MustSHA256FromHex(hex.EncodeToString(h[:])) + assert.Equal(t, h, h2) +} + +func TestMustSumSHA256(t *testing.T) { + b := randBytes(t, 128) + assert.Panics(t, func() { MustSumSHA256(b, 127) }) + assert.Panics(t, func() { MustSumSHA256(b, 129) }) + assert.NotPanics(t, func() { MustSumSHA256(b, 128) }) + h := MustSumSHA256(b, 128) + assert.NotEqual(t, h, SHA256{}) + assert.Equal(t, h, freshSumSHA256(b)) +} + +func TestDoubleSHA256(t *testing.T) { + b := randBytes(t, 128) + h := DoubleSHA256(b) + assert.NotEqual(t, h, SHA256{}) + assert.NotEqual(t, h, freshSumSHA256(b)) +} + +func TestAddSHA256(t *testing.T) { + b := randBytes(t, 128) + h := SumSHA256(b) + c := randBytes(t, 64) + i := SumSHA256(c) + add := AddSHA256(h, i) + assert.NotEqual(t, add, SHA256{}) + assert.NotEqual(t, add, h) + assert.NotEqual(t, add, i) + assert.Equal(t, add, SumSHA256(append(h[:], i[:]...))) +} + +func TestXorSHA256(t *testing.T) { + b := randBytes(t, 128) + c := randBytes(t, 128) + h := SumSHA256(b) + i := SumSHA256(c) + assert.NotEqual(t, h.Xor(i), h) + assert.NotEqual(t, h.Xor(i), i) + assert.NotEqual(t, h.Xor(i), SHA256{}) + assert.Equal(t, h.Xor(i), i.Xor(h)) +} + +func TestSHA256Null(t *testing.T) { + var x SHA256 + require.True(t, x.Null()) + + b := randBytes(t, 128) + x = SumSHA256(b) + + require.False(t, x.Null()) +} + +func TestNextPowerOfTwo(t *testing.T) { + inputs := [][]uint64{ + {0, 1}, + {1, 1}, + {2, 2}, + {3, 4}, + {4, 4}, + {5, 8}, + {8, 8}, + {14, 16}, + {16, 16}, + {17, 32}, + {43345, 65536}, + {65535, 65536}, + {35657, 65536}, + {65536, 65536}, + {65537, 131072}, + } + for _, i := range inputs { + assert.Equal(t, nextPowerOfTwo(i[0]), i[1]) + } + for i := uint64(2); i < 10000; i++ { + p := nextPowerOfTwo(i) + assert.Equal(t, p%2, uint64(0)) + assert.True(t, p >= i) + } +} + +func TestMerkle(t *testing.T) { + h := SumSHA256(randBytes(t, 128)) + // Single hash input returns hash + assert.Equal(t, Merkle([]SHA256{h}), h) + h2 := SumSHA256(randBytes(t, 128)) + // 2 hashes should be AddSHA256 of them + assert.Equal(t, Merkle([]SHA256{h, h2}), AddSHA256(h, h2)) + // 3 hashes should be Add(Add()) + h3 := SumSHA256(randBytes(t, 128)) + out := AddSHA256(AddSHA256(h, h2), AddSHA256(h3, SHA256{})) + assert.Equal(t, Merkle([]SHA256{h, h2, h3}), out) + // 4 hashes should be Add(Add()) + h4 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + assert.Equal(t, Merkle([]SHA256{h, h2, h3, h4}), out) + // 5 hashes + h5 := SumSHA256(randBytes(t, 128)) + out = AddSHA256(AddSHA256(h, h2), AddSHA256(h3, h4)) + out = AddSHA256(out, AddSHA256(AddSHA256(h5, SHA256{}), + AddSHA256(SHA256{}, SHA256{}))) + assert.Equal(t, Merkle([]SHA256{h, h2, h3, h4, h5}), out) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go new file mode 100755 index 0000000..caa40ad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2.go @@ -0,0 +1,77 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC +2898 / PKCS #5 v2.0. + +A key derivation function is useful when encrypting data based on a password +or any other not-fully-random data. It uses a pseudorandom function to derive +a secure encryption key based on the password. + +While v2.0 of the standard defines only one pseudorandom function to use, +HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved +Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To +choose, you can pass the `New` functions from the different SHA packages to +pbkdf2.Key. +*/ +package pbkdf2 // import "github.com/skycoin/skycoin/src/cipher/pbkdf2" + +import ( + "crypto/hmac" + "hash" +) + +// Key derives a key from the password, salt and iteration count, returning a +// []byte of length keylen that can be used as cryptographic key. The key is +// derived based on the method described as PBKDF2 with the HMAC variant using +// the supplied hash function. +// +// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you +// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by +// doing: +// +// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) +// +// Remember to get a good random salt. At least 8 bytes is recommended by the +// RFC. +// +// Using a higher iteration count will increase the cost of an exhaustive +// search but will also make derivation proportionally slower. +func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { + prf := hmac.New(h, password) + hashLen := prf.Size() + numBlocks := (keyLen + hashLen - 1) / hashLen + + var buf [4]byte + dk := make([]byte, 0, numBlocks*hashLen) + U := make([]byte, hashLen) + for block := 1; block <= numBlocks; block++ { + // N.B.: || means concatenation, ^ means XOR + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + // U_1 = PRF(password, salt || uint(i)) + prf.Reset() + prf.Write(salt) + buf[0] = byte(block >> 24) + buf[1] = byte(block >> 16) + buf[2] = byte(block >> 8) + buf[3] = byte(block) + prf.Write(buf[:4]) + dk = prf.Sum(dk) + T := dk[len(dk)-hashLen:] + copy(U, T) + + // U_n = PRF(password, U_(n-1)) + for n := 2; n <= iter; n++ { + prf.Reset() + prf.Write(U) + U = U[:0] + U = prf.Sum(U) + for x := range U { + T[x] ^= U[x] + } + } + } + return dk[:keyLen] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2_test.go new file mode 100755 index 0000000..1379240 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/pbkdf2/pbkdf2_test.go @@ -0,0 +1,157 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pbkdf2 + +import ( + "bytes" + "crypto/sha1" + "crypto/sha256" + "hash" + "testing" +) + +type testVector struct { + password string + salt string + iter int + output []byte +} + +// Test vectors from RFC 6070, http://tools.ietf.org/html/rfc6070 +var sha1TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, + 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, + 0x2f, 0xe0, 0x37, 0xa6, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, + 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, + 0xd8, 0xde, 0x89, 0x57, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, + 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, + 0x65, 0xa4, 0x29, 0xc1, + }, + }, + // // This one takes too long + // { + // "password", + // "salt", + // 16777216, + // []byte{ + // 0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, + // 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, + // 0x26, 0x34, 0xe9, 0x84, + // }, + // }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, + 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, + 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, + 0x38, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, + 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3, + }, + }, +} + +// Test vectors from +// http://stackoverflow.com/questions/5130513/pbkdf2-hmac-sha2-test-vectors +var sha256TestVectors = []testVector{ + { + "password", + "salt", + 1, + []byte{ + 0x12, 0x0f, 0xb6, 0xcf, 0xfc, 0xf8, 0xb3, 0x2c, + 0x43, 0xe7, 0x22, 0x52, 0x56, 0xc4, 0xf8, 0x37, + 0xa8, 0x65, 0x48, 0xc9, + }, + }, + { + "password", + "salt", + 2, + []byte{ + 0xae, 0x4d, 0x0c, 0x95, 0xaf, 0x6b, 0x46, 0xd3, + 0x2d, 0x0a, 0xdf, 0xf9, 0x28, 0xf0, 0x6d, 0xd0, + 0x2a, 0x30, 0x3f, 0x8e, + }, + }, + { + "password", + "salt", + 4096, + []byte{ + 0xc5, 0xe4, 0x78, 0xd5, 0x92, 0x88, 0xc8, 0x41, + 0xaa, 0x53, 0x0d, 0xb6, 0x84, 0x5c, 0x4c, 0x8d, + 0x96, 0x28, 0x93, 0xa0, + }, + }, + { + "passwordPASSWORDpassword", + "saltSALTsaltSALTsaltSALTsaltSALTsalt", + 4096, + []byte{ + 0x34, 0x8c, 0x89, 0xdb, 0xcb, 0xd3, 0x2b, 0x2f, + 0x32, 0xd8, 0x14, 0xb8, 0x11, 0x6e, 0x84, 0xcf, + 0x2b, 0x17, 0x34, 0x7e, 0xbc, 0x18, 0x00, 0x18, + 0x1c, + }, + }, + { + "pass\000word", + "sa\000lt", + 4096, + []byte{ + 0x89, 0xb6, 0x9d, 0x05, 0x16, 0xf8, 0x29, 0x89, + 0x3c, 0x69, 0x62, 0x26, 0x65, 0x0a, 0x86, 0x87, + }, + }, +} + +func testHash(t *testing.T, h func() hash.Hash, hashName string, vectors []testVector) { + for i, v := range vectors { + o := Key([]byte(v.password), []byte(v.salt), v.iter, len(v.output), h) + if !bytes.Equal(o, v.output) { + t.Errorf("%s %d: expected %x, got %x", hashName, i, v.output, o) + } + } +} + +func TestWithHMACSHA1(t *testing.T) { + testHash(t, sha1.New, "SHA1", sha1TestVectors) +} + +func TestWithHMACSHA256(t *testing.T) { + testHash(t, sha256.New, "SHA256", sha256TestVectors) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go new file mode 100755 index 0000000..e7a5945 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305.go @@ -0,0 +1,32 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package poly1305 implements Poly1305 one-time message authentication code as specified in http://cr.yp.to/mac/poly1305-20050329.pdf. + +Poly1305 is a fast, one-time authentication function. It is infeasible for an +attacker to generate an authenticator for a message without the key. However, a +key must only be used for a single message. Authenticating two different +messages with the same key allows an attacker to forge authenticators for other +messages with the same key. + +Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was +used with a fixed key in order to generate one-time keys from an nonce. +However, in this package AES isn't used and the one-time key is specified +directly. +*/ +package poly1305 // import "github.com/skycoin/skycoin/src/cipher/poly1305" + +import "crypto/subtle" + +// TagSize is the size, in bytes, of a poly1305 authenticator. +const TagSize = 16 + +// Verify returns true if mac is a valid authenticator for m with the given +// key. +func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { + var tmp [16]byte + Sum(&tmp, m, key) + return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305_test.go new file mode 100755 index 0000000..017027f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/poly1305_test.go @@ -0,0 +1,159 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package poly1305 + +import ( + "bytes" + "encoding/hex" + "flag" + "testing" + "unsafe" +) + +var stressFlag = flag.Bool("stress", false, "run slow stress tests") + +var testData = []struct { + in, k, correct []byte +}{ + { + []byte("Hello world!"), + []byte("this is 32-byte key for Poly1305"), + []byte{0xa6, 0xf7, 0x45, 0x00, 0x8f, 0x81, 0xc9, 0x16, 0xa2, 0x0d, 0xcc, 0x74, 0xee, 0xf2, 0xb2, 0xf0}, + }, + { + make([]byte, 32), + []byte("this is 32-byte key for Poly1305"), + []byte{0x49, 0xec, 0x78, 0x09, 0x0e, 0x48, 0x1e, 0xc6, 0xc2, 0x6b, 0x33, 0xb9, 0x1c, 0xcc, 0x03, 0x07}, + }, + { + make([]byte, 2007), + []byte("this is 32-byte key for Poly1305"), + []byte{0xda, 0x84, 0xbc, 0xab, 0x02, 0x67, 0x6c, 0x38, 0xcd, 0xb0, 0x15, 0x60, 0x42, 0x74, 0xc2, 0xaa}, + }, + { + make([]byte, 2007), + make([]byte, 32), + make([]byte, 16), + }, + { + // This test triggers an edge-case. See https://go-review.googlesource.com/#/c/30101/. + []byte{0x81, 0xd8, 0xb2, 0xe4, 0x6a, 0x25, 0x21, 0x3b, 0x58, 0xfe, 0xe4, 0x21, 0x3a, 0x2a, 0x28, 0xe9, 0x21, 0xc1, 0x2a, 0x96, 0x32, 0x51, 0x6d, 0x3b, 0x73, 0x27, 0x27, 0x27, 0xbe, 0xcf, 0x21, 0x29}, + []byte{0x3b, 0x3a, 0x29, 0xe9, 0x3b, 0x21, 0x3a, 0x5c, 0x5c, 0x3b, 0x3b, 0x05, 0x3a, 0x3a, 0x8c, 0x0d}, + []byte{0x6d, 0xc1, 0x8b, 0x8c, 0x34, 0x4c, 0xd7, 0x99, 0x27, 0x11, 0x8b, 0xbe, 0x84, 0xb7, 0xf3, 0x14}, + }, + { + // This test generates a result of (2^130-1) % (2^130-5). + []byte{ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + // This test generates a result of (2^130-6) % (2^130-5). + []byte{ + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + }, + { + // This test generates a result of (2^130-5) % (2^130-5). + []byte{ + 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }, + []byte{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + }, +} + +func testSum(t *testing.T, unaligned bool) { + var out [16]byte + var key [32]byte + + for i, v := range testData { + in := v.in + if unaligned { + in = unalignBytes(in) + } + copy(key[:], v.k) + Sum(&out, in, &key) + if !bytes.Equal(out[:], v.correct) { + t.Errorf("%d: expected %x, got %x", i, v.correct, out[:]) + } + } +} + +func TestBurnin(t *testing.T) { + // This test can be used to sanity-check significant changes. It can + // take about many minutes to run, even on fast machines. It's disabled + // by default. + if !*stressFlag { + t.Skip("skipping without -stress") + } + + var key [32]byte + var input [25]byte + var output [16]byte + + for i := range key { + key[i] = 1 + } + for i := range input { + input[i] = 2 + } + + for i := uint64(0); i < 1e10; i++ { + Sum(&output, input[:], &key) + copy(key[0:], output[:]) + copy(key[16:], output[:]) + copy(input[:], output[:]) + copy(input[16:], output[:]) + } + + const expected = "5e3b866aea0b636d240c83c428f84bfa" + if got := hex.EncodeToString(output[:]); got != expected { + t.Errorf("expected %s, got %s", expected, got) + } +} + +func TestSum(t *testing.T) { testSum(t, false) } +func TestSumUnaligned(t *testing.T) { testSum(t, true) } + +func benchmark(b *testing.B, size int, unaligned bool) { + var out [16]byte + var key [32]byte + in := make([]byte, size) + if unaligned { + in = unalignBytes(in) + } + b.SetBytes(int64(len(in))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Sum(&out, in, &key) + } +} + +func Benchmark64(b *testing.B) { benchmark(b, 64, false) } +func Benchmark1K(b *testing.B) { benchmark(b, 1024, false) } +func Benchmark64Unaligned(b *testing.B) { benchmark(b, 64, true) } +func Benchmark1KUnaligned(b *testing.B) { benchmark(b, 1024, true) } + +func unalignBytes(in []byte) []byte { + out := make([]byte, len(in)+1) + if uintptr(unsafe.Pointer(&out[0]))&(unsafe.Alignof(uint32(0))-1) == 0 { + out = out[1:] + } else { + out = out[:len(in)] + } + copy(out, in) + return out +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go new file mode 100755 index 0000000..4dd72fe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +package poly1305 + +// This function is implemented in sum_amd64.s +//go:noescape +func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305(out, mPtr, uint64(len(m)), key) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s new file mode 100755 index 0000000..2edae63 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_amd64.s @@ -0,0 +1,125 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,!gccgo,!appengine + +#include "textflag.h" + +#define POLY1305_ADD(msg, h0, h1, h2) \ + ADDQ 0(msg), h0; \ + ADCQ 8(msg), h1; \ + ADCQ $1, h2; \ + LEAQ 16(msg), msg + +#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ + MOVQ r0, AX; \ + MULQ h0; \ + MOVQ AX, t0; \ + MOVQ DX, t1; \ + MOVQ r0, AX; \ + MULQ h1; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ r0, t2; \ + IMULQ h2, t2; \ + ADDQ DX, t2; \ + \ + MOVQ r1, AX; \ + MULQ h0; \ + ADDQ AX, t1; \ + ADCQ $0, DX; \ + MOVQ DX, h0; \ + MOVQ r1, t3; \ + IMULQ h2, t3; \ + MOVQ r1, AX; \ + MULQ h1; \ + ADDQ AX, t2; \ + ADCQ DX, t3; \ + ADDQ h0, t2; \ + ADCQ $0, t3; \ + \ + MOVQ t0, h0; \ + MOVQ t1, h1; \ + MOVQ t2, h2; \ + ANDQ $3, h2; \ + MOVQ t2, t0; \ + ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ + ADDQ t0, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2; \ + SHRQ $2, t3, t2; \ + SHRQ $2, t3; \ + ADDQ t2, h0; \ + ADCQ t3, h1; \ + ADCQ $0, h2 + +DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF +DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC +GLOBL ·poly1305Mask<>(SB), RODATA, $16 + +// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) +TEXT ·poly1305(SB), $0-32 + MOVQ out+0(FP), DI + MOVQ m+8(FP), SI + MOVQ mlen+16(FP), R15 + MOVQ key+24(FP), AX + + MOVQ 0(AX), R11 + MOVQ 8(AX), R12 + ANDQ ·poly1305Mask<>(SB), R11 // r0 + ANDQ ·poly1305Mask<>+8(SB), R12 // r1 + XORQ R8, R8 // h0 + XORQ R9, R9 // h1 + XORQ R10, R10 // h2 + + CMPQ R15, $16 + JB bytes_between_0_and_15 + +loop: + POLY1305_ADD(SI, R8, R9, R10) + +multiply: + POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) + SUBQ $16, R15 + CMPQ R15, $16 + JAE loop + +bytes_between_0_and_15: + TESTQ R15, R15 + JZ done + MOVQ $1, BX + XORQ CX, CX + XORQ R13, R13 + ADDQ R15, SI + +flush_buffer: + SHLQ $8, BX, CX + SHLQ $8, BX + MOVB -1(SI), R13 + XORQ R13, BX + DECQ SI + DECQ R15 + JNZ flush_buffer + + ADDQ BX, R8 + ADCQ CX, R9 + ADCQ $0, R10 + MOVQ $16, R15 + JMP multiply + +done: + MOVQ R8, AX + MOVQ R9, BX + SUBQ $0xFFFFFFFFFFFFFFFB, AX + SBBQ $0xFFFFFFFFFFFFFFFF, BX + SBBQ $3, R10 + CMOVQCS R8, AX + CMOVQCS R9, BX + MOVQ key+24(FP), R8 + ADDQ 16(R8), AX + ADCQ 24(R8), BX + + MOVQ AX, 0(DI) + MOVQ BX, 8(DI) + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go new file mode 100755 index 0000000..5dc321c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.go @@ -0,0 +1,22 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +package poly1305 + +// This function is implemented in sum_arm.s +//go:noescape +func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) + +// Sum generates an authenticator for m using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[16]byte, m []byte, key *[32]byte) { + var mPtr *byte + if len(m) > 0 { + mPtr = &m[0] + } + poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s new file mode 100755 index 0000000..f70b4ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_arm.s @@ -0,0 +1,427 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,!gccgo,!appengine,!nacl + +#include "textflag.h" + +// This code was translated into a form compatible with 5a from the public +// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. + +DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff +DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 +DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff +DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff +DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff +GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 + +// Warning: the linker may use R11 to synthesize certain instructions. Please +// take care and verify that no synthetic instructions use it. + +TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 + // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It + // might look like it's only 60 bytes of space but the final four bytes + // will be written by another function.) We need to skip over four + // bytes of stack because that's saving the value of 'g'. + ADD $4, R13, R8 + MOVM.IB [R4-R7], (R8) + MOVM.IA.W (R1), [R2-R5] + MOVW $·poly1305_init_constants_armv6<>(SB), R7 + MOVW R2, R8 + MOVW R2>>26, R9 + MOVW R3>>20, g + MOVW R4>>14, R11 + MOVW R5>>8, R12 + ORR R3<<6, R9, R9 + ORR R4<<12, g, g + ORR R5<<18, R11, R11 + MOVM.IA (R7), [R2-R6] + AND R8, R2, R2 + AND R9, R3, R3 + AND g, R4, R4 + AND R11, R5, R5 + AND R12, R6, R6 + MOVM.IA.W [R2-R6], (R0) + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + MOVM.IA.W [R2-R6], (R0) + MOVM.IA.W (R1), [R2-R5] + MOVM.IA [R2-R6], (R0) + ADD $20, R13, R0 + MOVM.DA (R0), [R4-R7] + RET + +#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ + MOVBU (offset+0)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+0)(Rdst); \ + MOVBU (offset+1)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+1)(Rdst); \ + MOVBU (offset+2)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+2)(Rdst); \ + MOVBU (offset+3)(Rsrc), Rtmp; \ + MOVBU Rtmp, (offset+3)(Rdst) + +TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 + // Needs 24 bytes of stack for saved registers and then 88 bytes of + // scratch space after that. We assume that 24 bytes at (R13) have + // already been used: four bytes for the link register saved in the + // prelude of poly1305_auth_armv6, four bytes for saving the value of g + // in that function and 16 bytes of scratch space used around + // poly1305_finish_ext_armv6_skip1. + ADD $24, R13, R12 + MOVM.IB [R4-R8, R14], (R12) + MOVW R0, 88(R13) + MOVW R1, 92(R13) + MOVW R2, 96(R13) + MOVW R1, R14 + MOVW R2, R12 + MOVW 56(R0), R8 + WORD $0xe1180008 // TST R8, R8 not working see issue 5921 + EOR R6, R6, R6 + MOVW.EQ $(1<<24), R6 + MOVW R6, 84(R13) + ADD $116, R13, g + MOVM.IA (R0), [R0-R9] + MOVM.IA [R0-R4], (g) + CMP $16, R12 + BLO poly1305_blocks_armv6_done + +poly1305_blocks_armv6_mainloop: + WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 + BEQ poly1305_blocks_armv6_mainloop_aligned + ADD $100, R13, g + MOVW_UNALIGNED(R14, g, R0, 0) + MOVW_UNALIGNED(R14, g, R0, 4) + MOVW_UNALIGNED(R14, g, R0, 8) + MOVW_UNALIGNED(R14, g, R0, 12) + MOVM.IA (g), [R0-R3] + ADD $16, R14 + B poly1305_blocks_armv6_mainloop_loaded + +poly1305_blocks_armv6_mainloop_aligned: + MOVM.IA.W (R14), [R0-R3] + +poly1305_blocks_armv6_mainloop_loaded: + MOVW R0>>26, g + MOVW R1>>20, R11 + MOVW R2>>14, R12 + MOVW R14, 92(R13) + MOVW R3>>8, R4 + ORR R1<<6, g, g + ORR R2<<12, R11, R11 + ORR R3<<18, R12, R12 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, g, g + MOVW 84(R13), R3 + BIC $0xfc000000, R11, R11 + BIC $0xfc000000, R12, R12 + ADD R0, R5, R5 + ADD g, R6, R6 + ORR R3, R4, R4 + ADD R11, R7, R7 + ADD $116, R13, R14 + ADD R12, R8, R8 + ADD R4, R9, R9 + MOVM.IA (R14), [R0-R4] + MULLU R4, R5, (R11, g) + MULLU R3, R5, (R14, R12) + MULALU R3, R6, (R11, g) + MULALU R2, R6, (R14, R12) + MULALU R2, R7, (R11, g) + MULALU R1, R7, (R14, R12) + ADD R4<<2, R4, R4 + ADD R3<<2, R3, R3 + MULALU R1, R8, (R11, g) + MULALU R0, R8, (R14, R12) + MULALU R0, R9, (R11, g) + MULALU R4, R9, (R14, R12) + MOVW g, 76(R13) + MOVW R11, 80(R13) + MOVW R12, 68(R13) + MOVW R14, 72(R13) + MULLU R2, R5, (R11, g) + MULLU R1, R5, (R14, R12) + MULALU R1, R6, (R11, g) + MULALU R0, R6, (R14, R12) + MULALU R0, R7, (R11, g) + MULALU R4, R7, (R14, R12) + ADD R2<<2, R2, R2 + ADD R1<<2, R1, R1 + MULALU R4, R8, (R11, g) + MULALU R3, R8, (R14, R12) + MULALU R3, R9, (R11, g) + MULALU R2, R9, (R14, R12) + MOVW g, 60(R13) + MOVW R11, 64(R13) + MOVW R12, 52(R13) + MOVW R14, 56(R13) + MULLU R0, R5, (R11, g) + MULALU R4, R6, (R11, g) + MULALU R3, R7, (R11, g) + MULALU R2, R8, (R11, g) + MULALU R1, R9, (R11, g) + ADD $52, R13, R0 + MOVM.IA (R0), [R0-R7] + MOVW g>>26, R12 + MOVW R4>>26, R14 + ORR R11<<6, R12, R12 + ORR R5<<6, R14, R14 + BIC $0xfc000000, g, g + BIC $0xfc000000, R4, R4 + ADD.S R12, R0, R0 + ADC $0, R1, R1 + ADD.S R14, R6, R6 + ADC $0, R7, R7 + MOVW R0>>26, R12 + MOVW R6>>26, R14 + ORR R1<<6, R12, R12 + ORR R7<<6, R14, R14 + BIC $0xfc000000, R0, R0 + BIC $0xfc000000, R6, R6 + ADD R14<<2, R14, R14 + ADD.S R12, R2, R2 + ADC $0, R3, R3 + ADD R14, g, g + MOVW R2>>26, R12 + MOVW g>>26, R14 + ORR R3<<6, R12, R12 + BIC $0xfc000000, g, R5 + BIC $0xfc000000, R2, R7 + ADD R12, R4, R4 + ADD R14, R0, R0 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R8 + ADD R12, R6, R9 + MOVW 96(R13), R12 + MOVW 92(R13), R14 + MOVW R0, R6 + CMP $32, R12 + SUB $16, R12, R12 + MOVW R12, 96(R13) + BHS poly1305_blocks_armv6_mainloop + +poly1305_blocks_armv6_done: + MOVW 88(R13), R12 + MOVW R5, 20(R12) + MOVW R6, 24(R12) + MOVW R7, 28(R12) + MOVW R8, 32(R12) + MOVW R9, 36(R12) + ADD $48, R13, R0 + MOVM.DA (R0), [R4-R8, R14] + RET + +#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst); \ + MOVBU.P 1(Rsrc), Rtmp; \ + MOVBU.P Rtmp, 1(Rdst) + +#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ + MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) + +// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) +TEXT ·poly1305_auth_armv6(SB), $196-16 + // The value 196, just above, is the sum of 64 (the size of the context + // structure) and 132 (the amount of stack needed). + // + // At this point, the stack pointer (R13) has been moved down. It + // points to the saved link register and there's 196 bytes of free + // space above it. + // + // The stack for this function looks like: + // + // +--------------------- + // | + // | 64 bytes of context structure + // | + // +--------------------- + // | + // | 112 bytes for poly1305_blocks_armv6 + // | + // +--------------------- + // | 16 bytes of final block, constructed at + // | poly1305_finish_ext_armv6_skip8 + // +--------------------- + // | four bytes of saved 'g' + // +--------------------- + // | lr, saved by prelude <- R13 points here + // +--------------------- + MOVW g, 4(R13) + + MOVW out+0(FP), R4 + MOVW m+4(FP), R5 + MOVW mlen+8(FP), R6 + MOVW key+12(FP), R7 + + ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 + MOVW R7, R1 + + // poly1305_init_ext_armv6 will write to the stack from R13+4, but + // that's ok because none of the other values have been written yet. + BL poly1305_init_ext_armv6<>(SB) + BIC.S $15, R6, R2 + BEQ poly1305_auth_armv6_noblocks + ADD $136, R13, R0 + MOVW R5, R1 + ADD R2, R5, R5 + SUB R2, R6, R6 + BL poly1305_blocks_armv6<>(SB) + +poly1305_auth_armv6_noblocks: + ADD $136, R13, R0 + MOVW R5, R1 + MOVW R6, R2 + MOVW R4, R3 + + MOVW R0, R5 + MOVW R1, R6 + MOVW R2, R7 + MOVW R3, R8 + AND.S R2, R2, R2 + BEQ poly1305_finish_ext_armv6_noremaining + EOR R0, R0 + ADD $8, R13, R9 // 8 = offset to 16 byte scratch space + MOVW R0, (R9) + MOVW R0, 4(R9) + MOVW R0, 8(R9) + MOVW R0, 12(R9) + WORD $0xe3110003 // TST R1, #3 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_aligned + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8 + MOVWP_UNALIGNED(R1, R9, g) + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip8: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4 + MOVWP_UNALIGNED(R1, R9, g) + +poly1305_finish_ext_armv6_skip4: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHUP_UNALIGNED(R1, R9, g) + B poly1305_finish_ext_armv6_skip2 + +poly1305_finish_ext_armv6_aligned: + WORD $0xe3120008 // TST R2, #8 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip8_aligned + MOVM.IA.W (R1), [g-R11] + MOVM.IA.W [g-R11], (R9) + +poly1305_finish_ext_armv6_skip8_aligned: + WORD $0xe3120004 // TST $4, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip4_aligned + MOVW.P 4(R1), g + MOVW.P g, 4(R9) + +poly1305_finish_ext_armv6_skip4_aligned: + WORD $0xe3120002 // TST $2, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip2 + MOVHU.P 2(R1), g + MOVH.P g, 2(R9) + +poly1305_finish_ext_armv6_skip2: + WORD $0xe3120001 // TST $1, R2 not working see issue 5921 + BEQ poly1305_finish_ext_armv6_skip1 + MOVBU.P 1(R1), g + MOVBU.P g, 1(R9) + +poly1305_finish_ext_armv6_skip1: + MOVW $1, R11 + MOVBU R11, 0(R9) + MOVW R11, 56(R5) + MOVW R5, R0 + ADD $8, R13, R1 + MOVW $16, R2 + BL poly1305_blocks_armv6<>(SB) + +poly1305_finish_ext_armv6_noremaining: + MOVW 20(R5), R0 + MOVW 24(R5), R1 + MOVW 28(R5), R2 + MOVW 32(R5), R3 + MOVW 36(R5), R4 + MOVW R4>>26, R12 + BIC $0xfc000000, R4, R4 + ADD R12<<2, R12, R12 + ADD R12, R0, R0 + MOVW R0>>26, R12 + BIC $0xfc000000, R0, R0 + ADD R12, R1, R1 + MOVW R1>>26, R12 + BIC $0xfc000000, R1, R1 + ADD R12, R2, R2 + MOVW R2>>26, R12 + BIC $0xfc000000, R2, R2 + ADD R12, R3, R3 + MOVW R3>>26, R12 + BIC $0xfc000000, R3, R3 + ADD R12, R4, R4 + ADD $5, R0, R6 + MOVW R6>>26, R12 + BIC $0xfc000000, R6, R6 + ADD R12, R1, R7 + MOVW R7>>26, R12 + BIC $0xfc000000, R7, R7 + ADD R12, R2, g + MOVW g>>26, R12 + BIC $0xfc000000, g, g + ADD R12, R3, R11 + MOVW $-(1<<26), R12 + ADD R11>>26, R12, R12 + BIC $0xfc000000, R11, R11 + ADD R12, R4, R9 + MOVW R9>>31, R12 + SUB $1, R12 + AND R12, R6, R6 + AND R12, R7, R7 + AND R12, g, g + AND R12, R11, R11 + AND R12, R9, R9 + MVN R12, R12 + AND R12, R0, R0 + AND R12, R1, R1 + AND R12, R2, R2 + AND R12, R3, R3 + AND R12, R4, R4 + ORR R6, R0, R0 + ORR R7, R1, R1 + ORR g, R2, R2 + ORR R11, R3, R3 + ORR R9, R4, R4 + ORR R1<<26, R0, R0 + MOVW R1>>6, R1 + ORR R2<<20, R1, R1 + MOVW R2>>12, R2 + ORR R3<<14, R2, R2 + MOVW R3>>18, R3 + ORR R4<<8, R3, R3 + MOVW 40(R5), R6 + MOVW 44(R5), R7 + MOVW 48(R5), g + MOVW 52(R5), R11 + ADD.S R6, R0, R0 + ADC.S R7, R1, R1 + ADC.S g, R2, R2 + ADC.S R11, R3, R3 + MOVM.IA [R0-R3], (R8) + MOVW R5, R12 + EOR R0, R0, R0 + EOR R1, R1, R1 + EOR R2, R2, R2 + EOR R3, R3, R3 + EOR R4, R4, R4 + EOR R5, R5, R5 + EOR R6, R6, R6 + EOR R7, R7, R7 + MOVM.IA.W [R0-R7], (R12) + MOVM.IA [R0-R7], (R12) + MOVW 4(R13), g + RET diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go new file mode 100755 index 0000000..b2805a5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/poly1305/sum_ref.go @@ -0,0 +1,141 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !amd64,!arm gccgo appengine nacl + +package poly1305 + +import "encoding/binary" + +// Sum generates an authenticator for msg using a one-time key and puts the +// 16-byte result into out. Authenticating two different messages with the same +// key allows an attacker to forge messages at will. +func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { + var ( + h0, h1, h2, h3, h4 uint32 // the hash accumulators + r0, r1, r2, r3, r4 uint64 // the r part of the key + ) + + r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) + r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) + r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) + r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) + r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) + + R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 + + for len(msg) >= TagSize { + // h += msg + h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + + msg = msg[TagSize:] + } + + if len(msg) > 0 { + var block [TagSize]byte + off := copy(block[:], msg) + block[off] = 0x01 + + // h += msg + h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff + h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff + h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff + h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff + h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) + + // h *= r + d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) + d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) + d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) + d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) + d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) + + // h %= p + h0 = uint32(d0) & 0x3ffffff + h1 = uint32(d1) & 0x3ffffff + h2 = uint32(d2) & 0x3ffffff + h3 = uint32(d3) & 0x3ffffff + h4 = uint32(d4) & 0x3ffffff + + h0 += uint32(d4>>26) * 5 + h1 += h0 >> 26 + h0 = h0 & 0x3ffffff + } + + // h %= p reduction + h2 += h1 >> 26 + h1 &= 0x3ffffff + h3 += h2 >> 26 + h2 &= 0x3ffffff + h4 += h3 >> 26 + h3 &= 0x3ffffff + h0 += 5 * (h4 >> 26) + h4 &= 0x3ffffff + h1 += h0 >> 26 + h0 &= 0x3ffffff + + // h - p + t0 := h0 + 5 + t1 := h1 + (t0 >> 26) + t2 := h2 + (t1 >> 26) + t3 := h3 + (t2 >> 26) + t4 := h4 + (t3 >> 26) - (1 << 26) + t0 &= 0x3ffffff + t1 &= 0x3ffffff + t2 &= 0x3ffffff + t3 &= 0x3ffffff + + // select h if h < p else h - p + t_mask := (t4 >> 31) - 1 + h_mask := ^t_mask + h0 = (h0 & h_mask) | (t0 & t_mask) + h1 = (h1 & h_mask) | (t1 & t_mask) + h2 = (h2 & h_mask) | (t2 & t_mask) + h3 = (h3 & h_mask) | (t3 & t_mask) + h4 = (h4 & h_mask) | (t4 & t_mask) + + // h %= 2^128 + h0 |= h1 << 26 + h1 = ((h1 >> 6) | (h2 << 20)) + h2 = ((h2 >> 12) | (h3 << 14)) + h3 = ((h3 >> 18) | (h4 << 8)) + + // s: the s part of the key + // tag = (h + s) % (2^128) + t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) + h0 = uint32(t) + t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) + h1 = uint32(t) + t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) + h2 = uint32(t) + t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) + h3 = uint32(t) + + binary.LittleEndian.PutUint32(out[0:], h0) + binary.LittleEndian.PutUint32(out[4:], h1) + binary.LittleEndian.PutUint32(out[8:], h2) + binary.LittleEndian.PutUint32(out[12:], h3) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go new file mode 100755 index 0000000..4195209 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripemd160block.go @@ -0,0 +1,161 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// RIPEMD-160 block step. +// In its own file so that a faster assembly or C version +// can be substituted easily. + +package ripemd160 + +// work buffer indices and roll amounts for one line +var _n = [80]uint{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, +} + +var _r = [80]uint{ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, +} + +// same for the other parallel one +var n_ = [80]uint{ // nolint: golint + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, +} + +var r_ = [80]uint{ // nolint: golint + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, +} + +func _Block(md *digest, p []byte) int { + n := 0 + var x [16]uint32 + var alpha, beta uint32 + for len(p) >= BlockSize { + a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] + aa, bb, cc, dd, ee := a, b, c, d, e + j := 0 + for i := 0; i < 16; i++ { + x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 + j += 4 + } + + // round 1 + i := 0 + for i < 16 { + alpha = a + (b ^ c ^ d) + x[_n[i]] + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 2 + for i < 32 { + alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 3 + for i < 48 { + alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 4 + for i < 64 { + alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // round 5 + for i < 80 { + alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e + s := _r[i] + alpha = (alpha<>(32-s)) + e + beta = c<<10 | c>>22 + a, b, c, d, e = e, alpha, b, beta, d + + // parallel line + alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] + s = r_[i] + alpha = (alpha<>(32-s)) + ee + beta = cc<<10 | cc>>22 + aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd + + i++ + } + + // combine results + dd += c + md.s[1] + md.s[1] = md.s[2] + d + ee + md.s[2] = md.s[3] + e + aa + md.s[3] = md.s[4] + a + bb + md.s[4] = md.s[0] + b + cc + md.s[0] = dd + + p = p[BlockSize:] + n += BlockSize + } + return n +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go new file mode 100755 index 0000000..11bb5fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/ripemd160/ripmd_160.go @@ -0,0 +1,121 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ripemd160 implements the RIPEMD-160 hash algorithm. +package ripemd160 + +// RIPEMD-160 is designed by by Hans Dobbertin, Antoon Bosselaers, and Bart +// Preneel with specifications available at: +// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. + +import ( + "crypto" + "hash" +) + +func init() { + crypto.RegisterHash(crypto.RIPEMD160, New) +} + +// Size is the size of the checksum in bytes. +const Size = 20 + +// BlockSize is the block size of the hash algorithm in bytes. +const BlockSize = 64 + +const ( + _s0 = 0x67452301 + _s1 = 0xefcdab89 + _s2 = 0x98badcfe + _s3 = 0x10325476 + _s4 = 0xc3d2e1f0 +) + +// digest represents the partial evaluation of a checksum. +type digest struct { + s [5]uint32 // running context + x [BlockSize]byte // temporary buffer + nx int // index into x + tc uint64 // total count of bytes processed +} + +func (d *digest) Reset() { + d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 + d.nx = 0 + d.tc = 0 +} + +// New returns a new hash.Hash computing the checksum. +func New() hash.Hash { + result := new(digest) + result.Reset() + return result +} + +func (d *digest) Size() int { return Size } + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Write(p []byte) (nn int, err error) { + nn = len(p) + d.tc += uint64(nn) + if d.nx > 0 { + n := len(p) + if n > BlockSize-d.nx { + n = BlockSize - d.nx + } + for i := 0; i < n; i++ { + d.x[d.nx+i] = p[i] + } + d.nx += n + if d.nx == BlockSize { + _Block(d, d.x[0:]) + d.nx = 0 + } + p = p[n:] + } + n := _Block(d, p) + p = p[n:] + if len(p) > 0 { + d.nx = copy(d.x[:], p) + } + return +} + +func (d0 *digest) Sum(in []byte) []byte { // nolint: golint + // Make a copy of d0 so that caller can keep writing and summing. + d := *d0 + + // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. + tc := d.tc + var tmp [64]byte + tmp[0] = 0x80 + if tc%64 < 56 { + + d.Write(tmp[0 : 56-tc%64]) + } else { + d.Write(tmp[0 : 64+56-tc%64]) + } + + // Length in bits. + tc <<= 3 + for i := uint(0); i < 8; i++ { + tmp[i] = byte(tc >> (8 * i)) + } + d.Write(tmp[0:8]) + + if d.nx != 0 { + panic("d.nx != 0") + } + + var digest [Size]byte + for i, s := range d.s { + digest[i*4] = byte(s) + digest[i*4+1] = byte(s >> 8) + digest[i*4+2] = byte(s >> 16) + digest[i*4+3] = byte(s >> 24) + } + + return append(in, digest[:]...) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go new file mode 100755 index 0000000..347f32d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt.go @@ -0,0 +1,243 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package scrypt implements the scrypt key derivation function as defined in +// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard +// Functions" (http://www.tarsnap.com/scrypt/scrypt.pdf). +package scrypt // import "github.com/skycoin/skycoin/src/cipher/scrypt" + +import ( + "crypto/sha256" + "errors" + + "github.com/skycoin/skycoin/src/cipher/pbkdf2" +) + +const maxInt = int(^uint(0) >> 1) + +// blockCopy copies n numbers from src into dst. +func blockCopy(dst, src []uint32, n int) { + copy(dst, src[:n]) +} + +// blockXOR XORs numbers from dst with n numbers from src. +func blockXOR(dst, src []uint32, n int) { + for i, v := range src[:n] { + dst[i] ^= v + } +} + +// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, +// and puts the result into both both tmp and out. +func salsaXOR(tmp *[16]uint32, in, out []uint32) { + w0 := tmp[0] ^ in[0] + w1 := tmp[1] ^ in[1] + w2 := tmp[2] ^ in[2] + w3 := tmp[3] ^ in[3] + w4 := tmp[4] ^ in[4] + w5 := tmp[5] ^ in[5] + w6 := tmp[6] ^ in[6] + w7 := tmp[7] ^ in[7] + w8 := tmp[8] ^ in[8] + w9 := tmp[9] ^ in[9] + w10 := tmp[10] ^ in[10] + w11 := tmp[11] ^ in[11] + w12 := tmp[12] ^ in[12] + w13 := tmp[13] ^ in[13] + w14 := tmp[14] ^ in[14] + w15 := tmp[15] ^ in[15] + + x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 + x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 + + for i := 0; i < 8; i += 2 { + u := x0 + x12 + x4 ^= u<<7 | u>>(32-7) + u = x4 + x0 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x4 + x12 ^= u<<13 | u>>(32-13) + u = x12 + x8 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x1 + x9 ^= u<<7 | u>>(32-7) + u = x9 + x5 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x9 + x1 ^= u<<13 | u>>(32-13) + u = x1 + x13 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x6 + x14 ^= u<<7 | u>>(32-7) + u = x14 + x10 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x14 + x6 ^= u<<13 | u>>(32-13) + u = x6 + x2 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x11 + x3 ^= u<<7 | u>>(32-7) + u = x3 + x15 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x3 + x11 ^= u<<13 | u>>(32-13) + u = x11 + x7 + x15 ^= u<<18 | u>>(32-18) + + u = x0 + x3 + x1 ^= u<<7 | u>>(32-7) + u = x1 + x0 + x2 ^= u<<9 | u>>(32-9) + u = x2 + x1 + x3 ^= u<<13 | u>>(32-13) + u = x3 + x2 + x0 ^= u<<18 | u>>(32-18) + + u = x5 + x4 + x6 ^= u<<7 | u>>(32-7) + u = x6 + x5 + x7 ^= u<<9 | u>>(32-9) + u = x7 + x6 + x4 ^= u<<13 | u>>(32-13) + u = x4 + x7 + x5 ^= u<<18 | u>>(32-18) + + u = x10 + x9 + x11 ^= u<<7 | u>>(32-7) + u = x11 + x10 + x8 ^= u<<9 | u>>(32-9) + u = x8 + x11 + x9 ^= u<<13 | u>>(32-13) + u = x9 + x8 + x10 ^= u<<18 | u>>(32-18) + + u = x15 + x14 + x12 ^= u<<7 | u>>(32-7) + u = x12 + x15 + x13 ^= u<<9 | u>>(32-9) + u = x13 + x12 + x14 ^= u<<13 | u>>(32-13) + u = x14 + x13 + x15 ^= u<<18 | u>>(32-18) + } + x0 += w0 + x1 += w1 + x2 += w2 + x3 += w3 + x4 += w4 + x5 += w5 + x6 += w6 + x7 += w7 + x8 += w8 + x9 += w9 + x10 += w10 + x11 += w11 + x12 += w12 + x13 += w13 + x14 += w14 + x15 += w15 + + out[0], tmp[0] = x0, x0 + out[1], tmp[1] = x1, x1 + out[2], tmp[2] = x2, x2 + out[3], tmp[3] = x3, x3 + out[4], tmp[4] = x4, x4 + out[5], tmp[5] = x5, x5 + out[6], tmp[6] = x6, x6 + out[7], tmp[7] = x7, x7 + out[8], tmp[8] = x8, x8 + out[9], tmp[9] = x9, x9 + out[10], tmp[10] = x10, x10 + out[11], tmp[11] = x11, x11 + out[12], tmp[12] = x12, x12 + out[13], tmp[13] = x13, x13 + out[14], tmp[14] = x14, x14 + out[15], tmp[15] = x15, x15 +} + +func blockMix(tmp *[16]uint32, in, out []uint32, r int) { + blockCopy(tmp[:], in[(2*r-1)*16:], 16) + for i := 0; i < 2*r; i += 2 { + salsaXOR(tmp, in[i*16:], out[i*8:]) + salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) + } +} + +func integer(b []uint32, r int) uint64 { + j := (2*r - 1) * 16 + return uint64(b[j]) | uint64(b[j+1])<<32 +} + +func smix(b []byte, r, N int, v, xy []uint32) { + var tmp [16]uint32 + x := xy + y := xy[32*r:] + + j := 0 + for i := 0; i < 32*r; i++ { + x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 + j += 4 + } + for i := 0; i < N; i += 2 { + blockCopy(v[i*(32*r):], x, 32*r) + blockMix(&tmp, x, y, r) + + blockCopy(v[(i+1)*(32*r):], y, 32*r) + blockMix(&tmp, y, x, r) + } + for i := 0; i < N; i += 2 { + j := int(integer(x, r) & uint64(N-1)) + blockXOR(x, v[j*(32*r):], 32*r) + blockMix(&tmp, x, y, r) + + j = int(integer(y, r) & uint64(N-1)) + blockXOR(y, v[j*(32*r):], 32*r) + blockMix(&tmp, y, x, r) + } + j = 0 + for _, v := range x[:32*r] { + b[j+0] = byte(v >> 0) + b[j+1] = byte(v >> 8) + b[j+2] = byte(v >> 16) + b[j+3] = byte(v >> 24) + j += 4 + } +} + +// Key derives a key from the password, salt, and cost parameters, returning +// a byte slice of length keyLen that can be used as cryptographic key. +// +// N is a CPU/memory cost parameter, which must be a power of two greater than 1. +// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the +// limits, the function returns a nil byte slice and an error. +// +// For example, you can get a derived key for e.g. AES-256 (which needs a +// 32-byte key) by doing: +// +// dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) +// +// The recommended parameters for interactive logins as of 2009 are N=16384, +// r=8, p=1. They should be increased as memory latency and CPU parallelism +// increases. Remember to get a good random salt. +func Key(password, salt []byte, N, r, p, keyLen int) ([]byte, error) { + if N <= 1 || N&(N-1) != 0 { + return nil, errors.New("scrypt: N must be > 1 and a power of 2") + } + if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { + return nil, errors.New("scrypt: parameters are too large") + } + + xy := make([]uint32, 64*r) + v := make([]uint32, 32*N*r) + b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) + + for i := 0; i < p; i++ { + smix(b[i*128*r:], r, N, v, xy) + } + + return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt_test.go new file mode 100755 index 0000000..e096c3a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/scrypt/scrypt_test.go @@ -0,0 +1,160 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package scrypt + +import ( + "bytes" + "testing" +) + +type testVector struct { + password string + salt string + N, r, p int + output []byte +} + +var good = []testVector{ + { + "password", + "salt", + 2, 10, 10, + []byte{ + 0x48, 0x2c, 0x85, 0x8e, 0x22, 0x90, 0x55, 0xe6, 0x2f, + 0x41, 0xe0, 0xec, 0x81, 0x9a, 0x5e, 0xe1, 0x8b, 0xdb, + 0x87, 0x25, 0x1a, 0x53, 0x4f, 0x75, 0xac, 0xd9, 0x5a, + 0xc5, 0xe5, 0xa, 0xa1, 0x5f, + }, + }, + { + "password", + "salt", + 16, 100, 100, + []byte{ + 0x88, 0xbd, 0x5e, 0xdb, 0x52, 0xd1, 0xdd, 0x0, 0x18, + 0x87, 0x72, 0xad, 0x36, 0x17, 0x12, 0x90, 0x22, 0x4e, + 0x74, 0x82, 0x95, 0x25, 0xb1, 0x8d, 0x73, 0x23, 0xa5, + 0x7f, 0x91, 0x96, 0x3c, 0x37, + }, + }, + { + "this is a long \000 password", + "and this is a long \000 salt", + 16384, 8, 1, + []byte{ + 0xc3, 0xf1, 0x82, 0xee, 0x2d, 0xec, 0x84, 0x6e, 0x70, + 0xa6, 0x94, 0x2f, 0xb5, 0x29, 0x98, 0x5a, 0x3a, 0x09, + 0x76, 0x5e, 0xf0, 0x4c, 0x61, 0x29, 0x23, 0xb1, 0x7f, + 0x18, 0x55, 0x5a, 0x37, 0x07, 0x6d, 0xeb, 0x2b, 0x98, + 0x30, 0xd6, 0x9d, 0xe5, 0x49, 0x26, 0x51, 0xe4, 0x50, + 0x6a, 0xe5, 0x77, 0x6d, 0x96, 0xd4, 0x0f, 0x67, 0xaa, + 0xee, 0x37, 0xe1, 0x77, 0x7b, 0x8a, 0xd5, 0xc3, 0x11, + 0x14, 0x32, 0xbb, 0x3b, 0x6f, 0x7e, 0x12, 0x64, 0x40, + 0x18, 0x79, 0xe6, 0x41, 0xae, + }, + }, + { + "p", + "s", + 2, 1, 1, + []byte{ + 0x48, 0xb0, 0xd2, 0xa8, 0xa3, 0x27, 0x26, 0x11, 0x98, + 0x4c, 0x50, 0xeb, 0xd6, 0x30, 0xaf, 0x52, + }, + }, + + { + "", + "", + 16, 1, 1, + []byte{ + 0x77, 0xd6, 0x57, 0x62, 0x38, 0x65, 0x7b, 0x20, 0x3b, + 0x19, 0xca, 0x42, 0xc1, 0x8a, 0x04, 0x97, 0xf1, 0x6b, + 0x48, 0x44, 0xe3, 0x07, 0x4a, 0xe8, 0xdf, 0xdf, 0xfa, + 0x3f, 0xed, 0xe2, 0x14, 0x42, 0xfc, 0xd0, 0x06, 0x9d, + 0xed, 0x09, 0x48, 0xf8, 0x32, 0x6a, 0x75, 0x3a, 0x0f, + 0xc8, 0x1f, 0x17, 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d, + 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89, + 0x06, + }, + }, + { + "password", + "NaCl", + 1024, 8, 16, + []byte{ + 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78, + 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 0x7c, 0x6a, + 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 0xe7, 0x73, 0x76, + 0x63, 0x4b, 0x37, 0x31, 0x62, 0x2e, 0xaf, 0x30, 0xd9, + 0x2e, 0x22, 0xa3, 0x88, 0x6f, 0xf1, 0x09, 0x27, 0x9d, + 0x98, 0x30, 0xda, 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, + 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, + 0x40, + }, + }, + { + "pleaseletmein", "SodiumChloride", + 16384, 8, 1, + []byte{ + 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, 0x46, + 0x1c, 0x06, 0xcd, 0x81, 0xfd, 0x38, 0xeb, 0xfd, 0xa8, + 0xfb, 0xba, 0x90, 0x4f, 0x8e, 0x3e, 0xa9, 0xb5, 0x43, + 0xf6, 0x54, 0x5d, 0xa1, 0xf2, 0xd5, 0x43, 0x29, 0x55, + 0x61, 0x3f, 0x0f, 0xcf, 0x62, 0xd4, 0x97, 0x05, 0x24, + 0x2a, 0x9a, 0xf9, 0xe6, 0x1e, 0x85, 0xdc, 0x0d, 0x65, + 0x1e, 0x40, 0xdf, 0xcf, 0x01, 0x7b, 0x45, 0x57, 0x58, + 0x87, + }, + }, + /* + // Disabled: needs 1 GiB RAM and takes too long for a simple test. + { + "pleaseletmein", "SodiumChloride", + 1048576, 8, 1, + []byte{ + 0x21, 0x01, 0xcb, 0x9b, 0x6a, 0x51, 0x1a, 0xae, 0xad, + 0xdb, 0xbe, 0x09, 0xcf, 0x70, 0xf8, 0x81, 0xec, 0x56, + 0x8d, 0x57, 0x4a, 0x2f, 0xfd, 0x4d, 0xab, 0xe5, 0xee, + 0x98, 0x20, 0xad, 0xaa, 0x47, 0x8e, 0x56, 0xfd, 0x8f, + 0x4b, 0xa5, 0xd0, 0x9f, 0xfa, 0x1c, 0x6d, 0x92, 0x7c, + 0x40, 0xf4, 0xc3, 0x37, 0x30, 0x40, 0x49, 0xe8, 0xa9, + 0x52, 0xfb, 0xcb, 0xf4, 0x5c, 0x6f, 0xa7, 0x7a, 0x41, + 0xa4, + }, + }, + */ +} + +var bad = []testVector{ + {"p", "s", 0, 1, 1, nil}, // N == 0 + {"p", "s", 1, 1, 1, nil}, // N == 1 + {"p", "s", 7, 8, 1, nil}, // N is not power of 2 + {"p", "s", 16, maxInt / 2, maxInt / 2, nil}, // p * r too large +} + +func TestKey(t *testing.T) { + for i, v := range good { + k, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, len(v.output)) + if err != nil { + t.Errorf("%d: got unexpected error: %s", i, err) + } + if !bytes.Equal(k, v.output) { + t.Errorf("%d: expected %x, got %x", i, v.output, k) + } + } + for i, v := range bad { + _, err := Key([]byte(v.password), []byte(v.salt), v.N, v.r, v.p, 32) + if err == nil { + t.Errorf("%d: expected error, got nil", i) + } + } +} + +func BenchmarkKey(b *testing.B) { + for i := 0; i < b.N; i++ { + Key([]byte("password"), []byte("salt"), 16384, 8, 1, 64) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/README.md new file mode 100755 index 0000000..28665ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/README.md @@ -0,0 +1,32 @@ +# secp256k1-go + +golang secp256k1 library + +Implements cryptographic operations for the secp256k1 ECDSA curve used by Bitcoin. + +## Installing + +You need to have installed [gmp](https://gmplib.org/) in your system. + + sudo apt-get install gmp-dev + +### Ubuntu 12.04 + + sudo apt-get update + sudo apt-get install libgmp-dev + +### OSX 10.9 + + curl -O https://ftp.gnu.org/gnu/gmp/gmp-6.0.0a.tar.xz + tar xfvz gmp-6.0.0a.tar.xz + cd gmp-6.0.0a.tar.xz + ./configure + make + sudo make install + make check # just in case + +## Test + +To run tests do + + go test diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go new file mode 100755 index 0000000..5c9374e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_rand.go @@ -0,0 +1,154 @@ +package secp256k1 + +import ( + crand "crypto/rand" + "crypto/sha256" //secure, system random number generator + "hash" + "io" + "log" + "os" + "strconv" + "strings" + "sync" + "time" +) + +var ( + poolsize = 10 + sha256HashChan chan hash.Hash + // sha256Hash hash.Hash = sha256.New() +) + +// SumSHA256 sum sha256 +func SumSHA256(b []byte) []byte { + sha256Hash := <-sha256HashChan + sha256Hash.Reset() + sha256Hash.Write(b) + sum := sha256Hash.Sum(nil) + sha256HashChan <- sha256Hash + return sum[:] +} + +/* +Entropy pool needs +- state (an array of bytes) +- a compression function (two 256 bit blocks to single block) +- a mixing function across the pool + +- Xor is safe, as it cannot make value less random +-- apply compression function, then xor with current value +-- + +*/ + +// EntropyPool entropy pool +type EntropyPool struct { + Ent [32]byte //256 bit accumulator + lock sync.Mutex +} + +// Mix256 mixes in 256 bits, outputs 256 bits +func (ep *EntropyPool) Mix256(in []byte) (out []byte) { + + //hash input + val1 := SumSHA256(in) + //return value + ep.lock.Lock() + val2 := SumSHA256(append(val1, ep.Ent[:]...)) + //next ent value + val3 := SumSHA256(append(val1, val2...)) + + for i := 0; i < 32; i++ { + ep.Ent[i] = val3[i] + val3[i] = 0x00 + } + ep.lock.Unlock() + + return val2 +} + +//Mix take in N bytes, salts, return N +func (ep *EntropyPool) Mix(in []byte) []byte { + length := len(in) - len(in)%32 + 32 + buff := make([]byte, length, length) + for i := 0; i < len(in); i++ { + buff[i] = in[i] + } + iterations := (len(in) / 32) + 1 + for i := 0; i < iterations; i++ { + tmp := ep.Mix256(buff[32*i : 32+32*i]) //32 byte slice + for j := 0; j < 32; j++ { + buff[i*32+j] = tmp[j] + } + } + return buff[:len(in)] +} + +/* +Note: + +- On windows cryto/rand uses CrytoGenRandom which uses RC4 which is insecure +- Android random number generator is known to be insecure. +- Linux uses /dev/urandom , which is thought to be secure and uses entropy pool + +Therefore the output is salted. +*/ + +/* +Note: + +Should allow pseudo-random mode for repeatability for certain types of tests + +*/ + +//var _rand *mrand.Rand //pseudorandom number generator +var _ent EntropyPool + +//seed pseudo random number generator with +// hash of system time in nano seconds +// hash of system environmental variables +// hash of process id +func init() { + seed1 := []byte(strconv.FormatUint(uint64(time.Now().UnixNano()), 16)) + seed2 := []byte(strings.Join(os.Environ(), "")) + seed3 := []byte(strconv.FormatUint(uint64(os.Getpid()), 16)) + + seed4 := make([]byte, 256) + _, err := io.ReadFull(crand.Reader, seed4) //system secure random number generator + if err != nil { + log.Panic(err) + } + + // init the hash reuse pool + sha256HashChan = make(chan hash.Hash, poolsize) + for i := 0; i < poolsize; i++ { + sha256HashChan <- sha256.New() + } + + //mrand.Rand_rand = mrand.New(mrand.NewSource(int64(time.Now().UnixNano()))) //pseudo random + //seed entropy pool + _ent.Mix256(seed1) + _ent.Mix256(seed2) + _ent.Mix256(seed3) + _ent.Mix256(seed4) +} + +// RandByte Secure Random number generator for forwards security +// On Unix-like systems, Reader reads from /dev/urandom. +// On Windows systems, Reader uses the CryptGenRandom API. +// Pseudo-random sequence, seeded from program start time, environmental variables, +// and process id is mixed in for forward security. Future version should use entropy pool +func RandByte(n int) []byte { + buff := make([]byte, n) + _, err := io.ReadFull(crand.Reader, buff) //system secure random number generator + if err != nil { + log.Panic(err) + } + + //XORing in sequence, cannot reduce security (even if sequence is bad/known/non-random) + buff2 := _ent.Mix(buff) + for i := 0; i < n; i++ { + buff[i] ^= buff2[i] + } + return buff +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_test.go new file mode 100755 index 0000000..9698f79 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256_test.go @@ -0,0 +1,661 @@ +package secp256k1 + +import ( + "bytes" + "encoding/hex" + "fmt" + "log" + "math/rand" + "testing" +) + +const TESTS = 1 //10000 // how many tests +const SigSize = 65 //64+1 + +func Test_Secp256_00(t *testing.T) { + + nonce := RandByte(32) //going to get bitcoins stolen! + + if len(nonce) != 32 { + t.Fatal() + } + +} + +//test agreement for highest bit test +func Test_BitTwiddle(t *testing.T) { + var b byte + for i := 0; i < 512; i++ { + bool1 := ((b >> 7) == 1) + bool2 := ((b & 0x80) == 0x80) + if bool1 != bool2 { + t.Fatal() + } + b++ + } +} + +//tests for Malleability +//highest bit of S must be 0; 32nd byte +func CompactSigTest(sig []byte) { + b := int(sig[32]) + if b < 0 { + log.Panic() + } + if ((b >> 7) == 1) != ((b & 0x80) == 0x80) { + log.Panicf("b= %v b2= %v \n", b, b>>7) + } + if (b & 0x80) == 0x80 { + log.Panicf("b= %v b2= %v \n", b, b&0x80) + } +} + +//test pubkey/private generation +func Test_Secp256_01(t *testing.T) { + pubkey, seckey := GenerateKeyPair() + if VerifySeckey(seckey) != 1 { + t.Fatal() + } + if VerifyPubkey(pubkey) != 1 { + t.Fatal() + } +} + +// test compressed pubkey from private key +func Test_PubkeyFromSeckey(t *testing.T) { + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, _ := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + desiredPubKey, _ := hex.DecodeString(`03fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef1`) + if pubkey := PubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +// test uncompressed pubkey from private key +func Test_UncompressedPubkeyFromSeckey(t *testing.T) { + // http://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html + privkey, _ := hex.DecodeString(`f19c523315891e6e15ae0608a35eec2e00ebd6d1984cf167f46336dabd9b2de4`) + desiredPubKey, _ := hex.DecodeString(`04fe43d0c2c3daab30f9472beb5b767be020b81c7cc940ed7a7e910f0c1d9feef10fe85eb3ce193405c2dd8453b7aeb6c1752361efdbf4f52ea8bf8f304aab37ab`) + if pubkey := UncompressedPubkeyFromSeckey(privkey); pubkey == nil { + t.Fatal() + } else if !bytes.Equal(pubkey, desiredPubKey) { + t.Fatal() + } +} + +//returns random pubkey, seckey, hash and signature +func RandX() ([]byte, []byte, []byte, []byte) { + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + return pubkey, seckey, msg, sig +} + +func Test_SignatureVerifyPubkey(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if VerifyPubkey(pubkey1) == 0 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if bytes.Equal(pubkey1, pubkey2) == false { + t.Fatal("Recovered pubkey does not match") + } +} + +func Test_verify_functions(t *testing.T) { + pubkey, seckey, hash, sig := RandX() + if VerifySeckey(seckey) == 0 { + t.Fail() + } + if VerifyPubkey(pubkey) == 0 { + t.Fail() + } + if VerifySignature(hash, sig, pubkey) == 0 { + t.Fail() + } + _ = sig +} + +func Test_SignatureVerifySecKey(t *testing.T) { + pubkey, seckey := GenerateKeyPair() + if VerifySeckey(seckey) == 0 { + t.Fail() + } + if VerifyPubkey(pubkey) == 0 { + t.Fail() + } +} + +//test size of messages +func Test_Secp256_02s(t *testing.T) { + pubkey, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + CompactSigTest(sig) + if sig == nil { + t.Fatal("Signature nil") + } + if len(pubkey) != 33 { + t.Fail() + } + if len(seckey) != 32 { + t.Fail() + } + if len(sig) != 64+1 { + t.Fail() + } + if int(sig[64]) > 4 { + t.Fail() + } //should be 0 to 4 +} + +//test signing message +func Test_Secp256_02(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + if sig == nil { + t.Fatal("Signature nil") + } + + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fatal("Recovered pubkey invalid") + } + if bytes.Equal(pubkey1, pubkey2) == false { + t.Fatal("Recovered pubkey does not match") + } + + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } +} + +//test pubkey recovery +func Test_Secp256_02a(t *testing.T) { + pubkey1, seckey1 := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey1) + + if sig == nil { + t.Fatal("Signature nil") + } + ret := VerifySignature(msg, sig, pubkey1) + if ret != 1 { + t.Fatal("Signature invalid") + } + + pubkey2 := RecoverPubkey(msg, sig) + if len(pubkey1) != len(pubkey2) { + t.Fatal() + } + for i := range pubkey1 { + if pubkey1[i] != pubkey2[i] { + t.Fatal() + } + } + if bytes.Equal(pubkey1, pubkey2) == false { + t.Fatal() + } +} + +//test random messages for the same pub/private key +func Test_Secp256_03(t *testing.T) { + _, seckey := GenerateKeyPair() + for i := 0; i < TESTS; i++ { + msg := RandByte(32) + sig := Sign(msg, seckey) + CompactSigTest(sig) + + sig[len(sig)-1] %= 4 + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + } +} + +//test random messages for different pub/private keys +func Test_Secp256_04(t *testing.T) { + for i := 0; i < TESTS; i++ { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + CompactSigTest(sig) + + if sig[len(sig)-1] >= 4 { + t.Fail() + } + pubkey2 := RecoverPubkey(msg, sig) + if pubkey2 == nil { + t.Fail() + } + if bytes.Equal(pubkey1, pubkey2) == false { + t.Fail() + } + } +} + +//test random signatures against fixed messages; should fail + +//crashes: +// -SIPA look at this + +func randSig() []byte { + sig := RandByte(65) + sig[32] &= 0x70 + sig[64] %= 4 + return sig +} + +func Test_Secp256_06a_alt0(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + if sig == nil { + t.Fail() + } + if len(sig) != 65 { + t.Fail() + } + for i := 0; i < TESTS; i++ { + sig = randSig() + pubkey2 := RecoverPubkey(msg, sig) + + if bytes.Equal(pubkey1, pubkey2) == true { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } +} + +//test random messages against valid signature: should fail + +func Test_Secp256_06b(t *testing.T) { + pubkey1, seckey := GenerateKeyPair() + msg := RandByte(32) + sig := Sign(msg, seckey) + + failCount := 0 + for i := 0; i < TESTS; i++ { + msg = RandByte(32) + pubkey2 := RecoverPubkey(msg, sig) + if bytes.Equal(pubkey1, pubkey2) == true { + t.Fail() + } + + if pubkey2 != nil && VerifySignature(msg, sig, pubkey2) != 1 { + t.Fail() + } + + if VerifySignature(msg, sig, pubkey1) == 1 { + t.Fail() + } + } + if failCount != 0 { + fmt.Printf("ERROR: Accepted signature for %v of %v random messages\n", failCount, TESTS) + } +} + +/* + Deterministic Keypair Tests +*/ + +func Test_Deterministic_Keypairs_00(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(64) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if bytes.Equal(pub1, pub2) == false { + t.Fail() + } + if bytes.Equal(sec1, sec2) == false { + t.Fail() + } + } +} + +func Test_Deterministic_Keypairs_01(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if bytes.Equal(pub1, pub2) == false { + t.Fail() + } + if bytes.Equal(sec1, sec2) == false { + t.Fail() + } + } +} + +func Test_Deterministic_Keypairs_02(t *testing.T) { + for i := 0; i < 64; i++ { + seed := RandByte(32) + _, pub1, sec1 := DeterministicKeyPairIterator(seed) + pub2, sec2 := GenerateDeterministicKeyPair(seed) + + if bytes.Equal(pub1, pub2) == false { + t.Fail() + } + if bytes.Equal(sec1, sec2) == false { + t.Fail() + } + } +} + +func Decode(str string) []byte { + byt, err := hex.DecodeString(str) + if err != nil { + log.Panic() + } + return byt +} + +func Test_Deterministic_Keypairs_03(t *testing.T) { + + //test vectors: seed, seckey + var testArray = []string{ + "tQ93w5Aqcunm9SGUfnmF4fJv", "9b8c3e36adce64dedc80d6dfe51ff1742cc1d755bbad457ac01177c5a18a789f", + "DC7qdQQtbWSSaekXnFmvQgse", "d2deaf4a9ff7a5111fe1d429d6976cbde78811fdd075371a2a4449bb0f4d8bf9", + "X8EkuUZC7Td7PAXeS7Duc7vR", "cad79b6dcf7bd21891cbe20a51c57d59689ae6e3dc482cd6ec22898ac00cd86b", + "tVqPYHHNVPRWyEed62v7f23u", "2a386e94e9ffaa409517cbed81b9b2d4e1c5fb4afe3cbd67ce8aba11af0b02fa", + "kCy4R57HDfLqF3pVhBWxuMcg", "26a7c6d8809c476a56f7455209f58b5ff3f16435fcf208ff2931ece60067f305", + "j8bjv86ZNjKqzafR6mtSUVCE", "ea5c0f8c9f091a70bf38327adb9b2428a9293e7a7a75119920d759ecfa03a995", + "qShryAzVY8EtsuD3dsAc7qnG", "331206176509bcae31c881dc51e90a4e82ec33cd7208a5fb4171ed56602017fa", + "5FGG7ZBa8wVMBJkmzpXj5ESX", "4ea2ad82e7730d30c0c21d01a328485a0cf5543e095139ba613929be7739b52c", + "f46TZG4xJHXUGWx8ekbNqa9F", "dcddd403d3534c4ef5703cc07a771c107ed49b7e0643c6a2985a96149db26108", + "XkZdQJ5LT96wshN8JBH8rvEt", "3e276219081f072dff5400ca29a9346421eaaf3c419ff1474ac1c81ad8a9d6e1", + "GFDqXU4zYymhJJ9UGqRgS8ty", "95be4163085b571e725edeffa83fff8e7a7db3c1ccab19d0f3c6e105859b5e10", + "tmwZksH2XyvuamnddYxyJ5Lp", "2666dd54e469df56c02e82dffb4d3ea067daafe72c54dc2b4f08c4fb3a7b7e42", + "EuqZFsbAV5amTzkhgAMgjr7W", "40c325c01f2e4087fcc97fcdbea6c35c88a12259ebf1bce0b14a4d77f075abbf", + "TW6j8rMffZfmhyDEt2JUCrLB", "e676e0685c5d1afd43ad823b83db5c6100135c35485146276ee0b0004bd6689e", + "8rvkBnygfhWP8kjX9aXq68CY", "21450a646eed0d4aa50a1736e6c9bf99fff006a470aab813a2eff3ee4d460ae4", + "phyRfPDuf9JMRFaWdGh7NXPX", "ca7bc04196c504d0e815e125f7f1e086c8ae8c10d5e9df984aeab4b41bf9e398", + } + + for i := 0; i < len(testArray)/2; i++ { + seed := []byte(testArray[2*i+0]) + sec1 := Decode(testArray[2*i+1]) + + _, sec2 := GenerateDeterministicKeyPair(seed) + if bytes.Equal(sec1, sec2) == false { + t.Fail() + } + } +} + +func Test_DeterministicWallets1(t *testing.T) { + + var testArray = []string{ + "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", "94dd1a9de9ffd57b5516b8a7f090da67f142f7d22356fa5d1b894ee4d4fba95b", + "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", "82fba4cc2bc29eef122f116f45d01d82ff488d7ee713f8a95c162a64097239e0", + "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", "44c059496aac871ac168bb6889b9dd3decdb9e1fa082442a95fcbca982643425", + "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", "d709ceb1a6fb906de506ea091c844ca37c65e52778b8d257d1dd3a942ab367fb", + "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", "5fe4986fa964773041e119d2b6549acb392b2277a72232af75cbfb62c357c1a7", + "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", "f784abc2e7f11ee84b4adb72ea4730a6aabe27b09604c8e2b792d8a1a31881ac", + "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", "d495174b8d3f875226b9b939121ec53f9383bd560d34aa5ca3ac6b257512adf4", + "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", "1fdc9fbfc6991b9416b3a8385c9942e2db59009aeb2d8de349b73d9f1d389374", + "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", "c87c85a6f482964db7f8c31720981925b1e357a9fdfcc585bc2164fdef1f54d0", + "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", "e2767d788d1c5620f3ef21d57f2d64559ab203c044f0a5f0730b21984e77019c", + "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", "3fcb80eb1d5b91c491408447ac4e221fcb2254c861adbb5a178337c2750b0846", + "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", "5577d4be25f1b44487140a626c8aeca2a77507a1fc4fd466dd3a82234abb6785", + "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", "c07275582d0681eb07c7b51f0bca0c48c056d571b7b83d84980ab40ac7d7d720", + "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", "f10e2b7675dfa557d9e3188469f12d3e953c2d46dce006cd177b6ae7f465cfc0", + "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", "0bcbebb39d8fe1cb3eab952c6f701656c234e462b945e2f7d4be2c80b8f2d974", + "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", "88ba6f6c66fc0ef01c938569c2dd1f05475cb56444f4582d06828e77d54ffbe6", + } + + for i := 0; i < len(testArray)/2; i++ { + seed := Decode(testArray[2*i+0]) //input + seckey1 := Decode(testArray[2*i+1]) //target + _, _, seckey2 := DeterministicKeyPairIterator(seed) //output + if bytes.Equal(seckey1, seckey2) == false { + t.Fail() + } + } +} + +func Test_Secp256k1_Hash(t *testing.T) { + + var testArray = []string{ + "90c56f5b8d78a46fb4cddf6fd9c6d88d6d2d7b0ec35917c7dac12c03b04e444e", "a70c36286be722d8111e69e910ce4490005bbf9135b0ce8e7a59f84eee24b88b", + "a3b08ccf8cbae4955c02f223be1f97d2bb41d92b7f0c516eb8467a17da1e6057", "e9db072fe5817325504174253a056be7b53b512f1e588f576f1f5a82cdcad302", + "7048eb8fa93cec992b93dc8e93c5543be34aad05239d4c036cf9e587bbcf7654", "5e9133e83c4add2b0420d485e1dcda5c00e283c6509388ab8ceb583b0485c13b", + "6d25375591bbfce7f601fc5eb40e4f3dde2e453dc4bf31595d8ec29e4370cd80", "8d5579cd702c06c40fb98e1d55121ea0d29f3a6c42f5582b902ac243f29b571a", + "7214b4c09f584c5ddff971d469df130b9a3c03e0277e92be159279de39462120", "3a4e8c72921099a0e6a4e7f979df4c8bced63063097835cdfd5ee94548c9c41a", + "b13e78392d5446ae304b5fc9d45b85f26996982b2c0c86138afdac8d2ea9016e", "462efa1bf4f639ffaedb170d6fb8ba363efcb1bdf0c5aef0c75afb59806b8053", + "9403bff4240a5999e17e0ab4a645d6942c3a7147c7834e092e461a4580249e6e", "68dd702ea7c7352632876e9dc2333142fce857a542726e402bb480cad364f260", + "2665312a3e3628f4df0b9bc6334f530608a9bcdd4d1eef174ecda99f51a6db94", "5db72c31d575c332e60f890c7e68d59bd3d0ac53a832e06e821d819476e1f010", + "6cb37532c80765b7c07698502a49d69351036f57a45a5143e33c57c236d841ca", "0deb20ec503b4c678213979fd98018c56f24e9c1ec99af3cd84b43c161a9bb5c", + "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c", "36f3ede761aa683813013ffa84e3738b870ce7605e0a958ed4ffb540cd3ea504", + "66d1945ceb6ef8014b1b6703cb624f058913e722f15d03225be27cb9d8aabe4a", "6bcb4819a96508efa7e32ee52b0227ccf5fbe5539687aae931677b24f6d0bbbd", + "22c7623bf0e850538329e3e6d9a6f9b1235350824a3feaad2580b7a853550deb", "8bb257a1a17fd2233935b33441d216551d5ff1553d02e4013e03f14962615c16", + "a5eebe3469d68c8922a1a8b5a0a2b55293b7ff424240c16feb9f51727f734516", "d6b780983a63a3e4bcf643ee68b686421079c835a99eeba6962fe41bb355f8da", + "479ec3b589b14aa7290b48c2e64072e4e5b15ce395d2072a5a18b0a2cf35f3fd", "39c5f108e7017e085fe90acfd719420740e57768ac14c94cb020d87e36d06752", + "63952334b731ec91d88c54614925576f82e3610d009657368fc866e7b1efbe73", "79f654976732106c0e4a97ab3b6d16f343a05ebfcc2e1d679d69d396e6162a77", + "256472ee754ef6af096340ab1e161f58e85fb0cc7ae6e6866b9359a1657fa6c1", "387883b86e2acc153aa334518cea48c0c481b573ccaacf17c575623c392f78b2", + } + + for i := 0; i < len(testArray)/2; i++ { + hash1 := Decode(testArray[2*i+0]) //input + hash2 := Decode(testArray[2*i+1]) //target + hash3 := Secp256k1Hash(hash1) //output + if bytes.Equal(hash2, hash3) == false { + t.Fail() + } + } +} + +func Test_Secp256k1_Equal(t *testing.T) { + + for i := 0; i < 64; i++ { + seed := RandByte(128) + + hash1 := Secp256k1Hash(seed) + hash2, _, _ := DeterministicKeyPairIterator(seed) + + if bytes.Equal(hash1, hash2) == false { + t.Fail() + } + } +} + +func Test_DeterministicWalletGeneration(t *testing.T) { + in := "8654a32fa120bfdb7ca02c487469070eba4b5a81b03763a2185fdf5afd756f3c" + secOut := "10ba0325f1b8633ca463542950b5cd5f97753a9829ba23477c584e7aee9cfbd5" + pubOut := "0249964ac7e3fe1b2c182a2f10abe031784e374cc0c665a63bc76cc009a05bc7c6" + + var seed = []byte(in) + var pubkey []byte + var seckey []byte + + for i := 0; i < 1024; i++ { + seed, pubkey, seckey = DeterministicKeyPairIterator(seed) + } + + if bytes.Equal(seckey, Decode(secOut)) == false { + t.Fail() + } + + if bytes.Equal(pubkey, Decode(pubOut)) == false { + t.Fail() + } +} + +func Test_ECDH(t *testing.T) { + + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if bytes.Equal(puba, pubb) == false { + t.Fail() + } + +} + +func Test_ECDH2(t *testing.T) { + + for i := 0; i < 16*1024; i++ { + + pubkey1, seckey1 := GenerateKeyPair() + pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if bytes.Equal(puba, pubb) == false { + t.Fail() + } + } +} + +/* +seed = ee78b2fb5bef47aaab1abf54106b3b022ed3d68fdd24b5cfdd6e639e1c7baa6f +seckey = 929c5f23a17115199e61b2c4c38fea06f763270a0d1189fbc6a46ddac05081fa +pubkey1 = 028a4d9f32e7bd25befd0afa9e73755f35ae2f7012dfc7c000252f2afba2589af2 +pubkey2 = 028a4d9f32e7bd25befd0afa9e73755f35ae2f7012dfc80000252f2afba2589af2 +key_wif = L28hjib16NuBT4L1gK4DgzKjjxaCDggeZpXFy93MdZVz9fTZKwiE +btc_addr1 = 14mvZw1wC8nKtycrTHu6NRTfWHuNVCpRgL +btc_addr2 = 1HuwS7qARGMgNB7zao1FPmqiiZ92tsJGpX +deterministic pubkeys do not match +seed = 0e86692d755fd39a51acf6c935bdf425a6aad03a7914867e3f6db27371c966b4 +seckey = c9d016b26102fb309a73e644f6be308614a1b8f6f46f902c906ffaf0993ee63c +pubkey1 = 03e86d62256dd05c2852c05a6b11d423f278288abeab490000b93d387de45a2f73 +pubkey2 = 03e86d62256dd05c2852c05a6b11d423f278288abeab494000b93d387de45a2f73 +key_wif = L3z1TTmgddKUm2Em22zKwLXGZ7jfwXLN5GxebpgH5iohaRJSm98D +btc_addr1 = 1CcrzXvK34Cf4jzTko5uhCwbsC6e6K4rHw +btc_addr2 = 1GtBH7dcZnh69Anqe8sHXKSJ9Dk4jXGHyp +*/ + +func Test_Abnormal_Keys(t *testing.T) { + + for i := 0; i < 32*1024; i++ { + + seed := RandByte(32) + + pubkey1, seckey1 := generateDeterministicKeyPair(seed) + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + seedHex := hex.EncodeToString(seed) + seckeyHex := hex.EncodeToString(seckey1) + log.Printf("seed= %s", seedHex) + log.Printf("seckey= %s", seckeyHex) + t.Errorf("GenerateKeyPair, generates key that fails validation, run=%d", i) + } + } +} + +//problem seckeys +var _testSeckey = []string{ + "08efb79385c9a8b0d1c6f5f6511be0c6f6c2902963d874a3a4bacc18802528d3", + "78298d9ecdc0640c9ae6883201a53f4518055442642024d23c45858f45d0c3e6", + "04e04fe65bfa6ded50a12769a3bd83d7351b2dbff08c9bac14662b23a3294b9e", + "2f5141f1b75747996c5de77c911dae062d16ae48799052c04ead20ccd5afa113", +} + +//test known bad keys +func Test_Abnormal_Keys2(t *testing.T) { + + for i := 0; i < len(_testSeckey); i++ { + + seckey1, _ := hex.DecodeString(_testSeckey[i]) + pubkey1 := PubkeyFromSeckey(seckey1) + if pubkey1 == nil { + t.Fail() + } + + if seckey1 == nil { + t.Fail() + } + + if pubkey1 == nil { + t.Fail() + } + + if VerifyPubkey(pubkey1) != 1 { + t.Errorf("generates key that fails validation") + } + } +} + +//ECDH test +func Test_Abnormal_Keys3(t *testing.T) { + + for i := 0; i < len(_testSeckey); i++ { + + seckey1, _ := hex.DecodeString(_testSeckey[i]) + pubkey1 := PubkeyFromSeckey(seckey1) + + seckey2, _ := hex.DecodeString(_testSeckey[rand.Int()%len(_testSeckey)]) + pubkey2 := PubkeyFromSeckey(seckey2) + + if pubkey1 == nil { + t.Errorf("pubkey1 nil") + } + + if pubkey2 == nil { + t.Errorf("pubkey2 nil") + } + //pubkey1, seckey1 := GenerateKeyPair() + //pubkey2, seckey2 := GenerateKeyPair() + + puba := ECDH(pubkey1, seckey2) + pubb := ECDH(pubkey2, seckey1) + + if puba == nil { + t.Fail() + } + + if pubb == nil { + t.Fail() + } + + if bytes.Equal(puba, pubb) == false { + t.Errorf("recovered do not match") + } + } + +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING new file mode 100755 index 0000000..a7fd60b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/COPYING @@ -0,0 +1,4 @@ +This single package (secp256k1) is distributed with the same license as +the original C implementation by sipa: + + * https://github.com/bitcoin/secp256k1/blob/master/COPYING diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md new file mode 100755 index 0000000..f0466f4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/README.md @@ -0,0 +1,5 @@ +Implementation of this package has been based on source code created by Pieter Wuille. + + * https://github.com/bitcoin/secp256k1 + +Modified by HaltingState \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go new file mode 100755 index 0000000..790fce7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec.go @@ -0,0 +1,329 @@ +package secp256k1go + +import ( + //"encoding/hex" + "bytes" + "log" +) + +// func ecdsaVerify(pubkey, sig, msg []byte) int { +// var m Number +// var s Signature +// m.SetBytes(msg) + +// log.Println("pubkey len is", len(pubkey)) + +// var q XY +// if !q.ParsePubkey(pubkey) { +// return -1 +// } + +// //if s.ParseBytes(sig) < 0 { +// // return -2 +// //} +// if len(pubkey) != 32 { +// return -2 +// } +// if len(sig) != 64 { +// return -3 +// } + +// if !s.Verify(&q, &m) { +// return 0 +// } +// return 1 +// } + +// // Verify verifies ecdsa +// func Verify(k, s, m []byte) bool { +// return ecdsaVerify(k, s, m) == 1 +// } + +// DecompressPoint decompresses point +func DecompressPoint(X []byte, off bool, Y []byte) { + var rx, ry, c, x2, x3 Field + rx.SetB32(X) + rx.Sqr(&x2) + rx.Mul(&x3, &x2) + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&ry) + ry.Normalize() + if ry.IsOdd() != off { + ry.Negate(&ry, 1) + } + ry.Normalize() + ry.GetB32(Y) + return +} + +//TODO: change signature to []byte type +/* +func RecoverPublicKey2(sig Signature, h []byte, recid int, pubkey *XY) int { + //var sig Signature + var msg Number + + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + if sig.R.Sign() == 0 { + return -10 + } + if sig.R.Sign() <= 0 { + return -11 + } + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return -12 + } + return -1 + } + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return -2 + } + + msg.SetBytes(h) + if !sig.Recover(pubkey, &msg, recid) { + return -3 + } + return 1 +} +*/ +//TODO: deprecate +/* +func RecoverPublicKey(r, s, h []byte, recid int, pubkey *XY) bool { + var sig Signature + var msg Number + sig.R.SetBytes(r) + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return false + } + sig.S.SetBytes(s) + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return false + } + msg.SetBytes(h) + if !sig.Recover(pubkey, &msg, recid) { + return false + } + return true +} +*/ + +// RecoverPublicKey nil on error +// returns error code +func RecoverPublicKey(sigByte []byte, h []byte, recid int) ([]byte, int) { + + var pubkey XY + + if len(sigByte) != 64 { + log.Panic("must pass in 64 byte pubkey") + } + + var sig Signature + sig.ParseBytes(sigByte[0:64]) + + //var sig Signature + var msg Number + + if sig.R.Sign() <= 0 || sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + if sig.R.Sign() == 0 { + return nil, -1 + } + if sig.R.Sign() <= 0 { + return nil, -2 + } + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -3 + } + return nil, -4 + } + if sig.S.Sign() <= 0 || sig.S.Cmp(&TheCurve.Order.Int) >= 0 { + return nil, -5 + } + + msg.SetBytes(h) + if !sig.Recover(&pubkey, &msg, recid) { + return nil, -6 + } + + return pubkey.Bytes(), 1 +} + +// Multiply standard EC multiplacation k(xy) +// xy - is the standarized public key format (33 or 65 bytes long) +// out - should be the buffer for 33 bytes (1st byte will be set to either 02 or 03) +// TODO: change out to return type +func Multiply(xy, k []byte) []byte { + var pk XY + var xyz XYZ + var na, nzero Number + if !pk.ParsePubkey(xy) { + return nil + } + xyz.SetXY(&pk) + na.SetBytes(k) + xyz.ECmult(&xyz, &na, &nzero) + pk.SetXYZ(&xyz) + + if pk.IsValid() == false { + log.Panic() + } + return pk.GetPublicKey() +} + +// Multiply k by G +// returns public key +// return nil on error, but never returns nil +// 33 bytes out + +/* +func BaseMultiply2(k []byte) []byte { + var r XYZ + var n Number + var pk XY + n.SetBytes(k) + ECmultGen(&r, &n) + pk.SetXYZ(&r) + if pk.IsValid() == false { + log.Panic() + } + + return pk.GetPublicKey() +} +*/ + +//test assumptions +func _pubkeyTest(pk XY) { + + if pk.IsValid() == false { + log.Panic("IMPOSSIBLE3: pubkey invalid") + } + var pk2 XY + retb := pk2.ParsePubkey(pk.Bytes()) + if retb == false { + log.Panic("IMPOSSIBLE2: parse failed") + } + if pk2.IsValid() == false { + log.Panic("IMPOSSIBLE3: parse failed non valid key") + } + if PubkeyIsValid(pk2.Bytes()) != 1 { + log.Panic("IMPOSSIBLE4: pubkey failed") + } +} + +// BaseMultiply base multiply +func BaseMultiply(k []byte) []byte { + var r XYZ + var n Number + var pk XY + n.SetBytes(k) + ECmultGen(&r, &n) + pk.SetXYZ(&r) + if pk.IsValid() == false { + log.Panic() //should not occur + } + + _pubkeyTest(pk) + + return pk.Bytes() +} + +// BaseMultiplyAdd out = G*k + xy +// TODO: switch to returning output as []byte +// nil on error +// 33 byte out +func BaseMultiplyAdd(xy, k []byte) []byte { + var r XYZ + var n Number + var pk XY + if !pk.ParsePubkey(xy) { + return nil + } + n.SetBytes(k) + ECmultGen(&r, &n) + r.AddXY(&r, &pk) + pk.SetXYZ(&r) + + _pubkeyTest(pk) + return pk.Bytes() +} + +// GeneratePublicKey returns nil on failure +//crash rather than fail +func GeneratePublicKey(k []byte) []byte { + + //log.Panic() + if len(k) != 32 { + log.Panic() + } + var r XYZ + var n Number + var pk XY + + //must not be zero + //must not be negative + //must be less than order of curve + n.SetBytes(k) + if n.Sign() <= 0 || n.Cmp(&TheCurve.Order.Int) >= 0 { + log.Panic("only call for valid seckey, check that seckey is valid first") + return nil + } + ECmultGen(&r, &n) + pk.SetXYZ(&r) + if pk.IsValid() == false { + log.Panic() //should not occur + } + _pubkeyTest(pk) + return pk.Bytes() +} + +// SeckeyIsValid 1 on success +// must not be zero +// must not be negative +// must be less than order of curve +func SeckeyIsValid(seckey []byte) int { + if len(seckey) != 32 { + log.Panic() + } + var n Number + n.SetBytes(seckey) + //must not be zero + //must not be negative + //must be less than order of curve + if n.Sign() <= 0 { + return -1 + } + if n.Cmp(&TheCurve.Order.Int) >= 0 { + return -2 + } + return 1 +} + +// PubkeyIsValid returns 1 on success +func PubkeyIsValid(pubkey []byte) int { + if len(pubkey) != 33 { + log.Panic() //do not permit invalid length inputs + return -2 + } + var pubTest XY + err := pubTest.ParsePubkey(pubkey) + if err == false { + //log.Panic("PubkeyIsValid, ERROR: pubkey parse fail, bad pubkey from private key") + return -1 + } + if bytes.Equal(pubTest.Bytes(), pubkey) == false { + log.Panic("pubkey parses but serialize/deserialize roundtrip fails") + } + //this fails + //if pub_test.IsValid() == false { + // return -2 + //} + return 1 +} + +/* +Note: +- choose random private key +- generate public key +- call "IsValid()" on the public key + + +*/ diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go new file mode 100755 index 0000000..109694a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/ec_test.go @@ -0,0 +1,225 @@ +package secp256k1go + +import ( + "testing" +) + +//var ta = [][3]string{ +// // [0]-pubScr, [1]-sigScript, [2]-unsignedTx +// { +// "040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d", +// "3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01", +// "3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6", +// }, +// { +// "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0311db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5c", +// "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901", +// "7a05c6145f10101e9d6325494245adf1297d80f8f38d4d576d57cdba220bcb19", +// }, +// { +// "0428f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef1550471271692970342db8e3f9c6f0123fab9414f7865d2db90c24824da775f00e228b791fd", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "0328f42723f81c70664e200088437282d0e11ae0d4ae139f88bdeef15504712716", +// "3045022100d557da5d9bf886e0c3f98fd6d5d337487cd01d5b887498679a57e3d32bd5d0af0220153217b63a75c3145b14f58c64901675fe28dba2352c2fa9f2a1579c74a2de1701", +// "c22de395adbb0720941e009e8a4e488791b2e428af775432ed94d2c7ec8e421a", +// }, +// { +// "041f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edcd848bd2c44a86a7772442095c7003248cc619bfec3ddb65130b0937f8311c787", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "031f2a00036b3cbd1abe71dca54d406a1e9dd5d376bf125bb109726ff8f2662edc", +// "3045022100ec6eb6b2aa0580c8e75e8e316a78942c70f46dd175b23b704c0330ab34a86a34022067a73509df89072095a16dbf350cc5f1ca5906404a9275ebed8a4ba219627d6701", +// "7c8e7c2cb887682ed04dc82c9121e16f6d669ea3d57a2756785c5863d05d2e6a", +// }, +// { +// "04ee90bfdd4e07eb1cfe9c6342479ca26c0827f84bfe1ab39e32fc3e94a0fe00e6f7d8cd895704e974978766dd0f9fad3c97b1a0f23684e93b400cc9022b7ae532", +// "3045022100fe1f6e2c2c2cbc916f9f9d16497df2f66a4834e5582d6da0ee0474731c4a27580220682bad9359cd946dc97bb07ea8fad48a36f9b61186d47c6798ccce7ba20cc22701", +// "baff983e6dfb1052918f982090aa932f56d9301d1de9a726d2e85d5f6bb75464", +// }, +//} + +// func TestVerify1(t *testing.T) { +// for i := range ta { +// pkey, _ := hex.DecodeString(ta[i][0]) +// sign, _ := hex.DecodeString(ta[i][1]) +// hasz, _ := hex.DecodeString(ta[i][2]) + +// res := ecdsaVerify(pkey, sign, hasz) +// if res != 1 { +// log.Println("error code", res) +// t.Fatal("Verify failed at", i) +// } + +// hasz[0]++ +// res = ecdsaVerify(pkey, sign, hasz) +// if res != 0 { +// t.Error("Verify not failed while it should", i) +// } +// res = ecdsaVerify(pkey[:1], sign, hasz) +// if res >= 0 { +// t.Error("Negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign[:1], hasz) +// if res >= 0 { +// t.Error("Yet negative result expected", res, i) +// } +// res = ecdsaVerify(pkey, sign, hasz[:1]) +// if res != 0 { +// t.Error("Zero expected", res, i) +// } +// } +// } + +// func BenchmarkVerifyUncompressed(b *testing.B) { +// key, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(key, sig, msg) +// } +// } + +// func BenchmarkVerifyCompressed(b *testing.B) { +// keyCompr, _ := hex.DecodeString("020eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") +// sig, _ := hex.DecodeString("3045022100fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b1002207d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c01") +// msg, _ := hex.DecodeString("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") +// b.ResetTimer() +// for i := 0; i < b.N; i++ { +// ecdsaVerify(keyCompr, sig, msg) +// } +// } + +func TestECmult(t *testing.T) { + var u1, u2 Number + var pubkeyj, expres, pr XYZ + + pubkeyj.X.SetHex("0EAEBCD1DF2DF853D66CE0E1B0FDA07F67D1CABEFDE98514AAD795B86A6EA66D") + pubkeyj.Y.SetHex("BEB26B67D7A00E2447BAECCC8A4CEF7CD3CAD67376AC1C5785AEEBB4F6441C16") + pubkeyj.Z.SetHex("0000000000000000000000000000000000000000000000000000000000000001") + + u1.SetHex("B618EBA71EC03638693405C75FC1C9ABB1A74471BAAF1A3A8B9005821491C4B4") + u2.SetHex("8554470195DE4678B06EDE9F9286545B51FF2D9AA756CE35A39011783563EA60") + + expres.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + expres.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + expres.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + pubkeyj.ECmult(&pr, &u2, &u1) + if !pr.Equals(&expres) { + t.Error("ECmult failed") + pr.Print("got") + expres.Print("exp") + } +} + +type wnafvec struct { + inp string + w uint + exp []int +} + +func TestWNAF(t *testing.T) { + var wnaf [129]int + var testvcs = []wnafvec{ + { + "3271156f58b59bd7aa542ca6972c1910", winA, + []int{0, 0, 0, 0, -15, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -11, 0, 0, 0, 0, 13, 0, 0, 0, 0, 1, 0, 0, 0, 0, -11, 0, 0, 0, 0, -11, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 11, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 15, 0, 0, 0, 0, 11, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 3}, + }, + { + "0a8a5afcb465a43b8277801311860430", winA, + []int{0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 7, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, -9, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, -13, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 1}, + }, + { + "b1a74471baaf1a3a8b9005821491c4b4", winG, + []int{0, 0, -3795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5959, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11}, + }, + { + "b618eba71ec03638693405c75fc1c9ab", winG, + []int{2475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -4549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -7249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1457}, + }, + } + for idx := range testvcs { + var xxx Number + xxx.SetHex(testvcs[idx].inp) + bits := ecmultWnaf(wnaf[:], &xxx, testvcs[idx].w) + if bits != len(testvcs[idx].exp) { + t.Error("Bad bits at idx", idx) + } + for i := range testvcs[idx].exp { + if wnaf[i] != testvcs[idx].exp[i] { + t.Error("Bad val at idx", idx, i) + } + } + } +} + +func TestPrecompileGej(t *testing.T) { + var exp, a XYZ + + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("122927e4908740d51df1f03dc921c00fef68c542e7f28aa270862619cf971815") + pre := a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } + + a.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + exp.X.SetHex("ce5dcac5e26ab63868ead1440f359aff29d7ffade62abe801bca97b471bcd416") + exp.Y.SetHex("0cc6f63793a207751d507aa4be629f0776441e4873548095bd6d39d34ce8a9d7") + exp.Z.SetHex("49f0fb9f1840e7a58d485c6cc394e597e521bf7d4598be2b367c27326949e507") + pre = a.precomp(winA) + if len(pre) != 8 { + t.Error("Bad result length") + } + if !pre[7].Equals(&exp) { + t.Error("Unexpcted value") + } +} + +func TestMultGen(t *testing.T) { + var nonce Number + var ex, ey, ez Field + var r XYZ + nonce.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + ECmultGen(&r, &nonce) + ex.SetHex("02D1BF36D37ACD68E4DD00DB3A707FD176A37E42F81AEF9386924032D3428FF0") + ey.SetHex("FD52E285D33EC835230EA69F89D9C38673BD5B995716A4063C893AF02F938454") + ez.SetHex("4C6ACE7C8C062A1E046F66FD8E3981DC4E8E844ED856B5415C62047129268C1B") + r.X.Normalize() + r.Y.Normalize() + r.Z.Normalize() + if !ex.Equals(&r.X) { + t.Error("Bad X") + } + if !ey.Equals(&r.Y) { + t.Error("Bad Y") + } + if !ez.Equals(&r.Z) { + t.Error("Bad Y") + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go new file mode 100755 index 0000000..0c99cf6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field.go @@ -0,0 +1,742 @@ +package secp256k1go + +import ( + "encoding/hex" + "fmt" + "math/big" +) + +// Field represents the signature field +type Field struct { + n [10]uint32 +} + +// String returns the hex string of the field +func (fd *Field) String() string { + var tmp [32]byte + b := *fd + b.Normalize() + b.GetB32(tmp[:]) + return hex.EncodeToString(tmp[:]) +} + +// Print shows the hex string of the field +func (fd *Field) Print(lab string) { + fmt.Println(lab+":", fd.String()) +} + +// GetBig returns big int +func (fd *Field) GetBig() (r *big.Int) { + fd.Normalize() + r = new(big.Int) + var tmp [32]byte + fd.GetB32(tmp[:]) + r.SetBytes(tmp[:]) + return +} + +// SetB32 sets +func (fd *Field) SetB32(a []byte) { + fd.n[0] = 0 + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 + var v uint32 + for i := uint(0); i < 32; i++ { + for j := uint(0); j < 4; j++ { + limb := (8*i + 2*j) / 26 + shift := (8*i + 2*j) % 26 + v = (uint32)((a[31-i]>>(2*j))&0x3) << shift + fd.n[limb] |= v + } + } +} + +// SetBytes sets bytes +func (fd *Field) SetBytes(a []byte) { + if len(a) > 32 { + panic("too many bytes to set") + } + if len(a) == 32 { + fd.SetB32(a) + } else { + var buf [32]byte + copy(buf[32-len(a):], a) + fd.SetB32(buf[:]) + } +} + +// SetHex sets field in hex string +func (fd *Field) SetHex(s string) { + d, _ := hex.DecodeString(s) + fd.SetBytes(d) +} + +// IsOdd check if odd +func (fd *Field) IsOdd() bool { + return (fd.n[0] & 1) != 0 +} + +// IsZero check if field is zero +func (fd *Field) IsZero() bool { + return (fd.n[0] == 0 && fd.n[1] == 0 && fd.n[2] == 0 && fd.n[3] == 0 && fd.n[4] == 0 && fd.n[5] == 0 && fd.n[6] == 0 && fd.n[7] == 0 && fd.n[8] == 0 && fd.n[9] == 0) +} + +// SetInt set fields with an int value +func (fd *Field) SetInt(a uint32) { + fd.n[0] = a + fd.n[1] = 0 + fd.n[2] = 0 + fd.n[3] = 0 + fd.n[4] = 0 + fd.n[5] = 0 + fd.n[6] = 0 + fd.n[7] = 0 + fd.n[8] = 0 + fd.n[9] = 0 +} + +// Normalize normalize the field +func (fd *Field) Normalize() { + c := fd.n[0] + t0 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[1] + t1 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[2] + t2 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[3] + t3 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[4] + t4 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[5] + t5 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[6] + t6 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[7] + t7 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[8] + t8 := c & 0x3FFFFFF + c = (c >> 26) + fd.n[9] + t9 := c & 0x03FFFFF + c >>= 22 + + // The following code will not modify the t's if c is initially 0. + d := c*0x3D1 + t0 + t0 = d & 0x3FFFFFF + d = (d >> 26) + t1 + c*0x40 + t1 = d & 0x3FFFFFF + d = (d >> 26) + t2 + t2 = d & 0x3FFFFFF + d = (d >> 26) + t3 + t3 = d & 0x3FFFFFF + d = (d >> 26) + t4 + t4 = d & 0x3FFFFFF + d = (d >> 26) + t5 + t5 = d & 0x3FFFFFF + d = (d >> 26) + t6 + t6 = d & 0x3FFFFFF + d = (d >> 26) + t7 + t7 = d & 0x3FFFFFF + d = (d >> 26) + t8 + t8 = d & 0x3FFFFFF + d = (d >> 26) + t9 + t9 = d & 0x03FFFFF + + // Subtract p if result >= p + low := (uint64(t1) << 26) | uint64(t0) + //mask := uint64(-(int64)((t9 < 0x03FFFFF) | (t8 < 0x3FFFFFF) | (t7 < 0x3FFFFFF) | (t6 < 0x3FFFFFF) | (t5 < 0x3FFFFFF) | (t4 < 0x3FFFFFF) | (t3 < 0x3FFFFFF) | (t2 < 0x3FFFFFF) | (low < 0xFFFFEFFFFFC2F))) + var mask uint64 + if (t9 < 0x03FFFFF) || + (t8 < 0x3FFFFFF) || + (t7 < 0x3FFFFFF) || + (t6 < 0x3FFFFFF) || + (t5 < 0x3FFFFFF) || + (t4 < 0x3FFFFFF) || + (t3 < 0x3FFFFFF) || + (t2 < 0x3FFFFFF) || + (low < 0xFFFFEFFFFFC2F) { + mask = 0xFFFFFFFFFFFFFFFF + } + t9 &= uint32(mask) + t8 &= uint32(mask) + t7 &= uint32(mask) + t6 &= uint32(mask) + t5 &= uint32(mask) + t4 &= uint32(mask) + t3 &= uint32(mask) + t2 &= uint32(mask) + low -= ((mask ^ 0xFFFFFFFFFFFFFFFF) & 0xFFFFEFFFFFC2F) + + // push internal variables back + fd.n[0] = uint32(low) & 0x3FFFFFF + fd.n[1] = uint32(low>>26) & 0x3FFFFFF + fd.n[2] = t2 + fd.n[3] = t3 + fd.n[4] = t4 + fd.n[5] = t5 + fd.n[6] = t6 + fd.n[7] = t7 + fd.n[8] = t8 + fd.n[9] = t9 +} + +// GetB32 get B32, TODO: need further explanation +func (fd *Field) GetB32(r []byte) { + var i, j, c, limb, shift uint32 + for i = 0; i < 32; i++ { + c = 0 + for j = 0; j < 4; j++ { + limb = (8*i + 2*j) / 26 + shift = (8*i + 2*j) % 26 + c |= ((fd.n[limb] >> shift) & 0x3) << (2 * j) + } + r[31-i] = byte(c) + } +} + +// Equals check if field is the same as the given one +func (fd *Field) Equals(b *Field) bool { + return (fd.n[0] == b.n[0] && fd.n[1] == b.n[1] && fd.n[2] == b.n[2] && fd.n[3] == b.n[3] && fd.n[4] == b.n[4] && + fd.n[5] == b.n[5] && fd.n[6] == b.n[6] && fd.n[7] == b.n[7] && fd.n[8] == b.n[8] && fd.n[9] == b.n[9]) +} + +// SetAdd adds value to corresponding fields +func (fd *Field) SetAdd(a *Field) { + fd.n[0] += a.n[0] + fd.n[1] += a.n[1] + fd.n[2] += a.n[2] + fd.n[3] += a.n[3] + fd.n[4] += a.n[4] + fd.n[5] += a.n[5] + fd.n[6] += a.n[6] + fd.n[7] += a.n[7] + fd.n[8] += a.n[8] + fd.n[9] += a.n[9] +} + +// MulInt multiples the fields +func (fd *Field) MulInt(a uint32) { + fd.n[0] *= a + fd.n[1] *= a + fd.n[2] *= a + fd.n[3] *= a + fd.n[4] *= a + fd.n[5] *= a + fd.n[6] *= a + fd.n[7] *= a + fd.n[8] *= a + fd.n[9] *= a +} + +// Negate caculate the negate +func (fd *Field) Negate(r *Field, m uint32) { + r.n[0] = 0x3FFFC2F*(m+1) - fd.n[0] + r.n[1] = 0x3FFFFBF*(m+1) - fd.n[1] + r.n[2] = 0x3FFFFFF*(m+1) - fd.n[2] + r.n[3] = 0x3FFFFFF*(m+1) - fd.n[3] + r.n[4] = 0x3FFFFFF*(m+1) - fd.n[4] + r.n[5] = 0x3FFFFFF*(m+1) - fd.n[5] + r.n[6] = 0x3FFFFFF*(m+1) - fd.n[6] + r.n[7] = 0x3FFFFFF*(m+1) - fd.n[7] + r.n[8] = 0x3FFFFFF*(m+1) - fd.n[8] + r.n[9] = 0x03FFFFF*(m+1) - fd.n[9] +} + +// Inv new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Inv(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, fd) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(&t1) + t1.Mul(r, fd) +} + +// Sqrt new algo by peterdettman - https://github.com/sipa/TheCurve/pull/19 +func (fd *Field) Sqrt(r *Field) { + var x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1 Field + var j int + + fd.Sqr(&x2) + x2.Mul(&x2, fd) + + x2.Sqr(&x3) + x3.Mul(&x3, fd) + + x3.Sqr(&x6) + x6.Sqr(&x6) + x6.Sqr(&x6) + x6.Mul(&x6, &x3) + + x6.Sqr(&x9) + x9.Sqr(&x9) + x9.Sqr(&x9) + x9.Mul(&x9, &x3) + + x9.Sqr(&x11) + x11.Sqr(&x11) + x11.Mul(&x11, &x2) + + x11.Sqr(&x22) + for j = 1; j < 11; j++ { + x22.Sqr(&x22) + } + x22.Mul(&x22, &x11) + + x22.Sqr(&x44) + for j = 1; j < 22; j++ { + x44.Sqr(&x44) + } + x44.Mul(&x44, &x22) + + x44.Sqr(&x88) + for j = 1; j < 44; j++ { + x88.Sqr(&x88) + } + x88.Mul(&x88, &x44) + + x88.Sqr(&x176) + for j = 1; j < 88; j++ { + x176.Sqr(&x176) + } + x176.Mul(&x176, &x88) + + x176.Sqr(&x220) + for j = 1; j < 44; j++ { + x220.Sqr(&x220) + } + x220.Mul(&x220, &x44) + + x220.Sqr(&x223) + x223.Sqr(&x223) + x223.Sqr(&x223) + x223.Mul(&x223, &x3) + + x223.Sqr(&t1) + for j = 1; j < 23; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x22) + for j = 0; j < 6; j++ { + t1.Sqr(&t1) + } + t1.Mul(&t1, &x2) + t1.Sqr(&t1) + t1.Sqr(r) +} + +// InvVar ... +func (fd *Field) InvVar(r *Field) { + var b [32]byte + var c Field + c = *fd + c.Normalize() + c.GetB32(b[:]) + var n Number + n.SetBytes(b[:]) + n.modInv(&n, &TheCurve.p) + r.SetBytes(n.Bytes()) +} + +// Mul ... +func (fd *Field) Mul(r, b *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(b.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[1]) + + uint64(fd.n[1])*uint64(b.n[0]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[2]) + + uint64(fd.n[1])*uint64(b.n[1]) + + uint64(fd.n[2])*uint64(b.n[0]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[3]) + + uint64(fd.n[1])*uint64(b.n[2]) + + uint64(fd.n[2])*uint64(b.n[1]) + + uint64(fd.n[3])*uint64(b.n[0]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[4]) + + uint64(fd.n[1])*uint64(b.n[3]) + + uint64(fd.n[2])*uint64(b.n[2]) + + uint64(fd.n[3])*uint64(b.n[1]) + + uint64(fd.n[4])*uint64(b.n[0]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[5]) + + uint64(fd.n[1])*uint64(b.n[4]) + + uint64(fd.n[2])*uint64(b.n[3]) + + uint64(fd.n[3])*uint64(b.n[2]) + + uint64(fd.n[4])*uint64(b.n[1]) + + uint64(fd.n[5])*uint64(b.n[0]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[6]) + + uint64(fd.n[1])*uint64(b.n[5]) + + uint64(fd.n[2])*uint64(b.n[4]) + + uint64(fd.n[3])*uint64(b.n[3]) + + uint64(fd.n[4])*uint64(b.n[2]) + + uint64(fd.n[5])*uint64(b.n[1]) + + uint64(fd.n[6])*uint64(b.n[0]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[7]) + + uint64(fd.n[1])*uint64(b.n[6]) + + uint64(fd.n[2])*uint64(b.n[5]) + + uint64(fd.n[3])*uint64(b.n[4]) + + uint64(fd.n[4])*uint64(b.n[3]) + + uint64(fd.n[5])*uint64(b.n[2]) + + uint64(fd.n[6])*uint64(b.n[1]) + + uint64(fd.n[7])*uint64(b.n[0]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[8]) + + uint64(fd.n[1])*uint64(b.n[7]) + + uint64(fd.n[2])*uint64(b.n[6]) + + uint64(fd.n[3])*uint64(b.n[5]) + + uint64(fd.n[4])*uint64(b.n[4]) + + uint64(fd.n[5])*uint64(b.n[3]) + + uint64(fd.n[6])*uint64(b.n[2]) + + uint64(fd.n[7])*uint64(b.n[1]) + + uint64(fd.n[8])*uint64(b.n[0]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[0])*uint64(b.n[9]) + + uint64(fd.n[1])*uint64(b.n[8]) + + uint64(fd.n[2])*uint64(b.n[7]) + + uint64(fd.n[3])*uint64(b.n[6]) + + uint64(fd.n[4])*uint64(b.n[5]) + + uint64(fd.n[5])*uint64(b.n[4]) + + uint64(fd.n[6])*uint64(b.n[3]) + + uint64(fd.n[7])*uint64(b.n[2]) + + uint64(fd.n[8])*uint64(b.n[1]) + + uint64(fd.n[9])*uint64(b.n[0]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[1])*uint64(b.n[9]) + + uint64(fd.n[2])*uint64(b.n[8]) + + uint64(fd.n[3])*uint64(b.n[7]) + + uint64(fd.n[4])*uint64(b.n[6]) + + uint64(fd.n[5])*uint64(b.n[5]) + + uint64(fd.n[6])*uint64(b.n[4]) + + uint64(fd.n[7])*uint64(b.n[3]) + + uint64(fd.n[8])*uint64(b.n[2]) + + uint64(fd.n[9])*uint64(b.n[1]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[2])*uint64(b.n[9]) + + uint64(fd.n[3])*uint64(b.n[8]) + + uint64(fd.n[4])*uint64(b.n[7]) + + uint64(fd.n[5])*uint64(b.n[6]) + + uint64(fd.n[6])*uint64(b.n[5]) + + uint64(fd.n[7])*uint64(b.n[4]) + + uint64(fd.n[8])*uint64(b.n[3]) + + uint64(fd.n[9])*uint64(b.n[2]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[3])*uint64(b.n[9]) + + uint64(fd.n[4])*uint64(b.n[8]) + + uint64(fd.n[5])*uint64(b.n[7]) + + uint64(fd.n[6])*uint64(b.n[6]) + + uint64(fd.n[7])*uint64(b.n[5]) + + uint64(fd.n[8])*uint64(b.n[4]) + + uint64(fd.n[9])*uint64(b.n[3]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[4])*uint64(b.n[9]) + + uint64(fd.n[5])*uint64(b.n[8]) + + uint64(fd.n[6])*uint64(b.n[7]) + + uint64(fd.n[7])*uint64(b.n[6]) + + uint64(fd.n[8])*uint64(b.n[5]) + + uint64(fd.n[9])*uint64(b.n[4]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[5])*uint64(b.n[9]) + + uint64(fd.n[6])*uint64(b.n[8]) + + uint64(fd.n[7])*uint64(b.n[7]) + + uint64(fd.n[8])*uint64(b.n[6]) + + uint64(fd.n[9])*uint64(b.n[5]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[6])*uint64(b.n[9]) + + uint64(fd.n[7])*uint64(b.n[8]) + + uint64(fd.n[8])*uint64(b.n[7]) + + uint64(fd.n[9])*uint64(b.n[6]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[7])*uint64(b.n[9]) + + uint64(fd.n[8])*uint64(b.n[8]) + + uint64(fd.n[9])*uint64(b.n[7]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[8])*uint64(b.n[9]) + + uint64(fd.n[9])*uint64(b.n[8]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(b.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} + +// Sqr ... +func (fd *Field) Sqr(r *Field) { + var c, d uint64 + var t0, t1, t2, t3, t4, t5, t6 uint64 + var t7, t8, t9, t10, t11, t12, t13 uint64 + var t14, t15, t16, t17, t18, t19 uint64 + + c = uint64(fd.n[0]) * uint64(fd.n[0]) + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[1]) + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[2]) + + uint64(fd.n[1])*uint64(fd.n[1]) + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[3]) + + (uint64(fd.n[1])*2)*uint64(fd.n[2]) + t3 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[4]) + + (uint64(fd.n[1])*2)*uint64(fd.n[3]) + + uint64(fd.n[2])*uint64(fd.n[2]) + t4 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[5]) + + (uint64(fd.n[1])*2)*uint64(fd.n[4]) + + (uint64(fd.n[2])*2)*uint64(fd.n[3]) + t5 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[6]) + + (uint64(fd.n[1])*2)*uint64(fd.n[5]) + + (uint64(fd.n[2])*2)*uint64(fd.n[4]) + + uint64(fd.n[3])*uint64(fd.n[3]) + t6 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[7]) + + (uint64(fd.n[1])*2)*uint64(fd.n[6]) + + (uint64(fd.n[2])*2)*uint64(fd.n[5]) + + (uint64(fd.n[3])*2)*uint64(fd.n[4]) + t7 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[8]) + + (uint64(fd.n[1])*2)*uint64(fd.n[7]) + + (uint64(fd.n[2])*2)*uint64(fd.n[6]) + + (uint64(fd.n[3])*2)*uint64(fd.n[5]) + + uint64(fd.n[4])*uint64(fd.n[4]) + t8 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[0])*2)*uint64(fd.n[9]) + + (uint64(fd.n[1])*2)*uint64(fd.n[8]) + + (uint64(fd.n[2])*2)*uint64(fd.n[7]) + + (uint64(fd.n[3])*2)*uint64(fd.n[6]) + + (uint64(fd.n[4])*2)*uint64(fd.n[5]) + t9 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[1])*2)*uint64(fd.n[9]) + + (uint64(fd.n[2])*2)*uint64(fd.n[8]) + + (uint64(fd.n[3])*2)*uint64(fd.n[7]) + + (uint64(fd.n[4])*2)*uint64(fd.n[6]) + + uint64(fd.n[5])*uint64(fd.n[5]) + t10 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[2])*2)*uint64(fd.n[9]) + + (uint64(fd.n[3])*2)*uint64(fd.n[8]) + + (uint64(fd.n[4])*2)*uint64(fd.n[7]) + + (uint64(fd.n[5])*2)*uint64(fd.n[6]) + t11 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[3])*2)*uint64(fd.n[9]) + + (uint64(fd.n[4])*2)*uint64(fd.n[8]) + + (uint64(fd.n[5])*2)*uint64(fd.n[7]) + + uint64(fd.n[6])*uint64(fd.n[6]) + t12 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[4])*2)*uint64(fd.n[9]) + + (uint64(fd.n[5])*2)*uint64(fd.n[8]) + + (uint64(fd.n[6])*2)*uint64(fd.n[7]) + t13 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[5])*2)*uint64(fd.n[9]) + + (uint64(fd.n[6])*2)*uint64(fd.n[8]) + + uint64(fd.n[7])*uint64(fd.n[7]) + t14 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[6])*2)*uint64(fd.n[9]) + + (uint64(fd.n[7])*2)*uint64(fd.n[8]) + t15 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[7])*2)*uint64(fd.n[9]) + + uint64(fd.n[8])*uint64(fd.n[8]) + t16 = c & 0x3FFFFFF + c = c >> 26 + c = c + (uint64(fd.n[8])*2)*uint64(fd.n[9]) + t17 = c & 0x3FFFFFF + c = c >> 26 + c = c + uint64(fd.n[9])*uint64(fd.n[9]) + t18 = c & 0x3FFFFFF + c = c >> 26 + t19 = c + + c = t0 + t10*0x3D10 + t0 = c & 0x3FFFFFF + c = c >> 26 + c = c + t1 + t10*0x400 + t11*0x3D10 + t1 = c & 0x3FFFFFF + c = c >> 26 + c = c + t2 + t11*0x400 + t12*0x3D10 + t2 = c & 0x3FFFFFF + c = c >> 26 + c = c + t3 + t12*0x400 + t13*0x3D10 + r.n[3] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t4 + t13*0x400 + t14*0x3D10 + r.n[4] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t5 + t14*0x400 + t15*0x3D10 + r.n[5] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t6 + t15*0x400 + t16*0x3D10 + r.n[6] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t7 + t16*0x400 + t17*0x3D10 + r.n[7] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t8 + t17*0x400 + t18*0x3D10 + r.n[8] = uint32(c) & 0x3FFFFFF + c = c >> 26 + c = c + t9 + t18*0x400 + t19*0x1000003D10 + r.n[9] = uint32(c) & 0x03FFFFF + c = c >> 22 + d = t0 + c*0x3D1 + r.n[0] = uint32(d) & 0x3FFFFFF + d = d >> 26 + d = d + t1 + c*0x40 + r.n[1] = uint32(d) & 0x3FFFFFF + d = d >> 26 + r.n[2] = uint32(t2 + d) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go new file mode 100755 index 0000000..24f3b5a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/field_test.go @@ -0,0 +1,36 @@ +package secp256k1go + +import ( + "crypto/rand" + "testing" +) + +func TestFeInv(t *testing.T) { + var in, out, exp Field + in.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + exp.SetHex("7F586430EA30F914965770F6098E492699C62EE1DF6CAFFA77681C179FDF3117") + in.Inv(&out) + if !out.Equals(&exp) { + t.Error("fe.Inv() failed") + } +} + +func BenchmarkFieldSqrt(b *testing.B) { + var dat [32]byte + var f, tmp Field + rand.Read(dat[:]) + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Sqrt(&tmp) + } +} + +func BenchmarkFieldInv(b *testing.B) { + var dat [32]byte + var f, tmp Field + rand.Read(dat[:]) + f.SetB32(dat[:]) + for i := 0; i < b.N; i++ { + f.Inv(&tmp) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go new file mode 100755 index 0000000..3c9f901 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/num.go @@ -0,0 +1,114 @@ +package secp256k1go + +import ( + "encoding/hex" + "fmt" + "math/big" +) + +var ( + // BigInt1 represents big int with value 1 + BigInt1 = new(big.Int).SetInt64(1) +) + +// Number wraps the big.Int +type Number struct { + big.Int +} + +// Print prints the label with hex number string +func (num *Number) Print(label string) { + fmt.Println(label, hex.EncodeToString(num.Bytes())) +} + +func (num *Number) modMul(a, b, m *Number) { + num.Mul(&a.Int, &b.Int) + num.Mod(&num.Int, &m.Int) + return +} + +func (num *Number) modInv(a, b *Number) { + num.ModInverse(&a.Int, &b.Int) + return +} + +func (num *Number) mod(a *Number) { + num.Mod(&num.Int, &a.Int) + return +} + +// SetHex sets number from string +func (num *Number) SetHex(s string) { + num.SetString(s, 16) +} + +//SetBytes and GetBytes are inherited by default +//added +//func (a *Number) SetBytes(b []byte) { +// a.SetBytes(b) +//} + +func (num *Number) maskBits(bits uint) { + mask := new(big.Int).Lsh(BigInt1, bits) + mask.Sub(mask, BigInt1) + num.Int.And(&num.Int, mask) +} + +func (num *Number) splitExp(r1, r2 *Number) { + var bnc1, bnc2, bnn2, bnt1, bnt2 Number + + bnn2.Int.Rsh(&TheCurve.Order.Int, 1) + + bnc1.Mul(&num.Int, &TheCurve.a1b2.Int) + bnc1.Add(&bnc1.Int, &bnn2.Int) + bnc1.Div(&bnc1.Int, &TheCurve.Order.Int) + + bnc2.Mul(&num.Int, &TheCurve.b1.Int) + bnc2.Add(&bnc2.Int, &bnn2.Int) + bnc2.Div(&bnc2.Int, &TheCurve.Order.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.a1b2.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a2.Int) + bnt1.Add(&bnt1.Int, &bnt2.Int) + r1.Sub(&num.Int, &bnt1.Int) + + bnt1.Mul(&bnc1.Int, &TheCurve.b1.Int) + bnt2.Mul(&bnc2.Int, &TheCurve.a1b2.Int) + r2.Sub(&bnt1.Int, &bnt2.Int) +} + +func (num *Number) split(rl, rh *Number, bits uint) { // nolint: unparam + rl.Int.Set(&num.Int) + rh.Int.Rsh(&rl.Int, bits) + rl.maskBits(bits) +} + +func (num *Number) rsh(bits uint) { // nolint: unparam + num.Rsh(&num.Int, bits) +} + +func (num *Number) inc() { + num.Add(&num.Int, BigInt1) +} + +func (num *Number) rshX(bits uint) (res int) { + res = int(new(big.Int).And(&num.Int, new(big.Int).SetUint64((1< le { + panic("buffer too small") + } + if len(bts) == le { + return bts + } + return append(make([]byte, le-len(bts)), bts...) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go new file mode 100755 index 0000000..a032b93 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/secp256k1.go @@ -0,0 +1,57 @@ +package secp256k1go + +const winA = 5 +const winG = 14 +const forceLowS = true // At the output of the Sign() function + +// TheCurve represents curve +var TheCurve struct { + Order, halfOrder Number + G XY + beta Field + lambda, a1b2, b1, a2 Number + p Number +} + +func initContants() { + TheCurve.Order.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, + 0xBA, 0xAE, 0xDC, 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, 0x8C, 0xD0, 0x36, 0x41, 0x41}) + + TheCurve.halfOrder.SetBytes([]byte{ + 0X7F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0X5D, 0X57, 0X6E, 0X73, 0X57, 0XA4, 0X50, 0X1D, 0XDF, 0XE9, 0X2F, 0X46, 0X68, 0X1B, 0X20, 0XA0}) + + TheCurve.p.SetBytes([]byte{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFC, 0x2F}) + + TheCurve.G.X.SetB32([]byte{ + 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, 0x07, + 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, 0x98}) + + TheCurve.G.Y.SetB32([]byte{ + 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, 0xA8, + 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, 0xB8}) + + TheCurve.lambda.SetBytes([]byte{ + 0x53, 0x63, 0xad, 0x4c, 0xc0, 0x5c, 0x30, 0xe0, 0xa5, 0x26, 0x1c, 0x02, 0x88, 0x12, 0x64, 0x5a, + 0x12, 0x2e, 0x22, 0xea, 0x20, 0x81, 0x66, 0x78, 0xdf, 0x02, 0x96, 0x7c, 0x1b, 0x23, 0xbd, 0x72}) + + TheCurve.beta.SetB32([]byte{ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee}) + + TheCurve.a1b2.SetBytes([]byte{ + 0x30, 0x86, 0xd2, 0x21, 0xa7, 0xd4, 0x6b, 0xcd, 0xe8, 0x6c, 0x90, 0xe4, 0x92, 0x84, 0xeb, 0x15}) + + TheCurve.b1.SetBytes([]byte{ + 0xe4, 0x43, 0x7e, 0xd6, 0x01, 0x0e, 0x88, 0x28, 0x6f, 0x54, 0x7f, 0xa9, 0x0a, 0xbf, 0xe4, 0xc3}) + + TheCurve.a2.SetBytes([]byte{ + 0x01, 0x14, 0xca, 0x50, 0xf7, 0xa8, 0xe2, 0xf3, 0xf6, 0x57, 0xc1, 0x10, 0x8d, 0x9d, 0x44, 0xcf, 0xd8}) +} + +func init() { + initContants() +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go new file mode 100755 index 0000000..a087c3b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig.go @@ -0,0 +1,230 @@ +package secp256k1go + +import ( + "bytes" + "encoding/hex" + "fmt" + "log" +) + +// Signature represents the signature +type Signature struct { + R, S Number +} + +// Print prints the signature +func (sig *Signature) Print(lab string) { + fmt.Println(lab+".R:", hex.EncodeToString(sig.R.Bytes())) + fmt.Println(lab+".S:", hex.EncodeToString(sig.S.Bytes())) +} + +// Verify verify the signature +func (sig *Signature) Verify(pubkey *XY, message *Number) (ret bool) { + var r2 Number + ret = sig.recompute(&r2, pubkey, message) && sig.R.Cmp(&r2.Int) == 0 + return +} + +func (sig *Signature) recompute(r2 *Number, pubkey *XY, message *Number) (ret bool) { + var sn, u1, u2 Number + + sn.modInv(&sig.S, &TheCurve.Order) + u1.modMul(&sn, message, &TheCurve.Order) + u2.modMul(&sn, &sig.R, &TheCurve.Order) + + var pr, pubkeyj XYZ + pubkeyj.SetXY(pubkey) + + pubkeyj.ECmult(&pr, &u2, &u1) + if !pr.IsInfinity() { + var xr Field + pr.getX(&xr) + xr.Normalize() + var xrb [32]byte + xr.GetB32(xrb[:]) + r2.SetBytes(xrb[:]) + r2.Mod(&r2.Int, &TheCurve.Order.Int) + ret = true + } + + return +} + +// Recover TODO: return type, or nil on failure +func (sig *Signature) Recover(pubkey *XY, m *Number, recid int) (ret bool) { + var rx, rn, u1, u2 Number + var fx Field + var X XY + var xj, qj XYZ + + rx.Set(&sig.R.Int) + if (recid & 2) != 0 { + rx.Add(&rx.Int, &TheCurve.Order.Int) + if rx.Cmp(&TheCurve.p.Int) >= 0 { + return false + } + } + + fx.SetB32(rx.getBin(32)) + + X.SetXO(&fx, (recid&1) != 0) + if !X.IsValid() { + return false + } + + xj.SetXY(&X) + rn.modInv(&sig.R, &TheCurve.Order) + u1.modMul(&rn, m, &TheCurve.Order) + u1.Sub(&TheCurve.Order.Int, &u1.Int) + u2.modMul(&rn, &sig.S, &TheCurve.Order) + xj.ECmult(&qj, &u2, &u1) + pubkey.SetXYZ(&qj) + + return true +} + +// Sign signs the signature +func (sig *Signature) Sign(seckey, message, nonce *Number, recid *int) int { + var r XY + var rp XYZ + var n Number + var b [32]byte + + ECmultGen(&rp, nonce) + r.SetXYZ(&rp) + r.X.Normalize() + r.Y.Normalize() + r.X.GetB32(b[:]) + sig.R.SetBytes(b[:]) + if recid != nil { + *recid = 0 + if sig.R.Cmp(&TheCurve.Order.Int) >= 0 { + *recid |= 2 + } + if r.Y.IsOdd() { + *recid |= 1 + } + } + sig.R.mod(&TheCurve.Order) + n.modMul(&sig.R, seckey, &TheCurve.Order) + n.Add(&n.Int, &message.Int) + n.mod(&TheCurve.Order) + sig.S.modInv(nonce, &TheCurve.Order) + sig.S.modMul(&sig.S, &n, &TheCurve.Order) + if sig.S.Sign() == 0 { + return 0 + } + if sig.S.IsOdd() { + sig.S.Sub(&TheCurve.Order.Int, &sig.S.Int) + if recid != nil { + *recid ^= 1 + } + } + + if forceLowS && sig.S.Cmp(&TheCurve.halfOrder.Int) == 1 { + sig.S.Sub(&TheCurve.Order.Int, &sig.S.Int) + if recid != nil { + *recid ^= 1 + } + } + + return 1 +} + +/* +//uncompressed Signature Parsing in DER +func (r *Signature) ParseBytes(sig []byte) int { + if sig[0] != 0x30 || len(sig) < 5 { + return -1 + } + + lenr := int(sig[3]) + if lenr == 0 || 5+lenr >= len(sig) || sig[lenr+4] != 0x02 { + return -1 + } + + lens := int(sig[lenr+5]) + if lens == 0 || int(sig[1]) != lenr+lens+4 || lenr+lens+6 > len(sig) || sig[2] != 0x02 { + return -1 + } + + r.R.SetBytes(sig[4 : 4+lenr]) + r.S.SetBytes(sig[6+lenr : 6+lenr+lens]) + return 6 + lenr + lens +} +*/ + +/* +//uncompressed Signature parsing in DER +func (sig *Signature) Bytes() []byte { + r := sig.R.Bytes() + if r[0] >= 0x80 { + r = append([]byte{0}, r...) + } + s := sig.S.Bytes() + if s[0] >= 0x80 { + s = append([]byte{0}, s...) + } + res := new(bytes.Buffer) + res.WriteByte(0x30) + res.WriteByte(byte(4 + len(r) + len(s))) + res.WriteByte(0x02) + res.WriteByte(byte(len(r))) + res.Write(r) + res.WriteByte(0x02) + res.WriteByte(byte(len(s))) + res.Write(s) + return res.Bytes() +} +*/ + +// ParseBytes compressed signature parsing +func (sig *Signature) ParseBytes(v []byte) { + if len(v) != 64 { + log.Panic() + } + sig.R.SetBytes(v[0:32]) + sig.S.SetBytes(v[32:64]) +} + +//secp256k1_num_get_bin(sig64, 32, &sig.r); +//secp256k1_num_get_bin(sig64 + 32, 32, &sig.s); + +// Bytes compressed signature parsing +func (sig *Signature) Bytes() []byte { + r := sig.R.Bytes() //endianess + s := sig.S.Bytes() //endianess + + for len(r) < 32 { + r = append([]byte{0}, r...) + } + for len(s) < 32 { + s = append([]byte{0}, s...) + } + + if len(r) != 32 || len(s) != 32 { + log.Panicf("signature size invalid: %d, %d", len(r), len(s)) + } + + res := new(bytes.Buffer) + res.Write(r) + res.Write(s) + + //test + if true { + ret := res.Bytes() + var sig2 Signature + sig2.ParseBytes(ret) + if bytes.Equal(sig.R.Bytes(), sig2.R.Bytes()) == false { + log.Panic("serialization failed 1") + } + if bytes.Equal(sig.S.Bytes(), sig2.S.Bytes()) == false { + log.Panic("serialization failed 2") + } + } + + if len(res.Bytes()) != 64 { + log.Panic() + } + return res.Bytes() +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go new file mode 100755 index 0000000..d87c487 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/sig_test.go @@ -0,0 +1,150 @@ +package secp256k1go + +import ( + "encoding/hex" + "strconv" + "testing" +) + +func TestSigRecover(t *testing.T) { + var vs = [][6]string{ + { + "6028b9e3a31c9e725fcbd7d5d16736aaaafcc9bf157dfb4be62bcbcf0969d488", + "036d4a36fa235b8f9f815aa6f5457a607f956a71a035bf0970d8578bf218bb5a", + "9cff3da1a4f86caf3683f865232c64992b5ed002af42b321b8d8a48420680487", + "0", + "56dc5df245955302893d8dda0677cc9865d8011bc678c7803a18b5f6faafec08", + "54b5fbdcd8fac6468dac2de88fadce6414f5f3afbb103753e25161bef77705a6", + }, + { + "b470e02f834a3aaafa27bd2b49e07269e962a51410f364e9e195c31351a05e50", + "560978aed76de9d5d781f87ed2068832ed545f2b21bf040654a2daff694c8b09", + "9ce428d58e8e4caf619dc6fc7b2c2c28f0561654d1f80f322c038ad5e67ff8a6", + "1", + "15b7e7d00f024bffcd2e47524bb7b7d3a6b251e23a3a43191ed7f0a418d9a578", + "bf29a25e2d1f32c5afb18b41ae60112723278a8af31275965a6ec1d95334e840", + }, + } + + var sig Signature + var pubkey, exp XY + var msg Number + + for i := range vs { + sig.R.SetHex(vs[i][0]) + sig.S.SetHex(vs[i][1]) + msg.SetHex(vs[i][2]) + rid, _ := strconv.ParseInt(vs[i][3], 10, 32) + exp.X.SetHex(vs[i][4]) + exp.Y.SetHex(vs[i][5]) + + if sig.Recover(&pubkey, &msg, int(rid)) { + if !exp.X.Equals(&pubkey.X) { + t.Error("X mismatch at vector", i) + } + if !exp.Y.Equals(&pubkey.Y) { + t.Error("Y mismatch at vector", i) + } + } else { + t.Error("sig.recover fialed") + } + } +} + +func TestSigVerify(t *testing.T) { + var msg Number + var sig Signature + var key XY + + //// len(65) keys are rejected now, this test case is invalid: + // msg.SetHex("3382219555ddbb5b00e0090f469e590ba1eae03c7f28ab937de330aa60294ed6") + // sig.R.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + // sig.S.SetHex("7d0d04fed8fa1e93007468d5a9e134b0a7023b6d31db4e50942d43a250f4d07c") + // xy, _ := hex.DecodeString("040eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66dbeb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + // key.ParsePubkey(xy) + // if !sig.Verify(&key, &msg) { + // t.Error("sig.Verify 0") + // } + + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 1") + } + + msg.SetHex("2c43a883f4edc2b66c67a7a355b9312a565bb3d33bb854af36a06669e2028377") + sig.R.SetHex("6b2fa9344462c958d4a674c2a42fbedf7d6159a5276eb658887e2e1b3915329b") + sig.S.SetHex("eddc6ea7f190c14a0aa74e41519d88d2681314f011d253665f301425caf86b86") + xy, _ := hex.DecodeString("02a60d70cfba37177d8239d018185d864b2bdd0caf5e175fd4454cc006fd2d75ac") + key.ParsePubkey(xy) + if !sig.Verify(&key, &msg) { + t.Error("sig.Verify 2") + } +} + +func TestSigSign(t *testing.T) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + res := sig.Sign(&sec, &msg, &non, &recid) + if res != 1 { + t.Error("res failed", res) + } + if forceLowS { + if recid != 0 { + t.Error("recid failed", recid) + } + } else { + if recid != 1 { + t.Error("recid failed", recid) + } + } + non.SetHex("98f9d784ba6c5c77bb7323d044c0fc9f2b27baa0a5b0718fe88596cc56681980") + if sig.R.Cmp(&non.Int) != 0 { + t.Error("R failed", sig.R.String()) + } + if forceLowS { + non.SetHex("1ca662aaefd6cc958ba4604fea999db133a75bf34c13334dabac7124ff0cfcc1") + } else { + non.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + } + if sig.S.Cmp(&non.Int) != 0 { + t.Error("S failed", sig.S.String()) + } +} + +func BenchmarkVerify(b *testing.B) { + var msg Number + var sig Signature + var key XY + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + sig.R.SetHex("98F9D784BA6C5C77BB7323D044C0FC9F2B27BAA0A5B0718FE88596CC56681980") + sig.S.SetHex("E3599D551029336A745B9FB01566624D870780F363356CEE1425ED67D1294480") + key.X.SetHex("7d709f85a331813f9ae6046c56b3a42737abf4eb918b2e7afee285070e968b93") + key.Y.SetHex("26150d1a63b342986c373977b00131950cb5fc194643cad6ea36b5157eba4602") + b.ResetTimer() + for i := 0; i < b.N; i++ { + if !sig.Verify(&key, &msg) { + b.Fatal("sig_verify failed") + } + } +} + +func BenchmarkSign(b *testing.B) { + var sec, msg, non Number + var sig Signature + var recid int + sec.SetHex("73641C99F7719F57D8F4BEB11A303AFCD190243A51CED8782CA6D3DBE014D146") + msg.SetHex("D474CBF2203C1A55A411EEC4404AF2AFB2FE942C434B23EFE46E9F04DA8433CA") + non.SetHex("9E3CD9AB0F32911BFDE39AD155F527192CE5ED1F51447D63C4F154C118DA598E") + b.ResetTimer() + for i := 0; i < b.N; i++ { + sig.Sign(&sec, &msg, &non, &recid) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go new file mode 100755 index 0000000..b9319ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xy.go @@ -0,0 +1,265 @@ +package secp256k1go + +import ( + "fmt" + "log" +) + +// XY TODO... +type XY struct { + X, Y Field + Infinity bool +} + +// Print prints the xy +func (xy *XY) Print(lab string) { + if xy.Infinity { + fmt.Println(lab + " - Infinity") + return + } + fmt.Println(lab+".X:", xy.X.String()) + fmt.Println(lab+".Y:", xy.Y.String()) +} + +//edited + +/* + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } +*/ +//All compact keys appear to be valid by construction, but may fail +//is valid check + +// ParsePubkey WARNING: for compact signatures, will succeed unconditionally +//however, elem.IsValid will fail +func (xy *XY) ParsePubkey(pub []byte) bool { + if len(pub) != 33 { + log.Panic("pubkey len must be 33, len is ", len(pub)) // do not permit invalid length inputs + return false + } + if len(pub) == 33 && (pub[0] == 0x02 || pub[0] == 0x03) { + xy.X.SetB32(pub[1:33]) + xy.SetXO(&xy.X, pub[0] == 0x03) + } else { + return false + } + //THIS FAILS + //reenable later + //if elem.IsValid() == false { + // return false + //} + + /* + else if len(pub) == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07) { + elem.X.SetB32(pub[1:33]) + elem.Y.SetB32(pub[33:65]) + if (pub[0] == 0x06 || pub[0] == 0x07) && elem.Y.IsOdd() != (pub[0] == 0x07) { + return false + } + } + */ + return true +} + +// Bytes Returns serialized key in in compressed format: "<02> ", +// eventually "<03> " +//33 bytes +func (xy XY) Bytes() []byte { + xy.X.Normalize() // See GitHub issue #15 + + raw := make([]byte, 33) + if xy.Y.IsOdd() { + raw[0] = 0x03 + } else { + raw[0] = 0x02 + } + xy.X.GetB32(raw[1:]) + return raw +} + +// BytesUncompressed returns serialized key in uncompressed format "<04> " +//65 bytes +func (xy *XY) BytesUncompressed() (raw []byte) { + xy.X.Normalize() // See GitHub issue #15 + xy.Y.Normalize() // See GitHub issue #15 + + raw = make([]byte, 65) + raw[0] = 0x04 + xy.X.GetB32(raw[1:33]) + xy.Y.GetB32(raw[33:65]) + return +} + +// SetXY sets x y fields +func (xy *XY) SetXY(X, Y *Field) { + xy.Infinity = false + xy.X = *X + xy.Y = *Y +} + +/* +int static secp256k1_ecdsa_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + secp256k1_fe_set_b32(&x, pub+1); + return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + secp256k1_fe_set_b32(&x, pub+1); + secp256k1_fe_set_b32(&y, pub+33); + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) + return 0; + return secp256k1_ge_is_valid(elem); + } else { + return 0; + } +} +*/ + +// if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { +// secp256k1_fe_t x; +// secp256k1_fe_set_b32(&x, pub+1); +// return secp256k1_ge_set_xo(elem, &x, pub[0] == 0x03); + +// IsValid checks if valid +func (xy *XY) IsValid() bool { + if xy.Infinity { + return false + } + var y2, x3, c Field + xy.Y.Sqr(&y2) + xy.X.Sqr(&x3) + x3.Mul(&x3, &xy.X) + c.SetInt(7) + x3.SetAdd(&c) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +// SetXYZ sets X Y Z fields +func (xy *XY) SetXYZ(a *XYZ) { + var z2, z3 Field + a.Z.InvVar(&a.Z) + a.Z.Sqr(&z2) + a.Z.Mul(&z3, &z2) + a.X.Mul(&a.X, &z2) + a.Y.Mul(&a.Y, &z3) + a.Z.SetInt(1) + xy.Infinity = a.Infinity + xy.X = a.X + xy.Y = a.Y +} + +func (xy *XY) precomp(w int) (pre []XY) { + pre = make([]XY, (1 << (uint(w) - 2))) + pre[0] = *xy + var X, d, tmp XYZ + X.SetXY(xy) + X.Double(&d) + for i := 1; i < len(pre); i++ { + d.AddXY(&tmp, &pre[i-1]) + pre[i].SetXYZ(&tmp) + } + return +} + +// Neg caculates negate +func (xy *XY) Neg(r *XY) { + r.Infinity = xy.Infinity + r.X = xy.X + r.Y = xy.Y + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +/* +int static secp256k1_ge_set_xo(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + r->x = *x; + secp256k1_fe_t x2; secp256k1_fe_sqr(&x2, x); + secp256k1_fe_t x3; secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_t c; secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt(&r->y, &c)) + return 0; + secp256k1_fe_normalize(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) + secp256k1_fe_negate(&r->y, &r->y, 1); + return 1; +} +*/ + +// SetXO sets +func (xy *XY) SetXO(X *Field, odd bool) { + var c, x2, x3 Field + xy.X = *X + X.Sqr(&x2) + X.Mul(&x3, &x2) + xy.Infinity = false + c.SetInt(7) + c.SetAdd(&x3) + c.Sqrt(&xy.Y) //does not return, can fail + if xy.Y.IsOdd() != odd { + xy.Y.Negate(&xy.Y, 1) + } + + //r.X.Normalize() // See GitHub issue #15 + xy.Y.Normalize() +} + +// AddXY adds xy +func (xy *XY) AddXY(a *XY) { + var xyz XYZ + xyz.SetXY(xy) + xyz.AddXY(&xyz, a) + xy.SetXYZ(&xyz) +} + +/* +func (pk *XY) GetPublicKey() []byte { + var out []byte = make([]byte, 65, 65) + pk.X.GetB32(out[1:33]) + if len(out) == 65 { + out[0] = 0x04 + pk.Y.GetB32(out[33:65]) + } else { + if pk.Y.IsOdd() { + out[0] = 0x03 + } else { + out[0] = 0x02 + } + } + return out +} +*/ + +// GetPublicKey use compact format +//returns only 33 bytes +//same as bytes() +//TODO: deprecate, replace with .Bytes() +func (xy *XY) GetPublicKey() []byte { + return xy.Bytes() + /* + var out []byte = make([]byte, 33, 33) + pk.X.GetB32(out[1:33]) + if pk.Y.IsOdd() { + out[0] = 0x03 + } else { + out[0] = 0x02 + } + return out + */ +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go new file mode 100755 index 0000000..7fffdd5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz.go @@ -0,0 +1,387 @@ +package secp256k1go + +import ( + "fmt" + // "encoding/hex" +) + +// XYZ contains xyz fields +type XYZ struct { + X, Y, Z Field + Infinity bool +} + +// Print prints xyz +func (xyz XYZ) Print(lab string) { + if xyz.Infinity { + fmt.Println(lab + " - INFINITY") + return + } + fmt.Println(lab+".X", xyz.X.String()) + fmt.Println(lab+".Y", xyz.Y.String()) + fmt.Println(lab+".Z", xyz.Z.String()) +} + +// SetXY sets xy +func (xyz *XYZ) SetXY(a *XY) { + xyz.Infinity = a.Infinity + xyz.X = a.X + xyz.Y = a.Y + xyz.Z.SetInt(1) +} + +// IsInfinity check if xyz is infinity +func (xyz *XYZ) IsInfinity() bool { + return xyz.Infinity +} + +// IsValid check if xyz is valid +func (xyz *XYZ) IsValid() bool { + if xyz.Infinity { + return false + } + var y2, x3, z2, z6 Field + xyz.Y.Sqr(&y2) + xyz.X.Sqr(&x3) + x3.Mul(&x3, &xyz.X) + xyz.Z.Sqr(&z2) + z2.Sqr(&z6) + z6.Mul(&z6, &z2) + z6.MulInt(7) + x3.SetAdd(&z6) + y2.Normalize() + x3.Normalize() + return y2.Equals(&x3) +} + +func (xyz *XYZ) getX(r *Field) { + var zi2 Field + xyz.Z.InvVar(&zi2) + zi2.Sqr(&zi2) + xyz.X.Mul(r, &zi2) +} + +// Normalize normalize all fields +func (xyz *XYZ) Normalize() { + xyz.X.Normalize() + xyz.Y.Normalize() + xyz.Z.Normalize() +} + +// Equals checks if equal +func (xyz *XYZ) Equals(b *XYZ) bool { + if xyz.Infinity != b.Infinity { + return false + } + // TODO: is the normalize really needed here? + xyz.Normalize() + b.Normalize() + return xyz.X.Equals(&b.X) && xyz.Y.Equals(&b.Y) && xyz.Z.Equals(&b.Z) +} + +func (xyz *XYZ) precomp(w int) (pre []XYZ) { // nolint: unparam + var d XYZ + pre = make([]XYZ, (1 << (uint(w) - 2))) + pre[0] = *xyz + pre[0].Double(&d) + for i := 1; i < len(pre); i++ { + d.Add(&pre[i], &pre[i-1]) + } + return +} + +func ecmultWnaf(wnaf []int, a *Number, w uint) (ret int) { + var zeroes uint + var X Number + X.Set(&a.Int) + + for X.Sign() != 0 { + for X.Bit(0) == 0 { + zeroes++ + X.rsh(1) + } + word := X.rshX(w) + for zeroes > 0 { + wnaf[ret] = 0 + ret++ + zeroes-- + } + if (word & (1 << (w - 1))) != 0 { + X.inc() + wnaf[ret] = (word - (1 << w)) + } else { + wnaf[ret] = word + } + zeroes = w - 1 + ret++ + } + return +} + +// ECmult r = na*a + ng*G +func (xyz *XYZ) ECmult(r *XYZ, na, ng *Number) { + var na1, naLam, ng1, ng128 Number + + // split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) + na.splitExp(&na1, &naLam) + + // split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) + ng.split(&ng1, &ng128, 128) + + // build wnaf representation for na_1, na_lam, ng_1, ng_128 + var wnafNa1, wnafNaLam, wnafNg1, wnafNg128 [129]int + bitsNa1 := ecmultWnaf(wnafNa1[:], &na1, winA) + bitsNaLam := ecmultWnaf(wnafNaLam[:], &naLam, winA) + bitsNg1 := ecmultWnaf(wnafNg1[:], &ng1, winG) + bitsNg128 := ecmultWnaf(wnafNg128[:], &ng128, winG) + + // calculate a_lam = a*lambda + var aLam XYZ + xyz.mulLambda(&aLam) + + // calculate odd multiples of a and a_lam + preA1 := xyz.precomp(winA) + preALam := aLam.precomp(winA) + + bits := bitsNa1 + if bitsNaLam > bits { + bits = bitsNaLam + } + if bitsNg1 > bits { + bits = bitsNg1 + } + if bitsNg128 > bits { + bits = bitsNg128 + } + + r.Infinity = true + + var tmpj XYZ + var tmpa XY + var n int + + for i := bits - 1; i >= 0; i-- { + r.Double(r) + + if i < bitsNa1 { + n = wnafNa1[i] + if n > 0 { + r.Add(r, &preA1[((n)-1)/2]) + } else if n != 0 { + preA1[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNaLam { + n = wnafNaLam[i] + if n > 0 { + r.Add(r, &preALam[((n)-1)/2]) + } else if n != 0 { + preALam[(-(n)-1)/2].Neg(&tmpj) + r.Add(r, &tmpj) + } + } + + if i < bitsNg1 { + n = wnafNg1[i] + if n > 0 { + r.AddXY(r, &preG[((n)-1)/2]) + } else if n != 0 { + preG[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + + if i < bitsNg128 { + n = wnafNg128[i] + if n > 0 { + r.AddXY(r, &preG128[((n)-1)/2]) + } else if n != 0 { + preG128[(-(n)-1)/2].Neg(&tmpa) + r.AddXY(r, &tmpa) + } + } + } +} + +// Neg caculate neg +func (xyz *XYZ) Neg(r *XYZ) { + r.Infinity = xyz.Infinity + r.X = xyz.X + r.Y = xyz.Y + r.Z = xyz.Z + r.Y.Normalize() + r.Y.Negate(&r.Y, 1) +} + +func (xyz *XYZ) mulLambda(r *XYZ) { + *r = *xyz + r.X.Mul(&r.X, &TheCurve.beta) +} + +// Double cacule double +func (xyz *XYZ) Double(r *XYZ) { + var t1, t2, t3, t4, t5 Field + + t5 = xyz.Y + t5.Normalize() + if xyz.Infinity || t5.IsZero() { + r.Infinity = true + return + } + + t5.Mul(&r.Z, &xyz.Z) + r.Z.MulInt(2) + xyz.X.Sqr(&t1) + t1.MulInt(3) + t1.Sqr(&t2) + t5.Sqr(&t3) + t3.MulInt(2) + t3.Sqr(&t4) + t4.MulInt(2) + xyz.X.Mul(&t3, &t3) + r.X = t3 + r.X.MulInt(4) + r.X.Negate(&r.X, 4) + r.X.SetAdd(&t2) + t2.Negate(&t2, 1) + t3.MulInt(6) + t3.SetAdd(&t2) + t1.Mul(&r.Y, &t3) + t4.Negate(&t2, 2) + r.Y.SetAdd(&t2) + r.Infinity = false +} + +// AddXY adds XY +func (xyz *XYZ) AddXY(r *XYZ, b *XY) { + if xyz.Infinity { + r.Infinity = b.Infinity + r.X = b.X + r.Y = b.Y + r.Z.SetInt(1) + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z12, u1, u2, s1, s2 Field + xyz.Z.Sqr(&z12) + u1 = xyz.X + u1.Normalize() + b.X.Mul(&u2, &z12) + s1 = xyz.Y + s1.Normalize() + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + + var h, i, i2, h2, h3, t Field + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + r.Z = xyz.Z + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// Add adds value +func (xyz *XYZ) Add(r, b *XYZ) { + if xyz.Infinity { + *r = *b + return + } + if b.Infinity { + *r = *xyz + return + } + r.Infinity = false + var z22, z12, u1, u2, s1, s2 Field + + b.Z.Sqr(&z22) + xyz.Z.Sqr(&z12) + xyz.X.Mul(&u1, &z22) + b.X.Mul(&u2, &z12) + xyz.Y.Mul(&s1, &z22) + s1.Mul(&s1, &b.Z) + b.Y.Mul(&s2, &z12) + s2.Mul(&s2, &xyz.Z) + u1.Normalize() + u2.Normalize() + if u1.Equals(&u2) { + s1.Normalize() + s2.Normalize() + if s1.Equals(&s2) { + xyz.Double(r) + } else { + r.Infinity = true + } + return + } + var h, i, i2, h2, h3, t Field + + u1.Negate(&h, 1) + h.SetAdd(&u2) + s1.Negate(&i, 1) + i.SetAdd(&s2) + i.Sqr(&i2) + h.Sqr(&h2) + h.Mul(&h3, &h2) + xyz.Z.Mul(&r.Z, &b.Z) + r.Z.Mul(&r.Z, &h) + u1.Mul(&t, &h2) + r.X = t + r.X.MulInt(2) + r.X.SetAdd(&h3) + r.X.Negate(&r.X, 3) + r.X.SetAdd(&i2) + r.X.Negate(&r.Y, 5) + r.Y.SetAdd(&t) + r.Y.Mul(&r.Y, &i) + h3.Mul(&h3, &s1) + h3.Negate(&h3, 1) + r.Y.SetAdd(&h3) +} + +// ECmultGen r = a*G +//TODO: Change to returning result +//TODO: input should not be pointer +func ECmultGen(r *XYZ, a *Number) { + var n Number + n.Set(&a.Int) + r.SetXY(&prec[0][n.rshX(4)]) + for j := 1; j < 64; j++ { + r.AddXY(r, &prec[j][n.rshX(4)]) + } + r.AddXY(r, &fin) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go new file mode 100755 index 0000000..75c2906 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/xyz_test.go @@ -0,0 +1,49 @@ +package secp256k1go + +import ( + "testing" +) + +func _TestGejDouble(t *testing.T) { //nolint: deadcode + var a, aExp, r XYZ + a.X.SetHex("79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798") + a.Y.SetHex("483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8") + a.Z.SetHex("01") + aExp.X.SetHex("7D152C041EA8E1DC2191843D1FA9DB55B68F88FEF695E2C791D40444B365AFC2") + aExp.Y.SetHex("56915849F52CC8F76F5FD7E4BF60DB4A43BF633E1B1383F85FE89164BFADCBDB") + aExp.Z.SetHex("9075B4EE4D4788CABB49F7F81C221151FA2F68914D0AA833388FA11FF621A970") + + a.Double(&r) + if !r.Equals(&aExp) { + t.Error("gej.Double failed") + } +} + +func TestGejMulLambda(t *testing.T) { + var a, aExp XYZ + a.X.SetHex("0eaebcd1df2df853d66ce0e1b0fda07f67d1cabefde98514aad795b86a6ea66d") + a.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + a.Z.SetHex("01") + aExp.X.SetHex("a45720c272cfa1f77f64be8a404a7d3149bd5410f9a173353f6eb75a5085ba98") + aExp.Y.SetHex("beb26b67d7a00e2447baeccc8a4cef7cd3cad67376ac1c5785aeebb4f6441c16") + aExp.Z.SetHex("01") + aLam := a + aLam.mulLambda(&aLam) + if !aLam.Equals(&aExp) { + t.Error("mul_lambda failed") + } +} + +func TestGejGetX(t *testing.T) { + var a XYZ + var X, exp Field + a.X.SetHex("EB6752420B6BDB40A760AC26ADD7E7BBD080BF1DF6C0B009A0D310E4511BDF49") + a.Y.SetHex("8E8CEB84E1502FC536FFE67967BC44314270A0B38C79865FFED5A85D138DCA6B") + a.Z.SetHex("813925AF112AAB8243F8CCBADE4CC7F63DF387263028DE6E679232A73A7F3C31") + + exp.SetHex("fe00e013c244062847045ae7eb73b03fca583e9aa5dbd030a8fd1c6dfcf11b10") + a.getX(&X) + if !X.Equals(&exp) { + t.Error("get.get_x() fail") + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go new file mode 100755 index 0000000..4b6c0f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_consts.go @@ -0,0 +1,9356 @@ +package secp256k1go + +var fin = XY{X: Field{[10]uint32{0x035871aa, 0x002dc101, 0x0059ab0f, 0x02cb297e, 0x00684bb5, 0x02585764, 0x02f3cceb, 0x002bdca3, 0x03dcb7cc, 0x0013cd56}}, Y: Field{[10]uint32{0x044d069d, 0x0603c088, 0x07541d4e, 0x04a4074d, 0x045fcba8, 0x05f00c34, 0x04bab268, 0x05fd8d65, 0x04e47151, 0x0071e924}}} + +var preG = []XY{ + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x022d4a34, 0x013ea812, 0x0368766e, 0x02b9e6e5, 0x01eb9898, 0x01fab3c8, 0x020fee80, 0x01dd4290, 0x024cdb67, 0x0037bf7a}}, Y: Field{[10]uint32{0x0256eb77, 0x00667da7, 0x000f6cfb, 0x02812a57, 0x02ced1f4, 0x00aa4f6b, 0x017b0ead, 0x0145a3a6, 0x03069463, 0x0010846a}}}, + {X: Field{[10]uint32{0x00385b6c, 0x0159584e, 0x02d27747, 0x03af5fa1, 0x01f06acf, 0x0113d25e, 0x02f5cff4, 0x010f4a4f, 0x00a797a4, 0x000ad3a8}}, Y: Field{[10]uint32{0x01c09b7a, 0x00321539, 0x01763b57, 0x0031409a, 0x031a01f6, 0x02872184, 0x003083b5, 0x01764ecd, 0x03c03794, 0x00217a26}}}, + {X: Field{[10]uint32{0x01be59d5, 0x0102bbc9, 0x01071813, 0x0009c7e0, 0x001d9ad4, 0x0338cccc, 0x013fa332, 0x0049593e, 0x034a4cdd, 0x000d4aef}}, Y: Field{[10]uint32{0x0381998c, 0x034f62f3, 0x0039c67b, 0x00b9c6c4, 0x034a1b3b, 0x03768f87, 0x01c18259, 0x03d4d356, 0x00075348, 0x000c87ad}}}, + {X: Field{[10]uint32{0x02cacc3f, 0x0336b753, 0x03f29dc9, 0x037fbfd7, 0x00e42ab8, 0x0261e449, 0x03001055, 0x03446c08, 0x004d6b38, 0x000be884}}, Y: Field{[10]uint32{0x032b7d67, 0x02e9dad4, 0x02648423, 0x03b3f220, 0x00181d70, 0x02f57760, 0x00569335, 0x036196d9, 0x0068295d, 0x0000b784}}}, + {X: Field{[10]uint32{0x01453714, 0x028335fd, 0x032e269c, 0x02138255, 0x03263c3d, 0x01bb76a0, 0x021a9b06, 0x035a36ac, 0x039b09b4, 0x00249209}}, Y: Field{[10]uint32{0x03cb3402, 0x028cb3a5, 0x012ffe54, 0x00aa21e4, 0x033fc0de, 0x03a8ac7f, 0x01aa71bd, 0x02ab7974, 0x037bf234, 0x001cc05b}}}, + {X: Field{[10]uint32{0x01ee8729, 0x025b510f, 0x015c07e9, 0x00512fd8, 0x022f570e, 0x002fadd4, 0x030132fb, 0x02fc9e39, 0x032be3a8, 0x0036bb53}}, Y: Field{[10]uint32{0x00be1c55, 0x003948a4, 0x02726ab4, 0x00c3cebe, 0x003f83c2, 0x03be35c0, 0x021aca87, 0x0263a352, 0x024a7d6c, 0x0029a773}}}, + {X: Field{[10]uint32{0x0122e7db, 0x00ed7a1f, 0x001b0e6a, 0x03a7f7ca, 0x0011ecd9, 0x02ec67e4, 0x00f28d7c, 0x0204ba2b, 0x02c7065d, 0x00311344}}, Y: Field{[10]uint32{0x020e6482, 0x02418fc3, 0x021c5a03, 0x02187b7d, 0x000e106e, 0x0260bf6b, 0x0045926c, 0x01b371db, 0x0060ce32, 0x00084669}}}, + {X: Field{[10]uint32{0x0269e6b4, 0x031972f4, 0x00063b61, 0x014cdb0a, 0x03152b69, 0x03b58214, 0x01a20cfd, 0x02141322, 0x03f6dc69, 0x001a8916}}, Y: Field{[10]uint32{0x000d8a82, 0x0398d204, 0x03b6efd5, 0x01234108, 0x018b33ba, 0x005a892b, 0x03f5126f, 0x0129c22c, 0x0342c2bd, 0x003808b3}}}, + {X: Field{[10]uint32{0x010bd6a5, 0x02b95fc3, 0x01146f95, 0x002c2fb0, 0x00ce1330, 0x03950421, 0x037e3d2f, 0x03989f01, 0x03a6fd9d, 0x0005a5ff}}, Y: Field{[10]uint32{0x001b2396, 0x03a758f4, 0x00ae7ade, 0x00027926, 0x03a2cf15, 0x01155d0c, 0x0161506e, 0x01bd749d, 0x00f18680, 0x002e70e6}}}, + {X: Field{[10]uint32{0x027a7479, 0x008d17bc, 0x0361df98, 0x0183fedf, 0x019deb83, 0x020d32c3, 0x02d0f07e, 0x01c62e61, 0x03019981, 0x001816f6}}, Y: Field{[10]uint32{0x016b8c49, 0x00787a41, 0x00db43b0, 0x03a13ec5, 0x03c26bfa, 0x0325bf88, 0x0278d93e, 0x03481a06, 0x012de4f8, 0x0000a5cb}}}, + {X: Field{[10]uint32{0x007ff33d, 0x0071fa76, 0x0310cfe3, 0x00d52566, 0x00dcb01c, 0x02885784, 0x002fdc45, 0x02fd25d0, 0x01ab4150, 0x0018b453}}, Y: Field{[10]uint32{0x03b25eaf, 0x01590920, 0x0072235f, 0x00a59ead, 0x0301aa13, 0x003bb436, 0x0088a195, 0x02c04260, 0x02bd8cc5, 0x00203f01}}}, + {X: Field{[10]uint32{0x02308b6f, 0x01570be1, 0x00b425e5, 0x03d5ae6e, 0x032c50e9, 0x0102395a, 0x01b4b06c, 0x009f6b79, 0x02d0040f, 0x00203182}}, Y: Field{[10]uint32{0x030bd57a, 0x0007d590, 0x024eb1aa, 0x0132f9c0, 0x00a65eed, 0x03f9cbdc, 0x0266bad7, 0x030c3c9b, 0x003f1cc5, 0x00070e0c}}}, + {X: Field{[10]uint32{0x0203c8fb, 0x03aaec3e, 0x007049d5, 0x02521f61, 0x004cc5dc, 0x0331534d, 0x034c6348, 0x02b552a9, 0x01ad6167, 0x001ea4dd}}, Y: Field{[10]uint32{0x024dc7f7, 0x01267b08, 0x00e2b02d, 0x028431c3, 0x02bdc59e, 0x0249a411, 0x0159e0d7, 0x01c9a425, 0x03a9eca8, 0x0003438f}}}, + {X: Field{[10]uint32{0x03c3ffc9, 0x0147d166, 0x01f504bb, 0x030e6da3, 0x01bb408e, 0x01511e9e, 0x03a9ed04, 0x02d53241, 0x00d9b696, 0x00354a3b}}, Y: Field{[10]uint32{0x01409933, 0x01196d48, 0x00dbc063, 0x01017148, 0x02bc4345, 0x007f595b, 0x026f2188, 0x0397e665, 0x01253136, 0x003bb3d0}}}, + {X: Field{[10]uint32{0x00b45963, 0x00c6023e, 0x00b13872, 0x017929fb, 0x00526611, 0x023b36b4, 0x025f514e, 0x00d04ba8, 0x00a4b5f4, 0x000124dc}}, Y: Field{[10]uint32{0x02949c9a, 0x00c14a84, 0x02764b65, 0x02beed6d, 0x0254c3f3, 0x004bf58a, 0x03081b05, 0x03b50a2c, 0x0341afd6, 0x001d63cf}}}, + {X: Field{[10]uint32{0x00345d74, 0x004fac7f, 0x018e2f1c, 0x00783852, 0x03881d81, 0x0191c0bb, 0x03df930d, 0x0232ef5c, 0x00936ee8, 0x001dfc8c}}, Y: Field{[10]uint32{0x031c60d6, 0x03acf1d9, 0x037cbbe8, 0x00c365c1, 0x0096c953, 0x02e86cde, 0x008266e9, 0x02d90028, 0x002a7886, 0x002563bd}}}, + {X: Field{[10]uint32{0x0339f530, 0x0214c6dd, 0x00dbaeb2, 0x01d2ae75, 0x0258c800, 0x031f02f3, 0x004887e5, 0x0392e7a9, 0x0191cc4c, 0x003cb6b2}}, Y: Field{[10]uint32{0x003a3c37, 0x005f6e9c, 0x024fd1a1, 0x03ac1663, 0x039eb5fb, 0x03094c77, 0x021f32de, 0x0236b536, 0x009b3b2f, 0x003837b7}}}, + {X: Field{[10]uint32{0x0290d45b, 0x02921431, 0x023debcb, 0x037f276b, 0x025a216c, 0x03894804, 0x00be8fbb, 0x0087ec6d, 0x019f6626, 0x00118ecf}}, Y: Field{[10]uint32{0x02f7307e, 0x00ddec06, 0x01de31cb, 0x01f25c28, 0x03c622e2, 0x036188b5, 0x0114306d, 0x01b0d50c, 0x00d78c29, 0x0017b50c}}}, + {X: Field{[10]uint32{0x0198f247, 0x0125ad26, 0x022d1a32, 0x03050ca2, 0x036b98fa, 0x03ced665, 0x0232d4af, 0x01b8a824, 0x004244e4, 0x003c5be0}}, Y: Field{[10]uint32{0x00e31df6, 0x01e658b1, 0x00e26d65, 0x0309b973, 0x012a6c53, 0x03d38cf6, 0x01206fcd, 0x00fdf84f, 0x019b8220, 0x0033b6af}}}, + {X: Field{[10]uint32{0x011d41d1, 0x03857dc5, 0x03c65369, 0x0056b389, 0x015d2453, 0x010c46bd, 0x0352b7a1, 0x01158ec0, 0x00272dc8, 0x0032bdd5}}, Y: Field{[10]uint32{0x00a04476, 0x03e420c6, 0x032a5c32, 0x02de5888, 0x035f4fa9, 0x01791815, 0x01b643fa, 0x03d7ca90, 0x0260ef35, 0x0032d1d1}}}, + {X: Field{[10]uint32{0x03082120, 0x025ef21b, 0x017c1244, 0x001f2e1b, 0x0344a09c, 0x0265e762, 0x01d0f170, 0x02e61be1, 0x024b282c, 0x00098032}}, Y: Field{[10]uint32{0x027e4b40, 0x02fa51d6, 0x00ef44b0, 0x01d2ad7c, 0x015ac6be, 0x0376ed17, 0x013b03fc, 0x016f5a9a, 0x008753c1, 0x0010466e}}}, + {X: Field{[10]uint32{0x0198e435, 0x00a9dd1a, 0x03dc8c60, 0x0217893d, 0x0001c486, 0x0048882f, 0x00ec53cd, 0x010cb0ce, 0x0272d7e8, 0x001d8d72}}, Y: Field{[10]uint32{0x005b9c61, 0x01dbcc0b, 0x008bad9e, 0x018755c1, 0x034ecfc0, 0x03de39b5, 0x01d5e590, 0x027584f4, 0x00960948, 0x000246d9}}}, + {X: Field{[10]uint32{0x0356cc18, 0x0141d0ef, 0x028fbc1a, 0x00d1e751, 0x02b7f2b3, 0x03bba299, 0x03f4a87d, 0x015c336e, 0x0239f325, 0x001d538c}}, Y: Field{[10]uint32{0x00536683, 0x0366024f, 0x0295d0c5, 0x034065e9, 0x0023ee33, 0x013a9268, 0x00d0ed30, 0x028c3ecf, 0x0386e5bd, 0x00019cfe}}}, + {X: Field{[10]uint32{0x01d9b9e8, 0x009a51a4, 0x0152f9fe, 0x01987472, 0x00330800, 0x00b55c3c, 0x017859c8, 0x03a5abfd, 0x011071a1, 0x0038f9af}}, Y: Field{[10]uint32{0x020e37f5, 0x000abd24, 0x00c41670, 0x00e64fa4, 0x02a5a228, 0x01e68f2d, 0x000aa583, 0x039dbd03, 0x00bba394, 0x00167278}}}, + {X: Field{[10]uint32{0x004aa6eb, 0x011ff73c, 0x01f4b4cc, 0x03ccae8d, 0x01c4ccb1, 0x03dcca61, 0x02e73d88, 0x000ce09a, 0x003d056a, 0x00061ad2}}, Y: Field{[10]uint32{0x0280888b, 0x01e5fe1b, 0x038b4a4a, 0x02422544, 0x0321fb80, 0x0010602a, 0x017446e2, 0x03ddf8b8, 0x0132c67c, 0x000ee54b}}}, + {X: Field{[10]uint32{0x00e0963f, 0x00c85c93, 0x019c91a8, 0x034adcdf, 0x025442e6, 0x012f93dc, 0x0098561f, 0x01b39513, 0x00a6b987, 0x0037e75c}}, Y: Field{[10]uint32{0x02ba2417, 0x0231173c, 0x01da217b, 0x009c83be, 0x02b15722, 0x0370e752, 0x0062b785, 0x01b3357e, 0x01afd84d, 0x00157acb}}}, + {X: Field{[10]uint32{0x00ce7143, 0x019317cd, 0x018995de, 0x013e127b, 0x00ab5255, 0x0177383e, 0x03ca815d, 0x03a1e925, 0x00c23c51, 0x0017b757}}, Y: Field{[10]uint32{0x0399a868, 0x01c1aadc, 0x02905cdc, 0x030345e8, 0x00c13c66, 0x003226b4, 0x028cec03, 0x004c1987, 0x008dbc14, 0x003beba7}}}, + {X: Field{[10]uint32{0x00614fba, 0x034d8be1, 0x0317a722, 0x02870d56, 0x037aa3fb, 0x021fa79d, 0x012fe022, 0x01a0c368, 0x00c2b647, 0x000a41e6}}, Y: Field{[10]uint32{0x01943e7a, 0x000ebf50, 0x023146d0, 0x02536ca8, 0x015b29c0, 0x01e6bc97, 0x00d00bcf, 0x00188662, 0x036dcd44, 0x0038e369}}}, + {X: Field{[10]uint32{0x00053b45, 0x03f7b3bd, 0x0257362d, 0x00bf8d80, 0x01cd2955, 0x00542b0e, 0x00754efa, 0x03d6cc15, 0x023a95d9, 0x002bcf10}}, Y: Field{[10]uint32{0x018fd9c6, 0x03fb7b52, 0x01581bc2, 0x02999e85, 0x00c8cd5a, 0x00d73ed0, 0x013b0e6f, 0x00add26a, 0x03d831eb, 0x003e628f}}}, + {X: Field{[10]uint32{0x0084249a, 0x03fb5436, 0x018df8d2, 0x02c9b73e, 0x0106bb66, 0x026fc9d2, 0x00aa28c9, 0x039d1733, 0x0324d134, 0x001d9b6e}}, Y: Field{[10]uint32{0x03ac5996, 0x0093e5f2, 0x00edd2c9, 0x0197e81b, 0x0097584a, 0x00368e2e, 0x00c88798, 0x03978e37, 0x0152eacb, 0x001d12c4}}}, + {X: Field{[10]uint32{0x011abe3e, 0x00b99986, 0x02a58ce9, 0x013db165, 0x0245f7b4, 0x01e13d05, 0x01277c33, 0x01d66e88, 0x006f8c94, 0x001676fd}}, Y: Field{[10]uint32{0x02307f6e, 0x03885b12, 0x0398cd85, 0x0269e465, 0x0042ce73, 0x0120c268, 0x00ea6ce6, 0x02f0c03d, 0x0144175f, 0x00314d2b}}}, + {X: Field{[10]uint32{0x00fd87b8, 0x03718063, 0x0273cb62, 0x01c46a57, 0x00dd647e, 0x013a692a, 0x01e691e7, 0x0114dcc1, 0x0295103c, 0x003c4eb6}}, Y: Field{[10]uint32{0x02f5733d, 0x021066f6, 0x00257077, 0x0069a9d7, 0x026949e2, 0x020d07cc, 0x03f4bc80, 0x0137998e, 0x03b44ee1, 0x00384e05}}}, + {X: Field{[10]uint32{0x0288522c, 0x01540056, 0x01fb6488, 0x0301baeb, 0x00da1869, 0x01673293, 0x00167a2c, 0x033b41b5, 0x00fa0e8a, 0x001dd52d}}, Y: Field{[10]uint32{0x001163a2, 0x0122d5e1, 0x03cc537a, 0x00d42db2, 0x028d1e4e, 0x00082e3e, 0x00b967c3, 0x02760889, 0x02864e66, 0x000c3a4f}}}, + {X: Field{[10]uint32{0x02262519, 0x00a32678, 0x001d2a68, 0x02577a01, 0x0301858f, 0x02afbe75, 0x03874d46, 0x038122a8, 0x02df5990, 0x00252372}}, Y: Field{[10]uint32{0x0347d57e, 0x028b2b94, 0x031d2cbb, 0x03bef4bb, 0x01df9154, 0x012c6f09, 0x0128a322, 0x03965f57, 0x002537f6, 0x00392469}}}, + {X: Field{[10]uint32{0x017c77ab, 0x00a2a28f, 0x03a15703, 0x03d6b02f, 0x03fb224c, 0x0080bb0d, 0x007b48f8, 0x01b05a27, 0x014450c7, 0x001e5890}}, Y: Field{[10]uint32{0x01b83437, 0x03e96ca7, 0x02c5760a, 0x00147c12, 0x0312507a, 0x00fbdbda, 0x01c1fc13, 0x02d1d835, 0x010ec4ff, 0x000402d8}}}, + {X: Field{[10]uint32{0x03ec47ca, 0x0342144d, 0x0047bb0d, 0x01c896e2, 0x005a1697, 0x01364552, 0x01b16064, 0x012d52c5, 0x00783496, 0x000d4502}}, Y: Field{[10]uint32{0x02293311, 0x03456837, 0x0378b7e7, 0x01f05708, 0x006039e7, 0x03a049ff, 0x01652c48, 0x00151238, 0x03b20562, 0x003bc2be}}}, + {X: Field{[10]uint32{0x03527eaf, 0x010f4fde, 0x007b4429, 0x03ae37de, 0x0193e947, 0x0362f152, 0x01ce2c9d, 0x00f92f1e, 0x00ad6b48, 0x0034f30c}}, Y: Field{[10]uint32{0x02ede0a4, 0x00d36c13, 0x00630afb, 0x018a40d6, 0x023c2ad4, 0x03e5422b, 0x005e9be8, 0x009e3627, 0x0222d827, 0x0022cde2}}}, + {X: Field{[10]uint32{0x00847610, 0x016e83fd, 0x03649397, 0x00f6e44f, 0x032b2982, 0x03fbf822, 0x01c78fcb, 0x00a18338, 0x00478073, 0x00058936}}, Y: Field{[10]uint32{0x00078575, 0x01b8a901, 0x024c8cc0, 0x03d4a0af, 0x02896878, 0x03367532, 0x014448c6, 0x0240f824, 0x00f9b6da, 0x001a1947}}}, + {X: Field{[10]uint32{0x03c61cd4, 0x01ed3f57, 0x007da6df, 0x012d6bc8, 0x00519247, 0x00f98aa6, 0x002c9563, 0x02a289a4, 0x000da955, 0x001ccf3a}}, Y: Field{[10]uint32{0x01c5ea1d, 0x019cef07, 0x00578c54, 0x03808079, 0x023e1ef8, 0x036e7f33, 0x01a4d8b8, 0x037df521, 0x022bd2ba, 0x003d50d6}}}, + {X: Field{[10]uint32{0x001c045c, 0x01637eae, 0x02699ef2, 0x002485c7, 0x038966c5, 0x02f4ed27, 0x01a1c33b, 0x0141933c, 0x00125494, 0x00057651}}, Y: Field{[10]uint32{0x03e4070d, 0x01eefa7b, 0x00685fc3, 0x02eb3aff, 0x03434800, 0x00ee105d, 0x035137b7, 0x00f9c8d3, 0x030b6946, 0x00355bac}}}, + {X: Field{[10]uint32{0x00717940, 0x00e16674, 0x00aaaac1, 0x01f274ae, 0x031c2141, 0x0339c349, 0x012136e5, 0x0399d6d8, 0x00f2ec9d, 0x0028743f}}, Y: Field{[10]uint32{0x0197a629, 0x004b4e70, 0x033d5192, 0x029501c3, 0x02641462, 0x002599fc, 0x02907373, 0x028f2acb, 0x0350bcb5, 0x003b75df}}}, + {X: Field{[10]uint32{0x00b36980, 0x028dccc7, 0x01c06c7c, 0x037ba091, 0x01a790ba, 0x03e136fa, 0x000c0735, 0x0233315e, 0x0215c0af, 0x00388bef}}, Y: Field{[10]uint32{0x0131da06, 0x0341b5df, 0x0399be43, 0x00552591, 0x03a38289, 0x03d4e869, 0x03430a69, 0x03583222, 0x03abad5c, 0x0002a156}}}, + {X: Field{[10]uint32{0x02cfa9b3, 0x02514891, 0x02aa7400, 0x00e51c13, 0x0369635e, 0x004557d7, 0x0213473c, 0x03a3883b, 0x01dd9860, 0x000c4424}}, Y: Field{[10]uint32{0x006d8374, 0x003c2c4a, 0x02685bd8, 0x02993fbb, 0x00871ec5, 0x02301a0c, 0x011f0478, 0x03c13fff, 0x016f87d1, 0x0019b6d9}}}, + {X: Field{[10]uint32{0x02c2dbdf, 0x01f508cb, 0x00078186, 0x02d16a4d, 0x00883928, 0x00f9ab09, 0x01c0442d, 0x02fa26cc, 0x0104d301, 0x000d307f}}, Y: Field{[10]uint32{0x0273abee, 0x008615ee, 0x0043dc53, 0x03bad21d, 0x02d57f1c, 0x0005d04d, 0x03d46f73, 0x006d6552, 0x0285e97b, 0x00025051}}}, + {X: Field{[10]uint32{0x009b8d63, 0x02979ac1, 0x00affcc2, 0x02aef342, 0x028d13f3, 0x015fad0a, 0x014de5b5, 0x01c07070, 0x025d6b54, 0x003c867a}}, Y: Field{[10]uint32{0x000766d1, 0x00a58a90, 0x03fb8d8c, 0x00f01ec9, 0x01f4b08d, 0x03333dac, 0x03af4544, 0x0102c3dc, 0x0157e83d, 0x00132e56}}}, + {X: Field{[10]uint32{0x01a0b448, 0x01a4491a, 0x02708723, 0x0242f298, 0x02543a54, 0x03d17789, 0x03683db8, 0x03eeaac7, 0x000f74a8, 0x0035ee1d}}, Y: Field{[10]uint32{0x02a4593b, 0x0380c57a, 0x009b3411, 0x017b4f01, 0x02ff15db, 0x02b51c5f, 0x0010f337, 0x0324bb84, 0x028128d9, 0x003e9de5}}}, + {X: Field{[10]uint32{0x02a824bf, 0x0134c246, 0x014289fe, 0x00caaf76, 0x02ad5bcd, 0x00e8ccd7, 0x02f7c98d, 0x01bc3be1, 0x00222f8f, 0x000cb4c7}}, Y: Field{[10]uint32{0x022e1661, 0x03452e11, 0x02961118, 0x0279bc9b, 0x022e6dac, 0x016e7876, 0x00d3d791, 0x015b8e73, 0x02f58921, 0x0017cc0c}}}, + {X: Field{[10]uint32{0x018347b5, 0x03e1b2f0, 0x012c4340, 0x01f35656, 0x028793d7, 0x03660c7a, 0x0045a155, 0x02cc99c4, 0x0371914a, 0x001d187c}}, Y: Field{[10]uint32{0x00092ff6, 0x0211ecf3, 0x02ea6b39, 0x03d43261, 0x002eee1f, 0x02a91095, 0x01ddcae0, 0x02fb032f, 0x02238b96, 0x0023b02e}}}, + {X: Field{[10]uint32{0x03b2b2d6, 0x01a62eb5, 0x0053d287, 0x00b0f99d, 0x026d716b, 0x028e081a, 0x0356a25a, 0x021801d0, 0x02db1df1, 0x003b81e6}}, Y: Field{[10]uint32{0x001c8c1e, 0x02b11e7b, 0x00e25eba, 0x026bc131, 0x02a44698, 0x03317e7d, 0x01f37e0e, 0x02f97131, 0x012aafe3, 0x00237090}}}, + {X: Field{[10]uint32{0x029da6b5, 0x036185ae, 0x01dc72bf, 0x00c61d32, 0x03e65de3, 0x03b9883d, 0x03b18302, 0x020fc119, 0x03e447ec, 0x0005bb24}}, Y: Field{[10]uint32{0x01b0674d, 0x019de389, 0x01713962, 0x01a94392, 0x039d5818, 0x02960128, 0x028c2a7c, 0x03ed0343, 0x01150e62, 0x0017918c}}}, + {X: Field{[10]uint32{0x0137bd99, 0x02581975, 0x02aa485b, 0x025fe62d, 0x03d88558, 0x03e9c2da, 0x0178290a, 0x03dbc0e2, 0x0180c245, 0x003aa97e}}, Y: Field{[10]uint32{0x02dc07dc, 0x00104093, 0x0267fb18, 0x0275f9ba, 0x00d78486, 0x03265189, 0x02528391, 0x00b82066, 0x013e292c, 0x003d97d7}}}, + {X: Field{[10]uint32{0x01a49f51, 0x0312dacd, 0x0342ea96, 0x021dc544, 0x0158ae04, 0x028090e6, 0x02ee1910, 0x0304c9a4, 0x0007544a, 0x0001e325}}, Y: Field{[10]uint32{0x00a3ddb4, 0x019d7c65, 0x00d2462b, 0x0160f019, 0x00fa1fbd, 0x00e6979a, 0x00047955, 0x026e1755, 0x019169eb, 0x003cf80c}}}, + {X: Field{[10]uint32{0x002857a5, 0x015e365c, 0x00688726, 0x02b9e9bf, 0x0001cdc8, 0x00c6ba80, 0x01cd8384, 0x029dc05b, 0x03e219a1, 0x001253d2}}, Y: Field{[10]uint32{0x000d562c, 0x012c0c62, 0x02d6e55f, 0x00c35d9f, 0x02f925ce, 0x038dae8a, 0x03a7f075, 0x0297cce6, 0x02969283, 0x0010890a}}}, + {X: Field{[10]uint32{0x001fe9b5, 0x03079997, 0x0270ebf4, 0x03a963ea, 0x01d28211, 0x0113a952, 0x007f2f51, 0x0361b1af, 0x00030da6, 0x0029662a}}, Y: Field{[10]uint32{0x01864e6b, 0x009b6f4b, 0x0386a100, 0x02d96cd7, 0x0023fc63, 0x001cdebb, 0x00b4a714, 0x00b0c1f9, 0x016f8482, 0x000812d7}}}, + {X: Field{[10]uint32{0x00595997, 0x02b70f96, 0x00a184db, 0x003c495c, 0x00208f02, 0x036fabfb, 0x0192f5f2, 0x00ad7424, 0x02365abb, 0x00310645}}, Y: Field{[10]uint32{0x00fa9913, 0x01ba5ad6, 0x03fc0ed1, 0x01143cd2, 0x01d5caf9, 0x02261262, 0x01245b32, 0x01fbe927, 0x0351d008, 0x00013c50}}}, + {X: Field{[10]uint32{0x00742881, 0x01ce9545, 0x02acfe4c, 0x034b828d, 0x0392a2e0, 0x0280ef16, 0x0324604d, 0x03e91d69, 0x0063a586, 0x00210758}}, Y: Field{[10]uint32{0x028d6154, 0x00db7806, 0x0169ce7a, 0x0359d130, 0x00e62562, 0x01d50da6, 0x004f9a1c, 0x0167a064, 0x03f59c06, 0x0001ce19}}}, + {X: Field{[10]uint32{0x030e20d5, 0x004ab135, 0x03e4ded1, 0x020424a2, 0x03282b33, 0x0226f78b, 0x0026947f, 0x01c74dd8, 0x03399a69, 0x0017a56e}}, Y: Field{[10]uint32{0x02012865, 0x00e131d1, 0x0238b161, 0x03b5f62e, 0x01a99c9a, 0x004c4ddd, 0x03fc7118, 0x00216fba, 0x03366809, 0x000e7c8f}}}, + {X: Field{[10]uint32{0x00ef2f66, 0x011c6f28, 0x01d8bf99, 0x0192d4c5, 0x025ec075, 0x027f65d3, 0x0039f8a9, 0x023f51db, 0x001a5394, 0x000db919}}, Y: Field{[10]uint32{0x014c78fc, 0x01473d5a, 0x023e06fd, 0x0124ff55, 0x0056ea13, 0x01726aa5, 0x00227b08, 0x013ae059, 0x031b1abe, 0x00349092}}}, + {X: Field{[10]uint32{0x0179f726, 0x02c9f0b1, 0x0114faea, 0x01085c3a, 0x00f56438, 0x0141e907, 0x00191a2f, 0x02eeca43, 0x001ea7bf, 0x0000cd96}}, Y: Field{[10]uint32{0x02fda224, 0x03372af4, 0x01e0ef3d, 0x00504334, 0x0391f7ab, 0x01b95acc, 0x0252129b, 0x0386fa64, 0x0168595f, 0x003ab448}}}, + {X: Field{[10]uint32{0x03d43ede, 0x01d09c1a, 0x010c4849, 0x0097b5a2, 0x00037810, 0x03c03b21, 0x032634fc, 0x035ada87, 0x0016dadf, 0x0022ae26}}, Y: Field{[10]uint32{0x01cdd24e, 0x011ea44a, 0x0045858a, 0x0270fa26, 0x03503d45, 0x018904db, 0x02654aef, 0x03428113, 0x0309f2f6, 0x001bf73b}}}, + {X: Field{[10]uint32{0x00c5fb94, 0x0100a12e, 0x032544bb, 0x023a2b3f, 0x0220b093, 0x00a67f2a, 0x033344d9, 0x0315de04, 0x01a746c9, 0x00078cfc}}, Y: Field{[10]uint32{0x03f3b3b6, 0x029f4815, 0x03010e33, 0x0083c740, 0x032306d3, 0x03493b7f, 0x008ed618, 0x006ceaa7, 0x00257dd1, 0x00018198}}}, + {X: Field{[10]uint32{0x00f08f31, 0x000d87f6, 0x00fcfa41, 0x0330632f, 0x020ed1f4, 0x01e77482, 0x03f30ded, 0x0306dfb9, 0x01dcb3ce, 0x00216df0}}, Y: Field{[10]uint32{0x02999511, 0x03b4f0d7, 0x02633c6f, 0x0062575e, 0x00fcafad, 0x02a211fd, 0x01048f25, 0x03750fce, 0x01cdd026, 0x000f662a}}}, + {X: Field{[10]uint32{0x01ac5f51, 0x00a00198, 0x03af872a, 0x00ee1e29, 0x017fbe9a, 0x0175b517, 0x035f4b12, 0x01194249, 0x03bd8d9e, 0x000a77e7}}, Y: Field{[10]uint32{0x0227d84b, 0x021dbaca, 0x01e55cd2, 0x02187006, 0x03da61dc, 0x01e44e7f, 0x02d88621, 0x016981b8, 0x03e99c77, 0x0002d313}}}, + {X: Field{[10]uint32{0x01fce252, 0x00acb912, 0x0105c808, 0x028bdda0, 0x03dfe58c, 0x02abe2b7, 0x02a6e671, 0x0211e8ff, 0x02e06b0a, 0x00282c72}}, Y: Field{[10]uint32{0x02296cf2, 0x0012540e, 0x030e650f, 0x0060d2bf, 0x026b72da, 0x01e9a8a3, 0x00b19d91, 0x002563b1, 0x0102edde, 0x002b90d0}}}, + {X: Field{[10]uint32{0x00e121e5, 0x00fcb930, 0x03e4ba11, 0x02cec84c, 0x01b499df, 0x03a100a5, 0x01c7ff67, 0x03a684db, 0x02afb9b3, 0x00013a33}}, Y: Field{[10]uint32{0x0326683c, 0x01f398a8, 0x00502b82, 0x01a98d18, 0x01422c08, 0x0133971e, 0x008f6d53, 0x01b5e92d, 0x00118c8b, 0x0033c85d}}}, + {X: Field{[10]uint32{0x0389a33b, 0x01c970ad, 0x00919f42, 0x01a26804, 0x000a5076, 0x028bda42, 0x03b81c7c, 0x026dbd6b, 0x00e047e1, 0x00349291}}, Y: Field{[10]uint32{0x03ea8fa3, 0x03b105eb, 0x0244d2cd, 0x01a21ee0, 0x01013f99, 0x0303c71a, 0x03db50f1, 0x01be3f18, 0x01591b46, 0x001bee35}}}, + {X: Field{[10]uint32{0x023b35d4, 0x013a63a3, 0x0377b510, 0x00a2aeea, 0x00001edd, 0x032e6561, 0x01fdfcfa, 0x02737492, 0x006a7a6c, 0x003a8058}}, Y: Field{[10]uint32{0x023ea98d, 0x01948622, 0x03700cfd, 0x012f0a08, 0x01b7d449, 0x01e9ecf3, 0x03fe369f, 0x004ac33e, 0x00908c73, 0x000c8abd}}}, + {X: Field{[10]uint32{0x00e2131f, 0x0065b7a3, 0x031be4ad, 0x036317a8, 0x01252007, 0x03ae5994, 0x02328655, 0x007229b1, 0x01bf2b66, 0x002be2b7}}, Y: Field{[10]uint32{0x01749700, 0x03ef36dc, 0x02ac8f3d, 0x021a0389, 0x03252081, 0x0025a0da, 0x0034eafd, 0x0217d4a8, 0x027c029b, 0x0019d279}}}, + {X: Field{[10]uint32{0x00f45889, 0x03c38d14, 0x0215e722, 0x036af3f2, 0x01a674a3, 0x0383ec59, 0x00516d47, 0x01b281b3, 0x02197456, 0x000038eb}}, Y: Field{[10]uint32{0x030bd6a4, 0x0029cbba, 0x01f53342, 0x0121d3e0, 0x000de97e, 0x03d341cc, 0x0217f07b, 0x01440458, 0x027e4531, 0x000abaaf}}}, + {X: Field{[10]uint32{0x0397e246, 0x03aa33b4, 0x00802075, 0x03cfb496, 0x0301993f, 0x03b478f8, 0x036993ff, 0x0265c873, 0x0355313d, 0x001647b8}}, Y: Field{[10]uint32{0x03e5d196, 0x0263c692, 0x022bdeee, 0x014f4972, 0x001ff0b0, 0x011831e4, 0x00fc4775, 0x00c2fa98, 0x018a113c, 0x002c3a95}}}, + {X: Field{[10]uint32{0x01b52984, 0x033c0c95, 0x00945077, 0x0391ec21, 0x01fa8584, 0x02363698, 0x01aa9731, 0x013127c6, 0x0155fda5, 0x00044e5b}}, Y: Field{[10]uint32{0x03ea57a4, 0x019efaa4, 0x03be4c57, 0x02c06c95, 0x004ff536, 0x01efad1d, 0x01d5833a, 0x02b004a2, 0x00a8cd45, 0x0026631d}}}, + {X: Field{[10]uint32{0x0017aa7a, 0x010055f8, 0x00b64055, 0x0151a1d5, 0x038dcdfd, 0x02783102, 0x0000738c, 0x01685e40, 0x021ba39c, 0x000f174a}}, Y: Field{[10]uint32{0x001bd257, 0x01e72932, 0x00f6661f, 0x027f749c, 0x000f9b8b, 0x01bf062e, 0x014de739, 0x00d38be7, 0x0279995a, 0x002c8a10}}}, + {X: Field{[10]uint32{0x013cc030, 0x03be285e, 0x00078425, 0x02bec12b, 0x03fbc395, 0x027cba70, 0x0299a729, 0x0037be8e, 0x00b8a60a, 0x003321c1}}, Y: Field{[10]uint32{0x001f1b13, 0x02dd38eb, 0x01c4e940, 0x013f12f3, 0x00f395b7, 0x02cd1fe3, 0x01e0862d, 0x005e2074, 0x0039feed, 0x002f7518}}}, + {X: Field{[10]uint32{0x0089b197, 0x010466ca, 0x02e7ea20, 0x03f3314f, 0x017dd4de, 0x032b4a6e, 0x01777ac5, 0x0156ab36, 0x00f7ea85, 0x00314cf9}}, Y: Field{[10]uint32{0x03596096, 0x0383d17a, 0x03a26bb8, 0x02ed292c, 0x02d9b925, 0x03c690e8, 0x02fb6242, 0x037d0a68, 0x016bc5ef, 0x001bc289}}}, + {X: Field{[10]uint32{0x03da6593, 0x01b5238c, 0x03bbcf56, 0x00d3bb01, 0x0269ba8c, 0x000f325a, 0x01f6d08d, 0x01f5bc42, 0x00f2ccb2, 0x0003053e}}, Y: Field{[10]uint32{0x03dc3a38, 0x02192444, 0x035e6c0e, 0x03742601, 0x0075b740, 0x03f870a1, 0x00473e16, 0x0263dff5, 0x02923bb3, 0x0030d675}}}, + {X: Field{[10]uint32{0x0390e6ef, 0x007dcb82, 0x0321ce44, 0x03b5d7e3, 0x024c9739, 0x0285c456, 0x0024789f, 0x029142eb, 0x03046bc6, 0x0029b2f0}}, Y: Field{[10]uint32{0x03fa9b9f, 0x00abf585, 0x00313986, 0x01cf1c18, 0x0360ceb5, 0x0303e568, 0x030619e2, 0x02226ec4, 0x03f4680e, 0x000086b9}}}, + {X: Field{[10]uint32{0x0143cc38, 0x02ce7e67, 0x01ce6344, 0x00099f44, 0x03130a3c, 0x0166c72b, 0x03b86c13, 0x02249faf, 0x019a02c4, 0x000d1f5b}}, Y: Field{[10]uint32{0x01c74448, 0x027fc78c, 0x00cb1268, 0x02da1e1c, 0x006d565a, 0x03b24bc2, 0x0187f6ec, 0x01493472, 0x0361a353, 0x00183a9f}}}, + {X: Field{[10]uint32{0x0372656a, 0x03bdd0de, 0x008cf855, 0x02c6fcc7, 0x02d47c67, 0x017bd619, 0x037dcb37, 0x02e3660f, 0x01d2181d, 0x00369951}}, Y: Field{[10]uint32{0x03dc208a, 0x02a092dd, 0x03d897fe, 0x006d24d6, 0x01667305, 0x015a0317, 0x038f07ce, 0x01e29e79, 0x0315ab68, 0x00126e59}}}, + {X: Field{[10]uint32{0x03eb1111, 0x016652e3, 0x03146b9d, 0x02517595, 0x03ec25d6, 0x00271b79, 0x03b81483, 0x00b2c684, 0x03cc9d01, 0x003101d1}}, Y: Field{[10]uint32{0x020fa2d4, 0x03a0c0df, 0x014e1bb5, 0x0055ae54, 0x025db936, 0x032d2255, 0x01e6caf2, 0x0284bf1b, 0x00753be2, 0x00172958}}}, + {X: Field{[10]uint32{0x037f3502, 0x000fbd00, 0x03d34c82, 0x01c4cd22, 0x00338c7f, 0x03a1c39e, 0x033a610b, 0x025e6333, 0x00ec82c9, 0x001390b2}}, Y: Field{[10]uint32{0x03606437, 0x0111cda4, 0x03cc40a9, 0x01133152, 0x01a54921, 0x01de0cd0, 0x028b33a0, 0x03ee4a9e, 0x034ee5e0, 0x001d5c75}}}, + {X: Field{[10]uint32{0x030dedea, 0x008a86ce, 0x03432875, 0x036c3219, 0x02d251ca, 0x03dc2c8d, 0x02ba2e1a, 0x01abe08e, 0x037089bc, 0x000ddd6a}}, Y: Field{[10]uint32{0x01018cf7, 0x03658502, 0x02a2c42a, 0x01efde9d, 0x03ac8db1, 0x00a33e9f, 0x039736a8, 0x002762f2, 0x0107bcfa, 0x002f94b4}}}, + {X: Field{[10]uint32{0x02f74e26, 0x01678fa0, 0x03a88469, 0x01744c52, 0x02d95459, 0x034f5dd6, 0x014fb814, 0x03b0de76, 0x00bf7e34, 0x0033b8c7}}, Y: Field{[10]uint32{0x003b1c6d, 0x01228071, 0x014d80f4, 0x002f853b, 0x020149ef, 0x02f3dafe, 0x03947ae2, 0x0162709a, 0x0214c06b, 0x0023f592}}}, + {X: Field{[10]uint32{0x00b47986, 0x00680742, 0x02befcdc, 0x03f516c7, 0x02fddb58, 0x03ad5193, 0x036ea6a4, 0x0245d867, 0x02ea09b6, 0x002d3e7a}}, Y: Field{[10]uint32{0x0200682a, 0x02a2b01c, 0x0142eb24, 0x03004b29, 0x038bb131, 0x03185c9b, 0x033a4f18, 0x0152c1d0, 0x01925b5a, 0x000e7972}}}, + {X: Field{[10]uint32{0x02bcc60e, 0x0241de4b, 0x00cc1b77, 0x016bf0f7, 0x0284e251, 0x019b4c33, 0x0179a489, 0x03e48e80, 0x01fc3d2d, 0x0035098f}}, Y: Field{[10]uint32{0x02208d54, 0x0193848a, 0x00f7fae1, 0x01d82b5b, 0x0189e127, 0x01614f38, 0x0230d629, 0x023facc3, 0x0307a0f7, 0x0018b7eb}}}, + {X: Field{[10]uint32{0x017612c4, 0x00fbb6a2, 0x01e42223, 0x0302928b, 0x000032ac, 0x024c215f, 0x00d35eb6, 0x0299693e, 0x0124820f, 0x0012115d}}, Y: Field{[10]uint32{0x01bd0f77, 0x01daaa92, 0x00a9ae7a, 0x01f6cb58, 0x03dc6cc0, 0x03e870b9, 0x033c38a1, 0x01e7661c, 0x00ab3679, 0x000969d2}}}, + {X: Field{[10]uint32{0x011cceda, 0x0285d9f0, 0x0123f367, 0x0246454a, 0x02045e19, 0x00abf7f0, 0x01644f3a, 0x007cb2c4, 0x03188110, 0x0037fbbb}}, Y: Field{[10]uint32{0x029a7517, 0x020eb826, 0x03dff16a, 0x039d2d2e, 0x00c390bd, 0x0259e4f0, 0x0020bab3, 0x03810be5, 0x0056cf1d, 0x003b3edc}}}, + {X: Field{[10]uint32{0x00fae859, 0x00b7e0ee, 0x00ed36c8, 0x02f1818b, 0x035d89bc, 0x007ce260, 0x0173f44e, 0x03e0dcf1, 0x02b17543, 0x001b5fbd}}, Y: Field{[10]uint32{0x02712d10, 0x02c64372, 0x000bbf74, 0x02566cb6, 0x00c521a0, 0x01ffaa6f, 0x02fa10c5, 0x02261b7f, 0x02c33543, 0x00335143}}}, + {X: Field{[10]uint32{0x0204541f, 0x0096bd9b, 0x007035af, 0x024c8955, 0x03f3c88b, 0x02647cb8, 0x00500d3b, 0x029689a1, 0x01d59102, 0x0039d581}}, Y: Field{[10]uint32{0x03fad125, 0x0026438a, 0x00693836, 0x0314c22c, 0x014f729a, 0x0211cf8c, 0x039b4872, 0x007b9502, 0x0354a8f7, 0x003d7151}}}, + {X: Field{[10]uint32{0x01ed620c, 0x010ffbec, 0x008457dd, 0x0182af8e, 0x019a0c2e, 0x014082f2, 0x02be453d, 0x03ea81a8, 0x020f4c4d, 0x003ae619}}, Y: Field{[10]uint32{0x0099223e, 0x03d10400, 0x0131ce85, 0x022a5044, 0x00a0a7cd, 0x0349b348, 0x009af3ad, 0x02e14818, 0x00876d9c, 0x001b2e6a}}}, + {X: Field{[10]uint32{0x00dba942, 0x0158f8ee, 0x00336dc3, 0x01a50622, 0x02215459, 0x024ac664, 0x039f2e68, 0x00534d64, 0x03027d85, 0x0004fa1e}}, Y: Field{[10]uint32{0x02b8adf1, 0x00355591, 0x02beb257, 0x0295a35a, 0x02ac2b9d, 0x02fc7a46, 0x01624114, 0x029b7b17, 0x03c68059, 0x003fbd68}}}, + {X: Field{[10]uint32{0x01e5764a, 0x011245a4, 0x0308e7bf, 0x00dc7389, 0x0125424b, 0x016f9bf0, 0x0038f06a, 0x01bf805f, 0x0026e9fd, 0x003b858c}}, Y: Field{[10]uint32{0x016c62b2, 0x00c3682b, 0x02623e54, 0x03e856e5, 0x00f49ae3, 0x01c343d6, 0x0194ccc6, 0x0358710f, 0x010f255d, 0x0006b2c9}}}, + {X: Field{[10]uint32{0x03af3d80, 0x00b976cc, 0x02799993, 0x010d4161, 0x031e626d, 0x030b7226, 0x01e3a750, 0x007935e3, 0x01ef9ad5, 0x002c9a3d}}, Y: Field{[10]uint32{0x0216e423, 0x03a51684, 0x01614003, 0x013f5064, 0x018cf0d3, 0x03077b80, 0x01f77d41, 0x02e7aec6, 0x014b3c99, 0x0017cc43}}}, + {X: Field{[10]uint32{0x03c4750d, 0x03ff6ea4, 0x02ea3bf7, 0x0072a673, 0x002b02f0, 0x01b1eff9, 0x03ad85eb, 0x03c0d7a7, 0x03118a9d, 0x003fc1fc}}, Y: Field{[10]uint32{0x02d1f0d8, 0x00342633, 0x02ddd474, 0x0084538b, 0x01c1d294, 0x03b32eb7, 0x00440c38, 0x01628e97, 0x02d603e8, 0x0010e04d}}}, + {X: Field{[10]uint32{0x02b526a1, 0x03a30f38, 0x01ebec16, 0x02783609, 0x02a4b9f6, 0x03ed962f, 0x006fd20f, 0x014a8d05, 0x0055c7c0, 0x002362e6}}, Y: Field{[10]uint32{0x03036758, 0x00b9fd18, 0x03ceb30e, 0x03fb9475, 0x004bcf50, 0x0213a935, 0x03af44fb, 0x01e7e49a, 0x01eedc2d, 0x00336d56}}}, + {X: Field{[10]uint32{0x01a32b63, 0x0098c603, 0x031eba54, 0x033b2a46, 0x03e4b851, 0x01eb89b7, 0x029d472d, 0x02fc16fe, 0x035384df, 0x0014b6c2}}, Y: Field{[10]uint32{0x00a7b375, 0x012da761, 0x0279de92, 0x0240a1d5, 0x03b3180c, 0x01b6e7d5, 0x02baf66a, 0x0397508f, 0x017d050e, 0x00030ee6}}}, + {X: Field{[10]uint32{0x03d43352, 0x0150efb2, 0x008c6fff, 0x030fcfe9, 0x007d0f29, 0x02024673, 0x01efd24e, 0x007698e5, 0x0090d3d5, 0x00398be5}}, Y: Field{[10]uint32{0x00cafa7d, 0x001eff67, 0x02f5170e, 0x01647c76, 0x02f342c8, 0x031a0a18, 0x002ca280, 0x01ac2c8b, 0x017ba487, 0x001b626b}}}, + {X: Field{[10]uint32{0x02ab1193, 0x039f596a, 0x014fd6d8, 0x03d72dec, 0x011afa2f, 0x03ddf406, 0x03509c88, 0x0266d255, 0x022476b3, 0x001fcc3a}}, Y: Field{[10]uint32{0x037acaec, 0x03d2ffd8, 0x03e9880e, 0x02d9ec40, 0x01daff7b, 0x03d8c47a, 0x015389a5, 0x032530ec, 0x03d4b231, 0x003297bd}}}, + {X: Field{[10]uint32{0x000b7a00, 0x0280d860, 0x01d9ac60, 0x02d28774, 0x03ef0fb7, 0x029b240f, 0x02210fad, 0x0053ed1a, 0x031e1d9f, 0x0014263f}}, Y: Field{[10]uint32{0x0117ddc0, 0x016c4cbf, 0x03e5362a, 0x01035837, 0x02b3ee1b, 0x01d50801, 0x00d37c6e, 0x0323e021, 0x0141d81f, 0x00025cc4}}}, + {X: Field{[10]uint32{0x0378ad58, 0x00b20789, 0x01c96b9f, 0x03333911, 0x02e2f3c4, 0x0272fbe9, 0x0095be6b, 0x0144a9ca, 0x007de9ee, 0x000cade3}}, Y: Field{[10]uint32{0x00c8753c, 0x01c8dde5, 0x0275ba49, 0x0151eb88, 0x0073bb80, 0x038a0983, 0x03c3896e, 0x01c78cbb, 0x01f513df, 0x003b8612}}}, + {X: Field{[10]uint32{0x0147a4f7, 0x01605541, 0x01fc074b, 0x03c209a7, 0x00e37d50, 0x01f1cac3, 0x036eef2a, 0x027ef341, 0x00fddc8e, 0x0038b2dd}}, Y: Field{[10]uint32{0x005cc4a4, 0x006af2c0, 0x012be864, 0x038d848b, 0x03addea9, 0x01cdbac2, 0x022df062, 0x034891e9, 0x02d71c9d, 0x0034ea8b}}}, + {X: Field{[10]uint32{0x010ae3a8, 0x00366734, 0x00b141be, 0x00d7c8d7, 0x0026009a, 0x01aacd5d, 0x01c29949, 0x035efb6b, 0x007566d4, 0x00210e11}}, Y: Field{[10]uint32{0x02dd791f, 0x00109acb, 0x01c4f239, 0x01e4198c, 0x0334ef0d, 0x01ab4cc1, 0x0101ac5e, 0x00293697, 0x02091698, 0x00313840}}}, + {X: Field{[10]uint32{0x0311d67e, 0x019720b1, 0x00b878ab, 0x0311bd98, 0x030587d9, 0x01b0c221, 0x0184c6fc, 0x00080e6d, 0x0088b894, 0x001058b5}}, Y: Field{[10]uint32{0x00852649, 0x011eb968, 0x0295dbda, 0x00ae12d3, 0x03c1732f, 0x03ee28eb, 0x02f22c25, 0x00a27ddd, 0x02903236, 0x0019c58f}}}, + {X: Field{[10]uint32{0x035f683d, 0x02e9292f, 0x010684f3, 0x01ebb0f9, 0x00175d76, 0x0373d53f, 0x0389bfd2, 0x003cd3c3, 0x03a84caf, 0x000feb4f}}, Y: Field{[10]uint32{0x03e61826, 0x0083bf37, 0x012a53fa, 0x01cb9f43, 0x030cf718, 0x031c629c, 0x030ca647, 0x0101eecb, 0x007cb6cc, 0x0003346f}}}, + {X: Field{[10]uint32{0x02b1a86b, 0x0254cbeb, 0x0398f1c6, 0x02fc4dc1, 0x02c1fb84, 0x00174205, 0x00c1a7ce, 0x01e8015a, 0x0200a300, 0x0019d3c9}}, Y: Field{[10]uint32{0x020d38a5, 0x03bb31a7, 0x02259e09, 0x03682c60, 0x0370db57, 0x00011602, 0x0343b257, 0x00cecfb7, 0x01f9413f, 0x000a6748}}}, + {X: Field{[10]uint32{0x02e9f08f, 0x034a6f57, 0x00bcff87, 0x031a49c5, 0x023d82d6, 0x007ecec9, 0x01b815ad, 0x01d2aee0, 0x01a54ade, 0x0034cbd3}}, Y: Field{[10]uint32{0x033eea87, 0x0105a442, 0x01d582fc, 0x0114d4d6, 0x0382e14f, 0x00165c1d, 0x0299016c, 0x014ee5a3, 0x02738b8e, 0x003e50a7}}}, + {X: Field{[10]uint32{0x03ce3ff6, 0x02553c78, 0x008cb1ed, 0x00c7dcac, 0x036fbb69, 0x00d61174, 0x01936571, 0x021555b9, 0x02704353, 0x000c3939}}, Y: Field{[10]uint32{0x0388db7b, 0x0169567a, 0x0340dc69, 0x00d769c1, 0x010a878d, 0x00eef26c, 0x01935011, 0x02618e12, 0x03ce6198, 0x00118be6}}}, + {X: Field{[10]uint32{0x00cad297, 0x01c6c135, 0x0180bf19, 0x0042c079, 0x027f3dcd, 0x00c3937b, 0x02829043, 0x0330c011, 0x02003c51, 0x002f8818}}, Y: Field{[10]uint32{0x01ccb9bc, 0x0163b5cb, 0x002a0d55, 0x0242415a, 0x01b1c610, 0x01387195, 0x033d48a7, 0x03950a15, 0x03c49d61, 0x00188622}}}, + {X: Field{[10]uint32{0x035df04a, 0x026167ff, 0x01993c41, 0x0298077d, 0x01cb6e84, 0x030abc84, 0x01e0fb9a, 0x01147b4a, 0x0023ace3, 0x0024c511}}, Y: Field{[10]uint32{0x0037b47c, 0x00a9b44c, 0x039d1d90, 0x0093dcae, 0x00f10652, 0x01e6480e, 0x031a3f9d, 0x01097d71, 0x03b164c3, 0x001f0437}}}, + {X: Field{[10]uint32{0x017b112c, 0x01906305, 0x012a7cb6, 0x00171edf, 0x01978292, 0x030d3ee0, 0x01ca26d6, 0x032f73c8, 0x00044f5f, 0x002c057e}}, Y: Field{[10]uint32{0x023a1d5f, 0x03a85153, 0x008c1d3a, 0x01bea8c2, 0x003b3cdc, 0x037e357e, 0x00a655b2, 0x03a04dd1, 0x02086d04, 0x002ae307}}}, + {X: Field{[10]uint32{0x01a21b52, 0x03cabcd0, 0x000d36b3, 0x03795e85, 0x024f8a18, 0x0291968e, 0x00868117, 0x025f6279, 0x01da649d, 0x00357a78}}, Y: Field{[10]uint32{0x0327447a, 0x017a164b, 0x0080d895, 0x01708901, 0x03169346, 0x03537436, 0x01a13cc1, 0x03b5cc44, 0x0037f391, 0x00132c11}}}, + {X: Field{[10]uint32{0x036966bb, 0x0294c5b4, 0x02d6f996, 0x0335cb85, 0x01983005, 0x02e6490e, 0x03f8ed77, 0x03281976, 0x01047dd7, 0x0034eb90}}, Y: Field{[10]uint32{0x0125ac46, 0x00370534, 0x00a614b1, 0x035f7c2b, 0x0164f8cd, 0x0105f1b6, 0x010f0303, 0x03aec8a8, 0x0321ad22, 0x002f46ba}}}, + {X: Field{[10]uint32{0x0097b065, 0x002be1f2, 0x037b49f8, 0x002a0b8d, 0x0087197d, 0x02003c29, 0x026cdd22, 0x03e563f1, 0x0363d885, 0x00118f89}}, Y: Field{[10]uint32{0x02f7ca7f, 0x026499c7, 0x03508b79, 0x0187ef25, 0x0326b80c, 0x0137818a, 0x03a311a9, 0x003f5f7c, 0x00db0e5d, 0x002ffbeb}}}, + {X: Field{[10]uint32{0x00641917, 0x0377f244, 0x0347c83c, 0x03102ff9, 0x0158e597, 0x02d8fb0c, 0x0353ec1b, 0x00159f1b, 0x01fd127c, 0x001e617f}}, Y: Field{[10]uint32{0x0332ed03, 0x016f559f, 0x0308703a, 0x00783b19, 0x0124ed29, 0x038a26bb, 0x0325fe1d, 0x0218bbca, 0x02daf3d9, 0x00180f04}}}, + {X: Field{[10]uint32{0x027703e9, 0x03c550f6, 0x02d0ed5f, 0x0272e0f4, 0x019e74c5, 0x003ab1fe, 0x01d24941, 0x038e76cb, 0x016b5f76, 0x001d286b}}, Y: Field{[10]uint32{0x00e0db08, 0x00dff5e4, 0x00c33d57, 0x01a250ba, 0x00093e09, 0x00c6efa8, 0x0193d836, 0x0318f358, 0x03ef18c9, 0x00331855}}}, + {X: Field{[10]uint32{0x022f6da3, 0x034225ac, 0x03463a71, 0x00b1c9d1, 0x03c9bab4, 0x02e866df, 0x01416664, 0x01d7d80b, 0x02507033, 0x000c1a0a}}, Y: Field{[10]uint32{0x03a22ff8, 0x0053665d, 0x0273f177, 0x0383c672, 0x036290d0, 0x00c474c5, 0x00f39e7f, 0x02d3e9b2, 0x00f6b018, 0x00154f81}}}, + {X: Field{[10]uint32{0x0369ef57, 0x01b04d1d, 0x0352b1ee, 0x00ac9193, 0x03654e7a, 0x03e9e565, 0x03791efe, 0x0357c9b0, 0x00f0d7c0, 0x00278856}}, Y: Field{[10]uint32{0x01008373, 0x03efc98a, 0x038509e2, 0x023bcd68, 0x029ffd7c, 0x03e9dd8b, 0x003a3481, 0x014fc240, 0x00dd1b90, 0x0001c4bf}}}, + {X: Field{[10]uint32{0x02327d66, 0x0215fcef, 0x03ce7322, 0x019b8f13, 0x028172e5, 0x00094e30, 0x024029c2, 0x03273fae, 0x02989a43, 0x0005db89}}, Y: Field{[10]uint32{0x03a4b1c3, 0x01e0d307, 0x009ee7b4, 0x007d3bb8, 0x019aefd3, 0x023710f0, 0x0270b487, 0x03ae1df4, 0x01d04b29, 0x003b6332}}}, + {X: Field{[10]uint32{0x00374da8, 0x011e2314, 0x00f1b700, 0x00e4f7f1, 0x02cf1892, 0x00eb5d1f, 0x02bb89a1, 0x0079b9a2, 0x02fea377, 0x001d751b}}, Y: Field{[10]uint32{0x02a6bed8, 0x011c9961, 0x02e1a3ca, 0x008544d1, 0x00d7efc2, 0x02ce6a1a, 0x00b86fd2, 0x01d9e7f4, 0x010a9950, 0x0026148e}}}, + {X: Field{[10]uint32{0x01605721, 0x00c67d91, 0x029345b7, 0x00114721, 0x032310fb, 0x0097db57, 0x0298c4c8, 0x02403fed, 0x00c67d64, 0x00202688}}, Y: Field{[10]uint32{0x00e286c1, 0x03e97cfe, 0x03e6a5eb, 0x03315258, 0x003d096c, 0x01fe8105, 0x02b06192, 0x01f88add, 0x0180d991, 0x0027a652}}}, + {X: Field{[10]uint32{0x0172c180, 0x018d11be, 0x023528d5, 0x0073ca71, 0x03defece, 0x02b1c20f, 0x00500b4e, 0x03c453b5, 0x003a43f7, 0x0006ce24}}, Y: Field{[10]uint32{0x02f408f9, 0x02504676, 0x0272ad33, 0x01adbd76, 0x022708b2, 0x0354f792, 0x0353f77f, 0x002ba224, 0x01c931a6, 0x00100dbb}}}, + {X: Field{[10]uint32{0x00feef23, 0x01b1621a, 0x0166df4e, 0x0338b41d, 0x03263458, 0x03e8fbf9, 0x00b4e8dd, 0x012e7aac, 0x01b6eb29, 0x00242a03}}, Y: Field{[10]uint32{0x03cf91e6, 0x031dba4b, 0x01681442, 0x02c9eef6, 0x035ee050, 0x0278a4da, 0x0321145d, 0x03c6361f, 0x039f9754, 0x001d4f22}}}, + {X: Field{[10]uint32{0x036bea9b, 0x009751cd, 0x0146e6dc, 0x00152851, 0x023e6f36, 0x03d80d03, 0x01625460, 0x0166604b, 0x03844b70, 0x0030b203}}, Y: Field{[10]uint32{0x02a79c64, 0x02f5120e, 0x00f6123a, 0x029c0ad3, 0x0173b871, 0x0074ec6d, 0x03495b89, 0x03539c62, 0x020d68f4, 0x0021b285}}}, + {X: Field{[10]uint32{0x028e7553, 0x00f38468, 0x01692a32, 0x038757f3, 0x012d00cf, 0x0067ec99, 0x03989d3f, 0x02d7cff7, 0x02744cf4, 0x00273d81}}, Y: Field{[10]uint32{0x0247759d, 0x003144f0, 0x0385dc30, 0x0038f116, 0x03edd0f3, 0x03eb5a18, 0x017b6a3c, 0x03f3056d, 0x03f7b973, 0x002051f2}}}, + {X: Field{[10]uint32{0x02d82208, 0x023d6156, 0x005abce9, 0x0031d080, 0x02a6280b, 0x018364db, 0x0093fd60, 0x031ac969, 0x03a28742, 0x0015d223}}, Y: Field{[10]uint32{0x01a29574, 0x021e113c, 0x03921dc2, 0x03994084, 0x03af949a, 0x009ed1c2, 0x02dbe56c, 0x02fa9562, 0x02455073, 0x000c6cf2}}}, + {X: Field{[10]uint32{0x0099447d, 0x02f17ad2, 0x00dc84ed, 0x005b1d63, 0x02d40ed6, 0x01d658f0, 0x00df2b8d, 0x02ef2372, 0x00be6be8, 0x003c44cf}}, Y: Field{[10]uint32{0x0252f50f, 0x02ee24fd, 0x016870cb, 0x018375e8, 0x0110bd3a, 0x0359f558, 0x014626d8, 0x02c8fd5c, 0x00472225, 0x0015ff09}}}, + {X: Field{[10]uint32{0x03be89c0, 0x038105d6, 0x025050f4, 0x02ffcf90, 0x013f3d69, 0x00196ee0, 0x00989c79, 0x02f5e1fe, 0x02753301, 0x0025420f}}, Y: Field{[10]uint32{0x00b33482, 0x024fe925, 0x03c70cc5, 0x038055ac, 0x00ee4e92, 0x01dc1039, 0x017c73ca, 0x0037a518, 0x035ce7d1, 0x002112b6}}}, + {X: Field{[10]uint32{0x005c75c6, 0x000110ef, 0x01973621, 0x02cd8f23, 0x038668c7, 0x03266bd8, 0x0176ed29, 0x0159d579, 0x0355cbb7, 0x0006a420}}, Y: Field{[10]uint32{0x032454a2, 0x02b48b8b, 0x03f27057, 0x001d2d13, 0x00a73538, 0x01589f60, 0x03787222, 0x01b8d4bd, 0x026c6e55, 0x0035d951}}}, + {X: Field{[10]uint32{0x0349b648, 0x037cefbc, 0x01db4f04, 0x018f17cc, 0x038a2d1f, 0x02b65fe7, 0x0067308f, 0x010f56aa, 0x03740bd3, 0x0031648b}}, Y: Field{[10]uint32{0x027bd648, 0x014f251b, 0x00c4377f, 0x01108da9, 0x00da8118, 0x0362dd4b, 0x02605e50, 0x036fa204, 0x00687cfc, 0x001dec7c}}}, + {X: Field{[10]uint32{0x02c95dc9, 0x00d10839, 0x017d9964, 0x00c458e2, 0x02055dcf, 0x006c2d9c, 0x011a4043, 0x000a5dda, 0x01969f91, 0x0019386c}}, Y: Field{[10]uint32{0x0222550c, 0x02538ca4, 0x0371ddce, 0x034873bc, 0x029bfb77, 0x0240d6d9, 0x027fa26a, 0x030f27ac, 0x00c7c11f, 0x00305bd8}}}, + {X: Field{[10]uint32{0x03ce08de, 0x03edfa81, 0x01ce7808, 0x029d527a, 0x03c602f8, 0x00ccf74d, 0x0121bad3, 0x0113b5b1, 0x02766877, 0x0000cecb}}, Y: Field{[10]uint32{0x02988efd, 0x01444aa1, 0x038114c2, 0x032a9b79, 0x03d742e8, 0x03f7652f, 0x036c2437, 0x022ba573, 0x027fc8ed, 0x00386f3f}}}, + {X: Field{[10]uint32{0x01e4f294, 0x011cef91, 0x0275c951, 0x003fca52, 0x0189fbf3, 0x01ed2b0c, 0x02310331, 0x0228730a, 0x034c866d, 0x00083c63}}, Y: Field{[10]uint32{0x02d0ea0e, 0x032ba074, 0x0358943f, 0x027dc5cf, 0x030fe852, 0x034defb9, 0x00883363, 0x03ded3f6, 0x03c9d08e, 0x00235a15}}}, + {X: Field{[10]uint32{0x03b69a8b, 0x01105db5, 0x03befd14, 0x014d5190, 0x012df346, 0x038aa2e7, 0x02b4c685, 0x031c5a83, 0x03c944c9, 0x00134588}}, Y: Field{[10]uint32{0x0117be80, 0x0160e222, 0x02f7854f, 0x0357b654, 0x022b601b, 0x01bb0d25, 0x016bf6b9, 0x02b40fe6, 0x01fe8744, 0x00377c6e}}}, + {X: Field{[10]uint32{0x01b079e0, 0x0343fd4f, 0x027e2d4a, 0x02937436, 0x014faad0, 0x016251e1, 0x00d6b368, 0x00a4b4a0, 0x00dbe8ab, 0x002a406c}}, Y: Field{[10]uint32{0x03298a9d, 0x00398391, 0x023b301d, 0x03829ac1, 0x00716bc5, 0x0079eb99, 0x02f04dc6, 0x006986bd, 0x03e1834f, 0x000fc9f9}}}, + {X: Field{[10]uint32{0x03fc9a70, 0x007269ba, 0x0089b303, 0x013df202, 0x012f42a2, 0x0211916c, 0x03d66f44, 0x023ff542, 0x00713021, 0x001f82bc}}, Y: Field{[10]uint32{0x02aedb3f, 0x01b6de16, 0x003ab241, 0x005fd6f7, 0x010d5795, 0x017ac7a2, 0x013fbb23, 0x0343127d, 0x03f3926c, 0x00142f08}}}, + {X: Field{[10]uint32{0x02ebf20d, 0x00aaac16, 0x01da4ef8, 0x00a151ba, 0x00b47f05, 0x0102a40e, 0x005d3354, 0x00968b06, 0x007e1a7b, 0x001eea06}}, Y: Field{[10]uint32{0x02185187, 0x00924c26, 0x033a39ab, 0x02f39f62, 0x000527ef, 0x0329775e, 0x026c25c7, 0x00dc2be1, 0x026c9625, 0x001b9abb}}}, + {X: Field{[10]uint32{0x013a6807, 0x02128e76, 0x0277255b, 0x02583a49, 0x009767b7, 0x0063f28e, 0x0000816e, 0x02c9e6d8, 0x03c34d83, 0x00230143}}, Y: Field{[10]uint32{0x01174870, 0x026f104d, 0x023ce701, 0x0336073c, 0x015d699f, 0x0106604e, 0x03c29650, 0x023eca09, 0x00ef75b6, 0x002618c5}}}, + {X: Field{[10]uint32{0x019c2ec9, 0x02e2c6f2, 0x006202a7, 0x028b2fd4, 0x009d7201, 0x01492652, 0x0060583a, 0x037e1896, 0x009a78e4, 0x0014ede1}}, Y: Field{[10]uint32{0x03e469c0, 0x00b77e78, 0x012c544d, 0x00951ca3, 0x02e0a44d, 0x006f8b14, 0x024b22de, 0x01f41d77, 0x0212ac60, 0x00138c7a}}}, + {X: Field{[10]uint32{0x03313b33, 0x03149f94, 0x0278efeb, 0x0010c77b, 0x02b63350, 0x03f9d8af, 0x0075a010, 0x032655a8, 0x0267a5d0, 0x0026f7e7}}, Y: Field{[10]uint32{0x029d2bb0, 0x0252bf63, 0x00d5a17e, 0x00d9d8ba, 0x02907f26, 0x03c5b2b4, 0x00c27926, 0x00383b89, 0x0221a596, 0x00250991}}}, + {X: Field{[10]uint32{0x02381f34, 0x03f66412, 0x012fb429, 0x00b1bb0b, 0x0117d9f4, 0x01d81be2, 0x02c031a4, 0x02cef42e, 0x02b37a8a, 0x001f2a9c}}, Y: Field{[10]uint32{0x017303c9, 0x01f77597, 0x037f1ef8, 0x00781a0b, 0x03ff8fbd, 0x00804253, 0x023d6beb, 0x037a34d3, 0x03ab7ee5, 0x0016d614}}}, + {X: Field{[10]uint32{0x0193d81a, 0x01ae5f8e, 0x0093dde1, 0x031d54c9, 0x03925d62, 0x00fd236d, 0x000295fc, 0x01e5d5e7, 0x039f0982, 0x000bbca6}}, Y: Field{[10]uint32{0x03110753, 0x008cde8c, 0x015e89b4, 0x0090e1f6, 0x00a0afff, 0x02fd31c5, 0x0137ef96, 0x016e9829, 0x004dd987, 0x00125b25}}}, + {X: Field{[10]uint32{0x03317ff8, 0x030d2fa5, 0x00e6a9e5, 0x014bb0d5, 0x024029e9, 0x039740b1, 0x03c1860a, 0x01e1d55c, 0x00ad95b0, 0x0037c55f}}, Y: Field{[10]uint32{0x0284c162, 0x01bb8e04, 0x03ba470f, 0x00ba15a4, 0x00b629e6, 0x00acf30c, 0x01c979a0, 0x00ad4226, 0x02c77592, 0x003cbb32}}}, + {X: Field{[10]uint32{0x02454b1d, 0x02a61c05, 0x020e7b15, 0x00dadc64, 0x00e651d2, 0x02e7ad51, 0x0182e643, 0x02949ad8, 0x0150a29c, 0x00375570}}, Y: Field{[10]uint32{0x002e9368, 0x01788fd3, 0x00f5c4d9, 0x02af5dea, 0x00ac685a, 0x01a30944, 0x01605d42, 0x03a8bace, 0x03a542f4, 0x001131d5}}}, + {X: Field{[10]uint32{0x00227f27, 0x02792e26, 0x0172325b, 0x024e1fc0, 0x02c4d5d3, 0x018f4c95, 0x01477630, 0x00b1e464, 0x00f46ed4, 0x0005a21b}}, Y: Field{[10]uint32{0x0217fffb, 0x00e0c5c2, 0x00367ec5, 0x02378bd2, 0x02c824ed, 0x00f280f7, 0x02192fc9, 0x00ca6751, 0x02207ee7, 0x001d0868}}}, + {X: Field{[10]uint32{0x0360732f, 0x03aa9eca, 0x0345e56a, 0x0089213f, 0x0327968c, 0x01bc2b3f, 0x028b306d, 0x00186023, 0x00fcdaa3, 0x001bfc60}}, Y: Field{[10]uint32{0x029961a9, 0x00fa87bd, 0x038cc22f, 0x008baa16, 0x026c8d40, 0x018dd868, 0x0254dad0, 0x02bfc3f0, 0x0254f0c2, 0x001f45b5}}}, + {X: Field{[10]uint32{0x00395e36, 0x03323ab7, 0x005c4f8b, 0x0154e7da, 0x00aa912b, 0x003b99df, 0x034f51f4, 0x030a80fa, 0x0111a00d, 0x0000fa91}}, Y: Field{[10]uint32{0x03c9259d, 0x000d719c, 0x0049824b, 0x00d94a43, 0x030a2f2e, 0x010376d4, 0x02398393, 0x0008564e, 0x01f1528b, 0x001b27b4}}}, + {X: Field{[10]uint32{0x0253081d, 0x0332883c, 0x014b63c7, 0x002a0d79, 0x0153e415, 0x00cb7ee3, 0x00742d8f, 0x03a7aace, 0x0170dc3d, 0x0002e0b3}}, Y: Field{[10]uint32{0x01d0e24d, 0x012f02ab, 0x0326860d, 0x015aa48b, 0x0302effc, 0x00ca5d97, 0x02e20499, 0x01b9d74c, 0x03fe1f7f, 0x0003a2f2}}}, + {X: Field{[10]uint32{0x0196c77f, 0x00e2d5e8, 0x03d49b7b, 0x03c05cc9, 0x0206d056, 0x00169a69, 0x02e23bf1, 0x021d1613, 0x03e00074, 0x003f8bf0}}, Y: Field{[10]uint32{0x01bf3916, 0x02ef6dba, 0x0271d4f9, 0x007793f7, 0x007da856, 0x01601ec7, 0x01a32f69, 0x034a5f32, 0x001cc3c6, 0x000f8625}}}, + {X: Field{[10]uint32{0x03b7858b, 0x036fd5d2, 0x035ec845, 0x00511ba8, 0x02e8b001, 0x00b6e75b, 0x028778b1, 0x00da4d1f, 0x0176cdaa, 0x00012e40}}, Y: Field{[10]uint32{0x0173c154, 0x032abb2e, 0x03155295, 0x03f0bdea, 0x021fdad0, 0x02162031, 0x026e349b, 0x017f4fb2, 0x03ab6e9c, 0x003d8151}}}, + {X: Field{[10]uint32{0x0144c6d2, 0x03b04296, 0x028a0cd3, 0x01cbd654, 0x01defc42, 0x0036f27b, 0x00c86a9f, 0x01802d2e, 0x02511d34, 0x000d7ce0}}, Y: Field{[10]uint32{0x00b5ccd5, 0x00c8d2f4, 0x00daeae8, 0x02c6c4a8, 0x0043762b, 0x03e5b2a6, 0x0337a80c, 0x028797db, 0x01f6ef7f, 0x000a6a0d}}}, + {X: Field{[10]uint32{0x022cb94a, 0x0308dc5c, 0x011cdf3c, 0x02b0fc04, 0x03e1d0e9, 0x021f4fd6, 0x0027e265, 0x02dffe84, 0x02970311, 0x00075d2c}}, Y: Field{[10]uint32{0x00c2071e, 0x03307dca, 0x030e2606, 0x02ba771f, 0x0135dc99, 0x003d7183, 0x03bcfb81, 0x005382dc, 0x038b57f1, 0x00171ef3}}}, + {X: Field{[10]uint32{0x00450428, 0x0129a2a6, 0x013e6f93, 0x02df1056, 0x024f75d1, 0x027b1c8b, 0x0020737b, 0x03e5582c, 0x00f309c6, 0x00142825}}, Y: Field{[10]uint32{0x03778eee, 0x0243c7a0, 0x021b554a, 0x02da1a6a, 0x0089c86d, 0x02a07c11, 0x009eaba6, 0x0033f65a, 0x0222dfe1, 0x0028a1b8}}}, + {X: Field{[10]uint32{0x03c63db7, 0x0029b589, 0x0010599b, 0x036452d2, 0x00282dbc, 0x01d7b0e3, 0x02cf12e2, 0x0055f37f, 0x03812129, 0x0026d96e}}, Y: Field{[10]uint32{0x00223188, 0x0164ef06, 0x03d65528, 0x0102b423, 0x00660b4c, 0x007a629e, 0x013b2e95, 0x00890864, 0x031a3f0f, 0x003160b6}}}, + {X: Field{[10]uint32{0x02a4bc6b, 0x00200b4d, 0x02ca51c2, 0x03179883, 0x0085e7f1, 0x007720c7, 0x02c1115a, 0x0281b915, 0x00fc1fdf, 0x0022d151}}, Y: Field{[10]uint32{0x0220350d, 0x022c67de, 0x003b06ea, 0x02e6556c, 0x01e4116f, 0x02dc3993, 0x022af7f4, 0x00980b9c, 0x0041288f, 0x0038f9df}}}, + {X: Field{[10]uint32{0x020ab4aa, 0x02076577, 0x01e29d5f, 0x004f773b, 0x006cb2ae, 0x0155e3f7, 0x039b29cc, 0x03adf145, 0x0080b959, 0x001b1c26}}, Y: Field{[10]uint32{0x027c4bdc, 0x033144e7, 0x03b43c2d, 0x0314254f, 0x02ee2b59, 0x03cf7aae, 0x036c0c76, 0x02e9099c, 0x03aebd8e, 0x003278cf}}}, + {X: Field{[10]uint32{0x01537806, 0x02d59dcf, 0x001e7085, 0x019e00ae, 0x0076fc9d, 0x012821e8, 0x01891f79, 0x01a9c657, 0x035137ba, 0x001ddd82}}, Y: Field{[10]uint32{0x018e3a25, 0x0206af85, 0x037f0d7e, 0x037b9a39, 0x021b87ff, 0x03d105ef, 0x0358c7ed, 0x02962fd3, 0x00f5aaee, 0x003d480b}}}, + {X: Field{[10]uint32{0x02163102, 0x03109b9f, 0x025d0df4, 0x03e3bf58, 0x03e23cd4, 0x02324699, 0x02904a8a, 0x00320ba6, 0x03836a0b, 0x0006a2f5}}, Y: Field{[10]uint32{0x02285844, 0x0317f304, 0x01f2e4e9, 0x005adc02, 0x01c2a963, 0x03dd2a1f, 0x0174f282, 0x00b2b8f1, 0x00cab095, 0x00187f99}}}, + {X: Field{[10]uint32{0x024abc30, 0x02d4e421, 0x031d753d, 0x02679a51, 0x02a3fb30, 0x00936475, 0x01e453ed, 0x02644fec, 0x01b65907, 0x003f885f}}, Y: Field{[10]uint32{0x01730b58, 0x03dac0d3, 0x012538cd, 0x00714e5a, 0x0193a0c6, 0x007c11f5, 0x030f20fb, 0x017b5a02, 0x02bba962, 0x001773e6}}}, + {X: Field{[10]uint32{0x01b33b91, 0x02bb527d, 0x02c5f212, 0x035d232d, 0x0107e3ab, 0x03ab5a5b, 0x00f58b65, 0x0357af0e, 0x023754af, 0x00094135}}, Y: Field{[10]uint32{0x035d75d4, 0x0004eb5e, 0x03437b5e, 0x004159d7, 0x00ba7cec, 0x01cbeefd, 0x01321c6c, 0x011a713d, 0x034375f1, 0x001e69af}}}, + {X: Field{[10]uint32{0x03197b5c, 0x03772bf6, 0x0176b7fb, 0x02fd7322, 0x036160ab, 0x021c4170, 0x029bd3f6, 0x008b5e26, 0x0302f47b, 0x0002c1bd}}, Y: Field{[10]uint32{0x0332f63d, 0x017e4635, 0x007781cd, 0x01ff45e7, 0x005bd2fe, 0x02a8f7f9, 0x012a35b6, 0x035247d6, 0x03d419a4, 0x001d9a6e}}}, + {X: Field{[10]uint32{0x01044e23, 0x004a2983, 0x010acbc2, 0x027af48f, 0x00a6f3f9, 0x006d5120, 0x034eeb93, 0x0273e500, 0x003bb31f, 0x00200ec8}}, Y: Field{[10]uint32{0x0328d1c7, 0x014e0705, 0x006a954e, 0x02fd26e5, 0x03bfc9cc, 0x03e98aeb, 0x0320c5c7, 0x03dd6566, 0x008df271, 0x000c22af}}}, + {X: Field{[10]uint32{0x0302749a, 0x00a27f80, 0x028dcd57, 0x037a3a56, 0x02e52de1, 0x000e9cc4, 0x010e5bda, 0x033ab6ed, 0x00b4c5f5, 0x00099aa7}}, Y: Field{[10]uint32{0x02e0ae7e, 0x021bff11, 0x03baa8b3, 0x02e879f0, 0x033dc0ef, 0x03213b53, 0x0282877c, 0x02cbea8f, 0x030ba856, 0x0027baa5}}}, + {X: Field{[10]uint32{0x004eba94, 0x00d82f3e, 0x02a355d7, 0x0107a6af, 0x0364c4c1, 0x02058f7c, 0x019a7ab9, 0x01eb5496, 0x0195d80c, 0x003f62a7}}, Y: Field{[10]uint32{0x03b1030c, 0x035f5cf7, 0x01a713e2, 0x03691eff, 0x03a30377, 0x02b9ff4c, 0x032e2688, 0x014ecd66, 0x03021009, 0x002a7ec5}}}, + {X: Field{[10]uint32{0x01db0a7d, 0x02dbc9be, 0x038f8f2c, 0x0316dec2, 0x026e84ac, 0x02cb202f, 0x03c339a8, 0x023c8d67, 0x01f309f2, 0x0029cc8b}}, Y: Field{[10]uint32{0x02db6be6, 0x028ba85b, 0x00885c12, 0x0384c5c5, 0x03095f40, 0x03c4be95, 0x01b7f5b2, 0x025405ff, 0x029d2174, 0x0008bdbf}}}, + {X: Field{[10]uint32{0x03052d36, 0x00f1f932, 0x01ffc82c, 0x006ba95a, 0x00bd4c46, 0x03dfc3c6, 0x02104ddb, 0x0199258e, 0x010f336a, 0x0020aa30}}, Y: Field{[10]uint32{0x01f1dd0c, 0x0384a1e5, 0x038c118f, 0x03533411, 0x015e5c31, 0x02dc6d9c, 0x010501cc, 0x01c89e2e, 0x00a2c0ef, 0x001cdf3b}}}, + {X: Field{[10]uint32{0x0315d6df, 0x01e12a53, 0x00516c54, 0x02dd6e97, 0x026c4ef2, 0x01698309, 0x03cd12f0, 0x03de5401, 0x01b68e3b, 0x0026d434}}, Y: Field{[10]uint32{0x03ddd8fd, 0x01bfadf2, 0x02778737, 0x009cb51f, 0x02403fff, 0x03c63549, 0x003fd2a4, 0x01db6340, 0x0109b791, 0x000abf23}}}, + {X: Field{[10]uint32{0x02e08d32, 0x021657ee, 0x00b80671, 0x035fba0b, 0x02b8dcb9, 0x0074c15a, 0x023a8228, 0x008ff9f7, 0x03ddc8b4, 0x000fe420}}, Y: Field{[10]uint32{0x028fa758, 0x0257ff3c, 0x01376e21, 0x01b48330, 0x0081f77f, 0x03e80868, 0x020ed90a, 0x007646a7, 0x0152fd51, 0x0032c4f0}}}, + {X: Field{[10]uint32{0x02167faf, 0x0041d3bc, 0x00bfadbd, 0x00196754, 0x03c92317, 0x024999b2, 0x02ff6bd5, 0x0306895b, 0x01c1ee17, 0x0031d721}}, Y: Field{[10]uint32{0x00023a52, 0x02bc5a50, 0x00c8596d, 0x005b53df, 0x01bd698a, 0x0191fd23, 0x00ca8922, 0x010275d7, 0x02be5e09, 0x0006ad3a}}}, + {X: Field{[10]uint32{0x00656045, 0x02355da6, 0x03fb95c6, 0x00acf52d, 0x0060ea8e, 0x03deab5f, 0x010cf0d2, 0x03d74ed3, 0x03eaf8a0, 0x00314d07}}, Y: Field{[10]uint32{0x00e88915, 0x034eae5d, 0x023986e6, 0x035535c4, 0x02dc48a4, 0x009aae60, 0x00fa422a, 0x016e7e92, 0x00e9007e, 0x00257e7d}}}, + {X: Field{[10]uint32{0x00c2d89b, 0x01e80c98, 0x027fd896, 0x02ddd4b5, 0x02220852, 0x01c17748, 0x02bd4c68, 0x025f8354, 0x023e2a89, 0x0020eb36}}, Y: Field{[10]uint32{0x03c31df0, 0x03a5de46, 0x00e8e330, 0x00ef752e, 0x030a77cd, 0x025c45d5, 0x01b55809, 0x02e945fd, 0x02e1d655, 0x0037386e}}}, + {X: Field{[10]uint32{0x0025237b, 0x009e6cc0, 0x039625bd, 0x01c5b174, 0x00f1c0d5, 0x00a75653, 0x01c4164e, 0x0241d16e, 0x01468b29, 0x0016e064}}, Y: Field{[10]uint32{0x03625d8e, 0x0227d2bd, 0x034fcf69, 0x0329c6e8, 0x011c48d2, 0x00207cd6, 0x0188daab, 0x0377eafb, 0x02a03fdd, 0x00330d8d}}}, + {X: Field{[10]uint32{0x003b0e6c, 0x0241178b, 0x037219b8, 0x01934e35, 0x0332f5f6, 0x01984139, 0x00417961, 0x00e3bfe0, 0x0122214e, 0x00191de0}}, Y: Field{[10]uint32{0x0211a32d, 0x033e6111, 0x02f81974, 0x000e352b, 0x00d8b632, 0x02e29f47, 0x02afc4a0, 0x03bb1ee3, 0x00497e15, 0x000ca73c}}}, + {X: Field{[10]uint32{0x02f12323, 0x0032e7c6, 0x0017c43d, 0x0275b684, 0x002b475a, 0x02bba199, 0x01099099, 0x018bd1e5, 0x026afe57, 0x003b5360}}, Y: Field{[10]uint32{0x03e48e78, 0x00c6defd, 0x02274d05, 0x02696510, 0x01c4d88c, 0x02b1e467, 0x0296f928, 0x0297bb20, 0x01be3faf, 0x00231be0}}}, + {X: Field{[10]uint32{0x01109c4a, 0x01bad033, 0x02fe97a0, 0x00ad57de, 0x024d82ac, 0x011bf586, 0x016f5513, 0x03b30eb3, 0x0124419a, 0x000e2d0a}}, Y: Field{[10]uint32{0x03e05583, 0x032e4adc, 0x02b07b5a, 0x01a28b39, 0x02de49d7, 0x03cd669a, 0x030965a1, 0x00bdceca, 0x00962feb, 0x001fd0b0}}}, + {X: Field{[10]uint32{0x02138911, 0x02b0ba60, 0x016e3446, 0x018893c8, 0x01bb2a8f, 0x020fa185, 0x034cf701, 0x02529ed0, 0x00a8d8bb, 0x0030f2b5}}, Y: Field{[10]uint32{0x0282765e, 0x023b4e1c, 0x01b2759a, 0x00bbc6c9, 0x01420e37, 0x00b738e8, 0x0342ce38, 0x025d9081, 0x02278cad, 0x003d926f}}}, + {X: Field{[10]uint32{0x00bd6538, 0x02239295, 0x01a9e555, 0x015cd964, 0x00d9212e, 0x038faa7b, 0x03ae40dc, 0x00dbf553, 0x03f4d3d2, 0x000b5023}}, Y: Field{[10]uint32{0x00e815b7, 0x02816d43, 0x021324b9, 0x01c5616a, 0x0285e2a1, 0x00a66fbd, 0x02284bf0, 0x00a81af1, 0x01f0e869, 0x003565ab}}}, + {X: Field{[10]uint32{0x0233c854, 0x02dfaa9e, 0x03daebaf, 0x028e8f1b, 0x03d67423, 0x00fe223a, 0x0290cf81, 0x0097eddb, 0x036d247f, 0x003b9eb7}}, Y: Field{[10]uint32{0x027a8fb4, 0x03bf0754, 0x01801dea, 0x01c5e278, 0x01143f68, 0x01505a27, 0x010dd9ef, 0x03dc15b0, 0x004b4ae8, 0x00381dc6}}}, + {X: Field{[10]uint32{0x01144b34, 0x0047cf80, 0x0064b7c8, 0x028df26a, 0x01dd5d37, 0x01317a27, 0x011151dc, 0x02b284f6, 0x03c8a9ff, 0x000be515}}, Y: Field{[10]uint32{0x035e221d, 0x018d3839, 0x01cfbb40, 0x033acf4f, 0x02787120, 0x035bf122, 0x015407e1, 0x0355ce8a, 0x00489093, 0x003ad326}}}, + {X: Field{[10]uint32{0x03fec294, 0x00311bad, 0x01c277b3, 0x020fbd4c, 0x03601204, 0x03f86378, 0x023478ce, 0x00560873, 0x02b8a0f1, 0x0034fccc}}, Y: Field{[10]uint32{0x030b2155, 0x0085786e, 0x00f9f323, 0x0243bc4d, 0x01c8968b, 0x030dca50, 0x02f1c019, 0x01e18746, 0x01b25d71, 0x003a9d6e}}}, + {X: Field{[10]uint32{0x02152b91, 0x0337c7e3, 0x02f7e9a4, 0x02199ad4, 0x035f3ddb, 0x03bcdb75, 0x021fcd86, 0x016ab4d4, 0x00d338b0, 0x00060d02}}, Y: Field{[10]uint32{0x0241218c, 0x00d54dc5, 0x018095de, 0x01339126, 0x00210e20, 0x00326209, 0x01be21f2, 0x012b1bce, 0x01206edf, 0x0019a661}}}, + {X: Field{[10]uint32{0x0340374e, 0x02558257, 0x006863d3, 0x035b094d, 0x0321faff, 0x0273e269, 0x00f1f0ff, 0x01794eea, 0x005db114, 0x000a0ffb}}, Y: Field{[10]uint32{0x0032fefe, 0x006fa0af, 0x02f77851, 0x000f3ce6, 0x0008846e, 0x01729ba6, 0x0268e5f6, 0x015439a3, 0x023774af, 0x001c2c04}}}, + {X: Field{[10]uint32{0x0152fa62, 0x02837ef7, 0x016daf54, 0x01e5dc3f, 0x00ebc735, 0x0239f6ff, 0x03bd249d, 0x00f3e904, 0x030a4f94, 0x000339d5}}, Y: Field{[10]uint32{0x0375d41d, 0x01be73a2, 0x013907c3, 0x02260f81, 0x00bd5e5b, 0x02e8e617, 0x005bdf98, 0x02573fee, 0x014bef46, 0x0038456c}}}, + {X: Field{[10]uint32{0x038fd470, 0x02529320, 0x02b15377, 0x0055d32f, 0x01df7903, 0x03646549, 0x029f648c, 0x03b0fc49, 0x0319c8f4, 0x001fa713}}, Y: Field{[10]uint32{0x00fa5270, 0x037d73ac, 0x013e9c86, 0x0236b5af, 0x0060fafa, 0x03447d20, 0x015d6ccb, 0x03d732a1, 0x03fe8cf5, 0x003a7676}}}, + {X: Field{[10]uint32{0x00cb001b, 0x01146d19, 0x03ec23bf, 0x0131c8a8, 0x010ba04f, 0x03c8c27e, 0x007f919d, 0x016ffa9f, 0x03e60d5d, 0x0038aa6e}}, Y: Field{[10]uint32{0x02393fb0, 0x004691e1, 0x03f16984, 0x024741a9, 0x03d1925b, 0x039cb2dd, 0x0125bd67, 0x01ab1de2, 0x00e1c3cd, 0x003905df}}}, + {X: Field{[10]uint32{0x01271012, 0x0264009d, 0x00265e70, 0x006c5563, 0x00f55e64, 0x00aa5264, 0x03bf37d4, 0x03bd4390, 0x02a43e17, 0x00141144}}, Y: Field{[10]uint32{0x021ed18b, 0x029274b9, 0x0381b742, 0x02e5a265, 0x011f21c4, 0x02387cb3, 0x00b1f41e, 0x00eb3cb5, 0x03d857ba, 0x00255297}}}, + {X: Field{[10]uint32{0x005f850d, 0x032fa1ca, 0x03411cd5, 0x036285ec, 0x01859945, 0x029cb1c8, 0x02d1d51b, 0x00c97d2c, 0x0013a6bb, 0x0020747c}}, Y: Field{[10]uint32{0x00937193, 0x012f3177, 0x0071adce, 0x0127535c, 0x01259d3d, 0x0262c816, 0x01fe2492, 0x002154ec, 0x03b1f0c3, 0x000b574b}}}, + {X: Field{[10]uint32{0x01895022, 0x00ce0f47, 0x0387ca73, 0x0050528e, 0x01d90dd5, 0x0399b0cf, 0x02872767, 0x02099862, 0x02dfc1d2, 0x0016d9b0}}, Y: Field{[10]uint32{0x0154e0ff, 0x02d51cb5, 0x00f5449e, 0x03684b63, 0x0327fcae, 0x0101fa61, 0x017267b7, 0x0255a488, 0x038e3818, 0x0026f405}}}, + {X: Field{[10]uint32{0x00381186, 0x03e1a208, 0x00597afa, 0x0366bd63, 0x0399b583, 0x036ffe2a, 0x012d544b, 0x0178e36f, 0x030e98ec, 0x002bad7d}}, Y: Field{[10]uint32{0x0184427b, 0x02b705cd, 0x01a052e7, 0x01cc3cbd, 0x01691b09, 0x00cdb908, 0x00b76929, 0x029c37c2, 0x02b0d25c, 0x001862f5}}}, + {X: Field{[10]uint32{0x0105052e, 0x02a60849, 0x0353a707, 0x0329dab5, 0x02557679, 0x01ea700a, 0x0361e3c6, 0x0250ee11, 0x02ffe841, 0x0002ca27}}, Y: Field{[10]uint32{0x0079992c, 0x02e743fa, 0x01e330cf, 0x00e17974, 0x00530ed7, 0x0318920b, 0x034f895d, 0x018aa14e, 0x01f0c218, 0x0001ea60}}}, + {X: Field{[10]uint32{0x0219291c, 0x02f4d5bd, 0x01200f81, 0x005f9138, 0x003f5859, 0x03f4a0a2, 0x00c8360c, 0x006679ac, 0x01458b12, 0x002aeb8e}}, Y: Field{[10]uint32{0x01753f28, 0x02dd7bed, 0x02934233, 0x02ded99f, 0x000b2a81, 0x011a6c1a, 0x03be30b2, 0x01a717a0, 0x03cdb3d0, 0x002b6c8e}}}, + {X: Field{[10]uint32{0x01fbacaa, 0x02720255, 0x03013941, 0x02323646, 0x011e0f65, 0x0063aca7, 0x02c224a5, 0x01696a06, 0x03a6485b, 0x0012a560}}, Y: Field{[10]uint32{0x00e8dbca, 0x00558c6d, 0x037decea, 0x00466dec, 0x00803ecf, 0x01dda36d, 0x02375a8a, 0x010bd7b7, 0x009ee3c8, 0x0036000f}}}, + {X: Field{[10]uint32{0x00ebc169, 0x00404084, 0x017ae3a2, 0x0305183c, 0x02ea236a, 0x012ac367, 0x03cf4654, 0x03df2d97, 0x030edba6, 0x00354bd8}}, Y: Field{[10]uint32{0x030d26d0, 0x0304f84d, 0x003d9145, 0x003106f2, 0x0368e21a, 0x02801714, 0x01bea50d, 0x00ee20f9, 0x03489fa9, 0x00084555}}}, + {X: Field{[10]uint32{0x02dd6a4d, 0x00384826, 0x029bf8d1, 0x018cd6f2, 0x01c74a2a, 0x00b9307a, 0x0050fc05, 0x016163d7, 0x023782c7, 0x0002f714}}, Y: Field{[10]uint32{0x0034f189, 0x01010d9a, 0x0323e585, 0x00ef0755, 0x0312ff02, 0x02fd4a74, 0x014efbaf, 0x01d9a388, 0x01f87463, 0x002aec76}}}, + {X: Field{[10]uint32{0x019ad087, 0x038244b9, 0x00e8626e, 0x005a3c4f, 0x0288156d, 0x03ad859e, 0x0364e476, 0x02aae0ee, 0x02338bf0, 0x00111dc2}}, Y: Field{[10]uint32{0x0360a55c, 0x0170cf7b, 0x01b99c96, 0x008edca4, 0x036a3abd, 0x030b5915, 0x0393a895, 0x0102f2cc, 0x00f12e9c, 0x0016d64c}}}, + {X: Field{[10]uint32{0x015e1679, 0x00b64914, 0x021c83e3, 0x02363ba3, 0x02650310, 0x00f8d99c, 0x01ac2032, 0x012bb8c6, 0x03322e40, 0x002c579e}}, Y: Field{[10]uint32{0x01997e7a, 0x00f3abcf, 0x03d57a87, 0x00961cd1, 0x005ced5c, 0x001e5bd4, 0x002ed565, 0x02ca457e, 0x00190bbf, 0x001491aa}}}, + {X: Field{[10]uint32{0x01b00f22, 0x02f66bb7, 0x0019027b, 0x00235781, 0x01665ae1, 0x0287077e, 0x0050f758, 0x017343cb, 0x01570522, 0x00287b5d}}, Y: Field{[10]uint32{0x02791ee2, 0x0049dd9a, 0x001a13d2, 0x001024ca, 0x02d71dbd, 0x02143b40, 0x017e7464, 0x021d21ee, 0x005dad9f, 0x000f20c5}}}, + {X: Field{[10]uint32{0x01918af5, 0x022becc7, 0x037a23cf, 0x032708e8, 0x03479e9e, 0x03181603, 0x03fc43c2, 0x03183f66, 0x03616a1b, 0x003a2abc}}, Y: Field{[10]uint32{0x0279827c, 0x02dbc9e7, 0x03d3ec89, 0x000e96b0, 0x009ab9c3, 0x02e68356, 0x0141041a, 0x0319c9f8, 0x03b64a37, 0x001b39a4}}}, + {X: Field{[10]uint32{0x014c20a3, 0x00ea8dc1, 0x01b76c5a, 0x010ce28f, 0x020759c0, 0x0061e9b5, 0x024a4ef6, 0x01798d4a, 0x00cd2c85, 0x001771be}}, Y: Field{[10]uint32{0x026f4838, 0x01c05193, 0x03f0fbb8, 0x03d4b9a9, 0x000fe9f5, 0x0307620d, 0x031d1bc7, 0x02a6a359, 0x03428593, 0x003d80b0}}}, + {X: Field{[10]uint32{0x0342f3a6, 0x0281f2da, 0x0326a5f1, 0x0081186b, 0x00f65636, 0x00aa9227, 0x02063ef2, 0x0362bda2, 0x031167be, 0x0018cc9c}}, Y: Field{[10]uint32{0x034424a6, 0x0032e06d, 0x01f1a3ea, 0x00026a46, 0x02bf94a7, 0x01874f95, 0x00ca0367, 0x004c83c8, 0x03b22070, 0x002e3df0}}}, + {X: Field{[10]uint32{0x00080263, 0x008c3e52, 0x020d3535, 0x002b5e62, 0x03ad66e5, 0x03a19536, 0x005c2017, 0x00ece08c, 0x01259a39, 0x00229036}}, Y: Field{[10]uint32{0x019fcaff, 0x02d747e7, 0x01d6f6a7, 0x03326a69, 0x0143f9cb, 0x031985b4, 0x03f703a5, 0x01153b75, 0x034d9849, 0x002beda9}}}, + {X: Field{[10]uint32{0x0078645a, 0x037abe08, 0x0317dcdf, 0x022f3082, 0x02a6a02c, 0x02816df7, 0x017fd3f9, 0x01082bd4, 0x010727c7, 0x0039c51c}}, Y: Field{[10]uint32{0x0217daca, 0x00513ad0, 0x03055eaa, 0x02809606, 0x01a3561b, 0x025ac13e, 0x01d5dcdc, 0x03a753fb, 0x03cbc1ed, 0x00369f59}}}, + {X: Field{[10]uint32{0x0261c82d, 0x007da725, 0x026c0cae, 0x03a24700, 0x029922bc, 0x014e54b0, 0x0242a685, 0x02e1e007, 0x011cd95f, 0x00184c4a}}, Y: Field{[10]uint32{0x0130bf01, 0x03f0410b, 0x03b89384, 0x01e44dcc, 0x0042b894, 0x02b98cae, 0x014f9898, 0x00bf5167, 0x001c1334, 0x00058387}}}, + {X: Field{[10]uint32{0x01ca4951, 0x00af3c74, 0x003bfb78, 0x02a76940, 0x02fc5e2a, 0x01e22027, 0x029bfa81, 0x011a4b42, 0x0045b676, 0x0012f13e}}, Y: Field{[10]uint32{0x00b751f0, 0x03103f04, 0x0383cefd, 0x0315fec5, 0x0164c4a7, 0x029dbb01, 0x03055ff3, 0x0349538e, 0x01cbb9c3, 0x0021c24b}}}, + {X: Field{[10]uint32{0x02be67df, 0x039bb2a8, 0x0201f698, 0x017560a8, 0x0052865b, 0x02617cd9, 0x039bff5c, 0x03a77ca7, 0x00a27bbe, 0x00116a20}}, Y: Field{[10]uint32{0x0055fabb, 0x00cae8de, 0x00eb6131, 0x01ae3ba5, 0x02a831d4, 0x02af5643, 0x0279714d, 0x01afc7bd, 0x02a8b5e4, 0x003f9269}}}, + {X: Field{[10]uint32{0x02f4f2a4, 0x03c68352, 0x000d3f21, 0x0256c854, 0x01877e54, 0x00805174, 0x016847a2, 0x00321993, 0x0238317c, 0x001aa09a}}, Y: Field{[10]uint32{0x005f4513, 0x0117e1f8, 0x0322c154, 0x002ef081, 0x02f6b83f, 0x01b9ad1e, 0x02f14e0e, 0x02098f7c, 0x014efcc9, 0x00114865}}}, + {X: Field{[10]uint32{0x026a23a9, 0x03a28d0d, 0x0075f613, 0x0379f1b3, 0x028bd860, 0x0277395c, 0x008aa1b0, 0x03dfa5b3, 0x0106f255, 0x00054d59}}, Y: Field{[10]uint32{0x00110bf3, 0x014ec700, 0x034cee3e, 0x02d38d8a, 0x03122f37, 0x03e26977, 0x01e401f1, 0x03521435, 0x03bcd744, 0x0033456a}}}, + {X: Field{[10]uint32{0x02b89b91, 0x0387283c, 0x0043a2b5, 0x02973299, 0x00cacff3, 0x00b6b0bb, 0x00651780, 0x027d7dae, 0x02aef53d, 0x003cef04}}, Y: Field{[10]uint32{0x00e00957, 0x03294246, 0x03131368, 0x017fc91f, 0x01303e91, 0x0281cdeb, 0x03d0f367, 0x0047c907, 0x036beb2e, 0x0033f534}}}, + {X: Field{[10]uint32{0x035c0fd4, 0x00a0a5cc, 0x033736f7, 0x03bd6114, 0x0122320b, 0x02ce1d92, 0x0226ef18, 0x0294dbde, 0x006dfa04, 0x001f8f23}}, Y: Field{[10]uint32{0x01f7c189, 0x01c4a134, 0x03fe9155, 0x01362339, 0x02b6a129, 0x000f008d, 0x032400b3, 0x00cdb4cc, 0x02b532a7, 0x001cba85}}}, + {X: Field{[10]uint32{0x010369d8, 0x0111822b, 0x03223d88, 0x026f5b85, 0x026943ab, 0x0214557f, 0x021c696d, 0x017f0b05, 0x03cfa057, 0x0006632f}}, Y: Field{[10]uint32{0x013cf7ae, 0x01cac985, 0x006c2f29, 0x025209e9, 0x03032159, 0x039ee8b9, 0x019fe0ef, 0x00908af9, 0x028b3095, 0x00357989}}}, + {X: Field{[10]uint32{0x03b0e5e8, 0x02c4d42b, 0x01fd63ae, 0x02a9e02c, 0x015a147c, 0x00226e43, 0x0183c089, 0x03cd6888, 0x0289b68c, 0x0007815b}}, Y: Field{[10]uint32{0x003f32b9, 0x0011cae5, 0x008379f8, 0x00e431be, 0x003e258a, 0x01b505bd, 0x02d6ff38, 0x01315f76, 0x0053abc4, 0x002e0905}}}, + {X: Field{[10]uint32{0x02faaa21, 0x031ca79c, 0x018fb3fa, 0x011339fe, 0x03d81081, 0x02991b51, 0x0173b2f1, 0x01f9fa98, 0x01748d82, 0x00371ffe}}, Y: Field{[10]uint32{0x030c4914, 0x00b9ffb9, 0x02a1aaaf, 0x001c51b6, 0x013e3d5f, 0x01105f1c, 0x038e1c5c, 0x01bc3ff2, 0x005aef4c, 0x00307f6b}}}, + {X: Field{[10]uint32{0x03d28e79, 0x027686cb, 0x00ec29a9, 0x03c2fe3e, 0x0036b2ef, 0x0337ef12, 0x0354bc11, 0x00781c14, 0x02fcc498, 0x001c6e57}}, Y: Field{[10]uint32{0x03d684cc, 0x010b31bb, 0x03fa30af, 0x02c269cd, 0x011f3695, 0x00faef14, 0x004752cc, 0x01abbb0c, 0x01976fad, 0x003f568c}}}, + {X: Field{[10]uint32{0x02542b3a, 0x01a20eb7, 0x004ae687, 0x008625c1, 0x03f6b961, 0x0096eea0, 0x033e8ffa, 0x00af5b27, 0x00af29dc, 0x0010e153}}, Y: Field{[10]uint32{0x009c6c81, 0x02d1200f, 0x03f36fd8, 0x02957072, 0x0034c5c9, 0x02893d56, 0x01e31677, 0x018cbe37, 0x01760897, 0x00158d94}}}, + {X: Field{[10]uint32{0x0027b222, 0x00bb3cb5, 0x0396145c, 0x0243ee1d, 0x00b6eff9, 0x0357f421, 0x00c9b730, 0x027e71c2, 0x0217090e, 0x0000ab7f}}, Y: Field{[10]uint32{0x03abd7ed, 0x01b66d14, 0x010cd4c8, 0x008301a5, 0x02c44398, 0x0334a244, 0x00ae425c, 0x0367188b, 0x01605d6d, 0x002d738c}}}, + {X: Field{[10]uint32{0x03a9d6f9, 0x038fa089, 0x00620471, 0x0152b8cf, 0x0209f70c, 0x02cffcc6, 0x033a5343, 0x02bcc456, 0x012c2b7e, 0x002848d1}}, Y: Field{[10]uint32{0x01e3b4eb, 0x0053337b, 0x0396e8fa, 0x029bdde7, 0x03f53e37, 0x03f15179, 0x008194aa, 0x007d10de, 0x008378a7, 0x0024cf4d}}}, + {X: Field{[10]uint32{0x02c0a6ab, 0x01b8cb33, 0x00a603d0, 0x02b9f7b3, 0x03aab166, 0x004d21cd, 0x00152176, 0x016a061b, 0x03c2ca99, 0x0026e268}}, Y: Field{[10]uint32{0x03731232, 0x02a322b9, 0x0141480b, 0x034150ed, 0x03cbea83, 0x0092b020, 0x03c48302, 0x012c4af5, 0x0301a872, 0x000a9f4d}}}, + {X: Field{[10]uint32{0x01e9e9b2, 0x01e59184, 0x032edc90, 0x00ce7b62, 0x03384b04, 0x031149ca, 0x022b9a0d, 0x035ce423, 0x0057e7d9, 0x0019375d}}, Y: Field{[10]uint32{0x023c470e, 0x00a430e0, 0x03885b29, 0x031de03b, 0x014e311d, 0x019a6626, 0x0208a723, 0x03b85bb5, 0x00aae214, 0x003aa43e}}}, + {X: Field{[10]uint32{0x03a2176c, 0x015d9f5b, 0x0150a6b3, 0x010871fd, 0x0320abba, 0x03adc721, 0x027fd714, 0x01f1af4c, 0x0031be60, 0x0016489d}}, Y: Field{[10]uint32{0x0061d598, 0x01449712, 0x03d0b870, 0x02c4b254, 0x00796da2, 0x00f3cfce, 0x03d289ea, 0x01549d96, 0x01c4071c, 0x0032dd5c}}}, + {X: Field{[10]uint32{0x015fe2c2, 0x0041bbde, 0x03bdc8c5, 0x00229c8d, 0x03843b7d, 0x024dd0d8, 0x000ddf19, 0x01ba7872, 0x01cdadb2, 0x0014f5d9}}, Y: Field{[10]uint32{0x017c287b, 0x0269016b, 0x000bec98, 0x00ec4a29, 0x00a66d4f, 0x01351454, 0x0187f819, 0x025ceddb, 0x0198eb39, 0x001eeeec}}}, + {X: Field{[10]uint32{0x03bb66af, 0x02d46695, 0x03fc16d7, 0x02426d9b, 0x010452ee, 0x03d7fdb0, 0x03a989c0, 0x00efcd48, 0x029ec16b, 0x003941f7}}, Y: Field{[10]uint32{0x03f7892a, 0x014078a3, 0x0195259a, 0x03401320, 0x0251b6d3, 0x022566b4, 0x008b3950, 0x0379b8f7, 0x002a8272, 0x0028bcbc}}}, + {X: Field{[10]uint32{0x01b4a6f2, 0x027260ce, 0x03983556, 0x01db8a95, 0x0265601d, 0x027d82de, 0x0103b8cb, 0x013eca06, 0x00c60eb8, 0x00005bd2}}, Y: Field{[10]uint32{0x0132b289, 0x023d40f7, 0x016a441d, 0x00a43d25, 0x03d827b6, 0x02dbbd13, 0x031e75d5, 0x01a0759b, 0x03848398, 0x002184ee}}}, + {X: Field{[10]uint32{0x01446056, 0x02d8ce78, 0x03af90ca, 0x00e0a8ec, 0x010bb98e, 0x00f44b61, 0x00b51323, 0x01978c9c, 0x01ae7742, 0x0019411c}}, Y: Field{[10]uint32{0x01a50306, 0x009c92a9, 0x03cda4e6, 0x00c85765, 0x01187b40, 0x00d670ce, 0x0290a62d, 0x01bf9b2b, 0x039334aa, 0x0020e39d}}}, + {X: Field{[10]uint32{0x0021dda8, 0x02ab0aaf, 0x00821559, 0x0287f5eb, 0x02348d1b, 0x026097eb, 0x010e19d6, 0x01613f32, 0x0016fa34, 0x000577a9}}, Y: Field{[10]uint32{0x00433047, 0x01c090ea, 0x01c15d40, 0x03d7517e, 0x00010fa5, 0x012f44c1, 0x012a3d28, 0x0339a3b8, 0x03f21e19, 0x00007f2a}}}, + {X: Field{[10]uint32{0x005b46e2, 0x032e81ec, 0x00751dc5, 0x001ed3df, 0x02ee9d6a, 0x00d5ee91, 0x03900878, 0x01c3b4f6, 0x00954f1f, 0x002d0ac9}}, Y: Field{[10]uint32{0x0169ed71, 0x0065a802, 0x03ec69f9, 0x02d31546, 0x034851f5, 0x00110f18, 0x0328d6da, 0x036f9b5b, 0x03eb0e0b, 0x003855c8}}}, + {X: Field{[10]uint32{0x00230f83, 0x03f15ff0, 0x00960a17, 0x01fa3894, 0x006ab10b, 0x03b26d18, 0x02b1125d, 0x02b0c476, 0x00f5c6ae, 0x00023a79}}, Y: Field{[10]uint32{0x03959ab2, 0x01db4c6a, 0x03dee645, 0x00d358a1, 0x03f1e32c, 0x0016899f, 0x03d4e53a, 0x02ede5e2, 0x0211c79f, 0x003fec38}}}, + {X: Field{[10]uint32{0x03e1ac2e, 0x0127fa4f, 0x03528295, 0x0207e012, 0x03d6f2bb, 0x0353542f, 0x027fb63b, 0x012dce18, 0x032373bd, 0x0021ef9c}}, Y: Field{[10]uint32{0x0294e1a4, 0x01087e1f, 0x00288ce8, 0x01f5d589, 0x021ae553, 0x03038956, 0x00844b2e, 0x02e6d7ff, 0x006ff147, 0x003daa46}}}, + {X: Field{[10]uint32{0x019d60f7, 0x01c9f859, 0x02c95002, 0x019abcd2, 0x01d2cfd4, 0x01722493, 0x029514ab, 0x00e1d217, 0x0161c836, 0x0010d807}}, Y: Field{[10]uint32{0x03bc2c2a, 0x039d6d60, 0x02b099a5, 0x00d999e7, 0x00113335, 0x02316eef, 0x028034b8, 0x032536cc, 0x00007c09, 0x0021e470}}}, + {X: Field{[10]uint32{0x02b49d0d, 0x02abe8ca, 0x020aca0d, 0x0250a895, 0x026902e3, 0x0299abe5, 0x01f0bcbb, 0x01c714d9, 0x0180f830, 0x000d06c5}}, Y: Field{[10]uint32{0x00877b20, 0x00d38519, 0x01d941c0, 0x0386e840, 0x037e8fdb, 0x0119271b, 0x03564d2d, 0x024099ff, 0x0313c549, 0x0012e616}}}, + {X: Field{[10]uint32{0x014dad95, 0x009c5c7c, 0x012eb576, 0x02a39592, 0x0033ac1a, 0x01e7ec55, 0x03181e2c, 0x00e90df1, 0x00b3ce4a, 0x0005d79f}}, Y: Field{[10]uint32{0x01135b0d, 0x0363f0a0, 0x01d9ce92, 0x01558f29, 0x02581301, 0x00da5bd0, 0x038703f9, 0x03d4bbf3, 0x01a87834, 0x000c7398}}}, + {X: Field{[10]uint32{0x007165ad, 0x0391704c, 0x03a98249, 0x02553202, 0x0089c1e4, 0x0328fb2b, 0x033c8482, 0x0071878e, 0x00cc64e6, 0x0016b50c}}, Y: Field{[10]uint32{0x0251c791, 0x033b3aa4, 0x03fbeac7, 0x01b86b08, 0x009ead5f, 0x016a2e17, 0x03ca083c, 0x004ef0c5, 0x0060505c, 0x002fa8a8}}}, + {X: Field{[10]uint32{0x01b8b837, 0x03fbe983, 0x009f28ae, 0x038f75f4, 0x01080f0c, 0x01fea130, 0x00602df0, 0x038c6262, 0x00d96dac, 0x00107738}}, Y: Field{[10]uint32{0x02827928, 0x03fe3434, 0x02e333cd, 0x0247e137, 0x02088500, 0x0154c8ed, 0x02635ea8, 0x01ba7225, 0x003fed9a, 0x001d258b}}}, + {X: Field{[10]uint32{0x01961bcc, 0x0330508e, 0x03e5ba23, 0x017810cb, 0x039aed2d, 0x00819d90, 0x03c1dc25, 0x01376840, 0x00988710, 0x00297bd1}}, Y: Field{[10]uint32{0x0122db3a, 0x02c3587c, 0x009f0696, 0x0099d96c, 0x02a165c5, 0x0194ee9e, 0x02ecc328, 0x038364f9, 0x003ea363, 0x00072f3e}}}, + {X: Field{[10]uint32{0x033a9d45, 0x015c8d7e, 0x01e626db, 0x00b8b5b5, 0x0218225f, 0x014a8b2f, 0x03df68b8, 0x01800ce2, 0x02ce9ad4, 0x0013689b}}, Y: Field{[10]uint32{0x01fae659, 0x037a427a, 0x029c73d3, 0x001b9ee8, 0x0061b0a8, 0x030f587d, 0x0210e2d1, 0x011aff31, 0x02637ab5, 0x003442d6}}}, + {X: Field{[10]uint32{0x018f4763, 0x03b71a7e, 0x0111129d, 0x0214479a, 0x03e9d955, 0x0286693d, 0x00d8eb16, 0x01023922, 0x026f53d2, 0x001b9887}}, Y: Field{[10]uint32{0x00ea1a19, 0x017f540f, 0x0048e4bb, 0x00b2d4b1, 0x007b945a, 0x00d0b1ef, 0x01ad4779, 0x02c4c4d0, 0x02f273e1, 0x001ec523}}}, + {X: Field{[10]uint32{0x038be83b, 0x01553549, 0x02ab6da4, 0x002a3c20, 0x0066bae2, 0x028e56a4, 0x017ea758, 0x01d1a66d, 0x03645bed, 0x003aebd5}}, Y: Field{[10]uint32{0x03cfbba7, 0x02ae782f, 0x02028650, 0x01298049, 0x02d91631, 0x0227b8f9, 0x029ea943, 0x00c0cd78, 0x00e06c65, 0x001611fd}}}, + {X: Field{[10]uint32{0x0310182f, 0x03fd8d4c, 0x0017a6a6, 0x028450e3, 0x02faa38c, 0x014ac574, 0x0355dbf0, 0x018cb492, 0x0271711b, 0x00303e22}}, Y: Field{[10]uint32{0x010676ff, 0x027913b3, 0x012481c5, 0x02605069, 0x03fb2e98, 0x002020be, 0x0211eec4, 0x01c08619, 0x014d16c0, 0x000b2feb}}}, + {X: Field{[10]uint32{0x035c6350, 0x00a1ec16, 0x00ae01b5, 0x02dcf3dc, 0x02dc1cdd, 0x018a48b1, 0x0244fbf2, 0x02526318, 0x001884b7, 0x001766db}}, Y: Field{[10]uint32{0x017fdf1d, 0x0144431f, 0x0297e5e8, 0x02316dab, 0x0118db17, 0x02d53321, 0x03e1644b, 0x0058b12a, 0x031d2f2b, 0x000ca3a0}}}, + {X: Field{[10]uint32{0x0202e21c, 0x03127c13, 0x00016654, 0x02555641, 0x03e57d75, 0x008e94ed, 0x03214c63, 0x01b9a753, 0x020f37ed, 0x0034744d}}, Y: Field{[10]uint32{0x01d15e4e, 0x007ce51b, 0x02b6a152, 0x0351b248, 0x006eba68, 0x002a2c40, 0x01594144, 0x02d4fe51, 0x0293c6c9, 0x00189fba}}}, + {X: Field{[10]uint32{0x02411731, 0x01a732fb, 0x00703e49, 0x020d959d, 0x02ace29a, 0x01ec6cac, 0x02cfa189, 0x00ebd562, 0x03cbf102, 0x003bf261}}, Y: Field{[10]uint32{0x01740c69, 0x026f10bd, 0x01dbbe15, 0x03f27d59, 0x02e38242, 0x02f3bd0c, 0x02429863, 0x002fb1c5, 0x0265d379, 0x0006569a}}}, + {X: Field{[10]uint32{0x00284ff0, 0x0243ea86, 0x02b01310, 0x01ee0fbd, 0x00968d1d, 0x00e19120, 0x0388b787, 0x03cef586, 0x0397163d, 0x003cc09a}}, Y: Field{[10]uint32{0x0211509b, 0x015ab06d, 0x030e9a6c, 0x01321359, 0x035f8764, 0x0167c1bf, 0x0281615d, 0x018eaefc, 0x02616823, 0x0005df0e}}}, + {X: Field{[10]uint32{0x002c5873, 0x0082435a, 0x0030b562, 0x03e5a3fe, 0x020deeec, 0x03273fd1, 0x02c92c68, 0x016da64a, 0x035f123b, 0x00174d3f}}, Y: Field{[10]uint32{0x01955ac8, 0x02d989b1, 0x02ff3d49, 0x03ea03e2, 0x0025443e, 0x023ac586, 0x0204df14, 0x0281950c, 0x039c8eab, 0x000b4682}}}, + {X: Field{[10]uint32{0x028447f4, 0x019ca011, 0x030bbdac, 0x0074c6a6, 0x00e0ee59, 0x010c2332, 0x01da0658, 0x01491f0e, 0x021794a9, 0x0032fe6e}}, Y: Field{[10]uint32{0x00461736, 0x009e5ab4, 0x005381b8, 0x0075d3c0, 0x03405810, 0x00d044b4, 0x025fade9, 0x02ba8408, 0x00c310fe, 0x001526c6}}}, + {X: Field{[10]uint32{0x03dcd31f, 0x032b3531, 0x03a5379a, 0x02e0da35, 0x008e7747, 0x015e9cd1, 0x01982a6b, 0x00986efd, 0x01ba09e2, 0x0024825d}}, Y: Field{[10]uint32{0x00b46dbd, 0x039d8e2b, 0x03dcb434, 0x012f5516, 0x016367d2, 0x0255040c, 0x0221f5ae, 0x01543424, 0x010881af, 0x003a5781}}}, + {X: Field{[10]uint32{0x03eeca64, 0x033c4c81, 0x000ff33f, 0x0048ef06, 0x00391323, 0x02d3c974, 0x02cdce82, 0x02d57649, 0x02e46fdc, 0x002056ca}}, Y: Field{[10]uint32{0x01b8c971, 0x022d3f92, 0x01512c96, 0x021d57c9, 0x0199285b, 0x0194462e, 0x01e2e268, 0x018dd23c, 0x03c67d88, 0x0018bd8d}}}, + {X: Field{[10]uint32{0x03e0b16e, 0x00f1153d, 0x019260de, 0x0097688c, 0x0227ca80, 0x02934e1f, 0x02a86397, 0x0352e8c3, 0x02c28e28, 0x0006ee69}}, Y: Field{[10]uint32{0x00d7ab93, 0x03bf1277, 0x01a94f56, 0x0355040d, 0x03206349, 0x031f8051, 0x004265ea, 0x005c7206, 0x00165e32, 0x002832f0}}}, + {X: Field{[10]uint32{0x0268bc22, 0x00cdf1b6, 0x00c3d34d, 0x02e9e3ad, 0x019c05a4, 0x03789e3c, 0x019d29dd, 0x020faac2, 0x03fedffd, 0x001bc054}}, Y: Field{[10]uint32{0x03f0c626, 0x00147e79, 0x02f824d5, 0x019c3838, 0x039fc499, 0x0288c7ca, 0x00041d3a, 0x00fe167d, 0x000d3501, 0x00294cb4}}}, + {X: Field{[10]uint32{0x0320258a, 0x032dea46, 0x028552e9, 0x039b1b6b, 0x02ed23e5, 0x006fd556, 0x000d3847, 0x01de9034, 0x033b3bee, 0x000d153d}}, Y: Field{[10]uint32{0x00d18dde, 0x023e54b6, 0x0128f23a, 0x00e8fd03, 0x03992683, 0x01af7b70, 0x025bcaa0, 0x007a3cff, 0x0046cfdf, 0x0024b082}}}, + {X: Field{[10]uint32{0x030e9a86, 0x024c5f08, 0x01f02fc5, 0x021903b7, 0x001dfcf6, 0x0354a00c, 0x00c2616a, 0x01ad386e, 0x03c9a360, 0x000d9e01}}, Y: Field{[10]uint32{0x016ecae6, 0x012904b0, 0x01a14830, 0x00bc00a0, 0x03fdc4f9, 0x00902572, 0x01ba14c1, 0x03b39c0f, 0x032fa2bb, 0x0007c08f}}}, + {X: Field{[10]uint32{0x001af62b, 0x02965048, 0x00909acb, 0x0105d7f1, 0x0101b825, 0x03112e05, 0x034e06f0, 0x03dabc4d, 0x01c39891, 0x0023b13f}}, Y: Field{[10]uint32{0x034e5f1b, 0x015b3dfb, 0x01751137, 0x033d7f0a, 0x00fe067b, 0x00f1e63e, 0x01ca0e50, 0x03621e0f, 0x02e5cac2, 0x000b71b2}}}, + {X: Field{[10]uint32{0x0178a263, 0x026c1aa4, 0x03842872, 0x014546e2, 0x03ffa085, 0x017ea4df, 0x0142f91e, 0x0093e451, 0x026d4c5b, 0x00173092}}, Y: Field{[10]uint32{0x037da472, 0x027573fe, 0x00b98da1, 0x02a0f76f, 0x02ca8d55, 0x0067e87f, 0x0338a4e4, 0x00687efe, 0x02358153, 0x002c76a1}}}, + {X: Field{[10]uint32{0x03599e9f, 0x013f1378, 0x02a21913, 0x01414314, 0x0292602a, 0x02a04374, 0x0244a6cd, 0x00170ea5, 0x0126c039, 0x0020e416}}, Y: Field{[10]uint32{0x0246089a, 0x0038315e, 0x01e16cf2, 0x022c8767, 0x00909429, 0x02a0dd8e, 0x00b115ea, 0x019e4a88, 0x020fe8af, 0x0010a4c9}}}, + {X: Field{[10]uint32{0x0189b6c7, 0x02ca6159, 0x00822481, 0x0050d2b9, 0x02e8fa6c, 0x034e1e3e, 0x0204ac30, 0x03a777e0, 0x017e4721, 0x002512c2}}, Y: Field{[10]uint32{0x03d6ddf6, 0x03d2e5a6, 0x00e8ee8a, 0x013011d9, 0x011525bd, 0x039d16e6, 0x03796431, 0x02c257e2, 0x016530e9, 0x0017f11d}}}, + {X: Field{[10]uint32{0x0023b73d, 0x017aefcd, 0x0030107b, 0x00797ea4, 0x0117327a, 0x018e9ccc, 0x00aaf04a, 0x0304d387, 0x023fcfb7, 0x002ac2d2}}, Y: Field{[10]uint32{0x0296c9da, 0x00efc6b3, 0x00781376, 0x034de170, 0x02b84944, 0x02bb334e, 0x038c92cf, 0x02ea2b35, 0x0263a5bb, 0x003879e4}}}, + {X: Field{[10]uint32{0x03e8b85f, 0x00f7fb83, 0x010bcf80, 0x0361efc2, 0x031aa2c3, 0x0168b939, 0x03f7fbf0, 0x00ac3bde, 0x00b5220f, 0x0015e8d1}}, Y: Field{[10]uint32{0x01a7d04e, 0x0398e6ec, 0x00f10576, 0x00f059e3, 0x01a9e11a, 0x00e9caa5, 0x00c9f135, 0x02588392, 0x010e08ef, 0x003e0adf}}}, + {X: Field{[10]uint32{0x00d81ac5, 0x02498ff2, 0x0188da1a, 0x025bb118, 0x033608e3, 0x033c3d3f, 0x038c4c95, 0x01f13147, 0x021a800b, 0x001b814f}}, Y: Field{[10]uint32{0x015e7473, 0x0363124e, 0x03dbadc3, 0x01e5c80b, 0x0362e365, 0x03390a30, 0x035384ff, 0x008f2786, 0x0298e3c8, 0x00218e27}}}, + {X: Field{[10]uint32{0x02485cb7, 0x03ab8973, 0x03f1c59d, 0x03b1fc20, 0x0148a289, 0x0159ed51, 0x00d4a7c7, 0x01c5fecc, 0x00061804, 0x0018b5d9}}, Y: Field{[10]uint32{0x0268be84, 0x03f2506d, 0x020fc4ca, 0x00b6989a, 0x03d1509b, 0x011c3ed4, 0x031d57b9, 0x007e3614, 0x014b661d, 0x003c758c}}}, + {X: Field{[10]uint32{0x0129250f, 0x011fcc77, 0x006589e3, 0x00020b4d, 0x025c4d08, 0x02f49126, 0x00cf1080, 0x02caaa0c, 0x00f2219f, 0x003976ca}}, Y: Field{[10]uint32{0x008bd453, 0x023f9a22, 0x00b248e5, 0x034bcd7e, 0x03324fcf, 0x02b512db, 0x03b7012e, 0x01f756e8, 0x024632f9, 0x0030a5b9}}}, + {X: Field{[10]uint32{0x01b32729, 0x02057c42, 0x00ab23fe, 0x026f0a65, 0x03733ec8, 0x03ffe0c7, 0x013177c9, 0x00379229, 0x03e9a3d0, 0x0011c96c}}, Y: Field{[10]uint32{0x01f8e778, 0x0279a26e, 0x02e12d4a, 0x0334a5e7, 0x02324127, 0x0120aed4, 0x01fdb741, 0x03003c51, 0x0347de38, 0x002b0edd}}}, + {X: Field{[10]uint32{0x01d72b3e, 0x0278d190, 0x00569bbe, 0x017a9db8, 0x03b036b6, 0x0004f8d1, 0x00ed9187, 0x01cb9ce5, 0x03b6492c, 0x003434eb}}, Y: Field{[10]uint32{0x0202fef3, 0x010bede3, 0x03f1396f, 0x002c0bd8, 0x00bd952b, 0x0028a158, 0x0061caa0, 0x03f81d4c, 0x005b94aa, 0x000b74e9}}}, + {X: Field{[10]uint32{0x0304632c, 0x0241a3f0, 0x00b4c786, 0x03b73d2d, 0x03104143, 0x0092b3fc, 0x0385654a, 0x03215e5e, 0x0335d717, 0x001e14f9}}, Y: Field{[10]uint32{0x021efadd, 0x00d4d577, 0x00e69cb5, 0x0068524e, 0x02bae3a3, 0x01680a48, 0x0377a8fb, 0x03452b09, 0x03d9e70f, 0x00002a1c}}}, + {X: Field{[10]uint32{0x02e904a4, 0x02778ce3, 0x032ca778, 0x0325fe75, 0x02ee44e2, 0x013248d5, 0x021a01a1, 0x0371644e, 0x02b37d4f, 0x0001b6c9}}, Y: Field{[10]uint32{0x031941fb, 0x00a2ba58, 0x01b6854a, 0x02498e1a, 0x02d8adf7, 0x02612712, 0x001c409e, 0x028330a3, 0x0225bf2b, 0x00053f88}}}, + {X: Field{[10]uint32{0x032848df, 0x028bbe3a, 0x00ce699a, 0x003d8ea7, 0x02538e40, 0x01a7e90f, 0x02f7f5c6, 0x02bcf02c, 0x0069bb98, 0x002d4bc2}}, Y: Field{[10]uint32{0x0107be5a, 0x005b85e2, 0x03858bb6, 0x02329dbe, 0x028b821c, 0x00395eda, 0x03378cca, 0x01152b9e, 0x032455bc, 0x0009159a}}}, + {X: Field{[10]uint32{0x0197b448, 0x007e4e80, 0x037e4c1e, 0x03004e13, 0x03234152, 0x01c3e9f0, 0x034a9e99, 0x02bc0fac, 0x01e11ee6, 0x00218537}}, Y: Field{[10]uint32{0x0372f3cc, 0x0134f31e, 0x02ba15e5, 0x015762e9, 0x024e5c7e, 0x008c3103, 0x0222b5ad, 0x01a1c0ae, 0x01a2ac99, 0x000a8449}}}, + {X: Field{[10]uint32{0x038c1cfa, 0x00824de4, 0x00ab2dbc, 0x03ad6743, 0x008b3308, 0x03c82f74, 0x0271c180, 0x01b96de3, 0x03ae625f, 0x00260a8d}}, Y: Field{[10]uint32{0x02a40d0c, 0x014c26ad, 0x017dc18e, 0x00af75b1, 0x032a689e, 0x02d41c2f, 0x01249e20, 0x0144a164, 0x016f00a6, 0x0019c7f8}}}, + {X: Field{[10]uint32{0x003e703a, 0x0068bf53, 0x01d9b408, 0x02bc8b2a, 0x00627a09, 0x0248c700, 0x019742fc, 0x020a73b2, 0x030526b4, 0x001afaa4}}, Y: Field{[10]uint32{0x019a6cc1, 0x00ac1652, 0x014832b0, 0x0043116f, 0x01d7541f, 0x00650f9a, 0x0344d14b, 0x01ed307c, 0x002a5451, 0x002bb150}}}, + {X: Field{[10]uint32{0x02583edb, 0x01ef4a65, 0x019200ba, 0x026481cc, 0x0054016a, 0x01b445ac, 0x00188b33, 0x0121f9f3, 0x03818694, 0x002d5c91}}, Y: Field{[10]uint32{0x03845cdc, 0x03d8a19d, 0x03ec6208, 0x02ced35f, 0x011d278f, 0x02f163ff, 0x018262de, 0x0292f4f5, 0x01861f80, 0x00172ef4}}}, + {X: Field{[10]uint32{0x017c5412, 0x03a78b66, 0x01bb62e0, 0x00d1c13b, 0x024df5a5, 0x022b14e4, 0x02f4f531, 0x003a45e1, 0x02627ba0, 0x003786b7}}, Y: Field{[10]uint32{0x022021e0, 0x03fba76b, 0x01a8e4bf, 0x039b8742, 0x03a9d003, 0x007019cf, 0x02dc15a4, 0x00efeff1, 0x02c50bf2, 0x001fbd21}}}, + {X: Field{[10]uint32{0x0398c0a0, 0x01b4dbcc, 0x0166dd47, 0x0262f004, 0x03337203, 0x02e03875, 0x01e465df, 0x0071067e, 0x017cb172, 0x000dce29}}, Y: Field{[10]uint32{0x030c22f5, 0x01529e2d, 0x00bfd118, 0x01b14a49, 0x0243df56, 0x03610e16, 0x028a629a, 0x02c5b5b4, 0x03b21662, 0x00387c96}}}, + {X: Field{[10]uint32{0x0281885d, 0x00001b9e, 0x02e37694, 0x02e2dd40, 0x021955fe, 0x0377db6a, 0x01575f12, 0x0048e6a1, 0x01c16b2a, 0x00132b88}}, Y: Field{[10]uint32{0x00dc99c3, 0x03d5972d, 0x019e237a, 0x026ca755, 0x0225fa2c, 0x020a0cac, 0x0271e89c, 0x0183609d, 0x00553886, 0x000abffa}}}, + {X: Field{[10]uint32{0x00c2bd7b, 0x00bebe37, 0x02039573, 0x03b86ea9, 0x0397bfa7, 0x016f30e9, 0x037cf558, 0x002f8db8, 0x021fba8a, 0x00131446}}, Y: Field{[10]uint32{0x025651af, 0x029172ac, 0x0372d8a6, 0x01a621f0, 0x03abb272, 0x02575a0c, 0x0000fd4a, 0x02affc8d, 0x03945c6b, 0x003a9a7d}}}, + {X: Field{[10]uint32{0x005a7e29, 0x0145e79d, 0x01f8320c, 0x012cae94, 0x02c2e4a4, 0x03a4db02, 0x007c25ad, 0x010dc098, 0x00c4323b, 0x00360476}}, Y: Field{[10]uint32{0x03c05345, 0x037652b9, 0x0293c3c4, 0x00fda7e7, 0x0346c6df, 0x02d2438e, 0x020aeabc, 0x011fe036, 0x00a217bf, 0x001bfe5c}}}, + {X: Field{[10]uint32{0x02c43eee, 0x03897985, 0x01b0b1ca, 0x02b87ec2, 0x0233db68, 0x004ed7fe, 0x01bbafdf, 0x02abff8e, 0x01d3b5e5, 0x000407ad}}, Y: Field{[10]uint32{0x02c5ddb3, 0x00698eae, 0x00f4a163, 0x00e4d383, 0x00a49709, 0x02c0c483, 0x03a1c96e, 0x01c96981, 0x01149867, 0x00275a95}}}, + {X: Field{[10]uint32{0x02480519, 0x0073e2dc, 0x03968de2, 0x01c3bfe3, 0x01ecdc7f, 0x018bfab4, 0x001f21f0, 0x03917f85, 0x0152b8dd, 0x00227ac4}}, Y: Field{[10]uint32{0x0297b447, 0x036c1f2d, 0x0195b41f, 0x02a18fef, 0x00cb6703, 0x00af11dc, 0x02c99d7f, 0x038f55a7, 0x03c43181, 0x003e28cd}}}, + {X: Field{[10]uint32{0x02d0dc16, 0x03a59366, 0x030cdbd1, 0x03ada379, 0x0149d95e, 0x0154066a, 0x03d8f1e4, 0x0291349c, 0x03f3f48e, 0x0014f58c}}, Y: Field{[10]uint32{0x011645fe, 0x03f4cef3, 0x023af48f, 0x03b923f9, 0x028e8ff4, 0x039b6df9, 0x03fe6f32, 0x033c6cfd, 0x0176964d, 0x0006c9bb}}}, + {X: Field{[10]uint32{0x00d9be6a, 0x023e57f6, 0x02d1a92f, 0x012e0e62, 0x006ce3db, 0x0273b6d9, 0x0294d26b, 0x00441966, 0x01104989, 0x0037841a}}, Y: Field{[10]uint32{0x02b43d32, 0x03644cd7, 0x03e7b5b9, 0x039b73e0, 0x008768a4, 0x008f5022, 0x00a3d06d, 0x0274595e, 0x0341dbd9, 0x0021d902}}}, + {X: Field{[10]uint32{0x02f5bea2, 0x005dcf1a, 0x023caf76, 0x01ed0685, 0x00cc6daa, 0x02027684, 0x0189a9a7, 0x038916b0, 0x026f0b9e, 0x00103b47}}, Y: Field{[10]uint32{0x00217b2e, 0x0330787f, 0x03adb50b, 0x00ba9c65, 0x0082bae8, 0x010c2b01, 0x02b7bdf1, 0x03ee69e3, 0x01017298, 0x003ffb45}}}, + {X: Field{[10]uint32{0x03ba15c1, 0x0046f599, 0x02dfaa3b, 0x028ca7c9, 0x001b7ab3, 0x03a94a73, 0x004d1719, 0x002e68de, 0x02ee59a2, 0x00157eaa}}, Y: Field{[10]uint32{0x002f4a65, 0x014f77c6, 0x0075c373, 0x00169f95, 0x000d7f28, 0x0391c197, 0x014771d8, 0x014f8d7b, 0x039b52ac, 0x002a7e24}}}, + {X: Field{[10]uint32{0x028af3fb, 0x02f40afe, 0x03ccba53, 0x001fc0d3, 0x00a95ac6, 0x01255b44, 0x000ca172, 0x0222bc86, 0x024e21cf, 0x002d4779}}, Y: Field{[10]uint32{0x03b7f81e, 0x02ce1b00, 0x01ac4878, 0x0066922c, 0x029b8400, 0x0399b129, 0x0399f1f6, 0x00bafd1a, 0x03701c65, 0x0005d766}}}, + {X: Field{[10]uint32{0x0307b143, 0x03e65ede, 0x00171556, 0x03a3361d, 0x007b8927, 0x00d9f3d0, 0x03235be9, 0x007a092e, 0x00dcbcd9, 0x001455ac}}, Y: Field{[10]uint32{0x00cc91dc, 0x03d2fe08, 0x018dec2a, 0x02432ec3, 0x01d40ada, 0x0049c05b, 0x01ded191, 0x0130ff99, 0x000fa29d, 0x0007515f}}}, + {X: Field{[10]uint32{0x016dd63d, 0x00476382, 0x02bcd00e, 0x0019e46d, 0x03f1993c, 0x02391069, 0x01fac558, 0x0125cc58, 0x0172060b, 0x000efd47}}, Y: Field{[10]uint32{0x00722d49, 0x02ba293d, 0x0312663e, 0x038abdd3, 0x0173e1e4, 0x03da6126, 0x023905dd, 0x02bf6ff1, 0x007090a7, 0x001ef1ad}}}, + {X: Field{[10]uint32{0x02d61fe5, 0x036dec26, 0x0205ad76, 0x03193eab, 0x0122fa74, 0x029bcb68, 0x014f4d3b, 0x02040845, 0x00912008, 0x0034a5c4}}, Y: Field{[10]uint32{0x028e3fc8, 0x0123dad8, 0x00156926, 0x01cd954a, 0x02bc33cb, 0x014708f0, 0x000cc141, 0x03cf23e5, 0x03aaf2cc, 0x001cd43a}}}, + {X: Field{[10]uint32{0x0368013d, 0x02d82a71, 0x0126c559, 0x01f88d05, 0x036d7a3b, 0x007ff4c2, 0x015a5202, 0x0044be89, 0x03ca8e17, 0x0030bb91}}, Y: Field{[10]uint32{0x03ece448, 0x0014058a, 0x0031a453, 0x002080a6, 0x0280d9ff, 0x036cec8e, 0x008e83be, 0x01fd6c77, 0x036bd83b, 0x000b9ba2}}}, + {X: Field{[10]uint32{0x0270b6cf, 0x016b6f4f, 0x03aaae47, 0x012d5876, 0x00c5ef44, 0x01b31300, 0x00da39e9, 0x03383678, 0x00d69ddc, 0x00156666}}, Y: Field{[10]uint32{0x00ffb328, 0x014d308d, 0x03ac525c, 0x01cc6bcb, 0x00cf0f31, 0x02d34879, 0x02b5e8cd, 0x03b96e37, 0x020095ae, 0x0031270a}}}, + {X: Field{[10]uint32{0x03baf363, 0x0152405a, 0x032f9e9d, 0x03764372, 0x017c1955, 0x01c86a63, 0x01305c39, 0x02eb7791, 0x02c3e4c8, 0x0012d2c0}}, Y: Field{[10]uint32{0x00d43468, 0x01a178c6, 0x00fb925b, 0x0191856f, 0x01d22a6a, 0x00f70c13, 0x01d546e0, 0x0166cf09, 0x037ebe8f, 0x00282d9e}}}, + {X: Field{[10]uint32{0x02c549c5, 0x01f74b2a, 0x0101fe0d, 0x03a3b87b, 0x007650ad, 0x0350a25f, 0x00f897c5, 0x02d09d47, 0x03fd7836, 0x003eebf9}}, Y: Field{[10]uint32{0x02668436, 0x00044384, 0x03aeb5e7, 0x00a26914, 0x01229a7e, 0x03b69489, 0x03841f58, 0x01f945ed, 0x014352d0, 0x000bd446}}}, + {X: Field{[10]uint32{0x0076c06c, 0x03786d9c, 0x0219f954, 0x0340a92c, 0x0281b21b, 0x01ceb139, 0x004e620b, 0x02e281e2, 0x02f90c65, 0x003334c1}}, Y: Field{[10]uint32{0x0257510b, 0x017d6c55, 0x005668ab, 0x029d6932, 0x00003f68, 0x00f8115d, 0x03056dc7, 0x02d43241, 0x007fa7b0, 0x00208fe9}}}, + {X: Field{[10]uint32{0x00195a3b, 0x02e35586, 0x01980820, 0x0177626a, 0x01912415, 0x0211d14b, 0x01a870a7, 0x01a474ed, 0x0038995a, 0x002ebef6}}, Y: Field{[10]uint32{0x00ad92a3, 0x024f9f42, 0x006874e8, 0x03560e72, 0x004f05f4, 0x00082d6c, 0x00e7f521, 0x00a7bbec, 0x01fac948, 0x00237d32}}}, + {X: Field{[10]uint32{0x024f458f, 0x0330e008, 0x019fb157, 0x00dee1a4, 0x00713d8f, 0x03e50299, 0x0166af8f, 0x0055b828, 0x003a8073, 0x00344973}}, Y: Field{[10]uint32{0x0035abde, 0x013b2f2f, 0x012a3a03, 0x00bbc981, 0x021bb7a2, 0x0288e9e3, 0x001054ae, 0x00de9f7c, 0x00b6ac4e, 0x00280c3a}}}, + {X: Field{[10]uint32{0x038187c2, 0x03c9e3b2, 0x008668cb, 0x03f629fa, 0x01f2d1bb, 0x0388b90b, 0x02c6433b, 0x036aebbc, 0x03281b5d, 0x001f5247}}, Y: Field{[10]uint32{0x00dfe8ed, 0x009ee9bd, 0x02af9bea, 0x031faf20, 0x0228b040, 0x01d82cbf, 0x0381ea3f, 0x00259b28, 0x021d7036, 0x00328605}}}, + {X: Field{[10]uint32{0x01f8c39e, 0x017c1ef3, 0x03961601, 0x025541e6, 0x016d70a5, 0x02a7d25e, 0x002995c6, 0x0048ea1b, 0x02339f29, 0x000c7336}}, Y: Field{[10]uint32{0x00b49f65, 0x030b93fa, 0x03a19561, 0x02c2f201, 0x02376626, 0x0018347c, 0x0128a9ff, 0x007eb265, 0x010bedf6, 0x002bac9f}}}, + {X: Field{[10]uint32{0x017807ba, 0x00e7d28a, 0x01ba7d74, 0x00bc3784, 0x01e5ec91, 0x006ddbec, 0x012073e7, 0x024625b2, 0x00c7f45f, 0x0001e799}}, Y: Field{[10]uint32{0x0023c921, 0x0177b5d6, 0x02e7efe8, 0x02f3258c, 0x00d17685, 0x0097626d, 0x011abe38, 0x0258f162, 0x0036b354, 0x0015f64d}}}, + {X: Field{[10]uint32{0x0042274e, 0x00c7daa3, 0x0206c78a, 0x034b7af3, 0x0369f422, 0x002f690f, 0x02f057b6, 0x00e1a1c7, 0x02dffccb, 0x003588cb}}, Y: Field{[10]uint32{0x000ef826, 0x0331f5fb, 0x004d6d62, 0x018eb0f7, 0x0158a18f, 0x026d7df4, 0x03472f22, 0x038274db, 0x03a0b2e2, 0x0004f6bb}}}, + {X: Field{[10]uint32{0x006e368e, 0x02ed99d1, 0x03ea6a7e, 0x0349228c, 0x00722d78, 0x020a2516, 0x038fc00c, 0x038e94dc, 0x0298b2d6, 0x0008703c}}, Y: Field{[10]uint32{0x03062383, 0x019837f7, 0x034a2b20, 0x016b97cc, 0x02cbb3f2, 0x017695a7, 0x015eede1, 0x03f656e2, 0x03ec17d2, 0x00219d54}}}, + {X: Field{[10]uint32{0x003196c8, 0x00b2bb93, 0x031d0f4f, 0x0070ff66, 0x00eaa231, 0x013dd1c8, 0x011621c5, 0x03de6755, 0x01010dcb, 0x0007468f}}, Y: Field{[10]uint32{0x039734eb, 0x03ebab90, 0x0233d6f8, 0x00701f97, 0x005453bf, 0x00e51763, 0x01b1a301, 0x03e4321e, 0x01159900, 0x003569e8}}}, + {X: Field{[10]uint32{0x00e76735, 0x02ec770a, 0x025614f4, 0x0171dd4e, 0x0162e26d, 0x0160a854, 0x00a97d18, 0x027b7803, 0x02808fa9, 0x0015d221}}, Y: Field{[10]uint32{0x03c17c6f, 0x02876e4b, 0x02b1eeba, 0x00d2576c, 0x00b3bbee, 0x03b06925, 0x000ecc54, 0x03b78373, 0x00597117, 0x0037af6a}}}, + {X: Field{[10]uint32{0x0391715a, 0x03eb7225, 0x0207c9f6, 0x034c7073, 0x03607194, 0x0322f7a7, 0x01e820c4, 0x037fe938, 0x00d34ce1, 0x002db74d}}, Y: Field{[10]uint32{0x0239cc9d, 0x02194862, 0x03200717, 0x0150e810, 0x031487e5, 0x0126f1f3, 0x01c0ec90, 0x0354ccab, 0x0068e405, 0x0022fd22}}}, + {X: Field{[10]uint32{0x0291d0de, 0x01412f52, 0x031600f3, 0x01b27882, 0x035821df, 0x0148b7e6, 0x02bc8871, 0x021dcb28, 0x02d56908, 0x00243e77}}, Y: Field{[10]uint32{0x02f902ac, 0x03ae9dba, 0x017f9a2b, 0x006c498e, 0x01f76b3c, 0x011250ce, 0x010af26b, 0x0129bbf7, 0x024add53, 0x000345f9}}}, + {X: Field{[10]uint32{0x032cfa59, 0x02b3195a, 0x0299d260, 0x00e66c40, 0x03db07b2, 0x00c00a1c, 0x006e4a0c, 0x024d4e44, 0x00e858d1, 0x003157cd}}, Y: Field{[10]uint32{0x00e50f5b, 0x0058b78c, 0x00dda11f, 0x03ef05ae, 0x009a8fe1, 0x00b3becd, 0x0149f7fe, 0x0288b9ca, 0x00d474b5, 0x001f67ce}}}, + {X: Field{[10]uint32{0x02b8ecad, 0x03c5c895, 0x025750c5, 0x034adbd4, 0x03f39c16, 0x0128ad89, 0x03f8452c, 0x0207166c, 0x0192d389, 0x001ab910}}, Y: Field{[10]uint32{0x030b099d, 0x0365c55f, 0x02d61603, 0x0073b69a, 0x03fa61de, 0x00e3925c, 0x01c4b91e, 0x00812a7b, 0x00dd7c49, 0x0026eeea}}}, + {X: Field{[10]uint32{0x03dcffbc, 0x0113bbdb, 0x0379ae03, 0x007db362, 0x00bd0c25, 0x02ad9113, 0x013ad99e, 0x006cd9aa, 0x0239423e, 0x000ce9f5}}, Y: Field{[10]uint32{0x0011c61e, 0x021b8ee5, 0x002c02bb, 0x024756eb, 0x032f0678, 0x027b48b4, 0x012684fc, 0x0328abe9, 0x02cc006d, 0x00309844}}}, + {X: Field{[10]uint32{0x0159af0a, 0x010351fc, 0x024b2ea6, 0x03643d4a, 0x013380c1, 0x01db29b1, 0x03a6642a, 0x0219c0a3, 0x0331eac4, 0x001211c4}}, Y: Field{[10]uint32{0x00142704, 0x021b51e8, 0x0314d5b5, 0x0251c169, 0x01c5047b, 0x022ed87d, 0x0103a311, 0x038073ee, 0x014693fd, 0x002d3aa1}}}, + {X: Field{[10]uint32{0x02587917, 0x0004a970, 0x00e86d46, 0x01e6fae3, 0x0172defd, 0x00f492dc, 0x03faab74, 0x00c70133, 0x00399ae7, 0x0001596b}}, Y: Field{[10]uint32{0x00bbab48, 0x000a6066, 0x000d779c, 0x0227f53d, 0x02146649, 0x0026a591, 0x0011fece, 0x00c7abf1, 0x02a5d450, 0x0037ad5a}}}, + {X: Field{[10]uint32{0x00314c0b, 0x01c21726, 0x03773eaa, 0x0251b72f, 0x00995490, 0x03168cbf, 0x00d017d0, 0x00adf5aa, 0x00b53b6c, 0x0025920e}}, Y: Field{[10]uint32{0x01130b97, 0x03e717bf, 0x02a2f6ca, 0x027be810, 0x03ac6fdc, 0x039daf5d, 0x0271ee0e, 0x000d3f22, 0x033cec44, 0x000b6be7}}}, + {X: Field{[10]uint32{0x00eb88d5, 0x038bc7b1, 0x0087c4aa, 0x00340bbe, 0x006f9bff, 0x039522c5, 0x003522da, 0x001e2e76, 0x02907b8d, 0x002f0036}}, Y: Field{[10]uint32{0x00ddb152, 0x03856908, 0x02befeaf, 0x01fed066, 0x020fef4d, 0x0132ca7d, 0x0321dd13, 0x036dcd97, 0x0111f9e2, 0x001af43f}}}, + {X: Field{[10]uint32{0x03a7bea4, 0x01156af6, 0x0111d075, 0x02cc9fec, 0x00a2082b, 0x03d79543, 0x03dd8ae9, 0x027c33c4, 0x005500f8, 0x0006967e}}, Y: Field{[10]uint32{0x0200c823, 0x0321c29d, 0x035c2150, 0x01db8b90, 0x00e77e6e, 0x02997142, 0x0225c530, 0x02b7ff27, 0x0340d460, 0x001fa8be}}}, + {X: Field{[10]uint32{0x02ccc764, 0x01662953, 0x02fdad88, 0x028c9e69, 0x00452706, 0x015a5409, 0x01081624, 0x03f1ab51, 0x011bd3bf, 0x001e8ed8}}, Y: Field{[10]uint32{0x02233145, 0x0286b48c, 0x030d368a, 0x035a875c, 0x0283d30b, 0x015274ea, 0x033d6efe, 0x01b94b21, 0x01896806, 0x0005b825}}}, + {X: Field{[10]uint32{0x015d6d91, 0x01786dc0, 0x02bef4cd, 0x00a14444, 0x02a0a1cc, 0x0315b89e, 0x02fa95b5, 0x002969e1, 0x01779cbe, 0x000bfb55}}, Y: Field{[10]uint32{0x014bddfa, 0x02751b8b, 0x02637995, 0x0399bf97, 0x02f66fd3, 0x01b71942, 0x01691fa3, 0x01fed58f, 0x0027b229, 0x001fbab3}}}, + {X: Field{[10]uint32{0x034a9558, 0x0152835d, 0x02d02f01, 0x0377c6cd, 0x03018326, 0x02faed12, 0x03efaea6, 0x037d959c, 0x0217952e, 0x00099eb4}}, Y: Field{[10]uint32{0x01a13fef, 0x01456ec4, 0x01e6d907, 0x02de8121, 0x01703cc9, 0x02fd5280, 0x00a7b330, 0x017979a2, 0x00c07e9d, 0x001dd64f}}}, + {X: Field{[10]uint32{0x036687e8, 0x0017b85f, 0x02b106fa, 0x006f29fa, 0x010e0d34, 0x017cc851, 0x038cceca, 0x026721a5, 0x022c239b, 0x003adbb5}}, Y: Field{[10]uint32{0x02c0a241, 0x027eff14, 0x0133b662, 0x02e24187, 0x012a6e6a, 0x00eb61d5, 0x029b2258, 0x02a3a338, 0x022250f6, 0x002b6267}}}, + {X: Field{[10]uint32{0x030a9e5b, 0x00425350, 0x027b1089, 0x026fe232, 0x035087a5, 0x005a1b13, 0x00ef33c4, 0x00853c2d, 0x017ce03d, 0x0032973c}}, Y: Field{[10]uint32{0x00989ce9, 0x018eb4f4, 0x0003ef99, 0x0201c95e, 0x01e19351, 0x023a80a6, 0x03ae683c, 0x01d6eb3f, 0x02eb473f, 0x0005f913}}}, + {X: Field{[10]uint32{0x01e82f7c, 0x01c85794, 0x03a2fe4c, 0x033d1988, 0x00c82f21, 0x024f9adb, 0x03035eca, 0x0190b98f, 0x029cacf0, 0x00131ef0}}, Y: Field{[10]uint32{0x02776875, 0x034af8a0, 0x01322e59, 0x03903c7d, 0x03eb537b, 0x0102900a, 0x03f64e7e, 0x01e5b050, 0x036e8756, 0x001f1579}}}, + {X: Field{[10]uint32{0x031058e3, 0x0186f0d9, 0x03d2080b, 0x02108e27, 0x03797831, 0x02b3d375, 0x03e50130, 0x0227c140, 0x00e9b422, 0x0015f2ae}}, Y: Field{[10]uint32{0x03d9e2bc, 0x0262aaa7, 0x012ca7c3, 0x011650c3, 0x022b048c, 0x01cba6fb, 0x030b884e, 0x009cf69e, 0x03186671, 0x001e0894}}}, + {X: Field{[10]uint32{0x03c4823e, 0x03d8c426, 0x02c2753f, 0x01cbb4b9, 0x01abf3d2, 0x015a10fd, 0x0013a82a, 0x0030d37a, 0x023df112, 0x000f0afc}}, Y: Field{[10]uint32{0x013f1990, 0x03add64b, 0x029d0d08, 0x00a384bf, 0x00767409, 0x032772e2, 0x00c5b47e, 0x0348cf38, 0x036388ae, 0x0005d676}}}, + {X: Field{[10]uint32{0x02ab38d2, 0x0206c683, 0x02856d85, 0x0288a34d, 0x0234170a, 0x0373f774, 0x03348dc3, 0x01d0a834, 0x01ac83e0, 0x0030042a}}, Y: Field{[10]uint32{0x0076aafd, 0x009da10f, 0x038ea9cd, 0x004111ad, 0x002b2dc8, 0x02433e48, 0x031da1f1, 0x029a3f87, 0x03ed0644, 0x0018d325}}}, + {X: Field{[10]uint32{0x02071994, 0x01164ea4, 0x01660550, 0x00fee8ea, 0x014f1b77, 0x00f6722a, 0x00cb632b, 0x0291a039, 0x01ee548b, 0x00292af6}}, Y: Field{[10]uint32{0x00f87182, 0x017a3bf2, 0x00b6111b, 0x0123afff, 0x01c9390b, 0x0100d597, 0x02ab00a8, 0x00ca5ff1, 0x026aba26, 0x000e8509}}}, + {X: Field{[10]uint32{0x00dda172, 0x028ccf7a, 0x007115a7, 0x039666de, 0x01d68b82, 0x03b3bff9, 0x0008540d, 0x0057c717, 0x0052efc1, 0x003700b2}}, Y: Field{[10]uint32{0x036c29c6, 0x01febd57, 0x009ba236, 0x03732e15, 0x028a35f8, 0x023332a8, 0x03f4eaed, 0x03a10b29, 0x013a8e1a, 0x00393996}}}, + {X: Field{[10]uint32{0x01ec57c8, 0x036d68a4, 0x01cac1b6, 0x0205c85d, 0x000a54fc, 0x03ca7f5f, 0x00a5a4b5, 0x008bff0a, 0x01e82238, 0x003b91da}}, Y: Field{[10]uint32{0x0020385f, 0x004ff9b0, 0x00619384, 0x0050a025, 0x00338905, 0x02c05631, 0x0178b9a2, 0x0323ae82, 0x02bc4076, 0x003f28b1}}}, + {X: Field{[10]uint32{0x013ef066, 0x0349c9f6, 0x032abb11, 0x033cc493, 0x002cf990, 0x03c2230e, 0x035a6dec, 0x00303f50, 0x001d3491, 0x003cc01b}}, Y: Field{[10]uint32{0x0149eae2, 0x00da4132, 0x00d9b82d, 0x01b2237f, 0x03f8016a, 0x00d73c99, 0x01ebaf12, 0x01fd468a, 0x01f5aa36, 0x00001d8a}}}, + {X: Field{[10]uint32{0x027313b7, 0x02e4d5c7, 0x030f3794, 0x001124cb, 0x02b1b9c8, 0x00970ff5, 0x01f0a3e3, 0x0159a44a, 0x003d07bf, 0x001f3ec8}}, Y: Field{[10]uint32{0x002bc60f, 0x0116ed3a, 0x02d3982a, 0x03f99c60, 0x01e4ae08, 0x021ec05b, 0x00c42173, 0x0270e322, 0x01fd2433, 0x0013ddae}}}, + {X: Field{[10]uint32{0x02312c0a, 0x01343acc, 0x03206a32, 0x01c60eba, 0x01efeabe, 0x01c1156b, 0x0130be8e, 0x00264c27, 0x00e036e0, 0x0003328f}}, Y: Field{[10]uint32{0x0215b9e5, 0x035fa345, 0x018b20ef, 0x03766369, 0x0091b437, 0x00163223, 0x00637252, 0x01f1b4d3, 0x0258fe94, 0x00259d2b}}}, + {X: Field{[10]uint32{0x02b0d9c8, 0x02b39982, 0x01212c66, 0x03488e27, 0x01d9815f, 0x007e635c, 0x01a071c0, 0x01709e0b, 0x014881cd, 0x0027ed90}}, Y: Field{[10]uint32{0x01813251, 0x00f04fb4, 0x0309bce2, 0x011e71da, 0x03d11d50, 0x0013c71c, 0x035e515c, 0x00dd097d, 0x00541a51, 0x00013095}}}, + {X: Field{[10]uint32{0x01558b25, 0x001c2d94, 0x01542c2c, 0x03601aa8, 0x01eb5d2a, 0x009582d3, 0x0139de23, 0x03516443, 0x02bf03e3, 0x000076ef}}, Y: Field{[10]uint32{0x010b9db1, 0x02e739cb, 0x01876877, 0x0145a60c, 0x01940eae, 0x01d21328, 0x014753fd, 0x03924106, 0x031c2e94, 0x003b1a39}}}, + {X: Field{[10]uint32{0x006bb5f7, 0x00428fe9, 0x01e215a2, 0x03a49061, 0x015a890e, 0x01321350, 0x002856b0, 0x01d085dd, 0x021992f4, 0x001dd474}}, Y: Field{[10]uint32{0x03237fef, 0x00f19206, 0x01a2273a, 0x028532b1, 0x036371f6, 0x03da6305, 0x01327493, 0x0321b3b7, 0x01c5b770, 0x000a456a}}}, + {X: Field{[10]uint32{0x00f36a2d, 0x025ff2bb, 0x01737707, 0x02593847, 0x01e7b89c, 0x033d992c, 0x0382983e, 0x0270f881, 0x01a05b18, 0x000e6a12}}, Y: Field{[10]uint32{0x013690c5, 0x02d7b440, 0x01114f43, 0x014d53d0, 0x0148e692, 0x019a1625, 0x02274d15, 0x036c1af8, 0x00f16191, 0x0034f9be}}}, + {X: Field{[10]uint32{0x039b25bb, 0x0045f2f9, 0x01dea768, 0x00a2e2ff, 0x0080e3d6, 0x0104b59f, 0x0395522d, 0x03b483e7, 0x0125b29c, 0x0019f958}}, Y: Field{[10]uint32{0x0103da21, 0x01edc4a3, 0x0257f916, 0x033c19ba, 0x033c83ed, 0x0340b4a4, 0x020fd883, 0x008fd12a, 0x00157e3c, 0x0018237f}}}, + {X: Field{[10]uint32{0x038f1525, 0x008a6ded, 0x027bb5cb, 0x03bd4a4c, 0x02ecdd01, 0x02560e7d, 0x01eec20e, 0x0356774c, 0x02da02f7, 0x0002946b}}, Y: Field{[10]uint32{0x03847903, 0x0024b035, 0x02cdd1f0, 0x03420364, 0x036621c7, 0x031a062a, 0x038b18f4, 0x0218acf4, 0x03df93fb, 0x001c1259}}}, + {X: Field{[10]uint32{0x02c1745d, 0x019308da, 0x01e7aaae, 0x01bfed22, 0x01f8bcb3, 0x00ec00e2, 0x02b71b77, 0x032d1bd7, 0x013e73a1, 0x0032601a}}, Y: Field{[10]uint32{0x02fae474, 0x0330162d, 0x02bd4274, 0x03bc01c1, 0x00b3b21f, 0x03eee9ba, 0x01853e56, 0x01fbeddc, 0x008efe6b, 0x002fcee0}}}, + {X: Field{[10]uint32{0x021391a9, 0x01e8dd02, 0x007136b1, 0x034a5235, 0x0394167b, 0x025d7a7c, 0x0227aab2, 0x013070a3, 0x0130bcf5, 0x0031e37e}}, Y: Field{[10]uint32{0x004d9ae7, 0x023c378c, 0x01e5e031, 0x00886f19, 0x00163bfe, 0x020ef878, 0x03b5e9a2, 0x01e6f956, 0x03366d3a, 0x00269093}}}, + {X: Field{[10]uint32{0x01284089, 0x010bf11b, 0x016e5fb2, 0x039399cc, 0x00a998b1, 0x03dfc794, 0x0168ebc8, 0x03cea798, 0x03bcc6d2, 0x00269d7d}}, Y: Field{[10]uint32{0x03169e01, 0x03cc566f, 0x037bfd40, 0x030de1e5, 0x0239bf6e, 0x03f1f8d6, 0x0106c6e8, 0x02e6a8eb, 0x00e6dff8, 0x00032d1e}}}, + {X: Field{[10]uint32{0x036e6224, 0x02dc68e2, 0x001c0d20, 0x01f2dbe0, 0x007eba1e, 0x01739cf9, 0x008277d9, 0x02cf9f6d, 0x031adb0b, 0x001dac84}}, Y: Field{[10]uint32{0x0179263a, 0x034924a6, 0x007b2f79, 0x03e04831, 0x03196c5a, 0x034a1dcd, 0x01e36e6c, 0x03956c2a, 0x00daef60, 0x0000cb8f}}}, + {X: Field{[10]uint32{0x001384e1, 0x0290acd7, 0x01e68f32, 0x011b7ae3, 0x03cdcc4c, 0x036a2520, 0x01f96c93, 0x025c77d5, 0x03614ec5, 0x00086260}}, Y: Field{[10]uint32{0x026dac3e, 0x021ad7c4, 0x02c97d64, 0x012b6726, 0x01c5eda5, 0x01dda5d0, 0x02a2d224, 0x0254eac8, 0x005044a4, 0x000b0e5b}}}, + {X: Field{[10]uint32{0x03db8adc, 0x013e1d78, 0x002a9aa1, 0x029b3d76, 0x03a08449, 0x014a3fb2, 0x01dbe1ca, 0x00603440, 0x02494e9d, 0x002b02c2}}, Y: Field{[10]uint32{0x00412554, 0x03bf8f9c, 0x02dd9b2a, 0x027cc518, 0x00371dd1, 0x01a9aa3a, 0x0153b9c5, 0x02d60cb7, 0x001225a1, 0x0009b475}}}, + {X: Field{[10]uint32{0x00e04625, 0x029b09cc, 0x00a1b6dc, 0x0336efc1, 0x029d1a78, 0x017d65a8, 0x02d33297, 0x02997ef5, 0x018c0851, 0x003e1a6d}}, Y: Field{[10]uint32{0x02a5bff0, 0x02eaec31, 0x01b09c3c, 0x006ee2e4, 0x00a0cfb3, 0x00526527, 0x00b1603e, 0x0171cb06, 0x0344fc6f, 0x001037b8}}}, + {X: Field{[10]uint32{0x01544c3a, 0x01e35bae, 0x032aaecf, 0x00ea39f5, 0x01a640a4, 0x01cf18fb, 0x004a5f22, 0x00943e26, 0x02db2406, 0x003dd3c0}}, Y: Field{[10]uint32{0x0386185b, 0x02bd64f3, 0x02aea1c0, 0x01e87bba, 0x015e364f, 0x017caf3c, 0x03c1a618, 0x007a4a28, 0x026dcacc, 0x00220b8e}}}, + {X: Field{[10]uint32{0x027ea65d, 0x0250ea81, 0x0069ff3d, 0x01412dfa, 0x0288c390, 0x002a9a74, 0x03c9284a, 0x0157acba, 0x02b61d67, 0x0030184f}}, Y: Field{[10]uint32{0x03848cba, 0x0084f149, 0x02c09fe4, 0x006fc34d, 0x0129931c, 0x01764a27, 0x03a89665, 0x0320b92b, 0x02e527b5, 0x001cbd86}}}, + {X: Field{[10]uint32{0x031285db, 0x00e7c23c, 0x007a7eb7, 0x018d490c, 0x00ae0dbf, 0x0045ebac, 0x00fd8c47, 0x002298f0, 0x039860ba, 0x003ad9bf}}, Y: Field{[10]uint32{0x03ddc5d5, 0x01d456a1, 0x0261655c, 0x03cc1dd3, 0x027d3662, 0x03903d2e, 0x005dfb94, 0x03caba2c, 0x02ca54bc, 0x00030c50}}}, + {X: Field{[10]uint32{0x004a861d, 0x0145bc3b, 0x015b871a, 0x005455b0, 0x02e41c6b, 0x0294d180, 0x025d58bc, 0x018187f0, 0x00e6a125, 0x000e9c42}}, Y: Field{[10]uint32{0x004393a6, 0x00c1938f, 0x01226a18, 0x035d9b7c, 0x00957bfc, 0x005f9fa2, 0x011b5bec, 0x02aec806, 0x0102041c, 0x0036ab8b}}}, + {X: Field{[10]uint32{0x00f89d5f, 0x03a500ee, 0x00958949, 0x03cd39d1, 0x00ea1a2f, 0x02c817cb, 0x02e73717, 0x01a744cf, 0x0258c831, 0x00345f8e}}, Y: Field{[10]uint32{0x018b1a20, 0x01ffcc98, 0x010225ac, 0x02e60729, 0x012d75fc, 0x034574d2, 0x00ffafa6, 0x03662e48, 0x037d69e5, 0x002630d7}}}, + {X: Field{[10]uint32{0x03f6541c, 0x00daeac2, 0x01385fff, 0x0353dd9e, 0x0298caf6, 0x018638bf, 0x0350cbf2, 0x02e3b450, 0x0092cefb, 0x0035b8ca}}, Y: Field{[10]uint32{0x02636298, 0x0207af6c, 0x0021e080, 0x02f3b6f8, 0x00976196, 0x015bc926, 0x0072b553, 0x017b001e, 0x022ebe0f, 0x001c5d51}}}, + {X: Field{[10]uint32{0x02ffef75, 0x01777e02, 0x0229186d, 0x02ba4ea9, 0x0282ddc8, 0x00e3b001, 0x00e2182f, 0x0002b9ba, 0x01ff60e9, 0x000c6352}}, Y: Field{[10]uint32{0x026333b2, 0x02205981, 0x00831a98, 0x03aef8a2, 0x0008dcc3, 0x037daa9c, 0x02d4fd8f, 0x01853707, 0x0027dd7d, 0x001ba5fb}}}, + {X: Field{[10]uint32{0x00cf6346, 0x03e05126, 0x0367c5a2, 0x00ada35b, 0x01c075e7, 0x01616aef, 0x00ea5aeb, 0x036e2e9a, 0x02301772, 0x003f5be7}}, Y: Field{[10]uint32{0x0128d2c0, 0x03aace07, 0x001254d4, 0x00c2abfd, 0x02d76082, 0x01610d55, 0x01c5f513, 0x016f5729, 0x02e76477, 0x0036b745}}}, + {X: Field{[10]uint32{0x002ddd36, 0x02b90e86, 0x00d31566, 0x00aba558, 0x00f07428, 0x02f39da3, 0x00ed08d4, 0x011d86a4, 0x0338a2c7, 0x0023f896}}, Y: Field{[10]uint32{0x024c23a2, 0x0386a087, 0x015c73f8, 0x010c9c74, 0x0251d668, 0x03ef7f8b, 0x00da1b32, 0x02ade28b, 0x004a77c6, 0x001bb87a}}}, + {X: Field{[10]uint32{0x0393bef8, 0x03fae665, 0x03e5d2e6, 0x02ca91b5, 0x013e12ba, 0x01afee05, 0x0217bcff, 0x023fbd2b, 0x02d288ed, 0x000df3c3}}, Y: Field{[10]uint32{0x03e3e0d3, 0x02851b6e, 0x03339119, 0x01ec85e4, 0x00e17a41, 0x036d709e, 0x01254f4d, 0x001d4726, 0x025718eb, 0x00024b9e}}}, + {X: Field{[10]uint32{0x03bf403c, 0x01611081, 0x011e0091, 0x013d4c7b, 0x00eca0e0, 0x0180003a, 0x01eb812b, 0x034321db, 0x006106b9, 0x001a2308}}, Y: Field{[10]uint32{0x00cc01fe, 0x01fac517, 0x035bda8b, 0x020fcb3a, 0x00011d85, 0x008802f7, 0x0112e763, 0x01354f7d, 0x02ba41ba, 0x002ead2c}}}, + {X: Field{[10]uint32{0x00b3d804, 0x020e569c, 0x004e9d86, 0x0213626a, 0x02d1b535, 0x00e59485, 0x022371d6, 0x0254d760, 0x02aaf539, 0x0012d32a}}, Y: Field{[10]uint32{0x01ee73d2, 0x01ef5014, 0x0070ae4c, 0x02444571, 0x02652fbd, 0x01d8793a, 0x001d0437, 0x001268ec, 0x03afcd18, 0x000f7749}}}, + {X: Field{[10]uint32{0x02fa1d2e, 0x013754b8, 0x00e56144, 0x02609388, 0x0347cca3, 0x022ce6d7, 0x00ed9a51, 0x036981d6, 0x03c44135, 0x001bd6b2}}, Y: Field{[10]uint32{0x02cd58c4, 0x0134df12, 0x02569052, 0x035ccd7e, 0x02f729f1, 0x00bc65e8, 0x02f2efc0, 0x03653522, 0x0146e5f6, 0x00017727}}}, + {X: Field{[10]uint32{0x0267fc42, 0x010c4f70, 0x008c6ce9, 0x008dce0a, 0x02661d6f, 0x022dad88, 0x01a527bf, 0x032e45bf, 0x00493dff, 0x001e74b5}}, Y: Field{[10]uint32{0x020c08db, 0x0017cdc2, 0x01de1d28, 0x0247575b, 0x038d9027, 0x03ef2454, 0x0302823d, 0x03dff2f8, 0x03f13fa8, 0x002c9a0e}}}, + {X: Field{[10]uint32{0x01f95524, 0x0002ccfe, 0x00118c08, 0x02f00860, 0x01f3915d, 0x03319f50, 0x037a6b07, 0x01ee7271, 0x007e246b, 0x000cea3a}}, Y: Field{[10]uint32{0x0116ff8f, 0x00d0cce7, 0x0229470b, 0x03bf736c, 0x01207d30, 0x00b97116, 0x015e36be, 0x03417c99, 0x004c584f, 0x002eaa09}}}, + {X: Field{[10]uint32{0x01868e95, 0x036aae9e, 0x03a193f4, 0x02c83ee9, 0x013235dd, 0x012f5518, 0x0161a7ae, 0x01f7e081, 0x0132f388, 0x002685a4}}, Y: Field{[10]uint32{0x00630bcd, 0x02408a51, 0x03bc0719, 0x000397e2, 0x02a233b1, 0x02a59656, 0x01452161, 0x011b110a, 0x03179954, 0x001a1bf0}}}, + {X: Field{[10]uint32{0x0383ac42, 0x01184121, 0x026fc290, 0x0278b297, 0x01c85998, 0x010e7cbd, 0x03dc7e90, 0x0338fe6a, 0x00f48405, 0x001e42dd}}, Y: Field{[10]uint32{0x0224a701, 0x02cc12e2, 0x028a66eb, 0x00aec6a4, 0x011dc676, 0x01c44697, 0x00593a37, 0x02172a64, 0x01135623, 0x00225872}}}, + {X: Field{[10]uint32{0x02f9e49c, 0x021ea8dc, 0x02438b54, 0x0217d493, 0x02954717, 0x03ccbf35, 0x00aaeb69, 0x030b661f, 0x00cfae1f, 0x0038a8f4}}, Y: Field{[10]uint32{0x00c93046, 0x00b4cdc5, 0x008db498, 0x000e63ed, 0x0211f7dc, 0x00233914, 0x03edb543, 0x01c230d5, 0x0205ecf2, 0x00273090}}}, + {X: Field{[10]uint32{0x020bcbea, 0x03087b25, 0x03a7a2b3, 0x00f98f8e, 0x00cfd265, 0x01bcab9a, 0x01372b19, 0x030655db, 0x00435992, 0x00032cc3}}, Y: Field{[10]uint32{0x01ccd0b4, 0x01f374e2, 0x0083d498, 0x016099a9, 0x02fb6830, 0x02d246e2, 0x009cba14, 0x00e326b3, 0x01b97083, 0x003d95cd}}}, + {X: Field{[10]uint32{0x00e8b46a, 0x0090e044, 0x01d2dfe9, 0x01adf265, 0x03296ca6, 0x03ecf9a8, 0x018ffb16, 0x002fb98a, 0x0095d631, 0x0007ebb7}}, Y: Field{[10]uint32{0x00725089, 0x02f493ee, 0x012cee7b, 0x03391097, 0x0226d9f0, 0x02f62dd9, 0x0378d032, 0x03a41394, 0x023f8201, 0x000d40e7}}}, + {X: Field{[10]uint32{0x02b3e8f9, 0x031d42d4, 0x03f318f6, 0x014c78a2, 0x018e93ea, 0x03546cfd, 0x005410ce, 0x030744fc, 0x035a2be8, 0x002991b3}}, Y: Field{[10]uint32{0x00c102bb, 0x03d19429, 0x029bda01, 0x03911950, 0x01e427d7, 0x00794744, 0x03a7e78e, 0x02a482d1, 0x02cb7727, 0x00163163}}}, + {X: Field{[10]uint32{0x02be2205, 0x02f00837, 0x02d39dce, 0x031857b7, 0x011c77c0, 0x01730c8b, 0x038c397a, 0x01f4e3a6, 0x03271853, 0x000c9cd1}}, Y: Field{[10]uint32{0x01a42d65, 0x00092402, 0x032bb72c, 0x012f0f94, 0x01c1ea78, 0x011d69f5, 0x007b072d, 0x03d82f53, 0x008958c3, 0x0030b7af}}}, + {X: Field{[10]uint32{0x0172827e, 0x00bce4f5, 0x03f4d4ce, 0x008b9f6c, 0x009906dd, 0x024c289c, 0x028c095d, 0x02884b01, 0x03180855, 0x0005a869}}, Y: Field{[10]uint32{0x0115605c, 0x01adc934, 0x00660219, 0x005aa2dd, 0x01b1ef30, 0x02fa3df7, 0x0280335c, 0x02a7adb3, 0x024bb30b, 0x0034e275}}}, + {X: Field{[10]uint32{0x03687596, 0x02bd33c8, 0x002e9a61, 0x03e129d0, 0x00eeb1eb, 0x01859ba4, 0x0294b867, 0x0155c4cd, 0x01145de2, 0x002d2fd3}}, Y: Field{[10]uint32{0x03d11242, 0x00bf046e, 0x023dbfac, 0x0186962b, 0x0237d389, 0x02d817a5, 0x018640a6, 0x025f958c, 0x00a4d823, 0x001276c8}}}, + {X: Field{[10]uint32{0x03892630, 0x019ee6c2, 0x0164bbf3, 0x004fa42a, 0x03fc3114, 0x0364e032, 0x00a0de08, 0x01997906, 0x03a9ccf4, 0x00353b59}}, Y: Field{[10]uint32{0x011df131, 0x0017462d, 0x015fa371, 0x01dd86c1, 0x0007472b, 0x00924dd9, 0x028a9729, 0x00220c7f, 0x017ce79a, 0x0023fdf9}}}, + {X: Field{[10]uint32{0x014fe70d, 0x03c7d1fd, 0x01366b32, 0x0373e45b, 0x0044d5df, 0x03070b29, 0x02e906f0, 0x00fbc83a, 0x02f19f41, 0x0022b495}}, Y: Field{[10]uint32{0x02d34da7, 0x0090fb69, 0x02ff494e, 0x01783497, 0x0134778f, 0x00725c86, 0x0147f659, 0x01371609, 0x03418d2c, 0x002f7bba}}}, + {X: Field{[10]uint32{0x01f17f8e, 0x018a854c, 0x0362f07f, 0x03b887c7, 0x01c67d22, 0x029561ee, 0x03723e01, 0x02d7c7c4, 0x02fafe55, 0x002374f8}}, Y: Field{[10]uint32{0x03c88cb0, 0x02fe4fd7, 0x0160b4b4, 0x0072e99a, 0x028f2db4, 0x036711b1, 0x017c6b65, 0x01c5f957, 0x02a47d6b, 0x002a88f4}}}, + {X: Field{[10]uint32{0x00b3d0f6, 0x01de9741, 0x01a678e5, 0x005d5536, 0x0103c139, 0x01ec3a4e, 0x034db01a, 0x00c2beb0, 0x02282a8e, 0x00113f67}}, Y: Field{[10]uint32{0x011a61d0, 0x003305a4, 0x0290e484, 0x001b32c4, 0x0218927d, 0x0256f6f8, 0x0269d592, 0x0066ce85, 0x00613533, 0x0032c1e4}}}, + {X: Field{[10]uint32{0x00b7aa42, 0x02c69c62, 0x02477746, 0x03d39691, 0x022db7c9, 0x025917d1, 0x01d2aa9c, 0x03b5960c, 0x02024464, 0x00174926}}, Y: Field{[10]uint32{0x037281d0, 0x03e2c501, 0x01a12b54, 0x03efca53, 0x0023bb8d, 0x0022d348, 0x0195f80e, 0x01ad70b1, 0x0386527d, 0x000affdc}}}, + {X: Field{[10]uint32{0x0210fb23, 0x0311f203, 0x008ca85a, 0x01502e50, 0x01ddd18b, 0x02247120, 0x01e123cd, 0x03547519, 0x00581edc, 0x003663ad}}, Y: Field{[10]uint32{0x00b4dcf2, 0x033086de, 0x010816a2, 0x005c6c99, 0x032b1537, 0x03c95326, 0x031f9e60, 0x01ab1bcb, 0x03bed375, 0x00056ff4}}}, + {X: Field{[10]uint32{0x00db6082, 0x02013591, 0x02eb5876, 0x01ba759c, 0x036edb48, 0x03a14543, 0x032134d2, 0x02bad884, 0x036919a2, 0x000bc4b0}}, Y: Field{[10]uint32{0x038cf73b, 0x004cf15f, 0x02dd0827, 0x031ef6a0, 0x0320834d, 0x030af438, 0x01264b8d, 0x00a313b7, 0x02dd3b4d, 0x00300447}}}, + {X: Field{[10]uint32{0x004b4624, 0x0005f0c5, 0x023e6f03, 0x00d23c1f, 0x02713260, 0x02f395ea, 0x01d35dfe, 0x0327e108, 0x02847099, 0x00136525}}, Y: Field{[10]uint32{0x01b673da, 0x02c7fff7, 0x02adb126, 0x0136c60b, 0x00b91f95, 0x022c1f68, 0x01b308fb, 0x01a71ca3, 0x0257d713, 0x0026bed6}}}, + {X: Field{[10]uint32{0x02af2466, 0x01a1c038, 0x008b2a97, 0x00936777, 0x020fca8f, 0x014aac5f, 0x020b39a7, 0x03c7238d, 0x01105e95, 0x0033c76e}}, Y: Field{[10]uint32{0x0247ca5f, 0x02371cfd, 0x020040ad, 0x029ecf4b, 0x015e645c, 0x02e59006, 0x001b94b4, 0x0219d29b, 0x0366c49c, 0x0039f267}}}, + {X: Field{[10]uint32{0x02a62b85, 0x0390a11a, 0x03f22a9e, 0x01fc16c9, 0x01d4b174, 0x00b19d61, 0x01d63a24, 0x03ea2ade, 0x00257d2f, 0x0039c7ad}}, Y: Field{[10]uint32{0x022c8865, 0x03d9099a, 0x033c3d10, 0x01e61c38, 0x023bc0a7, 0x0294f8d0, 0x0321f45d, 0x028dd9f5, 0x02ecf901, 0x002a41ab}}}, + {X: Field{[10]uint32{0x00559887, 0x0220aacc, 0x03b218f9, 0x01b289fa, 0x0321c58b, 0x0128a66f, 0x005c3e1b, 0x01d7d0ef, 0x03d30b25, 0x002f3661}}, Y: Field{[10]uint32{0x01483f65, 0x03a6ce87, 0x01b00761, 0x01324a27, 0x00690c1b, 0x018e93ad, 0x02fd894e, 0x02b89cae, 0x00c94339, 0x00100e01}}}, + {X: Field{[10]uint32{0x01f8cab0, 0x031f8d2c, 0x00042ea9, 0x02e9a559, 0x007a2beb, 0x029a7dd0, 0x01d2d5e8, 0x01c588e5, 0x00f748af, 0x002dd357}}, Y: Field{[10]uint32{0x0049b336, 0x015f7afa, 0x00a3ea3c, 0x02a9f73f, 0x035728df, 0x02be9150, 0x01e9a234, 0x03ed660d, 0x01db332b, 0x002d717f}}}, + {X: Field{[10]uint32{0x0160837d, 0x0146dc8d, 0x03edc572, 0x03b98cec, 0x01e9bc12, 0x02482faa, 0x03b3b13a, 0x0326b869, 0x02f59835, 0x0011bcf7}}, Y: Field{[10]uint32{0x010ce67b, 0x014f9a05, 0x02eca91d, 0x007040d7, 0x00818fb7, 0x01c0853b, 0x02a69778, 0x02e72cde, 0x021f2e8e, 0x00161ecb}}}, + {X: Field{[10]uint32{0x0267d572, 0x0133eddd, 0x018b6577, 0x02906457, 0x01a50ceb, 0x02ed80a6, 0x011f4d7c, 0x0025a379, 0x00fdeb3f, 0x00234d06}}, Y: Field{[10]uint32{0x00661db8, 0x014456ab, 0x022039d0, 0x00e03d2c, 0x03e8b3dd, 0x03d9ed31, 0x01da7c00, 0x02118aaa, 0x011016a2, 0x0033b9e6}}}, + {X: Field{[10]uint32{0x016f7c10, 0x033c84ab, 0x03bcf529, 0x01ede193, 0x0230f432, 0x02d9c94e, 0x020a672e, 0x01a575e2, 0x03094510, 0x002632c3}}, Y: Field{[10]uint32{0x020ab333, 0x0355abca, 0x0132f09f, 0x01d69af5, 0x03300fde, 0x00a14b47, 0x007e9b55, 0x0140d66d, 0x01ac4e1b, 0x0009654b}}}, + {X: Field{[10]uint32{0x0339a3cf, 0x02e6384a, 0x00effb58, 0x0132c0c3, 0x01a34c7c, 0x000f7841, 0x01383f3f, 0x01d7f129, 0x024c0ca0, 0x00258117}}, Y: Field{[10]uint32{0x0201bafe, 0x03548c5c, 0x00c6e8f2, 0x038e9412, 0x016ebd03, 0x02f577fb, 0x011f24f7, 0x010546e8, 0x00fd9223, 0x003d49ee}}}, + {X: Field{[10]uint32{0x01cc6030, 0x02fd5aa6, 0x0293e703, 0x03956642, 0x01c3f4b3, 0x035de5d8, 0x0226a9ca, 0x037be32e, 0x009142ad, 0x003c98ba}}, Y: Field{[10]uint32{0x030b594b, 0x00c8635b, 0x01ca1d1f, 0x02dcce4e, 0x035382c7, 0x0024bb3f, 0x0197dd67, 0x01aa403d, 0x036486c8, 0x0009d731}}}, + {X: Field{[10]uint32{0x016d17fe, 0x01c5f6c5, 0x016347cc, 0x0204f1b1, 0x03ad75ef, 0x03946eca, 0x01f7900b, 0x014cd97e, 0x0002ee17, 0x000335e7}}, Y: Field{[10]uint32{0x007a985d, 0x00000c65, 0x0394ac45, 0x023ad245, 0x014ff919, 0x01aaeeb8, 0x03260441, 0x0396f694, 0x00ffb30d, 0x002d7afa}}}, + {X: Field{[10]uint32{0x00f858f4, 0x00897e52, 0x009d280a, 0x00a73147, 0x02d9ba46, 0x018c20c2, 0x0122e03e, 0x01037780, 0x03225b1d, 0x000a2d2f}}, Y: Field{[10]uint32{0x00f3cac0, 0x00db894b, 0x027954ea, 0x03f2c439, 0x03aadf4f, 0x00c00a5e, 0x0134c6be, 0x01053529, 0x018998bb, 0x00091d58}}}, + {X: Field{[10]uint32{0x02ed2ff7, 0x02119731, 0x03ea016c, 0x00db1ec2, 0x03cc765c, 0x0184a297, 0x013344bc, 0x0177ce71, 0x02067dd5, 0x003c063c}}, Y: Field{[10]uint32{0x00aa7e66, 0x02803e39, 0x0261a960, 0x01da1b15, 0x00cda34a, 0x01454133, 0x02c1cd22, 0x02752b19, 0x02b2cd61, 0x00367f16}}}, + {X: Field{[10]uint32{0x024a7a13, 0x03621b10, 0x0394218e, 0x03c5222c, 0x027f661e, 0x03d1f2f6, 0x01dd5c74, 0x01b40a69, 0x00cf0808, 0x00125a5a}}, Y: Field{[10]uint32{0x021874e7, 0x012de1c7, 0x022dfc8d, 0x00909dd3, 0x00360b51, 0x01e71980, 0x017a3635, 0x0183803c, 0x03984420, 0x0035f637}}}, + {X: Field{[10]uint32{0x02efedab, 0x00405ac8, 0x03949892, 0x01728741, 0x03b98435, 0x00d80369, 0x02485749, 0x00eddda3, 0x0059e911, 0x00090b53}}, Y: Field{[10]uint32{0x020f42b1, 0x022de59e, 0x0257727a, 0x0081ac2b, 0x0342f509, 0x014155ce, 0x0228074a, 0x030bb58e, 0x03d7b0c8, 0x0011c373}}}, + {X: Field{[10]uint32{0x0385e8c7, 0x003d3744, 0x015861d2, 0x02f356ac, 0x03466280, 0x01794143, 0x004afacc, 0x01674e13, 0x00cc1a1a, 0x002dae01}}, Y: Field{[10]uint32{0x0121d439, 0x01e62ed9, 0x02d0c898, 0x019c2ec9, 0x0139b579, 0x00a0a7d0, 0x022a1d23, 0x00daa66e, 0x034602a6, 0x000bde24}}}, + {X: Field{[10]uint32{0x01918a4e, 0x02d26dc7, 0x011ca0d1, 0x00b4a931, 0x0346904b, 0x00a04092, 0x038048af, 0x017f74e2, 0x03d07ecc, 0x00370c28}}, Y: Field{[10]uint32{0x018cc917, 0x014469b0, 0x0110febb, 0x02d9e29f, 0x02b701f7, 0x024da952, 0x03536987, 0x003a5d63, 0x01b07055, 0x000c9902}}}, + {X: Field{[10]uint32{0x03d3fab8, 0x0057cad0, 0x013c20c0, 0x00d25de0, 0x005fb229, 0x03d3d12b, 0x02bb6280, 0x03ccc20e, 0x034d345b, 0x00387f90}}, Y: Field{[10]uint32{0x034c4d83, 0x0256c1dd, 0x03f7a59a, 0x00b0b735, 0x03d3b31b, 0x038f4581, 0x008df48c, 0x025eb130, 0x00a52af8, 0x0006c947}}}, + {X: Field{[10]uint32{0x02fb8d08, 0x03f5745d, 0x02060bd1, 0x004f3f5c, 0x0182c2f5, 0x039dd591, 0x03e4a40e, 0x03178abe, 0x00dae08a, 0x002a3b62}}, Y: Field{[10]uint32{0x00175729, 0x007e7ce1, 0x0081b77b, 0x023c74a5, 0x035cc2d9, 0x005eca9b, 0x02f5b537, 0x0258c3ee, 0x00b07441, 0x003d3ed8}}}, + {X: Field{[10]uint32{0x007c6481, 0x0295e40b, 0x0143f76f, 0x004e8389, 0x008e7707, 0x0314348a, 0x01c083ee, 0x02735f25, 0x0028de1e, 0x002d4b3e}}, Y: Field{[10]uint32{0x0375790f, 0x017abdc6, 0x02d833c9, 0x0314dd23, 0x0343eebd, 0x00f8ed4a, 0x03dc729d, 0x03eefe40, 0x01530046, 0x0018d68e}}}, + {X: Field{[10]uint32{0x021d5e83, 0x01e0a485, 0x0178e4dc, 0x015358d2, 0x00b1297c, 0x02ab64ff, 0x03957a94, 0x026ff732, 0x01aef76d, 0x001c081e}}, Y: Field{[10]uint32{0x02783b52, 0x00419096, 0x01f82c8c, 0x011712e5, 0x0132a43a, 0x0031b76e, 0x033a202e, 0x00714b4e, 0x008bf2d8, 0x001260f0}}}, + {X: Field{[10]uint32{0x0257bbf5, 0x00fb8baf, 0x009a0dd7, 0x02e544f3, 0x023ed3dc, 0x02d0de38, 0x00fe8cbd, 0x03873bbd, 0x00d18e9d, 0x00118e35}}, Y: Field{[10]uint32{0x0327e110, 0x01fbc832, 0x01e87cf7, 0x01029654, 0x020cb507, 0x007e8daf, 0x00853f75, 0x00c19a5a, 0x003245cc, 0x001587b8}}}, + {X: Field{[10]uint32{0x03386bfc, 0x02c8b64e, 0x039cbecf, 0x02024410, 0x01d98e48, 0x00f4280e, 0x021dc5ee, 0x02b77b55, 0x02b75fac, 0x003bacd3}}, Y: Field{[10]uint32{0x02e57c4c, 0x0308d269, 0x00af4c21, 0x00eb473d, 0x00e9d8f6, 0x030c46a5, 0x018db8c1, 0x03723015, 0x00ff05eb, 0x003cac8f}}}, + {X: Field{[10]uint32{0x012c45ca, 0x01a167b1, 0x0175e5c5, 0x0190f7dd, 0x01f70a8c, 0x03efa38e, 0x0107df0c, 0x00c84f07, 0x02e5becf, 0x0001fcb1}}, Y: Field{[10]uint32{0x02b6c89d, 0x03903788, 0x0189a77b, 0x03bac847, 0x02cf9d66, 0x03614794, 0x01a04248, 0x0276b83f, 0x01c01971, 0x00254126}}}, + {X: Field{[10]uint32{0x03e53647, 0x008cc0c8, 0x00f81856, 0x003daa54, 0x023cea09, 0x013e2c05, 0x0211064d, 0x0349f3df, 0x03221ec5, 0x001bb1d9}}, Y: Field{[10]uint32{0x0269a3d6, 0x02c5c0eb, 0x01254984, 0x02816b5d, 0x01d0aa7b, 0x0018f13f, 0x02ec7d0f, 0x03a0e723, 0x03579704, 0x0026c0f1}}}, + {X: Field{[10]uint32{0x024dea7e, 0x027e2914, 0x02f5499e, 0x01eb16ca, 0x01b44a70, 0x01e3d9f3, 0x03184b03, 0x017b2807, 0x029d320d, 0x00263dbd}}, Y: Field{[10]uint32{0x02b69a02, 0x03d509bc, 0x0244d79e, 0x0375e324, 0x02ca54a3, 0x015af0ce, 0x01333fe0, 0x01d98e5e, 0x033d7b03, 0x0009bbda}}}, + {X: Field{[10]uint32{0x0347e390, 0x0073c156, 0x017af296, 0x01a0b67b, 0x012d3086, 0x03005c32, 0x037ac998, 0x00b1d975, 0x004558b8, 0x0033c7bd}}, Y: Field{[10]uint32{0x018511c3, 0x037d1192, 0x03d23bef, 0x0360d8e5, 0x00f4345b, 0x016bfbfa, 0x022d8f3f, 0x003b1e1d, 0x0105fb88, 0x0022f307}}}, + {X: Field{[10]uint32{0x006f07e8, 0x00a02863, 0x035aa37c, 0x02096821, 0x009ab62b, 0x01653cde, 0x00cc5c10, 0x01bcbbe2, 0x0251efa2, 0x00043805}}, Y: Field{[10]uint32{0x01779df2, 0x03540fae, 0x00c0a8fa, 0x028c1f8a, 0x0083105d, 0x0222aaa6, 0x03b2cdb7, 0x018cd4c3, 0x01e11f77, 0x000b9a85}}}, + {X: Field{[10]uint32{0x013eee4a, 0x009e59ba, 0x01a58054, 0x0114482e, 0x000af909, 0x01260c4c, 0x03d77d74, 0x00826dbb, 0x03e041ce, 0x002e538b}}, Y: Field{[10]uint32{0x01bca443, 0x01c50b72, 0x020f01d0, 0x02349dda, 0x01a86bfb, 0x011b7c43, 0x00b1dde7, 0x024bd577, 0x03f1103e, 0x00023dea}}}, + {X: Field{[10]uint32{0x02d41154, 0x0174acc5, 0x02ccc122, 0x00d385fc, 0x026d71cc, 0x011362bd, 0x01d233e2, 0x02a7a851, 0x0102c671, 0x0033e79f}}, Y: Field{[10]uint32{0x012d2ca7, 0x03bfe143, 0x00c4ee13, 0x02ef86d8, 0x01a853e2, 0x021e3e5a, 0x003858a3, 0x0259beef, 0x00a10f0b, 0x0020bbae}}}, + {X: Field{[10]uint32{0x03d48bb2, 0x00e6bfd2, 0x034366d5, 0x00af814b, 0x00df8e4f, 0x033d2e4d, 0x01d18ebd, 0x00ee44c6, 0x002994ad, 0x00368e8f}}, Y: Field{[10]uint32{0x01dc0193, 0x01a6a474, 0x00f54256, 0x03b7db6d, 0x035e0d32, 0x03b21998, 0x01ccfe7b, 0x0091e20c, 0x0253c404, 0x000a3e75}}}, + {X: Field{[10]uint32{0x01eec101, 0x0289ec3c, 0x02450d4b, 0x03274394, 0x00a0a095, 0x00a0c7cc, 0x014c9fcd, 0x00de2f64, 0x00182b80, 0x002ae04a}}, Y: Field{[10]uint32{0x026666b3, 0x01351780, 0x0078f142, 0x00ab7030, 0x022286dc, 0x02ec7602, 0x00e366af, 0x01db58f7, 0x01822748, 0x00016af1}}}, + {X: Field{[10]uint32{0x01c4977a, 0x01023df9, 0x014ab831, 0x019fe37e, 0x03f0edd9, 0x00259714, 0x0164391c, 0x032a9757, 0x02a2bf02, 0x003a96e0}}, Y: Field{[10]uint32{0x033d9339, 0x022f3a3f, 0x02cac5d2, 0x00fa25f6, 0x022518d5, 0x01ee2239, 0x01dd5040, 0x0020deb3, 0x02990f32, 0x00207fa0}}}, + {X: Field{[10]uint32{0x03e70fa2, 0x02e3ef3e, 0x00d2ca95, 0x0305f7d6, 0x01318aea, 0x00f68b4a, 0x01d618be, 0x0075f40f, 0x000bab20, 0x00141817}}, Y: Field{[10]uint32{0x02a60383, 0x03ce5f5c, 0x028afc03, 0x03f1b0a9, 0x02d4c978, 0x024a335b, 0x02cc160d, 0x015a4f13, 0x031e007b, 0x00003942}}}, + {X: Field{[10]uint32{0x021191dd, 0x0162c97a, 0x0316831b, 0x0184422d, 0x02513566, 0x0153de6d, 0x01409d88, 0x032b3bd1, 0x00b66d7d, 0x003ddb14}}, Y: Field{[10]uint32{0x01f3cc72, 0x0346041b, 0x01f86d3b, 0x0121dc83, 0x03a30401, 0x025fc1ec, 0x00e2e93a, 0x014502f0, 0x0374b019, 0x001f4156}}}, + {X: Field{[10]uint32{0x03260e7d, 0x00f65664, 0x01b32f6d, 0x0240af5e, 0x01413126, 0x01cb9384, 0x02367db2, 0x0011f330, 0x03bad716, 0x00379414}}, Y: Field{[10]uint32{0x017cc7e2, 0x00e37872, 0x03bf3d3f, 0x02041444, 0x03b1e4c5, 0x017d180c, 0x02b61b5b, 0x02c36c37, 0x02d39c34, 0x00071528}}}, + {X: Field{[10]uint32{0x0206499d, 0x03df237e, 0x017121af, 0x00902527, 0x00437f1a, 0x03786395, 0x018a332b, 0x0251ac6e, 0x019f180e, 0x002b4f9c}}, Y: Field{[10]uint32{0x02f1b554, 0x032b4f80, 0x032c882b, 0x037df28b, 0x03ef310a, 0x02fb7018, 0x0073863a, 0x02935f49, 0x03f1390f, 0x002d1635}}}, + {X: Field{[10]uint32{0x036bae4b, 0x03210330, 0x026ecb46, 0x039db899, 0x01839a3a, 0x00cbe2de, 0x010c8673, 0x02bdad8c, 0x02345560, 0x0009c280}}, Y: Field{[10]uint32{0x02bedeaf, 0x005a8653, 0x01bc689d, 0x01c86f6d, 0x01ef7ef0, 0x02661de8, 0x020f1600, 0x01f45832, 0x004b9215, 0x00236aae}}}, + {X: Field{[10]uint32{0x00624621, 0x00cd3b9a, 0x02d30f98, 0x016cafdc, 0x0325ba2b, 0x012a13fd, 0x03ffdb29, 0x03271321, 0x017e3027, 0x003ad7b4}}, Y: Field{[10]uint32{0x0060a942, 0x012d3b02, 0x003ae3b5, 0x02ff5667, 0x03df4a91, 0x013186b4, 0x028d1a21, 0x0351c66f, 0x00b38f74, 0x000e7fff}}}, + {X: Field{[10]uint32{0x00e0a5dd, 0x0304d70b, 0x02d6a7ba, 0x00869d5c, 0x01fb1f66, 0x016b351a, 0x03f4e807, 0x02633188, 0x01f28a0b, 0x002e7047}}, Y: Field{[10]uint32{0x00a76278, 0x03b15150, 0x00a1e391, 0x028938bf, 0x015eb506, 0x024aceea, 0x03eb0c36, 0x0257bcc9, 0x0278d42b, 0x0016fea2}}}, + {X: Field{[10]uint32{0x03e74b5c, 0x018c433a, 0x0221ca8a, 0x0264f126, 0x00f60f13, 0x03b68102, 0x02611066, 0x038967f9, 0x004380ab, 0x003bb45c}}, Y: Field{[10]uint32{0x02a0d750, 0x03576dc8, 0x0324a567, 0x018594b0, 0x028cc2c6, 0x01ebf366, 0x02a243f5, 0x01ee4458, 0x0276cbe3, 0x001b72d8}}}, + {X: Field{[10]uint32{0x03aa97a7, 0x01400314, 0x034c2526, 0x00417b8d, 0x028c68e3, 0x02b7d8ad, 0x025524a4, 0x0273d1a3, 0x036f5f5b, 0x002392c3}}, Y: Field{[10]uint32{0x01b7f74a, 0x004dfb30, 0x00d56e25, 0x00b455f0, 0x02c7e59f, 0x0341063d, 0x00578c16, 0x000646dd, 0x00aec18d, 0x00347e20}}}, + {X: Field{[10]uint32{0x02a5ebbe, 0x03d67232, 0x0176e90c, 0x036848e3, 0x01a7f393, 0x00c44ac7, 0x005ce9c9, 0x025ae6ba, 0x01bdfc65, 0x001deb88}}, Y: Field{[10]uint32{0x034a21d1, 0x01b151ff, 0x02f9b910, 0x005cc81b, 0x03516947, 0x01ca4553, 0x0225390e, 0x019b37d1, 0x01811e32, 0x003d1211}}}, + {X: Field{[10]uint32{0x03d2346f, 0x035ac1f6, 0x03999e16, 0x00cfc140, 0x01929225, 0x01419899, 0x028bd35f, 0x00bbd166, 0x00a871c0, 0x00074de7}}, Y: Field{[10]uint32{0x0140cad0, 0x002ddc90, 0x011c10d5, 0x01785e36, 0x00a6333d, 0x006571c1, 0x0197cfed, 0x0269ed08, 0x039a7289, 0x00301542}}}, + {X: Field{[10]uint32{0x03ef1ccc, 0x0359c30f, 0x00296cba, 0x0085f51f, 0x025c7ea7, 0x03c09dca, 0x03671995, 0x005aba64, 0x03f328fc, 0x00189405}}, Y: Field{[10]uint32{0x00450603, 0x0269d359, 0x02bf3618, 0x001985f0, 0x02d7056d, 0x0004437d, 0x03eb4ac5, 0x00853fb6, 0x0253af3b, 0x0006d138}}}, + {X: Field{[10]uint32{0x0238412d, 0x029cae01, 0x01eb78ea, 0x0059d029, 0x00d1019d, 0x010e1dfa, 0x023f508d, 0x00d424eb, 0x02496bdc, 0x0031e93f}}, Y: Field{[10]uint32{0x020febef, 0x02a5d125, 0x016fba30, 0x022d9d66, 0x01673093, 0x012e3dcd, 0x03924067, 0x01c4c3a1, 0x02a895fb, 0x0006d6c4}}}, + {X: Field{[10]uint32{0x02441d3f, 0x00a0d22c, 0x0052fa56, 0x019add3c, 0x01b65c61, 0x03123102, 0x000102cb, 0x0313bcfa, 0x003ce8f9, 0x0033fe7e}}, Y: Field{[10]uint32{0x0352ee6f, 0x038cb378, 0x0252e338, 0x001ea2f4, 0x02814ceb, 0x035a5cfc, 0x0046a41e, 0x0081fbf2, 0x00f82180, 0x00133106}}}, + {X: Field{[10]uint32{0x02700541, 0x0011c859, 0x02ef82c6, 0x0395eb79, 0x002fd23a, 0x027a8477, 0x038ae98a, 0x030a5724, 0x031045b8, 0x0021009d}}, Y: Field{[10]uint32{0x001e4f99, 0x0381c8e1, 0x01da5f56, 0x033502c5, 0x03f3f80d, 0x02ea0753, 0x01b972ce, 0x00501220, 0x0192d3c1, 0x001ca519}}}, + {X: Field{[10]uint32{0x012e0d2c, 0x01c18503, 0x004afb5c, 0x013aa53e, 0x015e304a, 0x023d548b, 0x01a346bd, 0x02e7b018, 0x0330e00c, 0x003deac4}}, Y: Field{[10]uint32{0x035e6144, 0x004406f7, 0x02f866bb, 0x028e7753, 0x012ef0f6, 0x03cfcf5a, 0x018def46, 0x002952bd, 0x00518935, 0x001752b2}}}, + {X: Field{[10]uint32{0x03d4e618, 0x0062131b, 0x0292c785, 0x037304fd, 0x01d0da4d, 0x021b260a, 0x01a4d5b7, 0x02dde230, 0x02192303, 0x0029f213}}, Y: Field{[10]uint32{0x031774fe, 0x02e915ae, 0x01744939, 0x00cea0a7, 0x01659285, 0x0178fc45, 0x0164bad3, 0x036cbc87, 0x025b8fc2, 0x0015b8cb}}}, + {X: Field{[10]uint32{0x0098c43a, 0x0276036b, 0x00dccf19, 0x00e41fd7, 0x02c65f41, 0x0299de9c, 0x03bc55af, 0x036b00d8, 0x0084a680, 0x002e2c32}}, Y: Field{[10]uint32{0x016b8127, 0x0239c794, 0x03932d0f, 0x01e98976, 0x016569f8, 0x013b6c11, 0x02bec5ba, 0x001b0735, 0x008ac926, 0x0010f906}}}, + {X: Field{[10]uint32{0x025e0df6, 0x014120a9, 0x038ddac2, 0x023a50eb, 0x01c5bef9, 0x036d285e, 0x03bc33c1, 0x0184d568, 0x0043d057, 0x00205bb1}}, Y: Field{[10]uint32{0x01f0b360, 0x021f1215, 0x022a9c9b, 0x00c04862, 0x02054f9a, 0x01b8d9ad, 0x00f6fa19, 0x01623664, 0x02c9e9f3, 0x002269ec}}}, + {X: Field{[10]uint32{0x011e28a0, 0x027526aa, 0x03fd2af3, 0x003cedc5, 0x00b10196, 0x03f3311f, 0x03ba24f7, 0x001f54cf, 0x0103823d, 0x00237b48}}, Y: Field{[10]uint32{0x00011728, 0x02549b30, 0x02ad4fb1, 0x0244a9a0, 0x01e3e1a3, 0x01d4faab, 0x03ef9f7d, 0x01987bd0, 0x011fbe1a, 0x000fc0fb}}}, + {X: Field{[10]uint32{0x00d6260b, 0x026baab4, 0x00c87484, 0x0312fb88, 0x010ff4f7, 0x03a30c59, 0x03df9e3c, 0x0351e2fe, 0x039ce874, 0x002c712c}}, Y: Field{[10]uint32{0x004b4fde, 0x02f48db0, 0x00dbda54, 0x02137ef1, 0x0132c25b, 0x00e5ab72, 0x03fe7245, 0x006207ee, 0x03613070, 0x000e2be2}}}, + {X: Field{[10]uint32{0x02b2c971, 0x0176b67e, 0x0390d0e7, 0x03c9f842, 0x01f011bc, 0x02af2082, 0x03f657cf, 0x00face85, 0x023be595, 0x001f56f3}}, Y: Field{[10]uint32{0x00f84787, 0x03b78aac, 0x0167cbbc, 0x029d0198, 0x01864b2b, 0x00b0e792, 0x0308b3b6, 0x035e0ac1, 0x02865f5f, 0x001ce035}}}, + {X: Field{[10]uint32{0x0000f285, 0x034ae1d3, 0x01497a54, 0x01e22c8a, 0x00096af1, 0x031c5c71, 0x027717fb, 0x03cb3453, 0x011a422a, 0x000abd44}}, Y: Field{[10]uint32{0x03771f41, 0x012fabae, 0x0259f753, 0x031722b2, 0x032f3445, 0x01ecec90, 0x0000b68b, 0x03c401fa, 0x031bee43, 0x00111a2f}}}, + {X: Field{[10]uint32{0x037af766, 0x029ed258, 0x0155dc81, 0x02ba8b42, 0x01fe010d, 0x01010ed8, 0x03dfb65f, 0x0377bfe2, 0x01c06dc8, 0x002d1b8a}}, Y: Field{[10]uint32{0x017b59f5, 0x03b27767, 0x016459c1, 0x026c2714, 0x03748c5c, 0x01289ea7, 0x010cef82, 0x00c53f5f, 0x0095ae16, 0x00189ddd}}}, + {X: Field{[10]uint32{0x03a6b1ea, 0x02c8673e, 0x034a5089, 0x03e9648e, 0x00aef6d8, 0x00e73545, 0x02b3bd53, 0x02903dc7, 0x02d3f44e, 0x000415e1}}, Y: Field{[10]uint32{0x0343d0bc, 0x0001736d, 0x00f151ba, 0x00927f0b, 0x0139fad0, 0x03a1b42e, 0x012c4508, 0x008b2df6, 0x03dac875, 0x000a93a9}}}, + {X: Field{[10]uint32{0x02adb23f, 0x0093d205, 0x038575c6, 0x03bfc22d, 0x02d2d2d8, 0x024b3ac8, 0x01345738, 0x01b8c062, 0x0081be85, 0x0007cf03}}, Y: Field{[10]uint32{0x03f6072b, 0x03a959e2, 0x031c9faa, 0x014b4c9c, 0x0011158d, 0x027135ed, 0x02f48408, 0x012673d4, 0x0290de24, 0x0001cc85}}}, + {X: Field{[10]uint32{0x028bd2b3, 0x03d1aa91, 0x01c9f5ab, 0x01afc5be, 0x02e43787, 0x020cee83, 0x012484ff, 0x0257e824, 0x02e3a95a, 0x0005b72e}}, Y: Field{[10]uint32{0x01ffa44d, 0x027c9056, 0x00034344, 0x00ab3785, 0x0030e558, 0x031a45c0, 0x02de4733, 0x004b5b06, 0x0007247b, 0x00159c9f}}}, + {X: Field{[10]uint32{0x02e70726, 0x02510e36, 0x03fff1c7, 0x029927b6, 0x02e42314, 0x017b6af1, 0x00ff3c0f, 0x00f23e49, 0x016cd672, 0x000452f9}}, Y: Field{[10]uint32{0x028ac521, 0x03641949, 0x035e1d5f, 0x01d6511c, 0x0245b61b, 0x00cb3e9e, 0x0180046b, 0x037ab9f1, 0x0172855c, 0x00026137}}}, + {X: Field{[10]uint32{0x0103fdaf, 0x02dfab36, 0x0217d747, 0x00ea35d3, 0x0351766b, 0x03d6eaff, 0x029dbac7, 0x0211cb85, 0x02e601f9, 0x0023432c}}, Y: Field{[10]uint32{0x00bc9b92, 0x03dcdaa0, 0x0160a0f1, 0x02ae2678, 0x01f06b36, 0x033aaec4, 0x00ea3682, 0x024fdc97, 0x03f5b9e7, 0x0034564e}}}, + {X: Field{[10]uint32{0x01714db3, 0x01c9fd4c, 0x005caab4, 0x00f9212d, 0x0134e3b4, 0x020125a4, 0x032f3a2c, 0x020b936d, 0x0354188c, 0x0016d081}}, Y: Field{[10]uint32{0x00723d9f, 0x01b304e9, 0x008838bf, 0x0171dd66, 0x001c7eed, 0x0066f852, 0x00d16437, 0x03cd81eb, 0x007d27d7, 0x0012a24c}}}, + {X: Field{[10]uint32{0x00cbf74b, 0x006d63e2, 0x006ed18c, 0x00b87311, 0x019f01c6, 0x0003f82d, 0x0056a728, 0x00765a36, 0x021d9576, 0x002478dd}}, Y: Field{[10]uint32{0x0396c772, 0x00494c0a, 0x02bc7258, 0x03034cf7, 0x01b73a58, 0x02667bd5, 0x033389e9, 0x020dd8a3, 0x01e396f8, 0x002d6ad8}}}, + {X: Field{[10]uint32{0x001a4655, 0x0174a717, 0x02ad35b0, 0x007c0b62, 0x02016e0f, 0x02af814a, 0x02f55480, 0x0397ca70, 0x0383dc77, 0x000c4e02}}, Y: Field{[10]uint32{0x0193403d, 0x00ff8999, 0x01b20107, 0x02f06a87, 0x02b42173, 0x020e7342, 0x0034342b, 0x03a9c8f1, 0x03aecc84, 0x0008f32b}}}, + {X: Field{[10]uint32{0x021edd27, 0x0336a02c, 0x0239a764, 0x009e8325, 0x038f3f37, 0x02406554, 0x00b44c7c, 0x01099241, 0x018cbcd5, 0x002b9006}}, Y: Field{[10]uint32{0x00eeba8f, 0x02b988cd, 0x012005cf, 0x0269b0e7, 0x02ffceea, 0x009f6628, 0x01a0e7c8, 0x0333f336, 0x0308ffec, 0x0000e95f}}}, + {X: Field{[10]uint32{0x00a981c8, 0x0093222a, 0x0015f73e, 0x0151c9ed, 0x015764a8, 0x0066ec09, 0x01b1d3ac, 0x0303c492, 0x0387abea, 0x003d1ca5}}, Y: Field{[10]uint32{0x0265d172, 0x02d3a7ab, 0x0319d00a, 0x00542ff9, 0x03b51aae, 0x03851b41, 0x039783fd, 0x004ca31f, 0x01a568d8, 0x0038c458}}}, + {X: Field{[10]uint32{0x02d5884a, 0x03205d5f, 0x03b69ce4, 0x023029f5, 0x02f52d3b, 0x03a13429, 0x0059b617, 0x0224d3dc, 0x02b83414, 0x003e4bc0}}, Y: Field{[10]uint32{0x00864080, 0x00f3d06a, 0x026b706f, 0x023c3eed, 0x03cacd20, 0x031b7a92, 0x00eb5305, 0x00c08222, 0x02f88273, 0x003ebb5f}}}, + {X: Field{[10]uint32{0x00c93363, 0x00f385df, 0x01ec49ed, 0x008acac3, 0x029efe40, 0x007e13f0, 0x028cc4dd, 0x035a082f, 0x00aae93b, 0x0028afb6}}, Y: Field{[10]uint32{0x018ada1d, 0x003277c6, 0x00213d63, 0x02cecfc2, 0x027bf235, 0x03b7ae27, 0x0340f299, 0x01bedf80, 0x01c96212, 0x000a1eae}}}, + {X: Field{[10]uint32{0x03af4724, 0x01063e6d, 0x0198e899, 0x038b80a5, 0x00cf6219, 0x024c204d, 0x0309dc80, 0x00474666, 0x03cd3d18, 0x001690b3}}, Y: Field{[10]uint32{0x013f8423, 0x03ba3c16, 0x007172e0, 0x00f583ee, 0x02e30141, 0x002fc970, 0x02a83b18, 0x0275dac3, 0x021c3992, 0x0025739c}}}, + {X: Field{[10]uint32{0x030e530f, 0x028ae516, 0x0278940b, 0x01ae850d, 0x012e768a, 0x0105d421, 0x03f1eca4, 0x02fc64c8, 0x030567e8, 0x000749ea}}, Y: Field{[10]uint32{0x01e1afa8, 0x00cf9a84, 0x01b07c6c, 0x03775468, 0x02a23e3d, 0x01ac124c, 0x02532be7, 0x00a68562, 0x0139496d, 0x000610e6}}}, + {X: Field{[10]uint32{0x02ab4326, 0x01d2451b, 0x03d319bc, 0x0222dc98, 0x01bbbf80, 0x01337cff, 0x002fcf6e, 0x016fd12d, 0x005922c0, 0x00164afe}}, Y: Field{[10]uint32{0x004c7f65, 0x016f1d00, 0x0201e7d9, 0x01da3dfd, 0x013aaab9, 0x028bab09, 0x03946f3b, 0x03c3bf78, 0x00c38dcc, 0x002132f6}}}, + {X: Field{[10]uint32{0x009359d5, 0x02785bc0, 0x00fcf1dd, 0x015b40f1, 0x010d4df1, 0x03bab710, 0x0001f4ad, 0x036ae2ff, 0x02705ae3, 0x00199cc2}}, Y: Field{[10]uint32{0x038273ee, 0x03d5e81d, 0x03718582, 0x00b1218f, 0x036e8f42, 0x026e7bec, 0x03b91701, 0x0362c89c, 0x00c44ea1, 0x0030131f}}}, + {X: Field{[10]uint32{0x03b7fe83, 0x016453b6, 0x011ae07c, 0x01ee5e52, 0x001ce689, 0x01392158, 0x03b246d8, 0x0082b027, 0x02005324, 0x000f4009}}, Y: Field{[10]uint32{0x00c7d98e, 0x010775e5, 0x0152a532, 0x0074c871, 0x03c221fa, 0x00925148, 0x00c48557, 0x03539def, 0x02642f16, 0x0016f5cc}}}, + {X: Field{[10]uint32{0x03a24487, 0x03509d50, 0x021c061e, 0x02b5c42a, 0x02750395, 0x008b8b0a, 0x0089d37d, 0x0348bf48, 0x02362b5d, 0x000350ab}}, Y: Field{[10]uint32{0x0339ada7, 0x01863fb2, 0x02fc9c2a, 0x0126ca84, 0x00ded0a6, 0x0046dbdf, 0x03cc24ba, 0x0387a94e, 0x02001571, 0x002110e7}}}, + {X: Field{[10]uint32{0x02253743, 0x03c494ea, 0x01670ede, 0x00796f74, 0x00409e10, 0x0063a41d, 0x00b306dc, 0x02aff400, 0x01ca486f, 0x000df1d8}}, Y: Field{[10]uint32{0x010cad12, 0x01fd99ee, 0x033d0627, 0x02a5701f, 0x0129669d, 0x01ecb2e2, 0x02c241ae, 0x0036c627, 0x00e30111, 0x00394e10}}}, + {X: Field{[10]uint32{0x03b0e788, 0x027b42bc, 0x0345b288, 0x0206865c, 0x002afa97, 0x016b035b, 0x0019f371, 0x02f23bae, 0x02f8bbaf, 0x001399cb}}, Y: Field{[10]uint32{0x00814061, 0x03f3d30e, 0x0385204a, 0x02e5464d, 0x03130cb0, 0x018b83aa, 0x000133fe, 0x03601d1a, 0x00dbbb16, 0x0027043c}}}, + {X: Field{[10]uint32{0x03d51fec, 0x01e475a3, 0x03a68ed8, 0x004bcd6a, 0x0108e1df, 0x01bd8a52, 0x00635ae6, 0x01e4a7a7, 0x003b23c0, 0x00307ca5}}, Y: Field{[10]uint32{0x0264ae75, 0x0352ffba, 0x005fdfc4, 0x0319a001, 0x012f2262, 0x029ac441, 0x01f7ef96, 0x017b1664, 0x02c893ad, 0x000cddad}}}, + {X: Field{[10]uint32{0x00370be6, 0x0180abb0, 0x00ffce17, 0x01b5ebf7, 0x01351e82, 0x0198f994, 0x00f10cdf, 0x036611cb, 0x021e739c, 0x000f7c91}}, Y: Field{[10]uint32{0x0292cb06, 0x000340b1, 0x0301fc9f, 0x0295fbab, 0x02bd5ec5, 0x0206b6aa, 0x014eeb00, 0x0303b0d6, 0x00b33ed9, 0x0017923f}}}, + {X: Field{[10]uint32{0x022a82b7, 0x02307cf5, 0x033fd551, 0x009d6d8e, 0x0150f123, 0x02d83f61, 0x004ecfba, 0x024b57d3, 0x0128f98b, 0x003534f5}}, Y: Field{[10]uint32{0x027d5b76, 0x0034b3b6, 0x01a2e049, 0x00ed52c1, 0x01255405, 0x02612f02, 0x01a838ed, 0x01779a64, 0x01508543, 0x0019125b}}}, + {X: Field{[10]uint32{0x0209236b, 0x039f4084, 0x01108b3e, 0x011c3889, 0x03ad6448, 0x00ffc0e9, 0x03a41136, 0x00da3c69, 0x019b4aa3, 0x003b360e}}, Y: Field{[10]uint32{0x01355213, 0x00dc48dd, 0x011af30f, 0x023c1329, 0x01c629d8, 0x00f00b2d, 0x0351e617, 0x0070a438, 0x01fba792, 0x000b8482}}}, + {X: Field{[10]uint32{0x01f78722, 0x00cb8273, 0x01ae38c3, 0x01c1e173, 0x01416d1a, 0x02cd1356, 0x033354af, 0x0036a40c, 0x03e57e6a, 0x00356642}}, Y: Field{[10]uint32{0x03a17814, 0x0316445e, 0x01eceeef, 0x03224e5e, 0x00278f73, 0x01110402, 0x039198d3, 0x01bcf441, 0x018b73f7, 0x002ca8b3}}}, + {X: Field{[10]uint32{0x00374b1b, 0x03c10aa4, 0x0174f85e, 0x0224a1ef, 0x02b57e90, 0x01876007, 0x03d59786, 0x03b402bc, 0x03651d8c, 0x001d662a}}, Y: Field{[10]uint32{0x0028f04f, 0x036d835b, 0x00240b60, 0x021e3d33, 0x027edaae, 0x0008ba7b, 0x000cbd4b, 0x02c7fee7, 0x00269466, 0x001627f1}}}, + {X: Field{[10]uint32{0x01f694e7, 0x0248b3d0, 0x00e7d7e0, 0x03f663af, 0x03be088c, 0x00714c06, 0x02048b76, 0x00b4c614, 0x0017b12d, 0x003f41c5}}, Y: Field{[10]uint32{0x0232c363, 0x013688ef, 0x00b45966, 0x01d163be, 0x00d47d8f, 0x01ad5236, 0x01f679d9, 0x00ee4cab, 0x03f10ee6, 0x000b6714}}}, + {X: Field{[10]uint32{0x0372ca0e, 0x01b3804a, 0x038d15e5, 0x02ff2f0a, 0x02b1e513, 0x03a4d1fc, 0x01571ac8, 0x021a2b47, 0x0190e290, 0x001696d2}}, Y: Field{[10]uint32{0x03ebf968, 0x0186663b, 0x005d5e51, 0x039fa0c5, 0x01424285, 0x0313271f, 0x01569f63, 0x02549150, 0x02f50715, 0x0031da14}}}, + {X: Field{[10]uint32{0x01e7f2bd, 0x023015bf, 0x020f5972, 0x02057cf4, 0x0225c900, 0x01ba9bcd, 0x035a415f, 0x03c5190b, 0x00243cd4, 0x0024f7bb}}, Y: Field{[10]uint32{0x032dc7cb, 0x0217c96f, 0x0336dd5e, 0x0164641d, 0x006abfa8, 0x0150527d, 0x0378145f, 0x00e85987, 0x01beb999, 0x00223e46}}}, + {X: Field{[10]uint32{0x02df82b6, 0x02645f91, 0x02602f5c, 0x01f9d84e, 0x019c9bec, 0x001a350e, 0x01104c93, 0x03659e5a, 0x017ba65a, 0x00248934}}, Y: Field{[10]uint32{0x00a32f65, 0x03bef3c6, 0x0071055c, 0x03ef3d69, 0x001b5691, 0x03ac4193, 0x0289e54e, 0x0293a31d, 0x00e32bc2, 0x000d1b26}}}, + {X: Field{[10]uint32{0x0379c38e, 0x015450ce, 0x011890f0, 0x00ddb956, 0x01cfc916, 0x01cd1e9c, 0x00f054b8, 0x03fe7053, 0x009124dd, 0x002146b3}}, Y: Field{[10]uint32{0x02116f35, 0x031a7307, 0x0213a55c, 0x03c4c3c3, 0x022dd20b, 0x03127715, 0x00527e8c, 0x00730d0c, 0x01f058d2, 0x0036566f}}}, + {X: Field{[10]uint32{0x00ea4d96, 0x0041d7cb, 0x012122b7, 0x004a4c7e, 0x00eff0a6, 0x0120a544, 0x03e01ef4, 0x00471421, 0x0303b7c1, 0x003fdb04}}, Y: Field{[10]uint32{0x034841f6, 0x003ba85e, 0x01574537, 0x03fd6a56, 0x027e99d0, 0x02495417, 0x02239beb, 0x0142a832, 0x03bf7bcf, 0x00093c26}}}, + {X: Field{[10]uint32{0x035fdac0, 0x02f18d90, 0x029d06a4, 0x013d3d32, 0x020fd501, 0x022dbb2d, 0x03fb51ec, 0x02f4750c, 0x01f055e7, 0x003c8ef6}}, Y: Field{[10]uint32{0x016d7b60, 0x00653ba9, 0x03da69d2, 0x01f7c482, 0x0325ba91, 0x03b91d11, 0x02e7012a, 0x026b65a3, 0x00589d26, 0x002594ad}}}, + {X: Field{[10]uint32{0x01f46ff7, 0x01549e92, 0x035642a0, 0x03e4e46e, 0x001fe070, 0x02ef52bc, 0x0023e601, 0x017465ee, 0x0056ea6d, 0x0027588b}}, Y: Field{[10]uint32{0x015c609e, 0x00ea473f, 0x01494e6c, 0x0310b809, 0x02c648c7, 0x01b6cf72, 0x03bd5576, 0x0217fb67, 0x03940d64, 0x0020186e}}}, + {X: Field{[10]uint32{0x03020c13, 0x0342b7cb, 0x03b80370, 0x03795a4c, 0x012915af, 0x001ee658, 0x014b67c4, 0x03579d8e, 0x03e4cff5, 0x0025253b}}, Y: Field{[10]uint32{0x00a7e4ea, 0x016bce16, 0x00a8184f, 0x02e3f4fc, 0x03fd86ec, 0x03908dcb, 0x03964b2d, 0x03873009, 0x0238c85e, 0x002ac31f}}}, + {X: Field{[10]uint32{0x012e1a86, 0x005802a5, 0x03268dbe, 0x01665d00, 0x00e028c2, 0x024e2807, 0x028cb6c2, 0x014bf002, 0x03baffbc, 0x002a3935}}, Y: Field{[10]uint32{0x011a0bed, 0x019f0a4d, 0x0096fc9f, 0x02e72591, 0x02cc7eee, 0x01bc59c8, 0x0379723c, 0x0008b013, 0x003d0dc3, 0x0002356e}}}, + {X: Field{[10]uint32{0x00927ac5, 0x030eed79, 0x00df1f17, 0x02bc5467, 0x01203c01, 0x035cb5e9, 0x03191ad4, 0x01183fbf, 0x0364938e, 0x0020e107}}, Y: Field{[10]uint32{0x03536800, 0x00075e7a, 0x03e4180e, 0x0036c813, 0x02ecb1f3, 0x00105712, 0x03733974, 0x01c92484, 0x00f2c2e8, 0x0003d61a}}}, + {X: Field{[10]uint32{0x020612f6, 0x00f220c0, 0x02acbd62, 0x03da542b, 0x02af2a2d, 0x02d65fec, 0x00dcba67, 0x00fe2a18, 0x00d95ef0, 0x003ba25d}}, Y: Field{[10]uint32{0x00f141ac, 0x0381fe29, 0x0321634e, 0x03ebadf3, 0x016596ab, 0x03e7dd8f, 0x02951453, 0x01775f31, 0x01740308, 0x00173c43}}}, + {X: Field{[10]uint32{0x02579606, 0x0006982d, 0x01857b2d, 0x01ac9a47, 0x01a92dde, 0x0109d8a3, 0x036e5fa3, 0x01b28ec4, 0x018c2361, 0x001a3a23}}, Y: Field{[10]uint32{0x00fd5450, 0x01345e68, 0x03c41257, 0x01ce1a85, 0x01e5ec7b, 0x02da959d, 0x00c5d609, 0x035baf16, 0x00903766, 0x000016a4}}}, + {X: Field{[10]uint32{0x0122345b, 0x031626a5, 0x02e7c50a, 0x016b38ec, 0x00cfe6ab, 0x01333290, 0x01bea794, 0x0322d883, 0x018ac62e, 0x003f8d37}}, Y: Field{[10]uint32{0x03d6c8c0, 0x02ee6fda, 0x025bff0a, 0x03562634, 0x0330c9ed, 0x034f8029, 0x01611d7b, 0x0384894d, 0x0055adf1, 0x002233c0}}}, + {X: Field{[10]uint32{0x0251bc1f, 0x017c8d60, 0x03ff7f6a, 0x019bf462, 0x00099893, 0x004c5cda, 0x0262479c, 0x005226aa, 0x029cc0f8, 0x00108e9e}}, Y: Field{[10]uint32{0x01c678ee, 0x00986f4a, 0x0271fde4, 0x02591cb3, 0x01259ce8, 0x01844b90, 0x02776ea1, 0x0090740b, 0x03dd0519, 0x003249ac}}}, + {X: Field{[10]uint32{0x010b98f4, 0x013c55eb, 0x00e730ed, 0x02d1c9f0, 0x010ffb0e, 0x00b82364, 0x01bb840b, 0x0153ff98, 0x03f97cbf, 0x001fe982}}, Y: Field{[10]uint32{0x0294d733, 0x02cec243, 0x0281f6e7, 0x03b5e5e3, 0x027e296f, 0x01fdcda9, 0x01c7b26a, 0x021ee3f7, 0x02df84d3, 0x00356c6a}}}, + {X: Field{[10]uint32{0x00153a66, 0x01dd0cd8, 0x0098cf1e, 0x01743bbe, 0x01829481, 0x0245fe45, 0x02df8a66, 0x037af1df, 0x030ef1ed, 0x002794f2}}, Y: Field{[10]uint32{0x02b41ccf, 0x03e05fd1, 0x037a2ed8, 0x0273f955, 0x01498349, 0x022faf82, 0x024c6f1b, 0x028a86e6, 0x02f260fe, 0x0014d636}}}, + {X: Field{[10]uint32{0x02d6f119, 0x01a5548e, 0x01e9631e, 0x023a3b24, 0x00140471, 0x0150ccb0, 0x0344ad53, 0x0319de66, 0x0241c616, 0x002b7e4d}}, Y: Field{[10]uint32{0x0242ff9e, 0x00a84edf, 0x00619dfe, 0x01056b4e, 0x028dc172, 0x031ab10a, 0x01f67615, 0x02cf7fd5, 0x02afe4cf, 0x00368f19}}}, + {X: Field{[10]uint32{0x034e4ca8, 0x01bb2d91, 0x02f0c972, 0x0310e5bd, 0x035b6242, 0x02f857d2, 0x0287ddb2, 0x02cd9ec1, 0x03ec485d, 0x0001c078}}, Y: Field{[10]uint32{0x013b9e83, 0x0360644b, 0x00f946f2, 0x033cf44f, 0x03691aa3, 0x001d00dd, 0x01f7fea3, 0x0387140a, 0x027613dc, 0x0004263e}}}, + {X: Field{[10]uint32{0x00ccfefc, 0x0036443e, 0x01e84aac, 0x01781852, 0x02d51364, 0x03149402, 0x01a7e042, 0x02a8167a, 0x03a5d3ec, 0x00363f16}}, Y: Field{[10]uint32{0x034b3d8a, 0x025c225e, 0x01920c25, 0x020f95e3, 0x02df96ee, 0x00e8b7c1, 0x014b4d98, 0x025369d2, 0x034d0eec, 0x001c9c92}}}, + {X: Field{[10]uint32{0x0371398e, 0x03aa0fbf, 0x038dcc9e, 0x027528ce, 0x00c900cb, 0x02aa97c3, 0x018a186f, 0x03fedc19, 0x039a8279, 0x001ef223}}, Y: Field{[10]uint32{0x03a14a7c, 0x01581983, 0x001b0aa9, 0x027c7d56, 0x034939d3, 0x0022ddbd, 0x02d8c77e, 0x02054468, 0x01dfe5ed, 0x00337348}}}, + {X: Field{[10]uint32{0x035ef0e5, 0x01ba845b, 0x019190f4, 0x0297befe, 0x03e5fb92, 0x03c85ca8, 0x0219bc77, 0x02787db8, 0x01310bc7, 0x00215e35}}, Y: Field{[10]uint32{0x03b7d550, 0x01d67344, 0x00290768, 0x0137b45f, 0x00cac2d0, 0x008ce3e7, 0x02ef5e05, 0x018b1a53, 0x02ac39c2, 0x003f346c}}}, + {X: Field{[10]uint32{0x00020a62, 0x0379d62a, 0x010935cd, 0x008112ee, 0x02d41240, 0x01f87302, 0x01eb5f43, 0x01986d51, 0x02d73ea2, 0x00262f08}}, Y: Field{[10]uint32{0x02232226, 0x038530a0, 0x032d9f32, 0x03ca86a8, 0x002607bf, 0x03118be5, 0x02c8d83c, 0x02e96f0a, 0x01de0d33, 0x00050f1f}}}, + {X: Field{[10]uint32{0x01e8ee10, 0x0112c2b5, 0x0001aaca, 0x0197a8f1, 0x019980f2, 0x016fc215, 0x008106ca, 0x005db742, 0x021e95d2, 0x001ff3e0}}, Y: Field{[10]uint32{0x02400284, 0x03b274bf, 0x01cfb266, 0x01506ce2, 0x03c127b0, 0x02389f2a, 0x02f4598e, 0x02bfbbe2, 0x01ae87e7, 0x0009f0d0}}}, + {X: Field{[10]uint32{0x0216a5f1, 0x00a4ba80, 0x02ca8316, 0x01e87f1d, 0x0367acd6, 0x028cd3e4, 0x03e195b6, 0x03bc17e1, 0x01b9d440, 0x0022628e}}, Y: Field{[10]uint32{0x00ce52ef, 0x03290ec6, 0x037c3fc2, 0x0398af53, 0x02c0db80, 0x0113eafe, 0x011cae97, 0x01d394bf, 0x03bbfe32, 0x003ad90b}}}, + {X: Field{[10]uint32{0x032192a4, 0x00e2fd0f, 0x03e3cbf1, 0x009e0cc8, 0x0287d6a6, 0x03c62fe6, 0x01624801, 0x0308582a, 0x00a28918, 0x000fba5d}}, Y: Field{[10]uint32{0x01660d9c, 0x002d56f3, 0x01c63dc5, 0x03f04375, 0x020fde39, 0x0183f483, 0x01d5b2a9, 0x03acd526, 0x02dfac71, 0x003d6ce1}}}, + {X: Field{[10]uint32{0x0047c14a, 0x030fcd90, 0x010a57dd, 0x03d0bed8, 0x019766bb, 0x001b0494, 0x03753eed, 0x037cd26a, 0x012fde76, 0x002f7443}}, Y: Field{[10]uint32{0x02923dec, 0x01d0cc05, 0x03bbd6bc, 0x03da7100, 0x022b8b47, 0x02d1000c, 0x0327664a, 0x01fae6e2, 0x02ed34f9, 0x0014114c}}}, + {X: Field{[10]uint32{0x03edd63d, 0x0028738e, 0x02b23c00, 0x0123105d, 0x02477a51, 0x02e7fca4, 0x039a4a0e, 0x0104913f, 0x00373978, 0x000b05e5}}, Y: Field{[10]uint32{0x032fcfb6, 0x039803c3, 0x00173e37, 0x03dcf98c, 0x002c1ca5, 0x02684aa3, 0x02fcccab, 0x01ecaea0, 0x01844f9b, 0x0028d9ed}}}, + {X: Field{[10]uint32{0x03e71580, 0x0225e62c, 0x01841362, 0x028cb4f3, 0x01a83036, 0x03ba5faf, 0x031e6df6, 0x00744dbd, 0x030ef2d6, 0x000a0bbc}}, Y: Field{[10]uint32{0x03d0f43a, 0x02097738, 0x0286fc47, 0x030c7d63, 0x035b4f9d, 0x028ff247, 0x00252647, 0x03a8b953, 0x0133c350, 0x00242c33}}}, + {X: Field{[10]uint32{0x019eff23, 0x00e31ce2, 0x00ef71ea, 0x03ab6c4e, 0x01085bf6, 0x03b82faf, 0x00ab3d50, 0x03e9f2d5, 0x015542ac, 0x00290ad3}}, Y: Field{[10]uint32{0x03566bb7, 0x03cf3287, 0x030bdb1f, 0x00e83f4b, 0x0363d0e0, 0x009ac2e7, 0x00c49973, 0x02649dd9, 0x0080f10b, 0x0005f8e2}}}, + {X: Field{[10]uint32{0x037ef00e, 0x008947bf, 0x0138b1a0, 0x0295d7cf, 0x01a06fce, 0x02562556, 0x0180d474, 0x00323d2d, 0x0064c5b0, 0x002c8eb3}}, Y: Field{[10]uint32{0x00b6464f, 0x01502a87, 0x007293bc, 0x02b3fe42, 0x03073964, 0x0115fd79, 0x03e6a17d, 0x0193612f, 0x000a7eaa, 0x0019aec6}}}, + {X: Field{[10]uint32{0x01885ea7, 0x0298a3dd, 0x03023411, 0x0273b31d, 0x0189df02, 0x001d45ba, 0x001ce7a4, 0x02c18d1a, 0x00e696ae, 0x000250b7}}, Y: Field{[10]uint32{0x007caf14, 0x00fe02dc, 0x02784ba1, 0x02eb545e, 0x01c439f0, 0x00eabed1, 0x02b06cea, 0x01ecfdad, 0x028a88be, 0x0038822f}}}, + {X: Field{[10]uint32{0x00392d16, 0x01196ae2, 0x020e1610, 0x0253843a, 0x0023e64a, 0x01c7ae52, 0x038e4dbe, 0x013b0208, 0x02b95219, 0x002e29a8}}, Y: Field{[10]uint32{0x03a5fec1, 0x018f5472, 0x015c74cb, 0x03d306d5, 0x0034c7be, 0x010ef896, 0x02758ae3, 0x03b8fdde, 0x0331b8e5, 0x003e00a7}}}, + {X: Field{[10]uint32{0x0068fc20, 0x020ff082, 0x016d90cc, 0x03105e90, 0x02f15fea, 0x0298532d, 0x03db083e, 0x0017dec7, 0x0369a1ee, 0x0028db4c}}, Y: Field{[10]uint32{0x02f0af52, 0x00c9f8dd, 0x01f10e94, 0x03817c28, 0x00aacd2a, 0x02a7f5c5, 0x03b76516, 0x03c9f56d, 0x03f9fe40, 0x00392af5}}}, + {X: Field{[10]uint32{0x008dda1d, 0x03d790c2, 0x00cc0ebe, 0x01a3d142, 0x016f03bd, 0x035bf535, 0x00cc89b9, 0x006b9bff, 0x01083d71, 0x0013a8c0}}, Y: Field{[10]uint32{0x00a3e513, 0x01e4f557, 0x02c83eed, 0x017f3957, 0x0340f9ea, 0x015059b4, 0x0154bcf1, 0x01652419, 0x017a8b1c, 0x00207a66}}}, + {X: Field{[10]uint32{0x02ffdc55, 0x03d0938a, 0x0175ece2, 0x023d01a8, 0x020fee11, 0x0109edc4, 0x0342e62e, 0x02271d91, 0x03161c1c, 0x000808a1}}, Y: Field{[10]uint32{0x03fa35b1, 0x005dd999, 0x02c28bc8, 0x00317b34, 0x0291eaff, 0x00787426, 0x00d28644, 0x029fcd0a, 0x025ecf26, 0x001e0de5}}}, + {X: Field{[10]uint32{0x0070d20c, 0x036dfa18, 0x0384cf5a, 0x024bc599, 0x0395be90, 0x00481848, 0x010d4296, 0x03c5815e, 0x02fc8e4b, 0x0034f01c}}, Y: Field{[10]uint32{0x00daf31a, 0x032ae0b6, 0x01c0cf5b, 0x03ac2bf4, 0x00f412e0, 0x03de6472, 0x015c0faa, 0x01d6eeed, 0x0262594c, 0x001c9a20}}}, + {X: Field{[10]uint32{0x0130ec82, 0x037d8381, 0x03dad3e6, 0x02f729d8, 0x0294003d, 0x0228d534, 0x00e8f342, 0x03e9f33c, 0x007ce307, 0x000a536b}}, Y: Field{[10]uint32{0x0384673d, 0x026d17f3, 0x01ecc0fb, 0x020ebf52, 0x02cfbcc7, 0x0298c279, 0x02807c4b, 0x02a98abb, 0x0222a7bc, 0x0011e7f0}}}, + {X: Field{[10]uint32{0x02732fae, 0x01766b13, 0x0175c707, 0x0027a891, 0x02225de6, 0x01ec9dbf, 0x0042a8d6, 0x03a36790, 0x025cc09f, 0x000e55b2}}, Y: Field{[10]uint32{0x02eaa23e, 0x01e89a8b, 0x00302e28, 0x0075ef5e, 0x03719643, 0x007f58bc, 0x025ee0ce, 0x02414a74, 0x03e7a821, 0x00072597}}}, + {X: Field{[10]uint32{0x01fb3def, 0x03a0afe4, 0x029e697e, 0x0359b61e, 0x014f4109, 0x0125005d, 0x036eb068, 0x012d239c, 0x0396da14, 0x000934b8}}, Y: Field{[10]uint32{0x0372236e, 0x01f43668, 0x0081e76d, 0x01d47f9f, 0x02ea875c, 0x036eb484, 0x01e3c9ce, 0x00bf3f74, 0x037224b0, 0x002ede79}}}, + {X: Field{[10]uint32{0x01a2aa5e, 0x038ae6e6, 0x00d3ab49, 0x0224f84b, 0x01188528, 0x03670be4, 0x03f9619d, 0x01701ff2, 0x0042f16e, 0x0018e350}}, Y: Field{[10]uint32{0x032b3d92, 0x0392acac, 0x024db222, 0x010dd2e2, 0x03f618da, 0x03976051, 0x039eb8b8, 0x00429037, 0x00424f00, 0x0034365e}}}, + {X: Field{[10]uint32{0x030d866c, 0x019e0a23, 0x00c5cd7d, 0x02218da0, 0x0194202d, 0x00c0cb87, 0x0323a1fd, 0x01caeaec, 0x015ba999, 0x0003e46b}}, Y: Field{[10]uint32{0x0052bdc0, 0x02853565, 0x03571e24, 0x0386c344, 0x001cb558, 0x03eccb6b, 0x038bb4fe, 0x005d68e8, 0x0145a693, 0x00182d9b}}}, + {X: Field{[10]uint32{0x02a69b7c, 0x005c9cba, 0x03c39c64, 0x0236239f, 0x039e6af4, 0x01b40dc2, 0x031fb88a, 0x0097c53f, 0x037d779c, 0x000c5504}}, Y: Field{[10]uint32{0x02295f7a, 0x034e7ee4, 0x03b13560, 0x0066c664, 0x02c1980c, 0x00991213, 0x00e112a9, 0x005e28e6, 0x011e9c09, 0x003acef6}}}, + {X: Field{[10]uint32{0x01549597, 0x0072e4d8, 0x01355072, 0x00b65286, 0x01f710be, 0x03475e99, 0x03acb3c1, 0x027f2078, 0x021fdfdf, 0x003e2087}}, Y: Field{[10]uint32{0x018993ec, 0x013116df, 0x002a3f4b, 0x00171ebf, 0x02c5770c, 0x033ca396, 0x03635b9d, 0x014a0946, 0x0068c1e0, 0x002ed41e}}}, + {X: Field{[10]uint32{0x0354a655, 0x013d8fa0, 0x033b06dd, 0x02be1c0c, 0x00ec5d6f, 0x01438eb6, 0x018aa900, 0x0012968b, 0x023a5214, 0x00210251}}, Y: Field{[10]uint32{0x01db3bd4, 0x0215efb8, 0x01ecf91b, 0x00949a68, 0x031b8a65, 0x00edeacd, 0x00c1b668, 0x00b294e7, 0x012b8509, 0x00332651}}}, + {X: Field{[10]uint32{0x003bc471, 0x01041980, 0x01e09f72, 0x0395a08a, 0x02314380, 0x015d1767, 0x0222eb53, 0x01c2d5b6, 0x001112d3, 0x0025a009}}, Y: Field{[10]uint32{0x005d8f38, 0x017e518a, 0x0092ff49, 0x000c4eed, 0x0327d6c7, 0x0165b440, 0x020419d6, 0x030807fe, 0x01377f03, 0x00376b0b}}}, + {X: Field{[10]uint32{0x023a69c8, 0x027f0fe8, 0x01393d3f, 0x01fda329, 0x020f85e8, 0x005c2547, 0x03628244, 0x00568571, 0x02ec9f57, 0x002746ae}}, Y: Field{[10]uint32{0x0328cadf, 0x02b4a2cf, 0x03bdd149, 0x039e6219, 0x0071b010, 0x02508d4e, 0x00c89e62, 0x02d8708e, 0x030050db, 0x003c87b9}}}, + {X: Field{[10]uint32{0x001f7ae6, 0x01d0b585, 0x03a32f72, 0x02816166, 0x019886d6, 0x012c10dc, 0x03234b6a, 0x02bd1b0d, 0x02918db3, 0x0007ee59}}, Y: Field{[10]uint32{0x001f7379, 0x035560b5, 0x00ecab09, 0x01e08101, 0x02a17b55, 0x03a69096, 0x034c4426, 0x03f647df, 0x02cc207e, 0x0022f04f}}}, + {X: Field{[10]uint32{0x021ec7b8, 0x00876da7, 0x01281ee2, 0x03c169e0, 0x02416d54, 0x0010a3a2, 0x00bcb23e, 0x0136ac26, 0x0364b927, 0x0008b678}}, Y: Field{[10]uint32{0x02d8407d, 0x01219780, 0x024c1c1e, 0x0244a3e4, 0x014c300a, 0x01d3a546, 0x0399195b, 0x01f6d795, 0x0258f93d, 0x0017708c}}}, + {X: Field{[10]uint32{0x0073e45d, 0x01ca5efe, 0x03ff8398, 0x030091f2, 0x01adb168, 0x0161d04c, 0x0166766d, 0x020fecc0, 0x0050aed0, 0x001897e9}}, Y: Field{[10]uint32{0x0376bb7b, 0x007d9121, 0x011175a2, 0x02196e39, 0x00fbb5a2, 0x0280913c, 0x0185ed21, 0x03241195, 0x0104473d, 0x001c82a0}}}, + {X: Field{[10]uint32{0x02a2147f, 0x020bcde9, 0x028ff01f, 0x003fc86b, 0x002deacc, 0x009a06ba, 0x03b01c2e, 0x03f0977b, 0x01c19b6d, 0x00092b2c}}, Y: Field{[10]uint32{0x03ca5d4b, 0x02647774, 0x03d52783, 0x036b7ebd, 0x0193f50a, 0x01c6aaf8, 0x00abdcdb, 0x0201862a, 0x0335210e, 0x003dca74}}}, + {X: Field{[10]uint32{0x035ab555, 0x004c0b3d, 0x0339f33c, 0x025ae96c, 0x036c6d18, 0x02fdf6ce, 0x02328e3b, 0x00c353ce, 0x0003a99d, 0x0034a15a}}, Y: Field{[10]uint32{0x0292d6ff, 0x02727681, 0x00fdf568, 0x0224f9e0, 0x012b814a, 0x02d06dc9, 0x0098bbf1, 0x016e1d8b, 0x014d6470, 0x00259266}}}, + {X: Field{[10]uint32{0x00b5fe0a, 0x002f2613, 0x0031b50a, 0x023cef1e, 0x008fb529, 0x01c797f6, 0x01e95ef8, 0x01a212c5, 0x02659d19, 0x002014a7}}, Y: Field{[10]uint32{0x00b3b778, 0x0391dbc4, 0x02de6e9a, 0x02a1d3a1, 0x000b74b4, 0x01696c9a, 0x01e50bfc, 0x02faa3bf, 0x024f9ae4, 0x0021a2cf}}}, + {X: Field{[10]uint32{0x0328e183, 0x01d35fa1, 0x01dded06, 0x005a54fc, 0x030e0bb3, 0x02710c9d, 0x0288e494, 0x0007b574, 0x01aa3b82, 0x001fe466}}, Y: Field{[10]uint32{0x025288b9, 0x0387e7c6, 0x01e2ffcb, 0x0107765f, 0x00ee9d7e, 0x029c89a3, 0x02c174a3, 0x0080a551, 0x0273d037, 0x00006ae9}}}, + {X: Field{[10]uint32{0x0029ecbc, 0x0322598b, 0x02fb76d0, 0x01b59134, 0x0129b456, 0x03332c64, 0x004674cd, 0x0167d923, 0x008508e9, 0x001f4cb2}}, Y: Field{[10]uint32{0x02d39698, 0x0000d081, 0x013e866e, 0x0278c7d5, 0x02875ea9, 0x01971ce1, 0x011afb8e, 0x03fba325, 0x00ecb50b, 0x003643a5}}}, + {X: Field{[10]uint32{0x011abfbf, 0x020678cb, 0x0374cbf8, 0x03feb67a, 0x011f1727, 0x02f46fc0, 0x02ce67eb, 0x03b3215d, 0x01c09291, 0x003cae58}}, Y: Field{[10]uint32{0x0126f795, 0x001c408c, 0x00524017, 0x002b5030, 0x00ed0aec, 0x0195bd8e, 0x00382208, 0x01a8d91b, 0x00495a1e, 0x003aff96}}}, + {X: Field{[10]uint32{0x01be876e, 0x02efefe0, 0x02676f75, 0x005d3a62, 0x026b4ae3, 0x025c606c, 0x02d6a728, 0x00ca465c, 0x02899528, 0x00366831}}, Y: Field{[10]uint32{0x02bfa042, 0x03e31eb1, 0x00d922b7, 0x024eecd4, 0x01e9039b, 0x034fc0c2, 0x0164d974, 0x02f26b45, 0x0086a0ac, 0x0034daba}}}, + {X: Field{[10]uint32{0x007c3e0a, 0x0375205f, 0x0269fbe2, 0x0048c2ce, 0x00fff299, 0x002af7d7, 0x01b2aa71, 0x01f23264, 0x03246aeb, 0x0031e8d8}}, Y: Field{[10]uint32{0x01c9e21f, 0x016c3001, 0x025f815f, 0x01235b47, 0x0102b321, 0x02d2cb52, 0x01863026, 0x0234b5e6, 0x01d70e44, 0x0004a63f}}}, + {X: Field{[10]uint32{0x00985a86, 0x010853f9, 0x00ac4830, 0x01931ff8, 0x02640d24, 0x036fd58e, 0x02535a04, 0x034ef019, 0x03a05064, 0x0018d735}}, Y: Field{[10]uint32{0x01e3ae1f, 0x014f89fa, 0x01a4ce04, 0x011fcca0, 0x00e8d5f0, 0x03e78bcc, 0x0335cfca, 0x01dfd919, 0x0265913e, 0x00003900}}}, + {X: Field{[10]uint32{0x009ee5f5, 0x02478426, 0x00adcc5b, 0x02dc85a7, 0x02eca54b, 0x0256d206, 0x035b6326, 0x03a894df, 0x024f38ed, 0x00017698}}, Y: Field{[10]uint32{0x02721779, 0x0035dc72, 0x02505a22, 0x0088dec5, 0x0248c288, 0x00e9495b, 0x03aeeb24, 0x000c03ff, 0x01baa108, 0x0034fa9b}}}, + {X: Field{[10]uint32{0x007d4d5e, 0x024a13fa, 0x0080efe1, 0x0230a5db, 0x01ce0527, 0x03f92db5, 0x001f6871, 0x01d7b24b, 0x00a2b197, 0x002a93d9}}, Y: Field{[10]uint32{0x02d4f240, 0x01e4f70f, 0x0118e293, 0x00a20e59, 0x00224ea0, 0x0160e99b, 0x036e9499, 0x0383eda5, 0x017e95fc, 0x003ce7c4}}}, + {X: Field{[10]uint32{0x027e0641, 0x02d70d90, 0x038c1477, 0x03b3af8d, 0x01d60969, 0x00b81554, 0x0293f266, 0x006d088a, 0x00ea99ff, 0x0026d946}}, Y: Field{[10]uint32{0x0393165a, 0x01d21f63, 0x0165627b, 0x03147508, 0x01bebdf7, 0x0014cbfe, 0x02ea9dd3, 0x03eced0e, 0x02558650, 0x000ba7c5}}}, + {X: Field{[10]uint32{0x0297b562, 0x024f402b, 0x011594b1, 0x01ffec40, 0x006547f4, 0x03772fae, 0x02011381, 0x00b83e87, 0x02a2b597, 0x001b26e6}}, Y: Field{[10]uint32{0x0275e27d, 0x01280e18, 0x02d3b162, 0x02c99d1d, 0x02a6e78e, 0x034816f6, 0x0123d0f9, 0x01c74af9, 0x011c8d4c, 0x002bc276}}}, + {X: Field{[10]uint32{0x03467cbe, 0x019984b6, 0x01f71f53, 0x031a8df9, 0x00cf80ae, 0x031c44a8, 0x02365410, 0x02571579, 0x00803cdc, 0x0028a872}}, Y: Field{[10]uint32{0x0223fc09, 0x02e6cb53, 0x02fc273e, 0x00683108, 0x01802e2e, 0x00352c5d, 0x025410d5, 0x03c103ff, 0x030f3638, 0x003133d5}}}, + {X: Field{[10]uint32{0x03650427, 0x010df96a, 0x008a9ca8, 0x02b883cb, 0x0213102b, 0x02225cd9, 0x025af104, 0x033358d2, 0x0350c961, 0x00018f4d}}, Y: Field{[10]uint32{0x02339248, 0x01c01163, 0x03fa06d6, 0x03c1c4e4, 0x01f21125, 0x0261d0a8, 0x01e90dc6, 0x0269d9cb, 0x033274b3, 0x0021d054}}}, + {X: Field{[10]uint32{0x02bdd04a, 0x00582c94, 0x0130e1f5, 0x02fc66da, 0x00bcc97d, 0x02117453, 0x013e8fb5, 0x02095429, 0x0266e442, 0x002341c3}}, Y: Field{[10]uint32{0x01487ecd, 0x036a3766, 0x00bb2497, 0x02433bbd, 0x0248cdef, 0x005cf348, 0x0084099f, 0x013c1326, 0x00824f2b, 0x0012f263}}}, + {X: Field{[10]uint32{0x0291c8bd, 0x02ff4ad2, 0x01456175, 0x037decd8, 0x03e3f3d4, 0x03305963, 0x00143950, 0x00022ed4, 0x02a72e5f, 0x003c7f95}}, Y: Field{[10]uint32{0x01f275f2, 0x03219bbd, 0x017b2be2, 0x017ffa29, 0x03a19caa, 0x00da2159, 0x01e302ad, 0x01f69740, 0x02bee57a, 0x002f97ff}}}, + {X: Field{[10]uint32{0x03554b21, 0x01a87f9c, 0x01635747, 0x02756bb3, 0x03b41239, 0x019d6f31, 0x0271a950, 0x025a7a6e, 0x02dbd2eb, 0x00200b26}}, Y: Field{[10]uint32{0x0372bc5e, 0x008b84d9, 0x007efb74, 0x0326f841, 0x02cc3344, 0x01c3e703, 0x026527d3, 0x0339a59b, 0x0026f547, 0x001084c8}}}, + {X: Field{[10]uint32{0x0093db56, 0x020812c5, 0x02745c71, 0x0293c5e2, 0x009d24cd, 0x02f1e965, 0x030a5cda, 0x03b48803, 0x02c09d6c, 0x00256c6d}}, Y: Field{[10]uint32{0x02adb01d, 0x0002752d, 0x023ddf69, 0x0074db2c, 0x0127b233, 0x01b3c903, 0x00ce5e9a, 0x00f45ab2, 0x02815303, 0x002f050d}}}, + {X: Field{[10]uint32{0x02ede35d, 0x0120e9a9, 0x0169d2d6, 0x01bb5dac, 0x017b79a0, 0x005c08bc, 0x03b2aa4e, 0x013ab860, 0x012901f9, 0x0003abb5}}, Y: Field{[10]uint32{0x01d559b3, 0x009fee57, 0x03f8f9cb, 0x01f266b1, 0x00bc6e37, 0x02b5aebc, 0x02c1efa3, 0x02267376, 0x027691c5, 0x0014f56c}}}, + {X: Field{[10]uint32{0x0027d770, 0x02dcd667, 0x02abeac7, 0x0038d9ef, 0x03906d69, 0x03bcfdfc, 0x02b485b6, 0x011231cb, 0x03e59f6f, 0x001df113}}, Y: Field{[10]uint32{0x031102fd, 0x008bbafe, 0x009d3833, 0x027feb31, 0x00e6629c, 0x038f5ace, 0x00f03604, 0x003e00b3, 0x00226c44, 0x002f35d4}}}, + {X: Field{[10]uint32{0x000a0306, 0x02b97ef9, 0x0144efad, 0x01e55046, 0x00011b62, 0x0364daa2, 0x0352002c, 0x00291ad9, 0x02e2f00f, 0x003a18ec}}, Y: Field{[10]uint32{0x03243a5f, 0x03f81119, 0x00358b36, 0x01f59802, 0x01c2ed93, 0x00c7a3ab, 0x039caff6, 0x027c5c16, 0x03a36da2, 0x002d71e6}}}, + {X: Field{[10]uint32{0x02f8f191, 0x0079cbbb, 0x02dec272, 0x02d3cf73, 0x003883ad, 0x02b68c26, 0x03eedda4, 0x01c742cb, 0x03ef93df, 0x00089bd6}}, Y: Field{[10]uint32{0x001707c3, 0x008cf39d, 0x00fbcc13, 0x022f5d73, 0x00f96607, 0x02116186, 0x00a08fbe, 0x02f05228, 0x00b52bce, 0x00282481}}}, + {X: Field{[10]uint32{0x03467184, 0x03a40da0, 0x0046e3a4, 0x0292bfdf, 0x02c33bed, 0x031bc237, 0x03a82b39, 0x01f14e7c, 0x03b08c1e, 0x002a888b}}, Y: Field{[10]uint32{0x001c3765, 0x03590c5f, 0x01d4ac5d, 0x00a641ad, 0x01c1653d, 0x01b7fe4c, 0x01a7c3aa, 0x03f4e608, 0x01cf21ca, 0x00010441}}}, + {X: Field{[10]uint32{0x01fec96a, 0x01d53c78, 0x01a82239, 0x033048db, 0x01f94482, 0x025ec540, 0x01220bb3, 0x013b4f71, 0x02cd26ef, 0x00061e70}}, Y: Field{[10]uint32{0x01f0d67d, 0x01c96ddc, 0x01351464, 0x01472dcf, 0x024fc689, 0x00758c10, 0x03b16092, 0x03785247, 0x033575ea, 0x00244b57}}}, + {X: Field{[10]uint32{0x009902e0, 0x01fb2c6b, 0x03b76765, 0x007af70a, 0x026df621, 0x01c352df, 0x024cfc59, 0x03622fd2, 0x00a4e7ee, 0x002f8e79}}, Y: Field{[10]uint32{0x0227cb4e, 0x03311d9f, 0x00899f94, 0x02915857, 0x0132ae54, 0x0133d692, 0x006d9a2b, 0x029edd8c, 0x00f113fc, 0x00362c79}}}, + {X: Field{[10]uint32{0x012d5786, 0x02f70bdd, 0x00631d3f, 0x0391f3d1, 0x001c2912, 0x01b0fe2a, 0x03028368, 0x0230f740, 0x03ce3337, 0x0007a9cb}}, Y: Field{[10]uint32{0x0348906e, 0x002e220d, 0x007c9aed, 0x02c201ff, 0x000cb6e2, 0x03941ade, 0x03f261af, 0x03745333, 0x0158fe1c, 0x003883d1}}}, + {X: Field{[10]uint32{0x02036806, 0x0198beb6, 0x032423ac, 0x0046dd36, 0x022d0ca0, 0x00caf0e5, 0x00638e6f, 0x03d5f7a3, 0x03dd67bf, 0x00015b8c}}, Y: Field{[10]uint32{0x0393f461, 0x00ee4ff0, 0x02e2efbb, 0x033cf853, 0x0350d78e, 0x007795ef, 0x0317d4e4, 0x01c4c024, 0x00cc165e, 0x00100e70}}}, + {X: Field{[10]uint32{0x000f37ad, 0x01c330ba, 0x034470c4, 0x0153c429, 0x02d036ce, 0x00e2e78f, 0x02fb95a7, 0x03637c72, 0x0291a5f1, 0x00146605}}, Y: Field{[10]uint32{0x01972261, 0x02a998b1, 0x03664d31, 0x03711c7b, 0x01d03fab, 0x03a5fc11, 0x026e3c26, 0x00aa641d, 0x004767cf, 0x00027ee4}}}, + {X: Field{[10]uint32{0x00869dbd, 0x03165e66, 0x03f3016e, 0x02e6f355, 0x02b90db9, 0x03e49e65, 0x00be7f95, 0x025e0dac, 0x028577a5, 0x003bce95}}, Y: Field{[10]uint32{0x037c5e07, 0x030f6306, 0x024d372a, 0x00d92ed4, 0x03fabe11, 0x0387d1e0, 0x01782c6a, 0x01d27a52, 0x0057ff22, 0x001473f9}}}, + {X: Field{[10]uint32{0x03196415, 0x0301836b, 0x00a22523, 0x020814c1, 0x0379a668, 0x038f190c, 0x029e0b16, 0x0216e9fb, 0x02a18c3a, 0x003bf194}}, Y: Field{[10]uint32{0x00f7b2a5, 0x0111ecd5, 0x01d49737, 0x00726302, 0x038fcee7, 0x01661c20, 0x01b2498f, 0x006bcc07, 0x0014cef9, 0x0022995b}}}, + {X: Field{[10]uint32{0x004bbf82, 0x00dc2862, 0x015def07, 0x018b012a, 0x018adc79, 0x0226203c, 0x00021983, 0x0338b366, 0x03eff4d5, 0x00337687}}, Y: Field{[10]uint32{0x01e31d6c, 0x01726c12, 0x0235a0e5, 0x02ae14d8, 0x024417f9, 0x0291e058, 0x019174b4, 0x0370175e, 0x03fcb0c9, 0x0022f09b}}}, + {X: Field{[10]uint32{0x016cf0d4, 0x021a11ee, 0x03a3f938, 0x02b370e8, 0x00d46bb6, 0x01f7b750, 0x00b76d77, 0x02a84c4d, 0x01853454, 0x001bcfce}}, Y: Field{[10]uint32{0x00adba81, 0x03b1724b, 0x01637e4e, 0x02479592, 0x00b6e324, 0x029020d1, 0x03e5192e, 0x0286d6b9, 0x019c4f7c, 0x002a2e92}}}, + {X: Field{[10]uint32{0x014b13e4, 0x033577f9, 0x01ee8061, 0x01f61452, 0x03a2a362, 0x03636013, 0x0042065e, 0x03ee0faa, 0x01af91ab, 0x00394b44}}, Y: Field{[10]uint32{0x01cfff97, 0x00e384aa, 0x01069468, 0x00f438fb, 0x012e132a, 0x039cca17, 0x021f6ed4, 0x0159cb2c, 0x006d619e, 0x00167cc4}}}, + {X: Field{[10]uint32{0x027256ff, 0x0033e8e7, 0x02ac066c, 0x01a70c38, 0x038fb918, 0x00cacf2a, 0x0254d13b, 0x0072d915, 0x0336f0de, 0x00227fb1}}, Y: Field{[10]uint32{0x03e44274, 0x01156b81, 0x01ded46b, 0x036ed63d, 0x0173e708, 0x037f798b, 0x02b938d9, 0x0069b6da, 0x02e84d3e, 0x003e505e}}}, + {X: Field{[10]uint32{0x02b70b29, 0x036b0248, 0x03f7531b, 0x0082a240, 0x03522615, 0x000a1d27, 0x006ce733, 0x00154f3a, 0x035691b1, 0x00014503}}, Y: Field{[10]uint32{0x022dc024, 0x019f5caa, 0x00afd0dd, 0x002fe894, 0x00ad0acf, 0x007033a4, 0x021f4ce2, 0x0308f401, 0x022b9e02, 0x00246865}}}, + {X: Field{[10]uint32{0x01267b5c, 0x0243f21f, 0x00d09c0f, 0x03ae1548, 0x030579d0, 0x034cbe52, 0x035e199e, 0x02645c41, 0x01309310, 0x0000f058}}, Y: Field{[10]uint32{0x00ac64c3, 0x01f4dade, 0x00e51a5f, 0x03297a00, 0x01e9f156, 0x01a4eb00, 0x02a00107, 0x0036e40e, 0x00dfe404, 0x00354341}}}, + {X: Field{[10]uint32{0x03e8bac9, 0x00fbae26, 0x01fa8be1, 0x014a4474, 0x02a2d0b9, 0x00090154, 0x00b8a58f, 0x0008dc96, 0x010e63a5, 0x003f61da}}, Y: Field{[10]uint32{0x021b9225, 0x013fa922, 0x0247458e, 0x038eb144, 0x03b40f04, 0x011ff19a, 0x023ee352, 0x01a3d5be, 0x01acccb9, 0x00101b70}}}, + {X: Field{[10]uint32{0x01a12a81, 0x01d0d2f5, 0x01347ebc, 0x0381aa36, 0x0299005c, 0x01cecca3, 0x028ad599, 0x01e3ccb3, 0x01de017e, 0x00023934}}, Y: Field{[10]uint32{0x01a2a8ae, 0x0065006c, 0x036da429, 0x02a230c6, 0x02992baf, 0x02efc362, 0x00c843b4, 0x029975d1, 0x033e744c, 0x00318d23}}}, + {X: Field{[10]uint32{0x007743c2, 0x00e6831b, 0x03ff6ea7, 0x001059de, 0x02f49881, 0x029632aa, 0x03b6eebb, 0x0319e05c, 0x03cfea62, 0x000e0b1e}}, Y: Field{[10]uint32{0x01c5eb7d, 0x0154e69a, 0x035237cf, 0x0372bf34, 0x0267e9ad, 0x000703da, 0x01f7f27e, 0x01090d4f, 0x01da77e6, 0x00006429}}}, + {X: Field{[10]uint32{0x0114ed0f, 0x0364357e, 0x01d29e87, 0x03254efd, 0x0125b0da, 0x03a941e5, 0x01fa471b, 0x01201d4e, 0x034e74b8, 0x003d5aa2}}, Y: Field{[10]uint32{0x0096db8b, 0x00547ef0, 0x01a48c50, 0x00704e45, 0x008f9f20, 0x01a9ba89, 0x03881c65, 0x039848ea, 0x0108da57, 0x001515b6}}}, + {X: Field{[10]uint32{0x03965b80, 0x03f6c185, 0x02a044ec, 0x00b157c4, 0x003af365, 0x005ae031, 0x02f8ea2b, 0x0155e87f, 0x03fb6a5e, 0x002423a7}}, Y: Field{[10]uint32{0x038bc2ce, 0x0379d6a1, 0x02043562, 0x0253b5ad, 0x03b9c010, 0x03af0c4d, 0x0182ca07, 0x0133c3e0, 0x00c9d1b1, 0x002fab8a}}}, + {X: Field{[10]uint32{0x02c86ef4, 0x00b9ba6f, 0x01e787ef, 0x012e6750, 0x033fad25, 0x014a4d3a, 0x03225330, 0x0207f45a, 0x03184333, 0x0029b0c1}}, Y: Field{[10]uint32{0x023fb818, 0x024015d8, 0x026f44bf, 0x020817b8, 0x029e266f, 0x000c271c, 0x01129e4e, 0x01440813, 0x0286a60d, 0x0011ea68}}}, + {X: Field{[10]uint32{0x00b3e903, 0x019bade6, 0x01361047, 0x038d28a6, 0x0230a652, 0x00af882b, 0x01461635, 0x00b0980b, 0x01866c3e, 0x002522eb}}, Y: Field{[10]uint32{0x01c35164, 0x01312136, 0x00d3395b, 0x0129da86, 0x004321da, 0x02457783, 0x0043b0f0, 0x0228ae67, 0x0222ad47, 0x000c34c1}}}, + {X: Field{[10]uint32{0x00f6a3f2, 0x03a13487, 0x02c9f0c9, 0x0373e5b4, 0x029d536e, 0x021e0b4d, 0x03881251, 0x005eb9dd, 0x039dcb8a, 0x0035b24a}}, Y: Field{[10]uint32{0x02de09b9, 0x00412bca, 0x0207b9e0, 0x00923b08, 0x030ed686, 0x02bb1752, 0x030ae881, 0x020dde5e, 0x03a09351, 0x003764d9}}}, + {X: Field{[10]uint32{0x01566abd, 0x03bc3f59, 0x0232854c, 0x00269d6b, 0x037b0822, 0x0137e00b, 0x00641ca6, 0x004f591b, 0x017b7d8b, 0x003e7fcf}}, Y: Field{[10]uint32{0x02deec98, 0x0396580c, 0x011c8c84, 0x00a2861c, 0x01b9269d, 0x00f60474, 0x02230224, 0x008257dc, 0x019e1f19, 0x002b1618}}}, + {X: Field{[10]uint32{0x02c8d5e0, 0x00a3dba4, 0x014e1c35, 0x01fe0d34, 0x017f4e76, 0x00a0dfb5, 0x009a9204, 0x0383dc08, 0x01ba3a70, 0x000f6b87}}, Y: Field{[10]uint32{0x000f797f, 0x0134154a, 0x0332e08b, 0x0367aa64, 0x015c7816, 0x03ffa1f2, 0x03cdfad3, 0x03cb3f87, 0x028d6ea1, 0x001eb891}}}, + {X: Field{[10]uint32{0x01b49937, 0x012c0746, 0x007cad0b, 0x01f836ef, 0x008ffd22, 0x03caabac, 0x03ffe130, 0x024df272, 0x01056fcc, 0x0009c114}}, Y: Field{[10]uint32{0x03fa4397, 0x029a63c7, 0x02ad4d08, 0x03d710a1, 0x01bbd801, 0x01875b1d, 0x00d37246, 0x03f7f888, 0x02546c24, 0x00045d9a}}}, + {X: Field{[10]uint32{0x00defd22, 0x00359788, 0x00865bb9, 0x01599271, 0x012024c5, 0x018beea0, 0x00340752, 0x0183bb35, 0x03f96c32, 0x003e7657}}, Y: Field{[10]uint32{0x03a13c2d, 0x0009af05, 0x01dda24b, 0x0128696c, 0x030a89d5, 0x00c11cc2, 0x02632ba8, 0x00504602, 0x03fd8f74, 0x000df2fd}}}, + {X: Field{[10]uint32{0x01a7021f, 0x02d5f171, 0x0021448a, 0x02ef6e64, 0x02ff0a86, 0x019b3ef9, 0x018c6d5b, 0x019fa7fb, 0x0318f90f, 0x00013a37}}, Y: Field{[10]uint32{0x02a621f5, 0x024ff6bc, 0x0329ea22, 0x03f4ea0d, 0x000e9bad, 0x02cd210f, 0x03a2b1b3, 0x01904d14, 0x00c5ccf5, 0x001f9a7e}}}, + {X: Field{[10]uint32{0x02ffef9f, 0x016dde74, 0x01821c8a, 0x02f4ef8d, 0x00ab3d32, 0x00f19916, 0x02783836, 0x01fec86e, 0x012a710a, 0x00230a93}}, Y: Field{[10]uint32{0x025511d6, 0x016ab18d, 0x01205caa, 0x0247fce7, 0x03f82d8f, 0x006f595d, 0x01715157, 0x00960d18, 0x007d27e4, 0x00354c91}}}, + {X: Field{[10]uint32{0x03654b75, 0x010f3be1, 0x00e19631, 0x007b52c1, 0x02c10e81, 0x023eb9cb, 0x00677afa, 0x027339bf, 0x03a01974, 0x000a2dfc}}, Y: Field{[10]uint32{0x005ec782, 0x035698e1, 0x03e392ce, 0x00c699e3, 0x01e241ba, 0x01c7d287, 0x017c881e, 0x02ace456, 0x01eb3245, 0x0000c11c}}}, + {X: Field{[10]uint32{0x01be416b, 0x01b5f6d6, 0x0300808f, 0x025033d2, 0x02d89f64, 0x02667b23, 0x03b5acb0, 0x039cb095, 0x010ffcb8, 0x0032d1d3}}, Y: Field{[10]uint32{0x016622fd, 0x00c146a8, 0x000c7e3a, 0x02cfbff0, 0x029a0e59, 0x01d67e15, 0x039a9508, 0x00f2ee2a, 0x00cefc29, 0x003fdf34}}}, + {X: Field{[10]uint32{0x0055b36c, 0x01ecd7d0, 0x023f5bd5, 0x00d0ba65, 0x011a1800, 0x0378a929, 0x01567fbe, 0x02f10099, 0x01825dbe, 0x0030cf9a}}, Y: Field{[10]uint32{0x0146be18, 0x023b0b31, 0x01e0db79, 0x02d64694, 0x02082c0c, 0x0266ac19, 0x03b50615, 0x01973894, 0x03f57ce2, 0x0008bfcf}}}, + {X: Field{[10]uint32{0x01bd2237, 0x01060e06, 0x00a0eee3, 0x0116cf43, 0x03257e07, 0x01112a6a, 0x02441a84, 0x01c48dc6, 0x010644d3, 0x00212ff0}}, Y: Field{[10]uint32{0x009ef6f1, 0x00861eca, 0x0235ae1c, 0x00847b38, 0x03afd7f4, 0x00f9065e, 0x03d13ffb, 0x03dc1b0c, 0x02d57b7a, 0x001f2f95}}}, + {X: Field{[10]uint32{0x017b713a, 0x026594fe, 0x008dc735, 0x02296c12, 0x03606302, 0x01f820d7, 0x000f003f, 0x00913bf5, 0x02ecd53b, 0x000270c4}}, Y: Field{[10]uint32{0x02b76d14, 0x01126c53, 0x01fe6165, 0x0297fb90, 0x0059698b, 0x00622d3a, 0x00d0b160, 0x01dfbe15, 0x010f58fc, 0x00046f2f}}}, + {X: Field{[10]uint32{0x0315cefc, 0x02a0b72b, 0x004332d0, 0x006b8074, 0x01d474f6, 0x00eef3c8, 0x0183bf4e, 0x01bcb433, 0x0359a22d, 0x001701ab}}, Y: Field{[10]uint32{0x0322aae8, 0x02059690, 0x02be2904, 0x02c50978, 0x0341fbef, 0x0319a6ab, 0x006d70d6, 0x0197f6a3, 0x03e9f1c2, 0x0011dad2}}}, + {X: Field{[10]uint32{0x01b6bdcf, 0x03516cfc, 0x002bf2d6, 0x01c72118, 0x03f44f0d, 0x02bce7ae, 0x000eb547, 0x03b50ed3, 0x01c681a3, 0x001ddc96}}, Y: Field{[10]uint32{0x033bf754, 0x037861fe, 0x02bba22f, 0x0273d58f, 0x03d6742b, 0x0320d199, 0x00448514, 0x02162bbb, 0x03535481, 0x0022a74d}}}, + {X: Field{[10]uint32{0x01266842, 0x00831410, 0x0283ce38, 0x03101d98, 0x020174b8, 0x03409137, 0x024328b4, 0x03074c53, 0x001eae1f, 0x002cdc18}}, Y: Field{[10]uint32{0x00125ac0, 0x00da0d2f, 0x029323e1, 0x02a9010a, 0x03eda7b5, 0x036603b8, 0x02a9abc8, 0x030ec1d4, 0x00792174, 0x0023bc14}}}, + {X: Field{[10]uint32{0x02fe6584, 0x022b23b6, 0x028bf824, 0x015ac054, 0x02780868, 0x01c25c81, 0x032ad406, 0x01924a91, 0x02c07f8d, 0x0016be52}}, Y: Field{[10]uint32{0x022daf1a, 0x030e59b9, 0x016552a9, 0x035e33f9, 0x00b40dff, 0x03bd7d5b, 0x01f32efc, 0x03794475, 0x03ce57ea, 0x00229531}}}, + {X: Field{[10]uint32{0x030586c6, 0x032e39d6, 0x0194581a, 0x007cfe51, 0x034f84b4, 0x0160cbcd, 0x01d4f23c, 0x01c154e1, 0x019ce2e8, 0x0023f8f0}}, Y: Field{[10]uint32{0x01728c28, 0x013d6b24, 0x03860067, 0x005c055b, 0x012f5e20, 0x02bc64f2, 0x0314d491, 0x01130e90, 0x019fd16f, 0x003e48c2}}}, + {X: Field{[10]uint32{0x03ac9a71, 0x00a23f04, 0x02fc3b5f, 0x01fe8dee, 0x01e531d1, 0x026d97ad, 0x01211b30, 0x02f4797e, 0x021d2642, 0x00356025}}, Y: Field{[10]uint32{0x034185cb, 0x0225fa46, 0x03650e4f, 0x03716ce3, 0x02d9678c, 0x02c4bea1, 0x0250a6e0, 0x022d0cdb, 0x0154337e, 0x00140301}}}, + {X: Field{[10]uint32{0x0295e82b, 0x033efc50, 0x01405256, 0x019d6a71, 0x02234e79, 0x019e430c, 0x02460338, 0x02988d27, 0x00ed529f, 0x00009577}}, Y: Field{[10]uint32{0x01799815, 0x03d2d29f, 0x00b100c8, 0x033653db, 0x035dfba7, 0x02a918c5, 0x03253d3f, 0x0071eff0, 0x01c47f3e, 0x001fbb6a}}}, + {X: Field{[10]uint32{0x00891557, 0x02f908bb, 0x004580bd, 0x00e2a376, 0x031a27c3, 0x03923957, 0x00476a4a, 0x01147eae, 0x03a79240, 0x0012dfaf}}, Y: Field{[10]uint32{0x01b59085, 0x00f60fa1, 0x012848c6, 0x035f90a1, 0x02c12622, 0x035fb604, 0x00a23cfa, 0x00d7d83f, 0x00e9f891, 0x0037ec98}}}, + {X: Field{[10]uint32{0x032fbf28, 0x01fd5547, 0x00c7d8f4, 0x0274ef45, 0x01311956, 0x0319dc67, 0x035819e0, 0x024aa68e, 0x03809e60, 0x00246741}}, Y: Field{[10]uint32{0x003d8094, 0x02bca0e1, 0x024fdcbc, 0x03528c38, 0x00c204d3, 0x02635846, 0x03b2fa50, 0x003cb3b2, 0x02f876d7, 0x003282da}}}, + {X: Field{[10]uint32{0x0070ee78, 0x03754da3, 0x03f42393, 0x01ad67ba, 0x009b8c89, 0x02b8d0a9, 0x02d73bd5, 0x02a5116f, 0x03a9de89, 0x00119a19}}, Y: Field{[10]uint32{0x02e042e1, 0x03559e2a, 0x02029385, 0x024d3ba5, 0x019cbb9f, 0x022dfb42, 0x01bd6cae, 0x01608c1e, 0x0307b3e1, 0x000a9765}}}, + {X: Field{[10]uint32{0x01db3f7b, 0x0172e8b0, 0x01f3cd98, 0x016ef995, 0x01fc740d, 0x03dc4963, 0x021526fc, 0x01145e24, 0x0108c878, 0x001c49d3}}, Y: Field{[10]uint32{0x034b25e0, 0x01237bfe, 0x03f560d8, 0x0299aaf9, 0x033cdd2c, 0x010185de, 0x01652bc4, 0x0050d3e3, 0x0130a5be, 0x00382bc0}}}, + {X: Field{[10]uint32{0x02be2bcd, 0x03838ddf, 0x0111fa0a, 0x01b47ecc, 0x03b6e825, 0x013981a3, 0x00693c1f, 0x0090744f, 0x00482d25, 0x00291ba4}}, Y: Field{[10]uint32{0x00474eda, 0x02486fa5, 0x0111140f, 0x02ff56b9, 0x01fdd708, 0x0185c9ab, 0x026e7ac9, 0x02ada604, 0x000cf22a, 0x001d59dc}}}, + {X: Field{[10]uint32{0x01e84abd, 0x000afea9, 0x03b5baec, 0x022e89b4, 0x0110ea91, 0x01ef9a14, 0x0073b0f7, 0x00449a16, 0x0391f243, 0x003dd642}}, Y: Field{[10]uint32{0x02708999, 0x024d6918, 0x00e2eded, 0x02357a8a, 0x002d2512, 0x016372f2, 0x035d6cc8, 0x02534326, 0x00f8594c, 0x00120612}}}, + {X: Field{[10]uint32{0x028c2edf, 0x00bb7790, 0x023bc9a2, 0x037ebfd7, 0x004f966e, 0x0263c1e4, 0x0139d643, 0x03876b6b, 0x00e51282, 0x000b5eaa}}, Y: Field{[10]uint32{0x035d9d79, 0x016d868c, 0x01fb5763, 0x0285c233, 0x01a30b4d, 0x005d57e7, 0x033ea24f, 0x008267ac, 0x033c4203, 0x0004ac84}}}, + {X: Field{[10]uint32{0x0236d0e3, 0x0143ea5c, 0x00607995, 0x009d7d96, 0x00822809, 0x0207c4d7, 0x03113a55, 0x0311ff67, 0x03403302, 0x00244c4f}}, Y: Field{[10]uint32{0x00838a77, 0x00fd89e4, 0x03f27c32, 0x0308b833, 0x03aa9e96, 0x03c84a16, 0x01daee91, 0x0012fd18, 0x00075e78, 0x003e2dbb}}}, + {X: Field{[10]uint32{0x006743cb, 0x0128755b, 0x010de2f4, 0x0070e867, 0x01e0be03, 0x02c51bef, 0x028e86e1, 0x02169e11, 0x011909d3, 0x00368920}}, Y: Field{[10]uint32{0x00348cbf, 0x027bd9d0, 0x01a666d3, 0x02d874b3, 0x0305d418, 0x026cdf11, 0x00625111, 0x03dbbbcb, 0x017b5f76, 0x00301f22}}}, + {X: Field{[10]uint32{0x01e82220, 0x00809a37, 0x01bd62e8, 0x03e5bc07, 0x02760ec3, 0x03a7b50c, 0x01e6082d, 0x030b8fed, 0x02240b1b, 0x002578da}}, Y: Field{[10]uint32{0x00e1cb63, 0x017a7447, 0x03d01766, 0x021c7878, 0x0352a74a, 0x032d080a, 0x003b209d, 0x0128ea3c, 0x00d73abc, 0x002f9a64}}}, + {X: Field{[10]uint32{0x02bc6e8b, 0x020ccfcf, 0x01cdf488, 0x021c5411, 0x01afe54a, 0x007e0478, 0x03489e45, 0x01d6c315, 0x00603abd, 0x0022c16c}}, Y: Field{[10]uint32{0x0340fb39, 0x003d3f9f, 0x0179dbb3, 0x0056b358, 0x0027f5b6, 0x0206f69f, 0x01e2ddce, 0x0103ee22, 0x008145db, 0x0007443e}}}, + {X: Field{[10]uint32{0x03020f54, 0x0274c33c, 0x0372855a, 0x02df7363, 0x01d43ec0, 0x0072e0ca, 0x00bbb2ba, 0x00c9e9d4, 0x023b764a, 0x003feaf2}}, Y: Field{[10]uint32{0x01d0f05a, 0x021510db, 0x01302cf5, 0x0172d828, 0x00c79196, 0x013a652d, 0x02fb393a, 0x0289816c, 0x0265c90b, 0x0024e5c2}}}, + {X: Field{[10]uint32{0x03866c72, 0x03ec14c2, 0x027c0a18, 0x01a2c4cf, 0x02d35148, 0x01d4a662, 0x00f05fa9, 0x0392a63c, 0x02efef35, 0x002cea16}}, Y: Field{[10]uint32{0x036005e2, 0x011b47d6, 0x0275238f, 0x031fa228, 0x0009ee78, 0x0139c03a, 0x016b36c5, 0x016e780f, 0x02e1c21e, 0x000c0457}}}, + {X: Field{[10]uint32{0x015b7ab5, 0x01494332, 0x012d5d15, 0x00cbaf2d, 0x015b78fc, 0x03d99b54, 0x01c56590, 0x00f3c82e, 0x015f4c23, 0x00293c7f}}, Y: Field{[10]uint32{0x01faa0da, 0x00f58720, 0x02d52c36, 0x00962764, 0x03337543, 0x03148671, 0x00419fe0, 0x00496111, 0x0385726a, 0x00247467}}}, + {X: Field{[10]uint32{0x015bbb0a, 0x00f98900, 0x03c98bec, 0x00df4a6c, 0x019eb146, 0x02d62d7b, 0x03f39232, 0x033c4e52, 0x034b7bae, 0x0025ee12}}, Y: Field{[10]uint32{0x01162435, 0x01bd254b, 0x03bf48b8, 0x00c361b6, 0x025eac7f, 0x02a4ad2d, 0x0093d73c, 0x01ece84d, 0x00afbe8e, 0x00125f6d}}}, + {X: Field{[10]uint32{0x006312b3, 0x01d34665, 0x0169a1c2, 0x0208f321, 0x03a9de5f, 0x006d6d5e, 0x0278e965, 0x00d999d7, 0x00d9203e, 0x000b3ae8}}, Y: Field{[10]uint32{0x02d2b437, 0x029d70e3, 0x0040a488, 0x02db1aad, 0x00b7805d, 0x035df062, 0x030a88a6, 0x033f7907, 0x0286f042, 0x003530bf}}}, + {X: Field{[10]uint32{0x032b7009, 0x02e1a88f, 0x01e10e91, 0x032f1a90, 0x00912391, 0x0120da66, 0x0257b78b, 0x02b28a2f, 0x01306cdd, 0x002ae2c6}}, Y: Field{[10]uint32{0x034172cf, 0x00a1940d, 0x02a03351, 0x0144da24, 0x027abed6, 0x02992081, 0x00472a17, 0x0286ba76, 0x03dc79fb, 0x003f6eea}}}, + {X: Field{[10]uint32{0x0215b394, 0x0034c146, 0x01acd6bb, 0x01742a8b, 0x03c14970, 0x024e3c9a, 0x02ac2b59, 0x0102c55f, 0x00291ff1, 0x00009d8c}}, Y: Field{[10]uint32{0x01374ee6, 0x01412b12, 0x01875a91, 0x01e61bb3, 0x00553594, 0x014bd728, 0x0240838c, 0x02e78bd1, 0x032a38dc, 0x0030adac}}}, + {X: Field{[10]uint32{0x02fc78c5, 0x01e7ad72, 0x02d8e6cc, 0x03423197, 0x009e703f, 0x03a77449, 0x011d7933, 0x014531fe, 0x01bd1cc1, 0x0008b47b}}, Y: Field{[10]uint32{0x00a85efe, 0x01959e30, 0x03f7a05e, 0x03048de3, 0x02a93942, 0x00228e05, 0x0024fca2, 0x039d044c, 0x03eea53a, 0x001d14f9}}}, + {X: Field{[10]uint32{0x00ffe222, 0x01f26f6b, 0x01b7cc8e, 0x009d7b3b, 0x00b61465, 0x02f6cfee, 0x00fa5590, 0x027a509c, 0x01c0c572, 0x001c361a}}, Y: Field{[10]uint32{0x02ec30c5, 0x0372ee3d, 0x01657115, 0x01d2704c, 0x00f8d414, 0x0230b0ea, 0x03baec84, 0x023ed185, 0x01328ce7, 0x0012ff2b}}}, + {X: Field{[10]uint32{0x011b1647, 0x0093ae1e, 0x0097dd4a, 0x0301aedf, 0x00ed9039, 0x02a5ef4a, 0x0360dccd, 0x015e0993, 0x01deda8d, 0x002896d1}}, Y: Field{[10]uint32{0x0243db8f, 0x031a362a, 0x00c7dfe1, 0x0078bc0c, 0x00f306f1, 0x0310e999, 0x03765554, 0x036558c8, 0x0183fd2a, 0x0023f612}}}, + {X: Field{[10]uint32{0x031024b8, 0x02a29d0e, 0x025cf39c, 0x0052e5d6, 0x033e77fa, 0x01cdc19b, 0x02383366, 0x01f0356a, 0x016c9b23, 0x00208ff3}}, Y: Field{[10]uint32{0x0024dde0, 0x03c5ad51, 0x01d72198, 0x012f4719, 0x01d1433e, 0x02db50d1, 0x01c2ba3b, 0x03cb77a6, 0x004d29a4, 0x0039a469}}}, + {X: Field{[10]uint32{0x02158d0c, 0x01b13396, 0x0033a3a9, 0x0349bb49, 0x01ee594b, 0x00e534c1, 0x02b1247d, 0x02bbd90c, 0x02638244, 0x0000e696}}, Y: Field{[10]uint32{0x026a8023, 0x03e2c9d8, 0x016cd32d, 0x010d4315, 0x00ee4b9f, 0x00932c42, 0x03ff37ea, 0x02125355, 0x0139dd8b, 0x00051f3b}}}, + {X: Field{[10]uint32{0x03206487, 0x012a95ac, 0x035f8de9, 0x02ed21e7, 0x022a18f6, 0x006c9de5, 0x00aaf7b8, 0x02cb701d, 0x03b5b85b, 0x0023e7fa}}, Y: Field{[10]uint32{0x0210c2a2, 0x021ab2fd, 0x0093c32a, 0x03caada8, 0x01dc7474, 0x00ad5ecf, 0x037dbdec, 0x01680038, 0x03d6d417, 0x001236ba}}}, + {X: Field{[10]uint32{0x0143f60c, 0x01e80f64, 0x013f804f, 0x014cdba7, 0x016a08db, 0x03dad38d, 0x009158a5, 0x00215914, 0x03142f50, 0x003f05be}}, Y: Field{[10]uint32{0x001f7a36, 0x033e0137, 0x02eaf58b, 0x0139acca, 0x03402758, 0x036e17f9, 0x034ada59, 0x02dce843, 0x02f27e02, 0x0023a4c9}}}, + {X: Field{[10]uint32{0x01c5a281, 0x024921a1, 0x01d788e2, 0x0007d080, 0x03eaecae, 0x021faea0, 0x015d8f09, 0x01bdba44, 0x02a71744, 0x001f6c27}}, Y: Field{[10]uint32{0x0215742b, 0x00f8c9f0, 0x03864273, 0x019f169b, 0x0279fd21, 0x004bf45f, 0x036b2adc, 0x011577dc, 0x00ee426d, 0x002d11a7}}}, + {X: Field{[10]uint32{0x00d9a57e, 0x03ef2529, 0x030b8564, 0x03d71fb2, 0x023df7ca, 0x007e34f1, 0x0256fdab, 0x03bc70fa, 0x03f528ba, 0x00351746}}, Y: Field{[10]uint32{0x02aeccc1, 0x005cb845, 0x02191c1a, 0x0344f016, 0x00ad0c84, 0x006b5c00, 0x0121d3d8, 0x003a2473, 0x01846483, 0x0024789a}}}, + {X: Field{[10]uint32{0x01f03901, 0x0286a45d, 0x0278ad43, 0x0266ba5d, 0x016a4d9c, 0x01e89aec, 0x00a9ffaa, 0x02176154, 0x03751b6f, 0x000febc2}}, Y: Field{[10]uint32{0x0044328f, 0x01710d86, 0x01368b55, 0x0050ee36, 0x00be775d, 0x00e18c47, 0x02aa39f6, 0x00f3d972, 0x022aa4e4, 0x00229741}}}, + {X: Field{[10]uint32{0x02efd121, 0x01ac1b1d, 0x03107492, 0x028cec49, 0x001eefdb, 0x019787b0, 0x00c5e39c, 0x0291c9e7, 0x00be8e08, 0x00151823}}, Y: Field{[10]uint32{0x0140f038, 0x02278831, 0x01afdcb7, 0x01d9c741, 0x039bdc27, 0x03263f0a, 0x02c5f91c, 0x03e07923, 0x01bc40de, 0x00029da5}}}, + {X: Field{[10]uint32{0x009823ec, 0x03560364, 0x02d4664d, 0x03693865, 0x02e8a201, 0x00ed5a5c, 0x00e69552, 0x03f350d9, 0x0189050d, 0x00156683}}, Y: Field{[10]uint32{0x00dc71c3, 0x03a014ba, 0x027b4c46, 0x00ac1a9a, 0x035641e3, 0x021fd654, 0x01b8d5c0, 0x022e433b, 0x01add652, 0x001efe38}}}, + {X: Field{[10]uint32{0x00f467a8, 0x025ae52b, 0x039c31a9, 0x02a42c19, 0x00bb305e, 0x00797f0a, 0x0248c344, 0x02e7cac5, 0x0058b5e2, 0x00059ba2}}, Y: Field{[10]uint32{0x02e5bdb2, 0x008168e4, 0x01d2af64, 0x00df7432, 0x00dc1b7c, 0x0023e665, 0x018a6b91, 0x03ed0ab3, 0x006dff82, 0x002726cc}}}, + {X: Field{[10]uint32{0x00fe1941, 0x0369ce0e, 0x025a8d41, 0x025317bf, 0x02e5284f, 0x02b90e3b, 0x00ec5fc3, 0x020eeaa5, 0x028ce66e, 0x001038a7}}, Y: Field{[10]uint32{0x01acb2dc, 0x0062134e, 0x009c3955, 0x013ec39c, 0x0384ae68, 0x00e88f42, 0x03154e27, 0x01e1a073, 0x031cc01e, 0x001f1c7d}}}, + {X: Field{[10]uint32{0x02d4ee7e, 0x0110e01c, 0x004081a8, 0x00f6fd9d, 0x006aeb8b, 0x01986d00, 0x007fc764, 0x027399fe, 0x00f9eb65, 0x001a0a72}}, Y: Field{[10]uint32{0x0222913b, 0x001a5172, 0x01908ea5, 0x02ccc13f, 0x036647fc, 0x03a7fcc2, 0x02825225, 0x03701553, 0x030a8332, 0x00074d54}}}, + {X: Field{[10]uint32{0x03658196, 0x00d75044, 0x00e7adbb, 0x01010b44, 0x03e25a25, 0x038abc8d, 0x0393b136, 0x027f4e4c, 0x005a322e, 0x00128ff8}}, Y: Field{[10]uint32{0x0101574c, 0x01c0631e, 0x02ea1f14, 0x0115fb7a, 0x0178dbdc, 0x03c2ac5d, 0x03c40d9e, 0x01d906a4, 0x01f8d452, 0x00216690}}}, + {X: Field{[10]uint32{0x02a44f94, 0x01784066, 0x0338225a, 0x030805df, 0x029e9dde, 0x01919f30, 0x0167ad5a, 0x03acbb05, 0x03c9a675, 0x00379605}}, Y: Field{[10]uint32{0x00f723a4, 0x01959eb3, 0x00af5ec3, 0x005d323f, 0x0271b45e, 0x0352fc40, 0x017e6256, 0x00c4737c, 0x03d05413, 0x0010143a}}}, + {X: Field{[10]uint32{0x0262a108, 0x03697ad5, 0x03e7a155, 0x02cc6d47, 0x00daa7b9, 0x03cf63ce, 0x03df1a26, 0x03d0442a, 0x02454f07, 0x003f78a4}}, Y: Field{[10]uint32{0x0327808a, 0x037f722d, 0x0371ed98, 0x015b901c, 0x03f09d17, 0x031b1c67, 0x03347a3a, 0x03a4a733, 0x02d37b39, 0x003ca939}}}, + {X: Field{[10]uint32{0x03f42436, 0x02a43b7b, 0x022e8a43, 0x00574230, 0x01b09174, 0x029dca18, 0x03c536d6, 0x022e85db, 0x00fb6eb9, 0x003ca34f}}, Y: Field{[10]uint32{0x0279d1bf, 0x0009cd44, 0x00b61e9d, 0x02310b9b, 0x001971fe, 0x022252a9, 0x003dc82d, 0x00943781, 0x022bb328, 0x0011422f}}}, + {X: Field{[10]uint32{0x0316e3ee, 0x01ee545f, 0x038c7011, 0x0259083d, 0x037bb654, 0x00669b7d, 0x0192afb1, 0x02d6df42, 0x00304d1c, 0x0031d957}}, Y: Field{[10]uint32{0x031dfdfd, 0x009f8b79, 0x0070d2e4, 0x02f946e4, 0x01a348b0, 0x00379e70, 0x0186b1cb, 0x00c3712e, 0x02c2cdb7, 0x00226058}}}, + {X: Field{[10]uint32{0x03b4b147, 0x00fb2801, 0x00d0d7ae, 0x01d3c856, 0x0053ffba, 0x02d8bd36, 0x0167936e, 0x03b999c7, 0x03c72fa3, 0x00395f65}}, Y: Field{[10]uint32{0x01fecd64, 0x031c83f8, 0x00958c07, 0x01811f0d, 0x031ed426, 0x019a3284, 0x02b80b9a, 0x00a5d646, 0x012ca3d9, 0x002c78c0}}}, + {X: Field{[10]uint32{0x022b0c01, 0x037e3078, 0x02a44bcc, 0x01edd9a1, 0x036cd3d3, 0x03805332, 0x0244f92f, 0x0096ff01, 0x02421550, 0x003ab6a1}}, Y: Field{[10]uint32{0x01dfeeed, 0x03b5f482, 0x03e9106a, 0x02b2bde7, 0x0107152a, 0x0103e0a9, 0x03c37c55, 0x006ec045, 0x017d71d7, 0x002240d7}}}, + {X: Field{[10]uint32{0x020d0e25, 0x01fb2139, 0x03e27556, 0x03e5dd40, 0x0362dbf8, 0x0047e8ff, 0x01d7e8e0, 0x0086627e, 0x027e3f17, 0x000f9d89}}, Y: Field{[10]uint32{0x021160b6, 0x02288d9b, 0x0087182d, 0x031f8bf8, 0x02416f8b, 0x01f8e5ce, 0x013001ec, 0x031b6e91, 0x03909631, 0x002860d5}}}, + {X: Field{[10]uint32{0x01a3df70, 0x00b49424, 0x0350c697, 0x00d46399, 0x0205de72, 0x0359af9f, 0x0279e692, 0x00bcd408, 0x03d89c26, 0x00284765}}, Y: Field{[10]uint32{0x012a69dd, 0x0071b6f5, 0x00b71fd3, 0x01dfa522, 0x0144768d, 0x02e22459, 0x02e48fea, 0x02c05b7c, 0x00a3dd6f, 0x0034637e}}}, + {X: Field{[10]uint32{0x01f20651, 0x03d0887d, 0x01787922, 0x0023f563, 0x01a5ab52, 0x02b9f30a, 0x0154bf8d, 0x0301bbb7, 0x0375cefe, 0x002c5b8f}}, Y: Field{[10]uint32{0x02d0eb2d, 0x021d86a9, 0x0381da75, 0x024314e6, 0x010233ae, 0x01a42624, 0x03c19891, 0x00cbb5d3, 0x02b45a6e, 0x0015feff}}}, + {X: Field{[10]uint32{0x034628b2, 0x0095e131, 0x03d9fbeb, 0x02cd128c, 0x00837339, 0x02bc51e9, 0x03564c2f, 0x03a9ba7a, 0x000a3f73, 0x000df7a0}}, Y: Field{[10]uint32{0x02254050, 0x007b04f9, 0x020a02f4, 0x01b3e8ab, 0x03e33fc9, 0x0165aab5, 0x016b7e53, 0x01600c06, 0x02599da5, 0x00164ce4}}}, + {X: Field{[10]uint32{0x03d68055, 0x03b10e32, 0x021f19be, 0x02c24c96, 0x024ae57f, 0x02db9aea, 0x00b781d8, 0x02aebdbf, 0x012d65b3, 0x001bda10}}, Y: Field{[10]uint32{0x038d3bcc, 0x00c550cb, 0x02f08ec0, 0x00cfbd26, 0x0127dc14, 0x0086aed7, 0x03310420, 0x01c6f002, 0x019d4061, 0x002213f5}}}, + {X: Field{[10]uint32{0x036e4366, 0x0240b5b2, 0x00a79572, 0x026bd82f, 0x03980f1f, 0x014bc1c3, 0x00f0ce2b, 0x03898493, 0x029e6bc5, 0x002451e6}}, Y: Field{[10]uint32{0x002f5288, 0x00d746a7, 0x0364aef9, 0x0090044b, 0x03479325, 0x02c4ef89, 0x036025d4, 0x0110d667, 0x030a22de, 0x0008c13d}}}, + {X: Field{[10]uint32{0x0119bd8a, 0x02306513, 0x03701835, 0x031d29b1, 0x014cceab, 0x005df732, 0x01e7c1e4, 0x021c2230, 0x00df36ac, 0x0022e9ac}}, Y: Field{[10]uint32{0x02ab9ed4, 0x01fe1658, 0x005baad1, 0x006de26a, 0x01989dff, 0x01deb1d5, 0x02abe8a1, 0x00578a48, 0x020ee9d5, 0x003a5adc}}}, + {X: Field{[10]uint32{0x01d567cc, 0x02b2deca, 0x02c9ef4a, 0x01a55393, 0x00f11b8a, 0x00d5453c, 0x0359a8ca, 0x00ff3163, 0x0195871f, 0x002ac548}}, Y: Field{[10]uint32{0x03267fb4, 0x03a80dc3, 0x0019c3c8, 0x0329946d, 0x01965ec1, 0x017e23fc, 0x0099ad17, 0x02f6850a, 0x0148623e, 0x0030776b}}}, + {X: Field{[10]uint32{0x011600c5, 0x00b39f55, 0x00756e55, 0x011b5357, 0x026ca45c, 0x0066b708, 0x00e6448e, 0x00af4070, 0x03485eb9, 0x001fac8f}}, Y: Field{[10]uint32{0x03c57ac5, 0x0309ec69, 0x03328b3d, 0x025ea161, 0x01a300ef, 0x00f8c315, 0x033de076, 0x02e4e41e, 0x03124278, 0x00254fa6}}}, + {X: Field{[10]uint32{0x0221ee17, 0x00924153, 0x01f0a2f6, 0x02dc3bac, 0x01e0212f, 0x01624124, 0x0120a922, 0x01c0371d, 0x002ba4b2, 0x002c8fd3}}, Y: Field{[10]uint32{0x03598530, 0x02b83762, 0x03811457, 0x01f98d27, 0x028a2c28, 0x0040e1b0, 0x007d5a5c, 0x02cebcb3, 0x03729e95, 0x0028e2d9}}}, + {X: Field{[10]uint32{0x0369c2a4, 0x002addc9, 0x024a90a1, 0x00badd50, 0x0067a6c1, 0x01b3eb59, 0x001a02b9, 0x0156da8b, 0x0323387e, 0x002174b9}}, Y: Field{[10]uint32{0x00e4d303, 0x01145432, 0x031d0db8, 0x033c8684, 0x00ded380, 0x0352050d, 0x03077fb7, 0x0262bc06, 0x01ac2238, 0x001c9eaf}}}, + {X: Field{[10]uint32{0x0309273d, 0x02369b26, 0x014be9fd, 0x0006229e, 0x0254ae69, 0x019a7d9a, 0x0383d59e, 0x02933104, 0x015e08db, 0x0009f05c}}, Y: Field{[10]uint32{0x01b1a266, 0x0357352d, 0x03f9d998, 0x03173cae, 0x03e16e22, 0x039fcc3c, 0x017d8841, 0x01b288d4, 0x0254306e, 0x0009d9f2}}}, + {X: Field{[10]uint32{0x015eed89, 0x0173e2c2, 0x0350f446, 0x01090200, 0x0342cf40, 0x03e169aa, 0x00c4fb56, 0x017a3a78, 0x00d37f9a, 0x0039c2e3}}, Y: Field{[10]uint32{0x030cb31a, 0x012c3f9a, 0x014fe5ec, 0x0018c661, 0x01faacdf, 0x01d4232b, 0x034e93c0, 0x02346e5c, 0x00589478, 0x000b8f63}}}, + {X: Field{[10]uint32{0x01e956b9, 0x00804f37, 0x0365ee2c, 0x0187439f, 0x0293932c, 0x00fc1dab, 0x0081a39f, 0x020e5a63, 0x00552405, 0x00388f75}}, Y: Field{[10]uint32{0x00cf77c9, 0x036da2de, 0x0315b1dc, 0x01e72d4c, 0x0052b57e, 0x022a82d9, 0x01cef85a, 0x022ae2fd, 0x03d000cd, 0x001b14f2}}}, + {X: Field{[10]uint32{0x01919c9f, 0x001ce653, 0x003b7d7a, 0x00c8431a, 0x039aaf08, 0x01d9df2e, 0x0209f2c4, 0x02604c46, 0x0381ccc4, 0x0017a48f}}, Y: Field{[10]uint32{0x00306873, 0x02e5fd0e, 0x019f7738, 0x01f3ed45, 0x02705966, 0x03dc153f, 0x00e64a8a, 0x02b41bf8, 0x0112e64c, 0x0018135c}}}, + {X: Field{[10]uint32{0x00142507, 0x00deaddc, 0x006a5600, 0x010d8cca, 0x031380e5, 0x004ff79a, 0x02b71d71, 0x0289e380, 0x02531a9f, 0x0008f67c}}, Y: Field{[10]uint32{0x0244a9ac, 0x00cdcaff, 0x0256442d, 0x00053da5, 0x030a9fd2, 0x02d3a178, 0x02f49f6b, 0x0184669b, 0x0247b6eb, 0x00157720}}}, + {X: Field{[10]uint32{0x033b8f24, 0x03d76275, 0x0318a050, 0x03bc4b1c, 0x02886c79, 0x03bdb494, 0x01bb2815, 0x0147bc57, 0x0095ad25, 0x003bac8c}}, Y: Field{[10]uint32{0x01ba1ddb, 0x026166c4, 0x00eac67d, 0x020a74e1, 0x0056a80f, 0x039f3ee4, 0x00c38963, 0x0033a3ac, 0x0394b981, 0x003469c6}}}, + {X: Field{[10]uint32{0x00b7c21b, 0x009a0ad5, 0x023c0e7a, 0x00db9087, 0x03899a84, 0x03bfbaa6, 0x03eee536, 0x03df8952, 0x027b57bd, 0x001929b7}}, Y: Field{[10]uint32{0x03b4755b, 0x00325bc9, 0x01537cf4, 0x02438fc3, 0x03181ad1, 0x0240bf1b, 0x0002e2d2, 0x013f2831, 0x036e2e34, 0x001909e4}}}, + {X: Field{[10]uint32{0x00270073, 0x03c0b0b3, 0x0046d779, 0x0114f3b2, 0x008207fd, 0x0079c02e, 0x01aad5e5, 0x02bcfc70, 0x02ced76d, 0x0027919d}}, Y: Field{[10]uint32{0x03dc9e42, 0x01d3d2f2, 0x00c38d9d, 0x0333ad16, 0x036ffc4a, 0x0362a112, 0x02550195, 0x0042b411, 0x03811d76, 0x0015a171}}}, + {X: Field{[10]uint32{0x01645473, 0x012cd663, 0x003e5d13, 0x00d5bb21, 0x031d83c6, 0x0110a31e, 0x020ee231, 0x01ae85db, 0x02288061, 0x00257b84}}, Y: Field{[10]uint32{0x03bf4054, 0x00b8a7a8, 0x023a37d1, 0x004c31bb, 0x0149a60d, 0x02c9531c, 0x00812789, 0x01301d60, 0x00644191, 0x001ef8d3}}}, + {X: Field{[10]uint32{0x006516ad, 0x039300ff, 0x00da994f, 0x02683166, 0x03d0b108, 0x0114f2f7, 0x01df5066, 0x02068be4, 0x02efd920, 0x00394fff}}, Y: Field{[10]uint32{0x00c59c2f, 0x00762479, 0x01929ecc, 0x019eb01c, 0x035dcd1b, 0x00591863, 0x0270b285, 0x00340a8b, 0x02c14a60, 0x001583c0}}}, + {X: Field{[10]uint32{0x022a7b68, 0x0330fa81, 0x03a83faf, 0x00418ebe, 0x0090d4eb, 0x028f665d, 0x014f1adf, 0x01223168, 0x03447c75, 0x00270cc9}}, Y: Field{[10]uint32{0x01791c63, 0x026dbb86, 0x02b8ad68, 0x023d5643, 0x00cacfb7, 0x01343315, 0x00ff7d22, 0x03f0ed34, 0x01fb09a7, 0x002731d6}}}, + {X: Field{[10]uint32{0x033d3c45, 0x00e50c25, 0x0058e4ea, 0x01fa078f, 0x02f1d103, 0x022dd050, 0x02b22b0c, 0x0057fddf, 0x01002f43, 0x003a09b5}}, Y: Field{[10]uint32{0x008b65de, 0x0346666f, 0x010455d8, 0x0380ab9d, 0x00e8ab16, 0x031f54e9, 0x039316df, 0x01c7d0ea, 0x025882f9, 0x000e919b}}}, + {X: Field{[10]uint32{0x015e13c7, 0x01ece204, 0x03512d38, 0x01ecff59, 0x00dd38a8, 0x03a6c5af, 0x00f196c6, 0x02d71237, 0x030eaf93, 0x0033b537}}, Y: Field{[10]uint32{0x028b74cc, 0x0118b1b5, 0x0197e910, 0x01c73b75, 0x018c7542, 0x02734478, 0x032c9309, 0x02772ad3, 0x023bdd14, 0x003f8229}}}, + {X: Field{[10]uint32{0x037eb33d, 0x031505b6, 0x00b27ee8, 0x01b78086, 0x038065e3, 0x03ce3d53, 0x0220182d, 0x01437cac, 0x012788ea, 0x002c15bb}}, Y: Field{[10]uint32{0x02cf6409, 0x02a0f6f6, 0x00a6b0a1, 0x027ff0c0, 0x018d514d, 0x023a687a, 0x0243aa82, 0x015fe7af, 0x0375cef4, 0x0025cce0}}}, + {X: Field{[10]uint32{0x037830df, 0x03b8a216, 0x011561c9, 0x03010187, 0x03eba030, 0x00d07da8, 0x0260b667, 0x03e529ff, 0x007402fe, 0x0000d77b}}, Y: Field{[10]uint32{0x009b933e, 0x007c161e, 0x0045caba, 0x01b9363c, 0x013eb8be, 0x02dba488, 0x0302fe6e, 0x0043f79f, 0x012139c8, 0x00009664}}}, + {X: Field{[10]uint32{0x024e020b, 0x02b77ecc, 0x02f1f081, 0x025cdf16, 0x03d7981e, 0x010abd13, 0x0215cb99, 0x0084ff4b, 0x00c87733, 0x0000fc8f}}, Y: Field{[10]uint32{0x016e8f83, 0x03f0145d, 0x0065ac8a, 0x0184ed7e, 0x007ffc0c, 0x0337b040, 0x0392455d, 0x03378d38, 0x00c0d43c, 0x00093a33}}}, + {X: Field{[10]uint32{0x03babbdb, 0x014dfbca, 0x01bc1e06, 0x03322f3a, 0x03c8471d, 0x02e8361b, 0x02cfa43d, 0x0173ab5f, 0x0076c080, 0x0026ea5b}}, Y: Field{[10]uint32{0x0143def3, 0x00ef0dfe, 0x023ae0e9, 0x008181fb, 0x01622d98, 0x03d3c1ec, 0x02f8e3a8, 0x038136f8, 0x00331c2a, 0x003068f1}}}, + {X: Field{[10]uint32{0x016a3815, 0x0221f5f4, 0x02ac5c2e, 0x01058438, 0x021d414f, 0x037b3273, 0x01103965, 0x014e5635, 0x039a3147, 0x0020f051}}, Y: Field{[10]uint32{0x009b5b7a, 0x0215d00a, 0x0292c7f0, 0x01c341f0, 0x02c123d4, 0x027ffeee, 0x0339bbff, 0x03351b97, 0x00181354, 0x00213534}}}, + {X: Field{[10]uint32{0x03e0a32d, 0x017af1fb, 0x01ab1fcb, 0x0035ecd2, 0x00a8d701, 0x00a15f6e, 0x026714a0, 0x007621db, 0x027a2db1, 0x002eb3d8}}, Y: Field{[10]uint32{0x00c83129, 0x02b8c0fa, 0x02f5ed57, 0x021aeadf, 0x0214b3e5, 0x01ab3882, 0x03777b73, 0x011239a2, 0x000da44c, 0x0028a1f7}}}, + {X: Field{[10]uint32{0x0376ebd7, 0x03173fc9, 0x024d4619, 0x03475934, 0x034ca888, 0x00051c59, 0x03fd2d3a, 0x027de442, 0x00553012, 0x001cc18f}}, Y: Field{[10]uint32{0x00159489, 0x0312ec8b, 0x004ea368, 0x01b34a16, 0x019d7190, 0x005261b1, 0x02b0362b, 0x03e320be, 0x01d944cc, 0x00355e50}}}, + {X: Field{[10]uint32{0x035d6637, 0x022802ce, 0x020114d0, 0x004b5116, 0x02a3f51a, 0x0376d00f, 0x03a4ce34, 0x02b4544a, 0x0232df55, 0x00013ba1}}, Y: Field{[10]uint32{0x02b14820, 0x039b1164, 0x03d8188a, 0x0006585b, 0x01916879, 0x025c8f46, 0x03f01a31, 0x009d68e7, 0x0199dc30, 0x0030a7dc}}}, + {X: Field{[10]uint32{0x03e7ef28, 0x00abf9f5, 0x0386ccd4, 0x03bed59d, 0x028f5345, 0x008fbeb2, 0x0318a16a, 0x03507e62, 0x026d68bb, 0x003f11b9}}, Y: Field{[10]uint32{0x0243c18a, 0x0009c569, 0x029d50d7, 0x00c7b23d, 0x01a02382, 0x02930a2e, 0x01af38a4, 0x0212754f, 0x02dfabf8, 0x0022d0a8}}}, + {X: Field{[10]uint32{0x03a7dc13, 0x0379862c, 0x039638a9, 0x0262bbf1, 0x013f9b6b, 0x028e41ec, 0x02ece5e2, 0x01e5e01f, 0x01b0158d, 0x0029c6b4}}, Y: Field{[10]uint32{0x0308bf90, 0x0179a87b, 0x026ea437, 0x0113a029, 0x02ccfc5c, 0x006e6df4, 0x038a8644, 0x03119394, 0x006da956, 0x001bf5fa}}}, + {X: Field{[10]uint32{0x01860a3a, 0x00ddda3c, 0x0028d0ed, 0x014f5476, 0x0161a7c5, 0x0031abd6, 0x03b99576, 0x0299ff5e, 0x01f36075, 0x00180861}}, Y: Field{[10]uint32{0x0110b2e7, 0x030caf53, 0x02802165, 0x0353754b, 0x0102265c, 0x01ea274e, 0x03a027ce, 0x020d7991, 0x02db706b, 0x002434c4}}}, + {X: Field{[10]uint32{0x007a77ca, 0x01edf7d8, 0x006b598e, 0x01fe50dc, 0x0336b443, 0x01f718b0, 0x019976d3, 0x024646e7, 0x02837672, 0x0036c3f2}}, Y: Field{[10]uint32{0x02efc29d, 0x01210760, 0x03dd9c4f, 0x01a26541, 0x0278699a, 0x028600be, 0x009f0b32, 0x01faff83, 0x016e8eba, 0x0008f7b7}}}, + {X: Field{[10]uint32{0x00a54939, 0x023c95e9, 0x01884761, 0x03b00ce7, 0x02237d0a, 0x03fe37a0, 0x0159909f, 0x013c24a8, 0x0061598d, 0x001a466e}}, Y: Field{[10]uint32{0x0334b90c, 0x0072f6db, 0x03ff2f3e, 0x0050e4b0, 0x0127a1a2, 0x02693864, 0x01c07845, 0x00ea8ee1, 0x02fe1fa5, 0x002ae7e0}}}, + {X: Field{[10]uint32{0x0074bd59, 0x03becba0, 0x01e39299, 0x0063df8e, 0x02877ec1, 0x0354e803, 0x00f0a5d5, 0x006e9f0f, 0x02e9f1f5, 0x003d29f4}}, Y: Field{[10]uint32{0x005bd257, 0x01f8640b, 0x01be0ef1, 0x027665d0, 0x030c9bea, 0x02f39e60, 0x00e6380c, 0x02b38b69, 0x01006aa6, 0x0027c142}}}, + {X: Field{[10]uint32{0x01453da3, 0x02cb8d73, 0x03656366, 0x01f95065, 0x02392731, 0x03ffef65, 0x011ae232, 0x03784c42, 0x0210d4f1, 0x0022975c}}, Y: Field{[10]uint32{0x00580a54, 0x0345912c, 0x02a98abc, 0x001394ca, 0x034cae10, 0x024c1ab6, 0x0158a05a, 0x03683a99, 0x021b5b71, 0x0026bfe2}}}, + {X: Field{[10]uint32{0x00e86f16, 0x020063ae, 0x039f3f93, 0x0308abf5, 0x022c9195, 0x02812e1e, 0x020406be, 0x01c566c2, 0x03dce40d, 0x00267ac8}}, Y: Field{[10]uint32{0x00ecff66, 0x011f5059, 0x01b3782b, 0x037a7a03, 0x03b1f17f, 0x01e7f2af, 0x036cddaa, 0x03f7b1ff, 0x0138a66e, 0x000bbc86}}}, + {X: Field{[10]uint32{0x00d37472, 0x02e996ad, 0x02904a99, 0x0391eb2f, 0x01611ad0, 0x02aef9e0, 0x03f0d0b9, 0x011062b1, 0x02841a87, 0x000efc5b}}, Y: Field{[10]uint32{0x03e714ad, 0x00d44868, 0x003551fb, 0x02ca2bbd, 0x007d1138, 0x009dd0df, 0x008c0f19, 0x0232cbf2, 0x01f4e194, 0x00074f2e}}}, + {X: Field{[10]uint32{0x03f01f3e, 0x027f93f9, 0x0095af45, 0x03395126, 0x02561811, 0x018e22a1, 0x007c1333, 0x00e5382e, 0x03ff19eb, 0x0028fbe0}}, Y: Field{[10]uint32{0x0178cbab, 0x0344e920, 0x024a1045, 0x03374cd6, 0x019d687c, 0x00474238, 0x007ddb47, 0x02b32f37, 0x01398bdc, 0x00065577}}}, + {X: Field{[10]uint32{0x00b1af90, 0x03bc5f9c, 0x02552063, 0x0047d6b7, 0x005a344d, 0x008f75ad, 0x01c024c2, 0x013a04fb, 0x0351da9b, 0x0009a05b}}, Y: Field{[10]uint32{0x014aabd6, 0x001e980a, 0x03d30220, 0x01feef33, 0x0365611b, 0x01813a25, 0x02809676, 0x019e8d5c, 0x021d1d6b, 0x001189e3}}}, + {X: Field{[10]uint32{0x03dea823, 0x03a1112b, 0x0125a909, 0x0325239d, 0x031d47dc, 0x01e502c3, 0x03b14f69, 0x03c523b2, 0x03c0d640, 0x00178594}}, Y: Field{[10]uint32{0x00b092c7, 0x017333d3, 0x01c86cd4, 0x0325bfbb, 0x008e499c, 0x00af714a, 0x03aef229, 0x020d43b3, 0x01ede7cb, 0x0026e2e0}}}, + {X: Field{[10]uint32{0x0028de9e, 0x03a76f7a, 0x008f247f, 0x01beb770, 0x02b7725d, 0x0096c4ad, 0x0348c231, 0x00da5158, 0x02450b0d, 0x0006f623}}, Y: Field{[10]uint32{0x00a95db0, 0x036e8bee, 0x00fe2098, 0x01a1a602, 0x009f6faf, 0x00750059, 0x03dae7ca, 0x0377695d, 0x01e32d8b, 0x00060a4e}}}, + {X: Field{[10]uint32{0x01b73c02, 0x004b17f6, 0x01fbd31b, 0x005b5080, 0x02b80ab7, 0x03aede00, 0x01e754fb, 0x013900c5, 0x02063adc, 0x0012c0ff}}, Y: Field{[10]uint32{0x0080fb06, 0x0233d507, 0x0030e73e, 0x00c7a929, 0x03a5623c, 0x000fe638, 0x00ed537e, 0x03946403, 0x00a8e2c5, 0x002a1934}}}, + {X: Field{[10]uint32{0x01d35f61, 0x013c7a11, 0x0268c588, 0x003f4217, 0x01214686, 0x0311bced, 0x01927f13, 0x023ccc7b, 0x01150781, 0x00038829}}, Y: Field{[10]uint32{0x02bcf328, 0x021d79a5, 0x00db0484, 0x02828f48, 0x02a924e9, 0x03f523d9, 0x02466c43, 0x035b1627, 0x00021a79, 0x00287048}}}, + {X: Field{[10]uint32{0x001e37be, 0x024971fe, 0x03a732db, 0x0287200a, 0x034aaece, 0x0221787a, 0x0224d874, 0x0387362f, 0x024e74a1, 0x0038f446}}, Y: Field{[10]uint32{0x021645f5, 0x00a8eda1, 0x03c7f73d, 0x0271ed12, 0x03022b0a, 0x0220c752, 0x0006787b, 0x03c07d8e, 0x001e0a1e, 0x0023c7b0}}}, + {X: Field{[10]uint32{0x0237f6e5, 0x00a8204f, 0x00617d1e, 0x00c83d00, 0x03da71fa, 0x01ca6c58, 0x0292b584, 0x0036fba3, 0x021557fe, 0x002288cc}}, Y: Field{[10]uint32{0x02cce950, 0x022415ab, 0x01f5e938, 0x00a5870d, 0x03267dbd, 0x035de632, 0x021ed74b, 0x01d416ba, 0x031abb8c, 0x002bd791}}}, + {X: Field{[10]uint32{0x0051d20d, 0x0269db5a, 0x01cbe99f, 0x03ea65a1, 0x02997e8d, 0x01c05735, 0x01070e00, 0x011a0c54, 0x022cb43f, 0x000eef02}}, Y: Field{[10]uint32{0x00b4f97d, 0x038d46df, 0x00278bb0, 0x010e5bea, 0x01fd1408, 0x01820c44, 0x0168e88b, 0x013102e6, 0x038ea5f1, 0x0026877e}}}, + {X: Field{[10]uint32{0x011d1deb, 0x0384cf24, 0x01184811, 0x00e0e50c, 0x0165380f, 0x0101ed2e, 0x0059dac9, 0x020eafa3, 0x0381082d, 0x00230135}}, Y: Field{[10]uint32{0x000a3db4, 0x014982d3, 0x00eab4a6, 0x0261c663, 0x00c0a3e0, 0x0200e54d, 0x03213408, 0x008c5bf3, 0x0093fdb2, 0x00135d39}}}, + {X: Field{[10]uint32{0x02a0291f, 0x002935b5, 0x028c8577, 0x0057279f, 0x001ed9f9, 0x00b80d91, 0x00aa7c46, 0x00b37b7c, 0x010e7231, 0x00119f53}}, Y: Field{[10]uint32{0x00a1ce32, 0x0376875c, 0x001fc0d4, 0x010060ea, 0x02f117e2, 0x00475596, 0x00624ddf, 0x025528c3, 0x00a9d7c2, 0x0020f6d0}}}, + {X: Field{[10]uint32{0x01a3dc8c, 0x03d26311, 0x00195d55, 0x00b7866b, 0x02ce73ae, 0x01072f54, 0x00601869, 0x028406ac, 0x00cd8e55, 0x002d8bd8}}, Y: Field{[10]uint32{0x0314ef41, 0x0330c06c, 0x03cef428, 0x02e3efdb, 0x034a5108, 0x01633482, 0x030ed091, 0x00958bba, 0x00b07c6d, 0x00167692}}}, + {X: Field{[10]uint32{0x039e681f, 0x03746d72, 0x02183379, 0x03301924, 0x01166e88, 0x0151bbfa, 0x036d7f19, 0x03b9877c, 0x0210f98a, 0x001ad758}}, Y: Field{[10]uint32{0x018a0d76, 0x011b9bda, 0x028e77f2, 0x01eb11c8, 0x027c6de8, 0x00c01170, 0x008afca8, 0x0229adcb, 0x034859c8, 0x0036fec5}}}, + {X: Field{[10]uint32{0x02300c97, 0x03b34288, 0x00286049, 0x036d234f, 0x00548768, 0x01625df3, 0x012cc9ef, 0x0210ada3, 0x0104e8c7, 0x00221d13}}, Y: Field{[10]uint32{0x03b9c38c, 0x03d628a3, 0x01bc0393, 0x024e4421, 0x02149d29, 0x031f242d, 0x00b0e425, 0x03147968, 0x02a51ea3, 0x002115ce}}}, + {X: Field{[10]uint32{0x032e37c8, 0x02038cb0, 0x03d4bada, 0x0296f934, 0x00d0218b, 0x005ab64e, 0x03065712, 0x02b16066, 0x002440f2, 0x003f7cb2}}, Y: Field{[10]uint32{0x01538f74, 0x01b56a97, 0x028b5587, 0x0069d019, 0x01917203, 0x02180b7f, 0x00c6f205, 0x007fef92, 0x00b59e96, 0x0030aaf1}}}, + {X: Field{[10]uint32{0x03777559, 0x012255fb, 0x028a9366, 0x03826d33, 0x0115178c, 0x011d5501, 0x02273bd2, 0x0220ecc8, 0x03641f5a, 0x00134bf7}}, Y: Field{[10]uint32{0x02a41b11, 0x002ce152, 0x029fabed, 0x00070d12, 0x02b2837f, 0x02cc85eb, 0x021b89b9, 0x03cc7190, 0x0101210b, 0x0008ae87}}}, + {X: Field{[10]uint32{0x00ddc633, 0x0185648d, 0x022699c4, 0x0330abf2, 0x035a54dc, 0x017192a3, 0x02f3faea, 0x02ff7e06, 0x00a1e743, 0x003b1f2f}}, Y: Field{[10]uint32{0x02ab0917, 0x01e05b93, 0x02e295f5, 0x039263f3, 0x03dc5263, 0x01684041, 0x0128c05e, 0x028141ed, 0x01a9ea76, 0x0027c64f}}}, + {X: Field{[10]uint32{0x00b44fdf, 0x02aef011, 0x01943c7f, 0x037e74dc, 0x00da9cd6, 0x00f2e013, 0x001e7790, 0x0262e2e0, 0x01137719, 0x003fcbe8}}, Y: Field{[10]uint32{0x01f6093c, 0x011af2cb, 0x02c54237, 0x009008b2, 0x022aec68, 0x02335bc2, 0x01d966db, 0x01d9c31e, 0x03f21ac5, 0x00258849}}}, + {X: Field{[10]uint32{0x00a57580, 0x0179de82, 0x035ee647, 0x0324a7c5, 0x034fd418, 0x010db5ab, 0x02c21bec, 0x000b48d3, 0x006b2dfb, 0x001b46d0}}, Y: Field{[10]uint32{0x00e895eb, 0x03a88f6f, 0x02f07b2d, 0x0394e2e7, 0x02f157ef, 0x00f9ed80, 0x00693d6d, 0x0238be3c, 0x02689dba, 0x002e2515}}}, + {X: Field{[10]uint32{0x004d7963, 0x03bd4e59, 0x01df587b, 0x03ddd308, 0x020317bf, 0x00371ae5, 0x00767270, 0x00033919, 0x01fb449e, 0x0012aee7}}, Y: Field{[10]uint32{0x006e6407, 0x03162f7e, 0x018e49c2, 0x02a1d517, 0x004d6dbb, 0x026bc726, 0x01807868, 0x031a6cab, 0x02b7c016, 0x001821bc}}}, + {X: Field{[10]uint32{0x010fcee6, 0x036d8e99, 0x022361f8, 0x0293f43b, 0x022fb3be, 0x016128f2, 0x00b0b895, 0x010258dd, 0x01cc634a, 0x0036c314}}, Y: Field{[10]uint32{0x01b6e6a0, 0x03f8cf31, 0x02486367, 0x01fe160d, 0x015d2825, 0x01ec3993, 0x0116fd39, 0x02b8612f, 0x012baea1, 0x001fb02f}}}, + {X: Field{[10]uint32{0x03fdb287, 0x01348b0d, 0x00e74495, 0x020886aa, 0x006996a3, 0x011b79c1, 0x01e02ed6, 0x01246699, 0x01bcd066, 0x002b9bdb}}, Y: Field{[10]uint32{0x03f2f201, 0x03eda870, 0x03d1bb76, 0x03d7d7fb, 0x02c5bbb2, 0x027e440b, 0x01313791, 0x01d01046, 0x02aef8ae, 0x002af9c3}}}, + {X: Field{[10]uint32{0x035f6227, 0x034eb234, 0x01fda63d, 0x018beb14, 0x00f4079a, 0x01ff25dc, 0x00771a91, 0x007cc2f4, 0x0397cb32, 0x002ba8fa}}, Y: Field{[10]uint32{0x02bf39b6, 0x006b919a, 0x0352506f, 0x0285105a, 0x03878145, 0x00a1f7f7, 0x0133704a, 0x005717a4, 0x00163985, 0x002da94d}}}, + {X: Field{[10]uint32{0x012233be, 0x02f28721, 0x01ded051, 0x0018fa24, 0x0039355c, 0x01b04ebe, 0x037234ef, 0x01437a07, 0x00cf711d, 0x0024327e}}, Y: Field{[10]uint32{0x0021bff5, 0x0388720d, 0x0151ed7f, 0x00baa805, 0x0317d2c3, 0x004d61e0, 0x013d4528, 0x025927cb, 0x037818f1, 0x00023655}}}, + {X: Field{[10]uint32{0x02d976e0, 0x017b6321, 0x020e2149, 0x02ae4809, 0x02fd954a, 0x012d23bf, 0x028dcde3, 0x000d1154, 0x00e5ab1d, 0x0016b5fb}}, Y: Field{[10]uint32{0x038569b0, 0x0052c0fd, 0x003d8700, 0x0112c5e1, 0x0062ac94, 0x0311adb8, 0x03274e93, 0x018eaefb, 0x023b2c3c, 0x000b7c85}}}, + {X: Field{[10]uint32{0x03d28d9a, 0x0113a38e, 0x0031cb78, 0x01f5622a, 0x001d80ae, 0x00eac32b, 0x026d3ee1, 0x00bbc05b, 0x022c8e94, 0x002dae8b}}, Y: Field{[10]uint32{0x03ef7fb4, 0x01776dc6, 0x0101d085, 0x014f402d, 0x00a2ebf4, 0x03490458, 0x01b6b067, 0x037f7d40, 0x0235f923, 0x00104602}}}, + {X: Field{[10]uint32{0x03f5f37d, 0x01319d1f, 0x01cc413a, 0x02a71a02, 0x00799555, 0x03211627, 0x03dd450b, 0x01b1f7ea, 0x03c9bba2, 0x001f9026}}, Y: Field{[10]uint32{0x01c9e6b1, 0x00f7b9de, 0x0030ce42, 0x00d067f8, 0x036066b0, 0x020763f7, 0x01c42604, 0x02bf8b90, 0x01619cc5, 0x00031462}}}, + {X: Field{[10]uint32{0x024f602c, 0x02145bb7, 0x024e0300, 0x01aa942d, 0x022c7263, 0x031f1308, 0x01010606, 0x03cbb8a3, 0x011470b2, 0x002521b3}}, Y: Field{[10]uint32{0x02b467af, 0x03edd2f7, 0x012ceaac, 0x028d27d1, 0x02c062e9, 0x01cc8d9f, 0x0131785f, 0x0001bf7e, 0x038cfc5b, 0x00221b32}}}, + {X: Field{[10]uint32{0x01338d2a, 0x027b62c8, 0x0183b1af, 0x0271520b, 0x0294b1ee, 0x0116e817, 0x01af6d87, 0x01c81478, 0x017bc8b0, 0x0039f047}}, Y: Field{[10]uint32{0x035c8e50, 0x0214b7b5, 0x00f79c74, 0x00f5e5ff, 0x016ad468, 0x024bcd6a, 0x01062aa1, 0x02ac7bf2, 0x0293828c, 0x003f7134}}}, + {X: Field{[10]uint32{0x03d50bcd, 0x00003c24, 0x02217c98, 0x01763a00, 0x0119b1a8, 0x01db7b4d, 0x01b67b27, 0x0172c06c, 0x027bff31, 0x00037f98}}, Y: Field{[10]uint32{0x01f9e773, 0x00aa3b95, 0x03c285f3, 0x0346e57b, 0x03ea0f69, 0x0275a39a, 0x01d2480c, 0x0021edbf, 0x01ebbb65, 0x00264f15}}}, + {X: Field{[10]uint32{0x0046f516, 0x03ab1969, 0x01dde189, 0x01b55210, 0x03eb31c2, 0x0183c0bc, 0x007c9818, 0x028b2d7f, 0x0017fd00, 0x00283c33}}, Y: Field{[10]uint32{0x033b8969, 0x030a5792, 0x03a74ff5, 0x03aaf4c3, 0x0214bbe4, 0x00fb74df, 0x01077a7d, 0x0228efc4, 0x004c31d5, 0x002feba2}}}, + {X: Field{[10]uint32{0x03e37338, 0x02dcaea8, 0x01dd9dd7, 0x014e47f8, 0x03d37e7f, 0x0251ad4a, 0x02ef926c, 0x00a1bb5b, 0x02bcbc14, 0x003076ed}}, Y: Field{[10]uint32{0x02df7bf0, 0x00f9a984, 0x01bd0e79, 0x00d44e78, 0x03aa5e27, 0x028ea235, 0x036fdc81, 0x01a20bd2, 0x0187bd33, 0x0019ec0b}}}, + {X: Field{[10]uint32{0x034bebb2, 0x01416f2e, 0x03eebe82, 0x004440d0, 0x03070255, 0x03bb7d7b, 0x02cb1f06, 0x02571324, 0x025bc7d4, 0x00082e41}}, Y: Field{[10]uint32{0x00756835, 0x01449184, 0x00fbd55d, 0x029c12c9, 0x014fec71, 0x018090b6, 0x021a4f90, 0x00764af4, 0x03165c23, 0x0029a61c}}}, + {X: Field{[10]uint32{0x01a69190, 0x0152043b, 0x03f2e03c, 0x01993e36, 0x0255ab9a, 0x023f21e1, 0x029544d3, 0x0230e376, 0x01d00c4d, 0x001efb7f}}, Y: Field{[10]uint32{0x00af77a1, 0x01c569be, 0x00591690, 0x0394f275, 0x01365556, 0x01cbfb81, 0x02d00491, 0x014b79ba, 0x00b00d4f, 0x0026653c}}}, + {X: Field{[10]uint32{0x035918e0, 0x034e179a, 0x01368df4, 0x03481067, 0x035adcad, 0x0083a5f2, 0x023815b7, 0x020fdab1, 0x02af9979, 0x00099d8b}}, Y: Field{[10]uint32{0x0227e6be, 0x00862356, 0x02549279, 0x0359daab, 0x0125f0c0, 0x0395883f, 0x00be2e9b, 0x0136f009, 0x008ce11b, 0x00207d51}}}, + {X: Field{[10]uint32{0x0387bb79, 0x013d337c, 0x013d9a94, 0x01d64b43, 0x03ea14f1, 0x036a1b84, 0x0354ff5d, 0x03854b0c, 0x02e7ee18, 0x001c5232}}, Y: Field{[10]uint32{0x0310b18d, 0x032d3788, 0x0336593d, 0x002fbba0, 0x02ffd42a, 0x02b1af03, 0x0065efed, 0x01ba4105, 0x01faf6f8, 0x0002f6cd}}}, + {X: Field{[10]uint32{0x03bdbc90, 0x023385e1, 0x02723503, 0x001964f0, 0x01bb4d8f, 0x015a116d, 0x01ae00b1, 0x00b0ce9a, 0x01d933ae, 0x0009f917}}, Y: Field{[10]uint32{0x01801ac9, 0x02aff594, 0x02db1f7c, 0x0281643c, 0x017dfe36, 0x009c68ac, 0x019c75c9, 0x01e68fe3, 0x033fa935, 0x0028af38}}}, + {X: Field{[10]uint32{0x03d6b7d7, 0x02fcacb5, 0x02a98fa2, 0x0047fb4a, 0x00d0539c, 0x0207980f, 0x02d79c7d, 0x02ba30a8, 0x02155b28, 0x002bc31c}}, Y: Field{[10]uint32{0x03ac41f9, 0x00b1a6a9, 0x0085640d, 0x038793cb, 0x023b5b26, 0x0073eb0f, 0x0380bfc7, 0x00270002, 0x03cfa251, 0x002b9af7}}}, + {X: Field{[10]uint32{0x03cbabf4, 0x03f80a98, 0x02bec7ec, 0x00646b32, 0x02de0f5a, 0x007a38dc, 0x00e609b2, 0x034d3cc5, 0x0008d4f8, 0x001ed8f1}}, Y: Field{[10]uint32{0x00f16327, 0x02ca6fa5, 0x03a7ce0d, 0x03402f32, 0x02236925, 0x0222166d, 0x02b6f65e, 0x025af633, 0x009a78fa, 0x002a8200}}}, + {X: Field{[10]uint32{0x01c6890c, 0x0163e6e1, 0x03f9394d, 0x000506bb, 0x024f4b48, 0x03d3cc8c, 0x03cffb68, 0x03a22f58, 0x005314f3, 0x002adda2}}, Y: Field{[10]uint32{0x037f192c, 0x0280dbf3, 0x019e05d3, 0x010455f1, 0x01c9ff98, 0x01ffc520, 0x033610ed, 0x01af0430, 0x0033d6d9, 0x00069c72}}}, + {X: Field{[10]uint32{0x023bd32e, 0x038d4727, 0x025a9953, 0x03692c97, 0x01ccd308, 0x0303b616, 0x0375487c, 0x01444be0, 0x03f07ad7, 0x0019050d}}, Y: Field{[10]uint32{0x01a9b131, 0x00e8e220, 0x026b0ccc, 0x0142130c, 0x027d2ec9, 0x03c02198, 0x00f1ba83, 0x00d1abd4, 0x03e6b255, 0x000f163d}}}, + {X: Field{[10]uint32{0x03a082cb, 0x029d9259, 0x0180b9b4, 0x0321dce5, 0x0360f7ec, 0x03406ba1, 0x01cceaff, 0x0351e307, 0x012d600e, 0x003d4cbf}}, Y: Field{[10]uint32{0x0285fa96, 0x02f3e844, 0x0145e440, 0x02b5a5f2, 0x03221847, 0x0200f27c, 0x01bb4d6c, 0x01f5fdf3, 0x014c7111, 0x001ce4d4}}}, + {X: Field{[10]uint32{0x031c7631, 0x02f41d42, 0x01c3ee1f, 0x0351d7c3, 0x00db73db, 0x03e20a4e, 0x01e6f608, 0x02ad1362, 0x01592c4b, 0x000cd9e6}}, Y: Field{[10]uint32{0x01694fbc, 0x01c058d2, 0x035aa1fd, 0x018973d9, 0x0217125d, 0x03fd5f37, 0x00782515, 0x0273cdb4, 0x00046fe8, 0x001307e0}}}, + {X: Field{[10]uint32{0x0256c9cb, 0x008681ef, 0x00a5be22, 0x0380ca5c, 0x016f18b7, 0x0232b0a1, 0x02b53962, 0x03295ec1, 0x016d2a34, 0x00386130}}, Y: Field{[10]uint32{0x02c5bf73, 0x01780f78, 0x009c77f8, 0x00d11ad4, 0x03d646cd, 0x0319b7d5, 0x02ab0688, 0x027137c5, 0x017b51ef, 0x001f7ff0}}}, + {X: Field{[10]uint32{0x0015d419, 0x01b22119, 0x0068f0e2, 0x035bbee3, 0x034f6ce6, 0x02883078, 0x00de9909, 0x027556ee, 0x01162fb4, 0x003e2a5f}}, Y: Field{[10]uint32{0x02061146, 0x0130b910, 0x034a7ded, 0x00ea19a1, 0x005f20a8, 0x007cba1b, 0x012e1616, 0x03280652, 0x00534dbf, 0x000f34f3}}}, + {X: Field{[10]uint32{0x02475781, 0x03783a84, 0x0164eb32, 0x001ab5c6, 0x0328cfc4, 0x0234f714, 0x02dd6123, 0x03608751, 0x022f6c6a, 0x0027adaa}}, Y: Field{[10]uint32{0x0045c299, 0x00f8d1db, 0x004afcb3, 0x03a3ef08, 0x0053dfe3, 0x029066ca, 0x024ce341, 0x00b824d9, 0x028379d3, 0x00051406}}}, + {X: Field{[10]uint32{0x0202668a, 0x021e8f0d, 0x036425f8, 0x017f3ae9, 0x017c4031, 0x008ff500, 0x02427403, 0x02255787, 0x026a68e6, 0x003af095}}, Y: Field{[10]uint32{0x00c7ea39, 0x024c7935, 0x0063aa06, 0x03050bbc, 0x01fab3bd, 0x03a7b269, 0x01f9f85a, 0x015b8995, 0x010996ff, 0x0001d7a0}}}, + {X: Field{[10]uint32{0x012bc392, 0x02dfacbd, 0x029fd674, 0x012d01d2, 0x03ab9c5e, 0x02921032, 0x025b29db, 0x033970be, 0x0038a966, 0x00155919}}, Y: Field{[10]uint32{0x001c8d66, 0x01c083e6, 0x0228f0a3, 0x0033a6a3, 0x022987d8, 0x017354b9, 0x003f68a4, 0x012a273f, 0x02867603, 0x000d18c6}}}, + {X: Field{[10]uint32{0x0316575e, 0x02c0cdde, 0x032e7ece, 0x01759ca7, 0x00082eff, 0x01f76453, 0x03257b8c, 0x0207ccc4, 0x0309befb, 0x002e1fe0}}, Y: Field{[10]uint32{0x016ea298, 0x036dff6a, 0x00630dee, 0x030b3157, 0x03eda5e1, 0x0202fb06, 0x03df03fb, 0x0000b5be, 0x003259e4, 0x002fa99a}}}, + {X: Field{[10]uint32{0x00a0a93e, 0x011c77dc, 0x008d7953, 0x0054a24b, 0x0224b6cf, 0x005b90d7, 0x03598b20, 0x0358fab3, 0x0185b440, 0x0011655d}}, Y: Field{[10]uint32{0x00b71427, 0x03aabab1, 0x013a00b3, 0x03f08cd2, 0x03b29739, 0x019419fe, 0x02c366a5, 0x013d3c8e, 0x0260776a, 0x003d32d8}}}, + {X: Field{[10]uint32{0x0248ca87, 0x01eef925, 0x02e11148, 0x0122e583, 0x033fe8d6, 0x03e73015, 0x024c8218, 0x010aec60, 0x024c8d9c, 0x000b243d}}, Y: Field{[10]uint32{0x03c25a8a, 0x006f9074, 0x00ab4da2, 0x01f5ac76, 0x0369bebf, 0x008bf3d5, 0x03000a9f, 0x00f2d827, 0x0157ac64, 0x0020a6f3}}}, + {X: Field{[10]uint32{0x004b5efe, 0x02c15205, 0x037be36d, 0x0048aea7, 0x012e7539, 0x01dcc5ca, 0x006a3fcc, 0x026af655, 0x02c7779c, 0x003acc9e}}, Y: Field{[10]uint32{0x018c9435, 0x00e46414, 0x025a08c4, 0x01948e15, 0x032cbbf3, 0x01b9d200, 0x032c594d, 0x0334e230, 0x00858d2f, 0x00086b0b}}}, + {X: Field{[10]uint32{0x006d007d, 0x0032c74b, 0x00e6adba, 0x00606b8c, 0x00daa354, 0x00df43c2, 0x02b07fdd, 0x03329ea8, 0x03e2272c, 0x000257b1}}, Y: Field{[10]uint32{0x03a12b5f, 0x01e3f14a, 0x00f3375f, 0x01f93dd0, 0x002d589e, 0x0042e224, 0x02ac913c, 0x01814154, 0x02ef59df, 0x001ccde1}}}, + {X: Field{[10]uint32{0x000cbbd1, 0x019f1a7f, 0x015f5fc3, 0x00a4b186, 0x0191104a, 0x03fc5cdc, 0x03c845d7, 0x028203c9, 0x02988b4f, 0x0012de99}}, Y: Field{[10]uint32{0x03a85b8f, 0x011606d8, 0x0207c928, 0x01360904, 0x008e5249, 0x0266ca79, 0x0338fd4d, 0x01584a1e, 0x03d0a360, 0x0022c10e}}}, + {X: Field{[10]uint32{0x0342e6b2, 0x02af4c68, 0x025e747d, 0x024bf194, 0x00a92337, 0x006409f0, 0x02ab28a6, 0x02077cd4, 0x018b6df5, 0x00226cb1}}, Y: Field{[10]uint32{0x03f53a2b, 0x01168435, 0x001f4100, 0x03ae223a, 0x009b053f, 0x000edd2f, 0x025edea2, 0x03996f89, 0x0334d459, 0x000c02c6}}}, + {X: Field{[10]uint32{0x03c43cf1, 0x02a04526, 0x008007ad, 0x009e27c3, 0x031c9263, 0x01d7b121, 0x027ff0db, 0x00a34392, 0x035d9f6a, 0x00104266}}, Y: Field{[10]uint32{0x0262cae5, 0x03056dde, 0x00b26995, 0x02680d65, 0x013e0791, 0x00196234, 0x009253be, 0x024adba5, 0x02962e2b, 0x000a82ae}}}, + {X: Field{[10]uint32{0x03229be4, 0x03f58581, 0x00817af7, 0x02704e27, 0x018825ea, 0x02998d55, 0x03396b29, 0x00230d41, 0x00649ec5, 0x002f2c3f}}, Y: Field{[10]uint32{0x0207d606, 0x011a4cce, 0x03e5c2c7, 0x02e4b5ef, 0x0313664d, 0x0248b991, 0x03a12ae0, 0x03d6adb0, 0x0192cf3b, 0x0005a31e}}}, + {X: Field{[10]uint32{0x018b762e, 0x01c6737b, 0x009a50ec, 0x035bdc0d, 0x029cd3b3, 0x0156a025, 0x0314ca70, 0x015abe78, 0x01585a62, 0x001e8ff2}}, Y: Field{[10]uint32{0x03df1346, 0x011172f4, 0x00f2217d, 0x01e0e44a, 0x00dadecd, 0x01c5e764, 0x0288526b, 0x001c58d4, 0x000c29cd, 0x003fa2ca}}}, + {X: Field{[10]uint32{0x01a8176a, 0x038fc198, 0x02fe1c89, 0x03980341, 0x027583c1, 0x0195b6a6, 0x03229e1e, 0x028d7b83, 0x03e1b968, 0x000ddc24}}, Y: Field{[10]uint32{0x02c601d9, 0x003e2830, 0x02b82e6e, 0x0220082b, 0x006aba8e, 0x02303600, 0x02a4dd0b, 0x03d185f9, 0x020df6c9, 0x0039f021}}}, + {X: Field{[10]uint32{0x02afecd8, 0x018fc512, 0x02a375ba, 0x03496a63, 0x01919b1d, 0x0184c068, 0x0327a933, 0x033333c7, 0x03daf4a5, 0x00317bfc}}, Y: Field{[10]uint32{0x00b97a1c, 0x01259337, 0x01d67f42, 0x027d38fc, 0x010a9412, 0x0088b0bf, 0x008a02c2, 0x020f7063, 0x023426f9, 0x000d3845}}}, + {X: Field{[10]uint32{0x023ffb27, 0x02a732f9, 0x014e984e, 0x03c54bb1, 0x033c0fa6, 0x00da2bf2, 0x0230f728, 0x0034cd10, 0x0119eb56, 0x00003f1e}}, Y: Field{[10]uint32{0x0059a6b3, 0x00a10aa6, 0x03fa9413, 0x033ab6b4, 0x00a04bc4, 0x03929f74, 0x01cb8388, 0x01bfe6f0, 0x0382af76, 0x00071f4d}}}, + {X: Field{[10]uint32{0x021ca5bd, 0x0362c921, 0x001c6287, 0x00890f4e, 0x03b31183, 0x0371bd1b, 0x0034cd6e, 0x01b5c951, 0x03fb4938, 0x0009e0f5}}, Y: Field{[10]uint32{0x03fa5c70, 0x005b8e31, 0x00111a93, 0x01d205c4, 0x01e4c685, 0x023e271e, 0x00450262, 0x01ab038f, 0x02710b80, 0x0028eabc}}}, + {X: Field{[10]uint32{0x018a02f3, 0x012cc3cb, 0x012298ad, 0x01bff4d7, 0x0188f54a, 0x0396efe5, 0x03f89495, 0x038343dd, 0x007868d4, 0x001d01e9}}, Y: Field{[10]uint32{0x03fdec9c, 0x03046d61, 0x001ce24c, 0x0250166b, 0x02debf3d, 0x024cca5f, 0x01b393ea, 0x0232c2a9, 0x016296e1, 0x00049435}}}, + {X: Field{[10]uint32{0x0061a321, 0x0137486a, 0x01df6cc5, 0x0293e118, 0x01c5899f, 0x0055101e, 0x02c108e7, 0x03b369de, 0x00e32940, 0x0030b4b3}}, Y: Field{[10]uint32{0x005a1909, 0x037a16fc, 0x01b729e6, 0x02aba0c3, 0x030a919e, 0x03321516, 0x00b05e3e, 0x0201c64a, 0x01fa40bb, 0x003c2fac}}}, + {X: Field{[10]uint32{0x01e8a56f, 0x03eb0fab, 0x013eb349, 0x00d4132c, 0x00d459a9, 0x02d7a54c, 0x014e1f5a, 0x006559aa, 0x0189c505, 0x00233dac}}, Y: Field{[10]uint32{0x03cf9c96, 0x018152f3, 0x0338c160, 0x02205884, 0x00327aa7, 0x008b51ea, 0x02d06d3b, 0x00a21b39, 0x017032e5, 0x002fdaa7}}}, + {X: Field{[10]uint32{0x01a94968, 0x019d9b4a, 0x01d51ece, 0x00adff42, 0x022deeaa, 0x00c9df47, 0x016ac5f5, 0x0211c43e, 0x0186ed9f, 0x0035ac1d}}, Y: Field{[10]uint32{0x009c5326, 0x03a0fd7c, 0x03c9c75b, 0x007b4b88, 0x022f7904, 0x038fe8a4, 0x02f0d0d5, 0x01573d2b, 0x00b4ce56, 0x0036ad35}}}, + {X: Field{[10]uint32{0x02f4d647, 0x01c89ec3, 0x0000fb85, 0x00cd136a, 0x009e661d, 0x001e560d, 0x03a09219, 0x00fb7fcc, 0x033360a0, 0x0029c82d}}, Y: Field{[10]uint32{0x0084ea63, 0x01702d52, 0x035b11bb, 0x03fef513, 0x0313d79d, 0x003d219f, 0x037e3a5a, 0x00b60980, 0x006a721c, 0x0007c84f}}}, + {X: Field{[10]uint32{0x033a5ff7, 0x01a73b07, 0x030ac95a, 0x028b2806, 0x01b39f9b, 0x0167741d, 0x03db862e, 0x031b19c5, 0x02983b03, 0x00156295}}, Y: Field{[10]uint32{0x00ffb1a4, 0x0331b1f5, 0x0155792e, 0x01a621ff, 0x00fe3ae8, 0x00117f18, 0x0338458a, 0x02da2c85, 0x0352db21, 0x001f81f1}}}, + {X: Field{[10]uint32{0x00e14ca4, 0x02d55404, 0x002639ca, 0x035fe35b, 0x02a7c2d9, 0x00474382, 0x0329941f, 0x01a2a314, 0x03c32786, 0x002e49f7}}, Y: Field{[10]uint32{0x0323388c, 0x01e570ad, 0x035524b8, 0x0152666b, 0x0172f4d8, 0x01dc1489, 0x020e35f7, 0x0089eed0, 0x03259954, 0x000f3a0d}}}, + {X: Field{[10]uint32{0x030e6da8, 0x0263b313, 0x0016513f, 0x00719470, 0x003c35f7, 0x02d568dd, 0x0223ed5a, 0x02bfd623, 0x00991085, 0x000adc35}}, Y: Field{[10]uint32{0x006a8b06, 0x013c0a94, 0x025cd1a9, 0x004c72b8, 0x030a7014, 0x03609d8b, 0x03984697, 0x01727288, 0x034daa1e, 0x0037d04e}}}, + {X: Field{[10]uint32{0x01aefe56, 0x007cbbcb, 0x01144142, 0x015298b8, 0x01e1368e, 0x012e9dfa, 0x029181d9, 0x01b80266, 0x00dcf72f, 0x002e20db}}, Y: Field{[10]uint32{0x010427ce, 0x01488279, 0x00359afa, 0x02a94e53, 0x0201beec, 0x0233abad, 0x017014b6, 0x03c9b72b, 0x012f0e31, 0x00026b51}}}, + {X: Field{[10]uint32{0x00af93a7, 0x02daa031, 0x01b004dc, 0x01173643, 0x02ec66b4, 0x03cce026, 0x0388b480, 0x0388e825, 0x017b65f0, 0x00094aca}}, Y: Field{[10]uint32{0x00916838, 0x02c37898, 0x010e806c, 0x034314cd, 0x039f77c7, 0x0092962f, 0x02a3bcfc, 0x018845cd, 0x00c43c34, 0x00233138}}}, + {X: Field{[10]uint32{0x02be6330, 0x0245c737, 0x01892aad, 0x001335ca, 0x03d34f27, 0x035adef6, 0x03d5fa03, 0x03319a3b, 0x00ca1c15, 0x0027cf4c}}, Y: Field{[10]uint32{0x023211b0, 0x0188c9ec, 0x0057b386, 0x02613888, 0x01353d9b, 0x0051d85c, 0x0056974f, 0x03b9eaf0, 0x00340f95, 0x001122d9}}}, + {X: Field{[10]uint32{0x03d35e49, 0x034a614b, 0x039e66e2, 0x01793952, 0x01653b54, 0x02f1ef38, 0x00a771b5, 0x02b767fe, 0x016e5bc9, 0x00208978}}, Y: Field{[10]uint32{0x010570fa, 0x012a9d5f, 0x0212c717, 0x02774401, 0x00df836b, 0x01fc2765, 0x024e1de8, 0x028b05b2, 0x01e3aaef, 0x00189531}}}, + {X: Field{[10]uint32{0x02d02ebe, 0x01a729aa, 0x01799046, 0x019d34f1, 0x01074f47, 0x0378956c, 0x02a80b74, 0x0266c6dc, 0x02484d6e, 0x0029f73b}}, Y: Field{[10]uint32{0x01c170a7, 0x0160ee80, 0x002a42db, 0x01e231f1, 0x00785861, 0x03bdea52, 0x021f541b, 0x02407d21, 0x00fa76a2, 0x00075bc3}}}, + {X: Field{[10]uint32{0x009976b4, 0x038c57a0, 0x03d1e210, 0x00ae8e5b, 0x009a6baa, 0x00b1992e, 0x013372fd, 0x03a43a63, 0x01a85d4c, 0x002a4511}}, Y: Field{[10]uint32{0x00b1d100, 0x020e1d9e, 0x01449f1d, 0x03e539f1, 0x0072deac, 0x0365001f, 0x01d1512c, 0x01cac6d4, 0x028b99b0, 0x002b7131}}}, + {X: Field{[10]uint32{0x027ce1f1, 0x0217b88a, 0x01c79ed6, 0x02b621b3, 0x036f6ea6, 0x01443803, 0x00410963, 0x025955d7, 0x01ce907c, 0x001d18b2}}, Y: Field{[10]uint32{0x0371c7df, 0x03fe882e, 0x00f2ae67, 0x03a0ccbe, 0x0047a854, 0x02731050, 0x02df5ac7, 0x008a6710, 0x01c5f02c, 0x0013fe90}}}, + {X: Field{[10]uint32{0x00cd4f40, 0x0232a18a, 0x005065d3, 0x0112596a, 0x00dfd855, 0x029e7c8d, 0x00e36bb6, 0x0256f6be, 0x01f3dea4, 0x00350a25}}, Y: Field{[10]uint32{0x010d9cf5, 0x024ab82d, 0x01bbd59c, 0x003ea036, 0x00982171, 0x02ee121b, 0x0069b207, 0x00710b9e, 0x031813a1, 0x000bfb7a}}}, + {X: Field{[10]uint32{0x01388adc, 0x03666853, 0x01669c29, 0x01b5da99, 0x02e8291e, 0x03bd4f44, 0x03434b27, 0x01622bc4, 0x0362ce85, 0x003be6da}}, Y: Field{[10]uint32{0x03bf912f, 0x022bb826, 0x0138adb1, 0x015516da, 0x02802612, 0x024501f2, 0x0107955e, 0x03258bb6, 0x03cf9af0, 0x000567d7}}}, + {X: Field{[10]uint32{0x01bc9f32, 0x02c1b23f, 0x03f392af, 0x01f8a9a4, 0x0392877c, 0x0325abff, 0x01fb7bdb, 0x0276bf7d, 0x01a0bc65, 0x001000fc}}, Y: Field{[10]uint32{0x0161fef9, 0x0217ad5e, 0x03cc9ea6, 0x029b09c1, 0x017faeaf, 0x012fa197, 0x03f1dcb7, 0x03c2c0a3, 0x02a17458, 0x003afff2}}}, + {X: Field{[10]uint32{0x02c09a8b, 0x01c0da9a, 0x027debed, 0x03640121, 0x01aa9ae1, 0x0121bd73, 0x00786f07, 0x03614592, 0x008b6b03, 0x0010e412}}, Y: Field{[10]uint32{0x0282f07a, 0x01da98e1, 0x03d6e5dd, 0x0304a682, 0x03452001, 0x00777ce4, 0x035b88a2, 0x02d5ac70, 0x01e5a10d, 0x001e0ca7}}}, + {X: Field{[10]uint32{0x03fadea1, 0x01d019ea, 0x006b9605, 0x005be7fe, 0x016074ee, 0x037fe2d0, 0x0006c565, 0x03ed9ad8, 0x00d29ea3, 0x002b9b68}}, Y: Field{[10]uint32{0x011cdac7, 0x00cc8d30, 0x009c05ca, 0x007ae22d, 0x0229e3f0, 0x00dc1853, 0x02f0916f, 0x00a98f9d, 0x0263dd01, 0x001d32aa}}}, + {X: Field{[10]uint32{0x03cfc72a, 0x0362a1ae, 0x014fb2fa, 0x03825414, 0x02035942, 0x013a01bd, 0x00656520, 0x011c86df, 0x01df9861, 0x001e3e1e}}, Y: Field{[10]uint32{0x00281ac6, 0x014a5b4e, 0x01c68a75, 0x034e2358, 0x032318aa, 0x03ee1731, 0x03661b7f, 0x03a02fea, 0x018c478a, 0x00106539}}}, + {X: Field{[10]uint32{0x03c97e01, 0x00be5b97, 0x01d1dedd, 0x00a1ec70, 0x000352e0, 0x00e0d577, 0x00d51cc8, 0x02c31b5b, 0x03654f41, 0x00201a10}}, Y: Field{[10]uint32{0x02b62461, 0x000cfae4, 0x01c45262, 0x01f8ec79, 0x037546bc, 0x00d7ca69, 0x0141a0d0, 0x006d3878, 0x023f13c6, 0x0022c308}}}, + {X: Field{[10]uint32{0x0387466c, 0x02ce4212, 0x0301005c, 0x00d271e5, 0x02f83b59, 0x0365f42a, 0x03d11691, 0x01d7d1bb, 0x019f4fd9, 0x000a5427}}, Y: Field{[10]uint32{0x02d0da81, 0x03ae9a81, 0x038da8a0, 0x0214bab4, 0x02a33de5, 0x00d78f21, 0x00fccbe1, 0x02be5b27, 0x037569a0, 0x00051dfa}}}, + {X: Field{[10]uint32{0x031dfa4a, 0x03ffabb7, 0x0399c2d8, 0x0105bafd, 0x004e3d57, 0x00f18ea7, 0x01532fe3, 0x01c8bc30, 0x00433d9c, 0x00064745}}, Y: Field{[10]uint32{0x003a2cd8, 0x012d375c, 0x01706eae, 0x02d997b2, 0x01a5e3c7, 0x006213bb, 0x01ecf839, 0x01c6b5d1, 0x0009b6b5, 0x0016f401}}}, + {X: Field{[10]uint32{0x030155a8, 0x022c5646, 0x001e1ebf, 0x0078f6c8, 0x02a50f0e, 0x03aa0afc, 0x02d65afe, 0x0205a17b, 0x002ed273, 0x000a10f5}}, Y: Field{[10]uint32{0x03c63ee8, 0x01f4246e, 0x02f98ff8, 0x02e02669, 0x0177edaf, 0x00cb2c89, 0x03e6e2c2, 0x027d4ed1, 0x0266c0fa, 0x00201f3a}}}, + {X: Field{[10]uint32{0x03c8f644, 0x014ef44a, 0x000184d6, 0x00b5145b, 0x00e96ed0, 0x03a084be, 0x007514b8, 0x034dbd4d, 0x03b09656, 0x00155a2d}}, Y: Field{[10]uint32{0x00e60d87, 0x03618e14, 0x009118b2, 0x026e904a, 0x02496045, 0x03a8d901, 0x03da30d7, 0x01b710fe, 0x03a65483, 0x0016d13a}}}, + {X: Field{[10]uint32{0x0145e803, 0x023b17ac, 0x03d6e5f3, 0x008701cf, 0x004a7dd4, 0x0256ccbe, 0x00d81ab5, 0x01129a7a, 0x00e0809e, 0x0016e138}}, Y: Field{[10]uint32{0x0113d398, 0x00f4fbeb, 0x00243cb4, 0x0303fa4d, 0x017e6109, 0x0390c455, 0x03a1522a, 0x0073b5cb, 0x02d0fa79, 0x00069968}}}, + {X: Field{[10]uint32{0x02dfa672, 0x02993aaf, 0x00ede900, 0x010a4b32, 0x00675ba8, 0x0234ca44, 0x021519a1, 0x0041c51f, 0x016bdd24, 0x003bd0b1}}, Y: Field{[10]uint32{0x03ff75ac, 0x01ef34e2, 0x00e3cc9e, 0x0288c51d, 0x0326a618, 0x02b76fda, 0x01e0c254, 0x0265dd84, 0x03473335, 0x001c0545}}}, + {X: Field{[10]uint32{0x0256eb63, 0x01f04a55, 0x0294c92b, 0x03b21fab, 0x00adc653, 0x02c5056d, 0x026ed003, 0x0129592f, 0x02dcb50d, 0x001237fc}}, Y: Field{[10]uint32{0x01643928, 0x01982063, 0x036b5f0f, 0x00f7dc07, 0x02fa29e6, 0x02feb550, 0x03c59e98, 0x03b3dbc2, 0x03fb53af, 0x002a6fa5}}}, + {X: Field{[10]uint32{0x02e938d4, 0x00793ed2, 0x00337f88, 0x035067f7, 0x00d1923b, 0x008ac263, 0x009a2dfc, 0x0345d043, 0x00f5246a, 0x0019cba4}}, Y: Field{[10]uint32{0x01781f19, 0x028a2e68, 0x02c9e97a, 0x0091585f, 0x02f331b6, 0x00797c27, 0x03e678b3, 0x01b6da20, 0x03801fda, 0x001cff4c}}}, + {X: Field{[10]uint32{0x03315cde, 0x032dd852, 0x03723ee7, 0x008529f2, 0x02dbfe55, 0x01770577, 0x01e094a9, 0x02067242, 0x01b171fb, 0x0016736e}}, Y: Field{[10]uint32{0x008351a2, 0x036c06fa, 0x00a187a6, 0x03679243, 0x017f2d38, 0x00208027, 0x033f8e73, 0x01298fb3, 0x0212670b, 0x000156b0}}}, + {X: Field{[10]uint32{0x012ddb18, 0x004237ab, 0x028f0043, 0x020a3873, 0x006b827f, 0x02666531, 0x00db879b, 0x0162ac4d, 0x010a357a, 0x001738e3}}, Y: Field{[10]uint32{0x0397f716, 0x0285364e, 0x009c1745, 0x019c4227, 0x0394748c, 0x036f3146, 0x0384b33d, 0x0361bb0b, 0x0202d9c1, 0x0017a058}}}, + {X: Field{[10]uint32{0x0398afda, 0x012846d4, 0x028c8282, 0x016b41c4, 0x02c1a74d, 0x02dabe49, 0x0227a940, 0x03eeeec3, 0x016a7466, 0x00326086}}, Y: Field{[10]uint32{0x00901f55, 0x0058df54, 0x006b6f00, 0x00953915, 0x032d8fb9, 0x00704cf6, 0x00e6448a, 0x00e2bee7, 0x01eae644, 0x001ea47e}}}, + {X: Field{[10]uint32{0x039ec818, 0x03d4ca60, 0x03d31725, 0x030a0f20, 0x0360bfbc, 0x01e5b403, 0x0281d297, 0x006fb372, 0x008479e6, 0x000e0f2c}}, Y: Field{[10]uint32{0x01dec91e, 0x028643de, 0x004ffdb1, 0x009ab619, 0x010bbc34, 0x0057cd36, 0x01e04980, 0x0224ce2f, 0x03a24900, 0x0009b89b}}}, + {X: Field{[10]uint32{0x002f612b, 0x03293f44, 0x00550248, 0x026dab21, 0x0328b88c, 0x01200477, 0x0117b524, 0x03c529c6, 0x03312ad4, 0x0039a515}}, Y: Field{[10]uint32{0x0176f53d, 0x030ce193, 0x0089c1b1, 0x01be5c1a, 0x00c81cc8, 0x027ac2d1, 0x03edddac, 0x01c0797a, 0x008251fc, 0x000c3b48}}}, + {X: Field{[10]uint32{0x039976f7, 0x00f131ae, 0x018a7f28, 0x03c893e9, 0x01250809, 0x0098a9ca, 0x02168d21, 0x024d4884, 0x01ba8f79, 0x000b401c}}, Y: Field{[10]uint32{0x031dfd8b, 0x00ac05d7, 0x01b03c87, 0x03c695c2, 0x01ccc118, 0x020001e7, 0x01455440, 0x01cfc45a, 0x01014e48, 0x0033729a}}}, + {X: Field{[10]uint32{0x001e927e, 0x0123c880, 0x017898d7, 0x02c210df, 0x01da35c2, 0x01e61dee, 0x00f35f06, 0x013efe47, 0x005765b7, 0x00320ae5}}, Y: Field{[10]uint32{0x005fd6a2, 0x00f67c81, 0x0133d931, 0x00a8e6c5, 0x03b57a0f, 0x02ab23c1, 0x0057dae9, 0x01aff1f8, 0x01d10bb0, 0x000b9413}}}, + {X: Field{[10]uint32{0x01bbf0a6, 0x02d8ca1d, 0x0022763c, 0x028bece9, 0x012654ed, 0x01cdf746, 0x01135ede, 0x0086a7fb, 0x002e7eac, 0x00270693}}, Y: Field{[10]uint32{0x00e9197f, 0x0023bf84, 0x02e60200, 0x011ba768, 0x0280eb66, 0x02ded681, 0x02c91289, 0x00716089, 0x036c12f7, 0x003cc4d2}}}, + {X: Field{[10]uint32{0x016c9b28, 0x02b09fa3, 0x0353b6a2, 0x00d8b55d, 0x019b170a, 0x0202df3e, 0x00bd645e, 0x00c88bb6, 0x019bbc69, 0x0025c74f}}, Y: Field{[10]uint32{0x01d22e2e, 0x00dbdfe4, 0x0098080a, 0x00cfce16, 0x01e20394, 0x03f17a1b, 0x00a73af7, 0x0370b1b1, 0x009ae296, 0x000358f5}}}, + {X: Field{[10]uint32{0x03917d2b, 0x0200bea2, 0x0023fa67, 0x01eafd6b, 0x01660a31, 0x00186781, 0x0329f2ae, 0x0045448f, 0x027386bc, 0x003d524e}}, Y: Field{[10]uint32{0x01e0f1d7, 0x008c1b99, 0x03e23964, 0x000a004c, 0x0138455e, 0x0109ee2d, 0x0305157b, 0x0014c0ac, 0x00cb8b78, 0x0039ab6f}}}, + {X: Field{[10]uint32{0x01b6e014, 0x00154de6, 0x006dadde, 0x03f502ce, 0x01763244, 0x03af78ab, 0x017a3215, 0x00282b92, 0x023e500e, 0x0020c7c4}}, Y: Field{[10]uint32{0x03221d6c, 0x01c67232, 0x03950f44, 0x002a76da, 0x01ac04af, 0x03bbd7be, 0x02fa508c, 0x0222b154, 0x00622ff5, 0x000d585a}}}, + {X: Field{[10]uint32{0x017cfb35, 0x00a321e2, 0x02975f17, 0x008a63a4, 0x027a338c, 0x03bce175, 0x014c3342, 0x011d30ce, 0x006d0018, 0x0026e338}}, Y: Field{[10]uint32{0x02a40d72, 0x033a8150, 0x0331d712, 0x015e928d, 0x0307ce87, 0x007d4dd1, 0x01a50c4c, 0x00f811f3, 0x0220b8dc, 0x001da500}}}, + {X: Field{[10]uint32{0x03c5b855, 0x004de9cf, 0x027cb1e8, 0x02b437fe, 0x0014f06c, 0x00afcf85, 0x01724104, 0x00af2580, 0x016ba98d, 0x003dc2a4}}, Y: Field{[10]uint32{0x000275a2, 0x023ffeca, 0x0023fff9, 0x02110f10, 0x03b5426d, 0x025ea23c, 0x01a3fbe9, 0x0225bfce, 0x01f470d7, 0x003c6e30}}}, + {X: Field{[10]uint32{0x00763d56, 0x014abeb0, 0x0259992d, 0x0027f653, 0x01a64d69, 0x03d88741, 0x02836612, 0x01ff92ac, 0x03bbc44e, 0x000b4aad}}, Y: Field{[10]uint32{0x015328e8, 0x034cb331, 0x0328ae57, 0x02bcd815, 0x03c5fec8, 0x02d870b4, 0x03e044e8, 0x024721a3, 0x02002a69, 0x0014d143}}}, + {X: Field{[10]uint32{0x00d10005, 0x02e751bd, 0x018f3dc9, 0x03157601, 0x03321ff7, 0x02a44c55, 0x025423f3, 0x025e33a8, 0x02b8c516, 0x00205e37}}, Y: Field{[10]uint32{0x016ff4bc, 0x00efeda3, 0x02bfb598, 0x011a89ad, 0x01f9c001, 0x00d4926f, 0x02e6a282, 0x034c0fd2, 0x032b46c9, 0x0005a9c6}}}, + {X: Field{[10]uint32{0x02b56a64, 0x01a9a48d, 0x0301126e, 0x03285800, 0x0001f700, 0x03756650, 0x02f9c32a, 0x02e9f99f, 0x0376d012, 0x002d1c2e}}, Y: Field{[10]uint32{0x014fd95c, 0x03089c98, 0x03a6927c, 0x020a8bef, 0x031775f0, 0x02349a61, 0x01f36f15, 0x0261861c, 0x03e07d17, 0x003df424}}}, + {X: Field{[10]uint32{0x02de29ce, 0x01c4cff8, 0x03f78fe1, 0x0084736c, 0x01d3a899, 0x003c0850, 0x0348eb33, 0x02b04866, 0x02ba837c, 0x000593ca}}, Y: Field{[10]uint32{0x031d28dc, 0x01d8dd21, 0x011972c0, 0x01419a49, 0x02c2837c, 0x02e08701, 0x01ec79e0, 0x0340d12a, 0x020895f7, 0x000ef015}}}, + {X: Field{[10]uint32{0x02e725f4, 0x027fb144, 0x02283ec5, 0x03aa20f8, 0x01e6a210, 0x0172ee27, 0x012268b3, 0x01b4bbd4, 0x020402a8, 0x0031de8e}}, Y: Field{[10]uint32{0x031cfba2, 0x027bb704, 0x029148dc, 0x03896d27, 0x036d1db4, 0x03b580ac, 0x007e5928, 0x0281ff96, 0x016bedf1, 0x000baf35}}}, + {X: Field{[10]uint32{0x03b11349, 0x02b4cd40, 0x00e9f060, 0x0010368e, 0x0011df55, 0x0071aafa, 0x03a3f1d7, 0x033dc555, 0x03a1f714, 0x00038b7b}}, Y: Field{[10]uint32{0x0045f229, 0x02d516b8, 0x0354bd88, 0x0368ee6a, 0x000c5107, 0x0195f651, 0x001912ea, 0x02ef1cbd, 0x03037a53, 0x0017b590}}}, + {X: Field{[10]uint32{0x02313e3c, 0x004910ed, 0x017b2d21, 0x03a73075, 0x0335280c, 0x0290cc2b, 0x03fca1e5, 0x02793058, 0x02cbb4cd, 0x003b8b44}}, Y: Field{[10]uint32{0x02153262, 0x02488ebb, 0x02f0849f, 0x01bf752e, 0x024057fb, 0x03ffeda5, 0x00ecafab, 0x01f1960e, 0x01c1a437, 0x0038a2c7}}}, + {X: Field{[10]uint32{0x019e28bd, 0x0095b59f, 0x0067c78f, 0x011489c5, 0x01a2109b, 0x016f9f0f, 0x0039c34f, 0x037b2bcf, 0x009673e6, 0x00010e4b}}, Y: Field{[10]uint32{0x00110c50, 0x00aa2180, 0x006fd590, 0x035f43d0, 0x00747d63, 0x010e9aed, 0x009edd53, 0x0094cec1, 0x0183ae35, 0x001ff930}}}, + {X: Field{[10]uint32{0x020d6960, 0x03fcc702, 0x017a6712, 0x02cbe046, 0x020f5586, 0x00023d26, 0x02655f16, 0x01d2b64e, 0x02ee1673, 0x00165cb8}}, Y: Field{[10]uint32{0x037c71d6, 0x037b069b, 0x00847bc3, 0x03f1f024, 0x02779343, 0x0240ef5c, 0x02e485ad, 0x01f1d228, 0x0055d0a5, 0x001b5c3f}}}, + {X: Field{[10]uint32{0x002c78aa, 0x0226bc0c, 0x03c19855, 0x00690038, 0x02a180f3, 0x02795d9a, 0x01f1faa2, 0x000c5622, 0x000afc2c, 0x002a1760}}, Y: Field{[10]uint32{0x017ec85e, 0x022c036e, 0x032a508f, 0x01e94b74, 0x02ff5aca, 0x00a196de, 0x0037b419, 0x01da8291, 0x03f4903c, 0x001d0a75}}}, + {X: Field{[10]uint32{0x01f1c245, 0x0215a7e9, 0x01cdc954, 0x00e1c9d6, 0x02ccee3f, 0x035418e1, 0x009e85d7, 0x013f326a, 0x030f0d59, 0x003260da}}, Y: Field{[10]uint32{0x0094fac0, 0x02dc20b4, 0x031ed943, 0x03166ed0, 0x03bed1c2, 0x035c59c9, 0x01a7d06f, 0x03fb58bc, 0x012693b7, 0x0027c2c6}}}, + {X: Field{[10]uint32{0x0202bd3b, 0x032b9ff4, 0x0222b588, 0x0106b991, 0x0375f2c4, 0x03658c64, 0x0348e5f6, 0x01195340, 0x00fdb2b8, 0x00328861}}, Y: Field{[10]uint32{0x026a4de9, 0x013c3f5c, 0x0162683c, 0x03207d9c, 0x01e2563c, 0x03a5ca6e, 0x013dbb2f, 0x01eab012, 0x00203d65, 0x0034488a}}}, + {X: Field{[10]uint32{0x02941fd8, 0x00b9814d, 0x0066b44a, 0x03331e93, 0x02b5dea0, 0x00181755, 0x03627048, 0x02599021, 0x01c63c9b, 0x00278145}}, Y: Field{[10]uint32{0x00be831a, 0x02c87255, 0x01e506d4, 0x018845fb, 0x0295f0b7, 0x036e8187, 0x02f789e2, 0x00b61abf, 0x0224a2eb, 0x000a778c}}}, + {X: Field{[10]uint32{0x035dc1cc, 0x023c002b, 0x02f6053a, 0x03694759, 0x018a3447, 0x0297cf5e, 0x022cf7af, 0x00e9fc30, 0x00253320, 0x0010810b}}, Y: Field{[10]uint32{0x01e6c05a, 0x022369fd, 0x03d9dff6, 0x007587dc, 0x03c54f3c, 0x02f04f44, 0x01420d50, 0x00e1c8c5, 0x027a6d6c, 0x003c1d69}}}, + {X: Field{[10]uint32{0x02295b96, 0x0259f1c4, 0x031bccd3, 0x032a6b90, 0x023f5a68, 0x0222557f, 0x0084ffd2, 0x000af916, 0x01bd4eab, 0x00199168}}, Y: Field{[10]uint32{0x0384cfad, 0x033344ae, 0x00b6730c, 0x01949014, 0x00bf9028, 0x003a4b13, 0x02d4b30f, 0x013b50a3, 0x01f91d26, 0x0008c7de}}}, + {X: Field{[10]uint32{0x00b32f9f, 0x0347ba35, 0x0075f30b, 0x02a21c3d, 0x036898f3, 0x0161f78d, 0x01482ab1, 0x01ba208c, 0x026d2c31, 0x00138a07}}, Y: Field{[10]uint32{0x0065602c, 0x03dd6070, 0x0091011e, 0x0357cdf9, 0x02c3f708, 0x03770d05, 0x0378062c, 0x027b7797, 0x01c81c11, 0x003d232b}}}, + {X: Field{[10]uint32{0x02af5136, 0x0153bc12, 0x00e02fcd, 0x034f90cb, 0x034fbaf7, 0x01e99880, 0x03c7ffbc, 0x007a7fc4, 0x001496e4, 0x001dc8d9}}, Y: Field{[10]uint32{0x002dd218, 0x020c1d09, 0x0328c800, 0x028195fc, 0x0398bec7, 0x00003da5, 0x00b4bf29, 0x03007bed, 0x01740d6c, 0x00088b80}}}, + {X: Field{[10]uint32{0x01d45860, 0x00765dc3, 0x02bddaf3, 0x027fded7, 0x0018ab00, 0x00488610, 0x026070cb, 0x01e166b6, 0x004c8d46, 0x000fcadc}}, Y: Field{[10]uint32{0x034dd88a, 0x03ebaa0e, 0x02a9fb59, 0x022ff417, 0x03e2b6ab, 0x035868b7, 0x038dd215, 0x03ad7a30, 0x03a5146a, 0x00291c59}}}, + {X: Field{[10]uint32{0x00ad4146, 0x02e7a4bb, 0x01b51640, 0x0342b931, 0x0384b3ac, 0x017e60f6, 0x03b70f03, 0x036044ba, 0x0130d243, 0x001e53b0}}, Y: Field{[10]uint32{0x007be84d, 0x01ddeab4, 0x01e71c80, 0x03576303, 0x00658f2d, 0x00debbd7, 0x00a537f9, 0x0171f3bb, 0x00be95c2, 0x00127b7b}}}, + {X: Field{[10]uint32{0x01a96aa3, 0x03258525, 0x023ba808, 0x0335ba7f, 0x0149c554, 0x01ec702c, 0x0304cf4a, 0x0384ade6, 0x01ece363, 0x001d43fe}}, Y: Field{[10]uint32{0x021d59a9, 0x00540bde, 0x02dfb2de, 0x02fc7931, 0x022d4474, 0x028182d0, 0x0270f149, 0x028fb7d3, 0x029dd1c5, 0x00168a09}}}, + {X: Field{[10]uint32{0x026272cf, 0x017ecaad, 0x00169633, 0x00b26dfd, 0x02263b08, 0x0344a518, 0x02c9ec1f, 0x01a3b2e5, 0x01d7df66, 0x00359701}}, Y: Field{[10]uint32{0x02188839, 0x02e93c37, 0x03c37891, 0x0019acbd, 0x017e48be, 0x031dff6b, 0x02cc5b7f, 0x0350b490, 0x00c51c10, 0x00035dca}}}, + {X: Field{[10]uint32{0x015190c3, 0x016fbd56, 0x012f6122, 0x00e5ca8f, 0x02aecffe, 0x036e685c, 0x039d2700, 0x03a7a6d6, 0x00b68cb2, 0x0034e013}}, Y: Field{[10]uint32{0x01e30d5e, 0x03091c6d, 0x01613482, 0x00f9bfc3, 0x00287902, 0x01814d0a, 0x02f41314, 0x01922cc2, 0x010c9568, 0x00047ecd}}}, + {X: Field{[10]uint32{0x00351bf6, 0x03a7a11c, 0x01b3db34, 0x0104441b, 0x036a9382, 0x03b3e34d, 0x0095c619, 0x00d27db3, 0x022635c6, 0x003dd8b7}}, Y: Field{[10]uint32{0x009fd814, 0x03702eaf, 0x0010b1ca, 0x00b4fa21, 0x000ccfe2, 0x026444b9, 0x013352da, 0x003e7b9d, 0x01e0c8a5, 0x003719fe}}}, + {X: Field{[10]uint32{0x03b87a71, 0x0395d9d4, 0x00e7dac5, 0x03baea1f, 0x03d7dcec, 0x005f8e49, 0x02e163ed, 0x03fd2c5f, 0x00bfa827, 0x002ac62d}}, Y: Field{[10]uint32{0x030da919, 0x03aa6e4a, 0x01ed5b57, 0x00734ac7, 0x0229706d, 0x01341fdc, 0x002bc09c, 0x00249b22, 0x03d573e4, 0x001b6e0e}}}, + {X: Field{[10]uint32{0x0198c95e, 0x0199a540, 0x02d8bf5c, 0x02b63d8e, 0x02b12478, 0x0116588a, 0x0343a870, 0x006ba368, 0x0248fec2, 0x003dd530}}, Y: Field{[10]uint32{0x0052b1bd, 0x009e6498, 0x02e5293b, 0x01e8caee, 0x00e056ca, 0x03d511dd, 0x008d8e67, 0x021ddae1, 0x02a25f9c, 0x000b3edd}}}, + {X: Field{[10]uint32{0x0246c51c, 0x018b53e6, 0x008e2c24, 0x030c4d07, 0x02103516, 0x005af285, 0x013ecdb7, 0x001e63e2, 0x033e3c3f, 0x003e3651}}, Y: Field{[10]uint32{0x03924e02, 0x016fa4b5, 0x006869e0, 0x00ef846d, 0x015c53bd, 0x01d51e0d, 0x03314dac, 0x03f8e89a, 0x025fa422, 0x00157c01}}}, + {X: Field{[10]uint32{0x014eb741, 0x0341435d, 0x00395352, 0x02d2fef1, 0x012f7c5a, 0x02ca7f6a, 0x035fa225, 0x032f2269, 0x0142d294, 0x000218e6}}, Y: Field{[10]uint32{0x03d11e4d, 0x02762a79, 0x01c29677, 0x020d32e0, 0x03741da8, 0x02cfb5f3, 0x0179abdd, 0x038d68db, 0x022a445d, 0x000e44fa}}}, + {X: Field{[10]uint32{0x0395d5c2, 0x03469e2e, 0x02c61794, 0x020820eb, 0x02068572, 0x0169c6d2, 0x0319230b, 0x00e22fc5, 0x006c706a, 0x000a9623}}, Y: Field{[10]uint32{0x00c47592, 0x010b12db, 0x01b00968, 0x02bafeec, 0x0361f458, 0x01f847e5, 0x007f07ea, 0x03db6590, 0x01771a56, 0x002bc97b}}}, + {X: Field{[10]uint32{0x020a0cb6, 0x03a35500, 0x01fe337e, 0x005c08b8, 0x00a54597, 0x02697b6c, 0x02dba4ad, 0x02e6a2c9, 0x01ee8931, 0x0004def4}}, Y: Field{[10]uint32{0x03ceea62, 0x01228c05, 0x00b7ff58, 0x01788455, 0x01eaea10, 0x021f5da8, 0x03e9f0ee, 0x031df49c, 0x037b8197, 0x00337a7e}}}, + {X: Field{[10]uint32{0x02de2bbf, 0x02ef8cb4, 0x03b48d21, 0x03aa8782, 0x020f9b5f, 0x00ebcb0a, 0x01523711, 0x00c4f25c, 0x0345c686, 0x00119600}}, Y: Field{[10]uint32{0x0092ef64, 0x02a3ba7b, 0x030510a3, 0x023a85ae, 0x027edade, 0x019bd30a, 0x03bc79db, 0x027fecaf, 0x017bb632, 0x001d6f17}}}, + {X: Field{[10]uint32{0x011bd233, 0x017bd90e, 0x02a8556d, 0x03586ca0, 0x0102ef93, 0x009abd51, 0x02fc491c, 0x016b3660, 0x0252afaf, 0x00128524}}, Y: Field{[10]uint32{0x00cfe285, 0x00f5e3d8, 0x0259a3b5, 0x03f16897, 0x03bb9e83, 0x018fd752, 0x0256ea38, 0x016d8259, 0x00bc10b5, 0x003ef040}}}, + {X: Field{[10]uint32{0x01a01f18, 0x03e4bc85, 0x013faad0, 0x0225f65d, 0x0395bdf0, 0x011d7592, 0x00251313, 0x033e3c38, 0x01a6fc0b, 0x002253af}}, Y: Field{[10]uint32{0x035ec056, 0x0389b3d7, 0x003779fa, 0x000b8a65, 0x001e4ede, 0x01f4deb8, 0x01d02519, 0x01cb3f1a, 0x01501557, 0x002c97cc}}}, + {X: Field{[10]uint32{0x01eb032e, 0x029bab91, 0x0285a3c2, 0x029be796, 0x002deedc, 0x03f5c82b, 0x01ef1b2b, 0x02e244c3, 0x02930a91, 0x0039c362}}, Y: Field{[10]uint32{0x00d9f9cc, 0x03f7c453, 0x01b0a693, 0x02061e28, 0x02fe1026, 0x024472c0, 0x03b96ea4, 0x03fdad17, 0x0253a3b0, 0x002f4ebb}}}, + {X: Field{[10]uint32{0x02b36852, 0x0117eed3, 0x0047eeb2, 0x00fc4d75, 0x02118988, 0x02551ada, 0x016765bf, 0x02c77528, 0x01c3e5cc, 0x001f2c7f}}, Y: Field{[10]uint32{0x03ca582d, 0x0238b2a3, 0x014e0196, 0x0022a3fb, 0x00d18890, 0x0176fc96, 0x00edbe17, 0x017fdee0, 0x00d6becf, 0x000243b8}}}, + {X: Field{[10]uint32{0x03b9bfc1, 0x02fef0a1, 0x00685bf9, 0x0340c484, 0x00b39f57, 0x00cae416, 0x0090a214, 0x03685e3f, 0x02d80331, 0x001449e2}}, Y: Field{[10]uint32{0x03a66b6f, 0x03773a74, 0x00040536, 0x0387dd6f, 0x017bc1f9, 0x00976cf9, 0x03ad759b, 0x0399e230, 0x0147f39c, 0x00016abd}}}, + {X: Field{[10]uint32{0x00f59cdd, 0x03a64115, 0x036cee9f, 0x00215389, 0x030fee50, 0x00bf3c3c, 0x03563082, 0x00c1a122, 0x021fc52b, 0x003c3baa}}, Y: Field{[10]uint32{0x02124f02, 0x02ecb27c, 0x02e63ab3, 0x03ea0460, 0x00d51cf7, 0x02befacc, 0x01e5e016, 0x01c2f7ad, 0x009b944d, 0x000243fe}}}, + {X: Field{[10]uint32{0x03aeea71, 0x0376dac0, 0x01df6648, 0x02bc94ad, 0x00df5b4c, 0x01ed4700, 0x03670c22, 0x003f4984, 0x03f28bf9, 0x000dbf26}}, Y: Field{[10]uint32{0x03836683, 0x0038e8f9, 0x0075e13d, 0x031a7f64, 0x03d975ec, 0x0376eef9, 0x02c81614, 0x01b0a181, 0x0076f1ac, 0x00221f0e}}}, + {X: Field{[10]uint32{0x0391b68b, 0x037caa26, 0x03acdba4, 0x02757996, 0x02135c54, 0x030a7d8b, 0x00d2d041, 0x010db385, 0x026b0cf9, 0x001b8c78}}, Y: Field{[10]uint32{0x00d0e7ae, 0x0258622b, 0x01a85858, 0x021f426a, 0x0194c1af, 0x029de2cc, 0x037d9f77, 0x02f6aad7, 0x02849e63, 0x00008e25}}}, + {X: Field{[10]uint32{0x0198e864, 0x02499c87, 0x02eac357, 0x03613dd0, 0x003da9fa, 0x02b4cea8, 0x02a8a1ce, 0x030afeb1, 0x0249a4b1, 0x00314111}}, Y: Field{[10]uint32{0x03a1027b, 0x02c80769, 0x000af537, 0x0136e350, 0x0345fdc8, 0x0330450e, 0x03d13270, 0x025aedc5, 0x02d283e6, 0x001b4980}}}, + {X: Field{[10]uint32{0x0299ca28, 0x02013b1a, 0x011e6eca, 0x01331148, 0x03b9b2e8, 0x016801ee, 0x028e963b, 0x011356f6, 0x0271f13c, 0x0002a4cf}}, Y: Field{[10]uint32{0x02200faa, 0x003d967d, 0x014f5c1c, 0x01e55084, 0x00c3ce02, 0x00750bf7, 0x01712073, 0x038bdb99, 0x03bcec45, 0x0024c6fc}}}, + {X: Field{[10]uint32{0x00e4a58b, 0x037d977e, 0x021aa83a, 0x0342c4ca, 0x030b8559, 0x0045c0e2, 0x0298884e, 0x00b5886e, 0x021d840c, 0x002400fd}}, Y: Field{[10]uint32{0x00d30895, 0x03d5b73a, 0x01532b67, 0x02b1cd8c, 0x001388a1, 0x02e89a15, 0x02b7ecec, 0x00e54a7f, 0x0124f72b, 0x001431d4}}}, + {X: Field{[10]uint32{0x02a0a886, 0x02df0df2, 0x022c533f, 0x02a7a7cf, 0x02914e21, 0x005ca069, 0x038abdfc, 0x01c33218, 0x00183cb3, 0x003f201f}}, Y: Field{[10]uint32{0x00af00ba, 0x009286fa, 0x02cdee9d, 0x0341ae34, 0x021ccf6f, 0x03559095, 0x02f72639, 0x00756ea6, 0x013e75ac, 0x000eb1e7}}}, + {X: Field{[10]uint32{0x03ee9cbd, 0x024f33b7, 0x033c1862, 0x02b9f901, 0x03cd780d, 0x0142f352, 0x03b608f1, 0x02b08ed0, 0x02e4aca4, 0x000f41ca}}, Y: Field{[10]uint32{0x0265d9b6, 0x0355749f, 0x0385792f, 0x00519f68, 0x03f9c604, 0x00235d89, 0x00fc5630, 0x0327e2a6, 0x0043f721, 0x0001b679}}}, + {X: Field{[10]uint32{0x03f80dc0, 0x02aaf669, 0x01d3d106, 0x02f1eb2c, 0x03ba6e26, 0x008bebe2, 0x03c5eed5, 0x02d29f4a, 0x01947061, 0x003432e1}}, Y: Field{[10]uint32{0x03012e0a, 0x00e791de, 0x0092c9b7, 0x03c507c2, 0x038d7562, 0x006a61da, 0x0107b82d, 0x03730680, 0x0326e9d0, 0x003eff43}}}, + {X: Field{[10]uint32{0x035bc9fd, 0x01b496d8, 0x02e3241a, 0x02b090b3, 0x00267aad, 0x01c88730, 0x019f46cc, 0x03191079, 0x00ab6416, 0x00393b70}}, Y: Field{[10]uint32{0x03cdc71e, 0x0307f0d3, 0x02964b84, 0x01382ec1, 0x01c496fd, 0x020201f4, 0x00344829, 0x02d31012, 0x02e9cea7, 0x003d070e}}}, + {X: Field{[10]uint32{0x017eb4b2, 0x034caaf7, 0x01271557, 0x01046c2d, 0x02ffb806, 0x012f83d7, 0x01a83c88, 0x0244063d, 0x010b2d3d, 0x00188ced}}, Y: Field{[10]uint32{0x015dbcc5, 0x007bc661, 0x00399791, 0x00af7690, 0x01034a3a, 0x00a1622c, 0x030f21e3, 0x00ab095d, 0x0124ffdd, 0x00237eab}}}, + {X: Field{[10]uint32{0x02a19ab5, 0x012df714, 0x015df943, 0x017af78a, 0x03c427e6, 0x03a607da, 0x034e5447, 0x0197889e, 0x0162e272, 0x001b2800}}, Y: Field{[10]uint32{0x0154cce1, 0x015f9944, 0x03a5ce0f, 0x00583854, 0x03223e89, 0x02aece81, 0x03fe297b, 0x009f8290, 0x0363a8f2, 0x0034cfd7}}}, + {X: Field{[10]uint32{0x02fefcfc, 0x02199b8d, 0x005b3cd6, 0x024a2d84, 0x02d6c9d9, 0x0339f2c5, 0x01328ae7, 0x02357703, 0x01aa5d2a, 0x00300481}}, Y: Field{[10]uint32{0x02831d3e, 0x00061643, 0x03b453ad, 0x02affea6, 0x02cf2988, 0x02be2e9f, 0x03d6f6f6, 0x02025786, 0x0399c4f4, 0x002d9797}}}, + {X: Field{[10]uint32{0x02e0e155, 0x02de34b6, 0x00abb4e0, 0x025d29b1, 0x0107b8a5, 0x020143ce, 0x016fb195, 0x01a32d87, 0x03930e62, 0x0038e594}}, Y: Field{[10]uint32{0x00731737, 0x00a26fe0, 0x00828a2f, 0x02973683, 0x003f971f, 0x014e0ecb, 0x00048928, 0x03876460, 0x01462ed6, 0x0007de2b}}}, + {X: Field{[10]uint32{0x00b099ce, 0x0120889b, 0x004f8012, 0x03e142f6, 0x013dc03a, 0x03f6643f, 0x010c1a69, 0x02750c01, 0x00f3702a, 0x0009eff4}}, Y: Field{[10]uint32{0x00643de8, 0x0306c72f, 0x00f390fe, 0x03c36425, 0x00c49fd3, 0x0102f9f0, 0x030c0bce, 0x02baf466, 0x0360e8ca, 0x0008b85a}}}, + {X: Field{[10]uint32{0x0396a2f0, 0x0020281b, 0x023c6cbf, 0x00b1bdd7, 0x012a3717, 0x00a65ea2, 0x02c17771, 0x0255967b, 0x03c02331, 0x0020843e}}, Y: Field{[10]uint32{0x02afee8d, 0x03aa4791, 0x0109716d, 0x0095b469, 0x03bfacbb, 0x01787bac, 0x011d5528, 0x019b2eec, 0x03921011, 0x0007775d}}}, + {X: Field{[10]uint32{0x02347b5e, 0x034869d3, 0x03ab089c, 0x0197e2fb, 0x00ae4d50, 0x0178bfe0, 0x015298a2, 0x02f6037c, 0x02b65fcb, 0x00057319}}, Y: Field{[10]uint32{0x03937c97, 0x02b34c81, 0x0334b6dd, 0x00d1223e, 0x007b225b, 0x01585b4a, 0x03324c9f, 0x020a5b7a, 0x03e93574, 0x002512d1}}}, + {X: Field{[10]uint32{0x00c97976, 0x0006b825, 0x02c4bff8, 0x03f1c9b0, 0x02c7bb08, 0x0279b0d7, 0x021a482a, 0x0005a47a, 0x02a24596, 0x003adede}}, Y: Field{[10]uint32{0x02d1b1f6, 0x008fe08b, 0x003f227c, 0x01380413, 0x02f5596f, 0x00fc195a, 0x03d20e90, 0x01de47f2, 0x0170cc18, 0x00134ba5}}}, + {X: Field{[10]uint32{0x029ba12c, 0x0039f7d7, 0x01ea15fb, 0x001ad029, 0x0118e7c1, 0x025aa11a, 0x02436e09, 0x03a11308, 0x02fced29, 0x0011663e}}, Y: Field{[10]uint32{0x035e6093, 0x0388a3fc, 0x016297dc, 0x015796c2, 0x01978a85, 0x03dc5982, 0x0379dfe7, 0x03a8b0e5, 0x02b6d292, 0x0039cf65}}}, + {X: Field{[10]uint32{0x028600f7, 0x01fbacc6, 0x007058e3, 0x03f06443, 0x00e57d4d, 0x01be4386, 0x02a25917, 0x0396515c, 0x02863612, 0x001260d6}}, Y: Field{[10]uint32{0x03cfa531, 0x003b4df7, 0x017b9825, 0x028b9223, 0x02464c08, 0x003a034d, 0x023b147e, 0x00b30730, 0x013a0fbd, 0x0000edd8}}}, + {X: Field{[10]uint32{0x02335351, 0x0245bdf3, 0x005b9965, 0x02df464c, 0x033cbfe0, 0x0136f70c, 0x023177b0, 0x02019cca, 0x03ed1fcc, 0x000e9b5b}}, Y: Field{[10]uint32{0x026624ea, 0x021a4956, 0x01d0df29, 0x01586f47, 0x0111eb2b, 0x01fc4190, 0x00a6706d, 0x0185fc52, 0x018a314d, 0x00330fcf}}}, + {X: Field{[10]uint32{0x02d7a9f5, 0x035b1ece, 0x02a78fb0, 0x0093b9ee, 0x00f672a0, 0x0080d6dd, 0x012d2efb, 0x03f8c33a, 0x01866860, 0x00084821}}, Y: Field{[10]uint32{0x00bebbb7, 0x01d2825e, 0x01d7ce10, 0x038d07c9, 0x0396ff0c, 0x03dba75c, 0x02e8be11, 0x02c7b0ff, 0x01be0051, 0x002abc51}}}, + {X: Field{[10]uint32{0x026e4e06, 0x03681349, 0x03cc867c, 0x0209b3bf, 0x01833ac0, 0x0072c46e, 0x03d609c5, 0x00bc2598, 0x032ac9bb, 0x003e0644}}, Y: Field{[10]uint32{0x00891de5, 0x009c8e53, 0x02bb37e2, 0x03bdd91a, 0x00c52f48, 0x01012bbb, 0x03fd1a06, 0x00c172ab, 0x0238ec6a, 0x002c7f79}}}, + {X: Field{[10]uint32{0x02ec009d, 0x02a50df0, 0x00428423, 0x028484f1, 0x01168385, 0x02bb58b6, 0x0334d720, 0x0190310d, 0x01d88786, 0x0014db01}}, Y: Field{[10]uint32{0x036df0d5, 0x0224c976, 0x02f134b4, 0x03b87ea7, 0x01fd84dd, 0x020e8231, 0x03c2b43c, 0x037861a2, 0x0100d827, 0x001fd2f8}}}, + {X: Field{[10]uint32{0x01df722b, 0x02dceea8, 0x024bd650, 0x02c68e68, 0x0109de2f, 0x00b22a16, 0x02e3ed34, 0x036dd8df, 0x023ec4c6, 0x0010ca04}}, Y: Field{[10]uint32{0x03a40857, 0x0275fa58, 0x01b1594c, 0x00403d75, 0x014ee11f, 0x02d3e1bd, 0x0222fa71, 0x01dd4f9a, 0x02ea0127, 0x00207000}}}, + {X: Field{[10]uint32{0x012a5f17, 0x00369a04, 0x01a08155, 0x00cb543a, 0x016a85fc, 0x003e6170, 0x029e5360, 0x0265461a, 0x02fef852, 0x003cf855}}, Y: Field{[10]uint32{0x008892d2, 0x037426ad, 0x010915d5, 0x0339d063, 0x03a2f441, 0x00d8ae14, 0x0167e83c, 0x0039bd97, 0x026b56ff, 0x00247ff5}}}, + {X: Field{[10]uint32{0x03456cc9, 0x00aa3622, 0x030e6824, 0x02bfabc0, 0x006645a1, 0x0153102b, 0x028a716a, 0x00fd0b4b, 0x035984e1, 0x000cae9c}}, Y: Field{[10]uint32{0x00b4c6f5, 0x022c60ef, 0x02200f86, 0x017279f9, 0x03f05576, 0x03bc9324, 0x02ab3178, 0x02c542a0, 0x031e1c32, 0x0019fff3}}}, + {X: Field{[10]uint32{0x01829311, 0x02f02b16, 0x03dddcca, 0x024c62ae, 0x029c868b, 0x01362d2a, 0x00674cf6, 0x00417946, 0x033a043d, 0x0032e70a}}, Y: Field{[10]uint32{0x002b691f, 0x0181fba1, 0x015db242, 0x017ef4af, 0x01834bea, 0x02721674, 0x013ac479, 0x001daf7b, 0x02f2233f, 0x0007f19f}}}, + {X: Field{[10]uint32{0x029234f0, 0x028c6f4b, 0x01e856ef, 0x015eaf06, 0x035effa9, 0x0026f34e, 0x0349695e, 0x01c1c0c8, 0x0058b7bf, 0x003853ca}}, Y: Field{[10]uint32{0x00e08bdb, 0x03457937, 0x01761f3c, 0x00352a25, 0x02cf8cbf, 0x00357fc1, 0x03cbc258, 0x03f4e620, 0x009dd3f3, 0x000f8139}}}, + {X: Field{[10]uint32{0x03550d82, 0x02dce221, 0x01e010d7, 0x03b16102, 0x0274810d, 0x025ffc09, 0x0078113c, 0x02e38c33, 0x037b1c27, 0x00055afa}}, Y: Field{[10]uint32{0x00bc5371, 0x009ea464, 0x0017b16e, 0x0318305b, 0x013a8e92, 0x0164e664, 0x02adf2fd, 0x01bb20d4, 0x030a8021, 0x0031c45c}}}, + {X: Field{[10]uint32{0x0055d600, 0x0262d6cb, 0x013557b7, 0x0267e00e, 0x01a24a33, 0x028b76a8, 0x000e4959, 0x01a1912e, 0x03e6b9b4, 0x003797a9}}, Y: Field{[10]uint32{0x00d48ee8, 0x00f18563, 0x037d53a0, 0x019c8adf, 0x02b9b1de, 0x0060b354, 0x00a9d24e, 0x008f4b70, 0x0027e6a8, 0x00224068}}}, + {X: Field{[10]uint32{0x0017c3c7, 0x02e78ffb, 0x01adeb79, 0x005284a0, 0x00aea074, 0x02cafc3b, 0x037312e7, 0x03b51896, 0x03688bfa, 0x0023b774}}, Y: Field{[10]uint32{0x0155da7b, 0x03b6db1e, 0x032316d8, 0x02c5713d, 0x0359b885, 0x0088f95e, 0x00a48a89, 0x0074d357, 0x02f92617, 0x000b6d0e}}}, + {X: Field{[10]uint32{0x00b1d4e3, 0x02b4f5fc, 0x02b85fb2, 0x003fbe57, 0x0187872e, 0x0088dfb6, 0x02489ae2, 0x03477a3e, 0x036a665a, 0x001725c6}}, Y: Field{[10]uint32{0x038b1f66, 0x031a4e97, 0x039a6c4f, 0x01ecc0b4, 0x01aa8d4d, 0x00ae8076, 0x0332ff74, 0x02bdbc2b, 0x019837c2, 0x00135c7d}}}, + {X: Field{[10]uint32{0x02b9e228, 0x03edc291, 0x0076885c, 0x03bcd095, 0x01bd3586, 0x00aa3c73, 0x0366589a, 0x00adab56, 0x013c2821, 0x003b7ec9}}, Y: Field{[10]uint32{0x02616c00, 0x02ca892c, 0x00c1d7f7, 0x0380944d, 0x02594e42, 0x03cc18a4, 0x00b26b84, 0x007da6e3, 0x0208b7e8, 0x000f96d9}}}, + {X: Field{[10]uint32{0x01525c13, 0x0315adf7, 0x03384737, 0x031acb19, 0x03d2373c, 0x00895d2e, 0x0163dd4e, 0x01dcb36c, 0x024ae127, 0x0010e57c}}, Y: Field{[10]uint32{0x00103526, 0x02f99304, 0x0047a819, 0x037006d1, 0x00676581, 0x03dce55d, 0x0096913d, 0x0030b192, 0x03254c80, 0x002eb1b9}}}, + {X: Field{[10]uint32{0x006866f5, 0x03c3fc65, 0x023eb182, 0x014d7d8a, 0x038c7823, 0x017d6a1f, 0x0113b64b, 0x019adfe2, 0x02d573a7, 0x00204402}}, Y: Field{[10]uint32{0x01a00c73, 0x02d05c3a, 0x029c9d28, 0x02ea61c2, 0x01c6afb8, 0x01477675, 0x0068f7d0, 0x00226674, 0x016e325b, 0x0014b2b0}}}, + {X: Field{[10]uint32{0x0395120f, 0x008d1efa, 0x02e407f7, 0x017b9777, 0x01dee3a0, 0x0285085b, 0x02358c3a, 0x020519ab, 0x01514116, 0x003f4e81}}, Y: Field{[10]uint32{0x028ee5b7, 0x01ef34f6, 0x03250e4c, 0x001d6339, 0x0011a3c6, 0x01f812c8, 0x01b7b88b, 0x02c4aae2, 0x030d45ce, 0x000abcbc}}}, + {X: Field{[10]uint32{0x02435ff9, 0x03f0fbf9, 0x018fa4e3, 0x00caaf46, 0x0276d1a0, 0x0285f5b0, 0x0305b6df, 0x03bbe8ff, 0x0358a7ec, 0x0005e956}}, Y: Field{[10]uint32{0x01574d4f, 0x026fdc6e, 0x02240bc9, 0x02915f81, 0x02418f35, 0x01c7c14d, 0x01cee72e, 0x019f043f, 0x0158a3ad, 0x0035c9ce}}}, + {X: Field{[10]uint32{0x03789b6d, 0x02d0224e, 0x0003bc49, 0x00157b5c, 0x02793fd0, 0x0057a2c8, 0x01c73aee, 0x017a8231, 0x03b8e2ca, 0x0021c32d}}, Y: Field{[10]uint32{0x03e67aa3, 0x003b8106, 0x01cc6a7b, 0x03b2b542, 0x0104badb, 0x0089912a, 0x017a9bce, 0x0072bc9b, 0x03407b70, 0x0030cf22}}}, + {X: Field{[10]uint32{0x0271f8a7, 0x00b306d3, 0x00897545, 0x00db6039, 0x03ffbf7c, 0x01432829, 0x0053c89a, 0x03bc02b7, 0x01fcdc46, 0x003e5471}}, Y: Field{[10]uint32{0x0392c95f, 0x0081ce31, 0x02648751, 0x02495e4b, 0x01c1705b, 0x0137e796, 0x0064d7d2, 0x033090c2, 0x00217849, 0x001ab8be}}}, + {X: Field{[10]uint32{0x02a0caf1, 0x01240b25, 0x02d6131e, 0x00a858df, 0x036cbd83, 0x0062b68f, 0x011bb06a, 0x0319dab8, 0x037f3b92, 0x002bae01}}, Y: Field{[10]uint32{0x03cc1e35, 0x00cb87ab, 0x00cfde02, 0x01f42cdf, 0x036c8a6d, 0x02fcc5ff, 0x0275fb98, 0x0290c253, 0x011df5d4, 0x000a7d07}}}, + {X: Field{[10]uint32{0x013b78f9, 0x0080d7cc, 0x0260cb9d, 0x022d6577, 0x038482b7, 0x036161f0, 0x0118a7e5, 0x00b9601b, 0x01975d2f, 0x00351bd3}}, Y: Field{[10]uint32{0x006392f0, 0x00d246ba, 0x0233c105, 0x02650c5b, 0x02f704e1, 0x00c7fb90, 0x02154ef0, 0x0045d8e5, 0x01aa3bdc, 0x002575e0}}}, + {X: Field{[10]uint32{0x0229b201, 0x0297c71e, 0x02eaf4f3, 0x025dcf1d, 0x03af810b, 0x0126e7b0, 0x021b54ac, 0x03627cb8, 0x03444b4b, 0x00001abe}}, Y: Field{[10]uint32{0x02bf932f, 0x0186089b, 0x0334eaf0, 0x00342fb4, 0x0364db46, 0x00e22acd, 0x00ed90d1, 0x02d3384d, 0x001fd7d3, 0x000d40a4}}}, + {X: Field{[10]uint32{0x03d86976, 0x00bdfb7a, 0x00394093, 0x01533ebe, 0x01e66349, 0x0161ebd7, 0x03f60869, 0x005c0e9e, 0x0182a38b, 0x0017c0b9}}, Y: Field{[10]uint32{0x017afec2, 0x01a8014b, 0x00a7def4, 0x00328ada, 0x02ccfa5d, 0x0102e3f8, 0x00b06bf7, 0x029e5ac9, 0x00de92f3, 0x0028121f}}}, + {X: Field{[10]uint32{0x020599fe, 0x014b4e82, 0x02e33c66, 0x01d67155, 0x03ad70eb, 0x00d5199f, 0x007b885f, 0x00b3b568, 0x00826043, 0x0009909d}}, Y: Field{[10]uint32{0x0028ce85, 0x03e163ae, 0x00c62949, 0x033db811, 0x03a63867, 0x00d0114e, 0x02ea7379, 0x00e0bf5d, 0x00fe2560, 0x0004648e}}}, + {X: Field{[10]uint32{0x029f91dc, 0x01999811, 0x037ff2cd, 0x029f8796, 0x014f03a5, 0x017a0dfb, 0x0319a7dd, 0x02b7694a, 0x025ad327, 0x001aca8f}}, Y: Field{[10]uint32{0x0254c6d9, 0x0012f3a2, 0x0257a22f, 0x0197a35f, 0x01354ed2, 0x036a7a51, 0x03365601, 0x020be83c, 0x012606b4, 0x000be7d1}}}, + {X: Field{[10]uint32{0x035daa79, 0x000d1710, 0x03dc4fcc, 0x01df5d25, 0x02e5fbaf, 0x03bc4fa2, 0x010934dd, 0x013eeaac, 0x008b7e21, 0x0009622e}}, Y: Field{[10]uint32{0x01435bbf, 0x02f04531, 0x035e151e, 0x013eb2e8, 0x0261ca64, 0x03c69476, 0x03f142ce, 0x01b53235, 0x010bd3ba, 0x000f973e}}}, + {X: Field{[10]uint32{0x02551a93, 0x0173fe77, 0x03fcbcff, 0x011b0830, 0x02e4e3d8, 0x02805012, 0x00178b40, 0x00bbbfea, 0x01469285, 0x00365210}}, Y: Field{[10]uint32{0x02a6d5a4, 0x020962e5, 0x024ccdbb, 0x02f65a61, 0x0213ea0a, 0x02b66618, 0x00a12196, 0x03109d0d, 0x017fe628, 0x00356c3f}}}, + {X: Field{[10]uint32{0x030de2ff, 0x02713a8e, 0x025eb9fe, 0x01e19f3b, 0x005ccc1e, 0x02dbd1d5, 0x0364b1c9, 0x00821c32, 0x03dc3a2f, 0x00173e07}}, Y: Field{[10]uint32{0x01bc0d7d, 0x023ee305, 0x031131b7, 0x0094036b, 0x01e7ff31, 0x03b1cd1c, 0x01dc7005, 0x023977df, 0x031cf6bb, 0x00382c2a}}}, + {X: Field{[10]uint32{0x03e879a7, 0x01999836, 0x023203b8, 0x01c459de, 0x00f8ed24, 0x004cb1a5, 0x00b3f174, 0x03f6d5c1, 0x037eb719, 0x00106d3b}}, Y: Field{[10]uint32{0x0221c85f, 0x0024ee0d, 0x0081ae12, 0x02a8722a, 0x009f44c2, 0x03ab0669, 0x028b459e, 0x0088d736, 0x01b1cbae, 0x0029bf99}}}, + {X: Field{[10]uint32{0x03117af7, 0x01c26a6e, 0x03bdc5c2, 0x00fd01bc, 0x007a4c0a, 0x019013b2, 0x01d16918, 0x02478aa3, 0x032c41f6, 0x0010fb55}}, Y: Field{[10]uint32{0x02481da3, 0x03481cfe, 0x03ac3fd4, 0x024c36be, 0x0390a2b0, 0x02f9351d, 0x02cbbab7, 0x000cd1ae, 0x01b890b4, 0x002dee78}}}, + {X: Field{[10]uint32{0x03397de3, 0x00e39186, 0x02e421c3, 0x0107a17e, 0x0281722b, 0x00bc6557, 0x00bb5260, 0x021a98c5, 0x02192230, 0x00138042}}, Y: Field{[10]uint32{0x03a65fa2, 0x016689fa, 0x02ec4a61, 0x038dc311, 0x00283b44, 0x02f42ee3, 0x0076e7b3, 0x017b6112, 0x011c0347, 0x003c34fc}}}, + {X: Field{[10]uint32{0x0211f36b, 0x03510bfb, 0x01e2241d, 0x00a9f4d5, 0x0045e15d, 0x007b7361, 0x03c385e8, 0x01af3136, 0x00bb7fc8, 0x002cd827}}, Y: Field{[10]uint32{0x009c5f68, 0x00643237, 0x018e20e6, 0x006aa85a, 0x00c30891, 0x01deeea2, 0x00017dc9, 0x00d3fe01, 0x01aca3df, 0x002181f9}}}, + {X: Field{[10]uint32{0x03965b4e, 0x01b90fb7, 0x009d1df9, 0x02dac9c9, 0x02d1bdd6, 0x036c4497, 0x0168cdf6, 0x03ef4def, 0x00b20543, 0x00111798}}, Y: Field{[10]uint32{0x03715fd1, 0x0373c2f1, 0x025b00b5, 0x0148a1e9, 0x03c65f8b, 0x0248b9c4, 0x03fdc7cf, 0x02d1eafa, 0x018a8c4a, 0x00297e91}}}, + {X: Field{[10]uint32{0x00f50fc9, 0x02ed90c4, 0x0364cf9d, 0x01278032, 0x01be875b, 0x03c53062, 0x0359a7be, 0x03267e1a, 0x02279264, 0x001c27e0}}, Y: Field{[10]uint32{0x00960d10, 0x00540c56, 0x0362883f, 0x03ffeaab, 0x013d4903, 0x01a39379, 0x029064b4, 0x034afa29, 0x03f0cd28, 0x0005a009}}}, + {X: Field{[10]uint32{0x01fb4ba3, 0x019ffe4a, 0x00cdbe15, 0x017befc6, 0x008a2e9d, 0x00ccfc87, 0x012e725a, 0x00902e89, 0x000dcbd1, 0x0018aa88}}, Y: Field{[10]uint32{0x020a1347, 0x038fca27, 0x021b7b18, 0x00ac4b7b, 0x001ec328, 0x010f906b, 0x0106b468, 0x02f6f12e, 0x016c7017, 0x00066abf}}}, + {X: Field{[10]uint32{0x0082c09e, 0x03c42b2e, 0x02e11f38, 0x01ff2206, 0x01e12398, 0x000b8aae, 0x01f23898, 0x01191bea, 0x01588ed5, 0x000ae9ce}}, Y: Field{[10]uint32{0x035a25a6, 0x03cf848d, 0x00423721, 0x024ddd46, 0x03d8f8a1, 0x012004d4, 0x02cc45d3, 0x0262bbe1, 0x021c9c0a, 0x003cdf6a}}}, + {X: Field{[10]uint32{0x01005de8, 0x00539bde, 0x02397073, 0x0380d64a, 0x01e266e9, 0x02d677f8, 0x01c0f549, 0x02da6ab9, 0x01cce8fb, 0x00219cae}}, Y: Field{[10]uint32{0x0305af65, 0x025ea1a6, 0x01aa399a, 0x01d699ad, 0x02c411e8, 0x03efe7ab, 0x00aac680, 0x0071e6b7, 0x036aefb6, 0x00083611}}}, + {X: Field{[10]uint32{0x01ab6ab5, 0x015c7a2f, 0x000eda26, 0x03984ccc, 0x031f32be, 0x017b9705, 0x03dbac10, 0x00a665e7, 0x00028420, 0x000cd32c}}, Y: Field{[10]uint32{0x02a574d4, 0x01686216, 0x0038d96e, 0x02d92759, 0x00e4e972, 0x01e7172e, 0x0345bfd5, 0x021e3d1a, 0x019f3da7, 0x002209f6}}}, + {X: Field{[10]uint32{0x01ac6d4d, 0x03c8a68d, 0x01afe602, 0x01391efc, 0x00e9f25f, 0x03d93e07, 0x00cad6a2, 0x03b01cd5, 0x0207d260, 0x000cacc3}}, Y: Field{[10]uint32{0x003c0427, 0x01821d0f, 0x03941856, 0x0223cc18, 0x025c5e36, 0x0049b113, 0x02904181, 0x0241e1bc, 0x030d64ee, 0x001c7ff3}}}, + {X: Field{[10]uint32{0x039a8451, 0x00798028, 0x03a05076, 0x000970e3, 0x033b5ce4, 0x0267a6fe, 0x02401ff2, 0x01398d0f, 0x02587a4b, 0x00394265}}, Y: Field{[10]uint32{0x03bb2ece, 0x00b1196c, 0x03241f13, 0x0059c3f1, 0x00683a39, 0x031acce0, 0x02acccf5, 0x026a1a53, 0x02a86542, 0x001ec0e0}}}, + {X: Field{[10]uint32{0x01d6477d, 0x01ba4c39, 0x026abd31, 0x0084a76d, 0x01ca6841, 0x02cf5e1b, 0x02ea0353, 0x00e6f382, 0x004c2bf5, 0x002ce1cb}}, Y: Field{[10]uint32{0x0101e285, 0x01342402, 0x034f9242, 0x01c48b43, 0x0159391c, 0x02775058, 0x037ed1fa, 0x0321bcec, 0x00afe4c8, 0x0001f381}}}, + {X: Field{[10]uint32{0x0135d07b, 0x0101b7a6, 0x00908f3b, 0x01d28b7e, 0x0006095e, 0x027d3106, 0x0014d964, 0x038eacb9, 0x03df9156, 0x0034ad5b}}, Y: Field{[10]uint32{0x03e3b23f, 0x00ed403b, 0x012aaadc, 0x02bcdc55, 0x03b06a33, 0x011aa397, 0x00b49259, 0x02315aa1, 0x001b6766, 0x00110f0b}}}, + {X: Field{[10]uint32{0x037fbacb, 0x02c56a7c, 0x0208115d, 0x03f58ac2, 0x034e8288, 0x0327d06c, 0x03f32e1e, 0x031d9648, 0x027e1074, 0x0003da61}}, Y: Field{[10]uint32{0x013fca16, 0x01417190, 0x00e58cd0, 0x039dbf74, 0x0368709b, 0x01c6708a, 0x0204c6ed, 0x02945a73, 0x02252a11, 0x003f5b1b}}}, + {X: Field{[10]uint32{0x01e64988, 0x01c362ae, 0x02579626, 0x0261556d, 0x00cae238, 0x0223f33b, 0x00778c86, 0x004706b6, 0x00b4a9ab, 0x002f060c}}, Y: Field{[10]uint32{0x022e3c81, 0x0256b130, 0x01ea5b6d, 0x032c4b6e, 0x028e95cd, 0x00f4323c, 0x039a0faf, 0x0184cc65, 0x0089f3c4, 0x002d8910}}}, + {X: Field{[10]uint32{0x038dbafc, 0x0392d1fc, 0x003b7445, 0x007a887d, 0x02126cfa, 0x03357ee4, 0x004bbe83, 0x027f6a63, 0x0221dc72, 0x003eaeab}}, Y: Field{[10]uint32{0x002d8cdc, 0x00cd8016, 0x01fbcc4c, 0x02eacb02, 0x03177ce1, 0x035abb67, 0x03513b3e, 0x0160cb1c, 0x03756446, 0x0006d5a5}}}, + {X: Field{[10]uint32{0x011f8bd4, 0x00f65b5e, 0x0157b547, 0x000c85b7, 0x03bcd3fc, 0x00923638, 0x012497ea, 0x0130f7e4, 0x01014d5d, 0x0024ce18}}, Y: Field{[10]uint32{0x00936725, 0x00c3e8db, 0x02d951d6, 0x00ae3a01, 0x019e57f2, 0x0129ab5c, 0x033add54, 0x0058f13f, 0x016ac141, 0x000f63f2}}}, + {X: Field{[10]uint32{0x02fd07f8, 0x02a0ffa9, 0x007f2094, 0x00934c05, 0x02da0a43, 0x031ac61b, 0x0146b8ee, 0x00a08165, 0x015f85c4, 0x00314c4b}}, Y: Field{[10]uint32{0x01d2992f, 0x03e01b11, 0x0251beda, 0x03a2cd6d, 0x00332898, 0x035511cd, 0x03be12c8, 0x001d5948, 0x022a79ba, 0x003e2b9b}}}, + {X: Field{[10]uint32{0x0203b057, 0x01202d7c, 0x03388558, 0x00a046a9, 0x01b73b11, 0x02808bd0, 0x0375c4dd, 0x00bd01b6, 0x009652c5, 0x002823c9}}, Y: Field{[10]uint32{0x033eb2e5, 0x0371d14b, 0x00ccc845, 0x0094df13, 0x02191d7a, 0x03b3f8f2, 0x01aa9251, 0x0387657a, 0x03de9ab5, 0x0028e5b1}}}, + {X: Field{[10]uint32{0x00f634df, 0x01792f50, 0x0205bc52, 0x02d626e2, 0x02a036e0, 0x00289469, 0x034b34f0, 0x01be9829, 0x030fe8df, 0x0024f54c}}, Y: Field{[10]uint32{0x01838756, 0x031582dc, 0x03a08f5a, 0x019df454, 0x000c4df5, 0x0321f68a, 0x02774f77, 0x00939575, 0x02ea10f4, 0x0032857e}}}, + {X: Field{[10]uint32{0x02b51fa2, 0x0157e4aa, 0x024f6170, 0x004c3c16, 0x005c35b8, 0x03d94844, 0x010a9941, 0x02dcafa1, 0x03ccdfca, 0x0001188a}}, Y: Field{[10]uint32{0x03ca2d4f, 0x02d07a75, 0x01a8cd29, 0x02918259, 0x00e883d2, 0x0256d4f2, 0x01cd2456, 0x02c95b49, 0x002d31ee, 0x0036581c}}}, + {X: Field{[10]uint32{0x00ef9fe5, 0x03b821b8, 0x00d8807a, 0x00fb45f2, 0x010fb6c8, 0x004e30c3, 0x03a58728, 0x02176652, 0x036c7dd8, 0x0028c980}}, Y: Field{[10]uint32{0x02cb9bf7, 0x00f359cc, 0x01a53489, 0x03871d79, 0x03456a6c, 0x01da2685, 0x00aafcde, 0x028554c7, 0x02693719, 0x002d1973}}}, + {X: Field{[10]uint32{0x02ef77a5, 0x0082d69f, 0x00946b1d, 0x02a6129b, 0x03f3d5e7, 0x03e97154, 0x030c887b, 0x01f9e5c6, 0x017e1963, 0x0008d510}}, Y: Field{[10]uint32{0x01f4bd4b, 0x027d22ca, 0x02d4d216, 0x014cf3d3, 0x01ea7400, 0x03cd3d02, 0x014fbf99, 0x034f2ec9, 0x0321b6ea, 0x002056a5}}}, + {X: Field{[10]uint32{0x03ce6fca, 0x01f322ed, 0x01f9f2b0, 0x00677757, 0x033a4078, 0x008e0435, 0x01a746b0, 0x005d3d73, 0x016dfc53, 0x00274d1b}}, Y: Field{[10]uint32{0x0376c806, 0x00acd5e5, 0x029b9851, 0x000f7c23, 0x014a199b, 0x007a4154, 0x01a8ff9f, 0x00f97295, 0x006b6429, 0x0026db30}}}, + {X: Field{[10]uint32{0x0148dd01, 0x028ccc3f, 0x00564bb5, 0x02d01542, 0x03bba638, 0x03af8843, 0x01f000ad, 0x029edfe5, 0x038ec643, 0x001cf20a}}, Y: Field{[10]uint32{0x0005b614, 0x03c4da42, 0x02f075ff, 0x01737c35, 0x027d2acf, 0x0132caf6, 0x035f61b8, 0x017187f8, 0x0299a088, 0x003ffc55}}}, + {X: Field{[10]uint32{0x00798ac8, 0x00e72fff, 0x011afc9b, 0x02fdb28a, 0x010f2d29, 0x02141ae5, 0x01316728, 0x0357473e, 0x01d5a0b2, 0x0024091a}}, Y: Field{[10]uint32{0x03c3ade4, 0x00f7a247, 0x030d4fa6, 0x036eafa2, 0x03cd78ad, 0x032bf93f, 0x02378bff, 0x01da74d0, 0x0011d71c, 0x0000d5b4}}}, + {X: Field{[10]uint32{0x03110637, 0x03f88f87, 0x00371b1e, 0x03a7f540, 0x00dc4013, 0x0066e251, 0x0123afb8, 0x021bc14d, 0x00fb3a0c, 0x00399c28}}, Y: Field{[10]uint32{0x020b31b8, 0x019677c9, 0x0250a9bf, 0x0382772c, 0x03272557, 0x001f967b, 0x03db5a3d, 0x0372c855, 0x036bcd13, 0x00021a44}}}, + {X: Field{[10]uint32{0x0205c395, 0x034f56e2, 0x005fcb9a, 0x03961255, 0x01b57f11, 0x033ee732, 0x0368e270, 0x02079ac3, 0x006d5265, 0x003cffbc}}, Y: Field{[10]uint32{0x01b8f553, 0x01d55106, 0x012f4ff3, 0x034412c2, 0x01570752, 0x03e97eef, 0x0045176e, 0x0083b313, 0x01971444, 0x000cacba}}}, + {X: Field{[10]uint32{0x016a05bd, 0x02974e4e, 0x02cac70c, 0x02711c74, 0x00f942c0, 0x03306762, 0x00fc28a8, 0x03611158, 0x02633958, 0x001ca8dd}}, Y: Field{[10]uint32{0x035ee1ad, 0x03d1521c, 0x03ba8503, 0x011834bd, 0x01729ce8, 0x000ba363, 0x004b3b84, 0x0041c3da, 0x030e6e12, 0x0037a6c6}}}, + {X: Field{[10]uint32{0x005300b0, 0x00def620, 0x01ae22b6, 0x013ea133, 0x00417289, 0x0243379a, 0x019c3a81, 0x01f7bd04, 0x02d9c43b, 0x000e2de2}}, Y: Field{[10]uint32{0x03d01e6f, 0x039d2a2c, 0x01c8423d, 0x01a77214, 0x010de7cc, 0x02ffccba, 0x0204f175, 0x017d461c, 0x01676c4f, 0x00028605}}}, + {X: Field{[10]uint32{0x0334752e, 0x00563fca, 0x013af68e, 0x0224232f, 0x03540e2e, 0x00653ec8, 0x026fac9e, 0x01f14db1, 0x02c81d2e, 0x0036e5a2}}, Y: Field{[10]uint32{0x02b48a0a, 0x03969cea, 0x00769a24, 0x023bf453, 0x0104179e, 0x018d1c9c, 0x02b4af0a, 0x025caeb1, 0x03ab79d9, 0x00135715}}}, + {X: Field{[10]uint32{0x00aad318, 0x0174d9ea, 0x02435a14, 0x03e65f1c, 0x02505dd4, 0x007b4d6c, 0x0114f28c, 0x01360dc4, 0x02792d3a, 0x000ab385}}, Y: Field{[10]uint32{0x0226f625, 0x0239cfcd, 0x03539cc8, 0x03be86b8, 0x010405b0, 0x01a17db4, 0x0063b87f, 0x01d3933b, 0x012a2468, 0x0014c50c}}}, + {X: Field{[10]uint32{0x01bae108, 0x03e4ebcf, 0x0277e852, 0x0060958c, 0x00bb1fda, 0x0189c9f1, 0x00a46008, 0x0037b76e, 0x02690c39, 0x000cb603}}, Y: Field{[10]uint32{0x00dc7c07, 0x0155ea58, 0x01d08cbd, 0x0048f67c, 0x03bc1c3e, 0x0207df36, 0x03cb3f81, 0x0341a9b4, 0x016fea89, 0x0000f1f6}}}, + {X: Field{[10]uint32{0x02ee3908, 0x0229021d, 0x01521d8e, 0x00379497, 0x03f1bf05, 0x01176cf2, 0x00e61a29, 0x01ad018a, 0x028ae7fe, 0x000fbd27}}, Y: Field{[10]uint32{0x01a123f2, 0x00778200, 0x0092bd3d, 0x009d630f, 0x033ff72d, 0x018c456b, 0x0031b54d, 0x017ec935, 0x035c62f4, 0x0010e071}}}, + {X: Field{[10]uint32{0x009722da, 0x009d508f, 0x006405aa, 0x03996797, 0x000e280e, 0x032235ec, 0x03517d41, 0x00b340e6, 0x00d5cdb8, 0x00214e02}}, Y: Field{[10]uint32{0x037e8f5e, 0x0308a7d7, 0x0200fb4d, 0x000e4b50, 0x023ed18d, 0x005c8890, 0x00a652f8, 0x025899a6, 0x00449b2a, 0x003059df}}}, + {X: Field{[10]uint32{0x03c8584f, 0x0076de07, 0x02f4958c, 0x03cca6b7, 0x03306ee4, 0x02187f32, 0x03520bd8, 0x0017fa15, 0x0083490c, 0x0015cbf5}}, Y: Field{[10]uint32{0x0013f4a5, 0x00000d8d, 0x03ca0be3, 0x0156cc7a, 0x00d38e91, 0x02ced865, 0x00107c06, 0x008c0b3c, 0x01061039, 0x0020ab32}}}, + {X: Field{[10]uint32{0x036e1386, 0x024d60cd, 0x0248138c, 0x01135164, 0x00fa7713, 0x013655b9, 0x02a9a2dd, 0x0328c5d6, 0x03b29aa8, 0x002c72ea}}, Y: Field{[10]uint32{0x02292ec9, 0x0234b759, 0x015fcbc5, 0x03d80300, 0x01265cb2, 0x01050270, 0x021de030, 0x03f7c1ae, 0x00f17f9a, 0x00222330}}}, + {X: Field{[10]uint32{0x036bab20, 0x02eee60b, 0x001a16dd, 0x00359c1c, 0x012c5c96, 0x01269ba0, 0x000a65a1, 0x00c4d1d6, 0x03924239, 0x003e15b2}}, Y: Field{[10]uint32{0x00536674, 0x02540452, 0x03869c55, 0x030b5758, 0x0377d9d6, 0x01704477, 0x01f580f6, 0x0003a664, 0x01ba192c, 0x0030cd44}}}, + {X: Field{[10]uint32{0x0273920e, 0x03f0e9fb, 0x00e230ff, 0x03edb04a, 0x039eed92, 0x015aeece, 0x0042887b, 0x004a78b0, 0x00d4773e, 0x00385807}}, Y: Field{[10]uint32{0x001054ca, 0x02805bcc, 0x00ec96f4, 0x02328142, 0x000a7864, 0x026e87f3, 0x0247c714, 0x01de5bb8, 0x00c8a38c, 0x000601d2}}}, + {X: Field{[10]uint32{0x027c7e72, 0x024a38cd, 0x01534a98, 0x02ae5d22, 0x00e8b37c, 0x0032fc76, 0x02206a5b, 0x0185dd72, 0x00d45ffb, 0x00263b88}}, Y: Field{[10]uint32{0x0273c610, 0x02391958, 0x03c30697, 0x03811486, 0x01854b70, 0x023f1017, 0x02b5e6e8, 0x036d45a2, 0x00e1ea42, 0x000b7d2b}}}, + {X: Field{[10]uint32{0x01fe179f, 0x02b53bb7, 0x00246ec0, 0x0107d6b3, 0x035417bc, 0x03b74784, 0x01cfe95b, 0x024168c7, 0x0257acde, 0x0011e5b2}}, Y: Field{[10]uint32{0x00a367a8, 0x0258a87c, 0x0015f8ff, 0x028d18fe, 0x015bc565, 0x0159308e, 0x03637e59, 0x00e00acd, 0x0122395a, 0x001d04fd}}}, + {X: Field{[10]uint32{0x02341200, 0x01a2f746, 0x01d4006c, 0x00da6aef, 0x03cfd555, 0x01b1f7e7, 0x03627fd5, 0x02c2e356, 0x006438ad, 0x002cd9f2}}, Y: Field{[10]uint32{0x028fba51, 0x0092678b, 0x0349dfd2, 0x03d72715, 0x02b4986c, 0x0089a1c0, 0x002f3657, 0x03a059e6, 0x03440b99, 0x00300d91}}}, + {X: Field{[10]uint32{0x00914d29, 0x01fd29e2, 0x01386a74, 0x00293c9f, 0x00e74076, 0x00837a11, 0x02244c00, 0x037b3df8, 0x004b723d, 0x0036cda2}}, Y: Field{[10]uint32{0x0179e023, 0x03ccccdf, 0x023b40e5, 0x0093f683, 0x03fef90e, 0x037bc3ca, 0x01e07507, 0x00e8f0a8, 0x03cc2a74, 0x0022b921}}}, + {X: Field{[10]uint32{0x01a316c4, 0x0171a826, 0x03123ccf, 0x00b9b1b0, 0x0176b473, 0x007bbd3e, 0x02458213, 0x0084aea3, 0x0018f71c, 0x001965c6}}, Y: Field{[10]uint32{0x013604db, 0x001dd538, 0x035db4cd, 0x00c71c0d, 0x01526a28, 0x00dd8446, 0x0087f391, 0x01434cec, 0x03913533, 0x001057d9}}}, + {X: Field{[10]uint32{0x00ebd65a, 0x0332b1d8, 0x01338fcb, 0x00fe5868, 0x01905390, 0x01fadb36, 0x0182a639, 0x03d2c908, 0x033a13a8, 0x003cbd3a}}, Y: Field{[10]uint32{0x00ef9ca8, 0x0032bf82, 0x00b6e795, 0x00fce8ef, 0x0018811b, 0x03aae3af, 0x02dc8b74, 0x02535c82, 0x027b667e, 0x00295d75}}}, + {X: Field{[10]uint32{0x01113a49, 0x01ad34c7, 0x00a47e8c, 0x01df301a, 0x03884b3f, 0x034f249f, 0x028fa51f, 0x03c318cc, 0x020da058, 0x0028939e}}, Y: Field{[10]uint32{0x010ef78b, 0x01c84bd1, 0x00c81a9a, 0x00559179, 0x010bcee6, 0x00a5c675, 0x032fe3f8, 0x0295a67a, 0x003079ac, 0x002fa36e}}}, + {X: Field{[10]uint32{0x01efad5a, 0x0076dc90, 0x024b8098, 0x029d23c2, 0x0142212d, 0x03af5660, 0x036cc325, 0x005e5df6, 0x00cb77e1, 0x0039668f}}, Y: Field{[10]uint32{0x00a800d9, 0x030b5381, 0x012999d4, 0x005a9281, 0x00d69034, 0x00e268b6, 0x00a10a22, 0x0099a330, 0x0145fdda, 0x002a381d}}}, + {X: Field{[10]uint32{0x024b8f32, 0x03d8183f, 0x00e9f0da, 0x01d6aaa5, 0x01fc6c1a, 0x036afa72, 0x00721f93, 0x002f96fb, 0x0263a3c7, 0x000c646c}}, Y: Field{[10]uint32{0x01f38a96, 0x02c7e657, 0x00491717, 0x009d4f9d, 0x00c7af7b, 0x028f2eac, 0x01a87c4e, 0x026f1caa, 0x02cc1c7a, 0x000ce464}}}, + {X: Field{[10]uint32{0x0187023a, 0x01e1d3e4, 0x014638b9, 0x0394f04e, 0x0012f408, 0x03a0e6c8, 0x0147e275, 0x0376c23f, 0x03c604f9, 0x0018f757}}, Y: Field{[10]uint32{0x0104bd9a, 0x00d72f21, 0x0239b84f, 0x00410588, 0x03067e09, 0x004bbdfb, 0x016cccfd, 0x02df9b51, 0x00b402e8, 0x0006bc12}}}, + {X: Field{[10]uint32{0x031bcf13, 0x036fd2d9, 0x025c12d3, 0x01030ae3, 0x032e1d86, 0x03dd4712, 0x007229b7, 0x004bb32e, 0x0057cd83, 0x0002a4b9}}, Y: Field{[10]uint32{0x03fba768, 0x03ca4b97, 0x00b3f551, 0x013cf56d, 0x02be46ab, 0x0281f59c, 0x00492413, 0x03ad7461, 0x03565447, 0x0035ebb6}}}, + {X: Field{[10]uint32{0x01b10495, 0x0375be0e, 0x035ba6c0, 0x0179617c, 0x004789f5, 0x013c02ed, 0x0320f021, 0x0274880a, 0x0170b9e0, 0x0007b9ae}}, Y: Field{[10]uint32{0x009e9462, 0x03443837, 0x032be3f8, 0x02ef5282, 0x019dcf73, 0x01894a21, 0x023c8a04, 0x03bbd746, 0x03eceff9, 0x001f2443}}}, + {X: Field{[10]uint32{0x0306a76a, 0x03459663, 0x01cebe4f, 0x025cc0a1, 0x001abe9e, 0x00f4121c, 0x0328d7c4, 0x00655c14, 0x03b9c2ac, 0x002c6708}}, Y: Field{[10]uint32{0x03a38398, 0x016ca0cd, 0x00a49274, 0x01f34232, 0x01c60560, 0x038da791, 0x0380f8cf, 0x022dc1bc, 0x01bec07c, 0x001e6a04}}}, + {X: Field{[10]uint32{0x014f49a5, 0x026bbcc0, 0x02016b1e, 0x0262e2ca, 0x014f3fbf, 0x0099a915, 0x00888f5e, 0x017f09f0, 0x039f9ed3, 0x000f0836}}, Y: Field{[10]uint32{0x03fbc4d5, 0x025438d6, 0x009ea7d8, 0x02d733d2, 0x029327c1, 0x02879684, 0x010815a4, 0x0398ebd8, 0x02943f29, 0x002eceb0}}}, + {X: Field{[10]uint32{0x02ea4389, 0x0248b14b, 0x00014f6b, 0x03f0233a, 0x00efa29f, 0x034ce091, 0x02b59040, 0x01ba7913, 0x01bab474, 0x003f4733}}, Y: Field{[10]uint32{0x028df06e, 0x02080ca6, 0x0004097a, 0x014843db, 0x0373961a, 0x010f393a, 0x012439fc, 0x01be43e9, 0x01465214, 0x00384195}}}, + {X: Field{[10]uint32{0x0364020c, 0x03682666, 0x03ab51e2, 0x00a636cd, 0x0183641a, 0x030ac35d, 0x0252dc73, 0x02e29bbc, 0x018eabde, 0x0038c3f4}}, Y: Field{[10]uint32{0x00dce88b, 0x0309304a, 0x01704cfb, 0x00a5abfa, 0x018e195d, 0x01c5bad0, 0x02bcab86, 0x03d20658, 0x02721824, 0x0012598d}}}, + {X: Field{[10]uint32{0x015bda37, 0x0085f9d4, 0x00548e6e, 0x00001550, 0x015cd723, 0x00ea7702, 0x02ea7848, 0x03e4c386, 0x038926dd, 0x0012f07d}}, Y: Field{[10]uint32{0x0200ca69, 0x0133f374, 0x0047163a, 0x01b0a94b, 0x0336d8a2, 0x00d2f66a, 0x00bfa2e7, 0x006c0237, 0x02b695dc, 0x00259acc}}}, + {X: Field{[10]uint32{0x00f036d4, 0x03ffa855, 0x0139aaff, 0x023b51ad, 0x009004f9, 0x03b3a6f1, 0x030f7d26, 0x012e2d03, 0x027b9c86, 0x0008f4f8}}, Y: Field{[10]uint32{0x02c0b05d, 0x01b1e522, 0x026c71b3, 0x02eca24a, 0x01b3dfef, 0x03054354, 0x00143d6a, 0x0289f331, 0x03ebf680, 0x002f9185}}}, + {X: Field{[10]uint32{0x026009c0, 0x0392250f, 0x01aab56d, 0x02472db0, 0x004a5130, 0x01ded730, 0x02e0a894, 0x00edc3d1, 0x03d014cd, 0x000a2b72}}, Y: Field{[10]uint32{0x00e31601, 0x024b33bf, 0x00fdaf4a, 0x031cf7b5, 0x0025040d, 0x00233f93, 0x03250b46, 0x013328e3, 0x00387520, 0x001f126a}}}, + {X: Field{[10]uint32{0x00a29d08, 0x03c867c7, 0x02a0cc86, 0x01ee9517, 0x00ea52ec, 0x003613d8, 0x0044ab87, 0x00208e94, 0x00b8a86f, 0x001dd821}}, Y: Field{[10]uint32{0x001c60db, 0x00d14c96, 0x00b2cd08, 0x01c9615c, 0x03def172, 0x027959f6, 0x010bc384, 0x034942d0, 0x02cb1048, 0x00182eef}}}, + {X: Field{[10]uint32{0x028f2350, 0x03879f48, 0x035fbd4f, 0x02e7b5ab, 0x01e3db94, 0x01811254, 0x019667bc, 0x03bd2257, 0x020ffd32, 0x001177cb}}, Y: Field{[10]uint32{0x03eaf095, 0x035e4618, 0x0399473f, 0x032da2ec, 0x004de155, 0x010592e6, 0x024076ed, 0x03f819a7, 0x024b1a8c, 0x0029cc91}}}, + {X: Field{[10]uint32{0x027dd7ea, 0x027c386f, 0x03ebe7f6, 0x03a1e0f3, 0x008ae9bb, 0x0124e8bf, 0x00bff80c, 0x03f47e9d, 0x036b46a5, 0x001a4125}}, Y: Field{[10]uint32{0x022c3e64, 0x01886bb2, 0x03cfd5ad, 0x0115799b, 0x0030f1df, 0x02802cd0, 0x0241a221, 0x0050d818, 0x01b8df9d, 0x0006741c}}}, + {X: Field{[10]uint32{0x01aef659, 0x00a3a14a, 0x00f0bef5, 0x00d47ba0, 0x03e01def, 0x03a02603, 0x01e805c8, 0x0341d6a3, 0x0328f977, 0x00212761}}, Y: Field{[10]uint32{0x025bf428, 0x00c5652b, 0x006ffedf, 0x026bb1c9, 0x018042dd, 0x0301a743, 0x017adadb, 0x018a0ee7, 0x01c46c88, 0x00361255}}}, + {X: Field{[10]uint32{0x032d58eb, 0x0319d191, 0x01281e27, 0x031fa9a1, 0x0054588d, 0x035d4d2b, 0x03facec8, 0x001b9839, 0x034c2345, 0x0038f592}}, Y: Field{[10]uint32{0x025a36eb, 0x007cd8eb, 0x030efbc6, 0x00e53265, 0x0011a9c8, 0x022ba966, 0x0047baf6, 0x00aa11d1, 0x013ccf82, 0x00128cab}}}, + {X: Field{[10]uint32{0x0063bbaa, 0x021f54d5, 0x03ece0c7, 0x02aba484, 0x02889877, 0x02d9d8e6, 0x036f1323, 0x0168c466, 0x012857d1, 0x003d071e}}, Y: Field{[10]uint32{0x014d9328, 0x018140de, 0x016d07cc, 0x0239fa91, 0x00630c45, 0x014b6777, 0x00075941, 0x01315534, 0x010e00c8, 0x001cf3f3}}}, + {X: Field{[10]uint32{0x01186079, 0x014bf5de, 0x0321d67f, 0x0071079e, 0x030e0cba, 0x02bb64e7, 0x03a4a02c, 0x02e13391, 0x0347047a, 0x00387485}}, Y: Field{[10]uint32{0x01b2b668, 0x006abf9f, 0x02f63af8, 0x019a6b24, 0x01fb26da, 0x0092a040, 0x01728a3e, 0x03028fb6, 0x0228aa4b, 0x0005ec2d}}}, + {X: Field{[10]uint32{0x006ef1d8, 0x0239f736, 0x00c8095a, 0x012e34a4, 0x005d7ddb, 0x014ad36c, 0x009da2dd, 0x019e54c6, 0x018af8f8, 0x002a2800}}, Y: Field{[10]uint32{0x0026518b, 0x02ae9f5a, 0x00c17fc8, 0x035e72ad, 0x0225b927, 0x00d8208f, 0x0180c7e9, 0x02287b7e, 0x006c84b8, 0x0022ee58}}}, + {X: Field{[10]uint32{0x036fffed, 0x03589fdc, 0x038f4cd8, 0x0384f7cc, 0x00e4e0c0, 0x003af698, 0x03a57c05, 0x0179136a, 0x02716ee0, 0x001ce0f1}}, Y: Field{[10]uint32{0x0289f0e0, 0x03625b23, 0x00ba004a, 0x01225487, 0x0338eafd, 0x031df6ab, 0x00cb973f, 0x0129d18e, 0x01465f16, 0x000ef72e}}}, + {X: Field{[10]uint32{0x01372dfd, 0x023e42eb, 0x00c1e085, 0x03d01483, 0x031ca36a, 0x00216018, 0x03e64312, 0x02b25e5a, 0x021c8bc8, 0x00187e9f}}, Y: Field{[10]uint32{0x03eba33d, 0x00d121b0, 0x002078d6, 0x02c252c3, 0x00a5f646, 0x02210778, 0x0287909c, 0x039a50c8, 0x036836c3, 0x000fc359}}}, + {X: Field{[10]uint32{0x02c4a740, 0x00c428ec, 0x0116d3cb, 0x01250efc, 0x00b4f143, 0x03d220aa, 0x0092defc, 0x03180664, 0x022bca0a, 0x002180a7}}, Y: Field{[10]uint32{0x001c2f7c, 0x018edf49, 0x00480154, 0x014f75c2, 0x00ef5f15, 0x004885b2, 0x0261cffd, 0x015bc3cc, 0x006ecd90, 0x002e2fa4}}}, + {X: Field{[10]uint32{0x03ad95cc, 0x011d3013, 0x0390e2f6, 0x02c17f17, 0x0348c4a6, 0x0035ae6a, 0x01d6c4cd, 0x02921d62, 0x03e5912a, 0x00385cbd}}, Y: Field{[10]uint32{0x00acc401, 0x019cf702, 0x00290ea0, 0x01e54027, 0x010d7bfd, 0x022d935f, 0x019920ce, 0x003b4ee2, 0x03c12b0a, 0x003b6f48}}}, + {X: Field{[10]uint32{0x02873494, 0x00df6f8c, 0x00616d1f, 0x01e335aa, 0x032d931c, 0x020e37a4, 0x03b22abf, 0x03f0922d, 0x028d322e, 0x001e61ae}}, Y: Field{[10]uint32{0x02a13634, 0x02f25a04, 0x0201ee6e, 0x034f4edf, 0x002420a5, 0x034a7f83, 0x01b75440, 0x001648c6, 0x03224c75, 0x001a4faa}}}, + {X: Field{[10]uint32{0x01e00383, 0x02319738, 0x01d4603e, 0x034daa2a, 0x03400bb5, 0x034dac4c, 0x000a6d88, 0x01d9cdd8, 0x01384a72, 0x002e9650}}, Y: Field{[10]uint32{0x002ce557, 0x02676fcf, 0x019bd867, 0x0114bd88, 0x03d9c685, 0x00c4162f, 0x03fc9535, 0x0204ac89, 0x0228bc1b, 0x001d1bd3}}}, + {X: Field{[10]uint32{0x00476c8f, 0x02be1a48, 0x006b9802, 0x035cb3c3, 0x036bf96c, 0x02c5de27, 0x02eeb77b, 0x02c45f21, 0x01c992d6, 0x00117fd0}}, Y: Field{[10]uint32{0x0002b59f, 0x035a5c88, 0x015cbec3, 0x021a1ff2, 0x004f522e, 0x009c59f6, 0x010c9e10, 0x038eb880, 0x01bf6422, 0x0024c93d}}}, + {X: Field{[10]uint32{0x016ed68f, 0x00fb30f0, 0x02a7d9a9, 0x0293655d, 0x00d00bad, 0x02199bb5, 0x031c282e, 0x013681c5, 0x0235487a, 0x002eb5e7}}, Y: Field{[10]uint32{0x007b57d2, 0x0354371e, 0x029207a6, 0x005e40e2, 0x005b1535, 0x0076c335, 0x0202e129, 0x021290c6, 0x022eefb1, 0x00064e5e}}}, + {X: Field{[10]uint32{0x023c8a41, 0x0100ef27, 0x01b79cfa, 0x00374d99, 0x0022cf89, 0x025d56ff, 0x004d5835, 0x01d7b183, 0x01072d88, 0x00377f88}}, Y: Field{[10]uint32{0x033f62e7, 0x00ad8211, 0x00d90ce2, 0x00fe1f04, 0x028dbe0d, 0x0230a21c, 0x015674c2, 0x002a2a48, 0x0117491d, 0x00318af6}}}, + {X: Field{[10]uint32{0x027eb299, 0x0203b6d9, 0x03a64b11, 0x01a68f67, 0x00d75942, 0x03be7657, 0x00ccadfb, 0x0248fe5a, 0x0253c07f, 0x002497da}}, Y: Field{[10]uint32{0x01e7809c, 0x00e6582c, 0x010b7b29, 0x00e2e329, 0x0058f000, 0x03e73b92, 0x008b26b7, 0x006399bc, 0x00ff01f9, 0x0004203a}}}, + {X: Field{[10]uint32{0x0320dd80, 0x01e2ea09, 0x00d0d878, 0x0341ac38, 0x0012768b, 0x007c0ebc, 0x025d2c7d, 0x000a0ce3, 0x01dda75f, 0x0030a392}}, Y: Field{[10]uint32{0x010db12b, 0x02116ad7, 0x00a98331, 0x02d35fda, 0x03ec5ae6, 0x0261f859, 0x0112c5b4, 0x02926f31, 0x0189c941, 0x0019c3e2}}}, + {X: Field{[10]uint32{0x00837cbb, 0x03e1b28b, 0x006f37b9, 0x01235650, 0x02b21dae, 0x017a3816, 0x008c196d, 0x016fa206, 0x013e9503, 0x0001ea41}}, Y: Field{[10]uint32{0x003a7e1c, 0x00af43d1, 0x02352e7f, 0x03dbdfef, 0x026de026, 0x03425f5d, 0x00774e79, 0x0252de65, 0x008e8e76, 0x00103b82}}}, + {X: Field{[10]uint32{0x02036aa2, 0x029e7f43, 0x01b956c6, 0x021686d8, 0x02e0b32c, 0x025986c5, 0x008ef81e, 0x00031536, 0x00eabfbb, 0x000cebde}}, Y: Field{[10]uint32{0x03cfd3c0, 0x01231a74, 0x00629d80, 0x022017bd, 0x03153319, 0x03215742, 0x01796440, 0x029e5b13, 0x02af0537, 0x001c4f9e}}}, + {X: Field{[10]uint32{0x01583bd0, 0x0031c812, 0x0163df9a, 0x02901e5f, 0x031326df, 0x01b59d30, 0x02955739, 0x00f4cca5, 0x00145a3f, 0x00316234}}, Y: Field{[10]uint32{0x0053cdfa, 0x00c719ab, 0x020d7375, 0x009232bd, 0x027f7470, 0x03f4b35d, 0x02baa8fc, 0x0336b6ae, 0x03d16c67, 0x002d7033}}}, + {X: Field{[10]uint32{0x0038d29e, 0x02ad48e0, 0x01d5a2f2, 0x00887c3b, 0x0397223f, 0x01924d06, 0x008ef12c, 0x010b19f1, 0x01edb937, 0x0025acf5}}, Y: Field{[10]uint32{0x00e44c4e, 0x007b032c, 0x016aa996, 0x015d2ca3, 0x01bf25fe, 0x0339ed3b, 0x019a2e64, 0x028174dc, 0x00aa38a3, 0x0036d1d7}}}, + {X: Field{[10]uint32{0x0244f0c7, 0x0369dfd5, 0x02782a62, 0x010968a1, 0x001eea3a, 0x01198aa7, 0x00cb00b1, 0x013b9bec, 0x036e3d89, 0x00104bd2}}, Y: Field{[10]uint32{0x02a676fe, 0x026be1bd, 0x031d6f13, 0x0226300f, 0x01a8503e, 0x00e1d10a, 0x03de8139, 0x032016ff, 0x0236ab9b, 0x002a13bd}}}, + {X: Field{[10]uint32{0x00563252, 0x01387eb9, 0x01049379, 0x0312270e, 0x0132fdfd, 0x00cb1063, 0x031421da, 0x00c0a14b, 0x0385c7b4, 0x00097c29}}, Y: Field{[10]uint32{0x0004e4bc, 0x009a20d8, 0x02334a02, 0x03d4771b, 0x02da716a, 0x03afbd01, 0x00953a3a, 0x0242d627, 0x010d4571, 0x003bfac2}}}, + {X: Field{[10]uint32{0x01741c6f, 0x0356293b, 0x02cfde0b, 0x01610c9e, 0x03f02fed, 0x027a8f9f, 0x034403a4, 0x03ebd2b2, 0x02b7f367, 0x00143f52}}, Y: Field{[10]uint32{0x0146dd5f, 0x00c1f18f, 0x0207ea56, 0x033e81e5, 0x022d08ab, 0x02b6c70e, 0x020cb520, 0x03352194, 0x01a73c9d, 0x001e2af0}}}, + {X: Field{[10]uint32{0x006a477a, 0x03efb441, 0x03313bbc, 0x007d2e53, 0x02c35762, 0x00c3c41f, 0x038fa664, 0x01fde4ce, 0x03d4cfaf, 0x00055d60}}, Y: Field{[10]uint32{0x017e8db5, 0x02737a8a, 0x02aaffc0, 0x02359674, 0x01fe35ed, 0x011b5216, 0x00d4355c, 0x0347f983, 0x0235ce8c, 0x0026a9ac}}}, + {X: Field{[10]uint32{0x033300be, 0x00ef1296, 0x03494f4b, 0x037e2f9a, 0x02f2edce, 0x016cd65d, 0x00affc16, 0x00980f91, 0x03625d26, 0x000f112e}}, Y: Field{[10]uint32{0x00bc2535, 0x03b0afcf, 0x007b9079, 0x031c7fdc, 0x021ef0e8, 0x00166054, 0x00d45949, 0x00eae17b, 0x01616797, 0x00222c71}}}, + {X: Field{[10]uint32{0x02298958, 0x0096e3ee, 0x01d935ee, 0x031b821f, 0x008fc5d9, 0x00fc8f31, 0x0371d193, 0x01ae5fcb, 0x024de160, 0x000c7509}}, Y: Field{[10]uint32{0x018251cb, 0x0004641c, 0x032c44ae, 0x02d8b98a, 0x00c8e41d, 0x021556e6, 0x025180c9, 0x007498a1, 0x01c0a3aa, 0x00118182}}}, + {X: Field{[10]uint32{0x0103ad2f, 0x0091eb97, 0x03b78a87, 0x007602a3, 0x03352d1d, 0x037060d2, 0x02b206d3, 0x011c9182, 0x030a8ff1, 0x0007d547}}, Y: Field{[10]uint32{0x0116a6e3, 0x03a8cfb0, 0x03b32ecc, 0x02d94255, 0x00fcb97a, 0x000afb8d, 0x0144f818, 0x02c5236e, 0x0006a4c8, 0x0009094f}}}, + {X: Field{[10]uint32{0x01cf333e, 0x02daed70, 0x003a87aa, 0x01ccaabb, 0x00206a1f, 0x03fd6a31, 0x03343119, 0x02101cc4, 0x021d27f0, 0x00378b13}}, Y: Field{[10]uint32{0x0195170d, 0x0173f8a0, 0x01a71c5a, 0x00ab2cb5, 0x019226ca, 0x007e9263, 0x03f4a8e4, 0x0334e8c7, 0x03a140fe, 0x0037204e}}}, + {X: Field{[10]uint32{0x00a95612, 0x02f13046, 0x01620a54, 0x03462bb5, 0x00c1f54b, 0x00e0b0bc, 0x02c4a22c, 0x012b204c, 0x01b2adf5, 0x001bf717}}, Y: Field{[10]uint32{0x030e221e, 0x03a24565, 0x00d26944, 0x032a9b71, 0x03cf60b0, 0x00748590, 0x00110536, 0x03a53703, 0x00e5f318, 0x0036cfe9}}}, + {X: Field{[10]uint32{0x03680603, 0x01dedcd4, 0x030fc7fd, 0x00342177, 0x00bb7665, 0x035fae84, 0x02ea6f4d, 0x0071468e, 0x02c6ea0e, 0x0031fadd}}, Y: Field{[10]uint32{0x035bf655, 0x011dc4b7, 0x013e0e6f, 0x00e6a0ad, 0x020a4f4a, 0x02f0cbbc, 0x0041c3d7, 0x0024a80f, 0x01d7b788, 0x0016b870}}}, + {X: Field{[10]uint32{0x00aa89ed, 0x004ea632, 0x01857b48, 0x02de0867, 0x021a52c7, 0x00c4afee, 0x00e048e6, 0x022d6d93, 0x01a2b7e7, 0x00320541}}, Y: Field{[10]uint32{0x03096806, 0x0177f037, 0x007fa87d, 0x01fe5ac9, 0x01c222be, 0x0167c0cf, 0x01e49be4, 0x03884578, 0x00426d6c, 0x0011b6ca}}}, + {X: Field{[10]uint32{0x00503bf8, 0x01fae79e, 0x031c90a1, 0x00482f71, 0x00f7dec3, 0x00eb0d42, 0x005ff0d8, 0x030f561c, 0x025515f9, 0x0032b5d4}}, Y: Field{[10]uint32{0x026bd719, 0x02704b1b, 0x034c52d1, 0x039496da, 0x0106231b, 0x00e39358, 0x012ddc76, 0x036e5fb3, 0x020276cf, 0x000cacda}}}, + {X: Field{[10]uint32{0x024cdd25, 0x03a4036f, 0x03fabc70, 0x0196094c, 0x00f17f3c, 0x035ac576, 0x02ca8a47, 0x01f8c15b, 0x0144e22b, 0x00253488}}, Y: Field{[10]uint32{0x03d93bf9, 0x006a1351, 0x02e5f612, 0x00b5e6d2, 0x03828bf7, 0x03404932, 0x01dfbbdb, 0x00be1762, 0x020d5fef, 0x0004b01d}}}, + {X: Field{[10]uint32{0x016731a3, 0x004ae2e4, 0x022253b1, 0x027f03cb, 0x0213cba1, 0x01c86f78, 0x03520407, 0x01807f77, 0x0023ef00, 0x000c9717}}, Y: Field{[10]uint32{0x022498e0, 0x02397bb5, 0x0370e962, 0x02c91763, 0x015cb38c, 0x01931f4a, 0x03f3dd30, 0x00590e64, 0x0398c09c, 0x001674f2}}}, + {X: Field{[10]uint32{0x01ee2318, 0x01b61864, 0x00a7cda9, 0x00e0f9fd, 0x027d1874, 0x006f7f69, 0x02515168, 0x020c5928, 0x0089544b, 0x0027241c}}, Y: Field{[10]uint32{0x0372d20d, 0x00639be0, 0x00911d97, 0x037a7ef9, 0x01547117, 0x03089416, 0x00539eb5, 0x0018c0d9, 0x02e7e701, 0x003d8e77}}}, + {X: Field{[10]uint32{0x002b7a82, 0x03e60d4c, 0x03fc0f32, 0x0373ab06, 0x01ec5544, 0x01e93ee0, 0x032a1d89, 0x0301b132, 0x0007ede9, 0x000d3c52}}, Y: Field{[10]uint32{0x016d9c57, 0x007ca902, 0x024828d0, 0x019d75af, 0x003c54c3, 0x01a2f79a, 0x0318813a, 0x0288a3d7, 0x028cec6a, 0x001e10de}}}, + {X: Field{[10]uint32{0x0239788b, 0x01ed8005, 0x00d75388, 0x03fc30d1, 0x01490b47, 0x032e07f7, 0x03d459af, 0x0020a380, 0x030b3f08, 0x00252634}}, Y: Field{[10]uint32{0x002522f7, 0x00da14b9, 0x03d2ece1, 0x02cd59f3, 0x00677865, 0x01461ea7, 0x001627dc, 0x02f8fac9, 0x0305b97a, 0x001e9720}}}, + {X: Field{[10]uint32{0x0354f226, 0x0114bd5d, 0x038c876d, 0x03ffaee5, 0x025d4f36, 0x00f3be23, 0x013ec32d, 0x01b8dea9, 0x036fefd3, 0x003ae823}}, Y: Field{[10]uint32{0x012015c1, 0x031f8e2f, 0x01470608, 0x01e1340a, 0x0339e171, 0x00e32f82, 0x03eade9b, 0x015329eb, 0x02b543aa, 0x003f8399}}}, + {X: Field{[10]uint32{0x0240091b, 0x0251211c, 0x01e504c7, 0x02f664b3, 0x02c8ef49, 0x03a326f3, 0x0119b77a, 0x005ca7d8, 0x03c20bd2, 0x00155752}}, Y: Field{[10]uint32{0x03437b54, 0x0046731f, 0x00315d30, 0x03fe953e, 0x036c9052, 0x024fad29, 0x02869415, 0x0078ccb2, 0x01b86952, 0x003333af}}}, + {X: Field{[10]uint32{0x03fe8872, 0x03c21ec3, 0x01823679, 0x03b31a4b, 0x013f3060, 0x005c8f51, 0x0333833d, 0x00d1d10b, 0x039c19da, 0x000cdca6}}, Y: Field{[10]uint32{0x0034fc30, 0x02f59317, 0x00800b4a, 0x001f5faf, 0x00fac2f0, 0x02fee011, 0x00854056, 0x03d813ae, 0x024f283a, 0x002a52da}}}, + {X: Field{[10]uint32{0x01f1dc11, 0x03857803, 0x03c32d8a, 0x03835131, 0x0378124e, 0x00eae4b3, 0x03b060a7, 0x0119e191, 0x009fafe6, 0x000a86a2}}, Y: Field{[10]uint32{0x008b75d8, 0x0017fcff, 0x01218986, 0x0341fbe4, 0x0275aba0, 0x01b6efc3, 0x02ba46be, 0x007e39a1, 0x023d3bf1, 0x00189be5}}}, + {X: Field{[10]uint32{0x00197d6f, 0x02f2c2df, 0x027fff2d, 0x02cd38e4, 0x01639148, 0x0162ecbd, 0x0062f702, 0x039bf3ff, 0x014ca303, 0x0011c0a1}}, Y: Field{[10]uint32{0x031e1156, 0x011111f5, 0x02c5195c, 0x02cc3cec, 0x022da76e, 0x00164dcb, 0x0075c2de, 0x0095f345, 0x01b28513, 0x001f6898}}}, + {X: Field{[10]uint32{0x01319c5b, 0x01f165b3, 0x00e03485, 0x03f5f681, 0x0351d90c, 0x01b9279e, 0x0015cae0, 0x008e8194, 0x01c5a0cc, 0x001c00bb}}, Y: Field{[10]uint32{0x03db73bb, 0x00f88c30, 0x02975db6, 0x015a13f1, 0x0178c47b, 0x027f5845, 0x012d2ae1, 0x02a961eb, 0x01bd06b7, 0x001bca11}}}, + {X: Field{[10]uint32{0x0348d485, 0x02b7c2db, 0x00ae67c1, 0x0321c976, 0x03f4cc5b, 0x00755143, 0x0169f057, 0x018436c8, 0x00d4483d, 0x0009cca5}}, Y: Field{[10]uint32{0x03d942b1, 0x0221d2d9, 0x036d3726, 0x030473ee, 0x02a71e3c, 0x0208e6a8, 0x039a0031, 0x03278280, 0x01a20ffe, 0x00266c90}}}, + {X: Field{[10]uint32{0x018c9a69, 0x00d7a3fa, 0x00e83b03, 0x00ab134a, 0x010710c7, 0x02a14a97, 0x0126a535, 0x02d103eb, 0x03823055, 0x0006fb33}}, Y: Field{[10]uint32{0x038aecfc, 0x03780fde, 0x03489e2f, 0x00597892, 0x002c5db7, 0x0351c7ab, 0x00ce0a40, 0x03b881f2, 0x0166ac0e, 0x0003cead}}}, + {X: Field{[10]uint32{0x03128160, 0x02386494, 0x02197fae, 0x008dde24, 0x00a19023, 0x023f99cb, 0x0149caec, 0x00f54d76, 0x02cf4f03, 0x0036f93b}}, Y: Field{[10]uint32{0x01aa566f, 0x00f51f35, 0x00a1f5fd, 0x0018702a, 0x01896fc8, 0x012583f1, 0x0241c722, 0x00396d58, 0x03c7927f, 0x002cfd42}}}, + {X: Field{[10]uint32{0x01bd1e20, 0x03b3d28e, 0x02631133, 0x0212c2b8, 0x03caf7f4, 0x03715cff, 0x011887a5, 0x0031a516, 0x0075bed8, 0x001990ff}}, Y: Field{[10]uint32{0x038d58e5, 0x02d717e1, 0x03b7a1f8, 0x0270a4f0, 0x038ec1e6, 0x031289b8, 0x001875fd, 0x01f24eeb, 0x0285f7ac, 0x00011c04}}}, + {X: Field{[10]uint32{0x01422a21, 0x00d0bf81, 0x03f14516, 0x00daf298, 0x03ef19d9, 0x00fe0839, 0x01582805, 0x0335781c, 0x03decf1d, 0x00267e42}}, Y: Field{[10]uint32{0x019cd4fd, 0x034b5e6e, 0x01e2a180, 0x0064cfe4, 0x025cfd77, 0x02fafab5, 0x0390a868, 0x01856c14, 0x01306dfc, 0x0028137f}}}, + {X: Field{[10]uint32{0x02e33433, 0x00774ca1, 0x0033eaad, 0x01f81270, 0x00bcf71f, 0x024ad59e, 0x03b4e351, 0x02dff917, 0x02483184, 0x001539f3}}, Y: Field{[10]uint32{0x00c0e8ef, 0x033b2205, 0x02c3c4de, 0x0118f1a8, 0x024d4f85, 0x01fd3938, 0x028b85cb, 0x0272de0e, 0x033b65ba, 0x0032b0a0}}}, + {X: Field{[10]uint32{0x03f02e08, 0x01a1ae12, 0x027d31f7, 0x0058a558, 0x034705aa, 0x03d2a65c, 0x00f4e7b8, 0x0264f911, 0x024ffb60, 0x0033e192}}, Y: Field{[10]uint32{0x036f1bde, 0x01db1f36, 0x02a51af2, 0x0145dd12, 0x016b8a19, 0x03a62f7c, 0x01db874c, 0x03ad3519, 0x020fb736, 0x001ea634}}}, + {X: Field{[10]uint32{0x0159d1ae, 0x001c849b, 0x03f26c9e, 0x01141829, 0x02a25693, 0x02a62bf8, 0x022cd457, 0x03fe456b, 0x00d6516f, 0x001bfc58}}, Y: Field{[10]uint32{0x00eedc4a, 0x017065ed, 0x034deaff, 0x03b4007c, 0x017db5d5, 0x0143e71d, 0x038b4153, 0x0042b393, 0x0355bf14, 0x001747c4}}}, + {X: Field{[10]uint32{0x035dfcc9, 0x007f9327, 0x01a46f23, 0x016cdc0b, 0x01a56fe3, 0x018a1f6a, 0x037f2a2c, 0x009a4075, 0x0262aefd, 0x00026b6e}}, Y: Field{[10]uint32{0x03b04161, 0x017c54ea, 0x02e7e482, 0x010d0765, 0x012e708d, 0x034b12f7, 0x03126aff, 0x00d66c01, 0x0045cb4a, 0x002e963b}}}, + {X: Field{[10]uint32{0x00a2402d, 0x0038aa85, 0x035d652c, 0x0183a773, 0x02b5d900, 0x00b0437f, 0x00ea9457, 0x03712335, 0x001ebbdc, 0x000813a9}}, Y: Field{[10]uint32{0x0036ae38, 0x03de02eb, 0x01809789, 0x00c8fb02, 0x02fb0b9e, 0x024929be, 0x005db8a9, 0x00bcf2cb, 0x01aca195, 0x001eca22}}}, + {X: Field{[10]uint32{0x03c8ba22, 0x02b3a5d7, 0x0296a82a, 0x0243a109, 0x02a4b4f1, 0x008349ae, 0x01a6826c, 0x00c45089, 0x0269364d, 0x003df5b1}}, Y: Field{[10]uint32{0x039d3470, 0x019e9721, 0x03d1636f, 0x03d12c32, 0x031ff47c, 0x02cf1d86, 0x027d160c, 0x00e31401, 0x0177b425, 0x00056aec}}}, + {X: Field{[10]uint32{0x01352587, 0x019bc9df, 0x03f0dcb4, 0x019116d5, 0x01e50a7e, 0x000af488, 0x0066e00c, 0x00a31e2c, 0x030a87dd, 0x001ef134}}, Y: Field{[10]uint32{0x00c294d4, 0x032ae5b4, 0x0152ec68, 0x030481ad, 0x026efbc9, 0x032c1287, 0x026e0c9f, 0x00059369, 0x00542e7e, 0x003d3b52}}}, + {X: Field{[10]uint32{0x02316ef1, 0x01250ec7, 0x009d7856, 0x0086d094, 0x01c200eb, 0x027c818a, 0x005dfb95, 0x02fb9b09, 0x0184b046, 0x00155109}}, Y: Field{[10]uint32{0x00580d82, 0x000c6a52, 0x02280905, 0x018b4676, 0x02a29c41, 0x000fcb93, 0x026353a1, 0x007b6599, 0x0171c811, 0x000b8aaa}}}, + {X: Field{[10]uint32{0x01dce1eb, 0x01a7992c, 0x02dccbcd, 0x01ca107c, 0x020923f8, 0x02a32996, 0x0224c973, 0x0240f9c4, 0x00c0de88, 0x00239f7e}}, Y: Field{[10]uint32{0x01d2a0cc, 0x0390f049, 0x0066252a, 0x0388d325, 0x03c31205, 0x007eea36, 0x0147873f, 0x01b5479c, 0x00839ae8, 0x0039054c}}}, + {X: Field{[10]uint32{0x0251de8f, 0x011bd471, 0x024915d5, 0x0324d6f6, 0x01b84a9b, 0x017eb81e, 0x0169d066, 0x02a86095, 0x01dc69d8, 0x0019c8c8}}, Y: Field{[10]uint32{0x03ef005f, 0x00f5bdb9, 0x00188d33, 0x03c5acd3, 0x02f977b1, 0x000e9bbb, 0x0009ab18, 0x0225f6fa, 0x030b8708, 0x0022b590}}}, + {X: Field{[10]uint32{0x01ac3abc, 0x003d1ca2, 0x01bfc2d2, 0x026bda4f, 0x001b8beb, 0x02175da6, 0x00327182, 0x026c0148, 0x03c143e9, 0x003d38ae}}, Y: Field{[10]uint32{0x01651a2a, 0x02fc2c57, 0x03a897ea, 0x00f8817a, 0x036d80e9, 0x0033509b, 0x0322b7f7, 0x003aacb9, 0x00f5dc33, 0x00395264}}}, + {X: Field{[10]uint32{0x0139ffff, 0x004d3c43, 0x01ad8009, 0x0119ad7f, 0x0272694f, 0x00170582, 0x03c72758, 0x00963241, 0x025fc6d2, 0x0016a8ea}}, Y: Field{[10]uint32{0x00ea9531, 0x03018012, 0x0244a7f4, 0x02632c1d, 0x023146aa, 0x03d9c330, 0x003e82b5, 0x02be96e1, 0x0170617e, 0x0008b5c8}}}, + {X: Field{[10]uint32{0x03e2e7ef, 0x03ac021e, 0x00383be3, 0x03a9170d, 0x009e9a31, 0x02de18cf, 0x033acbd1, 0x01266b1a, 0x03f9d2bf, 0x000d1d4b}}, Y: Field{[10]uint32{0x001104f8, 0x01b6d1cb, 0x03edd91a, 0x02a60c1a, 0x0339d73c, 0x03d9f22e, 0x037d0763, 0x03621947, 0x03742cf3, 0x002d4fa8}}}, + {X: Field{[10]uint32{0x03047327, 0x00d4d989, 0x02d6b517, 0x018b6cae, 0x01889770, 0x001a7871, 0x01b4c9b5, 0x0113dc36, 0x022402ea, 0x00359409}}, Y: Field{[10]uint32{0x02b16f2d, 0x00547f12, 0x02c288c7, 0x00861b6c, 0x02d80143, 0x015cdd5f, 0x034db3fb, 0x02a2fb00, 0x019af2f2, 0x0014bd72}}}, + {X: Field{[10]uint32{0x011f4cc9, 0x024f0c00, 0x032acb45, 0x02a7b576, 0x010915d4, 0x007ce6af, 0x024a0e0b, 0x00097f45, 0x02c6553d, 0x0014aceb}}, Y: Field{[10]uint32{0x00e2f8c9, 0x029dc5fd, 0x03ba2432, 0x02f3839e, 0x0377af18, 0x00c6c975, 0x00016839, 0x02caee75, 0x00021c17, 0x0014551d}}}, + {X: Field{[10]uint32{0x027ef9ca, 0x02551fa0, 0x01b174d9, 0x01bae93e, 0x02eaa0ec, 0x022de704, 0x03284186, 0x02489049, 0x037ef797, 0x00232ed9}}, Y: Field{[10]uint32{0x000183f2, 0x0243e601, 0x00e19ae5, 0x0262ffb7, 0x0292974f, 0x0046d82f, 0x0240ec64, 0x004c4ada, 0x01b8b07e, 0x0028ca02}}}, + {X: Field{[10]uint32{0x0131d47b, 0x01c938f5, 0x022487f1, 0x035b0c5e, 0x013f89f2, 0x01d1cd2e, 0x00b1564d, 0x03c5f7a5, 0x01e0e2ee, 0x00363d57}}, Y: Field{[10]uint32{0x02b7d770, 0x00fa4b26, 0x02930052, 0x01317821, 0x00fa7dc6, 0x009c7993, 0x0016f71f, 0x018dc381, 0x02f5da57, 0x003a7f51}}}, + {X: Field{[10]uint32{0x016b6fdb, 0x0133d88d, 0x02b79d0f, 0x03b7b52e, 0x03a4ddb8, 0x01ddc5a7, 0x01573014, 0x02cc7fe7, 0x01bbfaa2, 0x003e9bf2}}, Y: Field{[10]uint32{0x0357d494, 0x01083803, 0x01b331b4, 0x033e7de0, 0x0043a2ad, 0x012c4476, 0x02fd1e4d, 0x01e431eb, 0x03cddfdd, 0x002dbfd5}}}, + {X: Field{[10]uint32{0x01b58e9a, 0x00fc2758, 0x02ae6bb9, 0x005d94f9, 0x00f93590, 0x02eb4126, 0x03752d9a, 0x03b765a7, 0x028ce748, 0x0008e7c0}}, Y: Field{[10]uint32{0x00f8b516, 0x013a3b05, 0x02f7c064, 0x028a46f6, 0x01d55c8a, 0x02dec50b, 0x02463b7b, 0x03dae9ee, 0x02b78831, 0x0005f7ff}}}, + {X: Field{[10]uint32{0x025e4f3b, 0x03e3dd25, 0x017bd99a, 0x00523c96, 0x00ecad3c, 0x00e26ee9, 0x0071db05, 0x025dbe67, 0x03fb728d, 0x000bbdb2}}, Y: Field{[10]uint32{0x01b0fd00, 0x006d83de, 0x00273b41, 0x010b3c5d, 0x03deeef5, 0x0364e8de, 0x01ebe8c1, 0x001e30fc, 0x03a7a382, 0x0006689e}}}, + {X: Field{[10]uint32{0x03064a0e, 0x025d764c, 0x0343698b, 0x011f614d, 0x021a4292, 0x00dde1c7, 0x03042f13, 0x00c57a23, 0x032b9af8, 0x0025cb5c}}, Y: Field{[10]uint32{0x024fd28b, 0x02bd36ea, 0x021d4f40, 0x00fc97f7, 0x02a5c2ae, 0x012f2ee8, 0x02380fee, 0x00ee1d02, 0x03baba4c, 0x000c2054}}}, + {X: Field{[10]uint32{0x02062a4c, 0x03c9d1db, 0x02ed33c4, 0x03b6bd08, 0x02e788bc, 0x0215052f, 0x03aa2951, 0x0263c60c, 0x0334ba49, 0x000f4de2}}, Y: Field{[10]uint32{0x02c4c8a3, 0x03686a3c, 0x0017093e, 0x00e34dd6, 0x013c3d52, 0x027dd700, 0x0087b502, 0x03e46602, 0x019c9217, 0x0011a915}}}, + {X: Field{[10]uint32{0x015c3087, 0x03e20b4e, 0x011e376b, 0x03c9f591, 0x02b13d70, 0x02f8ecd8, 0x032b289a, 0x02ceabf4, 0x003b1fc1, 0x003eec80}}, Y: Field{[10]uint32{0x00dfdabd, 0x028c5701, 0x00a81653, 0x00753906, 0x03f28e5b, 0x0305f6c0, 0x02b96bb9, 0x00d8a933, 0x02a5c462, 0x0025f219}}}, + {X: Field{[10]uint32{0x037a0471, 0x0137a3e1, 0x0247e6e1, 0x02debed6, 0x00295efd, 0x016389b1, 0x03d27a92, 0x02c7e802, 0x014e8eea, 0x0000a3ea}}, Y: Field{[10]uint32{0x01d23276, 0x016a4242, 0x022a5514, 0x0065345d, 0x03622219, 0x0233a743, 0x007b5e20, 0x03a3cf03, 0x010af2ee, 0x003dd867}}}, + {X: Field{[10]uint32{0x01308ae9, 0x033283be, 0x00f25c12, 0x00cc21e6, 0x014be272, 0x03ea3f8a, 0x0227ede6, 0x030455c5, 0x02857eb9, 0x0011c228}}, Y: Field{[10]uint32{0x024fa449, 0x00dae472, 0x00c3550e, 0x019821ea, 0x02854034, 0x02a4b3d5, 0x020ab601, 0x00e642cb, 0x01642e77, 0x003cd7e6}}}, + {X: Field{[10]uint32{0x0048a62f, 0x013cbe26, 0x02c6a636, 0x032cdad8, 0x02a82427, 0x00f3bb5b, 0x00903dcb, 0x02e1d362, 0x00976ff4, 0x0024d020}}, Y: Field{[10]uint32{0x015f3c6f, 0x033ed8fa, 0x020aeff3, 0x012262f1, 0x03daf64d, 0x0282eafd, 0x032d4fe0, 0x019d926a, 0x0162d4e2, 0x0038969a}}}, + {X: Field{[10]uint32{0x020ddf9a, 0x01676f1c, 0x03cac039, 0x037495b2, 0x039e0d24, 0x02959988, 0x0195da93, 0x00072b8c, 0x03a08182, 0x003d290a}}, Y: Field{[10]uint32{0x02000f86, 0x0349f802, 0x0396a60f, 0x0239c8c3, 0x0110bd4c, 0x01ce44a1, 0x01194afe, 0x03bfc1d7, 0x03cc0be3, 0x0023f49b}}}, + {X: Field{[10]uint32{0x03a6240c, 0x006c59b8, 0x009919c5, 0x03bed06c, 0x03791cac, 0x025f82a5, 0x0339ef61, 0x03350033, 0x0216e65b, 0x00316b69}}, Y: Field{[10]uint32{0x016eb8c3, 0x000229fe, 0x011a04a7, 0x01e9834d, 0x01cc2678, 0x02441aba, 0x01b0b323, 0x0318b721, 0x0168fe41, 0x00393197}}}, + {X: Field{[10]uint32{0x00c640e7, 0x02b84020, 0x002baca2, 0x01215844, 0x01e8b1fa, 0x00186969, 0x017c62e5, 0x03646f2f, 0x02c3d3f1, 0x001f064f}}, Y: Field{[10]uint32{0x03873ccd, 0x01672b65, 0x0333a26b, 0x01a0752c, 0x0103b8e0, 0x02294da1, 0x000ff310, 0x0023cf90, 0x00955114, 0x00331f3e}}}, + {X: Field{[10]uint32{0x011bd3c3, 0x0000ac2b, 0x016f1d96, 0x01547b1c, 0x0122b763, 0x039a8706, 0x01656293, 0x03c4a0c8, 0x01438e7c, 0x001dd509}}, Y: Field{[10]uint32{0x03d2137f, 0x02fe0022, 0x007c4deb, 0x00c80306, 0x01edf7d9, 0x022182be, 0x006eec20, 0x00def864, 0x029d212c, 0x000dd1c5}}}, + {X: Field{[10]uint32{0x03d90992, 0x02643d89, 0x02c5a3b9, 0x010f9536, 0x00bb48ff, 0x002af46a, 0x01c0f7f9, 0x039e1be9, 0x0399fa75, 0x0024b754}}, Y: Field{[10]uint32{0x0311b7ba, 0x0152484f, 0x029a406e, 0x00c664cb, 0x00ee4932, 0x031b14d2, 0x025c824a, 0x020f830b, 0x028ef937, 0x00172c6f}}}, + {X: Field{[10]uint32{0x0293157d, 0x01b77bf5, 0x00b376eb, 0x029ede87, 0x004f66e7, 0x0294cbf8, 0x03550532, 0x03ae4042, 0x0028468e, 0x00305dc2}}, Y: Field{[10]uint32{0x019a2e11, 0x01f492a0, 0x02bc2d2e, 0x0269de9d, 0x02070e5e, 0x0186b928, 0x029e262f, 0x01f51ff4, 0x003da014, 0x00036959}}}, + {X: Field{[10]uint32{0x036378c8, 0x03f7732b, 0x00ad533c, 0x0396fa2a, 0x01a8baab, 0x0044e4bf, 0x009a5341, 0x03948919, 0x0116e90a, 0x0004dcb8}}, Y: Field{[10]uint32{0x00346af9, 0x00adb972, 0x004d6e9b, 0x03ccaf16, 0x011d0a1c, 0x02369bd1, 0x038c2aaf, 0x01d6ef70, 0x00a26957, 0x0017bef5}}}, + {X: Field{[10]uint32{0x01dda936, 0x00b61a99, 0x00c008f3, 0x03eb840e, 0x0105e2b7, 0x03cc24a7, 0x01520097, 0x028acaf3, 0x021e9fa1, 0x000aef7c}}, Y: Field{[10]uint32{0x039d45ec, 0x0280b24c, 0x0364cb0b, 0x0331610e, 0x011806eb, 0x02a20cd8, 0x02c0dcd2, 0x02f77185, 0x01986008, 0x00146de2}}}, + {X: Field{[10]uint32{0x013005e1, 0x010e2f5d, 0x03f7f6a7, 0x01f09bb8, 0x039b63cc, 0x01bc8485, 0x0230d49e, 0x017b5de0, 0x00a4d049, 0x000d9a53}}, Y: Field{[10]uint32{0x00bc0af8, 0x02a8345c, 0x039075f5, 0x02da56d7, 0x03a87f48, 0x00635499, 0x031e17db, 0x02c4ccff, 0x03f3bbdc, 0x000b9278}}}, + {X: Field{[10]uint32{0x032013b8, 0x01225600, 0x027e85e6, 0x01cdaee2, 0x036fbc13, 0x004f12ab, 0x0113bf8d, 0x03850e9a, 0x00b1dc9c, 0x00090f61}}, Y: Field{[10]uint32{0x027f28bf, 0x02af56db, 0x02b91108, 0x020cb7ff, 0x0021a3dd, 0x037b1784, 0x023c2dc6, 0x031c77ff, 0x03adb6be, 0x0000e4c5}}}, + {X: Field{[10]uint32{0x0191ec92, 0x02550acb, 0x0185de03, 0x037bc641, 0x020ba6df, 0x0284aa3f, 0x00eab821, 0x03cfda0e, 0x03875255, 0x00076220}}, Y: Field{[10]uint32{0x0324b489, 0x0080dfcc, 0x012bc46c, 0x02b76f64, 0x039ccabd, 0x00bc2bbc, 0x0233538d, 0x03e05575, 0x03e2e919, 0x002a74e2}}}, + {X: Field{[10]uint32{0x01be3765, 0x01be6b2c, 0x00955645, 0x00a1e920, 0x015512d6, 0x01d0dd47, 0x0160e2aa, 0x00cddbdd, 0x03754c0d, 0x000e6887}}, Y: Field{[10]uint32{0x0035e005, 0x00baa750, 0x031bde0b, 0x02c4e914, 0x01ef4950, 0x0156ed12, 0x00188c4d, 0x035e78ef, 0x00a52a7f, 0x000f3cc9}}}, + {X: Field{[10]uint32{0x002e21c8, 0x0249e3ad, 0x029e948d, 0x007e9595, 0x0118ab0a, 0x00b19fdb, 0x01394a95, 0x0177ca87, 0x020cd8e2, 0x002843fd}}, Y: Field{[10]uint32{0x01f9e991, 0x013d4083, 0x03237bfd, 0x00d7c0b2, 0x0389fd2b, 0x03e2451c, 0x000c0bd4, 0x00bbe077, 0x01633ce8, 0x002d17cb}}}, + {X: Field{[10]uint32{0x03bcbcb1, 0x031167ad, 0x022b25bb, 0x03377092, 0x01bb801a, 0x01ae5c7e, 0x011f7a64, 0x010bdc41, 0x03920d50, 0x002f09a5}}, Y: Field{[10]uint32{0x01235665, 0x00d6f5dc, 0x031f478b, 0x0378760f, 0x02c7fab6, 0x0248175f, 0x0301530c, 0x00818586, 0x01fc1c03, 0x002dc111}}}, + {X: Field{[10]uint32{0x0037cb95, 0x00709024, 0x00da99a6, 0x0123daf3, 0x025f0ef4, 0x0076d110, 0x02a7f95d, 0x00da0aa0, 0x01fefd5a, 0x000f5c9e}}, Y: Field{[10]uint32{0x00159740, 0x01980bdc, 0x021622de, 0x024c3364, 0x019a2ea1, 0x02e89253, 0x0342cca2, 0x016df88a, 0x02cae636, 0x0037d489}}}, + {X: Field{[10]uint32{0x00dbe588, 0x00b0b57a, 0x02e2fd55, 0x03439085, 0x01bc439a, 0x0146cf54, 0x036c2bd9, 0x02bc02e4, 0x0130ef92, 0x0038315b}}, Y: Field{[10]uint32{0x00555fee, 0x0212ceda, 0x03e0f064, 0x031e921c, 0x03f35189, 0x01d9a683, 0x01bd1862, 0x01711103, 0x037d02a7, 0x0030af45}}}, + {X: Field{[10]uint32{0x0073315b, 0x0266b89e, 0x03c15d99, 0x00c909ca, 0x00f0d6e3, 0x00d2ebc7, 0x00398306, 0x02fd4bf6, 0x00e52b7b, 0x0026fe58}}, Y: Field{[10]uint32{0x018d0405, 0x0188e1c7, 0x001c9066, 0x03df6732, 0x01551862, 0x02914dce, 0x0016cb16, 0x007732c0, 0x019d20e0, 0x0002ca1c}}}, + {X: Field{[10]uint32{0x00351198, 0x0120280d, 0x019dc0d5, 0x0117511f, 0x0287fffb, 0x011d5f83, 0x017a6b14, 0x029c6b98, 0x016be60b, 0x000837c6}}, Y: Field{[10]uint32{0x02eb07d8, 0x003387c9, 0x020ae996, 0x01610bfb, 0x02f12ba3, 0x02b42aea, 0x03d49539, 0x001c6e81, 0x01430c0d, 0x00271c8b}}}, + {X: Field{[10]uint32{0x029bac17, 0x01998772, 0x036330a2, 0x01c48ed7, 0x00455a5f, 0x02055260, 0x019693d0, 0x02d02e51, 0x01360208, 0x000210f0}}, Y: Field{[10]uint32{0x02f12078, 0x0137d1bc, 0x00edec9b, 0x008e19dc, 0x02d0c74f, 0x0076e950, 0x011820d3, 0x03f1034b, 0x018d9095, 0x00356d6f}}}, + {X: Field{[10]uint32{0x008d11a0, 0x02f1c890, 0x01c03e05, 0x032dcbe7, 0x03708a3f, 0x02d1b5bb, 0x024ee0ca, 0x007a837a, 0x00df702c, 0x0024426d}}, Y: Field{[10]uint32{0x02dc507a, 0x03b322e5, 0x03242cf4, 0x031e44ee, 0x007348e9, 0x030b0c09, 0x03151954, 0x020072d4, 0x02c18be5, 0x001d6ea8}}}, + {X: Field{[10]uint32{0x0191113c, 0x03bbcf16, 0x02db2329, 0x00b8dc9f, 0x018e5155, 0x0080f167, 0x02dff03c, 0x02a6ec4a, 0x01f5c960, 0x003c4334}}, Y: Field{[10]uint32{0x028c465a, 0x03c2fc57, 0x0151b8f3, 0x03191e58, 0x009d2e03, 0x03fb998b, 0x01746898, 0x036a9859, 0x00e16f65, 0x002a12b2}}}, + {X: Field{[10]uint32{0x00e747a8, 0x03f9ab44, 0x03a071ea, 0x03437d62, 0x010ae0d6, 0x02297d4e, 0x0077b69a, 0x0180beb4, 0x013cffd3, 0x0027c1dc}}, Y: Field{[10]uint32{0x03ee867b, 0x03579723, 0x00afe58c, 0x00e95e5c, 0x01cbb4ea, 0x020be3b0, 0x003d7357, 0x02420f37, 0x007342b5, 0x002b7f32}}}, + {X: Field{[10]uint32{0x0195801a, 0x018cd0b3, 0x019f3640, 0x01b2c483, 0x005ce9ec, 0x03fe25e3, 0x032b870f, 0x015cd04e, 0x010e3290, 0x001b4767}}, Y: Field{[10]uint32{0x0031018f, 0x0153e31a, 0x010efba1, 0x025e48b9, 0x0325a3f5, 0x00eef738, 0x0345f7c2, 0x02d80935, 0x00a895d3, 0x001942f9}}}, + {X: Field{[10]uint32{0x00dcbd82, 0x0083319b, 0x03fa7128, 0x026771d9, 0x015c649f, 0x0387ec52, 0x027791c7, 0x033251e8, 0x01a56b3a, 0x00125c61}}, Y: Field{[10]uint32{0x03e6568c, 0x01aa5443, 0x01c3df5b, 0x02fdd060, 0x00f33ce5, 0x039d5968, 0x00078b2f, 0x0386c5f9, 0x037c11da, 0x001f5446}}}, + {X: Field{[10]uint32{0x000a743f, 0x0153fcc4, 0x030a2c31, 0x02f85291, 0x019a35f7, 0x00b361f0, 0x01b8bc75, 0x03ae7137, 0x00f9848e, 0x003ffdce}}, Y: Field{[10]uint32{0x032c38ec, 0x03fcdccb, 0x01df57bd, 0x02685c21, 0x00211b97, 0x01171628, 0x0037cdcf, 0x00f25dda, 0x0255cd91, 0x00041ae2}}}, + {X: Field{[10]uint32{0x001b4830, 0x024086e6, 0x00e38ccb, 0x03d177f2, 0x0141899e, 0x01f58005, 0x026876a3, 0x011b2d11, 0x01a48d35, 0x000c80e4}}, Y: Field{[10]uint32{0x0251b102, 0x01c48159, 0x0000f09c, 0x01f798ce, 0x0323fa2d, 0x015c1ed2, 0x002f3032, 0x0250479d, 0x0030b455, 0x0011bd8c}}}, + {X: Field{[10]uint32{0x0185fe9e, 0x005b8017, 0x013f9adf, 0x001848a0, 0x00558791, 0x01d8c7c6, 0x0137f7fb, 0x03a2349a, 0x0240a925, 0x002f9133}}, Y: Field{[10]uint32{0x036e1dc4, 0x02c0998a, 0x0089324d, 0x032a6906, 0x02ca6948, 0x03d12db8, 0x02806d4b, 0x01b719f9, 0x01e7d22e, 0x0005d56b}}}, + {X: Field{[10]uint32{0x0333ddae, 0x00810d73, 0x012ddeeb, 0x002d0cea, 0x03da6aa8, 0x019bf0a8, 0x03b05314, 0x035827e0, 0x02b158dd, 0x00234fc1}}, Y: Field{[10]uint32{0x0337af63, 0x011c1752, 0x01f2c4c7, 0x0106630f, 0x02f1d0a6, 0x02f4ba50, 0x036e5f4d, 0x0144eee2, 0x0299efde, 0x000b5552}}}, + {X: Field{[10]uint32{0x01596729, 0x03aa11a4, 0x02627210, 0x01d1d0ad, 0x00d0c71d, 0x00153f30, 0x01c1cb3a, 0x03d54c95, 0x039cf258, 0x003e0529}}, Y: Field{[10]uint32{0x032d867d, 0x004fdd68, 0x002dc318, 0x022bb7ae, 0x010271ce, 0x0347cf51, 0x0080c42f, 0x02d2c88f, 0x0095be48, 0x0000467f}}}, + {X: Field{[10]uint32{0x0142fb60, 0x0399097a, 0x03ec8109, 0x03efbe45, 0x01d77e57, 0x038ab4c1, 0x0262bfbe, 0x03c76d76, 0x01461c37, 0x00257a3f}}, Y: Field{[10]uint32{0x00e2db93, 0x000c0a82, 0x00d09a03, 0x03f8c1ad, 0x01d3d5b1, 0x002d162e, 0x01ace316, 0x033686a9, 0x031edfdb, 0x003770a2}}}, + {X: Field{[10]uint32{0x03981e77, 0x02ac3a29, 0x02149e2d, 0x0303d0db, 0x026f4e5c, 0x03f08209, 0x0320604c, 0x02205af1, 0x03fc47e1, 0x00301950}}, Y: Field{[10]uint32{0x03021441, 0x00d20c65, 0x0234ee66, 0x00c45fb1, 0x01281854, 0x00653327, 0x034819ac, 0x029f0844, 0x0065f3a4, 0x000881c1}}}, + {X: Field{[10]uint32{0x00d5c68e, 0x025c21ad, 0x001caa2b, 0x0142f580, 0x010fd5b0, 0x037b6138, 0x014d116b, 0x02bbe928, 0x015b3716, 0x001260f6}}, Y: Field{[10]uint32{0x03f0a279, 0x036b8b01, 0x01b0280c, 0x0299beb0, 0x00f5e609, 0x02f4efbf, 0x03d47bce, 0x033450cc, 0x026da2ef, 0x0004dcd0}}}, + {X: Field{[10]uint32{0x02afe6ab, 0x0332560f, 0x03ef61fd, 0x03b79adc, 0x03ad8054, 0x01782143, 0x022cd092, 0x012e5cee, 0x00c692e8, 0x0028af57}}, Y: Field{[10]uint32{0x02a5ce2b, 0x02c9d9f9, 0x02a4e4f0, 0x025e5e56, 0x0133d8d7, 0x027e0093, 0x019011b9, 0x006c7985, 0x038af914, 0x003329b9}}}, + {X: Field{[10]uint32{0x036d741a, 0x026353da, 0x02b60bf6, 0x0098c45e, 0x00b8f852, 0x00d9f421, 0x0076281b, 0x0139ce54, 0x0231a18f, 0x00187264}}, Y: Field{[10]uint32{0x026cbfe5, 0x0102051b, 0x019299d3, 0x02c19f52, 0x01af886d, 0x02823006, 0x00616090, 0x0074c192, 0x03979e7f, 0x00208c52}}}, + {X: Field{[10]uint32{0x02b34304, 0x0182ff5a, 0x00db73ed, 0x00bdb1af, 0x02d4072a, 0x0244cc86, 0x03114fc7, 0x014a64e9, 0x03ef32c5, 0x001296b3}}, Y: Field{[10]uint32{0x020c03c9, 0x006c15a6, 0x024da9f6, 0x02252bfe, 0x0301323e, 0x012c9b6f, 0x03f9f296, 0x0166c9a6, 0x0229c068, 0x0001ca56}}}, + {X: Field{[10]uint32{0x037f4023, 0x03d6da2e, 0x02d487d4, 0x004d085a, 0x02604e50, 0x0197b2b1, 0x036dcb6c, 0x012530ac, 0x0355866f, 0x0038119d}}, Y: Field{[10]uint32{0x00b336b3, 0x01690b0c, 0x02029d9e, 0x01d4a3b3, 0x01ae9459, 0x0098626b, 0x032f9558, 0x03e86fd4, 0x03c5974d, 0x0037ab40}}}, + {X: Field{[10]uint32{0x03215ea7, 0x03034aee, 0x0059640d, 0x01808211, 0x01c4e8be, 0x016c788c, 0x014ca74b, 0x017f7d6d, 0x0305c926, 0x001a1bf7}}, Y: Field{[10]uint32{0x017ea7da, 0x018794f5, 0x01710b65, 0x03cb1640, 0x03c93723, 0x03fcd9de, 0x02f950eb, 0x02e5d02b, 0x021cedf9, 0x003d350f}}}, + {X: Field{[10]uint32{0x03d21253, 0x017b2ee2, 0x01cb9fce, 0x009347c5, 0x03e2bcd9, 0x00365b4b, 0x022b7d7b, 0x02c833a9, 0x018500f9, 0x000491da}}, Y: Field{[10]uint32{0x03522004, 0x03785b4a, 0x03842e32, 0x03c90f75, 0x033f1950, 0x010e2702, 0x027b356b, 0x013f190e, 0x00b39e90, 0x0034d0df}}}, + {X: Field{[10]uint32{0x02d17b1b, 0x0220098a, 0x0324e453, 0x007b4be9, 0x03b5eb1e, 0x0027d95e, 0x03322910, 0x0326cb96, 0x00ec9a87, 0x00195af7}}, Y: Field{[10]uint32{0x012fa64d, 0x00f738be, 0x01d116aa, 0x00c345f0, 0x030cdfc8, 0x03f7023f, 0x03f704b3, 0x0393dfd8, 0x010c47b6, 0x0031dd23}}}, + {X: Field{[10]uint32{0x0083e4b5, 0x02fae5ad, 0x0004c3ae, 0x00f983af, 0x027a3d40, 0x020f3b44, 0x0279b244, 0x00584832, 0x010e0f72, 0x0016dfdc}}, Y: Field{[10]uint32{0x03b08080, 0x03dca12f, 0x0386b698, 0x01caf65a, 0x0011db4b, 0x0396a7bb, 0x00196e8d, 0x022bb98d, 0x03a7f068, 0x0006d455}}}, + {X: Field{[10]uint32{0x01e6b4da, 0x034f4128, 0x00deabc8, 0x00f6074b, 0x01254521, 0x003e4361, 0x015bf184, 0x029bd55e, 0x02d0552b, 0x002ff299}}, Y: Field{[10]uint32{0x01754e75, 0x01b746bc, 0x0069084b, 0x0282f776, 0x00223043, 0x0032ce84, 0x00c46383, 0x01095f01, 0x00cc290d, 0x0012442c}}}, + {X: Field{[10]uint32{0x00496f16, 0x01980ca2, 0x009247f5, 0x006f3b1c, 0x001447c1, 0x0015ef45, 0x018f8ef2, 0x032ef91e, 0x028fb79d, 0x00198fe9}}, Y: Field{[10]uint32{0x03c41786, 0x009ea9a0, 0x03951f2b, 0x028aacc3, 0x00a42597, 0x00747d08, 0x005598a9, 0x02f48f62, 0x02fa1f3b, 0x000eb38b}}}, + {X: Field{[10]uint32{0x015c4321, 0x017c7792, 0x03004608, 0x02b82033, 0x017c1675, 0x0379a289, 0x02f2f86e, 0x02e3c87f, 0x03338a3d, 0x0009f338}}, Y: Field{[10]uint32{0x00d373ae, 0x01aa0ac9, 0x01c294b1, 0x027f68aa, 0x037aefa6, 0x018f53f7, 0x0144a002, 0x0391cbac, 0x018c8bab, 0x001c55af}}}, + {X: Field{[10]uint32{0x00bd9560, 0x016f1359, 0x00ce35aa, 0x012c703a, 0x03b727be, 0x00f15d7b, 0x027940e1, 0x017026f8, 0x02c452ec, 0x00352701}}, Y: Field{[10]uint32{0x038d18b0, 0x01d48e39, 0x033c2f51, 0x022551b7, 0x015d7ad7, 0x02680d8d, 0x0266469f, 0x004029ca, 0x0118b298, 0x000b194d}}}, + {X: Field{[10]uint32{0x004ad08a, 0x0005fdd5, 0x01129cfa, 0x03f442bf, 0x023d7bf4, 0x01034ef5, 0x00ecd251, 0x02009b4f, 0x007ebd02, 0x001a5820}}, Y: Field{[10]uint32{0x020e7c7c, 0x02bab024, 0x03f4cf7b, 0x020eaa6a, 0x036f9a63, 0x02f69af7, 0x03cb5465, 0x03eb9cad, 0x004f28be, 0x0029e141}}}, + {X: Field{[10]uint32{0x01f8faa1, 0x02d4c94f, 0x03aa1ede, 0x03156953, 0x02fc9263, 0x0295f6eb, 0x0375abeb, 0x00e9c68e, 0x033654b6, 0x0020e0af}}, Y: Field{[10]uint32{0x0049b011, 0x003f3c42, 0x026dcb6d, 0x00f6515d, 0x02dc9bef, 0x0189d987, 0x021da269, 0x032d4d11, 0x01dcc319, 0x003817ae}}}, + {X: Field{[10]uint32{0x02b0bffb, 0x0168f452, 0x0379acc4, 0x026bd814, 0x02b7e705, 0x02a4cbc8, 0x008cca9f, 0x021db9e3, 0x037930ec, 0x00200ee4}}, Y: Field{[10]uint32{0x01e5790f, 0x02bc1195, 0x01152b52, 0x03745f34, 0x01cb90d1, 0x01e1a51c, 0x03ec7d0b, 0x03470b1b, 0x001c5202, 0x001f6c8d}}}, + {X: Field{[10]uint32{0x02c5292c, 0x022e8474, 0x03e08f99, 0x003a2591, 0x02cb78fb, 0x01cfeac0, 0x0165ff4f, 0x02ba7c44, 0x01290ab6, 0x0032d36c}}, Y: Field{[10]uint32{0x03d1c9c2, 0x01506235, 0x02e9ef61, 0x00235d53, 0x02745c24, 0x02ecd9bf, 0x0280ad65, 0x00e12ed6, 0x039a1776, 0x000332bb}}}, + {X: Field{[10]uint32{0x00d115a2, 0x014ab37b, 0x0179aa81, 0x01ee1325, 0x038fd6af, 0x0301c3f1, 0x038be8af, 0x03d9c8e0, 0x035750e9, 0x003eaca1}}, Y: Field{[10]uint32{0x00b3f065, 0x00452430, 0x024956c3, 0x00c7671b, 0x03764ee9, 0x02ba14c0, 0x017d3b83, 0x0158b54e, 0x002889cd, 0x003567f8}}}, + {X: Field{[10]uint32{0x0249bbc1, 0x00092159, 0x0376c198, 0x01335a96, 0x02fbdf84, 0x0020cf84, 0x02e3f036, 0x03b8f43d, 0x02baf870, 0x003761e7}}, Y: Field{[10]uint32{0x0143c55a, 0x011c5b26, 0x038f7309, 0x00ab1a94, 0x00b041a1, 0x0355a5b2, 0x03a324c1, 0x01704775, 0x00c3a99a, 0x0039eec1}}}, + {X: Field{[10]uint32{0x00f8016e, 0x03330120, 0x00d8ed00, 0x01d06d7e, 0x031df68f, 0x0095cac4, 0x01319d57, 0x01a87b6a, 0x03be29b0, 0x001ea92b}}, Y: Field{[10]uint32{0x03fe7130, 0x0252c5d4, 0x00d2dc9d, 0x00364df0, 0x02423fd0, 0x0080ae5c, 0x002e3c13, 0x02161dfc, 0x029fb77b, 0x00057de6}}}, + {X: Field{[10]uint32{0x0039f890, 0x03933163, 0x0168ba19, 0x03a455c7, 0x00c34354, 0x00b5b998, 0x03fee64f, 0x00c99575, 0x03f5876a, 0x0024517c}}, Y: Field{[10]uint32{0x0285d8ff, 0x03368a2c, 0x036c998e, 0x00755d9a, 0x0337650c, 0x0284235b, 0x009ba7fd, 0x027f416f, 0x015dcf36, 0x0011782a}}}, + {X: Field{[10]uint32{0x0111ac9e, 0x03dd03d1, 0x0131713d, 0x03224688, 0x00a5a7f6, 0x001dfcf7, 0x0337afa2, 0x0004347b, 0x035236fb, 0x0015142d}}, Y: Field{[10]uint32{0x026ba175, 0x03c0603f, 0x01ef08b6, 0x00e99c42, 0x0313ff56, 0x037b4b5e, 0x021084d3, 0x03e1b537, 0x015762be, 0x0029f1fb}}}, + {X: Field{[10]uint32{0x00666a0f, 0x00b3e230, 0x001b84c3, 0x01bf44d4, 0x01bbf276, 0x0105f41d, 0x00256d67, 0x0378b32e, 0x01725e48, 0x002e9b03}}, Y: Field{[10]uint32{0x0125e442, 0x0061bcf9, 0x006405ed, 0x012e46f3, 0x02bdecd6, 0x0296640c, 0x02da6693, 0x00a67d43, 0x01327137, 0x00334aa4}}}, + {X: Field{[10]uint32{0x0205c921, 0x036dece5, 0x00b0553a, 0x0276ab56, 0x01d25a64, 0x0263ef7d, 0x011006b7, 0x03aed1bf, 0x01ff1fee, 0x002e5208}}, Y: Field{[10]uint32{0x01077c05, 0x03162afe, 0x0365a72d, 0x02bbbb10, 0x01f45ccf, 0x015d2bf3, 0x003d950c, 0x024a8b1f, 0x03a079bb, 0x00085626}}}, + {X: Field{[10]uint32{0x01a0681d, 0x0221e7c3, 0x01f8198f, 0x037a4f58, 0x00432f14, 0x02a58f32, 0x00e0d7a5, 0x01f1dadc, 0x0046497f, 0x001190d9}}, Y: Field{[10]uint32{0x01c83a5f, 0x03982352, 0x012398a3, 0x0396cfb2, 0x0348c367, 0x03a89797, 0x01a8aab5, 0x03604043, 0x024e90c4, 0x000a4d12}}}, + {X: Field{[10]uint32{0x00c1ae1d, 0x02c2ce39, 0x00d0802b, 0x005d6ea8, 0x01bd3be9, 0x02f2c33c, 0x019185b7, 0x0042f925, 0x02c6a2e2, 0x002f6396}}, Y: Field{[10]uint32{0x01b1fa19, 0x03c22a8b, 0x000a94ed, 0x0069f0fb, 0x0269c6f7, 0x03b22229, 0x03773a5e, 0x025d5769, 0x03e46dcc, 0x001ace06}}}, + {X: Field{[10]uint32{0x01f22493, 0x03463fe6, 0x0231974c, 0x024ece50, 0x017fb645, 0x022b39db, 0x00c34055, 0x029e943d, 0x021ac428, 0x00309f07}}, Y: Field{[10]uint32{0x019cf57c, 0x013e4671, 0x004a4954, 0x03cf0178, 0x0025108a, 0x02a7d665, 0x031884cf, 0x01ece872, 0x0261c12f, 0x003f2575}}}, + {X: Field{[10]uint32{0x03eb30d5, 0x00ebc89d, 0x03c029e5, 0x00050103, 0x0044c17c, 0x0364119b, 0x028168ee, 0x01329549, 0x0161837e, 0x00285d95}}, Y: Field{[10]uint32{0x02c28eb5, 0x022d9b2d, 0x015aecfc, 0x01d743e8, 0x033032c7, 0x0039b8bd, 0x0255d0b3, 0x0222ff35, 0x01e2b8d4, 0x00228b7b}}}, + {X: Field{[10]uint32{0x01ddbea9, 0x03a63060, 0x02f93b03, 0x00de0c03, 0x00e9eea7, 0x01e2e8da, 0x029279f6, 0x0332461f, 0x030d35ca, 0x000afda4}}, Y: Field{[10]uint32{0x0225209d, 0x03e81a79, 0x00db46e2, 0x00c30d74, 0x02d0f3f9, 0x0232a385, 0x03ee5383, 0x022ec0ff, 0x01433aaa, 0x00228b53}}}, + {X: Field{[10]uint32{0x0077c8d7, 0x019a9c1a, 0x0056a6a0, 0x01680e96, 0x00a36d08, 0x019d5649, 0x03005f4d, 0x02bbf643, 0x03259cc5, 0x001d9a9d}}, Y: Field{[10]uint32{0x00049190, 0x03078cd2, 0x03dc4171, 0x0012fd02, 0x0090b46d, 0x03a4e3bc, 0x01bfad15, 0x038b9fc1, 0x00974fd9, 0x0036cfeb}}}, + {X: Field{[10]uint32{0x00461268, 0x024bfe46, 0x03242887, 0x038e6a44, 0x02134196, 0x025cca76, 0x00c333c0, 0x0087517f, 0x00cd953f, 0x00349698}}, Y: Field{[10]uint32{0x010c7863, 0x03c9339e, 0x0270f397, 0x026240d4, 0x00a07ad5, 0x008d4a60, 0x03874e71, 0x020d7f6e, 0x03e8bd04, 0x00226fca}}}, + {X: Field{[10]uint32{0x02d95d68, 0x03f90a72, 0x000b360d, 0x021a3286, 0x019bf569, 0x01997abf, 0x021f467b, 0x0096c99c, 0x029e8b71, 0x0031eca3}}, Y: Field{[10]uint32{0x0295c398, 0x030ea9e7, 0x02167b37, 0x00d1d91a, 0x009ec7bf, 0x02f291da, 0x03947ed8, 0x02d869c7, 0x0158b3a7, 0x0002b0a3}}}, + {X: Field{[10]uint32{0x0059bc24, 0x02cd375f, 0x03a97ce8, 0x01803c7d, 0x0120c291, 0x033f3a61, 0x022d7a74, 0x0230a6b6, 0x008ac61f, 0x0038a948}}, Y: Field{[10]uint32{0x01c70830, 0x0367d6cf, 0x00e4a880, 0x009dddff, 0x03a152ce, 0x03a438e0, 0x034483b4, 0x02281332, 0x02144970, 0x00037a2e}}}, + {X: Field{[10]uint32{0x02e205b1, 0x0112b7c4, 0x03ca53e8, 0x000620a1, 0x016976e0, 0x0150259f, 0x032b152a, 0x037e574e, 0x00cd02e8, 0x00387a39}}, Y: Field{[10]uint32{0x03bfc9e2, 0x03633bd0, 0x02491a77, 0x025fd51a, 0x020d34aa, 0x008cdc8f, 0x03f00918, 0x0151ef2c, 0x02f9cdc7, 0x002976f1}}}, + {X: Field{[10]uint32{0x012b6512, 0x0152fc27, 0x0375bea4, 0x02cee257, 0x023c3143, 0x03cec70a, 0x02284803, 0x013954ac, 0x02514a68, 0x002c83c2}}, Y: Field{[10]uint32{0x000d02c9, 0x0376a5ba, 0x02c31e0e, 0x02173513, 0x00f7c955, 0x0250681f, 0x000b0c31, 0x00345027, 0x0380676d, 0x002f0f6c}}}, + {X: Field{[10]uint32{0x0029d3ec, 0x029a5a83, 0x009499cf, 0x0326e5d2, 0x039582cb, 0x001eb25b, 0x00d9d8d4, 0x02fdde53, 0x0123b1ad, 0x002dc69a}}, Y: Field{[10]uint32{0x00b4f151, 0x03f38699, 0x03b1c89b, 0x03b9d9e7, 0x027b6d75, 0x00e31cb4, 0x03113c8d, 0x01563ee4, 0x03899d59, 0x001d4608}}}, + {X: Field{[10]uint32{0x03d3bb3f, 0x013571a9, 0x01a65200, 0x017c3677, 0x00a82f41, 0x01d595e2, 0x00ef76c0, 0x00e34633, 0x01ac68ba, 0x003291eb}}, Y: Field{[10]uint32{0x028701df, 0x02b41412, 0x0137842f, 0x0130e5a7, 0x02ccd845, 0x00597f56, 0x0035385e, 0x00ce0910, 0x00ab1b78, 0x0002f566}}}, + {X: Field{[10]uint32{0x0140e441, 0x03e6740b, 0x025eea45, 0x0313667d, 0x014fb989, 0x03757932, 0x034eeece, 0x03a7ba7e, 0x0148acee, 0x0017eb78}}, Y: Field{[10]uint32{0x033831f0, 0x00775335, 0x031cb5e6, 0x032ce50f, 0x0015afd1, 0x02374b00, 0x01104cac, 0x015606b1, 0x023ae82e, 0x002e9bf2}}}, + {X: Field{[10]uint32{0x025f84e9, 0x02b698ff, 0x0049e8ad, 0x014798ce, 0x02e834c8, 0x0073cc3e, 0x000ba01a, 0x033c0024, 0x01d214fc, 0x001d9f72}}, Y: Field{[10]uint32{0x00404639, 0x00c85799, 0x017d69ee, 0x03466b86, 0x0101a5bc, 0x03f5f2ff, 0x02b97a52, 0x003958b5, 0x0111aca3, 0x00231942}}}, + {X: Field{[10]uint32{0x024f06d9, 0x01c5e2df, 0x0286b91d, 0x035d1df9, 0x01523544, 0x030f01b6, 0x02a7648f, 0x00a88176, 0x0161445e, 0x0009fe3e}}, Y: Field{[10]uint32{0x02a73a60, 0x01f37f60, 0x00172042, 0x010886fa, 0x02379332, 0x02de7977, 0x0196bce6, 0x01efa5d5, 0x032782cd, 0x000e4442}}}, + {X: Field{[10]uint32{0x033de668, 0x000c594f, 0x035bc6a4, 0x02260e5c, 0x008a1b28, 0x01e77792, 0x024070bf, 0x01792eb6, 0x005b343b, 0x00237812}}, Y: Field{[10]uint32{0x02d5729d, 0x033eb883, 0x021431c2, 0x01ca0c0b, 0x0212fbba, 0x03164492, 0x011c1a44, 0x0383df5f, 0x03676f43, 0x00240c15}}}, + {X: Field{[10]uint32{0x012df0ff, 0x03973165, 0x01fe1b68, 0x0287bb25, 0x005b6af8, 0x039c030a, 0x038d3188, 0x03a2ba2a, 0x036c8770, 0x001790f6}}, Y: Field{[10]uint32{0x006c7aa6, 0x00a90e54, 0x01f90ae0, 0x00f4dc1d, 0x009aeebb, 0x0179671e, 0x02a10911, 0x02f3f8e8, 0x028dd85f, 0x001a2098}}}, + {X: Field{[10]uint32{0x01a4ed54, 0x0047d096, 0x037a0893, 0x00f3b7fa, 0x03610286, 0x00b7c508, 0x00af4e35, 0x00c0379f, 0x02ab4bf4, 0x001f6cae}}, Y: Field{[10]uint32{0x038e8a84, 0x0009bf85, 0x000cbd33, 0x01328f53, 0x01e553a8, 0x02164273, 0x03fbbcd6, 0x0112f8c0, 0x01a2fbbb, 0x000e1d58}}}, + {X: Field{[10]uint32{0x0196c6f1, 0x0134436e, 0x00bbefc0, 0x0332aee4, 0x00cdbefd, 0x00cb6cf9, 0x03df9e82, 0x01a21f47, 0x01253910, 0x0025b6a1}}, Y: Field{[10]uint32{0x03f9edcc, 0x00f4c026, 0x00509402, 0x024adff3, 0x0345948c, 0x0370cca1, 0x035d6513, 0x01cd067e, 0x02314912, 0x001949c6}}}, + {X: Field{[10]uint32{0x01d50613, 0x029e122b, 0x03b0081b, 0x003eb2e5, 0x0264cd4c, 0x00e2d217, 0x03a51fa8, 0x004a13d6, 0x01cb14eb, 0x00213bfc}}, Y: Field{[10]uint32{0x02febd9e, 0x01e314a9, 0x004fc7f5, 0x0044cbca, 0x03609f45, 0x033a0631, 0x01e602b6, 0x002a35ec, 0x01c8a654, 0x000249b2}}}, + {X: Field{[10]uint32{0x02adfbbe, 0x00665078, 0x017057fe, 0x02489756, 0x00416e6a, 0x02fe5280, 0x02e60007, 0x00a83fd7, 0x03718e2a, 0x0007ae58}}, Y: Field{[10]uint32{0x0005b855, 0x027da84c, 0x01bb009c, 0x008f3fc3, 0x02d3cf05, 0x00018e6a, 0x03d40115, 0x0377eb70, 0x02d89635, 0x00121c2a}}}, + {X: Field{[10]uint32{0x03bdc098, 0x01372e1d, 0x03fd8d45, 0x0287dda0, 0x03c75fd4, 0x02bc64f7, 0x01a8696b, 0x03cc1c6f, 0x036a6ea3, 0x000a6528}}, Y: Field{[10]uint32{0x03856766, 0x00b1312f, 0x02eb3fc8, 0x000c6dda, 0x009969bf, 0x025bf4fa, 0x006bd0be, 0x00f5335e, 0x00eea727, 0x0039197a}}}, + {X: Field{[10]uint32{0x0126c414, 0x01d63567, 0x03c00237, 0x032edfcb, 0x01d2b68f, 0x038b65f6, 0x01b115b5, 0x015e8b0a, 0x0370f3d3, 0x000979fe}}, Y: Field{[10]uint32{0x0356c4f2, 0x0099dcfc, 0x02631fed, 0x00c3beb2, 0x00206b73, 0x00ea1aae, 0x0130fa01, 0x02257afd, 0x0370a3bb, 0x00125668}}}, + {X: Field{[10]uint32{0x007c0623, 0x035624cd, 0x020ea0df, 0x01496221, 0x03c3945c, 0x0359af16, 0x030481a2, 0x01aef867, 0x039880bf, 0x003f0e1f}}, Y: Field{[10]uint32{0x009d67c4, 0x0198faed, 0x001ff16e, 0x01d03042, 0x027ba332, 0x00d1812a, 0x01d07af7, 0x03c0ca72, 0x000e83ca, 0x002275ee}}}, + {X: Field{[10]uint32{0x0201e1d4, 0x000ca53f, 0x03a99e2f, 0x02d00217, 0x00ef5c00, 0x03c5ddc8, 0x0220fa82, 0x0327f840, 0x0368c25f, 0x003142bc}}, Y: Field{[10]uint32{0x017579fb, 0x02532dae, 0x0131ba42, 0x003e5e32, 0x0327d9f1, 0x03a52bde, 0x012b80d9, 0x00c25024, 0x03264198, 0x0030ddde}}}, + {X: Field{[10]uint32{0x00041f94, 0x01d85f84, 0x01bea7c9, 0x0121553d, 0x00d7015c, 0x010697c8, 0x02003629, 0x0366ea8b, 0x0109d524, 0x00283e74}}, Y: Field{[10]uint32{0x010e9ad0, 0x00f18a9c, 0x019f1daf, 0x00e80e9a, 0x012eae92, 0x01915838, 0x0277ff2c, 0x0384200f, 0x0002daa5, 0x000a3147}}}, + {X: Field{[10]uint32{0x00316de1, 0x0218a8d2, 0x03a285da, 0x008f2f37, 0x032138bc, 0x0020012c, 0x03271389, 0x02dc2161, 0x02270058, 0x00107449}}, Y: Field{[10]uint32{0x001b9673, 0x037d3c1f, 0x02999d29, 0x029243ac, 0x00341d90, 0x03545764, 0x015f4513, 0x033b2572, 0x0029153b, 0x000189dc}}}, + {X: Field{[10]uint32{0x0299ca87, 0x003e159b, 0x0221cfb8, 0x02335875, 0x02577444, 0x00ceb6ce, 0x03afb77e, 0x03d50f64, 0x00cefe6c, 0x00251316}}, Y: Field{[10]uint32{0x004d66b5, 0x01cc5c0a, 0x03056e74, 0x022adf5e, 0x02329495, 0x01af2c88, 0x011c5576, 0x031c5f2a, 0x001c9b7f, 0x00301c7b}}}, + {X: Field{[10]uint32{0x02437145, 0x02afafef, 0x00635f2b, 0x01645ca4, 0x009a27be, 0x023baed6, 0x0029bf18, 0x01c73a70, 0x0312e06d, 0x000cc1ea}}, Y: Field{[10]uint32{0x0061d213, 0x01aa5272, 0x014c3c6b, 0x03425f61, 0x014a6966, 0x0227a602, 0x008dd9bf, 0x0242451d, 0x00b928cf, 0x0022270f}}}, + {X: Field{[10]uint32{0x01cb9ae6, 0x006dfcd1, 0x028acdee, 0x01c8b6da, 0x0272b745, 0x0090c1ed, 0x0203abd0, 0x00893932, 0x00111eb2, 0x0010aebc}}, Y: Field{[10]uint32{0x0212ee06, 0x0257ea8b, 0x00b11256, 0x0349cde7, 0x02879515, 0x02348b17, 0x0164bec3, 0x037a892d, 0x0128d608, 0x002fccb8}}}, + {X: Field{[10]uint32{0x0002c621, 0x01321531, 0x006bfe73, 0x03028af2, 0x01166c69, 0x0043445d, 0x03be8981, 0x012f4127, 0x02bbbe7b, 0x00215aea}}, Y: Field{[10]uint32{0x0112ac0c, 0x035d0612, 0x0321b943, 0x025e7b51, 0x011f8251, 0x0388a7a2, 0x0024161b, 0x007f4f35, 0x03c9b6d3, 0x000928c8}}}, + {X: Field{[10]uint32{0x024a9cd4, 0x01b60c34, 0x02c1c321, 0x03720172, 0x0195aeea, 0x03a0e0d3, 0x00c224ed, 0x0050f61d, 0x018ed998, 0x000e36f0}}, Y: Field{[10]uint32{0x027eae4a, 0x02247945, 0x00a03570, 0x03b9fe4d, 0x01271c6e, 0x0242ad71, 0x038e2eaa, 0x015de3a8, 0x0126f7e8, 0x0009cfb0}}}, + {X: Field{[10]uint32{0x0188dc59, 0x007ae052, 0x00d92c98, 0x019697d2, 0x015e24c0, 0x020dd2bc, 0x026bb20c, 0x008ca4c5, 0x005bffcd, 0x000d6772}}, Y: Field{[10]uint32{0x03bf39c6, 0x0058beaf, 0x0184ae58, 0x000fdded, 0x02c4a057, 0x010def7f, 0x0237d06e, 0x01622e40, 0x01f7deef, 0x0037977b}}}, + {X: Field{[10]uint32{0x023666ea, 0x028d6df1, 0x0283bb1c, 0x01d275fc, 0x031d872a, 0x0297cf69, 0x022f73a6, 0x007220f7, 0x0065e2e9, 0x003841a0}}, Y: Field{[10]uint32{0x03752cd9, 0x0347c05c, 0x00523c5e, 0x03eb2375, 0x01a7e155, 0x01da140d, 0x0128afaa, 0x0021461e, 0x0252b5df, 0x0020430e}}}, + {X: Field{[10]uint32{0x03b19d83, 0x02141b76, 0x033c70fd, 0x01b72f57, 0x00b56495, 0x03377f7f, 0x03171830, 0x032699b8, 0x037137e7, 0x00141d9f}}, Y: Field{[10]uint32{0x00d4fff8, 0x00e19928, 0x039fa5e3, 0x019d58f6, 0x02393b61, 0x03cb82b8, 0x03d24dd3, 0x017fb601, 0x015f5e9d, 0x003870b7}}}, + {X: Field{[10]uint32{0x02e65864, 0x02d66039, 0x00a725a0, 0x017fd4f6, 0x035e0127, 0x03f3a84d, 0x0216d0de, 0x020d57c4, 0x03f0cdf8, 0x001133b2}}, Y: Field{[10]uint32{0x011cd40e, 0x030eb5bd, 0x00d2e025, 0x008bc572, 0x02e8e3f0, 0x019ef18d, 0x0290550e, 0x03a6e7b8, 0x028e5094, 0x00011a55}}}, + {X: Field{[10]uint32{0x02aa18b3, 0x038d11e5, 0x005e886c, 0x024980b8, 0x0387ed8a, 0x02bf28ae, 0x02fe5976, 0x02c1fbe8, 0x00ea43cb, 0x00060c32}}, Y: Field{[10]uint32{0x031da49d, 0x0077610b, 0x01d658bf, 0x03ead511, 0x013c8ce2, 0x03e8c704, 0x03562037, 0x02bb9d9f, 0x0328e064, 0x0037d544}}}, + {X: Field{[10]uint32{0x019326c6, 0x0242a92f, 0x02b799bf, 0x03ab13e3, 0x00708245, 0x0107d3b9, 0x0033417a, 0x01eac947, 0x037a473a, 0x00163552}}, Y: Field{[10]uint32{0x009b2a85, 0x01168bb1, 0x027891ce, 0x024febd7, 0x02a16920, 0x02c72cb2, 0x00c331bf, 0x0381f329, 0x033815e2, 0x0028647c}}}, + {X: Field{[10]uint32{0x02c6792c, 0x024ad544, 0x01af7ba1, 0x01b913a0, 0x0170a18b, 0x00bf2618, 0x03af1044, 0x0204b980, 0x02049507, 0x003c3739}}, Y: Field{[10]uint32{0x03b966e4, 0x029ec26e, 0x015ce3ad, 0x02d31536, 0x004cc60e, 0x033c3d58, 0x0248df55, 0x01bb588f, 0x0221b5e8, 0x00308868}}}, + {X: Field{[10]uint32{0x01dd2ab5, 0x02e94156, 0x013d40d7, 0x033eb94a, 0x02e4b958, 0x0112c9ab, 0x02aaa046, 0x00c0aca1, 0x01e572c0, 0x0010bec2}}, Y: Field{[10]uint32{0x01f2299f, 0x0206f546, 0x00099437, 0x02a09d25, 0x03f46e1b, 0x020f9f45, 0x007ec769, 0x01a223ef, 0x0173a00e, 0x001e7041}}}, + {X: Field{[10]uint32{0x03502ecb, 0x034104bc, 0x005deea2, 0x02f222c0, 0x00935465, 0x0036b443, 0x028db25e, 0x00326a18, 0x0151ddae, 0x001eb7c5}}, Y: Field{[10]uint32{0x01acfd20, 0x01621bca, 0x01a9bb3c, 0x019e7651, 0x012e031e, 0x02744428, 0x01ef5c36, 0x03aa4832, 0x03a2143c, 0x00195f02}}}, + {X: Field{[10]uint32{0x002c7a5a, 0x03f6470a, 0x013454df, 0x0324a049, 0x013a7bfd, 0x03f0bd6f, 0x0271310a, 0x03da9b58, 0x00b956fd, 0x00375692}}, Y: Field{[10]uint32{0x00a52657, 0x03df305f, 0x021e385d, 0x03364685, 0x002ac6b0, 0x02564119, 0x03521072, 0x01fcdbea, 0x00372e06, 0x001ce434}}}, + {X: Field{[10]uint32{0x021466fe, 0x01b0b622, 0x0301d293, 0x00ec74d8, 0x0013ac76, 0x00134b38, 0x01c783b1, 0x011652f8, 0x00b51537, 0x0018c614}}, Y: Field{[10]uint32{0x0190882e, 0x03cc8a31, 0x03a8578b, 0x000addfb, 0x022016d2, 0x015ca6b3, 0x0241416c, 0x01f912a4, 0x021ea9b6, 0x00092433}}}, + {X: Field{[10]uint32{0x03a0bca5, 0x02c381bc, 0x028e0741, 0x01a6f71a, 0x00244668, 0x00e8f331, 0x0185cd58, 0x0088a6bb, 0x01e4d673, 0x000ccb8e}}, Y: Field{[10]uint32{0x017578e7, 0x01135217, 0x025aa602, 0x0037d351, 0x00b66ac3, 0x01d2b597, 0x018b1b40, 0x014ab829, 0x030360db, 0x00242103}}}, + {X: Field{[10]uint32{0x022f0c97, 0x0144e90d, 0x00980de7, 0x02ca479c, 0x01d72c0e, 0x00994cbc, 0x027224e8, 0x03870595, 0x0156f0c7, 0x00378065}}, Y: Field{[10]uint32{0x00411ea3, 0x002bb61a, 0x03e479af, 0x02f5925d, 0x01d75fa5, 0x018e094a, 0x022227a6, 0x02210105, 0x039d1cc9, 0x000e68f5}}}, + {X: Field{[10]uint32{0x00ed859f, 0x0128b2c9, 0x002a6809, 0x01b28fe4, 0x024f81b7, 0x006e0b91, 0x02ffbf26, 0x036a0031, 0x00c8e675, 0x00131130}}, Y: Field{[10]uint32{0x0245ac34, 0x00ad64c3, 0x0224663b, 0x025c68e8, 0x00c54978, 0x010eae2b, 0x03f28002, 0x01177b63, 0x02881ecc, 0x0016787b}}}, + {X: Field{[10]uint32{0x009286a2, 0x00d953cc, 0x03d28279, 0x02f844f9, 0x02a4e0dc, 0x017773b1, 0x01f4d1a8, 0x03867970, 0x01b80481, 0x003980ce}}, Y: Field{[10]uint32{0x009d9d59, 0x0229c1a9, 0x0372d1b0, 0x03e51cdf, 0x00bc58e3, 0x034a96a6, 0x01c7998e, 0x02507ed4, 0x02cca607, 0x002687ba}}}, + {X: Field{[10]uint32{0x00a25e66, 0x0340b0f6, 0x01be0d44, 0x015714a1, 0x010c6ad9, 0x0023ffb1, 0x00bc4727, 0x024bce7d, 0x02e30e72, 0x00043d0b}}, Y: Field{[10]uint32{0x00916a25, 0x02a5d73b, 0x01106034, 0x0037c069, 0x00183e13, 0x0259f3c5, 0x01d5f2bc, 0x038a3f6e, 0x01f053eb, 0x0001bcd9}}}, + {X: Field{[10]uint32{0x0329c445, 0x014f6199, 0x01548b6d, 0x02b964ea, 0x03703af3, 0x031635d2, 0x02fb0f31, 0x019a1df4, 0x01cad128, 0x001f824c}}, Y: Field{[10]uint32{0x036b0b0b, 0x00485d07, 0x03ffbf5a, 0x03e489dc, 0x00a9c34a, 0x0015bd32, 0x03caf7e8, 0x02d07598, 0x01fc75ea, 0x0001792e}}}, + {X: Field{[10]uint32{0x03963f22, 0x00450d55, 0x00f1c6a0, 0x03036c9e, 0x01b7f1ac, 0x020d8bdf, 0x014cd1a7, 0x00f1b3fc, 0x037ef961, 0x000d8c4f}}, Y: Field{[10]uint32{0x03d7edc2, 0x006ead10, 0x03a69864, 0x0246e998, 0x0033960a, 0x01250817, 0x006627f5, 0x0108c52b, 0x02ab02a9, 0x00079a51}}}, + {X: Field{[10]uint32{0x0069fe01, 0x03b15d0a, 0x033bb55c, 0x0164bf23, 0x0283f9ba, 0x03aa8ba7, 0x0218a63c, 0x030996cb, 0x02d88eed, 0x00088fbb}}, Y: Field{[10]uint32{0x01bbd71c, 0x00842570, 0x025ffeff, 0x02e35a1f, 0x005593f7, 0x00b5cb44, 0x0232cc89, 0x026ff3cd, 0x01734ae2, 0x001c8488}}}, + {X: Field{[10]uint32{0x00b3ec20, 0x01e9698a, 0x035fc31b, 0x02f3e6a6, 0x0160dbb2, 0x021e5684, 0x03b9b321, 0x00b1780f, 0x02c93330, 0x002daf57}}, Y: Field{[10]uint32{0x019dd495, 0x0074b672, 0x0242cd0f, 0x03ce6d0a, 0x0034f373, 0x00ed22eb, 0x01f051d6, 0x0397fac5, 0x03f298a8, 0x003ee7e1}}}, + {X: Field{[10]uint32{0x00e24668, 0x02a2c053, 0x012c98f0, 0x02fcee3e, 0x025a802d, 0x023f55eb, 0x03f69ce0, 0x0093ec55, 0x03603b1c, 0x0028d969}}, Y: Field{[10]uint32{0x000a89f9, 0x02fb0fd7, 0x037606f2, 0x02d06c34, 0x02578005, 0x02606039, 0x0238cc72, 0x02af680a, 0x022b7746, 0x001cf990}}}, + {X: Field{[10]uint32{0x03cebe6e, 0x017287b5, 0x0213aa23, 0x007b4de7, 0x03e24bac, 0x03511a81, 0x02dba309, 0x00dbdbd2, 0x03ac43e4, 0x003a1be3}}, Y: Field{[10]uint32{0x00a166af, 0x00f5b6fd, 0x01cd4a91, 0x0009df30, 0x00930b74, 0x00a8044d, 0x03a592c4, 0x02a6f5c4, 0x00efaa75, 0x00079eed}}}, + {X: Field{[10]uint32{0x039bd5ac, 0x00fa1a3a, 0x015cc993, 0x038ba162, 0x0205cab3, 0x03f78768, 0x0109304c, 0x0155c76b, 0x01fad2b2, 0x003d695f}}, Y: Field{[10]uint32{0x037c1ff6, 0x02317a61, 0x029b0c76, 0x001afb2e, 0x008eb909, 0x02265e89, 0x018dad26, 0x00390754, 0x025e8fc9, 0x00349977}}}, + {X: Field{[10]uint32{0x01f76c7b, 0x011651dd, 0x010f145c, 0x01f28afc, 0x01665660, 0x009192a7, 0x02fd8cab, 0x024dd1f9, 0x017a0725, 0x00387734}}, Y: Field{[10]uint32{0x02f9a20e, 0x03799012, 0x0278a130, 0x0339ae55, 0x00dff819, 0x008caf51, 0x009feb61, 0x021b4992, 0x0310023f, 0x003be8b0}}}, + {X: Field{[10]uint32{0x03a801ff, 0x00e1b373, 0x00c3bafd, 0x03f73290, 0x03cb3774, 0x00176a6a, 0x0274b80a, 0x025ab46f, 0x03dd0849, 0x0020fe2a}}, Y: Field{[10]uint32{0x03c3f63d, 0x01f18e92, 0x002873d3, 0x00ddaa89, 0x001c85ff, 0x019a1a36, 0x02e792d9, 0x02c4395b, 0x0164329f, 0x00099faf}}}, + {X: Field{[10]uint32{0x03259fae, 0x02e952d3, 0x02454ea9, 0x006bcd3f, 0x03ca324b, 0x01445216, 0x0087c716, 0x016a409d, 0x01796ca8, 0x00153327}}, Y: Field{[10]uint32{0x02b2da2a, 0x007682fe, 0x020f2e20, 0x030545f3, 0x023c6ce8, 0x03adba0e, 0x0016e9ed, 0x021875f4, 0x0071ef0b, 0x000630e4}}}, + {X: Field{[10]uint32{0x01402ba4, 0x0070864c, 0x02a51635, 0x02b25039, 0x001c3f65, 0x0047e1d1, 0x0075ac1b, 0x0059538a, 0x012ae009, 0x002744a9}}, Y: Field{[10]uint32{0x00e81d2e, 0x038bc04e, 0x02e52bbe, 0x00b754fd, 0x03c6d7e4, 0x03d7eb58, 0x00d17f39, 0x0066bd06, 0x03342762, 0x0017feec}}}, + {X: Field{[10]uint32{0x02496998, 0x00ed9979, 0x038244f2, 0x03c2dfbc, 0x00488007, 0x03c86ba9, 0x0030917f, 0x006a4734, 0x01b76682, 0x001966ff}}, Y: Field{[10]uint32{0x014784e0, 0x0139f289, 0x039db844, 0x023af087, 0x03d7321a, 0x022f091f, 0x01ef96b7, 0x03a168d0, 0x00bc4506, 0x000ab5c2}}}, + {X: Field{[10]uint32{0x02b4670b, 0x004a5b97, 0x02413d60, 0x013d5cc4, 0x0276ba1b, 0x0055269a, 0x026a2538, 0x020dd121, 0x0233d4a0, 0x0038b313}}, Y: Field{[10]uint32{0x00672476, 0x00502269, 0x00e18797, 0x002e8eca, 0x0080497f, 0x01930dc6, 0x039780ea, 0x01fcd1ed, 0x0325347e, 0x0014a2ca}}}, + {X: Field{[10]uint32{0x02edec68, 0x023840f9, 0x00131e24, 0x03133f2b, 0x01e8dbba, 0x02941580, 0x02164c0f, 0x030db26c, 0x039c9e21, 0x0014a702}}, Y: Field{[10]uint32{0x027125f4, 0x01c04a55, 0x037e4967, 0x017c272e, 0x026cb74f, 0x034b80e1, 0x0269e6ab, 0x032804cd, 0x002172a0, 0x001fe912}}}, + {X: Field{[10]uint32{0x003b63a1, 0x034d54da, 0x01dda654, 0x01efacbc, 0x033d89e5, 0x0203ed96, 0x00d6532a, 0x01f47055, 0x03afbe6a, 0x000a275a}}, Y: Field{[10]uint32{0x01005400, 0x024c5a1f, 0x03b53388, 0x03c30f36, 0x03db149f, 0x01499e1d, 0x022c62c5, 0x02358583, 0x0063d3ce, 0x002007d2}}}, + {X: Field{[10]uint32{0x010f14a1, 0x00bb3c1e, 0x0099e51f, 0x01616346, 0x022eab9b, 0x0096ad0c, 0x0005bb34, 0x019981f0, 0x00c9e3b3, 0x00345aa1}}, Y: Field{[10]uint32{0x0156dd07, 0x02d46614, 0x0231379b, 0x033c672c, 0x0146ec79, 0x02b5b83c, 0x03fc5ea4, 0x014ca3e7, 0x01ab1071, 0x000b1bd7}}}, + {X: Field{[10]uint32{0x036348f1, 0x01c0ec5a, 0x01affd30, 0x03cfb2f8, 0x02a7062d, 0x010436ac, 0x00a6893e, 0x02fefd10, 0x00394fda, 0x00340f2b}}, Y: Field{[10]uint32{0x009d19f9, 0x006e8d11, 0x0040ae5d, 0x01b4e390, 0x035dc4a8, 0x037a56c6, 0x0185c087, 0x02cc5dc3, 0x03cef530, 0x000548c4}}}, + {X: Field{[10]uint32{0x0063379b, 0x0081ed6a, 0x03101c89, 0x0012f125, 0x00d4c4b6, 0x03e5a616, 0x00a7d851, 0x0312a5df, 0x006ca673, 0x002d9acf}}, Y: Field{[10]uint32{0x01624da4, 0x01c2c18c, 0x005609a4, 0x03fc61fc, 0x004b00fa, 0x0055a587, 0x02c63cb7, 0x01aab120, 0x0163771c, 0x00152e89}}}, + {X: Field{[10]uint32{0x018c8c45, 0x039145aa, 0x01e86236, 0x01a01e71, 0x002a43fb, 0x039f5cc2, 0x013127f4, 0x01f35f7f, 0x024411c4, 0x002f9a11}}, Y: Field{[10]uint32{0x026733da, 0x03eba160, 0x01f19a15, 0x030bf7ba, 0x017d78dd, 0x0273143a, 0x0395aaeb, 0x00da30b8, 0x0383c61d, 0x001e4a43}}}, + {X: Field{[10]uint32{0x03cbde9b, 0x00afedeb, 0x00e0c5c6, 0x007e4748, 0x0004ca42, 0x03b8061e, 0x021de709, 0x03d18d35, 0x03a09f34, 0x0011e2b0}}, Y: Field{[10]uint32{0x030988bf, 0x00dd955e, 0x01c34f6e, 0x012fddfb, 0x02e4bc7d, 0x015d2d7d, 0x027526f5, 0x0042586b, 0x03b2ccbc, 0x003dd4bc}}}, + {X: Field{[10]uint32{0x033dcfc8, 0x01905e63, 0x00796e70, 0x028301df, 0x037271a2, 0x026f5284, 0x00d7de9c, 0x01c6a675, 0x015af2ed, 0x001d17cd}}, Y: Field{[10]uint32{0x02e288b9, 0x010818e1, 0x01f6e672, 0x00998c31, 0x02d4fe88, 0x00c78664, 0x0105816c, 0x021fc27b, 0x01f46b0c, 0x00063a98}}}, + {X: Field{[10]uint32{0x02760ce0, 0x02d483a1, 0x014b218d, 0x0238e2ae, 0x00a3157a, 0x00a1909f, 0x01aede59, 0x02a2c242, 0x016f9878, 0x001539ef}}, Y: Field{[10]uint32{0x01fb8e49, 0x03493cc3, 0x03f2ddc1, 0x0294d034, 0x00e04bdb, 0x01d7702d, 0x033c6386, 0x02d12347, 0x000dc1ea, 0x0035edf6}}}, + {X: Field{[10]uint32{0x007d510e, 0x012807e8, 0x0120827e, 0x02b8f725, 0x0399b018, 0x0331bfaf, 0x006f5c7f, 0x010c7bcf, 0x03b655eb, 0x003fd5ab}}, Y: Field{[10]uint32{0x0191e371, 0x03a6d109, 0x03509655, 0x00403a89, 0x02ec7232, 0x01268a35, 0x00388b40, 0x02c71e7d, 0x01b842d7, 0x0026feaf}}}, + {X: Field{[10]uint32{0x029cda72, 0x00e7487f, 0x02be382d, 0x01057fcf, 0x00ea511b, 0x0363a9e4, 0x01d02506, 0x023f219e, 0x0099ed29, 0x0030af30}}, Y: Field{[10]uint32{0x030f971f, 0x03b2d614, 0x03070aa1, 0x03c163be, 0x00825de4, 0x00bf4e31, 0x02c31a58, 0x03ddcd6d, 0x02c435ec, 0x001b1efc}}}, + {X: Field{[10]uint32{0x00e2ec4e, 0x020061c2, 0x000f599a, 0x00da242e, 0x02c8549e, 0x0271a07f, 0x014b9a11, 0x00cc79b1, 0x01449811, 0x0008e0fc}}, Y: Field{[10]uint32{0x0133a1f9, 0x0182838d, 0x01cb1448, 0x00fa774d, 0x00d8fff0, 0x00111c3c, 0x00a999a7, 0x02dad64e, 0x011fd846, 0x0004ead0}}}, + {X: Field{[10]uint32{0x02096048, 0x01afc31b, 0x016b817d, 0x01ca2778, 0x0209953f, 0x0293d499, 0x0244584b, 0x00762fe2, 0x01c0d4fa, 0x000bc89c}}, Y: Field{[10]uint32{0x03b42fc4, 0x0182d80b, 0x00ab57cd, 0x00f69bc5, 0x03a95717, 0x00fbd54f, 0x0332c226, 0x0143a2db, 0x005db40e, 0x00191bbc}}}, + {X: Field{[10]uint32{0x01e951c7, 0x007c9a89, 0x01d089bf, 0x03682b69, 0x03809e7a, 0x02c047ba, 0x01be55cb, 0x01e89fbb, 0x031b0f06, 0x002ded26}}, Y: Field{[10]uint32{0x037c33ed, 0x037b8b1f, 0x033315b2, 0x00811641, 0x014a9b7f, 0x01f2c0ca, 0x02ec95c0, 0x001496b5, 0x00aca816, 0x003fb1d8}}}, + {X: Field{[10]uint32{0x01409223, 0x0206a979, 0x03557941, 0x032e7c2b, 0x027765d4, 0x00b6be07, 0x01866eb1, 0x00f9725c, 0x01cad993, 0x000db238}}, Y: Field{[10]uint32{0x008b8fdf, 0x0064cab7, 0x00853e29, 0x017d4926, 0x0122f2e3, 0x0045baa5, 0x01cc7309, 0x008a0b5c, 0x02d0a025, 0x002257ad}}}, + {X: Field{[10]uint32{0x001ed523, 0x01ef78ef, 0x00d6a6ee, 0x00455a13, 0x00fa5b8a, 0x0330ac38, 0x0173e018, 0x00d6484c, 0x01276328, 0x000f2fa4}}, Y: Field{[10]uint32{0x0244dc81, 0x03cc33f3, 0x03055e4d, 0x02cf4264, 0x01c5149a, 0x01d7c785, 0x030aa9dc, 0x01b26e65, 0x01c922f9, 0x001ecb4f}}}, + {X: Field{[10]uint32{0x0247213c, 0x01fa5ed8, 0x02d164e6, 0x02640c53, 0x02fe0aec, 0x022c8e79, 0x0048d380, 0x0250648d, 0x0141c463, 0x001dba53}}, Y: Field{[10]uint32{0x01fa1278, 0x03061ac8, 0x03cb5a3b, 0x0392fca0, 0x03f9efe4, 0x01d7e8e3, 0x03460bfd, 0x001d2440, 0x02c32f01, 0x0023b929}}}, + {X: Field{[10]uint32{0x031851ec, 0x03cd0cd2, 0x00c08506, 0x009e3bb0, 0x025b265d, 0x01ffa76e, 0x01749e00, 0x039f9e85, 0x01cb12c0, 0x00124e49}}, Y: Field{[10]uint32{0x0062b193, 0x02c5af13, 0x01a9a1f5, 0x003b6067, 0x02e4a240, 0x03dcc299, 0x02b318f9, 0x029195b2, 0x006b3960, 0x001c2403}}}, + {X: Field{[10]uint32{0x003cdcbf, 0x01cebb71, 0x026b7511, 0x01aaa7d7, 0x00387330, 0x01208f4e, 0x0020eb4a, 0x00e4f5e6, 0x02bad1a1, 0x002cdff6}}, Y: Field{[10]uint32{0x0327030a, 0x03b18203, 0x0252f28f, 0x03ca78d5, 0x03dfd325, 0x00c29d69, 0x00df67be, 0x0344e788, 0x00de57fa, 0x002141bc}}}, + {X: Field{[10]uint32{0x00a5e8c1, 0x027d296c, 0x007033c2, 0x008c271b, 0x008f2b70, 0x027e41c9, 0x030c90e0, 0x017124ca, 0x020c48e9, 0x00111465}}, Y: Field{[10]uint32{0x00d7490c, 0x006da1f5, 0x024de53b, 0x013efbd4, 0x0228bc40, 0x01dd9a93, 0x01c9e1a4, 0x027d9a58, 0x0218d9ce, 0x0020d54e}}}, + {X: Field{[10]uint32{0x03ea3449, 0x018ee037, 0x00704caf, 0x006f21a7, 0x00785772, 0x00fe61c6, 0x00ab20eb, 0x01a6e603, 0x01a8697c, 0x0026c2b0}}, Y: Field{[10]uint32{0x027e60e9, 0x0159877e, 0x0045d65b, 0x008c1cba, 0x0361b617, 0x00a02614, 0x0232a582, 0x02fcfdc7, 0x0053bf1b, 0x00084393}}}, + {X: Field{[10]uint32{0x001e0851, 0x01a12d1e, 0x01cebe92, 0x03e9f6f4, 0x0132eca4, 0x03003731, 0x02d62de1, 0x013df848, 0x0355ccae, 0x00399a5c}}, Y: Field{[10]uint32{0x01bdc3cb, 0x02e88dba, 0x01da1736, 0x024509ef, 0x029d3ded, 0x02201aa0, 0x00353f71, 0x03bcf251, 0x00ffdbe5, 0x0007c48b}}}, + {X: Field{[10]uint32{0x0167201e, 0x027c983c, 0x03f2afe3, 0x01387311, 0x03ad480a, 0x00a22eb1, 0x0326f861, 0x02932807, 0x00f11a1a, 0x003fea24}}, Y: Field{[10]uint32{0x01439cb4, 0x011272a1, 0x02b5d69d, 0x03682c06, 0x00ac569c, 0x01f43ba3, 0x03c41497, 0x03f0f51c, 0x03c41716, 0x0005a237}}}, + {X: Field{[10]uint32{0x00b6bf47, 0x02c6d3d5, 0x02c14cd3, 0x015e51b1, 0x00c41fcc, 0x03012813, 0x02b09b15, 0x00e33d8f, 0x00f26ce2, 0x00242235}}, Y: Field{[10]uint32{0x00d2c2b9, 0x00997579, 0x02909bfe, 0x0204adc3, 0x032ae4ec, 0x00f4d676, 0x01c9943b, 0x000138f5, 0x0017bc61, 0x00278e01}}}, + {X: Field{[10]uint32{0x01576a91, 0x0023ff36, 0x0070767c, 0x0288b00d, 0x0299949c, 0x00ca5af0, 0x03f7e5fe, 0x018383f9, 0x01dac1e7, 0x0028ce57}}, Y: Field{[10]uint32{0x012393d3, 0x025039d1, 0x038706ee, 0x00337800, 0x02314185, 0x00f7f3ee, 0x03070162, 0x01b45c5b, 0x039a5403, 0x0013e2a1}}}, + {X: Field{[10]uint32{0x038ad651, 0x0219e2ca, 0x00ecbd20, 0x0035d4cc, 0x011a7730, 0x007da1aa, 0x00ef2345, 0x03078163, 0x016454aa, 0x00047953}}, Y: Field{[10]uint32{0x01c020f2, 0x022ce5b2, 0x026796e0, 0x01164234, 0x01aaa53f, 0x0154a893, 0x0121dfef, 0x0067e715, 0x01605a84, 0x001d26ca}}}, + {X: Field{[10]uint32{0x00327f30, 0x02023f19, 0x0174675e, 0x036a3932, 0x0198f5f0, 0x031c074a, 0x02d5a707, 0x03a08aad, 0x00df7b41, 0x00323c4f}}, Y: Field{[10]uint32{0x03199404, 0x01a251f0, 0x0194d441, 0x02b75827, 0x00445d7a, 0x007cd3d8, 0x00329d6a, 0x0270737b, 0x01df17c0, 0x0012269a}}}, + {X: Field{[10]uint32{0x02d84442, 0x00f3dba4, 0x0250cd46, 0x02522897, 0x029487f3, 0x0386a770, 0x00c628c3, 0x0120e2a5, 0x02dccf67, 0x00245d79}}, Y: Field{[10]uint32{0x03de1c22, 0x002061a3, 0x007298cb, 0x00ec6e0f, 0x03c13e19, 0x01e329e9, 0x0237e510, 0x01c49547, 0x013fed37, 0x0021c15c}}}, + {X: Field{[10]uint32{0x0220099b, 0x018efd0d, 0x0209d228, 0x03b36c5e, 0x005df8b9, 0x014eb028, 0x038f6b89, 0x03c3a7b9, 0x012fb6d5, 0x0023bb52}}, Y: Field{[10]uint32{0x020ff1bf, 0x03a22747, 0x039d99ec, 0x03f41036, 0x0082e1ac, 0x0090e7b2, 0x00f8b946, 0x00ba6367, 0x03421767, 0x0008e915}}}, + {X: Field{[10]uint32{0x015c2dd9, 0x03e8d9c3, 0x03756beb, 0x02f1946d, 0x035cde90, 0x00417d75, 0x0393f543, 0x001bbde5, 0x0223dbac, 0x0032e573}}, Y: Field{[10]uint32{0x024a9a48, 0x022f9785, 0x02a4fc61, 0x01d3dfb3, 0x0057d22d, 0x01c777ad, 0x035ed992, 0x02c301ce, 0x02bac023, 0x002584a9}}}, + {X: Field{[10]uint32{0x03a3c980, 0x02b24199, 0x007c915d, 0x024e7391, 0x01d8fdd4, 0x02d69de4, 0x02a8ebf8, 0x03fcdf50, 0x00c8bbd3, 0x00199c86}}, Y: Field{[10]uint32{0x00ec26c0, 0x02020f23, 0x00f2ace9, 0x039c19d4, 0x00452a21, 0x00156d55, 0x0344aab1, 0x02bf751a, 0x01799e19, 0x00375004}}}, + {X: Field{[10]uint32{0x02f76e5f, 0x0166be0c, 0x0385219b, 0x02d683b4, 0x000c7627, 0x0310a5a6, 0x013e855d, 0x01214739, 0x01c60ded, 0x002211e6}}, Y: Field{[10]uint32{0x021c4a6b, 0x036998b0, 0x005ac3af, 0x01dff33c, 0x0022e343, 0x014b379e, 0x00d2d371, 0x010231e7, 0x01ed84e6, 0x0008e35d}}}, + {X: Field{[10]uint32{0x0111d143, 0x03bbab5a, 0x0396a256, 0x0240e9af, 0x022cc8bb, 0x0093a9b4, 0x03a05bae, 0x0020b165, 0x036b5fc0, 0x0023663c}}, Y: Field{[10]uint32{0x00ab3cd3, 0x035ece38, 0x01516f2a, 0x00c6c770, 0x03de7df9, 0x0005a05d, 0x01b2fcf8, 0x00a9b541, 0x011afc90, 0x0009ba2b}}}, + {X: Field{[10]uint32{0x03d70ad2, 0x00fd2e0f, 0x001ae740, 0x0223219d, 0x03d1db23, 0x034bbec7, 0x032cbc28, 0x031b4c9f, 0x02cac0dd, 0x002ea418}}, Y: Field{[10]uint32{0x028b38c2, 0x012ec299, 0x019f78f2, 0x03f5edcf, 0x01674539, 0x00e05115, 0x0171ccd5, 0x039d5367, 0x035b3036, 0x0011cecc}}}, + {X: Field{[10]uint32{0x02cdca29, 0x007700c2, 0x008f01ff, 0x014c478a, 0x017453ca, 0x01588414, 0x029be675, 0x039825e9, 0x02d73bf0, 0x00128b4d}}, Y: Field{[10]uint32{0x02ca8f83, 0x0290e1ac, 0x001d8595, 0x0205236c, 0x029d694a, 0x00a63d7e, 0x0283ac6c, 0x00c73513, 0x01e7a903, 0x0003fda4}}}, + {X: Field{[10]uint32{0x0337d0c4, 0x018b8773, 0x01c4fcd3, 0x00db8015, 0x006b3651, 0x00b0c972, 0x00fb0d93, 0x012c5ad9, 0x028fd99c, 0x003a1a3c}}, Y: Field{[10]uint32{0x00d4a9eb, 0x00ab7b13, 0x00bca274, 0x0044df65, 0x0240e5fa, 0x02224426, 0x00e0440e, 0x0040d23a, 0x02c18340, 0x002b4cd1}}}, + {X: Field{[10]uint32{0x03abbf3b, 0x028d464a, 0x03eea99d, 0x025b6903, 0x03ea77e6, 0x0088e60c, 0x0177e566, 0x01b2944b, 0x0289830a, 0x001b17a1}}, Y: Field{[10]uint32{0x01779540, 0x03a5196b, 0x017c12be, 0x00351a96, 0x0356b983, 0x01d4d91f, 0x01c333dd, 0x002d81ef, 0x01f15fd0, 0x0030a781}}}, + {X: Field{[10]uint32{0x00046344, 0x0096fb07, 0x02210e1a, 0x0318942b, 0x01c317ad, 0x02e756a4, 0x0391cc86, 0x00b7feba, 0x02a56ebf, 0x002ce85c}}, Y: Field{[10]uint32{0x034ac3d5, 0x017ebe0e, 0x01d119fc, 0x030379e9, 0x02f06401, 0x026930be, 0x031fff90, 0x0035b6f4, 0x01799ae4, 0x000a3db7}}}, + {X: Field{[10]uint32{0x000d8f47, 0x02a53884, 0x02b80091, 0x03b1c68e, 0x00ac4a22, 0x0251a2a3, 0x00aed673, 0x035de694, 0x01d2e2f9, 0x000663c1}}, Y: Field{[10]uint32{0x03cd0414, 0x0226782d, 0x002b3cbf, 0x01a0d830, 0x03397089, 0x00ff2c88, 0x02e3baaf, 0x00c5cf2b, 0x003fc981, 0x00331a86}}}, + {X: Field{[10]uint32{0x0077f48e, 0x03d42aac, 0x039d89f0, 0x036de7f0, 0x0341ae77, 0x02142c1e, 0x007703ae, 0x029e452f, 0x038fa943, 0x001e2c85}}, Y: Field{[10]uint32{0x025274e7, 0x0272c558, 0x02beb11b, 0x03b30a7a, 0x01d78fce, 0x006006f8, 0x0389004e, 0x02c24a2e, 0x0234f2cb, 0x00217f4f}}}, + {X: Field{[10]uint32{0x01943f3e, 0x010fee36, 0x02dcccec, 0x03e757dc, 0x0023828e, 0x01c38a29, 0x017a7951, 0x0145d7e6, 0x03001d4c, 0x001bdc37}}, Y: Field{[10]uint32{0x028315ce, 0x007bb733, 0x03ee5f0f, 0x030aa37e, 0x02956a66, 0x01cc38a9, 0x039c34be, 0x020f9165, 0x0213b771, 0x00098c54}}}, + {X: Field{[10]uint32{0x01a9dccc, 0x030d676d, 0x03bd09cf, 0x00b47343, 0x02e3964b, 0x0116d649, 0x01509e3b, 0x01b4a741, 0x01443c94, 0x002ae04c}}, Y: Field{[10]uint32{0x00f5c5ac, 0x00db2a41, 0x01062063, 0x002cfd41, 0x0216b771, 0x031b184c, 0x005e5876, 0x01cebe83, 0x03150c12, 0x002baf7c}}}, + {X: Field{[10]uint32{0x01473ad3, 0x03a20f81, 0x021a20a3, 0x027ae8cc, 0x016b9456, 0x01f979bb, 0x0323e627, 0x00449c8d, 0x0391dd75, 0x0039cacd}}, Y: Field{[10]uint32{0x0328a3d8, 0x03d320a6, 0x0319fd4d, 0x02b220c2, 0x039c2091, 0x038e8a11, 0x03109ab5, 0x02aa83f4, 0x00742dbc, 0x0004c6cc}}}, + {X: Field{[10]uint32{0x023ded63, 0x00a10cb3, 0x00c74619, 0x01f15ad4, 0x02bb525d, 0x033141f6, 0x03df77af, 0x017940e3, 0x0296ecdd, 0x0032968c}}, Y: Field{[10]uint32{0x03c4ab9e, 0x0197f1bf, 0x0254b3f8, 0x0274af73, 0x005a1420, 0x00acd96f, 0x027258e4, 0x01deea40, 0x0394b7e1, 0x0022f6d9}}}, + {X: Field{[10]uint32{0x031a9222, 0x0069c038, 0x01819c88, 0x00569c9a, 0x02e7d2e8, 0x0300ec80, 0x01be59dc, 0x0233ff3b, 0x029f26ae, 0x003aa8ef}}, Y: Field{[10]uint32{0x0124ec1c, 0x03917065, 0x02acc735, 0x0059f35f, 0x0336ac28, 0x0077cb4e, 0x02f80265, 0x034d3183, 0x00d7a367, 0x0006d68b}}}, + {X: Field{[10]uint32{0x00e97728, 0x02c0f7ba, 0x02206582, 0x0399d21c, 0x0035a011, 0x019e4555, 0x022076d5, 0x03fdab85, 0x002d3ab4, 0x003aeea2}}, Y: Field{[10]uint32{0x01be16ac, 0x02f91d19, 0x010ed355, 0x0161ef7f, 0x018a004c, 0x027b6319, 0x02f2ac76, 0x034b3736, 0x02053d8d, 0x0025088a}}}, + {X: Field{[10]uint32{0x013aba86, 0x0248f20d, 0x01f446d8, 0x0345a3a3, 0x01ba88e0, 0x03688180, 0x03cb784e, 0x01774451, 0x03ea537a, 0x00328365}}, Y: Field{[10]uint32{0x028fba1f, 0x01f2a67d, 0x01b68016, 0x024a1d2d, 0x0196c978, 0x01124399, 0x02bb979a, 0x021bc623, 0x005889eb, 0x0021d2b2}}}, + {X: Field{[10]uint32{0x03b797e1, 0x0233ecfa, 0x01a24771, 0x002c3877, 0x0184a90a, 0x017f0671, 0x0398f98c, 0x01d151f9, 0x01653480, 0x0014778a}}, Y: Field{[10]uint32{0x03f7c54d, 0x03bfd600, 0x007bf87c, 0x012e6792, 0x03ace0ee, 0x03f37e69, 0x001952b0, 0x039ae557, 0x023aad04, 0x00204dd3}}}, + {X: Field{[10]uint32{0x01387509, 0x031bb230, 0x00df5151, 0x00d4d96e, 0x0287b521, 0x007523ed, 0x00e39bda, 0x01af8833, 0x011f0313, 0x0001a758}}, Y: Field{[10]uint32{0x0195bde0, 0x028b088c, 0x01fa7e9d, 0x02a9ac9c, 0x00fb84c0, 0x0170a5c8, 0x01127e1a, 0x01932b13, 0x0020563b, 0x001d78b6}}}, + {X: Field{[10]uint32{0x028aa135, 0x015f784e, 0x00a9cb2f, 0x03037914, 0x006fa4a4, 0x03737886, 0x02204561, 0x01983c8c, 0x00830558, 0x000c458c}}, Y: Field{[10]uint32{0x0346eae2, 0x0376fdbf, 0x03817539, 0x001f97ee, 0x0229e142, 0x038762dd, 0x008c636a, 0x005a20c0, 0x0096b134, 0x000975b5}}}, + {X: Field{[10]uint32{0x007ac334, 0x0335584b, 0x00274cc3, 0x00f61a13, 0x0111f462, 0x0342b66a, 0x002e5b44, 0x03353536, 0x02aaefa9, 0x002138d0}}, Y: Field{[10]uint32{0x0292a70e, 0x023d980a, 0x016540fb, 0x03ed42bb, 0x02f552af, 0x03f974bd, 0x00f0a324, 0x02665f21, 0x03ff260f, 0x003ee436}}}, + {X: Field{[10]uint32{0x03bf6562, 0x0199a499, 0x025bc64d, 0x02b2219e, 0x00fa812a, 0x03538ea8, 0x00468143, 0x02c45489, 0x0002969d, 0x00257bf1}}, Y: Field{[10]uint32{0x03371883, 0x0304d667, 0x034b3e82, 0x027f5dea, 0x02e4567d, 0x0114957e, 0x033f00d4, 0x0094b15b, 0x00316149, 0x000c56f3}}}, + {X: Field{[10]uint32{0x038d07fe, 0x01727a35, 0x01507e3d, 0x0126ed40, 0x0255b401, 0x0156ee6f, 0x0289993a, 0x027682f4, 0x023cf87e, 0x001488d8}}, Y: Field{[10]uint32{0x00613b56, 0x02023f2b, 0x03deffa5, 0x00876cf2, 0x000832e9, 0x0001dbe2, 0x01b1c16b, 0x03d0dc02, 0x0221dd2d, 0x001aff42}}}, + {X: Field{[10]uint32{0x00cb0a4f, 0x0132e5f0, 0x0255df5f, 0x00659ac2, 0x00ea180f, 0x0027845e, 0x0187ab31, 0x01c1f987, 0x01990a6b, 0x003c84b4}}, Y: Field{[10]uint32{0x00f7c84b, 0x01ac1a68, 0x0382412f, 0x008867b0, 0x037f5114, 0x0303a844, 0x03c31427, 0x02d93b91, 0x006c7edb, 0x000ca011}}}, + {X: Field{[10]uint32{0x01cfe8c9, 0x033d630c, 0x01b50835, 0x03888438, 0x02e1e19c, 0x000163e5, 0x014431b2, 0x01dbe085, 0x023ff25d, 0x001ad541}}, Y: Field{[10]uint32{0x0069f8bf, 0x002236a4, 0x031c6492, 0x028f75f8, 0x01558a82, 0x03d83ffb, 0x02997076, 0x001d891b, 0x01623645, 0x001509f7}}}, + {X: Field{[10]uint32{0x01b23045, 0x006755c2, 0x01e96472, 0x0106a0b8, 0x03c9388d, 0x039be2c9, 0x02e0c129, 0x0243004a, 0x01cfa096, 0x00094e79}}, Y: Field{[10]uint32{0x01021ac3, 0x0115eb76, 0x0224a77c, 0x02d28967, 0x0331d804, 0x01444cd1, 0x0393000e, 0x02937346, 0x03f61e26, 0x002532e0}}}, + {X: Field{[10]uint32{0x0247d51d, 0x03eb9502, 0x03fb6297, 0x007bc394, 0x03910642, 0x03ca30fd, 0x02ed31e8, 0x0070c1c6, 0x02d34aaf, 0x002aa6da}}, Y: Field{[10]uint32{0x03544c47, 0x02779de0, 0x03d3ed1c, 0x01fb2910, 0x0158cbd8, 0x002ad366, 0x034e7db1, 0x02b80262, 0x00e49fe4, 0x00370256}}}, + {X: Field{[10]uint32{0x013487ad, 0x014cbd80, 0x0262f780, 0x0397a728, 0x03e08964, 0x028fdac3, 0x02d6e635, 0x0093efd7, 0x0313aad2, 0x002a1428}}, Y: Field{[10]uint32{0x014ccbe7, 0x020cd8fb, 0x01a4c43b, 0x01c09bc5, 0x01d9a5e5, 0x03bbcd1e, 0x01708ca0, 0x015708ee, 0x02d54cbc, 0x001f91da}}}, + {X: Field{[10]uint32{0x03a09c1a, 0x02352b97, 0x0328c741, 0x00c991de, 0x025da441, 0x00638a74, 0x00889fab, 0x00325b41, 0x0033f4fd, 0x000c53fb}}, Y: Field{[10]uint32{0x03d25f42, 0x01ee53fa, 0x024a976b, 0x034c6a9a, 0x00d9b4b8, 0x0254d3f7, 0x01dd4f54, 0x03fede6d, 0x01130a98, 0x00028b25}}}, + {X: Field{[10]uint32{0x033d0963, 0x02be8d53, 0x01c85329, 0x02e33d4b, 0x03183998, 0x02bef73b, 0x01581ae1, 0x01f9e6b8, 0x03c89ec5, 0x001b9f70}}, Y: Field{[10]uint32{0x019f87d8, 0x01457e27, 0x00964a83, 0x00c3f32b, 0x038f0578, 0x01662ac6, 0x011e3a82, 0x023a7e59, 0x00056d5a, 0x001ad8da}}}, + {X: Field{[10]uint32{0x033337c5, 0x01f50015, 0x034ad955, 0x03016309, 0x0038b6cf, 0x03461071, 0x0097a507, 0x028b5481, 0x0293fc4b, 0x00165b7d}}, Y: Field{[10]uint32{0x037f4ff5, 0x00ff412c, 0x033c6bd0, 0x00cf5732, 0x0274b75c, 0x027b173f, 0x0171723e, 0x02c26ce8, 0x01e91c97, 0x0019827b}}}, + {X: Field{[10]uint32{0x00e8afb7, 0x03c28485, 0x034ee13c, 0x01665ef2, 0x00ee3ba2, 0x01ef50b5, 0x0150e8e7, 0x01e00161, 0x01d410de, 0x0008d7e3}}, Y: Field{[10]uint32{0x00fa6712, 0x038562db, 0x031bd189, 0x00ce092d, 0x0153b72c, 0x00429115, 0x00f8d595, 0x0384da00, 0x00cdb8e8, 0x002fdb83}}}, + {X: Field{[10]uint32{0x03db8b47, 0x027308c4, 0x0227904c, 0x01abbda4, 0x003f0390, 0x0203a07c, 0x01fbb28c, 0x03a47c49, 0x0297b259, 0x002a762e}}, Y: Field{[10]uint32{0x00048656, 0x01d52b3b, 0x0337bf14, 0x03d916e9, 0x015e6ce6, 0x0087d625, 0x0072afe2, 0x0203c99d, 0x015419b5, 0x00399a2e}}}, + {X: Field{[10]uint32{0x02288e5c, 0x02c1fa12, 0x027f4827, 0x00d6df66, 0x00c4e2cc, 0x004d26e2, 0x02bc6295, 0x0305c050, 0x01c64f74, 0x0014ed13}}, Y: Field{[10]uint32{0x017075d4, 0x01b855c2, 0x02c7e589, 0x021f6325, 0x02322161, 0x03fb9ed6, 0x03006ead, 0x018b1363, 0x03e14045, 0x0012bfc4}}}, + {X: Field{[10]uint32{0x000af1a0, 0x02d68096, 0x0362f947, 0x01e4121b, 0x02a91872, 0x0125121a, 0x00b56ca1, 0x03e7dc6b, 0x0038a6ba, 0x001db9b8}}, Y: Field{[10]uint32{0x01f0f0fa, 0x039ad378, 0x03fd4465, 0x035c899b, 0x003b57e0, 0x03811644, 0x0018348b, 0x0101d913, 0x01106688, 0x00146974}}}, + {X: Field{[10]uint32{0x03c1e6b5, 0x03d4efe6, 0x038702bc, 0x031c6fb1, 0x001c45b4, 0x037a192f, 0x02da284d, 0x0004a443, 0x03192fc7, 0x001dd87f}}, Y: Field{[10]uint32{0x016e11b2, 0x01f6b10a, 0x007c1d94, 0x032ec6ad, 0x03e0bb75, 0x030f9f4d, 0x037e1fdf, 0x01c65987, 0x0370a82f, 0x00202603}}}, + {X: Field{[10]uint32{0x009aadf9, 0x034a012a, 0x02d7f8fe, 0x02388434, 0x0095c0bd, 0x021a7618, 0x01cdc333, 0x03d47f9b, 0x01d61224, 0x00206672}}, Y: Field{[10]uint32{0x031ec89b, 0x038c15d2, 0x0292ddaa, 0x01f4aa74, 0x00a158ee, 0x000c371d, 0x01bbd73f, 0x008e12ba, 0x024f5cbd, 0x002fa25c}}}, + {X: Field{[10]uint32{0x01c55c0e, 0x009d0164, 0x033b799d, 0x032f9422, 0x0008bd4d, 0x02f5de76, 0x01626803, 0x00955aef, 0x01fc760a, 0x0005709e}}, Y: Field{[10]uint32{0x03390c39, 0x00f934d4, 0x01dee337, 0x02c19c85, 0x010ea0b9, 0x0328103f, 0x015d352b, 0x03258d24, 0x00bfed80, 0x003f540e}}}, + {X: Field{[10]uint32{0x00a39b46, 0x0045857e, 0x031a83c1, 0x03900520, 0x019724ac, 0x0330b9fb, 0x03b46a3e, 0x01011dbd, 0x0106b280, 0x003ecfe3}}, Y: Field{[10]uint32{0x03d2154e, 0x03ecf3da, 0x011854fb, 0x0142b264, 0x023177ed, 0x00f06f5c, 0x03fd70c6, 0x006d84ec, 0x00b6ff85, 0x003e4943}}}, + {X: Field{[10]uint32{0x02012edb, 0x03269bae, 0x0389b5ea, 0x00576c2c, 0x02f9faf4, 0x025f0ff7, 0x02723e30, 0x01049768, 0x01473c96, 0x000e6cad}}, Y: Field{[10]uint32{0x03fb7547, 0x0220bc86, 0x01564002, 0x02b8377e, 0x016bce7b, 0x03d97c8c, 0x028aedf1, 0x03d04ef5, 0x02a5a586, 0x0022b070}}}, + {X: Field{[10]uint32{0x03f1552b, 0x03fd1291, 0x0284820c, 0x00fab21f, 0x01bf72d7, 0x02c93a33, 0x03f6d0bb, 0x00546874, 0x03fae476, 0x0010b577}}, Y: Field{[10]uint32{0x00847ee4, 0x03eb6d2e, 0x02ee2922, 0x01185f61, 0x02663f6e, 0x0100ef3d, 0x03ebe3af, 0x03000589, 0x0245d941, 0x0018c765}}}, + {X: Field{[10]uint32{0x02e0bd8f, 0x007edeb9, 0x02158e31, 0x0349b671, 0x02630a0b, 0x03a48b66, 0x02dd0711, 0x02afc297, 0x02c624ec, 0x00213725}}, Y: Field{[10]uint32{0x038703c6, 0x023ab8fb, 0x025a82cc, 0x01c4302a, 0x01c795cc, 0x02f4bf09, 0x00ff10a8, 0x00c934ab, 0x018a16b7, 0x00102bcc}}}, + {X: Field{[10]uint32{0x03bf505e, 0x01ce60d2, 0x013bf018, 0x000b0db6, 0x034663ba, 0x01efdf2e, 0x03812af3, 0x033bb846, 0x020a797b, 0x0018db9d}}, Y: Field{[10]uint32{0x01f724d2, 0x03dc0e99, 0x012ffd74, 0x010015f6, 0x0069924f, 0x0012e516, 0x02dab981, 0x033dd90d, 0x024b6cc8, 0x003b5717}}}, + {X: Field{[10]uint32{0x00d06ae4, 0x03dd6026, 0x01090d4f, 0x003fd85d, 0x007d32bc, 0x0389e019, 0x01ca6f4a, 0x03b9e19a, 0x00254bb5, 0x0004dff4}}, Y: Field{[10]uint32{0x028d0fd4, 0x02dfc24c, 0x00bc808f, 0x00f7a739, 0x03e07ec2, 0x00dba4b9, 0x03186a30, 0x02aa83a6, 0x02a225ea, 0x000a0b5a}}}, + {X: Field{[10]uint32{0x02459e92, 0x01cd3484, 0x00b611b6, 0x01805eaf, 0x00df781f, 0x02c943f0, 0x01bc7a5c, 0x02495ad5, 0x004839e4, 0x000862ae}}, Y: Field{[10]uint32{0x010e1599, 0x012cf393, 0x02444c99, 0x03f1c072, 0x001a7212, 0x00cbce7c, 0x00c49c8d, 0x02c3710c, 0x0356b53f, 0x001fac53}}}, + {X: Field{[10]uint32{0x038eda65, 0x00552557, 0x034fb619, 0x0267aed3, 0x011b2f0a, 0x03c4dd81, 0x029e3a78, 0x008be37d, 0x03a0106f, 0x001acfde}}, Y: Field{[10]uint32{0x0330d299, 0x03ededc8, 0x013b7aaa, 0x000174db, 0x036c8310, 0x0207a21c, 0x019a4ab4, 0x01afbe1b, 0x00c44c94, 0x000315e2}}}, + {X: Field{[10]uint32{0x01e8ceca, 0x038c7f76, 0x03d08c5d, 0x032bdffb, 0x02131ad1, 0x00bad6e1, 0x02fdf196, 0x00465465, 0x02cba2de, 0x0026d053}}, Y: Field{[10]uint32{0x0325a637, 0x024897a9, 0x00797063, 0x0216579d, 0x0251e94e, 0x036a7d39, 0x01b06269, 0x037d0203, 0x031f9550, 0x000e39bc}}}, + {X: Field{[10]uint32{0x02940653, 0x03d986c9, 0x01f8ecba, 0x023bcfcb, 0x02156a4a, 0x00751135, 0x0133af0d, 0x0097861a, 0x03a18574, 0x0010dac1}}, Y: Field{[10]uint32{0x003f2d44, 0x0156cc51, 0x0053ace1, 0x0346f393, 0x03c6822d, 0x0093f318, 0x02427137, 0x03af7b29, 0x0335f124, 0x0025294b}}}, + {X: Field{[10]uint32{0x028fbc6b, 0x00cb3544, 0x034d1fff, 0x00a08266, 0x00b8d76f, 0x01ed78a4, 0x0019bd18, 0x017e08cd, 0x033809b2, 0x003302a4}}, Y: Field{[10]uint32{0x023f458e, 0x02ffa1db, 0x029ec220, 0x01e90c3b, 0x00e713ad, 0x01d54038, 0x00cb6278, 0x031ea512, 0x006dec7a, 0x000331fa}}}, + {X: Field{[10]uint32{0x03a19858, 0x007fa0f0, 0x038888f2, 0x03a9cbef, 0x037ea684, 0x02be372a, 0x03b1907e, 0x01debf31, 0x016eaaf8, 0x001686cc}}, Y: Field{[10]uint32{0x0181e7e1, 0x010933b3, 0x00450cf7, 0x02508b6f, 0x02744110, 0x029a504b, 0x02b3466d, 0x0211a9ad, 0x039ada08, 0x0012bc0c}}}, + {X: Field{[10]uint32{0x016c53ee, 0x01f5025b, 0x0327400e, 0x0094be7f, 0x01ac4a57, 0x000e62c9, 0x021e4114, 0x012ec87f, 0x01657444, 0x003ebe24}}, Y: Field{[10]uint32{0x01a43100, 0x0053db26, 0x03cb3997, 0x02b20420, 0x01d87984, 0x02c5b271, 0x00b64263, 0x0151fd77, 0x015faf75, 0x0033e9de}}}, + {X: Field{[10]uint32{0x0174f248, 0x03937ab4, 0x01e33aa9, 0x00b52586, 0x00c94cd2, 0x031b2c0a, 0x000c68c6, 0x00588c61, 0x018aca14, 0x000e797f}}, Y: Field{[10]uint32{0x003c1ff1, 0x00429be3, 0x0210561d, 0x02194a2a, 0x020a8d36, 0x023d989d, 0x0013e788, 0x036995d0, 0x03657083, 0x003e0487}}}, + {X: Field{[10]uint32{0x0325cbc1, 0x010c2600, 0x000e9257, 0x0350866f, 0x02a64b8e, 0x03ef84d5, 0x013cddf6, 0x0033cb33, 0x01ec147d, 0x0008284d}}, Y: Field{[10]uint32{0x0282c013, 0x008ab9bb, 0x006a7156, 0x002a047c, 0x01fa1d17, 0x01d74c2a, 0x0101fd26, 0x00dc9530, 0x00abea1a, 0x002c5d45}}}, + {X: Field{[10]uint32{0x0072320a, 0x0070ad0b, 0x011fab46, 0x00462a21, 0x039903ca, 0x031d6c4e, 0x03d69e2a, 0x03dcfe84, 0x01b8af48, 0x00286068}}, Y: Field{[10]uint32{0x03a6df20, 0x03212ca5, 0x02a5a219, 0x00e8310e, 0x00a66fbd, 0x035621e8, 0x032c432a, 0x01f988f5, 0x00673f48, 0x00325b21}}}, + {X: Field{[10]uint32{0x01b3ee4f, 0x0118b1df, 0x03fc2752, 0x02557ae1, 0x01eb4626, 0x0145b7a3, 0x035d76a9, 0x01768beb, 0x0031720a, 0x000e57f0}}, Y: Field{[10]uint32{0x0359ad6a, 0x022fd071, 0x00523128, 0x01a66cd0, 0x00962ac8, 0x00fb1127, 0x00e14e7c, 0x00e256ad, 0x006b5378, 0x0012baf2}}}, + {X: Field{[10]uint32{0x0364fa6f, 0x01accf46, 0x03d17424, 0x0395c6e7, 0x0103fffc, 0x02ed8cdf, 0x01632a61, 0x00ae5a1f, 0x01ecf6df, 0x0028db7a}}, Y: Field{[10]uint32{0x011999f4, 0x03721899, 0x01ea9cdb, 0x027f43c1, 0x01620fe2, 0x01f7ad03, 0x0212e147, 0x0345006c, 0x004fa133, 0x001e1393}}}, + {X: Field{[10]uint32{0x0040ba8c, 0x01d1b8a6, 0x00359d04, 0x02e0f6f7, 0x03e55a3a, 0x0114d7d5, 0x03818200, 0x0110c3dc, 0x0099ecee, 0x00232d6a}}, Y: Field{[10]uint32{0x017ff59a, 0x03697780, 0x00b2cb92, 0x02c7bc0b, 0x01731ded, 0x00f4a2d3, 0x01df0ecc, 0x028f04b0, 0x002ae9c3, 0x0004a9ca}}}, + {X: Field{[10]uint32{0x00b60985, 0x0142d998, 0x01f299c4, 0x0362c9ac, 0x004cee72, 0x00bf47ef, 0x02372012, 0x026e8643, 0x01e14d9c, 0x00037910}}, Y: Field{[10]uint32{0x0271b63e, 0x03884500, 0x02110508, 0x0319d40c, 0x022927b3, 0x009fefad, 0x03740d44, 0x0374cf53, 0x030ed12d, 0x002b7468}}}, + {X: Field{[10]uint32{0x039fbab7, 0x02081ea6, 0x01067407, 0x030e5ca5, 0x00520646, 0x004a3446, 0x02f3c1b7, 0x0151283c, 0x0356b5e5, 0x002238e2}}, Y: Field{[10]uint32{0x0000e5e3, 0x00763984, 0x034b7810, 0x00828b63, 0x00dc8ea0, 0x02f6bc61, 0x03ac529c, 0x02595b96, 0x008ed44e, 0x00220cc8}}}, + {X: Field{[10]uint32{0x034640a7, 0x03ccdd03, 0x0266c6c5, 0x032583d4, 0x013ee217, 0x0234b5ca, 0x03fa3d15, 0x019082e7, 0x0192f561, 0x00293c3e}}, Y: Field{[10]uint32{0x002e6ddb, 0x0038807e, 0x01e713d8, 0x023a04a2, 0x010b131a, 0x006bd0bf, 0x02c9188a, 0x021af103, 0x01a8437a, 0x003699d0}}}, + {X: Field{[10]uint32{0x005c945b, 0x014901c7, 0x02ad7efe, 0x02fcdfe5, 0x0286899f, 0x01147634, 0x00a40bee, 0x02aab981, 0x00cff2d1, 0x0017c02a}}, Y: Field{[10]uint32{0x019deb12, 0x02d8f4ad, 0x0262a424, 0x034eb9b1, 0x030b48ea, 0x011a4b56, 0x011549fb, 0x01b5b8e7, 0x00b69ea7, 0x0004d7f2}}}, + {X: Field{[10]uint32{0x00f99218, 0x01b38c62, 0x00da0b41, 0x019ea79b, 0x039d1689, 0x00e376e3, 0x004c7998, 0x03f28bb8, 0x020ebfd6, 0x00164d46}}, Y: Field{[10]uint32{0x010fdb34, 0x00f53a75, 0x025b64fe, 0x0275ce91, 0x000fc415, 0x00a479f2, 0x0227b6d4, 0x03d2a0a3, 0x02673184, 0x001b8068}}}, + {X: Field{[10]uint32{0x00b1aecf, 0x025be44b, 0x039f72c7, 0x01cf9dfc, 0x006705ef, 0x03c98f43, 0x007387a5, 0x00cecf7a, 0x0235f5c5, 0x00005d7b}}, Y: Field{[10]uint32{0x01d9513f, 0x0340a02e, 0x03506a80, 0x018cf35e, 0x005fca3b, 0x0317ef58, 0x00d40fc4, 0x03909878, 0x03154540, 0x0028de49}}}, + {X: Field{[10]uint32{0x0347b8fe, 0x01f7eefc, 0x033b0204, 0x0077eb40, 0x00565595, 0x01e416b5, 0x036362fa, 0x0062b26a, 0x0341597b, 0x001d4626}}, Y: Field{[10]uint32{0x01b2527e, 0x01deddc8, 0x03ed5b01, 0x010a116b, 0x01aa2468, 0x015a967b, 0x00023de2, 0x0043a95f, 0x01210ffa, 0x003d4dbf}}}, + {X: Field{[10]uint32{0x019bd4ae, 0x02690528, 0x01c72004, 0x01cdad68, 0x02438855, 0x01fbf48e, 0x03d2a315, 0x035971c2, 0x02c32522, 0x00246be7}}, Y: Field{[10]uint32{0x001a32de, 0x01aec21d, 0x02d6e643, 0x00668b29, 0x0331c9cc, 0x002d1066, 0x004898ed, 0x02e161ad, 0x03c38462, 0x000c4801}}}, + {X: Field{[10]uint32{0x00565c27, 0x02876129, 0x01b04712, 0x02906853, 0x00732273, 0x03ca0f17, 0x01094432, 0x03574174, 0x008d41fa, 0x00376cbf}}, Y: Field{[10]uint32{0x029c1d0a, 0x02e8beb5, 0x01a38d63, 0x02db5fcb, 0x028f6ac9, 0x0224f424, 0x01673a09, 0x031bd080, 0x00c502ce, 0x0013df8c}}}, + {X: Field{[10]uint32{0x023641a6, 0x037077fd, 0x00f96f7d, 0x001fcac1, 0x01ad40a9, 0x0290494e, 0x0144936e, 0x00370d40, 0x0122d724, 0x00273997}}, Y: Field{[10]uint32{0x01d97c8c, 0x009d825e, 0x02340cf9, 0x010e0150, 0x00c3037e, 0x01818bd5, 0x020b4257, 0x02f19091, 0x01877f25, 0x002be4f9}}}, + {X: Field{[10]uint32{0x036e9a2b, 0x01b5dbdd, 0x015f5493, 0x02c079fe, 0x015489f1, 0x002fd24b, 0x003932eb, 0x03b16247, 0x00d41fed, 0x001f7034}}, Y: Field{[10]uint32{0x0107c47a, 0x01a6656c, 0x0134fa52, 0x03d694d6, 0x001e9bbc, 0x00e0c685, 0x021c7a49, 0x00f04efe, 0x039e760c, 0x00355689}}}, + {X: Field{[10]uint32{0x000e5ead, 0x000ea553, 0x008c163d, 0x003cca07, 0x02f190d4, 0x00f92a9f, 0x018d351f, 0x035ca277, 0x015cb6b4, 0x00034048}}, Y: Field{[10]uint32{0x00fdc662, 0x00b2206c, 0x02a2548b, 0x0318267b, 0x01c68be6, 0x01906153, 0x03ce7fe0, 0x01fbb9c8, 0x004bccbd, 0x003be60d}}}, + {X: Field{[10]uint32{0x017cb92f, 0x0019d9e3, 0x02af3e1d, 0x0318a4cf, 0x00bb6498, 0x02f7fcf5, 0x011b0d29, 0x03be3d66, 0x0031a9fa, 0x00035347}}, Y: Field{[10]uint32{0x026a4831, 0x017e18ab, 0x0190a4df, 0x036e93d9, 0x02715fae, 0x00861791, 0x03ccd42f, 0x0247ea16, 0x0048ac6b, 0x00263cea}}}, + {X: Field{[10]uint32{0x02080839, 0x034bc931, 0x035a49fa, 0x00310686, 0x023d718f, 0x0212c78c, 0x022d83c0, 0x03c930f6, 0x02cf42ab, 0x00331967}}, Y: Field{[10]uint32{0x001f963c, 0x009d86b2, 0x00cbbf0f, 0x0250fe13, 0x00c7aef0, 0x039e55d6, 0x02df249a, 0x00ce66db, 0x01554d84, 0x001eef7f}}}, + {X: Field{[10]uint32{0x01ea4b04, 0x0345905c, 0x0104e594, 0x01d59c23, 0x00f0eb47, 0x01e2fbcd, 0x0074e944, 0x03ce1674, 0x0167d5cf, 0x00066e85}}, Y: Field{[10]uint32{0x02820f9a, 0x014d2152, 0x00ed5d4f, 0x024722e4, 0x0030555c, 0x03967044, 0x00583114, 0x02c0bb6a, 0x001bd536, 0x000d3a8a}}}, + {X: Field{[10]uint32{0x03bbc30f, 0x01e63d75, 0x006a5437, 0x039d4a56, 0x02e825d8, 0x0354b4b6, 0x01960e5f, 0x01641d8c, 0x02e31a6e, 0x000fc3c0}}, Y: Field{[10]uint32{0x03e63c3b, 0x00241878, 0x0119a035, 0x00a5ed01, 0x0162a3bf, 0x038b35a9, 0x0079ddcb, 0x03536964, 0x03c33aec, 0x002e4f89}}}, + {X: Field{[10]uint32{0x0149ab12, 0x001e4900, 0x0323e0df, 0x025b97ea, 0x008d0fb0, 0x003ce0ad, 0x01dd895b, 0x00ff656a, 0x008f35f6, 0x00262131}}, Y: Field{[10]uint32{0x0180eb44, 0x00907ed0, 0x02aa013f, 0x017a627f, 0x03e01154, 0x022dbd06, 0x01e321f5, 0x010df0f5, 0x02667070, 0x0015a230}}}, + {X: Field{[10]uint32{0x006c7b4d, 0x026edf31, 0x00b47448, 0x0380ac8f, 0x02bb4a6f, 0x00be0f96, 0x002e85ac, 0x027154c2, 0x029379bc, 0x002503ca}}, Y: Field{[10]uint32{0x0321fd9d, 0x03038b1f, 0x02284700, 0x0274b2b8, 0x002aa742, 0x02f1a9e1, 0x027c735c, 0x02763d47, 0x038077ba, 0x002d2e08}}}, + {X: Field{[10]uint32{0x00b782f0, 0x01d0bad6, 0x0001c0e0, 0x000d0be4, 0x005f4beb, 0x014d0fa9, 0x02feccbb, 0x00f67d06, 0x019ce535, 0x002a69da}}, Y: Field{[10]uint32{0x0187c994, 0x02a565e5, 0x018b4c7c, 0x02f17ed2, 0x01b0536f, 0x029806b2, 0x0341f778, 0x0233c690, 0x02aab3e1, 0x000f1d67}}}, + {X: Field{[10]uint32{0x03218913, 0x008898c2, 0x034afb15, 0x00748fc9, 0x0293f4da, 0x00b4044a, 0x0236cc28, 0x036c015b, 0x008a009c, 0x0028878d}}, Y: Field{[10]uint32{0x02be89ed, 0x0307d31f, 0x038da588, 0x01cec79d, 0x03c70b18, 0x01c07998, 0x00b8e28a, 0x025419bb, 0x03fa652f, 0x00050550}}}, + {X: Field{[10]uint32{0x025fd383, 0x0123ecd6, 0x01ca41f0, 0x0018c1a9, 0x00e81429, 0x006339ce, 0x03298d60, 0x0384614a, 0x01951121, 0x0035b553}}, Y: Field{[10]uint32{0x028a7a83, 0x014d1160, 0x02912412, 0x03cd4d68, 0x028f76c8, 0x02363bb4, 0x00fe9d03, 0x007f88c1, 0x00b8de89, 0x00225f73}}}, + {X: Field{[10]uint32{0x031e6cda, 0x0303c770, 0x03ebe21c, 0x01928e91, 0x026232b4, 0x03bec4be, 0x00c7f7b5, 0x03abed22, 0x035dc937, 0x001f8298}}, Y: Field{[10]uint32{0x01e921e2, 0x00eb18e3, 0x01e822d6, 0x021b3b58, 0x0274489c, 0x02b72fcd, 0x025b34e3, 0x017874b3, 0x014a7552, 0x00034b47}}}, + {X: Field{[10]uint32{0x0051a659, 0x02802e35, 0x000d3afe, 0x0053eb08, 0x0155bafa, 0x01acfeba, 0x00870e83, 0x0071a10a, 0x000f66a2, 0x00133882}}, Y: Field{[10]uint32{0x007da4c4, 0x03c157db, 0x01b1d891, 0x0249cf8c, 0x02f0ca1b, 0x0037e4eb, 0x00d0f3ef, 0x000bf4c6, 0x0226565b, 0x000a787e}}}, + {X: Field{[10]uint32{0x012bad2e, 0x007d509c, 0x00f7fc09, 0x02d363d6, 0x01e6d4b7, 0x02e27a05, 0x00d5caf1, 0x02fd9567, 0x0387b633, 0x0036ae1a}}, Y: Field{[10]uint32{0x03c85b5e, 0x0057acd4, 0x03bdf8fd, 0x00d1f95e, 0x004506a6, 0x0156f64c, 0x00159d7f, 0x0157ce36, 0x0109d79a, 0x0023926c}}}, + {X: Field{[10]uint32{0x0365aca9, 0x00a4006c, 0x017a56ae, 0x012854a2, 0x01ba1622, 0x01d9cb4e, 0x035386ea, 0x00cb93a2, 0x02c290fa, 0x0031a852}}, Y: Field{[10]uint32{0x035dbc67, 0x003ab1dc, 0x00164b2c, 0x00b7e896, 0x0245cd5f, 0x00bfd857, 0x021967a4, 0x0223f890, 0x00d6dcc5, 0x0010aab7}}}, + {X: Field{[10]uint32{0x02450a27, 0x0138853a, 0x0041de69, 0x02b32284, 0x0263510b, 0x03cd163d, 0x03244004, 0x00423ca3, 0x0240880b, 0x0009667e}}, Y: Field{[10]uint32{0x03a57a01, 0x0365321e, 0x013e6951, 0x01b95230, 0x02a424c4, 0x0280aff4, 0x03a973a1, 0x0337d1a9, 0x02ad4ae1, 0x000151e4}}}, + {X: Field{[10]uint32{0x02d9f9ff, 0x035d1da3, 0x0153bbf3, 0x00cdbe91, 0x01312655, 0x01e7b10f, 0x02d8fe9e, 0x02a3deab, 0x00b4a6af, 0x003daac3}}, Y: Field{[10]uint32{0x005026ef, 0x0365d1a1, 0x013f973f, 0x02f15ebc, 0x0282e913, 0x0241ff35, 0x001a4761, 0x00024123, 0x0189c4ba, 0x0013a849}}}, + {X: Field{[10]uint32{0x007f1dfc, 0x03522c9c, 0x01bebdfd, 0x03caf1c7, 0x0372738f, 0x00ffd369, 0x017ecdbd, 0x000838b6, 0x008bab8f, 0x003d46f5}}, Y: Field{[10]uint32{0x02697c40, 0x024fcfd2, 0x01e4308c, 0x0148922f, 0x01b361c7, 0x01fbe43e, 0x03fe7bce, 0x011fea29, 0x03a0947f, 0x001ac5a2}}}, + {X: Field{[10]uint32{0x022a3443, 0x0263c292, 0x013625c8, 0x02194d48, 0x020a50b2, 0x0342fdf4, 0x0398f2b1, 0x02a432bd, 0x01146c9c, 0x002d807c}}, Y: Field{[10]uint32{0x021f87dd, 0x03c8e471, 0x027edf0c, 0x0343f305, 0x006877fe, 0x027c3c44, 0x0317a115, 0x02d9d57c, 0x004136b6, 0x0029b28c}}}, + {X: Field{[10]uint32{0x005f974b, 0x0241947e, 0x01ccb37e, 0x0163ca1c, 0x015be6a1, 0x0316dc64, 0x030511f0, 0x01f011db, 0x027ae595, 0x001e4b75}}, Y: Field{[10]uint32{0x031dd44b, 0x01d60252, 0x03bcb941, 0x017212b0, 0x011a4c1c, 0x00bd18f8, 0x004774dd, 0x027da4e9, 0x00b9bec5, 0x0026dfd7}}}, + {X: Field{[10]uint32{0x03b093f9, 0x0004c0a2, 0x00377931, 0x0080cf0d, 0x004c29c4, 0x0009452b, 0x0300eb4f, 0x03d2b6cd, 0x026933b6, 0x001f6211}}, Y: Field{[10]uint32{0x01e2cb3b, 0x025187ed, 0x00885a2f, 0x03e2944d, 0x022ebeb5, 0x0391b0c1, 0x007ead35, 0x00036d4a, 0x035e6745, 0x000bf230}}}, + {X: Field{[10]uint32{0x012a5351, 0x03b6e01a, 0x00249010, 0x01077e0b, 0x01ead4bc, 0x01c2250d, 0x03820387, 0x02182c86, 0x03916d0f, 0x00271dba}}, Y: Field{[10]uint32{0x01c88b62, 0x0260a43d, 0x006b0d99, 0x03835b78, 0x030e51d1, 0x0231dda7, 0x0235a6da, 0x00055878, 0x03f33880, 0x001caeb6}}}, + {X: Field{[10]uint32{0x03d807f9, 0x02ec3cc7, 0x0024ecf5, 0x0360b6bf, 0x038fef18, 0x00791f0c, 0x0252a2aa, 0x024f8557, 0x02383d8a, 0x002926d5}}, Y: Field{[10]uint32{0x001d3ae0, 0x0163a364, 0x0176dbee, 0x03987f3a, 0x029dc392, 0x0324d191, 0x00b0760b, 0x013133b9, 0x01b39bf3, 0x0006f09c}}}, + {X: Field{[10]uint32{0x00634460, 0x01891f37, 0x029e0a4d, 0x03f9deba, 0x02a704c9, 0x023c71cb, 0x01d5cc96, 0x02c2c32a, 0x035a675b, 0x000134c4}}, Y: Field{[10]uint32{0x000cfc4e, 0x029dbb8a, 0x02d38395, 0x03bda333, 0x02cb74bc, 0x03c0ac4e, 0x031ffeac, 0x03d2f3cb, 0x00be72f5, 0x002b975f}}}, + {X: Field{[10]uint32{0x0253f588, 0x00cc2267, 0x00e3711f, 0x020ea481, 0x00eff955, 0x010bc64b, 0x00421b9b, 0x01b8e3f0, 0x03be17dd, 0x001655cb}}, Y: Field{[10]uint32{0x021c7c24, 0x01150877, 0x0382a39c, 0x00be6dc9, 0x03a01c8f, 0x03582811, 0x01ab8051, 0x00fe79a8, 0x0240a8cb, 0x0015c4d1}}}, + {X: Field{[10]uint32{0x012d9511, 0x03a8799c, 0x005a5cb5, 0x00203d58, 0x020a5fff, 0x00a34ba6, 0x02a1c612, 0x01e03b2a, 0x006d49b4, 0x001cf333}}, Y: Field{[10]uint32{0x03752cf4, 0x00b353f8, 0x0308edbb, 0x01b5aa16, 0x036a52c0, 0x026c5634, 0x012ea8b5, 0x0323c470, 0x0174f986, 0x00118ea3}}}, + {X: Field{[10]uint32{0x004c1e46, 0x00f0a8e3, 0x03d1ee50, 0x03c61da0, 0x02ae3885, 0x023f73db, 0x02f7280e, 0x002aa51d, 0x03fddb62, 0x002db23a}}, Y: Field{[10]uint32{0x03d39802, 0x02441839, 0x01ddeb40, 0x0157cc85, 0x0276a25d, 0x02065297, 0x0175c2ac, 0x000122f9, 0x02d9f021, 0x00269beb}}}, + {X: Field{[10]uint32{0x005e392e, 0x01ff2713, 0x01f7eb50, 0x02353087, 0x03b9cc4a, 0x00c19f78, 0x0196c539, 0x01524f6a, 0x020f92de, 0x002d058b}}, Y: Field{[10]uint32{0x023b385b, 0x0149585a, 0x01120a40, 0x005dee3b, 0x02eecf22, 0x00183660, 0x03978733, 0x0074d918, 0x00d0c921, 0x00333384}}}, + {X: Field{[10]uint32{0x012b33a2, 0x011a75e3, 0x019b7a2a, 0x02359513, 0x00a58100, 0x0282e350, 0x02919552, 0x00d75eaf, 0x0166ca42, 0x0011afc9}}, Y: Field{[10]uint32{0x02785040, 0x01f21ff1, 0x01ef10b7, 0x03c0085c, 0x01285b5c, 0x0342f275, 0x0182e39c, 0x0221064b, 0x016bb827, 0x001bd9bf}}}, + {X: Field{[10]uint32{0x0159ab2f, 0x02a4538f, 0x036b7419, 0x01a0aa7b, 0x01b5422a, 0x022704d7, 0x02dfcd1b, 0x02a73e2e, 0x01a4e869, 0x001e111b}}, Y: Field{[10]uint32{0x028c9ce3, 0x00ad6196, 0x0098327d, 0x02fcb50a, 0x023f5f31, 0x00cefaf7, 0x003c051f, 0x011b0678, 0x0131db7e, 0x0010856c}}}, + {X: Field{[10]uint32{0x0205f3b7, 0x02fc0055, 0x01d1f4be, 0x032972f4, 0x03fa2b01, 0x017ae3b6, 0x03dc7629, 0x0203350a, 0x02055110, 0x0021a21a}}, Y: Field{[10]uint32{0x03914466, 0x001f9dfd, 0x037d7675, 0x03b565e9, 0x00f9b753, 0x00eb7501, 0x038854a8, 0x030371c1, 0x01f35579, 0x0031c6da}}}, + {X: Field{[10]uint32{0x03713388, 0x03652f20, 0x03371e16, 0x03f2ca29, 0x0036d5fa, 0x011101b8, 0x038675a7, 0x03f10ff4, 0x035e37f8, 0x00280b99}}, Y: Field{[10]uint32{0x0041239e, 0x005cf7bf, 0x01c36de3, 0x03568626, 0x004ee66b, 0x01dfa7ab, 0x02162512, 0x020353ab, 0x0141835c, 0x0035be69}}}, + {X: Field{[10]uint32{0x0092bf26, 0x03322261, 0x03f14ea4, 0x01dfb8a1, 0x009b2997, 0x025ef013, 0x01100966, 0x01b3b734, 0x02a8432c, 0x00285ada}}, Y: Field{[10]uint32{0x020db298, 0x035c9053, 0x01aced2f, 0x028627bc, 0x021e734d, 0x03a9f853, 0x00ed6446, 0x010ab034, 0x0270ef9e, 0x00017046}}}, + {X: Field{[10]uint32{0x00f45b5a, 0x0052e638, 0x01c5c971, 0x00afe1a1, 0x0212d7fc, 0x01ee07f2, 0x03a1205f, 0x03979742, 0x02fe775f, 0x0019a8fc}}, Y: Field{[10]uint32{0x025e3eaf, 0x008c1417, 0x001c8c18, 0x038a57b4, 0x0100e626, 0x002d3ac8, 0x00daad03, 0x03527554, 0x0114a49a, 0x0014166f}}}, + {X: Field{[10]uint32{0x0314b3a1, 0x004de114, 0x01785962, 0x0183aa15, 0x02a1f094, 0x0184542e, 0x01c63210, 0x001319d5, 0x03cebf9a, 0x002691e8}}, Y: Field{[10]uint32{0x0040a80a, 0x03bf03bb, 0x02acbc6c, 0x03c8ae57, 0x03efd3a3, 0x024a5a49, 0x03c7045b, 0x01f9abcd, 0x02ce8f38, 0x0008b697}}}, + {X: Field{[10]uint32{0x036628c5, 0x03d89cd6, 0x02c6f97a, 0x014d27e6, 0x0312b25a, 0x03c63ea1, 0x00e3c288, 0x02e6878f, 0x00149027, 0x00070050}}, Y: Field{[10]uint32{0x02448a4f, 0x015b2583, 0x03d353a4, 0x00d15d4e, 0x0087b499, 0x00583e5e, 0x00bc34ff, 0x034f5ade, 0x00fcd048, 0x0019c864}}}, + {X: Field{[10]uint32{0x028d84cc, 0x03bff94b, 0x0231d057, 0x0002793a, 0x018d1374, 0x025f81d9, 0x00965cd4, 0x03a1d96b, 0x030a1de5, 0x0030b659}}, Y: Field{[10]uint32{0x013ccdf1, 0x029c9c7c, 0x02379cc7, 0x02303e14, 0x00b97a2e, 0x00a55b42, 0x0356b585, 0x03eec4ea, 0x0247a6dd, 0x003fe061}}}, + {X: Field{[10]uint32{0x0196ec1d, 0x006c7972, 0x026910e0, 0x03954e5a, 0x03d21339, 0x005075a3, 0x00e094c4, 0x01a9a5c3, 0x004716fd, 0x0006a7fb}}, Y: Field{[10]uint32{0x03f8557e, 0x001b62e4, 0x0140c240, 0x00e047d7, 0x01d29b87, 0x025778a4, 0x037639b5, 0x01cffa53, 0x02eb6c83, 0x0038e3ac}}}, + {X: Field{[10]uint32{0x01d8c464, 0x015abec0, 0x03bae778, 0x019a6358, 0x0053a514, 0x02c6ac9b, 0x029e5006, 0x0069b503, 0x02ed15e9, 0x002df7d4}}, Y: Field{[10]uint32{0x02e21254, 0x03b14c2d, 0x01ac1162, 0x0034297f, 0x01705c36, 0x03c60354, 0x010706ff, 0x03f63e67, 0x01bfd915, 0x003a983c}}}, + {X: Field{[10]uint32{0x03db6b5f, 0x03e65675, 0x039d1295, 0x03e21222, 0x00918ba7, 0x000d4cd4, 0x0086a534, 0x00b8bef7, 0x00cabd09, 0x0000be57}}, Y: Field{[10]uint32{0x01693ad2, 0x01192368, 0x02a7b523, 0x024e36c7, 0x01d5b0f8, 0x0026fce3, 0x02a9c3df, 0x03b61967, 0x0014fe6c, 0x000c515a}}}, + {X: Field{[10]uint32{0x018a7c1c, 0x029984af, 0x03fea883, 0x028df7bc, 0x023b6ae1, 0x00df9008, 0x01a432ca, 0x03936da8, 0x02c864df, 0x001d8e49}}, Y: Field{[10]uint32{0x0361bd1f, 0x00fc2970, 0x03a410bd, 0x0396e793, 0x00a3e741, 0x0203c7e6, 0x00b3e63d, 0x03443aed, 0x03724378, 0x003cd356}}}, + {X: Field{[10]uint32{0x00a31b0d, 0x0201f272, 0x00ebf72a, 0x03746371, 0x03708ce2, 0x032db262, 0x012a513f, 0x01b3dbcc, 0x027a1291, 0x000b90ef}}, Y: Field{[10]uint32{0x0024acfa, 0x03a67437, 0x019c5971, 0x0024232d, 0x00a3a9dc, 0x03545334, 0x0257b6ce, 0x01f95c5b, 0x0224ce1b, 0x0036e464}}}, + {X: Field{[10]uint32{0x014a5561, 0x02583073, 0x02df9a56, 0x03ec4e96, 0x002d1acd, 0x03f1a1cf, 0x0331984a, 0x01f4a1d9, 0x008f1a86, 0x001f5979}}, Y: Field{[10]uint32{0x0183ebfc, 0x01f32fb6, 0x029da7b9, 0x00daf9f9, 0x00bc9924, 0x02bde576, 0x00e2d4bc, 0x01eb4bfc, 0x0155f095, 0x00271cee}}}, + {X: Field{[10]uint32{0x0019d725, 0x02529c5e, 0x02b7c10b, 0x021f171d, 0x006b132c, 0x035c54e4, 0x02166f04, 0x02ddcb2b, 0x00c03131, 0x00071afb}}, Y: Field{[10]uint32{0x023280ad, 0x0313492c, 0x0106e318, 0x008b3ed2, 0x0041b84a, 0x02bf7d82, 0x03dd26cd, 0x0214cc25, 0x00ff9499, 0x000b0f19}}}, + {X: Field{[10]uint32{0x03347675, 0x02ca9904, 0x020f8198, 0x02c1fa74, 0x01aff339, 0x01fb7c1e, 0x02c83c7d, 0x020408ca, 0x025d5d11, 0x003d410a}}, Y: Field{[10]uint32{0x01a3e4c8, 0x01f7ff5e, 0x01d20b59, 0x015d6a2f, 0x02b2723f, 0x02811414, 0x02388020, 0x03f1b4bc, 0x03bce644, 0x00067043}}}, + {X: Field{[10]uint32{0x014be300, 0x00cd622f, 0x02539b48, 0x03c0b784, 0x030e0ee9, 0x01038213, 0x000c8872, 0x00d4f9b8, 0x0066c2c0, 0x001f0e1e}}, Y: Field{[10]uint32{0x032b8f79, 0x00ded0fb, 0x00ab400c, 0x0155b2bd, 0x0356f088, 0x001d2003, 0x03c49c6d, 0x0316350b, 0x0394587f, 0x0033319b}}}, + {X: Field{[10]uint32{0x02b3c140, 0x0081b93a, 0x034e0b7b, 0x03445a47, 0x02104b35, 0x022e8bb7, 0x02381945, 0x0370adb3, 0x0123d33a, 0x003b3a2b}}, Y: Field{[10]uint32{0x000c0a88, 0x029023df, 0x01e7c5c6, 0x00bd4d99, 0x031c7e67, 0x0326dca3, 0x00245a12, 0x034fd7cf, 0x02c07fa1, 0x003bb25d}}}, + {X: Field{[10]uint32{0x01d12b9d, 0x02bd63c6, 0x03c56a1b, 0x0064f8b2, 0x00b951cf, 0x034085dd, 0x02efecc7, 0x0370e327, 0x0126a274, 0x00208ac2}}, Y: Field{[10]uint32{0x00118313, 0x0030b791, 0x0263f1be, 0x0021443f, 0x023638f0, 0x03f3c144, 0x014d2c49, 0x030dd60c, 0x010af9ca, 0x00122f2c}}}, + {X: Field{[10]uint32{0x0385b8c3, 0x00b9dec3, 0x028a85cd, 0x011e0311, 0x03401dfe, 0x03398bf8, 0x0058d257, 0x03d0a3e8, 0x02036ef5, 0x00349a8e}}, Y: Field{[10]uint32{0x026a6fa7, 0x02c45d44, 0x00ba010f, 0x033e6eb9, 0x0362f1bb, 0x00c230b6, 0x01c6759a, 0x010ca5f5, 0x03623a64, 0x002630e5}}}, + {X: Field{[10]uint32{0x03019090, 0x00f0d1a4, 0x024beb5b, 0x037eec59, 0x0124c8fc, 0x02891f47, 0x0002ab6c, 0x032ef40c, 0x001d8aa0, 0x001ffaee}}, Y: Field{[10]uint32{0x02c3ec26, 0x02918129, 0x03b446cf, 0x008f62c8, 0x03966dc9, 0x02a12e6f, 0x00ca6c02, 0x01b69d51, 0x03cb12ca, 0x003b9896}}}, + {X: Field{[10]uint32{0x01d3473c, 0x03cac394, 0x0008733d, 0x00a9b78b, 0x02b7aa00, 0x030d912e, 0x0363a75c, 0x02daef9b, 0x00e72d43, 0x0020e791}}, Y: Field{[10]uint32{0x000fb9a9, 0x02478c4d, 0x03da43e5, 0x026150ac, 0x002d876d, 0x01dd6fda, 0x0163806d, 0x00508829, 0x023526f4, 0x0020da3d}}}, + {X: Field{[10]uint32{0x030d7afe, 0x0163ab36, 0x01135ea9, 0x025e1b48, 0x017e049b, 0x00fcbbb6, 0x02c84f32, 0x0381f278, 0x03da1c96, 0x0014ba51}}, Y: Field{[10]uint32{0x0073a831, 0x019c39b5, 0x0097d9fa, 0x003b7112, 0x02bdbbe5, 0x027e9cae, 0x01e19a90, 0x0034f4e7, 0x02c9e0c7, 0x001af3f7}}}, + {X: Field{[10]uint32{0x027f3603, 0x0231ad31, 0x000cedb1, 0x01d33f2c, 0x00c8b220, 0x0323a793, 0x03f6dd71, 0x029d0c75, 0x002605e4, 0x001cbb15}}, Y: Field{[10]uint32{0x006b5ee5, 0x01b53e9e, 0x01023615, 0x03e056f2, 0x0249455c, 0x007bb52e, 0x02a6d715, 0x03be53d7, 0x020b7f9d, 0x00376e4d}}}, + {X: Field{[10]uint32{0x0006c849, 0x026b74c5, 0x00f36af3, 0x03a75aa4, 0x012ac051, 0x00a18f44, 0x02bf9baf, 0x015a2405, 0x031559a5, 0x000dc28f}}, Y: Field{[10]uint32{0x03005840, 0x0283b187, 0x01ddaba3, 0x024c8d74, 0x03ee80d9, 0x002c419e, 0x01ab5d32, 0x033b9825, 0x01a68517, 0x0021532f}}}, + {X: Field{[10]uint32{0x03ef5dc2, 0x03e68e66, 0x02c6a714, 0x0033dc66, 0x0141d1cf, 0x01dfbda8, 0x03af5275, 0x03ef6f2c, 0x008860d2, 0x0004b95e}}, Y: Field{[10]uint32{0x02bd9ea2, 0x01b17061, 0x00821ab4, 0x027192b7, 0x01a09496, 0x01692d1d, 0x03b79ead, 0x0049bdf6, 0x02ca5dd8, 0x003d6bde}}}, + {X: Field{[10]uint32{0x00a2b722, 0x02b630cc, 0x025bdfe2, 0x0322b282, 0x028b7905, 0x015efe74, 0x031abad7, 0x0297785e, 0x03cd0b2f, 0x002d252a}}, Y: Field{[10]uint32{0x0294cb87, 0x02475ca4, 0x01adfbf9, 0x00431902, 0x00cbacf7, 0x0100693e, 0x038d8aee, 0x0186767f, 0x03d6dad8, 0x0030e5ff}}}, + {X: Field{[10]uint32{0x02b9d89c, 0x011817a2, 0x02a83106, 0x03912677, 0x03118ea6, 0x03dc6f72, 0x008245c0, 0x002e52c8, 0x012d900d, 0x000a55da}}, Y: Field{[10]uint32{0x00444a7b, 0x03595690, 0x02a91857, 0x00adfaee, 0x00f12934, 0x03f09354, 0x0037e940, 0x02bfa800, 0x00479284, 0x0028f155}}}, + {X: Field{[10]uint32{0x01bd20eb, 0x02fdc8e8, 0x00cda39c, 0x034cb927, 0x031969ae, 0x03052979, 0x0213642d, 0x0381caf2, 0x0079f325, 0x00184406}}, Y: Field{[10]uint32{0x00e443b3, 0x016611c0, 0x017a9c1d, 0x00fb599d, 0x03e5c248, 0x02763ac2, 0x0367269e, 0x0392ef56, 0x00824816, 0x00138667}}}, + {X: Field{[10]uint32{0x0255ab18, 0x027106ae, 0x034e429a, 0x0352642a, 0x02c65f6a, 0x009c87ef, 0x028c648c, 0x011d3e2a, 0x00b299f3, 0x0027ba92}}, Y: Field{[10]uint32{0x03234443, 0x01f62707, 0x00654c1d, 0x024befb8, 0x03b68028, 0x03cad687, 0x00570497, 0x0346f1fa, 0x029735ce, 0x0004e551}}}, + {X: Field{[10]uint32{0x018bd97a, 0x03d00ed4, 0x03c5cc9d, 0x02d8c7c6, 0x013fff42, 0x028da023, 0x00759826, 0x02dc1f29, 0x00d78ba7, 0x0036ec15}}, Y: Field{[10]uint32{0x011b923a, 0x021e5d58, 0x01d4a89d, 0x03e06ae5, 0x030a55a1, 0x009f9e07, 0x00048854, 0x00e95775, 0x02c09634, 0x000e5bbd}}}, + {X: Field{[10]uint32{0x021bbcf1, 0x03cf2aad, 0x0275cd70, 0x01056c23, 0x01b2f625, 0x01705372, 0x03cc0ea3, 0x00bbd276, 0x03d57fdd, 0x0036ea56}}, Y: Field{[10]uint32{0x00d20a3d, 0x02438c80, 0x004cc64a, 0x02b2ba4e, 0x020b8f76, 0x0054566e, 0x036dba84, 0x01f91862, 0x025eb7a1, 0x000abc25}}}, + {X: Field{[10]uint32{0x02d0e5be, 0x02fabee2, 0x02ef5297, 0x00c9c8bd, 0x030bf1a1, 0x00f1d576, 0x02d8febc, 0x02ec3f9c, 0x02c97979, 0x0001b0c4}}, Y: Field{[10]uint32{0x0202c6ea, 0x0001c620, 0x006438be, 0x0185c7de, 0x006c4359, 0x0363ead5, 0x038d5ea3, 0x01ce777d, 0x0388db74, 0x000d8d98}}}, + {X: Field{[10]uint32{0x008825cd, 0x038c6db7, 0x021e5b9f, 0x00c2a8c5, 0x03ad9870, 0x006335c5, 0x01b8638e, 0x02f23d52, 0x0057a494, 0x00197adc}}, Y: Field{[10]uint32{0x03a80312, 0x019a530b, 0x03c92765, 0x01088256, 0x02160b7b, 0x021c1a38, 0x016b4acf, 0x02178246, 0x02a167f2, 0x00116080}}}, + {X: Field{[10]uint32{0x02ffa7f6, 0x01f8ae53, 0x000d6b56, 0x009b610b, 0x02c11174, 0x00abaf47, 0x01db7cbd, 0x01a36bb5, 0x0117b0e8, 0x00281a5a}}, Y: Field{[10]uint32{0x01ecba78, 0x0159d710, 0x030f5ba5, 0x00f8dffa, 0x03c797ec, 0x03a2f6a2, 0x01cb828b, 0x013723c0, 0x020da1bb, 0x00321d34}}}, + {X: Field{[10]uint32{0x002cced2, 0x009f195e, 0x0387903b, 0x01e474ed, 0x01108744, 0x0021ad93, 0x01378301, 0x00a84cb7, 0x03821937, 0x0010646e}}, Y: Field{[10]uint32{0x03dc3f2c, 0x024bf299, 0x03b4a348, 0x01e40925, 0x00493352, 0x00b84c2f, 0x02e52bf8, 0x03486347, 0x03c98ce4, 0x0031d241}}}, + {X: Field{[10]uint32{0x01b218c3, 0x039fd71e, 0x0038f3c3, 0x03c82427, 0x030945e3, 0x02572563, 0x023b9b2b, 0x024fb964, 0x01337212, 0x001d7cdf}}, Y: Field{[10]uint32{0x01928be7, 0x037ab3a9, 0x02a339af, 0x02847d00, 0x02a7d2fd, 0x033c46a8, 0x0328e181, 0x008a9e8b, 0x038ec6b2, 0x002b0107}}}, + {X: Field{[10]uint32{0x02fb154e, 0x01c6bee5, 0x02c65785, 0x03dc0775, 0x026004d1, 0x03c62a12, 0x00b3bef6, 0x00bca408, 0x033ab58b, 0x0032f0c5}}, Y: Field{[10]uint32{0x01fd5c37, 0x0393783e, 0x0089226d, 0x0325863a, 0x01b8f36e, 0x0255dfb8, 0x03c166de, 0x011050b4, 0x00b76f26, 0x003104e8}}}, + {X: Field{[10]uint32{0x02e226cc, 0x0390dc36, 0x00dd92a5, 0x03d16fd3, 0x0164f212, 0x0067346f, 0x02888324, 0x03e965a5, 0x0309a139, 0x0019395a}}, Y: Field{[10]uint32{0x010fbbbe, 0x02f06781, 0x02fa7671, 0x02a18a80, 0x01d10915, 0x02d0a505, 0x001eb3d0, 0x0240592d, 0x02eef242, 0x002a4653}}}, + {X: Field{[10]uint32{0x015285a6, 0x033ed24d, 0x0014f73b, 0x0140273f, 0x0334e133, 0x0380be44, 0x022c2fb8, 0x01b3ca68, 0x01c5e288, 0x0038cde5}}, Y: Field{[10]uint32{0x01afb304, 0x035908c0, 0x035e15c2, 0x03431b37, 0x01f7c575, 0x02d2ec19, 0x02580cb7, 0x01231c93, 0x0121f33d, 0x001e243f}}}, + {X: Field{[10]uint32{0x02b0b6dc, 0x01739d69, 0x036998f2, 0x0250d7ad, 0x036e6a09, 0x01b1e48c, 0x0143d2c7, 0x03428345, 0x026b7a73, 0x0001e5d7}}, Y: Field{[10]uint32{0x023eb06f, 0x00738bfd, 0x03115012, 0x004289fd, 0x008f16eb, 0x0158af09, 0x0248d5f7, 0x024fb757, 0x00aec689, 0x00042c58}}}, + {X: Field{[10]uint32{0x01580f6f, 0x01c73774, 0x03ce02ad, 0x02124b38, 0x03c1ca44, 0x0007d106, 0x02093d08, 0x00e59e4b, 0x03cbf9c1, 0x001b4344}}, Y: Field{[10]uint32{0x03b45746, 0x012fcb3a, 0x016f1bae, 0x0351c769, 0x014bdb25, 0x01e910c2, 0x01dcfe33, 0x03c08aef, 0x023884ca, 0x0005eb90}}}, + {X: Field{[10]uint32{0x03df0154, 0x01d28806, 0x008560a9, 0x019cfef4, 0x0360d398, 0x0098200d, 0x03d3f904, 0x00ad6727, 0x014a23af, 0x0008657c}}, Y: Field{[10]uint32{0x00136a8d, 0x00fb853e, 0x02111da5, 0x01621bfd, 0x025ff1aa, 0x014028dc, 0x01b3a10b, 0x03bc07d3, 0x038c9a44, 0x003f016c}}}, + {X: Field{[10]uint32{0x03713628, 0x029ff7e2, 0x03c4dac2, 0x0220e113, 0x021f5582, 0x03477468, 0x0354e167, 0x03e2e746, 0x007360ac, 0x0011d9e7}}, Y: Field{[10]uint32{0x03803ea7, 0x00fdb285, 0x007510a9, 0x002bfce9, 0x037ca018, 0x013df365, 0x014bbde9, 0x03a07793, 0x0225f3b8, 0x0020a808}}}, + {X: Field{[10]uint32{0x0230831a, 0x02a9f277, 0x00655ac9, 0x00b8bdf2, 0x038cb4ff, 0x030859af, 0x03fe514c, 0x029a6c8f, 0x02f51636, 0x002c2f40}}, Y: Field{[10]uint32{0x03d5f518, 0x03743423, 0x0081448a, 0x00fee9b2, 0x00f4843b, 0x02fae8f6, 0x03ffc51f, 0x032f14a9, 0x016248ba, 0x0001cfeb}}}, + {X: Field{[10]uint32{0x03660158, 0x0226c068, 0x034520c6, 0x00548f2d, 0x000aab5f, 0x036fb16e, 0x03f81afa, 0x03e07fb4, 0x03d6bfe9, 0x0037ebbf}}, Y: Field{[10]uint32{0x01240583, 0x017cf6b2, 0x0324df3b, 0x0200435e, 0x0330c4bf, 0x032d6d53, 0x00a4bf9c, 0x0120539b, 0x0105c3ef, 0x000fd534}}}, + {X: Field{[10]uint32{0x000d42ed, 0x02b81afd, 0x00ba7046, 0x038fadf9, 0x0080dffa, 0x01bf5af9, 0x013d2e79, 0x0079263d, 0x02bbda66, 0x003ac05a}}, Y: Field{[10]uint32{0x02f895be, 0x03e0e89e, 0x011f518b, 0x03b5b4a7, 0x0110f005, 0x030b97a1, 0x014d50ad, 0x0166a5b3, 0x01bbaa76, 0x000c435b}}}, + {X: Field{[10]uint32{0x019fb2ed, 0x01ebec32, 0x01173e51, 0x01334bcd, 0x01726378, 0x00dfe398, 0x035b5eb1, 0x0202cdb4, 0x03c43c08, 0x00262786}}, Y: Field{[10]uint32{0x01faa1d8, 0x02dd1da7, 0x012feb53, 0x02d30b36, 0x00999b3b, 0x0077ddf6, 0x035963d1, 0x033314e8, 0x035f110c, 0x0013133a}}}, + {X: Field{[10]uint32{0x02033811, 0x03846630, 0x010bbfbe, 0x01be4249, 0x00dd801d, 0x01db57bf, 0x025bd407, 0x01eefc7d, 0x0170be4a, 0x0002fac0}}, Y: Field{[10]uint32{0x0086461f, 0x037304e1, 0x01644ff4, 0x0277f316, 0x000f5234, 0x01b4f39b, 0x02998202, 0x0268e15e, 0x018a1d32, 0x0004d5ae}}}, + {X: Field{[10]uint32{0x03c0b145, 0x032d0abf, 0x0112e337, 0x01756d83, 0x02ea9bc5, 0x01b10a5a, 0x035e5969, 0x026935bd, 0x03c1986f, 0x0000b642}}, Y: Field{[10]uint32{0x031a0c4c, 0x0327c1bd, 0x03b5b48d, 0x02fb4bbc, 0x02b377cc, 0x019fabed, 0x004b721e, 0x00665efe, 0x0364734d, 0x001f55f3}}}, + {X: Field{[10]uint32{0x009f51bf, 0x02729dde, 0x02481e82, 0x03cffb9c, 0x0159fd53, 0x030d9cef, 0x0196848d, 0x02018b78, 0x0254c960, 0x001ade9a}}, Y: Field{[10]uint32{0x0009af23, 0x0148939b, 0x0321a579, 0x00ad0f2f, 0x03dd4dc4, 0x0162bef8, 0x0079f30c, 0x0229a7c2, 0x0208157b, 0x001aa7b8}}}, + {X: Field{[10]uint32{0x028e8393, 0x02f2da0d, 0x03a8bf4a, 0x03a221c3, 0x0316faf0, 0x02df9fba, 0x01f8fa87, 0x037f9da3, 0x00c732cb, 0x00326491}}, Y: Field{[10]uint32{0x035620ae, 0x0303f0a1, 0x01951bc0, 0x02331a92, 0x0058cc9b, 0x00b6b8ba, 0x0163453b, 0x00ab4901, 0x035553ba, 0x00082b46}}}, + {X: Field{[10]uint32{0x00f01b6b, 0x01c7e51c, 0x013f6d28, 0x009a707e, 0x01350fef, 0x0026807f, 0x01cf4fc6, 0x0237157c, 0x007b402a, 0x00154ff0}}, Y: Field{[10]uint32{0x00e5a824, 0x02644dcd, 0x002909c1, 0x005df91c, 0x039b3102, 0x035f54ea, 0x03cd0dc7, 0x01b7bfe9, 0x00753961, 0x000ed463}}}, + {X: Field{[10]uint32{0x00fe2f69, 0x012fb030, 0x02369a4e, 0x009e524b, 0x03721fa9, 0x00d3216e, 0x00dfc80a, 0x0229f2cf, 0x037806ed, 0x003164c0}}, Y: Field{[10]uint32{0x0317c149, 0x031e94cd, 0x023001e1, 0x019e7d11, 0x02d7580e, 0x004ff5c0, 0x016dea62, 0x0244a4de, 0x00698a3e, 0x000da679}}}, + {X: Field{[10]uint32{0x011e7eb5, 0x02fb3224, 0x01c6a79d, 0x01ffc744, 0x008cda0e, 0x030d275d, 0x034613d8, 0x026592e3, 0x0118f4d5, 0x0032dbc4}}, Y: Field{[10]uint32{0x01de20ee, 0x020d723f, 0x036f4cf4, 0x00f5f799, 0x030ca0fe, 0x02095f11, 0x03cc88f4, 0x03573dc8, 0x028898b0, 0x0018ac2b}}}, + {X: Field{[10]uint32{0x01a26db9, 0x03148a8c, 0x009a946f, 0x023259a2, 0x0078b5d4, 0x037b2e67, 0x0322ae61, 0x019a3765, 0x038f8c26, 0x00368b2a}}, Y: Field{[10]uint32{0x010c7e98, 0x007869db, 0x01ad8fc2, 0x01ac4921, 0x01180849, 0x0324ec4c, 0x0214cb70, 0x03e52529, 0x037e0234, 0x001a80cd}}}, + {X: Field{[10]uint32{0x003b7d86, 0x023579ad, 0x00a82b22, 0x020e69bb, 0x03fa595b, 0x003c0fbb, 0x03374110, 0x038f1ff8, 0x01423f9b, 0x003f1a93}}, Y: Field{[10]uint32{0x0298beff, 0x01da1968, 0x016f5bb4, 0x01b89a46, 0x0027dfbd, 0x03094fea, 0x0078fdda, 0x02f868f7, 0x0144eb8f, 0x001b0225}}}, + {X: Field{[10]uint32{0x03dee882, 0x00dd5b78, 0x03e09db7, 0x0126509b, 0x003d09fb, 0x032a5183, 0x03258e83, 0x038341dc, 0x011ab9c6, 0x001cf26a}}, Y: Field{[10]uint32{0x0171d2b3, 0x0358d7f9, 0x0222478c, 0x00411741, 0x0352040a, 0x027b61da, 0x0290259c, 0x01422b56, 0x0327efc0, 0x0022cc50}}}, + {X: Field{[10]uint32{0x034516d3, 0x01d1328e, 0x02762933, 0x0122ba5d, 0x022bc028, 0x012e0265, 0x03e61271, 0x033470d0, 0x006145b8, 0x00029a7c}}, Y: Field{[10]uint32{0x030ebe3d, 0x03688275, 0x009aea86, 0x006d1fd9, 0x0396b6d9, 0x02185789, 0x016caf01, 0x00dd07b0, 0x0190b450, 0x0021d463}}}, + {X: Field{[10]uint32{0x00ed9691, 0x0148d7ca, 0x02572fc9, 0x003d11a8, 0x01376a43, 0x0056e910, 0x01dfb2ac, 0x0102dc73, 0x022570df, 0x00072f92}}, Y: Field{[10]uint32{0x0213de85, 0x01748095, 0x0380b6ef, 0x03ce6714, 0x02c8ac69, 0x02ce54fb, 0x02a2d10a, 0x0386ab3c, 0x02ccf262, 0x00049553}}}, + {X: Field{[10]uint32{0x0388e27d, 0x0320df6d, 0x0052fd13, 0x006a209e, 0x014ee2f1, 0x02822c64, 0x005ac85b, 0x0333ed0c, 0x01c7406d, 0x00237a92}}, Y: Field{[10]uint32{0x03e9d9b0, 0x00a55ef3, 0x00056d90, 0x0395a5ed, 0x002b6071, 0x01e8141b, 0x038b15ab, 0x01f0faea, 0x01a83b51, 0x0031cf58}}}, + {X: Field{[10]uint32{0x02d0ade5, 0x0310e921, 0x0094f6e4, 0x01f4156f, 0x025e4b71, 0x0074e35a, 0x00ab5af8, 0x0330ec7b, 0x0377b175, 0x0037a498}}, Y: Field{[10]uint32{0x03d0e11f, 0x00e1f545, 0x01cb973c, 0x02b39834, 0x016be387, 0x02352e2c, 0x0289115d, 0x0365d350, 0x03e79169, 0x000a757c}}}, + {X: Field{[10]uint32{0x03b41497, 0x02896c34, 0x00fa38a9, 0x03317ac6, 0x00f6e8a9, 0x03549450, 0x0055a2f3, 0x01ead2ad, 0x02a7aeb3, 0x001b9dba}}, Y: Field{[10]uint32{0x01e066fa, 0x0064f925, 0x0108a89f, 0x00f35a42, 0x0144c40a, 0x011eaaf6, 0x03fb936a, 0x027456ef, 0x005a7890, 0x0001f8f3}}}, + {X: Field{[10]uint32{0x00607574, 0x03b43e2f, 0x03f8f09e, 0x0274dfd7, 0x01467853, 0x026247e6, 0x022b03fc, 0x01fc3699, 0x02cf22d5, 0x000dc4c7}}, Y: Field{[10]uint32{0x0249f3b3, 0x01e87244, 0x026acc17, 0x02a9aaeb, 0x01281323, 0x005cf52e, 0x011d596e, 0x00a5a3d8, 0x012169d4, 0x00300ecb}}}, + {X: Field{[10]uint32{0x025d8152, 0x004fcdd2, 0x024e7667, 0x023d25e6, 0x0365155c, 0x0337c3ae, 0x0276633b, 0x02655ca3, 0x001482c8, 0x001c8222}}, Y: Field{[10]uint32{0x0174eedc, 0x01d8b972, 0x02e92d2a, 0x01d2d22b, 0x00588a79, 0x02642803, 0x00e26f81, 0x03722f6a, 0x019f8c0a, 0x0019e0f1}}}, + {X: Field{[10]uint32{0x03241864, 0x0048d974, 0x01e8adb7, 0x03345136, 0x02d4567f, 0x02fe74f3, 0x03a7a7ad, 0x0112ca9f, 0x03dfbaca, 0x0006e098}}, Y: Field{[10]uint32{0x0388606d, 0x02906fb5, 0x02785783, 0x02020065, 0x02edf366, 0x00b6b00d, 0x004b98db, 0x00450c65, 0x023e24f0, 0x00007f1f}}}, + {X: Field{[10]uint32{0x02f5fd43, 0x02309833, 0x013dff1a, 0x0381684c, 0x03ea41ba, 0x03560fb7, 0x019714db, 0x01fcae06, 0x02de27ca, 0x0001e8dc}}, Y: Field{[10]uint32{0x02281142, 0x01bc6e6d, 0x032e2091, 0x0192e83a, 0x01a5d3ab, 0x03d793b5, 0x0060f220, 0x015e16d7, 0x016bb32c, 0x002838c8}}}, + {X: Field{[10]uint32{0x00d02300, 0x03b03aa3, 0x0232a72b, 0x03f5e750, 0x00c30f22, 0x0156b07c, 0x03b94327, 0x01124722, 0x01aa5525, 0x001c6057}}, Y: Field{[10]uint32{0x036471b4, 0x03c58031, 0x03804876, 0x00613118, 0x003ade09, 0x013af8f0, 0x02fcc688, 0x0170597e, 0x03928de1, 0x0022cd04}}}, + {X: Field{[10]uint32{0x03654d2b, 0x031714ff, 0x01c785d1, 0x01304b22, 0x0205535d, 0x027c815b, 0x02d866a0, 0x033192d8, 0x037ad3cf, 0x00006952}}, Y: Field{[10]uint32{0x03a12f19, 0x020e42d1, 0x012e841d, 0x03e774a2, 0x03e9f5ae, 0x0247b0c1, 0x0077395a, 0x021ef48b, 0x02e39f4b, 0x002df1de}}}, + {X: Field{[10]uint32{0x019c44a6, 0x00adfb66, 0x01987726, 0x0081d00e, 0x0022cd28, 0x035d68bb, 0x030b6953, 0x01cf9772, 0x00571fc9, 0x002172d1}}, Y: Field{[10]uint32{0x010f6aa5, 0x034cc627, 0x02d53280, 0x01eaf41b, 0x0358037a, 0x03850824, 0x014ef028, 0x03f99b03, 0x01f3bd13, 0x003bf747}}}, + {X: Field{[10]uint32{0x00fd4e4e, 0x02f7dd7f, 0x03962c35, 0x02384e37, 0x02cd72df, 0x0101e8da, 0x00b305a2, 0x00432509, 0x009c64a0, 0x00263a19}}, Y: Field{[10]uint32{0x01a6c60b, 0x02a921b5, 0x008efcd3, 0x03dbf338, 0x01624a8c, 0x030febb4, 0x01f77704, 0x0175f152, 0x01693439, 0x002a0131}}}, + {X: Field{[10]uint32{0x00a5a72b, 0x0002e51d, 0x028817e5, 0x0191a71a, 0x035019a1, 0x01d3eb22, 0x00338958, 0x0396a23d, 0x03e6a297, 0x0007ab11}}, Y: Field{[10]uint32{0x01a11105, 0x02792b83, 0x00325f51, 0x028a570c, 0x01043a10, 0x03992e7b, 0x000bb1ff, 0x037abbce, 0x026b784d, 0x0022df6a}}}, + {X: Field{[10]uint32{0x004f42f5, 0x012b9a01, 0x026bc96c, 0x031e80a9, 0x01e29950, 0x029c8f89, 0x029e0ab6, 0x01cd8c5f, 0x006591f2, 0x003c1e6b}}, Y: Field{[10]uint32{0x0032dfc5, 0x02051a71, 0x00562249, 0x0340f649, 0x03490186, 0x005287bd, 0x00c3ca02, 0x010dd12b, 0x01bfc99f, 0x003aa1f4}}}, + {X: Field{[10]uint32{0x02539643, 0x01c72a8c, 0x0186eba4, 0x03a21a0c, 0x00fa0d94, 0x001dec76, 0x011c3ada, 0x00c383c0, 0x0179bf1f, 0x0035b427}}, Y: Field{[10]uint32{0x00aa8adf, 0x03d7325f, 0x00049876, 0x00dd19af, 0x00ef5100, 0x036b4b52, 0x030494dc, 0x03d507dc, 0x0064fac8, 0x0021dc2f}}}, + {X: Field{[10]uint32{0x00351f65, 0x03cee82e, 0x0291e3af, 0x029ac793, 0x01d6416c, 0x020c4fe2, 0x00595656, 0x00cda01c, 0x03d9f896, 0x000ddb92}}, Y: Field{[10]uint32{0x025f13f1, 0x014de379, 0x0295b78a, 0x03a91feb, 0x000497de, 0x0111f2ca, 0x019e8b96, 0x023c757a, 0x01e56724, 0x002e90db}}}, + {X: Field{[10]uint32{0x039f20d7, 0x0231d042, 0x0210c657, 0x014eee85, 0x000b17cb, 0x025be0d3, 0x0193daec, 0x031e6688, 0x02184b42, 0x0009c3ce}}, Y: Field{[10]uint32{0x03e7e5bc, 0x019cca15, 0x0300021b, 0x02a7d28e, 0x023a7054, 0x019ccddf, 0x00fb0d01, 0x022eec28, 0x012b9ab9, 0x003333ac}}}, + {X: Field{[10]uint32{0x02c1a599, 0x00169743, 0x02de20f5, 0x02dfea62, 0x00b055d2, 0x00ed25b4, 0x0247a8a9, 0x014d20a7, 0x03641a1e, 0x002b89c6}}, Y: Field{[10]uint32{0x03c2bdd3, 0x03ec911f, 0x0181e45d, 0x02294f05, 0x01584790, 0x021ebea7, 0x02a9a23f, 0x0207c948, 0x012f39b4, 0x00053a55}}}, + {X: Field{[10]uint32{0x03f28c8c, 0x021a6d69, 0x016a25ec, 0x00ea50ff, 0x02db36a9, 0x03b94e43, 0x0288ad64, 0x0229d2a4, 0x00fb177d, 0x0015a7ab}}, Y: Field{[10]uint32{0x03732f7c, 0x0271c6d7, 0x028440cb, 0x03d517d4, 0x02bfda9a, 0x01bd3c4d, 0x027508aa, 0x0190ae66, 0x00329127, 0x00073d8b}}}, + {X: Field{[10]uint32{0x0315b558, 0x01f3e057, 0x01e46f27, 0x03b5b4d9, 0x0041bfb5, 0x025e43e3, 0x026a2468, 0x039eea8c, 0x027ffdc4, 0x001df1fc}}, Y: Field{[10]uint32{0x021c3007, 0x03e4cee0, 0x01a4325a, 0x03ac1140, 0x00e0f970, 0x014b0bb0, 0x02a68288, 0x03976559, 0x00dc138b, 0x00134d10}}}, + {X: Field{[10]uint32{0x00adbb25, 0x03b5f625, 0x001ed132, 0x0079ee0c, 0x017d4676, 0x00113fbe, 0x03f67e9b, 0x000c1aa1, 0x02dbf173, 0x003598a4}}, Y: Field{[10]uint32{0x008b83c5, 0x03963d8b, 0x00209cb0, 0x0051bf14, 0x033d36db, 0x02ff2cca, 0x0145f238, 0x0293b648, 0x03558cec, 0x0033bbdd}}}, + {X: Field{[10]uint32{0x037ed0d6, 0x021597a9, 0x03a4925e, 0x02efd541, 0x038769e3, 0x01faec7c, 0x03927ef0, 0x01bd12dd, 0x032e12ea, 0x000710a0}}, Y: Field{[10]uint32{0x0029d5ee, 0x0394e2a7, 0x0211e280, 0x028cc9ef, 0x02786a62, 0x03879076, 0x017917d9, 0x013d769c, 0x03a4b31b, 0x0022e4e0}}}, + {X: Field{[10]uint32{0x021f7968, 0x02afddec, 0x014cc5d6, 0x00d4f34e, 0x00608324, 0x02e633cc, 0x0362911f, 0x018aa330, 0x02ff9422, 0x0018f95f}}, Y: Field{[10]uint32{0x01b009be, 0x00ba8d56, 0x036b0450, 0x038a897e, 0x00146062, 0x008ba94c, 0x0344e7d3, 0x020fc930, 0x022dfb90, 0x00278f07}}}, + {X: Field{[10]uint32{0x03b83c90, 0x01452265, 0x03f9b02a, 0x02a6d3a8, 0x00cf3ed3, 0x024253aa, 0x0088e591, 0x022971cb, 0x03a186f3, 0x002f88cf}}, Y: Field{[10]uint32{0x01dba564, 0x0067437b, 0x0156fefd, 0x03a98a5a, 0x0140bd48, 0x03714def, 0x0389ef9e, 0x02b6c9b8, 0x02b3362f, 0x00100bac}}}, + {X: Field{[10]uint32{0x01844b78, 0x0030fc58, 0x03579aaa, 0x01592892, 0x02f2cc69, 0x029cc3f3, 0x01f4d065, 0x01d3ea71, 0x03804e7c, 0x0018db76}}, Y: Field{[10]uint32{0x02a2496c, 0x03d1faf9, 0x022e7dee, 0x03ee4589, 0x026aa31f, 0x025fab22, 0x02feb598, 0x004b1808, 0x01695832, 0x001a928d}}}, + {X: Field{[10]uint32{0x02e1c5e7, 0x035b0b37, 0x01e605bd, 0x030adb9a, 0x02215ae7, 0x038bc959, 0x035af1ee, 0x0361ffde, 0x01d17250, 0x00349470}}, Y: Field{[10]uint32{0x03b4ae78, 0x012d461f, 0x004cbf55, 0x001b2116, 0x005de60d, 0x02e59963, 0x035c9862, 0x00bea32a, 0x00f57df5, 0x000916b3}}}, + {X: Field{[10]uint32{0x018ed407, 0x0371d106, 0x0248cc3b, 0x005ceea0, 0x029055f9, 0x012c1bd0, 0x011cbe05, 0x004cedc1, 0x00b8c62f, 0x00101753}}, Y: Field{[10]uint32{0x005deb54, 0x02aee9cc, 0x027201a9, 0x03f181d1, 0x01523553, 0x034af0fb, 0x00e8031b, 0x00f2d0a6, 0x0310a896, 0x002118f7}}}, + {X: Field{[10]uint32{0x03e983b8, 0x03b638e6, 0x03003546, 0x025073a3, 0x00ab3293, 0x03f696f9, 0x00a03144, 0x00e81f85, 0x02ee9ab3, 0x0025fc16}}, Y: Field{[10]uint32{0x03849261, 0x012b56fa, 0x01a7c3be, 0x008078f4, 0x03d321f1, 0x00cde0b2, 0x0070b155, 0x004e2f13, 0x02267fd9, 0x0016798a}}}, + {X: Field{[10]uint32{0x02b91ac8, 0x0181d243, 0x0153dea1, 0x02350c25, 0x01c99fdf, 0x02e6b5a4, 0x01060f26, 0x009701aa, 0x016118e1, 0x0000ce20}}, Y: Field{[10]uint32{0x0004384b, 0x005d9f65, 0x00c88728, 0x023f6f70, 0x02a57178, 0x0116a640, 0x013af0d2, 0x0069a301, 0x018b5b8e, 0x00160fa4}}}, + {X: Field{[10]uint32{0x0117a9f9, 0x03dff4cf, 0x03c31dc8, 0x0198cda7, 0x038cf653, 0x0370ed81, 0x0306b1ad, 0x01a8967d, 0x00466bbe, 0x00377483}}, Y: Field{[10]uint32{0x01de5a99, 0x01e3a270, 0x03daa7cf, 0x0166b2d0, 0x017833e1, 0x0188733c, 0x02adcf46, 0x0261a2ee, 0x0329b4ea, 0x002cb7de}}}, + {X: Field{[10]uint32{0x03dfc9f7, 0x00005c8e, 0x011cfdfe, 0x004ba37e, 0x00eecd07, 0x004e272f, 0x02c26bc3, 0x003b9565, 0x012f71ae, 0x00248f1b}}, Y: Field{[10]uint32{0x034be948, 0x0290dc00, 0x03082414, 0x021cc81f, 0x005ff2ed, 0x02680f50, 0x001ae969, 0x00490da9, 0x00ad27c4, 0x001bf6ca}}}, + {X: Field{[10]uint32{0x00a09e65, 0x0277c637, 0x031a7fde, 0x01b05241, 0x01a44887, 0x0229f444, 0x0212461b, 0x01fa1d9a, 0x02bd28d5, 0x001b50a9}}, Y: Field{[10]uint32{0x01fd28bf, 0x02fb5ae5, 0x02775640, 0x0099d1fc, 0x00dcdd28, 0x0008988d, 0x005554df, 0x03a5f0d6, 0x02b801db, 0x00137c1e}}}, + {X: Field{[10]uint32{0x01d761ae, 0x018c3b08, 0x023f04b9, 0x0010c726, 0x0170efe1, 0x014e7b38, 0x003610d8, 0x03c9674f, 0x016159f9, 0x001ff50a}}, Y: Field{[10]uint32{0x01d7e280, 0x03c77c49, 0x026dc787, 0x0005b574, 0x00e85b60, 0x03543990, 0x037d00c4, 0x00afd440, 0x0041b8ce, 0x003f5a55}}}, + {X: Field{[10]uint32{0x026770b5, 0x026ec97a, 0x018a75b5, 0x0377d023, 0x00944045, 0x00156664, 0x0100a017, 0x025f7f9e, 0x010b128d, 0x00123041}}, Y: Field{[10]uint32{0x00f66559, 0x0005f05b, 0x0061ef9b, 0x027e218c, 0x01d450e4, 0x00d4e282, 0x0061b315, 0x00c67073, 0x01a04b6e, 0x0023df3b}}}, + {X: Field{[10]uint32{0x02e2a686, 0x01963df7, 0x00a09689, 0x01037969, 0x00b3214c, 0x0220f19f, 0x02baa1b4, 0x018b725a, 0x019da12d, 0x0015118b}}, Y: Field{[10]uint32{0x01ccd957, 0x03fb0b96, 0x02e370bc, 0x00583546, 0x026a3f00, 0x03bba067, 0x0133bb50, 0x00475c3f, 0x016f9160, 0x001d9ceb}}}, + {X: Field{[10]uint32{0x026435e8, 0x01ce6087, 0x02261443, 0x011d535e, 0x0095c5fe, 0x012ddc7c, 0x025a46e4, 0x0076260a, 0x00c4e4e1, 0x001a614d}}, Y: Field{[10]uint32{0x01cbba18, 0x03d07538, 0x011376a8, 0x0267dc70, 0x039faba0, 0x039f5a1c, 0x0219a8a5, 0x0031c635, 0x02acb272, 0x000db580}}}, + {X: Field{[10]uint32{0x03e77ecc, 0x0120ca82, 0x0341ad8c, 0x00849bf4, 0x01d0bc2a, 0x03223b36, 0x0376b0d7, 0x02070eec, 0x035951c6, 0x001124fd}}, Y: Field{[10]uint32{0x0120351e, 0x002624b0, 0x0012a391, 0x03d3a0a7, 0x02df7143, 0x02ff552f, 0x03158574, 0x026ab65f, 0x021dd4d9, 0x003954f8}}}, + {X: Field{[10]uint32{0x00f8313b, 0x02f89233, 0x02ec8cf8, 0x0179a1f9, 0x006c0632, 0x0245f009, 0x0384cf5f, 0x02038625, 0x02a93300, 0x002c1536}}, Y: Field{[10]uint32{0x0367d866, 0x0222c76d, 0x01a83b06, 0x016877ba, 0x014ed52a, 0x01809083, 0x015f2a40, 0x03956b1d, 0x03155c9c, 0x00147c11}}}, + {X: Field{[10]uint32{0x0029583e, 0x000dc4f0, 0x03c571fe, 0x032581be, 0x02c1f8cf, 0x0194676c, 0x03e6796e, 0x01ac7e7f, 0x02a4fa99, 0x0012d09c}}, Y: Field{[10]uint32{0x030edb83, 0x032029bf, 0x0110cf5f, 0x00cd0e13, 0x03cecde8, 0x032f145e, 0x0336f8cf, 0x0314f572, 0x02d0dce7, 0x002549bc}}}, + {X: Field{[10]uint32{0x03e29604, 0x0012a8d8, 0x00bff46a, 0x020fc7c1, 0x006cf63f, 0x03468e52, 0x02d8e647, 0x03a0bb2b, 0x0281c69d, 0x003587ad}}, Y: Field{[10]uint32{0x021f08b8, 0x0218965c, 0x001dfaa3, 0x01756fd1, 0x03f62fdf, 0x002b8a3a, 0x006d9a43, 0x01ee3cdf, 0x02fb156d, 0x0026d6a4}}}, + {X: Field{[10]uint32{0x02bf507f, 0x00f93830, 0x0157d576, 0x0103bf63, 0x008349e3, 0x037057ae, 0x0173c8f3, 0x01e7027e, 0x000257f9, 0x0002fe3c}}, Y: Field{[10]uint32{0x020614fe, 0x01052820, 0x037d9f66, 0x00e7d3c5, 0x03433467, 0x01b4d8e8, 0x00265a83, 0x0399c3f7, 0x022f1041, 0x00158761}}}, + {X: Field{[10]uint32{0x034cb498, 0x00f8a25d, 0x032d5eb0, 0x011547b1, 0x03b471fd, 0x00a4ea1b, 0x01ca03f7, 0x03eb5936, 0x00e2a7a6, 0x0018ec95}}, Y: Field{[10]uint32{0x01948c8b, 0x01eef9d4, 0x01880083, 0x014dafbf, 0x01f5be7d, 0x00b79273, 0x03b3819a, 0x03a48b71, 0x01113a4c, 0x003d0514}}}, + {X: Field{[10]uint32{0x03968725, 0x00628a74, 0x0009ae04, 0x0021ae4f, 0x0350fdd9, 0x01327bf9, 0x0091f33c, 0x01bb618d, 0x02cde1da, 0x002eb9be}}, Y: Field{[10]uint32{0x02a30533, 0x0198241b, 0x0349bb4d, 0x03149498, 0x02e4ca46, 0x019539a8, 0x03df74c6, 0x00c5dbda, 0x01550e48, 0x001f1f72}}}, + {X: Field{[10]uint32{0x00eb34af, 0x021188eb, 0x0029b595, 0x005d4e01, 0x00d30a63, 0x0271982c, 0x02d81395, 0x02a823cf, 0x01f8ea15, 0x003d58a1}}, Y: Field{[10]uint32{0x015a9eb9, 0x02c73a41, 0x038ee31e, 0x0369ee66, 0x02d9a0f6, 0x028b72e6, 0x0303c9de, 0x00652901, 0x03c1a202, 0x0004400c}}}, + {X: Field{[10]uint32{0x0151d87a, 0x01c98ce0, 0x006a540d, 0x0348663b, 0x020eafba, 0x003a38da, 0x039191c6, 0x035147b6, 0x00953de3, 0x0021db1f}}, Y: Field{[10]uint32{0x032279b8, 0x013897a5, 0x03d27df5, 0x00744016, 0x01cf5501, 0x0394aa16, 0x0010d177, 0x0031b010, 0x037472ce, 0x00257bff}}}, + {X: Field{[10]uint32{0x000a6d30, 0x0360eb25, 0x030e3fbf, 0x01b6e8fc, 0x00a024d8, 0x02ac71d6, 0x00969024, 0x01ef55a0, 0x03ed077c, 0x003a55b1}}, Y: Field{[10]uint32{0x03aad9da, 0x01c5dc41, 0x0026b45c, 0x0164339a, 0x0205aa57, 0x01669592, 0x017a9da2, 0x026adde9, 0x00a6f0d1, 0x0006d77f}}}, + {X: Field{[10]uint32{0x01dd3f16, 0x00bfeaa6, 0x028bd8fe, 0x016a0691, 0x03ab743b, 0x01412335, 0x016e9c06, 0x01150c51, 0x0261abdb, 0x003d4ff7}}, Y: Field{[10]uint32{0x0390222f, 0x01ad93b5, 0x026bc1a2, 0x023b838a, 0x01a65ac7, 0x02cd586f, 0x038e86ba, 0x008ad405, 0x013947ea, 0x00074a2d}}}, + {X: Field{[10]uint32{0x00043ad9, 0x00d91272, 0x003b5f5d, 0x02d3def3, 0x025e49b0, 0x00da9f18, 0x01b91039, 0x010d751d, 0x028152eb, 0x002e46a1}}, Y: Field{[10]uint32{0x013aaa75, 0x00c018a8, 0x0288bb34, 0x00347a2f, 0x01722dc9, 0x007746f5, 0x0296f3d1, 0x026f0185, 0x01175693, 0x00031d63}}}, + {X: Field{[10]uint32{0x018f8cc7, 0x03c233e3, 0x02897b16, 0x032ec930, 0x0261f5ad, 0x02f25d4d, 0x00c55d0a, 0x00a49f6d, 0x007023e3, 0x0016a1ef}}, Y: Field{[10]uint32{0x03731e54, 0x02a9b81b, 0x01b2c3d2, 0x00b622a2, 0x009d1ac3, 0x02ffdd2d, 0x02d2120f, 0x00357011, 0x024baa6a, 0x00273aab}}}, + {X: Field{[10]uint32{0x01ceb034, 0x01e7de5c, 0x02e80de9, 0x02a19ad9, 0x01215622, 0x03f1736c, 0x00a80b9e, 0x02cd50ef, 0x0343e54e, 0x002b02c6}}, Y: Field{[10]uint32{0x00638d8d, 0x0344fcfd, 0x007f609b, 0x03ef4afc, 0x01439477, 0x025f6a6d, 0x03c2b871, 0x0385485e, 0x035e5731, 0x002a2455}}}, + {X: Field{[10]uint32{0x005ca915, 0x01cd19fa, 0x03dc1450, 0x01277cea, 0x00e84f19, 0x01ae88dc, 0x034d6f3f, 0x033609db, 0x02bc2017, 0x0034f107}}, Y: Field{[10]uint32{0x00dcf7b7, 0x02979363, 0x02ce609d, 0x01d8ee8f, 0x01bc1e95, 0x0043f3cd, 0x02b1e916, 0x0165147d, 0x01528be5, 0x0014aac7}}}, + {X: Field{[10]uint32{0x03923b02, 0x03afa551, 0x010634d1, 0x013d27ba, 0x02ab842e, 0x0386c3cd, 0x0100d00f, 0x00b31bde, 0x0057f4c8, 0x001a33ff}}, Y: Field{[10]uint32{0x02b1d8e2, 0x01a92166, 0x026b26fe, 0x0012ebb4, 0x03367ba9, 0x00628c1a, 0x03da281c, 0x001d070f, 0x01bfaac1, 0x001ca655}}}, + {X: Field{[10]uint32{0x00177d9c, 0x03c954e3, 0x0074cd30, 0x0194d0fe, 0x02579dc7, 0x014c9299, 0x00566b33, 0x0267bb82, 0x00e12462, 0x001f83d6}}, Y: Field{[10]uint32{0x0021447c, 0x010065a2, 0x0128dcd3, 0x0055a816, 0x00086b90, 0x034d99d0, 0x009af7b5, 0x024fc020, 0x01835872, 0x000e5949}}}, + {X: Field{[10]uint32{0x00c9b542, 0x0057ae39, 0x03bbb97a, 0x0219cc95, 0x025dc450, 0x02cc97f5, 0x013d4bf1, 0x019263ad, 0x03dbd181, 0x0031caae}}, Y: Field{[10]uint32{0x0325a7b9, 0x01debeca, 0x0378288e, 0x0232da06, 0x00841a06, 0x011b34c6, 0x0041ed3e, 0x03cf4a21, 0x03a55df5, 0x000f23eb}}}, + {X: Field{[10]uint32{0x02363d0d, 0x002aed74, 0x015a1b72, 0x0329cff8, 0x00943654, 0x03da40de, 0x024d76ce, 0x0245107d, 0x035d3eb0, 0x001d1d1f}}, Y: Field{[10]uint32{0x00443649, 0x03eb5f07, 0x019b9746, 0x029907e5, 0x03bf54c1, 0x032bc151, 0x01f993a5, 0x03a3dcc8, 0x03240bc7, 0x00004b19}}}, + {X: Field{[10]uint32{0x01b67067, 0x03ff23e4, 0x006e1212, 0x00b347ec, 0x0129db86, 0x02b5a26a, 0x00b5d71d, 0x039f10d3, 0x02d1ab1d, 0x003ca9c0}}, Y: Field{[10]uint32{0x03afd854, 0x01ef458d, 0x0242962c, 0x006af451, 0x031d5ec1, 0x03ed373e, 0x03452bc7, 0x02b26b2d, 0x022cc730, 0x00016e47}}}, + {X: Field{[10]uint32{0x000d9340, 0x02d58d34, 0x01e1b530, 0x00f52fa4, 0x00c2535b, 0x000711ba, 0x01a87b62, 0x01ad197f, 0x030814e7, 0x002a4b53}}, Y: Field{[10]uint32{0x01cd0277, 0x02e81941, 0x030be6f4, 0x02f08d43, 0x0038d96d, 0x01d536b6, 0x01fd9bfe, 0x03ed015a, 0x028f3c02, 0x001360a6}}}, + {X: Field{[10]uint32{0x02f205a1, 0x03e45e89, 0x017462aa, 0x010a1285, 0x02df5ea1, 0x002a03ee, 0x00ea3206, 0x030ecfe4, 0x00b1ac06, 0x001e78c3}}, Y: Field{[10]uint32{0x00d5c82f, 0x007c9db2, 0x028d5352, 0x012a7d85, 0x007f1736, 0x0032ea5d, 0x008a79ed, 0x0252556b, 0x020a8145, 0x002b4882}}}, + {X: Field{[10]uint32{0x009401d1, 0x008c6da3, 0x02ff3020, 0x028eeaf5, 0x0288c8d6, 0x00903e8c, 0x023252be, 0x015dfc11, 0x0053d412, 0x001b5577}}, Y: Field{[10]uint32{0x03006eb3, 0x00cbf4de, 0x021540d7, 0x03228297, 0x02c98e17, 0x019e7c15, 0x01553452, 0x00cb0164, 0x0096aa3b, 0x0020e907}}}, + {X: Field{[10]uint32{0x01b3f20a, 0x00ed5a92, 0x02f487c8, 0x038834f8, 0x0211ef14, 0x032e2830, 0x03ea5eb4, 0x02e426cd, 0x031f604e, 0x0033e727}}, Y: Field{[10]uint32{0x0247dff8, 0x034722e8, 0x03f93dd3, 0x03e77d5b, 0x02da24ea, 0x032d1077, 0x0260b5be, 0x026621dc, 0x01f64e64, 0x000ae42e}}}, + {X: Field{[10]uint32{0x006b35dd, 0x03649786, 0x00346a2f, 0x016eea6a, 0x00e30f43, 0x03bdbf2b, 0x03677809, 0x02652acc, 0x019f29ed, 0x0018350a}}, Y: Field{[10]uint32{0x0360331e, 0x008da551, 0x0143737b, 0x02927462, 0x03040d51, 0x03639092, 0x0386ddd2, 0x02d3163f, 0x0388b8aa, 0x00037da6}}}, + {X: Field{[10]uint32{0x01493540, 0x0314ddb6, 0x02122887, 0x01660b34, 0x037de3be, 0x004528ef, 0x02bbb854, 0x012981ad, 0x02dd1b67, 0x00364e9b}}, Y: Field{[10]uint32{0x01e5f7ff, 0x03146ffe, 0x01230423, 0x023111fb, 0x03acfdb0, 0x03e486b9, 0x01590064, 0x0065ef00, 0x03d7dc79, 0x0021f68d}}}, + {X: Field{[10]uint32{0x01652962, 0x024646af, 0x03c6025d, 0x0368681b, 0x01fd5869, 0x032ded7d, 0x02bb6b31, 0x023662dc, 0x01377e10, 0x0033e30f}}, Y: Field{[10]uint32{0x00128fbb, 0x02722c4d, 0x01c93afc, 0x006a1e7b, 0x02fc5427, 0x0086cf2b, 0x002b0343, 0x02b40b6d, 0x0102bb96, 0x0001bd73}}}, + {X: Field{[10]uint32{0x00df29eb, 0x011f9a23, 0x002a6908, 0x0123c931, 0x00715b90, 0x01ee7283, 0x03ab65ac, 0x03b3e609, 0x02474637, 0x001b2a64}}, Y: Field{[10]uint32{0x02b55439, 0x0260f93f, 0x001f6d93, 0x00374057, 0x028bb616, 0x02ad5f0f, 0x02a446ed, 0x01153b65, 0x01a5fefa, 0x00144de3}}}, + {X: Field{[10]uint32{0x00d17afd, 0x035a1b4a, 0x008c558e, 0x0135ee7c, 0x033cc306, 0x02b3cb8f, 0x0267758c, 0x004f577a, 0x00043cb8, 0x001bdf4b}}, Y: Field{[10]uint32{0x0233bc6f, 0x029b3194, 0x013c8c65, 0x03c82b0a, 0x01b590a5, 0x01f17858, 0x039106c1, 0x03b120cf, 0x027813ec, 0x0011e538}}}, + {X: Field{[10]uint32{0x0124f3e1, 0x02a2893a, 0x03475d2c, 0x0069f667, 0x01e818d0, 0x0213a466, 0x02a82b01, 0x0220fead, 0x00d00bc9, 0x003e2bb8}}, Y: Field{[10]uint32{0x039442b5, 0x01bcd2a0, 0x01b8ab52, 0x01797348, 0x0244f105, 0x01ac6cf7, 0x0026bfac, 0x0177c025, 0x032b6913, 0x002b3e72}}}, + {X: Field{[10]uint32{0x00ce781c, 0x010ad180, 0x03f9d222, 0x03aba461, 0x010a85c8, 0x03d32470, 0x03123fc7, 0x000fd12f, 0x00bfc1a2, 0x0022c03f}}, Y: Field{[10]uint32{0x01d35bc9, 0x02617322, 0x03cac478, 0x02676b7e, 0x020a8de6, 0x03b9510a, 0x00264280, 0x039a43b0, 0x018a3e81, 0x00187a79}}}, + {X: Field{[10]uint32{0x01d6dd4d, 0x02dfe84e, 0x03c1ab0e, 0x008fa612, 0x00a72785, 0x0330c84b, 0x001ebbc1, 0x028acb08, 0x03078e84, 0x003eeb2e}}, Y: Field{[10]uint32{0x003a0f52, 0x02129f93, 0x020833aa, 0x017f45b1, 0x014e557d, 0x032eea89, 0x03df675c, 0x002265e5, 0x01d6f5eb, 0x000b1b27}}}, + {X: Field{[10]uint32{0x005c0611, 0x00cf6b2b, 0x02175bfa, 0x02ecf7e2, 0x005ba601, 0x00ee8a01, 0x028f9935, 0x03c14e34, 0x035c2f32, 0x000555a1}}, Y: Field{[10]uint32{0x00e240b7, 0x02bfa129, 0x01cf8eba, 0x00e84391, 0x03d2eb78, 0x022238e1, 0x01fb5405, 0x0251923a, 0x0050c3da, 0x0014d88c}}}, + {X: Field{[10]uint32{0x02d93d77, 0x01caec00, 0x0379e2e9, 0x03416617, 0x0349a8ce, 0x01a0fe00, 0x03e690ec, 0x017a6338, 0x00957f5b, 0x002d80ac}}, Y: Field{[10]uint32{0x01435227, 0x00e6d3a1, 0x009d960d, 0x00e2bd6e, 0x01ff3588, 0x006edecc, 0x00046acb, 0x02e0878c, 0x0390ddd6, 0x001e21a0}}}, + {X: Field{[10]uint32{0x022dd17a, 0x01454076, 0x0037724f, 0x0059d7f9, 0x037a8462, 0x001bc154, 0x01d66f8a, 0x00913822, 0x016523a5, 0x000a8440}}, Y: Field{[10]uint32{0x00825159, 0x0314e86e, 0x02bff938, 0x01e1f4b0, 0x02b881d0, 0x001cdfce, 0x02de4983, 0x018ba6c0, 0x0125e1ca, 0x000934ed}}}, + {X: Field{[10]uint32{0x017efce0, 0x00d76991, 0x01d3835a, 0x02495bf2, 0x01a13edb, 0x03d0f4b6, 0x0326a8e4, 0x03e6a738, 0x03591148, 0x0001cc51}}, Y: Field{[10]uint32{0x03b2d8b3, 0x02c3fddd, 0x03790c7f, 0x03c0c182, 0x021ad5ad, 0x015d991c, 0x02c7cfa4, 0x02a8134e, 0x009480d0, 0x002c6573}}}, + {X: Field{[10]uint32{0x036206fc, 0x0117b76c, 0x02e3db2f, 0x0190df65, 0x000525d8, 0x016a7638, 0x0362979c, 0x008f5c58, 0x03e40c7e, 0x0028db93}}, Y: Field{[10]uint32{0x02844751, 0x0158d799, 0x02707c74, 0x027da5e9, 0x00034669, 0x0020ce69, 0x0270de87, 0x0236d2a2, 0x03850a42, 0x0015ab39}}}, + {X: Field{[10]uint32{0x003cac9a, 0x0135de3d, 0x00402344, 0x035fa219, 0x0085b877, 0x0289253d, 0x021b61d5, 0x01046175, 0x03e7a2c5, 0x0025e192}}, Y: Field{[10]uint32{0x01f2ff69, 0x023b68ae, 0x000ab013, 0x00a1c6e6, 0x003a6c54, 0x03a4f9c7, 0x01dcd900, 0x020e4554, 0x0278a85b, 0x0010ccca}}}, + {X: Field{[10]uint32{0x0119893e, 0x03ae65a1, 0x02458b74, 0x01057fc0, 0x03daa7ca, 0x0177351f, 0x02c92c84, 0x03ba9b68, 0x01bf2449, 0x000d294b}}, Y: Field{[10]uint32{0x0303ece4, 0x00151ff8, 0x001b9427, 0x00d5a675, 0x03b3545a, 0x007ceec8, 0x03a8d552, 0x009b27de, 0x0029900f, 0x002b7506}}}, + {X: Field{[10]uint32{0x03f3d629, 0x037a298b, 0x02fcf5af, 0x02ede67d, 0x030d8bdb, 0x018c7d6e, 0x037b2b48, 0x02985d7e, 0x03a994ee, 0x0038942a}}, Y: Field{[10]uint32{0x0143b0ea, 0x02f60da0, 0x01757409, 0x03b02ffc, 0x022e92c4, 0x02254c3e, 0x00b6fae6, 0x03ea182f, 0x00f59db0, 0x00200fcd}}}, + {X: Field{[10]uint32{0x0071ae00, 0x026b8a6e, 0x02372086, 0x00bb8eca, 0x02795304, 0x01563845, 0x009347a4, 0x011b8845, 0x026d0b59, 0x00060d5a}}, Y: Field{[10]uint32{0x015385cb, 0x03a6aee6, 0x01f08f19, 0x008eea30, 0x000ba6de, 0x032849f1, 0x0398ec8d, 0x01be0787, 0x01716b17, 0x0015bbc2}}}, + {X: Field{[10]uint32{0x00205533, 0x033caa44, 0x0288eed3, 0x035bdcf5, 0x02ca5932, 0x0030a795, 0x025ef3f3, 0x0182100d, 0x03f5e530, 0x000d6a3a}}, Y: Field{[10]uint32{0x03259958, 0x0061481f, 0x018c453a, 0x03570b41, 0x0220d30f, 0x02b69d67, 0x01410325, 0x0153788f, 0x01950429, 0x0027ab97}}}, + {X: Field{[10]uint32{0x02a4e1b9, 0x014107f9, 0x007bda70, 0x02427292, 0x037b3dbe, 0x014ea597, 0x0062b920, 0x023fa7aa, 0x02f525ea, 0x0000df81}}, Y: Field{[10]uint32{0x03ceb97c, 0x015fed87, 0x020d703f, 0x01a3f73d, 0x003f2f65, 0x00686650, 0x0313b604, 0x026fa88f, 0x03d35e48, 0x0020e467}}}, + {X: Field{[10]uint32{0x02131c27, 0x037b0657, 0x007131a4, 0x0119c636, 0x01483166, 0x03929bff, 0x00629476, 0x0000bc44, 0x0297ac6c, 0x002aeef9}}, Y: Field{[10]uint32{0x012f9dcb, 0x01c55cac, 0x00300929, 0x01126a92, 0x02fd7049, 0x0083abd3, 0x00d8a24a, 0x008bfdfe, 0x02cb9d51, 0x002cb249}}}, + {X: Field{[10]uint32{0x01b05878, 0x0161691a, 0x0204368a, 0x00dabab2, 0x015a1a36, 0x022454c5, 0x0029c8b7, 0x03730fdf, 0x02cb1484, 0x00137cda}}, Y: Field{[10]uint32{0x0241c41d, 0x0308379a, 0x02d09d4f, 0x012edff3, 0x00aa059f, 0x0255914d, 0x00417fb1, 0x03c098ff, 0x026fc08a, 0x003f85bf}}}, + {X: Field{[10]uint32{0x0399d0d7, 0x01f4a6f9, 0x0073123a, 0x018371f1, 0x03c8f49c, 0x02f6bdab, 0x01570e5e, 0x01a82a22, 0x02e31025, 0x0017fc53}}, Y: Field{[10]uint32{0x03e65d7b, 0x0074af3d, 0x010d8989, 0x01b15b3f, 0x0295382d, 0x02b66146, 0x02a923ee, 0x00beb23c, 0x013855eb, 0x0025bfc5}}}, + {X: Field{[10]uint32{0x015d119a, 0x00b7a8a1, 0x028104f6, 0x0320dabd, 0x02a24dba, 0x01eadc61, 0x01281a1b, 0x008bd1e4, 0x0052c1d4, 0x0005a84b}}, Y: Field{[10]uint32{0x00c17478, 0x0205c8c9, 0x03b2ab3a, 0x03d01838, 0x01d36a4b, 0x02eeaaea, 0x0196cb38, 0x015b791a, 0x0272f673, 0x001e9bbc}}}, + {X: Field{[10]uint32{0x01489ef5, 0x0003fea8, 0x00eda606, 0x02b2fa91, 0x0005fcdb, 0x03f559f9, 0x00b3d154, 0x02248292, 0x00338368, 0x0023d327}}, Y: Field{[10]uint32{0x03885717, 0x015932b6, 0x01b4e37d, 0x035232ee, 0x01a4b0ab, 0x018a78b9, 0x03c0082d, 0x01131eca, 0x004de064, 0x000aed6f}}}, + {X: Field{[10]uint32{0x02b83310, 0x035b4aaa, 0x017776ab, 0x00bf417d, 0x0219236d, 0x0140e672, 0x00ca399e, 0x01c04215, 0x039b0754, 0x001262fc}}, Y: Field{[10]uint32{0x02fd691c, 0x0394699a, 0x01d0c4dd, 0x0118b0d5, 0x02b5edcd, 0x0291752e, 0x007beb58, 0x0238daf3, 0x03ff0cb5, 0x00238b7a}}}, + {X: Field{[10]uint32{0x02fb5996, 0x01b84dbb, 0x01c1171e, 0x024047a2, 0x022ba51d, 0x012560cd, 0x02247d17, 0x034e5ac8, 0x020a2978, 0x001e051f}}, Y: Field{[10]uint32{0x03f85989, 0x00c349c3, 0x01fd41d8, 0x03d6e2c1, 0x004c75bf, 0x03ad1043, 0x01bf0fb2, 0x01986f9c, 0x030ca73b, 0x00299ade}}}, + {X: Field{[10]uint32{0x028d4927, 0x035df760, 0x01f663f4, 0x028b85ab, 0x0047e112, 0x00b7c012, 0x037aea1d, 0x01b1f951, 0x00d9fb23, 0x000d44a6}}, Y: Field{[10]uint32{0x00fe00f9, 0x00ab2077, 0x03f2067f, 0x035161e3, 0x01241094, 0x01862b94, 0x01c3884e, 0x008ea745, 0x01af8b6f, 0x001b2724}}}, + {X: Field{[10]uint32{0x02399d10, 0x00af2f85, 0x00a67a34, 0x01a2797e, 0x01c18146, 0x0121526b, 0x00ffc148, 0x01827093, 0x000c88fb, 0x003ed7ff}}, Y: Field{[10]uint32{0x00229ab3, 0x011b97ee, 0x00a0946f, 0x02472217, 0x0088cf57, 0x03a4ba5e, 0x03eff328, 0x02532e43, 0x013f9ced, 0x002a6578}}}, + {X: Field{[10]uint32{0x0032097b, 0x0293e812, 0x036b36c7, 0x0251df35, 0x0089565e, 0x00372aa8, 0x03bd1974, 0x027175c5, 0x03c44cc0, 0x0020d4ad}}, Y: Field{[10]uint32{0x010fe6bc, 0x02bdb1df, 0x01e236f8, 0x02ada531, 0x00f91c8f, 0x01dd2b9a, 0x018ca786, 0x0097641d, 0x019800fa, 0x002541f2}}}, + {X: Field{[10]uint32{0x01919f4a, 0x00104561, 0x0140bd82, 0x036d8ab6, 0x015d5ed1, 0x02ec7165, 0x01014d76, 0x009d1b5b, 0x000f273a, 0x0006f997}}, Y: Field{[10]uint32{0x0009a3f2, 0x0368d657, 0x03552da3, 0x00f202c8, 0x00f044e9, 0x03be0eba, 0x01470a83, 0x03e0e68f, 0x03302a38, 0x0036b263}}}, + {X: Field{[10]uint32{0x0358418e, 0x017e6302, 0x003a7ed6, 0x0227afdd, 0x008de14d, 0x03a003d9, 0x0365037a, 0x03889fba, 0x03a52f4b, 0x001c41fc}}, Y: Field{[10]uint32{0x01fca7a4, 0x01a9d29a, 0x00e6069f, 0x03caa857, 0x01927b2d, 0x023bab91, 0x00e429d1, 0x03cc9f45, 0x0009bd1a, 0x002ff3c7}}}, + {X: Field{[10]uint32{0x03312e3e, 0x00125ce5, 0x00cff9dd, 0x03300293, 0x00983389, 0x02c7e766, 0x0254a133, 0x02b96c73, 0x004be8ed, 0x000045ca}}, Y: Field{[10]uint32{0x0212b03d, 0x02d170e0, 0x01539638, 0x01de1b98, 0x0084e3af, 0x0321342e, 0x03519994, 0x03b5262f, 0x001e724f, 0x00247923}}}, + {X: Field{[10]uint32{0x000de54e, 0x02d129ec, 0x015ded31, 0x02db1f99, 0x0041c243, 0x0226d9c5, 0x01f1cd0d, 0x026ad194, 0x02deb1ff, 0x00282361}}, Y: Field{[10]uint32{0x030f0d2f, 0x0098a720, 0x0012c0ec, 0x03530b6f, 0x01a72ed8, 0x01d33252, 0x0364feef, 0x00e7455d, 0x03f6344d, 0x001343f9}}}, + {X: Field{[10]uint32{0x00e8c25f, 0x023b2d69, 0x015503f7, 0x00cf79c4, 0x0098cfc6, 0x02352282, 0x032cbf36, 0x01062bbb, 0x01cedf67, 0x00271130}}, Y: Field{[10]uint32{0x01e743fa, 0x01936f8c, 0x0335f81f, 0x01b79306, 0x03de3d3c, 0x03e61c30, 0x01a959b9, 0x03c258c7, 0x002086d3, 0x000f3688}}}, + {X: Field{[10]uint32{0x0339f149, 0x00ce2c88, 0x02319250, 0x012694ab, 0x00f85979, 0x03c935c5, 0x03118da6, 0x030196ea, 0x00755215, 0x00364cf9}}, Y: Field{[10]uint32{0x00baec45, 0x01f5bf22, 0x01dcb054, 0x00e74bc6, 0x030e277e, 0x012604a1, 0x03abfa60, 0x03c13778, 0x028e313a, 0x0017ec3c}}}, + {X: Field{[10]uint32{0x008a42cb, 0x003c74c6, 0x015ff63c, 0x014d96ab, 0x024c2f9e, 0x03c90ef1, 0x00105289, 0x014cb288, 0x0197ddd0, 0x001ff87c}}, Y: Field{[10]uint32{0x02472af7, 0x0159e3ff, 0x02c7cd3f, 0x02b1ae8a, 0x01a9ec6b, 0x015879d7, 0x03618286, 0x024863b8, 0x033fa186, 0x00204ec4}}}, + {X: Field{[10]uint32{0x0107f79c, 0x02ae54b1, 0x0151a96a, 0x02bacf5d, 0x037ba412, 0x00b71b55, 0x010789c7, 0x008409eb, 0x01218961, 0x0038d5a1}}, Y: Field{[10]uint32{0x023e3a30, 0x01919690, 0x029a8496, 0x00533579, 0x017d8201, 0x0377d351, 0x01fe225e, 0x02a2b2b9, 0x01058e2c, 0x001d9171}}}, + {X: Field{[10]uint32{0x02ebece4, 0x03b3e0ad, 0x0380d146, 0x020ee089, 0x00c667a1, 0x02daa768, 0x02bcefc3, 0x01128aaf, 0x01468a56, 0x00315abf}}, Y: Field{[10]uint32{0x00f1a8d4, 0x018d7e55, 0x01e750cc, 0x005071a4, 0x022915ba, 0x01a19526, 0x03c587cb, 0x00a11227, 0x0255a80e, 0x00279071}}}, + {X: Field{[10]uint32{0x01589345, 0x0347c9a8, 0x02d5600a, 0x023f46af, 0x01440f9f, 0x00257c38, 0x036042e1, 0x02a3c1ce, 0x033960e6, 0x002c90ba}}, Y: Field{[10]uint32{0x036dfde0, 0x00107961, 0x01ca4bb5, 0x02b7a11a, 0x00378579, 0x025bca8d, 0x002decb6, 0x03c280d8, 0x036df063, 0x00251369}}}, + {X: Field{[10]uint32{0x023bb827, 0x01ec41cc, 0x03d42af5, 0x029ad70e, 0x0378f835, 0x0339a1c0, 0x00a43f2f, 0x00b8ba22, 0x01666d2e, 0x000e94bf}}, Y: Field{[10]uint32{0x03af91c7, 0x0136a669, 0x034cc487, 0x035b4390, 0x020096c7, 0x023d3ca7, 0x015cea01, 0x01e9189d, 0x0177a7b3, 0x0004b944}}}, + {X: Field{[10]uint32{0x00d28f53, 0x01deba89, 0x026cf708, 0x03f8259e, 0x034a71c0, 0x0262a31a, 0x03072d25, 0x006b4451, 0x0215c883, 0x002ddf55}}, Y: Field{[10]uint32{0x02bf3132, 0x02318d27, 0x011760d1, 0x030cdaa3, 0x01f5cff2, 0x03de4d81, 0x02df83d5, 0x0299977a, 0x03cfa068, 0x0009756d}}}, + {X: Field{[10]uint32{0x008530dc, 0x0260da70, 0x0214d798, 0x013d3fde, 0x03f23d22, 0x0109aa89, 0x03847288, 0x00d6a14d, 0x003b61e4, 0x00391083}}, Y: Field{[10]uint32{0x00ca8572, 0x034b213b, 0x019a7f7c, 0x02a626c4, 0x029b3c67, 0x01622b65, 0x02bd74e1, 0x0212e66f, 0x00b48579, 0x00108ac1}}}, + {X: Field{[10]uint32{0x030aaaea, 0x00204158, 0x007cecae, 0x011262b4, 0x01236e3c, 0x01853ec0, 0x020fadda, 0x00a678ee, 0x01bfc6ab, 0x002222ff}}, Y: Field{[10]uint32{0x0370eb3c, 0x03d1dccd, 0x03453f06, 0x032761c4, 0x037ada97, 0x006a3d02, 0x00fb94aa, 0x0396018a, 0x013d58cf, 0x0021b9c9}}}, + {X: Field{[10]uint32{0x00ef419c, 0x01310d84, 0x02cce8ef, 0x00b52185, 0x000d850f, 0x004e6059, 0x03de398a, 0x022cc376, 0x018bf7d7, 0x003dd349}}, Y: Field{[10]uint32{0x03029204, 0x029ffc94, 0x02c9dfca, 0x02db5233, 0x0205d60e, 0x02ec4b4c, 0x0332213c, 0x02b7f250, 0x01af1e6d, 0x00344f52}}}, + {X: Field{[10]uint32{0x00da6df0, 0x00504417, 0x00ae0679, 0x0352deb0, 0x0365cea0, 0x006e4895, 0x00097861, 0x00120e9c, 0x029098d6, 0x002a2ccf}}, Y: Field{[10]uint32{0x0121c553, 0x03ced44d, 0x01ddc650, 0x030194b2, 0x021182b6, 0x01bfd1d8, 0x032598e9, 0x0255ec45, 0x038cc08d, 0x00163308}}}, + {X: Field{[10]uint32{0x023ef1ff, 0x0251c286, 0x03cb8969, 0x02d96b84, 0x027a4a6c, 0x01286857, 0x01dbbe3d, 0x03eb6639, 0x01547477, 0x0016be2c}}, Y: Field{[10]uint32{0x016f25bf, 0x012c68df, 0x03672cc8, 0x0056dbbd, 0x033c0a8c, 0x019ba05c, 0x008fac13, 0x0060c8db, 0x0201d0c6, 0x001497b4}}}, + {X: Field{[10]uint32{0x03bec21c, 0x027ca780, 0x030bc811, 0x0196adff, 0x02fa71e6, 0x037e198a, 0x01143833, 0x01712887, 0x00546d4c, 0x00005571}}, Y: Field{[10]uint32{0x00411aae, 0x0259afd4, 0x036d0378, 0x020bb7bf, 0x03638422, 0x03f5c91f, 0x00eaefe8, 0x00461737, 0x03672f64, 0x00083a67}}}, + {X: Field{[10]uint32{0x0025a56e, 0x0019831d, 0x01473101, 0x00319ce3, 0x00c8fd7f, 0x02998ddc, 0x0022aea5, 0x00b59b9f, 0x0186ee18, 0x0014e461}}, Y: Field{[10]uint32{0x0056152e, 0x01636746, 0x0052fabc, 0x01e9c848, 0x00cdbf72, 0x01c2e249, 0x02564a1e, 0x03b075f8, 0x00923052, 0x0031ffa8}}}, + {X: Field{[10]uint32{0x03ad6414, 0x0262ee8e, 0x00d4f679, 0x03ca356b, 0x01cc52d7, 0x01dd03d3, 0x0004abba, 0x02dc59d2, 0x01d9a0fa, 0x003de593}}, Y: Field{[10]uint32{0x01f62c59, 0x02b20d22, 0x03ccb31c, 0x008bc6ef, 0x02d469a1, 0x03b04779, 0x03dc5c2a, 0x03d8339e, 0x0364aba0, 0x001aa627}}}, + {X: Field{[10]uint32{0x01663183, 0x0167b6f3, 0x0258e720, 0x038ad6c5, 0x02ffd72e, 0x00c9f1bb, 0x000a909b, 0x03cb79e2, 0x008af514, 0x001d0723}}, Y: Field{[10]uint32{0x0087b2ae, 0x00915129, 0x01b49012, 0x00c7edbf, 0x02e40b6b, 0x022bf9cd, 0x013532d4, 0x00518371, 0x036de5de, 0x003cd749}}}, + {X: Field{[10]uint32{0x0347945a, 0x03e20d62, 0x037e9b2e, 0x03c4c485, 0x02606e55, 0x01bbd3c8, 0x02ea9f12, 0x028a2bf1, 0x01bf6cc2, 0x0037a31a}}, Y: Field{[10]uint32{0x00a48a02, 0x017292d0, 0x0052c8b8, 0x0108ec72, 0x0270d847, 0x013fdc19, 0x00e2fecb, 0x035851e0, 0x00536900, 0x0023798a}}}, + {X: Field{[10]uint32{0x0357c537, 0x0163a8db, 0x006afcd0, 0x03f66a11, 0x01d6a8d5, 0x00f7404d, 0x02523b2d, 0x02d07362, 0x0339619b, 0x0020785b}}, Y: Field{[10]uint32{0x03f4b31e, 0x0170996e, 0x0032f239, 0x0135f6eb, 0x00375c43, 0x01477bb1, 0x006de9b9, 0x03b32b45, 0x00737cd2, 0x0019e1bf}}}, + {X: Field{[10]uint32{0x026f988d, 0x008eab9e, 0x01a20f01, 0x00122ac8, 0x02e70f7f, 0x01c96cc2, 0x01625b8a, 0x02c8ba31, 0x0189d079, 0x001167a5}}, Y: Field{[10]uint32{0x03f38e08, 0x01fa310c, 0x0112ee76, 0x0069155d, 0x00915de2, 0x030d41b3, 0x02d26acc, 0x028a4b12, 0x02935b71, 0x00295bb7}}}, + {X: Field{[10]uint32{0x028ebddd, 0x013ce161, 0x03758228, 0x014746ae, 0x01f2e5bb, 0x01c2d3ab, 0x0018806a, 0x029ffc82, 0x03554fab, 0x002c1e75}}, Y: Field{[10]uint32{0x0274dffe, 0x016dc07f, 0x001dcfcf, 0x03115d18, 0x0120b6c0, 0x0390d3ea, 0x00f65773, 0x005d2c84, 0x002d552f, 0x00125777}}}, + {X: Field{[10]uint32{0x034f288b, 0x02af4b19, 0x00100569, 0x005cfc17, 0x00bb30af, 0x0356c42d, 0x0180de1d, 0x03ec8505, 0x03bb5983, 0x001d4e46}}, Y: Field{[10]uint32{0x02958d67, 0x0292bdf7, 0x0080db58, 0x00d347c7, 0x02b319f5, 0x004d694a, 0x026032f2, 0x012ae7ad, 0x02bac915, 0x0015f1e9}}}, + {X: Field{[10]uint32{0x01524db4, 0x02784d90, 0x03e7d5a8, 0x03dccbf2, 0x035bda94, 0x013f1a47, 0x0061069e, 0x023dd7f1, 0x0157f284, 0x001c50da}}, Y: Field{[10]uint32{0x033f0007, 0x014476f7, 0x0224fe92, 0x016973bc, 0x0195658a, 0x006e4f20, 0x022813c5, 0x02b75596, 0x0052ef4f, 0x0004a1fe}}}, + {X: Field{[10]uint32{0x01543f9c, 0x03263c50, 0x037853b7, 0x01adc9e7, 0x0094ad07, 0x00965c3b, 0x00c74c9e, 0x03425c37, 0x0333fa75, 0x002e40e2}}, Y: Field{[10]uint32{0x03cf838e, 0x01c2ac36, 0x02660734, 0x03cf5bd9, 0x02af59ce, 0x038e7235, 0x03c1bf48, 0x017b40fe, 0x01696929, 0x0028a30c}}}, + {X: Field{[10]uint32{0x01f86196, 0x022bc5e9, 0x034b083b, 0x02e759f0, 0x03f259bd, 0x01b6f832, 0x00664e63, 0x036403ef, 0x0028a9fb, 0x002cb18f}}, Y: Field{[10]uint32{0x0149ebdd, 0x0040fbb3, 0x012b0ee7, 0x008dbd70, 0x01b79207, 0x02544329, 0x03084218, 0x018f119c, 0x00fc069c, 0x002a3c14}}}, + {X: Field{[10]uint32{0x0017f39c, 0x00b31e89, 0x0128a5c9, 0x011bce3a, 0x01d06bf3, 0x03edf1e1, 0x027edfad, 0x008657d2, 0x01bea32b, 0x003374a9}}, Y: Field{[10]uint32{0x03fa621b, 0x02b775ad, 0x01f04d2d, 0x01320e0a, 0x02213386, 0x00ace02b, 0x0203ee72, 0x0070d80c, 0x0278ac42, 0x0002ad9b}}}, + {X: Field{[10]uint32{0x033db80f, 0x033e9867, 0x01c39780, 0x0031c93e, 0x01a27d74, 0x0220e3b1, 0x02f03a82, 0x029cdeb3, 0x0064b079, 0x00209742}}, Y: Field{[10]uint32{0x021071d3, 0x01c866d1, 0x02b43a87, 0x02b6f0b8, 0x01c2154f, 0x03817ae9, 0x027e427f, 0x011299fc, 0x00b7749e, 0x002fcfba}}}, + {X: Field{[10]uint32{0x035e24c7, 0x02e243ef, 0x02218608, 0x01dfc2c3, 0x01d0c364, 0x027d338f, 0x02930a87, 0x03d00b25, 0x023cbf6b, 0x000dede7}}, Y: Field{[10]uint32{0x00f66f1d, 0x016b40c4, 0x02e29204, 0x02cbdec3, 0x00c32a5b, 0x0084f0bc, 0x010ff4c9, 0x018c2e82, 0x02c7cec5, 0x00365c50}}}, + {X: Field{[10]uint32{0x012b6135, 0x008b0cd5, 0x039d8aed, 0x003beec1, 0x0389560b, 0x02d14baf, 0x01105bf5, 0x029d7502, 0x02d0678e, 0x003ee992}}, Y: Field{[10]uint32{0x011f938c, 0x00f02c83, 0x03e3bdf6, 0x0065f5b6, 0x035c628f, 0x02a01ab5, 0x01dd8441, 0x00dea2a1, 0x022de4e6, 0x0039994d}}}, + {X: Field{[10]uint32{0x00d9cf72, 0x028fe5fb, 0x027a859e, 0x0034610c, 0x03d3bd49, 0x021311db, 0x004897de, 0x034dbe76, 0x038e077e, 0x001d9e1e}}, Y: Field{[10]uint32{0x0180a9b3, 0x0336508e, 0x00158210, 0x022ccf59, 0x00e3ba22, 0x0075e37f, 0x0126011d, 0x00e30f30, 0x03141a3f, 0x00033de7}}}, + {X: Field{[10]uint32{0x00157b31, 0x00694340, 0x03e8a369, 0x02790be7, 0x01f16a12, 0x01986954, 0x026ba1c5, 0x028cd217, 0x01d0ffb3, 0x0009aeaf}}, Y: Field{[10]uint32{0x002c530d, 0x0101cb63, 0x008eee4c, 0x01c49fb7, 0x02e66a6c, 0x0080dc2c, 0x0266e33a, 0x00691bed, 0x02e2b1cf, 0x0006ce92}}}, + {X: Field{[10]uint32{0x0376307a, 0x000c75a7, 0x02008c1b, 0x03c8d811, 0x007ca4d3, 0x01dca7ca, 0x02aa8640, 0x0287a5e9, 0x03b77a2f, 0x00056bb6}}, Y: Field{[10]uint32{0x03073649, 0x033f65bf, 0x00788a6d, 0x01e14d53, 0x03f94088, 0x03017cda, 0x01746439, 0x008d81a9, 0x0142bf8b, 0x000cd0a8}}}, + {X: Field{[10]uint32{0x026fe467, 0x0003d5d1, 0x01fb3de1, 0x02837f79, 0x01c2b072, 0x01bbd330, 0x00d5767c, 0x03353f7d, 0x00a39bb7, 0x00263b38}}, Y: Field{[10]uint32{0x03227e28, 0x03d18faa, 0x02bba6f4, 0x00a5a829, 0x021e679d, 0x00e555b1, 0x0029d0f8, 0x024f9fae, 0x00a8218c, 0x00313a49}}}, + {X: Field{[10]uint32{0x03f373a9, 0x026daa0f, 0x03304198, 0x028becc8, 0x018a48cd, 0x0019eedc, 0x01ffafab, 0x00fbb533, 0x0105fc21, 0x001f619d}}, Y: Field{[10]uint32{0x0097d47c, 0x027bdd5f, 0x00c1b919, 0x03e233a8, 0x0096e167, 0x01290053, 0x03c417ef, 0x0081e065, 0x03f03c21, 0x00177d47}}}, + {X: Field{[10]uint32{0x01b3001f, 0x02dce8a5, 0x0117f410, 0x012275db, 0x02bf269a, 0x02c03578, 0x03ece8b7, 0x02387ef8, 0x01d74357, 0x003c93c6}}, Y: Field{[10]uint32{0x0223631f, 0x014d89c1, 0x0020d53e, 0x011d4520, 0x0116d2b5, 0x00d3d31e, 0x0048bbbb, 0x022d99ec, 0x03ff5544, 0x00191290}}}, + {X: Field{[10]uint32{0x000efd59, 0x0374ef20, 0x0227b923, 0x007480e6, 0x021fd106, 0x0352fa88, 0x0111281e, 0x00a5b87a, 0x03045c22, 0x0024e14c}}, Y: Field{[10]uint32{0x03eb7040, 0x03f9a662, 0x011628c2, 0x0087a7eb, 0x022607da, 0x01332417, 0x0399bbfe, 0x00b4543d, 0x00f600cd, 0x0008a623}}}, + {X: Field{[10]uint32{0x02319743, 0x014c7251, 0x01f0daf1, 0x03b2625f, 0x01b91ff4, 0x039349a1, 0x03b14ee8, 0x013c5894, 0x03053983, 0x003c2431}}, Y: Field{[10]uint32{0x000bd522, 0x0160d04a, 0x02d2abf1, 0x02326bce, 0x0228c59c, 0x014e80ad, 0x0208391f, 0x009c76a2, 0x00851d30, 0x003045c6}}}, + {X: Field{[10]uint32{0x02a78c6e, 0x01b34fbf, 0x038e67fb, 0x0022a401, 0x000df9bb, 0x00aa3abf, 0x00234aeb, 0x03cedd28, 0x00ecab5b, 0x0003a3f2}}, Y: Field{[10]uint32{0x02ddabe5, 0x001eca09, 0x035c29b0, 0x002d2439, 0x01a8397c, 0x018b829d, 0x02fcd713, 0x026edd1b, 0x016534ce, 0x00002c20}}}, + {X: Field{[10]uint32{0x03126785, 0x02835c67, 0x03aa09b0, 0x02eb200c, 0x03c7426d, 0x012bcdf8, 0x003cef69, 0x010f9cc0, 0x00d187cb, 0x00118963}}, Y: Field{[10]uint32{0x01ad4fc4, 0x02b48dd5, 0x006d4601, 0x02fdc20b, 0x0175576e, 0x030da608, 0x00dd82e2, 0x002089d9, 0x01a75f06, 0x00211850}}}, + {X: Field{[10]uint32{0x00a3e430, 0x02fb9ab3, 0x037a1e65, 0x03cd17e6, 0x0394109b, 0x010cd042, 0x01d27c3f, 0x021fbd4a, 0x033bdb38, 0x0039fce2}}, Y: Field{[10]uint32{0x02cd589f, 0x02b0d24a, 0x00f8109f, 0x02deb6f2, 0x00ab1faf, 0x02c1fa2b, 0x02dec0c0, 0x031c0a42, 0x00f15eae, 0x003d4910}}}, + {X: Field{[10]uint32{0x03537aec, 0x02c0e94b, 0x0062eda5, 0x019fdcff, 0x02fa9a01, 0x007d5a76, 0x03d5b750, 0x01e635d7, 0x00331472, 0x000b4a7a}}, Y: Field{[10]uint32{0x012d2be6, 0x025dba5e, 0x00001d18, 0x017d688c, 0x03d9e2f5, 0x00164d80, 0x03c58cfc, 0x02e7ea85, 0x011ab117, 0x0014b4f7}}}, + {X: Field{[10]uint32{0x0091ffb6, 0x025f470e, 0x03c7c8ac, 0x0291be50, 0x00f47609, 0x01d54b76, 0x03b44c9c, 0x029edddf, 0x009cabf7, 0x0028ecbb}}, Y: Field{[10]uint32{0x00fc19de, 0x0272efcf, 0x03417d55, 0x01856c06, 0x024d5280, 0x00a96b59, 0x00933852, 0x00e07d4c, 0x0070f091, 0x001b38e3}}}, + {X: Field{[10]uint32{0x0100f473, 0x03d974cc, 0x03015a21, 0x01896150, 0x026cefe7, 0x02cf46a3, 0x02504dda, 0x0295b039, 0x001e7582, 0x002bf2cf}}, Y: Field{[10]uint32{0x03171af8, 0x029db1a2, 0x004a38e5, 0x021d5ecb, 0x0367edbd, 0x03864c40, 0x02afc618, 0x02126629, 0x039dfbeb, 0x001aebc7}}}, + {X: Field{[10]uint32{0x010e2ac8, 0x00d58976, 0x006eccdd, 0x0129242e, 0x026650f7, 0x0119aa30, 0x022bbea9, 0x02559efd, 0x0212dc89, 0x00222cbc}}, Y: Field{[10]uint32{0x018c30a5, 0x01629934, 0x0208e7e4, 0x010b6652, 0x026ecd6c, 0x0285c8f8, 0x036d4f5d, 0x0054ff5f, 0x017bdef6, 0x001cff5d}}}, + {X: Field{[10]uint32{0x01adef3c, 0x02646f87, 0x000d493d, 0x01157125, 0x03395c59, 0x0369a8a9, 0x01c971d7, 0x00a45994, 0x029f4ca3, 0x0002ff7a}}, Y: Field{[10]uint32{0x01bc20d8, 0x02d93608, 0x00a17578, 0x01947db5, 0x004166bc, 0x02e01df3, 0x000adea5, 0x03da1108, 0x00447ef3, 0x00209d1c}}}, + {X: Field{[10]uint32{0x00973ae5, 0x00d91fb9, 0x0265b521, 0x0298f593, 0x00e8fdf6, 0x01247b3c, 0x012e3869, 0x0175a729, 0x0381aa76, 0x00175172}}, Y: Field{[10]uint32{0x03d019db, 0x03e0ac4b, 0x022bdb17, 0x03f8f2be, 0x00fdab36, 0x0040e9f7, 0x03517e7c, 0x01b5dddc, 0x032b51a7, 0x00292928}}}, + {X: Field{[10]uint32{0x02e7109d, 0x0019d4de, 0x033ae87d, 0x0249174b, 0x036d6fe0, 0x0310f976, 0x034fa531, 0x026652a8, 0x03cee14e, 0x003ce940}}, Y: Field{[10]uint32{0x03ec49e8, 0x0157957c, 0x01785ac5, 0x02e81cc9, 0x03568aa5, 0x006546d8, 0x0322daad, 0x0142d081, 0x00c0a24d, 0x000ac5c5}}}, + {X: Field{[10]uint32{0x00cbeeb5, 0x01ab78e2, 0x012d9b66, 0x014cdf47, 0x02042619, 0x02e39ae2, 0x00c225ea, 0x00bb4915, 0x036d6f81, 0x002530e9}}, Y: Field{[10]uint32{0x03a953e3, 0x0358e87b, 0x0104cbc8, 0x03eb59b8, 0x023d1351, 0x02fc6062, 0x00893b95, 0x019d1b75, 0x02e6aa40, 0x002ee273}}}, + {X: Field{[10]uint32{0x00f4c050, 0x0242323c, 0x02a3cc0c, 0x03446077, 0x01b9a2d3, 0x007f696f, 0x015a6625, 0x00900ce7, 0x02810523, 0x0008f6ff}}, Y: Field{[10]uint32{0x01eae6b2, 0x016e12d3, 0x036794e4, 0x0267502a, 0x00b5c168, 0x01e7b439, 0x00f8385c, 0x0043bd22, 0x0271229f, 0x0032bbce}}}, + {X: Field{[10]uint32{0x00bbf1d2, 0x00a7b1ab, 0x03b88e46, 0x03286d2e, 0x01d2dcbe, 0x015e4d7d, 0x01dc69dc, 0x02186704, 0x03d120ef, 0x000e41f8}}, Y: Field{[10]uint32{0x0015e853, 0x02611185, 0x00055ba2, 0x02f16288, 0x00e6aad1, 0x0324da11, 0x017b0a60, 0x00ae7730, 0x02b7d74e, 0x0010e3e5}}}, + {X: Field{[10]uint32{0x032b7d9c, 0x03c17859, 0x00b710e6, 0x012ccde2, 0x01651c94, 0x0101fd64, 0x02a6a373, 0x0013f602, 0x03193eeb, 0x00030502}}, Y: Field{[10]uint32{0x01e44072, 0x001dee4a, 0x02e641f7, 0x03bd0c34, 0x03899450, 0x001d8ed8, 0x01fef6b7, 0x01150e75, 0x011559e2, 0x002526ff}}}, + {X: Field{[10]uint32{0x032ea56c, 0x02951f83, 0x028d1740, 0x02dac1b8, 0x002563c3, 0x00c3dd79, 0x012fe269, 0x00e72077, 0x005bc96a, 0x0025df3c}}, Y: Field{[10]uint32{0x02a10d52, 0x03039ae6, 0x02dc0e70, 0x01e0daa7, 0x0307e158, 0x01b291a2, 0x0295e234, 0x005930db, 0x023a8508, 0x0000e00b}}}, + {X: Field{[10]uint32{0x00a034e3, 0x009ec836, 0x003761e8, 0x02ce7b8f, 0x02795a7b, 0x039395fd, 0x0151e5a9, 0x0383532b, 0x00d63995, 0x00041a70}}, Y: Field{[10]uint32{0x027fe33b, 0x03065316, 0x028041d2, 0x02b1e23f, 0x0047963a, 0x02aed792, 0x01d89c47, 0x01319560, 0x00879c0e, 0x00386a85}}}, + {X: Field{[10]uint32{0x013e3682, 0x02096cf2, 0x0245bba3, 0x03d4d49e, 0x0142419a, 0x0138a9d5, 0x03ab10c7, 0x010607fc, 0x0280c341, 0x003fde31}}, Y: Field{[10]uint32{0x00d3615e, 0x0128dd89, 0x0256e1fc, 0x01d37cbc, 0x0186c8c5, 0x002cb6fb, 0x032382e2, 0x0243cdda, 0x02dbf053, 0x003badc2}}}, + {X: Field{[10]uint32{0x02bcddc7, 0x01abf661, 0x03d05905, 0x01af570d, 0x002b0cb2, 0x020e29a8, 0x004c3ff5, 0x00f5aa70, 0x03033acd, 0x0017b27a}}, Y: Field{[10]uint32{0x032aff03, 0x0099d25c, 0x01c8b9ae, 0x02d230ea, 0x03e39d92, 0x03651170, 0x000bed1e, 0x0037c05f, 0x03f60eed, 0x0024a8a1}}}, + {X: Field{[10]uint32{0x031b37d1, 0x0363b211, 0x03ee9339, 0x01369f71, 0x00bef0a5, 0x0236f1fa, 0x0267e14d, 0x034d2dfb, 0x02ba792d, 0x003aa881}}, Y: Field{[10]uint32{0x011ee92e, 0x0041f1a3, 0x025e2695, 0x008475e3, 0x0355e00d, 0x01030585, 0x02f2530c, 0x027281ff, 0x025ebe71, 0x00155df9}}}, + {X: Field{[10]uint32{0x00eb3ed7, 0x014abf43, 0x03f54af9, 0x023b4f61, 0x02689ef0, 0x01573be8, 0x036789d4, 0x0004a8f5, 0x02f56034, 0x0009b418}}, Y: Field{[10]uint32{0x01323424, 0x02d60db4, 0x011094e7, 0x02896b3a, 0x01dbe6fa, 0x00347db7, 0x00340c5f, 0x0161de67, 0x01acef6f, 0x0017bfc7}}}, + {X: Field{[10]uint32{0x02602d48, 0x03c89c47, 0x03bd1492, 0x03e70d06, 0x021a2413, 0x0047b6a3, 0x009e449d, 0x02d8a93d, 0x015ae50d, 0x00200350}}, Y: Field{[10]uint32{0x0002eb50, 0x0255fd5f, 0x036fbdc5, 0x0039d580, 0x03d5c8cb, 0x0344b67c, 0x019ec5cf, 0x026d748a, 0x016d05d1, 0x0015a72b}}}, + {X: Field{[10]uint32{0x009a1c90, 0x00f189e7, 0x006bb985, 0x02f83e16, 0x02e1531f, 0x0068859d, 0x03aaca5f, 0x0370665c, 0x0352bc16, 0x001b0068}}, Y: Field{[10]uint32{0x00cc04e7, 0x01cec63e, 0x027654c0, 0x034b5935, 0x01a39a17, 0x0095204e, 0x027226ab, 0x01a83c9d, 0x0342c959, 0x0020cf75}}}, + {X: Field{[10]uint32{0x03742c26, 0x01390c4d, 0x038e80a5, 0x02e3423b, 0x01f0b914, 0x01ce346b, 0x00e7c4d4, 0x03fc3141, 0x0122f1b3, 0x000eb332}}, Y: Field{[10]uint32{0x03cb0ad7, 0x0026b2c0, 0x00b1786a, 0x00620b84, 0x0152a2d1, 0x014aca5e, 0x00dee26c, 0x002cd0c1, 0x008327d6, 0x002aa735}}}, + {X: Field{[10]uint32{0x00f8ec72, 0x01c3fc74, 0x03edf2ec, 0x0307b9ba, 0x02f8d978, 0x03e398d4, 0x0380f753, 0x01cfc828, 0x0072828b, 0x002837d7}}, Y: Field{[10]uint32{0x00ac6670, 0x01ea27e9, 0x0230680d, 0x02dbac3b, 0x02b1327d, 0x01e79c8c, 0x02226893, 0x02f44c79, 0x01bef1e0, 0x002c8c2b}}}, + {X: Field{[10]uint32{0x03b52c73, 0x015ee5cc, 0x005a449d, 0x01c34ffe, 0x02d4bbc9, 0x01521971, 0x03a8dbbd, 0x03b26181, 0x01949776, 0x002757c3}}, Y: Field{[10]uint32{0x00afc1a8, 0x03a83c80, 0x02cf202c, 0x0055f446, 0x01ad7faf, 0x03d834d1, 0x038a056f, 0x00eb7552, 0x03baf489, 0x003fc23b}}}, + {X: Field{[10]uint32{0x01d3d84e, 0x03c8421b, 0x00917fb7, 0x02d699ce, 0x00228f54, 0x022947b2, 0x025b2935, 0x0208bb7a, 0x012d9ea1, 0x0037bd76}}, Y: Field{[10]uint32{0x008b3129, 0x01667b80, 0x0307a479, 0x002b5f00, 0x039d5bc2, 0x000affcd, 0x00d3ad02, 0x03af0c4e, 0x000db94a, 0x0002db1d}}}, + {X: Field{[10]uint32{0x00df33de, 0x010b9961, 0x03832736, 0x03c6e9ba, 0x03643fb0, 0x03d341d7, 0x007136c0, 0x035d38fe, 0x0105cdc8, 0x003ea42c}}, Y: Field{[10]uint32{0x00bba36d, 0x01e77a94, 0x00c273c0, 0x02494989, 0x003a180d, 0x003c3891, 0x029e852f, 0x023ae927, 0x00c373f5, 0x000f9aca}}}, + {X: Field{[10]uint32{0x03d0eb52, 0x02e33468, 0x02349575, 0x02ca5c1a, 0x01ce077c, 0x0353677e, 0x01c84613, 0x01ee4300, 0x0021ff2f, 0x002084ba}}, Y: Field{[10]uint32{0x003185f0, 0x0390ffdc, 0x02b5b8f8, 0x03b4b22b, 0x01d24bb5, 0x00d5018e, 0x0256e8f3, 0x039d5bf6, 0x01db2fa3, 0x00356701}}}, + {X: Field{[10]uint32{0x0061220d, 0x0362c83b, 0x00e49f9c, 0x02dcabed, 0x0124f155, 0x00074579, 0x01a641e1, 0x01c75d2c, 0x00c81d1f, 0x003b8d03}}, Y: Field{[10]uint32{0x02286f37, 0x020ce0ab, 0x01438f00, 0x007bd604, 0x0086f814, 0x02a3a2c1, 0x02fa7964, 0x017f5fc7, 0x033f2535, 0x00245760}}}, + {X: Field{[10]uint32{0x002afee1, 0x009bd951, 0x026b50aa, 0x0025fe0d, 0x02302b50, 0x02dc88f8, 0x00b257fb, 0x00f60dd0, 0x0125dd2e, 0x000b14d5}}, Y: Field{[10]uint32{0x021cf765, 0x01c9c4ed, 0x03947672, 0x01e5fdcf, 0x0292d43a, 0x03ced500, 0x038f9662, 0x02d9a13c, 0x014ef945, 0x00073514}}}, + {X: Field{[10]uint32{0x0267d94d, 0x026b517e, 0x00f2baae, 0x0075ba05, 0x03404b9e, 0x00a97e5d, 0x00a9083a, 0x028a233d, 0x03cf8b57, 0x0037ddd8}}, Y: Field{[10]uint32{0x01580ce2, 0x030ceb2c, 0x0309cb4f, 0x01706a49, 0x01bf0529, 0x00e23ba7, 0x02276bdd, 0x02d23184, 0x033631fd, 0x0013df70}}}, + {X: Field{[10]uint32{0x00dcee60, 0x0049a83b, 0x00da18fd, 0x023d3579, 0x038ff99b, 0x0335b418, 0x0374b928, 0x03c86044, 0x0240d6d0, 0x000d4530}}, Y: Field{[10]uint32{0x0197fca2, 0x00297190, 0x035cee53, 0x02c9c825, 0x02ac17ab, 0x01ddfb46, 0x018421c7, 0x02be00f2, 0x034a1a1b, 0x000a8347}}}, + {X: Field{[10]uint32{0x02e40a27, 0x012f4f1a, 0x0360a0b5, 0x016364d7, 0x00237a1b, 0x02d50755, 0x01de551a, 0x032e0653, 0x01d9e58b, 0x0000f79d}}, Y: Field{[10]uint32{0x01d97c75, 0x02cae349, 0x03ddc455, 0x036bf756, 0x033ec422, 0x01bc940d, 0x03ad8c48, 0x02c1631a, 0x00dbbe2d, 0x0026b685}}}, + {X: Field{[10]uint32{0x01e0420f, 0x0228229b, 0x005ddae2, 0x014bd40b, 0x0290ad3d, 0x0357ac70, 0x00144f81, 0x00d56f17, 0x020b1804, 0x0029ca33}}, Y: Field{[10]uint32{0x03ddad3d, 0x00f40051, 0x004f7ac9, 0x02e7b0cd, 0x0142cce3, 0x0215247f, 0x034893fa, 0x0146833e, 0x00a8f72b, 0x0010e1f3}}}, + {X: Field{[10]uint32{0x0151c39b, 0x00761d15, 0x0032e16c, 0x02aeaa50, 0x011d8234, 0x0140ea05, 0x03b22e02, 0x01130251, 0x028a05b8, 0x003b0f26}}, Y: Field{[10]uint32{0x02bd7fa6, 0x01790423, 0x03043382, 0x033ba0da, 0x00c8ac51, 0x013b7eba, 0x00845ca4, 0x03ea4d98, 0x00ef45f0, 0x001ec22f}}}, + {X: Field{[10]uint32{0x024761db, 0x023b1568, 0x02e9326a, 0x0333a61c, 0x03e619e7, 0x005d4cb3, 0x02b7e6c6, 0x016b2cee, 0x01562494, 0x002c05cf}}, Y: Field{[10]uint32{0x01f1b381, 0x0246b8c1, 0x0310d445, 0x03cc4c83, 0x0172a81d, 0x026372c4, 0x03eff121, 0x001d8743, 0x035f3e9a, 0x001e349e}}}, + {X: Field{[10]uint32{0x00cd73f6, 0x03658010, 0x023a7970, 0x0047e565, 0x034e04bd, 0x034e92e3, 0x03c3890e, 0x03722e5d, 0x03f3cd43, 0x00367ace}}, Y: Field{[10]uint32{0x03b23044, 0x016cbf58, 0x01c41e7f, 0x039326da, 0x000510b9, 0x02314012, 0x01db7189, 0x020228fc, 0x035cc42e, 0x0026065a}}}, + {X: Field{[10]uint32{0x01a84e74, 0x01530219, 0x03f107ca, 0x02c07009, 0x0029bbf1, 0x007e4ace, 0x02026062, 0x008c2b1d, 0x01af8a40, 0x003ef694}}, Y: Field{[10]uint32{0x00d6ccf5, 0x00944eff, 0x03c71e81, 0x02e8eef9, 0x038fd427, 0x024043f2, 0x00729e4e, 0x00ef5532, 0x0194aa45, 0x001920ce}}}, + {X: Field{[10]uint32{0x02583f9d, 0x03e1cbee, 0x02cf808a, 0x0317c14c, 0x03472b14, 0x00498beb, 0x01646616, 0x0065983d, 0x01a751be, 0x0002b92e}}, Y: Field{[10]uint32{0x0295ee5e, 0x019cb925, 0x02281f4b, 0x01e3693e, 0x03e2bd40, 0x02b4ead7, 0x00c6eed9, 0x01f969bc, 0x008baa9d, 0x0022cb09}}}, + {X: Field{[10]uint32{0x00cf6ff5, 0x02db8313, 0x036dda40, 0x0380c7b7, 0x00f29764, 0x0118a117, 0x028c6a2e, 0x02009859, 0x01520608, 0x00160100}}, Y: Field{[10]uint32{0x03329485, 0x0069c076, 0x030cd5fb, 0x023ffb41, 0x00a2e5f8, 0x00e65db6, 0x032f9a4e, 0x03013681, 0x02e64a83, 0x0034be5a}}}, + {X: Field{[10]uint32{0x007e029e, 0x029cc993, 0x0203b57c, 0x0098711a, 0x03cf477e, 0x02bf3d1f, 0x01abbd9f, 0x003e058e, 0x02865738, 0x00130a35}}, Y: Field{[10]uint32{0x00ed8a70, 0x02c09383, 0x0202259f, 0x01045436, 0x023122a9, 0x02b3eb05, 0x02a67e80, 0x01785015, 0x029c4fa7, 0x001a52e2}}}, + {X: Field{[10]uint32{0x0325c9a4, 0x016a4b3f, 0x026b9046, 0x01ddc5e6, 0x016984fc, 0x03601be0, 0x03b51a73, 0x01561fc8, 0x02b39e00, 0x00378816}}, Y: Field{[10]uint32{0x01273d83, 0x0170c9f1, 0x011355af, 0x010a6bb2, 0x0048f68e, 0x03ab304b, 0x002cf1f0, 0x03070b6d, 0x025e12ef, 0x003b610c}}}, + {X: Field{[10]uint32{0x014273f4, 0x031ada56, 0x025f1b3e, 0x0225b48a, 0x01b968f5, 0x0087995c, 0x0258dd57, 0x02c29d2d, 0x00680c2c, 0x0017aa0a}}, Y: Field{[10]uint32{0x004a9499, 0x008df48e, 0x038ad6e2, 0x00e40794, 0x00e18285, 0x00dbdb16, 0x02decce6, 0x0193e04e, 0x02b08db2, 0x00223443}}}, + {X: Field{[10]uint32{0x024998ba, 0x00b40d8c, 0x03c9c37f, 0x011b5ee6, 0x03c3b0dd, 0x038f6d39, 0x00bd98a3, 0x01d05908, 0x03c86449, 0x0006273d}}, Y: Field{[10]uint32{0x02daa083, 0x00960087, 0x03da204d, 0x0235c8fd, 0x01742211, 0x01f7581b, 0x0201b1cf, 0x03fca0d9, 0x01ced46d, 0x002ecd02}}}, + {X: Field{[10]uint32{0x0082789f, 0x014dbe6f, 0x0214d3cf, 0x035e3b97, 0x013c3c41, 0x02040091, 0x00680265, 0x00350c22, 0x018738f5, 0x001c285c}}, Y: Field{[10]uint32{0x0027c1d6, 0x0118b5ef, 0x022962b9, 0x0116a7cd, 0x02101dc4, 0x023c2747, 0x03338701, 0x014df907, 0x0120e112, 0x00057254}}}, + {X: Field{[10]uint32{0x03b3a368, 0x011ae6c3, 0x03865cff, 0x02a91a0c, 0x018e4271, 0x00c04421, 0x0020eedf, 0x036db823, 0x00ff622a, 0x0015e2b0}}, Y: Field{[10]uint32{0x03d7f851, 0x007296ee, 0x0215f1f0, 0x03d4759f, 0x026b0cea, 0x03542062, 0x01b2f7d9, 0x005cb4ae, 0x01ddf5f3, 0x003dc468}}}, + {X: Field{[10]uint32{0x01840071, 0x02c178a3, 0x01aea3e3, 0x01dfe9b3, 0x035887f1, 0x0373a296, 0x00738bad, 0x029d1f59, 0x0003476a, 0x003727ef}}, Y: Field{[10]uint32{0x01eee1b4, 0x03c293a2, 0x03ab9515, 0x01d33d39, 0x008bd267, 0x00a53954, 0x0194a19d, 0x037497e3, 0x012c8087, 0x00303d9d}}}, + {X: Field{[10]uint32{0x03b0294d, 0x02548551, 0x0178fe02, 0x0371165b, 0x014bb817, 0x00f5cc54, 0x004dec0b, 0x03357cba, 0x00ffa348, 0x0025d26b}}, Y: Field{[10]uint32{0x0381a1c6, 0x03a13815, 0x0116723d, 0x03265140, 0x03d89856, 0x0039f480, 0x02ec20be, 0x0120436b, 0x01ea35e5, 0x0037d99f}}}, + {X: Field{[10]uint32{0x02657d85, 0x034d0f8c, 0x032e8e92, 0x02635ac4, 0x00ae8e7a, 0x02a0551e, 0x0359f21f, 0x01cc370c, 0x01cf2fd2, 0x0038e7ef}}, Y: Field{[10]uint32{0x01b5e01c, 0x001ac2f9, 0x0028320a, 0x01e230c7, 0x02624415, 0x01922168, 0x026ae3e3, 0x021659da, 0x008170a7, 0x002ebfa6}}}, + {X: Field{[10]uint32{0x01402c09, 0x02ae2fe4, 0x02b89e0f, 0x00a83a8c, 0x02e04b69, 0x03244d45, 0x000bda4d, 0x00dc4830, 0x014e27f1, 0x00180240}}, Y: Field{[10]uint32{0x02359f6b, 0x01826750, 0x032e5708, 0x02a1b3b0, 0x01eb4006, 0x0376e998, 0x0396f588, 0x00734b2d, 0x0094f6bd, 0x000d2442}}}, + {X: Field{[10]uint32{0x03f2f773, 0x025223a1, 0x02162d41, 0x00b50d88, 0x03b644c9, 0x01dacfbb, 0x039bec4f, 0x011b60be, 0x0247d02e, 0x002fc13c}}, Y: Field{[10]uint32{0x002172f6, 0x0073af1f, 0x0284d32b, 0x016f07b5, 0x00302e12, 0x019d38d5, 0x019ab004, 0x00b9303c, 0x00e8bb3c, 0x003591bd}}}, + {X: Field{[10]uint32{0x01e5e3c3, 0x0137ea8c, 0x01acff5b, 0x02af0c3a, 0x013e5468, 0x00571b66, 0x0071efd9, 0x02cd4e16, 0x03ecb122, 0x0025827d}}, Y: Field{[10]uint32{0x008f9a27, 0x02d43766, 0x015925d6, 0x03e7bae5, 0x01ebb4d9, 0x0138ab62, 0x0178ac77, 0x03c2e1c5, 0x012eb933, 0x00041af1}}}, + {X: Field{[10]uint32{0x03ab9abe, 0x00ab5882, 0x033668da, 0x007537b1, 0x03f5ae58, 0x032f7d5b, 0x03440fb5, 0x02f89681, 0x003a0e1e, 0x002da433}}, Y: Field{[10]uint32{0x0049dbd1, 0x019aa5f8, 0x0135fb96, 0x03d89269, 0x0335e5f9, 0x02db0595, 0x01a96032, 0x00f76cb3, 0x0023fd3a, 0x0020f340}}}, + {X: Field{[10]uint32{0x01d326d4, 0x00025de4, 0x0338d6cd, 0x0120e56f, 0x002c9479, 0x02a42636, 0x022bc114, 0x01dd106a, 0x008ced50, 0x001cb694}}, Y: Field{[10]uint32{0x03668457, 0x03ed19cf, 0x03e095ea, 0x036ee045, 0x02e5d743, 0x03fb248b, 0x01780364, 0x03a8ac3a, 0x02933433, 0x000596ea}}}, + {X: Field{[10]uint32{0x01851c37, 0x00726dea, 0x0101729b, 0x006e6174, 0x01113320, 0x004969cb, 0x014322f5, 0x00c024a5, 0x016e540a, 0x00383f44}}, Y: Field{[10]uint32{0x01b88a92, 0x024117b9, 0x017ac850, 0x01addde6, 0x01a516a0, 0x00c34c55, 0x01e899d6, 0x01c1f952, 0x027648aa, 0x0031af1c}}}, + {X: Field{[10]uint32{0x00c10af1, 0x00ada0a5, 0x01c13abe, 0x007341a5, 0x030297f0, 0x0220fe76, 0x00d6389e, 0x03904bb8, 0x03ea85d4, 0x002752e2}}, Y: Field{[10]uint32{0x03556181, 0x014962a5, 0x038d38a9, 0x02ef9a28, 0x035bb66e, 0x02a2125c, 0x02e62fd6, 0x0020cb66, 0x00d73f7c, 0x001788a0}}}, + {X: Field{[10]uint32{0x008e08ff, 0x01e8b50e, 0x02d25505, 0x01547085, 0x01069f12, 0x0357acc7, 0x0056123c, 0x01b81377, 0x0395aa4b, 0x003bbe10}}, Y: Field{[10]uint32{0x022d2376, 0x035ad875, 0x039280b1, 0x01b56658, 0x0087797e, 0x00c5e712, 0x018b26c7, 0x010d9103, 0x02a434e1, 0x00114262}}}, + {X: Field{[10]uint32{0x010d7654, 0x02845972, 0x00de739a, 0x02bdb983, 0x03b4652d, 0x01dbbd09, 0x034371e0, 0x02392184, 0x007d56e3, 0x0019bf97}}, Y: Field{[10]uint32{0x011a2fba, 0x022a1370, 0x02582a10, 0x021259b2, 0x0196d4c3, 0x032edb13, 0x000ad433, 0x0324edf9, 0x026bb6ed, 0x000b5ca4}}}, + {X: Field{[10]uint32{0x008ea2ed, 0x031b7cb0, 0x027afdc2, 0x030a4e7c, 0x0082f9e1, 0x02a60f26, 0x015a304a, 0x032bb331, 0x01cc1818, 0x00144d7e}}, Y: Field{[10]uint32{0x003f22d6, 0x028d8878, 0x0295427c, 0x03851e61, 0x002619b5, 0x0056b86d, 0x00baf4e1, 0x005d413e, 0x01d27dfe, 0x0016949b}}}, + {X: Field{[10]uint32{0x026487ca, 0x03e6d88f, 0x0229c3fd, 0x022b386b, 0x0182e331, 0x008a8f8a, 0x03fa2bcc, 0x012a700b, 0x0089af7f, 0x00068df0}}, Y: Field{[10]uint32{0x012464a5, 0x0157fc0f, 0x02c183c9, 0x0048d74b, 0x03509b03, 0x01cd9cb3, 0x02b33d23, 0x008c2ea5, 0x00338522, 0x0034e270}}}, + {X: Field{[10]uint32{0x03a248a0, 0x00461211, 0x01576e4a, 0x00888bec, 0x01ed1edb, 0x02405be5, 0x03c68dfc, 0x02bd0244, 0x01ff15da, 0x00127de9}}, Y: Field{[10]uint32{0x01abd8fd, 0x0231e9ee, 0x03f611a1, 0x02086975, 0x00d5ebec, 0x029aefbd, 0x0394246f, 0x01ef27a5, 0x03013d63, 0x003e6d56}}}, + {X: Field{[10]uint32{0x02641ed7, 0x02abe207, 0x03130253, 0x00d6b0eb, 0x003b87f8, 0x01bac11c, 0x03f0f1e2, 0x03e0e481, 0x005e5d9e, 0x002091e1}}, Y: Field{[10]uint32{0x013c5f1e, 0x01102a79, 0x011de3e2, 0x023c8fce, 0x03b4409c, 0x032d0ab5, 0x01b19474, 0x026139fc, 0x010c1a23, 0x0015df5e}}}, + {X: Field{[10]uint32{0x010e0749, 0x006164f6, 0x024fb8f1, 0x00f897ba, 0x0257b782, 0x00214fa3, 0x0292ef61, 0x000906b3, 0x004ecd16, 0x0020a566}}, Y: Field{[10]uint32{0x00ac8353, 0x0236f230, 0x003c14c3, 0x0259e032, 0x022c5dac, 0x01ec70e2, 0x02450e76, 0x0357dce6, 0x01a66798, 0x0018d4c8}}}, + {X: Field{[10]uint32{0x01d75461, 0x03a7200f, 0x015377b2, 0x004ac4d0, 0x01fb5db4, 0x01c31a2d, 0x00ba34e7, 0x03d7fef8, 0x03f6d8fc, 0x003530ca}}, Y: Field{[10]uint32{0x0085f93d, 0x014fd991, 0x03353741, 0x01459b44, 0x01a1a71e, 0x03b69c2e, 0x004272b4, 0x0116ccb1, 0x0202e238, 0x002cf1cd}}}, + {X: Field{[10]uint32{0x00c897ff, 0x00fdda5b, 0x00d849fd, 0x0329a20b, 0x023babe7, 0x02d49a8c, 0x00703af6, 0x01a39a91, 0x032d04a9, 0x00068238}}, Y: Field{[10]uint32{0x03ad4141, 0x02caa3ab, 0x00b399a6, 0x0025c0d1, 0x013fdc82, 0x00ac52a3, 0x002e19be, 0x03b52897, 0x00bdb77b, 0x0011bb66}}}, + {X: Field{[10]uint32{0x014f4af7, 0x03f70d0d, 0x01e82e7c, 0x03bb3927, 0x036b40e1, 0x02a325dd, 0x0305965d, 0x00fc1012, 0x020e9672, 0x0021566f}}, Y: Field{[10]uint32{0x01333ef6, 0x000f7524, 0x02dc05af, 0x037aae90, 0x02ba4db6, 0x0374241a, 0x03f049b2, 0x008344b0, 0x0388854e, 0x0018f892}}}, + {X: Field{[10]uint32{0x01e211e8, 0x022f7181, 0x008c55e2, 0x0237a333, 0x02edd0f0, 0x03cbbca9, 0x01c0ee30, 0x011e2a12, 0x0223fc7a, 0x0038382c}}, Y: Field{[10]uint32{0x03ca60fc, 0x03580de7, 0x00d1a511, 0x017b44a2, 0x0206609a, 0x016e211e, 0x02d38e12, 0x03eb0481, 0x032c3aaf, 0x00328e20}}}, + {X: Field{[10]uint32{0x00e40a19, 0x014e739a, 0x034e2034, 0x009159e6, 0x00265c34, 0x0245d60b, 0x0001eaa5, 0x034941d6, 0x02982d8e, 0x00288def}}, Y: Field{[10]uint32{0x02231318, 0x0260a956, 0x0087cf48, 0x00ca400f, 0x00dc1bfc, 0x0009b59a, 0x00d5de47, 0x00de0115, 0x0227976a, 0x0003d334}}}, + {X: Field{[10]uint32{0x0205ccf2, 0x03e6d804, 0x03ef2474, 0x035ad0d9, 0x005edbd0, 0x0285bcaf, 0x03fe7705, 0x02341fc0, 0x00821eb0, 0x000a2a12}}, Y: Field{[10]uint32{0x0056a17c, 0x02d7f0fe, 0x02301eec, 0x02f7c03e, 0x01162551, 0x00748f6a, 0x00526b17, 0x01d8a2e8, 0x03e9e7d7, 0x002419f4}}}, + {X: Field{[10]uint32{0x00c1d5e8, 0x01a6b726, 0x01d16f4c, 0x03b84f56, 0x03cc83e2, 0x02083796, 0x01b8fdc3, 0x01ad74c9, 0x00d542bd, 0x00050bfa}}, Y: Field{[10]uint32{0x0075b150, 0x00c42877, 0x004539c8, 0x00186fe7, 0x001b66d1, 0x0235fe98, 0x01d14213, 0x00cee556, 0x02780325, 0x000a5cfc}}}, + {X: Field{[10]uint32{0x00ad87d2, 0x01ec04a6, 0x036b99c9, 0x03edc03e, 0x008f3d5f, 0x006d2e4a, 0x01bb00a1, 0x01927406, 0x011c5d20, 0x0016ced8}}, Y: Field{[10]uint32{0x02519182, 0x032d62bc, 0x0058f8eb, 0x021d688b, 0x00192ead, 0x03b5c2ed, 0x03a76219, 0x00384b37, 0x01c80cde, 0x00212416}}}, + {X: Field{[10]uint32{0x00beb8af, 0x00b1f394, 0x00f6b019, 0x018e5153, 0x012edbdc, 0x03cd7dbd, 0x01f74c35, 0x00168fd8, 0x02495d49, 0x00092288}}, Y: Field{[10]uint32{0x03fd4c83, 0x00dab1ee, 0x035c3b11, 0x00fa6e26, 0x0161eaf7, 0x02219e87, 0x0197b243, 0x03042073, 0x03ffb707, 0x002d69bc}}}, + {X: Field{[10]uint32{0x03ff075c, 0x00e134f6, 0x025d2875, 0x024c0b4e, 0x0231ea20, 0x008a408f, 0x011fa99a, 0x0143a753, 0x022a292b, 0x002291d2}}, Y: Field{[10]uint32{0x03804dd9, 0x035ad97b, 0x01dc8721, 0x01174c35, 0x0245b5f0, 0x01b3e3f4, 0x00392891, 0x0106c797, 0x005c7d53, 0x001dd14a}}}, + {X: Field{[10]uint32{0x0015ffec, 0x023444d4, 0x03b228ca, 0x03492356, 0x03826d10, 0x0198dcc4, 0x00be4ea8, 0x010ba99f, 0x02557fc0, 0x000fe804}}, Y: Field{[10]uint32{0x02a937b3, 0x01d7c9c9, 0x00b25e3f, 0x01b28c8a, 0x00162d43, 0x02312386, 0x03dca5a5, 0x012e3bb2, 0x0325f59b, 0x00042e74}}}, + {X: Field{[10]uint32{0x03d65648, 0x03086567, 0x028c046a, 0x017f22a0, 0x036b778d, 0x02bc126c, 0x008f0071, 0x03c69376, 0x000e7b94, 0x002dded7}}, Y: Field{[10]uint32{0x02aeccc5, 0x032c55fe, 0x0021ad54, 0x00ba77db, 0x01e2b65d, 0x01bb7582, 0x01d57222, 0x02efaa32, 0x03c06722, 0x000c491a}}}, + {X: Field{[10]uint32{0x0135b44a, 0x03107fe1, 0x018e08f2, 0x01bb5747, 0x00567184, 0x026f52ed, 0x02ccad78, 0x00ae5db0, 0x008267e8, 0x00098d7d}}, Y: Field{[10]uint32{0x032b8def, 0x01b569e9, 0x0234dafb, 0x02702d4c, 0x010d2ce3, 0x01edcd4f, 0x03f9e4d4, 0x0247ed99, 0x004e9560, 0x001fb720}}}, + {X: Field{[10]uint32{0x021b474d, 0x0382198d, 0x032384a4, 0x0368635d, 0x03ed0012, 0x0347a8da, 0x036f39b6, 0x014b271a, 0x012dae09, 0x0008c1ad}}, Y: Field{[10]uint32{0x025486c0, 0x02d5b3cc, 0x01221582, 0x01caf348, 0x00bd7674, 0x00b3bf3d, 0x023688bb, 0x023dae69, 0x00b88d7b, 0x0010e094}}}, + {X: Field{[10]uint32{0x01f74b4c, 0x03625eea, 0x0016e248, 0x03baa300, 0x03aa5604, 0x03568747, 0x0186f9ee, 0x020a123d, 0x02b80dde, 0x0032aa19}}, Y: Field{[10]uint32{0x0009c341, 0x012957f7, 0x038f2995, 0x029f563e, 0x00e33746, 0x02016909, 0x02834ceb, 0x01e3115c, 0x0140349f, 0x000a063c}}}, + {X: Field{[10]uint32{0x00bb1641, 0x031c3fa2, 0x037cbb74, 0x01eec949, 0x03fb5e57, 0x027007b4, 0x01e9cc42, 0x00f5417d, 0x035aa079, 0x0020637b}}, Y: Field{[10]uint32{0x024f276d, 0x02cfb8bb, 0x0045fbdd, 0x02d24e85, 0x01f48ea2, 0x0258d9f4, 0x022d54d7, 0x0040c603, 0x0280f762, 0x0036a7bb}}}, + {X: Field{[10]uint32{0x007bf736, 0x00b7e491, 0x01bf08b1, 0x030d68a5, 0x03c36e11, 0x02f2b16e, 0x0364ed01, 0x0104bf35, 0x01fa568d, 0x000b18b3}}, Y: Field{[10]uint32{0x02c31979, 0x0301468f, 0x025a8f82, 0x02fc654c, 0x00ee73ea, 0x02ae9906, 0x01ef9859, 0x01c189c1, 0x00255811, 0x003a2e38}}}, + {X: Field{[10]uint32{0x01f04adb, 0x033a01f8, 0x0341659b, 0x006adbac, 0x014e477f, 0x0145f412, 0x022f7cd0, 0x01ba3352, 0x00d99db0, 0x000a2ad5}}, Y: Field{[10]uint32{0x0094541c, 0x028a799d, 0x03b0872a, 0x00107b2f, 0x004fb003, 0x03cf9f61, 0x0256276b, 0x02580af9, 0x0319a5cb, 0x00264ed4}}}, + {X: Field{[10]uint32{0x012b6061, 0x01205314, 0x03bb63ea, 0x03d7c57a, 0x01d6c2ab, 0x008ea090, 0x034eca42, 0x02903152, 0x00162254, 0x00124f9f}}, Y: Field{[10]uint32{0x00eed628, 0x03e02e8f, 0x02c897de, 0x01efc25f, 0x025fcf81, 0x02ba3c87, 0x0236b597, 0x027533fb, 0x037b588d, 0x00158e1f}}}, + {X: Field{[10]uint32{0x01c51d4f, 0x034818ae, 0x01bce902, 0x023888b2, 0x018922a6, 0x00b174e2, 0x02118dda, 0x0245953f, 0x01bee743, 0x0019cb84}}, Y: Field{[10]uint32{0x03dc36e1, 0x000b70c8, 0x03c5fc51, 0x03eaff39, 0x030db6bb, 0x017a758a, 0x03cfbca4, 0x00aa76d2, 0x034a0238, 0x000d5544}}}, + {X: Field{[10]uint32{0x02da550a, 0x022cb0e3, 0x02701003, 0x00b0a567, 0x0027524b, 0x0167e397, 0x0286c06b, 0x01a22637, 0x036ee3b8, 0x0023e343}}, Y: Field{[10]uint32{0x01212f34, 0x005c40d2, 0x01fd45d4, 0x01b09afc, 0x03f36429, 0x021ef2ce, 0x000fed66, 0x02af1665, 0x02819e27, 0x0039f7bc}}}, + {X: Field{[10]uint32{0x00b293e3, 0x004fed5e, 0x01495e82, 0x00084817, 0x03118f28, 0x005e7cc2, 0x03cf4c79, 0x03c295e5, 0x03834a11, 0x0036a315}}, Y: Field{[10]uint32{0x01c35f91, 0x00077ce2, 0x00d28a2c, 0x0386d8ce, 0x007c7a0c, 0x02d77146, 0x02bb1c3a, 0x00e5d421, 0x035c6f66, 0x001bb3f8}}}, + {X: Field{[10]uint32{0x01681955, 0x01fea852, 0x00ef4265, 0x02ce0f88, 0x00fbce09, 0x02a66e83, 0x03ec2d6f, 0x0197fcfb, 0x00f53b19, 0x001254f8}}, Y: Field{[10]uint32{0x035541c6, 0x026d5065, 0x00a39fc0, 0x025c6343, 0x023c28fa, 0x01e601d9, 0x00683240, 0x00d6c8f9, 0x038d9d16, 0x00308431}}}, + {X: Field{[10]uint32{0x0375f293, 0x0108108d, 0x038db6c7, 0x03205b68, 0x025cd3e0, 0x03a442f5, 0x021f7fdb, 0x038786f8, 0x01af48a0, 0x0015247f}}, Y: Field{[10]uint32{0x007ffae7, 0x013b34bf, 0x0243e3d3, 0x02580c61, 0x039c82de, 0x02d47d3c, 0x03e9b299, 0x014ce28e, 0x02885d1c, 0x001949cd}}}, + {X: Field{[10]uint32{0x03c168d1, 0x03b26d6a, 0x007f0af3, 0x00a50f24, 0x020b0a85, 0x03c5f46d, 0x01838858, 0x018ee7ed, 0x03a80423, 0x002e712b}}, Y: Field{[10]uint32{0x03550d9a, 0x03f85592, 0x0178e514, 0x006c1b50, 0x01e24d51, 0x0329f635, 0x0013aa1e, 0x03afb574, 0x006b1b75, 0x003af4c4}}}, + {X: Field{[10]uint32{0x02d2bd62, 0x00dda0e4, 0x02386242, 0x01cceaf2, 0x01d6802e, 0x02ae0275, 0x039826de, 0x011e86d7, 0x036c4448, 0x00246368}}, Y: Field{[10]uint32{0x0253e218, 0x03c77722, 0x02eca0ab, 0x01b9859b, 0x02889d5e, 0x02ce2627, 0x0214113a, 0x021f9857, 0x03afd7cc, 0x001b988d}}}, + {X: Field{[10]uint32{0x01d3392a, 0x010b8dc0, 0x02c93a2e, 0x00bd15ca, 0x00748eb4, 0x026dd0f3, 0x000240e5, 0x01452820, 0x0194da1f, 0x001ddf4a}}, Y: Field{[10]uint32{0x029680c6, 0x0374e8e2, 0x038645e6, 0x016a7487, 0x039d9250, 0x01387493, 0x02b96f41, 0x00c654b2, 0x03d7e9eb, 0x00001864}}}, + {X: Field{[10]uint32{0x0323bf3d, 0x01fc8c95, 0x0154c4d1, 0x0140d3be, 0x013988c6, 0x03c93bd5, 0x03b8b3ea, 0x03171789, 0x02a09a08, 0x0004239b}}, Y: Field{[10]uint32{0x0013b2eb, 0x03786fff, 0x01be288f, 0x01dba093, 0x02b8a0dd, 0x020464de, 0x0314ebff, 0x01aed1f0, 0x034b86db, 0x0006a2e5}}}, + {X: Field{[10]uint32{0x016bf185, 0x02b15291, 0x02839b5d, 0x03d129a0, 0x013c2dce, 0x037ab87f, 0x018a4868, 0x01352446, 0x02db65a5, 0x000db676}}, Y: Field{[10]uint32{0x0147bbf7, 0x014092c8, 0x00d8d078, 0x03e0d1f7, 0x011edd9b, 0x0196fbc6, 0x02ec3065, 0x01761897, 0x0356d93b, 0x00097a10}}}, + {X: Field{[10]uint32{0x02531fa7, 0x039c74d9, 0x02fe3ab2, 0x01508ca4, 0x02aab896, 0x0009c9b3, 0x01d8a9e3, 0x039dd9ca, 0x02b143ec, 0x000f83ae}}, Y: Field{[10]uint32{0x018d41cd, 0x00e0f665, 0x03d5c691, 0x0384f66a, 0x008e38ea, 0x03ec12cd, 0x008f32b2, 0x0188da25, 0x0208556d, 0x001b9ec9}}}, + {X: Field{[10]uint32{0x00fa3728, 0x02f6d706, 0x034832ba, 0x0108055f, 0x03ab08ab, 0x004fba6a, 0x01e9521a, 0x03cc6a87, 0x036af315, 0x00248f71}}, Y: Field{[10]uint32{0x02d3ae47, 0x03b81f03, 0x0003ef6b, 0x02158cc4, 0x017facf6, 0x03627992, 0x001bfca6, 0x0215ecc5, 0x03b67439, 0x001ea3c5}}}, + {X: Field{[10]uint32{0x016a6618, 0x0313a80f, 0x02c6de85, 0x02a4deea, 0x036bee02, 0x00738b85, 0x029cb815, 0x03ab8d33, 0x033202df, 0x003e1fff}}, Y: Field{[10]uint32{0x005a03e0, 0x01d84856, 0x00e13c71, 0x0330b879, 0x027c14a4, 0x000f36ff, 0x03ace256, 0x01b828d5, 0x0037aa72, 0x001d3924}}}, + {X: Field{[10]uint32{0x018881ed, 0x00fe7040, 0x008200e3, 0x03fc1d5a, 0x01e00b5a, 0x014e7dfa, 0x01ec106b, 0x01a68047, 0x025ddd7f, 0x0004e201}}, Y: Field{[10]uint32{0x0113408e, 0x00c8c5d3, 0x0332c92b, 0x00c88ff9, 0x0065d1a9, 0x02ad090b, 0x02f72a55, 0x01877508, 0x018f1406, 0x002b2ac7}}}, + {X: Field{[10]uint32{0x004b6941, 0x026d88eb, 0x0201e59e, 0x00d2b314, 0x003d685b, 0x028dd46e, 0x03315427, 0x01a8220d, 0x031ea99b, 0x003951da}}, Y: Field{[10]uint32{0x033b4e21, 0x022cba57, 0x0177bb41, 0x019cf321, 0x00bc86dd, 0x02a3e9d5, 0x03c794ca, 0x01e568c8, 0x02f1c4dd, 0x0015f56c}}}, + {X: Field{[10]uint32{0x01cd1f15, 0x011f2c05, 0x0109c3dd, 0x02053b5e, 0x0290c149, 0x03261063, 0x0229d894, 0x03afa930, 0x0360f1e8, 0x003e4e3f}}, Y: Field{[10]uint32{0x02bb13e1, 0x0140c63b, 0x028214da, 0x0316dbb5, 0x02037fe2, 0x01cafef5, 0x0176e293, 0x03191a81, 0x02121a0c, 0x0035c5c8}}}, + {X: Field{[10]uint32{0x00a30aa3, 0x0168ef66, 0x038ad8ad, 0x013e8221, 0x01180b49, 0x02153e6f, 0x015544d5, 0x0144205e, 0x00107c4a, 0x002cc6f5}}, Y: Field{[10]uint32{0x00519e82, 0x01bd7014, 0x031c18fb, 0x03c384ac, 0x03d33828, 0x0001faac, 0x0141affa, 0x0225897a, 0x00976bd5, 0x00250984}}}, + {X: Field{[10]uint32{0x00c1cb2f, 0x011f40fd, 0x03af7b44, 0x02495768, 0x0333abd6, 0x0269b1b4, 0x02df141b, 0x00340468, 0x03ba8321, 0x002cfb61}}, Y: Field{[10]uint32{0x01d632b3, 0x02452a93, 0x0347abe0, 0x006cd1f9, 0x02b90be7, 0x018d0799, 0x030273cb, 0x015f86a5, 0x037929c7, 0x00252774}}}, + {X: Field{[10]uint32{0x01221e17, 0x03b85b4c, 0x03f46668, 0x0038e2e1, 0x0089a57c, 0x00c6f282, 0x0395e787, 0x0243612e, 0x02401ea7, 0x001839b0}}, Y: Field{[10]uint32{0x029465c2, 0x02f451b2, 0x0198cc03, 0x00110143, 0x00367387, 0x015c7abc, 0x01c800a0, 0x00263ca9, 0x0335c722, 0x003c91ef}}}, + {X: Field{[10]uint32{0x03750a80, 0x02bebc70, 0x03b87994, 0x01abdd30, 0x01eaf3e1, 0x01c4f35c, 0x01d8d370, 0x03411f9f, 0x02b04cc8, 0x000aba01}}, Y: Field{[10]uint32{0x02e2e954, 0x03793aec, 0x0135ae38, 0x028906a8, 0x026facf6, 0x0017283b, 0x007fafe6, 0x01c6d46a, 0x00acb297, 0x002a365e}}}, + {X: Field{[10]uint32{0x01bb5c47, 0x0109308a, 0x0343958a, 0x0218dde7, 0x01d23843, 0x007dbcea, 0x020bb155, 0x00b4a79e, 0x00a4bbba, 0x0026bc5e}}, Y: Field{[10]uint32{0x0279abd3, 0x0006886b, 0x03259781, 0x02eab737, 0x014052a4, 0x00beecf4, 0x007ac857, 0x02215e92, 0x03baa023, 0x003040c7}}}, + {X: Field{[10]uint32{0x0008f523, 0x005b6658, 0x00b2c3a1, 0x00c4cc3b, 0x00fd78a5, 0x027a2894, 0x03da097c, 0x009ebcb9, 0x0321e9cb, 0x002775a9}}, Y: Field{[10]uint32{0x03f36080, 0x03274ff9, 0x0217357d, 0x0177d3a0, 0x03fc4e97, 0x02f195e1, 0x012adb14, 0x0027251c, 0x037d6473, 0x0039a0de}}}, + {X: Field{[10]uint32{0x01e91c52, 0x006876a9, 0x03f0f0e3, 0x02da68a2, 0x03fcb717, 0x0113beed, 0x03e3f1de, 0x028794ec, 0x02bed7a1, 0x0033d7c5}}, Y: Field{[10]uint32{0x00487497, 0x00a0d2b1, 0x014b1485, 0x003629a7, 0x00b0c80a, 0x0264833d, 0x03912c99, 0x0081ef18, 0x03d54d87, 0x0025527a}}}, + {X: Field{[10]uint32{0x03a64722, 0x03a417b7, 0x001afd45, 0x03ece880, 0x01de577c, 0x014a8052, 0x02466a3c, 0x015341e0, 0x00908109, 0x00319e52}}, Y: Field{[10]uint32{0x035ca468, 0x0091837d, 0x01187fcc, 0x00946f9a, 0x018621b6, 0x03209e0a, 0x00a5fbd5, 0x0100c6ff, 0x0351deb6, 0x001293f7}}}, + {X: Field{[10]uint32{0x00599713, 0x0354904c, 0x023e4442, 0x0083f869, 0x02b03b49, 0x010501aa, 0x019c1ea0, 0x0383fc59, 0x03cbbee9, 0x002897ff}}, Y: Field{[10]uint32{0x0341486a, 0x01bc912f, 0x007e2123, 0x024537a6, 0x0240fab7, 0x02dca86e, 0x03fc28af, 0x004626b0, 0x02065a82, 0x0005dae7}}}, + {X: Field{[10]uint32{0x00c5bf71, 0x0125dd38, 0x025ecdca, 0x01ab2ba7, 0x01128cab, 0x009238ca, 0x02cfafc7, 0x0248ec5a, 0x0322fd5d, 0x00181e69}}, Y: Field{[10]uint32{0x018c4bcc, 0x03debaf4, 0x00c45df0, 0x024af57b, 0x02023f52, 0x000cdfbf, 0x036f1d91, 0x01691713, 0x02de99ca, 0x0030265c}}}, + {X: Field{[10]uint32{0x0366b403, 0x02772e4a, 0x0182c813, 0x003f2add, 0x02f64b95, 0x02c59c8f, 0x03ffc428, 0x01e39c63, 0x003d9d40, 0x0006232d}}, Y: Field{[10]uint32{0x03af5404, 0x03dfc688, 0x0314c140, 0x03ccd62a, 0x01fcc8c2, 0x0155a45b, 0x01a28799, 0x02890002, 0x0237ec9e, 0x00280e3e}}}, + {X: Field{[10]uint32{0x0019bb30, 0x006c9fbe, 0x0102cd78, 0x00d1a33f, 0x00c445ca, 0x01559fb2, 0x03925066, 0x0171a3d5, 0x0040cb57, 0x0038c43f}}, Y: Field{[10]uint32{0x02be625e, 0x01ae278a, 0x0384ddf6, 0x00da83c5, 0x02e0c183, 0x01b9ee51, 0x0101def6, 0x004bb97a, 0x02655ba3, 0x000c4ca2}}}, + {X: Field{[10]uint32{0x03dea4ac, 0x015d2fdd, 0x03c8e52b, 0x037c91b0, 0x00f15693, 0x03d18b32, 0x000bdeb1, 0x01177765, 0x005d1c82, 0x00376192}}, Y: Field{[10]uint32{0x01966ce2, 0x03027182, 0x03b4833f, 0x02d1f9d0, 0x018963a8, 0x028a6282, 0x0290175b, 0x0289c131, 0x03c256c9, 0x00335aed}}}, + {X: Field{[10]uint32{0x03019aef, 0x01740a81, 0x0097bde8, 0x02666cd8, 0x03dba773, 0x02da7865, 0x03dc67ca, 0x019ee1bd, 0x020cf815, 0x0006dfb4}}, Y: Field{[10]uint32{0x00e3d1bb, 0x03f0d7bc, 0x01531be6, 0x01534c53, 0x00df428d, 0x0292f0de, 0x00d89b59, 0x010e1954, 0x012ad1cb, 0x003e053a}}}, + {X: Field{[10]uint32{0x01ded284, 0x01c669ed, 0x01897a0f, 0x00328191, 0x019b41cd, 0x01c2cfc7, 0x0146a036, 0x020ce3b4, 0x007b2d52, 0x00028556}}, Y: Field{[10]uint32{0x022e925d, 0x03a9c9c4, 0x0052bfe6, 0x008ab5ad, 0x0312fc15, 0x01008fb9, 0x00d225cc, 0x00693b8c, 0x034b5aba, 0x000abbf8}}}, + {X: Field{[10]uint32{0x036a5484, 0x01254fa4, 0x01054048, 0x018e7934, 0x0208d194, 0x02825033, 0x00fcf209, 0x029a4663, 0x01f9c99d, 0x00015eee}}, Y: Field{[10]uint32{0x031660e4, 0x0291f20c, 0x0079e9a6, 0x01ef634c, 0x03700dc5, 0x035defc3, 0x03be5e41, 0x009ba0b1, 0x03a8d902, 0x0018f43e}}}, + {X: Field{[10]uint32{0x03bd262c, 0x02497564, 0x03746bab, 0x03ee3e92, 0x01291f84, 0x00844ec8, 0x017f7a10, 0x02d2835f, 0x01b37fa1, 0x000890a5}}, Y: Field{[10]uint32{0x00195796, 0x0258ae4e, 0x03ddcea2, 0x023b1145, 0x0246ed38, 0x00889982, 0x023eb74c, 0x02c369d5, 0x0040b1e4, 0x0003582b}}}, + {X: Field{[10]uint32{0x0053b0e3, 0x00e69ad5, 0x0055e53b, 0x0283c8a0, 0x02d6101c, 0x039d0d53, 0x00031b29, 0x0314f81f, 0x02e6a34e, 0x00090d3a}}, Y: Field{[10]uint32{0x003ce23d, 0x01e8e09d, 0x010ed6ce, 0x01d591db, 0x008b04f7, 0x00e88398, 0x00f39563, 0x0012ec4e, 0x0161d57a, 0x000bfd7b}}}, + {X: Field{[10]uint32{0x01885ce9, 0x02961c62, 0x0203b700, 0x02d8db42, 0x01ef2e6a, 0x03ec8ac1, 0x0304c649, 0x00444ef6, 0x0192907c, 0x00112379}}, Y: Field{[10]uint32{0x0079eabc, 0x0108732a, 0x028803d0, 0x00435164, 0x0063af8b, 0x016c0a4c, 0x03e6dea2, 0x0141a37a, 0x03fd6ab3, 0x0035eab3}}}, + {X: Field{[10]uint32{0x0393dd76, 0x028dc618, 0x0298f7c2, 0x00730769, 0x00defc0a, 0x006a8ee8, 0x02b92e70, 0x01d9d1ff, 0x03735aef, 0x00210173}}, Y: Field{[10]uint32{0x02c407f2, 0x01549639, 0x0053fc79, 0x00beea1a, 0x0189c9ef, 0x03d2a1c4, 0x0261c783, 0x00428129, 0x000649cd, 0x0015e574}}}, + {X: Field{[10]uint32{0x0208efc9, 0x0084735b, 0x026d5581, 0x03341cb1, 0x029318ac, 0x00dc7ae1, 0x01349aa0, 0x0121f7fa, 0x00c1e5c1, 0x001a625d}}, Y: Field{[10]uint32{0x0384509c, 0x030703fb, 0x00e1590b, 0x00aaee13, 0x01bcec87, 0x02ae6bd8, 0x036536c2, 0x012fd47d, 0x038cdc8f, 0x000df088}}}, + {X: Field{[10]uint32{0x003fee05, 0x0395cc99, 0x02d8dce2, 0x01846e11, 0x03e6548c, 0x00c57de2, 0x017781df, 0x02af19c6, 0x017abe3c, 0x00228de1}}, Y: Field{[10]uint32{0x00f674ed, 0x01da62d3, 0x020b78b8, 0x026c8777, 0x005e28e9, 0x038e19b5, 0x0055e4d9, 0x013341f9, 0x03680915, 0x000a620b}}}, + {X: Field{[10]uint32{0x0397eaef, 0x02f380c8, 0x00846793, 0x037c3e98, 0x0325ec8c, 0x01ea29c5, 0x0104c968, 0x00e7f84c, 0x034f5cdd, 0x002a1c6c}}, Y: Field{[10]uint32{0x0387cb28, 0x03f5e8b0, 0x00c5df3f, 0x037a379b, 0x00642312, 0x01b2484f, 0x03e2dc68, 0x000f027d, 0x00179de1, 0x00213e59}}}, + {X: Field{[10]uint32{0x0286f44a, 0x019339a0, 0x00fb4fd9, 0x031ebaae, 0x009ec66e, 0x02679d2b, 0x0057905e, 0x029fd6a2, 0x03b89f78, 0x00126f2b}}, Y: Field{[10]uint32{0x019eff6f, 0x03901f3b, 0x0194f4ea, 0x01849c5b, 0x0271124a, 0x02f464fa, 0x011d2ca7, 0x02add29e, 0x00cb5641, 0x0039f6e3}}}, + {X: Field{[10]uint32{0x028b6df6, 0x01c4c03d, 0x03686c3f, 0x012de7fa, 0x0140d9b8, 0x03ffa126, 0x0186289d, 0x0327963d, 0x012f2f05, 0x003571f6}}, Y: Field{[10]uint32{0x0151c08e, 0x0200abc7, 0x020434f1, 0x00aff38d, 0x036fcb2b, 0x0073d0ae, 0x00b272ce, 0x028e3a81, 0x025c219e, 0x0029a2ca}}}, + {X: Field{[10]uint32{0x03286696, 0x02a36d4e, 0x0056cfe4, 0x02f8a09b, 0x006a825c, 0x02c323b4, 0x034a249c, 0x0335ee71, 0x023cfea4, 0x000ab0bf}}, Y: Field{[10]uint32{0x0360f43f, 0x039e0102, 0x03834a67, 0x01b3c028, 0x00505bb4, 0x01b2981e, 0x02f6031c, 0x02947b28, 0x0259b008, 0x001f6429}}}, + {X: Field{[10]uint32{0x00a39234, 0x00716a84, 0x011d92f6, 0x03bec0ed, 0x025b0069, 0x0283b69e, 0x023a85f5, 0x01fb3d3d, 0x00bc6282, 0x001f026b}}, Y: Field{[10]uint32{0x01624836, 0x01b1a21a, 0x030015a9, 0x03c8258a, 0x00854b56, 0x017f70c6, 0x01f86414, 0x00a315a1, 0x0139c291, 0x00381f49}}}, + {X: Field{[10]uint32{0x03fbf9f0, 0x025aefdb, 0x03a7f2c4, 0x0008d289, 0x033bb4ff, 0x00ecbeb4, 0x0141ae71, 0x010b9da6, 0x01567e1b, 0x003a21b7}}, Y: Field{[10]uint32{0x0267a877, 0x0045cb71, 0x0301081d, 0x03cf18c2, 0x025a4666, 0x037d3977, 0x01c097f0, 0x03e03cdc, 0x037babee, 0x00352c89}}}, + {X: Field{[10]uint32{0x0059c2dc, 0x02866740, 0x00464073, 0x039614d1, 0x038ca8a6, 0x03d82ec6, 0x02178f0f, 0x00e60f16, 0x00c800e8, 0x003b7d97}}, Y: Field{[10]uint32{0x01ab2d5e, 0x01d89122, 0x0123a92c, 0x036c41c3, 0x030118a4, 0x0378737e, 0x024710a2, 0x00c27e12, 0x0313f0c5, 0x00289099}}}, + {X: Field{[10]uint32{0x026d17f8, 0x01abdbb4, 0x01036a74, 0x02ee8f4b, 0x03435ad7, 0x02c548c8, 0x016dbbe5, 0x01baee4d, 0x0304b78a, 0x000a704b}}, Y: Field{[10]uint32{0x016eae4a, 0x03f3b388, 0x019358b7, 0x009fe816, 0x02b3336d, 0x027b1146, 0x02a211f3, 0x0046a9e3, 0x0275bf62, 0x00020e64}}}, + {X: Field{[10]uint32{0x0263c3e2, 0x03e29e59, 0x00789994, 0x01192986, 0x03169f20, 0x0383e7f3, 0x02034ac3, 0x026453c2, 0x038c280e, 0x003576e2}}, Y: Field{[10]uint32{0x0263412b, 0x00355df0, 0x02cbbeb6, 0x01e2a997, 0x0398f270, 0x0066507d, 0x025635a8, 0x0000e7d7, 0x003a085a, 0x0010458f}}}, + {X: Field{[10]uint32{0x01135f8d, 0x00285f36, 0x01165700, 0x016b151f, 0x0210e105, 0x02ed3dff, 0x00e57ac8, 0x02c03656, 0x03a5630e, 0x00264293}}, Y: Field{[10]uint32{0x03c9653b, 0x02c8f5d2, 0x032912ec, 0x0053e3f3, 0x03eb2524, 0x0231c485, 0x02a03646, 0x028a2511, 0x0025491f, 0x003c97b8}}}, + {X: Field{[10]uint32{0x029c0935, 0x00ded5e7, 0x031b7416, 0x03b31a35, 0x034e3049, 0x00c573d4, 0x0101c3b3, 0x012773b2, 0x00f01c78, 0x0035e13b}}, Y: Field{[10]uint32{0x034205ce, 0x03593eda, 0x03dde6b2, 0x00202159, 0x02306720, 0x03b1bf51, 0x0082a841, 0x00abb763, 0x0122cc38, 0x00177a63}}}, + {X: Field{[10]uint32{0x00e38193, 0x01334d5b, 0x01338320, 0x03946726, 0x019b4d38, 0x037cf067, 0x0353b67b, 0x0032eeab, 0x00d05885, 0x000195db}}, Y: Field{[10]uint32{0x0310eaca, 0x03dd3195, 0x03420658, 0x0038c2fc, 0x03d98496, 0x01d923f8, 0x001fbeb2, 0x0395b8c7, 0x013e92d1, 0x0028ca66}}}, + {X: Field{[10]uint32{0x0035efce, 0x012113af, 0x024d8bb9, 0x01dcf49b, 0x0320ccb1, 0x0311527f, 0x009a8081, 0x03031919, 0x00e5f675, 0x00255de2}}, Y: Field{[10]uint32{0x021d9b5b, 0x016a8394, 0x00a8c051, 0x001a6f04, 0x0301d329, 0x005785f3, 0x01c39486, 0x03b8df65, 0x031cdc4b, 0x001fa910}}}, + {X: Field{[10]uint32{0x039e4a2e, 0x014b0178, 0x0096b014, 0x03cec114, 0x00da5549, 0x02304ffc, 0x0101abd7, 0x02d4dfb1, 0x02805053, 0x0022bdf2}}, Y: Field{[10]uint32{0x017e8402, 0x0160da8b, 0x03fb8e1b, 0x001ba759, 0x036a4362, 0x03690150, 0x03235e60, 0x010b933e, 0x0225aac0, 0x00097a18}}}, + {X: Field{[10]uint32{0x0215236c, 0x024df438, 0x02ba2623, 0x01598dec, 0x01e6eb74, 0x035e705e, 0x02ff642a, 0x018d3880, 0x0393e16e, 0x00126fc0}}, Y: Field{[10]uint32{0x0031a85d, 0x00f9a5e9, 0x00722d60, 0x00305e6b, 0x0141e5f8, 0x02684d10, 0x000ce1ee, 0x03835073, 0x013f401d, 0x00216418}}}, + {X: Field{[10]uint32{0x00192063, 0x03af4675, 0x035afdc5, 0x03b68992, 0x01df3653, 0x02326db7, 0x03b68581, 0x00a18d49, 0x02250257, 0x00320b8a}}, Y: Field{[10]uint32{0x01a6de8c, 0x01d78f8e, 0x011c7b26, 0x03dcddbe, 0x01c2717f, 0x01fe7a4e, 0x030af044, 0x0306f4f5, 0x0000cd87, 0x000ee1be}}}, + {X: Field{[10]uint32{0x00eedbf3, 0x004b7f76, 0x02041a37, 0x0154562c, 0x0142ec13, 0x0393489f, 0x02fc9c3f, 0x023df0eb, 0x01202b9a, 0x0027390e}}, Y: Field{[10]uint32{0x035b52f6, 0x0288327f, 0x026e26d5, 0x02cf70bb, 0x0153a54b, 0x02a4e7fe, 0x02f15d59, 0x03b74feb, 0x0305859a, 0x0036eed6}}}, + {X: Field{[10]uint32{0x02fe6227, 0x02f6dac5, 0x0324a168, 0x02b425bb, 0x00baa707, 0x03b2ad2e, 0x01202213, 0x0017294b, 0x009e49de, 0x000381c0}}, Y: Field{[10]uint32{0x00bc33c9, 0x023e739b, 0x03b2e417, 0x00f28548, 0x03258383, 0x037a353a, 0x03865b0a, 0x02e89a06, 0x00bfe752, 0x001a8d6c}}}, + {X: Field{[10]uint32{0x021da888, 0x00056f60, 0x03fab065, 0x017fd308, 0x01d58861, 0x025849c5, 0x02948147, 0x02bd8791, 0x01b47e09, 0x003ad373}}, Y: Field{[10]uint32{0x01661b8f, 0x017454fa, 0x000834a5, 0x01710410, 0x00008630, 0x01320457, 0x006536ad, 0x000be878, 0x01685846, 0x0018f8e0}}}, + {X: Field{[10]uint32{0x00e49db6, 0x013cce44, 0x00f7bf86, 0x001c981e, 0x03a2c659, 0x034a76b3, 0x0257015d, 0x00044c74, 0x02812bf2, 0x002f97e1}}, Y: Field{[10]uint32{0x016d9da7, 0x01004765, 0x01f308f0, 0x02e3103a, 0x0143c4f1, 0x01cfe944, 0x015a92da, 0x012bfd66, 0x00e45617, 0x00343d08}}}, + {X: Field{[10]uint32{0x015b99a8, 0x007e204d, 0x01ed74a6, 0x0172cc75, 0x03db214a, 0x0375fa3b, 0x03a1318e, 0x017e7663, 0x003910e7, 0x000eccb7}}, Y: Field{[10]uint32{0x03a18bc5, 0x02bc68a8, 0x03c4218b, 0x02b15cbe, 0x036e4e0a, 0x01d4b952, 0x01df756e, 0x03a7967f, 0x028619c2, 0x000684b7}}}, + {X: Field{[10]uint32{0x02e04db1, 0x00f9e921, 0x029d0a3c, 0x00d45a5c, 0x03dde107, 0x00fce1ad, 0x012922ea, 0x03a21597, 0x01ce5c06, 0x00256b17}}, Y: Field{[10]uint32{0x02f39838, 0x02d6c9cf, 0x029fde77, 0x01dc9465, 0x01680edb, 0x005aded2, 0x0049e856, 0x0060878f, 0x0187ab1b, 0x000688b3}}}, + {X: Field{[10]uint32{0x00e708eb, 0x0060db5f, 0x005ccd30, 0x00782a37, 0x027dad59, 0x017b4a57, 0x01d1b74a, 0x03c4f8cd, 0x00fba4b0, 0x001b93b4}}, Y: Field{[10]uint32{0x0234b931, 0x01fc5482, 0x01a54ac3, 0x0267a670, 0x0016a2ef, 0x027366ac, 0x0188e6e5, 0x013827b6, 0x026ac61c, 0x00241585}}}, + {X: Field{[10]uint32{0x03a42e10, 0x03ae8b08, 0x01859898, 0x01e6474b, 0x01ea8d9a, 0x0209f612, 0x00925e17, 0x003b84dd, 0x0394208e, 0x0022df0c}}, Y: Field{[10]uint32{0x0043d193, 0x02afac9c, 0x02d0d003, 0x03d8bc86, 0x032c8beb, 0x01d7bcff, 0x00e64400, 0x002f3244, 0x02379672, 0x002daae4}}}, + {X: Field{[10]uint32{0x00f871c6, 0x001612ec, 0x02dcc8e2, 0x01363e5b, 0x02dd48ab, 0x02dbd772, 0x00965b98, 0x0035ce21, 0x0347f669, 0x0003f69e}}, Y: Field{[10]uint32{0x02926c5d, 0x02e39af2, 0x03560e18, 0x00895791, 0x00309292, 0x0152d1cf, 0x03487e8b, 0x0331b4a2, 0x0035a272, 0x0026d009}}}, + {X: Field{[10]uint32{0x01bcb217, 0x0041a8cf, 0x0255dad6, 0x022f3246, 0x036e6301, 0x0303a6a8, 0x00beb534, 0x01686bbe, 0x00f5395a, 0x003c5768}}, Y: Field{[10]uint32{0x038a8f1c, 0x03afdd95, 0x00f6ddb6, 0x00bef3e6, 0x0380be25, 0x021825c8, 0x03571ac4, 0x00054645, 0x01eabb3b, 0x000a33da}}}, + {X: Field{[10]uint32{0x00af9253, 0x036206ef, 0x032f4abf, 0x02e1fea0, 0x03d9a208, 0x021c26a5, 0x02378e63, 0x005f8324, 0x02dd2c78, 0x0031b899}}, Y: Field{[10]uint32{0x03769626, 0x0247b9f2, 0x02082842, 0x03724c8c, 0x005ffa7a, 0x0342fbd6, 0x00e95e35, 0x02ce8c32, 0x00c1fa9b, 0x000abc40}}}, + {X: Field{[10]uint32{0x02e28753, 0x00cf422d, 0x0313f0d1, 0x01e93f6a, 0x037f5a72, 0x00e495a1, 0x00c21a83, 0x00807922, 0x02020fdd, 0x0012fe2a}}, Y: Field{[10]uint32{0x015fc8b8, 0x02fa74f3, 0x01d88f39, 0x0016572f, 0x02d8fe5f, 0x0279b188, 0x01c6bd70, 0x01356685, 0x0258ad9c, 0x00162049}}}, + {X: Field{[10]uint32{0x00d0a6d3, 0x03f04a5f, 0x0248b972, 0x01cf6d87, 0x0105cda6, 0x029dfee5, 0x009fc39d, 0x01216956, 0x032806dd, 0x002aa617}}, Y: Field{[10]uint32{0x024b75b2, 0x017d8347, 0x00a04e1e, 0x00404389, 0x007c2777, 0x007fc0b8, 0x025a92da, 0x018ecca6, 0x00972f11, 0x002aec3e}}}, + {X: Field{[10]uint32{0x01c41c9d, 0x01ccbb18, 0x0197c8e1, 0x012c33b4, 0x016c2fa0, 0x02305048, 0x039f88d8, 0x02873d3a, 0x0101ec13, 0x00205d34}}, Y: Field{[10]uint32{0x03d79aa7, 0x01a9d623, 0x01bbb46f, 0x012c69e4, 0x00c6e5d9, 0x0298e6c0, 0x037a6625, 0x00b9ffab, 0x01c231b0, 0x00319d97}}}, + {X: Field{[10]uint32{0x01f3d876, 0x00bc13db, 0x02cbb870, 0x02b3f6f9, 0x0292573a, 0x016a68e8, 0x028fe098, 0x024a5edc, 0x02a9d603, 0x003e7d93}}, Y: Field{[10]uint32{0x024ca01a, 0x01f4b266, 0x02f9b1a6, 0x03ef61fb, 0x01188069, 0x005cba1e, 0x00950f21, 0x019f4058, 0x03c14060, 0x001051b1}}}, + {X: Field{[10]uint32{0x00f1b3b4, 0x0197b32a, 0x02951d88, 0x02f072a4, 0x01f8067c, 0x02977a49, 0x034454a2, 0x0217acf4, 0x02705a68, 0x000f990e}}, Y: Field{[10]uint32{0x02fb0355, 0x03822df8, 0x02f11b0f, 0x0209c58b, 0x028b5e58, 0x01ddea65, 0x01d54d1d, 0x014d3b7a, 0x03045525, 0x000b7b29}}}, + {X: Field{[10]uint32{0x036c63c5, 0x0259bccd, 0x0082e4c0, 0x034ae1ea, 0x03caae45, 0x01bddb40, 0x015d200d, 0x02b01dfa, 0x0011fcc3, 0x0011137d}}, Y: Field{[10]uint32{0x0016cc23, 0x0142a955, 0x032bc643, 0x024eb1b8, 0x01ec520c, 0x00b7b3cf, 0x00d1a4df, 0x02592a9f, 0x0198643d, 0x002d1599}}}, + {X: Field{[10]uint32{0x006946a0, 0x01ea1e99, 0x01465bbb, 0x01aa1093, 0x0019cdaa, 0x029a0429, 0x00a7beb1, 0x00d7f8c5, 0x021f58be, 0x0004a8bd}}, Y: Field{[10]uint32{0x010ba47d, 0x0354d74a, 0x010698df, 0x00c6575e, 0x0248410b, 0x029a7ef2, 0x01539461, 0x03323fc6, 0x034494c2, 0x00269ef7}}}, + {X: Field{[10]uint32{0x0264cb9f, 0x00acadf8, 0x007933d5, 0x01ea4fd2, 0x02511b2b, 0x01a1ef48, 0x008af94b, 0x01cf1cf5, 0x02924625, 0x002f75c9}}, Y: Field{[10]uint32{0x02123874, 0x03037de8, 0x034ed955, 0x03df7103, 0x02858e6d, 0x03dd1a6a, 0x01ac9923, 0x03eac2f5, 0x004eb794, 0x00015b9b}}}, + {X: Field{[10]uint32{0x00066bdd, 0x01ff95a9, 0x003d60ec, 0x00a75f41, 0x03c974bd, 0x02936a7b, 0x034f156e, 0x03d5744a, 0x015877c3, 0x00386f55}}, Y: Field{[10]uint32{0x03233170, 0x02541d70, 0x0033ff5a, 0x006c7111, 0x03789cbf, 0x03168cbd, 0x002bea56, 0x010da88e, 0x0399fbe7, 0x00237366}}}, + {X: Field{[10]uint32{0x00132ad9, 0x00d47498, 0x0185d804, 0x02e2c1c6, 0x00fc064e, 0x01287d54, 0x0246609f, 0x020a52fa, 0x01e4781c, 0x0029f1a3}}, Y: Field{[10]uint32{0x01b42c32, 0x02218aeb, 0x00766842, 0x026fafe8, 0x026f6bbf, 0x0116626e, 0x022b240d, 0x03fad441, 0x00b63d9e, 0x0028209e}}}, + {X: Field{[10]uint32{0x029aa855, 0x00f1c34a, 0x0279a56b, 0x0198f632, 0x0205fa0d, 0x004df41e, 0x01eb90f5, 0x038da72f, 0x0369b4c6, 0x0013cea1}}, Y: Field{[10]uint32{0x026ea169, 0x01921bba, 0x0393e35b, 0x00b2d8af, 0x00b9d6db, 0x011c1d61, 0x00ed9f2c, 0x007854d2, 0x011c5f70, 0x0003db01}}}, + {X: Field{[10]uint32{0x0044f232, 0x018f77bd, 0x01a8d744, 0x01ff2d0d, 0x0036fd04, 0x0229aed6, 0x01cac66d, 0x03aff610, 0x001c8089, 0x0037aaaf}}, Y: Field{[10]uint32{0x0228e8a1, 0x0030a4f0, 0x014f90f5, 0x01258a9b, 0x00ccd14a, 0x03229b59, 0x026e6547, 0x01b9eaa0, 0x00ba49c2, 0x003edf31}}}, + {X: Field{[10]uint32{0x019c0695, 0x02e3e4cc, 0x023788b5, 0x02adf3f3, 0x02fd7f33, 0x03bcaccb, 0x0151e1f4, 0x006ce049, 0x0361547b, 0x0031046b}}, Y: Field{[10]uint32{0x018cb66b, 0x02efe215, 0x02ab4797, 0x013bd888, 0x02294ace, 0x03f3eedd, 0x0266d212, 0x03e0aba4, 0x03d73d50, 0x0034afb9}}}, + {X: Field{[10]uint32{0x009ec5e7, 0x002f7aa4, 0x01637821, 0x000742a2, 0x004a35f1, 0x02e77771, 0x00284945, 0x0376a343, 0x0294485b, 0x00343fda}}, Y: Field{[10]uint32{0x024f620f, 0x0087c88d, 0x02a65e21, 0x03fe0ea4, 0x00cb1910, 0x023e54f1, 0x02b7e83d, 0x02a3cb40, 0x00fd2923, 0x002acfd8}}}, + {X: Field{[10]uint32{0x0308c0f1, 0x00d6a9c7, 0x02424982, 0x01102cff, 0x01006f27, 0x016b5b2c, 0x011baea3, 0x03b648a1, 0x01cc9555, 0x00028341}}, Y: Field{[10]uint32{0x02339948, 0x0131f275, 0x037dc471, 0x02b4c601, 0x0150afe2, 0x0082c9c1, 0x017e67ca, 0x01629c2f, 0x01052371, 0x00210ec4}}}, + {X: Field{[10]uint32{0x023f5d32, 0x03964807, 0x039d0568, 0x010a24fe, 0x007d5996, 0x0364265e, 0x0083ef67, 0x017ee817, 0x0045eb29, 0x002fa821}}, Y: Field{[10]uint32{0x00ce10e3, 0x03cc8a9b, 0x01cc7908, 0x035af53d, 0x01e26594, 0x00744bb4, 0x00bb2bb4, 0x03d14f5e, 0x03ffb3f7, 0x000aa069}}}, + {X: Field{[10]uint32{0x02f0d5f0, 0x00b1f7b9, 0x02ce3e82, 0x026316b3, 0x00551c30, 0x01aae5c0, 0x035aea6f, 0x039a267a, 0x004c431b, 0x003a3af3}}, Y: Field{[10]uint32{0x01fa902e, 0x03428ecc, 0x0161e097, 0x0193aa83, 0x016d65db, 0x0268ab9e, 0x03d511f5, 0x0393d63e, 0x0061760a, 0x003be669}}}, + {X: Field{[10]uint32{0x026e8fd2, 0x00c2f3a5, 0x03cd1d96, 0x02d6161d, 0x020806ba, 0x01e5b62d, 0x031db77c, 0x037113b3, 0x006cdd73, 0x00125218}}, Y: Field{[10]uint32{0x02b95f80, 0x012e496f, 0x01123bc6, 0x03b7cf6e, 0x00cb8c13, 0x00e511aa, 0x01630aa6, 0x02319e10, 0x033f786c, 0x000f19cc}}}, + {X: Field{[10]uint32{0x02a778c2, 0x021e4ba7, 0x00a165c1, 0x02996d72, 0x00fb5a19, 0x019b3525, 0x03e40cca, 0x03bee938, 0x033240d9, 0x0013c966}}, Y: Field{[10]uint32{0x0117446d, 0x023aab93, 0x00efb1b6, 0x01fd1d23, 0x00b1590f, 0x027d3a8b, 0x02006054, 0x01a66712, 0x008778c2, 0x003f7620}}}, + {X: Field{[10]uint32{0x02dfcc29, 0x0143e91e, 0x03f337e3, 0x02379ea9, 0x031e7e91, 0x038463ba, 0x036e2b43, 0x01fd4bc9, 0x0093e14d, 0x003cc0e9}}, Y: Field{[10]uint32{0x01141b57, 0x006f52da, 0x00163cfa, 0x01df17f9, 0x01453f79, 0x029ab499, 0x01bc49da, 0x0394fd7d, 0x006d0bef, 0x003127e9}}}, + {X: Field{[10]uint32{0x01df595d, 0x02cbd4f0, 0x01a41ea4, 0x03f0a77d, 0x0158b9fd, 0x01029583, 0x0311859c, 0x02003b06, 0x0317f4c0, 0x00380312}}, Y: Field{[10]uint32{0x0363b99d, 0x007edd65, 0x032fb8c8, 0x000f4d20, 0x00a72a10, 0x02d33346, 0x00d0d957, 0x0134a746, 0x0266c3ec, 0x00189106}}}, + {X: Field{[10]uint32{0x0372ce70, 0x02c8c076, 0x011714cf, 0x03c88560, 0x03ca16be, 0x02dd52f9, 0x03603bd2, 0x02bd4a91, 0x00861af6, 0x001212e1}}, Y: Field{[10]uint32{0x0132fbc7, 0x01f9cb13, 0x02359d47, 0x0314231d, 0x01cf72e5, 0x028299d6, 0x02968652, 0x01e68ff9, 0x03f5a0ac, 0x000dbe13}}}, + {X: Field{[10]uint32{0x00d93f14, 0x0119ee13, 0x02dab210, 0x0338469e, 0x03ca07fe, 0x032f0526, 0x03e6a8a7, 0x007d1286, 0x00ead8b5, 0x00222f96}}, Y: Field{[10]uint32{0x02687fdc, 0x01baf2a4, 0x0067d4d4, 0x03d27c03, 0x018ebbeb, 0x001a5ec6, 0x00d6cd6a, 0x03ef05c7, 0x00af7037, 0x00253043}}}, + {X: Field{[10]uint32{0x03da781b, 0x037a5111, 0x03b77384, 0x0351f058, 0x037372a3, 0x0040466d, 0x0275e11b, 0x035fbd12, 0x02af9fdd, 0x002afdb3}}, Y: Field{[10]uint32{0x0395d290, 0x003b3319, 0x0259a796, 0x024a0712, 0x01417183, 0x026ed3bd, 0x01fe2f3b, 0x0319eba7, 0x030c6320, 0x00172b6c}}}, + {X: Field{[10]uint32{0x009d173a, 0x020e13ae, 0x03deb74f, 0x00365598, 0x014e221e, 0x01f1b0f3, 0x03cf10a1, 0x0196c99f, 0x01229ef6, 0x003a3099}}, Y: Field{[10]uint32{0x022aeeb3, 0x02b847f2, 0x00934035, 0x009a7f34, 0x02bec7ba, 0x00364591, 0x031965b3, 0x0143bf48, 0x03adf9b0, 0x00269a7e}}}, + {X: Field{[10]uint32{0x01c6c23e, 0x03e93ff6, 0x0358df60, 0x03aa47ff, 0x01e031f3, 0x021a0c55, 0x0270a24e, 0x03b2e579, 0x03d8bf72, 0x0019994a}}, Y: Field{[10]uint32{0x00be994e, 0x0168ea4c, 0x03b3b4b6, 0x00054b73, 0x0205fa69, 0x03d98c29, 0x002fbb66, 0x00adcc8b, 0x00083f18, 0x0012113b}}}, + {X: Field{[10]uint32{0x002c0964, 0x0094b753, 0x02f0badf, 0x01054caa, 0x0075cac8, 0x016fdb56, 0x00202c44, 0x00410372, 0x00c2d842, 0x00081e20}}, Y: Field{[10]uint32{0x01860cfd, 0x01b47c30, 0x01c54e91, 0x024c203f, 0x010a562d, 0x0324a9ec, 0x00ef3167, 0x013786b9, 0x01d73eb2, 0x000ac606}}}, + {X: Field{[10]uint32{0x0013f581, 0x03f65648, 0x030cc763, 0x00b1f649, 0x007e8f26, 0x03437fda, 0x0133485e, 0x01a4bbb2, 0x01e453d0, 0x0011ae6f}}, Y: Field{[10]uint32{0x014f9bf7, 0x02af4b28, 0x022256ec, 0x021a7cbf, 0x01394cc7, 0x00216df5, 0x019b0d63, 0x026703d2, 0x03e63ae5, 0x00162be6}}}, + {X: Field{[10]uint32{0x01ea3e11, 0x00759e5d, 0x0278b82b, 0x015758a6, 0x02a2fa25, 0x00a6bcea, 0x0356e2f0, 0x03974025, 0x0174dbeb, 0x001766c9}}, Y: Field{[10]uint32{0x02e59263, 0x01ed9143, 0x030f02b8, 0x02405963, 0x03f3a641, 0x018a5d63, 0x023dd507, 0x031a3f3b, 0x00acaa6a, 0x003b67d0}}}, + {X: Field{[10]uint32{0x02590e4f, 0x01b05c9b, 0x02c52d08, 0x035ddf3f, 0x03dc598f, 0x01dd0ce2, 0x036a6491, 0x01909669, 0x01828b98, 0x003b2d6b}}, Y: Field{[10]uint32{0x01887886, 0x02637cb2, 0x034e301d, 0x029f3312, 0x0365d33e, 0x00be084b, 0x014b5bf5, 0x0361faa5, 0x013673c6, 0x0000ade2}}}, + {X: Field{[10]uint32{0x0124ea67, 0x03294c8e, 0x0296e8f3, 0x0267f243, 0x00ddd62e, 0x00037957, 0x01747250, 0x006e2874, 0x00c15e71, 0x002ccad9}}, Y: Field{[10]uint32{0x02ac2083, 0x02c30929, 0x016a5403, 0x013783f8, 0x024d81b8, 0x01f92f86, 0x027a94de, 0x02b7c8d2, 0x01d36dce, 0x002bd758}}}, + {X: Field{[10]uint32{0x020cd364, 0x0023f160, 0x034ab1c3, 0x010aa002, 0x008b7f68, 0x033daacf, 0x0157aa15, 0x008cd29b, 0x031b7158, 0x00144dfd}}, Y: Field{[10]uint32{0x01f1eab4, 0x0194a913, 0x00381efa, 0x00e25596, 0x010e4a3b, 0x025d5dc4, 0x02a248d4, 0x01f6ac31, 0x03ecc9b1, 0x003dfa97}}}, + {X: Field{[10]uint32{0x029ea866, 0x0158a5f3, 0x01539e7c, 0x01958c58, 0x0025f94e, 0x00070fd7, 0x0113a898, 0x016224f8, 0x021a390b, 0x002e6ec3}}, Y: Field{[10]uint32{0x00324a11, 0x01a547c2, 0x0080e6b6, 0x02a094e6, 0x01247f60, 0x0207938c, 0x00e14ece, 0x00d7eeb9, 0x00903c3d, 0x003636cf}}}, + {X: Field{[10]uint32{0x024fe9af, 0x03ad1a24, 0x027d317b, 0x024bb060, 0x0388cc11, 0x0310bd1e, 0x0291c211, 0x003b0811, 0x01676da4, 0x000fc246}}, Y: Field{[10]uint32{0x02bb8de9, 0x0177d705, 0x01395877, 0x02f74ff3, 0x00ba4c04, 0x00e341c9, 0x02e6a812, 0x00b07c62, 0x00263e88, 0x003c6d12}}}, + {X: Field{[10]uint32{0x0093b4fe, 0x016b2236, 0x00ed80d5, 0x011f5897, 0x003767da, 0x01c286cb, 0x015e7afc, 0x01803a35, 0x01f1dad4, 0x002d7e89}}, Y: Field{[10]uint32{0x02d22347, 0x024e6ca2, 0x0270e1d6, 0x000ee85e, 0x0183e495, 0x02927426, 0x013a1908, 0x00a5b1fb, 0x0261f2ba, 0x001d5d7d}}}, + {X: Field{[10]uint32{0x000d17b0, 0x031bdf5a, 0x000183d4, 0x03a9ac73, 0x01e4ca06, 0x000dcc1a, 0x01b797e9, 0x00096de3, 0x00e2dc6a, 0x00280dc7}}, Y: Field{[10]uint32{0x0059919d, 0x01f10cba, 0x036bc693, 0x01d1712b, 0x0024f0ff, 0x01666ddd, 0x011c5214, 0x00173ba1, 0x00a89a50, 0x0024ad6a}}}, + {X: Field{[10]uint32{0x02e2f210, 0x02650a87, 0x02c8c7b1, 0x00a36896, 0x00cd0a98, 0x01f50808, 0x0063967d, 0x02441de2, 0x029000a4, 0x0016ab9b}}, Y: Field{[10]uint32{0x03ee8fd7, 0x00393ded, 0x03957576, 0x031335e0, 0x017e82fd, 0x01e7b0e6, 0x03218f7b, 0x013cfff5, 0x002082a5, 0x0003b673}}}, + {X: Field{[10]uint32{0x020841a0, 0x034a8a06, 0x03b053fe, 0x02cb9b39, 0x0164efdd, 0x01437ad9, 0x000f9648, 0x02dbd2c4, 0x02ecf4a9, 0x001539f6}}, Y: Field{[10]uint32{0x03c9c63d, 0x00f7b2a5, 0x03daecc8, 0x0215c250, 0x0270d467, 0x022cd365, 0x02857ad0, 0x00ea0756, 0x032a5477, 0x00366b68}}}, + {X: Field{[10]uint32{0x03bf44e8, 0x01153223, 0x00d7abdb, 0x0148e47b, 0x00383ed7, 0x01d926e1, 0x00d8be0c, 0x03bd1ad2, 0x0110d8bc, 0x003a6ca6}}, Y: Field{[10]uint32{0x021d6b69, 0x031c0f09, 0x033deb84, 0x024a6a37, 0x03d7a267, 0x00393102, 0x01739655, 0x03a47e94, 0x0094f669, 0x003ac9a0}}}, + {X: Field{[10]uint32{0x02546a97, 0x0385de76, 0x00ef6384, 0x00727f85, 0x013f537a, 0x01df4767, 0x037c5895, 0x02944c65, 0x0222f254, 0x0010fe54}}, Y: Field{[10]uint32{0x01cb18cc, 0x03b3ad5c, 0x035e14b0, 0x02ce5ecf, 0x030eef80, 0x0198a8b7, 0x005b305b, 0x01711fc9, 0x02534334, 0x0035f4f1}}}, + {X: Field{[10]uint32{0x02c3b103, 0x004a52e9, 0x00b1dcc9, 0x01701c89, 0x01672338, 0x005ab921, 0x00bc0902, 0x03ee4a0c, 0x03d53999, 0x0027ed17}}, Y: Field{[10]uint32{0x02bdf451, 0x03deb27f, 0x0213a277, 0x001ae09c, 0x036731b5, 0x0269252e, 0x017bf7f3, 0x020b4e43, 0x001bdbfd, 0x0016d1c2}}}, + {X: Field{[10]uint32{0x031dcce9, 0x032092ed, 0x007f23cb, 0x003882b6, 0x0109ca84, 0x03ad19bd, 0x015919b2, 0x00a734ca, 0x002b8355, 0x0037648a}}, Y: Field{[10]uint32{0x03726371, 0x02a78717, 0x03b7ad58, 0x01a0ed63, 0x01f37962, 0x00788ef3, 0x02f4a29d, 0x0359a2c7, 0x02e7bc59, 0x003b117d}}}, + {X: Field{[10]uint32{0x0016348d, 0x030176b7, 0x01c38686, 0x01bf06b5, 0x01fe2903, 0x00f788f1, 0x019def4f, 0x02f75efe, 0x0012009f, 0x001d20bc}}, Y: Field{[10]uint32{0x0040abd1, 0x0198e9ae, 0x025f8db1, 0x02eb0939, 0x0173fc0d, 0x0196eb44, 0x02b2a20b, 0x03dbc2fc, 0x020d5497, 0x00290f12}}}, + {X: Field{[10]uint32{0x00ebd9a5, 0x029a1a5c, 0x02377a69, 0x00c3dea6, 0x01537fca, 0x016c0c65, 0x012f587a, 0x0189e077, 0x019597fd, 0x003e933f}}, Y: Field{[10]uint32{0x03ae823a, 0x03af8771, 0x0105c1b8, 0x00c428c1, 0x01e2a350, 0x03862a3f, 0x031d269b, 0x03dde2f4, 0x02c99ddb, 0x00115a2d}}}, + {X: Field{[10]uint32{0x03a60b9e, 0x01f4440f, 0x00c53d9b, 0x034c9e51, 0x022f1078, 0x03c7ffaf, 0x0105e1b4, 0x00fa3a06, 0x03dae776, 0x00147834}}, Y: Field{[10]uint32{0x02da6740, 0x00bfca8d, 0x033f7bfa, 0x02948e57, 0x001da673, 0x008423b4, 0x01f20b90, 0x00beb33e, 0x00c4ab57, 0x00046368}}}, + {X: Field{[10]uint32{0x01bc9530, 0x00a99a03, 0x03f86c48, 0x01d3d03a, 0x00502fc6, 0x0227a5bd, 0x003b8572, 0x008cd4e3, 0x027cc055, 0x001f6395}}, Y: Field{[10]uint32{0x02b37571, 0x030ba9a3, 0x00ad7600, 0x00716172, 0x00748458, 0x02a2c985, 0x01fe552b, 0x0111a92e, 0x004600c6, 0x001db0ff}}}, + {X: Field{[10]uint32{0x011dfb1f, 0x00ae52b3, 0x000ed8d1, 0x019e7bd3, 0x011c316d, 0x03e8631e, 0x01f216fd, 0x0065bf74, 0x02d3b400, 0x00364931}}, Y: Field{[10]uint32{0x03ebcea8, 0x00aaa013, 0x012e59d8, 0x00649b1a, 0x0290b9d1, 0x023766e4, 0x01eb3f28, 0x0012e2c4, 0x00ee881c, 0x0003b0cf}}}, + {X: Field{[10]uint32{0x0293c0db, 0x01d115d7, 0x03b8f330, 0x006afe54, 0x033965cb, 0x02a6760a, 0x00d28b97, 0x00a72346, 0x030b06f6, 0x002372cc}}, Y: Field{[10]uint32{0x006857a3, 0x01d3cde9, 0x0097ab6d, 0x0103dbdf, 0x00b58b73, 0x004fe06a, 0x0129b573, 0x0240b46c, 0x01198323, 0x000f628b}}}, + {X: Field{[10]uint32{0x02a5d2b5, 0x01d27daf, 0x02e80d3f, 0x0074d68c, 0x0157910f, 0x036bad9c, 0x0386797d, 0x018de233, 0x023b94b0, 0x00374712}}, Y: Field{[10]uint32{0x03230777, 0x026fb7ac, 0x0064c086, 0x02f1cf5f, 0x003d2afe, 0x02de32de, 0x03e5be9a, 0x0160f590, 0x00c75a69, 0x003befb0}}}, + {X: Field{[10]uint32{0x03f5e772, 0x022a214d, 0x02dab765, 0x03caf1d8, 0x01ec0275, 0x0134a4b0, 0x01f6ec48, 0x035fdce5, 0x02341dfa, 0x000ac0f7}}, Y: Field{[10]uint32{0x03c0d0e3, 0x019a9db0, 0x03bdf971, 0x0346b926, 0x020803d7, 0x027de397, 0x03d48bb4, 0x0160b156, 0x00fb3818, 0x000c8d7a}}}, + {X: Field{[10]uint32{0x0028dde2, 0x01e320c5, 0x03f39479, 0x02f530f9, 0x02677f06, 0x01addc4c, 0x03a80efa, 0x016f25f9, 0x030fba14, 0x000e9e56}}, Y: Field{[10]uint32{0x00914691, 0x037d5e51, 0x0352b526, 0x013a8fc4, 0x0081af64, 0x03b502bb, 0x00bc9e1e, 0x022898df, 0x039ddf03, 0x003d0496}}}, + {X: Field{[10]uint32{0x004fcbbf, 0x0301621a, 0x01e59ef8, 0x0085e234, 0x03121f5c, 0x002a1476, 0x006c081b, 0x035b2e71, 0x013ba133, 0x0003b3e0}}, Y: Field{[10]uint32{0x03e53560, 0x035dce04, 0x020930ec, 0x0057af84, 0x02597e39, 0x02254a70, 0x02becd07, 0x02d1cdfc, 0x02f2a7b7, 0x001a7836}}}, + {X: Field{[10]uint32{0x02217d5a, 0x01a461b5, 0x00c33576, 0x01154da3, 0x03743832, 0x0138274f, 0x037191dd, 0x018f9040, 0x0182c141, 0x0018df12}}, Y: Field{[10]uint32{0x02ecb410, 0x03695cf7, 0x00b77a74, 0x011d6b19, 0x00f6fb37, 0x028de0c6, 0x03aaa5c0, 0x034b8c96, 0x02b8fd83, 0x0036968a}}}, + {X: Field{[10]uint32{0x01b90e87, 0x022cf8dc, 0x037c6b19, 0x01604947, 0x00542556, 0x0014c368, 0x03f5fac2, 0x016d5f73, 0x03a2d887, 0x00067f9c}}, Y: Field{[10]uint32{0x00151ca0, 0x027de836, 0x01ad35a3, 0x0204a3f0, 0x01a32646, 0x03f97a2e, 0x027a77a1, 0x0094630d, 0x00182ccc, 0x000ec0eb}}}, + {X: Field{[10]uint32{0x03b7ebb2, 0x0156dfce, 0x0023471d, 0x02f7c513, 0x00c68b4c, 0x02d9a02c, 0x01151b30, 0x03700027, 0x022a0d4c, 0x00005ba9}}, Y: Field{[10]uint32{0x013fa629, 0x03f3a779, 0x01f6a8ff, 0x0180b8ee, 0x0135f020, 0x02566030, 0x00612a89, 0x00b964ce, 0x021c5367, 0x00232b12}}}, + {X: Field{[10]uint32{0x02a40970, 0x00d4e508, 0x012e849f, 0x0217efd4, 0x00e1eed4, 0x01e7e68a, 0x00e54132, 0x01b4859e, 0x00b5454c, 0x001ae75a}}, Y: Field{[10]uint32{0x02365482, 0x02c6c9eb, 0x01472fa4, 0x01952c17, 0x03907f85, 0x02a223ad, 0x01e6969d, 0x038df6be, 0x004498eb, 0x002d8fd4}}}, + {X: Field{[10]uint32{0x035ed3e6, 0x037449c2, 0x01d05868, 0x01f48c59, 0x0232c3c2, 0x03edfb24, 0x03dc948a, 0x0204b0b9, 0x008c08f0, 0x0007e883}}, Y: Field{[10]uint32{0x01838076, 0x0137ad8a, 0x020cfed8, 0x015ca029, 0x026cd168, 0x0308a7fa, 0x03686062, 0x00d909f7, 0x034d8213, 0x0031495f}}}, + {X: Field{[10]uint32{0x036acc86, 0x0229a86f, 0x02263e8e, 0x00e2f941, 0x02af15bb, 0x00763d4d, 0x031df6b3, 0x02d37873, 0x00927dae, 0x001cea0f}}, Y: Field{[10]uint32{0x02eb8adc, 0x01eb5aa0, 0x000ab2fb, 0x02af937d, 0x0126a21d, 0x02326e24, 0x034e24de, 0x030c2e0a, 0x03e40cd6, 0x002822b2}}}, + {X: Field{[10]uint32{0x0188bdbe, 0x01d87b9d, 0x015a48e1, 0x033bf4a9, 0x0285ba90, 0x03389978, 0x0278cf93, 0x00b7bb28, 0x0264924e, 0x000ea655}}, Y: Field{[10]uint32{0x00cbbb0e, 0x02351711, 0x00f39dd4, 0x02f40edf, 0x02d011a1, 0x0072bc63, 0x0065d939, 0x00cf4d49, 0x02dc99eb, 0x003cc886}}}, + {X: Field{[10]uint32{0x01429c26, 0x01fc9a4f, 0x005965e0, 0x03ead3e2, 0x025ca516, 0x030583a1, 0x005cd9b9, 0x03d73075, 0x0219b032, 0x001f197b}}, Y: Field{[10]uint32{0x023704c5, 0x015ca900, 0x02287ff9, 0x0178dd0f, 0x018cc54a, 0x02f88893, 0x01076ae4, 0x03c9df4c, 0x02f90e3d, 0x0011f1fe}}}, + {X: Field{[10]uint32{0x00d397dc, 0x0002c8b9, 0x00fb03dc, 0x0365976e, 0x032f05e6, 0x0332e340, 0x0153118d, 0x036ef6f6, 0x014c6750, 0x0030041a}}, Y: Field{[10]uint32{0x008e730c, 0x020ee01b, 0x01be2395, 0x00054b50, 0x025a5e61, 0x0065bc4c, 0x01fde10a, 0x01510567, 0x00c6dd6c, 0x000ed245}}}, + {X: Field{[10]uint32{0x02519d57, 0x005f3d98, 0x03ae75e3, 0x00b29c8f, 0x01a33dcb, 0x0084d84c, 0x015a12b9, 0x022db5be, 0x008ed28d, 0x00389561}}, Y: Field{[10]uint32{0x03cfb7b6, 0x0364990f, 0x02fe4d36, 0x03007841, 0x00377c9a, 0x02060ec9, 0x0207dcd1, 0x036b5e60, 0x01aa1757, 0x0018bdf5}}}, + {X: Field{[10]uint32{0x00236ed9, 0x0295b40b, 0x03c45bd1, 0x029ddbbf, 0x01a9669d, 0x00778c34, 0x0078dfbf, 0x00a648ea, 0x00e57323, 0x003cc506}}, Y: Field{[10]uint32{0x0256b84c, 0x008d2e2b, 0x01552af7, 0x03d87e22, 0x0316a1ef, 0x00c2d6bb, 0x0234c8a6, 0x03651957, 0x0084dce0, 0x00398aae}}}, + {X: Field{[10]uint32{0x01703181, 0x004b0aef, 0x03770615, 0x026ba319, 0x021f3f3c, 0x01f079aa, 0x01c290d4, 0x00c4eeb2, 0x0145b876, 0x00026b6e}}, Y: Field{[10]uint32{0x030908fd, 0x01d347a7, 0x00f8650f, 0x003b7c3c, 0x0251531d, 0x03777cac, 0x020b82be, 0x00985920, 0x0142b463, 0x002c87f0}}}, + {X: Field{[10]uint32{0x008da322, 0x01b0f160, 0x03f36172, 0x01182e0e, 0x03ca04b8, 0x00d6ce42, 0x01132e9b, 0x018e8615, 0x032b9d4a, 0x00311a0a}}, Y: Field{[10]uint32{0x035f6972, 0x02d740f4, 0x025a26ee, 0x016a0d73, 0x0014e907, 0x00f8dbc1, 0x02597622, 0x02e8c86d, 0x006a7100, 0x003c96a4}}}, + {X: Field{[10]uint32{0x0280d63a, 0x028419ba, 0x0003da99, 0x03ceb810, 0x02559159, 0x025f1d97, 0x027c4055, 0x02711e05, 0x016d60f4, 0x003aec3f}}, Y: Field{[10]uint32{0x02a0b0f7, 0x0321a39a, 0x00350afd, 0x019dc1bd, 0x00c4202f, 0x022d0c72, 0x022ffcf2, 0x03218876, 0x0160667a, 0x003acdf4}}}, + {X: Field{[10]uint32{0x01a5597a, 0x006f2f02, 0x0334e355, 0x026257d5, 0x0165ffb0, 0x03fd8dfc, 0x0267cbbb, 0x02f2d000, 0x012070d8, 0x001e3c4b}}, Y: Field{[10]uint32{0x03bb78f8, 0x005c240a, 0x037407de, 0x038ce65c, 0x037419a3, 0x021f6672, 0x03574d2c, 0x005d586e, 0x02b33662, 0x0010a5da}}}, + {X: Field{[10]uint32{0x01919f69, 0x022befa1, 0x01eee579, 0x02ef9d9e, 0x0235ae41, 0x02525886, 0x039fbc2b, 0x012d8e60, 0x004af621, 0x0000f7ff}}, Y: Field{[10]uint32{0x03f2c456, 0x03fab615, 0x020e9036, 0x03fa40a1, 0x02a13480, 0x02765d40, 0x01d15a42, 0x0086b88b, 0x036b1b40, 0x001605d2}}}, + {X: Field{[10]uint32{0x015a15cc, 0x0175d16d, 0x028bf55d, 0x0034c914, 0x00bd16bf, 0x036ddbae, 0x015198f4, 0x010b2884, 0x0393a4ed, 0x00104324}}, Y: Field{[10]uint32{0x02d58306, 0x03ea8297, 0x003d7059, 0x0069cc7f, 0x0283c298, 0x0328945d, 0x00c2cf9b, 0x02e26f05, 0x00b1df71, 0x001013fd}}}, + {X: Field{[10]uint32{0x024e3649, 0x01b1256f, 0x031966c1, 0x01a599e5, 0x00b93e65, 0x03f9a5df, 0x03366326, 0x02c1e4f7, 0x015687d6, 0x001ad354}}, Y: Field{[10]uint32{0x0169f4e3, 0x0304697a, 0x01c815d6, 0x002a5544, 0x001a2556, 0x036c5d83, 0x02a03152, 0x0081fd74, 0x0094bbac, 0x00191e92}}}, + {X: Field{[10]uint32{0x01f34247, 0x01c716e9, 0x01fd94a7, 0x0091af93, 0x016f0d87, 0x00017670, 0x03ccfd85, 0x01661bc2, 0x017ae87d, 0x00163feb}}, Y: Field{[10]uint32{0x00069817, 0x0173c03c, 0x02ce5e50, 0x01afb8da, 0x03b33fba, 0x03218a70, 0x00d6f93e, 0x0057ebd4, 0x02d8f9ab, 0x002b62de}}}, + {X: Field{[10]uint32{0x02a757fd, 0x003ab3e9, 0x02c72b31, 0x01a5ca24, 0x00adb956, 0x00fa20ed, 0x03277382, 0x03eb782b, 0x001d1835, 0x0039b4f9}}, Y: Field{[10]uint32{0x01359c15, 0x0283bc08, 0x02e61045, 0x02aed09e, 0x03d6395c, 0x036f6e3b, 0x0303e425, 0x03b39f3b, 0x008cb580, 0x00284db2}}}, + {X: Field{[10]uint32{0x01953b35, 0x02ba51c3, 0x032a5573, 0x010828b4, 0x023b561b, 0x006f0409, 0x01044792, 0x0280c2b0, 0x022b43aa, 0x003f11f1}}, Y: Field{[10]uint32{0x006224f0, 0x00c18009, 0x03b29502, 0x00982ce4, 0x01627236, 0x00287d44, 0x02b58104, 0x01e019cc, 0x011d65fc, 0x00174c63}}}, + {X: Field{[10]uint32{0x03db251b, 0x02b2df1b, 0x031ca36b, 0x028a4cf2, 0x02d0a1b8, 0x00d54e19, 0x0278da90, 0x00deec23, 0x0067cbcb, 0x0033ab8a}}, Y: Field{[10]uint32{0x02bb3dfd, 0x00b47742, 0x00c16d4c, 0x00a4e862, 0x03956cc6, 0x010dc9ed, 0x0017b373, 0x02aa55e5, 0x007ec163, 0x00122fcb}}}, + {X: Field{[10]uint32{0x03efeab0, 0x02090f86, 0x02d78daa, 0x01d3225c, 0x039195fb, 0x0145b621, 0x03408d82, 0x00d6d708, 0x0378c847, 0x002aec48}}, Y: Field{[10]uint32{0x0366698e, 0x01646ccf, 0x01a02abb, 0x00d99c10, 0x01ce901c, 0x032295b6, 0x010be913, 0x02919767, 0x024b0da5, 0x001682fd}}}, + {X: Field{[10]uint32{0x0159eeaf, 0x03a9c00c, 0x0024f274, 0x03a50e92, 0x021a576c, 0x038458c5, 0x005302b0, 0x031f2486, 0x02398330, 0x0035de07}}, Y: Field{[10]uint32{0x0106651a, 0x01192bc3, 0x03310fbb, 0x02665bdb, 0x01261aed, 0x006f8f5f, 0x027398dd, 0x03171cfb, 0x00324e07, 0x0018d069}}}, + {X: Field{[10]uint32{0x024c760c, 0x02dda11f, 0x01a6dbe5, 0x00cf7f50, 0x016f3ad1, 0x00a8877c, 0x0171646d, 0x008115cb, 0x01cd46ec, 0x0029a463}}, Y: Field{[10]uint32{0x0132fa9c, 0x015b9f42, 0x034e51f0, 0x03ecbd98, 0x001d6c7c, 0x01484e5f, 0x030e4b53, 0x01263669, 0x02ba378d, 0x00303946}}}, + {X: Field{[10]uint32{0x03d1a204, 0x001132a0, 0x027706ef, 0x03809234, 0x027785e2, 0x017f65c1, 0x02b340a6, 0x037980e4, 0x02e4fbb5, 0x00104e93}}, Y: Field{[10]uint32{0x023dd197, 0x03c5cbe2, 0x027c343a, 0x01d1476c, 0x016595a6, 0x006c23f4, 0x02bc668d, 0x023cd0ef, 0x0106c18a, 0x00280d89}}}, + {X: Field{[10]uint32{0x0204001c, 0x00560717, 0x011a8968, 0x01988dcc, 0x0287fd87, 0x03ef4449, 0x004aa082, 0x002483db, 0x0024de8b, 0x003869ef}}, Y: Field{[10]uint32{0x026bed16, 0x02ac4006, 0x0249b29b, 0x02c7bea3, 0x013a3d90, 0x00695719, 0x01aeea26, 0x021cf452, 0x01fdd0a2, 0x000f8eea}}}, + {X: Field{[10]uint32{0x01333a75, 0x0283f0f7, 0x0142d8a9, 0x026c5e56, 0x01ab1dde, 0x028cdf81, 0x02e077f8, 0x033312d6, 0x02a0a147, 0x003fe4a4}}, Y: Field{[10]uint32{0x0223a166, 0x03d6de1e, 0x007a43b6, 0x00ae0c17, 0x02b555ea, 0x016b577f, 0x014b4122, 0x00d18dd9, 0x027c5f7a, 0x003943c0}}}, + {X: Field{[10]uint32{0x00cb9c0c, 0x000e7513, 0x0140d900, 0x03186600, 0x03afe849, 0x001170b4, 0x007a36b0, 0x02774e77, 0x0223437c, 0x003ab959}}, Y: Field{[10]uint32{0x0132e043, 0x01a25d37, 0x037be39f, 0x0100dcb5, 0x0055e62e, 0x00bf9f9e, 0x02b5a9b2, 0x01d0db72, 0x01e99284, 0x003c6e32}}}, + {X: Field{[10]uint32{0x00bd5282, 0x000b2d55, 0x012273d0, 0x0012f322, 0x017f9c60, 0x01230e79, 0x02da0f30, 0x028f7f87, 0x00be3467, 0x001f7483}}, Y: Field{[10]uint32{0x001485d0, 0x01a9a25f, 0x014c64eb, 0x020a377f, 0x02ee9225, 0x005dca91, 0x034c3f83, 0x034b5533, 0x0323f035, 0x003b134b}}}, + {X: Field{[10]uint32{0x02a877eb, 0x00b68fc4, 0x03fc73a0, 0x03af6c36, 0x03e4e245, 0x00ef68f0, 0x03b88703, 0x004a4551, 0x01cc5acf, 0x000d6604}}, Y: Field{[10]uint32{0x0108a792, 0x02b3663a, 0x03a59bb6, 0x02f8ada0, 0x037702d1, 0x00470e89, 0x03f916f5, 0x028f781b, 0x00878b97, 0x003b4bd4}}}, + {X: Field{[10]uint32{0x01a71c24, 0x00440b92, 0x005a2c03, 0x03282f18, 0x035a6c76, 0x00689346, 0x02d57ea0, 0x0329393a, 0x009cf2bc, 0x003eccfa}}, Y: Field{[10]uint32{0x031c9f45, 0x00a1874b, 0x0180e019, 0x010309ba, 0x03d7fca9, 0x00aa49cb, 0x035b9584, 0x009c15ea, 0x02f5ca60, 0x0031d780}}}, + {X: Field{[10]uint32{0x01f687aa, 0x03aed5b9, 0x036069d1, 0x003bca4e, 0x01b7b297, 0x0016944a, 0x034f836b, 0x01d28054, 0x033e5eed, 0x00028734}}, Y: Field{[10]uint32{0x02c4a6b0, 0x01e34207, 0x01abcc99, 0x01ea25a8, 0x01bdefc3, 0x0390e03a, 0x02b60cc1, 0x030d14ec, 0x02b90ccf, 0x003e4346}}}, + {X: Field{[10]uint32{0x00213614, 0x014d4131, 0x00999b85, 0x027876cc, 0x025d9f16, 0x03b62b24, 0x03383cfc, 0x00edeafe, 0x02b90364, 0x001185a5}}, Y: Field{[10]uint32{0x0033bc72, 0x0035668c, 0x018d60de, 0x0339a566, 0x03ee91c4, 0x02bafff4, 0x0340a859, 0x003e8323, 0x00775f30, 0x0019d3d7}}}, + {X: Field{[10]uint32{0x014ab025, 0x00356f78, 0x01727f39, 0x03c89d1c, 0x021fd5cd, 0x00fdfa2a, 0x00885ae9, 0x027daf33, 0x02221b58, 0x001b1aaa}}, Y: Field{[10]uint32{0x02077538, 0x034b2eea, 0x0015c9f8, 0x005e2329, 0x02aeb844, 0x02d43e9d, 0x0164483f, 0x02e4346b, 0x020340e1, 0x0029df17}}}, + {X: Field{[10]uint32{0x0261c38b, 0x013f35d3, 0x00268387, 0x0069cab3, 0x01792eff, 0x039ca79b, 0x032c7ee6, 0x00cc4340, 0x0391927f, 0x00324634}}, Y: Field{[10]uint32{0x000dfb5b, 0x010f201e, 0x03965742, 0x01c9b89f, 0x00fce24a, 0x016db2d6, 0x021bed0e, 0x0123e3b6, 0x006c3460, 0x00163f5d}}}, + {X: Field{[10]uint32{0x01ea5918, 0x03b1625b, 0x022c2142, 0x03c0cfef, 0x019240c3, 0x004f1253, 0x02c26542, 0x028fd792, 0x02161ca0, 0x001219e7}}, Y: Field{[10]uint32{0x021d1a41, 0x0347c78f, 0x004a9a30, 0x039e73c8, 0x03b2a19f, 0x019e1038, 0x03a29667, 0x02bf8fa4, 0x03fe300c, 0x00155be4}}}, + {X: Field{[10]uint32{0x02e7b858, 0x01a28c31, 0x02584699, 0x0166b11a, 0x025e9456, 0x02ab0216, 0x02d6eede, 0x0191029c, 0x01a9e46b, 0x0031a301}}, Y: Field{[10]uint32{0x01de450d, 0x00991805, 0x032b61b1, 0x01a934af, 0x03c76874, 0x000da845, 0x03d64a1d, 0x03fe02f8, 0x01dc35d4, 0x002e2d2d}}}, + {X: Field{[10]uint32{0x01444e6a, 0x00e1d5e7, 0x02dc9f05, 0x038dbcc9, 0x0121e3df, 0x01b151a6, 0x0176dc4b, 0x01227e3e, 0x03106358, 0x00344cfb}}, Y: Field{[10]uint32{0x02f968cb, 0x00f140ae, 0x005becbf, 0x03af8cad, 0x02327ec3, 0x03f59a9b, 0x02b0f57a, 0x0034b09c, 0x03c4db69, 0x000b19aa}}}, + {X: Field{[10]uint32{0x01f976ae, 0x02b416cf, 0x0119392d, 0x01828807, 0x0261ca0a, 0x0229f8b6, 0x00766dc4, 0x0277aac4, 0x03598d75, 0x0014d513}}, Y: Field{[10]uint32{0x0069cd47, 0x010aff8a, 0x017e879a, 0x00454df8, 0x030993d7, 0x028666b5, 0x004e3f03, 0x01ebbc08, 0x005e61cb, 0x00112688}}}, + {X: Field{[10]uint32{0x03b8b331, 0x00d2b2e0, 0x00a622fe, 0x0177b8dd, 0x009254c6, 0x012dadf0, 0x02263851, 0x0144cce7, 0x00740fda, 0x000c4228}}, Y: Field{[10]uint32{0x028b6243, 0x00c04c89, 0x0115b5d9, 0x0347d678, 0x00d6fc05, 0x030bc891, 0x01a473da, 0x00ffaa2c, 0x010d5426, 0x0010bb72}}}, + {X: Field{[10]uint32{0x00b4b23c, 0x0336329f, 0x03962154, 0x0301ac8b, 0x012ee58a, 0x03ad5618, 0x0295099a, 0x00701367, 0x000d052c, 0x000599b1}}, Y: Field{[10]uint32{0x03a82fb9, 0x01112c64, 0x0284fb6c, 0x011f4807, 0x00abafc2, 0x001d4a55, 0x0355923e, 0x0198e2aa, 0x0341ae04, 0x0014196e}}}, + {X: Field{[10]uint32{0x0247722e, 0x01c915fb, 0x02ad53a5, 0x0242ef57, 0x02ed80fa, 0x01dacb60, 0x001290df, 0x039aa3c0, 0x03ebd3ee, 0x00325b41}}, Y: Field{[10]uint32{0x0220baf3, 0x0370b31f, 0x032c8d00, 0x0391e290, 0x0113ba06, 0x0262dd27, 0x0016af17, 0x02dfa68d, 0x0004447f, 0x0034f5a7}}}, + {X: Field{[10]uint32{0x0181b49d, 0x02136447, 0x03479fce, 0x02f5ecb0, 0x00647fa7, 0x0339d50b, 0x0369a9e8, 0x016c15e1, 0x0039b11b, 0x0002a7ff}}, Y: Field{[10]uint32{0x00bcbee7, 0x0348489a, 0x03747375, 0x0124e394, 0x0280a644, 0x016101c4, 0x00894dc2, 0x00a3dfa6, 0x024882e9, 0x002fb084}}}, + {X: Field{[10]uint32{0x03af0632, 0x0317eefd, 0x00f2737f, 0x01fc6980, 0x03e82578, 0x024c83f4, 0x015d3f52, 0x024e0239, 0x028ccd4c, 0x0014b284}}, Y: Field{[10]uint32{0x0135f7c4, 0x010b378c, 0x02ec370f, 0x024e0d9d, 0x0137ffa4, 0x03676fee, 0x02bab014, 0x0232ded3, 0x028095a9, 0x00211ba2}}}, + {X: Field{[10]uint32{0x01407c20, 0x03e8d3aa, 0x039ae8e0, 0x00948ca6, 0x00006985, 0x0127df25, 0x00abc41e, 0x02649dee, 0x02c177fd, 0x003fe4aa}}, Y: Field{[10]uint32{0x03fdcfb5, 0x01e7d163, 0x03331a33, 0x024d0a91, 0x03dafd9a, 0x01c8c0dc, 0x03bf2a9b, 0x0149cfae, 0x00dd5aaf, 0x002bc363}}}, + {X: Field{[10]uint32{0x03991e0c, 0x007406c9, 0x03f09a54, 0x02c75ca7, 0x025fb653, 0x005340be, 0x0163c973, 0x0028f0e0, 0x033ed3c1, 0x0029a4a9}}, Y: Field{[10]uint32{0x0068b905, 0x026f9a79, 0x03809cff, 0x0126694d, 0x02aa05c9, 0x02e09056, 0x0063d006, 0x034fa036, 0x015a3e5b, 0x0001c8bd}}}, + {X: Field{[10]uint32{0x0120aefd, 0x031ffb50, 0x024e2e2f, 0x0298c573, 0x006b813b, 0x03263520, 0x02fc4cd2, 0x026a4f8c, 0x003f7a62, 0x00367967}}, Y: Field{[10]uint32{0x030214bb, 0x023853eb, 0x00d30eb0, 0x00e44eaa, 0x013234be, 0x002691ff, 0x01bf6589, 0x00c4653d, 0x01942307, 0x00093389}}}, + {X: Field{[10]uint32{0x00a0f6ff, 0x02394d01, 0x0358714b, 0x0169816a, 0x034dde8d, 0x02af3c16, 0x0191ef79, 0x02c42592, 0x030f7771, 0x001d3949}}, Y: Field{[10]uint32{0x03b1670f, 0x02c1186c, 0x0088714b, 0x0199a455, 0x0371ced0, 0x00d5ac78, 0x03a285f1, 0x00fc25a1, 0x01a3a4a8, 0x000ab618}}}, + {X: Field{[10]uint32{0x01d4420c, 0x0007d64c, 0x03f587a2, 0x0292161f, 0x02744668, 0x0255f0e8, 0x02856157, 0x03df9d86, 0x02301c43, 0x002e45a4}}, Y: Field{[10]uint32{0x0019536f, 0x007dd396, 0x03e5bebe, 0x008fd6c8, 0x03659ea4, 0x01945696, 0x01818e0c, 0x020a0133, 0x025bc126, 0x002f4d81}}}, + {X: Field{[10]uint32{0x024d51ee, 0x00e7640d, 0x03cd8792, 0x0325654e, 0x02cd01fd, 0x0016dfec, 0x02d72115, 0x01a36a5c, 0x02538645, 0x000dfebc}}, Y: Field{[10]uint32{0x03c15f85, 0x0127ab4e, 0x02823657, 0x008dbdef, 0x01d8c125, 0x028ef258, 0x02ea7360, 0x02cf9f9a, 0x02ce749d, 0x002da6b8}}}, + {X: Field{[10]uint32{0x020cf8d2, 0x0021eee8, 0x0214b43b, 0x02630661, 0x011c379f, 0x00373419, 0x0082477f, 0x004e2cd2, 0x014c4a1c, 0x00386504}}, Y: Field{[10]uint32{0x0098a93b, 0x00dd62ba, 0x00d6789e, 0x034f5c75, 0x00889f2a, 0x01452a66, 0x0182cf06, 0x0388b8ec, 0x034bb90a, 0x001e8ebe}}}, + {X: Field{[10]uint32{0x0217ddaa, 0x0150de7e, 0x0333cca0, 0x03bc245c, 0x011c8b13, 0x02056234, 0x008e4b3c, 0x02d145ce, 0x03010d3f, 0x000b38b6}}, Y: Field{[10]uint32{0x027bbbc0, 0x00c35dcd, 0x00922e2c, 0x02ce0043, 0x0074285c, 0x0346955a, 0x021529ae, 0x01daa617, 0x029daf0e, 0x00248cb6}}}, + {X: Field{[10]uint32{0x016f051f, 0x0063e7cf, 0x01f49986, 0x01b9658d, 0x000bd66c, 0x03fa9da2, 0x00e2e821, 0x01c114f7, 0x00484bdb, 0x0030a4bb}}, Y: Field{[10]uint32{0x03b57d6d, 0x0067b225, 0x008872b1, 0x00d849bd, 0x0312b777, 0x03454c91, 0x00af49bf, 0x039a7134, 0x00f06b81, 0x0008429d}}}, + {X: Field{[10]uint32{0x01acfeee, 0x00c80da9, 0x002ad3e1, 0x020f5ded, 0x020933db, 0x0360eb4f, 0x03b423cc, 0x022bbda5, 0x01c09761, 0x00056f32}}, Y: Field{[10]uint32{0x008a7a33, 0x00ea01ae, 0x0211c1a8, 0x02a403a5, 0x01a1bb98, 0x01244b28, 0x033c4901, 0x025bf6fe, 0x02f11bb9, 0x003a7f1f}}}, + {X: Field{[10]uint32{0x021e7785, 0x0132c91b, 0x03113fd2, 0x031a6756, 0x00848639, 0x017cb4a6, 0x03e45fe5, 0x00ef5e5e, 0x00af50f1, 0x00118467}}, Y: Field{[10]uint32{0x0042ea3b, 0x009ea4c2, 0x01215b13, 0x00056bac, 0x00ba3015, 0x03be4cad, 0x022cf8f9, 0x01bae5dd, 0x0391f4c5, 0x001a880f}}}, + {X: Field{[10]uint32{0x02f9ecf4, 0x037e216d, 0x03a649d9, 0x025179ac, 0x01cf1410, 0x03687e7f, 0x0149a3d2, 0x03c60aa5, 0x03943e4d, 0x003ce85d}}, Y: Field{[10]uint32{0x02cf7e8f, 0x033b041b, 0x02115c80, 0x03ff20bb, 0x00444a1d, 0x0167e0ca, 0x02b66198, 0x02b4e7f0, 0x03cc5e82, 0x002cd3ad}}}, + {X: Field{[10]uint32{0x03913fe4, 0x001d71ad, 0x03d67536, 0x03e940a5, 0x01fa98bd, 0x016e6831, 0x01cbd45f, 0x03d1a36e, 0x027484a7, 0x0033be42}}, Y: Field{[10]uint32{0x02301815, 0x0290289a, 0x0173730f, 0x01579715, 0x01fb79a5, 0x00941e1d, 0x03029465, 0x03ef0a19, 0x02ad2a43, 0x0034243b}}}, + {X: Field{[10]uint32{0x035702ce, 0x031bb4a8, 0x00b06833, 0x02dae418, 0x0126c528, 0x02fe9598, 0x00b88b24, 0x02a4e3b1, 0x0214987a, 0x00087628}}, Y: Field{[10]uint32{0x004579e4, 0x019bc9b6, 0x03c8e94b, 0x03a69407, 0x00f736df, 0x00228a0c, 0x028167c0, 0x0288ef18, 0x000d5b65, 0x0030d50d}}}, + {X: Field{[10]uint32{0x021ca53e, 0x00e5460e, 0x0361d5d1, 0x03e91b81, 0x00e19196, 0x020b6f49, 0x0204f6cf, 0x02f9298a, 0x03279049, 0x001ac63f}}, Y: Field{[10]uint32{0x01ffa3b7, 0x033f6cb1, 0x038d86ca, 0x035c948b, 0x026343f0, 0x01a63e8c, 0x001e9b26, 0x004d9e3e, 0x030c52c0, 0x003be01b}}}, + {X: Field{[10]uint32{0x03466e6f, 0x02b8c772, 0x020ee850, 0x00db0206, 0x00bab07c, 0x028f99cf, 0x0332afbe, 0x03301354, 0x00f20452, 0x001f63bd}}, Y: Field{[10]uint32{0x00fa0c0d, 0x0298910b, 0x017bc137, 0x011fc644, 0x01d224da, 0x03c43db2, 0x03367d0d, 0x033bbc9c, 0x026755a2, 0x000c9185}}}, + {X: Field{[10]uint32{0x00d12cab, 0x012d2208, 0x01afd699, 0x0182c74c, 0x02034135, 0x016b1d28, 0x03b63276, 0x015927d6, 0x002155d1, 0x0031f786}}, Y: Field{[10]uint32{0x02eaa23a, 0x014b39e5, 0x02844482, 0x00d8475f, 0x007fbe01, 0x030c9036, 0x03b86595, 0x00b03f24, 0x0056c5fb, 0x00366596}}}, + {X: Field{[10]uint32{0x0381b294, 0x0224ef50, 0x005c600f, 0x0025ca65, 0x03eddeff, 0x017e93ac, 0x01eb6ee4, 0x00b0ec62, 0x033a915e, 0x00133b2c}}, Y: Field{[10]uint32{0x02a3aeb1, 0x02ef6387, 0x036ffd1b, 0x0384cc42, 0x033534d6, 0x02dc0335, 0x02250357, 0x0072e111, 0x0112b5e6, 0x0033c5fc}}}, + {X: Field{[10]uint32{0x02255749, 0x02a99619, 0x00c10204, 0x00aca172, 0x001c9bc7, 0x033c03f9, 0x003ab5d4, 0x0181aed3, 0x0064bfce, 0x00209b3d}}, Y: Field{[10]uint32{0x036849c4, 0x02388d5e, 0x011cbb87, 0x0192c600, 0x036d7ca5, 0x00542a8b, 0x016fabfb, 0x00a16d45, 0x0031527d, 0x001ae8ed}}}, + {X: Field{[10]uint32{0x008f8f62, 0x0061f9d9, 0x0028e0b2, 0x002360ba, 0x01de51d6, 0x035bf043, 0x012ba922, 0x03491546, 0x02c6f497, 0x003204b6}}, Y: Field{[10]uint32{0x008b317e, 0x01ad2aec, 0x028f61ba, 0x0361ddcf, 0x002be94d, 0x03ebd4ff, 0x026ee1ae, 0x001a0204, 0x00c77363, 0x000340ba}}}, + {X: Field{[10]uint32{0x00ff8851, 0x03574ff8, 0x00d1e3c6, 0x01adb8e3, 0x03aa4592, 0x027c53ae, 0x01eaa8bc, 0x01fd1f91, 0x010ebd96, 0x00149a55}}, Y: Field{[10]uint32{0x01a7455b, 0x021987e6, 0x0295a38b, 0x0340c21a, 0x01b45963, 0x0346cff4, 0x03422ffc, 0x03b3b510, 0x012026e3, 0x0028565f}}}, + {X: Field{[10]uint32{0x004d7676, 0x02bfb9fa, 0x01e9baf1, 0x01b55294, 0x00c7c2ae, 0x037102ea, 0x002721fc, 0x014b3ef1, 0x032980e6, 0x001ff3f2}}, Y: Field{[10]uint32{0x002cfcdd, 0x037afe22, 0x00ce9f95, 0x03d59aa7, 0x02a4d044, 0x0323c675, 0x02bcbaaa, 0x0238d3b1, 0x01904a40, 0x002afdcb}}}, + {X: Field{[10]uint32{0x00a9f451, 0x03712d99, 0x0057c079, 0x03ae2eaa, 0x033d5f25, 0x00ca9a81, 0x00e18a21, 0x03841212, 0x02a04597, 0x00217c06}}, Y: Field{[10]uint32{0x01f081af, 0x013b11f9, 0x0013204b, 0x03072d38, 0x025398ce, 0x016f3d15, 0x03b71ab3, 0x02061dee, 0x00eb8a05, 0x003dd18f}}}, + {X: Field{[10]uint32{0x02885628, 0x03e37fe4, 0x035fda01, 0x02f08900, 0x00dc1a5f, 0x003fafbb, 0x03fee1d1, 0x02183eb0, 0x021a7dcd, 0x000256d2}}, Y: Field{[10]uint32{0x02f7f772, 0x0101bb2f, 0x00d97f70, 0x03b48dce, 0x021f80bc, 0x0131bb8f, 0x029dfa69, 0x01119fbe, 0x039c5bd9, 0x000a8337}}}, + {X: Field{[10]uint32{0x036c51c5, 0x0243b35f, 0x009f049b, 0x02b3b11c, 0x008cd95c, 0x00ddd4f6, 0x014b38ce, 0x03742ec9, 0x00a624dd, 0x00013d89}}, Y: Field{[10]uint32{0x037a4fa5, 0x039612f1, 0x02bd070c, 0x03ac6e5d, 0x00668de4, 0x0333f515, 0x0220dcd8, 0x03b3640a, 0x028302ef, 0x0021d2a6}}}, + {X: Field{[10]uint32{0x0106b48d, 0x03759b5d, 0x00043437, 0x0215a635, 0x02a2914d, 0x0117a71b, 0x0040f585, 0x014def39, 0x0112e18b, 0x000e781a}}, Y: Field{[10]uint32{0x02f352e0, 0x01e859c1, 0x03ef18db, 0x01b51a56, 0x0200f06c, 0x004a2a84, 0x0080153c, 0x00c25aaf, 0x020a16e9, 0x003bfc83}}}, + {X: Field{[10]uint32{0x00f1ace9, 0x005ed19e, 0x013107a7, 0x02d97bee, 0x014c1d41, 0x032b6e5e, 0x03f4f590, 0x01e0c5d3, 0x013266d6, 0x0014bb70}}, Y: Field{[10]uint32{0x00d402d1, 0x01aef071, 0x0127c3af, 0x01563d1a, 0x03cb07cf, 0x01a135f4, 0x02c0bf49, 0x0078ff8c, 0x0202c678, 0x00395a78}}}, + {X: Field{[10]uint32{0x0328465f, 0x0290fcd0, 0x00d3a1df, 0x0235bcaa, 0x01e4e945, 0x02457f23, 0x0287f07c, 0x02041cf8, 0x0348964b, 0x0038dd92}}, Y: Field{[10]uint32{0x00fdb023, 0x01723cd3, 0x01b6c3ad, 0x02a94e9e, 0x005b7261, 0x03435d5d, 0x01b460f6, 0x0382e8d4, 0x024bfb13, 0x002f78a9}}}, + {X: Field{[10]uint32{0x00f513e6, 0x009fbfef, 0x00ebe756, 0x02b6710b, 0x03e1c81a, 0x03e05cca, 0x0038768e, 0x01a638fb, 0x01077c77, 0x00203bf9}}, Y: Field{[10]uint32{0x0388b709, 0x03c41280, 0x00bc3483, 0x005d6bb5, 0x02a9df2e, 0x014f4f67, 0x01e60599, 0x0247a5a5, 0x031bc543, 0x001a4319}}}, + {X: Field{[10]uint32{0x0108b641, 0x00fdc3f2, 0x02728517, 0x01fa4fe3, 0x0319b0bf, 0x01f348fb, 0x032bcac8, 0x03125e8b, 0x03d50ebc, 0x001212b1}}, Y: Field{[10]uint32{0x00ef371e, 0x013a97a4, 0x02eb61b4, 0x0254530a, 0x015bc8c9, 0x014fcc9c, 0x02b85516, 0x01c8da7c, 0x00e6f3b1, 0x0007655c}}}, + {X: Field{[10]uint32{0x03e3d124, 0x023ed7dd, 0x03f6536b, 0x0098e007, 0x02adf26c, 0x0105737e, 0x03ca53e4, 0x02f76137, 0x023fbf1f, 0x00272627}}, Y: Field{[10]uint32{0x00212a38, 0x02aac322, 0x02dd4c79, 0x010b5fc5, 0x002993c4, 0x023fb8eb, 0x00b3b802, 0x0058ee59, 0x021f5755, 0x0028d2b9}}}, + {X: Field{[10]uint32{0x01a5066b, 0x02315f5d, 0x018e0930, 0x034a5ec3, 0x0032846d, 0x0278dfe0, 0x016570f1, 0x03f9fd91, 0x030f601a, 0x00022e3e}}, Y: Field{[10]uint32{0x0048c9e7, 0x02ca783a, 0x03b3c240, 0x01c89bc0, 0x01d6166c, 0x003f59e8, 0x0232f100, 0x039b26cb, 0x02feffc4, 0x0001e162}}}, + {X: Field{[10]uint32{0x02e78177, 0x0367581f, 0x000ef451, 0x00e88470, 0x03bce095, 0x00297601, 0x01baa79e, 0x035e6a60, 0x02740ee1, 0x0038df43}}, Y: Field{[10]uint32{0x009f8f9c, 0x008fafec, 0x02e6f4bd, 0x024eaad3, 0x01a07d05, 0x03f9661d, 0x01b5625b, 0x0097d37c, 0x028502ad, 0x0034a284}}}, + {X: Field{[10]uint32{0x0325c147, 0x02a79c04, 0x00e194b2, 0x03555334, 0x03281052, 0x01d95ec7, 0x0258e754, 0x00da0eb5, 0x037e9a00, 0x00203215}}, Y: Field{[10]uint32{0x024d945c, 0x018d1bd5, 0x03fe432a, 0x0266f3ee, 0x03fe2baf, 0x01ca5cd1, 0x03ba8a0d, 0x028babb1, 0x00cd7ca3, 0x0002cff4}}}, + {X: Field{[10]uint32{0x02a8c6a1, 0x02ce0ccf, 0x0349adde, 0x0234b414, 0x0150f6ba, 0x01eb806a, 0x02f79026, 0x0087954d, 0x016d0341, 0x0039c117}}, Y: Field{[10]uint32{0x02181fba, 0x0222ae22, 0x019e4e7d, 0x00bfa5d5, 0x0060b37c, 0x00a97749, 0x01571d9c, 0x02537f85, 0x00db3269, 0x001cc1aa}}}, + {X: Field{[10]uint32{0x012e0d71, 0x025e3219, 0x029804f2, 0x03df2cd1, 0x02d87554, 0x0300e226, 0x03af0b13, 0x011fedac, 0x024b850a, 0x001574b6}}, Y: Field{[10]uint32{0x03e16e7c, 0x01879e77, 0x02780723, 0x01b57311, 0x010189a5, 0x008bbb97, 0x020b7b4f, 0x0343db34, 0x0182c861, 0x001ab03e}}}, + {X: Field{[10]uint32{0x01a38d2f, 0x00736c2c, 0x019f55bd, 0x00710100, 0x03a1e86d, 0x00540300, 0x03a5ff21, 0x00bdff20, 0x020955a2, 0x0033958b}}, Y: Field{[10]uint32{0x021bb865, 0x01b65ad4, 0x02d314bd, 0x00c9bc73, 0x02474070, 0x03717e0b, 0x030a165e, 0x0311ef1a, 0x004db4aa, 0x00247780}}}, + {X: Field{[10]uint32{0x0054773b, 0x0164b8de, 0x036fecc7, 0x02e1ae4e, 0x0100cd0e, 0x00c41fc7, 0x011bd645, 0x02bc15fe, 0x021f0596, 0x001d3803}}, Y: Field{[10]uint32{0x00e1d217, 0x03edd276, 0x01374e13, 0x005445e4, 0x016fa9f0, 0x0042851b, 0x0311867b, 0x00a94fac, 0x00a338e5, 0x000472a2}}}, + {X: Field{[10]uint32{0x0104eb48, 0x0267e788, 0x00530a2e, 0x00e6561a, 0x0368214d, 0x0324bb65, 0x003e400a, 0x03db2476, 0x036bc194, 0x002ba3c2}}, Y: Field{[10]uint32{0x03ce4cf2, 0x0173bb35, 0x02362c85, 0x01cc5191, 0x00d4aa8f, 0x02d5f2fe, 0x0127de9e, 0x02a4c0d8, 0x00420dc0, 0x003a5cff}}}, + {X: Field{[10]uint32{0x03891ae7, 0x00bf737b, 0x03674158, 0x0089bdda, 0x037854e7, 0x0197ccf4, 0x008e0c05, 0x00d9d784, 0x006c8df8, 0x00102a30}}, Y: Field{[10]uint32{0x007bf7ed, 0x00155762, 0x0224ea10, 0x00260ebd, 0x01b8ff9c, 0x003eaafb, 0x029e0b04, 0x01abf4f4, 0x0050b511, 0x0005ae9e}}}, + {X: Field{[10]uint32{0x01f83b33, 0x037c6f1b, 0x00e487f6, 0x02c13490, 0x03926795, 0x0187c7ff, 0x02b410f8, 0x03dbea8a, 0x02545c57, 0x00187aa7}}, Y: Field{[10]uint32{0x0279ed15, 0x01c56076, 0x0003c490, 0x019ce2a3, 0x02b9063e, 0x03514a7c, 0x021791f7, 0x005f0dcb, 0x012ae0b2, 0x0031a7b0}}}, + {X: Field{[10]uint32{0x01d37632, 0x0032d7b0, 0x031cc30a, 0x03b09920, 0x03d73e25, 0x00517f05, 0x01f55f72, 0x02aa93f3, 0x00d4440c, 0x00072227}}, Y: Field{[10]uint32{0x02d72fdf, 0x016f2508, 0x00166ee5, 0x02184558, 0x00574f5b, 0x036d792c, 0x014a2237, 0x0299f1cc, 0x0246131f, 0x000106d4}}}, + {X: Field{[10]uint32{0x0249525d, 0x0059a863, 0x02abb4ab, 0x001894e4, 0x01c58e0d, 0x02d42fe9, 0x02a99d3a, 0x021f9e60, 0x0090791d, 0x003fca56}}, Y: Field{[10]uint32{0x01454570, 0x02680686, 0x00a58e61, 0x027fbef9, 0x02c37087, 0x02201bef, 0x0249baf8, 0x004d9065, 0x00de1995, 0x00282599}}}, + {X: Field{[10]uint32{0x00e95f99, 0x02a1d9e1, 0x037857bc, 0x02bb66f7, 0x0174e399, 0x023e2433, 0x00939e5b, 0x007f401f, 0x02bfcfca, 0x0017acba}}, Y: Field{[10]uint32{0x032c9871, 0x03ee3efd, 0x00f63031, 0x0097f844, 0x0001f46f, 0x00589976, 0x01aff120, 0x01e0f080, 0x01701c9a, 0x001310ba}}}, + {X: Field{[10]uint32{0x02cbaf91, 0x01edad3d, 0x0361fcfc, 0x0136054f, 0x033b17bf, 0x0281c706, 0x03f8ce17, 0x0324ed6c, 0x008cdbcc, 0x0010f954}}, Y: Field{[10]uint32{0x03dfdcfc, 0x001cd0e6, 0x0063815a, 0x01cf6c90, 0x03c853bb, 0x002694c1, 0x01ec388d, 0x029c7942, 0x0378438b, 0x002d7b63}}}, + {X: Field{[10]uint32{0x01b56f53, 0x0303dd7f, 0x02c995b0, 0x021dfdb8, 0x00eb513f, 0x02bf94cf, 0x0207261c, 0x00837f21, 0x013023cb, 0x003d745a}}, Y: Field{[10]uint32{0x026ece68, 0x03837084, 0x008f492c, 0x0101bacb, 0x002557dd, 0x00f8a597, 0x03c4bf87, 0x020ccbdf, 0x01680152, 0x00394e6c}}}, + {X: Field{[10]uint32{0x00aba2a1, 0x038303de, 0x01eb6c7f, 0x01bee944, 0x0372313c, 0x0198a8ba, 0x0180a62d, 0x02a46118, 0x02d15dc5, 0x0036e759}}, Y: Field{[10]uint32{0x01517227, 0x02883ca8, 0x030b1f89, 0x02d6070f, 0x003cfb46, 0x0095e15f, 0x02762d92, 0x03716a78, 0x00a361f0, 0x00325b7a}}}, + {X: Field{[10]uint32{0x028ecdf2, 0x02992e21, 0x01ab6833, 0x00209ee6, 0x0356ffce, 0x02fd44ce, 0x0165bfe7, 0x018ef13d, 0x03d846fd, 0x0039d834}}, Y: Field{[10]uint32{0x02f102ce, 0x00397504, 0x003810e6, 0x0048a172, 0x012c1c1e, 0x01018b80, 0x021cc825, 0x00bad060, 0x028508be, 0x00183b99}}}, + {X: Field{[10]uint32{0x0033e026, 0x0075e417, 0x00d99135, 0x02c0c769, 0x00e3a956, 0x00b8dc01, 0x02533e71, 0x029eaf48, 0x02990cac, 0x000af6c8}}, Y: Field{[10]uint32{0x02e44731, 0x011c4fed, 0x03f82a78, 0x0218932e, 0x03801932, 0x009f4039, 0x003e877e, 0x0204176b, 0x00dfc273, 0x001919d7}}}, + {X: Field{[10]uint32{0x0166bee4, 0x021ee6a0, 0x03bbfc3c, 0x00838006, 0x007be48d, 0x03f5b211, 0x00137739, 0x0084d2de, 0x03fd0599, 0x00073382}}, Y: Field{[10]uint32{0x02d37057, 0x0222ef72, 0x034cc427, 0x00fb059b, 0x02b5eeb7, 0x03367a0f, 0x021253c4, 0x03f8c30e, 0x02e51ed7, 0x000b52a3}}}, + {X: Field{[10]uint32{0x03641075, 0x03e2695d, 0x035bd6eb, 0x0316ed95, 0x01ec8405, 0x031ae319, 0x01b5bd8e, 0x02b9effd, 0x03c37f5d, 0x001b5af8}}, Y: Field{[10]uint32{0x009c2c7f, 0x011b33eb, 0x01b80392, 0x0234d456, 0x0324d193, 0x0313abd2, 0x011507f7, 0x034ef180, 0x001f5c6f, 0x0013f4f3}}}, + {X: Field{[10]uint32{0x01b22351, 0x001f62ef, 0x0036cc60, 0x00bc50fa, 0x01b3c67f, 0x01d63e87, 0x03fb1ca8, 0x01e075e0, 0x0180d96e, 0x000360b0}}, Y: Field{[10]uint32{0x02d0c7d9, 0x01ee389e, 0x031e151a, 0x03d9e592, 0x0037415a, 0x01290c86, 0x033e9a97, 0x02b6a24e, 0x0269952a, 0x000e00bd}}}, + {X: Field{[10]uint32{0x01b3cd71, 0x0233860f, 0x02343b22, 0x03ba31cf, 0x00fbf9fc, 0x0151bc6e, 0x01dfed1b, 0x03f4d3e4, 0x02dd7e03, 0x0013b187}}, Y: Field{[10]uint32{0x003ba9a9, 0x021215ac, 0x01cffb19, 0x023eaa50, 0x02db7d94, 0x03a7b0f1, 0x0390340d, 0x038bb22b, 0x0309b5b2, 0x00384665}}}, + {X: Field{[10]uint32{0x017a034b, 0x01e07a78, 0x01643add, 0x023e39cd, 0x02a8df7a, 0x03ab44fb, 0x00744d7b, 0x02846e95, 0x006973ae, 0x000c6ab5}}, Y: Field{[10]uint32{0x00b37adb, 0x02d9d3e1, 0x02913f13, 0x03e39838, 0x02a94680, 0x033b5d21, 0x028bdf57, 0x03d818fd, 0x03413e49, 0x001919db}}}, + {X: Field{[10]uint32{0x01173e02, 0x00739353, 0x0131a5eb, 0x02f65f8a, 0x0201f946, 0x01627a98, 0x0115903b, 0x036e3bd9, 0x01892fcc, 0x002a6108}}, Y: Field{[10]uint32{0x01a3908b, 0x01222922, 0x02049abe, 0x01b42959, 0x0307ea26, 0x0335becd, 0x0370e133, 0x035e8e8c, 0x02ac3b2d, 0x00142f9d}}}, + {X: Field{[10]uint32{0x03bef099, 0x0383b3ad, 0x015e3f8f, 0x0022941a, 0x02fee79b, 0x01dd5033, 0x02cfa092, 0x0010cde9, 0x00f33ec0, 0x00208ad5}}, Y: Field{[10]uint32{0x036bf7f6, 0x01121448, 0x007128d0, 0x00dbf6a3, 0x007405d3, 0x022016fc, 0x003ddced, 0x03d811cd, 0x03c620d3, 0x000e4d88}}}, + {X: Field{[10]uint32{0x01065e0b, 0x037c9705, 0x02a3d33a, 0x0043a677, 0x0215793d, 0x02ff175f, 0x038de14e, 0x01c00317, 0x0355fe3d, 0x000403da}}, Y: Field{[10]uint32{0x02ecb4c2, 0x0335d293, 0x00e519b2, 0x034373b2, 0x00a352ff, 0x035b0445, 0x01282676, 0x037789f2, 0x00f758c4, 0x00346ed1}}}, + {X: Field{[10]uint32{0x02142f7f, 0x03a20db5, 0x031bb2d4, 0x01f16b6d, 0x006a5425, 0x00657425, 0x01aa6ecd, 0x03089d20, 0x03186a09, 0x00329760}}, Y: Field{[10]uint32{0x0277b42d, 0x013d3649, 0x0133de01, 0x00c7f1ce, 0x03878d8d, 0x012b815f, 0x03a0c388, 0x01e82bce, 0x007fb974, 0x00362421}}}, + {X: Field{[10]uint32{0x00bfbf14, 0x03684b89, 0x016cafa5, 0x00fc406d, 0x00e8ffe5, 0x0263fd84, 0x031a352f, 0x034838a4, 0x01f42234, 0x003a4709}}, Y: Field{[10]uint32{0x024dbb86, 0x02d288a5, 0x02b41872, 0x03d450f3, 0x037a26bc, 0x0183a669, 0x01740f6d, 0x0314af1c, 0x01e5441e, 0x002c7b05}}}, + {X: Field{[10]uint32{0x02e34445, 0x02750b06, 0x0306509e, 0x011cb33d, 0x03acb545, 0x00ba66b9, 0x029b2902, 0x000b6215, 0x00dc3109, 0x0015ea32}}, Y: Field{[10]uint32{0x00ab1fb7, 0x0185878c, 0x00accb9c, 0x00fee308, 0x0250e7cc, 0x01219abb, 0x0292db56, 0x038277d3, 0x01410442, 0x00214891}}}, + {X: Field{[10]uint32{0x0104500f, 0x00116c1c, 0x007d9581, 0x00769bfa, 0x0355a853, 0x02300adb, 0x01d0d412, 0x0345b6eb, 0x00672502, 0x0008cae3}}, Y: Field{[10]uint32{0x01f93fb9, 0x02903d61, 0x00f399a7, 0x03679863, 0x034f5255, 0x0152524b, 0x03c476f6, 0x02161c89, 0x020e9e7d, 0x000e0442}}}, + {X: Field{[10]uint32{0x03004fec, 0x0189ff9d, 0x00876187, 0x031c38f7, 0x020750d5, 0x0067df9e, 0x01d48763, 0x01a6cd3d, 0x028ad71f, 0x001f42f9}}, Y: Field{[10]uint32{0x01124633, 0x027bf351, 0x01e67ca0, 0x0060b291, 0x02a12b1d, 0x0296e5c7, 0x02f54028, 0x03cf9875, 0x00507d0a, 0x000f9ca8}}}, + {X: Field{[10]uint32{0x02f93292, 0x01e8b49e, 0x00d836ba, 0x0312691b, 0x01b70b02, 0x00310d21, 0x01fa4369, 0x0289c725, 0x030b77c2, 0x00137617}}, Y: Field{[10]uint32{0x0011d597, 0x038efd47, 0x0178e8c9, 0x01348206, 0x00f139e6, 0x036b69e8, 0x02b6ff85, 0x01366122, 0x02e5c955, 0x00210d90}}}, + {X: Field{[10]uint32{0x012e52f8, 0x01938bdc, 0x032149e2, 0x0307add9, 0x023eb2e5, 0x012ea69e, 0x03531a17, 0x008011c2, 0x03f588f0, 0x0014dea4}}, Y: Field{[10]uint32{0x000e161f, 0x00e6d84d, 0x03ebb3f8, 0x03e5e095, 0x0394efa1, 0x006256bc, 0x0225f067, 0x02499823, 0x03a0dc00, 0x002c366c}}}, + {X: Field{[10]uint32{0x02e48684, 0x00accc67, 0x00ae8b97, 0x02420962, 0x01ab3465, 0x03e0aff4, 0x00e60a46, 0x00795e63, 0x0071325b, 0x0004febd}}, Y: Field{[10]uint32{0x0234f743, 0x0086b79d, 0x00bfa49a, 0x0062116e, 0x02dce7ba, 0x026c8806, 0x02f25857, 0x02d4a788, 0x0384e84e, 0x00299c80}}}, + {X: Field{[10]uint32{0x03e8acb8, 0x03910173, 0x0206be1b, 0x02088b67, 0x03ca17c4, 0x00277b79, 0x015dbea8, 0x02cd1380, 0x00ed5861, 0x001a4789}}, Y: Field{[10]uint32{0x01c529ab, 0x026ddae4, 0x03f966f4, 0x0250f43c, 0x035ad002, 0x036718d1, 0x0120d909, 0x01ec3f31, 0x02dc0c19, 0x0038d592}}}, + {X: Field{[10]uint32{0x013d7ea2, 0x0305771f, 0x0373f423, 0x03e2411f, 0x03b754b3, 0x02ccd248, 0x02a394ff, 0x02a14056, 0x0391aaae, 0x000d950e}}, Y: Field{[10]uint32{0x03be5799, 0x0228bc6e, 0x02fd52d6, 0x03f9687e, 0x039dff44, 0x00860252, 0x008c8389, 0x02003a39, 0x0293b79b, 0x0001ced1}}}, + {X: Field{[10]uint32{0x0033f05b, 0x0082c1e1, 0x008a224f, 0x02c3f8ef, 0x000e007b, 0x00c83aa0, 0x00450455, 0x02032c78, 0x03e03941, 0x003fc96a}}, Y: Field{[10]uint32{0x030b7e51, 0x00d8c794, 0x026c2f90, 0x038022bb, 0x02938f69, 0x03676d04, 0x01bd678a, 0x0399439b, 0x010926df, 0x002944ac}}}, + {X: Field{[10]uint32{0x0187e443, 0x00e2685f, 0x0322272d, 0x0305c314, 0x00cc607b, 0x034091eb, 0x0051f57c, 0x03f6bd44, 0x007b5faa, 0x000077b0}}, Y: Field{[10]uint32{0x03a9a325, 0x014252e7, 0x038d3bb3, 0x019f4384, 0x00d870ce, 0x016636b5, 0x02207a92, 0x00af0168, 0x0137382b, 0x001f9dfa}}}, + {X: Field{[10]uint32{0x03413c32, 0x030a6527, 0x02236029, 0x0237f18d, 0x01485ab7, 0x00538246, 0x020147ed, 0x0218cba8, 0x0376f62f, 0x000bc43d}}, Y: Field{[10]uint32{0x00d2184a, 0x009a7b1a, 0x02f5ad25, 0x01a0cf9f, 0x0235c236, 0x02a9ac7d, 0x01d8c8b5, 0x0118b82e, 0x03c6e760, 0x000ecb17}}}, + {X: Field{[10]uint32{0x02bd73ca, 0x018008b6, 0x00188311, 0x010f3060, 0x02ade319, 0x02f2bed2, 0x03096814, 0x00b36eb3, 0x0394e61c, 0x001e5d3c}}, Y: Field{[10]uint32{0x01e98309, 0x020d8022, 0x0005673c, 0x03a0c439, 0x012be4cd, 0x004ee914, 0x01f854e8, 0x02a99a1f, 0x01a03bc1, 0x00386cd3}}}, + {X: Field{[10]uint32{0x0301c332, 0x01d233c5, 0x01b14436, 0x03780e94, 0x0132af1e, 0x012a8da5, 0x01774698, 0x03105959, 0x03393c5c, 0x00015317}}, Y: Field{[10]uint32{0x01043e4e, 0x0306da81, 0x020cd800, 0x02b3bde2, 0x02ddbde8, 0x03baadae, 0x030626a0, 0x0273148a, 0x03494976, 0x000f719e}}}, + {X: Field{[10]uint32{0x025f3783, 0x03068ed0, 0x0115d081, 0x00179556, 0x028092e9, 0x0061616b, 0x00a972a3, 0x031fac76, 0x0296f047, 0x000666a8}}, Y: Field{[10]uint32{0x0346c262, 0x03a3f1fa, 0x002e2b87, 0x038433b8, 0x02585154, 0x03f4e899, 0x00a7946d, 0x01ea5ad3, 0x027964d1, 0x003d608d}}}, + {X: Field{[10]uint32{0x03b7f299, 0x03c222a6, 0x03e879a7, 0x02f9e5da, 0x03cbcdf0, 0x007f1639, 0x0292a3ba, 0x01b7e9b0, 0x01d6fb61, 0x0034574e}}, Y: Field{[10]uint32{0x03d7a900, 0x016e980a, 0x01061f70, 0x00602d5f, 0x01679dd4, 0x010eff1e, 0x03d4912f, 0x03e0def6, 0x017c4e37, 0x001322ba}}}, + {X: Field{[10]uint32{0x024ef58b, 0x019a0fcd, 0x02df5a6f, 0x032a696b, 0x01bff26e, 0x0012e0af, 0x02332c6a, 0x01f7f206, 0x0134880e, 0x001db594}}, Y: Field{[10]uint32{0x001507e7, 0x01101ad0, 0x0246a646, 0x02f16fc4, 0x027b4aa5, 0x025d6e68, 0x02c90486, 0x00b60e87, 0x0308bbd2, 0x002dc6b9}}}, + {X: Field{[10]uint32{0x00ae51b7, 0x002050f7, 0x02a02a03, 0x03865301, 0x03452ef0, 0x024bfea6, 0x02e9ead7, 0x03f8d8c2, 0x02a5d4df, 0x0007ad34}}, Y: Field{[10]uint32{0x03f47b0b, 0x01736f5b, 0x0144c9a5, 0x019d626c, 0x027cc94b, 0x0232cfb6, 0x0286af45, 0x0239e668, 0x00c1e6ab, 0x0022365e}}}, + {X: Field{[10]uint32{0x01df571d, 0x004bc337, 0x0162f955, 0x0349144d, 0x01e474bd, 0x01c4188f, 0x01c34516, 0x021e40d8, 0x02513570, 0x0037b80c}}, Y: Field{[10]uint32{0x0290f565, 0x03121e85, 0x027c307f, 0x008ec819, 0x00496d96, 0x00463ffb, 0x028a28dc, 0x036024b1, 0x00fdcbf6, 0x00348b6f}}}, + {X: Field{[10]uint32{0x02d4760a, 0x008d5b95, 0x005aeef0, 0x0277cd8e, 0x01bf1dbd, 0x03c4fd42, 0x028f0d55, 0x031af7fd, 0x032dc98a, 0x000bac09}}, Y: Field{[10]uint32{0x02a04277, 0x03280ac9, 0x03746111, 0x0111c847, 0x035c69ad, 0x0015cda1, 0x02a18329, 0x013ae89e, 0x03554aaf, 0x003e0350}}}, + {X: Field{[10]uint32{0x030eabf3, 0x02c0c86a, 0x036b5c39, 0x03a809d8, 0x02b75853, 0x01de2208, 0x036ff7fc, 0x019cb63f, 0x02697509, 0x003abd8b}}, Y: Field{[10]uint32{0x020a3b7c, 0x03f7b6cb, 0x000956ef, 0x0180d41c, 0x008614e1, 0x001ccfc7, 0x0388b969, 0x0388b5c6, 0x02aa1c8f, 0x00110b95}}}, + {X: Field{[10]uint32{0x00592858, 0x03dcab81, 0x01d3b15e, 0x0216e1e6, 0x03cbc701, 0x00dbbd18, 0x01c442c2, 0x01bf65af, 0x030a13d9, 0x00081641}}, Y: Field{[10]uint32{0x00961ec8, 0x028d2f45, 0x014a280d, 0x03fa406e, 0x00f426fb, 0x01ab95b6, 0x0221d7f4, 0x026ba3d8, 0x02e83f25, 0x002f2410}}}, + {X: Field{[10]uint32{0x012f52fe, 0x009749eb, 0x0062a0f9, 0x01108231, 0x014b8b4a, 0x0113b0a0, 0x03b4ceea, 0x00f9f9bd, 0x03fd9e7f, 0x003fcbbd}}, Y: Field{[10]uint32{0x030a5e24, 0x03393cf7, 0x03e3b233, 0x011dada7, 0x030956a4, 0x019fd44d, 0x016cb52a, 0x01cad205, 0x00fbfa6f, 0x001ab39d}}}, + {X: Field{[10]uint32{0x01d14d83, 0x01fe7602, 0x03bf620f, 0x039937c5, 0x01d8fd0d, 0x00d5ffc7, 0x037a7b04, 0x014fef4c, 0x02f6fc45, 0x0038f973}}, Y: Field{[10]uint32{0x038f0460, 0x013d1348, 0x033651b8, 0x03fa2811, 0x03e667b6, 0x01a691d7, 0x011863f7, 0x02d83f43, 0x01a1baa7, 0x002b377f}}}, + {X: Field{[10]uint32{0x0357a6c3, 0x0046736f, 0x0054ec11, 0x01def78f, 0x01a0c645, 0x019ae708, 0x0142341a, 0x00a203a6, 0x026a41c0, 0x0025ea1c}}, Y: Field{[10]uint32{0x0367b4e8, 0x0330e362, 0x01164681, 0x03fcd167, 0x01fe160a, 0x01b61178, 0x00cc5c72, 0x00f41c1e, 0x00ae2702, 0x002d7cdf}}}, + {X: Field{[10]uint32{0x01cc81e6, 0x00811427, 0x001c41b0, 0x000875de, 0x0012fd90, 0x0067ab6d, 0x039484a1, 0x03e50e18, 0x02e94862, 0x002ac079}}, Y: Field{[10]uint32{0x0083b14b, 0x007b815d, 0x000436b1, 0x03d0568c, 0x0148853c, 0x00bb5e79, 0x01fab050, 0x0170e814, 0x0032101b, 0x001ab943}}}, + {X: Field{[10]uint32{0x0273668f, 0x03a857dd, 0x02b0d5a2, 0x01302a30, 0x0258ed9a, 0x023611e7, 0x026ba5ac, 0x033dac0b, 0x0010da2d, 0x00031191}}, Y: Field{[10]uint32{0x03499945, 0x02f0e182, 0x01361adb, 0x01114827, 0x03eadee9, 0x034f3916, 0x017f333c, 0x00b1f796, 0x01906239, 0x000da631}}}, + {X: Field{[10]uint32{0x03867534, 0x00263d05, 0x03d8648f, 0x00909bb6, 0x01ee49d5, 0x01b041e5, 0x013b0e67, 0x007cf880, 0x00685f72, 0x0005fab3}}, Y: Field{[10]uint32{0x009ef300, 0x018fb386, 0x0201bd6b, 0x015ba652, 0x03fec0f8, 0x00eaddbe, 0x037214bb, 0x027d26ef, 0x02e90cb1, 0x00330c45}}}, + {X: Field{[10]uint32{0x00c00d73, 0x00537ab5, 0x0208f2b1, 0x02f35f4d, 0x013ed2e8, 0x02fbf54f, 0x01b77bd5, 0x03bc5d4e, 0x01402908, 0x00301037}}, Y: Field{[10]uint32{0x01279c00, 0x020d6d05, 0x013d7427, 0x032db383, 0x02b2053e, 0x01444f73, 0x01403d84, 0x00960134, 0x00ae55ec, 0x001e98e1}}}, + {X: Field{[10]uint32{0x02bddb42, 0x000f8e4b, 0x01b9341b, 0x028aea4b, 0x0041bf2b, 0x019668a4, 0x0025fed6, 0x03dc30bb, 0x00983658, 0x0029658d}}, Y: Field{[10]uint32{0x039f4872, 0x002b7935, 0x01600a95, 0x034a08d6, 0x011ce7c2, 0x01a55e17, 0x00e8bf41, 0x03129c2a, 0x00af260e, 0x00370453}}}, + {X: Field{[10]uint32{0x0329aa0d, 0x01f3a846, 0x02279989, 0x01c8ce77, 0x03663823, 0x00ce0db1, 0x0233d095, 0x03d8ff1f, 0x02d451dc, 0x00113f88}}, Y: Field{[10]uint32{0x004279b3, 0x015df313, 0x01a9e53b, 0x003eba01, 0x014f3bf8, 0x00925bde, 0x01e9ffae, 0x0350d24a, 0x00e73d4b, 0x0005c631}}}, + {X: Field{[10]uint32{0x0071647b, 0x019a844b, 0x0091cff4, 0x03cfb57b, 0x004fc6b5, 0x00912ff6, 0x03b246de, 0x03057be8, 0x00aa1358, 0x0022f5c6}}, Y: Field{[10]uint32{0x03d737fa, 0x01b7fa12, 0x02fa5f40, 0x032110ec, 0x0365a0a3, 0x010009e4, 0x03deb8de, 0x0047c06d, 0x0288ba6c, 0x0005cbc6}}}, + {X: Field{[10]uint32{0x038680d1, 0x03e3385c, 0x03cfcd9f, 0x0355773c, 0x01d7ad4c, 0x03fce9e9, 0x01aa53c3, 0x02a88e02, 0x0025bbe6, 0x0023af73}}, Y: Field{[10]uint32{0x01e5641a, 0x02621d51, 0x01872cd7, 0x0199e2b1, 0x005be647, 0x0221b60f, 0x003728cf, 0x02b7e803, 0x0326af86, 0x0017158e}}}, + {X: Field{[10]uint32{0x011713d2, 0x0319f83a, 0x02f4e9db, 0x034bfadc, 0x02b469e5, 0x03a25b3e, 0x0342fb8b, 0x02aaf265, 0x021f688f, 0x00173d53}}, Y: Field{[10]uint32{0x00fd09c5, 0x011e1af9, 0x00b18569, 0x02a218c9, 0x034920e8, 0x0240556c, 0x006393e1, 0x00c360be, 0x0190d063, 0x00360b59}}}, + {X: Field{[10]uint32{0x01845f1a, 0x03061ea1, 0x02f8cdb4, 0x03053228, 0x01387185, 0x00115c7b, 0x0016ff4e, 0x02869cbb, 0x02e43f01, 0x001b0365}}, Y: Field{[10]uint32{0x00798c08, 0x02a5a9ac, 0x01dd6e55, 0x00e8c45f, 0x00abcf01, 0x026edbdc, 0x0015c1bb, 0x030bb3cd, 0x014b763e, 0x003ce668}}}, + {X: Field{[10]uint32{0x02b74046, 0x00cb70e4, 0x02ad690d, 0x002fa9c5, 0x039a15ef, 0x01c9a84c, 0x01f15155, 0x00bf7341, 0x00fefb6a, 0x003aba4a}}, Y: Field{[10]uint32{0x014c76bc, 0x03315dc0, 0x01b0984e, 0x0099835b, 0x02f6fd46, 0x035bb503, 0x03da7978, 0x00ce772f, 0x02d9f086, 0x002f7e1e}}}, + {X: Field{[10]uint32{0x007b3a21, 0x00802391, 0x008f0d57, 0x02cc6a9a, 0x02b61d5c, 0x00382376, 0x030dbbd0, 0x00bf7b67, 0x030cbbe7, 0x00397978}}, Y: Field{[10]uint32{0x01b248ae, 0x000196a1, 0x0035c561, 0x020a8415, 0x005de656, 0x0145c73a, 0x006ec03d, 0x01b99d1f, 0x01b8f80b, 0x0027ed2b}}}, + {X: Field{[10]uint32{0x038223ee, 0x036f3284, 0x00b79007, 0x00329e68, 0x0078df6b, 0x01acc02f, 0x02ce1762, 0x01aedf16, 0x02acc9e2, 0x001c4484}}, Y: Field{[10]uint32{0x03027757, 0x02a9cabb, 0x01cbbdc3, 0x00e46384, 0x036b8732, 0x0131cff8, 0x02b343bc, 0x01377679, 0x00584ef4, 0x000371a2}}}, + {X: Field{[10]uint32{0x01c5e22c, 0x00d03c08, 0x03d506b6, 0x02ca9319, 0x00c4cf11, 0x02d795e1, 0x03b9ea3f, 0x0293db76, 0x03b3531a, 0x000ed4ba}}, Y: Field{[10]uint32{0x0190938a, 0x02665aec, 0x039de55a, 0x0298f17e, 0x00b698c8, 0x01a06190, 0x02cf02e4, 0x011a84fe, 0x02bddc00, 0x000f68fb}}}, + {X: Field{[10]uint32{0x0356b78b, 0x01daf733, 0x02df91eb, 0x005fa5b2, 0x0245294a, 0x03871e95, 0x02e7292f, 0x011789f7, 0x00811103, 0x000c3ca1}}, Y: Field{[10]uint32{0x03abb049, 0x035c0add, 0x02b088e6, 0x01902877, 0x003c1491, 0x01445beb, 0x007864d2, 0x038d2fc1, 0x00fc26ec, 0x001c3184}}}, + {X: Field{[10]uint32{0x0130ff58, 0x0055937a, 0x01ab5edf, 0x009da675, 0x015cfef5, 0x0329287c, 0x00d37b61, 0x0156d939, 0x00a8012c, 0x00012a11}}, Y: Field{[10]uint32{0x003dfa3c, 0x0227565a, 0x00cd3f31, 0x03018c9d, 0x025826f9, 0x0342a7fd, 0x03e6bd38, 0x039b936e, 0x0148508d, 0x001261d1}}}, + {X: Field{[10]uint32{0x0068b06f, 0x0279b19e, 0x01026451, 0x0177b714, 0x0005ce2b, 0x02667853, 0x02e0fd9a, 0x01212990, 0x021ea7c8, 0x00297295}}, Y: Field{[10]uint32{0x01afa7ed, 0x0310e8e1, 0x025a47a7, 0x01a89077, 0x037abe38, 0x03fe9fda, 0x009b00ea, 0x03bbaab0, 0x0142a5e2, 0x0033245e}}}, + {X: Field{[10]uint32{0x03d6e72c, 0x03e3b937, 0x017ef3c1, 0x031915b9, 0x021fa547, 0x0043d852, 0x0051a68e, 0x03115b0e, 0x02d31e16, 0x003d86df}}, Y: Field{[10]uint32{0x03622f2b, 0x028ca017, 0x01a54734, 0x00453426, 0x02a0c5a8, 0x0345efe9, 0x035fbdb4, 0x00619647, 0x00b7fc40, 0x0032c9b4}}}, + {X: Field{[10]uint32{0x01f678b2, 0x01586145, 0x007fcaee, 0x019a8888, 0x02559768, 0x01d9bef9, 0x02859f9e, 0x000312d4, 0x00628897, 0x003e3935}}, Y: Field{[10]uint32{0x02c77554, 0x006a93ae, 0x011ae6f0, 0x02542775, 0x0106791e, 0x03eeddac, 0x009c271b, 0x01bec2a8, 0x039fc1b1, 0x000c2ec0}}}, + {X: Field{[10]uint32{0x032ab653, 0x00a4274c, 0x0291ca39, 0x001a9c5e, 0x03d5d97a, 0x0060528b, 0x02f6f717, 0x0164542c, 0x001a05d2, 0x002272bf}}, Y: Field{[10]uint32{0x017ab76e, 0x00bc5109, 0x03ce16fe, 0x036983a1, 0x015eac02, 0x0053cd38, 0x01c00557, 0x0121634a, 0x00ab0b4e, 0x00068928}}}, + {X: Field{[10]uint32{0x037c4f20, 0x02365f51, 0x020bb4a4, 0x0155aba9, 0x0033c5b5, 0x028ab544, 0x0201dca7, 0x01773f2a, 0x030bd04f, 0x0034a14d}}, Y: Field{[10]uint32{0x0293b9d4, 0x01348091, 0x01b416c4, 0x02cb1a60, 0x01c61386, 0x031c1451, 0x022adf8e, 0x0217404e, 0x03b732e8, 0x00352d09}}}, + {X: Field{[10]uint32{0x01f217c0, 0x01bd9a93, 0x00974902, 0x019b87f5, 0x01fd3350, 0x01eae89a, 0x01dc90d1, 0x02fecc86, 0x02f2d9bd, 0x0000f14c}}, Y: Field{[10]uint32{0x02ac5d59, 0x00f8c199, 0x0057675b, 0x03e7e320, 0x032791a6, 0x02104e5d, 0x033c7b42, 0x01ff40b0, 0x027ca6c9, 0x0021bf57}}}, + {X: Field{[10]uint32{0x008ac1ee, 0x000c5333, 0x02924b73, 0x00f8df89, 0x02298445, 0x00c0dc89, 0x0317a165, 0x01c1a886, 0x010bfc35, 0x00093465}}, Y: Field{[10]uint32{0x01f918ac, 0x0307aa72, 0x01ed84b9, 0x03822d5f, 0x01b05bb9, 0x026ba69d, 0x0247c685, 0x006a42ec, 0x005d06a3, 0x001348a9}}}, + {X: Field{[10]uint32{0x027615a9, 0x020acd93, 0x03d44595, 0x01042ad9, 0x02d85053, 0x0280dbf0, 0x01f8acee, 0x02c6ac52, 0x00f36227, 0x00331aac}}, Y: Field{[10]uint32{0x03761cb8, 0x01a028e0, 0x037d7107, 0x02bd5283, 0x01bac918, 0x003e9bc8, 0x00806b12, 0x0049619f, 0x03cc040b, 0x003e6b64}}}, + {X: Field{[10]uint32{0x025318cf, 0x03fdc6c0, 0x01cdef08, 0x00366c50, 0x016320f2, 0x01cc2e67, 0x0016bcff, 0x0252db2a, 0x0154f36e, 0x0037892a}}, Y: Field{[10]uint32{0x03899933, 0x00129076, 0x014d9679, 0x017a920e, 0x038475c3, 0x012bf58b, 0x002d2354, 0x012926e6, 0x01d91ac2, 0x000f8d2c}}}, + {X: Field{[10]uint32{0x021ffec7, 0x03fc9496, 0x03618f83, 0x036d23ea, 0x015f8243, 0x0254f3ef, 0x003a12c7, 0x02aea436, 0x00c34900, 0x001deac1}}, Y: Field{[10]uint32{0x00ac2f00, 0x01cfbfaf, 0x032bdae8, 0x00680c28, 0x01231c87, 0x016a36cc, 0x02265af7, 0x01dffd25, 0x00273bcd, 0x0018996b}}}, + {X: Field{[10]uint32{0x02e78209, 0x012b5445, 0x0341ece8, 0x03b876ad, 0x0251ff8d, 0x00656028, 0x0079885d, 0x02679780, 0x03065f46, 0x00291ebd}}, Y: Field{[10]uint32{0x02257440, 0x03cd2e5e, 0x03abfbb8, 0x0220f6bf, 0x035b7860, 0x01196ae5, 0x023f7cb3, 0x03de2e95, 0x03fdf1b1, 0x000e4f2e}}}, + {X: Field{[10]uint32{0x00d7016d, 0x0117a7a7, 0x037ea8a5, 0x038754a8, 0x0293d709, 0x000c8809, 0x01170fbd, 0x031edd37, 0x01fd0c55, 0x002a7d7e}}, Y: Field{[10]uint32{0x01d5e0e1, 0x012c417c, 0x0162b873, 0x009fdad8, 0x0254f0d3, 0x027a02ac, 0x01847b2e, 0x03c8ba3f, 0x01254bad, 0x00261c5e}}}, + {X: Field{[10]uint32{0x0218ec38, 0x01f358d3, 0x03b716cc, 0x01902a51, 0x01ba8668, 0x0161b9f8, 0x02200c4e, 0x00e28a3e, 0x02bc96b9, 0x00355fa7}}, Y: Field{[10]uint32{0x01b6bd36, 0x029aab34, 0x016a3062, 0x03abca16, 0x0325de16, 0x0104b7e1, 0x00c8b7cb, 0x0244416d, 0x02ef6823, 0x0026a834}}}, + {X: Field{[10]uint32{0x03aa58e9, 0x001a0a43, 0x006119f5, 0x0072ae08, 0x02e27ccc, 0x02a175ce, 0x018e66ca, 0x03053558, 0x00d8fb4d, 0x001d18ea}}, Y: Field{[10]uint32{0x00d4829f, 0x026ab41a, 0x0389f056, 0x03102d30, 0x02ae7990, 0x010e36e1, 0x00645a28, 0x03d412a8, 0x02b2275a, 0x0020bf5a}}}, + {X: Field{[10]uint32{0x013bf412, 0x01b9f3f5, 0x032fca3c, 0x01914d36, 0x013927ae, 0x03accc6c, 0x002d03e4, 0x0120c668, 0x008a29c4, 0x000b9e9c}}, Y: Field{[10]uint32{0x031e11d1, 0x038ecf52, 0x00160fd2, 0x0093b006, 0x03ebdf68, 0x00e6ceca, 0x02e0073f, 0x003372ba, 0x01997350, 0x00213cfc}}}, + {X: Field{[10]uint32{0x01dd5e03, 0x034c3136, 0x00dda414, 0x012edfea, 0x02180d09, 0x022e8c13, 0x032f3c2e, 0x030163eb, 0x00bf540b, 0x0021c1ec}}, Y: Field{[10]uint32{0x0100b915, 0x0127083c, 0x0025dfbb, 0x03a6599f, 0x0318db5e, 0x02816535, 0x006bd25a, 0x0040cd43, 0x0175fb79, 0x001c2d84}}}, + {X: Field{[10]uint32{0x03ca842d, 0x02a8b594, 0x008b9613, 0x03386db0, 0x0122f67d, 0x023999d2, 0x02070a72, 0x03340a21, 0x030c3ce6, 0x000ff6cd}}, Y: Field{[10]uint32{0x00e0dafc, 0x0121ac32, 0x0006317a, 0x03e65004, 0x035d3a5e, 0x002c7bfb, 0x004c5ec1, 0x000d1297, 0x00f2474a, 0x00058d46}}}, + {X: Field{[10]uint32{0x00472f62, 0x020f6252, 0x031af2a2, 0x0180252c, 0x03330779, 0x01bd6352, 0x01411e70, 0x03552680, 0x0302412c, 0x0030df68}}, Y: Field{[10]uint32{0x0221f92a, 0x031bf84e, 0x01d26801, 0x0002e2b4, 0x01ca8490, 0x0282a0af, 0x002d1daa, 0x010bd21c, 0x028716c6, 0x002a823c}}}, + {X: Field{[10]uint32{0x01e08a1c, 0x009bf1e9, 0x007cf257, 0x03b0ac2d, 0x0160ade9, 0x0171e8ce, 0x01f923b0, 0x02c3e494, 0x0150381a, 0x000fae81}}, Y: Field{[10]uint32{0x030fa7d9, 0x010697f3, 0x02396557, 0x03668316, 0x00492a1a, 0x02bf1380, 0x02396525, 0x0374ea21, 0x00ebb681, 0x000509ec}}}, + {X: Field{[10]uint32{0x0350cee8, 0x02be39ae, 0x02e0194e, 0x029e14d5, 0x02e43f20, 0x01d53e83, 0x024628f7, 0x035752fd, 0x02a18ce5, 0x00259c8f}}, Y: Field{[10]uint32{0x01f49bdd, 0x0019a960, 0x00e8a713, 0x016eca32, 0x016cf51b, 0x035122bb, 0x02eef512, 0x02fc43a1, 0x03bbb9bb, 0x0016b427}}}, + {X: Field{[10]uint32{0x03663748, 0x02358128, 0x00f1329f, 0x02499e44, 0x00ab8228, 0x01575716, 0x009d3460, 0x02db34e8, 0x02117ecf, 0x0035d914}}, Y: Field{[10]uint32{0x028540f7, 0x02e00c70, 0x01a46eeb, 0x00430897, 0x03bf2c9b, 0x02eaaa73, 0x0089dbe2, 0x037820b2, 0x0104d20f, 0x002adf30}}}, + {X: Field{[10]uint32{0x00ada5e6, 0x02a241b4, 0x03e434dc, 0x0196d2b1, 0x008c8660, 0x0352f251, 0x01907afa, 0x02c4d883, 0x03dc7e0a, 0x0007dac8}}, Y: Field{[10]uint32{0x023e247c, 0x03b0959d, 0x02602398, 0x0103923d, 0x01560414, 0x036aa7ac, 0x00920405, 0x00e76ab4, 0x025d6bc6, 0x00230dec}}}, + {X: Field{[10]uint32{0x01459945, 0x0203541d, 0x01f9d9bd, 0x004a2bf4, 0x036abb5a, 0x0303a3b5, 0x0079e64b, 0x0285a1e5, 0x00bbaa06, 0x0011bfc1}}, Y: Field{[10]uint32{0x011bcd4a, 0x03e7693d, 0x0176491e, 0x00a5075c, 0x03e7e9d2, 0x011e986a, 0x0133bb9e, 0x02e838e4, 0x02c26af2, 0x002c4413}}}, + {X: Field{[10]uint32{0x02597ce2, 0x012a20ca, 0x02f86f3f, 0x02cf6092, 0x013bcdff, 0x022ec114, 0x0076e545, 0x0201a4ec, 0x00253888, 0x003286cf}}, Y: Field{[10]uint32{0x01e0285a, 0x006ff8a8, 0x03622005, 0x03d5e611, 0x01dfc9d6, 0x0367a07b, 0x0109d11b, 0x01b711d8, 0x02fbdd1b, 0x003c0a45}}}, + {X: Field{[10]uint32{0x01ece6b4, 0x011e8426, 0x01763ee7, 0x01dcae00, 0x005fad12, 0x0336f7ec, 0x03ec7fed, 0x027b123b, 0x029aadb6, 0x00032587}}, Y: Field{[10]uint32{0x018fb6e4, 0x00bc9a67, 0x022a984e, 0x00f0d7c2, 0x0056bb9b, 0x005b12dc, 0x00bb70ad, 0x014f949c, 0x0033e0b2, 0x0011a69b}}}, + {X: Field{[10]uint32{0x039d99dc, 0x03ca2fe4, 0x03393ea4, 0x03d6e6d9, 0x037b3132, 0x035139dd, 0x03817089, 0x0332534f, 0x02791418, 0x000e8ba8}}, Y: Field{[10]uint32{0x03f164be, 0x025b195a, 0x01f8831a, 0x02381949, 0x02b981bf, 0x02344f8b, 0x0217dc71, 0x036486f8, 0x0143c035, 0x00056014}}}, + {X: Field{[10]uint32{0x025a7a4a, 0x03b7a9ad, 0x01189e7d, 0x02333cd3, 0x034e24d4, 0x00bec700, 0x03fd6ad5, 0x03c2f868, 0x00dfb3a1, 0x000105b7}}, Y: Field{[10]uint32{0x00c204c3, 0x037444d8, 0x0235beba, 0x0028f1b2, 0x0147e90a, 0x004cb6cc, 0x01777812, 0x00cd66b0, 0x02c2bbc9, 0x001da427}}}, + {X: Field{[10]uint32{0x03c63eb3, 0x021516e4, 0x022b1731, 0x0312174a, 0x032ed9d1, 0x0352cfb4, 0x03a51772, 0x0305d422, 0x02459aef, 0x002ce5f0}}, Y: Field{[10]uint32{0x01e71748, 0x00732dbd, 0x03a7e447, 0x01d38c45, 0x02228135, 0x024810fb, 0x0018ffc6, 0x00d9daad, 0x03603076, 0x002841a8}}}, + {X: Field{[10]uint32{0x000637df, 0x03ce4275, 0x0306532e, 0x03034a68, 0x02c1bdb8, 0x03a026ca, 0x01dbb755, 0x005918ca, 0x009befd6, 0x001d7156}}, Y: Field{[10]uint32{0x03e6f631, 0x009eb7e8, 0x0347dcba, 0x025687f8, 0x0395e602, 0x007f39ae, 0x02a19dd8, 0x00417243, 0x01e51492, 0x0009bcf8}}}, + {X: Field{[10]uint32{0x029135a5, 0x039bc225, 0x018b6620, 0x02004679, 0x02e4b0dc, 0x00e6a411, 0x015158c4, 0x01d0c85f, 0x0112a351, 0x000bbbb3}}, Y: Field{[10]uint32{0x01aaba4c, 0x03d2474b, 0x03707806, 0x019c5051, 0x01136064, 0x031315e4, 0x013d7539, 0x023b4c6d, 0x03d048c5, 0x003877ba}}}, + {X: Field{[10]uint32{0x00be65d1, 0x000164e7, 0x00124aa1, 0x002b1d6b, 0x038cab86, 0x02b77699, 0x031d52e5, 0x0359419a, 0x00915d39, 0x002a607c}}, Y: Field{[10]uint32{0x013ed069, 0x0180101f, 0x00e7b66c, 0x01253ccd, 0x0188d4f1, 0x025b9442, 0x018b23c0, 0x000a4cb6, 0x03cb7ab6, 0x00132c27}}}, + {X: Field{[10]uint32{0x03d4ef62, 0x01302826, 0x0331a9aa, 0x01a4999a, 0x02545cd8, 0x01d679e7, 0x01260c9a, 0x00740828, 0x02e3a7e8, 0x0006867e}}, Y: Field{[10]uint32{0x00937902, 0x016dcaac, 0x0070789c, 0x03c1a2b8, 0x0379714d, 0x021df71e, 0x01bf7bfd, 0x0171a78a, 0x02578af2, 0x000a01f5}}}, + {X: Field{[10]uint32{0x0020c61a, 0x00a04f49, 0x00567195, 0x0052674c, 0x029b0f43, 0x0198b9dd, 0x036f1392, 0x03465835, 0x016c1ee7, 0x0033fe1a}}, Y: Field{[10]uint32{0x02d16df8, 0x0314b179, 0x030c147f, 0x008ad8ad, 0x023581f1, 0x00daee05, 0x0004b1a1, 0x025a4097, 0x00138a39, 0x002125f8}}}, + {X: Field{[10]uint32{0x0227ce8c, 0x02417887, 0x01cd66cc, 0x016a7969, 0x00966911, 0x03523ac1, 0x02a95824, 0x00d1e72a, 0x00204a8b, 0x001a05e9}}, Y: Field{[10]uint32{0x033052ad, 0x01ca4dde, 0x026fd95e, 0x0309d8c8, 0x028182a0, 0x01720e17, 0x03254653, 0x01e97261, 0x028bc337, 0x00256151}}}, + {X: Field{[10]uint32{0x01d9d58e, 0x00cf5b23, 0x03233bcd, 0x00656494, 0x037d114b, 0x01e51e3c, 0x013eb995, 0x03309abc, 0x00846e0e, 0x00273bff}}, Y: Field{[10]uint32{0x025d2582, 0x0342aa3e, 0x00426856, 0x00d0fa99, 0x00510602, 0x03bc71fb, 0x03c4d4af, 0x03e86c19, 0x021a5cf8, 0x003806b2}}}, + {X: Field{[10]uint32{0x03456c49, 0x03c3b734, 0x00543835, 0x00c63104, 0x03995a37, 0x00c0797e, 0x03965892, 0x03dff765, 0x01c6f203, 0x001a9b87}}, Y: Field{[10]uint32{0x0384496b, 0x02eb284d, 0x03482f93, 0x02fdbbf4, 0x0183b579, 0x02a5d51b, 0x01f9ad86, 0x00fa7ac1, 0x039898b9, 0x000a81ca}}}, + {X: Field{[10]uint32{0x02a9129b, 0x00c75f34, 0x036d24dd, 0x008626b0, 0x008ba3a5, 0x02e461ba, 0x018b4f0f, 0x01d86d45, 0x021a588d, 0x001f9eeb}}, Y: Field{[10]uint32{0x033dbdd6, 0x0215beaa, 0x0129dcc4, 0x02f03503, 0x0017e6bb, 0x0343e1ce, 0x01e60e57, 0x01731ca2, 0x023b3799, 0x0014663d}}}, + {X: Field{[10]uint32{0x006bd253, 0x0316cd40, 0x039f805d, 0x018fb84b, 0x03ffa158, 0x02a17954, 0x014966ff, 0x02acafb5, 0x03a863de, 0x00004ff0}}, Y: Field{[10]uint32{0x03821459, 0x016d5ddc, 0x01d58b3b, 0x0209c0b9, 0x03a8b77c, 0x039daa55, 0x00a59e76, 0x01415bff, 0x02459127, 0x0038c70c}}}, + {X: Field{[10]uint32{0x02e9c167, 0x02f1b445, 0x00ccbbec, 0x00983452, 0x03e56503, 0x03a27a92, 0x036dbeda, 0x03645fda, 0x01eb3f39, 0x003ff8a3}}, Y: Field{[10]uint32{0x01bb988a, 0x02abb5a7, 0x01b2c262, 0x03844a31, 0x01383c4b, 0x0380acff, 0x03857604, 0x01113794, 0x02b3b878, 0x00236294}}}, + {X: Field{[10]uint32{0x01cc57be, 0x020ec3c1, 0x003cd444, 0x0150772f, 0x00481c43, 0x003e83b3, 0x0379a883, 0x01b79f40, 0x00239bf2, 0x0000a3b5}}, Y: Field{[10]uint32{0x00ce126e, 0x001016c4, 0x00ac37bc, 0x01c866f4, 0x012d5608, 0x012e3616, 0x020d860b, 0x02399d14, 0x02e2ea01, 0x00064848}}}, + {X: Field{[10]uint32{0x03f8a708, 0x01cb22c2, 0x02d7276c, 0x00e0be01, 0x025aa4ca, 0x03b9da76, 0x02acc00e, 0x03121014, 0x027c7be8, 0x001efce0}}, Y: Field{[10]uint32{0x0159eebe, 0x0090fa29, 0x011726bb, 0x001c6b4a, 0x0224a75d, 0x035c75c1, 0x00601fa1, 0x014a6d17, 0x02eee505, 0x002497cf}}}, + {X: Field{[10]uint32{0x03ce7000, 0x0384e01b, 0x017a4a7b, 0x02accc28, 0x012acb5a, 0x007dedaf, 0x02de8627, 0x00070fe3, 0x0299021a, 0x0033c69f}}, Y: Field{[10]uint32{0x01d3d673, 0x02855756, 0x0078a7c3, 0x028fce2a, 0x035f1e70, 0x00ce8d18, 0x023e7400, 0x0298445a, 0x02837b3b, 0x00084d96}}}, + {X: Field{[10]uint32{0x01bb29c7, 0x02f2ba44, 0x02944afc, 0x019d4989, 0x02af3bdd, 0x02f42a61, 0x036c8121, 0x01f31038, 0x0237d151, 0x0039de7a}}, Y: Field{[10]uint32{0x038a8a2f, 0x03200575, 0x03f81e8a, 0x01b51706, 0x026472bb, 0x00a71bd0, 0x00e2c6c0, 0x01dd6a81, 0x01ac4b19, 0x000cb18d}}}, + {X: Field{[10]uint32{0x026c2a92, 0x02dfda3c, 0x002a1638, 0x00a23806, 0x02f96977, 0x030e0754, 0x019785d6, 0x01084056, 0x012b76b5, 0x00040c27}}, Y: Field{[10]uint32{0x018265a9, 0x02340819, 0x02a1a043, 0x02b3066d, 0x02f3abce, 0x03e4c4c5, 0x03b9b377, 0x0261c03b, 0x03834c85, 0x000087b7}}}, + {X: Field{[10]uint32{0x033a27f9, 0x039c8694, 0x00701813, 0x00469c50, 0x02f2b6b3, 0x0244c80d, 0x032240de, 0x011b50ba, 0x0309701e, 0x001e649e}}, Y: Field{[10]uint32{0x0358920f, 0x03613b4e, 0x039053b3, 0x03bae34a, 0x008a0f47, 0x0184d841, 0x00756403, 0x021b0693, 0x0113a818, 0x003edf19}}}, + {X: Field{[10]uint32{0x0128849e, 0x03631cc5, 0x0137e0fd, 0x038128f7, 0x03085b1d, 0x0338938f, 0x0193e683, 0x00d0a67d, 0x023377da, 0x001d0ed3}}, Y: Field{[10]uint32{0x002f3216, 0x0135ad9d, 0x014f1816, 0x039a1278, 0x01fbba7d, 0x02b9cca0, 0x03f178ca, 0x018fb1ec, 0x0069b5ee, 0x000de400}}}, + {X: Field{[10]uint32{0x004f04da, 0x01a18143, 0x02cbf498, 0x03ec29ce, 0x02e46064, 0x02547f9a, 0x02cd9b49, 0x02edfc6a, 0x02e10ce1, 0x0035cf34}}, Y: Field{[10]uint32{0x0253dde8, 0x01fd2b6c, 0x0209614b, 0x0138bc8a, 0x00cae7f8, 0x028cffc7, 0x0087fcd6, 0x039c7fd6, 0x02e44cc6, 0x0039a9d8}}}, + {X: Field{[10]uint32{0x01f6fa68, 0x00b5a5e5, 0x033e8ed3, 0x02051f01, 0x01ba6324, 0x01ecfafc, 0x03318a17, 0x0091acff, 0x00d3f563, 0x000f8700}}, Y: Field{[10]uint32{0x010776d3, 0x01cbc34b, 0x00ef6b4a, 0x000308ff, 0x0118ce2e, 0x02038e07, 0x036aecb0, 0x0304a440, 0x00cf87d5, 0x0037cad8}}}, + {X: Field{[10]uint32{0x0168053c, 0x03f71b36, 0x03221a32, 0x039318a6, 0x00ed90c2, 0x01d49b6d, 0x00f10e68, 0x00594f97, 0x039092da, 0x0025b81f}}, Y: Field{[10]uint32{0x01c2bd66, 0x0081e1d3, 0x036164ab, 0x03f8b978, 0x021f8517, 0x03eb4ee6, 0x0220ea5b, 0x03a9ae7b, 0x003bb8a2, 0x00359707}}}, + {X: Field{[10]uint32{0x03e1debb, 0x005deaab, 0x02854d8e, 0x0148ce18, 0x02d27a76, 0x00b81e5a, 0x01cc124b, 0x03b8094c, 0x004026b1, 0x001b48c1}}, Y: Field{[10]uint32{0x0179bbd3, 0x00ef027b, 0x012c2598, 0x00a2a33f, 0x00e3dc62, 0x0393b002, 0x03bde471, 0x011a2543, 0x0195faa1, 0x003cea3e}}}, + {X: Field{[10]uint32{0x01707781, 0x03f3bc79, 0x02d9dc76, 0x004692c1, 0x00ad7d45, 0x039c584e, 0x00e43c49, 0x027700c5, 0x035c1f94, 0x002376a7}}, Y: Field{[10]uint32{0x0001310d, 0x0229609a, 0x03a775c7, 0x03bc2b96, 0x01ad9d9b, 0x02dcdd0d, 0x03674f5d, 0x02c2944a, 0x03aa7585, 0x0034158f}}}, + {X: Field{[10]uint32{0x03de97cd, 0x028d5eee, 0x036c4e5a, 0x03ead309, 0x03b4bf17, 0x03ff6905, 0x02da369f, 0x01cd8fd7, 0x013f9866, 0x00141c18}}, Y: Field{[10]uint32{0x0034ebc2, 0x033c26f7, 0x008178a0, 0x01f921a9, 0x02eb40e4, 0x02c5b6e1, 0x005751f9, 0x01fa8d06, 0x02ff4fe7, 0x00002c83}}}, + {X: Field{[10]uint32{0x0316bce7, 0x024bac2b, 0x03a8efc7, 0x01d1aa6c, 0x0004986d, 0x0306a862, 0x038838ea, 0x00515ae6, 0x00f0bfab, 0x000e929c}}, Y: Field{[10]uint32{0x01c4f3e5, 0x03d68f2b, 0x01e248bd, 0x022608e0, 0x03843b3e, 0x0013a108, 0x0032980c, 0x023b6a86, 0x02931916, 0x00391492}}}, + {X: Field{[10]uint32{0x02b33532, 0x02448c2a, 0x01a38b52, 0x0264ef37, 0x02db5fba, 0x018c1dcf, 0x01a82f54, 0x0166a76a, 0x00921831, 0x000b373e}}, Y: Field{[10]uint32{0x017677b9, 0x00d61c1d, 0x02044e0a, 0x0248c8a4, 0x010fd956, 0x00aaf3a3, 0x02299e74, 0x00fcca17, 0x02eac911, 0x003223a9}}}, + {X: Field{[10]uint32{0x00955c99, 0x028b778a, 0x0203d781, 0x00082630, 0x022b7fed, 0x00cc667a, 0x02e0cd6f, 0x017d8404, 0x028df8f1, 0x0006a164}}, Y: Field{[10]uint32{0x00db4299, 0x00b38e5d, 0x02945568, 0x009147af, 0x010534a1, 0x001c970a, 0x013a6b03, 0x01da8ff8, 0x02b2821c, 0x0006ce61}}}, + {X: Field{[10]uint32{0x01a1d388, 0x01ae13c7, 0x02c1a6b6, 0x0198f988, 0x00dde019, 0x006e7c04, 0x01206634, 0x00c19685, 0x01a1d6b0, 0x0021b453}}, Y: Field{[10]uint32{0x0399b2de, 0x00e030a0, 0x01055fd1, 0x00f87db9, 0x01cfe568, 0x00e010b3, 0x004a6f9f, 0x017327a2, 0x00ec764f, 0x0019e545}}}, + {X: Field{[10]uint32{0x02201cc2, 0x0340d5c5, 0x01441565, 0x0265f091, 0x03300459, 0x02941e38, 0x03343415, 0x0321e50c, 0x014f0bdf, 0x003907dd}}, Y: Field{[10]uint32{0x010e8e8e, 0x02c3f75e, 0x02e47dcb, 0x0382ecf3, 0x000743f5, 0x024bba6d, 0x02f119f4, 0x00647b7f, 0x0241c21d, 0x00374165}}}, + {X: Field{[10]uint32{0x0075cae4, 0x0265b4d1, 0x022fc756, 0x01ea0ce3, 0x032946e1, 0x03911190, 0x0268d8f4, 0x02fb11e5, 0x026845b5, 0x002dfb24}}, Y: Field{[10]uint32{0x03dda53b, 0x018b9c53, 0x002cb7cc, 0x01425e3b, 0x00d945e3, 0x01e51dad, 0x02210f57, 0x027a4043, 0x018bb753, 0x0002ad28}}}, + {X: Field{[10]uint32{0x03518912, 0x01da752d, 0x009d456b, 0x02f020c9, 0x03bf3ecf, 0x02896142, 0x022554a0, 0x03786459, 0x01dcf1ea, 0x000903f6}}, Y: Field{[10]uint32{0x0104515b, 0x001ac234, 0x0220776a, 0x025cc4d4, 0x005318a8, 0x02a9aa01, 0x03a3a62e, 0x00e42214, 0x025ee0ba, 0x002bc0fe}}}, + {X: Field{[10]uint32{0x035bb769, 0x015c8de1, 0x00129a5c, 0x037e3c73, 0x022b88aa, 0x02330fea, 0x01e39d28, 0x00c4525e, 0x00ecee7d, 0x0000d4f1}}, Y: Field{[10]uint32{0x012d147e, 0x03693f34, 0x03cf02a0, 0x02e16b8c, 0x0228e607, 0x035c2ae3, 0x000118ba, 0x01384ba5, 0x004090af, 0x0027e9fb}}}, + {X: Field{[10]uint32{0x03d933de, 0x0200dd8a, 0x0082d39e, 0x02232f81, 0x03893409, 0x018a3f46, 0x0206ae11, 0x019a2045, 0x018aa855, 0x003d3bb5}}, Y: Field{[10]uint32{0x033b3d44, 0x01bc3e37, 0x03eb9160, 0x03e94b5f, 0x0118b40b, 0x0233ad03, 0x031969ca, 0x0381c341, 0x0364fe74, 0x00109e33}}}, + {X: Field{[10]uint32{0x026ef1ce, 0x004a4389, 0x000fa01a, 0x0029cdaf, 0x000b284f, 0x02d554b5, 0x00c17d50, 0x0099810d, 0x02e2e2d0, 0x001a63fe}}, Y: Field{[10]uint32{0x01ffc970, 0x00206638, 0x0143fab6, 0x03fec2f4, 0x038bd50c, 0x025bf04b, 0x027e53a4, 0x016dd076, 0x008d0784, 0x000659b3}}}, + {X: Field{[10]uint32{0x01314098, 0x01c48699, 0x0196b595, 0x028013ed, 0x0122d884, 0x005f2251, 0x020587d4, 0x0305035b, 0x016d5c88, 0x002d4ed6}}, Y: Field{[10]uint32{0x032c745a, 0x025eba23, 0x01a56771, 0x01c13306, 0x0025deeb, 0x01b0cbbb, 0x03de4857, 0x03f9db21, 0x00b909be, 0x00377fd8}}}, + {X: Field{[10]uint32{0x0213066a, 0x004bedc6, 0x02d65527, 0x01967d89, 0x00791518, 0x03a7c9da, 0x024cba67, 0x00efe75b, 0x0321d439, 0x0025d812}}, Y: Field{[10]uint32{0x028d17f8, 0x018988d2, 0x03616360, 0x0153e809, 0x027d871c, 0x00d5fc99, 0x005b0d17, 0x01fdf197, 0x0384e1cf, 0x0039ebbc}}}, + {X: Field{[10]uint32{0x01bb8623, 0x01213a54, 0x007edb63, 0x003b6875, 0x013b3876, 0x0018bdef, 0x02b234c1, 0x03b980c4, 0x01ba6eda, 0x001e8d72}}, Y: Field{[10]uint32{0x0184a5b1, 0x035a9093, 0x002457eb, 0x015e1bbe, 0x00769f3a, 0x03bdc128, 0x0292b586, 0x019d85ab, 0x027ba454, 0x000ce25e}}}, + {X: Field{[10]uint32{0x011e2804, 0x00836543, 0x03e01b6a, 0x005e19c1, 0x02c9638b, 0x0098c043, 0x026e0cc9, 0x00457728, 0x0075f989, 0x0021b503}}, Y: Field{[10]uint32{0x00315ca3, 0x00e1d0bb, 0x00410c0f, 0x010b105c, 0x01dddf28, 0x0211ad72, 0x031dcc8a, 0x02307839, 0x03624ffd, 0x001d66f5}}}, + {X: Field{[10]uint32{0x009badb7, 0x037acc58, 0x001ce3e8, 0x03a6ca90, 0x01fc77f6, 0x00ee4397, 0x03ddea49, 0x02de7d98, 0x03479a4b, 0x00180eff}}, Y: Field{[10]uint32{0x01a4f4b4, 0x008e6627, 0x0320ee1e, 0x0377700d, 0x03358c86, 0x034ce80b, 0x02eefffc, 0x006aa9ab, 0x01fc6528, 0x00018a1e}}}, + {X: Field{[10]uint32{0x032203ed, 0x039a2c40, 0x03d7b5de, 0x03705261, 0x00fa13eb, 0x029d68db, 0x01e0bbf8, 0x01e9f5c8, 0x00f3c7dc, 0x0001722e}}, Y: Field{[10]uint32{0x0208e7d3, 0x0124d033, 0x0190ce77, 0x0328506f, 0x013faa43, 0x023f35b9, 0x01d304d8, 0x031af5f6, 0x03382bc4, 0x001ad807}}}, + {X: Field{[10]uint32{0x0144fb05, 0x018f3a1d, 0x00505a79, 0x01fa4024, 0x0025a6f2, 0x020edcde, 0x027a55ff, 0x02530907, 0x02c5a916, 0x000c4f07}}, Y: Field{[10]uint32{0x003c6384, 0x01980dc4, 0x02e59825, 0x023891d4, 0x0101ed85, 0x031118b1, 0x0244699b, 0x0197ebed, 0x03ff9a43, 0x00270c54}}}, + {X: Field{[10]uint32{0x01d923bd, 0x000550ea, 0x006bf98b, 0x03569e5d, 0x00150b4b, 0x01a383e8, 0x0268cb29, 0x02bbecc0, 0x02514616, 0x000146b2}}, Y: Field{[10]uint32{0x02e028b4, 0x0115e9d3, 0x001cc203, 0x0310c77d, 0x01a0a66e, 0x0138acd8, 0x0163ca4f, 0x01dd1eff, 0x01b4073a, 0x001f147e}}}, + {X: Field{[10]uint32{0x0219677d, 0x01edb0c9, 0x00a122ab, 0x0359dd0f, 0x01353071, 0x02efa5ea, 0x036d3f92, 0x00192124, 0x039927ea, 0x0012ba34}}, Y: Field{[10]uint32{0x008a47a3, 0x019df50f, 0x027c919e, 0x01790d4b, 0x000f350f, 0x0244414e, 0x02a332b0, 0x02f3a0e3, 0x019bc251, 0x003e7714}}}, + {X: Field{[10]uint32{0x0256dcca, 0x01e137a8, 0x0257baa0, 0x022712bc, 0x03b100c2, 0x021352ef, 0x01a054a8, 0x02d68230, 0x015d3f9c, 0x001af472}}, Y: Field{[10]uint32{0x03803b5b, 0x0153be1a, 0x03e71396, 0x015ea221, 0x00801923, 0x02c1f79e, 0x031fc401, 0x02c4bdbd, 0x003bde39, 0x001e4d8a}}}, + {X: Field{[10]uint32{0x0249480e, 0x0374a0ea, 0x028ce19b, 0x00027be7, 0x035737f7, 0x001feef2, 0x0370a62e, 0x032ab6b8, 0x02294642, 0x003889e2}}, Y: Field{[10]uint32{0x0037dd01, 0x03c50ed2, 0x00f77b36, 0x02d60f59, 0x01087bc8, 0x0360bd87, 0x03570b7e, 0x00f39cd6, 0x03cdf394, 0x0010c48b}}}, + {X: Field{[10]uint32{0x0296c644, 0x03d2b13f, 0x0071ffee, 0x00b02c89, 0x008d24fb, 0x00ccd60c, 0x004bb019, 0x01a7f744, 0x00d59f94, 0x001a14df}}, Y: Field{[10]uint32{0x0000050e, 0x018f2061, 0x024a7320, 0x01165e77, 0x004003ab, 0x01b8ec67, 0x0399ff32, 0x01e9476f, 0x00ef4110, 0x001d94d8}}}, + {X: Field{[10]uint32{0x025af330, 0x024281dd, 0x03b54b12, 0x03bcfe06, 0x0070be08, 0x03022209, 0x00a0735f, 0x027e7e3e, 0x03c669c9, 0x0017b27f}}, Y: Field{[10]uint32{0x0163b222, 0x0084e5c4, 0x03b381a4, 0x03737472, 0x001f4f1c, 0x015ad1f0, 0x00c32290, 0x021c581e, 0x0008e76f, 0x002aed50}}}, + {X: Field{[10]uint32{0x004dfae9, 0x02661d1c, 0x0231db23, 0x03d8572b, 0x0101a330, 0x01945528, 0x0071aba4, 0x00c3eea5, 0x008e5d49, 0x00138006}}, Y: Field{[10]uint32{0x01317868, 0x02ee0753, 0x02bba57f, 0x00a74821, 0x015ed3fe, 0x016d0082, 0x03656dd3, 0x00daa9cf, 0x03302824, 0x0001f9db}}}, + {X: Field{[10]uint32{0x015ed984, 0x0377f57c, 0x02e3c8aa, 0x0392f4ed, 0x03a2659c, 0x0130bcfe, 0x0139edeb, 0x0054bbff, 0x03a4d480, 0x0012b8d1}}, Y: Field{[10]uint32{0x02d4e523, 0x00b170d8, 0x033070ca, 0x0307cd71, 0x0165bb6a, 0x029cb18d, 0x02b8ba7b, 0x033f7d3e, 0x03460d44, 0x000e0f8b}}}, + {X: Field{[10]uint32{0x006665ef, 0x03386e27, 0x0319c603, 0x031363dd, 0x0235fd09, 0x01942697, 0x02d90fc8, 0x02b03be5, 0x0224a8d3, 0x000cb2b7}}, Y: Field{[10]uint32{0x038bea36, 0x004342be, 0x036af55c, 0x03cb8324, 0x02266939, 0x032a27e6, 0x023c5aa6, 0x02c4dd6d, 0x00735c63, 0x0021c9ce}}}, + {X: Field{[10]uint32{0x01cfcbee, 0x00891114, 0x0204f5f4, 0x030f53dc, 0x0320c703, 0x03e1f08b, 0x00e68910, 0x01d5d9ab, 0x01956014, 0x002393bc}}, Y: Field{[10]uint32{0x02ed47af, 0x025c1b81, 0x00666045, 0x00332527, 0x02cd5b9d, 0x0003ef3f, 0x02da0afc, 0x01f06de7, 0x02e389d9, 0x0000be9c}}}, + {X: Field{[10]uint32{0x00a2c30a, 0x01f9ffe9, 0x02509aae, 0x005a7bf0, 0x01559d73, 0x02181e80, 0x01549911, 0x000fdb13, 0x035c4adc, 0x000d7f55}}, Y: Field{[10]uint32{0x0248e000, 0x012b7472, 0x00aa1347, 0x03367252, 0x03dbf3ee, 0x033442b1, 0x0300926d, 0x02079f2d, 0x039d2748, 0x003e695d}}}, + {X: Field{[10]uint32{0x010a9cf6, 0x00d7fb72, 0x032873c6, 0x017d7d76, 0x03efc12f, 0x031049b1, 0x00929a52, 0x00965452, 0x00507fd0, 0x0024cb93}}, Y: Field{[10]uint32{0x028ba783, 0x0187be6e, 0x01f2875f, 0x03ef36fc, 0x009e84ef, 0x034660b0, 0x036b1b24, 0x028670a7, 0x0221bbac, 0x00339af2}}}, + {X: Field{[10]uint32{0x01fbea11, 0x01175cd2, 0x03fb211a, 0x02b4d77a, 0x0355d3e2, 0x03d165c1, 0x036a37f2, 0x014706f8, 0x024422a0, 0x0032b637}}, Y: Field{[10]uint32{0x001c347a, 0x008e99bc, 0x013e0533, 0x035e2a7f, 0x01308eeb, 0x013e1bc4, 0x0241c903, 0x01a7ca02, 0x031d4f66, 0x00122c37}}}, + {X: Field{[10]uint32{0x009594d6, 0x03efa41b, 0x0357b462, 0x0323f3ad, 0x031919ff, 0x032cd8e0, 0x016aa646, 0x03eb9f40, 0x0304c847, 0x0027f1f4}}, Y: Field{[10]uint32{0x019860ff, 0x038e9143, 0x03c9e516, 0x01b39352, 0x00196367, 0x01ebf729, 0x029dd38a, 0x02861f36, 0x00e13bc6, 0x003745f0}}}, + {X: Field{[10]uint32{0x008b5849, 0x00d5d866, 0x000b4c89, 0x03dd305f, 0x008300e4, 0x02537aee, 0x00654538, 0x0281771a, 0x00df10d4, 0x00106e9b}}, Y: Field{[10]uint32{0x007ad4c5, 0x026107f9, 0x03ac5930, 0x02133c54, 0x01ece57e, 0x00a0ccc8, 0x031e278b, 0x00259795, 0x03158c3f, 0x001fad8a}}}, + {X: Field{[10]uint32{0x01c7377b, 0x01ee9104, 0x02884b22, 0x0037c15f, 0x03d5bbf3, 0x03bee1a4, 0x0174248c, 0x01ab9a8b, 0x025aaef3, 0x0007fe7f}}, Y: Field{[10]uint32{0x01e74278, 0x00815d7c, 0x00692165, 0x01416f99, 0x01506908, 0x032d57c2, 0x009cf41f, 0x0000e127, 0x036c585c, 0x001ae892}}}, + {X: Field{[10]uint32{0x03f5d660, 0x03ce31b2, 0x03ebd893, 0x00507e3d, 0x026d1348, 0x0215b09c, 0x019d0704, 0x01b4a79b, 0x00440d70, 0x000a675f}}, Y: Field{[10]uint32{0x0103ff32, 0x0217ba8b, 0x000400fc, 0x03fe6d25, 0x0062f7d1, 0x01b7a6b3, 0x01b48877, 0x01d3832a, 0x00f34d03, 0x0003929d}}}, + {X: Field{[10]uint32{0x02e3a67d, 0x02caff5c, 0x012d69f7, 0x00b73a94, 0x020b607c, 0x00f5ba4e, 0x0318ceb8, 0x03261db8, 0x02d90ec1, 0x00280ccf}}, Y: Field{[10]uint32{0x03a0539e, 0x0216467e, 0x0141e0d6, 0x00eedae2, 0x0019f83e, 0x007f9ed4, 0x03373932, 0x01da74d6, 0x03655f51, 0x00369f74}}}, + {X: Field{[10]uint32{0x004251e0, 0x02e13e90, 0x020d2e75, 0x0005593a, 0x032821cf, 0x02a5a197, 0x00093d0b, 0x028cc14d, 0x02a22e52, 0x00169104}}, Y: Field{[10]uint32{0x030e4313, 0x0101e363, 0x0300c7cd, 0x009d53ad, 0x033675ab, 0x001b4a4e, 0x010bc0ab, 0x015c3a0e, 0x00e07e6c, 0x001a91e2}}}, + {X: Field{[10]uint32{0x02b7b0b5, 0x008f3d8c, 0x03cdc3e8, 0x00770bf9, 0x01078335, 0x01a7e6d9, 0x0134ea6a, 0x00771839, 0x004c3b14, 0x0035dcbb}}, Y: Field{[10]uint32{0x009ac0df, 0x00a6f99a, 0x03cfdda9, 0x00bf6e26, 0x01c9ccd9, 0x036ace08, 0x010979dd, 0x0121f9c2, 0x000d1036, 0x002f64d0}}}, + {X: Field{[10]uint32{0x01f89336, 0x0288d9db, 0x0321cd04, 0x0293b284, 0x03d4452f, 0x03903e01, 0x033e1cd6, 0x0130effe, 0x02d2c769, 0x002525e0}}, Y: Field{[10]uint32{0x02d436dc, 0x0351672e, 0x00930b68, 0x005325ef, 0x019f4e2c, 0x03358f15, 0x032e5dbb, 0x008ad50d, 0x027fb8ba, 0x0039f179}}}, + {X: Field{[10]uint32{0x0057e6de, 0x013d85a9, 0x0070e233, 0x032185dd, 0x036d9ca0, 0x031271c7, 0x00a9e4d4, 0x03d67cf8, 0x01f575e6, 0x001fb9f5}}, Y: Field{[10]uint32{0x03d9f3ee, 0x01ccbbb5, 0x03d0197e, 0x000b5a81, 0x029cbbbe, 0x01be8c42, 0x0074add7, 0x00f99b24, 0x029c7612, 0x001118b6}}}, + {X: Field{[10]uint32{0x013f843e, 0x02baedec, 0x0320b50f, 0x011c2ee0, 0x018a5548, 0x01505e54, 0x005ba7c1, 0x011ed6de, 0x030ae08d, 0x001e92d8}}, Y: Field{[10]uint32{0x01937c00, 0x035c1da7, 0x025dc6b5, 0x00641fe7, 0x0269a3b2, 0x02d26037, 0x023a524d, 0x0007a5c5, 0x004fb868, 0x00328939}}}, + {X: Field{[10]uint32{0x02a82b96, 0x0071b2c6, 0x037939c3, 0x03cca653, 0x013a18ee, 0x02ed88f0, 0x02a55032, 0x03102902, 0x0242428a, 0x0034b642}}, Y: Field{[10]uint32{0x0234972a, 0x013568fc, 0x03b66746, 0x01b960b7, 0x01394a3b, 0x002c7838, 0x0039e064, 0x03567cc0, 0x02332367, 0x001d614b}}}, + {X: Field{[10]uint32{0x015d13e0, 0x0382c5ba, 0x01b91340, 0x017120d2, 0x03a4809b, 0x00bb53cb, 0x01b56066, 0x037ecf68, 0x01ab6206, 0x00364926}}, Y: Field{[10]uint32{0x0271be38, 0x00a6caac, 0x0294111f, 0x0192f800, 0x00fa4dfc, 0x024eae98, 0x01400749, 0x03f86a3e, 0x00ed26a4, 0x00108d51}}}, + {X: Field{[10]uint32{0x01d09a23, 0x020c3d71, 0x034dc8d5, 0x02f9b1af, 0x02bba6f2, 0x02dffe1e, 0x00e2d315, 0x01799b49, 0x02c25887, 0x003b0307}}, Y: Field{[10]uint32{0x00591421, 0x02e9058a, 0x00d7aee8, 0x0261d601, 0x018b798c, 0x01822fde, 0x009a237e, 0x02f46071, 0x03f1648a, 0x003949a9}}}, + {X: Field{[10]uint32{0x03ba8863, 0x0384025a, 0x00c2ef30, 0x00205de6, 0x003a6ae5, 0x0243a814, 0x01b48052, 0x01662621, 0x0168835b, 0x001a4e02}}, Y: Field{[10]uint32{0x0311e5f4, 0x01c3d78b, 0x03345a61, 0x01d6064b, 0x037522df, 0x005341f1, 0x0297137a, 0x02e98d14, 0x039d80f0, 0x001c6fa8}}}, + {X: Field{[10]uint32{0x00a9ab23, 0x02b7237f, 0x0062bebb, 0x0177d65b, 0x0115a40a, 0x007fcbfb, 0x00fe8d2e, 0x018df913, 0x01a19fd1, 0x00359ac7}}, Y: Field{[10]uint32{0x006b9946, 0x01a51d96, 0x03b6878a, 0x00749960, 0x015cc5d9, 0x001eccc5, 0x0217c4e6, 0x012edc72, 0x00ebbd2b, 0x001a33d9}}}, + {X: Field{[10]uint32{0x0298c95f, 0x0037220c, 0x01695a51, 0x01729ad6, 0x01503647, 0x0264c590, 0x0350d70c, 0x018b2e49, 0x00a2c6fa, 0x00277663}}, Y: Field{[10]uint32{0x00fbe821, 0x00381f6b, 0x03c8187a, 0x0017663f, 0x03407509, 0x018ecc76, 0x01278b7e, 0x02735be3, 0x03b853b9, 0x00156a22}}}, + {X: Field{[10]uint32{0x0141bfa2, 0x02a6b7b4, 0x01b925b9, 0x02336dea, 0x014efd84, 0x03078b5c, 0x00ecccd0, 0x03c6efa9, 0x002c842c, 0x0006d9af}}, Y: Field{[10]uint32{0x03673bea, 0x02e69c20, 0x00a890dd, 0x000620c7, 0x02402b35, 0x02108f2d, 0x003d88b6, 0x020ae2bd, 0x030155fe, 0x003f82d1}}}, + {X: Field{[10]uint32{0x00eb688a, 0x001d72b2, 0x00312c1c, 0x03243c3a, 0x03c7d2d5, 0x0248b800, 0x016a61c2, 0x00c77b4e, 0x01c48a92, 0x0002ca03}}, Y: Field{[10]uint32{0x02738a74, 0x0338c1b4, 0x03ff7da9, 0x01854c73, 0x00498c82, 0x00aeaebc, 0x02cb3ad6, 0x02f99acc, 0x01a6a2f8, 0x00206dd1}}}, + {X: Field{[10]uint32{0x018a6b5d, 0x0073717c, 0x0280f8cf, 0x01b3c055, 0x02413e90, 0x00438ba4, 0x00125ad5, 0x02e8720a, 0x011c9eb3, 0x001ef165}}, Y: Field{[10]uint32{0x00352a07, 0x02bd69a6, 0x01a1cd43, 0x03c3b88a, 0x000fbda2, 0x026b71b5, 0x026fc7f4, 0x02a2f6e2, 0x01d8480b, 0x00106e41}}}, + {X: Field{[10]uint32{0x02eabfc1, 0x00b14efd, 0x02ea34ed, 0x0023713c, 0x01116479, 0x0172a1a5, 0x02530952, 0x015235da, 0x00d12318, 0x001a7fdd}}, Y: Field{[10]uint32{0x03de2419, 0x02f9dd6b, 0x01bde0d4, 0x025f7325, 0x011d6173, 0x00eb7d7f, 0x02aca1eb, 0x027de04b, 0x02288eb9, 0x003ce8f9}}}, + {X: Field{[10]uint32{0x004af209, 0x014b86b2, 0x003b92c5, 0x0262a83c, 0x02ffa460, 0x039fda26, 0x028f8cdd, 0x034e967e, 0x013f01f6, 0x0017f9b7}}, Y: Field{[10]uint32{0x00dbfb55, 0x02f1d3d8, 0x01aacd6d, 0x00589d28, 0x03f356cc, 0x015443ab, 0x01197a91, 0x0340893b, 0x0101acb8, 0x0027baba}}}, + {X: Field{[10]uint32{0x0105f5f0, 0x008b9671, 0x023b121d, 0x031e3338, 0x01d3b52b, 0x0314fe44, 0x029fafe9, 0x01d76dd1, 0x0122cb04, 0x0011a7a4}}, Y: Field{[10]uint32{0x0058d812, 0x0138bf04, 0x0237ecb8, 0x0200276d, 0x0280d8a5, 0x01348b09, 0x025825fa, 0x02e9afd6, 0x03a838b2, 0x003f9d21}}}, + {X: Field{[10]uint32{0x0160e6ab, 0x018ed364, 0x00c1c06d, 0x0061c307, 0x0072a5e7, 0x02cc3e39, 0x01f816e8, 0x00a48ecb, 0x02bf06b6, 0x0007d28f}}, Y: Field{[10]uint32{0x01c89e2f, 0x031a9853, 0x02d39b77, 0x037a21c1, 0x011ebeeb, 0x00a6299f, 0x0138bd40, 0x02b86626, 0x02957602, 0x00263684}}}, + {X: Field{[10]uint32{0x03b86b0f, 0x01e3af54, 0x00773c2f, 0x00b743e9, 0x00411722, 0x01bd4428, 0x00226ac2, 0x03fc333b, 0x01fe1c12, 0x00363aa5}}, Y: Field{[10]uint32{0x006288d9, 0x03bd1ca3, 0x03f5b25f, 0x026e8075, 0x01f154b5, 0x03a4b092, 0x00bebb3c, 0x03ca4ee2, 0x039edde6, 0x000556fb}}}, + {X: Field{[10]uint32{0x0227cac6, 0x01ef53c4, 0x02527179, 0x017771fc, 0x002bb36f, 0x01c114c0, 0x014b2cf8, 0x0201c488, 0x03c797b3, 0x0006b628}}, Y: Field{[10]uint32{0x0057814c, 0x00f017d2, 0x02a1ccfa, 0x01741355, 0x0158398c, 0x03f3d47b, 0x00189576, 0x008dfc55, 0x03aa3755, 0x001a029d}}}, + {X: Field{[10]uint32{0x00fa7d66, 0x03b0c609, 0x0292a3fd, 0x02cb0caa, 0x00355540, 0x03c2c3e2, 0x01426469, 0x0349b836, 0x010405d1, 0x003ffa9c}}, Y: Field{[10]uint32{0x0034eac8, 0x03413089, 0x00ed4cb5, 0x02bcb299, 0x00081f67, 0x01c0bb75, 0x02c8db75, 0x0281b113, 0x00e22d8d, 0x003b2891}}}, + {X: Field{[10]uint32{0x0159d8ab, 0x0192b22e, 0x00f3fc17, 0x02e95764, 0x01d3abe9, 0x03f5bd9d, 0x02141c8c, 0x02226152, 0x03a3f7fc, 0x0012b156}}, Y: Field{[10]uint32{0x00be2bd2, 0x02f24efe, 0x039ce15b, 0x02d06f61, 0x03714821, 0x0062c412, 0x0252d141, 0x03edeff4, 0x0391f135, 0x00271eca}}}, + {X: Field{[10]uint32{0x03718ac4, 0x01ebd42e, 0x01536fe2, 0x02a72949, 0x02bc7061, 0x0196e280, 0x01de0eb8, 0x02933bca, 0x00677aa9, 0x0017e051}}, Y: Field{[10]uint32{0x00d9c042, 0x033c4064, 0x01b3669a, 0x0251cf8e, 0x022b8cb8, 0x00c07ec0, 0x00340716, 0x02c9bf99, 0x01dc4062, 0x002f6a59}}}, + {X: Field{[10]uint32{0x01dd88bb, 0x03ac551d, 0x0390388b, 0x029346b2, 0x02da5f96, 0x016607cc, 0x029f2130, 0x01d2612c, 0x03043791, 0x003cdcb2}}, Y: Field{[10]uint32{0x02367d89, 0x002ad186, 0x00efcb2a, 0x03b38cb1, 0x007ceda2, 0x01a50653, 0x00a0ea07, 0x03540068, 0x035c1e62, 0x0020b5a3}}}, + {X: Field{[10]uint32{0x0359b128, 0x0314c82e, 0x026927a3, 0x03c890f8, 0x02878ec6, 0x03efe92c, 0x03133753, 0x0011e0d8, 0x03c54576, 0x0003ec4a}}, Y: Field{[10]uint32{0x0153aef5, 0x01af9712, 0x03e17a92, 0x01dff5ef, 0x01961930, 0x009329a0, 0x01ac0cba, 0x0386d6ed, 0x011867da, 0x000fe080}}}, + {X: Field{[10]uint32{0x00c0ea07, 0x03fe0658, 0x02447316, 0x0286c2a4, 0x034adafe, 0x01ea5d1f, 0x03075601, 0x0128d3d0, 0x01ac918a, 0x000f65d6}}, Y: Field{[10]uint32{0x02018aaa, 0x02956695, 0x03ecc6fc, 0x0299defa, 0x00caa317, 0x02a5925f, 0x031d5dda, 0x00cc2ad9, 0x03cf6d6a, 0x00033676}}}, + {X: Field{[10]uint32{0x023e00ce, 0x015720bf, 0x02909844, 0x037d6390, 0x019f476f, 0x01a6f1f7, 0x0349be46, 0x014870fe, 0x02b3699c, 0x003ab82a}}, Y: Field{[10]uint32{0x0317259e, 0x01feb853, 0x00bdd977, 0x0078478c, 0x0362c7ef, 0x017a0228, 0x0377b562, 0x039f0a66, 0x00dd450e, 0x002eb73a}}}, + {X: Field{[10]uint32{0x011eb851, 0x002afb51, 0x0338455e, 0x01f49328, 0x0343718a, 0x0097b974, 0x0225d0e9, 0x033aa95d, 0x02eec2c0, 0x003fb494}}, Y: Field{[10]uint32{0x002c648f, 0x0296a2ba, 0x03b4c457, 0x007173c2, 0x00dd0721, 0x001d5bd9, 0x0166b277, 0x03bf3087, 0x02ae56ce, 0x0019aeed}}}, + {X: Field{[10]uint32{0x017f9dbd, 0x021e4e8b, 0x013c9bc0, 0x00be74c0, 0x022362af, 0x02eac2c8, 0x03fb04d3, 0x030f0505, 0x02bd022a, 0x003698e7}}, Y: Field{[10]uint32{0x022466d5, 0x029ed3a0, 0x0031c10a, 0x03a8f9e8, 0x003627aa, 0x00daef95, 0x034ed0d5, 0x03a7cbe9, 0x022055f1, 0x0020fc9d}}}, + {X: Field{[10]uint32{0x02ab90dd, 0x01f3f09f, 0x0282ce09, 0x029ab2b9, 0x0132ced2, 0x031c77e4, 0x00d3ac67, 0x0116bd35, 0x00ded773, 0x00149349}}, Y: Field{[10]uint32{0x02b7f5c2, 0x01e81d3e, 0x03b01b2f, 0x000221ec, 0x032d010a, 0x003f9f3f, 0x036f55c9, 0x01f170c6, 0x00f7c692, 0x003933d7}}}, + {X: Field{[10]uint32{0x00ae4f94, 0x03149a15, 0x021c4b24, 0x02917ef0, 0x0028672d, 0x00a185ed, 0x007cde0c, 0x02d830d7, 0x02d5fb52, 0x001f6b0b}}, Y: Field{[10]uint32{0x03794038, 0x023b83f9, 0x0309ea57, 0x02db4a0a, 0x02f6cc11, 0x034919b0, 0x035c4a2b, 0x022199c2, 0x007ae916, 0x00331ab3}}}, + {X: Field{[10]uint32{0x016083ae, 0x01472fb9, 0x03ea6f7c, 0x02728e24, 0x02887e5d, 0x003a4a46, 0x019d10d0, 0x03d67dae, 0x024dda61, 0x0017d1ad}}, Y: Field{[10]uint32{0x0283a8ae, 0x007cf678, 0x0182e5ee, 0x02e9f86d, 0x0109bfa6, 0x0155ca4a, 0x02dcfb9c, 0x00995541, 0x0055da25, 0x001810f4}}}, + {X: Field{[10]uint32{0x01e14aa3, 0x0258685f, 0x03635175, 0x0308e29f, 0x0348ef0f, 0x023177c3, 0x0241ec2b, 0x017c85b9, 0x0033b6a2, 0x002218fb}}, Y: Field{[10]uint32{0x02b42541, 0x032c4ac3, 0x037a117d, 0x020f683f, 0x0345b2a5, 0x01241956, 0x00292777, 0x016070be, 0x00f31e52, 0x00275986}}}, + {X: Field{[10]uint32{0x03a2f9f4, 0x035a9a0c, 0x02a03a1b, 0x03dcfa4b, 0x03b377f3, 0x03c9be47, 0x00184c7e, 0x016739b6, 0x00463ac4, 0x0021500d}}, Y: Field{[10]uint32{0x01b399cb, 0x03dc9e31, 0x01430438, 0x03c8ec32, 0x018f7719, 0x00c4ff8d, 0x012a5b18, 0x019266c9, 0x02968ac5, 0x000b47c4}}}, + {X: Field{[10]uint32{0x02223c7f, 0x032b7597, 0x03201379, 0x009d7adf, 0x006a325d, 0x018899ad, 0x0251dbc3, 0x0104aff9, 0x03f6217e, 0x0002fdac}}, Y: Field{[10]uint32{0x03ba748b, 0x02c6bbe5, 0x03eaf0a9, 0x0035abc6, 0x01ebfad9, 0x03bb8f7b, 0x0041e7dc, 0x029157ec, 0x0154c14a, 0x00284582}}}, + {X: Field{[10]uint32{0x02d9e59d, 0x009396af, 0x03ffc771, 0x00662e86, 0x03860ca2, 0x0026a933, 0x02079ea4, 0x0184d52a, 0x002d3c18, 0x0012c808}}, Y: Field{[10]uint32{0x035b8873, 0x017a2a43, 0x002bab55, 0x01154418, 0x007703eb, 0x03c47641, 0x01d858f2, 0x0302c2e9, 0x0103c107, 0x0027da11}}}, + {X: Field{[10]uint32{0x02421dd2, 0x01a96a81, 0x03e28268, 0x03c989f2, 0x0199c050, 0x009ed64c, 0x024f5331, 0x02692ce8, 0x00806d67, 0x001021fe}}, Y: Field{[10]uint32{0x0188e8b9, 0x01c1f4af, 0x0121b5a5, 0x0105627e, 0x01698800, 0x0263d696, 0x008c8836, 0x035220cf, 0x0184b3d9, 0x00120e2b}}}, + {X: Field{[10]uint32{0x0297b79c, 0x0244c6bf, 0x02ac766d, 0x00131e43, 0x00538775, 0x01693f0d, 0x01b91e00, 0x01d01a8b, 0x0287cb2e, 0x000569e4}}, Y: Field{[10]uint32{0x014a238a, 0x029069ae, 0x003fadf2, 0x033ee5aa, 0x031bd597, 0x00b18583, 0x03ce497c, 0x01cb8f4f, 0x03220765, 0x0027d3bc}}}, + {X: Field{[10]uint32{0x03bcecbe, 0x026cd0f8, 0x02812273, 0x0029f888, 0x02404fb1, 0x032cf502, 0x0233d61b, 0x012f13fc, 0x0063c052, 0x000713e8}}, Y: Field{[10]uint32{0x02d48bd6, 0x0231cf58, 0x003533aa, 0x02cafd34, 0x03d39c90, 0x035cc2ca, 0x0209e9eb, 0x00bbae5c, 0x01eca2d8, 0x000aa158}}}, + {X: Field{[10]uint32{0x01f2a636, 0x0058ed6b, 0x02c2656d, 0x029b5221, 0x02bb50b8, 0x014c4bca, 0x03936c18, 0x02cb1499, 0x03a743c1, 0x00281c22}}, Y: Field{[10]uint32{0x031a20ea, 0x017a534d, 0x00324584, 0x0188d669, 0x007dc66a, 0x004b874b, 0x01b81550, 0x022331b2, 0x01f19169, 0x002563d1}}}, + {X: Field{[10]uint32{0x00acad7d, 0x00de4f3a, 0x02858c21, 0x0152c4a6, 0x0109b797, 0x00b8cfff, 0x009d71f0, 0x010b9b84, 0x034df01a, 0x0035e582}}, Y: Field{[10]uint32{0x03deb920, 0x03078676, 0x00707d81, 0x024d8c46, 0x02335661, 0x03195cc2, 0x003d0e1d, 0x0074ad87, 0x01aa5a84, 0x00232bc6}}}, + {X: Field{[10]uint32{0x038ba611, 0x030c902f, 0x03789daa, 0x01b9ba28, 0x02a7c450, 0x03f286cc, 0x0225ba38, 0x01c3565b, 0x006bf8ba, 0x001e80f7}}, Y: Field{[10]uint32{0x037d9028, 0x021293df, 0x03881fcb, 0x0207425a, 0x00048a36, 0x01dcf85c, 0x023e378b, 0x01a15969, 0x0222292d, 0x001c3c67}}}, + {X: Field{[10]uint32{0x03443b97, 0x00e3c971, 0x01dbac2f, 0x0281c9bf, 0x01da516c, 0x01b20ea9, 0x0189850c, 0x00d0470e, 0x0262a8fa, 0x0014ea69}}, Y: Field{[10]uint32{0x03945e25, 0x03fd6780, 0x0036e140, 0x0316e00c, 0x022adcfd, 0x01134797, 0x013279e8, 0x030c6fcc, 0x02506179, 0x00177ab0}}}, + {X: Field{[10]uint32{0x02b2cdf7, 0x0143673f, 0x036f20a4, 0x02ca1da0, 0x01b7ee99, 0x0306eeaa, 0x0269af63, 0x00361bff, 0x02b63dbb, 0x0021ae51}}, Y: Field{[10]uint32{0x0374b1fa, 0x012d6603, 0x03a62ed7, 0x03006665, 0x037cbc39, 0x00793c4c, 0x018ea1ba, 0x038a9b2c, 0x0383d3d0, 0x0011101d}}}, + {X: Field{[10]uint32{0x03752d8e, 0x0054b9bb, 0x019babef, 0x03fee9c7, 0x036b28c8, 0x0034908f, 0x01567262, 0x012d1bda, 0x00f5cb88, 0x00033a07}}, Y: Field{[10]uint32{0x02a9248c, 0x02d50117, 0x009262d0, 0x03fca243, 0x02979177, 0x001306aa, 0x01bf924c, 0x019130d2, 0x01738120, 0x001d6bf6}}}, + {X: Field{[10]uint32{0x01172ed9, 0x033a4b78, 0x02b8fbc6, 0x010c4ce8, 0x037b791d, 0x01f55f51, 0x006cb9e4, 0x0134b67e, 0x02413a46, 0x0010441b}}, Y: Field{[10]uint32{0x036741c6, 0x031be87d, 0x03374d2e, 0x00a9cde6, 0x002ce4e4, 0x01ce83e2, 0x01601a27, 0x0082e001, 0x00c230e9, 0x0038b291}}}, + {X: Field{[10]uint32{0x00b49777, 0x0106d288, 0x001524e1, 0x0328814b, 0x03bca3f1, 0x01eb1bda, 0x006541ec, 0x00284b95, 0x02a04e83, 0x003a707c}}, Y: Field{[10]uint32{0x02a58124, 0x0247e6cc, 0x0030886b, 0x0087d754, 0x005ca737, 0x0059c4b2, 0x0173fcd5, 0x004b08a6, 0x004308dd, 0x001477ce}}}, + {X: Field{[10]uint32{0x033bbf2c, 0x0173c579, 0x01511fce, 0x009d0943, 0x039be21f, 0x00554b8e, 0x0225775f, 0x03fcf92e, 0x012dc5e8, 0x0022ee78}}, Y: Field{[10]uint32{0x000d1152, 0x03c46a34, 0x0162f91e, 0x022af08e, 0x02b4d096, 0x03067137, 0x024fcf50, 0x00dcc070, 0x037a273c, 0x0022a08a}}}, + {X: Field{[10]uint32{0x00b6bd0f, 0x0165e9eb, 0x011399ad, 0x00f80a5f, 0x01697f3f, 0x03d9b80c, 0x0294c3ee, 0x01de4791, 0x02f1da22, 0x002c0163}}, Y: Field{[10]uint32{0x02205a2a, 0x016cbc2f, 0x02978c80, 0x0111f4ae, 0x01e5deb6, 0x03ffa009, 0x000bee68, 0x00e05363, 0x034a0579, 0x001fd6ea}}}, + {X: Field{[10]uint32{0x002522a5, 0x014da32b, 0x025c8db9, 0x015d2e1c, 0x006dfc35, 0x0137f2ac, 0x0202b780, 0x03f7594b, 0x002d8df5, 0x00077b75}}, Y: Field{[10]uint32{0x02bca540, 0x019567ad, 0x0254f5b4, 0x037bcd5d, 0x0024b918, 0x020ed86e, 0x03f4a8f9, 0x00349463, 0x00492373, 0x000c1569}}}, + {X: Field{[10]uint32{0x000ea544, 0x03cbbd0e, 0x01f7da46, 0x00f67571, 0x03e47181, 0x00af0e76, 0x005b0b51, 0x012ea4fd, 0x0248c679, 0x001d8694}}, Y: Field{[10]uint32{0x032c1292, 0x03442c20, 0x01fc5c60, 0x00217eb4, 0x029f7034, 0x016ea3b5, 0x018d0a39, 0x033ab178, 0x0130c4f5, 0x0006177b}}}, + {X: Field{[10]uint32{0x03aa5caf, 0x02ae2638, 0x00f2ffef, 0x021d4069, 0x03a17496, 0x004f06d6, 0x0020982a, 0x03433237, 0x0360e515, 0x0003c756}}, Y: Field{[10]uint32{0x00a0d91d, 0x03b673de, 0x00708e42, 0x02dd5265, 0x03ee6f9a, 0x03ad8fc1, 0x033a9e48, 0x03630805, 0x026c395f, 0x00157f5d}}}, + {X: Field{[10]uint32{0x0337425f, 0x0264ff6e, 0x002d7fba, 0x012f0c09, 0x02fb09ff, 0x00711156, 0x02ba0bf6, 0x0002a95d, 0x004c9b79, 0x0015a72d}}, Y: Field{[10]uint32{0x00c350b1, 0x01009c83, 0x026d0d33, 0x03a03895, 0x01c1131d, 0x031f768f, 0x038f646a, 0x038f5079, 0x00d2ff1a, 0x0037f7ae}}}, + {X: Field{[10]uint32{0x021851eb, 0x031e1f2e, 0x00776d22, 0x0045f734, 0x039c2dda, 0x0363e142, 0x0147a787, 0x00e7a146, 0x029ad998, 0x000f966d}}, Y: Field{[10]uint32{0x012e20b3, 0x03620d16, 0x036d434c, 0x017acb27, 0x03705074, 0x01fb13c9, 0x01d93583, 0x02c0c1af, 0x02a48bfe, 0x001ccb34}}}, + {X: Field{[10]uint32{0x01296967, 0x03a93125, 0x0087b0e6, 0x015ccb0c, 0x0181acec, 0x03f0221b, 0x02502403, 0x015a0a60, 0x022107b4, 0x00291b59}}, Y: Field{[10]uint32{0x01763d33, 0x006b3bee, 0x03464005, 0x02139849, 0x01461478, 0x026a0823, 0x0097a73f, 0x02c18890, 0x00f429a5, 0x00050333}}}, + {X: Field{[10]uint32{0x0079ab1c, 0x005b1194, 0x0392774d, 0x03fb6bad, 0x004ad70e, 0x0055d727, 0x000c427d, 0x014ee9f0, 0x019cf25c, 0x002e4839}}, Y: Field{[10]uint32{0x0045b67f, 0x0065f07c, 0x005c9d43, 0x017cdfd6, 0x039201ec, 0x0195ae4d, 0x01435a61, 0x02223475, 0x00f1d4ba, 0x00181858}}}, + {X: Field{[10]uint32{0x00bfa8c5, 0x0381adfe, 0x00713896, 0x03663417, 0x023b88b6, 0x02c9c36d, 0x03da1efd, 0x00dee7ab, 0x02e1e7d8, 0x0004b3c6}}, Y: Field{[10]uint32{0x01c99c0f, 0x03329a4e, 0x035d91e8, 0x01b52141, 0x03c4c1d6, 0x0273f62c, 0x0323d7be, 0x024d2c27, 0x0213181b, 0x00383599}}}, + {X: Field{[10]uint32{0x01c0ec1f, 0x03ce74e3, 0x0230287f, 0x0002f84e, 0x02eb93a9, 0x00ca0553, 0x00620e5a, 0x02b28b98, 0x03ae0a4e, 0x001aab49}}, Y: Field{[10]uint32{0x00a1f46a, 0x0189aee5, 0x008112fe, 0x01d0d0b0, 0x02d46814, 0x0315ff5e, 0x03e8cd2d, 0x0054e789, 0x01c5caa2, 0x0024c855}}}, + {X: Field{[10]uint32{0x00f870a0, 0x00d0fb2b, 0x01c36ce9, 0x03e487dd, 0x008d168b, 0x0301b06e, 0x03489166, 0x019afa0a, 0x014e7cb1, 0x0004d336}}, Y: Field{[10]uint32{0x01453236, 0x02230ec2, 0x014c0fab, 0x039f9cf4, 0x012f7c8f, 0x03c268e6, 0x02a51cff, 0x03f517a0, 0x03c5e956, 0x0010a99c}}}, + {X: Field{[10]uint32{0x023989ee, 0x027d6d56, 0x00e2c56d, 0x0063729a, 0x02429b1d, 0x0072173b, 0x002971fa, 0x031e1a31, 0x018c7b7c, 0x00357735}}, Y: Field{[10]uint32{0x01208100, 0x01989388, 0x035c5e31, 0x002bc2ed, 0x0345bedd, 0x028ce2f1, 0x01a05297, 0x032b93b3, 0x0130ef1b, 0x00383290}}}, + {X: Field{[10]uint32{0x020d8c8e, 0x02b27403, 0x02861f66, 0x02f454e2, 0x033e3567, 0x01a47cce, 0x01fa4cdb, 0x02422e41, 0x0134c344, 0x00254759}}, Y: Field{[10]uint32{0x017046f1, 0x017cc1bb, 0x039f9d57, 0x024669f5, 0x0295a5f6, 0x0114957d, 0x001a9903, 0x01e4a19a, 0x0122eb84, 0x003bbcd6}}}, + {X: Field{[10]uint32{0x01cdd0fc, 0x019973f0, 0x01e27b33, 0x02ea59bb, 0x02690af0, 0x02d48455, 0x0184c9c9, 0x025935db, 0x004b25f7, 0x0033b6e9}}, Y: Field{[10]uint32{0x03c79e7e, 0x006de6a1, 0x037d94c2, 0x009246a3, 0x02187e71, 0x024cc5ad, 0x007b6b64, 0x026bc746, 0x0049cb8e, 0x00201aa4}}}, + {X: Field{[10]uint32{0x00a10b54, 0x01bd2ab6, 0x02a2049c, 0x03445124, 0x01d1c7d2, 0x00afb285, 0x02bd39d3, 0x01afb8a6, 0x0260d130, 0x0013fc0d}}, Y: Field{[10]uint32{0x02d1e574, 0x0389dcc1, 0x01893d99, 0x01774bfc, 0x014990f2, 0x039c7da2, 0x02e8bc8b, 0x0265478d, 0x02698fd8, 0x0030b1d7}}}, + {X: Field{[10]uint32{0x022e0ca7, 0x0010b3b3, 0x01824389, 0x0289a0ee, 0x00c78061, 0x037edc80, 0x03b77020, 0x019197a1, 0x01088dbd, 0x003022f5}}, Y: Field{[10]uint32{0x008d7307, 0x024c957e, 0x03e78417, 0x02d82318, 0x011db329, 0x00ea7c5c, 0x02408842, 0x0125eac5, 0x01d61343, 0x00158806}}}, + {X: Field{[10]uint32{0x03f9857d, 0x03f576d2, 0x01e3a07a, 0x02a09d28, 0x00955bdd, 0x022eb0c6, 0x005cdd22, 0x033ac8ee, 0x00aa6fd2, 0x001237f7}}, Y: Field{[10]uint32{0x020287ce, 0x017fe8ba, 0x011710d5, 0x02d450c7, 0x00af60f4, 0x0390a555, 0x014e76fc, 0x019ee945, 0x022e8961, 0x000a9198}}}, + {X: Field{[10]uint32{0x02a1f236, 0x02b3fcc5, 0x03ceebbf, 0x01e68ce8, 0x02802c14, 0x01c094e0, 0x0376b471, 0x03e20f2f, 0x0100d81a, 0x00101082}}, Y: Field{[10]uint32{0x0385e3f7, 0x01a346de, 0x01b4be41, 0x01bbc678, 0x007831e9, 0x02d50957, 0x00f50fa2, 0x02d4ecc2, 0x00e0dbbc, 0x00219811}}}, + {X: Field{[10]uint32{0x022bdc42, 0x00bcdf8c, 0x0156f8b1, 0x01080ec4, 0x02ec1e31, 0x03a64823, 0x02c20184, 0x019f1dc3, 0x007b23b6, 0x0025a8dd}}, Y: Field{[10]uint32{0x00f22ab2, 0x01f3618f, 0x03af798c, 0x03d29281, 0x03dc7545, 0x034c975b, 0x010b04ba, 0x01191ccc, 0x03c8df8c, 0x0019ec2c}}}, + {X: Field{[10]uint32{0x00460182, 0x0244caf2, 0x02784503, 0x0246a345, 0x03f1db3e, 0x00545212, 0x0361f0cb, 0x01e5a490, 0x017de403, 0x0033c1c0}}, Y: Field{[10]uint32{0x0397939d, 0x006ece4d, 0x0106799b, 0x0327996b, 0x00e2eb60, 0x01a5018e, 0x036e762f, 0x0278c343, 0x010762f2, 0x002de86c}}}, + {X: Field{[10]uint32{0x018beb15, 0x0173d688, 0x036dc080, 0x028f75c9, 0x0393507a, 0x01d7f756, 0x01b90ded, 0x02dbdeb4, 0x00b25b0b, 0x0004ad6e}}, Y: Field{[10]uint32{0x038933da, 0x02d5bb6d, 0x009aee89, 0x01942cd8, 0x015a5bc1, 0x01032866, 0x02d6368d, 0x02866e03, 0x03678cef, 0x00174f51}}}, + {X: Field{[10]uint32{0x03a46765, 0x0270de84, 0x0327dcd9, 0x0266f66d, 0x0177ecd2, 0x0062dbc6, 0x018b9ace, 0x039b64e6, 0x009ce866, 0x0021e6d1}}, Y: Field{[10]uint32{0x03781c63, 0x004ea0d8, 0x02baec6c, 0x0057c0f9, 0x01f0c452, 0x006a3679, 0x0350c4e9, 0x03ec4ab3, 0x00eb758c, 0x002c3120}}}, + {X: Field{[10]uint32{0x00c7dead, 0x01ee4283, 0x0121dd2b, 0x00332cdb, 0x01e50228, 0x00ffbc92, 0x03a401dd, 0x02807747, 0x0383e9d3, 0x000bb121}}, Y: Field{[10]uint32{0x01a67fce, 0x03c31fa1, 0x00703ca2, 0x020419e6, 0x0283fd8f, 0x03ad1a68, 0x01e61505, 0x038b2869, 0x012478f9, 0x003ec0a4}}}, + {X: Field{[10]uint32{0x037c3ce7, 0x008824d0, 0x03a83aee, 0x03eef61c, 0x025b7878, 0x0051655a, 0x03e8fcd2, 0x036c1ce7, 0x025827be, 0x001e7328}}, Y: Field{[10]uint32{0x00ac467e, 0x02073aa7, 0x015a8d33, 0x02c8b064, 0x00bee990, 0x03add2cc, 0x00b7c483, 0x021d4053, 0x0293d82e, 0x003fd222}}}, + {X: Field{[10]uint32{0x02dbd207, 0x00f37556, 0x01cd93e9, 0x0203526a, 0x028e146a, 0x00185aa9, 0x02b9eed4, 0x022dea09, 0x00ca3d2b, 0x00311129}}, Y: Field{[10]uint32{0x012d0f18, 0x03f09cc2, 0x032319d1, 0x003ee3f0, 0x00ac00ad, 0x037b41a1, 0x01ae3381, 0x00130950, 0x00a963d5, 0x001344da}}}, + {X: Field{[10]uint32{0x03f3e7a8, 0x0154a6f3, 0x03c267ee, 0x02298124, 0x02dbed32, 0x020d7a35, 0x024e2050, 0x0112c961, 0x0050cc0e, 0x000fb91f}}, Y: Field{[10]uint32{0x00a5f095, 0x0072a7a4, 0x0391f84e, 0x00c00f46, 0x00b6229a, 0x0117890f, 0x02496401, 0x02a1ef0c, 0x0339056e, 0x003e9554}}}, + {X: Field{[10]uint32{0x0009980c, 0x004b5f72, 0x020a81c0, 0x0364b464, 0x038e69e2, 0x03e6c3d1, 0x02251a29, 0x02edfd08, 0x01873036, 0x003a58f2}}, Y: Field{[10]uint32{0x01c52fd6, 0x009e8f15, 0x025e6180, 0x035b1fe3, 0x02140f92, 0x0202c5cf, 0x002bfa48, 0x02fcbc49, 0x03b0779b, 0x0003fe56}}}, + {X: Field{[10]uint32{0x008fc07d, 0x00473195, 0x008bd3f7, 0x01439a1b, 0x0023738e, 0x011be8e5, 0x024b747a, 0x02e2e6bf, 0x035bb6a1, 0x002abd81}}, Y: Field{[10]uint32{0x02f2b0cb, 0x0354866a, 0x0098b1bb, 0x01baef7e, 0x0253ab32, 0x03ad047a, 0x005bd162, 0x0328707a, 0x02ec6d11, 0x001336c2}}}, + {X: Field{[10]uint32{0x0157ac0f, 0x031d6150, 0x012986e4, 0x0357aa48, 0x02842b44, 0x0175c22a, 0x0174a18d, 0x01d5b638, 0x0017d8e9, 0x001a4792}}, Y: Field{[10]uint32{0x00c0c222, 0x03d01da8, 0x008c2d1f, 0x037ca7d4, 0x034bb9a8, 0x00be4a1c, 0x010eb157, 0x01eb5e03, 0x020b3bfa, 0x0027abae}}}, + {X: Field{[10]uint32{0x0344996a, 0x03821ff9, 0x03fd81d9, 0x02cc72bc, 0x00c77dbf, 0x020f6b63, 0x01c9d4c5, 0x01292250, 0x01bb45af, 0x0030f9bf}}, Y: Field{[10]uint32{0x008366f2, 0x010af258, 0x00a730e6, 0x01d2d526, 0x010b8694, 0x02b13a5e, 0x0207bfd1, 0x00a6e3fb, 0x011e65ab, 0x0032a663}}}, + {X: Field{[10]uint32{0x0140701f, 0x03002cc2, 0x013868ce, 0x03e00ccf, 0x02923ead, 0x01f17265, 0x032630be, 0x00973c87, 0x0320a55d, 0x003b6f58}}, Y: Field{[10]uint32{0x01e4889e, 0x005090d3, 0x003e3f7a, 0x0143dacb, 0x025e3d3d, 0x038a3e52, 0x00cd12bf, 0x03d79322, 0x02e7afce, 0x00359464}}}, + {X: Field{[10]uint32{0x0295d336, 0x02d30d3a, 0x005dad7c, 0x03b67536, 0x02b29684, 0x00f0dd04, 0x02fd2494, 0x0382e2b0, 0x0183a80a, 0x0032567b}}, Y: Field{[10]uint32{0x032b168b, 0x0268b869, 0x03e5f8b5, 0x023804bd, 0x014de5f5, 0x00965c30, 0x00b0e970, 0x03c94ab6, 0x02bb8dcc, 0x00203076}}}, + {X: Field{[10]uint32{0x02ed9237, 0x00f7e0cf, 0x0231274e, 0x03b76992, 0x022c5bc6, 0x034b573e, 0x00c90224, 0x0013a762, 0x01744710, 0x001de331}}, Y: Field{[10]uint32{0x02916c17, 0x00b724e4, 0x0360946b, 0x03f94730, 0x01675720, 0x02e48767, 0x012e502d, 0x007009ee, 0x01316b2a, 0x003ba88f}}}, + {X: Field{[10]uint32{0x03b42055, 0x02bf2598, 0x02d9a5c2, 0x011b4fef, 0x00173e7e, 0x036634b0, 0x03299f81, 0x015abd0f, 0x00388c36, 0x00287e1d}}, Y: Field{[10]uint32{0x016f4afc, 0x0261e9f5, 0x0284eabb, 0x03fb71ca, 0x015d874a, 0x0264d9e1, 0x0150e79b, 0x035b16cc, 0x00430820, 0x00042f21}}}, + {X: Field{[10]uint32{0x00224a5d, 0x008247da, 0x036a3d00, 0x020dd503, 0x028f7fa5, 0x00f410fb, 0x01a1839c, 0x022e2b36, 0x030b2d5f, 0x00322b5f}}, Y: Field{[10]uint32{0x03aebf8b, 0x017c6471, 0x01ec38e6, 0x02d4455f, 0x022a1cd4, 0x0229ff92, 0x01507cf1, 0x016e68b4, 0x0180eebe, 0x000c062d}}}, + {X: Field{[10]uint32{0x0020055f, 0x020436d2, 0x02d20bea, 0x01028a9e, 0x031ecf38, 0x02b9d9fd, 0x024e4261, 0x03f5eedf, 0x02640b93, 0x00309754}}, Y: Field{[10]uint32{0x025ad684, 0x027a3891, 0x03524c34, 0x03b0e851, 0x02bf331a, 0x02d23b4c, 0x01fffbce, 0x00ac3e8a, 0x00c76e3f, 0x003e8572}}}, + {X: Field{[10]uint32{0x0178f92b, 0x018afd7a, 0x032f2ccc, 0x01de22d7, 0x03283168, 0x02cb61ce, 0x03224dcc, 0x02feb6eb, 0x02eb7e4c, 0x00342e5c}}, Y: Field{[10]uint32{0x03ab8e3b, 0x0390837d, 0x03f56e94, 0x00c61082, 0x0275610b, 0x008f9e1e, 0x03bcb4cf, 0x01614aab, 0x00a1606a, 0x003bd74f}}}, + {X: Field{[10]uint32{0x030a2d07, 0x02010ac6, 0x014ab56c, 0x0146ef0a, 0x02d393e8, 0x02604cad, 0x008791ab, 0x0111e591, 0x00835856, 0x003e2d13}}, Y: Field{[10]uint32{0x0070a27c, 0x007b7fba, 0x00ed0b8e, 0x000756ec, 0x022dbe0c, 0x03239d93, 0x0051362f, 0x0102fba6, 0x02bf0420, 0x0030a090}}}, + {X: Field{[10]uint32{0x025666b7, 0x02df20f6, 0x02d368ac, 0x00641469, 0x005d9424, 0x00bf448d, 0x0010adc1, 0x02ab78e5, 0x01016f72, 0x0039f2e2}}, Y: Field{[10]uint32{0x02b21697, 0x01070d75, 0x00f63953, 0x02032c3e, 0x03f0c87e, 0x00e8595b, 0x014ee6c5, 0x03675fbf, 0x012246b6, 0x00378d9d}}}, + {X: Field{[10]uint32{0x0279d87f, 0x031d0930, 0x02167fb2, 0x03925733, 0x01f40f93, 0x01317abd, 0x02894786, 0x03d2aa4b, 0x028f14e3, 0x00022c84}}, Y: Field{[10]uint32{0x00f5d246, 0x02c39243, 0x00c11cbe, 0x0356e0c1, 0x02699926, 0x020c0c0f, 0x0012068a, 0x02d2c406, 0x004af469, 0x0039fb4e}}}, + {X: Field{[10]uint32{0x013b4afb, 0x01023d42, 0x00317658, 0x0075e17a, 0x001f3f63, 0x02d6cc7d, 0x036a5f3a, 0x035618e2, 0x01db3cbc, 0x003cd36d}}, Y: Field{[10]uint32{0x003dd3d9, 0x00c3f543, 0x02f2d56e, 0x018d3263, 0x005bf112, 0x03ff06b1, 0x031a1c74, 0x02119be8, 0x0372bb2c, 0x0037f39c}}}, + {X: Field{[10]uint32{0x00aabdb8, 0x017570bb, 0x01c86a96, 0x03937494, 0x0110b4fe, 0x03294cee, 0x00a48eab, 0x035a176b, 0x0209a445, 0x0030da27}}, Y: Field{[10]uint32{0x0279e3f4, 0x007c8bc5, 0x017a155c, 0x01f8e964, 0x03d62e18, 0x0101d747, 0x03efbe4f, 0x00feef0c, 0x005a6a26, 0x001e0134}}}, + {X: Field{[10]uint32{0x03005cbc, 0x022832cf, 0x00a78d70, 0x0128ad1f, 0x03f1e47d, 0x0025624b, 0x0266d626, 0x0284341e, 0x01ecf776, 0x001ffe65}}, Y: Field{[10]uint32{0x026ea90d, 0x0317ab32, 0x019f5cd5, 0x0343a4a6, 0x000e3911, 0x01b420a2, 0x00a4d115, 0x0390c337, 0x03745f17, 0x003b7371}}}, + {X: Field{[10]uint32{0x027d4d27, 0x0094fb10, 0x028e41c0, 0x035873f2, 0x010db78b, 0x0108faed, 0x03183512, 0x012fe5a6, 0x02626223, 0x000d98a8}}, Y: Field{[10]uint32{0x002e1b09, 0x032aeb07, 0x0199fc41, 0x026de6d2, 0x03d550ef, 0x032b28da, 0x000f671c, 0x039a703d, 0x00420f07, 0x00222988}}}, + {X: Field{[10]uint32{0x0354e8d1, 0x00ed050f, 0x03951176, 0x03a45852, 0x00b6b4eb, 0x01281ce2, 0x00e66ee2, 0x0310ba5c, 0x002e06d9, 0x000b049f}}, Y: Field{[10]uint32{0x03dd6629, 0x01672743, 0x0193aaae, 0x008d808b, 0x00856be0, 0x012b6b8c, 0x0226c8ff, 0x02b7eabe, 0x02b8dacb, 0x00291dcf}}}, + {X: Field{[10]uint32{0x02c17802, 0x03594552, 0x02cb37f6, 0x002e33e6, 0x02b7dfcb, 0x03f8c2df, 0x014863a9, 0x00587ff6, 0x03a6116f, 0x0031083f}}, Y: Field{[10]uint32{0x010a028c, 0x02c50ef9, 0x03bc0079, 0x025cbba3, 0x017fd76d, 0x017b6a30, 0x019e9cf9, 0x023db212, 0x029c25c6, 0x0039b311}}}, + {X: Field{[10]uint32{0x02e3de0d, 0x01de11fa, 0x0169b50c, 0x029f9ff2, 0x0034d386, 0x00c85d1a, 0x002f06fd, 0x010f7563, 0x03432203, 0x001de259}}, Y: Field{[10]uint32{0x01fd9369, 0x01529348, 0x021f8570, 0x016589e4, 0x00cd9067, 0x00a7a4aa, 0x00bcd7d6, 0x037365c4, 0x019e4408, 0x0010d435}}}, + {X: Field{[10]uint32{0x009f5827, 0x009c4e4d, 0x03c83dc1, 0x023c644c, 0x03714768, 0x00dbfc3d, 0x0334f9b6, 0x0372d00c, 0x002c1a14, 0x0033dfa9}}, Y: Field{[10]uint32{0x019e6d9d, 0x02547776, 0x00a29f8e, 0x02259918, 0x020ad1a6, 0x025792a9, 0x01c28468, 0x03e7744e, 0x0080166b, 0x002e700b}}}, + {X: Field{[10]uint32{0x0273a91f, 0x0057e969, 0x036309d8, 0x0211fdd4, 0x02417b1c, 0x00f27e5b, 0x028ab1b3, 0x02af76b6, 0x0039ab1f, 0x00345e4d}}, Y: Field{[10]uint32{0x02d3b3e0, 0x003473f3, 0x0105f9bc, 0x03496903, 0x03b429ad, 0x02699f43, 0x019f6f7f, 0x0106c8ec, 0x02593b59, 0x002b04f5}}}, + {X: Field{[10]uint32{0x0292b420, 0x0193c0a7, 0x0026be98, 0x01dd29d0, 0x02547225, 0x004cf727, 0x02f58630, 0x0379c314, 0x00d6727d, 0x002ec55a}}, Y: Field{[10]uint32{0x02af3992, 0x01c32548, 0x02fe70b1, 0x00af856a, 0x009e137d, 0x03bb8a70, 0x02adf80c, 0x01d31b31, 0x0356268d, 0x002d5951}}}, + {X: Field{[10]uint32{0x03877dcc, 0x037a9eb6, 0x0020535c, 0x00b5de37, 0x03ce07c4, 0x00c6ea4f, 0x00681772, 0x02968e9d, 0x02d783e8, 0x001cca44}}, Y: Field{[10]uint32{0x03df80a2, 0x01e3239d, 0x01bab06f, 0x034ffb4f, 0x011664f5, 0x0271ea51, 0x00ffd7c2, 0x02348f9a, 0x03881b12, 0x0034d2e0}}}, + {X: Field{[10]uint32{0x0297074c, 0x011a231c, 0x00afa908, 0x03748941, 0x034927b6, 0x01a134ed, 0x03e18651, 0x00cba0b0, 0x0371fb85, 0x0031d3c3}}, Y: Field{[10]uint32{0x01006ac1, 0x027c69ef, 0x0006a53a, 0x0350440a, 0x0235984b, 0x0341031b, 0x03e5a92d, 0x005e3a2f, 0x0261c0bd, 0x0027697a}}}, + {X: Field{[10]uint32{0x023283b0, 0x032f1a27, 0x00aac91f, 0x004cf25c, 0x031785a6, 0x00c18366, 0x00e9e494, 0x01683169, 0x01398bda, 0x002f53ea}}, Y: Field{[10]uint32{0x030e433a, 0x02973680, 0x0295c5d2, 0x02efc537, 0x02e79cfd, 0x032eb035, 0x01be1cac, 0x012d2516, 0x03edb661, 0x0018c753}}}, + {X: Field{[10]uint32{0x0341cc8f, 0x01971928, 0x03a72f24, 0x01e5ee26, 0x03e9bc2d, 0x0172daf4, 0x003e0c81, 0x004f4c92, 0x0062733f, 0x0027e995}}, Y: Field{[10]uint32{0x0212db04, 0x0280b89a, 0x0313010f, 0x03f0bc53, 0x01443505, 0x01289c54, 0x00ada32c, 0x02c635d2, 0x005bafc5, 0x001c147f}}}, + {X: Field{[10]uint32{0x035e31aa, 0x0101d130, 0x03d4a6cd, 0x03f8b07a, 0x03715168, 0x036f94ef, 0x02434a9d, 0x02fc7a05, 0x037dab3d, 0x003aba9b}}, Y: Field{[10]uint32{0x0384d61d, 0x0069eae5, 0x01e6a76a, 0x02c07dc2, 0x01a594b9, 0x03d2ea41, 0x0080619f, 0x00ae5b08, 0x02c24f20, 0x002e5a58}}}, + {X: Field{[10]uint32{0x0317a2fc, 0x01eff14e, 0x007516b9, 0x022925fe, 0x039a117c, 0x02e38954, 0x03e6d5b7, 0x01d413cc, 0x02b63b94, 0x002cf7de}}, Y: Field{[10]uint32{0x01758b9b, 0x006ef127, 0x025b5ec5, 0x03aa454a, 0x01f11f00, 0x0069d677, 0x03a62650, 0x039b3b5b, 0x0100a35a, 0x001cb7dd}}}, + {X: Field{[10]uint32{0x03281bbf, 0x0346b1b0, 0x017fa3a8, 0x0025c990, 0x034341df, 0x01438a53, 0x0219be99, 0x0122b915, 0x02cc46da, 0x003be1d7}}, Y: Field{[10]uint32{0x031c72f5, 0x010aecdf, 0x01bc28a6, 0x030ae7a3, 0x0351ced2, 0x00c1b261, 0x010eb6e8, 0x0016db5b, 0x0204af4c, 0x001eae78}}}, + {X: Field{[10]uint32{0x00024fdc, 0x01bcdb1c, 0x014e7fc2, 0x015d32fc, 0x033d7487, 0x03f29422, 0x002f234a, 0x0228e942, 0x0046576a, 0x001d30f1}}, Y: Field{[10]uint32{0x00136506, 0x03fa3877, 0x02ae88c4, 0x02725293, 0x03b6ccac, 0x027628c1, 0x01d2afbf, 0x01bea1cb, 0x01164ddb, 0x001cf55e}}}, + {X: Field{[10]uint32{0x00f39274, 0x00e11b43, 0x00e1acf3, 0x02096999, 0x00c06b71, 0x00ee8bc6, 0x00204933, 0x00b8f9b0, 0x032c409f, 0x00256712}}, Y: Field{[10]uint32{0x009aad47, 0x010bda0b, 0x015d945f, 0x027c68e6, 0x01d31991, 0x03716fb7, 0x03cd3980, 0x018a7edc, 0x035c7401, 0x0005f2ac}}}, + {X: Field{[10]uint32{0x009175fb, 0x01e6a6db, 0x00d69a94, 0x02f24bed, 0x03f67c24, 0x01ff7ead, 0x013b53c6, 0x014c4c65, 0x01d69419, 0x001013c3}}, Y: Field{[10]uint32{0x024d87b3, 0x0245ef7c, 0x01570147, 0x01e61bbf, 0x037e7d3e, 0x0350ac0d, 0x01560851, 0x01234eac, 0x01e7f40a, 0x00215f1d}}}, + {X: Field{[10]uint32{0x00e82075, 0x031248db, 0x03566807, 0x03bc05c2, 0x032db4ec, 0x0021504d, 0x01f4d5ab, 0x003d694f, 0x0111233b, 0x000f8101}}, Y: Field{[10]uint32{0x000df3d3, 0x000e09d8, 0x00e02b96, 0x03806de4, 0x021fda08, 0x019d4ec8, 0x0235ebf5, 0x00e10dde, 0x0271dd44, 0x003e4cdc}}}, + {X: Field{[10]uint32{0x00d77e6e, 0x01337c8b, 0x03bd3e04, 0x00ae5211, 0x00ecc869, 0x01ef6b01, 0x03993e74, 0x0370f87d, 0x005310df, 0x00250baa}}, Y: Field{[10]uint32{0x02a155e5, 0x039892e7, 0x00e51e02, 0x03e950a3, 0x01f33e9a, 0x023106c7, 0x0110bbe5, 0x02dba6d1, 0x03c8e688, 0x002efcbd}}}, + {X: Field{[10]uint32{0x0103b532, 0x01b3a873, 0x02c0a3fe, 0x0247842c, 0x01dce217, 0x03406028, 0x01938097, 0x0297ee15, 0x02749883, 0x000795de}}, Y: Field{[10]uint32{0x0041c003, 0x005fb0eb, 0x01790194, 0x004b5773, 0x007b5756, 0x009e3a1e, 0x02530007, 0x0178576e, 0x022f856f, 0x002851d9}}}, + {X: Field{[10]uint32{0x03feaa5a, 0x01cb13db, 0x014c8ae4, 0x03f9f156, 0x037a05fb, 0x001ff928, 0x02e9dfa6, 0x01ed9084, 0x015a8a23, 0x003af276}}, Y: Field{[10]uint32{0x03f1162a, 0x011e55f9, 0x03c05b17, 0x0361ad2b, 0x038fec2f, 0x03e2d234, 0x015fb458, 0x0291f33c, 0x01c0e311, 0x000e501b}}}, + {X: Field{[10]uint32{0x03cac063, 0x00febc18, 0x00475277, 0x00dc7ecb, 0x01b90816, 0x02125862, 0x023d2280, 0x03f08084, 0x03601afd, 0x0031e3ab}}, Y: Field{[10]uint32{0x02b42de7, 0x020ecfcf, 0x029c76df, 0x033db07f, 0x01bacb42, 0x01b4e5be, 0x02e84c51, 0x00b7177d, 0x01b1e0c2, 0x000254c9}}}, + {X: Field{[10]uint32{0x036d34a0, 0x01a173f7, 0x01db8752, 0x01a80d5c, 0x004f2e53, 0x005f09e6, 0x00a3d0e1, 0x00134ad1, 0x0319a1d5, 0x002d6461}}, Y: Field{[10]uint32{0x00184abe, 0x013a6986, 0x02a356d5, 0x02c9798b, 0x0016beac, 0x03226414, 0x029828aa, 0x02df23e8, 0x00cb585c, 0x0026c07a}}}, + {X: Field{[10]uint32{0x020042cd, 0x0325e3a3, 0x01584bda, 0x0115297a, 0x02454f10, 0x031bdd6d, 0x0107dfdc, 0x0327464a, 0x033eb59f, 0x0021c1a9}}, Y: Field{[10]uint32{0x03dc3a49, 0x024a1b56, 0x001ce710, 0x037478d3, 0x004265e2, 0x02daa1fa, 0x028405a2, 0x01e35bd4, 0x03566f1f, 0x0022c6d7}}}, + {X: Field{[10]uint32{0x0312d6ca, 0x0154a741, 0x0230ae64, 0x0108e888, 0x00793e56, 0x01b8ab41, 0x00a92890, 0x012fedbd, 0x016e4ddb, 0x0024fa49}}, Y: Field{[10]uint32{0x02afdcea, 0x01aa3b5b, 0x01cd6975, 0x011e429d, 0x03d874f2, 0x0038e626, 0x000ea62f, 0x037fb0d9, 0x02dbd9b3, 0x0020ec90}}}, + {X: Field{[10]uint32{0x022ac295, 0x031bfe7a, 0x0127fe9a, 0x02fd62ad, 0x03a24fff, 0x00755806, 0x0353956a, 0x03ce6f2c, 0x01af8702, 0x000b6b52}}, Y: Field{[10]uint32{0x03e4675b, 0x00e98949, 0x002fe277, 0x00450370, 0x00ed4036, 0x032b3a30, 0x000704e2, 0x001d8957, 0x00b8e604, 0x002d6bda}}}, + {X: Field{[10]uint32{0x036950a0, 0x00431513, 0x014f7597, 0x0193d0ec, 0x0086a2c3, 0x03af8ccb, 0x01627195, 0x00be9152, 0x00994da4, 0x0017ff06}}, Y: Field{[10]uint32{0x02c9bb88, 0x00c6b570, 0x0363f043, 0x00be6ea7, 0x014542ad, 0x036c14f3, 0x00e61419, 0x017ea888, 0x00a87981, 0x0008bab0}}}, + {X: Field{[10]uint32{0x001c51ba, 0x02982ff5, 0x02b6e69f, 0x02739b98, 0x00324c63, 0x00aed6b4, 0x0221bb8a, 0x029e6713, 0x01bb1832, 0x001c6f82}}, Y: Field{[10]uint32{0x00dda472, 0x03c8e355, 0x01656e4f, 0x03730578, 0x01950588, 0x0153ac92, 0x0040767b, 0x016e3ca3, 0x03c5719a, 0x0031489f}}}, + {X: Field{[10]uint32{0x02587212, 0x0303b59a, 0x002770ba, 0x0359115a, 0x0056d661, 0x037caeb1, 0x00a3cb37, 0x0267c299, 0x0305f927, 0x00013e50}}, Y: Field{[10]uint32{0x03c054ab, 0x007f04c4, 0x03344051, 0x01b5b403, 0x026baf79, 0x0363475f, 0x00ddc7ca, 0x020f5ae5, 0x011fbd86, 0x0013121a}}}, + {X: Field{[10]uint32{0x00f0ab81, 0x021ace98, 0x033bc54b, 0x02338b1a, 0x02b3aeb3, 0x017d8614, 0x024fc096, 0x0248fb98, 0x028b6fc2, 0x00157be1}}, Y: Field{[10]uint32{0x0222efab, 0x039b9e45, 0x01a0e72c, 0x037c8b70, 0x0376cff6, 0x0198147e, 0x014d0adc, 0x02d3314d, 0x02eaab16, 0x003b0662}}}, + {X: Field{[10]uint32{0x00fdab68, 0x0330d55d, 0x022790cb, 0x02f08d90, 0x00a357f6, 0x01028e56, 0x020953ed, 0x0276fc39, 0x019046e1, 0x0009ab55}}, Y: Field{[10]uint32{0x02795508, 0x03ecfc3e, 0x025e2184, 0x039d36f0, 0x00e5bb77, 0x002f1a25, 0x03c6a746, 0x00870154, 0x01ef9067, 0x002bdbf1}}}, + {X: Field{[10]uint32{0x0037312a, 0x03307c3b, 0x0150384f, 0x01a63ba3, 0x02bc051a, 0x00e406fc, 0x000b0ae4, 0x01c554e7, 0x003ab1b0, 0x001ce7ed}}, Y: Field{[10]uint32{0x006b7e28, 0x00f9d8db, 0x019e7a19, 0x02e1302d, 0x01ff90d6, 0x0379aad3, 0x00abe331, 0x008898b5, 0x03043c88, 0x0030488d}}}, + {X: Field{[10]uint32{0x0216771d, 0x026eb519, 0x02c6cc29, 0x0196a74c, 0x03d5a109, 0x00ba4497, 0x03422f82, 0x03d76a9e, 0x009d508c, 0x00085119}}, Y: Field{[10]uint32{0x001ca76e, 0x03348a74, 0x03a1a74a, 0x032b6776, 0x0376ddea, 0x01419f3a, 0x03ef96b3, 0x031117c0, 0x038c0e33, 0x000454c5}}}, + {X: Field{[10]uint32{0x03b97072, 0x036438ee, 0x03580ec8, 0x038d55b4, 0x014d5577, 0x014209e3, 0x02a85175, 0x023a3c5b, 0x023c16ee, 0x0018b311}}, Y: Field{[10]uint32{0x026a891e, 0x0218ffa2, 0x033fcb81, 0x03e8be6a, 0x0356b48e, 0x0244ce56, 0x02a6c91c, 0x03140211, 0x0043e299, 0x00334a52}}}, + {X: Field{[10]uint32{0x03ef9c21, 0x03ab0cd4, 0x031c9707, 0x0376e77f, 0x004317e1, 0x0103dd33, 0x00fdb006, 0x03c64345, 0x030133ed, 0x00004658}}, Y: Field{[10]uint32{0x0020494c, 0x00db4855, 0x020c8031, 0x0065841a, 0x00caa4f5, 0x03681c0d, 0x03851876, 0x03b9b5d0, 0x00e5e3a3, 0x003c5aad}}}, + {X: Field{[10]uint32{0x0289adcd, 0x0298c648, 0x03c162b4, 0x00d0099c, 0x03777d4e, 0x025554a1, 0x0315baed, 0x03e4fca3, 0x03863fda, 0x002c942f}}, Y: Field{[10]uint32{0x01b3d2c1, 0x0356b04e, 0x016f828a, 0x03bce7eb, 0x01da1e06, 0x02d0357e, 0x013543f6, 0x00f4a21f, 0x01bede34, 0x000a5701}}}, + {X: Field{[10]uint32{0x003e7c6c, 0x03d1bd92, 0x03e696f4, 0x002053a1, 0x01027ef0, 0x00b0666c, 0x010945a7, 0x011ce67c, 0x03bcae58, 0x0024e902}}, Y: Field{[10]uint32{0x02858a09, 0x03a32f2a, 0x0217389f, 0x03802bd9, 0x03f088e2, 0x0249a192, 0x03289a45, 0x0259d3d7, 0x00c02980, 0x00207b5c}}}, + {X: Field{[10]uint32{0x020978cc, 0x0230303d, 0x01f90eff, 0x03753eaa, 0x0019ff7d, 0x03a60978, 0x03e76b34, 0x0275d6c5, 0x021b4e90, 0x002e799d}}, Y: Field{[10]uint32{0x035aa117, 0x01e4241e, 0x0211b762, 0x00ef2634, 0x0165c75e, 0x03cb215d, 0x001b70fb, 0x0049c222, 0x01035fb9, 0x00190305}}}, + {X: Field{[10]uint32{0x00cfec24, 0x010d8344, 0x039beebf, 0x0146c08a, 0x00ae4547, 0x016cb702, 0x03e260cf, 0x026e91a1, 0x0012fe3d, 0x0013708a}}, Y: Field{[10]uint32{0x039a90d1, 0x00b7d7df, 0x01c4305b, 0x00b90c0c, 0x0227f082, 0x0135a015, 0x02e986da, 0x0204d554, 0x034a5685, 0x00270d7b}}}, + {X: Field{[10]uint32{0x009deadf, 0x020a1b13, 0x03540934, 0x00948d98, 0x03e198e2, 0x020f4b4e, 0x02b94ba6, 0x03e70901, 0x02b31127, 0x0010c49d}}, Y: Field{[10]uint32{0x001efb3e, 0x00e312b8, 0x03743139, 0x03237756, 0x02c26d39, 0x037232fb, 0x006280dd, 0x037e192d, 0x0184c7f1, 0x0008997b}}}, + {X: Field{[10]uint32{0x0283632a, 0x0042b2cd, 0x00360aa8, 0x00dae1e2, 0x03328f17, 0x033eaa45, 0x00b81d76, 0x0163d0ad, 0x02c3c990, 0x001d716d}}, Y: Field{[10]uint32{0x028f719d, 0x036d7142, 0x00464aff, 0x006ea03c, 0x014a5aaa, 0x026a243c, 0x02309ef4, 0x01edfdc2, 0x009fdef1, 0x001527c0}}}, + {X: Field{[10]uint32{0x02a827d7, 0x03be6773, 0x0357c815, 0x03a44ba9, 0x0326d4d4, 0x02920077, 0x02b1a377, 0x03dd0a5d, 0x0027205a, 0x000f2400}}, Y: Field{[10]uint32{0x00649cc0, 0x015e2c42, 0x0184c83c, 0x01183f9c, 0x02007a24, 0x00ce76ac, 0x007fa7c0, 0x029f788e, 0x03f337ec, 0x00038a33}}}, + {X: Field{[10]uint32{0x0310d9ff, 0x01ebaacc, 0x0297f3a8, 0x02f4ea3a, 0x00c89637, 0x01708fcc, 0x03a8ab0d, 0x02e57c27, 0x031a3676, 0x0015983c}}, Y: Field{[10]uint32{0x011c568b, 0x035e1b2c, 0x03839efb, 0x01b0ae8f, 0x03955bb7, 0x01366bfc, 0x0092ff3e, 0x032829f6, 0x00d66bc4, 0x003581a7}}}, + {X: Field{[10]uint32{0x033babe9, 0x01e1bfd7, 0x02f618cd, 0x0351e6bd, 0x00e6733c, 0x02dc75de, 0x03979ce5, 0x037219fd, 0x00a41b45, 0x000ae2da}}, Y: Field{[10]uint32{0x01e4097a, 0x0314b163, 0x021ab40a, 0x0311b050, 0x03840f89, 0x02b66824, 0x00923f63, 0x006ccf08, 0x0244d544, 0x001f20c4}}}, + {X: Field{[10]uint32{0x01c18610, 0x00a73aa2, 0x01290442, 0x012cc0fa, 0x001d369d, 0x01acff28, 0x03578869, 0x02f3712c, 0x004db817, 0x00218d40}}, Y: Field{[10]uint32{0x02b909e2, 0x03b0ca5b, 0x0300c4c3, 0x00487f12, 0x007e9f35, 0x00563687, 0x0384cc05, 0x01b9af8b, 0x02402bd4, 0x00091cb6}}}, + {X: Field{[10]uint32{0x00cb28d0, 0x01a88d22, 0x03b693a5, 0x000f7193, 0x01b0d39d, 0x01b87b33, 0x03afbde4, 0x013e5e6d, 0x026b6eeb, 0x001b2646}}, Y: Field{[10]uint32{0x01c95620, 0x00467bd9, 0x013722bc, 0x00f93350, 0x030e0b75, 0x00fad11c, 0x0277188d, 0x018d4140, 0x034fc2cd, 0x0007977d}}}, + {X: Field{[10]uint32{0x0341570c, 0x02865fa7, 0x03a0ca52, 0x029258bf, 0x00554569, 0x0248a22e, 0x0298ed7e, 0x033246e5, 0x019d4283, 0x002b36b0}}, Y: Field{[10]uint32{0x02d7b66e, 0x00e94831, 0x01afeea0, 0x029be5f6, 0x02451d41, 0x01c5d0ae, 0x030c6bfe, 0x021507d4, 0x0187523c, 0x003e94db}}}, + {X: Field{[10]uint32{0x025fc6c0, 0x00a96591, 0x00abba3e, 0x03c2bad4, 0x0385bba7, 0x034a29f2, 0x00b107c3, 0x032ee552, 0x03a3f696, 0x002c525a}}, Y: Field{[10]uint32{0x006318ad, 0x00bbcf72, 0x0057a857, 0x02effd73, 0x03487740, 0x03a01e09, 0x03c8f8ea, 0x0129bb83, 0x00d5727a, 0x001dfedb}}}, + {X: Field{[10]uint32{0x01b09126, 0x01500d36, 0x03ec94d8, 0x01e2b6c1, 0x02c2c9f8, 0x01b44a39, 0x00cab31d, 0x03a7283f, 0x01b56098, 0x000ff65f}}, Y: Field{[10]uint32{0x022b4578, 0x01007cc8, 0x014a22c0, 0x012c09f8, 0x0324e37d, 0x022c91bd, 0x00451273, 0x038dd03f, 0x00361494, 0x0006f5df}}}, + {X: Field{[10]uint32{0x02aefce9, 0x00ab8bb0, 0x03338898, 0x03feb5e4, 0x02eb174c, 0x00271f3e, 0x036d5c44, 0x01a3b551, 0x0055f2a4, 0x0017a37e}}, Y: Field{[10]uint32{0x02a6845f, 0x02e32c4d, 0x0357a17e, 0x03b311bc, 0x01d50da8, 0x021c0610, 0x01771843, 0x032a2282, 0x02823bb8, 0x0014b9ce}}}, + {X: Field{[10]uint32{0x024672bd, 0x005021b1, 0x006613f8, 0x0076e503, 0x0062021a, 0x003ee4cb, 0x01e6fb0a, 0x032da7a5, 0x02eb1417, 0x00267c41}}, Y: Field{[10]uint32{0x03a6501d, 0x02097ffd, 0x015337e9, 0x010f4613, 0x01e484d8, 0x00709ff9, 0x02926e6a, 0x0000441a, 0x0038e1e7, 0x00279fec}}}, + {X: Field{[10]uint32{0x0251ef8c, 0x00c18e9f, 0x031f7ac4, 0x03f52971, 0x0068bb14, 0x03fc3882, 0x011d6864, 0x0361fff4, 0x00985526, 0x001a1bf1}}, Y: Field{[10]uint32{0x00588e5b, 0x01824651, 0x0224422f, 0x017d6cf5, 0x024137dc, 0x0383c8ff, 0x016dd6b2, 0x02be16f2, 0x0132d793, 0x00074a3d}}}, + {X: Field{[10]uint32{0x03f6b83d, 0x03e5af2f, 0x03b2093d, 0x0001582f, 0x00e4c836, 0x00dc3e19, 0x00f3a85b, 0x002f2a45, 0x0356cc45, 0x0033e977}}, Y: Field{[10]uint32{0x0137604b, 0x0017cee3, 0x0203f78b, 0x03c09938, 0x0261cf56, 0x023e05c1, 0x01d96c74, 0x03ff246c, 0x0246bab7, 0x0033bee6}}}, + {X: Field{[10]uint32{0x013e404e, 0x0022791c, 0x003e8b39, 0x01aa58aa, 0x02893760, 0x00d39f2f, 0x0241eed5, 0x025a4fdd, 0x034c3fbb, 0x002646da}}, Y: Field{[10]uint32{0x023f8d3e, 0x02d83baf, 0x03c7113b, 0x01e75611, 0x02098dab, 0x012e4ae2, 0x038a0a2f, 0x019a234e, 0x026bbe55, 0x000fffae}}}, + {X: Field{[10]uint32{0x03c8c0d7, 0x006ee484, 0x00bcd689, 0x038d5a4e, 0x032955c4, 0x0089b144, 0x021fa14f, 0x00487162, 0x01d3b9b0, 0x00344131}}, Y: Field{[10]uint32{0x00caa6e9, 0x003415ac, 0x0196a3d9, 0x00028244, 0x00091ddb, 0x0171ddce, 0x02cea218, 0x01f3f40c, 0x019a814d, 0x0002320e}}}, + {X: Field{[10]uint32{0x0355dfce, 0x00c652f8, 0x031bcad9, 0x03df1d2c, 0x03415a06, 0x0065093a, 0x01c9a407, 0x00d921d2, 0x0053a45c, 0x001d864a}}, Y: Field{[10]uint32{0x024ad2fc, 0x03cdd14c, 0x01ecf84e, 0x00de451d, 0x02b5517b, 0x00984f18, 0x02bc9345, 0x01404b5f, 0x02873cbb, 0x000c44e4}}}, + {X: Field{[10]uint32{0x01070725, 0x027ec6b9, 0x016c8805, 0x02e6069f, 0x0210c7f9, 0x014424ec, 0x01b1de5c, 0x0307d301, 0x00a80509, 0x0005ccc1}}, Y: Field{[10]uint32{0x001d353e, 0x0087e24d, 0x013d5f9e, 0x022ce630, 0x02800cdc, 0x01a48a5e, 0x03db2e9c, 0x020e5150, 0x0198c8e0, 0x0010efef}}}, + {X: Field{[10]uint32{0x03da104a, 0x02b94542, 0x014c46b7, 0x02a02c53, 0x019eacca, 0x0391bf25, 0x03f5b6a9, 0x01545041, 0x03e1d28c, 0x002b2815}}, Y: Field{[10]uint32{0x02bf6ce8, 0x02e90cf9, 0x017024dc, 0x03348fdb, 0x00cb00e6, 0x012dcae3, 0x0095be9a, 0x01dbfc60, 0x031770bd, 0x00385fc5}}}, + {X: Field{[10]uint32{0x0076dbaa, 0x0212274d, 0x02b04b7e, 0x017d839b, 0x0385b294, 0x00029f70, 0x00a73859, 0x023ec70c, 0x0150e009, 0x003ec809}}, Y: Field{[10]uint32{0x039a0f28, 0x013d597b, 0x0099645e, 0x008b7f0f, 0x03cedda9, 0x01fd1cf3, 0x03bc98c7, 0x031a36f4, 0x00203f72, 0x0006abe1}}}, + {X: Field{[10]uint32{0x011ae7ac, 0x021e6f38, 0x0101c08f, 0x026108b1, 0x03af1aa2, 0x00a562f8, 0x0366c66c, 0x01eae396, 0x010ca022, 0x003a56dc}}, Y: Field{[10]uint32{0x0397cf19, 0x00975427, 0x030a2c55, 0x01a36728, 0x00c745a9, 0x03b7407e, 0x0109022c, 0x03d2df6a, 0x00e1ab5c, 0x0039917d}}}, + {X: Field{[10]uint32{0x0044770a, 0x019bcf7a, 0x02a15147, 0x01b339df, 0x03ab136c, 0x033b517f, 0x01cf203c, 0x02ffe581, 0x025c3589, 0x001b6d14}}, Y: Field{[10]uint32{0x02658c81, 0x035a121c, 0x00903eb5, 0x02ecf167, 0x03799cd7, 0x00b01a62, 0x031d2958, 0x01612c8c, 0x0003f5f7, 0x0039adfd}}}, + {X: Field{[10]uint32{0x01085eb3, 0x01cc4ccd, 0x022c8fbe, 0x0229a592, 0x01169043, 0x0136e711, 0x03c2959e, 0x03ab9c57, 0x029e49da, 0x002224ea}}, Y: Field{[10]uint32{0x01987cdd, 0x031c2539, 0x00c10d01, 0x0316ebb2, 0x01bd15ce, 0x0197d8b2, 0x037a4b02, 0x00fced8d, 0x003eae80, 0x001c3ef6}}}, + {X: Field{[10]uint32{0x020207a0, 0x02505363, 0x01fd56e3, 0x03123ceb, 0x012cd9e2, 0x02a9e2f2, 0x01e3ece8, 0x02336a1c, 0x02cfac6e, 0x002f95fd}}, Y: Field{[10]uint32{0x0293d5f2, 0x0083cafb, 0x03aa1581, 0x0374daec, 0x028893ee, 0x0266a9ee, 0x00d141d8, 0x03e273f7, 0x007299ab, 0x001e05c2}}}, + {X: Field{[10]uint32{0x00b34925, 0x0232d508, 0x03562671, 0x03d16a79, 0x00a2f69b, 0x0340ad75, 0x0205ddd8, 0x0044a717, 0x02d285a0, 0x0001dfe9}}, Y: Field{[10]uint32{0x026455cc, 0x0136d14c, 0x03b97ce0, 0x02643805, 0x0337a2da, 0x0303b7fa, 0x0086288e, 0x0348633a, 0x023c13a3, 0x000c56ec}}}, + {X: Field{[10]uint32{0x01f4dc03, 0x02826e34, 0x01d00b2e, 0x02b65e37, 0x02061094, 0x019ffec3, 0x00834ca7, 0x0370cd8b, 0x03fe8414, 0x000bfb5e}}, Y: Field{[10]uint32{0x00117e01, 0x0378b166, 0x00ff20a6, 0x0182db13, 0x0363332a, 0x00047186, 0x01e434f0, 0x00f4c559, 0x00f7aa0b, 0x0005397a}}}, + {X: Field{[10]uint32{0x034d66c6, 0x03ab2242, 0x026a101a, 0x010b3a3b, 0x037f8af2, 0x03c0fb8f, 0x0343df2b, 0x006e87f2, 0x00d05a87, 0x0027d30b}}, Y: Field{[10]uint32{0x02922920, 0x0316502f, 0x01acf83b, 0x03d7f0d0, 0x03d0fd7d, 0x030e1388, 0x038a2abd, 0x01e21e3f, 0x0352f242, 0x003ad087}}}, + {X: Field{[10]uint32{0x01bea647, 0x03e9f297, 0x013ce7c8, 0x022eef07, 0x0015f0a4, 0x00dce0fc, 0x0203ef6e, 0x001332dc, 0x00b6824a, 0x0014f038}}, Y: Field{[10]uint32{0x01618cf9, 0x03f4e853, 0x00e91836, 0x0178416a, 0x0313c59d, 0x03a024e5, 0x01729f9b, 0x0328694e, 0x018d9246, 0x001aa6d6}}}, + {X: Field{[10]uint32{0x0117d714, 0x00eb62ab, 0x02fd5c0a, 0x02fded3b, 0x03bb20fd, 0x00cf5a3a, 0x037bba54, 0x01ae12da, 0x0082d790, 0x0036f033}}, Y: Field{[10]uint32{0x01cd7211, 0x031d9d8b, 0x02e37a4f, 0x038a14c1, 0x008aee42, 0x039798ce, 0x001b0904, 0x00b0e9be, 0x038623ff, 0x0017af07}}}, + {X: Field{[10]uint32{0x008f5f0b, 0x002a9b49, 0x02165af2, 0x01e10314, 0x02ca93a4, 0x004c7557, 0x01a8cbb8, 0x023811ec, 0x0332a3c0, 0x001e18ab}}, Y: Field{[10]uint32{0x03fc15d8, 0x03f70ce2, 0x02684f1e, 0x00ba36a4, 0x017e8c27, 0x021ecefe, 0x0367a645, 0x00d4f228, 0x02076b10, 0x002ed7d9}}}, + {X: Field{[10]uint32{0x031049ee, 0x013032a4, 0x037524e4, 0x0326e1d4, 0x01f8238f, 0x005724ec, 0x012bad80, 0x0162ddbb, 0x01fc8001, 0x00034d5c}}, Y: Field{[10]uint32{0x02a44bc3, 0x01af1d20, 0x0315f4d2, 0x03e549af, 0x0170a9e6, 0x0056bd12, 0x00872fa9, 0x00c2aa74, 0x01e83e66, 0x00058b72}}}, + {X: Field{[10]uint32{0x00589d9b, 0x022c2de2, 0x02a26e90, 0x036a23eb, 0x03b9f531, 0x037cd613, 0x02b98e55, 0x031d6190, 0x0094cebb, 0x002a1472}}, Y: Field{[10]uint32{0x0375b422, 0x009638ec, 0x020e1151, 0x03e6d7eb, 0x011e1af1, 0x02b90ceb, 0x01f38983, 0x0307bdc7, 0x015cadfa, 0x001d1c0b}}}, + {X: Field{[10]uint32{0x0258012d, 0x0005b3b6, 0x0131e972, 0x03e407c2, 0x012d9af1, 0x036cba21, 0x0178a08c, 0x03feab82, 0x03f4012e, 0x002a4b90}}, Y: Field{[10]uint32{0x002fb668, 0x000ee574, 0x013c6bb9, 0x01ec8ef0, 0x02535c68, 0x02094825, 0x01d7bd12, 0x005c3acd, 0x009d5560, 0x00363d68}}}, + {X: Field{[10]uint32{0x03cff6bb, 0x001fed7c, 0x0024c090, 0x00a74a0f, 0x02bb29e1, 0x01d83b36, 0x02658c64, 0x01a7210b, 0x02448b43, 0x001d72bf}}, Y: Field{[10]uint32{0x0355dc39, 0x011dec42, 0x015f53c9, 0x028bee88, 0x02db1ea5, 0x00751ce2, 0x02affab5, 0x00d54c78, 0x02e243c7, 0x00328384}}}, + {X: Field{[10]uint32{0x0041d006, 0x012114e3, 0x02b56a21, 0x01ddedb9, 0x02c48c41, 0x02008ed6, 0x017a2337, 0x0167b0bc, 0x00664db9, 0x00002ac0}}, Y: Field{[10]uint32{0x035d8b31, 0x00dc5d67, 0x029b7b5d, 0x01f7adcb, 0x01e3d338, 0x0101d62b, 0x02762fb9, 0x0145a7d1, 0x02fc3554, 0x00233e78}}}, + {X: Field{[10]uint32{0x01b7ecb7, 0x02fa9427, 0x027814a1, 0x03f55cfc, 0x00f89b9a, 0x011a747c, 0x00855bf0, 0x0084d060, 0x02f82e4b, 0x0009d443}}, Y: Field{[10]uint32{0x00fb87e1, 0x01570d2b, 0x00aeb900, 0x00337b1a, 0x03b0a1b2, 0x02fa67f4, 0x02073555, 0x0130187f, 0x00e886b5, 0x00083f80}}}, + {X: Field{[10]uint32{0x01b16d3a, 0x00b23293, 0x02c1d745, 0x03b8ed66, 0x03f4a6c2, 0x02727081, 0x021405c9, 0x009dede4, 0x01a8d388, 0x001dcffd}}, Y: Field{[10]uint32{0x00a52f8e, 0x010d6fbe, 0x002848d7, 0x02bcf9cd, 0x0200f75c, 0x01cc638e, 0x00806bd8, 0x03196ebf, 0x0231f51c, 0x0033d179}}}, + {X: Field{[10]uint32{0x02f45746, 0x03311547, 0x0386fe14, 0x00dcb890, 0x034293fc, 0x03686a3b, 0x0277e359, 0x02ff0edc, 0x0098e69e, 0x000be3cb}}, Y: Field{[10]uint32{0x0168ec06, 0x032b5026, 0x02c3642c, 0x0323fba8, 0x008150a6, 0x0012aaba, 0x003e4066, 0x02ae808f, 0x03ecc4dc, 0x003e1748}}}, + {X: Field{[10]uint32{0x0277f67f, 0x020f7a58, 0x001c061a, 0x01e19369, 0x01745756, 0x018d5b39, 0x00849522, 0x03438a82, 0x00daab8d, 0x00061e2b}}, Y: Field{[10]uint32{0x01477020, 0x011596b5, 0x009bb968, 0x00a039b4, 0x03ecbcc1, 0x03e922bc, 0x0296f05b, 0x0024b2b7, 0x028d064e, 0x00104b21}}}, + {X: Field{[10]uint32{0x035618c1, 0x02312f13, 0x029c4cad, 0x003d273d, 0x02c5a17b, 0x004dcfd8, 0x004f3cdd, 0x039389fb, 0x001aeac4, 0x000233ca}}, Y: Field{[10]uint32{0x01ed5973, 0x03f61bca, 0x02625cd9, 0x036d93fe, 0x027dbf09, 0x038cc0a6, 0x023911ed, 0x03a89f36, 0x019529c9, 0x000bc5fe}}}, + {X: Field{[10]uint32{0x008939f9, 0x0081a634, 0x01ec39ea, 0x00d9c5fc, 0x02a09579, 0x0370abbf, 0x010d1913, 0x00da7976, 0x009ff165, 0x000e965f}}, Y: Field{[10]uint32{0x000a14d4, 0x018ad3ac, 0x01926da4, 0x021bd624, 0x03a7b48c, 0x00262381, 0x03464b00, 0x028b7816, 0x03b290c9, 0x00230880}}}, + {X: Field{[10]uint32{0x010ca15e, 0x013eb2e5, 0x028ac505, 0x0242eeb1, 0x03b9ceec, 0x014a40e4, 0x029c8615, 0x0043fd77, 0x0205096f, 0x00032f8c}}, Y: Field{[10]uint32{0x03ee27f4, 0x00ae51d3, 0x02bd0547, 0x00b2b785, 0x039bf7c7, 0x00580072, 0x02b48557, 0x02e84b0c, 0x006ab76a, 0x00111b2c}}}, + {X: Field{[10]uint32{0x02fed594, 0x036c1055, 0x00bd53a8, 0x00017b98, 0x011cde71, 0x019511cc, 0x0013b09e, 0x0139c061, 0x01cf0822, 0x0010c4f2}}, Y: Field{[10]uint32{0x03329a96, 0x0275cd46, 0x023317ab, 0x0352af12, 0x000e80bb, 0x02809482, 0x001021f9, 0x016a32c6, 0x019dd304, 0x0037ebcd}}}, + {X: Field{[10]uint32{0x0373c60e, 0x03c3eaaf, 0x036882bd, 0x02ac67ed, 0x011f5cbf, 0x03697fe9, 0x009651b2, 0x02b7b0b6, 0x0351f8d8, 0x0033ab4a}}, Y: Field{[10]uint32{0x02a25897, 0x01472915, 0x0221bf84, 0x029fb4b4, 0x026dd3bd, 0x02fc512b, 0x03e79322, 0x03c3a31c, 0x00806992, 0x002aca89}}}, + {X: Field{[10]uint32{0x027b79a0, 0x03c9eb92, 0x020e52d8, 0x02b67e2f, 0x0298e34d, 0x017b9bbb, 0x01164b84, 0x01d8bd91, 0x008d0848, 0x002739d7}}, Y: Field{[10]uint32{0x02a30a05, 0x00a76f26, 0x03571d0a, 0x0166e458, 0x029f6275, 0x02dd0a89, 0x017c04c8, 0x02a419ae, 0x014fe11b, 0x0038155b}}}, + {X: Field{[10]uint32{0x026741d7, 0x0002224c, 0x013a96ba, 0x020c0759, 0x0310214b, 0x0308e11e, 0x02106bf8, 0x038957e4, 0x009c621d, 0x00180912}}, Y: Field{[10]uint32{0x004ea858, 0x03638b84, 0x03aa9b1f, 0x0021989b, 0x02abf63e, 0x01ae0b97, 0x01326210, 0x000803b2, 0x032480a9, 0x0002543a}}}, + {X: Field{[10]uint32{0x0308e51d, 0x0348bb57, 0x01e11546, 0x028f1a11, 0x011f55e1, 0x001c957f, 0x02c2638c, 0x01af3501, 0x02f0108f, 0x0034f1d1}}, Y: Field{[10]uint32{0x038dfab6, 0x002f3390, 0x0165e25d, 0x0069bff0, 0x0335ed4e, 0x015fbcf6, 0x001a776c, 0x031ce799, 0x03e5d349, 0x00344936}}}, + {X: Field{[10]uint32{0x036514b8, 0x03c9c5c4, 0x00c6352c, 0x03e6f3e9, 0x01a69c69, 0x00216537, 0x03b9e11e, 0x03088be5, 0x035cd85d, 0x00287ad7}}, Y: Field{[10]uint32{0x00a15fff, 0x01429f3e, 0x03b68007, 0x01d8c094, 0x00ff5e3f, 0x03768ee8, 0x0247ddd7, 0x03805dd8, 0x0135a393, 0x0011bb4f}}}, + {X: Field{[10]uint32{0x005a8736, 0x03dd5852, 0x03639721, 0x015ae0b1, 0x00e44065, 0x0305051f, 0x025f1c61, 0x030b2fea, 0x0357fa3a, 0x000ac928}}, Y: Field{[10]uint32{0x03d73ade, 0x00cc3346, 0x0243c018, 0x017d742d, 0x01ad192a, 0x015c8751, 0x00fd7aed, 0x02b5546a, 0x01bd707a, 0x00359c86}}}, + {X: Field{[10]uint32{0x0187b2ec, 0x0293db3f, 0x03306126, 0x00f98ba7, 0x02ab6a62, 0x00bb2d06, 0x00c9cfb4, 0x0005658f, 0x01ab9dc6, 0x00264068}}, Y: Field{[10]uint32{0x00339317, 0x033363fc, 0x01730633, 0x0307b899, 0x03eb5950, 0x032d0539, 0x037a3df6, 0x035fcbff, 0x0194017c, 0x0023dd99}}}, + {X: Field{[10]uint32{0x0077e8da, 0x02e65961, 0x037634ae, 0x0386c870, 0x0328a2a4, 0x01f56320, 0x018e6003, 0x038bc787, 0x00455890, 0x000c47a1}}, Y: Field{[10]uint32{0x00ce030c, 0x016415bb, 0x00829a04, 0x009c7987, 0x01e017e9, 0x019c0ef0, 0x030dd00f, 0x015d8a86, 0x03676cc7, 0x0033d64f}}}, + {X: Field{[10]uint32{0x0283bb77, 0x023b31e7, 0x008b367a, 0x0391bfba, 0x03122d27, 0x023ebd9b, 0x00ad8b8c, 0x003db8a6, 0x02e39714, 0x002417dc}}, Y: Field{[10]uint32{0x01b65257, 0x01c529bc, 0x019b4698, 0x022a84b8, 0x022d9852, 0x02d6c94e, 0x00b94fc1, 0x03099764, 0x015dbde9, 0x00300fc5}}}, + {X: Field{[10]uint32{0x0339350c, 0x00fd56e8, 0x0085e04a, 0x00cc09f7, 0x0039eafd, 0x02672ed3, 0x00c2f021, 0x000004bf, 0x03a5d594, 0x001877dd}}, Y: Field{[10]uint32{0x01049161, 0x0189a8b6, 0x0005f684, 0x008235b7, 0x01f36640, 0x035b903d, 0x030603f2, 0x026cfdce, 0x037d00de, 0x0009f222}}}, + {X: Field{[10]uint32{0x01f18c28, 0x010aeb17, 0x021295bc, 0x0353bc09, 0x030de36d, 0x03bb01b1, 0x016af906, 0x012c7577, 0x0199886d, 0x00387e38}}, Y: Field{[10]uint32{0x01ca45a8, 0x03e2add4, 0x025e29ec, 0x02d53196, 0x0056a98d, 0x039f98d2, 0x025bc4ba, 0x03abc4a1, 0x02e9b956, 0x00140b04}}}, + {X: Field{[10]uint32{0x03b8565a, 0x02181dbe, 0x02ac19b6, 0x0151e692, 0x029180e1, 0x001133e5, 0x01fe6a77, 0x0288701f, 0x01b83804, 0x002b78bd}}, Y: Field{[10]uint32{0x03066aca, 0x006f09bb, 0x01eee375, 0x03d915c5, 0x0198a9e6, 0x017499f9, 0x00985d6f, 0x005a30c2, 0x021d07c8, 0x00343597}}}, + {X: Field{[10]uint32{0x03268187, 0x0208779b, 0x01b88ea5, 0x021685d5, 0x009f7f6b, 0x018a202e, 0x0345dd5c, 0x03e5cab0, 0x00bb0154, 0x00315608}}, Y: Field{[10]uint32{0x00613086, 0x00795af3, 0x027a2124, 0x016b605f, 0x014dc35f, 0x0285d223, 0x03b698c8, 0x02996498, 0x03ea1e6c, 0x002446c3}}}, + {X: Field{[10]uint32{0x007778b5, 0x000e719b, 0x01d089f7, 0x023054b7, 0x02128588, 0x023330b4, 0x0164352b, 0x0083d14e, 0x026e3210, 0x003a8825}}, Y: Field{[10]uint32{0x034fc18c, 0x00a7c9a7, 0x00d3959e, 0x01b37786, 0x0166f547, 0x010d0a70, 0x03dc9bd6, 0x007949aa, 0x0191cdc8, 0x003250bd}}}, + {X: Field{[10]uint32{0x007e2bf5, 0x03d37d18, 0x007079f9, 0x022a3a03, 0x02220c90, 0x0387be12, 0x0301bbd3, 0x03f9699c, 0x012d9c2d, 0x000f15d5}}, Y: Field{[10]uint32{0x031f39e3, 0x000802f9, 0x00522b9f, 0x0153b542, 0x016fd347, 0x00997fd9, 0x031a0a17, 0x018e5cf9, 0x00ffbc4a, 0x003527e8}}}, + {X: Field{[10]uint32{0x03d4e1c3, 0x02825466, 0x0071feb5, 0x002f3dfc, 0x01a3fd5c, 0x012b6859, 0x028e1339, 0x00fb0167, 0x00c6e104, 0x003c6233}}, Y: Field{[10]uint32{0x03bfdbe4, 0x021814c1, 0x021cf944, 0x010428bf, 0x03db045c, 0x0081d926, 0x02fb1908, 0x01e740b5, 0x031fe53e, 0x0017c7cd}}}, + {X: Field{[10]uint32{0x011c8c6a, 0x00d790b0, 0x013cad48, 0x028b4729, 0x01447112, 0x029efed2, 0x015a146a, 0x008cba01, 0x03d27e72, 0x00280517}}, Y: Field{[10]uint32{0x01e679cc, 0x00f9270f, 0x02cc5024, 0x02fc8b1f, 0x00ceb874, 0x001c272c, 0x00bb675f, 0x00333031, 0x00a0e5e7, 0x001ef006}}}, + {X: Field{[10]uint32{0x016ff48e, 0x00f7e03c, 0x016bd9c9, 0x0362c5d0, 0x01c17b7b, 0x02d56061, 0x03857060, 0x00454c7e, 0x01e80c22, 0x0014d003}}, Y: Field{[10]uint32{0x01a6cc6f, 0x034cf690, 0x0244c89c, 0x0082299a, 0x002df873, 0x00dbaa5c, 0x00840b6a, 0x0197c794, 0x02473ba5, 0x003848a3}}}, + {X: Field{[10]uint32{0x0264b1ac, 0x03199d33, 0x019048c6, 0x02d14ae6, 0x01cc8960, 0x03566be1, 0x00e34821, 0x00df8d43, 0x012d009d, 0x00208457}}, Y: Field{[10]uint32{0x021eb048, 0x03ee7bed, 0x02f05e75, 0x00f7a489, 0x01bffc1b, 0x02e74620, 0x02adab03, 0x00309012, 0x0209659a, 0x002637aa}}}, + {X: Field{[10]uint32{0x01fe7c3c, 0x005e2516, 0x039681fc, 0x01f00c20, 0x028669cb, 0x01437389, 0x01e6e9d4, 0x01bc7312, 0x001853d8, 0x0009cf63}}, Y: Field{[10]uint32{0x00c2ea00, 0x01b44040, 0x008af2e1, 0x007dfdfe, 0x0314974e, 0x007beeb6, 0x00c25a25, 0x009b205d, 0x01aa8ad0, 0x001b154c}}}, + {X: Field{[10]uint32{0x025ee319, 0x019d46ee, 0x01bfe403, 0x032d6c16, 0x0041e68c, 0x03d0a3f3, 0x0233f4fb, 0x020645c3, 0x0216a7e3, 0x0000185b}}, Y: Field{[10]uint32{0x0106748a, 0x012c393d, 0x032eaba8, 0x031cfa2b, 0x007c7dc3, 0x032a64dd, 0x01173f5c, 0x00fbf6e6, 0x0121182a, 0x001f6f2b}}}, + {X: Field{[10]uint32{0x00b82812, 0x00df0058, 0x0277452c, 0x00409d7d, 0x00dc5666, 0x000cfc84, 0x0373402d, 0x0260487d, 0x016a76a3, 0x0019d862}}, Y: Field{[10]uint32{0x03302c9b, 0x001e0b99, 0x007ebe76, 0x03c688d8, 0x0111848d, 0x038b2339, 0x011184c8, 0x024e7e02, 0x01cf1b40, 0x001ff740}}}, + {X: Field{[10]uint32{0x01e508b9, 0x029b53e2, 0x01fe6dd4, 0x008248d1, 0x00bd6eb0, 0x005dedac, 0x0135bd9e, 0x00176849, 0x03aae976, 0x001dfdea}}, Y: Field{[10]uint32{0x007f0b9e, 0x0392d973, 0x01231889, 0x03e84358, 0x020dbf20, 0x02df24cc, 0x035fd19b, 0x020c37f3, 0x016ccc7b, 0x003ec126}}}, + {X: Field{[10]uint32{0x00bce311, 0x0232a8e6, 0x005a4a0d, 0x02299ec3, 0x01bc4b4a, 0x0007e73c, 0x02973785, 0x00aee8f6, 0x03173a2e, 0x00304bd9}}, Y: Field{[10]uint32{0x039a47a8, 0x000c67dd, 0x03853a33, 0x00cdb960, 0x01097cd1, 0x02db2d50, 0x00012aa3, 0x00500544, 0x018644d3, 0x0037a4c2}}}, + {X: Field{[10]uint32{0x018e66aa, 0x01fbe570, 0x03304ee7, 0x03ea9dae, 0x004afe8f, 0x037ce80d, 0x039d268d, 0x0154b236, 0x02de19c7, 0x001954e8}}, Y: Field{[10]uint32{0x00edb93c, 0x01dc181c, 0x037f5373, 0x033b26ee, 0x0169f95b, 0x014b4dd3, 0x034dbb77, 0x002edcab, 0x00107c18, 0x002469c8}}}, + {X: Field{[10]uint32{0x03b834e3, 0x031411ad, 0x013eec1f, 0x008f9a8f, 0x01bba980, 0x010032aa, 0x022e9363, 0x0106148b, 0x00be353f, 0x0003d52d}}, Y: Field{[10]uint32{0x0296f17e, 0x0190df23, 0x013a5124, 0x02d015df, 0x03ab6f78, 0x0065d16a, 0x035afde2, 0x03c7c2a0, 0x006cbdd5, 0x0025af9e}}}, + {X: Field{[10]uint32{0x02adbb2a, 0x016d2d03, 0x03c64c0d, 0x01f12d9d, 0x03f86be3, 0x016d3722, 0x03c806e4, 0x0194882e, 0x03c2a0fa, 0x0030b4c5}}, Y: Field{[10]uint32{0x0313ab6a, 0x03acd7b4, 0x02af58e8, 0x023528eb, 0x03100f07, 0x03266529, 0x00cb16df, 0x032aedc6, 0x0169bd68, 0x00315c42}}}, + {X: Field{[10]uint32{0x0389f384, 0x03fcc4c6, 0x03ccefe1, 0x010d04db, 0x02cc43e1, 0x01fd751c, 0x034b9c95, 0x02993f71, 0x03c6a5b8, 0x0014a959}}, Y: Field{[10]uint32{0x009e8f53, 0x01bde8a7, 0x01d485c1, 0x03a5f60d, 0x02d7de27, 0x02064a55, 0x005f7d6b, 0x00a62b75, 0x01bfa314, 0x000cc98c}}}, + {X: Field{[10]uint32{0x01ba4e20, 0x012881c7, 0x005e98d2, 0x03c666d3, 0x013530f0, 0x00c491ef, 0x01435278, 0x01104a21, 0x006c891a, 0x003df702}}, Y: Field{[10]uint32{0x034444aa, 0x0378d16d, 0x027e7b82, 0x000ffc41, 0x00da0550, 0x00121618, 0x02f5f751, 0x0166bac3, 0x0312452e, 0x001cd3b5}}}, + {X: Field{[10]uint32{0x02ec06c6, 0x008362c8, 0x00d3e905, 0x0147944b, 0x01b3f2ae, 0x039be3dd, 0x02d8d8cd, 0x036f032f, 0x03a97bb6, 0x002553e7}}, Y: Field{[10]uint32{0x005dd9bb, 0x030e76c6, 0x0378bf65, 0x00523c10, 0x005426f6, 0x02d3e085, 0x01b3017b, 0x01983d2f, 0x03bb8bd9, 0x002d96d0}}}, + {X: Field{[10]uint32{0x0204e87e, 0x0236c509, 0x0145e818, 0x02f905ad, 0x026def2d, 0x01dd7365, 0x0366947f, 0x01962082, 0x03984141, 0x000839a6}}, Y: Field{[10]uint32{0x00632539, 0x019fe24a, 0x01f51caa, 0x01361f7c, 0x030dcce0, 0x010fd808, 0x02e45a3d, 0x00ae6cd6, 0x02590bd1, 0x00399451}}}, + {X: Field{[10]uint32{0x0072ed1c, 0x039f15c3, 0x01dc3709, 0x0210aace, 0x0371bed4, 0x00c0a55d, 0x0187fb53, 0x00bc1110, 0x03822dc4, 0x00173796}}, Y: Field{[10]uint32{0x01a0ea9f, 0x00a4a66a, 0x03e41b49, 0x02f9d897, 0x03cea3dc, 0x00ff584d, 0x00416e75, 0x0016d425, 0x02d864e4, 0x00283dee}}}, + {X: Field{[10]uint32{0x0326421f, 0x00ec4c7e, 0x01c346e7, 0x0181779c, 0x0045b204, 0x027535ba, 0x02fd03f4, 0x02c370aa, 0x034c6ba6, 0x002d61b2}}, Y: Field{[10]uint32{0x00948744, 0x02b26ad6, 0x0116d2b4, 0x01a662ec, 0x026767b4, 0x001abee1, 0x01de6235, 0x028eca8c, 0x03e7c26e, 0x0033b584}}}, + {X: Field{[10]uint32{0x00ba6ede, 0x029779a4, 0x00a8b2a2, 0x0150ddf9, 0x014e192a, 0x02358071, 0x0213dbfa, 0x00ea0b23, 0x01703580, 0x001f4fd8}}, Y: Field{[10]uint32{0x02c6cb15, 0x027d354b, 0x0100f196, 0x012f9e3a, 0x0177eaf8, 0x00302f2f, 0x03564778, 0x004f083e, 0x010e62f4, 0x0004e3a0}}}, + {X: Field{[10]uint32{0x037eb925, 0x01dfb0a3, 0x01b41d85, 0x037603ea, 0x01c9fa32, 0x00c12ae0, 0x03e67135, 0x03e18f9f, 0x00befc4a, 0x0039e8c5}}, Y: Field{[10]uint32{0x00f3eb1f, 0x02913d20, 0x008fb091, 0x033b1420, 0x0113ec94, 0x036a5c30, 0x019b6d07, 0x012b3fea, 0x0200f0e0, 0x003365e1}}}, + {X: Field{[10]uint32{0x03c6a577, 0x024098f4, 0x00231ec0, 0x02b67915, 0x00ba5fc0, 0x003c37f2, 0x01cd8e81, 0x0240bb88, 0x03e49f41, 0x0005e70e}}, Y: Field{[10]uint32{0x009cf184, 0x03fc32d3, 0x009dc5b9, 0x022693a2, 0x02640216, 0x0142df93, 0x02b03f5a, 0x026a80a7, 0x020efb9b, 0x001d7e7d}}}, + {X: Field{[10]uint32{0x01e6401f, 0x01842c24, 0x00c6fe50, 0x01a4173e, 0x0108d762, 0x015d53e9, 0x017808e2, 0x03060ae5, 0x0071464b, 0x00042956}}, Y: Field{[10]uint32{0x01b56ff4, 0x0145a8d0, 0x038b3029, 0x03caaa32, 0x0299a787, 0x0241aea7, 0x005c679f, 0x0368b38c, 0x03b96d2b, 0x0034d924}}}, + {X: Field{[10]uint32{0x008e555e, 0x03cfa6ba, 0x0099f96a, 0x028bcea7, 0x02585827, 0x00c7b1fd, 0x0108d45b, 0x02321055, 0x03225e85, 0x0012a40d}}, Y: Field{[10]uint32{0x0247d145, 0x01f44c8c, 0x0064c70c, 0x01df40b1, 0x0031c9a4, 0x003f3785, 0x012463f2, 0x01134331, 0x01a7fb9e, 0x00369351}}}, + {X: Field{[10]uint32{0x016acb3e, 0x00a5dcea, 0x02b621cd, 0x02ef80bc, 0x00c68373, 0x005c3b20, 0x00052d6b, 0x02023ded, 0x018c2505, 0x001b4427}}, Y: Field{[10]uint32{0x02dc9a57, 0x00e2ca3a, 0x012adc50, 0x002e72e5, 0x03200c87, 0x02c08eff, 0x001088ec, 0x01b90145, 0x00de511f, 0x003237a8}}}, + {X: Field{[10]uint32{0x02e1af88, 0x03c30e59, 0x01bf28f7, 0x00f8a1d3, 0x0106105b, 0x00d55d41, 0x015c7347, 0x00919f01, 0x00986d20, 0x00270866}}, Y: Field{[10]uint32{0x01d0914a, 0x027ecb63, 0x004550ec, 0x03354b52, 0x03efddf5, 0x01959783, 0x01d41463, 0x03fc4be7, 0x016c8edd, 0x00218dd2}}}, + {X: Field{[10]uint32{0x0292b03a, 0x023b71b0, 0x032e74de, 0x02d772e3, 0x03dcd104, 0x00aee5ce, 0x036dd750, 0x003d8040, 0x00390e66, 0x0008b294}}, Y: Field{[10]uint32{0x006b11e8, 0x03a457d9, 0x0258eda5, 0x02eb100f, 0x01cb6731, 0x0023e832, 0x016449a7, 0x02e07910, 0x00711ef6, 0x0021bf51}}}, + {X: Field{[10]uint32{0x02b6f938, 0x037a10b9, 0x0227c80b, 0x00977dd7, 0x022e39be, 0x03db2880, 0x0116fdd1, 0x011903c8, 0x0302cc00, 0x0033f063}}, Y: Field{[10]uint32{0x0290df7d, 0x0075a118, 0x01398645, 0x02936740, 0x01c09236, 0x01c232f9, 0x03a2923f, 0x0343965e, 0x00df4f79, 0x00358ad6}}}, + {X: Field{[10]uint32{0x0280a087, 0x03053e66, 0x02f259d3, 0x015afb2e, 0x02574905, 0x008d7142, 0x01f46ca6, 0x01163a64, 0x00c23425, 0x000ce22f}}, Y: Field{[10]uint32{0x0245c016, 0x00b84fa9, 0x0013b310, 0x029752b1, 0x0306c3dc, 0x02563efc, 0x00223166, 0x015e0c07, 0x02f806f6, 0x001f52a8}}}, + {X: Field{[10]uint32{0x00b46a19, 0x02a507bc, 0x03aa802b, 0x00f532f2, 0x0144ac96, 0x00db67e5, 0x018fefc1, 0x004b78f7, 0x00131b8c, 0x00349af4}}, Y: Field{[10]uint32{0x028d3a99, 0x002b096d, 0x00653cb1, 0x01f699e0, 0x020d045a, 0x032ad24a, 0x02948724, 0x01e571ad, 0x02a331b6, 0x0019be27}}}, + {X: Field{[10]uint32{0x03d1fdb9, 0x0274a795, 0x035ca1d9, 0x0353511f, 0x03465a03, 0x03bd7d9a, 0x03960edf, 0x03a3c858, 0x030cdb67, 0x003734cd}}, Y: Field{[10]uint32{0x007084ef, 0x0185a9cd, 0x01ed9922, 0x02f66d93, 0x028a9eb4, 0x024efdcc, 0x038d4483, 0x02fe1cb3, 0x007a320a, 0x0022e4dd}}}, + {X: Field{[10]uint32{0x038d8e7a, 0x0227cfd3, 0x0006f805, 0x02ecff82, 0x0121d449, 0x02718e06, 0x03105af5, 0x02b558cd, 0x0105e602, 0x001d01d3}}, Y: Field{[10]uint32{0x003d574d, 0x02e1052c, 0x002cfe19, 0x03db111e, 0x02bf0dd8, 0x0077548d, 0x00fd515a, 0x0202b411, 0x03d4adee, 0x00069352}}}, + {X: Field{[10]uint32{0x0305c174, 0x00dcea0b, 0x034dd732, 0x025035ae, 0x01971203, 0x01e024aa, 0x00df438a, 0x00faedaa, 0x0081f3a2, 0x0002a273}}, Y: Field{[10]uint32{0x03c4fda4, 0x02a59128, 0x03d77873, 0x039d5c1f, 0x00326a9c, 0x02e5e77b, 0x01ddc9fd, 0x03c18d39, 0x03dd676d, 0x0012dbe0}}}, + {X: Field{[10]uint32{0x0216424c, 0x028e03d9, 0x00e037dd, 0x0102d82b, 0x026443c5, 0x001fe592, 0x002ae36b, 0x00fc3864, 0x00bafa91, 0x0023c684}}, Y: Field{[10]uint32{0x01e5525f, 0x02615557, 0x0326e869, 0x018b5680, 0x0114e3a4, 0x01d03cc7, 0x0016ad4e, 0x01df0c91, 0x024445c1, 0x00040a35}}}, + {X: Field{[10]uint32{0x01e27b51, 0x01d01222, 0x026d6f4c, 0x03e11e3e, 0x019154a2, 0x0369266b, 0x0157268a, 0x0288da9e, 0x027914f9, 0x002b63f6}}, Y: Field{[10]uint32{0x020e82ae, 0x01392f8c, 0x03834617, 0x03c09818, 0x03703b74, 0x0170f24c, 0x02deffc0, 0x029b1bdd, 0x02ab1f7d, 0x00272874}}}, + {X: Field{[10]uint32{0x0167fbe7, 0x0178cb3f, 0x03c874d1, 0x003f93ec, 0x03219270, 0x03c8e38b, 0x008cc246, 0x00a5c110, 0x010a797b, 0x001b1ba6}}, Y: Field{[10]uint32{0x0391dac1, 0x00c1868f, 0x019e1be8, 0x021e4f53, 0x0139811b, 0x0010368c, 0x025b32cc, 0x0159667e, 0x03980f35, 0x0007ff05}}}, + {X: Field{[10]uint32{0x01118969, 0x007e68c9, 0x0247cedc, 0x01728d02, 0x039f86f7, 0x0027c8de, 0x035351de, 0x00aaf658, 0x03ea31ad, 0x00080ac4}}, Y: Field{[10]uint32{0x001bcba0, 0x03314d46, 0x004c0fe3, 0x0085c000, 0x03868a45, 0x02f2061c, 0x0111184e, 0x00dfd354, 0x0105a14e, 0x00314bed}}}, + {X: Field{[10]uint32{0x03b748a5, 0x0210a475, 0x02f5fd22, 0x031848c9, 0x03034053, 0x02615654, 0x01c7c7cf, 0x010beac3, 0x00a10251, 0x0014d57c}}, Y: Field{[10]uint32{0x02281949, 0x0333c5df, 0x0118f4b1, 0x01a9e071, 0x039cddd3, 0x0183b8fb, 0x008ff9de, 0x0007db07, 0x036a5535, 0x001d6ef8}}}, + {X: Field{[10]uint32{0x029829d7, 0x00ebab30, 0x02235f91, 0x02c4d1c1, 0x0279a39a, 0x02a0ebb0, 0x00f16644, 0x037b2747, 0x0178eacb, 0x002e214b}}, Y: Field{[10]uint32{0x03183156, 0x00c584f7, 0x020faeb4, 0x0343dca7, 0x038d51ee, 0x03a27b0e, 0x002735d2, 0x03187eb9, 0x035052b3, 0x001d8eea}}}, + {X: Field{[10]uint32{0x03057ae2, 0x033b56c1, 0x0188beec, 0x03a02c3c, 0x01696d18, 0x0027b343, 0x017d4d6a, 0x03de3870, 0x004b294d, 0x0032acb9}}, Y: Field{[10]uint32{0x01ff2f43, 0x02681a06, 0x00ed5405, 0x02b416c8, 0x02de28bf, 0x0156d41b, 0x0149607c, 0x01266b3b, 0x009a501a, 0x003cd46c}}}, + {X: Field{[10]uint32{0x03056b31, 0x01a14f15, 0x026589d4, 0x00dae6e1, 0x03b16f9f, 0x0152dd5a, 0x012355eb, 0x015568af, 0x01c99c6d, 0x0005002e}}, Y: Field{[10]uint32{0x03a077a8, 0x0270cab7, 0x00436e56, 0x007e5bc9, 0x035709b9, 0x03508477, 0x026993b3, 0x00459e82, 0x001662f4, 0x0022ca42}}}, + {X: Field{[10]uint32{0x03d9141e, 0x03b1b9af, 0x018a50fb, 0x00655623, 0x03b3d31b, 0x0044511a, 0x03ae7a9a, 0x027071a1, 0x032e973e, 0x0014ab8d}}, Y: Field{[10]uint32{0x02351ccb, 0x02ff8360, 0x0256b71e, 0x033363b3, 0x001f87cf, 0x0116436d, 0x0238721a, 0x0390b6e5, 0x000de6d0, 0x003e60ad}}}, + {X: Field{[10]uint32{0x01899c24, 0x03d976d8, 0x032e0fe5, 0x0022e4df, 0x001139b7, 0x0143700c, 0x0241e148, 0x011896f8, 0x03bd4082, 0x000f453f}}, Y: Field{[10]uint32{0x00a1dfb7, 0x03f1d862, 0x02872981, 0x03bf4dd9, 0x02799882, 0x034884e8, 0x01cf16b8, 0x03811d36, 0x00fa477e, 0x002c4299}}}, + {X: Field{[10]uint32{0x02a48930, 0x0057b36e, 0x0246e824, 0x0346a57f, 0x03e7ab3f, 0x0353261e, 0x03bc2700, 0x03065ea2, 0x02df54e0, 0x0031bd4a}}, Y: Field{[10]uint32{0x0056811d, 0x016bf64e, 0x03a8f77e, 0x024cab7a, 0x03b9ef91, 0x0267e912, 0x010281c0, 0x01ced241, 0x006fb538, 0x001d4930}}}, + {X: Field{[10]uint32{0x0144c1aa, 0x01828fb2, 0x00f559fe, 0x03601b46, 0x005f2d1d, 0x031e7070, 0x03c838a4, 0x01f2d9e8, 0x0264bdc4, 0x00240224}}, Y: Field{[10]uint32{0x02ee04de, 0x003ece74, 0x03064eea, 0x032e4779, 0x02ca140b, 0x010c392d, 0x01d582cc, 0x00c899aa, 0x0046d70b, 0x0006258e}}}, + {X: Field{[10]uint32{0x03da0662, 0x03dc247b, 0x006ebc1b, 0x019a5bcf, 0x012db741, 0x03a084a9, 0x035b2d4c, 0x00df0589, 0x00ea478b, 0x00389f09}}, Y: Field{[10]uint32{0x02783de3, 0x01f3c244, 0x03b7d853, 0x036bf0ed, 0x03bb99f4, 0x000c5e46, 0x01532bb5, 0x019f2feb, 0x0279c3a2, 0x0009fb14}}}, + {X: Field{[10]uint32{0x000a3eb2, 0x03bfe131, 0x0092b917, 0x03b98190, 0x032549b8, 0x025574ef, 0x0025d857, 0x035badc0, 0x02129cf1, 0x0032976a}}, Y: Field{[10]uint32{0x027a9811, 0x02109677, 0x01e9ef6a, 0x03c9dee2, 0x037c4aa5, 0x035082d2, 0x027c7c27, 0x01bdf4cf, 0x0105500f, 0x001a0b52}}}, + {X: Field{[10]uint32{0x00877f55, 0x005a67bf, 0x00170487, 0x016d0943, 0x006c98ac, 0x02274509, 0x0223fb5c, 0x031a2119, 0x000f2b2a, 0x00241a7b}}, Y: Field{[10]uint32{0x031fb05e, 0x034e95b9, 0x00266975, 0x02a322e0, 0x02a6c3c3, 0x00901f7f, 0x000617ee, 0x00dc485b, 0x02c4eff8, 0x00331403}}}, + {X: Field{[10]uint32{0x03bda16c, 0x02c4e470, 0x0250fb8c, 0x00f01649, 0x00053639, 0x017a2ae8, 0x02742d3c, 0x03b86dae, 0x02eb0bd5, 0x0017f87f}}, Y: Field{[10]uint32{0x0065a34b, 0x0250ade6, 0x01af53bf, 0x01a90dd7, 0x03ea02ae, 0x001cbddb, 0x025ba068, 0x0193b4d0, 0x032701ac, 0x0036c46c}}}, + {X: Field{[10]uint32{0x001b2c34, 0x019b12ab, 0x00cb8318, 0x00aa1783, 0x026bf260, 0x02439382, 0x0035b6cf, 0x03e20d24, 0x01a5f168, 0x000292a4}}, Y: Field{[10]uint32{0x03837596, 0x02080c1f, 0x00857ce0, 0x02a7023d, 0x02ff7265, 0x00ae262a, 0x02f2ff8e, 0x03b47462, 0x02a8fe36, 0x00016ffb}}}, + {X: Field{[10]uint32{0x02884849, 0x01bdd1be, 0x019e35f0, 0x01bb4f1f, 0x0143f536, 0x03aaaf93, 0x00705054, 0x016d492a, 0x0336f0c3, 0x003d04d7}}, Y: Field{[10]uint32{0x010c526b, 0x03f12c99, 0x0052dd55, 0x00c30ea7, 0x01ba1a5d, 0x00c1d75d, 0x019d0ea4, 0x0301e2d3, 0x03f1b8b6, 0x000719c1}}}, + {X: Field{[10]uint32{0x00380203, 0x00ea7ce5, 0x01e0fdcc, 0x01364ad0, 0x00014a50, 0x020fa12e, 0x03449928, 0x03eebb4a, 0x018a9363, 0x00356a26}}, Y: Field{[10]uint32{0x0260e9fb, 0x026cf6ba, 0x03d4b0bf, 0x02be98aa, 0x032f20c5, 0x0351b35f, 0x038ae7c6, 0x0320162e, 0x03036fdd, 0x0025805a}}}, + {X: Field{[10]uint32{0x03f3d176, 0x022e6f92, 0x01fa8cc3, 0x039e6443, 0x00d50297, 0x0043064e, 0x007fb622, 0x0036f428, 0x023404b3, 0x00220132}}, Y: Field{[10]uint32{0x03d37b0d, 0x02bb79d5, 0x02c9124c, 0x0142c472, 0x01eb65db, 0x00e1c58c, 0x008c55ff, 0x01f18dde, 0x02e57992, 0x0016d92f}}}, + {X: Field{[10]uint32{0x03811021, 0x0176fd8a, 0x00e740ac, 0x01d1f426, 0x010c947c, 0x022f6969, 0x008e78e7, 0x0086daf1, 0x01fc440c, 0x0021a470}}, Y: Field{[10]uint32{0x03b1787e, 0x0122f2b5, 0x01c0903d, 0x00e7d9b0, 0x00682f45, 0x000a9c44, 0x02c330af, 0x00460555, 0x01c535f5, 0x003f63b0}}}, + {X: Field{[10]uint32{0x03093229, 0x01018dfb, 0x001eb58a, 0x02aec3b4, 0x03c3ee5f, 0x0253a4a4, 0x02bfe3f8, 0x038b87f7, 0x01f6343b, 0x001117f0}}, Y: Field{[10]uint32{0x0185b605, 0x001ef6df, 0x010af329, 0x03cd236a, 0x03c3c087, 0x03b7b44e, 0x00aa1b73, 0x03e14f41, 0x03fe6737, 0x00215fc5}}}, + {X: Field{[10]uint32{0x036493b4, 0x03140069, 0x039667d1, 0x01568773, 0x02af1a55, 0x02e23135, 0x023aaf95, 0x0346c2cb, 0x03dea657, 0x00170e5f}}, Y: Field{[10]uint32{0x030aff0a, 0x02681bf7, 0x03d32de7, 0x00b3d21f, 0x03ce5cb5, 0x02a7f153, 0x0336aee6, 0x00f1d4b5, 0x00207b6f, 0x002739d2}}}, + {X: Field{[10]uint32{0x03fc1b7e, 0x00dbe931, 0x030c1d7e, 0x0210dcb4, 0x02d9f535, 0x037f8644, 0x01d2bc5b, 0x0380a0d8, 0x01cb28d7, 0x0026d559}}, Y: Field{[10]uint32{0x03879eea, 0x0266c458, 0x0062d827, 0x01d7662c, 0x01a23af0, 0x038fdb1b, 0x0257f054, 0x02a0c962, 0x028d2de2, 0x001f573e}}}, + {X: Field{[10]uint32{0x01194f1d, 0x015368f2, 0x03b4b896, 0x027c404a, 0x02a5229a, 0x006ec656, 0x031b1657, 0x021c34e5, 0x00631bbf, 0x002bef7b}}, Y: Field{[10]uint32{0x0327e296, 0x030914e3, 0x0316a773, 0x00507d50, 0x0383fe57, 0x02ec2899, 0x0074ad1b, 0x009497e6, 0x0349b949, 0x0033f2e9}}}, + {X: Field{[10]uint32{0x00ad916b, 0x0075a22b, 0x03f4d0e0, 0x0318b12c, 0x03a7cc11, 0x03a7a7b1, 0x03c61605, 0x014d1d72, 0x03cbca3a, 0x001dc4aa}}, Y: Field{[10]uint32{0x024b82fb, 0x023c289a, 0x03ead0c6, 0x03f47ffb, 0x02b57cbb, 0x030ef4cc, 0x02b43af8, 0x009556b4, 0x01bc0eb1, 0x001ee472}}}, + {X: Field{[10]uint32{0x00a2b7e2, 0x00b4e2c7, 0x01c9f07a, 0x00459b9d, 0x0311b43a, 0x037d419a, 0x01fe506f, 0x017904b9, 0x0346f293, 0x000f1148}}, Y: Field{[10]uint32{0x019cd800, 0x00231ffd, 0x026962c6, 0x0228d4ad, 0x010e0203, 0x012047f6, 0x03532f8d, 0x01a0a4eb, 0x01e127f9, 0x003f4fdb}}}, + {X: Field{[10]uint32{0x0248b7be, 0x020b6c2a, 0x030547d1, 0x011377c2, 0x00e04eda, 0x0032652e, 0x01a53d67, 0x0368ff1f, 0x002fb4db, 0x0002f616}}, Y: Field{[10]uint32{0x01285c68, 0x03a318d1, 0x0033ad6d, 0x02de5d9c, 0x00ef0dc4, 0x039f420a, 0x016b282e, 0x01a2ee30, 0x0369c182, 0x001e6789}}}, + {X: Field{[10]uint32{0x02c84112, 0x0339b3ec, 0x0371974d, 0x03ab667a, 0x03befe03, 0x01a44ce3, 0x03fb71c1, 0x0375018a, 0x00a78dd9, 0x00310404}}, Y: Field{[10]uint32{0x02a2ff83, 0x0058b690, 0x0208d29b, 0x001cc50f, 0x00f270f8, 0x0209298f, 0x01c5dbcf, 0x02f088ec, 0x039de71e, 0x00140230}}}, + {X: Field{[10]uint32{0x0121d311, 0x0094f309, 0x01f4a1b6, 0x01777b6d, 0x03f786bc, 0x01426f23, 0x02586a6a, 0x02e89c01, 0x007e6cf4, 0x003a27a0}}, Y: Field{[10]uint32{0x02fea2cc, 0x0366527c, 0x0117aad6, 0x03070264, 0x012228f9, 0x0301000a, 0x039fcfc4, 0x01237a4d, 0x03797c49, 0x002ab7b2}}}, + {X: Field{[10]uint32{0x00b08577, 0x006e43f7, 0x03fdbdca, 0x01ce19bc, 0x0084091f, 0x0048630d, 0x01379195, 0x02fe4190, 0x01b3be2d, 0x000d8f7c}}, Y: Field{[10]uint32{0x01848bae, 0x02f7c3dd, 0x026057e3, 0x01918c26, 0x00f9ea5b, 0x01f9dbc8, 0x0221493f, 0x038db125, 0x004e5634, 0x0002bbf4}}}, + {X: Field{[10]uint32{0x038ea16e, 0x028f22f1, 0x003becd4, 0x00e8d357, 0x03ca8fe3, 0x0173112e, 0x01213228, 0x02093920, 0x023883d2, 0x00172345}}, Y: Field{[10]uint32{0x02c0456f, 0x02baeb86, 0x02685872, 0x037e3cc6, 0x02355347, 0x027dd496, 0x01005914, 0x019b0225, 0x01d9c7ce, 0x003d9be4}}}, + {X: Field{[10]uint32{0x02cbe126, 0x0217a1fa, 0x01ff4080, 0x0162f9d7, 0x024181dd, 0x03649536, 0x037789ee, 0x020fb760, 0x02760835, 0x00042b19}}, Y: Field{[10]uint32{0x0317d22d, 0x015fafae, 0x02a1a01f, 0x02806057, 0x0372e0db, 0x031ac96b, 0x0065acb0, 0x039eec1d, 0x02de23f3, 0x001b4faa}}}, + {X: Field{[10]uint32{0x00153048, 0x029a5ea3, 0x037da8db, 0x003e6d87, 0x02974c4c, 0x00823a8f, 0x01677962, 0x01550111, 0x01ea7bb6, 0x00079e68}}, Y: Field{[10]uint32{0x00787fc4, 0x03bca97c, 0x015dd394, 0x02f8ce81, 0x03e07d35, 0x02a0023a, 0x01874064, 0x012221a2, 0x017920a3, 0x002d8f8f}}}, + {X: Field{[10]uint32{0x03fa9a5b, 0x02f34254, 0x0076a7be, 0x00604759, 0x02116991, 0x0003fc4f, 0x00df2abb, 0x0288fd42, 0x007397b0, 0x0036c347}}, Y: Field{[10]uint32{0x0100dfe8, 0x0278ca12, 0x00dc9d0b, 0x010598a7, 0x032f85fd, 0x02d723bb, 0x01724312, 0x013c7b46, 0x00773ca7, 0x00072742}}}, + {X: Field{[10]uint32{0x03385f27, 0x0280fb72, 0x03622003, 0x008f9883, 0x03969042, 0x00b9dd6f, 0x02bdc229, 0x033a3499, 0x03b3481e, 0x00387f75}}, Y: Field{[10]uint32{0x030a4c77, 0x01019aa5, 0x03e6d09e, 0x024f8840, 0x03d9b31f, 0x00ff71a9, 0x02dee658, 0x00ffdc35, 0x039f2895, 0x000f3eac}}}, + {X: Field{[10]uint32{0x0223ffd3, 0x037c46a8, 0x018803b2, 0x0396fc62, 0x039ed85f, 0x0084c323, 0x02701c92, 0x02ee3cf5, 0x01342b69, 0x00259e5c}}, Y: Field{[10]uint32{0x02631d31, 0x025f91c3, 0x0394e059, 0x031b0255, 0x02632c0d, 0x034a68f9, 0x00b6d93c, 0x01be7df1, 0x003f630b, 0x000b50cd}}}, + {X: Field{[10]uint32{0x01c33efc, 0x020505f6, 0x03ba8cba, 0x01b66a67, 0x00ec0a77, 0x02677520, 0x01d2a0f3, 0x0352531a, 0x02186e27, 0x0037ed00}}, Y: Field{[10]uint32{0x0137796e, 0x01ec4ad7, 0x00f4861f, 0x00705e08, 0x009bd850, 0x02580c14, 0x0245bcb7, 0x00c9cc57, 0x01dce9f9, 0x000ccb64}}}, + {X: Field{[10]uint32{0x027681ec, 0x02e11a30, 0x035e5189, 0x0011fef8, 0x01171de0, 0x017068cc, 0x0208da7b, 0x03729145, 0x01ebed13, 0x001ad971}}, Y: Field{[10]uint32{0x01a34f62, 0x01e723a2, 0x01f43e26, 0x0137d6ee, 0x013e71fc, 0x01bf53e1, 0x0246b51f, 0x02f02cbc, 0x02e8e0ae, 0x0002bf43}}}, + {X: Field{[10]uint32{0x00c4b619, 0x00e43d4a, 0x0100480a, 0x008bf7f3, 0x03021e5c, 0x03509b7c, 0x02396aa5, 0x00e59789, 0x01a160b0, 0x002f070f}}, Y: Field{[10]uint32{0x00a31640, 0x03b5192b, 0x03bc8076, 0x0334d6b2, 0x0386ad94, 0x0108b046, 0x017862c0, 0x03faa42b, 0x017465e4, 0x003f595c}}}, + {X: Field{[10]uint32{0x0005913a, 0x004f7ea3, 0x038e2de6, 0x001b0b1b, 0x01090264, 0x02f161f8, 0x038a6a8c, 0x0328d54f, 0x011796d6, 0x001626c7}}, Y: Field{[10]uint32{0x003fb3e0, 0x00b2eb94, 0x02c87974, 0x01a76917, 0x003c7b64, 0x00eee8a9, 0x039365de, 0x013d1b89, 0x01ecac25, 0x00399575}}}, + {X: Field{[10]uint32{0x00ae4ed5, 0x016fe61e, 0x01677612, 0x033f3a9d, 0x016ada63, 0x024b652f, 0x01c2ef5c, 0x01b0aa53, 0x03856d1e, 0x00279c98}}, Y: Field{[10]uint32{0x00e304dd, 0x03d4d058, 0x01896069, 0x01010f24, 0x030a83bc, 0x0371ea8a, 0x028a48e0, 0x00e3e2d8, 0x01f51e5b, 0x002308e3}}}, + {X: Field{[10]uint32{0x02764263, 0x02d76f71, 0x018d57ea, 0x02bc9548, 0x004f9bd3, 0x00820380, 0x000c551b, 0x03dd3ee9, 0x017814e0, 0x000489a7}}, Y: Field{[10]uint32{0x0385b3d6, 0x017e1938, 0x01a704a9, 0x031f08b7, 0x00daee58, 0x02f45a48, 0x02febcdb, 0x025d7041, 0x00bd6584, 0x0003c3dc}}}, + {X: Field{[10]uint32{0x033088a6, 0x0245ced5, 0x03aa315e, 0x02fc59db, 0x005c73fd, 0x009cfbff, 0x0048cdd6, 0x02405383, 0x032fcc50, 0x0034c84b}}, Y: Field{[10]uint32{0x0032df82, 0x01902112, 0x02fc09db, 0x03aa14fe, 0x00ff59b6, 0x0271a4d3, 0x02618c84, 0x03d47cd8, 0x01f10673, 0x000e6bce}}}, + {X: Field{[10]uint32{0x00250052, 0x01168821, 0x02dccdae, 0x03f67d0a, 0x034ef288, 0x03d92588, 0x0014e724, 0x002eb510, 0x032b9bcc, 0x00314d7d}}, Y: Field{[10]uint32{0x02271022, 0x0171fb92, 0x000a7465, 0x0008a4c0, 0x02884473, 0x01f3a0a6, 0x0014a17f, 0x018c6d8a, 0x005b6fb7, 0x000fde66}}}, + {X: Field{[10]uint32{0x03399605, 0x003eb4e4, 0x03c121c8, 0x004bb035, 0x03271e39, 0x003b437d, 0x002bb186, 0x027e9618, 0x01269b16, 0x0013d6dc}}, Y: Field{[10]uint32{0x01cfd0a7, 0x0104d8f3, 0x00fb5dbe, 0x03c81881, 0x02576f63, 0x025f24ca, 0x002c6cdb, 0x0163aa44, 0x01047f2a, 0x002d83f0}}}, + {X: Field{[10]uint32{0x03d5d065, 0x0323c6ed, 0x03851de9, 0x01f5cde9, 0x000ec70e, 0x0000a705, 0x02c2863e, 0x00e2c6bc, 0x033b244c, 0x0032d166}}, Y: Field{[10]uint32{0x0157fbd0, 0x01d293c6, 0x010ea53a, 0x0055a4b2, 0x02a888bd, 0x03a242ce, 0x02462411, 0x01db20bd, 0x015d3c03, 0x001ed9ec}}}, + {X: Field{[10]uint32{0x0219054e, 0x00a87e93, 0x02597ea7, 0x018f4691, 0x02d389f5, 0x03d0d065, 0x03121bb7, 0x03831463, 0x01c70ebd, 0x001e1f58}}, Y: Field{[10]uint32{0x0272a658, 0x00ef2fab, 0x014ba4b9, 0x02ef5cad, 0x03f42e9e, 0x02cf4542, 0x031cf396, 0x0232e309, 0x02f25fcf, 0x0016ebd5}}}, + {X: Field{[10]uint32{0x01f6115c, 0x00edbaf1, 0x012bacc9, 0x0229808d, 0x02337353, 0x0358e420, 0x037d97cb, 0x02c3252d, 0x002a31d0, 0x0030e2bf}}, Y: Field{[10]uint32{0x03ee529f, 0x0109a210, 0x004690d8, 0x022f4b96, 0x01875e09, 0x01917e35, 0x01a26a4c, 0x03f3092e, 0x03cab138, 0x002e4977}}}, + {X: Field{[10]uint32{0x03406d0a, 0x0321e6bf, 0x0282ad6e, 0x002e2ade, 0x0339a5dd, 0x016e6c97, 0x01c6ad5e, 0x01ba56e7, 0x023b8e60, 0x000dd987}}, Y: Field{[10]uint32{0x03e9b977, 0x02c58e29, 0x002a4df1, 0x00e44c8e, 0x0160d8bc, 0x01b3e510, 0x017e07bd, 0x023f384c, 0x025d430d, 0x002adcd7}}}, + {X: Field{[10]uint32{0x01e256ba, 0x01a28594, 0x02062abd, 0x0367d939, 0x0388ea5a, 0x0370319d, 0x018e9348, 0x00ad1f0f, 0x0051b8c2, 0x0039449e}}, Y: Field{[10]uint32{0x030405c6, 0x01fce1c9, 0x004b3f94, 0x0136e1c1, 0x025b1e7d, 0x0154dffe, 0x034b7dc0, 0x027ade42, 0x037e0034, 0x001611fd}}}, + {X: Field{[10]uint32{0x017382e9, 0x0191ee6b, 0x03b41955, 0x02601482, 0x02127a36, 0x00e03f81, 0x013e7cb7, 0x02a284dc, 0x005da6b8, 0x003cf1fd}}, Y: Field{[10]uint32{0x023e7c87, 0x0397ef7d, 0x00a51ddf, 0x0005c675, 0x034b4693, 0x00024d9d, 0x01decd09, 0x0274c7dc, 0x0211eb1b, 0x000ab3e6}}}, + {X: Field{[10]uint32{0x00d745ba, 0x012cbc21, 0x024de0ff, 0x0254eec3, 0x0279125f, 0x0122a642, 0x03733a18, 0x02c94948, 0x0047e8d5, 0x0021b790}}, Y: Field{[10]uint32{0x01bc969a, 0x0269d19c, 0x02007427, 0x00146a7b, 0x03569211, 0x0177a4b4, 0x0284cf7d, 0x000174ac, 0x00720dac, 0x001c79a9}}}, + {X: Field{[10]uint32{0x03f57504, 0x021d70bc, 0x02c635e2, 0x032b0317, 0x023029d9, 0x03cea85a, 0x020cd963, 0x02759b65, 0x00307225, 0x00318457}}, Y: Field{[10]uint32{0x037a712f, 0x004a1427, 0x0077050d, 0x0004d10f, 0x01ced024, 0x00f20868, 0x017f56c2, 0x0375e35e, 0x00d0b33f, 0x000635a4}}}, + {X: Field{[10]uint32{0x02f53c5b, 0x034d9d10, 0x03c6ac61, 0x03c78afe, 0x018bfae0, 0x01a4a6c1, 0x0038cbd7, 0x011cee46, 0x00998b43, 0x0032d514}}, Y: Field{[10]uint32{0x01572bbf, 0x0236de24, 0x00ddfde3, 0x02e9efed, 0x01c00ba8, 0x026e77d5, 0x03684b4f, 0x013c2335, 0x034d79e3, 0x00104675}}}, + {X: Field{[10]uint32{0x02922d2a, 0x014bca14, 0x013725a7, 0x01cf1b42, 0x020a333b, 0x0182a628, 0x01771e26, 0x00aed3ec, 0x0304b936, 0x00343739}}, Y: Field{[10]uint32{0x02e37e47, 0x028e4565, 0x018ffde5, 0x01529314, 0x02124d3f, 0x016730bb, 0x033891a2, 0x033837c7, 0x03707947, 0x003e4b0e}}}, + {X: Field{[10]uint32{0x016b20a4, 0x02866fc8, 0x03a96249, 0x01679f5c, 0x03d42702, 0x01957314, 0x02ab8570, 0x016618e3, 0x0238e5aa, 0x0036e4f8}}, Y: Field{[10]uint32{0x03bcc7c5, 0x035fad7e, 0x0094c815, 0x025718bf, 0x033ab178, 0x009bbd95, 0x034f60cd, 0x023ad942, 0x008b670e, 0x00234677}}}, + {X: Field{[10]uint32{0x00c3f486, 0x01753bda, 0x01835ba8, 0x03f2efc4, 0x014d6c6c, 0x001e584a, 0x0207e54b, 0x02fbe0a7, 0x037fd8ce, 0x0030e1f0}}, Y: Field{[10]uint32{0x01ddeda9, 0x03f9e384, 0x00897994, 0x0036d896, 0x03c8e3ae, 0x004b5ff9, 0x020f7d7f, 0x02cc01b2, 0x00d9ae7e, 0x00214960}}}, + {X: Field{[10]uint32{0x0206c232, 0x00dd271d, 0x01092f94, 0x03748eb6, 0x024d3b22, 0x024aed2d, 0x0001b5b1, 0x039544df, 0x0134f04d, 0x003aed63}}, Y: Field{[10]uint32{0x01d1ae16, 0x01223f37, 0x0112bc59, 0x00b14272, 0x03d92ae7, 0x0016af26, 0x01d3e829, 0x03e7536c, 0x01059c99, 0x0006e5e7}}}, + {X: Field{[10]uint32{0x02e38e6b, 0x017390a5, 0x038d8252, 0x022befc8, 0x032f1317, 0x00c32b44, 0x01810b17, 0x028a6dd9, 0x0066acfd, 0x001e2473}}, Y: Field{[10]uint32{0x027caaf1, 0x02b3d94d, 0x02db972f, 0x039f6c02, 0x03a21ff6, 0x01fb2bb0, 0x02987ad0, 0x0231b118, 0x03292018, 0x0008864d}}}, + {X: Field{[10]uint32{0x0014d081, 0x014378d6, 0x011f472c, 0x0003028c, 0x000acec8, 0x01e4ff63, 0x02578a53, 0x007a34b0, 0x0142e4bc, 0x00302c09}}, Y: Field{[10]uint32{0x017f8371, 0x0262f06d, 0x01673136, 0x0213afff, 0x0376b1a8, 0x00702465, 0x02e6bb57, 0x005f0006, 0x00710f59, 0x000092f7}}}, + {X: Field{[10]uint32{0x0026d2dd, 0x028dad71, 0x014b2f07, 0x03d13acf, 0x03c2000c, 0x0103a980, 0x02fd9a3e, 0x01141fc4, 0x0174b870, 0x003a8575}}, Y: Field{[10]uint32{0x0230944e, 0x00969462, 0x0124b6ca, 0x01b16269, 0x00c5cdc1, 0x02df8e25, 0x00faf58a, 0x028e7d38, 0x014f4d8c, 0x002d965b}}}, + {X: Field{[10]uint32{0x039604de, 0x006dde73, 0x006726e5, 0x02604d63, 0x02708776, 0x009274d3, 0x00d5726a, 0x01abdee2, 0x03dfc35a, 0x001df4e1}}, Y: Field{[10]uint32{0x008b4a87, 0x0336693c, 0x0324993f, 0x001b7805, 0x01459165, 0x013e8ac7, 0x013c2351, 0x02a58b4b, 0x02cd2d70, 0x003976bb}}}, + {X: Field{[10]uint32{0x01ccd7ec, 0x01aa7727, 0x02db8329, 0x03530c54, 0x031064f9, 0x035bfbee, 0x024dc2f9, 0x0093ef06, 0x02cb7d1a, 0x002a49d0}}, Y: Field{[10]uint32{0x01679f76, 0x0063908c, 0x0225ad9d, 0x018ecf9c, 0x0266d4f1, 0x0208fcf1, 0x0346df60, 0x03c293b0, 0x00f98cda, 0x001996a7}}}, + {X: Field{[10]uint32{0x02316a46, 0x02c417e9, 0x02b6f36c, 0x0368a783, 0x00f62de9, 0x01ed54c1, 0x034053d3, 0x00e4f574, 0x00f79f0c, 0x00094f95}}, Y: Field{[10]uint32{0x027155e0, 0x038cfaf3, 0x03fd7b2a, 0x01fe3f82, 0x0067c857, 0x016c9fbc, 0x029417ac, 0x03b030ca, 0x00cded78, 0x0015385a}}}, + {X: Field{[10]uint32{0x0003fbf2, 0x01173000, 0x004434ee, 0x031eccf6, 0x0255fc01, 0x038e00a6, 0x039586f9, 0x021c8185, 0x00e0e9c3, 0x00344c12}}, Y: Field{[10]uint32{0x00743f37, 0x01d42021, 0x021e3640, 0x0102e6f1, 0x01af2578, 0x02c9470e, 0x00906897, 0x0091de15, 0x02db9450, 0x001f1119}}}, + {X: Field{[10]uint32{0x00a284a2, 0x001194dc, 0x032c88e6, 0x00dca958, 0x02a632b2, 0x02f6f26a, 0x007d0797, 0x008488a2, 0x0110387c, 0x003a48d0}}, Y: Field{[10]uint32{0x036523c4, 0x02c33edb, 0x0363ae80, 0x0147dd03, 0x01839a26, 0x01be63b6, 0x03b3afe6, 0x01486d3f, 0x008c4ca3, 0x000ae62c}}}, + {X: Field{[10]uint32{0x03a29be5, 0x02a76b60, 0x0271332b, 0x007253e2, 0x00742834, 0x02ec95d9, 0x0091a5a7, 0x01e3bdce, 0x03a7ab69, 0x000c0b80}}, Y: Field{[10]uint32{0x0310120b, 0x028be0d5, 0x002eea98, 0x036d9102, 0x030e8430, 0x0395aecf, 0x02e850d2, 0x00d6facb, 0x02db210c, 0x0012af82}}}, + {X: Field{[10]uint32{0x01665368, 0x03345584, 0x008598d7, 0x0370c75a, 0x024fea8b, 0x02c3e31e, 0x020571ee, 0x003cc372, 0x03894440, 0x0014dc04}}, Y: Field{[10]uint32{0x02a97cbe, 0x0069d3fa, 0x02d1971b, 0x036fc5a9, 0x01a712e2, 0x02a68db8, 0x0331bbe5, 0x03c88695, 0x026439c1, 0x00328d15}}}, + {X: Field{[10]uint32{0x028383cd, 0x0254a6bc, 0x00ff4957, 0x0375508f, 0x01656aaa, 0x0168b4e6, 0x012b6f7a, 0x01f2e3eb, 0x0186645d, 0x002303a0}}, Y: Field{[10]uint32{0x0048d27f, 0x035dd5d3, 0x018ffcdc, 0x013b2538, 0x0263c6d2, 0x023eed20, 0x007319d1, 0x0126064c, 0x01ea14c4, 0x000bbc9d}}}, + {X: Field{[10]uint32{0x03ad8af5, 0x010f5e97, 0x0101dafc, 0x004b1a5e, 0x01adddc5, 0x03fe32a6, 0x01615c45, 0x028f2684, 0x003126ba, 0x001929c2}}, Y: Field{[10]uint32{0x02fe29d5, 0x014f9c2a, 0x0342c432, 0x0128a23d, 0x00148efe, 0x02ec5e5a, 0x0245c354, 0x017dab0e, 0x008b59a6, 0x002e90f1}}}, + {X: Field{[10]uint32{0x01438e06, 0x02d1ea97, 0x0268051d, 0x033ed3d5, 0x0363559a, 0x00598917, 0x03785e2e, 0x023892cb, 0x026e82ff, 0x003f6f41}}, Y: Field{[10]uint32{0x02973d63, 0x038aa104, 0x03def144, 0x0356c905, 0x02875731, 0x022e5267, 0x02a5d382, 0x036308dd, 0x01cfa19e, 0x0001836b}}}, + {X: Field{[10]uint32{0x02ad174f, 0x009bd07b, 0x03e0af1b, 0x033cb72c, 0x0282cf15, 0x02518544, 0x01dba01d, 0x001cc467, 0x00b81ff9, 0x002ca1f3}}, Y: Field{[10]uint32{0x0374e090, 0x02f7027e, 0x01bd1acf, 0x02af000e, 0x0236d1be, 0x036d9bb4, 0x038a4635, 0x002fb92c, 0x03397a9a, 0x001bfc54}}}, + {X: Field{[10]uint32{0x01068116, 0x035735ff, 0x02c3c962, 0x015c06f7, 0x033b3f84, 0x02cc0cbe, 0x01f21888, 0x00d293e9, 0x0248b652, 0x0006011e}}, Y: Field{[10]uint32{0x0224574b, 0x01385681, 0x0117b1f3, 0x00244068, 0x01801342, 0x033a95a0, 0x02c54446, 0x0220c8c1, 0x02691819, 0x0004d89d}}}, + {X: Field{[10]uint32{0x0235f914, 0x01f9ea00, 0x02aae0ce, 0x03a56f52, 0x026b74ff, 0x0290784d, 0x022dd328, 0x00b39622, 0x014fbe4e, 0x003c74ed}}, Y: Field{[10]uint32{0x00a3981a, 0x03589dea, 0x0233be86, 0x01965fbf, 0x02c0c211, 0x0212188c, 0x02e1471e, 0x0205fad2, 0x0141300e, 0x000df097}}}, + {X: Field{[10]uint32{0x013bec4a, 0x00e8db61, 0x02a839ce, 0x00db1788, 0x019770da, 0x0042b55b, 0x03509a60, 0x037eadff, 0x01e95046, 0x0026c36a}}, Y: Field{[10]uint32{0x00135faa, 0x01dd40ce, 0x024d96da, 0x006468a4, 0x03df757c, 0x010e0a73, 0x00bbc3ff, 0x0168dba0, 0x034530c2, 0x0009f580}}}, + {X: Field{[10]uint32{0x0099c5cc, 0x03635976, 0x025f9f13, 0x0093cbad, 0x022d3e4d, 0x01c5d5a3, 0x0255d403, 0x03462c2f, 0x03d95155, 0x003420ce}}, Y: Field{[10]uint32{0x024741e8, 0x01cef265, 0x01de13c4, 0x020bb13a, 0x02ffeefb, 0x01b6dc51, 0x03b1e4c5, 0x012ad447, 0x02c3b504, 0x0039426b}}}, + {X: Field{[10]uint32{0x03c37117, 0x00ca788b, 0x038a626c, 0x01885f27, 0x03ed62ad, 0x01e6039a, 0x0201b402, 0x005f90a2, 0x027c185f, 0x00231058}}, Y: Field{[10]uint32{0x023662f7, 0x016dee4e, 0x01ca77d9, 0x01071ccb, 0x02a36da4, 0x020fdcfb, 0x028a1e74, 0x029548df, 0x026c3316, 0x001d7288}}}, + {X: Field{[10]uint32{0x03728d27, 0x018a0ec9, 0x0311e7cc, 0x01b96d42, 0x002d75c2, 0x0284ee5f, 0x007099e9, 0x02a8c173, 0x0105e43a, 0x000dc7c0}}, Y: Field{[10]uint32{0x02b3ce99, 0x00ee031a, 0x0149b029, 0x009b3b7c, 0x01b11944, 0x0114e3ab, 0x00643120, 0x01b5a233, 0x03e7d097, 0x00325a76}}}, + {X: Field{[10]uint32{0x00cb1710, 0x03fef70b, 0x03e03541, 0x020dea3c, 0x02d94aeb, 0x01761930, 0x034d3a18, 0x028d63e2, 0x019a4238, 0x001440bd}}, Y: Field{[10]uint32{0x01ef1445, 0x008824e1, 0x016ce915, 0x030e27a6, 0x010bbffd, 0x035072af, 0x0130606c, 0x00f0fd33, 0x00f9adb6, 0x00278531}}}, + {X: Field{[10]uint32{0x03f08beb, 0x00aea9c7, 0x00cc26df, 0x02bef52a, 0x00a7f57e, 0x00d858bc, 0x00353c78, 0x0100f01e, 0x036cfd40, 0x00032886}}, Y: Field{[10]uint32{0x037f12f9, 0x038f9607, 0x03ffee6a, 0x02085092, 0x03d6b684, 0x0147b6c3, 0x019f2ef7, 0x02956cff, 0x004647eb, 0x0004228f}}}, + {X: Field{[10]uint32{0x01d775d9, 0x0139a28c, 0x007697c9, 0x00b2b310, 0x017ec364, 0x00038f72, 0x0368bc82, 0x034673a0, 0x00b3ff40, 0x00367351}}, Y: Field{[10]uint32{0x005f0901, 0x03257ad2, 0x033cb085, 0x006d6eaf, 0x03fd7c4a, 0x01e7792b, 0x00f71010, 0x03dc0753, 0x036c683e, 0x002dadbe}}}, + {X: Field{[10]uint32{0x01a10360, 0x02f7d105, 0x021e104f, 0x0020ff31, 0x00510da5, 0x006f5241, 0x01644267, 0x01a222ed, 0x00b2cbcb, 0x002684d5}}, Y: Field{[10]uint32{0x034f953a, 0x03a2e0a1, 0x01b9b710, 0x03ce0776, 0x03bc4927, 0x00f8900d, 0x023a2a89, 0x0122d136, 0x0291707c, 0x000fd7d4}}}, + {X: Field{[10]uint32{0x010fdf79, 0x002ae76b, 0x02941bd5, 0x0314e1a4, 0x0220fc60, 0x03ac3f6f, 0x03deb0bc, 0x020712b9, 0x020f271a, 0x00317957}}, Y: Field{[10]uint32{0x01c83a63, 0x001ddbff, 0x000aecb1, 0x01f5c228, 0x0285ed9e, 0x018aba4e, 0x0253e7cc, 0x024c041e, 0x0335eab4, 0x0004e283}}}, + {X: Field{[10]uint32{0x0060f919, 0x0012bb64, 0x012c69a0, 0x01c81667, 0x027c67ea, 0x03317d98, 0x010e4dc6, 0x02f4f48a, 0x03647f66, 0x0017af0b}}, Y: Field{[10]uint32{0x0054659c, 0x0265b582, 0x00f1e56e, 0x0182c432, 0x033ec1e8, 0x014da58d, 0x00f79206, 0x0217889f, 0x03cedf20, 0x001a3df6}}}, + {X: Field{[10]uint32{0x03966e03, 0x0041d733, 0x00b2da42, 0x02074e96, 0x00161d70, 0x029e7258, 0x011a5a79, 0x00374141, 0x039c7d06, 0x0013ca3a}}, Y: Field{[10]uint32{0x0267fafc, 0x03cf8174, 0x02a6c2ef, 0x00f4b3c4, 0x0044849f, 0x028abf9e, 0x02aeb8e4, 0x011d06ec, 0x00610543, 0x003b0de2}}}, + {X: Field{[10]uint32{0x0283fe8f, 0x0056d286, 0x005c0efe, 0x03b95fb2, 0x019fa039, 0x002cd1f2, 0x00c7a9a1, 0x00f82614, 0x00d1ce11, 0x003d4388}}, Y: Field{[10]uint32{0x02e975be, 0x026ff0fe, 0x00aa94db, 0x01e09f55, 0x00cee464, 0x00501fc8, 0x018595f6, 0x01068a08, 0x023190df, 0x00136df0}}}, + {X: Field{[10]uint32{0x03eff5ef, 0x021068ea, 0x01e76ab2, 0x01735092, 0x0079de94, 0x015620af, 0x038cdf2b, 0x02ae5775, 0x02d01ade, 0x003339ac}}, Y: Field{[10]uint32{0x00626e52, 0x0109f94d, 0x02bd5604, 0x02be7e89, 0x01bab1db, 0x0182c6f5, 0x03764bb5, 0x00502bf7, 0x02741312, 0x00075a41}}}, + {X: Field{[10]uint32{0x032d8475, 0x003b5ba7, 0x03bbfbc8, 0x0394b4d2, 0x01e4830b, 0x016bf3b0, 0x00c73121, 0x0155f4bb, 0x0174fb10, 0x00156994}}, Y: Field{[10]uint32{0x038012c0, 0x032245c9, 0x03eec611, 0x03539cd4, 0x023f0623, 0x01524e01, 0x00dd4126, 0x014dea5c, 0x01f1de1e, 0x0031a5e5}}}, + {X: Field{[10]uint32{0x0127f290, 0x03b4a298, 0x00ab0267, 0x0065d965, 0x02d0c1d8, 0x01eb2351, 0x022779e9, 0x02cf71f8, 0x00fa7b4d, 0x001e0887}}, Y: Field{[10]uint32{0x03c46a54, 0x014fa432, 0x00b663ad, 0x0030b8d6, 0x02ace066, 0x03aad594, 0x003a1582, 0x02318922, 0x01edfd8e, 0x00237735}}}, + {X: Field{[10]uint32{0x006ed178, 0x00b5bea6, 0x03f9602b, 0x038a3e4b, 0x009006cc, 0x00041e0b, 0x00da39d6, 0x0390d3b5, 0x0039441e, 0x0026e614}}, Y: Field{[10]uint32{0x02c6cfa4, 0x0397e704, 0x003bb85f, 0x0385cfc0, 0x028a50da, 0x0364e230, 0x03f67d22, 0x01ecade2, 0x01c87b53, 0x003873e1}}}, + {X: Field{[10]uint32{0x037edf20, 0x027c8103, 0x004f38ae, 0x02c0a477, 0x026c27e7, 0x026d9d5e, 0x01b9d78d, 0x0123795f, 0x03b14a9e, 0x0026a8bf}}, Y: Field{[10]uint32{0x037d1040, 0x022dfd8d, 0x00a115ff, 0x03549dcb, 0x018f80d7, 0x0164a54b, 0x00066ef8, 0x03de53f8, 0x03e378e0, 0x001dc71e}}}, + {X: Field{[10]uint32{0x02937e1f, 0x0166a271, 0x02c021e3, 0x0145b603, 0x00949de2, 0x00248a83, 0x00510cb4, 0x02d18c5f, 0x008366a0, 0x00344164}}, Y: Field{[10]uint32{0x02c8630e, 0x0105517e, 0x000ac99c, 0x00bebb1e, 0x020e5e6f, 0x03117836, 0x017155c0, 0x011052a2, 0x0225c9ea, 0x0021014e}}}, + {X: Field{[10]uint32{0x01c5d066, 0x028bfc7e, 0x027c23e7, 0x03671c2e, 0x031ac58a, 0x00aa07df, 0x01c2d810, 0x02612bfb, 0x02cf7456, 0x0007cfb2}}, Y: Field{[10]uint32{0x01a23e54, 0x00d7601c, 0x00d94cd4, 0x018b83e6, 0x0015f1f3, 0x0085a07e, 0x034539ef, 0x0093c5cf, 0x00fa2bfd, 0x0031ab76}}}, + {X: Field{[10]uint32{0x022c4371, 0x03372836, 0x024fe569, 0x001bacd4, 0x035e504d, 0x01b23e51, 0x0151ece8, 0x0032b495, 0x0309a16d, 0x0028c4b1}}, Y: Field{[10]uint32{0x03ae7b03, 0x01e00e6c, 0x039690c7, 0x00a6b1ef, 0x0008c1fc, 0x01ad6ee1, 0x009ea2c6, 0x03176882, 0x002aea04, 0x002197b3}}}, + {X: Field{[10]uint32{0x004197af, 0x03ccbd9d, 0x0169d953, 0x036c405f, 0x008c3493, 0x030bbb4e, 0x00f64109, 0x02e9e3ef, 0x0275e829, 0x003c8711}}, Y: Field{[10]uint32{0x018b2f57, 0x03dd2b42, 0x03ef2b37, 0x01cd20b4, 0x01043d93, 0x028dec0f, 0x030ee061, 0x01f2bd76, 0x033e4337, 0x003f4b19}}}, + {X: Field{[10]uint32{0x00865692, 0x03b5f006, 0x014268fe, 0x00ce9cef, 0x01f48369, 0x02146acc, 0x00b2eb61, 0x02680bef, 0x00ea2a02, 0x0004585d}}, Y: Field{[10]uint32{0x030aaefd, 0x01cb5375, 0x00352ee7, 0x015512d9, 0x0125cf38, 0x01bd7475, 0x03ca2a2d, 0x02b676d7, 0x0027e1ce, 0x000848f4}}}, + {X: Field{[10]uint32{0x03f9d663, 0x00cd7e9c, 0x0260a962, 0x0343d79f, 0x022334fc, 0x015f9cb5, 0x00a21173, 0x0131b3d9, 0x03d0919e, 0x000d639d}}, Y: Field{[10]uint32{0x0037bc08, 0x02dbad9e, 0x020cb8b5, 0x02be821a, 0x03dcf5cd, 0x0222b1f3, 0x03819859, 0x03d00c41, 0x02206f99, 0x001fbe35}}}, + {X: Field{[10]uint32{0x02a33fa9, 0x031b6aae, 0x0060db86, 0x02cea04d, 0x008056de, 0x00597eab, 0x0157e203, 0x03c518e4, 0x020d9e81, 0x001427df}}, Y: Field{[10]uint32{0x00db6ea9, 0x016e34a8, 0x03090a09, 0x017f0eff, 0x03fd1216, 0x00fc6b4e, 0x028645f9, 0x02db139a, 0x021a340e, 0x00154523}}}, + {X: Field{[10]uint32{0x02a4ed09, 0x031f9ab4, 0x020b9ad9, 0x02f50e00, 0x00a15c95, 0x00d1bc87, 0x01e30c49, 0x0038987a, 0x025c185f, 0x000d638c}}, Y: Field{[10]uint32{0x0118c4b8, 0x026d97cb, 0x01b3d97f, 0x02f4d1e2, 0x0154aa11, 0x02cf5861, 0x02ef6903, 0x0056ca04, 0x0074c977, 0x00017f30}}}, + {X: Field{[10]uint32{0x01a2fc4c, 0x00daf8f7, 0x00d2608d, 0x00411e24, 0x02e314c3, 0x00962780, 0x0337e4ea, 0x02bcb4df, 0x012dbc00, 0x0007871c}}, Y: Field{[10]uint32{0x010655dc, 0x02c7da92, 0x00c145bf, 0x01d410b5, 0x03974e7e, 0x034c2ce2, 0x0398cf5a, 0x01aef8d9, 0x039ae313, 0x00012263}}}, + {X: Field{[10]uint32{0x03ffcd1d, 0x025ed5c8, 0x03918bd7, 0x0081cd86, 0x0064e317, 0x0202a564, 0x03b794dc, 0x01e6c3fc, 0x039aaa3f, 0x0029945b}}, Y: Field{[10]uint32{0x0254f5d4, 0x0140c00e, 0x00f9bed5, 0x0373af6f, 0x02812373, 0x01f1f0c4, 0x0377b074, 0x02e0c14f, 0x006b59f3, 0x003164d3}}}, + {X: Field{[10]uint32{0x01098155, 0x00046e2c, 0x01b79295, 0x00cf6966, 0x0150cb56, 0x00c1111a, 0x03ab8240, 0x006e12e7, 0x00d88b1e, 0x00391ad2}}, Y: Field{[10]uint32{0x00c94f51, 0x01e4d96c, 0x00a80a5d, 0x02033654, 0x003e7c8a, 0x0165d0d4, 0x002e5512, 0x0265db8d, 0x02244a33, 0x0010fa6e}}}, + {X: Field{[10]uint32{0x0365aa0b, 0x00cdc34f, 0x03400e58, 0x01000489, 0x00e1cc2d, 0x037e79c5, 0x025105b1, 0x030b8018, 0x009997a9, 0x00329e94}}, Y: Field{[10]uint32{0x02e1f071, 0x007abf99, 0x02039b7a, 0x011334b3, 0x0319c618, 0x03df2c3b, 0x01994fce, 0x03346883, 0x00e4d2ee, 0x00376329}}}, + {X: Field{[10]uint32{0x02313f08, 0x003561a5, 0x02d0da39, 0x027bb007, 0x00848659, 0x01de1b10, 0x01352d4b, 0x015dbc44, 0x02c0d29b, 0x000c9ad7}}, Y: Field{[10]uint32{0x0011d384, 0x020a2a04, 0x0126495e, 0x0280f693, 0x01c2d5d3, 0x0356ca83, 0x02a60633, 0x01952f9e, 0x0171a4ac, 0x003d28fc}}}, + {X: Field{[10]uint32{0x030d306d, 0x024c8a39, 0x03e2b392, 0x03bb944b, 0x017c5bf8, 0x03fa6eb6, 0x017038db, 0x031d6a95, 0x018254f5, 0x0002dd8a}}, Y: Field{[10]uint32{0x003606c5, 0x036cf6c5, 0x016fbf92, 0x01d4e612, 0x020cc85c, 0x035f7a2f, 0x035bb2d0, 0x00fa18b1, 0x039fb36e, 0x0022e023}}}, + {X: Field{[10]uint32{0x032286ca, 0x026886e1, 0x014f5ef7, 0x0295e419, 0x03ae66f1, 0x03c6a046, 0x0250a096, 0x00dbff77, 0x00e12b1d, 0x0022f589}}, Y: Field{[10]uint32{0x011f02df, 0x02e015eb, 0x004d0fe9, 0x02885c15, 0x038bf6a2, 0x01108d2b, 0x0331c747, 0x022586d9, 0x022ef453, 0x0019a1fa}}}, + {X: Field{[10]uint32{0x01de48a9, 0x02349741, 0x03da42d7, 0x00cf555c, 0x01509d1c, 0x03e11b19, 0x01414ccc, 0x024a402f, 0x02c72a9f, 0x003b497a}}, Y: Field{[10]uint32{0x00d89eaa, 0x0287ad40, 0x028b98f3, 0x03407dce, 0x018705a9, 0x020b35ef, 0x011583c6, 0x03f40edb, 0x01ed2710, 0x00155bea}}}, + {X: Field{[10]uint32{0x00bc02bf, 0x012e79c2, 0x000600df, 0x030778a0, 0x000e8fac, 0x01d57ecc, 0x027bc94c, 0x01aa1271, 0x036c9ed7, 0x003c650e}}, Y: Field{[10]uint32{0x002a40a7, 0x023295a2, 0x004b0481, 0x00cb7c7e, 0x03a31562, 0x00b2e1db, 0x00bb6464, 0x01383dab, 0x020885dc, 0x002631ee}}}, + {X: Field{[10]uint32{0x01e9e5d3, 0x01460ca9, 0x02f391d3, 0x0085ab23, 0x03834228, 0x033b6b9e, 0x0024276d, 0x02ae3ec3, 0x03142de3, 0x00316d82}}, Y: Field{[10]uint32{0x02b5cd69, 0x00ab37e7, 0x01260e91, 0x01e381f0, 0x02332595, 0x00535297, 0x01e10d90, 0x039827d5, 0x00da1174, 0x0033a1b9}}}, + {X: Field{[10]uint32{0x013755ab, 0x00b10252, 0x014f592e, 0x000305a3, 0x01c77782, 0x014fe678, 0x019647b2, 0x03f98ccd, 0x038e706c, 0x0002c198}}, Y: Field{[10]uint32{0x0344bbd5, 0x0228e0f2, 0x0369d3e8, 0x01ee1f9f, 0x03e16dd3, 0x027e54d5, 0x02e24933, 0x0148a44d, 0x03ab1b4d, 0x00399007}}}, + {X: Field{[10]uint32{0x024b14cf, 0x00e6df49, 0x03cd89f5, 0x0391a052, 0x03f0ec5f, 0x00cbe958, 0x0250ea54, 0x02b3f4a5, 0x01b5486d, 0x0033be30}}, Y: Field{[10]uint32{0x025a2fcf, 0x01aab046, 0x0166c931, 0x00aac94b, 0x015ed4fd, 0x01875ca0, 0x00939ea7, 0x002f8c00, 0x02c18d0b, 0x00020330}}}, + {X: Field{[10]uint32{0x0385d7ce, 0x011b6892, 0x014f38e5, 0x01009a5d, 0x0162defb, 0x00662c70, 0x00dccac4, 0x03ca857f, 0x004df868, 0x003d85a4}}, Y: Field{[10]uint32{0x038255b3, 0x0098ce9e, 0x023e47f6, 0x00deabab, 0x03de8b4d, 0x01cecc73, 0x03b93e0b, 0x009327c2, 0x00123440, 0x003ee5c4}}}, + {X: Field{[10]uint32{0x018632e3, 0x03d8b0fe, 0x02599a59, 0x0397b602, 0x011613d8, 0x000bfbd3, 0x02516979, 0x0129ecce, 0x0144bc7e, 0x0025ce18}}, Y: Field{[10]uint32{0x00fc16b4, 0x001b4d83, 0x03b6a5a8, 0x0196e9e6, 0x0308e560, 0x010c6bc9, 0x01834a95, 0x0264e4b7, 0x01845842, 0x002f44b5}}}, + {X: Field{[10]uint32{0x030200c8, 0x03390dee, 0x0311b551, 0x03701584, 0x011eb08d, 0x0195ac9e, 0x003a56f6, 0x03e803d0, 0x030c7a70, 0x00251bc4}}, Y: Field{[10]uint32{0x01945b8d, 0x019a5278, 0x0310507a, 0x02529efd, 0x00186d97, 0x02bc15e1, 0x01a923f3, 0x01f981fd, 0x00f6a503, 0x002b35a6}}}, + {X: Field{[10]uint32{0x03929230, 0x0102f730, 0x0287d917, 0x030cd08d, 0x01d5f1af, 0x03034962, 0x038c064f, 0x014ec030, 0x018472c4, 0x003b833c}}, Y: Field{[10]uint32{0x03ff8dc8, 0x01e09927, 0x0191f79c, 0x00a2cdba, 0x008c773c, 0x03289264, 0x014db12f, 0x034e5fa5, 0x035a7fec, 0x003605dd}}}, + {X: Field{[10]uint32{0x01535d7b, 0x018e9ddf, 0x03c21234, 0x0225364e, 0x03ef0072, 0x02ac4a1f, 0x0148b4f4, 0x02961c27, 0x03fe9542, 0x003ccd7d}}, Y: Field{[10]uint32{0x03350283, 0x006140b8, 0x01bf7455, 0x03a69ac6, 0x017639da, 0x023abed3, 0x0389c06d, 0x0174a4d4, 0x01a30246, 0x000cdb92}}}, + {X: Field{[10]uint32{0x017e7739, 0x02c383f2, 0x03f06f0e, 0x01b15675, 0x00b1326d, 0x01daa410, 0x00200d7b, 0x01fe3773, 0x01794fb3, 0x00156fe0}}, Y: Field{[10]uint32{0x03e69bfc, 0x024c28ab, 0x0086632e, 0x0293d274, 0x013053f6, 0x01f5c0fb, 0x002ade6f, 0x017307a4, 0x03007915, 0x00328cf3}}}, + {X: Field{[10]uint32{0x01de29b0, 0x01f5bd8a, 0x0062349b, 0x0004bf83, 0x031033b9, 0x02edb650, 0x022195fa, 0x0369197b, 0x03816143, 0x0037ff33}}, Y: Field{[10]uint32{0x00f0aff7, 0x01d6e71d, 0x0190bbfe, 0x02757f7b, 0x00c04bc3, 0x02178562, 0x029fc06f, 0x012b9f70, 0x03f6e1dc, 0x0026ff7c}}}, + {X: Field{[10]uint32{0x0139dec3, 0x039f608d, 0x0177f3c5, 0x0044ba3d, 0x02c435bc, 0x0155aec4, 0x01c1395b, 0x01be8bf9, 0x009425fc, 0x002e5d23}}, Y: Field{[10]uint32{0x014007a2, 0x032a2a32, 0x016e3dfa, 0x02f18eaa, 0x00f76d31, 0x0354507b, 0x016b2336, 0x0348ed7a, 0x03b2b995, 0x003d48e2}}}, + {X: Field{[10]uint32{0x0297f7ca, 0x00561e2b, 0x039a3fb6, 0x0397e9a8, 0x022c5349, 0x03d4ab66, 0x0329e335, 0x02c55ce3, 0x0054e951, 0x0024b10f}}, Y: Field{[10]uint32{0x012b4a17, 0x02c06558, 0x022bf71b, 0x01e75a29, 0x02bdc4ae, 0x00d92d8a, 0x00924fc6, 0x006f28c2, 0x0373dedd, 0x001f1e9a}}}, + {X: Field{[10]uint32{0x021eb272, 0x02d9ac34, 0x02d96040, 0x03a7d1c9, 0x035677af, 0x01e96248, 0x01ef139d, 0x017957b8, 0x03ea2599, 0x0002c64d}}, Y: Field{[10]uint32{0x03043dd6, 0x024c6033, 0x019195a9, 0x000ea3aa, 0x005585c5, 0x03911253, 0x003e0ca5, 0x031f3f9b, 0x0257544a, 0x00343e56}}}, + {X: Field{[10]uint32{0x0133f457, 0x01b601f0, 0x01fc94a4, 0x01ea3443, 0x00e2a504, 0x00026de2, 0x005a6b72, 0x03892caf, 0x024dbd7e, 0x000b0735}}, Y: Field{[10]uint32{0x020aabe3, 0x01a12dd9, 0x0230cfd8, 0x03ea7a73, 0x027a9449, 0x0179a209, 0x0031a1f0, 0x01e92f9f, 0x03dfce7d, 0x003fa298}}}, + {X: Field{[10]uint32{0x01004834, 0x03d4ff11, 0x014ed447, 0x01a1b321, 0x026d5443, 0x002900f5, 0x0030649b, 0x02a28ada, 0x0278be6e, 0x0013fc42}}, Y: Field{[10]uint32{0x018765d8, 0x00b4a1f9, 0x018bdb36, 0x035ca3d7, 0x01e43384, 0x0138b6c3, 0x001cf5bf, 0x001658ba, 0x00c356d5, 0x002cf2cc}}}, + {X: Field{[10]uint32{0x003d28de, 0x000d563d, 0x0344d9da, 0x0320145c, 0x01f877e8, 0x031c5164, 0x00a7c2a0, 0x01996ad8, 0x03666c90, 0x000cfd56}}, Y: Field{[10]uint32{0x015163f6, 0x0293d90b, 0x01ce08c2, 0x0150e17b, 0x02af1467, 0x024e4c68, 0x020ea80c, 0x017b562b, 0x00ab6aa9, 0x000e6612}}}, + {X: Field{[10]uint32{0x000d3e04, 0x0221eacd, 0x02636020, 0x01b56216, 0x02408da6, 0x03fcb5af, 0x037cc150, 0x00dfac62, 0x03595a72, 0x002e5c48}}, Y: Field{[10]uint32{0x0272363a, 0x01e22cef, 0x00ead817, 0x0223ea1f, 0x02dd125f, 0x031a4c51, 0x03f0ab8f, 0x0316906c, 0x03bd643a, 0x0028a0e8}}}, + {X: Field{[10]uint32{0x00a1035b, 0x0297f058, 0x00dccf0b, 0x02953661, 0x035a4204, 0x03fdcce3, 0x002c1e9f, 0x0250d7d8, 0x00676efa, 0x003483e4}}, Y: Field{[10]uint32{0x03404139, 0x02b9dee3, 0x0086f3fa, 0x01bd9915, 0x01ca1af2, 0x028c545d, 0x004406ce, 0x000fe1c9, 0x007a4520, 0x002b0e8f}}}, + {X: Field{[10]uint32{0x02f41f2d, 0x0252d4ff, 0x02ef54e2, 0x03800fb8, 0x0281d8b3, 0x001cb864, 0x00b2d0bd, 0x027c3511, 0x02a3157c, 0x000c8b5b}}, Y: Field{[10]uint32{0x012936b3, 0x0166d37e, 0x03a97ec3, 0x03dba98a, 0x026e096d, 0x0298e310, 0x02a9e676, 0x00b7799d, 0x03f19dc1, 0x0020e051}}}, + {X: Field{[10]uint32{0x020c26d5, 0x027b67be, 0x024cf8f2, 0x032e52ab, 0x011d2bfa, 0x02b802c3, 0x0164ea7b, 0x0106dadd, 0x00080683, 0x00256497}}, Y: Field{[10]uint32{0x02b92130, 0x01bdfe1d, 0x006d02b4, 0x03f2f749, 0x00edf14c, 0x0081f0bb, 0x015557b2, 0x0088cb09, 0x01b91315, 0x000318fb}}}, + {X: Field{[10]uint32{0x011f70af, 0x03b86f4f, 0x01664c06, 0x00b4f692, 0x03517a71, 0x00e64f35, 0x03fba71e, 0x00637684, 0x02b5d436, 0x001d64aa}}, Y: Field{[10]uint32{0x02eaa410, 0x0274e185, 0x01b457d7, 0x02ba5de8, 0x027a9222, 0x033ea2ac, 0x000aef1c, 0x00a1356b, 0x0077af74, 0x001553ba}}}, + {X: Field{[10]uint32{0x0209e0eb, 0x03669644, 0x03503671, 0x0129814f, 0x00806257, 0x02ce45a0, 0x031ad311, 0x02dc7e18, 0x018be13e, 0x003b674a}}, Y: Field{[10]uint32{0x0185c3cb, 0x02e86e27, 0x02b6fe54, 0x03f35403, 0x017b479e, 0x03d0361f, 0x007caa30, 0x0221b668, 0x03c0dab8, 0x0025ea6a}}}, + {X: Field{[10]uint32{0x02355fad, 0x039250be, 0x01fcb9f8, 0x028bff0e, 0x0378ae69, 0x002351a6, 0x028daf33, 0x002f0ef4, 0x0236a590, 0x00337fbd}}, Y: Field{[10]uint32{0x020db6d7, 0x02039194, 0x02d5179f, 0x0314de3c, 0x02f4f6c7, 0x024581ea, 0x02a1c255, 0x03bd3a91, 0x03cc54c0, 0x003e0ce3}}}, + {X: Field{[10]uint32{0x0149db49, 0x014b9a9e, 0x035848ca, 0x00f5a961, 0x03dbc094, 0x01b67d76, 0x03a8fc42, 0x02f5ab29, 0x03220ca3, 0x003d8e33}}, Y: Field{[10]uint32{0x01675295, 0x02478290, 0x03732f36, 0x009a7f47, 0x01653a79, 0x03565450, 0x03490039, 0x03aade42, 0x03dd8309, 0x0015a899}}}, + {X: Field{[10]uint32{0x0314bd1c, 0x01e8ac63, 0x02e1e638, 0x00eaf250, 0x037a6616, 0x018e482c, 0x0076cab1, 0x010fd40f, 0x02f29b1e, 0x0010d03f}}, Y: Field{[10]uint32{0x032210a0, 0x00af0ae0, 0x01eb6ad6, 0x00562eee, 0x0159ff2f, 0x01bdea77, 0x00908f0b, 0x034d4f1b, 0x002d6889, 0x000b569e}}}, + {X: Field{[10]uint32{0x01b80991, 0x0208bc6a, 0x01a30bf2, 0x025b1bb4, 0x001aa832, 0x03bae09b, 0x012c01fb, 0x036c4c33, 0x028005e3, 0x001e2be1}}, Y: Field{[10]uint32{0x008c3725, 0x0106bd89, 0x02a2a49d, 0x03761881, 0x01ec458c, 0x02e53e0d, 0x000d95b6, 0x033a449a, 0x023637a6, 0x000671f2}}}, + {X: Field{[10]uint32{0x01c41ef4, 0x00ab8472, 0x02d4958a, 0x01e4e2e5, 0x01720642, 0x00ecf558, 0x02831c01, 0x02fbdd52, 0x010fe6a4, 0x00361f96}}, Y: Field{[10]uint32{0x021d1dc6, 0x02d02e6f, 0x016b3e30, 0x0286d422, 0x0353b97a, 0x023b53af, 0x03ff97ff, 0x00d227c7, 0x013ac9b4, 0x000e4a2a}}}, + {X: Field{[10]uint32{0x01c54c32, 0x02a111b7, 0x00a7f630, 0x01a4656e, 0x0285ea85, 0x002e41db, 0x015cfd0a, 0x011fa505, 0x01f369c5, 0x002d6746}}, Y: Field{[10]uint32{0x02661865, 0x03fc2176, 0x00357f81, 0x01fb1129, 0x032d5082, 0x02058b17, 0x0383d552, 0x02af838a, 0x008affe7, 0x002e3d56}}}, + {X: Field{[10]uint32{0x00f3ee78, 0x00f4c318, 0x0143a6d8, 0x02f57abd, 0x03662726, 0x007050ea, 0x02a64cd8, 0x026c000e, 0x03da7cd5, 0x000d3d90}}, Y: Field{[10]uint32{0x00501ee8, 0x001111bd, 0x03b22d52, 0x0078fe91, 0x0291906c, 0x00fb968d, 0x00bd29b0, 0x03d5cd68, 0x00f291a7, 0x001055d3}}}, + {X: Field{[10]uint32{0x033dbbf3, 0x00e57588, 0x01b4ecac, 0x03d5ac17, 0x00fd007b, 0x030c725a, 0x0378757d, 0x027790cf, 0x03d0583e, 0x0015bbcd}}, Y: Field{[10]uint32{0x035c9286, 0x0052e6b7, 0x0229a92c, 0x037ee7a5, 0x02ba8cb5, 0x00ee853a, 0x02e28075, 0x0263e442, 0x001ab5c8, 0x00285038}}}, + {X: Field{[10]uint32{0x01c957d7, 0x037402bb, 0x00fc87e3, 0x01d9e115, 0x02fc54dd, 0x00e97750, 0x039ca5cb, 0x015a2c44, 0x0334815b, 0x0000790f}}, Y: Field{[10]uint32{0x02334cc8, 0x01c93ddf, 0x0302c85d, 0x03eb410c, 0x008e947a, 0x01370af7, 0x0282d9e6, 0x03b881e2, 0x0274ac96, 0x001730e0}}}, + {X: Field{[10]uint32{0x0339a952, 0x00c18bf0, 0x00eabad9, 0x020a63de, 0x01f8b06c, 0x03606df7, 0x029046d3, 0x036df366, 0x024935d2, 0x000339e7}}, Y: Field{[10]uint32{0x004f9686, 0x0282286e, 0x01dc7fff, 0x03d7f701, 0x038765c8, 0x02f0f3d6, 0x018c4943, 0x0189a96b, 0x02ee1b90, 0x003f0bdb}}}, + {X: Field{[10]uint32{0x02fe4fd9, 0x01030c61, 0x00e2c76c, 0x030d2cf7, 0x00f6766c, 0x0068033e, 0x00c3365e, 0x00b099c3, 0x0004ca86, 0x002d0512}}, Y: Field{[10]uint32{0x01b2219c, 0x016e6b54, 0x004b8717, 0x02ad78a8, 0x0029cbda, 0x00e803f5, 0x03752f00, 0x01b8028f, 0x021fca9b, 0x00390da2}}}, + {X: Field{[10]uint32{0x034fd39f, 0x00750887, 0x006a70b7, 0x007b06f1, 0x01541634, 0x03b5274e, 0x039cf65c, 0x03e09239, 0x03247406, 0x003aa8a5}}, Y: Field{[10]uint32{0x017c14a6, 0x0374a2ea, 0x01d46248, 0x033c0e28, 0x02d0d4b6, 0x01788610, 0x00d99328, 0x01730f79, 0x001be3b7, 0x001a39fe}}}, + {X: Field{[10]uint32{0x00f5b6a5, 0x00bb140c, 0x02999e7a, 0x0327d0b1, 0x02eb7371, 0x0372ff1c, 0x00c6caa3, 0x0222f0ee, 0x00ff1f72, 0x00138b44}}, Y: Field{[10]uint32{0x025a8774, 0x020803c2, 0x00f82be8, 0x03d7ad9e, 0x006ba793, 0x03905f40, 0x03515ca3, 0x013ec2a4, 0x005cdf2a, 0x001a368f}}}, + {X: Field{[10]uint32{0x030659f1, 0x02776888, 0x01adce00, 0x025115f0, 0x007d073b, 0x019f0a25, 0x00a4b45c, 0x03b258aa, 0x01e1114d, 0x0020d3c8}}, Y: Field{[10]uint32{0x01adc89c, 0x02b1fec9, 0x00a6ef78, 0x036d8c83, 0x0339263a, 0x001299f0, 0x03acb27d, 0x028280bd, 0x01b6edb5, 0x003a7e98}}}, + {X: Field{[10]uint32{0x00c7d0c7, 0x01c4e78c, 0x00381ece, 0x0367e6f7, 0x01c43cae, 0x034f5a3f, 0x03268d7c, 0x011156a5, 0x00aca0a6, 0x002a12d1}}, Y: Field{[10]uint32{0x03bf6b74, 0x02bc9642, 0x00d6da05, 0x01e4e20b, 0x03d12678, 0x02466bde, 0x03bde43f, 0x000aef4b, 0x033b74e7, 0x000be40f}}}, + {X: Field{[10]uint32{0x001d6789, 0x00d207c9, 0x02cbdd41, 0x01f2ed0c, 0x02600cbe, 0x02783e9b, 0x031df66f, 0x02e5dd1e, 0x020698bc, 0x00084867}}, Y: Field{[10]uint32{0x00954055, 0x0346249c, 0x03736aef, 0x02f8c92e, 0x022e6970, 0x02d74c99, 0x017d9688, 0x0061d2a2, 0x00d3c896, 0x001e90e2}}}, + {X: Field{[10]uint32{0x03aeafd4, 0x01ec8be6, 0x03562686, 0x01260a89, 0x017b9465, 0x013d261e, 0x034bbdbe, 0x0333da22, 0x021f93bf, 0x003e9453}}, Y: Field{[10]uint32{0x00f91b74, 0x03c95f69, 0x0330a478, 0x015b09a9, 0x012c2f61, 0x0324c382, 0x0087b518, 0x00ad2a78, 0x02155257, 0x00333520}}}, + {X: Field{[10]uint32{0x01451ffb, 0x03e80b1e, 0x01ffa4ca, 0x03d4fcbf, 0x012204d4, 0x026f630b, 0x0133a4a9, 0x0267c301, 0x03f16430, 0x002d82be}}, Y: Field{[10]uint32{0x0321294b, 0x03bbe2d2, 0x03f43886, 0x0018fbbc, 0x01d321e0, 0x01af69ba, 0x00b3bd27, 0x02649b35, 0x03901a02, 0x0003fb63}}}, + {X: Field{[10]uint32{0x03ed76cd, 0x02143a29, 0x00defc74, 0x0194e71b, 0x0017c2b7, 0x0151a53a, 0x02fcca65, 0x038d2a1b, 0x01a3196c, 0x003ca73e}}, Y: Field{[10]uint32{0x00c9c5f7, 0x0044a7e2, 0x028f6247, 0x01de6547, 0x00994b29, 0x036d6eb3, 0x03f1bf62, 0x00cf3ecd, 0x023af7c3, 0x00144c21}}}, + {X: Field{[10]uint32{0x01084e4d, 0x02e49d71, 0x014ed563, 0x0128c889, 0x01d8fe31, 0x00f88fc7, 0x03af34b0, 0x02ff1468, 0x023acb00, 0x00273678}}, Y: Field{[10]uint32{0x0298e1d5, 0x01bf1384, 0x0277d4d3, 0x0133e34a, 0x014f31bd, 0x01ecc5c1, 0x01d6c1a1, 0x029c4054, 0x035cc66e, 0x003b3c08}}}, + {X: Field{[10]uint32{0x02e5d65c, 0x00edbd7d, 0x025bff3d, 0x0246acac, 0x0218ed66, 0x0395a8a0, 0x02d99a6b, 0x00122be5, 0x01b02cfa, 0x0015be22}}, Y: Field{[10]uint32{0x001fe4bc, 0x03a81ec9, 0x00d921b7, 0x00a7a832, 0x01bb8ecc, 0x03723f28, 0x034f8248, 0x01cabfd9, 0x00ea4a23, 0x000d4ac8}}}, + {X: Field{[10]uint32{0x01ff2a08, 0x024daad7, 0x03dea16c, 0x039491af, 0x028e2366, 0x00f7bd55, 0x0169a7dd, 0x0363f05b, 0x02b7f8fa, 0x00378caf}}, Y: Field{[10]uint32{0x009e145f, 0x00013509, 0x01acba7c, 0x0332c378, 0x03eaa216, 0x038997ea, 0x002bd06f, 0x0070891b, 0x011c93a7, 0x0035cc7c}}}, + {X: Field{[10]uint32{0x026ba256, 0x0222578a, 0x02693096, 0x00ebe612, 0x037d12dc, 0x03beab36, 0x03dfa58f, 0x00a76300, 0x01c1dc17, 0x00217b1f}}, Y: Field{[10]uint32{0x024a747c, 0x02c2d166, 0x0041b194, 0x03cae86a, 0x0189e4b9, 0x03ee8c77, 0x00c73b5a, 0x02af2fe6, 0x00af8e9a, 0x00148c0e}}}, + {X: Field{[10]uint32{0x01e2e141, 0x02972bd0, 0x014abe23, 0x0038ac9b, 0x02e22328, 0x00b6e2fd, 0x03f5efe4, 0x023b07b5, 0x01956052, 0x003de522}}, Y: Field{[10]uint32{0x00c6ff98, 0x03f2dee0, 0x012fcdd6, 0x01585b37, 0x0258871e, 0x02a35b67, 0x0037e9fd, 0x007e621a, 0x00e296ed, 0x0027dd65}}}, + {X: Field{[10]uint32{0x03454f10, 0x0267383c, 0x00137621, 0x00eb88a3, 0x02866bd5, 0x0006a4ef, 0x036e8eef, 0x022094f5, 0x03d3b420, 0x0016235b}}, Y: Field{[10]uint32{0x002af573, 0x008a92ed, 0x02d2c6d9, 0x0206b437, 0x0206320b, 0x00c6df8c, 0x03f29ade, 0x00822ee8, 0x02533e41, 0x00297f25}}}, + {X: Field{[10]uint32{0x00cc7443, 0x0108f787, 0x0259c0bf, 0x0253a0d1, 0x03b01db2, 0x025d9dde, 0x0387d4e8, 0x03229d5b, 0x008dbbe5, 0x00061bf8}}, Y: Field{[10]uint32{0x03dfbdc0, 0x01be67a6, 0x01bdca25, 0x009a9912, 0x0229f12e, 0x00d7f432, 0x037a93a4, 0x01e080d0, 0x0139a46f, 0x0036677b}}}, + {X: Field{[10]uint32{0x01bd3d25, 0x01b57796, 0x036bb5a0, 0x02600bd5, 0x022af22e, 0x03b84ccd, 0x03eac38c, 0x02afcced, 0x03083055, 0x00395272}}, Y: Field{[10]uint32{0x01332381, 0x000c971f, 0x005fd4fe, 0x0390d2a5, 0x015ababd, 0x03f0d6b9, 0x001c7f7a, 0x00520d99, 0x0320e7b5, 0x00337cdf}}}, + {X: Field{[10]uint32{0x0224422b, 0x024ce240, 0x006e18ac, 0x01e7d4ea, 0x00b930df, 0x03fa12d6, 0x006108fc, 0x01456172, 0x02fbfd7f, 0x0029390a}}, Y: Field{[10]uint32{0x00ce1e30, 0x011e5800, 0x03e2f1ea, 0x0072efa8, 0x00541e55, 0x024575eb, 0x00d6177f, 0x00c40ad6, 0x021b0396, 0x0003a7e3}}}, + {X: Field{[10]uint32{0x0003dadb, 0x03bf72b6, 0x03d4ed09, 0x02a5c667, 0x004755fb, 0x01dd43e9, 0x009e9cfb, 0x00bd09ac, 0x00444202, 0x0017dfb6}}, Y: Field{[10]uint32{0x0376ffad, 0x0386f74a, 0x01addccb, 0x030e6ff3, 0x00e852d9, 0x02425bc7, 0x01592fcc, 0x023ac272, 0x01edd06a, 0x00024757}}}, + {X: Field{[10]uint32{0x02938d66, 0x038603b0, 0x038f1868, 0x03e42be8, 0x0191dcf7, 0x03d9ef45, 0x033fa223, 0x0193842c, 0x034332f0, 0x000feb11}}, Y: Field{[10]uint32{0x02aabe5c, 0x00f69878, 0x019206f9, 0x003e7a99, 0x03eebf27, 0x0045cc2e, 0x006d10ab, 0x00de64ce, 0x02676b20, 0x00115d13}}}, + {X: Field{[10]uint32{0x037a7aa9, 0x0192f7fe, 0x006b190e, 0x003da863, 0x00d4b10e, 0x01f639e1, 0x00d13df9, 0x034850b9, 0x03fff058, 0x0017ee60}}, Y: Field{[10]uint32{0x01dabd6f, 0x003c69a3, 0x018e8346, 0x020629b5, 0x00ec5811, 0x025ccf5d, 0x0373f73a, 0x0103343a, 0x02018dc5, 0x000cce51}}}, + {X: Field{[10]uint32{0x0341f88a, 0x003d79b7, 0x020e043e, 0x0078674f, 0x009c6e94, 0x02c20d99, 0x015eec1a, 0x00e68b6c, 0x01c30fa9, 0x0002ebcd}}, Y: Field{[10]uint32{0x028e9201, 0x004234bd, 0x01966214, 0x011553fb, 0x019de414, 0x00ee2c1a, 0x02bdc3fe, 0x0286f13b, 0x00d3e53f, 0x0010960f}}}, + {X: Field{[10]uint32{0x009a8602, 0x00128160, 0x01f9a0c7, 0x0366b36e, 0x004266c4, 0x00fecf58, 0x0186183a, 0x01ffc3c7, 0x035aa51e, 0x0025d907}}, Y: Field{[10]uint32{0x019517dd, 0x034ca1eb, 0x0239b5b0, 0x03f51676, 0x031ab169, 0x0073e9e3, 0x0182fc90, 0x02f6fb63, 0x0232aa9f, 0x0004d3fe}}}, + {X: Field{[10]uint32{0x0327292e, 0x031ad549, 0x02a5ee23, 0x03286a1d, 0x03f59feb, 0x02f8170d, 0x01aa8fb4, 0x03db716b, 0x011eacda, 0x0025a8dc}}, Y: Field{[10]uint32{0x01da4392, 0x03b34fe9, 0x00e96b82, 0x008d5840, 0x0134be91, 0x01eb5760, 0x01fce0e6, 0x02eded78, 0x03b9681e, 0x0023ec33}}}, + {X: Field{[10]uint32{0x03154b0a, 0x02ab7bd3, 0x01e2a14f, 0x02c0fa75, 0x029f9f16, 0x004d8c82, 0x01388926, 0x0031b4a3, 0x028b8e54, 0x002b9910}}, Y: Field{[10]uint32{0x00118aeb, 0x01e524ff, 0x002e4d5b, 0x03b5bf9b, 0x03cc68ad, 0x003fd679, 0x02d5193b, 0x01cf36e7, 0x025eb9bf, 0x0036c80b}}}, + {X: Field{[10]uint32{0x00c984fb, 0x00a41d5b, 0x0038d422, 0x03feea1d, 0x03e16424, 0x016d210c, 0x03532cf1, 0x030b0452, 0x02df65c0, 0x000b164c}}, Y: Field{[10]uint32{0x03d29130, 0x028b0931, 0x01e47f59, 0x00a0b3ac, 0x011c6436, 0x022e7fd3, 0x015deec3, 0x02815b4e, 0x00c4b908, 0x000587be}}}, + {X: Field{[10]uint32{0x02ecca3e, 0x0123d55e, 0x02071f9c, 0x0276f1a4, 0x02241538, 0x03aff2ff, 0x0252d563, 0x02e9a460, 0x00786937, 0x001db887}}, Y: Field{[10]uint32{0x0133c8e6, 0x0293bf51, 0x02a77a3f, 0x00a235c6, 0x01ca634d, 0x024c27fa, 0x0361d0d4, 0x01f5878e, 0x02fe9db4, 0x00379de1}}}, + {X: Field{[10]uint32{0x0267900f, 0x01c2016c, 0x00a36eaa, 0x018ff259, 0x02099df3, 0x02bf1a91, 0x020b3466, 0x004e3474, 0x00efca8a, 0x001c5c37}}, Y: Field{[10]uint32{0x00c0bb8d, 0x00db5776, 0x0320303b, 0x039188fe, 0x00440562, 0x021c3e3e, 0x0389f7bf, 0x00515663, 0x0139476f, 0x00065aff}}}, + {X: Field{[10]uint32{0x011b6ccd, 0x001f16da, 0x036f2e69, 0x018b8d60, 0x0361a956, 0x0347a27d, 0x01fb466e, 0x034916a8, 0x02b075bd, 0x00263b77}}, Y: Field{[10]uint32{0x030c91be, 0x02a107d5, 0x02814731, 0x0266aca5, 0x00bdbcdc, 0x00228e8b, 0x002ddc21, 0x0092e327, 0x01f6b591, 0x002bcfed}}}, + {X: Field{[10]uint32{0x028e8849, 0x03db6a2e, 0x00e6768b, 0x01383ea6, 0x018dd1c3, 0x0160de70, 0x0236fc5c, 0x0181be97, 0x000659ae, 0x002fd0be}}, Y: Field{[10]uint32{0x0155b8af, 0x039a3e1d, 0x0298f26b, 0x0344873b, 0x00ca74a0, 0x01aeba31, 0x03495782, 0x036e511b, 0x03706e4a, 0x0034d0fe}}}, + {X: Field{[10]uint32{0x0262e1cd, 0x037e5551, 0x038a0d82, 0x0170230c, 0x02c42fd6, 0x018927f0, 0x0075c365, 0x023718a4, 0x00a5891e, 0x00103071}}, Y: Field{[10]uint32{0x00689ec3, 0x02843a73, 0x0303ae5a, 0x009ce815, 0x03f20253, 0x02f304ac, 0x015d8192, 0x03db0dc6, 0x03d0e68e, 0x00199c88}}}, + {X: Field{[10]uint32{0x03883dc1, 0x0044cfa3, 0x03c92b92, 0x00f1524b, 0x03bfd3ef, 0x02828b5b, 0x004cf1b1, 0x00ff920e, 0x03100c8e, 0x00058b74}}, Y: Field{[10]uint32{0x01b5cff0, 0x00f23803, 0x00e21a65, 0x013a1ba8, 0x003d0ebf, 0x03d24387, 0x0197685c, 0x000ae7dc, 0x01d5c82f, 0x0007c8c4}}}, + {X: Field{[10]uint32{0x006331cb, 0x031f9033, 0x03b3dbdf, 0x03f5455e, 0x005d63c4, 0x00227b16, 0x03302e51, 0x02b8f3cf, 0x014689ea, 0x003fc3e0}}, Y: Field{[10]uint32{0x0151bf2e, 0x02d591c1, 0x00c2dac2, 0x037d68ec, 0x02f8814c, 0x01e3476a, 0x02549737, 0x00a78eeb, 0x01b94eb5, 0x0013707f}}}, + {X: Field{[10]uint32{0x0207b78e, 0x028e45d1, 0x02033c3e, 0x010553d2, 0x0314b3e6, 0x0131b66a, 0x0072b224, 0x02d55cbd, 0x0274b011, 0x00050eb9}}, Y: Field{[10]uint32{0x0201c35c, 0x032d084d, 0x0099fdb9, 0x022b8667, 0x03ca2029, 0x0280f7f5, 0x018820c0, 0x03ee8980, 0x01820fae, 0x00054a35}}}, + {X: Field{[10]uint32{0x019009a3, 0x01ec05e3, 0x006f35e1, 0x003b35ae, 0x004115a8, 0x00a5d366, 0x03a0efd3, 0x03517e5b, 0x02288fff, 0x003ceb73}}, Y: Field{[10]uint32{0x0116a20e, 0x001996d2, 0x00ba72d2, 0x0293aaf5, 0x03805580, 0x0252961a, 0x020915e4, 0x026ec1a6, 0x03009632, 0x0008080b}}}, + {X: Field{[10]uint32{0x00d8cccf, 0x001d5631, 0x032f85ad, 0x008bd13e, 0x034904ad, 0x02930891, 0x00e6bc6f, 0x003438b2, 0x0029e273, 0x003489c2}}, Y: Field{[10]uint32{0x0079a3bc, 0x000bd7a2, 0x03a93c63, 0x01eab819, 0x0227c66c, 0x0098b904, 0x009741df, 0x03d9a566, 0x00ac9d5b, 0x003569ad}}}, + {X: Field{[10]uint32{0x012964a6, 0x032b7d0d, 0x0356756e, 0x02299727, 0x01834753, 0x00aecbcf, 0x0057a948, 0x03caa117, 0x02b67d9b, 0x0009b45f}}, Y: Field{[10]uint32{0x02068fb2, 0x01c67078, 0x01c6b7f7, 0x006bf348, 0x00b8703d, 0x02926a9c, 0x03c4a520, 0x030d16f3, 0x03d47d67, 0x002552bc}}}, + {X: Field{[10]uint32{0x03fac74b, 0x01a3c879, 0x024760bf, 0x0264c4d1, 0x0036a52d, 0x017b9f44, 0x011618ce, 0x03226573, 0x038be104, 0x003910df}}, Y: Field{[10]uint32{0x0195cb81, 0x01c36e36, 0x0356e27b, 0x02f6e071, 0x00f9b015, 0x02d5bf23, 0x0020dbe3, 0x01b9b06a, 0x02d5b825, 0x0035b055}}}, + {X: Field{[10]uint32{0x02d3c1d4, 0x011d3be8, 0x02c70851, 0x00700347, 0x01ac5bb5, 0x026d68e7, 0x02b63ed2, 0x0181e598, 0x004e96db, 0x00224cb8}}, Y: Field{[10]uint32{0x03e58541, 0x021d511d, 0x0336ec05, 0x00368ef4, 0x01fc912a, 0x030d5472, 0x03f51668, 0x00897414, 0x037fe030, 0x00150df9}}}, + {X: Field{[10]uint32{0x02617b26, 0x020945c5, 0x01fd0c7c, 0x0390171b, 0x00933ed0, 0x01b20507, 0x02003c73, 0x021b016c, 0x0176465b, 0x003f9dda}}, Y: Field{[10]uint32{0x012aac39, 0x039b6731, 0x002aa472, 0x00f89544, 0x0094364d, 0x01677754, 0x002b0af3, 0x03541b4c, 0x005fd576, 0x002c9e77}}}, + {X: Field{[10]uint32{0x035b45f1, 0x03f24714, 0x0372cb86, 0x00f29ae7, 0x01f69eb7, 0x018ce05f, 0x004ecbe1, 0x02489172, 0x00ffb2a2, 0x001b1829}}, Y: Field{[10]uint32{0x022a0a2c, 0x01734a4a, 0x022231b5, 0x00af48f5, 0x036489af, 0x03e71e14, 0x0301a510, 0x033071c0, 0x026f814b, 0x0009e37b}}}, + {X: Field{[10]uint32{0x009af04d, 0x00791ce7, 0x02a81e12, 0x02d1ba70, 0x03a955be, 0x0327a185, 0x01556c5e, 0x0240aa63, 0x018f625f, 0x000c4cb9}}, Y: Field{[10]uint32{0x01a9e461, 0x02361a51, 0x01006943, 0x01f25171, 0x01cf0a95, 0x011a4131, 0x01b92204, 0x00f17853, 0x0164a244, 0x00296202}}}, + {X: Field{[10]uint32{0x00903f6f, 0x01404b8d, 0x022dc57e, 0x002a77a0, 0x03640e18, 0x0234e161, 0x01003fdc, 0x026fdbae, 0x0236361a, 0x002c173b}}, Y: Field{[10]uint32{0x005c9a5a, 0x0363a095, 0x018c5305, 0x0288c35e, 0x0126fe21, 0x01897617, 0x005ce16d, 0x0268a2dd, 0x00862951, 0x003ed1ce}}}, + {X: Field{[10]uint32{0x02005e83, 0x0017c584, 0x0273903a, 0x01b2af61, 0x0023cd2f, 0x00eab5f3, 0x014e68de, 0x039601e8, 0x020f5659, 0x00388084}}, Y: Field{[10]uint32{0x03ada136, 0x02755783, 0x01544084, 0x02b1f020, 0x02a70e8f, 0x0017eebc, 0x037cb4dc, 0x03e64b64, 0x0305b66a, 0x001264a2}}}, + {X: Field{[10]uint32{0x007a796b, 0x02618cc3, 0x034592f1, 0x0336316c, 0x039a9bf0, 0x01418532, 0x03e68f04, 0x002782c1, 0x01892e54, 0x0015ea47}}, Y: Field{[10]uint32{0x0098e7fc, 0x0307a7e1, 0x0116bbd5, 0x001b1763, 0x021dbf77, 0x0092c464, 0x02612c31, 0x023ea2ea, 0x00ce5901, 0x0011e417}}}, + {X: Field{[10]uint32{0x01a7e8da, 0x014ed929, 0x00ee1dd1, 0x02359d0a, 0x0291c046, 0x00997777, 0x019e7c58, 0x01970835, 0x000a3ba4, 0x003824b1}}, Y: Field{[10]uint32{0x03ffd39b, 0x009bdc56, 0x03042feb, 0x00444d3a, 0x03baa514, 0x00ec25fd, 0x00ab1d31, 0x010920b5, 0x02b4bdfc, 0x0020fd38}}}, + {X: Field{[10]uint32{0x01e0ab38, 0x02980247, 0x02554f78, 0x013fd691, 0x037c1ee8, 0x00cd74f7, 0x001a9c2c, 0x013f1282, 0x006e7baa, 0x001ce8cc}}, Y: Field{[10]uint32{0x01a1f938, 0x03a24f7b, 0x022350bc, 0x0210ebc2, 0x023d93f6, 0x01548646, 0x03a70439, 0x030c9b8d, 0x00f92022, 0x0007da32}}}, + {X: Field{[10]uint32{0x033a4434, 0x03aaef97, 0x0093a6a6, 0x03168e79, 0x03e99883, 0x02850076, 0x0152caf4, 0x012585cd, 0x01f86e90, 0x001f1e9e}}, Y: Field{[10]uint32{0x02e869bb, 0x005fe389, 0x0355415e, 0x0204b0a4, 0x00a26709, 0x002d65b3, 0x008ce8ac, 0x00e4c65b, 0x0252e488, 0x002173ac}}}, + {X: Field{[10]uint32{0x00a37788, 0x028711e1, 0x03918623, 0x021bb6a4, 0x0319f030, 0x0144d95f, 0x03054fae, 0x03ddcacd, 0x0161ce4f, 0x001aa77d}}, Y: Field{[10]uint32{0x01b65280, 0x016d88ff, 0x02db42b2, 0x019c41ba, 0x01fe7198, 0x019847fb, 0x01ba398a, 0x02fd60cc, 0x034ad9b3, 0x002f3c09}}}, + {X: Field{[10]uint32{0x0391c950, 0x02314eff, 0x019eef3f, 0x02d6fc8a, 0x0381934c, 0x034b1abf, 0x0145d2da, 0x02b7fc71, 0x024d47b3, 0x003f9eec}}, Y: Field{[10]uint32{0x02574e7f, 0x03971022, 0x00c5befd, 0x022c12bc, 0x03a88173, 0x0028a4b3, 0x00c27d6f, 0x0188f24c, 0x038609d2, 0x001ff997}}}, + {X: Field{[10]uint32{0x00407d3d, 0x010a41cc, 0x014531da, 0x0192ba05, 0x0382ce2b, 0x01f414d1, 0x00ba60e1, 0x02ddf0a4, 0x02f27944, 0x0009b474}}, Y: Field{[10]uint32{0x00f0f495, 0x00156d2d, 0x0206f4d1, 0x034756a8, 0x0051b768, 0x00d604e1, 0x00b23725, 0x00002c34, 0x00243106, 0x003b0f14}}}, + {X: Field{[10]uint32{0x0273e2b8, 0x03025b63, 0x008060e6, 0x01363c0d, 0x03fb85cf, 0x03a91378, 0x00563ff8, 0x0055cd2b, 0x01f938f9, 0x003c0394}}, Y: Field{[10]uint32{0x022c727b, 0x0259dc68, 0x00c703c5, 0x007484e0, 0x02585408, 0x03f62382, 0x02b6a136, 0x0292474e, 0x03ed3a39, 0x001edeff}}}, + {X: Field{[10]uint32{0x03cfc4d8, 0x004789cd, 0x03b309e0, 0x034538f8, 0x008bd179, 0x01352f2a, 0x02be811a, 0x021d424e, 0x0072f42f, 0x001cf855}}, Y: Field{[10]uint32{0x005b9231, 0x0341827e, 0x01a340b5, 0x01ae12f3, 0x01c53c82, 0x02c02d2a, 0x006426c9, 0x005da044, 0x00ae5832, 0x000e4bbd}}}, + {X: Field{[10]uint32{0x01568092, 0x02bd582a, 0x00333a7f, 0x0123b6be, 0x00d29d23, 0x01e77e39, 0x011d86e4, 0x00119321, 0x03a9aff3, 0x003b5199}}, Y: Field{[10]uint32{0x0149bb0c, 0x0371f98f, 0x002e43da, 0x03699e62, 0x006d9f4f, 0x03fd5df8, 0x01a9ab50, 0x0350b51a, 0x00756892, 0x001dcd9e}}}, + {X: Field{[10]uint32{0x001dde26, 0x02c3bc95, 0x00d74af5, 0x00b1e40d, 0x0351066f, 0x0136ff83, 0x00346a26, 0x0072f773, 0x02ab1081, 0x0035bb05}}, Y: Field{[10]uint32{0x02d0527e, 0x015fa792, 0x0315ef48, 0x0079286d, 0x034763b0, 0x0302e26f, 0x011b7336, 0x02f88a6a, 0x00ab7ac7, 0x002607c7}}}, + {X: Field{[10]uint32{0x034c593f, 0x0292d4ea, 0x008e68dc, 0x03caf47d, 0x033f762e, 0x03b96dc5, 0x001d92d2, 0x00c6b209, 0x007e6919, 0x000a13bd}}, Y: Field{[10]uint32{0x03cf5e82, 0x03150546, 0x013e1c7a, 0x00b8efeb, 0x03b53a4d, 0x03ff86da, 0x03e12887, 0x02f91c20, 0x02e1e6a7, 0x002adce7}}}, + {X: Field{[10]uint32{0x00d505c3, 0x030fe1c2, 0x034f6c6c, 0x02f20d5d, 0x0344b490, 0x0124063b, 0x03ba53ac, 0x01f42bf0, 0x01e75a26, 0x00014c3e}}, Y: Field{[10]uint32{0x0285e3f1, 0x02cef0d3, 0x028d36e2, 0x01c12e22, 0x00bee9fa, 0x03dff7b5, 0x02d7fba8, 0x03a72f3d, 0x001e44e5, 0x0018c312}}}, + {X: Field{[10]uint32{0x02a905f8, 0x0135673a, 0x022bc1ba, 0x0080f126, 0x02ef9c4d, 0x000974b6, 0x037a4b38, 0x00596d9c, 0x00fd81d0, 0x0019aa6d}}, Y: Field{[10]uint32{0x02525e8c, 0x01ec7353, 0x015f121b, 0x032895e5, 0x0112c86b, 0x02574c14, 0x017311c1, 0x03ab65f7, 0x004e6a4d, 0x0009dc31}}}, + {X: Field{[10]uint32{0x03a289be, 0x02484d48, 0x0394f601, 0x02625b76, 0x0139bb78, 0x011d3789, 0x018d7397, 0x01ed926c, 0x027edca4, 0x0009604b}}, Y: Field{[10]uint32{0x0317e2da, 0x031884db, 0x00e5c795, 0x02e2d634, 0x00788d3a, 0x0232e191, 0x0276f7f1, 0x029db9ae, 0x0183072a, 0x0012ee8f}}}, + {X: Field{[10]uint32{0x03b29608, 0x032e9df7, 0x00fd724a, 0x0228d5db, 0x02df1a0e, 0x03efd61f, 0x00f88b58, 0x0091205c, 0x0270af16, 0x000f206f}}, Y: Field{[10]uint32{0x02ee13d4, 0x0357fd0a, 0x0070027b, 0x03eb837a, 0x02ed9dc9, 0x0040ba6e, 0x00b52507, 0x03d201e8, 0x008eda59, 0x002ac5b9}}}, + {X: Field{[10]uint32{0x00d6e39d, 0x0093ddb8, 0x035252fb, 0x02421715, 0x0039626e, 0x0096ab6a, 0x0282c8d1, 0x00a4cfb3, 0x01cda514, 0x002ad89b}}, Y: Field{[10]uint32{0x024abff6, 0x03b7005d, 0x033cfe7e, 0x00f436ad, 0x02bb7be7, 0x0363aff0, 0x031f2a34, 0x012c6f55, 0x034b34fa, 0x0022b75d}}}, + {X: Field{[10]uint32{0x036bd85d, 0x033f82fc, 0x0133de1c, 0x015e638e, 0x03aaaaed, 0x028f8a1c, 0x02d65321, 0x0083fe32, 0x01061207, 0x0011fc94}}, Y: Field{[10]uint32{0x00585b60, 0x02c5be48, 0x03c60c38, 0x004fb342, 0x00cb44e0, 0x025960eb, 0x0374ea3f, 0x004b93b2, 0x032e7295, 0x0003db51}}}, + {X: Field{[10]uint32{0x03c26b1b, 0x0122e7c8, 0x00842361, 0x0099d4b4, 0x00e16409, 0x01c6e2ec, 0x0138d590, 0x023c6cf1, 0x0299f739, 0x001bf4c0}}, Y: Field{[10]uint32{0x026799da, 0x03816eee, 0x03d33372, 0x03c09dfc, 0x017810be, 0x017227fd, 0x02e9c4dc, 0x0388d468, 0x0166a79c, 0x000ee358}}}, + {X: Field{[10]uint32{0x0202e040, 0x026f5992, 0x031e3f44, 0x021f75e1, 0x0149db12, 0x01712827, 0x0051ab74, 0x00735963, 0x007c784e, 0x0003756c}}, Y: Field{[10]uint32{0x028d8659, 0x00c41e35, 0x03857a47, 0x01f36283, 0x036a0459, 0x003fbb66, 0x00ed2a7c, 0x0246e373, 0x018a62a4, 0x002c9b6b}}}, + {X: Field{[10]uint32{0x027fcdad, 0x00ab7c85, 0x016b7dff, 0x0229c02d, 0x0215b61a, 0x01ae12f2, 0x0275e5f1, 0x01089ea8, 0x0036104b, 0x0000f3d6}}, Y: Field{[10]uint32{0x0200c9fb, 0x012792b3, 0x03b5ce9e, 0x0098b6d0, 0x01445af7, 0x02006372, 0x00123408, 0x01e7f7da, 0x025a2cb5, 0x000731bd}}}, + {X: Field{[10]uint32{0x0119bb58, 0x0074a352, 0x03f413e0, 0x01348e15, 0x01d4cd80, 0x01d3010f, 0x02ea163d, 0x0108730e, 0x005508b9, 0x001a0ed5}}, Y: Field{[10]uint32{0x01a11f0a, 0x03f76f9e, 0x022da17c, 0x01a41540, 0x01691e23, 0x004473fb, 0x01d69438, 0x03015a2b, 0x01762cd5, 0x0006ef91}}}, + {X: Field{[10]uint32{0x003b724c, 0x000c9e79, 0x027d2195, 0x03835cf3, 0x03e83ff0, 0x0080ab94, 0x002f7ec4, 0x0103717d, 0x01b7897a, 0x0035e198}}, Y: Field{[10]uint32{0x02d20b21, 0x00aca772, 0x00a02665, 0x03fb43b1, 0x00aeead2, 0x00757ca4, 0x03db82a6, 0x01e3b3f0, 0x01b0e3f4, 0x001194a6}}}, + {X: Field{[10]uint32{0x01e15a21, 0x02954186, 0x0114a1af, 0x01f543b0, 0x0332e89e, 0x013bafc6, 0x00dbb87b, 0x039e5399, 0x0264fc15, 0x00049631}}, Y: Field{[10]uint32{0x001be0b1, 0x00148685, 0x0157194b, 0x025eef08, 0x03028c59, 0x00a83971, 0x011a7dec, 0x00e201c3, 0x029281a7, 0x000c9f12}}}, + {X: Field{[10]uint32{0x02e8be00, 0x033589e1, 0x03bb1a6c, 0x03492fdf, 0x01387f4d, 0x039cc531, 0x0243cdfa, 0x038af71b, 0x03b51cff, 0x003cb413}}, Y: Field{[10]uint32{0x03061c9e, 0x0142a309, 0x02b37932, 0x036b09f3, 0x0178d3a7, 0x021a8ab8, 0x032ee47a, 0x00854a34, 0x038d435f, 0x00226bcf}}}, + {X: Field{[10]uint32{0x030dfb08, 0x0152078f, 0x01f6bb33, 0x02864aa7, 0x03d21551, 0x03bc020e, 0x02cc402d, 0x00eb6394, 0x02c14ab2, 0x002d9eef}}, Y: Field{[10]uint32{0x00a64a23, 0x02cc3e04, 0x01fe6698, 0x004ffb80, 0x003757cc, 0x01961d55, 0x02845285, 0x02264c14, 0x03d19383, 0x0035b29a}}}, + {X: Field{[10]uint32{0x0379235e, 0x0120c48a, 0x0089d90d, 0x02120ea1, 0x008a4665, 0x00b5986e, 0x013ce90f, 0x007f5a81, 0x01b9fa40, 0x0006ebbc}}, Y: Field{[10]uint32{0x031699d7, 0x01492528, 0x01ee8033, 0x031b02d9, 0x01bc1a69, 0x02e9562b, 0x02b3872c, 0x0205f648, 0x0214a2f7, 0x000a2866}}}, + {X: Field{[10]uint32{0x0051aa8e, 0x0043fc6e, 0x03c79c3c, 0x01b394a1, 0x01f58de5, 0x0006eaa1, 0x036a7468, 0x00e922ca, 0x026b2362, 0x001b03c1}}, Y: Field{[10]uint32{0x01ff0868, 0x036ee4c5, 0x033574cc, 0x01e48167, 0x032347a4, 0x007218c9, 0x028bd94e, 0x02c3e394, 0x0256084c, 0x003b20dc}}}, + {X: Field{[10]uint32{0x023619d7, 0x004f767d, 0x01c0d949, 0x035862de, 0x00a0c815, 0x02baf3ca, 0x026d6cb7, 0x02748afa, 0x030965bb, 0x003ef56e}}, Y: Field{[10]uint32{0x0300b924, 0x00b7f28f, 0x01c7e661, 0x018cde8a, 0x0060ccc0, 0x0083cfdb, 0x0298f77e, 0x01796ff8, 0x034d5e60, 0x000cc0d5}}}, + {X: Field{[10]uint32{0x035b1739, 0x01a3e82c, 0x008fe7e5, 0x03ca36b6, 0x020f8bd5, 0x0041af46, 0x02c81ac8, 0x008cd2bd, 0x002ac4b2, 0x00089181}}, Y: Field{[10]uint32{0x02ff6e7c, 0x02af1c16, 0x00f797cd, 0x0208d169, 0x029e5382, 0x007e4b8d, 0x0229bd96, 0x0045bc33, 0x00eb9c10, 0x00076836}}}, + {X: Field{[10]uint32{0x0182bc4a, 0x00b67cd0, 0x00c51563, 0x01b7f4a5, 0x039606cf, 0x010b3d42, 0x01b3caf5, 0x00b4de0d, 0x014f2fff, 0x0011c2a4}}, Y: Field{[10]uint32{0x001d426e, 0x01619800, 0x012dbb3a, 0x001a0738, 0x034398c6, 0x0271aa3a, 0x03e3cc9e, 0x01215a96, 0x01a8d2c7, 0x001ace01}}}, + {X: Field{[10]uint32{0x021b4be0, 0x0009ec0c, 0x00c1ecc8, 0x004540c0, 0x0044bb7a, 0x00fe4274, 0x002153ba, 0x0364cd0a, 0x010bffb6, 0x001380fd}}, Y: Field{[10]uint32{0x008c504c, 0x03db96ac, 0x003e0095, 0x00940c7a, 0x009149b1, 0x0137a32f, 0x03e8f9cb, 0x01c7b3c7, 0x00ae963e, 0x00165b16}}}, + {X: Field{[10]uint32{0x0057455e, 0x02649e3f, 0x003b70d9, 0x02d02860, 0x00188a26, 0x00e7778a, 0x01567e91, 0x02edd864, 0x03eab806, 0x00169b13}}, Y: Field{[10]uint32{0x02e6ce49, 0x0269f5e0, 0x014590d5, 0x0310bd54, 0x03353d73, 0x01c6397d, 0x00ea476a, 0x00d9af0a, 0x007c6505, 0x001ba074}}}, + {X: Field{[10]uint32{0x0329bd5f, 0x01b70de6, 0x016c3a24, 0x027406f9, 0x0174f4e0, 0x03d8f753, 0x000bb1be, 0x014b884a, 0x01b29adf, 0x003b5cf2}}, Y: Field{[10]uint32{0x0113828b, 0x0321ecfe, 0x0216159d, 0x027cb7d8, 0x02e272ad, 0x0312df14, 0x011fa5b7, 0x0382b31f, 0x03b619eb, 0x0003a645}}}, + {X: Field{[10]uint32{0x001c04bd, 0x024eda70, 0x03a99bdf, 0x01308e1b, 0x03710dd3, 0x000f284f, 0x03106085, 0x03e7b52b, 0x005b38cb, 0x001a3185}}, Y: Field{[10]uint32{0x03edc73a, 0x0235f28f, 0x01e9de92, 0x0348b830, 0x02e7cb74, 0x03d4d6a7, 0x016f884d, 0x027ab140, 0x005e607d, 0x003258d6}}}, + {X: Field{[10]uint32{0x00454126, 0x00e69dec, 0x039b6a84, 0x00481661, 0x0092269a, 0x03d72473, 0x006094c3, 0x005ef077, 0x00639273, 0x0006d946}}, Y: Field{[10]uint32{0x00f5009f, 0x0077007a, 0x03cf9137, 0x00579c51, 0x03c42b19, 0x030c6fc4, 0x001fe920, 0x03426f63, 0x025f8ac3, 0x000c7184}}}, + {X: Field{[10]uint32{0x0209c52c, 0x019b539a, 0x01f0d381, 0x00824283, 0x027229ff, 0x00edc177, 0x02b74f7a, 0x0378f515, 0x00ccdadb, 0x0011564f}}, Y: Field{[10]uint32{0x000bd737, 0x0293aa6f, 0x01866a43, 0x03748361, 0x01e14634, 0x03ba5933, 0x02b9a311, 0x000814f0, 0x017d89fd, 0x0004f599}}}, + {X: Field{[10]uint32{0x03927da5, 0x034fad0d, 0x03960566, 0x0069339d, 0x01e4dd7c, 0x00a30842, 0x0132983d, 0x03e8bf35, 0x006ed6f2, 0x00050270}}, Y: Field{[10]uint32{0x020984e4, 0x0372b451, 0x0062390e, 0x00114def, 0x02fbeda3, 0x01a52dc7, 0x0369836e, 0x03f6eb8e, 0x018d4206, 0x0037017e}}}, + {X: Field{[10]uint32{0x005f4580, 0x03c0373a, 0x037074e2, 0x03213adc, 0x025d6e5c, 0x0109bfaf, 0x03239215, 0x02c15b50, 0x006bc307, 0x00367823}}, Y: Field{[10]uint32{0x012c632d, 0x01692d8a, 0x034f915d, 0x03908060, 0x01172f4d, 0x028c9817, 0x02b52add, 0x01e90e8e, 0x0247c6b4, 0x00288f05}}}, + {X: Field{[10]uint32{0x0162fb32, 0x00576eaf, 0x028ee1aa, 0x022eef57, 0x025ac0f1, 0x01357e89, 0x033a9166, 0x02dadcd4, 0x01f3d3c2, 0x001f7cc6}}, Y: Field{[10]uint32{0x03c9f8c0, 0x036d634a, 0x030b79c3, 0x026ea46b, 0x00a9bd16, 0x00778205, 0x02d8d963, 0x02ee6075, 0x02afe023, 0x0024483d}}}, + {X: Field{[10]uint32{0x0186d7a5, 0x01cd115a, 0x037110a3, 0x01126eb4, 0x0011d742, 0x008595e6, 0x0146232e, 0x03f47e4c, 0x018738b9, 0x0006a539}}, Y: Field{[10]uint32{0x03e4352e, 0x00810a2a, 0x0365a748, 0x0126b619, 0x020fc325, 0x025fcb6c, 0x034604b1, 0x039eb83e, 0x03b317ee, 0x000cca89}}}, + {X: Field{[10]uint32{0x03619a47, 0x01e07e46, 0x03691fa0, 0x0106257f, 0x014aefff, 0x03033e1c, 0x002ef8df, 0x019b6caa, 0x034d6db2, 0x0037e8b2}}, Y: Field{[10]uint32{0x01ad8b19, 0x033f9312, 0x0056e45a, 0x03ddba9c, 0x01d2a1a0, 0x032e98be, 0x0320fef4, 0x029b0633, 0x03ab3a28, 0x00317976}}}, + {X: Field{[10]uint32{0x02876730, 0x03931e4e, 0x0017bf35, 0x03af0429, 0x03acf4e2, 0x029b814e, 0x002c1352, 0x03ddad7a, 0x0007be6b, 0x00308804}}, Y: Field{[10]uint32{0x03efa581, 0x0345377e, 0x02be70c8, 0x03a24346, 0x039a735d, 0x030e1cd0, 0x0397c159, 0x0135d0eb, 0x02ecb9ae, 0x00249022}}}, + {X: Field{[10]uint32{0x03d7edc3, 0x020a1686, 0x0015e33e, 0x0253be8e, 0x022f25c7, 0x019cc1d0, 0x00d4d852, 0x01fc3e74, 0x02d2ab08, 0x0035158c}}, Y: Field{[10]uint32{0x015ff44f, 0x00f5bbe3, 0x02569554, 0x016369ee, 0x01814e72, 0x032792c7, 0x039e99f9, 0x013ea091, 0x0297c499, 0x002df38d}}}, + {X: Field{[10]uint32{0x035df93f, 0x000edc73, 0x00dedc90, 0x02e3dadf, 0x02df6c25, 0x008e85c6, 0x01f34ca9, 0x024ad221, 0x022bcdc2, 0x00233bcd}}, Y: Field{[10]uint32{0x009aaf5e, 0x02061b74, 0x02bdf260, 0x00ed76ad, 0x02d702e1, 0x03507666, 0x024f1c19, 0x01fe8afe, 0x0334ed8b, 0x002ce443}}}, + {X: Field{[10]uint32{0x00bf9838, 0x01d60ecf, 0x01bfc7f1, 0x03956565, 0x013a415a, 0x006121e3, 0x01604318, 0x00a0c45f, 0x03e1874c, 0x00091fde}}, Y: Field{[10]uint32{0x01f30eb8, 0x029f323c, 0x004642f8, 0x03a37cce, 0x01efd513, 0x017d9424, 0x01521da6, 0x02d3f03e, 0x01e6a779, 0x0024388d}}}, + {X: Field{[10]uint32{0x001cf568, 0x0122b626, 0x02c56b01, 0x01238daa, 0x02f26093, 0x032a8ae0, 0x01dd0b0a, 0x00eb7d04, 0x02f1c870, 0x002e3033}}, Y: Field{[10]uint32{0x01275f14, 0x011cab80, 0x03916a33, 0x02915303, 0x0345e7aa, 0x03526a5e, 0x00e74a81, 0x026a852e, 0x00114701, 0x00281065}}}, + {X: Field{[10]uint32{0x0208cf09, 0x006f61a0, 0x012c0ab5, 0x0036ab5e, 0x030a35ab, 0x03746f45, 0x026b43a4, 0x031e44aa, 0x036e06e1, 0x0023955d}}, Y: Field{[10]uint32{0x00822d56, 0x029eb61c, 0x01c012c8, 0x01fdb6aa, 0x02cec730, 0x03518b9a, 0x02d12bc6, 0x02aefc30, 0x00c3a025, 0x0037f933}}}, + {X: Field{[10]uint32{0x003ad1ad, 0x01611a83, 0x0267c5f0, 0x01c3122d, 0x01db813b, 0x038e4090, 0x0122790d, 0x02609138, 0x02d3fc9d, 0x0003c73d}}, Y: Field{[10]uint32{0x03984799, 0x025a6bf0, 0x026f6c8b, 0x024ec5ce, 0x01750069, 0x02b9ea13, 0x02f1ec77, 0x0346c8d7, 0x02ab3952, 0x00124971}}}, + {X: Field{[10]uint32{0x01b9ea31, 0x0199c2bb, 0x0000a9e5, 0x011f2b2f, 0x03811641, 0x036dd8b0, 0x00495ab9, 0x03b924ad, 0x0388dce5, 0x002d276f}}, Y: Field{[10]uint32{0x03a9ef2a, 0x01eb3ebf, 0x023feb8b, 0x030b7a24, 0x028971f7, 0x034a2291, 0x00d703ef, 0x025f1dd6, 0x0317ab57, 0x00303e4b}}}, + {X: Field{[10]uint32{0x018ca362, 0x0327dd43, 0x02cab9a8, 0x010e7992, 0x00399e26, 0x0097df73, 0x0173c50a, 0x015fb455, 0x02ad257b, 0x0035abf8}}, Y: Field{[10]uint32{0x0135749d, 0x02b1bce3, 0x01b42b47, 0x028d5871, 0x0138d355, 0x018a0ac4, 0x01402491, 0x02d5ac5c, 0x02b86919, 0x00177c8d}}}, + {X: Field{[10]uint32{0x02e8e89f, 0x00480106, 0x0244b53e, 0x0279a112, 0x0345b48a, 0x033b92d2, 0x032a439f, 0x0197e965, 0x00c5f233, 0x002ec0a1}}, Y: Field{[10]uint32{0x02265300, 0x01d8266e, 0x034936ae, 0x0329bc53, 0x0153221d, 0x03b554ca, 0x0018fb2a, 0x0164c9e4, 0x000de09e, 0x001a12f3}}}, + {X: Field{[10]uint32{0x024467ec, 0x00b611f9, 0x037e46e8, 0x009ead69, 0x03c47796, 0x0228105d, 0x00be6219, 0x025a5c6e, 0x03148a40, 0x0015fa55}}, Y: Field{[10]uint32{0x01443f13, 0x01467cb3, 0x00c126bb, 0x03497a15, 0x01fd8e7c, 0x004a94dd, 0x006d3a8f, 0x0096001f, 0x01b114ce, 0x001c52f4}}}, + {X: Field{[10]uint32{0x02713094, 0x0149b647, 0x03757d17, 0x01e3ad8d, 0x01a1e144, 0x03a01148, 0x03ef2a3d, 0x00ed1d48, 0x0360b33c, 0x002c320b}}, Y: Field{[10]uint32{0x02cea63c, 0x02be6528, 0x032eeac1, 0x03596a0a, 0x0123d163, 0x024fdff6, 0x022f70ac, 0x03d4b994, 0x01b9d763, 0x0033f234}}}, + {X: Field{[10]uint32{0x013e1ee3, 0x01292f55, 0x005a35c2, 0x0093fdfe, 0x00667d83, 0x01b663b4, 0x032c185c, 0x0216f564, 0x01704047, 0x000ae9d8}}, Y: Field{[10]uint32{0x02ea35b9, 0x035580fb, 0x03307205, 0x0067cf8b, 0x01e56aef, 0x01545934, 0x03167d6b, 0x00abd581, 0x03907426, 0x00006041}}}, + {X: Field{[10]uint32{0x02d3e88c, 0x0248d71b, 0x00895b5c, 0x02169c8a, 0x0103eb1c, 0x01f83296, 0x01d15c82, 0x02e483ec, 0x0213d508, 0x0016f553}}, Y: Field{[10]uint32{0x020cf0c9, 0x024cebd9, 0x016fc2b1, 0x02b3bcef, 0x02878017, 0x02b1f608, 0x030ab1e4, 0x03864fa9, 0x01fd5607, 0x0035974d}}}, + {X: Field{[10]uint32{0x02a8d09a, 0x037e5dcf, 0x026947cc, 0x017d5993, 0x00a590d6, 0x01b3c84b, 0x03f1664e, 0x03626aca, 0x02d2753b, 0x002c2ef0}}, Y: Field{[10]uint32{0x03993c23, 0x0026f723, 0x0147e47f, 0x01047cd3, 0x02072257, 0x03319c14, 0x00190654, 0x022eae85, 0x02c1a107, 0x002415ed}}}, + {X: Field{[10]uint32{0x013133a8, 0x03a771b3, 0x00459224, 0x00c083a3, 0x01b38b46, 0x0151484a, 0x000fe419, 0x00e2b377, 0x02033cca, 0x00305c04}}, Y: Field{[10]uint32{0x01557e9a, 0x02d8dabd, 0x03b14fb6, 0x02d7afd3, 0x02624f78, 0x01b02185, 0x00071888, 0x01bd9d1b, 0x007b1cfb, 0x00312576}}}, + {X: Field{[10]uint32{0x03a21bda, 0x00c28917, 0x032ea749, 0x037764d4, 0x007c9fa4, 0x03ef0a31, 0x02879617, 0x0127fcc8, 0x020e5f1e, 0x000782f4}}, Y: Field{[10]uint32{0x03dd6177, 0x02385810, 0x01cd5703, 0x02719af8, 0x01b2a586, 0x011cbe84, 0x01a681b2, 0x03c57797, 0x00000e98, 0x000b501d}}}, + {X: Field{[10]uint32{0x017ec15f, 0x006c560c, 0x0388b03a, 0x028ef017, 0x00f39def, 0x0214ce9c, 0x012a9740, 0x019863fc, 0x023fec4c, 0x00173f08}}, Y: Field{[10]uint32{0x03f21411, 0x00cd512b, 0x00cf93da, 0x03ded9c6, 0x01eb4468, 0x031ce2c2, 0x006ec226, 0x01c6798e, 0x03d489e3, 0x001f64a2}}}, + {X: Field{[10]uint32{0x01efa67d, 0x03330b20, 0x00e8801c, 0x033942b0, 0x005da345, 0x02b51ea1, 0x03e514eb, 0x019a3815, 0x020abebd, 0x003d4195}}, Y: Field{[10]uint32{0x020fc7e9, 0x029f4eb2, 0x00d639d9, 0x036056f7, 0x0263111f, 0x01fd9289, 0x03580ad1, 0x02a66af0, 0x03f7c9c2, 0x0038bfc2}}}, + {X: Field{[10]uint32{0x02c54f45, 0x039ef609, 0x02ef8306, 0x02b96fe5, 0x001d00dc, 0x0127405a, 0x0246e4c4, 0x01d21516, 0x0298ec88, 0x0021123f}}, Y: Field{[10]uint32{0x026f0407, 0x03bb6afa, 0x0256a66a, 0x0117da75, 0x0285b200, 0x00d204dd, 0x01a82713, 0x000c88b7, 0x02291750, 0x00343c1c}}}, + {X: Field{[10]uint32{0x03cffc55, 0x01156ea5, 0x004f56bc, 0x00a2a619, 0x002480cf, 0x00a50bcd, 0x015ca713, 0x01f0b8db, 0x017fdb03, 0x003269a1}}, Y: Field{[10]uint32{0x03aa149f, 0x0238d9e3, 0x011c6b79, 0x01d2da33, 0x01f742d9, 0x03b5be5f, 0x00b8326c, 0x023985b0, 0x00b98f67, 0x0029a782}}}, + {X: Field{[10]uint32{0x02c4011d, 0x0319936e, 0x019d503d, 0x01b6391a, 0x03b8fc28, 0x0226ac67, 0x02f7db2d, 0x03acef20, 0x03f5c611, 0x0002d744}}, Y: Field{[10]uint32{0x024b7adc, 0x02022c4c, 0x02bb6259, 0x036271c0, 0x02ef2692, 0x00921f42, 0x012493ff, 0x003f7d6e, 0x02507cdc, 0x0009fac5}}}, + {X: Field{[10]uint32{0x0235ce44, 0x02ecd3b6, 0x02fad75a, 0x01c75fc6, 0x02902184, 0x0230a71b, 0x001b8871, 0x0352b300, 0x01f32e0e, 0x002fe7b1}}, Y: Field{[10]uint32{0x027ef2d1, 0x00dea011, 0x0146bdd8, 0x01a1ce19, 0x00a1734f, 0x01a311e9, 0x01224ed3, 0x010196de, 0x0088892b, 0x0004e119}}}, + {X: Field{[10]uint32{0x02526e19, 0x024ab04e, 0x00f2ed6d, 0x021eb5aa, 0x00893c5a, 0x0329bd6e, 0x011f6bd1, 0x00704ebb, 0x02be4d3b, 0x000b0e04}}, Y: Field{[10]uint32{0x0033aece, 0x02533bcd, 0x03af324a, 0x02b4519a, 0x031b11ed, 0x02cd02f2, 0x03cf877d, 0x014782de, 0x02f145d5, 0x000d9ae0}}}, + {X: Field{[10]uint32{0x0233f572, 0x031721b2, 0x013a6f21, 0x014e362f, 0x019fd172, 0x002289b9, 0x00d0a13c, 0x03db21ff, 0x0328dc8e, 0x001def7b}}, Y: Field{[10]uint32{0x023c3a1b, 0x019fda7a, 0x017ef081, 0x022a0fe5, 0x016977ba, 0x02960294, 0x02c1feca, 0x03526c03, 0x00c7bf3b, 0x003699ac}}}, + {X: Field{[10]uint32{0x0371afe5, 0x03f445a2, 0x02b154ef, 0x0301953b, 0x028693ba, 0x03cd3181, 0x006503e3, 0x021def36, 0x019d3185, 0x002f129e}}, Y: Field{[10]uint32{0x0255569e, 0x03ddd5dc, 0x03e664f7, 0x01af4cc6, 0x03f59abf, 0x00985496, 0x0159c99e, 0x00643a9c, 0x03f899a8, 0x0014ff35}}}, + {X: Field{[10]uint32{0x02fcd040, 0x0170620b, 0x039dce27, 0x01bcb84f, 0x006fccdb, 0x000dd41e, 0x010e4c7d, 0x03381586, 0x0084733d, 0x000c07f6}}, Y: Field{[10]uint32{0x01e25cb6, 0x00b22294, 0x00b735de, 0x00303897, 0x00312c91, 0x012f981f, 0x0035cef6, 0x027d47f6, 0x01d5185b, 0x001e793e}}}, + {X: Field{[10]uint32{0x014adb70, 0x018062a0, 0x032f387b, 0x01df9436, 0x02133f83, 0x00dc6710, 0x00d0bda1, 0x01f95085, 0x029bbe5e, 0x000906d2}}, Y: Field{[10]uint32{0x0010bdb0, 0x019211ed, 0x039593c1, 0x0000922c, 0x03a8ce21, 0x03f30032, 0x036bca27, 0x0348b87d, 0x0008fa4f, 0x00319bb7}}}, + {X: Field{[10]uint32{0x00c79585, 0x028580b6, 0x0098156e, 0x005bcca5, 0x01dcd28c, 0x018cf547, 0x01c1351d, 0x004a24f1, 0x02396819, 0x002f9bc5}}, Y: Field{[10]uint32{0x03afff21, 0x029c797e, 0x0335a5f7, 0x0282950c, 0x021ade5d, 0x03d7f979, 0x038a9668, 0x014e7a9f, 0x027e1a65, 0x001bd9d2}}}, + {X: Field{[10]uint32{0x01d3a283, 0x01f2cc4f, 0x03285e23, 0x02eadff2, 0x01b3f7bf, 0x028b452e, 0x0209ef60, 0x0278a9f8, 0x008f79c6, 0x00322d40}}, Y: Field{[10]uint32{0x03b54bb9, 0x00fb029a, 0x008f52d8, 0x032a98c0, 0x023cea15, 0x01bbf2cd, 0x0036dd74, 0x03df802f, 0x03486c3c, 0x000771e4}}}, + {X: Field{[10]uint32{0x006c0998, 0x029ffd30, 0x027d4eed, 0x02b1df3c, 0x02b038ed, 0x01e5ab47, 0x0197ec3a, 0x03b5893a, 0x039eaad5, 0x0014052b}}, Y: Field{[10]uint32{0x0189dd7d, 0x0221808c, 0x031511a4, 0x014cd25d, 0x01911439, 0x021ed2db, 0x004a77a9, 0x028714b5, 0x006fb8fa, 0x0038075e}}}, + {X: Field{[10]uint32{0x03bb989a, 0x02b76329, 0x02d2b45d, 0x03023620, 0x01b0845e, 0x03ca3f37, 0x02d4f284, 0x0190fb68, 0x01e62c40, 0x001bffbf}}, Y: Field{[10]uint32{0x0011cc0e, 0x01bf9721, 0x004717fb, 0x0201a9bd, 0x01ff0a54, 0x028afb2f, 0x029e4bd9, 0x00ea7888, 0x003c782d, 0x00238ac6}}}, + {X: Field{[10]uint32{0x007d463f, 0x03fc7c52, 0x022904aa, 0x003f07a4, 0x020ad014, 0x02d3030d, 0x02a7e5d0, 0x004dd34c, 0x03bf190e, 0x002b1d8a}}, Y: Field{[10]uint32{0x033adefe, 0x02944f97, 0x02a7e435, 0x0143b606, 0x03bc34d8, 0x036dac4b, 0x001bfec5, 0x01ad028e, 0x03183101, 0x003335e7}}}, + {X: Field{[10]uint32{0x0011cb24, 0x023ab83a, 0x03342796, 0x0337a0a3, 0x03d791a5, 0x01cdec76, 0x03244e7b, 0x0171d424, 0x02d63ec0, 0x0025cd25}}, Y: Field{[10]uint32{0x01647533, 0x01cf99c9, 0x03b7abf5, 0x0194bd5e, 0x03d7420b, 0x030fcd3c, 0x037ff525, 0x00cd47d8, 0x03c0044e, 0x0012cb26}}}, + {X: Field{[10]uint32{0x00a15d32, 0x0266cd21, 0x034291a7, 0x0001be80, 0x02c39ce3, 0x03a8e78d, 0x03577539, 0x02f0c1d0, 0x01665f77, 0x002a7624}}, Y: Field{[10]uint32{0x0380e213, 0x0204ee12, 0x0296b8d0, 0x013f33ea, 0x0056dd88, 0x0018d694, 0x039ce982, 0x02e3f3d3, 0x0217fded, 0x0034270e}}}, + {X: Field{[10]uint32{0x00c5710b, 0x02a68828, 0x02f769ec, 0x01bd835b, 0x02cbab63, 0x009086eb, 0x00a7419f, 0x0151362e, 0x03fdaa2b, 0x000422a3}}, Y: Field{[10]uint32{0x00e0249d, 0x01599735, 0x028d7b12, 0x01ce77cc, 0x01cebbb2, 0x017c38e2, 0x025776a7, 0x02b56289, 0x01fcab04, 0x0002b4fa}}}, + {X: Field{[10]uint32{0x027c5fb5, 0x0316fb5c, 0x00a36de8, 0x02365448, 0x03954387, 0x01791257, 0x000ac6df, 0x00f15eff, 0x017bc884, 0x003be5a7}}, Y: Field{[10]uint32{0x021f16fb, 0x033e170d, 0x0302afc1, 0x014dee02, 0x01d1d4d6, 0x037aab69, 0x005d81a1, 0x0200dac5, 0x03b22673, 0x0016ae06}}}, + {X: Field{[10]uint32{0x03c39b62, 0x028c2590, 0x01162b0b, 0x03c9043d, 0x01d74200, 0x03dc2c91, 0x02dafb28, 0x01514fc4, 0x03c24d50, 0x002ae096}}, Y: Field{[10]uint32{0x01281a1d, 0x032c196c, 0x0194c6f9, 0x02e35155, 0x01708098, 0x01dea072, 0x03e31da2, 0x01105769, 0x01f22377, 0x001e279f}}}, + {X: Field{[10]uint32{0x00bf2622, 0x015aec12, 0x03ac0598, 0x00e664ce, 0x02eeed4e, 0x02125a5c, 0x039198cf, 0x00f00bb1, 0x00e52c17, 0x00126129}}, Y: Field{[10]uint32{0x00c5df3f, 0x033e25eb, 0x034348e7, 0x0090e647, 0x02f199e9, 0x0330f33d, 0x0087a9c2, 0x00b98682, 0x027b79be, 0x001165ad}}}, + {X: Field{[10]uint32{0x025f7272, 0x01284c98, 0x02fbccfa, 0x01a88fcf, 0x004bf0f7, 0x02a9f2c9, 0x0360d0d8, 0x02f84fd3, 0x03f493c1, 0x000a171b}}, Y: Field{[10]uint32{0x03ed49d3, 0x01ecf674, 0x03c1212d, 0x0397a289, 0x03c4caac, 0x0276e6c8, 0x00fd9984, 0x03bca357, 0x01a5cf9c, 0x000e77fa}}}, + {X: Field{[10]uint32{0x003db340, 0x02dc23e1, 0x02c7b348, 0x001b09e2, 0x019bc6e5, 0x00c402aa, 0x02667171, 0x0065c7a4, 0x01d17e72, 0x0007852c}}, Y: Field{[10]uint32{0x00e41cee, 0x0017c113, 0x02a1164d, 0x03f17de7, 0x00394d7d, 0x0135050f, 0x03fe464c, 0x03d89cd1, 0x039dd705, 0x00018e88}}}, + {X: Field{[10]uint32{0x0217c8aa, 0x0102ed6f, 0x018fc101, 0x030133cc, 0x033b1394, 0x03352161, 0x01dcf309, 0x03347bd8, 0x03b9ed71, 0x0002e3dc}}, Y: Field{[10]uint32{0x036f665c, 0x0041f99d, 0x02ec5827, 0x01a96b10, 0x01074567, 0x006f997b, 0x034823aa, 0x03b214bf, 0x02e0bd66, 0x0022bd76}}}, + {X: Field{[10]uint32{0x0314540a, 0x012fdba1, 0x01d15e62, 0x034c7352, 0x0049c995, 0x03456bf4, 0x02367760, 0x03f3db2d, 0x0297e878, 0x001f831c}}, Y: Field{[10]uint32{0x02ddd658, 0x02bc3f6b, 0x000e58aa, 0x00c0280a, 0x00ffd595, 0x02c9c680, 0x00b7568b, 0x00810fd2, 0x01f74c51, 0x0037d5e5}}}, + {X: Field{[10]uint32{0x03798545, 0x03f409da, 0x02cbade5, 0x0046dd52, 0x00109990, 0x03377f92, 0x0351133f, 0x03b67e8a, 0x011d465b, 0x00027c3b}}, Y: Field{[10]uint32{0x00a8459f, 0x02666405, 0x016e9217, 0x00e398c9, 0x01d85b6c, 0x00aaa676, 0x03adde01, 0x00380192, 0x009c73bb, 0x001c017b}}}, + {X: Field{[10]uint32{0x008e12bf, 0x02946aa7, 0x01b125a0, 0x0002c78d, 0x03cc8e40, 0x00388f3b, 0x020608d8, 0x016bc005, 0x035e0b5c, 0x000b555b}}, Y: Field{[10]uint32{0x01f12000, 0x0108b285, 0x038a94e4, 0x0223e02a, 0x01d24d44, 0x03f61bd0, 0x007f6fc1, 0x00eebc77, 0x014425bc, 0x0001d800}}}, + {X: Field{[10]uint32{0x035ed3f2, 0x0206f320, 0x0128ee8d, 0x03950526, 0x012cc14c, 0x0271f730, 0x0079524d, 0x0380b02d, 0x027d7637, 0x000985d9}}, Y: Field{[10]uint32{0x0380884b, 0x02b90651, 0x019babc6, 0x005806ca, 0x017a2c4e, 0x01e3298e, 0x01496be4, 0x0027ae3d, 0x03ba2cd8, 0x0014855c}}}, + {X: Field{[10]uint32{0x019aac10, 0x02c187c3, 0x02492ba1, 0x033fb416, 0x034cae40, 0x020428fc, 0x036e10f8, 0x026991ed, 0x016c5b51, 0x001891e4}}, Y: Field{[10]uint32{0x02e7f098, 0x00cc09bb, 0x034caf2d, 0x01a70fa7, 0x00602b09, 0x00036875, 0x02a193c5, 0x02a5e241, 0x0170535b, 0x003ff409}}}, + {X: Field{[10]uint32{0x023c52af, 0x017533e6, 0x03db4fa5, 0x012a544d, 0x01ea14c6, 0x03b3b3ee, 0x0017e780, 0x002a2180, 0x03e08ed5, 0x003102c9}}, Y: Field{[10]uint32{0x007b6493, 0x03c6b378, 0x0001ba86, 0x02e0c3aa, 0x00c4149f, 0x00416a95, 0x01d1e977, 0x016e13f6, 0x038c7d02, 0x00090572}}}, + {X: Field{[10]uint32{0x03e0de12, 0x0195e340, 0x029748b6, 0x02afc199, 0x03ad7103, 0x03aea713, 0x01bf17bc, 0x0295bf34, 0x008a54a3, 0x002e96bb}}, Y: Field{[10]uint32{0x0157ffbd, 0x03562c1b, 0x0370dc49, 0x0180e7e6, 0x00a705de, 0x03a96e98, 0x03474d28, 0x0312fcf1, 0x0311abec, 0x000d236a}}}, + {X: Field{[10]uint32{0x00076268, 0x00089225, 0x03f675c0, 0x00139571, 0x02c1e9e5, 0x03ecfcc6, 0x031262cf, 0x00a5384c, 0x0258f8dd, 0x002e8539}}, Y: Field{[10]uint32{0x001aa1dd, 0x01b792b2, 0x023659b9, 0x038e8c9b, 0x00c221b0, 0x01b76684, 0x00cb36c6, 0x03957b1c, 0x0105fc43, 0x0033b5d2}}}, + {X: Field{[10]uint32{0x03f4aff4, 0x037e85a9, 0x022d4cfb, 0x00382870, 0x00f9c1d0, 0x004e6acc, 0x02718cb4, 0x031fe8a7, 0x03698880, 0x000cdd6b}}, Y: Field{[10]uint32{0x02295a27, 0x0399fbb3, 0x01726ddd, 0x01e73957, 0x028d27db, 0x0389b1a3, 0x02fa0b85, 0x0396c6d9, 0x0091a83b, 0x0033ea2d}}}, + {X: Field{[10]uint32{0x019f01fe, 0x0252a92f, 0x002d5efc, 0x038bdf54, 0x035b9a8e, 0x0312c9db, 0x03a109a2, 0x03f7eba7, 0x014b306c, 0x001a3498}}, Y: Field{[10]uint32{0x0348550e, 0x00e1b217, 0x008f3661, 0x01221023, 0x01ef9e1d, 0x03503ed6, 0x01f54e84, 0x0197b5f7, 0x02bcf043, 0x0005230d}}}, + {X: Field{[10]uint32{0x00533edd, 0x011edfc7, 0x0277b7fc, 0x01ac1b0d, 0x03900ece, 0x0358ce1e, 0x02990d71, 0x000ec2b4, 0x02a55977, 0x0024feb3}}, Y: Field{[10]uint32{0x002ad5f4, 0x011e5f25, 0x03179745, 0x011363b9, 0x01c20bbe, 0x02687db0, 0x00199853, 0x0053a2d7, 0x03fa8fa1, 0x000f2006}}}, + {X: Field{[10]uint32{0x01054277, 0x01b09d5d, 0x005d6eef, 0x03c5b288, 0x025a0a61, 0x01b242ca, 0x0375ae17, 0x00c46255, 0x00a672f7, 0x003c4775}}, Y: Field{[10]uint32{0x01556ef6, 0x026d5a2e, 0x020e83f5, 0x01154782, 0x006c307d, 0x03063434, 0x022083ca, 0x02b03dfa, 0x016d2ef2, 0x002f01a8}}}, + {X: Field{[10]uint32{0x024204f7, 0x0328e721, 0x00010f10, 0x02165c97, 0x000b71fe, 0x020f2001, 0x029a94ef, 0x029153f4, 0x005d710b, 0x0010baf3}}, Y: Field{[10]uint32{0x025f223b, 0x001934b5, 0x00e40279, 0x01f371a6, 0x00e633c1, 0x01c7419f, 0x03d5cdb2, 0x0007b531, 0x00eb6431, 0x003e2aa1}}}, + {X: Field{[10]uint32{0x01c80e52, 0x0278f861, 0x03b2e67e, 0x03684fc7, 0x00549e96, 0x02274668, 0x03b6fbce, 0x016a5021, 0x03dcd96d, 0x0035021d}}, Y: Field{[10]uint32{0x02789444, 0x0388d317, 0x0087c837, 0x001bd764, 0x02c0be83, 0x03f00510, 0x017b59af, 0x003f2e39, 0x01b385f2, 0x002fa6ee}}}, + {X: Field{[10]uint32{0x0162931f, 0x01d0d609, 0x03e398fa, 0x02eeae35, 0x03aa40c1, 0x00e49029, 0x00ec9342, 0x0042ae22, 0x0098cd21, 0x003062cb}}, Y: Field{[10]uint32{0x015773f8, 0x00b3a5c5, 0x001cb24c, 0x02724df0, 0x03b83f18, 0x0019b102, 0x01f18cd1, 0x035d31d7, 0x00349147, 0x00365884}}}, + {X: Field{[10]uint32{0x005c0bd1, 0x03e238f8, 0x039e4d14, 0x01631923, 0x036fe946, 0x02ed37af, 0x034fa0c4, 0x03e10473, 0x03221a44, 0x0005535a}}, Y: Field{[10]uint32{0x0075559a, 0x014a9656, 0x01976de5, 0x03cfaf15, 0x037c1074, 0x0365398f, 0x00bbb6ad, 0x00ccbcca, 0x0307c705, 0x0037c2f0}}}, + {X: Field{[10]uint32{0x01a26f15, 0x009a8d78, 0x006e0a93, 0x01670eae, 0x0024485d, 0x02610b6f, 0x017d2285, 0x024ec68e, 0x01e5629f, 0x0028e096}}, Y: Field{[10]uint32{0x01f783fb, 0x02ee7aa4, 0x01892367, 0x013fd0d7, 0x00171327, 0x0229e6e3, 0x0074932e, 0x00a98ece, 0x00cc2fe5, 0x001a6d6b}}}, + {X: Field{[10]uint32{0x023fcd19, 0x02ca8f1d, 0x02013d4d, 0x00a5be08, 0x00148270, 0x03bb7b46, 0x025a7d52, 0x00d24e64, 0x02eee91e, 0x00275ca7}}, Y: Field{[10]uint32{0x03e89a1f, 0x02a8bc38, 0x00339657, 0x027938cc, 0x009cadc0, 0x0361d3ec, 0x02f731f2, 0x02188459, 0x015403cc, 0x001b60c8}}}, + {X: Field{[10]uint32{0x03751e3a, 0x01c06cd9, 0x00b39b25, 0x024e283e, 0x0346398c, 0x0112a7e6, 0x02cede79, 0x01f1f95d, 0x00088630, 0x00099d3c}}, Y: Field{[10]uint32{0x013f83cf, 0x0199ae06, 0x02fa212a, 0x031ea748, 0x02e31bde, 0x02c3c7d3, 0x03638d07, 0x0347be0d, 0x03426ac9, 0x0000fa7a}}}, + {X: Field{[10]uint32{0x02237f41, 0x03cd1453, 0x002c2743, 0x00b1bdc3, 0x03b7c164, 0x02d89b03, 0x028e9fdb, 0x02e15b74, 0x015eadb1, 0x002ca81b}}, Y: Field{[10]uint32{0x03f664d3, 0x033ab58e, 0x01f5ff3b, 0x02613401, 0x03de579a, 0x0206b582, 0x03baed44, 0x02c9a089, 0x038b8673, 0x0017532b}}}, + {X: Field{[10]uint32{0x022d713d, 0x03c8f848, 0x03a60f0b, 0x003c5056, 0x012b278c, 0x00103c17, 0x03e4ec92, 0x03af73b0, 0x0164d61d, 0x00082c9f}}, Y: Field{[10]uint32{0x00e516a3, 0x0111ede9, 0x03ffb41e, 0x0026eceb, 0x02c8c5c8, 0x00159d43, 0x01264886, 0x00b7cd73, 0x01e7ff5c, 0x00120761}}}, + {X: Field{[10]uint32{0x00e3f2e5, 0x0335714f, 0x0051bfc7, 0x003d169f, 0x03527093, 0x0031547d, 0x00d7c152, 0x02a897d8, 0x010c450e, 0x0013d298}}, Y: Field{[10]uint32{0x0247f328, 0x00bf640e, 0x0239c2b3, 0x013bf5f7, 0x01e82423, 0x03e75a3b, 0x02d8d8e0, 0x0188a19c, 0x0211db41, 0x0037c7a3}}}, + {X: Field{[10]uint32{0x00aceaa9, 0x03ee8daa, 0x01e9e776, 0x02245196, 0x03bc06c9, 0x00d66f01, 0x0170b4be, 0x010d6095, 0x02d80050, 0x0026cdd7}}, Y: Field{[10]uint32{0x01e90927, 0x01ab888d, 0x01f26d1e, 0x01021b73, 0x03226834, 0x01670d20, 0x01de5b1f, 0x0001a645, 0x0193385c, 0x000f4159}}}, + {X: Field{[10]uint32{0x02c9d1be, 0x0300648b, 0x03ba4060, 0x021cdff3, 0x03c13aff, 0x00e42dff, 0x03865e72, 0x00b21cc7, 0x00045d43, 0x0010d902}}, Y: Field{[10]uint32{0x0070cbeb, 0x01ac8818, 0x016eb234, 0x02496e2c, 0x025aff2a, 0x012ed3ef, 0x01f2aac5, 0x00ff878f, 0x02af6fc7, 0x00388ce3}}}, + {X: Field{[10]uint32{0x001e0b66, 0x01d849fd, 0x02a394c4, 0x00bbcae7, 0x0259287f, 0x02fa2353, 0x021f35cf, 0x0045c905, 0x004f2446, 0x0029b967}}, Y: Field{[10]uint32{0x019f334d, 0x03b17f9f, 0x032775f5, 0x00acb9ea, 0x0257a8ae, 0x0133dc62, 0x00fa470c, 0x01d7e507, 0x0347f5dd, 0x001d71c1}}}, + {X: Field{[10]uint32{0x01322d51, 0x02801ec9, 0x016ed7c9, 0x0165d2ca, 0x025293a9, 0x01a9b4ce, 0x03bf1e84, 0x0147f65d, 0x0217ae73, 0x003fd8e5}}, Y: Field{[10]uint32{0x03dac457, 0x01cc4594, 0x0239f79d, 0x01c7bd01, 0x03e21dca, 0x039e60d4, 0x03f81ffe, 0x0157dd94, 0x01abfa23, 0x0039848f}}}, + {X: Field{[10]uint32{0x02f4faf3, 0x0376fa53, 0x030435f8, 0x03b80722, 0x00c254df, 0x02b578a1, 0x0237cbc5, 0x03639822, 0x00401710, 0x001de452}}, Y: Field{[10]uint32{0x00611414, 0x02e3b638, 0x00ecaa54, 0x0118cb26, 0x02623be4, 0x02534a9a, 0x0075dc38, 0x03531c10, 0x00e99ef3, 0x00365fd1}}}, + {X: Field{[10]uint32{0x01484aad, 0x015e7ede, 0x00ee5d42, 0x03f01b76, 0x00947cf1, 0x03704d71, 0x0151c00a, 0x0152a841, 0x00aa0292, 0x003da244}}, Y: Field{[10]uint32{0x0052c1fc, 0x02d67930, 0x03c941b9, 0x0310fd71, 0x0269f9f5, 0x0325e137, 0x01587eaf, 0x01b58c2b, 0x03db33a5, 0x00102f7e}}}, + {X: Field{[10]uint32{0x036e0fd3, 0x01891906, 0x0169629f, 0x034b7bc7, 0x00f2d4d8, 0x03558361, 0x01c75011, 0x0133bdc6, 0x0381473d, 0x00056fa3}}, Y: Field{[10]uint32{0x00fd9a2a, 0x023bbb9c, 0x007bb1d2, 0x02a21241, 0x0364b85e, 0x01b64c99, 0x011ead00, 0x006d0711, 0x0126fc99, 0x001f99be}}}, + {X: Field{[10]uint32{0x0284e9ca, 0x006af762, 0x019db909, 0x01be682f, 0x03d0c5c2, 0x01f10722, 0x03272970, 0x00c0bbd0, 0x015a2e22, 0x0003844f}}, Y: Field{[10]uint32{0x01574dc0, 0x0095f2bd, 0x0353026a, 0x03472e00, 0x03b54941, 0x03c6cb16, 0x026b70b2, 0x0371145e, 0x02d834c6, 0x000b9218}}}, + {X: Field{[10]uint32{0x03bea688, 0x0237f9d1, 0x01595aa7, 0x02c15f5b, 0x022c94da, 0x030346f8, 0x0220d9de, 0x02e99dfd, 0x0370485b, 0x0025ac41}}, Y: Field{[10]uint32{0x03dbf30b, 0x027a7c6e, 0x016a5225, 0x03092926, 0x02ff854a, 0x031de766, 0x021bd58f, 0x01c9ab06, 0x02ae0222, 0x0038182a}}}, + {X: Field{[10]uint32{0x0005545d, 0x01e24d09, 0x02183de8, 0x031d68e3, 0x0057f6f7, 0x034b3f63, 0x025e8990, 0x0255385f, 0x03005555, 0x00205d0b}}, Y: Field{[10]uint32{0x02d2fc0e, 0x03b80f4b, 0x0236edf1, 0x031a3e48, 0x00a8d742, 0x00d5e3ec, 0x032fbb07, 0x0017cb9b, 0x03c2e5f7, 0x00285d8f}}}, + {X: Field{[10]uint32{0x0378a480, 0x01207fee, 0x01c17fcc, 0x002f85b0, 0x0386bc7a, 0x02434dee, 0x00b72eaf, 0x023d89df, 0x03139698, 0x0005f067}}, Y: Field{[10]uint32{0x03c78833, 0x030eed94, 0x01fd9c5e, 0x0181c63e, 0x013f430e, 0x038f946e, 0x01c2642a, 0x0193ad88, 0x00d52101, 0x0032c4a4}}}, + {X: Field{[10]uint32{0x02497a3c, 0x0066fae8, 0x01c3f403, 0x001d8f00, 0x00bfeee5, 0x02e18552, 0x0248b2bb, 0x01bb2719, 0x0306e874, 0x00001ec3}}, Y: Field{[10]uint32{0x02a70020, 0x02dde3b5, 0x00c6a2fd, 0x016275ba, 0x031634b7, 0x032a831e, 0x00b318f1, 0x01f638c2, 0x03788429, 0x0031a524}}}, + {X: Field{[10]uint32{0x02c5e8b3, 0x015ba444, 0x0013405f, 0x005f2c6e, 0x0055a805, 0x02a26dd5, 0x027d8c28, 0x0060fe69, 0x03062414, 0x001c570a}}, Y: Field{[10]uint32{0x0120370b, 0x015dcfc9, 0x03b33920, 0x000e5de1, 0x0123167f, 0x03e12d35, 0x02d4cca7, 0x01771c78, 0x01c89a79, 0x003e26e2}}}, + {X: Field{[10]uint32{0x0374d3b6, 0x03d03723, 0x024c78f1, 0x00277626, 0x01057aed, 0x03f976fd, 0x0377662e, 0x03f1e1d9, 0x0200f974, 0x00383433}}, Y: Field{[10]uint32{0x03e3eb56, 0x01c138b8, 0x000d3e85, 0x03f9f2cf, 0x03c253be, 0x01315447, 0x03c7f05c, 0x01211e52, 0x0265ed70, 0x002b316f}}}, + {X: Field{[10]uint32{0x026432a2, 0x002ac7f4, 0x02222e77, 0x021d6eb5, 0x01bdba9a, 0x033674a8, 0x01aaf75e, 0x02e2de69, 0x028976fb, 0x000dd54c}}, Y: Field{[10]uint32{0x02ced92d, 0x00584230, 0x01d77eb0, 0x01f0b170, 0x0001087e, 0x00aca822, 0x00bc7d01, 0x00192f60, 0x02331b7e, 0x001b6ef8}}}, + {X: Field{[10]uint32{0x03e3d3ff, 0x02ace81b, 0x00699446, 0x0144aaf7, 0x00f46ca6, 0x02cabec1, 0x003f6b08, 0x0240da1a, 0x03ef51ea, 0x000ba570}}, Y: Field{[10]uint32{0x019b554a, 0x02d030ca, 0x0349839c, 0x019802ca, 0x0201556c, 0x01876f18, 0x0063b94c, 0x037f8121, 0x0287b1d8, 0x0002417a}}}, + {X: Field{[10]uint32{0x00ff8eb5, 0x01f5d6b1, 0x02cf40fe, 0x0036d645, 0x02646758, 0x01cd54fd, 0x035c67fb, 0x00c915fc, 0x021e721f, 0x00094c43}}, Y: Field{[10]uint32{0x006b4ace, 0x02d50c1e, 0x03041016, 0x018b05fa, 0x0146ecd6, 0x01f72ac7, 0x01a359b8, 0x03bad509, 0x02f9be42, 0x00271794}}}, + {X: Field{[10]uint32{0x03830b7b, 0x001fd46d, 0x013b0cf7, 0x01f5febd, 0x0227a23b, 0x035f2d41, 0x00779117, 0x03f0b75e, 0x031b2b24, 0x000964ca}}, Y: Field{[10]uint32{0x03536765, 0x00cb6477, 0x00f3e04e, 0x00180427, 0x022215e2, 0x037ce8ab, 0x03969a6d, 0x009ac075, 0x03b4acdb, 0x001fa388}}}, + {X: Field{[10]uint32{0x03c5ed3e, 0x005a911c, 0x0284e22b, 0x017ac26d, 0x02892e13, 0x025fd6e2, 0x029ba443, 0x01d99ee9, 0x02f6251f, 0x001f48ca}}, Y: Field{[10]uint32{0x02d8356e, 0x00995c69, 0x0392c1cd, 0x01165426, 0x00131b90, 0x026093c7, 0x03dea61d, 0x0226d633, 0x0238c8a5, 0x0028fa3d}}}, + {X: Field{[10]uint32{0x00c720f9, 0x03a5d572, 0x03633cb9, 0x01141211, 0x026afc86, 0x01125581, 0x03e05b0a, 0x03aa1ee8, 0x02a01b65, 0x001355b2}}, Y: Field{[10]uint32{0x03537330, 0x0105dc5d, 0x0208f50f, 0x03865deb, 0x007c1eae, 0x00dbc0d2, 0x03f1ada9, 0x01465f28, 0x027836e6, 0x000530d1}}}, + {X: Field{[10]uint32{0x0100a88b, 0x03bef671, 0x01c2c122, 0x000cdc9f, 0x032615b5, 0x031c8bb5, 0x01c81f42, 0x03e2eddd, 0x0165ca6f, 0x001c6af4}}, Y: Field{[10]uint32{0x012620f1, 0x02ae2112, 0x00eb9c39, 0x01499089, 0x01a59693, 0x0046b12e, 0x031c46ae, 0x013e18be, 0x00670728, 0x001e6e89}}}, + {X: Field{[10]uint32{0x02a48965, 0x00ba4195, 0x039f4200, 0x01d31045, 0x0230215e, 0x03176795, 0x00496345, 0x00146731, 0x00ccc381, 0x002118bf}}, Y: Field{[10]uint32{0x03787d4b, 0x00241229, 0x005cb64d, 0x029d70f0, 0x00f0eb75, 0x027f1190, 0x0148a7e2, 0x02e662f1, 0x0166cd7f, 0x00014d6a}}}, + {X: Field{[10]uint32{0x02c09826, 0x03a4d44d, 0x01ae3286, 0x0011bf91, 0x00b9c2b1, 0x0195a12a, 0x0178b5c6, 0x0147402d, 0x0093fed7, 0x003da3ab}}, Y: Field{[10]uint32{0x0148bff5, 0x013f117f, 0x01831733, 0x0355cca8, 0x0366f7d8, 0x02943952, 0x0119ff2f, 0x02a28a3c, 0x032b98b0, 0x00263830}}}, + {X: Field{[10]uint32{0x01f72041, 0x0110acb6, 0x00b1615f, 0x031f9250, 0x0243467d, 0x01bfd5a6, 0x00e4014f, 0x0364d670, 0x025009a8, 0x0018511c}}, Y: Field{[10]uint32{0x02c8f807, 0x00cc505e, 0x02d2eb2f, 0x0024abac, 0x00fa58f2, 0x03efaa22, 0x02a7108d, 0x01fb9f7b, 0x037fc7f5, 0x0003edc5}}}, + {X: Field{[10]uint32{0x0315614f, 0x023b3152, 0x01497fc2, 0x0324de68, 0x01c9846a, 0x00b6233c, 0x0259a26e, 0x006f4b88, 0x02114ffa, 0x003a9a7b}}, Y: Field{[10]uint32{0x00e4e2de, 0x02dda317, 0x022c9b17, 0x006e026d, 0x0163183d, 0x0375b3cf, 0x00141083, 0x035d4244, 0x01b51dd6, 0x001626e0}}}, + {X: Field{[10]uint32{0x025d5263, 0x01319813, 0x02b78146, 0x0057147e, 0x0338e6aa, 0x01ffc542, 0x01a1ce0d, 0x037a5990, 0x03243404, 0x000d1c9e}}, Y: Field{[10]uint32{0x0027d4f2, 0x00a27536, 0x03804435, 0x03cb56ef, 0x031920bf, 0x03001a74, 0x039baadd, 0x0329dcd6, 0x026bcf56, 0x0024660c}}}, + {X: Field{[10]uint32{0x02217461, 0x02343667, 0x02ad952f, 0x036549b3, 0x00eeebf4, 0x03a62d3c, 0x022d2756, 0x01e370a7, 0x02ae6137, 0x00254914}}, Y: Field{[10]uint32{0x02d486a8, 0x01c5d6ca, 0x035ff079, 0x020b7052, 0x03c17f65, 0x006c5046, 0x0250eb10, 0x03ed6be6, 0x0228c195, 0x003022ce}}}, + {X: Field{[10]uint32{0x038e49ff, 0x02855ab9, 0x01bfd2d4, 0x010af78b, 0x02401b83, 0x019840c1, 0x01afeba6, 0x022f1dfa, 0x0318dc4a, 0x003ef28f}}, Y: Field{[10]uint32{0x014129c9, 0x01f910fe, 0x029b6c7b, 0x01ceee4c, 0x034cf755, 0x01dae493, 0x020db7bc, 0x02cb7bb6, 0x016d6027, 0x000ae0a7}}}, + {X: Field{[10]uint32{0x03d8c141, 0x03130556, 0x0082b57b, 0x03fee502, 0x005302bf, 0x0022929c, 0x03dff64a, 0x0190ea55, 0x011d7ddc, 0x0031f77c}}, Y: Field{[10]uint32{0x02708e20, 0x01559a5b, 0x02a8889d, 0x038628f6, 0x03b3711e, 0x00e6f9e6, 0x03e81468, 0x02c0600f, 0x01f1ac93, 0x003a7284}}}, + {X: Field{[10]uint32{0x00ce31b8, 0x03b9299c, 0x02fa2cd0, 0x014e72db, 0x011b3f23, 0x039a0860, 0x031f7e44, 0x0018fae0, 0x023086e3, 0x001c410e}}, Y: Field{[10]uint32{0x01322c9d, 0x02df2d22, 0x03411ebc, 0x01914c82, 0x019334c1, 0x0178a613, 0x029cc925, 0x0349cd2a, 0x0338ef9f, 0x00136cfc}}}, + {X: Field{[10]uint32{0x00602585, 0x01a9dd92, 0x034c3dbb, 0x0111e644, 0x005d70f0, 0x003e8dd7, 0x0349d368, 0x01f2ef64, 0x02401534, 0x001b793a}}, Y: Field{[10]uint32{0x03960418, 0x01df7c9f, 0x03d70f1d, 0x010ce31c, 0x02458a32, 0x01c0973c, 0x028d8394, 0x014b6fba, 0x018865ab, 0x0000edd9}}}, + {X: Field{[10]uint32{0x024fecbe, 0x0095a5ae, 0x02215bc4, 0x030387e9, 0x01db9a0c, 0x03dee80f, 0x017e23b6, 0x03b2dfa8, 0x039f467c, 0x000a7ea9}}, Y: Field{[10]uint32{0x00f34838, 0x03fe86d2, 0x01154e50, 0x017b4bfc, 0x0264a224, 0x01af7c41, 0x03027d04, 0x02f0a707, 0x011fc42f, 0x00396a9a}}}, + {X: Field{[10]uint32{0x02aafc99, 0x010be4c5, 0x00f79c8c, 0x02e1d244, 0x03d750f8, 0x00afe3d6, 0x025f15a0, 0x016c89e3, 0x03fc25ae, 0x003fe202}}, Y: Field{[10]uint32{0x025747df, 0x03bba08e, 0x00b105ee, 0x019af228, 0x0360e7a1, 0x02ed40b6, 0x0025bd81, 0x023de4de, 0x030a0072, 0x00254d7d}}}, + {X: Field{[10]uint32{0x00a2a378, 0x01af4be9, 0x00eeef6a, 0x02c90949, 0x0160eff0, 0x014ba302, 0x020c5663, 0x03dbd614, 0x02a03837, 0x002de06d}}, Y: Field{[10]uint32{0x00dbbb62, 0x03ffefd3, 0x01e4fc44, 0x027989d5, 0x01cbf838, 0x0304ada7, 0x0322ee73, 0x00f7650d, 0x03d46c68, 0x002b35ed}}}, + {X: Field{[10]uint32{0x027406db, 0x01028ed1, 0x01990ee5, 0x01896411, 0x03b3f190, 0x00b92b0a, 0x0332c648, 0x03174369, 0x0193e8ba, 0x001b65d9}}, Y: Field{[10]uint32{0x032a8b6b, 0x01fa704b, 0x016583bd, 0x00966a2e, 0x016cbc18, 0x00a92abb, 0x00bb9c0f, 0x020585b0, 0x03e4af6d, 0x000c30d4}}}, + {X: Field{[10]uint32{0x00dc3032, 0x0219af5b, 0x014015d0, 0x0208a9b6, 0x03683ec7, 0x03eb4784, 0x02121129, 0x03836d18, 0x036a4dd3, 0x00063b59}}, Y: Field{[10]uint32{0x00a51bd5, 0x009ac580, 0x019bb8ef, 0x039dfb8c, 0x0006f9a6, 0x01780d9c, 0x03b97626, 0x02a0a97d, 0x02e15dbf, 0x00321ac1}}}, + {X: Field{[10]uint32{0x035ce2a1, 0x015032b6, 0x0118ceb3, 0x034ee547, 0x01d1e859, 0x03bf52e3, 0x00bce4da, 0x003ff30b, 0x0238e944, 0x0000c4e3}}, Y: Field{[10]uint32{0x0095c241, 0x038a325a, 0x029a3430, 0x010253be, 0x03fef4bc, 0x02431b9b, 0x0260a134, 0x02199f75, 0x01b2a11a, 0x0037e2ac}}}, + {X: Field{[10]uint32{0x00b00c95, 0x015c73fa, 0x03c3a091, 0x0023d240, 0x02163ce6, 0x0126a5d8, 0x02b1e761, 0x0326aae2, 0x00ac2025, 0x001d5f7d}}, Y: Field{[10]uint32{0x03a03430, 0x0353b337, 0x018c4a37, 0x032d343f, 0x01c56bd7, 0x014001d9, 0x0115ab76, 0x0317611f, 0x01feab36, 0x003fc2bd}}}, + {X: Field{[10]uint32{0x004c27e1, 0x01c10262, 0x015cc9aa, 0x03a1142e, 0x020ce09d, 0x0078ecbc, 0x03319a08, 0x01626f44, 0x02527156, 0x00229a5e}}, Y: Field{[10]uint32{0x0151f39d, 0x0027e1ab, 0x03ca13df, 0x039aefc0, 0x015a5edd, 0x00ccb576, 0x032815ad, 0x027a78df, 0x013cb602, 0x00027bae}}}, + {X: Field{[10]uint32{0x018c721b, 0x035838f9, 0x000b1650, 0x026f53d3, 0x01d35eb8, 0x00dea135, 0x03c2198e, 0x0382c5b3, 0x018736f9, 0x002c2eda}}, Y: Field{[10]uint32{0x016e00dc, 0x018d8efb, 0x001ebb3b, 0x0054bd23, 0x010b8556, 0x02ce3a0b, 0x009808f0, 0x02d405bc, 0x0200ce25, 0x000cf56c}}}, + {X: Field{[10]uint32{0x0037efed, 0x006d5172, 0x022d8d9f, 0x017a41ab, 0x03ef6d6f, 0x034be3fd, 0x037882a0, 0x0118d098, 0x01de5dde, 0x0007283b}}, Y: Field{[10]uint32{0x002863bc, 0x027af6aa, 0x02e41acb, 0x013eb163, 0x024c4d3a, 0x017ae7cf, 0x015d4c0f, 0x01a0f69f, 0x01ae4cff, 0x00067bed}}}, + {X: Field{[10]uint32{0x01474aa7, 0x03f10893, 0x0121ed90, 0x006b793a, 0x01d59ad1, 0x00786dd9, 0x02849310, 0x0395f59a, 0x030eb9a4, 0x001e0396}}, Y: Field{[10]uint32{0x033ab811, 0x024c8304, 0x016a3d33, 0x03fd0614, 0x001d8f34, 0x01e6a8e9, 0x02579f4c, 0x017c84b6, 0x00cc58cc, 0x0017af67}}}, + {X: Field{[10]uint32{0x00eb4c9d, 0x01a1b68d, 0x01468edf, 0x026952fc, 0x0330ec07, 0x037c8429, 0x02af620c, 0x021414b4, 0x00e93980, 0x003dfa4b}}, Y: Field{[10]uint32{0x00f93666, 0x03deae5e, 0x035857b1, 0x0259ea22, 0x0257c234, 0x00bc52b6, 0x03d54c03, 0x02a58563, 0x01cfe113, 0x000b1567}}}, + {X: Field{[10]uint32{0x0289f938, 0x01f69712, 0x036f54bc, 0x02909a4c, 0x013a5688, 0x00360358, 0x01ff8092, 0x00829e3e, 0x022075bb, 0x000f0ebe}}, Y: Field{[10]uint32{0x03888c8d, 0x03cfe71e, 0x0132b978, 0x0364fc74, 0x023bd836, 0x0190d7c8, 0x023a9f54, 0x00d75b95, 0x03081dd2, 0x001fbce0}}}, + {X: Field{[10]uint32{0x022097ee, 0x03ec557c, 0x01115af4, 0x03700c06, 0x0389fb9e, 0x01f95848, 0x01ec59e0, 0x03e6d5d7, 0x001dee60, 0x001c75bc}}, Y: Field{[10]uint32{0x0080bfee, 0x0011c387, 0x016802ef, 0x03483abc, 0x0138da4f, 0x02d050c8, 0x0054091f, 0x028d714a, 0x02454a31, 0x00387330}}}, + {X: Field{[10]uint32{0x00c4fa2d, 0x03dd6e4e, 0x036ea1f5, 0x00c7162a, 0x02b107fc, 0x039895f7, 0x00a77b28, 0x03b20242, 0x020f5705, 0x0025c999}}, Y: Field{[10]uint32{0x008cd4c1, 0x021a526d, 0x000c690c, 0x039c23a9, 0x01d3636f, 0x01b6c319, 0x018c213b, 0x0347a584, 0x03ae3102, 0x00253301}}}, + {X: Field{[10]uint32{0x02802719, 0x000ab0ac, 0x004b87fd, 0x004bb07f, 0x02297fad, 0x01fa2d8c, 0x011a1a29, 0x0286bc1a, 0x00c754b2, 0x002b3974}}, Y: Field{[10]uint32{0x039f85eb, 0x03252162, 0x008581f4, 0x032b4934, 0x027fc843, 0x03c6235a, 0x02491f05, 0x01c973ae, 0x03248d3e, 0x002493e7}}}, + {X: Field{[10]uint32{0x01943f64, 0x0159ace1, 0x018b88fa, 0x03f588ba, 0x028200ea, 0x00e2928a, 0x01778f28, 0x003fc333, 0x006b3480, 0x003e944c}}, Y: Field{[10]uint32{0x0296e293, 0x01721c50, 0x015c85f0, 0x015eb4d3, 0x0104b677, 0x0324ad43, 0x00ee030f, 0x0121ce87, 0x02166b14, 0x002d83b9}}}, + {X: Field{[10]uint32{0x01bea60a, 0x0275610b, 0x030f17c1, 0x0165845c, 0x000b716a, 0x0163abf3, 0x00097ee4, 0x009699e7, 0x0018329d, 0x002177e4}}, Y: Field{[10]uint32{0x017ab0fa, 0x03a24462, 0x0180ae62, 0x031bcbda, 0x00b7bc64, 0x039e1ddd, 0x01ad7c09, 0x008473a6, 0x01b6046d, 0x00315575}}}, + {X: Field{[10]uint32{0x00af5e3a, 0x02627389, 0x037f3efb, 0x03d1e018, 0x01337ff5, 0x0398d2a6, 0x0061b52a, 0x01119ead, 0x000dc202, 0x000bddf0}}, Y: Field{[10]uint32{0x005e3e39, 0x0039fea4, 0x0325303f, 0x039ebbca, 0x020c5d28, 0x039fbee9, 0x00c52b0b, 0x03eaf61c, 0x0278ebcb, 0x0031fd29}}}, + {X: Field{[10]uint32{0x028bb34e, 0x03123088, 0x0200158f, 0x03d6c3bd, 0x011f238d, 0x02e00afd, 0x036a4997, 0x0143583f, 0x023a7200, 0x0014b628}}, Y: Field{[10]uint32{0x003d9136, 0x00c0b6e0, 0x000f2ccd, 0x004b245e, 0x02cebb18, 0x030c31e1, 0x02d29b51, 0x02386858, 0x01a7861b, 0x00262ba0}}}, + {X: Field{[10]uint32{0x0212b211, 0x003b6c5c, 0x022fd37b, 0x008901d1, 0x00701daf, 0x01d556d7, 0x03b83204, 0x0001248b, 0x0079eaca, 0x0029fcf9}}, Y: Field{[10]uint32{0x03bdaada, 0x019402e7, 0x03ae8e92, 0x01f311db, 0x013e3376, 0x006eb00e, 0x0268498d, 0x029f05ee, 0x010c8c4c, 0x00203d86}}}, + {X: Field{[10]uint32{0x02356103, 0x01181f28, 0x00880ea0, 0x0264023d, 0x0373db57, 0x0108e0ab, 0x03bf4d79, 0x034c9986, 0x0150e67b, 0x000c7bcc}}, Y: Field{[10]uint32{0x00a9a8ee, 0x020d2c6a, 0x00954631, 0x01ab8f4b, 0x01bc03c4, 0x012c5bb5, 0x0350bb51, 0x00a3464e, 0x01d6655d, 0x001f6e3d}}}, + {X: Field{[10]uint32{0x038b058d, 0x03b8914e, 0x031fceab, 0x034e1a04, 0x00599b0c, 0x00bb7a8c, 0x02d1ee35, 0x000a64e6, 0x0155469c, 0x003ba0bc}}, Y: Field{[10]uint32{0x0092b10c, 0x00bfcc14, 0x00400eed, 0x0263c0e5, 0x0032de93, 0x02b6e263, 0x01d9ed6c, 0x030b10ab, 0x014e2d77, 0x003f4303}}}, + {X: Field{[10]uint32{0x016b4586, 0x0347df95, 0x0073e206, 0x0242d15a, 0x01273549, 0x0281c55d, 0x01f7d458, 0x0375bc2a, 0x007abfce, 0x00037b1f}}, Y: Field{[10]uint32{0x007200c4, 0x0060041d, 0x0327673c, 0x031ee172, 0x002c7626, 0x01e7f8c8, 0x02f0912b, 0x025fd061, 0x02b4cad5, 0x002be106}}}, + {X: Field{[10]uint32{0x00d2369d, 0x02cd347d, 0x0362e526, 0x004bb921, 0x002bf34f, 0x01466f60, 0x011ba405, 0x01bfa5d6, 0x037048cd, 0x0030a38c}}, Y: Field{[10]uint32{0x00636e8b, 0x003ac5fc, 0x01a647d5, 0x0148e4c9, 0x03b8640f, 0x025dae84, 0x0086dba6, 0x019cc5fd, 0x03ddda45, 0x0003802a}}}, + {X: Field{[10]uint32{0x03222195, 0x011448f7, 0x01a93071, 0x00c473c1, 0x01370277, 0x003c8d4c, 0x0029e9db, 0x017d9403, 0x00a92c27, 0x0011c55f}}, Y: Field{[10]uint32{0x01cbef6e, 0x003833a2, 0x00dc4f43, 0x01cacd3e, 0x009fefeb, 0x0107321d, 0x007e9ed4, 0x03f496be, 0x03fac911, 0x001922c5}}}, + {X: Field{[10]uint32{0x00a73241, 0x01c6991b, 0x03868f54, 0x014e9eac, 0x039a0a92, 0x027fc651, 0x01b55037, 0x014f3b60, 0x0302745c, 0x00213445}}, Y: Field{[10]uint32{0x01f858c5, 0x0382f089, 0x016b62c0, 0x03076359, 0x01fc593e, 0x01139933, 0x03b13536, 0x0021e93b, 0x02a20c3c, 0x0013c5ad}}}, + {X: Field{[10]uint32{0x03d63fc9, 0x02f8b5e5, 0x02dccb7f, 0x00a23a46, 0x03c74e81, 0x02a20471, 0x02b2f28e, 0x0182e1ac, 0x00221960, 0x000eee8c}}, Y: Field{[10]uint32{0x0334e286, 0x00f4a8a9, 0x02f3a9d7, 0x0262db9f, 0x00879d3f, 0x03a93d53, 0x03c5aa12, 0x014dce9d, 0x014af094, 0x001fcd01}}}, + {X: Field{[10]uint32{0x00651c6b, 0x03a281a6, 0x038f4425, 0x001aaa14, 0x00b9f746, 0x00f5039c, 0x037485ab, 0x01850c90, 0x03f47a2c, 0x0002158d}}, Y: Field{[10]uint32{0x03396054, 0x0002b664, 0x00096c35, 0x00c68c34, 0x02f76e85, 0x020e940d, 0x03075760, 0x00ac799e, 0x01d56fb4, 0x002f1aa5}}}, + {X: Field{[10]uint32{0x01bbd123, 0x01bb4c53, 0x0167d8ea, 0x010a902a, 0x02e8021a, 0x034f150f, 0x02d1605d, 0x00066887, 0x02985e75, 0x00094c0b}}, Y: Field{[10]uint32{0x02797a83, 0x02936399, 0x010f3267, 0x00e447f7, 0x01c02206, 0x004dc4fe, 0x02f9b4ba, 0x01d64751, 0x03e02309, 0x00212732}}}, + {X: Field{[10]uint32{0x003bea40, 0x01fd793d, 0x01f8e411, 0x003edae1, 0x03485fde, 0x029c82b8, 0x00d73dab, 0x024f8f02, 0x00bf88e3, 0x0039668c}}, Y: Field{[10]uint32{0x0197dfd5, 0x02112618, 0x02fb4422, 0x01921e1c, 0x0383ebbb, 0x00f92fe0, 0x00fa6bd3, 0x032cdc68, 0x024fe222, 0x001bf5e0}}}, + {X: Field{[10]uint32{0x02247e4e, 0x03e060fd, 0x025bda83, 0x0074b04d, 0x02de0533, 0x024d778b, 0x01e9bc3b, 0x00698162, 0x01f69798, 0x0031640b}}, Y: Field{[10]uint32{0x0175fe3c, 0x016b1f4b, 0x02c91f86, 0x01bae4f6, 0x0121d073, 0x03fadf38, 0x035ecb58, 0x0147bc6a, 0x014f5af5, 0x00319fac}}}, + {X: Field{[10]uint32{0x015e66ad, 0x02ad3983, 0x00c1b277, 0x0270b9b1, 0x01b8b640, 0x0138f202, 0x039a9b47, 0x0049fb19, 0x02c7fe27, 0x0037e2f6}}, Y: Field{[10]uint32{0x017d43e1, 0x02c409dc, 0x02dc7645, 0x01bf0099, 0x00273825, 0x00bad1c2, 0x01802ed7, 0x00e25953, 0x03e49f0b, 0x000ffc9b}}}, + {X: Field{[10]uint32{0x0065a82c, 0x0233dd8b, 0x02cf3f1e, 0x00942459, 0x009eff91, 0x0204357c, 0x01c7c02b, 0x02e32b0e, 0x004e9c7c, 0x00075550}}, Y: Field{[10]uint32{0x02a7632f, 0x02ee6f6c, 0x00707c24, 0x03a82681, 0x03e5a760, 0x00bf1348, 0x0099f64a, 0x03228d71, 0x0023f6a1, 0x00305e1c}}}, + {X: Field{[10]uint32{0x01f43b44, 0x03b82203, 0x034ef804, 0x02599e86, 0x002d040e, 0x01617914, 0x0106073d, 0x03f7eda1, 0x00c9b035, 0x000d7ce4}}, Y: Field{[10]uint32{0x03f512a2, 0x01768e2f, 0x010383c5, 0x00ab690f, 0x004c3cad, 0x003ae5d5, 0x0036fec5, 0x0362ddf7, 0x018886aa, 0x001aa173}}}, + {X: Field{[10]uint32{0x01e059b0, 0x01d13131, 0x006d588f, 0x01bb50f4, 0x011d2278, 0x0091273f, 0x02d7005b, 0x023e9bc9, 0x000dee88, 0x003eec21}}, Y: Field{[10]uint32{0x01b8d3bf, 0x034ac973, 0x005a6508, 0x03d2f4f5, 0x02203b05, 0x03d946eb, 0x00ffa219, 0x01c3c8e9, 0x014fd89a, 0x00191814}}}, + {X: Field{[10]uint32{0x034d78d7, 0x02049c68, 0x00ac9ce4, 0x0384cd4f, 0x0161fa0a, 0x01a4c7a4, 0x0208ac46, 0x01d77111, 0x00f01c22, 0x0009015b}}, Y: Field{[10]uint32{0x03c7751f, 0x0286d8f2, 0x011bf7dd, 0x028361a9, 0x01965a3f, 0x00d2949d, 0x003088f4, 0x020746fc, 0x03c67e73, 0x0010faf4}}}, + {X: Field{[10]uint32{0x00f9cd78, 0x02465c9c, 0x01297e77, 0x01175f9c, 0x0354f9f7, 0x035cbdac, 0x007c938c, 0x01f1e238, 0x03dfe844, 0x000ec410}}, Y: Field{[10]uint32{0x0240d6fc, 0x03c4a697, 0x0050c34a, 0x0184385b, 0x03b67ba3, 0x00ac6171, 0x02c29d4b, 0x03544449, 0x00c4abf0, 0x000a380a}}}, + {X: Field{[10]uint32{0x01a040e6, 0x03b7481a, 0x03a81a5b, 0x023d715d, 0x008088b0, 0x018d6017, 0x0175b236, 0x00d8e203, 0x01d14179, 0x002bbe42}}, Y: Field{[10]uint32{0x0200dc51, 0x006edf21, 0x03382d8a, 0x03007125, 0x0293350c, 0x03d028fe, 0x00c2b43d, 0x01adb174, 0x006f0de2, 0x00032ed3}}}, + {X: Field{[10]uint32{0x02833f28, 0x027e74f2, 0x007ac02c, 0x02e043d0, 0x03913367, 0x03c8a6f1, 0x0359aef5, 0x00c72dbf, 0x00f73863, 0x00323525}}, Y: Field{[10]uint32{0x010de4d2, 0x02a9d2ec, 0x01a67e70, 0x009e358b, 0x00c7b850, 0x034fbc45, 0x01afdacb, 0x0217534e, 0x02f94b62, 0x0032cb1d}}}, + {X: Field{[10]uint32{0x00f75b28, 0x00e44e4d, 0x033f5f4f, 0x005dbf97, 0x03c1b52e, 0x00779ed7, 0x00744437, 0x0328c8f7, 0x03f7af14, 0x00096bf3}}, Y: Field{[10]uint32{0x0142b789, 0x01c5c89a, 0x03781752, 0x03ed2bd2, 0x025010cd, 0x03541699, 0x031f57f8, 0x01fa5db2, 0x00a47f9d, 0x003619e9}}}, + {X: Field{[10]uint32{0x0132e2c7, 0x03658c8f, 0x022f819a, 0x00b5dc23, 0x01d40768, 0x022f5cb9, 0x02c220dc, 0x024c361c, 0x0086f773, 0x000090db}}, Y: Field{[10]uint32{0x00ab67a5, 0x02737aa2, 0x01662bc8, 0x021cdfc0, 0x0320a958, 0x0138501f, 0x00de6902, 0x0198f311, 0x01ea92af, 0x001b8e5b}}}, + {X: Field{[10]uint32{0x007f349d, 0x03d34945, 0x0056b0d0, 0x02e1fcf3, 0x0257638b, 0x0064567b, 0x00bcb86e, 0x00cf1e44, 0x03d59e57, 0x001873ba}}, Y: Field{[10]uint32{0x02fadb9e, 0x012c573c, 0x02aef3e7, 0x023e18a0, 0x027d8521, 0x01068c3a, 0x023082e7, 0x03b423ed, 0x0145e9b0, 0x000aa141}}}, + {X: Field{[10]uint32{0x00b6c187, 0x03a05fad, 0x0116dd77, 0x039b840b, 0x030dcbfe, 0x0278a91b, 0x0391a737, 0x0001c50a, 0x03b5d45d, 0x0016844c}}, Y: Field{[10]uint32{0x00d492e1, 0x03c0c14a, 0x0381f0f6, 0x03a3ce63, 0x0134c1c2, 0x00ce92df, 0x01c05171, 0x036710f2, 0x02aeafd6, 0x000bff65}}}, + {X: Field{[10]uint32{0x0163c8ac, 0x00e343d1, 0x0129309c, 0x0244c537, 0x01fff0f1, 0x0372c4ee, 0x02b5abe8, 0x006d04a7, 0x00498b70, 0x002dd28e}}, Y: Field{[10]uint32{0x00b9014f, 0x02599e67, 0x01186ffa, 0x00a3e10c, 0x01689be5, 0x0299de15, 0x00d6f7c5, 0x0083f619, 0x0257e50a, 0x00276113}}}, + {X: Field{[10]uint32{0x0389d26c, 0x032c8117, 0x024b752f, 0x01b2992a, 0x008e9a80, 0x02a54ab5, 0x011c3375, 0x0082d0ff, 0x00d04afb, 0x0030d727}}, Y: Field{[10]uint32{0x01a9c65a, 0x021de49e, 0x015a4b7e, 0x030fc1a7, 0x0248c765, 0x0278656c, 0x0279d841, 0x03bf2f7b, 0x02aa4a83, 0x002c1071}}}, + {X: Field{[10]uint32{0x00b82b96, 0x022b4df4, 0x025e8fea, 0x037b96db, 0x0311703d, 0x01e45075, 0x00b2af44, 0x01a2cfc1, 0x02587538, 0x0026a16a}}, Y: Field{[10]uint32{0x03d75d27, 0x0366549e, 0x005f2551, 0x0104efd2, 0x024e0620, 0x00cfb189, 0x00b80752, 0x03c0ef49, 0x00abaa16, 0x0011971c}}}, + {X: Field{[10]uint32{0x0086fe14, 0x03ac15d7, 0x0061bd12, 0x028f3e93, 0x01b3e825, 0x02f48fd2, 0x0183c14c, 0x03cf944b, 0x03cce051, 0x000fb1c6}}, Y: Field{[10]uint32{0x01915bdc, 0x017c17ba, 0x00007db3, 0x00ea6a54, 0x0245caba, 0x000cfc6a, 0x0294c5ab, 0x0295a954, 0x021de2da, 0x003c6630}}}, + {X: Field{[10]uint32{0x0359ae63, 0x0123c02c, 0x01b45aea, 0x01e4dcdf, 0x036b09e5, 0x00d6fccf, 0x0010e235, 0x007b7824, 0x0222939e, 0x003b872f}}, Y: Field{[10]uint32{0x021b90a5, 0x01e005e4, 0x0228d471, 0x0367794c, 0x01acecb6, 0x036adaa4, 0x037d2971, 0x0137d89f, 0x0026d444, 0x002fd810}}}, + {X: Field{[10]uint32{0x0346073e, 0x03c32659, 0x01ee78dc, 0x00aef222, 0x035a8cd9, 0x03fd3409, 0x007677d1, 0x00e98bbd, 0x03e171de, 0x003af2fc}}, Y: Field{[10]uint32{0x02f6ebe8, 0x00fd5d27, 0x03f9805c, 0x02428e08, 0x0195c6d8, 0x00b6b7ae, 0x014a3f30, 0x01c89024, 0x03c7bc9c, 0x0021e358}}}, + {X: Field{[10]uint32{0x039db797, 0x006cbf6a, 0x01ae56e8, 0x00c30243, 0x01b60664, 0x01654836, 0x03c57d52, 0x03bc56e1, 0x02e4ce72, 0x00393a4b}}, Y: Field{[10]uint32{0x015f944c, 0x03da5959, 0x00217ebe, 0x0232707e, 0x026d2183, 0x0161dd14, 0x01f47dbf, 0x029d4d56, 0x00654a03, 0x000feab1}}}, + {X: Field{[10]uint32{0x02ac1cc1, 0x010b7437, 0x03d635bc, 0x0319f078, 0x03cf275f, 0x00bac7d9, 0x00ef7431, 0x00ac0ded, 0x03588e29, 0x003f0739}}, Y: Field{[10]uint32{0x025186d7, 0x01e58f79, 0x019b42fe, 0x024b08e2, 0x02495bc3, 0x032bf2de, 0x03c791e8, 0x0366bdfd, 0x01bf44f7, 0x0005dade}}}, + {X: Field{[10]uint32{0x0294fc56, 0x031c15ae, 0x0091f9e9, 0x00eae5e9, 0x0149482b, 0x03257be1, 0x02a86b21, 0x01a9b1a4, 0x03ff179e, 0x003c7d6f}}, Y: Field{[10]uint32{0x0239e143, 0x009613e2, 0x0209313a, 0x00484318, 0x00670415, 0x030aab9c, 0x00f06205, 0x00ef0fed, 0x03a8a2cd, 0x000e2495}}}, + {X: Field{[10]uint32{0x03793eb9, 0x0113f5aa, 0x03323ac7, 0x00b9d230, 0x012c7aaa, 0x005d6850, 0x02bfef8d, 0x038006e9, 0x001461c3, 0x0026039d}}, Y: Field{[10]uint32{0x0331826c, 0x029d8946, 0x00259c7f, 0x00e98db1, 0x0134cbb3, 0x010a1801, 0x00dde28d, 0x017a0ecf, 0x01ae29e0, 0x001b8df7}}}, + {X: Field{[10]uint32{0x01b1c179, 0x0095fb68, 0x0207f66a, 0x029a9bde, 0x01adb7fa, 0x039b0655, 0x01986dc7, 0x01495c1c, 0x03f7686a, 0x003d4673}}, Y: Field{[10]uint32{0x0255a807, 0x03ae3c82, 0x0297f09e, 0x03b470c7, 0x03174ed4, 0x024ee140, 0x001d008a, 0x017261e5, 0x02b08c76, 0x000fa00f}}}, + {X: Field{[10]uint32{0x028f8061, 0x0389d56e, 0x00eee144, 0x00e443b7, 0x009011d9, 0x02f31730, 0x029bafd0, 0x03faa46e, 0x01ea3851, 0x000b7636}}, Y: Field{[10]uint32{0x01a52ae3, 0x03f81347, 0x00dc1365, 0x02a73a5c, 0x007adfde, 0x03bd4986, 0x00d058b4, 0x011a24df, 0x01afd422, 0x001851fc}}}, + {X: Field{[10]uint32{0x0054a4ae, 0x03f5e005, 0x01b35ede, 0x02335f42, 0x032854f8, 0x02a803d8, 0x02c0c415, 0x00d4dd1e, 0x02620948, 0x00218310}}, Y: Field{[10]uint32{0x033392f4, 0x039b8bb5, 0x01cef95c, 0x028a014d, 0x01d15378, 0x03bbc361, 0x03dfc561, 0x01b49639, 0x022a7d82, 0x0028a9e8}}}, + {X: Field{[10]uint32{0x02d732a6, 0x01eb42eb, 0x00b28ae9, 0x0240b259, 0x01e0697f, 0x0014d482, 0x007d4ea2, 0x00b0f426, 0x00ec17d8, 0x0039dac8}}, Y: Field{[10]uint32{0x03f54bf0, 0x02092499, 0x038f4ad1, 0x00df665f, 0x0132bc11, 0x0311fdc0, 0x037cec9c, 0x0184eff6, 0x00b685f6, 0x00325e11}}}, + {X: Field{[10]uint32{0x0110ab88, 0x0157bf42, 0x007a6504, 0x03378f41, 0x03718ec9, 0x00a905ed, 0x02862b16, 0x0296098d, 0x010d12fb, 0x00099cc7}}, Y: Field{[10]uint32{0x03542192, 0x029c7f26, 0x017143b1, 0x00251ee9, 0x028d2986, 0x001cdb5b, 0x022023bb, 0x0129841b, 0x03b30b46, 0x000f043b}}}, + {X: Field{[10]uint32{0x0224dcde, 0x0177e768, 0x00ea8986, 0x003a2cb6, 0x003fc457, 0x0340536c, 0x03e46f5e, 0x02046a1f, 0x007852db, 0x001432d2}}, Y: Field{[10]uint32{0x0339621d, 0x012f60e2, 0x006f95d5, 0x0234c0f4, 0x00c69db4, 0x00403914, 0x03572a0c, 0x02ba2623, 0x00a87937, 0x002ee122}}}, + {X: Field{[10]uint32{0x03b02a60, 0x03bac87f, 0x03a0e7eb, 0x01372ca2, 0x03064b0c, 0x02cfeb97, 0x00f9fb92, 0x03ff6d9c, 0x013b1d67, 0x003eda51}}, Y: Field{[10]uint32{0x00fd2c39, 0x00c0fba9, 0x024ca41e, 0x02bd1dcd, 0x00d1ba17, 0x0210483e, 0x03b13879, 0x0206d8fa, 0x033692d8, 0x002c3f7b}}}, + {X: Field{[10]uint32{0x03b249b4, 0x01dc1b62, 0x03b9938c, 0x00695b6e, 0x0103f406, 0x028fde13, 0x03aec4fe, 0x00089867, 0x000b4b72, 0x002a3c4a}}, Y: Field{[10]uint32{0x0239b8cc, 0x01c0fd1b, 0x019d4484, 0x02e6f07f, 0x03a97e12, 0x02f9ef8c, 0x032e5014, 0x01644d15, 0x0171ac50, 0x003aeced}}}, + {X: Field{[10]uint32{0x02acaa98, 0x012409db, 0x02bb878b, 0x0306f066, 0x02420f83, 0x00265805, 0x03cb3be3, 0x015e43c5, 0x0209df30, 0x0010a4b3}}, Y: Field{[10]uint32{0x00745d36, 0x02a89207, 0x022f9aa2, 0x016d9d1b, 0x00f32c8d, 0x01186ddb, 0x00f18733, 0x0074760b, 0x014cbf2b, 0x0006c536}}}, + {X: Field{[10]uint32{0x00c9464f, 0x029561e9, 0x0305b8c5, 0x00b25e5a, 0x038e1a06, 0x02720fe3, 0x03967504, 0x01d1fc2d, 0x0177f16f, 0x002b0904}}, Y: Field{[10]uint32{0x0176cf58, 0x028ed764, 0x0341d1cb, 0x0173bd72, 0x03266b69, 0x00c195a1, 0x004eb037, 0x034113b2, 0x01038261, 0x0037415d}}}, + {X: Field{[10]uint32{0x011823d3, 0x0349515d, 0x00e7dd7f, 0x026e1ac6, 0x0278e75c, 0x033dfe11, 0x019d640a, 0x00b695ff, 0x027326bf, 0x001a4bb2}}, Y: Field{[10]uint32{0x01c8e97f, 0x01ff74dc, 0x033478f1, 0x01413fc0, 0x02014c38, 0x02275876, 0x01573202, 0x029e2861, 0x0062548e, 0x0005f5b5}}}, + {X: Field{[10]uint32{0x0310e216, 0x00f316db, 0x01889e82, 0x03534bd6, 0x01d0e129, 0x0300b9bd, 0x02cf946e, 0x01404793, 0x024455ef, 0x003406c6}}, Y: Field{[10]uint32{0x03f91a0f, 0x015ab995, 0x03988345, 0x038ce237, 0x01807879, 0x01927d7f, 0x00f38f21, 0x00fb7755, 0x009e55e3, 0x00212936}}}, + {X: Field{[10]uint32{0x03fc1e9b, 0x0242f1e6, 0x030f12f8, 0x0308e4cc, 0x03fb0798, 0x023ca833, 0x0273a671, 0x02236024, 0x01f296a7, 0x0007ae98}}, Y: Field{[10]uint32{0x01dc9661, 0x01f3574b, 0x03266bc4, 0x03027b84, 0x03505da2, 0x01b12dab, 0x030a6a6b, 0x004118b7, 0x00cbe847, 0x00227ca6}}}, + {X: Field{[10]uint32{0x015980ea, 0x02da35d0, 0x015489c9, 0x032ac69b, 0x010a2300, 0x0087b730, 0x009fe1f7, 0x00c48519, 0x00da9460, 0x0009b7fe}}, Y: Field{[10]uint32{0x00004e60, 0x03685724, 0x037139d3, 0x017e5fd6, 0x033c4a0a, 0x03ee5523, 0x0365862e, 0x02ef7f0e, 0x022155e1, 0x00360992}}}, + {X: Field{[10]uint32{0x023fe676, 0x00ef03cc, 0x01047cee, 0x03729b89, 0x01a3116a, 0x020fa7ac, 0x035f64f2, 0x00608849, 0x0351425e, 0x0013990a}}, Y: Field{[10]uint32{0x01eafbb2, 0x01a288e2, 0x0174247a, 0x0283b49f, 0x0165b9c5, 0x030d7537, 0x011db0ab, 0x011a3125, 0x01659125, 0x003ca2df}}}, + {X: Field{[10]uint32{0x00f448a2, 0x034b869e, 0x02b21e94, 0x0033a709, 0x03b4f370, 0x033a91da, 0x027c97b4, 0x009f6cdf, 0x035cee9a, 0x000d52bf}}, Y: Field{[10]uint32{0x0130fcdb, 0x0027218a, 0x00dd5977, 0x0345b29e, 0x0299b4c4, 0x03da9e53, 0x012d0082, 0x01e7958e, 0x03d1624b, 0x00235a41}}}, + {X: Field{[10]uint32{0x03fbdc3d, 0x002e55a3, 0x039dcd57, 0x03b97d26, 0x01e76995, 0x002d97dd, 0x029f020c, 0x01a7fa3d, 0x00749493, 0x0014a1b4}}, Y: Field{[10]uint32{0x039703ab, 0x020779a1, 0x005e2027, 0x00fac5ac, 0x00e0a23d, 0x01f9bb80, 0x0062a452, 0x03103079, 0x02e53dd2, 0x000957bc}}}, + {X: Field{[10]uint32{0x0268add7, 0x0357d80c, 0x0121c266, 0x02e1bf78, 0x026bddee, 0x02a24d64, 0x00c8ff91, 0x008a666b, 0x0346c86e, 0x002e12a0}}, Y: Field{[10]uint32{0x0320789f, 0x02d00efb, 0x020a3f65, 0x034f62fa, 0x0329f5c8, 0x00791965, 0x0380c878, 0x0008e386, 0x028c79f4, 0x000c45e6}}}, + {X: Field{[10]uint32{0x0112bb94, 0x039e1cb7, 0x0067e0fd, 0x009e408b, 0x031b9dfc, 0x013f1470, 0x018b9f11, 0x02694089, 0x01e663fc, 0x00079ef5}}, Y: Field{[10]uint32{0x002c1b84, 0x01847c83, 0x00b6b927, 0x03f9b647, 0x0107acce, 0x01dfba2d, 0x0250f11e, 0x02c519f4, 0x01b40555, 0x0018a1ea}}}, + {X: Field{[10]uint32{0x03d2bc81, 0x01acab4d, 0x038da9c9, 0x0311535a, 0x029d28ac, 0x0399cb29, 0x01cfde6b, 0x027af9e9, 0x02213728, 0x001fb9a2}}, Y: Field{[10]uint32{0x0170c83e, 0x00f6e131, 0x01dcc8a5, 0x02fadeb3, 0x0303d7dc, 0x02c93808, 0x028aeee9, 0x030f2bca, 0x006400a6, 0x000fb0d0}}}, + {X: Field{[10]uint32{0x00ce570e, 0x0364533e, 0x0033f8d4, 0x01d59f0f, 0x02f3adef, 0x029ae9eb, 0x0107fddd, 0x00efeaa7, 0x010cf4be, 0x000a752c}}, Y: Field{[10]uint32{0x0058bf4c, 0x00e4b384, 0x031f2422, 0x00236fbd, 0x022ec79e, 0x031c1c36, 0x0103c252, 0x03d02903, 0x038596a4, 0x002da9d0}}}, + {X: Field{[10]uint32{0x028c359e, 0x0145b5cc, 0x039c9895, 0x00436989, 0x0350218f, 0x00b0fc14, 0x012a43b4, 0x03591f8c, 0x01d95c5c, 0x001e41f1}}, Y: Field{[10]uint32{0x00d6a625, 0x007261d9, 0x005d4c8f, 0x01e163e6, 0x00268883, 0x037bab06, 0x02bca52f, 0x00a86fca, 0x01e1ec06, 0x001b196a}}}, + {X: Field{[10]uint32{0x019d31b1, 0x0252e365, 0x030adfc9, 0x015714d0, 0x02e5bc2c, 0x031a3f3e, 0x0014fe7b, 0x02ef0cd8, 0x02aece11, 0x003310db}}, Y: Field{[10]uint32{0x029706a2, 0x032492fe, 0x02db3a50, 0x00e59b5f, 0x016b2bd5, 0x01814a61, 0x004e6089, 0x02fd9359, 0x01e7d6ff, 0x00058583}}}, + {X: Field{[10]uint32{0x010ec1f0, 0x006d8805, 0x01bea735, 0x002c052b, 0x021b5fb3, 0x008e77e8, 0x0259d556, 0x010806b9, 0x015d278d, 0x0033c08f}}, Y: Field{[10]uint32{0x00990741, 0x00553935, 0x005749e5, 0x02dc15f5, 0x0034c473, 0x015d736d, 0x031c26e7, 0x0301e9b9, 0x0395ffce, 0x0035801c}}}, + {X: Field{[10]uint32{0x03746a21, 0x00104979, 0x0238d71b, 0x015fa01e, 0x0112b6a2, 0x03151ed8, 0x0135b732, 0x03166f53, 0x0093f718, 0x000068a8}}, Y: Field{[10]uint32{0x00fd4c95, 0x024d51e6, 0x03919f8b, 0x02c1760f, 0x0216c0f8, 0x02491e5b, 0x02cadcc3, 0x028e6868, 0x0142652f, 0x00099d2d}}}, + {X: Field{[10]uint32{0x02b799d7, 0x02496dfb, 0x00215fac, 0x031c1aa1, 0x02f712e4, 0x00893feb, 0x018fdff0, 0x02b145d4, 0x002004b8, 0x0014d3b5}}, Y: Field{[10]uint32{0x03d82155, 0x00204636, 0x01439c07, 0x00bf4933, 0x00fa3078, 0x01db7eba, 0x03e497f5, 0x00667ee7, 0x00523ea6, 0x0000d796}}}, + {X: Field{[10]uint32{0x0200d08e, 0x03613052, 0x0138cf11, 0x01ace898, 0x03e9ba64, 0x03d2c115, 0x038ff188, 0x00c2b9b1, 0x00ad9e6f, 0x00234c79}}, Y: Field{[10]uint32{0x01d5feb2, 0x00e6f353, 0x02996478, 0x03352cc3, 0x03e4b0b1, 0x0112caa1, 0x01e36a48, 0x025b04e8, 0x03c19093, 0x003c36fb}}}, + {X: Field{[10]uint32{0x012b3412, 0x0057f48b, 0x0315954c, 0x027e1adc, 0x03c41843, 0x01bfdfdc, 0x02643791, 0x01016afd, 0x00520267, 0x00205d21}}, Y: Field{[10]uint32{0x00f19bbc, 0x03cfd768, 0x02ba7cb3, 0x03f4a02f, 0x029f6f95, 0x02587d6b, 0x00093899, 0x02d42c05, 0x009b0435, 0x0004f448}}}, + {X: Field{[10]uint32{0x0258aaa3, 0x008e11c1, 0x0212a6cc, 0x01c15fbf, 0x02458422, 0x037ce032, 0x024552be, 0x03a21401, 0x0372e604, 0x002f2a1f}}, Y: Field{[10]uint32{0x039e3d0e, 0x03a0aeb7, 0x0184b54e, 0x02355d4b, 0x03af2653, 0x01dae88f, 0x00123c62, 0x01c495cb, 0x02f528b7, 0x003b9422}}}, + {X: Field{[10]uint32{0x03cd3fb2, 0x016460df, 0x03c52e8c, 0x01184903, 0x01d527e5, 0x01b9e32e, 0x000365cd, 0x014bdb03, 0x02a9a196, 0x000378ae}}, Y: Field{[10]uint32{0x02d38905, 0x01deb287, 0x039bd733, 0x01042a73, 0x01865739, 0x01c59cb7, 0x035f2be5, 0x00cbf532, 0x00ef466c, 0x002bad06}}}, + {X: Field{[10]uint32{0x02acca9e, 0x0010e408, 0x01e5ac00, 0x02af1d99, 0x02556f6c, 0x001dc4d7, 0x00a0591c, 0x01e466d5, 0x01e914df, 0x001ee338}}, Y: Field{[10]uint32{0x00b40628, 0x02b96630, 0x007c2fb8, 0x02a7cff7, 0x00d06a96, 0x010ce295, 0x0100b720, 0x02b52430, 0x03f39cd8, 0x0029828f}}}, + {X: Field{[10]uint32{0x00a50e75, 0x0089e6fb, 0x03d1b040, 0x03f69ab0, 0x034d6d44, 0x00175d85, 0x03c80f82, 0x01d10c66, 0x017913fe, 0x00335c70}}, Y: Field{[10]uint32{0x01419064, 0x02fce31c, 0x01211967, 0x00494a2b, 0x01ae3858, 0x03d8ce4a, 0x001d1a93, 0x00e3407c, 0x03bfcf34, 0x0027c79c}}}, + {X: Field{[10]uint32{0x03ca8fe4, 0x0079151c, 0x02444f4f, 0x003845f6, 0x010619b7, 0x00205abc, 0x0236161d, 0x02370d2e, 0x002e32dc, 0x0010b2b4}}, Y: Field{[10]uint32{0x02e75568, 0x00a2a30d, 0x013c6651, 0x01fb7496, 0x0279e59d, 0x038440c6, 0x030823df, 0x0273fe21, 0x01345a25, 0x0025f2c8}}}, + {X: Field{[10]uint32{0x018ff8c7, 0x00f00f2e, 0x021f6d47, 0x015b22e7, 0x03483317, 0x00a877ea, 0x006644a6, 0x014b18a6, 0x01304f06, 0x00262a24}}, Y: Field{[10]uint32{0x01a824e8, 0x0190003a, 0x00733988, 0x02b5ecaa, 0x00b277e0, 0x00d2b521, 0x0249b3e5, 0x01a40e72, 0x02cecc50, 0x00304c3c}}}, + {X: Field{[10]uint32{0x038a4328, 0x00274bb7, 0x0345522c, 0x00a1af5e, 0x00d7a4a1, 0x021100ec, 0x03d39ff2, 0x018aa9ef, 0x00760847, 0x0008f117}}, Y: Field{[10]uint32{0x03303cde, 0x01e5522e, 0x0350af0d, 0x01d3fc30, 0x02d57cb2, 0x02c350f7, 0x0146dc7c, 0x01bd1f0f, 0x031795c4, 0x003d2adc}}}, + {X: Field{[10]uint32{0x0221d856, 0x0313431a, 0x02d343a6, 0x020c4236, 0x019e6a7b, 0x02f4df0d, 0x01416f2d, 0x0313cbd9, 0x0037d584, 0x0022dc00}}, Y: Field{[10]uint32{0x0365ca35, 0x03f1dab0, 0x00c2becd, 0x03d830c9, 0x025a172c, 0x0245a7e6, 0x00e7d866, 0x0019b53a, 0x00039ed0, 0x0020dc7b}}}, + {X: Field{[10]uint32{0x030f8a7b, 0x025f66a8, 0x00596cdb, 0x03a142ba, 0x00004f4a, 0x020fa060, 0x01d78f20, 0x01044728, 0x00a8d0fb, 0x00369859}}, Y: Field{[10]uint32{0x029a342d, 0x02e9208a, 0x0307fc7a, 0x02871e20, 0x011cc0b5, 0x00304440, 0x03caf4e1, 0x013c5e9d, 0x0063717e, 0x0003e6a1}}}, + {X: Field{[10]uint32{0x035fd6b7, 0x00b51f7a, 0x010fa220, 0x038a7980, 0x02c45924, 0x01b6df5f, 0x029b9c20, 0x02953464, 0x0165a9d1, 0x00127cdf}}, Y: Field{[10]uint32{0x006aa51e, 0x01df79da, 0x03a94ca6, 0x0256c6fb, 0x0201e648, 0x00d03050, 0x010dbba9, 0x0098a5ef, 0x038528f6, 0x003e6e6d}}}, + {X: Field{[10]uint32{0x036efa10, 0x03a714f8, 0x037ccb38, 0x00dcc219, 0x0312d808, 0x0286262a, 0x0256b78b, 0x01668006, 0x0088e268, 0x0021d57c}}, Y: Field{[10]uint32{0x02f7e478, 0x037dd7db, 0x029a9de5, 0x02a7cbda, 0x02434906, 0x0157e0fd, 0x01b4768f, 0x01ea2085, 0x013d1eec, 0x001759c0}}}, + {X: Field{[10]uint32{0x0209045c, 0x03fdddf1, 0x00534069, 0x00d2849f, 0x01a4e6d1, 0x028d7820, 0x03550fc5, 0x029b761c, 0x0396b7ab, 0x000d4c85}}, Y: Field{[10]uint32{0x00a1e832, 0x004059fc, 0x028ba6fe, 0x0072d277, 0x03c5c830, 0x03c7844c, 0x017a6804, 0x00fd3bc6, 0x0343efa9, 0x0011ffc3}}}, + {X: Field{[10]uint32{0x012559b3, 0x03a6b398, 0x0342156f, 0x03b37cac, 0x0283479f, 0x00a08ed0, 0x03ab5ea0, 0x034aef9d, 0x012b644b, 0x000eafb7}}, Y: Field{[10]uint32{0x01e32b06, 0x0216c879, 0x0008f179, 0x03e8cc39, 0x0287bbcc, 0x0078cda6, 0x01824ba1, 0x02e0604c, 0x008e6c13, 0x00109a6c}}}, + {X: Field{[10]uint32{0x00956de8, 0x0263ff1f, 0x03f775be, 0x033249e1, 0x03c14b62, 0x038c9df5, 0x003dc530, 0x0118aaa0, 0x02a22c23, 0x0038c044}}, Y: Field{[10]uint32{0x0098da40, 0x02b4da52, 0x0368a8d2, 0x01b761a4, 0x0199d90f, 0x024f9d60, 0x01f4e0ff, 0x003a2dea, 0x03d0dbb1, 0x003431f8}}}, + {X: Field{[10]uint32{0x033cd06b, 0x01cfd6e5, 0x03762f10, 0x01efc274, 0x03bcdf49, 0x02496440, 0x0147f6cb, 0x012d3cc3, 0x0058439c, 0x00018942}}, Y: Field{[10]uint32{0x0075328e, 0x01adc854, 0x0102ecd2, 0x00c0bf32, 0x0387e4c9, 0x02c390e0, 0x004407af, 0x01096156, 0x01e484ce, 0x000d0dfd}}}, + {X: Field{[10]uint32{0x00f826ea, 0x00e6b5a2, 0x0209bdcb, 0x0143ec5b, 0x0366838d, 0x003a4f8f, 0x0104bc39, 0x0133e93a, 0x0085b8c9, 0x001deb51}}, Y: Field{[10]uint32{0x006001d4, 0x02e6efe0, 0x02b736b0, 0x02d5216e, 0x0334c2ec, 0x0143b0f0, 0x03c84447, 0x021e784d, 0x005a9798, 0x00136f14}}}, + {X: Field{[10]uint32{0x02c0b7db, 0x01e4664e, 0x0066cad5, 0x033eb104, 0x003852b8, 0x02a399f9, 0x01ce3377, 0x018076e7, 0x0292e413, 0x0017734f}}, Y: Field{[10]uint32{0x00e997c9, 0x01d532e9, 0x03f85417, 0x034358d9, 0x0336996e, 0x0309e3df, 0x02760ede, 0x02d0e8c1, 0x008135ef, 0x002b3334}}}, + {X: Field{[10]uint32{0x02ff788d, 0x0309fd72, 0x01737fc8, 0x021457d6, 0x01e65ca3, 0x02e4c614, 0x01d2e6b9, 0x00147f10, 0x023badce, 0x000e8999}}, Y: Field{[10]uint32{0x00abc2bb, 0x017e26e4, 0x00113bab, 0x02e0222a, 0x009b9db0, 0x01c9cb2d, 0x030110e0, 0x03611801, 0x02abaf01, 0x000b591f}}}, + {X: Field{[10]uint32{0x00b1aec0, 0x02c025b9, 0x03ac4b8b, 0x00081419, 0x034e3b0f, 0x000900c7, 0x02fe9c2c, 0x0263f1c4, 0x02b951dc, 0x003d5f33}}, Y: Field{[10]uint32{0x03a1ea25, 0x037cc06d, 0x03bca9c4, 0x01b50e29, 0x03ddb2c6, 0x020be67e, 0x03514557, 0x03afb429, 0x03eb7a8a, 0x001a5824}}}, + {X: Field{[10]uint32{0x029b4a0c, 0x022501af, 0x029b0935, 0x00e8b6ee, 0x02df47c8, 0x0123334d, 0x01bd46c9, 0x01b8502f, 0x0378bca0, 0x002a2691}}, Y: Field{[10]uint32{0x02f366cf, 0x03e7a85b, 0x030d1d23, 0x03b7567c, 0x02939d69, 0x039e079b, 0x0398e2e4, 0x0098b48a, 0x01d69d08, 0x003d0893}}}, + {X: Field{[10]uint32{0x00b962a9, 0x00196e04, 0x01d72adf, 0x00bee8a5, 0x036a3be9, 0x03fc129b, 0x0063f4c7, 0x02091cad, 0x038184fe, 0x00191ce0}}, Y: Field{[10]uint32{0x02ce32de, 0x00dc2680, 0x010bbc97, 0x03e8c900, 0x009ba164, 0x01600134, 0x029d58dd, 0x01ba4d3f, 0x00c0d09f, 0x002f3440}}}, + {X: Field{[10]uint32{0x02dc7774, 0x033fea8e, 0x026866c7, 0x0132bf57, 0x02f7bcaa, 0x027e1c9e, 0x00196bad, 0x0078a0b8, 0x02382126, 0x00129a0e}}, Y: Field{[10]uint32{0x014ff3b0, 0x024cde25, 0x00f202cc, 0x01c6c6e5, 0x01913af3, 0x017d03fb, 0x0337f0b1, 0x026a90e6, 0x00d0ec3d, 0x002d6ae9}}}, + {X: Field{[10]uint32{0x035cb3c7, 0x030b96ae, 0x0296f53c, 0x011b9080, 0x0053fee0, 0x023b8585, 0x02cfd9eb, 0x0333510d, 0x016efdae, 0x00040978}}, Y: Field{[10]uint32{0x00c48f3b, 0x0051003c, 0x011c2253, 0x0360ef58, 0x030704e4, 0x023ce3dc, 0x019b8075, 0x024a8f85, 0x016b67ce, 0x003e01ae}}}, + {X: Field{[10]uint32{0x036650d2, 0x038ab1b6, 0x000e4552, 0x02cd6821, 0x0360039c, 0x03d9ddf1, 0x022217b7, 0x014d4dbf, 0x0009675a, 0x00185276}}, Y: Field{[10]uint32{0x01a96ca9, 0x0151416c, 0x03a11681, 0x03ca78e5, 0x02c72f07, 0x0344bde1, 0x009b03fb, 0x0022a93d, 0x036c9a98, 0x00392b98}}}, + {X: Field{[10]uint32{0x03fec47f, 0x00507530, 0x03047d8c, 0x036d3581, 0x032fff3e, 0x02ec0f74, 0x02e83274, 0x020d0953, 0x01124388, 0x0002e890}}, Y: Field{[10]uint32{0x02d5c35e, 0x0190376e, 0x0366d0aa, 0x025e7430, 0x013717e9, 0x034a3228, 0x026a18de, 0x03f374e3, 0x012329c3, 0x00229afc}}}, + {X: Field{[10]uint32{0x0056a961, 0x001a239e, 0x00993219, 0x014252b5, 0x0035c005, 0x00e2bd54, 0x03aa2595, 0x02b1fa76, 0x00963c7c, 0x0030837c}}, Y: Field{[10]uint32{0x0245d40a, 0x0120d7ec, 0x0033bad8, 0x010aba9f, 0x00fb4f2c, 0x0296242e, 0x038dd8d6, 0x01eba616, 0x015d16cf, 0x001247a6}}}, + {X: Field{[10]uint32{0x03af0c50, 0x01912753, 0x032a50c7, 0x022c6d32, 0x01aac9f3, 0x00f74bb0, 0x02f3dcb9, 0x0135cb67, 0x00ca4dbb, 0x001bd4f6}}, Y: Field{[10]uint32{0x027ae24a, 0x0221a1d3, 0x02e12f78, 0x030c9f2b, 0x0077bbec, 0x0219d4f0, 0x0156de24, 0x02fadc90, 0x002df449, 0x0019e128}}}, + {X: Field{[10]uint32{0x037bdda3, 0x005dc49c, 0x006b3513, 0x003e3b2a, 0x036364ae, 0x0211d5fa, 0x008a0461, 0x023d8147, 0x00bd71a0, 0x00395f9e}}, Y: Field{[10]uint32{0x00385342, 0x025db43d, 0x00e8f116, 0x018ca3b0, 0x0231a1d2, 0x029dd553, 0x0116c82d, 0x017d995c, 0x007e8a53, 0x0028188f}}}, + {X: Field{[10]uint32{0x03ab099a, 0x03a5f13d, 0x03fff285, 0x03869b97, 0x037853e8, 0x01f2d4e9, 0x00abd0ea, 0x025aae78, 0x0329aad4, 0x003d4bdb}}, Y: Field{[10]uint32{0x019d55a3, 0x02588115, 0x028e0b71, 0x00706629, 0x01c36151, 0x01bca657, 0x01de4b76, 0x017a062d, 0x01fc6d5c, 0x000f7df0}}}, + {X: Field{[10]uint32{0x02fb0dc3, 0x020da9cf, 0x01fe259f, 0x02362f59, 0x02ec5cf0, 0x00cf6721, 0x0326268b, 0x01b425be, 0x01fb5c0a, 0x00369d3d}}, Y: Field{[10]uint32{0x00a62c47, 0x0281ea52, 0x03f3effe, 0x00c4d508, 0x018d0ea0, 0x00a947b7, 0x031c8164, 0x00a11df8, 0x0189de5e, 0x001f943a}}}, + {X: Field{[10]uint32{0x0051f4ff, 0x00de9938, 0x02ed8a23, 0x00533f4f, 0x0035d144, 0x02a74b7a, 0x0341d359, 0x01485c3c, 0x02a87bd4, 0x000a8b26}}, Y: Field{[10]uint32{0x0248a1ce, 0x01b1bbe5, 0x00bf8a46, 0x00856746, 0x01496882, 0x022bb27e, 0x01fd7e5d, 0x017da280, 0x01eb9933, 0x002fe7bf}}}, + {X: Field{[10]uint32{0x02022266, 0x02b58ca4, 0x0123b492, 0x03bc7aff, 0x037d13bc, 0x001f8b3c, 0x010da7db, 0x014c531b, 0x00b191dc, 0x000a8d10}}, Y: Field{[10]uint32{0x02ae2b40, 0x0398b4f8, 0x02fc6dd1, 0x03c8b0d3, 0x03e4c1e9, 0x021c1e51, 0x02fda24e, 0x028080bc, 0x00f5c993, 0x002f7b09}}}, + {X: Field{[10]uint32{0x010942a2, 0x01004278, 0x0081c287, 0x03ab54f4, 0x000e0acc, 0x01551140, 0x0136e8bd, 0x00dab7eb, 0x01743d1d, 0x0028ea6f}}, Y: Field{[10]uint32{0x00794ca0, 0x02ccd3fb, 0x0016b66d, 0x0013fdd7, 0x022cb711, 0x0286d305, 0x01ab1fce, 0x039f637b, 0x02cff8ca, 0x00330cf7}}}, + {X: Field{[10]uint32{0x00804950, 0x0254f462, 0x0170d308, 0x02b0ac23, 0x0380db7e, 0x01fd361f, 0x03dc7247, 0x03c84824, 0x008f70a2, 0x0016e0f5}}, Y: Field{[10]uint32{0x0248b545, 0x0352c510, 0x039c3030, 0x02d1fb54, 0x01982ecd, 0x0243f313, 0x01368d76, 0x019b0b84, 0x0088a10c, 0x003de301}}}, + {X: Field{[10]uint32{0x03e9736a, 0x0035dec2, 0x02c29414, 0x0258f1bf, 0x02d901ab, 0x021c76e3, 0x039e210a, 0x01288800, 0x02a56e3e, 0x003756d1}}, Y: Field{[10]uint32{0x0021d46b, 0x011f04f5, 0x008ceae6, 0x03be1e61, 0x009e7136, 0x0334d77e, 0x0052268c, 0x0116b0d7, 0x02baebdd, 0x00366ddb}}}, + {X: Field{[10]uint32{0x0361a6d3, 0x031b72cf, 0x00f6462c, 0x007c0de6, 0x03d1ff78, 0x00885025, 0x036bc5b2, 0x01849d88, 0x035a2548, 0x000bdd36}}, Y: Field{[10]uint32{0x03149c1c, 0x020f0254, 0x0248eca9, 0x011eb224, 0x03646471, 0x00c0536c, 0x01b868ea, 0x01b4bea4, 0x01ed256f, 0x002db58d}}}, + {X: Field{[10]uint32{0x03ab2e09, 0x016377c8, 0x030bec50, 0x009b7f92, 0x02119bff, 0x0378722e, 0x0240b8bf, 0x024e6961, 0x00c41f7c, 0x000cab70}}, Y: Field{[10]uint32{0x0146ae3f, 0x02ec374e, 0x0229366b, 0x020ce8d6, 0x0340beed, 0x02807645, 0x017772d2, 0x02ca5f5f, 0x02487f0b, 0x0033cc5c}}}, + {X: Field{[10]uint32{0x03c6cdce, 0x027cc061, 0x02ae936f, 0x02d6172c, 0x014e336c, 0x01d301fb, 0x02a152ed, 0x00b6a09c, 0x00a70017, 0x0013f94f}}, Y: Field{[10]uint32{0x01e3a8ce, 0x011ba620, 0x0084327e, 0x01c162e1, 0x02baf428, 0x00595e31, 0x00c29869, 0x00705887, 0x01c4bd71, 0x00207db4}}}, + {X: Field{[10]uint32{0x03b2569f, 0x02152367, 0x018ae63f, 0x001974f9, 0x023b08dc, 0x0137fb66, 0x02f316eb, 0x028a99c0, 0x00f5577f, 0x0018064d}}, Y: Field{[10]uint32{0x00f714cc, 0x001d340c, 0x03954362, 0x0243dab3, 0x0255e196, 0x00ec7c77, 0x0396f689, 0x03f5fed7, 0x00824360, 0x001b7df6}}}, + {X: Field{[10]uint32{0x0279d321, 0x00f03dea, 0x03129817, 0x0319e7e8, 0x03e1bec3, 0x03a7768b, 0x0092ee52, 0x0201b191, 0x03088ff4, 0x0001e769}}, Y: Field{[10]uint32{0x017f9a47, 0x02afa2c0, 0x0047ff90, 0x012ec382, 0x0344be73, 0x0348156b, 0x0167e8ab, 0x022128d4, 0x022976f2, 0x000ac7b2}}}, + {X: Field{[10]uint32{0x01262974, 0x0227739e, 0x011867e5, 0x032360e6, 0x015b8d4f, 0x02a2fda4, 0x0208b51c, 0x00a672f0, 0x0209c39f, 0x00180ae0}}, Y: Field{[10]uint32{0x027f5555, 0x03367695, 0x035f2267, 0x0016be43, 0x00a5ed1f, 0x01e46976, 0x02c43f94, 0x032a0daa, 0x00da05d7, 0x0003e2db}}}, + {X: Field{[10]uint32{0x020e53d1, 0x0144547f, 0x00232752, 0x001703e8, 0x010ff14c, 0x01399920, 0x02991e48, 0x0229b55c, 0x0368868a, 0x0015e93c}}, Y: Field{[10]uint32{0x023a0c6d, 0x03e95e04, 0x01a9efa1, 0x028ea8f9, 0x0353d52e, 0x03a593cb, 0x00e17869, 0x026e0cda, 0x007c5bc2, 0x00035b32}}}, + {X: Field{[10]uint32{0x0206db2a, 0x0122de1a, 0x02b54435, 0x00f96f4c, 0x02459906, 0x02c04b35, 0x004c5ae2, 0x03c441c3, 0x00f0ae9d, 0x0013e6d2}}, Y: Field{[10]uint32{0x015ea016, 0x03b7b5f7, 0x02a157bd, 0x0086fc62, 0x02980cd6, 0x01bf90ab, 0x03563ebf, 0x031e3d9b, 0x00fe3caf, 0x003569e8}}}, + {X: Field{[10]uint32{0x005e7375, 0x014ed7db, 0x007085a0, 0x02b4d778, 0x01e1910a, 0x022ed98f, 0x02615893, 0x00d27d11, 0x03084b11, 0x00391a94}}, Y: Field{[10]uint32{0x01183ce9, 0x029f4cb8, 0x03c479e1, 0x00afe9af, 0x02cb8c3d, 0x03c1eb38, 0x03923be9, 0x018cb7ef, 0x02889583, 0x003691b6}}}, + {X: Field{[10]uint32{0x01c071ea, 0x022e5880, 0x0267415c, 0x0358ad82, 0x00d62f2a, 0x03249410, 0x03e64de3, 0x005878c8, 0x0366b94b, 0x000d90f5}}, Y: Field{[10]uint32{0x0316fa98, 0x03c6d6e7, 0x01a967af, 0x013e0f4d, 0x0080835d, 0x00083db5, 0x029dcffa, 0x0278176c, 0x02f11f2b, 0x003ebda6}}}, + {X: Field{[10]uint32{0x03497dca, 0x03c6c6ef, 0x01478f6f, 0x01edfe8c, 0x00e6bea5, 0x01138177, 0x03e1b485, 0x0185486e, 0x02940c02, 0x00259da5}}, Y: Field{[10]uint32{0x03e30b03, 0x0209c0ac, 0x0293c407, 0x004b1d64, 0x038210fd, 0x0365f023, 0x033b033b, 0x02b85259, 0x02fd7d0d, 0x0013ad69}}}, + {X: Field{[10]uint32{0x01a24d07, 0x019f9996, 0x00ef65c8, 0x029bd04d, 0x007f80fd, 0x0104438a, 0x03e0ff4b, 0x0264c626, 0x01ef2c47, 0x0000b907}}, Y: Field{[10]uint32{0x0074c313, 0x0214c772, 0x01f52015, 0x03045d10, 0x0269bde3, 0x015bfece, 0x03a1f50e, 0x022c4a8e, 0x017bb838, 0x0009a853}}}, + {X: Field{[10]uint32{0x0003c29b, 0x00a1316b, 0x0037db7f, 0x03c2152a, 0x00db94cb, 0x007ad8f9, 0x004fbf77, 0x03f83a69, 0x001af6ea, 0x003ce765}}, Y: Field{[10]uint32{0x00bd7b73, 0x018b9ce3, 0x00183d8b, 0x00d300ec, 0x0072cd59, 0x001f812c, 0x001f8b55, 0x01344889, 0x03700dac, 0x0007ffb5}}}, + {X: Field{[10]uint32{0x00136419, 0x01d91254, 0x03d1c595, 0x0114a005, 0x011cdac0, 0x00b64189, 0x011f8dcc, 0x02fba824, 0x01344576, 0x00242403}}, Y: Field{[10]uint32{0x00161ad6, 0x00255a92, 0x01666b0c, 0x039bacd3, 0x001457ce, 0x028acb17, 0x00444980, 0x02040b68, 0x03bb2a33, 0x001834e2}}}, + {X: Field{[10]uint32{0x00ac2e06, 0x006944f6, 0x0109ee3e, 0x038e5ed9, 0x0244a523, 0x0074ade0, 0x0344226f, 0x03d298b9, 0x02271007, 0x000e9791}}, Y: Field{[10]uint32{0x00202449, 0x0089aeba, 0x01d90f75, 0x03f95ede, 0x010bcdfc, 0x029057cd, 0x016dee2f, 0x03f0fc09, 0x03c1074c, 0x00143c07}}}, + {X: Field{[10]uint32{0x03e24355, 0x02db0fc4, 0x02b87a06, 0x0162a3c3, 0x02b13ac2, 0x01bdb91a, 0x025492ef, 0x0047907a, 0x0256f6d7, 0x003d9ba8}}, Y: Field{[10]uint32{0x02243841, 0x0000c1c9, 0x010b57fa, 0x0281bcff, 0x028f32a2, 0x0303db4a, 0x02c24014, 0x03a9b21f, 0x00470980, 0x003ee287}}}, + {X: Field{[10]uint32{0x03038fa0, 0x009602f4, 0x022a85c6, 0x0216accd, 0x00c946a4, 0x031d0db4, 0x036d4ed6, 0x01b333ee, 0x012019a1, 0x0032b681}}, Y: Field{[10]uint32{0x03d32ae6, 0x03cb4841, 0x032032b5, 0x01c42bc3, 0x03421de9, 0x006b9ce4, 0x03069639, 0x010c92b1, 0x000a3480, 0x00389265}}}, + {X: Field{[10]uint32{0x03759cf1, 0x039d7eb2, 0x037122c4, 0x004d70b6, 0x02ce2084, 0x03760c2c, 0x03d51929, 0x01ca565a, 0x035e820b, 0x00345bd6}}, Y: Field{[10]uint32{0x02448ed8, 0x038de11a, 0x0349ce61, 0x021788a1, 0x036ecdd5, 0x01781451, 0x01363807, 0x02f35f77, 0x0084cfbe, 0x001c3b6c}}}, + {X: Field{[10]uint32{0x01f71535, 0x01444d35, 0x009a4847, 0x03275365, 0x013dc31a, 0x03199bcc, 0x02e51498, 0x02b8372d, 0x028ddc6b, 0x002ef333}}, Y: Field{[10]uint32{0x03f91eed, 0x03396b48, 0x03a6ea23, 0x01a02627, 0x01c8941f, 0x0239eefd, 0x031b4796, 0x024af949, 0x02fc63ff, 0x001369dc}}}, + {X: Field{[10]uint32{0x014243fe, 0x001854bb, 0x032915f6, 0x03e3a0da, 0x02e7d5d2, 0x01a087ae, 0x01e940d0, 0x01d710c9, 0x00f5cd8b, 0x001457ca}}, Y: Field{[10]uint32{0x03668b47, 0x00bc7118, 0x032a24ba, 0x0209bdf6, 0x00e1855a, 0x0208a496, 0x0209f466, 0x02e3f852, 0x03ccf5d2, 0x00284c50}}}, + {X: Field{[10]uint32{0x01233837, 0x03b61148, 0x03f79df6, 0x02d6e3f5, 0x0068d356, 0x034e049e, 0x011ed6f9, 0x0118b61a, 0x02aea78c, 0x002f4bd1}}, Y: Field{[10]uint32{0x01c4af11, 0x02f5f21e, 0x00324b92, 0x02b98aae, 0x0284ddd9, 0x035f5bf8, 0x0332f70e, 0x0200fdfa, 0x02d3f3cc, 0x0023d917}}}, + {X: Field{[10]uint32{0x01e37dfa, 0x01f5977e, 0x0313347d, 0x034e4b83, 0x0004f8d7, 0x00046914, 0x0210b512, 0x008489a7, 0x013cc3d3, 0x00215dbc}}, Y: Field{[10]uint32{0x028b1a4f, 0x027640fd, 0x021958d1, 0x00a116d9, 0x0386ff90, 0x027bb7a2, 0x009eb8c1, 0x0384c48c, 0x00483fa0, 0x003eefc8}}}, + {X: Field{[10]uint32{0x0309db4a, 0x02327ce0, 0x0341a23b, 0x03cb4c73, 0x01763a83, 0x03c8d87f, 0x03f262ab, 0x01391f5c, 0x02918fdf, 0x001c2f87}}, Y: Field{[10]uint32{0x028bc573, 0x00fdc210, 0x0318829f, 0x032770fb, 0x03a1897a, 0x0224a50e, 0x013fa488, 0x01bbd030, 0x0175e424, 0x0020be01}}}, + {X: Field{[10]uint32{0x0341180f, 0x0193a452, 0x02361c80, 0x026848c4, 0x01017352, 0x028d4ebe, 0x0354a461, 0x01ad4e6f, 0x013d1d58, 0x002ee282}}, Y: Field{[10]uint32{0x03478269, 0x00d3616b, 0x0165e723, 0x01034887, 0x02287075, 0x033d779f, 0x028d66bc, 0x02894735, 0x02d78456, 0x00118383}}}, + {X: Field{[10]uint32{0x005c2e69, 0x0128492f, 0x018606dc, 0x0211d530, 0x027b976a, 0x001c7e87, 0x03306287, 0x006533d2, 0x024f34d9, 0x001e05eb}}, Y: Field{[10]uint32{0x00d55cbc, 0x02f9774b, 0x02d7b481, 0x00303e12, 0x006afe1c, 0x013e2cd0, 0x02ed346e, 0x02c6d6f1, 0x0056c4e3, 0x00097d3b}}}, + {X: Field{[10]uint32{0x0366abcc, 0x03fb446f, 0x009a5bcc, 0x03c49cd3, 0x03e72af5, 0x00396ed7, 0x02ed8e2a, 0x0167e9bf, 0x00dc411f, 0x002171d8}}, Y: Field{[10]uint32{0x03cb8cc4, 0x019ac9b2, 0x028ad106, 0x00399403, 0x0389a891, 0x00e99f96, 0x00f12482, 0x0271c6fc, 0x01b0b57c, 0x0024960f}}}, + {X: Field{[10]uint32{0x015086c3, 0x0206af17, 0x0179ad4c, 0x008d1faa, 0x03d9ee71, 0x0079cdde, 0x00739e3b, 0x01d8bfcb, 0x01354d9d, 0x00083603}}, Y: Field{[10]uint32{0x02f0efe5, 0x01077dd8, 0x01cf7489, 0x01ac6c89, 0x010ef6ed, 0x03c4d46d, 0x0123b7f1, 0x0299d7a0, 0x017b8017, 0x001b8647}}}, + {X: Field{[10]uint32{0x01ba5657, 0x0370f83f, 0x00fde086, 0x03f25c24, 0x00ec26ce, 0x004a2601, 0x036d9c8d, 0x0312c197, 0x022d43f2, 0x000cc1a4}}, Y: Field{[10]uint32{0x03c7efc4, 0x01970c04, 0x00d881b8, 0x01067e1f, 0x0186f0e9, 0x02871019, 0x039f76ef, 0x035eb1c1, 0x009fc93d, 0x00262a33}}}, + {X: Field{[10]uint32{0x032fb001, 0x0379b1ce, 0x01fc18ac, 0x02b02c21, 0x018a1b9a, 0x02488da0, 0x00f77033, 0x01fc4910, 0x019754d3, 0x002cd71d}}, Y: Field{[10]uint32{0x03cd649d, 0x03dadd44, 0x01660a7a, 0x02d1be4f, 0x022ea789, 0x037d65a3, 0x0058ffb0, 0x02121657, 0x039069b0, 0x00001212}}}, + {X: Field{[10]uint32{0x034e1f33, 0x03c25d51, 0x0158786e, 0x03e3a43f, 0x0205c647, 0x01648ac6, 0x009d0104, 0x030c0db3, 0x03537f8b, 0x0026f506}}, Y: Field{[10]uint32{0x030274ac, 0x0340ef2f, 0x013aec25, 0x01da3480, 0x018b8667, 0x03fce269, 0x0086bfe1, 0x03849769, 0x03f655ec, 0x001642be}}}, + {X: Field{[10]uint32{0x001ded42, 0x023c5815, 0x0020e527, 0x00e9cd65, 0x036950d9, 0x00e38372, 0x0289703a, 0x02bbc2f3, 0x032ca9b3, 0x000a8e99}}, Y: Field{[10]uint32{0x02693d8e, 0x03cee270, 0x02a5fc6a, 0x0033e22b, 0x02c95f85, 0x02d8aeac, 0x008ebef6, 0x00e0f6e4, 0x00b613f3, 0x00130ea5}}}, + {X: Field{[10]uint32{0x00f74d3d, 0x0250e096, 0x01bf6937, 0x017c5b71, 0x00c8db94, 0x014e01b7, 0x01f38003, 0x0253e353, 0x02f20a2d, 0x000c6e9a}}, Y: Field{[10]uint32{0x0329df5a, 0x008e3308, 0x03f4a236, 0x020b1509, 0x01fc1e6a, 0x0180d131, 0x01d915ef, 0x03ac72e9, 0x0102b290, 0x002b4677}}}, + {X: Field{[10]uint32{0x00869720, 0x004a54af, 0x01bb05bb, 0x0147a712, 0x00587c02, 0x02fd12a6, 0x030f9b8e, 0x0053c177, 0x01bd74b0, 0x003e8866}}, Y: Field{[10]uint32{0x0163f45e, 0x00b484ec, 0x0231a66d, 0x03bac7d5, 0x03041ab6, 0x018387a6, 0x035c4838, 0x03d7d2c3, 0x017d6efd, 0x0010ca24}}}, + {X: Field{[10]uint32{0x03e22d52, 0x011a6a62, 0x0199f30a, 0x000b8eff, 0x0108aaac, 0x024aad8f, 0x00f28476, 0x00f03d73, 0x0046c7f5, 0x00105ee4}}, Y: Field{[10]uint32{0x023b82c0, 0x0175a921, 0x008e0d49, 0x02a0ef6c, 0x007aede9, 0x005c1b80, 0x036eae69, 0x025e237f, 0x02655f30, 0x001e3057}}}, + {X: Field{[10]uint32{0x0318bc2a, 0x0390f55b, 0x00964f33, 0x026005c5, 0x026158f4, 0x01e9a7fe, 0x00e6eca6, 0x007f6228, 0x01f247d5, 0x0015ab24}}, Y: Field{[10]uint32{0x010680c7, 0x02c699b7, 0x02740c54, 0x02b89b9e, 0x00429bee, 0x01ee0719, 0x03c518b3, 0x00692dc5, 0x015c9e1b, 0x000d46df}}}, + {X: Field{[10]uint32{0x03215f8a, 0x001f594d, 0x00250685, 0x01c04324, 0x01e164ae, 0x002eafb2, 0x02d835aa, 0x01fbcc54, 0x02f88330, 0x002bae8c}}, Y: Field{[10]uint32{0x002c4e21, 0x038aba16, 0x0040fdcd, 0x031a9073, 0x037ce7e3, 0x0333be10, 0x03165577, 0x017cb9bf, 0x013935cf, 0x00235d1f}}}, + {X: Field{[10]uint32{0x01db5813, 0x035a0748, 0x03e63d47, 0x03ac3936, 0x0379ee10, 0x015bb411, 0x03d6bcc2, 0x00325da4, 0x02199af0, 0x0010b1ec}}, Y: Field{[10]uint32{0x0219378f, 0x012196ec, 0x03c75c3c, 0x01747f3d, 0x02a5fd87, 0x0225610c, 0x0244a4df, 0x031f2cb3, 0x03081fb1, 0x002857ed}}}, + {X: Field{[10]uint32{0x024e5d98, 0x02845b68, 0x01e2c36c, 0x0288270e, 0x0225e0db, 0x006f357f, 0x03fe19d0, 0x0196a222, 0x0297ecf3, 0x0010cdec}}, Y: Field{[10]uint32{0x0242b7ad, 0x01056ec8, 0x01722915, 0x022f2736, 0x0328d1ef, 0x0381b6dc, 0x00833485, 0x007b6f2f, 0x03abc654, 0x001271c8}}}, + {X: Field{[10]uint32{0x03f857bf, 0x0066876d, 0x02f84a25, 0x00949f93, 0x00aeefbf, 0x02e12c94, 0x028af0ce, 0x024cb3a5, 0x00761481, 0x00062663}}, Y: Field{[10]uint32{0x02c97fa2, 0x03204a09, 0x01ba39b7, 0x015342fe, 0x00911330, 0x03cca274, 0x02c9ae77, 0x02110d72, 0x00856451, 0x001157af}}}, + {X: Field{[10]uint32{0x02a49b2b, 0x02e256c1, 0x0188e69c, 0x01907995, 0x0387767b, 0x02ff62d3, 0x010516f1, 0x015ca816, 0x0320fa24, 0x001931d8}}, Y: Field{[10]uint32{0x00b9603f, 0x03fa33dd, 0x01395d39, 0x022a1e67, 0x0178366c, 0x01a097b0, 0x03ae76f8, 0x01425680, 0x02a5c479, 0x00028e68}}}, + {X: Field{[10]uint32{0x012b0ad7, 0x034efd20, 0x004e1ebb, 0x028ceced, 0x02dea917, 0x031bc4a9, 0x03a5f2d3, 0x02e1f296, 0x0005e35e, 0x0010595d}}, Y: Field{[10]uint32{0x01ff815d, 0x02375be5, 0x034916b6, 0x0170825a, 0x034d0ed7, 0x02b732d4, 0x037fe787, 0x0114ad15, 0x01ae36f1, 0x0023885a}}}, + {X: Field{[10]uint32{0x00391f6e, 0x01b8c370, 0x00cb68b7, 0x00440b04, 0x017bfd4a, 0x03d298c5, 0x02110c80, 0x012e245b, 0x03a3768a, 0x002a8803}}, Y: Field{[10]uint32{0x0184695b, 0x00d4d3a9, 0x02fde7fb, 0x0351a416, 0x00c49b79, 0x01f4662a, 0x02c898bd, 0x0055577f, 0x015928b2, 0x00159ef6}}}, + {X: Field{[10]uint32{0x03131599, 0x03e6ee9d, 0x00966555, 0x035a7961, 0x03eb529b, 0x02327188, 0x003ba48c, 0x00bd52e1, 0x0328841d, 0x001ea9e0}}, Y: Field{[10]uint32{0x01f698ed, 0x0112bcda, 0x003ba1bb, 0x0118a696, 0x01327112, 0x0138bdbc, 0x01a7e7a6, 0x011e2c93, 0x0315e4b8, 0x001ad289}}}, + {X: Field{[10]uint32{0x016969a1, 0x00d11d4e, 0x01fdfdae, 0x013d92ef, 0x0248446b, 0x01e3eeef, 0x019234fc, 0x019ffc11, 0x03bd6a27, 0x00252c69}}, Y: Field{[10]uint32{0x011cc33d, 0x03a233e6, 0x0054fdf1, 0x01e3a2e2, 0x02e77e21, 0x02e6a907, 0x029320a8, 0x02a1c774, 0x01ef2273, 0x0023cc19}}}, + {X: Field{[10]uint32{0x0126573a, 0x036633b5, 0x0071035f, 0x01c4de8d, 0x005407df, 0x01a07830, 0x00c8cb27, 0x03afd4a5, 0x03a71bfe, 0x001ae55e}}, Y: Field{[10]uint32{0x022724a0, 0x03f6e21e, 0x037f4583, 0x003b0297, 0x0235c6df, 0x03bed424, 0x01cd4ff6, 0x0214f179, 0x008d3fc1, 0x0019f920}}}, + {X: Field{[10]uint32{0x03717f7f, 0x029a4590, 0x01cb2b8a, 0x02da02f6, 0x03f9a6df, 0x02c7f2ca, 0x0293892a, 0x010400ef, 0x03300ea3, 0x0022c9d0}}, Y: Field{[10]uint32{0x0198db90, 0x02bebc5e, 0x00da3c99, 0x02a82727, 0x014ed141, 0x0271c4e2, 0x027f8284, 0x01620f98, 0x02bb7785, 0x00153e8a}}}, + {X: Field{[10]uint32{0x0358db05, 0x0117899e, 0x012e75d1, 0x01c92668, 0x033b6863, 0x01eb1997, 0x01274de7, 0x008ce524, 0x039b6736, 0x0034fd93}}, Y: Field{[10]uint32{0x01a52449, 0x00a81432, 0x0310e5c8, 0x01410060, 0x009bea58, 0x02267eaa, 0x01284f43, 0x0057d051, 0x02c852bd, 0x00301845}}}, + {X: Field{[10]uint32{0x0237ba79, 0x03ad557c, 0x00d4bc4a, 0x007a006d, 0x02870d07, 0x0243de57, 0x03b92803, 0x010ca406, 0x02f8ce0e, 0x00066249}}, Y: Field{[10]uint32{0x02b3d34e, 0x00fc81b4, 0x01d76a83, 0x03411523, 0x035d6c10, 0x00373c43, 0x027658fa, 0x001f9d78, 0x03d95b8d, 0x001d8496}}}, + {X: Field{[10]uint32{0x0301a13f, 0x032962f3, 0x003099ad, 0x03f1be1e, 0x00ee4358, 0x03770961, 0x0346cfb6, 0x014be0e5, 0x014d5951, 0x000006ef}}, Y: Field{[10]uint32{0x038d7733, 0x01fa7f37, 0x016e0b58, 0x03f13c21, 0x03ebdc70, 0x03797af7, 0x003cdfe3, 0x0317a9c2, 0x00deccea, 0x00063d4d}}}, + {X: Field{[10]uint32{0x01a3132a, 0x00b89d7d, 0x0398c131, 0x01fc876c, 0x03005245, 0x008089a4, 0x00b551f5, 0x0249c8df, 0x0345b263, 0x00221cdf}}, Y: Field{[10]uint32{0x00c496ed, 0x0285e778, 0x020290b2, 0x03fb256a, 0x02e3e61c, 0x006e8317, 0x01a7b222, 0x0387a12c, 0x032c2895, 0x001e6959}}}, + {X: Field{[10]uint32{0x00cb1e83, 0x03852ff3, 0x02252004, 0x01f91b9e, 0x012d6849, 0x03f873ea, 0x00ca35e8, 0x01ddccd3, 0x018b1f27, 0x0032fcf8}}, Y: Field{[10]uint32{0x02bc3f99, 0x03d72521, 0x029a401f, 0x01c249ae, 0x007b91f7, 0x03c91d23, 0x01d242a5, 0x0115b0f2, 0x039565bd, 0x0036c030}}}, + {X: Field{[10]uint32{0x03022f70, 0x00699071, 0x0093c40b, 0x00809c82, 0x008ab65b, 0x00aa4ea6, 0x01c88467, 0x03beb97e, 0x030cf186, 0x00201c3b}}, Y: Field{[10]uint32{0x027bd9e5, 0x02762044, 0x018caa24, 0x014e9d17, 0x00cc85c8, 0x021ff60e, 0x0024cf5a, 0x01a8151a, 0x01b04694, 0x0036a601}}}, + {X: Field{[10]uint32{0x03f71eab, 0x021a6030, 0x03e21902, 0x02d88490, 0x035c57dc, 0x022dbf88, 0x00c50640, 0x0176efa1, 0x004b8fa4, 0x002b2be6}}, Y: Field{[10]uint32{0x00eb278e, 0x02cef44b, 0x010b5d1d, 0x0077c5f7, 0x03801b8c, 0x02eb8a41, 0x004dfb0b, 0x03e8bbc5, 0x00168259, 0x0011bd3b}}}, + {X: Field{[10]uint32{0x03fdc965, 0x036a5c7e, 0x000994ee, 0x01494a91, 0x01e89162, 0x015f8f49, 0x01e8a32a, 0x03b3a9cd, 0x020591f9, 0x0000a24e}}, Y: Field{[10]uint32{0x03cfbb6a, 0x02c5681e, 0x012a18c3, 0x03082abc, 0x01372aa6, 0x03edf495, 0x02b5186e, 0x02c48c04, 0x014191e4, 0x001ba8a6}}}, + {X: Field{[10]uint32{0x02be951d, 0x016d9130, 0x01b39dc0, 0x002963c4, 0x00cfccab, 0x03b44b7c, 0x0126e285, 0x032d8272, 0x023168f0, 0x001925d1}}, Y: Field{[10]uint32{0x01eafb7c, 0x0012268c, 0x03406016, 0x02a705e2, 0x03d432b5, 0x03c94271, 0x004bb219, 0x0217890d, 0x001b2fa8, 0x003a9d06}}}, + {X: Field{[10]uint32{0x021faeef, 0x03c3a22e, 0x006e2d1b, 0x007174ea, 0x01091862, 0x0260440e, 0x014f7c20, 0x025322cb, 0x003e5133, 0x002e4e11}}, Y: Field{[10]uint32{0x0353fc85, 0x021f6bf0, 0x01be0963, 0x03226d9a, 0x00c52473, 0x017fe505, 0x0384f384, 0x02190941, 0x02a8c7d9, 0x002bd1fc}}}, + {X: Field{[10]uint32{0x012a5320, 0x01b6b167, 0x03b8d42f, 0x02333da6, 0x0124f475, 0x01d8d1ae, 0x00fd4a78, 0x03d43a7e, 0x0245ad10, 0x002f47b8}}, Y: Field{[10]uint32{0x00039605, 0x021cd238, 0x01518af7, 0x010d92ce, 0x00134ce4, 0x013ffa4b, 0x02477ac7, 0x02235709, 0x023e069d, 0x001ddb8b}}}, + {X: Field{[10]uint32{0x0260650f, 0x0277d0f1, 0x006a97d4, 0x00819e92, 0x036d8e13, 0x009e763e, 0x027dc054, 0x02157c5f, 0x0068805e, 0x00032dfb}}, Y: Field{[10]uint32{0x029e903c, 0x0393f608, 0x01b5a91c, 0x00e5b496, 0x01b12d73, 0x01c5497f, 0x03302eb0, 0x01040c47, 0x00b284c0, 0x003d41e4}}}, + {X: Field{[10]uint32{0x0330cf83, 0x004846ea, 0x02a15e1c, 0x0057ef78, 0x031968c6, 0x03213369, 0x0222a1c7, 0x02ed68a7, 0x037e0aff, 0x003bc1f3}}, Y: Field{[10]uint32{0x00ef574f, 0x0310971c, 0x01979815, 0x01789616, 0x002ca556, 0x013203cb, 0x03fc2fee, 0x00c35040, 0x02c94226, 0x00263d29}}}, + {X: Field{[10]uint32{0x027b8fc6, 0x0309ab4f, 0x027814ee, 0x01902189, 0x0113dc50, 0x0045003c, 0x00e4ca0d, 0x03316733, 0x01484d7f, 0x0013ff06}}, Y: Field{[10]uint32{0x03b75aa9, 0x013961df, 0x0266961b, 0x038e4dfb, 0x02d94b65, 0x03721fc4, 0x01ac1075, 0x00f60f2d, 0x020798ff, 0x002fa7af}}}, + {X: Field{[10]uint32{0x01d18396, 0x035a2f18, 0x01b63b4e, 0x01acb693, 0x00fad1ad, 0x0318dc6c, 0x00df0efa, 0x03524ee3, 0x0373339e, 0x0032f754}}, Y: Field{[10]uint32{0x02bdb13f, 0x02fe86b5, 0x025fac77, 0x035f200f, 0x003784a7, 0x01c2704c, 0x0138b6ff, 0x00b51c7d, 0x0087c321, 0x00149f79}}}, + {X: Field{[10]uint32{0x027cb5d2, 0x01efd6f1, 0x01fed65e, 0x02838c0d, 0x014e650a, 0x03800fe6, 0x03f6b065, 0x035fa76d, 0x032bd8a1, 0x003a80d6}}, Y: Field{[10]uint32{0x003761c4, 0x01918223, 0x00edddbc, 0x0258a8ec, 0x032cd57e, 0x03fa071a, 0x0372e91a, 0x03d22219, 0x03702219, 0x002bb2d0}}}, + {X: Field{[10]uint32{0x01f8db89, 0x02a3bd66, 0x010cd99b, 0x03da407b, 0x02911648, 0x00b50ff6, 0x029dda6b, 0x00902b5b, 0x03d6c1d6, 0x00378693}}, Y: Field{[10]uint32{0x004da03e, 0x0088faa2, 0x012cd3a4, 0x02c4150b, 0x02f85f90, 0x01c78b98, 0x00a60853, 0x03fd0747, 0x00d161c0, 0x003bff25}}}, + {X: Field{[10]uint32{0x02a076ed, 0x033d6df9, 0x037f0e58, 0x022bc03e, 0x00d75e11, 0x02f3ffaf, 0x02157878, 0x01fb5b84, 0x0141e8d8, 0x000b9910}}, Y: Field{[10]uint32{0x0334b8d2, 0x03a03ff2, 0x005b7320, 0x0037d97e, 0x02b45c24, 0x009b48b0, 0x00a70110, 0x018b61ae, 0x00ddf2ba, 0x0012aa16}}}, + {X: Field{[10]uint32{0x01b73a33, 0x0220ecdc, 0x01c3e956, 0x01e4b49d, 0x0247ff88, 0x023cb4a3, 0x03b78ad0, 0x02e1e243, 0x006a90d6, 0x000e110e}}, Y: Field{[10]uint32{0x0365cd18, 0x03f51d2c, 0x0157c714, 0x015fc5f3, 0x01ff2845, 0x032a3ba2, 0x036bde12, 0x012701d7, 0x03121a81, 0x003dfd77}}}, + {X: Field{[10]uint32{0x00358e42, 0x03a5bc1d, 0x03ae8ff7, 0x0382eacb, 0x01bde185, 0x02ba080f, 0x0218cd89, 0x034d88ad, 0x03321b91, 0x00387fa6}}, Y: Field{[10]uint32{0x01f3e1c4, 0x00ded2b7, 0x021d5f85, 0x0192b2ae, 0x02cef4f0, 0x00afca9d, 0x01eff10f, 0x004cba89, 0x02901797, 0x0031643f}}}, + {X: Field{[10]uint32{0x027a3c0b, 0x01c9f12c, 0x00a499cc, 0x03b68782, 0x00aefbbd, 0x016262bc, 0x020144d4, 0x036086da, 0x00da2f57, 0x00158280}}, Y: Field{[10]uint32{0x0395e208, 0x00044ab9, 0x02eaaa8b, 0x018d36ef, 0x025db86d, 0x020ec54b, 0x00b79ff9, 0x004ddcef, 0x024e39db, 0x001921d3}}}, + {X: Field{[10]uint32{0x0379094d, 0x02ecbcbc, 0x011dce5c, 0x0076f433, 0x001afe9b, 0x015b8a05, 0x03164248, 0x0378ab06, 0x03a77ec8, 0x0027ccfe}}, Y: Field{[10]uint32{0x02fe94b0, 0x02c2a709, 0x0384892f, 0x0366fff8, 0x01d972ab, 0x0177b358, 0x0034f19b, 0x038a9c98, 0x00d81838, 0x0025f2e3}}}, + {X: Field{[10]uint32{0x02d7a1b9, 0x01411f9c, 0x01226da7, 0x014f81a8, 0x01e46ee2, 0x02833ec5, 0x039da042, 0x01d44923, 0x03a82405, 0x0026208b}}, Y: Field{[10]uint32{0x02b19285, 0x00f7c53f, 0x00cc2a55, 0x013339f1, 0x03db975d, 0x03e5643c, 0x01475611, 0x0152b369, 0x023507bc, 0x000fa7ba}}}, + {X: Field{[10]uint32{0x001dbd88, 0x021a81ab, 0x0307cc40, 0x0179f885, 0x03bc7287, 0x00bc3e12, 0x01883273, 0x01c9a1ab, 0x01ac4b75, 0x002e0534}}, Y: Field{[10]uint32{0x00f18a98, 0x0114a640, 0x01c36cf1, 0x03fc635a, 0x00c03462, 0x0129ee2a, 0x01b8ab3c, 0x02848900, 0x00883749, 0x002d8d91}}}, + {X: Field{[10]uint32{0x01043e97, 0x00f068af, 0x00cd8623, 0x010a170a, 0x03b39cf8, 0x03b677f3, 0x039f7b7e, 0x0044f334, 0x00c41e42, 0x00091921}}, Y: Field{[10]uint32{0x039552d3, 0x01fd743a, 0x00502387, 0x03ad1294, 0x0280f431, 0x0342dd79, 0x01d36f79, 0x02f76010, 0x01b02e31, 0x003cd409}}}, + {X: Field{[10]uint32{0x0351db91, 0x02bee63f, 0x0358e847, 0x00902474, 0x03bbe8c5, 0x00a13930, 0x03fff0e4, 0x02cbb361, 0x03657b41, 0x0027ccc0}}, Y: Field{[10]uint32{0x02d5e70d, 0x03d0cddc, 0x03dad317, 0x0305d584, 0x01adf519, 0x013df339, 0x0176a43d, 0x0221c378, 0x03cb221c, 0x0012e69e}}}, + {X: Field{[10]uint32{0x01529d25, 0x02e6f2a7, 0x0161c225, 0x01452c58, 0x02b0e719, 0x03d69370, 0x035623a8, 0x010cf017, 0x029b3c75, 0x0030b9e3}}, Y: Field{[10]uint32{0x039079bb, 0x02228f2a, 0x001b9505, 0x00ab5891, 0x03e79436, 0x02c928b8, 0x0387b209, 0x01db2b18, 0x00f19383, 0x00079d72}}}, + {X: Field{[10]uint32{0x03695391, 0x0179aea9, 0x03f867ce, 0x00340a41, 0x022125c4, 0x01522bab, 0x01c9636b, 0x006df215, 0x02c4b6e8, 0x00224d03}}, Y: Field{[10]uint32{0x012c72c6, 0x030fa8de, 0x00671575, 0x02755492, 0x002b2a9c, 0x00f8af04, 0x01cc2c10, 0x01e5b77c, 0x014e263e, 0x003dce6a}}}, + {X: Field{[10]uint32{0x02629d22, 0x00aef8b5, 0x022daa7e, 0x00f63f63, 0x035d66a9, 0x034e29b0, 0x00facd48, 0x00f3081e, 0x0315f144, 0x0024813f}}, Y: Field{[10]uint32{0x0159c019, 0x00098e9d, 0x03253be1, 0x015609c9, 0x00131205, 0x00a4ffcf, 0x005020ec, 0x0143a588, 0x0075456b, 0x000ae77a}}}, + {X: Field{[10]uint32{0x03ff04d6, 0x031257ba, 0x0284d7ab, 0x03929ef5, 0x0261fad9, 0x00c97d77, 0x02b518dc, 0x00bf5f39, 0x02104112, 0x003c55b6}}, Y: Field{[10]uint32{0x01b631d4, 0x011a8380, 0x0170376e, 0x0135ce7d, 0x017f2c40, 0x000c6976, 0x03aa78d2, 0x02b7fb72, 0x00abf4f2, 0x0031cca5}}}, + {X: Field{[10]uint32{0x0280fa75, 0x01f6808c, 0x022659fa, 0x01549941, 0x022c379a, 0x001430d8, 0x00998616, 0x0104e84c, 0x017837d6, 0x001dc68b}}, Y: Field{[10]uint32{0x014c9aca, 0x0002c997, 0x030f66b6, 0x001356f1, 0x03e42703, 0x01b23746, 0x03ef0b0f, 0x007d6e0a, 0x039f5cfe, 0x0022daf0}}}, + {X: Field{[10]uint32{0x01a18f69, 0x0048d9a1, 0x004018e5, 0x003ac730, 0x01aec29f, 0x01039473, 0x03b52b1f, 0x00b167d8, 0x00e036bb, 0x00053356}}, Y: Field{[10]uint32{0x005e2006, 0x00323667, 0x0372ef27, 0x0279d1ac, 0x03ea15b1, 0x027a93a3, 0x00c72623, 0x011905d1, 0x00fded35, 0x001e7095}}}, + {X: Field{[10]uint32{0x028633f1, 0x03fc9ec6, 0x0343c22b, 0x03254ada, 0x02cd539c, 0x024299f7, 0x000bff13, 0x0001c960, 0x00770106, 0x00397d50}}, Y: Field{[10]uint32{0x01666367, 0x02c80a23, 0x00b5f4c3, 0x02a6c3d5, 0x0280274d, 0x026be281, 0x038e691f, 0x021b1d60, 0x02c39baa, 0x0035b871}}}, + {X: Field{[10]uint32{0x03429197, 0x03abe2b9, 0x003d75b8, 0x012cf4df, 0x03679134, 0x025a4f64, 0x03d14ba7, 0x0080dfef, 0x03429c07, 0x002c3aab}}, Y: Field{[10]uint32{0x037af26d, 0x0145c5a6, 0x00341510, 0x0209a8bc, 0x00bc2373, 0x000805c4, 0x0124d9bd, 0x006d953c, 0x021e4a17, 0x00035c99}}}, + {X: Field{[10]uint32{0x004d67c2, 0x03847998, 0x00e883c2, 0x00bb3d8b, 0x005380f9, 0x021393a8, 0x01573832, 0x036bb4d6, 0x030b044e, 0x003808b5}}, Y: Field{[10]uint32{0x01ab4143, 0x00ac4724, 0x01c7152d, 0x026cb0f7, 0x0207aed8, 0x0054fa70, 0x015228a3, 0x03b43451, 0x01d43ba0, 0x00108f15}}}, + {X: Field{[10]uint32{0x03c5ab5f, 0x02999692, 0x00651349, 0x036a7976, 0x03af1a3e, 0x02525446, 0x0270f07b, 0x02abc996, 0x033eb2ea, 0x0024a8b5}}, Y: Field{[10]uint32{0x000fa973, 0x01a04878, 0x0004992d, 0x00f16b0d, 0x0105f170, 0x00e8c98c, 0x0089fff5, 0x03495268, 0x00194794, 0x001124b5}}}, + {X: Field{[10]uint32{0x01b9cb30, 0x008d6a63, 0x0003ec96, 0x00b8fb98, 0x03b12f10, 0x01ea73ba, 0x035ac444, 0x002a733c, 0x02860de5, 0x0010d025}}, Y: Field{[10]uint32{0x0210bba9, 0x00b37713, 0x02cb037d, 0x0261fcc5, 0x03c8e1e8, 0x03671b22, 0x00e38adb, 0x00405e39, 0x0040952e, 0x000bde04}}}, + {X: Field{[10]uint32{0x0394cd12, 0x0282b788, 0x024e1aaa, 0x010ce222, 0x02945426, 0x01cd7713, 0x003aa5ad, 0x03e3506e, 0x011b0643, 0x0034d277}}, Y: Field{[10]uint32{0x033249a5, 0x02b7b390, 0x01bc6072, 0x015fb38d, 0x01cf0822, 0x02803bfa, 0x01c71c9e, 0x02dab0a5, 0x00571da2, 0x0019fcbc}}}, + {X: Field{[10]uint32{0x02dd10e6, 0x004de059, 0x023d9c68, 0x02763e0c, 0x03babad3, 0x01cb6339, 0x036834d2, 0x01faecd7, 0x02957fb8, 0x0026a426}}, Y: Field{[10]uint32{0x02ddbca1, 0x02195ca8, 0x03cec863, 0x0367dc24, 0x01c12f16, 0x028bd800, 0x02248352, 0x0068a1fd, 0x011a3277, 0x00338fab}}}, + {X: Field{[10]uint32{0x0007fa0b, 0x02f33c2b, 0x01452a67, 0x01c44853, 0x031d77f9, 0x01a1ad7e, 0x03be25d3, 0x00a99268, 0x0218df2a, 0x003ce2c7}}, Y: Field{[10]uint32{0x01e65ea6, 0x019c7bdc, 0x039d4591, 0x03631223, 0x03419a20, 0x03029188, 0x011ced59, 0x02c806e8, 0x029a7f71, 0x00001727}}}, + {X: Field{[10]uint32{0x01535a67, 0x0381b20c, 0x039a6a86, 0x021304ad, 0x027b9097, 0x009d8bb4, 0x012738bc, 0x0342577d, 0x03ca26b8, 0x00108d83}}, Y: Field{[10]uint32{0x028345e4, 0x03064491, 0x02f665de, 0x030595fd, 0x03db93ae, 0x02f77114, 0x008bc432, 0x03000efa, 0x00e5e43e, 0x001adbd3}}}, + {X: Field{[10]uint32{0x003f4a1e, 0x00130d8c, 0x02a94534, 0x03016800, 0x01b87325, 0x00c8ddec, 0x03993eaa, 0x038ee665, 0x018da7c5, 0x0038f5c6}}, Y: Field{[10]uint32{0x0053ef4d, 0x004de048, 0x0265f5c8, 0x033cc817, 0x00a05f19, 0x017eaff9, 0x0342be83, 0x0052337d, 0x0218ece6, 0x001c90dc}}}, + {X: Field{[10]uint32{0x007cb59b, 0x02f1b65a, 0x01b480d6, 0x02d6f5a3, 0x0202f93d, 0x006454a7, 0x014f6258, 0x004441ad, 0x0145a830, 0x000e504a}}, Y: Field{[10]uint32{0x0250f08d, 0x009941bc, 0x01d9fd28, 0x02028405, 0x00e08b0a, 0x002a562d, 0x03057844, 0x030c6462, 0x022c60f5, 0x002e36e0}}}, + {X: Field{[10]uint32{0x01241fc2, 0x00b025f3, 0x014f421d, 0x0053552b, 0x02d93dc9, 0x0364da33, 0x03857c7e, 0x03a639da, 0x01f77e0e, 0x0001349d}}, Y: Field{[10]uint32{0x039d7473, 0x03922ae8, 0x02f05277, 0x03a24330, 0x03935448, 0x0254aac4, 0x019d361f, 0x00a447d8, 0x03d49b50, 0x003b2e00}}}, + {X: Field{[10]uint32{0x029556ce, 0x00fe01e1, 0x01e03c01, 0x0114f22a, 0x010160b1, 0x01667b56, 0x02fcd5b6, 0x0272f68f, 0x0076c1db, 0x000a4d92}}, Y: Field{[10]uint32{0x023f6ede, 0x00c6443c, 0x0186c2dc, 0x01a9df7c, 0x0243ffb5, 0x016507df, 0x03562379, 0x02543213, 0x02f4cc44, 0x000af6d2}}}, + {X: Field{[10]uint32{0x00878034, 0x003b9b79, 0x01e55d38, 0x0107d2c8, 0x036febcf, 0x00ee84cc, 0x003ef10d, 0x0337deae, 0x00a963dc, 0x001d4c7d}}, Y: Field{[10]uint32{0x03a36ae8, 0x0100d286, 0x0055e9c4, 0x02ec021f, 0x01e1dcb1, 0x03589a6c, 0x01628ca2, 0x01af087a, 0x029f91d5, 0x0011d4f6}}}, + {X: Field{[10]uint32{0x00286e08, 0x02514317, 0x02777a3d, 0x00a16f05, 0x016050ca, 0x02f7e2b0, 0x00dce7a4, 0x03fb2910, 0x02263d12, 0x002099b5}}, Y: Field{[10]uint32{0x03e2328b, 0x0177cb2b, 0x00877545, 0x03897369, 0x0096d908, 0x0267d8cf, 0x01e7e363, 0x013ad9a9, 0x02bffb8a, 0x0009403c}}}, + {X: Field{[10]uint32{0x03c589e9, 0x02a1b452, 0x023d69ea, 0x02a9672d, 0x036d5e62, 0x010e27e1, 0x039b26e8, 0x027c5630, 0x00014f33, 0x00199200}}, Y: Field{[10]uint32{0x02d92e2a, 0x01c05b12, 0x002f596c, 0x03076a29, 0x01f145ff, 0x01d6b0c6, 0x00785263, 0x0168de7c, 0x033fe3eb, 0x00281a66}}}, + {X: Field{[10]uint32{0x00c70d49, 0x01dead93, 0x0113486b, 0x02e387d1, 0x03f641e2, 0x01b224d0, 0x01921b5e, 0x003ee981, 0x00858b9c, 0x003e3bf3}}, Y: Field{[10]uint32{0x00a9d607, 0x00761d54, 0x00834f8b, 0x0389e49e, 0x005f4de2, 0x00d7668f, 0x01a0ae30, 0x03c366bd, 0x002f7086, 0x002ea5c8}}}, + {X: Field{[10]uint32{0x00992540, 0x010b8267, 0x02e736c5, 0x02c07638, 0x016f2485, 0x00eafecf, 0x02c627c9, 0x00928ec7, 0x027d2543, 0x00297048}}, Y: Field{[10]uint32{0x02ecc7cc, 0x005b6f21, 0x03da5a1d, 0x01173e5d, 0x0264cfef, 0x00e29fde, 0x019bed7f, 0x00eed5b6, 0x01b48a16, 0x00324627}}}, + {X: Field{[10]uint32{0x038bbaf3, 0x01418182, 0x018938e0, 0x00024983, 0x016c85bb, 0x01c0b7b1, 0x03b655d7, 0x014f7c3e, 0x0219a5b2, 0x0009c6c9}}, Y: Field{[10]uint32{0x02cd2ce5, 0x0326924f, 0x03bd8d86, 0x039756bc, 0x0172bca7, 0x02af9564, 0x01bd1746, 0x023c9f73, 0x03fc22cb, 0x0016333c}}}, + {X: Field{[10]uint32{0x0170ae16, 0x03077f41, 0x0036ad90, 0x00c24b2b, 0x021202ba, 0x01c8753c, 0x001800ce, 0x025d0436, 0x002b20c7, 0x0032784e}}, Y: Field{[10]uint32{0x0231e5b2, 0x0084ee04, 0x003f690d, 0x03ec3e69, 0x016f7a0d, 0x035e65d2, 0x012f7070, 0x033a80ea, 0x00ab2a47, 0x001fac7f}}}, + {X: Field{[10]uint32{0x000309f2, 0x00250780, 0x03decb1e, 0x01aa2f51, 0x0145897e, 0x00ad2251, 0x018cb751, 0x00a81075, 0x03256523, 0x000015d2}}, Y: Field{[10]uint32{0x024615a9, 0x02cebe3f, 0x03b72038, 0x03eb0ad7, 0x03474db8, 0x02a72774, 0x03bf2cc6, 0x01d2fe4f, 0x02a9567d, 0x002efee1}}}, + {X: Field{[10]uint32{0x03046c38, 0x02354218, 0x012b4a98, 0x03b1a54f, 0x021135e7, 0x037fdb15, 0x0120e004, 0x017b692d, 0x02aca630, 0x0027bfa1}}, Y: Field{[10]uint32{0x02e9af70, 0x02b60c6a, 0x02e42551, 0x01e646a6, 0x027afa4f, 0x030ed362, 0x03cbe67e, 0x002062bd, 0x029132cb, 0x0013e4a8}}}, + {X: Field{[10]uint32{0x0013f254, 0x028b72f6, 0x0328413a, 0x03e8cf61, 0x02df26ca, 0x0024639a, 0x00bf4c3d, 0x03e85cdd, 0x00a0ff76, 0x0020ba92}}, Y: Field{[10]uint32{0x032ac9f2, 0x021ac76f, 0x038e4a70, 0x03589b77, 0x0049b4c2, 0x005ea254, 0x01e1ca14, 0x0156a8e7, 0x01399bb5, 0x001a80a5}}}, + {X: Field{[10]uint32{0x01d2baaa, 0x0379d56f, 0x01f4f5fb, 0x03af78ca, 0x03e3af2f, 0x02982b7e, 0x0352a24b, 0x02c1b0c4, 0x003e817b, 0x0030a252}}, Y: Field{[10]uint32{0x00780a53, 0x00e87387, 0x005c04b1, 0x017b065a, 0x039c4994, 0x03fad657, 0x036854a1, 0x03b3bd8a, 0x010d8b4a, 0x000edfba}}}, + {X: Field{[10]uint32{0x02e12cc4, 0x01d02d25, 0x0030001c, 0x01835e2a, 0x02016986, 0x02c161ed, 0x028deb31, 0x003563a9, 0x02cbb558, 0x001af791}}, Y: Field{[10]uint32{0x01293292, 0x01baccba, 0x02d91e09, 0x0173450b, 0x020a41cc, 0x031e741d, 0x014ce750, 0x0059a922, 0x02a7c1cd, 0x000c6229}}}, + {X: Field{[10]uint32{0x01827cf4, 0x026b07d9, 0x00bdf451, 0x023e819b, 0x01017673, 0x01bf5d5c, 0x030a11d6, 0x0185795f, 0x03ae2844, 0x003474a8}}, Y: Field{[10]uint32{0x03f603db, 0x018c4899, 0x02ee70f9, 0x00d971f6, 0x038271f9, 0x014558ba, 0x03697d7c, 0x03065a2d, 0x03f70c01, 0x001f033f}}}, + {X: Field{[10]uint32{0x0227370a, 0x0057b5ee, 0x00be8f65, 0x02233ea8, 0x00e276b0, 0x02afe697, 0x0151c852, 0x01555ced, 0x00874d19, 0x002dd303}}, Y: Field{[10]uint32{0x01a662ab, 0x003c7dd1, 0x031b551e, 0x01784535, 0x026f0c32, 0x0313b630, 0x01e307be, 0x015c7bf9, 0x030e380c, 0x00003c32}}}, + {X: Field{[10]uint32{0x01015874, 0x0109827e, 0x0298f47d, 0x01deebb8, 0x00849500, 0x00c5f846, 0x03c30412, 0x01b0fe85, 0x039a9f12, 0x002a69c6}}, Y: Field{[10]uint32{0x002e0586, 0x0130a9a9, 0x020f08f3, 0x01fd5448, 0x03f1b113, 0x018d33b3, 0x024be1df, 0x03c32dfe, 0x03fdb31b, 0x003017cf}}}, + {X: Field{[10]uint32{0x00dbc68c, 0x0089d2a0, 0x01c259b0, 0x03e8fe88, 0x032b1b99, 0x02cfe08e, 0x03514162, 0x007c9f76, 0x01530a16, 0x0035b784}}, Y: Field{[10]uint32{0x0059764a, 0x03202f6f, 0x02215348, 0x018539d9, 0x00714fab, 0x02b2f7bf, 0x0015d259, 0x021697bb, 0x00636597, 0x001b1882}}}, + {X: Field{[10]uint32{0x036b73f1, 0x024a9d1d, 0x016df112, 0x00d80a9e, 0x0273a7dc, 0x016521fe, 0x038c22f3, 0x03297147, 0x01bc3acd, 0x00372a87}}, Y: Field{[10]uint32{0x00c85159, 0x0312a3c3, 0x035147c8, 0x026a5631, 0x01b4b4d4, 0x005c545e, 0x033719b0, 0x0181ed20, 0x01fcc22c, 0x0037104c}}}, + {X: Field{[10]uint32{0x0005ab6c, 0x01a89100, 0x01d21220, 0x00025526, 0x015f3a13, 0x01dc2535, 0x03aa93c6, 0x02f84c70, 0x03a000c4, 0x0004d54d}}, Y: Field{[10]uint32{0x00fb0f69, 0x00bc1159, 0x0333048c, 0x033f8d20, 0x0308f3eb, 0x03548dc2, 0x01f0d1dd, 0x037d9ccd, 0x031fd2d3, 0x001fbda7}}}, + {X: Field{[10]uint32{0x01de93ac, 0x03fa760e, 0x0004afb3, 0x03957a7a, 0x02751dd6, 0x00ff666b, 0x01572bbe, 0x018b9933, 0x0017c232, 0x000a3c76}}, Y: Field{[10]uint32{0x01e2cb7e, 0x00a6d20e, 0x01cb0970, 0x022f5079, 0x008f5dfe, 0x01f20d6b, 0x02e0e896, 0x00f690b6, 0x0061987e, 0x000093d6}}}, + {X: Field{[10]uint32{0x00294289, 0x03384d51, 0x001e25f8, 0x021e6b59, 0x03e0779b, 0x002040b7, 0x0331155c, 0x02dfee3a, 0x03836e8f, 0x003df13b}}, Y: Field{[10]uint32{0x036bce2c, 0x026593c7, 0x020d1362, 0x008da55e, 0x0216470d, 0x01bae5a0, 0x0150f091, 0x02588758, 0x0381db33, 0x0001fe69}}}, + {X: Field{[10]uint32{0x0228b3e6, 0x02a3d986, 0x03aeda8d, 0x0061444b, 0x00ddc8d0, 0x0169cd75, 0x0366f7e2, 0x026cd462, 0x025e1ddc, 0x003c7d6b}}, Y: Field{[10]uint32{0x01ad4288, 0x036777ee, 0x03cb41c6, 0x0218fb6d, 0x035c5c34, 0x013f9ea3, 0x024a8df2, 0x01360142, 0x012c9792, 0x00276ffc}}}, + {X: Field{[10]uint32{0x008b654f, 0x03ef5cc0, 0x0027dc2a, 0x0287ad96, 0x01257c10, 0x015e2d8e, 0x020dbc74, 0x033a7072, 0x0173d170, 0x00257e0c}}, Y: Field{[10]uint32{0x03412487, 0x03472f00, 0x035b8b75, 0x00edefb8, 0x017d5ab8, 0x01a4628c, 0x03c3c91c, 0x012a2104, 0x02bc0829, 0x0018ea0f}}}, + {X: Field{[10]uint32{0x023ff750, 0x020f025a, 0x03a7df8c, 0x00d646f8, 0x03964749, 0x01f58154, 0x008c8e37, 0x017847ae, 0x025c9f09, 0x003d2b69}}, Y: Field{[10]uint32{0x01861ed3, 0x0146972b, 0x0178d3ac, 0x01d86c37, 0x012ede16, 0x036f3129, 0x00bc87c3, 0x0116cb9b, 0x0328a385, 0x0039da0f}}}, + {X: Field{[10]uint32{0x019e5fd2, 0x039eb90a, 0x00fd03af, 0x015b64e5, 0x0040b827, 0x0371ef09, 0x03bcd591, 0x036cec6d, 0x0096f714, 0x00106beb}}, Y: Field{[10]uint32{0x0099fedc, 0x03a691c1, 0x02f20474, 0x0001769e, 0x0061c52d, 0x03195291, 0x02e98aea, 0x03fc4909, 0x006a3292, 0x00270ba7}}}, + {X: Field{[10]uint32{0x00487405, 0x02a85bba, 0x03ffd0cc, 0x03f710bc, 0x01e1b8df, 0x0328d7c3, 0x0141fe9c, 0x00726d86, 0x031b2cb8, 0x000dfcc2}}, Y: Field{[10]uint32{0x00b88a0f, 0x00755363, 0x022bb61b, 0x00f29326, 0x018086bb, 0x0021ad92, 0x03dd08e1, 0x00754767, 0x0285e340, 0x0024afde}}}, + {X: Field{[10]uint32{0x004fb3ce, 0x0181c596, 0x0205b9d7, 0x02651530, 0x03605a21, 0x0338323a, 0x01312022, 0x01faa885, 0x0166646e, 0x000bd5dc}}, Y: Field{[10]uint32{0x03d5f446, 0x019f7fc0, 0x00ee0985, 0x036bb589, 0x01af32e8, 0x03412e5a, 0x020dc684, 0x033ab56b, 0x026fe43d, 0x003c35cc}}}, + {X: Field{[10]uint32{0x00b5150a, 0x01f96e99, 0x03e7dfd5, 0x03fc2fe7, 0x003c2e24, 0x02bff6fe, 0x03a0af94, 0x0144ad7a, 0x038092c5, 0x0022aef1}}, Y: Field{[10]uint32{0x02896b75, 0x0059f5fd, 0x0232791a, 0x03b12454, 0x010bb87d, 0x03fb33db, 0x015b974f, 0x03066a92, 0x018f0c2e, 0x00163d66}}}, + {X: Field{[10]uint32{0x0147571c, 0x03741970, 0x00aed219, 0x03d70a04, 0x00f6da7c, 0x01f95f3f, 0x0073fe40, 0x01dacc9f, 0x028fa013, 0x003906b3}}, Y: Field{[10]uint32{0x036844a2, 0x02a52fdd, 0x027a37d8, 0x01146584, 0x01715d45, 0x01cbe639, 0x02d04592, 0x01c530c8, 0x02da3c2a, 0x002d642a}}}, + {X: Field{[10]uint32{0x010f1d88, 0x00533662, 0x03b5abe7, 0x03f2767a, 0x017c0c84, 0x00491e27, 0x0180f7f4, 0x0157bb77, 0x00778b63, 0x000c0326}}, Y: Field{[10]uint32{0x039c9002, 0x017a4ef8, 0x0138520f, 0x01b20d37, 0x0068c507, 0x03869ee0, 0x00f5c7a4, 0x021cc432, 0x0262c571, 0x0036b0ae}}}, + {X: Field{[10]uint32{0x02e24c61, 0x0205c1c4, 0x01b5c876, 0x008c9b28, 0x03dcdb66, 0x01e1db0f, 0x02072c1f, 0x003e1096, 0x01d219d4, 0x001a78ce}}, Y: Field{[10]uint32{0x00babc50, 0x002e1b4e, 0x005a1bad, 0x02024dd0, 0x014cd472, 0x02d4d648, 0x017e8499, 0x011c0085, 0x015059a4, 0x002350e4}}}, + {X: Field{[10]uint32{0x03bdb909, 0x03752132, 0x0346da2f, 0x027d47f1, 0x00cddd77, 0x007eaded, 0x033ccf64, 0x02a67e2a, 0x03df8e47, 0x00395924}}, Y: Field{[10]uint32{0x03f5ee59, 0x012728f8, 0x01145b6e, 0x0275d630, 0x01974531, 0x0107062d, 0x0006036d, 0x0053fb42, 0x020a559e, 0x001a36e8}}}, + {X: Field{[10]uint32{0x03f50587, 0x0134e379, 0x01c611a3, 0x03795d36, 0x00f76532, 0x01b803ac, 0x01c11e58, 0x0144734e, 0x00578998, 0x000dea47}}, Y: Field{[10]uint32{0x03145f18, 0x007710ec, 0x0381ee5d, 0x0042ae74, 0x01feac27, 0x00276a25, 0x01975dc0, 0x022891cd, 0x00af0d2d, 0x0038e862}}}, + {X: Field{[10]uint32{0x02e88c1f, 0x0149d0b7, 0x0124a86c, 0x01bd9793, 0x02622401, 0x02535e0e, 0x00629c71, 0x018b844b, 0x01fb5cc2, 0x00317c16}}, Y: Field{[10]uint32{0x038c890a, 0x0155e3ec, 0x00623ab1, 0x00147be8, 0x018c0907, 0x0242d1b5, 0x037792d5, 0x02a56945, 0x03521a96, 0x0007216f}}}, + {X: Field{[10]uint32{0x038716a1, 0x01e24926, 0x01827626, 0x018fca11, 0x03c6323c, 0x021006b3, 0x018c59d7, 0x033ac68a, 0x02ccd605, 0x00159bb7}}, Y: Field{[10]uint32{0x0244cc90, 0x0018b516, 0x010a15ad, 0x02bf0080, 0x038c40b3, 0x00b4ccbf, 0x01f85b93, 0x01bc81e2, 0x03735adf, 0x003b8344}}}, + {X: Field{[10]uint32{0x032c7c7b, 0x027337b6, 0x034c8db6, 0x038b0fae, 0x023e6cf4, 0x0332d190, 0x012e33db, 0x013e1c01, 0x0033c6ef, 0x000c9f9c}}, Y: Field{[10]uint32{0x03e8db36, 0x0385ba54, 0x012634aa, 0x00e7def6, 0x00122662, 0x0026bac7, 0x023e2667, 0x03ca6d2a, 0x012b2be0, 0x003f1242}}}, + {X: Field{[10]uint32{0x03778024, 0x039c0265, 0x01e1a1ea, 0x038a317d, 0x0284ef5a, 0x029b2bfd, 0x0329704e, 0x02b21957, 0x03693ac0, 0x0026269f}}, Y: Field{[10]uint32{0x00dadfd0, 0x01ed90a0, 0x0292bd1b, 0x035cec2c, 0x00e8eb1f, 0x02b3fa99, 0x03b5bd44, 0x011639d2, 0x027b3396, 0x0015cf44}}}, + {X: Field{[10]uint32{0x0330fc94, 0x00b31842, 0x019769c2, 0x03e92999, 0x037ce313, 0x013d2695, 0x01cec4b7, 0x01fd53b4, 0x032f14f2, 0x002729d9}}, Y: Field{[10]uint32{0x0104e4a1, 0x01b283ce, 0x011dcd2d, 0x0013bbb0, 0x006ab141, 0x00b7e34c, 0x0003f818, 0x00a928c2, 0x00d731d5, 0x003e4831}}}, + {X: Field{[10]uint32{0x0047f5f5, 0x0155579e, 0x030cde1d, 0x0143b4bb, 0x02060978, 0x01f89c86, 0x00316871, 0x03a38656, 0x0245654f, 0x0036c401}}, Y: Field{[10]uint32{0x01056567, 0x02064a0c, 0x0014c962, 0x033b9d14, 0x02619287, 0x03ddb22d, 0x03cdf895, 0x003b3cd3, 0x02cea9c9, 0x000acb0f}}}, + {X: Field{[10]uint32{0x013295a9, 0x01340335, 0x01c07bb9, 0x03e9949a, 0x02418a34, 0x00effc53, 0x02110a8f, 0x00ed0979, 0x009e8274, 0x00138a83}}, Y: Field{[10]uint32{0x00ccca7a, 0x02cb138f, 0x014b3d98, 0x03b237e8, 0x008a34e5, 0x028eb1a7, 0x00b90590, 0x02c12dad, 0x02e3e00b, 0x00144ab0}}}, + {X: Field{[10]uint32{0x02ac77f6, 0x010d4bd9, 0x0368d733, 0x01dca50e, 0x0060c71a, 0x0217ec73, 0x0136f981, 0x022b2c14, 0x037024ea, 0x00304acf}}, Y: Field{[10]uint32{0x02544803, 0x01ef77c0, 0x033239c0, 0x02560cc9, 0x020d67a1, 0x03ef8949, 0x009f5a7b, 0x01dbc07c, 0x019b6f4b, 0x002de67e}}}, + {X: Field{[10]uint32{0x03fd7e58, 0x01551923, 0x003feaa7, 0x020afe9e, 0x03d6c09b, 0x005904ff, 0x017c0cf6, 0x013877af, 0x022edaf3, 0x00019396}}, Y: Field{[10]uint32{0x002f4a50, 0x0147cd0f, 0x004ff726, 0x0292d461, 0x027509a2, 0x037c249b, 0x005d611a, 0x00cb8ba4, 0x020966f0, 0x00038083}}}, + {X: Field{[10]uint32{0x030a838a, 0x0102254f, 0x03b9fef0, 0x015cb3ec, 0x013d66ec, 0x000fc0b7, 0x02d1857e, 0x010e03da, 0x0355fa73, 0x000ac2e2}}, Y: Field{[10]uint32{0x0273a61a, 0x02404f67, 0x024765bd, 0x0070d023, 0x00147ce0, 0x00722029, 0x00b45bae, 0x01965e38, 0x0251a914, 0x002b225c}}}, + {X: Field{[10]uint32{0x0288525e, 0x01e24c0a, 0x00c5bd67, 0x02d07bf5, 0x016523e8, 0x0196a59e, 0x02545299, 0x0184cf4e, 0x0130a202, 0x002b838f}}, Y: Field{[10]uint32{0x00f80552, 0x0177ed4e, 0x03ee97ec, 0x01f7687b, 0x00c80c08, 0x00e6ac98, 0x00be67b3, 0x00b49094, 0x00ff8563, 0x003eda46}}}, + {X: Field{[10]uint32{0x03e00dd9, 0x037a18a3, 0x03454a83, 0x00c3b7c8, 0x033bfa15, 0x0007d130, 0x02e46cb0, 0x02859bfe, 0x03114dfe, 0x000bfe71}}, Y: Field{[10]uint32{0x03318783, 0x03a0b11b, 0x027599b5, 0x001ef483, 0x01acb0d7, 0x02065717, 0x02383517, 0x00605e8f, 0x027a0444, 0x00014fd9}}}, + {X: Field{[10]uint32{0x027bf695, 0x02c45a93, 0x017263ed, 0x0393067d, 0x019e2614, 0x010ac512, 0x003f60cc, 0x01671b01, 0x001488b9, 0x0033009c}}, Y: Field{[10]uint32{0x03b6007a, 0x00b99296, 0x01fe2e57, 0x017080db, 0x0307b532, 0x012697c1, 0x02ce6551, 0x03d9dd99, 0x01909b22, 0x003aacfd}}}, + {X: Field{[10]uint32{0x00a945d5, 0x01a2fa0a, 0x0145584d, 0x016bc067, 0x03f9dbf4, 0x02125749, 0x03e3b476, 0x00d6997b, 0x03d13c80, 0x0006007b}}, Y: Field{[10]uint32{0x0259c4fe, 0x02f686fe, 0x005681ac, 0x02f382da, 0x03f44a5a, 0x026a0be2, 0x02f49d50, 0x025a3bd3, 0x019efcb5, 0x0037fcb4}}}, + {X: Field{[10]uint32{0x00dd7cbf, 0x02de3f0f, 0x03f8be6a, 0x038db9d1, 0x015b698f, 0x031eaeaf, 0x03c09de4, 0x002588d5, 0x01d507b6, 0x001b68aa}}, Y: Field{[10]uint32{0x0275060c, 0x016f7338, 0x00378d50, 0x020a66b3, 0x0171310b, 0x00df02bc, 0x01ac9f9b, 0x022b88a5, 0x02704aeb, 0x000789d3}}}, + {X: Field{[10]uint32{0x02fc82e4, 0x02846b6e, 0x0344c832, 0x00e86a67, 0x00c7dfe2, 0x02a513fc, 0x039e8a6e, 0x005774ef, 0x016f6a92, 0x001fa3f2}}, Y: Field{[10]uint32{0x01342bff, 0x021cb8ec, 0x02d51ddc, 0x000ea023, 0x0257d095, 0x018fce21, 0x039ed00c, 0x01b29fdc, 0x03e1e0c2, 0x003a693e}}}, + {X: Field{[10]uint32{0x020caf64, 0x02ed121f, 0x00f27559, 0x00cdc633, 0x019f53e1, 0x021c1d90, 0x0266ab37, 0x035bdff8, 0x033a77d6, 0x00298d8b}}, Y: Field{[10]uint32{0x02cc787e, 0x02135874, 0x00d70087, 0x00e7d1cf, 0x03e29d85, 0x019bdd46, 0x025cd860, 0x00e17182, 0x02da3fc2, 0x00300588}}}, + {X: Field{[10]uint32{0x0337d2b3, 0x01c01d66, 0x01557449, 0x0154df09, 0x018582bd, 0x001db06a, 0x01a19b47, 0x01d24e8f, 0x022228b4, 0x00146194}}, Y: Field{[10]uint32{0x00287be1, 0x02bef411, 0x01ad17d0, 0x02e14914, 0x02826558, 0x01032e33, 0x03ca65bf, 0x0236764f, 0x01796863, 0x003c3c2e}}}, + {X: Field{[10]uint32{0x01d472ce, 0x02f0f460, 0x028e67e8, 0x004a7a3b, 0x0304d802, 0x01c6656a, 0x0314ff4f, 0x02e70e31, 0x009ba9f1, 0x0028a824}}, Y: Field{[10]uint32{0x0040068d, 0x03d717bb, 0x01a6a1e8, 0x007b3649, 0x028b364d, 0x03114ce4, 0x03fdf98e, 0x031efdc6, 0x000bd45e, 0x001048e4}}}, + {X: Field{[10]uint32{0x003aef2d, 0x00c7e1ee, 0x009212b0, 0x03abe7c3, 0x02f1357b, 0x006fe5e7, 0x03f5ac2a, 0x01fcda98, 0x0122454e, 0x00369460}}, Y: Field{[10]uint32{0x006da722, 0x0363cdda, 0x00b32b6b, 0x03e2e683, 0x016cb7f3, 0x02e7762e, 0x0028c5e1, 0x017a0032, 0x02fd0d41, 0x002fe1df}}}, + {X: Field{[10]uint32{0x0147a87d, 0x035d418e, 0x0382e6cb, 0x001b520f, 0x008a6983, 0x004316a9, 0x01aa5729, 0x00c49796, 0x00541a98, 0x00107103}}, Y: Field{[10]uint32{0x03bfc57f, 0x01bc4068, 0x00c814e8, 0x00cf0c3d, 0x03ef8400, 0x03ef7d79, 0x029f129f, 0x02442aee, 0x03656b89, 0x001db6ae}}}, + {X: Field{[10]uint32{0x02addbfd, 0x00267326, 0x01318709, 0x01322290, 0x0028745e, 0x03314362, 0x007c980a, 0x039191a1, 0x028387f2, 0x003127f7}}, Y: Field{[10]uint32{0x027227e1, 0x01231fab, 0x03a94bbb, 0x03b99847, 0x00c7ddb4, 0x00a2f9fe, 0x00baf9e6, 0x01ef4de7, 0x0112dfd0, 0x002996f1}}}, + {X: Field{[10]uint32{0x020fceae, 0x03c060c3, 0x010717a1, 0x0223a314, 0x023a6c6b, 0x035edd09, 0x03219406, 0x01d0f537, 0x0161b6ee, 0x00216c5f}}, Y: Field{[10]uint32{0x01868fef, 0x00c24b95, 0x02be892d, 0x00f9c13d, 0x03ebddc5, 0x03d2ffee, 0x006ce022, 0x007fad41, 0x00a274c7, 0x0008ae7a}}}, + {X: Field{[10]uint32{0x0117964f, 0x03d7153c, 0x0243e883, 0x030b2353, 0x023914af, 0x00158e7b, 0x03521895, 0x01dfc4f9, 0x037fe6d6, 0x00323874}}, Y: Field{[10]uint32{0x01bfc21e, 0x02b56ace, 0x008e4f88, 0x02d0daad, 0x03ee4a7a, 0x007e6525, 0x006ba559, 0x016a46bd, 0x0118d08f, 0x002c32b3}}}, + {X: Field{[10]uint32{0x0083836b, 0x001e29f9, 0x02dd9866, 0x02802e5e, 0x011a30ba, 0x00c44a65, 0x03d6f833, 0x02223169, 0x00307d25, 0x0037fb00}}, Y: Field{[10]uint32{0x02faa00d, 0x004ea42e, 0x0380956e, 0x002dbee5, 0x00f407ca, 0x00abe391, 0x00664168, 0x02511fbd, 0x0206bf2e, 0x001396a2}}}, + {X: Field{[10]uint32{0x030be9d6, 0x02535fdf, 0x00b20925, 0x01b97d35, 0x02c842ff, 0x0274c1db, 0x017618dc, 0x03631bbb, 0x00387c18, 0x003ab1b1}}, Y: Field{[10]uint32{0x0265b8d1, 0x008e9ac8, 0x021634e8, 0x019f5cd2, 0x0177a86a, 0x003fbaef, 0x031802ac, 0x006e0ae9, 0x03bffc0c, 0x000675a6}}}, + {X: Field{[10]uint32{0x03424cde, 0x0108046c, 0x019b74d6, 0x005672f2, 0x0069432c, 0x01fdab20, 0x0024db79, 0x0377b292, 0x004e04dc, 0x0027fce3}}, Y: Field{[10]uint32{0x01619ebc, 0x018886d4, 0x014f91d2, 0x0106e53d, 0x01266bd0, 0x033212e0, 0x005b0c93, 0x02effb7d, 0x0260b7c1, 0x003dcbe9}}}, + {X: Field{[10]uint32{0x01313f36, 0x03f19129, 0x02c1c146, 0x0277512c, 0x019153f6, 0x03f8a155, 0x01e4f8c4, 0x00ca4d7e, 0x013f3a5a, 0x00179e16}}, Y: Field{[10]uint32{0x02fd9c47, 0x02a6e6a2, 0x0114b89d, 0x02986cb4, 0x0358cbc5, 0x01758f25, 0x0195b700, 0x02f746cb, 0x0044dc63, 0x00276756}}}, + {X: Field{[10]uint32{0x01009ae4, 0x0321511c, 0x01b32d22, 0x0121debe, 0x020ad31a, 0x00f88870, 0x01ba38b0, 0x012dbec0, 0x03a48928, 0x002841f1}}, Y: Field{[10]uint32{0x03d9f6b5, 0x030da689, 0x014c4a0f, 0x002f1457, 0x03653b58, 0x0303e7ca, 0x0386cd5b, 0x019647b8, 0x02d46be4, 0x0001981c}}}, + {X: Field{[10]uint32{0x01b02af1, 0x03397e90, 0x028f4190, 0x023b308e, 0x02ff98e8, 0x01e4a65d, 0x02445ba6, 0x026117f8, 0x01d0308d, 0x0000907c}}, Y: Field{[10]uint32{0x03e194a9, 0x02dfaa29, 0x01c74366, 0x03bb16b2, 0x0209c881, 0x02be474c, 0x015723ad, 0x02a237e8, 0x03ecd413, 0x002219a5}}}, + {X: Field{[10]uint32{0x008a72fa, 0x02431af9, 0x01283c87, 0x005a2e6a, 0x02341860, 0x03ab0ed0, 0x015c6d26, 0x0241ba0f, 0x00d2627f, 0x000c67ba}}, Y: Field{[10]uint32{0x029eaa57, 0x033109cf, 0x032819d0, 0x014c197e, 0x01760344, 0x032d1631, 0x009f8491, 0x005b80d0, 0x02eda678, 0x00167925}}}, + {X: Field{[10]uint32{0x03ca4822, 0x0051896f, 0x038e1a26, 0x019864a1, 0x01e01008, 0x01a615d6, 0x03f4f7e9, 0x03e6f64d, 0x011a00fd, 0x000619a0}}, Y: Field{[10]uint32{0x01b7ae19, 0x01449a75, 0x0250172e, 0x00646990, 0x00585f03, 0x02d97e9f, 0x003a1316, 0x0272209e, 0x0065e85f, 0x00085781}}}, + {X: Field{[10]uint32{0x03992f26, 0x00bdda54, 0x00ce69ff, 0x016bdce5, 0x01398967, 0x033d9026, 0x03429fb8, 0x02400176, 0x02d70b94, 0x001fbfef}}, Y: Field{[10]uint32{0x00c7c749, 0x0026b210, 0x02aa7a1d, 0x01ab1b34, 0x03616d8b, 0x02fcb702, 0x016affac, 0x01b52d49, 0x01ba28f2, 0x001bbeed}}}, + {X: Field{[10]uint32{0x03168867, 0x0293494a, 0x00bf0957, 0x0199c3c5, 0x02665c8d, 0x00de54ac, 0x02e45c19, 0x0057c87f, 0x03d0e593, 0x003631ca}}, Y: Field{[10]uint32{0x0256fbcd, 0x011b186f, 0x02e6e5a9, 0x006cb266, 0x028a2da3, 0x01cff182, 0x01e2cc3a, 0x0029bf44, 0x0162fdd4, 0x0019300b}}}, + {X: Field{[10]uint32{0x00d0db4b, 0x0060c206, 0x0147abcf, 0x0147ead3, 0x0187bbfd, 0x002c35a4, 0x0396bbcb, 0x03ce050e, 0x0222ce64, 0x001c43b1}}, Y: Field{[10]uint32{0x0134d994, 0x00cc5391, 0x030c5496, 0x00dafaae, 0x013d275c, 0x0243d4c7, 0x029b9618, 0x00ebc30b, 0x0086526c, 0x003b7f44}}}, + {X: Field{[10]uint32{0x00d51ca6, 0x0131654c, 0x0334868e, 0x009e7930, 0x0370574f, 0x02021b76, 0x0168e763, 0x03b75270, 0x024b9aea, 0x002509e5}}, Y: Field{[10]uint32{0x004e2dd8, 0x00298457, 0x017af730, 0x03a9a131, 0x01e0026b, 0x00a160f6, 0x03b312e9, 0x00019fac, 0x01cf2a6b, 0x000442d0}}}, + {X: Field{[10]uint32{0x0355565f, 0x0166ce63, 0x00a5c46a, 0x00597aa9, 0x01c5a2e8, 0x036d8859, 0x03515c06, 0x03b6727a, 0x0035a8b3, 0x002bbde5}}, Y: Field{[10]uint32{0x0184b91d, 0x02c5e915, 0x012a0118, 0x0044f0d5, 0x03036535, 0x0250aaac, 0x00cb93d8, 0x03109714, 0x00f21274, 0x001985ba}}}, + {X: Field{[10]uint32{0x0074b5a3, 0x0319fccc, 0x03994a4a, 0x0339296b, 0x020f49f0, 0x0275cbc9, 0x03401935, 0x0018e9a3, 0x00323546, 0x000faf76}}, Y: Field{[10]uint32{0x00460238, 0x0254019e, 0x019beed8, 0x03cb238b, 0x02db7962, 0x00e575c4, 0x02ba318f, 0x0127bb43, 0x03d4b295, 0x000048d9}}}, + {X: Field{[10]uint32{0x026aeff2, 0x02d01790, 0x020dd729, 0x03894d35, 0x0019af86, 0x019cf212, 0x03c6bc3b, 0x0021c742, 0x025ec52b, 0x0028e367}}, Y: Field{[10]uint32{0x032cad02, 0x031d7a7c, 0x02a1cb01, 0x00a22b0d, 0x01f6d134, 0x03237935, 0x00955383, 0x01b1744e, 0x0371d9ae, 0x003af919}}}, + {X: Field{[10]uint32{0x00a7d624, 0x03b0d092, 0x01b0f9f4, 0x02845a40, 0x02334369, 0x0114b2e3, 0x00407f7b, 0x02ec6643, 0x0382619c, 0x0039f4a7}}, Y: Field{[10]uint32{0x03c4e614, 0x03b16d67, 0x02e0742b, 0x0052aa3b, 0x0315b6ce, 0x0175d85b, 0x00ce2304, 0x014581ae, 0x02d4618b, 0x001d6573}}}, + {X: Field{[10]uint32{0x0043ceae, 0x033bf3d0, 0x004edf81, 0x01738fa3, 0x007523de, 0x00063c03, 0x02333e26, 0x009ee52b, 0x02b02792, 0x003b21a7}}, Y: Field{[10]uint32{0x011ac92b, 0x02e9f71c, 0x01556ec6, 0x01dd9040, 0x03ca3fe5, 0x0399f60a, 0x00bdd264, 0x03210692, 0x02552c89, 0x0029086a}}}, + {X: Field{[10]uint32{0x02ec5e71, 0x003fcd71, 0x03ae7c07, 0x00f3809b, 0x026f0752, 0x01128d4a, 0x005c0571, 0x02322dbf, 0x0108e44a, 0x00115276}}, Y: Field{[10]uint32{0x02b5dd7a, 0x0044e2de, 0x0240f44c, 0x000069b5, 0x0164b486, 0x00b2371e, 0x0208c19e, 0x01f81040, 0x03200770, 0x001c7638}}}, + {X: Field{[10]uint32{0x01b070b2, 0x00512c29, 0x0385ff98, 0x00f4596c, 0x032cc7a5, 0x038501ac, 0x024f3813, 0x02e326c2, 0x029efef7, 0x00146edb}}, Y: Field{[10]uint32{0x0067044e, 0x0255ad69, 0x03befde5, 0x0372ab7c, 0x015268ee, 0x011b7df3, 0x031de11d, 0x013f4228, 0x03e9dd79, 0x00194a0a}}}, + {X: Field{[10]uint32{0x016d001f, 0x00fae81a, 0x013e45a8, 0x03536458, 0x02aa2027, 0x01239897, 0x0203afcd, 0x02aa0910, 0x02974c7c, 0x001f370c}}, Y: Field{[10]uint32{0x03519565, 0x014d2420, 0x00a36192, 0x0045b0b3, 0x026060a4, 0x00a27968, 0x00027a7a, 0x0156cede, 0x01433b1a, 0x002e4ae6}}}, + {X: Field{[10]uint32{0x009c9314, 0x02655d58, 0x02fc9030, 0x02e84051, 0x02aa478f, 0x0205e9af, 0x03722f6d, 0x0226da99, 0x02beb8e9, 0x000f2a71}}, Y: Field{[10]uint32{0x02ca2c0f, 0x01fc25b3, 0x00e4d6bb, 0x036af452, 0x0074c6e0, 0x0049328c, 0x006bba34, 0x006f0e0e, 0x017ff4b8, 0x001540bb}}}, + {X: Field{[10]uint32{0x01354d0c, 0x00447a2b, 0x00436864, 0x00a73248, 0x0390e1a2, 0x023b5798, 0x01bc1c83, 0x032b6bc0, 0x026c45ed, 0x002a8aaf}}, Y: Field{[10]uint32{0x0024f6cd, 0x03727cbe, 0x00d47c44, 0x02a21c55, 0x0295bb3d, 0x006e8ac9, 0x0061251f, 0x00c12893, 0x01c66f91, 0x0006e08a}}}, + {X: Field{[10]uint32{0x023bc7ee, 0x01a4db63, 0x0375a2ab, 0x02b7ef9b, 0x0375466a, 0x03dced83, 0x01f226de, 0x027564c6, 0x023df28c, 0x002d4b2b}}, Y: Field{[10]uint32{0x03cfe220, 0x00b6e222, 0x03a3a446, 0x0164b85f, 0x02421e07, 0x029f2562, 0x00738488, 0x00247732, 0x035e022c, 0x003afb9c}}}, + {X: Field{[10]uint32{0x0021ef54, 0x036414ce, 0x01661838, 0x030d1ed9, 0x01635469, 0x00d2585a, 0x01a62832, 0x0372d84f, 0x030362a6, 0x00304215}}, Y: Field{[10]uint32{0x00eaf517, 0x033e6cd3, 0x01cdec38, 0x03760ade, 0x0044511c, 0x002b531f, 0x002cac14, 0x02a3acb7, 0x02c8c1e6, 0x003f9910}}}, + {X: Field{[10]uint32{0x0308c11d, 0x00e5976b, 0x00768d5a, 0x0334be9b, 0x0383477f, 0x01908a41, 0x01454765, 0x0049fd67, 0x011cfcaf, 0x003c27a7}}, Y: Field{[10]uint32{0x03c15d10, 0x03e593a2, 0x009a27e8, 0x018f3fb3, 0x01a5b2e6, 0x0175fbf6, 0x0028fc9c, 0x03ec56fd, 0x03221f44, 0x0003c069}}}, + {X: Field{[10]uint32{0x015c4527, 0x0309dfd2, 0x0341a036, 0x017f80f4, 0x03fd3e80, 0x035c6d65, 0x00b3b179, 0x00fafb62, 0x02ef1e47, 0x00180918}}, Y: Field{[10]uint32{0x03a079c3, 0x0387db58, 0x02ce2844, 0x02c7ae74, 0x02fed2a9, 0x00fc8567, 0x02d9f235, 0x00773aaa, 0x00617141, 0x003e476d}}}, + {X: Field{[10]uint32{0x01bb582d, 0x0065ff82, 0x03c70720, 0x004c25ae, 0x016b828d, 0x0049a883, 0x00ae3558, 0x0267e841, 0x001e8e0d, 0x0009cea2}}, Y: Field{[10]uint32{0x004b0d5d, 0x00d2869a, 0x003da295, 0x01d5e68b, 0x00d1b407, 0x03ddadb0, 0x03b2f727, 0x02e45334, 0x005814a7, 0x0016ec9b}}}, + {X: Field{[10]uint32{0x000cd54d, 0x03237cba, 0x03d9f566, 0x00107691, 0x01e8cd05, 0x01bf263e, 0x02f41723, 0x032dcad0, 0x03460616, 0x001f077c}}, Y: Field{[10]uint32{0x03c41dd7, 0x02b58c13, 0x033b9390, 0x00bb059d, 0x0073153c, 0x02f04956, 0x03a8d456, 0x02e6f916, 0x020dd602, 0x002b4f9f}}}, + {X: Field{[10]uint32{0x01942f94, 0x0319544f, 0x006d3c62, 0x02c14e5e, 0x039ad644, 0x033a002d, 0x014551f3, 0x03c451ce, 0x0234657f, 0x001e5b89}}, Y: Field{[10]uint32{0x014f1c60, 0x0331f0a8, 0x01b11bb1, 0x01aa1003, 0x001e8ec6, 0x00c02069, 0x0080eb9c, 0x01c44431, 0x0238ed58, 0x002d96ef}}}, + {X: Field{[10]uint32{0x02302bd1, 0x02f7b586, 0x00206193, 0x016d80bf, 0x0062b056, 0x029990b2, 0x029953a2, 0x03da2a91, 0x01fa9985, 0x001789d8}}, Y: Field{[10]uint32{0x0253e274, 0x036eb15c, 0x030b4713, 0x036adf50, 0x003715c9, 0x0144d9f4, 0x0347c070, 0x013d740b, 0x03709db2, 0x0016e826}}}, + {X: Field{[10]uint32{0x03abe794, 0x0049b153, 0x010e6164, 0x008a636e, 0x005c004c, 0x02891ad0, 0x01ab0385, 0x00683fac, 0x0092fd34, 0x00119163}}, Y: Field{[10]uint32{0x03446725, 0x028f7635, 0x033eaf02, 0x02bbbb3c, 0x029d018f, 0x018fc729, 0x02fc3242, 0x0106e162, 0x028b3453, 0x00021675}}}, + {X: Field{[10]uint32{0x01153265, 0x00de6960, 0x0152c5c7, 0x00d32fee, 0x00a410e1, 0x01bd3989, 0x009ddc3d, 0x01f073ff, 0x0030bf81, 0x003f1206}}, Y: Field{[10]uint32{0x01322551, 0x0289e1d6, 0x02169a43, 0x017eb3a3, 0x038dfe38, 0x03676d2a, 0x0248e89f, 0x01f68512, 0x0228bd3d, 0x0028622c}}}, + {X: Field{[10]uint32{0x02ed03e6, 0x00984357, 0x01901779, 0x019a012b, 0x033a7804, 0x038abb6f, 0x0302742c, 0x029540f1, 0x027d9771, 0x0010b65d}}, Y: Field{[10]uint32{0x02d50417, 0x03a87096, 0x003ece89, 0x01a34376, 0x03d2e0f5, 0x000b490c, 0x02c782be, 0x03ccdce8, 0x032e9764, 0x0037da50}}}, + {X: Field{[10]uint32{0x01477148, 0x00bd386e, 0x004dcdc7, 0x03f74a38, 0x02462dee, 0x0057b644, 0x02602226, 0x02ca5dcb, 0x0049993a, 0x000dc48b}}, Y: Field{[10]uint32{0x0196e39d, 0x00e08316, 0x0008ef1d, 0x037a9549, 0x02410b3e, 0x01900ae3, 0x00422cc3, 0x03ef0ea8, 0x00f0924c, 0x00189ffd}}}, + {X: Field{[10]uint32{0x006896c3, 0x003a8697, 0x00bb7314, 0x015e972e, 0x013619a5, 0x01db87ab, 0x03e52cca, 0x03f2f9d0, 0x018294ba, 0x00271520}}, Y: Field{[10]uint32{0x038f7fcc, 0x00efc16c, 0x014c50b5, 0x02cc8252, 0x02ec0478, 0x01c14130, 0x031dafbf, 0x0214a3b1, 0x032eb88e, 0x0017f311}}}, + {X: Field{[10]uint32{0x025a2db9, 0x01a6e03d, 0x02a077ae, 0x01ff58fc, 0x000a5927, 0x01c48d82, 0x004e0251, 0x007da5d7, 0x02d7aa5b, 0x001ee75e}}, Y: Field{[10]uint32{0x017d1bf8, 0x03587f43, 0x0012fabf, 0x01729d5a, 0x02c4a7f1, 0x01453b2b, 0x01c14d6f, 0x0288a740, 0x02e8714a, 0x001b3787}}}, + {X: Field{[10]uint32{0x00a9a102, 0x00737a96, 0x0153e017, 0x0141b1df, 0x026990e9, 0x0107820b, 0x016d948e, 0x01582b59, 0x02f2c985, 0x002bd776}}, Y: Field{[10]uint32{0x00a5b505, 0x01607e7b, 0x003f5fd4, 0x0123bfe5, 0x011f6853, 0x03385ad6, 0x0039ff76, 0x01bfcf12, 0x011b7289, 0x0038d211}}}, + {X: Field{[10]uint32{0x0111293d, 0x03b2da48, 0x029a395b, 0x02d0538a, 0x01d26394, 0x03834559, 0x03ab3662, 0x02f46417, 0x0318e957, 0x0010999f}}, Y: Field{[10]uint32{0x02bbc7a5, 0x00083559, 0x022a2e57, 0x02c6bb2a, 0x033c0076, 0x03f895e5, 0x03fb16c1, 0x02ed8d39, 0x02b269e9, 0x000a2374}}}, + {X: Field{[10]uint32{0x00b276d7, 0x01506dd0, 0x03618587, 0x01857966, 0x029be971, 0x00c99973, 0x002a5a6f, 0x020c99d3, 0x021d50ab, 0x0017a71e}}, Y: Field{[10]uint32{0x03a11f17, 0x02115b57, 0x035b1a29, 0x0063b822, 0x02ec4664, 0x031c1d12, 0x0292c612, 0x02bd08d0, 0x00611f39, 0x00248a0d}}}, + {X: Field{[10]uint32{0x03ed8b2a, 0x0293ca37, 0x03c489a2, 0x001a2d1a, 0x038b52b5, 0x02cc82e5, 0x00d9ac97, 0x02d608ad, 0x03faf486, 0x00263183}}, Y: Field{[10]uint32{0x005280f9, 0x01eca6dd, 0x0132b580, 0x0212bb70, 0x0170416d, 0x001bb6f9, 0x02f42fa3, 0x01255604, 0x0113c253, 0x00287098}}}, + {X: Field{[10]uint32{0x0385babc, 0x01d66770, 0x0116cf0a, 0x007f6199, 0x03f30948, 0x00d43969, 0x0286e71f, 0x00b364f0, 0x01821ed5, 0x0024afea}}, Y: Field{[10]uint32{0x02c1ddb4, 0x02ba7b6c, 0x03cb802f, 0x024a545a, 0x036f5276, 0x037f893d, 0x0254e738, 0x02d2c6de, 0x0396c71a, 0x0028ff25}}}, + {X: Field{[10]uint32{0x025b865f, 0x025ce0be, 0x018c4ec1, 0x02e40eec, 0x037b7798, 0x000ac30d, 0x02413e84, 0x02d67eb3, 0x0008bd8e, 0x0026f89d}}, Y: Field{[10]uint32{0x027a2f61, 0x03a2ff69, 0x00027f54, 0x00a54093, 0x02def3ec, 0x02ee4b77, 0x02ed2c81, 0x01a8e5a3, 0x01801964, 0x00044215}}}, + {X: Field{[10]uint32{0x036350bc, 0x02e711a5, 0x018275b1, 0x01676e79, 0x037751bc, 0x0302462f, 0x0391ce38, 0x02c165ad, 0x026cb7ba, 0x0009f35a}}, Y: Field{[10]uint32{0x03faeda8, 0x03e03ba0, 0x00011a16, 0x01353fad, 0x032f41d0, 0x01a19479, 0x03761df0, 0x00ab17c4, 0x01678fce, 0x00224354}}}, + {X: Field{[10]uint32{0x0068f2eb, 0x022073bd, 0x00e1f5d8, 0x00f25bcc, 0x035f22be, 0x00319918, 0x00f6597a, 0x0184e532, 0x014daaf9, 0x003a25b8}}, Y: Field{[10]uint32{0x0196030b, 0x027cacec, 0x027260bb, 0x02136b74, 0x02efea7e, 0x03622eb2, 0x00d971af, 0x006ac771, 0x00b0512c, 0x002fac01}}}, + {X: Field{[10]uint32{0x013f8ec0, 0x030359f9, 0x033da54e, 0x0226142e, 0x03a9dd23, 0x03eacb03, 0x00b3779e, 0x0150058d, 0x0269ac48, 0x000938b4}}, Y: Field{[10]uint32{0x0219e525, 0x026a9600, 0x02460892, 0x016f907e, 0x03f5beda, 0x018e8168, 0x03ca2ca6, 0x0353080e, 0x02c2642b, 0x00379c0b}}}, + {X: Field{[10]uint32{0x001d1676, 0x0367025a, 0x03db95a9, 0x00077829, 0x009b5c4d, 0x02c48694, 0x010159b4, 0x03279175, 0x03c948c1, 0x0025e989}}, Y: Field{[10]uint32{0x033203d9, 0x01fba49b, 0x00b9ffef, 0x03e69f24, 0x018d5f3c, 0x03d75708, 0x02d43037, 0x0270a7f2, 0x015b5539, 0x00066f42}}}, + {X: Field{[10]uint32{0x0195b08f, 0x0354dc1c, 0x0014b40b, 0x01807e82, 0x0033ed67, 0x0274f214, 0x03234c7f, 0x03b17ddd, 0x0251e604, 0x0029c360}}, Y: Field{[10]uint32{0x00bccc4f, 0x009b542b, 0x01f4e0e1, 0x0225aa16, 0x0385325a, 0x031c4350, 0x012c016a, 0x00f78fc5, 0x010774e2, 0x0037ca36}}}, + {X: Field{[10]uint32{0x0242f42b, 0x023056be, 0x0012ea7c, 0x025cdbcd, 0x0327743a, 0x00f5e2c5, 0x001a0071, 0x0191cb38, 0x00434b27, 0x000b59db}}, Y: Field{[10]uint32{0x01fa7312, 0x03023ff2, 0x018ea024, 0x00f0ce52, 0x0052fa70, 0x0020ada1, 0x03b8f941, 0x0174c900, 0x01e406ef, 0x002f8a33}}}, + {X: Field{[10]uint32{0x00b29cf5, 0x0350ad00, 0x0172928f, 0x00a6d283, 0x0246c89d, 0x03c9f00d, 0x03857cfc, 0x01c9d576, 0x01e17516, 0x003d9b09}}, Y: Field{[10]uint32{0x03193201, 0x009b7a71, 0x01b6e059, 0x00c6eb5a, 0x028d2a02, 0x03670632, 0x0049150c, 0x02a21130, 0x02d422c4, 0x000fb88e}}}, + {X: Field{[10]uint32{0x02427060, 0x024f5f40, 0x01c6c293, 0x02b6393f, 0x01ce6e77, 0x013a3801, 0x004f81d2, 0x0361fbbd, 0x004b9d39, 0x0036e91f}}, Y: Field{[10]uint32{0x018d7622, 0x03b6eecf, 0x03597338, 0x022e7f3e, 0x015240f2, 0x0370ed71, 0x037eedd4, 0x00003c25, 0x0092e53d, 0x000b5719}}}, + {X: Field{[10]uint32{0x03e10f0f, 0x03e20549, 0x0301bbfd, 0x0197c20e, 0x0294788f, 0x024768ed, 0x015aedae, 0x01f71562, 0x01d94f62, 0x00285d80}}, Y: Field{[10]uint32{0x020a1183, 0x036100cd, 0x00890fa3, 0x016d178c, 0x020baded, 0x026416ce, 0x03025bd9, 0x006c56be, 0x03c8cfea, 0x001d0227}}}, + {X: Field{[10]uint32{0x0180e141, 0x03ce84d3, 0x003d5188, 0x030d53ae, 0x011c24c6, 0x03edeb23, 0x0261a125, 0x03fa41f8, 0x009fb84a, 0x00375c0c}}, Y: Field{[10]uint32{0x00bed563, 0x00d94d51, 0x018682a8, 0x019bd955, 0x024bdfd5, 0x03223777, 0x035b7862, 0x029dfe74, 0x02c0ac93, 0x000c8052}}}, + {X: Field{[10]uint32{0x03037afd, 0x015dda21, 0x003f783b, 0x024e4832, 0x03cadefb, 0x0131a8bc, 0x01253f00, 0x02ebe5c0, 0x003de746, 0x001e7f54}}, Y: Field{[10]uint32{0x00a61b93, 0x035a437b, 0x0317f1e0, 0x000023a2, 0x0286a4e6, 0x011e948f, 0x0220c266, 0x0024c4fe, 0x02586318, 0x000f172d}}}, + {X: Field{[10]uint32{0x020ff6a0, 0x00b048ae, 0x009566b9, 0x022a4d58, 0x021e7265, 0x01a8a692, 0x00eb8961, 0x0358ec7d, 0x037d77c7, 0x00346abc}}, Y: Field{[10]uint32{0x00a93bec, 0x004e514f, 0x0232ecfd, 0x0276766b, 0x00c7cac3, 0x03d0d6f7, 0x01f0e0bb, 0x02e81caf, 0x03ae5cfb, 0x00394d6d}}}, + {X: Field{[10]uint32{0x02d93c4f, 0x0149d5ea, 0x016445c7, 0x01635966, 0x01fe525d, 0x033690d1, 0x02b74fc2, 0x03652e6d, 0x0382b351, 0x001a3fc6}}, Y: Field{[10]uint32{0x0065a13c, 0x0063cead, 0x0192b798, 0x01d21460, 0x019186e3, 0x01764ef7, 0x02194aac, 0x02b02341, 0x02f1c422, 0x002aeec3}}}, + {X: Field{[10]uint32{0x0210552d, 0x00701665, 0x0224a5c4, 0x02898bb3, 0x0314393e, 0x01329921, 0x01b73bcf, 0x00f97417, 0x00971806, 0x00089e17}}, Y: Field{[10]uint32{0x021d8774, 0x00606aab, 0x018c4157, 0x0128972e, 0x021933e6, 0x029d735b, 0x005e75c8, 0x02a03093, 0x026ad7a7, 0x00270200}}}, + {X: Field{[10]uint32{0x035ffebf, 0x007c9113, 0x00580889, 0x018e9df6, 0x02e26780, 0x03f085d8, 0x00662583, 0x02dd5d7c, 0x01e7563f, 0x00189b2d}}, Y: Field{[10]uint32{0x028498b4, 0x01c32f19, 0x0211cce1, 0x0289598b, 0x01953a6d, 0x02a61470, 0x01161845, 0x030fc90d, 0x03f672c3, 0x00020da7}}}, + {X: Field{[10]uint32{0x00d12d2a, 0x01a3d6a0, 0x01ac55e6, 0x0392dbeb, 0x0061c8c4, 0x022293ca, 0x03fa430b, 0x01841603, 0x02f4d6f4, 0x002a67c3}}, Y: Field{[10]uint32{0x01053d06, 0x03fccfac, 0x00d3e28f, 0x012be0c1, 0x024e2f06, 0x02b8abbd, 0x0002c406, 0x00020dde, 0x032939db, 0x0025cab7}}}, + {X: Field{[10]uint32{0x03f02645, 0x00c77a71, 0x03e61019, 0x00f32acf, 0x03784afe, 0x03efa52a, 0x000a3fbd, 0x02cb6f2e, 0x02272ff0, 0x002c90f3}}, Y: Field{[10]uint32{0x020b7559, 0x0011238d, 0x03e9f41a, 0x0161188a, 0x023e85b8, 0x03a9460d, 0x0233df8f, 0x0320831c, 0x0119fbb8, 0x0036cbab}}}, + {X: Field{[10]uint32{0x0363deb3, 0x037d5c10, 0x022f3f8b, 0x019150c8, 0x0143efb2, 0x002877fd, 0x031b21a0, 0x02d8b1a9, 0x009d685c, 0x0031d38f}}, Y: Field{[10]uint32{0x01c4b2ec, 0x00d121bb, 0x03ed4387, 0x02d87a0c, 0x025cd550, 0x013bed86, 0x00358efc, 0x00f4168e, 0x0261fbf2, 0x00261f60}}}, + {X: Field{[10]uint32{0x01f71c47, 0x01bbc377, 0x03047888, 0x03090f70, 0x01d34710, 0x03025ba7, 0x00885f34, 0x01352f47, 0x00a7fc98, 0x003fcbd9}}, Y: Field{[10]uint32{0x006e906d, 0x006a16a8, 0x0249765e, 0x0035e17c, 0x0309eac6, 0x01a43035, 0x02c91257, 0x00bf7c7b, 0x0258fd5e, 0x00053018}}}, + {X: Field{[10]uint32{0x03712085, 0x0188506e, 0x01badec1, 0x0053da86, 0x026819b5, 0x0103dd0e, 0x02e8a8b1, 0x02ac934d, 0x00e13f4c, 0x001f64b1}}, Y: Field{[10]uint32{0x01b698c8, 0x01bd05a0, 0x033d1b72, 0x00839af8, 0x003e0dc9, 0x0369a1ae, 0x03193309, 0x035f4aa6, 0x03622ec7, 0x00181ad5}}}, + {X: Field{[10]uint32{0x03e13b6c, 0x03495183, 0x01518a0b, 0x0083fef3, 0x024ce0cc, 0x01e54580, 0x009487c7, 0x014a2627, 0x014d9ef4, 0x0000e90f}}, Y: Field{[10]uint32{0x01deb36e, 0x028ff036, 0x01912dfb, 0x02854d26, 0x00eedad2, 0x01ac49aa, 0x0228d61e, 0x024179ae, 0x03255768, 0x0017c934}}}, + {X: Field{[10]uint32{0x02a25f8f, 0x010a9b3b, 0x02308673, 0x0016cf19, 0x026e59fd, 0x01c74317, 0x00c67e73, 0x01793457, 0x03028010, 0x000239cb}}, Y: Field{[10]uint32{0x016b368e, 0x00767782, 0x015099ea, 0x02b66ef7, 0x031eada5, 0x01ede6c0, 0x01870da4, 0x02e1b7c2, 0x005158fd, 0x00025377}}}, + {X: Field{[10]uint32{0x00ef54dd, 0x03404f33, 0x02d6bfd9, 0x02c3961c, 0x02ab8789, 0x00d0fc4b, 0x037f9d18, 0x009d8b29, 0x00236dc0, 0x002e273f}}, Y: Field{[10]uint32{0x011141cd, 0x01ee4110, 0x0037d2ba, 0x0173c7dd, 0x01c3ad13, 0x03e18344, 0x02ce6f9d, 0x0265ad29, 0x028545a5, 0x0027269c}}}, + {X: Field{[10]uint32{0x01ccb59b, 0x03924410, 0x03ebbc64, 0x00f8b11c, 0x016744a4, 0x01892ced, 0x0190b535, 0x01a2d2ec, 0x00089798, 0x003a17b8}}, Y: Field{[10]uint32{0x02cbd6a2, 0x01d69484, 0x01723a80, 0x022fe10b, 0x010e1c9a, 0x01fb7747, 0x03e3b3d0, 0x03143089, 0x030f9ede, 0x0034ebf9}}}, + {X: Field{[10]uint32{0x02cb97b5, 0x035764ed, 0x01b3bfb0, 0x0144e645, 0x02f7f906, 0x0144d019, 0x00c8e16d, 0x01b4564f, 0x03f2774d, 0x0036375a}}, Y: Field{[10]uint32{0x035e26f4, 0x015bd294, 0x02b2c6d2, 0x03464544, 0x0325f7e6, 0x0217a7e2, 0x0031862b, 0x013cfc45, 0x00945f73, 0x0016880c}}}, + {X: Field{[10]uint32{0x02aa94e8, 0x00e1689d, 0x02aec3e6, 0x03be634d, 0x00033968, 0x0344cf61, 0x03bd5545, 0x02f7ad17, 0x01c5328f, 0x001df820}}, Y: Field{[10]uint32{0x00c2959a, 0x02daf845, 0x01669c0c, 0x02de4688, 0x00ba597f, 0x03820141, 0x026291a3, 0x03cbe116, 0x03f7ca25, 0x000b3a14}}}, + {X: Field{[10]uint32{0x03c904ab, 0x0311e7d9, 0x018c4fb9, 0x00f6c6b4, 0x02b5b920, 0x0127c1e8, 0x020b82f5, 0x025a09a0, 0x02eae8a4, 0x001441e1}}, Y: Field{[10]uint32{0x039cd96b, 0x025a19eb, 0x018a8fbd, 0x0307aac7, 0x00b39382, 0x0077219d, 0x03e21ae7, 0x031a7fd8, 0x03854e4d, 0x003704c0}}}, + {X: Field{[10]uint32{0x0242639d, 0x0109e268, 0x00ddabb6, 0x00cceaf0, 0x021169e4, 0x00203430, 0x0121056e, 0x0356d930, 0x02b3fbda, 0x000beebf}}, Y: Field{[10]uint32{0x00405cd3, 0x03e29f05, 0x031c92f3, 0x03257a97, 0x015ff199, 0x0074face, 0x019ef0a1, 0x02853796, 0x002fd9e6, 0x0002a176}}}, + {X: Field{[10]uint32{0x0312ae0a, 0x00ad791e, 0x02ae673b, 0x002478a3, 0x02aec808, 0x02d7c031, 0x03fbbc26, 0x0118f07c, 0x03eb6e6e, 0x0008036f}}, Y: Field{[10]uint32{0x03a95ecf, 0x0370072e, 0x0344ac59, 0x01dbf346, 0x03832127, 0x01524609, 0x021f0711, 0x00f65e0f, 0x0219bdaa, 0x001214a8}}}, + {X: Field{[10]uint32{0x00b8a3d9, 0x03fcaf89, 0x00ab41ac, 0x01c95086, 0x013ec225, 0x014b36e1, 0x03d46b6e, 0x03df7024, 0x00f60259, 0x0009ec50}}, Y: Field{[10]uint32{0x00583387, 0x02a9fff0, 0x00f7bc85, 0x018dc69d, 0x0228bb5d, 0x004c38c4, 0x00054c4f, 0x02b6eb50, 0x009f70cb, 0x000f3bb4}}}, + {X: Field{[10]uint32{0x015b7e71, 0x03592afa, 0x00a0fcd1, 0x032b5ca3, 0x000e175c, 0x0130ac0b, 0x022ec351, 0x014c4608, 0x01ee535c, 0x003f9250}}, Y: Field{[10]uint32{0x011f56f6, 0x01c013b9, 0x0370ed35, 0x03796172, 0x03748e0a, 0x02992b68, 0x01cb4422, 0x01946f62, 0x01ae286d, 0x003a7372}}}, + {X: Field{[10]uint32{0x01ff1cdf, 0x00e4979d, 0x01d885a0, 0x03b5664d, 0x030ce47c, 0x016f8bc5, 0x03443d76, 0x0252f4db, 0x009b4cae, 0x000c5f48}}, Y: Field{[10]uint32{0x02262d72, 0x01297ae2, 0x02864543, 0x037de298, 0x02c942a5, 0x02daa007, 0x03945af4, 0x015c703f, 0x009568fe, 0x00030645}}}, + {X: Field{[10]uint32{0x0093f9ea, 0x026850f3, 0x02cead9f, 0x002d64f3, 0x03df32e8, 0x00543a6a, 0x005f8ab0, 0x00c391dc, 0x0377764e, 0x003e5469}}, Y: Field{[10]uint32{0x03afd925, 0x01c3c548, 0x03052655, 0x00ec46b8, 0x026ac261, 0x004b3777, 0x00cc6b8b, 0x0088fb9b, 0x01d625f2, 0x003bee54}}}, + {X: Field{[10]uint32{0x0389c8ef, 0x007cd10c, 0x0284d309, 0x03d9b968, 0x024f251a, 0x03f925aa, 0x03229a9f, 0x023a2fc3, 0x00ebf5fd, 0x001c6b7c}}, Y: Field{[10]uint32{0x036969f4, 0x039957da, 0x0242539c, 0x01cb9d9d, 0x0198ed56, 0x0371ceb7, 0x00dfdf72, 0x0154d99d, 0x0063293a, 0x0004fd1d}}}, + {X: Field{[10]uint32{0x0236be75, 0x00471140, 0x02ea5009, 0x007a07db, 0x02c3fbab, 0x03518d04, 0x01cff39a, 0x03a03526, 0x000658c0, 0x0000ba81}}, Y: Field{[10]uint32{0x014f923f, 0x018ef225, 0x02234291, 0x03b7fbb8, 0x03d82c08, 0x02682938, 0x01743d20, 0x00dc87c2, 0x00740607, 0x0002f94b}}}, + {X: Field{[10]uint32{0x02182aea, 0x02df946d, 0x009350d9, 0x00b6589e, 0x03a37344, 0x00fc2c7c, 0x00c42223, 0x020309d4, 0x03904b3e, 0x00108d48}}, Y: Field{[10]uint32{0x01221d91, 0x03fb59f6, 0x02966395, 0x023e053e, 0x000fe09e, 0x02580c89, 0x008e48ba, 0x014598c3, 0x0349b27b, 0x001fd608}}}, + {X: Field{[10]uint32{0x027dda91, 0x03eae7be, 0x00e53771, 0x027b7023, 0x017702a2, 0x026af82d, 0x0064bf8e, 0x00a16e58, 0x0082a92b, 0x0014934f}}, Y: Field{[10]uint32{0x00f29c3a, 0x011c903c, 0x01894ec7, 0x01dc34fb, 0x00366a84, 0x00c6ff57, 0x0368e053, 0x02cb7352, 0x0217fdc6, 0x00291e80}}}, + {X: Field{[10]uint32{0x0056f7e8, 0x02eb85b0, 0x00c48776, 0x02bf45af, 0x000fc83c, 0x008c8ca7, 0x02eb5f5f, 0x013799aa, 0x02085ce0, 0x003dbb87}}, Y: Field{[10]uint32{0x00cea4d9, 0x01ab1b6f, 0x03c75c2f, 0x017462c9, 0x00ccbc95, 0x0251f5ed, 0x01939774, 0x03526aa8, 0x026a7e2b, 0x000cca2c}}}, + {X: Field{[10]uint32{0x03273978, 0x01345ac5, 0x03dae313, 0x01be6f64, 0x002ea84e, 0x0141df48, 0x02b5d119, 0x00505dc8, 0x012bb88f, 0x00270bdf}}, Y: Field{[10]uint32{0x01ab2a3a, 0x006f8f0b, 0x007daa57, 0x032bb94c, 0x01d338a4, 0x031795af, 0x033c5927, 0x02d0d739, 0x000366c8, 0x0004227c}}}, + {X: Field{[10]uint32{0x0299cc3c, 0x0204f1b2, 0x0228f9b9, 0x01ed23bf, 0x0305897b, 0x014eb879, 0x0124f152, 0x02db947f, 0x02b6730f, 0x00164e87}}, Y: Field{[10]uint32{0x0344f079, 0x00cc005d, 0x00ace404, 0x006a8ec7, 0x0109e35c, 0x03dd3946, 0x003a6300, 0x00b646f0, 0x0020fbd2, 0x003f3ede}}}, + {X: Field{[10]uint32{0x01f957e3, 0x00d4ac54, 0x039f40ef, 0x03ff7968, 0x028ec0ea, 0x01fe1e97, 0x004bc603, 0x02eb32f3, 0x00c383a7, 0x0018ae84}}, Y: Field{[10]uint32{0x007bdd45, 0x01fa7f33, 0x020bec2a, 0x003b5e99, 0x019fd01e, 0x02828940, 0x025fa19a, 0x02858695, 0x01b0dc84, 0x003099e8}}}, + {X: Field{[10]uint32{0x03731f64, 0x00f18657, 0x03c6a6d7, 0x0240529d, 0x0239e123, 0x00e92a76, 0x03641fe0, 0x018a858f, 0x0010deae, 0x000778ab}}, Y: Field{[10]uint32{0x03c8d2b2, 0x0106a276, 0x00006d71, 0x017e9bd4, 0x00a512b7, 0x0208853f, 0x027b5ad7, 0x025a7410, 0x0095b6d7, 0x00183d0f}}}, + {X: Field{[10]uint32{0x03d4e1d3, 0x0105b083, 0x02a6da43, 0x01c5ab2e, 0x00c48e92, 0x005dcbc6, 0x01086123, 0x020f220f, 0x01527090, 0x003c4695}}, Y: Field{[10]uint32{0x02d742f4, 0x024d4528, 0x03f4cdf5, 0x015368bc, 0x002be515, 0x02356cec, 0x00e397b3, 0x023106db, 0x01647cf4, 0x0029b42b}}}, + {X: Field{[10]uint32{0x00dc33fc, 0x02ba5b5f, 0x0243d2ae, 0x00fc45b0, 0x013dbad4, 0x032971fd, 0x015cc01f, 0x025f9487, 0x0240d756, 0x003d1151}}, Y: Field{[10]uint32{0x02549102, 0x0213de59, 0x026cfb37, 0x01af133d, 0x036b2599, 0x029d3b21, 0x02d70531, 0x01dc1175, 0x00ef46fe, 0x0010a5cb}}}, + {X: Field{[10]uint32{0x01b8780a, 0x00bb2368, 0x01ad4cad, 0x023423b3, 0x0110905b, 0x02cc67eb, 0x03c20fa3, 0x0019f06d, 0x007397be, 0x000afebc}}, Y: Field{[10]uint32{0x02590285, 0x03314993, 0x03cd5775, 0x02c57e08, 0x039077de, 0x025c3d3e, 0x028bdee9, 0x03259cf4, 0x0099ea97, 0x003b5499}}}, + {X: Field{[10]uint32{0x00f5f73b, 0x03153dd3, 0x01222cfe, 0x01623b5a, 0x026df6e0, 0x0108bdce, 0x023ca163, 0x03b642f7, 0x00812b5f, 0x003f06af}}, Y: Field{[10]uint32{0x032b975f, 0x03444da5, 0x01d8faf0, 0x01bd3fa7, 0x007ac68f, 0x02c73471, 0x00481dc4, 0x03f2f91a, 0x02db471c, 0x0036c71b}}}, + {X: Field{[10]uint32{0x00506a8d, 0x01db9bd3, 0x00c76124, 0x017ef8c7, 0x01b717d6, 0x024f00ab, 0x036f92d2, 0x00be6e8d, 0x02ac82e0, 0x00360e30}}, Y: Field{[10]uint32{0x01189377, 0x01ecc68d, 0x02ae251d, 0x032cf83d, 0x03532dd1, 0x01faac48, 0x0176f6ca, 0x03e380f0, 0x00670388, 0x00361e8c}}}, + {X: Field{[10]uint32{0x013ee38c, 0x025f81ac, 0x004b92f6, 0x03c4ce87, 0x0132c53f, 0x0269794e, 0x019d54ca, 0x015d2689, 0x02ff0729, 0x0012cea0}}, Y: Field{[10]uint32{0x028d6265, 0x02cc1d6e, 0x0229032d, 0x012f95c2, 0x00bf6073, 0x03205484, 0x026a0c46, 0x0115b4fd, 0x0341a788, 0x00110dca}}}, + {X: Field{[10]uint32{0x00e411aa, 0x035ab4ff, 0x002f20b8, 0x02438de7, 0x008e79d2, 0x02f54bdc, 0x01eaf6a9, 0x02b538c9, 0x03f36731, 0x0035df2e}}, Y: Field{[10]uint32{0x038372f0, 0x026fe13f, 0x01b50525, 0x019928e1, 0x02051f42, 0x0122f6a6, 0x02812377, 0x004f1e46, 0x0125f078, 0x003b919b}}}, + {X: Field{[10]uint32{0x02ea1483, 0x03f1b4bb, 0x006ec84e, 0x00b303c7, 0x03bed187, 0x014eb0c1, 0x00a75dc9, 0x002e09bb, 0x02b25892, 0x000e19fd}}, Y: Field{[10]uint32{0x0388aee3, 0x019c4d6b, 0x01cf4b82, 0x03d1a2b0, 0x01254d70, 0x032a7172, 0x013ff18d, 0x02025e80, 0x02dce607, 0x00331a9a}}}, + {X: Field{[10]uint32{0x001b0a9a, 0x02d4bbf3, 0x01279930, 0x026301ed, 0x032123fe, 0x0083dfc5, 0x00ea7dff, 0x03213d86, 0x0075e85f, 0x001ec022}}, Y: Field{[10]uint32{0x03075f90, 0x0159802f, 0x03904a8c, 0x00d2d42e, 0x02331f78, 0x00541dcb, 0x0055a1c4, 0x0245a697, 0x00bb8dbc, 0x000fcecc}}}, + {X: Field{[10]uint32{0x0234ef3a, 0x02875de3, 0x009a5ba7, 0x01e81369, 0x02907e9b, 0x01352de5, 0x01795600, 0x0129261d, 0x00d91630, 0x002e96d1}}, Y: Field{[10]uint32{0x03333661, 0x0131d6f3, 0x01e13f87, 0x01d8fb4e, 0x024d47ea, 0x00373537, 0x02e124f0, 0x0278ee6e, 0x03aa4821, 0x0005ad26}}}, + {X: Field{[10]uint32{0x02b8d9df, 0x0358a738, 0x03594342, 0x0084d568, 0x02910fe5, 0x016fe991, 0x02b3a23b, 0x00483614, 0x03e27fe4, 0x001a47ab}}, Y: Field{[10]uint32{0x02c71d85, 0x01fe7e2d, 0x02878188, 0x007712f2, 0x01bd71ea, 0x01489f6f, 0x0294fd6a, 0x013729f0, 0x00974218, 0x0010e818}}}, + {X: Field{[10]uint32{0x00a54123, 0x001b9215, 0x002d8440, 0x035f0dd5, 0x01551377, 0x01177299, 0x0173e38a, 0x02a1bcd4, 0x00bbc9f5, 0x00004e9b}}, Y: Field{[10]uint32{0x00488620, 0x00625202, 0x004b884d, 0x023cc08f, 0x028a43d3, 0x03a3ebe7, 0x01cc2e62, 0x01367bff, 0x009c9a96, 0x003b3ce0}}}, + {X: Field{[10]uint32{0x02f10e45, 0x00ba3579, 0x036ceb71, 0x0080b730, 0x02da6654, 0x02d3c396, 0x01731e91, 0x01734a4f, 0x02f3fb59, 0x000cff4a}}, Y: Field{[10]uint32{0x018ed2cf, 0x00c79802, 0x00c31f63, 0x00c6cea5, 0x0280ca53, 0x00233e8e, 0x0181bf98, 0x0376912e, 0x007a0a8b, 0x00389a8c}}}, + {X: Field{[10]uint32{0x00b774f6, 0x02f962cd, 0x0244c15c, 0x02608bd3, 0x03b00332, 0x029d6124, 0x033ba575, 0x01fde1da, 0x003359e4, 0x001d6550}}, Y: Field{[10]uint32{0x020458a9, 0x01c0f797, 0x01253f8e, 0x00729eb4, 0x00b6e665, 0x0110b000, 0x02998553, 0x015a36c2, 0x004070b8, 0x001fba68}}}, + {X: Field{[10]uint32{0x035b9480, 0x0176965b, 0x032f3650, 0x01944340, 0x00b3dd36, 0x01052fbd, 0x0015e7e8, 0x01f9a13a, 0x03b0c3b1, 0x001e4667}}, Y: Field{[10]uint32{0x03d9a0ab, 0x02b0fb94, 0x021b5054, 0x020d0646, 0x00abaab3, 0x0128156e, 0x03aacba5, 0x03273fbc, 0x0173f358, 0x00256f2a}}}, + {X: Field{[10]uint32{0x011aa352, 0x01c00029, 0x017b5d6d, 0x0306b226, 0x006edd0b, 0x028cff50, 0x03ed64e0, 0x03382cb9, 0x00e7962e, 0x0025c17d}}, Y: Field{[10]uint32{0x019ff347, 0x0375ca12, 0x0399db2b, 0x0157dc6a, 0x0058f408, 0x024875b6, 0x026193d8, 0x011ea284, 0x0357ad45, 0x00135339}}}, + {X: Field{[10]uint32{0x012fd777, 0x0368f38c, 0x02e12df7, 0x01d6e2c5, 0x01cadeeb, 0x00dd99d3, 0x0160b983, 0x02ad7cc1, 0x0067b841, 0x002206bc}}, Y: Field{[10]uint32{0x0083b84f, 0x0337b24d, 0x037019ac, 0x00f468e8, 0x017588be, 0x02c512c7, 0x010f62d8, 0x03c175f0, 0x03d4512e, 0x0033304f}}}, + {X: Field{[10]uint32{0x00e99621, 0x0357d704, 0x012fb1f6, 0x02dcbf50, 0x0041bfc3, 0x01eb41e5, 0x02e14cd9, 0x032763d0, 0x024433c2, 0x003fa3de}}, Y: Field{[10]uint32{0x02b3b2a9, 0x00ff752d, 0x026572a9, 0x03cf311a, 0x034c8bab, 0x0211b1e6, 0x01c4ee3a, 0x010dd25b, 0x02ee0cf3, 0x00396d5d}}}, + {X: Field{[10]uint32{0x004d798f, 0x024eaf17, 0x006cb918, 0x01927814, 0x0384f400, 0x00f0d3a0, 0x012f8320, 0x022ce0fe, 0x00da18e0, 0x003fd0f2}}, Y: Field{[10]uint32{0x01df2e7f, 0x01f6c05f, 0x02fd5242, 0x00ce92ec, 0x02f5a754, 0x02076f61, 0x009dde19, 0x03680b03, 0x005923a9, 0x00295d68}}}, + {X: Field{[10]uint32{0x00db276b, 0x031bf54a, 0x00a42ed3, 0x0105cd9e, 0x03d8f9d8, 0x012ec6cc, 0x00852427, 0x0138844d, 0x0056b97f, 0x00011c54}}, Y: Field{[10]uint32{0x014302b2, 0x03e88061, 0x0212fcab, 0x03b99beb, 0x0073a18b, 0x02e62a8a, 0x00cd71ef, 0x03c767fa, 0x01463521, 0x002d3034}}}, + {X: Field{[10]uint32{0x031fff51, 0x0121c709, 0x00814974, 0x03acc6a2, 0x02acd85e, 0x02e0f9fb, 0x0251394c, 0x00756b0a, 0x0008c5f5, 0x00217276}}, Y: Field{[10]uint32{0x03666a7d, 0x024aef96, 0x01eb8b49, 0x0034660b, 0x02018505, 0x01bb1fd7, 0x0191454d, 0x026e219a, 0x03bf2382, 0x0000a9f0}}}, + {X: Field{[10]uint32{0x0170dac9, 0x0265fe5f, 0x02f24529, 0x031db5b4, 0x03f46b60, 0x000d1173, 0x00b4b259, 0x00da380f, 0x00ef8b1e, 0x00300ae5}}, Y: Field{[10]uint32{0x0325f3a0, 0x00d0f079, 0x021d680a, 0x028ab3e5, 0x0310fadb, 0x037874a2, 0x0017825a, 0x02079235, 0x0129bcff, 0x002eee5f}}}, + {X: Field{[10]uint32{0x00241df6, 0x011caa0e, 0x02db3e29, 0x018ffb9e, 0x020fcb8b, 0x034d4e87, 0x01ac4393, 0x01bdf90c, 0x03bd28e2, 0x0012c564}}, Y: Field{[10]uint32{0x02fdcc56, 0x0138d3bc, 0x00ef0d6e, 0x022cf332, 0x003f184f, 0x02b27616, 0x0225b113, 0x01a15498, 0x0328f496, 0x002299e9}}}, + {X: Field{[10]uint32{0x02a64dd4, 0x007353c9, 0x00dd231d, 0x01b92e77, 0x037a8e7f, 0x0354a1a6, 0x02505559, 0x037b8eb5, 0x015bba51, 0x003d901d}}, Y: Field{[10]uint32{0x0287e1c8, 0x03414e5b, 0x00882a48, 0x03215745, 0x0391e0e3, 0x03092b01, 0x0029f6ee, 0x00a42f53, 0x0000a53e, 0x001ce1fe}}}, + {X: Field{[10]uint32{0x0389515b, 0x01da5e5d, 0x0206e022, 0x008a4529, 0x0016d0a5, 0x01c233be, 0x036f42cd, 0x00db18f7, 0x02a94368, 0x002524d1}}, Y: Field{[10]uint32{0x00e2b356, 0x00e0ee6a, 0x00073031, 0x034fb797, 0x0031dd41, 0x021d505d, 0x025c847b, 0x000807bd, 0x032d952a, 0x002a40e4}}}, + {X: Field{[10]uint32{0x03f91a60, 0x01802299, 0x0245cde4, 0x020f172f, 0x02cdcc97, 0x026308bc, 0x010b1f66, 0x03b7f08e, 0x019ec769, 0x00060902}}, Y: Field{[10]uint32{0x011bd1e2, 0x0109d9cc, 0x02ae0adf, 0x0200de24, 0x02804a87, 0x03e82238, 0x02051f3b, 0x013755b3, 0x01fa81e0, 0x0003e101}}}, + {X: Field{[10]uint32{0x0201d341, 0x022b3475, 0x022f92ec, 0x02484e71, 0x00683aa7, 0x03a57cf7, 0x005f34cc, 0x00f64a20, 0x03d8e463, 0x0039ad1b}}, Y: Field{[10]uint32{0x001d824a, 0x0074c033, 0x011d1639, 0x02930a0e, 0x00d6c0be, 0x032fd636, 0x00faf4a7, 0x0298e94a, 0x0013f3fe, 0x0014cf6e}}}, + {X: Field{[10]uint32{0x03992b93, 0x010db3ff, 0x0015d60a, 0x014bc5d8, 0x03a04c62, 0x03504e74, 0x00d150d3, 0x02c63752, 0x0330dc19, 0x0018de66}}, Y: Field{[10]uint32{0x02dcc41b, 0x0336c345, 0x015073c3, 0x032cae8d, 0x0007f485, 0x03c1905e, 0x00e72f5f, 0x0137bb40, 0x01125ebf, 0x00098814}}}, + {X: Field{[10]uint32{0x02ad7338, 0x028a7c4b, 0x01676670, 0x00927c7f, 0x037fac53, 0x038dc2c3, 0x01b88d3a, 0x0280b7a1, 0x035ab1d5, 0x0023340b}}, Y: Field{[10]uint32{0x00c0d8e4, 0x03c2586f, 0x006278e2, 0x03bb10e4, 0x03511d56, 0x02f26ee9, 0x02cb70f0, 0x02275984, 0x02acceb6, 0x000d62d0}}}, + {X: Field{[10]uint32{0x01f82fab, 0x0286a7b7, 0x00991d3e, 0x0199282a, 0x01f76127, 0x03ccec19, 0x01aba41b, 0x034777a5, 0x03e6d48b, 0x00357859}}, Y: Field{[10]uint32{0x0271d1f7, 0x0309a1ab, 0x03d70849, 0x0188e095, 0x02aaf45f, 0x03361ab8, 0x00ec9cb3, 0x0337d3f1, 0x0182d653, 0x001b308e}}}, + {X: Field{[10]uint32{0x009bfdba, 0x006773df, 0x030cf4ff, 0x01096192, 0x01d72b19, 0x01fc0306, 0x034f09d9, 0x03cb7c4c, 0x01006987, 0x003101cd}}, Y: Field{[10]uint32{0x037ff262, 0x003274ff, 0x00ca82bf, 0x002b295a, 0x02b760ff, 0x000de3e0, 0x03366bf3, 0x004c9aa6, 0x00466b46, 0x003d959a}}}, + {X: Field{[10]uint32{0x00c4fde2, 0x0031eabc, 0x02b91184, 0x0303ecb7, 0x0229a7c2, 0x020e0c63, 0x0221db2a, 0x006fec22, 0x02719c50, 0x000277c7}}, Y: Field{[10]uint32{0x02d00fc0, 0x014c973e, 0x03ea580a, 0x016d0f7b, 0x03e977c7, 0x024079c0, 0x0315ae54, 0x00300ac0, 0x00ae6d0e, 0x003358a3}}}, + {X: Field{[10]uint32{0x024c696c, 0x022e134a, 0x0165b7d0, 0x01242b5c, 0x031c91c2, 0x0248b165, 0x03108ee6, 0x030c2408, 0x0029df73, 0x002545d9}}, Y: Field{[10]uint32{0x01c0fbe4, 0x0021b2fa, 0x000cbdd8, 0x02dc901d, 0x011994fb, 0x00dd724a, 0x02084700, 0x036f3208, 0x00493b62, 0x000fb3ff}}}, + {X: Field{[10]uint32{0x01628c6e, 0x023d8031, 0x0156da31, 0x021cd3d5, 0x02f57fe1, 0x012fa3ed, 0x03a7e0e9, 0x0034d784, 0x00e8692b, 0x001c2312}}, Y: Field{[10]uint32{0x0105a664, 0x0378c828, 0x029bfe1c, 0x0004fdf6, 0x005af7e6, 0x03da8bc0, 0x020432e9, 0x00747c9f, 0x0302deee, 0x00254d38}}}, + {X: Field{[10]uint32{0x025b4c09, 0x00732853, 0x0222b299, 0x030274c9, 0x0146275e, 0x02c9af85, 0x01620794, 0x031ce6d7, 0x017ab82d, 0x0009dd78}}, Y: Field{[10]uint32{0x031ccddc, 0x02de4206, 0x0152e8a9, 0x00a21d13, 0x03338ab2, 0x03684ca3, 0x02b52c28, 0x00d67f7b, 0x027c80e8, 0x000ea9bb}}}, + {X: Field{[10]uint32{0x030192da, 0x0248a700, 0x03270be1, 0x00d0f0e0, 0x0044da6b, 0x023ed228, 0x0334959b, 0x013cc73c, 0x02c2039c, 0x0011f06a}}, Y: Field{[10]uint32{0x000d7cc0, 0x038562d8, 0x003551fd, 0x0168848a, 0x00e5813f, 0x02681471, 0x01cd4025, 0x03087611, 0x011c5ba6, 0x00176b59}}}, + {X: Field{[10]uint32{0x00bad15e, 0x036a86ee, 0x02c70d77, 0x0353e8a2, 0x01eef459, 0x033e897c, 0x03b2bf59, 0x01325806, 0x005a4b86, 0x003e03d1}}, Y: Field{[10]uint32{0x0374ff16, 0x01ffdc2c, 0x02c8863f, 0x03d297c4, 0x0183cd57, 0x03a7e239, 0x00b9da6c, 0x01a659b4, 0x02046b8c, 0x0028e0f7}}}, + {X: Field{[10]uint32{0x014d2f66, 0x02e40faf, 0x01bf6f9c, 0x00967cb5, 0x02b22081, 0x01e2dc5c, 0x01f436d5, 0x00d866a3, 0x03b91ad3, 0x000a4939}}, Y: Field{[10]uint32{0x00841875, 0x022f6e12, 0x00effa76, 0x0156b58b, 0x02afa412, 0x005747c1, 0x00e4f3fe, 0x027d50d2, 0x0169e231, 0x002e1908}}}, + {X: Field{[10]uint32{0x02dc4d83, 0x01017cdd, 0x02e2af13, 0x0179df8c, 0x00431078, 0x028ae6b1, 0x001854e3, 0x013b4a0d, 0x007b91a6, 0x000df582}}, Y: Field{[10]uint32{0x01f25003, 0x02e65c4f, 0x01b1f9bd, 0x0024b094, 0x01a3ac9f, 0x00b9bf37, 0x023092f3, 0x02f32ea0, 0x0117e068, 0x000d688e}}}, + {X: Field{[10]uint32{0x00f4fab2, 0x0372e484, 0x00fd8391, 0x033a0a53, 0x03e000d2, 0x033e12d3, 0x003691cb, 0x006f81ad, 0x016dc79f, 0x0035d22a}}, Y: Field{[10]uint32{0x005bf51c, 0x031369bc, 0x036c8223, 0x009eabed, 0x00975c09, 0x02e05c8a, 0x017e5c04, 0x0240bb39, 0x01e065da, 0x001d6d2b}}}, + {X: Field{[10]uint32{0x002cc30c, 0x00cf41b9, 0x03a8fa02, 0x013b0957, 0x03949241, 0x00edbee5, 0x02361ea3, 0x0213fc98, 0x0225eb50, 0x0034174a}}, Y: Field{[10]uint32{0x01a6f2d2, 0x03ead81a, 0x00f4e75e, 0x02616ea6, 0x01ba57a1, 0x022a80f6, 0x03514290, 0x0323ce16, 0x02eececd, 0x00052eef}}}, + {X: Field{[10]uint32{0x003ff793, 0x022765d2, 0x0030278c, 0x03d7a2a3, 0x00b4684b, 0x0193b2a7, 0x03f39067, 0x03b6f96b, 0x015bd137, 0x001a6ea6}}, Y: Field{[10]uint32{0x03b63e32, 0x03864d96, 0x000b246d, 0x01b1c056, 0x01a79ad9, 0x007176e5, 0x033e8649, 0x01965a60, 0x0051b622, 0x000ac73d}}}, + {X: Field{[10]uint32{0x00419461, 0x00bfdc55, 0x0197d9a8, 0x03cbc7b2, 0x033a50af, 0x01418412, 0x020342ff, 0x033ca3f7, 0x01a15d0e, 0x001fc07a}}, Y: Field{[10]uint32{0x0112dc68, 0x037310eb, 0x030e5e03, 0x0196a0d1, 0x03d27040, 0x03b72ad8, 0x01e25d1f, 0x034dd4d8, 0x0194a6b8, 0x00070f25}}}, + {X: Field{[10]uint32{0x02e48cc6, 0x02902795, 0x0219d813, 0x000fc3e1, 0x00f2413d, 0x00613933, 0x0201bc47, 0x024107f4, 0x02fd193b, 0x001c648c}}, Y: Field{[10]uint32{0x0229a953, 0x00674f2b, 0x02d1e68b, 0x028197e0, 0x0312fb55, 0x03ab816a, 0x037ff609, 0x02c14d4c, 0x03187dcc, 0x000587f1}}}, + {X: Field{[10]uint32{0x02e78c27, 0x00f7219d, 0x03d082f5, 0x03e91b22, 0x039a63bc, 0x01ef4a2f, 0x006009a5, 0x01cc40ce, 0x0120155f, 0x00056e10}}, Y: Field{[10]uint32{0x01737816, 0x00b140cc, 0x03605140, 0x0283aa7e, 0x03188171, 0x0102b293, 0x0004e0c8, 0x01f8bfa6, 0x037ec901, 0x0011f758}}}, + {X: Field{[10]uint32{0x03fec567, 0x01301d2e, 0x01a2c007, 0x0389d053, 0x0004a95c, 0x02e9a645, 0x0352ed4e, 0x00011df6, 0x0197bd38, 0x003fd0a7}}, Y: Field{[10]uint32{0x017b3048, 0x016a8075, 0x00f2569a, 0x002b2f2e, 0x036708c0, 0x037ddf00, 0x0173f624, 0x016eacd2, 0x03bd6e63, 0x001ece9b}}}, + {X: Field{[10]uint32{0x010a6ee3, 0x02c79575, 0x01ed8858, 0x0012c984, 0x01379174, 0x00b1dfa0, 0x01f476d1, 0x039d333c, 0x005b016b, 0x0003335c}}, Y: Field{[10]uint32{0x00e87c01, 0x02bff0d0, 0x01f1f737, 0x0130c6b6, 0x020946cb, 0x025fde35, 0x0155e178, 0x02c94937, 0x01e75cc7, 0x0021d06b}}}, + {X: Field{[10]uint32{0x03b65b27, 0x030df542, 0x01534d54, 0x001a3526, 0x0294e4b4, 0x00c03b2a, 0x0278e818, 0x0315fe45, 0x025e24b3, 0x00196d86}}, Y: Field{[10]uint32{0x01ed0c40, 0x005a9d9d, 0x024fd79c, 0x031e9719, 0x02f65ac4, 0x02b82147, 0x0386fda2, 0x01ee0bc6, 0x0228aab9, 0x002435d7}}}, + {X: Field{[10]uint32{0x03a06ef0, 0x005067de, 0x00cf173c, 0x021f068e, 0x014ffe04, 0x0163ee39, 0x0382bdd7, 0x01cf650f, 0x01df8f40, 0x0019c54a}}, Y: Field{[10]uint32{0x00fede59, 0x01533f45, 0x029504d8, 0x01071c1d, 0x00454fd1, 0x03547af9, 0x01121e10, 0x00d26b74, 0x032d1f23, 0x00311b67}}}, + {X: Field{[10]uint32{0x001b0440, 0x008f3fe4, 0x035b68e8, 0x0375319c, 0x0073da3f, 0x002ef4b0, 0x02f8e703, 0x005a5c1e, 0x02760e7a, 0x0000abe2}}, Y: Field{[10]uint32{0x02c3c1cb, 0x03f40989, 0x0143f72f, 0x02b7597d, 0x017c34f5, 0x007b8cf3, 0x01659769, 0x01c54f1c, 0x03e79ada, 0x00155596}}}, + {X: Field{[10]uint32{0x03575707, 0x0251ca9b, 0x01fc42fb, 0x03543bd6, 0x024def3f, 0x01f31cc2, 0x00b3b1fb, 0x02ee1d3f, 0x016fc5ff, 0x002b3607}}, Y: Field{[10]uint32{0x01d181a3, 0x00a59180, 0x011cce09, 0x03258fa1, 0x02b87c0e, 0x001c6da5, 0x02f47eb5, 0x03aa7847, 0x028ec8b8, 0x00238c66}}}, + {X: Field{[10]uint32{0x00ffb912, 0x033a36e0, 0x0041bd60, 0x02a66e45, 0x02ae062c, 0x0182a9fc, 0x012d0bb3, 0x03a2f081, 0x03d53ab9, 0x002addf9}}, Y: Field{[10]uint32{0x01f96b5a, 0x0131d48b, 0x02d8fdfa, 0x0262d75b, 0x02aca909, 0x0075c104, 0x03992e5e, 0x02e56e7a, 0x02d9cb0a, 0x0017e4ad}}}, + {X: Field{[10]uint32{0x00124046, 0x0222acde, 0x03265e01, 0x03cded98, 0x031d7efa, 0x001a88c0, 0x03eda09b, 0x0231fbe2, 0x01951a6a, 0x001e62e0}}, Y: Field{[10]uint32{0x002b1bf6, 0x03e75138, 0x01de7a1b, 0x02d7c460, 0x03d91382, 0x0399d1db, 0x004a7e54, 0x0290c0d9, 0x021b0bae, 0x002564b6}}}, + {X: Field{[10]uint32{0x0377b096, 0x0354a2e5, 0x02f29ed6, 0x00e893fd, 0x009dbff9, 0x0222bad3, 0x01dea224, 0x039df637, 0x02ae0c3b, 0x003c921a}}, Y: Field{[10]uint32{0x0029126b, 0x0096aa12, 0x028cc413, 0x018a360e, 0x03d8409b, 0x00dabec2, 0x010327fe, 0x03211df1, 0x0150fe75, 0x00238acb}}}, + {X: Field{[10]uint32{0x006d2d54, 0x025d2205, 0x00333f93, 0x0220993d, 0x02d16ca0, 0x02bbbb9c, 0x0364ee33, 0x03aa2f83, 0x01093b8a, 0x00088b8f}}, Y: Field{[10]uint32{0x02cdcaa9, 0x02d4e772, 0x018a4351, 0x01e332c2, 0x0137ba1f, 0x0283af5e, 0x02dd16e8, 0x02ef1070, 0x000fbfe6, 0x0003bfd4}}}, + {X: Field{[10]uint32{0x0121c1c9, 0x02df4130, 0x01bd0165, 0x007670c8, 0x024f9924, 0x02d4f800, 0x01a18eea, 0x00d1d891, 0x03fe7ca9, 0x0019da34}}, Y: Field{[10]uint32{0x00272877, 0x02bba2e4, 0x00a43823, 0x0094340c, 0x000c4dc8, 0x027871de, 0x019ff1d0, 0x025c888c, 0x0173c9b9, 0x00100b27}}}, + {X: Field{[10]uint32{0x022dda79, 0x01fc263c, 0x00ef2513, 0x02133e32, 0x01b0b628, 0x03f5e057, 0x0325697b, 0x022033bf, 0x000fb2f0, 0x001bad9d}}, Y: Field{[10]uint32{0x0085c86f, 0x027c0fc5, 0x01b68520, 0x02579163, 0x0079c4b6, 0x03d0b9ab, 0x002061c1, 0x015c4f0c, 0x0131c12f, 0x0033dfa1}}}, + {X: Field{[10]uint32{0x025fe51b, 0x0001aaa5, 0x01ac2950, 0x0165c5ca, 0x025ede89, 0x019eda9f, 0x00f385f3, 0x0169faa8, 0x03484eb0, 0x001c407c}}, Y: Field{[10]uint32{0x00d5c3f3, 0x013e24c4, 0x0144be26, 0x01687912, 0x00260559, 0x01c6bf0b, 0x00fff9fc, 0x03edd5de, 0x0113a040, 0x002347ee}}}, + {X: Field{[10]uint32{0x02886579, 0x0239b4c3, 0x0287a11c, 0x03ab3bee, 0x02a0de03, 0x0080c0d8, 0x024b25f1, 0x028978ff, 0x005cacc6, 0x001d6a79}}, Y: Field{[10]uint32{0x03f69c6e, 0x01f00af3, 0x03f7adbe, 0x03e555a0, 0x02854c49, 0x00007f60, 0x0202cf31, 0x021b649a, 0x0195e919, 0x0014aa16}}}, + {X: Field{[10]uint32{0x0337dcbc, 0x0359cc0d, 0x001b2954, 0x03de0c2b, 0x02ceac14, 0x01fe66b7, 0x03ffc542, 0x0195ca62, 0x0192bad7, 0x000c4653}}, Y: Field{[10]uint32{0x03dd2832, 0x007fcfd7, 0x02f19a2d, 0x02f36b0b, 0x028c556e, 0x00f316f1, 0x02449fa3, 0x023bba74, 0x0045f531, 0x00267a07}}}, + {X: Field{[10]uint32{0x03d505af, 0x02562b02, 0x0123c522, 0x030e115f, 0x03c1d743, 0x002d3338, 0x02c61387, 0x01bd0e1a, 0x03fe76fd, 0x002413e8}}, Y: Field{[10]uint32{0x03c1763b, 0x02ab9069, 0x023045c8, 0x03ece55e, 0x018dae9b, 0x0131c165, 0x02929e45, 0x0118cde7, 0x02621adf, 0x002509cc}}}, + {X: Field{[10]uint32{0x00a8e0fd, 0x02a4ffe9, 0x01f26b5f, 0x0109e29f, 0x03040de1, 0x00fe8996, 0x019aedef, 0x022cc8da, 0x01f31a82, 0x00074618}}, Y: Field{[10]uint32{0x0099f7dc, 0x017d1376, 0x01f61199, 0x03098e99, 0x013ffc30, 0x0212ee59, 0x01306e3b, 0x03faca38, 0x0381f13f, 0x002e595d}}}, + {X: Field{[10]uint32{0x0019ad64, 0x0395179a, 0x0009b73c, 0x008a110f, 0x02aac959, 0x02159773, 0x02f0289e, 0x02975797, 0x01ef6de1, 0x000ef4cf}}, Y: Field{[10]uint32{0x00f9c810, 0x00d7b575, 0x001c2975, 0x0077d491, 0x038bc985, 0x029c3a6f, 0x00366279, 0x002f525d, 0x0109eb56, 0x00264fc0}}}, + {X: Field{[10]uint32{0x00958634, 0x031fdb16, 0x0261c7be, 0x03adc543, 0x03e4c257, 0x039681f1, 0x0327b248, 0x02bb4a9f, 0x01452a39, 0x003286df}}, Y: Field{[10]uint32{0x004afcff, 0x03eb368f, 0x032c7298, 0x03dd10ab, 0x010179c0, 0x027ed520, 0x01a98043, 0x01f0dedf, 0x021bc035, 0x002ac47f}}}, + {X: Field{[10]uint32{0x0271aa58, 0x0355f461, 0x00f61da6, 0x01f57e4a, 0x00df145f, 0x0339f66b, 0x03f29a36, 0x00e1ad4f, 0x01cadee8, 0x0009cea5}}, Y: Field{[10]uint32{0x025bbe2b, 0x0053e546, 0x03ac2adb, 0x0071cf14, 0x00315a03, 0x010194a1, 0x02c6d832, 0x014df469, 0x019dbb06, 0x0022298d}}}, + {X: Field{[10]uint32{0x005561e6, 0x02443e6b, 0x02279d0f, 0x03d4a511, 0x01c06923, 0x00e48700, 0x03ad79cd, 0x02eeb154, 0x00fca139, 0x001fa930}}, Y: Field{[10]uint32{0x016dec96, 0x03e82eca, 0x0193a54d, 0x00ddc6bb, 0x002eb71c, 0x018e7c66, 0x01e79822, 0x00c38bcc, 0x01470458, 0x002f4127}}}, + {X: Field{[10]uint32{0x0207d336, 0x012581e5, 0x02ce80bc, 0x01a3f344, 0x00d3823f, 0x017331a1, 0x03932401, 0x02af9751, 0x001c0a2b, 0x001c7c60}}, Y: Field{[10]uint32{0x03f1b4b1, 0x039b76c7, 0x00a6cf5a, 0x00390e77, 0x0214430c, 0x03a3f9e9, 0x01b7de37, 0x01395082, 0x03d00838, 0x00107b41}}}, + {X: Field{[10]uint32{0x01cd8828, 0x00160b48, 0x00f2a1c9, 0x036589e7, 0x017000ff, 0x0155068f, 0x00aec515, 0x0287baba, 0x0073652b, 0x002ca0e2}}, Y: Field{[10]uint32{0x027dce5e, 0x02d20474, 0x0079d2a0, 0x03ca87bf, 0x01ee4d19, 0x01abf30c, 0x01faf658, 0x038e9491, 0x015573f5, 0x00011ffc}}}, + {X: Field{[10]uint32{0x015a3e21, 0x036263ad, 0x02cb5b68, 0x0129afc2, 0x03d9f816, 0x00224892, 0x033fbdcc, 0x012f05a1, 0x01a72263, 0x000d32a3}}, Y: Field{[10]uint32{0x01c5d986, 0x02440339, 0x01f4b73f, 0x0241464b, 0x031f041a, 0x02168ffd, 0x0369055d, 0x0324701d, 0x036036a9, 0x00362bed}}}, + {X: Field{[10]uint32{0x0319cc8f, 0x01c8cdd2, 0x0115aa0e, 0x021e270e, 0x034b76eb, 0x03db5e5a, 0x00cf5b2e, 0x0106bf28, 0x0397d973, 0x00084b2c}}, Y: Field{[10]uint32{0x02f170a1, 0x030d7590, 0x01e64875, 0x01ccbde3, 0x01ff17e2, 0x0049b143, 0x0285f501, 0x03c1be5d, 0x00ec5f29, 0x003c1b8b}}}, + {X: Field{[10]uint32{0x00a6228a, 0x0202471b, 0x002e9ffa, 0x00bf392d, 0x01d5f29d, 0x01e24fda, 0x0182dfde, 0x004f70c9, 0x03f643bd, 0x002f00d9}}, Y: Field{[10]uint32{0x00556e78, 0x03fd0a5d, 0x0373f527, 0x01e5ee5b, 0x02c17641, 0x02d66b0c, 0x03f3e44a, 0x007c192b, 0x0089d125, 0x0026fb1b}}}, + {X: Field{[10]uint32{0x01bd5672, 0x00403c6a, 0x029d8dec, 0x00cf37ad, 0x025e489e, 0x03466392, 0x03169bb4, 0x0222516a, 0x00235d8e, 0x0023f2c5}}, Y: Field{[10]uint32{0x03fc057c, 0x036de439, 0x01f5fe52, 0x00816c74, 0x03c45ae3, 0x01102109, 0x0302a46b, 0x0242c980, 0x0396bab3, 0x003e872c}}}, + {X: Field{[10]uint32{0x011e64ae, 0x0170beb9, 0x010440e1, 0x02133289, 0x00d4917e, 0x0077d83d, 0x0043e801, 0x03b0832f, 0x01056675, 0x001c2b61}}, Y: Field{[10]uint32{0x015a800d, 0x013e9847, 0x004e8c00, 0x03832fbd, 0x02b63d68, 0x03d6dc4e, 0x0262475d, 0x029f2697, 0x0356af9f, 0x003d2944}}}, + {X: Field{[10]uint32{0x01695842, 0x0387db2e, 0x028803ed, 0x036611be, 0x02bcf6e6, 0x025c6301, 0x026df81f, 0x0105a21b, 0x03474807, 0x002b69eb}}, Y: Field{[10]uint32{0x008a582f, 0x02ddb6e6, 0x001dd575, 0x02440031, 0x0298369c, 0x01dc7654, 0x0348bbe0, 0x009f5371, 0x011f50f4, 0x0003d9b5}}}, + {X: Field{[10]uint32{0x0102eeee, 0x011762c4, 0x0052c7f0, 0x01ee949f, 0x01bf1e97, 0x034d3e3a, 0x038108f9, 0x03aec46e, 0x018d7323, 0x003c6e1f}}, Y: Field{[10]uint32{0x00346556, 0x037dda2d, 0x000b79bd, 0x039c1f8e, 0x037e2aa0, 0x01edd56c, 0x01e58424, 0x039e827b, 0x030351eb, 0x0002f655}}}, + {X: Field{[10]uint32{0x012a0553, 0x0244d592, 0x00833cc5, 0x0145d9b3, 0x031fbf7c, 0x03fb5ee0, 0x000c301c, 0x0193ab24, 0x015ad552, 0x0024d967}}, Y: Field{[10]uint32{0x00154beb, 0x01b78170, 0x0089ccf4, 0x0176215b, 0x03519ff6, 0x030740a8, 0x02137df1, 0x000596be, 0x01e9646d, 0x002da4e2}}}, + {X: Field{[10]uint32{0x02d4ffe2, 0x00e3df63, 0x01f48b17, 0x039745e0, 0x00409a62, 0x0056fbbb, 0x002f54a4, 0x013ff712, 0x00492a9b, 0x003a74af}}, Y: Field{[10]uint32{0x00305df5, 0x00c10211, 0x00631608, 0x0020d854, 0x038d6392, 0x013c94e0, 0x01de313f, 0x02fe0037, 0x02522dcc, 0x00224f91}}}, + {X: Field{[10]uint32{0x006cb210, 0x038abde4, 0x00744229, 0x0306a1d8, 0x01825e0b, 0x01cb69a9, 0x0103eea3, 0x02b64460, 0x020a7bf1, 0x00050905}}, Y: Field{[10]uint32{0x0196af23, 0x03be284e, 0x0343f209, 0x03a47d8d, 0x024f1519, 0x002c8fa5, 0x02f1d0e1, 0x0175c479, 0x022696a7, 0x00325368}}}, + {X: Field{[10]uint32{0x009efd87, 0x0233ba27, 0x02300c45, 0x01639bc9, 0x018686d0, 0x02d7e9fa, 0x03e434ae, 0x012f52aa, 0x0312402e, 0x001fe409}}, Y: Field{[10]uint32{0x02f95fb5, 0x00622b18, 0x01602669, 0x02305498, 0x031b8b01, 0x022111a9, 0x02cdcddc, 0x02d062c5, 0x020b2aef, 0x002f0011}}}, + {X: Field{[10]uint32{0x0372745c, 0x03187d5b, 0x03c01255, 0x01a8e051, 0x022a133f, 0x02370a4d, 0x02e5f16c, 0x003d4fa1, 0x027c66cb, 0x0034c9f3}}, Y: Field{[10]uint32{0x02bea436, 0x01d628e1, 0x015f8353, 0x035071be, 0x02618cc6, 0x02314b72, 0x0108b85b, 0x00e7041a, 0x018ac3cb, 0x00137052}}}, + {X: Field{[10]uint32{0x032db3b3, 0x00e5ab78, 0x03d1a0d5, 0x033951ef, 0x01137dff, 0x022eff0c, 0x013803be, 0x00441800, 0x0319c9d8, 0x003c113a}}, Y: Field{[10]uint32{0x02526f2a, 0x00ae77df, 0x03af7c10, 0x037bff33, 0x028128a8, 0x02ca0b3f, 0x00551cea, 0x00f999fe, 0x028d9c4c, 0x0016b510}}}, + {X: Field{[10]uint32{0x0218daf4, 0x03172f03, 0x03d55f67, 0x02dfcf00, 0x03d135bb, 0x03755100, 0x006a81eb, 0x0066fabd, 0x0237b95d, 0x001e9b14}}, Y: Field{[10]uint32{0x0204385b, 0x038a48a8, 0x001d70cc, 0x019a29c3, 0x01bd492c, 0x03fda3fb, 0x00fc6e74, 0x03ad7121, 0x00b847fc, 0x0018a8ba}}}, + {X: Field{[10]uint32{0x019f82f0, 0x0256f06d, 0x01bb5804, 0x026d1d62, 0x02ffae94, 0x01708211, 0x0372afaf, 0x0302deed, 0x00dcb069, 0x001671ff}}, Y: Field{[10]uint32{0x026c38ad, 0x023bae84, 0x006ec335, 0x014bc935, 0x02c09b36, 0x03238b1e, 0x03a4d79a, 0x0159adc6, 0x008c6657, 0x0020bb16}}}, + {X: Field{[10]uint32{0x036543d7, 0x0006f51a, 0x03ae00ea, 0x036f37c9, 0x0081d99f, 0x02ee1795, 0x00d3dc6d, 0x01563310, 0x00211ed4, 0x003e33cf}}, Y: Field{[10]uint32{0x03a9778b, 0x037a7721, 0x03b20054, 0x030f82a2, 0x035506a5, 0x03338c10, 0x011f5dbd, 0x03d8c225, 0x01d01c3d, 0x002f6012}}}, + {X: Field{[10]uint32{0x024504bc, 0x00b39c54, 0x03764278, 0x00ff3f44, 0x024d2dd2, 0x00eb2a0a, 0x03471893, 0x02753c7f, 0x0364b238, 0x000e1575}}, Y: Field{[10]uint32{0x019ef72d, 0x01b02f1d, 0x01f95944, 0x03bb7c4f, 0x03b14a71, 0x02ab8ea8, 0x024ec346, 0x02af409c, 0x02254af2, 0x0020b13a}}}, + {X: Field{[10]uint32{0x02de5431, 0x03774694, 0x02ffa48c, 0x01b6bdf9, 0x036d3e0e, 0x01554f6a, 0x00b1d733, 0x03c3634c, 0x03311de4, 0x001dd912}}, Y: Field{[10]uint32{0x005916b4, 0x03d4853d, 0x029b4cdb, 0x00c1a560, 0x017581c9, 0x00aedd0c, 0x03730f99, 0x001cd5cd, 0x03ce0c0a, 0x00191785}}}, + {X: Field{[10]uint32{0x01ca138d, 0x00c198f6, 0x01d34565, 0x033dd996, 0x0156bfc0, 0x0194deaf, 0x02511daa, 0x02bef2ca, 0x0343afd6, 0x0029352b}}, Y: Field{[10]uint32{0x03bb09dd, 0x028afadc, 0x03747a25, 0x017cf57f, 0x0088b5db, 0x0358f7cd, 0x007f0737, 0x03cc6ee4, 0x03d0dd2d, 0x002f9b27}}}, + {X: Field{[10]uint32{0x00a75be5, 0x03f0181d, 0x011aaaa8, 0x032bed9b, 0x012da352, 0x03992f18, 0x02c3d645, 0x028207dc, 0x023fe673, 0x00105ffe}}, Y: Field{[10]uint32{0x00c50151, 0x0024f81a, 0x00be10de, 0x0129fdce, 0x02cfd9ca, 0x0169d243, 0x01472afd, 0x0251d202, 0x022f9084, 0x0026ae2f}}}, + {X: Field{[10]uint32{0x02ef73cd, 0x03ba0e32, 0x00622f75, 0x001257a2, 0x004f19eb, 0x01d084b1, 0x03d772cc, 0x014105b2, 0x01549311, 0x001e05d4}}, Y: Field{[10]uint32{0x00d0d3e6, 0x02fdff4d, 0x00ac2dd7, 0x02c29765, 0x02fdaf2c, 0x01f2c637, 0x0381b91d, 0x00d94098, 0x01c8ffec, 0x000df535}}}, + {X: Field{[10]uint32{0x031b5121, 0x0094fe82, 0x02f0f736, 0x02923d8b, 0x023c2ee7, 0x039d9896, 0x020c66c7, 0x00a3abd5, 0x020c3acc, 0x000d9715}}, Y: Field{[10]uint32{0x0374868f, 0x01f4df16, 0x018d6451, 0x005773b1, 0x016990aa, 0x00e3e374, 0x0303f883, 0x03c578e2, 0x02fa96c0, 0x000972f1}}}, + {X: Field{[10]uint32{0x035bac7c, 0x03e860a3, 0x03808a94, 0x03f76233, 0x016c6757, 0x02866a49, 0x026b6cb3, 0x0008fa44, 0x01251010, 0x0032516b}}, Y: Field{[10]uint32{0x0254e2bb, 0x037e4ab5, 0x01e5b174, 0x02ec99e7, 0x0399df4a, 0x0319bdb6, 0x008ae3df, 0x010ef3bc, 0x010cb4ac, 0x00326a3a}}}, + {X: Field{[10]uint32{0x002e0213, 0x0303878b, 0x03eec629, 0x02dedf4e, 0x02ac8c3f, 0x00ca18f7, 0x00223876, 0x0355f5ce, 0x01ac45e6, 0x0012ab61}}, Y: Field{[10]uint32{0x016a2708, 0x002d8f3f, 0x02595213, 0x0224ddbd, 0x0129c036, 0x0394e81c, 0x001c192d, 0x02fd9259, 0x00e19e81, 0x000e3bba}}}, + {X: Field{[10]uint32{0x02a291df, 0x027da689, 0x0367f24b, 0x03a9f4d4, 0x01907e37, 0x03d89118, 0x00f9f663, 0x01965ab7, 0x02480b0f, 0x000af040}}, Y: Field{[10]uint32{0x00311c79, 0x01509bc1, 0x02b2f4f3, 0x00c14204, 0x0324ad0c, 0x0242ddd0, 0x02780f6b, 0x02cdea46, 0x02d33016, 0x00382b0f}}}, + {X: Field{[10]uint32{0x03ddfde2, 0x007234e4, 0x03cffeb9, 0x000207f3, 0x02eca894, 0x0281387e, 0x001a2c09, 0x023e4c3a, 0x0191abd2, 0x00337016}}, Y: Field{[10]uint32{0x000193a5, 0x02686dd6, 0x02b32afc, 0x013af1e6, 0x038bf90a, 0x006a208b, 0x02b9852d, 0x038ac0ff, 0x02c44458, 0x0037f692}}}, + {X: Field{[10]uint32{0x0346a047, 0x00efe776, 0x02b7d079, 0x02ba722f, 0x0031d285, 0x03e2aac4, 0x00ea8570, 0x0310a7fd, 0x03f0af2d, 0x0016893b}}, Y: Field{[10]uint32{0x004c8f9a, 0x02d80167, 0x03327b53, 0x0185abbd, 0x00a98b6f, 0x02debc2e, 0x03f40dd0, 0x02458225, 0x01145973, 0x0005e76e}}}, + {X: Field{[10]uint32{0x0038183a, 0x03f8ab1e, 0x01467636, 0x02c2c151, 0x03e7c1d2, 0x01f457f6, 0x00aae6b5, 0x00f2a4dd, 0x013f5160, 0x0005b079}}, Y: Field{[10]uint32{0x03a183e3, 0x01a25d98, 0x0194ba53, 0x006815c1, 0x008d1f6c, 0x0383f724, 0x00af50c7, 0x026efd76, 0x02f056e0, 0x002fe163}}}, + {X: Field{[10]uint32{0x0301ccf4, 0x0299567a, 0x006eb0c3, 0x016c71a1, 0x01a2f240, 0x0305de00, 0x013a116a, 0x00be6b62, 0x02ea71b9, 0x001e4bc7}}, Y: Field{[10]uint32{0x0032a79d, 0x0342de8a, 0x001293cc, 0x002ef878, 0x0052c0df, 0x01e19ae7, 0x01ecf87a, 0x03bce4c4, 0x030cc610, 0x002f018b}}}, + {X: Field{[10]uint32{0x017378e1, 0x02e99769, 0x00dd7335, 0x02b3c201, 0x03917dab, 0x0044dff8, 0x004dc515, 0x01c673d5, 0x0040f057, 0x0006ce67}}, Y: Field{[10]uint32{0x000b425f, 0x029dd718, 0x02f6d380, 0x004aaa11, 0x02bfdd07, 0x0374cce8, 0x01e872c1, 0x02821507, 0x00d3b6e8, 0x001359e5}}}, + {X: Field{[10]uint32{0x02238e4f, 0x002ffeae, 0x02edec21, 0x01e2af85, 0x039f8cd2, 0x02223147, 0x00d8219b, 0x0173b783, 0x013eb9c4, 0x0004e2cc}}, Y: Field{[10]uint32{0x02ac56d6, 0x021c8f39, 0x03f7fd9e, 0x01b735b6, 0x0213f0f7, 0x03c2b349, 0x02d49512, 0x0010bd2d, 0x0357cbc8, 0x00286668}}}, + {X: Field{[10]uint32{0x03542338, 0x03f0937a, 0x0312284f, 0x00445f24, 0x008f4018, 0x03d2b869, 0x0068b24c, 0x01599340, 0x03119c76, 0x000f81b0}}, Y: Field{[10]uint32{0x0273624f, 0x039d55c1, 0x03696498, 0x02cca01e, 0x0293b08a, 0x026a4341, 0x01c45963, 0x01fc6daa, 0x0196e560, 0x0018e995}}}, + {X: Field{[10]uint32{0x03f8bd2e, 0x037a2d2e, 0x0125f8a3, 0x037bb47b, 0x0280f0f6, 0x005e7a77, 0x00e5455c, 0x0224c95d, 0x039b49c8, 0x0000fccb}}, Y: Field{[10]uint32{0x02589f17, 0x007e9ada, 0x02472855, 0x033b8ae1, 0x00091f49, 0x03d0aa77, 0x0090257b, 0x01be27bd, 0x031a5fc9, 0x0028b4ae}}}, + {X: Field{[10]uint32{0x02414ec5, 0x01dca651, 0x02b041fe, 0x03ef8ce0, 0x022c4f5e, 0x016c6e0a, 0x029602bf, 0x03143e84, 0x0017ffcc, 0x00226b71}}, Y: Field{[10]uint32{0x00253215, 0x01fbd523, 0x00bc8e2c, 0x00a0976a, 0x036c3daa, 0x02a9867b, 0x015c2915, 0x01d47405, 0x035c291b, 0x001339f9}}}, + {X: Field{[10]uint32{0x00e4e9b5, 0x03faab97, 0x01619a13, 0x03e81f07, 0x01e9f208, 0x00bd53d9, 0x017d4860, 0x02327d96, 0x01626bec, 0x003ccfef}}, Y: Field{[10]uint32{0x01593774, 0x00ad0914, 0x0025edf0, 0x022ddc9a, 0x02a6f43c, 0x00142c0c, 0x03e2eda3, 0x03c54a1f, 0x002bebb9, 0x00323c18}}}, + {X: Field{[10]uint32{0x00a7d6b8, 0x038f9929, 0x0071d568, 0x013d1448, 0x02117fa0, 0x003a5d01, 0x01f7703a, 0x038bdf91, 0x00ab7b90, 0x0003b332}}, Y: Field{[10]uint32{0x00a1b6f4, 0x005a6696, 0x0056048e, 0x01143c7f, 0x03fcc8a6, 0x0322ecd9, 0x033c2333, 0x028363cb, 0x0305a9c4, 0x002115bd}}}, + {X: Field{[10]uint32{0x017de915, 0x00fa5685, 0x03dfca4e, 0x035537c7, 0x000e6e31, 0x009d0fb4, 0x0181c754, 0x0218b960, 0x0333a7ad, 0x003da58a}}, Y: Field{[10]uint32{0x029e6605, 0x038c80ba, 0x01cf209e, 0x016a0cd6, 0x02055c15, 0x0280566a, 0x037e8ad2, 0x0173afe7, 0x03fb4851, 0x002bcf51}}}, + {X: Field{[10]uint32{0x02ace24d, 0x02748d36, 0x019e842b, 0x03c8e3fd, 0x025c45d2, 0x0025649a, 0x02d5df02, 0x03ec4197, 0x03c67996, 0x0000fc7c}}, Y: Field{[10]uint32{0x010ea28e, 0x012f529b, 0x0011f110, 0x00195a42, 0x03737507, 0x0088a36a, 0x023c30b2, 0x027c28a3, 0x01e4f0a2, 0x00356172}}}, + {X: Field{[10]uint32{0x026e589c, 0x0375145b, 0x030e34ae, 0x00b50206, 0x02dc3359, 0x02b4b357, 0x03f93c16, 0x00390f62, 0x00193629, 0x0003f2b8}}, Y: Field{[10]uint32{0x031165cc, 0x001ee851, 0x02c243a2, 0x0162e5c0, 0x02c8acb9, 0x03342665, 0x00710d88, 0x029110b7, 0x039ecc42, 0x0023a615}}}, + {X: Field{[10]uint32{0x011f522c, 0x015c2ac5, 0x012c6d89, 0x01f6ea8c, 0x01abc424, 0x03f23beb, 0x037922b5, 0x008a748e, 0x03ba0355, 0x001523c9}}, Y: Field{[10]uint32{0x02ab6fa9, 0x01fc6e21, 0x0200acb7, 0x018ce6e5, 0x02b7b63c, 0x03cdf207, 0x00ba774f, 0x01f35f23, 0x03d8bbb4, 0x00039565}}}, + {X: Field{[10]uint32{0x00146fa0, 0x00e6ef57, 0x003ab6e4, 0x02e18460, 0x0249797d, 0x0021adef, 0x025cf1ef, 0x00d1fb51, 0x0114e8bf, 0x0038bd92}}, Y: Field{[10]uint32{0x006ae76e, 0x035d18ff, 0x025d1d2e, 0x0251cb55, 0x0388b27a, 0x01debbe6, 0x02482570, 0x00793c54, 0x036f7c64, 0x00239a79}}}, + {X: Field{[10]uint32{0x0013db1d, 0x02faae8b, 0x011222cd, 0x0323ce33, 0x01c7d362, 0x00a62d03, 0x00f97622, 0x00303c76, 0x02a02d97, 0x0002314c}}, Y: Field{[10]uint32{0x0062bd0e, 0x01bfea1c, 0x0276801b, 0x02d8b7b0, 0x03568251, 0x032dd81b, 0x00ffc9fb, 0x0359b67a, 0x02e90428, 0x00243e28}}}, + {X: Field{[10]uint32{0x02291a23, 0x008c8618, 0x02f6d3c3, 0x025ebd59, 0x006fc0ed, 0x0014abb1, 0x02f7e0c8, 0x0065cbda, 0x02fee3c5, 0x0019191b}}, Y: Field{[10]uint32{0x007a69fe, 0x023d3dca, 0x03c50d6c, 0x022a61bf, 0x03a10eb8, 0x01c7cb76, 0x0276ee71, 0x00dc2cda, 0x0150f6ca, 0x00278a78}}}, + {X: Field{[10]uint32{0x033be659, 0x00787cd1, 0x011b51eb, 0x02fe699f, 0x01329199, 0x01bbd972, 0x03ff69a0, 0x037fdc32, 0x00da1df8, 0x001ba2e9}}, Y: Field{[10]uint32{0x015d852a, 0x01d19e60, 0x00a060f6, 0x0289f851, 0x03eb5a34, 0x0394def5, 0x03f21883, 0x01069cd7, 0x02c89594, 0x002b9d58}}}, + {X: Field{[10]uint32{0x036bcaef, 0x0307ccca, 0x029cae76, 0x007356e3, 0x02c94c87, 0x02b6fc7d, 0x020d7e1c, 0x00b03db7, 0x03c8f781, 0x0023086a}}, Y: Field{[10]uint32{0x007ed53e, 0x02832a5d, 0x006b2663, 0x03f9a3fd, 0x015a36d6, 0x03833bfa, 0x010ed037, 0x000f8950, 0x00c313be, 0x00169f27}}}, + {X: Field{[10]uint32{0x039f6353, 0x01ac9a4b, 0x01fea342, 0x00087ae2, 0x0010ce51, 0x015e8a3c, 0x0236ff76, 0x01f85099, 0x003a7c48, 0x0033838e}}, Y: Field{[10]uint32{0x0232e03a, 0x03030358, 0x02280532, 0x03dbf6b3, 0x0097fcb9, 0x031cf23b, 0x004e9da4, 0x01e010a0, 0x0065d43f, 0x000fe569}}}, + {X: Field{[10]uint32{0x01698eb8, 0x028dfb87, 0x03700080, 0x031f0072, 0x028078b6, 0x0119cff0, 0x00598483, 0x01f13fd1, 0x017f5147, 0x001f8cc2}}, Y: Field{[10]uint32{0x022d75a7, 0x03072972, 0x025ad141, 0x039a5c01, 0x02e282b7, 0x01241968, 0x001d274e, 0x0319e762, 0x03c07317, 0x003049d6}}}, + {X: Field{[10]uint32{0x016837a6, 0x01ec3904, 0x03867931, 0x019b3ecf, 0x01d686eb, 0x03bfc9cc, 0x031cf429, 0x01f987ec, 0x00d6b148, 0x003bd367}}, Y: Field{[10]uint32{0x0163be1f, 0x022dda8f, 0x012ecd11, 0x0161ffd8, 0x023bd2ff, 0x03a87ae8, 0x036461a6, 0x03756893, 0x02b4280d, 0x00313daf}}}, + {X: Field{[10]uint32{0x03716290, 0x015cecbc, 0x014b992c, 0x028b7c32, 0x03ce53f4, 0x0297e2e8, 0x0090bcb9, 0x024c93de, 0x01452ee4, 0x003cfb70}}, Y: Field{[10]uint32{0x03fb2f2d, 0x02a60834, 0x00dbf552, 0x01952470, 0x035c3905, 0x01f0aba4, 0x03301f08, 0x02c9ea36, 0x02abfbc9, 0x00265511}}}, + {X: Field{[10]uint32{0x03caa975, 0x01c32a0a, 0x02c92bd1, 0x009caf18, 0x0287d174, 0x00634831, 0x01341603, 0x03a45358, 0x02517398, 0x00307d88}}, Y: Field{[10]uint32{0x03769e99, 0x0019c821, 0x01cabfcb, 0x0148071d, 0x00f6d6da, 0x00a4bdc6, 0x0328d593, 0x016ddb54, 0x02273673, 0x0007216b}}}, + {X: Field{[10]uint32{0x023dea8e, 0x004c8791, 0x03889714, 0x00066956, 0x01b206c6, 0x038c41c5, 0x00561533, 0x00220752, 0x01f9605f, 0x0029fa07}}, Y: Field{[10]uint32{0x00ae8a4f, 0x01bfbe5f, 0x000adaa1, 0x03ad7151, 0x020eb23d, 0x01f7de5a, 0x0370dbba, 0x006f83c2, 0x00fd1f36, 0x000eb888}}}, + {X: Field{[10]uint32{0x006a536b, 0x01ca0af9, 0x033262fe, 0x02b16a33, 0x02f46af5, 0x01f52b97, 0x03ac0288, 0x03ca59e8, 0x03298f5d, 0x0006da6f}}, Y: Field{[10]uint32{0x0046a91f, 0x0093cbaa, 0x01c6028c, 0x03f62203, 0x02d7e9d7, 0x0066ce28, 0x0375c684, 0x0269c7a8, 0x00aa02d9, 0x00327189}}}, + {X: Field{[10]uint32{0x03bb44bb, 0x0048bb76, 0x0251db56, 0x021ff45c, 0x03b31c99, 0x02cecc49, 0x0315cb96, 0x018ee637, 0x03740317, 0x003377fb}}, Y: Field{[10]uint32{0x024869f5, 0x011679fc, 0x00b65854, 0x019e3de0, 0x00225f08, 0x028ca8e3, 0x0279ce26, 0x016a8d31, 0x02f42e93, 0x00025cbf}}}, + {X: Field{[10]uint32{0x00e957ff, 0x01c3ffd8, 0x0129cfcb, 0x00d79f00, 0x00ee07f2, 0x03bc0788, 0x0347d309, 0x01458d9a, 0x00ef2c8a, 0x000cbf87}}, Y: Field{[10]uint32{0x03b4588e, 0x013b7c93, 0x0036fe75, 0x031f116d, 0x023d13b2, 0x0030d53a, 0x033babe0, 0x0184922c, 0x0331bd37, 0x0027a185}}}, + {X: Field{[10]uint32{0x01c24b0d, 0x00896e1e, 0x02908505, 0x015c9955, 0x024a7596, 0x02bed87f, 0x01d0ccf6, 0x0104674c, 0x03e9f491, 0x0028e0be}}, Y: Field{[10]uint32{0x02111857, 0x01b36a34, 0x00a55513, 0x0063260e, 0x02cdde63, 0x01f088bf, 0x03e0287c, 0x02ff709c, 0x036039a1, 0x002a8c00}}}, + {X: Field{[10]uint32{0x0280ef88, 0x02453b06, 0x028bc6d6, 0x029e5a88, 0x0159e305, 0x01f00d13, 0x03e24670, 0x00c3ab84, 0x00399ae3, 0x002d4ed5}}, Y: Field{[10]uint32{0x01fadc7a, 0x003b8c35, 0x01a368f3, 0x00711d54, 0x02969d8d, 0x02ea2a38, 0x00f43cc8, 0x01b175d2, 0x00538dfc, 0x00266024}}}, + {X: Field{[10]uint32{0x0364169a, 0x007436be, 0x01b8df52, 0x02bc1abb, 0x00710fe2, 0x022c2b67, 0x00bbfed9, 0x03fb0fed, 0x0253f11c, 0x001886d4}}, Y: Field{[10]uint32{0x020378aa, 0x0036fa49, 0x00bb3abe, 0x01704d85, 0x033b9300, 0x00f81717, 0x01d025b6, 0x01abd88b, 0x01c48b71, 0x000a88d3}}}, + {X: Field{[10]uint32{0x01435b04, 0x00c5783e, 0x000bed5b, 0x03eae694, 0x001e5979, 0x003d5d63, 0x023f4428, 0x00f1fcc5, 0x036ccc9c, 0x0020ccca}}, Y: Field{[10]uint32{0x00d30ea0, 0x0285abf7, 0x012d416a, 0x03da1d8b, 0x0060c77d, 0x0100b761, 0x0241025c, 0x007c72f6, 0x0212258c, 0x00214d81}}}, + {X: Field{[10]uint32{0x03f6538a, 0x02a1a3f6, 0x006b668a, 0x0069e91d, 0x02fd54e2, 0x02806c43, 0x032d926d, 0x009888bd, 0x00e39120, 0x0009f236}}, Y: Field{[10]uint32{0x02d6eb91, 0x034ad088, 0x00090e90, 0x020484eb, 0x034d0c0a, 0x03783ffd, 0x009fe83f, 0x0121355b, 0x023fb8f2, 0x00221da3}}}, + {X: Field{[10]uint32{0x020067e5, 0x007aff81, 0x03a9155d, 0x0353c22d, 0x036ee768, 0x010955bb, 0x012e05ac, 0x008014bf, 0x030bbcd8, 0x003cd271}}, Y: Field{[10]uint32{0x010c6604, 0x0086939d, 0x009fb9f6, 0x02c1c75b, 0x0293fdc5, 0x01ebaa42, 0x003c4e9e, 0x0341431f, 0x00194011, 0x001b5657}}}, + {X: Field{[10]uint32{0x03b24f90, 0x0209e9c4, 0x03156edb, 0x00805ce9, 0x01a0183b, 0x030fe278, 0x031368ba, 0x0265998a, 0x027ab202, 0x00125995}}, Y: Field{[10]uint32{0x037e21ab, 0x01670cc0, 0x0094701f, 0x01645996, 0x01a097b8, 0x03020f8d, 0x0110ee76, 0x00eec252, 0x0036c2bb, 0x001bbe25}}}, + {X: Field{[10]uint32{0x013e0886, 0x01052fe4, 0x02eb69a7, 0x01d817fd, 0x0275611b, 0x02f18ffa, 0x0245b849, 0x0284fde1, 0x001b491d, 0x00124254}}, Y: Field{[10]uint32{0x01014df8, 0x02d96aa0, 0x03f17c54, 0x03dd7824, 0x0038b1ac, 0x0208ab17, 0x01d4c956, 0x001c3707, 0x02b6f2ee, 0x000b0831}}}, + {X: Field{[10]uint32{0x00cddb76, 0x0138d584, 0x01a72bf8, 0x023bb8f7, 0x03bd5f89, 0x03d058fd, 0x00d3ee40, 0x03450063, 0x0267f5a2, 0x0007b4b9}}, Y: Field{[10]uint32{0x02db8e7d, 0x024678c9, 0x027940f9, 0x03bda288, 0x02934810, 0x021a78db, 0x004babdd, 0x0133ab88, 0x00c564fa, 0x002ed25c}}}, + {X: Field{[10]uint32{0x0212f17b, 0x00758351, 0x03d5702a, 0x00361495, 0x00c15d1a, 0x037a1b5a, 0x01f9c8c7, 0x030dfeb7, 0x03410a0b, 0x00311eea}}, Y: Field{[10]uint32{0x02db09e3, 0x03baa068, 0x015cbb09, 0x019f3e0e, 0x00e84ce7, 0x028f30f8, 0x028091a1, 0x01f78444, 0x00b136f4, 0x000394ab}}}, + {X: Field{[10]uint32{0x027a7394, 0x03b1a831, 0x038c18f5, 0x03cf7484, 0x03f70825, 0x03b39d95, 0x0090b525, 0x033f10d5, 0x00c14993, 0x0038841a}}, Y: Field{[10]uint32{0x00c732da, 0x009c20c0, 0x00a12430, 0x03f276c1, 0x03065360, 0x017eadbe, 0x03997553, 0x02366caf, 0x0137d48f, 0x00335840}}}, + {X: Field{[10]uint32{0x03faf917, 0x01f93d0f, 0x03b87da0, 0x01bc47bb, 0x0200bd6a, 0x01942291, 0x029e1440, 0x00bd7ac1, 0x007d47a7, 0x0018d7d5}}, Y: Field{[10]uint32{0x03e64128, 0x00da48ca, 0x02642217, 0x015d53aa, 0x0021fecb, 0x0072c2fc, 0x024c8ed8, 0x01ced3cc, 0x01f23da2, 0x0023a82a}}}, + {X: Field{[10]uint32{0x01bdb47b, 0x0197c091, 0x02aa8485, 0x02ba4ca7, 0x013837b6, 0x00fe3993, 0x032f79ab, 0x02d2c7ff, 0x000a8648, 0x000918cb}}, Y: Field{[10]uint32{0x026e0426, 0x01b910bd, 0x03179814, 0x01d68e08, 0x02177ff8, 0x018aac8d, 0x02603608, 0x01574cf0, 0x0388c9e1, 0x00271b41}}}, + {X: Field{[10]uint32{0x037bf503, 0x03efde9a, 0x03b5ed59, 0x038574b0, 0x03146541, 0x032f2c06, 0x009cc56e, 0x00a75215, 0x01c3cfb2, 0x0010dd23}}, Y: Field{[10]uint32{0x01fb9c5c, 0x03cd3051, 0x019a9265, 0x01f86b7b, 0x000b2060, 0x0333623f, 0x007ea7f2, 0x026418ee, 0x01ed23a0, 0x00265d68}}}, + {X: Field{[10]uint32{0x03ae3ac0, 0x03ff72b0, 0x03a5804b, 0x03404549, 0x02bb8750, 0x026f8776, 0x0203b406, 0x0075a0c5, 0x0323b8c4, 0x0023e120}}, Y: Field{[10]uint32{0x02d1b37f, 0x020a22b0, 0x01c6e2c8, 0x00e8a95d, 0x01be81f8, 0x005f9691, 0x035805ab, 0x01830a1b, 0x00871282, 0x001dea2b}}}, + {X: Field{[10]uint32{0x0148422c, 0x0254ae8a, 0x012cc6e2, 0x036f1510, 0x002d8907, 0x00706720, 0x01e8be48, 0x0211b6ed, 0x0368b54d, 0x000a7af0}}, Y: Field{[10]uint32{0x03c7e845, 0x00bf898d, 0x0310aec7, 0x0285a180, 0x02426f79, 0x01e72f46, 0x02eb2d6f, 0x0276414e, 0x03a281d5, 0x0039ade4}}}, + {X: Field{[10]uint32{0x023ed345, 0x01e659c0, 0x008105ba, 0x000a7e39, 0x03d84bc6, 0x02dc5254, 0x00cbe21e, 0x0004b230, 0x03c4ccf4, 0x00250532}}, Y: Field{[10]uint32{0x017fdeee, 0x027ae035, 0x0272b39b, 0x0192edab, 0x01da45bb, 0x0338d72f, 0x0132790e, 0x028424b4, 0x039289e4, 0x002b47ba}}}, + {X: Field{[10]uint32{0x008f756e, 0x030f71ca, 0x035d411e, 0x02976c79, 0x000bea90, 0x003c8532, 0x03ab8149, 0x00009184, 0x025b769d, 0x0006f615}}, Y: Field{[10]uint32{0x01d375d8, 0x0085d770, 0x02b131df, 0x035f7315, 0x00b69c2c, 0x02af6b94, 0x01cfcb02, 0x007a46de, 0x006cfc78, 0x00301429}}}, + {X: Field{[10]uint32{0x0229cb01, 0x03b242c1, 0x013f276c, 0x038ca216, 0x0314ed0a, 0x02e37b59, 0x0009154e, 0x019af8f5, 0x004c35ad, 0x00013dd6}}, Y: Field{[10]uint32{0x03712bb0, 0x007acf05, 0x02048fb0, 0x03863c76, 0x021520fe, 0x0271685f, 0x00cf1b3e, 0x00483847, 0x0248232a, 0x003d2fa4}}}, + {X: Field{[10]uint32{0x01d9f13b, 0x031e0f87, 0x02b352b9, 0x021311dc, 0x01cffd16, 0x034bcf3b, 0x0127401f, 0x02cc5eac, 0x01de7e85, 0x0016c002}}, Y: Field{[10]uint32{0x0173ba64, 0x0048ca2e, 0x0048dbb4, 0x02fbb3f8, 0x01cb8839, 0x019cb1e3, 0x037cb7ce, 0x030d38cd, 0x0304f531, 0x003d1615}}}, + {X: Field{[10]uint32{0x03b32815, 0x00ef2b18, 0x019c3ad1, 0x014cfcfb, 0x0037f853, 0x0088b7ce, 0x025fdbc4, 0x01bc04ba, 0x01c37939, 0x00319bcc}}, Y: Field{[10]uint32{0x02b22668, 0x0334f69b, 0x01ca3ea1, 0x0212eeb1, 0x024113ee, 0x02d41490, 0x023ca861, 0x03a72f04, 0x00084ae5, 0x0001f5ee}}}, + {X: Field{[10]uint32{0x0263abd6, 0x03217997, 0x03af1a57, 0x0157a469, 0x023d7ba4, 0x03a679a5, 0x03a51b3e, 0x0264d09a, 0x035dc8b0, 0x000cc25f}}, Y: Field{[10]uint32{0x0270d7c4, 0x00d648b0, 0x02d80638, 0x03b59b93, 0x02987401, 0x0061a5d9, 0x039e1206, 0x00627722, 0x033b200c, 0x003ef49a}}}, + {X: Field{[10]uint32{0x005ffff4, 0x0374aa72, 0x015f8c37, 0x002e138e, 0x01aa71cf, 0x03eef90f, 0x02922d5f, 0x03b182e6, 0x0245a3b7, 0x0006b394}}, Y: Field{[10]uint32{0x0325084f, 0x0113686e, 0x029871c4, 0x01344358, 0x0006ad3f, 0x01b2eda7, 0x01c51cbb, 0x023e6fca, 0x01679470, 0x001cb03b}}}, + {X: Field{[10]uint32{0x030c4471, 0x0296bcda, 0x03512692, 0x00cb354b, 0x006ed54e, 0x00fe480b, 0x03225249, 0x0130b2fe, 0x039e4cce, 0x002f065e}}, Y: Field{[10]uint32{0x01673f70, 0x00213ef7, 0x017dfadb, 0x02553574, 0x013cad9b, 0x03b14222, 0x016be56c, 0x00197693, 0x02635182, 0x003544dd}}}, + {X: Field{[10]uint32{0x00c7df70, 0x0342f237, 0x03fab76a, 0x0002de69, 0x0213c6f5, 0x03b2b625, 0x00cfa733, 0x036fb45d, 0x0131334b, 0x0019a65e}}, Y: Field{[10]uint32{0x0199435a, 0x026f4b19, 0x003310d4, 0x037c9a50, 0x00ab00af, 0x0012b158, 0x03e7d3a5, 0x00663bb8, 0x0301948e, 0x003f6f4c}}}, + {X: Field{[10]uint32{0x026eb4bf, 0x020f30c6, 0x008b3890, 0x00bcdc2c, 0x02563742, 0x0040fde6, 0x020b9620, 0x020be5f0, 0x00dfb38d, 0x000eea1b}}, Y: Field{[10]uint32{0x0258dfc8, 0x035ab48c, 0x02fee33d, 0x00aaf7b2, 0x035377e3, 0x02d1db86, 0x017f9819, 0x02ec4e6f, 0x001176de, 0x002b3b26}}}, + {X: Field{[10]uint32{0x031603cd, 0x024c36fb, 0x01243fed, 0x027ddba0, 0x02639519, 0x00b64575, 0x03acdbdc, 0x01c76130, 0x032f9db9, 0x0003d890}}, Y: Field{[10]uint32{0x027b5f28, 0x0031e5d2, 0x02444c2e, 0x013bac46, 0x0282269f, 0x037a1d5f, 0x0056acd5, 0x01331b96, 0x033d177b, 0x003ba273}}}, + {X: Field{[10]uint32{0x0067bbaf, 0x02bbaa70, 0x00b1d688, 0x0141e538, 0x01b6d812, 0x016ca028, 0x016e6500, 0x03a9182b, 0x03dc6a6d, 0x00212d06}}, Y: Field{[10]uint32{0x03c00e7c, 0x03090e67, 0x032b2ab8, 0x01b97343, 0x03e452fe, 0x017c3c32, 0x008cdf7b, 0x02d2ecae, 0x003cb535, 0x0027de1c}}}, + {X: Field{[10]uint32{0x009d4c67, 0x010b06b2, 0x01f8828a, 0x02b294e6, 0x01048c52, 0x022e3515, 0x00f48839, 0x0128538a, 0x02a93ea6, 0x00238b7f}}, Y: Field{[10]uint32{0x02781271, 0x0169267c, 0x02ff7593, 0x01d3da77, 0x03e09d74, 0x023b413a, 0x01df10dd, 0x00d814cd, 0x0149cda5, 0x003fb005}}}, + {X: Field{[10]uint32{0x03105e0b, 0x009dd666, 0x012f118b, 0x028903a4, 0x01dbd2f6, 0x032f0be8, 0x0175e364, 0x02b074ff, 0x01ae5401, 0x0030ef1b}}, Y: Field{[10]uint32{0x0363d6b4, 0x01430fce, 0x00c340a6, 0x0122dbc3, 0x019c5dba, 0x000dc02c, 0x02345063, 0x024c9bf4, 0x00f55b73, 0x0005c3f7}}}, + {X: Field{[10]uint32{0x03c14691, 0x03b32268, 0x0395da10, 0x03b7a4d5, 0x00c2defc, 0x009ffe04, 0x01a289e0, 0x014b9eb1, 0x02931b1e, 0x000cc24f}}, Y: Field{[10]uint32{0x00deec38, 0x021e9fdc, 0x0047a7ee, 0x002f5a2f, 0x0102114f, 0x02b843ee, 0x03dc8421, 0x017af699, 0x01845bd5, 0x001feee9}}}, + {X: Field{[10]uint32{0x00141ef9, 0x03f9cd36, 0x00208a36, 0x00cbb2f3, 0x013f1211, 0x031e3762, 0x02c765ed, 0x028f3801, 0x0038b6d1, 0x00086cd5}}, Y: Field{[10]uint32{0x02e300d0, 0x01afc1ba, 0x02a7f256, 0x02f8ec59, 0x01e2d516, 0x01bed423, 0x01a82b36, 0x01f723d8, 0x01a5ed23, 0x0003d845}}}, + {X: Field{[10]uint32{0x03892df3, 0x020bf1b4, 0x008de037, 0x008470b9, 0x03ade708, 0x023a793e, 0x0248edf2, 0x03b45cc0, 0x0183aa1b, 0x0033b599}}, Y: Field{[10]uint32{0x00fdec96, 0x0239ce06, 0x031b6cb3, 0x00d4901f, 0x02c3a818, 0x03110710, 0x03e634e3, 0x0280efc3, 0x0136f29d, 0x0013d0eb}}}, + {X: Field{[10]uint32{0x026f71f8, 0x0215cefb, 0x03ec023a, 0x01f333ca, 0x0337f6eb, 0x027ef32b, 0x02731222, 0x02a2bac1, 0x0020f541, 0x003169d1}}, Y: Field{[10]uint32{0x00adb259, 0x01921958, 0x017096c8, 0x00d524d3, 0x021612a5, 0x0097e964, 0x00a6e25d, 0x00f4db00, 0x00024426, 0x002b98d3}}}, + {X: Field{[10]uint32{0x00b9de9e, 0x012eb052, 0x0212ef0a, 0x007f1334, 0x008311c5, 0x016c57a9, 0x03255211, 0x01ad2ca9, 0x008bf30f, 0x000c1281}}, Y: Field{[10]uint32{0x023bb3cd, 0x02c19781, 0x03fec154, 0x0216c848, 0x0311ceeb, 0x02a54fea, 0x01cb5dc8, 0x02fc344a, 0x01003d6e, 0x0023e4d6}}}, + {X: Field{[10]uint32{0x039c2048, 0x02fef356, 0x0251972e, 0x03c4eec1, 0x016ecb66, 0x01e047a4, 0x009875e9, 0x002bd42b, 0x01ae7eba, 0x003fe5ad}}, Y: Field{[10]uint32{0x0352a887, 0x00678bd8, 0x00e3c319, 0x0321c3f5, 0x033de89c, 0x015abb46, 0x00a0b1db, 0x0073ab96, 0x0186bca7, 0x00092bc8}}}, + {X: Field{[10]uint32{0x01b701a3, 0x037389ec, 0x035d050b, 0x02e5282c, 0x028b6d38, 0x01bf6cf3, 0x01472437, 0x00bbb410, 0x021cdf73, 0x00164273}}, Y: Field{[10]uint32{0x0224dfdf, 0x0301782c, 0x012b037f, 0x02eefdde, 0x037d3731, 0x000e0e8f, 0x01cf2239, 0x039d8609, 0x01440665, 0x0000b912}}}, + {X: Field{[10]uint32{0x03d1d527, 0x01acc3aa, 0x01ad7cfb, 0x01d32bc1, 0x0008ef99, 0x00a11152, 0x02032b79, 0x019841be, 0x031f86d6, 0x003fdadd}}, Y: Field{[10]uint32{0x008ba4b3, 0x03c109e4, 0x03f50b25, 0x02b8d512, 0x029fcd0b, 0x03a7daa1, 0x037e0557, 0x03a473fd, 0x029c9393, 0x001aaf4a}}}, + {X: Field{[10]uint32{0x021aa8d9, 0x035f48ce, 0x005f4bef, 0x0215f9ff, 0x03be9196, 0x00b66b39, 0x03da48a1, 0x007eb47b, 0x030494dd, 0x00250f33}}, Y: Field{[10]uint32{0x020a7bd6, 0x0044d306, 0x01c523d0, 0x007161e4, 0x006014e0, 0x029f93c4, 0x011a23fc, 0x00fe2cdd, 0x00cc2dd9, 0x0013c22d}}}, + {X: Field{[10]uint32{0x005f172c, 0x03127dd0, 0x035b3ee6, 0x022c7672, 0x0147a463, 0x03c9b0d0, 0x00e0968b, 0x00737242, 0x03a7a89e, 0x00029e69}}, Y: Field{[10]uint32{0x03bb8ceb, 0x03ba43fc, 0x00cd1b3c, 0x01dae60e, 0x03ebadcb, 0x0300c96c, 0x0097f34e, 0x02f8eb95, 0x016714b5, 0x0032d4f6}}}, + {X: Field{[10]uint32{0x007b89dd, 0x03014547, 0x01b2fa50, 0x00daa8cf, 0x024f548b, 0x005cfde2, 0x021667cd, 0x01bbeaa1, 0x02fc7117, 0x000a3fcb}}, Y: Field{[10]uint32{0x02fe4941, 0x03889275, 0x01988dc6, 0x02ccdf5e, 0x038e67cd, 0x0235f6f7, 0x005e1656, 0x02857c52, 0x0307db4b, 0x0011d6cd}}}, + {X: Field{[10]uint32{0x01012968, 0x021facec, 0x03557f86, 0x01ebc2b9, 0x00223e89, 0x016d3280, 0x0304fa25, 0x01a21701, 0x033216a8, 0x00216cb0}}, Y: Field{[10]uint32{0x0257ea11, 0x0175cd75, 0x015c5704, 0x039e6341, 0x021f2bcb, 0x003bd1e7, 0x03cbe7af, 0x01015bbe, 0x0145ba66, 0x00287d63}}}, + {X: Field{[10]uint32{0x00bb8778, 0x01c32697, 0x01d47c2a, 0x03834d53, 0x027a02b3, 0x01ef4da4, 0x028e2add, 0x00cb7901, 0x0109eefb, 0x003a7f0b}}, Y: Field{[10]uint32{0x0365c312, 0x003b1696, 0x01cdf80d, 0x03b2f632, 0x00f249d7, 0x03d4f33d, 0x02e219bb, 0x0341a00f, 0x02a51216, 0x003b8026}}}, + {X: Field{[10]uint32{0x00005d9e, 0x0010be68, 0x02d65763, 0x0341883f, 0x02a1cc88, 0x0288a142, 0x0238af95, 0x00434c9b, 0x0350afd5, 0x00368b72}}, Y: Field{[10]uint32{0x033eaeab, 0x0007af84, 0x014436d5, 0x026ac5b2, 0x01ae0eab, 0x004c237a, 0x016af23f, 0x00258d78, 0x03b1c370, 0x0007bbd1}}}, + {X: Field{[10]uint32{0x02b352e0, 0x01f68f07, 0x02f08b9b, 0x034ffded, 0x02327891, 0x0021cd59, 0x03174027, 0x019baf39, 0x029cc6b1, 0x000836a8}}, Y: Field{[10]uint32{0x02e8a3fb, 0x0374fdde, 0x027a4299, 0x00981370, 0x02a30cb5, 0x00b0e8c9, 0x01d66929, 0x03e937b0, 0x002cecd6, 0x000bfda6}}}, + {X: Field{[10]uint32{0x03674d9b, 0x00bafdd4, 0x00bdd71b, 0x0101b30d, 0x023aab84, 0x025be7d3, 0x0147a534, 0x02f84d9d, 0x00dd2ae5, 0x00385ac2}}, Y: Field{[10]uint32{0x03a06846, 0x01e87646, 0x02c1d931, 0x0322dc4d, 0x0248a1af, 0x00d5ed6e, 0x003d60d6, 0x00ac7239, 0x024bd952, 0x002dc3dc}}}, + {X: Field{[10]uint32{0x016b93d3, 0x014d59f9, 0x00475807, 0x03b00f1a, 0x00c59670, 0x002c1b51, 0x039485e0, 0x036cd03f, 0x01af2d69, 0x0022228b}}, Y: Field{[10]uint32{0x01d4e3f5, 0x01e7ed8c, 0x01a9e9ba, 0x0212de52, 0x028e8043, 0x02c9c6ae, 0x00753f05, 0x002e0ab1, 0x03a7792e, 0x00376f93}}}, + {X: Field{[10]uint32{0x016abd12, 0x035831d8, 0x01704d50, 0x0032fd0f, 0x02ee6d8e, 0x00c7e5ec, 0x022e3081, 0x03f754b0, 0x00e29090, 0x001d1dda}}, Y: Field{[10]uint32{0x00b61058, 0x02eb1827, 0x0384099d, 0x01172338, 0x0227b266, 0x03b9ffcd, 0x012879e5, 0x0382d2ed, 0x03408d1c, 0x003aa9d7}}}, + {X: Field{[10]uint32{0x018d6eda, 0x01f5e73f, 0x011435a1, 0x0163e44c, 0x0380897a, 0x01f00307, 0x0337cc88, 0x004c6a34, 0x02ac1c7d, 0x00215a7c}}, Y: Field{[10]uint32{0x03eacf71, 0x01fb5b60, 0x01a8edda, 0x02aa9397, 0x0385e43b, 0x011a8ce4, 0x00e700a7, 0x001ba0be, 0x0344252d, 0x001413c2}}}, + {X: Field{[10]uint32{0x011860c9, 0x035a1078, 0x00591e57, 0x03e2f920, 0x00c4418d, 0x010a6e1d, 0x00a1d680, 0x0087713f, 0x03f9a672, 0x0013c57c}}, Y: Field{[10]uint32{0x0096b7ed, 0x02571529, 0x02a820b7, 0x02f13318, 0x013f1154, 0x01f4a418, 0x02bda108, 0x02a70685, 0x01561783, 0x00260b03}}}, + {X: Field{[10]uint32{0x004a92ce, 0x02fdf005, 0x019439e1, 0x036ea909, 0x0204e4f9, 0x03dc9635, 0x03d56ce6, 0x01b878fa, 0x02201f22, 0x00087946}}, Y: Field{[10]uint32{0x01aac869, 0x011c1e5d, 0x0235918d, 0x019d144d, 0x02428f31, 0x0326f42a, 0x001486fe, 0x0292b497, 0x0001b6a5, 0x001311ea}}}, + {X: Field{[10]uint32{0x000211a0, 0x00a84627, 0x01f2ed5e, 0x00d8e56f, 0x03e0f283, 0x03fdafe2, 0x034c4f9d, 0x03b03342, 0x002e8865, 0x003eb1f9}}, Y: Field{[10]uint32{0x00dd695e, 0x01aee8b1, 0x025c641e, 0x02dceeb5, 0x02ce656f, 0x0265cc1e, 0x01fece11, 0x00667bec, 0x019c8337, 0x000da04b}}}, + {X: Field{[10]uint32{0x0226d225, 0x01915246, 0x03469910, 0x00b5ee72, 0x0257f0f4, 0x010b4a7b, 0x01686714, 0x031dfb31, 0x039ec91b, 0x002851e0}}, Y: Field{[10]uint32{0x005bc5a4, 0x001dc2b2, 0x02edab73, 0x0138bc53, 0x02fc0d06, 0x028a7f06, 0x0120257f, 0x019fc618, 0x010ebf72, 0x003d010d}}}, + {X: Field{[10]uint32{0x00636b8c, 0x02790706, 0x01e2bdf1, 0x003dc5ab, 0x0344a790, 0x00563cf8, 0x0083c1f4, 0x01a01112, 0x00f9e508, 0x0034484b}}, Y: Field{[10]uint32{0x03fc0964, 0x00eb2c09, 0x02ec0555, 0x03203a31, 0x022f9c21, 0x00c8d71a, 0x00183a0f, 0x0059944a, 0x005107b9, 0x0001c82e}}}, + {X: Field{[10]uint32{0x03948975, 0x027fa422, 0x03ce72dd, 0x03282249, 0x022e4852, 0x00681f5e, 0x037c1250, 0x0095e025, 0x0334a7ab, 0x0004f57c}}, Y: Field{[10]uint32{0x018773ca, 0x01edbade, 0x0282a7d8, 0x014d1e7f, 0x02ff9987, 0x03a30e05, 0x0231db1a, 0x02aed473, 0x01e2d1d0, 0x0025ce1a}}}, + {X: Field{[10]uint32{0x0063507d, 0x02f7ec39, 0x007e6b9a, 0x0294d31e, 0x025ec754, 0x01af084d, 0x029bec32, 0x027a39da, 0x01616dae, 0x0007c19a}}, Y: Field{[10]uint32{0x035b262d, 0x03473471, 0x013ceb5b, 0x01d02ccd, 0x03c6f999, 0x0264ea6f, 0x01f9fc12, 0x00447e20, 0x030eb4ea, 0x00369201}}}, + {X: Field{[10]uint32{0x01150269, 0x02ab57da, 0x020298d4, 0x03400453, 0x01907b15, 0x027e5d7d, 0x02d9a495, 0x00770f12, 0x01873868, 0x0001ca78}}, Y: Field{[10]uint32{0x01455442, 0x001967e3, 0x003f2456, 0x020a7a36, 0x02c1901c, 0x02c0d69f, 0x020022c8, 0x02806db7, 0x018ec60e, 0x0036fcbb}}}, + {X: Field{[10]uint32{0x01fda12a, 0x0085a1c7, 0x02fa02ee, 0x03bb0810, 0x028e3692, 0x03864309, 0x002435fd, 0x00d1dd35, 0x03e96135, 0x003a4bf2}}, Y: Field{[10]uint32{0x0164f2ff, 0x014b320b, 0x01a84fb8, 0x01447c07, 0x03585b14, 0x039bb173, 0x02369575, 0x02035907, 0x000e3f52, 0x0029d6d7}}}, + {X: Field{[10]uint32{0x00da36df, 0x0204b532, 0x01c1c789, 0x0335fcad, 0x001ad35b, 0x00fdae41, 0x004dfbf9, 0x0234e7a7, 0x021ac69f, 0x002170b9}}, Y: Field{[10]uint32{0x00b53f45, 0x03eaecf0, 0x03752f38, 0x036efca5, 0x02575264, 0x00caac46, 0x00a50b33, 0x00a78697, 0x01876944, 0x00329b64}}}, + {X: Field{[10]uint32{0x011bc05c, 0x0051f86f, 0x0024f10f, 0x016021e7, 0x003adf99, 0x016b93c0, 0x01c2791b, 0x031ad03d, 0x0232c33c, 0x0004345d}}, Y: Field{[10]uint32{0x039a687d, 0x00b24a64, 0x01718a8b, 0x013cc481, 0x000be846, 0x02393170, 0x01bae008, 0x03b1bd17, 0x0334f1dd, 0x003857b9}}}, + {X: Field{[10]uint32{0x025d609a, 0x03b21af8, 0x036f028f, 0x035a09d1, 0x0092511d, 0x01fa82ef, 0x01820bd2, 0x0225cbce, 0x03452593, 0x0029a508}}, Y: Field{[10]uint32{0x0311d6e9, 0x01cc20d3, 0x016bd0ea, 0x01b02d4a, 0x00af49ee, 0x0095b2d2, 0x036d1b66, 0x01cfd24f, 0x0216870f, 0x00381acd}}}, + {X: Field{[10]uint32{0x0394d8ac, 0x019b6237, 0x0190604f, 0x01d5aec3, 0x03c401a6, 0x016db131, 0x02ba0524, 0x02b8fd0f, 0x00ed2b3d, 0x002d29f6}}, Y: Field{[10]uint32{0x00963456, 0x00291b64, 0x01ecfd2b, 0x00138429, 0x01074dcb, 0x0341ebcd, 0x03def119, 0x036d6bf5, 0x00631a2c, 0x003ff207}}}, + {X: Field{[10]uint32{0x01a6fd17, 0x0078aaf7, 0x01266303, 0x03fd613c, 0x03f84fb2, 0x026a9574, 0x01cb660d, 0x00f15ca1, 0x021daebd, 0x0016baf8}}, Y: Field{[10]uint32{0x02f1abe8, 0x03366676, 0x00ff6d9d, 0x03bdecd7, 0x038f5994, 0x03572114, 0x0178c40c, 0x02d4c834, 0x01136a51, 0x00008ba9}}}, + {X: Field{[10]uint32{0x008c7f87, 0x00c5b9cb, 0x01c51278, 0x00360e18, 0x0269388d, 0x01158ea9, 0x016d64cb, 0x022356de, 0x02641943, 0x002b1a11}}, Y: Field{[10]uint32{0x02f41ac1, 0x004eace7, 0x02e5ff89, 0x02209961, 0x034d7109, 0x03da4fa4, 0x03bf1143, 0x002c0425, 0x02d82dc9, 0x0032e509}}}, + {X: Field{[10]uint32{0x00955250, 0x00855f09, 0x028356b8, 0x0190589f, 0x0176ad27, 0x009f3a2a, 0x00c58c2f, 0x0398861d, 0x01490f89, 0x001be52f}}, Y: Field{[10]uint32{0x007c5614, 0x037cfe6f, 0x012ec0d8, 0x02163b03, 0x01e3633a, 0x03e188bd, 0x03d9cf68, 0x0371f171, 0x00ce4a54, 0x003490cc}}}, + {X: Field{[10]uint32{0x0008f137, 0x01024168, 0x02fa9d09, 0x0229e168, 0x00775e06, 0x02b17fd1, 0x019ec5c9, 0x0251e81b, 0x008ce149, 0x0000fe5b}}, Y: Field{[10]uint32{0x005f3f40, 0x003ab320, 0x00ce2b12, 0x0100c380, 0x009b7d9e, 0x00d8327f, 0x03613d4e, 0x029418f3, 0x03af7111, 0x002a4773}}}, + {X: Field{[10]uint32{0x039c707d, 0x01c2565d, 0x033c8f34, 0x01866ca9, 0x00405a5b, 0x0124265d, 0x022a4c17, 0x01d74ee1, 0x005cdfd6, 0x0036016c}}, Y: Field{[10]uint32{0x003b6865, 0x0233b20f, 0x03a66b6d, 0x03c40f30, 0x0184366e, 0x02edff2c, 0x022abdbf, 0x027cb78e, 0x004cc727, 0x0029a2d5}}}, + {X: Field{[10]uint32{0x039df0e4, 0x02f8d381, 0x031d4808, 0x00cdbcbd, 0x03591422, 0x01d2afa6, 0x020efa78, 0x0272d9af, 0x000bd418, 0x00348a4f}}, Y: Field{[10]uint32{0x012682b1, 0x0301a3c8, 0x0131318c, 0x0268ff83, 0x017f24f7, 0x033a8e1c, 0x03fe70a5, 0x012582e6, 0x024887c5, 0x0017ef0c}}}, + {X: Field{[10]uint32{0x03209d5f, 0x032b6716, 0x016570fa, 0x03ed55be, 0x01e3f107, 0x01dacf17, 0x0149d26e, 0x008ff9eb, 0x010be226, 0x0024c7c2}}, Y: Field{[10]uint32{0x031cc087, 0x034685d2, 0x00144d5a, 0x03006143, 0x01848f57, 0x006ba8e5, 0x01daf748, 0x02626619, 0x0279d2a8, 0x00330957}}}, + {X: Field{[10]uint32{0x01e5ddc9, 0x0165cc8e, 0x00987a03, 0x002b6cd0, 0x006e4e69, 0x021500e9, 0x02a72f62, 0x03fdaf23, 0x02836707, 0x00046298}}, Y: Field{[10]uint32{0x03ff818b, 0x0086603d, 0x027ad722, 0x02361704, 0x00b6f5a1, 0x0365abe1, 0x039d4470, 0x024160db, 0x03e5e65a, 0x00247c03}}}, + {X: Field{[10]uint32{0x036a985a, 0x0071a907, 0x014be189, 0x00b4b998, 0x01b811ca, 0x03475278, 0x014ba420, 0x02d26b40, 0x00eb5b6c, 0x0020425b}}, Y: Field{[10]uint32{0x03607e5d, 0x03fa5c2d, 0x038f5b4d, 0x0181ac12, 0x003f4948, 0x00d52d9d, 0x0050a3c1, 0x03cf95e0, 0x01c5f8f9, 0x00036814}}}, + {X: Field{[10]uint32{0x000cae06, 0x0042624c, 0x0068b9f4, 0x010db771, 0x00351b7e, 0x020fad1f, 0x013559e7, 0x017b58b7, 0x00385ff4, 0x0026a029}}, Y: Field{[10]uint32{0x0004b6d0, 0x015efe2e, 0x01cad30e, 0x01678f90, 0x00bee656, 0x003154e6, 0x028aee8b, 0x02716d18, 0x039921b6, 0x00211747}}}, + {X: Field{[10]uint32{0x02747906, 0x009023d1, 0x0209081c, 0x0137eeed, 0x02214395, 0x007a57fa, 0x02c1d596, 0x0156e5fe, 0x00f3b899, 0x001a8c5a}}, Y: Field{[10]uint32{0x00ccc005, 0x00f15ca3, 0x01403c48, 0x007a0475, 0x02012c74, 0x00b2406d, 0x0244a3f8, 0x03c420eb, 0x03886778, 0x0016d7c7}}}, + {X: Field{[10]uint32{0x01214af8, 0x002a43f8, 0x018a73db, 0x03fbd3e3, 0x03797710, 0x022f23b5, 0x03d42985, 0x0196e88e, 0x031178d1, 0x002680ea}}, Y: Field{[10]uint32{0x01e85665, 0x00ad6f22, 0x0265ca65, 0x00287542, 0x0159a555, 0x02955bd4, 0x0112f2bf, 0x012fd245, 0x00e7e61e, 0x001c2223}}}, + {X: Field{[10]uint32{0x00ea2f5d, 0x01e3bdbd, 0x00e25e78, 0x01066477, 0x01296c8c, 0x0230525c, 0x02615754, 0x03678566, 0x018d78b8, 0x00232430}}, Y: Field{[10]uint32{0x031ca074, 0x005220b2, 0x01a68028, 0x03e6da42, 0x032b97c0, 0x036edc89, 0x0244a5e5, 0x02394685, 0x00cfde62, 0x000a950a}}}, + {X: Field{[10]uint32{0x008a8957, 0x035b74d4, 0x01d43b68, 0x008cce7f, 0x00933279, 0x000b27b4, 0x037a5daa, 0x00093613, 0x037f3062, 0x000ba6ea}}, Y: Field{[10]uint32{0x02a43345, 0x011d4c34, 0x02aca4a1, 0x023268dd, 0x03ea7e4f, 0x0148ecb7, 0x01e21f19, 0x000f27c8, 0x00b73f38, 0x00326be0}}}, + {X: Field{[10]uint32{0x02466322, 0x005d9c66, 0x0384db5c, 0x0260d0eb, 0x03e21298, 0x03ef9a8d, 0x0295e7c1, 0x033fbd92, 0x032e718e, 0x0009cd2f}}, Y: Field{[10]uint32{0x0284216e, 0x018d8c79, 0x03ca8f0a, 0x012f7e28, 0x007d0a1e, 0x01a5cc4b, 0x02a0ce34, 0x017c338d, 0x018a9f11, 0x003d4c02}}}, + {X: Field{[10]uint32{0x016aab58, 0x030a9475, 0x000d5e21, 0x01ee323d, 0x004af325, 0x01e6d485, 0x001b9975, 0x012939ba, 0x02f9500e, 0x002ae7b2}}, Y: Field{[10]uint32{0x01e0f047, 0x0035470f, 0x01bc3ff3, 0x039d5d0f, 0x01d0aaed, 0x00e2a216, 0x015e9d19, 0x0061126f, 0x03468e08, 0x003df4e1}}}, + {X: Field{[10]uint32{0x031af368, 0x0190d6b2, 0x000c0169, 0x01353a11, 0x00292b4d, 0x016eaa20, 0x029cd3e8, 0x027bcb96, 0x0146a4c0, 0x002b897d}}, Y: Field{[10]uint32{0x03f3da84, 0x004157bd, 0x03d59e05, 0x03c84404, 0x0080bd59, 0x0254f1b1, 0x039a9f22, 0x02103edc, 0x03b37373, 0x0011a8ac}}}, + {X: Field{[10]uint32{0x012e6142, 0x020f7070, 0x00ace54a, 0x02cafb01, 0x034e35ab, 0x0213f003, 0x017efaa8, 0x00736bd6, 0x01a64ef2, 0x00150a17}}, Y: Field{[10]uint32{0x00cdbc3d, 0x002db0c8, 0x03f6e522, 0x0124351b, 0x00b962a8, 0x00897757, 0x03c2dc29, 0x01ed6e91, 0x02b2144d, 0x000120ef}}}, + {X: Field{[10]uint32{0x03dca65e, 0x03ad984d, 0x00874c8d, 0x03ba8a45, 0x0035a627, 0x01a9e15f, 0x02d542ed, 0x008c7d82, 0x003404bc, 0x002fb3a1}}, Y: Field{[10]uint32{0x022f6a95, 0x00bd3acf, 0x034f8e9c, 0x02b6934e, 0x00fe1c93, 0x03820495, 0x0077fb8d, 0x039cbe39, 0x038002f9, 0x00288a7e}}}, + {X: Field{[10]uint32{0x035e81d1, 0x03672d3e, 0x0326b26f, 0x00b6b9b0, 0x0389994a, 0x03a082ef, 0x02fe5af1, 0x02e15d1c, 0x0347b148, 0x0000f555}}, Y: Field{[10]uint32{0x01e465df, 0x000073ef, 0x0052db90, 0x03efbf56, 0x03c9ea7d, 0x02cac58b, 0x035bc4f1, 0x00a293d8, 0x025ae867, 0x0037b7b2}}}, + {X: Field{[10]uint32{0x01cde5d4, 0x025f73dd, 0x01715fbc, 0x0080cd1d, 0x021846b5, 0x022fda9c, 0x036361a8, 0x00f1cd67, 0x0219d163, 0x0004f1a0}}, Y: Field{[10]uint32{0x03f83af4, 0x0104fe4d, 0x02e55935, 0x038aacad, 0x03bddf0c, 0x00b5e7a7, 0x02bfe7c5, 0x01fc825a, 0x00c239fc, 0x0033a28f}}}, + {X: Field{[10]uint32{0x01b0a6ac, 0x014049b5, 0x03433436, 0x00a6fa0d, 0x0036690a, 0x02ad4bc6, 0x00c481ad, 0x00691c9d, 0x02e1a804, 0x003a7902}}, Y: Field{[10]uint32{0x00c6bb7f, 0x0191bc8e, 0x029a9577, 0x008a9576, 0x019a22fa, 0x012451f3, 0x031f3147, 0x00e6e04d, 0x00b79c98, 0x00306656}}}, + {X: Field{[10]uint32{0x01493068, 0x006d3228, 0x00eea632, 0x01c6689a, 0x0113af43, 0x0236d872, 0x0353a537, 0x028697dc, 0x01537460, 0x000b8ed1}}, Y: Field{[10]uint32{0x03a54dcf, 0x014b1772, 0x01bb6e04, 0x03cadbed, 0x015ccf5c, 0x02439540, 0x019d3e22, 0x019b2125, 0x02561049, 0x003dee97}}}, + {X: Field{[10]uint32{0x034c62b8, 0x03c3d202, 0x0091edb1, 0x03713329, 0x026a59f3, 0x03d9c373, 0x02aa40eb, 0x012c019f, 0x0082b921, 0x0026156f}}, Y: Field{[10]uint32{0x00fcf435, 0x03072033, 0x000098d4, 0x0084e11e, 0x0387184e, 0x02c1c580, 0x0237d6b5, 0x031cf3a7, 0x036e3be6, 0x0029f64f}}}, + {X: Field{[10]uint32{0x01253979, 0x03e11d85, 0x00866982, 0x03148cee, 0x0367486b, 0x0273c9f7, 0x004bee26, 0x00a44db5, 0x00a9b934, 0x000dfe08}}, Y: Field{[10]uint32{0x0070ca15, 0x01a28a1e, 0x0288b2a5, 0x00ee75ee, 0x0150dd89, 0x01f159a9, 0x0345a5a3, 0x0274ddfc, 0x029daa62, 0x003f72ba}}}, + {X: Field{[10]uint32{0x02d41a98, 0x02a747f7, 0x013b03cb, 0x028a8e13, 0x023e0cd0, 0x001c3167, 0x00f6ba28, 0x00ec31a4, 0x0098a92a, 0x003a0b4b}}, Y: Field{[10]uint32{0x00501460, 0x021af832, 0x0306095c, 0x03341852, 0x01d09d7e, 0x031f540b, 0x0033d344, 0x016cd852, 0x023232d8, 0x000c79ce}}}, + {X: Field{[10]uint32{0x02923419, 0x024de666, 0x03f3a24b, 0x007ad002, 0x03ad4690, 0x03abb38e, 0x00711827, 0x032419a8, 0x03c36dd4, 0x002f524b}}, Y: Field{[10]uint32{0x01dd7798, 0x01a83240, 0x01af5fdc, 0x024ef349, 0x018b93da, 0x01ff5012, 0x036dbd0a, 0x03569199, 0x03c51e1f, 0x0032ab68}}}, + {X: Field{[10]uint32{0x0229577a, 0x03b4cae1, 0x039641cd, 0x0265ef7c, 0x00cd8f0d, 0x0169a720, 0x022c4dc1, 0x03b13cf2, 0x02da42d1, 0x001b22d1}}, Y: Field{[10]uint32{0x0318c956, 0x00900131, 0x030a97f1, 0x023b98ac, 0x01cbeb98, 0x02f2f08e, 0x02ef5965, 0x010b83dc, 0x0362729e, 0x0034eb53}}}, + {X: Field{[10]uint32{0x00f5dd62, 0x03af303e, 0x00f05ea9, 0x006ab432, 0x03effee7, 0x034d5ad3, 0x00a25d34, 0x034f7615, 0x01e6799b, 0x001e2c7a}}, Y: Field{[10]uint32{0x0131145d, 0x017e248e, 0x025c1dd2, 0x00adc0b9, 0x01d726ce, 0x028c0199, 0x03d70057, 0x02237301, 0x02d6a267, 0x000c540f}}}, + {X: Field{[10]uint32{0x02ebdccf, 0x01d3ba96, 0x00375c89, 0x0170057c, 0x03cb53fa, 0x03e92ada, 0x028cda6b, 0x0148f8f1, 0x02a663c5, 0x003cbb40}}, Y: Field{[10]uint32{0x00f36382, 0x039c968f, 0x03b67773, 0x02a3451d, 0x02937720, 0x00882b4c, 0x03922413, 0x000c838e, 0x01c3afdc, 0x0000ef79}}}, + {X: Field{[10]uint32{0x02caffd3, 0x00259f50, 0x02a60cde, 0x0005746a, 0x00f67ab1, 0x03fdae88, 0x0254d835, 0x0002fc1f, 0x0243a458, 0x001f90fd}}, Y: Field{[10]uint32{0x0398d68a, 0x00851655, 0x0079a76e, 0x004ad55a, 0x0158600d, 0x001ed49a, 0x03fbb378, 0x00ce66d5, 0x02da0f47, 0x0007d15b}}}, + {X: Field{[10]uint32{0x01319be8, 0x002d9598, 0x01d07643, 0x03299955, 0x017ccde2, 0x02d34b3a, 0x00c0a624, 0x00da5ea9, 0x01775eb7, 0x0037c578}}, Y: Field{[10]uint32{0x027311ad, 0x001e73ec, 0x00e53b35, 0x032ac5b9, 0x0108397c, 0x02983b8b, 0x0173dfb8, 0x00e06308, 0x00dcf154, 0x0000125b}}}, + {X: Field{[10]uint32{0x0382e2ae, 0x01fd9a71, 0x00fceef3, 0x03ee4685, 0x036707a3, 0x02503a12, 0x01c16487, 0x02ec804b, 0x03060295, 0x003b7c75}}, Y: Field{[10]uint32{0x02019a2e, 0x02a2593f, 0x00d7d239, 0x0263c239, 0x039ed8f5, 0x03a223ab, 0x00b2dd68, 0x01b25ec8, 0x02f6fcd7, 0x0038e83c}}}, + {X: Field{[10]uint32{0x02f8f6c0, 0x023ed705, 0x03c2d9b1, 0x0335aea1, 0x01fd92ce, 0x00f41193, 0x023c3137, 0x02087cef, 0x02b26b15, 0x00305408}}, Y: Field{[10]uint32{0x02136c2e, 0x01606f73, 0x02da9327, 0x0096a03f, 0x0065d57f, 0x00ba7e81, 0x03961e69, 0x00a10b81, 0x0370d94e, 0x001e3348}}}, + {X: Field{[10]uint32{0x036001d9, 0x01f69fb1, 0x01105e27, 0x032ed4b7, 0x00c6cc2b, 0x02a3e324, 0x01886a28, 0x00578042, 0x036bb6ae, 0x0002f537}}, Y: Field{[10]uint32{0x02f1446f, 0x021c9f63, 0x0387572f, 0x03736806, 0x03a6f6fa, 0x01b3b4b8, 0x00e50299, 0x032e596e, 0x01b2b0b4, 0x00126596}}}, + {X: Field{[10]uint32{0x03bc0b76, 0x0025c023, 0x03ed4b21, 0x02d3211a, 0x021e2d6e, 0x018bc603, 0x01f9b4f1, 0x02533949, 0x02328738, 0x0037f3b0}}, Y: Field{[10]uint32{0x01b4f92e, 0x03bc019a, 0x03b953f8, 0x0314cc90, 0x005a477e, 0x02842acf, 0x0318f059, 0x0239c670, 0x021bf4c8, 0x002bef1d}}}, + {X: Field{[10]uint32{0x01c94e54, 0x02c7fbfd, 0x008e1a9e, 0x00d5d939, 0x00b84739, 0x02e2d07f, 0x0259b005, 0x013eb88d, 0x004de3c9, 0x002c01db}}, Y: Field{[10]uint32{0x039c7d4f, 0x0288c203, 0x00551f3e, 0x0286e13a, 0x01fe17fd, 0x0120c282, 0x002ee5e4, 0x029a1dbd, 0x02553c55, 0x00387acc}}}, + {X: Field{[10]uint32{0x022d0c11, 0x0130fc36, 0x008be94b, 0x02c266fa, 0x020fe9eb, 0x03599e1e, 0x01e9fe33, 0x00957304, 0x029c17c4, 0x0002687f}}, Y: Field{[10]uint32{0x008e8379, 0x03d5a37a, 0x002b096a, 0x01b98b7c, 0x0325f6fd, 0x01eb472a, 0x023e1aac, 0x039ce5b8, 0x030999a8, 0x0039abbd}}}, + {X: Field{[10]uint32{0x01212899, 0x01ba7905, 0x030f2257, 0x01b9e658, 0x02e1d8b1, 0x01b19441, 0x0399b88b, 0x02f05766, 0x0134126b, 0x0007626a}}, Y: Field{[10]uint32{0x02f8f4eb, 0x02035669, 0x00fd7567, 0x0113b4db, 0x0137d646, 0x03657142, 0x01a79ef7, 0x001c883a, 0x025692db, 0x002df8c8}}}, + {X: Field{[10]uint32{0x000c7fa4, 0x02f90cdc, 0x000a6ac2, 0x015886f2, 0x02345469, 0x014c3b7e, 0x0062d4f7, 0x00de58f1, 0x0068b67b, 0x003183d7}}, Y: Field{[10]uint32{0x038a7e08, 0x01d6982f, 0x002c653f, 0x014d73b0, 0x03b5507b, 0x003724b4, 0x01b5a676, 0x03c38e86, 0x007197ff, 0x00223e2c}}}, + {X: Field{[10]uint32{0x02d9d949, 0x01f5b094, 0x02ec9e6b, 0x0073dda3, 0x03620576, 0x00c06f90, 0x036499ad, 0x009a646d, 0x036f0d9b, 0x0014b34a}}, Y: Field{[10]uint32{0x030ec835, 0x00084e00, 0x024aa138, 0x020bd51f, 0x02263563, 0x031e0ac9, 0x0111a3ea, 0x00d42283, 0x00661fa3, 0x003449f3}}}, + {X: Field{[10]uint32{0x0105dda9, 0x00d0091b, 0x03be920a, 0x02973d38, 0x01c21fbe, 0x0345aec6, 0x004f107f, 0x020d7fce, 0x019ea639, 0x00079112}}, Y: Field{[10]uint32{0x032d1f53, 0x0104b083, 0x0088d027, 0x008fa585, 0x018f8adf, 0x013f43c8, 0x00d12db7, 0x010be654, 0x00e90a90, 0x001071aa}}}, + {X: Field{[10]uint32{0x006861de, 0x009d50ff, 0x01cb1c67, 0x01595a81, 0x03984ecc, 0x01804dba, 0x0253bae3, 0x0252eb47, 0x00f0a563, 0x0004e451}}, Y: Field{[10]uint32{0x02d0742a, 0x03b4ed0b, 0x02dc1025, 0x0005ba87, 0x00964f3d, 0x03010aee, 0x03174ab6, 0x03a6c86f, 0x0337ff37, 0x001c0e51}}}, + {X: Field{[10]uint32{0x014a2280, 0x029d3e19, 0x02eb75a2, 0x0322db6d, 0x0134fe75, 0x018d39a1, 0x03cb9546, 0x037c6187, 0x002a2454, 0x0024d328}}, Y: Field{[10]uint32{0x03195761, 0x03e85736, 0x00be4375, 0x00e9af9e, 0x016865ce, 0x013f493c, 0x003caee7, 0x03f2802e, 0x0384266c, 0x001de7a5}}}, + {X: Field{[10]uint32{0x006a3be6, 0x034c9b62, 0x0279a7ac, 0x02a8b52d, 0x00af913b, 0x034d7b35, 0x01a8c329, 0x009165df, 0x007d9e1c, 0x002993c1}}, Y: Field{[10]uint32{0x01112b2b, 0x0052061e, 0x03581e60, 0x00263b15, 0x023210f3, 0x0091d677, 0x02145e3b, 0x03b5b440, 0x030ff3b4, 0x003847a0}}}, + {X: Field{[10]uint32{0x018757e1, 0x0150a3a0, 0x0034e2a1, 0x0312e2f5, 0x03cfcf45, 0x03c57fa3, 0x00820ccd, 0x02422236, 0x00bdcd62, 0x003871a2}}, Y: Field{[10]uint32{0x00c77f7d, 0x003dbc86, 0x03600d13, 0x00685499, 0x01a34e7d, 0x01deedd1, 0x03b8e00e, 0x03238004, 0x02e171e7, 0x002f0431}}}, + {X: Field{[10]uint32{0x00137358, 0x03baab1a, 0x01354c6d, 0x03b43655, 0x010ba2bd, 0x009ebf32, 0x0056de68, 0x01c3cb65, 0x00951231, 0x002c68c3}}, Y: Field{[10]uint32{0x004071f5, 0x01f5042c, 0x032985a1, 0x01fb7e86, 0x02a67879, 0x00100dcf, 0x00443469, 0x0072bf4e, 0x00abc16c, 0x00271da8}}}, + {X: Field{[10]uint32{0x02166e85, 0x024afab9, 0x034d0d68, 0x027da66b, 0x034c7cf9, 0x023d7894, 0x028ba235, 0x00a470d1, 0x03b5fbb0, 0x00093309}}, Y: Field{[10]uint32{0x039f71d5, 0x0287b633, 0x038ddd7a, 0x03388c4a, 0x02d51aab, 0x03c1da3f, 0x03c52e3f, 0x02e9099c, 0x01af2516, 0x003abcda}}}, + {X: Field{[10]uint32{0x008f6a57, 0x02aacb65, 0x00a92217, 0x01de136a, 0x02bacab5, 0x02f4c73b, 0x03e8921c, 0x03478bdf, 0x017a6166, 0x0022ed00}}, Y: Field{[10]uint32{0x008dc331, 0x00355ac2, 0x00c8a5c3, 0x01ca4f5e, 0x01a09cad, 0x0060a65b, 0x02e34fc7, 0x01a618d5, 0x000e6c47, 0x0032265d}}}, + {X: Field{[10]uint32{0x00497f6f, 0x02668cd8, 0x0368b0ec, 0x03d6949c, 0x01e6dafe, 0x002cc0ff, 0x02c17dc2, 0x03765b83, 0x03ddd82f, 0x0015762d}}, Y: Field{[10]uint32{0x03b8beca, 0x0211d8ad, 0x03657bbf, 0x00c347ff, 0x03f4f292, 0x0139cba7, 0x021709e4, 0x0359bd0d, 0x0111078b, 0x003f5891}}}, + {X: Field{[10]uint32{0x00c94df3, 0x038a148d, 0x028455db, 0x009bb11e, 0x03109d46, 0x00176f78, 0x01cbfe61, 0x00c6bd46, 0x01ef5a55, 0x0020aa8b}}, Y: Field{[10]uint32{0x01811511, 0x003b8e33, 0x007c4ebc, 0x03e81a85, 0x018d1e60, 0x0097eec9, 0x002df919, 0x028b9423, 0x03ea9f83, 0x00184582}}}, + {X: Field{[10]uint32{0x00f6f7f4, 0x010e33cb, 0x01636ad3, 0x02c30a38, 0x00804b03, 0x033ea466, 0x002cfbf3, 0x01ffe11f, 0x037cc6df, 0x000db049}}, Y: Field{[10]uint32{0x02fe4833, 0x0168a945, 0x03020aee, 0x018038cb, 0x03a7bb3b, 0x02963811, 0x015d821e, 0x0071d151, 0x03a274f8, 0x0008c13e}}}, + {X: Field{[10]uint32{0x00cd9119, 0x02215ab8, 0x0318c0eb, 0x0097e926, 0x02d57b89, 0x03002cd9, 0x02c9e860, 0x032b5f85, 0x01cc5b44, 0x003cddbf}}, Y: Field{[10]uint32{0x00a028cb, 0x039ea814, 0x006ac74f, 0x02b2f7d7, 0x01c3d0e7, 0x006b3f23, 0x009e3ef1, 0x03a07c12, 0x0132e4de, 0x000b5ab3}}}, + {X: Field{[10]uint32{0x01c5030b, 0x02ab3297, 0x03d1cc7a, 0x01b0e7b3, 0x0197150b, 0x001f4ea2, 0x02e8ecb9, 0x03a7d765, 0x00dc5372, 0x003a9384}}, Y: Field{[10]uint32{0x02d96ff5, 0x01999b0d, 0x003f9520, 0x0180513f, 0x0336d6be, 0x03f7ae25, 0x03486d29, 0x009aff0b, 0x02a393b6, 0x002c225b}}}, + {X: Field{[10]uint32{0x02fdeb08, 0x020728e9, 0x0191a0d1, 0x0067c6a7, 0x00a376ea, 0x006c512e, 0x03f0a2c7, 0x01285e74, 0x02b4b266, 0x001d3ce4}}, Y: Field{[10]uint32{0x009e1fc0, 0x03b820f8, 0x02636c6e, 0x00d901b4, 0x01c95230, 0x026d19cd, 0x02cef679, 0x01623d93, 0x0321428d, 0x0026f536}}}, + {X: Field{[10]uint32{0x014855eb, 0x0258bbf3, 0x02774ca6, 0x01ad62e0, 0x0111c13a, 0x00393208, 0x01a17daf, 0x01ddd290, 0x004259ba, 0x000e8db2}}, Y: Field{[10]uint32{0x00fa5e3c, 0x02574af8, 0x03f482f0, 0x02e91763, 0x01f35e46, 0x017bce79, 0x01720c71, 0x024a3359, 0x01ad9ede, 0x001b76b4}}}, + {X: Field{[10]uint32{0x0098c019, 0x01434a97, 0x0364deae, 0x00623cc9, 0x017635ef, 0x01ac5faa, 0x02739814, 0x02913c5b, 0x02ad5636, 0x00275dec}}, Y: Field{[10]uint32{0x02ee3eef, 0x030dc688, 0x03234f30, 0x033674bd, 0x03eb5936, 0x02cb6c25, 0x0392b8ac, 0x02186ae4, 0x0027a775, 0x0014cb74}}}, + {X: Field{[10]uint32{0x02a3c4ab, 0x02b9f9ef, 0x02c1b39a, 0x005fb91a, 0x000deb61, 0x00317c6f, 0x01168a0f, 0x00be0381, 0x02e9450e, 0x000b9d00}}, Y: Field{[10]uint32{0x0182fc3b, 0x020abeb3, 0x02b6034b, 0x0073c90b, 0x03cf8572, 0x02208404, 0x016b3fef, 0x03f8ae3b, 0x036b5606, 0x00107a3c}}}, + {X: Field{[10]uint32{0x033ebe6f, 0x030ddb94, 0x03320de0, 0x03c54c52, 0x006a6806, 0x023c0297, 0x0333d35e, 0x02d6f606, 0x03254ed0, 0x002bacb2}}, Y: Field{[10]uint32{0x01b9d59c, 0x03135a8a, 0x03d0b142, 0x003dda0c, 0x035d761c, 0x0320fcc5, 0x0028249f, 0x03e8b2cc, 0x02f52d7b, 0x001ae045}}}, + {X: Field{[10]uint32{0x00ca7895, 0x0330fd17, 0x03655fbb, 0x00eae8e8, 0x014cca66, 0x029e5e4a, 0x00adabe3, 0x00b25e80, 0x00bd55d6, 0x00321889}}, Y: Field{[10]uint32{0x011cc214, 0x00c8eef3, 0x00c21844, 0x014fea54, 0x001d8573, 0x0180276d, 0x0293adfa, 0x01e4d4d9, 0x03b7104f, 0x0028c668}}}, + {X: Field{[10]uint32{0x02efe561, 0x033eee8f, 0x03a66aac, 0x03814d2c, 0x00d53ddd, 0x03f739bd, 0x035a28bc, 0x01a8375e, 0x00cc2c57, 0x00074459}}, Y: Field{[10]uint32{0x004995a7, 0x0119c2ad, 0x0291c000, 0x022490fa, 0x01ec6009, 0x0311c391, 0x00ba6947, 0x03625ff3, 0x00deaa25, 0x002e1624}}}, + {X: Field{[10]uint32{0x0040e3c8, 0x00984629, 0x0393b92f, 0x01062f35, 0x035e7f0f, 0x03124f33, 0x036620a5, 0x0056d739, 0x02b413b9, 0x000ad53e}}, Y: Field{[10]uint32{0x039bf5d1, 0x03400593, 0x03cdb30a, 0x012c0bbf, 0x037a61ce, 0x037777cd, 0x01bdfefb, 0x02b635fa, 0x012556fe, 0x0022bfe3}}}, + {X: Field{[10]uint32{0x0329b340, 0x00ea9815, 0x0188709a, 0x0097cb7e, 0x03a9718c, 0x014f91b5, 0x01428ac8, 0x00a87d82, 0x0224a4e7, 0x0007c7ca}}, Y: Field{[10]uint32{0x00421cbd, 0x037c858b, 0x03170991, 0x00812c85, 0x020b6311, 0x01a1c40c, 0x0394f392, 0x002eeaf3, 0x00a4f492, 0x00011437}}}, + {X: Field{[10]uint32{0x00ebd4e5, 0x017b94b2, 0x03200f18, 0x0167c8bc, 0x0383fbc5, 0x0001f815, 0x025682c5, 0x01f93493, 0x018ee677, 0x00104bd9}}, Y: Field{[10]uint32{0x0171c8f4, 0x02de26d9, 0x00e32887, 0x038c9da4, 0x010c8399, 0x03e9932c, 0x030b3d7a, 0x0253fae4, 0x024a9d93, 0x0030b82d}}}, + {X: Field{[10]uint32{0x00f4912b, 0x007e1513, 0x011fbf56, 0x03e7e4b0, 0x0195102e, 0x019f8943, 0x02fec9a3, 0x02477a5d, 0x00b55677, 0x00212577}}, Y: Field{[10]uint32{0x02152443, 0x0270ca8a, 0x011c5e2a, 0x007d1938, 0x03542e51, 0x014ef693, 0x0263f191, 0x02093bd7, 0x01c57d3d, 0x00197e02}}}, + {X: Field{[10]uint32{0x0156cfde, 0x013fc216, 0x006ee1bb, 0x02a5e959, 0x030b4a18, 0x02172931, 0x0145b8bc, 0x032578ea, 0x01c0d841, 0x003e39ef}}, Y: Field{[10]uint32{0x00ed6d42, 0x03b7577c, 0x010111b4, 0x0358577d, 0x006d6660, 0x012e7f02, 0x009d28c2, 0x00d9e4df, 0x0083f93a, 0x0003342b}}}, + {X: Field{[10]uint32{0x02854c94, 0x00bdcc18, 0x0213164f, 0x0121db92, 0x008c8c56, 0x037ca2b5, 0x00767517, 0x0041c492, 0x025a4e4c, 0x0020c918}}, Y: Field{[10]uint32{0x039bfaeb, 0x03308c07, 0x003561f5, 0x032c902e, 0x01de65e2, 0x00189809, 0x01c7ec37, 0x00a09582, 0x01604992, 0x001d86c6}}}, + {X: Field{[10]uint32{0x03ca04d4, 0x03b61644, 0x032cf213, 0x0180c08f, 0x0216a8e1, 0x00d4f7c7, 0x00b6befd, 0x01f88abd, 0x01ff99f8, 0x0022c712}}, Y: Field{[10]uint32{0x03ad6c23, 0x006f78c8, 0x034c02ca, 0x01d5f89d, 0x006abbf9, 0x008b7894, 0x01cff728, 0x022194b4, 0x03d10e17, 0x00335144}}}, + {X: Field{[10]uint32{0x02f4f138, 0x02b2e0a5, 0x03790bca, 0x03ca1eba, 0x0259deac, 0x018c2d19, 0x0030e89d, 0x01360232, 0x01a120d2, 0x0038ab58}}, Y: Field{[10]uint32{0x02186291, 0x036f1bec, 0x0321abf5, 0x01a5800c, 0x02918497, 0x02b371f2, 0x02d29405, 0x01219f6a, 0x01dcfc1c, 0x00147346}}}, + {X: Field{[10]uint32{0x00c197a4, 0x038eb40d, 0x013ba9ea, 0x0339fd1e, 0x01e10356, 0x00c41580, 0x026aa915, 0x029bcc5a, 0x017ea9a9, 0x0003a373}}, Y: Field{[10]uint32{0x00ea6b5e, 0x0072a14e, 0x0295c2e6, 0x0249a9a1, 0x0195f698, 0x01c712b7, 0x02e2a99e, 0x02abd74c, 0x02d791f3, 0x00320d6e}}}, + {X: Field{[10]uint32{0x00f81233, 0x02423a6f, 0x03556e46, 0x02566c81, 0x00d8643f, 0x033ec171, 0x01bba690, 0x02e3bcd8, 0x00e35875, 0x003c2dd2}}, Y: Field{[10]uint32{0x01d6e908, 0x025006cb, 0x0023e91e, 0x02aea7fd, 0x01c1c0ae, 0x030a7298, 0x00765f60, 0x00e9ed9e, 0x02515d16, 0x001a8993}}}, + {X: Field{[10]uint32{0x01af3a87, 0x025f54ce, 0x017962ce, 0x02ba4faf, 0x03e6eef8, 0x03ff8908, 0x02dd305b, 0x016859d9, 0x016f0997, 0x0024037a}}, Y: Field{[10]uint32{0x01164478, 0x02a9c013, 0x01439650, 0x026c4848, 0x01f33f8e, 0x02f9a692, 0x031bf65d, 0x01628e8c, 0x02ecd9c0, 0x002252ac}}}, + {X: Field{[10]uint32{0x0188aa53, 0x0085283b, 0x00645a6e, 0x02879b4d, 0x01ce7fbd, 0x03a7b3e5, 0x030e3067, 0x008d081c, 0x0130d2ea, 0x00232f9e}}, Y: Field{[10]uint32{0x00186b83, 0x0377615c, 0x01ac9919, 0x01c3b01c, 0x0085092c, 0x008cb24d, 0x027f2c8e, 0x0299f6b8, 0x016bf875, 0x00219ec5}}}, + {X: Field{[10]uint32{0x0225e68d, 0x024bfb26, 0x003e69a2, 0x037f04d6, 0x00e79237, 0x0315c1b5, 0x01a65c0f, 0x03490e51, 0x01c95b35, 0x002832ec}}, Y: Field{[10]uint32{0x02047e4f, 0x0293ac60, 0x00a4055b, 0x00917a14, 0x013c6d70, 0x003701b8, 0x01c8a554, 0x006917e0, 0x01d13cd6, 0x002db5fa}}}, + {X: Field{[10]uint32{0x022463cf, 0x02912209, 0x03f4c832, 0x00f58ed1, 0x00d8050c, 0x017a61ff, 0x02d3bbe0, 0x0232d6a9, 0x0072a3fa, 0x000522ab}}, Y: Field{[10]uint32{0x037e4a61, 0x00ccc899, 0x000b292a, 0x02460963, 0x0372749f, 0x01bcb8ae, 0x0245f6d3, 0x0112156a, 0x0249a6e2, 0x001fca77}}}, + {X: Field{[10]uint32{0x02f3977f, 0x01f3ccd9, 0x018cefb0, 0x03e89688, 0x02c28616, 0x028838b9, 0x02caf7ef, 0x03f5b79b, 0x01073a1a, 0x000ee7fb}}, Y: Field{[10]uint32{0x02c65fc9, 0x01c00f04, 0x010fe0ac, 0x0284d23b, 0x034fa9e7, 0x025ab4f8, 0x030c936e, 0x03259287, 0x033c5084, 0x003c2a16}}}, + {X: Field{[10]uint32{0x023537aa, 0x0196b1f3, 0x020fecc5, 0x03ab7eff, 0x027c9cbc, 0x003e90c6, 0x03b443c3, 0x02ff6555, 0x00ed5228, 0x001f7917}}, Y: Field{[10]uint32{0x022686f0, 0x027377be, 0x00fc1199, 0x02298326, 0x0178e011, 0x0315418b, 0x03794f3a, 0x01c0cef2, 0x01376910, 0x00145777}}}, + {X: Field{[10]uint32{0x01913dd2, 0x03986c95, 0x015aa251, 0x0273ae87, 0x03c17cf9, 0x013cea15, 0x00102747, 0x03d58a60, 0x035a0534, 0x00273068}}, Y: Field{[10]uint32{0x02433ae5, 0x005a130f, 0x007ccc69, 0x010ebcaf, 0x03c653e2, 0x02fe384b, 0x0115da37, 0x0293e658, 0x01a8f30f, 0x003024b3}}}, + {X: Field{[10]uint32{0x02b52ec6, 0x002da41e, 0x00562092, 0x03ec8896, 0x0310fc71, 0x00a29ca0, 0x02ad7298, 0x00ee731d, 0x0168759b, 0x00360bc6}}, Y: Field{[10]uint32{0x0018c607, 0x002bd422, 0x03306c47, 0x020b72b0, 0x011b3720, 0x03872760, 0x0008f8ca, 0x00ec31ce, 0x02052698, 0x00153342}}}, + {X: Field{[10]uint32{0x007b7586, 0x0257ab6e, 0x02498241, 0x01221796, 0x0101f9c5, 0x00a46d83, 0x031bffcc, 0x016a5430, 0x014703d9, 0x0005b9aa}}, Y: Field{[10]uint32{0x03d8aafd, 0x00b15636, 0x03276f88, 0x02393b5c, 0x0080ff4c, 0x02a55f01, 0x010d3655, 0x01ae30b9, 0x0138581b, 0x000678a6}}}, + {X: Field{[10]uint32{0x035cd237, 0x0263948e, 0x03197ff0, 0x01395e85, 0x03ad57a7, 0x01df0d18, 0x02b46704, 0x013c9391, 0x02f300ee, 0x00341f9e}}, Y: Field{[10]uint32{0x035d0e20, 0x01bc9304, 0x00b1bc69, 0x037adbc8, 0x00d4d175, 0x03d86222, 0x031019be, 0x005959a6, 0x020f43c9, 0x003ffcd3}}}, + {X: Field{[10]uint32{0x01665380, 0x007d3679, 0x0301450a, 0x02e43260, 0x018ffe42, 0x00fea93a, 0x02118a34, 0x009ff18e, 0x00e56dc0, 0x000afd91}}, Y: Field{[10]uint32{0x02262ec5, 0x013e4956, 0x00477c92, 0x017d9ba9, 0x03eb84ca, 0x001ad57d, 0x0366fb7a, 0x007f17e3, 0x017577be, 0x002fbd70}}}, + {X: Field{[10]uint32{0x005cb045, 0x03b5493f, 0x03a3ab97, 0x01f97897, 0x027a8810, 0x010965f1, 0x00801014, 0x036e4d23, 0x01370db1, 0x001463c3}}, Y: Field{[10]uint32{0x014d7294, 0x0280e5da, 0x037418db, 0x03d37e2a, 0x006eb9f3, 0x0125d094, 0x03113a14, 0x03b4059b, 0x010ea4e9, 0x00372a1d}}}, + {X: Field{[10]uint32{0x030554c7, 0x031c975b, 0x0128e9a9, 0x02ea1e66, 0x0057bf54, 0x03087d89, 0x029893f8, 0x01d284af, 0x02b6c507, 0x0002f523}}, Y: Field{[10]uint32{0x0170f6e1, 0x03e9e1fd, 0x002d2e2c, 0x01418c9d, 0x00dd58f3, 0x01da7dce, 0x034bad90, 0x000c019d, 0x01a8cd8f, 0x0008029b}}}, + {X: Field{[10]uint32{0x031517e2, 0x02678d36, 0x031302aa, 0x01178f02, 0x00800c5b, 0x0193e870, 0x0336622b, 0x01a78da4, 0x013a8711, 0x00333236}}, Y: Field{[10]uint32{0x0101d845, 0x03f5b0db, 0x0305611e, 0x00252027, 0x00888373, 0x0115219a, 0x0211f1bc, 0x0191e3be, 0x03e4d45e, 0x000103b9}}}, + {X: Field{[10]uint32{0x03f6bd1a, 0x0149fc76, 0x03dab8f4, 0x00703f09, 0x0327e8d0, 0x01efa7a9, 0x01d2e9a2, 0x01e648c4, 0x012c7587, 0x0021bd8e}}, Y: Field{[10]uint32{0x010f7922, 0x02bcd340, 0x02dd3e7c, 0x0063f51a, 0x00571505, 0x0127b9a4, 0x02b1304c, 0x02a8a8f4, 0x0211b647, 0x001fb8a5}}}, + {X: Field{[10]uint32{0x03d7fdfd, 0x010760ed, 0x01c1bbfc, 0x0205b687, 0x019bb5a3, 0x00e1d47e, 0x03941053, 0x003e9b0d, 0x00e5927b, 0x00380d3d}}, Y: Field{[10]uint32{0x01a5f89d, 0x01239d50, 0x03b6ff22, 0x01eec9e7, 0x01e90256, 0x02fb72ae, 0x0282b05c, 0x010b904c, 0x02cb8382, 0x003727c0}}}, + {X: Field{[10]uint32{0x02b51045, 0x02d2731a, 0x01062837, 0x03bee1b8, 0x0075eadf, 0x02e09544, 0x023a66a0, 0x02fc017b, 0x02160a9d, 0x0023f0da}}, Y: Field{[10]uint32{0x03d200a6, 0x02526648, 0x0374a705, 0x009e7b27, 0x0266a885, 0x0001292f, 0x03d9957a, 0x02607485, 0x00409605, 0x0031fb8b}}}, + {X: Field{[10]uint32{0x033278e0, 0x002b7239, 0x0112d9c1, 0x037ad45f, 0x03997130, 0x019773f8, 0x0089b71e, 0x01f65b59, 0x00bc5407, 0x0035eed0}}, Y: Field{[10]uint32{0x028b0a4b, 0x0241d2a9, 0x01b468ce, 0x02f8ea2a, 0x025897c0, 0x025ad72d, 0x020706bd, 0x02eb916a, 0x03662f64, 0x00388258}}}, + {X: Field{[10]uint32{0x03bd2ac5, 0x0382a218, 0x007e0b8b, 0x020455ec, 0x003c8826, 0x00997390, 0x007d2d6c, 0x031c5045, 0x02858054, 0x0035cd5d}}, Y: Field{[10]uint32{0x01a9932b, 0x00baf961, 0x019c24f4, 0x0294e031, 0x01d2ce03, 0x03356013, 0x014099e9, 0x0108e709, 0x014b2fc9, 0x00253e1d}}}, + {X: Field{[10]uint32{0x018f8392, 0x02b836a1, 0x002b6669, 0x03f595f7, 0x013e720f, 0x034ff859, 0x01a7e99b, 0x00ffe9c7, 0x02aed935, 0x0016dbe2}}, Y: Field{[10]uint32{0x018f9089, 0x013d1cd0, 0x03c106e7, 0x0100c094, 0x03e49668, 0x0138917c, 0x02f85ec3, 0x01bbb7e9, 0x0105369c, 0x0013babf}}}, + {X: Field{[10]uint32{0x02222000, 0x01cb1390, 0x03b39f7b, 0x02806683, 0x02ab4076, 0x0313d221, 0x004b4f49, 0x00a7900e, 0x011267cc, 0x000e5113}}, Y: Field{[10]uint32{0x0283d771, 0x02806872, 0x010ba50e, 0x015c6ddf, 0x01329f30, 0x014e23ae, 0x0248adf3, 0x03b8b637, 0x002aaf90, 0x00197094}}}, + {X: Field{[10]uint32{0x030752c7, 0x021222c6, 0x010030a1, 0x02573b0b, 0x0216ebad, 0x02f26223, 0x019c4a7d, 0x02c28f05, 0x00dbf1ef, 0x0014f780}}, Y: Field{[10]uint32{0x01e2fbda, 0x0158c881, 0x026d33a5, 0x01993452, 0x0287dc61, 0x039ef146, 0x02d62285, 0x0177e9d4, 0x03d99947, 0x000ca3b2}}}, + {X: Field{[10]uint32{0x015ead39, 0x0052932f, 0x019e3d48, 0x033bad23, 0x03194d1b, 0x017ed80c, 0x000eef0d, 0x01c84f8a, 0x03af9b4f, 0x0001228e}}, Y: Field{[10]uint32{0x00334186, 0x026a2eca, 0x029ce709, 0x03b512a6, 0x037e749e, 0x03252c83, 0x006f7fbc, 0x00e14aef, 0x01c9e04a, 0x000ed2b2}}}, + {X: Field{[10]uint32{0x033ac541, 0x011c1f96, 0x02b6eb52, 0x001be85b, 0x03acccf4, 0x009f88b5, 0x00182370, 0x0073b4f1, 0x0230503c, 0x003c035d}}, Y: Field{[10]uint32{0x01ca95b5, 0x015c6dcc, 0x00404f47, 0x03ff6df4, 0x03c9e2bc, 0x03e3b564, 0x0254605d, 0x01d89ac4, 0x013fec17, 0x00268777}}}, + {X: Field{[10]uint32{0x0141eaac, 0x02099622, 0x01ee89a4, 0x03210205, 0x00c4f8ee, 0x03a30868, 0x01708582, 0x03ad6439, 0x01943ce7, 0x00387fc6}}, Y: Field{[10]uint32{0x03353b7e, 0x02d25cb5, 0x003dd003, 0x00faf0db, 0x01dbf27e, 0x022a95fa, 0x021b53d7, 0x01cb9b39, 0x0172746e, 0x0014a395}}}, + {X: Field{[10]uint32{0x0059bd49, 0x00afbc1d, 0x02c55256, 0x00116456, 0x0223b3aa, 0x01d709ef, 0x015a6652, 0x01d43838, 0x0020c48e, 0x00393c4f}}, Y: Field{[10]uint32{0x0287ca30, 0x008731db, 0x01ebca2d, 0x014cd8aa, 0x03639010, 0x01ec6eec, 0x026b9d6a, 0x007e668b, 0x02cec6e5, 0x002faf1f}}}, + {X: Field{[10]uint32{0x006f5f20, 0x035720e2, 0x03ea4d2d, 0x0012b1a4, 0x01598c6c, 0x0033c9c6, 0x003d3716, 0x019ba1c2, 0x00f3824b, 0x0038dba3}}, Y: Field{[10]uint32{0x0086c60b, 0x03432f68, 0x009f6c88, 0x03a193c9, 0x00f5be9f, 0x02069537, 0x03749104, 0x015f7cf6, 0x01938afe, 0x0013a838}}}, + {X: Field{[10]uint32{0x0246365f, 0x03478349, 0x0172a63d, 0x0373f7a5, 0x03797ff5, 0x0135f151, 0x00b4a068, 0x034beca7, 0x03193286, 0x0014787c}}, Y: Field{[10]uint32{0x02370e3a, 0x00b321d4, 0x01cb2ace, 0x03b6e519, 0x03b8640c, 0x03130f50, 0x0290d7e6, 0x03b318c6, 0x023c6f30, 0x002b11c3}}}, + {X: Field{[10]uint32{0x01a5fae0, 0x033de735, 0x0224829b, 0x01055b4a, 0x0022277f, 0x016f09b7, 0x01dadd64, 0x0139c981, 0x02a9c40d, 0x0023a0b6}}, Y: Field{[10]uint32{0x027c53ee, 0x03666e05, 0x024d733a, 0x0078ca84, 0x03b01b96, 0x00cf8a46, 0x0191dd72, 0x015ec8ac, 0x01fdbe90, 0x001fe055}}}, + {X: Field{[10]uint32{0x022c41e3, 0x006cd64f, 0x02595988, 0x01d1938a, 0x0038bea6, 0x0097e9e2, 0x03fd5e95, 0x01ea90d3, 0x0344273c, 0x001e7959}}, Y: Field{[10]uint32{0x0385ecab, 0x01b9f2fc, 0x03c33e80, 0x0083c9e2, 0x03eb786a, 0x011c48b5, 0x00ec764b, 0x03bee7c0, 0x01a3c50d, 0x00189422}}}, + {X: Field{[10]uint32{0x02743f79, 0x03b4fd98, 0x0206879d, 0x015bcbc7, 0x02af7fe1, 0x01389288, 0x01eb8918, 0x00655d47, 0x00e2d19c, 0x002a5f80}}, Y: Field{[10]uint32{0x018284a0, 0x029425f3, 0x03282944, 0x0177a9ce, 0x02f3f583, 0x0113fe47, 0x00726bbc, 0x00b124d5, 0x02bd8bcb, 0x0022075f}}}, + {X: Field{[10]uint32{0x03338542, 0x01c1c9c2, 0x00aa8f4a, 0x02fa3ece, 0x009bc52f, 0x001508de, 0x021c3fb4, 0x03d70c53, 0x014607bb, 0x000efc41}}, Y: Field{[10]uint32{0x024f6367, 0x010b1900, 0x022b6390, 0x01479611, 0x019a87ba, 0x03e10381, 0x0068e5fe, 0x02dffdb7, 0x006cfad5, 0x0039e256}}}, + {X: Field{[10]uint32{0x01d9cc5d, 0x012202d5, 0x03b2e01f, 0x033e10df, 0x0249cce0, 0x033cd01a, 0x034ee87e, 0x0077fce6, 0x00775879, 0x00200a5b}}, Y: Field{[10]uint32{0x00152dcb, 0x031376e4, 0x01284846, 0x00d2f6c2, 0x00902e48, 0x0022f145, 0x028753b7, 0x01e07f38, 0x02113c7f, 0x000ec1af}}}, + {X: Field{[10]uint32{0x00ba52fe, 0x02594188, 0x03023598, 0x013a1f95, 0x01b7b0fe, 0x016713fc, 0x029cc123, 0x036ff7da, 0x037aa3ee, 0x001238b2}}, Y: Field{[10]uint32{0x02e8ed1b, 0x01592c27, 0x00aac7ad, 0x00c4f3fd, 0x00a0a456, 0x01fdcbb8, 0x00411ba8, 0x026ef165, 0x017afa90, 0x00371e10}}}, + {X: Field{[10]uint32{0x03403d46, 0x02016a5c, 0x00b6b7b4, 0x00ba65cc, 0x0031a3db, 0x0061f5e7, 0x02b482aa, 0x015220a1, 0x011fcb77, 0x0037244d}}, Y: Field{[10]uint32{0x03adb1a3, 0x00ffe5bd, 0x01b2ffa9, 0x01713942, 0x03fc52e3, 0x03827e97, 0x0180ecd5, 0x0064ba30, 0x020d2d13, 0x003b5c83}}}, + {X: Field{[10]uint32{0x0190a670, 0x025cc67a, 0x02b9f017, 0x014d6c14, 0x013a2b26, 0x03ecd13a, 0x0105b151, 0x02d3ea73, 0x013948ce, 0x00174df0}}, Y: Field{[10]uint32{0x0174cb01, 0x01b54e86, 0x0348a185, 0x0349f279, 0x00b62e16, 0x02e5018d, 0x02832ad6, 0x02e9201e, 0x033c2590, 0x003de424}}}, + {X: Field{[10]uint32{0x03070aa2, 0x03b285dd, 0x00157708, 0x0096b67a, 0x0015c8e3, 0x02a123fd, 0x017eece0, 0x026c89bf, 0x02b0f8d6, 0x00262f2e}}, Y: Field{[10]uint32{0x02150212, 0x0379637a, 0x002060e2, 0x01266ec4, 0x03a08aa9, 0x008629fb, 0x02ffd615, 0x01521f9a, 0x03b3db71, 0x001d9c78}}}, + {X: Field{[10]uint32{0x0335b1c5, 0x0170448f, 0x03a188fa, 0x02340891, 0x0012ce30, 0x01640cd0, 0x0194384d, 0x0121bbe9, 0x01cb3de9, 0x001838b0}}, Y: Field{[10]uint32{0x0369d1bb, 0x010bcbe4, 0x008fa639, 0x021ada38, 0x024d58d0, 0x014efdc8, 0x03c11a38, 0x0319bd70, 0x031b9767, 0x001b79c0}}}, + {X: Field{[10]uint32{0x004885c7, 0x00fa9c8c, 0x03467d87, 0x02ecca7a, 0x01aaf513, 0x038be6f3, 0x03f2f702, 0x015add42, 0x02c5aa82, 0x002051c5}}, Y: Field{[10]uint32{0x03d297ee, 0x00290b71, 0x00b58630, 0x0324283f, 0x01eb7efa, 0x00d4cf7a, 0x03ba31e2, 0x0186244f, 0x00ee8fa9, 0x003b2991}}}, + {X: Field{[10]uint32{0x02f8de77, 0x024d3edc, 0x00e3be6d, 0x0218803a, 0x019fb715, 0x00d9a1b5, 0x0360f7b6, 0x004bbc2b, 0x033f1db4, 0x00095e27}}, Y: Field{[10]uint32{0x007de0ac, 0x0320c08b, 0x00ce9633, 0x00ee3163, 0x02863bc0, 0x022069a1, 0x034a6f77, 0x03886d5c, 0x039899d1, 0x00394889}}}, + {X: Field{[10]uint32{0x00f1bdcd, 0x02337ca8, 0x01527ef1, 0x0079e028, 0x0227f2a9, 0x00ff2da9, 0x02a87fdf, 0x03e39591, 0x000c98bf, 0x0014e0bd}}, Y: Field{[10]uint32{0x0232b502, 0x03a17192, 0x0079d9a1, 0x0360e31e, 0x0239c027, 0x02765e85, 0x0068ce13, 0x028e8768, 0x01dee41c, 0x0008c740}}}, + {X: Field{[10]uint32{0x011d1f2b, 0x00c8e2e8, 0x01dc6e57, 0x02cfc63a, 0x0167d9ec, 0x03d5f740, 0x02ab14d8, 0x03eb7ff2, 0x01209db2, 0x0011233f}}, Y: Field{[10]uint32{0x0166fea6, 0x0070c564, 0x005875a1, 0x019c2548, 0x032ba1bb, 0x0134a092, 0x01e8d181, 0x015b090d, 0x02e55a4f, 0x002eb638}}}, + {X: Field{[10]uint32{0x02e5653d, 0x02befa00, 0x02ab5667, 0x00f7ad84, 0x01f6c489, 0x01112efe, 0x012b69d5, 0x00cd7d40, 0x024b0fe6, 0x003645f2}}, Y: Field{[10]uint32{0x032bad17, 0x0216ebbc, 0x0033a4bb, 0x0154c40b, 0x00aeabc0, 0x005f397c, 0x0150f1ff, 0x025d589e, 0x024be6a4, 0x000ff7a6}}}, + {X: Field{[10]uint32{0x01ba8f72, 0x017c93a4, 0x00570db3, 0x0398293a, 0x031dd974, 0x038fbd60, 0x03de053b, 0x020eb5cc, 0x01f517a8, 0x00031fba}}, Y: Field{[10]uint32{0x039bba44, 0x03f41881, 0x01f3a2bf, 0x0134b7ce, 0x02e06a7e, 0x01a82338, 0x03d2a31c, 0x019efd95, 0x038d26d3, 0x00236ddc}}}, + {X: Field{[10]uint32{0x00d9a30b, 0x00217825, 0x00aed0b7, 0x02e28cab, 0x00819a77, 0x01f210ef, 0x022b1737, 0x035b781e, 0x019d983e, 0x0020fc28}}, Y: Field{[10]uint32{0x00afe6a7, 0x03d21d4b, 0x00e00c37, 0x011db55d, 0x00880acd, 0x0044ef98, 0x0348b636, 0x0111cf61, 0x029667be, 0x0034aacf}}}, + {X: Field{[10]uint32{0x0313989d, 0x02649dc8, 0x02f2e2b2, 0x01e41f14, 0x01596740, 0x01d360f7, 0x03b56bde, 0x01f10263, 0x026a6168, 0x003cfe2a}}, Y: Field{[10]uint32{0x01a109fb, 0x00e653d0, 0x03a21ad6, 0x0130da15, 0x00caa1b5, 0x02258d97, 0x0201ff9a, 0x000e8cb4, 0x009d0985, 0x000e9a43}}}, + {X: Field{[10]uint32{0x0032249e, 0x03b87fd4, 0x0316a283, 0x01010e11, 0x03914fdd, 0x03af2d39, 0x01d6e8b3, 0x035b1f65, 0x01caa30b, 0x00130684}}, Y: Field{[10]uint32{0x01424da0, 0x0394856e, 0x028809b7, 0x01f0dfe0, 0x006598f1, 0x0194ce74, 0x014c604e, 0x03bd0348, 0x00c94653, 0x0039f9c6}}}, + {X: Field{[10]uint32{0x02e5477d, 0x008b064f, 0x00f6c1d9, 0x03216872, 0x02529ebb, 0x0083cc60, 0x033bdb04, 0x0280614f, 0x01523419, 0x000a506e}}, Y: Field{[10]uint32{0x02628413, 0x00e4b74f, 0x02763864, 0x01442260, 0x0280482b, 0x03db07b7, 0x0205baa7, 0x019a82aa, 0x026c29ca, 0x000ddfc8}}}, + {X: Field{[10]uint32{0x0191a6a1, 0x00858761, 0x032c3384, 0x03bf8615, 0x004b5f25, 0x031c1e2b, 0x03b3eb18, 0x026be196, 0x0107aad4, 0x00027413}}, Y: Field{[10]uint32{0x0083cd34, 0x004ae88b, 0x03724f85, 0x03287523, 0x02779eb0, 0x0065912d, 0x01ae02d1, 0x02a27ed1, 0x028dec2c, 0x003d5ca5}}}, + {X: Field{[10]uint32{0x03d26e20, 0x011ac190, 0x03ef4a26, 0x01405def, 0x000d660c, 0x02988a09, 0x01a983c9, 0x028406e6, 0x0367c3c3, 0x0011007d}}, Y: Field{[10]uint32{0x02d4e342, 0x019a77a1, 0x00c0bb7d, 0x037bba60, 0x02999f8b, 0x03419a79, 0x00293091, 0x00453859, 0x02f78e1b, 0x001e54be}}}, + {X: Field{[10]uint32{0x03bba31f, 0x02dfc306, 0x03fa68d7, 0x0311eca0, 0x000ab8a1, 0x033218ea, 0x028665ba, 0x005f4ecc, 0x0027fc40, 0x00252dbd}}, Y: Field{[10]uint32{0x0340d85a, 0x028085f7, 0x01868e09, 0x0096a660, 0x019cbe77, 0x027741ea, 0x008199e9, 0x034b51bb, 0x027d35f0, 0x0004cd81}}}, + {X: Field{[10]uint32{0x01e7288f, 0x026d2893, 0x01445738, 0x027e4809, 0x03f2fba5, 0x039d55d2, 0x03b87cdd, 0x026ef518, 0x03a292c7, 0x00105886}}, Y: Field{[10]uint32{0x02cd3188, 0x0328b868, 0x0111b717, 0x001eca53, 0x033bc70a, 0x0399ee50, 0x0389951f, 0x002de204, 0x03d5b6f3, 0x000d54cd}}}, + {X: Field{[10]uint32{0x01a3594e, 0x030e67bf, 0x0173fc33, 0x02eaac53, 0x038a9b27, 0x0049a062, 0x0100dde6, 0x03074d56, 0x00156256, 0x002c20e1}}, Y: Field{[10]uint32{0x01a954a5, 0x01a11d71, 0x02c7dc5d, 0x034541a7, 0x03843ef8, 0x01a90a17, 0x00c5371b, 0x018b8a47, 0x019055b1, 0x000aabe4}}}, + {X: Field{[10]uint32{0x000dc9bd, 0x0249d19b, 0x008fb8ba, 0x004c3a11, 0x027d910f, 0x03330509, 0x029f4377, 0x023fa977, 0x014fef41, 0x00332668}}, Y: Field{[10]uint32{0x00536f28, 0x02baedc6, 0x017f5c77, 0x0364b3ff, 0x0222f7b3, 0x030326fc, 0x02f164ba, 0x0304b750, 0x03647c01, 0x0000b8c2}}}, + {X: Field{[10]uint32{0x01764e37, 0x01083741, 0x01d50a2f, 0x02d6e59f, 0x027b21d6, 0x03601763, 0x025d59c1, 0x00616355, 0x024adbec, 0x00234aec}}, Y: Field{[10]uint32{0x019f712f, 0x0052fe26, 0x005efe70, 0x0035a959, 0x02fc371d, 0x022824c8, 0x02537c70, 0x02bae9c4, 0x0330e78d, 0x003371b5}}}, + {X: Field{[10]uint32{0x010f7c9b, 0x008ce8f9, 0x0219203b, 0x01bc9d08, 0x00dbb94c, 0x01d438ca, 0x00a18717, 0x033d2b9b, 0x02de0f18, 0x0018f3b9}}, Y: Field{[10]uint32{0x02fdfeb8, 0x00d05cc7, 0x014367ca, 0x00c784d9, 0x00ce0050, 0x02a2160a, 0x0231b8f7, 0x008ce86d, 0x01adad2d, 0x002048c3}}}, + {X: Field{[10]uint32{0x02755a0c, 0x029679a4, 0x02114926, 0x01fee3d1, 0x02b2e4d0, 0x02e86776, 0x028d5cbf, 0x03740e69, 0x029c1dc6, 0x00188213}}, Y: Field{[10]uint32{0x01061a26, 0x03662dc1, 0x0302cc4b, 0x006bef37, 0x02cc9c7f, 0x02a09f82, 0x01c273aa, 0x006bc003, 0x00f462fb, 0x001b6fad}}}, + {X: Field{[10]uint32{0x018dd827, 0x01cd8957, 0x01238c27, 0x00ddf7de, 0x003f34a9, 0x01c1cab3, 0x02368ec1, 0x018a0053, 0x02baf65b, 0x00044303}}, Y: Field{[10]uint32{0x02e75c6d, 0x03fe16ca, 0x02ba9649, 0x01d0b6be, 0x030c3c3e, 0x00082e0e, 0x01d5865b, 0x01896258, 0x03166f23, 0x000692e9}}}, + {X: Field{[10]uint32{0x01c87e00, 0x01f279bc, 0x012b6892, 0x01748f34, 0x01baa50a, 0x02ae5d01, 0x007306cf, 0x008d2ea0, 0x011e50fb, 0x00361229}}, Y: Field{[10]uint32{0x016a4fd8, 0x01cadbea, 0x02adc16a, 0x027cf2de, 0x0151fdb4, 0x0265127b, 0x02e4b1cc, 0x00032132, 0x026288fb, 0x00276e6f}}}, + {X: Field{[10]uint32{0x014c2b5a, 0x03269f38, 0x0002396b, 0x0181606c, 0x02a8cf26, 0x02406e7b, 0x0147f3b3, 0x01aad149, 0x0093a270, 0x00108c46}}, Y: Field{[10]uint32{0x024165bc, 0x034f4b2b, 0x00d70daa, 0x0073a7bd, 0x03d6129a, 0x01d82691, 0x01c2a9f7, 0x0088b066, 0x02db9ba6, 0x001d43e1}}}, + {X: Field{[10]uint32{0x0034d37f, 0x02bb038e, 0x037419fd, 0x00797c5f, 0x026b252f, 0x01f2878c, 0x03454967, 0x037104cb, 0x00ee471a, 0x00110e71}}, Y: Field{[10]uint32{0x01897e87, 0x0003b95d, 0x0119581a, 0x0196ce16, 0x03617c95, 0x03e1be4e, 0x0316ab66, 0x030f798b, 0x032c22c5, 0x002f5d70}}}, + {X: Field{[10]uint32{0x0113b053, 0x02b2bfb0, 0x03bbf36b, 0x01e6601b, 0x02e02e9e, 0x0314bf6d, 0x00b0bbd8, 0x00c76992, 0x03dab192, 0x00137f38}}, Y: Field{[10]uint32{0x03042c3a, 0x01168a84, 0x0342f69d, 0x01650bfa, 0x029d647c, 0x011f3068, 0x00a1c3e1, 0x01fee910, 0x031f4b72, 0x0037a317}}}, + {X: Field{[10]uint32{0x0117dc9d, 0x03bfe6e0, 0x009efcdd, 0x03cfb1b6, 0x009d0ba6, 0x0207db05, 0x00f91582, 0x009cdbd5, 0x032ee8e7, 0x000eee8a}}, Y: Field{[10]uint32{0x0216ab24, 0x02428c36, 0x00d2baf6, 0x021a9a98, 0x036f9a21, 0x02bdb283, 0x0293f947, 0x01f95b97, 0x02747789, 0x003fc21c}}}, + {X: Field{[10]uint32{0x0317deae, 0x01f59f60, 0x0059527f, 0x003d3eec, 0x00e239a0, 0x03d56ac3, 0x02d92ff0, 0x031ac920, 0x0243037b, 0x0028bfb7}}, Y: Field{[10]uint32{0x01869ed4, 0x00d8e351, 0x012da98c, 0x0058bc61, 0x000f7801, 0x0033808b, 0x008e195d, 0x03ff5fbc, 0x010843be, 0x000a9e45}}}, + {X: Field{[10]uint32{0x004bc0a3, 0x00730f8c, 0x021852cb, 0x002610c2, 0x01b3d64d, 0x01cdc021, 0x01aa8e67, 0x03ad3128, 0x022ff503, 0x00088713}}, Y: Field{[10]uint32{0x01b7ae41, 0x00477465, 0x02de199e, 0x00a52898, 0x01a70a79, 0x034fe1d9, 0x024fd70a, 0x0139e704, 0x031b0f95, 0x0030f0de}}}, + {X: Field{[10]uint32{0x00740ed0, 0x03bcf145, 0x00bfca58, 0x02f55679, 0x02f909c8, 0x026e44c1, 0x02f945b4, 0x02e81432, 0x0380f7e4, 0x002830cb}}, Y: Field{[10]uint32{0x02f9562a, 0x0286244d, 0x02c9041b, 0x0318e290, 0x01966aa1, 0x033b5172, 0x01e4cfbd, 0x011c0107, 0x030146ab, 0x0034fae3}}}, + {X: Field{[10]uint32{0x00da85c6, 0x01e6f906, 0x02aa1dff, 0x02573258, 0x010bf333, 0x01dd0204, 0x01e1ca75, 0x0189fc00, 0x0218b4fe, 0x001d8b9e}}, Y: Field{[10]uint32{0x00f51ec5, 0x024c8d31, 0x02b93dce, 0x02552bd5, 0x025875f7, 0x01156e10, 0x00a743c3, 0x00703d3e, 0x03465046, 0x002837c3}}}, + {X: Field{[10]uint32{0x013a29f0, 0x018cb12e, 0x03561b8d, 0x00d0451b, 0x0378389f, 0x010cdec7, 0x02cfbe40, 0x032bcf55, 0x0135cd95, 0x000bc0b6}}, Y: Field{[10]uint32{0x00f44569, 0x013a49c6, 0x0287b0e7, 0x010704bf, 0x0209c454, 0x008fc68c, 0x0008872b, 0x0242d3e0, 0x00d823f1, 0x0005cd1c}}}, + {X: Field{[10]uint32{0x03eab212, 0x0398e4b9, 0x01612314, 0x01b893bc, 0x01c5877d, 0x03f2628e, 0x01adbd59, 0x005b7c71, 0x03d72eb8, 0x00327e1d}}, Y: Field{[10]uint32{0x02067c4c, 0x0216391a, 0x03ad10b0, 0x0149d52c, 0x0188bb00, 0x03f2aa7d, 0x01a52b58, 0x01fbb169, 0x011788cf, 0x000533a6}}}, + {X: Field{[10]uint32{0x00baa172, 0x03485e68, 0x005df239, 0x008eb9db, 0x02d6dd1c, 0x032fd743, 0x03296df6, 0x0172de9b, 0x036918a0, 0x0033137f}}, Y: Field{[10]uint32{0x014a4dc6, 0x01a51219, 0x00cd5b78, 0x02ead4e4, 0x02e4dda0, 0x018ed295, 0x01b06506, 0x005d4098, 0x00b1b847, 0x0007350e}}}, + {X: Field{[10]uint32{0x03cbfaa1, 0x03b20a3b, 0x02a5bccc, 0x02299591, 0x01ca015a, 0x01e2b354, 0x0010219a, 0x01c4e8a7, 0x034b3ed2, 0x003eaab1}}, Y: Field{[10]uint32{0x0130d934, 0x03d9869f, 0x00ecbf8b, 0x03244fef, 0x01b2e74c, 0x03f9e552, 0x025c46b7, 0x03b036f5, 0x003bdcc2, 0x002b72b5}}}, + {X: Field{[10]uint32{0x00fdbf46, 0x02bbf111, 0x02480dd0, 0x03c8f468, 0x028a0025, 0x016f9b03, 0x01444b73, 0x026f4368, 0x02c930fa, 0x0005c4d5}}, Y: Field{[10]uint32{0x009bce3f, 0x00526ee7, 0x0214eb2e, 0x0134bb8a, 0x0062e246, 0x008e6395, 0x004361ed, 0x03ee76ad, 0x02dc991e, 0x001dc3a7}}}, + {X: Field{[10]uint32{0x01680214, 0x00401ef9, 0x01b43b64, 0x01e81ea0, 0x01c05501, 0x017e7ec6, 0x01491af5, 0x00dd8f4b, 0x016ae047, 0x00024cfd}}, Y: Field{[10]uint32{0x00ea76ad, 0x02a72ae8, 0x02ba9f85, 0x03fe4ec7, 0x01ad1d70, 0x01253950, 0x01ea647f, 0x036d8d20, 0x0047481c, 0x00198167}}}, + {X: Field{[10]uint32{0x03bb6b34, 0x0307f816, 0x02cf664a, 0x01d87b06, 0x018a397f, 0x02f27272, 0x02446910, 0x02b4df5f, 0x0322b182, 0x00028c03}}, Y: Field{[10]uint32{0x0033593d, 0x00aead15, 0x035007b4, 0x011188a2, 0x01684abe, 0x01c8bc85, 0x00de2694, 0x01d2e518, 0x03fca909, 0x002f5bcb}}}, + {X: Field{[10]uint32{0x038fe1ea, 0x01b8fb2b, 0x03fd685d, 0x02d54a38, 0x00878b79, 0x03b9358c, 0x03c1d62d, 0x004d57e5, 0x03ed6e90, 0x003f1795}}, Y: Field{[10]uint32{0x035bab01, 0x02a6cacb, 0x01d498c4, 0x0124d172, 0x02bc7c85, 0x02141efb, 0x018b1b56, 0x032ee796, 0x027a6c21, 0x00044884}}}, + {X: Field{[10]uint32{0x0231ef3d, 0x0114bed4, 0x00bfff3f, 0x015ba8d0, 0x030899e9, 0x02406548, 0x00721c19, 0x02047ef5, 0x00e27a64, 0x00168bd0}}, Y: Field{[10]uint32{0x0093d547, 0x0048b4c8, 0x0086c20a, 0x00e989e6, 0x01d8c4a5, 0x0275c70c, 0x0206d263, 0x0231e5d2, 0x015d1257, 0x001acafe}}}, + {X: Field{[10]uint32{0x00f2084f, 0x005e6d59, 0x033106f9, 0x01f63747, 0x02fb1575, 0x01f5fbd8, 0x036610d6, 0x026716f9, 0x0333df0b, 0x00165e0c}}, Y: Field{[10]uint32{0x025b7f5a, 0x01d9a51f, 0x00c4fa76, 0x025f0d3d, 0x037d309d, 0x029d60fa, 0x03f4623b, 0x005c3204, 0x0280dd3d, 0x003caa7a}}}, + {X: Field{[10]uint32{0x03672d95, 0x01b6c7cd, 0x00a08154, 0x035d329f, 0x01a1c8be, 0x01e8a70b, 0x0372bb38, 0x00ff21cf, 0x01246b51, 0x00033d84}}, Y: Field{[10]uint32{0x038c70ee, 0x03deaf0b, 0x007873ef, 0x03d0b81f, 0x021e182c, 0x0187ec3f, 0x011d1a56, 0x00110e7b, 0x0076697f, 0x00348f0f}}}, + {X: Field{[10]uint32{0x03fe7d52, 0x012c5ccb, 0x017baac1, 0x032581a5, 0x031cb871, 0x0018fe3a, 0x02eb7eb8, 0x00520389, 0x0305133a, 0x003b7453}}, Y: Field{[10]uint32{0x00b1b70a, 0x017e358d, 0x0392a61b, 0x00203291, 0x02ee6033, 0x011709d3, 0x01b3aa84, 0x0354a130, 0x0280d295, 0x0035a0bc}}}, + {X: Field{[10]uint32{0x001a1713, 0x036571ff, 0x000d175f, 0x00c2977a, 0x0033cb8d, 0x0325649b, 0x026e7902, 0x022bce2c, 0x00e90cdc, 0x003e6c3f}}, Y: Field{[10]uint32{0x02a3e6ac, 0x0148903c, 0x022b5d47, 0x022f5bf3, 0x01df958b, 0x0233d2a2, 0x01083cdc, 0x018f5c60, 0x01f6f3d1, 0x003b1fa3}}}, + {X: Field{[10]uint32{0x0346a3b7, 0x02ff4905, 0x014e4e46, 0x0057c1c2, 0x02d9ea43, 0x0105f159, 0x03069817, 0x01fd5e24, 0x01995418, 0x002ba419}}, Y: Field{[10]uint32{0x031a129b, 0x01515fc8, 0x01b10677, 0x01cc16f9, 0x01173355, 0x02811c27, 0x01006ff2, 0x00cc4fa7, 0x01adc09d, 0x0008906f}}}, + {X: Field{[10]uint32{0x03d956e9, 0x02cd4391, 0x03540c54, 0x03cd1041, 0x03f68fe9, 0x01606b8e, 0x02134cde, 0x00bdefd7, 0x00007649, 0x00157c3e}}, Y: Field{[10]uint32{0x033956ff, 0x029232f0, 0x00b982c8, 0x02d71c33, 0x01e258dc, 0x017fa60d, 0x03b4b8a3, 0x0222877e, 0x011de684, 0x0008a822}}}, + {X: Field{[10]uint32{0x01663bbb, 0x00665306, 0x010c1b87, 0x03131147, 0x006cb7e3, 0x03e1991f, 0x0123bb1d, 0x010388c6, 0x030686fb, 0x0024322a}}, Y: Field{[10]uint32{0x00c80ab4, 0x01ef8fff, 0x02463e3b, 0x00625323, 0x01cb30d7, 0x03105e5e, 0x03bb2c50, 0x03acb71b, 0x00d9570e, 0x00371d23}}}, + {X: Field{[10]uint32{0x00a4c694, 0x00b89f21, 0x02b604bb, 0x01aeb027, 0x013e476d, 0x01baa127, 0x0268e735, 0x03aee7ec, 0x002d6b21, 0x0032fd1f}}, Y: Field{[10]uint32{0x02bb2873, 0x021bee9e, 0x001cf16e, 0x037f6ac2, 0x01416ed9, 0x01658908, 0x02bf8bbe, 0x022528e6, 0x03e68042, 0x003c0a23}}}, + {X: Field{[10]uint32{0x0111fe80, 0x027f3a5f, 0x03b1637e, 0x02c91950, 0x00d8f1bf, 0x005235ce, 0x03ff7582, 0x01a2c823, 0x005fc18b, 0x001f0c22}}, Y: Field{[10]uint32{0x00013f2f, 0x01471d8f, 0x0221c7ea, 0x006298f9, 0x0052c067, 0x03221b84, 0x02c6d378, 0x007056c9, 0x00b931a1, 0x000f8b47}}}, + {X: Field{[10]uint32{0x026d7753, 0x0050cefd, 0x033e64f1, 0x01c8dfcc, 0x03e137c7, 0x03a481f6, 0x02a9da9d, 0x032e8374, 0x01190d1b, 0x002b5852}}, Y: Field{[10]uint32{0x0239753d, 0x027807b4, 0x03d0baad, 0x035c3b14, 0x00190b72, 0x02e9d66d, 0x02046192, 0x02862275, 0x018b3512, 0x003f2ba8}}}, + {X: Field{[10]uint32{0x025e29a2, 0x01729f13, 0x01715a29, 0x01c68e4e, 0x00a7bc41, 0x03b4cd6d, 0x02b50a81, 0x027055c2, 0x001baf8c, 0x00237dc1}}, Y: Field{[10]uint32{0x01ce02e7, 0x0192e92f, 0x01a1399b, 0x030e1286, 0x00e12eab, 0x01f771b7, 0x0166b24c, 0x01ef77cd, 0x02438267, 0x0003a24b}}}, + {X: Field{[10]uint32{0x00fdadd6, 0x009e010b, 0x00fbf2a1, 0x01ddf762, 0x02217f4e, 0x0306ed7d, 0x0351891a, 0x01483a69, 0x025761c8, 0x0027d307}}, Y: Field{[10]uint32{0x027d0f50, 0x02e583d3, 0x008609d9, 0x018e7cf5, 0x02ed4b69, 0x00f84b1e, 0x035831eb, 0x03a22430, 0x00adc6ce, 0x003f6884}}}, + {X: Field{[10]uint32{0x0115acbf, 0x02332ae9, 0x0147c2ee, 0x0061d496, 0x03174de6, 0x00778c24, 0x013bacf9, 0x01c28b02, 0x00dd23ac, 0x00290dbd}}, Y: Field{[10]uint32{0x0219afb9, 0x015fbfdf, 0x020ec9fe, 0x02cc1f51, 0x005879e8, 0x009ef04a, 0x039a4509, 0x016e6a50, 0x01d92a61, 0x00303a76}}}, + {X: Field{[10]uint32{0x006f1930, 0x037e882e, 0x007d567b, 0x019f1655, 0x0037497c, 0x000e5a57, 0x018627c5, 0x010f645b, 0x01166997, 0x0028e3bb}}, Y: Field{[10]uint32{0x01d9d7fd, 0x03951512, 0x00c18bb0, 0x02c52105, 0x013be89b, 0x03c9b247, 0x035b5fe3, 0x00ed6b26, 0x02d6effc, 0x001b8f8f}}}, + {X: Field{[10]uint32{0x02fbf3d6, 0x0187aeb8, 0x02586833, 0x039623a4, 0x000b6f1d, 0x01ac3c93, 0x03659e33, 0x010e87eb, 0x00d20d40, 0x0017d164}}, Y: Field{[10]uint32{0x015197db, 0x0242f801, 0x00466158, 0x02dc0090, 0x02ccc833, 0x01939ffd, 0x001af117, 0x03bb00fb, 0x0273042c, 0x00094302}}}, + {X: Field{[10]uint32{0x00cf56c0, 0x0147d10d, 0x03c551be, 0x031dcf3a, 0x03d52bea, 0x03dca0a8, 0x02d16ff8, 0x02e401a3, 0x020dc6eb, 0x001d5961}}, Y: Field{[10]uint32{0x02e24c26, 0x01187c2e, 0x01346c32, 0x01ff8078, 0x039b8468, 0x0275fcfa, 0x028ad7de, 0x03516150, 0x00be526e, 0x0012d5bb}}}, + {X: Field{[10]uint32{0x01a9320c, 0x01ed43e5, 0x035dec53, 0x010afa02, 0x02772927, 0x00800e96, 0x03ad50f0, 0x03bc072a, 0x03ce3a56, 0x000f9f1f}}, Y: Field{[10]uint32{0x03dbfaf1, 0x0349c8a4, 0x03914a32, 0x00b31256, 0x01d5dc34, 0x0267ea76, 0x03789045, 0x01c447cd, 0x00b7926e, 0x00263365}}}, + {X: Field{[10]uint32{0x03cda208, 0x001c9d2d, 0x035522eb, 0x003dabd5, 0x032ac91a, 0x031318aa, 0x031aaf5e, 0x033e12af, 0x005714ce, 0x0004c7ad}}, Y: Field{[10]uint32{0x0320839e, 0x03f625f8, 0x0303127b, 0x004d8344, 0x029b017a, 0x02bb156a, 0x0061393f, 0x0098111b, 0x014ff051, 0x002a4ebb}}}, + {X: Field{[10]uint32{0x02a11ec8, 0x037493a8, 0x026f1637, 0x0380b6cf, 0x02a98e68, 0x0312d7d0, 0x008bff69, 0x018f5c0e, 0x0201e469, 0x000dc6f1}}, Y: Field{[10]uint32{0x01f84622, 0x02765292, 0x03dd37b3, 0x03c4ea9a, 0x0121bbc7, 0x006e249a, 0x0385238c, 0x028906a5, 0x02f1932f, 0x0038befb}}}, + {X: Field{[10]uint32{0x02e47d6d, 0x03d41172, 0x002371bc, 0x00d3910c, 0x01b4d459, 0x00b11461, 0x0136bc20, 0x01cfa280, 0x030492ca, 0x0011dc36}}, Y: Field{[10]uint32{0x0141ec22, 0x03bbcd8b, 0x0390af1a, 0x01ed2c75, 0x0399a92f, 0x00877d2f, 0x037e080d, 0x03641aad, 0x008c25b1, 0x00386bdd}}}, + {X: Field{[10]uint32{0x0194bfff, 0x00a04b25, 0x02fe0da8, 0x00d081e1, 0x01e8e2ae, 0x01f38ebd, 0x01dbae16, 0x036d5dd6, 0x02435af5, 0x002cc6a1}}, Y: Field{[10]uint32{0x009aa4a2, 0x010ef8f0, 0x020cf3c7, 0x0341547f, 0x00f5aaab, 0x0216c1a9, 0x02a85a25, 0x03266aa5, 0x025e860d, 0x000de4d0}}}, + {X: Field{[10]uint32{0x013631f4, 0x00b9996f, 0x019bf09b, 0x02f5f472, 0x00a94121, 0x018670dd, 0x01fe6dd1, 0x009407f7, 0x0052084a, 0x003817bb}}, Y: Field{[10]uint32{0x03b8e622, 0x031589bf, 0x01ed4f6c, 0x01ddb49a, 0x014d883d, 0x035d0909, 0x0224ea4b, 0x03e01a66, 0x03172122, 0x00300457}}}, + {X: Field{[10]uint32{0x0173d5c8, 0x0228c94a, 0x0335ce4d, 0x03beffce, 0x03e57810, 0x025f4fd5, 0x0384305d, 0x001f4d16, 0x00840ee4, 0x00395777}}, Y: Field{[10]uint32{0x027ee677, 0x03a24d90, 0x011a1026, 0x01abe833, 0x00abb87a, 0x023aec4f, 0x003e4257, 0x018505f9, 0x03b5b0fa, 0x001c7dde}}}, + {X: Field{[10]uint32{0x02cd788f, 0x03748fb7, 0x01f0ed46, 0x01dbc9aa, 0x021aabbe, 0x014074cf, 0x00bf3ea5, 0x02a6a8a1, 0x02b1a5c8, 0x003b5eda}}, Y: Field{[10]uint32{0x010db63e, 0x00cf8047, 0x030d3772, 0x0363145d, 0x03824027, 0x037f60be, 0x0054a4bc, 0x02988061, 0x035419d1, 0x0008a02e}}}, + {X: Field{[10]uint32{0x0090e79a, 0x0019c520, 0x02001f96, 0x0078893c, 0x01ce5cb7, 0x03353b9a, 0x03a3329a, 0x0362bb84, 0x01fc3da4, 0x003538cc}}, Y: Field{[10]uint32{0x015e10d6, 0x02385619, 0x00c521ae, 0x01441b42, 0x0277821e, 0x01aa2044, 0x00a6b42d, 0x0334c27d, 0x01aa2f63, 0x00225450}}}, + {X: Field{[10]uint32{0x016d4417, 0x022d21e2, 0x03d54d64, 0x02384834, 0x03265471, 0x036054b1, 0x002545ab, 0x007ff99a, 0x020ea8ec, 0x0013c2b6}}, Y: Field{[10]uint32{0x035aa591, 0x03b1fd64, 0x00cd4dc5, 0x01515b22, 0x0320aaff, 0x02a7eebd, 0x035acf55, 0x02ad191f, 0x01ac6026, 0x002980ee}}}, + {X: Field{[10]uint32{0x00fdca84, 0x03ab8f80, 0x031b7543, 0x0015041a, 0x00a884cc, 0x0037dd4a, 0x0086a9d2, 0x03bb893c, 0x0141b08e, 0x0028b44d}}, Y: Field{[10]uint32{0x00803a45, 0x000edfd7, 0x002d1745, 0x00d61780, 0x024bb67c, 0x03f58172, 0x03a52497, 0x01ae4549, 0x0166294d, 0x0016b02c}}}, + {X: Field{[10]uint32{0x01b6c8a4, 0x03a048ed, 0x0008f64f, 0x00880b38, 0x03cbfc47, 0x03ea517f, 0x00887fda, 0x001164ae, 0x0120014a, 0x00013075}}, Y: Field{[10]uint32{0x00ed738d, 0x00f8cd14, 0x026083bb, 0x03d0e542, 0x00ebcebf, 0x00d23bf5, 0x0106597f, 0x0246395f, 0x028017b7, 0x00090f10}}}, + {X: Field{[10]uint32{0x03c54390, 0x025c2a4a, 0x02c551a5, 0x01f7fcca, 0x00fc2f5b, 0x008c172c, 0x035b8e6b, 0x03a6d330, 0x01a67d13, 0x00017e79}}, Y: Field{[10]uint32{0x0395ff6f, 0x02550edc, 0x0276b30d, 0x02dc9bcc, 0x0085eb0c, 0x022fb7c0, 0x005833ce, 0x017df6f1, 0x02379696, 0x001d2021}}}, + {X: Field{[10]uint32{0x00954575, 0x00d2f282, 0x01286985, 0x025cd293, 0x004447c2, 0x0038a6ad, 0x02d28a88, 0x006c5e02, 0x03809538, 0x0035db1b}}, Y: Field{[10]uint32{0x0161b27b, 0x021cc029, 0x0049859c, 0x03c49def, 0x02aa8273, 0x00390a77, 0x02051789, 0x03806984, 0x03f86b30, 0x00112db0}}}, + {X: Field{[10]uint32{0x01df3344, 0x022816f6, 0x00658e7a, 0x0074036b, 0x006ad19f, 0x01619286, 0x03a9eaeb, 0x01d6bdc0, 0x029ff787, 0x001d5ddc}}, Y: Field{[10]uint32{0x030afec9, 0x030fe64b, 0x0134532e, 0x02c4b9c1, 0x033fa7c5, 0x0239fb3c, 0x012f8229, 0x02a94e4b, 0x0116ccea, 0x001ad466}}}, + {X: Field{[10]uint32{0x02dc17db, 0x0245b163, 0x03a67fca, 0x022c0dae, 0x0278700c, 0x01ab6a64, 0x03194258, 0x0012eb42, 0x032b457f, 0x00140de3}}, Y: Field{[10]uint32{0x02273fc1, 0x028f0bdd, 0x00ad05fe, 0x0193e0bf, 0x03269573, 0x0314ce33, 0x01bf40ba, 0x0335246b, 0x011c26bd, 0x0032f451}}}, + {X: Field{[10]uint32{0x009ba86c, 0x00e2fa33, 0x02b50b91, 0x01138f58, 0x027606eb, 0x0301e3fc, 0x0384ba0e, 0x01458098, 0x00686436, 0x000dd237}}, Y: Field{[10]uint32{0x0211d709, 0x020f2659, 0x01271965, 0x02074d43, 0x016e7bfb, 0x038060a3, 0x01005a04, 0x02ba7377, 0x0014f624, 0x001b0139}}}, + {X: Field{[10]uint32{0x03eea53b, 0x03174715, 0x014047f9, 0x010b417f, 0x013402f3, 0x027ab1ca, 0x01eaea44, 0x035587ef, 0x01be8ea8, 0x002c8e96}}, Y: Field{[10]uint32{0x006dfb9b, 0x03c3a110, 0x019c42fe, 0x03fdc0bb, 0x0295d40e, 0x00fd7e86, 0x03c359c8, 0x016e0b38, 0x0068f2d3, 0x002fa91f}}}, + {X: Field{[10]uint32{0x02a64770, 0x035c7045, 0x00b49ebf, 0x001a4973, 0x039538fc, 0x01c074ae, 0x005f4435, 0x0296f817, 0x01e87b42, 0x00392d14}}, Y: Field{[10]uint32{0x03156da4, 0x019eddcb, 0x001e9e14, 0x029a2a42, 0x014cb261, 0x02de6e61, 0x02fa86b2, 0x001d2523, 0x02699a79, 0x000abe11}}}, + {X: Field{[10]uint32{0x02dff165, 0x03dd5225, 0x01a1242f, 0x005593cf, 0x01de74a2, 0x0194777e, 0x02e671e8, 0x02c218d1, 0x02ec65b8, 0x002192b1}}, Y: Field{[10]uint32{0x031a8730, 0x03ad8009, 0x03188d68, 0x000b7ea4, 0x01b2cbf9, 0x0234afaf, 0x00a5103c, 0x02155647, 0x00a77ab4, 0x003cd5ce}}}, + {X: Field{[10]uint32{0x002ecab0, 0x009c95fc, 0x02ac4ecb, 0x035e6815, 0x00fd36c5, 0x01990e19, 0x00090225, 0x018f66de, 0x023da6a8, 0x002df412}}, Y: Field{[10]uint32{0x0383b0c1, 0x01fbdc1b, 0x031a15ec, 0x02f9d4c3, 0x001519ab, 0x039a81f0, 0x01e4e3bf, 0x03708f96, 0x034c6ba5, 0x00331018}}}, + {X: Field{[10]uint32{0x014c1a0e, 0x023f289c, 0x0044c7ca, 0x00c43af2, 0x03bd6e25, 0x02a0ddf3, 0x020de0c4, 0x03776080, 0x02f9b51e, 0x00377f06}}, Y: Field{[10]uint32{0x03fe3951, 0x0259838f, 0x01ad957b, 0x03d368f8, 0x01c30f23, 0x00976aae, 0x02d9f54a, 0x0313a2c8, 0x008c1742, 0x00033ddf}}}, + {X: Field{[10]uint32{0x011fcbe3, 0x016d1f35, 0x03c30ea7, 0x023e21a3, 0x01e00c82, 0x0053611e, 0x03de26a6, 0x02478e84, 0x0269d5bb, 0x001e3f3f}}, Y: Field{[10]uint32{0x03f2d47d, 0x029b9c91, 0x0306066d, 0x01210d03, 0x0298021b, 0x030a050e, 0x00b231aa, 0x014eeac3, 0x01636b70, 0x0027b19e}}}, + {X: Field{[10]uint32{0x0115863f, 0x00137684, 0x028fcd42, 0x0211e0ce, 0x03138c98, 0x0279dbb2, 0x022b4f81, 0x0075c608, 0x00de1696, 0x00373646}}, Y: Field{[10]uint32{0x0323bb04, 0x014aaeb2, 0x01ed2f5e, 0x003604e9, 0x023ff7fb, 0x004f0a4c, 0x012318dd, 0x00233f28, 0x00bac8d8, 0x002af0f6}}}, + {X: Field{[10]uint32{0x02c3177e, 0x00201b31, 0x012b294a, 0x028a5b33, 0x02e6f64f, 0x00def084, 0x0294eef5, 0x02041a4c, 0x02f05de0, 0x000e738b}}, Y: Field{[10]uint32{0x00730556, 0x034a76de, 0x0349239f, 0x0369e250, 0x020bbb5d, 0x03ce899a, 0x020ca926, 0x025e8e5e, 0x00cb0b76, 0x00097abd}}}, + {X: Field{[10]uint32{0x03157a04, 0x01a94f40, 0x02b5abae, 0x013f4e91, 0x02146451, 0x025eb12e, 0x010e937e, 0x03a27b7d, 0x01b643d4, 0x00125793}}, Y: Field{[10]uint32{0x02ec1701, 0x02c715f9, 0x026d46e6, 0x006e8833, 0x00f84bb8, 0x023105ad, 0x024251cf, 0x0035a7af, 0x0218b296, 0x001f4c9f}}}, + {X: Field{[10]uint32{0x037c33c1, 0x03d6e598, 0x03dbefca, 0x025fd6d9, 0x03a6cb6e, 0x027e79bd, 0x036dde52, 0x01f03070, 0x028cb635, 0x0024705f}}, Y: Field{[10]uint32{0x014c39ba, 0x017b06e9, 0x00e85c96, 0x0383da17, 0x03f07b76, 0x003d61ab, 0x01e26922, 0x022b0bbf, 0x0097fedb, 0x000bf948}}}, + {X: Field{[10]uint32{0x01ecfdbc, 0x01c48875, 0x018d4c03, 0x026f5ab8, 0x001c2874, 0x03172564, 0x011f11ec, 0x03b5118a, 0x00803dff, 0x0038f13d}}, Y: Field{[10]uint32{0x03dc62d8, 0x00afa4b2, 0x0240c65b, 0x009d514f, 0x004e7fb8, 0x033be2ca, 0x00ad71da, 0x009f3a5d, 0x0102571e, 0x00168b9c}}}, + {X: Field{[10]uint32{0x01c25073, 0x01763b5d, 0x0333acc1, 0x03a95a03, 0x0059ae7b, 0x03e772ee, 0x0014377a, 0x0079ed22, 0x03f5a0e8, 0x002cfb85}}, Y: Field{[10]uint32{0x00bfe86d, 0x024b9f5b, 0x01ecb6d0, 0x035415ce, 0x03b46332, 0x00e7b788, 0x0035afe1, 0x00a09698, 0x000c9a6d, 0x0004d68f}}}, + {X: Field{[10]uint32{0x02e76b75, 0x019819ba, 0x01732298, 0x0365796d, 0x017ca6e8, 0x019248cd, 0x02628e1f, 0x006fb4d0, 0x00442bc9, 0x0039332a}}, Y: Field{[10]uint32{0x016f76b9, 0x02364394, 0x01cececc, 0x03880c76, 0x02409f74, 0x00c66b1c, 0x00b42b0f, 0x019c3fdc, 0x015539b5, 0x00375569}}}, + {X: Field{[10]uint32{0x02223b2c, 0x02fefdf6, 0x02359b5e, 0x03aa58ad, 0x02e517e4, 0x013ab9eb, 0x00c02a46, 0x01822666, 0x03c181c9, 0x002ace73}}, Y: Field{[10]uint32{0x037d2fc4, 0x0393aa41, 0x02096a22, 0x01403e65, 0x0172ba3b, 0x00a06862, 0x01cfec18, 0x02ef8b9b, 0x0057b4dc, 0x0037bdb7}}}, + {X: Field{[10]uint32{0x03ab402a, 0x01172137, 0x02e01f8e, 0x034652ce, 0x02677572, 0x0193c206, 0x00cad409, 0x0011a7f9, 0x02639e6e, 0x0008a8c9}}, Y: Field{[10]uint32{0x00d2b437, 0x0157e610, 0x02f261b8, 0x0141750a, 0x00db44cf, 0x013263f3, 0x00f61484, 0x003bc16b, 0x0195bd4e, 0x00072727}}}, + {X: Field{[10]uint32{0x01f9cae9, 0x03f30908, 0x029037c2, 0x0285de42, 0x02db269d, 0x03ef137a, 0x03c5ead4, 0x012fc0c1, 0x00cceff9, 0x000af1e2}}, Y: Field{[10]uint32{0x00bc4b41, 0x000f9389, 0x01384aa7, 0x01227583, 0x00ccecb2, 0x0231e30f, 0x0081c43a, 0x01548110, 0x0061648c, 0x0005cbcd}}}, + {X: Field{[10]uint32{0x02052729, 0x00a8c000, 0x00fe4c62, 0x00d827ef, 0x003872c6, 0x02ef9a7a, 0x0275bb88, 0x001804d6, 0x03d2a672, 0x002e4c36}}, Y: Field{[10]uint32{0x0206f366, 0x0103fd6b, 0x01ebd839, 0x00d8ccd3, 0x01ff3f68, 0x01d0e2ce, 0x030e7f9a, 0x03a2e0a0, 0x0303a872, 0x0002660f}}}, + {X: Field{[10]uint32{0x0114e3d3, 0x02cb8e5d, 0x03466f33, 0x00fa1ca8, 0x0329bcd0, 0x029bc61b, 0x02db448d, 0x03a901c0, 0x038a2aa9, 0x002d0d5c}}, Y: Field{[10]uint32{0x0098636b, 0x01511ce4, 0x0074e92c, 0x02383d87, 0x011678cb, 0x0330d241, 0x0217e55b, 0x019c7e15, 0x02462d3c, 0x00160a34}}}, + {X: Field{[10]uint32{0x0072bd25, 0x037fee4c, 0x0223b532, 0x01fe76d8, 0x02ee1fe6, 0x01060375, 0x012df27d, 0x026ebcb1, 0x02813acc, 0x003247cb}}, Y: Field{[10]uint32{0x01b73c0c, 0x0057c1e1, 0x0345569c, 0x003ef493, 0x02b02735, 0x00ddf878, 0x02fa0c2b, 0x00bc4c4e, 0x03d696c1, 0x00072715}}}, + {X: Field{[10]uint32{0x008d36c8, 0x0257c017, 0x0131d2b9, 0x001be31f, 0x030bad0d, 0x005b6400, 0x028068f4, 0x02ea4e3c, 0x02c28099, 0x002ec251}}, Y: Field{[10]uint32{0x0176da4a, 0x00e41afb, 0x00164867, 0x007dde0b, 0x00156042, 0x03a5e3ca, 0x03e1a621, 0x017fa5e3, 0x00d93b57, 0x00238e1e}}}, + {X: Field{[10]uint32{0x03085c8d, 0x0281a923, 0x03398c31, 0x03df2d13, 0x035298db, 0x01c1fcd9, 0x0106521a, 0x00cdd335, 0x02a12e82, 0x0012178e}}, Y: Field{[10]uint32{0x02ca9a61, 0x018005e1, 0x03878a4b, 0x03837ed3, 0x02af0153, 0x000bf098, 0x0339d4c3, 0x02cac568, 0x02f57079, 0x00284b22}}}, + {X: Field{[10]uint32{0x013e844d, 0x027ee69c, 0x03db3e8a, 0x00a9e219, 0x020f21d0, 0x022a5baa, 0x00da03fe, 0x00895a50, 0x0048d328, 0x002143e5}}, Y: Field{[10]uint32{0x03fccb7b, 0x02c9108e, 0x00d8259a, 0x00d8296a, 0x0103a678, 0x0162a083, 0x034df3af, 0x02e8b029, 0x00fe3201, 0x00115479}}}, + {X: Field{[10]uint32{0x03e39884, 0x03214ec2, 0x01c43682, 0x030152db, 0x01449cd4, 0x03abd476, 0x00e51b18, 0x007f927e, 0x02b3f66c, 0x0029d205}}, Y: Field{[10]uint32{0x0372f7fc, 0x033bdfac, 0x0004f15e, 0x039203b2, 0x01396626, 0x01330416, 0x02f0cfdc, 0x01fa8516, 0x03b247ed, 0x00139f57}}}, + {X: Field{[10]uint32{0x0320136d, 0x02b5adde, 0x02f7785e, 0x00b5ae62, 0x02e1eb70, 0x00d04805, 0x01abcc17, 0x02885c1e, 0x016fc71d, 0x000abd71}}, Y: Field{[10]uint32{0x02b706bd, 0x01455061, 0x029321b6, 0x03642d4c, 0x02783911, 0x00c69ae3, 0x0049e95a, 0x00988ecb, 0x00a2c6a8, 0x001fcc44}}}, + {X: Field{[10]uint32{0x039b5834, 0x013fb90c, 0x00903968, 0x00525c98, 0x031a3137, 0x02b983b6, 0x0163135f, 0x037c7a43, 0x0091a61a, 0x0024a47b}}, Y: Field{[10]uint32{0x01d03884, 0x007745ef, 0x01e09bac, 0x02f2b78b, 0x03feef42, 0x020cb7a4, 0x009649f1, 0x036ecff0, 0x006be8b0, 0x00354c14}}}, + {X: Field{[10]uint32{0x00605b54, 0x0110a4b3, 0x028e1144, 0x034608f3, 0x03a8581f, 0x03863fda, 0x029cb474, 0x01e05813, 0x03c3659a, 0x000582b4}}, Y: Field{[10]uint32{0x00d141fe, 0x007d09a9, 0x03b58b6e, 0x03060636, 0x010a59f2, 0x007ae476, 0x01f939eb, 0x035c6698, 0x024d5f28, 0x00058611}}}, + {X: Field{[10]uint32{0x00ba9d58, 0x01c64d18, 0x02572b40, 0x03e18d62, 0x01ea4280, 0x01cf6b63, 0x005a5d76, 0x024830b6, 0x01bb8640, 0x000d4966}}, Y: Field{[10]uint32{0x03538d0c, 0x01f470a2, 0x0164a50f, 0x03618e35, 0x00aa2ac3, 0x00f2572b, 0x017707ad, 0x013cac8b, 0x011be806, 0x0029e296}}}, + {X: Field{[10]uint32{0x036ba527, 0x00b13ede, 0x03f334d1, 0x038488da, 0x01adb37c, 0x03a78575, 0x037a7281, 0x018d364b, 0x03bd9a8c, 0x003b083b}}, Y: Field{[10]uint32{0x0151b70d, 0x015ecec3, 0x021e2a9a, 0x024bf550, 0x02e8c547, 0x01ebe762, 0x019315e2, 0x00c454e4, 0x01bc2a5a, 0x002b36ca}}}, + {X: Field{[10]uint32{0x02dbebc3, 0x02b51838, 0x0064c5cf, 0x0214618f, 0x01bbd387, 0x0165e07a, 0x02e847dc, 0x031bb157, 0x00da8bda, 0x00103479}}, Y: Field{[10]uint32{0x016e9ab0, 0x0099568c, 0x013acd3a, 0x03fc9fed, 0x004e3755, 0x02e8fb06, 0x03c7d5bd, 0x00b9a299, 0x001cb7c9, 0x00318c16}}}, + {X: Field{[10]uint32{0x027d08c7, 0x02e91103, 0x035127db, 0x00b7c3fe, 0x0081674c, 0x022d9b7d, 0x01ac1c39, 0x037cb8ac, 0x03402faa, 0x003ef849}}, Y: Field{[10]uint32{0x03f412d6, 0x00bdee2d, 0x0187c52f, 0x00d39ba1, 0x00f3dfee, 0x011245a6, 0x00871821, 0x005340eb, 0x00d7f979, 0x003403b7}}}, + {X: Field{[10]uint32{0x0191eb03, 0x0364c370, 0x0008bb0c, 0x0358990c, 0x034070d9, 0x03ec7848, 0x010fbd80, 0x0247ee21, 0x01a747d1, 0x0035e06d}}, Y: Field{[10]uint32{0x006afa11, 0x01ac63cd, 0x03792d90, 0x00c09236, 0x019762ef, 0x0066ca44, 0x01f29245, 0x02ad57e5, 0x01a25c74, 0x00292aa5}}}, + {X: Field{[10]uint32{0x00cf02cd, 0x0111bc27, 0x0052944a, 0x00e7b948, 0x0122790c, 0x00e56d7a, 0x01045d00, 0x02f1f045, 0x0042d926, 0x00191cbf}}, Y: Field{[10]uint32{0x0205a99d, 0x02de2511, 0x0106863d, 0x02d438ab, 0x03045d1a, 0x00cf210a, 0x0264e376, 0x024f7b88, 0x0014a925, 0x00001448}}}, + {X: Field{[10]uint32{0x015e0c21, 0x0057b58e, 0x03fd2c57, 0x00993203, 0x005fa6cf, 0x01181e8b, 0x0117a935, 0x0007a1a9, 0x00c2e096, 0x003bb860}}, Y: Field{[10]uint32{0x0083e7ea, 0x01259a5d, 0x01711e06, 0x03c6b995, 0x0349490a, 0x03de1728, 0x03daff70, 0x01bf16d3, 0x0398221d, 0x003232e9}}}, + {X: Field{[10]uint32{0x01ada2d6, 0x012dd411, 0x00ab4fad, 0x03536d40, 0x039103be, 0x015d8c1d, 0x03ec071c, 0x02b50456, 0x022da172, 0x002402c9}}, Y: Field{[10]uint32{0x01e2cbaf, 0x0108f814, 0x015aa371, 0x0361459d, 0x0082c4c1, 0x00fe8d35, 0x0018e7fb, 0x03fa44fd, 0x03f2bbad, 0x000c5915}}}, + {X: Field{[10]uint32{0x03a34c9e, 0x02006884, 0x00e20420, 0x02c799af, 0x015d5e03, 0x027bca74, 0x02d3371b, 0x0141c1dc, 0x03874e1e, 0x001fa4f6}}, Y: Field{[10]uint32{0x038465a8, 0x0308ce78, 0x0356abc2, 0x011ed6fe, 0x0063f3ec, 0x00033704, 0x03aa0fee, 0x00ca9bd7, 0x02247500, 0x00337aa9}}}, + {X: Field{[10]uint32{0x01a379ca, 0x02320be2, 0x031f5da9, 0x01e80fb6, 0x02d17287, 0x012aff8e, 0x02761b84, 0x02957799, 0x002465f3, 0x001187ed}}, Y: Field{[10]uint32{0x00e815d9, 0x014a16c6, 0x0332b7f1, 0x0299ae39, 0x011f584a, 0x00179070, 0x0101dadc, 0x009c63d5, 0x01fdba03, 0x001da098}}}, + {X: Field{[10]uint32{0x0019e09f, 0x0379de25, 0x0059e997, 0x02997cd4, 0x036de28a, 0x006e93e4, 0x010f0cc9, 0x00683f97, 0x001af0f6, 0x000767d6}}, Y: Field{[10]uint32{0x011bf6cd, 0x00da6d22, 0x011f8adf, 0x00758889, 0x003f02db, 0x0259dbd5, 0x00302e18, 0x03715858, 0x018c7d59, 0x001ffa72}}}, + {X: Field{[10]uint32{0x027542c6, 0x010e085d, 0x0362be23, 0x03fcf337, 0x0166386d, 0x013bf8de, 0x00f7a70e, 0x00aa9c90, 0x0352904b, 0x002335c2}}, Y: Field{[10]uint32{0x01ddc2f2, 0x01afb26d, 0x001f1ff8, 0x00f62195, 0x020e9e29, 0x01caf1ae, 0x0308bb2f, 0x002c7c03, 0x003f4c7e, 0x002cf0f4}}}, + {X: Field{[10]uint32{0x034a5261, 0x02a98a3a, 0x02a2e819, 0x008d3910, 0x0199097b, 0x00036bbf, 0x025b8b38, 0x02196e66, 0x03ea9c08, 0x00282d51}}, Y: Field{[10]uint32{0x02ca2952, 0x0377627c, 0x03a2280c, 0x0063cb48, 0x00fd9d1e, 0x0289fad8, 0x003cb4e1, 0x00403700, 0x0115e585, 0x00181fbc}}}, + {X: Field{[10]uint32{0x0344d289, 0x0358d810, 0x0177578d, 0x03d57f6f, 0x00192406, 0x01fa06ad, 0x03a649c2, 0x00e38da0, 0x00f65470, 0x003aa298}}, Y: Field{[10]uint32{0x01822fb0, 0x003dd19e, 0x00691ac1, 0x033d4183, 0x02881b5f, 0x02f08bc5, 0x00b9f3e3, 0x0357aa3f, 0x02c0b05a, 0x00262bf2}}}, + {X: Field{[10]uint32{0x00b0a711, 0x02335285, 0x0075501a, 0x001a44d4, 0x0148bce5, 0x016ede0a, 0x01488fe5, 0x03e7bddf, 0x029d0882, 0x00398146}}, Y: Field{[10]uint32{0x02920fce, 0x02853d8b, 0x03498ffa, 0x0209364c, 0x00c1ec0c, 0x0182bdd7, 0x01257b8a, 0x02d5572e, 0x02be9d9e, 0x00072736}}}, + {X: Field{[10]uint32{0x00765674, 0x01497a62, 0x02a4b39a, 0x03153e3a, 0x03165338, 0x001f8396, 0x00e5efbc, 0x034cdc1b, 0x02c9c50f, 0x0018021d}}, Y: Field{[10]uint32{0x03ea4189, 0x01e5b936, 0x0346a213, 0x00b981a9, 0x03b04420, 0x0282c856, 0x01f5da0a, 0x0087ce0f, 0x031ef52b, 0x00100699}}}, + {X: Field{[10]uint32{0x02b2ff40, 0x03c7a5fd, 0x00185274, 0x01596df8, 0x003c0eca, 0x01a78105, 0x03efe121, 0x03f7426c, 0x039c5ef6, 0x000ec116}}, Y: Field{[10]uint32{0x02780a28, 0x039a04d8, 0x02dfad20, 0x01ef2c4d, 0x03a135a4, 0x035a4530, 0x00085d05, 0x001f10aa, 0x03acb211, 0x002a95dc}}}, + {X: Field{[10]uint32{0x01f0f1b6, 0x03b9fd2c, 0x022dc643, 0x0077954a, 0x01f9504b, 0x03b673bd, 0x027807fd, 0x01578135, 0x0132ee0b, 0x00373a63}}, Y: Field{[10]uint32{0x033fb086, 0x01687787, 0x031b8d43, 0x038a0077, 0x03aba058, 0x02b3d509, 0x03746d67, 0x00925f2e, 0x027c9e99, 0x00340eb0}}}, + {X: Field{[10]uint32{0x0378fd76, 0x03a61338, 0x0144958b, 0x01fc8be8, 0x03dd5aea, 0x00da19e1, 0x011c07a9, 0x0183fa2a, 0x01486e8a, 0x000d96c4}}, Y: Field{[10]uint32{0x0301c9c0, 0x00add87b, 0x005c3f85, 0x019d53d0, 0x01b36e27, 0x036ee3b0, 0x01ecbbcb, 0x01754131, 0x0217319e, 0x000b1fd4}}}, + {X: Field{[10]uint32{0x036b5806, 0x01cecbaa, 0x006cbb9c, 0x03a15f26, 0x023c3720, 0x013b78d5, 0x00dc3cad, 0x0197b7ba, 0x035a4dc4, 0x000b8de4}}, Y: Field{[10]uint32{0x03ce346b, 0x00e51752, 0x01522c0e, 0x0240431b, 0x02839cb6, 0x01fe0692, 0x02dc7f9d, 0x03d1b600, 0x03f15278, 0x002f421c}}}, + {X: Field{[10]uint32{0x01647568, 0x02eba53c, 0x030bb00f, 0x0215b91e, 0x0081cd85, 0x0035c656, 0x00ddf927, 0x016b5ed8, 0x00e19374, 0x000126da}}, Y: Field{[10]uint32{0x02819dc1, 0x01a4f01c, 0x03795755, 0x00c43d29, 0x021dc82d, 0x03d2e16f, 0x03cb2d05, 0x010fbd4e, 0x03f0013e, 0x00328752}}}, + {X: Field{[10]uint32{0x02744564, 0x00c3f33e, 0x0220cb81, 0x02e8f981, 0x016c8cc6, 0x027b781d, 0x02b6f66e, 0x016a20b0, 0x016cc79c, 0x001b7d4f}}, Y: Field{[10]uint32{0x02431344, 0x02013449, 0x036e1729, 0x01f2bed5, 0x014597f7, 0x00698525, 0x032f2914, 0x01f16491, 0x02ed3b2b, 0x001230f5}}}, + {X: Field{[10]uint32{0x034865a1, 0x0385c36f, 0x02b8bd28, 0x0307238c, 0x022f9467, 0x019c5168, 0x01636727, 0x038ee498, 0x03069104, 0x003667e3}}, Y: Field{[10]uint32{0x02543d7f, 0x02ff9414, 0x01479fd1, 0x00cf9044, 0x00c2b433, 0x0301b2c6, 0x0267c4e2, 0x01764d93, 0x02b055aa, 0x00333f11}}}, + {X: Field{[10]uint32{0x019930d1, 0x03ab64f9, 0x0342a538, 0x03f71a30, 0x01e23af7, 0x01562816, 0x00075728, 0x020ce2ea, 0x0017ebbf, 0x001ddc9f}}, Y: Field{[10]uint32{0x00c629ea, 0x0380ce10, 0x0308366d, 0x02504cf9, 0x00ede751, 0x017d4329, 0x023bc657, 0x0060083f, 0x007e2cde, 0x00280df7}}}, + {X: Field{[10]uint32{0x03e22604, 0x00328bda, 0x0266377e, 0x022667b0, 0x0036ae37, 0x0344ce6b, 0x00c84cfa, 0x013fdf05, 0x02d8563a, 0x0007503a}}, Y: Field{[10]uint32{0x00d1face, 0x007b0488, 0x01713a71, 0x00b6a5a3, 0x033a6b0c, 0x03137ee1, 0x025a5ac1, 0x0245ffb9, 0x0043b093, 0x002125ed}}}, + {X: Field{[10]uint32{0x006bfae0, 0x0241c410, 0x010ef405, 0x02645e8f, 0x03e32269, 0x0061034d, 0x0227c205, 0x02accdc6, 0x0341adf5, 0x0000a8e7}}, Y: Field{[10]uint32{0x005c27c5, 0x03cab1a4, 0x008ed155, 0x027b1c12, 0x008dd1a4, 0x03a11306, 0x0236b048, 0x027ee08e, 0x03a858e9, 0x000336bd}}}, + {X: Field{[10]uint32{0x01c684e0, 0x00dc2206, 0x0215e281, 0x024adb38, 0x0166f5ea, 0x0365d288, 0x031cc92f, 0x02331225, 0x00b1d8b0, 0x0002aab9}}, Y: Field{[10]uint32{0x03cd8f0c, 0x035e3a78, 0x01bdea34, 0x0344e909, 0x03c63739, 0x0145478c, 0x03d5cd50, 0x00d22a13, 0x0195c10a, 0x000248de}}}, + {X: Field{[10]uint32{0x02477d40, 0x03f6bf39, 0x03440965, 0x01520c7b, 0x0211315a, 0x02b0b278, 0x00939d29, 0x014ed8cd, 0x0042591a, 0x00296c30}}, Y: Field{[10]uint32{0x00a62ca6, 0x01e97301, 0x016d7e11, 0x03234a90, 0x00bc9904, 0x00f1f758, 0x022b206b, 0x000922cd, 0x00fd5d1f, 0x002b0f9f}}}, + {X: Field{[10]uint32{0x03c63f0b, 0x00b907c9, 0x035a1278, 0x02d40faf, 0x003c16e3, 0x03c252f9, 0x03643b47, 0x01aa5aa3, 0x0164e616, 0x000306dc}}, Y: Field{[10]uint32{0x01663a98, 0x003c079d, 0x01207fcc, 0x02fdcfb4, 0x01e34810, 0x0378eb1e, 0x010ba811, 0x03c7fd6d, 0x021a4ffa, 0x00211a45}}}, + {X: Field{[10]uint32{0x01ca63bc, 0x0263852b, 0x028b457b, 0x01763f7c, 0x00342e60, 0x03ac9b74, 0x00e0f2c8, 0x018fc136, 0x00254b79, 0x000263f6}}, Y: Field{[10]uint32{0x01a192d6, 0x0184456c, 0x0098f220, 0x0096f848, 0x012dc143, 0x032f2e67, 0x039dba65, 0x019991df, 0x000d213f, 0x0038a5ea}}}, + {X: Field{[10]uint32{0x014c3281, 0x02ceab56, 0x00dc163e, 0x033605ab, 0x0148c464, 0x030b9bc6, 0x034127d8, 0x03b524b4, 0x024971b6, 0x003c7c21}}, Y: Field{[10]uint32{0x00f31f5c, 0x00ce2ac0, 0x0031a346, 0x0394bf7b, 0x03506a0d, 0x01580b9b, 0x038954d8, 0x013ea44e, 0x02a0f9e0, 0x00009ab8}}}, + {X: Field{[10]uint32{0x030dd197, 0x010388e4, 0x03a91172, 0x00e98688, 0x01b63af8, 0x00141bed, 0x03441eac, 0x034ab298, 0x00cdc324, 0x0003fd1c}}, Y: Field{[10]uint32{0x0227788f, 0x00983495, 0x01eba5a5, 0x012e3f4c, 0x0330734b, 0x007be9ce, 0x007a772a, 0x01dfa118, 0x026bb18e, 0x0039807d}}}, + {X: Field{[10]uint32{0x006c63a6, 0x0110b7ef, 0x016dcd04, 0x02e4ccbb, 0x00ad0f82, 0x02aaeeaa, 0x0008127b, 0x02865ad6, 0x006d968a, 0x00243aaf}}, Y: Field{[10]uint32{0x035038f1, 0x03e93bae, 0x030f94c1, 0x038f7370, 0x032faed3, 0x0111daca, 0x03fc4be4, 0x00f35cb7, 0x0367ffb2, 0x0035b7c3}}}, + {X: Field{[10]uint32{0x007e11af, 0x012e2ef3, 0x03866ecd, 0x02dbfabc, 0x02bc0a43, 0x00c00d8f, 0x01e0826b, 0x001e86d0, 0x0126acc5, 0x003885ec}}, Y: Field{[10]uint32{0x01e98f30, 0x007f1b92, 0x01ecda8d, 0x017ec0c8, 0x02921e3a, 0x02c9e8e1, 0x00eb7332, 0x00cf562e, 0x01ef83db, 0x001faca3}}}, + {X: Field{[10]uint32{0x00e1d184, 0x039a2a7f, 0x0228d20d, 0x03bb1e55, 0x02b5d008, 0x01362ab4, 0x032bc218, 0x0175785d, 0x03d582b8, 0x000a865b}}, Y: Field{[10]uint32{0x02201303, 0x00e67d98, 0x022300c3, 0x019e2760, 0x0368526c, 0x02b4bfc7, 0x038dc8cc, 0x038f53f7, 0x0257ee9e, 0x002652d1}}}, + {X: Field{[10]uint32{0x02de4342, 0x0074099e, 0x002e6132, 0x02f5f99b, 0x02ca770c, 0x00463def, 0x01897c81, 0x0329fa2a, 0x03c83a6e, 0x002f278e}}, Y: Field{[10]uint32{0x014f3f4b, 0x01950b5c, 0x030a3f34, 0x0184be12, 0x00e2b076, 0x017cd749, 0x00992917, 0x029586ae, 0x03e2d544, 0x00275fbd}}}, + {X: Field{[10]uint32{0x02f198b3, 0x0144aaac, 0x00cdf6f6, 0x03b79a47, 0x017e76b8, 0x03c4bc82, 0x029e3676, 0x027e13fa, 0x03f3842a, 0x003fca04}}, Y: Field{[10]uint32{0x03fe1949, 0x012128b0, 0x03f7618a, 0x00abd00a, 0x01b8b668, 0x02027d21, 0x02de4380, 0x030586b1, 0x03d666d0, 0x00081b8e}}}, + {X: Field{[10]uint32{0x01af05f7, 0x011e6e34, 0x01baf6c7, 0x02f9382b, 0x0234a50b, 0x01da75f2, 0x01423210, 0x0358faf8, 0x01df2d38, 0x001b9d66}}, Y: Field{[10]uint32{0x03654c8d, 0x01bea978, 0x002cd555, 0x0117b346, 0x03256143, 0x01ad251a, 0x01ed56eb, 0x0136212a, 0x031d4b0e, 0x0008cf73}}}, + {X: Field{[10]uint32{0x03666146, 0x0141c64c, 0x039f9ba2, 0x00bad5db, 0x03839766, 0x02797059, 0x01844d1a, 0x03aca053, 0x00d56c82, 0x0007b767}}, Y: Field{[10]uint32{0x01f43f4c, 0x00946f8f, 0x0165fe24, 0x03725776, 0x0239d48d, 0x0345a083, 0x01b5cb04, 0x03a0fa52, 0x02850b2e, 0x002803d2}}}, + {X: Field{[10]uint32{0x007324af, 0x01e7ed90, 0x02b0718d, 0x01ce4b5e, 0x02818a2f, 0x00e2a07a, 0x024a0907, 0x01335dda, 0x02061f79, 0x0009c8f7}}, Y: Field{[10]uint32{0x02bbf41f, 0x00707fb1, 0x00e783db, 0x01c9df34, 0x0038daad, 0x0112ae22, 0x013429e3, 0x003140f1, 0x01bef981, 0x000d71ea}}}, + {X: Field{[10]uint32{0x039a213d, 0x027289aa, 0x0353af46, 0x00ae9f1a, 0x023874ec, 0x010f04f0, 0x01659eeb, 0x0137bdb6, 0x02444cb5, 0x001313ec}}, Y: Field{[10]uint32{0x038efa3d, 0x01d47956, 0x02472082, 0x036168d5, 0x03d4a1ae, 0x0126cce3, 0x039ad153, 0x01ea7ffa, 0x02fe5644, 0x002ef4ba}}}, + {X: Field{[10]uint32{0x027593e3, 0x0255c819, 0x0212f250, 0x034a3939, 0x0112847e, 0x03ecfef3, 0x03069771, 0x0256a238, 0x01f73479, 0x001cd8d6}}, Y: Field{[10]uint32{0x02bd3741, 0x0256fe44, 0x015f972c, 0x02920359, 0x00e303fd, 0x02e3e61a, 0x02215ca6, 0x001448d6, 0x03ed4bce, 0x0008eecd}}}, + {X: Field{[10]uint32{0x01f595be, 0x01e53661, 0x03293825, 0x03df0332, 0x026f33b0, 0x0021e6fb, 0x01813946, 0x01af452e, 0x0194ee93, 0x000572e5}}, Y: Field{[10]uint32{0x031bb152, 0x00950a7e, 0x0149ac7f, 0x03997962, 0x03e2e133, 0x036c9d3b, 0x03775e9e, 0x006ad804, 0x032a2ec8, 0x002aab5d}}}, + {X: Field{[10]uint32{0x03e78fa4, 0x01b159da, 0x00a9b41e, 0x01de987c, 0x02df5747, 0x002e1dca, 0x0290eb82, 0x033c7a12, 0x01ab97e5, 0x000ed522}}, Y: Field{[10]uint32{0x022219be, 0x00d33d95, 0x00cf9e71, 0x03aeeec4, 0x020d59a1, 0x0044f592, 0x02cad63f, 0x01285f33, 0x03c8e967, 0x00051744}}}, + {X: Field{[10]uint32{0x029dd2f5, 0x005d65e8, 0x01c56684, 0x0130e896, 0x0323323e, 0x0167389a, 0x01bec7bb, 0x034e16c2, 0x019aa6f9, 0x001e346e}}, Y: Field{[10]uint32{0x0216a122, 0x0220dedf, 0x020ef3cd, 0x033856d2, 0x00a6b890, 0x027da8a0, 0x014369ce, 0x02c8433d, 0x01f8e883, 0x00072344}}}, + {X: Field{[10]uint32{0x01661e85, 0x03457ece, 0x0121070c, 0x0060afa0, 0x02d2fd2d, 0x024e244b, 0x0013e3f0, 0x03eef4ea, 0x028c5cef, 0x000e1793}}, Y: Field{[10]uint32{0x0368069c, 0x00b6b2ea, 0x02c7036e, 0x03896337, 0x02c9b168, 0x00730232, 0x03ceb21c, 0x03ef1484, 0x00149f5c, 0x003d2871}}}, + {X: Field{[10]uint32{0x011aec6a, 0x0365c465, 0x02b1fc28, 0x00c0a4b5, 0x02a7c872, 0x014fa4a4, 0x0130df3c, 0x01b1b922, 0x0070d8e4, 0x000c43e3}}, Y: Field{[10]uint32{0x0017146f, 0x021bd70d, 0x01efdb03, 0x017db73b, 0x0359d92d, 0x0175c11b, 0x0315154d, 0x001ec959, 0x01d3c92c, 0x001bf8c6}}}, + {X: Field{[10]uint32{0x03c70bbb, 0x01996175, 0x00912940, 0x02590884, 0x03c1f91a, 0x02356248, 0x030b80d4, 0x03542b85, 0x003023d1, 0x001d93cf}}, Y: Field{[10]uint32{0x03dca724, 0x01f2d038, 0x038e4b54, 0x02e323ca, 0x03c3ee9e, 0x01e32673, 0x01411468, 0x02d283b6, 0x031abecd, 0x002f64be}}}, + {X: Field{[10]uint32{0x03e68126, 0x01fbdca8, 0x031ab36f, 0x01d4f11e, 0x02b37a80, 0x010042e2, 0x013c86f8, 0x028dfc6f, 0x03bab357, 0x000f5748}}, Y: Field{[10]uint32{0x0334255b, 0x0056575a, 0x028e0821, 0x018424c1, 0x017ccbb4, 0x017e7037, 0x00893c5f, 0x0009960e, 0x0041bdcf, 0x000aef46}}}, + {X: Field{[10]uint32{0x027f8a1e, 0x0095ae0a, 0x00dc087e, 0x01f543d4, 0x006d4ddd, 0x019d67a5, 0x03d2affd, 0x01ee2ffa, 0x01adcdfc, 0x0029c10c}}, Y: Field{[10]uint32{0x0147f593, 0x0091fd64, 0x01f20384, 0x00861bfd, 0x00231639, 0x03bfb32e, 0x03d77e8b, 0x02cbab0c, 0x022b9362, 0x000f290d}}}, + {X: Field{[10]uint32{0x000e8a7d, 0x0358f98c, 0x00697bf7, 0x03689177, 0x032263e9, 0x03177500, 0x00004327, 0x00bb3cf2, 0x02122c1b, 0x000a8e20}}, Y: Field{[10]uint32{0x02f6ff78, 0x00b20884, 0x01175fd7, 0x03669c91, 0x01a339c0, 0x02a6dcea, 0x005f2faf, 0x01efc0f7, 0x018853b8, 0x002b25b4}}}, + {X: Field{[10]uint32{0x024b5451, 0x005f0290, 0x01a9ab4d, 0x03fccc1a, 0x0356b49b, 0x015f8c04, 0x00bc545f, 0x0008bad4, 0x01a40ae3, 0x003a6716}}, Y: Field{[10]uint32{0x029bada0, 0x0111758b, 0x03349baf, 0x0260820d, 0x02b4fe1a, 0x00541645, 0x03737b56, 0x03eaddb0, 0x0379fe55, 0x000a6c92}}}, + {X: Field{[10]uint32{0x003306d4, 0x0300d382, 0x0384bf19, 0x035ac368, 0x03c0be26, 0x030ff8b4, 0x03f1a3c3, 0x0317b7d8, 0x02d1bd5a, 0x0028290b}}, Y: Field{[10]uint32{0x00a0bbc3, 0x033d8457, 0x039e4e5b, 0x01e59c99, 0x008aad08, 0x030c83ba, 0x0293e288, 0x008dd1e8, 0x03d2d444, 0x0030e7fc}}}, + {X: Field{[10]uint32{0x009e0053, 0x021baef0, 0x00b01c0b, 0x021c2dbc, 0x035cc17e, 0x01065cc3, 0x011670e1, 0x03c18fc7, 0x01d69ba9, 0x002e54b9}}, Y: Field{[10]uint32{0x01c46ae0, 0x023c31cb, 0x010ca0fe, 0x026bd4f3, 0x02273a4f, 0x02fc942b, 0x031c9b5b, 0x02e369b9, 0x019fa230, 0x00307a02}}}, + {X: Field{[10]uint32{0x01a4e904, 0x03e0ffa5, 0x01a2e620, 0x02319575, 0x01be83c1, 0x00498872, 0x03892b45, 0x017d3918, 0x033a130f, 0x000ebb89}}, Y: Field{[10]uint32{0x030af7e7, 0x03bac3ef, 0x01131eb7, 0x00d67a32, 0x009237b0, 0x024fe51c, 0x003c6a0b, 0x02db73cb, 0x01c6921f, 0x003b7d1d}}}, + {X: Field{[10]uint32{0x0266ceac, 0x0389576e, 0x0044965c, 0x01974a34, 0x00aa2f9e, 0x021e09ff, 0x0310d91b, 0x02bc1ab2, 0x00dcdc65, 0x00025b77}}, Y: Field{[10]uint32{0x0100ab39, 0x03e14bb4, 0x03584215, 0x01f98080, 0x039e2bf3, 0x0042ef08, 0x030d4fe3, 0x01009320, 0x036817fd, 0x000b9b40}}}, + {X: Field{[10]uint32{0x030334a3, 0x017eb934, 0x004d5af4, 0x039e78d6, 0x01e0d07a, 0x00a507e8, 0x00e111c3, 0x03b276c4, 0x0006c757, 0x003f543d}}, Y: Field{[10]uint32{0x013fde6f, 0x03d2f3f5, 0x03348324, 0x003b184d, 0x00ed9ccb, 0x03e36ca2, 0x01b1d364, 0x001a3f1f, 0x0094d49c, 0x001c6ddd}}}, + {X: Field{[10]uint32{0x03a097d1, 0x0193e45a, 0x03a77d3c, 0x004af28e, 0x03bd0611, 0x015a2ae6, 0x014915c9, 0x01148c18, 0x02681195, 0x001bcb60}}, Y: Field{[10]uint32{0x00787a87, 0x003bde0d, 0x035afe88, 0x01a34097, 0x0297261d, 0x029591e8, 0x017fe722, 0x029f134c, 0x0199849c, 0x002af904}}}, + {X: Field{[10]uint32{0x01cc1400, 0x019091c8, 0x03c9d3f0, 0x036f8988, 0x029c5099, 0x020ca8c4, 0x0283d2ce, 0x02d8a89d, 0x01b76dff, 0x00362303}}, Y: Field{[10]uint32{0x01cec51f, 0x0398d4a3, 0x034ea542, 0x02250c6e, 0x02ba5aa2, 0x0021ccad, 0x001726df, 0x01fa4976, 0x015adf6d, 0x00144d3c}}}, + {X: Field{[10]uint32{0x007105fe, 0x03d55f9d, 0x01562d95, 0x012a9c75, 0x00b6c0fd, 0x0080bf93, 0x01013632, 0x00fca3ab, 0x02e4ddde, 0x002a37a6}}, Y: Field{[10]uint32{0x03be8803, 0x00f8f6a8, 0x0107e038, 0x010dbbea, 0x02536820, 0x01f71d4a, 0x03c39a51, 0x02d85242, 0x006b5a71, 0x0005e7a5}}}, + {X: Field{[10]uint32{0x03cd45ac, 0x00942aa3, 0x037ae6eb, 0x03bf9201, 0x01799c94, 0x003996c3, 0x02a48118, 0x00f50276, 0x0027f7dc, 0x00189b1a}}, Y: Field{[10]uint32{0x01bf2f32, 0x031758cc, 0x01c00fce, 0x02841e06, 0x02b30b7e, 0x036e2397, 0x024a2db8, 0x01eca0cb, 0x01db87cf, 0x0000f596}}}, + {X: Field{[10]uint32{0x00a77d02, 0x01213d0b, 0x004955b5, 0x03bed488, 0x021666eb, 0x03d5b3c0, 0x00b2ef69, 0x03e91f6d, 0x022cf00e, 0x0000a28e}}, Y: Field{[10]uint32{0x0393c82b, 0x0266c5a0, 0x01b01f77, 0x00de5e53, 0x030fc168, 0x009c21b1, 0x00e90fb9, 0x01c3b667, 0x00edfc98, 0x00023740}}}, + {X: Field{[10]uint32{0x01545786, 0x00a4dc30, 0x02bd5dbb, 0x01d5fee4, 0x02c3b672, 0x005e2923, 0x01d0dc2f, 0x01901491, 0x029f27c4, 0x0037c2c0}}, Y: Field{[10]uint32{0x02a1099a, 0x03462900, 0x0279c6cc, 0x012ffa85, 0x01757b47, 0x004067c5, 0x00a5ad4e, 0x0166a204, 0x0105c7e1, 0x003c4cfb}}}, + {X: Field{[10]uint32{0x001a49ef, 0x02ef17f7, 0x02c8b421, 0x020d31f0, 0x020c5497, 0x0229ad8e, 0x02162a4e, 0x002f94b4, 0x03af9c1e, 0x00371bd5}}, Y: Field{[10]uint32{0x00f1a0c4, 0x01f84104, 0x0379e9e9, 0x01287064, 0x0366fca4, 0x02ce26ea, 0x02ee20d9, 0x03f97258, 0x02afe610, 0x001bd61a}}}, + {X: Field{[10]uint32{0x0255cd15, 0x00ece62c, 0x02ac4bf1, 0x00ba838f, 0x03816247, 0x02070764, 0x02dcc0fa, 0x031a4066, 0x02a2e0d2, 0x0036de5b}}, Y: Field{[10]uint32{0x0105ac88, 0x010c4f1f, 0x033e2947, 0x00810ef6, 0x02793754, 0x006478a3, 0x01e07662, 0x03ed1190, 0x02a732e1, 0x000b9831}}}, + {X: Field{[10]uint32{0x01633a2d, 0x03f8da4d, 0x023ca059, 0x01a4c2c1, 0x02881fe2, 0x01d3e233, 0x03a3efce, 0x0263f696, 0x029e72ea, 0x0015a6d9}}, Y: Field{[10]uint32{0x00ca0c8c, 0x02ddd57e, 0x00ca2f76, 0x01bffd3e, 0x02220b6a, 0x03ad78dd, 0x033f7406, 0x03e1c976, 0x02af2551, 0x002eb763}}}, + {X: Field{[10]uint32{0x00468ae4, 0x02b0ccde, 0x02451421, 0x004617f4, 0x02ec7951, 0x00b45d71, 0x036b6f0e, 0x00ceef52, 0x00201f9a, 0x000d84c9}}, Y: Field{[10]uint32{0x033c4314, 0x005863fe, 0x01dee282, 0x005c3655, 0x0262a58e, 0x011d5921, 0x02ba1351, 0x01cd99bb, 0x02cef7bc, 0x003d1ed5}}}, + {X: Field{[10]uint32{0x014a469c, 0x013b4cd2, 0x015b1b60, 0x020f24bf, 0x03855a07, 0x020b6c3f, 0x00fa2431, 0x00805246, 0x00371e4d, 0x00337ac8}}, Y: Field{[10]uint32{0x00dfa7d8, 0x031bde76, 0x03393a83, 0x03555462, 0x02970a7e, 0x0213b941, 0x010098bc, 0x00e074bf, 0x03186829, 0x001f4f1d}}}, + {X: Field{[10]uint32{0x031598ef, 0x005f3f05, 0x03755c87, 0x01d3e36d, 0x03ff6c4d, 0x037a23ff, 0x013b721a, 0x0317b003, 0x03a9d750, 0x00180d73}}, Y: Field{[10]uint32{0x03dd675a, 0x027f6d81, 0x01cb749f, 0x035f5632, 0x029bb129, 0x0120b480, 0x02dcde65, 0x0090d904, 0x00da160b, 0x003f85e6}}}, + {X: Field{[10]uint32{0x0379c0f7, 0x0279068e, 0x02ac18dc, 0x01765f64, 0x00bb250b, 0x011c5e3d, 0x0275b0c0, 0x02639383, 0x0297e499, 0x002c7d4b}}, Y: Field{[10]uint32{0x03df795f, 0x01e942b4, 0x0333d808, 0x03e04093, 0x03de484c, 0x00994717, 0x024370ca, 0x03f6317c, 0x01654e4c, 0x00360fcf}}}, + {X: Field{[10]uint32{0x01f1b641, 0x018ac85b, 0x02477d78, 0x0159094d, 0x03f1a5e0, 0x0357dc26, 0x0011395d, 0x00f6827c, 0x035304c7, 0x002a9e66}}, Y: Field{[10]uint32{0x03248646, 0x00f4b4cc, 0x03338a00, 0x001f2ef9, 0x02dd5920, 0x03ce2aa1, 0x03f68879, 0x016d9164, 0x0047b5e9, 0x000e8c9c}}}, + {X: Field{[10]uint32{0x0045aa03, 0x017a6ee9, 0x023c18d3, 0x026f7631, 0x01262d62, 0x034ce691, 0x01e56b66, 0x03d3f11e, 0x016445bd, 0x00369286}}, Y: Field{[10]uint32{0x029cb70d, 0x00fe4b2d, 0x006d563f, 0x039c9b0b, 0x02353376, 0x00d357b2, 0x02cff296, 0x018e9019, 0x02da25cc, 0x001ece97}}}, + {X: Field{[10]uint32{0x01b8d656, 0x039ccfe8, 0x0384c231, 0x011a81ec, 0x017e620d, 0x003bbc1c, 0x03eba80f, 0x01b4350c, 0x00adc234, 0x0030c02d}}, Y: Field{[10]uint32{0x03cdba42, 0x02a1dc78, 0x023566f4, 0x03691537, 0x02f73448, 0x00402e56, 0x02aa439a, 0x01eb1fcd, 0x03b948d2, 0x000c820e}}}, + {X: Field{[10]uint32{0x00359f04, 0x0162cae5, 0x02be76a3, 0x001f8833, 0x02ed64a9, 0x02437cac, 0x039bf7b0, 0x01c91358, 0x01286793, 0x00315669}}, Y: Field{[10]uint32{0x01bf5977, 0x011c3352, 0x004740d2, 0x03685659, 0x02806d78, 0x00fd10d2, 0x01671b56, 0x03260c83, 0x01aa5c08, 0x0027f2b0}}}, + {X: Field{[10]uint32{0x03e83540, 0x018ccef7, 0x015fa9b9, 0x03af4f9e, 0x01b0911c, 0x020f042c, 0x034bca9a, 0x036fd3c1, 0x01470a46, 0x000e6c40}}, Y: Field{[10]uint32{0x01308278, 0x0250658b, 0x0055e642, 0x005f458a, 0x00168da4, 0x0358cd38, 0x02aa313c, 0x009d0d36, 0x00c8c3b2, 0x002b4d77}}}, + {X: Field{[10]uint32{0x037d6d42, 0x01d2810b, 0x01d6b347, 0x00ba89de, 0x014129ab, 0x00666532, 0x00405970, 0x031805fe, 0x02b7d2de, 0x000e7272}}, Y: Field{[10]uint32{0x03781845, 0x0373a790, 0x013623af, 0x02d32012, 0x0272ca72, 0x01f77ecf, 0x00cdd453, 0x02284cd5, 0x016b835a, 0x0031cfaf}}}, + {X: Field{[10]uint32{0x02c679ed, 0x02d7bbbb, 0x01466fc7, 0x0135104c, 0x03f8f81c, 0x038863b0, 0x02c60972, 0x02d18ab7, 0x01988a30, 0x00069896}}, Y: Field{[10]uint32{0x034114ab, 0x03e3374c, 0x02037bf5, 0x0276e810, 0x033651a3, 0x03884ef5, 0x02776e62, 0x01f26efd, 0x02bb01a9, 0x001ce6fa}}}, + {X: Field{[10]uint32{0x024c4308, 0x008b7eba, 0x003bf3f4, 0x0330fbd9, 0x0085f33e, 0x03ca0ea6, 0x012761eb, 0x030c2350, 0x0110cd35, 0x000e5bb6}}, Y: Field{[10]uint32{0x004dfe57, 0x03467845, 0x01b7f556, 0x01620d9c, 0x013945e1, 0x010a91ac, 0x0048cf84, 0x01852937, 0x01a6a08a, 0x001c8737}}}, + {X: Field{[10]uint32{0x03299a47, 0x02debce6, 0x02becaf7, 0x0100978e, 0x0083e153, 0x002f60c7, 0x02ee96ab, 0x0333f652, 0x02e8a2e8, 0x00294381}}, Y: Field{[10]uint32{0x03beba52, 0x03593f8a, 0x0214f3fc, 0x0068ead7, 0x014521fc, 0x02382178, 0x01a4575e, 0x02018ff9, 0x01b259a1, 0x00164c81}}}, + {X: Field{[10]uint32{0x01c3e1de, 0x03c9adc4, 0x034a3dc3, 0x03591ba3, 0x00dbe15c, 0x00e4fe8d, 0x02c8bcf7, 0x03470398, 0x002317b0, 0x0012a7e0}}, Y: Field{[10]uint32{0x03c6bb71, 0x012faa7d, 0x015ac289, 0x030e5899, 0x00239867, 0x00d3a24a, 0x0330c244, 0x017fff36, 0x036d0091, 0x000103bf}}}, + {X: Field{[10]uint32{0x01608b73, 0x0368bf23, 0x01f055d2, 0x018957b6, 0x007f3232, 0x00bfeee2, 0x0318562e, 0x02df9842, 0x020d9dec, 0x00233978}}, Y: Field{[10]uint32{0x02c720de, 0x03da6386, 0x011b54f1, 0x02caa9c0, 0x0263f024, 0x01649c9e, 0x0292371b, 0x03859003, 0x036cf363, 0x0003ada6}}}, + {X: Field{[10]uint32{0x0083f24b, 0x009be6ed, 0x03e0a367, 0x0358dc02, 0x0184143e, 0x0295503b, 0x02525e28, 0x03a7947c, 0x01d79b53, 0x003cc9a5}}, Y: Field{[10]uint32{0x008471c8, 0x038641f0, 0x0123ef1e, 0x00587185, 0x031d81bd, 0x03f88d24, 0x012ca1f6, 0x00157d96, 0x0088eea2, 0x003a34d9}}}, + {X: Field{[10]uint32{0x02c34d07, 0x01b78775, 0x01959485, 0x02049749, 0x01d92748, 0x01b80822, 0x011ad140, 0x0164b96d, 0x01863bf6, 0x000e09bf}}, Y: Field{[10]uint32{0x03e4cc83, 0x020ec73f, 0x01e97265, 0x0006a240, 0x02020da0, 0x01ffe7e0, 0x0282058a, 0x00d71d0f, 0x01e6a290, 0x003aa1bc}}}, + {X: Field{[10]uint32{0x00ccd551, 0x01904290, 0x03ddd0dc, 0x02a263a1, 0x02ae8611, 0x03b1c9d8, 0x02098684, 0x02c3d46e, 0x00d32e32, 0x001ec6bf}}, Y: Field{[10]uint32{0x02e37884, 0x020a34f4, 0x020efc70, 0x02c2f158, 0x00a3ce0e, 0x02edb42a, 0x0036ee39, 0x0024c420, 0x02f779e1, 0x0037ae9b}}}, + {X: Field{[10]uint32{0x01a91bd4, 0x0118304d, 0x03b63348, 0x0331fdfd, 0x018deddd, 0x019a8db4, 0x00d39b1b, 0x01d61d50, 0x01fed2c2, 0x000fac7f}}, Y: Field{[10]uint32{0x026b36cb, 0x0263e5b4, 0x037b9eb8, 0x011633f3, 0x02642c53, 0x0204a99e, 0x01506cca, 0x039e5186, 0x02ca536a, 0x002e2baa}}}, + {X: Field{[10]uint32{0x0356da8f, 0x012fad66, 0x03c45c21, 0x027a406d, 0x02b71b4d, 0x020fba8b, 0x02290cb6, 0x03f17d4c, 0x02c8aae9, 0x00275876}}, Y: Field{[10]uint32{0x02446036, 0x021d8ace, 0x02271793, 0x0079e28a, 0x01280a8f, 0x0099f3a6, 0x024fc3ee, 0x02c8b9c0, 0x00a42ea1, 0x000b9f2b}}}, + {X: Field{[10]uint32{0x0211c7d8, 0x0343ab8f, 0x0239be38, 0x03bff76e, 0x02e91a43, 0x017b5551, 0x021e37a8, 0x03eaa3a3, 0x02dc3167, 0x000b6cdc}}, Y: Field{[10]uint32{0x01707ffe, 0x01b842d6, 0x023809b0, 0x00d2dc65, 0x0084f005, 0x02d67c3a, 0x0279697f, 0x02f5a85b, 0x0361bc1a, 0x0005aadb}}}, + {X: Field{[10]uint32{0x0005dc80, 0x0008f4a2, 0x000302ff, 0x019fdff1, 0x025b03dd, 0x02b4c4ca, 0x00e83cc9, 0x02d4e14e, 0x02f9f7a2, 0x00263df3}}, Y: Field{[10]uint32{0x02b98943, 0x020417eb, 0x00dd8d65, 0x034fe546, 0x01468bed, 0x03a5a85d, 0x016df891, 0x039b1af5, 0x00232813, 0x000ed03e}}}, + {X: Field{[10]uint32{0x01b62548, 0x0334657b, 0x00c7a363, 0x01853522, 0x02c48f08, 0x02a276d0, 0x01f58528, 0x00349357, 0x026cc8ab, 0x003baacb}}, Y: Field{[10]uint32{0x002649da, 0x002649f2, 0x022cc017, 0x01d100a0, 0x00523a7f, 0x03d7b7c5, 0x03e25030, 0x00ca35ca, 0x01ed65d3, 0x00181f10}}}, + {X: Field{[10]uint32{0x03db942a, 0x00d5c16c, 0x035376d9, 0x0346b69a, 0x03b7cb5e, 0x017ecc6d, 0x029a9d6c, 0x0071c0d1, 0x02ffb216, 0x002557fb}}, Y: Field{[10]uint32{0x01c0864b, 0x0123b905, 0x035a3fdf, 0x0029a0b2, 0x01283fcd, 0x029c4016, 0x039c9846, 0x030d081d, 0x0248a561, 0x002a4656}}}, + {X: Field{[10]uint32{0x00cd85a7, 0x03396b37, 0x025c9d44, 0x0376a606, 0x034db23b, 0x0336b0db, 0x008f5411, 0x03ba7b4f, 0x012d70d2, 0x00086693}}, Y: Field{[10]uint32{0x00ef53b4, 0x01593d71, 0x008e470a, 0x02a4171b, 0x013dbfdd, 0x03193df7, 0x0284aef2, 0x023b05c4, 0x01684300, 0x0019d106}}}, + {X: Field{[10]uint32{0x011ddb23, 0x010a5cbe, 0x028a5ed5, 0x01c5c8b8, 0x020d5945, 0x020b040d, 0x02f5cbd2, 0x02c584b8, 0x010d7794, 0x00125d8a}}, Y: Field{[10]uint32{0x0217ebc4, 0x001185b3, 0x03aec790, 0x00915bd5, 0x0023571c, 0x011b7144, 0x008354b4, 0x015954bf, 0x01f160fc, 0x00133f65}}}, + {X: Field{[10]uint32{0x0072b1c1, 0x0135c8ac, 0x00a4b5c4, 0x02cf0535, 0x021866e0, 0x0267d59d, 0x03b99ed5, 0x02b476ee, 0x03e0268e, 0x0011cb54}}, Y: Field{[10]uint32{0x02831232, 0x01a4fb30, 0x02db8e31, 0x00afb190, 0x01e4dfe8, 0x03659ee2, 0x02d42e31, 0x035352a3, 0x00096115, 0x003a6e70}}}, + {X: Field{[10]uint32{0x00ab18ef, 0x00c9ed1c, 0x01d50da3, 0x03ef0375, 0x003f3462, 0x0169b86c, 0x0075d617, 0x02e572be, 0x037e7a4d, 0x000a9bd6}}, Y: Field{[10]uint32{0x0259d506, 0x039f80e1, 0x033479ad, 0x013a8bcd, 0x02c9f372, 0x002c04f3, 0x01f5b78f, 0x037065f6, 0x03a392aa, 0x00246c91}}}, + {X: Field{[10]uint32{0x03146c19, 0x03e71148, 0x025ba17d, 0x00ae7441, 0x007431a6, 0x0383230f, 0x025e654f, 0x03606ed7, 0x01a3bf48, 0x00370605}}, Y: Field{[10]uint32{0x0194be8f, 0x02f7cbf5, 0x00f36d0f, 0x03dec232, 0x02d837c5, 0x01d1fbfe, 0x03e2af74, 0x0143c391, 0x029a3115, 0x003f881c}}}, + {X: Field{[10]uint32{0x00397776, 0x002db9a6, 0x03c4f1df, 0x033cf9a2, 0x00a8b47e, 0x000ffee6, 0x0295db4f, 0x03bae25e, 0x03ecad8f, 0x00239e54}}, Y: Field{[10]uint32{0x0141ac5d, 0x02c58df0, 0x01157893, 0x03f36aed, 0x0212f7c6, 0x007cc518, 0x0040a395, 0x0073109b, 0x02ef81b2, 0x00176b7c}}}, + {X: Field{[10]uint32{0x019b41a5, 0x03913304, 0x02a7472e, 0x0015b999, 0x01faf96a, 0x019a1b22, 0x0099fe1c, 0x01c92e7a, 0x026b49d5, 0x00293647}}, Y: Field{[10]uint32{0x020a4893, 0x03a77865, 0x0247414a, 0x00aae9cb, 0x02fef10b, 0x02f73f09, 0x02bb820c, 0x019263d6, 0x02150e29, 0x002af5a1}}}, + {X: Field{[10]uint32{0x0300eee9, 0x025210da, 0x0141dd02, 0x008ab2b8, 0x02754c49, 0x02383910, 0x0266dd60, 0x009ae74e, 0x01a4f3e4, 0x002e5c20}}, Y: Field{[10]uint32{0x00f153da, 0x007b5b2e, 0x024f1ea6, 0x01de38a2, 0x022c8c2f, 0x005542c4, 0x029cb641, 0x012ed2ea, 0x00839921, 0x001563db}}}, + {X: Field{[10]uint32{0x03825848, 0x00d0843e, 0x0225ea8c, 0x029ad8d2, 0x00b873a5, 0x01904b15, 0x0273c6ef, 0x026f39c2, 0x02ed8227, 0x001a20ad}}, Y: Field{[10]uint32{0x03f21b3b, 0x027852e7, 0x035aed6b, 0x002487ca, 0x031e3a3b, 0x01a27a28, 0x0279c616, 0x00f8e4ba, 0x02e9c823, 0x0031bf7b}}}, + {X: Field{[10]uint32{0x00717fe8, 0x01fb8691, 0x011a462c, 0x0202b543, 0x011a0dba, 0x013f7acf, 0x03bf11fa, 0x015c272a, 0x03311c71, 0x00271509}}, Y: Field{[10]uint32{0x01f2b045, 0x010a5d74, 0x0058d7ea, 0x01c713c8, 0x00ef4b64, 0x029dfdd8, 0x006bd40c, 0x00d16311, 0x03107816, 0x002a8106}}}, + {X: Field{[10]uint32{0x000cd32c, 0x01ccc31e, 0x015d9357, 0x005c0ec6, 0x024a5ed9, 0x00ef9637, 0x038779de, 0x01704ba0, 0x01a6776b, 0x001ce853}}, Y: Field{[10]uint32{0x02d2c49c, 0x03929c1e, 0x03a78b0c, 0x01d3332c, 0x01ceb585, 0x022fcb22, 0x0067bb7e, 0x0313569d, 0x03fde98e, 0x003101a3}}}, + {X: Field{[10]uint32{0x02af91b5, 0x01b15dad, 0x038ebfdc, 0x00d7677b, 0x028748d8, 0x039b76df, 0x01e9d261, 0x01b136eb, 0x028627d2, 0x00192228}}, Y: Field{[10]uint32{0x016d8ff3, 0x01806f4f, 0x02697b5c, 0x025416b6, 0x033c7f06, 0x0116ec1f, 0x030916a9, 0x0046462b, 0x01f0b050, 0x0009fe2c}}}, + {X: Field{[10]uint32{0x0151046c, 0x02753414, 0x0371bd8c, 0x023865e3, 0x02cca1d3, 0x01f73ef3, 0x01ee2ef4, 0x0132636e, 0x027a5b54, 0x0025951b}}, Y: Field{[10]uint32{0x01f4309d, 0x018329c1, 0x0189e841, 0x01cac984, 0x023b10f7, 0x00257260, 0x00f07d22, 0x03b3fc88, 0x032f8fe9, 0x003413f8}}}, + {X: Field{[10]uint32{0x00fecdf8, 0x0118fb63, 0x00066761, 0x01b20b4a, 0x01e76998, 0x01c808bb, 0x02cdb909, 0x02c50e80, 0x03564598, 0x002e811b}}, Y: Field{[10]uint32{0x0227250f, 0x000c8c8f, 0x01d68536, 0x00341de3, 0x023e57bc, 0x034f676a, 0x007d37c0, 0x015f0550, 0x03abd424, 0x003f1b88}}}, + {X: Field{[10]uint32{0x02d0e4ec, 0x02e02bd6, 0x027df310, 0x01fec4f2, 0x005e7655, 0x021aa081, 0x02d82ed0, 0x0329f77d, 0x0351e633, 0x000e5551}}, Y: Field{[10]uint32{0x006d3b1c, 0x021ac0a8, 0x03b4f894, 0x00f0bee6, 0x03cdb2ba, 0x03ea8fd9, 0x03df5e95, 0x03c83a5d, 0x0284f040, 0x002915ae}}}, + {X: Field{[10]uint32{0x009c22aa, 0x029a2926, 0x0317cd46, 0x035c0386, 0x01ba56b8, 0x00411b0f, 0x016c9241, 0x027f5c36, 0x00e75fef, 0x00317d54}}, Y: Field{[10]uint32{0x03ac3fa9, 0x030d8d89, 0x02cc2173, 0x010b723c, 0x038d65ea, 0x03b9f43e, 0x02a987ac, 0x02d85d55, 0x02e03aea, 0x00152160}}}, + {X: Field{[10]uint32{0x025fa050, 0x026ab35b, 0x0327eb99, 0x01d5e6c9, 0x0326d4ba, 0x03818e90, 0x000b2a0e, 0x0236ce6a, 0x0210a48d, 0x000b3305}}, Y: Field{[10]uint32{0x00348c84, 0x00fe5ffe, 0x02b70a07, 0x01a524a3, 0x03fa205d, 0x01e79610, 0x01cb17b1, 0x0000b023, 0x03db2114, 0x00379b75}}}, + {X: Field{[10]uint32{0x03084b3f, 0x0227843d, 0x012c5add, 0x03e3f9ba, 0x003ae59c, 0x03639919, 0x00089ff2, 0x00721079, 0x00e73e94, 0x0024ec1f}}, Y: Field{[10]uint32{0x0018fa63, 0x02a03910, 0x03634cb5, 0x03fb8634, 0x02533efc, 0x018a686b, 0x02c362d3, 0x0099f953, 0x0076c5a7, 0x00029b01}}}, + {X: Field{[10]uint32{0x0291e7e9, 0x03015996, 0x03a3e438, 0x001d872e, 0x02b0ec27, 0x01a166c5, 0x03aeec82, 0x0119e578, 0x01f055c1, 0x00114f00}}, Y: Field{[10]uint32{0x016766b2, 0x016f1269, 0x033d9874, 0x026794b9, 0x030e14ac, 0x00221096, 0x03738436, 0x032288bb, 0x02c9b9d3, 0x003ca3ab}}}, + {X: Field{[10]uint32{0x000f12f1, 0x0359197a, 0x027946f8, 0x013012a5, 0x00c1d09a, 0x0055656e, 0x02148fad, 0x0230a282, 0x01fdac07, 0x000f1b7c}}, Y: Field{[10]uint32{0x02a5b58d, 0x033c99e0, 0x0354f6df, 0x01700542, 0x02d443db, 0x039fb4a4, 0x02a68212, 0x004d2e81, 0x004d4eaa, 0x0011866a}}}, + {X: Field{[10]uint32{0x01b98630, 0x033160c4, 0x02fd600d, 0x03e49c17, 0x03f12054, 0x0240836f, 0x01429895, 0x025e14c1, 0x01683995, 0x0006dfda}}, Y: Field{[10]uint32{0x00645c25, 0x03670803, 0x00a37372, 0x00574305, 0x0067ee9e, 0x0223b1bc, 0x01731c9b, 0x03ea33ef, 0x023ee3e8, 0x0009e771}}}, + {X: Field{[10]uint32{0x03fccc19, 0x03610bef, 0x0300697a, 0x03da7340, 0x006256f2, 0x013489db, 0x010a6427, 0x0342e66e, 0x01539d49, 0x00386dee}}, Y: Field{[10]uint32{0x01f9500f, 0x03763435, 0x03316fd0, 0x036c9fe4, 0x00f2acfe, 0x027a054d, 0x004628b1, 0x0195a614, 0x016f51dc, 0x000ac8ee}}}, + {X: Field{[10]uint32{0x0354f911, 0x0205f22b, 0x012bf4bc, 0x017e9588, 0x039ce552, 0x02a5d193, 0x015f79bb, 0x0108cd2f, 0x00c56fbf, 0x0010133c}}, Y: Field{[10]uint32{0x031ef662, 0x00b29907, 0x03c0f2e2, 0x02d5e625, 0x02023c04, 0x0178d95e, 0x021a6e07, 0x00162171, 0x02098830, 0x002d6481}}}, + {X: Field{[10]uint32{0x00aae0c1, 0x038bb243, 0x0171f43f, 0x03b05faa, 0x00e7819a, 0x00268d10, 0x02e817fa, 0x01af63bf, 0x0186da62, 0x0010fc76}}, Y: Field{[10]uint32{0x0274f9ad, 0x028802ca, 0x03583e51, 0x00e0acea, 0x033e93f4, 0x005d45e7, 0x0011f518, 0x0246ab4a, 0x02ce0ce8, 0x00317e96}}}, + {X: Field{[10]uint32{0x005b9c1f, 0x03b2bd83, 0x028fcd23, 0x03a2d9fb, 0x027bbcaa, 0x02dd8844, 0x02183b81, 0x0265445a, 0x01c6b320, 0x00286211}}, Y: Field{[10]uint32{0x03ef1f44, 0x030a546e, 0x03b02dfc, 0x03c573ae, 0x038f54e7, 0x020619c6, 0x03c5350e, 0x01f9acb3, 0x01d9d7e0, 0x002603b5}}}, + {X: Field{[10]uint32{0x03ac01ed, 0x00124839, 0x015aa2a3, 0x02b7009b, 0x00254c38, 0x000f24a7, 0x01cc17be, 0x02609181, 0x03eb0af9, 0x00013671}}, Y: Field{[10]uint32{0x03e781d3, 0x01070654, 0x031c970d, 0x02e67ea6, 0x0097065b, 0x00cd83dd, 0x033cf00f, 0x03394c89, 0x0335bb0d, 0x00319316}}}, + {X: Field{[10]uint32{0x03e7c25d, 0x03ab7225, 0x00814eda, 0x03dc1319, 0x0155953e, 0x03a2a981, 0x01317833, 0x036c26f3, 0x02f2fbc3, 0x00386348}}, Y: Field{[10]uint32{0x03c7e07e, 0x03ca88bb, 0x00b5953e, 0x02ca15c0, 0x000f15b8, 0x032aa1c0, 0x037989df, 0x0081c893, 0x02817115, 0x00330962}}}, + {X: Field{[10]uint32{0x0247879d, 0x02f6f94a, 0x03d5a3c8, 0x029e6f0d, 0x0035083a, 0x030505fa, 0x02ec9a60, 0x02413e34, 0x01f9f220, 0x0005815d}}, Y: Field{[10]uint32{0x0279a5e5, 0x0157e4d4, 0x034ce0d6, 0x012cc274, 0x012c3870, 0x0350e7fb, 0x0191c60a, 0x025e3504, 0x00a6127e, 0x000795ad}}}, + {X: Field{[10]uint32{0x0192d514, 0x0280dc94, 0x03e53f9a, 0x01aa850d, 0x034c3c9f, 0x00f14d56, 0x02b7ebdd, 0x03589935, 0x03c757b1, 0x000ed946}}, Y: Field{[10]uint32{0x00231c3f, 0x015861a0, 0x022e419e, 0x01682287, 0x025feb28, 0x03722927, 0x031d8ec5, 0x000c483f, 0x03749599, 0x0025dea1}}}, + {X: Field{[10]uint32{0x02ba532a, 0x01e6a3c5, 0x03b0cd95, 0x02587f5a, 0x02a9660e, 0x0262aca1, 0x00250154, 0x033009d8, 0x01ef56fa, 0x0024216f}}, Y: Field{[10]uint32{0x02e9fe89, 0x01443c5e, 0x013b8c55, 0x005a3dae, 0x0368364c, 0x003a039e, 0x03f791d9, 0x01567179, 0x0108a557, 0x003f4174}}}, + {X: Field{[10]uint32{0x000569ec, 0x01151239, 0x00c21fef, 0x0095db87, 0x0067cf1b, 0x007c2b3a, 0x033aab8c, 0x00e18bf4, 0x006df64a, 0x0010890c}}, Y: Field{[10]uint32{0x020661bc, 0x004f563d, 0x032498bd, 0x0257fe59, 0x0063e723, 0x016790b9, 0x0087c2dc, 0x02f0773a, 0x02675279, 0x0021d02d}}}, + {X: Field{[10]uint32{0x0022935c, 0x00f28d77, 0x009182f8, 0x0303fd68, 0x02e0e2b2, 0x02f157b9, 0x03806b35, 0x00b8c69b, 0x02974a51, 0x002dcdd9}}, Y: Field{[10]uint32{0x01420103, 0x00a820a1, 0x0046251c, 0x000e75a2, 0x01890b3e, 0x023f572f, 0x00152a24, 0x03eb7bb9, 0x00202676, 0x0034d432}}}, + {X: Field{[10]uint32{0x010eb97a, 0x01093693, 0x01574557, 0x01a32ea0, 0x02bb82e0, 0x03069d21, 0x00505ab1, 0x0353429f, 0x038ed3b5, 0x001cee93}}, Y: Field{[10]uint32{0x02188271, 0x0292ff89, 0x01215adc, 0x026dc950, 0x013a58ba, 0x0218f4fe, 0x01b4a2d0, 0x030d8152, 0x0114552d, 0x0024ebce}}}, + {X: Field{[10]uint32{0x03d3d8ea, 0x012f80db, 0x01bef052, 0x0101af38, 0x020ae935, 0x01a52c14, 0x00576c45, 0x0093663c, 0x014e1747, 0x000a1680}}, Y: Field{[10]uint32{0x029af7dc, 0x00f9f21a, 0x028cab39, 0x01965a33, 0x039d4067, 0x0247536d, 0x03f5213f, 0x01dd5f9b, 0x01d8d2ce, 0x001bf6b4}}}, + {X: Field{[10]uint32{0x028e768f, 0x021a77b0, 0x01180963, 0x01e3b283, 0x0384c2fd, 0x01be302a, 0x025cea7c, 0x02d52e8a, 0x01d727bf, 0x002c24d3}}, Y: Field{[10]uint32{0x00b982c6, 0x01c2763c, 0x031bf2bc, 0x03df4535, 0x03484c94, 0x036c2644, 0x02bbb26e, 0x027cc52f, 0x01115602, 0x00372bc3}}}, + {X: Field{[10]uint32{0x03681561, 0x032303d6, 0x0365ec45, 0x033cd5ee, 0x02ffcb49, 0x03bc5742, 0x011c8bcc, 0x02a772dd, 0x02dd8b69, 0x000ed89e}}, Y: Field{[10]uint32{0x0046d19d, 0x00a5bf37, 0x015e1536, 0x02ee9dc8, 0x03693cd2, 0x0349f3fd, 0x02133649, 0x0202dcb6, 0x018009e3, 0x0002f686}}}, + {X: Field{[10]uint32{0x02cb5ac2, 0x00a8da54, 0x027c90a6, 0x01d9722a, 0x02e45938, 0x011d9b6a, 0x012e3f9a, 0x02277e81, 0x01ec1f22, 0x001f923f}}, Y: Field{[10]uint32{0x018cb5f2, 0x00e12e6f, 0x039ac61e, 0x023984a4, 0x0168449b, 0x02fb6d27, 0x021e10c5, 0x01a2159b, 0x007aac11, 0x003a1ebe}}}, + {X: Field{[10]uint32{0x023ffd9d, 0x03390f89, 0x0008b181, 0x02432a84, 0x00d094d8, 0x03bb0b90, 0x022c267f, 0x00eeeada, 0x008a5de3, 0x00100c7c}}, Y: Field{[10]uint32{0x01b0be07, 0x026dfc14, 0x006b58a7, 0x038c46e5, 0x01a8f23b, 0x0077fbd1, 0x0389beb9, 0x0297c269, 0x03d99737, 0x0033f713}}}, + {X: Field{[10]uint32{0x031ed764, 0x001fafe4, 0x00b1dd54, 0x00b1ee40, 0x00ec00a2, 0x03510730, 0x02e656f4, 0x036ed6fd, 0x037c61dd, 0x002e994a}}, Y: Field{[10]uint32{0x00029556, 0x011341c0, 0x00088a3b, 0x02566964, 0x001d2070, 0x00f19f80, 0x030b5d8d, 0x02055a8c, 0x0392d122, 0x0021ff2c}}}, + {X: Field{[10]uint32{0x0190e72d, 0x0307b419, 0x03b1bffd, 0x02e6e834, 0x0362c967, 0x03630c3c, 0x03dd95d2, 0x01d94eb1, 0x0172d101, 0x003ee4d9}}, Y: Field{[10]uint32{0x0036d8ed, 0x01e62092, 0x00587b08, 0x0119ad29, 0x02940382, 0x02562f8b, 0x03799659, 0x01a8c429, 0x03afdb6b, 0x002b7e8d}}}, + {X: Field{[10]uint32{0x003bae7b, 0x02621c2c, 0x01148991, 0x00a065a1, 0x01b97ff3, 0x021844a7, 0x006fdb78, 0x00214bdf, 0x03cb5e7c, 0x000a511c}}, Y: Field{[10]uint32{0x0190c86a, 0x03bb0e1f, 0x03617246, 0x0169b1d9, 0x0078463e, 0x02f56d28, 0x0209f951, 0x0219e9e2, 0x0136f991, 0x002f6415}}}, + {X: Field{[10]uint32{0x01bc574e, 0x01b21cf1, 0x00c0944a, 0x0231b4e9, 0x007687dc, 0x01a0edd3, 0x0337ced1, 0x00cff645, 0x004f73a6, 0x000bf03d}}, Y: Field{[10]uint32{0x0122ad1f, 0x001cd507, 0x0118415e, 0x01426914, 0x03ac572f, 0x02b8dcfa, 0x01499912, 0x018fe53a, 0x00eeffa0, 0x000a645f}}}, + {X: Field{[10]uint32{0x016d569e, 0x03009444, 0x00c40b9a, 0x03720eee, 0x018da210, 0x023b628c, 0x01d34f2c, 0x0169fbd6, 0x0251882c, 0x002047ec}}, Y: Field{[10]uint32{0x00a0c55d, 0x02464636, 0x00c00ad2, 0x001c170f, 0x02d480e4, 0x0250379a, 0x0204ad3f, 0x016be93b, 0x01472cb5, 0x001d37d9}}}, + {X: Field{[10]uint32{0x03fc5d07, 0x01f9852d, 0x0057ba9e, 0x03160bf7, 0x03c47996, 0x03539f94, 0x0051894a, 0x033c247d, 0x017cc1d6, 0x00116a78}}, Y: Field{[10]uint32{0x03069be1, 0x0072ab5e, 0x01bbb16d, 0x01b70dff, 0x034e1919, 0x02260cad, 0x02d19200, 0x0187d7ec, 0x004f0026, 0x00145a77}}}, + {X: Field{[10]uint32{0x01588e67, 0x03426bad, 0x00102645, 0x00e2de30, 0x00abd065, 0x02d71ef5, 0x003d96aa, 0x029eb51d, 0x03fc45cd, 0x00355dfd}}, Y: Field{[10]uint32{0x003be07a, 0x001c4a0c, 0x0125e521, 0x00b0c2ff, 0x02765e2c, 0x0231e33a, 0x011db618, 0x015f7f3b, 0x03717ea2, 0x001545ca}}}, + {X: Field{[10]uint32{0x0306e44f, 0x03846c66, 0x019c0650, 0x022ddde9, 0x024fb22d, 0x012c33bf, 0x0371e08d, 0x02a9b8e6, 0x02958098, 0x002990a6}}, Y: Field{[10]uint32{0x007dd2ed, 0x02992c65, 0x027dcf6a, 0x0097cb0e, 0x0336ab18, 0x0218902a, 0x00440f57, 0x0015772b, 0x02625587, 0x002bd253}}}, + {X: Field{[10]uint32{0x039a743d, 0x025a59e8, 0x00679073, 0x01e98f88, 0x0050bca3, 0x03d1e3ba, 0x00b1c80c, 0x0052d096, 0x0304b893, 0x0003ddf0}}, Y: Field{[10]uint32{0x01c1c7ee, 0x0218dfe3, 0x02c727e7, 0x00515638, 0x011c32f4, 0x003d03c6, 0x00452136, 0x0052f982, 0x017629d9, 0x003121e8}}}, + {X: Field{[10]uint32{0x02d1c988, 0x01985965, 0x01f5def7, 0x00bfecbe, 0x02cd76ea, 0x007b7b7a, 0x03f0a82e, 0x00491dc7, 0x02f61598, 0x001071bc}}, Y: Field{[10]uint32{0x01accb68, 0x02d4aa41, 0x031d3407, 0x0039176f, 0x02364277, 0x026da1f1, 0x039ed4ff, 0x00681d7f, 0x0144146c, 0x0016283d}}}, + {X: Field{[10]uint32{0x02b968d0, 0x019bb4cb, 0x01916cdf, 0x035c7f6d, 0x037ac2d2, 0x015d978f, 0x02aaacb3, 0x00debc27, 0x02c8c13d, 0x00321c93}}, Y: Field{[10]uint32{0x00d81221, 0x03495791, 0x029895ec, 0x03b69e18, 0x026ade66, 0x00af669b, 0x014bbf24, 0x00f9b79f, 0x03214210, 0x001c3b3d}}}, + {X: Field{[10]uint32{0x031fbbf2, 0x02ea7cff, 0x00650653, 0x012b81c3, 0x023b139e, 0x01d7ead9, 0x02204a2b, 0x0238daf8, 0x00460dd5, 0x0038a223}}, Y: Field{[10]uint32{0x0342509e, 0x00acd4c8, 0x0108c331, 0x02625488, 0x01bc1584, 0x0082f580, 0x01888797, 0x00ee2adf, 0x00dae139, 0x001c5644}}}, + {X: Field{[10]uint32{0x02d834dd, 0x02b0dbd9, 0x01ec1c14, 0x00d847aa, 0x01f56cf7, 0x02a99be6, 0x01999c9a, 0x0202e1ad, 0x0384d72d, 0x003c7d30}}, Y: Field{[10]uint32{0x00cc7e3f, 0x039cdd49, 0x03c44835, 0x0229a5ac, 0x02219838, 0x0326a9e1, 0x038527a3, 0x010b23ae, 0x03c24801, 0x002d550e}}}, + {X: Field{[10]uint32{0x01940a5b, 0x0204ad0c, 0x01e73f61, 0x0298d067, 0x0217aec3, 0x03b75fd6, 0x028d4126, 0x02df6c1d, 0x03f5832f, 0x00121d1d}}, Y: Field{[10]uint32{0x032608a7, 0x01e35786, 0x03c54c5f, 0x0158db6d, 0x020284f5, 0x00a9b55a, 0x004e3dc3, 0x03ea62f1, 0x01de4203, 0x00240c8b}}}, + {X: Field{[10]uint32{0x00ca75af, 0x02bc0dc5, 0x0229bff8, 0x000a7f84, 0x010c55df, 0x02cfba7d, 0x00f957e0, 0x019f892e, 0x023a5831, 0x0029c9a5}}, Y: Field{[10]uint32{0x008f7449, 0x01945b70, 0x0232d99f, 0x00954e96, 0x034a6369, 0x02d9507f, 0x0154d156, 0x00a70204, 0x0184d689, 0x0023f5ea}}}, + {X: Field{[10]uint32{0x0399e97c, 0x00ab16e2, 0x03033876, 0x030b8804, 0x00baa763, 0x01a669a3, 0x013a231e, 0x03ac7276, 0x01b4cf80, 0x00353083}}, Y: Field{[10]uint32{0x00eca01f, 0x031be7db, 0x0287a426, 0x00381624, 0x01f5abc5, 0x0246428d, 0x02a20713, 0x02943212, 0x03ba2555, 0x002e871d}}}, + {X: Field{[10]uint32{0x02748168, 0x027bf88e, 0x03afafa5, 0x0076b15b, 0x025159ba, 0x036343cd, 0x01b5a55a, 0x01c0aefb, 0x005389ae, 0x0001f3e7}}, Y: Field{[10]uint32{0x032336b8, 0x00e140ad, 0x0296f6ec, 0x0029ba90, 0x03489bee, 0x00c4d23b, 0x00ec347c, 0x01eef28b, 0x0324338c, 0x003b38ec}}}, + {X: Field{[10]uint32{0x00b73e55, 0x009506d1, 0x02f49699, 0x00ced36e, 0x03eec928, 0x00c9a01b, 0x039f9c30, 0x0352bce5, 0x00e3c1eb, 0x00248042}}, Y: Field{[10]uint32{0x01f466fc, 0x00b88025, 0x01395ba9, 0x01e1493d, 0x016cf8f4, 0x02e92399, 0x003f348e, 0x03120d3c, 0x0133d8ad, 0x000f88ac}}}, + {X: Field{[10]uint32{0x02479e90, 0x02da7109, 0x02a8a4fe, 0x00e12559, 0x03fc7605, 0x02b4ca94, 0x03613372, 0x021d8a6c, 0x038a98c4, 0x000559ab}}, Y: Field{[10]uint32{0x02997796, 0x02a145b6, 0x03926dab, 0x02ebacfd, 0x030da5d3, 0x00bf871e, 0x017db986, 0x00af931e, 0x01664bd7, 0x000a1231}}}, + {X: Field{[10]uint32{0x0361723c, 0x01daaf2b, 0x03044c0f, 0x02f89c7b, 0x01d2f6d9, 0x00ac2a2c, 0x017a7041, 0x0233af1f, 0x027102eb, 0x002936d7}}, Y: Field{[10]uint32{0x002e8ca4, 0x023232b1, 0x036a5695, 0x00abcae7, 0x03272f5f, 0x01ea501e, 0x004bc0a2, 0x00f777d8, 0x02e075a7, 0x00198f85}}}, + {X: Field{[10]uint32{0x0153e5fb, 0x00ef29e3, 0x00c13849, 0x01dd81de, 0x0333d90e, 0x031e73c6, 0x025d1106, 0x02e3e418, 0x03538bbd, 0x00343273}}, Y: Field{[10]uint32{0x021d9a60, 0x01e418e2, 0x01bd9683, 0x02201f70, 0x009975ad, 0x02e2f4c3, 0x00a21250, 0x03501f30, 0x020e8b9f, 0x002dbb33}}}, + {X: Field{[10]uint32{0x03d8391f, 0x01f39e3f, 0x0204ce65, 0x0051538e, 0x014a58d5, 0x033ce8e2, 0x0196d67b, 0x015ef5c1, 0x0292480f, 0x001d97ee}}, Y: Field{[10]uint32{0x0218302f, 0x03b24087, 0x023dbaf6, 0x02f57ceb, 0x0050879b, 0x03d06ad3, 0x03b552e3, 0x00d43968, 0x03ba1035, 0x00172c76}}}, + {X: Field{[10]uint32{0x03fb4a5e, 0x007b9be2, 0x025032c5, 0x02396bd2, 0x009bd3f8, 0x022d94be, 0x02a7b9b6, 0x01c0ad2a, 0x01e8e846, 0x0027e76a}}, Y: Field{[10]uint32{0x0296a0f6, 0x028b5fd5, 0x0284dedf, 0x02374b01, 0x021d8da0, 0x001a22b2, 0x017320ca, 0x005ec3ac, 0x019d7ecf, 0x00176f52}}}, + {X: Field{[10]uint32{0x03fdd3f4, 0x02480884, 0x025bfb11, 0x0272d196, 0x00ad949c, 0x006bbd7c, 0x03b1a166, 0x02252dcb, 0x003bdb95, 0x002be1b2}}, Y: Field{[10]uint32{0x0399e117, 0x03cf04b5, 0x00e55123, 0x02e6c6e2, 0x03004a7b, 0x0310709b, 0x03d2b25c, 0x00046580, 0x027d5541, 0x003b01a0}}}, + {X: Field{[10]uint32{0x01587e77, 0x03e8d43f, 0x0309cd94, 0x02c8b32e, 0x0364c8e3, 0x0202f8ce, 0x032b3fcc, 0x02f2341d, 0x01932fcc, 0x003eed22}}, Y: Field{[10]uint32{0x00c0b858, 0x0046db36, 0x03e04811, 0x035095ee, 0x0258598a, 0x00d01d69, 0x0051abd6, 0x00cf6acd, 0x01242793, 0x0003e737}}}, + {X: Field{[10]uint32{0x02d60684, 0x03b7079f, 0x0269bae6, 0x03e242a4, 0x00621f36, 0x00ab7270, 0x0315ecae, 0x030abd8a, 0x01a3ad97, 0x00103b2c}}, Y: Field{[10]uint32{0x0158b32e, 0x02a8014d, 0x005f288d, 0x02cfb661, 0x019a41f4, 0x008c07ee, 0x00e3e2b3, 0x0185f648, 0x0194fa3a, 0x003fe7b0}}}, + {X: Field{[10]uint32{0x00878f52, 0x01802706, 0x03691973, 0x00c31f4e, 0x0339873c, 0x03f808e3, 0x03d9014b, 0x00ad0bf2, 0x02f10c76, 0x000c7e24}}, Y: Field{[10]uint32{0x01718c95, 0x00d9cd25, 0x03ff7be5, 0x02e3df53, 0x015cd610, 0x03dae4b0, 0x0131066e, 0x01cd154c, 0x0005f31f, 0x00366f54}}}, + {X: Field{[10]uint32{0x00886c5c, 0x025bf209, 0x028f31c6, 0x024e32ad, 0x03921f81, 0x0175dce7, 0x014d150c, 0x001478b6, 0x0129e9f6, 0x002e8489}}, Y: Field{[10]uint32{0x016b1ed1, 0x01c926a1, 0x03c20d9c, 0x02730e5a, 0x007c0285, 0x01eb2708, 0x00577d33, 0x0354e46c, 0x031f7e9b, 0x0030cf01}}}, + {X: Field{[10]uint32{0x0124cf03, 0x030857ca, 0x018c5030, 0x024f5605, 0x03ef45d9, 0x02e68098, 0x013ecbc5, 0x034c4726, 0x00129a26, 0x000d4c59}}, Y: Field{[10]uint32{0x023a9742, 0x031b4d5e, 0x00e3f6a9, 0x01be460d, 0x03f92ef0, 0x016d8e16, 0x023e2d9c, 0x008eee73, 0x00d95216, 0x0021a988}}}, + {X: Field{[10]uint32{0x02c8e462, 0x00628854, 0x033ebf97, 0x02b1e146, 0x004a4aa7, 0x013b1fe7, 0x02ce92ca, 0x012a98d7, 0x030be413, 0x000c091d}}, Y: Field{[10]uint32{0x03c8c8ee, 0x03ac143f, 0x01225bbc, 0x02abe063, 0x00ab3f8f, 0x039ce139, 0x01c1579c, 0x01ebf85b, 0x03bd7214, 0x0007f3eb}}}, + {X: Field{[10]uint32{0x03da6564, 0x0340721a, 0x0071a672, 0x02993742, 0x02533c1b, 0x02507638, 0x02dbf169, 0x03a1b16d, 0x013da40e, 0x003d6e8c}}, Y: Field{[10]uint32{0x0000647d, 0x012eeb6e, 0x018c7294, 0x02090dfd, 0x018f9652, 0x01555d92, 0x02e95ec1, 0x01e41f25, 0x010db969, 0x000042a4}}}, + {X: Field{[10]uint32{0x0264e2f1, 0x02d6715c, 0x018ebb33, 0x00f84cb0, 0x00e485a2, 0x00632546, 0x037f426b, 0x033414d3, 0x03e2972c, 0x001a1785}}, Y: Field{[10]uint32{0x01f291c6, 0x000513ae, 0x03a0cb93, 0x00b77a83, 0x03470fd4, 0x00455b6b, 0x03a3f475, 0x02ab069d, 0x0338be84, 0x00259516}}}, + {X: Field{[10]uint32{0x03f119eb, 0x03d97466, 0x028e0504, 0x03718749, 0x01fdd481, 0x03a4701f, 0x01e1bca7, 0x02608a96, 0x01fdfacc, 0x003804a1}}, Y: Field{[10]uint32{0x01c39909, 0x01f5b967, 0x010630f7, 0x01790719, 0x0140bf5b, 0x01c80ae6, 0x003615ba, 0x036aebbe, 0x013a2479, 0x002ba085}}}, + {X: Field{[10]uint32{0x01839601, 0x00872c15, 0x03220b54, 0x024dd8d7, 0x0093798a, 0x024c8079, 0x00d67200, 0x0043b1e1, 0x01863277, 0x00318791}}, Y: Field{[10]uint32{0x006c04ea, 0x02e32c9d, 0x0026dcde, 0x03c5d0cf, 0x025d42fc, 0x02e95572, 0x023e0163, 0x01939e87, 0x03f5aa5b, 0x0039187e}}}, + {X: Field{[10]uint32{0x03d192d4, 0x01f597c7, 0x01af3be8, 0x00d2400a, 0x013106fc, 0x004ed876, 0x00d8ca25, 0x0242db89, 0x02cb4e58, 0x0007109e}}, Y: Field{[10]uint32{0x02cf29d0, 0x03b0310d, 0x023e9c9c, 0x0357ba2b, 0x0184935a, 0x030d0c28, 0x0304fa6e, 0x014a2e6e, 0x00251518, 0x000765b8}}}, + {X: Field{[10]uint32{0x012fd8e7, 0x037dbc7c, 0x02f54431, 0x0066d660, 0x005a9326, 0x01f51c2e, 0x02ddb3ba, 0x0225ed2d, 0x03fd6d51, 0x001795de}}, Y: Field{[10]uint32{0x011c6eb4, 0x03535e48, 0x01ff9203, 0x01131eb4, 0x00123cb0, 0x02969ff4, 0x0036e908, 0x030674ea, 0x02929734, 0x0030685c}}}, + {X: Field{[10]uint32{0x00237b30, 0x00ed028a, 0x028a6817, 0x01d9b4fa, 0x02adc6ae, 0x03ef2b7c, 0x03aefc8d, 0x022902eb, 0x03331f96, 0x00331e2c}}, Y: Field{[10]uint32{0x01857d42, 0x02c29011, 0x038aa14e, 0x01f250db, 0x00dfc2ce, 0x0048e32d, 0x01ef04b4, 0x0301a3fc, 0x01b20a5b, 0x0016dda4}}}, + {X: Field{[10]uint32{0x00919fb6, 0x020c293b, 0x0016a0b1, 0x00aa56b7, 0x02c44537, 0x02bcfb3a, 0x01dc288f, 0x0113ca79, 0x0037487b, 0x000e1571}}, Y: Field{[10]uint32{0x009359d2, 0x00a1f20a, 0x0151911c, 0x03d7868e, 0x01ed1949, 0x0022f6f5, 0x03bcd5b3, 0x03e8a153, 0x029a48cb, 0x0037cb87}}}, + {X: Field{[10]uint32{0x01d16b19, 0x016119ae, 0x03c928f1, 0x0086df79, 0x00dc62cb, 0x01f6cf5b, 0x03fcf6b9, 0x00d5bf17, 0x03b40a83, 0x0030148c}}, Y: Field{[10]uint32{0x0254f500, 0x038efde7, 0x0327525e, 0x03d4588c, 0x00956616, 0x007a3795, 0x020eac65, 0x02211cfe, 0x02390ce7, 0x0002c6f6}}}, + {X: Field{[10]uint32{0x019dfffb, 0x039f7b02, 0x0010b455, 0x00799586, 0x010b736c, 0x02407cd5, 0x02000245, 0x009a9f66, 0x013cf342, 0x001b0193}}, Y: Field{[10]uint32{0x009eb9a7, 0x02093358, 0x002e9925, 0x01dca349, 0x02aa5444, 0x0071710b, 0x00f8fd2a, 0x030687e0, 0x0042d25e, 0x00058365}}}, + {X: Field{[10]uint32{0x03714cf2, 0x01eea762, 0x01009bf3, 0x01c91e27, 0x01b3e207, 0x00379a9f, 0x021a93a0, 0x006a946d, 0x038970bb, 0x0025963a}}, Y: Field{[10]uint32{0x02c51cc2, 0x00c07aa4, 0x01ff7a58, 0x012665f5, 0x0096be89, 0x01036278, 0x021a903f, 0x023e2de0, 0x00aff7da, 0x003352e9}}}, + {X: Field{[10]uint32{0x03b4f0c8, 0x039fa992, 0x031b87a3, 0x01a69c70, 0x035cf1f9, 0x00fe65bd, 0x032b0c4c, 0x01bdc247, 0x0110a554, 0x001b808e}}, Y: Field{[10]uint32{0x00c459c5, 0x026b76cd, 0x0358999b, 0x00d99470, 0x007faa9b, 0x0362486e, 0x02d8cfc7, 0x01cd3767, 0x01d790ec, 0x003dbb59}}}, + {X: Field{[10]uint32{0x00c7ff6e, 0x023e2655, 0x03a141e6, 0x006f5831, 0x03926290, 0x00cc14df, 0x003528e0, 0x001267e4, 0x0098e970, 0x000e8d6b}}, Y: Field{[10]uint32{0x032069ed, 0x00e36865, 0x00eb6c4d, 0x03e29d91, 0x001f247f, 0x03b68e09, 0x014ac0c9, 0x0070c14e, 0x0116da63, 0x00244f65}}}, + {X: Field{[10]uint32{0x036af212, 0x014395c1, 0x023db073, 0x01bc925d, 0x022317c6, 0x02c6522f, 0x036def30, 0x02a916a2, 0x025115df, 0x0034227e}}, Y: Field{[10]uint32{0x00a6da9c, 0x03f720c6, 0x00f6ab12, 0x02b12864, 0x03a18e5d, 0x00ffe844, 0x025120cf, 0x03eb11de, 0x0173f326, 0x00139aba}}}, + {X: Field{[10]uint32{0x018cf2ef, 0x02ecb083, 0x036ab045, 0x0357de42, 0x005b9cd9, 0x00f654c7, 0x00ea0f23, 0x00aad1d2, 0x012f2aa6, 0x0039ccf1}}, Y: Field{[10]uint32{0x0182a291, 0x00377c75, 0x02d89fb8, 0x0215c314, 0x0336ac48, 0x035ffdd4, 0x0323ab28, 0x01ca4eb2, 0x01c93c67, 0x001c0455}}}, + {X: Field{[10]uint32{0x03f14c7a, 0x02bdd8f9, 0x01b9be8c, 0x002ee065, 0x021eb477, 0x00aeafe1, 0x00aa6f24, 0x01a13f99, 0x037dc006, 0x0012dbde}}, Y: Field{[10]uint32{0x0194e00d, 0x01917ac8, 0x01d5a2b0, 0x001763c8, 0x017bfaea, 0x014e8132, 0x01805d8a, 0x01eccc30, 0x0380ac75, 0x001b162d}}}, + {X: Field{[10]uint32{0x0267f79d, 0x009b97f8, 0x038b4811, 0x0308ed1d, 0x0344ff51, 0x03154b9c, 0x00d7aeb8, 0x02b02831, 0x0002cd1f, 0x0006d481}}, Y: Field{[10]uint32{0x03db1a39, 0x03b0dd4d, 0x013c19e8, 0x03c424f6, 0x0030b252, 0x026b7536, 0x004ee943, 0x024c1283, 0x01005664, 0x00023b83}}}, + {X: Field{[10]uint32{0x017139b1, 0x02bcafae, 0x024f5bf9, 0x00fd0f61, 0x023400cc, 0x022a2179, 0x02da4c63, 0x03b617f0, 0x02d5d7f1, 0x00224db9}}, Y: Field{[10]uint32{0x029b402b, 0x00ac1060, 0x03c4778d, 0x005e96f5, 0x018879f2, 0x03f4c989, 0x00cdc8a6, 0x00ca8ddc, 0x0220b4b9, 0x000a604a}}}, + {X: Field{[10]uint32{0x016b518f, 0x00441172, 0x021eec4f, 0x01bd6e86, 0x01aebd39, 0x0157645c, 0x036c043a, 0x015536a8, 0x027f4813, 0x001a022b}}, Y: Field{[10]uint32{0x00425810, 0x0264e967, 0x01c2231b, 0x020df1d2, 0x00f581b9, 0x03d055d7, 0x00e85fd5, 0x0237715e, 0x026e8872, 0x001abf2b}}}, + {X: Field{[10]uint32{0x01a2cd1c, 0x01e4928d, 0x0310f236, 0x024d56a6, 0x0193e232, 0x00076002, 0x011bba76, 0x00fd9848, 0x029444c7, 0x00161b19}}, Y: Field{[10]uint32{0x025416c7, 0x0004ab3f, 0x031c8862, 0x0377bc19, 0x03873537, 0x00df2df1, 0x00f5507d, 0x028f2d02, 0x001ff6eb, 0x001d2c24}}}, + {X: Field{[10]uint32{0x03f89e11, 0x025efa07, 0x0066b078, 0x02966733, 0x020b183a, 0x02461507, 0x0388453e, 0x03c78131, 0x025ddead, 0x001e2720}}, Y: Field{[10]uint32{0x006cb5ab, 0x01e24e39, 0x0103cb8f, 0x015fffa6, 0x03e40cc3, 0x027e62a6, 0x027480b8, 0x02c4f1af, 0x026f641b, 0x002041aa}}}, + {X: Field{[10]uint32{0x01419797, 0x01f3efaa, 0x02076acd, 0x01bb8763, 0x02e52042, 0x01fd92f2, 0x00d0ddf9, 0x03ea9988, 0x00bbfd26, 0x0035eae0}}, Y: Field{[10]uint32{0x00c5a823, 0x02114de4, 0x02efbc71, 0x022e7ccb, 0x026e50a5, 0x004e7453, 0x034a85f5, 0x02c40ebb, 0x0372a6d1, 0x0009abe7}}}, + {X: Field{[10]uint32{0x02f67f7f, 0x015b4bcd, 0x033154c2, 0x00cf280a, 0x00bddf0f, 0x007af106, 0x012b311b, 0x006ae118, 0x02d44daf, 0x00063dc4}}, Y: Field{[10]uint32{0x037d25bc, 0x026f6981, 0x03ee9f2d, 0x034c8574, 0x006b06d8, 0x013fdefe, 0x033c3f43, 0x03533bb6, 0x0150f92f, 0x003102c6}}}, + {X: Field{[10]uint32{0x03e5a06e, 0x039ba9b1, 0x005b3eb9, 0x00c8877a, 0x02fc399d, 0x02662f31, 0x022a7cbf, 0x00623de3, 0x036d9f6d, 0x00221cc9}}, Y: Field{[10]uint32{0x03c9e1a6, 0x029c2079, 0x02b4e054, 0x010f012d, 0x00dac977, 0x0395985e, 0x0020a3a7, 0x02e7a3ba, 0x01378ee9, 0x000a5fa0}}}, + {X: Field{[10]uint32{0x0288e0ad, 0x00b299b1, 0x01157145, 0x019937de, 0x0030fadd, 0x037d0c73, 0x00f57cdf, 0x005faf02, 0x01015bd2, 0x000406e0}}, Y: Field{[10]uint32{0x01179e6a, 0x01cdc617, 0x01ab339b, 0x02d1b253, 0x014c7542, 0x02a3e372, 0x01816d40, 0x00e0c461, 0x032fad20, 0x003e9b06}}}, + {X: Field{[10]uint32{0x0342dd57, 0x035314df, 0x03b6cd81, 0x0328a612, 0x03abe3b3, 0x02c81c7e, 0x02520a8c, 0x00518047, 0x015776c3, 0x001decf0}}, Y: Field{[10]uint32{0x004a645a, 0x0226417f, 0x00244925, 0x017453c3, 0x00040cce, 0x010fbd6b, 0x0084c9b4, 0x0006dc70, 0x02b1dab6, 0x002342f3}}}, + {X: Field{[10]uint32{0x01daec7a, 0x01a9a83f, 0x005d3ecf, 0x0224cf20, 0x02fbe2c1, 0x02e99bc4, 0x03aca338, 0x0182dbfd, 0x015256ac, 0x000547cb}}, Y: Field{[10]uint32{0x024f62d6, 0x033a7c1d, 0x03ea674e, 0x02227355, 0x01c4833c, 0x027a508d, 0x03038d64, 0x012fe645, 0x017710cd, 0x0034aab3}}}, + {X: Field{[10]uint32{0x031d32c7, 0x028e0245, 0x011a2029, 0x0070446f, 0x00950881, 0x012d1b7e, 0x0338dbe2, 0x0105ed18, 0x0327f41e, 0x00375d73}}, Y: Field{[10]uint32{0x01b67be5, 0x00c88906, 0x013dd46c, 0x003363ed, 0x00ee2217, 0x0324761b, 0x0303c33c, 0x026e012a, 0x0055a338, 0x0038ca2e}}}, + {X: Field{[10]uint32{0x011d7a83, 0x035fbb9e, 0x0028a494, 0x01d8cd6d, 0x026a3f6b, 0x03d986c7, 0x02366ab3, 0x03671277, 0x03ebbdd1, 0x0003ea87}}, Y: Field{[10]uint32{0x0025d572, 0x015c4f6e, 0x029c413b, 0x02760695, 0x01948bb2, 0x00791955, 0x0248ee56, 0x000aae30, 0x014f8fce, 0x0037cd87}}}, + {X: Field{[10]uint32{0x018f8be5, 0x036bfb53, 0x03545671, 0x037e31a9, 0x00a4cada, 0x019e2565, 0x01ee65b6, 0x02ecc7f7, 0x01be5bc2, 0x000f3043}}, Y: Field{[10]uint32{0x0039c2df, 0x023995dc, 0x0110dbc0, 0x002ba909, 0x00710112, 0x0350b25d, 0x0292a3a9, 0x02b5bc39, 0x01ef8c66, 0x00200b51}}}, + {X: Field{[10]uint32{0x03b93ba2, 0x01dafb29, 0x03a1eaf5, 0x02140d78, 0x01856cc4, 0x014a00b8, 0x00dee7f7, 0x03b07245, 0x0325325d, 0x00255139}}, Y: Field{[10]uint32{0x02eeeb49, 0x020c4577, 0x03686aad, 0x03779421, 0x00aaf137, 0x005cce33, 0x0339b037, 0x00f013af, 0x03a68151, 0x0033b1f6}}}, + {X: Field{[10]uint32{0x0383a964, 0x02f8df27, 0x01eac038, 0x01b89de7, 0x0154eec6, 0x03737db0, 0x017ff8b4, 0x0188d9ec, 0x03dcd5d0, 0x0025283e}}, Y: Field{[10]uint32{0x03efe82a, 0x00a7bd33, 0x030e576f, 0x004d68a8, 0x03fea742, 0x0290b8b8, 0x0223e169, 0x01b206dc, 0x00fd5ef0, 0x003c97cd}}}, + {X: Field{[10]uint32{0x02b579c7, 0x03a12cf1, 0x03633100, 0x00ec27dd, 0x0314f67c, 0x0085ee90, 0x01fbd4bf, 0x01f8bda5, 0x01b2c3fc, 0x0026278a}}, Y: Field{[10]uint32{0x0221c888, 0x0143bf6d, 0x02771172, 0x010c0708, 0x01ed003a, 0x005f6abe, 0x034f3e99, 0x000a5c0a, 0x01280cd0, 0x0018229b}}}, + {X: Field{[10]uint32{0x033494a5, 0x00192fc1, 0x017f1c81, 0x0173a502, 0x0249b4bd, 0x0164d2b0, 0x00e979b0, 0x029674ec, 0x03c44295, 0x0030e317}}, Y: Field{[10]uint32{0x01d1e2fb, 0x00118b58, 0x02ecb760, 0x01c5f2fb, 0x031d1dbc, 0x003af059, 0x00e471ae, 0x02cda992, 0x03f6d354, 0x00058902}}}, + {X: Field{[10]uint32{0x03a7a63b, 0x0304e3c3, 0x037e1546, 0x01adeb61, 0x0207dc65, 0x031963be, 0x0341d8c5, 0x0011b162, 0x026735c4, 0x0037a73d}}, Y: Field{[10]uint32{0x006639ac, 0x021b78d4, 0x00cb7575, 0x039f66e5, 0x03ecc19d, 0x01120042, 0x03729275, 0x018b8f88, 0x024fba91, 0x000bf0a0}}}, + {X: Field{[10]uint32{0x02c06522, 0x0110303d, 0x023c4c8c, 0x002119d6, 0x03f1dd9e, 0x0230cf27, 0x01d84b38, 0x0022d41e, 0x0137e567, 0x0000933f}}, Y: Field{[10]uint32{0x002af897, 0x00eb1e71, 0x01f00738, 0x01ab36df, 0x021aee67, 0x016b219c, 0x034d2895, 0x00055ed2, 0x00ea0982, 0x00072f32}}}, + {X: Field{[10]uint32{0x007cc121, 0x00858e7a, 0x01ed7264, 0x023d8990, 0x012b275d, 0x038247a7, 0x00414a95, 0x02e6d8bd, 0x01086ad8, 0x00275b8c}}, Y: Field{[10]uint32{0x02d3abe0, 0x025e6dba, 0x01bca757, 0x02d379d4, 0x0043c46a, 0x029d0f3c, 0x02b59ad5, 0x0299f536, 0x000a6792, 0x002e491c}}}, + {X: Field{[10]uint32{0x0209354d, 0x02f82021, 0x01d38673, 0x00b749d9, 0x0374aea2, 0x023b4e37, 0x01c21e53, 0x020e55ce, 0x01ae28b2, 0x00014aa2}}, Y: Field{[10]uint32{0x00334e51, 0x0316c7b6, 0x01708089, 0x035661ed, 0x01469b06, 0x01dacbd8, 0x03cccd20, 0x020c2f4d, 0x01579b65, 0x003060fb}}}, + {X: Field{[10]uint32{0x0227571d, 0x034d0836, 0x0255046b, 0x0230b05c, 0x01cda3bf, 0x01c9f2bd, 0x03f5d31d, 0x00601c90, 0x0272491d, 0x000bff4c}}, Y: Field{[10]uint32{0x035b6ad5, 0x03326994, 0x01d52131, 0x02d74d06, 0x00599934, 0x037abbd6, 0x01e48be6, 0x02ccd28c, 0x03bd6f38, 0x00204ba3}}}, + {X: Field{[10]uint32{0x00973fca, 0x02567167, 0x022f2eba, 0x02709c19, 0x0265df68, 0x02c64ec5, 0x0251b66d, 0x0290e8d7, 0x02094269, 0x00175831}}, Y: Field{[10]uint32{0x010efadc, 0x03c7d221, 0x0048a3af, 0x02165a71, 0x006d3b92, 0x03d03350, 0x031bb7e3, 0x035864ac, 0x024fd1af, 0x003d644c}}}, + {X: Field{[10]uint32{0x0112ff75, 0x029ad2cf, 0x00d0ae6d, 0x03e615e1, 0x004c86da, 0x00706d58, 0x0026340e, 0x00cd4fd1, 0x000abfe5, 0x0008f831}}, Y: Field{[10]uint32{0x00191d9d, 0x0085444a, 0x03827f99, 0x01e66eb3, 0x00f19d5a, 0x02032851, 0x01baf682, 0x0024a824, 0x00b5fc86, 0x003a4211}}}, + {X: Field{[10]uint32{0x006094f6, 0x0221739f, 0x02bb1155, 0x01e4c2f4, 0x0050e67d, 0x03cdf6a0, 0x02f20d77, 0x00704b29, 0x00ab5d4a, 0x00251606}}, Y: Field{[10]uint32{0x02695e03, 0x00735592, 0x03b6f9a1, 0x018febf2, 0x0032ca81, 0x03b7b6d8, 0x0269c969, 0x02b9b6a9, 0x01d0e2f9, 0x002d7cb0}}}, + {X: Field{[10]uint32{0x00724c8c, 0x03b363f6, 0x0124bc41, 0x0175881b, 0x015043be, 0x00335ef3, 0x03a469ca, 0x02fda861, 0x037d2586, 0x00347d36}}, Y: Field{[10]uint32{0x02206839, 0x0296b384, 0x03365a1c, 0x02ac071b, 0x02b1525e, 0x00a4a719, 0x0080ce9b, 0x01dd2ef5, 0x038277c4, 0x00190153}}}, + {X: Field{[10]uint32{0x0014a18d, 0x01fd3b3b, 0x01e1860f, 0x00a973dd, 0x01158b4f, 0x010a8f44, 0x005f2d5b, 0x01ba706a, 0x014f2458, 0x0013d713}}, Y: Field{[10]uint32{0x00efdbe5, 0x02d28c6c, 0x03350986, 0x027a5c3e, 0x021e48bb, 0x01ffefb0, 0x013be2be, 0x01e581a5, 0x02716d54, 0x0015d5db}}}, + {X: Field{[10]uint32{0x0198150a, 0x01032e52, 0x02118c38, 0x031407a6, 0x013f8edf, 0x0393e40f, 0x023cf5c5, 0x00510f62, 0x005bdcb3, 0x00304ed8}}, Y: Field{[10]uint32{0x02cb8435, 0x000f2c85, 0x022b52f6, 0x0127d064, 0x006c368e, 0x0122c070, 0x022a8ea9, 0x03efd4b9, 0x02af99f1, 0x0023738b}}}, + {X: Field{[10]uint32{0x0029cbb6, 0x01d33409, 0x01753391, 0x019b899a, 0x03a3df24, 0x0073bad6, 0x024a5b5a, 0x00953925, 0x032ab66f, 0x00064dec}}, Y: Field{[10]uint32{0x02f2e385, 0x0005ce03, 0x0022bb57, 0x01e604f8, 0x030181e0, 0x00fffec6, 0x00eabb05, 0x001d72ef, 0x00a06f1b, 0x0025c4ac}}}, + {X: Field{[10]uint32{0x019ba2e4, 0x0186c1d0, 0x004d747e, 0x036deb4b, 0x00d757bb, 0x00ef87d6, 0x00ef386c, 0x01cbcc21, 0x033f2f17, 0x0039294c}}, Y: Field{[10]uint32{0x036b6f56, 0x00529eb2, 0x00c7c5af, 0x03326f05, 0x02132571, 0x02f05590, 0x009b7178, 0x0392e40e, 0x01a72ec2, 0x003a13df}}}, + {X: Field{[10]uint32{0x0206cca6, 0x03f6d2d5, 0x00dcffc7, 0x0106b855, 0x01d57a83, 0x03304217, 0x000a0cf5, 0x00aa3142, 0x00b0a3f4, 0x000be28e}}, Y: Field{[10]uint32{0x024681c1, 0x03ce31a3, 0x024f1134, 0x00b86c49, 0x002fa2a7, 0x03bb58a5, 0x0008d9c4, 0x0076d959, 0x02a52c30, 0x0021d931}}}, + {X: Field{[10]uint32{0x01a55ff7, 0x015c4aa0, 0x0070b873, 0x0266e106, 0x02acd145, 0x033aad7f, 0x00585b63, 0x00b5dedb, 0x01c2c51c, 0x0000f4af}}, Y: Field{[10]uint32{0x02d3e9e0, 0x02e3736d, 0x035e9496, 0x00da8fa2, 0x00922460, 0x0011db91, 0x01a808ff, 0x018f7ea6, 0x01adbbe2, 0x000cfdd2}}}, + {X: Field{[10]uint32{0x03ab7d3a, 0x03cf307b, 0x01b3e6e5, 0x00548b6f, 0x021ecec2, 0x00afe8f8, 0x02b9acf6, 0x01338cdd, 0x0008d676, 0x003f21fe}}, Y: Field{[10]uint32{0x0035176a, 0x032e5c4a, 0x00581717, 0x0093386f, 0x01c03430, 0x014292b0, 0x0015dd87, 0x03e4ddc2, 0x0303c1f4, 0x00339d7a}}}, + {X: Field{[10]uint32{0x031e68d5, 0x009c2fd6, 0x02cb4374, 0x014871f9, 0x01323549, 0x03326121, 0x00885dc0, 0x03847afa, 0x005c62de, 0x001fe06e}}, Y: Field{[10]uint32{0x029c4558, 0x0034a9da, 0x017f3ad7, 0x012bb572, 0x011750aa, 0x025b3dce, 0x01ba062d, 0x036d8705, 0x037d6a84, 0x002deb7b}}}, + {X: Field{[10]uint32{0x01fd5557, 0x022e40f8, 0x0288c826, 0x0224f085, 0x0233cc8f, 0x018bbe47, 0x01d8f47f, 0x00eb97a3, 0x003f7afd, 0x00358635}}, Y: Field{[10]uint32{0x00cd34b8, 0x02f2a9b8, 0x03fb4fc5, 0x0237f230, 0x0042ce9e, 0x024031f9, 0x03212679, 0x02e6c20a, 0x017b0c8a, 0x00186020}}}, + {X: Field{[10]uint32{0x016e4940, 0x03e532e2, 0x009310cc, 0x02f37ddb, 0x03694430, 0x020e0ee6, 0x03f540fc, 0x026c1b6b, 0x004ff237, 0x002e9693}}, Y: Field{[10]uint32{0x0107b1f2, 0x001d6a3f, 0x0128db91, 0x03954d29, 0x0325299d, 0x03cba4cc, 0x01309b24, 0x0239bd3b, 0x011a0b13, 0x000e8887}}}, + {X: Field{[10]uint32{0x00cfdf56, 0x00a7e8c6, 0x018abcec, 0x025720c2, 0x03801363, 0x02cd6eb0, 0x03591415, 0x00dd1a20, 0x01b60bee, 0x0031a462}}, Y: Field{[10]uint32{0x0339268c, 0x022f5275, 0x0279c582, 0x0078a6de, 0x019795e6, 0x038d01ec, 0x00232fa7, 0x0368eb37, 0x03c2b862, 0x00286176}}}, + {X: Field{[10]uint32{0x00efae12, 0x00dccb07, 0x02d71bcd, 0x021a1f96, 0x0270dffd, 0x0267500e, 0x0063423b, 0x02d006ae, 0x0144032f, 0x00147d9f}}, Y: Field{[10]uint32{0x01e10e59, 0x02cb6518, 0x01f5ca8e, 0x00fe2993, 0x020403e2, 0x032fc859, 0x00ae68a3, 0x00128caf, 0x0085a2c4, 0x00222c5d}}}, + {X: Field{[10]uint32{0x037c4bd5, 0x02fb9b7a, 0x00a36fa8, 0x005fb4f3, 0x016001e1, 0x0252e2d9, 0x006fb69a, 0x017e350d, 0x0209e558, 0x00336b3f}}, Y: Field{[10]uint32{0x02028542, 0x0211249b, 0x01ecefdb, 0x000d6515, 0x03af5fc4, 0x0019a675, 0x00121762, 0x00c74056, 0x005a9931, 0x00377c6f}}}, + {X: Field{[10]uint32{0x03f0e769, 0x00cf24e2, 0x01be319f, 0x02874598, 0x00481eaa, 0x033a4222, 0x0301d70c, 0x0391da71, 0x0371e1fc, 0x00204a79}}, Y: Field{[10]uint32{0x0045c6e2, 0x002a05bc, 0x02d700d4, 0x0226d511, 0x038a4db1, 0x01d259ab, 0x02d8b6f9, 0x02f158e7, 0x013da864, 0x000fad5c}}}, + {X: Field{[10]uint32{0x02bce3ab, 0x004cafd6, 0x009ada68, 0x02abe0a2, 0x00f39c14, 0x02a9cc35, 0x002fc0f8, 0x016f03cc, 0x02ef6d41, 0x002e5c18}}, Y: Field{[10]uint32{0x013db3a6, 0x003cc4f5, 0x02829049, 0x03954445, 0x006644c9, 0x0148891f, 0x00dfdd38, 0x0324f3f6, 0x0288cd76, 0x0022b5c1}}}, + {X: Field{[10]uint32{0x030bd913, 0x01a853d3, 0x03ca422a, 0x03b14552, 0x0250de67, 0x013a1af9, 0x01d6af8c, 0x006d7fa9, 0x018b4e81, 0x000670f2}}, Y: Field{[10]uint32{0x0190a109, 0x01d1bea8, 0x027bdd5d, 0x017a491d, 0x03c18b9d, 0x021425f2, 0x021b5c73, 0x03264cc3, 0x039648bd, 0x002f148f}}}, + {X: Field{[10]uint32{0x01b42b9c, 0x026cf0ad, 0x0355967a, 0x01efbf98, 0x020ad769, 0x02244638, 0x02be43f8, 0x03b9d2c7, 0x00c73616, 0x002e7bcd}}, Y: Field{[10]uint32{0x03661bea, 0x003a9a16, 0x022543b7, 0x02a8d5c3, 0x02e8dc05, 0x03988e54, 0x01be2715, 0x006b06e2, 0x01ddd55b, 0x0004bc73}}}, + {X: Field{[10]uint32{0x0103c34a, 0x03b6e5fd, 0x02ca86e8, 0x00faf7ae, 0x0359dd2a, 0x01b61371, 0x039c39a9, 0x0336d603, 0x034f58e2, 0x001dc638}}, Y: Field{[10]uint32{0x03e96df7, 0x019ec400, 0x03093135, 0x00a23838, 0x01cf5e37, 0x0312f45f, 0x01cd8f96, 0x0106e04b, 0x01fbdc08, 0x0029b441}}}, + {X: Field{[10]uint32{0x037e8dba, 0x03321c71, 0x02ed621f, 0x02c62bed, 0x01e259c1, 0x034d68da, 0x03ba89b8, 0x039cdd8e, 0x004b8e6d, 0x0036ace2}}, Y: Field{[10]uint32{0x00a11577, 0x00e89e05, 0x0153ee50, 0x0024abbe, 0x01c9316e, 0x036d2802, 0x02bd4b5e, 0x00b508ae, 0x0329c59a, 0x003d12db}}}, + {X: Field{[10]uint32{0x027f4366, 0x03b6ac79, 0x00a1876a, 0x0147a11f, 0x03a67367, 0x02d6f9b7, 0x026a8978, 0x01e0b797, 0x02101139, 0x0032cf43}}, Y: Field{[10]uint32{0x0157d3ea, 0x03e5c26f, 0x010cf189, 0x019da705, 0x01572aff, 0x03923c76, 0x0169b33b, 0x0250f99e, 0x008dd227, 0x0009ffa2}}}, + {X: Field{[10]uint32{0x00c3c6a0, 0x01fecefa, 0x0279fcca, 0x0191ba8b, 0x03656ea5, 0x03d8ad2d, 0x01193dbb, 0x02750423, 0x03f85561, 0x003ac6c7}}, Y: Field{[10]uint32{0x02282ea4, 0x0340f258, 0x027a5ced, 0x00e926cc, 0x01d36ae9, 0x000e1159, 0x01137414, 0x0357075c, 0x00c75b73, 0x00309fe8}}}, + {X: Field{[10]uint32{0x0039c5dd, 0x0025e187, 0x03aeb587, 0x03cf4b95, 0x00bee8f9, 0x00eadaf7, 0x01a11170, 0x003c47dd, 0x01e60bc4, 0x0017541e}}, Y: Field{[10]uint32{0x006e46d0, 0x02048851, 0x02bab805, 0x0378061c, 0x014d8435, 0x02f9ef7e, 0x025829b4, 0x02e75775, 0x012ba40d, 0x00052b84}}}, + {X: Field{[10]uint32{0x01a7b38e, 0x03f302a8, 0x00502384, 0x023780c0, 0x01b70809, 0x02c852ec, 0x028acd26, 0x01abc1b4, 0x02f76beb, 0x00004183}}, Y: Field{[10]uint32{0x03bdf9a3, 0x003b1230, 0x022e275d, 0x0015481f, 0x0334252c, 0x028860f5, 0x005464da, 0x03190a56, 0x039ff6c6, 0x0033903c}}}, + {X: Field{[10]uint32{0x02170695, 0x008e1cea, 0x03e1afd7, 0x0251c358, 0x01e7bcc8, 0x0309d14a, 0x007c271a, 0x03dcc625, 0x0063c001, 0x00259471}}, Y: Field{[10]uint32{0x0254eaf7, 0x00dfec39, 0x0154d218, 0x01e96a6c, 0x013b16ba, 0x022d8f26, 0x016d17fe, 0x001b69cf, 0x027fe8ff, 0x00138d8b}}}, + {X: Field{[10]uint32{0x03363dcc, 0x00a3c9c7, 0x0000ee09, 0x01334891, 0x01895cda, 0x02d0a2c6, 0x02822cdc, 0x0086d0bd, 0x03765928, 0x0017108a}}, Y: Field{[10]uint32{0x012b9400, 0x017f3d92, 0x0148444e, 0x036054a0, 0x014cb6b4, 0x03db01fd, 0x008258f0, 0x01df28d1, 0x034f9e4c, 0x000bf6d3}}}, + {X: Field{[10]uint32{0x01faba2c, 0x009364ea, 0x003d2b72, 0x029b353d, 0x02ab3868, 0x0114b312, 0x023ce519, 0x009435ce, 0x012b5d98, 0x0036c51f}}, Y: Field{[10]uint32{0x010ed0de, 0x02469e81, 0x009258a3, 0x03f81931, 0x009fdebf, 0x01ca65a1, 0x0343227a, 0x01ab37e8, 0x0380ad3c, 0x001cc950}}}, + {X: Field{[10]uint32{0x01454b4c, 0x0345b2f9, 0x01384a41, 0x009bb613, 0x01e1beca, 0x02207a26, 0x02237678, 0x02ff4594, 0x03a0f97a, 0x002699d8}}, Y: Field{[10]uint32{0x0090306a, 0x028074ce, 0x03cb2737, 0x01d64b22, 0x00e7952f, 0x00420a42, 0x031a3d55, 0x01605ccb, 0x007db6aa, 0x002ed450}}}, + {X: Field{[10]uint32{0x025daea8, 0x02da8003, 0x0400007d, 0x027a3147, 0x0007b45a, 0x03e53d61, 0x025c889e, 0x022bd3d3, 0x0133e910, 0x000dbf9e}}, Y: Field{[10]uint32{0x01227ee5, 0x0216ed09, 0x019e27fc, 0x02ed9ad1, 0x031943c7, 0x01c78570, 0x003a0f4a, 0x01688723, 0x01baecdd, 0x00340929}}}, + {X: Field{[10]uint32{0x03c784e7, 0x0155a28e, 0x006afc44, 0x03a96dce, 0x0144c749, 0x01d4a5a0, 0x02782fb8, 0x01f9a033, 0x0263f04f, 0x001036b9}}, Y: Field{[10]uint32{0x0355050b, 0x00445d95, 0x02bb9478, 0x011d12c5, 0x02cea2ab, 0x008f3c94, 0x0058c854, 0x03374009, 0x03fdac6b, 0x00126918}}}, + {X: Field{[10]uint32{0x01c5b8d1, 0x017272eb, 0x00a7542c, 0x02e9e7ea, 0x01da55fa, 0x0056bf67, 0x00c6d10b, 0x03cec23a, 0x016dc8ff, 0x0002e858}}, Y: Field{[10]uint32{0x00a786ff, 0x006ac96c, 0x01019764, 0x01797c38, 0x02771045, 0x0328256c, 0x025a3ace, 0x00f19865, 0x0042a623, 0x003bc25b}}}, + {X: Field{[10]uint32{0x019c4a66, 0x00b409d8, 0x01e7da70, 0x001417ee, 0x03d69b4a, 0x02f1c49c, 0x028c948d, 0x01254935, 0x036723a5, 0x000c121b}}, Y: Field{[10]uint32{0x02444c76, 0x00fb2eb0, 0x01ab6574, 0x01b66812, 0x01fd6acc, 0x011c292e, 0x02a63695, 0x03270217, 0x014d279e, 0x000e3293}}}, + {X: Field{[10]uint32{0x01e6932a, 0x0096f236, 0x0197090f, 0x024e6a27, 0x02d6accd, 0x03b0a809, 0x0367174d, 0x03475603, 0x029495ea, 0x0006e0fb}}, Y: Field{[10]uint32{0x02e20196, 0x0212f075, 0x03e0e345, 0x00d270ac, 0x033d2630, 0x00b9f43a, 0x0373d6da, 0x01214786, 0x0048fb5e, 0x000065b5}}}, + {X: Field{[10]uint32{0x03517396, 0x003c432d, 0x0264f2e3, 0x00c8053b, 0x01328b61, 0x03055e76, 0x02766715, 0x016844be, 0x002eedfa, 0x0013aa77}}, Y: Field{[10]uint32{0x006e50c2, 0x023c3d6c, 0x02c9c21e, 0x036741b2, 0x00d4a192, 0x00066d07, 0x003f0b14, 0x00f8a562, 0x03c96ef8, 0x001d053b}}}, + {X: Field{[10]uint32{0x02b033da, 0x025ff34b, 0x01b311a0, 0x024b572e, 0x02876777, 0x02d95d0d, 0x03217aa3, 0x02b4220e, 0x019dbee9, 0x001059b0}}, Y: Field{[10]uint32{0x02ed541c, 0x008dbadf, 0x001f8abc, 0x00ff4e36, 0x02b80e11, 0x02cdd6b1, 0x02b4d29a, 0x01aa9a4c, 0x025c5fae, 0x0018b141}}}, + {X: Field{[10]uint32{0x01a74899, 0x02ef82a1, 0x03f310a2, 0x021abe38, 0x02bbbc66, 0x034f4be5, 0x00511a87, 0x03d529a7, 0x03ebb112, 0x002c5d59}}, Y: Field{[10]uint32{0x009f52c2, 0x03f5cb53, 0x00bb1bdb, 0x008719c7, 0x03a69367, 0x02e24db7, 0x03fc6934, 0x02f952b8, 0x03413788, 0x003d99d8}}}, + {X: Field{[10]uint32{0x028095a5, 0x00ae2a6f, 0x0210212c, 0x02141408, 0x01a6df06, 0x00d44c4c, 0x01d81fdf, 0x01fcd022, 0x01152ab9, 0x00334ad9}}, Y: Field{[10]uint32{0x038f6a53, 0x024b8c79, 0x00bb45f4, 0x0212e1c0, 0x0322afff, 0x03513408, 0x02e40c72, 0x0064d457, 0x012f9ca4, 0x0033f9e5}}}, + {X: Field{[10]uint32{0x0218229f, 0x00c825cd, 0x0374a447, 0x01e4ebab, 0x032086c9, 0x001eb031, 0x0241a729, 0x0050280c, 0x03c49f33, 0x000dd580}}, Y: Field{[10]uint32{0x0385e837, 0x0058defa, 0x00699668, 0x004e1120, 0x03de08ba, 0x00025d76, 0x01ddb463, 0x029dcf84, 0x00f66322, 0x001eedd0}}}, + {X: Field{[10]uint32{0x03bb7432, 0x03c80bbb, 0x01632978, 0x0174b800, 0x017e1095, 0x00d0777a, 0x003c176f, 0x00f765b6, 0x03d4390a, 0x00040819}}, Y: Field{[10]uint32{0x039ba83e, 0x02068be0, 0x0322dafa, 0x03bdf9c1, 0x021d8b7e, 0x01aea77d, 0x0019f11b, 0x03330e9c, 0x03d54d28, 0x001f3db3}}}, + {X: Field{[10]uint32{0x0263081d, 0x01d89737, 0x01d544fb, 0x00bfa30b, 0x01374ef4, 0x022d23eb, 0x003042cf, 0x0314ee9c, 0x0273e3fb, 0x0011d85f}}, Y: Field{[10]uint32{0x01d439e8, 0x020bce70, 0x022a0e47, 0x019e1f0f, 0x0350cbae, 0x010f2abf, 0x0040f07f, 0x02a56ecb, 0x00230c92, 0x0007e93d}}}, + {X: Field{[10]uint32{0x03880f84, 0x0045d383, 0x034ca82e, 0x02f4c635, 0x0046b814, 0x038a2818, 0x017aac08, 0x01418a7d, 0x03af57f7, 0x000b10c6}}, Y: Field{[10]uint32{0x0209de50, 0x039631bc, 0x03adbb8e, 0x014ab162, 0x0262755a, 0x0214fd07, 0x00041089, 0x012ccb04, 0x03bc6857, 0x00376e79}}}, + {X: Field{[10]uint32{0x0343d599, 0x015c3760, 0x00b41338, 0x012c35dd, 0x033f4df4, 0x026dc22a, 0x0386b1f7, 0x02db9066, 0x02438143, 0x0024658d}}, Y: Field{[10]uint32{0x02312f0d, 0x008aa2dd, 0x00049696, 0x00d243d1, 0x00021be3, 0x01ae1eef, 0x0391d682, 0x02834a7e, 0x02177171, 0x00240d3b}}}, + {X: Field{[10]uint32{0x00b7754e, 0x013dfdf1, 0x02ddda4a, 0x0164ac05, 0x02028718, 0x015a0ec1, 0x00d42db9, 0x01b1ee0e, 0x0201af65, 0x002fca30}}, Y: Field{[10]uint32{0x0345d109, 0x02db7ce8, 0x00e20c50, 0x016ab0c8, 0x01ce6ffb, 0x01aac1a0, 0x0266c2f4, 0x00434aa2, 0x0304dda5, 0x0002ef53}}}, + {X: Field{[10]uint32{0x0118b137, 0x02d3cd65, 0x035a1bab, 0x00b296ba, 0x031aa426, 0x01663902, 0x01d531bf, 0x0097d138, 0x03860218, 0x003f2b1c}}, Y: Field{[10]uint32{0x02e67b64, 0x03fda154, 0x005936ff, 0x03fa1f9f, 0x037dcca7, 0x02e8dfbb, 0x032d1e41, 0x02fa87cf, 0x037a957b, 0x000ec65a}}}, + {X: Field{[10]uint32{0x026e9331, 0x0270775c, 0x01982302, 0x0326d1fb, 0x018ad89c, 0x0119fe02, 0x01f0278e, 0x03864850, 0x01dfcaae, 0x00273fa8}}, Y: Field{[10]uint32{0x00db211d, 0x00051ac6, 0x01f470b1, 0x03056dd7, 0x0096a071, 0x01421b8c, 0x010b6469, 0x03b8163f, 0x024e7f30, 0x001cb607}}}, + {X: Field{[10]uint32{0x021334da, 0x019bcd1a, 0x00e201e9, 0x014666e6, 0x00455c51, 0x00a00b0c, 0x01c7f21f, 0x014f1e59, 0x03421235, 0x0015234f}}, Y: Field{[10]uint32{0x016418ae, 0x025283a5, 0x0278a426, 0x02c40c44, 0x0208c0af, 0x016e51a1, 0x0138eeb1, 0x000f4a25, 0x0225cebb, 0x000184ba}}}, + {X: Field{[10]uint32{0x00295bc0, 0x022f759d, 0x01e22a6c, 0x015b18a3, 0x02ebd467, 0x02312643, 0x035c545e, 0x01309826, 0x019accf8, 0x00396f98}}, Y: Field{[10]uint32{0x01b08bf3, 0x00b8a81c, 0x01837a74, 0x033e6cd8, 0x0189e246, 0x02a162e4, 0x003aa74f, 0x006bdeb6, 0x00a57d84, 0x00190219}}}, + {X: Field{[10]uint32{0x01ac668f, 0x013a6ba8, 0x02209e19, 0x0037dcd3, 0x03a26046, 0x008da323, 0x028f733d, 0x03b52bba, 0x033e3400, 0x002d5824}}, Y: Field{[10]uint32{0x005f9da3, 0x0303008b, 0x028861b1, 0x03d378a6, 0x00ac0975, 0x033c5eef, 0x02ab1826, 0x01e14e7f, 0x013d3133, 0x00150e3e}}}, + {X: Field{[10]uint32{0x00cf60b1, 0x014aa887, 0x013c02c6, 0x025a30c5, 0x01dedf2d, 0x01d10cff, 0x03ecf7dd, 0x00f9e41d, 0x0297baca, 0x00087766}}, Y: Field{[10]uint32{0x0284797e, 0x001f3409, 0x038d917c, 0x0334d3d2, 0x01b851c4, 0x03683032, 0x019bbd7c, 0x02c2deda, 0x00e0e048, 0x00379b98}}}, + {X: Field{[10]uint32{0x01934bbd, 0x03ca403f, 0x03f37bca, 0x01d12327, 0x012f1478, 0x026f68c0, 0x01b0a52f, 0x010e6d32, 0x020c6d39, 0x00173e95}}, Y: Field{[10]uint32{0x01b11b06, 0x03feae69, 0x01a3235a, 0x034cfc37, 0x0129d5a5, 0x03a4dbca, 0x0156998c, 0x02566fcd, 0x02630cc1, 0x0031e49e}}}, + {X: Field{[10]uint32{0x026d4fc6, 0x00712da1, 0x02f49046, 0x039ed240, 0x016377af, 0x0253f325, 0x036204b3, 0x03350540, 0x01bb05ad, 0x00128ee5}}, Y: Field{[10]uint32{0x00e84f2f, 0x03402bea, 0x000232a0, 0x01ef7dc2, 0x018d6be4, 0x036e4e1f, 0x009179a4, 0x00793302, 0x02e2f1bd, 0x0035678f}}}, + {X: Field{[10]uint32{0x01f4671f, 0x012dd94d, 0x03d4a81c, 0x002b736c, 0x03404edb, 0x03741bc5, 0x0006b7ba, 0x01a7244f, 0x03130b4c, 0x00331268}}, Y: Field{[10]uint32{0x007bc278, 0x015ea25a, 0x011b24dd, 0x0054b1ea, 0x02ba4837, 0x034dd564, 0x036c1943, 0x01497abc, 0x02ecc35e, 0x0012f5c8}}}, + {X: Field{[10]uint32{0x00146d98, 0x00993335, 0x03d3740b, 0x0300637c, 0x00e07fda, 0x0362d3b8, 0x00f4f900, 0x029a7673, 0x005a7426, 0x00275d42}}, Y: Field{[10]uint32{0x00c4b0a9, 0x01b8f08b, 0x01ae6a4f, 0x03a4fe50, 0x01ce174a, 0x0392519f, 0x0372f44d, 0x02ccb411, 0x0253de04, 0x00016644}}}, + {X: Field{[10]uint32{0x03210fb8, 0x02c341a0, 0x00d18b95, 0x003beb48, 0x02caa87c, 0x027c7864, 0x0312cf5d, 0x036b74ba, 0x00df737b, 0x0037f419}}, Y: Field{[10]uint32{0x0103805a, 0x0206e4a4, 0x0122613d, 0x0264fab8, 0x019f3172, 0x02404bf5, 0x00b1d2b8, 0x0234cc14, 0x003da5bf, 0x001467e2}}}, + {X: Field{[10]uint32{0x007eaf9a, 0x006040a0, 0x012e3bf6, 0x0209a170, 0x001cf205, 0x0198c62f, 0x009013ea, 0x01b0d758, 0x035cd235, 0x000ad428}}, Y: Field{[10]uint32{0x01c76335, 0x012aeac7, 0x000f6ce7, 0x00790d4e, 0x02fdf424, 0x026d60a7, 0x01f5a77d, 0x03bbfae0, 0x011d303a, 0x0001f42d}}}, + {X: Field{[10]uint32{0x005abbc7, 0x0207ea1a, 0x030c3704, 0x03ccc09f, 0x020f3202, 0x01673517, 0x02e2a594, 0x01d79f1d, 0x034b2cf1, 0x00389ba3}}, Y: Field{[10]uint32{0x02c2013a, 0x03dcbf0e, 0x02c0f194, 0x0389183a, 0x01716e5f, 0x025f0d37, 0x00767029, 0x0145854c, 0x03baaa0d, 0x001320b9}}}, + {X: Field{[10]uint32{0x010f87fb, 0x034d20d7, 0x00959b46, 0x0147e097, 0x031fd90e, 0x039e3701, 0x0184057c, 0x03615da9, 0x037d54f4, 0x001640f6}}, Y: Field{[10]uint32{0x029e99c8, 0x00200447, 0x020f3816, 0x01028637, 0x03febf94, 0x034635bd, 0x00003329, 0x0046791f, 0x03d3e9ce, 0x0031578b}}}, + {X: Field{[10]uint32{0x0125e9c1, 0x0254f513, 0x00204fde, 0x03b8a2e6, 0x021040e6, 0x00d4906d, 0x03881e96, 0x02a0b722, 0x02cd0342, 0x0012eec3}}, Y: Field{[10]uint32{0x00b0ef04, 0x006a320b, 0x02335821, 0x03a6d134, 0x00082e97, 0x0013a1e1, 0x02bee8d6, 0x0116dd4a, 0x00900f34, 0x00004bac}}}, + {X: Field{[10]uint32{0x03c4e8d2, 0x01543e52, 0x0175b647, 0x01f506e5, 0x02702996, 0x034c9e78, 0x026eb38f, 0x02fe5f1b, 0x015aae87, 0x00012891}}, Y: Field{[10]uint32{0x03936074, 0x0255541c, 0x01c474a5, 0x008be718, 0x0309af34, 0x009d85e3, 0x012bea1e, 0x02fb98b5, 0x02c4ffe3, 0x00168d02}}}, + {X: Field{[10]uint32{0x03477623, 0x032be1d4, 0x004ad1de, 0x02f77389, 0x0394470a, 0x001ed4c3, 0x00329c4c, 0x0066a953, 0x028dc8ca, 0x003c21b5}}, Y: Field{[10]uint32{0x00bdbd08, 0x00c25c6d, 0x03d8020d, 0x028a022b, 0x034d9e8b, 0x03121a6a, 0x03e4161c, 0x01abc596, 0x01d384a1, 0x00244712}}}, + {X: Field{[10]uint32{0x03ba856c, 0x027e486d, 0x00cb4c98, 0x03dca5e2, 0x01d4b7cd, 0x00257c6d, 0x0253f912, 0x01b13892, 0x037e83b7, 0x0013c6c5}}, Y: Field{[10]uint32{0x0180eaf2, 0x0111c15f, 0x03811e10, 0x01a43702, 0x0399debb, 0x02ee54d2, 0x03dc2ff5, 0x02426bf0, 0x004eb060, 0x002955a3}}}, + {X: Field{[10]uint32{0x03db5823, 0x00d0c0e5, 0x0154c765, 0x039fe99e, 0x01c4fb5a, 0x02211de3, 0x012fcbc0, 0x0391688f, 0x009929a7, 0x003aea1e}}, Y: Field{[10]uint32{0x01cbf68f, 0x00085e8b, 0x02afee73, 0x02985c92, 0x02801b26, 0x03c0ebe7, 0x03c46b47, 0x00245c27, 0x0329b357, 0x0039be31}}}, + {X: Field{[10]uint32{0x002282c2, 0x008ed8ea, 0x02e7d877, 0x00e62731, 0x03130ee5, 0x01111567, 0x01580844, 0x02969e4b, 0x031334c9, 0x0037c45e}}, Y: Field{[10]uint32{0x016f7120, 0x03959054, 0x035a8c9b, 0x0175388c, 0x001a2fc5, 0x02954447, 0x02c5492e, 0x00f144ab, 0x02578eea, 0x003761f2}}}, + {X: Field{[10]uint32{0x02ee82c5, 0x00c871b9, 0x01a68621, 0x0392ea80, 0x021f5768, 0x03d7da81, 0x02eaa1bd, 0x02ae200d, 0x003b3e68, 0x0035dd55}}, Y: Field{[10]uint32{0x0081436e, 0x00ea7b86, 0x02e18049, 0x01184141, 0x0027a2bf, 0x01065fe7, 0x02e7a26c, 0x01ce60f3, 0x030547c9, 0x001c0886}}}, + {X: Field{[10]uint32{0x0178515d, 0x00bfafd1, 0x024c7148, 0x01fff7c1, 0x025e006f, 0x02335632, 0x005c6116, 0x006b96af, 0x01d55a23, 0x0029fc43}}, Y: Field{[10]uint32{0x003c13b0, 0x025ea79c, 0x0031eb47, 0x03c835a7, 0x01b2c24a, 0x007664e6, 0x025eb38d, 0x025a5388, 0x03a7b66b, 0x00124a8c}}}, + {X: Field{[10]uint32{0x020120ec, 0x00dba718, 0x0205b05d, 0x02ce04b6, 0x020801c6, 0x01add211, 0x0336c86c, 0x02af6444, 0x01ef3119, 0x0031e551}}, Y: Field{[10]uint32{0x03c28718, 0x00813774, 0x00382bd7, 0x0313c485, 0x00738a33, 0x01f7a81b, 0x0073f8ef, 0x03ab9145, 0x00db95b6, 0x0009323f}}}, + {X: Field{[10]uint32{0x02c2cb11, 0x020f8314, 0x006ec8e7, 0x0359a888, 0x03afa14d, 0x03884128, 0x0043ba29, 0x02223d7e, 0x035e744f, 0x000262ea}}, Y: Field{[10]uint32{0x00b94df6, 0x030c34af, 0x03cbe0b2, 0x03518dab, 0x02a7abae, 0x0051af35, 0x01d929b8, 0x01fb6314, 0x019fe5e8, 0x0020ed5a}}}, + {X: Field{[10]uint32{0x00ac586e, 0x01d4bbf7, 0x00110547, 0x0212b099, 0x0160d84a, 0x00e77ffd, 0x0213053d, 0x02912b20, 0x00287b6f, 0x001b738a}}, Y: Field{[10]uint32{0x0237ed66, 0x03f18a78, 0x00a5cadc, 0x02654d5e, 0x00c79be3, 0x00197469, 0x032fa8dd, 0x0033116a, 0x022ab9d6, 0x000787ad}}}, + {X: Field{[10]uint32{0x023dfa83, 0x02c2b398, 0x030c1b7f, 0x037423db, 0x03db06a9, 0x02c92b63, 0x02b091b5, 0x01cf24c1, 0x0259287a, 0x00038e1a}}, Y: Field{[10]uint32{0x005b34e6, 0x02582a74, 0x00ed6852, 0x008508a1, 0x01c0d3b2, 0x0385bf35, 0x024ce899, 0x01929798, 0x03da663b, 0x00129f9c}}}, + {X: Field{[10]uint32{0x024fe4d5, 0x03aa89fa, 0x0118004b, 0x0060989b, 0x00cea0a3, 0x02e550eb, 0x00283fc9, 0x02f8c663, 0x0382e62f, 0x0023f7fd}}, Y: Field{[10]uint32{0x00086675, 0x008b4aab, 0x00708c52, 0x007d0c5f, 0x03a4f530, 0x0041fa21, 0x03ed6508, 0x03656d9c, 0x00719fe0, 0x003fbe3d}}}, + {X: Field{[10]uint32{0x012eaa37, 0x0381108a, 0x01089a10, 0x0310d722, 0x0136ed1c, 0x03a9593a, 0x03bb8b84, 0x02c52006, 0x03ae7842, 0x00132424}}, Y: Field{[10]uint32{0x025298dd, 0x02542829, 0x03426ea2, 0x00afe169, 0x03864236, 0x03a4d5bd, 0x02c0903f, 0x0117eb96, 0x033493d2, 0x000b5a0c}}}, + {X: Field{[10]uint32{0x03103a1b, 0x01b56e8c, 0x00f2fe86, 0x031bf5db, 0x01056318, 0x0381ca8d, 0x02b80f9b, 0x014aa764, 0x00c55c5c, 0x0033018d}}, Y: Field{[10]uint32{0x007f0b32, 0x03c2c234, 0x01e887e8, 0x01dc6da6, 0x004004aa, 0x01ff2180, 0x0236eb08, 0x02da79b4, 0x0141b13c, 0x001d42df}}}, + {X: Field{[10]uint32{0x03918255, 0x01bdc78e, 0x026569a5, 0x03b33fdd, 0x011d53c7, 0x033292b6, 0x0133f5f9, 0x01eb162f, 0x027341fa, 0x0025d269}}, Y: Field{[10]uint32{0x00916068, 0x01b3b61a, 0x00d870ec, 0x01a73e96, 0x025e68fd, 0x038df676, 0x012a2aaf, 0x031f59da, 0x01c1009d, 0x002da17c}}}, + {X: Field{[10]uint32{0x017d8e75, 0x00dded1a, 0x011bc9e0, 0x014dcaf6, 0x03a25bd2, 0x01f682c6, 0x0257fdcb, 0x018bc816, 0x00efb578, 0x002c12af}}, Y: Field{[10]uint32{0x01e168f6, 0x01405286, 0x03d4278b, 0x02bf6a39, 0x0262dcb8, 0x0362e6ef, 0x01b58690, 0x012f8d22, 0x026466ad, 0x001411e6}}}, + {X: Field{[10]uint32{0x01c78902, 0x0093a151, 0x01768226, 0x02df2012, 0x02295059, 0x0217c035, 0x023b3957, 0x03efb7c6, 0x01e85481, 0x003447df}}, Y: Field{[10]uint32{0x035c3416, 0x00cd961b, 0x039c3173, 0x032d1200, 0x02b48928, 0x00499a60, 0x03369d81, 0x004a4069, 0x0368be0c, 0x0007458c}}}, + {X: Field{[10]uint32{0x0356fd4b, 0x02e202d5, 0x02b90970, 0x0182ca6c, 0x02fd6151, 0x00ed8f2c, 0x03225af7, 0x031e9024, 0x01f465c4, 0x00288719}}, Y: Field{[10]uint32{0x0345ecfe, 0x01aa8c24, 0x0186c766, 0x03897de9, 0x0157f1e3, 0x001228a5, 0x01e34767, 0x039839f7, 0x0389394d, 0x001a689a}}}, + {X: Field{[10]uint32{0x02497a1f, 0x03bfb85a, 0x036a4fde, 0x022c61b1, 0x0036ccda, 0x029633b4, 0x003d3999, 0x00d83a49, 0x02fbb080, 0x0014f189}}, Y: Field{[10]uint32{0x002ac9b7, 0x01f86ddd, 0x036bbeda, 0x01eb1011, 0x0008264d, 0x00cd85aa, 0x01106fb9, 0x03fc7946, 0x000862a7, 0x002b6498}}}, + {X: Field{[10]uint32{0x00e6ff0e, 0x005b139d, 0x02870601, 0x00cc46dc, 0x0211d969, 0x01d07c42, 0x0364fcc8, 0x00eb6340, 0x01871b2a, 0x0033d9ed}}, Y: Field{[10]uint32{0x02b68422, 0x01b4a748, 0x03cae6d3, 0x01fc966a, 0x027be653, 0x033878c2, 0x00ac068c, 0x035d3bda, 0x037c10cc, 0x000b258e}}}, + {X: Field{[10]uint32{0x010b4bc7, 0x0335a9b2, 0x018d731e, 0x00a77a7d, 0x01364288, 0x00d33783, 0x01a89a4b, 0x021c00a7, 0x02d808cc, 0x00014085}}, Y: Field{[10]uint32{0x01e38b21, 0x0367e9d2, 0x01e0c123, 0x01f99549, 0x0236f65d, 0x02944b56, 0x02fce322, 0x01224637, 0x01f096bc, 0x00248307}}}, + {X: Field{[10]uint32{0x03d1aef3, 0x019b0f64, 0x001a2677, 0x02f789bb, 0x033d6000, 0x03de42bf, 0x00cc62da, 0x01beedec, 0x0194f468, 0x00076115}}, Y: Field{[10]uint32{0x0134d260, 0x0027e7cc, 0x0173425c, 0x00db35aa, 0x0092450b, 0x0211f71b, 0x01340351, 0x03680bbc, 0x03a6bd9d, 0x003ab846}}}, + {X: Field{[10]uint32{0x024785e1, 0x014aede7, 0x030c3d5c, 0x0295bdf9, 0x012e7750, 0x01678aad, 0x027d5908, 0x02e5f41d, 0x0350b6c5, 0x00046b53}}, Y: Field{[10]uint32{0x00023b94, 0x018f6d6a, 0x027ac4e2, 0x011befdf, 0x011826e8, 0x00533e9c, 0x0152496f, 0x03671408, 0x02368725, 0x000b0aee}}}, + {X: Field{[10]uint32{0x0149388c, 0x0090ac2f, 0x02e3d12b, 0x00965a75, 0x03f76ee4, 0x01820a87, 0x024a5198, 0x01cf84a6, 0x027cd723, 0x000d5a34}}, Y: Field{[10]uint32{0x0354fdb3, 0x031db561, 0x033daf04, 0x02360e73, 0x038eff10, 0x0042a395, 0x02356680, 0x01011c5b, 0x03a96d09, 0x00038db7}}}, + {X: Field{[10]uint32{0x017801d7, 0x028b05fc, 0x038abafa, 0x01caf702, 0x0246310f, 0x01c01dd0, 0x02abb919, 0x02743174, 0x033545e0, 0x000ddcaa}}, Y: Field{[10]uint32{0x0278884e, 0x01001082, 0x03260053, 0x02be3b6d, 0x00775693, 0x022c04b8, 0x03a50cda, 0x031d18b5, 0x028ceae0, 0x000948a6}}}, + {X: Field{[10]uint32{0x029274f2, 0x00153970, 0x0131fa13, 0x026747b8, 0x0244f3b2, 0x022e4eb4, 0x0224779c, 0x01c06b91, 0x024f72c4, 0x0020546c}}, Y: Field{[10]uint32{0x00bb6429, 0x035544ae, 0x00c9986e, 0x009134b9, 0x03734207, 0x0030a35d, 0x033fca05, 0x03586779, 0x030725ff, 0x001624e0}}}, + {X: Field{[10]uint32{0x01539c9a, 0x00d25197, 0x034c8692, 0x0076489f, 0x001b57a8, 0x0394dc20, 0x00597050, 0x007e3183, 0x015ad410, 0x0011a921}}, Y: Field{[10]uint32{0x01e36b59, 0x034f9a22, 0x00864bee, 0x00917faa, 0x039517ad, 0x038bc82e, 0x00117ae0, 0x01c6578b, 0x01cf2111, 0x0023e99b}}}, + {X: Field{[10]uint32{0x01803d16, 0x0224f185, 0x02d4f0fd, 0x017d3b38, 0x00efa7c4, 0x00e2f4a9, 0x0015001c, 0x013cf7bb, 0x01543e65, 0x0002e06f}}, Y: Field{[10]uint32{0x029d3e75, 0x00ae8053, 0x00c4a75d, 0x03f96a25, 0x032b3947, 0x03e4eda8, 0x00316228, 0x0269d8d1, 0x03aa3129, 0x000570fd}}}, + {X: Field{[10]uint32{0x012e7706, 0x03572b40, 0x01faba5c, 0x03c933f2, 0x01423f10, 0x01356200, 0x038c0549, 0x00c93491, 0x021cf2a0, 0x000f85a6}}, Y: Field{[10]uint32{0x01389135, 0x008d5886, 0x020f9869, 0x012ff2a4, 0x03004d45, 0x01c02d2f, 0x0069075a, 0x02b1f14d, 0x03ddd814, 0x00081016}}}, + {X: Field{[10]uint32{0x01a65956, 0x02f74b53, 0x02fdf534, 0x02e1510f, 0x03557f39, 0x0379866f, 0x027a1b8c, 0x02ccfc3d, 0x024ab161, 0x001d0a0f}}, Y: Field{[10]uint32{0x00b3df3a, 0x038da274, 0x03159bfe, 0x005c71de, 0x01380c17, 0x02205d13, 0x033ad2bc, 0x0170119d, 0x03e28978, 0x00088a5a}}}, + {X: Field{[10]uint32{0x026b756e, 0x00f68e7a, 0x00092bde, 0x02d37a0a, 0x021a617f, 0x02de5539, 0x01da0a23, 0x02f27ed9, 0x0386cb76, 0x00189c55}}, Y: Field{[10]uint32{0x02c2db32, 0x017f6414, 0x0317d34a, 0x01608787, 0x00eec54d, 0x03e65444, 0x0163337b, 0x028540ed, 0x03e38829, 0x000f09ee}}}, + {X: Field{[10]uint32{0x037c8aae, 0x0168001b, 0x01f739c5, 0x038b28d7, 0x002c93ae, 0x015659d0, 0x0336bc9d, 0x02e24e10, 0x0105db23, 0x00258800}}, Y: Field{[10]uint32{0x00a6ba26, 0x037e85e1, 0x03b19a2b, 0x03638ff4, 0x01ea41cd, 0x026197d2, 0x00307c5d, 0x00981320, 0x028d400a, 0x000c64a5}}}, + {X: Field{[10]uint32{0x031d13fb, 0x0365a5ad, 0x01c313aa, 0x00d5506d, 0x01317875, 0x02fe2cb1, 0x0052fb5c, 0x0246c233, 0x0398bd26, 0x002f51dd}}, Y: Field{[10]uint32{0x03ddfc3b, 0x01f8502a, 0x0150b6be, 0x00e5299b, 0x0351978b, 0x03139eca, 0x01dae500, 0x0000cf08, 0x01c9a4ab, 0x002f8ad4}}}, + {X: Field{[10]uint32{0x035289e7, 0x0270c151, 0x02b05903, 0x006bd4b6, 0x0070da10, 0x02ab19e2, 0x01490e83, 0x03e126ed, 0x0388e46f, 0x003e8524}}, Y: Field{[10]uint32{0x0067b2a7, 0x0080c2e2, 0x015e37f2, 0x03470613, 0x02c75af3, 0x03349a87, 0x032080ad, 0x0159d0ec, 0x037fa8d8, 0x00211555}}}, + {X: Field{[10]uint32{0x0391ba90, 0x00dab80c, 0x00e86ff4, 0x00f11c80, 0x028ab50d, 0x01e069c2, 0x03bfae73, 0x03fec752, 0x03830af1, 0x00108a36}}, Y: Field{[10]uint32{0x03a270a7, 0x01c7632d, 0x01637d40, 0x03252d2b, 0x032413dd, 0x0066f4b8, 0x01560b64, 0x03c28600, 0x010ab0e6, 0x001176c7}}}, + {X: Field{[10]uint32{0x0017c85c, 0x0187fcc2, 0x03d49f41, 0x026bf28a, 0x021dc3a3, 0x02da71a1, 0x0094c02e, 0x03d680f5, 0x0279fe0d, 0x002a5eac}}, Y: Field{[10]uint32{0x019bec7d, 0x00d72371, 0x022900e5, 0x0105ac72, 0x005d4b74, 0x0335b7bb, 0x032f99f7, 0x03785cf5, 0x00bff128, 0x001401b2}}}, + {X: Field{[10]uint32{0x004c668f, 0x011199a4, 0x02b63f8d, 0x011544d7, 0x039f27dc, 0x0067ee8d, 0x01a3a1cc, 0x03198538, 0x00576bdc, 0x0030351b}}, Y: Field{[10]uint32{0x03215f58, 0x0024db72, 0x03a71f19, 0x00bd1fff, 0x013d1917, 0x024f1d82, 0x017d7ccf, 0x02c940b2, 0x00a30b28, 0x000e5ad8}}}, + {X: Field{[10]uint32{0x01a8dbbd, 0x00cd8fec, 0x00e636de, 0x031b86e2, 0x020b7ae4, 0x01716f28, 0x01b8c2c2, 0x03e9f782, 0x03e04599, 0x001cf175}}, Y: Field{[10]uint32{0x007bc617, 0x005f689d, 0x01ea3faf, 0x037dbea3, 0x0309229a, 0x0310c759, 0x02986b00, 0x03590827, 0x008d558b, 0x000767b4}}}, + {X: Field{[10]uint32{0x024827a7, 0x00f227b8, 0x03ab7bbf, 0x01958ab4, 0x00b4788c, 0x006805d4, 0x0097c6ef, 0x01210e36, 0x001da2ef, 0x0000dc12}}, Y: Field{[10]uint32{0x020fa7b1, 0x0390d71d, 0x02aaa190, 0x02d14e16, 0x01ccf794, 0x00003c3c, 0x004acc33, 0x00640476, 0x0076c205, 0x002a22ce}}}, + {X: Field{[10]uint32{0x037807ec, 0x02206758, 0x01d54eda, 0x02fd926e, 0x02f2b68c, 0x00d1e42f, 0x01bb7d8d, 0x03c29267, 0x03033006, 0x000b72f8}}, Y: Field{[10]uint32{0x0290c1e1, 0x03d63dc6, 0x01bda5d6, 0x00f5613e, 0x02092cf4, 0x00fe8a35, 0x015de2df, 0x00ca7ae4, 0x02e3c7ab, 0x002e0ad1}}}, + {X: Field{[10]uint32{0x017bb4b7, 0x0110bd80, 0x023c908a, 0x0193e3d0, 0x0144052b, 0x0093de96, 0x035d957c, 0x01171778, 0x00a916db, 0x003d17cf}}, Y: Field{[10]uint32{0x029b5a96, 0x01a39808, 0x03fc1dad, 0x03de042e, 0x015b4a0f, 0x03193798, 0x01d6a795, 0x0135b368, 0x002fb315, 0x001e777c}}}, + {X: Field{[10]uint32{0x0387605e, 0x01fa5779, 0x02e934fe, 0x01af8ea6, 0x03ee1734, 0x01200954, 0x01c99bcc, 0x0159e919, 0x028bcad0, 0x0014032a}}, Y: Field{[10]uint32{0x0238370a, 0x01c318bc, 0x02a58f05, 0x0291fe08, 0x024e1bee, 0x00f77495, 0x019dccf7, 0x03235ab8, 0x02d075df, 0x0010211f}}}, + {X: Field{[10]uint32{0x024c3aff, 0x017bb135, 0x01557c52, 0x021dbea1, 0x037bcd8b, 0x008ee24e, 0x0346191e, 0x018b156d, 0x0186a239, 0x000c158a}}, Y: Field{[10]uint32{0x00577a53, 0x00dd41e0, 0x01fe9373, 0x02622975, 0x00e19d8d, 0x02ed5519, 0x020c0347, 0x014e0c6d, 0x02be41c4, 0x00000b56}}}, + {X: Field{[10]uint32{0x008e422e, 0x006383ad, 0x0078f63a, 0x00ada8c1, 0x01ec7238, 0x03879881, 0x013f690b, 0x01adca7b, 0x011a3252, 0x003da1f5}}, Y: Field{[10]uint32{0x01515704, 0x0384aadf, 0x01680211, 0x033a830b, 0x00f197e2, 0x00dac56f, 0x014da2ed, 0x013debf1, 0x033519c9, 0x003bf386}}}, + {X: Field{[10]uint32{0x01ca505d, 0x022133e8, 0x01018472, 0x029f7a99, 0x0322199e, 0x0002b9fa, 0x00e207e5, 0x00d47327, 0x03f0d385, 0x00041298}}, Y: Field{[10]uint32{0x00239cc5, 0x02b12a0c, 0x0267ce05, 0x03a4cf4b, 0x00a6de0b, 0x028a8bb7, 0x031600a0, 0x002cf16b, 0x008750b2, 0x001a7086}}}, + {X: Field{[10]uint32{0x0280fc6e, 0x02b268fa, 0x01c035e6, 0x02f50c0a, 0x02eb3d59, 0x03d34a56, 0x03963e2f, 0x023286af, 0x00994b7b, 0x00142598}}, Y: Field{[10]uint32{0x027287b1, 0x018eb7cc, 0x02519729, 0x029ef22b, 0x0256be56, 0x0152ba8f, 0x02116748, 0x0066c604, 0x01cd40d0, 0x00352162}}}, + {X: Field{[10]uint32{0x00513c95, 0x033e23d5, 0x02a0dd22, 0x027f4721, 0x007ac22e, 0x02c3cb1f, 0x0388e85e, 0x0384d475, 0x02e794e5, 0x000c41b5}}, Y: Field{[10]uint32{0x03a2bca0, 0x02612f4b, 0x00dfadbf, 0x02320b3a, 0x004ad288, 0x0001ab86, 0x02849d84, 0x02330a64, 0x013c0456, 0x00301796}}}, + {X: Field{[10]uint32{0x0059fdce, 0x0053db88, 0x01235e79, 0x010f79a0, 0x03d1081b, 0x00ee7973, 0x0376ac71, 0x02f73a13, 0x011c9977, 0x0013259f}}, Y: Field{[10]uint32{0x008968cd, 0x02f9457a, 0x010ee206, 0x000a8a3a, 0x00fcc10d, 0x00e971f7, 0x002cb098, 0x026dd057, 0x00b2a3e9, 0x0021991c}}}, + {X: Field{[10]uint32{0x02781a52, 0x03fe440e, 0x032b2e4a, 0x000bfd78, 0x01b4027b, 0x03d63d8b, 0x00bbb7fb, 0x01dd0476, 0x0099ae8d, 0x00258c64}}, Y: Field{[10]uint32{0x03947389, 0x03717d59, 0x00ed422e, 0x0136de1f, 0x03d776eb, 0x02ee8bc2, 0x03148f8d, 0x00a1268e, 0x00740daf, 0x001b0440}}}, + {X: Field{[10]uint32{0x00247ee7, 0x00c3e8d6, 0x028b3bdf, 0x00add65c, 0x02b97224, 0x016bd5bc, 0x017406d9, 0x01b3aa77, 0x032387a3, 0x001f24ee}}, Y: Field{[10]uint32{0x02989942, 0x03136667, 0x00e018f7, 0x03db8f59, 0x0017cb34, 0x02568389, 0x0201e168, 0x01f219b6, 0x02983348, 0x00087937}}}, + {X: Field{[10]uint32{0x03f1e074, 0x02a46541, 0x01cddc3b, 0x02edf1b7, 0x01c764da, 0x021e8c8a, 0x01db1433, 0x005861b6, 0x020388de, 0x00319792}}, Y: Field{[10]uint32{0x03ca658b, 0x01266ef3, 0x0017bdaa, 0x030bf5e1, 0x0202137b, 0x0311707e, 0x0225a457, 0x016ca33a, 0x01430800, 0x003561b4}}}, + {X: Field{[10]uint32{0x00d674d5, 0x0285f619, 0x00f354d9, 0x02c6a042, 0x00381b1f, 0x0076346e, 0x01a380c7, 0x021a4af3, 0x012490c2, 0x0036256a}}, Y: Field{[10]uint32{0x03de17f5, 0x013dd61f, 0x0373d980, 0x028ac02b, 0x01c7cf2b, 0x02ef3496, 0x02f5728d, 0x0004fde7, 0x02250a63, 0x0034c2f6}}}, + {X: Field{[10]uint32{0x03def988, 0x03fc7857, 0x0113227b, 0x00e8f1fc, 0x00c892e2, 0x018f47dc, 0x03fa1640, 0x02e6efeb, 0x003a5b36, 0x0024119f}}, Y: Field{[10]uint32{0x029b15a7, 0x0320207a, 0x01568946, 0x01dc78cf, 0x02205225, 0x0288ab5d, 0x03ccb41b, 0x01f66cf3, 0x01914024, 0x0013b1c0}}}, + {X: Field{[10]uint32{0x02294c7e, 0x032b5d0f, 0x019810ab, 0x01756369, 0x03b4d38e, 0x03d4fbf1, 0x03268f78, 0x000969eb, 0x01630d0e, 0x0017340f}}, Y: Field{[10]uint32{0x002dfb3e, 0x002dc3ed, 0x007811a1, 0x010cd376, 0x00f168e0, 0x03938392, 0x01510cfe, 0x035072ac, 0x036e5517, 0x0030dca7}}}, + {X: Field{[10]uint32{0x007e964b, 0x00028943, 0x02988fc7, 0x000be601, 0x008bf69c, 0x03cd88a5, 0x01d7629b, 0x03173a8f, 0x009c652b, 0x00144c31}}, Y: Field{[10]uint32{0x032cf563, 0x0070855b, 0x0336b738, 0x008c6af8, 0x03a027ef, 0x01e910c4, 0x01f98c7b, 0x036f4c26, 0x02194bc9, 0x001f91b8}}}, + {X: Field{[10]uint32{0x02dd34da, 0x011de5a3, 0x01dbcc54, 0x0157969f, 0x02261a31, 0x02e49204, 0x01473066, 0x0353a44e, 0x002a33b8, 0x00256267}}, Y: Field{[10]uint32{0x026b7cb3, 0x03166476, 0x00a41d4d, 0x02d24e82, 0x01bac79f, 0x02f83411, 0x027277b5, 0x000a4a7a, 0x02998424, 0x002259ef}}}, + {X: Field{[10]uint32{0x0089745f, 0x01b903bd, 0x026049dd, 0x00e0b9d7, 0x036e55d2, 0x006137f3, 0x00650c88, 0x03a4fdf1, 0x00138cb3, 0x0000e4a0}}, Y: Field{[10]uint32{0x00006a52, 0x00251c7e, 0x03799587, 0x0011bed0, 0x02056bdf, 0x00bc9556, 0x01bd6d47, 0x03ce8722, 0x0298b897, 0x001c2c97}}}, + {X: Field{[10]uint32{0x0380b451, 0x0223f0cb, 0x03997fa3, 0x0034f3f1, 0x01ba7207, 0x03fc4223, 0x010497cb, 0x02fb7392, 0x0331b5fd, 0x00291f84}}, Y: Field{[10]uint32{0x01576b19, 0x00999baa, 0x024ecec2, 0x01194884, 0x00062447, 0x028f32e7, 0x006c75bd, 0x00119502, 0x00befff0, 0x0032952e}}}, + {X: Field{[10]uint32{0x00cfb96a, 0x002fb478, 0x036c82d5, 0x032ed237, 0x03f1b325, 0x0020f3f4, 0x03bb1344, 0x01d4a0f2, 0x008e16c5, 0x00330698}}, Y: Field{[10]uint32{0x00cc6734, 0x0082a0ce, 0x03ab5551, 0x021ec092, 0x03591b8f, 0x02382484, 0x03b0c987, 0x02c89104, 0x024467d9, 0x0016e2b2}}}, + {X: Field{[10]uint32{0x03fc3cea, 0x003db0b0, 0x0191a5d7, 0x0075a6d6, 0x03b7438d, 0x036cef78, 0x024d1df2, 0x02ebadeb, 0x03c7591e, 0x00360d52}}, Y: Field{[10]uint32{0x02ab5ad3, 0x019bc227, 0x03a31fe2, 0x031ca601, 0x017d95af, 0x01d646fb, 0x00227039, 0x03c0fca5, 0x02936765, 0x003bf225}}}, + {X: Field{[10]uint32{0x01def8aa, 0x038f68a3, 0x01d6ff2a, 0x007138ff, 0x03481ee2, 0x03681d91, 0x02ef42e6, 0x01d02c84, 0x0163ceb2, 0x001ab072}}, Y: Field{[10]uint32{0x01164281, 0x02fcfa39, 0x00d9fb1b, 0x035c2844, 0x00c52140, 0x017c80c7, 0x0053c94f, 0x016b8915, 0x00171b6d, 0x00013f22}}}, + {X: Field{[10]uint32{0x0318b42d, 0x034b91db, 0x035c4ddd, 0x00f42803, 0x0274d4da, 0x01e3ecdb, 0x00474697, 0x010523e7, 0x0359b52e, 0x002f84c3}}, Y: Field{[10]uint32{0x03c47069, 0x0263707e, 0x01516093, 0x02e51912, 0x01c5b9f8, 0x030737d8, 0x02a7d761, 0x02962808, 0x01e2f739, 0x0005b736}}}, + {X: Field{[10]uint32{0x0063bd2f, 0x031e79b0, 0x00f3ffc3, 0x03e47e7d, 0x0124ee71, 0x018996ec, 0x0356e599, 0x012955a2, 0x00cc3986, 0x001a176e}}, Y: Field{[10]uint32{0x02b50f29, 0x02eb9721, 0x03493037, 0x02fe69d7, 0x0122b396, 0x016f8c08, 0x0333b8e0, 0x00bdf0b4, 0x01418e5b, 0x001cc29c}}}, + {X: Field{[10]uint32{0x01d743ae, 0x019bb995, 0x024eaaad, 0x02bf3c3b, 0x030f31f9, 0x026f0626, 0x025e564b, 0x01306838, 0x03f389f7, 0x000e7d07}}, Y: Field{[10]uint32{0x026c8622, 0x03948375, 0x018d88e1, 0x02cbb7e7, 0x0126fdae, 0x00ce3dce, 0x030aad09, 0x013fb94f, 0x036de25d, 0x003efa83}}}, + {X: Field{[10]uint32{0x0020ed1f, 0x02c82313, 0x01f28b12, 0x018b2fd6, 0x03c29b1b, 0x0120ef03, 0x00737b3d, 0x0258e665, 0x017441bc, 0x0035e9a5}}, Y: Field{[10]uint32{0x025ba8cb, 0x0358c6c1, 0x024ceef2, 0x027d07e0, 0x0291eea2, 0x02e68f41, 0x007ca251, 0x00563a70, 0x02dacdf8, 0x00339138}}}, + {X: Field{[10]uint32{0x01eaec9a, 0x010e57b0, 0x030ba491, 0x00717f7c, 0x0022f598, 0x00acde21, 0x02867934, 0x032edcaf, 0x01609139, 0x00216eb4}}, Y: Field{[10]uint32{0x0314dfec, 0x01a92173, 0x038db419, 0x031e10e0, 0x02362055, 0x038ff8fa, 0x01c57e88, 0x01dacac9, 0x006129e5, 0x00267f35}}}, + {X: Field{[10]uint32{0x03ea49e5, 0x007ae008, 0x0372d51a, 0x03f90842, 0x0174d986, 0x03c5f682, 0x002ffbe8, 0x0285648f, 0x02c4d428, 0x0008e02e}}, Y: Field{[10]uint32{0x02d6f54b, 0x02ac1d17, 0x0065e5a6, 0x016f4824, 0x033ca101, 0x013512ee, 0x01e38bfc, 0x031fd791, 0x0313fde4, 0x003d2bdc}}}, + {X: Field{[10]uint32{0x024f9cf2, 0x030a7f4d, 0x00e9e46f, 0x03ee253d, 0x0397c1ac, 0x0088480a, 0x019108df, 0x0077438d, 0x0359b7d6, 0x00301584}}, Y: Field{[10]uint32{0x027d83dd, 0x0004c9f4, 0x0092e029, 0x000f3b3d, 0x0275b161, 0x01433acc, 0x03ea5ff3, 0x02a7d8b3, 0x01801c72, 0x000f0ddf}}}, + {X: Field{[10]uint32{0x020c2a06, 0x010e3124, 0x00fc64ed, 0x00102962, 0x0276481c, 0x026ee96c, 0x01181d30, 0x013cabae, 0x01c10b8f, 0x001cb126}}, Y: Field{[10]uint32{0x02b1ce53, 0x000490ec, 0x01e7a72d, 0x03fecc11, 0x02f05ff8, 0x03e0af06, 0x034867b1, 0x014c50a8, 0x008e6082, 0x001b2653}}}, + {X: Field{[10]uint32{0x03cf477d, 0x0081153f, 0x026f884e, 0x0272d77c, 0x0166e02c, 0x001bfad1, 0x038e2f3f, 0x018827e3, 0x00be02b6, 0x00237a13}}, Y: Field{[10]uint32{0x002a34a6, 0x002e64dd, 0x03379641, 0x010a8067, 0x02ac9e85, 0x028edeb0, 0x0348e986, 0x01f621a4, 0x0280c4d0, 0x0031fcbd}}}, + {X: Field{[10]uint32{0x001710f2, 0x00b44b90, 0x034427d0, 0x03b98f17, 0x029a2d02, 0x021ae74b, 0x02c80488, 0x035d8b96, 0x01d86581, 0x0036ffb2}}, Y: Field{[10]uint32{0x00daafea, 0x0221a370, 0x03c90004, 0x02a26284, 0x01b46496, 0x00199236, 0x005acb59, 0x02c6b2a2, 0x03f9827b, 0x001b9847}}}, + {X: Field{[10]uint32{0x01d0453d, 0x015bc8f4, 0x037f9f24, 0x00a8a455, 0x039588dc, 0x00aab9ac, 0x010ade78, 0x03b746cf, 0x01f86099, 0x00277594}}, Y: Field{[10]uint32{0x02715ebd, 0x0282c17b, 0x018455f5, 0x017e6184, 0x03cd3f90, 0x03edb5dc, 0x00be81ad, 0x02183806, 0x0217f0d7, 0x0013db6d}}}, + {X: Field{[10]uint32{0x03d66a15, 0x00982fe6, 0x033d1926, 0x03cbe8bc, 0x02356445, 0x039823e5, 0x037a885e, 0x0378d79d, 0x021ac869, 0x000bf605}}, Y: Field{[10]uint32{0x01307f25, 0x02d3203f, 0x03daa7c6, 0x028825e1, 0x0398c6e7, 0x00b798d1, 0x00163eb1, 0x00b64ad9, 0x01e9674c, 0x00074b08}}}, + {X: Field{[10]uint32{0x029dc391, 0x03a2a128, 0x038a8495, 0x0197e21d, 0x008b6d87, 0x02503b7d, 0x01538ce4, 0x0016c8fc, 0x038924f5, 0x000fc96f}}, Y: Field{[10]uint32{0x008164f2, 0x011ca5cb, 0x03c30afd, 0x01527715, 0x00344382, 0x00b184ee, 0x02b02525, 0x001e0862, 0x01830e7e, 0x001c094d}}}, + {X: Field{[10]uint32{0x00773f0b, 0x0387b89b, 0x02b47ff2, 0x01c2d57a, 0x00467dc7, 0x021163cc, 0x033d2fe2, 0x008d13e3, 0x0359d5f7, 0x000f03c0}}, Y: Field{[10]uint32{0x02db33c7, 0x00a72a07, 0x02c7b127, 0x00c3917c, 0x00b9c250, 0x01189949, 0x0050d787, 0x0067116b, 0x0239459f, 0x0012560e}}}, + {X: Field{[10]uint32{0x02b73a15, 0x0170c20d, 0x00dd73be, 0x01c3ec5c, 0x0087e38d, 0x0283764f, 0x0045855f, 0x0177c8d8, 0x0266ec1b, 0x00158e01}}, Y: Field{[10]uint32{0x019921a7, 0x0387c29d, 0x03b117bc, 0x024e0a47, 0x00b5cbbf, 0x022be3d8, 0x0291252c, 0x02b1aa6a, 0x00f0b210, 0x001c01a4}}}, + {X: Field{[10]uint32{0x009298bd, 0x01b4bea7, 0x006738bc, 0x0007ef8f, 0x0225f902, 0x03cff11f, 0x02b228aa, 0x017dffb1, 0x010b0b9a, 0x001c729c}}, Y: Field{[10]uint32{0x039abc89, 0x027bf8cb, 0x003f8fcc, 0x028d4789, 0x02c759bc, 0x01c0566b, 0x00912871, 0x002266c6, 0x028dc075, 0x001f7494}}}, + {X: Field{[10]uint32{0x01264575, 0x00b42cd7, 0x01102511, 0x02ba09f2, 0x006ed87f, 0x02386f8f, 0x02ec20f9, 0x021439f0, 0x003cc938, 0x001e377b}}, Y: Field{[10]uint32{0x01680321, 0x01b7b6cf, 0x01ddfd48, 0x018fc5e6, 0x0022b9c1, 0x01bc6798, 0x0185048d, 0x01014321, 0x0151766a, 0x000641ca}}}, + {X: Field{[10]uint32{0x034ed70b, 0x01aacf1e, 0x0267f322, 0x0127b40f, 0x02058132, 0x00f6b0a6, 0x02709509, 0x0215fa31, 0x02fd8852, 0x0026abae}}, Y: Field{[10]uint32{0x0305fffb, 0x033b34d1, 0x0271c7b9, 0x033101ae, 0x032457bd, 0x00f134bc, 0x01e13bca, 0x02f54419, 0x02ccb541, 0x00231a8a}}}, + {X: Field{[10]uint32{0x032f79e2, 0x00af96f6, 0x01bcc6d1, 0x01a882ae, 0x01a3096a, 0x02e6fc4e, 0x016c7b28, 0x0203f768, 0x02749411, 0x00161bb2}}, Y: Field{[10]uint32{0x03488d71, 0x039be4e8, 0x02ad5bfd, 0x03795805, 0x020ac4bf, 0x009a887a, 0x005a7f80, 0x002796bf, 0x01123616, 0x0002cec7}}}, + {X: Field{[10]uint32{0x0150ddf8, 0x00e060e3, 0x0397ee36, 0x02c4dab3, 0x03c0e0b6, 0x0330fb98, 0x03ed7d40, 0x0378b21b, 0x003edbe4, 0x000615ef}}, Y: Field{[10]uint32{0x00275363, 0x0293d923, 0x01835119, 0x02df3168, 0x028a7fbd, 0x016119d6, 0x0359c673, 0x022337b1, 0x007be7a5, 0x003a97a0}}}, + {X: Field{[10]uint32{0x00e5b01a, 0x0361599e, 0x037ba863, 0x02589fd7, 0x03642067, 0x032e204e, 0x022a6cdb, 0x00b18800, 0x03440757, 0x002a9331}}, Y: Field{[10]uint32{0x03a2f836, 0x03c267e3, 0x008bff39, 0x0236bdf8, 0x01a4a97b, 0x00e08698, 0x03b7f9bb, 0x00912a68, 0x02c9d259, 0x002ea5a6}}}, + {X: Field{[10]uint32{0x004f36aa, 0x01368d48, 0x02179e79, 0x01af2c9d, 0x030d6f73, 0x010f6173, 0x005fad0a, 0x010d9da2, 0x00095917, 0x0011623b}}, Y: Field{[10]uint32{0x00c7c62e, 0x021bd2c3, 0x01c3702f, 0x024a9532, 0x03a95116, 0x0372eb8e, 0x01c89d10, 0x02071bb8, 0x027ecdc6, 0x003ee0d7}}}, + {X: Field{[10]uint32{0x0080653c, 0x02cc447a, 0x00a4eca3, 0x00881408, 0x0025ce66, 0x00bdec7f, 0x0233f227, 0x017e1a67, 0x01037a3e, 0x00219eb3}}, Y: Field{[10]uint32{0x01764646, 0x01fceb49, 0x03946d8d, 0x013975b3, 0x02639cd9, 0x03d91903, 0x009ba3cf, 0x03e414c9, 0x02c757d3, 0x003a444a}}}, + {X: Field{[10]uint32{0x02df370b, 0x03f576c9, 0x03c13318, 0x013d185b, 0x00b52781, 0x026b8ef5, 0x02e46630, 0x007708a2, 0x0169e4f8, 0x00178290}}, Y: Field{[10]uint32{0x0140d001, 0x03e2b74c, 0x00ca9e58, 0x009232cd, 0x00c38cd6, 0x02eb2b53, 0x022e32c3, 0x024d3afb, 0x01a8fc23, 0x0016f4cd}}}, + {X: Field{[10]uint32{0x0101c0f6, 0x02d3ffec, 0x00263663, 0x028eb7fa, 0x01542a55, 0x00aa0bc5, 0x01b2e578, 0x0090606d, 0x006939df, 0x0024014d}}, Y: Field{[10]uint32{0x03e3d991, 0x007a944d, 0x01476e3f, 0x01e0e86c, 0x01744607, 0x0270e978, 0x00f38378, 0x0217da16, 0x01899739, 0x0013fc35}}}, + {X: Field{[10]uint32{0x03cec63f, 0x030ec358, 0x035618f4, 0x01dc8a9c, 0x004e2db0, 0x0242c540, 0x0232f33d, 0x00cee81a, 0x01a553df, 0x002a650e}}, Y: Field{[10]uint32{0x01656cd4, 0x0108f6ce, 0x00e7e7e6, 0x0317dc0f, 0x026f9c1f, 0x0139a61f, 0x01cd8a2e, 0x031ddfaa, 0x0129f11f, 0x00066382}}}, + {X: Field{[10]uint32{0x03085282, 0x00bf7c57, 0x00355a0e, 0x02c42de3, 0x031c7789, 0x020aa8b9, 0x03ab71df, 0x02e85323, 0x01361381, 0x00147ca8}}, Y: Field{[10]uint32{0x032d16a2, 0x0065f3fa, 0x00ea5a97, 0x009a124d, 0x026e2b7b, 0x00c65e8f, 0x0323bbe4, 0x03fa935b, 0x029fca15, 0x003f57c4}}}, + {X: Field{[10]uint32{0x02a91d3a, 0x014c560b, 0x0368e820, 0x02e3d507, 0x03bed208, 0x019316d3, 0x01097778, 0x012cb265, 0x001c8b06, 0x000ea47e}}, Y: Field{[10]uint32{0x03a513c9, 0x01ce8048, 0x00404085, 0x0252d804, 0x00a542b5, 0x01616a3a, 0x0077329e, 0x00e78654, 0x003ad4ae, 0x00275640}}}, + {X: Field{[10]uint32{0x0336c5c8, 0x01abc665, 0x03462105, 0x02138502, 0x005e491e, 0x01ca3045, 0x0026deee, 0x03e85cfc, 0x0150aa22, 0x001c7a67}}, Y: Field{[10]uint32{0x036a4995, 0x019fb105, 0x03b2653f, 0x038e6ec2, 0x03699806, 0x03651f9d, 0x02627291, 0x022119f1, 0x03776858, 0x003fcf93}}}, + {X: Field{[10]uint32{0x008aaa39, 0x0248005f, 0x0180e6d3, 0x003ba166, 0x0046f745, 0x0338bcf3, 0x0353286a, 0x0113dcfe, 0x02933a03, 0x002b4527}}, Y: Field{[10]uint32{0x009e81bd, 0x03dbeba4, 0x03e3f2a4, 0x00ffc455, 0x0165a5ab, 0x026a0de2, 0x03140603, 0x03cd52d3, 0x039885a4, 0x001f6fd1}}}, + {X: Field{[10]uint32{0x011ccb01, 0x011fe45d, 0x00c321a2, 0x035dfaef, 0x0286e79e, 0x025a4417, 0x000ca207, 0x023db129, 0x037f5ad7, 0x00113c28}}, Y: Field{[10]uint32{0x0353044a, 0x01255570, 0x01905af6, 0x02684a24, 0x0070836d, 0x019ad44a, 0x031e5590, 0x02cfefbe, 0x0067911e, 0x003d0136}}}, + {X: Field{[10]uint32{0x0330ad5d, 0x00e29842, 0x02c1dc0d, 0x038ec9c7, 0x0050f5c0, 0x025c5e1a, 0x00a4a8b2, 0x03823130, 0x00c3de8d, 0x0013ddf7}}, Y: Field{[10]uint32{0x01f57c69, 0x00da8e53, 0x032fa558, 0x000201bb, 0x0358dc73, 0x002a996c, 0x018aa5ab, 0x003ba484, 0x024f8ae8, 0x001cf1d0}}}, + {X: Field{[10]uint32{0x02005555, 0x01c4dc79, 0x01c0d38d, 0x0093978b, 0x016d6d5c, 0x03bd9630, 0x026efd38, 0x00248d8d, 0x008b102a, 0x001e5284}}, Y: Field{[10]uint32{0x0246ba2c, 0x03d9cdf3, 0x03f751a6, 0x012d7f72, 0x007c9e30, 0x007e11e6, 0x02cf0fdc, 0x024141a6, 0x01efefd7, 0x0021c659}}}, + {X: Field{[10]uint32{0x00e8e594, 0x029235c5, 0x003a822d, 0x01f3a8c2, 0x02a72e29, 0x0282c494, 0x01bd49f5, 0x0218eb7d, 0x0161234b, 0x003c6621}}, Y: Field{[10]uint32{0x003fc418, 0x03acd86a, 0x0203fca6, 0x01cf4c6a, 0x03abd2f5, 0x03f68fe3, 0x0036612d, 0x01468630, 0x0107d0ab, 0x001eb6e9}}}, + {X: Field{[10]uint32{0x003f4a80, 0x02862f73, 0x01c75491, 0x036fe0b4, 0x02f3fd27, 0x01e42abb, 0x0249b8f7, 0x026781c4, 0x0156c07c, 0x00122fb5}}, Y: Field{[10]uint32{0x02316e94, 0x00795559, 0x03543856, 0x008b5250, 0x0046cf01, 0x03976f2a, 0x00dd08cb, 0x0106346d, 0x028021be, 0x00276b94}}}, + {X: Field{[10]uint32{0x003ab9c1, 0x032ccfe5, 0x00a1f3bf, 0x02ff0b72, 0x00ec8449, 0x01d2eb1d, 0x0376fef9, 0x01e74e3c, 0x03fbe537, 0x002effbc}}, Y: Field{[10]uint32{0x0312551b, 0x01b1b378, 0x030b0800, 0x018e1200, 0x00ed4625, 0x02f83aa3, 0x010e8495, 0x022bff18, 0x0372ee79, 0x002fa96d}}}, + {X: Field{[10]uint32{0x015b7f06, 0x01d2f582, 0x0212e00b, 0x02bfbaf0, 0x00156839, 0x03305d71, 0x006b04be, 0x033548e0, 0x001527b3, 0x0010abcd}}, Y: Field{[10]uint32{0x01dcef4f, 0x02d1b7d6, 0x021370e7, 0x006096fe, 0x00f91a55, 0x02237a60, 0x036d0961, 0x01bfd88d, 0x03e5ebf1, 0x001a1b97}}}, + {X: Field{[10]uint32{0x01ce10e6, 0x037849dc, 0x00d6938a, 0x00990309, 0x02307497, 0x0162df57, 0x03ea376d, 0x021f11bb, 0x038b74ae, 0x000f15b5}}, Y: Field{[10]uint32{0x00d54a41, 0x00c9d492, 0x03883507, 0x002d446f, 0x0039fed0, 0x0328af1b, 0x023b36b6, 0x0388574d, 0x02ccf9d1, 0x0033a5f7}}}, + {X: Field{[10]uint32{0x0389b61a, 0x03f6c26d, 0x0291d33a, 0x0073693c, 0x0267b52a, 0x0123da73, 0x02404a9e, 0x03bc2ab9, 0x01991944, 0x0012c489}}, Y: Field{[10]uint32{0x02089571, 0x02ef99ad, 0x0211bf3e, 0x0201e391, 0x0062b1bc, 0x01b64af0, 0x037932cb, 0x03e6494d, 0x035027a3, 0x001722f8}}}, + {X: Field{[10]uint32{0x00d49db5, 0x01cd4346, 0x03e9acd3, 0x0154ac02, 0x01716749, 0x01363167, 0x0258f181, 0x024c528d, 0x0067c02c, 0x0002790a}}, Y: Field{[10]uint32{0x03a8c761, 0x025df1c5, 0x01d0d831, 0x0079b635, 0x0039f65b, 0x03f8833c, 0x003155da, 0x0035cf5e, 0x00351ff9, 0x001749b4}}}, + {X: Field{[10]uint32{0x035359ae, 0x036e5cc9, 0x00b94402, 0x007976f6, 0x00306ab3, 0x01efdbea, 0x0027d0d4, 0x014d14a8, 0x010c05a9, 0x002590ce}}, Y: Field{[10]uint32{0x027a3933, 0x025c86ac, 0x000cea69, 0x00b7d657, 0x03abbf49, 0x003ef52e, 0x03560d05, 0x03a70748, 0x03f71019, 0x002cd535}}}, + {X: Field{[10]uint32{0x02126b69, 0x03d5881f, 0x01f77bac, 0x0213faba, 0x021b6f78, 0x007c55e0, 0x01374f90, 0x01f7ad41, 0x02fb86f7, 0x0022d245}}, Y: Field{[10]uint32{0x00be1fd4, 0x032cc98a, 0x00213816, 0x03cd93e7, 0x02ce6d2a, 0x02f21feb, 0x01c3d59c, 0x036c4c15, 0x03c06d86, 0x000026a0}}}, + {X: Field{[10]uint32{0x00054b9f, 0x00f3c334, 0x02ff37ba, 0x03fa554b, 0x0011de8e, 0x021223df, 0x01ee9abb, 0x020b107d, 0x034b1097, 0x00034a77}}, Y: Field{[10]uint32{0x00ca07a8, 0x01826050, 0x03d1c98a, 0x01106627, 0x00d1a5a4, 0x01e6da02, 0x03e08f6a, 0x00b13c2e, 0x0237ea24, 0x0006fc18}}}, + {X: Field{[10]uint32{0x01dbd41d, 0x02e3a9c8, 0x01ede203, 0x019481b7, 0x03d4a202, 0x01444eb2, 0x01167d05, 0x0141114e, 0x017ba540, 0x000aabce}}, Y: Field{[10]uint32{0x02f73081, 0x022087a7, 0x03c6663d, 0x03093dec, 0x00013a81, 0x028cbcc2, 0x024b4a8a, 0x02eeb247, 0x02c71132, 0x000dd38c}}}, + {X: Field{[10]uint32{0x0357ef48, 0x004cfe73, 0x03b817b1, 0x0251762d, 0x001ca58a, 0x02da8e63, 0x03d287c8, 0x0339ae3a, 0x03d223ea, 0x00088e6c}}, Y: Field{[10]uint32{0x02b4cd46, 0x032f50f8, 0x03bda94c, 0x03ecf93a, 0x00f01d70, 0x02380fca, 0x02f4b267, 0x02a2c822, 0x00b74b54, 0x003f6a20}}}, + {X: Field{[10]uint32{0x03c7e365, 0x03b18929, 0x00f62e86, 0x00ce7c95, 0x01b88ee2, 0x007b6c51, 0x01c91785, 0x01cb7dfb, 0x03bcf47e, 0x0022cca1}}, Y: Field{[10]uint32{0x01fecabb, 0x03c3c802, 0x005be321, 0x01a47ad8, 0x00db6d99, 0x0030f4df, 0x0100868c, 0x0355397e, 0x03c09f60, 0x0015281a}}}, + {X: Field{[10]uint32{0x004f7993, 0x026072a6, 0x0136dd8d, 0x031c935b, 0x01ace742, 0x03a1d4e7, 0x017e1ff3, 0x03fba443, 0x02a33e3c, 0x00366b33}}, Y: Field{[10]uint32{0x027dc88b, 0x018e2a10, 0x02690565, 0x02055097, 0x0162947f, 0x0082f40b, 0x00f5a05a, 0x03974b63, 0x034aa901, 0x001ab725}}}, + {X: Field{[10]uint32{0x00b3206d, 0x03cab96a, 0x036b308d, 0x036902e3, 0x004af245, 0x01d3b80e, 0x0292b504, 0x0122f799, 0x03f834c3, 0x0035ff15}}, Y: Field{[10]uint32{0x004e2d19, 0x034acc09, 0x03406e38, 0x02c47e6b, 0x000231ed, 0x01b6c0c9, 0x028e04ba, 0x027faa6c, 0x024b41fd, 0x0002c94f}}}, + {X: Field{[10]uint32{0x00d9588a, 0x016d70c5, 0x015059ad, 0x0181e88f, 0x02b815f6, 0x02540878, 0x0334e165, 0x005024da, 0x03e0ec4a, 0x00096023}}, Y: Field{[10]uint32{0x018e7b96, 0x01e63df1, 0x00ec66f4, 0x01b3a2ef, 0x03a75bc1, 0x02e77c7f, 0x00a1eefb, 0x01bbe232, 0x02d5b1d4, 0x00341992}}}, + {X: Field{[10]uint32{0x01927914, 0x01ba84e6, 0x01ecc322, 0x01d8a68e, 0x0359e67a, 0x00368d69, 0x0152fa57, 0x015759c8, 0x03801139, 0x003911d1}}, Y: Field{[10]uint32{0x03793bee, 0x037cfe50, 0x035eac1a, 0x034a0dfb, 0x02ad4eb3, 0x0159b1e3, 0x02834d33, 0x00121b69, 0x0170aa2f, 0x00124f30}}}, + {X: Field{[10]uint32{0x026311ad, 0x000ae444, 0x02f11476, 0x02160b51, 0x0244e2b9, 0x0003c411, 0x01dd900d, 0x035c19db, 0x01be2af9, 0x00314103}}, Y: Field{[10]uint32{0x024ddb15, 0x0234a00c, 0x0186b91a, 0x006c41dd, 0x01a7cabc, 0x01e2a739, 0x01b64667, 0x0185c732, 0x0311a231, 0x002102aa}}}, + {X: Field{[10]uint32{0x037d9f14, 0x008a3ad0, 0x023a812a, 0x013e4ef6, 0x008116cd, 0x0311f539, 0x03ca1236, 0x00cface9, 0x03aa316d, 0x0008ce46}}, Y: Field{[10]uint32{0x037efd4d, 0x02d53d72, 0x00b7f1eb, 0x01e71f2e, 0x010bc97c, 0x01b63446, 0x00a69aff, 0x01dbf007, 0x001d9e6d, 0x0007604d}}}, + {X: Field{[10]uint32{0x0039ac38, 0x02acd3ef, 0x01eb945e, 0x036302e5, 0x008aeb8f, 0x03ace525, 0x006682cb, 0x02e9c8bf, 0x03563de3, 0x0004c845}}, Y: Field{[10]uint32{0x0174f006, 0x02e6b623, 0x013df89e, 0x001506dd, 0x01aa5279, 0x009b2fee, 0x0161431e, 0x00208df2, 0x03218a4b, 0x0026ddc9}}}, + {X: Field{[10]uint32{0x02789708, 0x01dea56e, 0x0096d2ff, 0x00eebfba, 0x01708b94, 0x02d735f8, 0x00f896bb, 0x00bf1e87, 0x0098b27a, 0x000ee2ee}}, Y: Field{[10]uint32{0x0136c1cb, 0x00403227, 0x028c9248, 0x01e70d01, 0x027fdcbf, 0x02858d77, 0x01e13e96, 0x000f9568, 0x001c6680, 0x00360795}}}, + {X: Field{[10]uint32{0x00217b4d, 0x03a267f8, 0x02e21c7c, 0x00b20568, 0x03d94f16, 0x0300103f, 0x005e4f55, 0x0312eb14, 0x022c9af5, 0x003875c2}}, Y: Field{[10]uint32{0x03a4532e, 0x00f3fb25, 0x0212c2fd, 0x02679e70, 0x01eb063b, 0x00ac794f, 0x006d66de, 0x00392cda, 0x00d6d20e, 0x002c958c}}}, + {X: Field{[10]uint32{0x0112de1c, 0x02aa9ef6, 0x001b5ff1, 0x0320c3ed, 0x03a7e681, 0x00acdb7f, 0x00f0c56e, 0x01e3eb4e, 0x0023a517, 0x0006c78e}}, Y: Field{[10]uint32{0x0184d4c1, 0x00ffcc89, 0x0116cd59, 0x009a0ca0, 0x03bebe16, 0x02fdff49, 0x03258556, 0x00807739, 0x0290a951, 0x003cba66}}}, + {X: Field{[10]uint32{0x01bda7a1, 0x03dca088, 0x03102e48, 0x00703640, 0x018745a9, 0x017919f8, 0x01348175, 0x018644b0, 0x003894f5, 0x00078c76}}, Y: Field{[10]uint32{0x00d610ce, 0x0232531f, 0x03aee504, 0x009d0480, 0x02477a7b, 0x03e0225b, 0x002c6d97, 0x03863cf0, 0x038835da, 0x0004773b}}}, + {X: Field{[10]uint32{0x02b7100e, 0x02c0c062, 0x0028c422, 0x01e946d4, 0x03311f68, 0x02f0ed25, 0x027a7ff2, 0x02f266fd, 0x0034795c, 0x00032e6b}}, Y: Field{[10]uint32{0x00d0db1d, 0x01120d8f, 0x0332074e, 0x03762913, 0x03e5ff32, 0x023704fd, 0x01e95e9a, 0x02cd7380, 0x0221c804, 0x001797c1}}}, + {X: Field{[10]uint32{0x00e11c1b, 0x01ce0d6d, 0x020ce56c, 0x0213c028, 0x0024dcb8, 0x02995b12, 0x02326fa1, 0x02b4e283, 0x02c4067d, 0x002bf0d2}}, Y: Field{[10]uint32{0x00bdcb96, 0x00204d8a, 0x01de1d75, 0x02baff1b, 0x0377a033, 0x000b0432, 0x02ef031a, 0x0191e8e0, 0x00043f6d, 0x00322c71}}}, + {X: Field{[10]uint32{0x0270aa81, 0x03e17ef8, 0x0273e603, 0x00d9e9e0, 0x023330f6, 0x02e85384, 0x01430bc0, 0x02ae8586, 0x0160ca85, 0x000e9bf0}}, Y: Field{[10]uint32{0x0222bc0a, 0x01d36e80, 0x001bb617, 0x03246709, 0x02cb72cf, 0x01c1ef0c, 0x01a7a483, 0x02ce4251, 0x037286db, 0x0016528a}}}, + {X: Field{[10]uint32{0x033ce7d4, 0x00658050, 0x02e4346b, 0x02a38fab, 0x01bdc1e4, 0x03c637af, 0x024f56ea, 0x0270e8fd, 0x0295657c, 0x002a103d}}, Y: Field{[10]uint32{0x02126fbc, 0x007d27fa, 0x0269d7a4, 0x0091c9cc, 0x031a77b8, 0x030004c6, 0x01eae96b, 0x038b7d18, 0x02c0ca41, 0x0022a29e}}}, + {X: Field{[10]uint32{0x000a39d6, 0x027602ba, 0x033e55f6, 0x018b5b83, 0x0065cd77, 0x028a4c9a, 0x01d08c34, 0x01a4530e, 0x020170ec, 0x00030113}}, Y: Field{[10]uint32{0x020b4657, 0x02fe488e, 0x0052a92d, 0x01ee4816, 0x036dd5fd, 0x00be5ecd, 0x02e0b5ec, 0x00545897, 0x00827ae5, 0x001ef58c}}}, + {X: Field{[10]uint32{0x02a00b3a, 0x0377a53a, 0x00b2aa89, 0x00690769, 0x002bf927, 0x033f74a2, 0x01eb5c67, 0x025a6c11, 0x035b352b, 0x0032e404}}, Y: Field{[10]uint32{0x0179be93, 0x012d858b, 0x00b492a8, 0x00b1498d, 0x03b4dac8, 0x009dea3d, 0x00b6d267, 0x026c47f9, 0x00a0762d, 0x000532fb}}}, + {X: Field{[10]uint32{0x03182a0e, 0x03213402, 0x02963c58, 0x01d9d7a9, 0x03c82166, 0x02a92a3f, 0x007c0633, 0x02ac3c87, 0x0037a24d, 0x003e9ef1}}, Y: Field{[10]uint32{0x01a5aa35, 0x03bb9534, 0x0244b383, 0x0051007c, 0x00fdf721, 0x0124d678, 0x0109326c, 0x0031adb7, 0x03c6d730, 0x00389099}}}, + {X: Field{[10]uint32{0x03b3299a, 0x00701795, 0x02fcdd0c, 0x015cef22, 0x0035e956, 0x0054ceb6, 0x032bef99, 0x00f494de, 0x00dd3f50, 0x00398d53}}, Y: Field{[10]uint32{0x019ead7f, 0x0342e1a1, 0x01a0a3c4, 0x03cfd72b, 0x03cdc2b6, 0x03a7be71, 0x01955b9a, 0x03228662, 0x03706291, 0x0035b05e}}}, + {X: Field{[10]uint32{0x0345cce8, 0x00ebc7ee, 0x0053b048, 0x00f4afc1, 0x02132ec2, 0x0035f604, 0x00dce9d5, 0x00578f7c, 0x013007e8, 0x002768d9}}, Y: Field{[10]uint32{0x0067a8dc, 0x02639474, 0x0109ebd2, 0x008c8bd3, 0x013bbc4b, 0x02426ba4, 0x02a1b102, 0x022b3aa1, 0x016698a2, 0x002ecdd1}}}, + {X: Field{[10]uint32{0x00c9d4db, 0x0066e28e, 0x011ba763, 0x02208b5a, 0x0213b257, 0x0105aa21, 0x02d1c3ba, 0x03371c1b, 0x021e1a19, 0x0037115e}}, Y: Field{[10]uint32{0x03dc3b58, 0x03a04fee, 0x01776dfc, 0x0363e0a1, 0x0385e25b, 0x02518e29, 0x01919fa2, 0x01943752, 0x0366de5a, 0x000e7e4f}}}, + {X: Field{[10]uint32{0x00f0374d, 0x02760ab3, 0x009a962b, 0x01badece, 0x03ec216c, 0x0132915b, 0x0357bc66, 0x003a617f, 0x031f1b1a, 0x002c8dde}}, Y: Field{[10]uint32{0x03578c1a, 0x00666b1d, 0x02db5dac, 0x030188ca, 0x027a040f, 0x00fae5d1, 0x0114e74b, 0x014272fc, 0x0180d723, 0x000e0e95}}}, + {X: Field{[10]uint32{0x00fc7e50, 0x0144492b, 0x01f65780, 0x03381797, 0x002a5a86, 0x02570936, 0x011fabeb, 0x00ea14e1, 0x0046755d, 0x0022c699}}, Y: Field{[10]uint32{0x0255cf75, 0x03ccd1a5, 0x036231ca, 0x01850e32, 0x01ed1cd4, 0x024a96ff, 0x0288aef1, 0x00a99d46, 0x01d4cb63, 0x0010ae21}}}, + {X: Field{[10]uint32{0x0103f5b1, 0x029bfc94, 0x01b3e7d5, 0x0288c285, 0x03c3a7ef, 0x00ea41e9, 0x01f14162, 0x00683279, 0x019cbacf, 0x00250220}}, Y: Field{[10]uint32{0x00506f98, 0x031a32c3, 0x0056b0d6, 0x00c32ec9, 0x021df08c, 0x002ade68, 0x0107451f, 0x013dcff4, 0x02c9d6f8, 0x002a5d63}}}, + {X: Field{[10]uint32{0x006ce25c, 0x00661c2c, 0x013ee9c3, 0x01cf090f, 0x029ce6d4, 0x02213693, 0x017c933a, 0x03e32e67, 0x004707b3, 0x0022ffbc}}, Y: Field{[10]uint32{0x03e5c498, 0x00f04b3d, 0x03e37ca7, 0x0213a281, 0x00627f1d, 0x00c05f16, 0x00d17ee8, 0x02bc5d54, 0x01870d06, 0x0022ef2f}}}, + {X: Field{[10]uint32{0x014bdb61, 0x034a52d0, 0x03cc0dc1, 0x01ff0e00, 0x018eff64, 0x037d60be, 0x00b84b8a, 0x000b8477, 0x03f0c122, 0x0000aa15}}, Y: Field{[10]uint32{0x02db6548, 0x003bfb11, 0x029afe43, 0x0076bdfe, 0x0262c8ae, 0x023a88ea, 0x00af8c64, 0x024c6091, 0x016da7fd, 0x0026eb11}}}, + {X: Field{[10]uint32{0x015cb5ec, 0x00eb2d97, 0x0083525e, 0x039a924f, 0x03b94b1e, 0x03fd4f9a, 0x006b2242, 0x017b4c34, 0x005a9048, 0x0024dee3}}, Y: Field{[10]uint32{0x03ccd808, 0x02c9d9a9, 0x02788da3, 0x019fa6df, 0x02c9c3d8, 0x038d9b29, 0x035a311a, 0x00dd2943, 0x036ff9fb, 0x0034dec4}}}, + {X: Field{[10]uint32{0x0243c77a, 0x0038280e, 0x001a065a, 0x00cd2248, 0x0122b249, 0x01a87971, 0x0150ff30, 0x035afb64, 0x0153e2bf, 0x0017d513}}, Y: Field{[10]uint32{0x02990f51, 0x00df82c4, 0x01562c31, 0x01f88059, 0x028f4c84, 0x01c33b4c, 0x012c4130, 0x0336605d, 0x00e28c47, 0x002ea708}}}, + {X: Field{[10]uint32{0x03c807b9, 0x025f9ea9, 0x01cbd9c2, 0x03ea0695, 0x01e3249c, 0x02e7e932, 0x0364fa7e, 0x022ebe96, 0x038890bf, 0x0019ed8c}}, Y: Field{[10]uint32{0x027625e6, 0x01876fab, 0x02567620, 0x0305b22e, 0x010d871e, 0x037e0229, 0x0354577e, 0x02e0450a, 0x02752d94, 0x00370615}}}, + {X: Field{[10]uint32{0x00439442, 0x00918a26, 0x02e2fbd3, 0x0360e1a8, 0x02b76604, 0x018ca00c, 0x012ffa3d, 0x01123e7e, 0x01d599cb, 0x00161ea7}}, Y: Field{[10]uint32{0x03ae9870, 0x035b7376, 0x03dee6b6, 0x021d47fe, 0x03488aa6, 0x036efd4c, 0x01e73ca2, 0x03ea9e92, 0x00e9a893, 0x00125a66}}}, + {X: Field{[10]uint32{0x03c29b38, 0x000a5298, 0x02a568f8, 0x00696190, 0x0218dfe5, 0x01746184, 0x00773123, 0x03fe7e04, 0x031ec576, 0x000dbede}}, Y: Field{[10]uint32{0x0166c4aa, 0x00055c85, 0x038e8a2f, 0x022586eb, 0x035c1a15, 0x01f7a298, 0x016fc1a6, 0x02c6fcb2, 0x02c9b82c, 0x000d2916}}}, + {X: Field{[10]uint32{0x01f4ba95, 0x0158931c, 0x03caef77, 0x00f5393b, 0x00ab8a27, 0x0027fd0d, 0x00f49c51, 0x03b34b76, 0x008ca0af, 0x0021edc7}}, Y: Field{[10]uint32{0x025676f9, 0x00e0b314, 0x010b81bc, 0x0286f5ab, 0x005b3626, 0x0079b672, 0x0127c56e, 0x009621d9, 0x011f5112, 0x00214645}}}, + {X: Field{[10]uint32{0x0063e040, 0x00e839e9, 0x0296cf43, 0x0262e069, 0x0000056c, 0x00ee8ec3, 0x03ed962c, 0x00dc2e8e, 0x00f2805c, 0x002b3d97}}, Y: Field{[10]uint32{0x01692d5b, 0x00ed0085, 0x023d663b, 0x008f35a3, 0x02dc7b0e, 0x00bd5fbc, 0x022762b5, 0x0385abe5, 0x029bf45b, 0x003c24e4}}}, + {X: Field{[10]uint32{0x0147acf1, 0x0011d7c8, 0x03f44899, 0x02ea04a5, 0x01e3e045, 0x00737ec7, 0x01f16740, 0x003216e4, 0x03ed8b01, 0x003824af}}, Y: Field{[10]uint32{0x03902c37, 0x01c2a61d, 0x0291b657, 0x02be2f76, 0x018c4d18, 0x0181c36a, 0x00160728, 0x01a0f790, 0x0042ecc8, 0x00382ee6}}}, + {X: Field{[10]uint32{0x010a52ae, 0x021c7298, 0x0269197c, 0x01fca3b3, 0x03ba386b, 0x01c14076, 0x0012735c, 0x02f2fc5e, 0x03b98260, 0x0026f7f5}}, Y: Field{[10]uint32{0x02371eeb, 0x033f7ad7, 0x00d9affb, 0x01e10188, 0x00887d9a, 0x017d427d, 0x01e01baa, 0x013339cc, 0x03983f8c, 0x0026f194}}}, + {X: Field{[10]uint32{0x0243545f, 0x028be0a1, 0x0240e9a4, 0x00361a90, 0x00afc8a8, 0x00255087, 0x005587a9, 0x00562572, 0x0321d931, 0x000f6c88}}, Y: Field{[10]uint32{0x03b78eae, 0x03dcd263, 0x028bfddb, 0x01153bf1, 0x02fdd6bb, 0x02c6651f, 0x0323c9af, 0x021a3783, 0x00b82c57, 0x0010abcc}}}, + {X: Field{[10]uint32{0x022b3e5f, 0x009e5858, 0x03da6256, 0x01908b4d, 0x03c3757a, 0x01790fe8, 0x02decbdc, 0x01fff3e1, 0x0314a6a7, 0x0003a74f}}, Y: Field{[10]uint32{0x00e67de7, 0x003e060c, 0x027f02f9, 0x0210db59, 0x03fd18ee, 0x02a4b305, 0x02d0764d, 0x01c5331b, 0x03ed1e2a, 0x0020eb02}}}, + {X: Field{[10]uint32{0x0042f2a4, 0x007547a6, 0x0180f089, 0x02161a09, 0x01b31b90, 0x02b56566, 0x01448af0, 0x01221c38, 0x02e4f29b, 0x00104921}}, Y: Field{[10]uint32{0x01e7ee3d, 0x034e5fc3, 0x01a8f080, 0x01ed4c58, 0x000bc557, 0x030b9d87, 0x03bbb039, 0x019e430b, 0x01318c0d, 0x0030c716}}}, + {X: Field{[10]uint32{0x02b4ddaa, 0x00a7648d, 0x01a267c5, 0x008a92cb, 0x01609f84, 0x026add7e, 0x01afbe0c, 0x0141bf8b, 0x007141ed, 0x003a77bb}}, Y: Field{[10]uint32{0x0194a21d, 0x0251e3db, 0x039eb220, 0x01fe6b6d, 0x008dfb76, 0x034a8290, 0x006029e5, 0x00ef0b61, 0x0144d846, 0x00021ca1}}}, + {X: Field{[10]uint32{0x0264218a, 0x03f5bfec, 0x031735f0, 0x00b16f2d, 0x01bbf01c, 0x02e24978, 0x03a17612, 0x011a8208, 0x0292553c, 0x00168288}}, Y: Field{[10]uint32{0x015dbae2, 0x03455d79, 0x0009ce90, 0x025a3c14, 0x00012de6, 0x0111ffe7, 0x021f8976, 0x003c4289, 0x01f0adda, 0x000c25f3}}}, + {X: Field{[10]uint32{0x00928d1f, 0x03784681, 0x03d005ba, 0x03e7383f, 0x02563a40, 0x0344bc61, 0x01dc23d8, 0x006b46e8, 0x02378b68, 0x001272ca}}, Y: Field{[10]uint32{0x016732d6, 0x001a564f, 0x03bd632a, 0x02db89da, 0x00fbecc5, 0x0360128f, 0x015a938a, 0x017e83fc, 0x02afc0f6, 0x003c8d78}}}, + {X: Field{[10]uint32{0x0215feb3, 0x02af6e45, 0x037ccf99, 0x03521345, 0x003dd1af, 0x01887351, 0x01ad510a, 0x0045dec1, 0x00b63688, 0x003535c7}}, Y: Field{[10]uint32{0x0162645b, 0x03c4bc1d, 0x02c02ac7, 0x018fec1d, 0x035316c3, 0x0254354c, 0x02f385fa, 0x02e6c581, 0x0378de3e, 0x000eb594}}}, + {X: Field{[10]uint32{0x01bfab2f, 0x00f9908d, 0x01148b7e, 0x02e0fd1f, 0x01529c99, 0x013a1b31, 0x03798c31, 0x01b80193, 0x02e14bdd, 0x0001646c}}, Y: Field{[10]uint32{0x00fa59b0, 0x01a95a2a, 0x03aeca98, 0x022575e0, 0x0112a517, 0x028da356, 0x02bbaf12, 0x01319935, 0x0266fd2a, 0x0013da18}}}, + {X: Field{[10]uint32{0x03356876, 0x02f88d91, 0x00086970, 0x0003d262, 0x02be2534, 0x00bab277, 0x03b63c29, 0x02f124f5, 0x0085c984, 0x003b940f}}, Y: Field{[10]uint32{0x03daa47e, 0x0315cf12, 0x01ccb976, 0x02ce9faf, 0x0139449b, 0x005359c4, 0x01704e96, 0x022731d0, 0x02bb6f9e, 0x002f60a2}}}, + {X: Field{[10]uint32{0x00b3f89e, 0x03256cc5, 0x01697758, 0x0325dff5, 0x03756e78, 0x0261f0eb, 0x036a3f98, 0x0287f328, 0x03a702e5, 0x000be6d3}}, Y: Field{[10]uint32{0x00a4a15d, 0x03a85407, 0x03cf33f0, 0x03c86997, 0x03956657, 0x02427670, 0x022e1cee, 0x00f1d13a, 0x015b3d5b, 0x00259a18}}}, + {X: Field{[10]uint32{0x02fd46c3, 0x02c7249e, 0x03a6234e, 0x02f01b84, 0x02a1f4ae, 0x00a8042a, 0x012b204e, 0x0093e17e, 0x006aa341, 0x00062db4}}, Y: Field{[10]uint32{0x034bef4e, 0x00120747, 0x0264fb46, 0x029550dc, 0x03258b0b, 0x00f81e7c, 0x02624bfa, 0x0002c01f, 0x01b9bdf6, 0x0019b30c}}}, + {X: Field{[10]uint32{0x01b44ba0, 0x00c0d037, 0x016881cc, 0x013594e5, 0x0367662a, 0x00c36dba, 0x0337d0f0, 0x023763ff, 0x0163bf75, 0x000ef01e}}, Y: Field{[10]uint32{0x01057e5d, 0x01dc306b, 0x008a357d, 0x03b2dd15, 0x008e6dc1, 0x01db6dbe, 0x039a3c22, 0x026870b7, 0x02f26820, 0x00183847}}}, + {X: Field{[10]uint32{0x013a46a8, 0x026ca201, 0x01e3dd08, 0x016bc3ba, 0x0291498b, 0x0327e9a2, 0x0149af30, 0x01508ebf, 0x01d65b32, 0x0002fd61}}, Y: Field{[10]uint32{0x038e66a6, 0x033dab78, 0x00c0594b, 0x0304d147, 0x0204c000, 0x02a794e5, 0x0256e2cf, 0x012e6944, 0x00e9ea48, 0x000be251}}}, + {X: Field{[10]uint32{0x03b69294, 0x02704cf3, 0x01a7f64e, 0x00e35fc1, 0x00f0cf14, 0x007d03be, 0x01b59a91, 0x00095d75, 0x022ebe7a, 0x00221f02}}, Y: Field{[10]uint32{0x00aec5c9, 0x01c79c58, 0x02a58402, 0x0037483d, 0x019c37c3, 0x0105d524, 0x03de5949, 0x0319bd43, 0x00c84f9b, 0x00117ccd}}}, + {X: Field{[10]uint32{0x022f7d4f, 0x03e68d98, 0x0211601b, 0x027e0128, 0x003718e7, 0x030f71af, 0x0217700f, 0x00c97166, 0x02f90a73, 0x00276b5e}}, Y: Field{[10]uint32{0x02159525, 0x00a616b9, 0x03136644, 0x02b40624, 0x0140644b, 0x0227ae37, 0x02326ecb, 0x01aa531f, 0x025e099c, 0x000adf08}}}, + {X: Field{[10]uint32{0x03dd551b, 0x02116529, 0x006947cb, 0x007272be, 0x0363bcb6, 0x01cf37f3, 0x03e9a2ed, 0x00a7dd3c, 0x039572bd, 0x00211f93}}, Y: Field{[10]uint32{0x0393ee16, 0x0226856c, 0x004b81ea, 0x020a8407, 0x000f6f11, 0x01c32cd1, 0x006286d3, 0x00b18bea, 0x0282e0a9, 0x002e9bb4}}}, + {X: Field{[10]uint32{0x0047a593, 0x012bd1fc, 0x01580268, 0x00b3374f, 0x00b5d8c6, 0x02495b1c, 0x033c4b44, 0x00d80119, 0x0205df1c, 0x0009484c}}, Y: Field{[10]uint32{0x03096837, 0x018f59fb, 0x01f3c547, 0x03b10a9e, 0x0395aabf, 0x02881591, 0x022a47a8, 0x011c27eb, 0x01de05af, 0x000db720}}}, + {X: Field{[10]uint32{0x0058e87a, 0x0032f384, 0x0229ab17, 0x01c175cc, 0x0095ebfd, 0x00beca7f, 0x013a25ef, 0x037de91c, 0x00d84866, 0x001d48a3}}, Y: Field{[10]uint32{0x0012fe6d, 0x02ecc2f0, 0x03812a7d, 0x01564a6e, 0x0168a473, 0x00215105, 0x025f056c, 0x034fd3f4, 0x039bcc02, 0x003ee921}}}, + {X: Field{[10]uint32{0x01b68568, 0x036b6ed6, 0x03fe4b6a, 0x00dd0b18, 0x00981a13, 0x00109224, 0x002fb07c, 0x01f021b4, 0x01392286, 0x001d2515}}, Y: Field{[10]uint32{0x011af3e2, 0x03aed507, 0x01180341, 0x00111919, 0x013e3b8d, 0x0091f9d4, 0x030bf0b5, 0x02c6722b, 0x01178df8, 0x001f5dd2}}}, + {X: Field{[10]uint32{0x03c9b04f, 0x0383f2ff, 0x03f7a609, 0x038d5fd1, 0x0271d28c, 0x00a651bc, 0x00cbadfc, 0x038e73e8, 0x03532899, 0x001a76df}}, Y: Field{[10]uint32{0x019feabc, 0x0252d8c6, 0x011f0a66, 0x0375d928, 0x0326da7c, 0x007543e7, 0x0023ffee, 0x01576ab5, 0x03bb1032, 0x0032c090}}}, + {X: Field{[10]uint32{0x0129f8c7, 0x01cf0a4a, 0x022251d1, 0x03d54f6b, 0x02ec4aed, 0x0240be48, 0x012fc378, 0x0036f83f, 0x01c1fb4a, 0x001c9fb3}}, Y: Field{[10]uint32{0x011f453b, 0x03525799, 0x0035c224, 0x030592f0, 0x02bfc4f7, 0x015d536c, 0x0046ee5e, 0x02358199, 0x02ed1377, 0x002b96ec}}}, + {X: Field{[10]uint32{0x02f25b72, 0x0278cd1f, 0x00382b12, 0x01cd7baf, 0x01912138, 0x00b1fcaf, 0x007f5c9e, 0x01512f88, 0x018f0ec2, 0x00240f3b}}, Y: Field{[10]uint32{0x003190a6, 0x01073565, 0x00c8bb2e, 0x0255af90, 0x03ff75c7, 0x03ea2df6, 0x009bf33a, 0x00f4c57a, 0x02290ee1, 0x000845f2}}}, + {X: Field{[10]uint32{0x0203f33b, 0x02eee646, 0x02ca33a6, 0x03c200cd, 0x031c8906, 0x03f4d8dc, 0x038a5ad6, 0x03845cd8, 0x03ef5149, 0x00313519}}, Y: Field{[10]uint32{0x0229b5c7, 0x026058c1, 0x01b63bf3, 0x0033fe5d, 0x00431ad8, 0x02fcbf3b, 0x03d437ea, 0x01af3f38, 0x03244c53, 0x003a96d6}}}, + {X: Field{[10]uint32{0x0237326f, 0x0178df3a, 0x03cf9d32, 0x029b0daf, 0x01cff7a8, 0x036028bc, 0x03b2b7ad, 0x0027dec8, 0x03a65f6d, 0x0005ad5d}}, Y: Field{[10]uint32{0x009f15c1, 0x01ce4d34, 0x02dcbe90, 0x03876c68, 0x0184d98b, 0x0294a9e4, 0x00a65760, 0x0139788a, 0x00e21467, 0x00019aea}}}, + {X: Field{[10]uint32{0x0363412f, 0x0214c766, 0x01f5a676, 0x036f4afc, 0x0367fcee, 0x02f5f77d, 0x02453846, 0x02b7f387, 0x02f2e480, 0x002b52f2}}, Y: Field{[10]uint32{0x01e741ac, 0x0068e03a, 0x03f4a0a6, 0x02dd59cd, 0x00c4c891, 0x0097b9cb, 0x031b3a45, 0x003d6446, 0x03604781, 0x00147e80}}}, + {X: Field{[10]uint32{0x033b571a, 0x01ccd8b0, 0x01dd587d, 0x037b767a, 0x0151ca65, 0x006f2ce6, 0x012d776d, 0x039e1d29, 0x033852d2, 0x002c927a}}, Y: Field{[10]uint32{0x03a66258, 0x000c8c94, 0x031d9b11, 0x001a9e70, 0x0062dd77, 0x005dc25b, 0x03cd84eb, 0x03b3a020, 0x002414e4, 0x000f8982}}}, + {X: Field{[10]uint32{0x01e14a65, 0x0347b12f, 0x029dbccf, 0x0181f8ef, 0x0374dd05, 0x0274b14e, 0x0310d3a5, 0x0006ba04, 0x02c7696a, 0x0018d064}}, Y: Field{[10]uint32{0x03b0e00f, 0x03948895, 0x0154adcb, 0x03912e4a, 0x004fd4cc, 0x031e1ec6, 0x02dcd709, 0x0381df61, 0x0050e366, 0x001156d2}}}, + {X: Field{[10]uint32{0x022f5099, 0x02577312, 0x02ce6fd2, 0x03b7eec6, 0x02acc3c5, 0x0052c662, 0x02159ccc, 0x00fe0127, 0x03f50d43, 0x003fefb2}}, Y: Field{[10]uint32{0x000be3c0, 0x00779491, 0x0285caaa, 0x01a22921, 0x03dd68d3, 0x0300ee8c, 0x0089acf9, 0x01b3d0d9, 0x02ba1ec6, 0x00108b9e}}}, + {X: Field{[10]uint32{0x001868af, 0x00cf7457, 0x035ad8c1, 0x00ed4269, 0x02b6a8c8, 0x03418cb6, 0x034f1a90, 0x03a08e73, 0x00dc1067, 0x00196d31}}, Y: Field{[10]uint32{0x014d260e, 0x02b0797e, 0x026d840d, 0x005e7548, 0x0320c678, 0x01fd0a80, 0x003f8ae0, 0x01186146, 0x019dd765, 0x003df3d7}}}, + {X: Field{[10]uint32{0x03f9c67e, 0x00695826, 0x0355924c, 0x02ecd756, 0x008de48d, 0x0016e343, 0x018dbed4, 0x00d40b54, 0x00ce9d60, 0x0034e03b}}, Y: Field{[10]uint32{0x0364c128, 0x00d7e3f6, 0x013ae50c, 0x0136a02c, 0x038b241b, 0x01971827, 0x030ac152, 0x02ac427a, 0x0080fd18, 0x0006ba11}}}, + {X: Field{[10]uint32{0x0244511c, 0x0213fd33, 0x002df634, 0x03dc6741, 0x003fce43, 0x01774694, 0x00a1d961, 0x006efb5e, 0x0128b5ce, 0x0005c627}}, Y: Field{[10]uint32{0x0382350d, 0x01a91ce9, 0x03bb5759, 0x026236cb, 0x0185c532, 0x029584a2, 0x021b948b, 0x00f8e504, 0x00f47c7b, 0x003ef28a}}}, + {X: Field{[10]uint32{0x00c2e84d, 0x0160e0a0, 0x01ee73f5, 0x0393ebf3, 0x010be685, 0x02496fcf, 0x01ae4e61, 0x02c1f6a1, 0x02c2e2a8, 0x003ef8cc}}, Y: Field{[10]uint32{0x024e29ca, 0x0295e5fa, 0x00eb30e1, 0x0381ad65, 0x02b11c43, 0x026d0b2f, 0x038c6d77, 0x01f6838f, 0x03425e18, 0x002aa45c}}}, + {X: Field{[10]uint32{0x00bc834f, 0x01e58ee8, 0x0321002d, 0x03d736ab, 0x012100d1, 0x00ba7348, 0x00bd5182, 0x01c97e2d, 0x02878b5e, 0x0022e7a2}}, Y: Field{[10]uint32{0x003ed659, 0x01de8233, 0x00563bed, 0x0371154b, 0x02b2e873, 0x002d95c0, 0x031d6ad8, 0x015af57f, 0x031cc28f, 0x000cc7ec}}}, + {X: Field{[10]uint32{0x01e111ca, 0x003323a3, 0x02a3bd73, 0x022ad9a2, 0x0234e1a6, 0x032986b0, 0x02798ace, 0x02f2b45e, 0x0011a3c0, 0x0025fa49}}, Y: Field{[10]uint32{0x0147f48f, 0x0312fc5a, 0x007eb7cd, 0x01d82ebf, 0x01047949, 0x00f08690, 0x035fb759, 0x01785cb9, 0x00a4bac1, 0x002c3c5c}}}, + {X: Field{[10]uint32{0x0044eea8, 0x008ec974, 0x016919cd, 0x007f5354, 0x0349aa3c, 0x0309e55d, 0x00c76f82, 0x00f1bb32, 0x001333a1, 0x00080d62}}, Y: Field{[10]uint32{0x000c7f29, 0x00f2245e, 0x025c0ee7, 0x03c41366, 0x00259fc4, 0x037c3cd1, 0x022f9517, 0x02bc2bb3, 0x02a48c86, 0x001202be}}}, + {X: Field{[10]uint32{0x027dbcff, 0x016fade9, 0x00343a66, 0x03988adf, 0x02617579, 0x02126fbf, 0x01551039, 0x01d02a40, 0x00cb1575, 0x0032a87b}}, Y: Field{[10]uint32{0x00e0a20b, 0x0354b829, 0x02577e0b, 0x004e707a, 0x011aee51, 0x02fc10b6, 0x03d34511, 0x01cbfedb, 0x03f9f1c9, 0x002a9a56}}}, + {X: Field{[10]uint32{0x02620719, 0x028eb6f0, 0x02bbd138, 0x0279ba3c, 0x03f33104, 0x03f5ae20, 0x02a212a7, 0x01ea3bf6, 0x03a2036f, 0x00239f0a}}, Y: Field{[10]uint32{0x02ec105c, 0x01863e0b, 0x02d0220a, 0x00c47fb3, 0x00d9b6e0, 0x01de7e30, 0x006c4e2e, 0x03ecfd61, 0x002f1434, 0x002f40dc}}}, + {X: Field{[10]uint32{0x02ace975, 0x018df1ee, 0x033b24dd, 0x0046393a, 0x0388fbad, 0x00301de0, 0x03ebf094, 0x001307f3, 0x00336dcd, 0x00381f70}}, Y: Field{[10]uint32{0x032a2c2c, 0x01985aac, 0x0019510d, 0x01a14011, 0x02ef6f92, 0x02f54c55, 0x02ccf311, 0x03b2c1d8, 0x00a00e5e, 0x002c4ef4}}}, + {X: Field{[10]uint32{0x038ce0cb, 0x03e8b7ee, 0x0307297a, 0x0247470c, 0x0095aba7, 0x036c2ca3, 0x018a9044, 0x02bc0427, 0x00252679, 0x001981b2}}, Y: Field{[10]uint32{0x00e1d3cc, 0x01f2b202, 0x02054647, 0x015cdae8, 0x0310fe6c, 0x011e1a3e, 0x010de777, 0x01e64d5c, 0x019ca980, 0x001d4179}}}, + {X: Field{[10]uint32{0x01e6f061, 0x02e64d47, 0x020b522a, 0x00d4ae67, 0x022b31f9, 0x0037976b, 0x005450fb, 0x0089b02d, 0x00dcec48, 0x0027efd3}}, Y: Field{[10]uint32{0x02f850dd, 0x03e98047, 0x02c91a7d, 0x0119c0d3, 0x00e9c5b6, 0x00d8adf7, 0x020d58a2, 0x0083a182, 0x00a23da0, 0x003cb934}}}, + {X: Field{[10]uint32{0x006916bc, 0x03d8618a, 0x01b1b976, 0x019fa003, 0x00b7cc81, 0x025df4cb, 0x00b0403e, 0x03ff0a62, 0x02975195, 0x000381b5}}, Y: Field{[10]uint32{0x030bb8bb, 0x011302f0, 0x01c83632, 0x02ec3069, 0x02068302, 0x012400fa, 0x0380e04a, 0x034885eb, 0x030a27d3, 0x0020054d}}}, + {X: Field{[10]uint32{0x0293a6e2, 0x028fc2a4, 0x01a6bcf4, 0x01dfa5e1, 0x03ff7925, 0x01b85b35, 0x0112fd4e, 0x00aab194, 0x03ab021d, 0x002b7359}}, Y: Field{[10]uint32{0x03fd7fb8, 0x02970ad5, 0x0293d0fa, 0x03526d6f, 0x018e4f40, 0x01730eeb, 0x0058608f, 0x00aaa814, 0x02202906, 0x001949ed}}}, + {X: Field{[10]uint32{0x01f2bd38, 0x02fde8b8, 0x00e133e0, 0x005da244, 0x035a4473, 0x025a026c, 0x007e963d, 0x01932c46, 0x01eab43a, 0x0007641a}}, Y: Field{[10]uint32{0x01e29108, 0x037cc6a4, 0x033bbf15, 0x023e93b0, 0x00fc78c2, 0x03bd5057, 0x012f9a68, 0x023fa52b, 0x02de854b, 0x002ac0f7}}}, + {X: Field{[10]uint32{0x0220a768, 0x008b99c2, 0x0140e3a4, 0x03dca8e0, 0x03603206, 0x033a0fd2, 0x00168ae8, 0x0224bc52, 0x0376b8ec, 0x003c7dad}}, Y: Field{[10]uint32{0x01bff25a, 0x02ff2cae, 0x0345d14a, 0x01f60a9f, 0x01e7136a, 0x02ec9736, 0x019b11a7, 0x0368845f, 0x00363413, 0x00224ae8}}}, + {X: Field{[10]uint32{0x02fab379, 0x007177c7, 0x03fb0040, 0x008d0ce9, 0x03c21d1c, 0x0228b70e, 0x03a8d1bf, 0x03d3343c, 0x014ace79, 0x002a213e}}, Y: Field{[10]uint32{0x02a05c96, 0x00c3e037, 0x03082dd6, 0x03e97434, 0x03c611af, 0x03c0f77d, 0x0282fbee, 0x009233b0, 0x016c6e45, 0x0017d4cd}}}, + {X: Field{[10]uint32{0x021da9ff, 0x0203c439, 0x02fe981a, 0x0020d7a7, 0x031fb2be, 0x02d2353d, 0x00165640, 0x02200384, 0x0030197a, 0x002c6621}}, Y: Field{[10]uint32{0x01d849b9, 0x01a36393, 0x00bdf44a, 0x01057b1c, 0x000e515a, 0x01b85068, 0x027ace58, 0x004b496f, 0x024dea7d, 0x003571e1}}}, + {X: Field{[10]uint32{0x0127fedb, 0x0110d383, 0x02d4d109, 0x02ba50bd, 0x0246985a, 0x02db24ea, 0x01c1db82, 0x016e12f5, 0x02a7529d, 0x00056dce}}, Y: Field{[10]uint32{0x02721f89, 0x036af23b, 0x02262075, 0x037bcbf2, 0x00632ac6, 0x00728f50, 0x0011259b, 0x0344f108, 0x02a2bc8a, 0x000a5f8c}}}, + {X: Field{[10]uint32{0x0197d40f, 0x01de0b1f, 0x00f3f57f, 0x01e85b34, 0x038e35cc, 0x005b948f, 0x01926301, 0x007ec596, 0x02e0443c, 0x000ce69d}}, Y: Field{[10]uint32{0x01fe9659, 0x02f5dcf3, 0x02a229e5, 0x01af104e, 0x03914f0f, 0x00ed4b9b, 0x02756201, 0x01e130cf, 0x012efecd, 0x00226419}}}, + {X: Field{[10]uint32{0x027adfef, 0x02d460ed, 0x0251bf64, 0x038613d3, 0x03b1c535, 0x02c24112, 0x018312e9, 0x0376ae51, 0x00fffb80, 0x002fbc9b}}, Y: Field{[10]uint32{0x0137490b, 0x02f79167, 0x03bb5ba1, 0x03c859d6, 0x012c6943, 0x016cc43d, 0x0320518c, 0x01aa0d63, 0x029aef07, 0x000e0624}}}, + {X: Field{[10]uint32{0x00b2427e, 0x036490c2, 0x01894c71, 0x02188c49, 0x003dd40d, 0x013e46c2, 0x00dae108, 0x0309cd3d, 0x00818daf, 0x0033715b}}, Y: Field{[10]uint32{0x03503cca, 0x0041fc07, 0x02c71f07, 0x00d4fd61, 0x01b43769, 0x0155e7e4, 0x01425694, 0x00a2d511, 0x009de9c8, 0x0003d2cc}}}, + {X: Field{[10]uint32{0x0175bc6d, 0x0148039f, 0x01911cd6, 0x0298a9dd, 0x03a09312, 0x0258717e, 0x01be80a1, 0x0211e7b2, 0x0281b1f3, 0x000f77bf}}, Y: Field{[10]uint32{0x02df055d, 0x0160d615, 0x015d3a1e, 0x01442a7a, 0x027c7e2d, 0x02a001f4, 0x03fae4eb, 0x02d1e53b, 0x02dd1eb9, 0x001d760f}}}, + {X: Field{[10]uint32{0x00576826, 0x00e41044, 0x0399e763, 0x03498eab, 0x02a18879, 0x02484b3c, 0x02bae125, 0x00b2f130, 0x03769903, 0x00369f19}}, Y: Field{[10]uint32{0x00553f08, 0x02ba7cce, 0x031d0c07, 0x00f0fc72, 0x024314cc, 0x03a01a63, 0x031f7799, 0x03116e61, 0x0188360a, 0x000b9e9b}}}, + {X: Field{[10]uint32{0x0280d927, 0x02aa446a, 0x003859df, 0x0312b870, 0x02b8aba4, 0x01fd1556, 0x00faa801, 0x00831623, 0x0035e0bc, 0x0009846d}}, Y: Field{[10]uint32{0x014508d4, 0x0032b4df, 0x01b417ce, 0x03490a79, 0x00e47549, 0x0014a7eb, 0x01ff8c1c, 0x03141119, 0x001ae51d, 0x003ad63e}}}, + {X: Field{[10]uint32{0x03962961, 0x03fb1ed9, 0x027bc3de, 0x0025a516, 0x020b8f4c, 0x001adc75, 0x015aa088, 0x01f12a9c, 0x014836f0, 0x002c3ef9}}, Y: Field{[10]uint32{0x03e5abe0, 0x020694e0, 0x010de2a8, 0x02c117b9, 0x021c1749, 0x0378c328, 0x018668fe, 0x01d13431, 0x022466e7, 0x00331828}}}, + {X: Field{[10]uint32{0x01020581, 0x02ed27b2, 0x01a9eb50, 0x03ad7b7b, 0x0277d371, 0x01180f21, 0x00b7688b, 0x03b9d7eb, 0x036fdc51, 0x000680cc}}, Y: Field{[10]uint32{0x00daa7d7, 0x01c57926, 0x0218ce9f, 0x01166f9f, 0x03bd5071, 0x02b3f6f1, 0x0055fc36, 0x03b7e266, 0x030309c0, 0x000ff3c6}}}, + {X: Field{[10]uint32{0x00c159ed, 0x03b9cbde, 0x013c3810, 0x02492793, 0x020cf728, 0x00bda28d, 0x0049b20f, 0x024556aa, 0x0215c834, 0x001d8e84}}, Y: Field{[10]uint32{0x00482684, 0x03797996, 0x0390bd7d, 0x031a7ff4, 0x037b68d5, 0x007cbc89, 0x0395fbad, 0x0387b685, 0x021ccf30, 0x000de09a}}}, + {X: Field{[10]uint32{0x02da4edd, 0x00b09f72, 0x01eff63f, 0x03617e81, 0x00f7e664, 0x01bc0623, 0x020a586a, 0x00f8df73, 0x00c23018, 0x001ff1ed}}, Y: Field{[10]uint32{0x03ed6a8f, 0x0057244a, 0x03f50ac4, 0x03ebf915, 0x036338d2, 0x02af9ef3, 0x02493430, 0x02681bc1, 0x000e6ea8, 0x003f5e9e}}}, + {X: Field{[10]uint32{0x0065ddd8, 0x00984d77, 0x008d7747, 0x03f3c05b, 0x03dc543b, 0x01049623, 0x01eb7d70, 0x01bd5436, 0x03c9b068, 0x00088a01}}, Y: Field{[10]uint32{0x016cc2ab, 0x0255ec29, 0x0098b43d, 0x02d0c072, 0x029a34b2, 0x0064e4f6, 0x036d1553, 0x008bbf2c, 0x0102456c, 0x002e59c2}}}, + {X: Field{[10]uint32{0x005fda77, 0x00627c3f, 0x01603ed0, 0x01182aff, 0x02db6363, 0x028134f1, 0x0233f69c, 0x0341b9b2, 0x033698d8, 0x001e763a}}, Y: Field{[10]uint32{0x03d955f1, 0x009945c8, 0x02b28f13, 0x02789b5e, 0x02931fd4, 0x00676d48, 0x011d460e, 0x00d2a637, 0x03e11b02, 0x002fff25}}}, + {X: Field{[10]uint32{0x03add34b, 0x013449fa, 0x01dc5d46, 0x01aab223, 0x031f801a, 0x037b3db8, 0x02b77130, 0x0386db56, 0x02188e72, 0x00288d99}}, Y: Field{[10]uint32{0x03d60ed1, 0x00daaf9d, 0x03aebb17, 0x0321464f, 0x0070e99a, 0x00543fec, 0x034cd1cd, 0x00644c9d, 0x0236f3e7, 0x003bc8f6}}}, + {X: Field{[10]uint32{0x01dd9612, 0x03f06ed2, 0x013be480, 0x02cfe87c, 0x01b1fcbd, 0x00fe91a9, 0x023e8e74, 0x0205b644, 0x004ddde6, 0x002daeb4}}, Y: Field{[10]uint32{0x02a4e511, 0x02c0402d, 0x035467f1, 0x001f6566, 0x01850c65, 0x0116e02c, 0x00b7f346, 0x02c9ce9a, 0x0209a290, 0x001617eb}}}, + {X: Field{[10]uint32{0x00c3dfbd, 0x007874bd, 0x03aceb49, 0x0163cf5b, 0x0133fcbd, 0x02ed4063, 0x03113db8, 0x039c54a0, 0x00253353, 0x000afc87}}, Y: Field{[10]uint32{0x038d896e, 0x03113273, 0x033ef569, 0x03628356, 0x03b9fec4, 0x00e91ec1, 0x00491214, 0x01356f23, 0x03a74e8a, 0x0038e80c}}}, + {X: Field{[10]uint32{0x01842744, 0x03777497, 0x02dda358, 0x0099a817, 0x0041e9ad, 0x01c4247d, 0x03f3a90e, 0x038d7418, 0x0241e978, 0x0019309e}}, Y: Field{[10]uint32{0x01ae32d1, 0x0304ce4f, 0x03d27521, 0x0008ed49, 0x02bed768, 0x03f99f05, 0x00aac9ec, 0x029a5662, 0x025e08fd, 0x003f2ed8}}}, + {X: Field{[10]uint32{0x0081a58d, 0x010b4ad9, 0x03399b75, 0x02b680be, 0x00af62ac, 0x018f35f2, 0x00ef4350, 0x016d7a69, 0x02f6fdfe, 0x00188287}}, Y: Field{[10]uint32{0x01b8054f, 0x030c16b7, 0x01ae57be, 0x0317b209, 0x03a45fa7, 0x0151f880, 0x007f105c, 0x024e9be8, 0x023c5503, 0x002c2de7}}}, + {X: Field{[10]uint32{0x007b95cd, 0x01d19d4c, 0x038a1ecd, 0x014681af, 0x0215e712, 0x0093b831, 0x03ef68b4, 0x01c550d1, 0x01317cef, 0x000548fc}}, Y: Field{[10]uint32{0x00743b1d, 0x0145bffc, 0x02612bf5, 0x03154f70, 0x00a55806, 0x03c4796d, 0x01fe67a3, 0x03599370, 0x00cc1d8a, 0x0031c955}}}, + {X: Field{[10]uint32{0x02ea0cfd, 0x035ca513, 0x03700f66, 0x00f02dd4, 0x01b43f76, 0x0335cff3, 0x00d4d8c2, 0x021e5300, 0x003c0a9c, 0x0035d94c}}, Y: Field{[10]uint32{0x03bc267b, 0x0180f495, 0x02623781, 0x008ab806, 0x0035b4cd, 0x028c1937, 0x0217b73d, 0x035dea8e, 0x00a5204d, 0x002ebf2b}}}, + {X: Field{[10]uint32{0x00c468b6, 0x03c12b59, 0x01a8ea17, 0x01ed860e, 0x01ffbbf8, 0x00972f10, 0x0198759c, 0x03a59594, 0x021afafc, 0x0029d7ad}}, Y: Field{[10]uint32{0x01869873, 0x0125f659, 0x007b8041, 0x00859356, 0x03a8eba3, 0x029b5439, 0x0049b181, 0x0122a94f, 0x0093240f, 0x0026600a}}}, + {X: Field{[10]uint32{0x00e59f2a, 0x01381aef, 0x03cfa408, 0x01f6fac2, 0x01e7053f, 0x009079a4, 0x01813c71, 0x0246db09, 0x034cd0bb, 0x001fe906}}, Y: Field{[10]uint32{0x0184aec7, 0x020ec738, 0x0209f7e5, 0x00b0012a, 0x039431e2, 0x03da8b15, 0x017e7e20, 0x01a57e0c, 0x0379755a, 0x00282505}}}, + {X: Field{[10]uint32{0x02e4dbf5, 0x0333fd85, 0x03d6fcc5, 0x03ef6082, 0x033bfa1b, 0x02b889db, 0x01eb4408, 0x03c4ab63, 0x01b72240, 0x00205b03}}, Y: Field{[10]uint32{0x037e52d0, 0x0059810f, 0x02c9f67c, 0x0342a606, 0x02e57acb, 0x03dc0957, 0x009dd4bb, 0x03996251, 0x013dd91e, 0x000a94b2}}}, + {X: Field{[10]uint32{0x023414f8, 0x03725430, 0x0380fbb7, 0x021ec305, 0x00ddbb3d, 0x011a4178, 0x0390ac73, 0x00509544, 0x01f1317f, 0x000cfd8d}}, Y: Field{[10]uint32{0x014bfbcb, 0x01a950f9, 0x013bdb62, 0x02000afe, 0x01151235, 0x02f0acb0, 0x034d570b, 0x006622e5, 0x015584eb, 0x001d0d68}}}, + {X: Field{[10]uint32{0x0251999c, 0x02fb11a8, 0x00eb3e94, 0x0079ed78, 0x030bdfe1, 0x02f10e29, 0x0307185f, 0x02ec0cd4, 0x02d704b0, 0x0034a50e}}, Y: Field{[10]uint32{0x036d577e, 0x02925059, 0x0006f19a, 0x01aceffb, 0x00b6097d, 0x03fdba7f, 0x01e41def, 0x028c53af, 0x03cf19aa, 0x000b72a3}}}, + {X: Field{[10]uint32{0x01fb1da6, 0x00494967, 0x01516b01, 0x01970434, 0x00fb524b, 0x01791283, 0x0054390b, 0x01d69bfb, 0x03bfc543, 0x0009aa87}}, Y: Field{[10]uint32{0x01a91b02, 0x009380e6, 0x03a2fd4b, 0x01bc02af, 0x0083973c, 0x039fa066, 0x037d0b6e, 0x01d7380c, 0x02a604c5, 0x00127b3a}}}, + {X: Field{[10]uint32{0x03d28d20, 0x02d633e9, 0x000cd65e, 0x01f7a08c, 0x02ab1871, 0x02523cbd, 0x026d7da1, 0x0280c172, 0x001af866, 0x001e02bb}}, Y: Field{[10]uint32{0x0008b91a, 0x03ca5e2f, 0x0392992c, 0x000862ab, 0x02414b3a, 0x001edbde, 0x0075b6d1, 0x00387aa4, 0x0041e45a, 0x00369940}}}, + {X: Field{[10]uint32{0x00b88b67, 0x035b540b, 0x03b3d5ee, 0x00fca7fd, 0x01ef9811, 0x00f31079, 0x0115853b, 0x037528f9, 0x02598e59, 0x000773fc}}, Y: Field{[10]uint32{0x02b77271, 0x02005c86, 0x012f28c6, 0x02faa6ae, 0x03aed86c, 0x00e0db81, 0x014307ae, 0x01c79159, 0x02307c68, 0x0035e5e1}}}, + {X: Field{[10]uint32{0x033ff70d, 0x0223b90d, 0x00b01e24, 0x00ea736d, 0x038f336f, 0x03b38718, 0x02367eb5, 0x0064de4f, 0x00a27732, 0x002c66bd}}, Y: Field{[10]uint32{0x00821dec, 0x01357de7, 0x0241dc21, 0x0337553d, 0x03b9e73f, 0x01aa3b9c, 0x037f27a2, 0x0168b509, 0x0039a510, 0x0028faa2}}}, + {X: Field{[10]uint32{0x00f6755e, 0x01e0bdad, 0x02066acf, 0x00b69223, 0x0235f24e, 0x024c925c, 0x00b6126b, 0x0277dbca, 0x0329548a, 0x00072307}}, Y: Field{[10]uint32{0x01ff432d, 0x017be584, 0x030c9179, 0x008ea198, 0x0278108b, 0x0065a81f, 0x00c7e2a3, 0x006bb173, 0x03526a1e, 0x00069e6a}}}, + {X: Field{[10]uint32{0x015716ce, 0x00454faf, 0x021d4f0b, 0x01d44b10, 0x00e4d700, 0x010c4e5a, 0x00a10b7b, 0x030f08f2, 0x01da1ad6, 0x002dbfe3}}, Y: Field{[10]uint32{0x01ce61b8, 0x00c1be69, 0x0232d7c9, 0x030aaa1e, 0x00af8dbe, 0x036cf807, 0x00d21e4e, 0x01059f28, 0x01c6b7b7, 0x00134e1a}}}, + {X: Field{[10]uint32{0x00f47b5c, 0x012233b4, 0x02ccb375, 0x02760c39, 0x00ec08cf, 0x03e82b58, 0x00219329, 0x02a12a06, 0x00acf61b, 0x00373bfd}}, Y: Field{[10]uint32{0x0137d6f9, 0x029bad70, 0x013b1736, 0x02c0e158, 0x00fb1b8d, 0x029292aa, 0x03d5508a, 0x0186d220, 0x00e192bc, 0x002526bb}}}, + {X: Field{[10]uint32{0x00a5ebef, 0x03bacdf7, 0x01c8b131, 0x0262fa14, 0x01843ccf, 0x028f3a10, 0x004aa189, 0x01a2725f, 0x03a7b709, 0x00155879}}, Y: Field{[10]uint32{0x019a14da, 0x007c56ea, 0x015a709a, 0x029b9977, 0x0233b924, 0x01ad0528, 0x00e6b7f2, 0x02f8d90c, 0x0017f298, 0x0012c423}}}, + {X: Field{[10]uint32{0x0395a257, 0x003265e8, 0x008027ca, 0x01516cf2, 0x019c56a2, 0x038193a7, 0x025d5bb2, 0x00565423, 0x017789b0, 0x00136625}}, Y: Field{[10]uint32{0x00b6e0d0, 0x007c8850, 0x02675795, 0x03396dc1, 0x00506964, 0x016c0271, 0x03200c9f, 0x001d5b16, 0x0333ac95, 0x002abaeb}}}, + {X: Field{[10]uint32{0x033bfc8e, 0x01a84bf8, 0x03668124, 0x00befd2b, 0x00e9da51, 0x019b3201, 0x02d55a9d, 0x00f12cc2, 0x026e0637, 0x0020ad63}}, Y: Field{[10]uint32{0x025ffb38, 0x03011e06, 0x013d387c, 0x01f4bfcd, 0x01d6d757, 0x03fd310a, 0x033b5c21, 0x0078dcb0, 0x022d98dc, 0x0020de04}}}, + {X: Field{[10]uint32{0x02c6cdf3, 0x0266fa00, 0x0063ad11, 0x01d4d9a5, 0x03714c3d, 0x03beb113, 0x017d8809, 0x01e12ff9, 0x008aa773, 0x003d27ea}}, Y: Field{[10]uint32{0x0218b3f4, 0x02a8e7e6, 0x00772b96, 0x02c12608, 0x02aa9855, 0x024d20ef, 0x03e72814, 0x02904722, 0x02c02164, 0x00106bfd}}}, + {X: Field{[10]uint32{0x00efd78c, 0x031633b0, 0x03073969, 0x03c035e2, 0x010ce910, 0x030614a9, 0x01b97a78, 0x01168630, 0x01dbac84, 0x0019f521}}, Y: Field{[10]uint32{0x00981e97, 0x01bcc821, 0x034be44e, 0x02e73c67, 0x01596f49, 0x022fc1f6, 0x00aa5a82, 0x00acc57f, 0x012a24ff, 0x001c776a}}}, + {X: Field{[10]uint32{0x0304d4cd, 0x02a58411, 0x0350adb2, 0x01fa2d74, 0x0030a46f, 0x0169c5d8, 0x0399883b, 0x00e30f3f, 0x02f2c190, 0x0024517d}}, Y: Field{[10]uint32{0x0222b0bc, 0x00036f9a, 0x00add567, 0x00aedb9e, 0x036c8e42, 0x035de2ce, 0x00664d54, 0x0317f875, 0x01e7852a, 0x0027645e}}}, + {X: Field{[10]uint32{0x02b2631b, 0x00f88fd1, 0x024b3550, 0x02260237, 0x01536740, 0x001c66af, 0x033848ce, 0x03d7c473, 0x0247efc2, 0x00124b54}}, Y: Field{[10]uint32{0x008fd750, 0x02e31020, 0x00863d50, 0x002ca49c, 0x009f021d, 0x02656935, 0x0168877c, 0x032261fb, 0x03627812, 0x000dd2c1}}}, + {X: Field{[10]uint32{0x03dd1dec, 0x02072985, 0x035490a3, 0x002d1861, 0x0125c661, 0x00af6e71, 0x018d2317, 0x0059e24a, 0x03b8bb81, 0x0016e377}}, Y: Field{[10]uint32{0x031f7568, 0x028d4c5e, 0x031cea92, 0x0030fa20, 0x03c7ae17, 0x00cf53ce, 0x010dee01, 0x0086345f, 0x0364fce3, 0x002d1f4d}}}, + {X: Field{[10]uint32{0x02406c65, 0x0174c3c3, 0x02c5c6a3, 0x03af6847, 0x00063c6f, 0x035531b5, 0x01e603cc, 0x005906bd, 0x03ba25a6, 0x002236dc}}, Y: Field{[10]uint32{0x0000a753, 0x01efc6d2, 0x0056b402, 0x03843051, 0x009b8b5b, 0x00a57e30, 0x004c67ae, 0x035edc22, 0x037b1c1d, 0x000e6c1b}}}, + {X: Field{[10]uint32{0x00382451, 0x020246a7, 0x03721fb3, 0x02f78cc3, 0x032a7037, 0x02c25558, 0x0185070b, 0x007ad0b3, 0x009aa23c, 0x000d2573}}, Y: Field{[10]uint32{0x029799ef, 0x00f843ed, 0x0064dd9b, 0x013d18bf, 0x030b82ff, 0x031d55ef, 0x00299573, 0x020b7dd1, 0x03216f39, 0x001ffaae}}}, + {X: Field{[10]uint32{0x0045d7a2, 0x026994b1, 0x034f1cd6, 0x014b0676, 0x010a4f7b, 0x0348c26c, 0x03756669, 0x00431e4f, 0x02a6970e, 0x003a2973}}, Y: Field{[10]uint32{0x02402b96, 0x007c3a8c, 0x01982b96, 0x0090a536, 0x02fab476, 0x01a3a305, 0x012dbf36, 0x0166ee5b, 0x02bfbd52, 0x0036ab36}}}, + {X: Field{[10]uint32{0x03931f9a, 0x0002d0d9, 0x02e32b57, 0x03cacacb, 0x0051af33, 0x0367bf94, 0x009c4837, 0x01eb78e6, 0x038ae81a, 0x0001ba31}}, Y: Field{[10]uint32{0x00291d35, 0x038a5d4b, 0x029ca47b, 0x024cc375, 0x027d1d51, 0x038429e0, 0x035412cb, 0x01068516, 0x0104751b, 0x00395991}}}, + {X: Field{[10]uint32{0x010a539e, 0x0345c24c, 0x01208ab4, 0x02ddd137, 0x00b9551d, 0x038ea4bb, 0x011722b1, 0x016cbe0a, 0x00a3010c, 0x002e3d48}}, Y: Field{[10]uint32{0x030f3d75, 0x02474025, 0x007909e2, 0x007b641d, 0x03a96d3d, 0x0245444f, 0x026451e1, 0x00b7b63d, 0x003ab671, 0x00196407}}}, + {X: Field{[10]uint32{0x02d8005a, 0x037b02ec, 0x00adfe49, 0x029f2e01, 0x00ae0dea, 0x028b05bf, 0x00bd9173, 0x02605622, 0x00586445, 0x002814e1}}, Y: Field{[10]uint32{0x020d7a67, 0x02329b77, 0x029c8ca5, 0x022cf581, 0x03e71260, 0x02624974, 0x00dab73f, 0x0327ee24, 0x030023dc, 0x0009e20b}}}, + {X: Field{[10]uint32{0x01222144, 0x03e28145, 0x036001fa, 0x000e704b, 0x022117cf, 0x030a566f, 0x018b631f, 0x0024907b, 0x0016aa7f, 0x00104a01}}, Y: Field{[10]uint32{0x037f58e4, 0x0205ec6b, 0x038e1808, 0x0138cabb, 0x02613f35, 0x010fdf81, 0x015c363c, 0x0210cfb9, 0x000dfd8e, 0x0030bfbe}}}, + {X: Field{[10]uint32{0x00c7a1ee, 0x023e2a86, 0x0241a7dd, 0x003ac142, 0x028b536f, 0x00f584ec, 0x01130b7e, 0x00f44147, 0x0336cbf8, 0x00312e3f}}, Y: Field{[10]uint32{0x027b4d47, 0x0359fb17, 0x037fc276, 0x0052b525, 0x01f6cf6c, 0x01d448e6, 0x02ba76b4, 0x00cded19, 0x004c8867, 0x0021f4f1}}}, + {X: Field{[10]uint32{0x00a51ac1, 0x029fd6a8, 0x002a93b7, 0x02e61b68, 0x031de630, 0x02df3495, 0x03850106, 0x00e38e9a, 0x013a7cb9, 0x00103ada}}, Y: Field{[10]uint32{0x036d8d18, 0x038db0eb, 0x0389fa51, 0x0293bea7, 0x01c7ede7, 0x0132e201, 0x003b770c, 0x0105f72f, 0x01e014d3, 0x0009ee1d}}}, + {X: Field{[10]uint32{0x0381dad4, 0x012a6f5f, 0x01fb86e9, 0x02137cdc, 0x00ac0c9d, 0x03cb77c9, 0x0365d675, 0x000601d4, 0x010254e3, 0x003dd246}}, Y: Field{[10]uint32{0x005a6e46, 0x03093357, 0x00c7c17a, 0x031cbb1a, 0x0268af0c, 0x0349d758, 0x01bf1b5a, 0x00203f72, 0x0336c549, 0x001a89c6}}}, + {X: Field{[10]uint32{0x009f287e, 0x014c9521, 0x032e36a0, 0x02b30d93, 0x02f16388, 0x01e88fe3, 0x026996c9, 0x00676853, 0x021de4ce, 0x0033c4c9}}, Y: Field{[10]uint32{0x03adac10, 0x002a5a1c, 0x02b7c04a, 0x020f1dc6, 0x008218c4, 0x02e1ca9e, 0x024ab51b, 0x01d11fdf, 0x018dbe1a, 0x00155a21}}}, + {X: Field{[10]uint32{0x013e8cb3, 0x00f1d86b, 0x02a81726, 0x005dcb1c, 0x0394cfd5, 0x00889a11, 0x01166066, 0x021f7f55, 0x02629dd0, 0x00271af6}}, Y: Field{[10]uint32{0x010c0eb3, 0x006d9e80, 0x030be05b, 0x0317896e, 0x019e5fbc, 0x018bff1e, 0x035628ed, 0x0329faec, 0x007b9c7f, 0x000b1df7}}}, + {X: Field{[10]uint32{0x01d26bf3, 0x02adf96e, 0x01922bb7, 0x01ef456c, 0x01c1526d, 0x02cc5256, 0x02cc9a55, 0x0277b083, 0x035f6443, 0x00363440}}, Y: Field{[10]uint32{0x00dbbe30, 0x006e5233, 0x003143eb, 0x00dae72d, 0x03b922a4, 0x02506efd, 0x007f697b, 0x03fa8fd8, 0x00d6ccfd, 0x002adf8d}}}, + {X: Field{[10]uint32{0x01c1d424, 0x02f08a34, 0x022a939c, 0x0296c028, 0x037d53ae, 0x00203c21, 0x032e1047, 0x01e98378, 0x0223b822, 0x0031bd02}}, Y: Field{[10]uint32{0x01d80345, 0x01af42f0, 0x0064d7fe, 0x01af96a3, 0x0263a313, 0x022c8dd2, 0x006f1f4b, 0x02317244, 0x018fcf4b, 0x00385af1}}}, + {X: Field{[10]uint32{0x03a43536, 0x0002e3d8, 0x02509494, 0x03358748, 0x01d1e007, 0x03388b78, 0x007c2dec, 0x034e95c5, 0x02229477, 0x000e9a76}}, Y: Field{[10]uint32{0x01a0e284, 0x030bef92, 0x03c3925c, 0x035ce272, 0x0246b98c, 0x026de73e, 0x00c95e1c, 0x01818b1f, 0x03d5c4ba, 0x0031e713}}}, + {X: Field{[10]uint32{0x0325fc9d, 0x01ede500, 0x0339b7bc, 0x020a42a8, 0x00814c3d, 0x01963c86, 0x037f6fca, 0x0312291a, 0x00e5492f, 0x0006d7ee}}, Y: Field{[10]uint32{0x007fff39, 0x01bef9f7, 0x02982164, 0x00d63bfa, 0x01d2ca42, 0x0124d6c0, 0x02f49f4c, 0x002064ad, 0x03124c9e, 0x00298a42}}}, + {X: Field{[10]uint32{0x009a3845, 0x02fa3b0d, 0x014c747b, 0x0088c7c1, 0x028a7559, 0x0069fe9f, 0x01e1c37d, 0x02d3ab72, 0x0302b004, 0x003f6e83}}, Y: Field{[10]uint32{0x011646fe, 0x0208088e, 0x0262ae2b, 0x02775cb5, 0x0106c3c0, 0x00c310f2, 0x02defd7e, 0x01c709bf, 0x01c9e964, 0x0010b698}}}, + {X: Field{[10]uint32{0x035140df, 0x03c32ce8, 0x01760f38, 0x010cbebc, 0x007c1663, 0x018ce262, 0x03279f70, 0x02598af9, 0x01bfcb7b, 0x0030e4e4}}, Y: Field{[10]uint32{0x02f556e1, 0x02d58f26, 0x02d664c5, 0x02075e94, 0x03449f9f, 0x03de7606, 0x00b8b3ff, 0x020b3121, 0x003453dc, 0x003a8538}}}, + {X: Field{[10]uint32{0x0059cbcb, 0x0385d102, 0x01321675, 0x00280886, 0x0019aedd, 0x01b2c831, 0x000e36cc, 0x032ca86b, 0x013dc716, 0x000953fc}}, Y: Field{[10]uint32{0x02e35921, 0x002b4ae4, 0x03701c40, 0x033e0fac, 0x00896e02, 0x011fd6fa, 0x036bfe32, 0x009abe78, 0x00f3916d, 0x00009913}}}, + {X: Field{[10]uint32{0x00930474, 0x0327d5ca, 0x00c5b071, 0x0176a9f2, 0x021769d3, 0x0215a009, 0x008974e9, 0x0192b68b, 0x0260e9b4, 0x0009392a}}, Y: Field{[10]uint32{0x00479f8e, 0x01cd4e3a, 0x02af78d9, 0x00e3672e, 0x036ed37c, 0x0332501b, 0x022244bc, 0x013f8202, 0x02d182a9, 0x00277df0}}}, + {X: Field{[10]uint32{0x017543a6, 0x00b13db4, 0x01ef8070, 0x03062ffc, 0x02fb19a4, 0x01667f00, 0x03d81b38, 0x01a170fb, 0x03adf906, 0x001eb66e}}, Y: Field{[10]uint32{0x01246f95, 0x02ab5931, 0x02df0133, 0x010d1249, 0x00da45e2, 0x02294cf7, 0x013ac8fd, 0x006293dc, 0x01709c40, 0x00261e2e}}}, + {X: Field{[10]uint32{0x02d8ae53, 0x00495958, 0x022b501d, 0x00e6f97e, 0x00c6e083, 0x01f7eeaa, 0x009eb2df, 0x021c5f83, 0x00d9383a, 0x0025f63f}}, Y: Field{[10]uint32{0x03c6a777, 0x0300a3c1, 0x0074c4a2, 0x0329fe3d, 0x03b1f114, 0x03616be9, 0x00363e15, 0x013e19fe, 0x024cf578, 0x00061e72}}}, + {X: Field{[10]uint32{0x02fe7572, 0x01c77762, 0x0172cb87, 0x03bd417b, 0x002af1ac, 0x0315bfeb, 0x014d1a92, 0x030cb878, 0x03855a08, 0x000f83f1}}, Y: Field{[10]uint32{0x02149390, 0x0396c25b, 0x020b5884, 0x03cf7c56, 0x01bb1768, 0x028c2d55, 0x0044fc9d, 0x022253c2, 0x03fcfd1e, 0x001b5e6d}}}, + {X: Field{[10]uint32{0x01602562, 0x01fb3ed9, 0x037ec55b, 0x039ff1d5, 0x02fda483, 0x02275bd7, 0x023a9b53, 0x03619076, 0x03dbb132, 0x00367685}}, Y: Field{[10]uint32{0x0223b70b, 0x03e318f1, 0x001a7b67, 0x017a2821, 0x0033a4f3, 0x03e3c8ec, 0x027f9e63, 0x0035c0bb, 0x01e45feb, 0x0020391c}}}, + {X: Field{[10]uint32{0x03ca18f3, 0x026026db, 0x039eca3d, 0x014e75be, 0x03f38e28, 0x02dc484a, 0x0135daa7, 0x0078d20a, 0x0366afcd, 0x0006123d}}, Y: Field{[10]uint32{0x036f5884, 0x003d1342, 0x00b7dee7, 0x03d2a4f5, 0x005f9196, 0x01d23b65, 0x0135df63, 0x0153c927, 0x0082645d, 0x0032a69e}}}, + {X: Field{[10]uint32{0x017a9f2f, 0x02728112, 0x02be0a84, 0x011fdcb1, 0x031a9d00, 0x03f0b457, 0x0165b2d4, 0x02b1d96b, 0x00ae9a7d, 0x003b4dd1}}, Y: Field{[10]uint32{0x02b5fb5b, 0x00d113da, 0x02f36b76, 0x0121c19b, 0x032fdc52, 0x00f11dfb, 0x0323d032, 0x031bdf92, 0x012ed4e5, 0x000f3ddb}}}, + {X: Field{[10]uint32{0x033676d7, 0x033fbf97, 0x026b7b1c, 0x0332a188, 0x0391212a, 0x000c49c1, 0x00a3a65e, 0x01516ac4, 0x0373edf3, 0x0031181e}}, Y: Field{[10]uint32{0x017eb3ec, 0x010824cf, 0x02d7728c, 0x02711771, 0x012628ac, 0x008c38f7, 0x000cd036, 0x03de0f57, 0x025b8595, 0x000c6b51}}}, + {X: Field{[10]uint32{0x000e96f0, 0x0392c2af, 0x00699641, 0x006d93ac, 0x00bfb9ad, 0x00e8fe94, 0x020af049, 0x01a75e2c, 0x02ed2aaf, 0x00070258}}, Y: Field{[10]uint32{0x01aede44, 0x015a92ab, 0x0012302d, 0x01828e5f, 0x02591b5a, 0x021e9fda, 0x029c5b0a, 0x038e8a90, 0x02f6e088, 0x00127c46}}}, + {X: Field{[10]uint32{0x01c19454, 0x02682637, 0x0045b1f0, 0x006ab989, 0x0182250e, 0x02ded0e0, 0x00dc6caf, 0x02567826, 0x036c9a41, 0x0001a811}}, Y: Field{[10]uint32{0x0111c7e1, 0x014bb1bd, 0x0233fbe5, 0x02e7331f, 0x00ab4288, 0x03238d45, 0x0266cd37, 0x031324b0, 0x00978ae3, 0x0015a10b}}}, + {X: Field{[10]uint32{0x00191f1c, 0x019e0c28, 0x028f6b93, 0x0203a729, 0x02cdb59a, 0x00a7c0f1, 0x03149993, 0x002a829a, 0x00f653a3, 0x00009368}}, Y: Field{[10]uint32{0x00138235, 0x00b1d5cb, 0x00b53d1a, 0x01a67880, 0x00cdbd3b, 0x00187185, 0x010683af, 0x02f3d6e0, 0x0080aa78, 0x0020f9e4}}}, + {X: Field{[10]uint32{0x021a7764, 0x00dd0fe6, 0x0075f6f3, 0x023c089f, 0x02a07872, 0x00c99100, 0x00719010, 0x02741fd6, 0x00832247, 0x00001b0d}}, Y: Field{[10]uint32{0x00dcc4c6, 0x024b02e8, 0x01bffeb1, 0x0043c361, 0x00be7792, 0x016f6916, 0x03128d84, 0x015021af, 0x03744a12, 0x0028ddeb}}}, + {X: Field{[10]uint32{0x01c43baf, 0x01e3e675, 0x00905154, 0x03d28525, 0x011cdc26, 0x020acdb8, 0x02cf2498, 0x032c9ac9, 0x03bb4d14, 0x00084aaa}}, Y: Field{[10]uint32{0x0047e281, 0x0358140e, 0x01148ca1, 0x028ff099, 0x0011c22e, 0x02ea3961, 0x02ed57d7, 0x0160ae63, 0x020a81d1, 0x003a4502}}}, + {X: Field{[10]uint32{0x0343b10e, 0x005096ac, 0x011edf37, 0x031092a5, 0x02f26ee0, 0x02c2e89c, 0x006824e5, 0x02882a35, 0x00f12afc, 0x00289d1e}}, Y: Field{[10]uint32{0x004036a3, 0x020292ef, 0x017598ec, 0x028df1f3, 0x0270ad0b, 0x01e0635e, 0x03bdecb6, 0x025ea968, 0x0386a7fc, 0x001479d2}}}, + {X: Field{[10]uint32{0x0172e293, 0x03dc4681, 0x03fe5716, 0x001fa336, 0x02b9b8a5, 0x03d57838, 0x022fa7e8, 0x03e7ae8b, 0x029a7171, 0x00387049}}, Y: Field{[10]uint32{0x02afba46, 0x024cd70c, 0x00848e63, 0x029db40d, 0x005562c4, 0x03a09da1, 0x00d8e242, 0x00c90be6, 0x01700895, 0x001073e8}}}, + {X: Field{[10]uint32{0x01e09efb, 0x0209f03d, 0x007804d5, 0x022c9082, 0x0062f0f7, 0x03303ef6, 0x03328e1e, 0x0238642e, 0x004c1941, 0x00081355}}, Y: Field{[10]uint32{0x03d52fb7, 0x015c1664, 0x009f06d0, 0x03514d39, 0x0018cf4e, 0x013e6030, 0x023799cb, 0x00561c42, 0x00e31f5d, 0x00319826}}}, + {X: Field{[10]uint32{0x025172ad, 0x0121b15e, 0x016ee361, 0x02c8eac6, 0x00980138, 0x01e2d33c, 0x0230de2f, 0x03cbcb7c, 0x030a11a6, 0x0005bb77}}, Y: Field{[10]uint32{0x01992684, 0x028338ad, 0x0318bb39, 0x02d3ee05, 0x001327bd, 0x0040b108, 0x004a7926, 0x02cf0648, 0x018fed8a, 0x0038f6cd}}}, + {X: Field{[10]uint32{0x038995f1, 0x020a74ca, 0x0080eaf6, 0x0069e72c, 0x013df700, 0x008c54de, 0x026b7c10, 0x0365ad97, 0x00312298, 0x001f27de}}, Y: Field{[10]uint32{0x01f51e5c, 0x006551bb, 0x000e4a60, 0x0346eedc, 0x02b2481d, 0x014f2ccb, 0x002018fc, 0x0283c6c9, 0x003c90e3, 0x00080df3}}}, + {X: Field{[10]uint32{0x0198fb1c, 0x01a2c598, 0x02dee211, 0x03a54c31, 0x0263aee7, 0x00b5a580, 0x03913a5b, 0x02e3db06, 0x01461dbe, 0x0004a70b}}, Y: Field{[10]uint32{0x01137964, 0x02b097d5, 0x00dc1747, 0x02fdf3a8, 0x027bbd80, 0x00a1f559, 0x0214b72a, 0x009fe68a, 0x02b961c0, 0x000a7ffb}}}, + {X: Field{[10]uint32{0x036175aa, 0x02812707, 0x03b12570, 0x009f818c, 0x02de2049, 0x00c896d4, 0x011f9daa, 0x024cbbdb, 0x016530d4, 0x0022f8b9}}, Y: Field{[10]uint32{0x005510c8, 0x03060014, 0x0340423c, 0x02f5a9a1, 0x03fabfe4, 0x00f02547, 0x0007056e, 0x00334500, 0x02871a13, 0x000d92d3}}}, + {X: Field{[10]uint32{0x0252fa6c, 0x024265d8, 0x00c5e27c, 0x00b97e20, 0x0142a6e1, 0x014ed310, 0x00ceb624, 0x02719eac, 0x030842ae, 0x00102d0f}}, Y: Field{[10]uint32{0x02a2068f, 0x00a812f3, 0x02cca443, 0x03fb448f, 0x00248f11, 0x03168b4b, 0x025e46f2, 0x00b96ec8, 0x02c5de1b, 0x001b46b1}}}, + {X: Field{[10]uint32{0x02c669df, 0x011ce816, 0x00f17087, 0x026f8dc9, 0x014c2cba, 0x00f1276d, 0x01caa559, 0x0137cf3c, 0x038a02f3, 0x0011f888}}, Y: Field{[10]uint32{0x00f31f3a, 0x026fa0a7, 0x01908939, 0x009d8237, 0x00acfc61, 0x00294bdf, 0x02104a36, 0x00957fb2, 0x03a203ee, 0x00134133}}}, + {X: Field{[10]uint32{0x01cfc35a, 0x029727b8, 0x02d607c7, 0x012d77e3, 0x03b3de47, 0x01315975, 0x00433238, 0x031b6ad2, 0x00553a45, 0x0005ca1b}}, Y: Field{[10]uint32{0x0320007f, 0x01c8f258, 0x000cf6d8, 0x0091e4cd, 0x035b194d, 0x02550c41, 0x03104b27, 0x01454582, 0x034775a4, 0x00185cb4}}}, + {X: Field{[10]uint32{0x01d7bb31, 0x02c810a3, 0x01258b7f, 0x0325367b, 0x010a3e96, 0x0158cab1, 0x010bd344, 0x024b2b42, 0x039d3c14, 0x000d146b}}, Y: Field{[10]uint32{0x014974d6, 0x03e2d06c, 0x0079acc5, 0x004e49f3, 0x007687c5, 0x013068ec, 0x0284fd78, 0x01b81b9c, 0x03832123, 0x0037524c}}}, + {X: Field{[10]uint32{0x014e5ce2, 0x03409480, 0x01619d23, 0x00e96caa, 0x00ed9afa, 0x01b82b11, 0x01bee2da, 0x0179ff2d, 0x0081eccc, 0x002c02a9}}, Y: Field{[10]uint32{0x008866a1, 0x032a3efa, 0x022424a2, 0x02a79f9d, 0x0210d732, 0x0107e07e, 0x002ceb74, 0x00cb383d, 0x00861f00, 0x0001a1ed}}}, + {X: Field{[10]uint32{0x00b23311, 0x01571fa8, 0x01e2fa8a, 0x035301d8, 0x020ef706, 0x0135cd6c, 0x008a2393, 0x03247fc9, 0x029cc75b, 0x0014fb23}}, Y: Field{[10]uint32{0x01d45919, 0x00413d91, 0x027688b5, 0x012e7f60, 0x00c352f5, 0x0175716a, 0x01104e01, 0x02c7b46d, 0x03c063c4, 0x0006c477}}}, + {X: Field{[10]uint32{0x01efab66, 0x02461b29, 0x030a4cdc, 0x01e1eaed, 0x032fc80d, 0x01c78ce0, 0x03eddd8d, 0x00b268ec, 0x01b39c07, 0x0007b378}}, Y: Field{[10]uint32{0x026dd626, 0x02b82f2b, 0x025f30da, 0x00c25228, 0x00239f0c, 0x00812734, 0x00cecb18, 0x025d8adc, 0x02c75a79, 0x00013d6b}}}, + {X: Field{[10]uint32{0x03b1394e, 0x0321d526, 0x012e65af, 0x02759dc1, 0x011e9023, 0x02823be9, 0x039b479f, 0x015631ea, 0x03c3702b, 0x00007f8b}}, Y: Field{[10]uint32{0x02845c2c, 0x02f5c831, 0x0326d30f, 0x003229f6, 0x0211a64c, 0x01b523f9, 0x016df2b6, 0x0174eb08, 0x02ae3a39, 0x003dad61}}}, + {X: Field{[10]uint32{0x006d5dec, 0x01c62c78, 0x039ba872, 0x0314a296, 0x0376e64c, 0x03c0c71e, 0x02ba0c20, 0x00ab5560, 0x032fb8ac, 0x002d4f42}}, Y: Field{[10]uint32{0x02e3a289, 0x03c0d3a4, 0x0087b351, 0x01de51da, 0x02041015, 0x01f48c94, 0x03b034c1, 0x021ea992, 0x018951ab, 0x00226139}}}, + {X: Field{[10]uint32{0x0337cf95, 0x02b784a3, 0x02ea7bc0, 0x00428845, 0x01a06ca3, 0x03ccd760, 0x03fe5d81, 0x008d999c, 0x011603bc, 0x00001539}}, Y: Field{[10]uint32{0x0312bd4a, 0x00e9e05c, 0x030b4c5b, 0x01e92e64, 0x01923660, 0x03a05cd5, 0x037206d6, 0x00b0afc6, 0x00269deb, 0x003d1c72}}}, + {X: Field{[10]uint32{0x03b29a7b, 0x036ca0d9, 0x01f598c4, 0x02b19754, 0x013b8087, 0x0322eae4, 0x01e22244, 0x008e8b4e, 0x0372a1d4, 0x0039fbed}}, Y: Field{[10]uint32{0x03a9b6e7, 0x039171e4, 0x023bd587, 0x0282854b, 0x03704a39, 0x01fda863, 0x02b47f41, 0x0022c2fc, 0x0186031d, 0x003cb7ed}}}, + {X: Field{[10]uint32{0x00b519fe, 0x011ae634, 0x03e67034, 0x00ab7020, 0x010b163f, 0x027bc0c8, 0x03b43097, 0x018ea0ab, 0x01aae8a2, 0x0017b167}}, Y: Field{[10]uint32{0x01ef82b9, 0x0057aa1e, 0x0304e842, 0x01bd7016, 0x03a8a531, 0x01395613, 0x01c6aab9, 0x03ab94c3, 0x00c36a3d, 0x000baad3}}}, + {X: Field{[10]uint32{0x00bb62f5, 0x032e40f5, 0x0121658c, 0x01a71034, 0x0001119f, 0x03f07c26, 0x02975c8e, 0x0277ef6b, 0x00d92058, 0x00109ed7}}, Y: Field{[10]uint32{0x02d1213d, 0x011a1995, 0x01b18d98, 0x028c1a1c, 0x006500b5, 0x017f2a1e, 0x022803c3, 0x01210905, 0x02e3b879, 0x00341579}}}, + {X: Field{[10]uint32{0x0105bcad, 0x02113be7, 0x00736554, 0x03630344, 0x002cc30d, 0x03750b2e, 0x03422c79, 0x013cf423, 0x0315fc59, 0x00152552}}, Y: Field{[10]uint32{0x0335373a, 0x011cd33d, 0x0397564b, 0x03d7af30, 0x029c6b88, 0x00680392, 0x03f8e042, 0x027080ab, 0x00657356, 0x0021a9f3}}}, + {X: Field{[10]uint32{0x01f32559, 0x016879ac, 0x021f01b5, 0x02019e8a, 0x03573eb4, 0x0255a194, 0x01aa7b33, 0x003efca8, 0x038d2367, 0x003fdbe3}}, Y: Field{[10]uint32{0x02c7e218, 0x02b07706, 0x017cd2d4, 0x03d0fe3d, 0x0336cd33, 0x027f6511, 0x031552f0, 0x02f15f5c, 0x01a6c7ca, 0x001e94fc}}}, + {X: Field{[10]uint32{0x018a2381, 0x00309965, 0x0152b842, 0x03ee2805, 0x023bba8e, 0x007832e2, 0x02d852f4, 0x030843a0, 0x01e99021, 0x001d35c9}}, Y: Field{[10]uint32{0x01bb2bb0, 0x02d6153d, 0x0227c0ae, 0x039809b2, 0x0192f18d, 0x00405b76, 0x03d6ca4e, 0x01c2ee20, 0x0246aa9f, 0x0013b9a5}}}, + {X: Field{[10]uint32{0x009c845b, 0x030c9479, 0x008d76d3, 0x01c35dd1, 0x01feca05, 0x01636176, 0x0168fbbc, 0x010b270b, 0x037efc03, 0x003a50e7}}, Y: Field{[10]uint32{0x02233916, 0x006f808f, 0x03592203, 0x039ea4a1, 0x01566667, 0x03435c19, 0x0290b459, 0x0095ebbb, 0x01981b7e, 0x0009f683}}}, + {X: Field{[10]uint32{0x01c0b911, 0x01572c29, 0x00f1e2c0, 0x00ca7cb1, 0x0305facb, 0x00fff44c, 0x0126622b, 0x002159b7, 0x008d81a6, 0x0025a129}}, Y: Field{[10]uint32{0x024e68b2, 0x00d4cafc, 0x018161be, 0x00979ebc, 0x03294bbd, 0x0179ed39, 0x0187c31f, 0x03eea975, 0x02d250ad, 0x002480e2}}}, + {X: Field{[10]uint32{0x020e7609, 0x01df25c6, 0x019b4162, 0x00dd7e74, 0x009e4cf8, 0x037161ca, 0x030f1214, 0x0389bb1f, 0x02f90469, 0x0007400e}}, Y: Field{[10]uint32{0x031e5123, 0x02bfa7bd, 0x02139c84, 0x0069f0df, 0x00ed795f, 0x011b4981, 0x031dad81, 0x00b1c82c, 0x03a53082, 0x002671f0}}}, + {X: Field{[10]uint32{0x0197a149, 0x019272b8, 0x0242d01c, 0x02ff1805, 0x010d680a, 0x027dcb02, 0x0032fa58, 0x02aadddb, 0x00f873cf, 0x003e591a}}, Y: Field{[10]uint32{0x02083b1d, 0x00f9353e, 0x036e9979, 0x021b0624, 0x03b67081, 0x014e15f8, 0x00a7ff33, 0x0174c6c9, 0x03c40849, 0x0007fed2}}}, + {X: Field{[10]uint32{0x03f89d32, 0x001104ac, 0x025f5329, 0x03d947b1, 0x03d93c14, 0x00c4542f, 0x02c86a21, 0x02534af2, 0x0106e302, 0x002dab50}}, Y: Field{[10]uint32{0x00d228ce, 0x00a9398e, 0x003ee5db, 0x024a4307, 0x034fa407, 0x01310ad0, 0x015201cc, 0x02590741, 0x02a67427, 0x000668d9}}}, + {X: Field{[10]uint32{0x005b9b9a, 0x01f9f3f9, 0x00108a97, 0x00a1b2c7, 0x0202d478, 0x02eda7ec, 0x020fec3e, 0x03cc1644, 0x02f7190b, 0x0021d51c}}, Y: Field{[10]uint32{0x01a97c21, 0x029e2615, 0x00562050, 0x0238c151, 0x030a172d, 0x017e0127, 0x01d163a9, 0x0166b785, 0x03c5f5dc, 0x0006b7bf}}}, + {X: Field{[10]uint32{0x0227a670, 0x03bac166, 0x034074d9, 0x0356bd29, 0x0354bb6f, 0x0072c6c7, 0x00f7ae2a, 0x01505399, 0x01faf424, 0x0015116a}}, Y: Field{[10]uint32{0x01418018, 0x01d0713a, 0x0294ce87, 0x03a987f7, 0x013bdf07, 0x00fede87, 0x008978ca, 0x038208f9, 0x02077da2, 0x00125b14}}}, + {X: Field{[10]uint32{0x0014d138, 0x01330f5e, 0x0262bf4c, 0x03e5f07d, 0x0374d3a8, 0x0215a0c3, 0x03350267, 0x02b22147, 0x0225704b, 0x0036b861}}, Y: Field{[10]uint32{0x03be6f87, 0x02f6a440, 0x02bff373, 0x03ef1a38, 0x03c20f62, 0x017b20d7, 0x0188ee63, 0x0018660e, 0x01fd7ba9, 0x002af016}}}, + {X: Field{[10]uint32{0x019845c9, 0x032a24e7, 0x00d02dee, 0x02047fa5, 0x013d009b, 0x001f864a, 0x00e659c1, 0x00f7971f, 0x0312e852, 0x00228223}}, Y: Field{[10]uint32{0x0229114a, 0x02c3dd9f, 0x004baef7, 0x011ff179, 0x0041f8df, 0x03062c82, 0x02d703cb, 0x02edd974, 0x012afb8e, 0x00109448}}}, + {X: Field{[10]uint32{0x03af6d01, 0x02d4b935, 0x02f6ec25, 0x033caf3a, 0x00716755, 0x023d5e44, 0x00ed25c7, 0x002344cd, 0x02a88f3b, 0x0035e3d1}}, Y: Field{[10]uint32{0x0306f44d, 0x0149bbd6, 0x006ee5c9, 0x034c9091, 0x01929046, 0x032fc6cb, 0x00b3f019, 0x008043c8, 0x01f229cb, 0x003ac615}}}, + {X: Field{[10]uint32{0x019b034b, 0x0035717e, 0x02fa83ec, 0x0271beab, 0x02f58980, 0x03fbf375, 0x015c4cac, 0x00389d79, 0x031278ae, 0x000782d0}}, Y: Field{[10]uint32{0x004918a7, 0x028a2064, 0x036578bb, 0x02b8275c, 0x03fb523f, 0x020d2140, 0x03d74edb, 0x00ead0ba, 0x03c5544d, 0x003ce314}}}, + {X: Field{[10]uint32{0x017cbbd1, 0x00d1197b, 0x01638cd5, 0x03dc3105, 0x00ab02d7, 0x029623cd, 0x0011f144, 0x0046703d, 0x01b29edb, 0x003c0c55}}, Y: Field{[10]uint32{0x00e85813, 0x034fc1ae, 0x02495599, 0x0125fe71, 0x01317367, 0x00658159, 0x01d07cd3, 0x03fc52d0, 0x03e3ff4f, 0x001cb454}}}, + {X: Field{[10]uint32{0x01de4c8e, 0x025b8e79, 0x02b4153a, 0x01e1b42e, 0x038df665, 0x01059952, 0x00c84fe3, 0x01fed345, 0x01683edc, 0x0003d87f}}, Y: Field{[10]uint32{0x002e5f92, 0x011cb8f5, 0x0212fd38, 0x00e7d636, 0x02e11fc1, 0x00983f93, 0x01d6884d, 0x004ec621, 0x0167cf09, 0x00254b6d}}}, + {X: Field{[10]uint32{0x0017dd77, 0x0271fdf8, 0x0344d7ee, 0x03612c7c, 0x0201ede6, 0x00e9361b, 0x0300e3b1, 0x00dec972, 0x027a29e4, 0x001e0c43}}, Y: Field{[10]uint32{0x0182f2d2, 0x00406db8, 0x00a51a7d, 0x00fd0c4d, 0x007030bd, 0x01f080b5, 0x020f7009, 0x00a78130, 0x018a4d56, 0x0009bfcd}}}, + {X: Field{[10]uint32{0x03781a3a, 0x0009f847, 0x016b97a4, 0x012f2282, 0x034e6ac9, 0x002d87af, 0x01509c2d, 0x00a72e98, 0x004d6b73, 0x0018eba3}}, Y: Field{[10]uint32{0x00d14f88, 0x020fa577, 0x016ce2e4, 0x00a7be2e, 0x01af16c9, 0x00e2a4e8, 0x01629cb3, 0x01e15f46, 0x00cfbf40, 0x002a3a55}}}, + {X: Field{[10]uint32{0x03cca739, 0x01e5c941, 0x02fa9165, 0x009bfde6, 0x00ae662f, 0x00ce15d3, 0x01039616, 0x00d53b8b, 0x012a594b, 0x00252356}}, Y: Field{[10]uint32{0x02f1876c, 0x03219ec0, 0x015570ed, 0x02293b89, 0x01ce0275, 0x01cef5b5, 0x013992f7, 0x00e5ba27, 0x00e25ea0, 0x000dffe6}}}, + {X: Field{[10]uint32{0x02100f45, 0x038b4d11, 0x03a55398, 0x01853719, 0x00660a41, 0x02ffba20, 0x0304de18, 0x000da142, 0x016fa314, 0x00194f3c}}, Y: Field{[10]uint32{0x025a9202, 0x0076cd44, 0x01c3649c, 0x0064f985, 0x03ea4d34, 0x0390c416, 0x026741ae, 0x0395499d, 0x02de5ff1, 0x002b2aab}}}, + {X: Field{[10]uint32{0x028cc782, 0x01447fe3, 0x00d2af3c, 0x02219142, 0x01141e18, 0x039a9de2, 0x00fd1ee0, 0x03722fc9, 0x00828a5e, 0x0011beda}}, Y: Field{[10]uint32{0x03fd8887, 0x020f804d, 0x010cfef3, 0x02611fb2, 0x02f4d266, 0x020b0b8d, 0x009ff4ae, 0x03a6f5ab, 0x013fd52c, 0x002752b9}}}, + {X: Field{[10]uint32{0x0138c0ed, 0x0308015c, 0x020eae24, 0x0021e8ab, 0x024ca442, 0x012c3ca2, 0x01face2b, 0x00a9c5f0, 0x00c723ea, 0x0017c468}}, Y: Field{[10]uint32{0x000c8452, 0x01ccc5ae, 0x011d5bb2, 0x033c1be6, 0x023906ea, 0x0049b939, 0x03925ddf, 0x0184bee9, 0x0084ad97, 0x0017b2bb}}}, + {X: Field{[10]uint32{0x02a9039f, 0x02f72130, 0x022c0320, 0x00ecfae9, 0x00dbf2ba, 0x03ac4224, 0x02b6b3bd, 0x03bde9b5, 0x021c929b, 0x002e7d27}}, Y: Field{[10]uint32{0x0101e558, 0x01a0832d, 0x0115c2bf, 0x0131bd0b, 0x006e1b68, 0x00d2a80c, 0x00ecc1c5, 0x022deef4, 0x02767e4f, 0x00261ca7}}}, + {X: Field{[10]uint32{0x01ade2c3, 0x00e39c85, 0x012dc63c, 0x02c0d8c7, 0x00965dc2, 0x03269182, 0x033eea76, 0x02417fc9, 0x0102e7d2, 0x0003b228}}, Y: Field{[10]uint32{0x034371c0, 0x028fb73d, 0x00b6dbe5, 0x0170da33, 0x02706ffe, 0x03d9c584, 0x03836868, 0x025b2d24, 0x01e7242d, 0x00363226}}}, + {X: Field{[10]uint32{0x03e236c6, 0x0339810a, 0x02dafcda, 0x02c0e73d, 0x010582c5, 0x010a9496, 0x012a3c77, 0x020169b2, 0x02b3c351, 0x00041fc0}}, Y: Field{[10]uint32{0x019bfb9f, 0x03ce272a, 0x00a3e685, 0x017820b1, 0x03c5c2d5, 0x0371c929, 0x01746858, 0x01d8055f, 0x02bf1ab4, 0x00145c8d}}}, + {X: Field{[10]uint32{0x02298971, 0x018194d5, 0x036cfb98, 0x01eb6bdb, 0x02b10d63, 0x020c5e1c, 0x038c1fea, 0x03005b5e, 0x00a1a5c1, 0x003c3ec5}}, Y: Field{[10]uint32{0x024540d1, 0x02f151e5, 0x0033792f, 0x03fecc59, 0x00c40b89, 0x00a00007, 0x018e87c7, 0x03997509, 0x01140d33, 0x0038767b}}}, + {X: Field{[10]uint32{0x00489459, 0x03e6cd51, 0x0347a333, 0x002bfe0e, 0x0078a1c8, 0x03af781a, 0x00ce83c0, 0x013b7bdb, 0x02dbea78, 0x00294dc6}}, Y: Field{[10]uint32{0x00129224, 0x0338fcb2, 0x03edd48e, 0x02f33344, 0x007e3d09, 0x00a88b2f, 0x03acbe7b, 0x0175d1dc, 0x0172127f, 0x003d5e01}}}, + {X: Field{[10]uint32{0x0217300d, 0x013eb7ef, 0x013b999e, 0x005e580f, 0x022bbbb8, 0x03e9f64b, 0x00109715, 0x0295d84f, 0x025e1b0b, 0x000f00c7}}, Y: Field{[10]uint32{0x029c83f3, 0x0309cbab, 0x03e6bbf9, 0x035c70d8, 0x0079cb40, 0x035edb31, 0x00e65a2c, 0x00db751d, 0x03fb3920, 0x00349d68}}}, + {X: Field{[10]uint32{0x01a5318f, 0x0071a701, 0x0218b217, 0x02b948f3, 0x01f8a1b9, 0x00e48203, 0x0169a689, 0x02d4c282, 0x019e685d, 0x0021ed62}}, Y: Field{[10]uint32{0x01a775d4, 0x02bd23ff, 0x02c081f5, 0x03ebe673, 0x011b1166, 0x010ba134, 0x0140b01a, 0x02be968b, 0x0204e3f0, 0x0001ab8c}}}, + {X: Field{[10]uint32{0x01b8bf74, 0x01014042, 0x038dd2ae, 0x0138ffa0, 0x01ea00d0, 0x01adf9ec, 0x018eedb5, 0x0305b7e7, 0x03ddc002, 0x00367c1d}}, Y: Field{[10]uint32{0x033ffeaf, 0x0084996b, 0x012f278f, 0x000bb954, 0x0211c273, 0x01c32e7b, 0x00fc486f, 0x0063894f, 0x011e5031, 0x00194635}}}, + {X: Field{[10]uint32{0x00921af7, 0x031c873e, 0x0398ec9b, 0x02482bbe, 0x037558a4, 0x0089dfd8, 0x01ce3053, 0x02b32582, 0x03638d15, 0x0027026a}}, Y: Field{[10]uint32{0x00e0f6fc, 0x0292de40, 0x033d91ca, 0x012a7ef7, 0x010bf2f8, 0x0194897c, 0x02d6ab31, 0x02f0422f, 0x018d535a, 0x002cb2b1}}}, + {X: Field{[10]uint32{0x028a7fc0, 0x01b71ce6, 0x008ae167, 0x0037b439, 0x0052ab25, 0x030da689, 0x038948a5, 0x0248c973, 0x038b4c2d, 0x001bb47b}}, Y: Field{[10]uint32{0x02742008, 0x02b21fbd, 0x00585f54, 0x02f07241, 0x025c6423, 0x018f69d6, 0x02741368, 0x014553f2, 0x008c2cfe, 0x00306de8}}}, + {X: Field{[10]uint32{0x006928d1, 0x034ef894, 0x018f13fb, 0x02a4c1e7, 0x03cfc458, 0x00ae9821, 0x01f71c1e, 0x01fdb09e, 0x0170154b, 0x00220ba3}}, Y: Field{[10]uint32{0x03e64131, 0x00e9ce9b, 0x03d1d9b2, 0x0197b6ec, 0x0208b315, 0x019eb07c, 0x014ac62e, 0x0061ca42, 0x022e97c4, 0x0022526c}}}, + {X: Field{[10]uint32{0x037aba52, 0x0284e7ec, 0x0246aa6d, 0x03a7f08c, 0x00516840, 0x00942605, 0x019d0afb, 0x01ba81c4, 0x02a024c8, 0x001c211c}}, Y: Field{[10]uint32{0x028fe5ac, 0x014feec4, 0x0130db7a, 0x01ee0335, 0x013a8b05, 0x02528d99, 0x03378d65, 0x0054ca96, 0x03a51d55, 0x0026026d}}}, + {X: Field{[10]uint32{0x039fac3e, 0x02a330eb, 0x025ebd87, 0x00f5c688, 0x03769d57, 0x023420d4, 0x01a1250d, 0x02dc212b, 0x02d509a8, 0x000e913e}}, Y: Field{[10]uint32{0x037f20cd, 0x031a7ed2, 0x01c85cb0, 0x0114b4f1, 0x03f9186e, 0x01849204, 0x0174bf84, 0x03434286, 0x01511250, 0x003ca7d1}}}, + {X: Field{[10]uint32{0x01fb9f30, 0x00dc2cf3, 0x0390afcc, 0x02116267, 0x0236ba4c, 0x00708cd8, 0x00564c04, 0x006f5058, 0x01d8e09e, 0x0028d467}}, Y: Field{[10]uint32{0x03881d7e, 0x034fb186, 0x0267472d, 0x0238d3f3, 0x02715008, 0x031d3423, 0x0199faa6, 0x001c4740, 0x01597c91, 0x001933fc}}}, + {X: Field{[10]uint32{0x00fcf1dc, 0x03c1d9d7, 0x038291c4, 0x03e835a3, 0x02bea1af, 0x027667fc, 0x033513f1, 0x0172593a, 0x00e3765f, 0x0016bc5b}}, Y: Field{[10]uint32{0x03815daa, 0x0100bae8, 0x023dc1f2, 0x02e2a1ea, 0x00511ff7, 0x0005929e, 0x0042db6b, 0x0047b52a, 0x02b53bd7, 0x00002193}}}, + {X: Field{[10]uint32{0x023d54a8, 0x0070b415, 0x0149b402, 0x0344de96, 0x0018848b, 0x00990410, 0x021ec080, 0x03970977, 0x012219ca, 0x0007fe69}}, Y: Field{[10]uint32{0x0318e031, 0x0320ec05, 0x014d4791, 0x0370526c, 0x018f85d7, 0x014dd0c2, 0x00fb919a, 0x01db86d7, 0x034c1222, 0x00151b58}}}, + {X: Field{[10]uint32{0x03d3e938, 0x01b75bd0, 0x0082ac6b, 0x0372a999, 0x007f02fc, 0x03eacda3, 0x00926ebc, 0x007b63e1, 0x00ad72a5, 0x0035e9b7}}, Y: Field{[10]uint32{0x00e41c96, 0x018ec885, 0x03278bde, 0x01601b25, 0x018598a0, 0x01119aba, 0x028f378e, 0x02b21969, 0x00d63ea6, 0x002689cf}}}, + {X: Field{[10]uint32{0x0332d797, 0x02a34647, 0x012823f4, 0x024c7c88, 0x023c874b, 0x02db3531, 0x016dfb52, 0x0331f69a, 0x03e55bdc, 0x000553d8}}, Y: Field{[10]uint32{0x03f76fae, 0x01644d5d, 0x0067a2df, 0x01f6cd03, 0x02f0f29d, 0x00aa9af1, 0x03269b0d, 0x028723a9, 0x032217bc, 0x003a63e5}}}, + {X: Field{[10]uint32{0x00399bf1, 0x03b1d613, 0x01991c27, 0x036a1f3a, 0x02dbdbb7, 0x0086ef7a, 0x0129095c, 0x01857333, 0x008b8513, 0x003dab78}}, Y: Field{[10]uint32{0x03234ad1, 0x01eb4ce3, 0x0296af03, 0x03284c63, 0x013fc1c5, 0x00a298c4, 0x01af074b, 0x032ae84c, 0x03e019fc, 0x00263206}}}, + {X: Field{[10]uint32{0x0347637e, 0x0072cb31, 0x0083a3e5, 0x03da50ea, 0x00b786b3, 0x017fb0af, 0x01290486, 0x0057db1b, 0x02c03b27, 0x00259873}}, Y: Field{[10]uint32{0x035358bf, 0x01d58813, 0x032547fe, 0x00d657c2, 0x03cb9c37, 0x027b1ce7, 0x028056a0, 0x00412dd2, 0x03d99b34, 0x003aa87d}}}, + {X: Field{[10]uint32{0x015d19a1, 0x01262d19, 0x0377f53d, 0x0333d6b1, 0x03480520, 0x000dc170, 0x0003465f, 0x00231cd3, 0x023a27d6, 0x0038294c}}, Y: Field{[10]uint32{0x020cc606, 0x02f58a49, 0x03aee836, 0x02d639f2, 0x0363d88e, 0x0118a5d7, 0x00606798, 0x03158baf, 0x0178a8b8, 0x0007dc9f}}}, + {X: Field{[10]uint32{0x002f6409, 0x0338c74a, 0x00118c24, 0x02577b39, 0x0308206e, 0x009431ab, 0x001980d5, 0x011bcbca, 0x02fd0046, 0x002eae0b}}, Y: Field{[10]uint32{0x011fb82a, 0x03356123, 0x0177d137, 0x02ed1ade, 0x03cafbdb, 0x0195b157, 0x038375a5, 0x00049a37, 0x01dc26a2, 0x000a982c}}}, + {X: Field{[10]uint32{0x01eb2631, 0x02052b78, 0x022c221e, 0x0081e79a, 0x032d7edd, 0x03946ebb, 0x006e9b3e, 0x02562c60, 0x0399ebbe, 0x000e2784}}, Y: Field{[10]uint32{0x029ae2be, 0x01167db3, 0x02fd52c9, 0x02f50d79, 0x00e48ada, 0x004a9893, 0x031fb4d1, 0x03f91679, 0x02331f3c, 0x001b0561}}}, + {X: Field{[10]uint32{0x029d4515, 0x001dc9dc, 0x000458c3, 0x01846e91, 0x01087d89, 0x03e91447, 0x03081747, 0x0154f467, 0x01cac0dc, 0x002de05e}}, Y: Field{[10]uint32{0x003e0de2, 0x0248d47a, 0x00c97a68, 0x0326ee5d, 0x01ce0a80, 0x0115df5c, 0x00caa5a9, 0x01a941b9, 0x02980c49, 0x001c082f}}}, + {X: Field{[10]uint32{0x03104306, 0x0053557f, 0x02dc9f1e, 0x03d04bb2, 0x02baa6a6, 0x03640163, 0x03d13fcf, 0x03e69c48, 0x013dd170, 0x00219fb3}}, Y: Field{[10]uint32{0x006759bb, 0x00d792a5, 0x00dc9e25, 0x038bf792, 0x03d698c5, 0x027cad50, 0x03276897, 0x03b88e3e, 0x03e1bb91, 0x000f036c}}}, + {X: Field{[10]uint32{0x00eecd38, 0x02f8bdb5, 0x004e5697, 0x00af055c, 0x03db25bb, 0x0212cb32, 0x03d4d083, 0x00097507, 0x014c26a1, 0x002f9c59}}, Y: Field{[10]uint32{0x01406afa, 0x02bdabd2, 0x001dfcdf, 0x039112cb, 0x012dcdae, 0x013683bf, 0x02f8d18e, 0x00b71e82, 0x020fc37a, 0x000c5bb4}}}, + {X: Field{[10]uint32{0x02e9079c, 0x037aea5d, 0x01fda6b6, 0x0111e58f, 0x01416905, 0x03478059, 0x015b9a2a, 0x009a179d, 0x00b024d6, 0x0016a387}}, Y: Field{[10]uint32{0x011ebba7, 0x022888bc, 0x00a27d08, 0x00aa4778, 0x023889db, 0x02377a57, 0x00f43516, 0x00c379ea, 0x01737433, 0x00131e4c}}}, + {X: Field{[10]uint32{0x002e6131, 0x005904ae, 0x031f8572, 0x003eb8f4, 0x03bb884d, 0x0018c114, 0x03a761ad, 0x02f433c4, 0x000b2347, 0x000efeb4}}, Y: Field{[10]uint32{0x02545f61, 0x02f6d0aa, 0x0051896e, 0x02adbd6c, 0x0371e3cb, 0x01b52060, 0x03fe8e63, 0x01ffb0fd, 0x01609415, 0x003bccf1}}}, + {X: Field{[10]uint32{0x012c1961, 0x00647bd7, 0x02dc7428, 0x00d4ed3c, 0x0360e026, 0x0171a32d, 0x016c2d2b, 0x03382722, 0x02de684d, 0x0000911f}}, Y: Field{[10]uint32{0x02f7bfcb, 0x009fcc07, 0x03377624, 0x01535b9f, 0x025ad6cb, 0x0110e090, 0x0339e554, 0x02182d8a, 0x002fe80f, 0x002b4e2a}}}, + {X: Field{[10]uint32{0x03cf985d, 0x0215f522, 0x0123909d, 0x001d05f1, 0x00e7685f, 0x02a379d9, 0x0007e49b, 0x02e7e3a2, 0x0321eeb4, 0x00297ab8}}, Y: Field{[10]uint32{0x034def1d, 0x02c408ea, 0x0296eed3, 0x0075229d, 0x01001788, 0x02799565, 0x015f5233, 0x02df4cab, 0x02a9f5c1, 0x000ab3e2}}}, + {X: Field{[10]uint32{0x0090b13c, 0x0395d6ba, 0x01251007, 0x0045710d, 0x03dc035e, 0x02ac17a3, 0x00a5b973, 0x0364e0f3, 0x015c5337, 0x0025f7a6}}, Y: Field{[10]uint32{0x0069e6dd, 0x02448438, 0x01f79e8f, 0x016f3624, 0x00920250, 0x01373bd4, 0x003fb4dc, 0x0228a4d3, 0x01692e30, 0x0013ecb6}}}, + {X: Field{[10]uint32{0x0038f479, 0x005c9b11, 0x01f3cc6b, 0x011151ac, 0x0125b70f, 0x002af7e5, 0x003dad8d, 0x02462be0, 0x025fa864, 0x002e32bc}}, Y: Field{[10]uint32{0x009c05c9, 0x0198f683, 0x02d79023, 0x00dac1a7, 0x02c30e2f, 0x01db01d2, 0x03a8c5a0, 0x01bacdbf, 0x01fac0f5, 0x001f146d}}}, + {X: Field{[10]uint32{0x0107b2e6, 0x0085d92b, 0x03443445, 0x02296c7c, 0x03b2cade, 0x03c50041, 0x00f3001a, 0x038a86c9, 0x028c1b96, 0x002d6f21}}, Y: Field{[10]uint32{0x0138d639, 0x02e8d9d2, 0x026f238b, 0x001ec852, 0x03672a8c, 0x015170ce, 0x02aa456f, 0x027ccf56, 0x02294e92, 0x00235b3f}}}, + {X: Field{[10]uint32{0x033ff602, 0x012a284d, 0x036e9078, 0x01887c4f, 0x0032ea26, 0x0090530a, 0x01b666bf, 0x00ec8843, 0x007c242a, 0x0017d456}}, Y: Field{[10]uint32{0x0346c858, 0x021a5122, 0x03427f58, 0x02299ab6, 0x031b3941, 0x02732ee7, 0x013950f9, 0x00293ae1, 0x020febf2, 0x000b0ec9}}}, + {X: Field{[10]uint32{0x022bcfde, 0x02d19d1e, 0x01feb822, 0x02558343, 0x034f08e6, 0x00113cfd, 0x0252e17e, 0x028ad44a, 0x00f95009, 0x000742f8}}, Y: Field{[10]uint32{0x033a159b, 0x01739363, 0x02538933, 0x02c93e19, 0x03a742c3, 0x01ee0776, 0x003181cf, 0x0061dcde, 0x03c3dbd8, 0x0030ea0a}}}, + {X: Field{[10]uint32{0x0122fb8a, 0x02bd2f23, 0x0192ccec, 0x0356d249, 0x029e0e62, 0x0338c3b4, 0x0221bcd6, 0x00ccc699, 0x0028b800, 0x000fbc3b}}, Y: Field{[10]uint32{0x0144b16d, 0x00a6e9e8, 0x001337d9, 0x018e636c, 0x03512fd3, 0x010f31fd, 0x02a03dae, 0x003a1b24, 0x00ad77d4, 0x003f8b21}}}, + {X: Field{[10]uint32{0x03555fc5, 0x03e5926d, 0x02ad302e, 0x02c39fc3, 0x00f62f12, 0x00ca8d92, 0x02bef427, 0x00136b1d, 0x0224a4ec, 0x002130a6}}, Y: Field{[10]uint32{0x014f970e, 0x029fc29e, 0x017ecb18, 0x014ce391, 0x03929ec4, 0x008b927e, 0x02b454cf, 0x01529c43, 0x02bb283a, 0x0039d883}}}, + {X: Field{[10]uint32{0x02cf43a8, 0x00c55cfa, 0x031e9283, 0x01cc041f, 0x03a309cd, 0x03c705de, 0x0340f4e5, 0x017fa487, 0x0234e75d, 0x001aee99}}, Y: Field{[10]uint32{0x03421582, 0x01af8dbe, 0x01a979d8, 0x03a9519c, 0x025b47fd, 0x00882715, 0x0086b441, 0x02090c7c, 0x008c4216, 0x000cfff8}}}, + {X: Field{[10]uint32{0x01ef0150, 0x03c59d1b, 0x01bfa47c, 0x02625567, 0x02488f62, 0x02796dba, 0x01a6046d, 0x03006f12, 0x02f051b0, 0x0004ed9e}}, Y: Field{[10]uint32{0x00237608, 0x03c764e8, 0x0109ee29, 0x01648c85, 0x03a54add, 0x0212b2b2, 0x037cc35d, 0x02fc2d4c, 0x014b01c1, 0x00343a24}}}, + {X: Field{[10]uint32{0x03af9300, 0x033c4fa4, 0x007202c5, 0x032d8d90, 0x02fdf779, 0x03331289, 0x02abc946, 0x02d8abaf, 0x01bfb5dc, 0x00058488}}, Y: Field{[10]uint32{0x00f83b2c, 0x026dfa4b, 0x007b72a4, 0x036d86bb, 0x00d1a212, 0x00ad484f, 0x0266bd30, 0x01b7e1c2, 0x02c5dd9d, 0x0034ff78}}}, + {X: Field{[10]uint32{0x02eb508b, 0x0242fe38, 0x003d39a5, 0x02fe19b7, 0x017eda1f, 0x00ad4880, 0x03602770, 0x016118eb, 0x020cc62f, 0x000c314d}}, Y: Field{[10]uint32{0x02c44efe, 0x02d2a072, 0x039f01aa, 0x03006dd9, 0x016c30e8, 0x037ab185, 0x037dbe8e, 0x0268ae20, 0x02f5009b, 0x00323a46}}}, + {X: Field{[10]uint32{0x00ec3576, 0x02e002c0, 0x01007a38, 0x03c21cdc, 0x02640364, 0x00925c9f, 0x027f38b7, 0x0147d7a9, 0x027fdd91, 0x00301966}}, Y: Field{[10]uint32{0x01cf47e3, 0x03c58069, 0x03ded648, 0x02b8728c, 0x018c57fa, 0x01d100d8, 0x018b5a77, 0x00c70d51, 0x00cb6fa1, 0x0029bd92}}}, + {X: Field{[10]uint32{0x02679386, 0x009e1fc0, 0x004be43e, 0x025429a1, 0x037d50fe, 0x0386ac72, 0x006472a8, 0x02a24811, 0x024db795, 0x000c8548}}, Y: Field{[10]uint32{0x018a9bf0, 0x01407e4d, 0x0238cc5e, 0x006fbf0f, 0x03faba83, 0x00b3ff17, 0x00c7eb59, 0x023619a4, 0x026297f2, 0x00095d41}}}, + {X: Field{[10]uint32{0x01871145, 0x029a2868, 0x035b3b19, 0x01926625, 0x03fe7762, 0x02971553, 0x0115445d, 0x01c120ef, 0x00e2a87a, 0x00095d95}}, Y: Field{[10]uint32{0x02636ec5, 0x0232234c, 0x010439c2, 0x00c259a4, 0x009efe24, 0x032816c6, 0x03fc4eef, 0x03c53e75, 0x019d0c67, 0x003f2e4c}}}, + {X: Field{[10]uint32{0x002f1b49, 0x0262c5c2, 0x03e800ce, 0x01b5b6cc, 0x0017c8a6, 0x039a422a, 0x017926e6, 0x03c553cf, 0x0201e504, 0x00291e1a}}, Y: Field{[10]uint32{0x0323a2fc, 0x00a184b4, 0x03bfd0b0, 0x038998ab, 0x027f86e8, 0x02df3e9e, 0x01a29678, 0x013e7fa0, 0x0142fc2e, 0x0015db93}}}, + {X: Field{[10]uint32{0x02db1e71, 0x02966998, 0x01e383c5, 0x03dfa0b8, 0x0090b484, 0x022bcda7, 0x013ae62a, 0x02615912, 0x03a9260c, 0x0014503d}}, Y: Field{[10]uint32{0x010bae86, 0x011c534d, 0x021fe2f6, 0x03026149, 0x0394ddcd, 0x03afe454, 0x026aa92c, 0x0277ed8e, 0x02c2b087, 0x0013945c}}}, + {X: Field{[10]uint32{0x00a66dfc, 0x01b3cc93, 0x0134231e, 0x004d4843, 0x03b781fe, 0x02295e75, 0x03d6d901, 0x0142de71, 0x020c0f0f, 0x003d5675}}, Y: Field{[10]uint32{0x014eed15, 0x00aeac23, 0x0208e205, 0x037328a7, 0x025f1f05, 0x02f6a390, 0x015fb56a, 0x014a972a, 0x02ae8e58, 0x0004b673}}}, + {X: Field{[10]uint32{0x00547e7c, 0x021a686c, 0x038570cc, 0x037e68cd, 0x00a4fb73, 0x00e814d5, 0x030e0be5, 0x03406f25, 0x03f50fa2, 0x0022241f}}, Y: Field{[10]uint32{0x03a3d2f5, 0x0055ee5f, 0x0373dab9, 0x006f0036, 0x025b2640, 0x03f29aaa, 0x03145f26, 0x0046d909, 0x0356cc12, 0x003d614e}}}, + {X: Field{[10]uint32{0x018c45ca, 0x02cfa9b9, 0x027ecfe4, 0x03c937bc, 0x03c8ac82, 0x038763fe, 0x011fba31, 0x0141b63a, 0x03f64541, 0x00330792}}, Y: Field{[10]uint32{0x00d27592, 0x00a98fce, 0x03b77590, 0x036c9d4f, 0x011efcf1, 0x00c1a55b, 0x00585a60, 0x0060f1a1, 0x017da875, 0x001d85d2}}}, + {X: Field{[10]uint32{0x03ca99d5, 0x00436ab2, 0x00dd4eca, 0x01f24d15, 0x016c3955, 0x007b7780, 0x02a6f9ef, 0x0108416d, 0x0037ef74, 0x001fb8b1}}, Y: Field{[10]uint32{0x033772d6, 0x0125a3db, 0x025b1827, 0x01c36f7b, 0x033e6d7b, 0x01457695, 0x00503f69, 0x03d767cc, 0x03345eef, 0x00085d51}}}, + {X: Field{[10]uint32{0x03e2465c, 0x0278178c, 0x0290f653, 0x012ed0b6, 0x003605ba, 0x01afd083, 0x033af3ef, 0x02d2a68f, 0x02a239f9, 0x0001cbfb}}, Y: Field{[10]uint32{0x01f553cc, 0x00abb67a, 0x0120a36d, 0x0345ac33, 0x0085482c, 0x000a50a3, 0x002ad9ad, 0x037b7723, 0x02ffdf7a, 0x0000280d}}}, + {X: Field{[10]uint32{0x0099914a, 0x0323d780, 0x0307c938, 0x02b89905, 0x03c8a0cb, 0x035e8e9b, 0x01b627c4, 0x0374019a, 0x033e94a0, 0x000d8f68}}, Y: Field{[10]uint32{0x02f58bd9, 0x03a6301e, 0x0359c3d0, 0x037351e2, 0x03a2f936, 0x00541bd1, 0x0236099c, 0x001e9038, 0x0277ef13, 0x0026f6a6}}}, + {X: Field{[10]uint32{0x02c133fe, 0x0246183c, 0x036e1a7e, 0x02347b26, 0x0393af0f, 0x02f817f7, 0x034a48bb, 0x010a426b, 0x0064c839, 0x001d9502}}, Y: Field{[10]uint32{0x00a3ecc2, 0x03970f95, 0x0084583c, 0x03d697b5, 0x01b3cc98, 0x02bcf5bc, 0x013a236d, 0x03ac0888, 0x03d7738c, 0x003c1a48}}}, + {X: Field{[10]uint32{0x02b239c4, 0x032d007c, 0x01606c94, 0x0224d1c2, 0x0251e381, 0x00ba6928, 0x01945c16, 0x022a7e2f, 0x00217a31, 0x0015cfc2}}, Y: Field{[10]uint32{0x0346bef5, 0x00754ead, 0x03fbe7ca, 0x00a35f1c, 0x00496cc1, 0x030faf45, 0x00b105fe, 0x02792e52, 0x00f27de6, 0x001f9e39}}}, + {X: Field{[10]uint32{0x02b01f5f, 0x02a4d388, 0x01467213, 0x02120669, 0x02f90d21, 0x015f97b5, 0x0009656f, 0x012e4ed4, 0x01818923, 0x000214de}}, Y: Field{[10]uint32{0x02e475f8, 0x01bc07d8, 0x02820ed2, 0x003b267e, 0x029281fc, 0x02733be8, 0x0069bbe8, 0x00266387, 0x01e8cc99, 0x0032529e}}}, + {X: Field{[10]uint32{0x01eb6041, 0x0184cb3b, 0x0051257f, 0x0031e001, 0x016f00a3, 0x033c3b61, 0x01ccd4c1, 0x000cd8ec, 0x01122989, 0x0014ce21}}, Y: Field{[10]uint32{0x0183334e, 0x022d12da, 0x03722fd7, 0x01551a6f, 0x000dd22f, 0x02f26a11, 0x038feacd, 0x0346e693, 0x0252f856, 0x00355b8a}}}, + {X: Field{[10]uint32{0x00e4796d, 0x00eaabac, 0x00c852f3, 0x02300e71, 0x01c5cb47, 0x03ee6258, 0x009f913a, 0x03ded971, 0x008a750e, 0x00107b79}}, Y: Field{[10]uint32{0x02559de4, 0x0090270c, 0x0065b8de, 0x02734693, 0x0104bdfe, 0x0012d4f2, 0x0092ea7f, 0x011a0062, 0x03f94b6c, 0x0035d31e}}}, + {X: Field{[10]uint32{0x01f08148, 0x034ed4f9, 0x03eefb6d, 0x00e4eb3f, 0x03fe7621, 0x03b5aa77, 0x02eece4e, 0x03dcda64, 0x01f36596, 0x0025fa4c}}, Y: Field{[10]uint32{0x00dd5f1b, 0x01838a85, 0x002c09b6, 0x0052d8b5, 0x0039a246, 0x01013ee9, 0x0276ce77, 0x0314a827, 0x013353b9, 0x000f6a26}}}, + {X: Field{[10]uint32{0x0222579d, 0x00024dec, 0x039a54db, 0x01933125, 0x035c55b6, 0x0094acde, 0x00476335, 0x02c410e6, 0x02ea3ca8, 0x00132bd3}}, Y: Field{[10]uint32{0x011607bb, 0x01c7358a, 0x01464621, 0x00013034, 0x0345a191, 0x01c75628, 0x03885807, 0x02f701f3, 0x03320a93, 0x00030999}}}, + {X: Field{[10]uint32{0x027b1ca4, 0x029f2127, 0x0306bb7e, 0x03e086a1, 0x01b52960, 0x01478e0e, 0x0324ee4e, 0x020f0cea, 0x02905b34, 0x00215f07}}, Y: Field{[10]uint32{0x0269dd80, 0x02456ebf, 0x00c01be5, 0x03f7a6d0, 0x011c6b09, 0x028b9af1, 0x018380c4, 0x021dc6cd, 0x010c7a57, 0x00235ba7}}}, + {X: Field{[10]uint32{0x00b5a182, 0x03b4b06f, 0x0322c1e7, 0x02925a1a, 0x0310ec39, 0x0372e8f2, 0x00fc1248, 0x03deb69a, 0x030be0db, 0x001043bd}}, Y: Field{[10]uint32{0x007f9e94, 0x02e508c9, 0x03db3b7c, 0x01e6023f, 0x00e6925d, 0x002d2970, 0x03074aee, 0x015bd73b, 0x02a3331a, 0x00349ba7}}}, + {X: Field{[10]uint32{0x0351029f, 0x00410655, 0x03f7a307, 0x03e69f98, 0x0289dff6, 0x01ea90c6, 0x03e5ec30, 0x03ac4205, 0x03a8c831, 0x00232be1}}, Y: Field{[10]uint32{0x03c8890a, 0x02421c99, 0x02058bfe, 0x001cf176, 0x0113aad2, 0x030e9192, 0x0265ba07, 0x029b0f23, 0x02e1c8dd, 0x000fc2f5}}}, + {X: Field{[10]uint32{0x02f10e8e, 0x01b57ebf, 0x037798c1, 0x022ffee6, 0x01b35ca1, 0x034c53ec, 0x026a8a39, 0x00920d52, 0x02cfe92d, 0x003bb7b8}}, Y: Field{[10]uint32{0x0114c4c3, 0x02cd6ab9, 0x01624c1e, 0x03259e4f, 0x009fcd12, 0x03e73877, 0x031181f3, 0x02fbf92c, 0x02b021f0, 0x0032d456}}}, + {X: Field{[10]uint32{0x02ebcee1, 0x03bb2bca, 0x00312f02, 0x01d5d135, 0x0248bb2a, 0x0045b6d4, 0x02d6a4e9, 0x02dfddee, 0x02c71e77, 0x00232fde}}, Y: Field{[10]uint32{0x039b7320, 0x028b015d, 0x03799169, 0x01fc36da, 0x02b6f669, 0x0034258d, 0x017f97c3, 0x009ad4f4, 0x0331f67b, 0x001d9712}}}, + {X: Field{[10]uint32{0x00995db2, 0x03f19c95, 0x02dfcc19, 0x032e6190, 0x02715dc6, 0x00380448, 0x03f0627f, 0x026abcd3, 0x01b4cd44, 0x001c3351}}, Y: Field{[10]uint32{0x03535c8e, 0x00314e0b, 0x00c4120f, 0x036442d8, 0x02ee184a, 0x02b685b1, 0x0320eac3, 0x025ec610, 0x00567614, 0x0020b965}}}, + {X: Field{[10]uint32{0x007c45d5, 0x00bf7edb, 0x002ea070, 0x011b83d1, 0x03050e51, 0x00defb0f, 0x039d558e, 0x033f6479, 0x03f9783f, 0x0033f885}}, Y: Field{[10]uint32{0x01c419d5, 0x03dc1e65, 0x00dfc7b6, 0x02185eed, 0x00da2251, 0x0231f0eb, 0x03d70d87, 0x00feff15, 0x010e8645, 0x0014df2f}}}, + {X: Field{[10]uint32{0x00579d52, 0x005e43d2, 0x0317e065, 0x032c4afc, 0x01ccabd2, 0x033ebe9c, 0x033d4f74, 0x02ee38af, 0x00df6486, 0x002609b0}}, Y: Field{[10]uint32{0x01c57342, 0x005cb76e, 0x02da734f, 0x015e353b, 0x02ae3bb4, 0x03f0db45, 0x0349c052, 0x01894f4d, 0x0186f86d, 0x000f6fcd}}}, + {X: Field{[10]uint32{0x028a02c4, 0x013d65b8, 0x00e74d0f, 0x037d5db2, 0x00a13e13, 0x01d13a71, 0x033fa3e3, 0x012f0b1a, 0x00ef381b, 0x003a863f}}, Y: Field{[10]uint32{0x0209f397, 0x03f9a7fb, 0x01874d7f, 0x02931074, 0x02041c9a, 0x016568c2, 0x0103c7fe, 0x01175e1c, 0x039d2bc4, 0x0030f9af}}}, + {X: Field{[10]uint32{0x026d8f4a, 0x033e433f, 0x033a0e88, 0x01759cc0, 0x0221b82e, 0x02705bfe, 0x00618bec, 0x01695187, 0x0065c09d, 0x001b78b1}}, Y: Field{[10]uint32{0x004ee2ba, 0x01973caf, 0x03f5d28b, 0x02c0ca02, 0x03e1c4cc, 0x00ec87d6, 0x00a8199d, 0x0220ad0a, 0x03d28950, 0x000d9eb2}}}, + {X: Field{[10]uint32{0x02183f4e, 0x03e9cfc6, 0x0284706f, 0x01a27bf4, 0x03cecc9c, 0x03469505, 0x0250f803, 0x031f516b, 0x0213ee10, 0x00358a1b}}, Y: Field{[10]uint32{0x02a56f56, 0x004fa4da, 0x008ad37f, 0x024d5f6e, 0x01e965ab, 0x0320a790, 0x023ca411, 0x013a271f, 0x03b75520, 0x001eae4a}}}, + {X: Field{[10]uint32{0x03c3bf58, 0x020f7dc8, 0x0364dfce, 0x0187bcf0, 0x0173f0c8, 0x036dbc82, 0x0125962f, 0x01182895, 0x02faea67, 0x001d49b9}}, Y: Field{[10]uint32{0x00e3a674, 0x023d2306, 0x01ae8f00, 0x02b04b8d, 0x0125a21f, 0x02cc8dd4, 0x0274411c, 0x01846f4c, 0x00e0d5a8, 0x000b1daa}}}, + {X: Field{[10]uint32{0x0079308d, 0x0141c3e2, 0x00b2ab78, 0x000e24fa, 0x02e737c8, 0x0067d47d, 0x01d5d897, 0x0128f5b4, 0x02da56d6, 0x003f32aa}}, Y: Field{[10]uint32{0x039362d1, 0x0171aa11, 0x03d7d868, 0x034ff9b9, 0x01a2ee95, 0x025a7eae, 0x01750efa, 0x03de4bbf, 0x01663fac, 0x002098b1}}}, + {X: Field{[10]uint32{0x01b57fe3, 0x012c4556, 0x0088afef, 0x02a2ce9a, 0x03bd6d91, 0x028e5e11, 0x00483797, 0x017d0f31, 0x03b8eb8a, 0x002d8344}}, Y: Field{[10]uint32{0x00ebaa54, 0x033e0e18, 0x038ae94e, 0x014cdd56, 0x038405b0, 0x032217c7, 0x0104acbe, 0x021615d8, 0x02be5d2b, 0x002afdcf}}}, + {X: Field{[10]uint32{0x0377f8be, 0x039b3a30, 0x02d90127, 0x019b7ea8, 0x014250fd, 0x00de7e49, 0x016d2c14, 0x0361cbff, 0x030f4a0d, 0x000ccb52}}, Y: Field{[10]uint32{0x03c6232b, 0x021f3cc6, 0x02354b78, 0x033761f3, 0x03110dfa, 0x0382c5fa, 0x0333d7d9, 0x00d42fd0, 0x014347c2, 0x0000dfcc}}}, + {X: Field{[10]uint32{0x00c5788f, 0x03be1ed3, 0x0394e52d, 0x0082d556, 0x025d0216, 0x01ef44e3, 0x020e8803, 0x0358cc07, 0x02e62ce6, 0x003a66cb}}, Y: Field{[10]uint32{0x025546bc, 0x01210593, 0x03c6d2c0, 0x030ae469, 0x00e2858d, 0x02ecf954, 0x031df268, 0x032a7db7, 0x02fedabc, 0x00327a81}}}, + {X: Field{[10]uint32{0x01c54353, 0x0015b712, 0x033b1dfb, 0x0247a015, 0x005af241, 0x01c666f7, 0x02692a1d, 0x01ebb9ff, 0x00382a97, 0x00227ab5}}, Y: Field{[10]uint32{0x01994ece, 0x003e6bf6, 0x0319c2de, 0x00efaf97, 0x0107fec4, 0x02dc042b, 0x0167f706, 0x01ddb0aa, 0x01cedb2d, 0x002d5cb7}}}, + {X: Field{[10]uint32{0x0198268f, 0x021ed3b5, 0x01488595, 0x03fec243, 0x004777ba, 0x0231d016, 0x006f6fa9, 0x0104fc2d, 0x018e529b, 0x000336b6}}, Y: Field{[10]uint32{0x03ed034e, 0x03ba0c2f, 0x00cac3ef, 0x0205e22c, 0x02ceabc2, 0x0087e1e1, 0x00f10db8, 0x0398e51c, 0x015e0543, 0x0035016a}}}, + {X: Field{[10]uint32{0x02ee2cc3, 0x00a43921, 0x00f5be41, 0x0275783d, 0x02c26984, 0x0330c502, 0x03f69ad3, 0x00ccaf99, 0x03411cc1, 0x001425bb}}, Y: Field{[10]uint32{0x03f8268a, 0x0114d0dc, 0x02bb418c, 0x029bcb51, 0x0149ef34, 0x0029ecfc, 0x021f3123, 0x02c1afb5, 0x029fccd4, 0x001fcce1}}}, + {X: Field{[10]uint32{0x00a5be61, 0x03d838a9, 0x00dbb8b9, 0x03b58e3b, 0x038c4d59, 0x0322fa61, 0x007253a2, 0x019cd218, 0x0270a096, 0x002f02fa}}, Y: Field{[10]uint32{0x02873b78, 0x03883345, 0x03320873, 0x03c0a777, 0x01054d1f, 0x01b1309d, 0x0286129e, 0x01382c12, 0x01ac3c2b, 0x00386444}}}, + {X: Field{[10]uint32{0x03223ec1, 0x014500e1, 0x007a7dc4, 0x02297210, 0x03b024bb, 0x02a9f5d1, 0x00674d38, 0x01682038, 0x0169ac8f, 0x000b4599}}, Y: Field{[10]uint32{0x019a597a, 0x006f5df8, 0x038f73dd, 0x021f8888, 0x01445c15, 0x03bb1396, 0x027d92d4, 0x01a97c4a, 0x03386221, 0x00122bc6}}}, + {X: Field{[10]uint32{0x0145ba30, 0x03a2dfe0, 0x01d40f27, 0x037f8f3c, 0x012947cd, 0x01bb1ded, 0x00e37b32, 0x00454377, 0x03aebb8b, 0x002e32f3}}, Y: Field{[10]uint32{0x00823ca4, 0x01bf76cd, 0x01a0562b, 0x03ef357d, 0x00ffc2c3, 0x021a287a, 0x030ec022, 0x034b7218, 0x00ab8b2a, 0x003548d3}}}, + {X: Field{[10]uint32{0x00960ee7, 0x02abb1b7, 0x02a227a9, 0x02f9823b, 0x01fb2e3e, 0x006b0676, 0x01db9c0f, 0x004bd377, 0x0092563f, 0x003ece58}}, Y: Field{[10]uint32{0x01823c45, 0x02798bb2, 0x0395358c, 0x02ec1a50, 0x01646e88, 0x00bac07a, 0x027f661c, 0x028e50f4, 0x01dffda1, 0x00197959}}}, + {X: Field{[10]uint32{0x0014b297, 0x03fe9529, 0x0022580a, 0x03b88400, 0x02f8da06, 0x02c89d2c, 0x0225150d, 0x0337ea41, 0x01760b8d, 0x00071ba7}}, Y: Field{[10]uint32{0x01666255, 0x02f0bbe9, 0x00057607, 0x02e5e35d, 0x0085679f, 0x02fb62c4, 0x026edcbb, 0x02c2c151, 0x010d009a, 0x001c1ad1}}}, + {X: Field{[10]uint32{0x01fca1c3, 0x0180d46e, 0x00277dc6, 0x00355578, 0x0377f55a, 0x026173b2, 0x0166b13d, 0x03fc39b9, 0x01c146ec, 0x000b810f}}, Y: Field{[10]uint32{0x026d8398, 0x01c7915c, 0x00e1428a, 0x0000aab1, 0x03665da5, 0x02429eaf, 0x011103b0, 0x03abc281, 0x01caf75c, 0x0000713c}}}, + {X: Field{[10]uint32{0x005f482f, 0x002f2696, 0x0192cb4b, 0x03b8b625, 0x019549f9, 0x025f5e15, 0x023ee12d, 0x023a4399, 0x030ca1bf, 0x0016b85e}}, Y: Field{[10]uint32{0x00fc8111, 0x008daf2d, 0x031c716f, 0x02b6235c, 0x03a71806, 0x03a3969d, 0x006966c1, 0x0002f1cf, 0x03349317, 0x002ec37d}}}, + {X: Field{[10]uint32{0x03caafc4, 0x023d1a29, 0x0271c1b0, 0x037f241a, 0x00fca910, 0x01d7b6a5, 0x0011c46e, 0x030f974f, 0x03426a24, 0x003ea2fc}}, Y: Field{[10]uint32{0x035954e2, 0x02b6930b, 0x000435dc, 0x03e795f0, 0x014e2884, 0x016cf3c1, 0x01e6c846, 0x03ef678d, 0x017cdb07, 0x00329a60}}}, + {X: Field{[10]uint32{0x011a88a4, 0x0016bee6, 0x003cb0f9, 0x02d779c2, 0x011e1031, 0x00fd0e53, 0x01f67aea, 0x035fdee7, 0x01c1846d, 0x000b37fc}}, Y: Field{[10]uint32{0x0376f39e, 0x03fcf8bb, 0x00d3b507, 0x023e3959, 0x016ea0d8, 0x038c11c4, 0x00530fed, 0x0390adf4, 0x024f3827, 0x0012ef5c}}}, + {X: Field{[10]uint32{0x013b6905, 0x02ccc8a7, 0x02df95f5, 0x02472a50, 0x01c5bb82, 0x019413e2, 0x01f82b29, 0x0127b2bf, 0x000055ca, 0x001beb6f}}, Y: Field{[10]uint32{0x00b7df62, 0x03d5fbd5, 0x02868c06, 0x014fd64f, 0x03911a30, 0x03104645, 0x02f94728, 0x020c9a95, 0x0184033a, 0x003dd9c4}}}, + {X: Field{[10]uint32{0x00dd0841, 0x0280392e, 0x01fca2f5, 0x00184964, 0x026f4a1e, 0x0357aa34, 0x02b15f55, 0x02a90373, 0x015a2f26, 0x0031451a}}, Y: Field{[10]uint32{0x0113266c, 0x014a0eac, 0x03a6e800, 0x02c45b63, 0x01652905, 0x00ff13bc, 0x01375677, 0x02c1aa42, 0x02082e78, 0x001415ae}}}, + {X: Field{[10]uint32{0x037ff933, 0x004785b2, 0x0306466c, 0x03bbf747, 0x01aad758, 0x03862304, 0x00368dd3, 0x013e1553, 0x00d49347, 0x0020f72e}}, Y: Field{[10]uint32{0x030a53c7, 0x022f6118, 0x02288e9f, 0x03ec3987, 0x030d6ed6, 0x004679e7, 0x027a029e, 0x01c649f1, 0x033d04e5, 0x00041396}}}, + {X: Field{[10]uint32{0x00c8a93f, 0x032aec7f, 0x01127a8b, 0x0208b8ac, 0x015f9ae8, 0x01597e6a, 0x03690890, 0x002c990e, 0x038acf9a, 0x002f1973}}, Y: Field{[10]uint32{0x00fb2143, 0x030a4a85, 0x039c3ae9, 0x03045569, 0x0023ff28, 0x019a66de, 0x000ac90f, 0x03741a82, 0x016ba31d, 0x003f7e5c}}}, + {X: Field{[10]uint32{0x009f140b, 0x0272f493, 0x0153c1e0, 0x035901c3, 0x02695e37, 0x016b4de8, 0x0174b476, 0x004a904b, 0x03a9520b, 0x00121de3}}, Y: Field{[10]uint32{0x029c373e, 0x0328875d, 0x01b39fbe, 0x0316cb8d, 0x01446dd3, 0x03146d1a, 0x03b4c02b, 0x016500e1, 0x0005bec1, 0x00337192}}}, + {X: Field{[10]uint32{0x0301dc25, 0x019f77e8, 0x006e841f, 0x02d4cb46, 0x0328077b, 0x03b5a1cf, 0x01c88312, 0x01621a3b, 0x002c6a73, 0x00276cb1}}, Y: Field{[10]uint32{0x03b3a0dc, 0x024098af, 0x00ac8569, 0x0351e1b4, 0x00aa0ac5, 0x01a8c96c, 0x0193e064, 0x02d17b84, 0x0235ec9d, 0x0038072c}}}, + {X: Field{[10]uint32{0x00f8da6b, 0x0201cd27, 0x012aefb2, 0x023c925b, 0x03037c6c, 0x015ac9ff, 0x021ef442, 0x0009690e, 0x018f62bf, 0x0032f3fd}}, Y: Field{[10]uint32{0x03b1896d, 0x0379b94e, 0x01da2818, 0x006f0440, 0x0128f533, 0x00784daf, 0x029251fe, 0x009d4c0e, 0x02d52da3, 0x0013f667}}}, + {X: Field{[10]uint32{0x034f3639, 0x019c94db, 0x00270933, 0x03ce45e2, 0x02070cbc, 0x00ec77e5, 0x03a12a29, 0x02311605, 0x039787e6, 0x00275482}}, Y: Field{[10]uint32{0x02bc0f14, 0x027b3bed, 0x036bb22d, 0x001e763e, 0x01041fec, 0x028c9589, 0x01885ca0, 0x02625764, 0x015d2b53, 0x00185784}}}, + {X: Field{[10]uint32{0x0225dbbd, 0x01a8d064, 0x02e7b3ef, 0x00f7e0ec, 0x024b0bfd, 0x02331b5b, 0x023d1820, 0x030af2f0, 0x01c40057, 0x00319237}}, Y: Field{[10]uint32{0x018ab3d8, 0x029fef14, 0x02caf209, 0x0187705f, 0x01ec16fe, 0x019e8f67, 0x0347e99e, 0x00659a6e, 0x006338dd, 0x0002b26a}}}, + {X: Field{[10]uint32{0x002137dc, 0x0259187a, 0x0229a7e5, 0x00a5ed17, 0x02b80ead, 0x0248877b, 0x01e3f1e7, 0x03dd9ebf, 0x0035ea96, 0x002b847e}}, Y: Field{[10]uint32{0x00452596, 0x0085e393, 0x01a15c2a, 0x0395397e, 0x034c5dfe, 0x00654eb2, 0x016e1b5f, 0x018bca26, 0x03ecb65a, 0x0008114e}}}, + {X: Field{[10]uint32{0x0364d46f, 0x00a03428, 0x00fec029, 0x03f8d970, 0x000699f6, 0x023bd44a, 0x03b9293d, 0x02993748, 0x01ad56f8, 0x0028d552}}, Y: Field{[10]uint32{0x03fbbe75, 0x0335b842, 0x00868f11, 0x02480f19, 0x008f55a2, 0x01fffb38, 0x015ffce1, 0x026604c0, 0x01cba38c, 0x00321010}}}, + {X: Field{[10]uint32{0x035f8077, 0x011c25f8, 0x03a649c3, 0x0020351c, 0x022aad83, 0x01f6b226, 0x01bfaef3, 0x01d78423, 0x0029af55, 0x001d61dc}}, Y: Field{[10]uint32{0x03c2b8b6, 0x02a173d7, 0x0165b2e5, 0x01d085b3, 0x01603cd6, 0x005df31a, 0x02437620, 0x0146efb4, 0x0097d198, 0x00210ec1}}}, + {X: Field{[10]uint32{0x02d4ea99, 0x0181fecc, 0x031ca917, 0x03a43cba, 0x01ae00b9, 0x00f94cb0, 0x027b1f68, 0x03f54311, 0x0168ca7f, 0x00113b8c}}, Y: Field{[10]uint32{0x012c3270, 0x00fadff2, 0x001411e7, 0x038e6e5b, 0x03022564, 0x024443bb, 0x01a9f9a0, 0x01684efb, 0x02a8120b, 0x00042883}}}, + {X: Field{[10]uint32{0x025337d4, 0x02dbd99e, 0x007d6477, 0x02550b2c, 0x01461e45, 0x00eee632, 0x0278f92f, 0x02bc2e41, 0x00898daf, 0x0026804f}}, Y: Field{[10]uint32{0x023c2a73, 0x012e87f6, 0x0205e877, 0x03c7fd4c, 0x03fec396, 0x017367f2, 0x009b773f, 0x008e939b, 0x005ac966, 0x00047e12}}}, + {X: Field{[10]uint32{0x02b47d5c, 0x01cf5a6d, 0x01bea83e, 0x005cae2d, 0x013fa12d, 0x03d42cd2, 0x0019a615, 0x01060882, 0x00a144d5, 0x002d178a}}, Y: Field{[10]uint32{0x02c29f4b, 0x01b0c1a4, 0x00ae45b7, 0x0248256f, 0x03fb1c20, 0x00e65c94, 0x03f1dec4, 0x0334877f, 0x0383ccda, 0x003661f6}}}, + {X: Field{[10]uint32{0x0241a0c9, 0x000f4d69, 0x02603cdc, 0x0014074a, 0x009a6592, 0x004064be, 0x0065d073, 0x016222a2, 0x02534984, 0x00279f5a}}, Y: Field{[10]uint32{0x00f462d9, 0x00052615, 0x033233c0, 0x02f2c87e, 0x02ce5f1f, 0x0134702c, 0x03e5690b, 0x027e9fd5, 0x00edace2, 0x003285dd}}}, + {X: Field{[10]uint32{0x00991f47, 0x03fa90d5, 0x00b01b9a, 0x01023bc5, 0x03e433a9, 0x02017058, 0x03b306d5, 0x0184f159, 0x0029be1b, 0x00044e85}}, Y: Field{[10]uint32{0x03928697, 0x005159de, 0x023c7500, 0x0006454a, 0x000321e8, 0x01478e17, 0x0191ec1a, 0x032ee124, 0x01fa6d26, 0x000897b9}}}, + {X: Field{[10]uint32{0x018d9181, 0x01575c50, 0x03964776, 0x029b4375, 0x016d6eb0, 0x01ac017a, 0x01e2597f, 0x02177e4c, 0x01d102cf, 0x000cbb23}}, Y: Field{[10]uint32{0x03f9d8b9, 0x035eeeeb, 0x022ab00d, 0x001786a8, 0x003423bc, 0x0310c1d9, 0x02f7f4d9, 0x0392966f, 0x01d078b3, 0x003f5c63}}}, + {X: Field{[10]uint32{0x02e9246e, 0x0063a45c, 0x03865b12, 0x01c3bd1d, 0x01b145db, 0x018547e2, 0x021a5f14, 0x036b9017, 0x0267f2ce, 0x002b690c}}, Y: Field{[10]uint32{0x007cf82c, 0x038352c9, 0x00a541f3, 0x021b0acb, 0x0116e396, 0x02c11d1a, 0x0315c578, 0x0134a7e7, 0x02e04d1f, 0x0034522f}}}, + {X: Field{[10]uint32{0x01bf0cbe, 0x02e611e5, 0x006bbbf7, 0x001c805f, 0x0265f5ca, 0x036e8694, 0x03e662be, 0x01d29a47, 0x02bedebd, 0x00206282}}, Y: Field{[10]uint32{0x009c0a53, 0x006738c2, 0x03bc8da7, 0x00ee4240, 0x030ac0f0, 0x0389cede, 0x008da9bc, 0x00b1cda6, 0x006a0187, 0x0039ecb4}}}, + {X: Field{[10]uint32{0x010b3c94, 0x02fa041f, 0x02f14d80, 0x01b7cb44, 0x02ae7602, 0x0165bc27, 0x00c1a1bf, 0x03684201, 0x0355ef77, 0x000bd27a}}, Y: Field{[10]uint32{0x02038b83, 0x0138e0cf, 0x02ffa569, 0x01ae00b2, 0x011a7903, 0x01b533b4, 0x0289aa1e, 0x004463ad, 0x0010002f, 0x001a8896}}}, + {X: Field{[10]uint32{0x02faf74a, 0x0314d4de, 0x0278ba5c, 0x031e61b1, 0x02bf66d5, 0x03b6f457, 0x02f8029b, 0x00097daf, 0x017054cb, 0x001ff953}}, Y: Field{[10]uint32{0x00ad89b0, 0x025b042d, 0x03695022, 0x03f76dd5, 0x00a47a82, 0x02462155, 0x016afb66, 0x0198c9b4, 0x03ec72ac, 0x003f7185}}}, + {X: Field{[10]uint32{0x02ed2689, 0x028fdd63, 0x0131956a, 0x02eb7bb0, 0x03411ec9, 0x02e71575, 0x01b8675d, 0x02128327, 0x03662b82, 0x00213d64}}, Y: Field{[10]uint32{0x02cd0d88, 0x0263a0c2, 0x01dfe4de, 0x024bd07b, 0x01480425, 0x01144722, 0x01119c4c, 0x01bb5e09, 0x01d96bef, 0x0020db99}}}, + {X: Field{[10]uint32{0x0185ee1b, 0x029bed50, 0x01f52da0, 0x004978ad, 0x00a46b16, 0x033326ff, 0x02eb6b71, 0x02083781, 0x00301a84, 0x003242aa}}, Y: Field{[10]uint32{0x010dc8df, 0x00d48dfe, 0x02efb161, 0x01276489, 0x01cc2134, 0x02671628, 0x031e05cd, 0x01760a4c, 0x03c00b28, 0x003aa1b5}}}, + {X: Field{[10]uint32{0x012ef100, 0x01f65b86, 0x00addc05, 0x02b673f7, 0x018669b2, 0x00d850aa, 0x03047ef6, 0x0126f9a7, 0x0176abae, 0x003fed35}}, Y: Field{[10]uint32{0x03ec6c7a, 0x024406ed, 0x0012080a, 0x01b6948e, 0x013d9596, 0x0203daa3, 0x02700e4c, 0x038060ce, 0x0114b2d5, 0x000dd033}}}, + {X: Field{[10]uint32{0x01403de0, 0x01e3f2b3, 0x00a3c08b, 0x0174b0cf, 0x0312c24b, 0x026bfbff, 0x03ebb618, 0x01af33ad, 0x018967ad, 0x001022a3}}, Y: Field{[10]uint32{0x01caecf3, 0x02f391f8, 0x013a2cdc, 0x015ff58c, 0x014acd35, 0x007605c7, 0x00fb66ff, 0x0310ba8a, 0x03a6378c, 0x000edd87}}}, + {X: Field{[10]uint32{0x0053b787, 0x0120ba1f, 0x027123e3, 0x013c60c9, 0x006c80c0, 0x006c2ac1, 0x01e27e3f, 0x00276ff7, 0x03f61531, 0x0016028c}}, Y: Field{[10]uint32{0x0028431a, 0x00d4f039, 0x02dd801d, 0x028d58e6, 0x02f70a33, 0x025c0bfd, 0x01ac5ae6, 0x020783a6, 0x03c3fddc, 0x002ee01c}}}, + {X: Field{[10]uint32{0x0344130f, 0x039e27e0, 0x018c2505, 0x036ce31a, 0x014c7860, 0x020d26b4, 0x02b11008, 0x03332b11, 0x02947054, 0x000b4c42}}, Y: Field{[10]uint32{0x023db697, 0x0237204f, 0x02a9a5d2, 0x0168b89a, 0x022df187, 0x0244f643, 0x011be0a0, 0x03243a70, 0x029c3c6e, 0x0007a881}}}, + {X: Field{[10]uint32{0x027aa450, 0x008c7e1a, 0x03b32985, 0x009091a5, 0x015d82b4, 0x02e0d6bb, 0x022f2e3a, 0x0072b4fc, 0x002be7b1, 0x000a1d0a}}, Y: Field{[10]uint32{0x00415c42, 0x008c5c7c, 0x02b74cfa, 0x000c87c9, 0x02cf39ce, 0x0107642e, 0x02e3860e, 0x02e48888, 0x032db2e1, 0x0000a18c}}}, + {X: Field{[10]uint32{0x036231cf, 0x01b9007a, 0x02ea48b3, 0x016e54c3, 0x016940f8, 0x00adde60, 0x02f5e418, 0x03ce8042, 0x039ff77b, 0x002be79d}}, Y: Field{[10]uint32{0x00e84c67, 0x03dd5066, 0x03389c13, 0x020eac7f, 0x034deb70, 0x01b5ae23, 0x01d958b8, 0x0057249a, 0x0350dbaf, 0x00274f50}}}, + {X: Field{[10]uint32{0x008c1ef3, 0x00740d5a, 0x01b35447, 0x02302998, 0x00bc93ad, 0x00ec9de3, 0x03d27577, 0x029cd49b, 0x038d515c, 0x001117b6}}, Y: Field{[10]uint32{0x0090dc49, 0x0193c95c, 0x002f555d, 0x0269154e, 0x02e94b75, 0x03cda84f, 0x03743611, 0x018be0ed, 0x023cfde7, 0x0025245e}}}, + {X: Field{[10]uint32{0x001811b4, 0x01d4049c, 0x012aa0dc, 0x02e8ad98, 0x013e76fe, 0x01fb0d34, 0x009993cf, 0x014c183e, 0x020a370d, 0x00380430}}, Y: Field{[10]uint32{0x006fd8af, 0x03d93fc4, 0x023cee3a, 0x009bc857, 0x03798a64, 0x032cf311, 0x0157a214, 0x026f814b, 0x032d280d, 0x0032d145}}}, + {X: Field{[10]uint32{0x025af8f9, 0x0108d4ab, 0x033f9eed, 0x00ed9eed, 0x02ef548b, 0x03ed1334, 0x0134080c, 0x031f96c4, 0x03ca4625, 0x0034d09d}}, Y: Field{[10]uint32{0x03e4a4df, 0x03963235, 0x02b441ec, 0x026b389e, 0x02c39190, 0x038fd13b, 0x037bd609, 0x023dfaec, 0x03797a62, 0x0028d7d5}}}, + {X: Field{[10]uint32{0x031d628d, 0x017bb2b2, 0x01c5dd66, 0x030f27ec, 0x03d96182, 0x0291ccf8, 0x004977fe, 0x010906da, 0x03993bd5, 0x002f82e4}}, Y: Field{[10]uint32{0x03b7fdb8, 0x016fa103, 0x009dadbf, 0x003c17ec, 0x0013218b, 0x03b10626, 0x03762728, 0x0349a837, 0x0353744e, 0x000de410}}}, + {X: Field{[10]uint32{0x018f3980, 0x00b0c67f, 0x0309dc3b, 0x00d3a04b, 0x01edd9bd, 0x01ad0a0a, 0x019f48fd, 0x0087a47b, 0x01f1ed4a, 0x000c20a5}}, Y: Field{[10]uint32{0x02ac0230, 0x02975fab, 0x00181a8b, 0x00d225f1, 0x030797d4, 0x03b93328, 0x0214c314, 0x00386926, 0x034d5c36, 0x001a0d70}}}, + {X: Field{[10]uint32{0x00495b1a, 0x0236ccb7, 0x03b412b8, 0x01799a8d, 0x01c2e07a, 0x0043d7e9, 0x0391604e, 0x021e77f5, 0x035161aa, 0x0019b3fa}}, Y: Field{[10]uint32{0x0252a1e1, 0x03e726cc, 0x03fe3f9f, 0x0317edba, 0x025ffba9, 0x0120ef09, 0x0229602b, 0x03f004f8, 0x029bf8a2, 0x0028381e}}}, + {X: Field{[10]uint32{0x03e39ba4, 0x02168b5b, 0x03648ec8, 0x03be6d57, 0x01bf7b3a, 0x00d29284, 0x03b3d9d3, 0x03a9c133, 0x00fb849c, 0x0003d0ae}}, Y: Field{[10]uint32{0x01e8b22f, 0x03458298, 0x019a7036, 0x012af27c, 0x01f5b0fb, 0x034e06b8, 0x035db65d, 0x012bfe7d, 0x01e2a36d, 0x002d8188}}}, + {X: Field{[10]uint32{0x03ab034f, 0x00c4952f, 0x008e385a, 0x03698233, 0x00c57b7f, 0x0199be3d, 0x00fdc462, 0x018c8cbb, 0x03852290, 0x0010a705}}, Y: Field{[10]uint32{0x0162af35, 0x02605aca, 0x001f18e6, 0x027aaf25, 0x0250b396, 0x0206a813, 0x03bfcb04, 0x023d5d02, 0x02591a86, 0x0038642e}}}, + {X: Field{[10]uint32{0x01ebf611, 0x037dee03, 0x03d7dfaf, 0x0215bf19, 0x009895b9, 0x02cde3b9, 0x01e4237f, 0x026832e5, 0x017c9478, 0x003224e7}}, Y: Field{[10]uint32{0x00ad3682, 0x003e07c7, 0x022b0437, 0x01fa6c57, 0x0047feb7, 0x0018b4b5, 0x02d05e23, 0x01185f0d, 0x036206e9, 0x00050ebf}}}, + {X: Field{[10]uint32{0x0398ef94, 0x01bcf310, 0x00cfb1d3, 0x02de370f, 0x022b82ae, 0x010ab607, 0x0215ae41, 0x00c90c93, 0x01bf5630, 0x00179055}}, Y: Field{[10]uint32{0x035da55a, 0x03d3fd7a, 0x03b75ed6, 0x019080fc, 0x01b90833, 0x005b5d09, 0x033807f2, 0x028ee6a7, 0x01272325, 0x001a007d}}}, + {X: Field{[10]uint32{0x00d1b573, 0x036f4fc2, 0x0165b5e9, 0x00c181e2, 0x03eb01c5, 0x01c45388, 0x03fa851a, 0x024ef9ee, 0x019853f0, 0x000465ac}}, Y: Field{[10]uint32{0x00628795, 0x015ff4af, 0x0297e5c5, 0x03b7fbc2, 0x00fe79dc, 0x0060f6d1, 0x00dea44d, 0x03b88360, 0x00f054bf, 0x00001e53}}}, + {X: Field{[10]uint32{0x033a6094, 0x00dbb4b1, 0x03a1dea8, 0x017dadda, 0x0339803e, 0x01a00c38, 0x038fcd01, 0x01cdedf6, 0x012074bb, 0x00360636}}, Y: Field{[10]uint32{0x0176e504, 0x01bc5e40, 0x00afe9d9, 0x006fed33, 0x02ff15d5, 0x02d7c21b, 0x00d2aacf, 0x00462a03, 0x03b51f63, 0x001ab1f6}}}, + {X: Field{[10]uint32{0x006c6204, 0x02d193ec, 0x02d8851d, 0x00b6c9cf, 0x01703904, 0x02b97262, 0x01a433ee, 0x02afa7b6, 0x034bf5cc, 0x003009da}}, Y: Field{[10]uint32{0x00f4756b, 0x00bbf289, 0x02cc5fd5, 0x03526cfe, 0x00972593, 0x02160548, 0x001a582a, 0x02b20752, 0x00ae6349, 0x0012249c}}}, + {X: Field{[10]uint32{0x01d83307, 0x00d0f5f3, 0x00a7a0d3, 0x00187136, 0x020b8989, 0x00f42c92, 0x01b300b4, 0x0334c3ae, 0x021cca23, 0x000252ca}}, Y: Field{[10]uint32{0x02481df1, 0x014c0be7, 0x00640607, 0x020e6694, 0x02e6e746, 0x020ce2e7, 0x01608015, 0x02f7296e, 0x0156b709, 0x0011f17b}}}, + {X: Field{[10]uint32{0x027d5108, 0x01a21dab, 0x0195a668, 0x00af4d16, 0x009f157d, 0x030a3ed9, 0x021c3850, 0x03d53b92, 0x0379df2b, 0x003cabb8}}, Y: Field{[10]uint32{0x01c8ef08, 0x00b7558d, 0x0231113f, 0x023ef55a, 0x0319a7bf, 0x019dbbbe, 0x0079d351, 0x0287e724, 0x03ae9c90, 0x002b9d9a}}}, + {X: Field{[10]uint32{0x029833ad, 0x01aee16e, 0x02222830, 0x028115b3, 0x01e81e4d, 0x018071aa, 0x029cd043, 0x0312cabe, 0x004f3dbd, 0x003f23f9}}, Y: Field{[10]uint32{0x0156fe15, 0x001d4e1b, 0x01094ce3, 0x017b3a31, 0x012b0765, 0x029420ae, 0x0330a52e, 0x014b5d90, 0x0378a98f, 0x001a8c86}}}, + {X: Field{[10]uint32{0x00255c14, 0x02d19393, 0x02b7c5b8, 0x012d60c3, 0x017444d0, 0x00b77043, 0x01aa3ebe, 0x03cf2fef, 0x017919a4, 0x0034e337}}, Y: Field{[10]uint32{0x008c15fa, 0x0195544b, 0x02e6f1a5, 0x0254776a, 0x03e19040, 0x0336baf9, 0x02311fe0, 0x00bf6e52, 0x02f1823a, 0x001a83c7}}}, + {X: Field{[10]uint32{0x01a4b41f, 0x011d4e02, 0x03f4c142, 0x00675ddc, 0x03916ea1, 0x009ad7a7, 0x0071943a, 0x021a4343, 0x02f6013d, 0x002b00b9}}, Y: Field{[10]uint32{0x005ea2b1, 0x00c6e9b0, 0x008f3995, 0x00650ddc, 0x03726598, 0x023f4bd9, 0x019c5e76, 0x013aaefb, 0x019e436b, 0x003ab712}}}, + {X: Field{[10]uint32{0x006419c8, 0x026dc074, 0x01177d7d, 0x01d47fd9, 0x02dc6d1a, 0x001dbe73, 0x03b5cd07, 0x03518ab1, 0x031ac36b, 0x0000e522}}, Y: Field{[10]uint32{0x011765ba, 0x02ee5746, 0x00bd2732, 0x0239de59, 0x0372d5d1, 0x0333ad87, 0x0141ea71, 0x000f1eac, 0x00eba01c, 0x0032a47f}}}, + {X: Field{[10]uint32{0x02706e9a, 0x00c65c5f, 0x0355435e, 0x034176f2, 0x02ea9e73, 0x03ff6210, 0x014c0c2c, 0x000369b7, 0x008d21d6, 0x00131f6f}}, Y: Field{[10]uint32{0x038230fe, 0x0305fd49, 0x0042d35d, 0x02f6336d, 0x016db46e, 0x01fdfa16, 0x002f4129, 0x01eaf4a7, 0x0344b87b, 0x0021a9df}}}, + {X: Field{[10]uint32{0x0244f623, 0x03847920, 0x01e0698e, 0x00c7677d, 0x01b7dec7, 0x001d0ec3, 0x038c2f7a, 0x0178b427, 0x01aab382, 0x001d48a3}}, Y: Field{[10]uint32{0x000a1676, 0x0086a21e, 0x01aa4510, 0x01949829, 0x0075e336, 0x034a0ba9, 0x0237bdfe, 0x03c41f6e, 0x0187e122, 0x00258f0a}}}, + {X: Field{[10]uint32{0x0280a579, 0x034b0ac3, 0x00147632, 0x00fc40b0, 0x02b584a7, 0x006de91e, 0x02ea92c7, 0x00587e3d, 0x02b32ed2, 0x002a8ea1}}, Y: Field{[10]uint32{0x024e6cb7, 0x01806b6b, 0x002abbc4, 0x03fddc8b, 0x03f7e517, 0x00409135, 0x01345d32, 0x03193c37, 0x009d2b4e, 0x002e3f89}}}, + {X: Field{[10]uint32{0x013f22f7, 0x034c5906, 0x0368abcf, 0x01f4f4f0, 0x014c0322, 0x035bcebe, 0x00b992f7, 0x000e7696, 0x012d9828, 0x001c0ae4}}, Y: Field{[10]uint32{0x02bac387, 0x039710b1, 0x0136f71d, 0x02e8e5ab, 0x02b576cc, 0x01c5331f, 0x00a4e14c, 0x0335e04c, 0x00493a32, 0x0009624b}}}, + {X: Field{[10]uint32{0x0090ba75, 0x034ed727, 0x03567829, 0x00ee3dbc, 0x01269f70, 0x00315c04, 0x0221dfc1, 0x02fe98a8, 0x00886d44, 0x00132843}}, Y: Field{[10]uint32{0x03fde3e7, 0x00fb3ed3, 0x034b9dac, 0x0089fc0d, 0x0395b04a, 0x00b5df6c, 0x01e6f277, 0x038d6353, 0x02b29282, 0x000cc8fa}}}, + {X: Field{[10]uint32{0x02b9c325, 0x0159ce24, 0x02d342da, 0x00d4ba51, 0x00f3601c, 0x0305d3bf, 0x00aa4362, 0x01a5c80b, 0x023630da, 0x0005867a}}, Y: Field{[10]uint32{0x030e881e, 0x029cbe43, 0x02de4b98, 0x025e471f, 0x03a1c126, 0x01237b5e, 0x0188dd61, 0x019e7a9b, 0x000e13b8, 0x0008ab45}}}, + {X: Field{[10]uint32{0x034d3032, 0x02f4e634, 0x034c6365, 0x02ead941, 0x0064d589, 0x00c0be2b, 0x01409a8a, 0x02fed273, 0x003818de, 0x000877f7}}, Y: Field{[10]uint32{0x004099a9, 0x02c5f39e, 0x01c4579e, 0x00f885c9, 0x02106d19, 0x02d809b9, 0x006ddcdb, 0x0148129e, 0x02c20e83, 0x002eef9f}}}, + {X: Field{[10]uint32{0x01069fe1, 0x036f5021, 0x01bd1c0d, 0x00b82eec, 0x03036a47, 0x00b3383b, 0x02e99aa1, 0x006acb2e, 0x01dd802f, 0x00183ef9}}, Y: Field{[10]uint32{0x03349dc3, 0x02f94929, 0x013167f9, 0x02cade2c, 0x0399feb1, 0x015023c2, 0x03d07a68, 0x00135a0b, 0x03592dd3, 0x0003aa0e}}}, + {X: Field{[10]uint32{0x02147f96, 0x019db307, 0x0066ae29, 0x01e53712, 0x03dd7c24, 0x01650174, 0x008ee975, 0x0316eea1, 0x0065fdcd, 0x0032012d}}, Y: Field{[10]uint32{0x03adc5a2, 0x03bbbc96, 0x035223a7, 0x028b3e6e, 0x03fb10cc, 0x02e0a393, 0x02bf43a9, 0x00adc3af, 0x02b71fd8, 0x002a928b}}}, + {X: Field{[10]uint32{0x010336d9, 0x03674f75, 0x03b7bd96, 0x02ecc64b, 0x005c74cf, 0x030cbdb0, 0x011b3383, 0x00ed5771, 0x03e55137, 0x001de9b8}}, Y: Field{[10]uint32{0x006f047f, 0x0162dac3, 0x032b67d3, 0x01b8e15b, 0x035de35d, 0x03ff355c, 0x02075c10, 0x02b1c523, 0x026e86ef, 0x0008748c}}}, + {X: Field{[10]uint32{0x015f7a5a, 0x00758b43, 0x018c9473, 0x033d938f, 0x01a89d82, 0x01a93b19, 0x02706ff2, 0x03bb4999, 0x01874a72, 0x0021b770}}, Y: Field{[10]uint32{0x030cc29c, 0x03396ad3, 0x0295c443, 0x01781337, 0x0340507b, 0x028f9b72, 0x0217816b, 0x02848ea4, 0x0040ce45, 0x00147df3}}}, + {X: Field{[10]uint32{0x03d3beca, 0x025bcff1, 0x028ce4a5, 0x03be13a8, 0x038c80d5, 0x005578c9, 0x0108675a, 0x03ab11b0, 0x00f8db8e, 0x0033d274}}, Y: Field{[10]uint32{0x020086fc, 0x02e5b7d0, 0x02d41235, 0x02970c51, 0x007cdd64, 0x0186475a, 0x002dcd6a, 0x01d70fb6, 0x0341ebae, 0x001bff71}}}, + {X: Field{[10]uint32{0x035875f4, 0x0232d52d, 0x00381051, 0x01457f86, 0x00c9f5c8, 0x03849b3b, 0x020e8721, 0x019c88b5, 0x038957eb, 0x00075d7b}}, Y: Field{[10]uint32{0x038dbdb4, 0x027719ad, 0x033e37b9, 0x0095dd96, 0x01c20766, 0x03e8750a, 0x024ae2f5, 0x0158776f, 0x03dd9288, 0x0020b177}}}, + {X: Field{[10]uint32{0x03ad0689, 0x00b2a279, 0x036dca29, 0x038f1b76, 0x005bb5b7, 0x02540cd2, 0x00d94666, 0x01848a76, 0x0335f62e, 0x002fa92d}}, Y: Field{[10]uint32{0x03a08901, 0x0082b4c1, 0x0011cd8e, 0x00dbd4a8, 0x027cda58, 0x02df007c, 0x019a4517, 0x0278439f, 0x038a08ea, 0x002438c9}}}, + {X: Field{[10]uint32{0x0169f2bb, 0x00e5aa58, 0x037281af, 0x03c2ceb2, 0x02577f5c, 0x01756627, 0x010aaa27, 0x0145c063, 0x02dea90e, 0x003a16c2}}, Y: Field{[10]uint32{0x0250aaa8, 0x01fd6679, 0x03358066, 0x01a75020, 0x0230ef12, 0x015edfd6, 0x016fec57, 0x01d718e4, 0x00cd3ca1, 0x00350a5c}}}, + {X: Field{[10]uint32{0x03928934, 0x0390b628, 0x00f5e3ff, 0x0213008a, 0x0082ca55, 0x033df30b, 0x01ed550f, 0x00149b90, 0x02dd2405, 0x00365d64}}, Y: Field{[10]uint32{0x022d102e, 0x013713bf, 0x0126a217, 0x01149bcb, 0x024de0db, 0x0008dbd3, 0x01a3852a, 0x0070edd6, 0x01696bf0, 0x003ab1b0}}}, + {X: Field{[10]uint32{0x026e00e7, 0x00d7b859, 0x013ebedd, 0x01d56bad, 0x00fd7725, 0x023195de, 0x00e60a9a, 0x008388de, 0x02a450b6, 0x0003808f}}, Y: Field{[10]uint32{0x0094797e, 0x0198d4da, 0x01e306a9, 0x01338df8, 0x026bdd54, 0x02457d41, 0x020f0e78, 0x033e26c1, 0x00506dbd, 0x001393b6}}}, + {X: Field{[10]uint32{0x01935e5a, 0x0013b083, 0x01c9cc83, 0x00b70c0b, 0x02a7c0ec, 0x01aa15ef, 0x001b9f7e, 0x03f5ba96, 0x00955cd4, 0x001856d7}}, Y: Field{[10]uint32{0x015f4d46, 0x0086c53f, 0x038d36e4, 0x01d3cda9, 0x0146fc80, 0x0175d536, 0x01845bff, 0x00c96ef3, 0x03662602, 0x00308871}}}, + {X: Field{[10]uint32{0x02ec13a7, 0x031cd625, 0x0185bc2c, 0x02168012, 0x03fa2a0d, 0x004e46f6, 0x00e34d60, 0x008086e7, 0x003402e1, 0x002c77e9}}, Y: Field{[10]uint32{0x0348438e, 0x00fbd665, 0x03eadd10, 0x03316264, 0x0013c2a5, 0x01be062d, 0x03b7e9b0, 0x03e0a076, 0x015a8162, 0x003e8f44}}}, + {X: Field{[10]uint32{0x03eada7c, 0x028f272e, 0x0097436b, 0x02acc966, 0x0068c7e1, 0x0393b372, 0x0275b835, 0x011ff6b1, 0x001fafbe, 0x002d92d8}}, Y: Field{[10]uint32{0x01dbe68d, 0x0148dd3a, 0x007d85ea, 0x00355cd2, 0x02652ae9, 0x018b6f26, 0x03606624, 0x015d1bfa, 0x0039d231, 0x002bde30}}}, + {X: Field{[10]uint32{0x03b579cf, 0x03cc991a, 0x013364a0, 0x008d49c5, 0x01b0981f, 0x02535d59, 0x01027d4e, 0x036721b1, 0x0346fda1, 0x00150a74}}, Y: Field{[10]uint32{0x015b1880, 0x025a8ca6, 0x00f37ac6, 0x01654519, 0x02162d66, 0x035d18db, 0x00754dd2, 0x0364b8e4, 0x0197dfec, 0x0016e338}}}, + {X: Field{[10]uint32{0x026f005b, 0x0152c58a, 0x03f94ff9, 0x01a7cde1, 0x0020e216, 0x00105d27, 0x000bb781, 0x019c62c1, 0x00f2056d, 0x002241a5}}, Y: Field{[10]uint32{0x01753341, 0x0070504b, 0x00df35df, 0x02dcc6e5, 0x007bf505, 0x01abf43e, 0x010d7b22, 0x02eff2ee, 0x034a890d, 0x003659a4}}}, + {X: Field{[10]uint32{0x003cc117, 0x00b0ad9d, 0x0067ccb9, 0x0079128a, 0x00269b5d, 0x03f81832, 0x02987a05, 0x009adfe9, 0x0292cd05, 0x000eb9d4}}, Y: Field{[10]uint32{0x02416a94, 0x028b757c, 0x02871d22, 0x03a61ee0, 0x00f004ee, 0x00cc95af, 0x03d5416a, 0x02a0b63d, 0x00c15a74, 0x00042567}}}, + {X: Field{[10]uint32{0x019b0707, 0x01771fca, 0x03ce93bb, 0x037a292a, 0x01347bba, 0x006e7e87, 0x0353fd5f, 0x01f55568, 0x029bff71, 0x00275d16}}, Y: Field{[10]uint32{0x02de8134, 0x030a399f, 0x0369b0ba, 0x03feb783, 0x0210461c, 0x039cd379, 0x004f615a, 0x031831cc, 0x00aed513, 0x0033bcce}}}, + {X: Field{[10]uint32{0x0144f166, 0x02e54674, 0x009f0aaa, 0x02599214, 0x00abf1b8, 0x0248b018, 0x01ce7f4f, 0x0324e441, 0x002c8130, 0x001a67a7}}, Y: Field{[10]uint32{0x003a19cd, 0x028e7b5f, 0x004a438d, 0x00a65f49, 0x01bfb7da, 0x00e0275a, 0x01145838, 0x03e51257, 0x010e1fb9, 0x00220ad2}}}, + {X: Field{[10]uint32{0x01591f87, 0x012869e1, 0x03550388, 0x02953d0c, 0x00ae79b4, 0x032ff8a6, 0x01ea704b, 0x001426a4, 0x00c1dc52, 0x0038e807}}, Y: Field{[10]uint32{0x02dcc64e, 0x005ff507, 0x00b96066, 0x0244dd24, 0x012480a8, 0x0376bd25, 0x0287e546, 0x02755ff2, 0x01f368d1, 0x003cf190}}}, + {X: Field{[10]uint32{0x02c433d1, 0x03b8e35a, 0x035f1ee5, 0x039bf63f, 0x00cc7cce, 0x01126145, 0x01d23623, 0x00dd751b, 0x01c3d9df, 0x00174543}}, Y: Field{[10]uint32{0x02ab0316, 0x00c5bad4, 0x00061a32, 0x03fafeb7, 0x02399a83, 0x02100424, 0x000263f1, 0x03a839f6, 0x0250d2e2, 0x000b0244}}}, + {X: Field{[10]uint32{0x00996a66, 0x003170b8, 0x02b16c10, 0x0201629b, 0x00ec4778, 0x038047e0, 0x00aea5b5, 0x02e8fd91, 0x0361bb12, 0x00127ee5}}, Y: Field{[10]uint32{0x0255e23c, 0x033f41b5, 0x00370089, 0x006e4a5e, 0x00d9086b, 0x00595317, 0x0099caf2, 0x02245161, 0x020fb720, 0x001c4d08}}}, + {X: Field{[10]uint32{0x0244738e, 0x0032514a, 0x03b13d53, 0x01687d3d, 0x00bdea05, 0x02b73770, 0x03990211, 0x00b7ef79, 0x02b3a451, 0x000d3157}}, Y: Field{[10]uint32{0x0398fd16, 0x02693153, 0x021f2ba3, 0x0254c8cc, 0x010fdbb6, 0x00325e79, 0x0110e26d, 0x01007e6a, 0x0288beff, 0x00096331}}}, + {X: Field{[10]uint32{0x00a3a98c, 0x0023508c, 0x0202ab25, 0x03c8c371, 0x039b1c39, 0x02bc3272, 0x037b82c2, 0x03f8013f, 0x00f07c3e, 0x001c1a3f}}, Y: Field{[10]uint32{0x037ef1fc, 0x02c65eb8, 0x01d77aaa, 0x01e5f8b8, 0x012fe506, 0x000ad77d, 0x03657bf2, 0x01e314b9, 0x00d88445, 0x003921cc}}}, + {X: Field{[10]uint32{0x03355a1e, 0x02e1d3da, 0x01909f73, 0x01528ac0, 0x02f49e52, 0x03a38d1b, 0x03a1f95a, 0x02aa844a, 0x0110a987, 0x00038762}}, Y: Field{[10]uint32{0x03e3cdb8, 0x02ae41c3, 0x00235d7b, 0x008282e4, 0x01d4a56a, 0x03f57167, 0x01c2c149, 0x011f6266, 0x011bcc49, 0x0022b40c}}}, + {X: Field{[10]uint32{0x02d2caf2, 0x02b0f2dc, 0x03d57c10, 0x0363b536, 0x006bdf06, 0x01837d17, 0x02c6b2dc, 0x018c6c05, 0x03880ba8, 0x00249426}}, Y: Field{[10]uint32{0x006a3ccf, 0x022bd61d, 0x038c3397, 0x00ccd776, 0x01ee6f0f, 0x0257c504, 0x0395651b, 0x018a66a7, 0x0231633b, 0x000fa91e}}}, + {X: Field{[10]uint32{0x0266a519, 0x00d5ab06, 0x0351206a, 0x0078d371, 0x01644647, 0x02df4a69, 0x02ec994d, 0x0017a65a, 0x002ae8d5, 0x00243f50}}, Y: Field{[10]uint32{0x02da3b6b, 0x0162e96e, 0x02a62e19, 0x01611aaa, 0x039a6dc6, 0x0313c399, 0x0231816e, 0x00db82b6, 0x03f7bcdc, 0x0001a303}}}, + {X: Field{[10]uint32{0x01400704, 0x024367ea, 0x005f5eb3, 0x01fc319b, 0x0004cbc7, 0x0104ac4a, 0x035b0ddd, 0x032a3878, 0x02cb7d9b, 0x0002ce03}}, Y: Field{[10]uint32{0x006a01a4, 0x03d14321, 0x038a7d78, 0x036f87d7, 0x0118fa71, 0x00a75573, 0x01f69a72, 0x02de0c27, 0x009277d9, 0x003f4a88}}}, + {X: Field{[10]uint32{0x02b83f0c, 0x03bdec0c, 0x027520d3, 0x03bf33ca, 0x03f3d029, 0x01852495, 0x0066140b, 0x02db3dbe, 0x0041aecb, 0x001038b8}}, Y: Field{[10]uint32{0x002291f0, 0x01d131af, 0x01326704, 0x01063949, 0x01e1eda6, 0x005fc8ca, 0x02266794, 0x02223d53, 0x00a53c83, 0x000489c4}}}, + {X: Field{[10]uint32{0x02a03583, 0x03082a2a, 0x009c8c99, 0x02e7dded, 0x037d254e, 0x02bab33a, 0x013a38e9, 0x00c324e2, 0x03c43f4e, 0x00239827}}, Y: Field{[10]uint32{0x02c1a3e8, 0x028f70de, 0x0296d066, 0x01ec3835, 0x00837fb5, 0x0075c0de, 0x0259a86b, 0x005411fc, 0x006e9a82, 0x00251f13}}}, + {X: Field{[10]uint32{0x0035f5ce, 0x03020d7d, 0x020bb2ec, 0x00914bf3, 0x038d9c93, 0x02be26a3, 0x0098d001, 0x027f441a, 0x01b22bfe, 0x002e1c71}}, Y: Field{[10]uint32{0x031d3078, 0x015bc9a3, 0x00b64cd6, 0x03b80018, 0x03507fe8, 0x03c0e000, 0x007226b6, 0x003ba67e, 0x01a3ecbd, 0x0038c0b9}}}, + {X: Field{[10]uint32{0x00841682, 0x001f3554, 0x03f832ac, 0x015f33a1, 0x01c6f80f, 0x01bffd35, 0x01241709, 0x02246aed, 0x027e039e, 0x00149b6a}}, Y: Field{[10]uint32{0x03d210df, 0x0169552c, 0x01f43c5f, 0x02733171, 0x00c477bc, 0x02b503da, 0x00fd3975, 0x004c39d6, 0x00994fb7, 0x001a7c11}}}, + {X: Field{[10]uint32{0x021ad25a, 0x004be521, 0x01ba2edc, 0x01462b76, 0x015c031f, 0x03ed9be8, 0x027cc073, 0x00c15f39, 0x004a514e, 0x00305709}}, Y: Field{[10]uint32{0x02846c50, 0x00e5661c, 0x01b901ba, 0x037d72c1, 0x0016449d, 0x02f26a3f, 0x0234780b, 0x03225e37, 0x01acecc3, 0x0036c408}}}, + {X: Field{[10]uint32{0x02c1d388, 0x00d05cfa, 0x033443e2, 0x01db36df, 0x01d34948, 0x00374f71, 0x03638735, 0x000e36ce, 0x0319466a, 0x000df882}}, Y: Field{[10]uint32{0x003b89f0, 0x023bd8ff, 0x00f252d6, 0x01e7da7b, 0x025ea5bb, 0x036d5eae, 0x02bcfa27, 0x01078bb2, 0x02245465, 0x00002e02}}}, + {X: Field{[10]uint32{0x024ea528, 0x02393ed5, 0x01eabc59, 0x03241ffd, 0x016a0da5, 0x015e5629, 0x011cd81f, 0x00050acc, 0x0328feae, 0x001b4247}}, Y: Field{[10]uint32{0x01d07906, 0x00a418ff, 0x0274c27c, 0x01f16a2e, 0x026e9d9f, 0x03217748, 0x01897196, 0x029b04e0, 0x03f04d7e, 0x00122f25}}}, + {X: Field{[10]uint32{0x0354fd71, 0x018d782e, 0x008d35ca, 0x0334fb75, 0x02d3e545, 0x020676ff, 0x001664fb, 0x03ed5bb4, 0x0016a76e, 0x000ef6f5}}, Y: Field{[10]uint32{0x00eb0639, 0x03cdbd4b, 0x00d26a6b, 0x024e0ae6, 0x039a63a8, 0x007eeb63, 0x03016219, 0x0094ffbc, 0x01723ed7, 0x0029a553}}}, + {X: Field{[10]uint32{0x029d61ce, 0x022cb91f, 0x01237401, 0x0103661c, 0x00c41095, 0x02f0cfbc, 0x005d41a4, 0x02d57e30, 0x02a9f111, 0x0033538d}}, Y: Field{[10]uint32{0x014e3e57, 0x03188551, 0x02ddadf0, 0x02f09939, 0x03abded9, 0x014b7e01, 0x02f95ec4, 0x00b9a41b, 0x02165263, 0x0011e37e}}}, + {X: Field{[10]uint32{0x01f24efd, 0x02a7c44b, 0x031c6272, 0x01c4b9df, 0x02248457, 0x01c2b19f, 0x03214131, 0x027038ef, 0x004a09c5, 0x0003c8f3}}, Y: Field{[10]uint32{0x037fa4b2, 0x0179f715, 0x013da9ed, 0x0339d28f, 0x02dc71cd, 0x00bde919, 0x0358fc07, 0x03bff573, 0x007299b6, 0x003a4cef}}}, + {X: Field{[10]uint32{0x013c33e0, 0x01a56b7b, 0x0098931a, 0x01250d75, 0x0300d7a3, 0x02db6d88, 0x0046840c, 0x03acd6da, 0x01858c97, 0x00366319}}, Y: Field{[10]uint32{0x03114990, 0x02e18b78, 0x02eb2a85, 0x0068593c, 0x01ba1378, 0x00189ce5, 0x02c953c7, 0x020977ad, 0x0224ffe8, 0x00110ffa}}}, + {X: Field{[10]uint32{0x00744225, 0x01b99adb, 0x0085fa94, 0x03728924, 0x0165325d, 0x031d2a6f, 0x012b9d16, 0x036b86db, 0x02a6c055, 0x00089a76}}, Y: Field{[10]uint32{0x01bfb3dd, 0x00b726fd, 0x03dee235, 0x03ceed1f, 0x0130e14f, 0x010bbf73, 0x00f0fe6a, 0x00115ac2, 0x01f9a61f, 0x00056740}}}, + {X: Field{[10]uint32{0x027c48d5, 0x010300c5, 0x03ba4877, 0x02d08eb9, 0x01eb4d75, 0x011ac06b, 0x023880a5, 0x021e4a37, 0x00fd8eea, 0x000cd411}}, Y: Field{[10]uint32{0x02da1cc1, 0x01e8c273, 0x00226818, 0x027398f6, 0x000cfe1d, 0x015ecefa, 0x030f2bb7, 0x01aef18e, 0x03f52626, 0x001a7940}}}, + {X: Field{[10]uint32{0x03f6c512, 0x0317e68f, 0x03a5046b, 0x026d8dea, 0x01a601da, 0x01ef2b9d, 0x00ee87b0, 0x02a0f953, 0x023d86f9, 0x003b9e89}}, Y: Field{[10]uint32{0x01373d56, 0x020a4250, 0x00f6042d, 0x020c587e, 0x01222714, 0x01039d8d, 0x008ac1c8, 0x01a3a48e, 0x01922032, 0x0027f74c}}}, + {X: Field{[10]uint32{0x03f44245, 0x03975694, 0x02d976c5, 0x0111d9a8, 0x00bf95f3, 0x03d12a22, 0x03b6111e, 0x018c6db1, 0x03b336f1, 0x0014a6cc}}, Y: Field{[10]uint32{0x02061099, 0x002a15fa, 0x030004cf, 0x03ba7335, 0x036f29f9, 0x00a00927, 0x02bc1a03, 0x01bd28be, 0x010693da, 0x0004a158}}}, + {X: Field{[10]uint32{0x03df1849, 0x00f3596a, 0x0243dd3e, 0x014e3af4, 0x006a2513, 0x035956a2, 0x01337182, 0x03a7d46a, 0x006da6ce, 0x003caccd}}, Y: Field{[10]uint32{0x03b77da3, 0x00ec3ddd, 0x032e1f48, 0x032cc937, 0x0355aaef, 0x03d89e34, 0x00665262, 0x000ffa7a, 0x0228be77, 0x0035077d}}}, + {X: Field{[10]uint32{0x0182befa, 0x0166dc11, 0x0037b3f5, 0x00a88bce, 0x011db7a1, 0x0358e31f, 0x0103d045, 0x026319c3, 0x01bcf03d, 0x0014d7a7}}, Y: Field{[10]uint32{0x02358392, 0x0307d967, 0x024e740b, 0x01853d93, 0x0262ea47, 0x01fe0e12, 0x00fa98d6, 0x025f16f5, 0x0228bad8, 0x000b08cc}}}, + {X: Field{[10]uint32{0x0299a7f1, 0x00ed282c, 0x03970825, 0x01e2140c, 0x00b019bf, 0x03fcd189, 0x023172dd, 0x01ab197b, 0x008b70da, 0x00304c5a}}, Y: Field{[10]uint32{0x00e5f3cc, 0x01e14677, 0x00d207dd, 0x03fc22e1, 0x000d6e1a, 0x027e65be, 0x0211d82e, 0x012365a6, 0x03b6e0e7, 0x003fbc61}}}, + {X: Field{[10]uint32{0x014d3ba9, 0x01c6c85d, 0x02a645dc, 0x003261c9, 0x02a984d0, 0x029afe0c, 0x00eddf3d, 0x01e61443, 0x00d3f7ab, 0x001d7721}}, Y: Field{[10]uint32{0x03841c50, 0x02c8cab8, 0x02183af5, 0x03ac770a, 0x0384f62d, 0x00bbaa94, 0x005e4d28, 0x001244b3, 0x01f35e11, 0x003d767b}}}, + {X: Field{[10]uint32{0x032a36c5, 0x011fb53c, 0x00648788, 0x035dbe63, 0x0282c6da, 0x01717f54, 0x03273102, 0x030e3ab9, 0x03bc9136, 0x00164771}}, Y: Field{[10]uint32{0x03a421a0, 0x025c9a35, 0x00233953, 0x02dc8751, 0x008d4875, 0x032db17a, 0x003aabb4, 0x034e0b80, 0x00c4f81c, 0x003f33e9}}}, + {X: Field{[10]uint32{0x02712596, 0x01d4f384, 0x00f0fb14, 0x02d93162, 0x02d2c78d, 0x021eb3de, 0x0148fadb, 0x024aeb9d, 0x00892a83, 0x0020e967}}, Y: Field{[10]uint32{0x03c5873b, 0x0140c339, 0x0119be3e, 0x038c573e, 0x0046f090, 0x0208bfcf, 0x027c5988, 0x00819435, 0x001a33b1, 0x001f402b}}}, + {X: Field{[10]uint32{0x026f6f83, 0x024f8b2e, 0x03fc76ca, 0x01a3b116, 0x036608f9, 0x018e47bf, 0x001b8c37, 0x02cbd2a7, 0x03a58c52, 0x003a6c37}}, Y: Field{[10]uint32{0x020a7c8d, 0x02d77bcb, 0x01be2e5c, 0x00e69e02, 0x035c1f08, 0x03acfcfe, 0x0089124f, 0x0378349d, 0x028d5846, 0x0019126c}}}, + {X: Field{[10]uint32{0x032bc03b, 0x0269942d, 0x02f81b1b, 0x01435569, 0x00c76adf, 0x00e8f497, 0x011c002d, 0x02430f45, 0x02f967b0, 0x00005b34}}, Y: Field{[10]uint32{0x02d63a7b, 0x03f931a2, 0x0206f50f, 0x013e123b, 0x03a23db7, 0x035e1162, 0x00cc091b, 0x01c240e7, 0x001e2fe7, 0x00316498}}}, + {X: Field{[10]uint32{0x02ff1cbe, 0x0128e28e, 0x026b6f58, 0x02e9ec61, 0x01d80b8d, 0x0135b97d, 0x023d9e24, 0x038d8da7, 0x03fd1bcd, 0x003cd1f4}}, Y: Field{[10]uint32{0x0287977a, 0x0313491f, 0x03a9766d, 0x02045613, 0x00c7349f, 0x0190497a, 0x01cfc6d0, 0x02284e63, 0x02b90ae3, 0x000710d6}}}, + {X: Field{[10]uint32{0x02428b1b, 0x00dd33f6, 0x0126d534, 0x034ad3a6, 0x01f349ed, 0x01248551, 0x0049f113, 0x02153243, 0x0187d644, 0x0016c643}}, Y: Field{[10]uint32{0x025401f3, 0x0325efbe, 0x03ea856b, 0x01dac9c4, 0x039c1d31, 0x0174b055, 0x013ab256, 0x035aed72, 0x00c363ef, 0x002293ab}}}, + {X: Field{[10]uint32{0x0030834f, 0x03d9f587, 0x003ab105, 0x03cdddcb, 0x01c49e78, 0x02f32b2b, 0x01e96650, 0x0133a3c8, 0x00b2d731, 0x0029de1b}}, Y: Field{[10]uint32{0x01441953, 0x025af52a, 0x0237146e, 0x006e817d, 0x006c4ea7, 0x02dc2ff0, 0x031f911c, 0x00b8fcbe, 0x00d41898, 0x0013f1eb}}}, + {X: Field{[10]uint32{0x03bf33cb, 0x02807ecb, 0x01dcf545, 0x009bc1cf, 0x02abf74d, 0x003bcd85, 0x01faeddc, 0x00686231, 0x0353e907, 0x0034d953}}, Y: Field{[10]uint32{0x032f4383, 0x03c40ed0, 0x00de1880, 0x03649b0f, 0x0377c7a3, 0x0129c5bc, 0x038502fc, 0x000e5165, 0x00c7213c, 0x00295bc8}}}, + {X: Field{[10]uint32{0x0022399c, 0x00e6a4de, 0x00994020, 0x01d83ba2, 0x0127d031, 0x02db6d33, 0x01d8ac3b, 0x032f681a, 0x0287400a, 0x003844e2}}, Y: Field{[10]uint32{0x03a162c1, 0x0259f544, 0x0012c9ce, 0x02543d78, 0x001803cd, 0x01a14f90, 0x0240de6b, 0x01b51971, 0x03bfdd3f, 0x003ca6a3}}}, + {X: Field{[10]uint32{0x02317708, 0x02b26561, 0x007e7374, 0x0039daee, 0x02571473, 0x03272a54, 0x03c49c69, 0x03d3942c, 0x023c91c0, 0x0034a7ad}}, Y: Field{[10]uint32{0x02a5f1a1, 0x02bfd87f, 0x03dd9d73, 0x027c72cf, 0x02d9d38c, 0x0215b79a, 0x022ab4ac, 0x02029674, 0x03024e91, 0x0012b64d}}}, + {X: Field{[10]uint32{0x02ee49f8, 0x022d2089, 0x03147ca4, 0x00c34637, 0x03d2124b, 0x022e3b2c, 0x0177da1d, 0x01ff5c19, 0x03baa671, 0x002a7500}}, Y: Field{[10]uint32{0x02d5323b, 0x005dadc9, 0x0133ff45, 0x027b6dd0, 0x0056f1e4, 0x02564451, 0x0137bcad, 0x0387b942, 0x027a8c5e, 0x0007bb7f}}}, + {X: Field{[10]uint32{0x02f57528, 0x01daf427, 0x01e39ca0, 0x018e6390, 0x018d8f37, 0x004b6272, 0x02c6bfd1, 0x00156bba, 0x00e8dbb6, 0x003fded6}}, Y: Field{[10]uint32{0x00381121, 0x034942bf, 0x02ee6cf5, 0x03d6f506, 0x018e39f1, 0x00db01a1, 0x02cb57c8, 0x01479c35, 0x01d1ad7a, 0x0013938e}}}, + {X: Field{[10]uint32{0x01362979, 0x02ebf46f, 0x016131e7, 0x007559bd, 0x021672ea, 0x038bc51b, 0x036db234, 0x027d8786, 0x029df783, 0x0010f142}}, Y: Field{[10]uint32{0x03f449ae, 0x029d3aa0, 0x03bd61ad, 0x0217d833, 0x001e2158, 0x02781486, 0x03e908f6, 0x006a2ea0, 0x02988154, 0x003c83f6}}}, + {X: Field{[10]uint32{0x034ac30c, 0x00fc89c5, 0x03e53984, 0x0354a74e, 0x035803a9, 0x02f9b410, 0x0262ae16, 0x004a61d5, 0x01b701c9, 0x003d822a}}, Y: Field{[10]uint32{0x027ad5bf, 0x03121a8c, 0x008f2083, 0x019b5ed4, 0x01d788d2, 0x004eed59, 0x02d32434, 0x0375086e, 0x00fae919, 0x0017bcd9}}}, + {X: Field{[10]uint32{0x005a117e, 0x004cc9d1, 0x02d568d0, 0x00881736, 0x033cc117, 0x03099d95, 0x03c48d00, 0x03c10fe6, 0x0029dd1e, 0x003244f8}}, Y: Field{[10]uint32{0x01a83049, 0x02169406, 0x02d8bace, 0x00610f89, 0x0032a38f, 0x00d49a81, 0x01cf07c1, 0x032ecdef, 0x030b9c31, 0x0025d5cf}}}, + {X: Field{[10]uint32{0x02a7d728, 0x03715720, 0x0363cce7, 0x02c4d20b, 0x0361318b, 0x0332a11f, 0x000c58a0, 0x01ef059b, 0x009db17e, 0x002ab831}}, Y: Field{[10]uint32{0x006be0b8, 0x0398ddd7, 0x012516a7, 0x03fe7576, 0x02810396, 0x01633703, 0x0051aae6, 0x00f6b088, 0x03f3f68c, 0x001045c2}}}, + {X: Field{[10]uint32{0x03c846c8, 0x02a8e23a, 0x02c96d35, 0x02d7af16, 0x01e306c8, 0x03792817, 0x039b15e3, 0x02d88966, 0x031f45a0, 0x003ca017}}, Y: Field{[10]uint32{0x038d1267, 0x027421da, 0x01dc9978, 0x00709902, 0x00b36e20, 0x0244be8e, 0x0325cdd0, 0x01c9115d, 0x03396ba3, 0x003d75c9}}}, + {X: Field{[10]uint32{0x00fa4f39, 0x029ea400, 0x030d87b0, 0x00e9e049, 0x00f7d232, 0x01f61968, 0x0230e593, 0x0344b928, 0x00e6e150, 0x001a5a79}}, Y: Field{[10]uint32{0x0214de3a, 0x02dc61d7, 0x02f888da, 0x036eab85, 0x03e030a0, 0x01657727, 0x037ebe08, 0x03b430f9, 0x03d6d323, 0x0031c70c}}}, + {X: Field{[10]uint32{0x01988f3e, 0x03bc0e63, 0x003e3e4c, 0x00e90465, 0x022aa064, 0x021cb7ef, 0x00fbdb8e, 0x0095eaf9, 0x03f07a0e, 0x0002bb0a}}, Y: Field{[10]uint32{0x00c931d0, 0x00755172, 0x01df6ef2, 0x0289c936, 0x00bcc3b6, 0x03fc2a0c, 0x00bc528f, 0x030e0321, 0x0157e686, 0x00363a7d}}}, + {X: Field{[10]uint32{0x0126f710, 0x0090ef52, 0x033226bb, 0x0071e42f, 0x01198f56, 0x02764775, 0x002890b6, 0x030d7294, 0x019a13df, 0x00271bfe}}, Y: Field{[10]uint32{0x03ef849d, 0x020d00fd, 0x0311e9b6, 0x018cd08a, 0x012f7f4e, 0x03fd1a0e, 0x008f5411, 0x03d6b676, 0x020c84a4, 0x000abbe4}}}, + {X: Field{[10]uint32{0x02d7f1c2, 0x0239b825, 0x00aefafb, 0x03b2d776, 0x02ade75a, 0x03bb7994, 0x00246d67, 0x0388e37c, 0x005b37a5, 0x003e90dd}}, Y: Field{[10]uint32{0x018689b1, 0x013a0b6a, 0x01eaddc4, 0x03e167fa, 0x0248aba7, 0x03be4e7b, 0x013c8f3f, 0x019500de, 0x02a42a3c, 0x0037e756}}}, + {X: Field{[10]uint32{0x038d46b9, 0x010f76a9, 0x00741276, 0x01396196, 0x020ce3b7, 0x039ddfe5, 0x03b84d09, 0x009b1fac, 0x02886c4e, 0x001a528c}}, Y: Field{[10]uint32{0x03dfe67a, 0x01aa7862, 0x018b0144, 0x00cb2c4c, 0x02a700d9, 0x0248b316, 0x00909be0, 0x011795ba, 0x006d0076, 0x0029535b}}}, + {X: Field{[10]uint32{0x008f38a0, 0x02b45eb0, 0x02be43d4, 0x0081f31c, 0x01930fe9, 0x00498843, 0x00339a2b, 0x01aca2d3, 0x01975be0, 0x00195265}}, Y: Field{[10]uint32{0x02f7900c, 0x01110fdc, 0x02be1c68, 0x02c22cd6, 0x03d29fe8, 0x02078fd6, 0x02cd92ce, 0x03738cb4, 0x03bb467f, 0x002f7b88}}}, + {X: Field{[10]uint32{0x0399f0bd, 0x00266c01, 0x00137400, 0x02ca6c42, 0x000ea38e, 0x020ebb11, 0x014f0844, 0x005392df, 0x00f675bb, 0x000de472}}, Y: Field{[10]uint32{0x02f7bc76, 0x013a463b, 0x0316d15a, 0x01170c72, 0x018b2a3f, 0x02fb97b9, 0x0396ddbc, 0x017adbce, 0x034ada5e, 0x000b723d}}}, + {X: Field{[10]uint32{0x02f31364, 0x0106a31b, 0x018ed429, 0x01e864e7, 0x0359795c, 0x02b3da90, 0x00469360, 0x0243a7a4, 0x0065eaf8, 0x00357904}}, Y: Field{[10]uint32{0x025bbcad, 0x0055b2fd, 0x03f6d21f, 0x032c341b, 0x00bd2f30, 0x00b930cb, 0x03bb6b8f, 0x03f539ea, 0x00c8a559, 0x000647b1}}}, + {X: Field{[10]uint32{0x00970dec, 0x02b5940b, 0x03ae8b77, 0x03cbaaa8, 0x01e504e6, 0x008162e6, 0x0229acb6, 0x010134a2, 0x0280fa0b, 0x0005b388}}, Y: Field{[10]uint32{0x02efb09b, 0x012e0755, 0x029b8817, 0x0179fe5b, 0x00b6eaec, 0x01d39643, 0x00bc2520, 0x0376e795, 0x03f4486a, 0x000f51a0}}}, + {X: Field{[10]uint32{0x02107d07, 0x00ed4071, 0x030160bf, 0x01fb5f51, 0x03e08f99, 0x005a106d, 0x025b4478, 0x02c7ce43, 0x03306cdf, 0x0029ac2a}}, Y: Field{[10]uint32{0x000abf7a, 0x02692daa, 0x0258d9cb, 0x0392843d, 0x03094e96, 0x01caaf26, 0x02d337fd, 0x009e524b, 0x002fb67e, 0x000a98a1}}}, + {X: Field{[10]uint32{0x02033583, 0x00018a15, 0x02d9021e, 0x022a3fda, 0x0252b9d0, 0x01c27cdd, 0x00b779cd, 0x00c82c87, 0x0138760b, 0x0035f29b}}, Y: Field{[10]uint32{0x009e7bb5, 0x01cbffe1, 0x01b046d6, 0x03ea660b, 0x015e2d1c, 0x00500586, 0x011b6cbb, 0x0166e5ae, 0x0372866d, 0x0035b017}}}, + {X: Field{[10]uint32{0x01609d33, 0x01b2d17d, 0x03ef375f, 0x01758682, 0x03e16240, 0x004871cf, 0x00cb1347, 0x01c1f9ce, 0x01632d3f, 0x001e2ac1}}, Y: Field{[10]uint32{0x0275a6b0, 0x013b17fb, 0x034f2109, 0x012557ed, 0x00350eba, 0x02ea9714, 0x03a4b424, 0x032d3ca5, 0x010c10c7, 0x003f868e}}}, + {X: Field{[10]uint32{0x000d6f04, 0x001cb146, 0x01879bd1, 0x00a0a24d, 0x01218e21, 0x003923f6, 0x01fc5a96, 0x03a00c19, 0x013a5b9f, 0x003014d5}}, Y: Field{[10]uint32{0x02719192, 0x0221a68f, 0x008a4752, 0x03714730, 0x027d0d28, 0x01ef8a00, 0x01c45cf5, 0x02ac1384, 0x0374214d, 0x00380b69}}}, + {X: Field{[10]uint32{0x03f02d03, 0x0357af48, 0x01b4eb65, 0x025604e1, 0x035faf8e, 0x003f07ec, 0x018d4033, 0x02570fbe, 0x0313e2a9, 0x002fe175}}, Y: Field{[10]uint32{0x03e59b18, 0x0101d22c, 0x00bbd6b9, 0x025a20a1, 0x03dcb68e, 0x00777481, 0x0142a6f2, 0x02c386a1, 0x014758d7, 0x00297516}}}, + {X: Field{[10]uint32{0x01bd280a, 0x01343c40, 0x0031d69a, 0x00167954, 0x00138169, 0x02c2bbb0, 0x022ee0de, 0x01e2e03f, 0x02c92be5, 0x003edced}}, Y: Field{[10]uint32{0x0214cd16, 0x0348b165, 0x01cf3e31, 0x0260df8f, 0x00e15bbc, 0x016f7a06, 0x0030bd25, 0x02957f51, 0x00939bf5, 0x001cb39e}}}, + {X: Field{[10]uint32{0x0228aa79, 0x03cdc305, 0x00dfc1e2, 0x00d60cd8, 0x00d99281, 0x03d2db0b, 0x01b04f78, 0x02372480, 0x025aed33, 0x0015925b}}, Y: Field{[10]uint32{0x028c2db1, 0x02291daf, 0x0072586c, 0x015344c0, 0x00092ffa, 0x015b5454, 0x0315d3fa, 0x0329c048, 0x008a824f, 0x002076fd}}}, + {X: Field{[10]uint32{0x03a2130c, 0x01724c6d, 0x036df790, 0x01e56327, 0x02aecc0a, 0x03ca9086, 0x01edcc62, 0x03c26121, 0x03959e81, 0x0035a638}}, Y: Field{[10]uint32{0x01563d27, 0x01e3271e, 0x03ba45ce, 0x02f8743f, 0x0179408b, 0x03a5c28e, 0x0001a8e3, 0x02a8e76b, 0x02bce61e, 0x001640f7}}}, + {X: Field{[10]uint32{0x0166ff80, 0x01d93931, 0x01931780, 0x01ee4e1f, 0x007fad8d, 0x00d012cd, 0x02ade00d, 0x025142cc, 0x02408670, 0x00212ccb}}, Y: Field{[10]uint32{0x031cfdc8, 0x00e9606e, 0x01c244aa, 0x039000c9, 0x009bb5b0, 0x025714d4, 0x03941e31, 0x010a58ad, 0x007856cc, 0x00132034}}}, + {X: Field{[10]uint32{0x00db2ed6, 0x00e29842, 0x00cf05ac, 0x010ca3cc, 0x036528e2, 0x007b4cc9, 0x0073a45f, 0x0226d306, 0x03992a36, 0x001c4a71}}, Y: Field{[10]uint32{0x020810e4, 0x02265699, 0x00a68ce3, 0x00673cff, 0x0044f866, 0x024026aa, 0x01154567, 0x00969753, 0x03e84821, 0x000d8ad3}}}, + {X: Field{[10]uint32{0x0180d824, 0x00e74a34, 0x01b98781, 0x01fbda31, 0x005f8cad, 0x0326470d, 0x02cac088, 0x02dba9ad, 0x0087fa48, 0x0024c593}}, Y: Field{[10]uint32{0x01d9e26b, 0x017a11ed, 0x02a87278, 0x0087234d, 0x03bd1832, 0x0058e5aa, 0x0397771d, 0x03c3e432, 0x015cc91c, 0x0028eb03}}}, + {X: Field{[10]uint32{0x03305a68, 0x03b66c27, 0x02d94808, 0x017a2e26, 0x0194744d, 0x024a7cca, 0x004c7b1f, 0x024df28e, 0x00e237c4, 0x0013e43a}}, Y: Field{[10]uint32{0x012430b8, 0x0123c226, 0x00e70147, 0x0000d0f1, 0x02ce725e, 0x033bb41e, 0x03f417cf, 0x01212c20, 0x02e02b6b, 0x003379dd}}}, + {X: Field{[10]uint32{0x01f716a1, 0x03e46d9d, 0x00ed6a10, 0x0284f016, 0x034442f6, 0x014fb334, 0x0113fae2, 0x01c5ab9a, 0x03bc9f40, 0x00136580}}, Y: Field{[10]uint32{0x0124add6, 0x0153b90e, 0x02493c66, 0x0048a12a, 0x009c52a4, 0x029bed14, 0x0165827a, 0x038d565c, 0x01fc278c, 0x0024ad9e}}}, + {X: Field{[10]uint32{0x02b17203, 0x004f1312, 0x006a5aed, 0x00619fe4, 0x03f90cd7, 0x0058cb84, 0x0094f3bc, 0x01050c4b, 0x011f91c5, 0x0022dbd9}}, Y: Field{[10]uint32{0x010c7066, 0x020d9548, 0x02c130bf, 0x0256eb1a, 0x0109ded9, 0x0049b103, 0x00e2b78c, 0x00955aed, 0x01a4b80f, 0x00223056}}}, + {X: Field{[10]uint32{0x025ec256, 0x03082f6c, 0x02ee98cd, 0x03ad8155, 0x021909e1, 0x02352645, 0x02448f07, 0x020d1fa1, 0x0052cab9, 0x001bd62e}}, Y: Field{[10]uint32{0x00239885, 0x01c08f26, 0x01cd32fa, 0x02cab601, 0x021681da, 0x02833afa, 0x02bd30dd, 0x024c179a, 0x005f233d, 0x0000e930}}}, + {X: Field{[10]uint32{0x000c44bd, 0x02601c44, 0x010086cb, 0x024566a4, 0x028bb6ca, 0x03febe8c, 0x03710da3, 0x010472b2, 0x02a84021, 0x001af9fd}}, Y: Field{[10]uint32{0x0036bee9, 0x00405152, 0x0168bb58, 0x03fcc83a, 0x0186f339, 0x017f0464, 0x01c8d59b, 0x037ed160, 0x02f9d461, 0x002fd929}}}, + {X: Field{[10]uint32{0x02102d39, 0x020f4b2b, 0x0044ab39, 0x003cab06, 0x0299661f, 0x03b3fe6a, 0x00fdbe13, 0x02799bcb, 0x010bb8ea, 0x0002cbf3}}, Y: Field{[10]uint32{0x0182bb86, 0x013a339c, 0x02c74144, 0x02c3a8cf, 0x0027c38c, 0x00e9fa04, 0x032cbbad, 0x023e8c3a, 0x0189bb3b, 0x0002811a}}}, + {X: Field{[10]uint32{0x01a6fd96, 0x03dd129e, 0x02f1291b, 0x01adb667, 0x03391682, 0x00331644, 0x037770b5, 0x026ca7b7, 0x010eab55, 0x002875bb}}, Y: Field{[10]uint32{0x004ab69b, 0x008ded30, 0x03391df2, 0x00c02b1a, 0x002f17df, 0x00612025, 0x03bf93b5, 0x0156b85c, 0x017e0c92, 0x002ee459}}}, + {X: Field{[10]uint32{0x012a9575, 0x02a047a4, 0x0301bd08, 0x039f8725, 0x01440da5, 0x026ad8e7, 0x0366201e, 0x00c35cd4, 0x030ded71, 0x000a3d95}}, Y: Field{[10]uint32{0x02d2884a, 0x039ab73c, 0x0362edec, 0x017a5576, 0x00e2216e, 0x03efd30b, 0x011a7c70, 0x0166c8fa, 0x0360119c, 0x000e4647}}}, + {X: Field{[10]uint32{0x00271fa3, 0x032013e4, 0x038530b9, 0x0089258d, 0x0031cfce, 0x00075edb, 0x00b089d1, 0x00f79086, 0x00eddbb8, 0x00005323}}, Y: Field{[10]uint32{0x029a41fc, 0x03fb393a, 0x0384d7a8, 0x00f5128b, 0x030de129, 0x0131e252, 0x01cba3d2, 0x00b9c44d, 0x02d2a5d0, 0x00012014}}}, + {X: Field{[10]uint32{0x012d489b, 0x00be3eb8, 0x03ca9eda, 0x00ee4886, 0x03a75f56, 0x03211429, 0x0228fa1b, 0x00df4f4a, 0x0305fec7, 0x003abfe7}}, Y: Field{[10]uint32{0x03b8c139, 0x02dc2a48, 0x01c3dd3f, 0x01206844, 0x022ad9f3, 0x0083d18e, 0x03349fa5, 0x021cf5f4, 0x019b05c9, 0x0035b510}}}, + {X: Field{[10]uint32{0x00b35e95, 0x02fb4545, 0x02a43d92, 0x03825a4c, 0x00ce0757, 0x00b9ff0f, 0x03524575, 0x00dc4a16, 0x006eb42a, 0x003a3b93}}, Y: Field{[10]uint32{0x023b748a, 0x00c28ada, 0x01e2d5f2, 0x03f32f17, 0x00ee55ab, 0x0091b2df, 0x007ff4e6, 0x0060c7c4, 0x014c27ef, 0x000361af}}}, + {X: Field{[10]uint32{0x0241e7e4, 0x01db9abb, 0x00386a07, 0x008819de, 0x02d5e909, 0x03222946, 0x03707591, 0x00ec181a, 0x01090821, 0x00263186}}, Y: Field{[10]uint32{0x025d4c8c, 0x0106bbfd, 0x03efbfc2, 0x02a068df, 0x030fd72d, 0x02339314, 0x0290e2d3, 0x02e4110b, 0x022cf98b, 0x003acf4b}}}, + {X: Field{[10]uint32{0x0146dd29, 0x033dfcfe, 0x0217d946, 0x001938a3, 0x01893198, 0x00e2f2d7, 0x03a0dbbc, 0x00a61b15, 0x0381f5d6, 0x00353d9a}}, Y: Field{[10]uint32{0x037a5fc2, 0x02087ede, 0x03b32867, 0x023814c2, 0x002a1229, 0x02052d6e, 0x03c5579d, 0x0068032d, 0x038deedf, 0x003064c3}}}, + {X: Field{[10]uint32{0x0011087f, 0x01e41805, 0x03c4eb98, 0x030ab511, 0x01a13dd4, 0x02619bc3, 0x01543696, 0x02466d57, 0x00e705f8, 0x000535cf}}, Y: Field{[10]uint32{0x03ededf8, 0x0381b1a4, 0x0067d16e, 0x03c98a75, 0x03b71c48, 0x02bd0822, 0x0106df2c, 0x0034f174, 0x0222b9cb, 0x001a6e51}}}, + {X: Field{[10]uint32{0x03da3aec, 0x00d30808, 0x017115bc, 0x010229c4, 0x015646ab, 0x02942a35, 0x00511058, 0x01e831ab, 0x0135059c, 0x0015fbf2}}, Y: Field{[10]uint32{0x01c5dfd1, 0x01cb00ad, 0x00c4b262, 0x03c14ccb, 0x0127f959, 0x00ab954a, 0x03fba0d9, 0x015705d2, 0x029a60b8, 0x003f2a4c}}}, + {X: Field{[10]uint32{0x01b3677f, 0x00dcbf65, 0x0073dcb6, 0x03d4da0e, 0x00171213, 0x016a7cf9, 0x00b94585, 0x02a036a4, 0x0286063d, 0x00247c4e}}, Y: Field{[10]uint32{0x019a90ea, 0x02d3bed0, 0x016d03ca, 0x03384d05, 0x01e0332e, 0x0081558e, 0x029a7ae9, 0x03c4430c, 0x00d86734, 0x001d0178}}}, + {X: Field{[10]uint32{0x01607592, 0x035abfe8, 0x037675f9, 0x005b44cd, 0x02c33227, 0x01037170, 0x03dfd64b, 0x017896a0, 0x010b4614, 0x00373213}}, Y: Field{[10]uint32{0x012d6c66, 0x02a2ea07, 0x00adc8bb, 0x01869c0c, 0x0251b951, 0x03d4c91a, 0x01f15260, 0x03fab023, 0x00f48e4d, 0x00391a93}}}, + {X: Field{[10]uint32{0x0348676c, 0x01405d0c, 0x02db0542, 0x007f7c5a, 0x00df0bfa, 0x02fcf1a8, 0x016011e6, 0x03d0c804, 0x02acd5a6, 0x000a2ac1}}, Y: Field{[10]uint32{0x03b0cb9a, 0x015ad8e5, 0x012d427e, 0x00af8369, 0x03cc31f4, 0x013ff3fb, 0x011d6b7a, 0x01276ba7, 0x021c967f, 0x001449ca}}}, + {X: Field{[10]uint32{0x01d8b240, 0x03c3d148, 0x02d00bef, 0x0248c830, 0x020d9c2a, 0x0245718d, 0x032adb45, 0x037f7f4f, 0x0321f8d1, 0x0001f006}}, Y: Field{[10]uint32{0x002c8b48, 0x03e89715, 0x01aedf76, 0x018b4db4, 0x016e7ffd, 0x02aa5acf, 0x02f78fda, 0x01b607f1, 0x03cc9990, 0x002d2923}}}, + {X: Field{[10]uint32{0x014d98f1, 0x02a66b34, 0x01f5b428, 0x026f832d, 0x03a0d327, 0x02703a3e, 0x03624230, 0x03a57ca8, 0x037830f8, 0x003e53ba}}, Y: Field{[10]uint32{0x03649527, 0x03f8f290, 0x00d2305c, 0x0076544f, 0x03715722, 0x02ed2a4f, 0x01c91be8, 0x01ae7297, 0x03646967, 0x00325b56}}}, + {X: Field{[10]uint32{0x01ec35ca, 0x01bd7e04, 0x0045bd40, 0x01dcc3a4, 0x039a6d64, 0x03d78cb4, 0x01e0dd85, 0x0336902f, 0x00e47788, 0x003a919d}}, Y: Field{[10]uint32{0x035a235a, 0x01188c29, 0x01a0fe1a, 0x0185093a, 0x01fb622a, 0x0062f5da, 0x030032ba, 0x024488c1, 0x03790a9b, 0x0001da6f}}}, + {X: Field{[10]uint32{0x03b40112, 0x00f09407, 0x005d1728, 0x0234dd9d, 0x0019b7b3, 0x020aff8a, 0x03172606, 0x021a1404, 0x00197f8f, 0x0036969d}}, Y: Field{[10]uint32{0x01c37a39, 0x018f8ee5, 0x0290ceb6, 0x0104841c, 0x00b5a19f, 0x0358dcef, 0x025ef5f5, 0x0078604c, 0x02ec0587, 0x002982d7}}}, + {X: Field{[10]uint32{0x02e9d41d, 0x03dcbc89, 0x03b6c22f, 0x03b08ee3, 0x01a75ebc, 0x03b5eddb, 0x00c6820d, 0x003f6806, 0x03a55256, 0x0030405f}}, Y: Field{[10]uint32{0x009fed39, 0x01e0450d, 0x0129b1b0, 0x03699e0a, 0x039b5dc1, 0x03fc1625, 0x03da3b8d, 0x011fe459, 0x019daf26, 0x003a51ec}}}, + {X: Field{[10]uint32{0x01216a7f, 0x03a452ca, 0x00b164b3, 0x016066fc, 0x011b9646, 0x0160269d, 0x0215238b, 0x0111d9e2, 0x00e14e81, 0x0002f9f0}}, Y: Field{[10]uint32{0x03eb392e, 0x0189e803, 0x0204e4f1, 0x002e28d8, 0x01088084, 0x035923a0, 0x03072b15, 0x00669bc2, 0x0297f642, 0x0028c3af}}}, + {X: Field{[10]uint32{0x03007cea, 0x00ec4e65, 0x0014fcb5, 0x03cb3e01, 0x0059e0ff, 0x00bffe0b, 0x01184056, 0x0303f730, 0x02c1a4d6, 0x0019d63b}}, Y: Field{[10]uint32{0x00b316b3, 0x038fabdf, 0x00edcb4f, 0x02eb42e7, 0x00a0149b, 0x01898c7a, 0x02c88988, 0x03614908, 0x006620fc, 0x001194ef}}}, + {X: Field{[10]uint32{0x005b6116, 0x02143710, 0x01dae70d, 0x0379a6b3, 0x03011014, 0x03a1cd6c, 0x000cf059, 0x01366676, 0x01d3f88f, 0x00272ed4}}, Y: Field{[10]uint32{0x01902360, 0x01442ec9, 0x023d60e2, 0x02064642, 0x02047c63, 0x01fbf134, 0x00e0ed51, 0x016d4a00, 0x0348cad7, 0x0037e8b9}}}, + {X: Field{[10]uint32{0x00bf0bc3, 0x03854436, 0x00dea3d6, 0x0354d087, 0x0065328b, 0x02a96b46, 0x0350229e, 0x01e4bc5c, 0x02e7b170, 0x0018e96a}}, Y: Field{[10]uint32{0x02da1010, 0x03ee20d4, 0x00ea195a, 0x035e3396, 0x0212a261, 0x034d8d30, 0x026250ae, 0x017d27df, 0x03d0f25d, 0x0004496b}}}, + {X: Field{[10]uint32{0x02f10657, 0x038b226c, 0x02430b0f, 0x00907698, 0x014e036d, 0x0090f688, 0x02e11fb0, 0x000ca3ae, 0x02493e5f, 0x002b7e58}}, Y: Field{[10]uint32{0x01b1ea1e, 0x00d2d5c2, 0x037f784f, 0x037a280f, 0x03219a29, 0x005f52d7, 0x0018b16d, 0x0376ccb4, 0x00bafcd8, 0x0014260d}}}, + {X: Field{[10]uint32{0x034d472f, 0x01d97678, 0x01f32f00, 0x01270ac9, 0x01bfdfa5, 0x00135c89, 0x0183364e, 0x0128564d, 0x035b7fb4, 0x00028363}}, Y: Field{[10]uint32{0x03998ab2, 0x026c48bb, 0x0048dd53, 0x008be7df, 0x01630b6c, 0x0365ff8f, 0x01da99f3, 0x009a1e52, 0x0366f84c, 0x000187aa}}}, + {X: Field{[10]uint32{0x02e61fc1, 0x019a42c2, 0x0033ef68, 0x03496c9f, 0x027a3ee0, 0x01b60097, 0x00dbf815, 0x028b6eb7, 0x00ea9596, 0x002e60c2}}, Y: Field{[10]uint32{0x03ddbd37, 0x00334149, 0x006f5125, 0x01b9619e, 0x01445bae, 0x00f3f496, 0x00c582a0, 0x02933ad3, 0x03177566, 0x00336d38}}}, + {X: Field{[10]uint32{0x00b98134, 0x008cabdc, 0x03f637f0, 0x03236d2a, 0x03cf3969, 0x024ee8c0, 0x01eefe37, 0x035b3046, 0x031d37e3, 0x00386993}}, Y: Field{[10]uint32{0x003231da, 0x0173b507, 0x00fc2f95, 0x019e3d3b, 0x01ddbd35, 0x00fd606d, 0x00d2084b, 0x034bd7b1, 0x02d8885d, 0x0016235e}}}, + {X: Field{[10]uint32{0x01fdaaed, 0x0089da99, 0x00eca49c, 0x03b9ebc5, 0x01318929, 0x035c4644, 0x02253a1b, 0x00ea9b9c, 0x03ede854, 0x003ef577}}, Y: Field{[10]uint32{0x013b78bc, 0x033efc06, 0x016f2f76, 0x006b6f43, 0x00f23489, 0x016e30c4, 0x0005d516, 0x00d458f1, 0x030a432c, 0x000c5f3b}}}, + {X: Field{[10]uint32{0x00da6bc2, 0x01df39a1, 0x00a2ae30, 0x0137005e, 0x0030b87c, 0x03dedbc8, 0x031a8822, 0x02544213, 0x03f3b0a3, 0x003eb12d}}, Y: Field{[10]uint32{0x00867d75, 0x02ca656f, 0x01fae390, 0x034557c6, 0x00386ce0, 0x018a3f75, 0x00a5c54a, 0x008bf058, 0x01209e95, 0x001c0a6e}}}, + {X: Field{[10]uint32{0x03ef7c2b, 0x02a06150, 0x0053ee64, 0x014571d7, 0x013c29fc, 0x006d7f1f, 0x02c02964, 0x033d4200, 0x03de834f, 0x0032a190}}, Y: Field{[10]uint32{0x03cf17f9, 0x03ea592b, 0x014c3b26, 0x00c73b9c, 0x02f8ecea, 0x02b6767e, 0x036fd4d0, 0x00a5b890, 0x0027111e, 0x00241e9b}}}, + {X: Field{[10]uint32{0x03315f1f, 0x00b25b3c, 0x0066b120, 0x008af150, 0x03a4a73b, 0x03f92d22, 0x0226b19e, 0x003a85fa, 0x02490d70, 0x001c61cd}}, Y: Field{[10]uint32{0x03ded2fd, 0x00b04761, 0x0215abd8, 0x01208108, 0x01515127, 0x03973d0a, 0x03fc614d, 0x01d2ddd4, 0x00474bb3, 0x003db361}}}, + {X: Field{[10]uint32{0x00c5e3d7, 0x030f14d2, 0x03e6f15a, 0x023dddb2, 0x00175b76, 0x01df18fc, 0x02574826, 0x031cc89b, 0x00ff21c3, 0x0019f9ce}}, Y: Field{[10]uint32{0x02f2bdb2, 0x024d43ba, 0x026bfac7, 0x0151744c, 0x030ebd28, 0x01f3d824, 0x03a50644, 0x0375c95d, 0x000f2343, 0x00053945}}}, + {X: Field{[10]uint32{0x02198893, 0x03d57c66, 0x02934280, 0x010998b3, 0x036c5a5c, 0x00d3b85f, 0x01339f64, 0x0094fc81, 0x0331f875, 0x001452cf}}, Y: Field{[10]uint32{0x02e9a090, 0x02601f92, 0x0269fe46, 0x030b72a5, 0x01a61c0f, 0x039f3793, 0x011c538c, 0x03b1c133, 0x0193a2fb, 0x0013acce}}}, + {X: Field{[10]uint32{0x03c2dab3, 0x01614062, 0x03586f98, 0x005be12c, 0x02ca53c2, 0x006280e4, 0x0330a414, 0x00f9d5aa, 0x03a6eab0, 0x00109ab3}}, Y: Field{[10]uint32{0x01083926, 0x0166ab7c, 0x01a74acb, 0x03441d27, 0x02d34944, 0x0015ceed, 0x0206682d, 0x00431702, 0x02ab21cc, 0x0030f58f}}}, + {X: Field{[10]uint32{0x02d7a09c, 0x003a3de8, 0x005cad42, 0x01cb1608, 0x01b8ad4a, 0x01165f21, 0x03dcbee9, 0x015cdc3f, 0x034668c0, 0x002e51ae}}, Y: Field{[10]uint32{0x023401b9, 0x008eeb47, 0x02b2cdc7, 0x00e927fb, 0x03969ea1, 0x0196f180, 0x03e63a5e, 0x00e09959, 0x02d41263, 0x00331c03}}}, + {X: Field{[10]uint32{0x018e33ac, 0x00d6e576, 0x02dcd803, 0x03e3eca2, 0x001d1e38, 0x0335d77d, 0x01d7d3cc, 0x02d17d44, 0x00b3f6c8, 0x0039aa11}}, Y: Field{[10]uint32{0x0058cce2, 0x005db0bb, 0x017e2c0b, 0x00273249, 0x036c4aa1, 0x007dc5ea, 0x023268ee, 0x022431d2, 0x03893939, 0x0001fc91}}}, + {X: Field{[10]uint32{0x02458001, 0x034503e5, 0x03dcd117, 0x00fc08c4, 0x00493e90, 0x01492e63, 0x0236b415, 0x014ba305, 0x03bfd9e0, 0x0010f98a}}, Y: Field{[10]uint32{0x023b352d, 0x011de669, 0x03cec8e1, 0x02ed27b2, 0x01ebee23, 0x0373fcc7, 0x01993000, 0x0354a0c2, 0x013d0a90, 0x003d2061}}}, + {X: Field{[10]uint32{0x0047f817, 0x03d12e20, 0x02ad9e94, 0x01124496, 0x01e555a8, 0x00776e6f, 0x0223e1c4, 0x011db50b, 0x000e3427, 0x003113bd}}, Y: Field{[10]uint32{0x02236fac, 0x02e7a8e3, 0x009d2498, 0x02cb6e13, 0x0238f664, 0x01dbd2b8, 0x0018e147, 0x03964fca, 0x0313e43e, 0x002fb750}}}, + {X: Field{[10]uint32{0x03212385, 0x022f7814, 0x037e8d40, 0x03eabf66, 0x037f58f2, 0x03e39265, 0x016f93f5, 0x00625702, 0x0313dcc1, 0x00286cd4}}, Y: Field{[10]uint32{0x023079f5, 0x023a29c2, 0x02c55bdc, 0x03008098, 0x03135a9e, 0x0024f605, 0x009f9cf5, 0x01430dcc, 0x025abf0d, 0x002f5fac}}}, + {X: Field{[10]uint32{0x035e964e, 0x0122a486, 0x01c91b67, 0x026b4562, 0x02138222, 0x00d6f663, 0x03f2f0c7, 0x0007268d, 0x03f9fd62, 0x001229bc}}, Y: Field{[10]uint32{0x034481b4, 0x00b14316, 0x01c91971, 0x00e54e97, 0x022c73e0, 0x02a75659, 0x0062c81f, 0x02a28192, 0x01553d41, 0x0006d514}}}, + {X: Field{[10]uint32{0x00061e9f, 0x00a17669, 0x0354db06, 0x033716c8, 0x0375f050, 0x023bb3c6, 0x019181dc, 0x02c1ba28, 0x0174651d, 0x0023807d}}, Y: Field{[10]uint32{0x035e108b, 0x03efec89, 0x00cae256, 0x0192e87c, 0x027d7ba9, 0x00bbb2b6, 0x006e90a0, 0x039f56db, 0x02a09800, 0x0027455b}}}, + {X: Field{[10]uint32{0x0205345d, 0x029372be, 0x0258f43d, 0x03cc5a52, 0x0228e375, 0x029e7e39, 0x0368b195, 0x02d5d8fa, 0x00db9e6d, 0x0012f03e}}, Y: Field{[10]uint32{0x03a5b555, 0x03c85710, 0x019d98d0, 0x00eda8cb, 0x01633805, 0x009a929a, 0x02380e81, 0x02c592ee, 0x0389a1e6, 0x0031a9c1}}}, + {X: Field{[10]uint32{0x0297a768, 0x015288ee, 0x0255f32d, 0x0236c033, 0x00f4c7ee, 0x002df6ae, 0x0230a665, 0x037ab758, 0x00cb5f5e, 0x00259bf4}}, Y: Field{[10]uint32{0x011a994b, 0x01b3de60, 0x004e1654, 0x0272a795, 0x0001e892, 0x038285ae, 0x0019a1de, 0x026d97d6, 0x0243bb4f, 0x00275913}}}, + {X: Field{[10]uint32{0x017b0d8a, 0x00b14421, 0x027f8296, 0x02e21891, 0x0320d50e, 0x010e38cd, 0x02dc7c74, 0x00ba9964, 0x01ad4952, 0x001aad46}}, Y: Field{[10]uint32{0x023ae44d, 0x00245442, 0x020da8a8, 0x0280de3b, 0x02e82653, 0x0153087b, 0x0367ec35, 0x0142898a, 0x02342b72, 0x00316e8e}}}, + {X: Field{[10]uint32{0x0276c62f, 0x01b5bbea, 0x03856d52, 0x029094c9, 0x03e55f18, 0x001db858, 0x03d0a0cd, 0x0183d4e6, 0x00e43e50, 0x003e2c2e}}, Y: Field{[10]uint32{0x00d48ba4, 0x03b3dbf5, 0x03ad1fe1, 0x02e90d9c, 0x017d5c95, 0x00a0e6a8, 0x00f29c86, 0x014fe963, 0x0052a658, 0x001d0f78}}}, + {X: Field{[10]uint32{0x02d18bad, 0x01e8494f, 0x030e1658, 0x018e7456, 0x02967e97, 0x0088f57e, 0x0185c0e5, 0x023fc2ad, 0x02f8579d, 0x00311427}}, Y: Field{[10]uint32{0x01b08362, 0x016393c7, 0x01cf97fe, 0x03021bc4, 0x0381199d, 0x01d2e2b9, 0x036d8d35, 0x02696168, 0x03e8ee97, 0x001ee47d}}}, + {X: Field{[10]uint32{0x0342379f, 0x02c03f6a, 0x003c3aac, 0x00cb3ead, 0x0004cef7, 0x02530393, 0x0207c538, 0x0143e388, 0x035a6ff4, 0x00268004}}, Y: Field{[10]uint32{0x03a9975d, 0x02e3fe07, 0x03d594df, 0x01ba2e11, 0x00b48159, 0x0232aee4, 0x020902a2, 0x0316c51d, 0x03483684, 0x000e4fb1}}}, + {X: Field{[10]uint32{0x03488601, 0x029016db, 0x01e3eaa4, 0x00c53949, 0x02a484d3, 0x0174f7b8, 0x010c17c2, 0x0235f37a, 0x03df173f, 0x000f5dd6}}, Y: Field{[10]uint32{0x030e51d4, 0x03a631ec, 0x02046b3d, 0x016e265c, 0x0138a402, 0x0275d389, 0x03287f55, 0x003da96f, 0x00bc0a56, 0x001f9ac2}}}, + {X: Field{[10]uint32{0x0303b529, 0x003a60de, 0x017b8f5d, 0x000b5c0f, 0x02a95e50, 0x034428a6, 0x03380a80, 0x0062d144, 0x013ea601, 0x0033aebf}}, Y: Field{[10]uint32{0x03b74b4e, 0x0054d2a1, 0x010c0fd6, 0x006fd54a, 0x025f6d8b, 0x00cee811, 0x0203594e, 0x027d87fd, 0x02b646f5, 0x000651de}}}, + {X: Field{[10]uint32{0x03a731b2, 0x02c661f3, 0x01de158c, 0x018fd62b, 0x037ecbc9, 0x03926c8d, 0x001ac162, 0x038f87bc, 0x00ac1ff3, 0x002ba28f}}, Y: Field{[10]uint32{0x01531efe, 0x0287a794, 0x03ac2bac, 0x00ac4529, 0x02ee26fd, 0x02371dce, 0x03f6af9e, 0x02dd25cc, 0x02752052, 0x001692c1}}}, + {X: Field{[10]uint32{0x01e3b38e, 0x010dd4eb, 0x02b28308, 0x00d743ef, 0x01fd39b6, 0x011deb13, 0x0118edee, 0x01c48d70, 0x00bb8bd4, 0x0035d34e}}, Y: Field{[10]uint32{0x00b54451, 0x01aecddf, 0x01c325d6, 0x03f4e4db, 0x021ec0a0, 0x006e9b78, 0x01850843, 0x00a0e5ea, 0x01b6f17a, 0x003cf941}}}, + {X: Field{[10]uint32{0x02beb2a8, 0x0256c53d, 0x01db2495, 0x00cec33a, 0x014d4f0b, 0x0381d747, 0x00dc1bef, 0x01e17345, 0x02757780, 0x003d0a1d}}, Y: Field{[10]uint32{0x00514b38, 0x00787618, 0x015364eb, 0x0354ffc9, 0x03950f34, 0x00d86b5b, 0x018bf6da, 0x018b7719, 0x0231eefc, 0x0028f7c8}}}, + {X: Field{[10]uint32{0x02378e94, 0x03250051, 0x0145450d, 0x0220f287, 0x01e62776, 0x0272c826, 0x03caaa86, 0x02b589da, 0x036bda19, 0x003a4755}}, Y: Field{[10]uint32{0x0040779c, 0x032a5c4e, 0x01db87ac, 0x0060df9d, 0x00020e79, 0x00c99763, 0x00313db8, 0x00b2e66b, 0x0038c8da, 0x002d5f88}}}, + {X: Field{[10]uint32{0x00c66ea2, 0x00c33f8e, 0x01aec7e8, 0x0377cf1f, 0x03e035e1, 0x03caaa90, 0x011b53da, 0x0385d8de, 0x00e87d77, 0x0009a651}}, Y: Field{[10]uint32{0x013707f6, 0x0339db06, 0x02ea739a, 0x0115edfb, 0x01567641, 0x026cc8f2, 0x028ca430, 0x031fec14, 0x036434bd, 0x0032c045}}}, + {X: Field{[10]uint32{0x0244a3d1, 0x03807ec1, 0x02a5ee94, 0x005cbfdb, 0x01fb0993, 0x01eec5d9, 0x0261c685, 0x00da046a, 0x028a8f0b, 0x003b5079}}, Y: Field{[10]uint32{0x0108231c, 0x0037ae31, 0x005dc1dd, 0x03823302, 0x0071c918, 0x00f65600, 0x03a1e448, 0x02f8109a, 0x007b880c, 0x003cb324}}}, + {X: Field{[10]uint32{0x01fec0de, 0x01e59083, 0x0113ab0b, 0x03c4cc88, 0x01538192, 0x00e8cf5a, 0x0236e4f5, 0x032e978b, 0x024a96cf, 0x001a51d9}}, Y: Field{[10]uint32{0x038fb6cd, 0x01770be8, 0x01dc77f9, 0x02577b3d, 0x03256101, 0x01ab78cc, 0x01b76c4d, 0x02dbeea4, 0x01bc5b65, 0x00192074}}}, + {X: Field{[10]uint32{0x0227fb03, 0x021715c7, 0x02f668ea, 0x00b1c3a3, 0x00437901, 0x02a4996c, 0x000a42bb, 0x018f7daa, 0x007ce22b, 0x002a8f86}}, Y: Field{[10]uint32{0x00d011be, 0x02a47fc2, 0x0329c38f, 0x01239736, 0x03e8732f, 0x00c04150, 0x03fcab70, 0x027f465b, 0x016b9810, 0x00298e37}}}, + {X: Field{[10]uint32{0x004a944b, 0x026f863e, 0x021c5eff, 0x00de4493, 0x02bfd5ea, 0x0150ff5b, 0x029fbab6, 0x03e536d2, 0x00e1a4be, 0x00001779}}, Y: Field{[10]uint32{0x0157e2d6, 0x026ea79e, 0x03442967, 0x03469fb1, 0x0158f8ae, 0x01dd11d8, 0x0299513f, 0x038a502d, 0x0282693b, 0x00087128}}}, + {X: Field{[10]uint32{0x007a7ce5, 0x01b0ad0a, 0x030a0964, 0x03ba8ce8, 0x02fdd18f, 0x02bc2bc8, 0x0096c793, 0x02d1de07, 0x00c72c87, 0x00194cf7}}, Y: Field{[10]uint32{0x037ccc51, 0x00dc1620, 0x00cd3f8c, 0x033e8ebb, 0x00482748, 0x00d1085d, 0x01589fc2, 0x03e6ef3a, 0x01f23d82, 0x001fc0f9}}}, + {X: Field{[10]uint32{0x00fdf354, 0x02ec0299, 0x01871a5e, 0x008e9c2e, 0x01c5109f, 0x014d0d4c, 0x02008ab8, 0x01612af6, 0x033c129e, 0x0004e797}}, Y: Field{[10]uint32{0x033f0a98, 0x0028bddd, 0x009de619, 0x039209ab, 0x026bf011, 0x020d4ad8, 0x03182ee9, 0x023abe94, 0x025741fb, 0x00125edf}}}, + {X: Field{[10]uint32{0x0161f7c3, 0x01e6bba0, 0x01f0c7c7, 0x02060645, 0x013ce57b, 0x0363c958, 0x00ea9918, 0x03a5420f, 0x01ccf7e1, 0x00124ffa}}, Y: Field{[10]uint32{0x03020cd5, 0x02f93059, 0x02f4088c, 0x00562f30, 0x00639ab6, 0x028eed12, 0x00aff6a6, 0x03874115, 0x03fd62fc, 0x0039a5d8}}}, + {X: Field{[10]uint32{0x02a064a9, 0x039acd94, 0x008a7446, 0x0055d9bb, 0x03900e3c, 0x0240f29d, 0x01ac2fb4, 0x01c2e190, 0x03dbd8dd, 0x003b59d7}}, Y: Field{[10]uint32{0x00416de9, 0x01bcc4da, 0x037fd1f2, 0x02c9739d, 0x0223ccff, 0x02c0622b, 0x00669b40, 0x03d6d1b8, 0x037985ce, 0x002986ec}}}, + {X: Field{[10]uint32{0x02260a4d, 0x02c32a66, 0x00b83136, 0x0110e187, 0x02b6d484, 0x014e4f54, 0x03c14e31, 0x0278e9e5, 0x00a89a76, 0x0005cd9c}}, Y: Field{[10]uint32{0x03bd4904, 0x00f689f1, 0x02bc6d68, 0x03ddf760, 0x00d140b3, 0x01242104, 0x02a1b28e, 0x0134ba57, 0x0121c1ba, 0x0013750e}}}, + {X: Field{[10]uint32{0x035d1610, 0x0387c258, 0x0128cdf9, 0x00f4b329, 0x00a1da93, 0x03041ba0, 0x011e05a0, 0x038551bc, 0x03a08f87, 0x00356978}}, Y: Field{[10]uint32{0x01175352, 0x00a45397, 0x01167255, 0x01d0828d, 0x01aa20df, 0x0307fec3, 0x00a9c6f2, 0x03024a34, 0x01e0daf3, 0x001f1b15}}}, + {X: Field{[10]uint32{0x02f6fa2a, 0x0168ce36, 0x00ebe417, 0x00c9d3b9, 0x01a0a999, 0x01359a5f, 0x02f2e2b9, 0x00c871a4, 0x01a004ab, 0x00153d7a}}, Y: Field{[10]uint32{0x01f2de21, 0x0359b622, 0x0342b5cb, 0x032a157f, 0x0258a7d9, 0x03e0a376, 0x02eb7614, 0x01b91cd2, 0x03d175fa, 0x001633c4}}}, + {X: Field{[10]uint32{0x03ebe6da, 0x01c96f1f, 0x01d4c9e8, 0x00b65111, 0x02fd9a63, 0x010988ac, 0x025544a4, 0x03a6558b, 0x0098154d, 0x00359a0a}}, Y: Field{[10]uint32{0x0190f206, 0x01c7718c, 0x001ebd13, 0x0117dd83, 0x030b2d50, 0x01e5c6a8, 0x0202c50a, 0x02e15d43, 0x023b9ba3, 0x00260247}}}, + {X: Field{[10]uint32{0x01c2da08, 0x0126fdb3, 0x008cafef, 0x03fc6324, 0x02610bec, 0x00b7b34d, 0x01f6e1a8, 0x03131236, 0x01b92af2, 0x00094c06}}, Y: Field{[10]uint32{0x017c680a, 0x02e1ae8e, 0x02a5a495, 0x00ef694e, 0x023ffbdd, 0x00421cb8, 0x02ebdce8, 0x0275d397, 0x035ad950, 0x00185f4c}}}, + {X: Field{[10]uint32{0x004da6cb, 0x019f3544, 0x00f16bab, 0x01d14391, 0x02ced725, 0x03023ca4, 0x00d2bcfa, 0x03af7958, 0x00ca461b, 0x00015bd9}}, Y: Field{[10]uint32{0x013aee44, 0x00efcf56, 0x023eebd8, 0x014ee40e, 0x02757cb5, 0x00bba050, 0x012bca8f, 0x020ca2a6, 0x01cfdc27, 0x0016c821}}}, + {X: Field{[10]uint32{0x03553420, 0x03b49163, 0x012f64dd, 0x03a6fbcc, 0x005a31a1, 0x01f8fb8e, 0x025c1928, 0x00ea6bc3, 0x01711e15, 0x003ce725}}, Y: Field{[10]uint32{0x03b0b1cc, 0x020a4c38, 0x03a974b8, 0x018922f7, 0x02e742ef, 0x0126304c, 0x039df908, 0x01ae7de1, 0x02c11c20, 0x00133252}}}, + {X: Field{[10]uint32{0x013128b5, 0x037758b0, 0x005368c8, 0x01297783, 0x01b2f303, 0x01716ab9, 0x02d3dad9, 0x021cf00c, 0x02a8cbdf, 0x00010dfa}}, Y: Field{[10]uint32{0x013c59c6, 0x038c2026, 0x01fcc721, 0x00b77c30, 0x012f8d1b, 0x03583696, 0x00245993, 0x0042ed65, 0x020eb003, 0x0009f63a}}}, + {X: Field{[10]uint32{0x0080e9b2, 0x027ad2ea, 0x0371f0a7, 0x0298053b, 0x003f13e7, 0x00715d4d, 0x010ae621, 0x019e6112, 0x01893f5d, 0x002b7869}}, Y: Field{[10]uint32{0x0391c715, 0x00b8988d, 0x01304902, 0x00adfc90, 0x01e80188, 0x00f06d0a, 0x03404d8c, 0x01a8eeb1, 0x017c537e, 0x002f5270}}}, + {X: Field{[10]uint32{0x02c1224e, 0x038b64ce, 0x0198fd16, 0x01e31eb4, 0x00a87ef9, 0x029386db, 0x0357d977, 0x00696ae7, 0x01d5c309, 0x0024d89d}}, Y: Field{[10]uint32{0x036b9f32, 0x000481f7, 0x0057e5aa, 0x0146c5ee, 0x00ed5988, 0x01b88934, 0x0375d96c, 0x021317aa, 0x010ad8bd, 0x001a149a}}}, + {X: Field{[10]uint32{0x039b786e, 0x03ed69da, 0x01e8cc33, 0x00741dad, 0x03e29497, 0x03202e74, 0x006db205, 0x03573781, 0x01fd3e8f, 0x0000a795}}, Y: Field{[10]uint32{0x00010a0d, 0x03379263, 0x02f57af6, 0x00ab5869, 0x002bbf3e, 0x01c83391, 0x038312f0, 0x00d2e515, 0x017a7eb9, 0x0001da79}}}, + {X: Field{[10]uint32{0x009051ef, 0x02c566e0, 0x00584168, 0x0011d91f, 0x003ae378, 0x01785bde, 0x00b52754, 0x0217fc66, 0x02a73501, 0x0037e0d8}}, Y: Field{[10]uint32{0x02af6bab, 0x032b82d8, 0x01a263a6, 0x0203b923, 0x03735ece, 0x012c5b0e, 0x026b6048, 0x028ef7a0, 0x0046fbd4, 0x002bf2cd}}}, + {X: Field{[10]uint32{0x018a427e, 0x0057b381, 0x0033c254, 0x020e5b3d, 0x01b9a01e, 0x01b31867, 0x01660379, 0x017f83e5, 0x012309a3, 0x0017d10c}}, Y: Field{[10]uint32{0x00901ac0, 0x01f530ac, 0x03c906fd, 0x01c923eb, 0x0337d81c, 0x01aaa705, 0x0272b605, 0x02af14a4, 0x0012fc0a, 0x000e170a}}}, + {X: Field{[10]uint32{0x01dd2de5, 0x038d1205, 0x0163f4b7, 0x03fd74f7, 0x008c5323, 0x01a4ff13, 0x01b77a31, 0x000df149, 0x021553c6, 0x00306710}}, Y: Field{[10]uint32{0x013900a4, 0x0323b06a, 0x01822159, 0x01564b26, 0x00a19d22, 0x03679ac8, 0x01161896, 0x01df849c, 0x028a8791, 0x0027ddba}}}, + {X: Field{[10]uint32{0x032d45ac, 0x028508eb, 0x013f1d62, 0x024aa084, 0x0214d19d, 0x018e5091, 0x0162fdb3, 0x008ccbab, 0x021dd1e0, 0x0022afce}}, Y: Field{[10]uint32{0x03e36dde, 0x006d6629, 0x007ec7de, 0x0105b754, 0x02defc29, 0x0330b67c, 0x027a984e, 0x03b0fdd7, 0x027fdcf5, 0x000c96a5}}}, + {X: Field{[10]uint32{0x0359ae7a, 0x028f377d, 0x03b9433f, 0x01db0181, 0x0257c1dd, 0x01c7aa12, 0x014a58fa, 0x01879b13, 0x0390b931, 0x00322ff7}}, Y: Field{[10]uint32{0x030b20f9, 0x02513cc9, 0x01ce5b51, 0x033c054d, 0x00fd7990, 0x00f96a8f, 0x007efd3c, 0x03ed8fb5, 0x00a3d172, 0x0008f70e}}}, + {X: Field{[10]uint32{0x02d2c78d, 0x01fa1b80, 0x038b443c, 0x01016dde, 0x02a26ccc, 0x017e435e, 0x019e7ab8, 0x01665e9d, 0x026c35c5, 0x00025d99}}, Y: Field{[10]uint32{0x001ed0ff, 0x0145850e, 0x00f89605, 0x03fad0dc, 0x0392c52c, 0x008333bb, 0x02db2e4e, 0x033c96fc, 0x003e44fa, 0x001b4d0b}}}, + {X: Field{[10]uint32{0x0163252b, 0x00aa337e, 0x0273a1c1, 0x01b3fac8, 0x021fd65b, 0x02f6270e, 0x03b8e8a5, 0x0393871e, 0x03a77737, 0x0039de42}}, Y: Field{[10]uint32{0x03bdba42, 0x0096773f, 0x02e1a810, 0x03caa7a4, 0x01f7138f, 0x02ca2663, 0x02754ead, 0x02d63dc3, 0x02201534, 0x000098d7}}}, + {X: Field{[10]uint32{0x0176fb0d, 0x01df6051, 0x03efe375, 0x03265d7c, 0x03b471ce, 0x02e61ab0, 0x00e3ecd5, 0x03b20fd8, 0x017f6bfc, 0x0010b2e0}}, Y: Field{[10]uint32{0x005cf49a, 0x022937b1, 0x03cce270, 0x025941d7, 0x01144a85, 0x015cde42, 0x0162050a, 0x02f643c8, 0x0128b2f9, 0x003b4d78}}}, + {X: Field{[10]uint32{0x012f3cbb, 0x014383d0, 0x018f0024, 0x00a293f5, 0x01319024, 0x03847c51, 0x0060397a, 0x024ccfff, 0x00701a23, 0x0028221a}}, Y: Field{[10]uint32{0x0083af52, 0x0207e646, 0x00ad6d8a, 0x03267300, 0x03fc6002, 0x01221fae, 0x0251995b, 0x0380d023, 0x03371ad6, 0x0032121b}}}, + {X: Field{[10]uint32{0x032c4bb3, 0x021bc95c, 0x01aab034, 0x00b08998, 0x02e6a964, 0x00d9294b, 0x00fd8e8b, 0x006e2c10, 0x02419f10, 0x00290332}}, Y: Field{[10]uint32{0x0045a910, 0x02c542a5, 0x01285bab, 0x026e5402, 0x03b0655b, 0x001c0730, 0x01e611df, 0x025bc0b4, 0x03693ec0, 0x0003d086}}}, + {X: Field{[10]uint32{0x01beb721, 0x0181290d, 0x0350fefe, 0x003c5068, 0x02c53294, 0x027d5d57, 0x035b70bc, 0x011cb169, 0x0178bbb0, 0x00242bbe}}, Y: Field{[10]uint32{0x014bbf0d, 0x021f8478, 0x01187a5f, 0x004251e7, 0x0193f585, 0x0391e3a9, 0x008cde92, 0x03db932a, 0x0070737c, 0x003e7c17}}}, + {X: Field{[10]uint32{0x003407c3, 0x031a65eb, 0x03f1a07b, 0x00ceee09, 0x02d73ae4, 0x036e6b2d, 0x00292f68, 0x007ce580, 0x0281a0f6, 0x003ff08e}}, Y: Field{[10]uint32{0x034d4b66, 0x017ca115, 0x02803686, 0x00de81d1, 0x004f313b, 0x0351f338, 0x03c74630, 0x0384e49d, 0x0212bce5, 0x002dda81}}}, + {X: Field{[10]uint32{0x00a112a5, 0x003fd408, 0x01ded2ab, 0x00b837e6, 0x02742c85, 0x02610969, 0x022bc162, 0x03e64109, 0x039440bd, 0x0034f29e}}, Y: Field{[10]uint32{0x024d637a, 0x01e03ff7, 0x022cb1f9, 0x02dcd07e, 0x005ef191, 0x0204f38b, 0x004281f9, 0x0209713d, 0x03acca7e, 0x00276bb2}}}, + {X: Field{[10]uint32{0x01bb9f06, 0x02cf3294, 0x02b41b23, 0x02b3557b, 0x03469b21, 0x038386b1, 0x02b7589c, 0x02cc70a9, 0x02bb720a, 0x000a94e8}}, Y: Field{[10]uint32{0x0051f84e, 0x0295f8f5, 0x03256c21, 0x0036e912, 0x0027f781, 0x008341bb, 0x00d0f522, 0x025919e9, 0x0133ffde, 0x00046bfe}}}, + {X: Field{[10]uint32{0x01a1ac96, 0x00211d2b, 0x0087d05a, 0x01c5fedd, 0x0322b2fc, 0x02e3d72f, 0x03d2f77b, 0x000a1e9b, 0x035680c4, 0x00121f94}}, Y: Field{[10]uint32{0x02a849c8, 0x02434356, 0x03a731e9, 0x00954830, 0x01029c96, 0x0144c111, 0x0365326d, 0x00358dde, 0x03d54607, 0x0014ef5f}}}, + {X: Field{[10]uint32{0x027b3e16, 0x0396e659, 0x03a2963d, 0x02d20827, 0x01cf23c0, 0x00bd2d8a, 0x0332cfd6, 0x028307f0, 0x03cf291d, 0x000f9697}}, Y: Field{[10]uint32{0x02b86825, 0x0037b43e, 0x01c97b06, 0x03bdfd57, 0x008b33d7, 0x01ceec4c, 0x03028df7, 0x02687c12, 0x032c4338, 0x0021a61f}}}, + {X: Field{[10]uint32{0x023e256f, 0x01f5de43, 0x02b8ed5f, 0x03ed5c21, 0x00601840, 0x00b755c1, 0x002493d2, 0x011f08b1, 0x03c515a8, 0x0013e42b}}, Y: Field{[10]uint32{0x02b831be, 0x037b43ea, 0x01e33226, 0x0250ad61, 0x024ef939, 0x02b034f0, 0x01f6b089, 0x01a248cd, 0x0158ac2e, 0x0011b8c6}}}, + {X: Field{[10]uint32{0x023601fc, 0x01617078, 0x01a1782c, 0x00e29161, 0x02c2ff4b, 0x0086fa60, 0x02738071, 0x00fa9e9a, 0x012b40be, 0x002f81ce}}, Y: Field{[10]uint32{0x01f258db, 0x02a085bc, 0x0038da57, 0x01c799bb, 0x01431727, 0x036f8842, 0x01775b81, 0x027a39ef, 0x0057657c, 0x000e8561}}}, + {X: Field{[10]uint32{0x021108ed, 0x018d04be, 0x02603e05, 0x010546d6, 0x02ecc2f7, 0x01f09381, 0x02f9e6d4, 0x00dd7c88, 0x00e52140, 0x0021b09d}}, Y: Field{[10]uint32{0x00a96ef8, 0x0025a490, 0x003a2aa0, 0x01dbe4b0, 0x012703f2, 0x0326261f, 0x02b90b64, 0x035640cb, 0x02b94065, 0x001280be}}}, + {X: Field{[10]uint32{0x0173cf97, 0x023813cd, 0x03626267, 0x02a88449, 0x02287277, 0x036b04ff, 0x03b30561, 0x00e26049, 0x026be792, 0x00013f4e}}, Y: Field{[10]uint32{0x011173e4, 0x000d0b7c, 0x000d238c, 0x0288ed0e, 0x02f07ebe, 0x00ef1fa5, 0x00f4b4b4, 0x03b2db1b, 0x01a163cf, 0x00192628}}}, + {X: Field{[10]uint32{0x01117c94, 0x031da577, 0x0118cb68, 0x021aea06, 0x03cd2a5f, 0x03f33f41, 0x02fe78d1, 0x02f75e2a, 0x01ca5423, 0x0033e90d}}, Y: Field{[10]uint32{0x00ce1fe8, 0x01a0d5c4, 0x00cefd7d, 0x00ed2a7d, 0x01c399b5, 0x01a114e2, 0x03778546, 0x03de78d6, 0x011c02df, 0x002fd322}}}, + {X: Field{[10]uint32{0x021d446c, 0x024f8b0f, 0x010c1cdf, 0x03987cf2, 0x01414119, 0x01d1a6bf, 0x029e9277, 0x00f3166c, 0x031b7953, 0x002a96b2}}, Y: Field{[10]uint32{0x02a498ab, 0x01023d08, 0x01bc26bb, 0x004271d7, 0x028b11bf, 0x0060dd9f, 0x02d3854e, 0x030007ed, 0x01b78713, 0x002c37ca}}}, + {X: Field{[10]uint32{0x005c3d15, 0x00f82855, 0x01175635, 0x03d5341b, 0x03435c09, 0x006f294b, 0x03fa1c44, 0x03d56376, 0x02ecc21b, 0x0006e4f0}}, Y: Field{[10]uint32{0x03195ed2, 0x00fed28c, 0x00c4aeb5, 0x02c68837, 0x03f72e67, 0x0171b498, 0x00e8a5fd, 0x0243996b, 0x01ff7181, 0x0015b115}}}, + {X: Field{[10]uint32{0x03b91760, 0x0145260b, 0x010acd85, 0x02489190, 0x01c84800, 0x017dcac3, 0x039438b5, 0x03482fd8, 0x03f02566, 0x0005d132}}, Y: Field{[10]uint32{0x034c66f5, 0x03d48a77, 0x01f6c683, 0x03e12f68, 0x00068dc0, 0x029f495c, 0x01d5da57, 0x02d71674, 0x03a232b0, 0x001f9de9}}}, + {X: Field{[10]uint32{0x0302582b, 0x02a101ff, 0x01bedd24, 0x029e88a4, 0x021b9cb9, 0x0181ecc5, 0x02f8ffc0, 0x02300a30, 0x00a5ed44, 0x00282fa6}}, Y: Field{[10]uint32{0x011da6ea, 0x03065c40, 0x029a2274, 0x0207774d, 0x0376b869, 0x033dab23, 0x01444620, 0x00d496d3, 0x006a0239, 0x0039f30b}}}, + {X: Field{[10]uint32{0x03845882, 0x0244019e, 0x03e71148, 0x00673723, 0x038b2f2b, 0x0235d7a8, 0x02b2591d, 0x03dea558, 0x03f5dab5, 0x00383964}}, Y: Field{[10]uint32{0x02d67334, 0x017d70b2, 0x029c7e78, 0x031927d1, 0x00b5464d, 0x0290b38b, 0x03c26141, 0x0176d6ce, 0x036215e3, 0x00242231}}}, + {X: Field{[10]uint32{0x029290f5, 0x03f21e70, 0x02b408b9, 0x01b17924, 0x01ffe579, 0x039ec359, 0x031b928d, 0x00baaf5b, 0x0095a498, 0x001e0936}}, Y: Field{[10]uint32{0x00c7ee88, 0x02bc06af, 0x02d448a4, 0x005d5f36, 0x00d6bcf1, 0x0308cb18, 0x022d8bbf, 0x0214a0e2, 0x00688e42, 0x002b85d7}}}, + {X: Field{[10]uint32{0x01d96e66, 0x0073c43e, 0x00b5c421, 0x024fa5db, 0x012aa513, 0x00066b8b, 0x00e4a2cd, 0x00477085, 0x017ee0b6, 0x001274b9}}, Y: Field{[10]uint32{0x015b770a, 0x028f2caf, 0x014d25cf, 0x013e9e05, 0x0311c81e, 0x00a6ee7e, 0x01b79198, 0x007dc9de, 0x00ca8801, 0x003fe831}}}, + {X: Field{[10]uint32{0x035ead00, 0x004e73f1, 0x03ee8be2, 0x00cba71e, 0x02eeb3de, 0x00e262ba, 0x0012e8f8, 0x006a1618, 0x036b8f70, 0x00369817}}, Y: Field{[10]uint32{0x0011d246, 0x027973a5, 0x03633d69, 0x01f19d47, 0x025a2430, 0x024fd43e, 0x030ca5ea, 0x00706a27, 0x012ce98a, 0x0016e830}}}, + {X: Field{[10]uint32{0x02c16ff2, 0x03ff672e, 0x02785652, 0x00f070cb, 0x029307be, 0x03670e02, 0x01de2bd1, 0x0139b568, 0x03ebcde9, 0x002bbaaa}}, Y: Field{[10]uint32{0x010bf840, 0x006aebf5, 0x02460664, 0x006b0965, 0x03b62e49, 0x0041c24f, 0x000a52bf, 0x03b37814, 0x03558510, 0x000c0251}}}, + {X: Field{[10]uint32{0x010c40b7, 0x007fac68, 0x0378cb0e, 0x002f972d, 0x0066ca0a, 0x00c17e7a, 0x02d1e1f4, 0x03f992c6, 0x012b35f3, 0x0018bc62}}, Y: Field{[10]uint32{0x03f5780d, 0x0204e9c0, 0x028838e1, 0x0148b452, 0x03f1f890, 0x0316fb6f, 0x0287f090, 0x02fd28b8, 0x005ee600, 0x00069108}}}, + {X: Field{[10]uint32{0x02979382, 0x01356265, 0x01e944ac, 0x00cf6b89, 0x033a567b, 0x0029a020, 0x02be9f55, 0x00b5a4a3, 0x02c54677, 0x00308247}}, Y: Field{[10]uint32{0x02d4b31e, 0x02140b72, 0x002b2382, 0x01a4b56a, 0x02eb610c, 0x007f8651, 0x01fa722a, 0x0274c5cd, 0x025bd2e8, 0x0016669d}}}, + {X: Field{[10]uint32{0x03242367, 0x0003f7c6, 0x01ba597d, 0x01557e0f, 0x02e50a24, 0x027f9f08, 0x00e1b237, 0x0248d5c0, 0x015b1951, 0x002ff5f0}}, Y: Field{[10]uint32{0x0066b17b, 0x00af51af, 0x02694037, 0x031235bf, 0x03f4cdda, 0x03ebf4a1, 0x01272130, 0x031cd7a8, 0x03de545e, 0x002b1b79}}}, + {X: Field{[10]uint32{0x032ddc7f, 0x017d8d44, 0x00fd116b, 0x027dd3cf, 0x01958162, 0x020c76a0, 0x03d85073, 0x03f7de40, 0x03843cab, 0x00353539}}, Y: Field{[10]uint32{0x021758a6, 0x01d0b501, 0x0082d219, 0x0138ae3c, 0x01d1cd6d, 0x011d572c, 0x0265a284, 0x02eb2ff3, 0x011d582c, 0x00079258}}}, + {X: Field{[10]uint32{0x03908fdc, 0x03047223, 0x03d02cdd, 0x03e37d85, 0x014945b4, 0x0177630c, 0x03434a49, 0x02cd37ce, 0x0009c378, 0x000795d4}}, Y: Field{[10]uint32{0x00f6cdb7, 0x02161fc3, 0x005655bd, 0x008cffea, 0x0010bf21, 0x023c8273, 0x017458cb, 0x0256849a, 0x03a2810c, 0x001738df}}}, + {X: Field{[10]uint32{0x01408fd0, 0x03e570ee, 0x00ee1108, 0x01b4dc41, 0x01c9268c, 0x03f7d979, 0x035e690f, 0x01fae287, 0x022eac23, 0x002d699a}}, Y: Field{[10]uint32{0x03f72798, 0x00fbca32, 0x030de3c4, 0x0200c1d8, 0x03f8cc32, 0x0219a31b, 0x0042ba86, 0x03dba982, 0x02c0aaa4, 0x00264016}}}, + {X: Field{[10]uint32{0x0326fe0d, 0x030fb99f, 0x036e60cf, 0x00c0878f, 0x0166bc3a, 0x02ebabe3, 0x0090b063, 0x0164f19b, 0x01352599, 0x000768e7}}, Y: Field{[10]uint32{0x0141311f, 0x0216e172, 0x03e489f2, 0x029e3f1f, 0x00f7e58a, 0x00070c00, 0x030d076c, 0x00546d51, 0x005eb6b0, 0x00249ca8}}}, + {X: Field{[10]uint32{0x01a971b2, 0x01d10d2d, 0x005002b3, 0x016bce11, 0x024e900c, 0x007d0a3f, 0x02862d72, 0x00029d94, 0x00b6b100, 0x001fcec4}}, Y: Field{[10]uint32{0x02ecd385, 0x03481728, 0x03a9e1f5, 0x01d37cf0, 0x008c4a4f, 0x0095be82, 0x03bd4c90, 0x03b8cc44, 0x03e07907, 0x002e528b}}}, + {X: Field{[10]uint32{0x024eb2e0, 0x02132f5e, 0x018cbbaf, 0x0228fd74, 0x02e5dc36, 0x008030b6, 0x03eb61ae, 0x003e6fda, 0x03c66185, 0x00109841}}, Y: Field{[10]uint32{0x03e511af, 0x0231c319, 0x014f540f, 0x033a3a39, 0x000857ce, 0x034ebfa9, 0x0313488b, 0x03b43e35, 0x0078a9e6, 0x00387e9f}}}, + {X: Field{[10]uint32{0x01be9697, 0x01d290d1, 0x013e2fa3, 0x0265a03d, 0x01d6c940, 0x012273ea, 0x02093c21, 0x031310c4, 0x0256708f, 0x00155789}}, Y: Field{[10]uint32{0x004db6e7, 0x00b8af8a, 0x00cb002f, 0x008b1bd1, 0x01a78224, 0x019d2e84, 0x0166e06c, 0x02dda889, 0x03b71e3b, 0x00003d7b}}}, + {X: Field{[10]uint32{0x017dd290, 0x03f6c4a4, 0x028b3af8, 0x0095190a, 0x01033606, 0x0096dc27, 0x02a927e7, 0x0381f098, 0x017b5736, 0x001c5c2c}}, Y: Field{[10]uint32{0x030973b1, 0x02b9cd40, 0x01608627, 0x029adb7d, 0x0398b2c6, 0x029df382, 0x02d86e69, 0x02204ed6, 0x02a3f899, 0x003bd0df}}}, + {X: Field{[10]uint32{0x025c2180, 0x03b0c456, 0x00172aaa, 0x011b224c, 0x01eb4de6, 0x01ca913c, 0x02329d00, 0x03f44d27, 0x033e66fe, 0x00072a2a}}, Y: Field{[10]uint32{0x030a3c49, 0x003be98e, 0x03274fd2, 0x028554c6, 0x02c70103, 0x012613b4, 0x01da2a0f, 0x035dda07, 0x01c92a87, 0x001bf190}}}, + {X: Field{[10]uint32{0x005366b8, 0x0393e370, 0x007977d5, 0x034d21ed, 0x0385f057, 0x007069ca, 0x0150c1e4, 0x00ba0afc, 0x006af6d4, 0x0020d495}}, Y: Field{[10]uint32{0x02c5fdb1, 0x00ea0d61, 0x0084b138, 0x039ba831, 0x01ac92b0, 0x0070ac72, 0x008d7e72, 0x016c4aa2, 0x02b27ca2, 0x001daf96}}}, + {X: Field{[10]uint32{0x00904cd7, 0x02211667, 0x0244c3e9, 0x0285364b, 0x03353123, 0x0197123b, 0x03988ea7, 0x02e7558f, 0x037b1730, 0x000bc44b}}, Y: Field{[10]uint32{0x0234a44f, 0x029a094b, 0x031bb743, 0x02f50680, 0x0027d7a8, 0x00ab45d0, 0x0370b16d, 0x01f568cb, 0x0297f648, 0x003acd23}}}, + {X: Field{[10]uint32{0x02a5648a, 0x009423cf, 0x00f1d519, 0x00245a9c, 0x002eb6fd, 0x01042979, 0x032494ad, 0x031b1c75, 0x023c164d, 0x0003a100}}, Y: Field{[10]uint32{0x02f4462d, 0x01bf2007, 0x01b8a48a, 0x00c6ac51, 0x01225aa0, 0x008a05af, 0x032f5106, 0x000ca226, 0x018529be, 0x0018d3cd}}}, + {X: Field{[10]uint32{0x0228fc6b, 0x010049e3, 0x029afd6e, 0x0108c719, 0x004da403, 0x005355fd, 0x00039291, 0x03d49c2e, 0x011745da, 0x00254713}}, Y: Field{[10]uint32{0x0227f0a7, 0x02b92b56, 0x00921bb2, 0x03c71cbf, 0x03b9592e, 0x02ba0989, 0x0296f608, 0x003eecb1, 0x0311a8b3, 0x003e420e}}}, + {X: Field{[10]uint32{0x00cb19f4, 0x02e24be3, 0x007fd689, 0x010546ba, 0x01788458, 0x007e516e, 0x025548c5, 0x027cfb82, 0x0057f60b, 0x002b6aa5}}, Y: Field{[10]uint32{0x0361caa6, 0x01a16205, 0x018302e4, 0x01450339, 0x03f899b9, 0x0159d265, 0x039b0475, 0x03fbee37, 0x03f92145, 0x0020d195}}}, + {X: Field{[10]uint32{0x019e6ef7, 0x017f7b98, 0x03397749, 0x00d474c0, 0x00597f3e, 0x00b5fee9, 0x02ef3d85, 0x0028ed45, 0x02b30980, 0x001924a5}}, Y: Field{[10]uint32{0x021df105, 0x0214cfb5, 0x038535c7, 0x00776233, 0x005c8b44, 0x00bb7faf, 0x005f078e, 0x01459ff7, 0x00901021, 0x001133a7}}}, + {X: Field{[10]uint32{0x0006266f, 0x02534fd8, 0x012ce4bc, 0x02dac47e, 0x029f1e9d, 0x021d7c75, 0x02fe2ba7, 0x01d6fce2, 0x02979085, 0x000b075f}}, Y: Field{[10]uint32{0x01a2cf7f, 0x008dc983, 0x02ff50ba, 0x0307f469, 0x038c6c8e, 0x030272c0, 0x03b4e4bb, 0x02f422ee, 0x00bc030a, 0x0027ac94}}}, + {X: Field{[10]uint32{0x004647ec, 0x0355be5d, 0x0174f0f6, 0x029f46ef, 0x03b44ada, 0x014be865, 0x0293b100, 0x02f0c9e0, 0x038bed4e, 0x002c4c3f}}, Y: Field{[10]uint32{0x02a5eb33, 0x01643ffb, 0x01806212, 0x002c3730, 0x000136f6, 0x019b908a, 0x03d0a950, 0x031fd9db, 0x01e9b785, 0x00128291}}}, + {X: Field{[10]uint32{0x030e6231, 0x00335432, 0x0011732a, 0x012b5a3c, 0x0029bf68, 0x03335c73, 0x02e9c740, 0x02cb64c6, 0x019762ec, 0x0013ca96}}, Y: Field{[10]uint32{0x00cf17de, 0x0302fd5f, 0x00237377, 0x005b3def, 0x000fc442, 0x00c27b70, 0x0300dde7, 0x01c20fe9, 0x01b45cfc, 0x0037afe3}}}, + {X: Field{[10]uint32{0x03a23c0b, 0x0034b781, 0x030d1cab, 0x002ea678, 0x020a178c, 0x02968936, 0x01419a18, 0x01b89790, 0x01a17fbe, 0x0025fe7a}}, Y: Field{[10]uint32{0x03559128, 0x03688c95, 0x03c0a4dd, 0x02ef9c74, 0x026cb622, 0x003ed4e1, 0x034fdc87, 0x02d2003e, 0x026b0cce, 0x0006ac48}}}, + {X: Field{[10]uint32{0x01d9d8cb, 0x00ed1f42, 0x02f4cbb9, 0x03c42b4f, 0x00bfd486, 0x02dc4250, 0x01820673, 0x0345f900, 0x03e5e9f5, 0x00385fcf}}, Y: Field{[10]uint32{0x01272f58, 0x00a40eed, 0x0196b59c, 0x018b80fb, 0x0344ad7d, 0x0014492b, 0x0360b263, 0x00ea29ac, 0x0252615d, 0x003c449a}}}, + {X: Field{[10]uint32{0x032fa2de, 0x02a2ed9e, 0x026887a5, 0x014eab0d, 0x033ae668, 0x00e283f8, 0x00c3e945, 0x02060a40, 0x00467d63, 0x00068e7e}}, Y: Field{[10]uint32{0x02903aa5, 0x037bd6e0, 0x027bf28d, 0x00feed15, 0x0118492f, 0x035f1d40, 0x034dc019, 0x0169390a, 0x03995a62, 0x002b9f04}}}, + {X: Field{[10]uint32{0x002f5320, 0x021a4bad, 0x03e68cd1, 0x0205450a, 0x00baa605, 0x013ebfee, 0x0293e52f, 0x03e91242, 0x006127f6, 0x00229777}}, Y: Field{[10]uint32{0x016b0d8e, 0x020346a2, 0x0338974c, 0x0297f1e1, 0x00328e69, 0x03577f30, 0x02559ebb, 0x0377c690, 0x0325853d, 0x0017ad88}}}, + {X: Field{[10]uint32{0x0238c299, 0x0387e73f, 0x0190f7af, 0x01bfc234, 0x02b86490, 0x01bd6d76, 0x03dc17d5, 0x035bf351, 0x03b574b7, 0x00045f6f}}, Y: Field{[10]uint32{0x0190196b, 0x036e3757, 0x03b26bd5, 0x00bdae40, 0x00c50471, 0x0009902a, 0x03bc9233, 0x0051390d, 0x015130b7, 0x0012b348}}}, + {X: Field{[10]uint32{0x0270a537, 0x02168e62, 0x019f3f29, 0x031d0606, 0x00eec84e, 0x01428a98, 0x010706d9, 0x01fad5cc, 0x0228431c, 0x002c30c4}}, Y: Field{[10]uint32{0x0064ff78, 0x0122c02c, 0x02419a10, 0x01f10e3f, 0x030085e4, 0x0183608d, 0x00c32372, 0x01dbffa6, 0x03347928, 0x0029f7a6}}}, + {X: Field{[10]uint32{0x0243946f, 0x0347c0fc, 0x017e08d1, 0x02196962, 0x02736cbc, 0x005d81af, 0x03e6d5b5, 0x009d6b85, 0x00b9f493, 0x001f0843}}, Y: Field{[10]uint32{0x0359c63a, 0x038d4a45, 0x02db1c38, 0x02b0c3eb, 0x00920a7f, 0x02bc7c77, 0x00a92d87, 0x006173a9, 0x0123a8bd, 0x0005ec1d}}}, + {X: Field{[10]uint32{0x02d6e650, 0x01c5841b, 0x00aa1387, 0x02cbd15c, 0x03177b14, 0x02c3b285, 0x017b5192, 0x03b5118e, 0x0167578b, 0x0005cb94}}, Y: Field{[10]uint32{0x03830ba7, 0x01f3614c, 0x00cee173, 0x005f07e2, 0x039d3ba8, 0x00f1ceb4, 0x03de8038, 0x02e01758, 0x012e4776, 0x0027055d}}}, + {X: Field{[10]uint32{0x00030686, 0x02738a88, 0x019ca47e, 0x03ceaa70, 0x02c95a6e, 0x036b6011, 0x02373173, 0x03f6840d, 0x0040df25, 0x000586bf}}, Y: Field{[10]uint32{0x026089ce, 0x0035bc04, 0x03759ab9, 0x0182d895, 0x009926f1, 0x0291783a, 0x039c8193, 0x017ddad2, 0x0083c126, 0x00179bf4}}}, + {X: Field{[10]uint32{0x0216a85f, 0x034fb0e2, 0x018d9459, 0x0243b854, 0x002d194e, 0x01b8e451, 0x0369cf8b, 0x03b4cd35, 0x02a8e18a, 0x002e647c}}, Y: Field{[10]uint32{0x03cab7b0, 0x03433586, 0x00e8b1a0, 0x003886ca, 0x017e6e59, 0x0248f4b0, 0x0169d3e0, 0x01c723a8, 0x01a6b89f, 0x00074aea}}}, + {X: Field{[10]uint32{0x00ca8afc, 0x0328c351, 0x035026f1, 0x0121f56a, 0x007d6233, 0x03ecd91f, 0x016f4881, 0x03b9dfde, 0x009f5a6c, 0x0036b81a}}, Y: Field{[10]uint32{0x039c329c, 0x03221cf0, 0x01fa8c6c, 0x02c0c533, 0x0143ccc1, 0x00ef96e5, 0x01e69643, 0x02eb8a85, 0x0270f730, 0x003b99ed}}}, + {X: Field{[10]uint32{0x027e4e41, 0x03f63b22, 0x02e61aea, 0x02905a84, 0x03d72805, 0x018a7ed6, 0x0217ba14, 0x0270551a, 0x00cd75f8, 0x0011e963}}, Y: Field{[10]uint32{0x01fdd889, 0x0153cf0a, 0x007679b9, 0x02e5cf65, 0x02a4bc43, 0x007f07c2, 0x03e60bb6, 0x02043ad2, 0x03ed1bbb, 0x0030579f}}}, + {X: Field{[10]uint32{0x03040e3c, 0x0026d11a, 0x01698cef, 0x01a57142, 0x02d7582f, 0x013bd96d, 0x000697c9, 0x01bb8cc3, 0x03d02e3b, 0x003deb8b}}, Y: Field{[10]uint32{0x0019ca03, 0x03762b75, 0x00ea36a9, 0x0195e64d, 0x015eb495, 0x037506b2, 0x00d8e6dd, 0x004e6f15, 0x00aac527, 0x002b7a7e}}}, + {X: Field{[10]uint32{0x0012989d, 0x0112365f, 0x00dc8b6c, 0x0091757e, 0x00ae61cf, 0x03091296, 0x03e9c214, 0x02b88235, 0x02a89be2, 0x000557e7}}, Y: Field{[10]uint32{0x01b009ff, 0x033a74d9, 0x036808c1, 0x003d3345, 0x00cf5ea6, 0x032fd124, 0x0204abe6, 0x03466bf6, 0x01f3840c, 0x0004813d}}}, + {X: Field{[10]uint32{0x029d74f6, 0x018598c7, 0x01a5189a, 0x02e404f1, 0x01e35057, 0x0034fb8e, 0x01348a0e, 0x017c53e9, 0x01c3933b, 0x002a0f32}}, Y: Field{[10]uint32{0x0072a74a, 0x0352ebfc, 0x021dbe30, 0x00468a0f, 0x0052b91d, 0x007ef91e, 0x02a9c78e, 0x0211d878, 0x02d7fad6, 0x00102a99}}}, + {X: Field{[10]uint32{0x03b5f5df, 0x030fa959, 0x02cce11f, 0x02f6fca9, 0x00d7acef, 0x02912d55, 0x00a20e0f, 0x01708ca6, 0x01cfc07b, 0x00329254}}, Y: Field{[10]uint32{0x01f4afc2, 0x004b13c2, 0x02050b80, 0x0115e161, 0x0235aac5, 0x00a31e66, 0x01791a6b, 0x032beb1e, 0x03d76700, 0x00061aa2}}}, + {X: Field{[10]uint32{0x02b6787c, 0x0339c4a7, 0x011a9ae0, 0x0296e11e, 0x01d6760b, 0x02f090e3, 0x031f2a0d, 0x00407d79, 0x01e61bad, 0x0033e4b7}}, Y: Field{[10]uint32{0x003bcbd8, 0x014f88d7, 0x0159528f, 0x027444df, 0x026c9d8a, 0x00a51638, 0x00c1f053, 0x0079af2f, 0x01b7f3e3, 0x0029f4d4}}}, + {X: Field{[10]uint32{0x029c1179, 0x01466144, 0x0287d08f, 0x02a5b8a9, 0x03b06154, 0x020fa2cd, 0x039df9be, 0x00a0e8ed, 0x033ecfd8, 0x002c6ac2}}, Y: Field{[10]uint32{0x01506bbf, 0x017435ba, 0x0305812d, 0x0254e0df, 0x0099e973, 0x0204a403, 0x034cd97b, 0x014d2907, 0x02f34bab, 0x00336dfc}}}, + {X: Field{[10]uint32{0x021789ce, 0x02549283, 0x0035424e, 0x028a62cc, 0x01197296, 0x00ffaeb6, 0x0399295f, 0x0327a13e, 0x03299cd4, 0x00285d0c}}, Y: Field{[10]uint32{0x037e1afe, 0x00bd75fd, 0x03fc4428, 0x02913cbc, 0x035bee11, 0x0373e9b5, 0x0078088a, 0x00d5ddbc, 0x02f44cf5, 0x00102653}}}, + {X: Field{[10]uint32{0x01c0573b, 0x02868af6, 0x01e0b0d0, 0x011981fc, 0x0338b318, 0x006954c5, 0x03b946a6, 0x02b1f0f1, 0x00864efc, 0x0000906d}}, Y: Field{[10]uint32{0x03a0d574, 0x03d72607, 0x0197c832, 0x0166eb4e, 0x002f9801, 0x02f2900f, 0x01f3ba8f, 0x00734cc9, 0x0048eec6, 0x001733a2}}}, + {X: Field{[10]uint32{0x0291b387, 0x00f8f937, 0x0137ed75, 0x01534960, 0x03e3efd3, 0x01e66ac2, 0x01559adf, 0x01e611a6, 0x02096499, 0x00207e20}}, Y: Field{[10]uint32{0x0226d15c, 0x031c79aa, 0x01967a32, 0x0266be8a, 0x0243bda5, 0x03cf3236, 0x01e5caa5, 0x01c1846e, 0x01b85bfd, 0x0023e7fb}}}, + {X: Field{[10]uint32{0x024e5a5b, 0x03d75251, 0x006fe8fb, 0x01ad955c, 0x00c22da9, 0x028bb095, 0x00793d64, 0x00851480, 0x0231bd2c, 0x00127590}}, Y: Field{[10]uint32{0x0351e825, 0x0350ccf1, 0x0302b548, 0x0100fc69, 0x01bf9864, 0x01c71b76, 0x01f81216, 0x00b2b607, 0x02dab0d7, 0x003ebb23}}}, + {X: Field{[10]uint32{0x026e0ae4, 0x01f6db41, 0x029387e7, 0x013651db, 0x006daea2, 0x02dd0260, 0x03e1f159, 0x00e90471, 0x00324fad, 0x001d3053}}, Y: Field{[10]uint32{0x00641a41, 0x01ce2038, 0x009fd5aa, 0x0176af6e, 0x013ee016, 0x011b9ad9, 0x031a2cb9, 0x03972fc0, 0x02031fbe, 0x002bde54}}}, + {X: Field{[10]uint32{0x02a1e7c3, 0x012db5c4, 0x011b2a98, 0x00674276, 0x00930f9c, 0x004e0f1b, 0x03f42158, 0x036532f8, 0x009c7342, 0x00222f08}}, Y: Field{[10]uint32{0x005b3e08, 0x03265313, 0x02a2346a, 0x03985606, 0x01b817eb, 0x00a1d843, 0x0288866e, 0x021c8e26, 0x034576dd, 0x002b2df5}}}, + {X: Field{[10]uint32{0x026eb3f8, 0x0361738a, 0x02e77c1b, 0x01099daa, 0x0009bee2, 0x0285497d, 0x03b93c85, 0x02a2337d, 0x0068c81c, 0x00121b23}}, Y: Field{[10]uint32{0x03e52d54, 0x03749bd3, 0x0234ec1a, 0x0013eccf, 0x01d62490, 0x03d79a12, 0x02648706, 0x02a5f357, 0x014b035f, 0x00383fb2}}}, + {X: Field{[10]uint32{0x00a681a3, 0x033ae401, 0x02f14e28, 0x00f5b97e, 0x03ba3904, 0x034377cd, 0x01e30fb5, 0x02388ded, 0x02116c58, 0x001287be}}, Y: Field{[10]uint32{0x017b64f4, 0x03efc6a6, 0x00d538fc, 0x030506f6, 0x0365f2ac, 0x02f391db, 0x0137dd31, 0x01c596a2, 0x03373c90, 0x002ec659}}}, + {X: Field{[10]uint32{0x00eb28d2, 0x0110a51e, 0x0392f8da, 0x016dfdfd, 0x002632e8, 0x03bf9eed, 0x0317f308, 0x0027b436, 0x0006c696, 0x0035dd17}}, Y: Field{[10]uint32{0x01b96a73, 0x00fc208e, 0x0297cad1, 0x001fdc0a, 0x025371f0, 0x006b76c6, 0x0046e11b, 0x00af557f, 0x02754d1b, 0x0001d5d6}}}, + {X: Field{[10]uint32{0x03e68def, 0x01ebe90a, 0x015f49ca, 0x0143f666, 0x00dc333d, 0x03dd2a1f, 0x0208cedd, 0x009f1a9a, 0x032ea3db, 0x002f5d4b}}, Y: Field{[10]uint32{0x01e9491a, 0x03b0e2e9, 0x024d791d, 0x01b76a70, 0x02ef5c57, 0x01b54318, 0x00725ed2, 0x023482e9, 0x02af6747, 0x000de3e2}}}, + {X: Field{[10]uint32{0x03224d21, 0x0115ec07, 0x001f94be, 0x0131fccc, 0x0055eb30, 0x03380357, 0x0202bffa, 0x031faf19, 0x033315a3, 0x003bd620}}, Y: Field{[10]uint32{0x03517abd, 0x02830482, 0x0123ff46, 0x01532d69, 0x01eb52e0, 0x0210dd47, 0x01a95f7e, 0x037ef8f6, 0x02ab6253, 0x0015bace}}}, + {X: Field{[10]uint32{0x0253727a, 0x031810d4, 0x01f1fc1d, 0x0339fb7c, 0x0106b495, 0x010b7c90, 0x01beea4f, 0x02097682, 0x03747355, 0x000b0778}}, Y: Field{[10]uint32{0x03a150c2, 0x00ec74e1, 0x0058873a, 0x0340a34b, 0x005ff92c, 0x01dd9caa, 0x01986bdf, 0x03d7623e, 0x02609082, 0x0026164d}}}, + {X: Field{[10]uint32{0x000daf99, 0x03fd43ca, 0x02535324, 0x008aa23c, 0x00b78e2a, 0x03ce6cba, 0x00c90016, 0x000503d4, 0x031b23e6, 0x00127e35}}, Y: Field{[10]uint32{0x018b04ec, 0x024ea1ad, 0x0254622b, 0x03207f90, 0x00308111, 0x03dbf788, 0x00ec3393, 0x039f70cc, 0x02654807, 0x003d9aed}}}, + {X: Field{[10]uint32{0x009f37be, 0x0185eac6, 0x03ceb6df, 0x01e36d64, 0x02d18fdf, 0x0153ce94, 0x02a30f99, 0x018728ac, 0x0385754b, 0x000d9727}}, Y: Field{[10]uint32{0x0132825e, 0x00169054, 0x01a3af14, 0x000488da, 0x007681b6, 0x0028c9e5, 0x026aced6, 0x01af2ffe, 0x03e6aca5, 0x00310ffb}}}, + {X: Field{[10]uint32{0x01f1b5af, 0x013a2fc8, 0x023108e2, 0x00f86612, 0x027e2cb5, 0x028c473c, 0x02446c4d, 0x01a3b706, 0x03e9e896, 0x00073cb3}}, Y: Field{[10]uint32{0x00c966b7, 0x007bd688, 0x03803673, 0x004b8b2b, 0x03aebc7b, 0x029a17c8, 0x038f1041, 0x00c251ed, 0x01ac43c5, 0x001c795b}}}, + {X: Field{[10]uint32{0x008ca3ec, 0x03398dad, 0x03d5225d, 0x03e38072, 0x02219694, 0x01fa1de5, 0x011c26fa, 0x00089bce, 0x00796266, 0x003ccc0d}}, Y: Field{[10]uint32{0x02762827, 0x023e3e98, 0x030026f4, 0x03215aa4, 0x02afa585, 0x013e0e90, 0x0359ab87, 0x03a5176e, 0x03f4c110, 0x001f7a82}}}, + {X: Field{[10]uint32{0x00b27154, 0x030c94f9, 0x02df0587, 0x01a46b9e, 0x008756a9, 0x008a5fa8, 0x00664f90, 0x01b220e6, 0x004c4bc1, 0x002da249}}, Y: Field{[10]uint32{0x0050c856, 0x03466a39, 0x00364c27, 0x02b971c0, 0x00bd7483, 0x02d29d68, 0x03f89a90, 0x00da3325, 0x03481357, 0x0026d221}}}, + {X: Field{[10]uint32{0x038cbe41, 0x02c45018, 0x00517f3e, 0x00089035, 0x01a78b43, 0x0392f808, 0x032f8745, 0x00dc73fb, 0x00d2d6b4, 0x002fcd3f}}, Y: Field{[10]uint32{0x0397ac02, 0x01386557, 0x03546546, 0x00e09fd9, 0x001ef6a2, 0x006d0ef0, 0x0372914e, 0x01baba39, 0x00d27e32, 0x00339a22}}}, + {X: Field{[10]uint32{0x018d74fe, 0x03520844, 0x01cd110e, 0x018f116e, 0x00d51ffe, 0x01300094, 0x005a5944, 0x031e5b3a, 0x026d231b, 0x0030825e}}, Y: Field{[10]uint32{0x03e4ac87, 0x002da82f, 0x0372b135, 0x00f96e67, 0x01d1f92b, 0x0299d221, 0x023a85ac, 0x0305cf87, 0x0013fc4a, 0x00162c19}}}, + {X: Field{[10]uint32{0x017afa81, 0x01a8cc10, 0x026184d4, 0x0261036c, 0x02e3e817, 0x03191eba, 0x011b1de3, 0x0013cc28, 0x02223d88, 0x0021d298}}, Y: Field{[10]uint32{0x0380b429, 0x00e83b6b, 0x00f8f6b1, 0x03803bdc, 0x02b31668, 0x03263cd5, 0x02b181d5, 0x03988a5d, 0x01f67986, 0x00104ca9}}}, + {X: Field{[10]uint32{0x01bc605c, 0x021382bd, 0x03b85b97, 0x00f332a8, 0x021f2846, 0x0030fb51, 0x002227ab, 0x03564a05, 0x028a1a05, 0x002b1f1b}}, Y: Field{[10]uint32{0x018a2186, 0x02c52cc4, 0x00da4a08, 0x036da1e5, 0x01c107a9, 0x018fd71c, 0x0260a0a9, 0x00ce5fae, 0x0195581e, 0x00069668}}}, + {X: Field{[10]uint32{0x0333342c, 0x02c58e8c, 0x00a65575, 0x02e0bc95, 0x0344bc12, 0x005c5697, 0x0075c01a, 0x028fd822, 0x02d8d825, 0x000fc4f8}}, Y: Field{[10]uint32{0x0025e3b7, 0x00fe8716, 0x02724339, 0x033f5ee9, 0x036a2e6e, 0x02d788a4, 0x02f76a68, 0x009847ff, 0x0082fb2c, 0x002ebfda}}}, + {X: Field{[10]uint32{0x03a8fe2d, 0x03e57b2f, 0x03cec4d5, 0x003d327d, 0x01aa7e40, 0x007418c3, 0x03e26315, 0x01fce770, 0x0354515e, 0x0007afac}}, Y: Field{[10]uint32{0x025c85cf, 0x02847deb, 0x02daca6c, 0x02e6131c, 0x00c70724, 0x00617ce9, 0x00a2473c, 0x03373ce1, 0x00ef00c2, 0x0028b8d7}}}, + {X: Field{[10]uint32{0x0202b2ab, 0x00668777, 0x019a0d2d, 0x027388ae, 0x00b47d8f, 0x004ad176, 0x0059218d, 0x039d979b, 0x0365b211, 0x0030b736}}, Y: Field{[10]uint32{0x00f3be50, 0x01bd4389, 0x01237b14, 0x00cb25ad, 0x028722e0, 0x00967e21, 0x009326e9, 0x0045e9ca, 0x039ca960, 0x00382a96}}}, + {X: Field{[10]uint32{0x00bc0d45, 0x03a1e459, 0x01b85841, 0x02e09c32, 0x0207f360, 0x000e3db1, 0x02ed8a9c, 0x03451238, 0x01f7e2a9, 0x0012575a}}, Y: Field{[10]uint32{0x017088d2, 0x03d67825, 0x003e70bd, 0x02f84d0a, 0x03c48584, 0x013eb1bd, 0x034465d7, 0x0339ee0e, 0x022a1dab, 0x0017ecff}}}, + {X: Field{[10]uint32{0x0053bab2, 0x01eb21cd, 0x0169d203, 0x01deeb56, 0x01270a94, 0x0368fd45, 0x01be43d8, 0x0393e5c0, 0x01692139, 0x0033ab11}}, Y: Field{[10]uint32{0x00908070, 0x00b05811, 0x00b3bca3, 0x01035548, 0x02f385ea, 0x01812dac, 0x002f2bd9, 0x03a1cad8, 0x01d815f4, 0x002f47f6}}}, + {X: Field{[10]uint32{0x01407e0d, 0x015625c2, 0x0140682f, 0x006835b3, 0x034e6dba, 0x002881ab, 0x01284cbc, 0x02e30073, 0x00b93196, 0x001fb474}}, Y: Field{[10]uint32{0x012801c5, 0x03286287, 0x00e0af1b, 0x03036103, 0x0111018e, 0x035d6a71, 0x034ee732, 0x002f988b, 0x02c96ba6, 0x003a568e}}}, + {X: Field{[10]uint32{0x01040b04, 0x02dc5e28, 0x010fba24, 0x02c84c49, 0x03ac5fe4, 0x02e9f325, 0x00fd4365, 0x033b2250, 0x03664f42, 0x0001cbec}}, Y: Field{[10]uint32{0x007dce41, 0x028994f1, 0x029bcdbb, 0x0372887b, 0x0063d551, 0x02d4b3a4, 0x01e5c9b4, 0x0047d7d7, 0x031a93a2, 0x0003060a}}}, + {X: Field{[10]uint32{0x0008beea, 0x0183c118, 0x00309021, 0x00b56455, 0x03469019, 0x00f9b615, 0x0320043d, 0x00791759, 0x018c9ca9, 0x003741b3}}, Y: Field{[10]uint32{0x001e7ecd, 0x021771b1, 0x03ce272b, 0x016e402c, 0x01418970, 0x020faf60, 0x03a8a7ee, 0x03a8efe7, 0x03276eeb, 0x0033705c}}}, + {X: Field{[10]uint32{0x0178cd13, 0x02a6a64e, 0x00743da8, 0x010c0b8b, 0x003c708c, 0x02ffb6c4, 0x02504398, 0x01fc3c79, 0x0129e90a, 0x000203d8}}, Y: Field{[10]uint32{0x01deb82a, 0x009b53ce, 0x0000fe72, 0x0208e0a3, 0x02d95a30, 0x016d9129, 0x02f594f8, 0x03bfd28f, 0x0012145f, 0x001d365e}}}, + {X: Field{[10]uint32{0x005995b6, 0x0309f9c4, 0x01b24f5b, 0x00f13014, 0x020b48f8, 0x02bee774, 0x02970afb, 0x01422bbb, 0x00daf56b, 0x0015abcd}}, Y: Field{[10]uint32{0x01ae68bf, 0x02ac37b4, 0x0334d8a3, 0x016b7317, 0x03decca6, 0x00867734, 0x0105a4cc, 0x02386624, 0x02529e78, 0x0035077f}}}, + {X: Field{[10]uint32{0x023f91ee, 0x00f11393, 0x001f6ca3, 0x024e8687, 0x00148cf6, 0x01a27647, 0x005e29c4, 0x0196d031, 0x01ba7955, 0x00208089}}, Y: Field{[10]uint32{0x024b7db4, 0x000a2fae, 0x03334b24, 0x03c52ce1, 0x0011a0f4, 0x01e09a4a, 0x02bf5a31, 0x0270b819, 0x025bc89b, 0x000d88ab}}}, + {X: Field{[10]uint32{0x02ea57d2, 0x008cafa8, 0x037033bf, 0x02c5594a, 0x03ad388d, 0x0231fc27, 0x01a1b7ca, 0x0080aa25, 0x01bfcfcc, 0x001e497f}}, Y: Field{[10]uint32{0x0290525c, 0x00dcc253, 0x00d0a9dc, 0x0072a105, 0x021ebcc2, 0x01b4fd7c, 0x019cf5ec, 0x01f72455, 0x0301c9cb, 0x0011bdfb}}}, + {X: Field{[10]uint32{0x01d81808, 0x01fd8341, 0x039f6102, 0x012a6ffd, 0x02663879, 0x036f4ac7, 0x03316eb8, 0x039cc416, 0x036af38a, 0x0012c892}}, Y: Field{[10]uint32{0x015c3dac, 0x03e72c56, 0x029d423f, 0x02207f19, 0x00b6dc68, 0x007ff96d, 0x032ad2e1, 0x00c00aee, 0x0208b163, 0x000c50fa}}}, + {X: Field{[10]uint32{0x007380ee, 0x02bc831a, 0x013cd28d, 0x0192a904, 0x022c1bdd, 0x01b39223, 0x02a1a36e, 0x03d3ad80, 0x03fa4135, 0x000b01d9}}, Y: Field{[10]uint32{0x03bc16a7, 0x006f8ec3, 0x0389a5f7, 0x00ac4142, 0x0006a65d, 0x004dcf78, 0x002da710, 0x00c185f3, 0x03fce78d, 0x003770fb}}}, + {X: Field{[10]uint32{0x00a7ae7c, 0x0366ee94, 0x01ef1982, 0x03097544, 0x0137b5a2, 0x006a7e0d, 0x02ed2d94, 0x026a13bd, 0x013ee717, 0x0020e0df}}, Y: Field{[10]uint32{0x03b66dbe, 0x00092db8, 0x008d8556, 0x03c9e51b, 0x01fe2294, 0x029809ed, 0x02f1a495, 0x01ed32a1, 0x02166095, 0x00188807}}}, + {X: Field{[10]uint32{0x0095387a, 0x009c4256, 0x01d9bda4, 0x027875c3, 0x0225e50d, 0x00d6fc76, 0x028e0118, 0x03c15d4e, 0x0334e560, 0x0033c1d6}}, Y: Field{[10]uint32{0x02127018, 0x001c6128, 0x02a1404b, 0x03746035, 0x032b11d8, 0x00f7ce35, 0x0219f6f3, 0x03d348e3, 0x01d0330f, 0x0031cc82}}}, + {X: Field{[10]uint32{0x008931a4, 0x006e20df, 0x0329dcb0, 0x00b04020, 0x039d06ba, 0x0038faed, 0x00680300, 0x01d747bd, 0x00ff9b18, 0x003560fe}}, Y: Field{[10]uint32{0x03ae3292, 0x02f94f1b, 0x0258cd55, 0x0270ccee, 0x00aaac7c, 0x0165ad42, 0x03cfcc69, 0x024ae9af, 0x031c03f0, 0x003e33f3}}}, + {X: Field{[10]uint32{0x03eaefaa, 0x006de490, 0x02220343, 0x02cb687f, 0x0327568b, 0x010bb6c6, 0x01853723, 0x00e26ff0, 0x01b621d2, 0x001547fa}}, Y: Field{[10]uint32{0x023c24e0, 0x02b74095, 0x023d8c3b, 0x03fa5c48, 0x03ff48e5, 0x03cc4467, 0x02ff5057, 0x018f331a, 0x004ae485, 0x001b1da4}}}, + {X: Field{[10]uint32{0x016a80b2, 0x018fdbb4, 0x02da9a9d, 0x0252f239, 0x0051f063, 0x0339f264, 0x0162be7b, 0x00bc92c2, 0x00fc7406, 0x0006edde}}, Y: Field{[10]uint32{0x01d88318, 0x0385d018, 0x03bdb14b, 0x00bc775e, 0x0260e935, 0x03fc0dbe, 0x02700b68, 0x03459cf4, 0x013d2f4e, 0x0009d53d}}}, + {X: Field{[10]uint32{0x03e364aa, 0x00ff8439, 0x03be6e4a, 0x0313a5f3, 0x01aa0744, 0x03fe354e, 0x009f1a93, 0x0160be25, 0x02f71261, 0x00028542}}, Y: Field{[10]uint32{0x02ea4773, 0x037dc87a, 0x03ab99e0, 0x03b57e5b, 0x03100737, 0x01b86fd1, 0x02124715, 0x01c70be7, 0x02fea686, 0x00388a86}}}, + {X: Field{[10]uint32{0x032e2a9e, 0x00b856b9, 0x0380b724, 0x02f095e1, 0x00835ed2, 0x023a4f5a, 0x0163a030, 0x037e475e, 0x03df727f, 0x003253b0}}, Y: Field{[10]uint32{0x0152009c, 0x00d3485c, 0x030d50a9, 0x0042cfd5, 0x02011b28, 0x003eb427, 0x0312b35f, 0x014f1518, 0x00e97bda, 0x00291da8}}}, + {X: Field{[10]uint32{0x0146875a, 0x02d97dfc, 0x03f255f8, 0x0285e131, 0x02f186bd, 0x008d69ca, 0x01427394, 0x00c8c5f1, 0x01dbebe1, 0x000cd9ae}}, Y: Field{[10]uint32{0x0345d3cf, 0x00c9c984, 0x01862eea, 0x0064805c, 0x026b6206, 0x010e4657, 0x03213835, 0x00a22508, 0x007895f5, 0x00017a89}}}, + {X: Field{[10]uint32{0x00e8ba25, 0x030e3978, 0x02373974, 0x02f91130, 0x0358bec6, 0x0024acae, 0x005ef365, 0x0197b32e, 0x026ce522, 0x00185b23}}, Y: Field{[10]uint32{0x01aa0970, 0x0126fc73, 0x033caba0, 0x0240bc7b, 0x02724a98, 0x03d04926, 0x03286f45, 0x00963362, 0x01433d6e, 0x00134f55}}}, + {X: Field{[10]uint32{0x02651827, 0x008a47da, 0x00b1d043, 0x0298c825, 0x032617b3, 0x01177129, 0x001d86ef, 0x03a13a2e, 0x01772e38, 0x001d37c8}}, Y: Field{[10]uint32{0x02e01334, 0x011b6308, 0x0360c487, 0x0071a86c, 0x032a9ccf, 0x0326e695, 0x00abc6f9, 0x02549ff1, 0x03af30f0, 0x000130ca}}}, + {X: Field{[10]uint32{0x01accbd1, 0x03f14008, 0x00ce5d68, 0x0366fb83, 0x02532f8d, 0x03bd0bea, 0x01966d15, 0x0114ca5e, 0x01bf76b7, 0x00060528}}, Y: Field{[10]uint32{0x00d46bdc, 0x02feeb6b, 0x02ef3154, 0x01b826cb, 0x037af174, 0x03ea4ee6, 0x0205ad25, 0x0350e6c8, 0x01ff0da9, 0x0017d77d}}}, + {X: Field{[10]uint32{0x018625cc, 0x01db00ae, 0x02975c74, 0x019b108a, 0x035f444d, 0x03a17ef6, 0x01f22878, 0x01d49aeb, 0x029498ff, 0x000a2447}}, Y: Field{[10]uint32{0x02638537, 0x03240f07, 0x01ada5e4, 0x02ef8e02, 0x02eac150, 0x02c886e9, 0x0069542f, 0x01801a76, 0x00f35cf2, 0x00168d07}}}, + {X: Field{[10]uint32{0x01270865, 0x0343bf8a, 0x0279abd6, 0x006f9913, 0x02f441ce, 0x0227a1a1, 0x01ce2926, 0x011570e8, 0x0371e82a, 0x00356b3f}}, Y: Field{[10]uint32{0x0126d5e8, 0x031f6007, 0x0070e00d, 0x025a5636, 0x03ca8cde, 0x0344fc0c, 0x004971aa, 0x03a5c281, 0x008f1b46, 0x002ab1b5}}}, + {X: Field{[10]uint32{0x02711596, 0x002638b8, 0x00b6a91f, 0x015d4401, 0x008f03fc, 0x00842545, 0x0365e173, 0x00361675, 0x001b0221, 0x00173d47}}, Y: Field{[10]uint32{0x02d5c3b3, 0x016f73c9, 0x01838f39, 0x03ba8e65, 0x00017fe9, 0x028a8852, 0x031e58ea, 0x03d164b0, 0x01e0610d, 0x0007bac6}}}, +} + +var preG128 = []XY{ + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x01ccf6b0, 0x03ece915, 0x01341501, 0x02ba8b51, 0x003d633d, 0x037b61f3, 0x018878e3, 0x014473cb, 0x00e9dbce, 0x00378ad7}}, Y: Field{[10]uint32{0x01100666, 0x00a7adc4, 0x018bb348, 0x016b198c, 0x0065b8c4, 0x02c68dd1, 0x03717e98, 0x038386ef, 0x02f3d3c3, 0x003c415d}}}, + {X: Field{[10]uint32{0x03c03c56, 0x005182c4, 0x0258b26b, 0x02977919, 0x0329659c, 0x03048485, 0x0259fbd7, 0x028bf87a, 0x01ffd491, 0x00341ef7}}, Y: Field{[10]uint32{0x03405ce7, 0x00fd830a, 0x02ea76be, 0x03fe330b, 0x0161d963, 0x00778135, 0x01c40e2a, 0x025f743e, 0x0308cd3c, 0x002cab51}}}, + {X: Field{[10]uint32{0x036a4d51, 0x036ad06e, 0x0025710e, 0x01710d2e, 0x010f8da4, 0x025b3a38, 0x025ec4c3, 0x005abcdd, 0x027c5d30, 0x0020900f}}, Y: Field{[10]uint32{0x03463b19, 0x024bab5e, 0x03c1b11e, 0x03313b19, 0x0199ab6c, 0x00fa1014, 0x016baddb, 0x02dd9d11, 0x021be27c, 0x00034259}}}, + {X: Field{[10]uint32{0x010680cf, 0x032d219d, 0x0023f438, 0x00f65507, 0x01930f93, 0x0132bd36, 0x03faa58c, 0x009bd498, 0x0131fbd6, 0x003ab70c}}, Y: Field{[10]uint32{0x0087a914, 0x0253fc4b, 0x01a74360, 0x02770de4, 0x01a388fb, 0x01cb5740, 0x024b36c9, 0x02a25d71, 0x03b1c9b4, 0x0034f25d}}}, + {X: Field{[10]uint32{0x007987d9, 0x03ca427f, 0x038ac609, 0x0172ddf9, 0x0336bdd6, 0x019d23d3, 0x018a4b38, 0x03fc9314, 0x025f6758, 0x000e40fb}}, Y: Field{[10]uint32{0x002be83b, 0x03f8ab86, 0x028dab0c, 0x0061249e, 0x018d222a, 0x0348d1d2, 0x0115934b, 0x01075902, 0x014ea152, 0x0003a486}}}, + {X: Field{[10]uint32{0x03e6a5d9, 0x007e2096, 0x00e9323e, 0x010f6efe, 0x015759c3, 0x026a7c86, 0x035bdccf, 0x01228e11, 0x037839ab, 0x0034200e}}, Y: Field{[10]uint32{0x00582f0b, 0x012a4999, 0x01d24289, 0x01b39474, 0x0004ecf0, 0x00e2ebe9, 0x02ec15fb, 0x0325fa84, 0x0180ff29, 0x000b30ec}}}, + {X: Field{[10]uint32{0x00567ed0, 0x018a3ef0, 0x02c19215, 0x008f6a39, 0x018496dd, 0x033e2f81, 0x013a5aea, 0x01d26685, 0x0096b18a, 0x0007d5bc}}, Y: Field{[10]uint32{0x039dff58, 0x004f2d0d, 0x000d51fc, 0x03d06a4f, 0x01c94189, 0x02d9735a, 0x00044360, 0x03d2420c, 0x038a3b52, 0x003fbc8a}}}, + {X: Field{[10]uint32{0x038e213b, 0x03f016d8, 0x032974e0, 0x033f3c80, 0x0079e947, 0x008d2a8c, 0x006f5250, 0x01d0cb8e, 0x01b1a4a4, 0x000767da}}, Y: Field{[10]uint32{0x00d4ccbb, 0x00575bb9, 0x0372041f, 0x02cf4fdb, 0x005438d5, 0x00ac7689, 0x00500c3a, 0x001d86ce, 0x0017949c, 0x0036263b}}}, + {X: Field{[10]uint32{0x03629efd, 0x016a773e, 0x008b1aeb, 0x01537200, 0x00552133, 0x01719eb4, 0x03c43610, 0x032de04b, 0x01134d9d, 0x00004a32}}, Y: Field{[10]uint32{0x03e67c96, 0x01060602, 0x036e45ff, 0x0393b1bd, 0x02c160c8, 0x00267598, 0x03259360, 0x00984365, 0x014add15, 0x003fb8f9}}}, + {X: Field{[10]uint32{0x011a9685, 0x0038f643, 0x011fc49c, 0x015238b1, 0x00301f28, 0x01d581d7, 0x00b8d519, 0x02e53491, 0x012f5a95, 0x00087b00}}, Y: Field{[10]uint32{0x00de08ae, 0x0237864f, 0x00162d12, 0x029bf57f, 0x027418ed, 0x02527ca3, 0x03fef716, 0x0125fd31, 0x010577af, 0x000b7bc8}}}, + {X: Field{[10]uint32{0x02331cc5, 0x008a0d8f, 0x0311c584, 0x039df6be, 0x00761c3b, 0x031f3f1d, 0x0080e894, 0x022f0279, 0x0202fb9d, 0x001a23d4}}, Y: Field{[10]uint32{0x03302cd3, 0x02708631, 0x03d9462d, 0x02be27ba, 0x001a393e, 0x00900d0d, 0x007cabd9, 0x01069cbb, 0x015963b5, 0x0025ae9f}}}, + {X: Field{[10]uint32{0x03f02baf, 0x034ead3d, 0x03f682e4, 0x03bc3a2e, 0x010744d0, 0x0029434d, 0x0314c300, 0x02a3d6cc, 0x02ea1cb9, 0x003ed727}}, Y: Field{[10]uint32{0x03630418, 0x015fa77e, 0x02af0911, 0x0331f949, 0x006868e0, 0x01717a57, 0x028bd269, 0x031547ec, 0x0044e18f, 0x000a7ee2}}}, + {X: Field{[10]uint32{0x02c03421, 0x00d89732, 0x0380de0b, 0x03b1ed48, 0x01593168, 0x012a7787, 0x01f6a5d8, 0x02b8fcbd, 0x03e22eed, 0x003c51e7}}, Y: Field{[10]uint32{0x02764606, 0x015acb88, 0x02131cb8, 0x003120d4, 0x01c0b463, 0x03ef4d06, 0x0350d1a3, 0x022e084e, 0x015d2fd8, 0x0006990b}}}, + {X: Field{[10]uint32{0x031a7950, 0x0171ecaf, 0x0165a69f, 0x01eca261, 0x0200f60f, 0x03f83bfe, 0x005b0e09, 0x025dd24f, 0x01c5e819, 0x00089cfb}}, Y: Field{[10]uint32{0x027bda12, 0x02b8e7bf, 0x03530906, 0x03f13d42, 0x00b64691, 0x021254d6, 0x031a1df9, 0x01e364a7, 0x02388fd9, 0x002ceba8}}}, + {X: Field{[10]uint32{0x03ef5214, 0x0016b5e6, 0x0285656f, 0x03d2c518, 0x03496d59, 0x02ce768b, 0x03d10b32, 0x010de2d1, 0x000c3050, 0x00267e12}}, Y: Field{[10]uint32{0x0264b2cd, 0x029eb998, 0x0215171d, 0x00df9398, 0x02d930e4, 0x02d6aa67, 0x00bd397c, 0x010a1a36, 0x015d8e22, 0x00380075}}}, + {X: Field{[10]uint32{0x016a6f1f, 0x0195aea6, 0x03635bc9, 0x03561fd5, 0x0209c000, 0x024f2190, 0x00fdfc69, 0x004a035d, 0x017fe475, 0x0000e089}}, Y: Field{[10]uint32{0x0351d474, 0x01caab62, 0x019731c6, 0x00e78d96, 0x0130dbfa, 0x01ad7c7e, 0x01a4f1da, 0x032c1899, 0x033dfe52, 0x0030b71c}}}, + {X: Field{[10]uint32{0x00efb24b, 0x01179ffb, 0x034526e1, 0x03e7db57, 0x0262e5ea, 0x02b3211e, 0x01f4e1b2, 0x00e1af91, 0x02329125, 0x0008e84d}}, Y: Field{[10]uint32{0x016854c0, 0x0057d566, 0x03a6f49f, 0x01c0dcd2, 0x01413cc3, 0x03dc557c, 0x03817a1a, 0x02e888af, 0x037e0643, 0x00244a5d}}}, + {X: Field{[10]uint32{0x01149f0b, 0x002b0d5e, 0x039d48a3, 0x00f71102, 0x008cf559, 0x031737b5, 0x01791a18, 0x01937a8d, 0x026058a6, 0x0019967a}}, Y: Field{[10]uint32{0x02f2199d, 0x0031b5ac, 0x031ffc82, 0x036394d3, 0x035300d1, 0x010bf1b0, 0x007b69e7, 0x020dbecd, 0x0305a85d, 0x000ab731}}}, + {X: Field{[10]uint32{0x03a939fc, 0x0299f746, 0x01033037, 0x021d0508, 0x022899b4, 0x027f4a8f, 0x00e6f6c8, 0x034ed1fb, 0x03c6e1ac, 0x0014b70e}}, Y: Field{[10]uint32{0x03d05746, 0x03a270d0, 0x013e2709, 0x028fb946, 0x031e8f6b, 0x0168f13f, 0x003d9da1, 0x0041fef6, 0x034632ad, 0x00176bac}}}, + {X: Field{[10]uint32{0x01573551, 0x01dac435, 0x034f6173, 0x03add7c1, 0x01693fbc, 0x03251ef0, 0x01189ba9, 0x015d16f6, 0x029793cd, 0x001492ca}}, Y: Field{[10]uint32{0x00c80b71, 0x011b86ef, 0x02ca02d1, 0x0318f7b3, 0x01a6865a, 0x03a28bed, 0x02b92cc3, 0x03ec6a77, 0x01d6cb23, 0x0027a026}}}, + {X: Field{[10]uint32{0x0382756e, 0x01e45585, 0x029976fe, 0x02579641, 0x03525b7b, 0x02583a6d, 0x03e6c3dd, 0x01654e48, 0x01a8e2bc, 0x001cc860}}, Y: Field{[10]uint32{0x022e4823, 0x0318869c, 0x01d84eda, 0x0258523c, 0x03e3c42d, 0x02eba62a, 0x03a193c0, 0x03ac290a, 0x02b35592, 0x000945b1}}}, + {X: Field{[10]uint32{0x0102664b, 0x01c04479, 0x0315d8d5, 0x00f7ddba, 0x0249a7ae, 0x00bbdbf2, 0x038496ac, 0x00e3f7cc, 0x002d926e, 0x002e3a25}}, Y: Field{[10]uint32{0x02faf8eb, 0x00bd7b6f, 0x01d77f79, 0x0105a794, 0x03972486, 0x000c79b1, 0x0270ba22, 0x01623935, 0x016e7dea, 0x001e6435}}}, + {X: Field{[10]uint32{0x0098e4e5, 0x006de5f8, 0x001ae18d, 0x03989e25, 0x0119e744, 0x037733de, 0x00ac11e7, 0x02affdcb, 0x00f63e73, 0x000513a2}}, Y: Field{[10]uint32{0x0021837c, 0x027e0f0c, 0x02b3b4e0, 0x033df70b, 0x01158705, 0x029518cf, 0x018197fe, 0x03195431, 0x03f35df3, 0x00018f36}}}, + {X: Field{[10]uint32{0x003a9081, 0x023bef57, 0x0303975b, 0x024da055, 0x0160e5bc, 0x0271cf8f, 0x016a739c, 0x033638b4, 0x03dc489e, 0x00250db8}}, Y: Field{[10]uint32{0x01a7e59c, 0x002fd80e, 0x02d5e03a, 0x02cace99, 0x038e8d76, 0x02a139fd, 0x02a7806e, 0x01baff46, 0x031f50cb, 0x00051814}}}, + {X: Field{[10]uint32{0x00890db9, 0x01b09d48, 0x01e76193, 0x00177d9a, 0x03e840e0, 0x01c43464, 0x019b01a1, 0x03442d1b, 0x01617a56, 0x00274f09}}, Y: Field{[10]uint32{0x00521ea3, 0x019f38de, 0x02aca044, 0x0337a2bc, 0x001f89ff, 0x00b6a6e5, 0x01fee9b8, 0x03a6f30b, 0x00bc4c4a, 0x001aef70}}}, + {X: Field{[10]uint32{0x03db76c8, 0x02a1418f, 0x01d2d0dd, 0x02a2c398, 0x02d0aca5, 0x0114f13c, 0x00c6ae0b, 0x01fe2f86, 0x0250f51b, 0x000a7e63}}, Y: Field{[10]uint32{0x00e5d28f, 0x0038f1fc, 0x01186df8, 0x00c2b4de, 0x0358a6ec, 0x01016018, 0x02b8b211, 0x000c71cf, 0x00dcae8e, 0x0036bcef}}}, + {X: Field{[10]uint32{0x01c22c94, 0x02bc1d13, 0x02e1a538, 0x014a535d, 0x0217a897, 0x0375811b, 0x0005e311, 0x02a8d806, 0x00c2c71d, 0x00359f4c}}, Y: Field{[10]uint32{0x014f670c, 0x00452ee9, 0x03d969c1, 0x02faabd2, 0x00e87ebb, 0x00b81a33, 0x02e690aa, 0x001ec2e4, 0x00e712c8, 0x00122e6c}}}, + {X: Field{[10]uint32{0x03c81649, 0x019809cb, 0x00334835, 0x02e65e9e, 0x03059aa7, 0x0340e805, 0x032c9b76, 0x030b92dd, 0x03a88ce9, 0x003c8b0a}}, Y: Field{[10]uint32{0x01b7028f, 0x001bf77e, 0x019a3cbc, 0x02a4233e, 0x022d92dc, 0x015c09c2, 0x03a4e0f1, 0x02f85890, 0x0310f190, 0x001aaa79}}}, + {X: Field{[10]uint32{0x02c5f894, 0x00c25a66, 0x034a5eff, 0x03b73f01, 0x0336b722, 0x03bcc8d3, 0x02533c90, 0x01320f94, 0x018d06b9, 0x0003179c}}, Y: Field{[10]uint32{0x02eef436, 0x02cc5983, 0x01d7e642, 0x027b3111, 0x03f7f8ce, 0x02a71412, 0x024e810f, 0x01986775, 0x0051ccfc, 0x00092584}}}, + {X: Field{[10]uint32{0x0144d611, 0x019bdcde, 0x014a2c1f, 0x022cccd5, 0x02c291dc, 0x03e1fb93, 0x0218999e, 0x03adf55d, 0x00aac836, 0x0009aa2f}}, Y: Field{[10]uint32{0x03bcecc9, 0x0331976e, 0x027a6c69, 0x03438667, 0x00e57192, 0x00781d8f, 0x022da29c, 0x01998eb3, 0x01ba0723, 0x00308014}}}, + {X: Field{[10]uint32{0x01fa098c, 0x020cd18b, 0x027aa2c0, 0x03841d93, 0x016bcf65, 0x029925b5, 0x0301ba17, 0x0055166f, 0x0170fb7b, 0x000e238d}}, Y: Field{[10]uint32{0x007be798, 0x0003d7e8, 0x02bdea95, 0x0049176d, 0x0299120d, 0x038d12f9, 0x01561e5a, 0x003fc151, 0x0122a2eb, 0x000b5383}}}, + {X: Field{[10]uint32{0x01250709, 0x03e3dc85, 0x03fca7a7, 0x0070ba95, 0x0200da2d, 0x03aacb1b, 0x0227efa4, 0x01e0f88c, 0x03abb5a0, 0x001a0626}}, Y: Field{[10]uint32{0x007ae856, 0x02e0d34f, 0x00855a0e, 0x005cc34c, 0x003e42d5, 0x0145117e, 0x00954f62, 0x034fea85, 0x01833694, 0x002f4c2f}}}, + {X: Field{[10]uint32{0x012190ab, 0x0364344a, 0x03d42b88, 0x020ff5ec, 0x01ea6ff6, 0x00106289, 0x03b7aa90, 0x01de5659, 0x0023bb34, 0x00190b82}}, Y: Field{[10]uint32{0x03b4000f, 0x018e71fc, 0x00903210, 0x02418eda, 0x01286b46, 0x00e76bce, 0x02748926, 0x0014bf8d, 0x02a786ec, 0x0036dcf7}}}, + {X: Field{[10]uint32{0x00924afa, 0x01a0d719, 0x02027f91, 0x00bf4e61, 0x037f4eff, 0x0225abea, 0x01addea5, 0x015415d4, 0x0281e5bf, 0x0026adba}}, Y: Field{[10]uint32{0x0229bb6c, 0x0001eb1d, 0x02f2b47d, 0x026ca659, 0x03dd951c, 0x03392cf9, 0x0329efcb, 0x02979cbf, 0x02a74870, 0x000e301a}}}, + {X: Field{[10]uint32{0x014a8ee7, 0x020563ba, 0x01a62dd1, 0x0056f780, 0x01e059e0, 0x0227993e, 0x0298248e, 0x03da71c6, 0x01aee567, 0x002c2601}}, Y: Field{[10]uint32{0x0183d221, 0x01eca386, 0x0212c814, 0x02a038f6, 0x03dea885, 0x034882b0, 0x01382eb6, 0x004bbf31, 0x016a7ec9, 0x0018aba8}}}, + {X: Field{[10]uint32{0x0107e6e5, 0x01306f00, 0x03b5a82b, 0x03c25d6f, 0x0291d6b5, 0x020c5a46, 0x018bfbc9, 0x03568d29, 0x025b636e, 0x000f58ca}}, Y: Field{[10]uint32{0x03395a1c, 0x033e8c73, 0x01aef682, 0x0273c581, 0x027a7ee0, 0x032d3525, 0x036ba0f9, 0x005b64ba, 0x009e75bf, 0x0015de91}}}, + {X: Field{[10]uint32{0x00cef707, 0x0069a5d0, 0x0150ab1c, 0x00d4e8db, 0x03b51e36, 0x025ab22e, 0x02db69dd, 0x017fcb3b, 0x03f0f70d, 0x001ae086}}, Y: Field{[10]uint32{0x02d12e5d, 0x00ede271, 0x0347a6d8, 0x02d37e8b, 0x00006371, 0x03377aa5, 0x00286745, 0x03048220, 0x0211993f, 0x001484b3}}}, + {X: Field{[10]uint32{0x01728b23, 0x036e1511, 0x0196c789, 0x00c32476, 0x02dc33b3, 0x03364e53, 0x027740b5, 0x03f82e14, 0x01514496, 0x002fca52}}, Y: Field{[10]uint32{0x0112782c, 0x009cac7a, 0x03baec13, 0x00aaed06, 0x034c53bc, 0x004378e3, 0x03f745c4, 0x0339e8d0, 0x01e5da35, 0x001e42bb}}}, + {X: Field{[10]uint32{0x0175ec80, 0x02d80d47, 0x02f06742, 0x026c453d, 0x024906f6, 0x01126251, 0x0268267c, 0x025a2859, 0x00c382bf, 0x002954d5}}, Y: Field{[10]uint32{0x025962e8, 0x0298c332, 0x00c88179, 0x025b460a, 0x019dd6d2, 0x0337ed6c, 0x03319676, 0x00697ca2, 0x01dc4566, 0x000a026f}}}, + {X: Field{[10]uint32{0x0249a693, 0x03e8d109, 0x019f45a6, 0x02be13d4, 0x03b893f8, 0x03ed2603, 0x03a1574f, 0x020c46ef, 0x0036abcd, 0x003f0054}}, Y: Field{[10]uint32{0x019db819, 0x03d9dafc, 0x00789657, 0x03280f9f, 0x02f5542a, 0x026b34fd, 0x01cd0042, 0x03812ce1, 0x02781946, 0x00343da8}}}, + {X: Field{[10]uint32{0x019a7aae, 0x01e26003, 0x024eab75, 0x01b1447e, 0x0059caea, 0x012bef89, 0x02a799fb, 0x03cd489c, 0x010d9f81, 0x00185910}}, Y: Field{[10]uint32{0x025a7966, 0x031c54fb, 0x01ac0abe, 0x03d7539f, 0x034982ff, 0x016e4e5b, 0x03ee69c9, 0x027f34f2, 0x00800ba1, 0x0024af05}}}, + {X: Field{[10]uint32{0x030b5f2d, 0x003f2145, 0x01fc6faa, 0x01f47b01, 0x016e2591, 0x0060ad3d, 0x00f9a9b3, 0x035cddca, 0x01358de9, 0x003be059}}, Y: Field{[10]uint32{0x007ec595, 0x0320fa9d, 0x03d7e155, 0x03732c71, 0x010f1721, 0x02dbf4cb, 0x0249df88, 0x02a71141, 0x0026403c, 0x00370dc9}}}, + {X: Field{[10]uint32{0x0187a8ed, 0x03029222, 0x032e2642, 0x011a107a, 0x00178c56, 0x01c34b10, 0x0304e681, 0x00db7771, 0x00b989a4, 0x0010a30d}}, Y: Field{[10]uint32{0x02eebe06, 0x00deaf4e, 0x01f4f512, 0x01f9c651, 0x003836f9, 0x010da58d, 0x004dc3e6, 0x01191b28, 0x0158251c, 0x002c7c90}}}, + {X: Field{[10]uint32{0x01417a9e, 0x03f88199, 0x024a55ac, 0x01cdfb69, 0x025f19da, 0x02faef5a, 0x01e62437, 0x0055ed05, 0x0382f909, 0x001bad85}}, Y: Field{[10]uint32{0x00577b72, 0x013bfffa, 0x00c3904c, 0x03b8a43b, 0x02af03ed, 0x026710bd, 0x012f168f, 0x03cac5b2, 0x0146baed, 0x0013f9f1}}}, + {X: Field{[10]uint32{0x0376fa4b, 0x01c718a8, 0x01646e43, 0x01cf4530, 0x03cb6f95, 0x02338c77, 0x03830099, 0x013fb17b, 0x02f1466d, 0x00264b82}}, Y: Field{[10]uint32{0x01f9e825, 0x01a4354a, 0x01ae3871, 0x0398c75e, 0x0150d000, 0x002590d9, 0x001e3a90, 0x025acbac, 0x02691e43, 0x003438f6}}}, + {X: Field{[10]uint32{0x01721d11, 0x0210e0c1, 0x039c3010, 0x000e33d6, 0x00513e99, 0x00925a4d, 0x00f31d11, 0x0001e3c8, 0x024badc7, 0x003fb6d5}}, Y: Field{[10]uint32{0x00157a39, 0x01237bce, 0x00b2fa94, 0x021f5502, 0x02ba26ae, 0x015fc580, 0x015d97d6, 0x010833cb, 0x024957e8, 0x0006a38a}}}, + {X: Field{[10]uint32{0x033b24bd, 0x010c3401, 0x03575e54, 0x009989d2, 0x023e6832, 0x03109245, 0x007088d3, 0x02746049, 0x028a4dd8, 0x003cfc81}}, Y: Field{[10]uint32{0x03a2bfa8, 0x0069fdde, 0x00f0e75c, 0x017f87c7, 0x0312381c, 0x002a9f8c, 0x026ab1ee, 0x03d18850, 0x011900a7, 0x003caaaf}}}, + {X: Field{[10]uint32{0x00a13680, 0x00c1dc8f, 0x02e02b3d, 0x016364f6, 0x015b6aa4, 0x01daa160, 0x024e7c14, 0x028d6637, 0x025e4217, 0x000cae48}}, Y: Field{[10]uint32{0x02133802, 0x00d74396, 0x008a396f, 0x0051cce0, 0x03532462, 0x0341c7a5, 0x0185683d, 0x018d004a, 0x00042685, 0x001d19ba}}}, + {X: Field{[10]uint32{0x02e64a8a, 0x0266e7f6, 0x01c7fc62, 0x024fe893, 0x01ee6c6b, 0x03ad64be, 0x03899792, 0x035ac13f, 0x0287385e, 0x00214022}}, Y: Field{[10]uint32{0x0104a2df, 0x01b8a129, 0x023622ae, 0x023e8943, 0x0284b5b3, 0x0020961d, 0x01569f6c, 0x0015dbee, 0x022b8a5b, 0x0007c9e7}}}, + {X: Field{[10]uint32{0x002effd4, 0x0114bdaa, 0x030e9e44, 0x01883c04, 0x010b8353, 0x03f126ff, 0x00edac7c, 0x02ac2fb2, 0x0033ebbe, 0x00136b1e}}, Y: Field{[10]uint32{0x023c740a, 0x03426a80, 0x001f00cc, 0x02d76e3b, 0x01133dc3, 0x02d08df7, 0x014ada57, 0x02a9a184, 0x0170f230, 0x003f2746}}}, + {X: Field{[10]uint32{0x016dbeeb, 0x03cc40b5, 0x03d71031, 0x010406e4, 0x034b44de, 0x014d77d6, 0x0340226e, 0x01755066, 0x008145a6, 0x0026dd56}}, Y: Field{[10]uint32{0x0089a02d, 0x03674478, 0x00e1fa1e, 0x0185679f, 0x01c15160, 0x036ee8ed, 0x03382907, 0x00dedf26, 0x01710d69, 0x00340c90}}}, + {X: Field{[10]uint32{0x03bc8bdd, 0x00fb66b2, 0x004bdb58, 0x03291877, 0x0198b525, 0x02d9176d, 0x02e6e8b1, 0x029f5e99, 0x02b92592, 0x0006f5b3}}, Y: Field{[10]uint32{0x0229944c, 0x0242b126, 0x01e4e7b7, 0x03955473, 0x015a1c4c, 0x0296dc15, 0x037abb10, 0x022fa922, 0x028784a9, 0x00269677}}}, + {X: Field{[10]uint32{0x015b56ee, 0x03d4d56f, 0x00637268, 0x01f62d11, 0x016b3a3c, 0x03f9e1ba, 0x025b08a7, 0x00250594, 0x02b93b36, 0x00096a2c}}, Y: Field{[10]uint32{0x025f22ec, 0x0393a2e5, 0x0240ac45, 0x02bb7dc6, 0x0045f131, 0x03b1b154, 0x01027e63, 0x01a1ff6f, 0x00f75734, 0x000f1633}}}, + {X: Field{[10]uint32{0x03ed9f5f, 0x02c87945, 0x003c0d88, 0x02aa3695, 0x02bf5a1c, 0x0148975a, 0x01a57671, 0x00fbec88, 0x003327c3, 0x000912ca}}, Y: Field{[10]uint32{0x01f53d7d, 0x027c2ff0, 0x000dbc22, 0x0398110e, 0x0237f83c, 0x00a7d404, 0x02cec92a, 0x02254d6b, 0x02ace48d, 0x0008800d}}}, + {X: Field{[10]uint32{0x025dd1b7, 0x01928d4c, 0x01e64e97, 0x00775ab0, 0x0291f0cc, 0x0159a5e3, 0x0042d13e, 0x01e415ad, 0x000f27b8, 0x001be5eb}}, Y: Field{[10]uint32{0x03433d32, 0x0034ffe7, 0x01c814dd, 0x01697cb6, 0x007e937f, 0x0246ce28, 0x02ce1cc6, 0x031c1c89, 0x030cfac6, 0x0020f1b9}}}, + {X: Field{[10]uint32{0x021dce1f, 0x03120055, 0x02badc94, 0x0352c88d, 0x012d6abc, 0x01153c98, 0x00265cad, 0x0138b6ea, 0x020feb01, 0x001cb175}}, Y: Field{[10]uint32{0x03978fe2, 0x02d03698, 0x00bf0690, 0x02db491b, 0x0397b281, 0x03174eb2, 0x03282163, 0x00658ece, 0x02197ef9, 0x0038c466}}}, + {X: Field{[10]uint32{0x01f33825, 0x0367b435, 0x006ea707, 0x0252aba3, 0x002af32b, 0x0110686c, 0x018659df, 0x000619a6, 0x01a001b1, 0x002a5b4b}}, Y: Field{[10]uint32{0x02513f9f, 0x03a04202, 0x016906c0, 0x01c45aa4, 0x025659ea, 0x0230dc2a, 0x03cfd412, 0x0148d67d, 0x018305da, 0x0019835f}}}, + {X: Field{[10]uint32{0x03e3c4fa, 0x00537156, 0x00875173, 0x009e6431, 0x03d906aa, 0x01d8599d, 0x001d2008, 0x017b3066, 0x03634d81, 0x000b339b}}, Y: Field{[10]uint32{0x02ba4b50, 0x008cc8ef, 0x036e5d3c, 0x01d327b2, 0x01b33cb2, 0x03f4151d, 0x02f997a0, 0x027a446d, 0x00ddbd59, 0x00185484}}}, + {X: Field{[10]uint32{0x0245f0c4, 0x0226f5a9, 0x02f4660e, 0x03f1d628, 0x024558fa, 0x02e354ec, 0x00602d98, 0x034e6766, 0x0084525d, 0x00264ac0}}, Y: Field{[10]uint32{0x00e2f98d, 0x01935869, 0x02a572da, 0x0039657b, 0x02f5a5c7, 0x00508180, 0x005f40b1, 0x0168a631, 0x00d22654, 0x0020f2a6}}}, + {X: Field{[10]uint32{0x03eb7357, 0x03dd9ba6, 0x0388e44e, 0x027ad17a, 0x01c6b0c6, 0x03f52ddf, 0x0361ee43, 0x01867f31, 0x03453089, 0x0010d3be}}, Y: Field{[10]uint32{0x029291ea, 0x027bf08a, 0x01bd001e, 0x03220c2e, 0x0126967a, 0x00db02fa, 0x025586d2, 0x02e4b965, 0x016d01c0, 0x000f6ec3}}}, + {X: Field{[10]uint32{0x03fbc156, 0x037171f8, 0x02b884bd, 0x02271370, 0x00f0dbf5, 0x00fbf8c1, 0x02e47359, 0x00cc1828, 0x01ad2c68, 0x0002885e}}, Y: Field{[10]uint32{0x02033c1f, 0x001ebebd, 0x00b20192, 0x008c21b7, 0x0288a2d2, 0x036d8274, 0x00e6dfab, 0x0005da86, 0x01f8ab98, 0x003b914e}}}, + {X: Field{[10]uint32{0x0305a2e1, 0x00e41ebb, 0x00f146d6, 0x00a999c6, 0x02a445f2, 0x024887bd, 0x012bb400, 0x03851ea9, 0x001ed3e1, 0x000e4d02}}, Y: Field{[10]uint32{0x03b5b3c7, 0x02aca429, 0x0206214f, 0x03f9d4b1, 0x03d3a9fe, 0x03c7a566, 0x01e79d49, 0x006de882, 0x02563139, 0x002f0dc1}}}, + {X: Field{[10]uint32{0x0395d8ef, 0x022381f7, 0x013db396, 0x0388414a, 0x03f1f3f7, 0x03310957, 0x00383546, 0x02e4e401, 0x00e159a2, 0x000d6f09}}, Y: Field{[10]uint32{0x0223ae15, 0x03b42a24, 0x02dfa246, 0x034e2127, 0x00e87e0c, 0x0159c93e, 0x02beb5c0, 0x02636bde, 0x00700a96, 0x0037b87f}}}, + {X: Field{[10]uint32{0x0148127d, 0x0394962e, 0x01b48bc7, 0x0386f2b9, 0x0163aa14, 0x00176399, 0x012a0eef, 0x02d1ce15, 0x035c251f, 0x003d7479}}, Y: Field{[10]uint32{0x037170fe, 0x0084aa1b, 0x036fe92d, 0x03d02fde, 0x03e7d586, 0x00a614a2, 0x0009134d, 0x03c1623d, 0x01bc7044, 0x00389830}}}, + {X: Field{[10]uint32{0x03eb121c, 0x03687301, 0x00f54d12, 0x02cd80d4, 0x03f9617b, 0x02b2ddd0, 0x01170dd6, 0x00a0bc28, 0x02d36fed, 0x003b829d}}, Y: Field{[10]uint32{0x020ba5b1, 0x03debc50, 0x035166db, 0x01612d0a, 0x024e56c4, 0x03e78432, 0x02135eff, 0x02583c39, 0x02dbeba6, 0x003e33f0}}}, + {X: Field{[10]uint32{0x00a689d8, 0x01e43467, 0x01676f94, 0x03d85b69, 0x004d1879, 0x005dd345, 0x00ab377f, 0x01d99057, 0x03cf7892, 0x00278ee1}}, Y: Field{[10]uint32{0x02b3b577, 0x02a39b6e, 0x03482266, 0x025ad151, 0x027a9c2d, 0x006c7c9a, 0x033b0c2b, 0x028ab2c9, 0x0122da3c, 0x003e3cd1}}}, + {X: Field{[10]uint32{0x034868f0, 0x016cc43a, 0x0115286e, 0x031d3d89, 0x0012f409, 0x019ae2d4, 0x005b89ee, 0x010b00f2, 0x016fd089, 0x00389bc9}}, Y: Field{[10]uint32{0x02f210f9, 0x03a2fed5, 0x012f21bb, 0x00fcf13c, 0x033552c2, 0x00f26c49, 0x008c6562, 0x0127e9b4, 0x00d96fea, 0x002eacf1}}}, + {X: Field{[10]uint32{0x011da6c2, 0x01626000, 0x0021cf08, 0x014baa31, 0x01a3f5c8, 0x03c1eaf1, 0x00b67634, 0x020e6345, 0x0046a5d3, 0x0022b1d0}}, Y: Field{[10]uint32{0x0229b3dc, 0x0174c91c, 0x0288e149, 0x02543210, 0x024a71af, 0x00d500b0, 0x00f59160, 0x00c66215, 0x0393f56e, 0x00348329}}}, + {X: Field{[10]uint32{0x01932bd0, 0x01dea495, 0x03a83ac6, 0x02fecb20, 0x02753928, 0x03a074a7, 0x01531a86, 0x0253324f, 0x00956346, 0x0016c038}}, Y: Field{[10]uint32{0x00a99656, 0x00fbf598, 0x032d64bc, 0x00cdd200, 0x0242882b, 0x0003561f, 0x02daf180, 0x03123185, 0x027a8071, 0x00234bc9}}}, + {X: Field{[10]uint32{0x0211f0b1, 0x00d5fe27, 0x02a872c0, 0x026ad3a7, 0x01546ffb, 0x02ca9984, 0x01ae4ba7, 0x0175eeac, 0x00c4080c, 0x00058864}}, Y: Field{[10]uint32{0x02423525, 0x024c0c24, 0x019d8796, 0x00ba6317, 0x01bb8419, 0x00ef731b, 0x006d7a31, 0x022a7396, 0x01041244, 0x0036d788}}}, + {X: Field{[10]uint32{0x01b145b1, 0x0299db21, 0x0236cf26, 0x03726bfd, 0x03476774, 0x001805f6, 0x03f8520e, 0x020fa021, 0x0021b4b3, 0x003daa11}}, Y: Field{[10]uint32{0x0037a3b3, 0x01d2a010, 0x020a80ed, 0x0056fe23, 0x02937172, 0x03a3f87b, 0x03a2da82, 0x01c3b401, 0x01a95967, 0x0014131c}}}, + {X: Field{[10]uint32{0x032dd6e5, 0x01d66a64, 0x0013455a, 0x02795727, 0x0183e591, 0x0127e423, 0x038937da, 0x034f62cf, 0x0142f0b5, 0x0007c0b4}}, Y: Field{[10]uint32{0x01863e65, 0x0220b68e, 0x00348fb3, 0x017d22b8, 0x03fbc903, 0x036df27f, 0x02c2eae5, 0x01b7dd43, 0x03338ed3, 0x0039a972}}}, + {X: Field{[10]uint32{0x0178899f, 0x01889e07, 0x03a0434a, 0x03d44b5d, 0x0268e29b, 0x00d21295, 0x02e38c37, 0x0287fa8a, 0x016bc326, 0x00187d36}}, Y: Field{[10]uint32{0x03b4aab8, 0x00deb4b5, 0x02b38b3a, 0x012cdd79, 0x02217272, 0x00603097, 0x03970216, 0x016b1d93, 0x03386200, 0x001947bd}}}, + {X: Field{[10]uint32{0x01c11616, 0x005f2b8c, 0x019c19c9, 0x00ac6be8, 0x007c7ebe, 0x034a45b8, 0x008a71f8, 0x0179e602, 0x000d623c, 0x002e9f57}}, Y: Field{[10]uint32{0x015f5a51, 0x016c1f6f, 0x00958ce4, 0x039f99b2, 0x01a1ec37, 0x03ecd565, 0x02551530, 0x00fdb1e1, 0x03400d7e, 0x00369027}}}, + {X: Field{[10]uint32{0x025bdb09, 0x01be7464, 0x003c3bb1, 0x029a6af1, 0x01fe5a92, 0x036f0f86, 0x02a68ee6, 0x025df1b9, 0x0190eacb, 0x0022e429}}, Y: Field{[10]uint32{0x035df718, 0x00d4603e, 0x039a92a0, 0x01d760a6, 0x024d01ef, 0x01d1a9d4, 0x02734e1f, 0x0175642b, 0x0342ef65, 0x002973d7}}}, + {X: Field{[10]uint32{0x03f4fe4c, 0x03a6ab37, 0x025b71c9, 0x03ffd56c, 0x01f0d994, 0x02d6b85c, 0x00294a3c, 0x0133f73a, 0x02272191, 0x0021fcd4}}, Y: Field{[10]uint32{0x00babb2f, 0x00930a19, 0x03552dda, 0x00fc88a8, 0x01f26b28, 0x026a44cd, 0x027c1efb, 0x031787ab, 0x01af530b, 0x00331c74}}}, + {X: Field{[10]uint32{0x0377a15d, 0x03bb92b2, 0x0358b6c1, 0x027c61fb, 0x0383d550, 0x014c3c7c, 0x00ffe8a5, 0x014566fc, 0x0136ba40, 0x002bba93}}, Y: Field{[10]uint32{0x00d3ac1a, 0x01581e98, 0x033f78d5, 0x01f738da, 0x0196958f, 0x022aa8a3, 0x03031c24, 0x00f7e1f4, 0x01eae740, 0x0036d58f}}}, + {X: Field{[10]uint32{0x03cc7111, 0x00e2966b, 0x02db62a3, 0x00d95dd3, 0x00d8dda4, 0x02016353, 0x006f1ef0, 0x03ae755f, 0x018d3996, 0x000c03fa}}, Y: Field{[10]uint32{0x00c40e77, 0x01962c8e, 0x025e3a49, 0x009b49c8, 0x01d2e6e2, 0x010eddbf, 0x037913c1, 0x029033e4, 0x00178fdd, 0x00345228}}}, + {X: Field{[10]uint32{0x01c19fdb, 0x0017d0a6, 0x0073aa50, 0x006ddb53, 0x03d01e9c, 0x019d0f93, 0x01095a1f, 0x0051ba0e, 0x035e22cd, 0x0031c02b}}, Y: Field{[10]uint32{0x014b32c0, 0x0151aa86, 0x011d28b5, 0x024b0b54, 0x010d4a30, 0x02dba95a, 0x02b1fc6b, 0x00709c9e, 0x0181b1f0, 0x000ff800}}}, + {X: Field{[10]uint32{0x0350bc60, 0x030dd233, 0x034a5941, 0x01d7e5ae, 0x0194228f, 0x0211214e, 0x02147af3, 0x0104e06a, 0x00e117b9, 0x00340f42}}, Y: Field{[10]uint32{0x0096e31d, 0x001c6cea, 0x000fa10e, 0x01dba451, 0x01f47dd0, 0x015076a3, 0x00bfbfdc, 0x02f314b8, 0x03fd2785, 0x0016c467}}}, + {X: Field{[10]uint32{0x022bd361, 0x017697f0, 0x03832b39, 0x00fb2533, 0x03ea9c98, 0x02be0697, 0x017fadb6, 0x0082e15b, 0x00fa17a5, 0x001b19c4}}, Y: Field{[10]uint32{0x02804941, 0x028e4f3c, 0x00ad64fb, 0x002097b5, 0x01b036a4, 0x00225ec1, 0x01964f3c, 0x0207a906, 0x012636e2, 0x0036d3bf}}}, + {X: Field{[10]uint32{0x03d91bbb, 0x03cfef68, 0x021d9b46, 0x03a653e1, 0x025ea3bf, 0x00229766, 0x02cb900d, 0x01e859ad, 0x02399df4, 0x0035ed70}}, Y: Field{[10]uint32{0x00efe8ba, 0x03565f59, 0x03710cff, 0x0194a702, 0x03a3c8a0, 0x0253ff87, 0x003494d7, 0x03097a72, 0x034e4ab1, 0x003b5e47}}}, + {X: Field{[10]uint32{0x00f66c06, 0x02a7a394, 0x029524ab, 0x008c8d06, 0x0253ff2f, 0x03aaa8fb, 0x01eb8dcc, 0x02054b8b, 0x01ab8f72, 0x00243da6}}, Y: Field{[10]uint32{0x02fce91d, 0x0320b27f, 0x0008e641, 0x0339b98f, 0x00561558, 0x00da487e, 0x006d80ec, 0x004aee75, 0x03a77f53, 0x0022f430}}}, + {X: Field{[10]uint32{0x01fb65cc, 0x02b9c6a3, 0x0344abb9, 0x0338ada1, 0x0137557d, 0x0285bd5a, 0x01eaead6, 0x0370d324, 0x023e3d7a, 0x001343ab}}, Y: Field{[10]uint32{0x03a3de5a, 0x01b8bc87, 0x02a5352c, 0x02641425, 0x026e874c, 0x010aa94b, 0x019a6851, 0x021cc6ea, 0x0006a950, 0x00205ac2}}}, + {X: Field{[10]uint32{0x02f7de62, 0x023df26c, 0x031d0243, 0x0266381a, 0x01689a23, 0x00c54617, 0x034f8153, 0x0212637e, 0x02ddec31, 0x0011b367}}, Y: Field{[10]uint32{0x021f29bc, 0x0211be95, 0x0100810a, 0x01a0491f, 0x03e0d5d1, 0x0204ce22, 0x0164a8bb, 0x01e1d232, 0x01a3d5fd, 0x000ed6f0}}}, + {X: Field{[10]uint32{0x02ff730b, 0x013ae0c0, 0x000aebce, 0x03f88696, 0x00653748, 0x01154b90, 0x0176297b, 0x02aadc71, 0x000e3f6e, 0x00012ab2}}, Y: Field{[10]uint32{0x008c7954, 0x00d4e61b, 0x020509e4, 0x02a53c77, 0x0240d331, 0x02b1a811, 0x03e2dd5b, 0x03d1aa03, 0x000d8014, 0x000f50a8}}}, + {X: Field{[10]uint32{0x002a4114, 0x01a06956, 0x006374bb, 0x03d8bb2f, 0x02e03e96, 0x006664de, 0x01e45730, 0x0270244c, 0x0261b73d, 0x00166fa9}}, Y: Field{[10]uint32{0x01afa47d, 0x038f4b2c, 0x035c130b, 0x026af576, 0x00d9f263, 0x03a24541, 0x01062e78, 0x00b0ba07, 0x03e8ee8a, 0x000c6882}}}, + {X: Field{[10]uint32{0x00ca6037, 0x024d59e4, 0x003385e2, 0x02929387, 0x029ee089, 0x03b1e937, 0x019acd3f, 0x03ba48ac, 0x006588b2, 0x0001ffa4}}, Y: Field{[10]uint32{0x01e5c128, 0x03a4da4d, 0x032a7c69, 0x018f9fb1, 0x002659b7, 0x001d8ffd, 0x01eb3262, 0x00fbac7d, 0x0190c5f4, 0x0037ed17}}}, + {X: Field{[10]uint32{0x01322157, 0x03254625, 0x0262f19d, 0x011fcb20, 0x01f3a5fc, 0x03e3cbf4, 0x00b5e4ac, 0x01e225e1, 0x03913227, 0x0036ce43}}, Y: Field{[10]uint32{0x0290bbad, 0x01872b35, 0x02dc8d5d, 0x0302b7a0, 0x012aaeb5, 0x0298f6c6, 0x00fd7d4d, 0x020c7c25, 0x015b241c, 0x0010d925}}}, + {X: Field{[10]uint32{0x0391ebc8, 0x017501dc, 0x03c29e6e, 0x02980714, 0x00985732, 0x02ba3de3, 0x02a9e615, 0x0066b1f6, 0x0266e5fc, 0x000d3740}}, Y: Field{[10]uint32{0x01dd797b, 0x007a87f1, 0x02ddb661, 0x01ad148c, 0x0077a5db, 0x030ad22f, 0x0013b1d2, 0x03f80398, 0x02d80e73, 0x0030b5ad}}}, + {X: Field{[10]uint32{0x011772ab, 0x038f7c67, 0x004db336, 0x0314ca3e, 0x015e6c7e, 0x01b8bbe5, 0x01fcfbe1, 0x0182374f, 0x032b7e31, 0x003ba9fd}}, Y: Field{[10]uint32{0x014004bb, 0x0034c354, 0x029b88af, 0x015831af, 0x03172195, 0x00e6a9d1, 0x02a6d947, 0x02930d23, 0x00f1ccde, 0x002598b2}}}, + {X: Field{[10]uint32{0x00c391f2, 0x00f9e8e2, 0x007fc10d, 0x0190db64, 0x019376d2, 0x03a1584a, 0x01e412dd, 0x003ace4f, 0x007af1b1, 0x0031abc2}}, Y: Field{[10]uint32{0x00825144, 0x02d2b9d4, 0x00959eee, 0x0090b185, 0x01e5ff98, 0x033faae9, 0x018847a9, 0x01915e2b, 0x022e3185, 0x002ea675}}}, + {X: Field{[10]uint32{0x02ccefc7, 0x0132667f, 0x01518136, 0x02fd434d, 0x02aff37f, 0x032d0fd6, 0x033d034b, 0x015d02ad, 0x03356c71, 0x003ab8d1}}, Y: Field{[10]uint32{0x02fe4703, 0x03998e64, 0x01a9879f, 0x01b6d87f, 0x03968525, 0x02513dd2, 0x02f15d84, 0x03d91735, 0x0075da8b, 0x002e4e1b}}}, + {X: Field{[10]uint32{0x0340438f, 0x0093fdfe, 0x0046165c, 0x038c0764, 0x0241b68a, 0x01392589, 0x039a27e6, 0x023d5013, 0x00250f4d, 0x00129523}}, Y: Field{[10]uint32{0x016f6d10, 0x014bca06, 0x01578382, 0x00570a83, 0x014c2742, 0x038a698f, 0x01e40c67, 0x0233dbbd, 0x0085bd60, 0x002ba7cb}}}, + {X: Field{[10]uint32{0x00f744af, 0x02bcac3b, 0x01a53f43, 0x03678603, 0x03453318, 0x032cf02f, 0x019743d7, 0x0116a3a8, 0x0279dd65, 0x00186495}}, Y: Field{[10]uint32{0x03cb184d, 0x002913ca, 0x011a1726, 0x0075138f, 0x0347fc55, 0x00f92a87, 0x02c062ca, 0x014dcba7, 0x0184d721, 0x00281a0b}}}, + {X: Field{[10]uint32{0x0137ea2a, 0x03c05424, 0x004fe025, 0x02e14bfc, 0x0250267a, 0x01097bd8, 0x03a260d2, 0x02addb53, 0x02869574, 0x003876d7}}, Y: Field{[10]uint32{0x011905a8, 0x010f2054, 0x0277483f, 0x012fed25, 0x00836e20, 0x00318494, 0x01a99a1d, 0x03de8db0, 0x00219fd5, 0x00323abd}}}, + {X: Field{[10]uint32{0x0248c7f1, 0x027498f4, 0x004a7d2f, 0x02473f08, 0x0038e636, 0x007f613c, 0x00ab862a, 0x00e108a8, 0x03ca7392, 0x000c18b2}}, Y: Field{[10]uint32{0x019670cb, 0x03011ff7, 0x02b2cf55, 0x03c7327f, 0x00721a85, 0x038610c4, 0x0289eee1, 0x00a5c373, 0x02570e3f, 0x0023c44b}}}, + {X: Field{[10]uint32{0x01a4f739, 0x00500113, 0x00f4e4e8, 0x03ca5dd9, 0x039da74f, 0x02d4fe54, 0x007a861e, 0x00dbf3bb, 0x03ccaa97, 0x0019f0e4}}, Y: Field{[10]uint32{0x01853203, 0x011f1352, 0x013942d1, 0x03551b1f, 0x0033ac24, 0x03566d49, 0x00009d5a, 0x017f88be, 0x01d09a16, 0x0024f4ca}}}, + {X: Field{[10]uint32{0x0099bf5e, 0x00c213fa, 0x03728f94, 0x02c43a2e, 0x01ac5bc5, 0x0160731f, 0x01a5619d, 0x00861fb9, 0x01f236cf, 0x00319d1c}}, Y: Field{[10]uint32{0x01e2c513, 0x039a1223, 0x00aea62f, 0x00dfeda1, 0x003a533f, 0x0132ef32, 0x03c32477, 0x00c63650, 0x009c787b, 0x001d7243}}}, + {X: Field{[10]uint32{0x00ed1b52, 0x01fa62b9, 0x03070182, 0x03301951, 0x0112143a, 0x0096aab1, 0x033d7a40, 0x02376484, 0x03efd593, 0x00354057}}, Y: Field{[10]uint32{0x00f03d6b, 0x01b0975f, 0x0379f400, 0x0182de63, 0x00e99668, 0x00761177, 0x037c0d65, 0x00dbc570, 0x0216a022, 0x00110c15}}}, + {X: Field{[10]uint32{0x0164f2d2, 0x024a73a0, 0x003b73c1, 0x002473d4, 0x02243ca3, 0x0000bb66, 0x008ed564, 0x0258572d, 0x0365aaa8, 0x002baf2f}}, Y: Field{[10]uint32{0x00b3f019, 0x01f4dff9, 0x01ee535e, 0x015554e6, 0x02a6ee7f, 0x027223a1, 0x020305ba, 0x03b8ad08, 0x025d1a30, 0x0013f07c}}}, + {X: Field{[10]uint32{0x03b30e43, 0x03c03ffa, 0x00d8105e, 0x002ed4dc, 0x01bb8f98, 0x00ca8e74, 0x02d68219, 0x037bbd26, 0x02171727, 0x000572c5}}, Y: Field{[10]uint32{0x000ebd7a, 0x039f4afe, 0x02d93b1f, 0x01ad243a, 0x012dfff8, 0x01cd2cd3, 0x035c1b99, 0x0014ffb8, 0x008287fc, 0x00192b63}}}, + {X: Field{[10]uint32{0x0049c123, 0x000c2013, 0x026986bd, 0x008c18f8, 0x0119fb25, 0x00948468, 0x03b88a55, 0x0359d026, 0x009e8530, 0x00350108}}, Y: Field{[10]uint32{0x00a7a128, 0x03318890, 0x032c562b, 0x02fa28d0, 0x0046ef87, 0x02d68c9f, 0x01062753, 0x017467a1, 0x0168fdb8, 0x000dd8ff}}}, + {X: Field{[10]uint32{0x03ffdd96, 0x03a4e066, 0x02a4ed42, 0x025fd08a, 0x00d40b44, 0x030c9eb1, 0x02330c2f, 0x00a12563, 0x00cf0c23, 0x003ceafe}}, Y: Field{[10]uint32{0x015b0d5d, 0x0083a69f, 0x02061cc7, 0x03b1f33c, 0x01d1dfe9, 0x035e9d88, 0x01076432, 0x00c9f0fa, 0x0305d831, 0x00142187}}}, + {X: Field{[10]uint32{0x00874dea, 0x01ffdbdf, 0x03b4e57b, 0x011b0f92, 0x035cf92b, 0x0146e748, 0x004755a6, 0x036fecfe, 0x00932ee9, 0x001e28ca}}, Y: Field{[10]uint32{0x02c85895, 0x005fdae6, 0x02473b46, 0x02ca4b06, 0x01b3c36e, 0x0257aadf, 0x02ccd874, 0x0087d1ba, 0x003a9667, 0x002496de}}}, + {X: Field{[10]uint32{0x0350cd4a, 0x000c8269, 0x01e8df65, 0x0390fb55, 0x011b7d15, 0x01eed9e3, 0x001ed91a, 0x01be286b, 0x010f5d14, 0x00205948}}, Y: Field{[10]uint32{0x015d260d, 0x02e161e4, 0x0363a384, 0x019a87b6, 0x03859541, 0x00e5b1c4, 0x0145875e, 0x00af732f, 0x013a19e2, 0x003f8e43}}}, + {X: Field{[10]uint32{0x01fe3f09, 0x03295fdf, 0x032f3633, 0x007f3c01, 0x00ba7343, 0x00fbe866, 0x0317dd6f, 0x00f4d337, 0x01e86c2f, 0x001d49a7}}, Y: Field{[10]uint32{0x004805bd, 0x03454f9c, 0x020b1f5e, 0x027c77c6, 0x00f463f3, 0x017ba214, 0x006e3dbd, 0x009fb111, 0x025fd199, 0x002c58a9}}}, + {X: Field{[10]uint32{0x027145b0, 0x01394490, 0x02b38954, 0x02dea405, 0x03c520a7, 0x013ecbfd, 0x01c4e104, 0x0252796e, 0x028fb393, 0x00178db3}}, Y: Field{[10]uint32{0x0011614c, 0x0269381e, 0x03a4e7d3, 0x0170320a, 0x0022074c, 0x0152baa4, 0x01822ced, 0x025a9076, 0x0318292f, 0x001f1039}}}, + {X: Field{[10]uint32{0x02632746, 0x0302dac5, 0x03d25b05, 0x0181db69, 0x01c249d3, 0x02b260f9, 0x0176edc6, 0x02ff1b01, 0x0129fdeb, 0x0032331c}}, Y: Field{[10]uint32{0x00716fb1, 0x01d35e13, 0x01e68e46, 0x02bf53dd, 0x022653fb, 0x014e7fae, 0x011a332c, 0x011261db, 0x00e3a77e, 0x00122a33}}}, + {X: Field{[10]uint32{0x0246973f, 0x0303053a, 0x021dd2d6, 0x022dce0e, 0x03fa8579, 0x038f772b, 0x024d2a9a, 0x00f9b4e4, 0x0336f1ee, 0x0027f876}}, Y: Field{[10]uint32{0x0074f6d2, 0x039db38b, 0x0223e7c2, 0x03b2facc, 0x0343dc55, 0x00084ad8, 0x02d96588, 0x01170257, 0x02a86070, 0x00074d6d}}}, + {X: Field{[10]uint32{0x008ecda2, 0x01c4fd6f, 0x024657c9, 0x036f49b4, 0x01e23648, 0x030d449e, 0x019e02dd, 0x01d239b8, 0x038a3d45, 0x00132a2a}}, Y: Field{[10]uint32{0x023e73da, 0x02a68e53, 0x005cf164, 0x0236ec83, 0x0113b8a6, 0x0021db25, 0x03c9f23c, 0x036e489c, 0x02ad9bb7, 0x00229619}}}, + {X: Field{[10]uint32{0x032060c0, 0x01dbd62d, 0x017b13d3, 0x00607604, 0x03f1f308, 0x006c78a7, 0x01bc7242, 0x0227b173, 0x0150e4a9, 0x00032340}}, Y: Field{[10]uint32{0x0082ebd1, 0x018cd954, 0x0271749e, 0x00cb2c9b, 0x027ac4a7, 0x002c800c, 0x0242a9df, 0x00e9286b, 0x00a4c5a7, 0x00171620}}}, + {X: Field{[10]uint32{0x02f2aa31, 0x03868304, 0x03feafc1, 0x0113c4c2, 0x039e3684, 0x02072620, 0x03e1b7c9, 0x03f79927, 0x017bb4b9, 0x000f5855}}, Y: Field{[10]uint32{0x025b56f9, 0x021e64b7, 0x0228671c, 0x0254c63a, 0x021e2336, 0x01ac70df, 0x0160c90e, 0x02102cea, 0x03ff62cd, 0x0024cc59}}}, + {X: Field{[10]uint32{0x00e69e2a, 0x02bc5a49, 0x00552ccf, 0x03b72d89, 0x03feaada, 0x0170fb47, 0x0078dbb8, 0x0328256d, 0x039ffd44, 0x0019d5a7}}, Y: Field{[10]uint32{0x03eb7fcc, 0x006c9b59, 0x00102feb, 0x037abc3f, 0x03d16619, 0x02b7ec92, 0x01412887, 0x02f4b2aa, 0x0148230f, 0x0018aeca}}}, + {X: Field{[10]uint32{0x0372fbc2, 0x02dd4f9c, 0x01af70f3, 0x0340f3c3, 0x006e3075, 0x0319b6aa, 0x037d2792, 0x0050043a, 0x013edebf, 0x0018c4f4}}, Y: Field{[10]uint32{0x03573ef3, 0x0389ab74, 0x039c2f65, 0x01d2fabf, 0x032839f8, 0x00f81b8b, 0x01754556, 0x0049161a, 0x023050eb, 0x00111884}}}, + {X: Field{[10]uint32{0x01d23968, 0x03f78913, 0x031955e2, 0x03c857c4, 0x03088529, 0x01f1b2ca, 0x023085b4, 0x01ba3343, 0x01e7fbbe, 0x001be3b2}}, Y: Field{[10]uint32{0x0136cd79, 0x0031dbfb, 0x0078dc51, 0x002a0c07, 0x0323e195, 0x0311bbba, 0x003b215d, 0x00febad5, 0x0214523b, 0x0007ed87}}}, + {X: Field{[10]uint32{0x010b7f6c, 0x0301519c, 0x022447be, 0x01638380, 0x0336f0ae, 0x020e6d30, 0x01a0ec2f, 0x0286b2f6, 0x01ac3c5a, 0x0015984f}}, Y: Field{[10]uint32{0x02ca79e8, 0x01ceaa63, 0x0316cf7b, 0x02f775fd, 0x03530908, 0x010d2be2, 0x03233194, 0x0263e40e, 0x03ab86c3, 0x00091c98}}}, + {X: Field{[10]uint32{0x03aee08c, 0x02cf0861, 0x01da041e, 0x02c1a167, 0x0217e91a, 0x0169f775, 0x03e6e57c, 0x01c8644d, 0x01e7b414, 0x00327785}}, Y: Field{[10]uint32{0x038b0009, 0x03eff10f, 0x0370fd8f, 0x02c7d792, 0x0040cc5d, 0x00556473, 0x0111c877, 0x015b437f, 0x02a5cfa0, 0x0031c5e3}}}, + {X: Field{[10]uint32{0x016c0504, 0x01aeff7d, 0x01c48a8b, 0x00b74b77, 0x02f90618, 0x02f9925e, 0x02a4b0f6, 0x017a4390, 0x024a627d, 0x0001d642}}, Y: Field{[10]uint32{0x02c38587, 0x00f38aa9, 0x029f81f9, 0x01d4d4ed, 0x00cc5bd8, 0x02a9192f, 0x017e878b, 0x021d8172, 0x021ab549, 0x00358478}}}, + {X: Field{[10]uint32{0x03e19d6a, 0x025e421f, 0x0173b760, 0x0176fcf2, 0x021fcc55, 0x0076ccd8, 0x00dff728, 0x03815b6c, 0x020fb310, 0x00252c76}}, Y: Field{[10]uint32{0x014fc217, 0x021b78ff, 0x01159852, 0x02723cbf, 0x0045c42e, 0x0392e54f, 0x03a2ab4a, 0x0069580c, 0x013dd5b4, 0x0020c622}}}, + {X: Field{[10]uint32{0x00c9a6cb, 0x039b54a1, 0x011a5f20, 0x0084e385, 0x02d6f8f8, 0x02bb0b3e, 0x007d081d, 0x033bc438, 0x0299bcda, 0x002d6bd0}}, Y: Field{[10]uint32{0x0395448d, 0x0091e6ea, 0x00b2043b, 0x03f42bb7, 0x01c8cf65, 0x004df702, 0x032987eb, 0x02e0b7d5, 0x00078a7d, 0x00302611}}}, + {X: Field{[10]uint32{0x0139c3e3, 0x01da11da, 0x03b0c3c4, 0x01066226, 0x03f8ef61, 0x021460a6, 0x000a153c, 0x01161ce6, 0x01437074, 0x0017d26b}}, Y: Field{[10]uint32{0x007e04eb, 0x0346001d, 0x020f7d01, 0x0251172b, 0x022ae25c, 0x0103f092, 0x0208ae1b, 0x01b0f42e, 0x038520f5, 0x00171034}}}, + {X: Field{[10]uint32{0x007da385, 0x0386e792, 0x01c645cd, 0x02fc9bb2, 0x0216bea3, 0x01a24e50, 0x0230d1ae, 0x03047193, 0x027f88cc, 0x003daec1}}, Y: Field{[10]uint32{0x00288f55, 0x03b5c85e, 0x004fead4, 0x0367cafd, 0x0328dbfd, 0x037792a0, 0x01d4ec8a, 0x025e3362, 0x036d7268, 0x000c5691}}}, + {X: Field{[10]uint32{0x01df6950, 0x03b4affe, 0x03f10bee, 0x0124112c, 0x0152690b, 0x03000115, 0x01aea0ee, 0x00678253, 0x02dec02b, 0x001ed1f3}}, Y: Field{[10]uint32{0x00efe9a6, 0x03b64ef8, 0x01330280, 0x03603084, 0x0353b7cc, 0x015e462b, 0x03ac5a79, 0x037b25ba, 0x01f49bee, 0x0006f369}}}, + {X: Field{[10]uint32{0x0140876d, 0x03f59826, 0x01035a78, 0x0087000a, 0x01182236, 0x035c3d4b, 0x025e1ab2, 0x015b67ad, 0x03f3082d, 0x002e9a75}}, Y: Field{[10]uint32{0x035d393d, 0x01b447e5, 0x02c7684b, 0x00d6b86b, 0x001d1cf9, 0x003b894e, 0x036bdb95, 0x00a2703c, 0x02fd56d5, 0x0017d128}}}, + {X: Field{[10]uint32{0x03d929ff, 0x037f6e5e, 0x0347d1d3, 0x017e5d0c, 0x01fe7ec3, 0x00cc2e8e, 0x03713bf0, 0x03065488, 0x0094d226, 0x0028edc2}}, Y: Field{[10]uint32{0x02ae6135, 0x03013355, 0x00aa593c, 0x00b082ec, 0x01495edf, 0x02ace51e, 0x01ad2e10, 0x016a80d5, 0x03df4275, 0x00017432}}}, + {X: Field{[10]uint32{0x01c804e5, 0x0368df74, 0x0384f0e8, 0x02cd1233, 0x025ae602, 0x003aceff, 0x03e73b52, 0x0207f647, 0x023ebb2d, 0x0031d5b8}}, Y: Field{[10]uint32{0x00df49ff, 0x0044840d, 0x035f8985, 0x02a753ec, 0x025a4fab, 0x02192a60, 0x01f52b29, 0x01ae6f2a, 0x02faedf8, 0x00227d2d}}}, + {X: Field{[10]uint32{0x0271822c, 0x00bba10d, 0x02a00d17, 0x0271b37e, 0x0065410e, 0x030e4127, 0x011c2341, 0x0252afde, 0x00356fab, 0x000d8c9f}}, Y: Field{[10]uint32{0x03ed4c6d, 0x034187f4, 0x0127abe7, 0x00c63096, 0x01eb7456, 0x0253dc0e, 0x0201f04e, 0x0234d7c3, 0x00a4698c, 0x003f8d62}}}, + {X: Field{[10]uint32{0x03dd21bb, 0x0278418d, 0x00c32118, 0x02c61d2c, 0x00b66051, 0x017acabd, 0x02ecf6fc, 0x008c47d1, 0x03be8e37, 0x000edd6f}}, Y: Field{[10]uint32{0x02879908, 0x002a8a56, 0x03c2aea5, 0x02575f46, 0x022e42a0, 0x01e502d3, 0x015e2488, 0x00ce6916, 0x0233e3c3, 0x002e4512}}}, + {X: Field{[10]uint32{0x00d3c5e2, 0x029fdd7c, 0x017b4d92, 0x02f4de6a, 0x035f0272, 0x03e3d11d, 0x015ed721, 0x03a22831, 0x031057b4, 0x00112987}}, Y: Field{[10]uint32{0x02d80141, 0x03785120, 0x00086111, 0x0019b705, 0x02181623, 0x016de4e4, 0x016ec1f0, 0x0011925c, 0x02658034, 0x003a1c3a}}}, + {X: Field{[10]uint32{0x0097fefd, 0x026889c0, 0x00acb74c, 0x039b28a5, 0x011ebed2, 0x03a481bb, 0x00c6fe5c, 0x00f02809, 0x02f70066, 0x00046b80}}, Y: Field{[10]uint32{0x03d6a36f, 0x01f4a337, 0x0024bd69, 0x019a5039, 0x01a4e357, 0x01c108b3, 0x008737ae, 0x03ecc140, 0x0387a262, 0x0018d686}}}, + {X: Field{[10]uint32{0x02142f5c, 0x0021728f, 0x01981069, 0x03c84175, 0x008e987a, 0x02cc6cdf, 0x02ab1b0a, 0x017450b9, 0x010adfb2, 0x0031d44c}}, Y: Field{[10]uint32{0x02821014, 0x0250eebb, 0x018864df, 0x00752f30, 0x02ccca85, 0x039a1716, 0x00485a4b, 0x005ea7c4, 0x01d8ed27, 0x002918c3}}}, + {X: Field{[10]uint32{0x03efe46a, 0x02f76dfb, 0x02f7f790, 0x00ac3856, 0x00a639b7, 0x03ac94db, 0x0357b173, 0x03ce7105, 0x03c64009, 0x003ffd35}}, Y: Field{[10]uint32{0x025080e5, 0x01d91433, 0x02dc6e89, 0x01af6b5f, 0x014c110d, 0x024a92ec, 0x030697a2, 0x008b4440, 0x018e0ffe, 0x001a529e}}}, + {X: Field{[10]uint32{0x03f90534, 0x03233a70, 0x00d18c06, 0x0068c495, 0x0300932b, 0x03350dc1, 0x031e8bc1, 0x027d1ba4, 0x0239c13c, 0x001f5dba}}, Y: Field{[10]uint32{0x03e415bb, 0x00727fa2, 0x026d4d2a, 0x022ce696, 0x024cee43, 0x01163245, 0x007cf7c3, 0x00f63cd3, 0x02ba8f0a, 0x002f052c}}}, + {X: Field{[10]uint32{0x0207ad39, 0x00c3a557, 0x037e8a67, 0x017a097d, 0x01625fda, 0x00c2aaab, 0x00807075, 0x0393cdbc, 0x02d2ca6a, 0x002dbbf2}}, Y: Field{[10]uint32{0x01b1c765, 0x00864e6f, 0x005f00a4, 0x00687d90, 0x02469430, 0x00fa9ab5, 0x036f4a32, 0x034c9c0f, 0x00ef8a56, 0x00121a36}}}, + {X: Field{[10]uint32{0x0233a32e, 0x032a9b8d, 0x02b4ae30, 0x02ab034a, 0x0348e38f, 0x01d501b4, 0x03f9050e, 0x03129b4d, 0x012aa889, 0x0006812c}}, Y: Field{[10]uint32{0x0075911d, 0x01baf237, 0x02966c24, 0x0005ebe1, 0x0221e1c8, 0x039fa827, 0x0017dca3, 0x023641b2, 0x008ffad3, 0x003d0e83}}}, + {X: Field{[10]uint32{0x03209b7e, 0x02ab5460, 0x02a6c531, 0x00016935, 0x03b70e25, 0x0323b777, 0x0078b126, 0x0146413a, 0x00fe9b34, 0x002b6bac}}, Y: Field{[10]uint32{0x037522ad, 0x032c0e74, 0x03173f33, 0x03bf19e4, 0x02b1c59d, 0x02639bb7, 0x00c6b4e1, 0x00a69c23, 0x016ddd4d, 0x000ac9ac}}}, + {X: Field{[10]uint32{0x006e0679, 0x013ae20b, 0x010d19a9, 0x00961183, 0x00d97fa1, 0x0358c9d9, 0x012121d2, 0x03cff2d4, 0x02023931, 0x00013932}}, Y: Field{[10]uint32{0x00537467, 0x0208b461, 0x00348515, 0x005fc965, 0x02cc917b, 0x00a3accc, 0x00c68609, 0x029b2515, 0x02cd3704, 0x003be43b}}}, + {X: Field{[10]uint32{0x011e2971, 0x030821f0, 0x02a220a7, 0x02b2b700, 0x035654ec, 0x00e7d80e, 0x01b5ee41, 0x0304e9c4, 0x0279df69, 0x00287cf0}}, Y: Field{[10]uint32{0x02a16b2d, 0x0148eb6d, 0x023b2252, 0x035ea2a4, 0x02e8aafa, 0x03bf88c9, 0x03699165, 0x01e375fb, 0x039454cb, 0x0015c925}}}, + {X: Field{[10]uint32{0x0398c7a5, 0x004f8339, 0x003c4f4b, 0x0321a9a4, 0x03c19424, 0x03259d7f, 0x030c911b, 0x01a39bd2, 0x03814886, 0x002ab1db}}, Y: Field{[10]uint32{0x00dd2978, 0x029cb461, 0x03189588, 0x00dbac9d, 0x02c37595, 0x00d826f0, 0x011df3f7, 0x01f5b04e, 0x02dfdd6c, 0x00092b85}}}, + {X: Field{[10]uint32{0x00034769, 0x036dc074, 0x030a2a5b, 0x025a8578, 0x010ddce4, 0x012639b2, 0x03601666, 0x008bc378, 0x0171e596, 0x001c3a50}}, Y: Field{[10]uint32{0x0103b757, 0x0113c684, 0x0257d5e2, 0x02ef3d1a, 0x02446111, 0x00803e4a, 0x004d4e80, 0x032fbcae, 0x00a775a9, 0x0035b5f0}}}, + {X: Field{[10]uint32{0x02c78890, 0x023825a3, 0x002b6f28, 0x01ad6e0a, 0x03342670, 0x01aac711, 0x02fa849c, 0x01124925, 0x01e711d4, 0x003285f9}}, Y: Field{[10]uint32{0x03ce2c2e, 0x00bcfa22, 0x034105e3, 0x03b938a0, 0x00e6c58f, 0x005f4cb3, 0x039f501e, 0x01dee376, 0x02322ce5, 0x002cf775}}}, + {X: Field{[10]uint32{0x03aa62e8, 0x018c928b, 0x025717ec, 0x0006357f, 0x00255ec0, 0x0290eae7, 0x000700f3, 0x03f7a1ab, 0x018d8d70, 0x000685a9}}, Y: Field{[10]uint32{0x02710c27, 0x003ac746, 0x017e116c, 0x03cde8e2, 0x00dc2eb6, 0x015f074c, 0x03bc1372, 0x03c28f75, 0x02ba65af, 0x003cb2cb}}}, + {X: Field{[10]uint32{0x00b9d4f2, 0x02438ca5, 0x0301e981, 0x01eb8f97, 0x012dd335, 0x02acab04, 0x01c6bbf5, 0x037c430a, 0x02650b4d, 0x0023cb77}}, Y: Field{[10]uint32{0x034c6afb, 0x024ff937, 0x01f5d804, 0x016f4c9e, 0x0179df33, 0x01647df3, 0x02954bd8, 0x00db5413, 0x00f7e5a7, 0x00381ae3}}}, + {X: Field{[10]uint32{0x00950162, 0x0376a401, 0x018c5a3a, 0x0215b223, 0x00ba1d72, 0x0336cd59, 0x014562e0, 0x00f9f203, 0x0153f821, 0x000cc52d}}, Y: Field{[10]uint32{0x0043532d, 0x02a87e7f, 0x00c24fc4, 0x018804eb, 0x02b4dab4, 0x00f2b547, 0x00a7434e, 0x031543e5, 0x005ee3f7, 0x000cfa0f}}}, + {X: Field{[10]uint32{0x01304000, 0x00f16e89, 0x026062af, 0x0153b8ad, 0x03fa5895, 0x01229f30, 0x01b11a33, 0x0030bff1, 0x02f465ac, 0x001f041f}}, Y: Field{[10]uint32{0x035702c5, 0x0398fba5, 0x0124b508, 0x01e708fc, 0x0289b5a9, 0x015b4d97, 0x027fe78e, 0x001c1741, 0x03122e8a, 0x001ad6f3}}}, + {X: Field{[10]uint32{0x03e4f8b3, 0x01a95296, 0x00cb97b7, 0x0014dac8, 0x0019be46, 0x01565b42, 0x01e257ee, 0x037d9d44, 0x0029325a, 0x003a462a}}, Y: Field{[10]uint32{0x032fa8ae, 0x032481f3, 0x00ebfa9d, 0x03bc0ffc, 0x01b70af0, 0x00846705, 0x03a8f0d1, 0x014b0f86, 0x00a0b461, 0x0006a4bc}}}, + {X: Field{[10]uint32{0x01b9b079, 0x032533d0, 0x015d1e3f, 0x01f4b3a8, 0x01c346c9, 0x038c2720, 0x02dd2e3b, 0x0292e7a4, 0x0203d4f3, 0x0021dc36}}, Y: Field{[10]uint32{0x03123c03, 0x03a10b6a, 0x0005a10c, 0x01847ed4, 0x0053f964, 0x013d5feb, 0x01372fe6, 0x00f55c63, 0x030fdc63, 0x00340950}}}, + {X: Field{[10]uint32{0x00d8b22b, 0x012ab56b, 0x03ea1731, 0x01c318a0, 0x01a6589f, 0x02ef00e7, 0x026a57f6, 0x00955ec4, 0x013fae2b, 0x0031ad2b}}, Y: Field{[10]uint32{0x00d29bfe, 0x006bfeb6, 0x036fb46e, 0x023b3cf1, 0x0385f288, 0x01270e37, 0x01f278de, 0x00d048d7, 0x01cd2c1c, 0x003a148f}}}, + {X: Field{[10]uint32{0x03a86e14, 0x0232dc0d, 0x039689c8, 0x006c786a, 0x01462274, 0x03e1c586, 0x03b1e91f, 0x03e610dc, 0x01486ffb, 0x0026b3b6}}, Y: Field{[10]uint32{0x00b352d9, 0x01fd6482, 0x012cde8e, 0x03b29aa1, 0x0316e1e7, 0x02527074, 0x003cc321, 0x00c77ffd, 0x031f1b4c, 0x0035e9fa}}}, + {X: Field{[10]uint32{0x039007f3, 0x0153d7c6, 0x0322b87c, 0x015780e2, 0x01b08bf0, 0x03a2b29a, 0x034015b1, 0x036ad313, 0x036ffccb, 0x002bd454}}, Y: Field{[10]uint32{0x03130f7b, 0x03e12791, 0x027ef00c, 0x02ddc0e8, 0x00cbe813, 0x02ec74c2, 0x03fa85ba, 0x01fb3d27, 0x034c95c0, 0x002daec2}}}, + {X: Field{[10]uint32{0x01823ce2, 0x00bb94c4, 0x00c3e5bb, 0x03e8608e, 0x0156e02f, 0x01707249, 0x0045a092, 0x02aed5bf, 0x02df3ea0, 0x003b14c1}}, Y: Field{[10]uint32{0x01ee8b99, 0x004a100b, 0x009f6898, 0x02ff6507, 0x009457f4, 0x00f242f6, 0x00653524, 0x0197d060, 0x01b6720f, 0x00325433}}}, + {X: Field{[10]uint32{0x032d90a0, 0x0366ebb9, 0x00d876c5, 0x02320779, 0x03587f46, 0x024590d8, 0x0397ecd5, 0x01ef1868, 0x00a5be12, 0x000a4ec7}}, Y: Field{[10]uint32{0x0235d821, 0x01bdd36e, 0x0261bae2, 0x0090f463, 0x010443a5, 0x01d9218f, 0x03d81d91, 0x027c17a4, 0x030f238e, 0x00120840}}}, + {X: Field{[10]uint32{0x00865488, 0x007d21ad, 0x003c1256, 0x01088bbe, 0x00168771, 0x01a2ff04, 0x0151f0ee, 0x01aadaca, 0x037d9987, 0x003af952}}, Y: Field{[10]uint32{0x01381c07, 0x01bbae1b, 0x03c47924, 0x02835206, 0x0158d84f, 0x02090bd4, 0x0299d91b, 0x0200bfe9, 0x011ccaf8, 0x000a8759}}}, + {X: Field{[10]uint32{0x0064acdc, 0x03671a4d, 0x019dfd38, 0x00951174, 0x0133ac83, 0x00a74366, 0x0220109b, 0x035a6fb4, 0x01233ab0, 0x00223ddd}}, Y: Field{[10]uint32{0x03276702, 0x00a0b2f2, 0x00d5b79a, 0x01651670, 0x038e0590, 0x03b1afaf, 0x02a2cb1a, 0x017bd4c7, 0x0122fbd9, 0x0023e454}}}, + {X: Field{[10]uint32{0x02b3bb01, 0x005cd668, 0x0039fb81, 0x02e5ba51, 0x03c7fa40, 0x03afa5e5, 0x036cfa08, 0x00376276, 0x013de721, 0x0007611d}}, Y: Field{[10]uint32{0x01f41ad6, 0x029e187c, 0x0260dabf, 0x00ce7cd0, 0x012e889c, 0x01503121, 0x000b6d6f, 0x029361d1, 0x035aba53, 0x003dcd82}}}, + {X: Field{[10]uint32{0x011d4b2f, 0x033bed4c, 0x01e1c27f, 0x00f979d0, 0x0336f82a, 0x02ce2338, 0x01ae032c, 0x020b073c, 0x01f5176f, 0x000679a7}}, Y: Field{[10]uint32{0x03d5c143, 0x016ee9b2, 0x016e00b9, 0x02bd6ed2, 0x0309d9f7, 0x030745ec, 0x0175dc8c, 0x014efaf8, 0x00fec9ba, 0x0031007d}}}, + {X: Field{[10]uint32{0x02e3f2c9, 0x00d5332b, 0x0372953d, 0x01790ab7, 0x0119b04f, 0x01fca6a9, 0x01a93995, 0x0097ff7c, 0x0202c1f1, 0x001cc627}}, Y: Field{[10]uint32{0x0137f704, 0x00270069, 0x01424010, 0x00710407, 0x00d901de, 0x0390180e, 0x01d21b01, 0x01f3e188, 0x008f1c6e, 0x0014ae3a}}}, + {X: Field{[10]uint32{0x0087a74f, 0x0095ba4a, 0x0366901c, 0x02c296b9, 0x03278fd2, 0x01d1fc74, 0x038956cb, 0x02a2fd4b, 0x00828ff1, 0x00317af8}}, Y: Field{[10]uint32{0x01259860, 0x03c736f3, 0x033823ef, 0x0075b026, 0x02c506e5, 0x035cdad7, 0x0397dc92, 0x012e606a, 0x00b962e7, 0x00033963}}}, + {X: Field{[10]uint32{0x0182da76, 0x02815892, 0x01166435, 0x019f20ee, 0x011a7808, 0x02f220f5, 0x016feed3, 0x0038050a, 0x0221f799, 0x001e0f05}}, Y: Field{[10]uint32{0x0236da30, 0x0158f862, 0x03bc622f, 0x01d2f57f, 0x01f52245, 0x03ae0067, 0x0165c3e8, 0x02271a71, 0x03e2c9a1, 0x0000dc2c}}}, + {X: Field{[10]uint32{0x022b3305, 0x0267dbfe, 0x015794d7, 0x032cb1c7, 0x01fad66f, 0x0294dc87, 0x024cbd64, 0x01a9185c, 0x02800ccc, 0x0015579f}}, Y: Field{[10]uint32{0x004e9e41, 0x036980fd, 0x030eb63b, 0x00242cc9, 0x02db9b48, 0x023f9b75, 0x035ed312, 0x01c10863, 0x0165d39d, 0x0019eefc}}}, + {X: Field{[10]uint32{0x00243471, 0x0084e950, 0x0150a4b0, 0x02932b37, 0x030faa40, 0x010b1ac6, 0x028467e2, 0x0351b3c7, 0x0226ab1c, 0x00103126}}, Y: Field{[10]uint32{0x03dadf86, 0x0204fd8b, 0x0296bdc2, 0x00c19fd3, 0x03ad55bf, 0x00d08930, 0x039fdb4c, 0x0188bf82, 0x03005002, 0x0005a542}}}, + {X: Field{[10]uint32{0x03935298, 0x02d8bdb5, 0x021627c8, 0x009835df, 0x02473062, 0x0164f1d1, 0x0010b9f5, 0x02346272, 0x03e5db09, 0x003adace}}, Y: Field{[10]uint32{0x015c5bc8, 0x01d3c380, 0x022fb9bd, 0x01c512f8, 0x00c84e96, 0x00073b72, 0x01902317, 0x01bd707e, 0x01843f35, 0x000f4a55}}}, + {X: Field{[10]uint32{0x02b26091, 0x019c3397, 0x03ca903f, 0x00da6813, 0x03a06835, 0x034186d4, 0x020a0734, 0x0305a472, 0x00a42b55, 0x0005dc86}}, Y: Field{[10]uint32{0x03a5fa42, 0x02da432c, 0x00f4eced, 0x01c9d67c, 0x02057e0e, 0x017a2e5e, 0x017f243e, 0x02f1cddc, 0x021aa8a3, 0x00258459}}}, + {X: Field{[10]uint32{0x03d2a680, 0x020e99e3, 0x02be37f8, 0x018a2c1f, 0x02ea0c37, 0x009f099e, 0x0028c001, 0x017e29f4, 0x03a2f3bc, 0x002106a3}}, Y: Field{[10]uint32{0x012cf1b0, 0x00b53cd1, 0x0289d9a4, 0x02313e6e, 0x00052693, 0x0236ef73, 0x00577128, 0x007dde80, 0x037db2fd, 0x0015e6fc}}}, + {X: Field{[10]uint32{0x02dea82d, 0x0142985b, 0x01691322, 0x02735f94, 0x00358578, 0x00e6714f, 0x001421da, 0x01fc7b20, 0x01543a37, 0x002c07bd}}, Y: Field{[10]uint32{0x01a90265, 0x000802c9, 0x009eb962, 0x0347998e, 0x0082e119, 0x01e8dfc5, 0x03626a00, 0x02cbc4eb, 0x00e97e29, 0x000a3cc3}}}, + {X: Field{[10]uint32{0x00f38904, 0x006c2b01, 0x029a6259, 0x01f02ce2, 0x00ba344e, 0x03e32646, 0x02e70d6e, 0x03190c5f, 0x014e8e3c, 0x002e4f80}}, Y: Field{[10]uint32{0x000ac3d3, 0x027f2549, 0x001f72b2, 0x03b702b8, 0x00d0b368, 0x00bfe26d, 0x03152e10, 0x034431af, 0x01855bdf, 0x00004a70}}}, + {X: Field{[10]uint32{0x03acd522, 0x02fd5201, 0x0137305f, 0x031a2b20, 0x01a00601, 0x01b58c62, 0x000a1dd2, 0x00366bfe, 0x02f243c5, 0x00383d09}}, Y: Field{[10]uint32{0x02b749fc, 0x0035c177, 0x02d1e143, 0x00abac92, 0x021c1938, 0x033ce70a, 0x00bd848c, 0x037178c1, 0x03e0951a, 0x0025b620}}}, + {X: Field{[10]uint32{0x0073233c, 0x03aa6de7, 0x03df2147, 0x0052ceee, 0x00d5379f, 0x00ee7b01, 0x030adda6, 0x025eb4a1, 0x007440e8, 0x003847a7}}, Y: Field{[10]uint32{0x01c1f019, 0x03c2881b, 0x016c5cb9, 0x013767cf, 0x01e125e3, 0x0388b8d6, 0x01a9df03, 0x01d4c8fd, 0x014b2919, 0x001275b9}}}, + {X: Field{[10]uint32{0x016b2c2b, 0x03d9e9ea, 0x0191c79c, 0x01c26b11, 0x02ae38ee, 0x00009f30, 0x0396eca2, 0x03c514ed, 0x004b0c5e, 0x00246b56}}, Y: Field{[10]uint32{0x030bac2a, 0x030729d4, 0x001e23e9, 0x025fb3a1, 0x01565dfd, 0x017670f1, 0x0379e5db, 0x0314c447, 0x0213a620, 0x00360568}}}, + {X: Field{[10]uint32{0x0299f8d2, 0x01011850, 0x033dabfe, 0x00708c0f, 0x01103297, 0x02cc8bcd, 0x0013785c, 0x00d3c81d, 0x0392f4fa, 0x000f9c94}}, Y: Field{[10]uint32{0x0308ae85, 0x0088f95d, 0x0039e042, 0x015de256, 0x014e0c1d, 0x0241fbe9, 0x01482176, 0x03bb57cd, 0x02515add, 0x00238c8e}}}, + {X: Field{[10]uint32{0x01a98160, 0x03d5e411, 0x039bced4, 0x026e6808, 0x0191d911, 0x02a18fcd, 0x03c00acf, 0x0226ad20, 0x02c201a5, 0x0017a1ef}}, Y: Field{[10]uint32{0x02e7d47b, 0x009408fc, 0x032633a8, 0x00734335, 0x0233625f, 0x03f0e69b, 0x02f3c159, 0x01707e7a, 0x038433c7, 0x002a228e}}}, + {X: Field{[10]uint32{0x0268a0ed, 0x03e87234, 0x00f32489, 0x003b494b, 0x01da1826, 0x013a6642, 0x01cb6524, 0x00ecd5d2, 0x02132cb9, 0x0030b821}}, Y: Field{[10]uint32{0x008a5761, 0x00360aa3, 0x007644ed, 0x01934169, 0x0328e02e, 0x015381dc, 0x03038d68, 0x00d97751, 0x03ad1f16, 0x0034fcb8}}}, + {X: Field{[10]uint32{0x031978af, 0x005ee9c3, 0x0025c745, 0x034392e4, 0x023b9053, 0x0077650c, 0x02193c23, 0x0261a5ec, 0x005eccf0, 0x00264c13}}, Y: Field{[10]uint32{0x009dc789, 0x00066a88, 0x02111338, 0x03cc7836, 0x00ba1324, 0x00f74128, 0x03e77e34, 0x004e59bd, 0x027b638b, 0x003b9dfe}}}, + {X: Field{[10]uint32{0x00c5c6bc, 0x004c8aad, 0x02b1d1c2, 0x000d9435, 0x0325a79f, 0x027be256, 0x01f04f70, 0x03ecdd94, 0x00c559ad, 0x00103842}}, Y: Field{[10]uint32{0x039db653, 0x039192d9, 0x02b2cfc5, 0x02ae8253, 0x00210eb2, 0x011ffbd1, 0x02ff3f8c, 0x03992212, 0x03385733, 0x0022602a}}}, + {X: Field{[10]uint32{0x00c6a78a, 0x03ab3722, 0x01aca5bb, 0x037725c4, 0x006d6276, 0x03d4237d, 0x00315287, 0x001c8483, 0x02572d19, 0x00263220}}, Y: Field{[10]uint32{0x01a61c92, 0x0399dad0, 0x03256f3e, 0x003b8230, 0x00b57f27, 0x0341443a, 0x02ea7f48, 0x017fef44, 0x01761f5c, 0x001746aa}}}, + {X: Field{[10]uint32{0x00af6fed, 0x036ac818, 0x03740c05, 0x002601bf, 0x02d7b4cf, 0x005b0deb, 0x00eeab7a, 0x008c1ae1, 0x027a25e9, 0x000e26ae}}, Y: Field{[10]uint32{0x0065707e, 0x003b3db4, 0x01c13d6f, 0x00dcd7d8, 0x0049c326, 0x004aca64, 0x032ed608, 0x038ba34d, 0x00c9ec48, 0x0019ceac}}}, + {X: Field{[10]uint32{0x0253df17, 0x014fbab2, 0x03732614, 0x02ab94e6, 0x026619ea, 0x017c46ce, 0x02fda62e, 0x0255ba4f, 0x03ba832c, 0x00277193}}, Y: Field{[10]uint32{0x005990ac, 0x02ebf6bd, 0x0089f956, 0x0326520e, 0x038f60a9, 0x0228d63b, 0x0267ad8d, 0x02ac4290, 0x00a93c56, 0x000602ce}}}, + {X: Field{[10]uint32{0x024921f7, 0x0270557f, 0x008a9675, 0x00334f54, 0x03b3439b, 0x02d9c1ea, 0x003528b8, 0x030b0d88, 0x0218e758, 0x001c4463}}, Y: Field{[10]uint32{0x02104ee0, 0x01e78a2a, 0x0000b5ec, 0x03df8732, 0x0176bf22, 0x0046d4b4, 0x0108719f, 0x013a7192, 0x02f12c1b, 0x0030bd86}}}, + {X: Field{[10]uint32{0x02c3d096, 0x02ecaa0f, 0x0224245c, 0x008d94c6, 0x0146218b, 0x02b717f4, 0x00e09909, 0x03cf1249, 0x01ee11b9, 0x000cef3b}}, Y: Field{[10]uint32{0x00fbad0a, 0x0015f56b, 0x03e9d655, 0x023578c5, 0x03f83b3e, 0x011a53f6, 0x01a71f6f, 0x0319ce50, 0x011a6c22, 0x00057d2f}}}, + {X: Field{[10]uint32{0x0213ccb4, 0x02c83713, 0x031d0e66, 0x0101d661, 0x01fbd977, 0x00bf6e95, 0x021e5cb6, 0x03a7c7c5, 0x033a4ab5, 0x0012d666}}, Y: Field{[10]uint32{0x023fb523, 0x020a6752, 0x034232b1, 0x0268b1b7, 0x006c9601, 0x02cd0851, 0x03064119, 0x009cae2d, 0x01da9035, 0x0018d40e}}}, + {X: Field{[10]uint32{0x01269d10, 0x010d96c8, 0x03627569, 0x0368d7a5, 0x02decb8d, 0x0144d809, 0x038f6429, 0x0132a506, 0x034cdae5, 0x00067daf}}, Y: Field{[10]uint32{0x033c95d7, 0x024b1933, 0x03f3da1c, 0x01ad8274, 0x036cb31a, 0x02c9d40b, 0x00bca48d, 0x001b7099, 0x03dc090b, 0x0028930f}}}, + {X: Field{[10]uint32{0x0301314c, 0x03751bc6, 0x0267a058, 0x01d6c5de, 0x028a2708, 0x02b41ceb, 0x0229adf7, 0x034537d9, 0x01a98027, 0x002f0f7c}}, Y: Field{[10]uint32{0x008d1f76, 0x02cc2ae0, 0x005e7b6b, 0x0195dc1d, 0x01934450, 0x03645462, 0x0233e898, 0x00741cbb, 0x029154f5, 0x0026774e}}}, + {X: Field{[10]uint32{0x01d72c3c, 0x012a795f, 0x0285e1ea, 0x00793768, 0x02c34ef3, 0x0306b97d, 0x025f5b5a, 0x01c3a134, 0x0264521a, 0x0025de90}}, Y: Field{[10]uint32{0x039f5a0c, 0x03a6ca8a, 0x0041b4fc, 0x01a0cb87, 0x01dbf44f, 0x03500ff2, 0x0025b61c, 0x00bf9341, 0x00197aab, 0x003c6ff2}}}, + {X: Field{[10]uint32{0x01c9b339, 0x004b1a43, 0x01b47a1c, 0x0044f89c, 0x00098b26, 0x02b71ec7, 0x014a7f58, 0x01694cfb, 0x024a85fc, 0x0017f7f7}}, Y: Field{[10]uint32{0x02c6555a, 0x0113d245, 0x02b1ce97, 0x0222cbdb, 0x01731c25, 0x01bec92e, 0x011bad52, 0x02539825, 0x03afbd6a, 0x000fb7ca}}}, + {X: Field{[10]uint32{0x01e9c50d, 0x000508fa, 0x007476ce, 0x02fe089a, 0x00afc17a, 0x03edf6e3, 0x02c1ac50, 0x022bf3ba, 0x032cdcd2, 0x002e2f35}}, Y: Field{[10]uint32{0x03c55e9d, 0x01144940, 0x026dbf2c, 0x038da9d5, 0x039cb6d0, 0x01dc694f, 0x03d9f2f3, 0x03015e6e, 0x03c52e6d, 0x0002098c}}}, + {X: Field{[10]uint32{0x01f75c77, 0x02290700, 0x01c728be, 0x03a769cd, 0x01721bc2, 0x03a51959, 0x01d01eb6, 0x030def19, 0x0199133b, 0x001b082e}}, Y: Field{[10]uint32{0x00b71e53, 0x037c4550, 0x03f20cf6, 0x0129e717, 0x015e36f4, 0x0296b91d, 0x0342aa47, 0x000db897, 0x0274d8ad, 0x000832bd}}}, + {X: Field{[10]uint32{0x015adb07, 0x03246b4c, 0x03a7022b, 0x03e858ed, 0x03f877b5, 0x00ba4677, 0x00e4bf2f, 0x017c54e7, 0x01416965, 0x002ef924}}, Y: Field{[10]uint32{0x03f93a1e, 0x01dba732, 0x036ac40f, 0x01fc3b21, 0x01a77b84, 0x02e3f029, 0x02b5ff6d, 0x0348f231, 0x00256618, 0x002334f8}}}, + {X: Field{[10]uint32{0x01e73786, 0x00531a19, 0x00c752fe, 0x02bb4e60, 0x03bf6dfe, 0x015905cd, 0x0339bbbc, 0x01d2fc1f, 0x0078e383, 0x001d22cc}}, Y: Field{[10]uint32{0x02811ac8, 0x032533ca, 0x02eb28f3, 0x02c18a5e, 0x03ea86b6, 0x005ff211, 0x01f2c802, 0x037e891c, 0x020a61a7, 0x001fdf2b}}}, + {X: Field{[10]uint32{0x0364e4b4, 0x03522fb1, 0x000bcd23, 0x024b414b, 0x005d39d5, 0x009cb3da, 0x015728b2, 0x00956518, 0x03c5b89a, 0x003e98f1}}, Y: Field{[10]uint32{0x00a47c8a, 0x01f5a4a3, 0x01d31fbe, 0x035972d3, 0x01804724, 0x0359f410, 0x0238a506, 0x02758387, 0x03a27751, 0x003130ca}}}, + {X: Field{[10]uint32{0x0056c91c, 0x014e1c73, 0x024446c9, 0x02c1c38f, 0x0386978e, 0x02520c52, 0x025ea13d, 0x038e028d, 0x0197d014, 0x0030bb5c}}, Y: Field{[10]uint32{0x026a595e, 0x03700791, 0x0007009b, 0x02ddcdf7, 0x033404bd, 0x022e6c3e, 0x0054a09d, 0x033463de, 0x0293e7c1, 0x00171cf0}}}, + {X: Field{[10]uint32{0x03c266be, 0x03fa1c9b, 0x03ab5f22, 0x00130367, 0x026c2b3a, 0x03cfa001, 0x0334e846, 0x002f5b0b, 0x01efcb1e, 0x00094530}}, Y: Field{[10]uint32{0x024e3eb3, 0x007b2531, 0x01ad069a, 0x0376333e, 0x02507c35, 0x017d9bb1, 0x00443466, 0x02cb67fe, 0x006c07bb, 0x0031682b}}}, + {X: Field{[10]uint32{0x02286350, 0x01bbe513, 0x0081df6b, 0x03ff25a8, 0x00e2318b, 0x028e10f2, 0x01d2e289, 0x011fc963, 0x03050116, 0x0016f01f}}, Y: Field{[10]uint32{0x03bcbea4, 0x03e16afa, 0x02c66a41, 0x01947844, 0x017a91c4, 0x0096136d, 0x007d059f, 0x03bc1236, 0x00931217, 0x00084f38}}}, + {X: Field{[10]uint32{0x023cad8a, 0x0285cc66, 0x03dd8862, 0x00d7da80, 0x03db9c13, 0x01eb9193, 0x0173f706, 0x016c0e29, 0x02429737, 0x003b6d5b}}, Y: Field{[10]uint32{0x01ef5fa7, 0x01111fc5, 0x01f2e531, 0x014c7660, 0x00358620, 0x009bcef9, 0x038414a4, 0x03551986, 0x027016f8, 0x0034f986}}}, + {X: Field{[10]uint32{0x03d5d732, 0x0323675c, 0x03d55817, 0x023b435d, 0x02684908, 0x0380a191, 0x03609982, 0x019204ef, 0x036e7826, 0x000a4949}}, Y: Field{[10]uint32{0x0287296f, 0x004ff926, 0x02d22622, 0x004c8375, 0x0184b332, 0x02ec33b8, 0x032d755d, 0x0262773a, 0x03a6a97c, 0x003d4c55}}}, + {X: Field{[10]uint32{0x03c0a034, 0x039027a6, 0x0337fa69, 0x01e70ebe, 0x01912863, 0x00dc067a, 0x02098829, 0x03d294dc, 0x01d5bda0, 0x000b115e}}, Y: Field{[10]uint32{0x02f7d99c, 0x032a4d17, 0x0315c336, 0x019ec6e6, 0x02a319d4, 0x00c41ef2, 0x01acd23f, 0x030f1195, 0x034dd889, 0x0038542f}}}, + {X: Field{[10]uint32{0x00808904, 0x0221516a, 0x00b3d056, 0x02e109a6, 0x02025f21, 0x02bcc60c, 0x02295870, 0x03e1daef, 0x020011f9, 0x0017c982}}, Y: Field{[10]uint32{0x02e02350, 0x01cea263, 0x03a9b534, 0x013b60e8, 0x01736fe6, 0x001bab0f, 0x00d2ce00, 0x02a87de9, 0x0232164c, 0x001ab4ce}}}, + {X: Field{[10]uint32{0x02ac4b8b, 0x016935ed, 0x011000d6, 0x01a7a221, 0x029d1f2c, 0x00fecf5a, 0x02fd430f, 0x017b2414, 0x00c61209, 0x000eeeef}}, Y: Field{[10]uint32{0x010b0c97, 0x03e7ea95, 0x019487e4, 0x032ea8ed, 0x0240d244, 0x03256076, 0x01b090f8, 0x029b9f6d, 0x00283846, 0x0000ca3a}}}, + {X: Field{[10]uint32{0x016acff0, 0x02e76065, 0x0117daff, 0x032998b6, 0x02343e80, 0x03088bd2, 0x009af44b, 0x0363bffb, 0x027bdd0f, 0x00126140}}, Y: Field{[10]uint32{0x038affda, 0x005b088e, 0x0065468c, 0x0053fa05, 0x03460b10, 0x009c5a88, 0x01561b5f, 0x01b904c1, 0x012e37a3, 0x00162fbf}}}, + {X: Field{[10]uint32{0x03959de7, 0x0098f559, 0x0359b92e, 0x03300386, 0x006e826e, 0x000ecf73, 0x01eb2d88, 0x0022466d, 0x00e8d2e3, 0x0008518e}}, Y: Field{[10]uint32{0x0232342a, 0x0350793d, 0x03dd8ad9, 0x03c72379, 0x02dc22c0, 0x03d7f270, 0x02e0454f, 0x0078a4d6, 0x01216f13, 0x00027762}}}, + {X: Field{[10]uint32{0x02f3cfdd, 0x00013db9, 0x01f35444, 0x0041a455, 0x016876c1, 0x0197828c, 0x023532b9, 0x00b5abcf, 0x03055ced, 0x001b3b61}}, Y: Field{[10]uint32{0x02546ec6, 0x03ad5bdf, 0x00ac0a83, 0x000665ff, 0x0355b17c, 0x0079abb9, 0x03ba4e2a, 0x0155be2d, 0x02abc86f, 0x003d46c6}}}, + {X: Field{[10]uint32{0x01dcfacb, 0x007221b2, 0x0172730a, 0x03901086, 0x017fc3ad, 0x0216746b, 0x02634987, 0x024db38c, 0x0267876c, 0x0025405b}}, Y: Field{[10]uint32{0x02f4f660, 0x02ece49a, 0x03160742, 0x00bcb90f, 0x034df723, 0x004016ea, 0x03d284b8, 0x019bbbfe, 0x00c4e6e2, 0x000a679e}}}, + {X: Field{[10]uint32{0x026f23f2, 0x0054c67b, 0x00763513, 0x003e76cc, 0x00c513d2, 0x030e633c, 0x02a8019f, 0x0070e710, 0x02c83040, 0x0012fb19}}, Y: Field{[10]uint32{0x038514fc, 0x02c9cd64, 0x003d58e8, 0x028550ff, 0x034fcded, 0x0224a718, 0x01aa9162, 0x0118261c, 0x02923b7d, 0x003c77ff}}}, + {X: Field{[10]uint32{0x008a59c7, 0x03b69e21, 0x03bb27f3, 0x03bd6ac9, 0x019088c4, 0x00394eb9, 0x000015a6, 0x00ee5dab, 0x03d14051, 0x002d4144}}, Y: Field{[10]uint32{0x01c36399, 0x016252e6, 0x0084129a, 0x0326999d, 0x01dc9282, 0x02de1b33, 0x03254c51, 0x039b08fe, 0x02e51182, 0x00271072}}}, + {X: Field{[10]uint32{0x0290708d, 0x005564ed, 0x00c003e4, 0x01149bcc, 0x01d1df38, 0x02a482b2, 0x029bda38, 0x0280e5a9, 0x02533989, 0x00165e49}}, Y: Field{[10]uint32{0x02ba648f, 0x03b40bc6, 0x00bab3a3, 0x02ce5eb9, 0x034c750c, 0x027b99cd, 0x02561921, 0x021f6d79, 0x00b72748, 0x001fcb05}}}, + {X: Field{[10]uint32{0x01eacf6f, 0x00dc1581, 0x02dd34db, 0x03e4fb05, 0x01251cc7, 0x0245b599, 0x00fe2b3e, 0x00aa4d1e, 0x0366cf01, 0x001ee8ad}}, Y: Field{[10]uint32{0x016404bb, 0x02cc47e1, 0x02a6903f, 0x0230b212, 0x003dcc7e, 0x03a2f745, 0x01212865, 0x01e630dc, 0x0138f950, 0x00053f62}}}, + {X: Field{[10]uint32{0x02b5d6bb, 0x00f7e6fa, 0x013a71c4, 0x008959af, 0x017f9e9d, 0x027a0e73, 0x0147af8a, 0x024367f2, 0x02fef69c, 0x000c18bc}}, Y: Field{[10]uint32{0x02f5ee58, 0x025caf01, 0x02bbaad9, 0x0350868d, 0x02064047, 0x0364a9c5, 0x01e7b719, 0x01b505ff, 0x00334991, 0x0036e12a}}}, + {X: Field{[10]uint32{0x00b06e74, 0x0230bf55, 0x00ce3db3, 0x021f8c9f, 0x00f6fae6, 0x02d119c0, 0x034d695c, 0x03b229df, 0x009d69db, 0x003b57e5}}, Y: Field{[10]uint32{0x018930e3, 0x00bfafcb, 0x019fdee6, 0x008fc566, 0x032a6907, 0x026542f2, 0x0104ff92, 0x00f54194, 0x0060057b, 0x0011c938}}}, + {X: Field{[10]uint32{0x021b7cdc, 0x01c39181, 0x028d3d71, 0x01427af5, 0x0030e129, 0x01ab3004, 0x01312fea, 0x0209d83a, 0x02033002, 0x00135957}}, Y: Field{[10]uint32{0x00ea99bb, 0x03b948c4, 0x00d0b7bc, 0x02789e33, 0x00439957, 0x027a5fc1, 0x01e046b6, 0x01526cbd, 0x01226c27, 0x00243bf0}}}, + {X: Field{[10]uint32{0x02f1b35d, 0x019beaba, 0x0260dbf1, 0x02030d46, 0x0368e05e, 0x0120fe56, 0x029edf4a, 0x03bfb342, 0x0356b888, 0x003dad81}}, Y: Field{[10]uint32{0x00a5fb8c, 0x008a8f4e, 0x01df6bfd, 0x023c2f39, 0x00cb57e9, 0x02bebe6c, 0x0096b241, 0x005611aa, 0x02bdaa78, 0x0009efb7}}}, + {X: Field{[10]uint32{0x03c55748, 0x00c06228, 0x00b516ca, 0x00e23f1f, 0x008c81c5, 0x0235ba8b, 0x004db945, 0x0288ddcb, 0x00aa942b, 0x0033164b}}, Y: Field{[10]uint32{0x03288158, 0x0144b476, 0x0307c63d, 0x02c75900, 0x01bb6bd2, 0x00d870fc, 0x0277d100, 0x015820db, 0x03cd358e, 0x000db8bd}}}, + {X: Field{[10]uint32{0x02c1a456, 0x0280cbfd, 0x00edf6a7, 0x01865db4, 0x00f93721, 0x03b7d0c1, 0x023acb8c, 0x011a6086, 0x01dca5bb, 0x0012b2ea}}, Y: Field{[10]uint32{0x02262437, 0x0393a154, 0x021669ca, 0x00aa5cbc, 0x01d6fb30, 0x02ef40b3, 0x032287e9, 0x011fccf9, 0x003ab2ab, 0x002cdba6}}}, + {X: Field{[10]uint32{0x03061f91, 0x011b76fa, 0x0072d974, 0x00f612a5, 0x017be363, 0x02e73a58, 0x010e0c61, 0x01e74cad, 0x005e0422, 0x00322946}}, Y: Field{[10]uint32{0x03d4b5cb, 0x02348b66, 0x000ff3c3, 0x0347fd97, 0x01cdb7cb, 0x019a3bac, 0x00c1df74, 0x00626f59, 0x00b7445e, 0x0033ea94}}}, + {X: Field{[10]uint32{0x035f18f9, 0x02c41074, 0x0120e052, 0x002197e3, 0x01535faf, 0x0277842b, 0x01168a88, 0x03d844d9, 0x016707f4, 0x00307255}}, Y: Field{[10]uint32{0x00033749, 0x02ae5052, 0x027eb537, 0x0384dc23, 0x02543919, 0x015bd11c, 0x02fc1eb9, 0x01ad8c26, 0x003b3d95, 0x000d3def}}}, + {X: Field{[10]uint32{0x0236a8f3, 0x006b9474, 0x038fa8df, 0x01a3cf87, 0x028bb68d, 0x00fdf495, 0x02093703, 0x01cdbad2, 0x03b736f6, 0x00237d3e}}, Y: Field{[10]uint32{0x0102122c, 0x01ddd917, 0x00c81229, 0x03ddc1dc, 0x00cef6b0, 0x006ece14, 0x007af267, 0x00b400e6, 0x01fe8e9a, 0x000f5c61}}}, + {X: Field{[10]uint32{0x025af3dd, 0x02a979aa, 0x00297c2b, 0x02db47af, 0x01c2c8bb, 0x011d4047, 0x02a1ec0c, 0x01f2e3ca, 0x01f0e35c, 0x0000358d}}, Y: Field{[10]uint32{0x03a51a2f, 0x01a00f1e, 0x006435e3, 0x0264614f, 0x03441e5a, 0x0241eb97, 0x0190a5b5, 0x03a2cc6a, 0x02bdc588, 0x0000249b}}}, + {X: Field{[10]uint32{0x0346a4bc, 0x0181c802, 0x01923d64, 0x0097a2d4, 0x013678b5, 0x0038e381, 0x014ea383, 0x014dd5d4, 0x012d5f86, 0x0002d634}}, Y: Field{[10]uint32{0x03438d3e, 0x01121041, 0x037f648e, 0x0103a920, 0x00d77c9e, 0x0265702d, 0x01d587ce, 0x02eace4d, 0x01835b0e, 0x003ded64}}}, + {X: Field{[10]uint32{0x029a7f36, 0x029db6f6, 0x0178011b, 0x014d9187, 0x0212cb42, 0x01e3a26b, 0x03ad0755, 0x00d903b3, 0x028cb401, 0x002edf1a}}, Y: Field{[10]uint32{0x0036581c, 0x00836852, 0x00ba7d1c, 0x0100c1b7, 0x023c2f5c, 0x01c20a56, 0x0195b835, 0x035861a2, 0x02583774, 0x001f7680}}}, + {X: Field{[10]uint32{0x0114a9e6, 0x00eca60d, 0x03b91968, 0x0065c8b3, 0x02f116b8, 0x03e96dea, 0x00a990a7, 0x0233be77, 0x00f792cc, 0x00053dbc}}, Y: Field{[10]uint32{0x024d7055, 0x01bc840e, 0x000b97b9, 0x017fc8e0, 0x01226104, 0x02cffb2d, 0x00e5aac4, 0x01663243, 0x03927a07, 0x002230d7}}}, + {X: Field{[10]uint32{0x03448541, 0x02ef39dd, 0x014fa76b, 0x034125ab, 0x02fb60f4, 0x015fd2a8, 0x01ad8964, 0x02846177, 0x01f4eb9f, 0x0012e579}}, Y: Field{[10]uint32{0x01e71d21, 0x01c1b451, 0x038f4d27, 0x0023df8a, 0x01502d1f, 0x0004807b, 0x0087f512, 0x032cc6e8, 0x0387513a, 0x00078401}}}, + {X: Field{[10]uint32{0x024b63ae, 0x032f4a8d, 0x01c16dce, 0x01993617, 0x03a7af53, 0x008cd568, 0x004aa312, 0x016cb18e, 0x03c067f7, 0x003a685f}}, Y: Field{[10]uint32{0x027fb8c7, 0x00302177, 0x01ac1956, 0x01a806d3, 0x030a40e0, 0x00ad806a, 0x038fcf01, 0x01148d8b, 0x0388ad67, 0x00108288}}}, + {X: Field{[10]uint32{0x03ff9169, 0x02b55110, 0x0281cf10, 0x010e0cc6, 0x0096d4ff, 0x0020d04c, 0x023d066c, 0x03b2053b, 0x0136f320, 0x0000e761}}, Y: Field{[10]uint32{0x028ca248, 0x01b8d9f0, 0x023be7a7, 0x00d44e9e, 0x00c74345, 0x00152af4, 0x0166a556, 0x03a26183, 0x01e91478, 0x001c3ba2}}}, + {X: Field{[10]uint32{0x03b636e8, 0x036a8f0b, 0x0320e001, 0x024f127f, 0x029f95b9, 0x00dc7389, 0x031dc72f, 0x0135b2fa, 0x00c80862, 0x0025de68}}, Y: Field{[10]uint32{0x00c2712e, 0x00292ae8, 0x03907d23, 0x03629932, 0x03369684, 0x000de482, 0x01a4b0e6, 0x01b14027, 0x03cc6729, 0x00276789}}}, + {X: Field{[10]uint32{0x02f0b401, 0x022d3ed9, 0x01586bd7, 0x007f4559, 0x034a9747, 0x032bcdbf, 0x01c09de9, 0x02d23da9, 0x004a1dab, 0x00335316}}, Y: Field{[10]uint32{0x033446f1, 0x00cd0449, 0x017f0bc4, 0x03b711d9, 0x026fd60e, 0x02b4b0a3, 0x02104b0c, 0x001b8acf, 0x02b10eff, 0x0025640a}}}, + {X: Field{[10]uint32{0x0161aba4, 0x02afba89, 0x0319688e, 0x01957549, 0x02dbeb3f, 0x01cadddb, 0x03164f7c, 0x018b2d44, 0x01f41423, 0x0011b284}}, Y: Field{[10]uint32{0x0034c9ff, 0x00b13569, 0x022f5e83, 0x01198813, 0x01bcfd09, 0x01898f18, 0x036d3cbd, 0x03510b7e, 0x031a2a2a, 0x00201810}}}, + {X: Field{[10]uint32{0x0294a513, 0x030e7622, 0x003b475a, 0x0395fa3e, 0x01eb712d, 0x0000c688, 0x035c7535, 0x018fd5db, 0x01791ffb, 0x0037faf4}}, Y: Field{[10]uint32{0x03be75de, 0x032c6b71, 0x00f0aa71, 0x00b7b2ca, 0x006576af, 0x03df1843, 0x02aa0e22, 0x02d53081, 0x007e39b2, 0x0033fb5b}}}, + {X: Field{[10]uint32{0x012c2469, 0x00e021d7, 0x03fcfe12, 0x0285e59f, 0x0143daf1, 0x028ee53e, 0x0233d9d7, 0x0018ed11, 0x013282fd, 0x0031c719}}, Y: Field{[10]uint32{0x01d376d0, 0x0346d52a, 0x02ba8620, 0x00d94ab7, 0x00f18a47, 0x00eafa50, 0x01f8aed3, 0x01a840e3, 0x03cd0e00, 0x0018bf35}}}, + {X: Field{[10]uint32{0x00c0ff37, 0x022bbdcd, 0x007b1e9f, 0x0107f059, 0x026864ec, 0x0123edd6, 0x02640fbf, 0x02826938, 0x034ddc8b, 0x0018faee}}, Y: Field{[10]uint32{0x024ae28e, 0x01848176, 0x022df772, 0x013dc671, 0x01dbf1ae, 0x01cd82a1, 0x01090e19, 0x01bd2d07, 0x034b0fe1, 0x00396740}}}, + {X: Field{[10]uint32{0x0112814a, 0x00536e77, 0x000bceea, 0x00709c75, 0x01ce6e5c, 0x006d624b, 0x02eac616, 0x02fc5963, 0x00c8cb51, 0x00194126}}, Y: Field{[10]uint32{0x00a65279, 0x0162be59, 0x01e6ee30, 0x0215c2b5, 0x027a6145, 0x02f57452, 0x0057769b, 0x00064c91, 0x03855d8e, 0x0039f999}}}, + {X: Field{[10]uint32{0x03c43fd5, 0x00896a11, 0x0032ac41, 0x02a10304, 0x00090815, 0x0205b7d1, 0x0199c07b, 0x00218e05, 0x003f14c0, 0x00052878}}, Y: Field{[10]uint32{0x01fe98de, 0x03581bcd, 0x02ddb6d6, 0x00e1414c, 0x024926da, 0x02ee3bd7, 0x0366bac9, 0x02a23d1b, 0x0259bc6b, 0x000d4912}}}, + {X: Field{[10]uint32{0x02903c5c, 0x03d4c56d, 0x00f084d6, 0x0056ef54, 0x03a4f14c, 0x004553ff, 0x00f9a167, 0x0287a03b, 0x02b2f6a8, 0x000727db}}, Y: Field{[10]uint32{0x0203a033, 0x0181974a, 0x0187dd26, 0x00f900be, 0x01538638, 0x0143bba6, 0x026fc511, 0x03fd8e6d, 0x01f52ca4, 0x0039af78}}}, + {X: Field{[10]uint32{0x0170f8bf, 0x03c0863e, 0x029d97cf, 0x006b0381, 0x00b43ea6, 0x02c0355b, 0x00809664, 0x039ec41f, 0x02ed0bad, 0x000779c7}}, Y: Field{[10]uint32{0x00ee1434, 0x01f69986, 0x029bb5c6, 0x0176615d, 0x01ea99d6, 0x02def253, 0x00d42e16, 0x03babb5e, 0x02de77ed, 0x0002352c}}}, + {X: Field{[10]uint32{0x035cb4b1, 0x01baaad7, 0x018c35a9, 0x00e420e3, 0x02479f7a, 0x02eeadc1, 0x022f0628, 0x0134baea, 0x0280ce95, 0x003d10ca}}, Y: Field{[10]uint32{0x02d579bf, 0x0286272f, 0x0302cc67, 0x01dca718, 0x0291f3d0, 0x03f024e0, 0x00abf476, 0x0290300f, 0x02adac34, 0x0025bf9b}}}, + {X: Field{[10]uint32{0x0119fb21, 0x022d7a49, 0x00737482, 0x032b0549, 0x01cb37e1, 0x02109046, 0x023d3f96, 0x012bd158, 0x034d1796, 0x0023dc79}}, Y: Field{[10]uint32{0x004865ab, 0x01e15358, 0x0091cec0, 0x008021a7, 0x025b6b17, 0x02fda51b, 0x03678e4e, 0x03292e9d, 0x00dfd7f0, 0x001a643c}}}, + {X: Field{[10]uint32{0x02a6745e, 0x00671271, 0x001a1200, 0x014b3bdc, 0x005a09d0, 0x025aa0e8, 0x01546e20, 0x03097999, 0x01575e3d, 0x00088a4c}}, Y: Field{[10]uint32{0x01c423b0, 0x01bab639, 0x0285986a, 0x020b7bfa, 0x0283d050, 0x02a5072a, 0x012bfae8, 0x01581f1e, 0x00874258, 0x002ab63e}}}, + {X: Field{[10]uint32{0x0248a096, 0x00ea8abc, 0x017c63b7, 0x01a4eb08, 0x00cc57d0, 0x03989d94, 0x02bf5f29, 0x029a6a05, 0x02632ef3, 0x0019617f}}, Y: Field{[10]uint32{0x00fd9f8b, 0x00dea0db, 0x037cc12f, 0x00ff7847, 0x03dc8a89, 0x01bb3157, 0x019ca577, 0x006bfbb7, 0x03bb2028, 0x002082a8}}}, + {X: Field{[10]uint32{0x03f67bf8, 0x007907e4, 0x01339195, 0x00bf9843, 0x01aaec47, 0x02fc18a0, 0x0163ce5a, 0x01472aca, 0x0079e55c, 0x000888c9}}, Y: Field{[10]uint32{0x03f927d2, 0x016a6efa, 0x0104bb7c, 0x0062a359, 0x02888a8f, 0x0304ca68, 0x03f0514b, 0x00b5ff99, 0x03ab2cf2, 0x0003864b}}}, + {X: Field{[10]uint32{0x01df16fc, 0x01f6c097, 0x00f60826, 0x022dc3a6, 0x00446014, 0x02ce5b25, 0x00aba082, 0x001a7af3, 0x02fde4ba, 0x0036a340}}, Y: Field{[10]uint32{0x023fa2bb, 0x01d80879, 0x034d059a, 0x03422d9b, 0x01579756, 0x01e8b993, 0x0167e7c1, 0x0021291f, 0x013de337, 0x00068c08}}}, + {X: Field{[10]uint32{0x02202ebf, 0x02a7c624, 0x02501708, 0x0249e3b9, 0x01ad49e0, 0x01313a2e, 0x038a0066, 0x020b7bc6, 0x0062854e, 0x0029bdcb}}, Y: Field{[10]uint32{0x01d03ba4, 0x00d54dc0, 0x0037edaa, 0x02246a0e, 0x002e2709, 0x008c63bd, 0x03c56abc, 0x0204102d, 0x032db08c, 0x0020d565}}}, + {X: Field{[10]uint32{0x03c7db68, 0x016b8a8e, 0x028ee8d5, 0x033a67d6, 0x02a15077, 0x00df7315, 0x02f8c359, 0x02168171, 0x013a309e, 0x00081d3f}}, Y: Field{[10]uint32{0x022cff97, 0x0387c20c, 0x0182e53a, 0x03a6baa5, 0x023061a4, 0x001aa605, 0x018fc0e8, 0x00f250b9, 0x02eacb78, 0x00384700}}}, + {X: Field{[10]uint32{0x01a1a5e3, 0x0071431e, 0x0106c861, 0x03cc6098, 0x0229aa59, 0x00a92d8b, 0x00d316f6, 0x02a8adc3, 0x0266fae9, 0x00127b55}}, Y: Field{[10]uint32{0x007643f7, 0x02eb1b20, 0x028b6324, 0x0024aa0d, 0x021477c2, 0x0261a59e, 0x000b19ef, 0x0138af73, 0x009aae14, 0x001729f9}}}, + {X: Field{[10]uint32{0x016c1b1f, 0x004d8897, 0x014683ed, 0x03a63864, 0x01b582c4, 0x00dc88cd, 0x03472a71, 0x0393a617, 0x007ea1f7, 0x0008a27b}}, Y: Field{[10]uint32{0x01cbbeb1, 0x0144b2b6, 0x0090261a, 0x022f5c3a, 0x03b03f89, 0x01ff903d, 0x017bff67, 0x00219c14, 0x0318689a, 0x0000478a}}}, + {X: Field{[10]uint32{0x01859164, 0x0273afe1, 0x00635bc4, 0x014bff1c, 0x03fbed0e, 0x022e8ae8, 0x02c64a55, 0x03befb62, 0x02be23f1, 0x003aa14b}}, Y: Field{[10]uint32{0x01cbb824, 0x02a98d50, 0x00fafc97, 0x01456c97, 0x0125ef13, 0x01e93905, 0x0266583c, 0x0298e5cc, 0x0341fe97, 0x002f78bb}}}, + {X: Field{[10]uint32{0x0302f0ea, 0x026f86f4, 0x018553fe, 0x01f6905e, 0x00290b25, 0x03fbc229, 0x001a9548, 0x01f4fc6b, 0x00e67cc0, 0x0015c63c}}, Y: Field{[10]uint32{0x01acbe90, 0x0103b3da, 0x0094fd4e, 0x02828bae, 0x03a6ffca, 0x019169ab, 0x02d8bd53, 0x0175fb9c, 0x015bfca6, 0x00263b13}}}, + {X: Field{[10]uint32{0x03810a4c, 0x03af6492, 0x01ad550b, 0x00fde033, 0x0310269c, 0x01d51638, 0x00f0650b, 0x03f5f7ba, 0x02abd77a, 0x0037d8a8}}, Y: Field{[10]uint32{0x00e4c034, 0x0120a6c2, 0x028cd54c, 0x023a7f22, 0x008d39fe, 0x022198f8, 0x03ea2e95, 0x0349ee02, 0x02cce384, 0x001a9981}}}, + {X: Field{[10]uint32{0x005e6668, 0x01336ba0, 0x039aa497, 0x003bbf5d, 0x039ea7dc, 0x00254239, 0x039bd198, 0x009a2f0c, 0x00454b0c, 0x0004043f}}, Y: Field{[10]uint32{0x016410e1, 0x0197eafa, 0x0001c3fa, 0x03c674f6, 0x02d51194, 0x01adaf4a, 0x030a323c, 0x02d65cac, 0x02db0681, 0x001a1a8e}}}, + {X: Field{[10]uint32{0x035c5c18, 0x0097b5a7, 0x0087bd54, 0x01101e41, 0x02072ca3, 0x0050524f, 0x03e93c96, 0x00e061a7, 0x00527567, 0x0022b1e6}}, Y: Field{[10]uint32{0x01d1c08e, 0x031cb26f, 0x03cec684, 0x03e67496, 0x00775375, 0x027bc7e4, 0x0172e04b, 0x03219f46, 0x0248fcbf, 0x002ecc50}}}, + {X: Field{[10]uint32{0x03848b9d, 0x0321a48f, 0x021605f9, 0x01340866, 0x036f3f17, 0x017c2b78, 0x01f3bf44, 0x031f3b18, 0x031188cb, 0x001583a5}}, Y: Field{[10]uint32{0x01b9cd2f, 0x003bdb74, 0x02277bc8, 0x022b063b, 0x014d133f, 0x01939ba7, 0x03bf21fc, 0x03319efe, 0x02ce6775, 0x0027a4b6}}}, + {X: Field{[10]uint32{0x01fb943a, 0x0241c03d, 0x009fee6d, 0x00bc1fdc, 0x0028eea5, 0x011a6870, 0x015ca088, 0x03ad9b32, 0x02044b95, 0x00231190}}, Y: Field{[10]uint32{0x009d0223, 0x0049c79a, 0x03aa51a1, 0x009654f0, 0x03a34920, 0x03afa965, 0x01b3a615, 0x014604c0, 0x005d7bc2, 0x002fc43f}}}, + {X: Field{[10]uint32{0x031eb5aa, 0x034730a1, 0x013cb4d8, 0x036be1d1, 0x037f2245, 0x0362c0d9, 0x0377247c, 0x022dc4d4, 0x034cf357, 0x0034a4fd}}, Y: Field{[10]uint32{0x024a6f26, 0x02befb69, 0x03423ba7, 0x0352b8d5, 0x03f080e3, 0x02c24143, 0x0245931e, 0x03a8518f, 0x013a61df, 0x0021b080}}}, + {X: Field{[10]uint32{0x03687d35, 0x02f5d135, 0x02aff4c6, 0x029ccd99, 0x01fefbf7, 0x01dbae4d, 0x027611ec, 0x01ec7f1d, 0x0241ae75, 0x000d665c}}, Y: Field{[10]uint32{0x004b2aa0, 0x013e5bf1, 0x01f9c599, 0x03bf3283, 0x022f36e0, 0x02f4e4f6, 0x007fd357, 0x0335330f, 0x021f246b, 0x002f2fa9}}}, + {X: Field{[10]uint32{0x036464eb, 0x00d8095f, 0x006de15f, 0x0316f678, 0x00285a17, 0x013b8d77, 0x01a0ef84, 0x0065f4f0, 0x00977467, 0x00034258}}, Y: Field{[10]uint32{0x013e8783, 0x012dc2ef, 0x0303cd14, 0x01a67a22, 0x023dd448, 0x01e737a7, 0x02954bfc, 0x036e59a4, 0x02a51e06, 0x000d0abd}}}, + {X: Field{[10]uint32{0x0241a777, 0x03e2632b, 0x01470bfd, 0x025c8e89, 0x01621257, 0x0086c3e1, 0x033a3755, 0x03ab59c0, 0x00992aea, 0x0023a1d7}}, Y: Field{[10]uint32{0x03c0bbd8, 0x01ea625c, 0x010c653f, 0x02187b1b, 0x02a5ee66, 0x00c49eb4, 0x020ba101, 0x0066ec13, 0x033d2d2f, 0x00092a89}}}, + {X: Field{[10]uint32{0x02541855, 0x03786e6b, 0x01aee0d2, 0x0110215a, 0x00d622f4, 0x01cb16ee, 0x02f47d81, 0x00e93347, 0x01f30270, 0x002fd474}}, Y: Field{[10]uint32{0x039aa484, 0x0029c433, 0x0030f3c6, 0x00c510cf, 0x005918d9, 0x024d4f61, 0x01e6e409, 0x002b3eef, 0x0352b6c6, 0x0023e078}}}, + {X: Field{[10]uint32{0x0341c26f, 0x02a35320, 0x03aee696, 0x016db372, 0x022ebb11, 0x0020fbd5, 0x032d1415, 0x01a1588a, 0x00620972, 0x001bedad}}, Y: Field{[10]uint32{0x003c9c73, 0x027c182e, 0x02032a89, 0x00c2eb28, 0x01468f25, 0x015e2e91, 0x02923b3e, 0x03367b32, 0x03bff9cf, 0x0027023d}}}, + {X: Field{[10]uint32{0x03617438, 0x0237d8a4, 0x0389d067, 0x01a1acb3, 0x031db56f, 0x03fc117e, 0x026a21fa, 0x03de35f7, 0x02c18b5c, 0x001d560e}}, Y: Field{[10]uint32{0x0369f900, 0x0240d026, 0x0082df67, 0x00526100, 0x02071fe0, 0x0319a725, 0x0237c7d9, 0x011bfc38, 0x022cb085, 0x00209668}}}, + {X: Field{[10]uint32{0x00c0ef92, 0x023fe72d, 0x00f36cdd, 0x038d8404, 0x014aabc2, 0x006ddba5, 0x0051c893, 0x0166b1fb, 0x0133a5d7, 0x00109846}}, Y: Field{[10]uint32{0x01ed4261, 0x00054748, 0x00bf8783, 0x000c3e67, 0x0158cde4, 0x013ae131, 0x038e2bd5, 0x032f3a8d, 0x00ce6b8a, 0x00222991}}}, + {X: Field{[10]uint32{0x02f520d2, 0x00eb78c2, 0x038458a4, 0x025492eb, 0x016dff9c, 0x01c5af71, 0x02e776ca, 0x03e592f6, 0x01bf6128, 0x00090e9b}}, Y: Field{[10]uint32{0x001b7e50, 0x007c6948, 0x0025d609, 0x01368f64, 0x003dda74, 0x024af7ea, 0x0001850e, 0x036d2341, 0x028a5ce4, 0x00098a8b}}}, + {X: Field{[10]uint32{0x00c2ac76, 0x02c4a476, 0x03d58082, 0x00b169da, 0x0046e57e, 0x01f7c56f, 0x01e9307a, 0x031b4810, 0x01751548, 0x00084af4}}, Y: Field{[10]uint32{0x039391bc, 0x032f5dc1, 0x01aaae33, 0x03d1c66a, 0x0257f04e, 0x022c9020, 0x03cc788a, 0x01c9cc99, 0x03c76cc9, 0x00209186}}}, + {X: Field{[10]uint32{0x0161177b, 0x01f05ad3, 0x021fbc1a, 0x011842f5, 0x008ca8a5, 0x022b83b2, 0x00b3e562, 0x01b4aaa8, 0x030b21f9, 0x00369b40}}, Y: Field{[10]uint32{0x023f9fde, 0x02f6f9cb, 0x03d0a1ce, 0x00787aae, 0x012c2aad, 0x02d27b0a, 0x02b85961, 0x000a1d28, 0x02358fab, 0x0016d6f1}}}, + {X: Field{[10]uint32{0x02c1f01f, 0x027d38fd, 0x0010886a, 0x01fb3fa0, 0x004a4313, 0x03ba923f, 0x001e1012, 0x010ec296, 0x02f055a2, 0x003708c2}}, Y: Field{[10]uint32{0x028180ca, 0x03e80f95, 0x018bb950, 0x02ad805c, 0x012eb5a9, 0x00f5ffbb, 0x030120da, 0x011635c0, 0x021be70a, 0x00343e63}}}, + {X: Field{[10]uint32{0x01089df1, 0x01b412ea, 0x00797dc1, 0x01cbc291, 0x00ee9c59, 0x03c8c9a1, 0x00e73b56, 0x031a1a63, 0x023ac815, 0x0020b0b7}}, Y: Field{[10]uint32{0x03b8573d, 0x018b65e4, 0x02432544, 0x0110b07e, 0x010c8598, 0x007f85e3, 0x0253b8ec, 0x033063e8, 0x0065c6c2, 0x0007211c}}}, + {X: Field{[10]uint32{0x020494a3, 0x01d85278, 0x037f6670, 0x0081a901, 0x02cc439f, 0x0002be26, 0x0165dfa2, 0x0245bb86, 0x028874e4, 0x001b28b7}}, Y: Field{[10]uint32{0x02662043, 0x014466a6, 0x02e0699b, 0x0276ba5a, 0x02cd5111, 0x01f71f39, 0x03cc1aa5, 0x02177690, 0x034497aa, 0x001bbc2c}}}, + {X: Field{[10]uint32{0x0051d97f, 0x00ebd4de, 0x031f88d3, 0x029242f4, 0x03cf1149, 0x021003be, 0x02448f82, 0x03ed9481, 0x03c41728, 0x002e89a1}}, Y: Field{[10]uint32{0x02b4c0c4, 0x03c82c61, 0x01de5d61, 0x000090ec, 0x02033455, 0x0318b34c, 0x03803bb3, 0x039eaba2, 0x01f11f2c, 0x0025ab49}}}, + {X: Field{[10]uint32{0x01553e0d, 0x028bc203, 0x01aa5f1e, 0x00cf91a8, 0x03d311f5, 0x02cc0cc8, 0x0032d5a4, 0x03cc0458, 0x00401947, 0x002b0d88}}, Y: Field{[10]uint32{0x00b30a22, 0x01c70fcb, 0x0137fdf1, 0x006dec82, 0x001d5b98, 0x005f6e47, 0x035881fa, 0x00a21169, 0x0395fef3, 0x0014e0e7}}}, + {X: Field{[10]uint32{0x01049e13, 0x01a51d9e, 0x0246bac7, 0x0308b6ee, 0x024158c7, 0x00ecd727, 0x014241ec, 0x01c815a3, 0x00ee5b1b, 0x0019e03b}}, Y: Field{[10]uint32{0x0057d9a8, 0x02fd004c, 0x02e4ee0f, 0x015fb31e, 0x0246520d, 0x0158b9cc, 0x0090b9f3, 0x022234b7, 0x01f031e0, 0x0026b045}}}, + {X: Field{[10]uint32{0x02a63732, 0x0040e434, 0x00254cbb, 0x00eaaca5, 0x01c0f765, 0x02ef4d0e, 0x0110d622, 0x035754c1, 0x0247e7a2, 0x00254dde}}, Y: Field{[10]uint32{0x00195fc0, 0x02f948fe, 0x01d7b091, 0x01a8d992, 0x03bb01f7, 0x0319155e, 0x01abe4df, 0x02d8b3f8, 0x01109daf, 0x0015eb24}}}, + {X: Field{[10]uint32{0x02dd8921, 0x005e85ca, 0x0015e85f, 0x001ccc9d, 0x01486a85, 0x02f50abd, 0x02e97c59, 0x020efc1f, 0x01bf98fd, 0x00013c65}}, Y: Field{[10]uint32{0x011cf3dc, 0x0171ee1a, 0x03b59a86, 0x02f3c7bc, 0x011a057b, 0x01ac72b7, 0x027cae30, 0x008c8d8c, 0x032501c8, 0x00295ab3}}}, + {X: Field{[10]uint32{0x00bcb53f, 0x00a46c53, 0x036bad9e, 0x034b5edb, 0x02cc0510, 0x036eaaf3, 0x0208240a, 0x00a67f48, 0x03d1efe8, 0x003b3347}}, Y: Field{[10]uint32{0x002c667c, 0x020111e9, 0x02b29135, 0x022fff09, 0x012d9b6f, 0x00663806, 0x03d6f2d3, 0x003e9715, 0x03216da5, 0x003b0bfc}}}, + {X: Field{[10]uint32{0x0058f438, 0x0321386c, 0x01f2b1ee, 0x0004307b, 0x01502e76, 0x01f2dd1d, 0x00ff41cf, 0x010971ca, 0x004af2c3, 0x0031d5d1}}, Y: Field{[10]uint32{0x0362e53a, 0x01c0a0d8, 0x014b8fd0, 0x03f1a140, 0x039cd267, 0x0322d995, 0x0301105b, 0x0050f8a5, 0x01b6169f, 0x00387520}}}, + {X: Field{[10]uint32{0x005250b8, 0x006d5f19, 0x00ac636f, 0x0170711c, 0x03aef325, 0x028468d9, 0x01996627, 0x001dd963, 0x037ebff5, 0x000d58a0}}, Y: Field{[10]uint32{0x019234d8, 0x01cb598a, 0x02b9cf4d, 0x00d729fe, 0x00fa1d0d, 0x02f2bf00, 0x01374bb0, 0x0163f333, 0x020d97aa, 0x003373d2}}}, + {X: Field{[10]uint32{0x02d4a3a1, 0x00cc5f21, 0x00a82b11, 0x01f7ed95, 0x03b1f2f0, 0x03eb062d, 0x01339e97, 0x025eaf4b, 0x0245f62e, 0x0033a770}}, Y: Field{[10]uint32{0x00d184d5, 0x0295857c, 0x00b7927b, 0x00c2f9bb, 0x02fcaf1b, 0x030deaf7, 0x03e8520e, 0x03ee3993, 0x0325342a, 0x003db878}}}, + {X: Field{[10]uint32{0x00858a12, 0x0275b8cb, 0x03dd542d, 0x023394e0, 0x02aab481, 0x02807ea2, 0x0271a8c1, 0x0112ea74, 0x033b48ee, 0x002b008b}}, Y: Field{[10]uint32{0x02ca76fa, 0x02e6ea5c, 0x01aaf45d, 0x01f99815, 0x02191e49, 0x00e58477, 0x009e0917, 0x03447c66, 0x03a891f8, 0x00078158}}}, + {X: Field{[10]uint32{0x0251d9f9, 0x026702e9, 0x024ff3a9, 0x020a2332, 0x0355a837, 0x02dbc89d, 0x02e57e6d, 0x033eab91, 0x0282cb12, 0x0034753d}}, Y: Field{[10]uint32{0x01e71a36, 0x016639e1, 0x02960488, 0x0192b2e3, 0x03016072, 0x0059c88c, 0x023b4b07, 0x0064c530, 0x03e5870e, 0x0006c66f}}}, + {X: Field{[10]uint32{0x031c8a37, 0x014c0ebf, 0x012ee243, 0x012cb401, 0x00892e75, 0x026f746a, 0x03bacd4f, 0x02be5117, 0x0171bbdd, 0x001e6588}}, Y: Field{[10]uint32{0x03b98a7d, 0x0056f8de, 0x0320ab85, 0x02a76bc1, 0x00fe47b6, 0x00d304d5, 0x0072f77b, 0x00afad15, 0x03de2a95, 0x002e2b09}}}, + {X: Field{[10]uint32{0x009d3b90, 0x00cb8f14, 0x038d8cf0, 0x02c60e83, 0x0120ecb3, 0x001868bc, 0x03c3573b, 0x02d812ec, 0x03c42390, 0x00111685}}, Y: Field{[10]uint32{0x013f97b1, 0x02b52c5a, 0x026aae34, 0x01079026, 0x024ea769, 0x03bfd259, 0x00057c87, 0x03f97283, 0x00887c07, 0x002dd7d0}}}, + {X: Field{[10]uint32{0x03402051, 0x020ef0c3, 0x02ccfb0e, 0x01244745, 0x038c39cd, 0x0345d5d8, 0x02c49a78, 0x03d1fd7e, 0x01f963a9, 0x001859ad}}, Y: Field{[10]uint32{0x012430b3, 0x005f77fa, 0x01d7e053, 0x03d56811, 0x02933d6d, 0x03b15d24, 0x03e46204, 0x02bac884, 0x02618302, 0x002e8cdd}}}, + {X: Field{[10]uint32{0x03251531, 0x00574fe2, 0x034a9293, 0x036e8d36, 0x0330b6db, 0x012379f8, 0x027d0e40, 0x006bfa39, 0x02742890, 0x0033599b}}, Y: Field{[10]uint32{0x0002304b, 0x0146040e, 0x024f9e54, 0x0147c46c, 0x01440959, 0x027f227b, 0x02398e74, 0x02950390, 0x00b943cb, 0x002bdcb6}}}, + {X: Field{[10]uint32{0x0123ac72, 0x0272eb41, 0x0014ee83, 0x02f35ee2, 0x015a6285, 0x036640d5, 0x01837a11, 0x01bf811b, 0x028cfd2f, 0x00320cef}}, Y: Field{[10]uint32{0x01a6af03, 0x00926132, 0x00ed603a, 0x02fbfa32, 0x02b6c07d, 0x01430ed3, 0x01751531, 0x008d8ea3, 0x010b4411, 0x001faa3e}}}, + {X: Field{[10]uint32{0x025ea477, 0x0000da7c, 0x03613982, 0x013fa109, 0x02e40e4a, 0x03a56c58, 0x010ac1f5, 0x034e1762, 0x03363036, 0x00330617}}, Y: Field{[10]uint32{0x02338236, 0x03bae7c9, 0x02b42832, 0x01d50157, 0x03f66d07, 0x027384bb, 0x02aabe5a, 0x02726262, 0x0036146d, 0x00381da2}}}, + {X: Field{[10]uint32{0x009c4a5a, 0x010f0a63, 0x01770479, 0x0043a4b2, 0x0177ccd9, 0x0101ee02, 0x03c9be70, 0x030aead9, 0x006324bb, 0x00052382}}, Y: Field{[10]uint32{0x02408797, 0x03f8eeb0, 0x036ee55d, 0x00c7edc5, 0x01b706a3, 0x004e3a5f, 0x02733ae6, 0x03f20277, 0x00859cdd, 0x00227a0f}}}, + {X: Field{[10]uint32{0x02c95c76, 0x038048af, 0x03a7e460, 0x012553d4, 0x010cf8b6, 0x00a8dd87, 0x008d9b19, 0x02d60d72, 0x01c1aba5, 0x0026c54e}}, Y: Field{[10]uint32{0x00efdc18, 0x03c8756b, 0x0395b967, 0x010a88c9, 0x00d8472e, 0x02a87389, 0x00895f13, 0x01676b53, 0x021945be, 0x000e4737}}}, + {X: Field{[10]uint32{0x024495cd, 0x02e29cc3, 0x03dd3e93, 0x01d2a5d2, 0x03a60327, 0x03d09f31, 0x029e575f, 0x00074dda, 0x02c175fb, 0x001a28b9}}, Y: Field{[10]uint32{0x00e00752, 0x00f7139e, 0x014f2557, 0x02df89cf, 0x030666ca, 0x03166591, 0x0269b741, 0x0037797c, 0x0084c8c3, 0x00054f99}}}, + {X: Field{[10]uint32{0x01dfb04e, 0x01b08a18, 0x030b66c3, 0x028b9f0b, 0x007669e9, 0x00cf332b, 0x02334405, 0x029030ed, 0x004935a5, 0x00163fa4}}, Y: Field{[10]uint32{0x0136e1bb, 0x03eed815, 0x01555b39, 0x009c569e, 0x0371ac1e, 0x0356669d, 0x0106e2a2, 0x0038b5c7, 0x01c59245, 0x002cda41}}}, + {X: Field{[10]uint32{0x02ac7080, 0x0169e0d7, 0x00378337, 0x029838a6, 0x0103e9bc, 0x026d809f, 0x01aff2a1, 0x0366c2ff, 0x0396dcbd, 0x00208f03}}, Y: Field{[10]uint32{0x02ad0a7f, 0x0334823c, 0x03db8895, 0x02c36410, 0x028831a2, 0x00efcf0d, 0x03eb6d54, 0x026962ea, 0x02ccf34d, 0x00364551}}}, + {X: Field{[10]uint32{0x02d14537, 0x03378800, 0x02caf533, 0x01493df7, 0x03d68121, 0x00c04fb9, 0x03e7b710, 0x03e42157, 0x02aee908, 0x001295ab}}, Y: Field{[10]uint32{0x0222b7a2, 0x02be42b1, 0x00d8d021, 0x03ecb80c, 0x023129a7, 0x01e43ae6, 0x01995b33, 0x00634846, 0x000133b7, 0x001f9832}}}, + {X: Field{[10]uint32{0x01240334, 0x01b28efe, 0x0168a71f, 0x03d27f82, 0x0382a64b, 0x02204c66, 0x0194e2b8, 0x03d7cb11, 0x0055e6c4, 0x001b03ce}}, Y: Field{[10]uint32{0x03b5203c, 0x03f8d348, 0x02fc83ac, 0x0346d355, 0x03e1478a, 0x0016bab4, 0x01ade853, 0x02eea12d, 0x036da9ef, 0x0017239e}}}, + {X: Field{[10]uint32{0x01ac9632, 0x02e8a8cd, 0x033313ae, 0x002d4923, 0x000496e4, 0x005cb992, 0x01de21cf, 0x01241c57, 0x032cd170, 0x003673e3}}, Y: Field{[10]uint32{0x00934344, 0x00e0570f, 0x028e6b07, 0x0242db0f, 0x0315867e, 0x00d755fd, 0x0198299c, 0x03e4c02f, 0x0251b440, 0x0024a9f0}}}, + {X: Field{[10]uint32{0x0193d898, 0x01d9fdee, 0x039e27c6, 0x00a3f3c6, 0x01775927, 0x026bcc0e, 0x027ed43d, 0x0371eebe, 0x00928b91, 0x0012ff2d}}, Y: Field{[10]uint32{0x005d14f7, 0x032a5269, 0x03dda7bf, 0x03a791c0, 0x001854a4, 0x00ea8cee, 0x00c9a4ae, 0x035042cd, 0x02f1ecd9, 0x0009da81}}}, + {X: Field{[10]uint32{0x03c434e8, 0x00066b08, 0x00792944, 0x01d7964a, 0x027cdcc5, 0x0055965b, 0x0193dee8, 0x00cbd13b, 0x0093ac40, 0x002af796}}, Y: Field{[10]uint32{0x0195c40a, 0x012c0360, 0x0116ed77, 0x02c93066, 0x0346162c, 0x033bc0be, 0x002af7a7, 0x018113a5, 0x00092b9e, 0x001780ea}}}, + {X: Field{[10]uint32{0x026e1cc5, 0x00ec3f54, 0x020a803b, 0x02b8c6f8, 0x004482f1, 0x00a07688, 0x00814b49, 0x02a3845e, 0x03077a98, 0x00081758}}, Y: Field{[10]uint32{0x03e4d780, 0x027fd41b, 0x036147a7, 0x03495595, 0x00b9cab7, 0x01b992ff, 0x015cb19d, 0x00d581ae, 0x015c943e, 0x0012ef8a}}}, + {X: Field{[10]uint32{0x001c43bd, 0x02337491, 0x00b7c3b9, 0x02f116fd, 0x01b59653, 0x01b980c7, 0x0228a423, 0x00e871b0, 0x0083e667, 0x0032d313}}, Y: Field{[10]uint32{0x031a2769, 0x013a3ab8, 0x01149cfe, 0x00307fa9, 0x0062f334, 0x016bf9c5, 0x002ff397, 0x01fa83df, 0x02763926, 0x00050b80}}}, + {X: Field{[10]uint32{0x00ca77a7, 0x02ec894b, 0x004f2b5a, 0x02cb7b1f, 0x0392ccf0, 0x024cd5bb, 0x0354a4b4, 0x02f7eceb, 0x00b27ff5, 0x0009687d}}, Y: Field{[10]uint32{0x035c3c38, 0x03fe5ecc, 0x03fe93e9, 0x022ca229, 0x0136c32e, 0x02647cb6, 0x033b3afc, 0x020d05f7, 0x0193153f, 0x0006c977}}}, + {X: Field{[10]uint32{0x0254237b, 0x029dea8a, 0x026dc89c, 0x015255ed, 0x015a1b71, 0x0195f2e2, 0x011c863a, 0x02835a94, 0x02a77eec, 0x00088bdd}}, Y: Field{[10]uint32{0x00b0b289, 0x01680bcb, 0x03492794, 0x0210bda8, 0x01a205c8, 0x019974a5, 0x03a598a8, 0x03e23421, 0x02e064ef, 0x002a3caf}}}, + {X: Field{[10]uint32{0x034dfa8d, 0x032f63ce, 0x002daec3, 0x009a67c7, 0x02379f5c, 0x024dad01, 0x03f10156, 0x01946d06, 0x028d1ad2, 0x000cb50c}}, Y: Field{[10]uint32{0x0188261d, 0x033a4c1e, 0x0290d204, 0x028741a4, 0x02df5de0, 0x0391e025, 0x00d40623, 0x028ced7d, 0x02e23294, 0x0027db79}}}, + {X: Field{[10]uint32{0x01f1d3f0, 0x0195a460, 0x01b14e82, 0x00c33e64, 0x01187d08, 0x01998adf, 0x01937900, 0x0335c0ec, 0x00be6948, 0x00337a7b}}, Y: Field{[10]uint32{0x03029720, 0x03a06c56, 0x015e24bc, 0x03ffe554, 0x01f5abe8, 0x022b55b1, 0x037794ce, 0x00634a6d, 0x03320e12, 0x0021221e}}}, + {X: Field{[10]uint32{0x0348947d, 0x0354f4e9, 0x00b80011, 0x01f89979, 0x02509f4e, 0x0141a801, 0x03435826, 0x03bd32a0, 0x005c3baa, 0x002f227d}}, Y: Field{[10]uint32{0x03e68475, 0x00a7d79b, 0x03a49511, 0x02bdc89a, 0x0209fa15, 0x00d3de6f, 0x0272fce5, 0x02c519e8, 0x00a2714d, 0x003bfd6f}}}, + {X: Field{[10]uint32{0x01b51d4f, 0x003dd237, 0x03df0994, 0x02e6d5fb, 0x0139b409, 0x010d2a6b, 0x014ba655, 0x02eff8af, 0x00c0eea2, 0x001899e3}}, Y: Field{[10]uint32{0x03a74acf, 0x0141470d, 0x00883673, 0x02e79ef3, 0x02a5cc8a, 0x03db7553, 0x0161245e, 0x034c7470, 0x034fd234, 0x00234e13}}}, + {X: Field{[10]uint32{0x02bc93d0, 0x027e4ce1, 0x02f8af21, 0x030d3fa1, 0x02df7c0a, 0x037e89cd, 0x01c89cf3, 0x0388958f, 0x0139c63a, 0x00057807}}, Y: Field{[10]uint32{0x00cfb13b, 0x01d56204, 0x03ef42bc, 0x0267e8c5, 0x01e7efb9, 0x025da618, 0x03251334, 0x032e0705, 0x0132314f, 0x0007d58d}}}, + {X: Field{[10]uint32{0x03ac10e3, 0x03cd92ca, 0x03eb97b8, 0x000c06f6, 0x0052c601, 0x010a2ba7, 0x018e813e, 0x009637fe, 0x03493493, 0x0013e34a}}, Y: Field{[10]uint32{0x0169b73f, 0x02c99380, 0x021bcd66, 0x039085b2, 0x031e8c58, 0x03e467d5, 0x00580283, 0x0176db00, 0x017b6795, 0x00231f44}}}, + {X: Field{[10]uint32{0x016f1d61, 0x02249dad, 0x0136f1a7, 0x02d3d124, 0x003b0d77, 0x0374d623, 0x03e397cd, 0x01ad8260, 0x031a2bf1, 0x00345338}}, Y: Field{[10]uint32{0x013f0910, 0x03cdcd2b, 0x0335611e, 0x031c9613, 0x01833f24, 0x0375eefd, 0x022ca6e4, 0x0360e8dc, 0x0220b227, 0x0026857d}}}, + {X: Field{[10]uint32{0x02f780f1, 0x03a38ed9, 0x008419c3, 0x028b104c, 0x00024c1a, 0x02ffa800, 0x00d656c9, 0x01d7d704, 0x034eb8c2, 0x000d4886}}, Y: Field{[10]uint32{0x03f8e808, 0x0317764e, 0x03fa0f8e, 0x01186d77, 0x0306888d, 0x009de195, 0x038382bb, 0x02bf2ef5, 0x02025274, 0x000f4716}}}, + {X: Field{[10]uint32{0x00a8ddc8, 0x02b02a8d, 0x0043c49e, 0x005dc9c2, 0x0083f686, 0x03d10ec8, 0x00ff6f29, 0x0306e3d1, 0x003b1c76, 0x0020bb67}}, Y: Field{[10]uint32{0x015f1340, 0x0077177a, 0x02fc48a9, 0x0162bbf5, 0x00e81f5a, 0x000009a4, 0x002081d9, 0x00ae19cd, 0x026bc2ab, 0x00098ba7}}}, + {X: Field{[10]uint32{0x00717b85, 0x0078d244, 0x02118d18, 0x012bfd71, 0x009c49b6, 0x010ba5f1, 0x02342f77, 0x02a8dba1, 0x020eacf2, 0x002467a5}}, Y: Field{[10]uint32{0x0145b861, 0x020bf936, 0x016505a0, 0x010b1e08, 0x03ef530d, 0x030ca7c4, 0x01ce9d5a, 0x0059e736, 0x014ea3ea, 0x0012d46a}}}, + {X: Field{[10]uint32{0x03c3ec7d, 0x03f4d996, 0x02c3065f, 0x0386b3c1, 0x02edca3d, 0x0190f398, 0x02abcafa, 0x01546afb, 0x023e20ce, 0x00336b2b}}, Y: Field{[10]uint32{0x02b95bb6, 0x00881c5b, 0x009b13d3, 0x0292cd07, 0x02235df4, 0x02953d3b, 0x00c326df, 0x001dab8a, 0x0313872b, 0x002aab2e}}}, + {X: Field{[10]uint32{0x02a5f2ab, 0x027389a4, 0x015a8f94, 0x03fed98f, 0x00de3a62, 0x001c9bc2, 0x0180f829, 0x017027cf, 0x00e21bd0, 0x00069142}}, Y: Field{[10]uint32{0x00ca97ba, 0x00c83d4b, 0x013e602b, 0x0315b497, 0x00c6e672, 0x02fc0a65, 0x00459bf4, 0x02c0cdd8, 0x03f0976e, 0x00149e03}}}, + {X: Field{[10]uint32{0x003a0b45, 0x005098a0, 0x018ddd52, 0x01dfcea8, 0x02e9129f, 0x03c9b262, 0x00f73d13, 0x03c972a5, 0x02ed5686, 0x002391bb}}, Y: Field{[10]uint32{0x01edcf4d, 0x0326bd87, 0x00200782, 0x0159843a, 0x027253d5, 0x01fc2bad, 0x03f2ed1e, 0x03ba9f21, 0x038d7041, 0x003b95b4}}}, + {X: Field{[10]uint32{0x017e4031, 0x0396ecda, 0x00532a92, 0x0079e828, 0x0168d617, 0x02d8611a, 0x01797c15, 0x02cc276b, 0x00fa3bd6, 0x001e0a44}}, Y: Field{[10]uint32{0x00e4b3f4, 0x0025d4d1, 0x022ddee4, 0x03fdb4fc, 0x00717914, 0x011ac2a0, 0x00c31b89, 0x00a8a3a1, 0x0365c44c, 0x003fc5e0}}}, + {X: Field{[10]uint32{0x01f64e8a, 0x00f246b9, 0x01041ae9, 0x02a3e41a, 0x0265c50a, 0x013c75f4, 0x002d0a29, 0x004329b3, 0x028cc5a7, 0x0000aae7}}, Y: Field{[10]uint32{0x03f89b9b, 0x00ebf269, 0x001c9db2, 0x000a84f6, 0x03185366, 0x0164d251, 0x03cf23da, 0x012eb419, 0x010fa225, 0x0002aaf3}}}, + {X: Field{[10]uint32{0x0382c9e5, 0x006f4758, 0x037a5fcb, 0x03091843, 0x03a094dd, 0x01494a4d, 0x020cc533, 0x016c8a0c, 0x03c44fb2, 0x00341199}}, Y: Field{[10]uint32{0x02b0f74e, 0x0351e52c, 0x00f5ce31, 0x03600c19, 0x026e5a91, 0x02b13ea1, 0x02f436ec, 0x01239e1a, 0x013f8bf0, 0x001f24d8}}}, + {X: Field{[10]uint32{0x0286b0f7, 0x012be0db, 0x01252def, 0x00a724d8, 0x00f157bd, 0x0160e265, 0x01b0476c, 0x03769294, 0x02f9799c, 0x002e711d}}, Y: Field{[10]uint32{0x0297932e, 0x02aad2b2, 0x029eff13, 0x036aa414, 0x03d1a9b0, 0x01a11549, 0x01cefbc4, 0x0122cfc9, 0x019bc779, 0x000bb1d8}}}, + {X: Field{[10]uint32{0x006eee85, 0x036a104a, 0x02e0d64f, 0x03ff7b8a, 0x004ef765, 0x03591ce7, 0x01d8c565, 0x0265012e, 0x01abf13f, 0x00242f7b}}, Y: Field{[10]uint32{0x00cf21f5, 0x00a04138, 0x037255c6, 0x0376e53d, 0x007f8bb8, 0x0061f49b, 0x02812a48, 0x0122ad2f, 0x0082d9a8, 0x002a7d1e}}}, + {X: Field{[10]uint32{0x00485c84, 0x001cdebf, 0x01e7ba68, 0x03377356, 0x03ff4208, 0x013afc3f, 0x02b83107, 0x01dcd300, 0x00a80217, 0x002830e5}}, Y: Field{[10]uint32{0x0109364b, 0x003975c3, 0x02e3fd64, 0x02d8bcd3, 0x00e835ca, 0x026dec59, 0x002434fe, 0x00bcd3f2, 0x0132b4c6, 0x00313c22}}}, + {X: Field{[10]uint32{0x00294c3e, 0x02ad434c, 0x00273b9a, 0x008fafab, 0x02bd3c29, 0x00b9da53, 0x00f949c7, 0x03a318a1, 0x01bd3896, 0x0006c0c6}}, Y: Field{[10]uint32{0x02ee339d, 0x03b54be8, 0x02080053, 0x01c8768c, 0x021401b6, 0x000edec6, 0x038233d7, 0x02ab9f97, 0x029b17c3, 0x000576ff}}}, + {X: Field{[10]uint32{0x03dc719d, 0x00b8f66f, 0x032ab699, 0x00ecea43, 0x001210eb, 0x01463730, 0x03a93540, 0x005afa89, 0x030fe92f, 0x0026453b}}, Y: Field{[10]uint32{0x03c4086b, 0x0370ac6c, 0x02b8398d, 0x00b218cc, 0x005e671d, 0x02bd968c, 0x01f3629f, 0x002c47a3, 0x00650cea, 0x001e82f4}}}, + {X: Field{[10]uint32{0x01f60d3e, 0x03b744f7, 0x03810daa, 0x01b5eb39, 0x015798ad, 0x02572585, 0x02fa1763, 0x03d8e1f6, 0x02195599, 0x000e9a3e}}, Y: Field{[10]uint32{0x00e71a89, 0x025afdf5, 0x0054f5cd, 0x03ba6a2b, 0x00de158e, 0x00190729, 0x00faef1e, 0x01a76ce5, 0x02e6a3f5, 0x001d15d6}}}, + {X: Field{[10]uint32{0x0288b2e5, 0x01a71817, 0x023859da, 0x03b1fc04, 0x0241193d, 0x006fff23, 0x01872b1b, 0x01f8c43c, 0x0141e2b6, 0x002dcd87}}, Y: Field{[10]uint32{0x00668344, 0x0241f860, 0x029c29b0, 0x02f7c42f, 0x00315347, 0x01b9eb34, 0x00f5890f, 0x026f29cf, 0x039566d4, 0x003ea75a}}}, + {X: Field{[10]uint32{0x01174e81, 0x0216e0c9, 0x01bc637b, 0x034c4ba6, 0x02aa93a4, 0x03edffe7, 0x03d13543, 0x011903db, 0x018742d8, 0x000d07a6}}, Y: Field{[10]uint32{0x03fcfc95, 0x00adae62, 0x007ac861, 0x0269bb5d, 0x01e95b4e, 0x018b97f0, 0x01cbcff7, 0x01861d84, 0x00dc91b4, 0x00312582}}}, + {X: Field{[10]uint32{0x0083e6f6, 0x03dd76b1, 0x0026e2a0, 0x02febe1d, 0x001f6420, 0x000b25c6, 0x00849094, 0x03d55d00, 0x0045de34, 0x0020f5a9}}, Y: Field{[10]uint32{0x01dddfc1, 0x030486e8, 0x030fd787, 0x00249df6, 0x00e9fbed, 0x012a5376, 0x01cf48a1, 0x03ed4d7b, 0x034458c8, 0x001ea1b6}}}, + {X: Field{[10]uint32{0x02ac351b, 0x02e12e49, 0x03bdda40, 0x0218bf3f, 0x0032d176, 0x01a92676, 0x0082bf1c, 0x032ba624, 0x035a014b, 0x0013c448}}, Y: Field{[10]uint32{0x014a2acf, 0x018cce7a, 0x022886e9, 0x03b6f967, 0x0308678d, 0x01dce72d, 0x00021c83, 0x009a745a, 0x00f15f31, 0x002d4189}}}, + {X: Field{[10]uint32{0x03ee2b89, 0x03a6a734, 0x0115b998, 0x024b0208, 0x02eafb38, 0x02db8f5f, 0x0285907a, 0x0384b3a9, 0x032721cf, 0x0023eed5}}, Y: Field{[10]uint32{0x02906680, 0x0248e8d9, 0x03ab791c, 0x0296be2f, 0x00ef1bb1, 0x0296d6a9, 0x018de8e2, 0x02386973, 0x0285c814, 0x00369ff9}}}, + {X: Field{[10]uint32{0x0096c3de, 0x00b167d5, 0x02bd63f5, 0x03cbf19c, 0x01286023, 0x00fd6627, 0x0205b1f5, 0x00fd7dd9, 0x023cb924, 0x00201329}}, Y: Field{[10]uint32{0x035233c6, 0x01c2c175, 0x01fd8431, 0x01b52722, 0x00865fab, 0x02bad13e, 0x038300ee, 0x00455a86, 0x0112eedb, 0x00000dca}}}, + {X: Field{[10]uint32{0x012a5365, 0x005da70b, 0x03bf58cc, 0x035c77a6, 0x0060b48e, 0x01598341, 0x018de870, 0x02a091ac, 0x006ab83c, 0x002c9e57}}, Y: Field{[10]uint32{0x0249d820, 0x0024d6ca, 0x0041f90d, 0x015e6f70, 0x01db6841, 0x021aa280, 0x03510441, 0x002dad34, 0x02b58853, 0x0019ba30}}}, + {X: Field{[10]uint32{0x02d9dad3, 0x0317814d, 0x02588208, 0x00ec640e, 0x00caf390, 0x001193ad, 0x0139d07c, 0x03645302, 0x004db61b, 0x0037ad4c}}, Y: Field{[10]uint32{0x015777ca, 0x0281aa53, 0x03b27762, 0x0360fdec, 0x0040507d, 0x039201cf, 0x00b62491, 0x0179d9a9, 0x0343e7e4, 0x00063553}}}, + {X: Field{[10]uint32{0x037714c4, 0x00f3aee6, 0x035cf774, 0x03a15d27, 0x01eb79d5, 0x00cd9a40, 0x0061d696, 0x03b0d2db, 0x0102d177, 0x000446fd}}, Y: Field{[10]uint32{0x016a4e54, 0x030e35da, 0x000f0bf8, 0x0083f99e, 0x0107d8ba, 0x0391e83c, 0x036bad45, 0x02ef33c0, 0x012abc38, 0x002fa035}}}, + {X: Field{[10]uint32{0x00be92a5, 0x006f4e37, 0x00f8b016, 0x01419d34, 0x01daceeb, 0x02e18e19, 0x014e71fd, 0x014e4fa3, 0x0343c15c, 0x00252c43}}, Y: Field{[10]uint32{0x01be6dc7, 0x02e6ddfd, 0x02e9bd25, 0x035fc682, 0x038d087d, 0x004161b3, 0x03f77291, 0x0230d96c, 0x032ea34e, 0x003b156b}}}, + {X: Field{[10]uint32{0x02895593, 0x007c6203, 0x02248d3b, 0x00b44051, 0x03fb4a42, 0x00b4c0da, 0x03e529d6, 0x01de1314, 0x03f22d44, 0x001189ea}}, Y: Field{[10]uint32{0x037b3e4a, 0x018140fa, 0x01c483a5, 0x03d31fa3, 0x00cbea9e, 0x01947a52, 0x00172d56, 0x02d66dce, 0x018d6110, 0x0022cd07}}}, + {X: Field{[10]uint32{0x017c355f, 0x02e91a0a, 0x02a80757, 0x02fb05ca, 0x03585dca, 0x037714c9, 0x035727b5, 0x03730dcd, 0x01cfdfea, 0x00067385}}, Y: Field{[10]uint32{0x01e60f81, 0x0333f613, 0x03a6625c, 0x01f816ce, 0x0283853e, 0x021b3bc9, 0x02ca9ec8, 0x024505cd, 0x015ece82, 0x00014195}}}, + {X: Field{[10]uint32{0x039a3e55, 0x0373f42a, 0x01ef0fe6, 0x00b85b4f, 0x01295068, 0x0387e45b, 0x03e97d80, 0x03f2ba30, 0x02818293, 0x001d6901}}, Y: Field{[10]uint32{0x008c7930, 0x01f45577, 0x01f22a04, 0x002fce7d, 0x03452678, 0x0254a62d, 0x039f2af4, 0x03893604, 0x01c0e02e, 0x0014a4b5}}}, + {X: Field{[10]uint32{0x033bf578, 0x03de6f07, 0x026f1cbb, 0x033a3cc8, 0x0388cb82, 0x03d29ccc, 0x03a341d4, 0x01da1ad1, 0x038def4b, 0x0029fae2}}, Y: Field{[10]uint32{0x018199a1, 0x03f24fef, 0x01cc880c, 0x028a1a19, 0x0124407c, 0x0129c962, 0x0352bf39, 0x015df2ce, 0x036fe238, 0x00217662}}}, + {X: Field{[10]uint32{0x03da647a, 0x024e37ac, 0x02c00e8a, 0x01114385, 0x016c9f83, 0x03067dae, 0x0352d143, 0x00759c2c, 0x02b5dcc9, 0x00296e68}}, Y: Field{[10]uint32{0x039571c1, 0x01cbca1e, 0x00c29634, 0x004ff45b, 0x0126fc4e, 0x009833fc, 0x0335aba1, 0x0011c590, 0x03a83985, 0x003c4b53}}}, + {X: Field{[10]uint32{0x00015cca, 0x00273211, 0x0217157c, 0x00c5e2b5, 0x01df58d8, 0x026c3f7d, 0x037c20ee, 0x02269977, 0x02ed48d5, 0x001e6671}}, Y: Field{[10]uint32{0x018f5756, 0x02dcc750, 0x010145bc, 0x003489d5, 0x00aaacaf, 0x034fc4b2, 0x00b3fecb, 0x030e8715, 0x01053706, 0x00055bd1}}}, + {X: Field{[10]uint32{0x009829b1, 0x02b4de71, 0x028e20fe, 0x0161b70b, 0x01422020, 0x030171eb, 0x01baade6, 0x03b746e1, 0x01f3b708, 0x00223fa0}}, Y: Field{[10]uint32{0x03727c01, 0x035035f7, 0x01b10d99, 0x03376a87, 0x008972a8, 0x0182814b, 0x00341502, 0x01f4aec5, 0x024fb04b, 0x003358b8}}}, + {X: Field{[10]uint32{0x03e86763, 0x015f57d3, 0x0264e895, 0x00dd421e, 0x01912165, 0x01a529df, 0x03192beb, 0x0187f908, 0x02b0cfcc, 0x00063ec3}}, Y: Field{[10]uint32{0x00169785, 0x00a3174e, 0x01922b1f, 0x038d548a, 0x0380f4a6, 0x03b61c75, 0x0288e230, 0x02d594e3, 0x031fdfe8, 0x000f3dca}}}, + {X: Field{[10]uint32{0x03d38aac, 0x006721bb, 0x00b660d9, 0x03ebad7f, 0x02004719, 0x02bc639d, 0x03171d5b, 0x03cb333f, 0x02312be4, 0x0036b6cc}}, Y: Field{[10]uint32{0x018bc0d7, 0x03d2cc3e, 0x039813d9, 0x00c31a9c, 0x0150e0b3, 0x02855112, 0x0340e423, 0x03a2f2c1, 0x005d752d, 0x002359e5}}}, + {X: Field{[10]uint32{0x039e5c8e, 0x015fc1a8, 0x039c2d80, 0x0271b070, 0x027b17e0, 0x038c416e, 0x03aa0cb0, 0x027d91ac, 0x00867cdd, 0x003c2e68}}, Y: Field{[10]uint32{0x02f4e9de, 0x032782d7, 0x01c81370, 0x000f052f, 0x003ff913, 0x020872ef, 0x01cf4319, 0x03460103, 0x025625e6, 0x000ad4d3}}}, + {X: Field{[10]uint32{0x02fcb7e0, 0x03efa2b0, 0x0132d406, 0x0199922e, 0x031cd601, 0x01cba350, 0x010e2536, 0x030e9f97, 0x03052e49, 0x00370382}}, Y: Field{[10]uint32{0x03b791d9, 0x0151f871, 0x01bea086, 0x03ce087f, 0x02223e7a, 0x02487892, 0x0139cb56, 0x01946933, 0x03868e1c, 0x003fe465}}}, + {X: Field{[10]uint32{0x02eb91ee, 0x02a9688c, 0x01038b74, 0x023c4604, 0x016bea74, 0x00571b29, 0x02c365b5, 0x03751cd7, 0x0298fb6d, 0x0039c72b}}, Y: Field{[10]uint32{0x01600266, 0x020af3c7, 0x0106ce66, 0x029ca007, 0x019ed731, 0x036f47d0, 0x03c5bc75, 0x0083db8b, 0x0018396c, 0x002012ba}}}, + {X: Field{[10]uint32{0x00ddfd8c, 0x01e4ad35, 0x03b9f88d, 0x01a081e6, 0x006b5d53, 0x02f4b29b, 0x0194d486, 0x0393fced, 0x01b2f7b2, 0x0014346d}}, Y: Field{[10]uint32{0x015cc744, 0x012f2213, 0x01f5b6e3, 0x039d0083, 0x015c554f, 0x02ae863f, 0x039b03f0, 0x0019821a, 0x00c518fa, 0x00155b3d}}}, + {X: Field{[10]uint32{0x002701aa, 0x00c8746f, 0x01747325, 0x021ad1c2, 0x00966348, 0x008fdb2d, 0x00c5e86f, 0x0365537e, 0x003e2bd5, 0x003021d0}}, Y: Field{[10]uint32{0x03507712, 0x028894a8, 0x00679003, 0x012f8ac0, 0x02258bc1, 0x03b61f81, 0x023a549e, 0x01cc001b, 0x0187d851, 0x00276d12}}}, + {X: Field{[10]uint32{0x016d6894, 0x003d45ef, 0x002b3798, 0x03d47a49, 0x014d45f8, 0x03da28a6, 0x00988fd3, 0x00d08b7a, 0x03f7f384, 0x0037440d}}, Y: Field{[10]uint32{0x01cccce1, 0x030646c9, 0x025f254f, 0x03395ac1, 0x021a9c08, 0x01cc24e9, 0x01ab8b76, 0x02f3762c, 0x01615cfb, 0x0032a39b}}}, + {X: Field{[10]uint32{0x00b5ceb4, 0x02731f4d, 0x01d1473a, 0x0295b026, 0x00424dfd, 0x0063dd93, 0x02840c3d, 0x01626fd2, 0x021967ca, 0x003788a6}}, Y: Field{[10]uint32{0x00122b22, 0x014456d5, 0x00be702d, 0x03046e3a, 0x00a1d352, 0x0391bfd1, 0x023f4b2a, 0x018ea50c, 0x01ca84ca, 0x002563f2}}}, + {X: Field{[10]uint32{0x00cdfd9c, 0x031fb881, 0x01cb1143, 0x03759ea3, 0x02f8a3a3, 0x0028d690, 0x0225f487, 0x0213e858, 0x03c9cc9d, 0x0000578c}}, Y: Field{[10]uint32{0x0260e920, 0x026e6cc1, 0x022562f8, 0x00571fcd, 0x02a59a1e, 0x01792b5a, 0x02058364, 0x033574d8, 0x0206ed48, 0x00104f00}}}, + {X: Field{[10]uint32{0x03d6bee0, 0x03902328, 0x00fc4394, 0x0266deac, 0x00dc010b, 0x02c86b8e, 0x023e3173, 0x01361cb4, 0x0161ca3c, 0x0014d089}}, Y: Field{[10]uint32{0x0103048e, 0x02ecfed8, 0x038b78de, 0x002e9c6e, 0x0020f2c5, 0x01e73872, 0x007c7ab7, 0x02427d94, 0x02e5e505, 0x001bba41}}}, + {X: Field{[10]uint32{0x0282b2fc, 0x00765ca6, 0x02a74a03, 0x0028245d, 0x020308bf, 0x0172dc72, 0x0000bbff, 0x013cdcca, 0x034f9b2c, 0x0020a773}}, Y: Field{[10]uint32{0x038483c4, 0x017dab97, 0x005d3352, 0x03101857, 0x01abe3f8, 0x03d621cf, 0x0249d3c9, 0x014e2938, 0x0200429e, 0x0011cde0}}}, + {X: Field{[10]uint32{0x02e911e5, 0x039970e2, 0x00ebe450, 0x02e8757d, 0x01c05594, 0x033fe5fc, 0x023b989a, 0x02c6c524, 0x02b73769, 0x003b5bdb}}, Y: Field{[10]uint32{0x02c38eb4, 0x01403868, 0x03fbe18e, 0x02768dcb, 0x01d52e2d, 0x027fd886, 0x018cd0b6, 0x02136e2e, 0x032f3fe5, 0x0037fb9b}}}, + {X: Field{[10]uint32{0x00455503, 0x009c8170, 0x013da303, 0x02fb2d24, 0x0370616e, 0x03cac612, 0x00d1982d, 0x01c83a3f, 0x03981fbe, 0x0011f948}}, Y: Field{[10]uint32{0x02f3e900, 0x038bd2ae, 0x012515ea, 0x02e1b118, 0x00179f4c, 0x0378379c, 0x020cfbd1, 0x030c3da0, 0x00ebf360, 0x002bf4b7}}}, + {X: Field{[10]uint32{0x01037312, 0x037812ea, 0x010df49f, 0x02a304f7, 0x00ba10e2, 0x017a2039, 0x03f1170f, 0x0387e1bc, 0x03d58f48, 0x002c0a4d}}, Y: Field{[10]uint32{0x00c18c4f, 0x034f1e8a, 0x03cf5347, 0x0093da32, 0x038a6c79, 0x00d5785f, 0x02de5805, 0x021158c5, 0x024f3e4c, 0x000372c2}}}, + {X: Field{[10]uint32{0x001989f8, 0x015ff43b, 0x025d44ee, 0x03af7f71, 0x03878486, 0x00f019ba, 0x0010c2dc, 0x03070c97, 0x00f53578, 0x0027e64f}}, Y: Field{[10]uint32{0x01c8bb52, 0x00ece18c, 0x0275d914, 0x01bc34e0, 0x01e83eda, 0x03986ebe, 0x026ea432, 0x02047359, 0x000b16b8, 0x0031ae35}}}, + {X: Field{[10]uint32{0x013240e6, 0x03e6e277, 0x0284e599, 0x0213cdbf, 0x01ce4317, 0x037f4743, 0x02730edb, 0x03b077c4, 0x00c25913, 0x00250edb}}, Y: Field{[10]uint32{0x03ed3fd0, 0x01dd2093, 0x0316d09f, 0x03ffead6, 0x029604d3, 0x0153bd56, 0x02d7ca32, 0x03fcff50, 0x02bacac2, 0x00396040}}}, + {X: Field{[10]uint32{0x01acfe0a, 0x02fcbc06, 0x00a6481f, 0x033d1fd6, 0x0059511d, 0x01ed69f2, 0x0043da4f, 0x03e7b146, 0x027e69b3, 0x00026c39}}, Y: Field{[10]uint32{0x01c54dd8, 0x00274c3b, 0x01c674a0, 0x00dbdf92, 0x022e074c, 0x01cccf29, 0x02defc7d, 0x03b2d338, 0x002817a4, 0x001a9377}}}, + {X: Field{[10]uint32{0x00571651, 0x03a19ce9, 0x03acc72a, 0x02d004da, 0x020c8246, 0x012329b9, 0x03b0fd40, 0x03463e30, 0x02339cd8, 0x0025f73b}}, Y: Field{[10]uint32{0x00e693e4, 0x00b4b49d, 0x03d510d8, 0x01192208, 0x0229b952, 0x0224cf71, 0x02e36cfc, 0x02fce62a, 0x0205cc20, 0x001858e8}}}, + {X: Field{[10]uint32{0x02292ced, 0x027fdeb4, 0x00267299, 0x003cadf7, 0x02798c94, 0x01286e80, 0x02a9c26f, 0x007b69f3, 0x02f92696, 0x00287979}}, Y: Field{[10]uint32{0x00d5f19d, 0x0234c6c2, 0x00fbeca1, 0x03e4ee7a, 0x03cfc07a, 0x01b65d95, 0x01384013, 0x003dd3b4, 0x037a6a71, 0x001409d2}}}, + {X: Field{[10]uint32{0x034884a9, 0x0210a596, 0x021a61a9, 0x02c61020, 0x001c21bd, 0x03f1dc60, 0x03c9bdc6, 0x0377f14b, 0x03cf7cdf, 0x0011cf57}}, Y: Field{[10]uint32{0x03d856af, 0x01f16c63, 0x02250eba, 0x03afa2f9, 0x0389ff95, 0x0320b656, 0x032d7036, 0x03d543fa, 0x02a70ad7, 0x000d220d}}}, + {X: Field{[10]uint32{0x0396f613, 0x0147a851, 0x009d454c, 0x004caec5, 0x00db8c1e, 0x00151326, 0x00c33b27, 0x02cb413f, 0x00427384, 0x0027061d}}, Y: Field{[10]uint32{0x00ae0a19, 0x00fdfd7f, 0x0342b791, 0x00d831c4, 0x02c1825d, 0x02573bee, 0x0212e475, 0x0001e4f6, 0x0043970f, 0x000b5b7b}}}, + {X: Field{[10]uint32{0x0162b154, 0x029aa981, 0x0351e0c7, 0x00a57d6f, 0x02ed63c7, 0x039d0392, 0x002d826b, 0x038afedd, 0x00469150, 0x00047387}}, Y: Field{[10]uint32{0x034fa33d, 0x02da9887, 0x00271aa3, 0x0232bca9, 0x0267f3b2, 0x03a2df64, 0x01f8b93b, 0x00a03eaf, 0x014fea38, 0x001ba194}}}, + {X: Field{[10]uint32{0x01656042, 0x0297159e, 0x031cd4d9, 0x01c52eb3, 0x03dde2fd, 0x0234731b, 0x013c3541, 0x0379bca2, 0x0104e4e2, 0x000780de}}, Y: Field{[10]uint32{0x00960755, 0x03a06963, 0x0221b462, 0x0214f007, 0x023c81ac, 0x002bc0d7, 0x028aa38a, 0x01a084a8, 0x01c934c2, 0x0006edd6}}}, + {X: Field{[10]uint32{0x00071d82, 0x007669f0, 0x02800995, 0x0178c731, 0x003f8d50, 0x03e78d88, 0x0294f240, 0x0266abc6, 0x006723f8, 0x0014bf25}}, Y: Field{[10]uint32{0x00bd6dbb, 0x0065a5f4, 0x039db924, 0x02cd2ce8, 0x0239c909, 0x01c2d1ee, 0x00dfb992, 0x00208083, 0x02e07543, 0x000118ca}}}, + {X: Field{[10]uint32{0x0242b20d, 0x027600c1, 0x02a4ff9e, 0x02d35e37, 0x0235069e, 0x025bd4e1, 0x00f9e394, 0x00672c85, 0x01059975, 0x0032d616}}, Y: Field{[10]uint32{0x0093ac7d, 0x038e44fb, 0x02d45064, 0x03cd6643, 0x007131b2, 0x038b5794, 0x02a0f51c, 0x01d68790, 0x02e7a5b4, 0x0006e7d0}}}, + {X: Field{[10]uint32{0x00a69c46, 0x02b803ed, 0x03a12cec, 0x00368471, 0x03e7ab18, 0x034def34, 0x03275845, 0x011561d5, 0x005729f1, 0x000e0b0a}}, Y: Field{[10]uint32{0x00039440, 0x03079f95, 0x008e4a25, 0x028f82c9, 0x03495907, 0x03c4a1a4, 0x02586843, 0x003ecdb8, 0x011220a7, 0x0032c9fa}}}, + {X: Field{[10]uint32{0x034e5024, 0x03b2e213, 0x0164b6dc, 0x00fecbe5, 0x02a4dd61, 0x02cce9a4, 0x00456dce, 0x0039263e, 0x02c6c285, 0x0005bc21}}, Y: Field{[10]uint32{0x039339a9, 0x03bbfb49, 0x01df312d, 0x033b26b5, 0x0073cb5e, 0x0169940d, 0x008ca682, 0x004620d1, 0x020888eb, 0x000b854a}}}, + {X: Field{[10]uint32{0x01a02492, 0x03585dd9, 0x009506ee, 0x007d99cc, 0x014439a5, 0x011ba89d, 0x030f0ae4, 0x00d5dd54, 0x011b1f0a, 0x001d626f}}, Y: Field{[10]uint32{0x00462d49, 0x0365d966, 0x0389c00a, 0x030d8c30, 0x0004076f, 0x00534d8d, 0x01771bb0, 0x02054c79, 0x0212d375, 0x000b6103}}}, + {X: Field{[10]uint32{0x00930890, 0x00c9bd35, 0x004469a0, 0x03d689ad, 0x01a80cc5, 0x030efbba, 0x02dbd2b0, 0x00e944f7, 0x0240cce6, 0x00062e6b}}, Y: Field{[10]uint32{0x022690e4, 0x0293ae4a, 0x0118acf6, 0x035e382b, 0x039e0032, 0x02c9c342, 0x03571382, 0x00f111c6, 0x024dd5ed, 0x00092e1a}}}, + {X: Field{[10]uint32{0x03ebb48a, 0x03a2a2b4, 0x009a4ccf, 0x01b840b2, 0x0394e9ba, 0x012fa189, 0x030db5d1, 0x007bd900, 0x00a4acc7, 0x002307dd}}, Y: Field{[10]uint32{0x0245677a, 0x02c59ce4, 0x01c9416e, 0x00664b57, 0x021af1c1, 0x022c9b21, 0x03ba735c, 0x0294a478, 0x011998ae, 0x0029e7c0}}}, + {X: Field{[10]uint32{0x02bfb080, 0x00b080f0, 0x010465cd, 0x00223b1f, 0x002c0fca, 0x000e096d, 0x0157ba0d, 0x02aadd6d, 0x012d36bf, 0x00236016}}, Y: Field{[10]uint32{0x0151d3f6, 0x02d19bc0, 0x03a51859, 0x01504335, 0x027671a6, 0x014cff4a, 0x00a1bd4a, 0x01d14d34, 0x008791f2, 0x000f91e5}}}, + {X: Field{[10]uint32{0x030ca248, 0x0095d959, 0x02770f71, 0x03a78114, 0x03f36782, 0x00b159dd, 0x005046cf, 0x038563b2, 0x0319f477, 0x003aac2e}}, Y: Field{[10]uint32{0x00c04640, 0x01d3329f, 0x01ebd700, 0x0190fc62, 0x0337f0bd, 0x00ae81c7, 0x0355e563, 0x00ebd36b, 0x00812309, 0x00289f5c}}}, + {X: Field{[10]uint32{0x020a039c, 0x00cb1a8a, 0x0399bdb5, 0x00776d21, 0x0109647e, 0x0149833a, 0x03b249fd, 0x00be89b4, 0x01c9ebbb, 0x003fc343}}, Y: Field{[10]uint32{0x02b31fa9, 0x00e50bbe, 0x010233c4, 0x03d59884, 0x02fad5b0, 0x0366dd82, 0x01c35055, 0x007e2f38, 0x02ae7f16, 0x0004ac3d}}}, + {X: Field{[10]uint32{0x0037d526, 0x00aaa58e, 0x030ad42a, 0x0080fb9a, 0x02be22b3, 0x02c22def, 0x03403468, 0x02f46e48, 0x023571db, 0x0036268c}}, Y: Field{[10]uint32{0x02e3cf27, 0x02dd084d, 0x03b62146, 0x0241551b, 0x03db4a04, 0x039bdbc7, 0x008124d9, 0x03c59cc4, 0x01b99988, 0x0009768d}}}, + {X: Field{[10]uint32{0x025b43fd, 0x013004a4, 0x00a229ec, 0x0055574d, 0x0313ffb3, 0x019d47df, 0x03cdafa8, 0x02acb10c, 0x023bf01c, 0x003c5400}}, Y: Field{[10]uint32{0x02c7a9cc, 0x030f4cce, 0x03f341a9, 0x01a881ca, 0x038ac37a, 0x01ea7920, 0x00966b71, 0x032259b7, 0x0221026a, 0x000c7dc3}}}, + {X: Field{[10]uint32{0x003af2a8, 0x03b80672, 0x0070d9b3, 0x032382d1, 0x0276f442, 0x030b3436, 0x02e9d5e2, 0x0025e1ca, 0x013b2d58, 0x003663af}}, Y: Field{[10]uint32{0x01dba3f5, 0x005f249d, 0x00823e00, 0x01629453, 0x00930fb3, 0x029b1c89, 0x03f9873d, 0x0065c0d2, 0x02a95a06, 0x0027b56d}}}, + {X: Field{[10]uint32{0x03c3c746, 0x03ec06f2, 0x01827583, 0x00efe9df, 0x02817353, 0x03cf2a05, 0x002e313d, 0x0253bb7f, 0x0185833a, 0x00156d8b}}, Y: Field{[10]uint32{0x024a835c, 0x02b4444d, 0x0189715b, 0x02fd1320, 0x011f4dbb, 0x0269e84e, 0x01eb9211, 0x016bdede, 0x03730cb9, 0x0027e121}}}, + {X: Field{[10]uint32{0x01718de6, 0x003fb3ef, 0x021ca286, 0x01268a9e, 0x00ec759c, 0x01b070ff, 0x0069de8f, 0x00fe4d13, 0x0176fef7, 0x0037ebd3}}, Y: Field{[10]uint32{0x025a0671, 0x034c509c, 0x01971357, 0x0054656f, 0x017fba1f, 0x00db64fb, 0x0009f94c, 0x030a1fd9, 0x029344e2, 0x002b12bd}}}, + {X: Field{[10]uint32{0x01fe29da, 0x01fcf9b1, 0x00bf838b, 0x00f16043, 0x03a7839f, 0x005bb88a, 0x0020f29a, 0x0248b0dd, 0x00a34510, 0x00212911}}, Y: Field{[10]uint32{0x0114f06a, 0x02615404, 0x0175fa18, 0x01c032fe, 0x026e89af, 0x01cc1a7f, 0x03f420a6, 0x0304b850, 0x01802215, 0x003bdccf}}}, + {X: Field{[10]uint32{0x032212af, 0x006a94e9, 0x02548629, 0x01260e24, 0x032c3377, 0x025a0468, 0x01d24d12, 0x01c020f7, 0x021146c8, 0x0035f213}}, Y: Field{[10]uint32{0x00844ac4, 0x03350184, 0x01745f84, 0x0344135e, 0x019579b2, 0x0202bb18, 0x01357e54, 0x0102f70f, 0x0158a3be, 0x002c61f7}}}, + {X: Field{[10]uint32{0x0198051d, 0x03a9e215, 0x02a069ff, 0x02d5c68b, 0x00c7fca4, 0x01d41cb3, 0x029f6165, 0x0022fbce, 0x027fa70b, 0x003f7b70}}, Y: Field{[10]uint32{0x03b9bf9a, 0x0118a901, 0x01fbb3ec, 0x01379c91, 0x0253f6f5, 0x029fd378, 0x014d279b, 0x016a780d, 0x031a1c57, 0x003fa6de}}}, + {X: Field{[10]uint32{0x03122e77, 0x0171e57b, 0x039a5c2d, 0x0141365a, 0x03f950c2, 0x01610dec, 0x0022b350, 0x0331aa48, 0x038ad3f2, 0x0033e9d1}}, Y: Field{[10]uint32{0x021409c4, 0x02516c89, 0x023bb158, 0x0028f6a1, 0x022ad780, 0x03f7530b, 0x00f8eedf, 0x00a0d4d5, 0x01cae959, 0x003cf923}}}, + {X: Field{[10]uint32{0x020eefe2, 0x01f73a3b, 0x023f8033, 0x02f36377, 0x02aa1584, 0x01d9e3f3, 0x03b7493d, 0x00825dc3, 0x03f83fd6, 0x0023a455}}, Y: Field{[10]uint32{0x0205351b, 0x027ce94e, 0x0188ac8d, 0x016913ea, 0x003322fb, 0x02d2c8a7, 0x00f91df4, 0x037edae9, 0x02898c05, 0x00181e6e}}}, + {X: Field{[10]uint32{0x03116f75, 0x022e4a00, 0x01dfdbea, 0x03f1a9fe, 0x029d422f, 0x02f77fc8, 0x00eb80a9, 0x02b0c3b1, 0x03b6103e, 0x001efd7b}}, Y: Field{[10]uint32{0x03a71a3b, 0x00e24c4e, 0x03e67ba1, 0x0130d54f, 0x012cba4b, 0x015e5850, 0x01355542, 0x007b7f96, 0x02596479, 0x003beb6d}}}, + {X: Field{[10]uint32{0x00e8df0b, 0x009e0834, 0x0153e85f, 0x03f22747, 0x01690a13, 0x01da5c1e, 0x007b1b53, 0x030b49a3, 0x02b7b7b2, 0x003d6e80}}, Y: Field{[10]uint32{0x02465485, 0x03c54567, 0x013a3af7, 0x01930f1e, 0x00a9266b, 0x034b510c, 0x00329d19, 0x003906ff, 0x0126b264, 0x00198c5b}}}, + {X: Field{[10]uint32{0x03004475, 0x01262fff, 0x008284a1, 0x0297c494, 0x0387c10d, 0x008a547e, 0x02bc3dbf, 0x029325b4, 0x01f3dcec, 0x0017aab3}}, Y: Field{[10]uint32{0x011f122d, 0x0094652b, 0x02106c8c, 0x00425dfa, 0x00b38f58, 0x020c7341, 0x0185d404, 0x0338245a, 0x03ed9721, 0x0032cf6c}}}, + {X: Field{[10]uint32{0x024a5554, 0x0169da29, 0x01e4177c, 0x02fd3e8b, 0x01d1320a, 0x03544cdc, 0x0152ba6a, 0x0044d14d, 0x0017b8d6, 0x00073f97}}, Y: Field{[10]uint32{0x011dcd5d, 0x03a91aff, 0x008945ed, 0x039801e8, 0x0099bcab, 0x00c67dd0, 0x024a2f7e, 0x02e21c79, 0x00f64846, 0x0014e0df}}}, + {X: Field{[10]uint32{0x025dbc10, 0x007c28de, 0x028805e2, 0x02ed1391, 0x02286f47, 0x004843ef, 0x0091dd2a, 0x03321873, 0x03478a2c, 0x0024aa0f}}, Y: Field{[10]uint32{0x0199de94, 0x03d53d72, 0x01043684, 0x03e43b0d, 0x000cb69f, 0x006604cb, 0x0270b8bc, 0x016c0be0, 0x0065fcd4, 0x003fb8d7}}}, + {X: Field{[10]uint32{0x02d277d3, 0x012ada72, 0x01dd14f7, 0x034c92fd, 0x0173c07a, 0x00d6f6de, 0x0186ea10, 0x00e6c3d3, 0x01bad5d5, 0x0005c8a1}}, Y: Field{[10]uint32{0x02ada654, 0x0308be6a, 0x00897314, 0x0100a22d, 0x02cfc290, 0x03b8f883, 0x03afa15c, 0x018d9382, 0x0140cf35, 0x00116afe}}}, + {X: Field{[10]uint32{0x03164762, 0x01badcf2, 0x0032c764, 0x0204e817, 0x013126ce, 0x03e45637, 0x014ae08b, 0x026eae15, 0x015392e1, 0x002b45ef}}, Y: Field{[10]uint32{0x01065586, 0x0115d323, 0x01b94e16, 0x014625be, 0x038139c6, 0x0275c353, 0x01d4f47d, 0x00e61ddd, 0x00191c83, 0x000284a6}}}, + {X: Field{[10]uint32{0x02bdeb1c, 0x01f2cc4b, 0x00a12526, 0x001f1019, 0x03c23fd3, 0x00f94470, 0x02ce9e91, 0x02a2707d, 0x033e91a4, 0x00041086}}, Y: Field{[10]uint32{0x02a53319, 0x0164a18e, 0x03cc1923, 0x00036b1d, 0x03985697, 0x01cc4632, 0x02b8a510, 0x03c3f461, 0x01d09e49, 0x0014e6ed}}}, + {X: Field{[10]uint32{0x01de5bfd, 0x00d6c188, 0x030ff397, 0x03787838, 0x012e8476, 0x0198caa9, 0x039eba60, 0x00a8f772, 0x00fa7815, 0x00310eb7}}, Y: Field{[10]uint32{0x00abdebf, 0x00469567, 0x018801a9, 0x0389815f, 0x031e81c6, 0x036b2ede, 0x03d04f05, 0x01602e11, 0x01ca2122, 0x001b7742}}}, + {X: Field{[10]uint32{0x00bf9a73, 0x036401a6, 0x0227b5c8, 0x00764aab, 0x0014434f, 0x0279f662, 0x02b9e50d, 0x01634131, 0x00cb603a, 0x003dea67}}, Y: Field{[10]uint32{0x031a7ccb, 0x00e9df69, 0x01b0878a, 0x01332bf2, 0x005e6293, 0x032dd04c, 0x02d68091, 0x00e4eba5, 0x024476f4, 0x003337f0}}}, + {X: Field{[10]uint32{0x0209c826, 0x01d6f9c3, 0x01aacb31, 0x005a7492, 0x02f602d5, 0x028b2a6f, 0x038f44f4, 0x013a8d40, 0x01bf7017, 0x0026af25}}, Y: Field{[10]uint32{0x03adfe0c, 0x00663835, 0x03763617, 0x036d32ad, 0x0222a9fe, 0x0233b6b2, 0x027d2c9f, 0x03e28f50, 0x02ed3e71, 0x001b3ef3}}}, + {X: Field{[10]uint32{0x005d8d82, 0x02ee7b57, 0x035c5546, 0x03f03414, 0x03d7bd08, 0x0124f273, 0x034af06b, 0x0121cfb2, 0x009335c8, 0x00229f2a}}, Y: Field{[10]uint32{0x01e31bc1, 0x000064c8, 0x005ba07b, 0x03fb4bca, 0x01209ae3, 0x010511e6, 0x031ee4e5, 0x00f021cb, 0x0372090d, 0x0009462c}}}, + {X: Field{[10]uint32{0x024d1c3e, 0x032489e9, 0x03b79ff1, 0x0373091b, 0x02b39fdb, 0x018be352, 0x01182fd8, 0x018a365a, 0x03798649, 0x001c3238}}, Y: Field{[10]uint32{0x02ea3cbb, 0x0038c849, 0x0386f7f5, 0x005d3bf6, 0x03936c95, 0x03558823, 0x0297d9ef, 0x00292bb0, 0x02d527ec, 0x0031e4c6}}}, + {X: Field{[10]uint32{0x01002121, 0x00b58a0c, 0x0076b957, 0x039f0616, 0x00934a82, 0x012023f7, 0x01dcf61b, 0x007b81c7, 0x02b40612, 0x0035e0fd}}, Y: Field{[10]uint32{0x029c7fbb, 0x007662d7, 0x0262ca03, 0x0055a52e, 0x0028b3ed, 0x02699226, 0x0107c82b, 0x01a52678, 0x01841422, 0x002aa4af}}}, + {X: Field{[10]uint32{0x03654c18, 0x01f939de, 0x007581a1, 0x025671de, 0x02b75927, 0x03aa3931, 0x01ffbb87, 0x02d0eb2b, 0x021c29ab, 0x00307c1a}}, Y: Field{[10]uint32{0x03ecdbf0, 0x006497be, 0x005476cd, 0x01c2a906, 0x03bc1024, 0x03968263, 0x01b0e7d9, 0x010b3eae, 0x01e2f1db, 0x00076b83}}}, + {X: Field{[10]uint32{0x02cc5105, 0x01f98b94, 0x0072487b, 0x009d21a6, 0x02d1498a, 0x0085c998, 0x02633ea3, 0x02d61e19, 0x02113205, 0x000ab5d3}}, Y: Field{[10]uint32{0x00ff779e, 0x01176834, 0x02e105de, 0x01652e2f, 0x02b5c851, 0x01d5720e, 0x01aa7d30, 0x0287f589, 0x0107de1f, 0x0031c31d}}}, + {X: Field{[10]uint32{0x037408b6, 0x00025e35, 0x01ac03d8, 0x015dd2b2, 0x03a9e32b, 0x01c713d5, 0x0374e233, 0x01a919ba, 0x01ad7224, 0x003d243a}}, Y: Field{[10]uint32{0x01dc3d6a, 0x003c06aa, 0x01fb963a, 0x006a2d12, 0x0377e49a, 0x03096141, 0x02ef15e4, 0x005a1ee9, 0x027f8fdd, 0x00151bcd}}}, + {X: Field{[10]uint32{0x001d6149, 0x008cdce6, 0x030553f1, 0x03143781, 0x0280c431, 0x017e2ecc, 0x01788b05, 0x02da5f81, 0x00918357, 0x0008140a}}, Y: Field{[10]uint32{0x028e3b0d, 0x01aaf411, 0x02777796, 0x016d71de, 0x019489ee, 0x0214bf42, 0x01a67712, 0x00388963, 0x00e54411, 0x000e7410}}}, + {X: Field{[10]uint32{0x006eae95, 0x0007acbe, 0x005d1bb0, 0x026780e3, 0x02e4b782, 0x0137a4a5, 0x0359915d, 0x028e8fbb, 0x038ec169, 0x001ba46e}}, Y: Field{[10]uint32{0x00877dfd, 0x0252e8a0, 0x008872ae, 0x03574823, 0x0045305d, 0x0227eb12, 0x0034063a, 0x0327c459, 0x029788f8, 0x0034b084}}}, + {X: Field{[10]uint32{0x03a34905, 0x01e2ec5a, 0x02a01906, 0x02ea79f7, 0x0339e7d0, 0x00796b54, 0x00d0d2fe, 0x0102c184, 0x03c839fc, 0x0033ca51}}, Y: Field{[10]uint32{0x0337c63d, 0x00502c8f, 0x007baaec, 0x01a84c7b, 0x018db00f, 0x01cba1d7, 0x0358d7b1, 0x0354fc35, 0x030f7f0c, 0x00185169}}}, + {X: Field{[10]uint32{0x022366f1, 0x01861d3e, 0x02864ad1, 0x0306b0f1, 0x001c8db1, 0x02b4ca8a, 0x01c9b010, 0x029b2158, 0x0387ea93, 0x002d23e0}}, Y: Field{[10]uint32{0x022d253c, 0x00c5749e, 0x0276b375, 0x02077e10, 0x009f46bd, 0x018273f2, 0x03d971b3, 0x01f4f89b, 0x0333cbe0, 0x0000b2ac}}}, + {X: Field{[10]uint32{0x02a1f827, 0x007b6850, 0x0315ef39, 0x013a0515, 0x0030f605, 0x025bf50f, 0x00ae58c6, 0x00b4d393, 0x03660c57, 0x001f12d7}}, Y: Field{[10]uint32{0x01843d97, 0x034cab66, 0x033b008e, 0x02b57e53, 0x02d0adc2, 0x01848cb0, 0x007c5fcc, 0x016bc0e4, 0x024fbe12, 0x000f2f89}}}, + {X: Field{[10]uint32{0x010d86e8, 0x02a17821, 0x02567378, 0x0147d756, 0x018fe24e, 0x01e1d636, 0x027f9890, 0x02786588, 0x0368d464, 0x00395e58}}, Y: Field{[10]uint32{0x02c9d4a7, 0x030d53bd, 0x0089646e, 0x02e35982, 0x021fa111, 0x01e9f92f, 0x02880bf6, 0x0244a26b, 0x0343c9a6, 0x0001d2ec}}}, + {X: Field{[10]uint32{0x004d637f, 0x00ae963f, 0x016509f0, 0x00994f1f, 0x0167c1ab, 0x038f2976, 0x01b88416, 0x03a7bf06, 0x025efe83, 0x0037e841}}, Y: Field{[10]uint32{0x00a5042d, 0x020fbb43, 0x00a231ec, 0x00668aa8, 0x02e23fdf, 0x021794d4, 0x0270e046, 0x00dee8bc, 0x0167eb02, 0x00008b49}}}, + {X: Field{[10]uint32{0x028af132, 0x01ecdea4, 0x01f2f234, 0x01133c4c, 0x008f4638, 0x039c42e0, 0x01a3ce98, 0x030cca3f, 0x00aad436, 0x000ba876}}, Y: Field{[10]uint32{0x0298dc4c, 0x0187cc43, 0x004328fc, 0x0081e80d, 0x0213ff96, 0x033ca92c, 0x00a243cc, 0x02b44160, 0x020fb8c2, 0x000cfe9f}}}, + {X: Field{[10]uint32{0x0167253f, 0x01477975, 0x031b4c0a, 0x01b3e2a4, 0x03ab6a97, 0x039677cd, 0x008298b5, 0x02bcfe9e, 0x00518122, 0x0004ab85}}, Y: Field{[10]uint32{0x0124877d, 0x034c6807, 0x015a7926, 0x02bad555, 0x021c3ff9, 0x038fc296, 0x02fa7329, 0x0074bb78, 0x01d2b327, 0x00217fc7}}}, + {X: Field{[10]uint32{0x01bf6619, 0x01164c25, 0x00270856, 0x03bd57be, 0x03125579, 0x03b1d68e, 0x02b84fed, 0x02bc6a9c, 0x01efb588, 0x003f51b8}}, Y: Field{[10]uint32{0x03a51b17, 0x01f2dec9, 0x01ea40f5, 0x01eba071, 0x03342e6b, 0x01ce8abf, 0x007d477c, 0x00a4bd83, 0x006eceb6, 0x00341ab7}}}, + {X: Field{[10]uint32{0x0332b52b, 0x024342df, 0x01e614a2, 0x011ac5cb, 0x01c7a179, 0x02f88ab3, 0x009e1bf0, 0x0347bc71, 0x013eb8c0, 0x0003b5f6}}, Y: Field{[10]uint32{0x02303ada, 0x0233a7ec, 0x02246f36, 0x02129a33, 0x02b55522, 0x010aafac, 0x036668a7, 0x0070ebe3, 0x030a39a8, 0x001343b0}}}, + {X: Field{[10]uint32{0x029619ef, 0x0022db43, 0x034dc9d8, 0x004cd893, 0x01585179, 0x01d701b7, 0x02bda814, 0x01e69a7f, 0x03a5cd0e, 0x003f33f7}}, Y: Field{[10]uint32{0x010adf49, 0x009106b7, 0x015139bd, 0x012b5838, 0x02ec6232, 0x024aa58d, 0x01959c69, 0x026fb7e2, 0x000d11d0, 0x001e6e41}}}, + {X: Field{[10]uint32{0x034ac477, 0x02955912, 0x00010a57, 0x029c8ad1, 0x0316823e, 0x02f1c532, 0x02044b27, 0x026bfb4a, 0x02b86a9b, 0x0020c5d8}}, Y: Field{[10]uint32{0x0156c708, 0x005a7926, 0x02ff69c3, 0x0372989a, 0x032754c1, 0x02137f5d, 0x00b3f77f, 0x02ff72d2, 0x00628ef3, 0x00051eb8}}}, + {X: Field{[10]uint32{0x02f26b01, 0x00ee6753, 0x02fb3490, 0x0187c995, 0x01f92cc4, 0x03f8333e, 0x0370adbb, 0x014c0f23, 0x0001a84d, 0x000cd123}}, Y: Field{[10]uint32{0x03b8f2ff, 0x03a9507f, 0x0095f736, 0x00f1bf5f, 0x02208ad0, 0x03b9fe41, 0x00a82840, 0x02e98723, 0x03490ae8, 0x00395c9c}}}, + {X: Field{[10]uint32{0x03d215a6, 0x01533081, 0x024a2482, 0x036ac66c, 0x0160df85, 0x003aebdb, 0x03ccb8c5, 0x004c1055, 0x02616ddf, 0x00248284}}, Y: Field{[10]uint32{0x028d0f4e, 0x028f283c, 0x02e369f1, 0x00738313, 0x03e2cb67, 0x02a302e5, 0x02f7a11c, 0x03a240f4, 0x00f9cc91, 0x00067935}}}, + {X: Field{[10]uint32{0x036b1ba4, 0x03f98b94, 0x026b7fca, 0x029712e4, 0x01458385, 0x02eb0971, 0x020ac00c, 0x002e70fd, 0x021d3e37, 0x00077e33}}, Y: Field{[10]uint32{0x0099a92b, 0x039f9814, 0x01083533, 0x03d6f1c0, 0x023fcbab, 0x01ca4253, 0x02f61602, 0x0141e54a, 0x006ee363, 0x000d137d}}}, + {X: Field{[10]uint32{0x038b7b72, 0x02ca2074, 0x013b6286, 0x03236036, 0x022e2243, 0x00de8149, 0x0018175c, 0x009ae04f, 0x007dabfe, 0x001c89e1}}, Y: Field{[10]uint32{0x03973d24, 0x02622e29, 0x03364622, 0x0104311a, 0x0128b5aa, 0x0185973e, 0x0289c934, 0x00f37654, 0x01eb33da, 0x002fb79e}}}, + {X: Field{[10]uint32{0x03f7fb8d, 0x027ca4bb, 0x01995972, 0x013c9b63, 0x003caff7, 0x03321041, 0x02571f8c, 0x022feac0, 0x0259e121, 0x001b7bee}}, Y: Field{[10]uint32{0x00340a04, 0x025aa353, 0x001a6956, 0x00156487, 0x002c188c, 0x034d39df, 0x03770d1b, 0x03ef165b, 0x028e21f2, 0x00135eea}}}, + {X: Field{[10]uint32{0x002d6bd3, 0x00581478, 0x020f990b, 0x006ad8c6, 0x0208302e, 0x02b7d4ef, 0x031ae022, 0x01f491ac, 0x00eff512, 0x003199fd}}, Y: Field{[10]uint32{0x02d34cf5, 0x00312936, 0x032373e8, 0x00f549eb, 0x02f8de28, 0x01f5d1a8, 0x00d822c3, 0x02f7dbf5, 0x0276ce11, 0x000f5ef3}}}, + {X: Field{[10]uint32{0x0229d866, 0x00b1cbf3, 0x03d2355c, 0x02e39aec, 0x006fbca1, 0x00e8aac0, 0x00dcc242, 0x0083d664, 0x02744416, 0x003b67a1}}, Y: Field{[10]uint32{0x0006ad30, 0x01f08a96, 0x021a5829, 0x01c47b0d, 0x027c03dd, 0x0024c37b, 0x01a12f33, 0x0268aee0, 0x019bb428, 0x0019357b}}}, + {X: Field{[10]uint32{0x0176fb24, 0x03ae630c, 0x02ea0b0e, 0x03bab114, 0x03219e57, 0x018d13bc, 0x0000b256, 0x033b80cf, 0x0057e6b0, 0x0021a8db}}, Y: Field{[10]uint32{0x02fff739, 0x03a36cfa, 0x02f25135, 0x00f9e686, 0x01b147b4, 0x02564ad7, 0x01038748, 0x01637d38, 0x01da9e9b, 0x002d3d2f}}}, + {X: Field{[10]uint32{0x00cca913, 0x0248a02f, 0x00e04337, 0x0208779c, 0x01fd02bf, 0x0285478f, 0x02105acb, 0x01bfce83, 0x03844539, 0x000b88dd}}, Y: Field{[10]uint32{0x03148551, 0x01c5b0d9, 0x0304fc0b, 0x03728cd8, 0x00f43726, 0x02ef3241, 0x00464c43, 0x020fc184, 0x039ce779, 0x003dcd94}}}, + {X: Field{[10]uint32{0x00a1390f, 0x027e6008, 0x028c1689, 0x021eb0b5, 0x009db88a, 0x00682f00, 0x026dbcf1, 0x0364d948, 0x014c7790, 0x003334f0}}, Y: Field{[10]uint32{0x003af907, 0x037f75c7, 0x00a6781c, 0x02a01f7c, 0x00f8a9cb, 0x006264c8, 0x03bac2af, 0x017767cc, 0x035fbd6d, 0x002c902c}}}, + {X: Field{[10]uint32{0x0237b018, 0x033361cd, 0x021b217b, 0x02b6e09d, 0x01eba4ef, 0x015625e3, 0x006566d0, 0x035ec71b, 0x027f0988, 0x001dc4ef}}, Y: Field{[10]uint32{0x00475781, 0x02cd309d, 0x03d9470d, 0x039993b9, 0x01c75f31, 0x017eacd0, 0x02ef7c51, 0x00aea8bb, 0x026fa9d6, 0x0023ee46}}}, + {X: Field{[10]uint32{0x00982b02, 0x0199eea9, 0x0398b1ab, 0x03fc7165, 0x0134c739, 0x02c21573, 0x020acf56, 0x032cee54, 0x0160035d, 0x0015216b}}, Y: Field{[10]uint32{0x02a90f0f, 0x00e658a5, 0x03f9fcd4, 0x01579f72, 0x0357cbd4, 0x0224c46f, 0x03df62e5, 0x005329d0, 0x007b1e7c, 0x00077b1b}}}, + {X: Field{[10]uint32{0x00ee0f19, 0x0268f72c, 0x01ed189c, 0x0007cac1, 0x00411bd2, 0x013a1503, 0x012d1cfc, 0x01213407, 0x003ad3be, 0x002965d4}}, Y: Field{[10]uint32{0x001113cd, 0x0157b8ec, 0x014dce28, 0x03c1d972, 0x00becbd6, 0x036f3d24, 0x02cee664, 0x00466478, 0x027d3800, 0x000d444f}}}, + {X: Field{[10]uint32{0x0191ce4a, 0x03795f37, 0x0046cb94, 0x00de0320, 0x011ae249, 0x02f4bf64, 0x01d07a3d, 0x00c2c55f, 0x0251abb1, 0x002ea46c}}, Y: Field{[10]uint32{0x013e1f6c, 0x030d64c3, 0x01dcfe1d, 0x003f85e6, 0x03837742, 0x03d90bee, 0x01f33f54, 0x03b7ee9a, 0x0080500a, 0x0033f308}}}, + {X: Field{[10]uint32{0x02d324a4, 0x0116ffe1, 0x032e2fb0, 0x012980fe, 0x005c6d2f, 0x01721905, 0x03d33869, 0x01ef4f1b, 0x025883cc, 0x002b7ed6}}, Y: Field{[10]uint32{0x030cdc5c, 0x01554fde, 0x0172222a, 0x014f325d, 0x013a5257, 0x030c36a4, 0x00415a18, 0x00b7f714, 0x02d745d8, 0x000595d3}}}, + {X: Field{[10]uint32{0x03561ae8, 0x013b73e8, 0x023e29d9, 0x029383ee, 0x01ba1f13, 0x00292f8d, 0x0054b141, 0x002972b2, 0x014ddd71, 0x00042124}}, Y: Field{[10]uint32{0x01c25e99, 0x0373e152, 0x003babe6, 0x028d6423, 0x002f2b74, 0x037e3999, 0x02ac6cda, 0x03bd8104, 0x01353240, 0x00194f28}}}, + {X: Field{[10]uint32{0x026c6f7b, 0x0337345b, 0x0033f133, 0x01abe01e, 0x0281876a, 0x02e207bf, 0x028abe50, 0x022c505e, 0x02719af3, 0x001c12a8}}, Y: Field{[10]uint32{0x03769e54, 0x013d9ba8, 0x03b9263f, 0x03d10ae9, 0x0111395a, 0x038a8690, 0x00726c9b, 0x00602f12, 0x02b348c1, 0x0029bfb8}}}, + {X: Field{[10]uint32{0x00aec289, 0x01ee0daa, 0x0108051d, 0x03a250b2, 0x03fe68b0, 0x024f19a0, 0x01f57348, 0x00aa1970, 0x00c17f5d, 0x00118123}}, Y: Field{[10]uint32{0x03288efd, 0x00681e62, 0x03277a46, 0x00d0e106, 0x032e7668, 0x02d3e28c, 0x01bf9c6b, 0x03ddf41d, 0x003089a8, 0x0036173b}}}, + {X: Field{[10]uint32{0x03fce9e9, 0x011d95dd, 0x03c763d5, 0x033d6e87, 0x0107d04c, 0x016634be, 0x02781ba8, 0x00ec858d, 0x02be315d, 0x00143c79}}, Y: Field{[10]uint32{0x026b0b00, 0x017ec3bb, 0x00db7d09, 0x03851f80, 0x0325dd0c, 0x03725887, 0x00249759, 0x02e7ca33, 0x03d62057, 0x003df72d}}}, + {X: Field{[10]uint32{0x0263501c, 0x03ff3402, 0x006d03b7, 0x03cc16f5, 0x02944df1, 0x01d23527, 0x00efa037, 0x0156b404, 0x02446766, 0x001fb428}}, Y: Field{[10]uint32{0x01c18c21, 0x00343c01, 0x028d8269, 0x0196981d, 0x01e9b3ae, 0x00dab91d, 0x02eb2669, 0x0089ed11, 0x0265593f, 0x002a0dde}}}, + {X: Field{[10]uint32{0x03ebccc7, 0x03d18c93, 0x03342c29, 0x00eec7cd, 0x0219b29d, 0x03fc6f4b, 0x01c431dc, 0x030b3d84, 0x00a1ee66, 0x000340e7}}, Y: Field{[10]uint32{0x016d736f, 0x00c4139a, 0x0076e781, 0x03845699, 0x006e652e, 0x033f7321, 0x01ff5e24, 0x0319858a, 0x018214f4, 0x0036c343}}}, + {X: Field{[10]uint32{0x03b092b7, 0x03b60429, 0x015797be, 0x0272ab58, 0x028e3672, 0x01335283, 0x031768d9, 0x03f8bd14, 0x033acc55, 0x000309e5}}, Y: Field{[10]uint32{0x01f41c99, 0x005e8500, 0x020db439, 0x03c7fdd4, 0x000878e1, 0x02e78cc5, 0x02d54029, 0x02c91b15, 0x00eab36a, 0x003370c4}}}, + {X: Field{[10]uint32{0x0046e945, 0x0030cf19, 0x01d846de, 0x02000e8b, 0x01ac14a1, 0x03880b45, 0x0072e48d, 0x031a0c95, 0x0142cce3, 0x000da10a}}, Y: Field{[10]uint32{0x03b8f2f7, 0x000ee581, 0x02bcb574, 0x03e8376b, 0x03208d95, 0x03b55826, 0x009db9ae, 0x020be8d6, 0x03f819ab, 0x0014002c}}}, + {X: Field{[10]uint32{0x0162d0e9, 0x01552b9b, 0x03d7b0c4, 0x03de1783, 0x0074865e, 0x016aed15, 0x03f3a8c5, 0x0086d467, 0x015c3386, 0x00346a86}}, Y: Field{[10]uint32{0x03b737a8, 0x019c9469, 0x03c88c2e, 0x01cea6a2, 0x00832ce7, 0x0221018c, 0x0234576d, 0x00e166d1, 0x0133dc29, 0x0039f877}}}, + {X: Field{[10]uint32{0x000f00f0, 0x03c99fd7, 0x008b0489, 0x00aa3340, 0x03a59b2c, 0x01d9bb04, 0x02bd6ff5, 0x00e7b0d9, 0x01326074, 0x0013d08f}}, Y: Field{[10]uint32{0x00e7a9f4, 0x0075e1e9, 0x034eef5e, 0x016012d3, 0x00b6c3e0, 0x01cb2223, 0x008e6aa2, 0x01305701, 0x029d7ee9, 0x00178f1f}}}, + {X: Field{[10]uint32{0x03f06c4a, 0x006ee641, 0x018c5910, 0x03eabdce, 0x00ebcb9a, 0x02d7ea6e, 0x000859a9, 0x0247bc5f, 0x0280ff89, 0x001aec71}}, Y: Field{[10]uint32{0x0269a253, 0x03fcf261, 0x0039f189, 0x03f54d6e, 0x03217005, 0x01d85717, 0x03c242c9, 0x00ab9745, 0x03750d91, 0x000c6369}}}, + {X: Field{[10]uint32{0x00096f68, 0x00b426b0, 0x03b8bd0f, 0x008cc0c0, 0x02bc3934, 0x03efb8b9, 0x00b251c9, 0x0291a97f, 0x01d44713, 0x00005025}}, Y: Field{[10]uint32{0x0204a2b1, 0x032caeb9, 0x0159322d, 0x03ec2dfd, 0x001c7aa4, 0x0219f1ff, 0x01e632f6, 0x02cdd256, 0x000b3660, 0x00191f80}}}, + {X: Field{[10]uint32{0x035e5323, 0x0184ec12, 0x03b838b2, 0x0068e3a7, 0x02894319, 0x03021e1d, 0x00f831f6, 0x0271b92a, 0x03f0346e, 0x0004844a}}, Y: Field{[10]uint32{0x0257a3d0, 0x010a61a5, 0x0210e30a, 0x0196273f, 0x01faf640, 0x03b936ae, 0x03abf62a, 0x00cf6530, 0x02c2cb45, 0x00390526}}}, + {X: Field{[10]uint32{0x03ca5738, 0x0170dc22, 0x0329b4f7, 0x029e1165, 0x014f2197, 0x02bad67f, 0x00974ebe, 0x01204360, 0x00ccc2ed, 0x003e64d8}}, Y: Field{[10]uint32{0x026f1cb3, 0x020ea4bb, 0x020dbc0c, 0x00524d40, 0x03a06e44, 0x03865c76, 0x001b9f86, 0x01ea2b0b, 0x035e86d7, 0x002e4a8b}}}, + {X: Field{[10]uint32{0x02809ca4, 0x013a01ba, 0x00567a65, 0x02712522, 0x0264ae77, 0x0394fd47, 0x032112bb, 0x00fb3121, 0x024ec81a, 0x000b7b96}}, Y: Field{[10]uint32{0x033d4954, 0x00786931, 0x033b1bcb, 0x018e4d3f, 0x02bdea4d, 0x03f3c983, 0x02a1bcff, 0x011f0702, 0x00a1df6d, 0x00078baa}}}, + {X: Field{[10]uint32{0x01461229, 0x020b1ec3, 0x006a5f23, 0x0346ef5d, 0x00b73688, 0x00371404, 0x01638f7b, 0x03ade3d2, 0x02a2139e, 0x00016ea9}}, Y: Field{[10]uint32{0x01dca81d, 0x00756549, 0x00693cc0, 0x02a58055, 0x03b08a0c, 0x03909427, 0x02a75cd9, 0x014bc67c, 0x038310a3, 0x001c99dc}}}, + {X: Field{[10]uint32{0x02913d70, 0x015a2ea0, 0x0183c8f8, 0x00b365ba, 0x02f60d10, 0x004c6791, 0x034a6f3b, 0x01135add, 0x02b9321d, 0x0028fddf}}, Y: Field{[10]uint32{0x00613a05, 0x033ae397, 0x00077d3f, 0x0195dd1c, 0x00f6db17, 0x01afb074, 0x02386302, 0x039c3c6a, 0x01df8271, 0x003e4f5d}}}, + {X: Field{[10]uint32{0x03f2cf08, 0x02421371, 0x017db72f, 0x019baefa, 0x008588d7, 0x022ba7ce, 0x00fd62d6, 0x0249d0de, 0x02b5fa1f, 0x0011ae99}}, Y: Field{[10]uint32{0x038897f9, 0x02d77648, 0x0385b72d, 0x038bb3c1, 0x01f44bf7, 0x00ab5415, 0x01f9b555, 0x02e37e4b, 0x02243078, 0x000151cf}}}, + {X: Field{[10]uint32{0x0280dbf2, 0x034873b3, 0x02af4291, 0x01732865, 0x000bccb1, 0x01547eb4, 0x03415b6f, 0x000982ca, 0x0246ddcf, 0x0036da80}}, Y: Field{[10]uint32{0x00591d3c, 0x01645fca, 0x01c7ea98, 0x01bf9d78, 0x025f8885, 0x00f34259, 0x02c6f6f6, 0x00725e95, 0x0046f93e, 0x000e5b35}}}, + {X: Field{[10]uint32{0x026c8fa1, 0x00720d1b, 0x02e8c5cc, 0x02e19a64, 0x0338187e, 0x036e86c2, 0x012c4e58, 0x026368e6, 0x011ca7a2, 0x002e0be3}}, Y: Field{[10]uint32{0x01483461, 0x02d80d80, 0x03ee028e, 0x02254cf8, 0x02b1b805, 0x02dd9f1a, 0x00fdbddd, 0x0104f235, 0x036af9b0, 0x0012c2b9}}}, + {X: Field{[10]uint32{0x0085f000, 0x003c0631, 0x014a182e, 0x035edffe, 0x01d106fd, 0x02984a18, 0x00c6348a, 0x0192bfa7, 0x02a4dc92, 0x00111ba5}}, Y: Field{[10]uint32{0x01568440, 0x00cf7c26, 0x02507c8e, 0x0032984a, 0x012771c4, 0x033d9def, 0x0223b7ec, 0x00e9607f, 0x03d92159, 0x000cb7f8}}}, + {X: Field{[10]uint32{0x003a2eb9, 0x02874e4c, 0x01fb81ad, 0x01b3616f, 0x025c8a3e, 0x01941277, 0x0300ca34, 0x01b732e7, 0x03107bfa, 0x0000321b}}, Y: Field{[10]uint32{0x0034219d, 0x02b92b9f, 0x03ed888b, 0x01f92aa9, 0x019dcb27, 0x00c8d1d3, 0x0218c6a7, 0x0020502b, 0x00667e91, 0x003993dc}}}, + {X: Field{[10]uint32{0x036cd710, 0x017d6eb6, 0x01cdb83e, 0x02acc0a9, 0x009201c2, 0x000af9ee, 0x00d94cc2, 0x010a6793, 0x036ecda1, 0x002fb63a}}, Y: Field{[10]uint32{0x01411aac, 0x01226957, 0x01256708, 0x00f08250, 0x0116a1f0, 0x01a49d1b, 0x0367b9f6, 0x02903174, 0x00fab375, 0x00055cdb}}}, + {X: Field{[10]uint32{0x0364d38f, 0x0249b823, 0x02881da1, 0x014b7a0a, 0x00665e0a, 0x035d6520, 0x03171b5a, 0x02b44107, 0x03f2c5f6, 0x002cfbe9}}, Y: Field{[10]uint32{0x031677e6, 0x017eb23f, 0x013ffc53, 0x01840fed, 0x00b6dbd3, 0x03a6380d, 0x02b0dfaa, 0x00689003, 0x00843276, 0x000f7d8f}}}, + {X: Field{[10]uint32{0x0315cbd2, 0x03149749, 0x02921ebd, 0x0305947b, 0x018fa9af, 0x027850f8, 0x01213a84, 0x026d7c8d, 0x01a0cd86, 0x002c1183}}, Y: Field{[10]uint32{0x006fd7ee, 0x02ec486e, 0x00eee865, 0x017b3d8c, 0x0146b472, 0x02d5eca6, 0x033b4c02, 0x0061df39, 0x02adf354, 0x0030468f}}}, + {X: Field{[10]uint32{0x033bc071, 0x03b0f3b5, 0x0152a49c, 0x014e9f43, 0x00b49692, 0x00b58035, 0x00191871, 0x014afacb, 0x0117a174, 0x000a2c25}}, Y: Field{[10]uint32{0x0120a326, 0x01e90f7a, 0x01ae7fce, 0x0341a437, 0x0040ffd6, 0x0102bd65, 0x01635180, 0x01d64444, 0x0308073c, 0x000d9a59}}}, + {X: Field{[10]uint32{0x03b5f136, 0x02946c3e, 0x037536b1, 0x03f11c55, 0x020ad86a, 0x002fc5fe, 0x02e76b7c, 0x032d601e, 0x00d8192a, 0x001486fb}}, Y: Field{[10]uint32{0x01ac858d, 0x01ffa0dd, 0x026691dc, 0x003bb7cc, 0x02ee0671, 0x015145a0, 0x00f399e1, 0x03c4fb33, 0x00c6d7af, 0x00192295}}}, + {X: Field{[10]uint32{0x01f6cf67, 0x02dd87de, 0x01082368, 0x029ddb4e, 0x02a2a200, 0x0161f613, 0x009bca1b, 0x0275949b, 0x01d0b7fd, 0x002def06}}, Y: Field{[10]uint32{0x0370acae, 0x025ba347, 0x023ad2f7, 0x03fbfeff, 0x024a1e9f, 0x01cc58ed, 0x012c29a7, 0x03233d09, 0x02bee0d0, 0x0016b7be}}}, + {X: Field{[10]uint32{0x017aea8b, 0x00c7c34e, 0x03114dc9, 0x01b704f9, 0x0066db7b, 0x0055633b, 0x030c2412, 0x02a35507, 0x03e51b6c, 0x0039238e}}, Y: Field{[10]uint32{0x020f28ac, 0x01079f83, 0x004314bf, 0x00fbe7dd, 0x01f6cb3a, 0x03c4ad19, 0x03064bff, 0x038bc4c3, 0x03575b16, 0x0036f3d8}}}, + {X: Field{[10]uint32{0x03455751, 0x03d0a427, 0x028909b2, 0x02d65d67, 0x014ec795, 0x038a3ca9, 0x02475968, 0x024a9a8c, 0x02de71c6, 0x0000e571}}, Y: Field{[10]uint32{0x0269a13d, 0x030b2169, 0x003c3fcf, 0x0391266f, 0x03b5b097, 0x02b28557, 0x02ed4e15, 0x03768b07, 0x011803c7, 0x003b9780}}}, + {X: Field{[10]uint32{0x02808d99, 0x01814af2, 0x009a81a6, 0x02aa293a, 0x02663da3, 0x0303fb0d, 0x03412919, 0x010e6489, 0x02c3b118, 0x000a24e2}}, Y: Field{[10]uint32{0x03174603, 0x002e6193, 0x025f8031, 0x0256e87a, 0x00da1682, 0x0032e684, 0x03eadb18, 0x0306fa8a, 0x027ab1eb, 0x0012ba37}}}, + {X: Field{[10]uint32{0x0248f5a4, 0x00fb9ad4, 0x036f5852, 0x013f428d, 0x03be3af6, 0x0389fa14, 0x01472f23, 0x0233d881, 0x021895e8, 0x0001703d}}, Y: Field{[10]uint32{0x004be51b, 0x02c70f79, 0x02624b41, 0x0360d107, 0x038473e3, 0x03f6d43e, 0x03634569, 0x03aecedc, 0x0055cd09, 0x002f970f}}}, + {X: Field{[10]uint32{0x023ca1d7, 0x01536b17, 0x02ec0015, 0x004c7ae8, 0x02ae2e8f, 0x01fb416e, 0x028e125f, 0x03dccfb4, 0x03bf22d0, 0x002af87d}}, Y: Field{[10]uint32{0x02b0ab4e, 0x02a8b106, 0x02ffc918, 0x02d656ba, 0x03e553e6, 0x0265b2cc, 0x008ffe4b, 0x007daa5c, 0x00db3de3, 0x000a9692}}}, + {X: Field{[10]uint32{0x008d8be7, 0x03f4a738, 0x02349bcc, 0x03b110a9, 0x015f1dbe, 0x0298244a, 0x0124907e, 0x01c2cde4, 0x002757d3, 0x0030c109}}, Y: Field{[10]uint32{0x01868934, 0x01d73a6c, 0x031448bb, 0x0304a7a3, 0x01528959, 0x02326047, 0x01b35e2f, 0x0369d54d, 0x02b33e0f, 0x0019e993}}}, + {X: Field{[10]uint32{0x0140f5b8, 0x014cbf8c, 0x01c21c81, 0x0119abd0, 0x03031527, 0x038690fd, 0x02f0b6a9, 0x008675de, 0x0146356f, 0x00196966}}, Y: Field{[10]uint32{0x00f35918, 0x00e9871d, 0x0241f246, 0x0164f611, 0x001692b0, 0x001c3688, 0x00cf27fc, 0x013e8146, 0x028d5d3e, 0x001939c4}}}, + {X: Field{[10]uint32{0x001413e2, 0x03ad4fc5, 0x0219ede2, 0x02df536b, 0x0060311c, 0x02e67684, 0x03066f2b, 0x02321d1a, 0x023b4842, 0x001b1f4b}}, Y: Field{[10]uint32{0x00b7e3a1, 0x0192f2db, 0x007ab2a6, 0x03f8a3df, 0x03286292, 0x03b5ece0, 0x022864d1, 0x0319c137, 0x03bfc2e7, 0x00012e91}}}, + {X: Field{[10]uint32{0x03fdcdd9, 0x033d63a4, 0x019cf44a, 0x01fe914e, 0x03565579, 0x0324ffd5, 0x03798a9b, 0x02270ad1, 0x03bdb99c, 0x00037495}}, Y: Field{[10]uint32{0x01b3e4af, 0x00ab8db0, 0x020cc1af, 0x02058e43, 0x03e8194f, 0x010a2440, 0x027e0d71, 0x01fc954b, 0x00f2a920, 0x003e359c}}}, + {X: Field{[10]uint32{0x00c23d7b, 0x02ad79bb, 0x0263eb2a, 0x01f2c23c, 0x026827b8, 0x03351f18, 0x0152b8fa, 0x0310910a, 0x034eb8dd, 0x00094580}}, Y: Field{[10]uint32{0x0216ac9e, 0x031d6858, 0x02826433, 0x00d12d21, 0x00bd2ab5, 0x01cc774c, 0x03545bca, 0x03a81eb4, 0x0079f5fe, 0x002b63a2}}}, + {X: Field{[10]uint32{0x0134246d, 0x037382b6, 0x0180b907, 0x00559646, 0x017f0752, 0x00847b70, 0x01834b38, 0x02478ec6, 0x005427b5, 0x001f9c8c}}, Y: Field{[10]uint32{0x0263a71f, 0x020051d3, 0x034e33b0, 0x03a38c91, 0x032506be, 0x00261d82, 0x01671df1, 0x02129bc8, 0x00bbd8c1, 0x0017247f}}}, + {X: Field{[10]uint32{0x01d1898b, 0x0174e65b, 0x0333e72b, 0x01ffbe77, 0x038d4fb5, 0x0169bdae, 0x03876914, 0x0034a812, 0x0116ac3c, 0x0006c7e7}}, Y: Field{[10]uint32{0x035b4b1b, 0x034299fc, 0x01bd1024, 0x014e5146, 0x0215e944, 0x01890696, 0x00a399e1, 0x039142c5, 0x031e05ff, 0x001910af}}}, + {X: Field{[10]uint32{0x00872f2b, 0x001b18ff, 0x01a23e90, 0x01364f14, 0x0265b514, 0x02598c71, 0x039f6715, 0x03a90e8e, 0x024e57cd, 0x00383c7e}}, Y: Field{[10]uint32{0x0332e564, 0x02705dab, 0x018640a4, 0x037b349f, 0x0374f9a3, 0x00547751, 0x02056170, 0x003450bd, 0x01fb5489, 0x00320e14}}}, + {X: Field{[10]uint32{0x02728c3a, 0x0284bacc, 0x03d0b3e9, 0x009e675e, 0x0040efa0, 0x00a8281e, 0x01a3667b, 0x02082894, 0x03bb697c, 0x0002ba56}}, Y: Field{[10]uint32{0x03aebb41, 0x016c521a, 0x03f10e68, 0x0371ee00, 0x011140e0, 0x016b9427, 0x02a4da94, 0x0025b61b, 0x02970280, 0x003836ee}}}, + {X: Field{[10]uint32{0x002aed31, 0x00d01d9a, 0x01b3069e, 0x02b9b9fc, 0x030afad1, 0x014ffe30, 0x02529ea8, 0x03d0b07f, 0x0085d52e, 0x003f23fe}}, Y: Field{[10]uint32{0x01e3dd14, 0x0382992c, 0x00850433, 0x01c50cab, 0x0209cced, 0x00d5b406, 0x0104f1b3, 0x023d89ee, 0x02d4b26e, 0x001497b3}}}, + {X: Field{[10]uint32{0x02c8e810, 0x0272accc, 0x02546c62, 0x00f04d94, 0x00ed68d6, 0x02a59683, 0x01b57533, 0x01896835, 0x036a459d, 0x001984c4}}, Y: Field{[10]uint32{0x015b65cb, 0x02614ed9, 0x0069b93a, 0x00050049, 0x0228b4cb, 0x02c5a2f4, 0x01732b43, 0x002a52cf, 0x03f824d3, 0x00043ca7}}}, + {X: Field{[10]uint32{0x01ea56f0, 0x03d68df7, 0x01b91f24, 0x0107daf8, 0x0319dda8, 0x01bbced8, 0x02309b39, 0x00cc9f1d, 0x01157b68, 0x00114216}}, Y: Field{[10]uint32{0x01956821, 0x01d953e4, 0x02a12bbc, 0x02fed2c6, 0x032b6ebb, 0x0023569a, 0x0155e34f, 0x022391a8, 0x0046584a, 0x002e69c5}}}, + {X: Field{[10]uint32{0x008a4325, 0x00bcfddf, 0x0064f0e3, 0x013089d1, 0x01be58af, 0x035785c4, 0x0382576c, 0x02e8377a, 0x03bd8f10, 0x0005a3b8}}, Y: Field{[10]uint32{0x0278b34c, 0x01d08099, 0x0388668b, 0x02116082, 0x00465fb1, 0x020be1c0, 0x016891c9, 0x01027ea4, 0x026343ff, 0x001bbbc7}}}, + {X: Field{[10]uint32{0x03048c04, 0x0009c53b, 0x0131b718, 0x013181de, 0x00fdd86b, 0x02c800f9, 0x034db8de, 0x008d053a, 0x0197763c, 0x002cc647}}, Y: Field{[10]uint32{0x02152edd, 0x016a0f30, 0x00a04f88, 0x0358ddc4, 0x03ce6860, 0x03af7570, 0x03d53d83, 0x01d72af9, 0x008559f9, 0x002d2b0c}}}, + {X: Field{[10]uint32{0x022f8738, 0x0280898e, 0x0096a51e, 0x03f3c804, 0x033ec477, 0x03a4fd2e, 0x032acca1, 0x03724cf1, 0x005b4e73, 0x0036a757}}, Y: Field{[10]uint32{0x0012f8aa, 0x02cc826a, 0x015b50b4, 0x03422c28, 0x01400c05, 0x018d9944, 0x01b93b0d, 0x019b0da2, 0x02da65f9, 0x001feda8}}}, + {X: Field{[10]uint32{0x00b0dd66, 0x0196f339, 0x0215c01e, 0x02825538, 0x008d1cfa, 0x0314991c, 0x011730f0, 0x0159e05e, 0x01d2a7e7, 0x00050395}}, Y: Field{[10]uint32{0x0153d5b3, 0x00165042, 0x0118bce8, 0x0397225e, 0x0087e2d5, 0x03bcd8c6, 0x02470d81, 0x00965e47, 0x00d863ea, 0x0012fee8}}}, + {X: Field{[10]uint32{0x02b173d8, 0x00e67ac5, 0x00a1cf3f, 0x03e198d1, 0x03b438f7, 0x03f8f62f, 0x029bd01b, 0x03321f3b, 0x00f64b95, 0x00056a73}}, Y: Field{[10]uint32{0x03b33f3b, 0x018f2366, 0x03f90e03, 0x0269b946, 0x035d0ba5, 0x002cc6a4, 0x01e51fbf, 0x03b49581, 0x02cdbdeb, 0x0013d51c}}}, + {X: Field{[10]uint32{0x00af6e06, 0x032a8f62, 0x0088f814, 0x0244b42a, 0x00c7ed5e, 0x02b4606f, 0x033d3d8f, 0x01c076de, 0x024b6776, 0x003a1b8d}}, Y: Field{[10]uint32{0x01ea7b92, 0x0130d5d3, 0x00915f83, 0x03452989, 0x0124a466, 0x018a1a62, 0x0195518c, 0x001034fa, 0x00600afc, 0x00008bf5}}}, + {X: Field{[10]uint32{0x02500eb6, 0x020beb96, 0x03ddbfc2, 0x00ea9b56, 0x03b1f81d, 0x008faf39, 0x021134c7, 0x03c36c8c, 0x0298cd25, 0x000f0986}}, Y: Field{[10]uint32{0x03abd9c1, 0x00d7f15d, 0x02cbc455, 0x001b7abb, 0x004027a5, 0x0325a99b, 0x00b6ed7e, 0x02084629, 0x01455e49, 0x000ae348}}}, + {X: Field{[10]uint32{0x00c955c8, 0x0151bb7d, 0x0300bd66, 0x017408e0, 0x00368c3b, 0x01deab3f, 0x03b1f6c1, 0x02d45db2, 0x00114d55, 0x00126daa}}, Y: Field{[10]uint32{0x03815b94, 0x00d60e28, 0x01bca5b5, 0x0044e475, 0x020ab944, 0x03c6c2ca, 0x038e0017, 0x039f041a, 0x00a409f0, 0x00346c49}}}, + {X: Field{[10]uint32{0x0125f6b9, 0x02a36b31, 0x03f71f34, 0x007fde90, 0x016cee80, 0x003312e0, 0x01deab62, 0x039694fe, 0x0061f0d3, 0x001bb23a}}, Y: Field{[10]uint32{0x02dcfd6a, 0x00006ae9, 0x02e27782, 0x01c718fe, 0x011e01a8, 0x02dad7ac, 0x009c4f7e, 0x02bef4cc, 0x005b68cc, 0x0010b815}}}, + {X: Field{[10]uint32{0x0195b9ac, 0x02262a91, 0x03e1ac08, 0x015d1903, 0x004b527e, 0x023c5369, 0x005a2e2a, 0x02973f4c, 0x034159ac, 0x001cd0ac}}, Y: Field{[10]uint32{0x03160124, 0x01748d14, 0x01ac121b, 0x0102b21b, 0x0127f64f, 0x03a984a0, 0x03969a84, 0x00bb88d8, 0x0302d244, 0x002d4984}}}, + {X: Field{[10]uint32{0x02686fa9, 0x034c2e56, 0x0054b687, 0x015e9827, 0x00b27477, 0x03c9a59f, 0x01cfc43d, 0x00d42d97, 0x00bd54ef, 0x00210acc}}, Y: Field{[10]uint32{0x0336ead6, 0x016b20fc, 0x0277b9cc, 0x01f1c79f, 0x037d594f, 0x01723795, 0x0331f63f, 0x00dae7b3, 0x02922caa, 0x0013fea7}}}, + {X: Field{[10]uint32{0x01f94862, 0x02381306, 0x02153999, 0x0028fa46, 0x037c13bb, 0x0255d5fb, 0x03fb60d4, 0x029f1ef0, 0x035dd589, 0x000b6e90}}, Y: Field{[10]uint32{0x028cc0a1, 0x03522257, 0x013ed55c, 0x0171f7e1, 0x00931d3e, 0x01dd7940, 0x038eca16, 0x00f2e748, 0x020ea4b2, 0x0031101c}}}, + {X: Field{[10]uint32{0x033bec02, 0x034f1171, 0x01c07998, 0x02f4f40d, 0x02bb284f, 0x0064e42f, 0x035a4578, 0x03396ca9, 0x01248f84, 0x002747a1}}, Y: Field{[10]uint32{0x00eb9ead, 0x0201d325, 0x03f40129, 0x033e126f, 0x036d62e8, 0x02a018fc, 0x038bbc84, 0x0332b08c, 0x024cc935, 0x0023903b}}}, + {X: Field{[10]uint32{0x00b441af, 0x0158b4b6, 0x01cf4e76, 0x008d8b89, 0x019a7f86, 0x005525d5, 0x03639121, 0x029d6f53, 0x02c5d1fb, 0x00349cd6}}, Y: Field{[10]uint32{0x01afc081, 0x023ecd9f, 0x0331da1d, 0x01b4727e, 0x01b4ade8, 0x02d4bcf9, 0x037cb0e5, 0x03cce5de, 0x003619f9, 0x0002f4ab}}}, + {X: Field{[10]uint32{0x00a3e11a, 0x00eb7fac, 0x017cdca6, 0x025b82a5, 0x01b27c2b, 0x015ca4e5, 0x01a68d31, 0x03fc4eb4, 0x0238f46c, 0x002c04c3}}, Y: Field{[10]uint32{0x006aa3c4, 0x01666803, 0x001b5535, 0x00590d9b, 0x02610f15, 0x02c45dda, 0x02ff8443, 0x0100721f, 0x017f4a61, 0x000f67da}}}, + {X: Field{[10]uint32{0x01ec76a7, 0x00b99a0d, 0x02caaed8, 0x01e0a650, 0x03f59faa, 0x02e277a2, 0x022d8f33, 0x01abe2d9, 0x022f1530, 0x00382a81}}, Y: Field{[10]uint32{0x015e6f2e, 0x01115fb0, 0x0218179a, 0x015097f1, 0x0334305b, 0x02b260e1, 0x01ffb8ac, 0x01cc1297, 0x00b56ea7, 0x00317d7c}}}, + {X: Field{[10]uint32{0x019432d5, 0x012f42c0, 0x004139f4, 0x021665eb, 0x002156d6, 0x03a61d7b, 0x03e15c4a, 0x03472461, 0x02c1a8e6, 0x003b4589}}, Y: Field{[10]uint32{0x01f0c35d, 0x01410a5c, 0x00d7e69d, 0x011b164e, 0x037f0fad, 0x039cdcfd, 0x035e531e, 0x0128fd08, 0x015b9dcb, 0x000f0362}}}, + {X: Field{[10]uint32{0x01c92833, 0x034bb413, 0x00be8431, 0x036e1b81, 0x00664744, 0x01325d3e, 0x0025aa67, 0x03f6be33, 0x00314e18, 0x0028b333}}, Y: Field{[10]uint32{0x0359d71c, 0x00e9d3f1, 0x038a846c, 0x02230190, 0x002e1b9c, 0x019cbd79, 0x00e55368, 0x01c7bb48, 0x0249d6d4, 0x002d9043}}}, + {X: Field{[10]uint32{0x0268bf27, 0x03d9d6fd, 0x0331fa35, 0x0018f552, 0x00b3b24e, 0x00b65aa2, 0x0319119b, 0x03d8b12b, 0x012fdb15, 0x0016ff06}}, Y: Field{[10]uint32{0x03d99051, 0x02786611, 0x0223b609, 0x01890087, 0x02dbe0dc, 0x03d8a8e2, 0x0031bb39, 0x03850241, 0x0374acb4, 0x00119dd0}}}, + {X: Field{[10]uint32{0x01227028, 0x02ad7c02, 0x0090e97d, 0x015621ab, 0x0161eb21, 0x01fbec02, 0x022e5539, 0x031010ca, 0x0289da73, 0x0019a10a}}, Y: Field{[10]uint32{0x01941de9, 0x00602448, 0x02f4e90b, 0x031a2726, 0x01da171b, 0x00405b36, 0x012dc9df, 0x02812223, 0x03c3511e, 0x000ea3a0}}}, + {X: Field{[10]uint32{0x01c516e8, 0x001d9af3, 0x002f7181, 0x0137564d, 0x03e3a4a8, 0x03ba2e4a, 0x01f89913, 0x017e6351, 0x01973ba9, 0x003b208c}}, Y: Field{[10]uint32{0x037206fe, 0x0097866a, 0x032aef1d, 0x01b6b265, 0x0177d547, 0x02a54ed7, 0x033bc882, 0x00fd3865, 0x0079f511, 0x0014cb4f}}}, + {X: Field{[10]uint32{0x02fc140b, 0x009467dc, 0x007ad1ac, 0x01b0caac, 0x03e8e8e2, 0x03cfb4e7, 0x015e5b65, 0x0185dabb, 0x0278bc51, 0x000ed97f}}, Y: Field{[10]uint32{0x00208d98, 0x03deb7e6, 0x02c1b9c9, 0x035cc533, 0x02566a1f, 0x019be577, 0x037f9764, 0x03ae704f, 0x02de5190, 0x00215b4d}}}, + {X: Field{[10]uint32{0x018cc346, 0x01880db4, 0x03945182, 0x02cc9c8a, 0x01f9f31e, 0x00ff7402, 0x02545ce8, 0x00d497a7, 0x02ca51c4, 0x0000eb03}}, Y: Field{[10]uint32{0x0213a7e6, 0x00c092a8, 0x01e509ab, 0x0322c4d3, 0x00325beb, 0x01038251, 0x004ef313, 0x02933cc9, 0x018bc3b2, 0x00371c80}}}, + {X: Field{[10]uint32{0x02e23508, 0x014e810b, 0x0172ffbe, 0x02e6ed42, 0x00bcdac8, 0x005f66f8, 0x012db7c2, 0x03b39bb7, 0x018d6c50, 0x00124a59}}, Y: Field{[10]uint32{0x02cec38a, 0x012f642a, 0x00c3a728, 0x03e35e84, 0x016dfc8d, 0x008ca1d0, 0x0155980a, 0x02ef52e1, 0x002c61aa, 0x00396b29}}}, + {X: Field{[10]uint32{0x013a6291, 0x002ad6c5, 0x022781d6, 0x02ad2469, 0x037830e2, 0x031b48a5, 0x029e7488, 0x01924bc3, 0x036f4bc9, 0x002745b9}}, Y: Field{[10]uint32{0x015ac7ab, 0x0099bb22, 0x01711da7, 0x0228113a, 0x015eaa98, 0x01dc2bbd, 0x00363189, 0x01a48815, 0x0300e4ac, 0x00399643}}}, + {X: Field{[10]uint32{0x035df94d, 0x026cae07, 0x0276d5e0, 0x01a89f01, 0x014e13b3, 0x03fe5eb7, 0x02a9bbe7, 0x039febd4, 0x004a1327, 0x002c1927}}, Y: Field{[10]uint32{0x0091acdd, 0x01570f0e, 0x02d120b3, 0x00206981, 0x02d79fdd, 0x01fdd6a2, 0x032a0807, 0x01a12381, 0x0316a6f3, 0x00264720}}}, + {X: Field{[10]uint32{0x0052235d, 0x0304af6c, 0x013c96b7, 0x03d817f8, 0x03eb39a8, 0x0129285a, 0x01ce51c4, 0x00f7b4b2, 0x0221f630, 0x0023c652}}, Y: Field{[10]uint32{0x0330739e, 0x015749a5, 0x030f1bd7, 0x00b3b7f9, 0x01c63517, 0x0268b721, 0x01afb23e, 0x020b8951, 0x03d0c9af, 0x002f477c}}}, + {X: Field{[10]uint32{0x03e21ff0, 0x021fc77b, 0x0262a60e, 0x00871b08, 0x033872b7, 0x03579996, 0x037f6c3d, 0x0133651d, 0x0297cc7a, 0x000769c6}}, Y: Field{[10]uint32{0x00be6a06, 0x03411a01, 0x026e87f0, 0x03a19a8f, 0x030a4d30, 0x009cebfa, 0x032b9af1, 0x01b869eb, 0x02413903, 0x001e345e}}}, + {X: Field{[10]uint32{0x0386aa45, 0x01ebcf37, 0x0290f7a3, 0x006ec604, 0x03e04e40, 0x0148a471, 0x02fabb1c, 0x03c98b4f, 0x0363e493, 0x00027fb4}}, Y: Field{[10]uint32{0x003de729, 0x03fe0d9c, 0x00d6cb3f, 0x00da437f, 0x0353a54f, 0x02972597, 0x01b18276, 0x02b7fefb, 0x033ee164, 0x0004c330}}}, + {X: Field{[10]uint32{0x03a1e49f, 0x01d6a1e9, 0x0298febb, 0x00eb079e, 0x007a601a, 0x032ed850, 0x01ebc38f, 0x00d5a066, 0x00cd221c, 0x003459bb}}, Y: Field{[10]uint32{0x0072f06e, 0x0257dda8, 0x003c9937, 0x01f33952, 0x00b0628c, 0x0152150d, 0x00ec5628, 0x0002f577, 0x02b7e7c2, 0x00098888}}}, + {X: Field{[10]uint32{0x01dbe0fd, 0x002482a3, 0x035cc293, 0x01b8e4d0, 0x02b998a5, 0x02528ba3, 0x03078392, 0x01c30730, 0x00bd3e37, 0x0039e14f}}, Y: Field{[10]uint32{0x000e5a8e, 0x00503da6, 0x0050b80a, 0x02c63e92, 0x00cff1e7, 0x0008f0ef, 0x01d29181, 0x01f31259, 0x02ca6714, 0x001e5df9}}}, + {X: Field{[10]uint32{0x0227a17f, 0x03d27158, 0x03511480, 0x039c108f, 0x0251036c, 0x02c687c0, 0x02a3cd56, 0x000804af, 0x02b1cb14, 0x002a2c3f}}, Y: Field{[10]uint32{0x01ba8a9f, 0x02773e9d, 0x037b527c, 0x02483225, 0x0367afe7, 0x00e00723, 0x00eedd6d, 0x02db6db3, 0x03db9d3a, 0x003335f0}}}, + {X: Field{[10]uint32{0x02d617d7, 0x0167db15, 0x02b26c90, 0x001aa11a, 0x006d02e4, 0x013d62e6, 0x02905797, 0x015d54c7, 0x01d9e181, 0x0015f397}}, Y: Field{[10]uint32{0x02142d14, 0x006b18ff, 0x01bc4e85, 0x03c97bf2, 0x01829f61, 0x02a3e6bb, 0x01598f8a, 0x03cc589a, 0x00904399, 0x00330d30}}}, + {X: Field{[10]uint32{0x00f9c858, 0x02e61bf4, 0x02f2d6c8, 0x031b2fc0, 0x008077b6, 0x0196acf9, 0x03bbc1d3, 0x03f1b6fb, 0x00b64f60, 0x0011e5e4}}, Y: Field{[10]uint32{0x007f2f9b, 0x022cd582, 0x03f435df, 0x006a57a6, 0x025cff91, 0x00f923e9, 0x025382ae, 0x00649774, 0x0182e358, 0x00055fd2}}}, + {X: Field{[10]uint32{0x03f17c68, 0x019421ff, 0x03b1ccb2, 0x0328f2cd, 0x008ee0a0, 0x004ef9db, 0x001b6228, 0x00290486, 0x007b1ffe, 0x000156af}}, Y: Field{[10]uint32{0x0171d99f, 0x03b7532a, 0x032d669b, 0x02fe0a0f, 0x01606272, 0x02877496, 0x039e6030, 0x01314d33, 0x024923e9, 0x002f44d0}}}, + {X: Field{[10]uint32{0x00d2e659, 0x019ce509, 0x011da1dc, 0x03807514, 0x02bd3156, 0x0397dc27, 0x004d4310, 0x0359eae0, 0x00328bf5, 0x001b29f8}}, Y: Field{[10]uint32{0x02ca2647, 0x008815d7, 0x01a69077, 0x03d1b4ac, 0x00d80aaa, 0x03e1c360, 0x011c2ff2, 0x00e42595, 0x0133f368, 0x00310a2c}}}, + {X: Field{[10]uint32{0x01f530d3, 0x0167a44b, 0x014dd999, 0x03ba706b, 0x02346ae4, 0x02ebea2c, 0x03d20baf, 0x0021b132, 0x01a983e9, 0x001837c6}}, Y: Field{[10]uint32{0x0379cc48, 0x022dec0e, 0x01e31d7a, 0x03e211c0, 0x01a09d60, 0x0393a393, 0x01c2f1e0, 0x005e8108, 0x005429f8, 0x0036b9ee}}}, + {X: Field{[10]uint32{0x03686bce, 0x009b5b74, 0x012c7e1d, 0x00141ae9, 0x035c22ff, 0x01668e11, 0x0180ea1c, 0x03cab6eb, 0x010e5ef5, 0x001bc635}}, Y: Field{[10]uint32{0x00d7d7a9, 0x00cdab7c, 0x038f513a, 0x01756d15, 0x00d3f340, 0x030de1b8, 0x00f5c83b, 0x03bf43eb, 0x020fa166, 0x003475fa}}}, + {X: Field{[10]uint32{0x03d949e0, 0x03a281cb, 0x01233b3b, 0x00399796, 0x01fcdfe0, 0x0377ba76, 0x009569a8, 0x004cd92b, 0x009d5ed5, 0x002d8d37}}, Y: Field{[10]uint32{0x0331db69, 0x01b40dba, 0x021a70e8, 0x01d9958a, 0x02fdf189, 0x0370d15b, 0x01a505cb, 0x0095d7c9, 0x02e2c61b, 0x0035cb91}}}, + {X: Field{[10]uint32{0x03445910, 0x0159bf65, 0x00f0e4fc, 0x020da7d7, 0x0340d919, 0x00f6f16a, 0x02461714, 0x0093cf99, 0x00f02dba, 0x00168dff}}, Y: Field{[10]uint32{0x01c69d1e, 0x010918dd, 0x00b59c33, 0x00f4a5d7, 0x0333e615, 0x00531e11, 0x02a95826, 0x01d1b198, 0x01d813f8, 0x002a5834}}}, + {X: Field{[10]uint32{0x0112661c, 0x00eb86fc, 0x029e11b8, 0x023c6aac, 0x01eeeb8f, 0x0065b63f, 0x00201b6b, 0x0200cb18, 0x02a73731, 0x0022abc5}}, Y: Field{[10]uint32{0x039a8e44, 0x02ead22a, 0x0215d611, 0x025661f1, 0x036d03a7, 0x0117cab9, 0x03cc0c28, 0x02929d58, 0x035666a3, 0x0031187b}}}, + {X: Field{[10]uint32{0x035e3434, 0x012e2bab, 0x0004d9cd, 0x024d0b0a, 0x011d85a6, 0x001ca711, 0x03e7f49e, 0x0057bf64, 0x03a5a05f, 0x00115bc2}}, Y: Field{[10]uint32{0x0311cad5, 0x01fb2c9c, 0x0135bb0f, 0x02f612e4, 0x0213f616, 0x00c10785, 0x006da131, 0x006a2dfd, 0x00a99922, 0x0029a03d}}}, + {X: Field{[10]uint32{0x00f5c741, 0x02cd32ce, 0x0170a9d0, 0x003e85e2, 0x014bfdc9, 0x00784b2e, 0x03146d93, 0x015025d7, 0x02a1f190, 0x003e270d}}, Y: Field{[10]uint32{0x0044099b, 0x0348dd67, 0x01646579, 0x0233ad28, 0x034b1df3, 0x0307fe8e, 0x01866159, 0x006e4a84, 0x008058e3, 0x000ed58b}}}, + {X: Field{[10]uint32{0x01f3f76a, 0x030940d0, 0x004289d2, 0x0398cbcc, 0x00e23876, 0x035a73ed, 0x00c49031, 0x02180036, 0x03112e1d, 0x001fdafa}}, Y: Field{[10]uint32{0x00ff4a9b, 0x03743b29, 0x02fb90cd, 0x035ba33d, 0x0008d98e, 0x00589ee6, 0x0194b9b5, 0x016bf2fa, 0x0007c092, 0x002864dd}}}, + {X: Field{[10]uint32{0x02d73511, 0x03718184, 0x000d3827, 0x010c653d, 0x011010f5, 0x03475400, 0x037130ba, 0x031f0de2, 0x00aab585, 0x002416b4}}, Y: Field{[10]uint32{0x037177a9, 0x02e00942, 0x018aab83, 0x007e8b82, 0x00a44782, 0x024745b5, 0x00130aee, 0x0334e054, 0x0301c3dd, 0x002ff381}}}, + {X: Field{[10]uint32{0x03408b6c, 0x0145487d, 0x032aef1d, 0x03d1d542, 0x01e54187, 0x02d80cf4, 0x001e7a30, 0x00bf29c8, 0x02d16212, 0x003d5670}}, Y: Field{[10]uint32{0x00154481, 0x0059eb4d, 0x017f25dc, 0x0108e33b, 0x037695ea, 0x00c4209c, 0x02f04dc4, 0x03ac51fd, 0x0222dfd0, 0x000fc435}}}, + {X: Field{[10]uint32{0x018ce8b4, 0x0364741c, 0x023456f4, 0x00330d85, 0x037c0d8a, 0x022fb7d4, 0x02e5830a, 0x00527332, 0x00a4fa17, 0x00066cca}}, Y: Field{[10]uint32{0x02582f64, 0x01134127, 0x00855126, 0x0024975a, 0x01fdff7f, 0x039e19de, 0x01258838, 0x01a48da6, 0x000a2a4e, 0x0026873a}}}, + {X: Field{[10]uint32{0x01ad5d4a, 0x024d922b, 0x03e533a3, 0x03d02487, 0x032743d4, 0x0069a82f, 0x00abc24c, 0x0066f3af, 0x00a0e756, 0x002beae6}}, Y: Field{[10]uint32{0x023a32db, 0x034e6fa4, 0x017157df, 0x038c4f5d, 0x007c8e5b, 0x007ca684, 0x0341c092, 0x00e695e5, 0x02877591, 0x002fc6ce}}}, + {X: Field{[10]uint32{0x024181c7, 0x0247f63b, 0x01085cca, 0x03ba05db, 0x01b2dfe0, 0x020ea3b2, 0x01b36d9c, 0x028d36b7, 0x037c1d86, 0x0030b2af}}, Y: Field{[10]uint32{0x0191070f, 0x0349ea93, 0x032acf51, 0x0143a725, 0x01159ab1, 0x03b3ae3d, 0x00465bd6, 0x00cd71c9, 0x032453f1, 0x0016ccad}}}, + {X: Field{[10]uint32{0x0289f593, 0x035b3f0a, 0x02be4f5a, 0x03e8b068, 0x024f6e9c, 0x03050d57, 0x028c5347, 0x01d148a6, 0x00248e84, 0x0024a0e5}}, Y: Field{[10]uint32{0x008c3a07, 0x02285c5f, 0x02996c88, 0x0057594b, 0x0051983b, 0x011bebda, 0x00a7b4a1, 0x03b81a67, 0x005dfd41, 0x002ee716}}}, + {X: Field{[10]uint32{0x033c7dfa, 0x030c3431, 0x03b4aa8d, 0x004b4327, 0x0155e55f, 0x005ef5eb, 0x00cba646, 0x03c61082, 0x013c389e, 0x002f28a1}}, Y: Field{[10]uint32{0x01df63a2, 0x02235e78, 0x01340175, 0x00b80799, 0x02fe9a14, 0x01a98bee, 0x005952b1, 0x03b7b4f5, 0x009ef32a, 0x0027d04a}}}, + {X: Field{[10]uint32{0x01bf56fd, 0x013ca05c, 0x037e4a0e, 0x02f4df29, 0x015745b7, 0x03399cb1, 0x0353aea5, 0x0196a3af, 0x03da94b5, 0x00293a9e}}, Y: Field{[10]uint32{0x013e96bc, 0x03339aa2, 0x00fb0970, 0x00c4deec, 0x02629eef, 0x00b1654f, 0x01e1a284, 0x03aa426e, 0x00851405, 0x0032541d}}}, + {X: Field{[10]uint32{0x00d5e169, 0x0139e318, 0x03b1ff75, 0x022a149e, 0x03da57c1, 0x02268900, 0x0327ced0, 0x004e7b5c, 0x0145af71, 0x001c5c1f}}, Y: Field{[10]uint32{0x00223ef9, 0x037a75c4, 0x0185f1b9, 0x00e7f4f1, 0x013eef0f, 0x01691df7, 0x034e4a85, 0x029bce8f, 0x0084fe4d, 0x00092cd9}}}, + {X: Field{[10]uint32{0x03df9a05, 0x029c1b93, 0x028c07dd, 0x03db5cc8, 0x015b1f5f, 0x01ae3fd4, 0x01cf4d23, 0x03d64675, 0x02030296, 0x0014b077}}, Y: Field{[10]uint32{0x02344d0e, 0x0074d356, 0x03c5135d, 0x00524181, 0x01c95097, 0x0368ede1, 0x00066e4f, 0x0355d0e1, 0x01590d73, 0x0036e563}}}, + {X: Field{[10]uint32{0x0368912f, 0x007a9888, 0x03120d8b, 0x001f7e09, 0x0374dc20, 0x02f32ee1, 0x0291989c, 0x03a114c1, 0x00b07852, 0x001ec270}}, Y: Field{[10]uint32{0x002bd263, 0x0027a13e, 0x01f3be9c, 0x01736a5e, 0x0109545a, 0x01e0ae93, 0x02ebeeb0, 0x00a05f43, 0x0317ffc5, 0x0013b7d5}}}, + {X: Field{[10]uint32{0x03b8300a, 0x031a277f, 0x02540681, 0x01899acc, 0x03f26e70, 0x038ecf00, 0x00088343, 0x0346a0af, 0x00ceb29a, 0x003a661c}}, Y: Field{[10]uint32{0x01597f9f, 0x01e16a33, 0x00fadc6f, 0x00f6448c, 0x008ff75e, 0x005345ea, 0x0012dbc6, 0x01f596f3, 0x01927894, 0x0020202b}}}, + {X: Field{[10]uint32{0x005c38e7, 0x00e90d08, 0x02444adc, 0x02f4ae44, 0x022dd2c2, 0x00f5317b, 0x01b4cb9c, 0x0204e617, 0x026de28b, 0x0031f88c}}, Y: Field{[10]uint32{0x02ad940e, 0x02fd7871, 0x0099d195, 0x023150f6, 0x01d31adf, 0x005df3c1, 0x0387000e, 0x0332547e, 0x03f9cdc0, 0x0017ca18}}}, + {X: Field{[10]uint32{0x023f7965, 0x026d574f, 0x02244119, 0x01ad7a94, 0x014c6bb6, 0x023ee922, 0x0186bfd2, 0x02f5e0f1, 0x02c84ca7, 0x00220d65}}, Y: Field{[10]uint32{0x00e9282e, 0x01af3896, 0x03ac6940, 0x016da3b3, 0x0147a22f, 0x00a516b2, 0x02d6d4a7, 0x017c4325, 0x03e85925, 0x003ec452}}}, + {X: Field{[10]uint32{0x020b42cc, 0x03adf8fc, 0x02dcf7ff, 0x0165794c, 0x035cf616, 0x01f95b9f, 0x03029dd3, 0x0103d6c3, 0x0248a196, 0x001fdce9}}, Y: Field{[10]uint32{0x00ff4feb, 0x013fea20, 0x0107f4a9, 0x006e7565, 0x0108ef19, 0x028ed09b, 0x022df3eb, 0x02bb7ed3, 0x008af931, 0x0013dd89}}}, + {X: Field{[10]uint32{0x0341aa3d, 0x030e0aa5, 0x015bddb9, 0x026a291e, 0x0218c873, 0x00465a99, 0x03b56040, 0x0340eb38, 0x034a3660, 0x003227b8}}, Y: Field{[10]uint32{0x02923884, 0x0346e544, 0x02084684, 0x0192e677, 0x03068387, 0x003bca4b, 0x0379ac9d, 0x02b15fcb, 0x008835fb, 0x002928ee}}}, + {X: Field{[10]uint32{0x0141d5bc, 0x0313b4f6, 0x023fd566, 0x02250c15, 0x01b5c468, 0x007607c6, 0x0050cf43, 0x00313940, 0x0056d7dc, 0x00092f93}}, Y: Field{[10]uint32{0x029e6213, 0x0268217c, 0x001cbac0, 0x031e95bf, 0x010f6a5f, 0x03c6b5da, 0x00714a2a, 0x00c5757c, 0x02e24936, 0x00381c8d}}}, + {X: Field{[10]uint32{0x000b94f5, 0x02e614f9, 0x02852c4e, 0x00749a4d, 0x022866a9, 0x008dea7c, 0x00ee5c53, 0x007001e6, 0x031ecaa9, 0x001b0c79}}, Y: Field{[10]uint32{0x00cf8cd7, 0x00f0e167, 0x03922572, 0x0365203d, 0x0134543c, 0x00c2e53a, 0x0117e0ac, 0x00b34704, 0x03232b5f, 0x00196bfc}}}, + {X: Field{[10]uint32{0x0258b7e7, 0x0007b5e3, 0x02286926, 0x01d34c7e, 0x03e470a5, 0x02d860e7, 0x003c0229, 0x01a4f4f8, 0x033c8479, 0x00141b0d}}, Y: Field{[10]uint32{0x01b7ab65, 0x00feb280, 0x023ca167, 0x01db83ff, 0x03e24f86, 0x001ffba0, 0x00bd4ae7, 0x0140d49a, 0x03d3a57c, 0x0013f42f}}}, + {X: Field{[10]uint32{0x018349a4, 0x0314ccb2, 0x01b45b48, 0x00247700, 0x0057571a, 0x01c7dcc7, 0x027b0978, 0x01b3185b, 0x01f3ea1a, 0x00167669}}, Y: Field{[10]uint32{0x01fc8447, 0x005b8355, 0x0363821c, 0x004c6a9a, 0x0153aadf, 0x029fb94e, 0x03c348f0, 0x025b0c98, 0x033eee64, 0x00252b4d}}}, + {X: Field{[10]uint32{0x02d75c69, 0x00e06cc8, 0x008d64de, 0x0274d991, 0x01c6f892, 0x01b399f5, 0x001912fa, 0x005923d9, 0x03ab6537, 0x00294933}}, Y: Field{[10]uint32{0x01782823, 0x028daa51, 0x0214471a, 0x01630fd1, 0x02ac1b61, 0x02f9f1e6, 0x026ae90b, 0x0356645e, 0x03f987fb, 0x0005309b}}}, + {X: Field{[10]uint32{0x0348c550, 0x03cb195f, 0x0276a92a, 0x03537c9b, 0x038aa3fd, 0x029ac8e4, 0x000d3ac6, 0x018c1e1f, 0x006df83c, 0x00049b26}}, Y: Field{[10]uint32{0x014c5c5c, 0x00595acf, 0x03d39774, 0x00757a6b, 0x003f74ab, 0x006b1cb8, 0x00f04dd3, 0x01be3cef, 0x01d3a56a, 0x0020214e}}}, + {X: Field{[10]uint32{0x00e39722, 0x0211d283, 0x01db7318, 0x035ee6a0, 0x00d8ff25, 0x03341554, 0x01a9d5b4, 0x033ec9f8, 0x03c01aeb, 0x000cb2ae}}, Y: Field{[10]uint32{0x03bccee9, 0x01bfac63, 0x035bb957, 0x0087eaa7, 0x02be1910, 0x03b9ad4a, 0x02c070f6, 0x00c71004, 0x020ae080, 0x001f4c04}}}, + {X: Field{[10]uint32{0x02f42c64, 0x03873e08, 0x025da359, 0x01905b70, 0x028a9f08, 0x0356992a, 0x00975aba, 0x035be2a6, 0x00baf7de, 0x000ff787}}, Y: Field{[10]uint32{0x035ac075, 0x00f2580b, 0x03f919ee, 0x02858373, 0x0044ffed, 0x024484b3, 0x0293cae6, 0x03c5d2c3, 0x00ac61f0, 0x0003943f}}}, + {X: Field{[10]uint32{0x01462e24, 0x024cb1c4, 0x0326b3ce, 0x00dc7b87, 0x0336e9db, 0x02c409c9, 0x013a08d6, 0x037ef007, 0x02cad6c3, 0x00272b48}}, Y: Field{[10]uint32{0x00461c6b, 0x0136e554, 0x015a6882, 0x00653967, 0x03422bb1, 0x02aaeed4, 0x00781cb0, 0x033411fc, 0x031d873d, 0x0016ba13}}}, + {X: Field{[10]uint32{0x015872ef, 0x014b465f, 0x0024e1c6, 0x027e4927, 0x010c20cf, 0x00706beb, 0x00ca18e9, 0x01d898ea, 0x0020aa80, 0x00026164}}, Y: Field{[10]uint32{0x03c73e69, 0x00152e34, 0x02dd6a3d, 0x03aecccb, 0x01a084e7, 0x03617e8e, 0x00976f72, 0x01f5b91c, 0x03fd21ab, 0x001150c8}}}, + {X: Field{[10]uint32{0x024eb2b6, 0x00c6e791, 0x033a9d8c, 0x014f112c, 0x00ac00bc, 0x02094a07, 0x03093b6c, 0x032f568a, 0x01a3e7cb, 0x002085a6}}, Y: Field{[10]uint32{0x02a9726a, 0x001cead9, 0x0384023b, 0x0146f39b, 0x03e62cf4, 0x02ef4fa7, 0x0344cbcb, 0x032e6dca, 0x00172400, 0x003df567}}}, + {X: Field{[10]uint32{0x00d370d9, 0x029fdb63, 0x02dad74e, 0x030ff0a1, 0x00440b3c, 0x031233ae, 0x01fc7a55, 0x00e189e5, 0x00be3642, 0x002f41b5}}, Y: Field{[10]uint32{0x0183b90e, 0x03354218, 0x017140ac, 0x014fef34, 0x0361bb12, 0x032ee023, 0x00a56632, 0x03b22329, 0x013a0fdc, 0x000ec246}}}, + {X: Field{[10]uint32{0x03bdf4d2, 0x010448d2, 0x038225bc, 0x013645df, 0x02bb4b73, 0x0010f1b2, 0x00a4ed0e, 0x031e37c1, 0x02e79c8c, 0x000b1c44}}, Y: Field{[10]uint32{0x00391243, 0x00fb108e, 0x01afd6e0, 0x03bd97fc, 0x02bae242, 0x02403d87, 0x012884ad, 0x008921d8, 0x03add42e, 0x00320733}}}, + {X: Field{[10]uint32{0x0122131e, 0x02deabf8, 0x03905762, 0x01bbc660, 0x03b7f523, 0x0377e73a, 0x03cbb8c9, 0x01dcb20c, 0x010fa65d, 0x00146b8e}}, Y: Field{[10]uint32{0x017ba06e, 0x01b86a3b, 0x02ec8125, 0x0387a13a, 0x000f1e96, 0x01f6edc5, 0x02f2a888, 0x01ac18a0, 0x03808040, 0x000f5f27}}}, + {X: Field{[10]uint32{0x02cc59ea, 0x0209b936, 0x027a177d, 0x01c9ae45, 0x02c74326, 0x00ecc4d5, 0x00b8348e, 0x01e90caf, 0x0112de23, 0x00316778}}, Y: Field{[10]uint32{0x01903b25, 0x0131a275, 0x012b0285, 0x000ea381, 0x00aa33e4, 0x017859db, 0x009c1d9c, 0x02d9b67c, 0x03167c5e, 0x000d8427}}}, + {X: Field{[10]uint32{0x0156d978, 0x000608fd, 0x030f757d, 0x039a4867, 0x02077ca1, 0x015d4c09, 0x01cb89a4, 0x02766c54, 0x023ab750, 0x0022e67c}}, Y: Field{[10]uint32{0x016a4164, 0x0380203d, 0x00e9adc8, 0x00be4132, 0x00d338e1, 0x02f355cf, 0x033cf0e4, 0x03f913d4, 0x02adf53a, 0x0021a8c6}}}, + {X: Field{[10]uint32{0x00369dd5, 0x0382ae5e, 0x0271739f, 0x01f277ba, 0x0261f5fb, 0x03bc620b, 0x024135a1, 0x02a6f67b, 0x03657d6f, 0x001319c3}}, Y: Field{[10]uint32{0x03e65417, 0x002de5fb, 0x01dd3c10, 0x00d46d4e, 0x01b54e04, 0x01fe2474, 0x0075dc10, 0x014d8c4a, 0x02265d4b, 0x0014c6a0}}}, + {X: Field{[10]uint32{0x00f38548, 0x0233b778, 0x0333d938, 0x037277c3, 0x0036aed9, 0x015fc190, 0x03024e6e, 0x003e57f5, 0x02359daa, 0x0023a59f}}, Y: Field{[10]uint32{0x010d218f, 0x0285d946, 0x00d2f1f1, 0x02c7c058, 0x0145fa0a, 0x028440e0, 0x008b833b, 0x03ea9632, 0x015ba59a, 0x000dbe01}}}, + {X: Field{[10]uint32{0x032ac9e1, 0x03a78cce, 0x03c3ec82, 0x01f0231e, 0x015e2e09, 0x03c33256, 0x007bfaac, 0x028df417, 0x01159c45, 0x000fd846}}, Y: Field{[10]uint32{0x0197d7d6, 0x00cb80b5, 0x014faf6c, 0x03b896dd, 0x03b9d2f3, 0x03bab694, 0x02087578, 0x01f7148f, 0x034ab743, 0x00032004}}}, + {X: Field{[10]uint32{0x007641d9, 0x0140033d, 0x007459f8, 0x020e1c1c, 0x0366bba6, 0x01faf7b7, 0x03b203ac, 0x0104ad4f, 0x009d7c61, 0x000fd679}}, Y: Field{[10]uint32{0x003ad5b0, 0x038958e9, 0x010f2ae3, 0x01e261b5, 0x0264cd09, 0x03d77353, 0x038f1010, 0x037f8f48, 0x00884243, 0x002fb75c}}}, + {X: Field{[10]uint32{0x03f6d490, 0x032be1d6, 0x02781bbb, 0x036865e8, 0x01ad46d4, 0x033c5c3a, 0x0044b5bf, 0x00da90ef, 0x00c9b648, 0x0016df61}}, Y: Field{[10]uint32{0x034d984f, 0x00ffb0ac, 0x0156a7c7, 0x016e64a0, 0x03f2164e, 0x001f7c12, 0x00b89755, 0x02c3ffeb, 0x029cc7d6, 0x0027d56c}}}, + {X: Field{[10]uint32{0x01744b1c, 0x030a7a94, 0x02a88962, 0x003681c6, 0x0390decf, 0x02bf0faa, 0x03bf1f9a, 0x03a0f3dc, 0x00ae0ac3, 0x00387b9d}}, Y: Field{[10]uint32{0x01277030, 0x0331423c, 0x0221650a, 0x016e0319, 0x01eefbe1, 0x020e60e7, 0x028d6748, 0x02149415, 0x02f8b34e, 0x0027a1b4}}}, + {X: Field{[10]uint32{0x03eea871, 0x03125ada, 0x0200e5dd, 0x02b2fbb8, 0x01eba721, 0x025b29fb, 0x0196c22e, 0x0251238c, 0x015b8d48, 0x003e8733}}, Y: Field{[10]uint32{0x039bc469, 0x0396154b, 0x01829d25, 0x012ff4aa, 0x02851350, 0x01e95b5f, 0x02479a8a, 0x01995275, 0x019a326a, 0x0038adfd}}}, + {X: Field{[10]uint32{0x03fdc8bf, 0x03c30e9e, 0x027a04c9, 0x01afde97, 0x00b29231, 0x02d298eb, 0x02199d1a, 0x0182587d, 0x00d70f38, 0x003bc787}}, Y: Field{[10]uint32{0x0298ef05, 0x014430ae, 0x00687eeb, 0x01dd5677, 0x025783d3, 0x0104794c, 0x015dadce, 0x0044760e, 0x0001a9de, 0x00133be7}}}, + {X: Field{[10]uint32{0x01326120, 0x0391a2b8, 0x02e8e9b3, 0x02565687, 0x020fe9c3, 0x01204f6c, 0x025cc4ed, 0x034eeb7e, 0x02b93e75, 0x0036dc53}}, Y: Field{[10]uint32{0x0271a206, 0x00a56a9a, 0x0067f618, 0x00059970, 0x00fa3cb7, 0x02205a10, 0x0130311c, 0x01e3d213, 0x0286b812, 0x000f7126}}}, + {X: Field{[10]uint32{0x02ea5d5a, 0x03ccbfb9, 0x0045229a, 0x031e6b47, 0x03d70c79, 0x03a74ffa, 0x00cf936e, 0x00a1610f, 0x038dbd57, 0x001665fc}}, Y: Field{[10]uint32{0x03e4a224, 0x01a695a5, 0x00eec45a, 0x01e37d52, 0x031f44b6, 0x01970777, 0x0349e089, 0x00046ee5, 0x0062b716, 0x002b7df6}}}, + {X: Field{[10]uint32{0x03baeb92, 0x03bb0f4e, 0x00039ea4, 0x02f4ef1b, 0x02956654, 0x03f07f1e, 0x008ae666, 0x0015ddec, 0x02d90a92, 0x0025f5bd}}, Y: Field{[10]uint32{0x020068b9, 0x03c6d730, 0x03c684bd, 0x037d39ff, 0x03ce03fe, 0x00f7eefd, 0x015ab971, 0x0261536b, 0x0047ff21, 0x002d1437}}}, + {X: Field{[10]uint32{0x02d307c4, 0x00034016, 0x010abc4b, 0x032875ac, 0x0040232b, 0x013bbe67, 0x0149ae3c, 0x02dcada5, 0x03cd5ec8, 0x0013d14f}}, Y: Field{[10]uint32{0x01683f7f, 0x01303482, 0x038160b9, 0x017b59a3, 0x00bd61f1, 0x0258367a, 0x02442baf, 0x02f21f1e, 0x0168c4a8, 0x002ab7b5}}}, + {X: Field{[10]uint32{0x009424d6, 0x01c9c165, 0x031e6499, 0x0243036d, 0x00ae4c44, 0x02a9e51b, 0x01c0a6ac, 0x00c0d71c, 0x00a35059, 0x00016981}}, Y: Field{[10]uint32{0x033be9c8, 0x01e9bd04, 0x0186a893, 0x0278bde1, 0x01ae8277, 0x03ea2742, 0x02b92b93, 0x00069e80, 0x00126d87, 0x00395e3f}}}, + {X: Field{[10]uint32{0x03c635b3, 0x0061a581, 0x004985d1, 0x0324d382, 0x022de601, 0x02d7fa3b, 0x024cf0d5, 0x00cbe86d, 0x01a29168, 0x000fcc1c}}, Y: Field{[10]uint32{0x011ad3a3, 0x02147911, 0x0070d053, 0x01706f91, 0x038712f2, 0x0277c390, 0x02adb6f6, 0x02c8cec8, 0x01990bae, 0x003a456c}}}, + {X: Field{[10]uint32{0x001c06e5, 0x01252464, 0x02c45318, 0x01b0bb79, 0x02f7476a, 0x03e67088, 0x0302c5fb, 0x0226b3f3, 0x01cd6431, 0x001d16f0}}, Y: Field{[10]uint32{0x029933f0, 0x024741b4, 0x01d21872, 0x0107409d, 0x00be16cb, 0x0039676d, 0x02519bd1, 0x01dd77a6, 0x034a8703, 0x001668ae}}}, + {X: Field{[10]uint32{0x0237238e, 0x02024449, 0x01942175, 0x00da29b0, 0x01ab3967, 0x018e1e62, 0x03591a60, 0x02567614, 0x028cadb3, 0x002ef41b}}, Y: Field{[10]uint32{0x00b8b690, 0x013b7b4e, 0x00c2a02b, 0x000e9968, 0x00d562b0, 0x0242e1a9, 0x006cb880, 0x0397cf71, 0x0296b484, 0x002b8360}}}, + {X: Field{[10]uint32{0x022cf07c, 0x014ff524, 0x017a385e, 0x01a6debe, 0x029f3eb5, 0x00e8ecd7, 0x00b7e436, 0x02f99a14, 0x01b6128d, 0x003f36a3}}, Y: Field{[10]uint32{0x01551974, 0x03d4d7fe, 0x03f283a0, 0x03a0a817, 0x02cd11f1, 0x03135721, 0x0358ee14, 0x03e6a17d, 0x01fc37a0, 0x0012fcf7}}}, + {X: Field{[10]uint32{0x0073cce2, 0x006b7666, 0x015705ca, 0x025d3b7b, 0x034ed2da, 0x01c84332, 0x025e1132, 0x01f7b4a9, 0x03dffc9c, 0x0018c977}}, Y: Field{[10]uint32{0x00f222e1, 0x0355b4d3, 0x033584d7, 0x003ebc69, 0x027ce193, 0x0185e7fa, 0x00ada7e2, 0x01bf1c5c, 0x0099683e, 0x00227f93}}}, + {X: Field{[10]uint32{0x02ee0d7f, 0x038fca48, 0x02d59245, 0x026d068e, 0x03513df5, 0x009e7429, 0x035797a5, 0x014258ea, 0x00a69349, 0x001dd653}}, Y: Field{[10]uint32{0x01faabb2, 0x023760f9, 0x024a9581, 0x00ef299a, 0x03631df0, 0x03cbbd63, 0x02ddf45e, 0x02ff23f7, 0x01122ccf, 0x000657ac}}}, + {X: Field{[10]uint32{0x02a67867, 0x005514ae, 0x0027bede, 0x01f80c21, 0x02e2defd, 0x019649dc, 0x01348fdc, 0x0090bd3c, 0x0067ea9b, 0x003cd5bb}}, Y: Field{[10]uint32{0x0233ba7a, 0x00bed335, 0x00121e4a, 0x00423c41, 0x03d75a21, 0x03262c0f, 0x02b71459, 0x023a9268, 0x01b9e23f, 0x000f4899}}}, + {X: Field{[10]uint32{0x00a205c9, 0x03f74bbe, 0x012ffcad, 0x002d6428, 0x0186149f, 0x03e2b9be, 0x00e30914, 0x02923b1e, 0x02129b0f, 0x000cd82b}}, Y: Field{[10]uint32{0x01d18a34, 0x014b7dc9, 0x00b83dcb, 0x01478cdf, 0x023d7a20, 0x00ac2989, 0x00098722, 0x016844fb, 0x03f2720d, 0x001e6cde}}}, + {X: Field{[10]uint32{0x01e8727b, 0x0056b4fe, 0x032823fc, 0x02ae7fc3, 0x03b29040, 0x0311d84f, 0x031a4c5f, 0x031436cc, 0x0352c703, 0x00113a43}}, Y: Field{[10]uint32{0x02f55f17, 0x027b0178, 0x02feb400, 0x00789b45, 0x0295c249, 0x00624cbd, 0x02d013a7, 0x00f9bd8d, 0x03419265, 0x0018b7ec}}}, + {X: Field{[10]uint32{0x02c84047, 0x000ad793, 0x0209ee79, 0x0225462a, 0x01c9e042, 0x02ca3f8d, 0x01958764, 0x02b888c4, 0x03a9b5c3, 0x003974d9}}, Y: Field{[10]uint32{0x02f8bcf0, 0x02a62f39, 0x02ace9c9, 0x02d308e0, 0x03fbbc06, 0x001c14b9, 0x0337c069, 0x03c3e9be, 0x017f01ab, 0x003a86c9}}}, + {X: Field{[10]uint32{0x01a63957, 0x01504ed6, 0x038de100, 0x02af820e, 0x010559ba, 0x008a01a9, 0x0061e6d4, 0x0396b4f0, 0x00fd7910, 0x00211e3a}}, Y: Field{[10]uint32{0x022df1d6, 0x0306f0c6, 0x03d5cfd8, 0x02f6d24b, 0x032f3f1e, 0x0052f52f, 0x03e38c45, 0x00d2644f, 0x00180519, 0x0013de4d}}}, + {X: Field{[10]uint32{0x0284b42d, 0x033dd84a, 0x01b6dc2c, 0x03ffda15, 0x0010c97d, 0x01e7249d, 0x035e2240, 0x01cc6fd6, 0x03c80587, 0x0030e0c9}}, Y: Field{[10]uint32{0x01abfcd6, 0x015f5493, 0x01b22bc6, 0x03eae157, 0x00a213fe, 0x0004b39d, 0x007d61f5, 0x0040b9fa, 0x03accb1b, 0x003ac0eb}}}, + {X: Field{[10]uint32{0x0051f10a, 0x00ad486f, 0x0214cd62, 0x02d9813b, 0x024662b4, 0x005fca28, 0x00f48c9d, 0x0299c956, 0x00125348, 0x002e7a2a}}, Y: Field{[10]uint32{0x031ccfee, 0x02b5ccbb, 0x0344ce3d, 0x02ee5e85, 0x033813e7, 0x01dc6d48, 0x02a02241, 0x0341ed47, 0x000d65fc, 0x000d709e}}}, + {X: Field{[10]uint32{0x01cc713e, 0x0229ca69, 0x030fdcc6, 0x00f48506, 0x03d3c3b5, 0x002ea1ab, 0x012e4837, 0x028c94e3, 0x02d595cf, 0x002952a8}}, Y: Field{[10]uint32{0x03b8a159, 0x03ea81a2, 0x02baf4e1, 0x02e68cba, 0x007e9552, 0x02a14692, 0x036b9c86, 0x00acbb99, 0x006e63c0, 0x002fdd37}}}, + {X: Field{[10]uint32{0x029fd956, 0x006787f6, 0x015ea4cc, 0x02b61735, 0x00420ce2, 0x02e2212b, 0x00ad145f, 0x0153ae11, 0x003ce2df, 0x003517fb}}, Y: Field{[10]uint32{0x00b81bd6, 0x03122fe3, 0x0208d205, 0x039fb9d2, 0x00bf6be1, 0x02308235, 0x001dbf9b, 0x032da9a4, 0x030065ae, 0x003b633e}}}, + {X: Field{[10]uint32{0x03192172, 0x03892b54, 0x0310187b, 0x02ae390c, 0x005c0136, 0x013360db, 0x0159829d, 0x02cc632a, 0x0298f728, 0x003d2d13}}, Y: Field{[10]uint32{0x01ea9fa1, 0x030a8262, 0x024e84d3, 0x022fc2a9, 0x012febdd, 0x033dee37, 0x0041fd88, 0x033924b2, 0x01b3960b, 0x003bd548}}}, + {X: Field{[10]uint32{0x013d67e3, 0x00b5090d, 0x039e2841, 0x031b8982, 0x00dcec40, 0x0214cc1e, 0x020cd40e, 0x024443ea, 0x01bf0d34, 0x0037b1b4}}, Y: Field{[10]uint32{0x01095895, 0x028bee99, 0x03b7254c, 0x02cc9041, 0x039451b0, 0x00bff243, 0x02fe44f3, 0x032405c7, 0x03813609, 0x001ce85b}}}, + {X: Field{[10]uint32{0x03ff013e, 0x02d6deac, 0x02039238, 0x0092f069, 0x01265f1c, 0x009cd4d3, 0x010b9c02, 0x01f1064c, 0x015372e1, 0x0007ef37}}, Y: Field{[10]uint32{0x006c27ca, 0x031dfc93, 0x0374f22b, 0x01d628a9, 0x03b2358f, 0x01c9d551, 0x004d14b9, 0x00704483, 0x034a06a6, 0x00273d3f}}}, + {X: Field{[10]uint32{0x02ab593b, 0x0004bef8, 0x03890357, 0x03e6a90e, 0x0250ea1f, 0x00e8c76a, 0x02d53f49, 0x01bb5deb, 0x00cb038c, 0x003673bc}}, Y: Field{[10]uint32{0x0253303f, 0x0030b74d, 0x0148604d, 0x004fb410, 0x01e161cd, 0x03c67769, 0x00e66547, 0x01cb56da, 0x02fe2468, 0x000ca905}}}, + {X: Field{[10]uint32{0x03f03da3, 0x01d29807, 0x03ccede1, 0x01f338cf, 0x024e2f60, 0x022348e1, 0x022135f0, 0x00a86117, 0x014988e2, 0x0005906d}}, Y: Field{[10]uint32{0x0194922f, 0x0237ef5f, 0x006fb5b6, 0x03473eb6, 0x0148e3ff, 0x0103e05b, 0x024e1b95, 0x021d9cd9, 0x00d9ed71, 0x003b74fc}}}, + {X: Field{[10]uint32{0x02243cdd, 0x014d9b0e, 0x0376f96c, 0x020eb13b, 0x0237938f, 0x03bd8059, 0x0238b211, 0x027fec6d, 0x00163c5d, 0x00267bdb}}, Y: Field{[10]uint32{0x02f66b48, 0x005da7b5, 0x02499a31, 0x02f9ae87, 0x027f912b, 0x03c10f80, 0x01d7796d, 0x01607787, 0x0362d819, 0x001adbbb}}}, + {X: Field{[10]uint32{0x035bc97c, 0x0119e7d6, 0x03fe4e2f, 0x02ca3a93, 0x02b9c47f, 0x0314d917, 0x03f79b09, 0x00ba2e03, 0x012dc24c, 0x00124d63}}, Y: Field{[10]uint32{0x001cf5b4, 0x00df2bb7, 0x03865378, 0x0121efb8, 0x03b8c807, 0x023872bd, 0x03c1cbff, 0x0103afbd, 0x00a7f9df, 0x00144a85}}}, + {X: Field{[10]uint32{0x00eb206b, 0x03b2119f, 0x02ee8a4e, 0x029690c2, 0x03c8c122, 0x00533ce0, 0x009c5e1a, 0x037fa495, 0x03cfb1de, 0x0038c74f}}, Y: Field{[10]uint32{0x01b0449b, 0x00eb95a9, 0x03687e6c, 0x02b6d379, 0x01effc4d, 0x020d193e, 0x03ad1dde, 0x01d1ec28, 0x026669db, 0x001ef0f0}}}, + {X: Field{[10]uint32{0x02c64adf, 0x00933861, 0x015d44e3, 0x01fe5e68, 0x03ad1fbb, 0x00a35d20, 0x0332e66a, 0x02f2b7ee, 0x01d6ac86, 0x002a0bb2}}, Y: Field{[10]uint32{0x00f74c89, 0x03b1b4c3, 0x01f816c4, 0x03402c78, 0x023a9efa, 0x031de64d, 0x02b46f1a, 0x006b97d2, 0x012bc28b, 0x002eb21f}}}, + {X: Field{[10]uint32{0x00ea113d, 0x02d4f532, 0x01c081bf, 0x030c631c, 0x020dc370, 0x02334eae, 0x01ab82b1, 0x028b891e, 0x01942bff, 0x00085942}}, Y: Field{[10]uint32{0x001fcae3, 0x029df272, 0x03103fec, 0x02fa697c, 0x00f84511, 0x009067e4, 0x0113b6f6, 0x00d142f9, 0x006a2f65, 0x0025ea09}}}, + {X: Field{[10]uint32{0x02dd4b84, 0x03acd8b1, 0x0057f63c, 0x0318f6d6, 0x01e4e666, 0x01123a41, 0x01f8070e, 0x025a21ff, 0x00d8208d, 0x001cd414}}, Y: Field{[10]uint32{0x02b9e2e9, 0x0007e78a, 0x03918900, 0x032eb4c1, 0x00216887, 0x0320866b, 0x03e23f07, 0x0187279b, 0x00385636, 0x000b8fed}}}, + {X: Field{[10]uint32{0x03afe506, 0x02ced991, 0x008ba197, 0x0001e770, 0x0365f878, 0x02e70fa6, 0x00c3813b, 0x0370228d, 0x0061e679, 0x00074086}}, Y: Field{[10]uint32{0x02fd2f1f, 0x029ae9e9, 0x03c50cea, 0x0133b82d, 0x004a10e8, 0x00a56fc2, 0x0292cd0e, 0x0120f427, 0x00b92303, 0x00052db4}}}, + {X: Field{[10]uint32{0x02d7810b, 0x0313d391, 0x0033c1bd, 0x01dd2615, 0x03f91c55, 0x013bfe5b, 0x018c15d5, 0x0225cea1, 0x027486ca, 0x001e9fbb}}, Y: Field{[10]uint32{0x03b498cf, 0x004b2edd, 0x02297c70, 0x006ef078, 0x03448fed, 0x01f46733, 0x035057d8, 0x01439e9f, 0x007f5d91, 0x0017a0e8}}}, + {X: Field{[10]uint32{0x0302beec, 0x039c9b69, 0x00b51f50, 0x0008cbc9, 0x02485938, 0x00a8cab6, 0x0005cce3, 0x00c1851f, 0x03d4fe0a, 0x00020470}}, Y: Field{[10]uint32{0x033d9f0a, 0x03acaf20, 0x034efc95, 0x0274c7b5, 0x03b28e59, 0x016b615d, 0x004214e3, 0x03d3e4ba, 0x016c6c9c, 0x0029bf30}}}, + {X: Field{[10]uint32{0x01ad606c, 0x01f69248, 0x0150b435, 0x0020c2ba, 0x03ca25ed, 0x0112c9b4, 0x00d5b1ee, 0x027a3c09, 0x003889ea, 0x000b2851}}, Y: Field{[10]uint32{0x0026c551, 0x004398c4, 0x0186f42e, 0x038dd04f, 0x03c5e90b, 0x03e39884, 0x002c6560, 0x028a7c2a, 0x02c692d8, 0x001ed229}}}, + {X: Field{[10]uint32{0x010277bf, 0x02c7c7ce, 0x01c80d57, 0x02977bba, 0x005dd3e0, 0x015f9989, 0x01566d29, 0x006bf0ce, 0x03e16104, 0x002a603f}}, Y: Field{[10]uint32{0x03a1c64c, 0x01051581, 0x007fd10e, 0x0015c739, 0x01457d50, 0x0285d366, 0x03440797, 0x00d0ee1d, 0x03a2a139, 0x000c9dbd}}}, + {X: Field{[10]uint32{0x01cd80bd, 0x0275bab6, 0x026bc957, 0x02639977, 0x01fde41d, 0x026364dc, 0x002954a9, 0x02dd3f16, 0x03d9cbcc, 0x00395c28}}, Y: Field{[10]uint32{0x02973a52, 0x026af905, 0x022df273, 0x01af1f7a, 0x019400bc, 0x00b05a2f, 0x01d30351, 0x00e63826, 0x01776658, 0x00169d24}}}, + {X: Field{[10]uint32{0x03ce1110, 0x025530de, 0x018c972b, 0x03ed988d, 0x0171bd25, 0x024a02eb, 0x013d985d, 0x03d4399b, 0x02b8952c, 0x003d7eea}}, Y: Field{[10]uint32{0x03d77175, 0x03d5fcc7, 0x006cfb02, 0x023400eb, 0x03801081, 0x01229d13, 0x03097c9b, 0x03e08693, 0x01236179, 0x0006b288}}}, + {X: Field{[10]uint32{0x018d89be, 0x0277a85c, 0x03375555, 0x017b136f, 0x016f9e52, 0x012adf1d, 0x0008d258, 0x02a2b055, 0x02fbecbd, 0x000b9650}}, Y: Field{[10]uint32{0x00bc790b, 0x0155bec5, 0x0201640c, 0x006a3032, 0x0230e12a, 0x01ad6498, 0x0123d6cf, 0x02669e3c, 0x0107d141, 0x00254419}}}, + {X: Field{[10]uint32{0x015dd296, 0x00cc006d, 0x0013ea2f, 0x00fe9ce5, 0x010a9fc8, 0x026eadc1, 0x01e7f64a, 0x0267a5b2, 0x00a9891c, 0x0024af41}}, Y: Field{[10]uint32{0x022ba587, 0x0067eb60, 0x01fbf130, 0x00d08859, 0x035cc71c, 0x005eda83, 0x0017ba68, 0x03f67395, 0x0333659b, 0x0033d78d}}}, + {X: Field{[10]uint32{0x03b11083, 0x034c1069, 0x008ffed7, 0x02c219c9, 0x024d0e52, 0x00f77358, 0x00c54269, 0x03ab878f, 0x019fa50f, 0x000c377f}}, Y: Field{[10]uint32{0x02eb42ed, 0x036bd989, 0x0241b14b, 0x003e1eb1, 0x0221bdfa, 0x03d09a72, 0x00389e3d, 0x020fbe86, 0x00fe2bb1, 0x003fc574}}}, + {X: Field{[10]uint32{0x012a9f4f, 0x00e779c9, 0x03f1cbaf, 0x036dcbe9, 0x00067ddd, 0x0115c679, 0x03196882, 0x031a2abc, 0x010bdf8a, 0x00233d45}}, Y: Field{[10]uint32{0x0186cfd5, 0x003f0150, 0x0007a213, 0x02ad0516, 0x002a9963, 0x00232636, 0x0318bc25, 0x02ec660e, 0x017ba299, 0x00130a12}}}, + {X: Field{[10]uint32{0x025e46c7, 0x00ca2149, 0x001b8690, 0x002637b3, 0x014a8e3c, 0x03db765e, 0x02ed9f74, 0x013becf2, 0x02fd5097, 0x0007d2d3}}, Y: Field{[10]uint32{0x039fd399, 0x031bfac5, 0x00a76ee1, 0x00a49940, 0x02685352, 0x011f1f02, 0x00adeb8a, 0x02c0370e, 0x00c7f7c6, 0x001b12c1}}}, + {X: Field{[10]uint32{0x0091af81, 0x00a2c634, 0x029a22a0, 0x02e43cb8, 0x003f915c, 0x004f40e3, 0x01883bad, 0x03e8ce35, 0x0100979a, 0x00275492}}, Y: Field{[10]uint32{0x0002be38, 0x0059e79a, 0x033e1e0f, 0x031c2e69, 0x03db3257, 0x02c5874c, 0x004453d6, 0x01ccb444, 0x013c037c, 0x00102684}}}, + {X: Field{[10]uint32{0x01a2e3a1, 0x01fcd2f7, 0x00734c62, 0x0133cfec, 0x005b0398, 0x0308d00f, 0x01c124c1, 0x036743f5, 0x00e446ee, 0x0014b879}}, Y: Field{[10]uint32{0x008320a7, 0x010c85c2, 0x03e5b262, 0x00c1d69d, 0x02e2dbc6, 0x00b05c4e, 0x004104f1, 0x03fea30f, 0x03317375, 0x0019d295}}}, + {X: Field{[10]uint32{0x02401c8b, 0x00bdea05, 0x03148fd2, 0x024e9df5, 0x020e0a6c, 0x031b8dbe, 0x00a8b6e7, 0x0138c79b, 0x031a8eef, 0x00209ec5}}, Y: Field{[10]uint32{0x03ca7540, 0x017cd93d, 0x01f08827, 0x03e84a7e, 0x001d58c7, 0x01e2e845, 0x026d14cb, 0x00073df7, 0x01fdd9b8, 0x00197361}}}, + {X: Field{[10]uint32{0x00df2f9b, 0x03e45edb, 0x00383c83, 0x01506fa8, 0x023db299, 0x0160b891, 0x01abc32e, 0x025909a8, 0x01e961d8, 0x000493d1}}, Y: Field{[10]uint32{0x038d6c62, 0x02d359e5, 0x00f8358b, 0x01f484e9, 0x03e48e7a, 0x018a23e1, 0x020626fc, 0x0196c4b5, 0x03e4110b, 0x001cd38b}}}, + {X: Field{[10]uint32{0x024d67e2, 0x03d5a666, 0x011695f5, 0x035b0234, 0x00fb4ac9, 0x02648131, 0x024f0028, 0x02cc9043, 0x029818b2, 0x0000edc4}}, Y: Field{[10]uint32{0x02c27c3b, 0x01f07ed0, 0x02218560, 0x01a2862b, 0x0154ba63, 0x03119582, 0x0010c51e, 0x005ad570, 0x038b0cee, 0x000a2dbd}}}, + {X: Field{[10]uint32{0x012d8a00, 0x000ced54, 0x020a4290, 0x02871fdf, 0x02e2b887, 0x029ab9c3, 0x0264485e, 0x014d8c39, 0x007e063b, 0x00349c76}}, Y: Field{[10]uint32{0x016da847, 0x008e3ae7, 0x01c9b510, 0x009cd25c, 0x0060ef59, 0x03619134, 0x03122ba8, 0x038a009c, 0x00047865, 0x0019750e}}}, + {X: Field{[10]uint32{0x00dc03a7, 0x0252c943, 0x01661e84, 0x0326b9ef, 0x000c5ca0, 0x00ae954b, 0x00d2d82e, 0x0145819f, 0x01852db3, 0x0007471b}}, Y: Field{[10]uint32{0x02691f62, 0x02c40153, 0x02ebbae8, 0x0132f75e, 0x01e19f87, 0x02bba80d, 0x01b68407, 0x00095bba, 0x00c5673a, 0x002f0c7d}}}, + {X: Field{[10]uint32{0x02efdd9d, 0x01d5bf51, 0x007fb1d3, 0x0331a559, 0x00bf8d2e, 0x02e81f79, 0x02d274c0, 0x02530376, 0x01b471e3, 0x0023fba2}}, Y: Field{[10]uint32{0x012b8c6c, 0x0298bc6f, 0x034c434c, 0x01c51aa6, 0x034ba5cf, 0x00663e73, 0x03ae1487, 0x015e3f45, 0x00c38479, 0x001757b4}}}, + {X: Field{[10]uint32{0x0010a6ec, 0x03ef4c22, 0x02ce55d7, 0x017e4236, 0x018ef938, 0x038fb91d, 0x026302cc, 0x03cd4580, 0x030955a0, 0x001a07f3}}, Y: Field{[10]uint32{0x02a38faa, 0x00d63280, 0x00885e6d, 0x03d0643c, 0x00aa54e8, 0x013195d7, 0x0187edbc, 0x01d89200, 0x035b9992, 0x0010c1fd}}}, + {X: Field{[10]uint32{0x03a6971b, 0x024a4dec, 0x02918907, 0x0225ff0c, 0x026f6c1a, 0x001334f8, 0x0184a289, 0x029c6da9, 0x02ddfcb5, 0x001c5ff5}}, Y: Field{[10]uint32{0x00b17992, 0x036167d6, 0x02511d7c, 0x0174d075, 0x021b05e2, 0x01fdb6a3, 0x00405532, 0x02b4137f, 0x002971d4, 0x002d00fe}}}, + {X: Field{[10]uint32{0x014f2ff6, 0x0004f8dd, 0x03a34227, 0x01e71cc8, 0x00d29832, 0x02b630d0, 0x01f49986, 0x025e1b70, 0x032394eb, 0x003cae55}}, Y: Field{[10]uint32{0x0366763b, 0x02925f9d, 0x0120ddba, 0x00179e99, 0x03bb69e7, 0x02645edc, 0x009645dd, 0x033505c6, 0x03813efd, 0x002d54f4}}}, + {X: Field{[10]uint32{0x02730b1b, 0x01d21765, 0x017b1423, 0x0340755b, 0x019ab6fe, 0x00504d70, 0x0309b524, 0x01b22594, 0x03e6d7d8, 0x00161c52}}, Y: Field{[10]uint32{0x03e3e533, 0x0293579b, 0x03cf81c9, 0x01717e93, 0x03403984, 0x0038c54d, 0x02b84abf, 0x03396f7a, 0x03343e38, 0x00030047}}}, + {X: Field{[10]uint32{0x026ff3c3, 0x0056f01e, 0x0223b7f9, 0x03eecafa, 0x02b30819, 0x0271ad3e, 0x0300d49e, 0x03e306e5, 0x01abc828, 0x0034cf39}}, Y: Field{[10]uint32{0x01a23395, 0x0293045d, 0x0156fcac, 0x013cdf6e, 0x01ef5939, 0x03ef88bc, 0x0372ba63, 0x01262088, 0x02223913, 0x001ce6d8}}}, + {X: Field{[10]uint32{0x03b55479, 0x01ec9b58, 0x020d5983, 0x00235be4, 0x02249048, 0x00bdf652, 0x03a58ff4, 0x0004a13a, 0x0232fc7d, 0x0020880b}}, Y: Field{[10]uint32{0x0163b4c8, 0x000ced89, 0x0004dedd, 0x000a6800, 0x0063aa32, 0x02b0b220, 0x004fb0a8, 0x015793f3, 0x015450aa, 0x003f798e}}}, + {X: Field{[10]uint32{0x01ea7781, 0x027e9f0b, 0x022b7041, 0x021e8d09, 0x02941e64, 0x00322d92, 0x0300e370, 0x013223e8, 0x02185bfb, 0x0009798c}}, Y: Field{[10]uint32{0x0316e640, 0x03736fbd, 0x02a1142d, 0x00915230, 0x0209caa1, 0x019cc75f, 0x032d84cc, 0x02ae6537, 0x03074802, 0x002b9a5a}}}, + {X: Field{[10]uint32{0x005c114e, 0x006a56d8, 0x0048753c, 0x00e87bf7, 0x039da877, 0x010e837f, 0x0068a363, 0x01386bc9, 0x0205b925, 0x00380cda}}, Y: Field{[10]uint32{0x03b12a18, 0x036762eb, 0x01050d96, 0x0056776b, 0x015ba059, 0x011899b1, 0x03974553, 0x0368e1e6, 0x0160377a, 0x001075d6}}}, + {X: Field{[10]uint32{0x02996662, 0x01cc6aa6, 0x0375262d, 0x016b6d5e, 0x0134ee87, 0x01092270, 0x01a9253e, 0x02c6f472, 0x03af7fd2, 0x00210cd8}}, Y: Field{[10]uint32{0x03cde6ca, 0x034d58bf, 0x004734d2, 0x02c59b92, 0x0012c4b3, 0x0054e8ca, 0x00bda36f, 0x03c04fb5, 0x02d1dbfc, 0x00397028}}}, + {X: Field{[10]uint32{0x011178de, 0x03d8cca5, 0x03c0526d, 0x000a74a0, 0x03abb9f2, 0x029f95d8, 0x03955cff, 0x01fc63e5, 0x00b81cdb, 0x002b6c84}}, Y: Field{[10]uint32{0x00ea0e35, 0x02e4695d, 0x02cf068e, 0x03b0b86f, 0x01364db5, 0x0122be84, 0x03847219, 0x00aa9835, 0x0305d818, 0x000b0847}}}, + {X: Field{[10]uint32{0x024d7491, 0x019450bc, 0x036e088b, 0x0139615e, 0x02203460, 0x02684de4, 0x013854f5, 0x0088d7ba, 0x03a1a2fe, 0x002ac317}}, Y: Field{[10]uint32{0x000124d2, 0x00bde16e, 0x0132b8d9, 0x0337b29a, 0x03b9dc48, 0x01ce0d54, 0x00a73840, 0x01b855c7, 0x01cbe36d, 0x003951c9}}}, + {X: Field{[10]uint32{0x0085deda, 0x02f2235e, 0x01835f9c, 0x002d9eb3, 0x03868a08, 0x03d3d51c, 0x03124b0a, 0x018f90fc, 0x037a1d21, 0x000f9779}}, Y: Field{[10]uint32{0x01746630, 0x03994745, 0x036d2254, 0x03130dfb, 0x02e1927d, 0x01dfd452, 0x03e66b83, 0x000ee2e0, 0x00a42f95, 0x0029bb4d}}}, + {X: Field{[10]uint32{0x0191ec05, 0x03abbd92, 0x01ceb050, 0x0057e0ea, 0x01321848, 0x03ccbd9c, 0x031f0688, 0x034c996d, 0x033d31d1, 0x001831a2}}, Y: Field{[10]uint32{0x0000d498, 0x0183f29f, 0x0132a9d7, 0x00a5403b, 0x01898867, 0x021dcde9, 0x01aecbe9, 0x009322a5, 0x00619f7d, 0x0025deb3}}}, + {X: Field{[10]uint32{0x01c135e2, 0x0316cc5a, 0x0065464f, 0x00a5afa8, 0x014a1267, 0x019ae6c9, 0x0004a76a, 0x039656db, 0x02e9b646, 0x00086c14}}, Y: Field{[10]uint32{0x000779e7, 0x00262715, 0x0128538f, 0x035166aa, 0x0318db6e, 0x02c37f5f, 0x007292c4, 0x035c5dba, 0x00cd2fb3, 0x00040a79}}}, + {X: Field{[10]uint32{0x03523d68, 0x01f6e8de, 0x0379dc02, 0x03bd6c47, 0x02f58bb2, 0x002f9332, 0x0101e666, 0x011457b9, 0x02f37c66, 0x0001c032}}, Y: Field{[10]uint32{0x03a08be1, 0x024d31db, 0x00948e1a, 0x01f95bb7, 0x008eac9b, 0x02655e0c, 0x032487c1, 0x011bccb8, 0x0388f1c3, 0x001f7dda}}}, + {X: Field{[10]uint32{0x01541e8d, 0x01a59912, 0x01696299, 0x02bd5969, 0x015d34ae, 0x019160c5, 0x01f1c9f5, 0x02112b39, 0x03d21293, 0x00316ae6}}, Y: Field{[10]uint32{0x01c422d8, 0x0184c100, 0x02f29c03, 0x00315f6c, 0x029b34d9, 0x03b14e9f, 0x01f44678, 0x01b22a83, 0x01c6c61d, 0x000b4820}}}, + {X: Field{[10]uint32{0x016d75a3, 0x034dda80, 0x023dfa4a, 0x0375751a, 0x005713fb, 0x03085476, 0x00d15af8, 0x01770512, 0x032ed53f, 0x0022bf0f}}, Y: Field{[10]uint32{0x039b6c8f, 0x02c69392, 0x0389764d, 0x004fcd15, 0x036767c5, 0x00864f9a, 0x015a99d4, 0x02fb6780, 0x03932627, 0x000047d8}}}, + {X: Field{[10]uint32{0x025007a7, 0x01cf140e, 0x034d86e1, 0x019fb7a7, 0x02c0d698, 0x01eb8da0, 0x00cf7292, 0x03ab7f3d, 0x01c6bb55, 0x001052b6}}, Y: Field{[10]uint32{0x03603585, 0x0374e823, 0x03fd6181, 0x020bb6f7, 0x01dafb6f, 0x019e951b, 0x002306b6, 0x026c7444, 0x00f8f4de, 0x00312f34}}}, + {X: Field{[10]uint32{0x0304a1e3, 0x005c91f2, 0x008fdb23, 0x034eabc2, 0x01a163a2, 0x037109b4, 0x005ec88f, 0x01cc5ea7, 0x0240b84b, 0x00208478}}, Y: Field{[10]uint32{0x02722bbb, 0x0250ab49, 0x029be4e7, 0x02c5c2a7, 0x03a74f10, 0x016586cc, 0x006c4f6d, 0x02fd453c, 0x019bb268, 0x00329da9}}}, + {X: Field{[10]uint32{0x02ba700e, 0x01676bc8, 0x012f429e, 0x02450fb9, 0x023f7cd2, 0x00252c9e, 0x02c44523, 0x0374f1d7, 0x0132363a, 0x0029537f}}, Y: Field{[10]uint32{0x02d4490b, 0x02364bae, 0x02bbb279, 0x01d1aa4f, 0x013639ac, 0x026d1219, 0x038d1304, 0x000260f8, 0x022c5951, 0x003c5820}}}, + {X: Field{[10]uint32{0x018860f7, 0x029f2e52, 0x015e9a3b, 0x010f3ef6, 0x03e2921a, 0x0387a74f, 0x02ee1a81, 0x026c629e, 0x005552b2, 0x001df593}}, Y: Field{[10]uint32{0x0208ff10, 0x01bcb9e0, 0x025978d0, 0x02a43325, 0x020fed03, 0x01b6681a, 0x00ad9d73, 0x0323d110, 0x00f95ea9, 0x003a5eee}}}, + {X: Field{[10]uint32{0x02309ca9, 0x0251f85b, 0x03d61ba7, 0x000d83c4, 0x011b57c1, 0x00396862, 0x007f0f5f, 0x01afc47d, 0x0014b33e, 0x001216ce}}, Y: Field{[10]uint32{0x00e38bdb, 0x02098c81, 0x01b5f152, 0x01bcb1e0, 0x03f99857, 0x011b2194, 0x0050dd09, 0x01f18a98, 0x0070ce60, 0x0039aede}}}, + {X: Field{[10]uint32{0x0072739c, 0x01c1a3c0, 0x029aab0a, 0x032052bb, 0x017ced2a, 0x02dbb714, 0x03618be1, 0x01e30b7b, 0x01eca90a, 0x003b48e0}}, Y: Field{[10]uint32{0x034954c7, 0x0117fec4, 0x00fbc3de, 0x0058b284, 0x02d68599, 0x018d4e07, 0x00c291ec, 0x019148e0, 0x03e0ba32, 0x0032c21c}}}, + {X: Field{[10]uint32{0x00ed971d, 0x01795f11, 0x03a684a6, 0x019a3cb9, 0x02955b6a, 0x0132e83f, 0x03c7369a, 0x03049f20, 0x0379d36b, 0x0039112b}}, Y: Field{[10]uint32{0x03785fff, 0x031553f4, 0x034e9dd7, 0x03780434, 0x02ec50e5, 0x02922662, 0x0355ca16, 0x0208eaab, 0x030327b6, 0x0029e1db}}}, + {X: Field{[10]uint32{0x01fc1fca, 0x035f941a, 0x0278c07e, 0x022a5b2c, 0x03b8677b, 0x014bfa93, 0x024296c1, 0x0168b57d, 0x00d77de7, 0x002be30d}}, Y: Field{[10]uint32{0x0184d673, 0x0330ec8a, 0x00a8cf9e, 0x032e2e07, 0x02f3c451, 0x0118caf8, 0x015899f2, 0x0306a339, 0x0062ab6e, 0x00123396}}}, + {X: Field{[10]uint32{0x027efe13, 0x0150db3d, 0x000cbe31, 0x0221d812, 0x0108940c, 0x0368128c, 0x02745a81, 0x0113b463, 0x0066243a, 0x003a6675}}, Y: Field{[10]uint32{0x0237fe36, 0x0347ec00, 0x013cb2f7, 0x03adfea0, 0x00ef55d3, 0x0337b6f4, 0x02ac0e75, 0x01198708, 0x027063a8, 0x003d07a3}}}, + {X: Field{[10]uint32{0x004bcc72, 0x026d9118, 0x02d66e20, 0x02a962dc, 0x00072caf, 0x00bf7afb, 0x00c923a0, 0x0193fe8f, 0x00aa7d89, 0x003103be}}, Y: Field{[10]uint32{0x03238ce5, 0x03c189ed, 0x02c2f696, 0x031ecfbe, 0x00ff50eb, 0x01dbccde, 0x012c3b61, 0x02879bc4, 0x01b56549, 0x0012038d}}}, + {X: Field{[10]uint32{0x0252982f, 0x006c3ce6, 0x026151bd, 0x02288a89, 0x01679e4b, 0x00826a97, 0x012b546e, 0x01267226, 0x001de3f9, 0x00120bb9}}, Y: Field{[10]uint32{0x00d3de3d, 0x03fba077, 0x009f832e, 0x03b28395, 0x03563f92, 0x03843b1b, 0x012eff0e, 0x006054b5, 0x0070d213, 0x00144398}}}, + {X: Field{[10]uint32{0x0058fae5, 0x033dc997, 0x01fd465d, 0x00cb180a, 0x036df7ca, 0x034dbe2d, 0x0003c694, 0x0307599c, 0x006825a3, 0x00119829}}, Y: Field{[10]uint32{0x0223f618, 0x02fe842e, 0x017c0700, 0x0380540e, 0x03791de8, 0x00b6b7a5, 0x00acc720, 0x030a5a62, 0x03f546b5, 0x000f660a}}}, + {X: Field{[10]uint32{0x035d8f8d, 0x022fbc3a, 0x00d8703c, 0x0385d8c5, 0x00d8a3ae, 0x01d62665, 0x031dc033, 0x01bc2cfe, 0x024c92ba, 0x002e1798}}, Y: Field{[10]uint32{0x0175679b, 0x01861a2b, 0x0148688c, 0x009a19b3, 0x03e2cdff, 0x02cdbbdd, 0x03ff93ef, 0x016e9092, 0x033320a5, 0x002224da}}}, + {X: Field{[10]uint32{0x002683e3, 0x0261d524, 0x014c6b16, 0x00be53be, 0x03b3be28, 0x018bf56c, 0x0187ebab, 0x009afef4, 0x00b5361a, 0x00290648}}, Y: Field{[10]uint32{0x015ea98a, 0x031e92b8, 0x007d1491, 0x027c9819, 0x02c95a8f, 0x00814f80, 0x027201b3, 0x00ed34f4, 0x019629d9, 0x001de428}}}, + {X: Field{[10]uint32{0x03b7f86e, 0x025e7d3e, 0x03937055, 0x022c5541, 0x01ed1abf, 0x03c40762, 0x012f01bb, 0x00a980c9, 0x01a97926, 0x0024e20b}}, Y: Field{[10]uint32{0x009d7e44, 0x01024406, 0x03e0215a, 0x03c4fb4d, 0x0223e570, 0x0357c08b, 0x037450ba, 0x005bbc04, 0x004df0a7, 0x00024e22}}}, + {X: Field{[10]uint32{0x00952e00, 0x008c8972, 0x03b0679c, 0x016799bb, 0x03ebfa6a, 0x01c26c65, 0x0356b643, 0x036982b3, 0x01f83efe, 0x00284142}}, Y: Field{[10]uint32{0x024d1ddb, 0x03c19df0, 0x015fe830, 0x0291f038, 0x005a06e7, 0x0132b93e, 0x0237df52, 0x03793426, 0x03d5559b, 0x001d6420}}}, + {X: Field{[10]uint32{0x03eb3651, 0x02c7be4a, 0x02d294b3, 0x00122a89, 0x03c55de7, 0x03f9d7ab, 0x017e587d, 0x0109e1cf, 0x02976ea7, 0x000ae516}}, Y: Field{[10]uint32{0x02893c65, 0x003bd941, 0x03752698, 0x0043976b, 0x03cb488d, 0x0002d146, 0x01cbabce, 0x02fdae74, 0x03ed27cc, 0x00108f01}}}, + {X: Field{[10]uint32{0x03cc37f0, 0x01115ec3, 0x01073b59, 0x0244a354, 0x03f69516, 0x00fc5c05, 0x0203da01, 0x02ff9003, 0x01bbc1a0, 0x0021be76}}, Y: Field{[10]uint32{0x024c32bb, 0x031b19d1, 0x007eddf3, 0x00099249, 0x0362388f, 0x02f067a3, 0x039cd4bf, 0x00de5a4c, 0x02242e30, 0x003cdc31}}}, + {X: Field{[10]uint32{0x0161ed91, 0x0343e0f7, 0x0206c016, 0x003e42a4, 0x033aa9cc, 0x02f6d384, 0x038d8958, 0x00113988, 0x02f9555e, 0x003e2656}}, Y: Field{[10]uint32{0x02a8a060, 0x00964853, 0x014bcd08, 0x024d2bc6, 0x031febdb, 0x013e8b98, 0x00bdab83, 0x004b20ee, 0x02e31bee, 0x002cb534}}}, + {X: Field{[10]uint32{0x019394ce, 0x015105e0, 0x01dbe2f5, 0x00858f42, 0x00fdea26, 0x02ef071d, 0x01eee7f0, 0x00d4b515, 0x027f69eb, 0x002ad568}}, Y: Field{[10]uint32{0x031b801a, 0x01988038, 0x013534a1, 0x012a25e2, 0x024d5467, 0x012a4c38, 0x0373bc17, 0x0216d5c8, 0x009360f5, 0x0022b159}}}, + {X: Field{[10]uint32{0x023b9fa6, 0x022645a8, 0x02522e8a, 0x00ffeb6b, 0x03ce8472, 0x017a60d4, 0x02a89069, 0x037e6245, 0x02c9c428, 0x0013f041}}, Y: Field{[10]uint32{0x02b92031, 0x00c5a227, 0x02fd1925, 0x0129f066, 0x01fdebbc, 0x00e49a1f, 0x00c88be3, 0x00d0793d, 0x02e83d54, 0x002435cc}}}, + {X: Field{[10]uint32{0x03149a91, 0x01af2080, 0x036b2462, 0x036c2e81, 0x03874080, 0x00ea2538, 0x0187b257, 0x03332ddf, 0x01808831, 0x00327216}}, Y: Field{[10]uint32{0x02abf0b8, 0x00c0b8ec, 0x026e6a6f, 0x01a1e015, 0x02c5f992, 0x002f7e8d, 0x01a6355f, 0x0127e6fa, 0x00cd8c09, 0x0027eb53}}}, + {X: Field{[10]uint32{0x005209e7, 0x01dc5247, 0x00cb7aee, 0x01737756, 0x01a278eb, 0x028508bf, 0x0378c46a, 0x02aee97f, 0x037e2293, 0x003032d6}}, Y: Field{[10]uint32{0x0210c47b, 0x0035ccd3, 0x027d5133, 0x027bb634, 0x03cc7278, 0x0037d328, 0x036b572d, 0x02161976, 0x002e3664, 0x0020407d}}}, + {X: Field{[10]uint32{0x00ce0b63, 0x03c56436, 0x0215d140, 0x03383ef3, 0x01af2f70, 0x0246f75a, 0x02ab60c3, 0x00fe0d1c, 0x03c516d9, 0x0036ff00}}, Y: Field{[10]uint32{0x02d26564, 0x023054ff, 0x03b46465, 0x00937af1, 0x024811fa, 0x00ddaa93, 0x033ecfec, 0x0328ba68, 0x014d7228, 0x003e0e38}}}, + {X: Field{[10]uint32{0x004f59c8, 0x00fcf4d2, 0x03af37cc, 0x02e58b8e, 0x00435140, 0x00d581ec, 0x031d8910, 0x00ffc455, 0x0285eea1, 0x00378981}}, Y: Field{[10]uint32{0x01cfbbcc, 0x023eb966, 0x00accd7f, 0x0132a97e, 0x02c1f5f5, 0x02d9bc79, 0x0363335b, 0x01619798, 0x02c9a602, 0x001af08f}}}, + {X: Field{[10]uint32{0x02a2e71e, 0x00f162fe, 0x01e5f6f7, 0x027f1e06, 0x031ed812, 0x01b05fae, 0x0362f79f, 0x023f6c06, 0x0160b8cb, 0x001635e3}}, Y: Field{[10]uint32{0x004bccc1, 0x029014ed, 0x0353140a, 0x00f6ec98, 0x03b04d6d, 0x018e444c, 0x0222f5e1, 0x0319c630, 0x00f2fd6b, 0x001f2ef9}}}, + {X: Field{[10]uint32{0x0000a490, 0x03afbf8b, 0x01738211, 0x004bd91b, 0x03fde1af, 0x0000538e, 0x00869aa9, 0x013f96ac, 0x031aeed5, 0x0039cae6}}, Y: Field{[10]uint32{0x00af4fc2, 0x03cc9ce4, 0x01d348cf, 0x01a5df49, 0x00d94659, 0x00b320a8, 0x02af020a, 0x0160ce10, 0x014d8f59, 0x003364b4}}}, + {X: Field{[10]uint32{0x030fd658, 0x03cd2355, 0x0085b3b9, 0x00508885, 0x00b725f6, 0x0277fe2a, 0x03cef97c, 0x016f862d, 0x03aed55a, 0x0001aa1a}}, Y: Field{[10]uint32{0x032c5724, 0x001b59fb, 0x01d4081c, 0x00515c6a, 0x0360a14f, 0x01c27ea1, 0x03121407, 0x00c05440, 0x02914c3b, 0x0004e289}}}, + {X: Field{[10]uint32{0x030a1fc5, 0x0002bbae, 0x0316e0e1, 0x0386d891, 0x03b17c39, 0x0193f0a0, 0x00b00595, 0x03c9135b, 0x00f67240, 0x00072823}}, Y: Field{[10]uint32{0x01ef0a55, 0x011ecff6, 0x0016ab34, 0x010d3a70, 0x03deec27, 0x019ab7c1, 0x0236317c, 0x0027b0d2, 0x03ce655d, 0x0008b893}}}, + {X: Field{[10]uint32{0x024a0b0f, 0x01608060, 0x016070f5, 0x022bf525, 0x02b7cf62, 0x03377ddb, 0x021ee30b, 0x012711cf, 0x0128feba, 0x00365770}}, Y: Field{[10]uint32{0x03c7e8a1, 0x00b135b1, 0x02116161, 0x02eab8bf, 0x03633e98, 0x01a6da38, 0x0061274c, 0x0384df44, 0x02b8fea3, 0x00354d02}}}, + {X: Field{[10]uint32{0x00d83857, 0x001cfe33, 0x03afcf3c, 0x022f6661, 0x03ae7e28, 0x01a6a22e, 0x03a14e47, 0x035405b0, 0x022a7f4f, 0x000b3334}}, Y: Field{[10]uint32{0x033b389e, 0x01593741, 0x01f3b0f2, 0x00513b6d, 0x00c2a7b6, 0x03e393ee, 0x010f849f, 0x027f6d1c, 0x023caea8, 0x002ba099}}}, + {X: Field{[10]uint32{0x01628a43, 0x03afac25, 0x001d1c5e, 0x03207ca0, 0x01ae4a9a, 0x0375ed04, 0x03bc0037, 0x03788e4d, 0x01f6c8e4, 0x003b05ed}}, Y: Field{[10]uint32{0x0258df83, 0x01b9ba59, 0x007348e6, 0x0083c1e6, 0x03743196, 0x01a3f9c3, 0x01fa2989, 0x0056c18c, 0x011dfd58, 0x002cf835}}}, + {X: Field{[10]uint32{0x0096b6f4, 0x0216225b, 0x023ca956, 0x00b22eb3, 0x00cee8e1, 0x033c7326, 0x0213cddc, 0x01fd3869, 0x037e6290, 0x00298eab}}, Y: Field{[10]uint32{0x02e8216e, 0x01500c6b, 0x00deeef7, 0x01f7a003, 0x01f8bc1a, 0x00c95688, 0x0144ab12, 0x0265cfa7, 0x02bcdc5f, 0x000be54f}}}, + {X: Field{[10]uint32{0x03ad32f3, 0x03805a61, 0x00b2c550, 0x02bc6685, 0x0390e345, 0x00a5b44d, 0x005636cb, 0x023435ad, 0x0330318d, 0x0023ad3f}}, Y: Field{[10]uint32{0x00a4a3e3, 0x022bddc3, 0x031718f2, 0x0144209f, 0x020cc01d, 0x017aeddd, 0x0200151c, 0x03f1f9f5, 0x038bae7f, 0x0012e388}}}, + {X: Field{[10]uint32{0x0276b8d2, 0x012b7660, 0x02341437, 0x0232d1c4, 0x002432fa, 0x01298ebb, 0x038a6e57, 0x010e5fd5, 0x00afbb5b, 0x002ac508}}, Y: Field{[10]uint32{0x00b94396, 0x03995fd9, 0x0357490c, 0x0335fdd6, 0x038f264a, 0x029e5562, 0x039df900, 0x03a49d96, 0x028ea197, 0x003ebd8c}}}, + {X: Field{[10]uint32{0x006f680a, 0x002f46a2, 0x03b5e963, 0x01acd23f, 0x015102aa, 0x00756667, 0x0016f1cc, 0x0286ab73, 0x010e6b2b, 0x0036a862}}, Y: Field{[10]uint32{0x012fa209, 0x03db7e8d, 0x0051094b, 0x0170b088, 0x038744f0, 0x03caef48, 0x02f6005c, 0x03ae532d, 0x03695a63, 0x00067eb2}}}, + {X: Field{[10]uint32{0x032a28e3, 0x033d91df, 0x03f2e0b1, 0x010af48b, 0x03cb08a6, 0x03e3aedc, 0x01a1b0ed, 0x0346d226, 0x012e5398, 0x003c667d}}, Y: Field{[10]uint32{0x02c2f454, 0x02d66167, 0x03d9e5c1, 0x02b15526, 0x012d5278, 0x01fbe6dd, 0x00f87476, 0x004c7533, 0x03aba5e2, 0x000d866a}}}, + {X: Field{[10]uint32{0x0046ad6a, 0x014888fc, 0x00046e27, 0x03d6727f, 0x01e75c86, 0x025e928d, 0x0320bc14, 0x03b3cdaf, 0x0293a5f9, 0x00060aa7}}, Y: Field{[10]uint32{0x03b8bcfd, 0x0079223f, 0x007a5c73, 0x0328d2bc, 0x03e0924d, 0x021585f1, 0x0067693d, 0x03b8632a, 0x0288c39d, 0x00318257}}}, + {X: Field{[10]uint32{0x0214abbb, 0x0026552c, 0x0327c3b5, 0x02b82418, 0x025ac21e, 0x0109dfec, 0x020a7016, 0x03f99ad9, 0x03530636, 0x00022932}}, Y: Field{[10]uint32{0x01d0ed1c, 0x035a49a8, 0x00bbf63f, 0x01709540, 0x008efcb8, 0x0349758e, 0x02e707fa, 0x02a5048f, 0x00514cc6, 0x001a4f96}}}, + {X: Field{[10]uint32{0x008c1282, 0x00224597, 0x018d42b2, 0x023204ef, 0x02f49517, 0x00b1565c, 0x01e31058, 0x030cf845, 0x035a3b40, 0x0012404c}}, Y: Field{[10]uint32{0x004214e3, 0x02760072, 0x0016624d, 0x00393778, 0x00f26a9a, 0x0387c3a5, 0x02c70eb9, 0x01d03772, 0x0176429d, 0x0011c01c}}}, + {X: Field{[10]uint32{0x004e01dd, 0x01048ca6, 0x02b8fcdf, 0x01772b60, 0x01df64f5, 0x02e7cb81, 0x01b49e14, 0x00d8ad18, 0x01a77c34, 0x00206039}}, Y: Field{[10]uint32{0x0305040b, 0x01d0ab2b, 0x03e650de, 0x02704c3c, 0x01cb3fb4, 0x0016b247, 0x034b0fd0, 0x03c402a8, 0x0221d4b9, 0x000d33d5}}}, + {X: Field{[10]uint32{0x0251ee9f, 0x0217f84d, 0x032a4b10, 0x01f2df48, 0x01a90e1d, 0x023aa975, 0x00aeee35, 0x03d2a277, 0x027efea9, 0x0023dc48}}, Y: Field{[10]uint32{0x0255ad73, 0x036bd3a5, 0x01aaee90, 0x01aaf011, 0x03e27267, 0x02e4531f, 0x03c344f3, 0x01e68289, 0x01bcbb2b, 0x00293685}}}, + {X: Field{[10]uint32{0x03b58264, 0x023508f3, 0x02a3ccc6, 0x02a96821, 0x02d1ea8e, 0x00f30669, 0x03592a2a, 0x02eb2c20, 0x0374cdc9, 0x0036fae6}}, Y: Field{[10]uint32{0x00576161, 0x000268d0, 0x022d45b1, 0x03e6d967, 0x0018e86d, 0x02785aef, 0x00732eb7, 0x01fed60c, 0x039283f0, 0x002f99a1}}}, + {X: Field{[10]uint32{0x01591933, 0x02985f5c, 0x02958ab0, 0x037e0c5e, 0x017d9ea4, 0x02014a37, 0x03b09b62, 0x00b2b0f1, 0x013fa7f5, 0x003cca3a}}, Y: Field{[10]uint32{0x02405547, 0x0108c47c, 0x00a60fc0, 0x005f5faf, 0x002f780c, 0x036174e5, 0x01c3f3a7, 0x027a4187, 0x0059811f, 0x001073a3}}}, + {X: Field{[10]uint32{0x00fea051, 0x0033c20c, 0x00b7d8fb, 0x020544c7, 0x01d4ca41, 0x00087091, 0x005f44c2, 0x006fb127, 0x0003416b, 0x0015b53d}}, Y: Field{[10]uint32{0x00bd39ce, 0x028eb614, 0x002a8d35, 0x024b8f60, 0x0051ae1a, 0x035773a3, 0x00cb6373, 0x01defa4d, 0x0133948f, 0x003317d8}}}, + {X: Field{[10]uint32{0x039022b8, 0x03d3af00, 0x03c49e9c, 0x03e819f3, 0x01dd90c9, 0x00c9ff50, 0x02becf2a, 0x01dadf33, 0x004b8bb4, 0x002388b8}}, Y: Field{[10]uint32{0x00286b8b, 0x0064ecc2, 0x01d6d3e4, 0x024b0b20, 0x00934e79, 0x0074fbd6, 0x0103c023, 0x01a5b4d3, 0x02603204, 0x00007e3e}}}, + {X: Field{[10]uint32{0x02f064f6, 0x019f5e83, 0x00e1a518, 0x01cafe7f, 0x02b396eb, 0x033fbeb7, 0x03624dc1, 0x01f1a3e4, 0x02e4b9a7, 0x000d06c8}}, Y: Field{[10]uint32{0x02d9441a, 0x023fe2e4, 0x01e27cfc, 0x01c9f4ca, 0x03af11ed, 0x036f2cb6, 0x0162bcf0, 0x01a55d65, 0x03877bc3, 0x002560e7}}}, + {X: Field{[10]uint32{0x03324763, 0x02c8098e, 0x0305045e, 0x02670002, 0x00e6af97, 0x013ee2a3, 0x01e86809, 0x01044a1e, 0x02939f23, 0x000fa90b}}, Y: Field{[10]uint32{0x0201a623, 0x01af544b, 0x02f59186, 0x028ce2c5, 0x0160a5c0, 0x03b3ea3f, 0x024d51ff, 0x029bc13f, 0x01676f5a, 0x00110c90}}}, + {X: Field{[10]uint32{0x035d625b, 0x0249efd4, 0x0317342f, 0x01829c70, 0x0023d8a6, 0x02337a47, 0x00faa1bb, 0x01453be5, 0x004cef10, 0x002bf9ed}}, Y: Field{[10]uint32{0x008b4b65, 0x02b3f21f, 0x0042751c, 0x01dde8e2, 0x026cfcdd, 0x012c18fb, 0x0151f185, 0x021dcaf3, 0x03885121, 0x001d85e9}}}, + {X: Field{[10]uint32{0x02034d2b, 0x00fef9a8, 0x01dda37a, 0x038ffc38, 0x0112f69e, 0x00b00d74, 0x00ac725f, 0x003531b8, 0x0202abb4, 0x0028d832}}, Y: Field{[10]uint32{0x016b646d, 0x020c9a64, 0x03814fab, 0x01e49568, 0x039d8bbe, 0x0298211b, 0x01d0f723, 0x00fa80c1, 0x01783fec, 0x0005879c}}}, + {X: Field{[10]uint32{0x00011b88, 0x012a16de, 0x0361ec91, 0x02304667, 0x035984d1, 0x02cbb37d, 0x025d9899, 0x03f9f66d, 0x025ff7d9, 0x00041213}}, Y: Field{[10]uint32{0x0176cdc9, 0x01135be5, 0x031844f7, 0x00f5e3de, 0x03e7f4e0, 0x00b05127, 0x01e1086c, 0x01cd5e7b, 0x00e21e13, 0x0004b470}}}, + {X: Field{[10]uint32{0x0256b138, 0x030e71b4, 0x01ba67ee, 0x03996c14, 0x02b11245, 0x0369f79a, 0x0276c40e, 0x02777090, 0x00e15dad, 0x001db0b7}}, Y: Field{[10]uint32{0x0064ce82, 0x033bc57f, 0x03605ed4, 0x01f4fac3, 0x0361a896, 0x010dce68, 0x023fca2a, 0x0020e64b, 0x01ce585b, 0x00366980}}}, + {X: Field{[10]uint32{0x01d4d2e1, 0x0266dd44, 0x0335627b, 0x0220e951, 0x03d1d839, 0x00f71831, 0x004fcb18, 0x03b662c1, 0x01d4c3e6, 0x0019c68c}}, Y: Field{[10]uint32{0x02053088, 0x034dc6c3, 0x01b3b08a, 0x017a94b0, 0x01281f18, 0x03d0ea12, 0x033762fb, 0x03bcfdfb, 0x01152005, 0x001bf763}}}, + {X: Field{[10]uint32{0x02898a37, 0x0384ad9b, 0x032431be, 0x016e9bc5, 0x00c2343a, 0x01fdc706, 0x03729985, 0x01a40c4a, 0x0165a2da, 0x0024743d}}, Y: Field{[10]uint32{0x0332f681, 0x02c8275f, 0x0147a41e, 0x0359c924, 0x01e6393a, 0x007df377, 0x02906a10, 0x028a2355, 0x01b91956, 0x00275a95}}}, + {X: Field{[10]uint32{0x028512ba, 0x03ba6ad8, 0x032d4de9, 0x0379c902, 0x006b90d8, 0x03d37dee, 0x014d0cd8, 0x028b0f2f, 0x00581953, 0x001f967c}}, Y: Field{[10]uint32{0x0242a173, 0x02da6ee6, 0x03dbd9d9, 0x03f8ca3e, 0x0035a012, 0x027c0dc5, 0x0019b0af, 0x01f583bd, 0x01eb74cc, 0x000cec34}}}, + {X: Field{[10]uint32{0x03788a26, 0x024abf87, 0x0380dd34, 0x016f8100, 0x03f43a28, 0x02c7ccbf, 0x02652ada, 0x006fb484, 0x025e0b79, 0x003bde2d}}, Y: Field{[10]uint32{0x0108d306, 0x007346d9, 0x03910abb, 0x03be4e55, 0x00f156cd, 0x013feb00, 0x027ab1b2, 0x02bf08fa, 0x013896d5, 0x0027cf89}}}, + {X: Field{[10]uint32{0x016b7cd3, 0x02337e6d, 0x02e1f50a, 0x0133b9d4, 0x01cb0c0e, 0x0304b2c0, 0x03ce2f5f, 0x00cfb905, 0x00d01998, 0x001e2e5e}}, Y: Field{[10]uint32{0x01560dd9, 0x00251e30, 0x00cd0197, 0x0245c518, 0x01dd631f, 0x005647d7, 0x01701413, 0x001aef8c, 0x01d73726, 0x0027e71f}}}, + {X: Field{[10]uint32{0x00bfe64a, 0x00f49b5c, 0x00ceff1b, 0x03e9ee9f, 0x02906ffd, 0x002aeadc, 0x012f5e88, 0x016883a6, 0x0331f994, 0x0017de16}}, Y: Field{[10]uint32{0x03881c1c, 0x034285ca, 0x0046e0a6, 0x004f9742, 0x01575224, 0x0089e447, 0x021988d3, 0x00e1abfe, 0x000eb3cb, 0x0028f312}}}, + {X: Field{[10]uint32{0x0006b3d1, 0x03a7f95e, 0x00887fce, 0x01f58dd7, 0x0102c388, 0x0112135c, 0x03aadfa4, 0x0124bf3c, 0x01997cbb, 0x0027fb9e}}, Y: Field{[10]uint32{0x0224c22e, 0x02752b3f, 0x00437a12, 0x03c31b19, 0x00c0f0b8, 0x0039f512, 0x03ef25a6, 0x031d807e, 0x03277e94, 0x0010c450}}}, + {X: Field{[10]uint32{0x02e3f30b, 0x0362c313, 0x031020ac, 0x004fe694, 0x02c0f462, 0x036f5f1d, 0x03befd7c, 0x022215ed, 0x015db75d, 0x0004bcb7}}, Y: Field{[10]uint32{0x034097d8, 0x02d2a94c, 0x010216dc, 0x01c1d0b7, 0x00f85105, 0x00e1901c, 0x013ecfad, 0x00127a6b, 0x018b0e85, 0x003389d6}}}, + {X: Field{[10]uint32{0x03997bd7, 0x020c9773, 0x004d5317, 0x027c74aa, 0x02fbb86f, 0x0306dc63, 0x00e2befb, 0x02d470fc, 0x02b43ee2, 0x0031a52b}}, Y: Field{[10]uint32{0x01050977, 0x0221ea3b, 0x03226bdc, 0x003ab9c7, 0x036fc519, 0x02169be0, 0x02c3e5cc, 0x024c44b2, 0x033eb6a6, 0x00105207}}}, + {X: Field{[10]uint32{0x01047ae9, 0x035e32a0, 0x03ab149a, 0x00002182, 0x029bd161, 0x02bcefbe, 0x033493f5, 0x030172eb, 0x024614c5, 0x003f899a}}, Y: Field{[10]uint32{0x00471e6b, 0x006e5506, 0x0320b074, 0x021d255f, 0x00f58ca0, 0x01dca971, 0x00614ada, 0x025352df, 0x02bec446, 0x0038b863}}}, + {X: Field{[10]uint32{0x016118dd, 0x0149a64d, 0x03250d21, 0x039fd9e9, 0x01daff04, 0x03060fc8, 0x03abfa58, 0x02c1f121, 0x01dc0926, 0x001e5d78}}, Y: Field{[10]uint32{0x011409e5, 0x03f1c24d, 0x029d821c, 0x02366e5c, 0x01f94346, 0x02a536b9, 0x014b779d, 0x02cc0329, 0x039744e2, 0x00032612}}}, + {X: Field{[10]uint32{0x018a2b06, 0x01f3c5a8, 0x02951a13, 0x023adff5, 0x00702284, 0x0061b5c0, 0x0109e8e6, 0x00d62682, 0x00db5018, 0x0024d5cf}}, Y: Field{[10]uint32{0x00bf47d5, 0x02439886, 0x010f0265, 0x022bf27d, 0x02caae2d, 0x004db2b3, 0x0090039d, 0x03dabb65, 0x00663047, 0x001ea55f}}}, + {X: Field{[10]uint32{0x01d77660, 0x01febe20, 0x00829fa3, 0x003b8a6d, 0x026771d8, 0x0217f13f, 0x00ac7dd4, 0x01bfae38, 0x021ea60f, 0x00302f4b}}, Y: Field{[10]uint32{0x0335bacd, 0x03fc96c0, 0x0306556a, 0x00ff896b, 0x002effc8, 0x027c91fa, 0x0076267d, 0x03871da4, 0x00fd9edd, 0x001a16dd}}}, + {X: Field{[10]uint32{0x0024bf3e, 0x031a6127, 0x032538c4, 0x00af6a90, 0x01b67685, 0x01575646, 0x02e5f45d, 0x00881e41, 0x00e19319, 0x0015aeb0}}, Y: Field{[10]uint32{0x03c18ebf, 0x0081fb0b, 0x01096a5d, 0x03a7e342, 0x010f5c0a, 0x022c4639, 0x02480bbc, 0x02e04b4b, 0x01d39856, 0x0038efd4}}}, + {X: Field{[10]uint32{0x0142c06c, 0x01347964, 0x03c65231, 0x002ae4f7, 0x015225fa, 0x02617f7b, 0x03ec7c4a, 0x03774baf, 0x0313fe7c, 0x0014ed06}}, Y: Field{[10]uint32{0x03b69c4b, 0x00bfa6f0, 0x03a988f6, 0x008123ca, 0x03cb4ecf, 0x0334af7f, 0x02e038dc, 0x03d59574, 0x025744e4, 0x00243f2e}}}, + {X: Field{[10]uint32{0x02e765bb, 0x03f3cab0, 0x025f5d55, 0x00019d33, 0x00b11364, 0x0060b28b, 0x02baa269, 0x03b6e51f, 0x0231ccc0, 0x002f6817}}, Y: Field{[10]uint32{0x02cf75e8, 0x0371ae9e, 0x0307b447, 0x036aba3d, 0x032fff08, 0x00c23aa5, 0x00593567, 0x01a60a9d, 0x01793123, 0x0025c9d6}}}, + {X: Field{[10]uint32{0x030413d8, 0x03b78552, 0x0189b21a, 0x0254715c, 0x0291196e, 0x023d97e0, 0x0209f19a, 0x0020807f, 0x006a8a90, 0x00123747}}, Y: Field{[10]uint32{0x009b98f5, 0x022d8eb0, 0x017af78c, 0x00367143, 0x01c5a615, 0x0039cbe1, 0x017e2878, 0x00f72994, 0x02fb1a94, 0x001e687d}}}, + {X: Field{[10]uint32{0x012f1f2c, 0x0010e00a, 0x0051c13c, 0x01bcd119, 0x002be834, 0x03a68b52, 0x02ff4e2c, 0x010a323b, 0x0269e28c, 0x001d5018}}, Y: Field{[10]uint32{0x033e996a, 0x03371684, 0x0289f9e7, 0x03377796, 0x00202c44, 0x024bbf11, 0x00d13d76, 0x0201f88f, 0x0097211c, 0x0011d0ec}}}, + {X: Field{[10]uint32{0x0192ee5f, 0x02181288, 0x03165401, 0x0009376a, 0x00744200, 0x010c53ff, 0x000ae4d2, 0x0204ce21, 0x0193bf31, 0x0006a957}}, Y: Field{[10]uint32{0x00bc3bfc, 0x038e3c4b, 0x0118f041, 0x02204d84, 0x017a6a8e, 0x02db2cb3, 0x02ac7e99, 0x027a2995, 0x035492d5, 0x002eaeb0}}}, + {X: Field{[10]uint32{0x037dcf03, 0x01c48311, 0x02fbab93, 0x03d26c5d, 0x0234d214, 0x03627dc8, 0x00fa8503, 0x0318a799, 0x0050db7b, 0x001d6f93}}, Y: Field{[10]uint32{0x00b6f819, 0x015320a5, 0x003fb511, 0x00a9069b, 0x03ed2e5e, 0x0321831a, 0x033d9343, 0x01b6c820, 0x03ba8c60, 0x002d5482}}}, + {X: Field{[10]uint32{0x00ef6c8c, 0x00e0950f, 0x01c7d8d6, 0x002871c9, 0x036508e1, 0x01846e56, 0x00b2486b, 0x022cb435, 0x0022e4ed, 0x003cd812}}, Y: Field{[10]uint32{0x022dc0f5, 0x00e51188, 0x00105f98, 0x00b2c8eb, 0x0075d99d, 0x00b2f5a6, 0x021a412f, 0x02f1a896, 0x00797404, 0x003d016b}}}, + {X: Field{[10]uint32{0x037cefe8, 0x01f7fc39, 0x012bf2d8, 0x0247c107, 0x01da54ee, 0x0380c9ac, 0x015f727a, 0x009afbeb, 0x02e66f93, 0x001b2485}}, Y: Field{[10]uint32{0x01d16517, 0x00ddfece, 0x01704557, 0x01c94194, 0x031ec2f3, 0x03d48c37, 0x0146f922, 0x011f237d, 0x01b9bc19, 0x00192808}}}, + {X: Field{[10]uint32{0x0105668a, 0x0351d35a, 0x03b09e74, 0x03896c4a, 0x00988346, 0x01a01d9e, 0x03138617, 0x01ccb77c, 0x03bdce97, 0x002b91e6}}, Y: Field{[10]uint32{0x02612929, 0x01f02b24, 0x028b3f4b, 0x025fa8fc, 0x02b33a6f, 0x01366f74, 0x01363366, 0x01821e26, 0x0355c599, 0x0028f380}}}, + {X: Field{[10]uint32{0x014898be, 0x01c14b5d, 0x034ff480, 0x029eaabd, 0x039ccc05, 0x01b3f4bd, 0x02abcf83, 0x0136c871, 0x017966f7, 0x0033a4b0}}, Y: Field{[10]uint32{0x001bb978, 0x039e7298, 0x0127ce44, 0x0200fc42, 0x038adebf, 0x0238d15a, 0x019cec9c, 0x00e31329, 0x03f3530f, 0x003cf8f4}}}, + {X: Field{[10]uint32{0x026ea68d, 0x033c589b, 0x03b9f477, 0x0388de28, 0x01a96f5a, 0x02623137, 0x0153d875, 0x01d705dd, 0x02b68152, 0x002282ef}}, Y: Field{[10]uint32{0x03e77f4e, 0x005e60d7, 0x036d64e9, 0x02b08a11, 0x00a7c74e, 0x0216938d, 0x02a9f770, 0x01504ab2, 0x015e46f4, 0x002562de}}}, + {X: Field{[10]uint32{0x01d9ccfe, 0x03944da3, 0x028d00c2, 0x029c721b, 0x027f0e97, 0x017b479e, 0x02a033c0, 0x00038a44, 0x02e99754, 0x0030a913}}, Y: Field{[10]uint32{0x0275668f, 0x02a5514d, 0x03c60596, 0x02e3afda, 0x0170cd17, 0x00ed44da, 0x03b69b29, 0x02941f6f, 0x01ef7d24, 0x0025590d}}}, + {X: Field{[10]uint32{0x019ea1e1, 0x022471c6, 0x01c293cc, 0x02472057, 0x013d3bbe, 0x01510ef3, 0x03785208, 0x037d851e, 0x0225534d, 0x002d857d}}, Y: Field{[10]uint32{0x02c3ea25, 0x037079db, 0x01e12267, 0x0071ace6, 0x00fe3afd, 0x03d97189, 0x02908764, 0x0051a18a, 0x00f199e2, 0x00132afd}}}, + {X: Field{[10]uint32{0x00a75a0e, 0x002e4efa, 0x030b55fd, 0x0153e020, 0x03b64a0c, 0x02602fb9, 0x016dde93, 0x009cab3d, 0x038dfdcf, 0x002bf32b}}, Y: Field{[10]uint32{0x0042a63e, 0x00b05044, 0x00e9554f, 0x01801f62, 0x03e7d6a6, 0x00d6186b, 0x036d9ba7, 0x03113e27, 0x005d6f6f, 0x0002363b}}}, + {X: Field{[10]uint32{0x03135f53, 0x00cf22a6, 0x033ac328, 0x00ab2ce1, 0x03559d07, 0x03de0c02, 0x039395d0, 0x006c987c, 0x02a8c531, 0x0014d05d}}, Y: Field{[10]uint32{0x02b2f436, 0x031f9b22, 0x03643b03, 0x0175a0fb, 0x020b1615, 0x03e9d5be, 0x02f66398, 0x029ed21f, 0x004b5eee, 0x002ae13e}}}, + {X: Field{[10]uint32{0x0391f34c, 0x03f34506, 0x0393ea65, 0x02f194c6, 0x028705ab, 0x00883cfc, 0x03651ac6, 0x025737d1, 0x017397ef, 0x0017dea8}}, Y: Field{[10]uint32{0x0081da22, 0x01215866, 0x02ab8b75, 0x02ef8118, 0x0270cffc, 0x01e9df63, 0x011b28f1, 0x02cd3cbb, 0x00983cdd, 0x001cbdf6}}}, + {X: Field{[10]uint32{0x008f3d3b, 0x00a1ff2b, 0x034490aa, 0x0161a40f, 0x02b6a952, 0x00d6bf5e, 0x001db193, 0x03edcacc, 0x024cc1e2, 0x00353ed2}}, Y: Field{[10]uint32{0x014154f9, 0x02062538, 0x00306088, 0x03de6ba4, 0x02f213ad, 0x037b9e1f, 0x01098cd5, 0x02ca1c67, 0x02e84a9d, 0x001dad5c}}}, + {X: Field{[10]uint32{0x037a9ff4, 0x03515327, 0x035694c6, 0x01716aef, 0x00dad097, 0x00f6c374, 0x013116c2, 0x00bcebde, 0x0163843b, 0x000f719d}}, Y: Field{[10]uint32{0x016753ae, 0x01da980d, 0x01fbf780, 0x01dd3ece, 0x004894b2, 0x0126a022, 0x010ccf80, 0x00edfd0f, 0x039e4db8, 0x00377d96}}}, + {X: Field{[10]uint32{0x02f897d6, 0x01720b28, 0x036b13bb, 0x0176cdb8, 0x039c3e41, 0x00334599, 0x006c4495, 0x0005344e, 0x02bd1edd, 0x00195e44}}, Y: Field{[10]uint32{0x02d505cf, 0x00249fbf, 0x02143430, 0x012327d6, 0x0178205e, 0x03341b1a, 0x007fb3aa, 0x0389023f, 0x03db11bb, 0x00138bf7}}}, + {X: Field{[10]uint32{0x03d69f99, 0x0205c5cf, 0x027b8f90, 0x017f12b7, 0x036f412b, 0x03cffa4d, 0x00473e50, 0x016173d9, 0x03b35f82, 0x00016914}}, Y: Field{[10]uint32{0x00097ebe, 0x02d985d6, 0x00c4fa29, 0x02d5fcad, 0x03ec2fb4, 0x012ae868, 0x01dbf06f, 0x02d64138, 0x02113448, 0x003f05a7}}}, + {X: Field{[10]uint32{0x00052679, 0x02cdece9, 0x03689093, 0x02c83d3f, 0x03d01c68, 0x025a8c10, 0x02cfaf1f, 0x012f21a6, 0x005ac24b, 0x0030eb7d}}, Y: Field{[10]uint32{0x00ae19cc, 0x00ab1a04, 0x017d7edc, 0x020f3b72, 0x014f0d4b, 0x01cae342, 0x0285bea9, 0x012d274e, 0x0207cd37, 0x000f648c}}}, + {X: Field{[10]uint32{0x021e1d56, 0x0103fa57, 0x006b6e90, 0x003eb2c1, 0x035bd84f, 0x007c976b, 0x016420be, 0x0372109d, 0x01c8905d, 0x00068cbb}}, Y: Field{[10]uint32{0x00eb4c51, 0x0108591a, 0x0059c0ca, 0x0203e33e, 0x03f1612c, 0x01a98bd3, 0x00b73ad1, 0x01dfe307, 0x019d113a, 0x001fd19f}}}, + {X: Field{[10]uint32{0x034d6c98, 0x00efc829, 0x006b7b4a, 0x010bac69, 0x02f925c1, 0x03944092, 0x028b7da2, 0x025deb0c, 0x019862e5, 0x001c255f}}, Y: Field{[10]uint32{0x02f09381, 0x03f49cef, 0x03ec1441, 0x00c7c8c9, 0x037d7ee2, 0x02074b14, 0x01513488, 0x0330d282, 0x02c62e42, 0x0009a6d5}}}, + {X: Field{[10]uint32{0x037537a7, 0x03b72120, 0x02b44bd7, 0x015b65da, 0x01bf6dd2, 0x02db37c9, 0x03ae4540, 0x02c5b041, 0x00165a02, 0x0001f9a5}}, Y: Field{[10]uint32{0x005185f5, 0x01a09ad1, 0x03b243e6, 0x0075e28d, 0x03a6aac2, 0x00f91cd8, 0x010d2ce0, 0x0030478b, 0x00db3836, 0x003fee1d}}}, + {X: Field{[10]uint32{0x01df9678, 0x0355495b, 0x018b60ee, 0x01d78ded, 0x003b9d8a, 0x03d10176, 0x03e7ac6f, 0x03a6d492, 0x01597b42, 0x0013e068}}, Y: Field{[10]uint32{0x02e0a78c, 0x02e125e1, 0x038b377c, 0x035e6494, 0x003558ee, 0x0349f7d3, 0x00ffbe16, 0x018196b6, 0x02071867, 0x002c94c4}}}, + {X: Field{[10]uint32{0x014fd547, 0x0068d74a, 0x002d9359, 0x03586f74, 0x009be6fd, 0x024e04cd, 0x020be8de, 0x0196bc2d, 0x03685770, 0x003e8940}}, Y: Field{[10]uint32{0x00e81625, 0x01873512, 0x02f06d4d, 0x029deda5, 0x033b0a1f, 0x03d7b842, 0x0242f0dc, 0x01f2fd75, 0x01e396c7, 0x003c2e64}}}, + {X: Field{[10]uint32{0x032ba3d4, 0x03c09689, 0x02c4d440, 0x0312961d, 0x006b61d6, 0x00ffb1b6, 0x03da5172, 0x00aff0f8, 0x02bd6716, 0x003d37d7}}, Y: Field{[10]uint32{0x0052212b, 0x038ca860, 0x00d44674, 0x016e425c, 0x026380dc, 0x0278dd73, 0x010e384c, 0x017ecb56, 0x02798bc7, 0x002c8ee8}}}, + {X: Field{[10]uint32{0x01ac5015, 0x021c1da8, 0x0141c4a5, 0x00681955, 0x0051b897, 0x0111835b, 0x0228e5c4, 0x016d97eb, 0x031db372, 0x002ad6da}}, Y: Field{[10]uint32{0x02ee2ece, 0x03a972c9, 0x02a9e286, 0x02e3422d, 0x00424f72, 0x01e16b7c, 0x01d7876d, 0x005c60ea, 0x0057ecdc, 0x0005b4b1}}}, + {X: Field{[10]uint32{0x00869e55, 0x01df380a, 0x03981ac8, 0x0264f0c3, 0x0002e08d, 0x01c34e29, 0x0280dcc4, 0x014dc101, 0x007e13db, 0x002a293b}}, Y: Field{[10]uint32{0x037f60a4, 0x01205472, 0x007bb2d2, 0x0356eaec, 0x00754025, 0x01961e29, 0x03d08749, 0x03b94e25, 0x019c2cdf, 0x0012a77b}}}, + {X: Field{[10]uint32{0x00245f48, 0x02c5042e, 0x00faa5f1, 0x03678aaf, 0x016f914d, 0x01970404, 0x0183d081, 0x01836c01, 0x00f633bd, 0x000cdfd5}}, Y: Field{[10]uint32{0x0176dbfc, 0x0159dc60, 0x00a94ea4, 0x0395022c, 0x00679b58, 0x00eaeb93, 0x035452bd, 0x03f12902, 0x0328696a, 0x002514fa}}}, + {X: Field{[10]uint32{0x01901b53, 0x0190ad7f, 0x020e433b, 0x00354a74, 0x00f6db48, 0x00694153, 0x004c7674, 0x02abc415, 0x03abdc2b, 0x003bb8cd}}, Y: Field{[10]uint32{0x029c27be, 0x019091e1, 0x01830872, 0x03357db2, 0x00825616, 0x01a55be2, 0x03a1d8ba, 0x00035292, 0x038802cc, 0x00196b56}}}, + {X: Field{[10]uint32{0x012f1548, 0x00ff3bdd, 0x010b8451, 0x01f143c0, 0x00f56e47, 0x010fc49d, 0x01aaf0cb, 0x00002bb0, 0x021857cb, 0x00167d4b}}, Y: Field{[10]uint32{0x021698be, 0x0383d4e7, 0x00e70a1a, 0x018665e3, 0x014f2254, 0x01bb078a, 0x007006ba, 0x00ec6601, 0x036e8db0, 0x003632a3}}}, + {X: Field{[10]uint32{0x006f3e12, 0x0297c150, 0x0115e8f5, 0x0043cad2, 0x038583ab, 0x01f618a1, 0x01618d9d, 0x036caa2a, 0x020c25fa, 0x001b0802}}, Y: Field{[10]uint32{0x038081f8, 0x03b6527b, 0x03a617d6, 0x0276c5e4, 0x00050464, 0x0170343e, 0x01af24da, 0x03cd7051, 0x004e374c, 0x00053526}}}, + {X: Field{[10]uint32{0x02ac07fa, 0x03fef0e2, 0x002a032c, 0x03e2628f, 0x02f8144f, 0x00e6d95e, 0x02ad8782, 0x02dbe1c6, 0x02fd51df, 0x00059528}}, Y: Field{[10]uint32{0x021a839c, 0x02410f45, 0x037148d5, 0x0317e977, 0x00e36d46, 0x031c5c17, 0x00dcc1d4, 0x0215a6db, 0x01c382d9, 0x0022da59}}}, + {X: Field{[10]uint32{0x03556d77, 0x008cbdd9, 0x02fae8de, 0x0301fa63, 0x027b3ed1, 0x014fe5b5, 0x0182f339, 0x00d55b26, 0x03c9ab47, 0x0031200c}}, Y: Field{[10]uint32{0x01968bac, 0x01ead2fb, 0x002b6f89, 0x01520a2c, 0x010abe4a, 0x0373feab, 0x03873828, 0x00c5a041, 0x00a87bc4, 0x002bcfd2}}}, + {X: Field{[10]uint32{0x003c6032, 0x01390a0f, 0x003baf1a, 0x007c084b, 0x001a9577, 0x015fdea6, 0x005aaea5, 0x00a35462, 0x03faa9d2, 0x0017765d}}, Y: Field{[10]uint32{0x032eb656, 0x01ca8de3, 0x02b4549e, 0x03349d2f, 0x02abb06a, 0x036a81bc, 0x00e52043, 0x023db34b, 0x014aba17, 0x000effe7}}}, + {X: Field{[10]uint32{0x0242a564, 0x03f7ca73, 0x032abefe, 0x01a69760, 0x03261e4c, 0x00f26aba, 0x03f1d8af, 0x025b12f3, 0x0025dd9a, 0x000a9db7}}, Y: Field{[10]uint32{0x01244806, 0x02ad31b5, 0x02c5b2fc, 0x02ab7d85, 0x0307ff82, 0x03d70e20, 0x00c972aa, 0x032b9f7a, 0x02f23ad5, 0x00124d14}}}, + {X: Field{[10]uint32{0x029a4b8d, 0x02e3d2f4, 0x02d6ff2d, 0x02a69279, 0x02fd3935, 0x01198aca, 0x02bab4db, 0x01e48e08, 0x01064c0e, 0x00336f4d}}, Y: Field{[10]uint32{0x017a90ce, 0x03828f15, 0x03143a8c, 0x0054550f, 0x0358b845, 0x021bf6d7, 0x008a84c3, 0x009d3e9a, 0x032eb61e, 0x002c849b}}}, + {X: Field{[10]uint32{0x0354d978, 0x03dc974a, 0x02a75bf6, 0x00969051, 0x012bcfd5, 0x01c4ebfe, 0x0182d6ce, 0x0353d8d3, 0x009b2cb9, 0x00260fc9}}, Y: Field{[10]uint32{0x028abca2, 0x03c12122, 0x033ef0cf, 0x01dc8e20, 0x02af302e, 0x0280b6af, 0x004d25f5, 0x0380b69b, 0x0006850b, 0x001e7349}}}, + {X: Field{[10]uint32{0x00afd4f4, 0x0370630e, 0x0138396f, 0x0227eb78, 0x019e1284, 0x03ec8f94, 0x017e21ef, 0x02a7ce89, 0x01b4a5a0, 0x002231d9}}, Y: Field{[10]uint32{0x015f46c2, 0x0226df56, 0x006971cf, 0x038d170a, 0x02e3336a, 0x034511a0, 0x005cc031, 0x02568f94, 0x02647299, 0x003d357f}}}, + {X: Field{[10]uint32{0x03d52c31, 0x01e960ad, 0x036926b6, 0x001d1580, 0x031d147d, 0x02234398, 0x01c7d08b, 0x032c2866, 0x01ecd603, 0x00065d41}}, Y: Field{[10]uint32{0x01057f15, 0x0158793e, 0x0208f49a, 0x037e88d3, 0x002f212a, 0x0169d6bb, 0x035a7461, 0x017f142b, 0x013bf2d7, 0x00251fb0}}}, + {X: Field{[10]uint32{0x032eaaf8, 0x00c82d8e, 0x00fec668, 0x003fad8e, 0x019a1979, 0x035af013, 0x02700c30, 0x01817d62, 0x0232e10f, 0x00260610}}, Y: Field{[10]uint32{0x03f9c85b, 0x01e3873b, 0x03d7f395, 0x024aac62, 0x01dbbdf1, 0x01b0c7d6, 0x02a837e3, 0x03e8e4c3, 0x02edc0e2, 0x003bcc1d}}}, + {X: Field{[10]uint32{0x000bc002, 0x03e388db, 0x02764892, 0x0205a1a6, 0x02f0c7d0, 0x00c899c3, 0x00f47a9e, 0x004d2de4, 0x0335cba0, 0x00143c36}}, Y: Field{[10]uint32{0x00396072, 0x00cff2da, 0x00edd832, 0x0112e181, 0x009e466b, 0x02389976, 0x03260f65, 0x0213ab9d, 0x0013d98a, 0x000706c7}}}, + {X: Field{[10]uint32{0x01665502, 0x00770c75, 0x03a8680c, 0x005b35af, 0x0099ac85, 0x03d08a3d, 0x00bb19f3, 0x02ed42b9, 0x00ea1a44, 0x003678d0}}, Y: Field{[10]uint32{0x034aaad8, 0x03d2cd56, 0x00f75355, 0x02b49412, 0x01341445, 0x020eebba, 0x0005251b, 0x00864ffe, 0x0288335a, 0x0004a285}}}, + {X: Field{[10]uint32{0x007c539c, 0x00f03e3a, 0x034c91e3, 0x02a42a51, 0x01d42cb4, 0x01557706, 0x03067020, 0x01377631, 0x013301b8, 0x00056aa0}}, Y: Field{[10]uint32{0x0142dbc1, 0x031a9b62, 0x03b1de22, 0x011d17d8, 0x032a14bf, 0x01d8b32e, 0x01d2ba17, 0x019003af, 0x03209658, 0x001e54c1}}}, + {X: Field{[10]uint32{0x025d34d2, 0x0060be1e, 0x0024255e, 0x00608d81, 0x03d489dd, 0x01f1ef88, 0x010d169c, 0x026936e4, 0x030453d1, 0x001bdc21}}, Y: Field{[10]uint32{0x01c7dde2, 0x01e2aa66, 0x02101355, 0x03f569b7, 0x01c15246, 0x01f136ee, 0x029beabd, 0x00afd282, 0x01567c1c, 0x003814c6}}}, + {X: Field{[10]uint32{0x03167674, 0x03e370f1, 0x03f1bf33, 0x0163f8b4, 0x03867f9a, 0x01a2153d, 0x02d97e91, 0x028e9226, 0x00dfcddc, 0x000c7a48}}, Y: Field{[10]uint32{0x03706f39, 0x020a4030, 0x038afdbe, 0x017ec4b2, 0x01244a9c, 0x03af89f7, 0x01576600, 0x01b96054, 0x003d0b0c, 0x00149c4b}}}, + {X: Field{[10]uint32{0x008d51d8, 0x007cb693, 0x015ab8d0, 0x030a1a8c, 0x028258de, 0x00622325, 0x0381fbcf, 0x03c0765b, 0x0211708f, 0x0024cc03}}, Y: Field{[10]uint32{0x026c33ff, 0x00f52838, 0x01f464c9, 0x00d8495b, 0x009e0b76, 0x01961393, 0x0049b536, 0x00823021, 0x02473b6a, 0x00054da1}}}, + {X: Field{[10]uint32{0x03acb3db, 0x0153d973, 0x017dcecd, 0x00c9c81e, 0x0230c946, 0x01c4b072, 0x016cfdf3, 0x019c0818, 0x010bf62d, 0x0023deb5}}, Y: Field{[10]uint32{0x0043c637, 0x03e2d121, 0x01d347e4, 0x01c4197e, 0x001eff0d, 0x00686532, 0x0290080a, 0x014af0cc, 0x023207dc, 0x0016b042}}}, + {X: Field{[10]uint32{0x0189f4a9, 0x022921ca, 0x03dd7445, 0x007723be, 0x027f5cf5, 0x01431822, 0x028f5d73, 0x0035c711, 0x03827627, 0x001bb602}}, Y: Field{[10]uint32{0x01826dc0, 0x0248f422, 0x035a2e00, 0x03c8058e, 0x0177fd3c, 0x01a1f1f8, 0x01e47b7c, 0x039ded19, 0x03f738f6, 0x002f2e8a}}}, + {X: Field{[10]uint32{0x00e3714c, 0x00aed2df, 0x01e38eea, 0x02ca1a52, 0x027c2b11, 0x01dfab68, 0x02cb85f7, 0x02278a58, 0x017db949, 0x003b1b07}}, Y: Field{[10]uint32{0x02d08fdd, 0x02c0c3a7, 0x02516df3, 0x01354bf3, 0x018ef266, 0x02f295d5, 0x00089d0e, 0x037f6c75, 0x01af6042, 0x002b767e}}}, + {X: Field{[10]uint32{0x0237f093, 0x00982112, 0x0335c1fe, 0x023a5519, 0x01c59bca, 0x0042166e, 0x03a82d35, 0x03064964, 0x032c24dc, 0x0023ddf2}}, Y: Field{[10]uint32{0x03e07202, 0x0266cf13, 0x02213831, 0x02f561f9, 0x00423fde, 0x0029c32e, 0x0355bd4f, 0x0267e9c2, 0x0186fbf4, 0x001459d2}}}, + {X: Field{[10]uint32{0x024b6aca, 0x01e30741, 0x0049f1fd, 0x035890f4, 0x011122f2, 0x03d28cb7, 0x00c4ed62, 0x00c6bea9, 0x0374dae8, 0x0038ab77}}, Y: Field{[10]uint32{0x028b2297, 0x020463f8, 0x0323ccf5, 0x02808296, 0x00a73a1a, 0x0369984a, 0x02560224, 0x03ec2c22, 0x03941ead, 0x001f6f2c}}}, + {X: Field{[10]uint32{0x02b1e3eb, 0x011768c0, 0x0072d3e8, 0x0144d2ea, 0x033a22b1, 0x0233516c, 0x03b7c6db, 0x00c7266b, 0x01bc614d, 0x002fdebc}}, Y: Field{[10]uint32{0x00125a21, 0x00bb0b14, 0x03239754, 0x0193c49d, 0x012b8504, 0x00c99ef5, 0x029e2552, 0x02288bee, 0x01e78cf8, 0x0004234e}}}, + {X: Field{[10]uint32{0x02fe50e4, 0x03af1663, 0x01987093, 0x01a29d60, 0x0035b4f0, 0x014b60b3, 0x012c5f69, 0x0196016e, 0x007f0cec, 0x000223ff}}, Y: Field{[10]uint32{0x01378a4c, 0x03713693, 0x00cf4a63, 0x03262e7a, 0x00d39193, 0x008e5159, 0x01558c78, 0x00b0fae8, 0x00ca94b4, 0x000e0b6b}}}, + {X: Field{[10]uint32{0x013a152b, 0x00d4f51f, 0x003b7a28, 0x001cd33e, 0x039070e2, 0x00dbaac9, 0x00569ae6, 0x02b982e7, 0x03840ef4, 0x002c4528}}, Y: Field{[10]uint32{0x00a3fa70, 0x02311df3, 0x03001b18, 0x01d9b629, 0x03bb8260, 0x02ef972f, 0x036438c9, 0x03882981, 0x033ce58e, 0x000df1d9}}}, + {X: Field{[10]uint32{0x03e801b0, 0x036cea31, 0x009da627, 0x00ac6453, 0x00cfb0cd, 0x00c4064b, 0x0368fa1e, 0x008edbe9, 0x002fe20d, 0x00390469}}, Y: Field{[10]uint32{0x019b1039, 0x02140225, 0x0080b91c, 0x02ba2bb1, 0x028f6828, 0x00a2bca6, 0x012bbc17, 0x01e601c9, 0x039b43ee, 0x003fac6d}}}, + {X: Field{[10]uint32{0x00ee1999, 0x0053f35d, 0x00fd7cb8, 0x035fc7d2, 0x0031057a, 0x037979f1, 0x005182ae, 0x008c4f02, 0x007e4643, 0x000647da}}, Y: Field{[10]uint32{0x026dbc72, 0x03d2c7a4, 0x001e60e4, 0x0100f542, 0x0043e5c5, 0x00e02336, 0x0239efb8, 0x0338b566, 0x002b3f77, 0x0015192d}}}, + {X: Field{[10]uint32{0x006bcd81, 0x0023ae54, 0x01bf0b22, 0x01321686, 0x03983774, 0x006bbd4d, 0x018c4ff0, 0x02927bd8, 0x017733b0, 0x0018ffd2}}, Y: Field{[10]uint32{0x00593d3b, 0x0126ca4c, 0x020903ae, 0x02321f89, 0x0039535d, 0x02a4fca9, 0x0287b500, 0x0164c7ce, 0x0397ca83, 0x001b32bb}}}, + {X: Field{[10]uint32{0x03fc2c1c, 0x01f96b6d, 0x015564c5, 0x0291a361, 0x00f4ce72, 0x00ba318a, 0x027056c0, 0x0016e9a7, 0x0025c377, 0x003bf8d9}}, Y: Field{[10]uint32{0x01970ad5, 0x02443014, 0x032d08dd, 0x0049485c, 0x028faa7f, 0x00b956ec, 0x01a5f52c, 0x0127160c, 0x035f27ac, 0x000e4ae6}}}, + {X: Field{[10]uint32{0x037e94a5, 0x0001477d, 0x00a99988, 0x00dd3968, 0x02841d47, 0x005c1287, 0x01419102, 0x0302346f, 0x026bdd7c, 0x0001b484}}, Y: Field{[10]uint32{0x00e6e806, 0x01be55a1, 0x015f55da, 0x02c236bd, 0x03efb4d4, 0x02b50849, 0x0372ce6e, 0x02fa5d4b, 0x023acda1, 0x000ba6e0}}}, + {X: Field{[10]uint32{0x00933743, 0x037da941, 0x02f54b20, 0x03261ad3, 0x006d453a, 0x00732a4f, 0x006340dc, 0x02716e47, 0x03f4297d, 0x0033dee7}}, Y: Field{[10]uint32{0x03670c15, 0x02ea8ffa, 0x012ca083, 0x031078d8, 0x00c20613, 0x03dd46d5, 0x01efec2b, 0x0000ac44, 0x008a2c07, 0x002295e0}}}, + {X: Field{[10]uint32{0x01f7e83e, 0x0093f981, 0x023f2c15, 0x02ffdf00, 0x0027f5a5, 0x038b5568, 0x01ba4e80, 0x017b8747, 0x002b4cbe, 0x002c5809}}, Y: Field{[10]uint32{0x000fb5a0, 0x016e318f, 0x01567607, 0x03d19f42, 0x024f1faa, 0x03ece74f, 0x02e9f540, 0x0049801f, 0x03956cf3, 0x0002b0d5}}}, + {X: Field{[10]uint32{0x02bb050e, 0x0336a95a, 0x02733c02, 0x031b7f43, 0x021744d9, 0x0098669c, 0x013dce02, 0x0063661b, 0x012c4f89, 0x001ea191}}, Y: Field{[10]uint32{0x010de179, 0x02daf172, 0x0285a91e, 0x03e90f62, 0x00542370, 0x025b3d15, 0x02a1fb35, 0x02c383ee, 0x031cb558, 0x000c34c2}}}, + {X: Field{[10]uint32{0x002323b9, 0x0014bfd6, 0x01372408, 0x01024e07, 0x00af41ba, 0x025f19dc, 0x0296d3ab, 0x001bbc3a, 0x001a64d2, 0x00289e6f}}, Y: Field{[10]uint32{0x00e42046, 0x0129af1b, 0x0261da1b, 0x034d2d60, 0x02e96199, 0x0380cc60, 0x01a7ab1f, 0x02f1119e, 0x013d701e, 0x002bbf21}}}, + {X: Field{[10]uint32{0x01e5cc76, 0x039bb1aa, 0x0301a0d4, 0x0218987a, 0x00f76918, 0x03167e1a, 0x00c301aa, 0x0005ad82, 0x01705c16, 0x003a38a1}}, Y: Field{[10]uint32{0x030a983d, 0x02cfab27, 0x01eb8f2f, 0x01989da6, 0x02c988ea, 0x02509c9c, 0x0303b7a4, 0x0201442d, 0x0315f8e7, 0x00248d40}}}, + {X: Field{[10]uint32{0x029f2bbd, 0x03833862, 0x03e73459, 0x0216e4e6, 0x0046da15, 0x01cd3e73, 0x015f300a, 0x03f20601, 0x02f814f3, 0x0007f673}}, Y: Field{[10]uint32{0x00abb55e, 0x02230367, 0x025cd264, 0x02a5e528, 0x00c26d79, 0x00117c08, 0x003c71bc, 0x033239bb, 0x033fa50f, 0x0037313d}}}, + {X: Field{[10]uint32{0x027e5f11, 0x006b41a4, 0x0174d39f, 0x02db3d39, 0x03c609d4, 0x03cd93db, 0x0148942d, 0x017f583f, 0x02fc7027, 0x000c86c6}}, Y: Field{[10]uint32{0x00add33d, 0x015118e0, 0x01680c5b, 0x03e3b40a, 0x03725a80, 0x0293207e, 0x01ad36f8, 0x02cc46ba, 0x00ef808b, 0x0004da3b}}}, + {X: Field{[10]uint32{0x02d7bf72, 0x02310bbd, 0x01741810, 0x02731433, 0x03f9ef1e, 0x0037b095, 0x010cad9b, 0x038e4f6b, 0x01fb6518, 0x00137fca}}, Y: Field{[10]uint32{0x00dfb70c, 0x003d308c, 0x00efde4d, 0x022d20c1, 0x02d92f8f, 0x004fb23d, 0x03bfd067, 0x013a0935, 0x006e05aa, 0x0010565e}}}, + {X: Field{[10]uint32{0x00ed1e0b, 0x00dcfdd7, 0x001b9274, 0x01ca56a3, 0x00c839b9, 0x028fcb95, 0x03162e11, 0x00157196, 0x00a5eb63, 0x0024dea1}}, Y: Field{[10]uint32{0x0166afc6, 0x0253cdde, 0x01954532, 0x02c6a73e, 0x0162c122, 0x038f9e8b, 0x03fb3b52, 0x028d4769, 0x00bbbf11, 0x00280c1e}}}, + {X: Field{[10]uint32{0x016cc3d2, 0x03c111fa, 0x03c7a56d, 0x024ecc5d, 0x0156f073, 0x0176dff1, 0x032a87d2, 0x01cee13e, 0x029b7cab, 0x002f8fea}}, Y: Field{[10]uint32{0x02faf77f, 0x02625a02, 0x00ee1029, 0x01a9f8d2, 0x02927644, 0x03a47dfd, 0x01dacc44, 0x0252bd5c, 0x02e01ad7, 0x0039c147}}}, + {X: Field{[10]uint32{0x016c9b41, 0x0037c55d, 0x021f8c68, 0x004ec3ef, 0x0136928d, 0x001635f7, 0x01d24da6, 0x035419d9, 0x006bcc36, 0x00162ce7}}, Y: Field{[10]uint32{0x023d74ff, 0x00b4fc10, 0x0063dad7, 0x0278315e, 0x03b4ecd9, 0x00fdeb9b, 0x0012b777, 0x011b669d, 0x0291aaa8, 0x001127a5}}}, + {X: Field{[10]uint32{0x03765798, 0x00af7270, 0x007b2819, 0x00ac71cb, 0x008c9128, 0x02195d0b, 0x00e21000, 0x002d19c8, 0x0171b166, 0x0026c62a}}, Y: Field{[10]uint32{0x02e0f49f, 0x024b8c4c, 0x03d506c7, 0x00dc1673, 0x022be28d, 0x02819405, 0x0007a934, 0x03e0f4b3, 0x012298ad, 0x000a04b9}}}, + {X: Field{[10]uint32{0x02c0f59e, 0x0286cfb7, 0x002d7f73, 0x031724a5, 0x02c86740, 0x005de209, 0x035e2076, 0x0352f5e8, 0x0003dbac, 0x0029b113}}, Y: Field{[10]uint32{0x0056077f, 0x0124f31c, 0x000e0797, 0x027b1032, 0x022258d2, 0x02abce71, 0x03737278, 0x00d041da, 0x037cd1fa, 0x001ccc5a}}}, + {X: Field{[10]uint32{0x01682ee3, 0x00168e88, 0x03aaa21a, 0x010eefe8, 0x005dde20, 0x012b5e28, 0x037495b9, 0x03e35760, 0x0355628f, 0x0007fec9}}, Y: Field{[10]uint32{0x03b5943b, 0x016bfe36, 0x02fec5f9, 0x02b71a43, 0x03a71243, 0x01c38aa0, 0x019962df, 0x022db3ff, 0x00f7006b, 0x0012811e}}}, + {X: Field{[10]uint32{0x019b8283, 0x03c79e10, 0x0025c3d6, 0x039c23ed, 0x02b67a21, 0x023b97dc, 0x02538a80, 0x00451120, 0x008e3605, 0x002ba931}}, Y: Field{[10]uint32{0x01a80b27, 0x01aeea50, 0x0099b221, 0x00c1ad91, 0x0282c7b5, 0x039c44cc, 0x009d216c, 0x02ce5ef6, 0x02b8c28e, 0x001145f2}}}, + {X: Field{[10]uint32{0x034ed3eb, 0x025e6402, 0x03127f52, 0x0050e0af, 0x030b972f, 0x0000f29b, 0x036fabb5, 0x0009c210, 0x03fa5f8c, 0x00377166}}, Y: Field{[10]uint32{0x03d995c1, 0x0014d17a, 0x02696996, 0x0200ea65, 0x01ad7dbc, 0x0108117a, 0x00370b67, 0x01d6d94f, 0x019fb80e, 0x003db0fc}}}, + {X: Field{[10]uint32{0x014c80a8, 0x00f162c1, 0x0237d0d0, 0x032619a9, 0x0394d204, 0x011d0bdb, 0x03f83ed6, 0x006cb58a, 0x03e7ed30, 0x00088613}}, Y: Field{[10]uint32{0x0179b442, 0x00d85020, 0x00ab4ace, 0x01a8ee03, 0x013bc55d, 0x015a6095, 0x03a389dc, 0x028f5585, 0x01281073, 0x00276c9d}}}, + {X: Field{[10]uint32{0x0201cef3, 0x02a8debc, 0x02eeaf98, 0x00421c4d, 0x036488c5, 0x02ebf0f2, 0x030ed2d6, 0x01bd29d2, 0x03f474e4, 0x00396185}}, Y: Field{[10]uint32{0x02aa2220, 0x013e393c, 0x019d436d, 0x038b93d4, 0x00c6b141, 0x0126906c, 0x03f2047d, 0x038179c6, 0x037552dd, 0x00331a9c}}}, + {X: Field{[10]uint32{0x024f8e41, 0x0280de60, 0x0046c5b2, 0x003c740a, 0x02b7394a, 0x029cecfc, 0x02c2c5ab, 0x0317fb79, 0x00925add, 0x00306a90}}, Y: Field{[10]uint32{0x028c687b, 0x0161b074, 0x0357028b, 0x009815c4, 0x032475bf, 0x0020ead4, 0x016ce735, 0x03d58254, 0x0307e30a, 0x0025c4eb}}}, + {X: Field{[10]uint32{0x01df6168, 0x034a46b0, 0x01b5ac08, 0x0082c2dc, 0x0069e4d3, 0x001931c6, 0x00cd1c23, 0x01916407, 0x008d8957, 0x0012a976}}, Y: Field{[10]uint32{0x0113e6e6, 0x0034cab2, 0x006adf24, 0x020b7396, 0x010c0484, 0x01e01920, 0x0336cc3f, 0x00a23b1a, 0x001b915c, 0x000743a9}}}, + {X: Field{[10]uint32{0x02a8a977, 0x025be4e8, 0x031e7432, 0x01c4e477, 0x02738d41, 0x02a1a680, 0x025e192f, 0x01e0d372, 0x01917313, 0x0024e1db}}, Y: Field{[10]uint32{0x026457a4, 0x01beeb5e, 0x03c3de2d, 0x023e74a9, 0x0173fc6c, 0x015e1a9a, 0x0263d9dd, 0x03514093, 0x023d32ba, 0x001e5211}}}, + {X: Field{[10]uint32{0x011b7b28, 0x012243ea, 0x006ee50e, 0x00295310, 0x035d1808, 0x00bcabcd, 0x033dd13f, 0x020096c8, 0x017d3026, 0x00032033}}, Y: Field{[10]uint32{0x0318bc4b, 0x03f9486d, 0x00292278, 0x03249e1c, 0x019e6260, 0x031eb49d, 0x008f904a, 0x0047e459, 0x018b1f1d, 0x0027dced}}}, + {X: Field{[10]uint32{0x00c8c5cb, 0x010943a8, 0x01bb8fba, 0x0310f39e, 0x00e8e7e7, 0x01ea70c3, 0x004e8579, 0x028d16a3, 0x00d97dd4, 0x0034af49}}, Y: Field{[10]uint32{0x02494b9e, 0x0059ae41, 0x030f7665, 0x0257b868, 0x00055ae8, 0x0027ac0a, 0x03310558, 0x0064c640, 0x00b815cb, 0x000cc3c3}}}, + {X: Field{[10]uint32{0x01d7e9f4, 0x000cc1d7, 0x038b8dc3, 0x02254568, 0x015d7225, 0x00eae605, 0x015457df, 0x03a863ec, 0x03a290de, 0x00353928}}, Y: Field{[10]uint32{0x027d1c21, 0x0308774f, 0x038a56ee, 0x01b2e452, 0x0271c57a, 0x014867a6, 0x02bdc9ba, 0x03b2c5d0, 0x013e77d0, 0x00121512}}}, + {X: Field{[10]uint32{0x03236d19, 0x026f9b51, 0x02bea277, 0x00b85807, 0x03d318f8, 0x0039db8a, 0x011b246f, 0x038e67f3, 0x00f4810d, 0x003c3edb}}, Y: Field{[10]uint32{0x00595daf, 0x03b779eb, 0x00d07ad0, 0x034df3d6, 0x022cc9b4, 0x03aca907, 0x030b1973, 0x0008e622, 0x01606648, 0x0038eb54}}}, + {X: Field{[10]uint32{0x00858939, 0x01cec40d, 0x03ab0ebf, 0x03c66191, 0x039a4f9d, 0x000ac3f1, 0x0191740d, 0x011c30da, 0x018e3f4c, 0x003753b1}}, Y: Field{[10]uint32{0x00a3bfe3, 0x00df6810, 0x0246417e, 0x024253fe, 0x00737a63, 0x0107a4b7, 0x038c8395, 0x01633bc9, 0x0086a3b0, 0x000e9bb3}}}, + {X: Field{[10]uint32{0x03904e51, 0x02baedea, 0x01a8b8fd, 0x00eb771d, 0x012af12f, 0x013dab78, 0x02fe1b6c, 0x03655353, 0x01101d7e, 0x0003b15a}}, Y: Field{[10]uint32{0x0050c54a, 0x02df9435, 0x01d6dbe0, 0x02b6cb30, 0x01be7cba, 0x008bc988, 0x027111ae, 0x013dc50c, 0x027f5d59, 0x000d25f1}}}, + {X: Field{[10]uint32{0x03aa35c5, 0x03668676, 0x03da5a85, 0x02c38a2a, 0x03e25ef6, 0x013b70f2, 0x025e1aa6, 0x015a95f2, 0x02f80518, 0x00329177}}, Y: Field{[10]uint32{0x003521b2, 0x034cf6dc, 0x03df04d1, 0x01a569e8, 0x026eb4ed, 0x0044dcb0, 0x013fcde1, 0x02e7af80, 0x0357268d, 0x0036e2c8}}}, + {X: Field{[10]uint32{0x01b49a47, 0x03702485, 0x022e65f6, 0x00550d73, 0x0040f8ba, 0x03722925, 0x003c8b63, 0x00878920, 0x03889645, 0x002d1314}}, Y: Field{[10]uint32{0x02198d00, 0x018aa0f7, 0x031f5724, 0x02a7076b, 0x01509890, 0x021459ae, 0x0125e04b, 0x012e033c, 0x035df30c, 0x000b8590}}}, + {X: Field{[10]uint32{0x005dea26, 0x033fb2b8, 0x00603666, 0x0386d66d, 0x0333a20c, 0x02d1b65d, 0x01291a54, 0x00bc503a, 0x01e23586, 0x00256dcd}}, Y: Field{[10]uint32{0x024aabb9, 0x01159d49, 0x02553211, 0x02c4a1ba, 0x00f22ab5, 0x01ba0302, 0x03c9977b, 0x02f86426, 0x03055f38, 0x00384a05}}}, + {X: Field{[10]uint32{0x03e5bdfc, 0x024a3b5c, 0x027cee56, 0x02c99b06, 0x00a15c71, 0x03b91c5b, 0x028d2313, 0x00098db3, 0x00678fbb, 0x0020f676}}, Y: Field{[10]uint32{0x03949246, 0x021a1eda, 0x00545991, 0x0308df7e, 0x00c35027, 0x0267d280, 0x03e7d784, 0x03c4cbbf, 0x002fbe92, 0x00381253}}}, + {X: Field{[10]uint32{0x01bbae03, 0x010ddc12, 0x016f02e8, 0x0233cc37, 0x031d3b47, 0x02453891, 0x036bad16, 0x0151b6ef, 0x0085a04c, 0x000262df}}, Y: Field{[10]uint32{0x032ace57, 0x02718f4e, 0x00972e56, 0x03e510d9, 0x01ce4106, 0x0042c299, 0x0027da4a, 0x037f6764, 0x03953733, 0x001da70e}}}, + {X: Field{[10]uint32{0x03b12e45, 0x01018aa8, 0x01dfe086, 0x02c46691, 0x0375019c, 0x03699b54, 0x0358a8f4, 0x00d3b0d0, 0x0277852d, 0x000f39ed}}, Y: Field{[10]uint32{0x027e409a, 0x0158b751, 0x03218e42, 0x03677913, 0x0102cf03, 0x0179062a, 0x0272c4bd, 0x022e1a58, 0x010f0183, 0x001a349e}}}, + {X: Field{[10]uint32{0x02d7836f, 0x011c9fb2, 0x03291e07, 0x0320265e, 0x036b50bd, 0x00550ae0, 0x010dca75, 0x01c40507, 0x00f4d4da, 0x00282f0a}}, Y: Field{[10]uint32{0x03e47c88, 0x02d21665, 0x012242a8, 0x02f329e1, 0x02177eec, 0x027c58f4, 0x005a5819, 0x01e0735a, 0x014940f2, 0x001bb5f8}}}, + {X: Field{[10]uint32{0x02185c0b, 0x03846ac7, 0x00b6818f, 0x03126863, 0x0397750f, 0x00350660, 0x01d290ac, 0x0358ad39, 0x03a352b1, 0x002695c6}}, Y: Field{[10]uint32{0x011b4ad1, 0x0078a56b, 0x00128ff6, 0x01c26f76, 0x030f6c28, 0x00d19245, 0x03c0dfed, 0x03d63e73, 0x00cdb2b1, 0x0006a473}}}, + {X: Field{[10]uint32{0x0221b9bf, 0x03d91f8a, 0x00b93d53, 0x00760d23, 0x004e135c, 0x016a312c, 0x024eca55, 0x0379cc34, 0x004fcdd2, 0x003ee815}}, Y: Field{[10]uint32{0x0374568a, 0x015f8109, 0x023f7aed, 0x0327df6f, 0x02f71a6c, 0x03e0ef9a, 0x02fe631f, 0x01ab3cba, 0x0025a4ec, 0x001e8469}}}, + {X: Field{[10]uint32{0x00920a9b, 0x02af2875, 0x00b485f7, 0x00551585, 0x01ecad11, 0x0070eeb6, 0x002bdd70, 0x03d988e4, 0x013a1edb, 0x00365ac9}}, Y: Field{[10]uint32{0x0318c2e8, 0x0341980e, 0x031f2408, 0x0322c5cb, 0x021499f1, 0x03ccc54d, 0x027d09f2, 0x02e0c4bc, 0x0198f951, 0x000af222}}}, + {X: Field{[10]uint32{0x02267c2b, 0x012e2990, 0x0135613a, 0x00ba51f0, 0x01982338, 0x03e5c8fe, 0x02e14da0, 0x02e09652, 0x03ce1081, 0x000acf05}}, Y: Field{[10]uint32{0x036048ff, 0x037e9a4c, 0x0074fdbb, 0x030b6ef3, 0x02e77205, 0x009e8aad, 0x007f1fa4, 0x00916e23, 0x009f2ebd, 0x00293356}}}, + {X: Field{[10]uint32{0x016439f9, 0x0158da72, 0x021252eb, 0x03253f61, 0x013f6bc5, 0x03891367, 0x0313ea72, 0x0148b1a4, 0x0380fdac, 0x001a5a61}}, Y: Field{[10]uint32{0x01a03154, 0x0007ddc9, 0x0020ec10, 0x0053f880, 0x018d6e43, 0x02ee6653, 0x02b59439, 0x011d7f01, 0x03c6460f, 0x003a3bac}}}, + {X: Field{[10]uint32{0x00848c68, 0x0257be68, 0x03c6d763, 0x03f2b8bf, 0x02d1577e, 0x02ff0bd2, 0x03e172c9, 0x03713258, 0x02114cb4, 0x00078d11}}, Y: Field{[10]uint32{0x004f5b19, 0x00d0db10, 0x01e1da47, 0x00858167, 0x01a2bb46, 0x02ef1b54, 0x016d4643, 0x0268382e, 0x00dfe6f5, 0x0037aeee}}}, + {X: Field{[10]uint32{0x006aa61a, 0x022ba34a, 0x03a1fc55, 0x0213109c, 0x03d5c302, 0x034d78a1, 0x012c191b, 0x00aa6ae8, 0x02024c7f, 0x001b33eb}}, Y: Field{[10]uint32{0x02e7cb11, 0x0120e22d, 0x02de854e, 0x03c7ba0e, 0x0194c4cd, 0x00791623, 0x002ade25, 0x028bf74d, 0x01740c78, 0x00308050}}}, + {X: Field{[10]uint32{0x024c728e, 0x02c5b8b2, 0x0077ec32, 0x00fe525f, 0x02db4315, 0x006884a2, 0x03f0a2e6, 0x0284ccd6, 0x008769b6, 0x0016d7f5}}, Y: Field{[10]uint32{0x00f00c77, 0x039df363, 0x0108850f, 0x03694f10, 0x015a54c9, 0x01a1c46d, 0x01f26321, 0x027513ab, 0x013fb23c, 0x0026550d}}}, + {X: Field{[10]uint32{0x035d069e, 0x01aa6f00, 0x0221565a, 0x0277d504, 0x03e6a41d, 0x00c8ed8f, 0x03bbbd27, 0x01137587, 0x025727af, 0x001add28}}, Y: Field{[10]uint32{0x0032a34c, 0x02674cfd, 0x01756480, 0x01185491, 0x0039b87a, 0x03c01326, 0x03d689c5, 0x0237fed6, 0x0214f17b, 0x00029384}}}, + {X: Field{[10]uint32{0x00e372a2, 0x02fc50ee, 0x004b263c, 0x01b02ab8, 0x03868860, 0x03823cc5, 0x03408b9f, 0x03b4060d, 0x01878ae9, 0x00145c68}}, Y: Field{[10]uint32{0x03172d06, 0x01009d82, 0x037e8681, 0x0057164e, 0x0044da8e, 0x02a3c829, 0x024a4728, 0x014f33f9, 0x026b9641, 0x002d79f7}}}, + {X: Field{[10]uint32{0x03c8e80d, 0x03a5b350, 0x0356c279, 0x024a102d, 0x03dbce8a, 0x014a562a, 0x018568ce, 0x03bcc8d4, 0x006a4337, 0x00037e7a}}, Y: Field{[10]uint32{0x03027da7, 0x0246ed1c, 0x001df5f5, 0x037c1865, 0x0250b2cc, 0x03a4e04c, 0x00e8ff61, 0x01182844, 0x02eec72f, 0x001510ae}}}, + {X: Field{[10]uint32{0x0087c850, 0x0200608e, 0x033072ec, 0x024dedb4, 0x00ac9e46, 0x0240fef4, 0x0076ab73, 0x007dc6be, 0x0279eb6f, 0x003381c0}}, Y: Field{[10]uint32{0x02a155eb, 0x0037b52d, 0x01e84aea, 0x025d4e37, 0x016ea230, 0x0247e2b6, 0x03f2a79e, 0x034d1787, 0x01f988f9, 0x0037a0f7}}}, + {X: Field{[10]uint32{0x002f35fd, 0x01fcd213, 0x00c40766, 0x026c3b4a, 0x0296e578, 0x0274234d, 0x0238936c, 0x03213160, 0x006244af, 0x00280957}}, Y: Field{[10]uint32{0x033c6f7a, 0x0383459d, 0x0269f17e, 0x005f3589, 0x0206cd50, 0x02c83c88, 0x0098293f, 0x02635c32, 0x0007aef8, 0x0024f8b5}}}, + {X: Field{[10]uint32{0x02f0d86b, 0x009b72a1, 0x03ef0d51, 0x010370bd, 0x02138e18, 0x00e0ffd8, 0x00e1197a, 0x01775c50, 0x02adb76d, 0x002ba0b7}}, Y: Field{[10]uint32{0x0320964a, 0x02057295, 0x027c65f5, 0x01606668, 0x0072d36b, 0x038c2d64, 0x036d8ec2, 0x001de6a7, 0x03accaaa, 0x0008e76e}}}, + {X: Field{[10]uint32{0x02332393, 0x00dd7645, 0x0088444c, 0x02b27024, 0x0197c597, 0x02250918, 0x016441ea, 0x0178bb56, 0x01cebee6, 0x0033c266}}, Y: Field{[10]uint32{0x02748ca4, 0x017fecce, 0x01880865, 0x03481a4d, 0x011c664a, 0x016b736f, 0x03f8cd54, 0x03b75407, 0x03d2f074, 0x00198832}}}, + {X: Field{[10]uint32{0x00d3965c, 0x01600ce7, 0x0222a762, 0x00065151, 0x029ec068, 0x02eb2ecd, 0x03ff1b41, 0x02c06d8e, 0x03746404, 0x0017ed2b}}, Y: Field{[10]uint32{0x032abff5, 0x0338e489, 0x03e93d99, 0x02d16553, 0x00916a51, 0x01239d12, 0x009529fa, 0x01a5f350, 0x02e12cce, 0x0011932c}}}, + {X: Field{[10]uint32{0x033216b4, 0x00e83cc6, 0x023a0199, 0x003e0453, 0x002c7a35, 0x00af12b3, 0x01e5687a, 0x008cb815, 0x000a46b5, 0x00056bcf}}, Y: Field{[10]uint32{0x01d45a83, 0x00e95d33, 0x03b37ad8, 0x02795a96, 0x0286c818, 0x028ffdee, 0x035acd93, 0x00e2c11c, 0x039bbdce, 0x002b80dc}}}, + {X: Field{[10]uint32{0x000b4b10, 0x00cf8d95, 0x0046576d, 0x021d9034, 0x0232c887, 0x00b65cf6, 0x00b8b5d3, 0x0333150b, 0x01d1d008, 0x0017400d}}, Y: Field{[10]uint32{0x0254c465, 0x00f9ef9b, 0x02f39617, 0x023356d2, 0x0376db8a, 0x00e9d3c5, 0x009061f7, 0x027ca19a, 0x00e5bffa, 0x001123b6}}}, + {X: Field{[10]uint32{0x03c95527, 0x01eeb520, 0x03915e02, 0x0013f12b, 0x02a40b07, 0x03f1a78e, 0x039d322f, 0x01277fb6, 0x00f39cf7, 0x0025131c}}, Y: Field{[10]uint32{0x006c6f0c, 0x023b2f6e, 0x02fc21a1, 0x03f52388, 0x02df10ac, 0x012699a6, 0x026e95ce, 0x024cc992, 0x003bbf48, 0x002c2b03}}}, + {X: Field{[10]uint32{0x011e4402, 0x02f17585, 0x00acc846, 0x0095b34a, 0x0052e262, 0x02b58bc1, 0x0246754d, 0x00f128fc, 0x01f082ec, 0x003e9486}}, Y: Field{[10]uint32{0x027afae9, 0x0138fcc2, 0x0065a01b, 0x00af7340, 0x01eb730d, 0x000a240c, 0x0364f26a, 0x00c4cb5e, 0x01e9d640, 0x000cb3a0}}}, + {X: Field{[10]uint32{0x00a30ede, 0x010e4a0e, 0x03032704, 0x01ad766f, 0x0085c6a1, 0x0162e146, 0x009455a8, 0x03898c14, 0x0230ddbe, 0x00327d2a}}, Y: Field{[10]uint32{0x00ad7b7c, 0x02dd8c8d, 0x01baea15, 0x00d30be9, 0x03add203, 0x01adcee9, 0x00927994, 0x02bcc66a, 0x03c6b438, 0x0017bdc5}}}, + {X: Field{[10]uint32{0x03770319, 0x0305e39e, 0x02120162, 0x018b7bba, 0x020529b3, 0x01cb53ff, 0x00dd2fdc, 0x0355a56c, 0x03ca7454, 0x000bd33c}}, Y: Field{[10]uint32{0x02f7d487, 0x0033ade8, 0x02042d5a, 0x0317fc51, 0x02fe7c87, 0x02dd9c24, 0x03c1ce0f, 0x03af2fd1, 0x020e3566, 0x003736a4}}}, + {X: Field{[10]uint32{0x01969945, 0x02a5ae1e, 0x02af40a0, 0x01080891, 0x02a1cb0a, 0x007e46cf, 0x03a41a75, 0x035d2bc1, 0x01762e0c, 0x000905fd}}, Y: Field{[10]uint32{0x027807d9, 0x02e9ffc7, 0x02ceefcf, 0x01b65aea, 0x01741ef9, 0x0072d13b, 0x02d0a3f6, 0x01c6f2b6, 0x0355f8dc, 0x001aa5b5}}}, + {X: Field{[10]uint32{0x0088852c, 0x02d86e16, 0x008c66cf, 0x002bba45, 0x00d43d06, 0x02ecf6e9, 0x01ca5bac, 0x00707d9d, 0x0384305a, 0x0026ac8b}}, Y: Field{[10]uint32{0x0028a03e, 0x02d45ea9, 0x01c18e23, 0x01acb32a, 0x03b51d99, 0x02b3768e, 0x02ac12a7, 0x0238e9eb, 0x02faa258, 0x002bc141}}}, + {X: Field{[10]uint32{0x00a72b6c, 0x00074749, 0x02f52875, 0x00996858, 0x0077a917, 0x038551c9, 0x00ed8787, 0x01e4980a, 0x02a22462, 0x003dd087}}, Y: Field{[10]uint32{0x0343fcf6, 0x00224015, 0x004dd8f5, 0x03322160, 0x01fe1c72, 0x03351845, 0x032ca6d8, 0x0104cbcd, 0x0265e448, 0x0036c2b9}}}, + {X: Field{[10]uint32{0x035c6f75, 0x00ef5ff7, 0x01e35496, 0x02edf65c, 0x0110a912, 0x02e61d6c, 0x00bb7918, 0x015fa370, 0x02f3548d, 0x000d5d5a}}, Y: Field{[10]uint32{0x0077a1d2, 0x01c26378, 0x0260fc51, 0x023882c5, 0x0186d94b, 0x03538658, 0x02d69aeb, 0x02d3f753, 0x01ba78a2, 0x0007291b}}}, + {X: Field{[10]uint32{0x03f01837, 0x031136c6, 0x01bc0241, 0x030bf80c, 0x03de4041, 0x0036b9ff, 0x0049d9ab, 0x03ebc859, 0x000c494c, 0x0029fa7c}}, Y: Field{[10]uint32{0x021a0280, 0x02013005, 0x008b7d10, 0x03793bd4, 0x005a7760, 0x02d7eedd, 0x013d0093, 0x0101aa5d, 0x01ae480b, 0x003cabae}}}, + {X: Field{[10]uint32{0x0262adb7, 0x03d79bf2, 0x03c1ac88, 0x028a4213, 0x0064838a, 0x0195739c, 0x037755b7, 0x00a1e5dc, 0x01ba9287, 0x001a5147}}, Y: Field{[10]uint32{0x002b1cd9, 0x00fc69ec, 0x0143c0c7, 0x01ed468c, 0x00107153, 0x01b1ee54, 0x01845d49, 0x03c244c7, 0x03a8d40d, 0x00098863}}}, + {X: Field{[10]uint32{0x02abf06d, 0x01b338f6, 0x00ad35eb, 0x003c3148, 0x0089a92d, 0x0220817f, 0x0186a375, 0x0299bf3a, 0x033015cc, 0x0031270e}}, Y: Field{[10]uint32{0x000e354c, 0x01b59f16, 0x01b5e621, 0x02714f8c, 0x03624291, 0x034ab425, 0x00f9ca99, 0x000ac383, 0x004a665b, 0x001ebf7a}}}, + {X: Field{[10]uint32{0x039dae8f, 0x01ad891a, 0x003871ab, 0x0110215c, 0x0090c0c7, 0x0047053e, 0x036ee1df, 0x01b8e316, 0x01bfb68e, 0x003a7860}}, Y: Field{[10]uint32{0x01ef5e1b, 0x0309a8b5, 0x00018fc6, 0x0297868d, 0x00d1af5c, 0x00d946a9, 0x007e260c, 0x010c5c24, 0x02db3f39, 0x002c2f3f}}}, + {X: Field{[10]uint32{0x02392324, 0x00b8c0b7, 0x028bc406, 0x00e2ae67, 0x012e7d87, 0x0035b87e, 0x01c9e52e, 0x01073d6d, 0x006f0adf, 0x00290a16}}, Y: Field{[10]uint32{0x01b8d142, 0x019fc225, 0x031c83f9, 0x00fd37a0, 0x01a2a741, 0x012737ba, 0x03911e8b, 0x0324dd96, 0x018bfe71, 0x001df0f8}}}, + {X: Field{[10]uint32{0x032712cf, 0x03743641, 0x0194d785, 0x039d7bfb, 0x0038077b, 0x0195a99d, 0x00a4830b, 0x0068952d, 0x02d2de1d, 0x003d724b}}, Y: Field{[10]uint32{0x033958fb, 0x019c2e7a, 0x03f1ed7c, 0x01f80699, 0x01228fdf, 0x01471446, 0x01f6dcbc, 0x0127356d, 0x013a4978, 0x001fba63}}}, + {X: Field{[10]uint32{0x009c3f66, 0x023c062d, 0x034bdf26, 0x031ffc95, 0x01e18c19, 0x019ed55c, 0x01b69307, 0x03d418c4, 0x03ca6c85, 0x002a15c1}}, Y: Field{[10]uint32{0x028aa050, 0x006367d7, 0x0273d775, 0x00d5356e, 0x00536543, 0x00dee3ee, 0x0367d103, 0x038626ab, 0x0271cde2, 0x0005e17f}}}, + {X: Field{[10]uint32{0x00a7468d, 0x0250bfb0, 0x0197c0f9, 0x01819e9f, 0x00d084ab, 0x027b2971, 0x01e0cf81, 0x03470bcb, 0x035fa4c8, 0x0002219b}}, Y: Field{[10]uint32{0x0188336e, 0x024c120d, 0x0009afe6, 0x022e9fb0, 0x02291528, 0x01d8af9b, 0x02c49adc, 0x0241e8bd, 0x026c3f33, 0x000c0508}}}, + {X: Field{[10]uint32{0x020688cc, 0x02f8532b, 0x03d66f40, 0x02d59186, 0x0392af22, 0x036901b3, 0x03d07c8b, 0x00b5a385, 0x017337eb, 0x001097db}}, Y: Field{[10]uint32{0x004d4980, 0x035a63f4, 0x03dbdef8, 0x016561c6, 0x00096436, 0x0202f67f, 0x0373290e, 0x038e446a, 0x026f7c42, 0x003a1954}}}, + {X: Field{[10]uint32{0x00323139, 0x03208f5a, 0x019a2f8a, 0x02bcef27, 0x0236bfe6, 0x00f7ad2f, 0x00184414, 0x02cff555, 0x003e1de3, 0x0003dc3f}}, Y: Field{[10]uint32{0x0224ce03, 0x01012d76, 0x0144adae, 0x002d02aa, 0x008ae575, 0x01ac635e, 0x0374a82d, 0x02cc278d, 0x014b1feb, 0x0022d1e6}}}, + {X: Field{[10]uint32{0x0283116c, 0x002cd8ca, 0x0106758a, 0x03650e7a, 0x00d59c66, 0x02be8487, 0x003b10ce, 0x00a8581c, 0x00f3038d, 0x0006fa58}}, Y: Field{[10]uint32{0x01e29aef, 0x0070378f, 0x0201062f, 0x036c67ba, 0x030647e0, 0x02c0403e, 0x01549cc3, 0x03b810d4, 0x022f8218, 0x001fe932}}}, + {X: Field{[10]uint32{0x020cf385, 0x01cb54cc, 0x02a7e484, 0x022520c7, 0x02e915eb, 0x01a52a03, 0x0351e9f5, 0x02028e2b, 0x02d3bc5c, 0x00007ca8}}, Y: Field{[10]uint32{0x013940e5, 0x0194ef9b, 0x00e9ff55, 0x001d9e0b, 0x0147053f, 0x0399c07e, 0x03cb9455, 0x013127e6, 0x0239174b, 0x0028633a}}}, + {X: Field{[10]uint32{0x00d04766, 0x01dfcf91, 0x0140e884, 0x00dff9dc, 0x019aa67c, 0x01f2beaa, 0x03908611, 0x01ac2edd, 0x03607084, 0x0001875a}}, Y: Field{[10]uint32{0x00f2688f, 0x0230472a, 0x024d2533, 0x03ab2bdc, 0x02b7c4b1, 0x0325b799, 0x02eb59a6, 0x026b858c, 0x02908684, 0x0031fd2f}}}, + {X: Field{[10]uint32{0x02e6cc9c, 0x033c3507, 0x03c4fe6c, 0x00e249db, 0x026d5405, 0x012f9fc9, 0x0108daf0, 0x019145e5, 0x00932d9a, 0x0000acdc}}, Y: Field{[10]uint32{0x015beca7, 0x0002438a, 0x01d9f5ca, 0x0111860e, 0x0391cdfc, 0x005b382d, 0x016a1d86, 0x0262c7b8, 0x03f42c89, 0x003000a8}}}, + {X: Field{[10]uint32{0x02708858, 0x03598a7c, 0x0263a87c, 0x0255a89d, 0x0364af0e, 0x03fa6c07, 0x03fd1360, 0x02de8d35, 0x03efaba8, 0x00123d70}}, Y: Field{[10]uint32{0x0232b5ab, 0x03c0fa3f, 0x015e2b88, 0x02fed4a2, 0x0290aefd, 0x00be5cef, 0x02f09cc5, 0x019c91f0, 0x00b7fce4, 0x002330e3}}}, + {X: Field{[10]uint32{0x0262cfa0, 0x007766cf, 0x00b86e98, 0x03a42798, 0x00adfbe9, 0x01edb54d, 0x01cfc876, 0x03089dbd, 0x01972e5e, 0x0039826d}}, Y: Field{[10]uint32{0x02b43081, 0x00cf997c, 0x0189f0a4, 0x005826b8, 0x02335ca6, 0x02fc6c9e, 0x0385e3db, 0x017f4f8e, 0x01eeff20, 0x001afa70}}}, + {X: Field{[10]uint32{0x016d205a, 0x019a806c, 0x02b0b2ab, 0x01ecb69a, 0x02f19a76, 0x03bc3073, 0x02b8ea81, 0x0273211b, 0x031a5b2c, 0x003af902}}, Y: Field{[10]uint32{0x03c67058, 0x01be4525, 0x032f445d, 0x008035c2, 0x02967d69, 0x02593d76, 0x01899bd1, 0x032f440e, 0x00e8e4fe, 0x000bddc4}}}, + {X: Field{[10]uint32{0x018e3abd, 0x037d964d, 0x01b3ff70, 0x01160f60, 0x03dbc72d, 0x02c18af3, 0x03d32f39, 0x02c7bd94, 0x00399391, 0x0025f353}}, Y: Field{[10]uint32{0x03f37968, 0x036629fe, 0x03fe813d, 0x00ae88ce, 0x02263acf, 0x03a7d72b, 0x03c35c56, 0x02db7be6, 0x0184a175, 0x00281698}}}, + {X: Field{[10]uint32{0x02a7e6d9, 0x0128f06f, 0x0100ebf6, 0x02a80de0, 0x03257343, 0x019566b9, 0x00d99fce, 0x0343a14f, 0x00aa1d3f, 0x00209a4a}}, Y: Field{[10]uint32{0x021efc79, 0x02c1ec8b, 0x0399b020, 0x022a26ec, 0x02faad7f, 0x03dbe112, 0x010fddfc, 0x03a42bfd, 0x01b1a3bd, 0x002f128b}}}, + {X: Field{[10]uint32{0x03a19121, 0x03b4e697, 0x02398967, 0x00c59dcb, 0x0283bd14, 0x0042eb9e, 0x02e91814, 0x0257745d, 0x0097f3ac, 0x000f9d50}}, Y: Field{[10]uint32{0x0118df32, 0x03f99d69, 0x01801135, 0x0251fcfc, 0x0000ca7f, 0x033e50db, 0x0107ea15, 0x033fe282, 0x0299c6a2, 0x001d1b33}}}, + {X: Field{[10]uint32{0x029365db, 0x014c998c, 0x028fa446, 0x0118eee0, 0x0282991f, 0x02809c19, 0x00a236c8, 0x02651e02, 0x0064b49b, 0x003394e5}}, Y: Field{[10]uint32{0x022e5dd9, 0x0353009d, 0x00d41a74, 0x027046cb, 0x03a7bda7, 0x0270b0e2, 0x01f2fda2, 0x011d8c18, 0x02c2b8bc, 0x000d5e3f}}}, + {X: Field{[10]uint32{0x03e349dd, 0x0030ebd4, 0x036692c9, 0x01a4854c, 0x0344a2b6, 0x01929df2, 0x0041d6ae, 0x0056b5eb, 0x01d9cda6, 0x00324cf6}}, Y: Field{[10]uint32{0x0172c610, 0x002c36c1, 0x00c11f9f, 0x012a8713, 0x02a25b05, 0x0262eaf3, 0x02a8ede2, 0x03aeee3c, 0x024f83ba, 0x00129b68}}}, + {X: Field{[10]uint32{0x000b2ac4, 0x0068ef20, 0x03d51d08, 0x03bca009, 0x03a78e2d, 0x0237777b, 0x0116f2e7, 0x02057fa4, 0x003b1aa9, 0x001166a9}}, Y: Field{[10]uint32{0x03e993d5, 0x017f1f18, 0x016454bd, 0x01583f0a, 0x025c6151, 0x0377347c, 0x02900d4c, 0x0178c2c5, 0x03c3de99, 0x0006b3b6}}}, + {X: Field{[10]uint32{0x023b0a5e, 0x01fe44c7, 0x004d43b2, 0x00d268c3, 0x00ff4453, 0x018e6aff, 0x00675640, 0x02b4a7ad, 0x01d99862, 0x0017caa9}}, Y: Field{[10]uint32{0x01ace144, 0x01507258, 0x02cfbce7, 0x02df7538, 0x025acfbb, 0x0116ce6c, 0x01ef9ba4, 0x002fcb67, 0x022be61d, 0x0015c7b2}}}, + {X: Field{[10]uint32{0x00f4fd1d, 0x02079822, 0x000f5756, 0x01fe51ed, 0x01fc2c3d, 0x028ce152, 0x0393e681, 0x01756630, 0x021de6cc, 0x003b19ba}}, Y: Field{[10]uint32{0x01280f52, 0x01f6faaa, 0x025978ab, 0x027e8dc1, 0x02554073, 0x0029525e, 0x014dfa9d, 0x0210d562, 0x03db3b37, 0x0035c47f}}}, + {X: Field{[10]uint32{0x016105fe, 0x0205a0ab, 0x007ab1a4, 0x00e31e15, 0x0169ad06, 0x03472ace, 0x003f018b, 0x01fcb666, 0x01f5aa09, 0x001ab14f}}, Y: Field{[10]uint32{0x0218a598, 0x03238159, 0x00578abf, 0x025aee82, 0x013cd517, 0x010c1e5a, 0x008f2242, 0x02e46652, 0x02815127, 0x00257da6}}}, + {X: Field{[10]uint32{0x0396c0b0, 0x00bc4a67, 0x014fd384, 0x02142cd1, 0x0016fb5c, 0x03700b3d, 0x026dcb8f, 0x0343f711, 0x01e29e4a, 0x002a28fa}}, Y: Field{[10]uint32{0x0316dc2b, 0x00e29559, 0x03685ce1, 0x00242f78, 0x03169b8d, 0x00e535f0, 0x016d152f, 0x037a943b, 0x033e3006, 0x0037e1ba}}}, + {X: Field{[10]uint32{0x02db251c, 0x01030f79, 0x0116632c, 0x01f0c618, 0x001dbe98, 0x03b69b7e, 0x02c84a2f, 0x01d06e57, 0x00d2a0d8, 0x001429d9}}, Y: Field{[10]uint32{0x03e41055, 0x03ed089f, 0x00a4085c, 0x03890c29, 0x0176a8c7, 0x03a6d44b, 0x027632ac, 0x005f052d, 0x03f02339, 0x002ca080}}}, + {X: Field{[10]uint32{0x02b51ef9, 0x01d1b286, 0x013a9423, 0x021160a2, 0x011bd9c5, 0x01b8e73e, 0x0056c9fa, 0x037c749a, 0x00b15ef9, 0x0030b0c5}}, Y: Field{[10]uint32{0x012ab759, 0x0086693a, 0x01d4493e, 0x00c79c5d, 0x03a22f1e, 0x0167c22d, 0x009a9f5d, 0x037eaae5, 0x0286ff7f, 0x00289fe4}}}, + {X: Field{[10]uint32{0x02a9d3df, 0x01aee49d, 0x01b75dbf, 0x01d4dc3f, 0x0364868b, 0x00882930, 0x03ce375e, 0x032344ac, 0x0185da44, 0x002e9955}}, Y: Field{[10]uint32{0x024fda50, 0x0198eef2, 0x0073be51, 0x0139bf22, 0x00bdd9d0, 0x00cb3127, 0x0318f614, 0x00e16f7b, 0x016ba03a, 0x000f5938}}}, + {X: Field{[10]uint32{0x006e600e, 0x0173fbe9, 0x001c2aca, 0x004ee785, 0x0256bd0d, 0x00694403, 0x0276a650, 0x000292d6, 0x0249d4d1, 0x000f517e}}, Y: Field{[10]uint32{0x00059176, 0x02f70ad6, 0x001eced5, 0x0039cc60, 0x00da3039, 0x031d6e92, 0x01a93b13, 0x03b90b87, 0x013c38ee, 0x000024a5}}}, + {X: Field{[10]uint32{0x008c3a8c, 0x011ac12f, 0x005964ca, 0x01fd144e, 0x0083e5ab, 0x03ecb043, 0x025d96e1, 0x030f8903, 0x0346e40d, 0x00391930}}, Y: Field{[10]uint32{0x0204cf4e, 0x03243594, 0x0390fc7a, 0x0293d5f3, 0x030ca364, 0x01d3359e, 0x02205aa3, 0x0142f4a0, 0x03461829, 0x0018fc52}}}, + {X: Field{[10]uint32{0x02a42688, 0x010b756b, 0x001e3fdf, 0x03931ce1, 0x00d56f3f, 0x034f71c8, 0x030d218b, 0x02cc1c16, 0x012fe235, 0x000529f8}}, Y: Field{[10]uint32{0x01e9ff2a, 0x02fce8c5, 0x038099ee, 0x01266b84, 0x00eac312, 0x004de93c, 0x02a22d48, 0x03d20bb5, 0x03cc40ce, 0x0035e5a0}}}, + {X: Field{[10]uint32{0x023828be, 0x03ec1e25, 0x01936a99, 0x00ae1757, 0x0061d2ee, 0x02cbfdbd, 0x0334ffab, 0x01cec896, 0x03b821af, 0x00239ebe}}, Y: Field{[10]uint32{0x026b1853, 0x02739f6b, 0x01ec16cc, 0x01c37b98, 0x02bb5284, 0x00838418, 0x015bea0e, 0x01da33c1, 0x03765aa0, 0x00010391}}}, + {X: Field{[10]uint32{0x03297573, 0x0181a414, 0x002465b1, 0x015629fb, 0x017d8440, 0x03973a0a, 0x00f9f1f9, 0x02f43d2f, 0x01623227, 0x00275904}}, Y: Field{[10]uint32{0x0307fc8d, 0x030d70e6, 0x01b2c126, 0x03576974, 0x021f8630, 0x003fb027, 0x0067ea47, 0x006f95c0, 0x03a06800, 0x003b4360}}}, + {X: Field{[10]uint32{0x03c83eaf, 0x0201625f, 0x00f0b7bd, 0x03c512bc, 0x0352bb40, 0x00f69d39, 0x025b52be, 0x02767d04, 0x02d6d9e4, 0x0019d631}}, Y: Field{[10]uint32{0x004fd292, 0x032d0d06, 0x026e36a1, 0x033351a0, 0x005f7d22, 0x0255df6f, 0x0229b3de, 0x00b0d8e8, 0x008ec2aa, 0x001d26b8}}}, + {X: Field{[10]uint32{0x0061d73a, 0x0045452f, 0x03fb80da, 0x0066d28c, 0x01326327, 0x0293047d, 0x0193df63, 0x00b62c53, 0x01a04570, 0x0002cf84}}, Y: Field{[10]uint32{0x01d562eb, 0x01bef66a, 0x02d189a8, 0x02d8d2c8, 0x009660c6, 0x032e5c11, 0x02238928, 0x01fb0806, 0x02b12b26, 0x0031b854}}}, + {X: Field{[10]uint32{0x026fa5f1, 0x03b56835, 0x00b98994, 0x00f08842, 0x02137bf4, 0x002e789d, 0x0371b0fe, 0x02644404, 0x01ea3b30, 0x001428c9}}, Y: Field{[10]uint32{0x0345b70e, 0x02b8500d, 0x00739dfe, 0x027009d4, 0x028a9939, 0x02ce7bfa, 0x03585279, 0x002a9629, 0x011fd39e, 0x00251b6b}}}, + {X: Field{[10]uint32{0x015e9661, 0x0138c8ba, 0x03e39121, 0x029a91bb, 0x02a97341, 0x02b1423b, 0x02802ce8, 0x03568b3d, 0x02493bef, 0x003df23c}}, Y: Field{[10]uint32{0x0234cb67, 0x00f62347, 0x03f5d4e3, 0x039fe8fc, 0x02573883, 0x02639365, 0x00b7ec05, 0x03cdc051, 0x00c4eec1, 0x000f01cb}}}, + {X: Field{[10]uint32{0x038f85b6, 0x01977200, 0x00cc3c89, 0x02ee1b0a, 0x0038c7e7, 0x03127a9a, 0x030b94e9, 0x00ce1bc2, 0x0350c154, 0x000c0b4e}}, Y: Field{[10]uint32{0x00310744, 0x00b496a2, 0x03720567, 0x00a3539f, 0x013588d1, 0x01b1e324, 0x0366e5a9, 0x02a8bd82, 0x03d0d891, 0x00262011}}}, + {X: Field{[10]uint32{0x019f0eb7, 0x014edf48, 0x0386afbf, 0x03f2c363, 0x021d3810, 0x017b7a26, 0x00e8ecb5, 0x016e9834, 0x03282e7e, 0x0032e3b9}}, Y: Field{[10]uint32{0x038094cd, 0x038058ea, 0x0118e75f, 0x018381a8, 0x02bc10bd, 0x03c12470, 0x009a4e3c, 0x00426423, 0x022befad, 0x0012c13a}}}, + {X: Field{[10]uint32{0x03d5fd42, 0x015cb533, 0x0131b211, 0x00d7e42f, 0x0174f920, 0x031ce927, 0x00f6f04a, 0x0362a883, 0x022b4a0c, 0x0019172a}}, Y: Field{[10]uint32{0x037ef5b9, 0x0320d1be, 0x010a6b6f, 0x008dfd47, 0x03b0aa13, 0x03f945b6, 0x022b64ea, 0x035f0779, 0x019635f9, 0x001e4fca}}}, + {X: Field{[10]uint32{0x015f5a21, 0x031289ce, 0x034f3e69, 0x01ccf617, 0x00f00b1c, 0x0185f593, 0x034b8df6, 0x02d79d50, 0x002f6148, 0x00134dcd}}, Y: Field{[10]uint32{0x03a708bd, 0x01df6294, 0x01cded15, 0x0374e341, 0x034eebd7, 0x006dad99, 0x00a7db2b, 0x031c1519, 0x012bd4c5, 0x00190002}}}, + {X: Field{[10]uint32{0x00c0e0d8, 0x024c5c06, 0x02d3dbd6, 0x00d0db9d, 0x01747a21, 0x034a2f4e, 0x02c6285e, 0x001ecad2, 0x0317024e, 0x00398d2f}}, Y: Field{[10]uint32{0x03e9f021, 0x036e1cc4, 0x00a53020, 0x03efa25f, 0x025e9660, 0x02c44e1d, 0x01d9d8b6, 0x02947b0c, 0x02de4b82, 0x003332f2}}}, + {X: Field{[10]uint32{0x020cef38, 0x0044014d, 0x0192ba51, 0x0018eefe, 0x0264c490, 0x00c74966, 0x03ff5354, 0x03144f56, 0x01e62767, 0x00202803}}, Y: Field{[10]uint32{0x028ef572, 0x033737d8, 0x036b203f, 0x03de54c2, 0x03b2620d, 0x03f71f80, 0x027e23e8, 0x00cd9b11, 0x0189e8d7, 0x001f73ad}}}, + {X: Field{[10]uint32{0x028f8a0f, 0x00b8b767, 0x0225d05b, 0x0197dc65, 0x02baf5b7, 0x0047571d, 0x01b8409f, 0x0143b669, 0x00e6d23d, 0x00181b54}}, Y: Field{[10]uint32{0x03b32788, 0x010d9acf, 0x00cc748c, 0x03a2edf2, 0x004cbb41, 0x0305c480, 0x001d2206, 0x02d30bf3, 0x009245b1, 0x00067d55}}}, + {X: Field{[10]uint32{0x024f0420, 0x03583b83, 0x02a247fd, 0x020ce359, 0x02266c30, 0x0392864c, 0x03ea835a, 0x013edd29, 0x0214f7d4, 0x00272282}}, Y: Field{[10]uint32{0x01d9169a, 0x021d1679, 0x028b4d01, 0x01e8ecaf, 0x018737fc, 0x006bb74a, 0x02da6218, 0x023748c7, 0x02373157, 0x0010b1b0}}}, + {X: Field{[10]uint32{0x0235da1c, 0x030cf6c7, 0x00e59ceb, 0x032810ea, 0x001a32d3, 0x02905e49, 0x01a01548, 0x01bd63fe, 0x00f781a4, 0x0035b33f}}, Y: Field{[10]uint32{0x021d084f, 0x037c88e1, 0x016d568b, 0x02f24409, 0x0287cbcf, 0x015c3e0c, 0x00824e61, 0x01ae362d, 0x021ace84, 0x002872ae}}}, + {X: Field{[10]uint32{0x01f2e3c4, 0x01aeb67d, 0x000da459, 0x03b6903b, 0x006eed5d, 0x0251f234, 0x016f4464, 0x00ffc915, 0x036a3e4c, 0x00233ebc}}, Y: Field{[10]uint32{0x00f3c4d7, 0x0381a4b6, 0x031fcc80, 0x00ee5b28, 0x026b7237, 0x00419fc8, 0x03f81d1c, 0x0337f78c, 0x02ccede6, 0x002646db}}}, + {X: Field{[10]uint32{0x03e664a0, 0x03023aed, 0x03da0541, 0x02c1245f, 0x03189849, 0x031a9b31, 0x02f39738, 0x00e82ef3, 0x01815b0f, 0x00351b0f}}, Y: Field{[10]uint32{0x0167c159, 0x033962b6, 0x026421fe, 0x02650107, 0x0158cffe, 0x02a13b60, 0x02dc9b63, 0x03975f22, 0x03b6d053, 0x000d5492}}}, + {X: Field{[10]uint32{0x037adfff, 0x008ffb0a, 0x02f0490c, 0x01d7280b, 0x03e2ce9b, 0x0118df73, 0x02dce33e, 0x0237dfe0, 0x00a52f1f, 0x0023b5fc}}, Y: Field{[10]uint32{0x028d99ff, 0x003088d8, 0x019a55d9, 0x017509dd, 0x024be1aa, 0x037b8ed9, 0x00272253, 0x0344325b, 0x00c7b418, 0x003c0918}}}, + {X: Field{[10]uint32{0x01aaa2ca, 0x02a17d9b, 0x02c2b0ce, 0x02ca2af4, 0x00825c46, 0x03ba8ffc, 0x03a4d6ca, 0x0146f54a, 0x02dca8a3, 0x0010cfb2}}, Y: Field{[10]uint32{0x022977e5, 0x02850bc5, 0x0038f983, 0x03f20f41, 0x03f6d396, 0x01bce438, 0x00d03c48, 0x0345dd17, 0x01bcc2d7, 0x00134edc}}}, + {X: Field{[10]uint32{0x03a006e6, 0x02cfe72e, 0x014eb249, 0x00ec5701, 0x03ba0449, 0x007d990a, 0x01bbddd8, 0x01fe0dea, 0x02f31037, 0x00301dc7}}, Y: Field{[10]uint32{0x034ccb1e, 0x037c963b, 0x015b0784, 0x00ce98e5, 0x00e1ea2b, 0x01e35312, 0x018c6b47, 0x01a809e2, 0x01ab1d81, 0x000f94f7}}}, + {X: Field{[10]uint32{0x03597ad7, 0x00ea7143, 0x03d238ff, 0x02a29d07, 0x0092072b, 0x00d71b36, 0x0197383e, 0x021ee54e, 0x02264a6a, 0x00370b80}}, Y: Field{[10]uint32{0x0012c74d, 0x00f07c5f, 0x00e01d8a, 0x03272f20, 0x018ddbac, 0x03d65fa1, 0x00ac0ff6, 0x03dc8d10, 0x0346ecd5, 0x002263b9}}}, + {X: Field{[10]uint32{0x02dab771, 0x002dd81a, 0x01f0311f, 0x02cbb60e, 0x01d043d7, 0x0273678c, 0x005f7811, 0x0232fc7f, 0x023459ad, 0x0005aeb3}}, Y: Field{[10]uint32{0x002fb1c4, 0x01b077f0, 0x01243e89, 0x02c4af52, 0x0066e835, 0x00acae0d, 0x02239797, 0x025f8cb2, 0x01326ec6, 0x00003d91}}}, + {X: Field{[10]uint32{0x0169c736, 0x017ce95f, 0x001a4072, 0x036a0e72, 0x029af55e, 0x023c00d1, 0x02539a86, 0x0050e451, 0x018f3a27, 0x002bee53}}, Y: Field{[10]uint32{0x035201d8, 0x03a2f468, 0x009cb386, 0x029d5653, 0x00bdf37f, 0x0158f5d9, 0x00a4eff7, 0x000c769c, 0x014ea455, 0x002bf6ca}}}, + {X: Field{[10]uint32{0x00e89b74, 0x0056aa74, 0x01dc706b, 0x02017de0, 0x02ecc337, 0x0006397a, 0x01b0ae76, 0x03dfd07b, 0x02364a98, 0x002ecc74}}, Y: Field{[10]uint32{0x02031a9a, 0x029307f6, 0x01c27a92, 0x0229ee76, 0x0287cbc2, 0x01373657, 0x009f032f, 0x0331fb35, 0x00031f47, 0x00068193}}}, + {X: Field{[10]uint32{0x004318b8, 0x00f0454f, 0x0270001c, 0x01bb5c9f, 0x03241e48, 0x03bdba0e, 0x0204ee30, 0x0176a059, 0x036c4bbf, 0x003dcec6}}, Y: Field{[10]uint32{0x008c9b17, 0x03e6e29b, 0x01ffb476, 0x03bcedf5, 0x0125ba08, 0x03006c98, 0x00ac2255, 0x0132ead6, 0x016e09d6, 0x00268a2b}}}, + {X: Field{[10]uint32{0x01afa8a4, 0x01ba4864, 0x03313b23, 0x01983c34, 0x03708c87, 0x025816ca, 0x038ea7b6, 0x03168213, 0x0212d0dd, 0x00018ef4}}, Y: Field{[10]uint32{0x016c3e67, 0x001da631, 0x01b0fa33, 0x023b33b3, 0x0102fbca, 0x027f4d0b, 0x03bb0b3a, 0x0100c82b, 0x00f60482, 0x0003b9bd}}}, + {X: Field{[10]uint32{0x02bc6465, 0x001fe186, 0x016299e0, 0x01761d7f, 0x00967b95, 0x031a241e, 0x02416b78, 0x020088c2, 0x022b3606, 0x0018d9f4}}, Y: Field{[10]uint32{0x029417eb, 0x00a225fd, 0x020bbec6, 0x011e4967, 0x03118d16, 0x01657e6c, 0x02444ad5, 0x01e4fc5f, 0x032d14e6, 0x0030fb87}}}, + {X: Field{[10]uint32{0x0085976e, 0x00186a25, 0x02c4f2df, 0x003c2d8c, 0x020c922d, 0x0120e531, 0x0101e3a4, 0x03d4b95e, 0x0143fbb7, 0x001938b9}}, Y: Field{[10]uint32{0x00ab2a4c, 0x024df7ff, 0x0011b48f, 0x01093f38, 0x02895119, 0x0218e939, 0x0047e5a5, 0x01a2d3f1, 0x002e336a, 0x00190698}}}, + {X: Field{[10]uint32{0x03fee1c6, 0x03cc0c78, 0x03f38d6b, 0x01298399, 0x02e16e82, 0x036704c8, 0x0179e869, 0x00d72347, 0x02fd18c8, 0x000b8a42}}, Y: Field{[10]uint32{0x01390f21, 0x0199161e, 0x03874962, 0x02b178dc, 0x02da18cc, 0x00a68d89, 0x0286b0ec, 0x01ad9c1d, 0x028ed2fa, 0x001fe158}}}, + {X: Field{[10]uint32{0x00ee401e, 0x03c421cb, 0x0242b17e, 0x0333602e, 0x00c0ba2d, 0x02231ddd, 0x03229079, 0x0174f7d7, 0x008a0c47, 0x00216688}}, Y: Field{[10]uint32{0x0319f5d8, 0x009ffea2, 0x01e31336, 0x0297c4d2, 0x0384b982, 0x03e84bf3, 0x02ed1e3c, 0x01d0eb58, 0x0245778e, 0x002999f1}}}, + {X: Field{[10]uint32{0x02bcaf21, 0x02b00a80, 0x00939b92, 0x036f64ac, 0x03b608d3, 0x00a7f718, 0x01c0b868, 0x002abbc6, 0x0108ccc5, 0x00324a46}}, Y: Field{[10]uint32{0x02cd2599, 0x023406c1, 0x0231a17d, 0x0115df18, 0x0320cb7d, 0x00bf227e, 0x01352c8b, 0x007d631c, 0x03b74711, 0x0039714a}}}, + {X: Field{[10]uint32{0x01cefb26, 0x03507118, 0x00459b04, 0x031d6369, 0x0364bc42, 0x03c68752, 0x02b01411, 0x02d881e2, 0x009042b5, 0x00140d65}}, Y: Field{[10]uint32{0x034f04e0, 0x01147aaf, 0x02af1e5b, 0x00abdef4, 0x03347c13, 0x009cbe05, 0x00d9bd8f, 0x00193fe0, 0x023db68c, 0x003d87a0}}}, + {X: Field{[10]uint32{0x00a4cbf3, 0x007cb7b1, 0x0343e7b6, 0x00067d17, 0x0039f29a, 0x00ed4d7b, 0x02787c35, 0x03c7ed84, 0x02e7d6a3, 0x003e6f3e}}, Y: Field{[10]uint32{0x032ff883, 0x0301e848, 0x0067b28f, 0x018abb77, 0x02a65658, 0x003f211a, 0x02d5a995, 0x035f9e40, 0x026f273a, 0x003d361b}}}, + {X: Field{[10]uint32{0x014a9152, 0x011c0e7c, 0x01dbad77, 0x03a5fe35, 0x01602ac4, 0x001d91c5, 0x03c0004b, 0x03c143a4, 0x028b901c, 0x0000723f}}, Y: Field{[10]uint32{0x0136769c, 0x01ee031f, 0x00c4c99d, 0x009fdbdd, 0x03b42a0f, 0x02c67e1f, 0x0143b6ec, 0x00a50a48, 0x03347c45, 0x002c9776}}}, + {X: Field{[10]uint32{0x0386f552, 0x010c4c79, 0x004dd2c5, 0x033d04af, 0x008ff676, 0x03ad4d38, 0x023947c6, 0x00ea1f4d, 0x03e14cbe, 0x0000f142}}, Y: Field{[10]uint32{0x0305a74d, 0x03b928e6, 0x032388a0, 0x00f6ed94, 0x00194f55, 0x0119b2b4, 0x02277754, 0x03d80362, 0x031c6e03, 0x00110d11}}}, + {X: Field{[10]uint32{0x030522f5, 0x009c0bb9, 0x01409fe7, 0x02b5b677, 0x005b3e91, 0x03e322c9, 0x0168b4b4, 0x01cbe3ea, 0x01b25554, 0x0019335c}}, Y: Field{[10]uint32{0x01ede304, 0x03c5b622, 0x002af5bf, 0x00f05a1e, 0x0140350a, 0x0066f58a, 0x017fc2a8, 0x0121540b, 0x033ae9fa, 0x003c6c72}}}, + {X: Field{[10]uint32{0x019af7a8, 0x038d0518, 0x00bccc41, 0x039f4bb2, 0x02fd8f69, 0x033102c3, 0x03dded87, 0x030d1b46, 0x0044c584, 0x00307001}}, Y: Field{[10]uint32{0x01879436, 0x0240174f, 0x0238eee0, 0x0332f1b7, 0x01f78dbc, 0x016042d8, 0x03b391ad, 0x03aec21e, 0x00943e3f, 0x00358c6d}}}, + {X: Field{[10]uint32{0x03a2a7ed, 0x03d6558f, 0x01b96cbe, 0x00a2be5c, 0x002fbd0c, 0x02df92e8, 0x0050fd03, 0x02ed871d, 0x0182dad5, 0x003e9425}}, Y: Field{[10]uint32{0x033df4e5, 0x038acd8b, 0x03816165, 0x016cd242, 0x012acdff, 0x01af8865, 0x03890d75, 0x00bde26a, 0x0364617c, 0x00099f09}}}, + {X: Field{[10]uint32{0x01a2386c, 0x008351b0, 0x024d0509, 0x0033df49, 0x0235175e, 0x018130b6, 0x0205f04b, 0x0249aa9b, 0x02e6864e, 0x00195773}}, Y: Field{[10]uint32{0x03ee19c8, 0x03853cb3, 0x02df72bb, 0x00e2d788, 0x025f1dc2, 0x01e596ea, 0x02d36c46, 0x00b2d2e8, 0x02dabf06, 0x00368bab}}}, + {X: Field{[10]uint32{0x033c213e, 0x01bf02b7, 0x01beb760, 0x001b4568, 0x002cc1de, 0x03b17135, 0x03c8fbef, 0x03989025, 0x01ac1b7b, 0x001aad78}}, Y: Field{[10]uint32{0x00a9e466, 0x008c7934, 0x01d3cf36, 0x02353a02, 0x00f83392, 0x03fb37d6, 0x003e0247, 0x00c671d1, 0x03b204eb, 0x0009be60}}}, + {X: Field{[10]uint32{0x00c25f3b, 0x02a75458, 0x01af35f5, 0x02951fbd, 0x036224e2, 0x03dceadc, 0x0373a0d3, 0x02a8b7a7, 0x029e039c, 0x0031f6a1}}, Y: Field{[10]uint32{0x00da579f, 0x010adad0, 0x0175dc79, 0x02267b08, 0x02cfdc0f, 0x01ab9312, 0x02f4cf67, 0x001f604a, 0x010249a6, 0x003a66c4}}}, + {X: Field{[10]uint32{0x0144ef99, 0x03034852, 0x01084a9c, 0x0152fc05, 0x03e20b68, 0x03d34526, 0x028091fa, 0x00f3b7b5, 0x00a15f1c, 0x000a9b53}}, Y: Field{[10]uint32{0x02661ae0, 0x01ad8e03, 0x039b4ced, 0x03cc4fc5, 0x015cb44b, 0x029c0eb1, 0x00d92846, 0x0257a6ae, 0x0288ae92, 0x0037f09d}}}, + {X: Field{[10]uint32{0x01c846c0, 0x018b3684, 0x015752de, 0x009c604a, 0x0292600a, 0x0079dc5a, 0x0259f70b, 0x008932a9, 0x00b3bba7, 0x00111c98}}, Y: Field{[10]uint32{0x008999bf, 0x03687837, 0x00996db8, 0x02990098, 0x038331e2, 0x00184e51, 0x000c9220, 0x00bb7a26, 0x020f33ef, 0x003c5f8f}}}, + {X: Field{[10]uint32{0x03781969, 0x0253dbe9, 0x016fd5b9, 0x0299b94d, 0x015a8788, 0x02cc4abb, 0x00b0f441, 0x01c00e35, 0x00adbaba, 0x002336c7}}, Y: Field{[10]uint32{0x00536977, 0x01dfb75d, 0x00fa17c1, 0x0392e81b, 0x03b88750, 0x0355b080, 0x03be06d8, 0x019ceab9, 0x010e262e, 0x002ce96f}}}, + {X: Field{[10]uint32{0x01caaefe, 0x009aa175, 0x00576851, 0x003c5d76, 0x00bc3e2c, 0x033d1b03, 0x0323e6cd, 0x03e41460, 0x0350fb60, 0x000a2f83}}, Y: Field{[10]uint32{0x022b7320, 0x03e6e8e1, 0x009de21b, 0x030fa590, 0x028d986f, 0x01a30c5d, 0x01404295, 0x02313384, 0x00f7fb18, 0x00173016}}}, + {X: Field{[10]uint32{0x014673a0, 0x012128a6, 0x00eb6f23, 0x0189fe3c, 0x02837e22, 0x0273e0e7, 0x029218ad, 0x03eb522d, 0x00badd2d, 0x0002db73}}, Y: Field{[10]uint32{0x022de992, 0x033f533e, 0x02eafb52, 0x01daba07, 0x02496231, 0x03731cc2, 0x00aa2ab5, 0x005899dd, 0x02d7297f, 0x00387052}}}, + {X: Field{[10]uint32{0x03766a87, 0x01c25578, 0x02e1dbe7, 0x03e4066e, 0x02b9cbb0, 0x0317f369, 0x03ecec9d, 0x03df95e9, 0x02c88813, 0x003917af}}, Y: Field{[10]uint32{0x01fbb07a, 0x004d7ac3, 0x028563ff, 0x01fc4e91, 0x03f915cc, 0x02b2eaa7, 0x03848857, 0x00de0df0, 0x00bb4ccf, 0x000e98a8}}}, + {X: Field{[10]uint32{0x00dccdbb, 0x0087faba, 0x030eb07b, 0x001f7d97, 0x0059bc9d, 0x00adf21d, 0x00b9e552, 0x02752078, 0x037726f3, 0x0037a49b}}, Y: Field{[10]uint32{0x004d8e05, 0x00d9fd8c, 0x02ba0f5f, 0x02c75c86, 0x01115be2, 0x008e7db8, 0x03618ce1, 0x01090092, 0x02a9263d, 0x00274643}}}, + {X: Field{[10]uint32{0x00f2caf0, 0x0280fcbb, 0x03091b54, 0x00b84c17, 0x0091e427, 0x01a5c8ad, 0x03948075, 0x027011b5, 0x03842066, 0x003dd884}}, Y: Field{[10]uint32{0x039e4914, 0x00a4f412, 0x00f6d12d, 0x00aed31f, 0x033088c9, 0x016432a8, 0x01945284, 0x03caa571, 0x00e5a227, 0x003431fa}}}, + {X: Field{[10]uint32{0x025ce751, 0x02effa15, 0x0037d4a8, 0x03458669, 0x01a5cdb1, 0x02e83ae7, 0x00d472e8, 0x03b823d1, 0x028644ff, 0x00139e57}}, Y: Field{[10]uint32{0x0190a4e0, 0x03a0f885, 0x03549749, 0x0156672c, 0x0365038c, 0x01d47961, 0x01b4be3c, 0x01a3e6ee, 0x00e54782, 0x0014a4b6}}}, + {X: Field{[10]uint32{0x01b50b3d, 0x0174b4b7, 0x03559bf4, 0x0237a15d, 0x01cdf75e, 0x02248d4c, 0x0333a97c, 0x02c0fcca, 0x0289a944, 0x001c3991}}, Y: Field{[10]uint32{0x00225586, 0x01349483, 0x0151a536, 0x02eea45a, 0x03925a93, 0x01c79bb7, 0x01ae263c, 0x0226928b, 0x02e5460b, 0x00299d71}}}, + {X: Field{[10]uint32{0x0367056b, 0x02d73c96, 0x020fab08, 0x0240ee76, 0x03477ef3, 0x02d2ffc7, 0x00b8c1c8, 0x0091f803, 0x002e682b, 0x000858df}}, Y: Field{[10]uint32{0x0292d882, 0x0125e793, 0x00e04831, 0x01638934, 0x03c5716b, 0x009f60e1, 0x00c2b6c7, 0x006955f9, 0x025e3e76, 0x0038d5c5}}}, + {X: Field{[10]uint32{0x001d1964, 0x015828e7, 0x02949a40, 0x02c5d19a, 0x03d8ae5b, 0x00062f6e, 0x01a41350, 0x034b85d0, 0x039908da, 0x001da468}}, Y: Field{[10]uint32{0x02422b74, 0x020711c2, 0x00be4d8c, 0x0038a31a, 0x03025728, 0x01db9fc9, 0x03f2296f, 0x016edb36, 0x0004b05b, 0x000897c5}}}, + {X: Field{[10]uint32{0x01af9302, 0x0266be1e, 0x012cb698, 0x0244361d, 0x01b0d11e, 0x009faafe, 0x035a14b0, 0x0021266b, 0x02a4f395, 0x001d20c5}}, Y: Field{[10]uint32{0x03fd7ee2, 0x00c11ed6, 0x0061f179, 0x006e7a11, 0x00f600fc, 0x037628b1, 0x0187c126, 0x0027630f, 0x00d26bd7, 0x00337375}}}, + {X: Field{[10]uint32{0x02ed9b8a, 0x03f83bfd, 0x03390c2f, 0x0146001a, 0x00a97089, 0x007814a5, 0x0084aa6c, 0x03a171b7, 0x01ab3839, 0x002bd623}}, Y: Field{[10]uint32{0x03d9cff0, 0x0055058d, 0x0081d870, 0x00d633c3, 0x01616ca1, 0x03800aab, 0x014131f5, 0x01523c9e, 0x02401b06, 0x0028f4dd}}}, + {X: Field{[10]uint32{0x01b42dc6, 0x011b8436, 0x0253735c, 0x001dbc2d, 0x005f869d, 0x0255ca2c, 0x03617969, 0x01bfec66, 0x00603170, 0x002f6477}}, Y: Field{[10]uint32{0x00f153b2, 0x01c41d91, 0x01a6d161, 0x03df5949, 0x00cdce2c, 0x0381c21c, 0x028db8ed, 0x03d71868, 0x02d15a74, 0x000f258f}}}, + {X: Field{[10]uint32{0x01e98f47, 0x01ccbb7b, 0x0382d985, 0x0209f7ae, 0x030c202c, 0x0132c787, 0x03aa583c, 0x002efd70, 0x00a59146, 0x00398971}}, Y: Field{[10]uint32{0x0170b72e, 0x03733056, 0x0299d7fd, 0x0187244c, 0x000812a4, 0x0392b180, 0x02505348, 0x014e5877, 0x01f9a903, 0x003409b1}}}, + {X: Field{[10]uint32{0x03daac1c, 0x023f971f, 0x000e8ebc, 0x015f6566, 0x00122cd0, 0x0060d5f9, 0x014553c7, 0x024ebe2e, 0x03fed4b1, 0x001af489}}, Y: Field{[10]uint32{0x0221a9f9, 0x03549271, 0x039f022f, 0x012792de, 0x03c66a05, 0x0028ad39, 0x01835d3b, 0x02c1127b, 0x01400a98, 0x0017cff9}}}, + {X: Field{[10]uint32{0x02db2609, 0x03d99907, 0x02f495cf, 0x03e5531b, 0x0068a0f0, 0x016cd39f, 0x03d3872c, 0x01bce148, 0x0225895e, 0x0009dc1e}}, Y: Field{[10]uint32{0x02a777ee, 0x0060088f, 0x0335e03a, 0x02452337, 0x01e5de5c, 0x01fd9dfa, 0x0334b38f, 0x035a5da7, 0x038ec893, 0x003bdbd3}}}, + {X: Field{[10]uint32{0x03f0ebde, 0x005383f3, 0x026db1f3, 0x03039d51, 0x00c01770, 0x010a135f, 0x03770ea0, 0x01053aed, 0x008e3359, 0x00181489}}, Y: Field{[10]uint32{0x03f7b7a2, 0x00638ab8, 0x0312c8b1, 0x034c72e5, 0x031a1ac7, 0x02a955be, 0x0262e020, 0x03551a7e, 0x00585cf0, 0x000f6608}}}, + {X: Field{[10]uint32{0x0370f6bc, 0x0168453c, 0x0150e6c7, 0x019a6d15, 0x034d4fc6, 0x02c8a615, 0x01825068, 0x0049305b, 0x03534fa6, 0x003cb2d6}}, Y: Field{[10]uint32{0x0241112e, 0x029d02dc, 0x008a0ad7, 0x02ef17eb, 0x038ec9dc, 0x00f31de7, 0x0152def4, 0x032b484e, 0x030763a5, 0x00173795}}}, + {X: Field{[10]uint32{0x007a502e, 0x0342c8fa, 0x01b20aa9, 0x01453bdb, 0x0304989b, 0x01d71807, 0x00030c7a, 0x02e7e782, 0x02159fe6, 0x001deb60}}, Y: Field{[10]uint32{0x029b703d, 0x031a037a, 0x0132a87f, 0x01e266be, 0x0300c136, 0x02e87aec, 0x0056add2, 0x0124c9d2, 0x01eeffc2, 0x00249a28}}}, + {X: Field{[10]uint32{0x028fd29d, 0x0132f252, 0x001c8a11, 0x003ee93b, 0x035cc9aa, 0x00b5e246, 0x0380fd7c, 0x03e03e9f, 0x008d171c, 0x0011061d}}, Y: Field{[10]uint32{0x031835c1, 0x02ed063e, 0x02aeebab, 0x01aa99f1, 0x029916c1, 0x009e7f9e, 0x0318322b, 0x006dfdcb, 0x028579f0, 0x000144c0}}}, + {X: Field{[10]uint32{0x027355e0, 0x01f5f98d, 0x008831d3, 0x03ff7df4, 0x01126e59, 0x0046a09b, 0x01901b4d, 0x0321edf9, 0x01606f89, 0x0005abd2}}, Y: Field{[10]uint32{0x00b04c2e, 0x0130b353, 0x009f68ca, 0x03a943b8, 0x0012c8e8, 0x03a8ece3, 0x02131ca8, 0x008f27a3, 0x00405372, 0x000684e1}}}, + {X: Field{[10]uint32{0x02120f9d, 0x00e4be77, 0x03e4aae6, 0x00c0d49d, 0x000730a7, 0x03606123, 0x037ba0ca, 0x00c6e33d, 0x003cab44, 0x0008b481}}, Y: Field{[10]uint32{0x011b8acd, 0x03d3dae6, 0x0145a432, 0x03263b4f, 0x034d71f9, 0x01ff33e7, 0x036520ac, 0x011b4270, 0x01ad5e5b, 0x0035de57}}}, + {X: Field{[10]uint32{0x03676302, 0x02cc9c55, 0x017349fb, 0x022ec906, 0x0241d92c, 0x03d8912d, 0x02033602, 0x0194cdf8, 0x028b3482, 0x00015f9e}}, Y: Field{[10]uint32{0x0199b83a, 0x00a00ed1, 0x022a0975, 0x0374f473, 0x015146af, 0x02ecb951, 0x02bd2eb6, 0x0322cb0e, 0x00e8ba4b, 0x0013648e}}}, + {X: Field{[10]uint32{0x02acc359, 0x01156c09, 0x009da9ab, 0x02093018, 0x007ea19a, 0x01776ac7, 0x02b39ed0, 0x0009f8a0, 0x03602755, 0x0011559f}}, Y: Field{[10]uint32{0x0134f5a7, 0x02e92350, 0x03d4c2fb, 0x03dfdc9b, 0x0182c1cc, 0x0104e4b7, 0x02291611, 0x0153b790, 0x015a77a3, 0x0036d57b}}}, + {X: Field{[10]uint32{0x027fa80f, 0x03e9683d, 0x00c383e8, 0x039c68a1, 0x01798a0b, 0x02114c80, 0x001933ca, 0x024d1e77, 0x01549105, 0x0025a3ed}}, Y: Field{[10]uint32{0x00e8920e, 0x01332849, 0x00bd0b16, 0x0007740f, 0x0201c141, 0x019c60dd, 0x02d83945, 0x03d5430d, 0x02b16853, 0x00018d61}}}, + {X: Field{[10]uint32{0x01873107, 0x0050946b, 0x02d1714c, 0x033446bc, 0x013d640a, 0x01e3dee1, 0x03ef522b, 0x00f35fc7, 0x02490f63, 0x003cd9b1}}, Y: Field{[10]uint32{0x0082c6b9, 0x03ed971d, 0x01546e56, 0x0355c46b, 0x0325b260, 0x0275057b, 0x004cfab5, 0x0262360b, 0x02af38f4, 0x0017f0e5}}}, + {X: Field{[10]uint32{0x00201d06, 0x01a1d0ff, 0x026e9ad0, 0x0224540f, 0x0059b192, 0x00acf0a7, 0x0016effd, 0x01a2cbb7, 0x03d44a2e, 0x002a8313}}, Y: Field{[10]uint32{0x033fee33, 0x037e2dff, 0x01b82b5d, 0x028952a9, 0x002763ac, 0x01d89c34, 0x00b5c4db, 0x01e5dd19, 0x02242fba, 0x0018538c}}}, + {X: Field{[10]uint32{0x032cc876, 0x01125223, 0x00ad2b44, 0x033cdd21, 0x01da4cbd, 0x02a0c391, 0x0057abbd, 0x033b1a47, 0x00ee19b2, 0x001b221b}}, Y: Field{[10]uint32{0x02fc16a1, 0x012e5382, 0x01cf5def, 0x025ef3cb, 0x02a197e8, 0x03b19396, 0x03eb384f, 0x037e1c21, 0x03bd9ab4, 0x000933f2}}}, + {X: Field{[10]uint32{0x02095554, 0x005e16f1, 0x02e439a8, 0x032b7cef, 0x00fbe5e4, 0x0045b538, 0x01d1686f, 0x01dbbb20, 0x0199c33f, 0x00135800}}, Y: Field{[10]uint32{0x03ae614a, 0x0057cc97, 0x028e9dad, 0x03127c58, 0x032bf73d, 0x037fb5d0, 0x01d4321f, 0x03dc3845, 0x00ceb769, 0x0032d053}}}, + {X: Field{[10]uint32{0x010a4fc2, 0x01689697, 0x0230aa67, 0x032b4bc8, 0x0212c3ca, 0x02d96ec5, 0x01e84724, 0x0167839c, 0x00a0196d, 0x000ddf74}}, Y: Field{[10]uint32{0x00feb560, 0x010f1d2b, 0x0338fe03, 0x00d8ad47, 0x021159c7, 0x02cd25d4, 0x03f7c270, 0x009f7297, 0x027d8c8e, 0x000b1c9f}}}, + {X: Field{[10]uint32{0x00820f46, 0x024a2967, 0x025529ca, 0x006633cd, 0x02e8aa50, 0x036402e2, 0x031826f9, 0x037cd46e, 0x038a23af, 0x00273033}}, Y: Field{[10]uint32{0x03e67256, 0x0234d1fd, 0x031f8b06, 0x01197554, 0x00693e54, 0x0290e828, 0x0142c53e, 0x0302a320, 0x015be2aa, 0x002d5cbc}}}, + {X: Field{[10]uint32{0x01fa3050, 0x01363b46, 0x000ead4a, 0x03aa9471, 0x024cfb01, 0x02f81107, 0x01d154a2, 0x00ac7a60, 0x02a64149, 0x0035577e}}, Y: Field{[10]uint32{0x03238ac1, 0x02cb9463, 0x012eb45f, 0x01dc30b7, 0x02da0c4c, 0x008e879c, 0x0098f315, 0x01d30aa6, 0x01cb408c, 0x000b9e57}}}, + {X: Field{[10]uint32{0x01210fd5, 0x001b7b9f, 0x024e8463, 0x021c9e5c, 0x02e3d27e, 0x02b1b01f, 0x035efb3f, 0x00c548c1, 0x03d72d11, 0x0011afd8}}, Y: Field{[10]uint32{0x03b0b199, 0x02cb220c, 0x002fc94c, 0x00dccb8a, 0x02dc4a2e, 0x02417128, 0x03b433a2, 0x00c94df8, 0x01f230fa, 0x001dc6ec}}}, + {X: Field{[10]uint32{0x00ca3aad, 0x000165d4, 0x03a3a13f, 0x02e306a6, 0x03594ef8, 0x01d79f0e, 0x02f1826f, 0x01f05e31, 0x038803e7, 0x0012f3f8}}, Y: Field{[10]uint32{0x021b0129, 0x02abd522, 0x009b62dd, 0x008ed1f4, 0x00ec5ea9, 0x03014e27, 0x0283cf56, 0x0119cbe8, 0x02939dcf, 0x002d558b}}}, + {X: Field{[10]uint32{0x00c241db, 0x01d1ee36, 0x02c57df9, 0x00e477dd, 0x016255ba, 0x012eca92, 0x00ce8023, 0x01a7bb5f, 0x02f4715e, 0x00325a06}}, Y: Field{[10]uint32{0x01e038e6, 0x0087dfb3, 0x02e0828c, 0x0204c420, 0x00da530e, 0x006f72c1, 0x02bb8468, 0x0148197c, 0x01cbb03d, 0x00322c5d}}}, + {X: Field{[10]uint32{0x02fbc33c, 0x02c5af30, 0x00101790, 0x02f531ad, 0x01bd5538, 0x02d3daba, 0x022671a3, 0x01ab1fd2, 0x021b56bd, 0x00027e82}}, Y: Field{[10]uint32{0x03129e63, 0x03f62d8c, 0x01fb5c08, 0x01a1b511, 0x0016056f, 0x0122d219, 0x00599593, 0x01f33b92, 0x02be785c, 0x0009fe7a}}}, + {X: Field{[10]uint32{0x03d0381e, 0x03b1a91c, 0x01feaa56, 0x03caf038, 0x03a87203, 0x019de593, 0x023e7b98, 0x022ab01c, 0x01f0ca17, 0x0005410b}}, Y: Field{[10]uint32{0x010183f2, 0x03b8ef63, 0x033a1677, 0x03f49082, 0x03e271cb, 0x0050f9d7, 0x039eb59a, 0x01ac37e3, 0x0257dac8, 0x0011176d}}}, + {X: Field{[10]uint32{0x0337e9b2, 0x022c0c87, 0x00b65eb0, 0x03403abe, 0x036b7f9d, 0x00876dd9, 0x027da3e9, 0x0061df83, 0x02630d4c, 0x000d53da}}, Y: Field{[10]uint32{0x004ea8fc, 0x026a8ac4, 0x03fea555, 0x0361942f, 0x012eb784, 0x010fbf59, 0x032f480a, 0x0202fbad, 0x003bd65b, 0x00040014}}}, + {X: Field{[10]uint32{0x01de065c, 0x010c3166, 0x03d8ac11, 0x0139e6b8, 0x029e4ba7, 0x009c1f5b, 0x00d8864d, 0x023f0127, 0x01617a44, 0x000670d8}}, Y: Field{[10]uint32{0x009acff5, 0x001bcc26, 0x022fa4dd, 0x00605842, 0x0275742d, 0x02dca67b, 0x02f570c1, 0x03ba0653, 0x03d8fd38, 0x000be7e7}}}, + {X: Field{[10]uint32{0x0083f88e, 0x0130519c, 0x01d395bd, 0x01ed5b39, 0x035a5080, 0x03767ea3, 0x027a2d4a, 0x02299ada, 0x008ad2ab, 0x000dce61}}, Y: Field{[10]uint32{0x01f0cbc9, 0x02058b19, 0x0151e6f5, 0x002440da, 0x01068a54, 0x00b86233, 0x01d20569, 0x000af7d3, 0x00206111, 0x001bf5c6}}}, + {X: Field{[10]uint32{0x0010aa35, 0x018bab07, 0x01ba9500, 0x023e2b1b, 0x012dd7e5, 0x0212e13d, 0x00e66f1f, 0x008cd9f7, 0x0345261c, 0x002708b2}}, Y: Field{[10]uint32{0x012a1116, 0x02fb9901, 0x0146ec8d, 0x005c665b, 0x03605b00, 0x021b72e7, 0x00bead62, 0x02f9ca44, 0x03f58c25, 0x003fe138}}}, + {X: Field{[10]uint32{0x01b4538e, 0x02f7525b, 0x03abbd0f, 0x0215d44f, 0x015a4127, 0x038df155, 0x00c71e45, 0x005cc9fb, 0x01c87f31, 0x0015c851}}, Y: Field{[10]uint32{0x0238871f, 0x031e4422, 0x03550242, 0x02b013a9, 0x015338c6, 0x00485523, 0x02d5166c, 0x002368ab, 0x03ac5e39, 0x00058f98}}}, + {X: Field{[10]uint32{0x01e940ef, 0x0078c84b, 0x0285bd93, 0x036636e1, 0x034c641e, 0x006a59b1, 0x03213b75, 0x00fad63b, 0x0154d841, 0x00327c1e}}, Y: Field{[10]uint32{0x01e17fd0, 0x03061333, 0x0041d792, 0x03cfb7a4, 0x0092cf5a, 0x0026f3b3, 0x025fe7cb, 0x00f4f281, 0x00bc804f, 0x00279a11}}}, + {X: Field{[10]uint32{0x007f25e3, 0x024684de, 0x000c3f92, 0x02a83a20, 0x01f7b0e4, 0x0016a294, 0x024a24df, 0x0228a759, 0x0346b07c, 0x002b0a5f}}, Y: Field{[10]uint32{0x01b66cbb, 0x02637a0a, 0x0185875e, 0x01ddd4f0, 0x02b1556c, 0x01297460, 0x01bbca05, 0x016b5ff4, 0x037f78e4, 0x001a1b8e}}}, + {X: Field{[10]uint32{0x00b3e1b5, 0x025e4d26, 0x0198c218, 0x02f202f0, 0x035ad55d, 0x0087b688, 0x00274df1, 0x029a20e4, 0x013bb383, 0x0001b164}}, Y: Field{[10]uint32{0x00b9ccf1, 0x016ab78b, 0x00dc91c3, 0x02d743de, 0x0153e5b4, 0x00789295, 0x011ebf46, 0x027d28bc, 0x003ae364, 0x00152e6e}}}, + {X: Field{[10]uint32{0x032495df, 0x03aa396b, 0x01b45cf7, 0x03f71e4f, 0x01846e3e, 0x0058f2fe, 0x0259ee92, 0x00d5afb2, 0x03a3f503, 0x002e649b}}, Y: Field{[10]uint32{0x02e2a512, 0x03e41510, 0x03047bb8, 0x0030402f, 0x01054fd0, 0x03f05781, 0x0015c511, 0x039e87b5, 0x03c533d4, 0x00035b75}}}, + {X: Field{[10]uint32{0x00e69556, 0x01ceb61d, 0x03d5a314, 0x03314d5f, 0x03cb36ad, 0x0181cc15, 0x00ac758f, 0x02f9dff8, 0x01d2f2ca, 0x0010c974}}, Y: Field{[10]uint32{0x034904a9, 0x029f53d4, 0x01932ed5, 0x02d7116b, 0x03818c8f, 0x01833123, 0x030562d5, 0x00c57e21, 0x01682ff6, 0x003790de}}}, + {X: Field{[10]uint32{0x00164917, 0x022a3045, 0x03f110d3, 0x037346ff, 0x00eed924, 0x0387103d, 0x03c9059c, 0x02ff292b, 0x015ffd84, 0x002860fa}}, Y: Field{[10]uint32{0x01d64b95, 0x0006ed10, 0x017f0a0d, 0x0176fbc1, 0x00c38d69, 0x0337e57b, 0x005046d4, 0x03290405, 0x0210c7ff, 0x0004715d}}}, + {X: Field{[10]uint32{0x00d07114, 0x017a205b, 0x0009184d, 0x03f4eeaa, 0x02ab7af5, 0x0123f6f0, 0x0251414f, 0x00a3c365, 0x00d9ad65, 0x002cd034}}, Y: Field{[10]uint32{0x020dd4e1, 0x03410384, 0x01384919, 0x02a6db0f, 0x02ae2671, 0x00392da3, 0x024dfbd4, 0x01c3dfe5, 0x026a9ecd, 0x00217b5c}}}, + {X: Field{[10]uint32{0x02719377, 0x03cd3085, 0x0240e8e6, 0x038db035, 0x00b146fa, 0x02781d74, 0x015f0a4c, 0x00be9056, 0x02883599, 0x002d4b6a}}, Y: Field{[10]uint32{0x024ad7ad, 0x0324391e, 0x029df85e, 0x020892c5, 0x004f42f0, 0x011e31e8, 0x00b5cbad, 0x00e2269b, 0x01399fa8, 0x0018222c}}}, + {X: Field{[10]uint32{0x02b9d8ad, 0x015c268a, 0x0218d5dc, 0x00d9148e, 0x01f269ba, 0x030ad7f9, 0x03f82bf7, 0x03e23a7d, 0x011542b0, 0x000242ef}}, Y: Field{[10]uint32{0x028fc4e5, 0x039cd214, 0x00743e06, 0x02432a9a, 0x03c69584, 0x034dd0f7, 0x01461d2b, 0x00d1329c, 0x024a51af, 0x003277e4}}}, + {X: Field{[10]uint32{0x03aa8365, 0x023a9aa8, 0x01fd2278, 0x03ed0e2c, 0x02b31c54, 0x00b24c4b, 0x03d4603f, 0x00653fb4, 0x01a81696, 0x003dcbb9}}, Y: Field{[10]uint32{0x010fde8a, 0x0305c879, 0x0307404f, 0x0331e159, 0x010e66f4, 0x035169cb, 0x03c1078c, 0x003d2e3f, 0x0182b6ca, 0x0038a58f}}}, + {X: Field{[10]uint32{0x02b9fb53, 0x02a0e5f9, 0x01298c35, 0x0137667e, 0x0366a10f, 0x03f4d23c, 0x035d6ddd, 0x0014950b, 0x03715bc7, 0x000422ba}}, Y: Field{[10]uint32{0x0209f1ce, 0x0273c70c, 0x0145b49b, 0x01c2b1af, 0x0297b8d9, 0x00dca261, 0x036df472, 0x02381283, 0x033975a5, 0x0020e22c}}}, + {X: Field{[10]uint32{0x0361d5b0, 0x019fedbf, 0x02e86e26, 0x000524f8, 0x00fe54c9, 0x01fd189a, 0x00a5ff5c, 0x017afe09, 0x02ed8734, 0x00370f6b}}, Y: Field{[10]uint32{0x013411e5, 0x003e2776, 0x01d56da2, 0x01e64ca9, 0x02cf0010, 0x02ad1fd9, 0x02c1683b, 0x00119c65, 0x0241238e, 0x002d69f9}}}, + {X: Field{[10]uint32{0x0265c589, 0x01e70190, 0x03ef9381, 0x00cbe35a, 0x03a82c5f, 0x00e14fbc, 0x01e1d26e, 0x018483a0, 0x003c2be1, 0x000fe5aa}}, Y: Field{[10]uint32{0x035c64b3, 0x00dc4c5a, 0x03a0f2ea, 0x03eaebff, 0x01630ba1, 0x03ef409f, 0x020d7349, 0x03c83f56, 0x030e797c, 0x003ae34d}}}, + {X: Field{[10]uint32{0x03f5c4f3, 0x004ee5bb, 0x038661de, 0x01febc6d, 0x03b35835, 0x00913ef8, 0x00a22780, 0x008f8c73, 0x006ce1f4, 0x0009f2be}}, Y: Field{[10]uint32{0x02b30f61, 0x03e86e28, 0x005a139b, 0x0128bcb5, 0x032187e2, 0x036f7283, 0x03ddbc23, 0x033ed18c, 0x0318647a, 0x003a3ddd}}}, + {X: Field{[10]uint32{0x0374d04f, 0x00931883, 0x0236167a, 0x0071f020, 0x012d301a, 0x01206591, 0x007f9648, 0x021e1862, 0x03b9e241, 0x0019a073}}, Y: Field{[10]uint32{0x0015151d, 0x02d28dee, 0x017608dc, 0x01a66353, 0x03f1ce48, 0x0023447b, 0x01f521cc, 0x03a510bd, 0x033a7849, 0x0027227a}}}, + {X: Field{[10]uint32{0x02ba8da5, 0x02c3996f, 0x0280e67f, 0x03705e57, 0x02fcac45, 0x03eeebe8, 0x02747092, 0x0118e59c, 0x00494866, 0x0019c46e}}, Y: Field{[10]uint32{0x014cfcc6, 0x00ac964a, 0x00118b81, 0x017d834b, 0x016b986a, 0x02f2a947, 0x02d8cecb, 0x017b6488, 0x003f1c8f, 0x003284b2}}}, + {X: Field{[10]uint32{0x031dd94d, 0x0210f8ad, 0x010118b7, 0x019c89da, 0x01fdd734, 0x01a61d71, 0x03d22b05, 0x00b36e83, 0x03d0b110, 0x0017ba73}}, Y: Field{[10]uint32{0x007d7d86, 0x00087782, 0x0063aed9, 0x02522d7d, 0x02060d22, 0x026d80cc, 0x03c518f1, 0x027b9385, 0x00e5bd7f, 0x000775e9}}}, + {X: Field{[10]uint32{0x01f4924c, 0x028fcabb, 0x01785e38, 0x0074b4b6, 0x02d7538f, 0x03408937, 0x0195a466, 0x002f9bcf, 0x017b1339, 0x00161b6b}}, Y: Field{[10]uint32{0x002b64d0, 0x0365e1b3, 0x039867be, 0x00072657, 0x00bc2fb1, 0x00467963, 0x035bd337, 0x00d6085c, 0x01a5a68a, 0x0031ddfb}}}, + {X: Field{[10]uint32{0x025091ec, 0x01c94359, 0x02d9184f, 0x0382b63b, 0x00867f6e, 0x003771fa, 0x024b6e69, 0x004b1c64, 0x02d20fa0, 0x000169d4}}, Y: Field{[10]uint32{0x03b95db6, 0x02ba0651, 0x02d27d53, 0x025d7cb2, 0x03ec1ace, 0x01e2410b, 0x01029fc5, 0x0190a7c5, 0x032b32b3, 0x0015fc88}}}, + {X: Field{[10]uint32{0x013e638e, 0x02a01929, 0x02e60002, 0x0381ef9c, 0x02426372, 0x01e3ac50, 0x00fef223, 0x015dfaa7, 0x02ff22bc, 0x003e4f2f}}, Y: Field{[10]uint32{0x03afe50f, 0x00d08de0, 0x00a5996f, 0x01755c64, 0x03eeadb7, 0x009e793c, 0x03166702, 0x036d0a52, 0x02bb401b, 0x002af1dc}}}, + {X: Field{[10]uint32{0x012608a9, 0x00053a43, 0x038cc3dd, 0x03ee15ba, 0x0076052c, 0x029b98eb, 0x03c34c36, 0x0025c8bb, 0x009e9613, 0x002309cb}}, Y: Field{[10]uint32{0x024607b3, 0x03a49f9b, 0x02dfde85, 0x0058d257, 0x03731e37, 0x022d5000, 0x027d2261, 0x01c588ee, 0x016813c5, 0x002661f4}}}, + {X: Field{[10]uint32{0x01769bc5, 0x021f0453, 0x015e23e1, 0x01327e55, 0x0038dfd8, 0x00e1b770, 0x00226c4d, 0x0150ae95, 0x00d61519, 0x002fde28}}, Y: Field{[10]uint32{0x01910280, 0x01bb262c, 0x00fe55d2, 0x01f4c56f, 0x03e16058, 0x010a567b, 0x0014b59d, 0x03020798, 0x01e4d84e, 0x00182538}}}, + {X: Field{[10]uint32{0x02e65caa, 0x03f6e64c, 0x02b28ee1, 0x016b8c47, 0x01497aaa, 0x0109217f, 0x03ab651f, 0x00a86ffe, 0x0376cd09, 0x0016c992}}, Y: Field{[10]uint32{0x01d70d78, 0x0062381a, 0x00c84c8c, 0x008b5762, 0x021dd847, 0x015a56c1, 0x010fdc88, 0x035f0d98, 0x03594b68, 0x002513e4}}}, + {X: Field{[10]uint32{0x0082b559, 0x03810ab0, 0x027974b7, 0x014409d3, 0x01322f71, 0x03451dc1, 0x03c14598, 0x028344ce, 0x00ea8075, 0x002891cf}}, Y: Field{[10]uint32{0x02575a18, 0x01a2a268, 0x004b5d2c, 0x00a9c212, 0x035168d3, 0x03db2416, 0x0309d794, 0x01ec1b66, 0x030db655, 0x001937a0}}}, + {X: Field{[10]uint32{0x009efa45, 0x022a00d8, 0x02350652, 0x002028a4, 0x01f14b07, 0x01c21ef5, 0x001535da, 0x0314510d, 0x01e63dd0, 0x000f8635}}, Y: Field{[10]uint32{0x00288c5b, 0x027fd9d5, 0x030a6e1d, 0x00589aa7, 0x0026dc2f, 0x0394d1c3, 0x02fd041b, 0x01ce0be0, 0x01b97d00, 0x001ba71c}}}, + {X: Field{[10]uint32{0x0294dfa5, 0x03d855a0, 0x0184b71a, 0x01050a16, 0x026a7674, 0x0308a421, 0x0296eb09, 0x018c56f3, 0x03cdb91e, 0x00346b36}}, Y: Field{[10]uint32{0x013da5a4, 0x03a7e218, 0x014522c9, 0x03a59ae6, 0x00accb67, 0x00f8a74f, 0x00072017, 0x00dd70fe, 0x00d89872, 0x00178ec3}}}, + {X: Field{[10]uint32{0x0050c90d, 0x002badf6, 0x024e1a21, 0x00a3103d, 0x0125ddb0, 0x00d7b3dd, 0x02cc880a, 0x0383cad7, 0x01e29344, 0x000eaa66}}, Y: Field{[10]uint32{0x0143d42b, 0x00eaafe9, 0x01951567, 0x013b1f28, 0x01028c45, 0x027a6a20, 0x02e6fcbe, 0x0286fb74, 0x025cfbe3, 0x00334b38}}}, + {X: Field{[10]uint32{0x01a5017d, 0x0359c258, 0x02398146, 0x0389692d, 0x033e1b31, 0x028e9b28, 0x010aa4c8, 0x00572fb3, 0x021d7c38, 0x0026288d}}, Y: Field{[10]uint32{0x0009f2bc, 0x01c4a28b, 0x00de6d39, 0x01753674, 0x01516df2, 0x035e380e, 0x00213958, 0x00304efa, 0x03780304, 0x0007ccf7}}}, + {X: Field{[10]uint32{0x013d98d0, 0x01459d01, 0x03cc4613, 0x011ef86d, 0x03ff3482, 0x0132da72, 0x03a55628, 0x02e1c1b5, 0x018c907a, 0x0014a2e7}}, Y: Field{[10]uint32{0x01eafabd, 0x01fab4f7, 0x01051aba, 0x014c6531, 0x0129700d, 0x00028450, 0x02d67bb8, 0x015de1f1, 0x0036d666, 0x003e47ae}}}, + {X: Field{[10]uint32{0x025029b6, 0x01b07398, 0x0193a355, 0x0398b236, 0x00f4be50, 0x02e33dcc, 0x01a6a866, 0x0034822f, 0x008d3d1b, 0x003c6b7b}}, Y: Field{[10]uint32{0x03cc7224, 0x01d07506, 0x0178f964, 0x0153822a, 0x0257e4a7, 0x00b51e55, 0x03fb61b3, 0x01860896, 0x00aac3bf, 0x0011e0c9}}}, + {X: Field{[10]uint32{0x0124a099, 0x035429ce, 0x00f10f74, 0x0329d0aa, 0x000e0181, 0x01d752a8, 0x0070cf8d, 0x0056b106, 0x0133b1b1, 0x002acbbc}}, Y: Field{[10]uint32{0x026a91ea, 0x00a6ac15, 0x030a5756, 0x0339c29c, 0x012f2baa, 0x02302bda, 0x0149ef53, 0x03baad5e, 0x0374c584, 0x0028b11e}}}, + {X: Field{[10]uint32{0x00576f85, 0x0326c9f8, 0x00c72348, 0x01f4446e, 0x00539a61, 0x024dc21a, 0x0120e2bf, 0x01be0ec7, 0x001af6da, 0x002753ad}}, Y: Field{[10]uint32{0x01f30eea, 0x035accf1, 0x000d7cc5, 0x031c7096, 0x0373acc3, 0x00d4cc17, 0x02dfe904, 0x03213ea2, 0x000db786, 0x003071ec}}}, + {X: Field{[10]uint32{0x03b916d9, 0x01088a4f, 0x011d018a, 0x023e790c, 0x02a55363, 0x0367a418, 0x006dff05, 0x00b20722, 0x017f7b1b, 0x000c3b75}}, Y: Field{[10]uint32{0x00842ee7, 0x039f1291, 0x00502d44, 0x0192a8a2, 0x00f7449e, 0x02b3f38c, 0x0220b485, 0x015e8607, 0x034b16d2, 0x001af11d}}}, + {X: Field{[10]uint32{0x01306583, 0x00715d0c, 0x0066a41d, 0x029c7a04, 0x00f10969, 0x01248053, 0x0058fc6a, 0x02e15597, 0x039d09a2, 0x000a38fa}}, Y: Field{[10]uint32{0x03bb6c2c, 0x00f23f37, 0x00e7ddc9, 0x00577d2a, 0x0359ad3c, 0x030542b8, 0x025245c8, 0x01019c03, 0x03878073, 0x003f194e}}}, + {X: Field{[10]uint32{0x02ac75a3, 0x015c69a6, 0x00e08c91, 0x02d9d276, 0x035a3a8b, 0x03cfa098, 0x03be578f, 0x010b428b, 0x0335e3c8, 0x0032e611}}, Y: Field{[10]uint32{0x03ea8367, 0x0050a6de, 0x02268b48, 0x01efa64d, 0x004c3e25, 0x035c52bd, 0x013f977a, 0x030fd4c0, 0x00cc7181, 0x003a4d68}}}, + {X: Field{[10]uint32{0x000fe170, 0x00146ae9, 0x037a3ed0, 0x016c82a8, 0x015e4d66, 0x021437f3, 0x0283b106, 0x001fabba, 0x02727e83, 0x000d8619}}, Y: Field{[10]uint32{0x00707a6d, 0x03be3440, 0x0124be32, 0x03cb6976, 0x01ab27cb, 0x038b2cd2, 0x014c710c, 0x037007d7, 0x02d32ae6, 0x003b189b}}}, + {X: Field{[10]uint32{0x006b7d2e, 0x020ec5d3, 0x03136021, 0x02c8ed40, 0x034260ab, 0x032099ef, 0x02ccd54d, 0x03cd970a, 0x015e69e9, 0x002c6903}}, Y: Field{[10]uint32{0x01c186ec, 0x011cc28f, 0x027c3af0, 0x02a02eb8, 0x0331edde, 0x03bd8cba, 0x001ff894, 0x0107d490, 0x01ab2a7b, 0x001d9867}}}, + {X: Field{[10]uint32{0x01660825, 0x02c509c5, 0x02be242e, 0x00d75308, 0x00b32a8f, 0x00988019, 0x03f0ccb2, 0x00288fa0, 0x00b3dff6, 0x002af522}}, Y: Field{[10]uint32{0x000b3a89, 0x03dfc8e1, 0x0105be1b, 0x00124684, 0x03fa9949, 0x006122ea, 0x007a463d, 0x038ebe5b, 0x00f217da, 0x001bbfe0}}}, + {X: Field{[10]uint32{0x01d6aa22, 0x01443293, 0x00598c92, 0x0055cff9, 0x002a5721, 0x0086f6c4, 0x00979743, 0x03ad20bd, 0x0304d91c, 0x002b033e}}, Y: Field{[10]uint32{0x034582d5, 0x03958149, 0x02de81c5, 0x0129198a, 0x02395031, 0x0111d366, 0x018ae4a6, 0x0342a419, 0x01874a90, 0x001ad7db}}}, + {X: Field{[10]uint32{0x03c34432, 0x02ebc46b, 0x008e6087, 0x03cd54a5, 0x02a3a0bf, 0x0374762f, 0x03c75410, 0x012d9da5, 0x020f476c, 0x0007ea2f}}, Y: Field{[10]uint32{0x00788d33, 0x036d6ae0, 0x01e5496d, 0x01ae3d71, 0x03fe79df, 0x02071c61, 0x0161d201, 0x011878ca, 0x00848038, 0x0031ac94}}}, + {X: Field{[10]uint32{0x01f90e56, 0x03ed0970, 0x00ec9b29, 0x0355fa34, 0x03f336a4, 0x015717c3, 0x017d3137, 0x022626a0, 0x03c0d373, 0x000a06d0}}, Y: Field{[10]uint32{0x009f4a9c, 0x02a6ef2f, 0x03689921, 0x0111fe08, 0x03686830, 0x0089e9a9, 0x03e3db31, 0x016726dc, 0x030eba10, 0x0009ad41}}}, + {X: Field{[10]uint32{0x008f4052, 0x02c9a532, 0x02f120f0, 0x0118aa4a, 0x013b83eb, 0x01796a0b, 0x006327f5, 0x007b11d1, 0x01e954e8, 0x0035939a}}, Y: Field{[10]uint32{0x01c8622a, 0x0251e5cf, 0x030d58f3, 0x0036bebf, 0x0227a8f0, 0x019ba952, 0x0275565f, 0x00f28a6f, 0x015f284c, 0x002a9fb5}}}, + {X: Field{[10]uint32{0x00e7b028, 0x02f353f9, 0x03a5417b, 0x02315086, 0x01483fb5, 0x0185e08d, 0x035b0c9d, 0x0076c7c2, 0x02eed4b0, 0x003d336e}}, Y: Field{[10]uint32{0x02c63b47, 0x02eac641, 0x013021dd, 0x011e3aa4, 0x01b2b924, 0x02894022, 0x039f48c5, 0x0264137a, 0x00eb29d6, 0x0019b564}}}, + {X: Field{[10]uint32{0x03c9dca5, 0x00ffc2a4, 0x02f4c724, 0x0334779d, 0x00761fc1, 0x01e74868, 0x02ca8090, 0x038cd03f, 0x004a6c46, 0x0023fe53}}, Y: Field{[10]uint32{0x0149abf7, 0x00236bbc, 0x0377c2ab, 0x00d2a2ed, 0x01772071, 0x021ff731, 0x0342d4f1, 0x01a38ca7, 0x00335f3c, 0x00048f77}}}, + {X: Field{[10]uint32{0x03cf267a, 0x00fb3449, 0x01e705c3, 0x0313cabd, 0x00efed70, 0x00ed93ec, 0x007c0e62, 0x0061adfa, 0x01b46e34, 0x00031e1a}}, Y: Field{[10]uint32{0x0011f48a, 0x01c829d7, 0x01a59629, 0x0291a401, 0x03029aef, 0x0368aef5, 0x017d95d7, 0x002260bc, 0x00393662, 0x00198a55}}}, + {X: Field{[10]uint32{0x02cce1a4, 0x02c90c41, 0x00142351, 0x01c9bbb0, 0x0309836f, 0x016d4106, 0x026ba9e2, 0x03721ef4, 0x02c60ad5, 0x00383a9d}}, Y: Field{[10]uint32{0x00eff928, 0x00f52e35, 0x03dbc5a0, 0x005f22bd, 0x016a3a44, 0x02248ad9, 0x02a620a7, 0x0126ae22, 0x00e66320, 0x0022f5c9}}}, + {X: Field{[10]uint32{0x01e30159, 0x029fac4a, 0x027bfc6a, 0x03492d2a, 0x00e8e357, 0x0220fd4b, 0x0019f1f4, 0x022608d9, 0x02c73e5f, 0x000be98e}}, Y: Field{[10]uint32{0x00d8c3fd, 0x02c0e3ae, 0x01d517d0, 0x00a01bde, 0x007251db, 0x02d79711, 0x025b3146, 0x00fea3d6, 0x001cd632, 0x0015f858}}}, + {X: Field{[10]uint32{0x033026a1, 0x01b4cb71, 0x0012f6aa, 0x01dec808, 0x0149d008, 0x02ede99c, 0x02783fc1, 0x0024c08b, 0x0038d4c5, 0x001d3b50}}, Y: Field{[10]uint32{0x0328476f, 0x01bf509a, 0x0035e80e, 0x0200e3a6, 0x0258234f, 0x03deff69, 0x00618e49, 0x0027a233, 0x030e65d0, 0x0016dd3d}}}, + {X: Field{[10]uint32{0x00025f97, 0x03f4b63c, 0x01148eae, 0x03737101, 0x0216ce75, 0x03f7c83e, 0x02d1f934, 0x004f71b7, 0x00a6e387, 0x001c75ab}}, Y: Field{[10]uint32{0x0067e302, 0x00f9829c, 0x02bae0dd, 0x013688b6, 0x02072ffd, 0x0067da74, 0x00c6c4fb, 0x037f209e, 0x01337d48, 0x002d0c51}}}, + {X: Field{[10]uint32{0x03ed5292, 0x01d2b316, 0x004ac8a1, 0x031a25c1, 0x02ee617e, 0x0100a5eb, 0x02d5720f, 0x02f27e68, 0x03f16e91, 0x000a3ed1}}, Y: Field{[10]uint32{0x00b498f7, 0x02e1293e, 0x0059e0bd, 0x03b4ae9e, 0x00ef8e7a, 0x0250f06d, 0x00db6059, 0x01caf93f, 0x0161d724, 0x003412da}}}, + {X: Field{[10]uint32{0x0347a37a, 0x01c3b887, 0x036f8942, 0x0177898b, 0x03828c5a, 0x0269eccb, 0x02fca795, 0x016d7d74, 0x01f5c865, 0x001a3f35}}, Y: Field{[10]uint32{0x038d74ab, 0x009fcc9d, 0x01fb6d3d, 0x01395183, 0x017aa1ad, 0x029c409d, 0x032bc4e7, 0x01c59b0d, 0x02503362, 0x0015d201}}}, + {X: Field{[10]uint32{0x01aa36da, 0x0041a165, 0x03e97491, 0x01346b1a, 0x0117c974, 0x01e9800b, 0x017f8a8a, 0x02af11fb, 0x02d2f423, 0x0031d85e}}, Y: Field{[10]uint32{0x03121d9d, 0x01fd95ed, 0x022e8d59, 0x03f281b2, 0x0269e330, 0x00cf1852, 0x027a9db8, 0x01b2b72f, 0x0367fba9, 0x00366412}}}, + {X: Field{[10]uint32{0x02487cdd, 0x019864a9, 0x028c8df5, 0x00862c93, 0x01474fdc, 0x00966a74, 0x0278b955, 0x03f85b03, 0x029d2396, 0x0029fbd3}}, Y: Field{[10]uint32{0x02f67f28, 0x01427bd6, 0x015c1f40, 0x03753dd9, 0x0323c1e4, 0x01bc8bcd, 0x003f7e68, 0x02f81263, 0x020491c6, 0x00359e09}}}, + {X: Field{[10]uint32{0x031e2578, 0x01ad0d9d, 0x00890eab, 0x00602789, 0x0271856d, 0x00246ecb, 0x00e420f4, 0x00d9d92b, 0x00467ff0, 0x003cef9e}}, Y: Field{[10]uint32{0x0236dbc5, 0x0198aec1, 0x03309434, 0x00e9a047, 0x010dc58f, 0x02c9fff0, 0x026966f6, 0x03cf959e, 0x025745cb, 0x003cc09d}}}, + {X: Field{[10]uint32{0x02f0259c, 0x00fdd54d, 0x0347094d, 0x00a9385c, 0x016c8d9e, 0x03afd3cd, 0x0214c303, 0x0338a414, 0x03955bd9, 0x0017251f}}, Y: Field{[10]uint32{0x035e76cc, 0x02d729ed, 0x039c468f, 0x0235a3bc, 0x0190a81d, 0x015e2893, 0x01fdf498, 0x014a8f4b, 0x03753e75, 0x002daded}}}, + {X: Field{[10]uint32{0x018b2c68, 0x033d02ef, 0x00c134e4, 0x02274410, 0x002c54c1, 0x0309681d, 0x01b87028, 0x01cd789e, 0x0160c3b1, 0x0008dbf6}}, Y: Field{[10]uint32{0x01bbc279, 0x02b0e416, 0x01181873, 0x02fad097, 0x01b44bac, 0x01e69db3, 0x019360eb, 0x03063743, 0x03f7c0ba, 0x0026ad66}}}, + {X: Field{[10]uint32{0x01947b31, 0x0184ecec, 0x00d99cd7, 0x03ff2a2c, 0x02c1a9e9, 0x02e7624c, 0x01d02438, 0x038bdd96, 0x032617cc, 0x00324b27}}, Y: Field{[10]uint32{0x02357a51, 0x03f826d4, 0x0150b725, 0x037c54e7, 0x02e4804d, 0x006b38ac, 0x02707695, 0x0193ad97, 0x014c1a5e, 0x002af7aa}}}, + {X: Field{[10]uint32{0x01a94fc0, 0x0068509b, 0x03bd28bd, 0x03a02f07, 0x02733c2a, 0x0348b0c5, 0x0383a124, 0x018230cd, 0x03c9142c, 0x00261821}}, Y: Field{[10]uint32{0x0342a1cd, 0x01844fea, 0x0068d3fa, 0x0373ac9b, 0x038f5bad, 0x01158b37, 0x0282c650, 0x02d475af, 0x03f5fd76, 0x00052496}}}, + {X: Field{[10]uint32{0x008a1d43, 0x01e18869, 0x021bf914, 0x024e0ed0, 0x0222424e, 0x00d5942d, 0x0244e21f, 0x02eab5f1, 0x0374f4f6, 0x00119687}}, Y: Field{[10]uint32{0x0388cb48, 0x03fa48f1, 0x031579f2, 0x01ee0c91, 0x03d41c14, 0x036c0554, 0x02698d57, 0x00c2f7b9, 0x01e41794, 0x0009b69c}}}, + {X: Field{[10]uint32{0x009796b4, 0x033b9bd7, 0x00a00785, 0x03645643, 0x03c7aa2e, 0x002d1ab6, 0x033c88bd, 0x005f113f, 0x00cdf281, 0x00375d96}}, Y: Field{[10]uint32{0x03cc43be, 0x01ecd033, 0x00f37c1c, 0x0303ddf7, 0x039a9b8a, 0x0391749f, 0x034935a8, 0x03a65c29, 0x000d1e10, 0x000c8c5f}}}, + {X: Field{[10]uint32{0x03c72033, 0x033ae1d5, 0x02d09715, 0x022f766b, 0x006222af, 0x0097d4bf, 0x0148b177, 0x03127ad1, 0x02bfa803, 0x00156f4a}}, Y: Field{[10]uint32{0x013ebf43, 0x037f214f, 0x00e3553a, 0x02e10559, 0x0096b991, 0x0373ca95, 0x03c603b8, 0x0112ceaf, 0x03b39d73, 0x000d2b4c}}}, + {X: Field{[10]uint32{0x0012fcde, 0x0322297b, 0x03c36db0, 0x01d90627, 0x00440068, 0x0056c787, 0x01616d30, 0x0089b232, 0x0006d10c, 0x001def97}}, Y: Field{[10]uint32{0x029ba01b, 0x03f67810, 0x037f6ec8, 0x017b6597, 0x0020e8b5, 0x000d86e7, 0x0327ae1b, 0x01252623, 0x03ca5c47, 0x00333cb2}}}, + {X: Field{[10]uint32{0x012ab21c, 0x02dabcbd, 0x0161830d, 0x03bb52ed, 0x0180b890, 0x03a9f6f7, 0x0060b19b, 0x03c987c1, 0x00863eb6, 0x003eadc9}}, Y: Field{[10]uint32{0x0076d0b0, 0x00bdd322, 0x025c15d2, 0x03ebea76, 0x00b67f6a, 0x0276039a, 0x01174ed9, 0x00b8baaa, 0x003a408a, 0x0002453c}}}, + {X: Field{[10]uint32{0x020b2f66, 0x02e0208a, 0x005a109d, 0x017573c4, 0x02510db6, 0x039e0c52, 0x02671f8d, 0x022e1942, 0x0039fafe, 0x0008ca88}}, Y: Field{[10]uint32{0x0178576a, 0x03cfb0ab, 0x02218d95, 0x0389934b, 0x033be3a6, 0x0085bb04, 0x03b9f6ee, 0x03078d4c, 0x0082510b, 0x0005329c}}}, + {X: Field{[10]uint32{0x037f58e7, 0x00e41506, 0x00cfc64e, 0x028a252a, 0x01deee9f, 0x023c4f9a, 0x01847526, 0x013fde81, 0x0039612a, 0x002cd20a}}, Y: Field{[10]uint32{0x0126ae44, 0x03edc757, 0x0193a3f2, 0x00919ac4, 0x01653b82, 0x01f16378, 0x034e9faf, 0x00096c3a, 0x02eddf30, 0x001c8b40}}}, + {X: Field{[10]uint32{0x02353210, 0x008e6596, 0x017b2858, 0x012889b7, 0x02cf6fd8, 0x024c89c4, 0x0310871a, 0x01d61f2a, 0x02570b0a, 0x0034e1ce}}, Y: Field{[10]uint32{0x0160f186, 0x01789fd4, 0x011d660e, 0x003327f0, 0x01f1f45d, 0x01578cd4, 0x03f95b1c, 0x039c1b37, 0x018459c7, 0x000edf92}}}, + {X: Field{[10]uint32{0x022c20ad, 0x02cb6e85, 0x03281cc9, 0x030c9b72, 0x0226a049, 0x011f029e, 0x01289a71, 0x02caddc7, 0x008ceeeb, 0x00220a1e}}, Y: Field{[10]uint32{0x007b71a7, 0x0197d230, 0x0364cc8c, 0x00b77928, 0x025da2fa, 0x0125c709, 0x0398922b, 0x017c88f5, 0x01958742, 0x00390a28}}}, + {X: Field{[10]uint32{0x027e537d, 0x002cfd3a, 0x0280a37f, 0x02d3a9d5, 0x0052f8db, 0x024fe85d, 0x0186c189, 0x030035d2, 0x013126d0, 0x001e7fb9}}, Y: Field{[10]uint32{0x002cb5b6, 0x0005ea20, 0x035a4560, 0x02fa4f56, 0x01525ceb, 0x00eaceaf, 0x017b4a14, 0x03e652d3, 0x00713143, 0x003f7940}}}, + {X: Field{[10]uint32{0x02814e91, 0x03962a19, 0x01cbaac1, 0x0272fda6, 0x03367242, 0x000ead42, 0x00f3a8ce, 0x017de57c, 0x01f05a9f, 0x003d13ce}}, Y: Field{[10]uint32{0x019a1dd4, 0x02768c35, 0x030e3fc0, 0x01191ab1, 0x02ff75a2, 0x02aca2ee, 0x00a27afb, 0x004c0254, 0x01d1e4de, 0x002e5791}}}, + {X: Field{[10]uint32{0x00aa9abb, 0x009bb0a0, 0x02148504, 0x02fcf0be, 0x02da45af, 0x00cb3def, 0x01d7d788, 0x0326dee2, 0x0209baf9, 0x00044e38}}, Y: Field{[10]uint32{0x006a0d6e, 0x01f9267c, 0x02f88372, 0x005c259c, 0x03ac7d59, 0x0399fcba, 0x02285207, 0x02cabc3a, 0x016a3965, 0x000570a3}}}, + {X: Field{[10]uint32{0x00912c1e, 0x02e0fe4d, 0x02620472, 0x03c56bf0, 0x00dcd3d3, 0x02940c4c, 0x024685aa, 0x035e3183, 0x01421b98, 0x000a74fa}}, Y: Field{[10]uint32{0x02bf5825, 0x011729f4, 0x02ce1a6d, 0x019f222e, 0x01411c8c, 0x02df14ee, 0x01d46b6d, 0x0025a485, 0x00f84968, 0x00242945}}}, + {X: Field{[10]uint32{0x00ff3eb8, 0x025a7021, 0x020c7e90, 0x022294fe, 0x01d6efeb, 0x034b51c2, 0x00c18d7c, 0x00cf813c, 0x02945fdd, 0x002a28da}}, Y: Field{[10]uint32{0x016ab564, 0x025abd7d, 0x002a9bb5, 0x03351e7c, 0x0223db1f, 0x033b872b, 0x02aedbe1, 0x0335c009, 0x0105edbf, 0x000775fe}}}, + {X: Field{[10]uint32{0x02981eff, 0x0030849a, 0x03fd5367, 0x032a0498, 0x003c35f2, 0x00f9e81b, 0x02ab4f0c, 0x02513e43, 0x02ceb3fa, 0x00168123}}, Y: Field{[10]uint32{0x03c886ff, 0x035b52ed, 0x019b24b3, 0x0015a486, 0x008e330d, 0x03a201df, 0x03caf7b5, 0x03b59754, 0x03aeb70f, 0x000493c6}}}, + {X: Field{[10]uint32{0x0132b8ba, 0x0204a23a, 0x031583dc, 0x03b35ca5, 0x00fd1eb4, 0x01917eb1, 0x01ee579c, 0x02f0bd99, 0x02820c5e, 0x000c81c0}}, Y: Field{[10]uint32{0x01bdaa17, 0x036b7ca1, 0x03d55b86, 0x026a00f2, 0x03c17eda, 0x022109c1, 0x03b11ee0, 0x0101fb6b, 0x022d0d68, 0x0023da59}}}, + {X: Field{[10]uint32{0x03afe787, 0x01e91f95, 0x01786db7, 0x024c9e86, 0x02c78105, 0x0202927f, 0x0188a7b0, 0x034fc6ee, 0x025bfb04, 0x001f08a1}}, Y: Field{[10]uint32{0x0036bd3b, 0x03c1b874, 0x00d53097, 0x01c9839c, 0x03d0830b, 0x00e7c672, 0x01997344, 0x02675f55, 0x026e30f5, 0x00280bac}}}, + {X: Field{[10]uint32{0x039385cc, 0x0384f2c2, 0x033a422d, 0x01682abc, 0x01fd842e, 0x00f730d9, 0x02c8269a, 0x02094b01, 0x001330ad, 0x00282e93}}, Y: Field{[10]uint32{0x02239bc8, 0x00a4397f, 0x00960c13, 0x00511d5a, 0x00940fdb, 0x01dee7a1, 0x036d2ce2, 0x02efdfce, 0x03135cfd, 0x00163b2a}}}, + {X: Field{[10]uint32{0x00f76309, 0x007b08d1, 0x038194e3, 0x0121c399, 0x03007be4, 0x00b8b033, 0x03e47a41, 0x02e97723, 0x0042c8a2, 0x0010ab98}}, Y: Field{[10]uint32{0x02a1542e, 0x03c826f7, 0x02c3ce19, 0x008f2f25, 0x0336ea3a, 0x00f19119, 0x010a6e75, 0x022fc888, 0x01ac7ba3, 0x001cab5a}}}, + {X: Field{[10]uint32{0x007b2a19, 0x000b56c2, 0x01e7c6e8, 0x00323f04, 0x01d8f35f, 0x01c081ce, 0x025d82f4, 0x01e8b8fa, 0x00b64550, 0x0023ceba}}, Y: Field{[10]uint32{0x025b4cfe, 0x034ae03b, 0x036a50d1, 0x009f4fe6, 0x03604259, 0x02e6c51c, 0x003420ef, 0x03b5506e, 0x02353028, 0x00186ee3}}}, + {X: Field{[10]uint32{0x005df32f, 0x006d0dec, 0x004c00d9, 0x00498ab9, 0x00a7ba1e, 0x00254f9b, 0x024fb4f3, 0x00648283, 0x024b1e15, 0x000ea12e}}, Y: Field{[10]uint32{0x013e20c0, 0x02eb679f, 0x02ce7d3c, 0x03af3771, 0x0332c44e, 0x02438743, 0x023abe9c, 0x017c51ec, 0x01794352, 0x002c83d9}}}, + {X: Field{[10]uint32{0x03316210, 0x017f6239, 0x005b62d2, 0x0204af05, 0x017b87d1, 0x03918b9f, 0x00c102bd, 0x02940cfb, 0x026c0b04, 0x0019207f}}, Y: Field{[10]uint32{0x0364560d, 0x039709e3, 0x01075b26, 0x003abbcc, 0x03d4e88b, 0x00232461, 0x036538b8, 0x00ab4245, 0x00abf5f3, 0x002f306d}}}, + {X: Field{[10]uint32{0x0151a094, 0x004c1935, 0x02f4d1ff, 0x032b2b02, 0x038e4bd1, 0x03dceccf, 0x01cd3651, 0x0160febe, 0x0174722c, 0x00014d00}}, Y: Field{[10]uint32{0x01a66a8e, 0x02f88840, 0x00a41a3b, 0x016ebafe, 0x01d9e465, 0x021742a5, 0x0035180f, 0x0185b439, 0x0135448a, 0x00392408}}}, + {X: Field{[10]uint32{0x022867cc, 0x003e1493, 0x0349bb35, 0x029e4372, 0x016c9ee2, 0x015ef0cb, 0x024e08bd, 0x017135b0, 0x02aea582, 0x00301a4f}}, Y: Field{[10]uint32{0x03b9a05e, 0x0217618c, 0x00a0462c, 0x022bbf83, 0x01f4f617, 0x032e3ed5, 0x006c601b, 0x01047817, 0x034b7627, 0x0036883e}}}, + {X: Field{[10]uint32{0x00fa0d9d, 0x02dba4cf, 0x0335ca91, 0x006a0d59, 0x01e63e58, 0x02862608, 0x03f9200c, 0x00140b45, 0x037372fd, 0x00314743}}, Y: Field{[10]uint32{0x02352655, 0x02b5308b, 0x03413b3b, 0x01f4f1be, 0x03a2797a, 0x013ae5e6, 0x03ff1345, 0x01fb74b3, 0x02b207ed, 0x00234439}}}, + {X: Field{[10]uint32{0x02c3290c, 0x005837ef, 0x0059dbe3, 0x023b674b, 0x03366600, 0x022d4ab4, 0x02f79f85, 0x0266b8b6, 0x00564d2d, 0x0005a046}}, Y: Field{[10]uint32{0x012e7460, 0x03ddee8a, 0x0202d1ad, 0x0128f021, 0x033e9cc8, 0x0148b342, 0x01dbac34, 0x01e123a0, 0x01a14561, 0x000afafc}}}, + {X: Field{[10]uint32{0x000afeb5, 0x0125d21f, 0x01a0920a, 0x02695e0d, 0x030b1599, 0x01952a9b, 0x00e16225, 0x021496cb, 0x0133e143, 0x001eba52}}, Y: Field{[10]uint32{0x019b95f5, 0x00bd3d6f, 0x0390195a, 0x02dbd10f, 0x01a13b87, 0x038ccc6f, 0x00282a51, 0x0191684e, 0x0237830a, 0x0024644b}}}, + {X: Field{[10]uint32{0x0019d4ac, 0x0166684c, 0x0036b179, 0x02c156cb, 0x02c27709, 0x00b46fc2, 0x014c5f6c, 0x01daac90, 0x0197d02b, 0x0039de4b}}, Y: Field{[10]uint32{0x013f2b52, 0x02e6383b, 0x02e8d16f, 0x00528a05, 0x01dd2746, 0x01755b30, 0x00c75a0d, 0x02c5e6e6, 0x02895fce, 0x0027d365}}}, + {X: Field{[10]uint32{0x0247bde1, 0x0278d34c, 0x004f769d, 0x001bba9b, 0x003d97d7, 0x02b1e514, 0x00ff64f4, 0x0358fc93, 0x01d4946f, 0x0000bfee}}, Y: Field{[10]uint32{0x0381014f, 0x0095edfa, 0x03a9ff32, 0x00c955db, 0x02cff188, 0x038d823a, 0x016907a6, 0x0054c4af, 0x00743488, 0x00019ac7}}}, + {X: Field{[10]uint32{0x00bb2fbe, 0x01722c7b, 0x00ea3c16, 0x02e84b80, 0x01aeb6f4, 0x012b9cd4, 0x012aafab, 0x03bac450, 0x0232f90c, 0x0011512e}}, Y: Field{[10]uint32{0x038f6736, 0x0221f2e7, 0x017b3948, 0x022e0d1e, 0x002bba53, 0x000b6eff, 0x039ede9b, 0x033ba2fe, 0x03b4c2a5, 0x0018bef5}}}, + {X: Field{[10]uint32{0x0118980f, 0x0278f99e, 0x0137a1b0, 0x039e2093, 0x025d981c, 0x02319ed7, 0x02b156dd, 0x03fe89d7, 0x01b925d9, 0x000942c0}}, Y: Field{[10]uint32{0x0209c481, 0x03ae074f, 0x000ff261, 0x0185010b, 0x03eb1851, 0x01d98967, 0x032bcbe6, 0x036a1b94, 0x024a32f0, 0x002e8764}}}, + {X: Field{[10]uint32{0x02beb4d2, 0x0387fb82, 0x030f5ecb, 0x004e4078, 0x0262e0b8, 0x00ba58bb, 0x00468073, 0x017f71cc, 0x02541f2a, 0x00273cc3}}, Y: Field{[10]uint32{0x01510723, 0x035528ed, 0x00741c6b, 0x03ad959f, 0x02848259, 0x02aa3fd8, 0x0201d14b, 0x02ddec65, 0x02cd1281, 0x001f2c91}}}, + {X: Field{[10]uint32{0x02285a2c, 0x005ec695, 0x01c03cd2, 0x03293c47, 0x01b5a90e, 0x0254213b, 0x013be124, 0x0287823e, 0x00b13c61, 0x003b727a}}, Y: Field{[10]uint32{0x021e1f3d, 0x03e67f98, 0x01fda5e9, 0x02168bf7, 0x01b0e8df, 0x02320198, 0x0143b1b5, 0x03eb1d3f, 0x012107e8, 0x0019b0bf}}}, + {X: Field{[10]uint32{0x01e2c66e, 0x020b1c3c, 0x036b6970, 0x000acf76, 0x02cae9d0, 0x009ee06e, 0x02a41649, 0x029260aa, 0x015f8388, 0x0037650a}}, Y: Field{[10]uint32{0x00d6706b, 0x03af0602, 0x00f4bfd3, 0x02c920b6, 0x033b08c2, 0x007eb20f, 0x00d9e8cb, 0x0307aa6f, 0x020cd409, 0x0020e301}}}, + {X: Field{[10]uint32{0x0285ab7e, 0x01d14d41, 0x0087692f, 0x037742b1, 0x0296e96d, 0x02ff1cd3, 0x000d3b35, 0x02f92397, 0x0204dfc0, 0x001f81a3}}, Y: Field{[10]uint32{0x02c70d0a, 0x02100793, 0x036462c8, 0x0021e620, 0x0369351e, 0x024fc52f, 0x00052e60, 0x00972341, 0x014690d2, 0x0037cb34}}}, + {X: Field{[10]uint32{0x009a5052, 0x010fce65, 0x0217a21f, 0x01cdf7b0, 0x00b7c2a0, 0x01b10e68, 0x02e659f7, 0x02b26c11, 0x03cfd10a, 0x001cea6f}}, Y: Field{[10]uint32{0x03be10dd, 0x01092a6c, 0x00ec24a1, 0x03da46a7, 0x03bf379d, 0x023e1b2f, 0x002062c0, 0x02c1481a, 0x01293ea7, 0x001cee45}}}, + {X: Field{[10]uint32{0x0008c55b, 0x0211fb35, 0x0205adaa, 0x012fda6f, 0x0055cc22, 0x0216026f, 0x0234678d, 0x031d539b, 0x03840c8c, 0x003bf77f}}, Y: Field{[10]uint32{0x02f188d5, 0x01b75b70, 0x013fc173, 0x0228ed9c, 0x008aac21, 0x03116d2b, 0x026ed7e0, 0x02aacbbf, 0x03418264, 0x00197763}}}, + {X: Field{[10]uint32{0x03d73f4b, 0x015a23af, 0x03585756, 0x016c5c69, 0x01dc264f, 0x010e1b76, 0x023d6dfa, 0x00e13634, 0x01857118, 0x0011aa51}}, Y: Field{[10]uint32{0x01aaf35c, 0x03004699, 0x02a6d256, 0x03a3a37c, 0x031e684e, 0x0239fd85, 0x03f16cb3, 0x03063d36, 0x037ea298, 0x000f796b}}}, + {X: Field{[10]uint32{0x0021cd3f, 0x03a91fce, 0x0193b910, 0x02326b5b, 0x0045dd0c, 0x038582a5, 0x02fa17bb, 0x03099752, 0x01b27ce3, 0x001a243b}}, Y: Field{[10]uint32{0x03cbd1ab, 0x008103dd, 0x03852dd2, 0x03abad9e, 0x037c24be, 0x02a200aa, 0x00810a7c, 0x01525336, 0x005b10ef, 0x00183d1f}}}, + {X: Field{[10]uint32{0x0205f5ae, 0x02d12d0a, 0x0288d952, 0x03087d55, 0x01e33e68, 0x01e89470, 0x02c4b328, 0x0221aa07, 0x02b6340b, 0x00023327}}, Y: Field{[10]uint32{0x007fb6eb, 0x022fc08c, 0x01c95507, 0x01c05432, 0x01f03238, 0x02f11d6e, 0x011981a3, 0x020a4224, 0x030d90e3, 0x0026c5da}}}, + {X: Field{[10]uint32{0x015b0475, 0x007f8a92, 0x00e0b0fd, 0x03809b25, 0x01227875, 0x025b3785, 0x0001ccae, 0x03782d60, 0x035ada48, 0x000ac18b}}, Y: Field{[10]uint32{0x031eab0d, 0x00d4e40b, 0x0280548b, 0x02523bfd, 0x02da9de9, 0x02fc5c9d, 0x0097bad4, 0x01c31420, 0x00683d51, 0x0014dfc7}}}, + {X: Field{[10]uint32{0x037240f9, 0x01ea2fae, 0x0008252d, 0x037c9fcc, 0x01cd358b, 0x0093a48c, 0x032ff7f2, 0x0354fd0c, 0x011a84b3, 0x0037556e}}, Y: Field{[10]uint32{0x012a5c94, 0x02064206, 0x0158bff6, 0x01ce8eb0, 0x01774d21, 0x037bbe5a, 0x03376094, 0x0194c3b5, 0x0208a40b, 0x00039bc6}}}, + {X: Field{[10]uint32{0x02c59c70, 0x032592bc, 0x01e7516f, 0x02035c54, 0x008986fd, 0x01e0bb8b, 0x000cdb1c, 0x02a5e51b, 0x03e040b1, 0x002b1449}}, Y: Field{[10]uint32{0x03ae5db9, 0x017a806d, 0x038e2476, 0x025e202b, 0x038afbb0, 0x01d9164f, 0x020a82e1, 0x0014e776, 0x0249323d, 0x00212788}}}, + {X: Field{[10]uint32{0x01311123, 0x0084b06d, 0x034bff72, 0x008c54c5, 0x039d1364, 0x038776b9, 0x004e9ce1, 0x033a68de, 0x02daf0b6, 0x0037cbcb}}, Y: Field{[10]uint32{0x006d46a5, 0x031d7dba, 0x027bedba, 0x01105880, 0x02fde6ab, 0x01991009, 0x02da64f4, 0x02f080c5, 0x038ebd78, 0x002e7663}}}, + {X: Field{[10]uint32{0x0373e5f9, 0x03e4f5e8, 0x0002773f, 0x03d0fec2, 0x0097bdc5, 0x00844d84, 0x0385e216, 0x0305d88e, 0x0387d630, 0x003f60ec}}, Y: Field{[10]uint32{0x036cd2ee, 0x019c2daa, 0x00837d3c, 0x02f0e10e, 0x01115805, 0x0303f772, 0x03503d40, 0x00d69675, 0x027d375f, 0x0026a58a}}}, + {X: Field{[10]uint32{0x02cac4df, 0x03ae384c, 0x00c9505f, 0x0079081b, 0x00d565ca, 0x028ffaaa, 0x02ad443b, 0x0322b22f, 0x03c1155e, 0x00363ef7}}, Y: Field{[10]uint32{0x011f73ac, 0x02697a9d, 0x03abc9cb, 0x03587e58, 0x027fb1fc, 0x03afdd90, 0x01258edf, 0x0272d1ce, 0x000fccb9, 0x003e514f}}}, + {X: Field{[10]uint32{0x03bf86d6, 0x00443037, 0x010ddc89, 0x01cae08d, 0x0285f008, 0x01aabcf5, 0x03093891, 0x03a3006c, 0x009a20a3, 0x0027f25d}}, Y: Field{[10]uint32{0x023e19df, 0x0129e661, 0x02379109, 0x02eb9d69, 0x0075c85c, 0x0023c3c6, 0x033bca70, 0x02b1655d, 0x01a76c92, 0x0028bd9e}}}, + {X: Field{[10]uint32{0x03476a3f, 0x032057cb, 0x00f62b58, 0x024b4dca, 0x0365b810, 0x038865ae, 0x02bcf252, 0x0073a6f6, 0x034671a9, 0x000a7838}}, Y: Field{[10]uint32{0x00d0c0e6, 0x02f5a635, 0x039d4174, 0x002aad0b, 0x011ce5ad, 0x0319ac98, 0x00a35fb9, 0x002b91e6, 0x0061b82e, 0x000bd103}}}, + {X: Field{[10]uint32{0x02e102d7, 0x01ad4642, 0x0278f873, 0x002ea1bb, 0x007fbee7, 0x0330f7ee, 0x03e6f929, 0x015683c9, 0x02153989, 0x003901a2}}, Y: Field{[10]uint32{0x03165086, 0x0279a623, 0x014e77d6, 0x010c1d1f, 0x0016b911, 0x012a68d4, 0x01999438, 0x0272dabb, 0x02ad550f, 0x0028fcbc}}}, + {X: Field{[10]uint32{0x026c9f2c, 0x01080a1c, 0x0109248a, 0x01934f55, 0x0010f163, 0x0132065e, 0x03156c8a, 0x0366262e, 0x0210bb1b, 0x00146d17}}, Y: Field{[10]uint32{0x03e141a2, 0x023256f8, 0x03f6bb47, 0x01452315, 0x008a1f1d, 0x00004330, 0x01ac4797, 0x03798ca0, 0x01d04225, 0x0038c1c6}}}, + {X: Field{[10]uint32{0x02a0b83e, 0x032fe96a, 0x005acf6f, 0x00bf5683, 0x0164dc49, 0x01b18ecf, 0x02ec2e60, 0x02dad7a4, 0x01297b8a, 0x00053357}}, Y: Field{[10]uint32{0x03666805, 0x00af5df8, 0x033279b7, 0x01c0a91a, 0x015be192, 0x02c71f63, 0x01ad1faf, 0x032198d2, 0x03d77cdc, 0x0016fcc1}}}, + {X: Field{[10]uint32{0x022c4da6, 0x03376d74, 0x0168f8c3, 0x037d067b, 0x0045e9f2, 0x027060a2, 0x02254cae, 0x03451b0c, 0x031149d6, 0x00296a29}}, Y: Field{[10]uint32{0x00bf6c2e, 0x002eeb4f, 0x012d549c, 0x0205e0cf, 0x00b003f4, 0x0158e6fc, 0x00ae6933, 0x034d16bd, 0x00877bc3, 0x0027d1f6}}}, + {X: Field{[10]uint32{0x039372cb, 0x01303107, 0x038f999a, 0x0394b31d, 0x01bda494, 0x00519893, 0x01b13ddd, 0x0108cb5d, 0x00d24baa, 0x000d64ca}}, Y: Field{[10]uint32{0x001af6d8, 0x0206b3c9, 0x03050a78, 0x01f5923d, 0x03b6695d, 0x0323da02, 0x0084afe0, 0x00e67a64, 0x02b571df, 0x0034c555}}}, + {X: Field{[10]uint32{0x0273e7fd, 0x03e56f79, 0x005e891a, 0x0304349b, 0x00c8fdac, 0x02407b6c, 0x0268a12d, 0x0168b05c, 0x01ca4f2a, 0x00327ae0}}, Y: Field{[10]uint32{0x008adb66, 0x034a5092, 0x008df76e, 0x0394d558, 0x035acb73, 0x026fef5a, 0x01ae19cd, 0x03fa69c4, 0x012fc974, 0x001b5294}}}, + {X: Field{[10]uint32{0x02ca8e2c, 0x037979b0, 0x01f386cc, 0x00c093d0, 0x0248e557, 0x02d840b8, 0x00c9f90e, 0x02cc22b1, 0x01f816f3, 0x0038998c}}, Y: Field{[10]uint32{0x039306bd, 0x011857fa, 0x0224858a, 0x00502f56, 0x0396cfb8, 0x00146094, 0x01e2f102, 0x03b34059, 0x02a8823a, 0x0005b82c}}}, + {X: Field{[10]uint32{0x019110ba, 0x020d57fe, 0x029658db, 0x03e68ec2, 0x02677e5a, 0x01a711cc, 0x0007b242, 0x039f941e, 0x02f365c0, 0x003ddba6}}, Y: Field{[10]uint32{0x012a9407, 0x032c04ef, 0x021028a0, 0x018a5ab6, 0x019d174c, 0x0217e759, 0x02f25423, 0x00593af6, 0x0039d26f, 0x002032fd}}}, + {X: Field{[10]uint32{0x012c5dd9, 0x03d89c21, 0x03421e65, 0x01521079, 0x00bc333d, 0x02a23f38, 0x01d6ab69, 0x00520ca5, 0x005baf89, 0x00373205}}, Y: Field{[10]uint32{0x031e2a19, 0x031866bc, 0x01480cca, 0x03360362, 0x00296155, 0x000d8eec, 0x00d6cd16, 0x039ea6d0, 0x0370a620, 0x0033b6cd}}}, + {X: Field{[10]uint32{0x0203e4fd, 0x00feb4f1, 0x03847ed3, 0x010107b6, 0x007660bc, 0x02ba4c06, 0x02a199ec, 0x01343e95, 0x013a6a1c, 0x001d9178}}, Y: Field{[10]uint32{0x0291e713, 0x01308b2f, 0x002ee186, 0x014ec8b1, 0x02bcfc53, 0x036a2434, 0x01eccbb5, 0x03975449, 0x011b7990, 0x001f23a9}}}, + {X: Field{[10]uint32{0x022f3f25, 0x00acc627, 0x00fb4422, 0x01751788, 0x01465822, 0x00706daf, 0x027210d5, 0x02f3bebf, 0x006ed74c, 0x002e89a2}}, Y: Field{[10]uint32{0x02b3409d, 0x01436e28, 0x02893bdf, 0x009dcd67, 0x01e0b896, 0x02ee8c9b, 0x025fa64a, 0x02b7ba79, 0x01b223dd, 0x003f6217}}}, + {X: Field{[10]uint32{0x01050fe1, 0x03486946, 0x02c92299, 0x023579e4, 0x000fc657, 0x029497a0, 0x01bda654, 0x016c7640, 0x00e13100, 0x001a2d40}}, Y: Field{[10]uint32{0x0312f96b, 0x001757da, 0x0202207e, 0x009e0f80, 0x008df9b1, 0x01f6951a, 0x01ac8e87, 0x012a53cf, 0x017ab354, 0x001c7bdf}}}, + {X: Field{[10]uint32{0x027996ff, 0x03a9d6b6, 0x01064b84, 0x03265029, 0x035b19f7, 0x00b1be81, 0x03f851f1, 0x02a0f09f, 0x03e2613f, 0x000b3329}}, Y: Field{[10]uint32{0x03d7707f, 0x02b83cc9, 0x005703c6, 0x023c2fb5, 0x03cf37af, 0x03164e42, 0x01b2d2f0, 0x006b4343, 0x022222dd, 0x0016adc2}}}, + {X: Field{[10]uint32{0x03179f14, 0x03d369bd, 0x033c1827, 0x03013573, 0x00383ad9, 0x032db729, 0x01af7183, 0x0291686d, 0x012d6a56, 0x001b5e5f}}, Y: Field{[10]uint32{0x000edf3f, 0x0189547a, 0x02ea67b1, 0x0078568e, 0x03b80e54, 0x035bd6a2, 0x0284bee7, 0x03463667, 0x00e5d203, 0x0002ab8d}}}, + {X: Field{[10]uint32{0x018ee327, 0x001665ba, 0x027b5116, 0x0160157d, 0x009a565a, 0x025a94f9, 0x013751ad, 0x01dac655, 0x03c437be, 0x002a9a65}}, Y: Field{[10]uint32{0x00684835, 0x0030cf03, 0x034cb3cc, 0x01de87d3, 0x036532e2, 0x038bd7c6, 0x018a15b2, 0x0103825a, 0x00219cdb, 0x00180d29}}}, + {X: Field{[10]uint32{0x022a0f48, 0x00316fae, 0x02dead01, 0x02137006, 0x0201e624, 0x02c3e25f, 0x005d53a7, 0x0075c28d, 0x03bffb8e, 0x0015b103}}, Y: Field{[10]uint32{0x02f0bd01, 0x032daa91, 0x01f4c458, 0x01e1f8a6, 0x01676a4a, 0x01cf632a, 0x03a0e091, 0x024a409e, 0x0389078b, 0x003a7419}}}, + {X: Field{[10]uint32{0x03918d89, 0x0240f545, 0x010731d2, 0x00dca94d, 0x01b6e1e2, 0x02d4b0f7, 0x0262be08, 0x03b5ef70, 0x02a83963, 0x0036dbfd}}, Y: Field{[10]uint32{0x01951769, 0x02dc461f, 0x03bdc162, 0x019435d5, 0x030e248d, 0x00513283, 0x02f6b18c, 0x03f512d0, 0x02fa0f30, 0x00290044}}}, + {X: Field{[10]uint32{0x03402c6d, 0x03286018, 0x01de4151, 0x01cdd539, 0x03dcdd11, 0x02950c04, 0x00e730d4, 0x018f88ce, 0x0301a46f, 0x00237d55}}, Y: Field{[10]uint32{0x03a1c3df, 0x0344b755, 0x02a93b9d, 0x0196f227, 0x02b3e696, 0x0122efd8, 0x016ddafb, 0x00ffc04e, 0x009a64b6, 0x001933e7}}}, + {X: Field{[10]uint32{0x030588a1, 0x03d22806, 0x00af37be, 0x033b7896, 0x0166485c, 0x01775791, 0x03ae460e, 0x023d5d01, 0x002c5101, 0x0027442f}}, Y: Field{[10]uint32{0x00922c04, 0x0324e261, 0x02ac2fcb, 0x00baba83, 0x01726b30, 0x000f7fae, 0x01ebe44e, 0x0385c5fb, 0x0008b2a4, 0x000e3a8f}}}, + {X: Field{[10]uint32{0x03640367, 0x02e601cd, 0x03e662e4, 0x01ec3f39, 0x02056025, 0x0080581b, 0x027a7068, 0x029e1cb2, 0x0075cc07, 0x0004eef2}}, Y: Field{[10]uint32{0x00c2c708, 0x011d2c70, 0x007697fe, 0x02bf5bd5, 0x02d2ea3d, 0x02abc6c7, 0x00a19acb, 0x00a99b63, 0x031a47c8, 0x002d3365}}}, + {X: Field{[10]uint32{0x02a9c3e1, 0x03273257, 0x02b1e24e, 0x028c4f24, 0x011857d9, 0x00369b72, 0x0147630d, 0x02c5d372, 0x0037f617, 0x0023c9b7}}, Y: Field{[10]uint32{0x033f15ef, 0x03ddb839, 0x0375bd5c, 0x03f0554c, 0x00f887f2, 0x01646b11, 0x00238776, 0x02fc9d39, 0x03031d96, 0x000e1228}}}, + {X: Field{[10]uint32{0x007b5f21, 0x0295e693, 0x01041ad3, 0x026c4419, 0x03a23e0d, 0x01836f84, 0x015236f6, 0x0245bd79, 0x003df290, 0x000b8795}}, Y: Field{[10]uint32{0x01473846, 0x002b4bed, 0x02d28ff1, 0x020ca3f8, 0x03947bc0, 0x00610d2d, 0x00cd9f32, 0x00176b04, 0x0127626e, 0x00221691}}}, + {X: Field{[10]uint32{0x023f3109, 0x02020b3b, 0x0385a123, 0x0143a31e, 0x018bed8f, 0x00fada6d, 0x0076936e, 0x027aa2ee, 0x00a3e050, 0x00320f0b}}, Y: Field{[10]uint32{0x029cd5ed, 0x01f0cc4c, 0x00c0e3b0, 0x01d54c07, 0x0074b75e, 0x00276955, 0x030da10d, 0x02378ac2, 0x02a9bc80, 0x000ae580}}}, + {X: Field{[10]uint32{0x03d29607, 0x0347eaf4, 0x02700578, 0x00724181, 0x01afee8b, 0x038e14c4, 0x024111ae, 0x005394c9, 0x03b4e2c1, 0x00231e40}}, Y: Field{[10]uint32{0x01025731, 0x011cddbc, 0x01b2528d, 0x000620a6, 0x00b488c4, 0x00a8d0fa, 0x02ebea9a, 0x03e53407, 0x02d1964d, 0x003740b6}}}, + {X: Field{[10]uint32{0x02569cc0, 0x029a0769, 0x009bda38, 0x02199532, 0x01b51857, 0x00707ae1, 0x00adfc6c, 0x01d732cc, 0x0054dd75, 0x0012098f}}, Y: Field{[10]uint32{0x0213167f, 0x037ee204, 0x03955dda, 0x017d572d, 0x02e223ac, 0x00964dba, 0x0198e49a, 0x02d4a03b, 0x03bddacd, 0x0039bc41}}}, + {X: Field{[10]uint32{0x02f0d2d3, 0x02c95185, 0x0227495f, 0x009f153b, 0x00accb71, 0x00f35766, 0x018644c6, 0x007d61e4, 0x010aea7d, 0x001a9f01}}, Y: Field{[10]uint32{0x0021e232, 0x01c95bb6, 0x0154628d, 0x020ed2ec, 0x02f80f73, 0x00226c32, 0x03f733dc, 0x0191b8d2, 0x026127a2, 0x003eb464}}}, + {X: Field{[10]uint32{0x035c3ea8, 0x0168661f, 0x01a3bf10, 0x02683331, 0x030ece87, 0x00c72c27, 0x01147dcc, 0x03080b7e, 0x013f62fb, 0x00387c29}}, Y: Field{[10]uint32{0x01706277, 0x02483c79, 0x01d8dcfe, 0x024bf8b9, 0x003968f6, 0x0100dde0, 0x03148489, 0x03a8c030, 0x010f0b0e, 0x000e4c28}}}, + {X: Field{[10]uint32{0x03182b7b, 0x00999d74, 0x0213b485, 0x0029b539, 0x02da9b6a, 0x02293219, 0x026efcae, 0x03296ff5, 0x0113cb0f, 0x002f03ec}}, Y: Field{[10]uint32{0x03090f31, 0x02871b2f, 0x0060131c, 0x01581d17, 0x0037892c, 0x00fb2c52, 0x0315f691, 0x03baef49, 0x025e6993, 0x0038479c}}}, + {X: Field{[10]uint32{0x0342f908, 0x02c0ca72, 0x034fe266, 0x0285d284, 0x030ee7e6, 0x027ab9ed, 0x03f9ebf8, 0x023d2192, 0x00f49c43, 0x0007f968}}, Y: Field{[10]uint32{0x0275f66c, 0x03584271, 0x0379b35a, 0x012b3a6d, 0x02069451, 0x03e9ed65, 0x033878bc, 0x0190724a, 0x01cef912, 0x0036e025}}}, + {X: Field{[10]uint32{0x02524cd4, 0x010c82aa, 0x00f6de43, 0x020cfcf2, 0x00ade6ea, 0x02afe94f, 0x02e61aae, 0x01c00be9, 0x01b49016, 0x001778ff}}, Y: Field{[10]uint32{0x007e08f0, 0x01615e45, 0x00535dc1, 0x028f57a6, 0x016d7e9c, 0x02346b0a, 0x004a1dd8, 0x035b3acd, 0x0288862a, 0x002d72f7}}}, + {X: Field{[10]uint32{0x023da54f, 0x02ff2f00, 0x020738ad, 0x00b78865, 0x02b2964f, 0x02529916, 0x02b0be62, 0x037f3d7b, 0x0193a913, 0x0024ec1a}}, Y: Field{[10]uint32{0x012ae0b8, 0x01285352, 0x0107c4d1, 0x03607a2d, 0x029c151a, 0x0328f1f8, 0x007330ef, 0x02dd1106, 0x002f856c, 0x001e0d9e}}}, + {X: Field{[10]uint32{0x02762f0c, 0x02de1823, 0x01851886, 0x026f8e05, 0x009c3336, 0x01ac1578, 0x005a044f, 0x001d079a, 0x000d27d9, 0x0001c15d}}, Y: Field{[10]uint32{0x033d956e, 0x01772645, 0x03c55d3f, 0x00c87eec, 0x00b2142b, 0x00a7c4ab, 0x013193b5, 0x011b1a7a, 0x03bb738d, 0x00312963}}}, + {X: Field{[10]uint32{0x0193e296, 0x00687847, 0x0086434a, 0x019d8410, 0x02e5b787, 0x0254c3c2, 0x00a20e19, 0x015499cd, 0x0000fc48, 0x001d8668}}, Y: Field{[10]uint32{0x006ebed6, 0x02fa1b41, 0x032014f8, 0x01d5dc80, 0x01ab26f6, 0x028b3ad6, 0x03a0afe0, 0x011e73db, 0x01e1182f, 0x001fcc03}}}, + {X: Field{[10]uint32{0x019ff2fe, 0x0150a296, 0x0060dbec, 0x02d8e139, 0x01cc0d54, 0x00a0504f, 0x01346fcd, 0x014805b3, 0x01a8ddbb, 0x003f883d}}, Y: Field{[10]uint32{0x002d879c, 0x02a4ae49, 0x02e0bae7, 0x01ead3b2, 0x01338cf4, 0x02655ec3, 0x02be551f, 0x0121c6bf, 0x02e6e260, 0x0016d222}}}, + {X: Field{[10]uint32{0x02ad11e2, 0x03878fd0, 0x00b84422, 0x00862ae2, 0x01707681, 0x00f1d47e, 0x0129e077, 0x014b3cb7, 0x0327ba7e, 0x002656e5}}, Y: Field{[10]uint32{0x037fd26e, 0x03d71b4b, 0x0391f42a, 0x0217e416, 0x0049c8d5, 0x00a6f62e, 0x02c5e5f5, 0x0051a313, 0x01c97ee4, 0x0030f277}}}, + {X: Field{[10]uint32{0x002b3136, 0x01f0909c, 0x02a16e26, 0x02836130, 0x01636d26, 0x01458648, 0x02913445, 0x0135f1e7, 0x024d2ca9, 0x0032d3cb}}, Y: Field{[10]uint32{0x003ddb9b, 0x021e77a0, 0x02e49bbb, 0x01c5e9a3, 0x031b9b2f, 0x03df8ae2, 0x000df480, 0x01039b3c, 0x02ee3949, 0x000857ad}}}, + {X: Field{[10]uint32{0x01fce397, 0x00b095ae, 0x00e6fc72, 0x02757869, 0x034572b6, 0x019a3ad9, 0x00b10707, 0x024512eb, 0x025634b4, 0x0032828a}}, Y: Field{[10]uint32{0x03f4841b, 0x023ae0b4, 0x01ebfe95, 0x029c2f6d, 0x036e2562, 0x01ab69e9, 0x0098c855, 0x00beee94, 0x00c974ab, 0x002481e7}}}, + {X: Field{[10]uint32{0x03af7c7b, 0x01ae48b8, 0x00246acd, 0x02259ed3, 0x02bfadde, 0x013bc58e, 0x02f27a02, 0x0302bf5c, 0x032dc6c0, 0x003ee08c}}, Y: Field{[10]uint32{0x0134c7ee, 0x0315032a, 0x030c660d, 0x02646733, 0x032b90d3, 0x038b12c6, 0x00beaa52, 0x02da40ce, 0x0119f21c, 0x00069a5c}}}, + {X: Field{[10]uint32{0x00513dd2, 0x03b10a97, 0x006736af, 0x02818f6d, 0x02d07550, 0x008062f5, 0x02184a4e, 0x0237bc83, 0x0205d925, 0x003415bb}}, Y: Field{[10]uint32{0x0015bffb, 0x0366632f, 0x0031c276, 0x03135a37, 0x0389ab0f, 0x0006b5c9, 0x027cfb62, 0x038d599f, 0x01d0d222, 0x0002bcb0}}}, + {X: Field{[10]uint32{0x02526f12, 0x028494d0, 0x007267ae, 0x004b360a, 0x01c63257, 0x02dde18d, 0x0046c594, 0x01098b10, 0x0222c658, 0x000feb6c}}, Y: Field{[10]uint32{0x0199ae96, 0x019adfb0, 0x02717586, 0x0387aae1, 0x03d181e0, 0x02875d2d, 0x00a7e8bf, 0x00474e13, 0x0007fa68, 0x00369723}}}, + {X: Field{[10]uint32{0x019c4b61, 0x01098ec7, 0x029248ab, 0x023bed9f, 0x03214b81, 0x0274f914, 0x01915dd3, 0x03943977, 0x0169e222, 0x00349eb2}}, Y: Field{[10]uint32{0x033a1c7f, 0x02529db2, 0x03f6f9b4, 0x016b6079, 0x0209a7c5, 0x02100c8d, 0x02709a32, 0x034c15b9, 0x0294baea, 0x0031215d}}}, + {X: Field{[10]uint32{0x02c565d4, 0x0103c05c, 0x02cbcd93, 0x00064686, 0x0399cd3a, 0x03ff5a7b, 0x03a4324b, 0x006b9a97, 0x01b48b98, 0x001048de}}, Y: Field{[10]uint32{0x00fa280e, 0x034fa1ff, 0x023abac9, 0x00ec9154, 0x03c75505, 0x02f9aad5, 0x02523e7e, 0x0393c0b2, 0x02c9c7db, 0x003c900d}}}, + {X: Field{[10]uint32{0x039336f1, 0x037ea8fd, 0x003eace9, 0x027ec849, 0x01bef790, 0x018f4029, 0x028cc3b6, 0x01304ee6, 0x02aa9937, 0x003608d3}}, Y: Field{[10]uint32{0x02755c27, 0x03e412db, 0x00e5cb1f, 0x03e47720, 0x001845d8, 0x00a4aeaf, 0x03c15930, 0x0197d9a8, 0x028ec4b4, 0x0002e32f}}}, + {X: Field{[10]uint32{0x01189009, 0x02ebca97, 0x03bbe47f, 0x00e8f61d, 0x00427d32, 0x03634f00, 0x000ea349, 0x03fe72eb, 0x033568c5, 0x00109be2}}, Y: Field{[10]uint32{0x0100586d, 0x010e672f, 0x03bfd7dc, 0x01fde214, 0x019931f5, 0x01f2e0ae, 0x03a1ba72, 0x00f1ee71, 0x013dce02, 0x0013808a}}}, + {X: Field{[10]uint32{0x0097dfa5, 0x009d8291, 0x036ccfe7, 0x01bb1e03, 0x01871757, 0x0272971e, 0x012a7fdc, 0x017cb090, 0x02f902ee, 0x003c71c1}}, Y: Field{[10]uint32{0x03b7e740, 0x0173eb0a, 0x004d59f8, 0x02575ae7, 0x009ef758, 0x006826e1, 0x01787005, 0x01570ece, 0x01a1727f, 0x00317868}}}, + {X: Field{[10]uint32{0x02c2c679, 0x03c61a4d, 0x00b67608, 0x00799d66, 0x03598200, 0x0094d5ad, 0x00d66825, 0x01661e5a, 0x007ecc1d, 0x002138b8}}, Y: Field{[10]uint32{0x0028555a, 0x01ce19b3, 0x03bb6281, 0x03dbd6d0, 0x012903f4, 0x01ff3ae9, 0x0275a8ab, 0x03b3732f, 0x03438ab5, 0x00106ac4}}}, + {X: Field{[10]uint32{0x02ad2b54, 0x0226d01d, 0x020689c6, 0x002fbc3d, 0x023d599b, 0x028633da, 0x02bb6993, 0x01608d12, 0x02c2fe53, 0x001e4d7b}}, Y: Field{[10]uint32{0x03371910, 0x033ef554, 0x01b406c4, 0x02b78f5d, 0x01b77480, 0x0393d721, 0x00ed574f, 0x022186db, 0x016aab97, 0x00338bf2}}}, + {X: Field{[10]uint32{0x00dbd9a0, 0x029a8c2c, 0x0383927a, 0x02250878, 0x013e8c26, 0x0368e802, 0x01abbef9, 0x01b55ade, 0x00a8319f, 0x003550a9}}, Y: Field{[10]uint32{0x038173e1, 0x01e6bb1e, 0x037a4f19, 0x00326161, 0x026badb7, 0x00654681, 0x019f3e9c, 0x0217aa3e, 0x016265d2, 0x00144128}}}, + {X: Field{[10]uint32{0x00ece2be, 0x009f6691, 0x0232fd3c, 0x02e49bec, 0x00041011, 0x000e049b, 0x02f0157a, 0x02624012, 0x02194228, 0x002f1a49}}, Y: Field{[10]uint32{0x0252f3bc, 0x00da71ff, 0x034f9847, 0x00bb6c97, 0x0311e202, 0x032e3bdd, 0x032e8543, 0x0298c24d, 0x00c147e2, 0x00238bc4}}}, + {X: Field{[10]uint32{0x018d8d03, 0x0086fd74, 0x03e51f45, 0x024257d0, 0x00ae079a, 0x0122ad94, 0x02cdd80b, 0x0230237a, 0x0336bb17, 0x003af86d}}, Y: Field{[10]uint32{0x01db7514, 0x0028bab3, 0x02bbb0cd, 0x0187f23b, 0x03782f20, 0x00aa049a, 0x0378ef4b, 0x01437917, 0x02590b14, 0x002b6071}}}, + {X: Field{[10]uint32{0x01e2774c, 0x014b7b2e, 0x03e7bde1, 0x012a4e0a, 0x02666d09, 0x03e3c158, 0x01f887ad, 0x0214f93f, 0x010849e1, 0x003989ae}}, Y: Field{[10]uint32{0x034834ea, 0x004ffe43, 0x027c30f5, 0x010b1658, 0x002dca73, 0x033ee1d6, 0x02ab4062, 0x00a89c32, 0x01daa419, 0x002433d5}}}, + {X: Field{[10]uint32{0x00381e67, 0x021ea739, 0x000b61a9, 0x0072f1eb, 0x000d8f57, 0x0291453c, 0x013b8b5b, 0x021e488c, 0x0057ba04, 0x003ee9e8}}, Y: Field{[10]uint32{0x029ec44a, 0x03b9ebb5, 0x000f718c, 0x0243b94c, 0x037cea5b, 0x016295fa, 0x005133f9, 0x014eeafc, 0x03fc1426, 0x001f4abd}}}, + {X: Field{[10]uint32{0x00c35a54, 0x02f9a265, 0x039ea1e3, 0x01691595, 0x03023973, 0x01c0cf99, 0x02e5bdb5, 0x01460568, 0x03955b5d, 0x00051336}}, Y: Field{[10]uint32{0x0253f1e6, 0x021e9dd8, 0x02a83919, 0x023e28ba, 0x03ed0a10, 0x0204d6d2, 0x0150d2b0, 0x03f16600, 0x0389e896, 0x0039805b}}}, + {X: Field{[10]uint32{0x003c0a24, 0x009787c6, 0x01eb681c, 0x023c099e, 0x03ad28cd, 0x02566767, 0x034a2d1a, 0x006d7b35, 0x026ee7ab, 0x00014e37}}, Y: Field{[10]uint32{0x00121004, 0x021012c5, 0x009601de, 0x01cc84f4, 0x012482b9, 0x016ce281, 0x01bac87d, 0x00464d6f, 0x03477961, 0x000db029}}}, + {X: Field{[10]uint32{0x03c03794, 0x001856ba, 0x02f2e9d1, 0x029c152f, 0x007876eb, 0x018edd5f, 0x00a38062, 0x01cfb883, 0x030fd28f, 0x001da453}}, Y: Field{[10]uint32{0x03a12642, 0x00c1a00c, 0x0008ec39, 0x014be7e2, 0x00593307, 0x0189b18b, 0x03557861, 0x0156fc88, 0x01cae168, 0x001b7893}}}, + {X: Field{[10]uint32{0x0234e4a7, 0x00caeaa7, 0x000af27e, 0x02eea960, 0x0186bee7, 0x03244bca, 0x015f7f96, 0x03df6bd6, 0x026cf675, 0x001a6457}}, Y: Field{[10]uint32{0x039513c9, 0x00b3c88a, 0x00d56df7, 0x006ddd9d, 0x03139bc3, 0x0374b68e, 0x0353c918, 0x026155de, 0x03c02f10, 0x0018253e}}}, + {X: Field{[10]uint32{0x00ce3015, 0x02ea11c6, 0x03e5d859, 0x00d790a1, 0x022c37eb, 0x02e4460b, 0x0142dcfd, 0x0353f6fa, 0x020c900b, 0x0013b9b0}}, Y: Field{[10]uint32{0x0062cd64, 0x03543cc8, 0x00f7590e, 0x0319311f, 0x0142e2a9, 0x030a4f4f, 0x0338e668, 0x0186312d, 0x0369863d, 0x00212b25}}}, + {X: Field{[10]uint32{0x00a0fa61, 0x01c5e5a2, 0x02c6ad22, 0x00442be7, 0x01aa5982, 0x01323160, 0x00e11dca, 0x03e28e3b, 0x001af57b, 0x0029a04f}}, Y: Field{[10]uint32{0x038edca4, 0x00ba0256, 0x000e1d18, 0x026f7168, 0x01d415c9, 0x0263ecbc, 0x03e2335e, 0x0258c56d, 0x034df4e2, 0x00190809}}}, + {X: Field{[10]uint32{0x010fce84, 0x03f9aadc, 0x03d6c0fd, 0x01ddbb94, 0x0269d910, 0x01d76d27, 0x01fc7432, 0x00a25c93, 0x03b7107b, 0x00108400}}, Y: Field{[10]uint32{0x02f9427f, 0x023ccf1d, 0x0002ac21, 0x021ceaa0, 0x020a9320, 0x022f3fa9, 0x01cb1498, 0x010e570c, 0x01697b92, 0x0032e555}}}, + {X: Field{[10]uint32{0x00c8c522, 0x002f7192, 0x02df8fc6, 0x02616d51, 0x015e1252, 0x02b3d7c9, 0x009d362e, 0x0313f100, 0x01e10cb8, 0x000272c6}}, Y: Field{[10]uint32{0x03d70d12, 0x03a253b1, 0x036231b7, 0x0382416f, 0x028fd286, 0x035f3fe1, 0x0220e70e, 0x039a2d8f, 0x01d32c6e, 0x00089c05}}}, + {X: Field{[10]uint32{0x03b953c2, 0x00d8d8a2, 0x03704362, 0x012dd78c, 0x03c4a7ac, 0x038b3832, 0x03412d64, 0x01623ce3, 0x01968193, 0x0031d04d}}, Y: Field{[10]uint32{0x0108aa6b, 0x01d7bd2a, 0x008019ae, 0x03c949de, 0x015e1d70, 0x03b05ace, 0x02dd4c90, 0x03135b48, 0x03a01b7c, 0x001efb9f}}}, + {X: Field{[10]uint32{0x01df22cc, 0x00b99d98, 0x02cec9dc, 0x02603a1b, 0x00c2f8e3, 0x02a5f319, 0x03ac1ea8, 0x01249ba3, 0x0205321f, 0x000aa3a2}}, Y: Field{[10]uint32{0x001fae42, 0x007ef6e6, 0x037809c8, 0x001febfd, 0x0364f0c0, 0x0034fe04, 0x0360c21c, 0x0372aab2, 0x01074e4f, 0x0018ee19}}}, + {X: Field{[10]uint32{0x0097a14d, 0x008a4fb5, 0x02127355, 0x031f1bd9, 0x025af1d8, 0x02a38b72, 0x02ab014e, 0x00d65122, 0x02607d40, 0x003cfbcb}}, Y: Field{[10]uint32{0x022cccc9, 0x01f0c758, 0x03ca9c63, 0x012fd0f6, 0x019e9ce4, 0x0275e305, 0x01d1d964, 0x027d12f1, 0x0334214b, 0x0037f354}}}, + {X: Field{[10]uint32{0x0057ead9, 0x0100a012, 0x0365a80e, 0x0092effa, 0x03a93964, 0x02c759c4, 0x0111b361, 0x00ce9744, 0x01c8169c, 0x001b5710}}, Y: Field{[10]uint32{0x005e84c8, 0x031522a9, 0x02a4a6a0, 0x00829486, 0x023d6742, 0x003d66f7, 0x0291d370, 0x02f0a89e, 0x00c49f01, 0x001307dd}}}, + {X: Field{[10]uint32{0x02fff85c, 0x031c7d12, 0x03c73488, 0x00891f81, 0x01608223, 0x013f51e3, 0x01982ce3, 0x021ac0b1, 0x0261c6a9, 0x0017604a}}, Y: Field{[10]uint32{0x03a960b8, 0x036894ff, 0x001fdcc8, 0x005e2fb5, 0x00680b15, 0x03248d21, 0x0349e164, 0x023f1095, 0x037b1601, 0x000dc20f}}}, + {X: Field{[10]uint32{0x0373093e, 0x02aa11df, 0x027d5dc6, 0x029827be, 0x01720177, 0x00a44615, 0x03a97108, 0x03cd1f0e, 0x02ecb82f, 0x00380565}}, Y: Field{[10]uint32{0x005b3bdd, 0x01faceed, 0x0177e554, 0x03061dd9, 0x03a17aca, 0x02963929, 0x00da5d06, 0x0212e74e, 0x00328498, 0x00299d32}}}, + {X: Field{[10]uint32{0x01980f55, 0x01100b02, 0x00d0b834, 0x0183bdac, 0x00ad52b9, 0x0373fdfc, 0x032fcaea, 0x03fcb9ec, 0x01000313, 0x0019e96a}}, Y: Field{[10]uint32{0x000a4a02, 0x01c0f24f, 0x02a03f41, 0x022bae2d, 0x009fdf92, 0x01f10783, 0x00075753, 0x022197ae, 0x01db5e8e, 0x0039dfbf}}}, + {X: Field{[10]uint32{0x0066b277, 0x0035f0d9, 0x01c217df, 0x02cd5ca0, 0x0353d77d, 0x03798960, 0x01c16477, 0x002b60a0, 0x039c2e2d, 0x000ae5a1}}, Y: Field{[10]uint32{0x00b62b25, 0x02f211a0, 0x030743cb, 0x0019e1a9, 0x027e0dae, 0x012a7f9f, 0x032408f6, 0x030caf31, 0x007343ba, 0x0037574d}}}, + {X: Field{[10]uint32{0x010367e9, 0x038b670c, 0x02bad825, 0x012fedc9, 0x03639b05, 0x00f8f848, 0x03137aea, 0x01235cb7, 0x038df087, 0x002ae50d}}, Y: Field{[10]uint32{0x03a10f03, 0x03740610, 0x011c99e3, 0x027fcb7c, 0x017f9d76, 0x01e376bd, 0x0331865c, 0x01f446a0, 0x02244003, 0x0015e173}}}, + {X: Field{[10]uint32{0x03e7439f, 0x02aaec10, 0x00985fa3, 0x036e1ef9, 0x012f3fd4, 0x028edb23, 0x013def6c, 0x03f78e32, 0x01560fd6, 0x001c1e09}}, Y: Field{[10]uint32{0x038ebec7, 0x02cfee05, 0x036af8f9, 0x03603e88, 0x0151894b, 0x03abd4d4, 0x01274b48, 0x01408331, 0x0365ecf1, 0x001e44ef}}}, + {X: Field{[10]uint32{0x03ca3942, 0x028062dd, 0x01eb3e71, 0x0203bf3b, 0x036b4d5e, 0x000928fd, 0x038c72c1, 0x03541ecc, 0x0070138b, 0x000c0974}}, Y: Field{[10]uint32{0x02b470ae, 0x03759a43, 0x03096f83, 0x02558e96, 0x038d5032, 0x00a93b94, 0x00172b5f, 0x03fe56a5, 0x020e175e, 0x000ea29a}}}, + {X: Field{[10]uint32{0x039ab0b6, 0x028f4602, 0x03ac9901, 0x02864e25, 0x02576081, 0x02a34079, 0x0069e7b2, 0x01eaee50, 0x02d065e9, 0x000ff8dc}}, Y: Field{[10]uint32{0x00842e5a, 0x00082895, 0x00c2d4c1, 0x014b3898, 0x00824035, 0x0359ed69, 0x03315e41, 0x037300dd, 0x02923154, 0x000bbf3b}}}, + {X: Field{[10]uint32{0x02f55636, 0x03968c0a, 0x001640bc, 0x03836a04, 0x03c3c373, 0x0301af5f, 0x02be8f9c, 0x00cfba5f, 0x00113a91, 0x000da31c}}, Y: Field{[10]uint32{0x006162a8, 0x03e1ad34, 0x024a135b, 0x03969bea, 0x02eb7d70, 0x0305a5c4, 0x028b942b, 0x02a385bc, 0x00fa4870, 0x00086f50}}}, + {X: Field{[10]uint32{0x00d96810, 0x03ab253b, 0x0100387e, 0x01a3953f, 0x0357682f, 0x02b5b5c4, 0x0040f230, 0x01793879, 0x03d8beb4, 0x001f7e3f}}, Y: Field{[10]uint32{0x002ed0df, 0x01d99f66, 0x013c9ec0, 0x0034281f, 0x03dc5555, 0x0131fff9, 0x0057d789, 0x016a6512, 0x00f9908e, 0x000f6793}}}, + {X: Field{[10]uint32{0x036f23d4, 0x036fdf42, 0x038bbdd2, 0x01c9413e, 0x02882691, 0x026c449d, 0x02162624, 0x031fb9f0, 0x0139eb49, 0x0032dab6}}, Y: Field{[10]uint32{0x0298346d, 0x000063ba, 0x01cb345e, 0x019785e2, 0x005480ca, 0x027e399a, 0x01319c45, 0x01cd9f78, 0x00db18f2, 0x003b2181}}}, + {X: Field{[10]uint32{0x00f4265a, 0x0263ca1c, 0x0053d390, 0x010b9a13, 0x01d8a1e0, 0x02766c81, 0x014e6a75, 0x00679b81, 0x02c80fc3, 0x0016b949}}, Y: Field{[10]uint32{0x010a9a63, 0x022185f5, 0x03850f24, 0x02af678c, 0x00a03f4b, 0x0155df02, 0x033ef80d, 0x016a433f, 0x028114c2, 0x00368784}}}, + {X: Field{[10]uint32{0x01ff7661, 0x021ab9c9, 0x03323a87, 0x019d6e34, 0x02174777, 0x000115b5, 0x03f2b10e, 0x02eb306e, 0x008906dd, 0x0021a35e}}, Y: Field{[10]uint32{0x0322ca1d, 0x030c24eb, 0x00ef296f, 0x0120d0a8, 0x0246e6ce, 0x027051bd, 0x03e57baa, 0x0037e38a, 0x001d189b, 0x00364b5a}}}, + {X: Field{[10]uint32{0x03686b74, 0x00762675, 0x025a4834, 0x02611f0c, 0x0223bd32, 0x01041a8c, 0x01d1f8a7, 0x0206db13, 0x034de7b8, 0x0027cbc2}}, Y: Field{[10]uint32{0x02440088, 0x013f0523, 0x016e3c44, 0x0172d1fc, 0x02deca28, 0x016158bc, 0x0329ca66, 0x012be2d5, 0x0111c297, 0x001beef5}}}, + {X: Field{[10]uint32{0x03fca8a3, 0x0140ddb4, 0x00b4fe69, 0x03afa302, 0x02c522f5, 0x03b8babd, 0x032da983, 0x0037c56f, 0x022b813b, 0x003eabc8}}, Y: Field{[10]uint32{0x000b472e, 0x036d0751, 0x01469b2c, 0x01b175b4, 0x0147f00e, 0x013c4aaf, 0x032ae874, 0x036b1a3e, 0x02692e98, 0x002fb14f}}}, + {X: Field{[10]uint32{0x03161475, 0x01f48a69, 0x00008fd6, 0x020293b1, 0x0313c81c, 0x01b1718b, 0x02a7ab70, 0x02e7e8b0, 0x01b9db4a, 0x001fd482}}, Y: Field{[10]uint32{0x0248d193, 0x033a82d2, 0x00ce4e69, 0x002e6b31, 0x00a58be4, 0x03c64736, 0x017d1c76, 0x01a67fce, 0x00daf9e8, 0x00284f5b}}}, + {X: Field{[10]uint32{0x02c84c2a, 0x012fd3c4, 0x00c04683, 0x02490168, 0x0050c7b4, 0x009c0285, 0x025f395e, 0x00dbc201, 0x016e80b1, 0x003d0d85}}, Y: Field{[10]uint32{0x017e60c4, 0x022546ef, 0x020e5911, 0x002e220a, 0x00e7aa89, 0x026c01fa, 0x020807d3, 0x03806e9d, 0x03b05684, 0x00337655}}}, + {X: Field{[10]uint32{0x00f1d06e, 0x03c70c4f, 0x0169f201, 0x0150ac93, 0x02882167, 0x00d153e9, 0x020c2bb0, 0x00df6081, 0x03495c5b, 0x003be6a9}}, Y: Field{[10]uint32{0x027a4aa9, 0x033d32bc, 0x0366654c, 0x03bf47dd, 0x0050003a, 0x0139b35f, 0x0125750e, 0x012a3eb0, 0x024df1d8, 0x003e1036}}}, + {X: Field{[10]uint32{0x035de05a, 0x00a25bfe, 0x01d40b12, 0x0322965c, 0x016d9e1c, 0x0179e4db, 0x010809c2, 0x02e4eb0a, 0x0043e96e, 0x001f7bb7}}, Y: Field{[10]uint32{0x02a8e0ce, 0x009ad949, 0x03381220, 0x03edaf24, 0x01de6683, 0x033c4bf3, 0x027b349c, 0x03439003, 0x026627b9, 0x00399703}}}, + {X: Field{[10]uint32{0x006d6459, 0x012cf3a6, 0x0215c0e7, 0x03d3ca0f, 0x01878384, 0x020bcd87, 0x03e74955, 0x01e5711e, 0x03156669, 0x001686fb}}, Y: Field{[10]uint32{0x00cf39ff, 0x01e711cb, 0x00d61b11, 0x020777e3, 0x0069b28b, 0x020cf8e0, 0x035b97e1, 0x000aca78, 0x02811fdb, 0x0033a616}}}, + {X: Field{[10]uint32{0x0125fa8e, 0x014d5639, 0x0383bfa4, 0x033e12c8, 0x0173b8fd, 0x020f1beb, 0x00eeb789, 0x004f0ac5, 0x01392334, 0x0036048f}}, Y: Field{[10]uint32{0x0233ef73, 0x009a51e9, 0x00095ea2, 0x028c3256, 0x02835e35, 0x02ecf2d5, 0x03f78a5a, 0x01c8011b, 0x019d905b, 0x003aa74e}}}, + {X: Field{[10]uint32{0x024d4bc8, 0x00c4cd03, 0x035d8939, 0x03469e9a, 0x0310d3df, 0x0026bed7, 0x02a36c39, 0x030c4099, 0x01d4f1f4, 0x0018bd0f}}, Y: Field{[10]uint32{0x0190f3ed, 0x028772ed, 0x028ef89f, 0x00a76a8b, 0x02755258, 0x00e8407c, 0x034fe225, 0x03591cb8, 0x01f1f83b, 0x002edd62}}}, + {X: Field{[10]uint32{0x039d72f7, 0x033cc4bd, 0x01f4fcc1, 0x0111bd8b, 0x00865f6e, 0x033d6535, 0x015aa750, 0x03011450, 0x0371d549, 0x00001b3c}}, Y: Field{[10]uint32{0x01e93af4, 0x006b7172, 0x0216a758, 0x02741a33, 0x002b3dee, 0x020ad168, 0x024ce206, 0x026f4a0a, 0x022b5c97, 0x003e33ad}}}, + {X: Field{[10]uint32{0x03cdd7e7, 0x03bf16d1, 0x01f3c509, 0x01c545af, 0x0249aeb3, 0x03e55021, 0x01638dd8, 0x03a70df0, 0x0380770b, 0x0016f5ed}}, Y: Field{[10]uint32{0x006ba9ff, 0x0242664a, 0x031e3021, 0x000ca8a2, 0x01efc12c, 0x02b74309, 0x006b91c5, 0x02abd3d8, 0x00488a87, 0x00351b1e}}}, + {X: Field{[10]uint32{0x036b6a62, 0x02fcf6f0, 0x001af0e6, 0x01ffc55a, 0x0081eecd, 0x02e566e8, 0x02086653, 0x02f52b96, 0x0154a319, 0x0031dc12}}, Y: Field{[10]uint32{0x016d0fe7, 0x00ecf294, 0x0337836e, 0x0002c571, 0x03e508f6, 0x02273312, 0x013b9c61, 0x012ea0fd, 0x03e82478, 0x000dcd50}}}, + {X: Field{[10]uint32{0x01b19cda, 0x0371b40e, 0x039588fe, 0x02342790, 0x02d6e92c, 0x0040b07b, 0x007da707, 0x00ea7760, 0x03fe4153, 0x000ad3c9}}, Y: Field{[10]uint32{0x001fb424, 0x038ab67e, 0x01d6b089, 0x02009005, 0x0049ba21, 0x024bd30c, 0x01fadd4a, 0x01f2c704, 0x03100ecd, 0x00262ea0}}}, + {X: Field{[10]uint32{0x014c0e5a, 0x001b2297, 0x03db54d3, 0x0204f5f0, 0x032c920c, 0x01a4c7e5, 0x000c581d, 0x030d3498, 0x01710b3d, 0x00039f50}}, Y: Field{[10]uint32{0x029a409a, 0x00513c92, 0x011f75b6, 0x01c74735, 0x0303e75b, 0x0169b128, 0x03a97efb, 0x014e1e67, 0x01ba9a82, 0x002ca560}}}, + {X: Field{[10]uint32{0x01c5d52e, 0x0198357c, 0x0284b2b5, 0x0187a01b, 0x032face7, 0x01a89c5f, 0x02700435, 0x00d5dc14, 0x022c18f4, 0x001880c0}}, Y: Field{[10]uint32{0x036a720d, 0x02021944, 0x024eb06c, 0x035aaa21, 0x020212ef, 0x0150ae5f, 0x035fe973, 0x0135d409, 0x03255d0a, 0x0006294b}}}, + {X: Field{[10]uint32{0x02e43b2b, 0x00700124, 0x026300e8, 0x01e5e479, 0x02489876, 0x02c3f332, 0x02327fe3, 0x02036e83, 0x03a28c1c, 0x002f6071}}, Y: Field{[10]uint32{0x003871c0, 0x0388d1e0, 0x00678db1, 0x02b3a4ea, 0x02416064, 0x03c6154d, 0x00831f07, 0x02f19278, 0x004ea14b, 0x0032942a}}}, + {X: Field{[10]uint32{0x004bc29a, 0x01aa6d3f, 0x0154a062, 0x0139bce9, 0x01b875eb, 0x000e9b83, 0x01385cd6, 0x00e43f34, 0x021ad3c1, 0x0026f10f}}, Y: Field{[10]uint32{0x00cb2cd4, 0x00b9a9b8, 0x0222e6b1, 0x02f763d2, 0x0264ea39, 0x01e5c5ec, 0x00d8b34b, 0x012ed5eb, 0x00bf9aa5, 0x00215e96}}}, + {X: Field{[10]uint32{0x03e40f33, 0x01da7329, 0x039082c8, 0x01c7195b, 0x015e5bfb, 0x0262fea8, 0x030117cb, 0x038f1e7b, 0x028d194d, 0x000c1569}}, Y: Field{[10]uint32{0x000d1d10, 0x008cf90d, 0x0086c1c9, 0x01ca9ff8, 0x00acbd8c, 0x01aae9af, 0x00218cfb, 0x038712fc, 0x01eadfeb, 0x000060fe}}}, + {X: Field{[10]uint32{0x034b08ac, 0x01e7eedc, 0x03e1b710, 0x00c5f62e, 0x002cec12, 0x00d60ee0, 0x02710724, 0x03462324, 0x0184ad1f, 0x0012b6fe}}, Y: Field{[10]uint32{0x03ec04e6, 0x013578f5, 0x01954709, 0x02dbde7d, 0x032192ce, 0x038fcb42, 0x01507668, 0x033bfcf6, 0x01889560, 0x0005149c}}}, + {X: Field{[10]uint32{0x016487cc, 0x01947469, 0x00b0cd00, 0x00daa81d, 0x0283fc6a, 0x033c5b48, 0x03ae3979, 0x0107671e, 0x01cc27e0, 0x000e3dcb}}, Y: Field{[10]uint32{0x033dc0bf, 0x01830ea4, 0x0188df71, 0x0110b946, 0x02496104, 0x002dbff1, 0x030d6f2c, 0x001b904d, 0x017c33a1, 0x00148e32}}}, + {X: Field{[10]uint32{0x015be2d3, 0x00623199, 0x03813322, 0x011d1f09, 0x02045606, 0x03167fca, 0x0013828a, 0x03f78285, 0x018a7bdf, 0x0037956f}}, Y: Field{[10]uint32{0x0042d9da, 0x034eed40, 0x0151ce65, 0x0146e65b, 0x0367bf9d, 0x01ec2bed, 0x039d0979, 0x0097cdd7, 0x01b0df5b, 0x0011de18}}}, + {X: Field{[10]uint32{0x023bcc66, 0x026e2797, 0x03893873, 0x03a9b159, 0x02e19340, 0x019bfa44, 0x00edf986, 0x000ae246, 0x00fdc47e, 0x003185ef}}, Y: Field{[10]uint32{0x01117072, 0x0098d259, 0x00d473b8, 0x01cad6c2, 0x01a6e046, 0x01133f12, 0x020f4e86, 0x01da0cab, 0x0117357e, 0x002e42e8}}}, + {X: Field{[10]uint32{0x01c84758, 0x02aceefc, 0x036724ad, 0x036fb2b6, 0x03c455f4, 0x024acc0c, 0x02402f1e, 0x0223252d, 0x01961b51, 0x00119570}}, Y: Field{[10]uint32{0x02fbc4a0, 0x0071b779, 0x01b5cf2c, 0x0300a0e2, 0x02714600, 0x012f017a, 0x0202df4f, 0x017d37ec, 0x0093a257, 0x000f3bb3}}}, + {X: Field{[10]uint32{0x03726a45, 0x021ba375, 0x004c9e5f, 0x00c67077, 0x00110df4, 0x02ad0f68, 0x013c503f, 0x0396b4da, 0x0340dc05, 0x003f2a43}}, Y: Field{[10]uint32{0x035771ca, 0x0321bf17, 0x021c3e6c, 0x03b1a323, 0x027478ed, 0x0269c29b, 0x0337aeb1, 0x0198106b, 0x039bbe3e, 0x003d608b}}}, + {X: Field{[10]uint32{0x027f61e9, 0x03c546f4, 0x00afb93f, 0x0015e31f, 0x02a31cbe, 0x02434ecf, 0x01e88d7f, 0x020961de, 0x004adcb2, 0x000c5db3}}, Y: Field{[10]uint32{0x02cc0135, 0x00308c50, 0x006aac34, 0x01115b34, 0x036a18ce, 0x03ed6ad6, 0x00fe7bba, 0x00290f25, 0x02cc148a, 0x000e18fc}}}, + {X: Field{[10]uint32{0x03b2ddc4, 0x0079943a, 0x014e0b81, 0x02734c69, 0x0151d9c1, 0x013e0b31, 0x030db151, 0x00842b41, 0x0373d124, 0x0018c9a7}}, Y: Field{[10]uint32{0x005cd0ac, 0x003c36f6, 0x02188e30, 0x02f0fdaa, 0x03038246, 0x002230e1, 0x034114e5, 0x01e90929, 0x03dd8a78, 0x002fe3b1}}}, + {X: Field{[10]uint32{0x032003d0, 0x00f39518, 0x02708dee, 0x0124d374, 0x000f07e7, 0x0104c9aa, 0x027f5445, 0x014ed86b, 0x01328d0f, 0x0019e687}}, Y: Field{[10]uint32{0x025c350f, 0x0240629c, 0x0085c034, 0x0157268d, 0x02c9b3eb, 0x03dbba69, 0x03e341d5, 0x03b28c46, 0x03488f21, 0x0020f284}}}, + {X: Field{[10]uint32{0x00b38b28, 0x033ce678, 0x036fb846, 0x0277a009, 0x03f7172f, 0x0153624c, 0x0148568a, 0x00b2134e, 0x01792998, 0x001a689f}}, Y: Field{[10]uint32{0x03b26168, 0x0058f90e, 0x034f3a02, 0x03d6b0b6, 0x0369c8b7, 0x00bce6f5, 0x00b16a12, 0x002ee15d, 0x0207cb0f, 0x003d0474}}}, + {X: Field{[10]uint32{0x0373ee4d, 0x015b23d9, 0x03c7f9dd, 0x02e72bfa, 0x02abfdab, 0x000a73bc, 0x03f21716, 0x01410b2f, 0x005701af, 0x000a6354}}, Y: Field{[10]uint32{0x0297e9e1, 0x00f0156a, 0x0222075e, 0x029e733e, 0x034271bd, 0x03db70db, 0x02e62c4b, 0x02113904, 0x0271d271, 0x003d0d0f}}}, + {X: Field{[10]uint32{0x000c4653, 0x022e5e48, 0x023b1f8f, 0x0391513d, 0x00e26f66, 0x02f3ce4c, 0x00eb9845, 0x03c4063e, 0x03da46d1, 0x000fca60}}, Y: Field{[10]uint32{0x01d71db0, 0x03166542, 0x01b53b26, 0x02f1e760, 0x009b2c38, 0x00c9b4e0, 0x02d57e6b, 0x00cec40d, 0x0114c4ad, 0x00125cea}}}, + {X: Field{[10]uint32{0x023538dd, 0x02aa2fdf, 0x03b1359f, 0x0287bda8, 0x0154412e, 0x0074a9be, 0x02d64b2a, 0x02e23650, 0x013e30ce, 0x003e0dbf}}, Y: Field{[10]uint32{0x037f9367, 0x0380a0b3, 0x02ba3b28, 0x038c1b9a, 0x00c8161e, 0x0162ddc8, 0x01fd29c1, 0x01ad69c2, 0x00815347, 0x001c828c}}}, + {X: Field{[10]uint32{0x00ef583a, 0x038b7c80, 0x03930b3a, 0x008807bb, 0x01295ed5, 0x03a647fa, 0x03c8ee4f, 0x00e2898e, 0x039b911e, 0x00375cba}}, Y: Field{[10]uint32{0x00c1b2ef, 0x02d03250, 0x00b8683c, 0x02c50fc4, 0x02398e86, 0x0182d4ec, 0x0285d9b3, 0x03dfe5e4, 0x01a5688b, 0x000a8369}}}, + {X: Field{[10]uint32{0x0168a619, 0x00fc0cd2, 0x019be028, 0x02912584, 0x037cef92, 0x00962dfc, 0x027bd818, 0x00957310, 0x025046ab, 0x00154789}}, Y: Field{[10]uint32{0x03bc4f30, 0x01e8dc39, 0x0223b200, 0x02a8f1ba, 0x02e5ca16, 0x00560a9b, 0x006a5ecd, 0x03cd6e6e, 0x03d24cd8, 0x000c5f0c}}}, + {X: Field{[10]uint32{0x0336c650, 0x00eb5e14, 0x02a90fbd, 0x01857214, 0x01ab28cb, 0x01e09564, 0x0319a304, 0x038f43b2, 0x0292131d, 0x0019a0f7}}, Y: Field{[10]uint32{0x002225f8, 0x01b4224a, 0x019e4d63, 0x03082397, 0x00b3c3b2, 0x011be839, 0x029556ec, 0x01548fe2, 0x018e7fd9, 0x00127ba9}}}, + {X: Field{[10]uint32{0x00f97805, 0x0127224f, 0x03ac7bea, 0x00f4c692, 0x01ca99ef, 0x023e257a, 0x029b146e, 0x03a99782, 0x01e284a6, 0x002d6cec}}, Y: Field{[10]uint32{0x01b6fe0d, 0x013ba239, 0x01667ffa, 0x030d51fa, 0x023cf16c, 0x0065402f, 0x0391437e, 0x038a5bca, 0x0294f333, 0x00285c82}}}, + {X: Field{[10]uint32{0x03cbf466, 0x009007e6, 0x00d1011a, 0x00e954d4, 0x03ccdde4, 0x01c63518, 0x009a2329, 0x01da125c, 0x03737c33, 0x00294065}}, Y: Field{[10]uint32{0x01d429e2, 0x03eb61ea, 0x0027e12e, 0x0233efcf, 0x03c51fff, 0x01add47a, 0x03a5e09b, 0x031777a3, 0x029effef, 0x00027301}}}, + {X: Field{[10]uint32{0x001588fb, 0x00dad8fb, 0x03849e12, 0x0092238b, 0x02e5cb72, 0x02c7162c, 0x0041b663, 0x0361850a, 0x018feb2b, 0x0027b0d2}}, Y: Field{[10]uint32{0x001f5f12, 0x00194bc3, 0x0333ba00, 0x0216a01c, 0x01e517e5, 0x005437fb, 0x02719bf2, 0x025fc0d8, 0x01a5e14b, 0x00380324}}}, + {X: Field{[10]uint32{0x03c5b6b2, 0x00c6afbc, 0x004b1f47, 0x02f16abc, 0x03581f97, 0x02e49999, 0x00b446ba, 0x00c615d4, 0x00b4adc1, 0x003842db}}, Y: Field{[10]uint32{0x01e2b9c3, 0x017f720d, 0x00ed3c1f, 0x010bc998, 0x01d5520b, 0x02d97007, 0x0287bba5, 0x0011dfce, 0x02137db2, 0x0014e944}}}, + {X: Field{[10]uint32{0x013ae314, 0x01873877, 0x00d0d3ff, 0x009c4ec6, 0x0360ace9, 0x000ad810, 0x0093691e, 0x029f1e63, 0x0167e36e, 0x002dd52a}}, Y: Field{[10]uint32{0x0073d849, 0x02e0a855, 0x0359be12, 0x00a64cf3, 0x00d83ee0, 0x02ac0794, 0x02f8d5fb, 0x03b96690, 0x01639aa7, 0x0022a68e}}}, + {X: Field{[10]uint32{0x02efa869, 0x0060ffcc, 0x02c8d489, 0x01d58d02, 0x017999a2, 0x02fa95a7, 0x038a51e6, 0x02fcf81b, 0x0361c10c, 0x0017fbf2}}, Y: Field{[10]uint32{0x02881e83, 0x02f86fd3, 0x0120715b, 0x01426cd2, 0x01dfe499, 0x02308150, 0x008c0932, 0x020d7076, 0x0093cbc4, 0x003606cc}}}, + {X: Field{[10]uint32{0x03d2d848, 0x02910bc9, 0x0118470a, 0x002aca6e, 0x01f0ed6f, 0x009f2265, 0x0009400b, 0x025f8658, 0x03bb04ac, 0x003f9468}}, Y: Field{[10]uint32{0x01116a58, 0x03f55a32, 0x00bd6ec5, 0x013c020f, 0x03d30625, 0x027c2c60, 0x02b8aaf5, 0x0279103c, 0x00e0a4c3, 0x00215a3f}}}, + {X: Field{[10]uint32{0x02b7dee3, 0x024519be, 0x0158d7b5, 0x0263911d, 0x00391df7, 0x03aca908, 0x00d5d38a, 0x03fb6f16, 0x02299fcc, 0x001a8f91}}, Y: Field{[10]uint32{0x02a5e548, 0x00fba6c8, 0x01a91aec, 0x02e78c58, 0x0289873e, 0x02ac7679, 0x02e7b5a3, 0x01767750, 0x03ba7bb1, 0x0006fb63}}}, + {X: Field{[10]uint32{0x03450c37, 0x01fff225, 0x012ee745, 0x0134e492, 0x0233db30, 0x0385af4c, 0x0162d970, 0x03537bdf, 0x00b83c40, 0x002b7f6f}}, Y: Field{[10]uint32{0x00138e0e, 0x0216e1fd, 0x001956be, 0x0064b873, 0x038fde78, 0x0055ab08, 0x00b588c4, 0x0127b0aa, 0x03dc1635, 0x001ec20a}}}, + {X: Field{[10]uint32{0x0113bf61, 0x030f7540, 0x02cb9f06, 0x0371bb31, 0x01509ed7, 0x00b45c04, 0x0254c270, 0x00b1520d, 0x03cc9c20, 0x0025a143}}, Y: Field{[10]uint32{0x0281aaf7, 0x022e2c34, 0x03b6c008, 0x01568070, 0x01b9fcc4, 0x01fb062d, 0x00c05dac, 0x01b126bc, 0x00327f96, 0x00041011}}}, + {X: Field{[10]uint32{0x00458bbe, 0x01026d57, 0x03ac4f09, 0x005059bc, 0x031703f5, 0x0010de69, 0x00151ca8, 0x03285362, 0x01978f78, 0x000ab884}}, Y: Field{[10]uint32{0x01ecf7b1, 0x03277106, 0x012c86cb, 0x009fe80c, 0x022328e3, 0x021e5873, 0x01c7dde3, 0x00d7f514, 0x00d95760, 0x001379d3}}}, + {X: Field{[10]uint32{0x02987e57, 0x03ab1846, 0x006cfb79, 0x038f149d, 0x027e5816, 0x0358b109, 0x021a332c, 0x03265899, 0x0342e1b5, 0x003b7061}}, Y: Field{[10]uint32{0x01b4fe5e, 0x00868d01, 0x01bc02c0, 0x00c8c0c4, 0x0129ba90, 0x02eaf95e, 0x01d484fe, 0x0026fcfe, 0x033fc633, 0x0020000e}}}, + {X: Field{[10]uint32{0x0243a244, 0x0299033f, 0x025aa1d6, 0x012610dd, 0x0038b35d, 0x022e50da, 0x0290885c, 0x03c2b8a6, 0x022a5fa0, 0x001e00aa}}, Y: Field{[10]uint32{0x0192a803, 0x03dc59e4, 0x025dd7f5, 0x004616ea, 0x037e3dda, 0x005b126e, 0x03297e04, 0x00e6a101, 0x029fe632, 0x00031fcc}}}, + {X: Field{[10]uint32{0x012335cf, 0x01efdfe6, 0x02386bf6, 0x03a0d79c, 0x02c2173d, 0x038ff16a, 0x02ede712, 0x011d6b0d, 0x0179b124, 0x003eddd1}}, Y: Field{[10]uint32{0x03a82c94, 0x032f3011, 0x02c01cdf, 0x029add8e, 0x01b6f413, 0x006a3590, 0x03ebf0e3, 0x01edeb90, 0x035163c1, 0x0030399a}}}, + {X: Field{[10]uint32{0x00bc2852, 0x03886cff, 0x02982051, 0x00928c6d, 0x00695a9c, 0x03a70480, 0x0394881f, 0x02ba78cb, 0x018a43ab, 0x0036068f}}, Y: Field{[10]uint32{0x0112673f, 0x03dafcb7, 0x00dbf2cc, 0x028f2419, 0x01a693e3, 0x002a636d, 0x0351de7e, 0x032db5ef, 0x0011e8a8, 0x0018c376}}}, + {X: Field{[10]uint32{0x03324cf0, 0x01ddadf1, 0x0249f9bf, 0x02812f94, 0x027cb2ed, 0x0089a336, 0x00da0c7e, 0x001a2e01, 0x03d497cf, 0x001467f3}}, Y: Field{[10]uint32{0x0162fdb9, 0x039bff25, 0x0391dc20, 0x03b0ef28, 0x03a357c8, 0x03912ae7, 0x02916466, 0x02cfaef9, 0x00cd198a, 0x002fb1bd}}}, + {X: Field{[10]uint32{0x028ef592, 0x024a5be1, 0x0044124f, 0x021389dc, 0x023e31b2, 0x003e6c70, 0x0193853e, 0x0181cd78, 0x03e48fd6, 0x003312b4}}, Y: Field{[10]uint32{0x0383c27b, 0x0098eb75, 0x02f68996, 0x007b6c96, 0x019b1215, 0x01ec0f1d, 0x01520ac6, 0x0311d1f5, 0x018d8583, 0x00222bc5}}}, + {X: Field{[10]uint32{0x00d24117, 0x00240d1e, 0x01e338f7, 0x02852e17, 0x02c06a57, 0x0137b5ba, 0x0340cf96, 0x021a9662, 0x00ae6f51, 0x002b7654}}, Y: Field{[10]uint32{0x03affa7d, 0x01effd28, 0x0165bc04, 0x03f1c013, 0x00111f6d, 0x002fb1d1, 0x03d6853a, 0x00a1737a, 0x00bd2d69, 0x00316729}}}, + {X: Field{[10]uint32{0x02b383e4, 0x030fdb6e, 0x027ddd0b, 0x0319f124, 0x03ef0437, 0x032cd62b, 0x03c81730, 0x01f79c4a, 0x03454309, 0x003701c6}}, Y: Field{[10]uint32{0x015ca8ed, 0x0042d03a, 0x0385f9e4, 0x0283ec46, 0x03f28fca, 0x0061f7ef, 0x03b2adfc, 0x00c1305c, 0x02a9899b, 0x001e4e44}}}, + {X: Field{[10]uint32{0x02c167c7, 0x01e6c6ab, 0x03abe94d, 0x01c91fda, 0x02fd97a6, 0x025ade9c, 0x0037da4a, 0x002676a7, 0x037e6db6, 0x0017738c}}, Y: Field{[10]uint32{0x024377f6, 0x0276f593, 0x021d5754, 0x015993ac, 0x00eb35bf, 0x005ae8a8, 0x0082991f, 0x02290ed9, 0x03ba1f09, 0x0006e21f}}}, + {X: Field{[10]uint32{0x01f5cfcb, 0x02133e78, 0x009e5ba2, 0x03d0f984, 0x02900a83, 0x03a02260, 0x022ead80, 0x029989b4, 0x02ad8493, 0x00145bad}}, Y: Field{[10]uint32{0x00e05042, 0x00c3fbfb, 0x03e3c68d, 0x0046ecdb, 0x03ef6a85, 0x0074fe51, 0x018308c6, 0x02d1bd23, 0x02b38085, 0x00328d42}}}, + {X: Field{[10]uint32{0x000e5e75, 0x03c71f3c, 0x020a335a, 0x02e02321, 0x03732b3f, 0x03a45f21, 0x03912114, 0x00b68796, 0x01503b1f, 0x003dd9f0}}, Y: Field{[10]uint32{0x01aaab54, 0x02d1cf68, 0x0165795b, 0x003854f3, 0x0109ec61, 0x015776ad, 0x00f64a26, 0x0119ee22, 0x00c8cdbe, 0x000fb3be}}}, + {X: Field{[10]uint32{0x03c977f0, 0x00eb099c, 0x01e7531f, 0x00b0b319, 0x02418558, 0x005df79e, 0x03bc5d8f, 0x00b2329e, 0x03cf0f79, 0x003e6efa}}, Y: Field{[10]uint32{0x01614a85, 0x026595d2, 0x02f52b8c, 0x02aab3b2, 0x03ac751e, 0x02867957, 0x02f767b8, 0x00e89895, 0x00fefecb, 0x000a42ad}}}, + {X: Field{[10]uint32{0x0147c45f, 0x01dff3d3, 0x00e8eaf4, 0x02f326c2, 0x016ec3ad, 0x0048f7d8, 0x01bff42c, 0x0236c7d5, 0x01febe5c, 0x0031aff8}}, Y: Field{[10]uint32{0x0241792f, 0x02b55b35, 0x02995c79, 0x0004d1fa, 0x0041c271, 0x0159e624, 0x032eddc9, 0x028bff60, 0x0082d6d6, 0x0031657e}}}, + {X: Field{[10]uint32{0x00d3ce1e, 0x020a7978, 0x02425761, 0x00862e1c, 0x03c55595, 0x005c2ed1, 0x01cfe6e5, 0x02d321c7, 0x0371808f, 0x0015b0b5}}, Y: Field{[10]uint32{0x000468ba, 0x003f27d5, 0x0229f5ee, 0x02bdc58d, 0x0112ec15, 0x039c8718, 0x00a91889, 0x03989bf7, 0x02e69e03, 0x001b79ca}}}, + {X: Field{[10]uint32{0x0109d663, 0x028d99d4, 0x00fb5066, 0x03fbf181, 0x02da9ecf, 0x03033df4, 0x0296d8c3, 0x016f961e, 0x0305ec9f, 0x00080862}}, Y: Field{[10]uint32{0x038f6993, 0x00a0eefb, 0x02e12e79, 0x00ea22d0, 0x02b41bfa, 0x029cc86b, 0x02ea0aa7, 0x01f8907c, 0x03c2c535, 0x000bb069}}}, + {X: Field{[10]uint32{0x036be4ee, 0x03f2bfe5, 0x00f09e2a, 0x03d2ece9, 0x03519035, 0x01252bfc, 0x03db4f33, 0x0333656f, 0x02690a04, 0x000e8224}}, Y: Field{[10]uint32{0x0042d1a2, 0x006b615a, 0x02757ed9, 0x00899036, 0x020bbeba, 0x00d012cc, 0x0293757b, 0x0287fa45, 0x0225fb0b, 0x00395a03}}}, + {X: Field{[10]uint32{0x005b3f07, 0x01948ebd, 0x01a2e285, 0x0006ca5d, 0x02dfd3e1, 0x02618125, 0x00fd0f25, 0x022d4f6c, 0x0296a0cd, 0x0023e7c8}}, Y: Field{[10]uint32{0x01c625b5, 0x02d5c8ad, 0x01920a3f, 0x00295de1, 0x038ab3be, 0x018a435d, 0x029015cd, 0x037cc6c8, 0x01072cac, 0x00187056}}}, + {X: Field{[10]uint32{0x0288070e, 0x03d1d33f, 0x0106c836, 0x024347a8, 0x00097e2b, 0x0352d8ca, 0x01599b26, 0x036a5f34, 0x03e8695b, 0x00219602}}, Y: Field{[10]uint32{0x017d7d21, 0x03146aec, 0x00ac6166, 0x02a276e9, 0x022bb220, 0x001f71fb, 0x022fe5fd, 0x02b160e2, 0x00a17e19, 0x002aeb9a}}}, + {X: Field{[10]uint32{0x02b4d762, 0x00b74a5c, 0x03d048c7, 0x0163ec61, 0x01eb1f94, 0x015ea879, 0x005b4f0e, 0x035627b3, 0x038a1e69, 0x003edab0}}, Y: Field{[10]uint32{0x02ac32c1, 0x0004c061, 0x000147fb, 0x01bc2e58, 0x03e5d180, 0x02e0ad72, 0x031d3af2, 0x01c7cc5b, 0x0116bec2, 0x00358077}}}, + {X: Field{[10]uint32{0x02a5f0b0, 0x02e36f9f, 0x027b4242, 0x00c6d9b8, 0x02c5bb7d, 0x00aec273, 0x03aec947, 0x03aa06fc, 0x006bc54f, 0x001f0418}}, Y: Field{[10]uint32{0x01f68f54, 0x035df6ef, 0x010abd14, 0x00a8f809, 0x0202ea52, 0x0102d116, 0x01839872, 0x01590dd9, 0x0180d3d6, 0x00048854}}}, + {X: Field{[10]uint32{0x0152a1a6, 0x00ac05cb, 0x02495204, 0x0398ee11, 0x02740a5b, 0x0367ce12, 0x007822b1, 0x024ef1d3, 0x03948335, 0x002179aa}}, Y: Field{[10]uint32{0x01fae93a, 0x0397af80, 0x030f981f, 0x033371d7, 0x02d6e69f, 0x0334a38f, 0x02512138, 0x03e1aa3d, 0x00d068d6, 0x003d7058}}}, + {X: Field{[10]uint32{0x0351cfe5, 0x0044eb7f, 0x00a27f02, 0x03b2e203, 0x005e626a, 0x0151c7d4, 0x0374ea0e, 0x006e8146, 0x013a99cd, 0x001f878b}}, Y: Field{[10]uint32{0x01ad89bc, 0x012c0267, 0x0299781f, 0x033b0018, 0x02c1eb96, 0x00dbc6b7, 0x02322291, 0x03f8de30, 0x002ee9d4, 0x00104fb2}}}, + {X: Field{[10]uint32{0x007aaacd, 0x03af407a, 0x02bd2928, 0x02b1ca70, 0x016a9490, 0x024c7187, 0x03a08dd6, 0x00d7cbb5, 0x00ad8137, 0x00162590}}, Y: Field{[10]uint32{0x00485429, 0x0009c648, 0x02e15c1a, 0x026f8d0f, 0x017a1e90, 0x025b1335, 0x039fc330, 0x03ed2cd9, 0x010b8a89, 0x002275ac}}}, + {X: Field{[10]uint32{0x026e6608, 0x02b41017, 0x00c5d7b7, 0x03511046, 0x0191fdd7, 0x01d07067, 0x00db0ef3, 0x0173a3f7, 0x034ff346, 0x001c2033}}, Y: Field{[10]uint32{0x022441fe, 0x02b627e3, 0x03d347df, 0x0274d050, 0x00303348, 0x02036c76, 0x006d334f, 0x002e82d7, 0x01a95cbc, 0x001e8fc3}}}, + {X: Field{[10]uint32{0x02917c55, 0x026a1d89, 0x0261c7d5, 0x000d954f, 0x01091deb, 0x01dcdf0c, 0x0196bd4d, 0x0009a4b7, 0x034c2d40, 0x002ed982}}, Y: Field{[10]uint32{0x00983c24, 0x028fd030, 0x002faf5e, 0x00446370, 0x03f150af, 0x017a2e1b, 0x00684031, 0x00125c18, 0x0113a756, 0x002d252b}}}, + {X: Field{[10]uint32{0x03221b27, 0x03141b67, 0x02e0c1e2, 0x02c23376, 0x013f4f4f, 0x03629719, 0x008161c5, 0x0056c910, 0x01ec7ebf, 0x001ce890}}, Y: Field{[10]uint32{0x0063640a, 0x02f05d75, 0x0332b5e1, 0x024a8bdb, 0x0364bbe1, 0x03520363, 0x00865041, 0x0295bde1, 0x03b433a0, 0x002014d2}}}, + {X: Field{[10]uint32{0x00b1fe07, 0x0056aa9e, 0x03a6f89a, 0x000b0f5e, 0x039e45f2, 0x028ad62f, 0x005741e6, 0x03f6f1dc, 0x0351f08b, 0x003f707b}}, Y: Field{[10]uint32{0x016c0586, 0x039683a6, 0x00e36880, 0x0051d57d, 0x001684f7, 0x0160c950, 0x03ac05b5, 0x0121e191, 0x00dcdc1e, 0x001fa740}}}, + {X: Field{[10]uint32{0x033618af, 0x01ccf4e8, 0x007bc6d6, 0x00ea449a, 0x03a15ab1, 0x02838cf7, 0x0344736e, 0x017304ea, 0x02cba0ce, 0x00081210}}, Y: Field{[10]uint32{0x016bd521, 0x03e4ab32, 0x03a35896, 0x03708516, 0x029e1804, 0x0062a53c, 0x01187418, 0x02472feb, 0x0205a6e9, 0x002bf248}}}, + {X: Field{[10]uint32{0x017ed768, 0x02f2d805, 0x0193e0b2, 0x02660eeb, 0x01a47c4a, 0x00121a1a, 0x00095675, 0x00c54604, 0x001ef82c, 0x00280ea7}}, Y: Field{[10]uint32{0x02090a65, 0x033c67fd, 0x0263ca26, 0x028b7361, 0x0302158b, 0x02690ee2, 0x033e5eed, 0x01a603bb, 0x0164fb9c, 0x001e1be4}}}, + {X: Field{[10]uint32{0x03c00ed2, 0x026c56f6, 0x025baee1, 0x010b1515, 0x01fa18bd, 0x036a04f3, 0x015e3ff7, 0x005e118d, 0x025f6cb4, 0x00178edb}}, Y: Field{[10]uint32{0x02ee603f, 0x0000db10, 0x02cfde34, 0x022b1722, 0x019d6f35, 0x0234f936, 0x03b8f9f8, 0x008a13f0, 0x015342bf, 0x002e70e9}}}, + {X: Field{[10]uint32{0x005dbc70, 0x010e1728, 0x0254b015, 0x01d840a6, 0x00abf764, 0x03ec9d1b, 0x03dfbd6e, 0x004a0198, 0x020e082d, 0x00066c25}}, Y: Field{[10]uint32{0x01504773, 0x01993d39, 0x02f312d2, 0x03b64845, 0x0133df5d, 0x00d74107, 0x03356451, 0x004aa517, 0x03bc4401, 0x003e2ca2}}}, + {X: Field{[10]uint32{0x03f3677e, 0x01d98e37, 0x00d05098, 0x0076dafa, 0x006f1c2d, 0x028688b3, 0x039b274b, 0x02ebf9d2, 0x01007597, 0x0004187a}}, Y: Field{[10]uint32{0x01444b21, 0x0171e048, 0x00fa9815, 0x03c533d3, 0x01fe2fff, 0x03894629, 0x017b59eb, 0x024bb113, 0x0122dec5, 0x001c1eb2}}}, + {X: Field{[10]uint32{0x03030b85, 0x01c73c7c, 0x01f5709a, 0x0078ec55, 0x01cc0e22, 0x02683940, 0x039b5676, 0x01f61d50, 0x001160fc, 0x00324613}}, Y: Field{[10]uint32{0x00327805, 0x00fa608a, 0x02e308c4, 0x02527ec7, 0x018e83e5, 0x017c8e26, 0x01d30f87, 0x01a27f5b, 0x01e37c04, 0x002202da}}}, + {X: Field{[10]uint32{0x0374cf04, 0x01567fd0, 0x02f12d37, 0x0190988a, 0x01c8fa23, 0x01b09ae9, 0x005af94e, 0x014b363f, 0x03044dec, 0x0028d7ec}}, Y: Field{[10]uint32{0x012242fd, 0x035d5704, 0x0284042d, 0x01c614c9, 0x038b3604, 0x00d08b73, 0x03adcb9a, 0x00d612b1, 0x0375692a, 0x0005513c}}}, + {X: Field{[10]uint32{0x010929ca, 0x0012f46e, 0x00a8c1b2, 0x0069e000, 0x021b2c50, 0x02c4c3da, 0x00efbe8e, 0x03afa046, 0x03ad60ff, 0x002ea300}}, Y: Field{[10]uint32{0x03aaafbe, 0x00da71b8, 0x03722f11, 0x011eb84d, 0x0365b88d, 0x03de002a, 0x03732112, 0x010783eb, 0x0329a3f3, 0x003a57bd}}}, + {X: Field{[10]uint32{0x0330ddb9, 0x0346d4a3, 0x03ba3361, 0x017d7992, 0x02fe0849, 0x01268042, 0x03ba189f, 0x0229de5f, 0x0355842d, 0x0034ae95}}, Y: Field{[10]uint32{0x03df7957, 0x00c2fe94, 0x03d477c0, 0x00b0e42d, 0x000549e7, 0x00e95758, 0x00bc5f0c, 0x005e7de1, 0x01b10cad, 0x00368d9a}}}, + {X: Field{[10]uint32{0x008703f2, 0x036e6b9b, 0x0194a086, 0x01e552b2, 0x00d3de15, 0x020332c9, 0x031d2b28, 0x0222c9de, 0x03587ec9, 0x000f813a}}, Y: Field{[10]uint32{0x0328dd9c, 0x0336d3f9, 0x0207bb98, 0x02273170, 0x00ff3c60, 0x037e5bef, 0x031d6503, 0x021767ba, 0x0113e6dc, 0x003e9048}}}, + {X: Field{[10]uint32{0x019fe7f6, 0x0368f09a, 0x01ca17a0, 0x008177e4, 0x0260c9f1, 0x007d19b5, 0x019aefa9, 0x029274f8, 0x03424339, 0x003bf96e}}, Y: Field{[10]uint32{0x005156e9, 0x00fa74c9, 0x0008ff9e, 0x0029f2d1, 0x01e3576b, 0x01f3e7f1, 0x0221db29, 0x01903f3a, 0x012ffb39, 0x00263188}}}, + {X: Field{[10]uint32{0x02a0908b, 0x0359a92e, 0x008a302b, 0x00b6605b, 0x03bca2dc, 0x031383a9, 0x03e65915, 0x00cdb7bb, 0x02e5a330, 0x0028a510}}, Y: Field{[10]uint32{0x02a135e6, 0x0109ea77, 0x023112db, 0x02251199, 0x02dc5e77, 0x029bee79, 0x0374c130, 0x0391f0ed, 0x00297320, 0x00286fe2}}}, + {X: Field{[10]uint32{0x008bb792, 0x022aa23c, 0x013714da, 0x03fe0063, 0x0148e877, 0x0324862c, 0x01f632d1, 0x0097daa4, 0x00ba6f72, 0x001152f3}}, Y: Field{[10]uint32{0x01ec713c, 0x02562dd1, 0x00e3e918, 0x00f681f8, 0x01815775, 0x000ba837, 0x021106b2, 0x00ac0582, 0x01312d53, 0x0036837b}}}, + {X: Field{[10]uint32{0x00c2dca9, 0x0160d337, 0x01fced42, 0x020ba503, 0x00565737, 0x00941501, 0x00631afa, 0x02559b2c, 0x014032c3, 0x0000c58e}}, Y: Field{[10]uint32{0x03cc5fc7, 0x016a36f3, 0x004dd844, 0x017e9555, 0x0267f089, 0x03d359a2, 0x037464c6, 0x02c34691, 0x01c41b15, 0x00063158}}}, + {X: Field{[10]uint32{0x01b07703, 0x03f22112, 0x00a92bc4, 0x00e8ef38, 0x01524089, 0x03f1c4cb, 0x015fcedf, 0x01efc83c, 0x035f53f0, 0x00152d4d}}, Y: Field{[10]uint32{0x01abdee7, 0x0058fb98, 0x026a7b3f, 0x031b59c8, 0x00f5df11, 0x028ba886, 0x02922bdf, 0x01094794, 0x033f0a94, 0x000c6f8a}}}, + {X: Field{[10]uint32{0x0058b3bd, 0x02dfb980, 0x003280d2, 0x03118e7a, 0x00de9033, 0x025368f3, 0x03b9b6a6, 0x03419caf, 0x031b0745, 0x000a0f38}}, Y: Field{[10]uint32{0x00c0245a, 0x00801136, 0x0338ff9d, 0x02a99eaa, 0x010dc1c7, 0x03a074b2, 0x01c24e76, 0x02ed5b8f, 0x00a4d452, 0x003daa52}}}, + {X: Field{[10]uint32{0x00e99967, 0x0059fc84, 0x033e3a60, 0x00c5892e, 0x0148d5f8, 0x0012515e, 0x012419cb, 0x029d51ec, 0x0353117b, 0x002d79d3}}, Y: Field{[10]uint32{0x018dd3e6, 0x0120a01c, 0x01b5e10d, 0x007d33f6, 0x003da833, 0x03ce0c02, 0x03c22e89, 0x03e6aaa0, 0x0354d635, 0x0017d8d5}}}, + {X: Field{[10]uint32{0x03f83080, 0x0159c4f2, 0x031340a8, 0x012c7349, 0x03d587c3, 0x0335476b, 0x00dc776f, 0x00c60c5c, 0x0332cfa3, 0x001a0797}}, Y: Field{[10]uint32{0x0279266a, 0x0106951c, 0x010e38f2, 0x03bfef8e, 0x0276f646, 0x01ff3cc2, 0x00361d9b, 0x039375ed, 0x00b8d144, 0x003161f6}}}, + {X: Field{[10]uint32{0x029f1d0c, 0x01697f40, 0x00621b92, 0x00857fe3, 0x012f28b2, 0x00177d5b, 0x021ec17d, 0x00a27c94, 0x02b7722f, 0x0007ee97}}, Y: Field{[10]uint32{0x0311f5ba, 0x0372fa7a, 0x037d1524, 0x018d6cae, 0x0234283b, 0x032b2d9a, 0x03f287ef, 0x03f537e9, 0x00d997ec, 0x0037c450}}}, + {X: Field{[10]uint32{0x020d0a77, 0x004c029a, 0x00f2031e, 0x01933095, 0x0217855b, 0x00cfc6f3, 0x038fc5a7, 0x022cf3b4, 0x00b0df37, 0x000e2ffd}}, Y: Field{[10]uint32{0x0206b1be, 0x03728719, 0x03dc2520, 0x01979cef, 0x01f35a50, 0x0094dd1d, 0x00485ee3, 0x00a5b993, 0x025df634, 0x001b53c1}}}, + {X: Field{[10]uint32{0x017de831, 0x023dd3b9, 0x015ed6e0, 0x0281df32, 0x03779df8, 0x01ed5e63, 0x00050d52, 0x00992ef9, 0x03c359a9, 0x001c1c04}}, Y: Field{[10]uint32{0x014ea422, 0x032455c0, 0x00c3fda9, 0x029d8cb9, 0x02582313, 0x00f3662b, 0x03b8dcc5, 0x021b0195, 0x01a03153, 0x002e7cde}}}, + {X: Field{[10]uint32{0x01642ef5, 0x028fd8d1, 0x0135a73d, 0x02467799, 0x03fc5b8c, 0x0082416a, 0x010abbb3, 0x00921392, 0x012f7028, 0x002b653b}}, Y: Field{[10]uint32{0x02c88457, 0x01c0b0aa, 0x02bd6cb8, 0x01cdb409, 0x020fdf49, 0x01951485, 0x00011fec, 0x0387cfa6, 0x0013a554, 0x00276fa2}}}, + {X: Field{[10]uint32{0x0362612e, 0x0115613f, 0x001f54f5, 0x021d62e2, 0x00fd174f, 0x0110de17, 0x01ad1552, 0x021da926, 0x01e4e991, 0x0011ed5b}}, Y: Field{[10]uint32{0x00efdced, 0x0356695f, 0x012d986b, 0x03483524, 0x03383d92, 0x03dd4ddd, 0x016117a5, 0x02faddf1, 0x01375855, 0x00028501}}}, + {X: Field{[10]uint32{0x01f431e8, 0x03ded205, 0x036af03c, 0x013433cc, 0x03f31f62, 0x0047ca04, 0x024643af, 0x029a4c7c, 0x024e9291, 0x00146f39}}, Y: Field{[10]uint32{0x0107e552, 0x00eaaebb, 0x02e13a06, 0x01a435d6, 0x03f40c4c, 0x00480e53, 0x0235d284, 0x00891c3b, 0x03d9a301, 0x00023dd0}}}, + {X: Field{[10]uint32{0x03f7a43f, 0x02e550b9, 0x03447a0c, 0x03b80ef1, 0x0083b80b, 0x026d3af8, 0x018e56b4, 0x01683f3a, 0x00feb52c, 0x001d8a1f}}, Y: Field{[10]uint32{0x02a7a7bc, 0x00cfadb8, 0x007ff13e, 0x026f7161, 0x03e9e339, 0x003662c1, 0x01d064a5, 0x0112ef4e, 0x0256fa57, 0x001cdadf}}}, + {X: Field{[10]uint32{0x036b8f5e, 0x02b37037, 0x0155b181, 0x0333c713, 0x028dc29b, 0x006dddc6, 0x011aaa2c, 0x000430c6, 0x039ead01, 0x0018535c}}, Y: Field{[10]uint32{0x002f8085, 0x036d9b43, 0x031664f4, 0x036eabc1, 0x025591ef, 0x00001193, 0x0296c2c5, 0x01eddb22, 0x028fe860, 0x00173353}}}, + {X: Field{[10]uint32{0x024e1bc9, 0x00b4ce97, 0x0380803e, 0x02262598, 0x0035cd58, 0x00354fb4, 0x039404d9, 0x00d7cacc, 0x00c8ee8c, 0x0030e111}}, Y: Field{[10]uint32{0x00cd29f2, 0x02febd9b, 0x03f441f4, 0x02685ae4, 0x031d2ffc, 0x021fea6a, 0x02221092, 0x014baf70, 0x00cdde54, 0x0022d102}}}, + {X: Field{[10]uint32{0x01c8f349, 0x0077dea6, 0x02539239, 0x025cb6ed, 0x0256a1c1, 0x014aff79, 0x019bf028, 0x01bcd760, 0x0249c601, 0x0022a725}}, Y: Field{[10]uint32{0x0369a8ed, 0x03a5d2b5, 0x001afdc6, 0x0168ce46, 0x031797aa, 0x0132d402, 0x00a6030a, 0x0067e9b1, 0x0157be2c, 0x002cb736}}}, + {X: Field{[10]uint32{0x02a04b03, 0x02ccc46f, 0x026bced6, 0x02d0745d, 0x0196292a, 0x0334a35d, 0x010ea0a6, 0x025c2497, 0x011be444, 0x00283d73}}, Y: Field{[10]uint32{0x027ff95b, 0x03e56524, 0x034b868a, 0x00681c73, 0x00c8d793, 0x03912738, 0x0045d923, 0x00a6c338, 0x01e9291b, 0x00349c2c}}}, + {X: Field{[10]uint32{0x033a9614, 0x03530447, 0x03a64709, 0x0372a550, 0x0025c64d, 0x00a38964, 0x03bdbaf0, 0x01661deb, 0x03368767, 0x0029e3c8}}, Y: Field{[10]uint32{0x02a6de83, 0x007c108c, 0x01e7ee24, 0x02690e7d, 0x01de34aa, 0x007d4346, 0x0245b3ab, 0x0116fb94, 0x02c9a5d2, 0x0004d97e}}}, + {X: Field{[10]uint32{0x03391769, 0x03f0f902, 0x03b514a9, 0x00c27b8f, 0x03af6cae, 0x0104e91a, 0x03aa6f5a, 0x00b16e4a, 0x03e3ae48, 0x000eff4d}}, Y: Field{[10]uint32{0x016d1c59, 0x01553c0e, 0x03d66bdc, 0x0019371f, 0x03d0219c, 0x01de3273, 0x02424a07, 0x02c3719b, 0x001834bb, 0x000b64c2}}}, + {X: Field{[10]uint32{0x013881a2, 0x00735c74, 0x00e5d1b4, 0x00f580bb, 0x02d426f2, 0x039e5b4a, 0x036ea757, 0x00748f9d, 0x009a0026, 0x0024b2b1}}, Y: Field{[10]uint32{0x031521c1, 0x02124b95, 0x035dac0d, 0x032061e8, 0x00c7a43a, 0x02303176, 0x023e587a, 0x00df2266, 0x00138e0f, 0x00231dbb}}}, + {X: Field{[10]uint32{0x0356842a, 0x01008502, 0x01d6b829, 0x0379ea5b, 0x03718944, 0x0124d59e, 0x03708941, 0x03719f30, 0x01e00ea7, 0x00033dbb}}, Y: Field{[10]uint32{0x00627cb7, 0x03a343d5, 0x0042ca76, 0x0343d646, 0x020fa070, 0x00f72314, 0x016128a5, 0x01822deb, 0x03d4e939, 0x0038adc5}}}, + {X: Field{[10]uint32{0x0291e17a, 0x006fe0be, 0x0035e3dd, 0x00b44781, 0x00968c8c, 0x02c1b886, 0x02cb92bb, 0x00a5149b, 0x0198ba51, 0x00188132}}, Y: Field{[10]uint32{0x00cd0ea4, 0x0362b765, 0x03939d12, 0x031e6981, 0x03d1ed18, 0x002bca8f, 0x03ae21ef, 0x01972723, 0x015fe783, 0x0005a428}}}, + {X: Field{[10]uint32{0x00c0aa5d, 0x006bff79, 0x03f12ef7, 0x001fc88d, 0x02d8ce07, 0x01ab0b85, 0x0268d13a, 0x000384d4, 0x0348cc55, 0x0028b13e}}, Y: Field{[10]uint32{0x000cd839, 0x03cb5c0f, 0x039509e5, 0x01ea3566, 0x03c403f5, 0x016048ea, 0x03e3906c, 0x03225f2d, 0x000ee608, 0x000e0251}}}, + {X: Field{[10]uint32{0x03656f60, 0x01e1cf7a, 0x024f2b66, 0x03135cc8, 0x016acc8e, 0x00ecb8c2, 0x01a36a6d, 0x00f92f17, 0x03a1cc30, 0x00362bdf}}, Y: Field{[10]uint32{0x00c6de0d, 0x0333fffc, 0x02e5ddd4, 0x006e7b7a, 0x015e14d8, 0x00116c4d, 0x03b39f97, 0x00cf1437, 0x02bd5a55, 0x0027f1fc}}}, + {X: Field{[10]uint32{0x02dea0e7, 0x035dd75d, 0x0390a864, 0x00fb476b, 0x01377073, 0x0014c12f, 0x00e6bbdb, 0x00a46981, 0x00adb873, 0x000fa680}}, Y: Field{[10]uint32{0x0101ded0, 0x023bad02, 0x0063051f, 0x026cc86d, 0x0320a5cb, 0x0066a35d, 0x0124e37f, 0x0313bd4d, 0x0057f6d1, 0x0037ad25}}}, + {X: Field{[10]uint32{0x03dc3d7f, 0x03943974, 0x0136809d, 0x0357a862, 0x01760ca8, 0x0306cab2, 0x014346aa, 0x01883261, 0x02e930aa, 0x0002fbd6}}, Y: Field{[10]uint32{0x00dfc48f, 0x037eb592, 0x03034c0f, 0x028ff8dc, 0x0105da98, 0x03501079, 0x0212b9c7, 0x017d66c0, 0x0042f792, 0x00083603}}}, + {X: Field{[10]uint32{0x0155f67f, 0x00ad2424, 0x0035d592, 0x011e2229, 0x0238215e, 0x03ce5916, 0x01743088, 0x03541db0, 0x01fbcd28, 0x0033505a}}, Y: Field{[10]uint32{0x01e74674, 0x030bc98d, 0x025b929d, 0x03192d6a, 0x00a170da, 0x015b06da, 0x025f2743, 0x01937569, 0x00a21a55, 0x003e798b}}}, + {X: Field{[10]uint32{0x015a4c28, 0x02d810bb, 0x0121d538, 0x004533ce, 0x014bd37b, 0x025f5db3, 0x01a25047, 0x009893f7, 0x01ed34cd, 0x00292da4}}, Y: Field{[10]uint32{0x026af55d, 0x01b08174, 0x02d12c33, 0x01ddcb1c, 0x025c045a, 0x00f8ce5f, 0x030ca545, 0x02d30456, 0x00b16781, 0x003194dd}}}, + {X: Field{[10]uint32{0x00aa4818, 0x01576f62, 0x0047dc9e, 0x0056fe7a, 0x03c2b3a6, 0x02a14303, 0x03cf68fa, 0x02de2065, 0x016a4226, 0x001793a4}}, Y: Field{[10]uint32{0x0398951e, 0x02128c6d, 0x032808d9, 0x0014fac9, 0x03f3395d, 0x0193d2cb, 0x01991f44, 0x014b9972, 0x02a25c7c, 0x000fcf0f}}}, + {X: Field{[10]uint32{0x03a74a7c, 0x011d357a, 0x0105ca5f, 0x02e88653, 0x01f743e6, 0x00293180, 0x011b3ad5, 0x027dcb25, 0x02cff4d6, 0x003751e0}}, Y: Field{[10]uint32{0x00977b99, 0x0304b208, 0x0281d6c7, 0x0247536c, 0x0205d3a7, 0x018a3630, 0x03dd6ae8, 0x03bdf178, 0x035e9854, 0x0025e9ee}}}, + {X: Field{[10]uint32{0x01adce36, 0x02026470, 0x02f0bcc0, 0x01044f92, 0x00281aff, 0x019a701f, 0x03945432, 0x0017b376, 0x02d54ab4, 0x002854c2}}, Y: Field{[10]uint32{0x0263e756, 0x01125612, 0x0168a774, 0x02dbf6ee, 0x01b18550, 0x038aa96c, 0x01dda781, 0x0210b977, 0x02212732, 0x003cf494}}}, + {X: Field{[10]uint32{0x0264719e, 0x035db2a7, 0x013234a2, 0x00cab639, 0x03e5ee0d, 0x00cabd92, 0x014523f2, 0x0393c018, 0x02f7b438, 0x00146493}}, Y: Field{[10]uint32{0x028a8095, 0x01631dc4, 0x00176268, 0x01563ab6, 0x03fdfe6e, 0x02d912fe, 0x036e82b8, 0x0136d59c, 0x01a811f9, 0x0021f045}}}, + {X: Field{[10]uint32{0x03fada6e, 0x03555a14, 0x03563a3b, 0x01701ae5, 0x016ac905, 0x03882a75, 0x03625d4b, 0x0361d041, 0x0268e137, 0x0020b3fb}}, Y: Field{[10]uint32{0x00733b7a, 0x019e61cc, 0x01cc06ff, 0x01e140a9, 0x02a363e9, 0x037b9e9c, 0x02804d76, 0x031471ca, 0x0246c4f5, 0x0037526a}}}, + {X: Field{[10]uint32{0x032e623a, 0x03f5f957, 0x03f30a4e, 0x03f4b30e, 0x02e02b70, 0x00db1f69, 0x021346b0, 0x03bd1016, 0x0076f7f1, 0x0028dce2}}, Y: Field{[10]uint32{0x0204a21a, 0x0365847a, 0x02edf368, 0x00d9606c, 0x02b1204d, 0x01200cc6, 0x00de46e5, 0x014acaf8, 0x012be1ea, 0x001965bd}}}, + {X: Field{[10]uint32{0x0180bcbc, 0x000d960a, 0x01d7dd82, 0x02cc62c3, 0x028d8382, 0x00b33c92, 0x0224fd6b, 0x00635cad, 0x02f7aec8, 0x002b9329}}, Y: Field{[10]uint32{0x018f1ae2, 0x02325eb7, 0x015e9237, 0x02586aa6, 0x03348155, 0x015322ee, 0x02a29f25, 0x01f15c78, 0x020335ad, 0x001a9eb6}}}, + {X: Field{[10]uint32{0x01d12732, 0x03df7ea2, 0x006b1400, 0x0250b614, 0x004d6ac8, 0x03732e72, 0x018d1984, 0x01d8be6c, 0x022bfa9d, 0x002f8cd5}}, Y: Field{[10]uint32{0x0075d442, 0x034b9ba5, 0x008fe473, 0x015a40c1, 0x01c4f5c9, 0x013a1d29, 0x0336cc21, 0x019a9cd4, 0x03b877c6, 0x002d99bb}}}, + {X: Field{[10]uint32{0x03c74446, 0x02e4b68d, 0x01ecf37c, 0x007c1711, 0x03f38289, 0x02983fda, 0x003b2888, 0x00f6e14c, 0x02d9815b, 0x00275f69}}, Y: Field{[10]uint32{0x015b12a8, 0x00ada35d, 0x001ac540, 0x003627f3, 0x00df3d2c, 0x02d04f51, 0x01f6d734, 0x016f8398, 0x007372ba, 0x0011b0a4}}}, + {X: Field{[10]uint32{0x030d4d3f, 0x02a77d0e, 0x02366b62, 0x03edf266, 0x020b5981, 0x02edecef, 0x02028498, 0x030af301, 0x0131e513, 0x000e48cf}}, Y: Field{[10]uint32{0x0116dfd8, 0x038e136e, 0x03c81f97, 0x012ea6bf, 0x001ec57d, 0x0187e9dd, 0x00ac3e1c, 0x03a93d36, 0x017c92e0, 0x003f09e1}}}, + {X: Field{[10]uint32{0x037768be, 0x039450f6, 0x004b43f7, 0x00cea0b6, 0x02547e6f, 0x02d63d06, 0x00d02dd7, 0x03a0ec16, 0x0388db90, 0x0016f8b5}}, Y: Field{[10]uint32{0x03de1026, 0x0127cbdb, 0x00875b90, 0x01ae6899, 0x03d585ef, 0x0213edb3, 0x01396f2e, 0x03e8cf9c, 0x03a86b2d, 0x0002e33c}}}, + {X: Field{[10]uint32{0x00f162ac, 0x01e187a2, 0x035d682f, 0x02f8e09f, 0x027c53a0, 0x01c011e7, 0x03600c25, 0x02853044, 0x01e8191f, 0x000ffd67}}, Y: Field{[10]uint32{0x01c77ba2, 0x01730c8b, 0x024dfd81, 0x03ed79e6, 0x0308ae4e, 0x009e6847, 0x03f5f60c, 0x02db9efb, 0x01856ab0, 0x00009756}}}, + {X: Field{[10]uint32{0x019a256f, 0x01d6f05c, 0x01b5875f, 0x029398c1, 0x00b61a18, 0x02803e36, 0x02d9475d, 0x00648262, 0x0030ed22, 0x00207727}}, Y: Field{[10]uint32{0x014682a5, 0x01e34a3d, 0x03fc2ca6, 0x00913503, 0x009cccf0, 0x01a6897e, 0x038f9c98, 0x032c9e9b, 0x005e5c44, 0x000a5c1d}}}, + {X: Field{[10]uint32{0x0370e9da, 0x0168f926, 0x00d24f76, 0x010eedea, 0x02ea3869, 0x00c353d2, 0x036121b2, 0x01026455, 0x0216579c, 0x002e8f87}}, Y: Field{[10]uint32{0x02c72f4e, 0x02088d8c, 0x02abd90f, 0x039956ae, 0x0154eb0d, 0x034c39ec, 0x01d8d9c7, 0x03e99e2a, 0x0008653c, 0x00287bae}}}, + {X: Field{[10]uint32{0x03f854f8, 0x02271220, 0x0304ca05, 0x0250ee5b, 0x01fa66d1, 0x02df479a, 0x01f52a51, 0x02bb8450, 0x028150fa, 0x0000d7ff}}, Y: Field{[10]uint32{0x01366fad, 0x03422a32, 0x00dc9b7d, 0x018c181c, 0x00b4ad31, 0x03c44170, 0x00a09b8d, 0x01b74ff3, 0x0022e83f, 0x00359a86}}}, + {X: Field{[10]uint32{0x00763a06, 0x0142ab58, 0x00f685b9, 0x038f95c9, 0x038b50d7, 0x00e2e605, 0x0214c0ae, 0x03e5c870, 0x00221435, 0x000e63af}}, Y: Field{[10]uint32{0x00811f46, 0x016e0120, 0x03011682, 0x021c5240, 0x0115551b, 0x030b233a, 0x00d4da7f, 0x03baaff3, 0x009d0eb2, 0x0030b7d5}}}, + {X: Field{[10]uint32{0x00a89e96, 0x0284e243, 0x01a0d6cf, 0x00aa913f, 0x029ca89d, 0x01397387, 0x018511a8, 0x029d7474, 0x0333e7d0, 0x000ae89f}}, Y: Field{[10]uint32{0x017cf4a7, 0x02d98ae6, 0x02f19c6b, 0x0153f304, 0x0045c2ac, 0x02472845, 0x039946cc, 0x01d70e3c, 0x004b8323, 0x001408da}}}, + {X: Field{[10]uint32{0x01e829c2, 0x034547be, 0x0014465c, 0x00fbc7fc, 0x032b5497, 0x014c60ba, 0x02cd4856, 0x007e4813, 0x023e7ec5, 0x001095c1}}, Y: Field{[10]uint32{0x01232c1c, 0x01518ad5, 0x015d747c, 0x016a04ab, 0x00919f8b, 0x01a6af59, 0x009ab35b, 0x00145447, 0x034116dd, 0x0011cd47}}}, + {X: Field{[10]uint32{0x034063a8, 0x03c5cb66, 0x006ebe3e, 0x025623b9, 0x0180da81, 0x00b95946, 0x0218582d, 0x03295a50, 0x03c1b5b3, 0x001df9cd}}, Y: Field{[10]uint32{0x01d1587a, 0x038830a2, 0x007b50e0, 0x017135ec, 0x03651ae4, 0x032e44b8, 0x008d4f11, 0x0262b4df, 0x01c5e667, 0x0003df2d}}}, + {X: Field{[10]uint32{0x00cdaa4f, 0x03bb1e8d, 0x028c44a7, 0x010d1ed7, 0x01ef027d, 0x02932dcb, 0x02f98b82, 0x02307ef7, 0x024d7101, 0x0037f2ed}}, Y: Field{[10]uint32{0x03972a23, 0x02c31765, 0x01a92e06, 0x0160b72a, 0x01bc2f4e, 0x014713c2, 0x03379e87, 0x01d6222b, 0x01bcc720, 0x0037f033}}}, + {X: Field{[10]uint32{0x0355ae8a, 0x0258ab74, 0x00e78ce6, 0x0388a94b, 0x01b39855, 0x011b5c62, 0x02c52567, 0x007a38ca, 0x02d0a787, 0x0023ada1}}, Y: Field{[10]uint32{0x00cc30da, 0x038cc71b, 0x02a5ed71, 0x01d5ba29, 0x0389b796, 0x0308b17e, 0x00afe424, 0x00a0dff4, 0x0211fec5, 0x003aa2cd}}}, + {X: Field{[10]uint32{0x02cc3e54, 0x025ac74d, 0x0298785a, 0x00b6fa9e, 0x02ee5652, 0x0313083f, 0x02703ff8, 0x00b754c5, 0x0313ebaf, 0x00345f61}}, Y: Field{[10]uint32{0x01c10b54, 0x007616f7, 0x038b5682, 0x01c9391b, 0x00e9fdb8, 0x03e25074, 0x00a7a19b, 0x018b2a76, 0x03e86d78, 0x003a9c2d}}}, + {X: Field{[10]uint32{0x00b3ba89, 0x000df88c, 0x02cfa3ec, 0x007e0b35, 0x02249c47, 0x0053bbb6, 0x02d28e9c, 0x00287215, 0x03e6ae05, 0x001f531d}}, Y: Field{[10]uint32{0x0265fe60, 0x01cffa58, 0x027bcea7, 0x0230f686, 0x01900ad6, 0x009f440b, 0x0180f393, 0x037e4d2c, 0x0253f5fb, 0x0031681d}}}, + {X: Field{[10]uint32{0x017ebcab, 0x014306d3, 0x01e88f4f, 0x03b4378e, 0x003721dc, 0x02c942f3, 0x021d51b3, 0x0179a1b5, 0x0109451e, 0x00258e04}}, Y: Field{[10]uint32{0x00801b64, 0x01745959, 0x003947f1, 0x00529c8a, 0x0209f065, 0x035bc3f9, 0x017642bd, 0x032951fc, 0x0019b088, 0x0025263d}}}, + {X: Field{[10]uint32{0x038c2ba7, 0x02be42a5, 0x00d208af, 0x020ff68f, 0x0385f44e, 0x023d3a54, 0x02da8f2f, 0x00f5cdec, 0x01505435, 0x001d002d}}, Y: Field{[10]uint32{0x01909771, 0x022ab9ff, 0x008be6b1, 0x00749d41, 0x02e36bed, 0x036c7572, 0x0129a04c, 0x00d9df88, 0x00a3ce50, 0x00264ceb}}}, + {X: Field{[10]uint32{0x026ff59f, 0x00792e81, 0x01be2a01, 0x030e4ed4, 0x00d1de3b, 0x03c4baf6, 0x02f59639, 0x02ff49c7, 0x0011fff7, 0x000f5ec3}}, Y: Field{[10]uint32{0x02404b9d, 0x007133cc, 0x01789b79, 0x00bdd51a, 0x008bddb1, 0x02a21851, 0x01eb57d8, 0x02839738, 0x00317f7c, 0x002d8e5d}}}, + {X: Field{[10]uint32{0x01c46328, 0x01bd33d9, 0x0343c5cd, 0x0377f78d, 0x0245d128, 0x03237665, 0x03125455, 0x01fc5398, 0x01ec7ebf, 0x00125136}}, Y: Field{[10]uint32{0x00589996, 0x009c6fcb, 0x01d1f5bf, 0x036449b2, 0x035c2f49, 0x02747cf4, 0x01cd408c, 0x02bb04ca, 0x019313ba, 0x003c1954}}}, + {X: Field{[10]uint32{0x01bdecf1, 0x0391b49e, 0x00b5189c, 0x00cda6eb, 0x01f37b99, 0x03822cd5, 0x0207d6d8, 0x02c743e1, 0x032b4764, 0x00265810}}, Y: Field{[10]uint32{0x03160ebd, 0x02b15ac1, 0x0386578f, 0x03e37aea, 0x03f7e1a9, 0x030852b7, 0x0200ea9e, 0x034be8a4, 0x034c0921, 0x000c13ae}}}, + {X: Field{[10]uint32{0x033de4d6, 0x0212a8ee, 0x0281d9ca, 0x01658cc5, 0x019196cc, 0x009ad77b, 0x03409cc7, 0x015963f0, 0x035b6358, 0x000c4fd4}}, Y: Field{[10]uint32{0x016c9716, 0x01024bf1, 0x01fb3dd6, 0x03fe3266, 0x0159b049, 0x0007fd3c, 0x0323bcfd, 0x0383af97, 0x008aa55f, 0x00394469}}}, + {X: Field{[10]uint32{0x008ed7b2, 0x03c0d315, 0x01bcb3cc, 0x03597004, 0x00c99478, 0x03d3dd3b, 0x01b9006e, 0x01b7036e, 0x006f8cd3, 0x00217116}}, Y: Field{[10]uint32{0x03434229, 0x02d34416, 0x01f63a75, 0x01699d8e, 0x00144c8c, 0x03e6c01c, 0x02325923, 0x0175b371, 0x03c0045c, 0x00335a54}}}, + {X: Field{[10]uint32{0x00671af8, 0x01c1be65, 0x0251d21d, 0x0036d935, 0x03d489b2, 0x01ce07ba, 0x01b668db, 0x00d6747b, 0x02d2a7fc, 0x0025a2f1}}, Y: Field{[10]uint32{0x00725186, 0x02f6df3c, 0x033ce0d0, 0x03f02d4b, 0x02de88bc, 0x0396545f, 0x032f3304, 0x01c1f306, 0x02a3723d, 0x003ec2b5}}}, + {X: Field{[10]uint32{0x0328985d, 0x023158ef, 0x024200e5, 0x03373fda, 0x0326d343, 0x01bb03a1, 0x00c72215, 0x039dfb9b, 0x00eb3722, 0x0008c96b}}, Y: Field{[10]uint32{0x038d39e1, 0x03323fe1, 0x03a5a21a, 0x03f7a06e, 0x0019b9c8, 0x03cfa7bb, 0x02596836, 0x0165e3ca, 0x0353dd29, 0x0018069f}}}, + {X: Field{[10]uint32{0x03acd2e4, 0x001ff759, 0x01dff054, 0x00d61f0c, 0x024b1c93, 0x02abcca9, 0x00667f99, 0x00efab70, 0x02abb231, 0x00231b9d}}, Y: Field{[10]uint32{0x0250c29f, 0x01444b47, 0x02a46b3f, 0x00b8d036, 0x023d7bb9, 0x00a6ce43, 0x03b19c42, 0x037ceb24, 0x0050d422, 0x0009f8ee}}}, + {X: Field{[10]uint32{0x0236748f, 0x03508c17, 0x037af9d8, 0x02a22e60, 0x000352e7, 0x0354e285, 0x02b2c728, 0x0234f935, 0x02313446, 0x0038c7fb}}, Y: Field{[10]uint32{0x010309be, 0x02686c9b, 0x00139e41, 0x00f8a035, 0x0237f9df, 0x02684078, 0x03974f6b, 0x0123e24d, 0x02e12d19, 0x00226c25}}}, + {X: Field{[10]uint32{0x00d306c6, 0x0305f52c, 0x02981215, 0x02c19eb8, 0x00da748a, 0x03968ce6, 0x0342fdd7, 0x0012d1f1, 0x006e8494, 0x00165ad6}}, Y: Field{[10]uint32{0x02a0a16b, 0x03863e18, 0x02791ff6, 0x0180acb3, 0x012ac277, 0x036b7c86, 0x00e8f05e, 0x031c4579, 0x00c5912c, 0x003a5b17}}}, + {X: Field{[10]uint32{0x01aa1c02, 0x01492185, 0x03317714, 0x028e0c4f, 0x03d453d5, 0x006549c3, 0x019c3b71, 0x00032e86, 0x01675cf5, 0x00080330}}, Y: Field{[10]uint32{0x0320ce61, 0x01e73d54, 0x024b3e7b, 0x013b05f7, 0x011905e2, 0x024900dc, 0x005c1334, 0x010a7191, 0x00c87e34, 0x001e02ab}}}, + {X: Field{[10]uint32{0x02d2025f, 0x017a774a, 0x01767dfb, 0x01be04cc, 0x0370f0e9, 0x01e93c91, 0x01148f87, 0x007f3c1e, 0x0032e10e, 0x001f9355}}, Y: Field{[10]uint32{0x03aa432a, 0x02d49458, 0x0136eec0, 0x03284f8c, 0x01fa58f0, 0x0105e60b, 0x03f5fd7d, 0x00a0dfcd, 0x03b26ee8, 0x000d7d76}}}, + {X: Field{[10]uint32{0x000237b7, 0x02edef67, 0x030e5776, 0x01e4d4a1, 0x00ff21f8, 0x01bac430, 0x038f800b, 0x01f9b9e9, 0x010895c9, 0x00307b5d}}, Y: Field{[10]uint32{0x03418fb9, 0x005063fa, 0x01bb1d8b, 0x02565c82, 0x01a38e80, 0x013ffb0f, 0x031e89f6, 0x02aa2670, 0x02068dc0, 0x00241c8e}}}, + {X: Field{[10]uint32{0x02104770, 0x0339cc2c, 0x018defc7, 0x02b9a55b, 0x029948dd, 0x00576374, 0x01239b2a, 0x02027e0f, 0x02e8a53e, 0x00397f52}}, Y: Field{[10]uint32{0x031c4fa2, 0x00bc37bd, 0x0112ade0, 0x03d77d30, 0x03050c7b, 0x017cb76e, 0x00e8ebd3, 0x00865c82, 0x029c1cbb, 0x001a9376}}}, + {X: Field{[10]uint32{0x0251f30d, 0x01bab076, 0x03f2ca76, 0x0057d9cc, 0x03e3534d, 0x00be7b3b, 0x0372cdb4, 0x02f621ea, 0x01f24b33, 0x0000f39d}}, Y: Field{[10]uint32{0x02838ed7, 0x03c132c6, 0x0136213b, 0x02334f72, 0x01a43eb4, 0x00a2bd56, 0x00e9b5d8, 0x03db898b, 0x015b51dd, 0x0027b68c}}}, + {X: Field{[10]uint32{0x0013391c, 0x033bcee2, 0x01d34ad8, 0x02a23867, 0x00527fb9, 0x01fb7d66, 0x018d8ce7, 0x00735392, 0x004f33a8, 0x00263013}}, Y: Field{[10]uint32{0x038bd3a7, 0x03c185ff, 0x01949483, 0x00ea3fc8, 0x03acb484, 0x00158255, 0x0371c463, 0x03e04bd0, 0x0167f853, 0x003f4af3}}}, + {X: Field{[10]uint32{0x0287bbf3, 0x02281e42, 0x001b10fc, 0x00a1b905, 0x01f3d2dd, 0x004f390f, 0x00e62f84, 0x032c1b2f, 0x00882906, 0x000143a7}}, Y: Field{[10]uint32{0x002fa3fb, 0x01890f36, 0x00a9ce1c, 0x0168bcf2, 0x02479a61, 0x028111d2, 0x01eefb2b, 0x006731a1, 0x013bb05f, 0x00010f1c}}}, + {X: Field{[10]uint32{0x03adf2d1, 0x022a0c50, 0x023a2eeb, 0x0190a9cf, 0x0071bf65, 0x03c86ddb, 0x00faa663, 0x0378ec19, 0x0217458b, 0x0017506e}}, Y: Field{[10]uint32{0x03b6cec5, 0x031117d5, 0x0351087c, 0x029da1d8, 0x0307f64f, 0x01eac163, 0x039e22b0, 0x008564ac, 0x0054b308, 0x0005fbff}}}, + {X: Field{[10]uint32{0x00d5b077, 0x00e3e749, 0x023e789d, 0x018191bf, 0x026b34cc, 0x0364b81d, 0x003cb8e1, 0x0164edba, 0x00bf2a02, 0x00138ccb}}, Y: Field{[10]uint32{0x039e1f95, 0x00aa1679, 0x01955c8b, 0x00f77b34, 0x01744ad0, 0x0278e478, 0x03699859, 0x000c0256, 0x005c3ab9, 0x00143e9d}}}, + {X: Field{[10]uint32{0x01a2dae9, 0x005baecd, 0x013f8347, 0x01f3776d, 0x03c83cd4, 0x00d04141, 0x017455e4, 0x02096f0d, 0x029d27ee, 0x0006efd8}}, Y: Field{[10]uint32{0x01e9bb75, 0x03ea250f, 0x0370971f, 0x01a58074, 0x018fb72f, 0x002f6179, 0x000070ec, 0x014fcd3d, 0x00c1e997, 0x00214242}}}, + {X: Field{[10]uint32{0x01cde650, 0x03d6c06d, 0x01b8aa25, 0x026f71e7, 0x0023aece, 0x03af72cc, 0x00cb3f5d, 0x0358aab4, 0x02eff9db, 0x002a4526}}, Y: Field{[10]uint32{0x00c327bd, 0x03c2fdad, 0x01a79918, 0x02318766, 0x02ae3c14, 0x037da1b5, 0x00a16d09, 0x00447d1a, 0x0346e6db, 0x0029eed2}}}, + {X: Field{[10]uint32{0x01b72a71, 0x0385c87f, 0x0037ffc5, 0x0375d7e0, 0x03b98ffc, 0x02c876b2, 0x01e5b406, 0x03590867, 0x01ee0185, 0x00200402}}, Y: Field{[10]uint32{0x03e26441, 0x00b96bcd, 0x010f2daf, 0x00162619, 0x01382839, 0x01171d7c, 0x0136f706, 0x02b5b077, 0x020957c7, 0x003a0859}}}, + {X: Field{[10]uint32{0x00ba6770, 0x01a2a1b0, 0x0068ab73, 0x00e4e401, 0x0096c6b6, 0x01bc4cbb, 0x02345846, 0x03d9e82c, 0x019ae466, 0x00301c3a}}, Y: Field{[10]uint32{0x00769362, 0x01124154, 0x00171a15, 0x033e703c, 0x03be6f8f, 0x02ca47ff, 0x016f77e3, 0x013d5a29, 0x03df358d, 0x00220fea}}}, + {X: Field{[10]uint32{0x00109f4a, 0x017fc7d5, 0x039da71c, 0x014c77fd, 0x018e028c, 0x0342be68, 0x03549a9e, 0x009d85e3, 0x0239cf61, 0x001afa25}}, Y: Field{[10]uint32{0x0204cf14, 0x017f6ce5, 0x02e0d821, 0x03c5b5d9, 0x00ff2dd6, 0x03e65c31, 0x0292f38f, 0x0244c49a, 0x017ddd37, 0x001ddebb}}}, + {X: Field{[10]uint32{0x0224ce8c, 0x016bf165, 0x01009219, 0x0014ae76, 0x03100945, 0x036ec6a1, 0x0052e796, 0x00792808, 0x01d41ce7, 0x00347f4c}}, Y: Field{[10]uint32{0x013fded1, 0x00425249, 0x01a2e5b5, 0x02aba8af, 0x0136d5f2, 0x02183979, 0x02796d91, 0x000a77aa, 0x03d378a8, 0x003cd5ea}}}, + {X: Field{[10]uint32{0x03169d9e, 0x0351a6e3, 0x010337ae, 0x022bab66, 0x02614c32, 0x02909a65, 0x01e617c0, 0x03c52cf3, 0x002d66fe, 0x0007214e}}, Y: Field{[10]uint32{0x038a71f9, 0x02257bc1, 0x01113a8f, 0x0137f6fe, 0x01e2406a, 0x01c9f669, 0x018702ab, 0x039aa13d, 0x031cb236, 0x0016316b}}}, + {X: Field{[10]uint32{0x0336b5ea, 0x03b7f653, 0x0212e272, 0x02dd0f2e, 0x03eec32c, 0x0304a2b5, 0x025c2d52, 0x019edd0b, 0x01edd5fd, 0x000b63ea}}, Y: Field{[10]uint32{0x032cd37d, 0x026b4763, 0x0331f0aa, 0x0103de01, 0x02231453, 0x0325930c, 0x0133af4b, 0x00a827e5, 0x033937eb, 0x001c6c57}}}, + {X: Field{[10]uint32{0x03dbafb4, 0x00e048b7, 0x00c954c5, 0x031a1c0c, 0x0240ceb1, 0x014376f7, 0x00d0a159, 0x031659c0, 0x0379d9f6, 0x0013d448}}, Y: Field{[10]uint32{0x0248c05b, 0x01f020d0, 0x01674c7f, 0x03ef80e0, 0x034b320a, 0x01f76159, 0x0061980c, 0x037d7aea, 0x0305f864, 0x001537a6}}}, + {X: Field{[10]uint32{0x01e7cd1c, 0x02348b36, 0x02834016, 0x0173b64f, 0x032c6999, 0x0350fb28, 0x02609496, 0x00b08563, 0x01ba4856, 0x002697e4}}, Y: Field{[10]uint32{0x0322b86b, 0x0034aa6d, 0x036382d4, 0x00fb84bd, 0x0129bfa3, 0x02b3e714, 0x01b11266, 0x03b28b80, 0x03ecc668, 0x0027e228}}}, + {X: Field{[10]uint32{0x02f9f610, 0x01df7614, 0x03cf0065, 0x03f83563, 0x01d84d54, 0x020cedd7, 0x00cc6b6e, 0x03eb9313, 0x0102d417, 0x003768c1}}, Y: Field{[10]uint32{0x015469a1, 0x036ff045, 0x02b0c5d4, 0x01e9b1fe, 0x0207f4c5, 0x000b8a90, 0x005468d1, 0x019079b5, 0x01da2e74, 0x003eee23}}}, + {X: Field{[10]uint32{0x0326e117, 0x036978d6, 0x025e8e88, 0x02c58635, 0x000600df, 0x00c7397d, 0x00e50cc6, 0x00507612, 0x027c5586, 0x00234ba7}}, Y: Field{[10]uint32{0x0251aa86, 0x0287b400, 0x009a9e33, 0x02f3dd8f, 0x02bb72fa, 0x0170a955, 0x01ab4fd8, 0x01f15355, 0x01ecffd6, 0x0026270e}}}, + {X: Field{[10]uint32{0x001ee995, 0x029f2a59, 0x01bbfa27, 0x03378f56, 0x0310c911, 0x00f47689, 0x031cee1c, 0x00f5b2c1, 0x0076e6b6, 0x001c9b38}}, Y: Field{[10]uint32{0x010af9c1, 0x02588b98, 0x015951c4, 0x02043522, 0x0206ea5e, 0x022ad74d, 0x02d01acd, 0x03e34d34, 0x02a0c91f, 0x0013906e}}}, + {X: Field{[10]uint32{0x02a43a1a, 0x02eb366f, 0x017aa27d, 0x01c7b4ba, 0x02c0d429, 0x027a5418, 0x02c0dc2c, 0x000f4fee, 0x01fe1835, 0x0037af24}}, Y: Field{[10]uint32{0x022d2f11, 0x01e8ccef, 0x00100d49, 0x0323fda2, 0x026dfdf3, 0x0357c9b9, 0x03b2ab80, 0x033a6bcc, 0x0315a6fe, 0x0004d64d}}}, + {X: Field{[10]uint32{0x00fd4b28, 0x017a443c, 0x00f41c58, 0x013b5ac9, 0x03237c79, 0x01cbfcb5, 0x0039e8c4, 0x012ae39c, 0x03357791, 0x00314e50}}, Y: Field{[10]uint32{0x0126087b, 0x01bf1533, 0x0310d1fc, 0x03da691c, 0x0123c26c, 0x002a8a83, 0x03041128, 0x027139ec, 0x019b628a, 0x000a014d}}}, + {X: Field{[10]uint32{0x005f29b0, 0x022f1e68, 0x00e1cc99, 0x00412fb9, 0x0072b818, 0x022a3ebb, 0x02bf1fbe, 0x0002c600, 0x02fd33c3, 0x00268a24}}, Y: Field{[10]uint32{0x01186e33, 0x03dcbfd1, 0x00bebb37, 0x0177d7ea, 0x00553870, 0x01738df3, 0x02ebc53a, 0x0004d948, 0x023bc2fa, 0x00265fc4}}}, + {X: Field{[10]uint32{0x039a351a, 0x0160412c, 0x0279f4c5, 0x02ff5cf7, 0x001503bb, 0x0382fc60, 0x017fe427, 0x013ef9fb, 0x00ac0f22, 0x0035288b}}, Y: Field{[10]uint32{0x02ce752b, 0x02bdae0e, 0x02860341, 0x00442a0b, 0x02232603, 0x01238d1a, 0x01133495, 0x00b824a9, 0x02973062, 0x00209a3f}}}, + {X: Field{[10]uint32{0x00c11659, 0x01653ee7, 0x0003c077, 0x02ee1df7, 0x0111d4d2, 0x001c27ee, 0x0014963b, 0x02f87635, 0x03ff15ad, 0x0012933c}}, Y: Field{[10]uint32{0x01ced874, 0x03b75834, 0x0336fc2d, 0x002f0e7f, 0x035109a3, 0x03a992b4, 0x00418100, 0x0254a989, 0x018336f1, 0x0015f211}}}, + {X: Field{[10]uint32{0x018e1539, 0x026fc305, 0x02f441f6, 0x009e1c72, 0x00e85e0b, 0x00b28992, 0x00836cf4, 0x0354c263, 0x00edb580, 0x0016303b}}, Y: Field{[10]uint32{0x0042467e, 0x005e0fba, 0x03fd7412, 0x0027e847, 0x0292e54a, 0x000b346a, 0x023d36f7, 0x02f25139, 0x00491e1d, 0x003abde7}}}, + {X: Field{[10]uint32{0x024892bb, 0x03326fdc, 0x0016f634, 0x0009fd39, 0x03261323, 0x03961a8c, 0x02154f3f, 0x01fa24e2, 0x00e8a60c, 0x002c3ef4}}, Y: Field{[10]uint32{0x02a5d3c3, 0x00cc31e0, 0x03d079a0, 0x024c4df0, 0x026dd83f, 0x0012662e, 0x00fcb501, 0x03d036d5, 0x027d6757, 0x0009ee9d}}}, + {X: Field{[10]uint32{0x0192f0d3, 0x01b630b6, 0x000818c1, 0x03de132d, 0x00ee90c2, 0x013bc611, 0x01fecf3e, 0x004d6849, 0x012a26b0, 0x002a52b8}}, Y: Field{[10]uint32{0x018e2050, 0x0229d808, 0x03c95bbc, 0x00d8221d, 0x02e046fe, 0x02ee8f59, 0x0016a6f6, 0x01d6571e, 0x03ba665e, 0x0028dd11}}}, + {X: Field{[10]uint32{0x00dcbeb5, 0x02f8c223, 0x02eeb9ad, 0x0101cc16, 0x00c540e2, 0x03e40137, 0x036c4844, 0x013eb8ca, 0x009b3eb7, 0x00232f6c}}, Y: Field{[10]uint32{0x00c932fe, 0x01cb3d0d, 0x023b810e, 0x01146d27, 0x01912df7, 0x0139685a, 0x007b14c0, 0x03bf4bfc, 0x03a291f6, 0x0000ae18}}}, + {X: Field{[10]uint32{0x00cdbac8, 0x00e721cd, 0x03afcf8f, 0x0071034d, 0x020ab313, 0x01422af5, 0x02fb89ed, 0x03af8731, 0x02c3b70e, 0x000fe33e}}, Y: Field{[10]uint32{0x0158b65e, 0x0124e84b, 0x01321f0c, 0x021ed10f, 0x01a68b52, 0x0122592d, 0x00b303db, 0x03c975e5, 0x0111846e, 0x0036ec08}}}, + {X: Field{[10]uint32{0x0315b25b, 0x01f69837, 0x004b9054, 0x0136ceb2, 0x0331fcaf, 0x020598c2, 0x03e9a4e1, 0x039e704b, 0x00e0cea3, 0x002d8581}}, Y: Field{[10]uint32{0x01b86801, 0x03a7660a, 0x0192cea2, 0x02224063, 0x00317d53, 0x02849929, 0x0265b41b, 0x03e96d59, 0x03ad9ea0, 0x0006abca}}}, + {X: Field{[10]uint32{0x011327d7, 0x021bbc11, 0x00a3f07c, 0x028d9347, 0x02fa51bd, 0x03ef5a2d, 0x026630a7, 0x02ce3870, 0x00103c6a, 0x003ac39d}}, Y: Field{[10]uint32{0x00e82e6d, 0x01a05eb8, 0x037d44c3, 0x0330bb8d, 0x0045cdaa, 0x027edd0e, 0x001c9c7d, 0x034f0655, 0x001757c4, 0x0037e814}}}, + {X: Field{[10]uint32{0x0156b7ae, 0x0342fda5, 0x0144f4bc, 0x01f92c95, 0x031fcfdd, 0x01d8b012, 0x02d28126, 0x03993236, 0x0103be51, 0x0018dbf1}}, Y: Field{[10]uint32{0x013f4cd9, 0x021c0e8c, 0x011e6984, 0x0375414b, 0x02b633c8, 0x022df621, 0x03b6735a, 0x010525fc, 0x030f0510, 0x0015ee0e}}}, + {X: Field{[10]uint32{0x012ab330, 0x031cd639, 0x02288c15, 0x01953a8f, 0x005ba9dc, 0x034b7867, 0x02fc2bd1, 0x008d6f1a, 0x00ec4d42, 0x000bf31c}}, Y: Field{[10]uint32{0x016a30ce, 0x01df9949, 0x01069395, 0x03a09467, 0x0135bde8, 0x03f36da5, 0x024cbbfc, 0x00788b6d, 0x00182bfa, 0x001a8d58}}}, + {X: Field{[10]uint32{0x02a94b54, 0x0043889f, 0x007d01cd, 0x0396f56f, 0x0183be81, 0x01af7ea5, 0x00969ebd, 0x02e2ff6e, 0x02c38d38, 0x00045401}}, Y: Field{[10]uint32{0x0080e08a, 0x01687508, 0x02780250, 0x00e9cc94, 0x023fac02, 0x01ba1e00, 0x0339e83f, 0x00feea6b, 0x010216eb, 0x001810eb}}}, + {X: Field{[10]uint32{0x01b3aaf1, 0x0194fca3, 0x019a515b, 0x021afb70, 0x013756a9, 0x03f95340, 0x00a2da82, 0x0070a583, 0x025a15ba, 0x00005f55}}, Y: Field{[10]uint32{0x03c7399c, 0x012b5ea6, 0x00c35f27, 0x0064cd4d, 0x027a6338, 0x0274c494, 0x00b05aab, 0x002cf92e, 0x01dd4204, 0x00245eee}}}, + {X: Field{[10]uint32{0x03221ef2, 0x01d31b5a, 0x0330e023, 0x022ad20b, 0x01d2af8f, 0x00f96f2a, 0x00598f7a, 0x00710c2e, 0x00898850, 0x00037309}}, Y: Field{[10]uint32{0x03652e72, 0x01919193, 0x02b0a578, 0x02d667c7, 0x01cd14ca, 0x03c037b3, 0x03102a6e, 0x03b14ac7, 0x017dd5c6, 0x002a165d}}}, + {X: Field{[10]uint32{0x011f0b0f, 0x00fea3cd, 0x03a03d83, 0x030f50f2, 0x03ae2cf9, 0x03a0229f, 0x01919db6, 0x00c2df37, 0x039f4e94, 0x0029a2ca}}, Y: Field{[10]uint32{0x00786526, 0x0096f165, 0x00f66d65, 0x0137cbe7, 0x017f45b1, 0x009de008, 0x015614d9, 0x00248e3a, 0x0232d3ad, 0x0038d2e2}}}, + {X: Field{[10]uint32{0x010e9462, 0x0020a7e3, 0x013c2319, 0x005d1c0b, 0x01fe7e2f, 0x02b5654e, 0x02d11e9e, 0x00466174, 0x025a938e, 0x000be553}}, Y: Field{[10]uint32{0x03b16dd5, 0x02ac79c2, 0x02c61e55, 0x02fe7e26, 0x01f6aaa6, 0x01a8e4ec, 0x02fecc84, 0x01f502e8, 0x0379fa8b, 0x002cbc34}}}, + {X: Field{[10]uint32{0x027ffe4f, 0x00e4e330, 0x03556fa9, 0x0234f33f, 0x033cc33c, 0x02ecb77a, 0x03fcae86, 0x0253f66c, 0x01136bca, 0x00088f4f}}, Y: Field{[10]uint32{0x01512915, 0x01329614, 0x00ec09c7, 0x02294eed, 0x0327f6cd, 0x00f58866, 0x016f7dd8, 0x0061f309, 0x0106e317, 0x0021f864}}}, + {X: Field{[10]uint32{0x028f7b2e, 0x020d2b67, 0x02abf517, 0x00ae83ce, 0x00b61443, 0x02d3d257, 0x01f3a3e9, 0x0186d90f, 0x00e82911, 0x00156476}}, Y: Field{[10]uint32{0x026d07c2, 0x03bd6503, 0x01416673, 0x01fb1028, 0x0130b3fe, 0x02e91c67, 0x03d454eb, 0x01f94b66, 0x0235f626, 0x000b235a}}}, + {X: Field{[10]uint32{0x01f29a29, 0x024dd451, 0x02252c8e, 0x0078b939, 0x03414184, 0x027a6bbe, 0x00cbaecb, 0x0068521c, 0x004ad15d, 0x003acb3f}}, Y: Field{[10]uint32{0x0052e5ac, 0x019c855c, 0x00b955bc, 0x0035b4d7, 0x00e62f21, 0x01d94054, 0x0304c79c, 0x03664ade, 0x020810bf, 0x001e2043}}}, + {X: Field{[10]uint32{0x00a3f74b, 0x0178fa7b, 0x0392700d, 0x01f4b867, 0x02bdcdb4, 0x00e7310d, 0x00b1d4c5, 0x02a06179, 0x03f99680, 0x001844b0}}, Y: Field{[10]uint32{0x00da4403, 0x03694ae6, 0x00f353b8, 0x01f1a9a4, 0x02f2579d, 0x007db2a5, 0x008f9d40, 0x022feb6b, 0x03dd723c, 0x001ba182}}}, + {X: Field{[10]uint32{0x03d58b16, 0x02477b69, 0x015797b3, 0x00535f8c, 0x03b9b329, 0x0283c5f0, 0x002c23b9, 0x0362c031, 0x00d8d552, 0x00224848}}, Y: Field{[10]uint32{0x01cf7941, 0x0008c5ad, 0x00edf325, 0x025b33c3, 0x03cc4a94, 0x02f7300d, 0x013d1f64, 0x01e3cbe4, 0x03acb3c7, 0x00398948}}}, + {X: Field{[10]uint32{0x03c4dc0a, 0x0347a447, 0x021c5ecb, 0x01245a11, 0x0160ca4a, 0x018c1129, 0x03155839, 0x034ef808, 0x0056217a, 0x0011d62d}}, Y: Field{[10]uint32{0x01d83679, 0x0121e336, 0x027ca960, 0x01ec0f13, 0x03bb7498, 0x030c2b06, 0x03eec6a1, 0x025cfc15, 0x015a4f30, 0x00267909}}}, + {X: Field{[10]uint32{0x025629da, 0x039d5d5b, 0x02143b99, 0x031f658b, 0x03a3b95d, 0x01e11e6b, 0x03a0c6f9, 0x01ea1e5f, 0x02a69a20, 0x002ac108}}, Y: Field{[10]uint32{0x01823faa, 0x01b8b8e9, 0x02dfa7a0, 0x01c12653, 0x0184af0f, 0x02e37f3b, 0x00280c32, 0x026157af, 0x010f00fc, 0x001cce63}}}, + {X: Field{[10]uint32{0x0145d227, 0x02b50fb5, 0x01b20ee7, 0x02983c28, 0x01852cc7, 0x020a4dd3, 0x010b4c35, 0x002c50c3, 0x032accb9, 0x00066010}}, Y: Field{[10]uint32{0x028b05c5, 0x023696e7, 0x01546766, 0x03e3cb94, 0x0069c919, 0x02e626f4, 0x03d1a0e9, 0x0233acab, 0x0073bfbc, 0x0025ab8e}}}, + {X: Field{[10]uint32{0x00e93f17, 0x01894bb8, 0x010cbb71, 0x0055d0f5, 0x0293b8a0, 0x02aefbcf, 0x0361cd72, 0x03eceb29, 0x037fe2df, 0x0010a204}}, Y: Field{[10]uint32{0x02238825, 0x0021b76a, 0x008de456, 0x0011679e, 0x0271fddb, 0x03681d9c, 0x01855f14, 0x019a9bef, 0x033e36c3, 0x00300b0c}}}, + {X: Field{[10]uint32{0x02b6cde2, 0x024a06b5, 0x03d3d52d, 0x01db836d, 0x0077e432, 0x02a9cfe9, 0x03c4d160, 0x0227682b, 0x003505bc, 0x003597eb}}, Y: Field{[10]uint32{0x0007383f, 0x01e11e30, 0x02b13056, 0x03906221, 0x038e9f07, 0x000e18b4, 0x01005456, 0x03ccded1, 0x0175a6c5, 0x0039bd32}}}, + {X: Field{[10]uint32{0x018f6ca7, 0x00665e2e, 0x014c843e, 0x021346ca, 0x02beb967, 0x0181e4db, 0x028b54e1, 0x0349e93f, 0x0144e62d, 0x001c0a6c}}, Y: Field{[10]uint32{0x0140a25c, 0x023ca99c, 0x0114aa47, 0x011f1cf7, 0x009a1af3, 0x0155113c, 0x02c90c38, 0x01b1b8e8, 0x01665805, 0x0022c43b}}}, + {X: Field{[10]uint32{0x039183b2, 0x0256d0f3, 0x01711502, 0x013911c5, 0x01fa343e, 0x01768306, 0x00ea87da, 0x026f77a0, 0x00ebdf96, 0x0013c9d8}}, Y: Field{[10]uint32{0x03e28167, 0x00a59de0, 0x03425d46, 0x017536bf, 0x0115d862, 0x023da6da, 0x001fd39b, 0x03bc27e8, 0x017bf3f9, 0x0010f8b0}}}, + {X: Field{[10]uint32{0x0374a5fc, 0x01c98570, 0x03e52143, 0x015fcbb9, 0x01b573ce, 0x02e7e94e, 0x015f0d23, 0x025aa3cd, 0x02addb41, 0x0033265a}}, Y: Field{[10]uint32{0x028ef28d, 0x027cb702, 0x019232c0, 0x02b6fffe, 0x0144284b, 0x02fa1744, 0x00a9cb66, 0x00a4d70c, 0x03871878, 0x002c7103}}}, + {X: Field{[10]uint32{0x014ade42, 0x010c0f35, 0x006313cf, 0x0214ef6b, 0x01cd9b32, 0x017adc24, 0x0038e398, 0x036416cb, 0x02d3f3e3, 0x0031e062}}, Y: Field{[10]uint32{0x00339eee, 0x01feebe5, 0x03937800, 0x03f747d7, 0x033403a5, 0x030510f3, 0x0363fb0f, 0x02142c51, 0x004e7bbb, 0x001555d3}}}, + {X: Field{[10]uint32{0x0189c4fd, 0x01d5cdc9, 0x0045e52a, 0x03279de5, 0x009a45db, 0x02b97496, 0x0344d1f3, 0x023affd0, 0x01846fc4, 0x001b340d}}, Y: Field{[10]uint32{0x03416e34, 0x03a33224, 0x00723a44, 0x024a34b5, 0x014d811c, 0x039347ea, 0x0367dda8, 0x038dc6b7, 0x037db165, 0x002bea16}}}, + {X: Field{[10]uint32{0x003b2e0a, 0x03aeeb51, 0x00fd3bfa, 0x02491d37, 0x00f5231b, 0x004548c5, 0x02b72359, 0x02c6b98c, 0x0205f716, 0x003594a8}}, Y: Field{[10]uint32{0x013bedcf, 0x02281bae, 0x02dcba45, 0x008fb059, 0x03c4646a, 0x03780f62, 0x002f0d85, 0x0103df2e, 0x0021b782, 0x00348661}}}, + {X: Field{[10]uint32{0x0052fb54, 0x0014be37, 0x02d73a6a, 0x02bf4d38, 0x0181ff0b, 0x00d00116, 0x01b3e4fe, 0x012877e6, 0x004dcd84, 0x002a01f4}}, Y: Field{[10]uint32{0x02e2cd9a, 0x0067a7e8, 0x03151af0, 0x011e5f3e, 0x00c385c0, 0x03eef1c6, 0x03e5079f, 0x0260d4ee, 0x00bb7393, 0x0006229e}}}, + {X: Field{[10]uint32{0x009eb2d7, 0x03f705f3, 0x02de224e, 0x017a7d33, 0x01b8c3a9, 0x01b2c0ae, 0x03acd07d, 0x02b523a4, 0x03bca5d6, 0x0007bf4a}}, Y: Field{[10]uint32{0x02745b39, 0x00fbbcd9, 0x01a05006, 0x02baa2bc, 0x0202a9d2, 0x02ecd5fd, 0x03e191a1, 0x031f98d5, 0x03881b98, 0x003e547b}}}, + {X: Field{[10]uint32{0x0395888f, 0x002e6b08, 0x01f666ed, 0x004df0ef, 0x030ea0ff, 0x025ff838, 0x02bcd044, 0x00f6d660, 0x0254d27d, 0x00016f17}}, Y: Field{[10]uint32{0x02ec3300, 0x03d97ca0, 0x003754c1, 0x01d409c4, 0x025a22d9, 0x00c86cda, 0x01f8b857, 0x03ac0598, 0x0002d4f4, 0x000d556f}}}, + {X: Field{[10]uint32{0x006a3247, 0x02e023dd, 0x02f221f5, 0x01c456f9, 0x02158cca, 0x022b4bc7, 0x022ea80e, 0x0234379b, 0x028d26b0, 0x0003d802}}, Y: Field{[10]uint32{0x03ca3523, 0x02ceac62, 0x00aa3cd5, 0x0371945b, 0x0276c753, 0x03a3846e, 0x02f75b28, 0x03e96c1f, 0x02134bc3, 0x0008ef96}}}, + {X: Field{[10]uint32{0x00ccaf7b, 0x00af49a4, 0x0381ae49, 0x030db1cf, 0x01f5119b, 0x0396404d, 0x01712a8b, 0x029ea331, 0x020b2ab2, 0x003f1f93}}, Y: Field{[10]uint32{0x001151a6, 0x03242ace, 0x01cddb31, 0x02d6aa0d, 0x01e4a682, 0x01b7624a, 0x02862b8a, 0x011a41ba, 0x02f41f27, 0x0012f584}}}, + {X: Field{[10]uint32{0x01442655, 0x00eced62, 0x01700bcd, 0x0161daaa, 0x0141641d, 0x01e6d8f9, 0x0067eecd, 0x03402feb, 0x033cfe12, 0x00144c97}}, Y: Field{[10]uint32{0x033ef941, 0x00de92c4, 0x03b33a44, 0x03964730, 0x03982a35, 0x01e595ff, 0x01623605, 0x039b8b6e, 0x00ad7b7a, 0x0035aa25}}}, + {X: Field{[10]uint32{0x0198aec8, 0x009b92b1, 0x03a09056, 0x01b6e3fb, 0x02afee9a, 0x005fc00e, 0x01bd2d57, 0x03d823c8, 0x00271a55, 0x000b6ceb}}, Y: Field{[10]uint32{0x03f9533e, 0x03832226, 0x03dd6e0d, 0x01a2d1f3, 0x013c6621, 0x0199827d, 0x00c9fc9d, 0x00718307, 0x0333a0c0, 0x003149af}}}, + {X: Field{[10]uint32{0x01fa7dcc, 0x03481775, 0x01be51e1, 0x00d8fce4, 0x0135fbd4, 0x01f790c8, 0x0305b554, 0x02c06d7a, 0x037293de, 0x00024201}}, Y: Field{[10]uint32{0x02d7442d, 0x01304097, 0x03f23e03, 0x02134f30, 0x0164dfef, 0x01718856, 0x013d318b, 0x00ccdc19, 0x02ac1724, 0x003fa587}}}, + {X: Field{[10]uint32{0x039ed9d6, 0x030def0c, 0x017cce2e, 0x02b4f4d6, 0x03045557, 0x01e43353, 0x02cc03f6, 0x013f20b6, 0x0181e5a6, 0x000ca86b}}, Y: Field{[10]uint32{0x027cb07a, 0x01c41898, 0x02cf3d13, 0x0362a41d, 0x0279cb55, 0x01e573b1, 0x017b63ca, 0x000089c2, 0x03681801, 0x0021eaf3}}}, + {X: Field{[10]uint32{0x019246f9, 0x01c745d3, 0x016e9a37, 0x027556ce, 0x0108c584, 0x01c745ea, 0x031af769, 0x02714683, 0x00fa5868, 0x003df2ea}}, Y: Field{[10]uint32{0x0358ee45, 0x01ee7b2b, 0x0072cac3, 0x030bf20c, 0x025309a0, 0x01757ee8, 0x024d7333, 0x02a72bb6, 0x03a910d5, 0x003d2c2a}}}, + {X: Field{[10]uint32{0x0329ea81, 0x022be098, 0x006d58ee, 0x0156b9c1, 0x03fab75f, 0x0015e690, 0x01b6b7bc, 0x00036759, 0x01042da9, 0x003369ac}}, Y: Field{[10]uint32{0x011771e3, 0x035bc773, 0x000fc068, 0x038a6b1f, 0x01a8ee20, 0x038d8078, 0x01171a01, 0x01d00568, 0x000eacfd, 0x001c321b}}}, + {X: Field{[10]uint32{0x027ee58b, 0x021e3c3d, 0x03f2ac23, 0x032b446d, 0x01a46f3b, 0x0113282f, 0x00f27b05, 0x02c73a6a, 0x024009c5, 0x00289869}}, Y: Field{[10]uint32{0x03fff888, 0x01b9043c, 0x014d420c, 0x030c1496, 0x0185da67, 0x034cf5c9, 0x029cda8f, 0x036ba6d3, 0x031d4c42, 0x000789a9}}}, + {X: Field{[10]uint32{0x01f4db57, 0x0252e9ba, 0x028846b3, 0x00f1a0bd, 0x009435aa, 0x007edb4d, 0x018e885d, 0x0210b300, 0x0167fd7f, 0x002f1c32}}, Y: Field{[10]uint32{0x00bd9468, 0x0213847e, 0x03e5718d, 0x03121f11, 0x013032ef, 0x01e195c0, 0x00a07840, 0x00b78310, 0x013a837e, 0x0028ae67}}}, + {X: Field{[10]uint32{0x0077a9c2, 0x000e269c, 0x020269c6, 0x019c4147, 0x02c7a265, 0x03ebc8d2, 0x03fdba3f, 0x00c52532, 0x02f75dc4, 0x000d9054}}, Y: Field{[10]uint32{0x0146d265, 0x0130ca81, 0x018eae08, 0x000496f3, 0x013c8fa6, 0x03b79c75, 0x038ae4e7, 0x02150cc0, 0x03d9f4ec, 0x002b0eb1}}}, + {X: Field{[10]uint32{0x00f3043d, 0x01b765a5, 0x01326cc3, 0x00be8f62, 0x01d82ca4, 0x01008b7e, 0x02f59d8e, 0x01756364, 0x00bed57d, 0x0014bfa9}}, Y: Field{[10]uint32{0x004feb35, 0x0150a363, 0x0399b249, 0x00216daa, 0x005708c6, 0x0299ece7, 0x038f9a37, 0x0229d7dc, 0x032852f9, 0x002dfa60}}}, + {X: Field{[10]uint32{0x023e1a4d, 0x035a08a1, 0x03ce67b8, 0x030f4af8, 0x039c32ec, 0x026b0ffe, 0x033a096a, 0x032203e5, 0x0110c8ba, 0x000d3fba}}, Y: Field{[10]uint32{0x009c7a17, 0x0155881a, 0x008b2243, 0x02825c74, 0x002231f6, 0x008b8983, 0x00db14b1, 0x03111b1e, 0x00969c9d, 0x00383c04}}}, + {X: Field{[10]uint32{0x0349c65b, 0x026cef76, 0x024bb401, 0x02c3d1da, 0x030f815a, 0x007c1dbd, 0x02424ec3, 0x034ba064, 0x030bf4c9, 0x001abca3}}, Y: Field{[10]uint32{0x02a45248, 0x0143fadb, 0x005d3f13, 0x03742f29, 0x0017d1e1, 0x005fd819, 0x01aa3469, 0x00ecc46a, 0x012fbb66, 0x000b157f}}}, + {X: Field{[10]uint32{0x01320e46, 0x01d3dc93, 0x0003b8bc, 0x0204eebb, 0x03a4f0ad, 0x02b174db, 0x00f1b6b6, 0x02d07991, 0x036639e4, 0x001c2daa}}, Y: Field{[10]uint32{0x02913a14, 0x02030622, 0x02c95237, 0x01777f37, 0x0196f713, 0x025b4f37, 0x01ad5f10, 0x013f3346, 0x01e64f4e, 0x003b1902}}}, + {X: Field{[10]uint32{0x0065724d, 0x00212068, 0x000bc155, 0x01a84e18, 0x03061419, 0x03df6ef8, 0x03eff50f, 0x01d6bab6, 0x03114ab9, 0x003b795b}}, Y: Field{[10]uint32{0x0336ecfc, 0x02b7f254, 0x0173c02d, 0x018dbbf7, 0x0371906b, 0x006c1a12, 0x01839dc6, 0x0087b49b, 0x024c11f4, 0x00279feb}}}, + {X: Field{[10]uint32{0x016df8a4, 0x01f0f915, 0x03efe685, 0x03e7c5a0, 0x025de54a, 0x01992399, 0x0019d746, 0x01cc40f6, 0x003c840a, 0x0020f0d3}}, Y: Field{[10]uint32{0x0086cd10, 0x035c2903, 0x0040fd31, 0x00dfc426, 0x0290aa81, 0x0338bbb4, 0x00d97719, 0x035b03bb, 0x0041562d, 0x002708e0}}}, + {X: Field{[10]uint32{0x00c7e200, 0x00164f68, 0x037c6102, 0x0114934d, 0x0052cbdb, 0x0017a1e9, 0x028cf032, 0x026e6148, 0x00900008, 0x002a8abf}}, Y: Field{[10]uint32{0x02be01f4, 0x017309e5, 0x006af2db, 0x0093fa2a, 0x006d8129, 0x00c58780, 0x013bc4fa, 0x02b0674f, 0x016ab382, 0x000d10c6}}}, + {X: Field{[10]uint32{0x0155c520, 0x01d5cc10, 0x02800e3a, 0x0116207b, 0x03e90eb0, 0x03efdc7e, 0x02956a02, 0x03322e7c, 0x03dc4310, 0x00390bb1}}, Y: Field{[10]uint32{0x0225336c, 0x0099e735, 0x027b693c, 0x011562af, 0x012d0009, 0x02369536, 0x00324bbe, 0x02473f88, 0x02cfa52d, 0x0024e7bc}}}, + {X: Field{[10]uint32{0x02ec2b21, 0x0315818c, 0x01dd34a3, 0x02ac99ff, 0x00181617, 0x005bbe7d, 0x038de47a, 0x014803f5, 0x0124937c, 0x002f02f7}}, Y: Field{[10]uint32{0x02b63035, 0x034a64d4, 0x03ac9df6, 0x00448175, 0x004a0285, 0x024ac21c, 0x02e0e1d1, 0x0087de61, 0x024c10b5, 0x00036c12}}}, + {X: Field{[10]uint32{0x01adc8e7, 0x013aebab, 0x03990626, 0x03559037, 0x0155c005, 0x03dd838a, 0x0310fbb3, 0x029ccd78, 0x01d89b43, 0x00372232}}, Y: Field{[10]uint32{0x002fc512, 0x00f2353f, 0x0163625a, 0x00cb308f, 0x033fe37b, 0x027faded, 0x03fc6777, 0x011e5196, 0x01e46f98, 0x000b59de}}}, + {X: Field{[10]uint32{0x00111c20, 0x0278d260, 0x03210f6f, 0x01422315, 0x035ee3dc, 0x00175dbb, 0x030cb02e, 0x00cb18bf, 0x018ab0c9, 0x0029eb83}}, Y: Field{[10]uint32{0x02e553a2, 0x001f6864, 0x03cdd01d, 0x0115a48c, 0x03ac8dcc, 0x00c87794, 0x039dc94b, 0x018b2262, 0x03c9d631, 0x00358caa}}}, + {X: Field{[10]uint32{0x00be0e97, 0x0296b317, 0x03215592, 0x026e97c0, 0x00d631ac, 0x01f69b99, 0x0203af75, 0x01baaf6c, 0x036ee7bd, 0x00118808}}, Y: Field{[10]uint32{0x00627c6e, 0x025da40a, 0x018c88fa, 0x02f1c0a3, 0x02707851, 0x03eb99a8, 0x0330cdf4, 0x0078a9b3, 0x004f69ea, 0x00177d09}}}, + {X: Field{[10]uint32{0x03d8f671, 0x036647c9, 0x00a38e2b, 0x03fcd276, 0x015cd35f, 0x03e4c8c0, 0x0350acac, 0x0364c147, 0x004a3d8b, 0x0020132e}}, Y: Field{[10]uint32{0x00ae8d3f, 0x026a391c, 0x01267bbc, 0x014aef9b, 0x00cdc395, 0x000d884a, 0x02b2f192, 0x03e0d65a, 0x00129ee0, 0x0012ddee}}}, + {X: Field{[10]uint32{0x011c2ed2, 0x0076ef6e, 0x032378e7, 0x01343881, 0x02b4f6fb, 0x02918e44, 0x001fcbee, 0x02cbcae0, 0x030f5382, 0x001ba94d}}, Y: Field{[10]uint32{0x00b2d88d, 0x02f85064, 0x025b1a8b, 0x038b4de0, 0x008b513e, 0x006567b2, 0x012a002f, 0x03fc203a, 0x0109d8f3, 0x003d6d3e}}}, + {X: Field{[10]uint32{0x02e22ba6, 0x031c1ca8, 0x01f4769f, 0x000ee068, 0x031ee564, 0x03d871ac, 0x03b0852a, 0x01d6984a, 0x021c4ff5, 0x00362e37}}, Y: Field{[10]uint32{0x02468c0e, 0x00e37d38, 0x018928d5, 0x032d1ec1, 0x01f23cbd, 0x017095b9, 0x02ad8275, 0x02fe2625, 0x0190d37a, 0x00078f10}}}, + {X: Field{[10]uint32{0x01f1b147, 0x0320a47b, 0x00a9e475, 0x019c1420, 0x0080d384, 0x00e8035b, 0x033f3ea4, 0x02f5ba71, 0x006404a0, 0x0019ab06}}, Y: Field{[10]uint32{0x03a1260e, 0x02207313, 0x030bca61, 0x0319cf6a, 0x029be98e, 0x0147868d, 0x0103efd5, 0x02ddd805, 0x000f7db6, 0x000b3183}}}, + {X: Field{[10]uint32{0x0360e942, 0x0314d9cf, 0x0185bef3, 0x00d70dd7, 0x02f27844, 0x022d6972, 0x0263cf93, 0x008f9c1d, 0x022c4ed2, 0x0011c652}}, Y: Field{[10]uint32{0x03d9f920, 0x01213034, 0x036045f4, 0x033aaf7d, 0x035808a3, 0x01409f55, 0x032738c7, 0x03704def, 0x011b5a64, 0x002c3f78}}}, + {X: Field{[10]uint32{0x024c6186, 0x034f3d0a, 0x0229010b, 0x00ab17c1, 0x009fdc1b, 0x02375da3, 0x02747428, 0x03660e20, 0x00599af2, 0x00045072}}, Y: Field{[10]uint32{0x02f0226e, 0x014234fb, 0x02c64d6b, 0x034aea63, 0x005392a0, 0x015e343e, 0x017555a0, 0x01184ccc, 0x034761ed, 0x001e90c7}}}, + {X: Field{[10]uint32{0x03496f79, 0x00c030f9, 0x0251d4ba, 0x03585ab1, 0x01487002, 0x03ee3952, 0x01da689b, 0x03fa7b59, 0x01d8e80a, 0x003e416f}}, Y: Field{[10]uint32{0x03bfcf72, 0x0096c65d, 0x000fca7e, 0x0317e7d3, 0x03cd999f, 0x01fc1419, 0x021b03ba, 0x01411751, 0x037f3bfb, 0x0007b1ef}}}, + {X: Field{[10]uint32{0x0315e9e0, 0x03c7eb03, 0x023e5573, 0x00beb51e, 0x00232ea6, 0x0053c2be, 0x004faadb, 0x014bb88f, 0x00e4fba4, 0x002e952e}}, Y: Field{[10]uint32{0x00f5cda8, 0x02f52818, 0x030b8da1, 0x002c044d, 0x039c96ed, 0x00ab203c, 0x018e48a8, 0x02ef36ef, 0x02e9efca, 0x002bd55a}}}, + {X: Field{[10]uint32{0x0226a80a, 0x028a2d02, 0x035e9c08, 0x01080e9d, 0x001494a0, 0x00d868ad, 0x0287f3cf, 0x01b890c3, 0x02d0561f, 0x001674fa}}, Y: Field{[10]uint32{0x000a9bc8, 0x007863c0, 0x015d9ac5, 0x00730b42, 0x02f5f1ba, 0x009f1cc1, 0x00a278d4, 0x0088a70a, 0x007d50a9, 0x0026c9bd}}}, + {X: Field{[10]uint32{0x00865d47, 0x03641c2b, 0x00f5b129, 0x0023bfc0, 0x0315520a, 0x01f83cf3, 0x032924be, 0x0324a363, 0x023fab4c, 0x000a9b96}}, Y: Field{[10]uint32{0x00a625a5, 0x01dc60d7, 0x000cb38b, 0x037ba4e0, 0x00919913, 0x01824d47, 0x01191964, 0x01c08e1b, 0x03505872, 0x00015700}}}, + {X: Field{[10]uint32{0x00907502, 0x022c00aa, 0x03d84682, 0x00716aba, 0x01fff1fb, 0x010b3d96, 0x00afe918, 0x03b90422, 0x00d1c35b, 0x002263d4}}, Y: Field{[10]uint32{0x02f3267b, 0x02e3e3d8, 0x01a79daf, 0x03c528f1, 0x02fc9bd0, 0x01ae1300, 0x0202e490, 0x00ab406b, 0x0280c97c, 0x002c915b}}}, + {X: Field{[10]uint32{0x016af85a, 0x03119c43, 0x03bf9422, 0x028eb013, 0x03bda5d9, 0x027b8f34, 0x01d2304e, 0x03c32c7e, 0x02b8b49b, 0x00346152}}, Y: Field{[10]uint32{0x03155c20, 0x03fafa51, 0x03fabd0a, 0x00085f7d, 0x00d7bdeb, 0x00fb77cd, 0x016a0775, 0x0206016c, 0x000fd881, 0x00013894}}}, + {X: Field{[10]uint32{0x02af4680, 0x037f19bf, 0x01303a3e, 0x03d0a15b, 0x024a417d, 0x025a3bdf, 0x03cc787d, 0x02db87c0, 0x008a394d, 0x002187ee}}, Y: Field{[10]uint32{0x02135da6, 0x0348d882, 0x018dddc6, 0x022f6f00, 0x0268f3c3, 0x018e3380, 0x03ff11b0, 0x002c4c8f, 0x015aab8b, 0x002975fa}}}, + {X: Field{[10]uint32{0x013403d6, 0x033d8b60, 0x0111cb0c, 0x000ce7f0, 0x03ea5269, 0x019db3de, 0x0155d90b, 0x0277f0f0, 0x0368b9fa, 0x0025513d}}, Y: Field{[10]uint32{0x006e047f, 0x02659c20, 0x0290253e, 0x000d78c0, 0x0328d876, 0x02fd4552, 0x011ed21b, 0x01893c21, 0x012fcbde, 0x0033b136}}}, + {X: Field{[10]uint32{0x01db68e9, 0x01732a34, 0x009ba2cb, 0x0034edc5, 0x00311cd4, 0x027ce825, 0x00d7b078, 0x019af88f, 0x0192f80a, 0x003ddc88}}, Y: Field{[10]uint32{0x001b516e, 0x03bf83f2, 0x03462d40, 0x00809dfd, 0x011c11e3, 0x03321479, 0x02266610, 0x035939cf, 0x029f3243, 0x00010743}}}, + {X: Field{[10]uint32{0x018e14ed, 0x0381eb5a, 0x02fc1be9, 0x01f10e7d, 0x01b6bd8e, 0x027aa479, 0x039927a8, 0x01ca6f6f, 0x00651f88, 0x0021dad3}}, Y: Field{[10]uint32{0x016b49da, 0x00c7773e, 0x004e16ad, 0x02121aae, 0x037b5730, 0x018bc94d, 0x0387b88f, 0x03a7773d, 0x03811cfa, 0x003b38b3}}}, + {X: Field{[10]uint32{0x03b70b10, 0x032c0f01, 0x03127b7e, 0x03d8cd4e, 0x00721be8, 0x0245e267, 0x00614278, 0x02649221, 0x00e46224, 0x001c1abd}}, Y: Field{[10]uint32{0x0258a5f3, 0x0141ba5f, 0x03545aa6, 0x0383984b, 0x00cdcf0e, 0x004f7add, 0x015bd298, 0x0348039a, 0x01720c65, 0x00325cb6}}}, + {X: Field{[10]uint32{0x03863c9d, 0x0256df7c, 0x03ddef14, 0x016fe745, 0x024301b7, 0x009f97d2, 0x00dde0ba, 0x01898ad7, 0x0218c9c9, 0x0033a5e8}}, Y: Field{[10]uint32{0x02a1ef10, 0x01c2b280, 0x03f55c57, 0x02c9cac0, 0x01c12900, 0x01ebda3c, 0x0116410d, 0x00509a22, 0x021a20fd, 0x003a4e63}}}, + {X: Field{[10]uint32{0x013be895, 0x03991275, 0x019bca8f, 0x03afa6cf, 0x037dae0f, 0x00b6cf54, 0x02a1f01c, 0x020c7a21, 0x039a92cf, 0x003ed896}}, Y: Field{[10]uint32{0x02599a37, 0x0165f7a0, 0x0344c30d, 0x030a9947, 0x031fe2a8, 0x00b2fc88, 0x029d68f1, 0x02781028, 0x0274ba56, 0x001fde0f}}}, + {X: Field{[10]uint32{0x01f4747d, 0x00b16955, 0x01bc4c6b, 0x03ced0b7, 0x02f126c6, 0x020cc912, 0x039098a8, 0x00ae2d46, 0x03697a7d, 0x00207fef}}, Y: Field{[10]uint32{0x0006f33b, 0x000858bc, 0x00d0a8b0, 0x037b43f5, 0x0190b4d1, 0x0336aa9f, 0x013d5303, 0x03bedcc8, 0x0357982e, 0x0038b19c}}}, + {X: Field{[10]uint32{0x020ed0e4, 0x00c6d55a, 0x01ba8c0f, 0x01def9a5, 0x00679d6b, 0x002728bb, 0x016d4d63, 0x02adf2bc, 0x03668c30, 0x001b7f03}}, Y: Field{[10]uint32{0x015a563c, 0x03fe1f6c, 0x03d905ae, 0x00e2ff77, 0x01367724, 0x003d107a, 0x002d7a62, 0x02a9d0c6, 0x02b2d9a0, 0x002907b4}}}, + {X: Field{[10]uint32{0x03501b44, 0x03e530ce, 0x0023fe77, 0x037e22f3, 0x001d5715, 0x03d8f0ca, 0x01a9b5b0, 0x0395aae8, 0x01d1b953, 0x00071afc}}, Y: Field{[10]uint32{0x00e4b0ef, 0x00d82279, 0x02d3a8e3, 0x037e4688, 0x028f1e74, 0x01f0ae92, 0x01c368bf, 0x005e0806, 0x014db4ca, 0x003199c8}}}, + {X: Field{[10]uint32{0x02def93d, 0x03f491fe, 0x00ba6b2a, 0x03c3479e, 0x035417b9, 0x005134bc, 0x00632319, 0x027d8176, 0x02df5d99, 0x002da444}}, Y: Field{[10]uint32{0x018df4ae, 0x00d318d5, 0x020209a0, 0x01722508, 0x00464f11, 0x02b2b77b, 0x00fafeb8, 0x021b9c1c, 0x037a3028, 0x000858f3}}}, + {X: Field{[10]uint32{0x0176b6e0, 0x0192f792, 0x0287cda4, 0x03363805, 0x019737a2, 0x027be48a, 0x018b8fcf, 0x003e45f1, 0x0332ac23, 0x002f00e1}}, Y: Field{[10]uint32{0x025682d2, 0x007011a8, 0x00ab3719, 0x03677d8e, 0x017a7ae0, 0x01f88ce1, 0x03e1d6fa, 0x018dcd80, 0x02010079, 0x0000ce49}}}, + {X: Field{[10]uint32{0x03e32d81, 0x00faf689, 0x001ae183, 0x0032b7b4, 0x007489c2, 0x0166ec03, 0x024d9aee, 0x02b531aa, 0x02951047, 0x0025b7cc}}, Y: Field{[10]uint32{0x02e2034b, 0x02313bf8, 0x00466181, 0x03c7999d, 0x02cbfaa8, 0x01743c19, 0x01189bbf, 0x018cf060, 0x002d74ce, 0x001063db}}}, + {X: Field{[10]uint32{0x02304979, 0x034be9da, 0x001d263c, 0x03e8bcd4, 0x01cb6a65, 0x02d864f0, 0x02fcefde, 0x0102afb1, 0x0227939e, 0x0028f14c}}, Y: Field{[10]uint32{0x03c967e4, 0x0283b5b6, 0x00de8caf, 0x02637180, 0x0300f467, 0x01e8bd99, 0x0329ade3, 0x029bc64b, 0x02a5498e, 0x00111a32}}}, + {X: Field{[10]uint32{0x0145eb2b, 0x02bc2b49, 0x01a92601, 0x011ae475, 0x017a0c7d, 0x0385ca98, 0x005f1b31, 0x01b5b5ae, 0x02073dfd, 0x0024ff60}}, Y: Field{[10]uint32{0x0163a847, 0x025f51f5, 0x02866883, 0x026c82e2, 0x03961155, 0x02b3faec, 0x03ca8636, 0x01a9046f, 0x02c19a8a, 0x001806fa}}}, + {X: Field{[10]uint32{0x02ca0a9b, 0x01e82ea1, 0x00a2bee8, 0x027ad179, 0x01a5bc0d, 0x011a2b63, 0x039acef2, 0x018fc403, 0x03ef2e2c, 0x002e9f4e}}, Y: Field{[10]uint32{0x015114dc, 0x03bf2ba9, 0x02e097c6, 0x02c5eefc, 0x01376f29, 0x0316daf6, 0x0133ed0b, 0x0278c443, 0x02673312, 0x003fffe6}}}, + {X: Field{[10]uint32{0x036157a8, 0x010a4380, 0x03011190, 0x03ea5fbc, 0x00218898, 0x025935e9, 0x01972582, 0x0270d65d, 0x01c02a4f, 0x00383655}}, Y: Field{[10]uint32{0x01c617f0, 0x02ee6140, 0x0397baa2, 0x01a75699, 0x01b28cbc, 0x021c1de2, 0x0382f0f0, 0x002ee681, 0x039e7d42, 0x0005dbf7}}}, + {X: Field{[10]uint32{0x03f81ac9, 0x0111d42f, 0x02dcd0a4, 0x03f785d4, 0x036cd226, 0x01a435aa, 0x02da689c, 0x032e4c44, 0x01408320, 0x0005acb0}}, Y: Field{[10]uint32{0x018bb281, 0x031de436, 0x01edd2ab, 0x02494f19, 0x025025f7, 0x02a85edb, 0x0217488f, 0x00e4cbc9, 0x00e3dafd, 0x000a8beb}}}, + {X: Field{[10]uint32{0x01f502da, 0x00af043a, 0x020c7fc2, 0x02e3ad36, 0x02220db4, 0x02569053, 0x01d61d97, 0x00f8bd91, 0x00329c82, 0x000beec1}}, Y: Field{[10]uint32{0x00ebc31d, 0x02d89664, 0x00246a0a, 0x0239a7d6, 0x030cbfe5, 0x021c1a2a, 0x03cda69c, 0x0377eeae, 0x02ef15ea, 0x0006b7d9}}}, + {X: Field{[10]uint32{0x03208ebf, 0x00b79399, 0x01ccce13, 0x020e3277, 0x02c178f8, 0x00135915, 0x0122f2f4, 0x0095e6d9, 0x00daf42d, 0x0019244d}}, Y: Field{[10]uint32{0x009355cb, 0x015b0efc, 0x00e8a4a7, 0x0147f991, 0x02e7709b, 0x02a6ba96, 0x00446480, 0x012f09e2, 0x03fc3c55, 0x0010e16a}}}, + {X: Field{[10]uint32{0x013991cd, 0x03b7e2c3, 0x03023dbc, 0x02c2e264, 0x03128d62, 0x0271ff7b, 0x0201c172, 0x007e7381, 0x00b1dcb8, 0x002e5551}}, Y: Field{[10]uint32{0x029dcd2a, 0x0314e0dd, 0x02b0f33c, 0x01824f02, 0x03206fe7, 0x013c1c9b, 0x01f2d450, 0x0378cb54, 0x02dcffba, 0x003e1c7e}}}, + {X: Field{[10]uint32{0x01d668de, 0x00f03297, 0x0389fd06, 0x005c0a23, 0x02ace1ea, 0x012c6c25, 0x03df5b4a, 0x03430288, 0x03fc5034, 0x0033500e}}, Y: Field{[10]uint32{0x02717742, 0x0387f509, 0x0316054e, 0x01529763, 0x023fa92e, 0x00e92fc3, 0x0359760f, 0x03d1bd27, 0x0131aa56, 0x00304a58}}}, + {X: Field{[10]uint32{0x0004c581, 0x03a91e0f, 0x019394b6, 0x01e656d3, 0x021ad784, 0x026a3d5a, 0x0202074c, 0x02f72640, 0x0337d7f8, 0x000292ab}}, Y: Field{[10]uint32{0x0316da34, 0x00d234eb, 0x03431009, 0x032ce22b, 0x031a8cb9, 0x001dcf5c, 0x02594f94, 0x02d873f4, 0x02f2dc02, 0x00132ced}}}, + {X: Field{[10]uint32{0x03f438c4, 0x01f67e2a, 0x039376c3, 0x031f9b9e, 0x0297478f, 0x021915e3, 0x02dd3c52, 0x00123a17, 0x03f8ebdf, 0x0015c40b}}, Y: Field{[10]uint32{0x00161d4f, 0x00763bbe, 0x01128833, 0x005a42ad, 0x01915aef, 0x0146cbcc, 0x01e308c2, 0x00658b9e, 0x019beaec, 0x003213c7}}}, + {X: Field{[10]uint32{0x03c9b6ac, 0x02c188e8, 0x01774832, 0x02171a02, 0x01124246, 0x03ebf1c0, 0x00c08c58, 0x017f8442, 0x00e93c5c, 0x001a3fa6}}, Y: Field{[10]uint32{0x004df273, 0x02033e43, 0x01cd4d64, 0x023fba1c, 0x03cb5ea5, 0x011bc878, 0x00078e2c, 0x01ae1fba, 0x0017fd95, 0x00124ab1}}}, + {X: Field{[10]uint32{0x024a5e77, 0x022f900a, 0x03d43ec0, 0x028ac224, 0x03d97bae, 0x00bba92a, 0x0132cef0, 0x0388ebc2, 0x03b69ef5, 0x0000352e}}, Y: Field{[10]uint32{0x03c7c98c, 0x03e92c11, 0x00166607, 0x0130a8b7, 0x019e7488, 0x00334231, 0x01e223df, 0x02b8c7d9, 0x02609c1d, 0x00016063}}}, + {X: Field{[10]uint32{0x0283192a, 0x01f9a416, 0x03b5d68c, 0x00fdd8fc, 0x0123a5c5, 0x022b314f, 0x00d872f2, 0x022dc9fc, 0x0157a8eb, 0x003a589e}}, Y: Field{[10]uint32{0x010d984f, 0x026ea1f3, 0x008d66e5, 0x015d3d68, 0x020cab10, 0x01329b32, 0x0066d17d, 0x005a5b65, 0x027ddc29, 0x00176a4b}}}, + {X: Field{[10]uint32{0x0311caf5, 0x008e0bc5, 0x032076dd, 0x03cb7e0f, 0x001cd547, 0x003e7fa1, 0x0108ffb7, 0x03cbadf1, 0x00ada83b, 0x00127c87}}, Y: Field{[10]uint32{0x01f31931, 0x022497ce, 0x00114ca1, 0x00693fb6, 0x03244761, 0x00cb9bbf, 0x033afc21, 0x013b62b1, 0x01295f83, 0x00071f60}}}, + {X: Field{[10]uint32{0x02fa792e, 0x034060ab, 0x0364dfd6, 0x03316c3f, 0x006c34a8, 0x0061c4f5, 0x011d110c, 0x00754c53, 0x02a940f6, 0x000160a0}}, Y: Field{[10]uint32{0x005f6ddd, 0x03c28d04, 0x0091e677, 0x0124fab0, 0x012a96ee, 0x0360f5f7, 0x03701457, 0x03cb5948, 0x0155d3e0, 0x001e1578}}}, + {X: Field{[10]uint32{0x03ca118d, 0x01a46648, 0x012e5f55, 0x039d0f52, 0x01dc3a14, 0x01c2fb1f, 0x01db6f1d, 0x0009e9ed, 0x02324b07, 0x0032725e}}, Y: Field{[10]uint32{0x0264b56d, 0x035d31a5, 0x001e8747, 0x03678bb1, 0x0115d600, 0x03080cae, 0x031e99f7, 0x037f870a, 0x000f894d, 0x003d807d}}}, + {X: Field{[10]uint32{0x019e054e, 0x00568845, 0x0062b8d5, 0x0332a9ca, 0x039bbbe0, 0x0047e49c, 0x027bcdda, 0x01d4061a, 0x01758ed6, 0x00279370}}, Y: Field{[10]uint32{0x03c6c0ab, 0x020e04f3, 0x03d3bc94, 0x0321c57a, 0x03fcf4f4, 0x026df8db, 0x00736aa1, 0x019a9af8, 0x031f2bb8, 0x00328470}}}, + {X: Field{[10]uint32{0x02afe2b5, 0x03c31ae2, 0x0152f7a7, 0x03d89a3d, 0x028e5af1, 0x0337ef76, 0x00c1e5e8, 0x000c2f36, 0x03893ae0, 0x003f418d}}, Y: Field{[10]uint32{0x01c8e676, 0x008754c3, 0x00435b2e, 0x02037c68, 0x01f4a354, 0x00c9b700, 0x0068a8e4, 0x01d12881, 0x030b068d, 0x0023027a}}}, + {X: Field{[10]uint32{0x014af04e, 0x00ac9cbf, 0x02c77b3f, 0x02d6d19b, 0x00d85360, 0x004ddd60, 0x0281c3ec, 0x01d9466e, 0x033b6e7a, 0x000df7f7}}, Y: Field{[10]uint32{0x00fb7844, 0x02d3e3b4, 0x01727ea3, 0x0217b250, 0x03043dcd, 0x0004a79d, 0x00f3b078, 0x009d635e, 0x03b27b73, 0x00330c4d}}}, + {X: Field{[10]uint32{0x001dbae0, 0x0291751b, 0x018ffe72, 0x0127785b, 0x010a69cb, 0x034af832, 0x01a2f18b, 0x038971dc, 0x006ac8a5, 0x00117bc4}}, Y: Field{[10]uint32{0x020ab158, 0x022da608, 0x00bf42ad, 0x006cc646, 0x0060e568, 0x00058d24, 0x03bd452e, 0x01f6dcfd, 0x000d742e, 0x0032b5a9}}}, + {X: Field{[10]uint32{0x01fdfca4, 0x0091a704, 0x02d14be0, 0x036f0414, 0x0099648c, 0x011cafd6, 0x03cde710, 0x0328941c, 0x02f988b9, 0x00096314}}, Y: Field{[10]uint32{0x01939dfd, 0x02be7b0a, 0x00ffc359, 0x02e20e53, 0x010d60d0, 0x0296d87f, 0x026c9e21, 0x0171f1a9, 0x008b26ea, 0x00112476}}}, + {X: Field{[10]uint32{0x01e65217, 0x014464ea, 0x01c83afd, 0x019f7a20, 0x01d4f8ff, 0x034dbc76, 0x00cddb90, 0x0138d8f4, 0x00a7727c, 0x002f24a9}}, Y: Field{[10]uint32{0x03aa5120, 0x004c4898, 0x039d79dd, 0x02d2e8dd, 0x00331c22, 0x01193a70, 0x031c024d, 0x011e5587, 0x0208b18b, 0x001dbfda}}}, + {X: Field{[10]uint32{0x01f27ebd, 0x0304b451, 0x03353249, 0x00dfed7f, 0x0223e4e8, 0x03055aef, 0x01ceccb0, 0x0120d3c4, 0x00c258c0, 0x0022867a}}, Y: Field{[10]uint32{0x00e92c1a, 0x017941f9, 0x01f065d6, 0x032e1706, 0x018f50a9, 0x02e5e3f8, 0x016caca2, 0x023a8831, 0x0070bff4, 0x00057f1b}}}, + {X: Field{[10]uint32{0x01d70eea, 0x02447a95, 0x00572d9c, 0x02a30a91, 0x03e6f3b1, 0x00e65a2f, 0x013c1a7a, 0x00d136c4, 0x02d1ab90, 0x003966e0}}, Y: Field{[10]uint32{0x013b91be, 0x00abf20c, 0x00b80cc2, 0x02640205, 0x036634d6, 0x00baa9db, 0x01f0bc01, 0x01a86f93, 0x018cd58c, 0x002478cf}}}, + {X: Field{[10]uint32{0x0371a7d0, 0x000c6c1c, 0x03eb3330, 0x034976b2, 0x020f3456, 0x03e506fa, 0x0017db72, 0x01335af1, 0x025f8824, 0x003e653b}}, Y: Field{[10]uint32{0x019c62e2, 0x0102816b, 0x03d40514, 0x027d09c1, 0x03d9c268, 0x036b923d, 0x02bf9c04, 0x0266ccc0, 0x006aecc2, 0x002409be}}}, + {X: Field{[10]uint32{0x0000410f, 0x00e9a4de, 0x015ffc1e, 0x03355976, 0x018000cc, 0x0200f448, 0x0317bc79, 0x03e9409e, 0x008c32d1, 0x001ddb13}}, Y: Field{[10]uint32{0x00785149, 0x03c2eb72, 0x03803165, 0x0298e104, 0x01988b64, 0x00f4f8c6, 0x00201d50, 0x01dce1be, 0x0234438e, 0x00103b38}}}, + {X: Field{[10]uint32{0x01c9b12e, 0x00feb96d, 0x02620fb8, 0x022b1780, 0x0032c196, 0x02fc95cc, 0x00aea3d8, 0x02c004a7, 0x01a5dd13, 0x000e4d9d}}, Y: Field{[10]uint32{0x035a8b00, 0x0129a7e9, 0x02dc0378, 0x01cd39d0, 0x032e5dc7, 0x02c3af30, 0x016ff4c4, 0x00033bb4, 0x03c47934, 0x000e79b3}}}, + {X: Field{[10]uint32{0x03401b1e, 0x027ea330, 0x00eaa2f0, 0x03c9efce, 0x0094dcfd, 0x0242f87f, 0x01de130e, 0x031ed8b3, 0x029422ed, 0x0035f374}}, Y: Field{[10]uint32{0x014fb184, 0x031c194d, 0x00302db5, 0x03662fc5, 0x020728bd, 0x031e7ad1, 0x00ca141d, 0x03462edd, 0x0328073c, 0x00372e72}}}, + {X: Field{[10]uint32{0x0256bc2c, 0x019f73db, 0x021b99cb, 0x01ea6216, 0x01902613, 0x00925274, 0x02206718, 0x011278fd, 0x01272726, 0x002f38fc}}, Y: Field{[10]uint32{0x02e76217, 0x0355e1b9, 0x0097d296, 0x01f714a9, 0x011c33c3, 0x02b4496b, 0x0168f040, 0x037692fa, 0x0017ee92, 0x00290900}}}, + {X: Field{[10]uint32{0x035d6e52, 0x037ba5ff, 0x01eb9738, 0x00ddd0e6, 0x03700801, 0x0078d7eb, 0x02daf442, 0x010529e6, 0x00cdefe9, 0x00277c26}}, Y: Field{[10]uint32{0x01abf15d, 0x0223ae94, 0x01baf3b7, 0x02d36fbc, 0x03f04bf4, 0x01a45f65, 0x0317bb80, 0x0250f343, 0x035fef36, 0x001afe48}}}, + {X: Field{[10]uint32{0x03d43f1d, 0x0332536c, 0x02522e8d, 0x02d1c888, 0x0005d88a, 0x0249c4e8, 0x00839a82, 0x03712a69, 0x002ee561, 0x00265616}}, Y: Field{[10]uint32{0x028c226a, 0x013a2341, 0x00dc78cb, 0x02cd0ed7, 0x02850008, 0x00966cde, 0x0376cba2, 0x03c8fa1b, 0x0214b63a, 0x00382562}}}, + {X: Field{[10]uint32{0x01fb1f24, 0x024cf11b, 0x02871bad, 0x01e548ce, 0x03dda933, 0x02230122, 0x0292447c, 0x009e79f4, 0x00ce7d7b, 0x000f9fee}}, Y: Field{[10]uint32{0x008806e5, 0x01bb2b59, 0x0309d229, 0x02aa4e17, 0x02e36352, 0x001ae92f, 0x037a5dd9, 0x0208e4b5, 0x01083410, 0x000109e7}}}, + {X: Field{[10]uint32{0x01e8ed62, 0x0029a8dd, 0x001c71ac, 0x01a7f2da, 0x0097611d, 0x0209b3d6, 0x02c93ee7, 0x01684433, 0x0050f740, 0x00073415}}, Y: Field{[10]uint32{0x0334d0f0, 0x02880eeb, 0x0136b039, 0x017264c6, 0x025759d3, 0x002e54db, 0x020a3a02, 0x02c10358, 0x0070bb52, 0x000216ef}}}, + {X: Field{[10]uint32{0x03c9b367, 0x02b6fdf5, 0x005e3c76, 0x03283ed3, 0x0393cf99, 0x02e040cb, 0x0387bd01, 0x0168f7db, 0x03763214, 0x0001411d}}, Y: Field{[10]uint32{0x03d1d2c3, 0x01820115, 0x03f7a1ed, 0x008e2132, 0x00a0e67b, 0x031c7d06, 0x02b97ce6, 0x01ddc627, 0x0359919c, 0x0001eeb7}}}, + {X: Field{[10]uint32{0x0070e6ea, 0x03de8391, 0x030be636, 0x00afdfcb, 0x0079fd30, 0x03452629, 0x01b8d87a, 0x012ea0c2, 0x02c949b6, 0x0007aa44}}, Y: Field{[10]uint32{0x002b7650, 0x0021b401, 0x02b4d029, 0x039b3e0e, 0x014acd50, 0x0140aba3, 0x014896d3, 0x00477a10, 0x03dd0b12, 0x0026c9e7}}}, + {X: Field{[10]uint32{0x01a01628, 0x00c0a3c8, 0x007ac8c0, 0x026f4bd3, 0x03e1ed32, 0x017c0f12, 0x00e0b009, 0x001daf2d, 0x00d34b00, 0x0026cfe8}}, Y: Field{[10]uint32{0x03d420de, 0x02549f09, 0x01f4126e, 0x035543bf, 0x038cef81, 0x033b1987, 0x00d5dcb0, 0x023bd4b8, 0x0248b2a5, 0x0004045e}}}, + {X: Field{[10]uint32{0x024c94eb, 0x01e3f020, 0x03e22ff6, 0x00a34095, 0x036200d1, 0x02eb4530, 0x02c7f7f5, 0x027712ce, 0x03b801d3, 0x00197fbd}}, Y: Field{[10]uint32{0x0308b475, 0x026bc249, 0x032fe325, 0x03b1e80a, 0x02f2dcd6, 0x01bbc9db, 0x0373b9b3, 0x013f09dc, 0x01ee680c, 0x000c0878}}}, + {X: Field{[10]uint32{0x0385f9ac, 0x00a45fdf, 0x01d46c5a, 0x02ee3f7b, 0x036ef5e1, 0x030afbd6, 0x004c0f2b, 0x00e95419, 0x023daf76, 0x000f9dec}}, Y: Field{[10]uint32{0x024f3221, 0x02cf930a, 0x0021b415, 0x021443f4, 0x018d4fc7, 0x00b6cb1e, 0x03f0766a, 0x01e1e671, 0x00e95bb0, 0x00156c9e}}}, + {X: Field{[10]uint32{0x01de2965, 0x023022c8, 0x0378396f, 0x0228c8cb, 0x02f69fbf, 0x0335f4d4, 0x0215fba1, 0x0248af11, 0x02bf2fec, 0x000ab136}}, Y: Field{[10]uint32{0x019f957f, 0x03cfab08, 0x0089fa92, 0x00947bfc, 0x006d6494, 0x03e16946, 0x03e60187, 0x022f3c0a, 0x00177623, 0x000b0cf0}}}, + {X: Field{[10]uint32{0x0162c66e, 0x0150a153, 0x0155868d, 0x03c65f8c, 0x03748be0, 0x00acb3ae, 0x01feac74, 0x00134215, 0x022067da, 0x003faf22}}, Y: Field{[10]uint32{0x01d96083, 0x012a3499, 0x03bd1a55, 0x01b6898a, 0x01e3db34, 0x004169dc, 0x029d583e, 0x0398ffe6, 0x02873d45, 0x002bb8e4}}}, + {X: Field{[10]uint32{0x0206a569, 0x023da261, 0x038d3e1c, 0x000b7138, 0x02026542, 0x01715006, 0x002d10bd, 0x009d4623, 0x00b4a598, 0x0029045d}}, Y: Field{[10]uint32{0x03732a00, 0x0021fa47, 0x0367e3bd, 0x00be3643, 0x016b589f, 0x020ad947, 0x0165337e, 0x03e17b1a, 0x03b99fb5, 0x002f1ad8}}}, + {X: Field{[10]uint32{0x025de220, 0x02919396, 0x02ae93a3, 0x0134f2bc, 0x02907c19, 0x004bdd26, 0x0397fc6d, 0x028ebcee, 0x02cf5d10, 0x00048865}}, Y: Field{[10]uint32{0x0304e533, 0x031ba4a4, 0x032b946f, 0x03175016, 0x01674697, 0x02508ff7, 0x00e2c7c5, 0x03884d51, 0x0342b3c1, 0x00333d19}}}, + {X: Field{[10]uint32{0x021eadb3, 0x02d98f0b, 0x0373e799, 0x0187a38e, 0x019f93ec, 0x03219dd8, 0x03bfaa08, 0x03731f86, 0x01cb0104, 0x001deeb5}}, Y: Field{[10]uint32{0x02faa3cc, 0x03a18271, 0x00fea411, 0x02317bc2, 0x014023fd, 0x03c948bb, 0x021214dd, 0x037afd23, 0x007bad8b, 0x0002225d}}}, + {X: Field{[10]uint32{0x02d4a98b, 0x005faec4, 0x015d2f55, 0x0225a578, 0x024e3f6c, 0x00cc9f9b, 0x01451637, 0x02b505ab, 0x00758c49, 0x0007a350}}, Y: Field{[10]uint32{0x023b09f4, 0x01a05803, 0x01cd1259, 0x02835220, 0x0398d94a, 0x032f13e0, 0x03379a2e, 0x02986726, 0x00b00730, 0x000745b3}}}, + {X: Field{[10]uint32{0x03b6ee42, 0x01a7e97e, 0x028cfb18, 0x02b3d280, 0x01880ff2, 0x03ed6d4d, 0x03f4974a, 0x01077521, 0x016b2402, 0x00321e99}}, Y: Field{[10]uint32{0x02757beb, 0x02bfdc2f, 0x01cb76dd, 0x02a2d326, 0x0134f694, 0x029a9e43, 0x0174412f, 0x0254e17b, 0x033a6fac, 0x0005bc97}}}, + {X: Field{[10]uint32{0x0355a4eb, 0x02f67092, 0x03b8071f, 0x005b9ce4, 0x01669adf, 0x03385a81, 0x0369944c, 0x01ba23a5, 0x0007482c, 0x0025ac05}}, Y: Field{[10]uint32{0x00b50223, 0x02fffee5, 0x00ca4578, 0x03886c5e, 0x0082b786, 0x021a2006, 0x00d68de3, 0x0213c382, 0x02805903, 0x002ccaf8}}}, + {X: Field{[10]uint32{0x01ae4af5, 0x02fe211b, 0x01eff7eb, 0x01888b87, 0x00b2afd1, 0x01b423d5, 0x0272fb74, 0x018b9a07, 0x00b37395, 0x000483da}}, Y: Field{[10]uint32{0x000bcc78, 0x0305a40c, 0x00743ded, 0x02758572, 0x0102f4da, 0x03643853, 0x03c6729b, 0x01dbe51d, 0x034f2b23, 0x001f07ad}}}, + {X: Field{[10]uint32{0x02acd157, 0x03177139, 0x00989b65, 0x0074a170, 0x0049a441, 0x00923fba, 0x008be2cf, 0x02d15618, 0x01ec2789, 0x0039921c}}, Y: Field{[10]uint32{0x00e10a6b, 0x01d8a516, 0x02145843, 0x039740bc, 0x02f3dbfa, 0x017be47f, 0x039ecfd4, 0x02c2d56d, 0x02d14999, 0x000a602c}}}, + {X: Field{[10]uint32{0x026798ad, 0x010e18ea, 0x012660eb, 0x03894ea3, 0x0243daa1, 0x01cf9721, 0x0324adfc, 0x00f8b094, 0x0009b20d, 0x001822c4}}, Y: Field{[10]uint32{0x010e13df, 0x03f8b223, 0x0038b3b4, 0x00f10fbf, 0x03a021e1, 0x033c3998, 0x0181c68c, 0x0258e144, 0x0203ad5c, 0x00209b96}}}, + {X: Field{[10]uint32{0x01bb152a, 0x017e1068, 0x033e57c6, 0x00ada142, 0x00cdc4dc, 0x01bd306a, 0x02614353, 0x03917d82, 0x01558132, 0x002325e0}}, Y: Field{[10]uint32{0x037460fc, 0x03504df6, 0x0344ba6e, 0x00f670c6, 0x001875d6, 0x02193c65, 0x01083c53, 0x0207bc2a, 0x0098394d, 0x00328ecc}}}, + {X: Field{[10]uint32{0x0021bf3e, 0x0323e366, 0x00627f80, 0x015da084, 0x03100727, 0x0380441b, 0x018e731c, 0x00920be3, 0x011ac73b, 0x0000d4d6}}, Y: Field{[10]uint32{0x01eb6412, 0x02131ed0, 0x03df9d4f, 0x02067d12, 0x0370ae89, 0x009823aa, 0x02306db0, 0x02d1a6b1, 0x011a501a, 0x000adf8f}}}, + {X: Field{[10]uint32{0x00d78857, 0x03710c27, 0x02978b05, 0x01f6a7f6, 0x023c387b, 0x01e3f38c, 0x0270a671, 0x01cdcbb3, 0x0188ec35, 0x003acb7f}}, Y: Field{[10]uint32{0x024b88e4, 0x011fbc68, 0x01f6318c, 0x01ff2828, 0x023dd7aa, 0x02148dcb, 0x001a8cf9, 0x01548711, 0x02ed1f5a, 0x001bcaed}}}, + {X: Field{[10]uint32{0x012eb279, 0x03fdcca6, 0x00487b29, 0x03a619cb, 0x00abd72a, 0x03bbd9b7, 0x018f3b07, 0x001439a6, 0x03f65db1, 0x00290703}}, Y: Field{[10]uint32{0x01a99cd4, 0x0147bba6, 0x00244ba9, 0x03acaab3, 0x03bc0786, 0x014841c9, 0x019d7f86, 0x03fe77d8, 0x03205616, 0x0015be9e}}}, + {X: Field{[10]uint32{0x02217e92, 0x009395e8, 0x00ea9415, 0x02b6186f, 0x01615d85, 0x021677c4, 0x005917e0, 0x00540329, 0x0335f5bb, 0x00239d22}}, Y: Field{[10]uint32{0x00a46df8, 0x01d78fbf, 0x0266c9ef, 0x028e5b3f, 0x00825515, 0x025cef14, 0x03f86043, 0x031a9e12, 0x0362e226, 0x0015504c}}}, + {X: Field{[10]uint32{0x02dd17e5, 0x0354d709, 0x03708f35, 0x009f3339, 0x02bc506c, 0x01fb1eff, 0x00de2c7b, 0x001891cf, 0x0007cce7, 0x002a0fd8}}, Y: Field{[10]uint32{0x026af268, 0x00edd318, 0x02cbb26c, 0x005221e8, 0x015a1ac6, 0x03543585, 0x0397a379, 0x01f9718c, 0x012daf21, 0x002b523b}}}, + {X: Field{[10]uint32{0x0282d2fa, 0x022bfb44, 0x033abf11, 0x0376d1d5, 0x025cf208, 0x03f4e5f7, 0x000246eb, 0x0058924e, 0x02927e45, 0x003e7b5e}}, Y: Field{[10]uint32{0x00237b70, 0x02eed772, 0x01324087, 0x001ed2f9, 0x0303c844, 0x01c34e03, 0x015d53c6, 0x00c3de03, 0x02163a6f, 0x003055d1}}}, + {X: Field{[10]uint32{0x002ea08e, 0x00499c9b, 0x0255af01, 0x00491b14, 0x02c7dff0, 0x03c27e04, 0x01177078, 0x031e99fe, 0x038a175e, 0x0028af79}}, Y: Field{[10]uint32{0x01ca12ec, 0x004c8f72, 0x01e20b09, 0x00aa976e, 0x013b5dd6, 0x037140fe, 0x03d27419, 0x01302db5, 0x018fe82d, 0x001c495a}}}, + {X: Field{[10]uint32{0x039899b2, 0x03a88c6f, 0x01a56e62, 0x010b861d, 0x036b37da, 0x02385a42, 0x01cc0e9b, 0x019cda41, 0x01c79dcb, 0x0032a301}}, Y: Field{[10]uint32{0x0087534c, 0x003c67c5, 0x0199641d, 0x0275c4e2, 0x02275125, 0x03eea72a, 0x0160c1e3, 0x02b6e999, 0x01ca1e19, 0x00141314}}}, + {X: Field{[10]uint32{0x00eca02b, 0x01ec0655, 0x0397c061, 0x008725e7, 0x0061fd4b, 0x0140609e, 0x037ecdd1, 0x004eb104, 0x02ee61db, 0x0003f041}}, Y: Field{[10]uint32{0x03bef3ee, 0x0265945e, 0x0308e6bc, 0x035d724b, 0x02971f2c, 0x037168b0, 0x03ce9c2c, 0x0198e0ab, 0x02284fc2, 0x001b6956}}}, + {X: Field{[10]uint32{0x0092a8ab, 0x02da9c59, 0x0390b8b9, 0x012f0be3, 0x03504f67, 0x02b1e11b, 0x019a3217, 0x0041a150, 0x0039f47b, 0x000b2c86}}, Y: Field{[10]uint32{0x000a5757, 0x0204927c, 0x017aff10, 0x00cc116a, 0x00637264, 0x01978bf2, 0x0007feb9, 0x00112bda, 0x0332ae75, 0x00007fac}}}, + {X: Field{[10]uint32{0x0161f3ae, 0x03c84c95, 0x002245d4, 0x01c9e65c, 0x0356ba35, 0x02e957b6, 0x022963ef, 0x001ffff2, 0x00ee759c, 0x0019e314}}, Y: Field{[10]uint32{0x02cba96c, 0x022ffd2b, 0x03107c49, 0x015f6a9d, 0x01780b16, 0x00e2787e, 0x03afce2d, 0x00130724, 0x0387abbf, 0x0006626d}}}, + {X: Field{[10]uint32{0x024aa6fc, 0x00724420, 0x01da41b2, 0x032907cf, 0x0275d407, 0x002cbc99, 0x015097c3, 0x00d36608, 0x01ceaa2e, 0x002ad8f8}}, Y: Field{[10]uint32{0x00e2363c, 0x00955a9b, 0x00d82479, 0x0395f43d, 0x02812eb7, 0x011506b5, 0x01d3da2c, 0x03fdc9c5, 0x02611150, 0x003b196f}}}, + {X: Field{[10]uint32{0x003dd336, 0x02466ba4, 0x03cc9f5c, 0x01e6c14a, 0x03ec5672, 0x00499260, 0x0239a2a3, 0x02565d69, 0x01cafad5, 0x0029a4e6}}, Y: Field{[10]uint32{0x010d97dd, 0x00f84bb1, 0x017551c4, 0x012d8d24, 0x001c8730, 0x024eb8d2, 0x02799dcc, 0x013d369e, 0x0259c30c, 0x002d4971}}}, + {X: Field{[10]uint32{0x00fc5f3e, 0x01d4ef70, 0x001fbe13, 0x02bf4ef9, 0x00bd7a48, 0x00e720b4, 0x01cb5ed4, 0x033d7b49, 0x0282507b, 0x000cafd0}}, Y: Field{[10]uint32{0x0279bff2, 0x02eda543, 0x0033ac20, 0x02607a00, 0x026773c5, 0x038d1fa0, 0x0282f90b, 0x0367f495, 0x017a4336, 0x00336480}}}, + {X: Field{[10]uint32{0x02dfd862, 0x00ba6e3b, 0x032ec5e4, 0x0213da06, 0x02f2fe64, 0x005141c5, 0x003e2cc1, 0x000259c8, 0x01837e72, 0x00287f32}}, Y: Field{[10]uint32{0x01ed4fd7, 0x01b0c58c, 0x03a964ba, 0x03f6f05f, 0x02a419af, 0x008b7927, 0x03fa79a7, 0x03ee277f, 0x02c317e8, 0x000785ad}}}, + {X: Field{[10]uint32{0x030ceae0, 0x02ccae5f, 0x00838472, 0x03cceafa, 0x0360485c, 0x0073dce2, 0x01f1e822, 0x01f94063, 0x014e6961, 0x0036168c}}, Y: Field{[10]uint32{0x000a52f1, 0x02a8d9f8, 0x024e86e1, 0x033ccc22, 0x00fbbcba, 0x02229e6d, 0x034b5daa, 0x0379999a, 0x03eee92d, 0x001c683f}}}, + {X: Field{[10]uint32{0x020c2e7f, 0x000feabc, 0x0224e4ee, 0x017a010f, 0x02f5a53b, 0x00d5bab0, 0x01b20e31, 0x031c3905, 0x02fa0688, 0x00062489}}, Y: Field{[10]uint32{0x01515aa6, 0x0161f7bc, 0x00eaa1a0, 0x01fe54b9, 0x02fc2bba, 0x0261f3d8, 0x00be5759, 0x0354f9ef, 0x00ac40c7, 0x00366ff6}}}, + {X: Field{[10]uint32{0x019e1330, 0x001c2695, 0x01241ff7, 0x009534b6, 0x0132465d, 0x00b3c84d, 0x02674e63, 0x00458b5e, 0x020a6a93, 0x0034d50b}}, Y: Field{[10]uint32{0x0357c369, 0x01e645d2, 0x032bf9a0, 0x021012c7, 0x03dbd427, 0x008aef60, 0x00be5ed6, 0x0108d0d3, 0x0351e266, 0x000097a3}}}, + {X: Field{[10]uint32{0x013a2bc5, 0x01af861d, 0x0245f287, 0x016ab6ff, 0x029a8c0a, 0x0161d615, 0x006e6b82, 0x02d8487b, 0x0286fb2c, 0x00145367}}, Y: Field{[10]uint32{0x03cbf261, 0x02a10615, 0x0179145c, 0x02f1218a, 0x011b8370, 0x0197de76, 0x01918d9f, 0x008f10d0, 0x01c0be54, 0x001c01e1}}}, + {X: Field{[10]uint32{0x023fe495, 0x01a128fa, 0x03f6ad6d, 0x0188b5c8, 0x0343f9aa, 0x02b981aa, 0x031db335, 0x0333f787, 0x036512e9, 0x00327e18}}, Y: Field{[10]uint32{0x0230270b, 0x00efac87, 0x01db3a3b, 0x0163cc7d, 0x01b7b80b, 0x0372f8ee, 0x02f9445d, 0x02807271, 0x02313868, 0x000c34e9}}}, + {X: Field{[10]uint32{0x002deb93, 0x03481bcb, 0x00768357, 0x029cae42, 0x03641200, 0x0039e436, 0x00cd96fa, 0x0227f826, 0x020c8fc0, 0x000089bc}}, Y: Field{[10]uint32{0x025f66bc, 0x00ee56aa, 0x00cff1c0, 0x01bfb860, 0x015e0262, 0x012d0f6a, 0x03c20452, 0x024d880f, 0x03b8b43e, 0x000b88fe}}}, + {X: Field{[10]uint32{0x035350bd, 0x0125adb2, 0x03da0a38, 0x03f62366, 0x019fcc79, 0x02e29f98, 0x019bd9e6, 0x03e531c8, 0x0268d4b6, 0x00286c9d}}, Y: Field{[10]uint32{0x02d68a32, 0x013ccb75, 0x01b94264, 0x01d2dcae, 0x01c96b5f, 0x0003f57b, 0x02a62bc2, 0x0305ab9e, 0x005eb6e1, 0x000e4cff}}}, + {X: Field{[10]uint32{0x03e28887, 0x0037dfab, 0x01ae38c4, 0x01f05643, 0x0357dd4e, 0x02023ac2, 0x03b71810, 0x02f0c47d, 0x02570087, 0x00043c4d}}, Y: Field{[10]uint32{0x03366d84, 0x031ba178, 0x03995db5, 0x02d29e68, 0x02291338, 0x00753b73, 0x02c570d9, 0x030fb139, 0x008709bd, 0x000694b9}}}, + {X: Field{[10]uint32{0x01be3e46, 0x03861073, 0x01884273, 0x03623e62, 0x00f613b3, 0x0003717b, 0x03558615, 0x03d60fe7, 0x00eea984, 0x00022aa8}}, Y: Field{[10]uint32{0x0133260d, 0x025f48a8, 0x017b8f21, 0x016055b6, 0x0124e564, 0x00bc91bb, 0x02c46abc, 0x009df700, 0x01540f85, 0x0014a588}}}, + {X: Field{[10]uint32{0x01c89d2e, 0x019990fc, 0x034aa3bd, 0x03be96e2, 0x00dc9472, 0x01ea4ea6, 0x0397ce5f, 0x02c6de6c, 0x02710024, 0x000ca016}}, Y: Field{[10]uint32{0x003091fd, 0x01439621, 0x002a2f4d, 0x019702e2, 0x029e23c7, 0x00a9d3b5, 0x02d0a858, 0x00e7d734, 0x007cb7c1, 0x002bd497}}}, + {X: Field{[10]uint32{0x01412451, 0x0141d26a, 0x02b12cde, 0x030a1fda, 0x01058db0, 0x03ce9483, 0x030835a4, 0x035125fe, 0x00cc909a, 0x0031cbc4}}, Y: Field{[10]uint32{0x02c7c65a, 0x0044b5bc, 0x03030a7a, 0x00c99d19, 0x03b8e2ca, 0x0192d83c, 0x015ff15b, 0x02ea78df, 0x027d5197, 0x0029599b}}}, + {X: Field{[10]uint32{0x03fc9a22, 0x0082195d, 0x01f97c03, 0x016b5301, 0x0172c0fa, 0x0080ef50, 0x01a74adc, 0x0046c905, 0x00c78702, 0x001bb1da}}, Y: Field{[10]uint32{0x031b09fb, 0x009833ab, 0x014d05da, 0x010b6d9f, 0x03b51cbf, 0x01527230, 0x01e67100, 0x036ec249, 0x02220aa2, 0x00060e52}}}, + {X: Field{[10]uint32{0x00a64737, 0x00e9c70f, 0x01e61dc9, 0x0343bbe4, 0x01a846e7, 0x01c117f2, 0x01061438, 0x03455981, 0x03bbff99, 0x00378dba}}, Y: Field{[10]uint32{0x000f4270, 0x0292d3a4, 0x00c81b39, 0x02e86d34, 0x00488208, 0x011db138, 0x0247dcda, 0x02cded01, 0x02520f3c, 0x0031605d}}}, + {X: Field{[10]uint32{0x00c00218, 0x0082adcf, 0x0297bc0c, 0x008ad1a8, 0x0019bea3, 0x037a9bd3, 0x0001ef86, 0x03f1a16b, 0x015d5538, 0x003d4d05}}, Y: Field{[10]uint32{0x03b9523c, 0x0355c1ac, 0x026030d3, 0x013c5376, 0x03f9d092, 0x028b4494, 0x02b38a49, 0x02632bbb, 0x01f2979d, 0x0013eadf}}}, + {X: Field{[10]uint32{0x0286129d, 0x01ff304c, 0x035210bc, 0x0223436a, 0x0008db20, 0x0156da1f, 0x00ecb981, 0x02409420, 0x0050a1db, 0x0036bf6e}}, Y: Field{[10]uint32{0x011ada22, 0x03cbfbd9, 0x0291aa2e, 0x014183ff, 0x027d0ccc, 0x00dbeef4, 0x02be601f, 0x013050ff, 0x03fcae6c, 0x0010e597}}}, + {X: Field{[10]uint32{0x01d705ce, 0x027e7d26, 0x03721299, 0x01a5a02c, 0x022efe40, 0x00cf31a7, 0x016893ee, 0x02f21460, 0x02211dca, 0x002b2682}}, Y: Field{[10]uint32{0x00c728ef, 0x00e5c6e6, 0x03a8879c, 0x02c4e7d6, 0x02acf64e, 0x034035c4, 0x021e02c2, 0x034af7fe, 0x02408281, 0x0005baff}}}, + {X: Field{[10]uint32{0x00503030, 0x0207afa6, 0x02ceb1db, 0x00bc0ede, 0x0131ae2b, 0x02e2da7f, 0x01eb8b97, 0x03dba578, 0x03d4b48c, 0x002becde}}, Y: Field{[10]uint32{0x024b7929, 0x0336c582, 0x01d84d3f, 0x037b3913, 0x01c47c06, 0x017e8c4f, 0x0231af3e, 0x033765bc, 0x0164f8d9, 0x000733d0}}}, + {X: Field{[10]uint32{0x0088e709, 0x000a494e, 0x007d51a6, 0x00b4ac4a, 0x00f55368, 0x007591c3, 0x0318e7f2, 0x013e0cea, 0x02ef6c29, 0x00006e40}}, Y: Field{[10]uint32{0x00d69ebe, 0x007b3bb7, 0x024aa24b, 0x00091b1c, 0x0066ca01, 0x00359a93, 0x005e9fe4, 0x027f9c8e, 0x01ff34e4, 0x001dcd71}}}, + {X: Field{[10]uint32{0x003133e2, 0x0138a2df, 0x030b255e, 0x031630ef, 0x00c61b41, 0x00cc883f, 0x01b4ec3d, 0x00a561f1, 0x03108a20, 0x001b9396}}, Y: Field{[10]uint32{0x028fcfbe, 0x012a6766, 0x02f660f1, 0x0011b3a8, 0x00b55ae5, 0x01224569, 0x01ea4106, 0x01abd11a, 0x03065c33, 0x002d27e0}}}, + {X: Field{[10]uint32{0x037e9714, 0x00346ac6, 0x0280b5b1, 0x0261f607, 0x0112342d, 0x034e4c6e, 0x00532760, 0x0008416e, 0x037fbb80, 0x0021f38f}}, Y: Field{[10]uint32{0x00f0f635, 0x0065ce93, 0x02e16d1e, 0x0263751b, 0x016b71f8, 0x03078ce1, 0x013c3869, 0x03ce700a, 0x004779db, 0x0015b1aa}}}, + {X: Field{[10]uint32{0x01426b2d, 0x0199eab2, 0x01d0c9f6, 0x00189d1f, 0x02d368a7, 0x01687a51, 0x00193724, 0x01927270, 0x029bb7ba, 0x0021c90c}}, Y: Field{[10]uint32{0x010b944c, 0x0243fe59, 0x030d89d0, 0x03548745, 0x0155b109, 0x003e811e, 0x03a5a5bb, 0x03512d76, 0x00e848d7, 0x00011116}}}, + {X: Field{[10]uint32{0x02a1a4bc, 0x025fd8ad, 0x005cd7d2, 0x03333b21, 0x03c6338d, 0x01935f5f, 0x01b18b6b, 0x030244cb, 0x03a64735, 0x002e46fb}}, Y: Field{[10]uint32{0x00138467, 0x03dc0778, 0x0340b14c, 0x00323e7c, 0x0015e7ca, 0x0391d9a8, 0x03f16cfb, 0x01e71a19, 0x01ef8c9b, 0x002ece58}}}, + {X: Field{[10]uint32{0x00d08fb3, 0x038c8028, 0x0296cd8d, 0x02e19735, 0x009ae3d6, 0x0228d227, 0x00fbb896, 0x025fa8ef, 0x0259332e, 0x0010c87a}}, Y: Field{[10]uint32{0x00cd538e, 0x032d8021, 0x00f7ee31, 0x008d7394, 0x0203f6b0, 0x01ce8d7a, 0x0182e3fc, 0x02754f5d, 0x00d4c514, 0x0025f920}}}, + {X: Field{[10]uint32{0x02f1bc6d, 0x014b29bd, 0x02069057, 0x0357a230, 0x017950a8, 0x02a63508, 0x01051d25, 0x025a990c, 0x03b2836d, 0x00371165}}, Y: Field{[10]uint32{0x03df36ff, 0x01cfc814, 0x02ad7f9b, 0x03f79310, 0x03362bb4, 0x00d5c96a, 0x00e3a83c, 0x00c32ba1, 0x000d16ba, 0x0031c496}}}, + {X: Field{[10]uint32{0x0159a009, 0x00b4e700, 0x00992997, 0x0194b67e, 0x03c5f19b, 0x037801ee, 0x02617508, 0x00c0242c, 0x02f085ff, 0x00339913}}, Y: Field{[10]uint32{0x033cc8f7, 0x02641b35, 0x02c17c08, 0x01a48299, 0x00c9402a, 0x019026ac, 0x0200c92f, 0x02e596ea, 0x01d0058d, 0x00002690}}}, + {X: Field{[10]uint32{0x0136b41a, 0x01138066, 0x002b4a74, 0x0309611a, 0x022ec439, 0x00f2e3bc, 0x01aecf42, 0x02d2eae0, 0x035cb6c7, 0x0002e878}}, Y: Field{[10]uint32{0x01bd6272, 0x0339a50d, 0x0128ad2f, 0x00cc73ab, 0x0001098b, 0x02c5ea39, 0x0178d6f7, 0x037918f8, 0x0252f91d, 0x003cecf1}}}, + {X: Field{[10]uint32{0x02e3920f, 0x0344d821, 0x0114d72e, 0x011c640b, 0x036988c7, 0x011763d0, 0x03c839f8, 0x006efd83, 0x02a02a33, 0x002e7e63}}, Y: Field{[10]uint32{0x020d03d3, 0x03eca4b1, 0x0327d318, 0x013ea52e, 0x0235d9b0, 0x02a85f04, 0x0326f5e8, 0x00e85b31, 0x0101a7f2, 0x00027ec9}}}, + {X: Field{[10]uint32{0x007e886f, 0x028da7a0, 0x02ed09c1, 0x03c45b5e, 0x00dc10db, 0x03f3fe4c, 0x038e702f, 0x003e0711, 0x034655f9, 0x001c1645}}, Y: Field{[10]uint32{0x0205a59f, 0x0255426c, 0x02f8c64b, 0x010747cd, 0x03d09d3f, 0x0182a8fd, 0x031ec925, 0x03c32836, 0x00a4b9d6, 0x002099e8}}}, + {X: Field{[10]uint32{0x025434bf, 0x00886b30, 0x0031eb76, 0x01b938c7, 0x0114cc5a, 0x01004858, 0x036469f8, 0x02818e9e, 0x00bcc43c, 0x003bf69e}}, Y: Field{[10]uint32{0x02fa2864, 0x038de055, 0x032aa92b, 0x0191126b, 0x034cdf80, 0x00c64f44, 0x0121b135, 0x03e1643d, 0x03f6ef45, 0x001ed0db}}}, + {X: Field{[10]uint32{0x010ccc34, 0x01b4251d, 0x02f0e430, 0x01d00068, 0x0335fbd8, 0x02015aba, 0x0230988c, 0x002578e9, 0x030f5d62, 0x0008a692}}, Y: Field{[10]uint32{0x0234de6e, 0x028d6578, 0x034288be, 0x00d771a8, 0x00741acf, 0x01a9466f, 0x01694cef, 0x01d38f4b, 0x03af491c, 0x0005c34c}}}, + {X: Field{[10]uint32{0x02f07100, 0x0238bb1a, 0x03f178ce, 0x02d2069a, 0x03f91860, 0x02b343e4, 0x01d44b83, 0x0084c862, 0x008e20a0, 0x0031dc3d}}, Y: Field{[10]uint32{0x00266eec, 0x03e18870, 0x038c9610, 0x02fdf82f, 0x02a6d8db, 0x00c96fab, 0x0143aca3, 0x00647e7b, 0x00d38b2a, 0x001f8448}}}, + {X: Field{[10]uint32{0x0286aa44, 0x0121a6bc, 0x00af8eb7, 0x0260f509, 0x01e89b89, 0x002c626a, 0x020a48a2, 0x00754a2d, 0x00630390, 0x002976cb}}, Y: Field{[10]uint32{0x00af1e50, 0x03868dc9, 0x03a1446f, 0x021a0146, 0x010384e1, 0x0270dfbb, 0x034e6abd, 0x0356c069, 0x01926a93, 0x002e6587}}}, + {X: Field{[10]uint32{0x0241db1c, 0x01eca636, 0x005ff007, 0x01233a8b, 0x024b447e, 0x005a36e6, 0x03897b7c, 0x000a2298, 0x029e9f33, 0x000fb1c5}}, Y: Field{[10]uint32{0x03053fb2, 0x01de0d7c, 0x00b49e44, 0x01a04b96, 0x024b3be2, 0x034d2935, 0x004aa34e, 0x003b688b, 0x034de8e6, 0x0030ffa5}}}, + {X: Field{[10]uint32{0x035bf3b3, 0x00b0453e, 0x02b777cf, 0x024f3a4b, 0x03810cff, 0x0267923a, 0x0060d4cf, 0x00461356, 0x0217c331, 0x002dccf7}}, Y: Field{[10]uint32{0x000c11b0, 0x038690d2, 0x0290ad28, 0x033a7c9a, 0x0157fc4a, 0x02ed855c, 0x000d537e, 0x002b4c80, 0x00dd72d2, 0x00031d70}}}, + {X: Field{[10]uint32{0x002ed278, 0x0140585b, 0x01df28b4, 0x0279aa08, 0x00027db5, 0x005601d7, 0x0149616a, 0x02f09057, 0x0208d555, 0x0015f5b8}}, Y: Field{[10]uint32{0x0346eba8, 0x00d31b0d, 0x02891fca, 0x00b9b3ca, 0x0274b5d0, 0x014ecd3d, 0x028e3533, 0x036968d4, 0x0279d130, 0x0020e1c2}}}, + {X: Field{[10]uint32{0x02d3673d, 0x0249621a, 0x03aab8d7, 0x0027f6cb, 0x026f0694, 0x00823dbc, 0x032fd3c3, 0x0291e0ef, 0x00f1aa69, 0x0027908d}}, Y: Field{[10]uint32{0x008d0653, 0x00dccf8a, 0x0029bd75, 0x005abffb, 0x019fb42b, 0x01e81610, 0x03ed0414, 0x03af0fa2, 0x03737725, 0x0017e691}}}, + {X: Field{[10]uint32{0x02b68173, 0x00fc7ce6, 0x00a758d4, 0x03c9d81a, 0x0322e4fc, 0x0362ba44, 0x0096202f, 0x00bff6f6, 0x039d9fc1, 0x001bf8ff}}, Y: Field{[10]uint32{0x0109fa1b, 0x00f688ad, 0x02a3c2ab, 0x0058f9fe, 0x010bf94e, 0x02482316, 0x03ef7b50, 0x0118209c, 0x02821d41, 0x003bc355}}}, + {X: Field{[10]uint32{0x005c4631, 0x02ab96ed, 0x0161fff2, 0x015f446c, 0x0154c492, 0x01532d26, 0x02af415e, 0x01b867be, 0x014fd258, 0x000b0c79}}, Y: Field{[10]uint32{0x03311346, 0x003908c4, 0x0308bd8e, 0x015069c1, 0x00039af3, 0x03ee0979, 0x0353c0e9, 0x02c6b39f, 0x00ad364a, 0x002fb7ec}}}, + {X: Field{[10]uint32{0x00203ebc, 0x019839de, 0x037823b8, 0x0225270b, 0x004d745b, 0x02e4ce16, 0x00ea2ee2, 0x01230d1e, 0x02590231, 0x0014565c}}, Y: Field{[10]uint32{0x02aa1817, 0x027cefd9, 0x033628a5, 0x03396984, 0x03b81ff7, 0x015e4140, 0x03dc4702, 0x02dd0f13, 0x0153f688, 0x000ca7d8}}}, + {X: Field{[10]uint32{0x01caf1f4, 0x010791b3, 0x03d6070d, 0x0213378d, 0x020d3946, 0x03d4733e, 0x03fcb3bd, 0x035ee370, 0x032458f7, 0x000622cc}}, Y: Field{[10]uint32{0x03901910, 0x0195a934, 0x03104487, 0x030a22ab, 0x003d1dde, 0x026671aa, 0x026b04c8, 0x02845cc6, 0x01dad112, 0x000137a9}}}, + {X: Field{[10]uint32{0x03a6e471, 0x00dcb573, 0x0090e307, 0x033dfc4f, 0x0085f804, 0x0384f8aa, 0x02b0a494, 0x03856233, 0x0241a503, 0x00248163}}, Y: Field{[10]uint32{0x00ec108a, 0x01c95761, 0x0151068e, 0x01e96334, 0x01bcbe17, 0x0085dfa5, 0x025a230e, 0x01a1785f, 0x02d4449e, 0x000da01c}}}, + {X: Field{[10]uint32{0x00099fcf, 0x011e20cd, 0x0105d5b6, 0x03a27a0c, 0x03726f79, 0x01bab14d, 0x03a7a689, 0x01941bc9, 0x022644e0, 0x001a9bd4}}, Y: Field{[10]uint32{0x01132586, 0x0268cb69, 0x013214c1, 0x0269692d, 0x007104e7, 0x01d261fd, 0x027b6645, 0x0360fac5, 0x014bd8ce, 0x0033cfb7}}}, + {X: Field{[10]uint32{0x0376bb26, 0x03e49bc8, 0x0148d89c, 0x0008d3c0, 0x03c77c34, 0x035523cd, 0x021e0efa, 0x03730f28, 0x02a2340c, 0x001f8df3}}, Y: Field{[10]uint32{0x009a0016, 0x027fa6b3, 0x0369e83b, 0x00af4c72, 0x026b02d4, 0x0172f08a, 0x022938e0, 0x01f1aac1, 0x029b42a2, 0x0031cb60}}}, + {X: Field{[10]uint32{0x00d0b667, 0x023ee0b6, 0x00c5ad84, 0x00314b0f, 0x00800d01, 0x0325ea37, 0x03b4b39b, 0x01b3deeb, 0x0069cf0f, 0x00079b08}}, Y: Field{[10]uint32{0x0260196f, 0x031c8e23, 0x03e81f86, 0x02198c2d, 0x00491469, 0x032c2450, 0x02cfbdc2, 0x03611a1b, 0x0276bca1, 0x00030607}}}, + {X: Field{[10]uint32{0x02f07e16, 0x00fbd6c1, 0x00be3520, 0x00f32901, 0x02f36ba4, 0x0112d1fa, 0x02336c8d, 0x0293dec1, 0x000fe6ee, 0x00155998}}, Y: Field{[10]uint32{0x01057e55, 0x03f87380, 0x0278b5a7, 0x0059da56, 0x0269e5ac, 0x03cdcbb6, 0x00acb4c0, 0x0065e7b5, 0x008f7adc, 0x001aeef4}}}, + {X: Field{[10]uint32{0x01c791b5, 0x0341f64c, 0x03a7619a, 0x005b54a6, 0x00690450, 0x017653e3, 0x01c5adc4, 0x00717008, 0x034ded45, 0x0010d718}}, Y: Field{[10]uint32{0x034d4cc1, 0x02d391f1, 0x02c14024, 0x01d8adbd, 0x02850098, 0x0254f032, 0x006f9591, 0x02943c88, 0x02688252, 0x000c7b78}}}, + {X: Field{[10]uint32{0x0057b9b6, 0x0108d0a7, 0x027e9dd1, 0x00abe157, 0x01f19a0d, 0x014a9053, 0x01c06122, 0x01c71ce5, 0x00e6a660, 0x001bee33}}, Y: Field{[10]uint32{0x0368e052, 0x017627c9, 0x034c5b84, 0x03baaff8, 0x02183dad, 0x0208c989, 0x0399fad6, 0x014c5351, 0x0249e2f0, 0x0005fe50}}}, + {X: Field{[10]uint32{0x0180dc36, 0x037a30ca, 0x01890148, 0x028a6781, 0x0011c711, 0x0153b98d, 0x016a695f, 0x01325252, 0x029920fc, 0x00219bcf}}, Y: Field{[10]uint32{0x018d62f7, 0x0221e1b4, 0x0109bae1, 0x000ba0de, 0x01f5211f, 0x030036cb, 0x00a11e13, 0x030f074e, 0x01af4f8d, 0x003a6715}}}, + {X: Field{[10]uint32{0x00468b2d, 0x01bd8620, 0x03c79461, 0x002df009, 0x0162404f, 0x0372f941, 0x024f7234, 0x0122669c, 0x0010b716, 0x0020304d}}, Y: Field{[10]uint32{0x000b91aa, 0x037e254a, 0x016216d8, 0x03870b10, 0x01bd6e8f, 0x0371a74e, 0x03592819, 0x00793f5e, 0x002e71a0, 0x00218c65}}}, + {X: Field{[10]uint32{0x02a7da99, 0x00577060, 0x004d2c38, 0x030292e9, 0x00bf37ab, 0x005eedbb, 0x03e68bec, 0x02762014, 0x01eeef4e, 0x0023e16f}}, Y: Field{[10]uint32{0x0217897e, 0x027edfbb, 0x02962b4a, 0x017927b9, 0x034e8c29, 0x02a96468, 0x00f8ce78, 0x00d0b2bc, 0x03df8ae9, 0x000db516}}}, + {X: Field{[10]uint32{0x01600749, 0x01280692, 0x022aa440, 0x039209b6, 0x0317a920, 0x03ba286c, 0x00edaf40, 0x03369833, 0x032b3393, 0x00027342}}, Y: Field{[10]uint32{0x02fc5a5a, 0x03977baa, 0x00463414, 0x024a9258, 0x023a00c4, 0x03c313a8, 0x0101e348, 0x01942ec6, 0x035a51d9, 0x000e0c74}}}, + {X: Field{[10]uint32{0x009f33b0, 0x0380ddf5, 0x032d3bdb, 0x032b7fe8, 0x02003ab7, 0x01d31de6, 0x03832f79, 0x01fff5b3, 0x01af15c6, 0x0028317c}}, Y: Field{[10]uint32{0x01cb91ec, 0x00a5a080, 0x03c57800, 0x00aee210, 0x03307939, 0x0188317f, 0x03344123, 0x01898905, 0x00d442de, 0x001abfd0}}}, + {X: Field{[10]uint32{0x00edfacc, 0x0208c4d6, 0x02d7890a, 0x01c0df2c, 0x02c01113, 0x03b100e7, 0x021fbf02, 0x03885f5f, 0x03400013, 0x002bce5b}}, Y: Field{[10]uint32{0x02cfb936, 0x03a53d66, 0x024bc936, 0x0267a161, 0x016754c5, 0x0017c397, 0x0035d167, 0x014d28b7, 0x01e25a57, 0x002aabae}}}, + {X: Field{[10]uint32{0x01ed0eaf, 0x039c7124, 0x01307cf1, 0x01c7cbe2, 0x0187d4c0, 0x02f8d65e, 0x02871b0d, 0x03b3179f, 0x0057e3e0, 0x003f6b0f}}, Y: Field{[10]uint32{0x00a09fc7, 0x03981a0f, 0x00b18cde, 0x03fd7684, 0x02b14d14, 0x033f8db5, 0x00877afc, 0x03c259cf, 0x00cca22e, 0x000c0a28}}}, + {X: Field{[10]uint32{0x02fa88b7, 0x011c767b, 0x0103e14a, 0x035aab14, 0x00ae745f, 0x023bebb7, 0x012b6a96, 0x02eaa6b8, 0x01239587, 0x0038ebac}}, Y: Field{[10]uint32{0x02f769c7, 0x00ce5ef2, 0x036cd2d3, 0x00168b23, 0x017b4603, 0x02c9f469, 0x006833fb, 0x01512f8c, 0x038652c1, 0x001fb471}}}, + {X: Field{[10]uint32{0x038352f5, 0x01694335, 0x00a0e605, 0x01e8f8f8, 0x000eb83d, 0x0246b2e5, 0x00cc663c, 0x00058bed, 0x01e3382a, 0x0025aebb}}, Y: Field{[10]uint32{0x00c50cbc, 0x02b8167c, 0x039972ad, 0x0187a963, 0x0105100d, 0x02e4c022, 0x00c3a80f, 0x00a090e2, 0x0297b3ad, 0x001e1c8b}}}, + {X: Field{[10]uint32{0x03f5f5b5, 0x0013b88e, 0x03e408de, 0x008911a8, 0x02ba93d1, 0x036d51bf, 0x01e1eda4, 0x0158dfcd, 0x01561697, 0x001a1c12}}, Y: Field{[10]uint32{0x014ca494, 0x00d86f18, 0x005ff46e, 0x0099dc90, 0x02934bd2, 0x01310986, 0x006c7a20, 0x011c7ce8, 0x02feb5f7, 0x001891f4}}}, + {X: Field{[10]uint32{0x00bcf749, 0x0257827d, 0x01ad7940, 0x014be0fb, 0x0362eaf6, 0x02c374ac, 0x0202d72e, 0x03e1622b, 0x02342ca1, 0x001c7331}}, Y: Field{[10]uint32{0x012a45fb, 0x027e60f7, 0x02c686cb, 0x02510aa5, 0x01aee177, 0x01c0f968, 0x00e3f222, 0x0039a52a, 0x03d923b1, 0x00121eba}}}, + {X: Field{[10]uint32{0x0235d3f0, 0x002cfb3d, 0x00dff25d, 0x02ebc927, 0x01713844, 0x03a2d842, 0x00cd1831, 0x0268b816, 0x01d06573, 0x001bf687}}, Y: Field{[10]uint32{0x0078108e, 0x02597d48, 0x013df60a, 0x00f554dc, 0x00a232a9, 0x02a22a2c, 0x00a96c32, 0x032dc93e, 0x00f48afc, 0x0028bb91}}}, + {X: Field{[10]uint32{0x01147f45, 0x005b31b5, 0x03b64b10, 0x03d60e39, 0x0165cbfc, 0x02651c45, 0x02395c13, 0x0365ed17, 0x0309ff5a, 0x0034fc9d}}, Y: Field{[10]uint32{0x03265077, 0x024559e4, 0x0161a043, 0x03854767, 0x0329006e, 0x026ef5b1, 0x02026ed2, 0x03870d53, 0x0016cdc8, 0x003e5b2b}}}, + {X: Field{[10]uint32{0x00a011d6, 0x038d9ba9, 0x0278641e, 0x024e38af, 0x0268f827, 0x02e0a4b1, 0x027d064b, 0x01bbfde2, 0x0144a28a, 0x0009ee86}}, Y: Field{[10]uint32{0x027bdcab, 0x03dea613, 0x014d0a77, 0x01755d1a, 0x01fcbe30, 0x0163c15c, 0x0312fc94, 0x0190c39c, 0x00759d21, 0x00092fbe}}}, + {X: Field{[10]uint32{0x004fe190, 0x039f4025, 0x0348ee35, 0x011061c1, 0x01772f4c, 0x021cb83a, 0x03ca9ff7, 0x01f3820b, 0x00125fd8, 0x003f4dee}}, Y: Field{[10]uint32{0x03dcb453, 0x01ee6809, 0x02951184, 0x01118041, 0x028ec68a, 0x02ccdf7c, 0x01b8c43f, 0x0066376e, 0x0125d9ae, 0x00251429}}}, + {X: Field{[10]uint32{0x02071c69, 0x013322a3, 0x00b802c2, 0x02296576, 0x03446751, 0x00caa005, 0x0329b63f, 0x00f83634, 0x00ca9258, 0x0036659f}}, Y: Field{[10]uint32{0x03376c25, 0x0192ba5c, 0x02ab97ed, 0x034c85e7, 0x0328361c, 0x00b96bc9, 0x0086dbb9, 0x0275a4ef, 0x0273c2c3, 0x001ab28d}}}, + {X: Field{[10]uint32{0x014a0a3c, 0x027b502e, 0x0044f3d8, 0x017c38f4, 0x02f53cd4, 0x03f65705, 0x02798efb, 0x0007af48, 0x013c4a8d, 0x0023ba0b}}, Y: Field{[10]uint32{0x011e1b2d, 0x0189b1de, 0x022f036c, 0x02836ceb, 0x0379c8b6, 0x0356e702, 0x0271c3af, 0x03ee742a, 0x037e9167, 0x00382c2a}}}, + {X: Field{[10]uint32{0x00562caa, 0x022876c3, 0x01a4764c, 0x0336fc8b, 0x038d709c, 0x0140a5c1, 0x03ea0291, 0x02d526a7, 0x03d2817c, 0x001187b0}}, Y: Field{[10]uint32{0x036684af, 0x01abd1eb, 0x0259adb1, 0x0036c218, 0x0126cdf8, 0x00594100, 0x00f6e126, 0x025e4144, 0x017dcb5c, 0x001986cb}}}, + {X: Field{[10]uint32{0x01f5793e, 0x00406f50, 0x01890673, 0x0203cf79, 0x0059f517, 0x014ffdae, 0x01bb7ffb, 0x032bb51a, 0x005c0935, 0x000c5562}}, Y: Field{[10]uint32{0x0043dfff, 0x010d3388, 0x0181e28d, 0x0309a71d, 0x0208ca6a, 0x023cd5db, 0x00bbdfe0, 0x00423e34, 0x00e992ac, 0x00180d65}}}, + {X: Field{[10]uint32{0x024ea9eb, 0x0109d60a, 0x02f0dcad, 0x028ae7ed, 0x00c68a60, 0x03621d39, 0x02267a0a, 0x02670641, 0x03b0ad91, 0x00172b24}}, Y: Field{[10]uint32{0x000032ab, 0x008ee662, 0x0234a0e4, 0x0254df99, 0x03c48e72, 0x035d20fa, 0x0161fe7a, 0x036ae5a6, 0x0298a116, 0x0020dbea}}}, + {X: Field{[10]uint32{0x0156cc42, 0x03b15b1a, 0x039047e3, 0x01d09121, 0x0154d052, 0x02a3c05e, 0x02eea1c4, 0x03bd5a2d, 0x03acafd5, 0x0007edb4}}, Y: Field{[10]uint32{0x022a5411, 0x00f6bf4b, 0x00839313, 0x0120460f, 0x027431be, 0x014318d8, 0x036a1ec0, 0x013cc9b7, 0x01f2f89e, 0x002e3be4}}}, + {X: Field{[10]uint32{0x002b28f2, 0x03f1dcf6, 0x02bdcd31, 0x015fdeec, 0x0369fe01, 0x03f7b9ec, 0x00618f03, 0x0001768c, 0x01e152f0, 0x0022702c}}, Y: Field{[10]uint32{0x00b4a507, 0x01deac60, 0x007a9254, 0x0362b27d, 0x01ad8223, 0x009b19ed, 0x0105de5b, 0x01a05ab3, 0x0357bbf4, 0x001875b8}}}, + {X: Field{[10]uint32{0x039a211e, 0x01eac6ed, 0x01751080, 0x02f83cc7, 0x007cb968, 0x01064c90, 0x023875a3, 0x006bf359, 0x018b1f9d, 0x0001f174}}, Y: Field{[10]uint32{0x00779ff3, 0x02e70def, 0x01b3b6dc, 0x02c4a5b2, 0x03d136b5, 0x0353a517, 0x023b4495, 0x03683ef4, 0x03ea985b, 0x00117ef9}}}, + {X: Field{[10]uint32{0x0159f85c, 0x027744fc, 0x03792ddf, 0x034e978b, 0x00b6afda, 0x017adfc0, 0x031ad4db, 0x0042326c, 0x03c19393, 0x003209f3}}, Y: Field{[10]uint32{0x013a1cb1, 0x006aa99d, 0x01a129c3, 0x00f758cd, 0x000330ea, 0x0265478b, 0x03e12fc8, 0x03500553, 0x007a3025, 0x001717f8}}}, + {X: Field{[10]uint32{0x03cc5d9b, 0x005e1d55, 0x001e6571, 0x0201541d, 0x002e0dfa, 0x01ac806d, 0x01e2fa40, 0x03df7081, 0x032bb1f3, 0x0018d1ec}}, Y: Field{[10]uint32{0x028c3ba4, 0x02f868eb, 0x02e52e22, 0x03cec5c3, 0x01a455d3, 0x03e2b09b, 0x00d72553, 0x034d3292, 0x02109508, 0x003e3cc3}}}, + {X: Field{[10]uint32{0x03ae1014, 0x00748999, 0x00130e0a, 0x00ea5266, 0x02bfa21f, 0x036c0cab, 0x02e42837, 0x0040757d, 0x0195e822, 0x0035227d}}, Y: Field{[10]uint32{0x027c66a9, 0x0299b648, 0x000c22b4, 0x037fae54, 0x012bfa98, 0x00987e32, 0x024c33d1, 0x02851a3d, 0x02898dc4, 0x0022c44b}}}, + {X: Field{[10]uint32{0x00a6205b, 0x0016372e, 0x000b276f, 0x01cf50ef, 0x0102200d, 0x039da991, 0x02b8f981, 0x03ef3ab7, 0x0063fb4a, 0x002432e7}}, Y: Field{[10]uint32{0x02e74645, 0x00c93394, 0x0087ba02, 0x01ed6fdb, 0x002611a7, 0x00811c76, 0x02f19c67, 0x01fc6aee, 0x01c0f6ba, 0x002252bf}}}, + {X: Field{[10]uint32{0x02196af4, 0x0269e55a, 0x0018bbc4, 0x01b1a67a, 0x00869bb0, 0x002a6255, 0x026a1bef, 0x0087d395, 0x00bb19f1, 0x001037da}}, Y: Field{[10]uint32{0x020cec90, 0x02f758c8, 0x0269da31, 0x034a90c7, 0x02e1d6b3, 0x01843dad, 0x009f8303, 0x037df0c7, 0x0009d0ce, 0x001c3507}}}, + {X: Field{[10]uint32{0x03da41bf, 0x00450ea0, 0x009d78b4, 0x007acd55, 0x00a888dd, 0x00c7c5ff, 0x00962b64, 0x01411647, 0x0174a0ac, 0x00124dbf}}, Y: Field{[10]uint32{0x03ff4f92, 0x02d7fc86, 0x03392c5a, 0x00ad7743, 0x013fc5b7, 0x02cfc73d, 0x0068af85, 0x0214fb5f, 0x01dd6517, 0x000cea38}}}, + {X: Field{[10]uint32{0x02023557, 0x03a0ac36, 0x03594288, 0x039eca8f, 0x03c1a0c6, 0x025601d2, 0x03aad592, 0x01d6e3d6, 0x01388110, 0x0005c5dd}}, Y: Field{[10]uint32{0x01b10837, 0x02ec1cb0, 0x0077504b, 0x00a08e6a, 0x01b163fe, 0x00d36848, 0x03a0c5f7, 0x01d0b179, 0x0014efd8, 0x00160f52}}}, + {X: Field{[10]uint32{0x038926a2, 0x01dc33d3, 0x02bab586, 0x023c0da4, 0x006abb11, 0x03c87c82, 0x014c82d8, 0x0117aad0, 0x03fbad51, 0x002849ad}}, Y: Field{[10]uint32{0x022ec669, 0x032cb46b, 0x00394452, 0x0251a679, 0x0288d465, 0x007dffb0, 0x02bfdb74, 0x02d34868, 0x0017b601, 0x001e6d2b}}}, + {X: Field{[10]uint32{0x02871163, 0x0039c0eb, 0x004fdba3, 0x02361a61, 0x023485db, 0x03619694, 0x015de512, 0x00012035, 0x0361f884, 0x00147b33}}, Y: Field{[10]uint32{0x02a8d50f, 0x032bb4cb, 0x03dcee87, 0x02a55e94, 0x0012b2c6, 0x0003a824, 0x000c46a2, 0x0327c20b, 0x025397bd, 0x001652b4}}}, + {X: Field{[10]uint32{0x02b3c7a9, 0x016e8ed4, 0x02882510, 0x00e22d45, 0x03d89844, 0x01e7496b, 0x01966cca, 0x01c4c7d5, 0x02336f1b, 0x0025de05}}, Y: Field{[10]uint32{0x03214c60, 0x03a2764e, 0x01516e47, 0x03bbd0d5, 0x02105011, 0x0149d7ad, 0x01a20e0a, 0x023f8337, 0x0141b4b0, 0x003c77cd}}}, + {X: Field{[10]uint32{0x0093f7fe, 0x01e6f80b, 0x03f01cdb, 0x00ea1c2e, 0x0064231d, 0x0068d73a, 0x038cf6db, 0x0236ad71, 0x003a7224, 0x0022f0b1}}, Y: Field{[10]uint32{0x00cbb425, 0x02ef8385, 0x01b2ef49, 0x001e009a, 0x030b428f, 0x03eee75e, 0x028106af, 0x0276fc27, 0x0276173e, 0x00354b8b}}}, + {X: Field{[10]uint32{0x01aef9f2, 0x014f9401, 0x020d9799, 0x01d7a267, 0x036c3271, 0x012e42cd, 0x00abd033, 0x02846729, 0x00816c7c, 0x00167b5e}}, Y: Field{[10]uint32{0x02449910, 0x02981a85, 0x02133152, 0x0094d2f1, 0x02207794, 0x019a7836, 0x01b46a28, 0x003faf93, 0x0027690c, 0x0008e7f0}}}, + {X: Field{[10]uint32{0x03c70fda, 0x0033dacb, 0x025200ca, 0x0268b2ad, 0x01c8ff8e, 0x00a8e716, 0x01923907, 0x01265750, 0x01d17671, 0x002fb0e6}}, Y: Field{[10]uint32{0x010ba8e7, 0x0266ff6b, 0x03fbf709, 0x01f3bf17, 0x02a21a2f, 0x0394bcd1, 0x021ab9ad, 0x0082348e, 0x01ef7831, 0x003ff12f}}}, + {X: Field{[10]uint32{0x020c4d34, 0x00d62167, 0x0307668a, 0x036d6318, 0x019e3b87, 0x0348a9df, 0x01f99517, 0x03c76fe9, 0x01eef4ce, 0x0024ef49}}, Y: Field{[10]uint32{0x0335b4dc, 0x039aa1d9, 0x00860794, 0x018c0d01, 0x01fa008c, 0x03e265c3, 0x003b1f94, 0x006e1269, 0x00129736, 0x00375f45}}}, + {X: Field{[10]uint32{0x02ddcf58, 0x039b2483, 0x00f8e3e8, 0x0316f7a9, 0x0344e553, 0x01d15695, 0x00b2e708, 0x01354456, 0x0257fb4e, 0x002c80e9}}, Y: Field{[10]uint32{0x02d8c99c, 0x0200d657, 0x03a6a0ac, 0x029e866b, 0x03c74ae5, 0x010fee9e, 0x030d4c75, 0x03860987, 0x01480c63, 0x0026091a}}}, + {X: Field{[10]uint32{0x00f6aa69, 0x01a0f760, 0x024e70be, 0x008533fd, 0x023e20ac, 0x0076a2aa, 0x018a28d1, 0x009ed604, 0x013c1dcd, 0x002bce2d}}, Y: Field{[10]uint32{0x009fd919, 0x030cbe70, 0x02c16acd, 0x01e463e2, 0x035ec101, 0x028feb19, 0x02867237, 0x00ad08d1, 0x0136ba8b, 0x002478e2}}}, + {X: Field{[10]uint32{0x03fd8518, 0x0315d3da, 0x02d862f8, 0x01c83d79, 0x02988ed4, 0x002ad33b, 0x00587562, 0x03601788, 0x025b0b99, 0x00157936}}, Y: Field{[10]uint32{0x00eb2d35, 0x005845eb, 0x0130940b, 0x00963c5e, 0x02e7713b, 0x00d30d9b, 0x01b5976c, 0x0274cb85, 0x02347517, 0x001cda2f}}}, + {X: Field{[10]uint32{0x002133f5, 0x00e83279, 0x035d9018, 0x01b74968, 0x01a3608c, 0x03605f64, 0x021a15e1, 0x0389020f, 0x002aa7eb, 0x0034f5fa}}, Y: Field{[10]uint32{0x005d504b, 0x029f53ff, 0x03bfcae6, 0x01a5b06f, 0x024b1c6d, 0x031789dc, 0x01080b06, 0x00df1a25, 0x01cce895, 0x00029491}}}, + {X: Field{[10]uint32{0x02e48799, 0x01b9699b, 0x003f2231, 0x012da31b, 0x03beab75, 0x03732641, 0x021e8031, 0x0110de5d, 0x039fe6b5, 0x0022f453}}, Y: Field{[10]uint32{0x0178fe19, 0x0042bfda, 0x00603891, 0x009f66ba, 0x00ecb2eb, 0x0158ce1a, 0x0263a263, 0x01895d45, 0x0150a387, 0x003e2770}}}, + {X: Field{[10]uint32{0x02212932, 0x0223f488, 0x0370485c, 0x016c1208, 0x023a7dbc, 0x01ca9688, 0x02b08589, 0x003d0b3f, 0x036503f5, 0x002c75c8}}, Y: Field{[10]uint32{0x002143ac, 0x03cdc5b0, 0x0025570b, 0x013801f4, 0x01627986, 0x0216c877, 0x00aa52d3, 0x0387e6dd, 0x01d8594e, 0x0010165f}}}, + {X: Field{[10]uint32{0x039d3023, 0x03d3dc99, 0x013a8593, 0x000c1787, 0x01c22d44, 0x001173bd, 0x03e4763e, 0x0248324e, 0x03e1cb7d, 0x001134c0}}, Y: Field{[10]uint32{0x0189a70c, 0x004b1857, 0x02004769, 0x02a6806c, 0x03e77e41, 0x00f8f3b8, 0x03d6fcc8, 0x0368bcc6, 0x02fc5ed6, 0x001e7ef7}}}, + {X: Field{[10]uint32{0x030cb3ca, 0x03ae848e, 0x00aed3df, 0x026420f5, 0x02925589, 0x0183ae65, 0x03bd4b90, 0x02aba5c9, 0x0054447a, 0x0005957b}}, Y: Field{[10]uint32{0x0226fcdf, 0x03b39419, 0x017443b9, 0x029ac76b, 0x006ea28f, 0x027c1b65, 0x00f7bf8a, 0x038c7a62, 0x0178cf96, 0x0023a439}}}, + {X: Field{[10]uint32{0x005a3f29, 0x01eedf61, 0x02cb1971, 0x00120032, 0x027902b1, 0x0226439b, 0x01a93261, 0x019afd9b, 0x03fb5305, 0x002c0ab8}}, Y: Field{[10]uint32{0x03006876, 0x000c1f5e, 0x0105162a, 0x00ca4a98, 0x03d8c052, 0x02ce5d09, 0x03b76311, 0x00c0c466, 0x0313f448, 0x0031b4c9}}}, + {X: Field{[10]uint32{0x00c5bcd3, 0x03927344, 0x02c6e065, 0x0266854f, 0x018e1236, 0x02c4ae6b, 0x015e1402, 0x0010ae1d, 0x016653a0, 0x0004f119}}, Y: Field{[10]uint32{0x02d41c88, 0x024b1441, 0x002b0044, 0x02a29e2c, 0x007bab13, 0x00eb0f84, 0x0121ea40, 0x0180f8f1, 0x032c498f, 0x001c3cd9}}}, + {X: Field{[10]uint32{0x00f1483f, 0x03b68f01, 0x034c6361, 0x00fc5077, 0x010dee48, 0x017a5ece, 0x01c7bffc, 0x00dee0ba, 0x022b03fc, 0x0039f1d5}}, Y: Field{[10]uint32{0x03454066, 0x00be39b0, 0x028331b1, 0x026076ec, 0x021a9372, 0x01e85b43, 0x03dce515, 0x01256306, 0x00603d2b, 0x001cd2f9}}}, + {X: Field{[10]uint32{0x0159aefc, 0x035fee8a, 0x038d2263, 0x00870c12, 0x03332f39, 0x02f1ec9f, 0x02b2ed1e, 0x03f1d4d0, 0x012dfb6c, 0x00378097}}, Y: Field{[10]uint32{0x02de12f1, 0x01dbc705, 0x005985e6, 0x007601a5, 0x001a88c3, 0x020dce8c, 0x02fc30c3, 0x03cf40b6, 0x01b16ab6, 0x0011b182}}}, + {X: Field{[10]uint32{0x02ca2e01, 0x00b0c8cf, 0x03e4b6a4, 0x03d20e05, 0x0225730a, 0x02ebc14e, 0x01db714a, 0x0070f497, 0x00b4fed2, 0x000879e2}}, Y: Field{[10]uint32{0x01c1c4c6, 0x00a7f6b9, 0x03c58ddd, 0x03e73504, 0x01b249b1, 0x008cd6e7, 0x02af9b83, 0x01d64ad9, 0x02bda7d0, 0x0007f9c5}}}, + {X: Field{[10]uint32{0x0379edce, 0x033fc41e, 0x02012e39, 0x02776a5f, 0x02d1bc1a, 0x01d6ca39, 0x0058242c, 0x03542c69, 0x03ca7481, 0x0029f6c9}}, Y: Field{[10]uint32{0x01ae73f8, 0x00d860dc, 0x02238851, 0x0348ec47, 0x00084239, 0x02569f31, 0x0055fc17, 0x039b074d, 0x006dcabd, 0x00313e1a}}}, + {X: Field{[10]uint32{0x022d477a, 0x03d92d97, 0x01ccf41a, 0x00faf56f, 0x01e80a7d, 0x02b22533, 0x01616275, 0x03c90388, 0x01732790, 0x00314814}}, Y: Field{[10]uint32{0x022ba20b, 0x02fab27d, 0x03cda463, 0x00290150, 0x00af8770, 0x03ab70fe, 0x028e216d, 0x004283c3, 0x015b2094, 0x003a6a8a}}}, + {X: Field{[10]uint32{0x0172846d, 0x00dc7125, 0x01d05ea9, 0x03aa2e15, 0x0138e91e, 0x00dbaf36, 0x0025f86d, 0x036bafc7, 0x00ad99d1, 0x00121efd}}, Y: Field{[10]uint32{0x00febf70, 0x02a55dbf, 0x00ffe791, 0x01c21b78, 0x0032f729, 0x013062b8, 0x004b2a50, 0x03b42fb8, 0x0037ac6d, 0x00204a4e}}}, + {X: Field{[10]uint32{0x0208cb53, 0x005120c3, 0x03cb13cd, 0x01d083b7, 0x01355675, 0x03958097, 0x03e2d550, 0x01a22e13, 0x02a6bfcf, 0x002f5b74}}, Y: Field{[10]uint32{0x01ab0fca, 0x00dcc936, 0x01a1a1b0, 0x00b34714, 0x000c467d, 0x00a14566, 0x02a1501c, 0x00e018e3, 0x01e184c8, 0x00321a91}}}, + {X: Field{[10]uint32{0x035ec737, 0x02931f08, 0x02ce7936, 0x00619caf, 0x0070dbca, 0x0019cc7a, 0x034fbb69, 0x0223904c, 0x03fdfbf1, 0x00252905}}, Y: Field{[10]uint32{0x01be8e34, 0x026910f6, 0x01765029, 0x024d51be, 0x03564e9f, 0x033edf65, 0x02af124b, 0x03052e07, 0x0207343e, 0x00380f19}}}, + {X: Field{[10]uint32{0x02aba51e, 0x02236519, 0x00fa8ebd, 0x034c0e5a, 0x002ac597, 0x005e88f0, 0x02d9b733, 0x00ec9aa5, 0x02c33fa1, 0x000a95f6}}, Y: Field{[10]uint32{0x00c13b61, 0x02ca4dfa, 0x010c442d, 0x0366016d, 0x013b05bf, 0x0117cd3f, 0x027996e5, 0x02cee2c2, 0x02bf1db7, 0x0005d529}}}, + {X: Field{[10]uint32{0x007e7df7, 0x0242dffb, 0x01742eae, 0x0284b0fe, 0x02d1c66d, 0x00c20f0c, 0x00613e99, 0x00a8e59f, 0x02710614, 0x002e8b92}}, Y: Field{[10]uint32{0x034cb07e, 0x01eb3fa0, 0x00c971da, 0x00d6091f, 0x02ccc6de, 0x02b7b197, 0x03fc60c5, 0x03a0efb5, 0x00c1a704, 0x003098be}}}, + {X: Field{[10]uint32{0x00c01ca9, 0x018baa3b, 0x015a80a8, 0x02681cc3, 0x0008bb0b, 0x03eef609, 0x00a12b11, 0x00944b4a, 0x0343b313, 0x0012b865}}, Y: Field{[10]uint32{0x0017eece, 0x01323de8, 0x0019320b, 0x00f0fe75, 0x00cb2788, 0x029aa2e8, 0x001ec7c0, 0x00fa8747, 0x027d48fa, 0x0019edc9}}}, + {X: Field{[10]uint32{0x0306ddcb, 0x0143a9dd, 0x023ad618, 0x02fd046d, 0x000778b9, 0x01dd24fc, 0x00e6ff9d, 0x00d99fc6, 0x026c8182, 0x000133ec}}, Y: Field{[10]uint32{0x00e4028e, 0x00789dc9, 0x020c778e, 0x01e70e5e, 0x01aa6c60, 0x001f0c84, 0x017af164, 0x024f7c13, 0x023e3a8c, 0x000437e2}}}, + {X: Field{[10]uint32{0x01130349, 0x034f6e57, 0x02561934, 0x0009bdf5, 0x0215f061, 0x00f01418, 0x03bc3efb, 0x02d9bc03, 0x0166a014, 0x0027e791}}, Y: Field{[10]uint32{0x0396c592, 0x005f4964, 0x015fb0a4, 0x027333f2, 0x02ab6e5c, 0x01682a9e, 0x03d0c17c, 0x009aee63, 0x03a276d5, 0x00124ae2}}}, + {X: Field{[10]uint32{0x00239301, 0x033c7dab, 0x03bd222e, 0x0252d57c, 0x03ecf2a1, 0x0045678b, 0x039f4c10, 0x02d582c3, 0x01133641, 0x0038db01}}, Y: Field{[10]uint32{0x0343736c, 0x01696f6e, 0x00c7faa0, 0x004eb0ac, 0x0220e9a1, 0x027e0ea0, 0x022aea8e, 0x03f1018c, 0x00ba48e7, 0x0031ff5d}}}, + {X: Field{[10]uint32{0x00480bbf, 0x027e0936, 0x025e033e, 0x02938fb1, 0x02a0bbe0, 0x03c76846, 0x0337580b, 0x0115a1e1, 0x03b3b94d, 0x00246c04}}, Y: Field{[10]uint32{0x00cfc5b4, 0x00bc8afa, 0x03f00647, 0x02b0f4d9, 0x02948790, 0x038cf45c, 0x026f8247, 0x0094a48a, 0x007ec13a, 0x000578dc}}}, + {X: Field{[10]uint32{0x02324f56, 0x00fdc8fa, 0x001077d4, 0x01eb5d74, 0x00041f66, 0x0354e7cb, 0x02782de2, 0x01b5488d, 0x03888c67, 0x00095345}}, Y: Field{[10]uint32{0x0014094a, 0x00944cf2, 0x002755fd, 0x037e5e5d, 0x0309bec3, 0x02cb6fc9, 0x034aa03b, 0x0079744f, 0x012e9351, 0x003dc10b}}}, + {X: Field{[10]uint32{0x02f4079a, 0x00d59e15, 0x03f0b061, 0x018a65a5, 0x0234fce6, 0x0288bc5b, 0x03abe442, 0x003dc4ab, 0x037ece7d, 0x00114b5a}}, Y: Field{[10]uint32{0x03776998, 0x00c5691f, 0x02d23db3, 0x0164504c, 0x029a39ee, 0x0384c812, 0x000d69fc, 0x03f9d8d0, 0x03a128cf, 0x00087aa2}}}, + {X: Field{[10]uint32{0x004c508b, 0x01451e73, 0x001631f1, 0x02157ca3, 0x02817831, 0x02c660b4, 0x0386b855, 0x023d0606, 0x01d00788, 0x0005602e}}, Y: Field{[10]uint32{0x01d689ff, 0x03403d70, 0x02dc3ecd, 0x02abd95d, 0x0365b69f, 0x01e306df, 0x03cbbe87, 0x036775ce, 0x029c78b3, 0x00136747}}}, + {X: Field{[10]uint32{0x02fc2700, 0x00e582a8, 0x02f450c4, 0x01fb4212, 0x0245a5aa, 0x033c9680, 0x011470c2, 0x0253245b, 0x023fc316, 0x001e7768}}, Y: Field{[10]uint32{0x015bc978, 0x03c968ea, 0x03c03c34, 0x0086855b, 0x02d7158c, 0x01dc0c73, 0x0374e0f3, 0x02363312, 0x0169a58b, 0x001f1ef0}}}, + {X: Field{[10]uint32{0x0149dbe6, 0x036bb850, 0x013b5fe2, 0x00141119, 0x02419b49, 0x017d2a83, 0x02500afb, 0x0337084f, 0x03a9bf80, 0x00219b69}}, Y: Field{[10]uint32{0x026bd3d7, 0x02066add, 0x0124b239, 0x00b1af19, 0x02081a28, 0x022af126, 0x027e8adc, 0x015ea9a1, 0x00b3b45d, 0x00189b4e}}}, + {X: Field{[10]uint32{0x0011d374, 0x012e02e5, 0x0122e102, 0x032be641, 0x02cdb502, 0x01818ae5, 0x01624cfc, 0x01c7a4c8, 0x0112bed2, 0x0010caf2}}, Y: Field{[10]uint32{0x0011cf01, 0x0339a8f9, 0x03605bcd, 0x030aebae, 0x034cb341, 0x03175177, 0x020cc5ac, 0x01350507, 0x009edd7c, 0x00399151}}}, + {X: Field{[10]uint32{0x0010518e, 0x00fb27d9, 0x01be477b, 0x02b420e9, 0x030717f5, 0x009764de, 0x02970865, 0x00e16854, 0x032883ec, 0x002b0f4e}}, Y: Field{[10]uint32{0x00b9b8db, 0x031c9a21, 0x01a125fc, 0x03e55061, 0x033dde58, 0x0039e439, 0x00d01b2c, 0x01f9d704, 0x02fcc9ed, 0x003449bb}}}, + {X: Field{[10]uint32{0x03d6aa37, 0x00f690ea, 0x0064a5c1, 0x018a5834, 0x03fa18b2, 0x01ab8999, 0x03696d95, 0x00e175b6, 0x034b2a82, 0x00115c20}}, Y: Field{[10]uint32{0x01236f28, 0x0121ac18, 0x004e121a, 0x0192b590, 0x03d9d15c, 0x02a565f9, 0x022eb590, 0x02fe21ee, 0x0083b249, 0x0007a758}}}, + {X: Field{[10]uint32{0x0183ef15, 0x00d5752e, 0x03fd3341, 0x0144dabb, 0x02b224b0, 0x0058f02a, 0x029bf792, 0x03816df0, 0x02a0ffaa, 0x00223a69}}, Y: Field{[10]uint32{0x018d1e5a, 0x01a4c91c, 0x00413999, 0x01d746ba, 0x00fe4574, 0x01e6aebf, 0x00ef5e25, 0x018fab71, 0x022dfa2f, 0x003b4e0a}}}, + {X: Field{[10]uint32{0x02dff706, 0x0361d20a, 0x0348c04f, 0x00ef5b25, 0x00b39703, 0x02b5fd86, 0x005663dc, 0x009f1a94, 0x02b4de33, 0x0005a043}}, Y: Field{[10]uint32{0x0260c81b, 0x02f0b3fb, 0x0111901f, 0x01f96a7b, 0x0230693b, 0x00370a6b, 0x019e84c4, 0x01b27485, 0x03d89132, 0x0000d4ba}}}, + {X: Field{[10]uint32{0x014adf7b, 0x00cc0726, 0x01cabe2e, 0x03650fea, 0x0088c861, 0x0223455f, 0x01c65035, 0x01260473, 0x02929506, 0x0035f40e}}, Y: Field{[10]uint32{0x002f9627, 0x00578d8e, 0x003ef2a9, 0x023f66aa, 0x02ef419c, 0x0339e079, 0x023042d5, 0x00b01472, 0x03fe933c, 0x00232082}}}, + {X: Field{[10]uint32{0x01cf11b0, 0x03c994b7, 0x018d91c6, 0x01df9154, 0x03f33aed, 0x0220339e, 0x0225c4ae, 0x02b24093, 0x0104f645, 0x0016cb25}}, Y: Field{[10]uint32{0x01296449, 0x02271d8a, 0x00354fc2, 0x02893abb, 0x03440e1d, 0x023ca901, 0x01681e5e, 0x013cc847, 0x03bcc776, 0x001402cd}}}, + {X: Field{[10]uint32{0x00fbd761, 0x012b7523, 0x01c2d628, 0x0137d5e7, 0x03bab1a6, 0x03567bb0, 0x01826759, 0x022ef05a, 0x02edd2c7, 0x00346389}}, Y: Field{[10]uint32{0x010770c3, 0x031fbd5f, 0x021a44a6, 0x03684e4b, 0x00685915, 0x016eda51, 0x018989aa, 0x00f9e23f, 0x0172037a, 0x00068780}}}, + {X: Field{[10]uint32{0x0258222d, 0x00d338a3, 0x0077224f, 0x02fe1759, 0x02dc9e46, 0x03c94951, 0x0221e88d, 0x011e5632, 0x00169bbc, 0x0017dac5}}, Y: Field{[10]uint32{0x037fd6a6, 0x02ab6bd2, 0x00600e02, 0x02378e0f, 0x033a5791, 0x018f992e, 0x03ca0bf1, 0x00140651, 0x02164d5a, 0x000ea39d}}}, + {X: Field{[10]uint32{0x03762bc7, 0x036f2283, 0x0137339b, 0x00289508, 0x01ec2e05, 0x03fa15a4, 0x00020238, 0x02d159a6, 0x01e8dcc8, 0x0035e989}}, Y: Field{[10]uint32{0x02ea3643, 0x0142d34d, 0x0080620d, 0x029c4000, 0x00208683, 0x03b07f63, 0x017bcbcf, 0x00981eaf, 0x0135a8ce, 0x0023c7e6}}}, + {X: Field{[10]uint32{0x015913f9, 0x03198fa3, 0x027716ba, 0x0325780a, 0x027ffb42, 0x0286cd3a, 0x01c891b3, 0x0293dc57, 0x001972ae, 0x00295a95}}, Y: Field{[10]uint32{0x03c3f994, 0x0266a41a, 0x038971e9, 0x008d9038, 0x0059b440, 0x01fd7451, 0x00f7bbfa, 0x0159c460, 0x03cdad78, 0x0011ecf7}}}, + {X: Field{[10]uint32{0x02ade31e, 0x0045beae, 0x03c3ad93, 0x02ccd86d, 0x0030325d, 0x028c1ad1, 0x031a3cd4, 0x032f44de, 0x01d7e574, 0x0007aee2}}, Y: Field{[10]uint32{0x00da4dc7, 0x01401d4e, 0x03e6cb95, 0x00cd24d5, 0x02ee020c, 0x0108a8d0, 0x003d1185, 0x03212d26, 0x012fbd30, 0x00080e71}}}, + {X: Field{[10]uint32{0x009706fe, 0x024ea22d, 0x030c5ad4, 0x03e8fb93, 0x03e189ef, 0x01e63b09, 0x01cd1a4a, 0x0195d52d, 0x0208931a, 0x002d5ca0}}, Y: Field{[10]uint32{0x03ede9ee, 0x037df442, 0x036c214d, 0x0028c5e0, 0x03358f68, 0x01881e2f, 0x029a6125, 0x034c072c, 0x01e72da3, 0x002ae9e1}}}, + {X: Field{[10]uint32{0x01a775c9, 0x015f2161, 0x00a8aa24, 0x025d1ebf, 0x02f5162a, 0x03ff07bd, 0x02a00dee, 0x01f1dc80, 0x0270d67b, 0x00159985}}, Y: Field{[10]uint32{0x018803f6, 0x01128953, 0x019b2ea0, 0x024ce7c6, 0x014de8a8, 0x015274f0, 0x0055122e, 0x01441c13, 0x00e183bc, 0x002b6bc2}}}, + {X: Field{[10]uint32{0x01f2704d, 0x001a3c37, 0x023e93fd, 0x0346c5c2, 0x01c18521, 0x015cded4, 0x01042433, 0x01ada5dc, 0x02e1ecc8, 0x00062ad5}}, Y: Field{[10]uint32{0x0119e94a, 0x020967a0, 0x039ff46b, 0x01fb387f, 0x03df74f0, 0x032cc158, 0x009572ca, 0x02ea6c83, 0x003f43bf, 0x00331a53}}}, + {X: Field{[10]uint32{0x020ac357, 0x0283c6f3, 0x027c3c1a, 0x0214b83c, 0x036e9451, 0x02fd7d43, 0x035b7540, 0x000d8055, 0x00744827, 0x002f04aa}}, Y: Field{[10]uint32{0x01ada1e9, 0x0005f1bc, 0x036f95de, 0x01598bfc, 0x00abe12d, 0x00812b39, 0x027783c7, 0x01738759, 0x036bac17, 0x00271b39}}}, + {X: Field{[10]uint32{0x01054584, 0x01eb119e, 0x024572c2, 0x0259776f, 0x01756667, 0x014fb29d, 0x01bdd6c3, 0x036835bb, 0x002699b2, 0x00291253}}, Y: Field{[10]uint32{0x0082d621, 0x014e1b54, 0x01d03554, 0x01a4ee2b, 0x02e8f0cf, 0x00756c6e, 0x022a9146, 0x02a79f4f, 0x00d58360, 0x00162601}}}, + {X: Field{[10]uint32{0x023aea6e, 0x012b2733, 0x009c7828, 0x038ba8f7, 0x03f1baf9, 0x000da809, 0x034de77d, 0x0139faf8, 0x02f96d0e, 0x0007fe11}}, Y: Field{[10]uint32{0x013f2e6a, 0x00f84b59, 0x009748d0, 0x03be94b7, 0x0327ba3e, 0x01302da3, 0x035d1a8d, 0x00d580c7, 0x036b9f0e, 0x0022828c}}}, + {X: Field{[10]uint32{0x0110b374, 0x023c7ca5, 0x00099ffa, 0x0090d5d1, 0x026862d7, 0x005cfdc5, 0x00839e04, 0x00f771ca, 0x02ae9157, 0x000cc606}}, Y: Field{[10]uint32{0x01c5223e, 0x039f27ef, 0x01fedad0, 0x01acf86a, 0x01f01ee2, 0x030d3129, 0x01aaa0a4, 0x03393077, 0x029a8cc8, 0x00049484}}}, + {X: Field{[10]uint32{0x00012594, 0x0232795e, 0x02ae5702, 0x001bf931, 0x00644264, 0x01c9d2a5, 0x0249b157, 0x0112bbdd, 0x032dfb0e, 0x0039a1e0}}, Y: Field{[10]uint32{0x0113b7c0, 0x030312a9, 0x030028ca, 0x0263bb2a, 0x03c5de4f, 0x01dffedf, 0x01caec8c, 0x00d2ded9, 0x009706b7, 0x001796ce}}}, + {X: Field{[10]uint32{0x00b37def, 0x031cbce5, 0x02aa5755, 0x01477d31, 0x0000c229, 0x028631db, 0x0174b5e2, 0x01c6b160, 0x02c3ed93, 0x000d52ef}}, Y: Field{[10]uint32{0x0214c29a, 0x02a0ff31, 0x0244b5c2, 0x03beeeae, 0x033c2f4d, 0x01d0078f, 0x0213ac73, 0x0105b6cd, 0x00769283, 0x00103432}}}, + {X: Field{[10]uint32{0x0039a485, 0x01bdc99d, 0x00511ae3, 0x02ffe8bd, 0x02a8bc68, 0x02d7afbc, 0x01e8aa68, 0x02e07cf2, 0x006c5205, 0x003e91ab}}, Y: Field{[10]uint32{0x0367d180, 0x01354b8f, 0x03b35c1b, 0x01e9d97e, 0x010f2565, 0x00fe4461, 0x00de37b1, 0x034aa007, 0x01fab016, 0x000e14fe}}}, + {X: Field{[10]uint32{0x0024328c, 0x01fb50cc, 0x02688562, 0x01de517d, 0x0256a53d, 0x008fee1b, 0x005263c9, 0x017e387a, 0x02b73325, 0x00109be1}}, Y: Field{[10]uint32{0x028c4fdf, 0x03bef353, 0x011486a2, 0x0105abfe, 0x01658c63, 0x01ec8885, 0x013c4c45, 0x0322756c, 0x01685301, 0x0024bb00}}}, + {X: Field{[10]uint32{0x00bc64e3, 0x02db9620, 0x01edeb47, 0x03b2d6b8, 0x017685df, 0x01f5233c, 0x01d3f4d1, 0x00b56f85, 0x009bf9a7, 0x00172347}}, Y: Field{[10]uint32{0x01bda7e5, 0x0343df4a, 0x02dc4e18, 0x014d9074, 0x00b6a26b, 0x0083c37b, 0x038a3c7c, 0x02054198, 0x010e286c, 0x00188155}}}, + {X: Field{[10]uint32{0x0283422f, 0x02f95c39, 0x03c80271, 0x01cfe998, 0x01be6733, 0x01aa72c0, 0x00313562, 0x01407f77, 0x01bc7bf7, 0x000e8087}}, Y: Field{[10]uint32{0x001bfa53, 0x01ec3793, 0x00fff54c, 0x0209217f, 0x02a7a71b, 0x0015924a, 0x00e508ad, 0x037e25e1, 0x00540dda, 0x00192a27}}}, + {X: Field{[10]uint32{0x03ba47bb, 0x012bc9c8, 0x0326fa50, 0x030c8a59, 0x027c0062, 0x007590b6, 0x01d2dd91, 0x027c001d, 0x02491d71, 0x002360aa}}, Y: Field{[10]uint32{0x03e4e77a, 0x01718b14, 0x026991ff, 0x03f51d83, 0x007c2ae8, 0x031b4f14, 0x00ed10d6, 0x01e3da62, 0x03506d14, 0x001b985b}}}, + {X: Field{[10]uint32{0x005e536f, 0x03c2394f, 0x02d76f27, 0x0145b9ea, 0x010bbe54, 0x032b06cf, 0x015d60ef, 0x023869bb, 0x0188fe48, 0x001bfbba}}, Y: Field{[10]uint32{0x0044c502, 0x00a6632c, 0x00eeff48, 0x0184d781, 0x0073dcee, 0x0096da28, 0x026d8484, 0x02ea5ae8, 0x0395839f, 0x00003ba7}}}, + {X: Field{[10]uint32{0x0216fa1b, 0x00f9672b, 0x00e5d2df, 0x002ba257, 0x02306388, 0x005024f1, 0x03cadc73, 0x00355dcb, 0x0179bafd, 0x000d8902}}, Y: Field{[10]uint32{0x004afa48, 0x005f1872, 0x036ca65f, 0x003055e0, 0x03eb2082, 0x01f60cb2, 0x02fe3267, 0x00f6169e, 0x037658ef, 0x00186740}}}, + {X: Field{[10]uint32{0x036a18f4, 0x026128f3, 0x03407009, 0x0132461d, 0x000b7849, 0x01ba05c1, 0x0046fc32, 0x01814f08, 0x00474da5, 0x00130ae2}}, Y: Field{[10]uint32{0x0328142c, 0x007f884e, 0x03398dda, 0x038f432a, 0x03734286, 0x01716a08, 0x00a0b438, 0x035c4587, 0x026917a4, 0x001166a7}}}, + {X: Field{[10]uint32{0x01478ac2, 0x004beeac, 0x005ad84e, 0x0142bdee, 0x00d6e54f, 0x0141130d, 0x034eb5b1, 0x0046ea9f, 0x01fdb332, 0x003e4872}}, Y: Field{[10]uint32{0x02016973, 0x005243eb, 0x014f9317, 0x030d7356, 0x01e31fae, 0x03dfd893, 0x006b16a5, 0x0120f923, 0x01b8c850, 0x000e336a}}}, + {X: Field{[10]uint32{0x0319b257, 0x00b1ac86, 0x038b8ca4, 0x01f7d079, 0x02850ae0, 0x028ff6d3, 0x006c8a7d, 0x035a3e3e, 0x01e66181, 0x00295dda}}, Y: Field{[10]uint32{0x027cfc6c, 0x0276bf14, 0x00eb3882, 0x0260a03e, 0x011dcd66, 0x013542e9, 0x017e00d5, 0x0310afdd, 0x007e644b, 0x00084aa6}}}, + {X: Field{[10]uint32{0x03c11d9f, 0x02a526b1, 0x0063901e, 0x0053fb5d, 0x03375a27, 0x00f26c5a, 0x00c91952, 0x03b2b622, 0x010437ab, 0x002569e0}}, Y: Field{[10]uint32{0x02cfdf78, 0x007b2ca8, 0x0274809e, 0x01da4688, 0x00ec6428, 0x03c46925, 0x02723df1, 0x0015ac90, 0x00aa227b, 0x003ab8c8}}}, + {X: Field{[10]uint32{0x01cfa42a, 0x03503d0a, 0x020e5d10, 0x01761612, 0x009f034a, 0x03a61002, 0x01a9a64c, 0x00f850ab, 0x0034f7ef, 0x001da9f8}}, Y: Field{[10]uint32{0x028effa2, 0x0251a2d9, 0x0240479c, 0x025948a8, 0x009f2e49, 0x02f0bbb7, 0x00ec9319, 0x03acf0a9, 0x00e49633, 0x00266770}}}, + {X: Field{[10]uint32{0x035881d6, 0x023347ba, 0x0247df4e, 0x03357a50, 0x01427010, 0x036df60b, 0x00ddf929, 0x01e01407, 0x03964756, 0x003aea24}}, Y: Field{[10]uint32{0x03bca552, 0x029a6d76, 0x026a50d4, 0x022a3692, 0x02aebe0f, 0x005b3175, 0x037d8be6, 0x014850fc, 0x01f1c088, 0x002e4ab8}}}, + {X: Field{[10]uint32{0x0223704f, 0x03cf875b, 0x028addd3, 0x0225c4f3, 0x01dc0b75, 0x02bb51cd, 0x014f872a, 0x038559ac, 0x00d8059f, 0x00294e92}}, Y: Field{[10]uint32{0x01387fb6, 0x022d454e, 0x02a0d252, 0x00619db3, 0x004f4634, 0x03b9f559, 0x009403f3, 0x028ea0f6, 0x01a07e85, 0x00279ce3}}}, + {X: Field{[10]uint32{0x0307d3bc, 0x013f57a9, 0x00fb595b, 0x03e660a2, 0x03c831cd, 0x001418e9, 0x039b1481, 0x03e28e38, 0x010bdba5, 0x0020c996}}, Y: Field{[10]uint32{0x03768982, 0x01986caf, 0x02b06cb4, 0x013ca5f9, 0x03061b7d, 0x03e904c3, 0x000d62ec, 0x037494b4, 0x0388a2a1, 0x000280b3}}}, + {X: Field{[10]uint32{0x03916030, 0x02b1b7c5, 0x014af7f5, 0x00b02571, 0x03b0c35a, 0x01e9d2cb, 0x01714a21, 0x0042ff8c, 0x0194ba8c, 0x001a9248}}, Y: Field{[10]uint32{0x00c77b87, 0x01b148be, 0x0145db6b, 0x0001bfaf, 0x01c531cd, 0x013f0ca2, 0x02e8b4fb, 0x024dea4b, 0x01658e0c, 0x000f3c2f}}}, + {X: Field{[10]uint32{0x03c52a57, 0x030c1a0c, 0x007474b6, 0x004df8f5, 0x013b34bf, 0x01ae8887, 0x0180c494, 0x01fbb587, 0x01c6ff79, 0x002d2b1c}}, Y: Field{[10]uint32{0x012820f7, 0x000d41b5, 0x03683905, 0x01837e04, 0x0214ae3b, 0x01893835, 0x03d23434, 0x03fbf3bc, 0x02e48fb6, 0x0011ab2c}}}, + {X: Field{[10]uint32{0x0286e0bc, 0x0064c5b0, 0x02f9b49a, 0x024e8707, 0x0113b19b, 0x0155ec84, 0x03f05b4e, 0x00a7845a, 0x011e65bc, 0x0022c45c}}, Y: Field{[10]uint32{0x02af0dde, 0x0241e322, 0x004910aa, 0x03d71c8b, 0x00faa6bc, 0x02d3ab96, 0x02d695e5, 0x00d4e086, 0x00cfcf38, 0x001e7128}}}, + {X: Field{[10]uint32{0x0008e098, 0x013d90d1, 0x0192d897, 0x030db5e8, 0x00727362, 0x0203f789, 0x0203f82e, 0x0095e65d, 0x0276e86b, 0x002e2c02}}, Y: Field{[10]uint32{0x013e56c6, 0x006dbe14, 0x03d0a585, 0x03ede121, 0x029e0b9f, 0x03ab5ecb, 0x006fa1cf, 0x002375f3, 0x03188b01, 0x000176d9}}}, + {X: Field{[10]uint32{0x01d89814, 0x038b4b58, 0x03a52c50, 0x01a41917, 0x02bebe8f, 0x026dc4f1, 0x0027a8f6, 0x02e5a14d, 0x021b0fb6, 0x0022130e}}, Y: Field{[10]uint32{0x03a3749b, 0x01963381, 0x00fbf14d, 0x012f56c6, 0x00ff28aa, 0x03d537b0, 0x003f821d, 0x00bbbcdd, 0x00e5094b, 0x000f6b30}}}, + {X: Field{[10]uint32{0x00637596, 0x0291fe5d, 0x037d8496, 0x006abad8, 0x02c004dd, 0x02fdbed3, 0x004100dc, 0x02fd8ff8, 0x01cf51aa, 0x000f4307}}, Y: Field{[10]uint32{0x025df51c, 0x010c8d82, 0x0305d228, 0x004cf8bb, 0x02883fe0, 0x0267eedd, 0x0242a6f5, 0x038b3418, 0x015bbf5d, 0x0015dbaf}}}, + {X: Field{[10]uint32{0x02bca8c7, 0x020478b6, 0x028fa13f, 0x02d8f54c, 0x031ae972, 0x009deddf, 0x0057f79a, 0x026b7097, 0x01af6153, 0x0015acfb}}, Y: Field{[10]uint32{0x012e98eb, 0x02b19b4b, 0x01347dbd, 0x02ade6cf, 0x0096bdfb, 0x0376a574, 0x02b3d2b5, 0x021809c6, 0x0100a2b2, 0x00100e0e}}}, + {X: Field{[10]uint32{0x03cfd3e2, 0x02417eca, 0x01457a74, 0x0360c67e, 0x025fbb11, 0x0115217f, 0x00eacfa8, 0x01327d0d, 0x01bf50f3, 0x00109b8a}}, Y: Field{[10]uint32{0x03cb117a, 0x004c660c, 0x017a35d6, 0x02237c7d, 0x00eeb60b, 0x00ee77d0, 0x0110cd5c, 0x01031883, 0x02e8eeff, 0x003ab11f}}}, + {X: Field{[10]uint32{0x02929308, 0x014329d8, 0x03ea67ed, 0x03ed6ff0, 0x03cf0a91, 0x00bb6b71, 0x01419baa, 0x0135fb1b, 0x03c9f4e2, 0x002555cd}}, Y: Field{[10]uint32{0x001675dd, 0x02b3bb52, 0x0260867b, 0x02d6ee0b, 0x01b69831, 0x0166fd91, 0x02783143, 0x024100be, 0x009d18fd, 0x0025eeee}}}, + {X: Field{[10]uint32{0x00b3e514, 0x021405fa, 0x004a1cbb, 0x02820e9e, 0x00704e74, 0x035f9eb4, 0x03ae639f, 0x009e83cb, 0x0013d464, 0x00175caa}}, Y: Field{[10]uint32{0x00876c2f, 0x00584f2e, 0x005ac9bc, 0x00dbd471, 0x022e8c26, 0x0267ae56, 0x01d6839a, 0x03187956, 0x010e851f, 0x00324bd0}}}, + {X: Field{[10]uint32{0x0369b6ef, 0x0146edf9, 0x02406225, 0x02701e14, 0x02dda784, 0x01c12570, 0x00876d91, 0x02224188, 0x0359e9bc, 0x0031f6a4}}, Y: Field{[10]uint32{0x01c10653, 0x02530fc1, 0x001c6d37, 0x031720bc, 0x01cb41f6, 0x012831f6, 0x01907872, 0x02340257, 0x01687150, 0x000489e0}}}, + {X: Field{[10]uint32{0x029ac683, 0x024193d5, 0x01ace972, 0x035ff86b, 0x02d92697, 0x0082b945, 0x03ee080f, 0x03c3f70b, 0x0226da7a, 0x0019c202}}, Y: Field{[10]uint32{0x0316d94d, 0x008b3f08, 0x03714aa5, 0x0339e7dd, 0x008e08c5, 0x01443ab0, 0x0144107e, 0x01c22cc2, 0x03acfbba, 0x002b6681}}}, + {X: Field{[10]uint32{0x03fc0dbf, 0x00015c16, 0x01a4163a, 0x00117055, 0x023947f4, 0x00b8ebeb, 0x0078ddc8, 0x00a3ddbe, 0x0239d614, 0x00084356}}, Y: Field{[10]uint32{0x028c511c, 0x02c600cb, 0x017ac96e, 0x01324fa6, 0x002efa80, 0x01ea464f, 0x014cc296, 0x00a70bb4, 0x03e6b0a6, 0x00185fbf}}}, + {X: Field{[10]uint32{0x0334ed98, 0x00874138, 0x015fc590, 0x0071bfd9, 0x039b8e46, 0x01e0df44, 0x03242a93, 0x0046e714, 0x0231ca15, 0x001742e4}}, Y: Field{[10]uint32{0x03e924ae, 0x00e99baf, 0x01986bd1, 0x0387dbe3, 0x011a2f58, 0x0279f5b3, 0x03ae1b4a, 0x013b69c4, 0x0121f479, 0x003201c0}}}, + {X: Field{[10]uint32{0x02907392, 0x01e299f8, 0x00ab63ce, 0x00abf344, 0x019013fe, 0x0131c65d, 0x00c8bd54, 0x004587b4, 0x002c4210, 0x001a1eee}}, Y: Field{[10]uint32{0x000d9eeb, 0x017a5984, 0x03e356a2, 0x020440e5, 0x03fafc8e, 0x022c8273, 0x03c721cf, 0x028e9be7, 0x0187758a, 0x003abd8f}}}, + {X: Field{[10]uint32{0x025f5d33, 0x01a9b473, 0x00da40e6, 0x0347d2f3, 0x03c63527, 0x03cb0ffc, 0x02a3931f, 0x023da068, 0x0157b804, 0x00146910}}, Y: Field{[10]uint32{0x0047dd31, 0x009ffa7a, 0x02a1ec51, 0x019cb6e5, 0x001a0c56, 0x00298e24, 0x03dc8f42, 0x00a50053, 0x0116519c, 0x001bff23}}}, + {X: Field{[10]uint32{0x01e86775, 0x01c2f2e3, 0x004f989f, 0x02c8af5f, 0x000a5dd7, 0x01e30eff, 0x024786a4, 0x00568d58, 0x017256f5, 0x002ca189}}, Y: Field{[10]uint32{0x0264f3a3, 0x0364cb51, 0x03692abc, 0x037917c5, 0x02f53b64, 0x024a4bfe, 0x0267e5b2, 0x014e5ade, 0x02a80a5a, 0x0008aba5}}}, + {X: Field{[10]uint32{0x0035bc30, 0x01f1ff82, 0x02e584bb, 0x02f3ee4a, 0x036ee129, 0x028e5884, 0x03d89a5c, 0x01e32bba, 0x021e2010, 0x003ddadc}}, Y: Field{[10]uint32{0x02c0d561, 0x00bd28f9, 0x024b7a06, 0x00e07a5a, 0x03223a0a, 0x0186ebff, 0x02b3d171, 0x026100f5, 0x02b10841, 0x0016671a}}}, + {X: Field{[10]uint32{0x00178e9c, 0x001f0d31, 0x01b9793b, 0x022cdb7b, 0x01d9a3b8, 0x03da5a44, 0x02f20b7f, 0x03b81ba0, 0x028763ad, 0x0004bc92}}, Y: Field{[10]uint32{0x0055b7f1, 0x01e35638, 0x021b7351, 0x037c230b, 0x02b2427f, 0x00a09efb, 0x025d939c, 0x007edec9, 0x039f96f0, 0x00167f5e}}}, + {X: Field{[10]uint32{0x0122260a, 0x008878c6, 0x010cefa0, 0x0117123e, 0x00bcfaf1, 0x01609033, 0x0082d477, 0x01aef8a8, 0x0290de6c, 0x002786e2}}, Y: Field{[10]uint32{0x03390f9f, 0x02966042, 0x000a66cd, 0x001ba923, 0x008a71eb, 0x0025f401, 0x02a54f42, 0x036781f0, 0x02a5b54b, 0x003e97a1}}}, + {X: Field{[10]uint32{0x03baae9c, 0x00240c4b, 0x020a38c1, 0x03e1b134, 0x01ed4117, 0x00a38c7c, 0x01b6a66e, 0x00fadec0, 0x010320b7, 0x0018fc16}}, Y: Field{[10]uint32{0x0101d8eb, 0x02fa2c65, 0x019c501a, 0x032aebd7, 0x0340bd68, 0x0098e1df, 0x0288967a, 0x0207f81b, 0x01d2d34a, 0x00092e32}}}, + {X: Field{[10]uint32{0x03905999, 0x0264ad18, 0x003a8e27, 0x01ba671d, 0x01e5c89b, 0x0367ca15, 0x03569a4a, 0x00a8f687, 0x0009f540, 0x00111f1d}}, Y: Field{[10]uint32{0x0149e154, 0x0240dc2b, 0x0328db77, 0x01ce2e4f, 0x00716baa, 0x03805b02, 0x0337723b, 0x01e8251e, 0x019ab34a, 0x003513a3}}}, + {X: Field{[10]uint32{0x00793254, 0x03c437fe, 0x006df1bb, 0x03d28fe6, 0x0025eed4, 0x003c65f9, 0x037db0c2, 0x0102bead, 0x006a4c53, 0x001d2910}}, Y: Field{[10]uint32{0x03742023, 0x0261fad9, 0x0246dfc7, 0x02f014aa, 0x02dc4c07, 0x00711ac5, 0x0136907d, 0x029c4a33, 0x038a0a4b, 0x00058b59}}}, + {X: Field{[10]uint32{0x03047c07, 0x00c91ba3, 0x005ff3a2, 0x01d814e9, 0x022bf5e0, 0x010731ed, 0x00e63cc8, 0x0098deac, 0x01713187, 0x003dc0d4}}, Y: Field{[10]uint32{0x021097ef, 0x03ba7076, 0x00936cca, 0x032599c6, 0x02b3c7ee, 0x025cad67, 0x01762a95, 0x001e15c8, 0x03914f47, 0x003212c0}}}, + {X: Field{[10]uint32{0x02eaae11, 0x0267dbdc, 0x024f6ac9, 0x01a37285, 0x022194d1, 0x02c29054, 0x013bd706, 0x00d604b1, 0x007b57b2, 0x003b13f8}}, Y: Field{[10]uint32{0x02fff789, 0x00a3d728, 0x004d7b55, 0x01e6f74c, 0x01b2f9df, 0x026dd814, 0x02b1dc4e, 0x02ca7fb0, 0x029145de, 0x002bd254}}}, + {X: Field{[10]uint32{0x01d2ac9d, 0x02ead2b3, 0x0238878d, 0x011c47cd, 0x00c65520, 0x005a3435, 0x00b274ee, 0x005d3de8, 0x01e8fa96, 0x0005c55b}}, Y: Field{[10]uint32{0x0061ac3d, 0x01a00fc5, 0x00ca6abb, 0x0211e78a, 0x03c2de9f, 0x037b2e23, 0x00e37ed6, 0x01183261, 0x02c436c1, 0x0000ab8f}}}, + {X: Field{[10]uint32{0x021b2ede, 0x032990e6, 0x02a6aabf, 0x00302541, 0x01549cb9, 0x00374c33, 0x029be560, 0x011feb3e, 0x022b9c5a, 0x003906d1}}, Y: Field{[10]uint32{0x017507f4, 0x002fc440, 0x01311d38, 0x01308885, 0x03e1b360, 0x0231a563, 0x00fb3533, 0x02982b1a, 0x02b208bd, 0x000423f8}}}, + {X: Field{[10]uint32{0x0344aa38, 0x01bd0ddd, 0x015ad38a, 0x01e314ee, 0x03f357ea, 0x006a00e3, 0x00800515, 0x01e20f5e, 0x015920a6, 0x002e9b00}}, Y: Field{[10]uint32{0x02002cf3, 0x026d6e45, 0x03680457, 0x006d9a1b, 0x00cda144, 0x003a39c4, 0x0366aa5c, 0x02dd1a0c, 0x00e7deb6, 0x00369270}}}, + {X: Field{[10]uint32{0x00cbf1ae, 0x020d5a3e, 0x0329cee2, 0x014e1255, 0x037e8a95, 0x01f94998, 0x0102ab7f, 0x012dae1c, 0x006e883a, 0x0009bc06}}, Y: Field{[10]uint32{0x03d5f47a, 0x009176d2, 0x002d398b, 0x008c1d5c, 0x00aad788, 0x02568628, 0x01519809, 0x025f2b33, 0x01e4bb21, 0x0003bbe3}}}, + {X: Field{[10]uint32{0x000c9d22, 0x0007296d, 0x03cddc45, 0x038f6998, 0x03e00874, 0x00050398, 0x01b5588c, 0x033af0d4, 0x03de80c0, 0x000042e4}}, Y: Field{[10]uint32{0x00903258, 0x016d3407, 0x002842d0, 0x03c850d6, 0x001dfef7, 0x03b1257b, 0x0186b027, 0x03cdaf9e, 0x01ddf79a, 0x003b4c62}}}, + {X: Field{[10]uint32{0x03769dde, 0x0268f9dd, 0x002558bc, 0x0101db25, 0x017a1595, 0x03d6a315, 0x03b32da8, 0x020b0725, 0x0274337a, 0x0039e7b0}}, Y: Field{[10]uint32{0x028a06f6, 0x0145d898, 0x0102c3b6, 0x03660f5d, 0x02e527da, 0x02223cfb, 0x024c175d, 0x03f38d52, 0x039f22da, 0x0027c8c1}}}, + {X: Field{[10]uint32{0x03c101e1, 0x034c685b, 0x01b0c1b7, 0x038e4810, 0x002be265, 0x023832a9, 0x039915e0, 0x02b4ff22, 0x017544f0, 0x0003f680}}, Y: Field{[10]uint32{0x018902e7, 0x00bd7061, 0x0030d0db, 0x01dae128, 0x03e4d49a, 0x029415cc, 0x03e42981, 0x0271baf1, 0x022785d5, 0x001093a6}}}, + {X: Field{[10]uint32{0x0099c6bd, 0x033c46e8, 0x01b31577, 0x028f2f3f, 0x008327d8, 0x022f20c3, 0x03147258, 0x0337f940, 0x01cb5380, 0x001a07c0}}, Y: Field{[10]uint32{0x039002bc, 0x0252463c, 0x018cd007, 0x02b63836, 0x0359c02f, 0x03f279d5, 0x006cef06, 0x02c17e70, 0x0117cdc3, 0x002fe748}}}, + {X: Field{[10]uint32{0x03d12f64, 0x00825736, 0x039611de, 0x0236e7bf, 0x03d6fe9f, 0x02b28942, 0x0251f4d9, 0x00b30b74, 0x026b2a2d, 0x001c3096}}, Y: Field{[10]uint32{0x02966126, 0x02669346, 0x021f46b2, 0x00136647, 0x03134dae, 0x024fa96d, 0x03f4dc47, 0x02cb3f34, 0x0368a386, 0x00327bab}}}, + {X: Field{[10]uint32{0x03ccbb9d, 0x00486e27, 0x0330403b, 0x02143fa2, 0x023b466e, 0x03d02199, 0x03d5ea45, 0x010b53fb, 0x012c404b, 0x0011937b}}, Y: Field{[10]uint32{0x005d910b, 0x009c4884, 0x01260796, 0x01ef9069, 0x03610bb4, 0x0295a0d9, 0x02d2d3e0, 0x03d84c8e, 0x01046ad3, 0x002b044e}}}, + {X: Field{[10]uint32{0x03a103db, 0x00bc4d04, 0x023f02ad, 0x02406d73, 0x01b7ff89, 0x023177f0, 0x0055109a, 0x02466175, 0x037248e7, 0x00028cb7}}, Y: Field{[10]uint32{0x03160e72, 0x0084d292, 0x02173821, 0x034cf997, 0x00cf9ad8, 0x01d8a5b2, 0x02a2d1d8, 0x0241ae6b, 0x00fb9d60, 0x001b6d2d}}}, + {X: Field{[10]uint32{0x0165179a, 0x0254c540, 0x03fe9a76, 0x0370a971, 0x023ccb74, 0x013b13fa, 0x00297746, 0x034e725c, 0x029e7ee5, 0x003f9273}}, Y: Field{[10]uint32{0x03e7dc8c, 0x023c3e8f, 0x026e63f5, 0x020ad310, 0x0390bfc5, 0x018555c8, 0x03b98662, 0x01773bbb, 0x013a3592, 0x00194fd5}}}, + {X: Field{[10]uint32{0x0354ad14, 0x01cc5b8c, 0x01a878aa, 0x0028ab75, 0x01ec0f1a, 0x0049ac43, 0x0224750c, 0x029f0936, 0x0255c895, 0x0021a2cb}}, Y: Field{[10]uint32{0x02c299ef, 0x0187c91e, 0x00324efb, 0x02080201, 0x00776bca, 0x0298a46f, 0x03035941, 0x0067f5c7, 0x0074cdea, 0x00178a22}}}, + {X: Field{[10]uint32{0x00098461, 0x03422d63, 0x011aec63, 0x01fbf4cb, 0x03d267ff, 0x003f121a, 0x013f1c08, 0x00d31a2b, 0x00da90ae, 0x003f81e4}}, Y: Field{[10]uint32{0x00f7177e, 0x00efabdb, 0x03ef416f, 0x036d5a02, 0x02cdbfcc, 0x008b184c, 0x01a02444, 0x02ca0d1c, 0x0393de35, 0x002b4cc4}}}, + {X: Field{[10]uint32{0x03e9a9d9, 0x03609e5b, 0x039557f6, 0x03d59a0d, 0x0242a23b, 0x019f7fbe, 0x016b1961, 0x020373fc, 0x028d0f4f, 0x003f9ff2}}, Y: Field{[10]uint32{0x00d4eb3b, 0x023c72f6, 0x01b1e71c, 0x02738605, 0x02ccc572, 0x02051dab, 0x000cb3d6, 0x03a49776, 0x018a0d7e, 0x002ef137}}}, + {X: Field{[10]uint32{0x0034cfc2, 0x00da1625, 0x03fd23aa, 0x0263a7c0, 0x02ae7975, 0x00473d30, 0x011b11b5, 0x03882fad, 0x0270aa4c, 0x00288db0}}, Y: Field{[10]uint32{0x0088f29b, 0x00e8c7c8, 0x01f4c486, 0x0103eeda, 0x028bc370, 0x00230842, 0x00c3ade6, 0x02f7ad07, 0x01c575a7, 0x00164d66}}}, + {X: Field{[10]uint32{0x02519248, 0x0151bf1d, 0x03644565, 0x03ab6787, 0x02800472, 0x00e0d938, 0x028a3485, 0x0309fcfa, 0x00a56bb8, 0x00035a81}}, Y: Field{[10]uint32{0x0142deb9, 0x01c1a6ad, 0x00e079b7, 0x019889ba, 0x03dbf6e4, 0x015d8490, 0x03099aba, 0x01d8a48a, 0x030d50b9, 0x0012e551}}}, + {X: Field{[10]uint32{0x00a30e7f, 0x000baa7e, 0x02ebd74e, 0x00a0c986, 0x00677732, 0x035c0689, 0x0276f974, 0x00117f86, 0x0377d64a, 0x00342734}}, Y: Field{[10]uint32{0x0188ffea, 0x02a49359, 0x02e57b90, 0x03abb81a, 0x0141a342, 0x032be203, 0x02ed2d01, 0x000acf5d, 0x02b902b7, 0x0027c250}}}, + {X: Field{[10]uint32{0x01d98b8b, 0x0343a979, 0x03440b2e, 0x02fffc29, 0x01b9a469, 0x0071f8ff, 0x02e52456, 0x006a75b0, 0x032c16d0, 0x00340c31}}, Y: Field{[10]uint32{0x031f2c8e, 0x02c3c454, 0x006f473d, 0x019f2850, 0x03fddeee, 0x02baa10e, 0x02b60ffe, 0x03e60405, 0x0308dba4, 0x00031ac4}}}, + {X: Field{[10]uint32{0x0345a691, 0x031aec78, 0x03ba1100, 0x03dd5c1a, 0x0157d0c6, 0x002ce695, 0x01980ab8, 0x0129f510, 0x02c6d2c0, 0x0015b115}}, Y: Field{[10]uint32{0x02084819, 0x00d39909, 0x03189fae, 0x00968184, 0x02825ce5, 0x01d4f0ac, 0x0310ffc2, 0x01743e3b, 0x00dc2c73, 0x00316cbc}}}, + {X: Field{[10]uint32{0x008400c9, 0x0146eb0c, 0x0037d75e, 0x03178396, 0x0129d911, 0x0353f779, 0x01d1b98d, 0x0347d0a3, 0x01f3b505, 0x002ab56b}}, Y: Field{[10]uint32{0x0377acc6, 0x02ae1f89, 0x036e46af, 0x03c877d2, 0x00f55569, 0x01e431a3, 0x03aa411b, 0x02530448, 0x03674f79, 0x003a52b7}}}, + {X: Field{[10]uint32{0x026a0ef0, 0x0219e8d7, 0x0034e6b1, 0x030c67b4, 0x02ca1d43, 0x0062d32c, 0x006b089f, 0x02e3dd22, 0x00b4dd76, 0x002b2336}}, Y: Field{[10]uint32{0x037ba96d, 0x02753dc4, 0x001f3c75, 0x02d26f32, 0x02ffb71d, 0x032b73f1, 0x013f8271, 0x02ac55d0, 0x0094f9da, 0x001c75c2}}}, + {X: Field{[10]uint32{0x0047ca1d, 0x0314d5f7, 0x0394841d, 0x0143d085, 0x0093eb41, 0x01665ad1, 0x01d7a4d0, 0x03e91502, 0x006df110, 0x000e5900}}, Y: Field{[10]uint32{0x03ad7cdb, 0x0291b7c0, 0x017d6395, 0x01d0daff, 0x01c2f244, 0x00fc15f9, 0x022a2bd2, 0x0364ebe4, 0x006d21db, 0x00392847}}}, + {X: Field{[10]uint32{0x03ca56ec, 0x0387efde, 0x01d551a0, 0x03e3ed0f, 0x03723a1f, 0x02fe442d, 0x02a37b19, 0x004aedd3, 0x039227a3, 0x000af842}}, Y: Field{[10]uint32{0x02df59ab, 0x014bb731, 0x000b4590, 0x03a3076f, 0x03755b2d, 0x00a42c92, 0x03ecca94, 0x037034a4, 0x02fbc886, 0x00066aa2}}}, + {X: Field{[10]uint32{0x01ad6ae5, 0x018c96ad, 0x01342a4c, 0x005c70e3, 0x03ccc1e4, 0x03ff22ea, 0x0219a34d, 0x03d46874, 0x01562bd7, 0x000de705}}, Y: Field{[10]uint32{0x03185907, 0x00feb10b, 0x0348db98, 0x00d1fc81, 0x01e7bc67, 0x0036554d, 0x01ce2231, 0x0077d59b, 0x028fa637, 0x0011e87c}}}, + {X: Field{[10]uint32{0x03ce9809, 0x033dea07, 0x014f9914, 0x02426277, 0x0130a362, 0x01e0443a, 0x03584a7d, 0x011674ab, 0x01c2e675, 0x00090153}}, Y: Field{[10]uint32{0x017ae592, 0x016128b9, 0x02a7612b, 0x02069bc0, 0x013553dc, 0x008345a9, 0x00e06d48, 0x03429c71, 0x021d3e05, 0x00195cab}}}, + {X: Field{[10]uint32{0x002420a4, 0x02d323a8, 0x0298fa3b, 0x0322e140, 0x02913199, 0x00408ecc, 0x03cd8790, 0x02a5e6ad, 0x02a6f46c, 0x002604b9}}, Y: Field{[10]uint32{0x00f937f0, 0x004ae722, 0x0315152a, 0x00ed595d, 0x033afd96, 0x021be4dd, 0x03baf369, 0x0364cc06, 0x02eddfec, 0x0011a3db}}}, + {X: Field{[10]uint32{0x0313c700, 0x000e969f, 0x03c6b962, 0x03ee5720, 0x029f6c14, 0x00b2778a, 0x00c928d6, 0x02392b61, 0x02446a34, 0x00118161}}, Y: Field{[10]uint32{0x022d57ab, 0x00079dd8, 0x021ad904, 0x004415ec, 0x034c873f, 0x02c62103, 0x0359c203, 0x01c07f99, 0x02e3ca3d, 0x00277157}}}, + {X: Field{[10]uint32{0x00be006a, 0x002541ef, 0x003228e9, 0x03298e6b, 0x021cb877, 0x012bb43e, 0x00d862fe, 0x0017ca91, 0x03972d5b, 0x002a36eb}}, Y: Field{[10]uint32{0x036fa4bc, 0x0312a5c5, 0x0190251a, 0x00a6e0f2, 0x03253e67, 0x0050742f, 0x018d38c6, 0x024df13e, 0x0003f082, 0x000f6d53}}}, + {X: Field{[10]uint32{0x011149fe, 0x01e0024e, 0x01128741, 0x0064899c, 0x02008b30, 0x013e611a, 0x0324bcd4, 0x004ca44c, 0x01f4f4d9, 0x0026e2ce}}, Y: Field{[10]uint32{0x0052c1d3, 0x025aa647, 0x030976b3, 0x01fcb82a, 0x034e4cae, 0x002c346c, 0x03fc6939, 0x00b96a23, 0x03721c45, 0x00124293}}}, + {X: Field{[10]uint32{0x014615eb, 0x00d62b4c, 0x0059773e, 0x00909e99, 0x017406ce, 0x039407e0, 0x02404ea9, 0x011b6c65, 0x01d5a7ef, 0x000cd1a0}}, Y: Field{[10]uint32{0x03ad6c0d, 0x01951094, 0x02b6d6c1, 0x0304dff9, 0x02e328fd, 0x0081a778, 0x004775a5, 0x0335aa7c, 0x003a1d80, 0x000ac8d8}}}, + {X: Field{[10]uint32{0x01c32529, 0x00fc380a, 0x02a88202, 0x01cadeba, 0x02bd5f83, 0x02933390, 0x00639b40, 0x01baf4a5, 0x0310c63c, 0x003fae38}}, Y: Field{[10]uint32{0x0343b213, 0x02fe1b76, 0x02617fbc, 0x018ef7df, 0x0068a45c, 0x019a0898, 0x017934b8, 0x035e02a9, 0x02ad6a0c, 0x0032db90}}}, + {X: Field{[10]uint32{0x0305cb67, 0x003cb121, 0x013b3fcf, 0x02d8acf6, 0x01a8ca5c, 0x02e44295, 0x01232523, 0x013a4b72, 0x03c2c733, 0x003d285e}}, Y: Field{[10]uint32{0x026e9dfe, 0x011c6c36, 0x02304bb0, 0x038f573e, 0x02e7f4a9, 0x03d14982, 0x03d55a32, 0x011ca52c, 0x039501b2, 0x00204add}}}, + {X: Field{[10]uint32{0x00cf181b, 0x011e6e93, 0x0324c7e0, 0x0257c208, 0x02c330a9, 0x03f2abd3, 0x016d596b, 0x010d2552, 0x007b8551, 0x0023b0ab}}, Y: Field{[10]uint32{0x01250130, 0x03aeea4d, 0x00258ce4, 0x025c9ec7, 0x0070e927, 0x0173c2f1, 0x00b3bcf0, 0x03498def, 0x00b67811, 0x003a8562}}}, + {X: Field{[10]uint32{0x00d4f19a, 0x010f1b01, 0x04001534, 0x02ddf68e, 0x03e4aa9e, 0x039231bd, 0x01c4b6d9, 0x0336f032, 0x021bd9ae, 0x002c79b5}}, Y: Field{[10]uint32{0x028cbf4a, 0x03e62bec, 0x031a35ae, 0x02e83b32, 0x011bc20a, 0x0235bcce, 0x01fdb344, 0x0325da2c, 0x0355b2e2, 0x0010ebde}}}, + {X: Field{[10]uint32{0x0313b2be, 0x03c8124b, 0x022e4b69, 0x018c0b53, 0x031a9519, 0x036cd50c, 0x004a3974, 0x011f70e4, 0x02e8210d, 0x001360f4}}, Y: Field{[10]uint32{0x0137a6b3, 0x015cbd8f, 0x000367c8, 0x02b25500, 0x017a0e3b, 0x039610ae, 0x005f1d88, 0x03f25ef9, 0x00833874, 0x001fb65b}}}, + {X: Field{[10]uint32{0x03b20b84, 0x02dba3ca, 0x01c36b9e, 0x03bac2ca, 0x0325f5c5, 0x01549fd9, 0x035d5143, 0x03f0875b, 0x012efd51, 0x0005123a}}, Y: Field{[10]uint32{0x02e344ad, 0x02efae65, 0x03f4cea8, 0x0298e790, 0x0013336a, 0x021a25cf, 0x011c9a22, 0x020f94be, 0x038fc8be, 0x0009228c}}}, + {X: Field{[10]uint32{0x024e4ead, 0x01c24f24, 0x03e63dcf, 0x02c09617, 0x0239d928, 0x03828863, 0x01cc7d44, 0x0142b0b3, 0x03d69c22, 0x00388ec0}}, Y: Field{[10]uint32{0x01b9aea9, 0x03ee2b9c, 0x024542ef, 0x02e84f7b, 0x0380b91c, 0x02b6c135, 0x017ef44f, 0x012df066, 0x03d04a8a, 0x00231a71}}}, + {X: Field{[10]uint32{0x02b5d7cb, 0x01c8ad0c, 0x02f94e5a, 0x0093699a, 0x00786632, 0x02baff2e, 0x02a929b9, 0x00ff9a51, 0x035e21fb, 0x00133478}}, Y: Field{[10]uint32{0x0167e3bc, 0x012ac1dc, 0x02984cba, 0x035dcc32, 0x03eca892, 0x00a5e185, 0x02887803, 0x016c42e9, 0x02dc5e86, 0x001ac444}}}, + {X: Field{[10]uint32{0x020db647, 0x03ec8102, 0x01bf5f2e, 0x02c363c7, 0x00bf25c6, 0x0165bb38, 0x00b92123, 0x02dec09f, 0x02f8092c, 0x003cf3ae}}, Y: Field{[10]uint32{0x0168d8e0, 0x0160af2a, 0x02ab7e12, 0x01cbbef6, 0x02cf3c71, 0x02ee974f, 0x0123b887, 0x03004e46, 0x01eb8418, 0x00298577}}}, + {X: Field{[10]uint32{0x01655e7d, 0x02168b1b, 0x01736a3a, 0x0379ec75, 0x02dfe341, 0x00c605c1, 0x0337c813, 0x03e235a0, 0x0128500b, 0x0012e2b3}}, Y: Field{[10]uint32{0x01219bb8, 0x0325b83f, 0x018ac624, 0x021e113c, 0x027b7c5d, 0x014bcec1, 0x016f76e0, 0x0159d613, 0x03c3825a, 0x002fa4f5}}}, + {X: Field{[10]uint32{0x00eb9fe1, 0x01c6541f, 0x03c53d47, 0x020616ba, 0x003e567d, 0x0331a37a, 0x03d2de62, 0x0002218f, 0x0081d04e, 0x002371eb}}, Y: Field{[10]uint32{0x01fa9198, 0x02e53104, 0x000e8214, 0x0224bb84, 0x031eb14c, 0x0097200f, 0x03a7755e, 0x0064c711, 0x024abe7b, 0x0018b52d}}}, + {X: Field{[10]uint32{0x01b89a23, 0x01394c30, 0x02033710, 0x015e400f, 0x01a817c2, 0x03d3cb06, 0x002bbbed, 0x03523425, 0x003f3078, 0x002a98cd}}, Y: Field{[10]uint32{0x02a7b524, 0x0256399b, 0x009bbfe7, 0x01b4338e, 0x0013befc, 0x037a51d6, 0x0020f4d9, 0x01cc3da7, 0x003423a6, 0x0009dfbe}}}, + {X: Field{[10]uint32{0x01121d30, 0x0135e841, 0x034955d0, 0x0186f085, 0x02dadeba, 0x028df7ce, 0x01096c01, 0x0079023a, 0x00619f30, 0x000df794}}, Y: Field{[10]uint32{0x0138898a, 0x00cbef39, 0x00c31f57, 0x01c35b6d, 0x00e3f6aa, 0x0001565f, 0x0136516c, 0x002e59a8, 0x009c33e4, 0x0001f9c1}}}, + {X: Field{[10]uint32{0x01eb83b4, 0x03cb0311, 0x0045e011, 0x0208be45, 0x003ebc66, 0x00d1d207, 0x028cd44f, 0x01673a8f, 0x0355506d, 0x001b4633}}, Y: Field{[10]uint32{0x00a30cdb, 0x03cabdee, 0x03854c8f, 0x029f3a01, 0x00220f7b, 0x03536e28, 0x039818e5, 0x01cfd1fe, 0x01c1ca8b, 0x003a4c3a}}}, + {X: Field{[10]uint32{0x02caa7d3, 0x025ece45, 0x01c0a5b7, 0x03f7ac74, 0x00f70243, 0x00054b27, 0x00203c49, 0x036b1775, 0x02606de7, 0x001df615}}, Y: Field{[10]uint32{0x019c659c, 0x01f6123d, 0x0122e8c3, 0x03b3e481, 0x031a2722, 0x02cf038e, 0x01b0fc94, 0x03554327, 0x03e39b37, 0x000fd5f3}}}, + {X: Field{[10]uint32{0x0381bf16, 0x0398d77c, 0x01229670, 0x002f5a76, 0x00ea5645, 0x03e753ee, 0x01dc8b56, 0x016ec715, 0x01a6c44b, 0x00170b9a}}, Y: Field{[10]uint32{0x01a3588d, 0x03c0499d, 0x03049f1a, 0x03c930d2, 0x009ec21a, 0x03f42d1b, 0x0021a8c2, 0x032a6e8a, 0x009d0a69, 0x003c2081}}}, + {X: Field{[10]uint32{0x01a393ee, 0x0339002d, 0x02af1918, 0x023626ca, 0x02aaacb9, 0x00afac1a, 0x01944ed9, 0x02496c94, 0x01f5066d, 0x000ca700}}, Y: Field{[10]uint32{0x02a57abf, 0x02bfb7fe, 0x032a9c3c, 0x0114f531, 0x02e21c2c, 0x0292494b, 0x0150c80a, 0x003ffdab, 0x0038427a, 0x001f8a6c}}}, + {X: Field{[10]uint32{0x029525da, 0x02d26f58, 0x0099df62, 0x03f21519, 0x02b670f4, 0x01c75ec3, 0x02bb4017, 0x037e90df, 0x031f18b2, 0x00130b98}}, Y: Field{[10]uint32{0x029a6f9c, 0x022728ff, 0x013701f7, 0x00b68fe1, 0x00050c6c, 0x02df0813, 0x01314326, 0x00fe9d30, 0x03fb8742, 0x0022a57a}}}, + {X: Field{[10]uint32{0x03d03fdc, 0x03efc6d8, 0x03fd9392, 0x0393184c, 0x01d3808c, 0x0384295d, 0x037cf02c, 0x0111971f, 0x03930d25, 0x003f8486}}, Y: Field{[10]uint32{0x009e0ba6, 0x0032f3a9, 0x036352a8, 0x022bcd82, 0x030e5943, 0x0110e83f, 0x03b997f9, 0x010c4653, 0x03077bda, 0x000cc4a6}}}, + {X: Field{[10]uint32{0x03784c23, 0x00ab984b, 0x0316da53, 0x03510600, 0x032cf8c5, 0x0079d2e2, 0x0220521f, 0x03cfddd3, 0x027b1cdb, 0x000c8eb0}}, Y: Field{[10]uint32{0x03c3dc18, 0x025acb4f, 0x01197bb2, 0x005bcf4c, 0x01c8489e, 0x00d2ea69, 0x00b15fe8, 0x012b1622, 0x0108f6a6, 0x00084558}}}, + {X: Field{[10]uint32{0x03afd533, 0x006a3481, 0x00d3741b, 0x0287964d, 0x01eeccbc, 0x03830840, 0x01f0ed5c, 0x02c780e9, 0x0362fdfc, 0x000451e3}}, Y: Field{[10]uint32{0x005f9153, 0x025a667b, 0x0366c70d, 0x02c82614, 0x02aba8d0, 0x0344549e, 0x00cdb176, 0x03b32191, 0x02732fd3, 0x002a7de5}}}, + {X: Field{[10]uint32{0x00b9d078, 0x010fbf08, 0x016e5e73, 0x02d5d9e2, 0x02bc8d82, 0x03b569a9, 0x008acf3a, 0x0306b7ae, 0x01b6c9d3, 0x0027c242}}, Y: Field{[10]uint32{0x007db181, 0x03ce1139, 0x017a33b0, 0x035ee669, 0x0061a579, 0x023d948d, 0x0263e30b, 0x01759371, 0x00a6c5c9, 0x00294587}}}, + {X: Field{[10]uint32{0x024a6b9f, 0x0255f4e9, 0x01711c55, 0x02c6d4bc, 0x032807ac, 0x006be02e, 0x01d8cd1a, 0x02b508a6, 0x007532a9, 0x0012582a}}, Y: Field{[10]uint32{0x02976625, 0x02e42d37, 0x03dd8cd6, 0x000bbbdd, 0x004bfc62, 0x00fe0bc9, 0x008f54a9, 0x0198a3ad, 0x01f3f1b4, 0x0015e394}}}, + {X: Field{[10]uint32{0x01310354, 0x0160bc17, 0x0066854b, 0x00d92d7b, 0x01d142d5, 0x03f27dcf, 0x010951cb, 0x00997952, 0x01c20bdb, 0x0019d70a}}, Y: Field{[10]uint32{0x008bd6d1, 0x00a411f8, 0x03a49832, 0x017e768c, 0x028cb8ad, 0x021af7e9, 0x02d4f9a1, 0x037a1080, 0x02693d82, 0x0008b47d}}}, + {X: Field{[10]uint32{0x007ce605, 0x02df26c4, 0x01d36f65, 0x037eb612, 0x01a9053a, 0x005aaccb, 0x01221779, 0x034389aa, 0x00bd6c75, 0x0031025b}}, Y: Field{[10]uint32{0x01c2bb46, 0x016f94e5, 0x023c294f, 0x01440092, 0x01b2b97e, 0x018ceb81, 0x0361efb9, 0x0325e4bf, 0x03472ae3, 0x0017c8da}}}, + {X: Field{[10]uint32{0x03905c0b, 0x003b66ce, 0x03789dd8, 0x018007e8, 0x01b1ddd4, 0x031d5055, 0x01205ec2, 0x015007c0, 0x0341ddd0, 0x0027a834}}, Y: Field{[10]uint32{0x01a28e69, 0x00570803, 0x03b717e6, 0x016654fd, 0x00ba7ce0, 0x00e625d9, 0x03692cd5, 0x0342ddbc, 0x010197e7, 0x000efd20}}}, + {X: Field{[10]uint32{0x02fb92e4, 0x035d690c, 0x028c7b4d, 0x03cb78dd, 0x01637367, 0x026056c3, 0x026edd2d, 0x03e8cdca, 0x02d784bf, 0x002f7aef}}, Y: Field{[10]uint32{0x03d0b9c0, 0x01312bb3, 0x00067673, 0x007f28ac, 0x01297a43, 0x02882507, 0x016af105, 0x026d8b70, 0x037eb62a, 0x0017fcd0}}}, + {X: Field{[10]uint32{0x02910932, 0x031f5b27, 0x020c7bcc, 0x01d1ded5, 0x000cbfe6, 0x03d55084, 0x02ea82c8, 0x00d3cb5a, 0x0244b46e, 0x002921be}}, Y: Field{[10]uint32{0x0097317a, 0x007208be, 0x03ca8323, 0x02a9fd1f, 0x01b8ad5b, 0x01532955, 0x023caa0f, 0x038a1022, 0x036d8a15, 0x0006adf8}}}, + {X: Field{[10]uint32{0x01cbba08, 0x0069f44a, 0x03769fbd, 0x02c4631f, 0x0366e7ab, 0x0082bbea, 0x0204376a, 0x02a49aa8, 0x00a557a1, 0x001118e8}}, Y: Field{[10]uint32{0x0034af0d, 0x036ada74, 0x02ce09a9, 0x0148973a, 0x037dc081, 0x002e2b44, 0x00f01de2, 0x0180a9c1, 0x02a5ab7b, 0x0012a08e}}}, + {X: Field{[10]uint32{0x01825ac4, 0x029cf7d3, 0x00b4c593, 0x0318bbad, 0x008cbdc5, 0x03647476, 0x03135840, 0x0237eead, 0x024fc45e, 0x0035b822}}, Y: Field{[10]uint32{0x02b4c55f, 0x020032d7, 0x02506c59, 0x036588bf, 0x0108be98, 0x003f8b6f, 0x031ae8fc, 0x0342e941, 0x03b477c0, 0x000b3616}}}, + {X: Field{[10]uint32{0x016a10f1, 0x00fea1fe, 0x03656a43, 0x034293e2, 0x00546d31, 0x026eff4d, 0x0076dca2, 0x032b5398, 0x02992a69, 0x002d89b8}}, Y: Field{[10]uint32{0x03cb5bc6, 0x015bd0d0, 0x03d343c6, 0x00ee32ef, 0x0162ac5e, 0x01789d95, 0x01686325, 0x0249a3c5, 0x02ceba91, 0x001b7d2c}}}, + {X: Field{[10]uint32{0x007139a5, 0x006959a5, 0x03b057e3, 0x03ad8678, 0x0225a4df, 0x03f93497, 0x01d61965, 0x0141c2cb, 0x02eb7464, 0x000d8679}}, Y: Field{[10]uint32{0x0282093f, 0x0035c944, 0x014311aa, 0x00ed1430, 0x0379940c, 0x02519f1e, 0x036c3bf2, 0x01848674, 0x0189ba15, 0x002592e2}}}, + {X: Field{[10]uint32{0x00bda2e9, 0x03dfd232, 0x02a847cc, 0x01838c9a, 0x0141e5c0, 0x014cc258, 0x00a3a65d, 0x0210ff10, 0x035e6718, 0x002cd4a6}}, Y: Field{[10]uint32{0x01c1b935, 0x03f15496, 0x030579d4, 0x01eca99e, 0x0131111e, 0x0216fb3d, 0x00595ac2, 0x02fd17a7, 0x00d37ce1, 0x001279b8}}}, + {X: Field{[10]uint32{0x03a9e05b, 0x02bf7c4b, 0x01598d42, 0x01e2500d, 0x014a1997, 0x03491fbc, 0x0385527d, 0x00517ff3, 0x00675bd7, 0x003947c0}}, Y: Field{[10]uint32{0x01b32666, 0x00a72ff0, 0x02c8cec7, 0x017cc3ad, 0x017d2e17, 0x026c11f9, 0x023d5fc6, 0x01cbad14, 0x033e8b4d, 0x003566ab}}}, + {X: Field{[10]uint32{0x01e79b28, 0x017e0c73, 0x00720170, 0x03935148, 0x0391c930, 0x0029ed52, 0x025eb6aa, 0x0311a348, 0x0066f64b, 0x0022a1fc}}, Y: Field{[10]uint32{0x02800227, 0x03afa959, 0x0113bb5e, 0x02b18954, 0x03249c34, 0x0343909d, 0x019062f5, 0x01f256c8, 0x0195e005, 0x002a4a97}}}, + {X: Field{[10]uint32{0x01310b06, 0x03661eff, 0x03632cd7, 0x03eee2bb, 0x013a926a, 0x03e236ab, 0x01c771eb, 0x023b969a, 0x0015aa87, 0x00362a04}}, Y: Field{[10]uint32{0x020acbdd, 0x017d4ff8, 0x02ad3d5e, 0x03680667, 0x03ec9f31, 0x03ce50b1, 0x03e3a262, 0x03b53a58, 0x03e8f276, 0x002bddfd}}}, + {X: Field{[10]uint32{0x020cc5c1, 0x01d0f533, 0x034d2c3b, 0x02f5466b, 0x02051c9a, 0x01974a35, 0x025b8a38, 0x01364f6f, 0x02194f3f, 0x002230fe}}, Y: Field{[10]uint32{0x020d8f8d, 0x0192381d, 0x039d9a9d, 0x036a660a, 0x0226b5de, 0x01dd16fb, 0x03671a7e, 0x03e089ec, 0x037a0f9f, 0x0004132b}}}, + {X: Field{[10]uint32{0x01ce648e, 0x00b0f650, 0x02484553, 0x0045b169, 0x02220701, 0x031ca6a2, 0x01e9c763, 0x02c3abc1, 0x03253434, 0x003e1ce1}}, Y: Field{[10]uint32{0x006f7bd7, 0x0327885e, 0x0320146f, 0x0055e059, 0x024c286e, 0x0034f86f, 0x01f66270, 0x01e44eda, 0x02d1d4ee, 0x002a2d7b}}}, + {X: Field{[10]uint32{0x009acc33, 0x021083e4, 0x02f606b1, 0x03e3723f, 0x007b35c8, 0x01a25817, 0x00ca8265, 0x00087e53, 0x01385afb, 0x00017f29}}, Y: Field{[10]uint32{0x01b2b3a8, 0x0246bd75, 0x036392b7, 0x01e35752, 0x03c5b4d0, 0x008facaf, 0x01f9a527, 0x022ff7ac, 0x0251f5c2, 0x000075fe}}}, + {X: Field{[10]uint32{0x035007db, 0x01193eb3, 0x01a51891, 0x013f8558, 0x03f1fddf, 0x03b52f43, 0x02cef9db, 0x02b366ec, 0x0148d4b2, 0x0011d211}}, Y: Field{[10]uint32{0x028f44a8, 0x02a8f20c, 0x02bce3dd, 0x00efb620, 0x01b93e22, 0x03ed113f, 0x03a25397, 0x033f811b, 0x0154f011, 0x003a9878}}}, + {X: Field{[10]uint32{0x02c5b8f1, 0x01ab2179, 0x0234ab46, 0x01b49500, 0x01dd8ef5, 0x0106a008, 0x029a6feb, 0x0350ffb1, 0x03ff0b14, 0x000cc7c5}}, Y: Field{[10]uint32{0x02ec144b, 0x015a6c27, 0x0299b68d, 0x01840b11, 0x0337d8c0, 0x02864c47, 0x0364a0f8, 0x011cc6da, 0x00a18d77, 0x002e882f}}}, + {X: Field{[10]uint32{0x03dc68ce, 0x02c51b76, 0x027f15e9, 0x0073e710, 0x0205b897, 0x0014c395, 0x0388ce98, 0x034b192a, 0x022d200b, 0x0001aae9}}, Y: Field{[10]uint32{0x01f832c8, 0x02ac09ba, 0x00c5b000, 0x035de376, 0x01fcf65f, 0x03c1c7cb, 0x0126ef0c, 0x022466b3, 0x02d7d7d9, 0x0039324d}}}, + {X: Field{[10]uint32{0x03ca19c5, 0x032f1a48, 0x014fcf52, 0x02371cc9, 0x02c0cfee, 0x027b1bb3, 0x01022b4d, 0x02867188, 0x0035e72f, 0x0031dadb}}, Y: Field{[10]uint32{0x0213efc9, 0x02ea0c7e, 0x03fb1ee7, 0x0215ec86, 0x01b49dba, 0x01fe80a2, 0x034d0a1d, 0x0216666d, 0x027a48ee, 0x0016c3fe}}}, + {X: Field{[10]uint32{0x021bb77a, 0x024e1533, 0x014a404a, 0x03b50549, 0x02aaa438, 0x00a70529, 0x01590fa4, 0x00f7e6c0, 0x023d43f3, 0x003015ba}}, Y: Field{[10]uint32{0x033dca7b, 0x01ee31fa, 0x0231cc33, 0x000a2e80, 0x0258355a, 0x01da95c7, 0x0079e7f5, 0x02a7c4b1, 0x00e32337, 0x00356c65}}}, + {X: Field{[10]uint32{0x01ac938a, 0x0222cf6f, 0x003a147e, 0x03124f2b, 0x037df652, 0x01ae3ced, 0x03bb897e, 0x003bc44d, 0x00cc8ddf, 0x000f5a23}}, Y: Field{[10]uint32{0x015879fc, 0x02bc8b53, 0x03b4a691, 0x0269ebce, 0x0338b6bc, 0x0045563d, 0x00daead1, 0x0387ca58, 0x03884d7a, 0x002f2a51}}}, + {X: Field{[10]uint32{0x00d2a179, 0x012ccf42, 0x009cf392, 0x027d7cb9, 0x00c59d7a, 0x03dbf60d, 0x0145f0cd, 0x004602a4, 0x02f669ce, 0x0013ebfe}}, Y: Field{[10]uint32{0x020159d2, 0x03d55841, 0x00485b71, 0x01c9e6f3, 0x03dcbad8, 0x032442ae, 0x000c16d8, 0x00bb0956, 0x00ac2dca, 0x00278057}}}, + {X: Field{[10]uint32{0x024aecad, 0x00c15e68, 0x02f614ac, 0x031d9a67, 0x000e8ba0, 0x037b31f1, 0x01a44eb3, 0x03ade1ad, 0x00e37cd7, 0x00011d5e}}, Y: Field{[10]uint32{0x03171651, 0x03be3259, 0x0056945e, 0x019a7af2, 0x0007fd00, 0x02d8a3b6, 0x00eab83f, 0x03802f1a, 0x0017a6be, 0x002522b2}}}, + {X: Field{[10]uint32{0x00618836, 0x0386a577, 0x01dfe103, 0x029dded6, 0x038c72fd, 0x01d221f6, 0x02d1a35f, 0x0191a892, 0x02753eaa, 0x0026ab78}}, Y: Field{[10]uint32{0x002bca96, 0x000dcf74, 0x0025687e, 0x03b771fd, 0x03ceef2f, 0x0325120f, 0x02e7a050, 0x0097cc79, 0x03848f46, 0x002d9470}}}, + {X: Field{[10]uint32{0x03aed711, 0x004cebd8, 0x02f9a276, 0x027d8a72, 0x03321c9b, 0x011ecaf3, 0x02818524, 0x03b9d556, 0x03e0b1c6, 0x002c6c30}}, Y: Field{[10]uint32{0x000ac827, 0x02eac90c, 0x01571759, 0x019d632f, 0x03c2c741, 0x03fc5c44, 0x001d0dca, 0x01bfcf7f, 0x00fd624e, 0x00124eb3}}}, + {X: Field{[10]uint32{0x032a8ff6, 0x0373cfaf, 0x0201c156, 0x01881eeb, 0x032a0ce4, 0x03ce46a6, 0x02c5762f, 0x028163ab, 0x018fb192, 0x003155dd}}, Y: Field{[10]uint32{0x011bd3b3, 0x011e5a5b, 0x01766399, 0x02129dc6, 0x03989212, 0x006ff6fc, 0x010f671b, 0x0386567c, 0x0353d209, 0x000753a6}}}, + {X: Field{[10]uint32{0x037b5e0e, 0x02b648ca, 0x00d07cc9, 0x0209237d, 0x020edcc0, 0x037d686d, 0x01b5ca60, 0x03b53ed2, 0x01ed5120, 0x001cd48b}}, Y: Field{[10]uint32{0x02e08d74, 0x02233e37, 0x01a96e43, 0x013b25c9, 0x037f87db, 0x016f3f71, 0x01299ced, 0x009c3b47, 0x0194cdf0, 0x0011d5a7}}}, + {X: Field{[10]uint32{0x00323506, 0x02e70bfa, 0x033ad72b, 0x0033c3b1, 0x00fd6fbc, 0x030afb94, 0x03ae46df, 0x02258ca8, 0x000d6632, 0x000595c7}}, Y: Field{[10]uint32{0x03ec68d2, 0x00911212, 0x03143d22, 0x02135d67, 0x00a936d6, 0x01f39854, 0x0157911e, 0x0071833b, 0x01869e00, 0x001977a7}}}, + {X: Field{[10]uint32{0x00e5f090, 0x00be5626, 0x03343dbe, 0x00ba0b72, 0x01b1810d, 0x0327be1b, 0x020cc8d7, 0x00c29721, 0x01642eb6, 0x003d7f95}}, Y: Field{[10]uint32{0x03adfa87, 0x03244fa7, 0x03504e20, 0x02f75fb5, 0x02eec2da, 0x030b025e, 0x0340dcdf, 0x036b2328, 0x021fbea9, 0x00173b9e}}}, + {X: Field{[10]uint32{0x016e3592, 0x0138f28e, 0x00591881, 0x005d635e, 0x037aece0, 0x021f3b6b, 0x01a67a0b, 0x02410d0f, 0x033270d0, 0x003bc276}}, Y: Field{[10]uint32{0x03b675e2, 0x0288e6b1, 0x036ea80c, 0x01c4ab81, 0x037df142, 0x03bf7d38, 0x01c6161c, 0x01ba7e59, 0x0005ba24, 0x00164d3e}}}, + {X: Field{[10]uint32{0x033a54e8, 0x03f948cd, 0x030c13ed, 0x008be5d2, 0x025e1746, 0x03c807b4, 0x012b102b, 0x03c26661, 0x03d727d2, 0x00221b36}}, Y: Field{[10]uint32{0x00a73b2b, 0x029ec277, 0x021426ee, 0x021ce351, 0x015166f6, 0x019393e2, 0x03518255, 0x01b96b94, 0x028a7fca, 0x0036b2cc}}}, + {X: Field{[10]uint32{0x02237cff, 0x03be0ab3, 0x011f96e4, 0x00226ef6, 0x01620713, 0x02367cfa, 0x029ff848, 0x02fcba14, 0x03cd04f7, 0x002df61a}}, Y: Field{[10]uint32{0x03702f0e, 0x03f623ce, 0x0002ee32, 0x0293b434, 0x0303acf2, 0x01d5d210, 0x0146dc41, 0x0151faa1, 0x03f1375a, 0x0031ac2b}}}, + {X: Field{[10]uint32{0x03388c67, 0x03f1eeba, 0x02c4d22b, 0x02659ef1, 0x00c24f5e, 0x0257653b, 0x03910593, 0x02ae14c1, 0x01b28132, 0x0035f45c}}, Y: Field{[10]uint32{0x001a8f8f, 0x01950f77, 0x00744bfe, 0x020a5c22, 0x037be396, 0x02ece6fd, 0x013c1351, 0x038ad957, 0x00e02421, 0x00260ddc}}}, + {X: Field{[10]uint32{0x0394b1be, 0x024202a5, 0x03502a42, 0x025b0524, 0x00f01a18, 0x00cf6b64, 0x01f1cfa8, 0x00c39c8a, 0x02fd881e, 0x003ff9c4}}, Y: Field{[10]uint32{0x00505da8, 0x03063395, 0x01586cda, 0x01e94c59, 0x02f18b03, 0x03cbe8af, 0x0311ae58, 0x00212842, 0x0203075d, 0x003d0a67}}}, + {X: Field{[10]uint32{0x03d13f7c, 0x01919555, 0x03d669f6, 0x03781bc0, 0x03dff3f0, 0x03decd71, 0x03cd10b3, 0x01a54735, 0x02b30322, 0x00158f24}}, Y: Field{[10]uint32{0x03ec10c1, 0x0272cdcc, 0x01f43076, 0x0252153d, 0x009bb210, 0x0105be52, 0x030ccfb2, 0x03bd0602, 0x02f4085b, 0x0037287b}}}, + {X: Field{[10]uint32{0x00f32437, 0x0353591a, 0x013dd9a0, 0x00a19a9f, 0x01dd52c2, 0x03e91f05, 0x00056d7e, 0x03af3985, 0x02f33a2c, 0x002e39db}}, Y: Field{[10]uint32{0x018651c2, 0x01068a24, 0x004a22aa, 0x03084277, 0x003076cc, 0x00986687, 0x02539ba4, 0x039e668e, 0x039d652a, 0x00111539}}}, + {X: Field{[10]uint32{0x02f1c971, 0x01d5182a, 0x002d2c56, 0x03cf8219, 0x0107b4a4, 0x022a6610, 0x02e429fb, 0x000e8b7c, 0x0304f607, 0x000db6c8}}, Y: Field{[10]uint32{0x0284b5cc, 0x010bf269, 0x03ef00f8, 0x02d02323, 0x03ecf7f9, 0x009ac6ae, 0x03859eee, 0x002a8f66, 0x028f5cc3, 0x002814db}}}, + {X: Field{[10]uint32{0x00d9a5ab, 0x01562862, 0x02314f9d, 0x0286df1a, 0x00d537c1, 0x03a6b8a9, 0x0055e529, 0x018df758, 0x011d1521, 0x00317539}}, Y: Field{[10]uint32{0x03eb3f6d, 0x036cce9b, 0x02d0de04, 0x00f12d22, 0x00aaf709, 0x0195c265, 0x0365b08c, 0x01e0b3ef, 0x02ed6a13, 0x0032107b}}}, + {X: Field{[10]uint32{0x01c4bffd, 0x0263e7dc, 0x032207cd, 0x00cd802b, 0x02b05615, 0x018d785e, 0x0379ed3f, 0x0167dbfe, 0x01c29858, 0x0014300f}}, Y: Field{[10]uint32{0x03137720, 0x01929df5, 0x02b0a68b, 0x00a22dfd, 0x025c4255, 0x01471d22, 0x01a2bd74, 0x008a6bd6, 0x0397a7ed, 0x0031a321}}}, + {X: Field{[10]uint32{0x008333ef, 0x014d1b7c, 0x01ff3364, 0x0245c74c, 0x03985606, 0x03d6ec3b, 0x010ae5dc, 0x01be68b8, 0x004b3e7e, 0x000a01b6}}, Y: Field{[10]uint32{0x007b429d, 0x026d40f2, 0x0385e54a, 0x0099090d, 0x02bf8cac, 0x00e9ad63, 0x00b5ddbf, 0x01332d33, 0x004338e3, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x008790a4, 0x02254bce, 0x0353f4c5, 0x006f888a, 0x0282bb9c, 0x026103fb, 0x03e33c62, 0x02374710, 0x01dd1ef5, 0x001035c3}}, Y: Field{[10]uint32{0x030770d5, 0x00a875fd, 0x0130d96b, 0x016ce51a, 0x02e65468, 0x03d35545, 0x00d170ea, 0x0264c8ce, 0x0157b6dd, 0x0026c6a7}}}, + {X: Field{[10]uint32{0x0387c835, 0x01598222, 0x03905d01, 0x00105e60, 0x02ac7338, 0x038876a0, 0x037b193e, 0x00484ef5, 0x003204e7, 0x0022143b}}, Y: Field{[10]uint32{0x01c160e2, 0x00dfddf7, 0x00d3a7d6, 0x02cac32d, 0x02961480, 0x019701c5, 0x01f58eaa, 0x002e464b, 0x03a0a916, 0x002abffd}}}, + {X: Field{[10]uint32{0x00ad6e8b, 0x0033dc54, 0x00bd2c24, 0x02c1a8c2, 0x030de291, 0x02f92175, 0x039d4a62, 0x00a7d1df, 0x0109bd7c, 0x00152545}}, Y: Field{[10]uint32{0x03ef2722, 0x01b1ccb1, 0x02f27f13, 0x027ddf00, 0x01b1d8f7, 0x013307ea, 0x0245c764, 0x00ee7e8e, 0x007cf2a2, 0x000bf6cd}}}, + {X: Field{[10]uint32{0x037e5d44, 0x023da7eb, 0x0221facf, 0x022f990d, 0x031c3d3e, 0x0028f9f3, 0x01af1ab7, 0x03ad3ef9, 0x0355cdf8, 0x0027d7b0}}, Y: Field{[10]uint32{0x01d3c06e, 0x01bcb286, 0x00a58488, 0x017a4afe, 0x0312b8be, 0x0368712e, 0x03da94ba, 0x00d5401b, 0x015fb38b, 0x002c80f7}}}, + {X: Field{[10]uint32{0x02c0b3da, 0x00dc688b, 0x0037bbdf, 0x0388c18a, 0x028b72f0, 0x022cc9bf, 0x035e606c, 0x02794a32, 0x029c1bba, 0x00204b92}}, Y: Field{[10]uint32{0x00e222a1, 0x0347163e, 0x00f24d10, 0x01227be4, 0x015d98d2, 0x03b4004d, 0x02bd36a1, 0x02b8e718, 0x01b714a9, 0x000ae9ed}}}, + {X: Field{[10]uint32{0x023d924a, 0x0072a18a, 0x02c36c5c, 0x03d8a89b, 0x01af52c6, 0x03575ff4, 0x00ff16ec, 0x0185ad50, 0x01dbcf85, 0x003980d7}}, Y: Field{[10]uint32{0x001eec86, 0x03ed77fc, 0x0154ad6c, 0x0011a716, 0x01173d31, 0x007ca7c6, 0x0118718a, 0x03f2b1be, 0x009ef687, 0x002a514e}}}, + {X: Field{[10]uint32{0x02033446, 0x0079d49a, 0x00bc6032, 0x00a69ad4, 0x032643f1, 0x01ac8ce6, 0x01696938, 0x0351c6dc, 0x01e8d771, 0x0035e229}}, Y: Field{[10]uint32{0x017d3990, 0x026259fa, 0x030e0b25, 0x00bde7f8, 0x01c0c9a4, 0x01f646d9, 0x017fe32a, 0x01e0fbe9, 0x02225095, 0x000d2e15}}}, + {X: Field{[10]uint32{0x03c6f41c, 0x0175291d, 0x01802561, 0x00bdc1af, 0x020c8ef4, 0x03e8cad5, 0x01b5f116, 0x013e7c07, 0x03dd2937, 0x00198dcc}}, Y: Field{[10]uint32{0x0078676d, 0x03b09b74, 0x013c1394, 0x0199b895, 0x0185b59f, 0x005002de, 0x014e916a, 0x03f16458, 0x01453ae0, 0x0000d617}}}, + {X: Field{[10]uint32{0x0323ad9c, 0x02c08f6c, 0x006f0a5a, 0x00ccd585, 0x016affda, 0x0278b8f5, 0x03ad4d11, 0x00504cf6, 0x032805ae, 0x0017b1b9}}, Y: Field{[10]uint32{0x00884579, 0x008f5a70, 0x029f645c, 0x03919a37, 0x03d35a56, 0x00683f28, 0x00d609db, 0x00c078a7, 0x01bfcfc6, 0x000f7490}}}, + {X: Field{[10]uint32{0x00f8f3c5, 0x019d28cb, 0x02ceee4a, 0x03975105, 0x0087532b, 0x01165c5f, 0x03366471, 0x019a89f0, 0x00421fbb, 0x003c63f1}}, Y: Field{[10]uint32{0x0359d560, 0x008a7344, 0x00de9b4f, 0x0397dd60, 0x02026847, 0x01a1b03e, 0x03b4e836, 0x00f7c403, 0x00813bb3, 0x0034e282}}}, + {X: Field{[10]uint32{0x01f5345a, 0x0089108e, 0x01719206, 0x03fbba87, 0x017dec0d, 0x004d0919, 0x038d3362, 0x03f87c52, 0x009ed9bc, 0x002063d5}}, Y: Field{[10]uint32{0x006602ee, 0x00b237e1, 0x013688cc, 0x0170ae7d, 0x0048b24c, 0x01fd2cfe, 0x001a8e9d, 0x03d12117, 0x011fcca2, 0x000df398}}}, + {X: Field{[10]uint32{0x02dce942, 0x016c02c7, 0x02a6417a, 0x03ad9086, 0x024f4fa8, 0x00cba1e5, 0x034ee3a5, 0x00ff20a9, 0x0391f98e, 0x001d78b1}}, Y: Field{[10]uint32{0x03e5f6b4, 0x0153354d, 0x00b26f2d, 0x02f888aa, 0x007c4d37, 0x00582157, 0x02a17c71, 0x004d89a2, 0x033ba495, 0x00147c8d}}}, + {X: Field{[10]uint32{0x023954d3, 0x01a0db87, 0x011199ca, 0x01667d2e, 0x009b44de, 0x0264ddcc, 0x03f4ec1f, 0x01b4c76b, 0x01b64c0c, 0x001c47e3}}, Y: Field{[10]uint32{0x00caa4b0, 0x038f9f5c, 0x03eb5b75, 0x02e85c2e, 0x016e4dfb, 0x02cd4673, 0x0170fcf7, 0x0320b7cc, 0x01e3432a, 0x00121655}}}, + {X: Field{[10]uint32{0x033ba6a5, 0x01c6f237, 0x0003a160, 0x003f8878, 0x005216f5, 0x0232a70b, 0x022104ee, 0x0168792f, 0x00266f75, 0x0018d40b}}, Y: Field{[10]uint32{0x01bea942, 0x00a2a852, 0x028dd90f, 0x022bc7ce, 0x033954b8, 0x03f9de5d, 0x01075bda, 0x00fd2bd5, 0x01eac8fc, 0x0029720a}}}, + {X: Field{[10]uint32{0x02850872, 0x00425530, 0x0138c92d, 0x0358e49e, 0x0213f5c3, 0x00bb95f9, 0x01bb82fd, 0x0381c06d, 0x0059ccfe, 0x000a99dd}}, Y: Field{[10]uint32{0x037cbe71, 0x035717bb, 0x02053714, 0x00a3ace7, 0x00401bbf, 0x02c0f831, 0x031cbf5d, 0x02c2ca6e, 0x03985c5d, 0x003fdba5}}}, + {X: Field{[10]uint32{0x02b52cbe, 0x006c020c, 0x00d99f05, 0x03417c8c, 0x015b359b, 0x035febe5, 0x01b4a223, 0x01a69c27, 0x038778fb, 0x001a3e17}}, Y: Field{[10]uint32{0x03c92210, 0x0357cf3f, 0x0389e405, 0x0302cef7, 0x01ef9c65, 0x022d5ae1, 0x037b771f, 0x00c62713, 0x0149f4fc, 0x000370ba}}}, + {X: Field{[10]uint32{0x02b74ade, 0x02413cf4, 0x0390e1c2, 0x0321bd2e, 0x009e9883, 0x039642c9, 0x01fd8b9d, 0x0080d942, 0x01b73b54, 0x001fba75}}, Y: Field{[10]uint32{0x03343e62, 0x030c3b81, 0x03828002, 0x01aa7759, 0x03492063, 0x02497775, 0x01c6977b, 0x03c817e4, 0x0013241c, 0x00260489}}}, + {X: Field{[10]uint32{0x00aa33c8, 0x01d54f89, 0x03391381, 0x0011e7ab, 0x00102b5d, 0x03503948, 0x03680230, 0x0249c76c, 0x0090cdb1, 0x002111ec}}, Y: Field{[10]uint32{0x03c0bdb0, 0x02a3087d, 0x02a78c14, 0x0295e225, 0x03121d02, 0x00096948, 0x02eacd39, 0x01d20700, 0x03e655a2, 0x00096d0f}}}, + {X: Field{[10]uint32{0x0016a645, 0x02a2dbca, 0x03268c89, 0x00b9de8b, 0x03e45e62, 0x00317bce, 0x0151f569, 0x01439ade, 0x03b93f15, 0x000c581c}}, Y: Field{[10]uint32{0x007624be, 0x00b6cc65, 0x02caf6a5, 0x02286191, 0x03a1a6f3, 0x00c7571d, 0x0254a4db, 0x0033a30f, 0x01ac2fc7, 0x00155f29}}}, + {X: Field{[10]uint32{0x0036d6ac, 0x007addd2, 0x004ae5fc, 0x03c7264a, 0x00cdaa8e, 0x030046c6, 0x00fe9495, 0x0086b0d6, 0x012da2ef, 0x003eb88c}}, Y: Field{[10]uint32{0x030b76c7, 0x03ba358f, 0x00b8b54e, 0x0366ca6d, 0x00aa948a, 0x03f32fc2, 0x00ee7cb3, 0x03a196c3, 0x02612d99, 0x001bcefd}}}, + {X: Field{[10]uint32{0x00f839f0, 0x0339e0d5, 0x023e12f8, 0x031addbc, 0x007d4c72, 0x00c58abb, 0x01e1691d, 0x037f7c2c, 0x03ef5588, 0x000a028a}}, Y: Field{[10]uint32{0x03683f72, 0x02d21ce4, 0x01c73ca7, 0x018f3036, 0x01b2b4ba, 0x03910161, 0x03be1bc7, 0x025dd2a1, 0x011bc31a, 0x003c037b}}}, + {X: Field{[10]uint32{0x037ccdcd, 0x03dab02f, 0x01ddb86b, 0x02ca2a99, 0x034d0609, 0x031d5113, 0x037e5d28, 0x024b264a, 0x037a9b7b, 0x000fd0f9}}, Y: Field{[10]uint32{0x0072a2d6, 0x01c2a113, 0x015366cf, 0x0155401d, 0x00ac2678, 0x00ae3617, 0x02bd6b99, 0x002952f1, 0x0103bb3c, 0x002cc45e}}}, + {X: Field{[10]uint32{0x0069f2de, 0x03c58b75, 0x0229646d, 0x0037d941, 0x02953550, 0x00147843, 0x02539290, 0x03e8d21f, 0x01c8387b, 0x000e82bf}}, Y: Field{[10]uint32{0x01bb29c7, 0x0061eb32, 0x0324e8b4, 0x03df23fc, 0x01907d4c, 0x03cb294f, 0x0386dff3, 0x0242db87, 0x00c8f0f6, 0x001d5a5f}}}, + {X: Field{[10]uint32{0x0170809d, 0x03a905de, 0x01660949, 0x02aa288f, 0x002789d0, 0x01c81ca8, 0x026e7c4a, 0x01c8fa66, 0x0364209f, 0x000fe5ca}}, Y: Field{[10]uint32{0x02e47d15, 0x0293e110, 0x02342b32, 0x00fb98fc, 0x039a7c05, 0x0280b17f, 0x0026e769, 0x03f672bf, 0x00287a6b, 0x001e9209}}}, + {X: Field{[10]uint32{0x0089b0b4, 0x036bd2ba, 0x004df0e8, 0x0175c7d0, 0x01c21ff8, 0x02e138f4, 0x01f1ecc4, 0x00d93447, 0x000ffa73, 0x00024e2b}}, Y: Field{[10]uint32{0x01be0312, 0x02e9d291, 0x0204a63f, 0x0255932d, 0x004e9689, 0x03681a84, 0x02e8820e, 0x02ce0437, 0x02d3d526, 0x00287027}}}, + {X: Field{[10]uint32{0x00e28bcc, 0x007b22bd, 0x01071831, 0x016993a6, 0x01631c9b, 0x02f4d15d, 0x01eb9ed3, 0x039d309d, 0x01752993, 0x0014d57b}}, Y: Field{[10]uint32{0x006ad088, 0x01c94f3f, 0x01a40ddf, 0x011c0c24, 0x01c81885, 0x0003c614, 0x010279f6, 0x02aabeb0, 0x007d680a, 0x002eec40}}}, + {X: Field{[10]uint32{0x03f277b7, 0x0224c47e, 0x024574e9, 0x01bead8b, 0x02b03369, 0x010d0191, 0x03bda46a, 0x01db1b60, 0x02ed70ba, 0x0022038c}}, Y: Field{[10]uint32{0x020410bc, 0x0331ea1b, 0x00e7c623, 0x02bccc39, 0x0308dcda, 0x01a59a1a, 0x02763d5f, 0x03578901, 0x02cb8d10, 0x001dbfac}}}, + {X: Field{[10]uint32{0x00f11aa8, 0x03447c42, 0x02beebd6, 0x000f6ab5, 0x00857ac5, 0x012dd3a7, 0x00beec11, 0x016da0ae, 0x00aaa275, 0x0036bdde}}, Y: Field{[10]uint32{0x00a5f428, 0x0260bba6, 0x01c88fd4, 0x03c24a60, 0x02e38325, 0x01bb5a5d, 0x00f3024d, 0x00c05e7c, 0x0062710d, 0x0007b617}}}, + {X: Field{[10]uint32{0x03b474dd, 0x01eaf6a3, 0x004641cf, 0x01690b23, 0x009a60b9, 0x00d4cfe0, 0x01c0a4ff, 0x00f49f46, 0x01dd7563, 0x003970fa}}, Y: Field{[10]uint32{0x01fb0dfc, 0x01ec9063, 0x02afb251, 0x03f858cc, 0x0371b7b7, 0x03c82f27, 0x03036990, 0x0021faac, 0x02f65c5c, 0x003c795a}}}, + {X: Field{[10]uint32{0x00096973, 0x01a0df70, 0x03afdd11, 0x00302335, 0x016859c2, 0x03ec9d32, 0x03f3bf2f, 0x0361c25d, 0x0334ecdf, 0x0017500f}}, Y: Field{[10]uint32{0x00f6aeb1, 0x004a4e76, 0x01e4a5ba, 0x00d110f9, 0x022335c3, 0x005d935c, 0x001ba707, 0x01b3165e, 0x007c7024, 0x001ad6f9}}}, + {X: Field{[10]uint32{0x02246b12, 0x019162d7, 0x01f81389, 0x00d3cf95, 0x03993bf0, 0x02642ac9, 0x01b4caac, 0x007dc6cd, 0x013c2551, 0x00142e81}}, Y: Field{[10]uint32{0x02291f63, 0x03e8aefc, 0x025b88a7, 0x028af32f, 0x009f8a22, 0x0018f6ac, 0x02903993, 0x00c5c19d, 0x02455c7a, 0x0034bc4a}}}, + {X: Field{[10]uint32{0x026629cf, 0x02fc0bc1, 0x03a00b38, 0x0088e670, 0x039f2906, 0x00d961e4, 0x03898f0b, 0x02a7b681, 0x00eaee4a, 0x000e16a0}}, Y: Field{[10]uint32{0x03efcd50, 0x029a5d02, 0x01eb16e6, 0x00091a64, 0x038cfe49, 0x02a42e3e, 0x010806d6, 0x031b975d, 0x020bd72a, 0x002950cc}}}, + {X: Field{[10]uint32{0x03dedbef, 0x03866582, 0x00a9b276, 0x02948d88, 0x02eaa669, 0x03501463, 0x029de6c3, 0x0378e1b9, 0x00b9904e, 0x00026184}}, Y: Field{[10]uint32{0x0206b581, 0x03436522, 0x03315c4a, 0x034d8760, 0x03b88f72, 0x016d7fe3, 0x00d0c892, 0x02840343, 0x01a2eb6a, 0x00241dd5}}}, + {X: Field{[10]uint32{0x011b7fe8, 0x01e66646, 0x0329ed45, 0x016d1d53, 0x0219ae21, 0x032efda8, 0x007b0d3d, 0x0034ef7f, 0x0007d964, 0x0020fc42}}, Y: Field{[10]uint32{0x03293364, 0x029be681, 0x035e2489, 0x012bef0a, 0x02fe719e, 0x002778b1, 0x00e69c65, 0x035b4a18, 0x031b5095, 0x003d8b48}}}, + {X: Field{[10]uint32{0x03b1c246, 0x03285f53, 0x0059e74d, 0x03f19ed8, 0x01e3f287, 0x009d67f4, 0x002b0285, 0x00d718be, 0x02939273, 0x00147488}}, Y: Field{[10]uint32{0x0063745d, 0x008677db, 0x0187be05, 0x0374c4a1, 0x02f7184b, 0x00f22c49, 0x00b909e2, 0x016d3462, 0x03a3b514, 0x002e6e00}}}, + {X: Field{[10]uint32{0x03465006, 0x0277bc53, 0x03c70368, 0x01316827, 0x013e8cc2, 0x009b0df1, 0x02919458, 0x00f50f49, 0x0342e578, 0x002f9a98}}, Y: Field{[10]uint32{0x007ef000, 0x0236e89f, 0x0004c200, 0x012c70d8, 0x0081bc7e, 0x00f773f6, 0x01efc141, 0x0149e76a, 0x00fc3fc1, 0x002071c6}}}, + {X: Field{[10]uint32{0x00790036, 0x023c89af, 0x02e81a4e, 0x03642a0a, 0x00448681, 0x022c9c1c, 0x03b043b5, 0x004a1292, 0x00d9c36f, 0x003c84cd}}, Y: Field{[10]uint32{0x0016eff2, 0x03d1d4e2, 0x0308e428, 0x02e0b3c9, 0x03f5f143, 0x00878a4e, 0x03dcc1eb, 0x03f4c114, 0x00513a87, 0x00000112}}}, + {X: Field{[10]uint32{0x01730508, 0x03abebb2, 0x022cb419, 0x00ca494f, 0x020932a8, 0x01cef49f, 0x00cb1f1b, 0x0118fe04, 0x00e5af34, 0x00055631}}, Y: Field{[10]uint32{0x00c917f8, 0x007f937d, 0x0149e2dd, 0x00dd0a28, 0x006921bb, 0x029d4217, 0x023f3f41, 0x0104c8d9, 0x025025e1, 0x0032e331}}}, + {X: Field{[10]uint32{0x025d71e2, 0x02428699, 0x02e642e0, 0x03b6641c, 0x01b575a4, 0x02238e09, 0x00d3596a, 0x0083606d, 0x032c8f60, 0x000614e8}}, Y: Field{[10]uint32{0x003a8367, 0x03b660a8, 0x005e89e3, 0x0222ca50, 0x03eaf268, 0x006187ff, 0x024aedbb, 0x02ba838d, 0x031cb170, 0x002368a8}}}, + {X: Field{[10]uint32{0x00cd323d, 0x00d4e233, 0x0190b8cc, 0x02d0ef75, 0x002da679, 0x03ebea77, 0x01f60dbc, 0x00efb087, 0x00bcf0f0, 0x003bd617}}, Y: Field{[10]uint32{0x00c2f296, 0x03db601e, 0x03acdd93, 0x02e876a9, 0x01f02ccd, 0x00a04e41, 0x0192e078, 0x007db4e1, 0x0203aff9, 0x000af178}}}, + {X: Field{[10]uint32{0x02fd5c14, 0x01da022c, 0x03471a14, 0x01938344, 0x031fa458, 0x0092cf1e, 0x03d99714, 0x01a3aefb, 0x0237e1ea, 0x000fd30b}}, Y: Field{[10]uint32{0x020eeaa5, 0x038da91f, 0x005e330d, 0x005ed50e, 0x01051b9c, 0x03cca6d4, 0x02665b04, 0x00ecfeaa, 0x00ab3d28, 0x0019e264}}}, + {X: Field{[10]uint32{0x0021693a, 0x02d04679, 0x0133b621, 0x004082d5, 0x0059fc9b, 0x00eafcab, 0x01cb20ab, 0x02b12860, 0x038ad557, 0x000ac006}}, Y: Field{[10]uint32{0x02c6b94a, 0x00a5c8e0, 0x006758fa, 0x0234b283, 0x01310a32, 0x0122c949, 0x026f8c30, 0x0276c5cf, 0x0007f8d1, 0x003f93cc}}}, + {X: Field{[10]uint32{0x012cd229, 0x016f24d1, 0x00bb98d0, 0x009d62e8, 0x0379c90d, 0x007ec328, 0x02b5b108, 0x0023fe37, 0x01dd7d5a, 0x00196274}}, Y: Field{[10]uint32{0x028149a9, 0x01e45966, 0x007faa11, 0x016c64af, 0x01fdc547, 0x038003f5, 0x008dca23, 0x00a64d2f, 0x0080ed84, 0x00209025}}}, + {X: Field{[10]uint32{0x03950a6f, 0x027c3d49, 0x028a83b8, 0x03968e8e, 0x00ab4377, 0x01da9aa4, 0x00553162, 0x020d6e3a, 0x010df5d3, 0x00308cff}}, Y: Field{[10]uint32{0x00f6f3e5, 0x0088e4ad, 0x0384f494, 0x00c61ae2, 0x02314680, 0x016bbf81, 0x00fbac08, 0x02690c4b, 0x00a8775a, 0x0023fa38}}}, + {X: Field{[10]uint32{0x024cc14a, 0x02c4f41d, 0x036e7b65, 0x003e27db, 0x02a38867, 0x01d68afe, 0x02e3f57f, 0x023bbb5b, 0x02852a84, 0x00209cc6}}, Y: Field{[10]uint32{0x01117583, 0x0039334e, 0x004c1208, 0x026e29d4, 0x011ffacc, 0x0238d288, 0x03096883, 0x017a1fc6, 0x009a307c, 0x00300314}}}, + {X: Field{[10]uint32{0x02d2a50d, 0x03a9b401, 0x0097707e, 0x02d54fab, 0x00c9dde3, 0x008a50bb, 0x02b51501, 0x02c6c16a, 0x03a0e5d8, 0x003884e1}}, Y: Field{[10]uint32{0x01b0ff83, 0x02043723, 0x00349bb2, 0x02564cd5, 0x000fc81c, 0x012b177f, 0x003c9207, 0x024f7c0d, 0x0109f90d, 0x0031d379}}}, + {X: Field{[10]uint32{0x039fdc25, 0x03269256, 0x0236a00b, 0x0305b410, 0x0292780f, 0x0358d6e3, 0x035c3414, 0x010f6716, 0x01fd2fa4, 0x0006021c}}, Y: Field{[10]uint32{0x0314d120, 0x021400ea, 0x00146599, 0x00db89de, 0x021f25e6, 0x02f80971, 0x02014a8b, 0x03cde908, 0x01506008, 0x00359b1c}}}, + {X: Field{[10]uint32{0x00cb2c42, 0x034c382f, 0x03ab4b44, 0x024d360f, 0x00d64dff, 0x00455ae4, 0x0329a9a3, 0x00aa307b, 0x027eed11, 0x002d6a77}}, Y: Field{[10]uint32{0x0139db38, 0x029c7d0d, 0x03d91130, 0x033ec3fc, 0x0130315c, 0x03be15c8, 0x00afe660, 0x00febcec, 0x0279a81c, 0x00159d69}}}, + {X: Field{[10]uint32{0x00aee7d6, 0x00047f40, 0x03b4d40d, 0x01ec01b4, 0x018ce569, 0x0016973e, 0x02baf78c, 0x039437d0, 0x007261f1, 0x0026b339}}, Y: Field{[10]uint32{0x0107a05c, 0x0223fae5, 0x01e0a95f, 0x00c6b74a, 0x026cb8c8, 0x00c969e7, 0x03568304, 0x0131a795, 0x013c4046, 0x003edf10}}}, + {X: Field{[10]uint32{0x03574e5c, 0x03303ae2, 0x01100a02, 0x038d9f61, 0x01916796, 0x0064f7bb, 0x007bc4b2, 0x01dc48bf, 0x039b7bef, 0x003e02ad}}, Y: Field{[10]uint32{0x015c8f6d, 0x00067747, 0x022aac77, 0x02142d74, 0x003a1ac5, 0x01b372b3, 0x035834ed, 0x022c9766, 0x003f842d, 0x0031b534}}}, + {X: Field{[10]uint32{0x009366a1, 0x0287e62f, 0x01aeefae, 0x0123b058, 0x0125d814, 0x0182c936, 0x005845ef, 0x008c30c0, 0x0355cdb4, 0x002d0c78}}, Y: Field{[10]uint32{0x0241c1cd, 0x0345db76, 0x0390ef69, 0x0395731c, 0x017aebac, 0x014adb9a, 0x02ddb985, 0x002850e0, 0x01d4ae23, 0x003af36b}}}, + {X: Field{[10]uint32{0x0275f1fb, 0x01aa001b, 0x009c593f, 0x037db082, 0x02efe56e, 0x01b72939, 0x02b686f4, 0x00e98d47, 0x039e08c9, 0x001ea982}}, Y: Field{[10]uint32{0x03a0347e, 0x03c03bd7, 0x00c98328, 0x0002d01a, 0x00cb4248, 0x038cf9a5, 0x013e3892, 0x002fc781, 0x01e21770, 0x00001320}}}, + {X: Field{[10]uint32{0x0286b30b, 0x039d8404, 0x0296ba72, 0x03bc9cbd, 0x01d304fb, 0x028ded37, 0x001d1a4d, 0x0090edd1, 0x010b3aa4, 0x0006a209}}, Y: Field{[10]uint32{0x01b7a473, 0x017d2ada, 0x033fe3fd, 0x0163d166, 0x02b33b76, 0x0015aa6f, 0x02d8cb0f, 0x02056f81, 0x010557d3, 0x001896e7}}}, + {X: Field{[10]uint32{0x022b57c7, 0x03b6f0ea, 0x0196682d, 0x011c7aea, 0x0106c4ca, 0x02d773b8, 0x034db23c, 0x015628b4, 0x02eb49fd, 0x0016d493}}, Y: Field{[10]uint32{0x038ae50c, 0x014a41ae, 0x02d5dbf2, 0x009caf28, 0x0025c8b2, 0x01b80af7, 0x01b163d5, 0x033875cd, 0x009756b7, 0x000b570b}}}, + {X: Field{[10]uint32{0x0276d2c5, 0x0016139d, 0x007d1892, 0x03610cef, 0x00191550, 0x03dd5826, 0x00cb8b10, 0x02f9e749, 0x03776d9f, 0x002b9839}}, Y: Field{[10]uint32{0x018d7784, 0x0249bec5, 0x0311ffff, 0x0350d1a8, 0x00b76c36, 0x03bf219e, 0x011be83e, 0x0091cb28, 0x01867377, 0x0010c3fa}}}, + {X: Field{[10]uint32{0x02efb9d4, 0x03e04a98, 0x03105ab4, 0x00c2710b, 0x0353e8d7, 0x017739be, 0x020b081a, 0x03d9a351, 0x023d9e29, 0x000c8e97}}, Y: Field{[10]uint32{0x004776ba, 0x0295afa0, 0x01830c2f, 0x02911d98, 0x03da6216, 0x02d7aa6b, 0x0256d1d3, 0x00fd0859, 0x03b36948, 0x0000ad15}}}, + {X: Field{[10]uint32{0x027c1c9d, 0x00d9445e, 0x022a2a8b, 0x0125e965, 0x02b3db86, 0x01a50a6c, 0x00e612ed, 0x0154b219, 0x01b6591e, 0x002b346d}}, Y: Field{[10]uint32{0x026e88b8, 0x01886423, 0x00fa3265, 0x00947af1, 0x0067544d, 0x009498d2, 0x02ba7729, 0x01a40249, 0x03ff056f, 0x003984c7}}}, + {X: Field{[10]uint32{0x005b36f4, 0x02fdd3de, 0x02cf114e, 0x018211d0, 0x02f2e61e, 0x01549233, 0x026286b1, 0x014b80a8, 0x00708178, 0x001ad38b}}, Y: Field{[10]uint32{0x01b893df, 0x03a19139, 0x01a1a1e4, 0x03f359b9, 0x037398f7, 0x007354a5, 0x007130d0, 0x026f7080, 0x011c7a52, 0x00210025}}}, + {X: Field{[10]uint32{0x0084ab31, 0x01e5a7e0, 0x017c7151, 0x017e02a0, 0x004e6a37, 0x0230d1d1, 0x004cb914, 0x0029187d, 0x0327d67b, 0x0030acb1}}, Y: Field{[10]uint32{0x036d5f59, 0x0207ebb0, 0x01718824, 0x03522414, 0x03a52c47, 0x030a07f4, 0x00aa2519, 0x01ec3e66, 0x0359ebf3, 0x003fb590}}}, + {X: Field{[10]uint32{0x004f202e, 0x01f286e4, 0x02f71220, 0x008af683, 0x022ec564, 0x01e283e1, 0x014609d9, 0x02f653de, 0x02dab5b2, 0x000ce17b}}, Y: Field{[10]uint32{0x003d7443, 0x01eedc58, 0x0074b490, 0x0219d1a9, 0x01b12a21, 0x006a7d10, 0x01975aa3, 0x02a3b871, 0x02af1db8, 0x000a0234}}}, + {X: Field{[10]uint32{0x00c803f2, 0x006701c5, 0x02a82335, 0x03c35314, 0x02edce15, 0x03ead1e1, 0x030c2923, 0x010dee11, 0x00d7f2cb, 0x002003db}}, Y: Field{[10]uint32{0x00a37056, 0x0054bd35, 0x03734ad0, 0x0233b0e5, 0x0023e0a8, 0x02c980a3, 0x0206ca59, 0x006a8337, 0x023e0ad1, 0x002607cb}}}, + {X: Field{[10]uint32{0x02aa2f3b, 0x0071803b, 0x01f32474, 0x02dd853c, 0x02ebfaf4, 0x01eedb2a, 0x00103c6d, 0x00a1bf4f, 0x03ff3a9f, 0x001cea82}}, Y: Field{[10]uint32{0x00c6f7b1, 0x03c76946, 0x02846701, 0x00f13f79, 0x00a54a2e, 0x0362f39f, 0x009fe73d, 0x02e60f2e, 0x012981a9, 0x0000c2f1}}}, + {X: Field{[10]uint32{0x0178f2c5, 0x005a7ee8, 0x029ca789, 0x02626f3c, 0x03863804, 0x00f9d84b, 0x03fdfa9c, 0x004fda02, 0x00e6ab5c, 0x0024a03f}}, Y: Field{[10]uint32{0x00ae36bb, 0x013df373, 0x03b233e7, 0x02f76c28, 0x03aeb6a7, 0x03dfd6ed, 0x01397b18, 0x00b8ecbf, 0x00dbc5bc, 0x0012e5bb}}}, + {X: Field{[10]uint32{0x026e03ca, 0x02fda769, 0x00b8107d, 0x020397b3, 0x029f4387, 0x01c344ba, 0x009be162, 0x02e7bed6, 0x004bbb50, 0x001c8157}}, Y: Field{[10]uint32{0x036bc7cb, 0x0169b183, 0x023f9891, 0x0016a87f, 0x01985ad7, 0x006a188f, 0x01746935, 0x01df7561, 0x017fc30a, 0x002baa89}}}, + {X: Field{[10]uint32{0x03c1879f, 0x017411f9, 0x008e0308, 0x021c4aaf, 0x000eb8e8, 0x03ea09f3, 0x02687c73, 0x038f6c2e, 0x03d0c771, 0x003c3cf3}}, Y: Field{[10]uint32{0x00936b33, 0x026054e9, 0x02e20eff, 0x01733db8, 0x031bf8aa, 0x013f8428, 0x030c4b32, 0x013153e3, 0x027d8b74, 0x000b184b}}}, + {X: Field{[10]uint32{0x02f5dcfa, 0x01ebe6f9, 0x033ec67a, 0x01df979e, 0x00d8b611, 0x0290ddab, 0x02c8fe8e, 0x03c9c1be, 0x036570b0, 0x0025f1e2}}, Y: Field{[10]uint32{0x03e14c3d, 0x027563ce, 0x00daa127, 0x026cd1f1, 0x01133460, 0x00f2d650, 0x03da765c, 0x016162a5, 0x010cfea9, 0x0006bae5}}}, + {X: Field{[10]uint32{0x02509e69, 0x0327bfa7, 0x03eeb9b5, 0x03d4ce9c, 0x024b7908, 0x022c1dfe, 0x013a9de4, 0x01bf0f52, 0x021e967e, 0x002ce7fe}}, Y: Field{[10]uint32{0x0265dc05, 0x01039d7a, 0x01e16f3b, 0x00bc4486, 0x03f76c30, 0x007205f8, 0x0218c007, 0x01cb3035, 0x015181ac, 0x003d57ce}}}, + {X: Field{[10]uint32{0x00e7baaa, 0x007198fe, 0x03fd1735, 0x01ca2c79, 0x0201b2a9, 0x0246c582, 0x003fcc4d, 0x01f1346f, 0x037a5ff2, 0x000566e7}}, Y: Field{[10]uint32{0x00c4360a, 0x0202df29, 0x02697a83, 0x01f55e30, 0x015e6012, 0x01e27f50, 0x021c7f0d, 0x013febae, 0x036d86c5, 0x002c2abb}}}, + {X: Field{[10]uint32{0x0385e44c, 0x027dfcf2, 0x021aaf72, 0x02acf04d, 0x016dff76, 0x0189bf11, 0x0107a62b, 0x012c5b1f, 0x03d18d4a, 0x00096043}}, Y: Field{[10]uint32{0x036a2d9b, 0x0348864b, 0x00f442fc, 0x017ccd5e, 0x009252dd, 0x02d2e2c0, 0x0295526a, 0x02f5c2b4, 0x03257794, 0x003d0148}}}, + {X: Field{[10]uint32{0x033352b2, 0x024d37d1, 0x0241d6e1, 0x02440b69, 0x01eab362, 0x0241d620, 0x019864c0, 0x028ca312, 0x024d5860, 0x0009f882}}, Y: Field{[10]uint32{0x03b45203, 0x02e52640, 0x02a7b65c, 0x00ac03a1, 0x03d3822a, 0x000f0469, 0x030b4905, 0x02d43f89, 0x00f2888c, 0x00305663}}}, + {X: Field{[10]uint32{0x001448a2, 0x03cef44d, 0x032dd685, 0x01a13651, 0x006d684a, 0x02885ed8, 0x008f465b, 0x0253999c, 0x014e517a, 0x00120fd1}}, Y: Field{[10]uint32{0x039ad11f, 0x01a2985f, 0x02aa82ba, 0x01bfc308, 0x01d338d0, 0x01772dc3, 0x0123346c, 0x0268d917, 0x0144d93b, 0x00304ecc}}}, + {X: Field{[10]uint32{0x0204e6e5, 0x002967af, 0x03266e2e, 0x023e0e93, 0x0267ef06, 0x03054cbc, 0x024c9a30, 0x012a996b, 0x02f63173, 0x0013d1ec}}, Y: Field{[10]uint32{0x00d99d2b, 0x00d35996, 0x03a27c01, 0x00bb7551, 0x01682439, 0x03b6adcb, 0x033ebcf3, 0x0272d174, 0x034cf11b, 0x00163c7c}}}, + {X: Field{[10]uint32{0x0397db07, 0x02d8d05d, 0x0057424f, 0x00ac4711, 0x00d6f42a, 0x03a04330, 0x031774b8, 0x033a12d3, 0x037e0835, 0x002a9e3a}}, Y: Field{[10]uint32{0x005e743b, 0x0124fa86, 0x0311b0cf, 0x018c85c4, 0x03ee9ffc, 0x00fdcb8c, 0x00c7541d, 0x0351f167, 0x0139d957, 0x000e5900}}}, + {X: Field{[10]uint32{0x00033d49, 0x02c33a33, 0x0194417e, 0x03daa97d, 0x0031a3f1, 0x00dd602c, 0x01c0655c, 0x00158047, 0x018583c0, 0x00349662}}, Y: Field{[10]uint32{0x02f24b08, 0x00744696, 0x02d8bc84, 0x00193413, 0x02b6a830, 0x036af85c, 0x014622a2, 0x02062e8a, 0x01739de8, 0x000d9072}}}, + {X: Field{[10]uint32{0x01e26634, 0x004a9215, 0x03faf487, 0x017567df, 0x03f2d2b8, 0x010d641e, 0x0338f877, 0x02dd3d5b, 0x03a0eccc, 0x0013c08e}}, Y: Field{[10]uint32{0x01a6a456, 0x020a57ec, 0x02e95bc4, 0x012e1a9b, 0x03a2ae09, 0x024edb0f, 0x03c35ea3, 0x014496e3, 0x0033b15d, 0x003e03bf}}}, + {X: Field{[10]uint32{0x023a1589, 0x03df8b5d, 0x003c670b, 0x00a3df05, 0x028eda41, 0x0056b22f, 0x03e13cfa, 0x03425def, 0x008b48ab, 0x002721bc}}, Y: Field{[10]uint32{0x01c2df45, 0x014bc570, 0x00a171a1, 0x036b211a, 0x0217d4ee, 0x00a7536c, 0x02ff453d, 0x032e20e7, 0x03870e9e, 0x00045447}}}, + {X: Field{[10]uint32{0x02137576, 0x00362e3b, 0x0120e913, 0x01dda760, 0x01c5e6ac, 0x0355f89a, 0x03affcec, 0x017323ff, 0x018b72e9, 0x000e021c}}, Y: Field{[10]uint32{0x01ea728f, 0x0227f4cc, 0x00ceedb7, 0x0068278f, 0x00c614a6, 0x03b62d63, 0x02e59cf8, 0x02dc8936, 0x01ebcf5e, 0x003d03af}}}, + {X: Field{[10]uint32{0x00dda3df, 0x03e9d4bf, 0x03b4255d, 0x011d71f7, 0x00eb349f, 0x03b68091, 0x01c80a13, 0x024bf01c, 0x015e3994, 0x00237bf4}}, Y: Field{[10]uint32{0x03f7a771, 0x01317d9e, 0x00c7ff9e, 0x033b8ec3, 0x01a01786, 0x03f0e58c, 0x03b0d19f, 0x03430ed3, 0x03784353, 0x0034f7e9}}}, + {X: Field{[10]uint32{0x0024bf8a, 0x02a2a9f7, 0x03d466ea, 0x03430c92, 0x03ed99f9, 0x0263eb79, 0x00052487, 0x0341f8ea, 0x01425ac1, 0x00236b23}}, Y: Field{[10]uint32{0x02ef8009, 0x0042dcaa, 0x00087d64, 0x0098834a, 0x0262e9d9, 0x00d5375b, 0x032f097d, 0x00d3f362, 0x01b79232, 0x003c8cbf}}}, + {X: Field{[10]uint32{0x03a90e1b, 0x032b011f, 0x01d35329, 0x03f1be04, 0x01e45d26, 0x0090f0f4, 0x03178b4f, 0x039b78a1, 0x0043f3bc, 0x0021f399}}, Y: Field{[10]uint32{0x01724138, 0x00cfa54e, 0x02875fac, 0x03523dc3, 0x000f0af0, 0x01fb7cec, 0x002799d7, 0x012ad316, 0x00196241, 0x0002a25c}}}, + {X: Field{[10]uint32{0x00fdf08d, 0x0259b1aa, 0x02f3bd22, 0x03201d06, 0x02124a21, 0x02dddd6e, 0x0360a3f8, 0x02ddfa7a, 0x03fabf2f, 0x002ffb9a}}, Y: Field{[10]uint32{0x03ba76f7, 0x0339757e, 0x03fa69c9, 0x03a102e0, 0x02cd2e8b, 0x00bf20fb, 0x026f2155, 0x012fc5fc, 0x0399541e, 0x000a6870}}}, + {X: Field{[10]uint32{0x00c2bec1, 0x026bcad7, 0x0341daef, 0x02be0e06, 0x00044873, 0x02bfdcae, 0x001a5537, 0x02a0008d, 0x01a5b553, 0x00030c3f}}, Y: Field{[10]uint32{0x039fea6d, 0x01054ed0, 0x0162e7d1, 0x01b99775, 0x028a96f7, 0x0338d011, 0x004aafc0, 0x023593e9, 0x02b587d8, 0x001738fa}}}, + {X: Field{[10]uint32{0x0000ed97, 0x0375360d, 0x030a00f1, 0x001dca35, 0x014d9226, 0x006d067d, 0x01cadbfe, 0x00675c31, 0x01fd5941, 0x00179c54}}, Y: Field{[10]uint32{0x02108917, 0x03654c7a, 0x0020d73b, 0x0259895e, 0x024c64ec, 0x032f75d7, 0x0136816e, 0x0129f58b, 0x02a5a51d, 0x001aa33b}}}, + {X: Field{[10]uint32{0x0086100b, 0x01a436fb, 0x007c04bf, 0x01ead435, 0x03e974af, 0x01494896, 0x03d06208, 0x0357c3cc, 0x030a66cd, 0x002a723a}}, Y: Field{[10]uint32{0x038e0a2f, 0x02786ca2, 0x02bf329c, 0x0223cebb, 0x00a4371e, 0x03ca4335, 0x02a24bcf, 0x00c7cec0, 0x039d8987, 0x003c8272}}}, + {X: Field{[10]uint32{0x03a2e439, 0x021446b8, 0x0253b946, 0x01cd7ebd, 0x01cb8043, 0x00bb9848, 0x01b16595, 0x0245411c, 0x01d79366, 0x0025579e}}, Y: Field{[10]uint32{0x03930d06, 0x001c02f3, 0x028261de, 0x037c4839, 0x002e82cd, 0x0295b1e8, 0x02a3bcc1, 0x019e8043, 0x03e32a9b, 0x001a36ab}}}, + {X: Field{[10]uint32{0x03a34a71, 0x00ad0277, 0x005fac19, 0x0014f21a, 0x02bef248, 0x02edf875, 0x03bc70b3, 0x0331a96c, 0x0293d3c1, 0x0008b49c}}, Y: Field{[10]uint32{0x039b3357, 0x020dfa58, 0x02389e6c, 0x037ece77, 0x014d5d76, 0x01036ed6, 0x004e42e7, 0x0156dd4f, 0x00e34fc8, 0x0031d2d1}}}, + {X: Field{[10]uint32{0x0137abc0, 0x013a3108, 0x03835b2f, 0x022ce80d, 0x0370d46e, 0x0121ebaf, 0x01d91f71, 0x005d9d3a, 0x02cef74b, 0x003467f3}}, Y: Field{[10]uint32{0x02db7580, 0x02b6db12, 0x00a83fe9, 0x0397cd97, 0x0334ca9f, 0x025332e8, 0x02224f74, 0x002604f3, 0x03f63dca, 0x0016e412}}}, + {X: Field{[10]uint32{0x02336899, 0x00df2470, 0x0073f2a4, 0x01b1492a, 0x001723c3, 0x02f1a9aa, 0x02091136, 0x01200359, 0x022aadc7, 0x001aa85c}}, Y: Field{[10]uint32{0x02319d07, 0x03c7b8b5, 0x03c369a4, 0x0367b599, 0x023d9709, 0x00855273, 0x01640583, 0x016d318c, 0x004cdf49, 0x0023a5c0}}}, + {X: Field{[10]uint32{0x00ea6efc, 0x01be146c, 0x01052f73, 0x01ac1c83, 0x02b16e3b, 0x025ab461, 0x0107262e, 0x0348804b, 0x02239ee4, 0x001e6f4d}}, Y: Field{[10]uint32{0x0018729e, 0x03d36fbd, 0x000fe42d, 0x01beb5ae, 0x036a3116, 0x031f24b0, 0x00972c71, 0x03369077, 0x03dbf568, 0x000292d0}}}, + {X: Field{[10]uint32{0x00f16ce9, 0x00460be9, 0x028c9e40, 0x00800500, 0x03a1c7d8, 0x01a43033, 0x0183c5d3, 0x00ded59d, 0x032c1463, 0x002d780a}}, Y: Field{[10]uint32{0x0069e0b2, 0x0389e564, 0x026fb938, 0x0299c634, 0x021a819b, 0x003a2850, 0x013516fa, 0x02a9c39e, 0x02be3fac, 0x0012e591}}}, + {X: Field{[10]uint32{0x03a7403a, 0x02bdd0c1, 0x0057dd05, 0x02152ce2, 0x0114a2b6, 0x021fde43, 0x0044d643, 0x03ad3419, 0x0271de2d, 0x00238cf8}}, Y: Field{[10]uint32{0x01ecc429, 0x00f5b8a2, 0x0171fc91, 0x03fc3fa7, 0x00e08d73, 0x00f833ac, 0x02011bd0, 0x028773aa, 0x03a2c7a4, 0x00360b54}}}, + {X: Field{[10]uint32{0x0019c2f5, 0x0164f293, 0x0036b074, 0x03d8bd7b, 0x020abd6e, 0x03b68df6, 0x0369b73f, 0x029e0395, 0x004277db, 0x0013ffbd}}, Y: Field{[10]uint32{0x0392f854, 0x021a04f4, 0x01d694a1, 0x02f59efe, 0x03796755, 0x02ec27e6, 0x036162cf, 0x0282ae7b, 0x0057378a, 0x002a28c2}}}, + {X: Field{[10]uint32{0x01f57368, 0x00dc49ba, 0x02bdefb7, 0x035bb2e9, 0x03f7e42e, 0x006e491b, 0x00b03341, 0x001722d6, 0x012a6338, 0x0021e2d9}}, Y: Field{[10]uint32{0x02e85836, 0x007bf055, 0x0020ad54, 0x004749d2, 0x02148c97, 0x01290750, 0x02e71f0b, 0x0056334e, 0x033ed691, 0x000b3efa}}}, + {X: Field{[10]uint32{0x01eb415e, 0x002c41a7, 0x02783dd4, 0x00bc6c20, 0x01a0aa0b, 0x01e6b2f0, 0x0399ee6a, 0x02bb451a, 0x0215aee2, 0x003be69a}}, Y: Field{[10]uint32{0x01e97240, 0x02f42392, 0x00d826d9, 0x03686715, 0x02cffd9c, 0x02d271ea, 0x03c44802, 0x00d45286, 0x02ba7fd5, 0x00264278}}}, + {X: Field{[10]uint32{0x0245bf37, 0x02b081c1, 0x008fcdcf, 0x00630b55, 0x02c7814e, 0x036c33a3, 0x00358855, 0x0348c182, 0x00d41551, 0x00357092}}, Y: Field{[10]uint32{0x01a36f05, 0x02013045, 0x029cb3c3, 0x017e0b6a, 0x003cbeb4, 0x0053542a, 0x0378c88c, 0x007e0a32, 0x009e7bf0, 0x003e717a}}}, + {X: Field{[10]uint32{0x03227d1a, 0x016467d5, 0x00289f2c, 0x003c25bb, 0x026dad0c, 0x005155a0, 0x036e6148, 0x0055f659, 0x01cca526, 0x003b6fc9}}, Y: Field{[10]uint32{0x0299554d, 0x036b80bb, 0x034c7409, 0x007bdb95, 0x03d0ca70, 0x0034dc95, 0x0033c137, 0x0191592a, 0x0088be05, 0x0001a115}}}, + {X: Field{[10]uint32{0x00cf09bb, 0x039ba953, 0x0378b26f, 0x02c37f3c, 0x0314be80, 0x033e4a1a, 0x021f5cf0, 0x038dd894, 0x026fb8e2, 0x00170480}}, Y: Field{[10]uint32{0x02daa596, 0x0299d619, 0x010471bf, 0x014102ea, 0x0094b81a, 0x02072691, 0x010154d5, 0x0194a1e5, 0x01ef4e2c, 0x000f6635}}}, + {X: Field{[10]uint32{0x008e2d6d, 0x0134acb9, 0x030a0b43, 0x0352bce5, 0x03ae728b, 0x019cce31, 0x00dcef7f, 0x00157585, 0x02435056, 0x00309f98}}, Y: Field{[10]uint32{0x018525c9, 0x004dea9f, 0x033ced82, 0x025e158c, 0x029e372d, 0x0334a315, 0x00839eeb, 0x03e51bde, 0x02fc703c, 0x001dad61}}}, + {X: Field{[10]uint32{0x01abaf8a, 0x036bb794, 0x027e7b96, 0x00feac52, 0x007f6760, 0x0263b981, 0x0024e8af, 0x0061ad35, 0x03045140, 0x0028a631}}, Y: Field{[10]uint32{0x00108fda, 0x0358e35a, 0x031085d7, 0x027ae9cb, 0x00463b77, 0x01283087, 0x01b430db, 0x0064d529, 0x01582a1b, 0x001371c0}}}, + {X: Field{[10]uint32{0x012013c4, 0x00bccf86, 0x02f073a6, 0x005223ae, 0x02fdf400, 0x0125a8cc, 0x0204fb19, 0x03a2c2b0, 0x015782da, 0x00387f3a}}, Y: Field{[10]uint32{0x01d02f4c, 0x0138d9c7, 0x008a4a26, 0x00e513cc, 0x01e8ca64, 0x01de8435, 0x022b50aa, 0x01bfe5aa, 0x02e5d578, 0x0010145f}}}, + {X: Field{[10]uint32{0x03097d6d, 0x00e6ff02, 0x033a21e1, 0x010bd9cf, 0x001a2b0c, 0x008d8551, 0x00e49bb6, 0x02e00239, 0x03fc5f06, 0x00039c66}}, Y: Field{[10]uint32{0x02fd7822, 0x0118b0ab, 0x025e1a0a, 0x00cd3e45, 0x01d14e2c, 0x00631251, 0x023929ee, 0x037da287, 0x001d83f5, 0x003c320f}}}, + {X: Field{[10]uint32{0x00ad0a4e, 0x0130e2d4, 0x0235a17f, 0x01436723, 0x020dc27c, 0x039a5f6e, 0x00b11277, 0x03358a10, 0x024ba9d8, 0x001ddd9a}}, Y: Field{[10]uint32{0x031b6431, 0x02da7388, 0x00554b26, 0x01b9bdb9, 0x0060b758, 0x01b0642f, 0x02265ac8, 0x009ee808, 0x02d94483, 0x0016ce8a}}}, + {X: Field{[10]uint32{0x008514b4, 0x03ca390d, 0x00292597, 0x035d8983, 0x004f2c9d, 0x00418da4, 0x0260cda4, 0x02a157e1, 0x021f6215, 0x003c8ddc}}, Y: Field{[10]uint32{0x02cfef79, 0x02e4ce06, 0x03651bcc, 0x03a755ec, 0x0046f5ad, 0x00f2e61d, 0x02e8c6d3, 0x027e73b2, 0x021c187b, 0x0004276a}}}, + {X: Field{[10]uint32{0x027b3e08, 0x014fc269, 0x033b9f19, 0x00edb16b, 0x0397517b, 0x01436f20, 0x004e7a8a, 0x006868f3, 0x01d5e889, 0x0025023d}}, Y: Field{[10]uint32{0x01691555, 0x01e7b256, 0x02b90ed8, 0x0150cb67, 0x03ca33e9, 0x0173b4af, 0x01f87b90, 0x006ba725, 0x0212c32f, 0x0006e0bc}}}, + {X: Field{[10]uint32{0x012a7064, 0x027db055, 0x020f4c4f, 0x03223c59, 0x03883649, 0x03a419d7, 0x03214f13, 0x01e49b27, 0x02551170, 0x002ca0dd}}, Y: Field{[10]uint32{0x011abfcf, 0x02c2f5db, 0x00131829, 0x01054671, 0x03be6ee0, 0x02f5545b, 0x0303ca45, 0x02258b9b, 0x033915be, 0x0022554d}}}, + {X: Field{[10]uint32{0x0378f4a9, 0x019eff92, 0x039c1437, 0x00c4fe4b, 0x03986413, 0x01b034a7, 0x012a9dcb, 0x03d5293b, 0x020036b5, 0x003390ae}}, Y: Field{[10]uint32{0x03a048d4, 0x02f4dff8, 0x028024a7, 0x0360914a, 0x0339b757, 0x03dc1afe, 0x00c91792, 0x02ebd1da, 0x0292cf35, 0x001b951c}}}, + {X: Field{[10]uint32{0x00cbcc59, 0x03b738bb, 0x0007d8e9, 0x02f10bc2, 0x00d3942b, 0x0352bd08, 0x009325e8, 0x00ea5efb, 0x02a01a06, 0x002ecf68}}, Y: Field{[10]uint32{0x02d70b32, 0x016749fe, 0x00d9d5c5, 0x00023685, 0x0225d6eb, 0x035b9ecb, 0x018a19ec, 0x0241ffbd, 0x03aabc39, 0x001f0a39}}}, + {X: Field{[10]uint32{0x02c490ee, 0x00b0378d, 0x02acf539, 0x0249b7a3, 0x01dd3e95, 0x01bec9a4, 0x036f620d, 0x0281d3a9, 0x003c97f3, 0x00097613}}, Y: Field{[10]uint32{0x02d5651a, 0x01ce90c5, 0x0154016f, 0x01b279d6, 0x03415309, 0x02b5bf49, 0x0391ffb1, 0x022a6c1e, 0x0345088c, 0x0017839d}}}, + {X: Field{[10]uint32{0x00d5765b, 0x00e511a1, 0x034a7faf, 0x00af9d0e, 0x03764994, 0x01f01d85, 0x015a01de, 0x01bc60b9, 0x03fdca25, 0x0022ea8e}}, Y: Field{[10]uint32{0x030506f1, 0x0022e034, 0x018117f3, 0x01f41f9c, 0x01587bfe, 0x01cc2c84, 0x01c28164, 0x0057345c, 0x00978bbe, 0x001851fa}}}, + {X: Field{[10]uint32{0x021f5170, 0x01a5e5c0, 0x0319274c, 0x026ca1f1, 0x024d3b6b, 0x000931c1, 0x0065dea8, 0x000e1447, 0x020a5b7d, 0x00141f5a}}, Y: Field{[10]uint32{0x037bf5d3, 0x00eb6b5f, 0x03b372dc, 0x034338c3, 0x03c12793, 0x00eb8cae, 0x02a8141c, 0x020eb91f, 0x024770ea, 0x0004e7c5}}}, + {X: Field{[10]uint32{0x02bbd846, 0x003f4e89, 0x030d6d64, 0x03ced3fc, 0x00e45620, 0x003f085f, 0x037354b1, 0x0316fa66, 0x02f7a059, 0x001f1a64}}, Y: Field{[10]uint32{0x01e0bee6, 0x006838ed, 0x02d03274, 0x02814386, 0x001f64e6, 0x004e7efb, 0x027062d7, 0x019070aa, 0x034efa63, 0x00025911}}}, + {X: Field{[10]uint32{0x02698bf2, 0x0319a496, 0x0238fcfc, 0x005efec2, 0x033d5e33, 0x03a9bc55, 0x00507509, 0x016c8c52, 0x02b01bf6, 0x003d8a0c}}, Y: Field{[10]uint32{0x00c1ec95, 0x0230a995, 0x0040d366, 0x00ee31d6, 0x011546cc, 0x013cdd6f, 0x02ce6f88, 0x037f5cfd, 0x00107b8f, 0x0035cc52}}}, + {X: Field{[10]uint32{0x03d1ebad, 0x03e2e71a, 0x02657def, 0x022b3332, 0x00594f62, 0x02f8f1f1, 0x00e20913, 0x03b0d8ad, 0x00abd8e4, 0x002bb487}}, Y: Field{[10]uint32{0x037100f8, 0x03759cae, 0x01dfdf9c, 0x00158094, 0x02b880a2, 0x03d07515, 0x02de1ac2, 0x01ffeaa2, 0x02f3833c, 0x0003e003}}}, + {X: Field{[10]uint32{0x014bf405, 0x0337f6dc, 0x01f66e06, 0x032adb00, 0x029e0ba8, 0x032a5094, 0x011b877a, 0x026905ae, 0x00a9343a, 0x0011b79e}}, Y: Field{[10]uint32{0x014d2bcf, 0x027662fb, 0x00bf66c8, 0x021c237e, 0x0181f30b, 0x00646136, 0x02809c6f, 0x029cfb84, 0x02524f3e, 0x00305104}}}, + {X: Field{[10]uint32{0x00bd41bc, 0x000ed095, 0x02174a63, 0x02469d42, 0x03ba4b65, 0x0010ee66, 0x016ae193, 0x03a4c94d, 0x01b8ab82, 0x000a0cad}}, Y: Field{[10]uint32{0x00aba440, 0x0398fdcd, 0x0049e249, 0x0093d242, 0x01a82752, 0x032e19a5, 0x02ce5340, 0x03c5248f, 0x02033f59, 0x00300d8f}}}, + {X: Field{[10]uint32{0x03e43f9a, 0x017c3132, 0x007ff939, 0x00109cdb, 0x020d85bd, 0x003cdaf6, 0x00abe39b, 0x005885df, 0x01024b5c, 0x0016d5f1}}, Y: Field{[10]uint32{0x0120766c, 0x0032306f, 0x00c06853, 0x0131eb73, 0x01b282ed, 0x00d7613b, 0x03f57b9b, 0x0011cfc6, 0x0007dc0c, 0x00002109}}}, + {X: Field{[10]uint32{0x01c2f103, 0x0132ec70, 0x03af3dac, 0x0362a7b6, 0x00814c45, 0x025ad2a7, 0x01bf8211, 0x01d63a09, 0x02708063, 0x002ce136}}, Y: Field{[10]uint32{0x030fa325, 0x002fbf48, 0x02d13df3, 0x0056bcc3, 0x03aa2375, 0x0241d5fe, 0x03925965, 0x033101d3, 0x01df6400, 0x0039b998}}}, + {X: Field{[10]uint32{0x009a5e1c, 0x00031697, 0x008f8e73, 0x01c8057b, 0x0282a5b6, 0x0069519a, 0x00a5da96, 0x01122a6c, 0x0191563e, 0x000dbff6}}, Y: Field{[10]uint32{0x00bb961c, 0x03b625c0, 0x013b632a, 0x035812d4, 0x01d1a742, 0x0135c8a9, 0x01873208, 0x0351fa50, 0x0035fc17, 0x0025c19e}}}, + {X: Field{[10]uint32{0x0189d81c, 0x02acd2bb, 0x022e7f5a, 0x00b31b0d, 0x035b9d14, 0x00eb7361, 0x0260ecc3, 0x000d9f93, 0x005257c2, 0x0020d9f9}}, Y: Field{[10]uint32{0x008be121, 0x00efc665, 0x0327af1f, 0x0356ef73, 0x02b77ce2, 0x03d0e067, 0x00a9e74d, 0x02c9bb4e, 0x00903ffa, 0x003f1ffc}}}, + {X: Field{[10]uint32{0x00b0564b, 0x0225a6f7, 0x02d179c9, 0x02e752c6, 0x0004719f, 0x0048e196, 0x00539e24, 0x00a5bed0, 0x03e48cc9, 0x003db391}}, Y: Field{[10]uint32{0x03950e1c, 0x003582a1, 0x02a60093, 0x0019e002, 0x02b524a6, 0x033464ab, 0x01590175, 0x03702dbc, 0x036afe5e, 0x000da34a}}}, + {X: Field{[10]uint32{0x01fae013, 0x00769efe, 0x02ac6509, 0x01623fe7, 0x03194ccb, 0x01c95917, 0x03d20c2a, 0x029bc149, 0x03e4beda, 0x0010e308}}, Y: Field{[10]uint32{0x02ff15f8, 0x004c69a4, 0x00b456d6, 0x02ffe392, 0x03e28dc6, 0x01c8a884, 0x01c93b53, 0x02095f6f, 0x0230c721, 0x00151882}}}, + {X: Field{[10]uint32{0x02bee7bd, 0x02124b61, 0x03fbc84e, 0x02acbbb1, 0x03a1fa1d, 0x0176d405, 0x00e87228, 0x00d2fdeb, 0x02f8cc94, 0x00073d9c}}, Y: Field{[10]uint32{0x01cafdcc, 0x00d2f16d, 0x01018167, 0x0047891e, 0x018932b5, 0x01d9f3bf, 0x03cccedb, 0x03769655, 0x01258bb4, 0x0035b48f}}}, + {X: Field{[10]uint32{0x021a2861, 0x01688fcf, 0x00bf4432, 0x018e2bca, 0x01943052, 0x03dc557f, 0x01cd1574, 0x00a6d9ba, 0x0212b0fa, 0x0011d193}}, Y: Field{[10]uint32{0x02b05141, 0x02a19368, 0x01e5681d, 0x02c286c6, 0x03a2468d, 0x0121a6a0, 0x0166e808, 0x03d5997a, 0x01d53bcd, 0x00082690}}}, + {X: Field{[10]uint32{0x02a964a2, 0x0301d69a, 0x02ff8717, 0x008f82c0, 0x020c4ee2, 0x02efdceb, 0x0077a0a9, 0x0324139a, 0x03a1c884, 0x002a6b7e}}, Y: Field{[10]uint32{0x03f79dc8, 0x02b90120, 0x0236c6cf, 0x0282121e, 0x02b2d809, 0x03fad49f, 0x03371d4a, 0x030d71cf, 0x001da7bb, 0x002ac584}}}, + {X: Field{[10]uint32{0x018edcbe, 0x00071bf1, 0x03f97d31, 0x02b97d05, 0x01824421, 0x0167b3e5, 0x00983dd6, 0x000c496b, 0x02de1060, 0x000a4cbf}}, Y: Field{[10]uint32{0x0176d727, 0x01d508f7, 0x02176e10, 0x0385f210, 0x012df54f, 0x03d32c47, 0x0234fe06, 0x0055afcb, 0x0343e666, 0x00218069}}}, + {X: Field{[10]uint32{0x03a50216, 0x0359969c, 0x01df3e31, 0x00e79a62, 0x0064f9ba, 0x03fdd103, 0x02b62c58, 0x02b41080, 0x01282f87, 0x0016afd5}}, Y: Field{[10]uint32{0x01a1fabf, 0x01a4a541, 0x029c5d32, 0x015ca0b5, 0x00610b6f, 0x03b71738, 0x00a1b370, 0x0170080b, 0x0216f270, 0x001c7713}}}, + {X: Field{[10]uint32{0x0001843a, 0x02670f6a, 0x013ec573, 0x02f34902, 0x020f359c, 0x00b0b1f9, 0x0087fc28, 0x0072b506, 0x015d9a12, 0x00010652}}, Y: Field{[10]uint32{0x033e0c31, 0x014daabd, 0x009d2956, 0x01f3638e, 0x02d5e661, 0x00e641cc, 0x02fefc78, 0x01425046, 0x01974029, 0x002454b8}}}, + {X: Field{[10]uint32{0x01fbc3af, 0x016ade8a, 0x03eae416, 0x013889bd, 0x00a902bc, 0x02b2ec56, 0x027979a5, 0x039270f0, 0x0082ea2b, 0x003f28e1}}, Y: Field{[10]uint32{0x0346f5f4, 0x015a9b73, 0x0234f288, 0x01d5ec03, 0x01bad50a, 0x00a5b110, 0x0235f0f7, 0x00999242, 0x035e5fe6, 0x0004981c}}}, + {X: Field{[10]uint32{0x01065d06, 0x02bd1595, 0x02de14b7, 0x01023244, 0x02d499ec, 0x016f0eac, 0x02135305, 0x00da22b2, 0x01233d70, 0x002f3c14}}, Y: Field{[10]uint32{0x01fb8bf9, 0x032d97e9, 0x0271d5f5, 0x0245d9c3, 0x01c16d49, 0x00d15a21, 0x0084e63a, 0x01a42cd5, 0x03f10645, 0x003cc995}}}, + {X: Field{[10]uint32{0x029a92e1, 0x036292e3, 0x018e479d, 0x03128999, 0x0268bf6c, 0x017f25ac, 0x019cf74f, 0x02d092c5, 0x002f6391, 0x00139c2d}}, Y: Field{[10]uint32{0x013b3688, 0x02ccfdf9, 0x03d36591, 0x02c8ff93, 0x0266c595, 0x02db38d5, 0x0324fa44, 0x007019de, 0x00111af3, 0x0022e9e2}}}, + {X: Field{[10]uint32{0x0121742f, 0x0213c37a, 0x00e6e1be, 0x03ce2897, 0x013cdb83, 0x01d8a370, 0x013703ca, 0x0183ab08, 0x03d7331c, 0x000ffa14}}, Y: Field{[10]uint32{0x01dca5d6, 0x00c39517, 0x0076d0b2, 0x00966d81, 0x03f27b51, 0x003c9374, 0x01961540, 0x03704dbd, 0x0377c2c6, 0x003edf6e}}}, + {X: Field{[10]uint32{0x0248b9be, 0x0098d27d, 0x025f5ee7, 0x0208f33d, 0x01ca42f5, 0x013a5d90, 0x02aa8100, 0x03750028, 0x037fc3ca, 0x003600cd}}, Y: Field{[10]uint32{0x03d6fe99, 0x011c67a3, 0x02900d82, 0x00616b44, 0x00aeed21, 0x033044eb, 0x02b7fbfe, 0x02020152, 0x004f281a, 0x0018d5ee}}}, + {X: Field{[10]uint32{0x030bebe1, 0x001b2781, 0x03845941, 0x00535b62, 0x0290a051, 0x01fe97b4, 0x037128e7, 0x01c5880a, 0x007b6f9e, 0x001777f7}}, Y: Field{[10]uint32{0x01cd76ad, 0x0047b915, 0x021e9d59, 0x03644663, 0x02714b6d, 0x00740c19, 0x0274c81a, 0x03edefeb, 0x00edfa1e, 0x00008fab}}}, + {X: Field{[10]uint32{0x036f7dd5, 0x0133528e, 0x004115bc, 0x01bb5c85, 0x037913b4, 0x004b459e, 0x01353e6b, 0x02523fa4, 0x0243c964, 0x0017c540}}, Y: Field{[10]uint32{0x00af903f, 0x0375366e, 0x014e571c, 0x0336555d, 0x03b18147, 0x028d8313, 0x00991e2b, 0x03440805, 0x01497a2f, 0x000daaf2}}}, + {X: Field{[10]uint32{0x00942647, 0x01a6eb14, 0x00e14979, 0x00898551, 0x030539f0, 0x02c49fbf, 0x00cc89c2, 0x0110a5e9, 0x00975b0c, 0x00092d3f}}, Y: Field{[10]uint32{0x02b5c207, 0x00e895e7, 0x038f9a82, 0x00b290f2, 0x0311d96f, 0x000529de, 0x02f88819, 0x001f617e, 0x03df54ad, 0x002f4f8f}}}, + {X: Field{[10]uint32{0x002202e0, 0x03395739, 0x0276e1dc, 0x03aab987, 0x03f11b18, 0x02191061, 0x025ba2b2, 0x02d7f277, 0x03355556, 0x0028083a}}, Y: Field{[10]uint32{0x02639f66, 0x02416755, 0x0188027e, 0x01bafadc, 0x039765ac, 0x02a60b8a, 0x03667c00, 0x03d15c5a, 0x021f1ad2, 0x00269c7a}}}, + {X: Field{[10]uint32{0x01f37a68, 0x01abf6b8, 0x00a0f86f, 0x01e33356, 0x038a224c, 0x018711f8, 0x0131de59, 0x00fab181, 0x0064f717, 0x00182de4}}, Y: Field{[10]uint32{0x010786b7, 0x017ce312, 0x016decfc, 0x038d89c9, 0x013437e4, 0x022d529f, 0x01fcbaed, 0x01f5b5ae, 0x024cf6a4, 0x000eb412}}}, + {X: Field{[10]uint32{0x01f7d60b, 0x01edf8e8, 0x01685177, 0x02d74442, 0x03d2e233, 0x03238ff7, 0x002d9159, 0x0079512b, 0x01f2b57d, 0x0020d73c}}, Y: Field{[10]uint32{0x02a84b31, 0x017281fd, 0x01b16166, 0x0255f24a, 0x01a7112f, 0x03871b80, 0x03f77339, 0x036c4eee, 0x0135136e, 0x001f48f7}}}, + {X: Field{[10]uint32{0x037f77ed, 0x00e549e0, 0x00dcab1d, 0x0378c623, 0x03606cd7, 0x012cc66e, 0x021d8ade, 0x036b540b, 0x03501f1e, 0x003ebdd0}}, Y: Field{[10]uint32{0x0221bcc9, 0x0122f7ff, 0x0147616d, 0x006e15d4, 0x030fbcd1, 0x026deb3f, 0x01a0fa03, 0x0160392e, 0x00bdbffb, 0x0036efac}}}, + {X: Field{[10]uint32{0x012de938, 0x02775dc3, 0x027620a3, 0x02974eca, 0x01044091, 0x004849c7, 0x03f74edf, 0x02eb88f9, 0x03c3e072, 0x000e5b1b}}, Y: Field{[10]uint32{0x026fa667, 0x027458b7, 0x024799e9, 0x01dbd1aa, 0x029fb0e0, 0x01ae3d53, 0x00499409, 0x01513533, 0x02f8a143, 0x00177948}}}, + {X: Field{[10]uint32{0x0144ab88, 0x0051fb83, 0x03684881, 0x0170790e, 0x00ae8e60, 0x0023bc83, 0x02622f80, 0x03cb2870, 0x0140ad8d, 0x0003e2ae}}, Y: Field{[10]uint32{0x01bff796, 0x00f9c377, 0x011e0406, 0x03d4cf91, 0x01630d28, 0x0201310a, 0x0057163f, 0x009f3b26, 0x0281fa74, 0x00267f94}}}, + {X: Field{[10]uint32{0x01772367, 0x0106d1af, 0x01e78758, 0x01325640, 0x008197af, 0x020a70dd, 0x0122219a, 0x03fff078, 0x0068af6d, 0x0029880a}}, Y: Field{[10]uint32{0x01e9af45, 0x03deeac1, 0x00e4d145, 0x031360ec, 0x03fe9c4f, 0x0235a363, 0x0254eb6f, 0x0127053e, 0x020bc82a, 0x000981e8}}}, + {X: Field{[10]uint32{0x0067e41e, 0x0312611c, 0x02bda4d7, 0x017edda8, 0x00cfbced, 0x00e93f6f, 0x03644842, 0x02185a41, 0x019349a9, 0x002c4b46}}, Y: Field{[10]uint32{0x02d75e31, 0x0270cf70, 0x037ec009, 0x0155c006, 0x0173fdd5, 0x01c05112, 0x0045eb3f, 0x022ac4a4, 0x00e0ac6c, 0x00299b75}}}, + {X: Field{[10]uint32{0x01eb3b3c, 0x01ef7085, 0x01c64fd6, 0x00d17372, 0x009ae0a7, 0x0064e0c1, 0x00d3b97b, 0x003d7f1b, 0x0355b499, 0x00023723}}, Y: Field{[10]uint32{0x01435d83, 0x01044679, 0x002f5fa6, 0x00e3211f, 0x02c00ce4, 0x021c8bd2, 0x0354cc38, 0x023f632e, 0x017d62cc, 0x0006f9d1}}}, + {X: Field{[10]uint32{0x018feeec, 0x03586719, 0x0053b1b6, 0x00f6b743, 0x01f12864, 0x018d47d9, 0x0121c4b3, 0x02792df5, 0x0337d1db, 0x000b02dc}}, Y: Field{[10]uint32{0x039bad53, 0x0264016c, 0x02d9ad8b, 0x0254ec20, 0x01ef765b, 0x001f3b85, 0x03dae62c, 0x004867de, 0x039ceb7c, 0x003a289e}}}, + {X: Field{[10]uint32{0x023bab35, 0x001b24f6, 0x00d0e66d, 0x024aed7c, 0x02b17ad6, 0x009052ac, 0x00a0d1d2, 0x001a2692, 0x00a25010, 0x002247ed}}, Y: Field{[10]uint32{0x027260f6, 0x014f8903, 0x00c7c0cb, 0x00399869, 0x0052d06c, 0x00d1fcf2, 0x013c03bc, 0x00f04efa, 0x0166cdf4, 0x00105a14}}}, + {X: Field{[10]uint32{0x01ca1738, 0x027b4eda, 0x03b02ed9, 0x02d87d6e, 0x0039fbcc, 0x0399a3bc, 0x0213729d, 0x01103f9c, 0x01b1511c, 0x00128cde}}, Y: Field{[10]uint32{0x03ac0f6f, 0x00519328, 0x02b0039d, 0x000f505c, 0x0017b3bf, 0x02d133a2, 0x01d75eed, 0x006476a2, 0x01c239e9, 0x002c4a8f}}}, + {X: Field{[10]uint32{0x03815521, 0x01c18697, 0x000d22c5, 0x00f0721e, 0x017dc58e, 0x00efe359, 0x01a360f8, 0x01afe98b, 0x03c85493, 0x002e2ca9}}, Y: Field{[10]uint32{0x02a2d15b, 0x0168f57d, 0x03021c06, 0x00b05f0a, 0x021cd441, 0x014aa26e, 0x02c70012, 0x00d8b096, 0x000b7719, 0x0023e48b}}}, + {X: Field{[10]uint32{0x039624fb, 0x024491f6, 0x03a7ff01, 0x02d88b25, 0x002fb56a, 0x01f3dcea, 0x029341d7, 0x014b941e, 0x0219d1dc, 0x002419bf}}, Y: Field{[10]uint32{0x011baf50, 0x00f9f51c, 0x00896215, 0x02f02aef, 0x00c281f5, 0x02d9e269, 0x01d4929e, 0x0315d760, 0x03436ec3, 0x0008f466}}}, + {X: Field{[10]uint32{0x00ced8ec, 0x00d35d5f, 0x017c2b05, 0x0379b99d, 0x029f32c8, 0x02d6dcfb, 0x01a18df2, 0x03a6c728, 0x014c19c9, 0x002fe6ac}}, Y: Field{[10]uint32{0x029759c0, 0x007c5d03, 0x011dd048, 0x01d756f2, 0x0385e793, 0x00de8ebd, 0x02724188, 0x018f782a, 0x01233c38, 0x003b25a6}}}, + {X: Field{[10]uint32{0x016f9d03, 0x01978d4c, 0x031af102, 0x021ba216, 0x0378c656, 0x023adeab, 0x01b7e69e, 0x01280889, 0x006f9c65, 0x001a2c9a}}, Y: Field{[10]uint32{0x014da9c3, 0x012e06fc, 0x0019af28, 0x035bd3dd, 0x03b6b407, 0x00e49caa, 0x014d4077, 0x009af615, 0x01048468, 0x00074f5d}}}, + {X: Field{[10]uint32{0x010bf2fa, 0x009c00dc, 0x01a7de04, 0x01a6fdef, 0x024d3bf6, 0x00b27cda, 0x00989d39, 0x02886a53, 0x03855251, 0x00083720}}, Y: Field{[10]uint32{0x01aa749f, 0x01d83c25, 0x0224a974, 0x0251588f, 0x03975d67, 0x0182321d, 0x0080c4b3, 0x00ca7fe4, 0x02ff713d, 0x000085f9}}}, + {X: Field{[10]uint32{0x01fd0368, 0x026872ad, 0x01568168, 0x011a6a1d, 0x025c822e, 0x03164612, 0x01859bf8, 0x0266328e, 0x009b555d, 0x003c2fad}}, Y: Field{[10]uint32{0x02664aac, 0x0022d01c, 0x032f53bd, 0x03c05830, 0x002e8ff7, 0x029d74fd, 0x033b3b30, 0x037e52e8, 0x02e7a23d, 0x00383816}}}, + {X: Field{[10]uint32{0x00a0ee57, 0x0168ed71, 0x022cfaab, 0x032b7229, 0x0016ddc1, 0x00b3d311, 0x01ad8abf, 0x03e7ae90, 0x0173270f, 0x0023c6aa}}, Y: Field{[10]uint32{0x015920ec, 0x038c2996, 0x00a87071, 0x02c0ae68, 0x002bd6bb, 0x00bdbae8, 0x02a441f1, 0x026c5ea1, 0x0260e340, 0x00242a8d}}}, + {X: Field{[10]uint32{0x028a9957, 0x0208a0e4, 0x01dfb413, 0x02a02ab2, 0x00fecd43, 0x024d2e20, 0x00ca847a, 0x03051d83, 0x0135278d, 0x0031c7ac}}, Y: Field{[10]uint32{0x02003804, 0x021c57ad, 0x03299a9d, 0x0311f9c6, 0x0351d23a, 0x03b31fdb, 0x0307ad5d, 0x0206e224, 0x03774852, 0x0010599f}}}, + {X: Field{[10]uint32{0x02c41c81, 0x03b5946f, 0x01180b0f, 0x00f6ee87, 0x00fa904d, 0x01259717, 0x0109df5d, 0x01aa7cdf, 0x026e50d6, 0x003a401c}}, Y: Field{[10]uint32{0x01028e39, 0x0317c25c, 0x01d5a921, 0x0095e1ba, 0x03117f77, 0x0371f5ec, 0x00e64f2c, 0x01bd02cd, 0x0230db03, 0x0035482a}}}, + {X: Field{[10]uint32{0x0123fa38, 0x0398ed80, 0x00c3beda, 0x035d3e1f, 0x0258d72d, 0x0083bf79, 0x03a6d6b7, 0x014aa6e8, 0x00afa159, 0x002502ac}}, Y: Field{[10]uint32{0x03bfcbcd, 0x01974a3c, 0x00702f87, 0x03c14f10, 0x016e5061, 0x012445b8, 0x01e443aa, 0x022866e1, 0x03476f78, 0x003fb1b5}}}, + {X: Field{[10]uint32{0x00c76949, 0x00b9c32a, 0x006be8b6, 0x01a81903, 0x02a03ba4, 0x004b1739, 0x033ce9d4, 0x02619937, 0x026d643e, 0x002684f7}}, Y: Field{[10]uint32{0x0126dd5e, 0x000e54da, 0x02499061, 0x00c0bada, 0x01a46016, 0x02f1b2f2, 0x00c914d4, 0x02361e2d, 0x02966c2d, 0x00108e20}}}, + {X: Field{[10]uint32{0x02c577c3, 0x03e0ee9d, 0x01d6f256, 0x0176f782, 0x01b76d6a, 0x035fd8ba, 0x006b1497, 0x00a7652a, 0x01b2b311, 0x0010e10a}}, Y: Field{[10]uint32{0x00bc1c7d, 0x013e4c97, 0x006cd2e4, 0x0261f11b, 0x03b2398e, 0x03a0cef6, 0x03cb600b, 0x026f86cc, 0x0186a722, 0x00390d80}}}, + {X: Field{[10]uint32{0x02d02605, 0x019df1a5, 0x00f018c1, 0x02f9a8ea, 0x03c8bb59, 0x010c03a5, 0x007b524e, 0x01cb97eb, 0x025d66d4, 0x000fd8ec}}, Y: Field{[10]uint32{0x00ca39dd, 0x0257ced4, 0x0249d44c, 0x028bef7d, 0x01d9971a, 0x033fcb1a, 0x0119bbe5, 0x006734af, 0x0042158e, 0x0001161c}}}, + {X: Field{[10]uint32{0x038cc0c5, 0x00d716ae, 0x013d1e17, 0x03b5b3ef, 0x0047afe5, 0x0237b7bc, 0x004f90b9, 0x0294828e, 0x01f717c7, 0x0001987f}}, Y: Field{[10]uint32{0x01a80abd, 0x01c0a4df, 0x02549d99, 0x00cec765, 0x03b83b74, 0x014be083, 0x012f00ea, 0x00386496, 0x003ab43c, 0x002f6689}}}, + {X: Field{[10]uint32{0x02b951ce, 0x0317e256, 0x018cc279, 0x01f1d6f1, 0x000c999d, 0x03a8b532, 0x0027c367, 0x01abdf43, 0x0326daac, 0x002e706e}}, Y: Field{[10]uint32{0x03140f4e, 0x02e1fac6, 0x0138a767, 0x01eed632, 0x01b872d1, 0x03b575fc, 0x026c5b2e, 0x021aedf1, 0x0334a42b, 0x002934ef}}}, + {X: Field{[10]uint32{0x0127e8fa, 0x006fe82c, 0x010999b1, 0x03b2ead7, 0x017d9b23, 0x03bf4aee, 0x02af4733, 0x03676142, 0x00a0fc6c, 0x0033d6b1}}, Y: Field{[10]uint32{0x011070ec, 0x03c5817e, 0x002872ca, 0x01dff521, 0x01ad465d, 0x0298b2bd, 0x03a94fe3, 0x005c601f, 0x0316c37f, 0x00112498}}}, + {X: Field{[10]uint32{0x02b3b422, 0x02191c6f, 0x01b7413c, 0x0286cf0a, 0x03749caa, 0x03c28d3e, 0x0082c57f, 0x028cb8ee, 0x02afab8d, 0x002a94ac}}, Y: Field{[10]uint32{0x000859ce, 0x038fb303, 0x00244ac4, 0x02105b18, 0x03733260, 0x00c8094b, 0x028df35e, 0x0396546d, 0x03284a7b, 0x0012d589}}}, + {X: Field{[10]uint32{0x0068211c, 0x01fc60d2, 0x0217ad34, 0x0159e61c, 0x007926b0, 0x011a25af, 0x032909c5, 0x002342a7, 0x022eb3aa, 0x0001843c}}, Y: Field{[10]uint32{0x0019e6bb, 0x030d5492, 0x006eac1b, 0x01ef09dd, 0x012dbf63, 0x019bb68f, 0x01571e61, 0x0312cc06, 0x010df35f, 0x00294b86}}}, + {X: Field{[10]uint32{0x011a6d80, 0x00f30d31, 0x03b44acc, 0x01690997, 0x02db65f1, 0x025449e5, 0x00543307, 0x02963381, 0x00c3a485, 0x00004fc9}}, Y: Field{[10]uint32{0x03f3bc3b, 0x01261301, 0x02e611a4, 0x01b6c93e, 0x020f0797, 0x03e01cd9, 0x01c4327c, 0x01a7fcf3, 0x03b618e0, 0x003eb32f}}}, + {X: Field{[10]uint32{0x00eb0f24, 0x02176768, 0x02bdf922, 0x03ed0573, 0x01caeb18, 0x008b16a1, 0x00112e69, 0x026ca72c, 0x02a84927, 0x000573af}}, Y: Field{[10]uint32{0x0075d833, 0x03a27e38, 0x00d05821, 0x014a3430, 0x01c36de4, 0x029dec70, 0x01af7ed4, 0x03e6f54e, 0x00fe158f, 0x0008f973}}}, + {X: Field{[10]uint32{0x004d97f6, 0x03721c80, 0x029a55f2, 0x032025bc, 0x02cf92e0, 0x00093586, 0x001b1d60, 0x014d9f71, 0x018efb7d, 0x00098168}}, Y: Field{[10]uint32{0x0266d375, 0x012f5417, 0x022f4f94, 0x0132500b, 0x02fd6d67, 0x002b5bf4, 0x018ae518, 0x02dfb371, 0x0374f111, 0x00235a99}}}, + {X: Field{[10]uint32{0x027f9995, 0x002c172f, 0x0356c33d, 0x004cda52, 0x0225cd05, 0x00d6cd8a, 0x0236d6cd, 0x015bcdfe, 0x0272a787, 0x00396238}}, Y: Field{[10]uint32{0x0072fbb7, 0x015bff55, 0x0191766e, 0x0300341c, 0x02115425, 0x0348f94f, 0x00715c6a, 0x010a5a6e, 0x018320b8, 0x00056fae}}}, + {X: Field{[10]uint32{0x016b46a5, 0x021d436f, 0x00b6ccb9, 0x00e64d16, 0x023a02cc, 0x03de729f, 0x03205cb0, 0x03b716da, 0x0122f264, 0x002000c9}}, Y: Field{[10]uint32{0x011a44a8, 0x01c60ee1, 0x01043bca, 0x03a3530f, 0x02fd2c1d, 0x02aa5c97, 0x038b93b5, 0x007aea63, 0x02f4fb4e, 0x0011e724}}}, + {X: Field{[10]uint32{0x0241bfaa, 0x01a8be85, 0x013f3c16, 0x02dfe45b, 0x0394b525, 0x0084a1f9, 0x0101308a, 0x0206d5c1, 0x000ee1a5, 0x00254301}}, Y: Field{[10]uint32{0x0338ea71, 0x03bc76ed, 0x01a751e4, 0x022370e1, 0x0252441a, 0x01d808de, 0x0171725f, 0x01c29a7c, 0x020e911d, 0x00390f6c}}}, + {X: Field{[10]uint32{0x02c391fa, 0x015402a1, 0x018759db, 0x02f8a0b7, 0x01a634b9, 0x02e2f03d, 0x030aecad, 0x03b95cb9, 0x0336423f, 0x003a267f}}, Y: Field{[10]uint32{0x003a9bd1, 0x01231f2d, 0x02790a02, 0x02432c62, 0x01886117, 0x03e1ea44, 0x03100340, 0x02da3899, 0x03b0dfe6, 0x0001fb65}}}, + {X: Field{[10]uint32{0x00a1a51b, 0x00a972f6, 0x0045e833, 0x034a715e, 0x006a7415, 0x01b867ee, 0x00ce5c76, 0x01adea3e, 0x008f0c20, 0x00348d9a}}, Y: Field{[10]uint32{0x016ec9e9, 0x00170b19, 0x01113adb, 0x021d5486, 0x01d50988, 0x0060ed49, 0x02d65085, 0x012983f9, 0x019fe3d5, 0x001cbc8d}}}, + {X: Field{[10]uint32{0x019dcccf, 0x038be884, 0x0286ae94, 0x017f7709, 0x01430eab, 0x01718a3d, 0x02458c58, 0x00bc920f, 0x0071da4b, 0x00234f5f}}, Y: Field{[10]uint32{0x0361178f, 0x01e3d607, 0x00aad827, 0x000c7d65, 0x021f435c, 0x0191ffc7, 0x039c22ad, 0x03c832f5, 0x00e47948, 0x000cf102}}}, + {X: Field{[10]uint32{0x032651a9, 0x01ff66ed, 0x028a587d, 0x01431585, 0x03fee4b7, 0x034418fe, 0x02542ba5, 0x02066546, 0x037ae891, 0x000c83c4}}, Y: Field{[10]uint32{0x03c402c5, 0x016f3cf4, 0x02232679, 0x0262a317, 0x03086036, 0x014efc00, 0x0275a021, 0x0387bcc8, 0x006ae2a4, 0x002e1015}}}, + {X: Field{[10]uint32{0x0081352c, 0x015df186, 0x020de8ce, 0x01fe691b, 0x027546c8, 0x03519006, 0x01686072, 0x02c967d1, 0x03ce3fe6, 0x0027a2bf}}, Y: Field{[10]uint32{0x029d02f1, 0x01def530, 0x00f9273e, 0x03db14fb, 0x01af8639, 0x01c8d949, 0x00ebaf09, 0x01fdf098, 0x0301d83b, 0x00343a8d}}}, + {X: Field{[10]uint32{0x021eef64, 0x031cacf1, 0x03f539be, 0x03d26b4a, 0x03daf70f, 0x0090487b, 0x03c915ea, 0x00e61ca4, 0x01b81d35, 0x00177d19}}, Y: Field{[10]uint32{0x01e690af, 0x01069eb5, 0x03e54385, 0x01f3ccf0, 0x038b3804, 0x003d1820, 0x00c193d4, 0x03210416, 0x01ff5ae4, 0x000c81b1}}}, + {X: Field{[10]uint32{0x02f28f58, 0x01197523, 0x0064d6e1, 0x00e621a8, 0x011312bb, 0x009ae8f1, 0x0061d488, 0x00d42fd2, 0x0326a18c, 0x00266734}}, Y: Field{[10]uint32{0x00b1ef12, 0x02244772, 0x00b0dd41, 0x02c2fa21, 0x00a9fcea, 0x02554582, 0x018e6629, 0x0337d9e6, 0x032ad6dc, 0x000b362a}}}, + {X: Field{[10]uint32{0x03ce163b, 0x02c09ada, 0x034cdc0a, 0x019d1d86, 0x03479a66, 0x01551832, 0x02ba6f42, 0x02705be8, 0x00ee574d, 0x0020763f}}, Y: Field{[10]uint32{0x00673143, 0x02d2b166, 0x00ca638c, 0x03f3f5f2, 0x003cf771, 0x0169a605, 0x039a996f, 0x01e9a8ed, 0x0334f589, 0x0016539f}}}, + {X: Field{[10]uint32{0x0096d278, 0x01b610f4, 0x020dd4da, 0x027b254e, 0x0385839c, 0x01be1460, 0x032b42d5, 0x01cefbe4, 0x0324b9ac, 0x0027a0f5}}, Y: Field{[10]uint32{0x00c88869, 0x03e9788c, 0x01689a1a, 0x00029287, 0x0100d3a0, 0x03125bb1, 0x02fda95a, 0x016b2e27, 0x00abfed0, 0x003e2c63}}}, + {X: Field{[10]uint32{0x02320c3e, 0x0244510f, 0x0231764f, 0x00ecd6ea, 0x01908ec3, 0x00ecb640, 0x00b1f647, 0x00f022bb, 0x00b13b44, 0x00262e8e}}, Y: Field{[10]uint32{0x0399b84f, 0x0075808f, 0x020a44df, 0x01e8d0d2, 0x010d8ece, 0x01bd0bd2, 0x012f972e, 0x00cbefd7, 0x01d7fc22, 0x000d0fd8}}}, + {X: Field{[10]uint32{0x02a875ec, 0x00120194, 0x01285de7, 0x01ef9b0d, 0x01582244, 0x03a5c19c, 0x03a94886, 0x017bb169, 0x025a9adf, 0x000824ba}}, Y: Field{[10]uint32{0x024e7f35, 0x02b71efa, 0x0228f304, 0x03099650, 0x0195a7e9, 0x00985998, 0x00facc8e, 0x009c8aa5, 0x02eb5238, 0x00377edc}}}, + {X: Field{[10]uint32{0x02eeb75a, 0x00c13080, 0x01e765b9, 0x00e65687, 0x00c044c6, 0x02f25d04, 0x037bce4e, 0x02817ab1, 0x009a8f45, 0x003e7ba4}}, Y: Field{[10]uint32{0x0301705e, 0x03b93b84, 0x01d51a41, 0x034df8ba, 0x023a39c0, 0x02babc4f, 0x03e50fd2, 0x02c3a11c, 0x01ba93f5, 0x0021840c}}}, + {X: Field{[10]uint32{0x01df101c, 0x03394d4d, 0x00603c75, 0x009f18fa, 0x015c676e, 0x03baa6fe, 0x002dfc02, 0x0169f2cd, 0x00e23bc5, 0x00284e1e}}, Y: Field{[10]uint32{0x03108427, 0x03ffe09e, 0x02ed001b, 0x0214d71c, 0x02233f05, 0x034fa069, 0x02a2f833, 0x02c24424, 0x02d03d4b, 0x000d7033}}}, + {X: Field{[10]uint32{0x004ae3e4, 0x01ec6d84, 0x0065d34f, 0x03e0e9c6, 0x03b863a7, 0x02760300, 0x004cfce0, 0x037f61ca, 0x01d2cd32, 0x003a3b20}}, Y: Field{[10]uint32{0x0017648b, 0x009c89c1, 0x01e4ec6e, 0x03a2c219, 0x011d24c4, 0x0145eff2, 0x032b01af, 0x0375ffd4, 0x0377ee12, 0x00182fa6}}}, + {X: Field{[10]uint32{0x00f35b60, 0x00ae2607, 0x0297a664, 0x0261a6e6, 0x00d48e98, 0x013818e4, 0x030b18fe, 0x03710cd1, 0x02551529, 0x003c1f2c}}, Y: Field{[10]uint32{0x0223b550, 0x00a5e9b0, 0x03d2b0a3, 0x00856544, 0x01c6e854, 0x0388d56a, 0x034b9412, 0x018cf566, 0x03776d74, 0x002f51ba}}}, + {X: Field{[10]uint32{0x02af7f51, 0x022136ae, 0x03dd82fe, 0x00fcbcb2, 0x0242becd, 0x02982e0d, 0x03189ae0, 0x02a7c2a5, 0x0023dcfd, 0x000e6f39}}, Y: Field{[10]uint32{0x022c8e4d, 0x01e2ec7a, 0x01a2b2db, 0x03a0525e, 0x01f3430b, 0x00c0fb24, 0x00903127, 0x008679d1, 0x00aa4b71, 0x00305667}}}, + {X: Field{[10]uint32{0x029ad3cf, 0x03f44147, 0x00ec80e0, 0x019f3cb6, 0x0358142f, 0x00f2793f, 0x033de211, 0x02e05062, 0x01cbd51d, 0x001b6984}}, Y: Field{[10]uint32{0x001e4b7f, 0x01e3fcc1, 0x00d704d1, 0x01a0b867, 0x02f7fe55, 0x02c0d203, 0x03d494eb, 0x03d953f6, 0x00483250, 0x001af0bc}}}, + {X: Field{[10]uint32{0x031aed8a, 0x0327eee2, 0x00c709a3, 0x011de51c, 0x01f4e13a, 0x029fa571, 0x00a5e8ef, 0x003ae629, 0x00038d2e, 0x0033b6e7}}, Y: Field{[10]uint32{0x019a0d40, 0x01ab5361, 0x028feeca, 0x0297dfd7, 0x0046804f, 0x034213d0, 0x00d5d56e, 0x0362f208, 0x0131de42, 0x001e68bf}}}, + {X: Field{[10]uint32{0x01ae3d82, 0x01e841c1, 0x02d8a3a0, 0x02134037, 0x0225393f, 0x01b107f9, 0x0340458f, 0x001b40cb, 0x00986d11, 0x001f6255}}, Y: Field{[10]uint32{0x026d0d61, 0x03561a86, 0x01866ee7, 0x030ac842, 0x02edd110, 0x0382b783, 0x02a117c7, 0x01652d86, 0x02cfff1c, 0x001753ed}}}, + {X: Field{[10]uint32{0x03dc3df7, 0x000310f5, 0x01aa175a, 0x01431ba7, 0x00851aaf, 0x00fb3b18, 0x01e26069, 0x010ebfac, 0x01627370, 0x00293ca4}}, Y: Field{[10]uint32{0x039c4439, 0x009a0871, 0x00846b27, 0x01ef118a, 0x0392265d, 0x0116abb4, 0x03abb201, 0x012c54e3, 0x00e8fb76, 0x002fbaff}}}, + {X: Field{[10]uint32{0x011cab70, 0x0058bc3e, 0x000a29cb, 0x01959a03, 0x00e0ba81, 0x01a26ef3, 0x00ce964e, 0x032c23b0, 0x01acde4c, 0x002d8e27}}, Y: Field{[10]uint32{0x00303529, 0x00103294, 0x02cdd679, 0x029fbbf6, 0x039ee836, 0x0238c7f9, 0x032826d2, 0x0091d05e, 0x03dbd2d0, 0x00391031}}}, + {X: Field{[10]uint32{0x02fcc9e1, 0x022bbefd, 0x00b4927b, 0x005a6673, 0x01ae4ee0, 0x03bbcdfd, 0x00ac2d6a, 0x030dbe5e, 0x01acf752, 0x001cb39b}}, Y: Field{[10]uint32{0x039bbca6, 0x017c43b5, 0x03bc67c4, 0x03379e5a, 0x028ad38a, 0x0380409f, 0x00c6d4d5, 0x01100f58, 0x0297bbd8, 0x00339ab0}}}, + {X: Field{[10]uint32{0x00255f06, 0x004e119b, 0x0117531b, 0x02b43e2b, 0x014fb3e5, 0x01af1430, 0x00931faa, 0x01096958, 0x036fcfd7, 0x003beb4c}}, Y: Field{[10]uint32{0x015a82c0, 0x008ba3f8, 0x0203b2b4, 0x00251064, 0x039eab6b, 0x00605c58, 0x03ab5597, 0x026847b1, 0x00f4eeee, 0x000fede1}}}, + {X: Field{[10]uint32{0x034eaae3, 0x0177ac80, 0x0349c289, 0x01b3ce0a, 0x0322002c, 0x00e4f295, 0x034bd1f0, 0x008599f1, 0x022d04bb, 0x003e6352}}, Y: Field{[10]uint32{0x016fd148, 0x01b3116d, 0x0269e9a3, 0x022b59a7, 0x0297a26f, 0x01851f2e, 0x0350763c, 0x01e2a0d1, 0x031f7e37, 0x00261d78}}}, + {X: Field{[10]uint32{0x0134183f, 0x02251832, 0x02eafb0b, 0x0079961d, 0x012b0d16, 0x02b04fb4, 0x01eea342, 0x0108ccb1, 0x034d2bc2, 0x001da33d}}, Y: Field{[10]uint32{0x02fdc34e, 0x0003e9e8, 0x022654ba, 0x00cb9cb9, 0x00af083b, 0x0341a954, 0x02e9f72d, 0x0135ebe1, 0x0207e55b, 0x00108cdd}}}, + {X: Field{[10]uint32{0x01beff7b, 0x0049d369, 0x01c59979, 0x01b88949, 0x03d34cfb, 0x02a45b42, 0x01ec27aa, 0x03189645, 0x03b01d05, 0x002b09bc}}, Y: Field{[10]uint32{0x014f4045, 0x033b37fa, 0x0254a42f, 0x01dae2f7, 0x01a30055, 0x03afac66, 0x0113bcb1, 0x005a0746, 0x00ac89b6, 0x0038d9d8}}}, + {X: Field{[10]uint32{0x0374fbac, 0x0263cd07, 0x01285212, 0x00368234, 0x02fcd905, 0x02c10a8e, 0x025045e1, 0x002f8b99, 0x0181741a, 0x0036b750}}, Y: Field{[10]uint32{0x00a84f60, 0x01b80339, 0x0002b805, 0x02f2a40a, 0x03f6a4df, 0x018d5d39, 0x01e4e2c8, 0x03741098, 0x03e0da78, 0x001b3d1b}}}, + {X: Field{[10]uint32{0x0286a3e8, 0x0342ae46, 0x00f82a6f, 0x03aa46a2, 0x032c4e1e, 0x010fc6dc, 0x03139ed1, 0x01aa18be, 0x0198ce9e, 0x00395945}}, Y: Field{[10]uint32{0x01f1ac98, 0x03bf6cbc, 0x0221a9e9, 0x022b55a6, 0x000770fd, 0x03d357db, 0x01723d8f, 0x01b04042, 0x033669ab, 0x002ed084}}}, + {X: Field{[10]uint32{0x030f5b02, 0x03922b89, 0x03d65de9, 0x02dc3730, 0x032d47a2, 0x0007b8ea, 0x0369b454, 0x03d658e6, 0x011eb4f0, 0x003c9bde}}, Y: Field{[10]uint32{0x030ff699, 0x026f02d1, 0x004fbe1a, 0x02458cea, 0x002693c5, 0x02915d5f, 0x003c799e, 0x02efc946, 0x03251fe5, 0x0008b8d2}}}, + {X: Field{[10]uint32{0x023da9da, 0x0379a398, 0x018ac19f, 0x008a76de, 0x032d2bec, 0x02137628, 0x01da048a, 0x00bd21ea, 0x010b9561, 0x0029433c}}, Y: Field{[10]uint32{0x03dcc576, 0x020554c2, 0x02888e4c, 0x033730f7, 0x00ce345e, 0x03358166, 0x039f9f47, 0x02899076, 0x013c0a76, 0x0014041f}}}, + {X: Field{[10]uint32{0x0245c13c, 0x025fc6c2, 0x00c10a11, 0x02ad7b17, 0x03e917e5, 0x0205f2e6, 0x0386a5c1, 0x01b06f57, 0x03b90273, 0x0031d220}}, Y: Field{[10]uint32{0x008beedc, 0x03d2f44b, 0x0232e847, 0x01570ade, 0x01d1c2bd, 0x003a89d6, 0x013e73b6, 0x00f3fc35, 0x03bce739, 0x00380f10}}}, + {X: Field{[10]uint32{0x01e1c0a9, 0x03fa0002, 0x02e9c98d, 0x02937400, 0x01be7cad, 0x00a78b23, 0x005c00f6, 0x03b622ec, 0x03d01741, 0x00028d0d}}, Y: Field{[10]uint32{0x007bca1c, 0x0181c4e1, 0x01c9ed21, 0x019c2ed0, 0x00fc268e, 0x0134fbbe, 0x01a00afa, 0x032af47f, 0x005a257f, 0x002989f8}}}, + {X: Field{[10]uint32{0x01c8312d, 0x027fe8e6, 0x03093832, 0x01dc128f, 0x0090c00c, 0x00c1a1bf, 0x018ba895, 0x02ead37a, 0x0188f179, 0x0029b312}}, Y: Field{[10]uint32{0x0170b6df, 0x03fd1d67, 0x01643712, 0x03bd3d84, 0x01bbba86, 0x004d191c, 0x03cad7c1, 0x0169e4a6, 0x00737db2, 0x003d3ae9}}}, + {X: Field{[10]uint32{0x00b84dbe, 0x0286b29c, 0x02f2400d, 0x020c4e4d, 0x039e6801, 0x03286af8, 0x03330776, 0x02355ecc, 0x00a8f577, 0x0003becd}}, Y: Field{[10]uint32{0x03428d3f, 0x00a61e1f, 0x025952f0, 0x0328526c, 0x027e5845, 0x019d4dae, 0x00878e71, 0x03ea60c8, 0x016efc53, 0x002a5288}}}, + {X: Field{[10]uint32{0x00dfa07a, 0x017ef5bf, 0x01a94a2c, 0x02e0fe91, 0x03019ec3, 0x021fee6a, 0x03914ef4, 0x039aeec8, 0x02d81385, 0x0004e611}}, Y: Field{[10]uint32{0x00fce099, 0x0132f1ab, 0x02aa09c3, 0x02cba325, 0x0362d837, 0x0237f682, 0x01f6aff2, 0x004336a6, 0x004e599b, 0x0013edf3}}}, + {X: Field{[10]uint32{0x01f2a101, 0x02336aeb, 0x01bb7a53, 0x00284ca6, 0x0249c209, 0x02d4fa98, 0x01f6eeaa, 0x0159ea0f, 0x03af98ba, 0x00198248}}, Y: Field{[10]uint32{0x0094bd29, 0x003c3623, 0x0078d446, 0x021a5c55, 0x00ee2a56, 0x0118bd10, 0x01890ee8, 0x025c89a6, 0x00cab1a2, 0x002ca2d6}}}, + {X: Field{[10]uint32{0x012be3c6, 0x000e243d, 0x01a98d3e, 0x03430772, 0x02d2f86b, 0x00698d16, 0x0389d31f, 0x005f78fc, 0x02b58c75, 0x003c6024}}, Y: Field{[10]uint32{0x00f9c906, 0x02a6bf5a, 0x006d07e8, 0x018ca8db, 0x00440ca7, 0x00ec0c87, 0x00276973, 0x013b5df7, 0x02049148, 0x002a0f9e}}}, + {X: Field{[10]uint32{0x01d0ab75, 0x03844e20, 0x03f74bfe, 0x019d9233, 0x017b7004, 0x02d7eca5, 0x026a6e25, 0x01503ce2, 0x020d1b2c, 0x003a342a}}, Y: Field{[10]uint32{0x0314409a, 0x02ee2af4, 0x016e9f19, 0x032ffaa9, 0x021abfc0, 0x022a0260, 0x00c3f298, 0x01706f43, 0x03be5205, 0x0028c932}}}, + {X: Field{[10]uint32{0x03526c1a, 0x00b7f11b, 0x025f3c7d, 0x00b540c0, 0x021d8ee7, 0x007dd18f, 0x01613df5, 0x001d0c3e, 0x00c0230a, 0x000961a8}}, Y: Field{[10]uint32{0x0016c735, 0x000eb026, 0x02653ede, 0x02891d01, 0x03ce9b1d, 0x02143d70, 0x007b4694, 0x011c350f, 0x01a1eb2b, 0x0028a5cd}}}, + {X: Field{[10]uint32{0x037dffd8, 0x032ad099, 0x00e48a12, 0x015390b0, 0x018be682, 0x0375f23d, 0x01bb2d27, 0x01b51b0c, 0x02888d82, 0x00085f3e}}, Y: Field{[10]uint32{0x001ac4ce, 0x025adab0, 0x031a006d, 0x015fd204, 0x0134179c, 0x02be477b, 0x01f99017, 0x03ec540d, 0x00309ff0, 0x00135767}}}, + {X: Field{[10]uint32{0x02edf4c0, 0x00e8d4c6, 0x03ccb820, 0x02fc4035, 0x03943af3, 0x00df3f59, 0x02791eb0, 0x00ee3e79, 0x013471aa, 0x0013a996}}, Y: Field{[10]uint32{0x00b7b4c5, 0x004a6121, 0x02ca506c, 0x00d3222f, 0x03ded8a5, 0x03257a65, 0x00474035, 0x000b1160, 0x02c419a3, 0x003fbb66}}}, + {X: Field{[10]uint32{0x00c7a1ae, 0x02b09346, 0x01f7d4fa, 0x03cb2591, 0x007d7759, 0x0125fbaf, 0x0122150c, 0x01aa93a9, 0x028b5102, 0x0025d2e0}}, Y: Field{[10]uint32{0x03aa9d26, 0x0063fb53, 0x0109396d, 0x000ff2c1, 0x0165cd3a, 0x02a07c98, 0x026f344c, 0x01ccd895, 0x01a0c308, 0x00300da7}}}, + {X: Field{[10]uint32{0x00978186, 0x031c25a7, 0x01755529, 0x0113b475, 0x0299bb45, 0x033d16cd, 0x01c8ae93, 0x035e9653, 0x0379d572, 0x00366056}}, Y: Field{[10]uint32{0x035241fa, 0x038d62b9, 0x013ecd67, 0x036193b5, 0x035b6c20, 0x0023e99f, 0x00ea24f5, 0x006552b1, 0x02cbf518, 0x0027f3ae}}}, + {X: Field{[10]uint32{0x00368837, 0x00acc3ae, 0x02d38efd, 0x02f7e7da, 0x01478208, 0x03596ab0, 0x01506f1b, 0x03539f2f, 0x01970d9b, 0x00149c49}}, Y: Field{[10]uint32{0x033df18e, 0x008c98a2, 0x01d79aef, 0x03044b5b, 0x0068bbf0, 0x014da004, 0x00911d16, 0x03b2b668, 0x0196ba2c, 0x0014bb2a}}}, + {X: Field{[10]uint32{0x009abf6d, 0x01577a11, 0x018186af, 0x0278ae2b, 0x00ed2fc8, 0x022a3d3a, 0x030e1fee, 0x03d7e7bd, 0x01afd890, 0x0036508c}}, Y: Field{[10]uint32{0x019e2867, 0x01195248, 0x01e27e06, 0x03d23343, 0x0384278f, 0x00b61972, 0x03475fc3, 0x0248609c, 0x036ef078, 0x0009964a}}}, + {X: Field{[10]uint32{0x019a7d90, 0x00a2936a, 0x034bfe53, 0x02c1c534, 0x02b661f7, 0x01d8fae6, 0x03a99d4b, 0x036558ec, 0x02317a69, 0x00192144}}, Y: Field{[10]uint32{0x01d46bc6, 0x024828d4, 0x02fb4af4, 0x02cde048, 0x021e06d3, 0x028fa485, 0x02020885, 0x01038dbe, 0x02335150, 0x003ac82e}}}, + {X: Field{[10]uint32{0x0368a8c2, 0x00e0473b, 0x0021779c, 0x037c3b80, 0x0370df9e, 0x03018959, 0x03413a5f, 0x00bc5e63, 0x011bef66, 0x0034292c}}, Y: Field{[10]uint32{0x0170b9cd, 0x00a7dd37, 0x00dbe8b3, 0x018ffd35, 0x03748b7a, 0x02ace7ba, 0x00ef5c99, 0x01a5170e, 0x012018e1, 0x00352ee6}}}, + {X: Field{[10]uint32{0x005802b6, 0x001fc1a6, 0x0249b3dc, 0x00dcef54, 0x01dcf546, 0x032f5dac, 0x03e103dd, 0x0121a07e, 0x0086c4b2, 0x0007626e}}, Y: Field{[10]uint32{0x0369535d, 0x0024e7d8, 0x01f3030d, 0x01150af3, 0x02a7885a, 0x00e9c31a, 0x036056ba, 0x00415df8, 0x00caaacd, 0x0028ce73}}}, + {X: Field{[10]uint32{0x00dbb256, 0x01d72cb9, 0x036c010a, 0x008efac2, 0x039dbab2, 0x00e2e82d, 0x036682fa, 0x010f93c4, 0x01d59363, 0x002db3b3}}, Y: Field{[10]uint32{0x019f7be8, 0x0236c0cc, 0x01d583ba, 0x00ba090b, 0x025f77d1, 0x03604d99, 0x01a5d1fe, 0x021e896f, 0x005387dd, 0x000a4d70}}}, + {X: Field{[10]uint32{0x032f8e24, 0x02ba942f, 0x002c4028, 0x0244261a, 0x0040f1b4, 0x03d6065a, 0x00a6c5fb, 0x03611cd7, 0x00e0a0ca, 0x00212c91}}, Y: Field{[10]uint32{0x021f7a71, 0x0226b221, 0x021bad82, 0x018b6837, 0x03148c8e, 0x038e9762, 0x0313087e, 0x002c47d5, 0x028c7df8, 0x0018b8a3}}}, + {X: Field{[10]uint32{0x00114d1a, 0x037db073, 0x036d1638, 0x01650ffa, 0x01664331, 0x038ddf10, 0x00366102, 0x0200a0e5, 0x00ff2a90, 0x003e57b3}}, Y: Field{[10]uint32{0x0158eba2, 0x00e34af9, 0x039ca7de, 0x020586d3, 0x0256d16e, 0x022615bb, 0x011b9ea1, 0x001b36e3, 0x003f1a03, 0x002f436a}}}, + {X: Field{[10]uint32{0x010f55e3, 0x03bcc874, 0x0132727f, 0x00d79043, 0x032a1e63, 0x0268b748, 0x02ccd255, 0x00f792bc, 0x01fd3e61, 0x001f133b}}, Y: Field{[10]uint32{0x03d7b1d8, 0x030893b9, 0x026960cd, 0x01f504c1, 0x0111d482, 0x01ca9983, 0x017f73c6, 0x0014db1a, 0x0109d9d0, 0x000cc7c8}}}, + {X: Field{[10]uint32{0x00269713, 0x03dc80e8, 0x021c34b9, 0x019bb4c6, 0x02f88af8, 0x010d789d, 0x03918de0, 0x0360a792, 0x02381bf2, 0x0008d70b}}, Y: Field{[10]uint32{0x00dbf929, 0x00413be8, 0x03d0ff26, 0x00111803, 0x02815a13, 0x013aaa1e, 0x00486144, 0x0024bb9f, 0x030d2671, 0x00143737}}}, + {X: Field{[10]uint32{0x0207cd73, 0x00a1a0fa, 0x02923761, 0x021b1777, 0x000cdf26, 0x007128e2, 0x03ca488d, 0x0025d545, 0x00d09ab5, 0x000aa587}}, Y: Field{[10]uint32{0x0398abe5, 0x024efa48, 0x0152dd7f, 0x00bbb75d, 0x0384f84c, 0x01d951c8, 0x000f7fde, 0x011b48f3, 0x0076b2ee, 0x00217244}}}, + {X: Field{[10]uint32{0x00fd65e3, 0x023d0393, 0x01b51a62, 0x01d424f4, 0x03e00c47, 0x02fc60fd, 0x013f591c, 0x02e32e1c, 0x0091f0af, 0x002562f1}}, Y: Field{[10]uint32{0x009a65b3, 0x01431a82, 0x02eef92d, 0x01eaba3d, 0x01b2a09a, 0x03c1d868, 0x013e026a, 0x037f9244, 0x0339fa21, 0x002fd6f8}}}, + {X: Field{[10]uint32{0x015f78fd, 0x0196f60f, 0x0273ddc8, 0x03319093, 0x030adb5c, 0x01adfa54, 0x035a2e24, 0x01eafe67, 0x00a37b5b, 0x001ba583}}, Y: Field{[10]uint32{0x025e0e15, 0x0166cd5a, 0x01a81bd6, 0x02ca7335, 0x00dcc4b0, 0x0285bf32, 0x02df612e, 0x0190fd7c, 0x03d1d5e9, 0x0014eb52}}}, + {X: Field{[10]uint32{0x00d05871, 0x03b3a3fc, 0x01b5a8b2, 0x029e9237, 0x00e747e4, 0x036475aa, 0x01615257, 0x02eeb776, 0x020e9272, 0x0035eb24}}, Y: Field{[10]uint32{0x00c87ed8, 0x019b893c, 0x02dc4adf, 0x008186d9, 0x039d4c76, 0x00302630, 0x000b96d0, 0x02b178e3, 0x01fcc37b, 0x0018e06e}}}, + {X: Field{[10]uint32{0x01730609, 0x00754c57, 0x00078b6c, 0x00bfcb67, 0x024481c1, 0x02fa506b, 0x0123844e, 0x015c1bb0, 0x003b1de9, 0x00026c20}}, Y: Field{[10]uint32{0x033fb1b0, 0x00258a9a, 0x03ef2f5f, 0x02ec4f30, 0x005a5ff0, 0x0392e007, 0x002ed01f, 0x03f7f3ab, 0x03d6b12a, 0x0005833c}}}, + {X: Field{[10]uint32{0x00c5fd88, 0x0154ef29, 0x033ea689, 0x0027c08b, 0x02991bd5, 0x02e81085, 0x00e0153a, 0x03801a77, 0x006e5b74, 0x0017541d}}, Y: Field{[10]uint32{0x03259ff8, 0x018462da, 0x00e58927, 0x01bedbb4, 0x0299cb33, 0x00a724ad, 0x03a2e484, 0x012c6ef6, 0x005fd2a1, 0x002c3ec8}}}, + {X: Field{[10]uint32{0x00be04ff, 0x0006a17f, 0x02cf0bbd, 0x02af1a1b, 0x01ef4483, 0x0180230b, 0x03087483, 0x018a7249, 0x0269fa27, 0x00386f09}}, Y: Field{[10]uint32{0x00d95ecf, 0x0027e103, 0x00e783d4, 0x0124efb6, 0x0315e8b1, 0x02ce86ca, 0x033fd435, 0x00248585, 0x0371083c, 0x001bedeb}}}, + {X: Field{[10]uint32{0x00bfbf78, 0x003732f6, 0x017a2fe9, 0x00833dc0, 0x02f36ac6, 0x037e873c, 0x00519797, 0x024f6d03, 0x001cb5a8, 0x0033f242}}, Y: Field{[10]uint32{0x02a69ac2, 0x00a6b9a5, 0x01659b5f, 0x00695713, 0x00db321d, 0x026fe05f, 0x0377c15a, 0x00bf0cbc, 0x01235077, 0x0009aa23}}}, + {X: Field{[10]uint32{0x0229bb9b, 0x03677d08, 0x014b05fa, 0x01621163, 0x00cd8ad1, 0x0263b5e3, 0x021246db, 0x01a314e5, 0x009d12bd, 0x00015367}}, Y: Field{[10]uint32{0x021cbff6, 0x01275db7, 0x025eba45, 0x00161248, 0x00f8de70, 0x034cf5f5, 0x00c961fe, 0x0089658c, 0x00311dec, 0x002d7a5f}}}, + {X: Field{[10]uint32{0x03057dff, 0x02d694d0, 0x002e8d64, 0x02a987f9, 0x02bfb11e, 0x01cd71ec, 0x00f19248, 0x01986740, 0x02e67e9d, 0x0022a453}}, Y: Field{[10]uint32{0x03c040c8, 0x0046b0c6, 0x01b05a63, 0x011a8bd6, 0x0199c518, 0x00a9be94, 0x002f018c, 0x0369262f, 0x01da3374, 0x0006e478}}}, + {X: Field{[10]uint32{0x00240522, 0x02c16574, 0x03b030a0, 0x010bef48, 0x00aa2f4c, 0x026ac2ae, 0x0304fbae, 0x0077eaf1, 0x01773e64, 0x00352e04}}, Y: Field{[10]uint32{0x025cc726, 0x03ef8159, 0x007b8ce6, 0x00d405c4, 0x01cf2e68, 0x003d037c, 0x01bd3642, 0x02853d29, 0x023b1ea4, 0x002b0c33}}}, + {X: Field{[10]uint32{0x00780ba9, 0x00999c05, 0x02004362, 0x00b9cb83, 0x006f3c8e, 0x024927d9, 0x002c3517, 0x00d5f2ee, 0x0387c232, 0x002e0429}}, Y: Field{[10]uint32{0x018319e2, 0x036eec05, 0x02ef76a2, 0x00c3c6de, 0x034a422c, 0x02af2119, 0x02bac769, 0x0375fc85, 0x00341078, 0x00150d90}}}, + {X: Field{[10]uint32{0x0134a833, 0x01cb4ffd, 0x00e0d14e, 0x00b63b1f, 0x00d29c76, 0x00e9fbb4, 0x01691eac, 0x023bdc6b, 0x00cedc73, 0x0035c7e2}}, Y: Field{[10]uint32{0x00fbcd99, 0x0139c583, 0x02ad9d2a, 0x0052570e, 0x0197c1b5, 0x02d31449, 0x019d0d97, 0x02b6ba8b, 0x02831aaa, 0x00291f33}}}, + {X: Field{[10]uint32{0x01147ffc, 0x02675c5b, 0x0217496c, 0x00b331b1, 0x011ad709, 0x018b3978, 0x01d9d896, 0x018a384e, 0x031d4cac, 0x0005c33c}}, Y: Field{[10]uint32{0x006d77a5, 0x02977b33, 0x013a46f9, 0x03b9a549, 0x01adf6c4, 0x0377cc46, 0x01e8baaa, 0x03d61405, 0x0094e741, 0x0013ecee}}}, + {X: Field{[10]uint32{0x00c316af, 0x0269913b, 0x034d3172, 0x01250216, 0x03bfd48d, 0x032e6956, 0x00cbf66e, 0x017a00e3, 0x02a3b127, 0x00239da4}}, Y: Field{[10]uint32{0x00c504b1, 0x02ad501a, 0x0241134c, 0x029ae291, 0x024fc0bf, 0x0399aa46, 0x0100665c, 0x01497899, 0x01d3af07, 0x003cce70}}}, + {X: Field{[10]uint32{0x02ca891a, 0x032fbe92, 0x00d40a27, 0x01a79da1, 0x02a07ca8, 0x038addf3, 0x0047002e, 0x017a04cb, 0x03383dda, 0x001747fc}}, Y: Field{[10]uint32{0x035fbb8b, 0x0246006f, 0x039cf5b0, 0x00ce34a5, 0x02fe8438, 0x01d31145, 0x032e62e0, 0x032f6d9d, 0x03acb0de, 0x00286b6c}}}, + {X: Field{[10]uint32{0x002b8af7, 0x03fdbb0f, 0x003ebd75, 0x01717d50, 0x00375e1c, 0x00deb556, 0x032605da, 0x0319af77, 0x03dda9de, 0x003559b3}}, Y: Field{[10]uint32{0x019c78bd, 0x02b78398, 0x01ed8427, 0x035efedd, 0x00b6007b, 0x016a4293, 0x01598bb2, 0x01b6a5d0, 0x032c7858, 0x0004f888}}}, + {X: Field{[10]uint32{0x03d96493, 0x0265f40b, 0x01e33764, 0x03389271, 0x033cb85b, 0x02e7b8f6, 0x01ae74b2, 0x00ebc666, 0x00f9cc71, 0x0032f5c2}}, Y: Field{[10]uint32{0x004cb2cb, 0x03e499da, 0x026d655c, 0x02fdae01, 0x01c264f4, 0x02276376, 0x037a5af8, 0x02c2e24c, 0x016c4ca9, 0x003c0687}}}, + {X: Field{[10]uint32{0x00ed0fe2, 0x02d6e8fc, 0x013f4ad4, 0x02e3e241, 0x03e8d049, 0x014e003c, 0x020bea21, 0x01cf2208, 0x00e4e8ac, 0x003fb87b}}, Y: Field{[10]uint32{0x0226aad6, 0x015a8bba, 0x0154f53d, 0x02c2f6c2, 0x02f9763d, 0x033d0bda, 0x013354a7, 0x0019028d, 0x00ea17c8, 0x0026d482}}}, + {X: Field{[10]uint32{0x02ee843f, 0x0122f251, 0x01dbb79c, 0x00cc5305, 0x01db916f, 0x032cd6a3, 0x03a6c3af, 0x01214e35, 0x0266de44, 0x0031aabe}}, Y: Field{[10]uint32{0x01505b1b, 0x02bceff4, 0x01bfa7cd, 0x016cc2c4, 0x0234c49d, 0x029b893e, 0x001a7617, 0x0243def2, 0x02b67fc5, 0x00229871}}}, + {X: Field{[10]uint32{0x01aac415, 0x0199e076, 0x02f1e0a8, 0x03ffc017, 0x02dcbe21, 0x0199aef3, 0x018551e7, 0x007df922, 0x016083d9, 0x002b0d45}}, Y: Field{[10]uint32{0x0334483d, 0x01f59804, 0x014945ac, 0x002e369b, 0x03557741, 0x03bb2289, 0x00318fbe, 0x026beca3, 0x01977710, 0x0035c276}}}, + {X: Field{[10]uint32{0x01914e18, 0x01a3dc8f, 0x02ef9219, 0x00d25419, 0x017a212e, 0x00eb013d, 0x0055d199, 0x0092d205, 0x021607c0, 0x002a2709}}, Y: Field{[10]uint32{0x03a3c1ab, 0x00867b84, 0x02199ac8, 0x01a10cf7, 0x013569ce, 0x03b636ac, 0x01f092f5, 0x0219b1df, 0x02626127, 0x0015474d}}}, + {X: Field{[10]uint32{0x00a3f06b, 0x02202347, 0x02a3a72e, 0x016bf491, 0x02b045b9, 0x03ee458b, 0x00018d8c, 0x0267aba5, 0x031db584, 0x00265460}}, Y: Field{[10]uint32{0x01e4d773, 0x021ec5b6, 0x01188fd4, 0x02856c34, 0x0081696e, 0x02ce1202, 0x0027146f, 0x03e19f56, 0x02ecb9d5, 0x003f8e6b}}}, + {X: Field{[10]uint32{0x001fba96, 0x009a489a, 0x02e8c78d, 0x03a4df34, 0x028615e2, 0x007b3af1, 0x01be26c6, 0x01111e55, 0x03e01456, 0x002dc785}}, Y: Field{[10]uint32{0x03b9e3bf, 0x007142d8, 0x03dc4301, 0x02a7324a, 0x031a6c5b, 0x03bfa554, 0x023cb224, 0x02e32e57, 0x01f1d21f, 0x003af3f7}}}, + {X: Field{[10]uint32{0x01914074, 0x020fff05, 0x002c22d6, 0x03b5399d, 0x032fe89f, 0x030f52f2, 0x020ef6a1, 0x027fdb51, 0x001edbdd, 0x00385c3e}}, Y: Field{[10]uint32{0x0396e67f, 0x019f9caa, 0x014d2d6f, 0x03af1f7c, 0x03801fa7, 0x03dbe72b, 0x02206e3d, 0x0072b233, 0x00ee0f97, 0x0024fc44}}}, + {X: Field{[10]uint32{0x02c104f2, 0x01757207, 0x00c73acf, 0x02291f73, 0x014ac8dd, 0x007eaeec, 0x00f04eda, 0x0017157b, 0x0147318d, 0x0010c695}}, Y: Field{[10]uint32{0x03a779e7, 0x0022fcaf, 0x00dea6fd, 0x01c1d72a, 0x027a6f1f, 0x01f2a09e, 0x03a1f045, 0x0068d92b, 0x00ad7b14, 0x000f8c62}}}, + {X: Field{[10]uint32{0x02203394, 0x03ffb098, 0x01eec383, 0x0245fc2d, 0x013c1932, 0x007e032c, 0x0226ce4a, 0x01d48caf, 0x026ee158, 0x000a679a}}, Y: Field{[10]uint32{0x01301575, 0x00a9df81, 0x010c93bb, 0x0393b4de, 0x0123c9b3, 0x03002815, 0x008e8bf4, 0x028846ff, 0x00ed3ad4, 0x00176edc}}}, + {X: Field{[10]uint32{0x038934ee, 0x01e32730, 0x0359fb09, 0x026fa80a, 0x01bc99ac, 0x0079fe09, 0x03b5f786, 0x0221a6cb, 0x008ff2b5, 0x0019b6d2}}, Y: Field{[10]uint32{0x00ae6a5f, 0x01adcc3a, 0x0017fc31, 0x03bfac52, 0x006040e7, 0x03da19b1, 0x010e9972, 0x020fe02c, 0x0112b51c, 0x002addb8}}}, + {X: Field{[10]uint32{0x02274932, 0x02091f49, 0x002a1c3c, 0x02d7fb50, 0x0054c812, 0x022b56dc, 0x03912fa7, 0x00354aec, 0x016b6698, 0x00049661}}, Y: Field{[10]uint32{0x02150383, 0x011631fc, 0x03c2245d, 0x02ee1c31, 0x02d70dfc, 0x015a06f0, 0x03e0557d, 0x02571fb7, 0x013fc678, 0x003ab5f3}}}, + {X: Field{[10]uint32{0x01f1cf00, 0x01d177ff, 0x02cf9102, 0x0233bfaf, 0x00426996, 0x03494b1f, 0x025272fd, 0x03cf732a, 0x0214cbb0, 0x00140b21}}, Y: Field{[10]uint32{0x03c53c3c, 0x0242654e, 0x0154c10b, 0x0001921c, 0x001b2f45, 0x01abc28e, 0x01d06951, 0x038d5bf6, 0x028807e4, 0x001c46f1}}}, + {X: Field{[10]uint32{0x02a8d6fd, 0x026f31c2, 0x00c42224, 0x03b05f00, 0x01f43acd, 0x01edadff, 0x01c10734, 0x01900fda, 0x013c323c, 0x00381446}}, Y: Field{[10]uint32{0x02560455, 0x0045f8e2, 0x039f1c85, 0x02c61fe2, 0x00c574d9, 0x0097098c, 0x011d2bcf, 0x023b985b, 0x0271ce42, 0x000840b0}}}, + {X: Field{[10]uint32{0x01f1dc46, 0x0381d06b, 0x02cb800a, 0x0162d4e2, 0x030abe7c, 0x030ecdf9, 0x03d90c15, 0x0234c8a7, 0x03ae0d76, 0x0032461e}}, Y: Field{[10]uint32{0x01c92c0f, 0x011ccd62, 0x000f8d75, 0x0373c9ff, 0x015714f6, 0x0056b0a7, 0x03d02526, 0x02e92865, 0x0043f9eb, 0x00304c35}}}, + {X: Field{[10]uint32{0x010fe897, 0x03b2367a, 0x017a16ea, 0x03513a0a, 0x0123dba4, 0x031ac190, 0x003ae701, 0x02cfb8ac, 0x027eb9f3, 0x0016c215}}, Y: Field{[10]uint32{0x010c27c9, 0x006a61ea, 0x02d92aa8, 0x012dd43f, 0x03914d4b, 0x03a3d32e, 0x02e9c726, 0x03246b37, 0x00159079, 0x002b41c7}}}, + {X: Field{[10]uint32{0x003ba7cc, 0x03d2946d, 0x0286f839, 0x015343aa, 0x038a9cc5, 0x0189a46a, 0x0306a26d, 0x01ea1b3e, 0x008ac581, 0x002b96d9}}, Y: Field{[10]uint32{0x032db311, 0x03a49750, 0x019830d5, 0x004a9bfa, 0x0166e752, 0x0285f18a, 0x00a48c3d, 0x0308aaac, 0x030db665, 0x0007aa2a}}}, + {X: Field{[10]uint32{0x010178d2, 0x00085222, 0x038f0421, 0x034c9f95, 0x0004f2e0, 0x03326aed, 0x02ea5c5c, 0x0215b663, 0x00d0a092, 0x000ee6eb}}, Y: Field{[10]uint32{0x01bd5052, 0x031977c8, 0x024911fd, 0x011fc606, 0x00b79be4, 0x02a4a6b8, 0x03628d7e, 0x02e8715e, 0x008e9603, 0x002da07a}}}, + {X: Field{[10]uint32{0x0259fef4, 0x0016a191, 0x02d7ee8d, 0x01e8707d, 0x03f6dfbf, 0x0179056a, 0x022f8279, 0x019b6b54, 0x0180a740, 0x0014937d}}, Y: Field{[10]uint32{0x0252f35f, 0x02ae9c89, 0x039c1ed2, 0x03e78d62, 0x019c72c5, 0x034c0bbc, 0x03c210ca, 0x0307869b, 0x03285f3b, 0x000feb31}}}, + {X: Field{[10]uint32{0x010e4363, 0x034c2751, 0x00cdff6e, 0x03a9ff1c, 0x01599a34, 0x01202e1d, 0x0109a383, 0x01d7121f, 0x03f2ade7, 0x000b818d}}, Y: Field{[10]uint32{0x0364738e, 0x0228283d, 0x023696da, 0x03bab69c, 0x031aafb7, 0x012b557c, 0x038e903e, 0x01392731, 0x03087e2f, 0x0038f1ba}}}, + {X: Field{[10]uint32{0x020cc483, 0x0184c2ea, 0x0364bbda, 0x00a089bd, 0x033f7857, 0x021ee509, 0x013fb335, 0x02f4ef90, 0x02adbeaf, 0x003dffb1}}, Y: Field{[10]uint32{0x0208c68d, 0x014c7467, 0x00544c66, 0x00eb967f, 0x03dd4209, 0x018ee5da, 0x00fefd8e, 0x015f1ff2, 0x01748eb4, 0x003d91aa}}}, + {X: Field{[10]uint32{0x023608be, 0x0362f122, 0x0229929a, 0x025d3609, 0x00cd6eb4, 0x03624b72, 0x02c95b12, 0x01310cad, 0x00e06af6, 0x001d7e53}}, Y: Field{[10]uint32{0x01958a29, 0x0221deec, 0x026c622e, 0x0248b1ef, 0x026e32c8, 0x007b001d, 0x0316b322, 0x0241a9a4, 0x02d0a2b7, 0x002fe1c5}}}, + {X: Field{[10]uint32{0x03fb4d85, 0x0370733c, 0x0104331b, 0x03a74c04, 0x00f62e07, 0x0321a424, 0x00f039fc, 0x03cf2c31, 0x02de5e0d, 0x001040a5}}, Y: Field{[10]uint32{0x03fecfa0, 0x03dcbb4f, 0x0396c383, 0x01ff2187, 0x02da7426, 0x018996e0, 0x00a82ff8, 0x03765aae, 0x039ca314, 0x003a58d5}}}, + {X: Field{[10]uint32{0x033ffa05, 0x03ff8035, 0x03b23cbd, 0x02605b3e, 0x0369b4e6, 0x025f699e, 0x03c1703d, 0x0385acbd, 0x02ac05f5, 0x00332093}}, Y: Field{[10]uint32{0x013e8abb, 0x03c428cd, 0x02aa8b8c, 0x006a4abe, 0x03d18c6f, 0x01f1e203, 0x00582182, 0x013be577, 0x01a69f41, 0x0005f0c3}}}, + {X: Field{[10]uint32{0x026e5820, 0x03fc44df, 0x00d03a83, 0x0193e976, 0x03d2074b, 0x00c5dc1d, 0x00f0b3fd, 0x03b6335e, 0x00ef4d26, 0x002b306c}}, Y: Field{[10]uint32{0x003ce6c3, 0x01432367, 0x04000111, 0x03405a79, 0x014fcd24, 0x03e3efbb, 0x01d2a804, 0x02ba4406, 0x00c68519, 0x001b3391}}}, + {X: Field{[10]uint32{0x010da922, 0x03f1c6f2, 0x038257c2, 0x0238c61d, 0x01583c2b, 0x00c62e48, 0x034bccf4, 0x00766c1d, 0x036eccce, 0x00072cc1}}, Y: Field{[10]uint32{0x00e373cc, 0x021d2393, 0x03b04c62, 0x03cb3c96, 0x02a6372d, 0x03b37168, 0x0217dfd3, 0x0181760a, 0x036c0058, 0x000a8bc9}}}, + {X: Field{[10]uint32{0x00fe13f2, 0x02096aa1, 0x039783d5, 0x0085e8e2, 0x008cb3a5, 0x02796900, 0x03ea9750, 0x03d26d61, 0x00512a22, 0x001bbf69}}, Y: Field{[10]uint32{0x038e2424, 0x0251d621, 0x0103954a, 0x03f6f2f5, 0x0360673c, 0x03968a96, 0x032a54ad, 0x00becc7f, 0x02d56dfe, 0x00047513}}}, + {X: Field{[10]uint32{0x01bf0858, 0x00c30ee7, 0x01cdd51b, 0x03345f7a, 0x02e2fcf1, 0x02a3f665, 0x00931ecd, 0x00de2d73, 0x0219aef4, 0x0011fda5}}, Y: Field{[10]uint32{0x00b5e274, 0x0242251f, 0x03ee9bf8, 0x022b0cea, 0x020d2fa2, 0x0135c359, 0x0057af2a, 0x038f5b69, 0x02a19776, 0x00052555}}}, + {X: Field{[10]uint32{0x014d28e4, 0x0120cd5e, 0x00d4f8ff, 0x02f0691f, 0x028b2eae, 0x00e86789, 0x01032c51, 0x0375754e, 0x021e97f5, 0x00374f63}}, Y: Field{[10]uint32{0x00467e83, 0x03e7aa93, 0x029c2e0f, 0x02ec0d2f, 0x030c2233, 0x020bafcc, 0x033d7c63, 0x02a0eaa5, 0x000020f6, 0x001e5a2f}}}, + {X: Field{[10]uint32{0x01e16d78, 0x02b4ad99, 0x01f9197a, 0x02dd414d, 0x027de2a2, 0x00f2d2cc, 0x015737cd, 0x00e9b2f9, 0x00eea19d, 0x000af515}}, Y: Field{[10]uint32{0x029f7f99, 0x03c7f5c4, 0x037549c1, 0x01221f8f, 0x039f7c62, 0x02b503fa, 0x0271c667, 0x009e3cd0, 0x00f0d6a1, 0x00029c2c}}}, + {X: Field{[10]uint32{0x035a5ee0, 0x00cc6103, 0x02d91047, 0x037c4eb0, 0x02915462, 0x02899e13, 0x02035b29, 0x01d2d136, 0x01bb2a7e, 0x00233f9d}}, Y: Field{[10]uint32{0x0207cd1e, 0x03cb8919, 0x01ca1eef, 0x0289ff6b, 0x00b65c2d, 0x02491550, 0x02226d1c, 0x01f2193d, 0x0056bdc8, 0x001923ff}}}, + {X: Field{[10]uint32{0x01724d36, 0x02cc9559, 0x02f6e665, 0x01a13c44, 0x005e046a, 0x012d5ef2, 0x03dab832, 0x018b2f0b, 0x00ae19c4, 0x0017bfcd}}, Y: Field{[10]uint32{0x004d68a4, 0x03378568, 0x026b0ccf, 0x020d1f1a, 0x01d551e7, 0x00b80414, 0x0289629d, 0x011fff08, 0x01bb9db3, 0x000663ed}}}, + {X: Field{[10]uint32{0x00f92b91, 0x0198e7de, 0x02a61042, 0x02e07c62, 0x00a2c51b, 0x01d8c5dd, 0x02db6244, 0x00ec238d, 0x0154f367, 0x0026a951}}, Y: Field{[10]uint32{0x01384806, 0x0235e118, 0x006fa75c, 0x01197c97, 0x011d167b, 0x01cad42f, 0x0222faf2, 0x01d0134b, 0x03ad4a6e, 0x0021d128}}}, + {X: Field{[10]uint32{0x03f259e0, 0x032d4e97, 0x0165a955, 0x02a2e75d, 0x03ac88a2, 0x037c1bae, 0x007463c5, 0x0165c37f, 0x01758cfb, 0x0012e0dd}}, Y: Field{[10]uint32{0x028df208, 0x0069793e, 0x02aa9917, 0x01aaadea, 0x02ed7076, 0x0048cf7d, 0x0074396a, 0x0294fdb9, 0x0142bda1, 0x0021d647}}}, + {X: Field{[10]uint32{0x02428bb1, 0x03317bdd, 0x00428226, 0x009615cd, 0x03c49dc7, 0x01671f3b, 0x03f5a579, 0x03e4399c, 0x00b49134, 0x001752dd}}, Y: Field{[10]uint32{0x02d89425, 0x001e83ef, 0x03cfcb1f, 0x02efc670, 0x00cdc2f6, 0x00036368, 0x026bf3f1, 0x03b856af, 0x0110f466, 0x0006caa2}}}, + {X: Field{[10]uint32{0x03cad2d8, 0x00a8c255, 0x002b2570, 0x0105eae7, 0x002d4754, 0x018bb9a0, 0x013bafaf, 0x01133976, 0x02c0c552, 0x003542f8}}, Y: Field{[10]uint32{0x0162f583, 0x00735700, 0x0144ef24, 0x03c82f11, 0x005a4dc0, 0x03aa9779, 0x01854617, 0x026ad300, 0x024c6ee8, 0x003f881f}}}, + {X: Field{[10]uint32{0x0075bff1, 0x0280d384, 0x032e9a1d, 0x03c505b6, 0x02f93bbf, 0x02fe616a, 0x02489155, 0x02ce1193, 0x01ce8e0e, 0x002ec3d8}}, Y: Field{[10]uint32{0x037b7d0e, 0x03dbefed, 0x00412631, 0x0184c51d, 0x034e6b05, 0x02f2c23b, 0x02a1032c, 0x02c37cc3, 0x03152dde, 0x000004e9}}}, + {X: Field{[10]uint32{0x01dcb2f5, 0x00cafe13, 0x03d22886, 0x02785366, 0x0263e22b, 0x00bf17be, 0x00e41fb2, 0x0006c85c, 0x01db473f, 0x000f39af}}, Y: Field{[10]uint32{0x00e0922e, 0x01e896ab, 0x01edf8d4, 0x023c6eb0, 0x029a8426, 0x0043714b, 0x02b73081, 0x034a6109, 0x0057f4b3, 0x0010c218}}}, + {X: Field{[10]uint32{0x038f81aa, 0x01d182ec, 0x03c85bd3, 0x03c695b0, 0x02bbcbbf, 0x01f36dd7, 0x00b5490c, 0x0202ff24, 0x014aef16, 0x003ff7ec}}, Y: Field{[10]uint32{0x02f4af0d, 0x005bb87a, 0x00a547c2, 0x031ceef3, 0x0124f228, 0x02522d69, 0x02880d0e, 0x03c6788c, 0x01ef02f1, 0x003cc117}}}, + {X: Field{[10]uint32{0x0223172c, 0x03e93020, 0x000fed59, 0x000941eb, 0x02c828d1, 0x008cc2bb, 0x026eb60a, 0x00993604, 0x02e19ab4, 0x0006b07c}}, Y: Field{[10]uint32{0x00e18bf8, 0x03c64db6, 0x027f5133, 0x018e06d3, 0x02d8fae0, 0x020363c0, 0x015e3a8f, 0x021abec8, 0x00bc3394, 0x001d8da9}}}, + {X: Field{[10]uint32{0x01ec228e, 0x01987b2b, 0x009a22d6, 0x02d81f9b, 0x01b1a1a6, 0x0083c8ce, 0x002957aa, 0x03a26985, 0x000a0740, 0x001494d3}}, Y: Field{[10]uint32{0x0261b669, 0x02a5f3cc, 0x022f1365, 0x00d6ba00, 0x02e1a318, 0x02213ebe, 0x02c2fa5d, 0x03226707, 0x02bafe41, 0x0033dbf9}}}, + {X: Field{[10]uint32{0x011b09eb, 0x03d91899, 0x0278d5b9, 0x00b25928, 0x0104f36f, 0x00df4cac, 0x00dccd61, 0x00b0b1e3, 0x02857cd2, 0x00102480}}, Y: Field{[10]uint32{0x01031d0d, 0x0384b10b, 0x025fb3bd, 0x023ae2a1, 0x01f6b773, 0x013c5824, 0x01fef1bf, 0x00f8fd9b, 0x0373a5fa, 0x00103253}}}, + {X: Field{[10]uint32{0x03029289, 0x006f1466, 0x019e70c8, 0x030901a7, 0x0225a5b3, 0x021036c5, 0x02ac6e4e, 0x0336c852, 0x00334b9c, 0x0022c74f}}, Y: Field{[10]uint32{0x0223e853, 0x035b6d57, 0x006e5630, 0x027c517e, 0x03802076, 0x01e0889d, 0x01658985, 0x0256647f, 0x00642acf, 0x000453f5}}}, + {X: Field{[10]uint32{0x00a242bd, 0x01ce5e7d, 0x020fd7e4, 0x0398f4d1, 0x008a6055, 0x019058b7, 0x006bbd20, 0x03c4e967, 0x0260b7c7, 0x002b8537}}, Y: Field{[10]uint32{0x0065a412, 0x031a8f93, 0x00ef16ca, 0x039ebe80, 0x03afccfe, 0x01dbc844, 0x00463e23, 0x028cce85, 0x0089cdb5, 0x0022e581}}}, + {X: Field{[10]uint32{0x02d3e3d7, 0x020e1b8b, 0x02420078, 0x01204df7, 0x03b81539, 0x037f76eb, 0x00d4e395, 0x0179b0fa, 0x004099c9, 0x003cdfc7}}, Y: Field{[10]uint32{0x03fb3606, 0x003028ec, 0x01af5031, 0x004413d4, 0x030a5644, 0x033dd95d, 0x0283d769, 0x02b4d2c8, 0x008082f6, 0x0007ca40}}}, + {X: Field{[10]uint32{0x03017a84, 0x00fb2c86, 0x005dfaa5, 0x00cd99b4, 0x00a13f89, 0x030925af, 0x0041c1d3, 0x022270d1, 0x03ae9636, 0x0007ec1f}}, Y: Field{[10]uint32{0x037753c0, 0x03e32718, 0x03cb7b8d, 0x011bea5f, 0x0358e6da, 0x01ffd546, 0x0368934b, 0x015dab12, 0x01c93931, 0x0004a062}}}, + {X: Field{[10]uint32{0x0015f3cc, 0x0365ca12, 0x0371552b, 0x0087435a, 0x032afb07, 0x02e88ae9, 0x00ea2b51, 0x03b3b520, 0x0354e112, 0x0011347a}}, Y: Field{[10]uint32{0x02ed7043, 0x02a6cabc, 0x0288e3c3, 0x02df56db, 0x02ea1855, 0x035e4e3e, 0x0273e02e, 0x0149bc49, 0x0328574c, 0x0029b84e}}}, + {X: Field{[10]uint32{0x0103238e, 0x02559168, 0x03cbfd87, 0x0229d669, 0x00ec9491, 0x01dbdef4, 0x02311cff, 0x02e1d5ff, 0x032e5732, 0x001a6025}}, Y: Field{[10]uint32{0x03d26a5e, 0x03ac18d8, 0x03c262d2, 0x03385f16, 0x02ac4a0f, 0x024be826, 0x0376b24a, 0x02450c85, 0x00324ffb, 0x001ee7fa}}}, + {X: Field{[10]uint32{0x00efcfa3, 0x00c09554, 0x0379bf70, 0x018a7616, 0x01a8566a, 0x03d901a8, 0x019639c4, 0x02c79379, 0x009d405b, 0x001a8ea3}}, Y: Field{[10]uint32{0x02c038ba, 0x023799b2, 0x0124d0ce, 0x03ae7546, 0x002e0f59, 0x025ad1e9, 0x01b408e1, 0x03412a3f, 0x02e87b22, 0x000fa2ae}}}, + {X: Field{[10]uint32{0x0012ed0b, 0x00e42d91, 0x036831da, 0x013251b0, 0x03bfb680, 0x02f3e809, 0x01844c4d, 0x01192afd, 0x00d41598, 0x003fcc42}}, Y: Field{[10]uint32{0x03d0a317, 0x01cb51f2, 0x03515dc0, 0x03408672, 0x0011f5d4, 0x01c15192, 0x02abe857, 0x03422571, 0x01e33ee1, 0x00201559}}}, + {X: Field{[10]uint32{0x01517d73, 0x024c93a5, 0x011bb213, 0x01406012, 0x03499727, 0x00d772d6, 0x0134e533, 0x0126acf8, 0x036a2f85, 0x0003b93d}}, Y: Field{[10]uint32{0x0071a838, 0x0204125c, 0x0075c8fe, 0x01f628a4, 0x03830736, 0x032509d9, 0x0189e899, 0x00ac45a2, 0x01672240, 0x001af640}}}, + {X: Field{[10]uint32{0x0053e0a4, 0x023d4693, 0x01966ac7, 0x00163342, 0x00230c63, 0x032eae83, 0x023b7205, 0x02563cda, 0x01cb01ca, 0x0030845d}}, Y: Field{[10]uint32{0x0072bf51, 0x008da233, 0x02a44ea9, 0x03acbff9, 0x01585a02, 0x03021760, 0x02a0ecd2, 0x0282bc95, 0x03a67a7c, 0x001a8860}}}, + {X: Field{[10]uint32{0x0237d6fc, 0x0272fce6, 0x01292c40, 0x030317cb, 0x03953141, 0x01f2ae46, 0x0246e39e, 0x02ce60d3, 0x0008a9a0, 0x000b5793}}, Y: Field{[10]uint32{0x01c6e15e, 0x0190119d, 0x03054d61, 0x0087713b, 0x004b5127, 0x024017b4, 0x0234f37e, 0x00c7e824, 0x01c531a3, 0x001d5a6e}}}, + {X: Field{[10]uint32{0x0315dbc3, 0x030a932e, 0x01c26ef7, 0x019dade6, 0x015d573b, 0x00c5d97c, 0x00124086, 0x03ac2730, 0x0041bfbb, 0x0018c0b0}}, Y: Field{[10]uint32{0x02491025, 0x02bc209f, 0x0063f915, 0x02201279, 0x01a1e514, 0x0024cba4, 0x00ddfedd, 0x010a82b1, 0x020f67ce, 0x000caa3c}}}, + {X: Field{[10]uint32{0x01934e2d, 0x00d98481, 0x0308ca3b, 0x0330b7aa, 0x005b6c67, 0x027be6e5, 0x01c9cfb8, 0x03823bdf, 0x016c198d, 0x000f9854}}, Y: Field{[10]uint32{0x037520d9, 0x01b818c0, 0x00dbee95, 0x03b41239, 0x005692f3, 0x003d89e1, 0x03849447, 0x01c413dd, 0x03f74d5f, 0x0007bfee}}}, + {X: Field{[10]uint32{0x0142fe30, 0x02ac2bb9, 0x005a7d8a, 0x0064422c, 0x01b89892, 0x03ccc148, 0x0335a378, 0x00d3492a, 0x02b2d7d1, 0x0028022e}}, Y: Field{[10]uint32{0x01b475a1, 0x027f8c54, 0x01de6be0, 0x03aa0ae6, 0x03f5454a, 0x02701790, 0x03ec2fde, 0x001b9518, 0x03ec903c, 0x001de8dd}}}, + {X: Field{[10]uint32{0x0224005f, 0x02645fa9, 0x022f8c38, 0x019c05bc, 0x03287114, 0x00b90c05, 0x00f42b80, 0x0258aa54, 0x0348b928, 0x001de0bf}}, Y: Field{[10]uint32{0x03608c15, 0x0322263e, 0x03c18c78, 0x033d6c8a, 0x008ad2c9, 0x026ebf8c, 0x01b766db, 0x00f832b4, 0x024938a0, 0x001e3c8f}}}, + {X: Field{[10]uint32{0x03ddcfc2, 0x019dbe09, 0x03c20d20, 0x01c633fb, 0x02f6ffbe, 0x03225bba, 0x0019d648, 0x02d13f44, 0x0278c26a, 0x0008ced2}}, Y: Field{[10]uint32{0x033b655c, 0x00fb679d, 0x037b518f, 0x0108b825, 0x01f553d3, 0x020a1337, 0x03ddc1a4, 0x037e4121, 0x0036d976, 0x00379421}}}, + {X: Field{[10]uint32{0x01b8bb0e, 0x0177831c, 0x02a0792c, 0x008ca57c, 0x023f7a46, 0x03630cd0, 0x03d7aed2, 0x03524f60, 0x022906ee, 0x0020052a}}, Y: Field{[10]uint32{0x03583d92, 0x01b75543, 0x02444f3e, 0x02be0687, 0x01695f39, 0x0215aa78, 0x030caba4, 0x02f26c45, 0x029df2a5, 0x0037161c}}}, + {X: Field{[10]uint32{0x03bbdfce, 0x012ad676, 0x012c1b28, 0x03abafab, 0x0060882a, 0x02f18723, 0x03050ce7, 0x02b9c46e, 0x010b233d, 0x0022807a}}, Y: Field{[10]uint32{0x0291fdb0, 0x0376eb5d, 0x01cf4ca4, 0x03bc8294, 0x03b34b72, 0x00b2569d, 0x0006cc41, 0x01a4fa4b, 0x035dc9e3, 0x001603b5}}}, + {X: Field{[10]uint32{0x02e733b4, 0x02e48c86, 0x011a44cb, 0x006825af, 0x03a56988, 0x020ae81f, 0x026372d5, 0x024561c3, 0x034924a2, 0x00014288}}, Y: Field{[10]uint32{0x038cc751, 0x02af3699, 0x03cde3ed, 0x0038bdf3, 0x03aa21d0, 0x0111bf38, 0x01d8e2fa, 0x0007529e, 0x0220a977, 0x001a50f0}}}, + {X: Field{[10]uint32{0x02aa6d83, 0x00821ebb, 0x015cecbd, 0x01b6a299, 0x02b51b8f, 0x0209903b, 0x0307bd61, 0x01d13dea, 0x03578c96, 0x0032fd24}}, Y: Field{[10]uint32{0x028d4bf0, 0x03c1f13b, 0x011d5e75, 0x02961f41, 0x0129e79f, 0x01212813, 0x00bdb1c9, 0x036e6501, 0x02f45711, 0x001346cd}}}, + {X: Field{[10]uint32{0x028efe38, 0x026e9c62, 0x03d89ad5, 0x007fe93a, 0x007c63d1, 0x00a2cc76, 0x0164c2e8, 0x034a5a34, 0x0175e4ed, 0x001cdecf}}, Y: Field{[10]uint32{0x01f31586, 0x0208ad4d, 0x03439e7c, 0x01b74e1d, 0x02ff1ebf, 0x03720c9e, 0x027002ee, 0x03945514, 0x03a18aa8, 0x003b1fde}}}, + {X: Field{[10]uint32{0x0038813a, 0x008bff2b, 0x00b8bb7e, 0x03166aaa, 0x028812e0, 0x035ed105, 0x03f46d69, 0x00e6b9b1, 0x00642519, 0x000a72ca}}, Y: Field{[10]uint32{0x00a2e6e9, 0x02edcebb, 0x038f0528, 0x01477af4, 0x03b5f1eb, 0x01043fc6, 0x02d77c8b, 0x02cb1725, 0x000a7c98, 0x0030fb0a}}}, + {X: Field{[10]uint32{0x0228fe9d, 0x01653f17, 0x01d352c9, 0x015091d0, 0x03f36689, 0x0065e553, 0x00dffa25, 0x00bef791, 0x02592428, 0x0006162a}}, Y: Field{[10]uint32{0x02d4bd46, 0x03b0a074, 0x0248596f, 0x03512f9d, 0x00be50b1, 0x01f92ad3, 0x03d7879a, 0x027eae7e, 0x01d6b0a6, 0x00283a24}}}, + {X: Field{[10]uint32{0x022eb75c, 0x03a45d21, 0x004fc2a9, 0x02374d1b, 0x0126c137, 0x013c24ba, 0x03ae314d, 0x003abd9e, 0x00581a42, 0x001cb39f}}, Y: Field{[10]uint32{0x0025ae1c, 0x012f781d, 0x02ff3628, 0x007fdd18, 0x038bec12, 0x002162ee, 0x02236ae3, 0x00f833db, 0x037a5a9c, 0x0008ca45}}}, + {X: Field{[10]uint32{0x03112903, 0x035bd1ab, 0x0031517b, 0x02f403b3, 0x00a3f9dc, 0x02777e6f, 0x03dcb830, 0x02db492a, 0x025e5dfa, 0x000d3072}}, Y: Field{[10]uint32{0x02a1f803, 0x02a01ec8, 0x021a27ac, 0x0093ad26, 0x0080088a, 0x02962682, 0x03c4aeb6, 0x03325c0d, 0x02adc931, 0x0024fdbf}}}, + {X: Field{[10]uint32{0x00392c36, 0x02e83749, 0x02243284, 0x011e7389, 0x028d348b, 0x03b8f59d, 0x003100cc, 0x01619fe0, 0x004a80af, 0x0001f16b}}, Y: Field{[10]uint32{0x02fc5828, 0x003a9019, 0x01b86337, 0x03faad61, 0x00a3201c, 0x03a9eae1, 0x03db23d1, 0x03991cc7, 0x0164903b, 0x002911a2}}}, + {X: Field{[10]uint32{0x00363caa, 0x012dfb13, 0x00b35e59, 0x00f69d1b, 0x010b57bf, 0x01a0ffdf, 0x018851c8, 0x01dca06a, 0x0113244c, 0x002f8b77}}, Y: Field{[10]uint32{0x02580fa2, 0x0391648f, 0x01f257df, 0x02151e56, 0x018c45ea, 0x02f1ee99, 0x033e5b92, 0x028b3c73, 0x01390af8, 0x002b6dd6}}}, + {X: Field{[10]uint32{0x02c13806, 0x0285d923, 0x039b7901, 0x00ae0665, 0x037f7b22, 0x018b7f67, 0x0244471d, 0x03bf7292, 0x036a3b3b, 0x001b7b87}}, Y: Field{[10]uint32{0x002e5651, 0x02e66657, 0x01ab6af3, 0x00c43d90, 0x021a9a24, 0x02c04c48, 0x000356ce, 0x03dbffe3, 0x01014fa5, 0x001767a1}}}, + {X: Field{[10]uint32{0x01e68c19, 0x039bf9e7, 0x03c3180e, 0x01afdaeb, 0x02c76438, 0x01ec4544, 0x00355b3a, 0x023b5d24, 0x00e68e2c, 0x00057c99}}, Y: Field{[10]uint32{0x00326aba, 0x00fe315c, 0x0374eddf, 0x02ae9daa, 0x03c41291, 0x01c73ca6, 0x01053fd3, 0x03d023be, 0x0126302b, 0x002415d3}}}, + {X: Field{[10]uint32{0x029c91a3, 0x026017af, 0x036660df, 0x01ec60fc, 0x016d4c5e, 0x02a61323, 0x0192b785, 0x022433a9, 0x03e904cc, 0x000f5f3e}}, Y: Field{[10]uint32{0x03f62808, 0x01f7f979, 0x00d12682, 0x01239d8c, 0x0042b30b, 0x01aa12d5, 0x0351694f, 0x00196be3, 0x01d44ea7, 0x00355737}}}, + {X: Field{[10]uint32{0x003a1e10, 0x00773667, 0x02e1445b, 0x02c1ffaf, 0x011ec637, 0x0125c480, 0x035dd3e7, 0x014771ea, 0x03f90d79, 0x00150e22}}, Y: Field{[10]uint32{0x02e5a547, 0x03bfd52a, 0x03dcf6fb, 0x030aa75b, 0x03725f99, 0x03d58348, 0x008738b3, 0x00a97e6f, 0x038825dc, 0x0005ecd9}}}, + {X: Field{[10]uint32{0x02088313, 0x03c065da, 0x03c94be5, 0x03154818, 0x00425327, 0x024a05e5, 0x00a0d2cc, 0x02029652, 0x03dd9a00, 0x000f08a7}}, Y: Field{[10]uint32{0x02926a1c, 0x036ee34a, 0x01d8d3a8, 0x01c7fb48, 0x01192f0a, 0x00dcf141, 0x0083d12c, 0x020ed2be, 0x0395a84f, 0x000d25d5}}}, + {X: Field{[10]uint32{0x03c63210, 0x00149c49, 0x02b26157, 0x0138dbc6, 0x011974e7, 0x03ea35eb, 0x0291f368, 0x01669b85, 0x036ee146, 0x002d84ae}}, Y: Field{[10]uint32{0x00df5bb4, 0x0181cb29, 0x00dc223b, 0x005fa382, 0x02052408, 0x0357a3aa, 0x0077733d, 0x0337c7e5, 0x005dd623, 0x00016523}}}, + {X: Field{[10]uint32{0x0305f613, 0x037bf81e, 0x03d64d2e, 0x0108bbec, 0x03ae381e, 0x024038ce, 0x0341ed3e, 0x003750a0, 0x01855447, 0x003b15b9}}, Y: Field{[10]uint32{0x015e9c45, 0x03d9b3ca, 0x016d9df8, 0x00334ec5, 0x0286effe, 0x01e2f39d, 0x03f2bd65, 0x038c237f, 0x0151acf6, 0x003b35fc}}}, + {X: Field{[10]uint32{0x0011f80d, 0x039d23ff, 0x0308f25e, 0x02bf9353, 0x02a565ee, 0x026c56c9, 0x000c8baf, 0x027e3ef6, 0x03ca85ff, 0x00006fbc}}, Y: Field{[10]uint32{0x012914f9, 0x0315a0fe, 0x03135272, 0x002b7a22, 0x01125f0a, 0x006f2262, 0x014b8927, 0x0125ee86, 0x00bb96be, 0x003f8098}}}, + {X: Field{[10]uint32{0x0107c20a, 0x0020fa64, 0x0325168a, 0x03968bae, 0x010c4b27, 0x034afd2b, 0x00e42653, 0x01a38aa4, 0x004a522b, 0x0006f6eb}}, Y: Field{[10]uint32{0x00d63ea1, 0x00a10e54, 0x03a9e3d2, 0x009c38fe, 0x025b09e1, 0x00ba2c81, 0x00467b9d, 0x01fe8004, 0x03263ede, 0x00135838}}}, + {X: Field{[10]uint32{0x0262fc84, 0x027aab4d, 0x038373bd, 0x01ffa252, 0x026e601b, 0x02cb0b08, 0x01e0f8b1, 0x02e36954, 0x039a567a, 0x003a40cb}}, Y: Field{[10]uint32{0x00eb70e9, 0x00c65b5d, 0x0400064e, 0x0252372c, 0x0121d609, 0x02bf783c, 0x00b0a49d, 0x006bce83, 0x03e647d2, 0x0002b158}}}, + {X: Field{[10]uint32{0x00f79c75, 0x0241f0c2, 0x011a9fda, 0x03af2281, 0x03a9608d, 0x015b8d19, 0x0108044f, 0x03dd2295, 0x02ec044a, 0x001f39d1}}, Y: Field{[10]uint32{0x02aa426a, 0x0103f57c, 0x017d5406, 0x02814beb, 0x012c6b8f, 0x01bcf006, 0x03bbb804, 0x02f48ef9, 0x01c13166, 0x0023c21e}}}, + {X: Field{[10]uint32{0x0359eecd, 0x01b7932e, 0x01fc906c, 0x032fbcda, 0x0068862d, 0x01b34c80, 0x01298564, 0x01b47282, 0x038919de, 0x00383549}}, Y: Field{[10]uint32{0x02886b20, 0x028a51b2, 0x03ce88cd, 0x03c74faf, 0x01f46680, 0x025d02f5, 0x03547912, 0x03764293, 0x039db4eb, 0x00263d19}}}, + {X: Field{[10]uint32{0x025ca397, 0x004eba9f, 0x01f1800a, 0x02159070, 0x02e28c8b, 0x00bc8222, 0x000a4d48, 0x012d6110, 0x01cdcf1f, 0x0031a891}}, Y: Field{[10]uint32{0x021ac628, 0x0399da25, 0x01bf3605, 0x02a0cc08, 0x01cb11ec, 0x02d79b34, 0x00ff944a, 0x032c2656, 0x03b9f8f2, 0x0034c1b6}}}, + {X: Field{[10]uint32{0x0295c910, 0x00a1b9cd, 0x02b06a1b, 0x00652837, 0x024ade09, 0x026661ff, 0x0334acec, 0x03c20a87, 0x008d9710, 0x003fe55b}}, Y: Field{[10]uint32{0x03bcc306, 0x008f4304, 0x0239fb78, 0x03b2c38b, 0x01a8086a, 0x0362a4dd, 0x028c832f, 0x03f5187f, 0x012b866a, 0x003eafb1}}}, + {X: Field{[10]uint32{0x02c23af0, 0x00485489, 0x00cc73ff, 0x0059bd2b, 0x025cef12, 0x0313709d, 0x0344fe45, 0x01813343, 0x024a0d1a, 0x00152776}}, Y: Field{[10]uint32{0x000631ef, 0x03dd9784, 0x00381a33, 0x025d58b1, 0x01166fec, 0x02aec578, 0x02eede71, 0x02a0980d, 0x03c0e05b, 0x001c78eb}}}, + {X: Field{[10]uint32{0x02776416, 0x01f99127, 0x01723207, 0x004bb708, 0x016070dd, 0x037647e7, 0x01896e82, 0x01cf339a, 0x03090215, 0x0019b4f7}}, Y: Field{[10]uint32{0x03b46d5d, 0x03c9e756, 0x01ebc25f, 0x0327aa4c, 0x0009ccf1, 0x02bc162f, 0x0029dd3e, 0x03b8fb65, 0x021359a2, 0x0024e605}}}, + {X: Field{[10]uint32{0x01e4f8d9, 0x01c0bd5e, 0x01be737b, 0x02083eb8, 0x028a4d7a, 0x01713c61, 0x013ede5a, 0x018e1a71, 0x01bc0942, 0x00186f4f}}, Y: Field{[10]uint32{0x0082e780, 0x015cad38, 0x02caac1b, 0x020788cd, 0x00502aee, 0x003be923, 0x01ddf540, 0x013d24b2, 0x0247e27d, 0x0023015a}}}, + {X: Field{[10]uint32{0x00178f4e, 0x01bcee60, 0x0000647d, 0x01dbe99f, 0x004ef20c, 0x005236c7, 0x002f7849, 0x036aa49c, 0x03464a31, 0x00229b62}}, Y: Field{[10]uint32{0x028f7407, 0x019f2eab, 0x00d8ccfe, 0x02864efd, 0x03c31309, 0x02081451, 0x0082f9e3, 0x01d8065b, 0x02eee408, 0x00347d01}}}, + {X: Field{[10]uint32{0x022e573e, 0x03f47924, 0x02b1b809, 0x01096b3d, 0x0137893b, 0x03b76607, 0x00aa90e1, 0x021105c0, 0x029399eb, 0x0038ad83}}, Y: Field{[10]uint32{0x0219f7af, 0x004fba93, 0x029ed635, 0x02b42003, 0x01bd8a38, 0x02cd75e2, 0x0209dc0a, 0x020a6a2b, 0x025fe394, 0x001a2831}}}, + {X: Field{[10]uint32{0x00f55e85, 0x03c9b375, 0x00574ac6, 0x031cad56, 0x01fc23b8, 0x0277e950, 0x0316cad9, 0x03f24993, 0x030fe85c, 0x00131d80}}, Y: Field{[10]uint32{0x012b7bb6, 0x0166fa28, 0x000902d9, 0x02aa62bb, 0x01e98c63, 0x006157df, 0x039a5745, 0x02d3b323, 0x02d89a31, 0x00112cd4}}}, + {X: Field{[10]uint32{0x03baed2e, 0x0151d897, 0x01580fe4, 0x025cd98f, 0x002f0e89, 0x00e304e8, 0x022c9ef5, 0x00f0d42a, 0x02a35910, 0x00372ea5}}, Y: Field{[10]uint32{0x036544b4, 0x00530885, 0x003deb4d, 0x034b6cb6, 0x00b13053, 0x016fedcf, 0x01f91bd7, 0x01a62b7a, 0x005f0727, 0x002be788}}}, + {X: Field{[10]uint32{0x02dc7883, 0x02cacc7c, 0x02a433b5, 0x01ffa6d9, 0x03e68242, 0x0327b71c, 0x03d3e036, 0x03fe6b2f, 0x03d8f75f, 0x003f4125}}, Y: Field{[10]uint32{0x00d62d79, 0x002eb7ff, 0x0213509c, 0x022625b7, 0x01445762, 0x002f792a, 0x03fb2fcc, 0x0041deac, 0x00b69c8d, 0x00348c05}}}, + {X: Field{[10]uint32{0x01f48040, 0x0331bb7b, 0x01077542, 0x026bae28, 0x02e70500, 0x013a0fe7, 0x011b7795, 0x03904d0f, 0x01bb0b38, 0x0016ed00}}, Y: Field{[10]uint32{0x02599c14, 0x020afe20, 0x03a5ee7a, 0x01cc03b3, 0x00ca9445, 0x01e38f2a, 0x00ea6283, 0x004e47da, 0x00b5acec, 0x0010c7f3}}}, + {X: Field{[10]uint32{0x00bb283b, 0x00b6d6d2, 0x01d20a26, 0x00119ef1, 0x023acac7, 0x00d70ddf, 0x0341c38b, 0x01ab62c9, 0x024ff9cc, 0x0007ea5a}}, Y: Field{[10]uint32{0x02b963eb, 0x02a3fafb, 0x02ac8bfc, 0x031c6c88, 0x036404dc, 0x0278527a, 0x02af7f1f, 0x016bf3c7, 0x0092ffc6, 0x0030d123}}}, + {X: Field{[10]uint32{0x002f86ea, 0x00c8a459, 0x00f11614, 0x0080bfb2, 0x03697ea4, 0x01c74298, 0x02384531, 0x014749e9, 0x02ef1ae5, 0x000254d2}}, Y: Field{[10]uint32{0x03729591, 0x00aab03b, 0x03849643, 0x0084b2ff, 0x0346fd7f, 0x0284fa5b, 0x0148a4ec, 0x01f740cf, 0x003c3883, 0x00334325}}}, + {X: Field{[10]uint32{0x001b8ceb, 0x000ca834, 0x038b7b57, 0x02fc06a3, 0x02138440, 0x02a93fd2, 0x018d08f3, 0x000e42f2, 0x03ed4330, 0x003a9cab}}, Y: Field{[10]uint32{0x0058663e, 0x0299b4b6, 0x0280925e, 0x0112145c, 0x00af4fb0, 0x03ab9fa5, 0x02856a44, 0x00b30a72, 0x018c0369, 0x00385d37}}}, + {X: Field{[10]uint32{0x00122327, 0x03e1b517, 0x01fa9a01, 0x0188d75e, 0x03165698, 0x02fce874, 0x03801f2a, 0x0148e980, 0x01343ca2, 0x000e564d}}, Y: Field{[10]uint32{0x0153dd96, 0x00b80026, 0x0175b45d, 0x021eb1b2, 0x0142a5b8, 0x0111d449, 0x01cbf0e9, 0x01b72154, 0x03e92cd7, 0x002b34f8}}}, + {X: Field{[10]uint32{0x002d4721, 0x038f827b, 0x02a3f246, 0x03e1c9d0, 0x034f74ef, 0x037eed46, 0x027d4b53, 0x01683da5, 0x022a375e, 0x00355eca}}, Y: Field{[10]uint32{0x013ed306, 0x03495443, 0x03b036a0, 0x0251c6b9, 0x01c0aeeb, 0x01209e07, 0x02c20913, 0x01fb0c43, 0x00484d10, 0x0004b5be}}}, + {X: Field{[10]uint32{0x002f1082, 0x02eabd91, 0x0119c59b, 0x023f5480, 0x01fc5def, 0x03804d75, 0x02c781af, 0x03bbd839, 0x03c51b99, 0x00027cb7}}, Y: Field{[10]uint32{0x0320dd0d, 0x022d5b96, 0x01a77e0f, 0x01626789, 0x017ad1d7, 0x02a5bf83, 0x03ca6e4e, 0x00c123e8, 0x0162fd27, 0x00023c82}}}, + {X: Field{[10]uint32{0x0229884b, 0x00b06f40, 0x0216a935, 0x01d96316, 0x01afa587, 0x03037b68, 0x0336c1f9, 0x03244d26, 0x03c6f030, 0x002c70c2}}, Y: Field{[10]uint32{0x02ecdfc3, 0x00e43187, 0x019f1939, 0x009fd4ed, 0x035563e7, 0x028b8a32, 0x01c63d18, 0x02223735, 0x01d16e77, 0x003e2916}}}, + {X: Field{[10]uint32{0x01c6e53b, 0x03866369, 0x002eb665, 0x00ce14f8, 0x02305429, 0x02ed7499, 0x01ad6f91, 0x0348dc4b, 0x03e740ca, 0x00022998}}, Y: Field{[10]uint32{0x035c1e99, 0x007bb9ae, 0x03812c0c, 0x03f8081d, 0x000786a8, 0x00ec2463, 0x00cf7116, 0x0174576b, 0x03995117, 0x003881ac}}}, + {X: Field{[10]uint32{0x012941a1, 0x02aa2d2a, 0x03696fe1, 0x03a09f98, 0x005f4a5a, 0x01b302c0, 0x00fac0a7, 0x0247bbd1, 0x02cbe0ca, 0x000ac255}}, Y: Field{[10]uint32{0x006cffd2, 0x00aa588e, 0x03423ddf, 0x03fb68a7, 0x033f84b8, 0x018989f8, 0x02e1e110, 0x013abe43, 0x03a8dd45, 0x0028c79b}}}, + {X: Field{[10]uint32{0x0262c3bd, 0x00a449b9, 0x01330d54, 0x02001a83, 0x006b0099, 0x03847ed3, 0x02381df7, 0x0325c3ad, 0x01517a2a, 0x00380510}}, Y: Field{[10]uint32{0x008dfcee, 0x02e8d810, 0x03a1e7f4, 0x00d12218, 0x03aeb3fd, 0x0234636f, 0x01639341, 0x03203085, 0x029ba691, 0x00208e33}}}, + {X: Field{[10]uint32{0x02c86c37, 0x008568df, 0x02eba08b, 0x035c78a2, 0x02f344e0, 0x01682d99, 0x0316c530, 0x00bccf2b, 0x013e8b06, 0x0002f8c8}}, Y: Field{[10]uint32{0x0151cd1f, 0x02ca725f, 0x00adc3f1, 0x00f7476c, 0x03550fb8, 0x014a8990, 0x03956838, 0x00e29335, 0x03baeaca, 0x00154948}}}, + {X: Field{[10]uint32{0x01e8ff2b, 0x03859faa, 0x030abc4f, 0x01b6d7ac, 0x001c18eb, 0x0396389d, 0x03aa1db9, 0x02f593f1, 0x03b6bfbf, 0x00188ce4}}, Y: Field{[10]uint32{0x00e42cd3, 0x03537f8d, 0x00b500ba, 0x025ed4ac, 0x031339a1, 0x028edee5, 0x025e316f, 0x016fca80, 0x0174f0fd, 0x001f0390}}}, + {X: Field{[10]uint32{0x01cfe97a, 0x00856c43, 0x0326fbc6, 0x02aa2bea, 0x01bffe79, 0x0233d02f, 0x01eb624b, 0x007a1d9a, 0x0302dd0a, 0x0036b7ad}}, Y: Field{[10]uint32{0x03253490, 0x030e37c5, 0x00bb48fb, 0x026686ac, 0x025a5225, 0x0334e6f2, 0x0260acb8, 0x026d04b5, 0x00cae4c2, 0x0024c224}}}, + {X: Field{[10]uint32{0x01362f33, 0x03edde32, 0x03c13627, 0x03563894, 0x010ac98a, 0x00986133, 0x01c9cfec, 0x026e0aec, 0x03b78317, 0x002d4a34}}, Y: Field{[10]uint32{0x038babab, 0x00af54b6, 0x004f047c, 0x00222ed1, 0x01aa902e, 0x028b4628, 0x0140676b, 0x0048a98e, 0x03af1545, 0x00018c80}}}, + {X: Field{[10]uint32{0x01734a6a, 0x0096adc4, 0x036e02d0, 0x018835d0, 0x017a4de5, 0x0013a7a0, 0x0018a5c8, 0x01b88ab9, 0x03e09398, 0x000bfc88}}, Y: Field{[10]uint32{0x0100f678, 0x029e7000, 0x000965ef, 0x01d75280, 0x03819904, 0x01e0e2ad, 0x0276d8a9, 0x036866f6, 0x0188ec9c, 0x00317234}}}, + {X: Field{[10]uint32{0x01eb1742, 0x01b9d2e6, 0x0312ff94, 0x03da67f1, 0x019ec839, 0x0322ac73, 0x03d2c393, 0x014f2733, 0x01d50e1e, 0x0032e1cc}}, Y: Field{[10]uint32{0x02d19fb5, 0x02394f3d, 0x0076d8c1, 0x0123921c, 0x00a9db38, 0x024b3a29, 0x01252480, 0x03141374, 0x01f838fe, 0x00334be7}}}, + {X: Field{[10]uint32{0x00cf4a2e, 0x02c49c78, 0x0379936b, 0x0376fa61, 0x006dac52, 0x03c9c9a4, 0x02c265aa, 0x02972ddb, 0x0045d776, 0x0004ddeb}}, Y: Field{[10]uint32{0x02a04670, 0x02b287b0, 0x010d4f34, 0x0154353b, 0x0025ab21, 0x036524f8, 0x027a8187, 0x0124cb56, 0x030dd595, 0x00292ccc}}}, + {X: Field{[10]uint32{0x001a5ccd, 0x006894d9, 0x00724c51, 0x01cdeb04, 0x0222fbac, 0x020107ea, 0x03489bd8, 0x031d7f80, 0x03f2f140, 0x002612e6}}, Y: Field{[10]uint32{0x00d14ff3, 0x0050c7f2, 0x02bb590b, 0x026a50a8, 0x03d82f4c, 0x03135431, 0x010ea82a, 0x03bb2e9d, 0x02399733, 0x00311d3d}}}, + {X: Field{[10]uint32{0x03bdcb06, 0x025835eb, 0x00c4d857, 0x01e5ca63, 0x01d50504, 0x0000afe6, 0x035d56ac, 0x01f3e6c4, 0x000074f5, 0x0012e3f4}}, Y: Field{[10]uint32{0x00c703bf, 0x038deccd, 0x0097e3a8, 0x03a531b4, 0x0095560e, 0x01833ddb, 0x01937a4c, 0x03dbddc8, 0x01031df0, 0x001f0110}}}, + {X: Field{[10]uint32{0x018b6079, 0x0215a0c8, 0x000b6605, 0x006e2fb3, 0x0334fc75, 0x022f4376, 0x01250b25, 0x0088d986, 0x02536841, 0x0015cc59}}, Y: Field{[10]uint32{0x01652904, 0x010142a4, 0x01c37da6, 0x016f8e8e, 0x0216f833, 0x022bf850, 0x0172898b, 0x00715d22, 0x024f30f0, 0x0034755b}}}, + {X: Field{[10]uint32{0x0369f286, 0x01c883f6, 0x03bd253c, 0x019d3cae, 0x00607373, 0x019f50fd, 0x032cb597, 0x005bcbef, 0x0197a0ff, 0x00326800}}, Y: Field{[10]uint32{0x00142f0b, 0x03314610, 0x034e4009, 0x03b694c7, 0x006b4dfe, 0x018172af, 0x02074b0c, 0x0045f077, 0x0383d739, 0x0005df19}}}, + {X: Field{[10]uint32{0x021881cb, 0x03b1b3a9, 0x03ff645e, 0x03d5fba2, 0x00c87b9e, 0x01e6cc02, 0x01616185, 0x008ea76c, 0x02da91df, 0x00388d05}}, Y: Field{[10]uint32{0x00b8da15, 0x01cb755c, 0x00137937, 0x03d28f78, 0x02e42fbc, 0x005c60a5, 0x02c82e0e, 0x00da479f, 0x017f8404, 0x00395590}}}, + {X: Field{[10]uint32{0x038e9ad8, 0x038a5558, 0x01c1e3b0, 0x03ba29d2, 0x0114293e, 0x01def62a, 0x0214c450, 0x01d4f399, 0x03f2369d, 0x0027e5b8}}, Y: Field{[10]uint32{0x021ddff1, 0x012cae68, 0x00ff6b49, 0x025b94a7, 0x039b01a3, 0x0104f83a, 0x0250d10e, 0x029369c5, 0x02681567, 0x003d7344}}}, + {X: Field{[10]uint32{0x01301fd2, 0x013efdae, 0x03d5f1d9, 0x01e16e90, 0x01ae4880, 0x039a8c91, 0x014317dd, 0x00048f35, 0x03a4b24b, 0x0012195e}}, Y: Field{[10]uint32{0x02f0d890, 0x02319beb, 0x03e36a4a, 0x02824a69, 0x00dd4931, 0x02a4086c, 0x013ca772, 0x00de04a0, 0x02c06eb5, 0x000647b7}}}, + {X: Field{[10]uint32{0x0236f24a, 0x021f9a5a, 0x032d4e01, 0x03201de0, 0x02c6c858, 0x00500b5e, 0x03155111, 0x02193632, 0x02e9d72e, 0x0019ecc8}}, Y: Field{[10]uint32{0x03f6946a, 0x03f7ceb1, 0x02208c3d, 0x019fdfe6, 0x030e15c8, 0x017eaa0c, 0x0387058c, 0x02fc54ef, 0x02c26b58, 0x0033fac4}}}, + {X: Field{[10]uint32{0x004ded15, 0x0381bc29, 0x02d40fbd, 0x004c5820, 0x03c545ba, 0x014800b6, 0x00e89250, 0x037663f3, 0x0068542b, 0x00010ba0}}, Y: Field{[10]uint32{0x03c4aae5, 0x0111146f, 0x02402bf6, 0x0139eab1, 0x01a1ee81, 0x0313c987, 0x03649158, 0x00f3d49c, 0x01b0c1f3, 0x0005916a}}}, + {X: Field{[10]uint32{0x0290d4c7, 0x0230417f, 0x00e30758, 0x03292a32, 0x013e058c, 0x02eeb001, 0x02191079, 0x01437555, 0x00e1339c, 0x0023b9f7}}, Y: Field{[10]uint32{0x02c9d5f9, 0x01a6a05b, 0x011d2b46, 0x03fc79bc, 0x0098e102, 0x036fa7f8, 0x01a61705, 0x0209e4b3, 0x02f48aae, 0x003fef42}}}, + {X: Field{[10]uint32{0x03a368e6, 0x01e2a087, 0x02ece559, 0x03c3319b, 0x0237a935, 0x02c82485, 0x01aaaf27, 0x01a9c5ab, 0x01041292, 0x0002af25}}, Y: Field{[10]uint32{0x01f79203, 0x0317db5c, 0x027c9624, 0x01234e91, 0x02155a4a, 0x036b93f4, 0x0375c484, 0x01879e7e, 0x0135e9b4, 0x001cb952}}}, + {X: Field{[10]uint32{0x02976ba8, 0x037746e9, 0x02f3b433, 0x0235e0fc, 0x00fd72fd, 0x000de3f3, 0x000568d4, 0x03a6d4ec, 0x032081e0, 0x002f4940}}, Y: Field{[10]uint32{0x003ceb39, 0x0318e55b, 0x021ca4c3, 0x01f4a75a, 0x02e8c4c8, 0x005ee39e, 0x00ca8797, 0x01526265, 0x03db8585, 0x0016b6e2}}}, + {X: Field{[10]uint32{0x02e25f71, 0x02297862, 0x00740c01, 0x03812222, 0x01b31609, 0x039ea836, 0x02e91677, 0x03a13926, 0x0262fbee, 0x0002d3ec}}, Y: Field{[10]uint32{0x0176e5fc, 0x0371fe38, 0x0003b24c, 0x00da3a8d, 0x01265d6d, 0x033d85ba, 0x00ecbe41, 0x00754496, 0x0386dc09, 0x000d37cf}}}, + {X: Field{[10]uint32{0x02605c01, 0x03a20cef, 0x021c495d, 0x005c86cd, 0x03e46048, 0x00418ed7, 0x005ad148, 0x013abe85, 0x036766f2, 0x00346ea6}}, Y: Field{[10]uint32{0x01e8400a, 0x011da8f6, 0x03a75068, 0x00f292e2, 0x01f87194, 0x0245f8ea, 0x03ce7f28, 0x00bc7998, 0x00bd17de, 0x003a029b}}}, + {X: Field{[10]uint32{0x022639b3, 0x009d4ba4, 0x01ba8373, 0x0009a771, 0x03a80c67, 0x03ae78aa, 0x006652d5, 0x016a34b5, 0x02b03a3e, 0x0017262d}}, Y: Field{[10]uint32{0x010f4a54, 0x03d944f1, 0x012e06b8, 0x02d98d4a, 0x006a35ef, 0x03e41e81, 0x011bd130, 0x003374b1, 0x039a145d, 0x0002078b}}}, + {X: Field{[10]uint32{0x002618f8, 0x036d7753, 0x02a840c8, 0x00382a1e, 0x02908abf, 0x03ec97cb, 0x00b70714, 0x02e1bd87, 0x0288f75f, 0x00307e91}}, Y: Field{[10]uint32{0x028397ea, 0x00f32e72, 0x01d9b204, 0x0396ae18, 0x039db869, 0x02aa44f2, 0x0355d0b1, 0x03c9b45f, 0x02776d4b, 0x003cbdd2}}}, + {X: Field{[10]uint32{0x03227ec1, 0x00ae9b3d, 0x01f76dc2, 0x022d1017, 0x0396aec7, 0x00269d56, 0x0062ba2f, 0x03acc947, 0x02e9a644, 0x00017a01}}, Y: Field{[10]uint32{0x033e614b, 0x013e1fe9, 0x01bba9d8, 0x03adcbcc, 0x02b871d2, 0x01d08c4e, 0x02caa050, 0x020a75ab, 0x0118d6a1, 0x002e2320}}}, + {X: Field{[10]uint32{0x01c8de9a, 0x018c9bb4, 0x00c1434c, 0x01b7bfd5, 0x01096863, 0x031e406f, 0x023d965b, 0x0069efd8, 0x03fefd2c, 0x003e7451}}, Y: Field{[10]uint32{0x029caffd, 0x01235cb4, 0x00c33cd5, 0x032e1260, 0x0040de44, 0x0045cc18, 0x027d77b4, 0x021b1e4e, 0x0249ab66, 0x0031e21c}}}, + {X: Field{[10]uint32{0x030ccdb1, 0x0283fb29, 0x0023babe, 0x02b8c5c4, 0x009f7020, 0x001e658d, 0x0138a1f5, 0x03447ea3, 0x015685f6, 0x002e6332}}, Y: Field{[10]uint32{0x010ecf7f, 0x00ab6f26, 0x01f49571, 0x0085c25d, 0x013dcbdf, 0x002208d5, 0x024cc0d4, 0x03a28dbb, 0x00953689, 0x003c1d35}}}, + {X: Field{[10]uint32{0x0017b474, 0x0229925a, 0x02b03464, 0x024fceed, 0x02184584, 0x0052f2e9, 0x01091dc7, 0x005f9fbe, 0x02d41008, 0x003c5872}}, Y: Field{[10]uint32{0x03740904, 0x0227db66, 0x01ffd612, 0x03e7e946, 0x01c4410a, 0x01798945, 0x0081eb24, 0x03cc908a, 0x012e396a, 0x002dfbae}}}, + {X: Field{[10]uint32{0x0326914c, 0x02c70214, 0x038fb1b7, 0x03da2899, 0x03fb54af, 0x01bb7022, 0x02abac24, 0x00187915, 0x00892ea4, 0x001f22db}}, Y: Field{[10]uint32{0x027692f8, 0x02722bd7, 0x015b10d6, 0x00f736ae, 0x02296072, 0x00acd1a0, 0x035eacd0, 0x034b0a7f, 0x03026ea1, 0x003c2387}}}, + {X: Field{[10]uint32{0x00f28729, 0x00d7bb49, 0x01e5dd36, 0x023dc937, 0x023ab207, 0x03dc681d, 0x01b93cce, 0x01196065, 0x029f1633, 0x00119a30}}, Y: Field{[10]uint32{0x0074ea4f, 0x039d0013, 0x00fa129e, 0x01f0bd87, 0x008fd22f, 0x02766545, 0x024c7233, 0x03b1480c, 0x00c98391, 0x00176c8a}}}, + {X: Field{[10]uint32{0x0167b65e, 0x0071f94c, 0x00b2f4e2, 0x00a724a4, 0x0296fa67, 0x00d9c994, 0x0239f8cf, 0x03697066, 0x00f39dd6, 0x000d10f4}}, Y: Field{[10]uint32{0x03429234, 0x01f03a25, 0x014b92a8, 0x002edfb6, 0x0114a432, 0x0301e514, 0x0131f637, 0x0237723b, 0x02399a08, 0x0012db6d}}}, + {X: Field{[10]uint32{0x03c227b4, 0x031e0422, 0x020e8ffe, 0x02a6beb0, 0x02458dbc, 0x015d3025, 0x0281e693, 0x013a5560, 0x010117a0, 0x0034f38d}}, Y: Field{[10]uint32{0x02eb9908, 0x01ff2ac1, 0x0384a9b7, 0x01ba4338, 0x007696ee, 0x03555ab4, 0x001e47f8, 0x01bba4d5, 0x03b9628f, 0x002f3f1d}}}, + {X: Field{[10]uint32{0x015127af, 0x0005583e, 0x03080233, 0x030f34b5, 0x00f2bc1a, 0x03782b0a, 0x01f86409, 0x00914888, 0x0363ad77, 0x00313718}}, Y: Field{[10]uint32{0x012d3038, 0x025ae2dd, 0x0271b3e0, 0x03165fda, 0x00038a79, 0x020d1494, 0x01bc9493, 0x0299990e, 0x028fd789, 0x001e326e}}}, + {X: Field{[10]uint32{0x015ac666, 0x034a769b, 0x01075b23, 0x0332ef37, 0x021bf4ed, 0x008f4b83, 0x0178d7a1, 0x011fb3f3, 0x0394221a, 0x00031dc7}}, Y: Field{[10]uint32{0x028d6091, 0x0157dc73, 0x01980d91, 0x01bd6e3d, 0x03f2ec52, 0x01778a4f, 0x00719246, 0x016abbd1, 0x0330829f, 0x00137b8e}}}, + {X: Field{[10]uint32{0x01e6e199, 0x00945f5e, 0x03d50e77, 0x02fc9d6b, 0x0136a1e9, 0x012287c9, 0x02516e64, 0x023dfd6d, 0x00e89633, 0x002ffe23}}, Y: Field{[10]uint32{0x0388c206, 0x01d05629, 0x03f68532, 0x00a6ed56, 0x01c15526, 0x03a5d876, 0x00b62117, 0x004293ac, 0x007ab620, 0x0023cfc3}}}, + {X: Field{[10]uint32{0x01a3b97a, 0x0287ca82, 0x002da576, 0x01dbcb38, 0x006a467e, 0x00f2b089, 0x010e7e3d, 0x02fc93a1, 0x00645d57, 0x0012bf34}}, Y: Field{[10]uint32{0x0110f0a2, 0x02b95393, 0x01f93984, 0x00ec301b, 0x00ef927d, 0x021db5b0, 0x00692f61, 0x02be4db3, 0x035487b2, 0x0014bc8e}}}, + {X: Field{[10]uint32{0x02b1f373, 0x022e884c, 0x03abdf8a, 0x00d26001, 0x0379e23c, 0x0136c04b, 0x03933fd9, 0x0038815f, 0x022cb9bf, 0x00312f04}}, Y: Field{[10]uint32{0x02fbfc6d, 0x01e21859, 0x00ce1a87, 0x02f5ef7e, 0x031daf76, 0x02ad5b5d, 0x005d4273, 0x0206eb71, 0x03b6a31d, 0x00390311}}}, + {X: Field{[10]uint32{0x01f821a8, 0x01a3c614, 0x019ddb4c, 0x0229f4d3, 0x02837a0f, 0x02ac46b2, 0x0223d27b, 0x01de4738, 0x01b1d1be, 0x00121e86}}, Y: Field{[10]uint32{0x01d0ef98, 0x027912a9, 0x00e67f51, 0x000dec97, 0x01055524, 0x0150578d, 0x02335544, 0x013a6821, 0x034316ff, 0x00294f35}}}, + {X: Field{[10]uint32{0x0301a326, 0x00cb2e10, 0x007f8106, 0x0202a162, 0x01f4ac3d, 0x022333ff, 0x02035165, 0x031d201d, 0x00ecbe06, 0x0009d28f}}, Y: Field{[10]uint32{0x01a9f40d, 0x02627121, 0x019b3ff4, 0x01e98efc, 0x035d06b4, 0x00e172db, 0x0272cab5, 0x022d1426, 0x03e3afbe, 0x0005e892}}}, + {X: Field{[10]uint32{0x03afa9e8, 0x01e4418c, 0x022c48a0, 0x01a8002f, 0x03e82fcc, 0x01563e74, 0x03fc34e7, 0x0266b00e, 0x0377b0cb, 0x000cacc7}}, Y: Field{[10]uint32{0x018f5bc2, 0x036a0297, 0x032a8993, 0x03542c5c, 0x0217f422, 0x02e0111c, 0x02b3f71d, 0x036a4383, 0x004cc191, 0x000111ed}}}, + {X: Field{[10]uint32{0x024a2752, 0x022e1680, 0x03c2925d, 0x038419b7, 0x03945285, 0x03f424cd, 0x0339d46f, 0x0051a370, 0x01cf5556, 0x001e30e7}}, Y: Field{[10]uint32{0x03a3ac55, 0x022119de, 0x009ce890, 0x00c57844, 0x02a66809, 0x03008f98, 0x03df63d5, 0x032a17ba, 0x01bb4e41, 0x0035a477}}}, + {X: Field{[10]uint32{0x0134e5ff, 0x035bece7, 0x0325fa04, 0x0258ac79, 0x00d2f21f, 0x03bbf06a, 0x0102116d, 0x001ddf11, 0x0111a492, 0x0017f1d6}}, Y: Field{[10]uint32{0x017512f2, 0x0182ecd2, 0x00d507a4, 0x01892dca, 0x01f3fe16, 0x0284e5d2, 0x03524d96, 0x0221737f, 0x037f18f5, 0x00167cdb}}}, + {X: Field{[10]uint32{0x0108fa8a, 0x00a274eb, 0x0364ae38, 0x039bda4e, 0x01fa62dd, 0x038d1b86, 0x010fc164, 0x00ad269b, 0x00e9152b, 0x00328564}}, Y: Field{[10]uint32{0x0046dc8c, 0x023fcc20, 0x007f524a, 0x01124da5, 0x01535ea7, 0x00499157, 0x029eae17, 0x03b5d527, 0x033c1174, 0x0011a9ee}}}, + {X: Field{[10]uint32{0x0111fa1f, 0x01433767, 0x037f1f3d, 0x02f16ea6, 0x01743d94, 0x03d9b56b, 0x036e660b, 0x02f7ae9f, 0x02665ff0, 0x00171c54}}, Y: Field{[10]uint32{0x0073a03e, 0x03ffa711, 0x00c39b31, 0x02903c82, 0x02e41684, 0x03333293, 0x01ee9ddc, 0x02570e88, 0x031556e9, 0x001f688e}}}, + {X: Field{[10]uint32{0x00177e82, 0x0361a139, 0x017c8c29, 0x03387255, 0x03fa0c09, 0x03cb840c, 0x01c38774, 0x031ce957, 0x01a36361, 0x0031fdc7}}, Y: Field{[10]uint32{0x01b0dedf, 0x03b6e156, 0x01f92078, 0x0030d0a7, 0x0177c6f5, 0x0013c3e5, 0x022dbf9a, 0x033b2dac, 0x007fb5c2, 0x000235b9}}}, + {X: Field{[10]uint32{0x0058afab, 0x00070af7, 0x0316da01, 0x03339be9, 0x024130b4, 0x00cedd4d, 0x01259004, 0x0284f8de, 0x019f5264, 0x001ba46f}}, Y: Field{[10]uint32{0x00fd604f, 0x008e946d, 0x034499ed, 0x00d077d6, 0x01ee0f94, 0x00826a80, 0x0020c20f, 0x01612576, 0x0055506b, 0x0016ea9d}}}, + {X: Field{[10]uint32{0x02ef0d33, 0x015065ae, 0x01072689, 0x0280d416, 0x03244907, 0x00cc8a04, 0x01c789df, 0x01f2ff1d, 0x028e69ac, 0x0007c037}}, Y: Field{[10]uint32{0x02e040f4, 0x020dc0f6, 0x02feab2e, 0x032106e9, 0x020e65fe, 0x0120ad9e, 0x000c30b4, 0x00c3b4a0, 0x0290f323, 0x000a24b3}}}, + {X: Field{[10]uint32{0x01300638, 0x01e4515f, 0x01e1091d, 0x002c8c93, 0x001a2f5b, 0x01c76356, 0x01efa3ad, 0x0311a508, 0x03f507d8, 0x0030004c}}, Y: Field{[10]uint32{0x00f18895, 0x010d3b4d, 0x027a2f86, 0x004bf72d, 0x031aa3dc, 0x027a38c6, 0x005ea455, 0x03a60b74, 0x01820d3e, 0x000f1dac}}}, + {X: Field{[10]uint32{0x020cad49, 0x03a420f1, 0x0248d2f8, 0x03819b37, 0x00cdb172, 0x012efe5c, 0x00ef7560, 0x009a784b, 0x01e795e8, 0x0002bd8e}}, Y: Field{[10]uint32{0x0026abb4, 0x00b11d09, 0x03219808, 0x02bd59ce, 0x030c479d, 0x03477921, 0x0014a74c, 0x0334a439, 0x0179ce92, 0x0006f404}}}, + {X: Field{[10]uint32{0x01f4c9a1, 0x01e5e5cc, 0x00cd54e9, 0x00e22dcf, 0x00ede585, 0x03af2e68, 0x03a0a5d8, 0x03011063, 0x027d5447, 0x0039b6f4}}, Y: Field{[10]uint32{0x01242153, 0x037aaf8f, 0x038ee6b5, 0x00dcd236, 0x01a20710, 0x03433e2f, 0x00c780a0, 0x020c80f5, 0x0124f284, 0x001dfce1}}}, + {X: Field{[10]uint32{0x036360a9, 0x037f54cc, 0x0246e4c2, 0x007b9015, 0x028d1e3e, 0x0304467a, 0x02dd904e, 0x01c2ab40, 0x0123c95b, 0x003d46a3}}, Y: Field{[10]uint32{0x00f46c57, 0x012c6a70, 0x0113873e, 0x02ad4651, 0x02ae5c6a, 0x02566b36, 0x03488714, 0x00f3d831, 0x009a1d70, 0x00109acb}}}, + {X: Field{[10]uint32{0x00f6bcf4, 0x01135428, 0x01863429, 0x02b07b91, 0x00a3e4d1, 0x00eb8e98, 0x038d8fc3, 0x00dedfd5, 0x01e70fe4, 0x00384bc4}}, Y: Field{[10]uint32{0x0019f5d2, 0x01b64011, 0x01253e3c, 0x0359b71f, 0x038bfec8, 0x00453255, 0x03985b14, 0x0226ad58, 0x015835fa, 0x0008b457}}}, + {X: Field{[10]uint32{0x0188e14c, 0x02f1fb7a, 0x00bb9bf6, 0x01467624, 0x03ac6193, 0x02562853, 0x0351e56d, 0x018b418b, 0x020a8ec7, 0x0039d621}}, Y: Field{[10]uint32{0x027ecd78, 0x0070a5d5, 0x03b23ec4, 0x0208ec00, 0x03104386, 0x032d1d43, 0x008d780d, 0x013c87ee, 0x00ef10b8, 0x0010b678}}}, + {X: Field{[10]uint32{0x00a64163, 0x00e8e608, 0x032c6e42, 0x020bbe47, 0x02d47998, 0x022952de, 0x022b90c7, 0x00797360, 0x03e90ba2, 0x000f24cf}}, Y: Field{[10]uint32{0x029080df, 0x00b77cd9, 0x03f96b67, 0x00d447d9, 0x017fc161, 0x01c02d2b, 0x01b23a56, 0x008b8b29, 0x00be5319, 0x00307aa8}}}, + {X: Field{[10]uint32{0x02857872, 0x004d3f7a, 0x00e07939, 0x0138f027, 0x00df828e, 0x02469e70, 0x02b6b08e, 0x0019b2db, 0x036a83c9, 0x0011d5d5}}, Y: Field{[10]uint32{0x0038277a, 0x03b9b183, 0x00d7b058, 0x03a27654, 0x01818248, 0x0249c311, 0x03e8388d, 0x01fc5778, 0x03b262d7, 0x0004fc8b}}}, + {X: Field{[10]uint32{0x031045c7, 0x0275ad00, 0x00aa8012, 0x03361987, 0x0246570f, 0x029fffd0, 0x01df9039, 0x014502c6, 0x01037008, 0x000d798e}}, Y: Field{[10]uint32{0x01b9e8c9, 0x0272b979, 0x011f1b0e, 0x02b6961a, 0x0053cfb3, 0x00f0a3a1, 0x004f022b, 0x018361a9, 0x00bcaa9d, 0x000a157d}}}, + {X: Field{[10]uint32{0x02126fa3, 0x0398cb8c, 0x024fe82b, 0x0371aa2f, 0x02ad5330, 0x0342a17d, 0x025f0316, 0x02081cd5, 0x02011f11, 0x002b511b}}, Y: Field{[10]uint32{0x00e83e39, 0x00653d8a, 0x00d4315c, 0x0150bdcc, 0x021d8acb, 0x02b03aac, 0x012b2f81, 0x038fd47e, 0x02f1dece, 0x000900e0}}}, + {X: Field{[10]uint32{0x02718815, 0x0359001a, 0x021aff82, 0x03d75dd1, 0x0289164e, 0x03108869, 0x00af7529, 0x02b0de08, 0x01f3eb01, 0x003efa79}}, Y: Field{[10]uint32{0x02d088e6, 0x0007fd84, 0x00468478, 0x0210aafe, 0x01ba2073, 0x0137a485, 0x013e0884, 0x00b8338e, 0x00add85a, 0x003cbcc3}}}, + {X: Field{[10]uint32{0x03038135, 0x014bc4ce, 0x029166e9, 0x03d8cb4c, 0x00b9b585, 0x020b326e, 0x0149aa24, 0x03d0c281, 0x0320d81f, 0x000799d4}}, Y: Field{[10]uint32{0x00686aa7, 0x02d326bc, 0x01db1b44, 0x006cd9b4, 0x002e2c7f, 0x02621c03, 0x03aa5de2, 0x03665716, 0x0276c9c7, 0x003283c4}}}, + {X: Field{[10]uint32{0x02267718, 0x00e45f35, 0x0285f359, 0x010cc383, 0x0394c3f6, 0x0349e492, 0x02b8068a, 0x0394ae8b, 0x037023b0, 0x0005db71}}, Y: Field{[10]uint32{0x017ca8d9, 0x003cff8a, 0x02701d51, 0x03da1746, 0x000548d4, 0x03d98254, 0x010686fd, 0x016c1bd1, 0x02885df7, 0x0034b718}}}, + {X: Field{[10]uint32{0x01a9c938, 0x002aded0, 0x008dd99a, 0x01080f3f, 0x017ac839, 0x0331f150, 0x02feadbc, 0x00aceacd, 0x02c232a0, 0x000f214d}}, Y: Field{[10]uint32{0x025186b5, 0x013d6b68, 0x03d9dbdc, 0x014b5a8e, 0x018ebc7f, 0x00c08ab4, 0x00dd8f17, 0x0344ab49, 0x02a5249c, 0x0029a13b}}}, + {X: Field{[10]uint32{0x02f006fd, 0x028c8b5e, 0x014a5605, 0x000f58f1, 0x00ec6ea0, 0x02a20466, 0x00c446fb, 0x01dadb95, 0x03abc61a, 0x00122a9c}}, Y: Field{[10]uint32{0x02403a64, 0x03e64d63, 0x00d4ecdb, 0x02dc1039, 0x035977fa, 0x033cf77c, 0x00185065, 0x002208b4, 0x02eeffb2, 0x0030a317}}}, + {X: Field{[10]uint32{0x03cc1ff1, 0x028e86d4, 0x024cbd83, 0x0034329f, 0x01263d17, 0x022eb292, 0x02d2b363, 0x000a3676, 0x03620abd, 0x001d1cc9}}, Y: Field{[10]uint32{0x0136c2c6, 0x02f5a779, 0x01f3fddf, 0x03f982ea, 0x00927a88, 0x03008edb, 0x02ef7ce5, 0x02827cfc, 0x030ce8df, 0x00328477}}}, + {X: Field{[10]uint32{0x01698522, 0x01cb16e5, 0x0002eb86, 0x0095491f, 0x01a40427, 0x0053fa40, 0x03dc9188, 0x016455d9, 0x0309520e, 0x003adc6a}}, Y: Field{[10]uint32{0x0148e995, 0x027d5b93, 0x031eb874, 0x0007001f, 0x01c81b69, 0x0008ecaa, 0x02563cb2, 0x016ce3b5, 0x02e0a7e9, 0x0017eb5e}}}, + {X: Field{[10]uint32{0x02f5be6b, 0x0110dc5f, 0x021cef84, 0x0256595d, 0x02af5e86, 0x02c5e731, 0x02da74be, 0x00f7d5cb, 0x03f6c776, 0x000ac406}}, Y: Field{[10]uint32{0x03140ce9, 0x03fa188f, 0x02597067, 0x0065fe26, 0x01f66647, 0x03c96108, 0x014629fe, 0x0068f663, 0x02c84e1d, 0x00003745}}}, + {X: Field{[10]uint32{0x020ab337, 0x02910d9b, 0x033ebca2, 0x03fa3cec, 0x0213976a, 0x017a06e8, 0x032b0507, 0x0195494c, 0x03a82c66, 0x0028267b}}, Y: Field{[10]uint32{0x01136c07, 0x02a66f57, 0x013abdc0, 0x02d796dd, 0x02fb1e33, 0x0049ab32, 0x016c7faa, 0x03cacf77, 0x017b5cf1, 0x003e20e5}}}, + {X: Field{[10]uint32{0x0362f95d, 0x02f267e2, 0x00f153d5, 0x03340bd6, 0x018cc107, 0x01c2f7ac, 0x032ab6d4, 0x00f3a56d, 0x0056a61c, 0x003d0e5a}}, Y: Field{[10]uint32{0x029f6133, 0x01db005b, 0x02567cfd, 0x03cf87bc, 0x03df81c2, 0x00c9d398, 0x03240caf, 0x02c2c019, 0x011aa8ed, 0x001b8fab}}}, + {X: Field{[10]uint32{0x014050c0, 0x038e1fda, 0x00008bd5, 0x01f12516, 0x0353215b, 0x0124f600, 0x00aabe5a, 0x02ec6128, 0x019726aa, 0x00369cc8}}, Y: Field{[10]uint32{0x01a0eeb6, 0x0211813a, 0x01b4666d, 0x01339f38, 0x019489af, 0x017a5538, 0x00b987d8, 0x012da1af, 0x03291772, 0x003881d7}}}, + {X: Field{[10]uint32{0x000a6792, 0x01359be6, 0x02f4575f, 0x0345343c, 0x018fea44, 0x025d0080, 0x0259c09b, 0x01860fd0, 0x021e1959, 0x002645c6}}, Y: Field{[10]uint32{0x01219a4f, 0x01d9ec5d, 0x03f5f27a, 0x034b9d81, 0x0066af1b, 0x0381efb0, 0x032cbd80, 0x03bbcf9f, 0x000c83e1, 0x00148ae1}}}, + {X: Field{[10]uint32{0x018cf08f, 0x034d329d, 0x0323f8f0, 0x03da44cc, 0x001db7bc, 0x01122270, 0x008997a9, 0x013cd890, 0x02848a2c, 0x000d4f31}}, Y: Field{[10]uint32{0x0267ebe7, 0x01449373, 0x01fa243d, 0x0051b839, 0x0097effd, 0x000a0d32, 0x02b283f7, 0x000559f8, 0x0062f4ba, 0x0006196f}}}, + {X: Field{[10]uint32{0x02312852, 0x0090b75e, 0x026d5deb, 0x00f755e8, 0x01b9ed7e, 0x02dbf330, 0x027c77f1, 0x034f4e39, 0x003b5053, 0x0022c5a6}}, Y: Field{[10]uint32{0x005d47c6, 0x03217976, 0x00e9fbe6, 0x034b1ca8, 0x000caeb3, 0x03fd26b2, 0x02adeedc, 0x014f4e55, 0x0392fa59, 0x0012764f}}}, + {X: Field{[10]uint32{0x010cabc9, 0x0381191d, 0x002ef505, 0x00c0eeb0, 0x02efb367, 0x020fed88, 0x03b25130, 0x00c9f089, 0x02a4b1da, 0x001a3d77}}, Y: Field{[10]uint32{0x03d31782, 0x01a263f8, 0x0350c435, 0x0115c72d, 0x02146de0, 0x01b271d0, 0x01257744, 0x012e76bb, 0x039c5d62, 0x00099d03}}}, + {X: Field{[10]uint32{0x020c699b, 0x02ec8080, 0x01244e74, 0x001a6156, 0x03cc9367, 0x008229b5, 0x019d8bd7, 0x03c03238, 0x007fc3ac, 0x003ebd48}}, Y: Field{[10]uint32{0x02f1936c, 0x019282f3, 0x03eebb85, 0x009c2181, 0x03d42c15, 0x01c77a39, 0x00186ac9, 0x031b952b, 0x004617a6, 0x003eaded}}}, + {X: Field{[10]uint32{0x00d17630, 0x03d4207a, 0x004a2bca, 0x00828998, 0x02917c04, 0x00bc0685, 0x0204707a, 0x0316f4f6, 0x0291b541, 0x0030f46a}}, Y: Field{[10]uint32{0x00d9ce27, 0x03450d7f, 0x02c64d8c, 0x028d1324, 0x01c9b631, 0x0397ded1, 0x02d7ce54, 0x031017c1, 0x006e5a58, 0x0016d5e0}}}, + {X: Field{[10]uint32{0x02c8db1a, 0x03267ea2, 0x01455623, 0x016bf8b0, 0x0254b5bd, 0x0246cc3c, 0x00db5263, 0x02e48114, 0x02354970, 0x0008c9e2}}, Y: Field{[10]uint32{0x00e1888b, 0x03b91064, 0x0144d55d, 0x01afef48, 0x03357048, 0x018150b7, 0x0093b746, 0x02791c6b, 0x01dae8df, 0x00219360}}}, + {X: Field{[10]uint32{0x038c0146, 0x01d97151, 0x02d25485, 0x00ac3b2b, 0x017c12c3, 0x02773440, 0x00de4ab2, 0x0329341d, 0x018133cb, 0x00180bd8}}, Y: Field{[10]uint32{0x027aa968, 0x02791800, 0x0011f91c, 0x010b39a8, 0x019ffab3, 0x0266e721, 0x03d2da15, 0x030d43dd, 0x03b7279e, 0x001310b3}}}, + {X: Field{[10]uint32{0x01843ee9, 0x03b2ab49, 0x02690fd4, 0x02af1e58, 0x03c545a9, 0x0373233f, 0x002aa463, 0x030ec976, 0x03c70126, 0x00077133}}, Y: Field{[10]uint32{0x03fedeb1, 0x0097986c, 0x003ac182, 0x02e4aa6d, 0x036002b1, 0x0178cabe, 0x0020f172, 0x0155d4d6, 0x01825c53, 0x002a4d5e}}}, + {X: Field{[10]uint32{0x0235af82, 0x0308f3f3, 0x028b33c6, 0x037e2c13, 0x01887a95, 0x032997f1, 0x00d99108, 0x02f1e453, 0x01216e02, 0x000da53c}}, Y: Field{[10]uint32{0x00555d88, 0x00d9090e, 0x006d1d1c, 0x03266e0e, 0x02c61e57, 0x021162e7, 0x016e7428, 0x0065db51, 0x0291b1c4, 0x001fffb8}}}, + {X: Field{[10]uint32{0x01f1bdbf, 0x0248ac87, 0x003b4b65, 0x00eea483, 0x00457be0, 0x03c1b0b1, 0x00725e0a, 0x019081ee, 0x0275a959, 0x001d0eb6}}, Y: Field{[10]uint32{0x000f908f, 0x035c5d6d, 0x026c0b16, 0x03e4e6c4, 0x035629b9, 0x00b706d0, 0x00c23ed9, 0x03176027, 0x01b55ac4, 0x0023cae0}}}, + {X: Field{[10]uint32{0x02420085, 0x02bdf5ac, 0x0394f210, 0x00b89b5b, 0x00f047cf, 0x0011181f, 0x00c42d7f, 0x03129ee7, 0x03977c7c, 0x0002ffa4}}, Y: Field{[10]uint32{0x02373d64, 0x00241beb, 0x01d92126, 0x03fa80b8, 0x01666c3d, 0x037b94f5, 0x02f2b510, 0x03720c07, 0x00598f80, 0x00189758}}}, + {X: Field{[10]uint32{0x03240eb9, 0x01b62e46, 0x01f8373e, 0x03ff21e5, 0x01cb56eb, 0x0219e86b, 0x01447517, 0x011b230a, 0x000e6ee6, 0x0021b00b}}, Y: Field{[10]uint32{0x005be4ed, 0x0299abf2, 0x037b40bf, 0x01224591, 0x0159d39f, 0x03d5be02, 0x02af5290, 0x004262dd, 0x029fda4b, 0x001966d7}}}, + {X: Field{[10]uint32{0x007bfda4, 0x02a48a4e, 0x02ce5dc3, 0x011d2e0a, 0x026c4f8f, 0x02a13719, 0x01d357d3, 0x0007a665, 0x0045857f, 0x000eca04}}, Y: Field{[10]uint32{0x02e9fd4c, 0x02039ff4, 0x00f8a16d, 0x008cfd40, 0x01e318a1, 0x03cc4f6b, 0x007c42f1, 0x0055091f, 0x032ccdeb, 0x00265209}}}, + {X: Field{[10]uint32{0x02fc47c0, 0x0294a13f, 0x007a3da9, 0x02380cc2, 0x02985903, 0x01b5bfca, 0x004d33d4, 0x025e7c14, 0x01d3b54d, 0x00337733}}, Y: Field{[10]uint32{0x016683b8, 0x00ebad01, 0x00321213, 0x02469fac, 0x010196c9, 0x001f7759, 0x0191e5e8, 0x004f0513, 0x03f83693, 0x0027ca84}}}, + {X: Field{[10]uint32{0x030e16d7, 0x014b0d21, 0x00088403, 0x027ccdc2, 0x018f8c2e, 0x0008c9c4, 0x034462bd, 0x00f76fb8, 0x0102a602, 0x00260401}}, Y: Field{[10]uint32{0x0169b9cb, 0x0253a406, 0x01a5747a, 0x019af5c8, 0x004cf8fb, 0x0152a13b, 0x0381c084, 0x00ecec78, 0x02f469af, 0x0006a2ff}}}, + {X: Field{[10]uint32{0x01978179, 0x0088f966, 0x02316c90, 0x03e6cd77, 0x03c26092, 0x02e08492, 0x00168479, 0x005e6c24, 0x017db2fc, 0x0022dd9d}}, Y: Field{[10]uint32{0x02b16f05, 0x03e69cd0, 0x009606ea, 0x01a07a2d, 0x01ee4492, 0x00459cc8, 0x01a71a6a, 0x01972950, 0x0326588e, 0x0011fabc}}}, + {X: Field{[10]uint32{0x02cc3b43, 0x015c759f, 0x02771bf2, 0x02cb557a, 0x0045c83b, 0x01ac3187, 0x004d8a94, 0x02d981bd, 0x03dc897f, 0x00399bb5}}, Y: Field{[10]uint32{0x0214dcbe, 0x03316a7c, 0x01810518, 0x03e64dd3, 0x017f1745, 0x0229016f, 0x00ffd470, 0x03fd3b1b, 0x039b8a9f, 0x00394dbd}}}, + {X: Field{[10]uint32{0x02bc88c8, 0x01aa84fc, 0x020d2262, 0x00241a82, 0x01ead632, 0x03bd7045, 0x02ad0656, 0x002e7e33, 0x0192cc9c, 0x00381801}}, Y: Field{[10]uint32{0x035a584f, 0x035472df, 0x03f7ca42, 0x01775527, 0x02e7f75f, 0x0304e105, 0x02552544, 0x01c1745b, 0x00b78b84, 0x0018a365}}}, + {X: Field{[10]uint32{0x01152767, 0x016b01c6, 0x02cfbffc, 0x0109ace4, 0x0362db2e, 0x018f8bc1, 0x0358fc70, 0x00975331, 0x0242a9cf, 0x0006c2bc}}, Y: Field{[10]uint32{0x0056a2be, 0x010ff0f2, 0x035a0ed0, 0x012c0be5, 0x00592dec, 0x024d5012, 0x0128da0d, 0x0015668f, 0x02a5eec3, 0x000ceba2}}}, + {X: Field{[10]uint32{0x035acb7d, 0x02a935ab, 0x00ed5439, 0x0137396f, 0x009b8092, 0x02c2f2fc, 0x005beeed, 0x01fb68d4, 0x03aa142f, 0x0038813f}}, Y: Field{[10]uint32{0x018911ba, 0x0136d257, 0x0159e692, 0x00c11e69, 0x03a02f70, 0x03bcb08a, 0x02acdd1a, 0x005466b7, 0x019b98e1, 0x0028a013}}}, + {X: Field{[10]uint32{0x01515ed5, 0x03c26683, 0x0196469c, 0x03d24a11, 0x00a35431, 0x00c5cf53, 0x00ea1fc1, 0x00c7d885, 0x02676515, 0x002bf103}}, Y: Field{[10]uint32{0x00b648e0, 0x01b4ccc0, 0x01b45589, 0x001f34ef, 0x035e6297, 0x02c13499, 0x02e85963, 0x0037a4ca, 0x02f41e48, 0x0015fbdb}}}, + {X: Field{[10]uint32{0x03e8d226, 0x037b88aa, 0x001d4690, 0x00197298, 0x01729634, 0x017038f2, 0x00588b04, 0x01907e00, 0x03db747b, 0x001654e2}}, Y: Field{[10]uint32{0x002d4438, 0x000c773b, 0x00e28652, 0x00a174de, 0x0352ca7a, 0x037a5821, 0x026547a3, 0x0270d530, 0x006a3c91, 0x00280c12}}}, + {X: Field{[10]uint32{0x0197ed8f, 0x0391a6aa, 0x026f1efb, 0x01106012, 0x02b964cf, 0x03b6ca9d, 0x03a4baeb, 0x0100a318, 0x034fc38d, 0x001aa474}}, Y: Field{[10]uint32{0x01073260, 0x00075d76, 0x02a00f2b, 0x034729b3, 0x0345f221, 0x034f9cfa, 0x02ead10d, 0x0149d0b4, 0x00836a0b, 0x000c9403}}}, + {X: Field{[10]uint32{0x02c28d61, 0x018330a2, 0x02ee8f77, 0x02772170, 0x00332ae3, 0x038870d1, 0x01c44ab5, 0x025fba5f, 0x0287b11d, 0x00249839}}, Y: Field{[10]uint32{0x0223e778, 0x03a61458, 0x01d1892c, 0x020e8cf9, 0x01c1d13e, 0x03736765, 0x0124f5e2, 0x01953bdc, 0x033de8d8, 0x0003d1f7}}}, + {X: Field{[10]uint32{0x00fe3cba, 0x02410413, 0x03e06a03, 0x030f73e6, 0x00b48820, 0x02d3ca4f, 0x038561f4, 0x03cc07d9, 0x03337a66, 0x000d2439}}, Y: Field{[10]uint32{0x029bbd6c, 0x0281c857, 0x006f1f5e, 0x00d94ca2, 0x02a81695, 0x016eec8a, 0x03876368, 0x01c2b1d3, 0x02797edb, 0x00125646}}}, + {X: Field{[10]uint32{0x0107b4a0, 0x0029a023, 0x03c8a6ec, 0x02049e00, 0x01d71d7a, 0x02a55228, 0x00b1311e, 0x02a68df7, 0x00fe1f47, 0x0025ca7d}}, Y: Field{[10]uint32{0x0317f896, 0x02e2bcba, 0x0386c2dc, 0x01cffa2a, 0x01c8f03d, 0x008bbfa9, 0x03ee569e, 0x03f5ca39, 0x01d4ccc4, 0x0015b869}}}, + {X: Field{[10]uint32{0x029c2caf, 0x036360eb, 0x034b1c37, 0x02d60332, 0x005e694e, 0x0200113c, 0x03d77a66, 0x0108f473, 0x004f06da, 0x002bd8e4}}, Y: Field{[10]uint32{0x03e110b2, 0x006cc1b6, 0x02400f3d, 0x003df1e6, 0x01b8cfaf, 0x029f8bb7, 0x01fa10b4, 0x02e52345, 0x002f5fe2, 0x001b7b37}}}, + {X: Field{[10]uint32{0x00435a3f, 0x00bede8b, 0x031f2f24, 0x03831ede, 0x01403cf0, 0x01f0a53f, 0x0274edf8, 0x007c8688, 0x03721f4a, 0x002589c7}}, Y: Field{[10]uint32{0x025adddf, 0x03d6c872, 0x01e7951c, 0x01deb904, 0x01719400, 0x027dba52, 0x03bbca44, 0x033f54af, 0x00731fc8, 0x0019bfef}}}, + {X: Field{[10]uint32{0x03717c7d, 0x03653292, 0x0296a95b, 0x00f1fb89, 0x00dfa5a1, 0x02ea3658, 0x0027287e, 0x03168056, 0x02151f0c, 0x00290bbc}}, Y: Field{[10]uint32{0x00046fec, 0x0257dad4, 0x03a1ba49, 0x01c82d48, 0x02e32431, 0x0051823b, 0x02969298, 0x029644c8, 0x02d45f08, 0x00179247}}}, + {X: Field{[10]uint32{0x0062e5e4, 0x00b01eee, 0x02c2f7fb, 0x00ac4d6f, 0x00fc4ce9, 0x022f89e0, 0x019c2896, 0x029d5f61, 0x01ede770, 0x00064ecf}}, Y: Field{[10]uint32{0x00716700, 0x0066d7bc, 0x0177522d, 0x01026031, 0x02d1d1d7, 0x02378155, 0x01d5cd13, 0x01cd7828, 0x03baffbb, 0x00064b12}}}, + {X: Field{[10]uint32{0x001e8dc7, 0x0029f3a3, 0x02029e29, 0x02c389d5, 0x02054084, 0x01bfbbcf, 0x03b4fc82, 0x0113933c, 0x0075da6f, 0x00333e68}}, Y: Field{[10]uint32{0x0235a183, 0x02c83266, 0x03a67bf6, 0x0247ffa6, 0x020a5d64, 0x00208671, 0x020f0a23, 0x030c2e40, 0x004dccf2, 0x003413e1}}}, + {X: Field{[10]uint32{0x025b0140, 0x039eb3b4, 0x03831873, 0x02e5b738, 0x00d3ddff, 0x02614c82, 0x00ec69ef, 0x02ed0fd8, 0x025b1d69, 0x001fafa8}}, Y: Field{[10]uint32{0x03ec3d65, 0x00f9f293, 0x01d16fc8, 0x01d62557, 0x002a9483, 0x004e8fce, 0x031a47d0, 0x0358dd53, 0x02f2bf87, 0x00091502}}}, + {X: Field{[10]uint32{0x00a038c7, 0x004718e1, 0x02e45d71, 0x03af5ca6, 0x02674662, 0x00e11e2d, 0x03ff0380, 0x006c066d, 0x034ac2a3, 0x0000327a}}, Y: Field{[10]uint32{0x01f32240, 0x02f77b60, 0x016a6e26, 0x02cca744, 0x0312f6e8, 0x022b90a8, 0x032b90d7, 0x00fd3afb, 0x003dcaed, 0x001f8bb8}}}, + {X: Field{[10]uint32{0x01acd867, 0x03651bf9, 0x007b87fe, 0x00361b15, 0x02cd0b29, 0x03f61ed2, 0x0323bc5c, 0x013a7a9e, 0x020c08c8, 0x00115d5b}}, Y: Field{[10]uint32{0x00acdd1f, 0x0076829c, 0x00413461, 0x00b216c2, 0x0031326e, 0x01f705b4, 0x03984c3d, 0x03005cf6, 0x022ce577, 0x00270fd4}}}, + {X: Field{[10]uint32{0x03e3c0da, 0x0036dfc4, 0x0225ce4a, 0x039c42ae, 0x0359438d, 0x0197891d, 0x009e3416, 0x0358db1e, 0x008121be, 0x0006f561}}, Y: Field{[10]uint32{0x0386a90b, 0x03d0d451, 0x008e7350, 0x035e5627, 0x00ffd4d6, 0x001e1d0c, 0x028a7b75, 0x014e658e, 0x0097bf90, 0x0032c3ae}}}, + {X: Field{[10]uint32{0x01324dc1, 0x01f3b676, 0x00063054, 0x038333e9, 0x0032eda7, 0x01677663, 0x02a80a97, 0x026e9612, 0x022c8e80, 0x003c6655}}, Y: Field{[10]uint32{0x0008d1d0, 0x026b1ead, 0x00f32400, 0x0047374e, 0x022f7ea8, 0x00f28537, 0x01dbcea3, 0x00126252, 0x02ad7643, 0x000cd467}}}, + {X: Field{[10]uint32{0x005ea6f3, 0x00f4f53d, 0x03559674, 0x03a61372, 0x02975319, 0x00162548, 0x02ac3b93, 0x01f707d5, 0x0110e9e3, 0x001fed3a}}, Y: Field{[10]uint32{0x03c960ee, 0x00341399, 0x0062855f, 0x029ef553, 0x005f4d94, 0x038c80f7, 0x02b59bcf, 0x03b273cd, 0x003c0cdb, 0x0002dd28}}}, + {X: Field{[10]uint32{0x006c03e6, 0x03ea7fa2, 0x031364c6, 0x0229ae73, 0x03c1a1d6, 0x0137108c, 0x02270205, 0x0275e2b2, 0x00fd1983, 0x00140f42}}, Y: Field{[10]uint32{0x02448e0a, 0x00def463, 0x02f77589, 0x0355f10d, 0x02698459, 0x01cf48f7, 0x01059144, 0x03ae1ef6, 0x01db9a09, 0x00212b65}}}, + {X: Field{[10]uint32{0x01e1e713, 0x025820d4, 0x02c25091, 0x032390be, 0x0162db42, 0x021c5629, 0x02d0deac, 0x034f8961, 0x0204e6ae, 0x000cd724}}, Y: Field{[10]uint32{0x00c1c2f9, 0x027c2b3d, 0x01ce67ef, 0x01774d06, 0x0049b60c, 0x004bf761, 0x00849d42, 0x02fb8a50, 0x01bb10f8, 0x00056cd6}}}, + {X: Field{[10]uint32{0x0034bc9f, 0x01104d0a, 0x035ef30c, 0x0262738f, 0x00f218c2, 0x01c82ed4, 0x01117df5, 0x00567e08, 0x01cbe0f7, 0x002e9a39}}, Y: Field{[10]uint32{0x00fa5d72, 0x01ef2510, 0x017f3ca5, 0x011dc719, 0x03101ff4, 0x0104a8a1, 0x005a2ede, 0x01393bfd, 0x03dd0ff3, 0x000ab096}}}, + {X: Field{[10]uint32{0x037e6baa, 0x017b0821, 0x03a0a02a, 0x010e8791, 0x03446d79, 0x00e71252, 0x00202677, 0x0210c163, 0x0313311d, 0x0024f5b9}}, Y: Field{[10]uint32{0x001a0856, 0x01a99748, 0x0324fdb5, 0x0055f353, 0x01e10bf6, 0x02d427e7, 0x00710410, 0x03f49b81, 0x019c99a2, 0x001665f0}}}, + {X: Field{[10]uint32{0x03397172, 0x01402917, 0x00c22ac7, 0x009a3b30, 0x00cb8f46, 0x031746da, 0x0284fbe0, 0x01e829ce, 0x001b5cc7, 0x001ea52f}}, Y: Field{[10]uint32{0x0178bee5, 0x03dad341, 0x02cef34a, 0x025405b7, 0x03032d36, 0x02fb7d34, 0x01c9f8c1, 0x0354a9c6, 0x006e82a4, 0x0004a307}}}, + {X: Field{[10]uint32{0x0021b809, 0x00f165b2, 0x01c54c21, 0x00b6eb2b, 0x0375fbe5, 0x01bcf919, 0x02ec848f, 0x020f6517, 0x01a7c193, 0x003c0c7b}}, Y: Field{[10]uint32{0x03cabab8, 0x0031dd88, 0x03ea0517, 0x00dabe5a, 0x01eb505d, 0x0394bc65, 0x001e2e7e, 0x0393d76e, 0x010d1c17, 0x002d29e3}}}, + {X: Field{[10]uint32{0x0039907c, 0x02df5c08, 0x0360857a, 0x01d58329, 0x010ce9f3, 0x01d34065, 0x00cb924c, 0x03820b75, 0x02cd5c17, 0x0021bbc6}}, Y: Field{[10]uint32{0x00f3bb3c, 0x0383b093, 0x03de1ef7, 0x0172731d, 0x0136c310, 0x01b559cf, 0x02d34b10, 0x022b2509, 0x013db907, 0x001a4da8}}}, + {X: Field{[10]uint32{0x03c6d720, 0x005ad832, 0x00bc9409, 0x0324aac4, 0x006d24ee, 0x00a853ee, 0x039beeb6, 0x00e8d526, 0x00c9c78e, 0x003f3adb}}, Y: Field{[10]uint32{0x03f7583d, 0x005e1cdd, 0x0162f08b, 0x024ba9d5, 0x009f8d92, 0x004b2946, 0x03697015, 0x007c7382, 0x00245f56, 0x001f0b98}}}, + {X: Field{[10]uint32{0x03a5c8d9, 0x0084fbb7, 0x00f3ecd2, 0x01b8ec50, 0x00d475e3, 0x02bf90e0, 0x0026d837, 0x03cd207d, 0x011b9a36, 0x0028767b}}, Y: Field{[10]uint32{0x03a558a0, 0x016fc1f7, 0x00c6007d, 0x00ef9aaa, 0x0078bd5e, 0x03a7fb95, 0x002cb779, 0x00fca7b0, 0x017ca127, 0x000da0f2}}}, + {X: Field{[10]uint32{0x01bd48c7, 0x03e43814, 0x03dac844, 0x0269dfac, 0x013e8f62, 0x022bff28, 0x01bbdc75, 0x03b55785, 0x01996311, 0x0036637a}}, Y: Field{[10]uint32{0x00ef2a22, 0x01127ca1, 0x037cc07d, 0x014e5a75, 0x02693943, 0x01de3970, 0x011b8100, 0x023b9da3, 0x014d272a, 0x0022bd86}}}, + {X: Field{[10]uint32{0x019aac60, 0x022e8fea, 0x023edbee, 0x008e625e, 0x0060f4d2, 0x0197e014, 0x031ba80d, 0x03e8a6db, 0x01b7cd6a, 0x001e0ca3}}, Y: Field{[10]uint32{0x02fc5efb, 0x031ea79d, 0x02f01f35, 0x02171265, 0x02629f81, 0x0384d910, 0x023377f4, 0x00eb1204, 0x016f1d14, 0x0038df92}}}, + {X: Field{[10]uint32{0x0336db5e, 0x0347d9b8, 0x02117223, 0x033f36c9, 0x005d9747, 0x02ca7b9b, 0x001e1c09, 0x02bc2cdf, 0x0093031f, 0x000f5c05}}, Y: Field{[10]uint32{0x037600ad, 0x033474f9, 0x008b6648, 0x0316e1fe, 0x03414ea3, 0x02d3a774, 0x01f7ce0a, 0x02c82ad0, 0x01408311, 0x00347a64}}}, + {X: Field{[10]uint32{0x02288628, 0x03dd8ab3, 0x03a96e90, 0x021bf6fd, 0x000e2239, 0x02953b31, 0x015ba2a7, 0x0352ac2f, 0x00c047e0, 0x003d866b}}, Y: Field{[10]uint32{0x001564f2, 0x013b299e, 0x01de68fa, 0x037f3bed, 0x02f9cdcc, 0x039ff07b, 0x016a2d70, 0x017443f2, 0x023de154, 0x003c93ad}}}, + {X: Field{[10]uint32{0x02d0a2d2, 0x02f0032a, 0x03489a1d, 0x00d678be, 0x0291718f, 0x03de5ff3, 0x004a8514, 0x016800cd, 0x01b871f8, 0x00332a02}}, Y: Field{[10]uint32{0x0090b037, 0x0047045a, 0x012f712b, 0x03b4e0a6, 0x03aba642, 0x007d8be5, 0x018f260a, 0x020d6489, 0x02b83565, 0x002df5ca}}}, + {X: Field{[10]uint32{0x01c81958, 0x00fb471f, 0x03eeaa7d, 0x016d4706, 0x01aa26c4, 0x003ee851, 0x034eec03, 0x014076be, 0x0366ee2c, 0x002ef465}}, Y: Field{[10]uint32{0x035250fa, 0x03c6b3f7, 0x03cfeb98, 0x033b0cbb, 0x036c1ca4, 0x01c9110b, 0x030a6e89, 0x0184b9f3, 0x01ff70b3, 0x002f1c27}}}, + {X: Field{[10]uint32{0x001cfadd, 0x01352bfb, 0x025f79c3, 0x03a0e9a2, 0x01ca8f0e, 0x01912a97, 0x03a19381, 0x02065c99, 0x00a0e4a5, 0x001a9bf7}}, Y: Field{[10]uint32{0x02732081, 0x0145fa74, 0x00c36db6, 0x01bf2b6c, 0x006bd7ff, 0x01faf31c, 0x0104298d, 0x01495730, 0x02367658, 0x0030a2c4}}}, + {X: Field{[10]uint32{0x035c8006, 0x014c85b7, 0x00be02c5, 0x00ac05e9, 0x029564af, 0x014bc2b7, 0x03d693de, 0x00688bb9, 0x03e1fd40, 0x000248b8}}, Y: Field{[10]uint32{0x0088f757, 0x03ac7105, 0x004aa3b9, 0x031c82e5, 0x03696841, 0x032a2889, 0x0379e0c5, 0x012902e6, 0x0065aae8, 0x0029ec40}}}, + {X: Field{[10]uint32{0x0276eac8, 0x020be629, 0x01490383, 0x036b5225, 0x03aff8a6, 0x00f2f4ec, 0x02bd9dae, 0x02d54fe4, 0x024e3526, 0x0014ffeb}}, Y: Field{[10]uint32{0x01f8c6f4, 0x0390fb66, 0x03d23cfd, 0x024b115b, 0x009e6652, 0x033a183b, 0x023b2228, 0x0202e0f4, 0x00aeb51f, 0x00207f7f}}}, + {X: Field{[10]uint32{0x0203d119, 0x009e1882, 0x015b9772, 0x031ad574, 0x027c2e70, 0x00a73f92, 0x03e70289, 0x025be274, 0x01d1c945, 0x00052837}}, Y: Field{[10]uint32{0x036dd086, 0x03c7efa5, 0x02e83806, 0x03bed663, 0x007e8c94, 0x00f71956, 0x03e14835, 0x0074777d, 0x0071febe, 0x000ad770}}}, + {X: Field{[10]uint32{0x0168c8f9, 0x0143c78f, 0x03f4dc01, 0x00a9ce7b, 0x00bebe27, 0x032bcee4, 0x01a25428, 0x03cd6ed4, 0x000dfb74, 0x001cda09}}, Y: Field{[10]uint32{0x00a7a27f, 0x02ea17b9, 0x03cd8fd2, 0x01cac572, 0x0321801a, 0x031191a7, 0x00c71687, 0x03a0b9dd, 0x0317b4c5, 0x00254e4a}}}, + {X: Field{[10]uint32{0x00580560, 0x00340408, 0x0079e640, 0x0041ef16, 0x035fbdb6, 0x0105a217, 0x016825e2, 0x02ce748e, 0x0053b9ea, 0x001302a0}}, Y: Field{[10]uint32{0x03db5427, 0x02a5eef5, 0x002f093c, 0x0099820f, 0x02f5a6f8, 0x01022de7, 0x03f67f65, 0x0394c985, 0x02a75b7d, 0x00216888}}}, + {X: Field{[10]uint32{0x01dabbf8, 0x00c814cf, 0x00a1e91e, 0x01abd5e4, 0x026751a2, 0x00cf7f2c, 0x01447a49, 0x03e2b2f6, 0x02a824a6, 0x00328359}}, Y: Field{[10]uint32{0x01395d18, 0x003cca5e, 0x016b2155, 0x0020297c, 0x036f7d7d, 0x03bc0790, 0x01fd49b1, 0x00211447, 0x018d4f8b, 0x00187322}}}, + {X: Field{[10]uint32{0x01e9d6d4, 0x01629b95, 0x03a76453, 0x03dcd572, 0x01a3d7df, 0x031fec20, 0x020763b5, 0x01a8db54, 0x0375e62f, 0x00191a81}}, Y: Field{[10]uint32{0x037dbbb4, 0x006807de, 0x026f7a6b, 0x011b85f1, 0x01b11000, 0x00b24dbe, 0x01b23662, 0x00299083, 0x0044e738, 0x000f94a2}}}, + {X: Field{[10]uint32{0x0055d070, 0x000c00d9, 0x007f2303, 0x00faa044, 0x01bac77f, 0x0014b69c, 0x02d7c477, 0x02f04c50, 0x01ecf3d6, 0x0010d559}}, Y: Field{[10]uint32{0x00c9f6bd, 0x027ad369, 0x02d159fa, 0x01706ba5, 0x03ab6edc, 0x027c31c3, 0x03ca8f6c, 0x023658d0, 0x009689fd, 0x0013b54a}}}, + {X: Field{[10]uint32{0x03aa8f9d, 0x029d82e4, 0x0316fff6, 0x02b000dc, 0x037a014a, 0x018171a4, 0x01f22fee, 0x01512a94, 0x00969328, 0x00362c06}}, Y: Field{[10]uint32{0x0206edf3, 0x03dc964e, 0x020ac989, 0x020b9318, 0x01dd4127, 0x00525ed7, 0x0160719c, 0x01e6b4db, 0x0242a2b8, 0x0018fd47}}}, + {X: Field{[10]uint32{0x023d48d7, 0x039511b5, 0x0399a21e, 0x02ed1fc1, 0x0283a30a, 0x03c60b97, 0x02f6f2b6, 0x00c14a52, 0x01504a9b, 0x002e51d6}}, Y: Field{[10]uint32{0x002fb876, 0x0241a243, 0x01018042, 0x01f0d2b8, 0x02968027, 0x038d62b5, 0x03896769, 0x0266fde6, 0x002837a8, 0x0032f1d0}}}, + {X: Field{[10]uint32{0x038e0ef0, 0x01a89c7f, 0x02f0fc3e, 0x019c6c98, 0x01d521b4, 0x0121084d, 0x0201b5e3, 0x0356fb16, 0x00492972, 0x00050c5f}}, Y: Field{[10]uint32{0x02069381, 0x02419470, 0x006cfc20, 0x027930d2, 0x01d318e7, 0x036d20f6, 0x02a476a7, 0x033f48b9, 0x0235d1ce, 0x00331348}}}, + {X: Field{[10]uint32{0x0144f8c6, 0x03753927, 0x005f8fcd, 0x01cd3a57, 0x0278c4b8, 0x0224a354, 0x0062ab33, 0x019fd13c, 0x03575b68, 0x0022ef6c}}, Y: Field{[10]uint32{0x0173a778, 0x025fccd4, 0x019fa90b, 0x028bb86d, 0x021279ec, 0x01f40398, 0x01a67e6c, 0x01015301, 0x03873242, 0x0034e34c}}}, + {X: Field{[10]uint32{0x006aa685, 0x002c643c, 0x014761ab, 0x03e53b4c, 0x03380b00, 0x0265b035, 0x0279786b, 0x02f9e024, 0x02f636ec, 0x001ddd7f}}, Y: Field{[10]uint32{0x0355407b, 0x025bafcb, 0x018e12a9, 0x014cae0c, 0x00342431, 0x02e21711, 0x0257d7fc, 0x03596773, 0x0273162d, 0x0014c54a}}}, + {X: Field{[10]uint32{0x01693b48, 0x0247030e, 0x0242ba74, 0x02955143, 0x00bc9b0e, 0x0279cbed, 0x02649502, 0x038ddef2, 0x03d139eb, 0x0036d792}}, Y: Field{[10]uint32{0x005a0abb, 0x025399b3, 0x00e62141, 0x003af6f9, 0x00416ca2, 0x00e209f7, 0x037ceb32, 0x025ab68c, 0x0113a5a7, 0x002991a0}}}, + {X: Field{[10]uint32{0x01c619eb, 0x013fc47c, 0x020fc241, 0x00c5c255, 0x016ebf06, 0x03c1a73c, 0x0011be39, 0x014b8bab, 0x03b0578c, 0x003aac15}}, Y: Field{[10]uint32{0x01023f67, 0x036d157f, 0x01f750cd, 0x03386031, 0x006fb041, 0x030b787a, 0x00e5c6c3, 0x02e2a116, 0x023fcf69, 0x00150880}}}, + {X: Field{[10]uint32{0x03f5e44c, 0x00460ff9, 0x02fe6d02, 0x00c90639, 0x02c231ba, 0x01944ccf, 0x02d43cc0, 0x035845f8, 0x00d3c657, 0x003a557f}}, Y: Field{[10]uint32{0x028e6b57, 0x008a3d20, 0x02369cfe, 0x03f2cb8d, 0x02973095, 0x0311b176, 0x014953a4, 0x00bc9c91, 0x02986521, 0x003743aa}}}, + {X: Field{[10]uint32{0x002d8e49, 0x01fe46c1, 0x027a72a0, 0x01cfabec, 0x03ec0f5e, 0x00759817, 0x011f596f, 0x03f0c30c, 0x005758ea, 0x0017d68f}}, Y: Field{[10]uint32{0x01cdf1a2, 0x00fbca97, 0x0090ccf2, 0x017a132a, 0x01c6d9f5, 0x02914dbd, 0x005a04aa, 0x02cbaa76, 0x00b01d1f, 0x0000f378}}}, + {X: Field{[10]uint32{0x00b99bab, 0x00b64902, 0x019c0757, 0x03c9ab48, 0x0049c82c, 0x0012bc46, 0x03fbd7ae, 0x03787bbf, 0x01e4ff0a, 0x003ede8c}}, Y: Field{[10]uint32{0x01df2a01, 0x00ac1fcc, 0x0345a550, 0x00b01cd8, 0x039e6910, 0x03918f75, 0x006bc4eb, 0x0395fbba, 0x020c431d, 0x003aa1ea}}}, + {X: Field{[10]uint32{0x03ae1ffb, 0x005de352, 0x02b44e41, 0x00f79ac8, 0x036ec18d, 0x020fb8e8, 0x01f8dd96, 0x01dde52e, 0x016aa3e8, 0x00355ec7}}, Y: Field{[10]uint32{0x000f62ee, 0x0235eaf7, 0x008ca73f, 0x015c08b6, 0x009fcb9e, 0x00f32ebb, 0x01adb0e4, 0x034bc027, 0x02d6b85b, 0x00095bff}}}, + {X: Field{[10]uint32{0x03b8f1a6, 0x02b15232, 0x00b5bbd6, 0x00cb1c2f, 0x030f7268, 0x020da5ec, 0x00fc90e1, 0x0128e3bc, 0x0052d3a2, 0x0024c9bf}}, Y: Field{[10]uint32{0x02889a2b, 0x01629bc4, 0x0330801a, 0x03095355, 0x00d7d766, 0x0267ebea, 0x01176f5c, 0x00afab48, 0x00a0cc0a, 0x00218ef4}}}, + {X: Field{[10]uint32{0x013caff4, 0x01e6d2ea, 0x036da360, 0x0354c4fb, 0x03d5d310, 0x0082b421, 0x0217e946, 0x02d7995d, 0x00d5abc9, 0x00160d8b}}, Y: Field{[10]uint32{0x022fc52f, 0x012350bd, 0x021c03da, 0x03cf098b, 0x03d6923c, 0x0390c88c, 0x03b673b2, 0x02ef635c, 0x00044e86, 0x00017ca9}}}, + {X: Field{[10]uint32{0x001738ee, 0x03f3a061, 0x03681034, 0x01a5fa68, 0x01b8c4cd, 0x02cc6358, 0x001b3a96, 0x039a3c38, 0x00b9cd06, 0x001f7522}}, Y: Field{[10]uint32{0x019782cf, 0x0267af82, 0x0010f34a, 0x03414998, 0x00d963de, 0x00f4a4a8, 0x0370846a, 0x03225f2d, 0x01ed0130, 0x003f5ea9}}}, + {X: Field{[10]uint32{0x00fe798d, 0x01419003, 0x0061df95, 0x0091aea0, 0x011fa2a3, 0x00ed05c1, 0x030d7d5a, 0x005550cc, 0x0302524c, 0x0026fde2}}, Y: Field{[10]uint32{0x00cf5a83, 0x009d5224, 0x00f48104, 0x0215da59, 0x00c7d063, 0x02d08672, 0x01d5a703, 0x01a0075e, 0x03d66d2e, 0x00167d4d}}}, + {X: Field{[10]uint32{0x02b3fc47, 0x00f70d83, 0x03c39366, 0x02dbbbaf, 0x00e71513, 0x02ef5b47, 0x01b4f879, 0x03572c63, 0x0173743a, 0x0013205a}}, Y: Field{[10]uint32{0x0141105f, 0x010b6243, 0x00254ab1, 0x03af545b, 0x0044c6f8, 0x0003e594, 0x033ef09f, 0x025002a4, 0x02ac37a4, 0x00069b71}}}, + {X: Field{[10]uint32{0x01051be8, 0x00715bec, 0x031a835c, 0x0169fc00, 0x00173f4e, 0x003ce89b, 0x02964084, 0x018d0d64, 0x03c2c748, 0x001818da}}, Y: Field{[10]uint32{0x03e88e8b, 0x03763d76, 0x01b08541, 0x01adf3e0, 0x020efc2e, 0x0346f95b, 0x024190b0, 0x00af25c2, 0x037a3aed, 0x001c69e2}}}, + {X: Field{[10]uint32{0x03f8d00a, 0x01e83cc1, 0x00a2f004, 0x00dd0329, 0x03122115, 0x03579b34, 0x0263fc94, 0x0029c1b1, 0x02dec3e9, 0x0029b9dc}}, Y: Field{[10]uint32{0x00eed520, 0x029f1cf4, 0x032ca76b, 0x00875e30, 0x00f10902, 0x002a87ae, 0x02175a81, 0x01c60529, 0x021f5c72, 0x00096e3f}}}, + {X: Field{[10]uint32{0x00b89262, 0x00c9395f, 0x026c9019, 0x004c598c, 0x031692f6, 0x02a2feeb, 0x03b4b2aa, 0x01c857ea, 0x013c6030, 0x001e7199}}, Y: Field{[10]uint32{0x02197bcb, 0x039fb4b4, 0x028f8db1, 0x00f08138, 0x03c24eaa, 0x0025572f, 0x0379da4c, 0x02525b8a, 0x0112b6b4, 0x000db57b}}}, + {X: Field{[10]uint32{0x0246cb15, 0x02a151b5, 0x0242ed4b, 0x013aaaf6, 0x034a2bdb, 0x03911530, 0x0374af4c, 0x03eb7b51, 0x032e4530, 0x000fd55a}}, Y: Field{[10]uint32{0x00fd25c3, 0x00a4e27b, 0x039e0588, 0x0360e5f3, 0x02c9fd04, 0x01717138, 0x028996bf, 0x010cc4ef, 0x03211ce8, 0x002eac74}}}, + {X: Field{[10]uint32{0x03b3913a, 0x009cedcf, 0x01dd93b7, 0x00abce18, 0x02d645c5, 0x03dcc7f8, 0x011e0fbc, 0x03fa7d78, 0x02238d21, 0x003b6966}}, Y: Field{[10]uint32{0x012bbfee, 0x006e6a1c, 0x02562416, 0x015d032c, 0x03d3cea8, 0x01d6dfad, 0x0029c06d, 0x0082e0b3, 0x03014ba3, 0x0008bc8b}}}, + {X: Field{[10]uint32{0x01e68548, 0x02909e5f, 0x02cb0c42, 0x00aea7d8, 0x033a2bea, 0x01c753c0, 0x0158adf0, 0x03ed3cda, 0x0277323d, 0x0001e87a}}, Y: Field{[10]uint32{0x024825a0, 0x030fc809, 0x01940f6c, 0x0147dbd0, 0x006d2d7f, 0x00984c63, 0x036f9766, 0x00ad7689, 0x0225ee7a, 0x001219b3}}}, + {X: Field{[10]uint32{0x0323de2a, 0x0330f668, 0x00178a0e, 0x023d8b57, 0x0233d102, 0x02421db8, 0x027c51d5, 0x035b42eb, 0x013aad62, 0x0002b43f}}, Y: Field{[10]uint32{0x003b0601, 0x0100e082, 0x02787a6d, 0x01f7b660, 0x01d16315, 0x01e4b5d8, 0x034a64eb, 0x011a7d53, 0x00c59672, 0x00223809}}}, + {X: Field{[10]uint32{0x002729d3, 0x001b3718, 0x00dfd207, 0x01c6358d, 0x03ee7437, 0x02e12972, 0x016e9d67, 0x0129a55b, 0x0032f404, 0x0006fc65}}, Y: Field{[10]uint32{0x00516aa9, 0x00710c1f, 0x0292263d, 0x0270fe93, 0x034f2acd, 0x01b0dfa6, 0x02f8e3e1, 0x028681d7, 0x0200afb6, 0x0010452c}}}, + {X: Field{[10]uint32{0x0121d93b, 0x008130b8, 0x019afc35, 0x017c4b48, 0x012fb1af, 0x0002da53, 0x023b9d5f, 0x036bea2f, 0x02f20bc2, 0x00145185}}, Y: Field{[10]uint32{0x022eaf9c, 0x01cb33e4, 0x0058a740, 0x02dc1140, 0x0257ba8e, 0x0196b6fc, 0x03f4e0a0, 0x00a673d9, 0x0253608a, 0x000f973b}}}, + {X: Field{[10]uint32{0x0121a661, 0x000b685a, 0x01a1c3b0, 0x00c1aa38, 0x00fdc423, 0x033fcd39, 0x0321d181, 0x03b4c64d, 0x00e85338, 0x00238ffb}}, Y: Field{[10]uint32{0x00f686d2, 0x01993e08, 0x03b2e077, 0x010e2ccc, 0x03128945, 0x032b267b, 0x02dfc249, 0x0121ad9d, 0x034b6736, 0x002c255c}}}, + {X: Field{[10]uint32{0x03ad4447, 0x0350e329, 0x03355916, 0x02682b98, 0x016db1eb, 0x0362882e, 0x00421867, 0x007b4a4a, 0x0020df10, 0x0011b01a}}, Y: Field{[10]uint32{0x01f1afa9, 0x031eaf37, 0x0226f9ac, 0x01606f3f, 0x01d7d439, 0x0051ed4d, 0x00d1b601, 0x02dcff12, 0x00f4059b, 0x003f2a84}}}, + {X: Field{[10]uint32{0x03722b31, 0x031f6ff3, 0x02dba0fe, 0x01a470bb, 0x013fff8c, 0x02cdebdc, 0x001e406a, 0x00e42ac0, 0x01f71f9b, 0x00158cd3}}, Y: Field{[10]uint32{0x026707dc, 0x01082f1c, 0x006904af, 0x031011d1, 0x038a3724, 0x01269b24, 0x03c4b0bf, 0x03055a9c, 0x0394340d, 0x0008b410}}}, + {X: Field{[10]uint32{0x00a67c4f, 0x020998c3, 0x03d37cb8, 0x03e86d72, 0x03b2fd55, 0x03294b48, 0x03e3dc97, 0x017e3276, 0x006d8904, 0x00080b89}}, Y: Field{[10]uint32{0x017a62b1, 0x039ec828, 0x033659a2, 0x038d44f2, 0x027a6241, 0x0116201c, 0x01f661ec, 0x03c08c72, 0x03899cbc, 0x003d39b3}}}, + {X: Field{[10]uint32{0x039bd4d5, 0x008e7a66, 0x0009dece, 0x01735979, 0x03c56b63, 0x00d54bbf, 0x03c1ff94, 0x0070b3d6, 0x02e01021, 0x00320153}}, Y: Field{[10]uint32{0x03f31057, 0x008a09c5, 0x0046b46e, 0x034419e3, 0x010bf1eb, 0x02e152c1, 0x02842b43, 0x0072f379, 0x01af5160, 0x003d4145}}}, + {X: Field{[10]uint32{0x00438383, 0x00954e05, 0x004f51c6, 0x02b95be6, 0x01ea3282, 0x02e5c068, 0x01407084, 0x02d86b4a, 0x008c235e, 0x00270a5e}}, Y: Field{[10]uint32{0x0359ead7, 0x01c3b125, 0x0286c2ab, 0x010a6774, 0x00c116cc, 0x02b4c38c, 0x02469db4, 0x03bcb88d, 0x02ecefdb, 0x000c8447}}}, + {X: Field{[10]uint32{0x01a57ef8, 0x005d1706, 0x009e74bc, 0x008cd9d4, 0x02729990, 0x02530f35, 0x028dc86f, 0x030e51c1, 0x00d0b7b5, 0x0016153a}}, Y: Field{[10]uint32{0x023eb98d, 0x02dd72e9, 0x005f2345, 0x001505f5, 0x00edafec, 0x03834b4f, 0x00c41134, 0x02faf7d4, 0x01c50c06, 0x001f9e40}}}, + {X: Field{[10]uint32{0x033fef34, 0x03ea247d, 0x010b74d0, 0x03767239, 0x011104a5, 0x0151e913, 0x0046e1b3, 0x039e2681, 0x03f0f45b, 0x0022ecbf}}, Y: Field{[10]uint32{0x03b182c1, 0x02a45cdc, 0x03a7935d, 0x037dc888, 0x03efb979, 0x00e0fdd9, 0x0171e2bc, 0x00fa99b1, 0x0365a534, 0x0030ccb8}}}, + {X: Field{[10]uint32{0x00cd209e, 0x022d5863, 0x033c45ad, 0x015b71cc, 0x02992f56, 0x02d90f36, 0x0165faac, 0x00ce1e18, 0x02656ee4, 0x0003aa23}}, Y: Field{[10]uint32{0x01f0f909, 0x02a0e897, 0x006f1fd0, 0x012a10e6, 0x02af9f4f, 0x0115c971, 0x03357ab8, 0x00d0f62a, 0x00d64a7a, 0x0030e310}}}, + {X: Field{[10]uint32{0x0046295a, 0x0075aa51, 0x01ff6698, 0x02e33236, 0x02a3b18a, 0x00352e8a, 0x0322c2ee, 0x01fa984c, 0x00df857c, 0x00303075}}, Y: Field{[10]uint32{0x0172b981, 0x00bf8167, 0x02918729, 0x0123aede, 0x029a2846, 0x0326f91a, 0x02ae1dbe, 0x03bdf739, 0x01d10e8e, 0x00091c45}}}, + {X: Field{[10]uint32{0x007fc72a, 0x0380a33b, 0x0265db74, 0x0049e4ae, 0x0267b8e2, 0x02dc8faf, 0x0008d8dd, 0x00d800aa, 0x00f9407d, 0x002479a9}}, Y: Field{[10]uint32{0x005721ba, 0x0394104f, 0x0299547e, 0x02ed1e92, 0x0212e57d, 0x00841b82, 0x00e98f7b, 0x022fa173, 0x016035f5, 0x003bdab9}}}, + {X: Field{[10]uint32{0x03208454, 0x0253823e, 0x03078187, 0x000b8873, 0x0224a7a4, 0x020340d9, 0x015cf613, 0x0074d8a6, 0x02189a8c, 0x00335d25}}, Y: Field{[10]uint32{0x03af0bd9, 0x00b17b72, 0x024f6ba0, 0x00bc748e, 0x022dd6ba, 0x022bf2ae, 0x03debcf8, 0x03e44a80, 0x02be15d1, 0x003cf724}}}, + {X: Field{[10]uint32{0x02943018, 0x01d4bfe0, 0x015e9f71, 0x0196bc28, 0x0285f630, 0x013ac929, 0x004f3fa4, 0x0239c30c, 0x012d02e6, 0x00267d74}}, Y: Field{[10]uint32{0x020b8a9e, 0x01a37076, 0x01dfb611, 0x020091b5, 0x01dff9f9, 0x0028a5ec, 0x03962c9c, 0x02fccda3, 0x021ad97e, 0x00167c64}}}, + {X: Field{[10]uint32{0x01f7608f, 0x03580aee, 0x02dff7b3, 0x036e77ae, 0x01a6ac02, 0x01745c64, 0x0256b1e7, 0x01c25845, 0x0130f9c0, 0x0018f1b3}}, Y: Field{[10]uint32{0x021083f0, 0x00fffbd1, 0x017234b7, 0x03d03b9c, 0x006d8b1e, 0x02add6f9, 0x025f0a13, 0x006e3f83, 0x037370a4, 0x000b90e4}}}, + {X: Field{[10]uint32{0x01184d92, 0x0357a5d7, 0x01e9394c, 0x011c602c, 0x019e04fe, 0x01f9b06c, 0x037fc551, 0x03a84766, 0x032690a5, 0x002dd01f}}, Y: Field{[10]uint32{0x013de6d2, 0x0233df54, 0x0301aaed, 0x0200f835, 0x03828ee8, 0x0299e5b9, 0x020f7277, 0x012611d0, 0x012947dd, 0x0006e54e}}}, + {X: Field{[10]uint32{0x0383fd40, 0x03e69b78, 0x02297150, 0x023761ad, 0x02c29ce4, 0x01e94015, 0x0121e962, 0x02210375, 0x0116161c, 0x000925e4}}, Y: Field{[10]uint32{0x00b9a70b, 0x03826c0a, 0x03649143, 0x010fdee8, 0x0076f999, 0x03ec5992, 0x00d3e325, 0x0273dce1, 0x01ab3dd6, 0x0004f75c}}}, + {X: Field{[10]uint32{0x01d73b7d, 0x037a3dfe, 0x0196b6f2, 0x00651943, 0x030b4199, 0x03210542, 0x016c80d4, 0x02c9e219, 0x02c36122, 0x003c426d}}, Y: Field{[10]uint32{0x011c96ac, 0x03ab575e, 0x01c77142, 0x01ad284f, 0x01bd971f, 0x02525be1, 0x0291d4a3, 0x03553702, 0x0369bef8, 0x0029d15c}}}, + {X: Field{[10]uint32{0x01118df9, 0x038edb5a, 0x015169f0, 0x000289ad, 0x0136be99, 0x03ef42b0, 0x017c9297, 0x030dc13c, 0x03f82031, 0x00166cc0}}, Y: Field{[10]uint32{0x03d678c3, 0x0197af4b, 0x01e02d6c, 0x01b431a5, 0x01983030, 0x00d41a30, 0x008c936b, 0x009c696b, 0x00dd1666, 0x000c31f1}}}, + {X: Field{[10]uint32{0x0062fc52, 0x00e5d3b5, 0x02cd6602, 0x006b4afd, 0x01a67862, 0x01ee2132, 0x0254cd6c, 0x00436d2e, 0x019aeb39, 0x001989cd}}, Y: Field{[10]uint32{0x0110d487, 0x03115f6a, 0x010b2555, 0x0377a93d, 0x00feab83, 0x024de5de, 0x00867347, 0x01e29ff1, 0x01bad2de, 0x002f2f3e}}}, + {X: Field{[10]uint32{0x0151f1d9, 0x009e16b7, 0x0281e921, 0x00104610, 0x00ec7efc, 0x003a062b, 0x01d23059, 0x0141f672, 0x0180c4fb, 0x001dbf6b}}, Y: Field{[10]uint32{0x03a8c346, 0x03b376f8, 0x0119a18c, 0x0035ff27, 0x039b88b7, 0x01566156, 0x00adf7ef, 0x03cc1fcd, 0x03cc349c, 0x00332331}}}, + {X: Field{[10]uint32{0x01313330, 0x00ede478, 0x00700b98, 0x032d30a2, 0x037f2380, 0x02a6ebf6, 0x03ed9cc4, 0x03c2294b, 0x0006e99c, 0x0001e24d}}, Y: Field{[10]uint32{0x0111d149, 0x03e02bc9, 0x0007450e, 0x00ede96e, 0x00d0c2e8, 0x02f56e3b, 0x001acd3f, 0x03f96b42, 0x01af39ea, 0x003b0578}}}, + {X: Field{[10]uint32{0x038c81d5, 0x02c6e820, 0x039ff3bb, 0x033760e8, 0x01018f16, 0x003a0d3d, 0x013c229d, 0x0084cfb6, 0x02a4e8d0, 0x00031152}}, Y: Field{[10]uint32{0x03ac51f0, 0x00ecea1c, 0x01f5c67e, 0x039b7afd, 0x018af57b, 0x00a69b96, 0x00959245, 0x00e023d2, 0x01cf89c4, 0x002a6398}}}, + {X: Field{[10]uint32{0x02402880, 0x002d845c, 0x0327bf99, 0x03b8e55e, 0x0097dac1, 0x0108e404, 0x02ba8f96, 0x03048b74, 0x021ccbe5, 0x003fc2f0}}, Y: Field{[10]uint32{0x03bca50a, 0x0334e59d, 0x020da467, 0x03dc14a5, 0x01ecd634, 0x039117b0, 0x00cd5f89, 0x00860635, 0x009c1f7b, 0x00030d02}}}, + {X: Field{[10]uint32{0x0331c301, 0x00789e4d, 0x0373586f, 0x03a74fad, 0x003a0e61, 0x004ade3c, 0x0132e398, 0x0108ef60, 0x02e349a0, 0x00239121}}, Y: Field{[10]uint32{0x022053a1, 0x01ee6ca6, 0x0083ca8a, 0x02130422, 0x0116bbf0, 0x037088bb, 0x021866f4, 0x0098354b, 0x00d437cc, 0x00225ec9}}}, + {X: Field{[10]uint32{0x01c579e7, 0x03e96d13, 0x03584590, 0x01b04e11, 0x010bf7fb, 0x00d44227, 0x00a30d20, 0x0313a5ab, 0x017f84f5, 0x0013d329}}, Y: Field{[10]uint32{0x01e63a9e, 0x0094396b, 0x010b717d, 0x01d63ca3, 0x01336349, 0x0286e46a, 0x031cb1f8, 0x0155b0db, 0x03dc1691, 0x00354f6d}}}, + {X: Field{[10]uint32{0x03c203bb, 0x002ab633, 0x02423c76, 0x01bce22d, 0x0279b3a9, 0x02bb63ee, 0x00618300, 0x013ea417, 0x00b2d7a2, 0x003fa249}}, Y: Field{[10]uint32{0x00b056be, 0x033a8cb4, 0x0026a7e3, 0x02103ea3, 0x00e92c37, 0x02c5f82b, 0x0279df9c, 0x0038afd3, 0x0229c6be, 0x002f4c0f}}}, + {X: Field{[10]uint32{0x006abb5d, 0x03345371, 0x03fc5dcd, 0x028cc83c, 0x03008ed9, 0x014be66c, 0x005895d1, 0x031cbe1a, 0x035cf6a8, 0x000c267d}}, Y: Field{[10]uint32{0x02fc9f1c, 0x0082cba9, 0x000bc6fc, 0x0313038b, 0x0304a939, 0x02a570a9, 0x038a32c2, 0x014a7289, 0x002aec76, 0x003eed6f}}}, + {X: Field{[10]uint32{0x0072f4eb, 0x0170b727, 0x004b9741, 0x0088ab0e, 0x03432443, 0x00901727, 0x0232de01, 0x009bced9, 0x0383f841, 0x000ee4e7}}, Y: Field{[10]uint32{0x005607fb, 0x030932bc, 0x0255f1d3, 0x031fd22f, 0x01c1e602, 0x00e84e2d, 0x014cc202, 0x010e03a7, 0x0353ec45, 0x00210edc}}}, + {X: Field{[10]uint32{0x01c732d8, 0x03191b65, 0x009327b0, 0x025f5b4c, 0x00b032f1, 0x00e12a4e, 0x023cbc06, 0x038d1772, 0x02a04a50, 0x00371d41}}, Y: Field{[10]uint32{0x03d5772a, 0x0378e766, 0x039eae8d, 0x013ad88f, 0x01c6a39d, 0x0345bd0f, 0x039559a3, 0x02758a67, 0x0311f6d4, 0x003fa508}}}, + {X: Field{[10]uint32{0x03b30dea, 0x03483aa0, 0x01433f84, 0x03ed2af2, 0x003dde68, 0x01c875d7, 0x02fb61a2, 0x01a8d45c, 0x0196c699, 0x003d6931}}, Y: Field{[10]uint32{0x01f26572, 0x01a02ee7, 0x018e35ae, 0x00c3bdf7, 0x02fd783b, 0x034c2e58, 0x02ef9220, 0x03d8eeec, 0x013e77d2, 0x0005d783}}}, + {X: Field{[10]uint32{0x02a4029e, 0x02f87e6b, 0x03133cb9, 0x01a4098b, 0x01373c2f, 0x03de7d2c, 0x01222ae2, 0x00127f97, 0x00e2c499, 0x001fa40e}}, Y: Field{[10]uint32{0x0025c737, 0x01bccae0, 0x03dfe714, 0x012c888e, 0x031d7dc6, 0x015428d8, 0x00162766, 0x00d6f038, 0x026a3433, 0x000d64b9}}}, + {X: Field{[10]uint32{0x022b1f41, 0x01227ffd, 0x0050f0af, 0x00eb6482, 0x02e2cb80, 0x03e643ad, 0x0028e921, 0x03f1bf5b, 0x0373d16b, 0x00203c8b}}, Y: Field{[10]uint32{0x03503b28, 0x02f5df9e, 0x02d682a1, 0x00471c9b, 0x00370e67, 0x0133d360, 0x03e11fd2, 0x01d2f01c, 0x01d3c5ee, 0x0021c529}}}, + {X: Field{[10]uint32{0x020c897d, 0x021efebf, 0x03535fc8, 0x001f6748, 0x03007c31, 0x02e5bf82, 0x0070a58a, 0x014fe10d, 0x02e9e86e, 0x0012628a}}, Y: Field{[10]uint32{0x0001bb53, 0x033b4e99, 0x0209ec3c, 0x02754ee1, 0x037ec380, 0x02acc207, 0x020f6516, 0x01078509, 0x02b373e8, 0x0011eaa7}}}, + {X: Field{[10]uint32{0x033a010e, 0x0377cc0e, 0x03b6d960, 0x026a009d, 0x028e9c06, 0x029e31d1, 0x012c5427, 0x03861329, 0x024cd14c, 0x001806bd}}, Y: Field{[10]uint32{0x02b7fa18, 0x00734833, 0x00d59916, 0x026c00ef, 0x0156dd57, 0x00b21fbd, 0x0346c273, 0x01db4046, 0x023fca15, 0x000a4029}}}, + {X: Field{[10]uint32{0x0174a25b, 0x00d07fcb, 0x019849a1, 0x03c41775, 0x03957f2b, 0x008aa9a0, 0x018b06a8, 0x032f12b5, 0x00f07b2f, 0x0023ecb8}}, Y: Field{[10]uint32{0x01070aa4, 0x01a32d1d, 0x016e6b7c, 0x032427db, 0x0306137d, 0x0357e0ab, 0x03386f75, 0x01f3aac6, 0x03508d79, 0x001f3608}}}, + {X: Field{[10]uint32{0x0269e6d9, 0x03962bda, 0x0282c9bd, 0x02bebbcc, 0x0083468e, 0x01cb18ef, 0x01a14980, 0x0053a2d5, 0x000f0e9d, 0x000cdb5e}}, Y: Field{[10]uint32{0x023d2261, 0x008c8529, 0x00fb00b7, 0x01e7d3f8, 0x02ac3e66, 0x03f4061e, 0x02eba682, 0x02fb9ae3, 0x0004be45, 0x00024b44}}}, + {X: Field{[10]uint32{0x00d5872d, 0x011fbea4, 0x021a5e4e, 0x000f338f, 0x02b06343, 0x02c0eaba, 0x00d2cbdf, 0x021c113e, 0x0321f4d5, 0x00141eb1}}, Y: Field{[10]uint32{0x007174d9, 0x0348b20c, 0x02f0e917, 0x0254e72a, 0x009ba53c, 0x01ee0f58, 0x00550939, 0x00175e84, 0x018de7db, 0x002e268e}}}, + {X: Field{[10]uint32{0x033ba343, 0x01a22a51, 0x009a046e, 0x0132fa86, 0x00992c60, 0x019b004b, 0x0171026f, 0x03ee58a4, 0x02c13bb7, 0x00310b73}}, Y: Field{[10]uint32{0x014f7bb5, 0x007380b9, 0x0064be3c, 0x03b00d4d, 0x018fe010, 0x0104e4a7, 0x021bfe7c, 0x008f2e80, 0x0331a532, 0x0022a8dd}}}, + {X: Field{[10]uint32{0x02866a2c, 0x010651ca, 0x00417d9f, 0x02d9400e, 0x00857eed, 0x03144212, 0x026b5c45, 0x024e8b57, 0x02c3cd60, 0x002c0ba8}}, Y: Field{[10]uint32{0x03a5527c, 0x027049cb, 0x01bf86ac, 0x03a31d69, 0x03ed1d8e, 0x033f3a4e, 0x037c5058, 0x0243186e, 0x0050cea1, 0x003aed17}}}, + {X: Field{[10]uint32{0x0370d84b, 0x005f117b, 0x02db151e, 0x010566df, 0x0185626d, 0x03aad0ed, 0x03dc2c9a, 0x03b4b89c, 0x03d29f20, 0x003d3464}}, Y: Field{[10]uint32{0x02dd0974, 0x03946586, 0x027e7280, 0x01b1847a, 0x0101f84b, 0x0133695e, 0x013f8cf1, 0x00d28b12, 0x023f19b8, 0x002f6866}}}, + {X: Field{[10]uint32{0x025f1bb0, 0x01fed93f, 0x02857eef, 0x02ec7fdb, 0x03cc84f6, 0x0340c0b4, 0x0059b9e4, 0x0318add6, 0x00eb19ea, 0x0021d037}}, Y: Field{[10]uint32{0x03c6ca49, 0x023eda39, 0x01d1b1d9, 0x03780522, 0x00f2f151, 0x03ad4887, 0x01d5b6e7, 0x008168b8, 0x02b04783, 0x00029ca7}}}, + {X: Field{[10]uint32{0x00fcc9cb, 0x017a88e1, 0x03f6c92a, 0x0098da4e, 0x0050aec6, 0x011273a2, 0x010bc940, 0x027c2364, 0x024a85a2, 0x001e7b11}}, Y: Field{[10]uint32{0x02f53b39, 0x039a3a83, 0x03a2cd44, 0x01131896, 0x03a1d7c5, 0x0216aeb8, 0x02d476d0, 0x0342ca6a, 0x00f5b52e, 0x001df45c}}}, + {X: Field{[10]uint32{0x0207fceb, 0x03bf338c, 0x01238847, 0x03011622, 0x006fb3aa, 0x0157abf5, 0x000e29b2, 0x02edc72f, 0x00d5dd54, 0x0013c406}}, Y: Field{[10]uint32{0x03e7dd8c, 0x00bd938e, 0x0222224a, 0x0364b505, 0x03a64531, 0x01c7ef8e, 0x029b2a02, 0x030b9dce, 0x01e5d23c, 0x0030ca06}}}, + {X: Field{[10]uint32{0x03e969a1, 0x00181efe, 0x00eb033a, 0x02ae05e0, 0x00e53768, 0x032a1735, 0x0325de68, 0x03a17f76, 0x01362094, 0x0037efc6}}, Y: Field{[10]uint32{0x0380e563, 0x025f876b, 0x0067193d, 0x02eb82df, 0x00a2ca3a, 0x00cb7af3, 0x005f1e49, 0x00870cab, 0x035933ba, 0x00097a82}}}, + {X: Field{[10]uint32{0x01226649, 0x02ed06a1, 0x034f9b67, 0x01c41505, 0x010940a3, 0x02184912, 0x01805f10, 0x01a20cb0, 0x02c002c3, 0x00061319}}, Y: Field{[10]uint32{0x00662eaf, 0x03fb1f7e, 0x03487ec4, 0x016ea442, 0x00736f81, 0x03814c39, 0x034a24c1, 0x031e453e, 0x0244f1cf, 0x0033d8ff}}}, + {X: Field{[10]uint32{0x03043686, 0x01043d43, 0x022e0a0f, 0x0027d40c, 0x03ede9de, 0x02090b90, 0x01a8a51a, 0x03813b8e, 0x0206d386, 0x0036aacd}}, Y: Field{[10]uint32{0x0011718a, 0x01dc63b5, 0x015e5dbb, 0x0208ea75, 0x00fbb2b6, 0x03a3dba3, 0x010d0ac4, 0x01f441bf, 0x01c40ebe, 0x000302e8}}}, + {X: Field{[10]uint32{0x0204530f, 0x0330ce5f, 0x00dfa89d, 0x0059a408, 0x0026b0e2, 0x021234cd, 0x00219d1f, 0x03c94ae8, 0x034a5311, 0x0002a21f}}, Y: Field{[10]uint32{0x01edeace, 0x023de7e7, 0x03195287, 0x0113bb34, 0x02a5b4fa, 0x03680773, 0x029bff3e, 0x032b1fd0, 0x00bd8c37, 0x00169f01}}}, + {X: Field{[10]uint32{0x002d207a, 0x008fd85f, 0x0158d281, 0x001eca12, 0x024784a9, 0x0216bef3, 0x01dbfd5a, 0x03ae6135, 0x0264409f, 0x0006cc55}}, Y: Field{[10]uint32{0x03a205bb, 0x02715a2a, 0x01c37311, 0x02eaa66f, 0x0384eea5, 0x0165ff55, 0x001d4634, 0x02396961, 0x007cba34, 0x000a5cb3}}}, + {X: Field{[10]uint32{0x01fe4984, 0x037e85ac, 0x00d1f019, 0x027e0bb2, 0x016727e6, 0x035fa119, 0x035de1e0, 0x00355b57, 0x03d427c3, 0x000552b7}}, Y: Field{[10]uint32{0x020372b5, 0x0265dd4f, 0x02079981, 0x0312487c, 0x03882477, 0x01fe94b7, 0x01f61baa, 0x009e7912, 0x028a324b, 0x0016ea1b}}}, + {X: Field{[10]uint32{0x00480994, 0x03b03562, 0x02f9494f, 0x027ed130, 0x02585fe8, 0x02c6bcf0, 0x00df417c, 0x03057eca, 0x01f9fe55, 0x0037af5a}}, Y: Field{[10]uint32{0x03f9708d, 0x038f35d5, 0x03c9ef8d, 0x03fe4d17, 0x03002564, 0x03f3d85a, 0x031b8314, 0x01b493a2, 0x002155c1, 0x00263633}}}, + {X: Field{[10]uint32{0x03baf9e2, 0x01124abb, 0x0066b71d, 0x00f7edcb, 0x01e0316c, 0x01563119, 0x0055fc09, 0x0153e68a, 0x00902a7c, 0x0027f34d}}, Y: Field{[10]uint32{0x03f5d14c, 0x029a47fd, 0x00be51cf, 0x03a09926, 0x03143e1d, 0x0356ae99, 0x029e49c8, 0x02905a27, 0x0160c2b5, 0x0029eb10}}}, + {X: Field{[10]uint32{0x0143a727, 0x02fe9ce2, 0x019bbfda, 0x024bbb83, 0x00586fd7, 0x03cf79f8, 0x00fb1d2d, 0x02ba6566, 0x01f6fe4b, 0x001672b3}}, Y: Field{[10]uint32{0x020df035, 0x0348d045, 0x01acfed8, 0x031034de, 0x03624599, 0x02471213, 0x00d349e1, 0x02b45b1d, 0x01347b3e, 0x001f1cc3}}}, + {X: Field{[10]uint32{0x03fb226c, 0x008bfb01, 0x00821677, 0x01cd01ea, 0x0134e6b3, 0x012b398d, 0x03a4c9ec, 0x00765f6c, 0x03d1fb29, 0x0017386a}}, Y: Field{[10]uint32{0x023b7526, 0x0037a3c0, 0x01d3f763, 0x01bc149d, 0x030a39de, 0x03fdea06, 0x02110255, 0x0025cf62, 0x0234b407, 0x002af091}}}, + {X: Field{[10]uint32{0x0207d73c, 0x02c6a8c0, 0x01baf3af, 0x03433856, 0x01e70897, 0x02cc053d, 0x02680015, 0x002d3dbb, 0x028ebd0a, 0x003de0d8}}, Y: Field{[10]uint32{0x0039af61, 0x027e0273, 0x031df284, 0x03ee0ecb, 0x026c7a6e, 0x03d7efcc, 0x0268b6b1, 0x02e23252, 0x00fd5b96, 0x0034190e}}}, + {X: Field{[10]uint32{0x037ba0b3, 0x01659614, 0x0200c6c1, 0x011dcbaf, 0x029a988d, 0x011074ba, 0x007130db, 0x00a7b8d7, 0x02bccc72, 0x001e0c3e}}, Y: Field{[10]uint32{0x0338fa7f, 0x02aab746, 0x0157e835, 0x02249fcb, 0x0378acc8, 0x0200e8cf, 0x01c901fa, 0x0345e0f5, 0x018e6aea, 0x00127a2d}}}, + {X: Field{[10]uint32{0x03cba9e1, 0x014bead7, 0x03482062, 0x01270a3d, 0x006416d5, 0x03e692a4, 0x024399ee, 0x004a1886, 0x010ea890, 0x00324c0e}}, Y: Field{[10]uint32{0x0161cfce, 0x00443bec, 0x0019704d, 0x01f36aac, 0x023bab13, 0x0052d2f2, 0x014e8fdd, 0x0062883d, 0x03da3d06, 0x003e83a1}}}, + {X: Field{[10]uint32{0x029cd28a, 0x0308f736, 0x018b52d0, 0x02c2979d, 0x03ba0924, 0x017c03b0, 0x0149876e, 0x00645dbe, 0x00672057, 0x000a836a}}, Y: Field{[10]uint32{0x00907647, 0x0342fc3f, 0x01dd1975, 0x007b3413, 0x0390c1fa, 0x01b7c473, 0x01b4870f, 0x00256565, 0x00fc6935, 0x0025b341}}}, + {X: Field{[10]uint32{0x0046fc83, 0x00dd2cc5, 0x01c53256, 0x033b7072, 0x00f2bef6, 0x00e5a389, 0x036e92e0, 0x01606bd5, 0x01e260da, 0x003d9220}}, Y: Field{[10]uint32{0x027c8b94, 0x02dcbd43, 0x01ac3863, 0x0027e28b, 0x022aacec, 0x01247e95, 0x02f833db, 0x019fd10f, 0x005b660b, 0x002022a5}}}, + {X: Field{[10]uint32{0x0381f052, 0x005fe66a, 0x00341330, 0x02205597, 0x00c181e4, 0x00243c78, 0x03cea175, 0x017c34e8, 0x013305ec, 0x0025c2f6}}, Y: Field{[10]uint32{0x02e9fc48, 0x0050c7c6, 0x00a796ca, 0x036ce519, 0x038eb30b, 0x01730066, 0x03b6658d, 0x01dd2bf2, 0x030fe284, 0x00134749}}}, + {X: Field{[10]uint32{0x00c4779a, 0x0056f3b9, 0x03073354, 0x021824a0, 0x032c0588, 0x0172b465, 0x023ecfdf, 0x01507d1c, 0x033124c4, 0x0037fa52}}, Y: Field{[10]uint32{0x0140e23b, 0x0169eae5, 0x00b1c185, 0x03da2c65, 0x01d047af, 0x034d00f1, 0x03afe8c5, 0x0181aa83, 0x0253d547, 0x00330a0f}}}, + {X: Field{[10]uint32{0x018df800, 0x00e8e7a1, 0x007e3bf3, 0x03463dc1, 0x0216c8bd, 0x021cdf43, 0x0230bbad, 0x0396523e, 0x0379673a, 0x003c604c}}, Y: Field{[10]uint32{0x007d294a, 0x011102ea, 0x015d2ed5, 0x03630921, 0x0220bfb9, 0x002d347c, 0x0008d50d, 0x00b6fe6c, 0x01a6139a, 0x002b34b0}}}, + {X: Field{[10]uint32{0x01423740, 0x001810db, 0x00f3ec21, 0x025e70da, 0x008890ec, 0x03036c32, 0x0192bd01, 0x006f7d44, 0x0156fb63, 0x003d3ef0}}, Y: Field{[10]uint32{0x03b7149f, 0x02409b07, 0x03f4b4f6, 0x00eb7d21, 0x039cfccd, 0x0061d2eb, 0x01faf91e, 0x037bfd0c, 0x00f05b07, 0x000f2c23}}}, + {X: Field{[10]uint32{0x0393de6d, 0x00893881, 0x01bbed36, 0x0179d150, 0x00cb9267, 0x033116a0, 0x03a9a725, 0x0275c929, 0x00e83b07, 0x00049369}}, Y: Field{[10]uint32{0x008d00e7, 0x02d26195, 0x01e6ac6f, 0x00c7a819, 0x001cd155, 0x029d6555, 0x02200fb2, 0x0032e935, 0x0066f12e, 0x000f9c00}}}, + {X: Field{[10]uint32{0x038d1138, 0x033a586d, 0x00c16428, 0x00b40ab2, 0x006c2b11, 0x019ae5f4, 0x02045bb2, 0x01e09877, 0x01c4455e, 0x001d25c8}}, Y: Field{[10]uint32{0x015a3032, 0x01567f01, 0x03b87086, 0x0250e7c1, 0x01025bc5, 0x00cc9b1f, 0x015b237d, 0x00c70bfa, 0x02eda3f3, 0x0009d55a}}}, + {X: Field{[10]uint32{0x0227a028, 0x026a46dd, 0x00e979ff, 0x02eff531, 0x00257676, 0x0143efd6, 0x0060dfed, 0x023d5487, 0x02490aa5, 0x0018b372}}, Y: Field{[10]uint32{0x015c37b5, 0x03b58156, 0x00fbbd10, 0x02229c52, 0x0317c4a6, 0x03d0cfa3, 0x021528b4, 0x0043a9fb, 0x039ae16d, 0x0022f526}}}, + {X: Field{[10]uint32{0x006478c6, 0x01692c5a, 0x01344789, 0x03a205d6, 0x011cd3a1, 0x03b4592c, 0x013b2275, 0x00ea985b, 0x00f139b1, 0x00193594}}, Y: Field{[10]uint32{0x01fa5c2f, 0x00f61fcf, 0x03a426b8, 0x0195ee56, 0x02f9e2a0, 0x02590d00, 0x039595b7, 0x00b61fcc, 0x012af757, 0x0037bbb9}}}, + {X: Field{[10]uint32{0x009ab59d, 0x0327d280, 0x0365a1ec, 0x017b6c00, 0x0237cb93, 0x02149b7d, 0x017c17cd, 0x00dbbcd0, 0x025566c6, 0x0034228f}}, Y: Field{[10]uint32{0x000dc103, 0x02b91889, 0x02a549c9, 0x03f49090, 0x00e9ed32, 0x00e15b69, 0x00d35023, 0x0145d8ff, 0x01c75eec, 0x000b6c12}}}, + {X: Field{[10]uint32{0x00f20d89, 0x0237c38c, 0x007c6f4b, 0x020926e9, 0x02971547, 0x006166bf, 0x0220d626, 0x031426be, 0x005a35bc, 0x0021d85c}}, Y: Field{[10]uint32{0x01b726ae, 0x03c37e2b, 0x03f64436, 0x027af8b6, 0x010fd43b, 0x02011a82, 0x029c3db7, 0x02588924, 0x01eebb02, 0x002cd309}}}, + {X: Field{[10]uint32{0x006f5f85, 0x0278468f, 0x03307c4e, 0x03d038de, 0x020e35f6, 0x0139f39f, 0x02cc3175, 0x00990c51, 0x01334ce2, 0x0038d14e}}, Y: Field{[10]uint32{0x0065d97d, 0x03417075, 0x03bf700a, 0x01eccda8, 0x031afdde, 0x00aed144, 0x022a0caf, 0x0206fbfc, 0x038a941e, 0x001cfb85}}}, + {X: Field{[10]uint32{0x00ca917b, 0x00d8208d, 0x01e27fac, 0x02fe5783, 0x02246b36, 0x036ff3a3, 0x00e6f11f, 0x029f9eb2, 0x012f6609, 0x0020e246}}, Y: Field{[10]uint32{0x032b636f, 0x030de303, 0x019bec68, 0x01db94f2, 0x0267c889, 0x033ec6a8, 0x027b681c, 0x023b0a75, 0x03a55044, 0x00255c1c}}}, + {X: Field{[10]uint32{0x03c5d387, 0x0186bd30, 0x02b8de5a, 0x03ede893, 0x03bbf287, 0x025ff618, 0x0278029a, 0x03897f8b, 0x00c067bb, 0x0022ff5c}}, Y: Field{[10]uint32{0x03f952fb, 0x0251d03c, 0x031fd5d8, 0x0069bb6e, 0x008b5900, 0x03c93f3b, 0x01b1d644, 0x01973568, 0x026bee72, 0x0038b9b1}}}, + {X: Field{[10]uint32{0x02ff257d, 0x0164f839, 0x01269fdb, 0x0055a21d, 0x03eaf820, 0x02601482, 0x021582d0, 0x002ec566, 0x019aa05f, 0x00297426}}, Y: Field{[10]uint32{0x0023635a, 0x01970d31, 0x0050bf9c, 0x03469910, 0x00fe6d27, 0x00b392cd, 0x02b62b36, 0x015d999d, 0x03205ef0, 0x0038d365}}}, + {X: Field{[10]uint32{0x015043ce, 0x01eeaa97, 0x02544282, 0x02164b53, 0x01176451, 0x0227ff67, 0x03942e30, 0x03222d41, 0x01a7b949, 0x0011391e}}, Y: Field{[10]uint32{0x013a7087, 0x013b7788, 0x02e23250, 0x01deb84b, 0x01e2b10d, 0x01295c2a, 0x02714162, 0x03118ec2, 0x00298c12, 0x001ee1bb}}}, + {X: Field{[10]uint32{0x012aa558, 0x01b38f4d, 0x013c4317, 0x02355648, 0x023f37bb, 0x002af432, 0x02e0251e, 0x01e045c1, 0x0143d979, 0x001837b2}}, Y: Field{[10]uint32{0x01fcaab8, 0x0042759a, 0x03d508bc, 0x013e331b, 0x0116b076, 0x01a614cd, 0x0181448d, 0x0167db14, 0x01f4a31c, 0x000b71a2}}}, + {X: Field{[10]uint32{0x01f7709b, 0x039eacc0, 0x03b24af7, 0x027f9906, 0x00d4ab82, 0x016506e6, 0x013c5c53, 0x0127983e, 0x01385b54, 0x00172963}}, Y: Field{[10]uint32{0x017cd575, 0x019607b0, 0x03eb74d9, 0x0213574f, 0x00945d9d, 0x03ce7770, 0x00ce0907, 0x01bd2044, 0x02e980eb, 0x0020abee}}}, + {X: Field{[10]uint32{0x018b031c, 0x02641234, 0x01138100, 0x028f34ca, 0x03b9a23e, 0x01afe1b0, 0x009cf3d2, 0x0358326c, 0x027ea1b1, 0x002ddd65}}, Y: Field{[10]uint32{0x0040fef1, 0x001025c2, 0x030b7120, 0x023211bd, 0x0366f12d, 0x0373eb73, 0x01885c4a, 0x004155c3, 0x029becfa, 0x0034adc5}}}, + {X: Field{[10]uint32{0x00220f96, 0x01ade690, 0x0044e92e, 0x03047e8e, 0x03a23bc4, 0x026a8175, 0x003595fb, 0x00bd840f, 0x00f67d60, 0x001cf635}}, Y: Field{[10]uint32{0x0000ce3d, 0x015d6ac9, 0x0285d331, 0x00f55a3f, 0x00bb17fb, 0x03b3453b, 0x02185309, 0x03fb96fa, 0x022cffc9, 0x002fdc8a}}}, + {X: Field{[10]uint32{0x01182b75, 0x02c46026, 0x024d61e7, 0x01151230, 0x008b1e97, 0x0271b7c3, 0x012bcce7, 0x01e08805, 0x01f9f49f, 0x003a0413}}, Y: Field{[10]uint32{0x02137361, 0x00494fe0, 0x0102396b, 0x02087175, 0x03e14fc6, 0x03e57fee, 0x03b0da00, 0x00afac6f, 0x0139ec8f, 0x00370bf5}}}, + {X: Field{[10]uint32{0x006113e6, 0x03a65715, 0x03209e89, 0x00912403, 0x01777e55, 0x00586039, 0x01449b6d, 0x010cb238, 0x02f6fb6c, 0x003b35cb}}, Y: Field{[10]uint32{0x0226e135, 0x03593ade, 0x029e0e00, 0x00f89a04, 0x00425291, 0x00516180, 0x009f518e, 0x02ea6794, 0x015d358f, 0x00059c5c}}}, + {X: Field{[10]uint32{0x00fc36cc, 0x001c1429, 0x02455a99, 0x0041fa75, 0x01464bfe, 0x029b5f0d, 0x01fc6b5f, 0x026f45bc, 0x00cfbe82, 0x00038ed7}}, Y: Field{[10]uint32{0x028044f5, 0x01ea1f68, 0x03fa331e, 0x03c042d7, 0x02296cb5, 0x016d9c7e, 0x017a2c9b, 0x03069b78, 0x039b5471, 0x00339eae}}}, + {X: Field{[10]uint32{0x03107734, 0x0286ae49, 0x01c5ed7c, 0x013c97e2, 0x0041c1ce, 0x013af48b, 0x03e75f7f, 0x024753ad, 0x0202ffab, 0x003cd646}}, Y: Field{[10]uint32{0x00fa4b3d, 0x015f0ae5, 0x01c1018a, 0x01aef8bb, 0x03cf0474, 0x00c52eda, 0x03c7d535, 0x02e49921, 0x0211f2ba, 0x000d168b}}}, + {X: Field{[10]uint32{0x0345c635, 0x006b65f2, 0x021a6550, 0x034c89eb, 0x00c61349, 0x03f16a54, 0x01184f9f, 0x02b654df, 0x005dae54, 0x003292c1}}, Y: Field{[10]uint32{0x03c1d806, 0x01312d35, 0x00d72eaf, 0x015833a7, 0x014660f4, 0x0110747a, 0x02f3c24b, 0x02fb28d4, 0x017e255e, 0x0038c3e0}}}, + {X: Field{[10]uint32{0x0341ea38, 0x00a6ed9b, 0x02a72dfd, 0x00819d6a, 0x02300947, 0x01daa57d, 0x00ebdb7b, 0x03a987ee, 0x034054a9, 0x003df315}}, Y: Field{[10]uint32{0x02556eac, 0x00b207ac, 0x009900f5, 0x02ffd4b5, 0x03b3dd7f, 0x03811af8, 0x0275aeb5, 0x00936460, 0x018cfc54, 0x0027518f}}}, + {X: Field{[10]uint32{0x016ab6c2, 0x007dc37b, 0x029f876b, 0x03ec9eda, 0x01b4fd9b, 0x034d3a2a, 0x024bbef7, 0x038fe3b9, 0x0379fba3, 0x003dd6d7}}, Y: Field{[10]uint32{0x00a43faa, 0x00c3b024, 0x014f9d40, 0x019be168, 0x037e0e82, 0x01d159df, 0x0048e362, 0x02ddedcb, 0x00bc5c3f, 0x000882d0}}}, + {X: Field{[10]uint32{0x019cd450, 0x023e9303, 0x00fde0e8, 0x0191cd69, 0x0189d86a, 0x03428e63, 0x03d89b6a, 0x008da989, 0x03a25060, 0x000aa8d9}}, Y: Field{[10]uint32{0x0041fc32, 0x02512336, 0x038f6e82, 0x03ffa6bb, 0x021e70ec, 0x0135df61, 0x00a802bc, 0x006c69d9, 0x00250249, 0x000affb7}}}, + {X: Field{[10]uint32{0x0141620f, 0x00df0e28, 0x0325765a, 0x039ec7ac, 0x03a1078c, 0x01609ec1, 0x01a1e221, 0x00f3db9f, 0x01c11178, 0x003fdfd2}}, Y: Field{[10]uint32{0x00702733, 0x026b3d95, 0x00bead51, 0x02177d91, 0x03a488c5, 0x0049477e, 0x00a8b542, 0x00163a2f, 0x009e2e48, 0x001a5543}}}, + {X: Field{[10]uint32{0x003aa39f, 0x000a82d7, 0x016016fd, 0x02d1799e, 0x0076d017, 0x034faee4, 0x01f7338f, 0x03d3b291, 0x03581164, 0x000c7414}}, Y: Field{[10]uint32{0x0163f575, 0x03364aa6, 0x011fe6bc, 0x003b46ff, 0x03d4d3ea, 0x0387e348, 0x022fa902, 0x01ffc411, 0x019b7217, 0x003c490c}}}, + {X: Field{[10]uint32{0x026a3bd0, 0x023ed7df, 0x006eabb8, 0x034ead7c, 0x030c8a02, 0x0236a6b5, 0x00bf2f30, 0x000fb28b, 0x02ddfd12, 0x001babc3}}, Y: Field{[10]uint32{0x03e05f08, 0x0242719c, 0x016d4125, 0x01d28c56, 0x02815a0c, 0x0028ee0e, 0x00521a01, 0x0251d127, 0x01012d8e, 0x00364cdb}}}, + {X: Field{[10]uint32{0x02da1347, 0x006ea5df, 0x011b9e9a, 0x0320472e, 0x0168e759, 0x03d7ea23, 0x03943acf, 0x006adff0, 0x01197799, 0x0002e569}}, Y: Field{[10]uint32{0x01e5ef23, 0x0208afdb, 0x0287f533, 0x0054dbba, 0x029758bd, 0x0168bfe9, 0x018fbfe7, 0x0112296a, 0x035f446d, 0x00233cb2}}}, + {X: Field{[10]uint32{0x011427e8, 0x03071608, 0x02eeada6, 0x03d5ae43, 0x021fd386, 0x03a0139f, 0x031dc212, 0x03b6ebce, 0x01d48ce5, 0x001394c0}}, Y: Field{[10]uint32{0x01b9f0d9, 0x00297600, 0x016b76fb, 0x0364ddb6, 0x00dcabaa, 0x02f675a1, 0x012f684c, 0x03f6cb87, 0x003de169, 0x003d40fb}}}, + {X: Field{[10]uint32{0x00f49cd2, 0x0080cf0f, 0x017a3914, 0x0152b587, 0x02fc7c2b, 0x01270b42, 0x01f92cdc, 0x006d0dc5, 0x01e50903, 0x0013f46a}}, Y: Field{[10]uint32{0x024adcb1, 0x02169b23, 0x031602c8, 0x02fa2e1d, 0x022d99c9, 0x033bda52, 0x034b43be, 0x0196f0ea, 0x011cab01, 0x001cfb30}}}, + {X: Field{[10]uint32{0x00257c84, 0x00402648, 0x00b86745, 0x03e8ba29, 0x00384070, 0x02363eb8, 0x03b7fa4a, 0x010fe97a, 0x0065b325, 0x0019d01a}}, Y: Field{[10]uint32{0x03c62008, 0x021625ae, 0x0271f3fd, 0x0173bcf4, 0x03e829a4, 0x00c89f7d, 0x00451f5e, 0x0382e53d, 0x02d593a4, 0x000ff766}}}, + {X: Field{[10]uint32{0x006569e4, 0x024a9969, 0x01cb4e49, 0x02b46723, 0x00de7e8d, 0x036b1028, 0x03dcfa0e, 0x016f9bbc, 0x01aed6ee, 0x00052e55}}, Y: Field{[10]uint32{0x022daf70, 0x0029757e, 0x011ebed6, 0x03097aa7, 0x017d9f31, 0x0184d4f7, 0x001eff67, 0x00fe0612, 0x00b62182, 0x00352e48}}}, + {X: Field{[10]uint32{0x0339ae42, 0x0297c88c, 0x00fb722c, 0x00d318da, 0x004003e4, 0x0390bf48, 0x02a0b3ff, 0x0357eb7e, 0x03bc5608, 0x00053ca0}}, Y: Field{[10]uint32{0x02db7397, 0x015df3e7, 0x008c37c1, 0x00c0aebb, 0x03bf0ba6, 0x002a1ff6, 0x004d4bfb, 0x03f4ff19, 0x023dc3ae, 0x002c9057}}}, + {X: Field{[10]uint32{0x03bd1c1f, 0x00ce8c87, 0x03d098e7, 0x01701637, 0x005416a5, 0x03e032ea, 0x02275be7, 0x038829b9, 0x00677d3c, 0x000ff783}}, Y: Field{[10]uint32{0x02daaac6, 0x01740cc6, 0x0389a115, 0x00962498, 0x009a018b, 0x02fa87c2, 0x01782f90, 0x0064b252, 0x03dc610f, 0x0026e3bd}}}, + {X: Field{[10]uint32{0x02d17267, 0x00cca883, 0x01247df5, 0x01310776, 0x00b993bf, 0x020a4150, 0x01c74dd4, 0x00f417c5, 0x0269df5f, 0x00271579}}, Y: Field{[10]uint32{0x024979f6, 0x02d3829b, 0x00810981, 0x00c8b498, 0x018c6b3c, 0x00dd5ff0, 0x01abd783, 0x01d9945d, 0x00e930c9, 0x0008f6c3}}}, + {X: Field{[10]uint32{0x02968d16, 0x01a2a4a0, 0x02ee7d85, 0x030d2cfe, 0x02506d2d, 0x003d05d1, 0x00da60b3, 0x006835ba, 0x00dfae14, 0x0002f7a1}}, Y: Field{[10]uint32{0x02b3ab04, 0x03ce3112, 0x00dcb468, 0x03cdb0a6, 0x02900374, 0x0269b1a1, 0x024697b9, 0x01877f9c, 0x0214ff13, 0x001168cc}}}, + {X: Field{[10]uint32{0x019546a3, 0x00e76bf2, 0x030c0549, 0x021651ac, 0x01e5d970, 0x03183168, 0x0368f454, 0x030b2917, 0x014ab8f3, 0x0006500a}}, Y: Field{[10]uint32{0x00e3b81e, 0x025aed3b, 0x0386abfd, 0x009b9db8, 0x00848bc9, 0x01f186ec, 0x020ea767, 0x0318a879, 0x03993816, 0x00158fe7}}}, + {X: Field{[10]uint32{0x032ccb0e, 0x027f33ac, 0x00ad6682, 0x0358dcf3, 0x00757a34, 0x0348b60e, 0x00df92ea, 0x00f991f4, 0x01e0d0d1, 0x00375ba8}}, Y: Field{[10]uint32{0x0233c313, 0x00023c3b, 0x003fdd8e, 0x01f2a803, 0x00384b55, 0x012797fe, 0x03ad27fa, 0x03a2ca14, 0x01e36bf4, 0x0030063a}}}, + {X: Field{[10]uint32{0x037fbf19, 0x01a58596, 0x01ffec06, 0x00dd0b13, 0x00dc1047, 0x02f09ee1, 0x02656bfb, 0x01158b89, 0x03e8c784, 0x00195e11}}, Y: Field{[10]uint32{0x015f2df5, 0x03daad82, 0x001725b5, 0x02d39e69, 0x0242c6a4, 0x0292a6a2, 0x01beda90, 0x02b69240, 0x03b658b6, 0x00376437}}}, + {X: Field{[10]uint32{0x023dea6b, 0x0141acff, 0x00d3e352, 0x007ce5ae, 0x0349b8e7, 0x036de072, 0x02d26c2e, 0x0275ba41, 0x00b140be, 0x003edc09}}, Y: Field{[10]uint32{0x0308efdf, 0x03f28cba, 0x0061c5a0, 0x0014501c, 0x02fea360, 0x03746b11, 0x02d961e9, 0x008ca2da, 0x03f4e50b, 0x00379023}}}, + {X: Field{[10]uint32{0x01d8e8e0, 0x004cd434, 0x018dfa31, 0x0031268e, 0x00b3f2be, 0x034fa251, 0x0280179c, 0x02c9e74e, 0x000865a7, 0x000b4a70}}, Y: Field{[10]uint32{0x02efcf8f, 0x027648f6, 0x03ee992e, 0x0017c999, 0x0125c550, 0x02592791, 0x00027485, 0x01292996, 0x027aee70, 0x0032abc4}}}, + {X: Field{[10]uint32{0x03d5662d, 0x01f07314, 0x036326d8, 0x02269f0c, 0x02392685, 0x00f06f8e, 0x028d42ba, 0x00827d37, 0x007479b7, 0x0036da41}}, Y: Field{[10]uint32{0x03aa4e00, 0x01dddc3e, 0x0063c0b7, 0x02fca48b, 0x01c58c1f, 0x020f893a, 0x013ce32c, 0x021eaa64, 0x03e95c35, 0x002437a2}}}, + {X: Field{[10]uint32{0x0141697b, 0x011cd5b2, 0x03f0adf2, 0x021f33c4, 0x01723c70, 0x01635bf0, 0x0154ada2, 0x013c2abf, 0x006f922e, 0x00260194}}, Y: Field{[10]uint32{0x016bc237, 0x011684bc, 0x037c9252, 0x0125dec9, 0x01b97fef, 0x034c72b4, 0x0298eef3, 0x02e104dd, 0x0018a8ca, 0x00301f88}}}, + {X: Field{[10]uint32{0x00e40187, 0x02b9ebd8, 0x025eaae1, 0x03478cf4, 0x01661e0a, 0x023c5188, 0x011c1122, 0x0096b16c, 0x013fe6da, 0x002ae1a3}}, Y: Field{[10]uint32{0x00bf54ad, 0x0357c4cf, 0x001d4d47, 0x0222ef4c, 0x014b12c4, 0x015e9ff6, 0x01195ced, 0x02614068, 0x0298334a, 0x003b892d}}}, + {X: Field{[10]uint32{0x018dcda2, 0x03627bbf, 0x02f4931f, 0x019aafd9, 0x003122f3, 0x01095f8a, 0x0056be17, 0x023b9848, 0x03d19d2a, 0x0039d587}}, Y: Field{[10]uint32{0x02166d5a, 0x02a0004f, 0x0118d5a8, 0x0242281e, 0x0385bcb1, 0x0089edd6, 0x0366ea73, 0x01b63171, 0x034be365, 0x000814b9}}}, + {X: Field{[10]uint32{0x00f21e6c, 0x00b7e6fa, 0x0082083c, 0x0004e654, 0x017b562f, 0x02a1132d, 0x008f2e0f, 0x038c1ef8, 0x023d84bb, 0x0017c654}}, Y: Field{[10]uint32{0x0265d7fa, 0x039f105c, 0x02cb9d9b, 0x0109ba46, 0x00333775, 0x01c93ae2, 0x029ad2d5, 0x007778ab, 0x021628ee, 0x000ea5bf}}}, + {X: Field{[10]uint32{0x01c10cc1, 0x00df4a36, 0x03545698, 0x005c9571, 0x022fdcad, 0x015407bf, 0x022ec1dc, 0x026c4490, 0x02683c94, 0x00327e91}}, Y: Field{[10]uint32{0x03fd1dba, 0x008fb7b1, 0x03ffab5e, 0x00d1db51, 0x00b5b6e7, 0x03a380d2, 0x01dcd8d9, 0x0246b33c, 0x035d18f6, 0x0006aab9}}}, + {X: Field{[10]uint32{0x03eb8d8c, 0x02de4ec2, 0x02401b1a, 0x03505690, 0x011799b2, 0x024ee081, 0x03a084c3, 0x0061e733, 0x022a1e91, 0x00076a43}}, Y: Field{[10]uint32{0x009c0b63, 0x0134a3b2, 0x013322da, 0x03947d3f, 0x0274994e, 0x00ecff0c, 0x02cbae15, 0x0134e011, 0x006911ea, 0x000f4fdf}}}, + {X: Field{[10]uint32{0x031b3186, 0x03e26b7c, 0x029153e6, 0x026363d9, 0x03707e40, 0x02de11fd, 0x01504ac0, 0x0390c9af, 0x010f3851, 0x0031bf3c}}, Y: Field{[10]uint32{0x03a50ced, 0x029494e4, 0x00bff03e, 0x02bea726, 0x004e2705, 0x03e3b972, 0x036ea108, 0x018f61b8, 0x01f4a16a, 0x00342b22}}}, + {X: Field{[10]uint32{0x02378233, 0x035fd185, 0x02588fef, 0x01ac7e6d, 0x0003cf23, 0x00495eb8, 0x02b7d4ef, 0x0319f32d, 0x022eeb56, 0x0005415e}}, Y: Field{[10]uint32{0x004930c2, 0x012ec3f7, 0x010cf505, 0x0188be6a, 0x036f205a, 0x038f42a1, 0x01543ef5, 0x029ea312, 0x0130ccc0, 0x00136ead}}}, + {X: Field{[10]uint32{0x0308b20f, 0x039067c0, 0x01ea36d1, 0x02de300b, 0x0145bf1c, 0x001f77af, 0x027337dd, 0x02b039ba, 0x02e072d5, 0x000dfbab}}, Y: Field{[10]uint32{0x0361d506, 0x02458c3c, 0x0394aebb, 0x036efd68, 0x01a5761a, 0x00ca8e8f, 0x0077249a, 0x02a85067, 0x00965d9d, 0x002c3191}}}, + {X: Field{[10]uint32{0x0157745c, 0x009cd889, 0x03ebe61a, 0x022deb66, 0x01f1d6ce, 0x024a2f71, 0x031cd96d, 0x03438cf1, 0x03f83a8b, 0x0016881e}}, Y: Field{[10]uint32{0x00f54dad, 0x031d9998, 0x0213819e, 0x0004c8f1, 0x03ee8789, 0x015d1044, 0x01494ac1, 0x026da8a9, 0x0357fadc, 0x000eb32d}}}, + {X: Field{[10]uint32{0x03abd139, 0x034e6efe, 0x006d1642, 0x002241c1, 0x02f6b2ee, 0x0206fbed, 0x0391271e, 0x038c9568, 0x016a1a0f, 0x003f8237}}, Y: Field{[10]uint32{0x0181ef40, 0x00319380, 0x030d6c52, 0x00984de6, 0x03665d23, 0x027c8130, 0x02f1b436, 0x0208bb93, 0x02d13535, 0x0010b0d0}}}, + {X: Field{[10]uint32{0x00706111, 0x032e665e, 0x01daca39, 0x03800f47, 0x01d6d859, 0x0201132b, 0x003edcf3, 0x036ee992, 0x02c908df, 0x002df498}}, Y: Field{[10]uint32{0x00d798e8, 0x01ff91ca, 0x01689ee9, 0x0044194f, 0x0230bb4c, 0x00606d6e, 0x0007c8f5, 0x02ce5da8, 0x0350b308, 0x00258218}}}, + {X: Field{[10]uint32{0x00130c86, 0x01be008d, 0x00407683, 0x015f731e, 0x027d354b, 0x006eb7d6, 0x0297d7c0, 0x00ddd4eb, 0x032e23b3, 0x0012c4aa}}, Y: Field{[10]uint32{0x023c450e, 0x03ee3c3c, 0x005c0f52, 0x027926b9, 0x012bc964, 0x007f9605, 0x0211e73a, 0x022fd00b, 0x020d9f70, 0x00106753}}}, + {X: Field{[10]uint32{0x00e88dac, 0x00331276, 0x034f74f3, 0x02addd42, 0x008f362b, 0x02f311f1, 0x009570c8, 0x0333692d, 0x0282a96e, 0x003f1b49}}, Y: Field{[10]uint32{0x00beedbb, 0x0090eb3d, 0x0184808a, 0x03c25800, 0x000694af, 0x024165fe, 0x0322612e, 0x01160347, 0x01273026, 0x0006bd59}}}, + {X: Field{[10]uint32{0x02607e8b, 0x026d9547, 0x00f0632e, 0x0303910b, 0x025e07e6, 0x012bf6e7, 0x0342c40c, 0x03ae8151, 0x03a9a189, 0x0031ee70}}, Y: Field{[10]uint32{0x001822ab, 0x02010bfc, 0x03e30fc5, 0x02e35370, 0x02ef6b38, 0x03069517, 0x0084cd19, 0x01d36d88, 0x02772f22, 0x0016eda0}}}, + {X: Field{[10]uint32{0x00dfd956, 0x001be9d4, 0x01627034, 0x030aedbe, 0x0246c761, 0x03b50c1a, 0x02339ba3, 0x029cbca6, 0x034230de, 0x003ae934}}, Y: Field{[10]uint32{0x01237cee, 0x0172fd77, 0x0106d215, 0x02961e4d, 0x01d31b01, 0x001a1033, 0x01a17477, 0x01e2cb8f, 0x020f23d2, 0x003f385e}}}, + {X: Field{[10]uint32{0x02c04155, 0x0295a7e0, 0x02cc8944, 0x03d1b366, 0x013595dc, 0x02b7b0a1, 0x034358c6, 0x0351c4d6, 0x01c02177, 0x002934db}}, Y: Field{[10]uint32{0x01f00281, 0x00ddfd20, 0x03ad1013, 0x01770beb, 0x0365f3e4, 0x016983f7, 0x038fd0fb, 0x006f838d, 0x037963b2, 0x002168a5}}}, + {X: Field{[10]uint32{0x02109ba2, 0x002b255d, 0x00a16906, 0x02a939b5, 0x020eb165, 0x0379ceaf, 0x035bf56f, 0x03eb878f, 0x0063ae8b, 0x001245b4}}, Y: Field{[10]uint32{0x003f22ee, 0x026d3513, 0x006564ae, 0x013d9d8e, 0x003b2b0b, 0x014dadf2, 0x027a08ca, 0x010357e5, 0x03034a0b, 0x0029e459}}}, + {X: Field{[10]uint32{0x02edd046, 0x02b90483, 0x03f97ecb, 0x01e61605, 0x009de019, 0x0012ad27, 0x038f1a44, 0x0180c217, 0x0310b296, 0x001d8736}}, Y: Field{[10]uint32{0x02193db7, 0x00bce88b, 0x010cf2ee, 0x03aa376a, 0x039789f0, 0x022079fe, 0x038f50ab, 0x015175cb, 0x0320763b, 0x00074455}}}, + {X: Field{[10]uint32{0x01c64ea3, 0x03f28ae3, 0x019d2e05, 0x0053a377, 0x02860ff0, 0x0242f04f, 0x005541b4, 0x023a4b7e, 0x01704d71, 0x00035e89}}, Y: Field{[10]uint32{0x034cb90c, 0x023d0f94, 0x00acec15, 0x0216a8eb, 0x026102db, 0x02f1b7b1, 0x000e035f, 0x019d9dc7, 0x039d2134, 0x00179152}}}, + {X: Field{[10]uint32{0x014d3bbe, 0x00290fcf, 0x025dfeb2, 0x02653716, 0x020a6b9a, 0x00a5d6ef, 0x02bcb063, 0x0314aec3, 0x004f7962, 0x000abd80}}, Y: Field{[10]uint32{0x001a14f3, 0x03825776, 0x01933d91, 0x006d4c8e, 0x02be1deb, 0x01a31965, 0x0108e3eb, 0x0330540c, 0x01e226f8, 0x001a622a}}}, + {X: Field{[10]uint32{0x01504255, 0x0023d72a, 0x00959741, 0x0061d6e9, 0x03ca805d, 0x034cc613, 0x027571e5, 0x00218044, 0x00e53bab, 0x002a49d0}}, Y: Field{[10]uint32{0x02d2379f, 0x01d7adb1, 0x0244e68d, 0x0214436a, 0x0096d49c, 0x00eaa138, 0x02dfd3d0, 0x01adc419, 0x011e2eb7, 0x00177ca1}}}, + {X: Field{[10]uint32{0x00014939, 0x01fb661c, 0x02057bcc, 0x01c0341d, 0x02768567, 0x00e8323a, 0x0287c449, 0x0229ad82, 0x021a510d, 0x00243425}}, Y: Field{[10]uint32{0x00aa545d, 0x01d80eb3, 0x034d3f8d, 0x00be16d2, 0x037c13dc, 0x008e1ab4, 0x036f7a8a, 0x00c2219a, 0x013c1c91, 0x001d351d}}}, + {X: Field{[10]uint32{0x00ecd12b, 0x02f98441, 0x00ded249, 0x029b28ce, 0x038dd5c6, 0x00b8b820, 0x02bfa279, 0x029813d8, 0x03eaf2e3, 0x0003394a}}, Y: Field{[10]uint32{0x015c009e, 0x0220020b, 0x031a1a49, 0x002a3e3f, 0x03dd0867, 0x0097cf66, 0x00244449, 0x0028adf2, 0x0273738a, 0x002a1a77}}}, + {X: Field{[10]uint32{0x03cd05c4, 0x038d43fc, 0x02be7cc3, 0x0105b3c5, 0x01122154, 0x0301ab12, 0x0139a471, 0x03f34bff, 0x01c210e3, 0x002672a3}}, Y: Field{[10]uint32{0x03bc4982, 0x03925ab7, 0x02142c6c, 0x03a00244, 0x024550fb, 0x03c1c82f, 0x0326309e, 0x0370b1af, 0x0280131a, 0x001e021e}}}, + {X: Field{[10]uint32{0x0202d1c6, 0x03b18428, 0x0211ab51, 0x0285f639, 0x00cbfcc6, 0x008b7ae4, 0x03ff1f43, 0x01ef1741, 0x00c29f5a, 0x002f910b}}, Y: Field{[10]uint32{0x03c084a2, 0x01584a1d, 0x03734111, 0x00978c92, 0x02fb3d1f, 0x02b3d6ec, 0x028f2c01, 0x0364d200, 0x02c4680e, 0x0018943c}}}, + {X: Field{[10]uint32{0x00ec8e54, 0x01c2ec39, 0x00e65677, 0x03e6e3e0, 0x03e75d95, 0x006e6c53, 0x030346b5, 0x02c04084, 0x01f4037f, 0x0014fd7d}}, Y: Field{[10]uint32{0x00c62f93, 0x0331774a, 0x020f9cb1, 0x01c4ca14, 0x0224c0d5, 0x00f8b870, 0x00dd2ef2, 0x00cfd6a8, 0x0353c6e7, 0x0023694a}}}, + {X: Field{[10]uint32{0x008c4d6c, 0x039b6a97, 0x0155411d, 0x006461bb, 0x02a897ab, 0x00d295bd, 0x0399e3a1, 0x03affdf5, 0x01650e90, 0x00081b39}}, Y: Field{[10]uint32{0x02a75804, 0x02a6a5a9, 0x006754dc, 0x00f0e2b8, 0x00aaa5d5, 0x01e754c8, 0x03ec5c2e, 0x01b729f7, 0x0122bd2d, 0x0030bfd7}}}, + {X: Field{[10]uint32{0x0073f443, 0x037cab1c, 0x03744faa, 0x0083308f, 0x0002176a, 0x009b4ad5, 0x01f2a727, 0x00beae04, 0x03bb87ee, 0x0034772f}}, Y: Field{[10]uint32{0x01d17db9, 0x003e5a3b, 0x0350c187, 0x024f87d0, 0x00f71da6, 0x03e0cdf6, 0x02fc27e3, 0x002edef2, 0x023b4180, 0x000041b1}}}, + {X: Field{[10]uint32{0x03749328, 0x005ce4b6, 0x002f6db1, 0x0343bc5f, 0x020a516f, 0x01bff26a, 0x039d4322, 0x01dae87a, 0x0173c543, 0x003486a8}}, Y: Field{[10]uint32{0x0074e424, 0x0131a098, 0x00b24772, 0x0293b5d3, 0x002326f9, 0x00e9d52c, 0x00f79de6, 0x02035981, 0x01f4e014, 0x000df3d7}}}, + {X: Field{[10]uint32{0x011fa3d2, 0x03553adf, 0x0203178d, 0x020fe387, 0x0215e563, 0x032edf39, 0x01acfbe2, 0x01a69d5a, 0x0024a22c, 0x00148d2c}}, Y: Field{[10]uint32{0x03c000cb, 0x02258c22, 0x02ddfd91, 0x02569d2b, 0x02b41038, 0x0296cd0e, 0x03c3b042, 0x02d4b58a, 0x0042651d, 0x000afab9}}}, + {X: Field{[10]uint32{0x01412f64, 0x010704cd, 0x00b6a509, 0x033d7b9b, 0x01f5048d, 0x01662253, 0x009dbd4f, 0x0086ae9c, 0x00759f3e, 0x00279ba6}}, Y: Field{[10]uint32{0x01757ea8, 0x009a418c, 0x034a92dc, 0x00ce9f93, 0x01431110, 0x03811c62, 0x00dd1690, 0x00b96909, 0x0199e38f, 0x000ad9c0}}}, + {X: Field{[10]uint32{0x0343ae45, 0x03ca4a21, 0x017fcd28, 0x01ce0c96, 0x0289232c, 0x00b7a6ec, 0x01f8a927, 0x0239dc43, 0x02959a71, 0x002105b8}}, Y: Field{[10]uint32{0x0133d139, 0x01c487c4, 0x004db4c7, 0x01d1d931, 0x0220732a, 0x03347c00, 0x01b79044, 0x01023b60, 0x0202801b, 0x001bbd24}}}, + {X: Field{[10]uint32{0x013561a5, 0x02389eb5, 0x0029bb10, 0x01ca7a8d, 0x0027462f, 0x014ae8b7, 0x02405ebe, 0x00ecbcc9, 0x03a7048a, 0x00214a93}}, Y: Field{[10]uint32{0x0162e520, 0x0332bce9, 0x02ac6a81, 0x03de3418, 0x02770b99, 0x032fad9c, 0x00e441c2, 0x02708dac, 0x0046ee0d, 0x000f81b0}}}, + {X: Field{[10]uint32{0x0277c1bd, 0x00a50b8d, 0x00c5d328, 0x02872c8d, 0x01fa6097, 0x03020f3b, 0x03b876d3, 0x015afae4, 0x01a02dbe, 0x000a2037}}, Y: Field{[10]uint32{0x031bb43a, 0x01991043, 0x019d3bf9, 0x01e103a4, 0x023d371f, 0x00dc37e8, 0x015366c5, 0x01aed3fa, 0x021092d4, 0x0037ec3a}}}, + {X: Field{[10]uint32{0x01819c65, 0x027fe27c, 0x006f0770, 0x01549d72, 0x0037b535, 0x02699da8, 0x03dbf869, 0x0235ff00, 0x00029e82, 0x0032dbef}}, Y: Field{[10]uint32{0x02062266, 0x00589de1, 0x02bdace5, 0x03ef816e, 0x00ce9161, 0x032ddb2e, 0x00d50c21, 0x01ce6457, 0x019a3657, 0x003f138b}}}, + {X: Field{[10]uint32{0x001afebe, 0x00c17bfe, 0x021615f6, 0x02962a1c, 0x030abc76, 0x001b43b0, 0x03241066, 0x00d0e086, 0x035bff1c, 0x002021ee}}, Y: Field{[10]uint32{0x0024ce72, 0x0305f782, 0x00353d9b, 0x01fa513d, 0x0223a443, 0x03a6918c, 0x01c5030a, 0x0300ae3d, 0x007aa602, 0x0015e2ca}}}, + {X: Field{[10]uint32{0x02d3a33a, 0x028a3ed0, 0x01482653, 0x0274493b, 0x00f8ae82, 0x0145f396, 0x030def22, 0x032431eb, 0x00bc30f2, 0x000da7d5}}, Y: Field{[10]uint32{0x01b59d16, 0x009855ee, 0x01b40b45, 0x02f71330, 0x0361f466, 0x01658850, 0x03c97aef, 0x01f8cb18, 0x02af35af, 0x0002e3cb}}}, + {X: Field{[10]uint32{0x03ed8f7d, 0x00f54cc7, 0x01eb6edd, 0x00a1af92, 0x03df2946, 0x03f6dab1, 0x03b2448f, 0x03e1c54e, 0x004c01b2, 0x0021ef93}}, Y: Field{[10]uint32{0x020effb1, 0x01bd3af2, 0x00a2adfe, 0x02a19a4e, 0x0071fdc8, 0x00735474, 0x031ec542, 0x0302855d, 0x00bc6386, 0x001fbd1d}}}, + {X: Field{[10]uint32{0x0214715e, 0x00fe8a47, 0x01cfbc01, 0x006d7bb4, 0x0280393f, 0x00e7b6f8, 0x0310eeb2, 0x016faa30, 0x00f018f7, 0x001ed99e}}, Y: Field{[10]uint32{0x038b1fd7, 0x006a2c7c, 0x02890c18, 0x01f4f754, 0x03d98570, 0x02a86efc, 0x008275d2, 0x039a69ce, 0x00e2666e, 0x001e3a2e}}}, + {X: Field{[10]uint32{0x0160f135, 0x009ce52c, 0x00aed90d, 0x01b5acdf, 0x0377d282, 0x03ee8e22, 0x01608f58, 0x027808aa, 0x02419672, 0x000227b1}}, Y: Field{[10]uint32{0x00786cff, 0x025055e9, 0x021f80ac, 0x02c36466, 0x035e3030, 0x0077ac62, 0x01ee5a74, 0x01ce1c06, 0x0142108d, 0x00177bcc}}}, + {X: Field{[10]uint32{0x02177f8e, 0x01b4698d, 0x0131199e, 0x0275907e, 0x008b8374, 0x01e30feb, 0x022acbab, 0x00242cea, 0x03393769, 0x000b2fb1}}, Y: Field{[10]uint32{0x03de8886, 0x024820fc, 0x03bad2ca, 0x0332240b, 0x0367fea7, 0x013c9aba, 0x034a007f, 0x00b56b2c, 0x03e757ad, 0x000c5039}}}, + {X: Field{[10]uint32{0x01946908, 0x033c3baf, 0x03cf02eb, 0x0061198f, 0x0229d576, 0x000c082b, 0x027b116d, 0x02962d4f, 0x03cda2d6, 0x0019e33b}}, Y: Field{[10]uint32{0x026a3491, 0x02f40a03, 0x01713314, 0x0310cc70, 0x0118834f, 0x00caca90, 0x00d56ee9, 0x023bbcdf, 0x01e01329, 0x003d16fa}}}, + {X: Field{[10]uint32{0x033ec0df, 0x03c608b1, 0x01524b43, 0x01cf2230, 0x015073b0, 0x01337c04, 0x012305a9, 0x013b391a, 0x0278adcc, 0x002376f4}}, Y: Field{[10]uint32{0x00fc5b0c, 0x024ec5e0, 0x0102268b, 0x016e8cec, 0x005d2d67, 0x00a31de1, 0x029ea1ae, 0x031b232a, 0x02dd3c52, 0x00241443}}}, + {X: Field{[10]uint32{0x03e36626, 0x00743035, 0x00739304, 0x01e2abdc, 0x00607d78, 0x008e0983, 0x03149c3d, 0x03fd7c8a, 0x0082b162, 0x0025cafc}}, Y: Field{[10]uint32{0x004087dc, 0x01416f93, 0x01324797, 0x0093408d, 0x026eca9f, 0x03a42910, 0x01b64f43, 0x02f29366, 0x03baf61c, 0x0011a16c}}}, + {X: Field{[10]uint32{0x03c97230, 0x03315f2e, 0x0280f540, 0x0182f218, 0x01d8c1f7, 0x0145348f, 0x02801c54, 0x012ae5f7, 0x01526660, 0x0010abc3}}, Y: Field{[10]uint32{0x0299ce38, 0x024afb05, 0x03b89771, 0x01a26378, 0x01cced06, 0x025edd35, 0x017160bd, 0x00a7b50d, 0x03898c90, 0x00015926}}}, + {X: Field{[10]uint32{0x03bb30ac, 0x0188fcf5, 0x010a9fa5, 0x00853010, 0x021748ee, 0x02686831, 0x02138bca, 0x01b47639, 0x03708729, 0x00014d99}}, Y: Field{[10]uint32{0x015cac1d, 0x02e3f63b, 0x01f31fd8, 0x00b96564, 0x027c297b, 0x01cb642e, 0x0219c2f6, 0x02834d49, 0x0260786b, 0x00381a0e}}}, + {X: Field{[10]uint32{0x0039fc24, 0x0157047f, 0x002559de, 0x02d2b648, 0x017d5d0a, 0x033903a4, 0x00308d6b, 0x02c63fc1, 0x0284e85b, 0x00280ed8}}, Y: Field{[10]uint32{0x00785493, 0x0356a3fa, 0x035644ca, 0x016f8052, 0x02c07300, 0x024e76e2, 0x03e7235a, 0x030d208f, 0x0282c22c, 0x0009ce7b}}}, + {X: Field{[10]uint32{0x02b66e97, 0x00b893c9, 0x03a63733, 0x0326648c, 0x01f5801d, 0x02893df7, 0x01980550, 0x014e9af6, 0x02d7268a, 0x000bce53}}, Y: Field{[10]uint32{0x03918d88, 0x03d3375c, 0x014138d3, 0x027d7415, 0x000e49d0, 0x009af130, 0x03d3714a, 0x02ea1b46, 0x033ee934, 0x002d4ad3}}}, + {X: Field{[10]uint32{0x0133f8ab, 0x01684b1c, 0x016ebbb3, 0x03b7bc2d, 0x027740bc, 0x0047bd7f, 0x020c19a6, 0x014df8ea, 0x0010527e, 0x00245dcc}}, Y: Field{[10]uint32{0x029fb5b6, 0x012053fa, 0x0396500f, 0x017333ee, 0x01b097ae, 0x02ef0dad, 0x021063ab, 0x0120249f, 0x03b328b6, 0x001a3e4d}}}, + {X: Field{[10]uint32{0x004af615, 0x018035a4, 0x00b24763, 0x03154280, 0x0028486b, 0x0354a77e, 0x020c1aeb, 0x022bc5e8, 0x01bfcddc, 0x000a146f}}, Y: Field{[10]uint32{0x00cb1356, 0x016cb5b7, 0x017585d1, 0x0320edcc, 0x02ee2acf, 0x00cc0d75, 0x006c3760, 0x009eb9b5, 0x0085702e, 0x0034c0b0}}}, + {X: Field{[10]uint32{0x014bdfef, 0x0136920c, 0x029c25d3, 0x018d69bc, 0x038be3d3, 0x02d1f965, 0x0210b791, 0x0267c515, 0x03ab0254, 0x003a61b5}}, Y: Field{[10]uint32{0x03de35a6, 0x00f0cc51, 0x01c165f5, 0x00b4c710, 0x01cfdb18, 0x00441156, 0x02c63b96, 0x03054043, 0x00dcb3b3, 0x0003418e}}}, + {X: Field{[10]uint32{0x038bfc03, 0x019238a3, 0x02099b2e, 0x0329fefe, 0x00ab44da, 0x020c7609, 0x001c5e0d, 0x02cb38b7, 0x032c5639, 0x002f1176}}, Y: Field{[10]uint32{0x03213e32, 0x03e6d481, 0x028842c1, 0x02020981, 0x0079a805, 0x02a7d4f8, 0x02327400, 0x0226b527, 0x03b127b2, 0x001764f8}}}, + {X: Field{[10]uint32{0x00a8dfc6, 0x012632d4, 0x022fd667, 0x004b29ec, 0x01849ef5, 0x0278a440, 0x027b4c84, 0x020274b1, 0x027e47d9, 0x00105175}}, Y: Field{[10]uint32{0x0113f096, 0x0085ce91, 0x00ea9492, 0x001f58a4, 0x03daeae0, 0x0036a993, 0x008604d9, 0x01fe0a5c, 0x00fc2a4f, 0x00151c7d}}}, + {X: Field{[10]uint32{0x00686825, 0x035d03d7, 0x02fa3c1a, 0x021f9e96, 0x02427e30, 0x01ce373a, 0x015314aa, 0x02755aec, 0x037f4cd7, 0x000b455f}}, Y: Field{[10]uint32{0x016fc1c0, 0x03c7a88a, 0x034eeeab, 0x0084e9c8, 0x02962a4e, 0x01d9aed1, 0x027a29a2, 0x027d2e53, 0x03187615, 0x0030713c}}}, + {X: Field{[10]uint32{0x033933ba, 0x035e5869, 0x0187b361, 0x025a089a, 0x03d6e896, 0x0304aa06, 0x03e26cb0, 0x002cb977, 0x02847704, 0x000bd098}}, Y: Field{[10]uint32{0x0144075e, 0x0120f460, 0x024bd45e, 0x010a1e7c, 0x00a384f9, 0x01d54cbe, 0x03cf601c, 0x00a1e7bf, 0x020d141b, 0x002f7384}}}, + {X: Field{[10]uint32{0x03bf527f, 0x007fff0e, 0x0220ab8a, 0x0110dfa8, 0x03bf9f8f, 0x03bc8f29, 0x003c9c0e, 0x004c0b9a, 0x03a76cc9, 0x002d0673}}, Y: Field{[10]uint32{0x02929517, 0x009478ea, 0x00dba3c0, 0x015b8f34, 0x00a911e9, 0x012201ad, 0x0091a70b, 0x00906792, 0x014e290f, 0x002ee1a5}}}, + {X: Field{[10]uint32{0x0125236f, 0x035cb552, 0x018dcae2, 0x0026c0da, 0x012b17bd, 0x0037b64e, 0x02f2913f, 0x00593f1e, 0x02f95734, 0x00336d29}}, Y: Field{[10]uint32{0x02c8e7aa, 0x03e39baa, 0x025ffc9e, 0x00f013c4, 0x01d57c96, 0x01265914, 0x0100c47d, 0x03d75c39, 0x0236bd1b, 0x00227b68}}}, + {X: Field{[10]uint32{0x0008c256, 0x02003e3d, 0x00a3e321, 0x013088cf, 0x00a12a8c, 0x000e4bfa, 0x026f2f15, 0x031128cf, 0x0351a45a, 0x003b53a9}}, Y: Field{[10]uint32{0x030ffef2, 0x01018d25, 0x0264acaf, 0x018e62b3, 0x00a296d9, 0x0013644b, 0x01266d4d, 0x00d26aba, 0x01a74a2b, 0x00271fa7}}}, + {X: Field{[10]uint32{0x00fbf5d3, 0x03b3428f, 0x0287c96d, 0x000be9e6, 0x0384a74b, 0x037c229c, 0x00ccfcd1, 0x018f0a0c, 0x0138fdf9, 0x0026c1bf}}, Y: Field{[10]uint32{0x03226416, 0x0277801a, 0x020d4eb2, 0x028ca86c, 0x023ede27, 0x0136b435, 0x004ba3cd, 0x018056bb, 0x021ce7ee, 0x003a1991}}}, + {X: Field{[10]uint32{0x02f6ae75, 0x01b94846, 0x004ef516, 0x012f7869, 0x02c2b789, 0x001c0815, 0x0213f1ee, 0x03346a5f, 0x001eefc1, 0x0037c452}}, Y: Field{[10]uint32{0x022b7e02, 0x0152ae88, 0x03ad4a83, 0x0185c5ea, 0x0180c766, 0x039cf8b3, 0x02e1f24d, 0x027e87af, 0x00563542, 0x00285046}}}, + {X: Field{[10]uint32{0x02a3c9f5, 0x0280cb44, 0x0284523d, 0x00569462, 0x0146e4df, 0x0201f186, 0x03bc65de, 0x00fecf41, 0x01010b1f, 0x003e0ca3}}, Y: Field{[10]uint32{0x01ca6216, 0x003c4033, 0x01df0d5e, 0x0051e9c2, 0x02de1749, 0x0172a7af, 0x029a6d0b, 0x0351e272, 0x00747746, 0x0038a76f}}}, + {X: Field{[10]uint32{0x013fff86, 0x03c024d3, 0x01e461fc, 0x01ea4b82, 0x01ff0d1b, 0x02b313ed, 0x02135900, 0x008c07e6, 0x03bdb7fc, 0x000f8ebe}}, Y: Field{[10]uint32{0x02b6ebd6, 0x0098849b, 0x00742f0f, 0x0070fb0a, 0x01a5c2af, 0x01866bac, 0x004c8d09, 0x007146f5, 0x03e1b982, 0x0007f1fd}}}, + {X: Field{[10]uint32{0x03f86125, 0x007aa6c7, 0x0166074d, 0x02013154, 0x0078ede8, 0x0274cd6d, 0x0019f8b6, 0x02005673, 0x02ea6834, 0x002ab45f}}, Y: Field{[10]uint32{0x01365257, 0x033e77e7, 0x008e8ed6, 0x02749ad2, 0x00dfa174, 0x0187ba44, 0x00f45bf3, 0x02276d9f, 0x038cebab, 0x0003a64e}}}, + {X: Field{[10]uint32{0x010ea35c, 0x03a65ca4, 0x0072d37c, 0x02e3eca4, 0x00286442, 0x0389a85e, 0x00f44b6f, 0x031a1bfa, 0x03195515, 0x00084fee}}, Y: Field{[10]uint32{0x0152a852, 0x0225a77b, 0x0136218e, 0x016189e0, 0x03d68c39, 0x0261d880, 0x00ee5771, 0x03d2ecb4, 0x011b7df7, 0x00125ee5}}}, + {X: Field{[10]uint32{0x030120fa, 0x024de40d, 0x021a2924, 0x011c24a0, 0x03eba91b, 0x022e31e9, 0x013321ec, 0x020678fa, 0x02a578ed, 0x00335fdc}}, Y: Field{[10]uint32{0x01bb1148, 0x03d7f3d1, 0x03ce2d8f, 0x02464fa5, 0x02ca4eac, 0x02441df9, 0x02c537d9, 0x003cb3e8, 0x00709928, 0x0028f547}}}, + {X: Field{[10]uint32{0x027f3b51, 0x0248f82d, 0x01b19068, 0x03061e3e, 0x038240ae, 0x0346a78b, 0x023a28a1, 0x00a4e7e6, 0x00c700a7, 0x001c28d8}}, Y: Field{[10]uint32{0x01710259, 0x001554ab, 0x021b73eb, 0x0261b4bd, 0x00dd175c, 0x01a82ee3, 0x024ae36b, 0x036f08ba, 0x007c53a4, 0x00287670}}}, + {X: Field{[10]uint32{0x01b5e46a, 0x01d98048, 0x02d337a0, 0x03f67369, 0x00eedc35, 0x027a72fa, 0x021dd199, 0x00ad983e, 0x015b4f8e, 0x00151298}}, Y: Field{[10]uint32{0x028451e5, 0x0142cd6e, 0x026bd751, 0x0269cc23, 0x03d7ba7a, 0x0376725f, 0x0286aecb, 0x03235d94, 0x01b9c76f, 0x001d749b}}}, + {X: Field{[10]uint32{0x02c8acef, 0x030d19e3, 0x03c92a01, 0x03dcdb08, 0x00f8b779, 0x01356d72, 0x019b2657, 0x01cf5ebc, 0x039f76a0, 0x00108635}}, Y: Field{[10]uint32{0x02cfb28e, 0x0007ae6f, 0x00bdaf2c, 0x0157881f, 0x0187e603, 0x02ca1308, 0x01c05f4e, 0x00ed7f99, 0x02314907, 0x001a057d}}}, + {X: Field{[10]uint32{0x0269b0a9, 0x00bf06a8, 0x03b3864a, 0x01767936, 0x0203deca, 0x018d7e0e, 0x03337598, 0x02b30628, 0x02381a82, 0x001ab689}}, Y: Field{[10]uint32{0x02da6c08, 0x03388a57, 0x033bae8a, 0x03e2d854, 0x012e77b6, 0x022d7e10, 0x0105f32b, 0x0149bd83, 0x02da65f7, 0x0014f4d5}}}, + {X: Field{[10]uint32{0x0118b09e, 0x019863b8, 0x03579336, 0x0291e04f, 0x018bd46e, 0x030e0b10, 0x0118e987, 0x026965d5, 0x0101d9f2, 0x0017ea67}}, Y: Field{[10]uint32{0x03fc3b39, 0x003a0b4c, 0x034cd6fc, 0x000b6fb0, 0x02f15f66, 0x0260994a, 0x00e381e4, 0x02e06f73, 0x023838de, 0x00351e74}}}, + {X: Field{[10]uint32{0x00d76f6e, 0x000656d1, 0x03e4412d, 0x0002cadf, 0x030bbb4a, 0x03fbe5b4, 0x02676d72, 0x019eadba, 0x017634cc, 0x00331bb5}}, Y: Field{[10]uint32{0x03bf820c, 0x002bd8bd, 0x03e94f52, 0x00343692, 0x03dd801b, 0x020d0a13, 0x009e5f15, 0x0266e2ab, 0x015ad509, 0x0002c570}}}, + {X: Field{[10]uint32{0x00ffceb4, 0x00bb8e90, 0x03ddfec3, 0x01e761d1, 0x01ff4476, 0x00289adb, 0x0310bf89, 0x03a8ff7a, 0x03db5323, 0x00393343}}, Y: Field{[10]uint32{0x0220e1f5, 0x021a8c34, 0x00c48d5d, 0x01ef107e, 0x00e2caa8, 0x02dd8a71, 0x02af718d, 0x010d5d95, 0x00c8ba9c, 0x003ef6d0}}}, + {X: Field{[10]uint32{0x0388a8af, 0x02df3626, 0x025686af, 0x03b1e9d5, 0x030b3c1f, 0x008d1a0c, 0x01e3ca1a, 0x02e4a6b0, 0x022aba51, 0x001dff5c}}, Y: Field{[10]uint32{0x01e98505, 0x0243d6cf, 0x006919cf, 0x016cb1ec, 0x006b5b55, 0x037d2edd, 0x0378ee31, 0x0272d13c, 0x01e10d6e, 0x00340946}}}, + {X: Field{[10]uint32{0x017a41dd, 0x010630a6, 0x033e2665, 0x008e57fd, 0x006291e5, 0x00a67d3e, 0x03ca57bf, 0x00f51e74, 0x03bca9dd, 0x00134e47}}, Y: Field{[10]uint32{0x00ce899e, 0x03afc96d, 0x02fce1a9, 0x0310e7b1, 0x03e5d4a3, 0x024f10fc, 0x03e9fcd5, 0x0181aee4, 0x0033b55e, 0x0017327b}}}, + {X: Field{[10]uint32{0x03084e97, 0x00e9115c, 0x022ba83f, 0x03e20586, 0x012eb232, 0x0324bfa0, 0x019d63c3, 0x01ee1172, 0x004617b1, 0x001d02f1}}, Y: Field{[10]uint32{0x00355464, 0x00952bfe, 0x00c67883, 0x00aa640a, 0x02fb1074, 0x004c061d, 0x0317481c, 0x02559dc5, 0x006e0f4f, 0x0003f63b}}}, + {X: Field{[10]uint32{0x01b46e5c, 0x004396c0, 0x00392b2d, 0x03106f73, 0x00c6aa12, 0x0333b40c, 0x02fd8d60, 0x02114d6e, 0x021cadeb, 0x00309630}}, Y: Field{[10]uint32{0x01171d31, 0x01884e57, 0x022af4cb, 0x029d7b0f, 0x02b73646, 0x0083797c, 0x01d08afa, 0x02f5fdce, 0x037f3e60, 0x001f37c0}}}, + {X: Field{[10]uint32{0x00130d44, 0x03fee0c9, 0x01768dbe, 0x01786fff, 0x01fac22a, 0x00327299, 0x0180261c, 0x0135742f, 0x0069733a, 0x0023f220}}, Y: Field{[10]uint32{0x02fc946e, 0x03d2a804, 0x00a95954, 0x0298e3c3, 0x01ca5bf0, 0x0073b9a4, 0x0137ba74, 0x0010b553, 0x014bf88c, 0x0010846a}}}, + {X: Field{[10]uint32{0x0096ad4c, 0x0186ee43, 0x027c967a, 0x038ccae0, 0x00f5152d, 0x03a674c5, 0x03b0e0bc, 0x007091fe, 0x021a4032, 0x0033d8bb}}, Y: Field{[10]uint32{0x02c4a3fe, 0x00259007, 0x015a19bb, 0x00d99043, 0x02e61373, 0x01f70348, 0x01978c07, 0x01ee352f, 0x03c3e64f, 0x0018a129}}}, + {X: Field{[10]uint32{0x009f8ba7, 0x00103915, 0x019d06c0, 0x032bf5bf, 0x00bb00b3, 0x026da458, 0x00884431, 0x01dd83b3, 0x038a4d44, 0x0014cd47}}, Y: Field{[10]uint32{0x037f6b83, 0x014af34d, 0x02a0a163, 0x02e23027, 0x00c7c1cb, 0x015220e1, 0x01c148fd, 0x039bfdd5, 0x02193816, 0x0020e113}}}, + {X: Field{[10]uint32{0x0106bb0c, 0x00cd2287, 0x000a9e17, 0x01eb4b98, 0x03baa015, 0x02b3a501, 0x010e1f62, 0x02464653, 0x03ceee2c, 0x00280818}}, Y: Field{[10]uint32{0x03146339, 0x03061ba7, 0x01de05f4, 0x02c0401f, 0x03fcdaee, 0x011122a2, 0x01b40eac, 0x00fd4b6a, 0x01b55565, 0x0018c118}}}, + {X: Field{[10]uint32{0x01d35660, 0x02a35bf8, 0x018575a6, 0x027a546e, 0x02c360c0, 0x0259822a, 0x034f3741, 0x005d91c9, 0x01cc25de, 0x001c2f2f}}, Y: Field{[10]uint32{0x03461d74, 0x02c3d3b6, 0x02b64a90, 0x00c252a0, 0x003a1c74, 0x02787503, 0x035e719a, 0x01673a02, 0x019b7163, 0x000ef56f}}}, + {X: Field{[10]uint32{0x02dc8fc7, 0x004b466a, 0x01fff138, 0x0305d055, 0x0054b161, 0x02945778, 0x03b1fe52, 0x030f01be, 0x017783cf, 0x00037e2b}}, Y: Field{[10]uint32{0x00069569, 0x031cd560, 0x0060444e, 0x006c4993, 0x01af3840, 0x002df2e6, 0x034ff20a, 0x036c3274, 0x00f60416, 0x002f1024}}}, + {X: Field{[10]uint32{0x000a30f9, 0x02a76795, 0x009ed777, 0x011f8154, 0x028788df, 0x014b55be, 0x02fff3a4, 0x0260017c, 0x01ccef39, 0x0009413a}}, Y: Field{[10]uint32{0x0390612a, 0x0167de5c, 0x00a51116, 0x013b6da4, 0x036fd651, 0x02d7f60c, 0x03f4d2fa, 0x023bf2bd, 0x02a2c6f4, 0x001cf141}}}, + {X: Field{[10]uint32{0x03c97025, 0x005068d6, 0x03a61571, 0x00320678, 0x0218a9ce, 0x0225e7f3, 0x02a6fa56, 0x000cd0e9, 0x03241c92, 0x00093b81}}, Y: Field{[10]uint32{0x00bd7b8a, 0x00909f2c, 0x00bf6ba2, 0x00580bec, 0x03fa0c68, 0x035fd364, 0x0140a6cc, 0x0213a1a2, 0x02cd605b, 0x003b990b}}}, + {X: Field{[10]uint32{0x023929b3, 0x01b6465e, 0x03093e1c, 0x00ac9700, 0x014961e1, 0x00825fcd, 0x00d8eb11, 0x0301698f, 0x00e09665, 0x0007ab57}}, Y: Field{[10]uint32{0x0156fcc3, 0x012a9b5c, 0x0009dc2f, 0x03d77b9c, 0x007284b5, 0x00775c48, 0x0032fbea, 0x03312ac7, 0x035da1ab, 0x00060037}}}, + {X: Field{[10]uint32{0x0205d507, 0x01e247ba, 0x009c098e, 0x03bcb97a, 0x03160c69, 0x020e21d2, 0x020b0dcd, 0x013e3e40, 0x03f22608, 0x0011f3cb}}, Y: Field{[10]uint32{0x01fb7d48, 0x03e948b5, 0x03516cf8, 0x03723720, 0x00bca2ef, 0x00e19919, 0x004d0d2c, 0x016bfc41, 0x03df129b, 0x0028d034}}}, + {X: Field{[10]uint32{0x02d6cbdd, 0x038e7110, 0x03e75b04, 0x02a0fe69, 0x0151f050, 0x0391d293, 0x018bb8ea, 0x01254a88, 0x039b8e2e, 0x0010193e}}, Y: Field{[10]uint32{0x0035de10, 0x0221b76e, 0x03d2b9c7, 0x030346b7, 0x0118ea66, 0x02b77383, 0x013e02aa, 0x0064c24b, 0x0076a2ef, 0x003fe73b}}}, + {X: Field{[10]uint32{0x0381904e, 0x038cd4fe, 0x000d222d, 0x0101a766, 0x03cdd70a, 0x029b5007, 0x01e0150b, 0x008340c8, 0x00d6e58e, 0x0020e2b2}}, Y: Field{[10]uint32{0x015614bc, 0x015222b6, 0x027105f9, 0x03f03a24, 0x01b1ef24, 0x01054ccc, 0x01a6b251, 0x036efdee, 0x03962909, 0x00264e9b}}}, + {X: Field{[10]uint32{0x0202f266, 0x03a6d7b8, 0x033855fc, 0x01caf133, 0x035aedee, 0x03b3d650, 0x016ea260, 0x010f48d3, 0x0183189d, 0x002978db}}, Y: Field{[10]uint32{0x01822c55, 0x02c7251e, 0x03fe954a, 0x02d79fae, 0x03dfc2d1, 0x01050d68, 0x012933fb, 0x00ee2677, 0x003ce25c, 0x001e300b}}}, + {X: Field{[10]uint32{0x03ba72c9, 0x0323f8c7, 0x035725dd, 0x01ea6d47, 0x015ad79e, 0x0235bdeb, 0x03312095, 0x03134cd3, 0x00bcd357, 0x00278903}}, Y: Field{[10]uint32{0x0111f06b, 0x0245cb2d, 0x030eb672, 0x00433be7, 0x0068cc5e, 0x00c2cf27, 0x01476b7b, 0x02818bb0, 0x025ced60, 0x002ba8d2}}}, + {X: Field{[10]uint32{0x02dc2eba, 0x036bb0ed, 0x020c7ea8, 0x016a182f, 0x02dfc9ed, 0x03b91e89, 0x022b91d1, 0x014e0170, 0x0246bb31, 0x002b46c1}}, Y: Field{[10]uint32{0x02dd2083, 0x02e65564, 0x018bb353, 0x02a5b4c3, 0x03a298da, 0x0285661c, 0x0110c9ee, 0x0314246a, 0x01a22499, 0x003b8b98}}}, + {X: Field{[10]uint32{0x030ec72b, 0x02df34d6, 0x020cc35c, 0x01d288da, 0x02fa12df, 0x0047b2a9, 0x00d8c7f0, 0x03d92954, 0x008911d8, 0x0013dec2}}, Y: Field{[10]uint32{0x01bb21e3, 0x00549713, 0x01d993e3, 0x0143c778, 0x0129b942, 0x035fe1a4, 0x019ffac8, 0x01f862d3, 0x001b0d29, 0x0024c6bd}}}, + {X: Field{[10]uint32{0x03d3a7ee, 0x00d48f24, 0x01870d2d, 0x01d0d5a5, 0x02834d02, 0x002ec4be, 0x03ba8747, 0x023cf24f, 0x0170e410, 0x0036aca8}}, Y: Field{[10]uint32{0x0173ae4d, 0x002cbef1, 0x0251e7bb, 0x01bc5d19, 0x03293a5c, 0x002338d6, 0x02ecb24d, 0x0004377a, 0x02cfc37f, 0x00098bc4}}}, + {X: Field{[10]uint32{0x03cf39be, 0x031d2128, 0x03a317ab, 0x021f12f3, 0x02d499f6, 0x0046d699, 0x01e50823, 0x035cb906, 0x017b0784, 0x000d0dc9}}, Y: Field{[10]uint32{0x01c398d3, 0x02cef6a9, 0x00ec2a49, 0x0281dbc7, 0x00f38bd0, 0x02c1b5f0, 0x013fa143, 0x035a3a11, 0x03076da8, 0x0033a6f3}}}, + {X: Field{[10]uint32{0x0099545b, 0x0179cd82, 0x0155c9ed, 0x0024d2b4, 0x03939fa4, 0x028d2feb, 0x0386024e, 0x006ad6fd, 0x029f8261, 0x0011652b}}, Y: Field{[10]uint32{0x02d450f5, 0x00fe4a3a, 0x00da4c4b, 0x0178fb83, 0x0177d3f1, 0x01ded1e3, 0x0034e72e, 0x02e9cb0e, 0x03f562b0, 0x00089571}}}, + {X: Field{[10]uint32{0x01898819, 0x0084b760, 0x003c2f13, 0x00dac89d, 0x033aebb0, 0x01ad6169, 0x02b21fc2, 0x001bec0d, 0x030512db, 0x0001ccdd}}, Y: Field{[10]uint32{0x00307887, 0x00315fd4, 0x03c51515, 0x03b4a4a0, 0x00848b53, 0x0161fcfe, 0x01cf461c, 0x02c28958, 0x0159725f, 0x001d4f77}}}, + {X: Field{[10]uint32{0x029790ff, 0x02af59b5, 0x0372e3f2, 0x00b41953, 0x00a53f4c, 0x0231d2af, 0x02d81c10, 0x03fbcd54, 0x00144d2a, 0x002f6456}}, Y: Field{[10]uint32{0x0027763e, 0x01fb4b46, 0x005b950e, 0x016e5783, 0x0231ae89, 0x017d1c52, 0x02b3277a, 0x038dced0, 0x01e17f27, 0x0006bd82}}}, + {X: Field{[10]uint32{0x015bb557, 0x0395b6e4, 0x03c73d4c, 0x01007d27, 0x01677827, 0x00f621c3, 0x001ced90, 0x03fb88a3, 0x014ca51d, 0x00228473}}, Y: Field{[10]uint32{0x02f5cf23, 0x003d8655, 0x017196be, 0x03c09cce, 0x02ca46b3, 0x03d1c403, 0x00278229, 0x02725fbb, 0x03eeae9f, 0x0034c2b5}}}, + {X: Field{[10]uint32{0x039bfcfd, 0x011b61db, 0x01ea697d, 0x035f0291, 0x03cfd058, 0x016c09ca, 0x023e6886, 0x02ffadb0, 0x01f02802, 0x001e4a6d}}, Y: Field{[10]uint32{0x00fde5d0, 0x02d538bd, 0x00b36963, 0x033507c2, 0x018c80d1, 0x00aa2430, 0x01e366c3, 0x01e0f534, 0x02218039, 0x003e6eeb}}}, + {X: Field{[10]uint32{0x03d89d01, 0x0131498e, 0x018bcf6e, 0x01566c69, 0x03d55f88, 0x0327c07c, 0x000e79bc, 0x0259be02, 0x02ac1d5b, 0x002037c1}}, Y: Field{[10]uint32{0x01136538, 0x006ab250, 0x03a7ebe4, 0x00dc9983, 0x025ee5c3, 0x030043cd, 0x025614ba, 0x0162a498, 0x02d0a595, 0x000d1a49}}}, + {X: Field{[10]uint32{0x025ccaf7, 0x020cc56f, 0x00ac6efc, 0x036b483d, 0x03ed4b01, 0x020eb44e, 0x0292b4f3, 0x020fca52, 0x00789ff3, 0x001d1515}}, Y: Field{[10]uint32{0x0160fa9a, 0x01ddf2f0, 0x00ceafae, 0x018679d8, 0x03e82173, 0x0133cad7, 0x01ea165c, 0x01dffb78, 0x037781ee, 0x000d9227}}}, + {X: Field{[10]uint32{0x02f8fe85, 0x00af3616, 0x01e67de6, 0x0357e1df, 0x03e562d7, 0x00a0a2df, 0x0011fdb4, 0x02a28257, 0x01bcb213, 0x000b1b4d}}, Y: Field{[10]uint32{0x035d159b, 0x02f9ad31, 0x0163144d, 0x0270af4d, 0x002e6013, 0x00bc8ca6, 0x002206c7, 0x013e7d14, 0x03703409, 0x002a8c38}}}, + {X: Field{[10]uint32{0x02e338db, 0x0369c3ec, 0x027be830, 0x0274c12a, 0x024b4342, 0x00a33458, 0x011846a7, 0x013ac0a0, 0x017a9d93, 0x0020d4d9}}, Y: Field{[10]uint32{0x00e02b71, 0x0275011d, 0x003b166a, 0x02bcebfe, 0x02ed4a4c, 0x039a4f22, 0x0189c5ac, 0x03e974a0, 0x0038020f, 0x003e1001}}}, + {X: Field{[10]uint32{0x02ae494f, 0x02a377ea, 0x027f6fd1, 0x01cd3b61, 0x012177ca, 0x018698a6, 0x02f63365, 0x015b5f1f, 0x013a54ce, 0x003c85ba}}, Y: Field{[10]uint32{0x00d30611, 0x00fa912b, 0x036723f4, 0x02dc0bc6, 0x038da296, 0x004730d1, 0x03e8fadb, 0x020c9818, 0x0313a0fe, 0x0036c28f}}}, + {X: Field{[10]uint32{0x008324fb, 0x0342046a, 0x03112273, 0x032379b9, 0x002e9a3d, 0x018bb1fd, 0x022baa4b, 0x01cfe595, 0x02219b5d, 0x00370dc4}}, Y: Field{[10]uint32{0x0357c004, 0x02c553f7, 0x000fb581, 0x0055f0cc, 0x004f1c90, 0x00a7e6ed, 0x020acaa9, 0x00fa58dc, 0x0092ec56, 0x003bb324}}}, + {X: Field{[10]uint32{0x02649475, 0x02641c8d, 0x0116dd44, 0x01ed0959, 0x02b10f04, 0x03bd4d2b, 0x02f60296, 0x02d3c787, 0x036d48f0, 0x0036cd1c}}, Y: Field{[10]uint32{0x00586bec, 0x02f93fab, 0x00fdfdd1, 0x01985934, 0x001a1169, 0x024f9462, 0x02c34c9b, 0x031e1a54, 0x016cf7a8, 0x00070a73}}}, + {X: Field{[10]uint32{0x03696add, 0x031ca5c0, 0x03d3378f, 0x03b4d63e, 0x01971b09, 0x00bd6f3c, 0x015af536, 0x021093cd, 0x00572046, 0x00028921}}, Y: Field{[10]uint32{0x02547803, 0x028ddd89, 0x006948c9, 0x00c6f214, 0x03baffc9, 0x00b8915c, 0x0367a56c, 0x037ae28d, 0x016137d0, 0x00269c0f}}}, + {X: Field{[10]uint32{0x024436c4, 0x027ea8c4, 0x01ed240c, 0x02e63ec9, 0x023eba38, 0x007da343, 0x02aa4293, 0x01d4eeef, 0x006fa9ac, 0x002edee0}}, Y: Field{[10]uint32{0x02426752, 0x020daa04, 0x02e646e5, 0x0273e6d0, 0x0007c6ff, 0x026c0543, 0x03682e3d, 0x02efa366, 0x0174a1a8, 0x0023e049}}}, + {X: Field{[10]uint32{0x03ecf446, 0x0025bff0, 0x01ad517b, 0x02a9d125, 0x00489344, 0x02783c1a, 0x02194276, 0x02808fd9, 0x0076fc28, 0x0019c0f1}}, Y: Field{[10]uint32{0x00e2a38c, 0x02b10f4a, 0x0215eed3, 0x02ac148b, 0x00f42699, 0x019cc785, 0x00211a30, 0x029c8d61, 0x023f7c9b, 0x0022d200}}}, + {X: Field{[10]uint32{0x02dbf6a2, 0x012e9878, 0x023b71b4, 0x02a8d251, 0x0214cf0d, 0x00584ae0, 0x023f3b7a, 0x02d123f8, 0x00e4bfa4, 0x002f2abe}}, Y: Field{[10]uint32{0x01c7f404, 0x0385c435, 0x01736d6f, 0x03b1a333, 0x03b07498, 0x02fa1e4e, 0x0108835d, 0x0254ffa7, 0x0300e2cc, 0x002f7fc9}}}, + {X: Field{[10]uint32{0x0310cd49, 0x0361e464, 0x00f7bbfe, 0x005cfb1d, 0x02217945, 0x01c9a8b9, 0x015b446d, 0x01c88077, 0x03da1a55, 0x00241ad3}}, Y: Field{[10]uint32{0x012653cf, 0x029d34e2, 0x00f93441, 0x0240b5fd, 0x01cf8384, 0x021a421c, 0x0304bc47, 0x0134a340, 0x02dbcd2c, 0x0035d4fc}}}, + {X: Field{[10]uint32{0x02f93d5f, 0x009ab0e7, 0x029058d7, 0x0337ade1, 0x00fa5369, 0x006ff741, 0x000e326e, 0x01f65546, 0x0383018f, 0x0027b025}}, Y: Field{[10]uint32{0x03acf205, 0x0252b765, 0x02049d17, 0x03e3e252, 0x00ad22ba, 0x034a3edc, 0x02c68424, 0x0059054e, 0x0057994b, 0x002732a0}}}, + {X: Field{[10]uint32{0x02b8209d, 0x038cc504, 0x030f3a2d, 0x02faec00, 0x036f823c, 0x004534bc, 0x0362a96f, 0x0103b0a0, 0x0106b754, 0x0014cd1e}}, Y: Field{[10]uint32{0x020c1fa0, 0x02824332, 0x0034ab06, 0x0200f864, 0x01595816, 0x025543b1, 0x02f1bf02, 0x022af91f, 0x00e0471f, 0x000332ce}}}, + {X: Field{[10]uint32{0x023a4870, 0x023e0374, 0x013373b9, 0x00445485, 0x03a33e54, 0x02cd5e01, 0x0224b18e, 0x0012024f, 0x032961b7, 0x0009f14f}}, Y: Field{[10]uint32{0x02575601, 0x02e222f6, 0x014fe2f3, 0x03ea2016, 0x00703fa5, 0x02b23139, 0x03c70e59, 0x00db11c7, 0x038de186, 0x00168fd2}}}, + {X: Field{[10]uint32{0x0259b68f, 0x03339d77, 0x02a5beac, 0x028f9d72, 0x0322ed51, 0x03d57084, 0x02616bac, 0x017e684a, 0x03e37a11, 0x00248649}}, Y: Field{[10]uint32{0x0327b141, 0x00db1341, 0x00ae2e06, 0x01c45e19, 0x0155884e, 0x0098f5de, 0x02fb5906, 0x0316d662, 0x007bc1e4, 0x002f6edf}}}, + {X: Field{[10]uint32{0x033ea8c2, 0x01b35b8f, 0x01ff8dde, 0x002468f6, 0x01efb3e6, 0x0390c9d4, 0x03c692ca, 0x007ff59d, 0x00876eb8, 0x0025cecf}}, Y: Field{[10]uint32{0x03bbb0ed, 0x03af7655, 0x003b849a, 0x02b8ea5a, 0x018684b0, 0x036f3b36, 0x0112c5da, 0x01442e90, 0x03710129, 0x000d037d}}}, + {X: Field{[10]uint32{0x0301ae71, 0x017a6b06, 0x02ce4020, 0x00c84995, 0x00d5972c, 0x024811c0, 0x038ef036, 0x00dd9e64, 0x03def053, 0x00082e05}}, Y: Field{[10]uint32{0x0395707b, 0x0052aa20, 0x01c1234a, 0x0193faa6, 0x01c6b1ce, 0x01282af1, 0x025c3529, 0x02805871, 0x025be2da, 0x000ab8bf}}}, + {X: Field{[10]uint32{0x03c95876, 0x02226d28, 0x01402aa6, 0x0358f64c, 0x01ca9fc5, 0x01cbad0f, 0x02347b7f, 0x0246041e, 0x004f7a7e, 0x0018f895}}, Y: Field{[10]uint32{0x000d16b1, 0x032b5c4a, 0x02067f91, 0x02c7e1b9, 0x02adf49c, 0x022f57eb, 0x01cdf521, 0x00533801, 0x026d20d7, 0x00398abb}}}, + {X: Field{[10]uint32{0x022aeb80, 0x00e5d4f8, 0x034216ac, 0x01cb9060, 0x01a69dd4, 0x011f5d8b, 0x0183abfc, 0x0233c2cd, 0x02107150, 0x000be437}}, Y: Field{[10]uint32{0x0388d389, 0x024eaf4d, 0x0264b761, 0x0226708f, 0x00880f3a, 0x02846122, 0x01e5e025, 0x0375d189, 0x02bd04a0, 0x0014dc6f}}}, + {X: Field{[10]uint32{0x02ed7209, 0x0373ca74, 0x0048ac9a, 0x03082b47, 0x037c9359, 0x03968d47, 0x0237cf75, 0x01b41517, 0x00e8faa9, 0x0023508f}}, Y: Field{[10]uint32{0x03ab40f2, 0x002c4a42, 0x03d6eea8, 0x03056b02, 0x03bb9d23, 0x0299570f, 0x00df7948, 0x03100686, 0x003dee76, 0x0020f52e}}}, + {X: Field{[10]uint32{0x00181efd, 0x03b04420, 0x03ea3bec, 0x0220156c, 0x02a9c91d, 0x02451090, 0x03111a20, 0x022bfcc0, 0x01425e02, 0x0004be90}}, Y: Field{[10]uint32{0x00c3ff57, 0x00ab103a, 0x03d4dc4d, 0x022ecb8d, 0x03ee5c3b, 0x018bac43, 0x010eddb3, 0x00ad5eb0, 0x03708e79, 0x001ae56c}}}, + {X: Field{[10]uint32{0x02706f73, 0x011e20a2, 0x00bbff83, 0x01bfff43, 0x00ce7019, 0x037cb5cc, 0x0105632c, 0x0375f35d, 0x015f2a3b, 0x00248f2a}}, Y: Field{[10]uint32{0x0346abbc, 0x0106ad49, 0x032ee3e5, 0x036f2b42, 0x031903af, 0x00433ffc, 0x003983b2, 0x0185cece, 0x0066c39b, 0x003e2c32}}}, + {X: Field{[10]uint32{0x00893646, 0x027835a2, 0x01776a86, 0x02859882, 0x0064ce3a, 0x00a3d1c1, 0x023875a7, 0x0103a58f, 0x013e8782, 0x00021135}}, Y: Field{[10]uint32{0x03eeaca1, 0x01579cdb, 0x032b25b8, 0x031c67ec, 0x011c84f9, 0x01c4ef1d, 0x00c47b4a, 0x02307fe6, 0x029192bf, 0x00318334}}}, + {X: Field{[10]uint32{0x01dc98f3, 0x01eb087c, 0x02b2a65e, 0x027d998d, 0x03883829, 0x00016977, 0x0277ff81, 0x007636e8, 0x03d6c547, 0x0010de1b}}, Y: Field{[10]uint32{0x02091b51, 0x00bd4a95, 0x0127e914, 0x0213e630, 0x03745ff8, 0x021c1bf9, 0x039109cb, 0x016ef63d, 0x02c29c8c, 0x0034a4a8}}}, + {X: Field{[10]uint32{0x0236d7ab, 0x01cdb72b, 0x0257ce94, 0x01162c1c, 0x02bb0dec, 0x02e628b3, 0x0383f71f, 0x03b3d8e1, 0x028df5e9, 0x001b46f0}}, Y: Field{[10]uint32{0x00d549e6, 0x020008e2, 0x0238da0e, 0x001c8c85, 0x00e2c00e, 0x00a04237, 0x0214cf7a, 0x00111e18, 0x0192bfd8, 0x0030b150}}}, + {X: Field{[10]uint32{0x02ff86c6, 0x0255aac5, 0x037f67d8, 0x0333fe12, 0x016c742c, 0x00f89975, 0x033f89cc, 0x0338f0bb, 0x03347f74, 0x001af13b}}, Y: Field{[10]uint32{0x01b46408, 0x03f33c5e, 0x0066b8b0, 0x03918317, 0x01be26a6, 0x01af798b, 0x036be35c, 0x02c13c49, 0x02fd2d2a, 0x003ad124}}}, + {X: Field{[10]uint32{0x03678b38, 0x03ea66ef, 0x00ddcb35, 0x00af2ccf, 0x000d67a6, 0x00342357, 0x02a756e0, 0x00256350, 0x0075fa81, 0x001abd14}}, Y: Field{[10]uint32{0x025bff28, 0x01ffe7ee, 0x00bfd528, 0x024e1258, 0x02886c7b, 0x02dce199, 0x00ffc3fa, 0x020b1d9e, 0x024f0e76, 0x002b6edc}}}, + {X: Field{[10]uint32{0x01260600, 0x03a29995, 0x011caa24, 0x003e416b, 0x00939f34, 0x0156dd18, 0x02f49cd3, 0x018d96a5, 0x03763646, 0x003adb62}}, Y: Field{[10]uint32{0x03bea3cd, 0x02eb835f, 0x015c33c2, 0x021c0cfe, 0x0241f7a1, 0x000ee074, 0x03a11ff6, 0x002dfee6, 0x02fdaea3, 0x001eba73}}}, + {X: Field{[10]uint32{0x01795068, 0x0115d7a4, 0x000af11e, 0x026eb594, 0x01b34d5e, 0x02eb533d, 0x038dd694, 0x01f4fd9c, 0x02332fef, 0x002f4308}}, Y: Field{[10]uint32{0x011cf209, 0x02082fa7, 0x0113676f, 0x015ceaa7, 0x01a91c4d, 0x01a08e93, 0x01100b66, 0x02c8702a, 0x004e2ea0, 0x003aae97}}}, + {X: Field{[10]uint32{0x02b7e392, 0x03261e54, 0x034b5054, 0x027e010d, 0x030aa56d, 0x01092455, 0x003e0831, 0x025064d2, 0x03bdc504, 0x0031788e}}, Y: Field{[10]uint32{0x02597751, 0x022b1e9b, 0x00fe2f7f, 0x019a156d, 0x038d59e7, 0x02a92b8f, 0x01cd02e3, 0x0085feff, 0x00cbf684, 0x00132bae}}}, + {X: Field{[10]uint32{0x0092d2a3, 0x019f3e23, 0x00bd8108, 0x02637a8e, 0x0017178e, 0x03487181, 0x003edb03, 0x02ae4955, 0x0231f3aa, 0x002d5c5d}}, Y: Field{[10]uint32{0x0011942a, 0x01027ca3, 0x020e9a02, 0x02b23c74, 0x00d2bdf0, 0x00936ead, 0x03318745, 0x02a7bc22, 0x01cc0324, 0x0039d082}}}, + {X: Field{[10]uint32{0x01305cfc, 0x012d7a57, 0x00cca2fe, 0x01f1ee0e, 0x01b2d17b, 0x00c281f8, 0x00a85d5d, 0x007cbf2b, 0x00994960, 0x00271158}}, Y: Field{[10]uint32{0x0304eeb6, 0x03b81bbf, 0x00674674, 0x030d6172, 0x00329273, 0x0079401e, 0x001b61b3, 0x0371f0a1, 0x0140a109, 0x000b5e85}}}, + {X: Field{[10]uint32{0x02a82f63, 0x01de9462, 0x00d5498c, 0x0175cc8a, 0x03e33dae, 0x00ed9812, 0x02ff1757, 0x00db12a2, 0x0146c0ab, 0x0014ab8a}}, Y: Field{[10]uint32{0x037f87b4, 0x035dc71d, 0x0104d24d, 0x0320190c, 0x027179f5, 0x019524fc, 0x003f899b, 0x006fe934, 0x019b6606, 0x001c388f}}}, + {X: Field{[10]uint32{0x0394adf9, 0x0167c280, 0x03dcef4f, 0x030b0a7b, 0x0189db9a, 0x0210207a, 0x01ba4903, 0x0118b770, 0x03bf55ff, 0x000527b0}}, Y: Field{[10]uint32{0x009dd7af, 0x02a2f05e, 0x01801341, 0x01737e52, 0x0049642b, 0x039a5472, 0x028fbc7c, 0x02e508ab, 0x0188b91d, 0x00016707}}}, + {X: Field{[10]uint32{0x02ea7ea7, 0x018e0410, 0x005768a1, 0x00270534, 0x03dbe14a, 0x0054e368, 0x03835346, 0x0063777f, 0x0294d667, 0x002bfe24}}, Y: Field{[10]uint32{0x0159266b, 0x0139d913, 0x00bb9a92, 0x0244aa23, 0x017b6154, 0x02f095b7, 0x022352ac, 0x021e97b3, 0x03ebcf58, 0x001c619a}}}, + {X: Field{[10]uint32{0x004e76fc, 0x02ed0196, 0x02b78da7, 0x02dce38a, 0x0133887e, 0x000f8ad0, 0x012d49b3, 0x0011cab5, 0x00782cb3, 0x0037913d}}, Y: Field{[10]uint32{0x02482bf5, 0x0348f273, 0x01da7eef, 0x03ea0c3b, 0x01b13d08, 0x02b23bc8, 0x03c630d7, 0x0360b015, 0x018425ba, 0x0019e62b}}}, + {X: Field{[10]uint32{0x01682e61, 0x03b1f1ce, 0x021345a2, 0x03aca253, 0x02b3a380, 0x006e80b1, 0x032c88be, 0x024d9b05, 0x02737616, 0x00382f1e}}, Y: Field{[10]uint32{0x022cb2e0, 0x01827349, 0x024d3c23, 0x030aad50, 0x035ad1f7, 0x01edfa64, 0x027c0ec8, 0x023fa37f, 0x02b933b1, 0x002f451f}}}, + {X: Field{[10]uint32{0x032f0e6d, 0x01e91d80, 0x03b1127c, 0x0269c73e, 0x02ed2613, 0x0294da88, 0x033cfa70, 0x027cce51, 0x03272af6, 0x0017b8d3}}, Y: Field{[10]uint32{0x00e13b8c, 0x018abab1, 0x036cb807, 0x004370d8, 0x011316bf, 0x01737bf1, 0x0257de98, 0x01360bda, 0x0396dc0d, 0x003077e3}}}, + {X: Field{[10]uint32{0x0199a0f2, 0x03397a39, 0x0113a68b, 0x011afb57, 0x03672968, 0x03855f5e, 0x00c274df, 0x01e98e6e, 0x03c177fa, 0x0013728e}}, Y: Field{[10]uint32{0x012fb234, 0x030cb14f, 0x032a1d01, 0x01a14bbf, 0x012fb489, 0x03d6723a, 0x033fd758, 0x026baff6, 0x015836fb, 0x0023f4ad}}}, + {X: Field{[10]uint32{0x00b48136, 0x0211d47e, 0x004f5bc1, 0x00d280d2, 0x00980810, 0x03a64fd5, 0x01ed9373, 0x000a43be, 0x03c18756, 0x001553da}}, Y: Field{[10]uint32{0x0172b26a, 0x0129af28, 0x0183d206, 0x00e8783f, 0x03de8086, 0x0230fd43, 0x03834e0e, 0x004a8d45, 0x03b7dfd5, 0x002d1530}}}, + {X: Field{[10]uint32{0x01592ad4, 0x00a096e1, 0x02ba420b, 0x01f2d4e7, 0x02955af8, 0x018b708b, 0x0160b2e1, 0x021e69aa, 0x0350a6c0, 0x00256a06}}, Y: Field{[10]uint32{0x0045c712, 0x006ac303, 0x011af265, 0x021bd9c0, 0x037c7d50, 0x00e2a930, 0x0072b75f, 0x008b47d6, 0x00c4dfed, 0x002f957a}}}, + {X: Field{[10]uint32{0x037e5c4d, 0x02e2f9d1, 0x01d853ef, 0x029ba8a4, 0x0244a4f8, 0x00c7d560, 0x00d14d34, 0x01a9b8d6, 0x01539e49, 0x00241edb}}, Y: Field{[10]uint32{0x03150eac, 0x021cb91d, 0x0265c21f, 0x0000a489, 0x01ff33e2, 0x0375f475, 0x0017fad1, 0x02ee799e, 0x02943853, 0x002cf4f5}}}, + {X: Field{[10]uint32{0x03f17aa6, 0x03330271, 0x003575bc, 0x0191adea, 0x01c8884c, 0x00fc5d81, 0x0337cb23, 0x015dbd9d, 0x001bb342, 0x002149f2}}, Y: Field{[10]uint32{0x037604fc, 0x013a3d61, 0x02a64504, 0x0274cce1, 0x019cd47b, 0x0115ddfc, 0x031930c1, 0x0149255e, 0x01bcdb8d, 0x002db59d}}}, + {X: Field{[10]uint32{0x03ab00ec, 0x025d38bb, 0x01e9f913, 0x00ea066e, 0x03bc6bf8, 0x03e41ba6, 0x02134360, 0x0036493a, 0x027d5a32, 0x0023878e}}, Y: Field{[10]uint32{0x0018b0b9, 0x002783fd, 0x01c4aff3, 0x01f1e4a0, 0x000792e0, 0x029e4b14, 0x023dad4e, 0x017c970c, 0x03abd81d, 0x003653c0}}}, + {X: Field{[10]uint32{0x019a8d76, 0x03eadd54, 0x0034d72c, 0x0125731d, 0x02dd0d89, 0x031a32da, 0x02cbd86b, 0x012a3426, 0x0393be1f, 0x003f00b2}}, Y: Field{[10]uint32{0x024d4f94, 0x00f1dc9f, 0x004e98b7, 0x027659fa, 0x02ffe4cd, 0x0216895b, 0x026ceb08, 0x01171662, 0x0132729e, 0x001c7de9}}}, + {X: Field{[10]uint32{0x03e6e7b8, 0x00a26c42, 0x016af80a, 0x01fe6cbb, 0x03ff7635, 0x03c21d46, 0x02c44db4, 0x022ceec6, 0x0302a285, 0x0033e604}}, Y: Field{[10]uint32{0x0173b528, 0x006fa223, 0x007bad3a, 0x00a2e221, 0x02f1a8a8, 0x0213c7e8, 0x0205ded9, 0x0199b9c0, 0x0012bf23, 0x0008dfa7}}}, + {X: Field{[10]uint32{0x00231d82, 0x03712faa, 0x01228e97, 0x00782e81, 0x0371718d, 0x03235433, 0x0274cbba, 0x03a480f2, 0x01dc1408, 0x000f9b91}}, Y: Field{[10]uint32{0x031ef848, 0x01d19dce, 0x028a3147, 0x0387c3f7, 0x03961009, 0x01fbe1b7, 0x01f287ca, 0x02a017d8, 0x037a2ad3, 0x000b8ff6}}}, + {X: Field{[10]uint32{0x007d4657, 0x02e7b69c, 0x028b3749, 0x02cb7c99, 0x023ce1b2, 0x00466c3b, 0x00090888, 0x0051c442, 0x03950758, 0x002ec11d}}, Y: Field{[10]uint32{0x01c67587, 0x00e45a1d, 0x01bc1bc4, 0x016ff38a, 0x028d6ee5, 0x036fbbb4, 0x01ad6977, 0x03ce9abd, 0x02fc5f95, 0x002569cb}}}, + {X: Field{[10]uint32{0x00dd6748, 0x01746e5a, 0x0193903f, 0x01b604a4, 0x0100fe35, 0x0338132d, 0x03a31034, 0x00b0412a, 0x0142b8b0, 0x00138057}}, Y: Field{[10]uint32{0x00a870fb, 0x010b001c, 0x00d2dd39, 0x03ea046f, 0x02746419, 0x02499d08, 0x00e96ffc, 0x01b5c765, 0x00e7dfbf, 0x0034d6c8}}}, + {X: Field{[10]uint32{0x00a49daf, 0x00dd1649, 0x0386792a, 0x03c90437, 0x0270850a, 0x01a341e3, 0x037391bd, 0x02c8427a, 0x005790c8, 0x00182693}}, Y: Field{[10]uint32{0x03ad0e98, 0x01540bc2, 0x00e8a0e3, 0x000347cd, 0x0314431d, 0x02290e42, 0x01cb14e7, 0x016ce960, 0x027ebc96, 0x003ce98c}}}, + {X: Field{[10]uint32{0x027fc730, 0x02eac0e8, 0x00aa1780, 0x0184c16d, 0x01b9ea07, 0x005fb3d8, 0x01b7558a, 0x016b0138, 0x03362a95, 0x00332f81}}, Y: Field{[10]uint32{0x0092cd3b, 0x0311fe47, 0x03abb71f, 0x00492c0f, 0x00d981a0, 0x00190ca6, 0x02a4e3ae, 0x02875d97, 0x00166c98, 0x003e5adf}}}, + {X: Field{[10]uint32{0x03ccab14, 0x01471a70, 0x008c3e21, 0x01a6a10e, 0x009143c5, 0x01384738, 0x0310ef90, 0x008c0b9a, 0x028285df, 0x001bb580}}, Y: Field{[10]uint32{0x02d196e7, 0x0247a946, 0x026081d5, 0x00709614, 0x03e91b0d, 0x0199798b, 0x03c75649, 0x00ede3a3, 0x03b0687a, 0x0019d7a8}}}, + {X: Field{[10]uint32{0x0349d8e0, 0x01ffda72, 0x02c7f4c0, 0x01dd10f6, 0x02708061, 0x0214554c, 0x033c5923, 0x02853156, 0x01cba0cc, 0x002f7fc1}}, Y: Field{[10]uint32{0x020c9a50, 0x0041b69b, 0x017981dd, 0x024eaab2, 0x03f09d79, 0x020ce443, 0x00a72390, 0x023b309d, 0x010486cd, 0x0014526b}}}, + {X: Field{[10]uint32{0x022bff2b, 0x01e64453, 0x0386eed5, 0x01570b1c, 0x00af9f6e, 0x01e6bb47, 0x03e53665, 0x00c96c8a, 0x028ccc70, 0x00019339}}, Y: Field{[10]uint32{0x01cb1cae, 0x01abb791, 0x0106bd59, 0x0387aad9, 0x0211bf1b, 0x0084f2ee, 0x021dddf2, 0x02683bbd, 0x01763c8a, 0x003e3226}}}, + {X: Field{[10]uint32{0x00ab2bb4, 0x0051c686, 0x007edaf0, 0x03d58984, 0x02b40de7, 0x007968bd, 0x02f3c06e, 0x0143cf72, 0x006f4891, 0x003350b9}}, Y: Field{[10]uint32{0x01bcfada, 0x03f68280, 0x025c281d, 0x0227d9e7, 0x0017f11f, 0x0094e9e2, 0x00921f4e, 0x01a59ed3, 0x00ddd202, 0x00367094}}}, + {X: Field{[10]uint32{0x01619735, 0x0157c062, 0x02c4359d, 0x0070d713, 0x025e9b12, 0x03b136ba, 0x01a7e8e3, 0x0150838b, 0x0007e714, 0x003df0a4}}, Y: Field{[10]uint32{0x03a493b7, 0x02928cfa, 0x023ddc2b, 0x00e8db3e, 0x005ea293, 0x0281b76c, 0x03735a56, 0x02a4f98d, 0x00064dbd, 0x00199145}}}, + {X: Field{[10]uint32{0x0293b7a8, 0x007d9e57, 0x010f2c5c, 0x034b6445, 0x00377609, 0x01c560d7, 0x033d2214, 0x0121589a, 0x01e1d494, 0x0018ce70}}, Y: Field{[10]uint32{0x02d59b28, 0x00cbf1cf, 0x02d95be5, 0x018261d8, 0x01d10a69, 0x03eb2e30, 0x015a20d8, 0x03a3dffd, 0x01ea47b4, 0x003bef9b}}}, + {X: Field{[10]uint32{0x0089b37b, 0x0160050d, 0x00b4daaf, 0x01e367d0, 0x0207b1ec, 0x027d3ae1, 0x00bbcf1e, 0x03b4197d, 0x03137d22, 0x003f33c7}}, Y: Field{[10]uint32{0x01bf3e10, 0x012d541f, 0x0111c64a, 0x02bc86cd, 0x016646be, 0x025d5ad3, 0x01559d9d, 0x02b30e20, 0x002fef9f, 0x002969df}}}, + {X: Field{[10]uint32{0x004f62d2, 0x03058010, 0x03d4e935, 0x035d63b0, 0x00a13434, 0x01ef23d7, 0x023b5541, 0x0213b3c4, 0x031006f2, 0x0036a5ff}}, Y: Field{[10]uint32{0x0312e168, 0x00c0732b, 0x0093cf8b, 0x008a2069, 0x024f3082, 0x0362ae4a, 0x031e3d1c, 0x00cc37cb, 0x028b4900, 0x00197085}}}, + {X: Field{[10]uint32{0x033e4fd8, 0x00b6260c, 0x039bddce, 0x03c887c2, 0x03343ab6, 0x006d1164, 0x0157556c, 0x009338da, 0x00d5428a, 0x00199da9}}, Y: Field{[10]uint32{0x01af7b41, 0x02c717cf, 0x01593854, 0x01611686, 0x03b7afcf, 0x0119f5e4, 0x034d3d83, 0x0094d7d7, 0x00a4b933, 0x00116f77}}}, + {X: Field{[10]uint32{0x017859ca, 0x004ab7b9, 0x01ccd302, 0x01e8a986, 0x0153396e, 0x00f7ba90, 0x0222c7cd, 0x00508152, 0x02becf46, 0x001e479a}}, Y: Field{[10]uint32{0x02dd37a1, 0x01ec333e, 0x02c9268a, 0x03745f93, 0x03e2ec07, 0x03fd0fb2, 0x0332990a, 0x01724fb1, 0x03fd08c5, 0x003900ce}}}, + {X: Field{[10]uint32{0x030018a1, 0x005fcc6b, 0x005ae207, 0x011d2f5f, 0x02c66dd9, 0x012dcc91, 0x00985aa8, 0x0055429e, 0x03b2d518, 0x000e9f1e}}, Y: Field{[10]uint32{0x029d7459, 0x014b517f, 0x03d1437b, 0x0094612b, 0x02b6c38d, 0x039417e2, 0x01f732a9, 0x03b71488, 0x0317e03c, 0x0008e23a}}}, + {X: Field{[10]uint32{0x013ab999, 0x0082f150, 0x00c3bef7, 0x005cad15, 0x0362b740, 0x0004e075, 0x03ca9361, 0x00725a72, 0x01b18680, 0x0009268b}}, Y: Field{[10]uint32{0x01d5e7a3, 0x0225ed74, 0x030cff71, 0x002cfb24, 0x002f708e, 0x01701d7a, 0x003cf9c8, 0x0247075e, 0x004176aa, 0x00368617}}}, + {X: Field{[10]uint32{0x034f8590, 0x029a215a, 0x0313614d, 0x01fede4a, 0x0032c085, 0x01595794, 0x01f21e0c, 0x03302661, 0x0153b4e0, 0x002c9783}}, Y: Field{[10]uint32{0x0183eda2, 0x021399d7, 0x01055d6b, 0x02010ac8, 0x0300ac5b, 0x034a360d, 0x00fac42f, 0x038eb387, 0x02ff6b02, 0x0006f45e}}}, + {X: Field{[10]uint32{0x03862fcd, 0x0167aaed, 0x02cd6013, 0x03dd45ff, 0x02bd1073, 0x0044090f, 0x029db66f, 0x00ce22a1, 0x036805e8, 0x001cd814}}, Y: Field{[10]uint32{0x015f9d56, 0x00494d9b, 0x02913d69, 0x039569d7, 0x03e767fa, 0x0384b507, 0x02434076, 0x0316983e, 0x002d0842, 0x003a71e8}}}, + {X: Field{[10]uint32{0x03f1b1d9, 0x0172585d, 0x03ff9711, 0x036979c3, 0x022e5b52, 0x03c96750, 0x038a0c9a, 0x00ba5c0b, 0x03567139, 0x003b0bc2}}, Y: Field{[10]uint32{0x008183a8, 0x025263a4, 0x00818204, 0x00ad3f7b, 0x02d49e07, 0x02395b4c, 0x00571fa9, 0x01396432, 0x02bbadb2, 0x0011fdf7}}}, + {X: Field{[10]uint32{0x03e2d378, 0x02981612, 0x038e5cbf, 0x025484dd, 0x01afc255, 0x00838630, 0x022ad2f3, 0x0350ea46, 0x03a8250d, 0x001f5ea3}}, Y: Field{[10]uint32{0x00fea3be, 0x00384458, 0x0352e02a, 0x01e904fd, 0x03fab2b0, 0x026f0835, 0x0300f110, 0x01f5dc09, 0x02168962, 0x001ad22e}}}, + {X: Field{[10]uint32{0x026713d7, 0x01a57fea, 0x0036605c, 0x02433fd3, 0x0206e594, 0x009820b1, 0x03aaa01e, 0x01c8ee99, 0x01ce52b6, 0x000c5a9c}}, Y: Field{[10]uint32{0x02a1cb9e, 0x016bdcf5, 0x020200e9, 0x03f73e0b, 0x0184152f, 0x0172d2e8, 0x0344cf6e, 0x0318484a, 0x01a07820, 0x0035bc70}}}, + {X: Field{[10]uint32{0x03bcca51, 0x01b9caa7, 0x01930ade, 0x015c476e, 0x029ace88, 0x02b65e88, 0x02e5fc6e, 0x0227ff0c, 0x00c30ade, 0x000868aa}}, Y: Field{[10]uint32{0x0082e4d0, 0x01b073e2, 0x001e47c5, 0x00e28ae5, 0x01726fd4, 0x00cbc38d, 0x012aafb4, 0x0145ed5c, 0x010438df, 0x00257f4f}}}, + {X: Field{[10]uint32{0x028f94d5, 0x027b0c9c, 0x01535536, 0x0378107e, 0x021ad2cf, 0x0144ebeb, 0x0146c68f, 0x0205c36b, 0x0067b3ad, 0x000fc606}}, Y: Field{[10]uint32{0x02317527, 0x0277c428, 0x00a915f0, 0x03c0e2c0, 0x0191abb8, 0x0088aac3, 0x01991894, 0x003aab55, 0x00e4e9f2, 0x002946a5}}}, + {X: Field{[10]uint32{0x01f63c1e, 0x0024bc22, 0x02a697d0, 0x01b4c563, 0x0079b7aa, 0x0243b3ed, 0x01ecb9b6, 0x00e6f3c4, 0x013911be, 0x003a59cc}}, Y: Field{[10]uint32{0x0103abc2, 0x02050b52, 0x035461f9, 0x03a184c1, 0x00da9be6, 0x00c808a8, 0x022017c0, 0x020f8e37, 0x00f76f87, 0x00030403}}}, + {X: Field{[10]uint32{0x0008b122, 0x0153eba4, 0x00cd8615, 0x010caf42, 0x02d3096d, 0x03ce61b1, 0x03e94b06, 0x02b1f951, 0x02b01407, 0x00187aa2}}, Y: Field{[10]uint32{0x00a4d182, 0x0172a3fd, 0x02792a10, 0x03d0a0fe, 0x02150167, 0x01a7c73b, 0x0090488e, 0x004ea5d9, 0x03cca6f7, 0x00397156}}}, + {X: Field{[10]uint32{0x02dab9fe, 0x01cfe4ef, 0x02402cab, 0x03dc928e, 0x0149673d, 0x008e68fc, 0x00815540, 0x01ff767d, 0x027a1745, 0x002b63eb}}, Y: Field{[10]uint32{0x00f03e6b, 0x01fbfbd4, 0x035d4d77, 0x0080bb4d, 0x01485172, 0x00958fde, 0x001d0371, 0x0312eeec, 0x03ef7966, 0x0014edf7}}}, + {X: Field{[10]uint32{0x02a829d3, 0x02062f6d, 0x0020c586, 0x01324640, 0x02cdf997, 0x0136750d, 0x0362f274, 0x00b9534f, 0x02dfbf7f, 0x00218173}}, Y: Field{[10]uint32{0x01946b88, 0x01bd52df, 0x01873d78, 0x03c143a1, 0x02e7a33d, 0x01dc23fd, 0x009fe4da, 0x02a86988, 0x015f0ca2, 0x0016be29}}}, + {X: Field{[10]uint32{0x03921d87, 0x034b5b3f, 0x014c8cbc, 0x00f0bc8b, 0x016e8325, 0x029e533e, 0x00ffa5a7, 0x027bd1f7, 0x004b465b, 0x002f7795}}, Y: Field{[10]uint32{0x00aadcd8, 0x02f5b3a3, 0x01a7414e, 0x0237e228, 0x030ec97c, 0x0206f9aa, 0x01e7d230, 0x019fd57b, 0x03677ba8, 0x001b14d8}}}, + {X: Field{[10]uint32{0x02fe1cdb, 0x039cd18c, 0x016bbfe3, 0x034aeb64, 0x0162a47b, 0x0170a3d2, 0x02eafca8, 0x0223724f, 0x0245e8b0, 0x000c620a}}, Y: Field{[10]uint32{0x01f176bc, 0x0075a4d5, 0x021a6fd1, 0x02a780aa, 0x01d03557, 0x00b80a32, 0x02b833c1, 0x01b8784a, 0x00f0c5f8, 0x0002cd62}}}, + {X: Field{[10]uint32{0x01dc1202, 0x0013dda9, 0x00883b0d, 0x02f589e6, 0x03e49fad, 0x000ee398, 0x0110b726, 0x003e7b6d, 0x00524580, 0x0005ef90}}, Y: Field{[10]uint32{0x0132fc54, 0x00ce92e3, 0x01cb9c9e, 0x01568bd6, 0x0181667e, 0x010349df, 0x00f7738e, 0x0156b80a, 0x03dcdf88, 0x0005413a}}}, + {X: Field{[10]uint32{0x03629537, 0x01abeb72, 0x0308c9c5, 0x03d69806, 0x00a303ea, 0x001fcaca, 0x03c4e697, 0x01f4a9af, 0x0133bb69, 0x00318cef}}, Y: Field{[10]uint32{0x0218cef8, 0x03566dee, 0x01eac2b4, 0x01e0cc4e, 0x039f3b7f, 0x0187193c, 0x0006b924, 0x01936fcb, 0x00132d47, 0x0021b8fd}}}, + {X: Field{[10]uint32{0x0260bb52, 0x01863d60, 0x00062570, 0x02d8ed18, 0x03633434, 0x00cf3444, 0x00881f3a, 0x0043dc64, 0x008af4c7, 0x003ce788}}, Y: Field{[10]uint32{0x01e2e62c, 0x014be4ae, 0x014e2bfe, 0x038ee973, 0x03d0171e, 0x03650f0c, 0x02e2b664, 0x00dbd89c, 0x0005807b, 0x0024315a}}}, + {X: Field{[10]uint32{0x00a16c54, 0x01808cbd, 0x033db893, 0x0053d67d, 0x01ee4e54, 0x00b6e2b1, 0x00ddfb37, 0x02581e95, 0x039414f2, 0x0033a610}}, Y: Field{[10]uint32{0x0224e0d7, 0x033eebae, 0x03d7f627, 0x00b6e97a, 0x02bb8054, 0x03502ba5, 0x02f78354, 0x01ec4f1c, 0x01a1d105, 0x00069201}}}, + {X: Field{[10]uint32{0x030a76bb, 0x01fd8cee, 0x0273f625, 0x008a8569, 0x01945041, 0x022175d5, 0x0171af10, 0x01e93ee9, 0x039f8110, 0x001499b9}}, Y: Field{[10]uint32{0x0159b457, 0x003f25a9, 0x01918d3b, 0x0003edce, 0x0018d382, 0x01ed5708, 0x033ca397, 0x017c4a1d, 0x01d09cc8, 0x00179eb4}}}, + {X: Field{[10]uint32{0x027056e4, 0x030563ef, 0x035c11ff, 0x0025449b, 0x03675070, 0x01de2f22, 0x0370113c, 0x01ea8efc, 0x025763f4, 0x0013ee77}}, Y: Field{[10]uint32{0x0086f7ef, 0x021d54c5, 0x0175e52e, 0x01d61e27, 0x0229fe02, 0x00bf8f6c, 0x022fa347, 0x01c65c2a, 0x02368eec, 0x000b365d}}}, + {X: Field{[10]uint32{0x03cc0226, 0x015d01c8, 0x0345bded, 0x02a348cd, 0x024ae7bb, 0x005632e4, 0x03ec8406, 0x0376f6aa, 0x0024a99e, 0x002b45a0}}, Y: Field{[10]uint32{0x014095de, 0x03dc103c, 0x003cba21, 0x01ae47b8, 0x029ee638, 0x014f12f9, 0x01e230bb, 0x0119ce3b, 0x0015968e, 0x002ac414}}}, + {X: Field{[10]uint32{0x03719cb8, 0x0320005c, 0x028d55a7, 0x02e8522e, 0x01277923, 0x03c6cc1f, 0x03aea9b0, 0x01556dcc, 0x01aef7cc, 0x0001560a}}, Y: Field{[10]uint32{0x03267689, 0x03c269d8, 0x03d3d3c4, 0x03db12eb, 0x00382969, 0x031829ef, 0x003b47d6, 0x02561550, 0x02eb9c9b, 0x001a9ecb}}}, + {X: Field{[10]uint32{0x0378b935, 0x03af0e1a, 0x01910960, 0x010d1435, 0x014e1e4c, 0x013a7780, 0x004bbe78, 0x01383888, 0x02338efa, 0x0008467c}}, Y: Field{[10]uint32{0x00e7bb93, 0x00da44ee, 0x0195711c, 0x01a4d29c, 0x0052acb4, 0x027144ea, 0x0337db96, 0x011319e8, 0x01c37785, 0x0027c867}}}, + {X: Field{[10]uint32{0x01295bbf, 0x003f96ec, 0x01b3257f, 0x0260fd70, 0x02c52274, 0x0095634d, 0x01e53caa, 0x006fa75f, 0x021b0949, 0x00047f0f}}, Y: Field{[10]uint32{0x004cf6f5, 0x02314a21, 0x00ed6219, 0x02234427, 0x0191b8d1, 0x00c4416b, 0x026b6c02, 0x0164cdaa, 0x034decb0, 0x00071a71}}}, + {X: Field{[10]uint32{0x03d2a908, 0x02fa8ef7, 0x0182180a, 0x00626421, 0x015e64ac, 0x01f981ab, 0x0091bc86, 0x01450e54, 0x026fea6e, 0x000d2db3}}, Y: Field{[10]uint32{0x03ccad6d, 0x00e5908a, 0x00694403, 0x00953860, 0x0328e9f3, 0x00b1e8c4, 0x01e41a13, 0x02fbcfee, 0x0104f4bd, 0x0016dbb6}}}, + {X: Field{[10]uint32{0x0210a84c, 0x0103254d, 0x02e2e22a, 0x00f4b6da, 0x00b326fb, 0x01fbdd17, 0x01c567d9, 0x01a2acec, 0x01cab457, 0x001b0897}}, Y: Field{[10]uint32{0x002a1084, 0x03f5da10, 0x0229cd72, 0x010b403a, 0x03912fe0, 0x03610ef6, 0x0363cfa2, 0x03f633af, 0x03522180, 0x001fa175}}}, + {X: Field{[10]uint32{0x028ed7d7, 0x001c5116, 0x003e32a7, 0x008039c1, 0x03cbfd20, 0x0052da22, 0x03cc7570, 0x025708cb, 0x02e541dd, 0x00017ddd}}, Y: Field{[10]uint32{0x03273c0e, 0x002cda62, 0x022ff2a2, 0x00fdb435, 0x01c11680, 0x0299354a, 0x009de0b9, 0x020d50e8, 0x0078fc6d, 0x000ee317}}}, + {X: Field{[10]uint32{0x011b0e23, 0x02f64ca2, 0x014e9b8b, 0x01205bf6, 0x01d5371e, 0x00913ea9, 0x037eaa63, 0x010fbd78, 0x00c55315, 0x000f89b6}}, Y: Field{[10]uint32{0x0379bb65, 0x03eaaf82, 0x034b0c70, 0x003db62b, 0x02a5b4c7, 0x01b0fafe, 0x01a53bc0, 0x0280dbb8, 0x011b43a4, 0x000c2827}}}, + {X: Field{[10]uint32{0x018b36af, 0x0036affc, 0x0085e8aa, 0x03efb84b, 0x0106be8a, 0x01954f91, 0x02970ac2, 0x00d5a2aa, 0x0291c17a, 0x00318d36}}, Y: Field{[10]uint32{0x01a925f0, 0x0088067c, 0x0346d6d5, 0x0267181b, 0x0016eb9f, 0x02361fb5, 0x01d34bd9, 0x0029ef41, 0x01bae139, 0x001925a0}}}, + {X: Field{[10]uint32{0x027e9a7e, 0x0258b7cb, 0x0347e806, 0x02ceb235, 0x024e8361, 0x03090b5f, 0x02ab4eef, 0x00d6631b, 0x01d64d64, 0x0003b4cd}}, Y: Field{[10]uint32{0x00aa93e7, 0x01ad803f, 0x015e1eb5, 0x039fd5e3, 0x025a1552, 0x023ca2fb, 0x034b6909, 0x01ea9c8c, 0x03f819c9, 0x003c39f0}}}, + {X: Field{[10]uint32{0x02521581, 0x03656147, 0x0328ed72, 0x0191d54f, 0x02d10be1, 0x021c3fec, 0x023dbf22, 0x0167b0fd, 0x00094113, 0x0034dfe3}}, Y: Field{[10]uint32{0x011f1922, 0x0391ed27, 0x0351a191, 0x03532f8e, 0x02831467, 0x01b4f26f, 0x01f1be75, 0x0380d9cb, 0x03b9ba3a, 0x00369f2f}}}, + {X: Field{[10]uint32{0x0115c360, 0x00cd4b9d, 0x0391943c, 0x0017ba1b, 0x0005b32d, 0x031ad083, 0x02ae0611, 0x017a970e, 0x01d7c747, 0x003b8c48}}, Y: Field{[10]uint32{0x004c1686, 0x03c916ef, 0x00281b76, 0x012ae9a4, 0x01b80916, 0x02b5ec4b, 0x0047411d, 0x028eca6d, 0x023797be, 0x001c0ecb}}}, + {X: Field{[10]uint32{0x0187a12b, 0x02005f46, 0x032b5fe9, 0x024109d5, 0x023f5c72, 0x024a984c, 0x02f1a594, 0x00453a83, 0x01bc5c2b, 0x001ed0b2}}, Y: Field{[10]uint32{0x020d27da, 0x03736549, 0x019c9dc7, 0x0378c377, 0x01dd57ed, 0x024909c9, 0x03cd92a9, 0x01cf5d5b, 0x0382e85b, 0x00173dd8}}}, + {X: Field{[10]uint32{0x00a555cd, 0x01d248be, 0x033c3ad0, 0x02117da4, 0x007c8f9b, 0x003e4975, 0x039b6b9a, 0x014e8a4f, 0x039ab13a, 0x0026bd7f}}, Y: Field{[10]uint32{0x025d4153, 0x01bc7eaf, 0x0042ca33, 0x0065905c, 0x0113a9ec, 0x02423215, 0x02a13fa5, 0x011cd322, 0x009e8995, 0x0032a4fb}}}, + {X: Field{[10]uint32{0x0048dacc, 0x02061dce, 0x017b659c, 0x014215af, 0x00a5b2b8, 0x01c260f7, 0x021d591f, 0x037c6c1b, 0x027401a2, 0x0017afe8}}, Y: Field{[10]uint32{0x00f7ad18, 0x01a7f1e8, 0x020fb5fb, 0x0047d1cb, 0x0046e124, 0x008a647a, 0x004c15e8, 0x00f190a4, 0x00b96ac2, 0x0002c2b7}}}, + {X: Field{[10]uint32{0x00c81e6f, 0x00979b3f, 0x01dd3ac1, 0x0219f699, 0x000daeb4, 0x007dbafb, 0x018382bc, 0x017ab214, 0x0108465e, 0x0024ed63}}, Y: Field{[10]uint32{0x0224a4e7, 0x02cfbd46, 0x01b8cf4f, 0x03618ec7, 0x038a50b8, 0x02f2a722, 0x00646c36, 0x005e135d, 0x0118c315, 0x00152fa2}}}, + {X: Field{[10]uint32{0x036fc858, 0x00c7c772, 0x0211132c, 0x02643b6a, 0x005bc868, 0x00ad0199, 0x00943ee3, 0x0191d3ff, 0x039b4fb4, 0x0028a295}}, Y: Field{[10]uint32{0x02f14670, 0x026c54e6, 0x0239646c, 0x0053ebbd, 0x036e059b, 0x03d942ad, 0x016605f0, 0x01592006, 0x01a3d562, 0x00103ba4}}}, + {X: Field{[10]uint32{0x0206ac9a, 0x0397cab5, 0x01078e8d, 0x011fe432, 0x01add7cb, 0x0143482b, 0x01f60297, 0x015582dc, 0x0109781d, 0x0003a61e}}, Y: Field{[10]uint32{0x029819d2, 0x01d3c63b, 0x00907102, 0x037ab233, 0x01c55318, 0x031786a0, 0x02a346f5, 0x036b3fff, 0x02c34c80, 0x0001c486}}}, + {X: Field{[10]uint32{0x01e1dcef, 0x02cefd18, 0x00a7d1d2, 0x02a5d7a1, 0x025c84bc, 0x00e5515b, 0x00ee62ae, 0x02035ff0, 0x011d1587, 0x000a47fc}}, Y: Field{[10]uint32{0x03ec2616, 0x000d9a94, 0x02ceec23, 0x00de4cd6, 0x0171e79e, 0x00892a51, 0x00298ce8, 0x02152d9c, 0x03e8abb6, 0x00317232}}}, + {X: Field{[10]uint32{0x01e315b4, 0x02600fbf, 0x03d824bd, 0x005ae37f, 0x01efda7d, 0x01cea84c, 0x03d9e573, 0x02d4f90a, 0x03909e28, 0x0012b6c4}}, Y: Field{[10]uint32{0x00b1456a, 0x03b37d75, 0x023eefa2, 0x00093f79, 0x0124eb70, 0x0303266c, 0x00a796e5, 0x02b9f25c, 0x0312b827, 0x0019b5fa}}}, + {X: Field{[10]uint32{0x027591ff, 0x029c0936, 0x033846b3, 0x0237902f, 0x0201707a, 0x00951807, 0x007e47b2, 0x003bf78f, 0x034b9524, 0x00157897}}, Y: Field{[10]uint32{0x00c830c2, 0x038ad6de, 0x022664b1, 0x038c8ba0, 0x03e4491a, 0x00b72e82, 0x03000b37, 0x0181b5d0, 0x017b7e98, 0x003a7c89}}}, + {X: Field{[10]uint32{0x02747eca, 0x00016c7e, 0x03ad8aa3, 0x00063084, 0x01388ddd, 0x0118e0d3, 0x03a6d8d5, 0x03f0caf9, 0x0093e41d, 0x0034939d}}, Y: Field{[10]uint32{0x00c26cac, 0x02de18d2, 0x01e93fc4, 0x028260ae, 0x026d7feb, 0x0053527c, 0x01f5bee4, 0x012c597a, 0x0216a51b, 0x0039cea0}}}, + {X: Field{[10]uint32{0x01fd8b2a, 0x03ba84d8, 0x027d9ed8, 0x01880648, 0x03caa035, 0x03b586bd, 0x03e46003, 0x0176872d, 0x02526d01, 0x0029442c}}, Y: Field{[10]uint32{0x02bea726, 0x0174bce2, 0x01adc356, 0x03ca8004, 0x01eaa2b2, 0x0031b11e, 0x02b15a28, 0x02aee98f, 0x02a09015, 0x000f6630}}}, + {X: Field{[10]uint32{0x03b314d1, 0x030ad221, 0x01f4f6b8, 0x039bf9a0, 0x008404cd, 0x029575db, 0x03ac63cc, 0x00035456, 0x00d81275, 0x00301341}}, Y: Field{[10]uint32{0x034d9d59, 0x01019eb6, 0x02e1b98c, 0x01637dff, 0x00e3cd44, 0x006f0205, 0x00db9373, 0x003aea67, 0x01779fb8, 0x0032cff3}}}, + {X: Field{[10]uint32{0x02bd0649, 0x01c3e43b, 0x0245a0df, 0x03fe9e24, 0x006b5dd2, 0x023fe9dc, 0x0051e691, 0x00cd5eea, 0x0061146c, 0x003b271f}}, Y: Field{[10]uint32{0x01186170, 0x03438f4f, 0x027a4daf, 0x0026c498, 0x03b36b07, 0x02458648, 0x028803ce, 0x01a48f01, 0x03fa10ca, 0x00268274}}}, + {X: Field{[10]uint32{0x020488cc, 0x033b5602, 0x030640ba, 0x0044b294, 0x03b25985, 0x02017952, 0x037e8403, 0x013117d2, 0x013f5d50, 0x002577d7}}, Y: Field{[10]uint32{0x00e8ecc6, 0x01ab5213, 0x00c21c7a, 0x036dd0f7, 0x0235079c, 0x00facc16, 0x03d1ef32, 0x014c16c1, 0x018589b8, 0x00290f73}}}, + {X: Field{[10]uint32{0x033a6d16, 0x00b511d8, 0x016510c7, 0x0135aec6, 0x012fc8ec, 0x0177fe52, 0x02bf50eb, 0x00314b11, 0x020c3a95, 0x002e3bb3}}, Y: Field{[10]uint32{0x01583744, 0x02c23875, 0x0384b8d0, 0x00b338fe, 0x024a4957, 0x025a68b0, 0x02c1460d, 0x02fe0ee9, 0x02a31b75, 0x001d3a50}}}, + {X: Field{[10]uint32{0x02dd09a2, 0x002fc71c, 0x000ba052, 0x01df178b, 0x00c82b2d, 0x014487a8, 0x01eac517, 0x0270894f, 0x0216d1f6, 0x001667b3}}, Y: Field{[10]uint32{0x0111bb14, 0x00f48c6a, 0x038599f7, 0x01c99908, 0x00b2fdb6, 0x035eebd2, 0x00e2e725, 0x00f43b76, 0x00c325af, 0x00012284}}}, + {X: Field{[10]uint32{0x0282ab32, 0x017f37c3, 0x023bc35a, 0x006eee93, 0x007fff71, 0x0186b360, 0x02fdfaa9, 0x0162a5b8, 0x02068d94, 0x002e2e96}}, Y: Field{[10]uint32{0x00f8ca4d, 0x0133b314, 0x007e32d4, 0x005db8ab, 0x03c2d824, 0x0134ca94, 0x00388454, 0x0160b824, 0x03227554, 0x00200d6a}}}, + {X: Field{[10]uint32{0x027e65f4, 0x017b45c8, 0x00c508c3, 0x020285c4, 0x03ae8063, 0x006c7ffc, 0x02d3d7af, 0x01e19795, 0x03e1cccd, 0x002da11a}}, Y: Field{[10]uint32{0x00bc7201, 0x039bed83, 0x0224177f, 0x03527039, 0x03361ee9, 0x0208c1d8, 0x0189f526, 0x017c2b7a, 0x00253294, 0x002ef6dc}}}, + {X: Field{[10]uint32{0x01a9d0fe, 0x0203fe03, 0x032ffc35, 0x02ce8464, 0x0120dd31, 0x0211b668, 0x0009e53f, 0x00aefbb4, 0x025e6987, 0x00287fe9}}, Y: Field{[10]uint32{0x02da215b, 0x00116c73, 0x02adadc0, 0x032c9a11, 0x0331c210, 0x022dae9b, 0x00549996, 0x00efe774, 0x0180d576, 0x002a8cb9}}}, + {X: Field{[10]uint32{0x030d0fa2, 0x03e6885c, 0x02ebeb62, 0x035b7997, 0x022ad73c, 0x0033bc22, 0x008c7078, 0x0071f7d1, 0x036d6709, 0x0026ce05}}, Y: Field{[10]uint32{0x02609207, 0x01813b53, 0x019d26fb, 0x02206412, 0x0264a459, 0x023fd665, 0x02c86bab, 0x026dfbc7, 0x0319c0fb, 0x0008b49a}}}, + {X: Field{[10]uint32{0x01fd0cd2, 0x014a104d, 0x008981fa, 0x0135f7ab, 0x020accfa, 0x036ad0fe, 0x0132553b, 0x03193eec, 0x009e209d, 0x002f0b33}}, Y: Field{[10]uint32{0x015ccfa6, 0x0160c169, 0x0134374d, 0x004dc624, 0x01350d1d, 0x021e47ef, 0x034931ba, 0x03e22c19, 0x02dc176f, 0x0011cd9a}}}, + {X: Field{[10]uint32{0x00730f6a, 0x01f735c9, 0x03aa607a, 0x00d39fe4, 0x00d45187, 0x03ef4a8c, 0x0036f514, 0x00a98974, 0x00a16545, 0x00073800}}, Y: Field{[10]uint32{0x01c6811d, 0x0018abcd, 0x02c19ee3, 0x0336dac3, 0x03fa288a, 0x038f56fc, 0x0334baf3, 0x03c3b552, 0x03fb5b90, 0x00382440}}}, + {X: Field{[10]uint32{0x01e0031f, 0x033742b7, 0x0109d63d, 0x01a13682, 0x034cc63d, 0x02718911, 0x03b26a44, 0x019303a3, 0x029a887d, 0x00211b15}}, Y: Field{[10]uint32{0x0212c07e, 0x010231be, 0x03be47df, 0x0111de61, 0x0207dcbe, 0x013fc105, 0x03acf93d, 0x027e635f, 0x0353132c, 0x0000151d}}}, + {X: Field{[10]uint32{0x00fe59e9, 0x0207a95d, 0x00b82f5c, 0x007d5321, 0x03701f7b, 0x01a1ac62, 0x00585185, 0x01b88f27, 0x00f72865, 0x0018d96a}}, Y: Field{[10]uint32{0x0316c2eb, 0x0273e9fa, 0x0023fc8d, 0x02d5fff3, 0x01be27f2, 0x027302cf, 0x0151d46c, 0x0394f2b4, 0x01fda992, 0x00231f37}}}, + {X: Field{[10]uint32{0x012939fc, 0x019fe01f, 0x0237fbd2, 0x03d66314, 0x0371dc5b, 0x017a3f45, 0x01726195, 0x00f6365e, 0x033c89ae, 0x003b5097}}, Y: Field{[10]uint32{0x01a3590b, 0x03f580a6, 0x01d74daf, 0x0341b8f0, 0x02010c98, 0x0273c53d, 0x03285fd1, 0x0280ef35, 0x03dc14f7, 0x001089aa}}}, + {X: Field{[10]uint32{0x031f00c7, 0x01b728e5, 0x03d5662a, 0x01e8ba40, 0x0285a0bd, 0x02b8c42f, 0x0267f235, 0x01fafa35, 0x006c2e1b, 0x00336949}}, Y: Field{[10]uint32{0x01247f56, 0x020922ca, 0x013f6eae, 0x03cc879b, 0x0296b2c2, 0x006293fa, 0x00534ba3, 0x026cd246, 0x0296f8ea, 0x001e47bc}}}, + {X: Field{[10]uint32{0x00eaf99e, 0x01a968fd, 0x03bc6f90, 0x0260e1be, 0x02f5017d, 0x025a8470, 0x01d3f7e5, 0x030786fb, 0x00e6ce79, 0x002d0aa1}}, Y: Field{[10]uint32{0x0007e6ac, 0x03e903b5, 0x02610823, 0x0005c2c0, 0x03cc3d06, 0x01d427f2, 0x03fad5e4, 0x00dc60db, 0x00c960bb, 0x000b9c8b}}}, + {X: Field{[10]uint32{0x030bcf90, 0x01a807ea, 0x024c16d4, 0x0342ea14, 0x01be23ca, 0x021c021d, 0x03149df5, 0x03a6f2d0, 0x008ce1e2, 0x000d62f8}}, Y: Field{[10]uint32{0x039d1308, 0x00171107, 0x01b0034f, 0x0298d922, 0x03462318, 0x01bd4446, 0x00fe0bfb, 0x02b333d9, 0x02f070ba, 0x003cf13f}}}, + {X: Field{[10]uint32{0x0016a789, 0x02784d58, 0x03ac985c, 0x03de6d0c, 0x01427d16, 0x0115c410, 0x0374bfe1, 0x0188c293, 0x035de5b3, 0x000fb590}}, Y: Field{[10]uint32{0x0041f26f, 0x0249d898, 0x02d9104b, 0x01b56a95, 0x03ee0dc5, 0x014b4f7f, 0x03e677e3, 0x010f4ad6, 0x005e1427, 0x00071cba}}}, + {X: Field{[10]uint32{0x0016c910, 0x00f67989, 0x00610c25, 0x0142e494, 0x000afb7e, 0x01c85dbd, 0x000d7e26, 0x03685965, 0x022c580d, 0x000927df}}, Y: Field{[10]uint32{0x02a9f50c, 0x01c51ece, 0x02e486dc, 0x0021e7a5, 0x021630f5, 0x037378db, 0x030f8423, 0x0245ba3d, 0x031149e9, 0x001bf058}}}, + {X: Field{[10]uint32{0x009cc85f, 0x00379bb2, 0x00d4c69f, 0x01bdbd06, 0x0114d2d7, 0x014b2fe4, 0x00f6f0b7, 0x006e8c6c, 0x0144e838, 0x0025ecec}}, Y: Field{[10]uint32{0x0188724f, 0x00111372, 0x01dc2182, 0x01827904, 0x02f72822, 0x03c77a16, 0x00492570, 0x0082d685, 0x013033b7, 0x0019f26f}}}, + {X: Field{[10]uint32{0x03395a85, 0x03bbc697, 0x01b68cfa, 0x0038e57a, 0x0380610d, 0x00491421, 0x010fcaf4, 0x00a44947, 0x019e868b, 0x000ece11}}, Y: Field{[10]uint32{0x0225ce6f, 0x02392754, 0x023a3c3e, 0x00966c5f, 0x0391ec4c, 0x01dc917a, 0x00cc9a2b, 0x01d1531e, 0x00ddbfde, 0x002f9460}}}, + {X: Field{[10]uint32{0x02163ebf, 0x03f88725, 0x017efc54, 0x03452680, 0x0074fb35, 0x0209c3f4, 0x00974f44, 0x03822a45, 0x03909f33, 0x00139bc5}}, Y: Field{[10]uint32{0x02b9fd15, 0x03341e39, 0x026a3e56, 0x02035dd3, 0x000dcd28, 0x02a69793, 0x02d34913, 0x01c5596d, 0x038f06f4, 0x0003ed95}}}, + {X: Field{[10]uint32{0x015c75de, 0x02ccb68c, 0x01a9218d, 0x02ddd586, 0x0272e301, 0x00289597, 0x025a0a67, 0x024df5d0, 0x0063e408, 0x0024506b}}, Y: Field{[10]uint32{0x006d6045, 0x024713d5, 0x007a05de, 0x037ef5e1, 0x03f10b34, 0x00aa95f6, 0x0055e721, 0x030f84f3, 0x010a56be, 0x0034d78a}}}, + {X: Field{[10]uint32{0x015ba578, 0x00b1844e, 0x01aa2e21, 0x018a23b7, 0x00337c91, 0x013f2480, 0x01c006a0, 0x009d4559, 0x03ca7205, 0x003b26dc}}, Y: Field{[10]uint32{0x00224887, 0x014043cf, 0x039051b1, 0x01d53139, 0x01ba1922, 0x031d38bc, 0x015f3ab4, 0x00b9dce3, 0x02f5c1a2, 0x000df847}}}, + {X: Field{[10]uint32{0x021caca3, 0x016e06b3, 0x00d7ef0f, 0x0022f94c, 0x01aef502, 0x03aab1b9, 0x00430b1f, 0x024a3f38, 0x00e1bb1a, 0x0015bf05}}, Y: Field{[10]uint32{0x00209001, 0x01fcc1e4, 0x01865f6d, 0x01f30e36, 0x03b05e59, 0x0203d14a, 0x03101d7a, 0x00341e7c, 0x0084f868, 0x00139698}}}, + {X: Field{[10]uint32{0x017df731, 0x00ea2699, 0x021e4d80, 0x030fc603, 0x00cf3997, 0x003c6c8b, 0x037c3627, 0x0353320a, 0x001b2ceb, 0x002bb35d}}, Y: Field{[10]uint32{0x010b8e21, 0x0315f9fe, 0x03d4d8cc, 0x005c2bff, 0x02256bd3, 0x037426ce, 0x036356e8, 0x03d27c64, 0x03336c0d, 0x0017c412}}}, + {X: Field{[10]uint32{0x01836cb8, 0x03e2f505, 0x03f0d418, 0x01c8c70f, 0x039b5c10, 0x00c27a7a, 0x0222b9a4, 0x00f54892, 0x03af54f8, 0x00145899}}, Y: Field{[10]uint32{0x03efe4fc, 0x0248261e, 0x0313d865, 0x017628f6, 0x01cc37e8, 0x02dae10e, 0x02f6fd54, 0x00b05fd3, 0x009b9e06, 0x001061ce}}}, + {X: Field{[10]uint32{0x0066fed5, 0x023d50c9, 0x007e7f25, 0x0371b84a, 0x036e7658, 0x00e0ed3f, 0x01a03687, 0x0111cfe4, 0x02bd8d3f, 0x001a2efa}}, Y: Field{[10]uint32{0x017049c4, 0x018d6b42, 0x03c27048, 0x01e9a8e0, 0x008656fc, 0x025e356c, 0x027f7ccd, 0x026d09e9, 0x000f0ac9, 0x0033d8f2}}}, + {X: Field{[10]uint32{0x007b67be, 0x036fad6c, 0x018a2b90, 0x023e4259, 0x0049ba90, 0x02d4b079, 0x01592138, 0x01fa6d47, 0x02ab6946, 0x00083388}}, Y: Field{[10]uint32{0x0297ce2d, 0x008374b7, 0x00c3e68f, 0x03c52a77, 0x0331649f, 0x026e8b05, 0x032d17e4, 0x01cfda48, 0x007d9f41, 0x00158b68}}}, + {X: Field{[10]uint32{0x02798f78, 0x00582b1b, 0x00b07d04, 0x0241ffe0, 0x029c86cd, 0x014855e1, 0x03c1ec6a, 0x027e48eb, 0x02d3a4a5, 0x002d6df5}}, Y: Field{[10]uint32{0x029d4de5, 0x03cf9e7f, 0x02dbcb8e, 0x02e96efd, 0x0045b5ea, 0x034565ed, 0x03c55af4, 0x0097b836, 0x02c97751, 0x0034178c}}}, + {X: Field{[10]uint32{0x03f45df4, 0x0130c28c, 0x03d4acdc, 0x024dac1d, 0x023967e5, 0x01d7db6e, 0x023d848f, 0x0202c577, 0x00897a42, 0x002556f5}}, Y: Field{[10]uint32{0x01453a02, 0x03e5cd0f, 0x016b2749, 0x006d12c5, 0x01644826, 0x03c97700, 0x03b9fe5b, 0x026473bc, 0x03cb5d79, 0x0012efad}}}, + {X: Field{[10]uint32{0x020a5a98, 0x0391fe19, 0x02211201, 0x0126721d, 0x0150fee8, 0x02fd4dcd, 0x0002fe18, 0x00dc3acf, 0x015198e7, 0x0027d83a}}, Y: Field{[10]uint32{0x00d613cc, 0x00b13e93, 0x00a6a3a6, 0x03a98b8a, 0x03c865a7, 0x00c87626, 0x02570f59, 0x01619a80, 0x02a933ed, 0x0018e56a}}}, + {X: Field{[10]uint32{0x00d776ee, 0x03cb5394, 0x01468999, 0x01642895, 0x009c2b64, 0x02269c40, 0x00041c75, 0x00f436f9, 0x00b6f592, 0x001c207c}}, Y: Field{[10]uint32{0x028f9fc9, 0x02a7fdd9, 0x00758403, 0x028ca231, 0x0227f3f0, 0x02fca2d2, 0x02ec9c91, 0x00067a4e, 0x0005e067, 0x00272d80}}}, + {X: Field{[10]uint32{0x0369561f, 0x02adcecc, 0x023fffb0, 0x00161f99, 0x02b607d6, 0x0358fbe6, 0x00e982ab, 0x0169f06c, 0x01800d8d, 0x00038a40}}, Y: Field{[10]uint32{0x00d924f7, 0x022345f5, 0x01f7861b, 0x006850a6, 0x01993f74, 0x002d5394, 0x00ccc7b8, 0x02692894, 0x02fe7728, 0x001189dd}}}, + {X: Field{[10]uint32{0x00598bfb, 0x031590d6, 0x035212f4, 0x037f10b2, 0x00ac254c, 0x017231ad, 0x03d5939c, 0x02f57ad8, 0x0328b285, 0x0022ba9c}}, Y: Field{[10]uint32{0x01568ec2, 0x0064be02, 0x01e228e0, 0x03ba6436, 0x0213819a, 0x03281602, 0x00a559a8, 0x0157ffad, 0x027704fc, 0x002da0b6}}}, + {X: Field{[10]uint32{0x03256e68, 0x005e418b, 0x010feb3a, 0x01e877fa, 0x0127302d, 0x01619702, 0x00fc2874, 0x012d5fa9, 0x00b254b2, 0x003a7442}}, Y: Field{[10]uint32{0x03a128d0, 0x01ee4e6a, 0x032c48f6, 0x026a9169, 0x018d0ba6, 0x02bc50d9, 0x030fc0b1, 0x0367ef9e, 0x02746d29, 0x0003ffdc}}}, + {X: Field{[10]uint32{0x01ba0fee, 0x021ae1ab, 0x009136d8, 0x00505f4a, 0x00b81f29, 0x00a79332, 0x02d49094, 0x01f985e1, 0x013d1f31, 0x0027a87e}}, Y: Field{[10]uint32{0x0180ec0a, 0x031af91a, 0x036e45d9, 0x0002e564, 0x01975a5c, 0x03f7b845, 0x023ba6aa, 0x02cd45b9, 0x0325d3b0, 0x0008c77f}}}, + {X: Field{[10]uint32{0x001e7a0d, 0x006da352, 0x000c5718, 0x00042166, 0x0080701d, 0x00fa354c, 0x00d687c4, 0x02efb81f, 0x0015e5fa, 0x003a2849}}, Y: Field{[10]uint32{0x022f62c6, 0x02886e64, 0x005dd5d6, 0x03c8b80e, 0x030ac53b, 0x021d15c9, 0x0062f185, 0x039d1a65, 0x039ce263, 0x00375a60}}}, + {X: Field{[10]uint32{0x02c3def2, 0x011bfcc1, 0x02cefb44, 0x01009d8d, 0x02ed7968, 0x03db5706, 0x002e04c7, 0x01851687, 0x03baae48, 0x0038a1fc}}, Y: Field{[10]uint32{0x01968c63, 0x02e7efe7, 0x016e0be5, 0x0239f9af, 0x005bcfbe, 0x03c85560, 0x0053baef, 0x02c3a93b, 0x013d401d, 0x0024e550}}}, + {X: Field{[10]uint32{0x02ad1194, 0x02583755, 0x03927641, 0x00c9aadd, 0x01fb23e2, 0x0053239f, 0x01756eba, 0x016ac39e, 0x039cec20, 0x0023e67d}}, Y: Field{[10]uint32{0x0019a2ea, 0x03ffe67a, 0x02de8c5d, 0x013f27c2, 0x0089cbff, 0x0226c92f, 0x021b0da3, 0x01b5b8bd, 0x03e615cc, 0x00201654}}}, + {X: Field{[10]uint32{0x0366f586, 0x00f0d0f1, 0x03e14c6b, 0x0351ebcc, 0x013adb63, 0x01687fdb, 0x00dfb59e, 0x008eb783, 0x036a8cb7, 0x002721ea}}, Y: Field{[10]uint32{0x0165bb19, 0x031ba2aa, 0x002004ed, 0x038dd61d, 0x036a3699, 0x032073fd, 0x01012cbb, 0x035e79f5, 0x01227a3b, 0x001d1e60}}}, + {X: Field{[10]uint32{0x019dc00a, 0x03b1d776, 0x03c3ec75, 0x0141f622, 0x006042bd, 0x02d44bfd, 0x02a10b7f, 0x0177902e, 0x02086f24, 0x00314b21}}, Y: Field{[10]uint32{0x02b3f844, 0x016b80d2, 0x01cc2ca0, 0x01b017ed, 0x0385e540, 0x01f50bf9, 0x00762d83, 0x02e2f672, 0x013abae8, 0x003a30a0}}}, + {X: Field{[10]uint32{0x028dafb2, 0x0138582e, 0x030ded8d, 0x03f419aa, 0x000dd7c3, 0x02f58d2b, 0x039c6b6e, 0x02f89669, 0x02e194d5, 0x0002d8a1}}, Y: Field{[10]uint32{0x019b5910, 0x00e156a2, 0x034aa18b, 0x0090a80c, 0x0027eaaf, 0x01e64549, 0x03cdf7b4, 0x03c9c1dd, 0x02a8ee0b, 0x001cbb0b}}}, + {X: Field{[10]uint32{0x03086b6d, 0x035b4d0b, 0x024ce8c5, 0x02817cee, 0x0245c648, 0x01c32a26, 0x013792e3, 0x00be2dc8, 0x02f2045f, 0x0037ded5}}, Y: Field{[10]uint32{0x0196ab4a, 0x008eb985, 0x02cb43df, 0x0335765f, 0x0139ac18, 0x000e6e5b, 0x009fc90d, 0x02f73d08, 0x01483850, 0x000e1b3b}}}, + {X: Field{[10]uint32{0x0146a3b0, 0x03341a1b, 0x0020f48e, 0x00dd9d79, 0x01459b2b, 0x0192aad6, 0x01110eda, 0x008d5cfa, 0x009f4cd4, 0x000ab3d3}}, Y: Field{[10]uint32{0x022cc579, 0x00a15f56, 0x000cff62, 0x02be5513, 0x0258b37b, 0x009487fe, 0x01ff9bbd, 0x03a60737, 0x0029aea5, 0x0017c696}}}, + {X: Field{[10]uint32{0x00d33f36, 0x02da1367, 0x03877586, 0x02b29082, 0x026a64f2, 0x00d48dcb, 0x010033db, 0x034de1c8, 0x01aaeb55, 0x002febe5}}, Y: Field{[10]uint32{0x00a3d8ee, 0x000f36ac, 0x03b0f608, 0x00b97c50, 0x0378c6ed, 0x02fe7b20, 0x02fce3eb, 0x039db8a8, 0x0313bb61, 0x001f48ae}}}, + {X: Field{[10]uint32{0x00f31421, 0x035f635d, 0x01f6a6ad, 0x02a4528a, 0x01faacb6, 0x01627329, 0x0393c9ef, 0x02a24369, 0x03604eab, 0x001e3374}}, Y: Field{[10]uint32{0x0219a634, 0x028e373a, 0x00bfd327, 0x023bebfd, 0x0376430c, 0x02d788a1, 0x030d60ef, 0x0007445a, 0x001505b8, 0x003b5fa7}}}, + {X: Field{[10]uint32{0x01213d2e, 0x010f08a3, 0x00276d98, 0x0131f2da, 0x01edb894, 0x019aa292, 0x03977135, 0x00e47f1e, 0x03a9050a, 0x003cbaf3}}, Y: Field{[10]uint32{0x00fa4eaa, 0x03d79e2c, 0x01900bb3, 0x00593cf7, 0x0309513d, 0x01a754d3, 0x03a180c5, 0x027c4f14, 0x030d956f, 0x002c71d8}}}, + {X: Field{[10]uint32{0x02af4c2b, 0x0142e746, 0x00adfca8, 0x02aba056, 0x02857593, 0x01154bab, 0x00199433, 0x032ecc33, 0x020d83bf, 0x00010f35}}, Y: Field{[10]uint32{0x007e8f62, 0x02784418, 0x0130247e, 0x00313f33, 0x01099623, 0x00926633, 0x023d6592, 0x0079ae78, 0x02b10f72, 0x003fd92e}}}, + {X: Field{[10]uint32{0x038ea93c, 0x0025c27c, 0x01315f92, 0x03ee97b0, 0x0302168d, 0x009fc4ed, 0x020c3a3b, 0x012775ef, 0x00e0c01a, 0x00106497}}, Y: Field{[10]uint32{0x00f77110, 0x03c362e5, 0x02c26c48, 0x01dbc512, 0x01a725a6, 0x02c0b66a, 0x02f49c19, 0x002b0068, 0x015ecb6a, 0x0014d1ae}}}, + {X: Field{[10]uint32{0x023877e5, 0x03b396cc, 0x03eee3e6, 0x00c9f89b, 0x000fa1c2, 0x0343b836, 0x011bb478, 0x00b60aa1, 0x02106c76, 0x003f48c4}}, Y: Field{[10]uint32{0x016fa162, 0x00bead3e, 0x0266e7eb, 0x018876cf, 0x014bf334, 0x00d3bb70, 0x03748d62, 0x03b3a2eb, 0x0316f5a6, 0x000e5d8c}}}, + {X: Field{[10]uint32{0x00556ef7, 0x01a0f63d, 0x01cb26ea, 0x012c0341, 0x03d5ad68, 0x028f4727, 0x0254a0a0, 0x02f87cda, 0x0298cb7a, 0x003f8fa2}}, Y: Field{[10]uint32{0x031223bf, 0x02503813, 0x0346c3fa, 0x01d6af81, 0x00837b44, 0x02b56992, 0x03f05f9b, 0x00198e87, 0x027734d8, 0x001f4881}}}, + {X: Field{[10]uint32{0x035ec5dd, 0x023adcd3, 0x01ab69ba, 0x02521060, 0x0338232e, 0x01c5c5f6, 0x03f9b1d2, 0x006f7130, 0x0364ae0d, 0x003980a9}}, Y: Field{[10]uint32{0x00916fdb, 0x00f9bd33, 0x03450d51, 0x03d5ed20, 0x028bc9be, 0x02dded20, 0x001f9516, 0x022c400b, 0x00aa2626, 0x002b440e}}}, + {X: Field{[10]uint32{0x0181e086, 0x02f1bfe3, 0x0364eeb0, 0x00b40d91, 0x03321814, 0x01774e46, 0x01cd9620, 0x01cb65c6, 0x01cfadb7, 0x0021c625}}, Y: Field{[10]uint32{0x0337722e, 0x0322658f, 0x029cb555, 0x03293989, 0x00dda2c9, 0x00e184d4, 0x011ef565, 0x01908675, 0x0064f791, 0x00126824}}}, + {X: Field{[10]uint32{0x03a7e4b4, 0x00e83803, 0x0107f4ab, 0x013d3052, 0x028ed4ec, 0x03ef315b, 0x014ec278, 0x01601720, 0x016e7775, 0x00388a75}}, Y: Field{[10]uint32{0x00e48af2, 0x02ae4205, 0x03ce5795, 0x026ab9ba, 0x006d4265, 0x00f3abaa, 0x017a46b6, 0x020156fb, 0x02bd66d6, 0x00336c1f}}}, + {X: Field{[10]uint32{0x00bbf8ed, 0x02a54dda, 0x01dd6ca4, 0x02be9c2b, 0x03471066, 0x034835a3, 0x00a31189, 0x0321a223, 0x03856b0c, 0x000154d7}}, Y: Field{[10]uint32{0x030ac5e8, 0x012096dd, 0x02c296ab, 0x014d3de9, 0x01f6f529, 0x030c81a8, 0x027822fa, 0x00a99e10, 0x0044245e, 0x00219572}}}, + {X: Field{[10]uint32{0x00767ad6, 0x00d7b949, 0x0130c0dd, 0x00843edc, 0x00b8c48d, 0x00f4419b, 0x000d78e0, 0x033a6b89, 0x01054b37, 0x0004195e}}, Y: Field{[10]uint32{0x03e125f5, 0x02077520, 0x02be2e8b, 0x02bf84ce, 0x004393a5, 0x000d57dc, 0x00eb013c, 0x0186400a, 0x037a508a, 0x0014a0da}}}, + {X: Field{[10]uint32{0x00868c1c, 0x02c3fce8, 0x00e4be6c, 0x00321d0a, 0x00e796db, 0x00d11dde, 0x029e311e, 0x03408e67, 0x02072521, 0x000cd9ac}}, Y: Field{[10]uint32{0x0311638c, 0x0168a350, 0x00ae3025, 0x0191d28d, 0x00ac908c, 0x026660e5, 0x032f15d3, 0x0374b29f, 0x02a422a8, 0x003b1808}}}, + {X: Field{[10]uint32{0x035953ca, 0x00c0c582, 0x03332f26, 0x01919905, 0x0291bd01, 0x027f6d07, 0x0208a1f5, 0x0391b1cd, 0x0396339b, 0x00129e24}}, Y: Field{[10]uint32{0x01b4c442, 0x008fbe79, 0x021013a1, 0x011ab86e, 0x016e6e03, 0x03ae1863, 0x01c0af84, 0x02b51602, 0x017f615a, 0x003516d9}}}, + {X: Field{[10]uint32{0x01f1302e, 0x0251f8e2, 0x030fcae9, 0x02d5eae7, 0x00d75d70, 0x037d818a, 0x00c64ad4, 0x0271ff70, 0x0084fa0a, 0x003b93c9}}, Y: Field{[10]uint32{0x01f80170, 0x03afd082, 0x003cbf81, 0x00fd1e95, 0x03409207, 0x036add28, 0x03dbd0d8, 0x037ebb7d, 0x0094d8ec, 0x0014adde}}}, + {X: Field{[10]uint32{0x01f30a1f, 0x02567f89, 0x02c0eaf9, 0x01831421, 0x039aa9b7, 0x000d7da8, 0x037fbb83, 0x0089bde4, 0x035c163f, 0x00010256}}, Y: Field{[10]uint32{0x01dff7ab, 0x011f1601, 0x025aad55, 0x00ca4c11, 0x006a15d0, 0x030167d9, 0x03145955, 0x01353ba6, 0x00ac6555, 0x00073860}}}, + {X: Field{[10]uint32{0x00436a24, 0x03318bec, 0x034943d6, 0x02734bd4, 0x037a36a5, 0x00062fee, 0x02ecd9fd, 0x02750904, 0x013b067d, 0x001a8897}}, Y: Field{[10]uint32{0x027c2701, 0x0213e67a, 0x008da6a3, 0x02f31cf1, 0x03cc698a, 0x00c0164b, 0x023c91ee, 0x038332a8, 0x023d9352, 0x000a6cf5}}}, + {X: Field{[10]uint32{0x01d36e93, 0x0343235c, 0x0057cf46, 0x015253c8, 0x02172492, 0x00fd2e78, 0x0153a89e, 0x02eeff1a, 0x0241e5f9, 0x0008fbea}}, Y: Field{[10]uint32{0x00db789d, 0x023924df, 0x0386ef21, 0x02844c56, 0x0188cea3, 0x0309a486, 0x03d70755, 0x01c68816, 0x03b17f26, 0x00332269}}}, + {X: Field{[10]uint32{0x033ae55f, 0x02b42053, 0x0066a258, 0x01afd8df, 0x02f97217, 0x028e62b8, 0x01591bd6, 0x02655d63, 0x0297f7f9, 0x0038c307}}, Y: Field{[10]uint32{0x026509e1, 0x0192c061, 0x02df311e, 0x0155a096, 0x013e8e47, 0x034a6f62, 0x01edb4d4, 0x03a497f0, 0x036c3e66, 0x00069c32}}}, + {X: Field{[10]uint32{0x0308e278, 0x0328caf7, 0x01265b57, 0x02444f23, 0x03f05aac, 0x018061da, 0x0212f534, 0x005b54ad, 0x0382acd4, 0x002f9935}}, Y: Field{[10]uint32{0x03ad7e4a, 0x01ab3561, 0x0261f946, 0x017d6887, 0x03bff8f1, 0x00f2d413, 0x03b81c87, 0x00df24a4, 0x004a43e8, 0x001e9061}}}, + {X: Field{[10]uint32{0x023822ac, 0x00930e3c, 0x0145076d, 0x02e35291, 0x0073ada0, 0x00bf7cbc, 0x032b4c28, 0x02987019, 0x02bee009, 0x0032ab00}}, Y: Field{[10]uint32{0x0216d06f, 0x03298be4, 0x008ea500, 0x013f1984, 0x0172a9a6, 0x01711579, 0x02cc3047, 0x03d3888e, 0x00bba040, 0x001f64f9}}}, + {X: Field{[10]uint32{0x0284ccb3, 0x03b079c1, 0x02860fc0, 0x030e1b43, 0x03c1ef94, 0x0385c66c, 0x009321e0, 0x03aa5248, 0x01b03a9c, 0x0036894e}}, Y: Field{[10]uint32{0x023cf9f5, 0x0172fc33, 0x01f15779, 0x01bda8cf, 0x00b1b130, 0x0019fa69, 0x03f601f8, 0x033a8bd9, 0x0387bef1, 0x003a1784}}}, + {X: Field{[10]uint32{0x019cc0ed, 0x003a4d9e, 0x00198070, 0x01eefa6d, 0x024ce4fe, 0x03673ee9, 0x03c1bd8a, 0x01492192, 0x01525c96, 0x002fcbb9}}, Y: Field{[10]uint32{0x0058f18e, 0x00c0c3d8, 0x0304f634, 0x02639d80, 0x035df423, 0x000ce408, 0x01529bc3, 0x02289284, 0x021db129, 0x0022277a}}}, + {X: Field{[10]uint32{0x03abde36, 0x0259f051, 0x0226430b, 0x00a9c829, 0x01113060, 0x0290b18d, 0x024c9ff7, 0x00d98a7f, 0x0141cb0c, 0x002cf92c}}, Y: Field{[10]uint32{0x02865657, 0x01f22a94, 0x01f56a7d, 0x02ecb906, 0x03eff979, 0x035abffa, 0x00ff83e5, 0x020a3631, 0x0118c38a, 0x003d9bdc}}}, + {X: Field{[10]uint32{0x009475a0, 0x01ee9622, 0x03e01496, 0x024d8f0c, 0x0124a255, 0x02888d92, 0x01818265, 0x00846844, 0x024ffad7, 0x001147ac}}, Y: Field{[10]uint32{0x00565bb6, 0x01506791, 0x001a21fe, 0x0316fec5, 0x034cb2f8, 0x0307ccf8, 0x01bd3211, 0x030ede69, 0x014049f6, 0x002227fe}}}, + {X: Field{[10]uint32{0x00f5984c, 0x019741ce, 0x03c53b5d, 0x02fd2f03, 0x03ea4c77, 0x012e2bcc, 0x027a0b0c, 0x011de084, 0x018a6a75, 0x000a6ad9}}, Y: Field{[10]uint32{0x03f0f2c1, 0x0380688a, 0x016d215e, 0x02aae02c, 0x02947b8b, 0x01cb69af, 0x0219f9ad, 0x01b0ec29, 0x01a9c77d, 0x002aac6f}}}, + {X: Field{[10]uint32{0x017b24db, 0x026cd04a, 0x038ac287, 0x026b1953, 0x0209d9e7, 0x0076967e, 0x03bb9c0d, 0x03089016, 0x0007d815, 0x0026d671}}, Y: Field{[10]uint32{0x0276d190, 0x006ae369, 0x0376cc76, 0x02d826c6, 0x0117bb35, 0x02eb302a, 0x0027811a, 0x0004530a, 0x018ee630, 0x00293bc1}}}, + {X: Field{[10]uint32{0x026c9fd0, 0x01939d29, 0x0220fc05, 0x01e94ab1, 0x0378e69a, 0x01b0eb1d, 0x01b970e7, 0x02e5d62e, 0x036582ae, 0x0021f49e}}, Y: Field{[10]uint32{0x03511e03, 0x0026384d, 0x00b1acd9, 0x01724c9a, 0x0004d03d, 0x03c1fd07, 0x0083e087, 0x024cdd07, 0x03ccdec2, 0x000ffcec}}}, + {X: Field{[10]uint32{0x009701dc, 0x02e9bda6, 0x00bf4d9b, 0x020edc36, 0x037fe7d3, 0x01af2e4e, 0x005a0ab3, 0x02058ef6, 0x004d3895, 0x003eecda}}, Y: Field{[10]uint32{0x03b94504, 0x02f89921, 0x014c0301, 0x0109a297, 0x01759e73, 0x00981b42, 0x01c2af7b, 0x02cef443, 0x01c6c9c5, 0x001ec1f3}}}, + {X: Field{[10]uint32{0x0314a453, 0x033de7d0, 0x034eacc7, 0x0253e549, 0x01a3ef14, 0x019b9629, 0x03cc1adc, 0x00ae7488, 0x02e4ccc4, 0x0020808a}}, Y: Field{[10]uint32{0x01d2b695, 0x03439245, 0x02a3bb5c, 0x017a6a3a, 0x003a8180, 0x02d36d14, 0x030481a9, 0x00b6841b, 0x02509ddf, 0x00309090}}}, + {X: Field{[10]uint32{0x0220f901, 0x03b2562f, 0x0001a1db, 0x01f15f42, 0x01ab4e65, 0x0247e25d, 0x02475fae, 0x032cdeef, 0x005b3b51, 0x002e9735}}, Y: Field{[10]uint32{0x0341b0a5, 0x00e807b3, 0x0016478e, 0x0062d639, 0x007f9eb7, 0x026394c9, 0x007eddd2, 0x03d638d0, 0x03c0f8b4, 0x000b8353}}}, + {X: Field{[10]uint32{0x026703fc, 0x00197622, 0x02d277cd, 0x00eb7d6d, 0x02cfadaf, 0x00f9cb88, 0x02b44445, 0x0346f9da, 0x0041b316, 0x0004a4f2}}, Y: Field{[10]uint32{0x0133c2fa, 0x01c2ab54, 0x01749286, 0x01122012, 0x002488f1, 0x01081c27, 0x004ab523, 0x012622e1, 0x033740fb, 0x00263d63}}}, + {X: Field{[10]uint32{0x035015c6, 0x02aa6237, 0x037c2c69, 0x03923610, 0x03987d77, 0x022b8db1, 0x03972dea, 0x006f6b6e, 0x03c854bf, 0x003b27ec}}, Y: Field{[10]uint32{0x01486d3f, 0x01047329, 0x00cb2a00, 0x0152ff3b, 0x00fe425d, 0x020c9583, 0x01d6b364, 0x03a5d258, 0x03fdea59, 0x00357cd6}}}, + {X: Field{[10]uint32{0x0144d244, 0x01372dc9, 0x02d62769, 0x03b1ab6b, 0x029950ea, 0x039f563d, 0x03d44662, 0x016da5b2, 0x003f4cd5, 0x000bb338}}, Y: Field{[10]uint32{0x03f68879, 0x01857990, 0x0082f0f6, 0x00ff79e4, 0x00d1bc79, 0x001f3133, 0x01403cae, 0x03dd1fab, 0x00a97f1c, 0x003853cc}}}, + {X: Field{[10]uint32{0x026fb3b2, 0x000973d5, 0x03c3d77c, 0x02beb141, 0x024c6ad5, 0x01bdbbe2, 0x025e7fa5, 0x039481e0, 0x037fa63e, 0x003b63eb}}, Y: Field{[10]uint32{0x03684a9d, 0x0011b620, 0x008f2c9b, 0x03123afe, 0x01cb0636, 0x03e8f953, 0x02f10407, 0x009cf296, 0x00b8ab21, 0x00037c48}}}, + {X: Field{[10]uint32{0x00c32e4f, 0x01e317c5, 0x023a5bc0, 0x027cf0a3, 0x030bf3fd, 0x00c3f645, 0x02b456af, 0x036afb07, 0x037b8780, 0x0011f2e3}}, Y: Field{[10]uint32{0x00aa3203, 0x00c6f4ad, 0x029af669, 0x006625e3, 0x02c5889d, 0x0087b8b7, 0x02fc948f, 0x02a9b1a2, 0x02021f16, 0x003e181e}}}, + {X: Field{[10]uint32{0x01762009, 0x0056890f, 0x025cacf2, 0x011c78e3, 0x02d49620, 0x02bf9c3a, 0x01a3ee38, 0x02acbcee, 0x02c1fdeb, 0x001d8d96}}, Y: Field{[10]uint32{0x0253aa28, 0x03146d53, 0x01c3211f, 0x00d03737, 0x025d7783, 0x01f517e9, 0x037d3a69, 0x02d803fc, 0x03728b4b, 0x000b2b2b}}}, + {X: Field{[10]uint32{0x0027b424, 0x00cc27b3, 0x00ea8a23, 0x0078461a, 0x039f0931, 0x018fb720, 0x03750550, 0x03954b84, 0x01e099b8, 0x00327757}}, Y: Field{[10]uint32{0x00f8c1a5, 0x0088daee, 0x039e4b38, 0x022ec45f, 0x0338163a, 0x02bf9f4a, 0x00f134ae, 0x017adf1a, 0x02384e61, 0x0012f534}}}, + {X: Field{[10]uint32{0x010a8961, 0x0164cb6b, 0x02a3183e, 0x02de08b8, 0x009a1e08, 0x036f2dbe, 0x01c2f96b, 0x01baf1f0, 0x03adcc40, 0x0008ada9}}, Y: Field{[10]uint32{0x020ac794, 0x007b77eb, 0x02d5e22c, 0x0389dd4d, 0x0287b553, 0x00d2bcb5, 0x02be9a95, 0x013d3f4b, 0x0095bab2, 0x0014ae18}}}, + {X: Field{[10]uint32{0x0381a158, 0x006a6da7, 0x00d24a33, 0x0012cb79, 0x0296f06c, 0x02adfdaf, 0x03017fec, 0x01f7c30d, 0x00a749fa, 0x000fba02}}, Y: Field{[10]uint32{0x0039cb4a, 0x008f0709, 0x02d0c01e, 0x015b6107, 0x016c4b13, 0x01933ff9, 0x03dc1740, 0x027b3621, 0x00ef5f1f, 0x000fa553}}}, + {X: Field{[10]uint32{0x00fa4803, 0x027088ae, 0x0048f3e4, 0x0009c10c, 0x00aa97d3, 0x0356d890, 0x0269ae44, 0x01225837, 0x00588a7a, 0x000a4e2f}}, Y: Field{[10]uint32{0x01ada03e, 0x0015340e, 0x0081865b, 0x0071672d, 0x029ea59a, 0x029ba80a, 0x034826cb, 0x00764379, 0x02619fad, 0x003c9aef}}}, + {X: Field{[10]uint32{0x01a15451, 0x025df5f8, 0x030b12c3, 0x01737dca, 0x0094962e, 0x037d0c9d, 0x03ea34f5, 0x03277932, 0x00ecda97, 0x001a0956}}, Y: Field{[10]uint32{0x01fedc6c, 0x02092bee, 0x0220f112, 0x00cd6bad, 0x028b543f, 0x023b1b31, 0x0253c4cc, 0x0004fc64, 0x036522c7, 0x003130b9}}}, + {X: Field{[10]uint32{0x02493620, 0x029a2d01, 0x03d8c08b, 0x00243dfd, 0x010cbfad, 0x007cf411, 0x036811de, 0x003695e7, 0x0068fc52, 0x001c8363}}, Y: Field{[10]uint32{0x004c9cb5, 0x01517899, 0x03a2950d, 0x030ed217, 0x0107ac26, 0x02eecc6a, 0x016fd4b8, 0x01b41813, 0x00a84f7a, 0x002e19fa}}}, + {X: Field{[10]uint32{0x00b84831, 0x01fd7afd, 0x029e02a1, 0x00beceb2, 0x01994d5d, 0x030118ea, 0x02153ec6, 0x019634d5, 0x03e71bdf, 0x00259fec}}, Y: Field{[10]uint32{0x007cc83f, 0x0180bad5, 0x03a094cf, 0x03271e21, 0x03e3cddf, 0x0326a135, 0x01d0926e, 0x0092ccbd, 0x01f88617, 0x002e1299}}}, + {X: Field{[10]uint32{0x03cedc85, 0x029063a2, 0x03d88db2, 0x0353e19c, 0x0273f6eb, 0x03bc4ee6, 0x01fc1131, 0x030f7a39, 0x025c77ec, 0x000767f4}}, Y: Field{[10]uint32{0x028035d7, 0x02b713ab, 0x030e4aa6, 0x032758af, 0x03033012, 0x00fe908c, 0x03ff58e2, 0x003ed2fe, 0x0301d972, 0x00152818}}}, + {X: Field{[10]uint32{0x01311c0a, 0x033aa27c, 0x0144a0b4, 0x027e4143, 0x017d0402, 0x00d1b8ce, 0x00dff5ff, 0x01ebcc45, 0x0158a113, 0x002004e0}}, Y: Field{[10]uint32{0x025a6b31, 0x008d2a9a, 0x01c36bdd, 0x0225f157, 0x00bc5e94, 0x028ebf9c, 0x01cc712d, 0x02b06309, 0x0076e6d6, 0x0005bd26}}}, + {X: Field{[10]uint32{0x03ef632f, 0x00de4cf0, 0x00c55c6c, 0x006088aa, 0x0233aa34, 0x0041f7c8, 0x020906b3, 0x0161138e, 0x002177fa, 0x0002aad0}}, Y: Field{[10]uint32{0x0201b092, 0x0139780c, 0x03d2f703, 0x00e669fe, 0x019a0620, 0x028225c4, 0x02d58767, 0x0373b4e0, 0x008f3ad0, 0x0026e0c8}}}, + {X: Field{[10]uint32{0x03a72f10, 0x004bc4c3, 0x00fe1d36, 0x00dc52ef, 0x003c5232, 0x00052f98, 0x02f1e3b3, 0x03d19367, 0x014c7670, 0x0023cff4}}, Y: Field{[10]uint32{0x0205c68e, 0x01b022d0, 0x030a4b54, 0x03d75c70, 0x02862ef6, 0x032181b9, 0x03a593a5, 0x02e07eef, 0x00947901, 0x002132dc}}}, + {X: Field{[10]uint32{0x021f4933, 0x0254fb52, 0x00d88e49, 0x000cc32e, 0x00df69a9, 0x00e5e7b2, 0x034578a3, 0x0301bfab, 0x011caba3, 0x000eea72}}, Y: Field{[10]uint32{0x026f99cc, 0x03b91ede, 0x0072f582, 0x016ed248, 0x03fdcff6, 0x01646efb, 0x00107990, 0x0188c7a1, 0x034c3eb6, 0x001c1229}}}, + {X: Field{[10]uint32{0x00f36a7c, 0x026a72b7, 0x006455f2, 0x0070a618, 0x017344c2, 0x027db2d8, 0x01524682, 0x02c38354, 0x03d289da, 0x000be30d}}, Y: Field{[10]uint32{0x03508396, 0x01d3503a, 0x00201d2f, 0x024dea0d, 0x014223d0, 0x0271e659, 0x02f145e6, 0x01c43afe, 0x024e9d02, 0x000dfc2d}}}, + {X: Field{[10]uint32{0x02dce846, 0x0310329d, 0x012d300e, 0x00a33b6f, 0x0273fc61, 0x02995bf2, 0x03f60500, 0x02749ee1, 0x03a2c920, 0x001179ba}}, Y: Field{[10]uint32{0x035f16ec, 0x018b24ef, 0x02d908a0, 0x015d399a, 0x02813867, 0x03b88960, 0x0091a635, 0x020aef47, 0x0144ba18, 0x0028f8a3}}}, + {X: Field{[10]uint32{0x01767ee9, 0x03ee2c7f, 0x023cc605, 0x026e62b4, 0x0182ea7d, 0x03a10b67, 0x027143ff, 0x03348d11, 0x03d380a0, 0x00297b34}}, Y: Field{[10]uint32{0x0311353f, 0x029b8a53, 0x03b959be, 0x00cc3459, 0x02c9ab6c, 0x0140573c, 0x0331fe5b, 0x0109a4fe, 0x00238ea8, 0x0008bc4a}}}, + {X: Field{[10]uint32{0x0174be83, 0x00ffe400, 0x034a2c94, 0x02a7fd80, 0x0051eb66, 0x0060dd3a, 0x03698213, 0x00ec3510, 0x0271c466, 0x003dfd16}}, Y: Field{[10]uint32{0x0346fce5, 0x030290d6, 0x021498ac, 0x01b3d4be, 0x017fbdf4, 0x01a8ca07, 0x013d6e3e, 0x025fd503, 0x03cd4ec1, 0x000e858c}}}, + {X: Field{[10]uint32{0x007cb59c, 0x02c9d2d2, 0x00832a94, 0x020a957b, 0x0252bf6c, 0x015c5f50, 0x0303b7de, 0x01385d6b, 0x02866b31, 0x00249608}}, Y: Field{[10]uint32{0x02811f68, 0x03c149d2, 0x004a0369, 0x00b377eb, 0x03d6c2f5, 0x01256ef1, 0x02346700, 0x00277194, 0x01847368, 0x003f23a5}}}, + {X: Field{[10]uint32{0x02556da4, 0x01db3043, 0x027b5a7f, 0x03c53754, 0x011d7849, 0x02b9be9d, 0x017fa966, 0x034028bd, 0x00d32303, 0x003057fa}}, Y: Field{[10]uint32{0x01c10951, 0x03ec4260, 0x00d067b5, 0x01ab8ba7, 0x03e017c0, 0x00334d22, 0x03c445c5, 0x037fc699, 0x03d04685, 0x000d890a}}}, + {X: Field{[10]uint32{0x022b5355, 0x013d8331, 0x03e5ca46, 0x00d9f5ca, 0x0004dd71, 0x01c2fc35, 0x00372df2, 0x029838c4, 0x0026152a, 0x000127be}}, Y: Field{[10]uint32{0x00c4c645, 0x01f4b2c8, 0x02165d9c, 0x00bad597, 0x024e369d, 0x01ea4f85, 0x01c572c7, 0x01202e68, 0x03a20dc4, 0x001f2b52}}}, + {X: Field{[10]uint32{0x0091a18f, 0x02b848a7, 0x006a3be4, 0x0077b59a, 0x03629b2f, 0x018c4cf8, 0x02c876e1, 0x03e53f84, 0x01e7538f, 0x00323782}}, Y: Field{[10]uint32{0x017c2635, 0x02d891da, 0x03e885ea, 0x003c69db, 0x029cecb1, 0x01825958, 0x031e872d, 0x02228417, 0x031fe580, 0x002d69fc}}}, + {X: Field{[10]uint32{0x02abb344, 0x007ffae5, 0x00576946, 0x0067bdd9, 0x016b3d51, 0x026bc92a, 0x03a6cd3d, 0x010ebc75, 0x03a4616f, 0x00361ae7}}, Y: Field{[10]uint32{0x0003bcab, 0x01c3867c, 0x02539fb5, 0x01cb8e4b, 0x0056df6f, 0x01a72e3a, 0x001b6606, 0x006d2652, 0x028e8f93, 0x0008e233}}}, + {X: Field{[10]uint32{0x00cbbf88, 0x00eb9bc0, 0x0055a743, 0x02793cfb, 0x0187c496, 0x003f8c10, 0x027b7193, 0x038ac4fe, 0x0218f351, 0x0028b35d}}, Y: Field{[10]uint32{0x0119d685, 0x034dae17, 0x0324aa8d, 0x034e8258, 0x0229870c, 0x00c430d8, 0x015711ab, 0x00d8ec51, 0x0062436a, 0x000f82d7}}}, + {X: Field{[10]uint32{0x0100b2ca, 0x010b33c8, 0x02b87ab4, 0x00efb4be, 0x02ad6c21, 0x00e6d55d, 0x036e4f6b, 0x0128f5e0, 0x00d4e33e, 0x002dca0f}}, Y: Field{[10]uint32{0x02abc9ea, 0x00c5cfa3, 0x008fc273, 0x019c0109, 0x03090833, 0x0097aacf, 0x021e7e30, 0x008c1c60, 0x02fb111c, 0x00246001}}}, + {X: Field{[10]uint32{0x00b9a769, 0x02903d92, 0x00d9a0cd, 0x0151bbf3, 0x01d12e18, 0x0328c4d9, 0x01b123b9, 0x02ea34d5, 0x012e9707, 0x002c7f4b}}, Y: Field{[10]uint32{0x035e674e, 0x027bd2d1, 0x0294b58c, 0x00f58b6b, 0x021a40cf, 0x00a062ff, 0x004d2226, 0x01577bd8, 0x00168e8f, 0x00230df3}}}, + {X: Field{[10]uint32{0x0339f90f, 0x034ae0b2, 0x0262e7c0, 0x031ce574, 0x02cf6077, 0x0216d69b, 0x034be328, 0x03a17832, 0x03e74242, 0x0006c265}}, Y: Field{[10]uint32{0x037760b3, 0x01a48eda, 0x03183fa3, 0x00493052, 0x02f30fae, 0x00ef3e33, 0x00c2d2ef, 0x00762bb6, 0x00d427cd, 0x00156d36}}}, + {X: Field{[10]uint32{0x018d78d6, 0x01541976, 0x03e698e0, 0x02e06ff5, 0x034f1dc9, 0x03b86eec, 0x02362588, 0x0324977a, 0x03bc094a, 0x0015bfee}}, Y: Field{[10]uint32{0x00edc65f, 0x029c6636, 0x022089f8, 0x02dee00d, 0x02a517fc, 0x02fc716e, 0x02f3d235, 0x00af6c82, 0x008f46d7, 0x002a9cc8}}}, + {X: Field{[10]uint32{0x02d7045e, 0x00f8364e, 0x00685353, 0x02459c8a, 0x00e39081, 0x0049847a, 0x026cd368, 0x01fe70d0, 0x02b07ddb, 0x0030497e}}, Y: Field{[10]uint32{0x0377e5ae, 0x034c3c66, 0x024b68cc, 0x03d137d1, 0x031f235e, 0x00b07763, 0x003f1189, 0x01952bdb, 0x003f622f, 0x000a019c}}}, + {X: Field{[10]uint32{0x027f4a17, 0x014508ff, 0x0130148a, 0x03efc967, 0x02dbab85, 0x0207a02b, 0x01fa6fee, 0x031d0a2c, 0x01dbe4e0, 0x0039fb7a}}, Y: Field{[10]uint32{0x033fc066, 0x01695b34, 0x021d9e63, 0x016f0b6e, 0x02e23692, 0x039fd434, 0x00d32e65, 0x0173eb20, 0x037a9fbc, 0x0024eac9}}}, + {X: Field{[10]uint32{0x03df93f3, 0x02545668, 0x01cc8aa3, 0x00a3122c, 0x03a47c16, 0x0214fe59, 0x00c3da9d, 0x01af311c, 0x0363f1bd, 0x001d1c05}}, Y: Field{[10]uint32{0x018ac8ee, 0x01bb5557, 0x029d8a4b, 0x01eca3b5, 0x02bd2223, 0x001551ee, 0x0393dd5f, 0x0043ccdc, 0x011c7c55, 0x002acb00}}}, + {X: Field{[10]uint32{0x039081b8, 0x02403579, 0x0257689c, 0x00717195, 0x020a6554, 0x00de138c, 0x01ffb8d8, 0x03dc7f9b, 0x039755ba, 0x0002349f}}, Y: Field{[10]uint32{0x02c250ad, 0x02184946, 0x01386e55, 0x0032dfcc, 0x03f308f9, 0x0354889f, 0x021f837b, 0x0258052b, 0x0268f3c8, 0x0029c5db}}}, + {X: Field{[10]uint32{0x00cc7ea9, 0x01e633ab, 0x028c10f5, 0x00063a60, 0x0071b0db, 0x02b0976e, 0x000a0ff1, 0x02d4c7ab, 0x02fe9040, 0x0018f81a}}, Y: Field{[10]uint32{0x00910aa5, 0x003001fd, 0x0213e930, 0x0112ca9a, 0x010c9112, 0x00126bb5, 0x028fcf99, 0x03822dac, 0x0084a9db, 0x002aa846}}}, + {X: Field{[10]uint32{0x004ed50f, 0x0256251d, 0x004b5dde, 0x030a2082, 0x036bf8ba, 0x00f92c6a, 0x01617d02, 0x002acd0b, 0x01ae27d6, 0x00371fa8}}, Y: Field{[10]uint32{0x002f3dfa, 0x000a4705, 0x0140e48a, 0x029b8445, 0x03b63efb, 0x01d52968, 0x03e97fc0, 0x0317feef, 0x036e2b95, 0x0024f1f5}}}, + {X: Field{[10]uint32{0x02e842d7, 0x00ef46fd, 0x02253221, 0x00e6ee5d, 0x0136e402, 0x02d6baa6, 0x03dfb691, 0x03bd28f5, 0x036df69c, 0x003cebbb}}, Y: Field{[10]uint32{0x0208de5d, 0x0343d188, 0x001151fb, 0x023bd24f, 0x0272e562, 0x032c7a2b, 0x03bde031, 0x01c00be1, 0x01da339c, 0x0015f4df}}}, + {X: Field{[10]uint32{0x02bec3ce, 0x0286b29d, 0x01b67816, 0x03eca3da, 0x02ae87da, 0x00f5c9cb, 0x005d0812, 0x0193a837, 0x004c316e, 0x002096f6}}, Y: Field{[10]uint32{0x00a52251, 0x032846d0, 0x00f1dc28, 0x01925d96, 0x00849a25, 0x018be1fc, 0x03e3f69d, 0x01c2a1a8, 0x03fdba83, 0x001878e9}}}, + {X: Field{[10]uint32{0x0056a75d, 0x03bae4ce, 0x03ba7f5a, 0x02e543b0, 0x010edb63, 0x03a509a8, 0x02988cd8, 0x014dc274, 0x00d74dec, 0x000c428b}}, Y: Field{[10]uint32{0x03122c97, 0x00ee07c5, 0x00228ffa, 0x03b8f863, 0x03e3ff1e, 0x02bb0943, 0x02b4ab3a, 0x0395fdfc, 0x02aedfa5, 0x00175b61}}}, + {X: Field{[10]uint32{0x03425217, 0x0160b006, 0x024d85af, 0x02e25dfb, 0x0369f04d, 0x026edb0f, 0x02355aef, 0x004b43e0, 0x007562a5, 0x000d1c75}}, Y: Field{[10]uint32{0x039cba31, 0x00e67af6, 0x00358aed, 0x02a51410, 0x01ccd444, 0x000ded09, 0x006d68c5, 0x02da7afe, 0x02702fe0, 0x0009cb77}}}, + {X: Field{[10]uint32{0x00257a2f, 0x01a01f93, 0x0138d808, 0x03ac3a8d, 0x00aaeee4, 0x020a6bb2, 0x022b3df6, 0x02bc9082, 0x0163bfaf, 0x002fdb49}}, Y: Field{[10]uint32{0x000b496d, 0x003b8ac1, 0x03ff1a92, 0x03113079, 0x003a2738, 0x0155d1ae, 0x03847ef7, 0x0125ad93, 0x02007e7b, 0x003a01de}}}, + {X: Field{[10]uint32{0x039cddc4, 0x03b5094a, 0x023fbbdb, 0x0194c9c8, 0x02d6f4d4, 0x03361db9, 0x03ce42a3, 0x03dc614b, 0x03c4a883, 0x003accf3}}, Y: Field{[10]uint32{0x02e5453f, 0x02b69287, 0x028d2a7d, 0x00df8977, 0x03eaab91, 0x01f7a1be, 0x00f03ad2, 0x022f6641, 0x00f2ef60, 0x0026f500}}}, + {X: Field{[10]uint32{0x00c2279f, 0x002475bb, 0x0108f082, 0x00f68363, 0x016b123d, 0x037a5591, 0x0383edf7, 0x03cc67ec, 0x00d03e5d, 0x0004c5f8}}, Y: Field{[10]uint32{0x03675afd, 0x0348a48c, 0x03b252a9, 0x025fab2e, 0x01dcae42, 0x001a951c, 0x0122b607, 0x02755ac3, 0x024d5c6f, 0x000efd90}}}, + {X: Field{[10]uint32{0x009aeb56, 0x02f38d0c, 0x03456c99, 0x039099ee, 0x007e00f8, 0x01501bcc, 0x022cf5dc, 0x010fafac, 0x032e99dc, 0x00206c27}}, Y: Field{[10]uint32{0x03361932, 0x02006028, 0x03d7c495, 0x01bfafc5, 0x011dbc5f, 0x00b8cc72, 0x035b1df9, 0x03bab10b, 0x02a4b300, 0x00275215}}}, + {X: Field{[10]uint32{0x015a62f2, 0x02199121, 0x01f7e98b, 0x00c8348f, 0x03ed436d, 0x03d3a8cd, 0x02626bae, 0x03fc65c8, 0x01670a32, 0x00037ba9}}, Y: Field{[10]uint32{0x01032414, 0x019b50e7, 0x005a6dfe, 0x03bda79e, 0x014a8310, 0x00305e4b, 0x0157ab34, 0x005ff821, 0x0297c61a, 0x00172449}}}, + {X: Field{[10]uint32{0x003444e5, 0x03713a39, 0x02755ef3, 0x02c73ba1, 0x0296ae44, 0x01ea46e7, 0x00e02ffa, 0x0345cf9a, 0x00835746, 0x003392b4}}, Y: Field{[10]uint32{0x0303aa7d, 0x001bd89f, 0x02a20d34, 0x006bfc70, 0x00df7cc8, 0x01517fa1, 0x013e2891, 0x023532d5, 0x03890523, 0x002fa1b2}}}, + {X: Field{[10]uint32{0x030b077e, 0x0339ffd4, 0x004f6fbb, 0x0131f606, 0x032e3638, 0x02281c57, 0x0119a324, 0x006bdb93, 0x023d407f, 0x0026a64f}}, Y: Field{[10]uint32{0x001a7a7e, 0x03baf04c, 0x034e2481, 0x0077150f, 0x023f8700, 0x01b65bfe, 0x027bd6fe, 0x019fba66, 0x012d80a2, 0x00392869}}}, + {X: Field{[10]uint32{0x039bd0d8, 0x00d844be, 0x03ccc06b, 0x03bd16ab, 0x039247c7, 0x0099ea98, 0x017ae6a1, 0x0017205c, 0x032d7c7f, 0x0007c437}}, Y: Field{[10]uint32{0x00760410, 0x01e0ec16, 0x029affdc, 0x010c9f30, 0x03e45ad6, 0x0259fa6b, 0x0283b0ec, 0x036de4c9, 0x025b71e2, 0x0019c2c9}}}, + {X: Field{[10]uint32{0x02621b53, 0x0355c461, 0x00a5a0ba, 0x03fe7645, 0x02d57d1d, 0x0329dd77, 0x0317633d, 0x008239f6, 0x025729c9, 0x001c33ac}}, Y: Field{[10]uint32{0x01df0c62, 0x0307b0d2, 0x0164ace7, 0x00941fa7, 0x0200ee98, 0x01b475d6, 0x0211c0ec, 0x01157f37, 0x0291b3f3, 0x001b805b}}}, + {X: Field{[10]uint32{0x00694e3e, 0x024fdf9d, 0x032fd466, 0x0312b3a7, 0x00043fb6, 0x02841818, 0x03b79210, 0x020bec37, 0x01e64dc8, 0x002e91b9}}, Y: Field{[10]uint32{0x01789acc, 0x010b221f, 0x009cb0f3, 0x02cf7a81, 0x025868d0, 0x0276310d, 0x0208e060, 0x0207fe28, 0x02b90793, 0x003abad3}}}, + {X: Field{[10]uint32{0x03c30d81, 0x0034e200, 0x037a9e32, 0x01538123, 0x02a631d1, 0x00f5d5e7, 0x0179beaf, 0x02b48390, 0x02dfd233, 0x002ee8ee}}, Y: Field{[10]uint32{0x021b961d, 0x03e400d7, 0x011e8ed3, 0x039a3229, 0x0202bdfc, 0x01d95a4f, 0x03a0af4e, 0x01131cc5, 0x030d69dd, 0x003ca9f1}}}, + {X: Field{[10]uint32{0x02d3f8a5, 0x01d4298d, 0x01283d93, 0x007ce396, 0x02057d49, 0x010782bc, 0x0258f1bf, 0x02e9a05f, 0x0369d300, 0x001b7da9}}, Y: Field{[10]uint32{0x033a4a6f, 0x0268db69, 0x02819dad, 0x024a67c4, 0x01ebf0f4, 0x0337ed36, 0x02d1f31c, 0x031dcbb3, 0x03b3aa51, 0x0018e820}}}, + {X: Field{[10]uint32{0x03174f2c, 0x02970529, 0x022361ad, 0x014c74bf, 0x034fab19, 0x024e945c, 0x00c7ea87, 0x026a60a5, 0x031a4b8c, 0x002bff44}}, Y: Field{[10]uint32{0x0011be6d, 0x00a59c4d, 0x01708734, 0x0072cc81, 0x03342689, 0x022a5e23, 0x02ed3225, 0x00da60ff, 0x00d9ec4a, 0x00130f79}}}, + {X: Field{[10]uint32{0x030abc7e, 0x028914ce, 0x016ee2f0, 0x031af086, 0x01d42cca, 0x031f1c23, 0x01ba5464, 0x02c62867, 0x00499e54, 0x000b68c4}}, Y: Field{[10]uint32{0x032db974, 0x001527c8, 0x03e7c0bb, 0x028fded1, 0x02426981, 0x00713414, 0x0109d445, 0x027e2d5b, 0x009120ad, 0x003cd52b}}}, + {X: Field{[10]uint32{0x02e57b61, 0x01f433e4, 0x03f2b2dc, 0x0007bb24, 0x0323cdd2, 0x036d30c7, 0x01381ace, 0x03e0aba3, 0x0053cbe3, 0x000e20bb}}, Y: Field{[10]uint32{0x037e6e3a, 0x020328bb, 0x03c786cd, 0x014cbec2, 0x0271a43d, 0x009d0191, 0x02b0046b, 0x02ff3124, 0x015de5a7, 0x00074d0c}}}, + {X: Field{[10]uint32{0x0387f9f1, 0x026ed21c, 0x00b28d55, 0x01d4a997, 0x03468259, 0x03a7ad78, 0x03c8e4e8, 0x02ac98e6, 0x02356a08, 0x003f2ae1}}, Y: Field{[10]uint32{0x00fceb94, 0x02c81532, 0x03f540d7, 0x023413bd, 0x02bef2b3, 0x034d5c2b, 0x0166753a, 0x001f395d, 0x00c0d08f, 0x002bd020}}}, + {X: Field{[10]uint32{0x0136bb58, 0x02275d67, 0x00ebe5dd, 0x00468552, 0x02847bf0, 0x01d5032a, 0x01dcd5a5, 0x01f84a8a, 0x00bb8a89, 0x003f4d2e}}, Y: Field{[10]uint32{0x0110b2f3, 0x00d465de, 0x0255b762, 0x00ef4356, 0x00d19b60, 0x008c41b9, 0x0127eaa7, 0x03e5cd5e, 0x02ac6a56, 0x0014699a}}}, + {X: Field{[10]uint32{0x03d4b469, 0x03663961, 0x002fa808, 0x01826776, 0x031d3b46, 0x01f1f605, 0x007a1678, 0x016fc1db, 0x0120c0d8, 0x0007a26f}}, Y: Field{[10]uint32{0x00fe882a, 0x03218a4f, 0x01353eaf, 0x0243ef13, 0x03dcf115, 0x01d3cc48, 0x02dae475, 0x021d80f7, 0x01d0e576, 0x0013d4ea}}}, + {X: Field{[10]uint32{0x03aa05ed, 0x00ea55de, 0x0048f5fb, 0x02795231, 0x01ddca45, 0x03beeaea, 0x017d93ea, 0x026b3b23, 0x03ba6690, 0x002287a9}}, Y: Field{[10]uint32{0x037be091, 0x030133e2, 0x00f99e09, 0x033e2ba5, 0x01ea1f1f, 0x0140600c, 0x037655b2, 0x00de90e7, 0x01e9064f, 0x00356016}}}, + {X: Field{[10]uint32{0x011331a1, 0x03ddb587, 0x032cbd7f, 0x00302d55, 0x00e4451f, 0x03ca586c, 0x0086549a, 0x02649a5a, 0x000d80d5, 0x003830de}}, Y: Field{[10]uint32{0x0145491d, 0x013da392, 0x02551114, 0x02baefb6, 0x03d827dd, 0x008c39ec, 0x03e6f1e5, 0x00ec7f0b, 0x02e6a13c, 0x00267674}}}, + {X: Field{[10]uint32{0x03996035, 0x032303a0, 0x0260ef7c, 0x0373fc83, 0x008e7e1b, 0x036ab786, 0x03ed36c5, 0x02b0485b, 0x00e6ed23, 0x002590d5}}, Y: Field{[10]uint32{0x0028998a, 0x02f4c98d, 0x03529aa8, 0x0234f18c, 0x027e6a40, 0x039bc188, 0x02531984, 0x031ba1c8, 0x009a8563, 0x003dd228}}}, + {X: Field{[10]uint32{0x02fe3f9b, 0x036f0f06, 0x014a1ab1, 0x00556150, 0x038bd094, 0x01a61871, 0x02eab869, 0x03218bf1, 0x03295125, 0x00260279}}, Y: Field{[10]uint32{0x007b9fd7, 0x01afd8e6, 0x0005efd4, 0x02250cbf, 0x00ab0fc0, 0x03f21296, 0x03909f86, 0x0155a20c, 0x0228bbf5, 0x003614d8}}}, + {X: Field{[10]uint32{0x0301ed17, 0x03b31303, 0x03b34abb, 0x01cf6852, 0x011d8d71, 0x00097f1f, 0x0183bf94, 0x013108a3, 0x0102305e, 0x000657d3}}, Y: Field{[10]uint32{0x009d637f, 0x02e1d99f, 0x0221a726, 0x0174ea23, 0x03ce1384, 0x00f2d119, 0x00152e02, 0x02e7341a, 0x00b497ae, 0x00255f6e}}}, + {X: Field{[10]uint32{0x014e0b37, 0x011286a1, 0x036c0f2c, 0x039a06e0, 0x02b0203f, 0x0009243a, 0x023f726d, 0x01f8d3be, 0x02ba3eb1, 0x00158baa}}, Y: Field{[10]uint32{0x0152b1e8, 0x015a9be1, 0x02da59db, 0x02935ecc, 0x0397093b, 0x003bd094, 0x03a35a77, 0x012010b4, 0x00ed9e66, 0x002d3996}}}, + {X: Field{[10]uint32{0x01ec8282, 0x027ca383, 0x01a288d7, 0x00b0292c, 0x03de3a60, 0x00c0bcd3, 0x00579693, 0x02405203, 0x01eb1efa, 0x002128b1}}, Y: Field{[10]uint32{0x02207cf1, 0x018acd91, 0x02023bdf, 0x00fd7c36, 0x00c70331, 0x0372b110, 0x03261dba, 0x03bb6161, 0x01c788cf, 0x001c0354}}}, + {X: Field{[10]uint32{0x0272f913, 0x00025ccd, 0x007fb8ba, 0x02b5df53, 0x00b93e2b, 0x031b52e1, 0x00e73406, 0x0245a2c5, 0x03cf0dbd, 0x0020f44b}}, Y: Field{[10]uint32{0x03279a7b, 0x02d44c79, 0x018ee523, 0x03f61848, 0x013c0dd6, 0x020b3a73, 0x03c78b36, 0x00cb3eeb, 0x0226bf25, 0x0039215b}}}, + {X: Field{[10]uint32{0x015451cf, 0x0001a3b7, 0x03701dfb, 0x008a7b52, 0x00ce64d5, 0x03d190fe, 0x03e73bf9, 0x00c8383e, 0x02f2bbd9, 0x00266229}}, Y: Field{[10]uint32{0x02882d5b, 0x02877462, 0x01910ed5, 0x0070aafa, 0x000d2f43, 0x024be269, 0x0244e4d8, 0x00994342, 0x02fcbd3b, 0x002eecd4}}}, + {X: Field{[10]uint32{0x03ff0724, 0x0202842b, 0x00b5160f, 0x0130aa9c, 0x0183017d, 0x028845ac, 0x0321d1e2, 0x00571ccd, 0x003dcfa6, 0x000fa486}}, Y: Field{[10]uint32{0x002dc945, 0x0202ce45, 0x03d7f226, 0x0029d395, 0x0276a2f3, 0x029cfcf4, 0x01fe5453, 0x02f98bc3, 0x0251f4bc, 0x0031e220}}}, + {X: Field{[10]uint32{0x0239492f, 0x018f5b20, 0x0044de77, 0x02617a96, 0x01e5f85b, 0x02cd89d7, 0x03130faf, 0x03f8e932, 0x0300fa1e, 0x003645d4}}, Y: Field{[10]uint32{0x03678b4b, 0x0199c0a6, 0x03521c55, 0x036217ba, 0x00fbad38, 0x00596aff, 0x0236220d, 0x00a83366, 0x0065e959, 0x001644e3}}}, + {X: Field{[10]uint32{0x02d933dc, 0x01044a4d, 0x01068b47, 0x02e1ea57, 0x03ed74c5, 0x01d9b99d, 0x017f7b47, 0x02fb9974, 0x025f7c12, 0x001bfd60}}, Y: Field{[10]uint32{0x038c0edf, 0x0200920d, 0x0038131f, 0x02a10334, 0x002ea9ac, 0x034ae360, 0x004be0a4, 0x025d2c8c, 0x01de0cb7, 0x001986ba}}}, + {X: Field{[10]uint32{0x00b1c31d, 0x03ac4594, 0x035ab15c, 0x01aeeba1, 0x03956036, 0x030093de, 0x027d580a, 0x004190c1, 0x02b1a876, 0x003b5b2f}}, Y: Field{[10]uint32{0x0217dede, 0x01f59aa1, 0x03f4519a, 0x01dbc675, 0x011269c4, 0x000ba040, 0x024d60f7, 0x02270595, 0x007ed1e8, 0x0024501a}}}, + {X: Field{[10]uint32{0x03d69164, 0x02f812a2, 0x03ca443a, 0x01b8e190, 0x000853bf, 0x02c4c88c, 0x016b56ee, 0x016a8c42, 0x00eb32d7, 0x0017e333}}, Y: Field{[10]uint32{0x0195da3a, 0x0396df9e, 0x02d456bd, 0x03c08734, 0x024f6576, 0x013d60d2, 0x02ac0fac, 0x0077352d, 0x023dd0c8, 0x000d7dca}}}, + {X: Field{[10]uint32{0x002d0b7b, 0x029b88e6, 0x02f7c479, 0x018bc056, 0x0186580d, 0x03b599d4, 0x02896c67, 0x00e5dd48, 0x00859bb2, 0x00207808}}, Y: Field{[10]uint32{0x03fbb669, 0x036f1933, 0x019601eb, 0x00e38abe, 0x02fce84a, 0x017558ac, 0x02ddc088, 0x03c9bed0, 0x029e4159, 0x0021e47e}}}, + {X: Field{[10]uint32{0x01d8f721, 0x0109c4a5, 0x005f141d, 0x03a1eb2a, 0x003eb435, 0x018eeb72, 0x03aba7ad, 0x01709a6d, 0x0316dd1e, 0x0037889a}}, Y: Field{[10]uint32{0x02c8423a, 0x01591c06, 0x0120d841, 0x01a90d37, 0x03342841, 0x038cf644, 0x007dc03d, 0x039cb0fe, 0x0399fa2c, 0x0018b878}}}, + {X: Field{[10]uint32{0x03d140f3, 0x0282f765, 0x012b1d13, 0x02549f2f, 0x00fa7629, 0x03dffc59, 0x0058be59, 0x00ca57f4, 0x03423fcd, 0x0018291b}}, Y: Field{[10]uint32{0x037f1219, 0x034dc3b7, 0x02c8e0f4, 0x015332ff, 0x01912cb8, 0x0280f2ad, 0x02bc31e1, 0x02785f91, 0x02de7b78, 0x00255c74}}}, + {X: Field{[10]uint32{0x032249c0, 0x0227f2f0, 0x027f5ce0, 0x0164fd0a, 0x0080d7e7, 0x028318d9, 0x013a77ab, 0x02f647ef, 0x005ce1b4, 0x001bfbd1}}, Y: Field{[10]uint32{0x00fa347d, 0x00b17a7d, 0x01a919a9, 0x0361f532, 0x03f82e73, 0x01605e5b, 0x020cae2e, 0x036e0e6b, 0x00fbaf46, 0x000457ef}}}, + {X: Field{[10]uint32{0x0293522f, 0x01713f90, 0x02a30914, 0x01705120, 0x03a9892b, 0x03b7af95, 0x025f7c26, 0x03e54e8f, 0x011ca8d2, 0x001b4dfd}}, Y: Field{[10]uint32{0x015309af, 0x019fbba7, 0x03dda0a9, 0x016ea212, 0x00cbefae, 0x00ee4382, 0x026897cd, 0x02b52c37, 0x01f36718, 0x001e3944}}}, + {X: Field{[10]uint32{0x03d46098, 0x02c0d440, 0x02ceaa76, 0x0157f9d2, 0x02738aa1, 0x0376fa65, 0x01cb035e, 0x01c07d72, 0x00275bd0, 0x000302b2}}, Y: Field{[10]uint32{0x00e3cd97, 0x020c807e, 0x026b7c3e, 0x00c5a996, 0x0031d762, 0x003389a9, 0x01684906, 0x029c21aa, 0x022a188f, 0x0039fcca}}}, + {X: Field{[10]uint32{0x00cde108, 0x00481814, 0x02b935d0, 0x02352c95, 0x01822a64, 0x017ebd29, 0x00507df8, 0x01408c7f, 0x03a86f89, 0x00240036}}, Y: Field{[10]uint32{0x014ef3fd, 0x0360f2d9, 0x00ff1779, 0x0008bd63, 0x00323319, 0x03d32c0f, 0x018383c2, 0x03a7a2ef, 0x003694b2, 0x0026deba}}}, + {X: Field{[10]uint32{0x029098a1, 0x02ba35a5, 0x01d9a28a, 0x029d18f8, 0x01ad58de, 0x01b0a8b8, 0x02092532, 0x02f23cd9, 0x03f4b490, 0x003c4426}}, Y: Field{[10]uint32{0x012f24c5, 0x00014257, 0x030224a8, 0x030b0c96, 0x006e3382, 0x032305fb, 0x02305141, 0x00b04200, 0x02279fd7, 0x0021d0c6}}}, + {X: Field{[10]uint32{0x028c0003, 0x0372155b, 0x018b00d1, 0x02353db8, 0x03929adc, 0x01b587e0, 0x00aac8b3, 0x031bc231, 0x01e54e9c, 0x00137a1c}}, Y: Field{[10]uint32{0x00d3bba6, 0x021fc1dc, 0x029c7f01, 0x01c3a68f, 0x00805f4b, 0x027785af, 0x01d7fce1, 0x03a29b1d, 0x03cfca98, 0x00009747}}}, + {X: Field{[10]uint32{0x02766ece, 0x0004f618, 0x01c80b66, 0x019ff633, 0x008f47b4, 0x01384004, 0x02e89ff9, 0x00aefce9, 0x02759297, 0x00288f2d}}, Y: Field{[10]uint32{0x03cf548c, 0x016bae51, 0x01dc7cae, 0x0337f5fa, 0x03cbca18, 0x01f48eab, 0x02811267, 0x0308f685, 0x0384ed05, 0x002371c2}}}, + {X: Field{[10]uint32{0x004244e5, 0x00385256, 0x0032bbb4, 0x00e296df, 0x0179d3c9, 0x039c0f31, 0x03a9dd3b, 0x023e2e46, 0x00cce96d, 0x0000a574}}, Y: Field{[10]uint32{0x0303c926, 0x00fdfb8a, 0x02c95265, 0x02304ace, 0x02745e07, 0x014e2b97, 0x030fe376, 0x0352fdab, 0x0206a16b, 0x0029b516}}}, + {X: Field{[10]uint32{0x02babbce, 0x0009517b, 0x008af9e1, 0x0337bf49, 0x016cb40b, 0x03ef45da, 0x00b13d51, 0x01da9b50, 0x03919d53, 0x001f1a0e}}, Y: Field{[10]uint32{0x01fd3f73, 0x02c6b6ab, 0x02e39332, 0x0169f08e, 0x02197d4e, 0x0367c558, 0x03ed30b8, 0x0215bd6d, 0x01d03608, 0x000f6832}}}, + {X: Field{[10]uint32{0x000c3189, 0x039fbe07, 0x001ecdf5, 0x027b2a7d, 0x038505f3, 0x0388bb08, 0x020e21ff, 0x00926a57, 0x012ed27e, 0x000c3dd4}}, Y: Field{[10]uint32{0x00875169, 0x010790b9, 0x00164fad, 0x01fd5ba2, 0x039e4e7f, 0x02d1cc65, 0x01286514, 0x00e8e856, 0x005e25ea, 0x000bd7f6}}}, + {X: Field{[10]uint32{0x03514961, 0x03d69d8b, 0x00835431, 0x00bed244, 0x031c7f84, 0x02358c52, 0x00a41c77, 0x013c9cc9, 0x038c9658, 0x0024ddef}}, Y: Field{[10]uint32{0x01f3df42, 0x03f5b4da, 0x00ad4335, 0x00b4ea27, 0x003cfa89, 0x03b60c34, 0x017fe92a, 0x036cab9f, 0x0055e2ed, 0x00356673}}}, + {X: Field{[10]uint32{0x0131e9be, 0x0307555b, 0x00ca240a, 0x01e1affd, 0x0328a66e, 0x03e0f153, 0x03530b85, 0x001256e8, 0x03e867f2, 0x000d627f}}, Y: Field{[10]uint32{0x01224c89, 0x02a49d1b, 0x0385b581, 0x019e3f74, 0x00d75b3a, 0x03c4cf71, 0x01c22a89, 0x02278482, 0x02aa9830, 0x0026208b}}}, + {X: Field{[10]uint32{0x023f8935, 0x036e2e3a, 0x03f85999, 0x01e84754, 0x012c79e7, 0x03f31905, 0x00e0f841, 0x03713396, 0x01f4b2da, 0x000e706c}}, Y: Field{[10]uint32{0x00256721, 0x026aa135, 0x0131e628, 0x010985b3, 0x0350bb8a, 0x03fe76a0, 0x036991de, 0x00ce2590, 0x031ad9df, 0x0039e149}}}, + {X: Field{[10]uint32{0x0325be33, 0x03bb7b62, 0x0372cad5, 0x0368914e, 0x00b103f9, 0x02d84639, 0x00799188, 0x00b0b666, 0x0059d3d6, 0x00373c45}}, Y: Field{[10]uint32{0x03a1c074, 0x00f31cbc, 0x017b330a, 0x0323eb9f, 0x02a190f6, 0x031f7771, 0x01a92fe7, 0x01c398d1, 0x001aaf32, 0x003700e3}}}, + {X: Field{[10]uint32{0x02623d1d, 0x018d6cc1, 0x038f0eed, 0x0179bac8, 0x00a32ff0, 0x02f60143, 0x00d82e55, 0x02c304fd, 0x01dd1de9, 0x0018524a}}, Y: Field{[10]uint32{0x00d8a24b, 0x02a9d7b1, 0x02a6ae0e, 0x010c6b2f, 0x02afafdc, 0x020603fd, 0x0118e3be, 0x03c5ee86, 0x0117c9e7, 0x0002bfa1}}}, + {X: Field{[10]uint32{0x00ce743c, 0x006c2ea7, 0x00296a7c, 0x027ed66a, 0x03ef8160, 0x03b22b6f, 0x005da355, 0x036a5029, 0x0228cff6, 0x003d29c8}}, Y: Field{[10]uint32{0x019cdacb, 0x02a069b8, 0x01e50a25, 0x0094f328, 0x032fbcd0, 0x015a71af, 0x01e90f10, 0x016ab827, 0x00fbde09, 0x00151480}}}, + {X: Field{[10]uint32{0x022c93f7, 0x03f94903, 0x01a650b5, 0x0133f23f, 0x0357aa16, 0x00dc6e50, 0x0262fbf5, 0x01565d1b, 0x02736caa, 0x0018f310}}, Y: Field{[10]uint32{0x02ce5665, 0x011f1142, 0x004fe09b, 0x0139143c, 0x01e7d822, 0x012c20a2, 0x02d2bd30, 0x0104eb5a, 0x035bc5a6, 0x0007e93b}}}, + {X: Field{[10]uint32{0x02ab8889, 0x012f8ae3, 0x002016b8, 0x022659e3, 0x00aa7f9d, 0x00d172c1, 0x02cf761f, 0x00e29834, 0x02281184, 0x002b05d4}}, Y: Field{[10]uint32{0x024af2b1, 0x016a60aa, 0x03396343, 0x02266684, 0x00832f29, 0x03ddd97c, 0x02b01b68, 0x00f6b09e, 0x00ae2964, 0x00375f7e}}}, + {X: Field{[10]uint32{0x024a0e48, 0x01e205a7, 0x02c03dd6, 0x008bcde1, 0x03823e86, 0x00bbead6, 0x00a5a2f7, 0x0106d831, 0x02b9637c, 0x00276ed7}}, Y: Field{[10]uint32{0x03d924d7, 0x00e353ad, 0x025cd1ba, 0x001e2718, 0x0205aa01, 0x021466a8, 0x01cde34b, 0x03587d0b, 0x02ba13f4, 0x0001dcb5}}}, + {X: Field{[10]uint32{0x02f7dddc, 0x015cc70f, 0x02fb173d, 0x0266e30c, 0x004e88f5, 0x01683622, 0x015b5866, 0x0304d440, 0x01ddd2fc, 0x001c5c25}}, Y: Field{[10]uint32{0x024fa5af, 0x03f7ed1f, 0x0020e581, 0x01b74638, 0x03472732, 0x031ed902, 0x023da3f3, 0x01c2f3ec, 0x010952b4, 0x0007783c}}}, + {X: Field{[10]uint32{0x025872ca, 0x026a5909, 0x03b2a331, 0x01a0b336, 0x01a32c4a, 0x00535ba7, 0x01e3964c, 0x02c7a900, 0x00d3f829, 0x0016b08c}}, Y: Field{[10]uint32{0x01c026ea, 0x0373ebb2, 0x02e8151b, 0x0360c85e, 0x03423484, 0x00c67290, 0x0206a16e, 0x03d9af17, 0x03a627db, 0x003eb0f0}}}, + {X: Field{[10]uint32{0x038752ef, 0x01f3dd87, 0x00100857, 0x02854446, 0x01382496, 0x00b9d387, 0x0057537b, 0x03d05785, 0x02af0a39, 0x00349fb2}}, Y: Field{[10]uint32{0x01c6c037, 0x037e92dc, 0x03ae35dc, 0x0213eb38, 0x00d5938e, 0x010486da, 0x03d8eb60, 0x02bcc438, 0x036746cb, 0x003f1202}}}, + {X: Field{[10]uint32{0x02ac6cda, 0x007882fc, 0x00d6477f, 0x0064e822, 0x01703af6, 0x03eb6a31, 0x0387d539, 0x0266df13, 0x03ddf92d, 0x003821dd}}, Y: Field{[10]uint32{0x01ccfee9, 0x0169404a, 0x00070db0, 0x039fb6f7, 0x001202c4, 0x03384357, 0x016ecc53, 0x0062c93a, 0x008ac6cb, 0x0009693e}}}, + {X: Field{[10]uint32{0x019ba6ed, 0x0284601a, 0x00776753, 0x039a2015, 0x0363bbe3, 0x0225aae5, 0x02a6a138, 0x01603ef6, 0x02b7afe9, 0x00116b9e}}, Y: Field{[10]uint32{0x0156f322, 0x01b9aa28, 0x00ff16c4, 0x01f83fbf, 0x02502f79, 0x0365bd0f, 0x00d440e3, 0x0381b934, 0x03ed127f, 0x003706bd}}}, + {X: Field{[10]uint32{0x00d00590, 0x0387793d, 0x00045327, 0x00516007, 0x026ae265, 0x01a2d30b, 0x00f509a7, 0x00114ecf, 0x033b71c5, 0x003f4a32}}, Y: Field{[10]uint32{0x00e5a7b6, 0x01994617, 0x02159c26, 0x00ac95fd, 0x013298a2, 0x005d3388, 0x01081f08, 0x033d12a9, 0x03954867, 0x002c1a13}}}, + {X: Field{[10]uint32{0x001d850d, 0x02cc9807, 0x01d7a158, 0x0181d9c7, 0x03956816, 0x00ee7ee9, 0x015e4e22, 0x0127c286, 0x000dac6f, 0x003c89bc}}, Y: Field{[10]uint32{0x0109ef86, 0x01c6d968, 0x0150f10f, 0x0228da45, 0x01d823a0, 0x00661bfa, 0x0230e53a, 0x028e2ad1, 0x004f6925, 0x00341757}}}, + {X: Field{[10]uint32{0x020337a3, 0x0113a41d, 0x0340ff0e, 0x03b23271, 0x00a994e1, 0x02cc0e3e, 0x00e23a72, 0x0212021f, 0x0213a80d, 0x000f3185}}, Y: Field{[10]uint32{0x013c3956, 0x036ef6b3, 0x033f5a11, 0x00794a85, 0x0090377f, 0x0256ac04, 0x0221f09f, 0x00ebda50, 0x016a2409, 0x00211d3e}}}, + {X: Field{[10]uint32{0x0260e736, 0x036b3833, 0x02223e5c, 0x03572579, 0x02633e7e, 0x03d5f5a1, 0x03be2331, 0x025c4af4, 0x01898cd9, 0x001c87b3}}, Y: Field{[10]uint32{0x00ffd69f, 0x02b064a8, 0x028ad532, 0x0284bdd9, 0x0221dc34, 0x03b18cf1, 0x009450bf, 0x01f2b928, 0x00d86fc0, 0x000c74a5}}}, + {X: Field{[10]uint32{0x032eff38, 0x03f3fe8a, 0x03aa2db0, 0x00b03fea, 0x00d5b106, 0x03963ea3, 0x01862715, 0x0366c6c9, 0x02581144, 0x00372eb2}}, Y: Field{[10]uint32{0x01ec7d34, 0x00ec95c8, 0x00689e6d, 0x03986bce, 0x00708b53, 0x038b185d, 0x02fbdca5, 0x01b3fe43, 0x021d339f, 0x00273dd8}}}, + {X: Field{[10]uint32{0x01db8b92, 0x007ccdc5, 0x03878342, 0x02654a39, 0x02b9300b, 0x031e895b, 0x00919382, 0x03b0af39, 0x0293e649, 0x003b4c53}}, Y: Field{[10]uint32{0x00744a11, 0x01f772d8, 0x0318bc83, 0x01238f7e, 0x0153ea03, 0x007c5519, 0x0122355e, 0x03fbcb8a, 0x02af0229, 0x001c2a06}}}, + {X: Field{[10]uint32{0x01c036ee, 0x00dae30a, 0x01c09854, 0x02d8010a, 0x005f5c7e, 0x017d96ba, 0x02977689, 0x02f23466, 0x03cc7a59, 0x001af466}}, Y: Field{[10]uint32{0x00999090, 0x0109cd41, 0x0332c0bc, 0x039de2d5, 0x0131803c, 0x010d5171, 0x03ea28f8, 0x015a06f6, 0x01e3f4f6, 0x00144d1b}}}, + {X: Field{[10]uint32{0x003d9acf, 0x01f1ac75, 0x03e15577, 0x0101eb62, 0x03ebe9d6, 0x02f8222f, 0x00228bb5, 0x037ecd81, 0x02156ac8, 0x00267b47}}, Y: Field{[10]uint32{0x01d2c922, 0x024430c2, 0x03c61e19, 0x02683d11, 0x0169f57e, 0x01c90dab, 0x02a0ac04, 0x01332a03, 0x01a4478b, 0x001d6c56}}}, + {X: Field{[10]uint32{0x02452045, 0x03821dec, 0x0171cc7f, 0x030e30d8, 0x000f00c3, 0x000c0e5c, 0x02dd90fb, 0x0377c212, 0x038c793a, 0x000f859b}}, Y: Field{[10]uint32{0x015bbd59, 0x0086aa07, 0x038da019, 0x0209ee52, 0x019f07e3, 0x0269b31b, 0x0330f6fb, 0x00a997b0, 0x0263b0cd, 0x00245966}}}, + {X: Field{[10]uint32{0x036df936, 0x01567345, 0x03656cf8, 0x00c82107, 0x01a1b1a4, 0x01027427, 0x00d1b168, 0x017ce2fe, 0x02d9a3a9, 0x003f06ea}}, Y: Field{[10]uint32{0x008af43d, 0x0158fc68, 0x0263884a, 0x024486db, 0x02e0b4d7, 0x020ad6d3, 0x005f2489, 0x02e27541, 0x03bdb013, 0x000c7de9}}}, + {X: Field{[10]uint32{0x037ff340, 0x02a0673f, 0x0125a5a5, 0x010d3a72, 0x003bd318, 0x00ce1a21, 0x003c8795, 0x007b2b24, 0x013d4b37, 0x00202ceb}}, Y: Field{[10]uint32{0x012af178, 0x039336dc, 0x02bfdf20, 0x00a1cd1e, 0x010108ae, 0x0197eb1a, 0x03ed7d3b, 0x01b61319, 0x00bdaac9, 0x003ec72a}}}, + {X: Field{[10]uint32{0x00616af2, 0x0330b91a, 0x03422073, 0x012535c9, 0x0002a87d, 0x023bdeab, 0x02c6c364, 0x03dc9f5d, 0x01ab2901, 0x002eb419}}, Y: Field{[10]uint32{0x030a37ed, 0x00ca71d1, 0x01d92236, 0x00d04fc5, 0x02fa925a, 0x02ae8a5c, 0x01d69a2e, 0x03bab536, 0x010216b5, 0x002ba75e}}}, + {X: Field{[10]uint32{0x029b8fe7, 0x010d7e44, 0x03ca9bce, 0x023dfa06, 0x01a2fb75, 0x0321e079, 0x01beb99c, 0x00329a65, 0x02d90d70, 0x00347c11}}, Y: Field{[10]uint32{0x0111a4df, 0x00d16818, 0x01017fca, 0x0029195d, 0x033090fc, 0x0110cc50, 0x03167188, 0x0056bcd1, 0x025d7eb8, 0x0009d3b7}}}, + {X: Field{[10]uint32{0x03f0a22f, 0x02811e8c, 0x03ea1751, 0x01851ce9, 0x0299df17, 0x00a6a83d, 0x01ea798d, 0x02a02963, 0x0355e3dc, 0x0036d4d7}}, Y: Field{[10]uint32{0x0353ff6b, 0x014a2b56, 0x037cced3, 0x03591de8, 0x00e61b86, 0x039ea3c4, 0x013df837, 0x00ef2846, 0x015d931a, 0x0039f600}}}, + {X: Field{[10]uint32{0x00a42a80, 0x039a4703, 0x01d5082a, 0x03945933, 0x008635b7, 0x02693c61, 0x00b1a5db, 0x03c3ebe6, 0x0206a56e, 0x0036876e}}, Y: Field{[10]uint32{0x0210c9ff, 0x0238c4a8, 0x01508d92, 0x0196c85e, 0x008807e2, 0x0172d058, 0x00066210, 0x00c6f2ba, 0x003ca695, 0x0021aa0e}}}, + {X: Field{[10]uint32{0x01aa42e7, 0x03b0a282, 0x008aeff5, 0x01de6cd6, 0x033b176b, 0x01ed509d, 0x014f29ff, 0x0019b1f7, 0x02b4d980, 0x00099f09}}, Y: Field{[10]uint32{0x0027161d, 0x03c82d42, 0x0034142f, 0x0231fe8c, 0x01d58465, 0x0364f6aa, 0x02300531, 0x03ac9574, 0x003ff4e5, 0x000ce430}}}, + {X: Field{[10]uint32{0x01cbea0a, 0x0120fff0, 0x0027d4f3, 0x00a7fb97, 0x025561fd, 0x0021246a, 0x00c79152, 0x03e5541c, 0x03524e6f, 0x0020092b}}, Y: Field{[10]uint32{0x02dd86b0, 0x0075f2ec, 0x00a16dff, 0x01c5cd17, 0x03df7a8a, 0x00279dbf, 0x0078fc06, 0x01c9ac20, 0x00d0498f, 0x0032779e}}}, + {X: Field{[10]uint32{0x0208f661, 0x014d1158, 0x002d2779, 0x025501a2, 0x00dc3dc1, 0x01c73c00, 0x030d7dd3, 0x02d0801f, 0x0268c7be, 0x00047fda}}, Y: Field{[10]uint32{0x03b4092c, 0x0306f029, 0x03dbd658, 0x02ea5e9f, 0x03916b75, 0x007df8ee, 0x03cac25c, 0x0206d479, 0x00252547, 0x002d4f77}}}, + {X: Field{[10]uint32{0x02e3c929, 0x02309fcd, 0x011f6aa8, 0x025ac01d, 0x02b70d65, 0x016a660a, 0x0232d7a6, 0x02080ce6, 0x0083f9a6, 0x00158a84}}, Y: Field{[10]uint32{0x01e05b51, 0x0112b2ec, 0x03364557, 0x01854248, 0x0166ec20, 0x0042b5d0, 0x00e7d255, 0x02022e54, 0x007f0908, 0x0028e03b}}}, + {X: Field{[10]uint32{0x0341c413, 0x0020b8b4, 0x037af68d, 0x029533c1, 0x030e097f, 0x03bd915c, 0x02a75987, 0x0035a4ed, 0x00fd327c, 0x0013bf9c}}, Y: Field{[10]uint32{0x00ce3dc7, 0x02afbcb2, 0x0098a4a1, 0x0118233b, 0x00b110a3, 0x03b476c4, 0x028befc3, 0x02d8b766, 0x039b92e0, 0x0004351e}}}, + {X: Field{[10]uint32{0x03a51f20, 0x03027008, 0x0034ff9a, 0x0260b34c, 0x03354abd, 0x00780709, 0x028576c9, 0x00a2c2f7, 0x030cd7f1, 0x0013592f}}, Y: Field{[10]uint32{0x00a5e28f, 0x030cb97a, 0x00d6eb9d, 0x013cf532, 0x03da3c52, 0x0136f0b9, 0x03bf38e1, 0x037feb79, 0x001af57f, 0x0005679d}}}, + {X: Field{[10]uint32{0x00a187bf, 0x03cc2cc0, 0x0243bc48, 0x02b0dcab, 0x03466de2, 0x03bb3be8, 0x02f0064c, 0x01e35acf, 0x034aff32, 0x00269058}}, Y: Field{[10]uint32{0x02aeae2a, 0x01faa801, 0x03c3cad2, 0x00c3d014, 0x02f409e5, 0x01591262, 0x007a1936, 0x01df3e11, 0x020faebb, 0x0003bbfb}}}, + {X: Field{[10]uint32{0x0102418b, 0x0137b4a4, 0x014cf4fc, 0x03f39e09, 0x002c85cf, 0x039719dd, 0x02fec2d2, 0x03782023, 0x00fb9a6b, 0x00038601}}, Y: Field{[10]uint32{0x02fcdda7, 0x01aacd1f, 0x01e7bfa5, 0x030c60f3, 0x02447e93, 0x00e9996b, 0x03e81c9b, 0x0192e70b, 0x01eb9c16, 0x003a72ac}}}, + {X: Field{[10]uint32{0x00593212, 0x018bc6d9, 0x03b411eb, 0x03c097e7, 0x00717611, 0x03fd134b, 0x021705ad, 0x01ec2be0, 0x0344c024, 0x0002980d}}, Y: Field{[10]uint32{0x02603b61, 0x0066ee32, 0x01d9ce5c, 0x0056a5ae, 0x026dcdb0, 0x021c4ee6, 0x035c0a2f, 0x01d8e10c, 0x032b706a, 0x002083f4}}}, + {X: Field{[10]uint32{0x015f20b0, 0x01882812, 0x036cb66a, 0x02ceab89, 0x01a1108a, 0x03258193, 0x0172a2fe, 0x004a60d2, 0x01b6895b, 0x0029bc76}}, Y: Field{[10]uint32{0x01c8273c, 0x027550db, 0x0288029c, 0x03be0e81, 0x037f55d7, 0x0219e70f, 0x03f5ea81, 0x020e518f, 0x00d0df03, 0x0026a577}}}, + {X: Field{[10]uint32{0x01ac5c48, 0x02bc49b3, 0x0041893b, 0x03cef5d3, 0x02f09f30, 0x01b88850, 0x00f920ab, 0x00ad8f80, 0x00320782, 0x0012b145}}, Y: Field{[10]uint32{0x00f43885, 0x012f0c68, 0x02a6ad7e, 0x031dc83d, 0x027ff037, 0x025156ef, 0x03da161f, 0x01291917, 0x014877e9, 0x002afd74}}}, + {X: Field{[10]uint32{0x03fb7a9b, 0x02efdebd, 0x004752da, 0x00dccd81, 0x0248af6e, 0x02cce508, 0x02c588e1, 0x03ab9633, 0x015ba16e, 0x00168b3d}}, Y: Field{[10]uint32{0x029322e2, 0x00001039, 0x01c4fe0c, 0x007dc58f, 0x01a45f8c, 0x03795688, 0x005aeca5, 0x01cb353f, 0x022d32ff, 0x0023c9ef}}}, + {X: Field{[10]uint32{0x03011c99, 0x00acf636, 0x0388f023, 0x00f8c32c, 0x02a87605, 0x01bff13a, 0x0012b27f, 0x0307d810, 0x03e8ef48, 0x00385bc8}}, Y: Field{[10]uint32{0x00c56000, 0x030e43ee, 0x017990e8, 0x03a84d0a, 0x0247ffe3, 0x02f69853, 0x015bb977, 0x0297036a, 0x0152b0af, 0x000657ff}}}, + {X: Field{[10]uint32{0x0124fb84, 0x02f458e1, 0x0145ac1b, 0x00ebfe5a, 0x0228923a, 0x03761ba4, 0x01e4263c, 0x027dc543, 0x00d7ac10, 0x00194d9f}}, Y: Field{[10]uint32{0x0347d731, 0x020d2945, 0x006b68a7, 0x02541a02, 0x00a7687c, 0x03ad3fa3, 0x009b170b, 0x01f75934, 0x01bafbe6, 0x00033c2e}}}, + {X: Field{[10]uint32{0x03d6eac2, 0x03bcd99a, 0x00d54a5c, 0x02723a55, 0x0389da48, 0x01b75991, 0x004228bd, 0x00ee35e9, 0x000b3944, 0x00042a21}}, Y: Field{[10]uint32{0x0261eff2, 0x01f80d31, 0x00a60798, 0x01571384, 0x03d8cc40, 0x03dfeb44, 0x01163ace, 0x01637861, 0x036ee4aa, 0x001ffdbd}}}, + {X: Field{[10]uint32{0x0245d6a0, 0x02c4c9d4, 0x000e1528, 0x03aa46ba, 0x027b1db5, 0x0315dfc5, 0x039d0380, 0x020809ae, 0x00a6c01b, 0x000ffbfa}}, Y: Field{[10]uint32{0x03637b5e, 0x01630e8e, 0x02350ecd, 0x01e9f27f, 0x03a95975, 0x0275a3bf, 0x00a0b543, 0x00512915, 0x01a937e6, 0x002a5b7d}}}, + {X: Field{[10]uint32{0x00052b61, 0x02b68871, 0x00c626c3, 0x03575861, 0x0058595f, 0x01759534, 0x03fb908f, 0x018ba5af, 0x037c0e41, 0x003be4f5}}, Y: Field{[10]uint32{0x03cd0bf5, 0x03efd03c, 0x0066b953, 0x007db35d, 0x01e53526, 0x011745a7, 0x01a23a86, 0x025f1fd6, 0x0385c18d, 0x00100222}}}, + {X: Field{[10]uint32{0x00ca4872, 0x01ef60ac, 0x01d40d62, 0x0335466f, 0x009224a2, 0x025c6df1, 0x01edbd84, 0x0240f521, 0x035eb0fa, 0x003c5e27}}, Y: Field{[10]uint32{0x031a9da8, 0x000587e9, 0x028d0583, 0x0016b6aa, 0x019e36a9, 0x01ec7d28, 0x03570f47, 0x0115fa8b, 0x00b65456, 0x00132117}}}, + {X: Field{[10]uint32{0x009b3274, 0x03313533, 0x004bfff3, 0x02422a1c, 0x00641938, 0x0353907c, 0x000d15ba, 0x017b4083, 0x0388ebc7, 0x00342ec5}}, Y: Field{[10]uint32{0x022a7641, 0x02aeffc8, 0x022fd8f7, 0x0091137d, 0x0143ac55, 0x00199992, 0x02877963, 0x009fd239, 0x00a895a3, 0x000e8483}}}, + {X: Field{[10]uint32{0x00e8963a, 0x0337df37, 0x0005a3fa, 0x0186bae6, 0x022f05e4, 0x00844350, 0x02aab317, 0x01eb9935, 0x010cf780, 0x000592b0}}, Y: Field{[10]uint32{0x02549b69, 0x037166fa, 0x032093f9, 0x0098c07c, 0x009b6dca, 0x0127e63f, 0x01d6f858, 0x037642ec, 0x03d440f1, 0x002373d0}}}, + {X: Field{[10]uint32{0x001fbe5f, 0x01b1e0a5, 0x02e40987, 0x00a5ce68, 0x00cd3aca, 0x00a527c3, 0x017dcf89, 0x0038eae1, 0x0165a8e4, 0x003c48b6}}, Y: Field{[10]uint32{0x02447371, 0x03409a36, 0x02257f50, 0x01cb4863, 0x00715043, 0x02d9c2fb, 0x02192d0b, 0x02260de2, 0x039dd9e6, 0x00136652}}}, + {X: Field{[10]uint32{0x008870a8, 0x0050e939, 0x03829662, 0x008605b9, 0x01b975fc, 0x015e07c2, 0x02e2cdbf, 0x02a4a86b, 0x014775e5, 0x002b25c5}}, Y: Field{[10]uint32{0x03c9aa71, 0x010f1c50, 0x03edef89, 0x0373e2ef, 0x0253fff7, 0x01e3725e, 0x03679452, 0x005d0a59, 0x0203795b, 0x000927ed}}}, + {X: Field{[10]uint32{0x01330906, 0x0312174b, 0x03fbdd48, 0x01b8512c, 0x02fb0add, 0x03a721c3, 0x013da811, 0x03f73243, 0x011edfd5, 0x002567b2}}, Y: Field{[10]uint32{0x0257ebdc, 0x02428898, 0x024b9aed, 0x01d4a91c, 0x0229f489, 0x014d617f, 0x01b5ebc6, 0x031d86d8, 0x0128b707, 0x000797b0}}}, + {X: Field{[10]uint32{0x02982859, 0x02ea4f87, 0x028b7c59, 0x02348ed7, 0x003c6abd, 0x01b7827c, 0x03b2d157, 0x0208c915, 0x01d8ed7d, 0x001641e5}}, Y: Field{[10]uint32{0x00576708, 0x014a4b4d, 0x003c0683, 0x008ea760, 0x01a09cb1, 0x011ead0b, 0x0216490a, 0x02210583, 0x02861a3c, 0x0017b74a}}}, + {X: Field{[10]uint32{0x03e0ba9e, 0x005373a8, 0x02555897, 0x02d6fc6e, 0x0348fdb4, 0x032b4541, 0x02178535, 0x00916fb6, 0x03987439, 0x00314dca}}, Y: Field{[10]uint32{0x00bca987, 0x02266c58, 0x035a022e, 0x010e2d92, 0x00767afc, 0x01ada713, 0x01536a54, 0x036e300d, 0x03617159, 0x003e0b42}}}, + {X: Field{[10]uint32{0x035bd38a, 0x013e5b38, 0x01ee1653, 0x00a1f72f, 0x00101611, 0x00c3c9b1, 0x00d20166, 0x032f4fb2, 0x01fcae39, 0x003cf656}}, Y: Field{[10]uint32{0x009b3562, 0x00f3c5eb, 0x016ce160, 0x000fb42b, 0x03da586a, 0x03918051, 0x03e2f97f, 0x009e0cbf, 0x001f8760, 0x00387957}}}, + {X: Field{[10]uint32{0x037fad9e, 0x033b0b94, 0x02cf8dd5, 0x010fe2a4, 0x0103a280, 0x0226c193, 0x023d9604, 0x038de0af, 0x036ebe3c, 0x00248af1}}, Y: Field{[10]uint32{0x01122109, 0x0302657d, 0x02b54352, 0x016f440c, 0x00116fbf, 0x006a5486, 0x00b9ea75, 0x03bf688c, 0x03572508, 0x002cc667}}}, + {X: Field{[10]uint32{0x01f0360d, 0x00e1cd36, 0x00a1299a, 0x02236ebf, 0x022c461d, 0x001c2b32, 0x02b1df08, 0x00b255e6, 0x01407a6d, 0x001171f7}}, Y: Field{[10]uint32{0x03e85ac4, 0x01349799, 0x00e73264, 0x029a983a, 0x02d076eb, 0x03765bd2, 0x03c4e044, 0x01a7b5b0, 0x015b5f24, 0x000e85e1}}}, + {X: Field{[10]uint32{0x0159bacb, 0x038b49ae, 0x00d5b33e, 0x02787c24, 0x00f1af5c, 0x01104705, 0x0189a5b7, 0x02c028f7, 0x0198dfd4, 0x001908b6}}, Y: Field{[10]uint32{0x037a3bb7, 0x03df6240, 0x03a09cdb, 0x01f1c0ee, 0x03376f59, 0x01dbd6cf, 0x018cea22, 0x0062864f, 0x03344912, 0x00388d63}}}, + {X: Field{[10]uint32{0x00b0535c, 0x03320b31, 0x01a6f535, 0x033c14d9, 0x0295b1a3, 0x00afdb07, 0x00640f19, 0x01b45469, 0x02143319, 0x00238120}}, Y: Field{[10]uint32{0x017c34ce, 0x023bd43a, 0x00e65b63, 0x02562ea5, 0x00200121, 0x017d56a8, 0x0282ee53, 0x00b1567c, 0x033a1f65, 0x0035b4b5}}}, + {X: Field{[10]uint32{0x024a79bb, 0x001c27f9, 0x002c4a1c, 0x003c0575, 0x02b8a708, 0x0049184f, 0x025a9e17, 0x00bc3e28, 0x01a8b5eb, 0x00168acf}}, Y: Field{[10]uint32{0x0386e6b7, 0x01fc622f, 0x00cd4422, 0x0209ae09, 0x01a6435a, 0x03be7629, 0x0095f8e6, 0x02abf9b7, 0x011deb54, 0x00181f1e}}}, + {X: Field{[10]uint32{0x02cd7ccf, 0x034b573d, 0x0213e1a0, 0x0000f377, 0x01c5296e, 0x0082afd2, 0x00f3d912, 0x005299d4, 0x03a35cf6, 0x00050d61}}, Y: Field{[10]uint32{0x02a653d7, 0x00bcb7e1, 0x0201b662, 0x01f0ba0c, 0x0315f14c, 0x011b0d02, 0x021af490, 0x03162d26, 0x01fade6c, 0x00126f21}}}, + {X: Field{[10]uint32{0x00a93193, 0x006f8677, 0x031a3ac8, 0x01f3fc97, 0x01ba357b, 0x03276141, 0x032c4bc8, 0x031d330e, 0x00428737, 0x003c0203}}, Y: Field{[10]uint32{0x023951f1, 0x00970e52, 0x00f0b5cf, 0x0364b289, 0x001c6a5a, 0x01c09f47, 0x03cfe320, 0x019d29f5, 0x019f57bf, 0x002f7404}}}, + {X: Field{[10]uint32{0x01130034, 0x01235417, 0x009cef77, 0x02bab01d, 0x023e162d, 0x0175f109, 0x00b26b68, 0x03fbd0db, 0x0373e547, 0x0021deb8}}, Y: Field{[10]uint32{0x00dfcf5f, 0x03db7c35, 0x00a8e6f9, 0x0054cb97, 0x03e1275e, 0x03c9a328, 0x0156b798, 0x00d06bb6, 0x0095b750, 0x0007c2bd}}}, + {X: Field{[10]uint32{0x00e619d4, 0x03caae7a, 0x02ca0d1d, 0x00182dce, 0x03e55f07, 0x01a689cb, 0x016a0714, 0x03286232, 0x036f0635, 0x00290637}}, Y: Field{[10]uint32{0x02f754e3, 0x03ff3580, 0x00856525, 0x0061a52e, 0x002e7558, 0x0296d646, 0x0099a6da, 0x009383f9, 0x01bb5bbb, 0x000ac1b3}}}, + {X: Field{[10]uint32{0x02aedeab, 0x001d8de8, 0x029671d9, 0x00253ad4, 0x00114dc2, 0x0131ec2d, 0x02dce4f4, 0x02eb4897, 0x0174bb6f, 0x0013084f}}, Y: Field{[10]uint32{0x03970b51, 0x0037dce7, 0x01be0e48, 0x03ec81b1, 0x01402fb5, 0x022bea73, 0x012c7d54, 0x0170561d, 0x039fccc6, 0x001d06fb}}}, + {X: Field{[10]uint32{0x00deb13a, 0x02dc1588, 0x01bff0ec, 0x030eed33, 0x032cf93b, 0x02240046, 0x014073a4, 0x03946c6a, 0x02fd3f94, 0x0028de41}}, Y: Field{[10]uint32{0x00e6030a, 0x028b59cc, 0x02332f01, 0x0376252a, 0x008a8a16, 0x00cc52dc, 0x00d5e552, 0x026c7461, 0x00b1c14a, 0x001828ec}}}, + {X: Field{[10]uint32{0x01e72301, 0x013b1353, 0x0225c5e8, 0x02396e14, 0x02d6d652, 0x01aed194, 0x038ae3d2, 0x02bd4592, 0x02ed639e, 0x000b19df}}, Y: Field{[10]uint32{0x03ee832a, 0x006e7fc1, 0x0278eaca, 0x00c4ecb4, 0x005fe639, 0x02b01f09, 0x0389240c, 0x01f2e85f, 0x0006d3bb, 0x0037c393}}}, + {X: Field{[10]uint32{0x017e77b4, 0x0077d2df, 0x009395d6, 0x02c33eb2, 0x01684473, 0x02c07000, 0x035fc3c5, 0x01af940c, 0x0014eaf8, 0x002d547e}}, Y: Field{[10]uint32{0x0246664b, 0x026738c1, 0x00bb1bd3, 0x03984693, 0x038818b6, 0x012b879f, 0x033f923b, 0x0057e0c0, 0x03354697, 0x002a5e72}}}, + {X: Field{[10]uint32{0x01f45c39, 0x020851b7, 0x01984fba, 0x02a1d050, 0x012cd47b, 0x0037c31c, 0x0361ad74, 0x0013abc7, 0x03185c8c, 0x00263571}}, Y: Field{[10]uint32{0x00050804, 0x034ae928, 0x01bc5b36, 0x00b10a3d, 0x019d4a8e, 0x007b3aa2, 0x02f88f5f, 0x01fb083a, 0x01915c73, 0x002b2949}}}, + {X: Field{[10]uint32{0x00cefc7c, 0x008f8ae5, 0x03bc9a0b, 0x021bbe3e, 0x02ed1e13, 0x03ef3318, 0x00104854, 0x02d949a3, 0x02f7260f, 0x00145238}}, Y: Field{[10]uint32{0x03ca2500, 0x01c914a9, 0x016e1296, 0x00581f2a, 0x039e9b27, 0x0068236e, 0x024a8ccb, 0x0292616e, 0x012d35de, 0x00196d37}}}, + {X: Field{[10]uint32{0x020e753c, 0x03a44c63, 0x031daf91, 0x01f260b7, 0x00a08a22, 0x02fad145, 0x0240cccb, 0x019042e2, 0x01c18c9d, 0x0004b1a6}}, Y: Field{[10]uint32{0x032fcc99, 0x0008b624, 0x028e120b, 0x01a013b4, 0x004889e9, 0x00145ba2, 0x029a1975, 0x015c90d1, 0x004289b5, 0x001f654f}}}, + {X: Field{[10]uint32{0x020a8d20, 0x01a75204, 0x02c639dc, 0x01e540e6, 0x02134e44, 0x03aec8c4, 0x02ecac37, 0x010046cd, 0x03f8a773, 0x0013434f}}, Y: Field{[10]uint32{0x0144ec64, 0x025816c0, 0x02a57397, 0x00a7c2c3, 0x03960b3d, 0x025fc85c, 0x00f10261, 0x013180f1, 0x03a0e098, 0x003b7fc5}}}, + {X: Field{[10]uint32{0x0136e42d, 0x00941855, 0x03be4481, 0x036606a7, 0x03ccb069, 0x019a0cdb, 0x01b0985a, 0x01e9c6a4, 0x030b3e7b, 0x0033a42d}}, Y: Field{[10]uint32{0x01569000, 0x00e91e01, 0x01e672e6, 0x039915fc, 0x00d3af73, 0x021d581b, 0x00640ca2, 0x03ab5d49, 0x015612e0, 0x002337a7}}}, + {X: Field{[10]uint32{0x0163b2d8, 0x03124c41, 0x0297e360, 0x02c720ef, 0x00d197f5, 0x034bea42, 0x03bf9851, 0x021e7667, 0x03276bb1, 0x000a31e4}}, Y: Field{[10]uint32{0x00643868, 0x02125b3b, 0x010857c1, 0x00f8cf64, 0x03bc0f3e, 0x03873ef8, 0x02b10f6a, 0x02d5196d, 0x0240e2f3, 0x00322513}}}, + {X: Field{[10]uint32{0x03442443, 0x03fa94f9, 0x006659a1, 0x02021f4c, 0x03864d4c, 0x016dc1fc, 0x00c2b6b5, 0x033c0601, 0x01062413, 0x001b8b6b}}, Y: Field{[10]uint32{0x029430e0, 0x000d77c4, 0x01f7dc4c, 0x00a10d10, 0x02497bc0, 0x02703f8d, 0x021fba73, 0x01a450c2, 0x0064e05d, 0x0027699f}}}, + {X: Field{[10]uint32{0x004d20fe, 0x016dc923, 0x0254f871, 0x022248fb, 0x0119f261, 0x037d0dfe, 0x034d03df, 0x00e51b10, 0x02c80376, 0x002fbe52}}, Y: Field{[10]uint32{0x031e25db, 0x033b5500, 0x038aaee7, 0x01cf39f8, 0x02386484, 0x02578501, 0x0383032e, 0x007719be, 0x0134e5fc, 0x00348c91}}}, + {X: Field{[10]uint32{0x018e433d, 0x033b6be0, 0x01125918, 0x0190f517, 0x009b7d86, 0x003c994f, 0x0166a24c, 0x01707728, 0x0057f1b4, 0x0014d523}}, Y: Field{[10]uint32{0x010c3b44, 0x024e013c, 0x0240db6a, 0x0170f2b5, 0x01c36aec, 0x00c2c4ea, 0x01307e21, 0x001fe700, 0x0146f0c2, 0x003304e2}}}, + {X: Field{[10]uint32{0x00b5867e, 0x01bfd001, 0x0188f90f, 0x02aff51e, 0x012aee71, 0x022dc8fb, 0x00b0e09b, 0x0324053a, 0x03847f25, 0x001ff53d}}, Y: Field{[10]uint32{0x00a1bd9d, 0x0174899d, 0x0297641b, 0x0234dd7e, 0x0358eec1, 0x01b900b6, 0x0205805a, 0x004ab659, 0x02bc901f, 0x003ff0f7}}}, + {X: Field{[10]uint32{0x0397dd9d, 0x031e7e94, 0x003ccd3d, 0x03da72e2, 0x03d4251b, 0x036411bb, 0x0062424c, 0x0226d127, 0x027e4997, 0x001112a2}}, Y: Field{[10]uint32{0x03b30282, 0x03117936, 0x03f828f7, 0x0106fce4, 0x02abbe8e, 0x002355b0, 0x028c7757, 0x02c0802b, 0x003b3356, 0x0013317c}}}, + {X: Field{[10]uint32{0x0326bd8b, 0x0033aa15, 0x02bc1acb, 0x019e398a, 0x0204af8c, 0x0108071e, 0x0294bd0a, 0x01897481, 0x007784d8, 0x003fc172}}, Y: Field{[10]uint32{0x0196eeb3, 0x030b79ea, 0x012d906e, 0x028242f4, 0x02a55f6a, 0x02fa613b, 0x025a0b5c, 0x01894f3e, 0x00ce6ac2, 0x001f3c3a}}}, + {X: Field{[10]uint32{0x027e4ab2, 0x020ce6b7, 0x027c679b, 0x001223c2, 0x00e29f47, 0x00ff649d, 0x0094ea08, 0x006daf3a, 0x03ae6aa3, 0x00203f7d}}, Y: Field{[10]uint32{0x0152fb75, 0x01b9828e, 0x018fe3f4, 0x02fc2f79, 0x0249e066, 0x03515d71, 0x004a8b4b, 0x009d158d, 0x017b1696, 0x001df5cc}}}, + {X: Field{[10]uint32{0x01879214, 0x012bab50, 0x01589685, 0x01edfad2, 0x03ef2022, 0x0035dcb5, 0x0020a74f, 0x001f2b54, 0x00c810a3, 0x002b0e29}}, Y: Field{[10]uint32{0x035016ac, 0x034b3a87, 0x01213c7c, 0x02acd057, 0x00d75ecf, 0x00b88a7b, 0x02f77ca9, 0x01616105, 0x00bb3c67, 0x003d2713}}}, + {X: Field{[10]uint32{0x01f75514, 0x02445569, 0x036fea26, 0x00d77a6a, 0x013a90a4, 0x03d40bc6, 0x0162f408, 0x00098bf5, 0x02ddf1e1, 0x002cdcdb}}, Y: Field{[10]uint32{0x015a78c8, 0x020c15eb, 0x027514e4, 0x037995fb, 0x000eafa2, 0x02856b83, 0x01cb0682, 0x00d4f3c0, 0x03aff190, 0x0020633b}}}, + {X: Field{[10]uint32{0x010dc295, 0x00e2cccc, 0x0322f127, 0x03d73ed9, 0x03e698d4, 0x031aa16a, 0x03f6d5ea, 0x03045ad5, 0x0212d100, 0x0019b59f}}, Y: Field{[10]uint32{0x00a05dd3, 0x0097fa85, 0x0318fd4e, 0x0318cb5c, 0x02685fae, 0x026ef5fa, 0x0208ea70, 0x0269534d, 0x021f3a0c, 0x0027353e}}}, + {X: Field{[10]uint32{0x02b59043, 0x011c4d4f, 0x0333eb87, 0x01ae9ee6, 0x029fa10c, 0x01bb37c2, 0x02eb6514, 0x0392136a, 0x035f756a, 0x002e15b5}}, Y: Field{[10]uint32{0x01cb0a38, 0x0069f6e2, 0x004c4b04, 0x0071c9ca, 0x026566da, 0x037c91bc, 0x03a177d8, 0x0259252c, 0x02b12f24, 0x00172150}}}, + {X: Field{[10]uint32{0x01c47d27, 0x014a547e, 0x01548afc, 0x017ee165, 0x03c736b1, 0x01869950, 0x00142cd6, 0x008e4d16, 0x03d70320, 0x0001a0ef}}, Y: Field{[10]uint32{0x022de166, 0x018d045d, 0x01746b41, 0x028a3653, 0x02420387, 0x031a3365, 0x0029f84a, 0x037c9945, 0x0240f5db, 0x00243d4a}}}, + {X: Field{[10]uint32{0x032923c2, 0x003e2a46, 0x018963d0, 0x029fe25d, 0x0141ee1c, 0x00ce8250, 0x00959345, 0x0079944e, 0x01f0811e, 0x000bfaa8}}, Y: Field{[10]uint32{0x00499c1a, 0x00e843fa, 0x0202b07e, 0x0081f41b, 0x03690d18, 0x039bb87b, 0x03701c35, 0x03500575, 0x0176b884, 0x00277602}}}, + {X: Field{[10]uint32{0x0287cda4, 0x001ed608, 0x0009780e, 0x02a86a5a, 0x01847070, 0x01134833, 0x0365e9b1, 0x02ebcea5, 0x0137da9e, 0x0033994a}}, Y: Field{[10]uint32{0x001ba572, 0x00c87cc1, 0x01b6801b, 0x00dbade8, 0x00454e17, 0x0279eba1, 0x01db3782, 0x00b6f96a, 0x03fb5f15, 0x0030711b}}}, + {X: Field{[10]uint32{0x00976211, 0x017f9a1e, 0x008a84fd, 0x02dac137, 0x03556087, 0x01d42f71, 0x03f9738a, 0x018feeac, 0x03d91701, 0x00269a56}}, Y: Field{[10]uint32{0x02aeda70, 0x0273c48f, 0x03c27d0c, 0x00b5935a, 0x010dce26, 0x02521a36, 0x002b1332, 0x03361669, 0x01f375ac, 0x003d02e8}}}, + {X: Field{[10]uint32{0x0134ba44, 0x034c88ef, 0x00ec718c, 0x0285d55e, 0x035908b0, 0x03936930, 0x02bd6d09, 0x020fb2fe, 0x0368bd30, 0x00396eab}}, Y: Field{[10]uint32{0x03a27fb0, 0x03bee642, 0x03dbce4d, 0x011aa6be, 0x005feb7f, 0x028fa1a9, 0x0076d0ed, 0x030f0541, 0x01f0365c, 0x002ae194}}}, + {X: Field{[10]uint32{0x03e59cc7, 0x00ddb63f, 0x0104ce06, 0x0322fd8f, 0x03dd0c4d, 0x01fb87f6, 0x033530bb, 0x03f9df63, 0x02a2b507, 0x000b09b3}}, Y: Field{[10]uint32{0x0230d62e, 0x002da739, 0x0004a500, 0x030abbf0, 0x03c30a1c, 0x016114a5, 0x0367151b, 0x00fae6c2, 0x03af54d0, 0x002cd138}}}, + {X: Field{[10]uint32{0x00bbd0e4, 0x00527d72, 0x027a3c2a, 0x02701ff2, 0x024d5333, 0x0281f8bd, 0x01eadaf0, 0x00b98623, 0x039f52af, 0x001f19d4}}, Y: Field{[10]uint32{0x009067c9, 0x039cfa4c, 0x0303896e, 0x02f986d8, 0x03df7a2c, 0x01990bb1, 0x02cc97ec, 0x0244d813, 0x02fdc21c, 0x000fe61c}}}, + {X: Field{[10]uint32{0x02249574, 0x02b7072a, 0x01aab8f9, 0x013dd080, 0x00334561, 0x00769c72, 0x02e1d17e, 0x002f24ed, 0x012dec8b, 0x0012d777}}, Y: Field{[10]uint32{0x02c5460b, 0x02cdaa2a, 0x03d695df, 0x0155b957, 0x036e16e7, 0x00aa169a, 0x00d18b3d, 0x03bf6d0d, 0x02dcaa3e, 0x0033eb68}}}, + {X: Field{[10]uint32{0x00d80e4b, 0x02f0d6e2, 0x03e59216, 0x0200bac2, 0x00f9bb66, 0x01cea13e, 0x0266edb8, 0x0020d61a, 0x02f2ccfc, 0x0035dd70}}, Y: Field{[10]uint32{0x0053ddbb, 0x02ce933f, 0x01ea765b, 0x015e444d, 0x02ff56ca, 0x025902a1, 0x02aa0b51, 0x0088c73d, 0x01b7988a, 0x00322976}}}, + {X: Field{[10]uint32{0x00d9bb4a, 0x0200ea6f, 0x014dcd3c, 0x01ec0dab, 0x00b005b0, 0x00f70f69, 0x001d9844, 0x003e77ec, 0x03097881, 0x001c68f3}}, Y: Field{[10]uint32{0x03caaa55, 0x00c41002, 0x01f5a1ad, 0x01362627, 0x01bd4a3c, 0x0185eb55, 0x000c5b39, 0x00c06e59, 0x02217db0, 0x0022aae3}}}, + {X: Field{[10]uint32{0x011f53b7, 0x03a2ec66, 0x00d3fdde, 0x00160970, 0x02a82f7d, 0x035de3bd, 0x00596ae3, 0x025b9880, 0x005492b6, 0x002f1c68}}, Y: Field{[10]uint32{0x029a2a15, 0x02abd85c, 0x03b52b07, 0x00db9003, 0x00d11255, 0x018c2a42, 0x03744600, 0x02e362c4, 0x01259785, 0x00055e24}}}, + {X: Field{[10]uint32{0x00847abc, 0x0247193f, 0x01f7e6f8, 0x002f1ade, 0x00e8d94a, 0x003d8396, 0x001ec81a, 0x02ff73ee, 0x0119ee62, 0x00274882}}, Y: Field{[10]uint32{0x02d0c675, 0x002f1f9b, 0x02a16e53, 0x03229efe, 0x0075f3a7, 0x027d3a53, 0x03fe8865, 0x00f0ae37, 0x039b1a07, 0x0020524d}}}, + {X: Field{[10]uint32{0x03f33425, 0x0230cfbb, 0x016e5c6c, 0x006d38da, 0x00d25bff, 0x038eb565, 0x030c6c91, 0x02f4668c, 0x026ad30b, 0x0020da5d}}, Y: Field{[10]uint32{0x02e79e4a, 0x02562e5c, 0x008a4e4b, 0x0236185f, 0x038ed5d2, 0x0087df6b, 0x00970d9c, 0x015d7216, 0x0282b3f4, 0x00289fdd}}}, + {X: Field{[10]uint32{0x00542451, 0x02cba2c8, 0x00ab457d, 0x02b4735a, 0x03e91f51, 0x021fed09, 0x00d36b54, 0x03aaac6a, 0x00750e4a, 0x001389de}}, Y: Field{[10]uint32{0x026566e0, 0x014083a8, 0x0123e763, 0x0036a3e1, 0x02d138fd, 0x0054a951, 0x02bf1d2a, 0x012e07e5, 0x03655bbc, 0x0027ebbf}}}, + {X: Field{[10]uint32{0x01a0d2fa, 0x024408ce, 0x036b108b, 0x0306c84c, 0x01825046, 0x009816a4, 0x028d2027, 0x03ffcc39, 0x03b51b9d, 0x0009fe41}}, Y: Field{[10]uint32{0x012d4a15, 0x035ec301, 0x0068acbf, 0x0167ff10, 0x000105f4, 0x03571276, 0x004bf3dd, 0x00d803ee, 0x01c36cb1, 0x00045489}}}, + {X: Field{[10]uint32{0x02b1fab3, 0x010bbb55, 0x0281864b, 0x02a3cf35, 0x02ef0900, 0x007dc3c5, 0x03ff42d4, 0x01d3110d, 0x03206506, 0x001b67fa}}, Y: Field{[10]uint32{0x03a02065, 0x015d3483, 0x02444f60, 0x0000e6a8, 0x035f7f7b, 0x014ebe8e, 0x015f8576, 0x00f070b9, 0x03ecd82b, 0x0020b365}}}, + {X: Field{[10]uint32{0x0187bfac, 0x03cb3de0, 0x03558857, 0x02f4ef45, 0x01ecb9cd, 0x00a139ca, 0x01c3b363, 0x019a74d8, 0x02b43360, 0x00226074}}, Y: Field{[10]uint32{0x00d48498, 0x01b5e05c, 0x0245a3e8, 0x018db09d, 0x000216b2, 0x0053b357, 0x011bf736, 0x0174761e, 0x0327d5a4, 0x0006e6ba}}}, + {X: Field{[10]uint32{0x02e1d72e, 0x026169dc, 0x010ce9c5, 0x0215b4f0, 0x02816916, 0x01fa4b38, 0x0140d557, 0x0347f895, 0x0118e47a, 0x0021299d}}, Y: Field{[10]uint32{0x01631658, 0x0294d071, 0x03356dc8, 0x0389a67b, 0x0016ca04, 0x0312dcff, 0x0011777d, 0x00ba8b9b, 0x03af8507, 0x0034f2e4}}}, + {X: Field{[10]uint32{0x00a8c683, 0x030a346b, 0x03418d50, 0x0376e77e, 0x007e666c, 0x0196999d, 0x00111e2e, 0x033ddd43, 0x035672a6, 0x0034f999}}, Y: Field{[10]uint32{0x02556dd9, 0x027eb8e9, 0x023f0735, 0x016f7441, 0x034e2e81, 0x008cfe0f, 0x01aca5d8, 0x031b0ead, 0x00aa20e5, 0x001dddbb}}}, + {X: Field{[10]uint32{0x01b87bba, 0x00b6ce19, 0x03c4af7b, 0x02129a3b, 0x02522a76, 0x0394958f, 0x00e76b5e, 0x015a2201, 0x01ef71d4, 0x003b7a5f}}, Y: Field{[10]uint32{0x01ae702f, 0x01eda4bf, 0x03513758, 0x023eddfa, 0x0285bafb, 0x01d62a03, 0x02279f95, 0x0049d982, 0x020f0c9c, 0x0024b9b4}}}, + {X: Field{[10]uint32{0x02e8c871, 0x0282e73a, 0x006ed025, 0x021091eb, 0x036ff84f, 0x00c4b9c0, 0x03db3ae2, 0x01213b3d, 0x0142e000, 0x000cd678}}, Y: Field{[10]uint32{0x021cdf66, 0x019be774, 0x0377f871, 0x0024db90, 0x00d00ada, 0x00e76fca, 0x00c98bf7, 0x017e87ce, 0x01f23c84, 0x0019ec0e}}}, + {X: Field{[10]uint32{0x022b44a1, 0x018b1f84, 0x0158f8fd, 0x02bb3c36, 0x0196f675, 0x00245295, 0x014a3dc4, 0x000bf499, 0x01720c05, 0x0038342a}}, Y: Field{[10]uint32{0x036b0312, 0x01ef51d5, 0x021718db, 0x00b46c47, 0x033ee29e, 0x03684640, 0x03d916ed, 0x0169faef, 0x01bc3457, 0x00032fac}}}, + {X: Field{[10]uint32{0x01a4c987, 0x01f7e108, 0x02605939, 0x00676368, 0x014f3320, 0x007d757b, 0x0031ac7a, 0x01dc1190, 0x03675df7, 0x00142e24}}, Y: Field{[10]uint32{0x0292f293, 0x013ccd74, 0x01204cb0, 0x014cf67b, 0x0045c382, 0x01b5bfc3, 0x009c3f25, 0x0327ae82, 0x0181063e, 0x00311d97}}}, + {X: Field{[10]uint32{0x016d446a, 0x0390cb73, 0x0111391c, 0x02f9073a, 0x037f80cb, 0x03e3a048, 0x01e84e99, 0x017fdbc8, 0x018e6677, 0x0017718b}}, Y: Field{[10]uint32{0x0373a9c2, 0x01bac505, 0x01de99ad, 0x02fc497d, 0x00b020ca, 0x0058ff57, 0x021cdabd, 0x011695db, 0x037de270, 0x0012d15a}}}, + {X: Field{[10]uint32{0x02c10971, 0x0353e588, 0x01b03fdc, 0x01f88bbf, 0x004e56ba, 0x0241c430, 0x0232e187, 0x00611749, 0x038fc792, 0x0022e85d}}, Y: Field{[10]uint32{0x023e3854, 0x031ebd8f, 0x00c53f48, 0x03a23d06, 0x0048ffeb, 0x025c1c9a, 0x01d7d435, 0x025962ce, 0x00ffa835, 0x0007cc7f}}}, + {X: Field{[10]uint32{0x00db9fc7, 0x03681b02, 0x0294be7a, 0x00aeea2d, 0x02999a10, 0x02fe6042, 0x03ad055f, 0x029eef9a, 0x02147d1e, 0x0028e851}}, Y: Field{[10]uint32{0x006ac294, 0x01fab0e2, 0x03d57a69, 0x01ec69c9, 0x00b3bdb8, 0x014c7ff3, 0x00cd6eb3, 0x004a108f, 0x0331d432, 0x0032609d}}}, + {X: Field{[10]uint32{0x00af78f5, 0x03470bf8, 0x0328621a, 0x03d93637, 0x01f6ce1a, 0x00d9a0b1, 0x01671c44, 0x00d2ab20, 0x0047bd20, 0x0025882a}}, Y: Field{[10]uint32{0x01826e1c, 0x03855553, 0x01f0d099, 0x0017a256, 0x016168a2, 0x0055af37, 0x007e32f4, 0x037ffb2d, 0x0108a7e3, 0x0038731b}}}, + {X: Field{[10]uint32{0x0396016b, 0x03663881, 0x016eebc9, 0x01f16126, 0x0395b2c5, 0x012363ff, 0x00b6a52c, 0x01a9e4fc, 0x02a0aa7d, 0x00290361}}, Y: Field{[10]uint32{0x02351ea2, 0x03365402, 0x0087396e, 0x02d117d1, 0x00062911, 0x009585f6, 0x014c15cb, 0x0119b6b6, 0x00e2d453, 0x003b1535}}}, + {X: Field{[10]uint32{0x03484c80, 0x0241de6c, 0x02fbd5ed, 0x03a6e993, 0x037e5f40, 0x01d1661b, 0x0173b979, 0x009a295d, 0x01a6f60f, 0x001c7bcd}}, Y: Field{[10]uint32{0x038a1ba3, 0x0058ded3, 0x01669875, 0x00f2f91d, 0x0302f369, 0x03d69ab5, 0x037df7f6, 0x01642b15, 0x021e9ff3, 0x003aaffe}}}, + {X: Field{[10]uint32{0x00f68de2, 0x031db5e9, 0x0267486f, 0x02fbc40f, 0x005308ab, 0x017dc256, 0x01ffa52c, 0x028ecb92, 0x0008c742, 0x002ef469}}, Y: Field{[10]uint32{0x01246124, 0x002d86d7, 0x0079a2ac, 0x00201428, 0x01ee6e1e, 0x01cca116, 0x00fbe96c, 0x0384f86c, 0x03ec9d07, 0x00125072}}}, + {X: Field{[10]uint32{0x00ba9009, 0x03c7e7a1, 0x012ab433, 0x03fe5613, 0x03805d60, 0x00b226d7, 0x009c92ff, 0x01b7d4f8, 0x03389211, 0x0005a7af}}, Y: Field{[10]uint32{0x03c6228d, 0x000d6641, 0x02a08345, 0x01247a4c, 0x02c997d1, 0x03c77923, 0x01b5adeb, 0x01fb8560, 0x0116e766, 0x002453d5}}}, + {X: Field{[10]uint32{0x00666acc, 0x01d40b3e, 0x020c3977, 0x02781313, 0x01d71c8d, 0x02436391, 0x00115458, 0x031fefab, 0x02bc4c5e, 0x0023c55e}}, Y: Field{[10]uint32{0x03f25908, 0x00604e0f, 0x021bc635, 0x0026260b, 0x02014dc7, 0x000af28f, 0x019883e6, 0x02a7ee62, 0x02ba1e78, 0x0035055d}}}, + {X: Field{[10]uint32{0x00ec9a8d, 0x03632d6d, 0x0010091e, 0x024e53ee, 0x0284f71f, 0x026801b6, 0x00ebcd83, 0x009b7001, 0x00d5694b, 0x002334ce}}, Y: Field{[10]uint32{0x00002578, 0x03b34874, 0x03d952a6, 0x00d30809, 0x0303fd9d, 0x015192ac, 0x000eccf4, 0x0366e702, 0x0010dd88, 0x00100c63}}}, + {X: Field{[10]uint32{0x013272f2, 0x003b8f8a, 0x02e28cbf, 0x030a5224, 0x03a64748, 0x012b5d83, 0x036171af, 0x02e8a834, 0x022f7ba5, 0x0008391f}}, Y: Field{[10]uint32{0x03be00bd, 0x00549519, 0x020a771b, 0x03e1db1c, 0x03162dda, 0x02279099, 0x00520897, 0x02608570, 0x022056b8, 0x002e5ab4}}}, + {X: Field{[10]uint32{0x032bb880, 0x032d7997, 0x015793f3, 0x031bfefc, 0x02f9c31e, 0x03d0477b, 0x02942d11, 0x023e736d, 0x00a5a0d3, 0x00160bb6}}, Y: Field{[10]uint32{0x03ce8486, 0x03d1e580, 0x02352a4c, 0x0248d29b, 0x02948ea8, 0x012ebd2f, 0x00a8db56, 0x0274f7b1, 0x000e4f9d, 0x000524a3}}}, + {X: Field{[10]uint32{0x001896d6, 0x03ac6d18, 0x01e7b877, 0x022db47d, 0x03b0bcab, 0x023011ba, 0x03daf30b, 0x030474fd, 0x019a6e76, 0x003d29bd}}, Y: Field{[10]uint32{0x0070f0c5, 0x0229922c, 0x01abeedc, 0x010792f6, 0x01ccde46, 0x026c5239, 0x01a05d4a, 0x01055956, 0x02e9e5d8, 0x000b4e71}}}, + {X: Field{[10]uint32{0x00957b24, 0x00a6bdcc, 0x0252d2c3, 0x02e31d8e, 0x02fc8564, 0x01588fc1, 0x0266bf01, 0x033d71db, 0x00600f71, 0x000aa083}}, Y: Field{[10]uint32{0x03ff3ca2, 0x0249919d, 0x02d370fd, 0x01f6e655, 0x0236f77f, 0x01401e34, 0x009a1d72, 0x0256679b, 0x0303d742, 0x002ce301}}}, + {X: Field{[10]uint32{0x02e2799e, 0x00612281, 0x03872623, 0x00ef075f, 0x0133634d, 0x001de8ea, 0x01d48026, 0x02fd921c, 0x004e9fcc, 0x00230b67}}, Y: Field{[10]uint32{0x01351a7d, 0x0152162a, 0x02db8d59, 0x01dd8130, 0x03cf032d, 0x02026169, 0x009c534e, 0x02edb631, 0x036cae43, 0x002b5404}}}, + {X: Field{[10]uint32{0x00061ba9, 0x003466dd, 0x004906eb, 0x017eb7f1, 0x03db00d2, 0x00e49d64, 0x00b991e2, 0x02cfb434, 0x00530744, 0x002c63a4}}, Y: Field{[10]uint32{0x033877b6, 0x03faa4ac, 0x002a702f, 0x02e1108c, 0x0343a8aa, 0x02600d34, 0x01edd739, 0x02cb19dc, 0x0244c829, 0x00243d72}}}, + {X: Field{[10]uint32{0x00e835be, 0x01e37347, 0x00109330, 0x01f3d2b1, 0x01d12482, 0x0314efe8, 0x01d2f58c, 0x010d6e41, 0x0157b03d, 0x00033c74}}, Y: Field{[10]uint32{0x0271b459, 0x01b65672, 0x031ab119, 0x037d87ba, 0x003ea656, 0x01147359, 0x0303cf21, 0x031f5a83, 0x01a15547, 0x003b8dea}}}, + {X: Field{[10]uint32{0x014a6007, 0x0358fdf9, 0x004c1562, 0x0347c8be, 0x0192fc13, 0x01bd2f39, 0x021ac36a, 0x02103ecb, 0x018ad91a, 0x002362e7}}, Y: Field{[10]uint32{0x03842dba, 0x006d1ac2, 0x02ee1ce6, 0x03851f39, 0x01ee9227, 0x00e6af7b, 0x020ec3b4, 0x023cb76b, 0x024393ca, 0x00254a2f}}}, + {X: Field{[10]uint32{0x0087fc9d, 0x006d18ff, 0x0106f256, 0x02387569, 0x037ae04a, 0x00366932, 0x02c936fb, 0x02c355c5, 0x0144bbc5, 0x001812d5}}, Y: Field{[10]uint32{0x016ac8eb, 0x00649528, 0x01d8a3e3, 0x01bc41a8, 0x03ee3cde, 0x034f67b6, 0x001e5fe7, 0x029b9d07, 0x039c4fb9, 0x000cff8b}}}, + {X: Field{[10]uint32{0x03aed8f6, 0x030245be, 0x03e5309e, 0x0191e567, 0x02cbd16d, 0x02785328, 0x017aab74, 0x03b91181, 0x00141058, 0x000f9fb5}}, Y: Field{[10]uint32{0x012e79fc, 0x00915a25, 0x006481ba, 0x01860bc6, 0x01f66bd3, 0x00280574, 0x01aa6971, 0x031b8324, 0x024186de, 0x003f056c}}}, + {X: Field{[10]uint32{0x0143f326, 0x034149de, 0x00f26736, 0x01a531a7, 0x0126e46f, 0x01b3d0b0, 0x01242431, 0x01ee2b25, 0x003586c1, 0x00342b9d}}, Y: Field{[10]uint32{0x034e0757, 0x007386fd, 0x0304b197, 0x00fa2ed7, 0x00fbaca0, 0x02fdada7, 0x0398865a, 0x01622b50, 0x01e8b983, 0x002fe80b}}}, + {X: Field{[10]uint32{0x00be1441, 0x0147ae62, 0x0197f5f8, 0x01967781, 0x023627bc, 0x014e02b7, 0x02ce2f94, 0x010f8df9, 0x01ced4f3, 0x003bd701}}, Y: Field{[10]uint32{0x00103281, 0x0031865d, 0x036350d6, 0x030ab527, 0x01b681e7, 0x012ba388, 0x010e40b7, 0x03c678ef, 0x001b0379, 0x0036499f}}}, + {X: Field{[10]uint32{0x008f49ae, 0x01921917, 0x038ca8dc, 0x01971efc, 0x03d7cf42, 0x02c2766b, 0x033015c3, 0x022b65f1, 0x03ebd799, 0x0005dae3}}, Y: Field{[10]uint32{0x0122f1b4, 0x0086fce1, 0x034c5fc8, 0x017a8053, 0x017f989f, 0x019db1e0, 0x00da1905, 0x03268da7, 0x024c8267, 0x002d2f2f}}}, + {X: Field{[10]uint32{0x0116c3dd, 0x00e9d9af, 0x03a0097b, 0x0374d50b, 0x03b20771, 0x02db698b, 0x0358d69f, 0x03053bae, 0x03db0cff, 0x00223da0}}, Y: Field{[10]uint32{0x011cb601, 0x03fdc607, 0x02219f52, 0x025aca5c, 0x020cf800, 0x0094add3, 0x02797ca0, 0x000f1499, 0x03de8121, 0x0002efbc}}}, + {X: Field{[10]uint32{0x0237abaa, 0x03f88e3d, 0x00854dd1, 0x0208c7ee, 0x018488b0, 0x00f59e24, 0x00c4121c, 0x03b113f6, 0x038f1247, 0x00299750}}, Y: Field{[10]uint32{0x023f36a3, 0x012a0be6, 0x00986d4d, 0x0257743f, 0x034bb500, 0x0131dc6b, 0x01cf3c0b, 0x010cff7f, 0x004e551e, 0x0017d972}}}, + {X: Field{[10]uint32{0x0398cc27, 0x0169a818, 0x03d2ff6a, 0x02e40a20, 0x02d5cdda, 0x03c565f1, 0x0208148a, 0x022edfdf, 0x0251c502, 0x002f5a9f}}, Y: Field{[10]uint32{0x0059d885, 0x02dc3d9e, 0x02f662dd, 0x01369dbb, 0x030c1ed1, 0x026a63a4, 0x0397979b, 0x03748ba2, 0x00c4247c, 0x000fc8a0}}}, + {X: Field{[10]uint32{0x009d274b, 0x00468264, 0x02202344, 0x02b1d34d, 0x0158f7a3, 0x01440514, 0x031814ec, 0x02837152, 0x036c2896, 0x00299c90}}, Y: Field{[10]uint32{0x03c2ec3f, 0x03f3b3af, 0x02654a7a, 0x02765590, 0x02c81f3d, 0x02b6b795, 0x02acea6b, 0x01e3656e, 0x02934681, 0x0037ba00}}}, + {X: Field{[10]uint32{0x003a24b0, 0x0380de7c, 0x004bc8d9, 0x02a4c844, 0x0257891b, 0x01f4b6a9, 0x01b0993d, 0x03433c6b, 0x01fed3a1, 0x003283d5}}, Y: Field{[10]uint32{0x023cfa6f, 0x010f9bd6, 0x0399db58, 0x020e59c4, 0x03520166, 0x02f2a363, 0x0188baae, 0x00b73645, 0x00e46346, 0x0037006e}}}, + {X: Field{[10]uint32{0x036429a1, 0x03c2d712, 0x034ccb91, 0x029fa831, 0x02211843, 0x02cbf881, 0x004961cc, 0x00087815, 0x008d9bff, 0x001843fc}}, Y: Field{[10]uint32{0x01d46b28, 0x01d82fb4, 0x020dd9b0, 0x00d8d7c5, 0x02d889bc, 0x03f34f84, 0x03daee68, 0x017e9f6a, 0x018aee96, 0x0012f8ec}}}, + {X: Field{[10]uint32{0x01ff42ae, 0x03318e2a, 0x0162238f, 0x032588b7, 0x026b695d, 0x037e3c28, 0x00f006cd, 0x03b32de3, 0x0215a70a, 0x000b5be0}}, Y: Field{[10]uint32{0x01a3927b, 0x011521e5, 0x010fd3ff, 0x005491b1, 0x037a9887, 0x03543ccd, 0x01e4e5be, 0x0325a798, 0x0164e2a3, 0x0000ff02}}}, + {X: Field{[10]uint32{0x00a1bbbb, 0x00318c22, 0x004ea70b, 0x009a90bf, 0x02998468, 0x0386826b, 0x010b132d, 0x00e716d8, 0x01b4868e, 0x002303a6}}, Y: Field{[10]uint32{0x001cfe52, 0x01314d85, 0x01a95c38, 0x00b821e1, 0x036ead99, 0x0186e305, 0x036a41de, 0x01032ca1, 0x0242f0a2, 0x000cae32}}}, + {X: Field{[10]uint32{0x03c96ed7, 0x0327ac23, 0x007e4dba, 0x007596be, 0x03658c6d, 0x013bdb5d, 0x0062af77, 0x02b9d78c, 0x028f9000, 0x00054a2e}}, Y: Field{[10]uint32{0x013b5651, 0x03b29914, 0x0253a5fa, 0x03571cc6, 0x012d39f0, 0x01d4ea2f, 0x00e64665, 0x01af3475, 0x038d54df, 0x002a3749}}}, + {X: Field{[10]uint32{0x03f1d7a4, 0x027bde9b, 0x037d2fa0, 0x02feb16b, 0x00104394, 0x02545616, 0x03a040e2, 0x01a9ebc4, 0x02a5d925, 0x0030519b}}, Y: Field{[10]uint32{0x01be5128, 0x0115ec9d, 0x00a7bc05, 0x02db8414, 0x00d8bab3, 0x01800f7c, 0x0284b540, 0x0361e7c1, 0x02c6fb36, 0x0032adbf}}}, + {X: Field{[10]uint32{0x03e98cb4, 0x004604b4, 0x02b56c6f, 0x02ea1e9d, 0x022ea946, 0x03e430fc, 0x0297a87c, 0x002274a8, 0x0093e051, 0x0033a2ec}}, Y: Field{[10]uint32{0x003a0470, 0x014ba578, 0x028884c2, 0x02b642c3, 0x00679cbc, 0x0344eeab, 0x03f556fb, 0x0213f9b7, 0x0251b906, 0x002a36ee}}}, + {X: Field{[10]uint32{0x02d6c86d, 0x01960b81, 0x016ea918, 0x018e85ea, 0x027c4267, 0x0024aa53, 0x030ddd9b, 0x02785634, 0x02737c9d, 0x0001dbce}}, Y: Field{[10]uint32{0x01d16c8a, 0x00a808b9, 0x00443b20, 0x00081f90, 0x01b29c53, 0x01b38fc1, 0x00ad27ec, 0x0179b1de, 0x007c4f34, 0x0016c728}}}, + {X: Field{[10]uint32{0x0274017f, 0x015cb542, 0x001adee1, 0x03fabdda, 0x032ed997, 0x0375f50e, 0x03988725, 0x002c84ee, 0x03c32339, 0x003dd5f7}}, Y: Field{[10]uint32{0x01b83cf8, 0x034912e9, 0x016be461, 0x019f2869, 0x0374ec4f, 0x023ace55, 0x00b63d98, 0x025c99c0, 0x00ea6787, 0x00342d39}}}, + {X: Field{[10]uint32{0x02d5f5d0, 0x00aa1ee7, 0x0065c149, 0x01a43647, 0x03f27a57, 0x036f8f19, 0x000ec6d3, 0x02bbf7c2, 0x0198a2de, 0x00166fd8}}, Y: Field{[10]uint32{0x0010f8b2, 0x00f5c3e1, 0x029b3a2f, 0x03b58054, 0x016e02f2, 0x03519e15, 0x010834c4, 0x028a08c4, 0x03399011, 0x002fd7ad}}}, + {X: Field{[10]uint32{0x0149ba16, 0x02020b81, 0x0052d53f, 0x0173c4b3, 0x02a7b0e8, 0x02463056, 0x02857900, 0x021d5d21, 0x030ac86d, 0x002c740b}}, Y: Field{[10]uint32{0x031a19d0, 0x00dff095, 0x0106b854, 0x00965b4f, 0x03972977, 0x00fce14a, 0x000878d6, 0x01adda2a, 0x02039992, 0x0001e497}}}, + {X: Field{[10]uint32{0x001d1905, 0x0393900e, 0x02908882, 0x03bc53ce, 0x027e5267, 0x01f10610, 0x03d2ec12, 0x0381f406, 0x032f41d8, 0x003349cd}}, Y: Field{[10]uint32{0x01c77297, 0x02bc3257, 0x003522ac, 0x005d4826, 0x02c33296, 0x01045a4e, 0x03810f3b, 0x027ccf33, 0x0203661b, 0x003338db}}}, + {X: Field{[10]uint32{0x019d3ace, 0x036d26f7, 0x01695b01, 0x033eef20, 0x03ad2258, 0x032eaad3, 0x028940f5, 0x00d664ed, 0x00fc26ca, 0x00044991}}, Y: Field{[10]uint32{0x01c0bf60, 0x01341245, 0x01b904e7, 0x00acefa7, 0x037ff136, 0x03b7c274, 0x03a49b3b, 0x02e57cbd, 0x03907b5a, 0x0021a17d}}}, + {X: Field{[10]uint32{0x0197d3ce, 0x001b8b03, 0x018bb3a6, 0x03abae12, 0x0192fb51, 0x00d68936, 0x02845759, 0x01285883, 0x032a99ce, 0x0024637d}}, Y: Field{[10]uint32{0x038a8461, 0x0333faee, 0x03065602, 0x00609d26, 0x01bb6b79, 0x0241e533, 0x038b0d3c, 0x03fe63c6, 0x01ec9ebb, 0x00222cce}}}, + {X: Field{[10]uint32{0x00dcb83b, 0x02b3eaff, 0x01af2a7d, 0x0093cd28, 0x00436e64, 0x035229dc, 0x0025b510, 0x03ff2025, 0x00f265c4, 0x0026e3c6}}, Y: Field{[10]uint32{0x0185ba55, 0x0152a6b5, 0x012475e4, 0x03e4fd8f, 0x01476c4a, 0x0318a04e, 0x02e8c78f, 0x0306e4b0, 0x01e86a34, 0x0002fee5}}}, + {X: Field{[10]uint32{0x0024ce30, 0x031e3fef, 0x0340c9b9, 0x002b62cc, 0x00382174, 0x03a87639, 0x02be52a1, 0x0189a90a, 0x032ac396, 0x0002b40b}}, Y: Field{[10]uint32{0x022885fb, 0x030b41c6, 0x01b13255, 0x03978953, 0x03ad8c97, 0x02deede9, 0x0027cfe1, 0x01e1cbfe, 0x00e6cf8a, 0x003f31ce}}}, + {X: Field{[10]uint32{0x026d85a3, 0x03ee6b76, 0x0076c84b, 0x00a23d51, 0x029b5c19, 0x016b3c49, 0x02e34f3f, 0x036b2423, 0x03bd5e60, 0x0000d66b}}, Y: Field{[10]uint32{0x03088955, 0x0055e7ec, 0x030f6b50, 0x00da8608, 0x03443586, 0x024cb385, 0x02721553, 0x03fb59c4, 0x01e79cd3, 0x000b8aa8}}}, + {X: Field{[10]uint32{0x00b279de, 0x0024459a, 0x033ca55e, 0x03008187, 0x030c3c15, 0x0335b1e3, 0x00c34a31, 0x00bc7384, 0x023e230f, 0x00158e6a}}, Y: Field{[10]uint32{0x0111bef1, 0x01b0bb2d, 0x0309c8ed, 0x006c1189, 0x02e3a7d5, 0x02a7a0f8, 0x023bc263, 0x01fc2cfe, 0x015c15de, 0x00382dba}}}, + {X: Field{[10]uint32{0x0269ec44, 0x015d94b5, 0x00e4ad86, 0x01b2b50b, 0x03693d3b, 0x0097bf0a, 0x00ef3d0c, 0x02567617, 0x03cc7b2f, 0x000c273f}}, Y: Field{[10]uint32{0x0150077d, 0x02596dea, 0x0274bcf7, 0x0299e664, 0x0232f949, 0x01487548, 0x00095205, 0x02c6f9e6, 0x022fd917, 0x0000eaed}}}, + {X: Field{[10]uint32{0x033b86b2, 0x006bdb94, 0x033cace9, 0x01a922af, 0x00534a02, 0x01d7244c, 0x018eab63, 0x035f0017, 0x01d2dac1, 0x00147cf5}}, Y: Field{[10]uint32{0x03e99f74, 0x0262a3e8, 0x0235aba9, 0x00aab410, 0x0234f9cf, 0x02816f76, 0x03fbfe0c, 0x0123b67c, 0x027f4bdc, 0x000142c7}}}, + {X: Field{[10]uint32{0x01c2a244, 0x03897b8a, 0x00e1fa3f, 0x03d22cf9, 0x034158b0, 0x014074c9, 0x000e0c6f, 0x01040115, 0x011833aa, 0x0023d58f}}, Y: Field{[10]uint32{0x03432193, 0x01d64a19, 0x03589028, 0x024f0600, 0x033d031d, 0x0004a263, 0x035248da, 0x00cdc55f, 0x01d85ea9, 0x0013531c}}}, + {X: Field{[10]uint32{0x037177a9, 0x031cb229, 0x01108ee7, 0x0303b867, 0x003c4853, 0x02c25ab0, 0x0045b39f, 0x036ae72f, 0x0109d68f, 0x000db28a}}, Y: Field{[10]uint32{0x024301b0, 0x00588234, 0x02ed6905, 0x018cc384, 0x0269cbf3, 0x00519e97, 0x033d0953, 0x00a58217, 0x01dfc825, 0x00193d44}}}, + {X: Field{[10]uint32{0x02a306e0, 0x00d1c0a3, 0x00cf3807, 0x023ad35c, 0x0358dd91, 0x036c9bc3, 0x001ca9c2, 0x03f5f308, 0x00d51f3f, 0x003d8a2e}}, Y: Field{[10]uint32{0x00adc2e8, 0x00d82ef6, 0x01c1ea2d, 0x01f798ca, 0x03b7c2d7, 0x03d55f7b, 0x00d6eb27, 0x00ba6cba, 0x00e30ea8, 0x0002f5af}}}, + {X: Field{[10]uint32{0x00e67c1b, 0x010454b0, 0x02f2586e, 0x035d8400, 0x00b44fa7, 0x0340d435, 0x026922c9, 0x00b02eca, 0x03f500a8, 0x003ede9a}}, Y: Field{[10]uint32{0x02702da1, 0x017af252, 0x02cfb034, 0x00cc8e86, 0x018419fc, 0x03fa3cfa, 0x01f1406e, 0x031c0c00, 0x0037f1c9, 0x00304a87}}}, + {X: Field{[10]uint32{0x0278d092, 0x0247ef3f, 0x03033753, 0x00769696, 0x01bf8ec0, 0x0003231d, 0x014080f4, 0x00abcb7c, 0x01195c3e, 0x00308246}}, Y: Field{[10]uint32{0x031adeb9, 0x01ad8c83, 0x01e6c382, 0x0063a203, 0x037aec38, 0x02d9b0c9, 0x007b1fa3, 0x036acfbe, 0x016fcbeb, 0x002cc1ed}}}, + {X: Field{[10]uint32{0x013192d1, 0x02ff8a2f, 0x0003e8d1, 0x03e3466f, 0x0073c3be, 0x00ddd292, 0x02d7c4c9, 0x009fea81, 0x03893d17, 0x001d89f7}}, Y: Field{[10]uint32{0x028451e1, 0x01c9ac6d, 0x026f4bcf, 0x033fdb4d, 0x021326da, 0x001ddb14, 0x029a865f, 0x0157dea8, 0x036c36f4, 0x000d7499}}}, + {X: Field{[10]uint32{0x002c62b9, 0x012ca580, 0x01639ed5, 0x01cf2c16, 0x01a3df6f, 0x036ff80d, 0x025df658, 0x00cea5b4, 0x01187c9f, 0x00099999}}, Y: Field{[10]uint32{0x0286630d, 0x00096931, 0x037ba468, 0x02bbd2a5, 0x02c4e7fc, 0x00d5aa1d, 0x01fe7578, 0x01789a94, 0x03c7d34a, 0x002ecc2e}}}, + {X: Field{[10]uint32{0x022ac683, 0x02fce931, 0x037bbc7a, 0x017dcd60, 0x01ef8b12, 0x03ca9bdc, 0x006a02e8, 0x000b9df7, 0x0185fa98, 0x000ef6a4}}, Y: Field{[10]uint32{0x00a05b85, 0x00b95300, 0x02118936, 0x0172ec32, 0x0222b347, 0x002b8e1d, 0x0075a76a, 0x005e135e, 0x032bc11d, 0x00080bb7}}}, + {X: Field{[10]uint32{0x003a5c4d, 0x00cf5ae6, 0x00097bc0, 0x022dfd49, 0x023be197, 0x0215c348, 0x0313c714, 0x02d93604, 0x00de4486, 0x000be42f}}, Y: Field{[10]uint32{0x00384f89, 0x03f69c6f, 0x01705270, 0x027b3d5e, 0x01f4aa75, 0x0332a677, 0x01b2e300, 0x0351d4d9, 0x02502028, 0x0018e193}}}, + {X: Field{[10]uint32{0x00becda7, 0x02f3ef32, 0x01cb6562, 0x0309b1c7, 0x017083ed, 0x0327f35c, 0x0192e654, 0x0039bf72, 0x01d4e9b0, 0x002224fd}}, Y: Field{[10]uint32{0x0238ab50, 0x00c4ed2c, 0x003130fe, 0x0275b36e, 0x02a80fa2, 0x03831a65, 0x03566a1f, 0x0041d3ef, 0x00558e63, 0x0007ebcc}}}, + {X: Field{[10]uint32{0x0155abba, 0x030d2561, 0x0237d855, 0x0094c273, 0x00f482fc, 0x0369cd44, 0x024fac54, 0x01778fb6, 0x02e686be, 0x002b3f12}}, Y: Field{[10]uint32{0x02c52d87, 0x01c5a14a, 0x0037cb90, 0x01f3e6f4, 0x0176423f, 0x03b0a47f, 0x03a5b998, 0x0229ab4d, 0x0197d187, 0x000e1fd1}}}, + {X: Field{[10]uint32{0x0017a469, 0x00a95788, 0x020d9542, 0x039f5d19, 0x01d5fe35, 0x00a2948a, 0x03a892dd, 0x03a620bc, 0x0090a4c5, 0x000ab134}}, Y: Field{[10]uint32{0x03086c09, 0x03095c77, 0x01914a3b, 0x00afdd68, 0x01927d17, 0x03639a1a, 0x0279f2d7, 0x03b1151e, 0x01162aa3, 0x0018163d}}}, + {X: Field{[10]uint32{0x02badef6, 0x03d6139f, 0x0024e9c9, 0x03b09430, 0x02c9b1a3, 0x004f1f98, 0x03c235cd, 0x0315cb96, 0x013ffc13, 0x00004dfb}}, Y: Field{[10]uint32{0x02c6fdba, 0x0214daa3, 0x00bf54fb, 0x030bcdeb, 0x010319e7, 0x0321d63c, 0x003ff023, 0x013d442d, 0x01cc3a46, 0x000307a5}}}, + {X: Field{[10]uint32{0x033ecfe4, 0x013615fb, 0x02002cfe, 0x03dd63c2, 0x006cfb16, 0x00454ae5, 0x009f6068, 0x0228f4b2, 0x037a7214, 0x0000a280}}, Y: Field{[10]uint32{0x03973d10, 0x02ce613e, 0x03aa8a1b, 0x0093ea40, 0x02ec5951, 0x031b9e8e, 0x03788cf5, 0x037a6e34, 0x0250135c, 0x002cbd2d}}}, + {X: Field{[10]uint32{0x027a9eeb, 0x02b773c6, 0x000ae3bb, 0x016d7cd3, 0x0378ad6d, 0x01d869db, 0x01d426e8, 0x00cfef3a, 0x01518fd4, 0x000c0fb3}}, Y: Field{[10]uint32{0x01abb602, 0x0158ce66, 0x01385ea9, 0x00fa2761, 0x02cbd8dc, 0x009d72c6, 0x03a5945a, 0x02c67a59, 0x02443b73, 0x001a9ff2}}}, + {X: Field{[10]uint32{0x01533202, 0x008ce054, 0x0140a509, 0x01e7e2cc, 0x02c69cf0, 0x03595a6e, 0x001defd9, 0x03dc7099, 0x002e5680, 0x0033d8c1}}, Y: Field{[10]uint32{0x00eb4ee8, 0x03cd007b, 0x009b6b8f, 0x00ebd437, 0x00017664, 0x0386a90a, 0x01a20525, 0x03f715c6, 0x036dfb17, 0x000e7ccd}}}, + {X: Field{[10]uint32{0x031fe4b7, 0x01216a86, 0x0168c44f, 0x02a38b76, 0x0334a229, 0x0395b124, 0x0123b6f2, 0x027eda5a, 0x03efb4a4, 0x0033ebee}}, Y: Field{[10]uint32{0x029f9007, 0x034971b1, 0x02a160b5, 0x0260063e, 0x01f39506, 0x0075dbdc, 0x03afbc70, 0x005f8777, 0x034d4a9c, 0x003703b4}}}, + {X: Field{[10]uint32{0x010d363e, 0x034bcc4e, 0x0153d785, 0x01da6822, 0x004a7ffd, 0x00f1aa90, 0x0093ff7b, 0x009fa9a9, 0x01e10fd5, 0x003b038f}}, Y: Field{[10]uint32{0x027a35dd, 0x030a17e3, 0x03528fc5, 0x0303fcd4, 0x01723129, 0x005fd4f3, 0x02f3c6a7, 0x00d30420, 0x03ce3002, 0x00252f76}}}, + {X: Field{[10]uint32{0x032bcde0, 0x038a9012, 0x02f7f84b, 0x0213bac0, 0x0113e9cd, 0x000645af, 0x039c0c35, 0x008b3f52, 0x00d19144, 0x003c1f4f}}, Y: Field{[10]uint32{0x01637320, 0x007ddece, 0x018103aa, 0x001a2b8b, 0x01dfe912, 0x01b47dc1, 0x0048de51, 0x00c860df, 0x02facb39, 0x0033c325}}}, + {X: Field{[10]uint32{0x0248db10, 0x01c267cd, 0x003e2821, 0x01f799d9, 0x038a6fab, 0x00031e98, 0x0264ac0a, 0x00813a8c, 0x00b66f2e, 0x00129095}}, Y: Field{[10]uint32{0x02e5023a, 0x02acaf0b, 0x0157ac26, 0x0022eb2c, 0x01b187ab, 0x017df7e5, 0x03ef9891, 0x03f0d7be, 0x0229be93, 0x002d5443}}}, + {X: Field{[10]uint32{0x007774a8, 0x0204fa3a, 0x001d9b5d, 0x02c0e017, 0x01910285, 0x03d9c651, 0x02625829, 0x02bc74d7, 0x03cfb38e, 0x00015bce}}, Y: Field{[10]uint32{0x01ed9dc6, 0x029e9d74, 0x026bac57, 0x01c219df, 0x038a1e82, 0x0051fddc, 0x03f3e5ca, 0x01fe6a6a, 0x00e79e6b, 0x002a6e59}}}, + {X: Field{[10]uint32{0x03081295, 0x01586f9a, 0x03561ace, 0x021947f9, 0x01af6b98, 0x03aa9327, 0x02d95bff, 0x00bbf030, 0x034e07d3, 0x003e2763}}, Y: Field{[10]uint32{0x01bacc69, 0x03b1c663, 0x030d1449, 0x0145235d, 0x0075e48f, 0x01c61a65, 0x02656911, 0x00e19d8e, 0x031156a3, 0x003298cb}}}, + {X: Field{[10]uint32{0x03c5530b, 0x03948149, 0x02af9758, 0x00cf1b66, 0x032890b9, 0x007c3a4a, 0x02e4a075, 0x005bad42, 0x01a0d3e7, 0x00170de4}}, Y: Field{[10]uint32{0x03b34616, 0x03e2eae9, 0x021c3ca1, 0x0070cdab, 0x02c4ed86, 0x0244d24e, 0x01e30dae, 0x00b4445e, 0x03c62de5, 0x00113bc4}}}, + {X: Field{[10]uint32{0x03a38d27, 0x02804caa, 0x0233115f, 0x03c34e8f, 0x038ab94e, 0x01b3bab6, 0x00d71561, 0x0292b98b, 0x025ae6ba, 0x0009d21d}}, Y: Field{[10]uint32{0x03f69e48, 0x013c7c9d, 0x033590cd, 0x00cea4ec, 0x020f36b3, 0x031eba4a, 0x0105bbe6, 0x01dc3582, 0x019dde63, 0x001c7534}}}, + {X: Field{[10]uint32{0x0327e254, 0x00d8efae, 0x0145322e, 0x028116a5, 0x000d2c41, 0x01fb8f9e, 0x00e4ee18, 0x035de00b, 0x03a2f8ec, 0x002593c7}}, Y: Field{[10]uint32{0x00138a2e, 0x01598435, 0x022e6775, 0x0000ee60, 0x015137ae, 0x00b33988, 0x0081a5fa, 0x02a20fa5, 0x03cade64, 0x0031d12e}}}, + {X: Field{[10]uint32{0x01b8ca3b, 0x0217895e, 0x02754589, 0x001d3df4, 0x03ee758a, 0x01b0de7f, 0x003594fe, 0x0327ea14, 0x03758709, 0x0022fd81}}, Y: Field{[10]uint32{0x03dd51a4, 0x03986221, 0x03715a5a, 0x03b9c629, 0x02ccc193, 0x02c46343, 0x011cfb8f, 0x0375cbfd, 0x0192b3fb, 0x000f98e2}}}, + {X: Field{[10]uint32{0x02e06612, 0x008e3740, 0x015f5a10, 0x03603b83, 0x00fbff70, 0x036fb9e6, 0x03c5a95d, 0x008e70af, 0x01239189, 0x003e841c}}, Y: Field{[10]uint32{0x0168e7f1, 0x01311a3e, 0x03936c62, 0x0384b5dc, 0x02315a6b, 0x00757b07, 0x0133ea97, 0x02c29664, 0x015e1a4e, 0x00029833}}}, + {X: Field{[10]uint32{0x00975588, 0x00d39451, 0x0059383c, 0x00f2a251, 0x033fe250, 0x01e5f2e2, 0x03d145ef, 0x025ffb00, 0x02d09f6f, 0x0016d231}}, Y: Field{[10]uint32{0x006e30a0, 0x00428ea4, 0x03d83c64, 0x0114a01d, 0x02173d6c, 0x02597c4d, 0x0291762d, 0x0046f304, 0x02893526, 0x00113619}}}, + {X: Field{[10]uint32{0x02b94fd0, 0x03c6f2bb, 0x025b1ae8, 0x013552f2, 0x005d4e85, 0x0397a232, 0x025d1ea1, 0x01f8fca1, 0x03e823aa, 0x00203854}}, Y: Field{[10]uint32{0x006b9728, 0x01eb2ea8, 0x023f73ed, 0x00b01c60, 0x03c888a1, 0x03d3d904, 0x03a92d8e, 0x03046c04, 0x0229e435, 0x003b74ff}}}, + {X: Field{[10]uint32{0x01ccf2c4, 0x03b5b41e, 0x03e3dae7, 0x027c1ec7, 0x03cd25de, 0x0131b8a6, 0x0190dd15, 0x01d49b09, 0x01d977bf, 0x0005b889}}, Y: Field{[10]uint32{0x01710768, 0x00622b02, 0x0274dd85, 0x014b83e8, 0x0340088c, 0x033708ad, 0x02db82af, 0x01d551b4, 0x0123b9b5, 0x00381c0b}}}, + {X: Field{[10]uint32{0x01456938, 0x0247bf36, 0x013ce7a6, 0x028b78d6, 0x03bb064a, 0x02097af2, 0x021b65e7, 0x01b1d208, 0x020915a1, 0x0028d102}}, Y: Field{[10]uint32{0x00dbf40c, 0x01c24135, 0x0226bbe9, 0x00f79f0f, 0x0326fa5d, 0x03d0de99, 0x001323a7, 0x00aa3d59, 0x02a03a58, 0x003fdf1e}}}, + {X: Field{[10]uint32{0x01aa2b5f, 0x00c3a7b3, 0x037c80a0, 0x000e4fac, 0x018d6072, 0x00b564e1, 0x0320401f, 0x0111a008, 0x034cd116, 0x0020550c}}, Y: Field{[10]uint32{0x033d5142, 0x004e7196, 0x03d54150, 0x0361f55c, 0x0017126a, 0x02824522, 0x030676f4, 0x03939ec3, 0x014e5f97, 0x002ee902}}}, + {X: Field{[10]uint32{0x014d93c7, 0x039a96df, 0x01efa329, 0x0184f86d, 0x02fe7f23, 0x0138265d, 0x0092b257, 0x02eb28e8, 0x00ca27b5, 0x003244d2}}, Y: Field{[10]uint32{0x0176b44a, 0x0079cf16, 0x036399d6, 0x02550257, 0x01e7c372, 0x0006fed6, 0x020e62dc, 0x0268b141, 0x010de9d4, 0x00338907}}}, + {X: Field{[10]uint32{0x026e8a88, 0x0096435f, 0x024363ba, 0x0101cdf9, 0x01cf3629, 0x0272a592, 0x0235e995, 0x02b5319d, 0x01a879fe, 0x0025022d}}, Y: Field{[10]uint32{0x03994fc0, 0x005d915f, 0x00fdfcbf, 0x034a12e0, 0x00e02155, 0x007d1825, 0x02858d52, 0x004306fc, 0x010a26c7, 0x003842d0}}}, + {X: Field{[10]uint32{0x02bdd2ce, 0x00f9f975, 0x01b92e7d, 0x02436408, 0x02f80ddf, 0x02160aab, 0x020a159f, 0x0122e1e7, 0x0158eefe, 0x002e1474}}, Y: Field{[10]uint32{0x02d85469, 0x02f6a8b1, 0x0293f06a, 0x036394dd, 0x0060facf, 0x0271f560, 0x00c53f06, 0x00908707, 0x02e10079, 0x000a42b8}}}, + {X: Field{[10]uint32{0x013d10fc, 0x01c79ab9, 0x005eb1b9, 0x02e15368, 0x0387e7a5, 0x0394d824, 0x00053875, 0x00801d96, 0x034d4a7c, 0x00274c82}}, Y: Field{[10]uint32{0x01d7c456, 0x000fd1c9, 0x0306e796, 0x018729a0, 0x009b44be, 0x039e0ec3, 0x022acd0a, 0x006435a0, 0x037b6a1f, 0x0013dab2}}}, + {X: Field{[10]uint32{0x018ac7b5, 0x002a7a0d, 0x004c22f3, 0x0053401d, 0x01eaa491, 0x004e9362, 0x0386799d, 0x03b1953f, 0x00107b29, 0x001b5de6}}, Y: Field{[10]uint32{0x03823950, 0x028f9e76, 0x038804b0, 0x00d00ee8, 0x0177b2a3, 0x03899731, 0x0060a2ac, 0x013c26e8, 0x03cc105c, 0x0023de64}}}, + {X: Field{[10]uint32{0x017f6489, 0x02476a79, 0x0372d73c, 0x001cb209, 0x00680c96, 0x02015b4a, 0x017d62db, 0x013eda68, 0x02ce77e1, 0x002f6cb4}}, Y: Field{[10]uint32{0x03aa590d, 0x02790b96, 0x030c184c, 0x00000f0a, 0x0008a3bc, 0x029bd592, 0x038ecede, 0x00ec6773, 0x0371d43c, 0x0002707b}}}, + {X: Field{[10]uint32{0x0055b3fa, 0x03ff68fc, 0x02dea741, 0x02a34286, 0x001f7897, 0x01ceec16, 0x01b4787f, 0x002a5293, 0x00ff1ab7, 0x00126a33}}, Y: Field{[10]uint32{0x006ba426, 0x024a0a9b, 0x0243d8bd, 0x0053f5b7, 0x0115b419, 0x03814eb5, 0x02414ed6, 0x03af47b8, 0x02772049, 0x003ca634}}}, + {X: Field{[10]uint32{0x029d2236, 0x0285ce9d, 0x000d77f1, 0x014ad441, 0x013b3d56, 0x00c5e80b, 0x0267992d, 0x02dec158, 0x016eb466, 0x00328fdf}}, Y: Field{[10]uint32{0x02145c37, 0x036ec4a3, 0x021b7126, 0x02b7dbc6, 0x0090e538, 0x025a90b0, 0x00e6f2bf, 0x00e13bde, 0x02259dcf, 0x00289b58}}}, + {X: Field{[10]uint32{0x037176e4, 0x03a98c1c, 0x0065bc00, 0x02b699af, 0x01902e9c, 0x003422e6, 0x038469cb, 0x009f46d1, 0x0214f1c4, 0x002d9cb3}}, Y: Field{[10]uint32{0x00865efa, 0x022fdd9a, 0x03eddb81, 0x0142e312, 0x0083f4f5, 0x00f1695b, 0x020f1aff, 0x0145d89e, 0x01790001, 0x0005db02}}}, + {X: Field{[10]uint32{0x029c199b, 0x03244ebb, 0x0168bda3, 0x01e23cba, 0x022c26dd, 0x010dde2a, 0x01b6866f, 0x01886f5b, 0x0357d4ad, 0x002f72ea}}, Y: Field{[10]uint32{0x00df5603, 0x01548ca2, 0x03c11240, 0x003ba4f1, 0x021cee9f, 0x03585a36, 0x0075a338, 0x004ff5f7, 0x00729bb2, 0x001e61a2}}}, + {X: Field{[10]uint32{0x01fbf9f5, 0x00e12c95, 0x001961cb, 0x03420b60, 0x020d5bee, 0x0317d08f, 0x0064aa96, 0x01f7d5d3, 0x031e382f, 0x003d7c97}}, Y: Field{[10]uint32{0x02210221, 0x0277febc, 0x0324c98a, 0x01a03849, 0x00f54bc0, 0x02942934, 0x0393a829, 0x012ab960, 0x030b5ad8, 0x003a8e23}}}, + {X: Field{[10]uint32{0x02ae09c3, 0x002e2505, 0x0250aa73, 0x01261689, 0x03603720, 0x009d1f10, 0x026e280b, 0x02ae7872, 0x0064f9f8, 0x0034a841}}, Y: Field{[10]uint32{0x029c5962, 0x033da2c8, 0x01b454fd, 0x03aeacf0, 0x032c9ffa, 0x00b240ba, 0x00d8dcaf, 0x0194cc0a, 0x01ed8dc4, 0x003465c6}}}, + {X: Field{[10]uint32{0x00410038, 0x02068008, 0x0291cc5f, 0x00ffcffd, 0x0119058c, 0x03979aa9, 0x01221058, 0x01312f15, 0x02fee672, 0x00224956}}, Y: Field{[10]uint32{0x023fd7bd, 0x01f62bf6, 0x013e6914, 0x02d19c5c, 0x00c833c3, 0x03eead40, 0x0352ffb4, 0x0324d046, 0x02dd9560, 0x00023589}}}, + {X: Field{[10]uint32{0x016e3952, 0x004bef55, 0x03f94beb, 0x03c81b24, 0x015165e3, 0x01e06406, 0x027d73f5, 0x03bbb8a9, 0x0042c5ec, 0x001791a3}}, Y: Field{[10]uint32{0x00f240de, 0x01994163, 0x021edc38, 0x02d0e92b, 0x03ce1fde, 0x00c39003, 0x00b6a8c3, 0x025f8aae, 0x024a467f, 0x002be0f8}}}, + {X: Field{[10]uint32{0x019c4e2c, 0x021401fa, 0x0036d7fc, 0x023a4e14, 0x03552caf, 0x03d52ac0, 0x006850e8, 0x00662fd8, 0x03ac9eca, 0x001c30af}}, Y: Field{[10]uint32{0x02ea37b3, 0x03fadb35, 0x00591544, 0x010034b1, 0x023b45d9, 0x0033dd65, 0x00f99392, 0x02b95e2a, 0x0365f5ff, 0x00180c88}}}, + {X: Field{[10]uint32{0x01c2f318, 0x0107032e, 0x001eeab6, 0x006993a4, 0x03bbb0db, 0x031e58c3, 0x000f86d7, 0x01ad0814, 0x013afe5f, 0x0005850f}}, Y: Field{[10]uint32{0x036a8a94, 0x022c91f5, 0x01e68ecb, 0x009132b4, 0x039fd749, 0x0134734d, 0x0109561d, 0x02075e04, 0x00140bdf, 0x001c1e3a}}}, + {X: Field{[10]uint32{0x02b62bce, 0x01ba5985, 0x03ed029f, 0x02ddce82, 0x03e1326e, 0x003fd82a, 0x025b0346, 0x0059136c, 0x02ada934, 0x0022b0cf}}, Y: Field{[10]uint32{0x00945cc6, 0x0276ff46, 0x0005dc6d, 0x013f6918, 0x00ea9e61, 0x0266f694, 0x0055d0ed, 0x0062d2f4, 0x03566f0d, 0x0001b41d}}}, + {X: Field{[10]uint32{0x0166e22a, 0x02a78189, 0x03ce771e, 0x0096843e, 0x0270cb33, 0x038323ad, 0x01f01166, 0x03abf7bd, 0x00b89e7f, 0x0011dae6}}, Y: Field{[10]uint32{0x02a91050, 0x01743875, 0x03f4730c, 0x0176e03e, 0x00fd98bd, 0x0004bc88, 0x0138483c, 0x00ae19f8, 0x00418325, 0x000e36fc}}}, + {X: Field{[10]uint32{0x01497f11, 0x03114fbb, 0x03058a19, 0x01fc64a5, 0x012e383a, 0x0086b7e8, 0x0302bcb3, 0x0270ef4c, 0x02eff0de, 0x00393498}}, Y: Field{[10]uint32{0x022781d3, 0x01f3def3, 0x0050bfec, 0x0039f008, 0x01953d0c, 0x03a92400, 0x02070c49, 0x0048323c, 0x00fc2fd6, 0x00287e0c}}}, + {X: Field{[10]uint32{0x00b5cbf8, 0x0303f3fc, 0x019871be, 0x01e5065b, 0x03e2e092, 0x027ccf99, 0x00c4f7cb, 0x02f86fc6, 0x010f48f0, 0x0019ef21}}, Y: Field{[10]uint32{0x0352d32f, 0x0373ae17, 0x03355526, 0x02f24b83, 0x01b7e6fa, 0x034bc833, 0x013e9271, 0x0292c91a, 0x0070334a, 0x00389581}}}, + {X: Field{[10]uint32{0x02ef2797, 0x0147849c, 0x02b8d58f, 0x029689c4, 0x02b543a6, 0x00aac9d3, 0x024be020, 0x01250895, 0x02c5c0dd, 0x0014372c}}, Y: Field{[10]uint32{0x02b04ea0, 0x0227e352, 0x03ca890d, 0x01a8bddf, 0x038d2ea1, 0x01c17732, 0x03854b49, 0x01132671, 0x036fb69c, 0x000b2f00}}}, + {X: Field{[10]uint32{0x0358bd6e, 0x029edda1, 0x0287644b, 0x013a2644, 0x01f86080, 0x0377d599, 0x00a57f1b, 0x0123d07a, 0x01777849, 0x001b26f1}}, Y: Field{[10]uint32{0x03b3ff20, 0x003fd13a, 0x00260cd4, 0x005724a0, 0x03a04019, 0x00892406, 0x029ca3d1, 0x02b211cc, 0x01f35998, 0x0021299c}}}, + {X: Field{[10]uint32{0x0382a868, 0x01f12520, 0x010e7a33, 0x011919ce, 0x0128b441, 0x0231bab4, 0x03ceb361, 0x036ee67c, 0x03c6d27c, 0x00176b24}}, Y: Field{[10]uint32{0x002df508, 0x0292fe0d, 0x02d8bac2, 0x02e38c57, 0x008a91c2, 0x025dc13e, 0x034578aa, 0x0020b9d0, 0x00651805, 0x002195c8}}}, + {X: Field{[10]uint32{0x01780c86, 0x00af9f21, 0x0196f2ed, 0x002ad1ae, 0x03f6b2a4, 0x00c1cf03, 0x02e9484d, 0x015f85e9, 0x03c65e1c, 0x00081e40}}, Y: Field{[10]uint32{0x03f6a442, 0x018cf051, 0x02c14854, 0x020c4569, 0x020bbdcb, 0x00f85e8e, 0x00fd3107, 0x01353db1, 0x00202956, 0x0012d5a1}}}, + {X: Field{[10]uint32{0x02dc2f90, 0x0118884b, 0x011dd295, 0x01320a44, 0x036ffbc9, 0x00a0a0c3, 0x03351132, 0x024fa4ea, 0x03639be5, 0x00368097}}, Y: Field{[10]uint32{0x016d2723, 0x0250e0e4, 0x02e68eb6, 0x02997bd2, 0x00714def, 0x006b3d72, 0x02dea9a2, 0x0395dbc3, 0x01eba315, 0x0026d2b3}}}, + {X: Field{[10]uint32{0x02823cb1, 0x002943ec, 0x02ea5603, 0x03d7b91f, 0x012a0f61, 0x021f3c64, 0x026ffa6b, 0x02272084, 0x02cd01b4, 0x000c9fea}}, Y: Field{[10]uint32{0x00c33b9b, 0x03e7b3ee, 0x037e96b7, 0x019d7f85, 0x0314c00c, 0x000f97e2, 0x00c5ac29, 0x00026c51, 0x03426010, 0x00018d2a}}}, + {X: Field{[10]uint32{0x037e8084, 0x0091561e, 0x010cc79a, 0x005fd6fd, 0x006c9cab, 0x02746ff6, 0x013478ba, 0x03d18aa1, 0x03ee1619, 0x001133fe}}, Y: Field{[10]uint32{0x008e7da4, 0x031c535d, 0x01f64563, 0x00703f8d, 0x0176442a, 0x0041e691, 0x02f8c288, 0x0278a1fa, 0x03db6207, 0x002c2260}}}, + {X: Field{[10]uint32{0x02a6fe3a, 0x0085c381, 0x0393a43a, 0x02141203, 0x03beb197, 0x00d3477a, 0x01ad6797, 0x00338b08, 0x01ca1373, 0x00317651}}, Y: Field{[10]uint32{0x023cc3fb, 0x01efc6eb, 0x02f0446e, 0x03ec328f, 0x0374102f, 0x0392a707, 0x03f72878, 0x01c503d9, 0x011b4d8b, 0x0028eab4}}}, + {X: Field{[10]uint32{0x02c0de31, 0x0290b873, 0x019e677f, 0x03d90d4d, 0x01d4bf22, 0x03c76c3b, 0x032694b8, 0x03a4d446, 0x031984df, 0x003d3633}}, Y: Field{[10]uint32{0x01a30845, 0x02e970ba, 0x03f020c0, 0x01753ec3, 0x025b48a5, 0x01f8eff7, 0x02d76bfc, 0x0062035e, 0x01223aae, 0x0020f40b}}}, + {X: Field{[10]uint32{0x0037c4cd, 0x002b9f06, 0x02e707e5, 0x0387854e, 0x03a2dce0, 0x0343c3b9, 0x006380af, 0x002f2243, 0x01dc8e7b, 0x0004f5c8}}, Y: Field{[10]uint32{0x00841116, 0x01844ba2, 0x00d28e97, 0x004b57c5, 0x009309c4, 0x002bdf93, 0x039e8237, 0x015045fa, 0x01e3e157, 0x00318830}}}, + {X: Field{[10]uint32{0x0265ce1a, 0x018b8458, 0x01783928, 0x013389ec, 0x02516482, 0x013076bc, 0x03eb55d9, 0x019ca081, 0x03a666fc, 0x00397e7b}}, Y: Field{[10]uint32{0x000d9975, 0x00bc8f57, 0x0156c771, 0x033d4f82, 0x0201f0f3, 0x018f5e6d, 0x03f9fbe1, 0x00aed48b, 0x03e61830, 0x001402a7}}}, + {X: Field{[10]uint32{0x0319c9ec, 0x0180f0f0, 0x016988da, 0x038290fa, 0x02a48ea0, 0x009ec6cc, 0x027abb98, 0x0284dd96, 0x00bd0a1b, 0x001cfb8f}}, Y: Field{[10]uint32{0x02b38f58, 0x017b1686, 0x00744b0a, 0x03408386, 0x03bbc909, 0x00ba097c, 0x0330bd5a, 0x01a272fa, 0x02b44093, 0x00365a0c}}}, + {X: Field{[10]uint32{0x01990d91, 0x0074b3f1, 0x0255df10, 0x0007c09e, 0x003e0285, 0x0089d429, 0x03285e71, 0x01aeea04, 0x03c59404, 0x00046e4b}}, Y: Field{[10]uint32{0x00315417, 0x0245c5a9, 0x03b639fe, 0x03347655, 0x0023b324, 0x002526cb, 0x01cfcd08, 0x033f8103, 0x00aae20f, 0x003822c9}}}, + {X: Field{[10]uint32{0x0160935b, 0x032873e4, 0x006a0623, 0x0148d8bc, 0x01b1bf49, 0x008a9897, 0x014442a0, 0x003717ec, 0x029c22be, 0x000c10d9}}, Y: Field{[10]uint32{0x00d0eb34, 0x034b2189, 0x00a2206d, 0x02c9724b, 0x0341eead, 0x0349b886, 0x0152c044, 0x01f5afeb, 0x00b04bf4, 0x0037120d}}}, + {X: Field{[10]uint32{0x015f9a0c, 0x02d71f4f, 0x00495132, 0x0185aa72, 0x023f92aa, 0x001f7b12, 0x007622b4, 0x034510ae, 0x01aac290, 0x0012430e}}, Y: Field{[10]uint32{0x0126b986, 0x01a36b8a, 0x021eab3d, 0x03799dcf, 0x03110f87, 0x00f2cc53, 0x001361f7, 0x012a9bfa, 0x00fd5784, 0x00171db0}}}, + {X: Field{[10]uint32{0x0002d03a, 0x02c90ce4, 0x03f2d2bb, 0x02528f82, 0x023a4caf, 0x01cac310, 0x01fb2127, 0x00cd1f28, 0x015867d7, 0x003f7573}}, Y: Field{[10]uint32{0x03411995, 0x033a425d, 0x0117210b, 0x01321762, 0x01bd69f8, 0x02f25369, 0x035bcc06, 0x01af1dbe, 0x0007d1d2, 0x003bf97d}}}, + {X: Field{[10]uint32{0x00435ea9, 0x031405c5, 0x012d80e9, 0x02272b46, 0x00e2d359, 0x01956b10, 0x03db2722, 0x003f3910, 0x008eb083, 0x002f2284}}, Y: Field{[10]uint32{0x03c979f9, 0x01a6e4f8, 0x00d60220, 0x03d8a41f, 0x0076bd3a, 0x024c65b0, 0x008a384b, 0x0369d29c, 0x0258cbc3, 0x00249300}}}, + {X: Field{[10]uint32{0x02924b44, 0x0177e3ab, 0x02e3b339, 0x02904054, 0x012c706e, 0x00626273, 0x02e431a7, 0x02db2e1a, 0x036e41f4, 0x003b6026}}, Y: Field{[10]uint32{0x00315da8, 0x0326ff19, 0x01f8a324, 0x02642c46, 0x00bede66, 0x0251eaa2, 0x0142ffe0, 0x01562723, 0x005c0329, 0x0004d760}}}, + {X: Field{[10]uint32{0x00da52d8, 0x02145edb, 0x03276797, 0x0049e7a7, 0x00043982, 0x0390b5aa, 0x007d2f1e, 0x00781d05, 0x02c75d87, 0x0009ad42}}, Y: Field{[10]uint32{0x005dd7a0, 0x011aeb55, 0x005180e3, 0x02814879, 0x021fe37e, 0x00d253c3, 0x014b4c80, 0x01ba7c2c, 0x00638642, 0x00099667}}}, + {X: Field{[10]uint32{0x03e8efd5, 0x02e53527, 0x01dd725a, 0x00419de1, 0x01679f6b, 0x02241f3c, 0x02746ff9, 0x033351fd, 0x00de27d0, 0x00333b62}}, Y: Field{[10]uint32{0x03f5729a, 0x037d0f5c, 0x00825fe4, 0x019f38af, 0x00e2beba, 0x014ad09a, 0x036adc2c, 0x0212b2d2, 0x022b4dc5, 0x0016c3b7}}}, + {X: Field{[10]uint32{0x003c6249, 0x02a20f76, 0x032bb52d, 0x005863d1, 0x02bf3fe5, 0x01e221b3, 0x00429c11, 0x018cc8c2, 0x03cb3152, 0x00363b7d}}, Y: Field{[10]uint32{0x03984be3, 0x036bc1c5, 0x033437f3, 0x0201ad21, 0x0108c71b, 0x002e9a47, 0x03427e13, 0x03bbdb50, 0x003ec155, 0x00295aaf}}}, + {X: Field{[10]uint32{0x0164b4ef, 0x02dc711d, 0x02515c2f, 0x00414fd9, 0x02526489, 0x035b23f3, 0x0149aa5c, 0x00e9d542, 0x03c9f8db, 0x003b60b0}}, Y: Field{[10]uint32{0x00b2f0b4, 0x03a3f948, 0x00f39b06, 0x032057f3, 0x0141ddcc, 0x0112a291, 0x029a26d4, 0x034f1dbe, 0x014906d9, 0x0017b966}}}, + {X: Field{[10]uint32{0x018ca937, 0x006b910f, 0x0365e777, 0x02b61620, 0x005853b3, 0x01b54212, 0x026249d5, 0x03ad5017, 0x03aee89a, 0x001b89de}}, Y: Field{[10]uint32{0x01f40b8e, 0x01f408ce, 0x025b403f, 0x03713892, 0x008f9623, 0x00e845c3, 0x01a3fe66, 0x02529f0c, 0x03d81e6f, 0x002121c6}}}, + {X: Field{[10]uint32{0x00a03c5c, 0x00abee52, 0x00967f70, 0x0109d9da, 0x00f2f8b6, 0x0386bfe5, 0x01b12293, 0x00484159, 0x02c86727, 0x002bad9e}}, Y: Field{[10]uint32{0x00bde197, 0x0034875e, 0x0289b698, 0x02fcdc1f, 0x02747100, 0x01bfd6b1, 0x027898d6, 0x02700f37, 0x01889425, 0x003f34f1}}}, + {X: Field{[10]uint32{0x0283da79, 0x01f381d4, 0x03af23ba, 0x024e8f44, 0x00457531, 0x00e18cfa, 0x00967d1e, 0x031d5a53, 0x034baa20, 0x0027c1ff}}, Y: Field{[10]uint32{0x03f2136b, 0x017edff7, 0x02e36397, 0x03df656e, 0x0014308c, 0x02b28fc7, 0x03c5f363, 0x0185a3fc, 0x030d49d0, 0x002ba2df}}}, + {X: Field{[10]uint32{0x013e1520, 0x00e5755c, 0x03df7243, 0x0325dab3, 0x03baafc3, 0x02f15406, 0x004b3ef7, 0x036ae859, 0x0114a026, 0x0009011b}}, Y: Field{[10]uint32{0x02029ae6, 0x0219f32a, 0x016cd321, 0x0202eb43, 0x0037fd53, 0x00554d2d, 0x013cd0e9, 0x0028c6ea, 0x01e96dc4, 0x00099521}}}, + {X: Field{[10]uint32{0x033de519, 0x02f08cca, 0x010c913b, 0x02adf67e, 0x011806af, 0x015d39ae, 0x0344f48c, 0x03471a00, 0x0126bf8f, 0x00004dda}}, Y: Field{[10]uint32{0x01a61fa5, 0x02f9e575, 0x01ced56e, 0x014685d5, 0x018aed90, 0x01f4da5b, 0x02b2198e, 0x01309be1, 0x00e7c4b4, 0x0028d040}}}, + {X: Field{[10]uint32{0x035a7d6e, 0x03268fbb, 0x015f11ef, 0x02996073, 0x025e4c38, 0x0045aba0, 0x037c85fb, 0x0319a21f, 0x014e816c, 0x00250f1b}}, Y: Field{[10]uint32{0x029de8dd, 0x00c69825, 0x02b24eca, 0x01c0c5a7, 0x0274112f, 0x0220fb8d, 0x02351657, 0x0369b4a7, 0x0324f618, 0x00364f51}}}, + {X: Field{[10]uint32{0x005432d9, 0x002023a2, 0x03f53d4d, 0x0252bd82, 0x03a0f46e, 0x017d3e19, 0x03c9e61d, 0x0183f72b, 0x001f1592, 0x002b7e01}}, Y: Field{[10]uint32{0x03e57958, 0x01680dc6, 0x02d952b9, 0x01779b0f, 0x02c055ff, 0x03a42cdb, 0x0331bcbb, 0x0145bcf5, 0x021f99d2, 0x00313aae}}}, + {X: Field{[10]uint32{0x022dcc44, 0x014df01b, 0x01bb8d96, 0x01860c97, 0x01dc0d94, 0x001ea7ea, 0x01defb67, 0x02b82047, 0x0313a404, 0x0005705f}}, Y: Field{[10]uint32{0x01b6898e, 0x03ce0eba, 0x01dc679d, 0x01898359, 0x01a799fb, 0x0144b5e7, 0x0042b482, 0x0257a0da, 0x0352021f, 0x0021d034}}}, + {X: Field{[10]uint32{0x02cb8ca0, 0x012df372, 0x0143580e, 0x03b46b0c, 0x00966ec9, 0x01ae04f7, 0x01bd5758, 0x01665271, 0x03356236, 0x0021eeee}}, Y: Field{[10]uint32{0x022a48c4, 0x01892a34, 0x00a36f83, 0x03a472b5, 0x036a28f4, 0x00928fa6, 0x0214ccbe, 0x00f09257, 0x012c1bfc, 0x00005666}}}, + {X: Field{[10]uint32{0x031fa105, 0x01705da7, 0x00daf95b, 0x00f35751, 0x03564da7, 0x02ba710c, 0x0082b5fe, 0x01530678, 0x004a0964, 0x000e6f45}}, Y: Field{[10]uint32{0x016fb207, 0x01dec4c9, 0x019bcfa2, 0x009ccc0c, 0x01dadf15, 0x030f2a3e, 0x02be12eb, 0x03535be2, 0x011c30b5, 0x003ffa28}}}, + {X: Field{[10]uint32{0x003bca7a, 0x02ef592a, 0x00a9ab78, 0x01dbba5c, 0x00a1c696, 0x0196cbd3, 0x0399bfe2, 0x030319ae, 0x034f9bce, 0x0031393a}}, Y: Field{[10]uint32{0x02bfc286, 0x012283a5, 0x03cb7c22, 0x00ed13f0, 0x012ecb49, 0x001798e0, 0x024be2bd, 0x02e712f3, 0x003d316c, 0x0006ee6a}}}, + {X: Field{[10]uint32{0x03244e69, 0x0392bb33, 0x01801488, 0x00d3d4f0, 0x028b53f0, 0x023280d7, 0x01dd2f44, 0x034cd3c3, 0x03831c80, 0x003060f9}}, Y: Field{[10]uint32{0x01a8b820, 0x00c362f6, 0x020b1593, 0x02552539, 0x0008ff2f, 0x03770203, 0x03389268, 0x007520f6, 0x02aac771, 0x003e663f}}}, + {X: Field{[10]uint32{0x02d47d92, 0x0309007f, 0x03b6be39, 0x03655d4e, 0x027ac812, 0x00dd3674, 0x013b630f, 0x038423c2, 0x03ac22a2, 0x00267475}}, Y: Field{[10]uint32{0x02d0e1f0, 0x031378d4, 0x008b039c, 0x00f70d9b, 0x0352080a, 0x00daa25e, 0x01ca3d9b, 0x038d07a3, 0x033488df, 0x000299f4}}}, + {X: Field{[10]uint32{0x0161cea5, 0x033324ab, 0x012bc5c3, 0x00e79fd7, 0x02985a33, 0x01a42420, 0x03d6f187, 0x0226ef7c, 0x025d16cd, 0x00381c02}}, Y: Field{[10]uint32{0x00a0b0f0, 0x025381dc, 0x007e3bd9, 0x00a529eb, 0x001fd08b, 0x02756708, 0x03ec97bc, 0x00fea102, 0x03e03895, 0x0009bdaa}}}, + {X: Field{[10]uint32{0x01a7e721, 0x021e8f98, 0x0268b554, 0x01734fe9, 0x025415e9, 0x01ea98bb, 0x03813b56, 0x0360e546, 0x02e8cf36, 0x002c66fd}}, Y: Field{[10]uint32{0x0170153d, 0x00fe2e46, 0x01041fc0, 0x016e9dc2, 0x0246c105, 0x030439c4, 0x019f59e4, 0x036cbb35, 0x00a5ca2c, 0x0018c39e}}}, + {X: Field{[10]uint32{0x0371fd44, 0x039b867f, 0x03943c6f, 0x01c870cc, 0x0039abaf, 0x025c051d, 0x0027adfa, 0x0343b220, 0x0156e90d, 0x00094024}}, Y: Field{[10]uint32{0x033afc11, 0x019b87d5, 0x01dec9c4, 0x0000b467, 0x01b78255, 0x02e4ce16, 0x014ed74c, 0x01d8c808, 0x03dc8647, 0x000c9011}}}, + {X: Field{[10]uint32{0x01a3e4ae, 0x02e14e18, 0x00681771, 0x007e588e, 0x02aca501, 0x03531402, 0x030c98d9, 0x0174726e, 0x03e8bbe4, 0x0011739f}}, Y: Field{[10]uint32{0x0392f8b1, 0x0018b908, 0x008327ca, 0x01d804d6, 0x019e41b1, 0x02db1fd9, 0x00725702, 0x02e3c297, 0x02afd1ad, 0x00232f08}}}, + {X: Field{[10]uint32{0x019ec059, 0x020522d8, 0x026834e3, 0x014d0ec4, 0x02b939e9, 0x028a1bbd, 0x03392120, 0x01ff19f7, 0x0107d3a2, 0x001cc955}}, Y: Field{[10]uint32{0x01c35b63, 0x013a4fc9, 0x00e28a35, 0x03b44d13, 0x00eeba10, 0x03b5b233, 0x00f3deda, 0x0008376c, 0x02e6e941, 0x000c5d35}}}, + {X: Field{[10]uint32{0x0011df58, 0x0002b072, 0x03885978, 0x00b68481, 0x03602596, 0x0322eb4f, 0x009a9458, 0x030e787b, 0x02f401c6, 0x0025acb3}}, Y: Field{[10]uint32{0x027fa8cd, 0x009271a2, 0x01a997d1, 0x00b660f7, 0x002fbf9e, 0x003000d7, 0x01ab5b7c, 0x02b498eb, 0x012141b4, 0x003b617b}}}, + {X: Field{[10]uint32{0x02b9c772, 0x00fbbd90, 0x01cdbb98, 0x0324dc09, 0x0357f23c, 0x0244aba1, 0x007bebb0, 0x02ca2a8c, 0x001cd941, 0x0015d906}}, Y: Field{[10]uint32{0x00ac7089, 0x0234afb8, 0x01b8ef2c, 0x0133cf38, 0x01249576, 0x0115e90f, 0x01f64375, 0x0023f76d, 0x034fc239, 0x003a05ce}}}, + {X: Field{[10]uint32{0x03ec1b61, 0x00a7b724, 0x02c60efd, 0x028e0aed, 0x02ea16d2, 0x0356c9e0, 0x031e3145, 0x0141580a, 0x00397e96, 0x000e3b1e}}, Y: Field{[10]uint32{0x018ec96e, 0x0353258c, 0x01089744, 0x00c47354, 0x02f522e6, 0x012fc995, 0x02caa3ba, 0x0378b362, 0x02a4c7b6, 0x002b3c13}}}, + {X: Field{[10]uint32{0x02c0b572, 0x03b55e5d, 0x01eb8b7a, 0x03752ca1, 0x0179c9f7, 0x0023dce2, 0x00439fa1, 0x0071e5d6, 0x038013d0, 0x001bb13b}}, Y: Field{[10]uint32{0x0098be7e, 0x006e8bf2, 0x004df13c, 0x01abd7cf, 0x017a6d26, 0x03adabc5, 0x026560e3, 0x03b37c0e, 0x0242e618, 0x0008ca39}}}, + {X: Field{[10]uint32{0x0377141b, 0x0249127b, 0x027ba884, 0x020713b5, 0x034c40a5, 0x029da1a0, 0x000fc149, 0x01ec6940, 0x036b30c2, 0x00363687}}, Y: Field{[10]uint32{0x01519758, 0x00ecd20b, 0x007dc49a, 0x0385c9ca, 0x03d92464, 0x00e4e1f5, 0x038c3108, 0x024b3c0a, 0x02d6876d, 0x00332d4c}}}, + {X: Field{[10]uint32{0x037ccb90, 0x03b458a3, 0x022b4e5f, 0x01b0ce1c, 0x026894d3, 0x032a1287, 0x02aa9f0e, 0x01c3b259, 0x00027349, 0x00213c95}}, Y: Field{[10]uint32{0x035cd8b1, 0x0308648c, 0x02944983, 0x00df4e51, 0x0109bee1, 0x027c18c6, 0x017d283d, 0x018c0b32, 0x0109f07e, 0x003cb5ff}}}, + {X: Field{[10]uint32{0x029503e3, 0x02cb7733, 0x00038136, 0x03533c02, 0x033adabf, 0x00761bfd, 0x01190e39, 0x010dca16, 0x02b55887, 0x003bd9d4}}, Y: Field{[10]uint32{0x03131c56, 0x00567e0f, 0x010f91e6, 0x0391850e, 0x0273f949, 0x02373e63, 0x03aa6759, 0x02d1e5f2, 0x0250013c, 0x0008f672}}}, + {X: Field{[10]uint32{0x0085ba6d, 0x02f0b004, 0x02a46602, 0x01d3f845, 0x00fe198f, 0x01df1ddb, 0x001cb52c, 0x0399f3d9, 0x01903b3f, 0x003e2361}}, Y: Field{[10]uint32{0x0208742d, 0x001fedee, 0x03a32405, 0x028a39b3, 0x0021da61, 0x0377c539, 0x0295714c, 0x02b5a28d, 0x02bd2178, 0x00162bca}}}, + {X: Field{[10]uint32{0x01b9c01c, 0x037805cb, 0x01354645, 0x03543457, 0x0218cde6, 0x0177b5f4, 0x01daaa8c, 0x02e5719d, 0x01bdd366, 0x0024edce}}, Y: Field{[10]uint32{0x01cf3627, 0x02e21b89, 0x03fb4748, 0x03c71f22, 0x017afea5, 0x02b83f2b, 0x03af5b96, 0x023aa98c, 0x01356c2f, 0x000093b1}}}, + {X: Field{[10]uint32{0x00443394, 0x00fc88c0, 0x00f95d41, 0x02496260, 0x006d313b, 0x02030455, 0x0382f801, 0x03968b6f, 0x0004da7a, 0x001ccb3d}}, Y: Field{[10]uint32{0x01596953, 0x035e2693, 0x01e431b7, 0x021054f2, 0x02e88200, 0x029dded5, 0x02eae580, 0x02e42a40, 0x03261758, 0x002163a0}}}, + {X: Field{[10]uint32{0x01d36e32, 0x0296652a, 0x02f7528e, 0x00ad6f92, 0x0365fc25, 0x006e0e2d, 0x002e024a, 0x0000b4fe, 0x03192c40, 0x003bf781}}, Y: Field{[10]uint32{0x01d9107b, 0x00be034f, 0x01483f0c, 0x02d5a751, 0x03b8dd69, 0x020ea71b, 0x02635851, 0x00d5da46, 0x035c3a15, 0x00227074}}}, + {X: Field{[10]uint32{0x02c90a15, 0x03764307, 0x034a6b42, 0x016e6c69, 0x02f114e6, 0x02a542f6, 0x0020c1cd, 0x00ce49d9, 0x02f28069, 0x0027bb6a}}, Y: Field{[10]uint32{0x03164de2, 0x022e81f4, 0x035337de, 0x03842b0e, 0x0226f427, 0x0134a314, 0x009728da, 0x010334c9, 0x00247fa5, 0x0004e677}}}, + {X: Field{[10]uint32{0x01433195, 0x034f5086, 0x017dd877, 0x031f52e8, 0x03775805, 0x03f6d21f, 0x01eaafeb, 0x028851a7, 0x028d342a, 0x0008fc3a}}, Y: Field{[10]uint32{0x03699b03, 0x02ff5182, 0x0306e4fc, 0x030e79f0, 0x0163444d, 0x0353a4f0, 0x032ca8d1, 0x02071574, 0x0231d2a4, 0x0037071b}}}, + {X: Field{[10]uint32{0x03e060b8, 0x032ddbaa, 0x0052c074, 0x003538cc, 0x02edd47c, 0x01a8c174, 0x0116e827, 0x02798162, 0x027058c2, 0x00003614}}, Y: Field{[10]uint32{0x010cfac8, 0x03f69baf, 0x012583a2, 0x02da2a68, 0x0384d497, 0x027a9264, 0x009e5105, 0x016ee57b, 0x0104e4db, 0x00268392}}}, + {X: Field{[10]uint32{0x009f28b8, 0x02411acc, 0x0363ad4d, 0x00ddeacd, 0x00f7d36b, 0x0033ce18, 0x022d2d19, 0x00481164, 0x015cccf9, 0x0006cd32}}, Y: Field{[10]uint32{0x0151e948, 0x0128478a, 0x0008f6f1, 0x03a246ed, 0x01f7080d, 0x0181f2d3, 0x0078c3d2, 0x0198ead9, 0x020c3f5f, 0x001c308c}}}, + {X: Field{[10]uint32{0x0384b228, 0x02851cd2, 0x028c28fc, 0x00d85263, 0x0289569d, 0x03c41c1e, 0x016d4e20, 0x0165aedd, 0x03dcae5e, 0x000c9563}}, Y: Field{[10]uint32{0x02038d86, 0x0241be45, 0x03cfb501, 0x0381d2db, 0x01fe63f6, 0x0356ab36, 0x03978c43, 0x01d56ec8, 0x00b75ed5, 0x001dd66a}}}, + {X: Field{[10]uint32{0x01984acd, 0x032c7a37, 0x02bf8577, 0x03b3e8f5, 0x016028d7, 0x00102bef, 0x01a38202, 0x02f15ce4, 0x037737d2, 0x00192062}}, Y: Field{[10]uint32{0x01ca2300, 0x001d225c, 0x03e1f057, 0x03b29c99, 0x012cf895, 0x0298c12f, 0x027b8914, 0x01553648, 0x01346ae9, 0x001080ae}}}, + {X: Field{[10]uint32{0x0177b333, 0x00b61f63, 0x031aae57, 0x0015cb86, 0x01bcd337, 0x010a2154, 0x02a23732, 0x01f2d50a, 0x02c6ec2d, 0x0031abda}}, Y: Field{[10]uint32{0x02c78cbf, 0x031f36b7, 0x023529fc, 0x022e17c8, 0x015d5af1, 0x034101fb, 0x02393bcd, 0x028b7c63, 0x01594ae5, 0x003fff95}}}, + {X: Field{[10]uint32{0x00f1cef0, 0x00378fa9, 0x02f13a8b, 0x00d0a3ba, 0x002e7a9e, 0x03ccbf51, 0x022a0317, 0x004be03e, 0x004494ea, 0x00247e3f}}, Y: Field{[10]uint32{0x0154dbcf, 0x03fdb669, 0x02a42481, 0x0097aba8, 0x03e76c22, 0x003309ab, 0x02765f42, 0x007742b1, 0x007ad81b, 0x0001a829}}}, + {X: Field{[10]uint32{0x01c1c017, 0x00ff1084, 0x016c8e35, 0x01848cd7, 0x02dc610a, 0x030056d1, 0x01b081fd, 0x03d5f21e, 0x01fa6a26, 0x0038566a}}, Y: Field{[10]uint32{0x013e8851, 0x0126beaa, 0x010b6bd7, 0x031f2a07, 0x00f1c181, 0x013077cb, 0x01656f9b, 0x0380269d, 0x0243445a, 0x00308271}}}, + {X: Field{[10]uint32{0x00f9330b, 0x02fae969, 0x01813556, 0x01a6e279, 0x031a7051, 0x001b4a0f, 0x011eda9c, 0x00ea5c48, 0x005e135f, 0x003a3a7f}}, Y: Field{[10]uint32{0x01af0abb, 0x02c4353a, 0x01553fe0, 0x02e7cff1, 0x01c88423, 0x03c7912d, 0x03b55fa6, 0x03a3db69, 0x00993b73, 0x003a2e5a}}}, + {X: Field{[10]uint32{0x000edead, 0x010d4daf, 0x035b1642, 0x0062bbbe, 0x0011aa98, 0x004ce12d, 0x0027ec6e, 0x013030db, 0x0129d5ae, 0x003cfd75}}, Y: Field{[10]uint32{0x033d34b9, 0x016f9876, 0x02ae533f, 0x00190f94, 0x021dd1e3, 0x03f1782a, 0x01abbc4f, 0x0304ccd1, 0x02431e40, 0x000fdd01}}}, + {X: Field{[10]uint32{0x00c81159, 0x013db5db, 0x0206a02e, 0x01727285, 0x0209eae6, 0x00505d80, 0x039acffe, 0x02ee6b86, 0x0030f5d8, 0x00316dd9}}, Y: Field{[10]uint32{0x032429c1, 0x03a1b633, 0x00fad0d2, 0x00ce6800, 0x0229b139, 0x02454e02, 0x00875916, 0x02426090, 0x03097008, 0x00201a27}}}, + {X: Field{[10]uint32{0x00fc09b0, 0x01442703, 0x00261e93, 0x0191ca25, 0x00ff2755, 0x03edb6d4, 0x02d30c9f, 0x0241d117, 0x00b434f5, 0x002552a9}}, Y: Field{[10]uint32{0x0072e4ad, 0x01974f43, 0x00ec5832, 0x01ba029c, 0x03a808b7, 0x00ec3f3c, 0x0176be8b, 0x00b095b3, 0x02861bad, 0x002008f2}}}, + {X: Field{[10]uint32{0x023d528b, 0x03c4cd5b, 0x00249d6d, 0x01512eed, 0x021b96ee, 0x002960cd, 0x020c9b93, 0x03cce4c0, 0x00bb4803, 0x0001576a}}, Y: Field{[10]uint32{0x02e5b64c, 0x03bdf38c, 0x02575799, 0x0134d568, 0x002387b1, 0x02805e17, 0x00bb209d, 0x03a7d61b, 0x0388ca06, 0x00373112}}}, + {X: Field{[10]uint32{0x03a1de03, 0x01fe2ee8, 0x0236877a, 0x02f285db, 0x01db59ea, 0x0098ad38, 0x02d48d3d, 0x02ca1ac2, 0x0000d810, 0x0020213a}}, Y: Field{[10]uint32{0x03dc1480, 0x0223f118, 0x00f85e08, 0x02b3acd2, 0x00070d60, 0x02f17e60, 0x0309c129, 0x0197f027, 0x029c59f8, 0x00362fba}}}, + {X: Field{[10]uint32{0x0318b39b, 0x03be9055, 0x00bd7f85, 0x005ec030, 0x03d15e02, 0x00252526, 0x00f49a15, 0x01fe21d2, 0x02c236c8, 0x0006caed}}, Y: Field{[10]uint32{0x01029c74, 0x006b4514, 0x001dc810, 0x00b02c3a, 0x00c3c3f4, 0x01afaa69, 0x03dd0180, 0x03cdbbc6, 0x01956aad, 0x0008592c}}}, + {X: Field{[10]uint32{0x00377872, 0x0368e295, 0x02d84830, 0x03667e46, 0x01de9139, 0x034bfafb, 0x01c65ce3, 0x030dcb97, 0x03e80125, 0x003ee9a1}}, Y: Field{[10]uint32{0x03e001c9, 0x00fb049c, 0x03f83092, 0x03c95fd2, 0x0355aabb, 0x0016a584, 0x00a7a821, 0x02540729, 0x02df03b8, 0x0022513a}}}, + {X: Field{[10]uint32{0x01560cbd, 0x038b7fbf, 0x03a948aa, 0x017bc246, 0x03d21e15, 0x0168b5e5, 0x00699c97, 0x0305bfe7, 0x0380a5f1, 0x002d6392}}, Y: Field{[10]uint32{0x02cec3ec, 0x02944a14, 0x02fec937, 0x01f64097, 0x0304606f, 0x00b5aaa5, 0x031b7f41, 0x02fe9b95, 0x02ba1429, 0x003ffe72}}}, + {X: Field{[10]uint32{0x0026edec, 0x03c5f38d, 0x02900fce, 0x01f2750e, 0x00114fdb, 0x00171af9, 0x0222551e, 0x01b08554, 0x0126da5d, 0x0023af35}}, Y: Field{[10]uint32{0x013aa97e, 0x01f7e194, 0x0021eae9, 0x00d2bbb7, 0x03de11f0, 0x014bd519, 0x02aafb1a, 0x0006d8fa, 0x03986b33, 0x001ce83e}}}, + {X: Field{[10]uint32{0x03ee325e, 0x0159a446, 0x00d2dbb9, 0x00c99010, 0x037354e0, 0x025c5526, 0x01c68f0e, 0x00a7a257, 0x000b924b, 0x003ee915}}, Y: Field{[10]uint32{0x0105ebd4, 0x039bd464, 0x0321b6c9, 0x009c5bd4, 0x02290f3c, 0x0394a10e, 0x02ba0d07, 0x015eb8d0, 0x00c33b98, 0x0014a422}}}, + {X: Field{[10]uint32{0x039c44de, 0x01bd3a2f, 0x025b0ab4, 0x025d946c, 0x02ce014c, 0x01bcfcdb, 0x006301a6, 0x034c91b6, 0x0097a1a7, 0x0022de8b}}, Y: Field{[10]uint32{0x00b247c7, 0x00ca3f69, 0x017b94cb, 0x02110ff0, 0x027c88a6, 0x007a9d4d, 0x006c1f47, 0x00d6cd9e, 0x00ab699c, 0x002e0a15}}}, + {X: Field{[10]uint32{0x02d2279c, 0x00e6963a, 0x0096f40c, 0x01dd2f52, 0x03931796, 0x006ea426, 0x0003bbba, 0x01c5539c, 0x03435adb, 0x00277c45}}, Y: Field{[10]uint32{0x01b884eb, 0x03c866d0, 0x02f8377e, 0x019775e8, 0x01d45668, 0x01eae190, 0x02913d6e, 0x0330db0d, 0x034ea216, 0x0029e48b}}}, + {X: Field{[10]uint32{0x02931cd8, 0x02b6b915, 0x03e9e414, 0x005707e6, 0x02c54b62, 0x01cc5224, 0x02fd9e73, 0x0111320b, 0x0384749b, 0x0016fade}}, Y: Field{[10]uint32{0x03abb95c, 0x0183a6cb, 0x01f7b64f, 0x03f3ad47, 0x03d32b7c, 0x03cc23bf, 0x02753fbf, 0x0029f0a3, 0x025f32cd, 0x00026790}}}, + {X: Field{[10]uint32{0x00788879, 0x004abd93, 0x02f43cd5, 0x01745c19, 0x01c9f8ed, 0x028edec2, 0x005114f4, 0x0012e9e3, 0x00430ff2, 0x000aa0c3}}, Y: Field{[10]uint32{0x02666c84, 0x02588c18, 0x0286561e, 0x00267b90, 0x009ba148, 0x0081fac0, 0x02827fed, 0x00994bae, 0x03a4e888, 0x00004948}}}, + {X: Field{[10]uint32{0x0057486a, 0x02488787, 0x014191b6, 0x00500670, 0x00985a77, 0x0334cb65, 0x00ab408b, 0x00a8639a, 0x02a14c1f, 0x003dc691}}, Y: Field{[10]uint32{0x00534875, 0x01d6db48, 0x00f0aef6, 0x00feca07, 0x034fac44, 0x03303683, 0x00ce36a4, 0x02694d3f, 0x033e0ea7, 0x002b7c66}}}, + {X: Field{[10]uint32{0x029d193b, 0x010da9f1, 0x012fdcb6, 0x02acdb10, 0x00bbad2b, 0x01f58f03, 0x00ae2d9f, 0x00acc59e, 0x01dcaa9c, 0x000ae039}}, Y: Field{[10]uint32{0x022119c3, 0x00875880, 0x00ffa276, 0x00670821, 0x038f3c90, 0x0141891e, 0x001ce04c, 0x00018ada, 0x004d71d6, 0x002f20f8}}}, + {X: Field{[10]uint32{0x023beece, 0x0148d739, 0x01d5bb97, 0x00300f11, 0x0175424a, 0x011124d0, 0x0375b58d, 0x031a71a0, 0x033be521, 0x001272f7}}, Y: Field{[10]uint32{0x0062de7f, 0x01b12697, 0x017a8ae4, 0x03c558e6, 0x0291d260, 0x00e84dab, 0x0356abad, 0x039f3b0d, 0x02eaf0f0, 0x00315857}}}, + {X: Field{[10]uint32{0x029ee1b2, 0x016e8c73, 0x0373979c, 0x00ee72a1, 0x03f7aa66, 0x03741c3d, 0x015e2f31, 0x02c45648, 0x0314b643, 0x00339351}}, Y: Field{[10]uint32{0x02feac38, 0x023f76c7, 0x010aad6f, 0x02d08030, 0x00479745, 0x0188406c, 0x0359ef5e, 0x00ea8d36, 0x0212a2fc, 0x002c7cd7}}}, + {X: Field{[10]uint32{0x01e10054, 0x00b53758, 0x01656299, 0x01e7b5f1, 0x01a8bef4, 0x03562071, 0x013bb1b5, 0x016b0e36, 0x02bbaa90, 0x001a09ed}}, Y: Field{[10]uint32{0x016bb869, 0x03e3b3ca, 0x0064d1af, 0x009dfbc8, 0x0030fc37, 0x016007d5, 0x00484279, 0x00083646, 0x007baf65, 0x0021492a}}}, + {X: Field{[10]uint32{0x0056535f, 0x03d2b460, 0x0112519a, 0x0062c5b7, 0x00ab9472, 0x000e9268, 0x037879aa, 0x035fc71e, 0x00d548f4, 0x00039c79}}, Y: Field{[10]uint32{0x0232f574, 0x006ece03, 0x01c09f0d, 0x01a0f7b4, 0x0383aeed, 0x02d72604, 0x03e3beda, 0x02cf55bd, 0x00617098, 0x00125741}}}, + {X: Field{[10]uint32{0x0200e032, 0x00199f1b, 0x02542632, 0x005a1cf3, 0x00656528, 0x00ffb69a, 0x036aa32a, 0x03ecc350, 0x01797429, 0x003bda0e}}, Y: Field{[10]uint32{0x0134613f, 0x028d8d41, 0x01404fbb, 0x001bc053, 0x0002f175, 0x006229ab, 0x01ed846f, 0x025fa03f, 0x024ade11, 0x002d2c63}}}, + {X: Field{[10]uint32{0x012deaf4, 0x0162c0f9, 0x0245b0a2, 0x00db07b1, 0x01dd557e, 0x038bbb61, 0x008007d0, 0x01fbffa4, 0x01c1ac8f, 0x000031ca}}, Y: Field{[10]uint32{0x021305fe, 0x01fafd15, 0x00f27bde, 0x02242b0e, 0x0312365b, 0x00cd6821, 0x02bade6a, 0x013dab17, 0x01c21858, 0x000ba0fb}}}, + {X: Field{[10]uint32{0x015735ab, 0x031fec44, 0x0288cc1c, 0x03088492, 0x01290d54, 0x02b8b7b4, 0x03c4f2c3, 0x01b54eca, 0x01199a71, 0x0033c74e}}, Y: Field{[10]uint32{0x0100e6e6, 0x02dc35b7, 0x029089b7, 0x03bab550, 0x03c276c8, 0x02ae14e2, 0x0180970d, 0x0100b3a2, 0x01a57ec3, 0x001ad13d}}}, + {X: Field{[10]uint32{0x03ecdeae, 0x03582696, 0x00f55cf9, 0x01ffe0b6, 0x01a9c28a, 0x03a4369d, 0x031f772e, 0x03b8a3cf, 0x03a0266d, 0x001b3cf5}}, Y: Field{[10]uint32{0x01bc58d4, 0x037ebad2, 0x01e14034, 0x02d3113b, 0x00ede5c9, 0x0366a66f, 0x01b9cf94, 0x03338a25, 0x03b31e11, 0x000ef463}}}, + {X: Field{[10]uint32{0x01395542, 0x01d2701f, 0x00be7f28, 0x02bb3e0c, 0x0256393c, 0x0002ba4c, 0x02e4274f, 0x03bb2b37, 0x0032ae63, 0x003692d6}}, Y: Field{[10]uint32{0x01b2210b, 0x03220633, 0x00ec4dfe, 0x038c6da5, 0x02106374, 0x005a12e4, 0x01610c9d, 0x0103c605, 0x023bd2d9, 0x0026aaec}}}, + {X: Field{[10]uint32{0x0330bbfa, 0x0357de90, 0x002d4b8a, 0x0043a561, 0x03407d1a, 0x03a8b1af, 0x0063270c, 0x00385be7, 0x03502321, 0x003e46b8}}, Y: Field{[10]uint32{0x013aa1c2, 0x00421ae4, 0x01e161b5, 0x010ccd94, 0x0153c915, 0x034f46bc, 0x029290ef, 0x0095cd65, 0x01acd196, 0x00007c58}}}, + {X: Field{[10]uint32{0x02f1ac02, 0x021d2cbc, 0x0025556c, 0x01cfe872, 0x02c72e3f, 0x01cca149, 0x0047c862, 0x00a8b916, 0x0352cc3e, 0x001f86fb}}, Y: Field{[10]uint32{0x02f6e6fe, 0x0305e1f9, 0x017f44c4, 0x008fba36, 0x0008ff05, 0x003f13d4, 0x03048fee, 0x03934f6d, 0x037ea706, 0x002f92c3}}}, + {X: Field{[10]uint32{0x03d5998f, 0x03f20534, 0x020ecb27, 0x03c52f9c, 0x03706567, 0x03724bad, 0x00e256cc, 0x00bb8dd2, 0x015d30dc, 0x0003749a}}, Y: Field{[10]uint32{0x032dc74f, 0x000a8668, 0x0396ed1a, 0x0103c3c2, 0x01bba677, 0x01151cad, 0x027cf998, 0x02004e7b, 0x0044f102, 0x0026bccb}}}, + {X: Field{[10]uint32{0x009dbb9d, 0x002ccdd9, 0x037c94d2, 0x02550fec, 0x02125fe3, 0x00ceddb6, 0x02602ba0, 0x018f2344, 0x02507147, 0x001e3eb9}}, Y: Field{[10]uint32{0x03ce3aa6, 0x0388d46f, 0x00ce121d, 0x00c81989, 0x00c3b925, 0x02bc7fa9, 0x01826e5e, 0x03339bd9, 0x000f0726, 0x001e3713}}}, + {X: Field{[10]uint32{0x01c98bd5, 0x02498da3, 0x018dfee6, 0x02e16476, 0x021b6fb6, 0x0005ad16, 0x01d3e00d, 0x01774aa8, 0x021e510e, 0x0007b7d4}}, Y: Field{[10]uint32{0x01311f86, 0x02369055, 0x00a59751, 0x034d8efb, 0x00aeafd8, 0x006ac3c8, 0x034d8177, 0x026e3743, 0x016d9b2e, 0x00268340}}}, + {X: Field{[10]uint32{0x00101d39, 0x01aa8634, 0x02b4d416, 0x0250dd58, 0x007ce286, 0x00f31a79, 0x013272cd, 0x02d82e45, 0x030c5e53, 0x002181ee}}, Y: Field{[10]uint32{0x02eb519a, 0x0159b565, 0x00e988ef, 0x015c9e49, 0x02388707, 0x01922be3, 0x01a294aa, 0x0195070d, 0x031ec83c, 0x00005728}}}, + {X: Field{[10]uint32{0x02d02eab, 0x02d97de5, 0x02df7166, 0x001e44bc, 0x03037f96, 0x010ae6ed, 0x020dbb7c, 0x000fde02, 0x000d9a05, 0x00197f4c}}, Y: Field{[10]uint32{0x02a3b5d9, 0x02e4a2d3, 0x00aa5335, 0x00f3513b, 0x02904caf, 0x03dad0fc, 0x03945401, 0x02a14847, 0x035084fb, 0x003f3454}}}, + {X: Field{[10]uint32{0x0002d148, 0x03c51633, 0x03f99f47, 0x02a4cc24, 0x0336d031, 0x01332fac, 0x01845f03, 0x01f38700, 0x03a76c84, 0x0032462c}}, Y: Field{[10]uint32{0x03728568, 0x00eb7f5f, 0x00eb53ed, 0x02772a17, 0x02059632, 0x03ea9b98, 0x00632700, 0x00b880c8, 0x0003dbbb, 0x003c95bd}}}, + {X: Field{[10]uint32{0x01661817, 0x014ab381, 0x03bb5c13, 0x03536f82, 0x01532e54, 0x0102b783, 0x02cb4291, 0x02e1e42f, 0x00fd02f0, 0x001ab0b7}}, Y: Field{[10]uint32{0x029e2af3, 0x02ab8592, 0x026dccca, 0x038c1811, 0x03784c3d, 0x01c89470, 0x0323074e, 0x00e5b16b, 0x0310abf9, 0x003cb098}}}, + {X: Field{[10]uint32{0x033f3d19, 0x02ffcbf2, 0x0295f5b0, 0x02a517da, 0x02cf8e95, 0x017facac, 0x0239b94b, 0x03ce273b, 0x00ee54ac, 0x00235c71}}, Y: Field{[10]uint32{0x031ce52d, 0x01d611c3, 0x00cb6548, 0x015e26d1, 0x03f0bc88, 0x00cc1840, 0x03a3881e, 0x030711f6, 0x03d95a02, 0x0026110a}}}, + {X: Field{[10]uint32{0x00f583c3, 0x03b84911, 0x03072b3d, 0x01a2a426, 0x002e5d73, 0x01447a1d, 0x000abbb0, 0x01c463cb, 0x00d3fd55, 0x003a2f49}}, Y: Field{[10]uint32{0x03ce6538, 0x02c6fc22, 0x0343a4d4, 0x016b3583, 0x02238028, 0x01c59167, 0x037992a6, 0x008b6d96, 0x03a6e286, 0x003874b0}}}, + {X: Field{[10]uint32{0x00075217, 0x01c9568f, 0x011d032d, 0x0092acab, 0x00483fd0, 0x00c478ed, 0x02c8c516, 0x033e2794, 0x01755cf8, 0x0018b70a}}, Y: Field{[10]uint32{0x000e2a97, 0x0247e3d7, 0x00d1e093, 0x02a523cf, 0x018b3fc8, 0x00255094, 0x0301e9cd, 0x008b6383, 0x0132d80d, 0x0001e678}}}, + {X: Field{[10]uint32{0x004c0e13, 0x014125b5, 0x01451a60, 0x013d9aa5, 0x034d4323, 0x031f4f01, 0x01027099, 0x01f9832c, 0x03aacf72, 0x000df6c4}}, Y: Field{[10]uint32{0x01b1066b, 0x0090cd22, 0x02fb0629, 0x01b7427a, 0x02d3402a, 0x0004e87d, 0x02e9d07e, 0x03bfd065, 0x03be8f8c, 0x00030e0e}}}, + {X: Field{[10]uint32{0x032aa1ab, 0x01d6cc3e, 0x02c39378, 0x00e49a67, 0x01be9dc4, 0x01cbc77c, 0x018e17c4, 0x01c67b21, 0x0365eab7, 0x000defed}}, Y: Field{[10]uint32{0x01721364, 0x014d58f4, 0x00eea23b, 0x017419bc, 0x025cf44b, 0x022be329, 0x0135f4a9, 0x031308be, 0x03fd865d, 0x001c9c62}}}, + {X: Field{[10]uint32{0x005d1b94, 0x02e914aa, 0x0145606d, 0x03f84803, 0x03b5d5c3, 0x01885229, 0x01ba6e1f, 0x02fcd57f, 0x021287fc, 0x0010cfb7}}, Y: Field{[10]uint32{0x0357c20e, 0x01765251, 0x02e60571, 0x01f1ebb9, 0x01137a4c, 0x00f8c1e0, 0x030c9591, 0x0144eca3, 0x0213ad6e, 0x002c9f15}}}, + {X: Field{[10]uint32{0x02671861, 0x02695f4f, 0x03b323af, 0x0342e2c9, 0x02d23295, 0x02adf7d1, 0x021917f6, 0x00379a4a, 0x019fc5ed, 0x0003960b}}, Y: Field{[10]uint32{0x00073154, 0x0077bff5, 0x01fd6557, 0x01cc6de3, 0x01d1c9e0, 0x021b2c74, 0x039faa53, 0x0036f5f9, 0x0385e277, 0x000cfba1}}}, + {X: Field{[10]uint32{0x009442c2, 0x00a18013, 0x0189e4e4, 0x000529a8, 0x02ad8fae, 0x003c1ab7, 0x02d4e5da, 0x03c56bb8, 0x0340634b, 0x00182c1e}}, Y: Field{[10]uint32{0x004b283d, 0x00466c6f, 0x00f37ff2, 0x027295ec, 0x011557f2, 0x02362ab1, 0x034a2cd6, 0x010ee98a, 0x03cd00d2, 0x003fb821}}}, + {X: Field{[10]uint32{0x01e03100, 0x0196b4cb, 0x009b2102, 0x029f38df, 0x02643e6d, 0x01ba23ee, 0x0245e35b, 0x03df2828, 0x027601e5, 0x0012c59c}}, Y: Field{[10]uint32{0x02d8dde7, 0x024324e3, 0x00a6473b, 0x00aed8c5, 0x00cacda0, 0x03547c57, 0x0126c1dc, 0x021f8243, 0x03024768, 0x000a2ab3}}}, + {X: Field{[10]uint32{0x022a3170, 0x034be6ff, 0x027b2a17, 0x03853b53, 0x02fab97d, 0x026a22b8, 0x0003e638, 0x01f9d312, 0x013d6d79, 0x00175584}}, Y: Field{[10]uint32{0x01cd524f, 0x00ac79f6, 0x033abee4, 0x024b8b65, 0x02c65459, 0x03acacd3, 0x02462a27, 0x02cbfe98, 0x02a8534e, 0x000253bc}}}, + {X: Field{[10]uint32{0x0234f828, 0x02cf418e, 0x03a7ee38, 0x0363ca37, 0x03f4a06c, 0x03a3111c, 0x01572878, 0x006b6344, 0x03ae7511, 0x002a740f}}, Y: Field{[10]uint32{0x03517881, 0x0347e54c, 0x0262e4d9, 0x02d31f78, 0x03480c94, 0x01a3daea, 0x02665bf9, 0x0261e4b2, 0x000cc731, 0x00281ccf}}}, + {X: Field{[10]uint32{0x020e1ad5, 0x0157c959, 0x00522508, 0x0058599b, 0x0058fd37, 0x02cfdf9c, 0x00db3b77, 0x02f3a7b5, 0x01712b1a, 0x001d0665}}, Y: Field{[10]uint32{0x00da44db, 0x019ef640, 0x0385f22b, 0x03062ab0, 0x00ea3ef2, 0x009c9800, 0x013b8a32, 0x01d6273f, 0x02a8097f, 0x001c432b}}}, + {X: Field{[10]uint32{0x01918dc8, 0x02ae5bc9, 0x00be7cab, 0x03cab31a, 0x02ba0106, 0x0119cf85, 0x03a1e5f8, 0x0296c7ba, 0x010dbf81, 0x0027c5a6}}, Y: Field{[10]uint32{0x00ebc4f5, 0x01962314, 0x007b0f0b, 0x03c7a996, 0x03135d46, 0x000e01aa, 0x0049d39c, 0x004108d3, 0x007b6232, 0x00035835}}}, + {X: Field{[10]uint32{0x0301d57d, 0x01c302c8, 0x00619b6a, 0x03d322c9, 0x03c99143, 0x02af4569, 0x011c888f, 0x02e69eb6, 0x01bc4f12, 0x000ed41a}}, Y: Field{[10]uint32{0x01dd1a79, 0x020a31ff, 0x035a8979, 0x013aa1ad, 0x02da1854, 0x02cc4759, 0x034ddfd4, 0x02a5127e, 0x00d1ae59, 0x0036ee1f}}}, + {X: Field{[10]uint32{0x02baee90, 0x026e51b6, 0x01c68115, 0x035c26dd, 0x01f90cdc, 0x02feaecc, 0x03bf9afb, 0x028db82e, 0x03a967b5, 0x00277a98}}, Y: Field{[10]uint32{0x02bc4464, 0x019989f1, 0x01e57b8a, 0x03ae5353, 0x0305c7d2, 0x02460348, 0x01a605ce, 0x02e5638c, 0x019b11ba, 0x002c52ee}}}, + {X: Field{[10]uint32{0x01e31e79, 0x0377d215, 0x03a188e0, 0x00b30cf0, 0x0309fe6b, 0x0104798e, 0x025cb534, 0x01aa1095, 0x03921da3, 0x00342c8c}}, Y: Field{[10]uint32{0x0374f8e9, 0x010d7943, 0x02a7515c, 0x01d90fed, 0x02991172, 0x00d42cec, 0x02f1cfcc, 0x01524b72, 0x03ea1a6e, 0x00203b64}}}, + {X: Field{[10]uint32{0x00b03d20, 0x0205ece4, 0x01da552c, 0x0323dc44, 0x03acfe85, 0x03d1078f, 0x00ca7a49, 0x03912fe6, 0x0255966a, 0x0022b725}}, Y: Field{[10]uint32{0x03c0021e, 0x0069b95c, 0x013b4eed, 0x019b6c6e, 0x005dd1d5, 0x024cdd0c, 0x00c80eac, 0x01cc4860, 0x014c6a71, 0x00339c81}}}, + {X: Field{[10]uint32{0x020c1670, 0x0059c987, 0x03fe3ec9, 0x00438b84, 0x02141ac6, 0x00062929, 0x00800b6d, 0x00f7a9c0, 0x03f8cf6d, 0x003dbdda}}, Y: Field{[10]uint32{0x039a302c, 0x0070e54f, 0x01a54e24, 0x03dd9913, 0x0263e4fe, 0x01ace93b, 0x025e2a10, 0x0261da63, 0x00afe1ea, 0x002cb11e}}}, + {X: Field{[10]uint32{0x00b898e5, 0x00f61bc5, 0x039fef87, 0x0235b697, 0x03217638, 0x01cece44, 0x00fcaa18, 0x0368c05d, 0x007d38b7, 0x0003560a}}, Y: Field{[10]uint32{0x02fc8402, 0x00ba7b1a, 0x005ee350, 0x03d58795, 0x03da2b8f, 0x0052b433, 0x018f91d1, 0x00217a0c, 0x013469ed, 0x001e17f2}}}, + {X: Field{[10]uint32{0x01a3661c, 0x02fd9d0e, 0x0354a02f, 0x0047d2e0, 0x01538e3d, 0x0361c0b0, 0x03e810c6, 0x03b9567f, 0x022350c5, 0x001ddcb2}}, Y: Field{[10]uint32{0x006edddb, 0x036690da, 0x00d6c931, 0x02a2b87f, 0x03fe3dd3, 0x00fa6393, 0x008aefb2, 0x0368516d, 0x02de853f, 0x001688c4}}}, + {X: Field{[10]uint32{0x02433ad5, 0x01c177dc, 0x02308069, 0x00f9dab7, 0x0046ce90, 0x03f0fecb, 0x010ac95e, 0x00da1deb, 0x0176c50f, 0x0028be7e}}, Y: Field{[10]uint32{0x00c285f3, 0x03c15bf2, 0x0238a22a, 0x012da2be, 0x01f201dd, 0x03e35d11, 0x0211b22b, 0x0227ccd7, 0x031124c2, 0x003b1594}}}, + {X: Field{[10]uint32{0x038b15f7, 0x0086a013, 0x0211bcb2, 0x019ad4b3, 0x0026fce1, 0x02b49c44, 0x010ec165, 0x03159c93, 0x036585f8, 0x00388365}}, Y: Field{[10]uint32{0x018f33fb, 0x01753766, 0x0031bfc8, 0x008059ab, 0x0321d082, 0x01aaed52, 0x0348b6bc, 0x00e18a62, 0x0133c7f6, 0x0018ed86}}}, + {X: Field{[10]uint32{0x00ecc18f, 0x033b00eb, 0x0093e42d, 0x0222cafc, 0x03659ba6, 0x001b6c77, 0x0298d945, 0x00778b2f, 0x019d00ca, 0x00221a2d}}, Y: Field{[10]uint32{0x00f2fd0e, 0x005760ff, 0x03076e22, 0x0146bed4, 0x02dea562, 0x01493afd, 0x01dbfe84, 0x023ec014, 0x030796b9, 0x003c0ba6}}}, + {X: Field{[10]uint32{0x01fb677c, 0x01606e22, 0x016a43f8, 0x0099e09b, 0x0099c832, 0x029afc3a, 0x005f86b9, 0x004d869e, 0x002fe32a, 0x0004267e}}, Y: Field{[10]uint32{0x0044445b, 0x03cdf627, 0x01aac7fc, 0x01866bfa, 0x02cd2d3e, 0x024bab11, 0x0320cd35, 0x03c9c4b3, 0x03f29aa7, 0x0004fee0}}}, + {X: Field{[10]uint32{0x01cbeea3, 0x00147d0d, 0x01d31ef2, 0x032bb8b5, 0x03deae65, 0x032986c9, 0x03329698, 0x039ecd7d, 0x029677ec, 0x0012be71}}, Y: Field{[10]uint32{0x024e5ef0, 0x00420999, 0x006985b2, 0x025a04c3, 0x00ebfe51, 0x00910229, 0x02e3f80a, 0x02a5dbe5, 0x0196429d, 0x001cc011}}}, + {X: Field{[10]uint32{0x03dab473, 0x00ed50d5, 0x02045edb, 0x022f45bb, 0x01300d1f, 0x01c4f2ae, 0x02d4bbe8, 0x02e2c0c8, 0x03ca5ace, 0x0025a032}}, Y: Field{[10]uint32{0x010df58a, 0x004c766f, 0x02aec0e9, 0x00f09e62, 0x006904ee, 0x0026ccf8, 0x014697c2, 0x02874bb3, 0x0140e36b, 0x000bca4e}}}, + {X: Field{[10]uint32{0x03fae7c2, 0x036e6b89, 0x000ee4e2, 0x03eb5ba7, 0x023eb7fd, 0x00520324, 0x01c37203, 0x011fc17e, 0x003afd63, 0x001fbbf3}}, Y: Field{[10]uint32{0x035cac06, 0x023c42fe, 0x0357e973, 0x0276b3ac, 0x007bb93d, 0x01eec78a, 0x0353e421, 0x017051f1, 0x02754f74, 0x002e3a7e}}}, + {X: Field{[10]uint32{0x039fddb4, 0x0351becb, 0x002fe98f, 0x0016c097, 0x01065e78, 0x02252557, 0x021fbf36, 0x004ae4d1, 0x0156d636, 0x0002e08c}}, Y: Field{[10]uint32{0x00bd465a, 0x02771604, 0x0360cdab, 0x031a8aa3, 0x00d0b537, 0x03a7ab75, 0x03453ebf, 0x03a47917, 0x017a826f, 0x003c8f14}}}, + {X: Field{[10]uint32{0x01bdadd9, 0x005134e1, 0x002b44d5, 0x008ba246, 0x01bfb9de, 0x00b9d96a, 0x0178706e, 0x03f55248, 0x035e2035, 0x003a0074}}, Y: Field{[10]uint32{0x02956a26, 0x0186025d, 0x03478481, 0x0000fea9, 0x011c2162, 0x00678dea, 0x00868e04, 0x039bc206, 0x023427de, 0x00079920}}}, + {X: Field{[10]uint32{0x01c67f3a, 0x0123d4b3, 0x01a1c2f3, 0x01402122, 0x0029fd77, 0x01fa243f, 0x00369e50, 0x0025a4a1, 0x010e56b7, 0x003a7518}}, Y: Field{[10]uint32{0x008e4a0e, 0x02a13fad, 0x02c1f7d9, 0x008895f0, 0x031df0e6, 0x03b9145a, 0x01bfca22, 0x020b868a, 0x02ac357d, 0x002397da}}}, + {X: Field{[10]uint32{0x03b7609b, 0x0206bdb4, 0x028ff4a4, 0x022838d4, 0x00b94bae, 0x011a0021, 0x00d7aa09, 0x0377b8d0, 0x030f51d6, 0x001c70fb}}, Y: Field{[10]uint32{0x015f6b96, 0x03d5f8cc, 0x03ca4544, 0x0351264b, 0x03db6886, 0x02985690, 0x00adc4da, 0x021e8c4e, 0x00dc2f80, 0x0013459d}}}, + {X: Field{[10]uint32{0x027d6f20, 0x02670392, 0x03947ce9, 0x020f055e, 0x0121aadb, 0x00e2aeb1, 0x038b44d9, 0x03107ef7, 0x0243b6f5, 0x002559f3}}, Y: Field{[10]uint32{0x03a35538, 0x0280084c, 0x00fe35e2, 0x0366cb79, 0x011fd0fd, 0x011730d7, 0x0247ca89, 0x028c6029, 0x0317031e, 0x00327618}}}, + {X: Field{[10]uint32{0x02dcc141, 0x02c8ade3, 0x0163eb9d, 0x014c3f62, 0x014f8fc7, 0x00468648, 0x033de850, 0x019ce442, 0x014f8116, 0x000d148f}}, Y: Field{[10]uint32{0x0022ac90, 0x03a43121, 0x01ce77d6, 0x0213c9df, 0x02877bca, 0x009df62e, 0x000a0660, 0x0223ae6e, 0x01fe268b, 0x002403ee}}}, + {X: Field{[10]uint32{0x03c1bd98, 0x002b5e78, 0x01278159, 0x03f2d873, 0x01f2993d, 0x0083973c, 0x034350bf, 0x010f7e8b, 0x037e5f1c, 0x001a7f47}}, Y: Field{[10]uint32{0x0051d7f3, 0x0327ce9b, 0x01615043, 0x008caf37, 0x0302d1c9, 0x0249de5c, 0x0315665a, 0x02502bb6, 0x02cf8b74, 0x0018cdc9}}}, + {X: Field{[10]uint32{0x014a3de7, 0x021e2bfa, 0x03aa2a9f, 0x01d78c5f, 0x02411b2a, 0x02d3f1ae, 0x006dd39b, 0x02e3dcc5, 0x0024c28c, 0x003930b1}}, Y: Field{[10]uint32{0x0321ae89, 0x022a527a, 0x01158fcc, 0x023a6cef, 0x01c86137, 0x00814573, 0x02607398, 0x017bd236, 0x03e8468e, 0x003ee345}}}, + {X: Field{[10]uint32{0x00e32773, 0x035ec78d, 0x019ea5de, 0x004c8984, 0x0398e445, 0x03125218, 0x01feb590, 0x005b4270, 0x019aada9, 0x0015c411}}, Y: Field{[10]uint32{0x023871bc, 0x00fb2939, 0x009f0738, 0x00abccfd, 0x02905bf1, 0x002a0d57, 0x016b4093, 0x00e96139, 0x01bdd2d8, 0x002277bb}}}, + {X: Field{[10]uint32{0x03d48e64, 0x0085e81b, 0x01bc189b, 0x02a642e1, 0x0359a3a8, 0x01c406c9, 0x0017f913, 0x001b856b, 0x02d41718, 0x00355beb}}, Y: Field{[10]uint32{0x00a6652c, 0x00c511cd, 0x038c76d7, 0x01de9221, 0x01ebe439, 0x00da3d52, 0x02f513f5, 0x02cb5ad8, 0x02c33408, 0x003ea1c7}}}, + {X: Field{[10]uint32{0x02599bcb, 0x014976ea, 0x003f7604, 0x004a0134, 0x00cb5cf0, 0x03b7e1f7, 0x0347be8e, 0x02016da2, 0x02ebda0b, 0x0039d05b}}, Y: Field{[10]uint32{0x01a56c19, 0x03d510ae, 0x01185bbc, 0x00dc4ec4, 0x03533d4f, 0x01f90c52, 0x03eb4c77, 0x0159f8c4, 0x0316f11c, 0x00218431}}}, + {X: Field{[10]uint32{0x01fa997d, 0x03c581f5, 0x0175f2d5, 0x0291b980, 0x02a4fbfc, 0x00f38cb1, 0x00606081, 0x00d50647, 0x0062ebdd, 0x00232966}}, Y: Field{[10]uint32{0x037698f4, 0x0355a478, 0x031c6980, 0x03bbeab5, 0x01113dd6, 0x00ac5343, 0x01fa1950, 0x03fab1ab, 0x000fb132, 0x002abcd2}}}, + {X: Field{[10]uint32{0x03243413, 0x02e9bc54, 0x0218172f, 0x0314a30a, 0x036eb8e4, 0x011b1480, 0x015867a8, 0x00ed1464, 0x00451fd4, 0x001925b7}}, Y: Field{[10]uint32{0x004da1f2, 0x01358939, 0x03e87cb1, 0x02f1722c, 0x03153fe2, 0x00a4b3c6, 0x00a281b9, 0x03267b80, 0x00410f85, 0x000113f7}}}, + {X: Field{[10]uint32{0x01925a5d, 0x02cbf064, 0x035d6c9c, 0x008753a3, 0x0067d207, 0x032b3348, 0x00bc248d, 0x0105aa8e, 0x0063aa82, 0x000e9091}}, Y: Field{[10]uint32{0x02fa9fb2, 0x01e11922, 0x03ca9c31, 0x02fea949, 0x00d4857a, 0x01f206fc, 0x00775cb3, 0x0096450d, 0x0063fd24, 0x001c6959}}}, + {X: Field{[10]uint32{0x0178c2e6, 0x01344274, 0x03418157, 0x0079ade1, 0x03881178, 0x02a17f98, 0x03f7985a, 0x014652b6, 0x030551d5, 0x001aa516}}, Y: Field{[10]uint32{0x0357ac44, 0x03a67fe6, 0x01d31924, 0x03c4c989, 0x0380df9a, 0x0099f289, 0x0021fc0d, 0x02a0d8c9, 0x003a1ca3, 0x00061b4d}}}, + {X: Field{[10]uint32{0x02add47f, 0x03f5df4e, 0x008aac9f, 0x003adfe3, 0x0132baac, 0x031704ec, 0x027381b8, 0x0012dedf, 0x0292682d, 0x0004fc7d}}, Y: Field{[10]uint32{0x02e99f0e, 0x02a92b89, 0x03ce2282, 0x00cce311, 0x03433725, 0x01745003, 0x03368528, 0x03fe227a, 0x01e49622, 0x0015ca81}}}, + {X: Field{[10]uint32{0x02804330, 0x0198d2f4, 0x02522a51, 0x001f9533, 0x01a27007, 0x03b6ddfd, 0x018e7b33, 0x03a3c7b6, 0x03c14f0d, 0x001e7e84}}, Y: Field{[10]uint32{0x01987c65, 0x02247bb5, 0x03aa096e, 0x02ad68bb, 0x00cf2484, 0x0183dc66, 0x001e40e0, 0x027b9cfd, 0x0188e196, 0x0028252f}}}, + {X: Field{[10]uint32{0x0133130a, 0x0280f6f9, 0x011019dd, 0x01f6ecf7, 0x01fb0837, 0x029b6acf, 0x033f7350, 0x006fdf09, 0x02dbd2c6, 0x0037c7fd}}, Y: Field{[10]uint32{0x023f886e, 0x02584764, 0x02824fd1, 0x02dd6ac3, 0x00cd0061, 0x023452a5, 0x025c969d, 0x021a264b, 0x03ad68c5, 0x0000bf71}}}, + {X: Field{[10]uint32{0x02cbdb34, 0x021b4a86, 0x032ec51d, 0x006f7de5, 0x032bff65, 0x00204331, 0x00f87760, 0x00e6b460, 0x02805f59, 0x002a088c}}, Y: Field{[10]uint32{0x03c2dfba, 0x013fed45, 0x025b5278, 0x00ab52c4, 0x01e7f2ef, 0x00010dd4, 0x02ea9b44, 0x00d8caca, 0x010f982e, 0x0025a056}}}, + {X: Field{[10]uint32{0x004c7c44, 0x01a9a212, 0x018c479e, 0x02b6e8ff, 0x02b3780f, 0x00f1ce4c, 0x010ada16, 0x02fd61a6, 0x00c049f3, 0x00101ac3}}, Y: Field{[10]uint32{0x036503dd, 0x008205f7, 0x012d31bb, 0x00ca1646, 0x028b2179, 0x0062bb9f, 0x0074fe02, 0x023951e4, 0x00eff250, 0x002aac39}}}, + {X: Field{[10]uint32{0x0116bcc8, 0x00cc033d, 0x014604b7, 0x03ab6eb2, 0x00523c81, 0x031366f2, 0x00f103db, 0x011e70f7, 0x03fd5783, 0x00139c10}}, Y: Field{[10]uint32{0x002d1133, 0x014f5a7a, 0x007fa98f, 0x02d9ce93, 0x0177c859, 0x01b24989, 0x0033ead6, 0x006f47a0, 0x03b73ed0, 0x000658a1}}}, + {X: Field{[10]uint32{0x033e9997, 0x03d003c3, 0x0344e43c, 0x0003a74b, 0x00a7d55b, 0x03c9301c, 0x0175c0ef, 0x0297d641, 0x0271b945, 0x002a68a9}}, Y: Field{[10]uint32{0x020c6285, 0x029636db, 0x014ca5b2, 0x0390ed1b, 0x039ae22c, 0x03dfcbcf, 0x03f957ca, 0x009c5459, 0x0220cb97, 0x001b3517}}}, + {X: Field{[10]uint32{0x003d3c01, 0x028ffca2, 0x0208b22b, 0x031da01d, 0x0312b2de, 0x00c569bb, 0x0247ae49, 0x02ba23ee, 0x039475ff, 0x001a4a84}}, Y: Field{[10]uint32{0x02e46131, 0x0197059b, 0x0340685a, 0x00fc2018, 0x00c83477, 0x029df458, 0x02867321, 0x01295302, 0x034a03c1, 0x001d3756}}}, + {X: Field{[10]uint32{0x022cfad8, 0x02aa3235, 0x016e77dd, 0x02b3d740, 0x01063b44, 0x0003f352, 0x0128e75d, 0x00e2ee22, 0x01fd1566, 0x000dbe45}}, Y: Field{[10]uint32{0x0042e8b9, 0x01fd76fa, 0x00e3c0cf, 0x02c38dff, 0x02991dc8, 0x008b3db7, 0x0217d027, 0x03460d7b, 0x02b616ed, 0x0000fc47}}}, + {X: Field{[10]uint32{0x02a53b31, 0x028e3592, 0x02c8f99a, 0x01f82ece, 0x00a5202a, 0x00d90c51, 0x002fd6ca, 0x00302d51, 0x035a7e01, 0x000fc3db}}, Y: Field{[10]uint32{0x0035c649, 0x027f41c3, 0x01f9ab86, 0x035fc4f3, 0x03ab1f9e, 0x02c3fecf, 0x00099acd, 0x038a6a54, 0x03cf5b33, 0x00095d35}}}, + {X: Field{[10]uint32{0x00b7b067, 0x02559ccd, 0x00cfd26b, 0x03eaff00, 0x03508a9d, 0x024aab3c, 0x01d4258a, 0x019876c8, 0x02ff071f, 0x0023163e}}, Y: Field{[10]uint32{0x03944893, 0x0285359c, 0x0273f694, 0x01c56778, 0x01e9a8a1, 0x002c44c9, 0x03d08a88, 0x013b8a10, 0x0094ea1d, 0x000e347a}}}, + {X: Field{[10]uint32{0x01da78de, 0x021fedf1, 0x03a9c0f2, 0x020219ad, 0x02dbc6f5, 0x036502c4, 0x03918642, 0x0068f192, 0x031a205c, 0x0036019c}}, Y: Field{[10]uint32{0x01d0e05e, 0x030bafb3, 0x02ba8d43, 0x001b4907, 0x03704020, 0x018d497e, 0x01da8318, 0x01eaedcd, 0x00302ff5, 0x0021c2a1}}}, + {X: Field{[10]uint32{0x03848648, 0x0108138a, 0x02741335, 0x00244ae6, 0x03416bde, 0x029f3765, 0x01de1515, 0x02c10693, 0x037e195d, 0x001f6f68}}, Y: Field{[10]uint32{0x00715e71, 0x03ec00c4, 0x00cf3885, 0x006a1ea3, 0x03e1c026, 0x00bd82a7, 0x0284ff13, 0x0001c3f7, 0x007a649d, 0x0020f227}}}, + {X: Field{[10]uint32{0x03ec54a1, 0x0233ba00, 0x0245e58d, 0x0149f52f, 0x03410a1b, 0x02dddb3e, 0x038ee093, 0x02c38b7d, 0x03c0c803, 0x0022bf08}}, Y: Field{[10]uint32{0x012ed76b, 0x03ba270d, 0x035b401b, 0x028ae5fa, 0x02bf7b11, 0x0218e52f, 0x02529573, 0x039282ce, 0x02ce4f4a, 0x002c107b}}}, + {X: Field{[10]uint32{0x0252207b, 0x02e4084d, 0x0211236f, 0x033795e1, 0x031b2531, 0x01588452, 0x0003b4b2, 0x03eac12e, 0x00c22c50, 0x00139109}}, Y: Field{[10]uint32{0x01796e6f, 0x02e74376, 0x02ab57e7, 0x0297052d, 0x03889d5c, 0x02c33c90, 0x03421e4f, 0x01c4603e, 0x01815118, 0x0008afd8}}}, + {X: Field{[10]uint32{0x02e97453, 0x024a5079, 0x023828fd, 0x03bb24ee, 0x02f394b1, 0x038e6cd2, 0x0016e396, 0x002be282, 0x03885a23, 0x00181c5d}}, Y: Field{[10]uint32{0x00dc4b26, 0x03d005c0, 0x016f49f8, 0x03ea278d, 0x03fc0a18, 0x037db6e1, 0x03247620, 0x02906c53, 0x029f2b9d, 0x002a137c}}}, + {X: Field{[10]uint32{0x00af3213, 0x00b28923, 0x022ac602, 0x01a40b70, 0x00a271f1, 0x02b3dc39, 0x03bbf8df, 0x015bb0de, 0x0120384e, 0x00327dcf}}, Y: Field{[10]uint32{0x01fb5437, 0x02897e23, 0x02cb069e, 0x022e5d85, 0x0089070e, 0x02fd6d5e, 0x03c9bfa8, 0x025606dc, 0x03f4c77f, 0x001d88b9}}}, + {X: Field{[10]uint32{0x0245282a, 0x0297b6bb, 0x03c4a81e, 0x02718c2f, 0x01a8b995, 0x023643db, 0x002bfea4, 0x0287630f, 0x01fbdab5, 0x00067a97}}, Y: Field{[10]uint32{0x01f1d56c, 0x03876e3f, 0x00c653b8, 0x0275f5b9, 0x00870a95, 0x03cc1ec7, 0x03a4d62a, 0x02f605f0, 0x015d0014, 0x0003084a}}}, + {X: Field{[10]uint32{0x01617b58, 0x032f9b70, 0x025cb290, 0x01a5c5f7, 0x02047806, 0x02febe14, 0x030e1491, 0x030a4b37, 0x031e30b2, 0x001592f6}}, Y: Field{[10]uint32{0x022b1c0d, 0x013dd39f, 0x01984700, 0x00703aee, 0x0332508c, 0x01dfd777, 0x02841988, 0x02e57e67, 0x00e86fc0, 0x0026a368}}}, + {X: Field{[10]uint32{0x010bf06b, 0x011a54df, 0x023b54bf, 0x00778376, 0x0150b39d, 0x02fb81ce, 0x02e21237, 0x039b3249, 0x00424f3e, 0x0016f24e}}, Y: Field{[10]uint32{0x00fd5d16, 0x0277a908, 0x01e00c11, 0x00eda52d, 0x0032bb00, 0x035d4e94, 0x03f4bd4c, 0x01e2f82d, 0x03a96627, 0x00353a70}}}, + {X: Field{[10]uint32{0x00b7f99e, 0x036e6f17, 0x003a5980, 0x00b68ba3, 0x035b2a5f, 0x02071f5f, 0x02f4fc31, 0x022d5cfb, 0x0294829e, 0x000650cb}}, Y: Field{[10]uint32{0x02bcbcf6, 0x039caee6, 0x003f7a4b, 0x0205715c, 0x032e8607, 0x01b806b3, 0x029316e3, 0x02159eed, 0x019e5c5b, 0x003dd726}}}, + {X: Field{[10]uint32{0x00080b8d, 0x00c33688, 0x01672ea2, 0x0346fbbc, 0x018d0235, 0x002c6d56, 0x02c28bfa, 0x0338668b, 0x001e6196, 0x0034e64a}}, Y: Field{[10]uint32{0x0168aa19, 0x013468d4, 0x03ea9638, 0x03c357b6, 0x03d5483c, 0x017ae90c, 0x02949319, 0x0338e8cf, 0x029520ff, 0x0000729f}}}, + {X: Field{[10]uint32{0x00e73c88, 0x032a3a84, 0x026bae21, 0x025dd2b8, 0x0239372e, 0x000bd995, 0x01f55563, 0x03ea7f95, 0x035ab220, 0x001b2138}}, Y: Field{[10]uint32{0x0101b2b3, 0x02d30084, 0x029b89a7, 0x0195c7bf, 0x0001d154, 0x003a2c8d, 0x01711e7b, 0x00b02b52, 0x032abd44, 0x00262846}}}, + {X: Field{[10]uint32{0x00f8f64b, 0x002a0328, 0x00858118, 0x02dba77d, 0x03ec4205, 0x020ef601, 0x0397f14c, 0x0117b685, 0x018ab1b0, 0x001e0533}}, Y: Field{[10]uint32{0x0115f33b, 0x038e34ed, 0x022841b0, 0x00c106bc, 0x036bf177, 0x03798eb7, 0x03e8b704, 0x02e3ffd4, 0x0240edc8, 0x003be45f}}}, + {X: Field{[10]uint32{0x0196235f, 0x0381b1c2, 0x03993fb6, 0x0035c4e2, 0x02444e71, 0x034a014c, 0x01accfcc, 0x008aa2ff, 0x02831c8e, 0x001e807b}}, Y: Field{[10]uint32{0x001a5519, 0x009f9f0a, 0x00b41045, 0x02606058, 0x00dcb061, 0x024370ef, 0x02f2e080, 0x0170aad8, 0x01091989, 0x003f944b}}}, + {X: Field{[10]uint32{0x039bd908, 0x02085f07, 0x000ce72e, 0x01bcfcf9, 0x01512e85, 0x0352979e, 0x00b56605, 0x0327be46, 0x02bcdf86, 0x001957b9}}, Y: Field{[10]uint32{0x02f87721, 0x0253d8c4, 0x035c3cae, 0x02e848f7, 0x037dfdef, 0x002079a6, 0x0196ea9d, 0x02c217ce, 0x01a691fc, 0x0032fae9}}}, + {X: Field{[10]uint32{0x025219bb, 0x021fb877, 0x01d9e1cf, 0x0051103c, 0x003d4d48, 0x01e045ef, 0x00be25fe, 0x01cba3ac, 0x0009fb03, 0x003af5a0}}, Y: Field{[10]uint32{0x0258814b, 0x039e6d2e, 0x0068bd8c, 0x02dbfd96, 0x036da8cd, 0x02f6dd7c, 0x00aed2d6, 0x037d56fc, 0x02386f96, 0x0023bedf}}}, + {X: Field{[10]uint32{0x01a3865b, 0x0358ed86, 0x039149f1, 0x033c45a3, 0x028b7834, 0x01f56af5, 0x015cf051, 0x016eed3a, 0x00189ac0, 0x0021cd02}}, Y: Field{[10]uint32{0x00480838, 0x00fe4f05, 0x0330cdf6, 0x03eb78af, 0x027d24c0, 0x03eb828f, 0x01d4deed, 0x003c5724, 0x012772ce, 0x0027c7ef}}}, + {X: Field{[10]uint32{0x00513df3, 0x03cb18cc, 0x0368ba12, 0x0136aa5b, 0x035dda3a, 0x0055a432, 0x0262e925, 0x01eed937, 0x0213b02a, 0x00186dac}}, Y: Field{[10]uint32{0x02b6144e, 0x01894230, 0x03d56e01, 0x03994e65, 0x03c42c6c, 0x03000e86, 0x02d29628, 0x020650da, 0x00f24eff, 0x00331c6e}}}, + {X: Field{[10]uint32{0x0125fe37, 0x0028190e, 0x0187298f, 0x0388060b, 0x02ed5e02, 0x02126106, 0x01c9e663, 0x006b8b8e, 0x024d7717, 0x0012e9fb}}, Y: Field{[10]uint32{0x0296dbd6, 0x0371cd23, 0x004f1f1f, 0x03ddd46f, 0x035a9da4, 0x02029c9b, 0x032158eb, 0x013c5b2d, 0x01b4fe34, 0x001736f5}}}, + {X: Field{[10]uint32{0x008badb7, 0x011f9bc8, 0x01de2ee2, 0x01c7fa78, 0x026f9a39, 0x01a24ba6, 0x025bd7a4, 0x037350cb, 0x027fc4d5, 0x0035609e}}, Y: Field{[10]uint32{0x0098e1fa, 0x03c28698, 0x00f18ca0, 0x0298ed4b, 0x002fb667, 0x02c8f183, 0x02fb5349, 0x00303d87, 0x02dc9d0e, 0x003de43e}}}, + {X: Field{[10]uint32{0x03237633, 0x032e6ca4, 0x0098d411, 0x03f72894, 0x01e9086d, 0x027bf9a4, 0x0144d4a8, 0x0033df03, 0x01597f95, 0x00207b14}}, Y: Field{[10]uint32{0x039a1e7f, 0x0182dcfa, 0x000655fa, 0x028aaa0a, 0x000741d3, 0x03e4bed8, 0x0253f28e, 0x03e03251, 0x03ddc9ef, 0x002216c9}}}, + {X: Field{[10]uint32{0x02b6dec7, 0x02e8bf5a, 0x01e684cd, 0x01e762b2, 0x026e7237, 0x03c2bfc7, 0x023e06da, 0x03da01da, 0x01f4a0d4, 0x000a3f10}}, Y: Field{[10]uint32{0x01657225, 0x0328aa92, 0x01f54d80, 0x0236c421, 0x01482c6a, 0x0056c8d7, 0x02b9415c, 0x02af1cfa, 0x031e7aff, 0x002c792b}}}, + {X: Field{[10]uint32{0x03ae4f47, 0x02c62a3d, 0x035d1328, 0x02333d66, 0x036341a8, 0x01fe8be7, 0x00f5b857, 0x01d71f2c, 0x03d6c5bf, 0x003579d4}}, Y: Field{[10]uint32{0x00a1bff9, 0x00315031, 0x013cffaf, 0x003765e5, 0x02fc2f38, 0x03b359ba, 0x018a10c8, 0x0068c894, 0x00b98eb0, 0x00346a95}}}, + {X: Field{[10]uint32{0x0076e836, 0x03521cc5, 0x0286d8ba, 0x00f5d624, 0x01257d41, 0x0130696a, 0x0008fac4, 0x010a5f98, 0x015d8909, 0x0005a08d}}, Y: Field{[10]uint32{0x0309cf4a, 0x001151ba, 0x02a0278d, 0x03677b53, 0x002ec9c2, 0x014fb613, 0x0059b11d, 0x024327a1, 0x0362e29f, 0x0013da71}}}, + {X: Field{[10]uint32{0x03e781db, 0x000902c8, 0x032e7903, 0x006b4089, 0x0273425d, 0x03311b88, 0x03511a78, 0x02b9ccba, 0x005fb64c, 0x0027bdea}}, Y: Field{[10]uint32{0x009ce73c, 0x02ce61f4, 0x0204b03e, 0x027ce9dd, 0x0278a50c, 0x03d7a4b8, 0x035e2f20, 0x01691cfc, 0x016f6f6a, 0x0031c80d}}}, + {X: Field{[10]uint32{0x02e915ec, 0x03b1c280, 0x03612dd7, 0x01a304f3, 0x02021744, 0x03383aaa, 0x031be48a, 0x02694932, 0x03b36f42, 0x0013daba}}, Y: Field{[10]uint32{0x038e761f, 0x0082c473, 0x036c6396, 0x01ba1e03, 0x010b28f9, 0x014adb5f, 0x02d36092, 0x035e400a, 0x014da8b6, 0x00101ab6}}}, + {X: Field{[10]uint32{0x023f8232, 0x01586ec8, 0x01f8e088, 0x03c690ac, 0x037a3cc7, 0x03035fa2, 0x0310dae5, 0x00b99999, 0x020e5ac0, 0x00132b0f}}, Y: Field{[10]uint32{0x03263142, 0x00168232, 0x019318ba, 0x015b0bf9, 0x03dca655, 0x0230a749, 0x03fcb9cd, 0x03cf2013, 0x008eaa96, 0x0024e5bb}}}, + {X: Field{[10]uint32{0x039367b8, 0x0282983d, 0x0193738e, 0x01e18186, 0x02f61fbd, 0x01931d81, 0x00a9dd10, 0x02b15cb1, 0x00633aa2, 0x00021bcd}}, Y: Field{[10]uint32{0x01824f05, 0x008f9609, 0x0312a03f, 0x0186d6b9, 0x03cfb2aa, 0x02d30e2b, 0x0376c9fd, 0x01e76d7d, 0x012b5561, 0x003200bf}}}, + {X: Field{[10]uint32{0x007103a9, 0x0371ffcd, 0x034da318, 0x008ee8f5, 0x000bcd6f, 0x0074e7ea, 0x025ab4cd, 0x03848f9e, 0x01457685, 0x0014c8fc}}, Y: Field{[10]uint32{0x00691cb1, 0x0000de22, 0x028e3461, 0x03c7fb87, 0x0394cab4, 0x02efce3e, 0x01ec977c, 0x02ca784b, 0x0379eccc, 0x000c24be}}}, + {X: Field{[10]uint32{0x03ea74fd, 0x03c45e0c, 0x030e71a7, 0x001a60ff, 0x03f85cf1, 0x02838717, 0x000c45f3, 0x00471f9a, 0x01464027, 0x0034f5c3}}, Y: Field{[10]uint32{0x00d07bad, 0x01bd896a, 0x03c90fdf, 0x03cf855d, 0x01e4f722, 0x03ba9fee, 0x0093b9e0, 0x003cc45a, 0x0373d9b9, 0x00246609}}}, + {X: Field{[10]uint32{0x036d4359, 0x02192ef6, 0x02fdd6fd, 0x03e86ac7, 0x01f8cb89, 0x00d953c7, 0x01b5d714, 0x01d84c0b, 0x013728a8, 0x0037d8ee}}, Y: Field{[10]uint32{0x02ce5510, 0x02b2ded8, 0x012a791b, 0x035212de, 0x02a2c7be, 0x00cbe96c, 0x03930348, 0x00fb2db1, 0x01ca191a, 0x001f0ede}}}, + {X: Field{[10]uint32{0x01b70c74, 0x01afa15c, 0x00ec3974, 0x02531f7b, 0x0328a994, 0x0138898a, 0x0303169a, 0x00d3657c, 0x02228cc3, 0x003c7fa4}}, Y: Field{[10]uint32{0x0351a10e, 0x03944db9, 0x02b6469d, 0x00d630a3, 0x03b67a24, 0x0266bc78, 0x0335f60f, 0x03e9ca8a, 0x03b84e65, 0x0015623c}}}, + {X: Field{[10]uint32{0x0274fd95, 0x0324216e, 0x03c7dcb3, 0x02d7e8a7, 0x00fb0adb, 0x01f2ca34, 0x03ec14cb, 0x028cc3b7, 0x035d918c, 0x00240c39}}, Y: Field{[10]uint32{0x00b427f7, 0x0366768e, 0x004cd71a, 0x0304eef7, 0x035a452d, 0x00e2b7b5, 0x0128821c, 0x02261302, 0x01286169, 0x001f7c80}}}, + {X: Field{[10]uint32{0x03ad641a, 0x01f3d71d, 0x007d5ddd, 0x0218b0f3, 0x03dfa0b5, 0x01d9047a, 0x00f628c5, 0x036e1c4d, 0x013935be, 0x000734f0}}, Y: Field{[10]uint32{0x039a324d, 0x012f7852, 0x02bcf592, 0x03c40c3e, 0x0288264c, 0x03211ec9, 0x013a25e0, 0x02ec22fa, 0x01f25488, 0x0008553b}}}, + {X: Field{[10]uint32{0x0046ad96, 0x03c49f49, 0x01f42202, 0x03feb265, 0x03bd6e91, 0x03b0356e, 0x039f4621, 0x03b1f1e2, 0x0337a19f, 0x00395b81}}, Y: Field{[10]uint32{0x02ad70d7, 0x02226a8f, 0x0177698f, 0x00bd2cbb, 0x011e69b4, 0x01a4fa5d, 0x028d9bbb, 0x01d83902, 0x0027368c, 0x00220c36}}}, + {X: Field{[10]uint32{0x03b6b101, 0x0398fc57, 0x02657587, 0x0219e021, 0x0156fd08, 0x012b6299, 0x026dfeb2, 0x03978d8f, 0x02c458ab, 0x0006c29a}}, Y: Field{[10]uint32{0x035178dc, 0x00b3124c, 0x01926521, 0x01acb87d, 0x029a35e8, 0x03777b97, 0x033e5aab, 0x018e8ac4, 0x03dae642, 0x0034b7db}}}, + {X: Field{[10]uint32{0x03ea22b2, 0x03302048, 0x00679d80, 0x01d9173f, 0x0250bb16, 0x011b58a8, 0x01390a62, 0x0186393b, 0x01468fd4, 0x00042850}}, Y: Field{[10]uint32{0x0140185f, 0x00ce003f, 0x015620b0, 0x0096f0c3, 0x01f9a09b, 0x013aec54, 0x0113dbaf, 0x03746bb3, 0x0068dd7f, 0x000ce0ee}}}, + {X: Field{[10]uint32{0x003f5e35, 0x00f90669, 0x006ac8a7, 0x035e5755, 0x02e357f7, 0x01a2be9c, 0x038837e5, 0x028d45b6, 0x03515378, 0x0027712a}}, Y: Field{[10]uint32{0x0305903f, 0x02359a98, 0x01a06cc6, 0x0386410e, 0x02bfe05c, 0x03a9647b, 0x02422be1, 0x033eff8a, 0x022d9bce, 0x0002376a}}}, + {X: Field{[10]uint32{0x00ed7196, 0x02b1db8f, 0x035de1aa, 0x0264d880, 0x0213539e, 0x0226c82b, 0x038eb19e, 0x0387ef14, 0x035de7a4, 0x002aa4c5}}, Y: Field{[10]uint32{0x02afb9ad, 0x02e192b0, 0x01a05eff, 0x01afb38f, 0x00c18d14, 0x022d2001, 0x03e133ad, 0x0115a27c, 0x0304c134, 0x003b73b6}}}, + {X: Field{[10]uint32{0x022edf7b, 0x03bdbec8, 0x00e27536, 0x03e8d753, 0x0294f3ce, 0x0341b31a, 0x036fcbc6, 0x0366822e, 0x03e4da02, 0x00205c7c}}, Y: Field{[10]uint32{0x01e6dd6b, 0x0272967a, 0x03189749, 0x02de9963, 0x03c32038, 0x00f06993, 0x002b55f7, 0x00aae870, 0x01fcaae6, 0x003a46f9}}}, + {X: Field{[10]uint32{0x02a19ab6, 0x00201606, 0x024b111b, 0x009d0dd1, 0x01893fe6, 0x031e73de, 0x01888c93, 0x00a3998d, 0x0183c891, 0x00147db2}}, Y: Field{[10]uint32{0x0081a067, 0x003c164e, 0x03252a3d, 0x0003578d, 0x00b8cee4, 0x02a37194, 0x001dbf41, 0x0193d483, 0x01494bb1, 0x00174bbc}}}, + {X: Field{[10]uint32{0x03d7d38a, 0x002ae3db, 0x02580950, 0x02b1d36b, 0x03ec34df, 0x036c3769, 0x01016b19, 0x00c371a9, 0x0184766b, 0x0030287c}}, Y: Field{[10]uint32{0x02c6f01e, 0x024d65fa, 0x01490528, 0x007b1a57, 0x01b27f36, 0x009349aa, 0x01410516, 0x036bc4a7, 0x03e2c7b6, 0x002f72b4}}}, + {X: Field{[10]uint32{0x03a0eb02, 0x00e51c8c, 0x00a222bd, 0x026c7ade, 0x02fde927, 0x00d07bee, 0x02b6fe07, 0x0145a412, 0x02cc9543, 0x002c6ec7}}, Y: Field{[10]uint32{0x001689a8, 0x02fead32, 0x021d55a7, 0x02137931, 0x014b1490, 0x01c78325, 0x00dbf0a6, 0x010b8b03, 0x035b5253, 0x0037d48f}}}, + {X: Field{[10]uint32{0x000b5dce, 0x00f79f59, 0x00470180, 0x039da063, 0x023b0891, 0x010dce47, 0x0139ea7e, 0x013b5621, 0x00dc86d0, 0x002d730c}}, Y: Field{[10]uint32{0x02d4ec14, 0x00798bd0, 0x00b65ca4, 0x0077fff9, 0x009f5556, 0x00b80fca, 0x031acc86, 0x00c4b43e, 0x019e45c7, 0x003c7303}}}, + {X: Field{[10]uint32{0x0263ccb6, 0x03a503e4, 0x016b0da8, 0x008d47f8, 0x008cacee, 0x01f56507, 0x0155b3ea, 0x03fd4ca0, 0x01e705f0, 0x00378ad2}}, Y: Field{[10]uint32{0x018de99f, 0x01364fdb, 0x032ab74b, 0x02d5c0d5, 0x024690d5, 0x01e0552b, 0x017c6801, 0x02fd9ec3, 0x002bb12d, 0x000d35e9}}}, + {X: Field{[10]uint32{0x03cc8f51, 0x017cf395, 0x0311ad51, 0x02c3bcbb, 0x00ea5c0d, 0x0161c33f, 0x00984046, 0x03845c3a, 0x00e7c129, 0x0022c63d}}, Y: Field{[10]uint32{0x01111f37, 0x00b80226, 0x00aff884, 0x009f9acb, 0x0372281c, 0x0323b72c, 0x01e9d6cd, 0x012964f1, 0x0086c867, 0x001ac784}}}, + {X: Field{[10]uint32{0x03c86889, 0x0160aa45, 0x03442f9e, 0x0092da97, 0x01822ce4, 0x018aa0c3, 0x00e46f17, 0x03222246, 0x02c027ce, 0x001c9c58}}, Y: Field{[10]uint32{0x03223cca, 0x01bce28b, 0x02e7e841, 0x008f3145, 0x03248656, 0x024f9491, 0x03de5af6, 0x028da79b, 0x02961452, 0x00378d20}}}, + {X: Field{[10]uint32{0x0105058c, 0x0215adcd, 0x016056d0, 0x03f28fd8, 0x02946a75, 0x0309252f, 0x00eb9b81, 0x01d20fc6, 0x001f4dd1, 0x0012b93f}}, Y: Field{[10]uint32{0x032563e7, 0x011a4843, 0x017a39ae, 0x00db8b18, 0x0059999b, 0x0361e11c, 0x0034a05b, 0x03f05f68, 0x0012e901, 0x00361f9e}}}, + {X: Field{[10]uint32{0x03f43cd1, 0x00548197, 0x010bf58b, 0x02e93bda, 0x0272007b, 0x01abff40, 0x0026f016, 0x01cffa46, 0x01ace9e8, 0x003a42f2}}, Y: Field{[10]uint32{0x0164fa87, 0x0398d811, 0x02d58905, 0x00b34b95, 0x0147f076, 0x0196e6ff, 0x009b0c00, 0x03f5a147, 0x00e89acd, 0x0012f208}}}, + {X: Field{[10]uint32{0x011450ba, 0x0101db7d, 0x010209af, 0x0295fc14, 0x0208340b, 0x03a7bdd1, 0x021af7db, 0x00bedbde, 0x02a1db43, 0x002e82b9}}, Y: Field{[10]uint32{0x012be720, 0x021dabe4, 0x02908c58, 0x00630cba, 0x0351019a, 0x0068b0c2, 0x029894c5, 0x0250805c, 0x01b70409, 0x001f4e0e}}}, + {X: Field{[10]uint32{0x03accfeb, 0x020808b4, 0x03a5def8, 0x02fca607, 0x034f9682, 0x035ee5f5, 0x018b403e, 0x0194c476, 0x0381f77c, 0x001c1986}}, Y: Field{[10]uint32{0x02d06387, 0x02f13929, 0x0277e4e5, 0x02497d19, 0x027b4eeb, 0x02c1bf99, 0x024bd7cf, 0x027d366b, 0x01731895, 0x002408ae}}}, + {X: Field{[10]uint32{0x00471a47, 0x038248bf, 0x011d80e5, 0x0056347c, 0x0029451c, 0x0367be8e, 0x0381b817, 0x00e81c47, 0x03472815, 0x003f86de}}, Y: Field{[10]uint32{0x02b0f847, 0x02280d34, 0x01fae19c, 0x037c8d13, 0x0285725b, 0x03930c6a, 0x0115dc05, 0x02df1bec, 0x01cc68cf, 0x0025681d}}}, + {X: Field{[10]uint32{0x02cc3fc0, 0x01c3dfa6, 0x01e867ab, 0x00dfb171, 0x004325bc, 0x009f8e97, 0x0013d04f, 0x02a41ca0, 0x03d2bbae, 0x0022b3ce}}, Y: Field{[10]uint32{0x0216174e, 0x012195cf, 0x00785ee1, 0x03bf6f8b, 0x01b3e2e0, 0x02547e03, 0x01c06a25, 0x009f53ca, 0x03fb36da, 0x003d9e78}}}, + {X: Field{[10]uint32{0x02f395e3, 0x03aa3612, 0x0314f1d6, 0x03443283, 0x00d2db01, 0x03d8ae9f, 0x03fc6a47, 0x01f56ae1, 0x013725fc, 0x00076157}}, Y: Field{[10]uint32{0x020b1b90, 0x037234c0, 0x012a5815, 0x03436a24, 0x019b0a9a, 0x0189a317, 0x0255183f, 0x01953b51, 0x03ac2d41, 0x0033ac98}}}, + {X: Field{[10]uint32{0x012a8cba, 0x009b5c16, 0x0302e039, 0x02601147, 0x03099344, 0x01c3466d, 0x00ec6f6d, 0x01338f21, 0x016630c2, 0x0006aed1}}, Y: Field{[10]uint32{0x00525885, 0x0065521d, 0x01863f4b, 0x024d048a, 0x021778d2, 0x00c91514, 0x01886ef7, 0x01ff5cab, 0x006f6be8, 0x001189dc}}}, + {X: Field{[10]uint32{0x03eac036, 0x03cafaa4, 0x00a5fb86, 0x01992c26, 0x03620e5c, 0x0128fcc2, 0x01d07e24, 0x004bfe59, 0x00fa672c, 0x0006d1e4}}, Y: Field{[10]uint32{0x03edd60e, 0x00634939, 0x012831b0, 0x01c27278, 0x017c19fd, 0x02e0e47f, 0x022a9a06, 0x038b47ca, 0x00fca758, 0x003bb414}}}, + {X: Field{[10]uint32{0x00de3dd3, 0x00dcca9a, 0x01c98a43, 0x0280878f, 0x0344c106, 0x01584d9e, 0x01dcfc12, 0x032238c3, 0x032cfc9c, 0x001861e2}}, Y: Field{[10]uint32{0x02aed78e, 0x000037c7, 0x0229d436, 0x002dac4f, 0x03afc6f5, 0x0262a7be, 0x014cb774, 0x009e746d, 0x00a0037c, 0x003e8915}}}, + {X: Field{[10]uint32{0x0144308a, 0x010042a1, 0x030b5335, 0x006a4c5c, 0x00abc727, 0x0114088e, 0x00c21ecf, 0x03fac5ef, 0x01f02767, 0x00210123}}, Y: Field{[10]uint32{0x0193c32f, 0x03223b3a, 0x00b7c838, 0x02a90e33, 0x02605acc, 0x01dd8f1b, 0x03f9814f, 0x00239751, 0x024a39d6, 0x00351c4b}}}, + {X: Field{[10]uint32{0x02683a94, 0x02eb0cf2, 0x015cf889, 0x0032a201, 0x018ba37d, 0x01fa27e5, 0x031e1e03, 0x005d7b0f, 0x00e56c96, 0x003adeb1}}, Y: Field{[10]uint32{0x0285da8a, 0x00e053d7, 0x030112bc, 0x00ccbd45, 0x03cc07de, 0x004f7f1b, 0x00bfe075, 0x009d2db6, 0x02672ccc, 0x00125078}}}, + {X: Field{[10]uint32{0x02142e91, 0x00656bc8, 0x03eaf1a4, 0x0154e027, 0x014cbce4, 0x000a2370, 0x02b452ba, 0x012f6ad8, 0x02c9877d, 0x001228da}}, Y: Field{[10]uint32{0x0369659c, 0x0143aeaa, 0x02e2530b, 0x027087fd, 0x0027eec3, 0x013a5436, 0x02d88480, 0x018a21b1, 0x018a0125, 0x0038935b}}}, + {X: Field{[10]uint32{0x00cca1b5, 0x00b385af, 0x02a91252, 0x019320b4, 0x02e817b6, 0x02c8e803, 0x029af3b1, 0x028975e1, 0x01d05a62, 0x00270c49}}, Y: Field{[10]uint32{0x01e5afe3, 0x026daf4e, 0x03450a18, 0x0185541a, 0x01385663, 0x03863d7d, 0x00172774, 0x01c5a061, 0x0210f670, 0x0031bb36}}}, + {X: Field{[10]uint32{0x00f80d68, 0x02a479a4, 0x0116bc2c, 0x03b526bc, 0x0310160b, 0x013722f8, 0x033843e0, 0x019c371f, 0x0221dcc7, 0x000cfa07}}, Y: Field{[10]uint32{0x01757b6f, 0x024a4195, 0x01bb8fa5, 0x03a27b01, 0x029ce417, 0x03bf8e2b, 0x01f11678, 0x021b4b9b, 0x01d3a0a3, 0x0039a530}}}, + {X: Field{[10]uint32{0x036a1ad2, 0x00700cc6, 0x03056d8e, 0x012e29a3, 0x035c1d0d, 0x00256609, 0x02b10715, 0x0383f2ff, 0x029e6899, 0x002550dd}}, Y: Field{[10]uint32{0x009b0d7e, 0x01e54d3b, 0x00b163f5, 0x0219fd9a, 0x0301c4be, 0x00bb473a, 0x035f1487, 0x021041d8, 0x03fdafc5, 0x0001c033}}}, + {X: Field{[10]uint32{0x0039efdd, 0x0142099d, 0x00203a0d, 0x018f8877, 0x026ca9b1, 0x02d4201f, 0x0081e6e5, 0x00b0e5f5, 0x00d173e6, 0x0013d073}}, Y: Field{[10]uint32{0x0069f79d, 0x0339df43, 0x011eed95, 0x02ff8563, 0x008fea56, 0x02dd2c95, 0x00b309ba, 0x0065cb62, 0x02d6aa8c, 0x003efe63}}}, + {X: Field{[10]uint32{0x005f12e5, 0x03b3c819, 0x03bd9064, 0x01a91946, 0x00a667fe, 0x023baf0a, 0x03fd9c33, 0x00037ef8, 0x0245584b, 0x00133eda}}, Y: Field{[10]uint32{0x0214652b, 0x006486bd, 0x0312f550, 0x028979ca, 0x00219638, 0x00495640, 0x00fac21d, 0x003a1d1c, 0x02dafe08, 0x000b77f5}}}, + {X: Field{[10]uint32{0x01eca626, 0x005dd5dd, 0x039821f2, 0x0324605f, 0x038e536b, 0x03eb94ce, 0x02217fd8, 0x028cf297, 0x03ecd9bb, 0x0027bee2}}, Y: Field{[10]uint32{0x00658fb4, 0x003e32ac, 0x02f8e944, 0x02e21d78, 0x018e3573, 0x029f70f8, 0x00bcf9c1, 0x03057a46, 0x00ed0529, 0x001984c0}}}, + {X: Field{[10]uint32{0x0030e441, 0x039876b9, 0x02470da9, 0x03e7a143, 0x00f5d3c0, 0x02f9b717, 0x01ab953e, 0x039302e1, 0x01525be7, 0x0030aa02}}, Y: Field{[10]uint32{0x009d9d2d, 0x02713be0, 0x0277b483, 0x018f5434, 0x036be063, 0x03027ef0, 0x026fa221, 0x01a5f1f6, 0x0136bf72, 0x00074b7b}}}, + {X: Field{[10]uint32{0x03baa707, 0x010b808e, 0x0030c0a2, 0x02d006fe, 0x032501a1, 0x031882c4, 0x02162764, 0x0208afd6, 0x036b49ae, 0x0010adff}}, Y: Field{[10]uint32{0x02b71d6d, 0x00288da0, 0x028b0eb9, 0x0254317a, 0x00fb2c75, 0x032ed68e, 0x02de994d, 0x039001c4, 0x005883f0, 0x003907f8}}}, + {X: Field{[10]uint32{0x03b0c28c, 0x007c38aa, 0x0386df78, 0x02d1fb8e, 0x01e00cc3, 0x017de3ce, 0x03e15185, 0x02d904ab, 0x0129d420, 0x003b82ec}}, Y: Field{[10]uint32{0x000aec61, 0x00d0fad7, 0x01099258, 0x015552ba, 0x0154b174, 0x003b6eb7, 0x006204b6, 0x02891d9f, 0x027a5a4f, 0x003dc743}}}, + {X: Field{[10]uint32{0x00ef5b9a, 0x0121f01e, 0x02e789ca, 0x0390a894, 0x0077546c, 0x009b140f, 0x031a7160, 0x00efd499, 0x02079cdb, 0x0007c762}}, Y: Field{[10]uint32{0x03571c20, 0x027a6365, 0x01cfc5c3, 0x02a98f47, 0x00180ee4, 0x03ef0c19, 0x00e8e6f9, 0x0144b7aa, 0x030dae55, 0x00318444}}}, + {X: Field{[10]uint32{0x02a31310, 0x004bfb34, 0x017b8b29, 0x01b97e4c, 0x027cf313, 0x01063c05, 0x026ebe55, 0x027ec564, 0x0006ecdc, 0x0016f6a7}}, Y: Field{[10]uint32{0x005ecad7, 0x02370a01, 0x023feb72, 0x01a285ed, 0x03890761, 0x01cbab6c, 0x03e59d5b, 0x00983203, 0x0370dce1, 0x000d63fe}}}, + {X: Field{[10]uint32{0x03866ea6, 0x011d5137, 0x01be91f8, 0x01cd2018, 0x01edc789, 0x0383bf5c, 0x0252dec8, 0x031c9d99, 0x0103fa50, 0x0030cbd9}}, Y: Field{[10]uint32{0x01fca304, 0x02e71c40, 0x008566de, 0x00a882e0, 0x006a34af, 0x02c4fc2c, 0x0309443c, 0x03b3101e, 0x02267a13, 0x0019c8d2}}}, + {X: Field{[10]uint32{0x0089caed, 0x0337aa25, 0x03069941, 0x01ce25ae, 0x00849bb6, 0x02584990, 0x026c83f2, 0x03ac19c3, 0x0111b71f, 0x001520f5}}, Y: Field{[10]uint32{0x008c1148, 0x034e49f6, 0x03ecfbfe, 0x0141e512, 0x03494d53, 0x03639377, 0x02df0f38, 0x00d0dd02, 0x0262d323, 0x0028269a}}}, + {X: Field{[10]uint32{0x02a322ef, 0x00625603, 0x010472d5, 0x03f6710f, 0x02d5e3c6, 0x029b3091, 0x00b93425, 0x01aae47b, 0x035ff0b8, 0x000f4b63}}, Y: Field{[10]uint32{0x0155b830, 0x027cd936, 0x00509c73, 0x03b28613, 0x00fb45d7, 0x01c75d82, 0x039cf4ab, 0x03381461, 0x008b4c23, 0x0010620d}}}, + {X: Field{[10]uint32{0x01af1dc0, 0x011d5d08, 0x01e9e40b, 0x000eaae2, 0x00735ddf, 0x024daf04, 0x01ffa9df, 0x019e017f, 0x013929ed, 0x000e970e}}, Y: Field{[10]uint32{0x00a7011d, 0x020893a4, 0x0081e0dd, 0x00aea517, 0x0344dcd5, 0x00a5d720, 0x002a7de2, 0x00a458ab, 0x01197675, 0x001d82c6}}}, + {X: Field{[10]uint32{0x00590a83, 0x03752135, 0x01f900e5, 0x0120cdcf, 0x00648869, 0x03892831, 0x039272ef, 0x0301b8fb, 0x02ac7c1c, 0x0028f548}}, Y: Field{[10]uint32{0x021b6be2, 0x007cb13b, 0x00795566, 0x031a4c15, 0x0328c377, 0x000005a5, 0x01684a95, 0x03758486, 0x022cb739, 0x001bd4ee}}}, + {X: Field{[10]uint32{0x00e8180f, 0x01451176, 0x01d42367, 0x021f76e5, 0x02c1437d, 0x00b80aa8, 0x00785836, 0x00806110, 0x01311399, 0x003bc2c2}}, Y: Field{[10]uint32{0x0086c634, 0x03210ae5, 0x019801b9, 0x0029065c, 0x00217352, 0x024be31d, 0x00408cdf, 0x011dc9f4, 0x00078d18, 0x001cefd1}}}, + {X: Field{[10]uint32{0x0115da20, 0x01bd031b, 0x03e070f2, 0x01734728, 0x02a770c1, 0x01846169, 0x02118991, 0x033ae708, 0x03fd1498, 0x0020503b}}, Y: Field{[10]uint32{0x0022a474, 0x03127f40, 0x01c3e45f, 0x0008280b, 0x03051c11, 0x0058bc0e, 0x028b7eb2, 0x02dfc6f9, 0x03df6d2d, 0x00131d3c}}}, + {X: Field{[10]uint32{0x03e122f0, 0x02966f3a, 0x00b74215, 0x03c000de, 0x017603c7, 0x03f5bf59, 0x0132f4d3, 0x027c7e4f, 0x03208e08, 0x000d1175}}, Y: Field{[10]uint32{0x010b6d5b, 0x0388e922, 0x013d4b63, 0x00dfa0a5, 0x0238da06, 0x000db868, 0x03c8626f, 0x013bcce8, 0x035dfdb5, 0x001b5040}}}, + {X: Field{[10]uint32{0x03a58cd7, 0x008f50fd, 0x02b9c72c, 0x01b57f9a, 0x01789a36, 0x00493378, 0x01933f97, 0x00da6874, 0x025a6235, 0x003852ca}}, Y: Field{[10]uint32{0x01fc8f8f, 0x011342fe, 0x013be447, 0x00658954, 0x01d67a9f, 0x022a7962, 0x02fe6ce5, 0x030409b2, 0x02c52f63, 0x00085bc1}}}, + {X: Field{[10]uint32{0x01891e0b, 0x00fa4b8b, 0x00deaf8f, 0x00199cd2, 0x00eec931, 0x0302205c, 0x010b2b33, 0x02f113f3, 0x00bc8389, 0x001b6590}}, Y: Field{[10]uint32{0x0104227d, 0x00af105f, 0x0331a185, 0x02c20586, 0x0068b5d4, 0x010a21ff, 0x0204759a, 0x036d927f, 0x00856e42, 0x0012d305}}}, + {X: Field{[10]uint32{0x019b2916, 0x002bf3bf, 0x0232462a, 0x0016e781, 0x02fd028a, 0x01f00ec6, 0x027cc60d, 0x007c84fd, 0x00045c46, 0x0009cbc5}}, Y: Field{[10]uint32{0x03348416, 0x03350cea, 0x00b1e825, 0x020cc551, 0x03fd6b75, 0x0003ac37, 0x023f78d8, 0x00d4e029, 0x02c0c0b2, 0x002618d7}}}, + {X: Field{[10]uint32{0x033a07e3, 0x00ca7b87, 0x02257681, 0x013b7a45, 0x02415233, 0x0378738e, 0x01250bec, 0x01d1698c, 0x0128eaae, 0x002a3266}}, Y: Field{[10]uint32{0x03351621, 0x03358479, 0x006209f5, 0x02df9879, 0x0124ae51, 0x0058bfb4, 0x01149aa5, 0x00fdfa38, 0x0286abdf, 0x00133309}}}, + {X: Field{[10]uint32{0x00975409, 0x00e18036, 0x01ceffac, 0x01403f4c, 0x011c660d, 0x02c79320, 0x01be6869, 0x03559626, 0x03337f93, 0x003ec092}}, Y: Field{[10]uint32{0x00c7fdb0, 0x01cbd1f1, 0x01e127b0, 0x028a2765, 0x03ee562c, 0x0115e59b, 0x00730c39, 0x00f255fa, 0x02b78bff, 0x000ce5a1}}}, + {X: Field{[10]uint32{0x00562f9c, 0x021c15ca, 0x014f2351, 0x03e73912, 0x00a6cb14, 0x0246e136, 0x03ecfe36, 0x00d525dc, 0x0147aa61, 0x00383921}}, Y: Field{[10]uint32{0x00a7b307, 0x01dbbbf7, 0x03676a6d, 0x03e1a7d1, 0x03778609, 0x00e58012, 0x03488389, 0x01d60149, 0x018b5640, 0x00182db7}}}, + {X: Field{[10]uint32{0x025d16e4, 0x01bbd644, 0x02169807, 0x00f77fb0, 0x03ed9e38, 0x001786c2, 0x0374d296, 0x022d4c27, 0x002d378b, 0x002f5b10}}, Y: Field{[10]uint32{0x01ef2c24, 0x0086c8a7, 0x00f10755, 0x012de544, 0x02a27692, 0x0231b4b0, 0x036a8f8c, 0x0071ecdd, 0x009cbb76, 0x00330eab}}}, + {X: Field{[10]uint32{0x01e451c0, 0x0085eb01, 0x02ef552c, 0x02f78542, 0x01d5886c, 0x03da548d, 0x00e2c554, 0x013d1051, 0x0231eefa, 0x0039a464}}, Y: Field{[10]uint32{0x03b1cfa7, 0x02ea6b18, 0x0346bc2a, 0x03f1a49f, 0x0173a888, 0x00a8473f, 0x0156133c, 0x00984ad3, 0x01d4d34d, 0x0039d3b8}}}, + {X: Field{[10]uint32{0x003d03a9, 0x02e92868, 0x01463f9c, 0x007a3051, 0x02037c48, 0x00a2f6ce, 0x012ac5a3, 0x01e1d136, 0x006a2a48, 0x0006a6b3}}, Y: Field{[10]uint32{0x01f0fb10, 0x01f1623f, 0x01ca126a, 0x0206d26d, 0x02df71fc, 0x01ff87d7, 0x02224224, 0x00d8a3eb, 0x029a960e, 0x0002e981}}}, + {X: Field{[10]uint32{0x02070910, 0x033bd33d, 0x028d536c, 0x0108f5b6, 0x00abfde6, 0x00b6e66e, 0x004e9395, 0x038c07cb, 0x03a92e5f, 0x0016d4ae}}, Y: Field{[10]uint32{0x0347ae29, 0x01bb796d, 0x00341f54, 0x02c0bf9d, 0x02cc1ab1, 0x01c6bb42, 0x00c68f0a, 0x0089f446, 0x03dd901e, 0x00042376}}}, + {X: Field{[10]uint32{0x01e05242, 0x00ce29ac, 0x022860f1, 0x02935fe6, 0x000652b0, 0x00ef8a0a, 0x01a096a7, 0x020aa6c4, 0x03601ebe, 0x0024b04d}}, Y: Field{[10]uint32{0x02449d7c, 0x02b01b02, 0x0027559f, 0x02f74538, 0x0251a588, 0x017db1e6, 0x003dd578, 0x0343e975, 0x03fc2dc6, 0x000b8fa4}}}, + {X: Field{[10]uint32{0x014318b8, 0x03ff97c7, 0x01d69a12, 0x01e7d818, 0x0194b4f2, 0x022550af, 0x021c749e, 0x01305dce, 0x00da7996, 0x000f2dbe}}, Y: Field{[10]uint32{0x03b11956, 0x02e904da, 0x01d54d05, 0x01c5b9ac, 0x0272a777, 0x02bb8a55, 0x023bd02f, 0x016b6370, 0x01a8b4f4, 0x0010b930}}}, + {X: Field{[10]uint32{0x03dbf5db, 0x00545142, 0x0183f664, 0x01366a00, 0x013c60a1, 0x01437839, 0x01a51100, 0x00637444, 0x0351d345, 0x0017fb58}}, Y: Field{[10]uint32{0x0346c3f6, 0x0299621d, 0x036cd056, 0x0078a579, 0x01da77e0, 0x026f60dd, 0x00140b64, 0x029342dd, 0x0190de07, 0x001ade69}}}, + {X: Field{[10]uint32{0x015d3840, 0x0064f8f6, 0x0356e7d3, 0x02c7f43e, 0x00a14132, 0x0301844a, 0x00245d37, 0x0213cadf, 0x00a781c3, 0x000ae23c}}, Y: Field{[10]uint32{0x01a0e10e, 0x021cfe22, 0x02981bd4, 0x02e520e2, 0x00c1632b, 0x0089125d, 0x01b6453c, 0x01b95d95, 0x03a21144, 0x003de1f9}}}, + {X: Field{[10]uint32{0x03293443, 0x02ec0b60, 0x02fd2047, 0x0253a623, 0x0118507f, 0x0368d9c6, 0x030ac3e1, 0x0157ecd6, 0x03b15a3f, 0x0031ec91}}, Y: Field{[10]uint32{0x01b85f4f, 0x01ee341b, 0x00b6799e, 0x03d993cf, 0x00c3c8e5, 0x0309f152, 0x02b6ac8b, 0x017c448d, 0x003734c6, 0x0012ad01}}}, + {X: Field{[10]uint32{0x003647dd, 0x02a8dd78, 0x005344c6, 0x03484875, 0x0045df69, 0x00b04df8, 0x0008a201, 0x02520417, 0x01338dcb, 0x00377f6a}}, Y: Field{[10]uint32{0x03795c1b, 0x02ff96d5, 0x02091bbc, 0x015691be, 0x0095f912, 0x0161c4b4, 0x032e93ac, 0x005af565, 0x01fd02a1, 0x003a57de}}}, + {X: Field{[10]uint32{0x031da7db, 0x013fbe8d, 0x00c29da0, 0x02d99dfe, 0x029d15a6, 0x0091fa1f, 0x03e3233b, 0x02c415b1, 0x02455084, 0x00372369}}, Y: Field{[10]uint32{0x001449c3, 0x00c81211, 0x00c80931, 0x00a198df, 0x018fc66d, 0x022f5da1, 0x0207fea0, 0x03b00fda, 0x01a3fde3, 0x0030a8d1}}}, + {X: Field{[10]uint32{0x01ff5333, 0x015520b4, 0x0395b8e3, 0x0334ea31, 0x02a31547, 0x0190e415, 0x0263bc7a, 0x02fea3c4, 0x0326c5fc, 0x003d4fce}}, Y: Field{[10]uint32{0x02716ac1, 0x022f8eb9, 0x031d1bb6, 0x03b1e662, 0x035249e8, 0x005f13ec, 0x0188f1da, 0x02e72a63, 0x0145e664, 0x000044fb}}}, + {X: Field{[10]uint32{0x0246cae9, 0x0277242d, 0x03a391d8, 0x021a4c4e, 0x027d7546, 0x0365a77d, 0x021d6477, 0x012d793b, 0x03fd0c6d, 0x00192348}}, Y: Field{[10]uint32{0x03e18962, 0x036f8a00, 0x0120615e, 0x01500c98, 0x009b3364, 0x02b81a5f, 0x02ffbd4b, 0x01d74d39, 0x00452393, 0x00340d78}}}, + {X: Field{[10]uint32{0x002839b1, 0x020ff84f, 0x011cb1c4, 0x038ac72a, 0x03bd51bd, 0x035c2cd0, 0x0073f3ed, 0x01603e09, 0x010e5dbe, 0x0024b9b7}}, Y: Field{[10]uint32{0x039577a5, 0x03d1852c, 0x012015dd, 0x007a8432, 0x01a61ab0, 0x02826ce4, 0x02d1a465, 0x01ef4964, 0x03fea544, 0x00336437}}}, + {X: Field{[10]uint32{0x009f687b, 0x013b983d, 0x03b782ef, 0x020daf9b, 0x00eaec05, 0x02505695, 0x0223ec54, 0x03be33e8, 0x018a7616, 0x0004c579}}, Y: Field{[10]uint32{0x03e1431c, 0x016109b5, 0x0280f1ac, 0x0285cdf6, 0x022fe189, 0x036b1caa, 0x00e1fa45, 0x01832f15, 0x0100802d, 0x001ca780}}}, + {X: Field{[10]uint32{0x033e2a3b, 0x0008522a, 0x035e6c94, 0x03579b41, 0x0186b001, 0x00d55394, 0x026b284a, 0x03f61438, 0x03999857, 0x000f22a5}}, Y: Field{[10]uint32{0x00b25977, 0x01a76f4a, 0x012f6d6c, 0x00568410, 0x03a722e9, 0x00140819, 0x0087b3d6, 0x00829565, 0x0092acc7, 0x001193c1}}}, + {X: Field{[10]uint32{0x027591c8, 0x00ba9d84, 0x00879f86, 0x03e3fc0f, 0x010bf3c7, 0x01be6b38, 0x02b37cae, 0x0317d10d, 0x0230cc94, 0x003a905c}}, Y: Field{[10]uint32{0x01a4faa6, 0x01819f61, 0x033ace91, 0x01d5c09a, 0x006f4ec4, 0x02735010, 0x00cff1eb, 0x03542eeb, 0x00cb8d95, 0x0025848e}}}, + {X: Field{[10]uint32{0x021a6ceb, 0x0066854d, 0x0040bceb, 0x0282c316, 0x0348496c, 0x00b262bd, 0x01a8c816, 0x001e78ca, 0x01c2f271, 0x0023b33e}}, Y: Field{[10]uint32{0x017e56af, 0x00f5a1ec, 0x03a5b0b5, 0x00e684cb, 0x01c8ac52, 0x00bcdeca, 0x00c6a7c5, 0x03c6a98c, 0x0219165b, 0x000f8966}}}, + {X: Field{[10]uint32{0x030f296d, 0x00e62d53, 0x0155677f, 0x004e10b3, 0x027bf3d9, 0x0153adaa, 0x033c34ab, 0x00e965a1, 0x0083b350, 0x000cbc3f}}, Y: Field{[10]uint32{0x0381a811, 0x036328be, 0x01e26655, 0x02b73268, 0x00311e50, 0x032d7dec, 0x02da3459, 0x01e2dd8b, 0x016d906f, 0x00351cdb}}}, + {X: Field{[10]uint32{0x00d7accb, 0x00c60db8, 0x00a9f638, 0x0302c985, 0x03e4fa4c, 0x017fdf2f, 0x03c171da, 0x00ea3e90, 0x011077c8, 0x002df58c}}, Y: Field{[10]uint32{0x016be9de, 0x0217af5e, 0x037e35e2, 0x02d30648, 0x008b84a5, 0x0307ae99, 0x02c27ef9, 0x00554aa2, 0x02405644, 0x0018257d}}}, + {X: Field{[10]uint32{0x02536954, 0x009a52ef, 0x02cf06c3, 0x03e35a49, 0x010588b4, 0x0158f95b, 0x00cd74e6, 0x013ec295, 0x004a22df, 0x003bdb24}}, Y: Field{[10]uint32{0x025dbaa4, 0x02568881, 0x00c9fb10, 0x024b83a7, 0x02aa7a04, 0x00dc5788, 0x03c3d3c4, 0x00de9396, 0x00b144cd, 0x000c2244}}}, + {X: Field{[10]uint32{0x02941a6a, 0x00b5eac8, 0x02e27067, 0x0079baaa, 0x02b37524, 0x012385fe, 0x00eebf0b, 0x0096f2b3, 0x03d1e628, 0x0006784e}}, Y: Field{[10]uint32{0x00b613f7, 0x00f2430a, 0x03bbad3e, 0x019b92bc, 0x02855ea6, 0x02fe3330, 0x01308bbd, 0x016f0455, 0x03290700, 0x001bc8b0}}}, + {X: Field{[10]uint32{0x008e9420, 0x02dec447, 0x025df967, 0x02af5e4a, 0x009a98a7, 0x03ca602c, 0x0349ae45, 0x03de41e4, 0x00df10f2, 0x0015f66f}}, Y: Field{[10]uint32{0x0265db68, 0x01a29ca6, 0x0265eb50, 0x03d6ff93, 0x0142ebfd, 0x033009ec, 0x00f8fcb1, 0x0215378d, 0x01e1d9b7, 0x002fd997}}}, + {X: Field{[10]uint32{0x03df06b2, 0x03e1eb80, 0x0057e4e3, 0x0087c4f4, 0x00bb530a, 0x0347b4c9, 0x038874e3, 0x017a2c21, 0x02857c3d, 0x000def19}}, Y: Field{[10]uint32{0x00998539, 0x00711493, 0x02ec83a8, 0x02f5cbd7, 0x0377764a, 0x00729eef, 0x02abbeac, 0x02c4bbc4, 0x03dc764d, 0x00055066}}}, + {X: Field{[10]uint32{0x01c2cec2, 0x01962a7e, 0x021387f3, 0x00729d04, 0x00b572e1, 0x01944b0b, 0x00012a59, 0x024544cf, 0x01d99ca5, 0x0006cc31}}, Y: Field{[10]uint32{0x02f39697, 0x02c16417, 0x0169101d, 0x01445a97, 0x002344f7, 0x01ebe327, 0x004d8421, 0x03343150, 0x020b2a0d, 0x0037108c}}}, + {X: Field{[10]uint32{0x01efd0bf, 0x02d387f0, 0x03e65b8d, 0x008616e4, 0x01e6e89f, 0x016b5297, 0x0329f4f8, 0x0156b374, 0x01b3050c, 0x0025a0c7}}, Y: Field{[10]uint32{0x03d47837, 0x0127b673, 0x00ef455e, 0x035687e3, 0x0082bd8b, 0x01c1cbcb, 0x0275ef61, 0x01ce6b43, 0x0020fd03, 0x0021bd0e}}}, + {X: Field{[10]uint32{0x00e3d8ad, 0x024f3551, 0x0379266b, 0x027a85f2, 0x02bce799, 0x01eb3550, 0x0309f28f, 0x00129560, 0x000faa1f, 0x00334bd4}}, Y: Field{[10]uint32{0x00dd8c29, 0x025011b2, 0x0009e929, 0x00158fbc, 0x0127dd1b, 0x02057de5, 0x00743c24, 0x03abba5f, 0x0080ddfc, 0x0007e5dc}}}, + {X: Field{[10]uint32{0x02d01c08, 0x00af85d2, 0x003e8ff3, 0x0279829e, 0x00802f51, 0x00d54a4a, 0x0318ff9d, 0x02789e8c, 0x027d237c, 0x00180e4a}}, Y: Field{[10]uint32{0x02893fdc, 0x03615bc8, 0x02065663, 0x00714e7f, 0x0088ae9e, 0x03ca5f11, 0x0194afbd, 0x0347e362, 0x0147df91, 0x003adfcc}}}, + {X: Field{[10]uint32{0x0237ee9a, 0x015d3e7e, 0x03c90d22, 0x01e45e6c, 0x03d8abb6, 0x03cf075f, 0x00d68fb9, 0x02adcc08, 0x03ad0df6, 0x003db3dd}}, Y: Field{[10]uint32{0x0042ebd1, 0x031de389, 0x03523280, 0x02e873e6, 0x0177e81e, 0x037dd8c4, 0x01d513b7, 0x03dc59ad, 0x01c33587, 0x0023fe8a}}}, + {X: Field{[10]uint32{0x027cdf7a, 0x001c50b6, 0x00abd018, 0x028b49a9, 0x00944a0e, 0x0046f8bf, 0x01b6f4ff, 0x03145165, 0x015af542, 0x0015f200}}, Y: Field{[10]uint32{0x00b05da9, 0x0319cfaa, 0x03e3d2c9, 0x02ff45b8, 0x00ffb692, 0x028dd537, 0x02b32d33, 0x00f319ed, 0x039e8015, 0x002d9f1d}}}, + {X: Field{[10]uint32{0x034fe462, 0x0390679a, 0x03b4bfa1, 0x01feed90, 0x012f58a1, 0x02ba664c, 0x03d5c51c, 0x01248bfe, 0x0158ac18, 0x001ff821}}, Y: Field{[10]uint32{0x01ec7a11, 0x023ef9de, 0x0079e5a8, 0x01745664, 0x007268cb, 0x03565616, 0x027e9e4c, 0x0162d4db, 0x037d8bbf, 0x001d8011}}}, + {X: Field{[10]uint32{0x01517b75, 0x0367cfb7, 0x0177d87b, 0x017d62f8, 0x023d8109, 0x03639f13, 0x029b87a0, 0x026fbf5c, 0x016e73b3, 0x000b85bd}}, Y: Field{[10]uint32{0x035fcb7a, 0x013905cd, 0x011aa69b, 0x03c1e808, 0x0177aa59, 0x01a3c260, 0x02c950e6, 0x00e836ea, 0x01ef5732, 0x0013389c}}}, + {X: Field{[10]uint32{0x00ffdedb, 0x03ae9886, 0x017ad9c2, 0x039b4b76, 0x0049200d, 0x0328929a, 0x0381f666, 0x01e00af9, 0x000d456d, 0x0029351c}}, Y: Field{[10]uint32{0x026e4532, 0x0350d3f1, 0x036d5efe, 0x0396bc4b, 0x009124aa, 0x02192936, 0x030e7628, 0x0283c3a3, 0x006d0e7b, 0x0030267e}}}, + {X: Field{[10]uint32{0x033fc059, 0x02306676, 0x0145dc04, 0x01d061fc, 0x01a2327e, 0x00795eb9, 0x016c9219, 0x0278fa8c, 0x01505011, 0x002d1d93}}, Y: Field{[10]uint32{0x0398653c, 0x00f55a91, 0x03092c2f, 0x01c13e93, 0x004f1270, 0x0005a862, 0x00831ea9, 0x0084a4fb, 0x00facc27, 0x0038e6fa}}}, + {X: Field{[10]uint32{0x027e2d0e, 0x0064c6c3, 0x02235503, 0x008ebae0, 0x02c29fe1, 0x0213f1a5, 0x015b352e, 0x02afc33b, 0x03a7d291, 0x000f9a1a}}, Y: Field{[10]uint32{0x0185d266, 0x0371306a, 0x02ed88c7, 0x001e6327, 0x005a889b, 0x00c86e6e, 0x00caf9a9, 0x00f207e1, 0x00ab07cc, 0x001ecd70}}}, + {X: Field{[10]uint32{0x024a46c5, 0x02501f34, 0x03346db4, 0x0014a234, 0x03584001, 0x00c488c5, 0x0161e563, 0x01c3bf16, 0x032d1d4c, 0x0035e21b}}, Y: Field{[10]uint32{0x00b9efc8, 0x02501015, 0x023e868d, 0x00fe053c, 0x03c5ef50, 0x0135f6ea, 0x0225903d, 0x018092cb, 0x02e617c4, 0x00369917}}}, + {X: Field{[10]uint32{0x03a17a40, 0x01e643c2, 0x03475d3a, 0x03c8c976, 0x02cea867, 0x038dd519, 0x0257ba71, 0x0135016a, 0x03cc1465, 0x001f2f48}}, Y: Field{[10]uint32{0x02dcbc51, 0x03968774, 0x0303954c, 0x01ffb74d, 0x02088d32, 0x018e3b3a, 0x005541ee, 0x01b6d2e6, 0x01af96e6, 0x003b7739}}}, + {X: Field{[10]uint32{0x03eb9795, 0x02e62505, 0x00a5c5d2, 0x02ed6185, 0x0018f877, 0x00cf0864, 0x00ea0a92, 0x03876bbb, 0x0185c279, 0x00151898}}, Y: Field{[10]uint32{0x00e9b6f8, 0x0342e1b8, 0x0309d928, 0x03c37192, 0x018cfb07, 0x033f1e46, 0x03967305, 0x0211502f, 0x0185dc8f, 0x001941fb}}}, + {X: Field{[10]uint32{0x0163c32e, 0x02170201, 0x00681892, 0x03e78880, 0x0259e68c, 0x0376afbe, 0x02db20aa, 0x030b38af, 0x01551cbe, 0x003b73bc}}, Y: Field{[10]uint32{0x02753179, 0x035e8f6f, 0x00b33b03, 0x03f677da, 0x00bed59e, 0x032e936d, 0x016ab45b, 0x00a14f0a, 0x01437559, 0x002b799c}}}, + {X: Field{[10]uint32{0x023380cd, 0x02342180, 0x02dd99cf, 0x017320d2, 0x036a30bc, 0x032476df, 0x03db47fb, 0x03e74fc9, 0x0153ff6e, 0x003809ea}}, Y: Field{[10]uint32{0x03a2bbf5, 0x00d8b6b2, 0x032e4c7e, 0x02025d61, 0x0162eafc, 0x03114aa0, 0x012d174a, 0x03408239, 0x004de18a, 0x00079ac9}}}, + {X: Field{[10]uint32{0x02e2b2d6, 0x02b1bd9c, 0x00960e17, 0x00b2aa88, 0x0366dbf9, 0x01e1f549, 0x02a251f3, 0x00090953, 0x0168db98, 0x0029401b}}, Y: Field{[10]uint32{0x020b2b9c, 0x00fea95a, 0x01babfa6, 0x037d735b, 0x0372d1e6, 0x003dd1c8, 0x0198766c, 0x03756e53, 0x017ee854, 0x002864e3}}}, + {X: Field{[10]uint32{0x0027be11, 0x039419a1, 0x004e03d5, 0x00943b94, 0x01dbb020, 0x00a65646, 0x029adf73, 0x03f67b69, 0x01f201a1, 0x000c9c1d}}, Y: Field{[10]uint32{0x03c4debb, 0x02ace05a, 0x02df32de, 0x03091466, 0x02611a4e, 0x036157e8, 0x00ee3356, 0x0252fa52, 0x02b1c32e, 0x0010695f}}}, + {X: Field{[10]uint32{0x023363bd, 0x01e567c6, 0x0399ac1c, 0x0013188d, 0x039c87ac, 0x03a57dd2, 0x010cdcd7, 0x012f29ac, 0x01c66669, 0x0025f869}}, Y: Field{[10]uint32{0x00ab5e88, 0x026e49f2, 0x006a948c, 0x02601095, 0x01566894, 0x0359c709, 0x032bb6c4, 0x01587ded, 0x008d1ec7, 0x000f3269}}}, + {X: Field{[10]uint32{0x00c07a21, 0x0243b4ec, 0x01a047f7, 0x01a27dbf, 0x03d0a2d8, 0x013bad2a, 0x01bce28f, 0x01373f44, 0x0240a737, 0x001143e9}}, Y: Field{[10]uint32{0x03a77f4c, 0x00f285bb, 0x0231fc4c, 0x01b1fae8, 0x02aa35a5, 0x0034774d, 0x002a1f17, 0x033e8752, 0x0298dc17, 0x003aba20}}}, + {X: Field{[10]uint32{0x020a6559, 0x007bd2e7, 0x004a8a7a, 0x02461fa5, 0x00d81fad, 0x01025090, 0x0209ce1f, 0x019a84b6, 0x0340fc0a, 0x003d6a9c}}, Y: Field{[10]uint32{0x02eb5017, 0x0367f1ca, 0x022e349a, 0x004276d4, 0x00899d98, 0x02136e9d, 0x02e7738f, 0x024bc718, 0x03da9ef9, 0x0004956c}}}, + {X: Field{[10]uint32{0x0242f1b4, 0x032529e2, 0x02c8c90c, 0x022a2c53, 0x028857ac, 0x01fef5d6, 0x03238419, 0x01e0da9e, 0x01655519, 0x0001a402}}, Y: Field{[10]uint32{0x031b027b, 0x02eb6305, 0x007100f1, 0x02d3a7bd, 0x02952b5b, 0x02f817cc, 0x02271072, 0x025db6d1, 0x01d2038c, 0x00077060}}}, + {X: Field{[10]uint32{0x03f290aa, 0x00b484b0, 0x01e878ff, 0x03e4cd55, 0x03bc3bc0, 0x030dd830, 0x019f377b, 0x0104d9fa, 0x005a8ed8, 0x000ac6a8}}, Y: Field{[10]uint32{0x0013e280, 0x019f9633, 0x00a417b2, 0x002b2f74, 0x0035e900, 0x01fcda2f, 0x01f58965, 0x02f0c645, 0x02f41eb8, 0x0011ec96}}}, + {X: Field{[10]uint32{0x0052d81d, 0x00574974, 0x01a7ab53, 0x00e75320, 0x03454b1e, 0x00017976, 0x013540d3, 0x02bfc366, 0x029ca18c, 0x002939ad}}, Y: Field{[10]uint32{0x015d70c5, 0x02b70068, 0x0182236f, 0x00845f22, 0x00df4fcb, 0x00b9e9bb, 0x02d78edc, 0x01e41290, 0x01039c58, 0x001f3fc8}}}, + {X: Field{[10]uint32{0x039d2582, 0x01a45bec, 0x00fa17a3, 0x02ca029f, 0x01f728e1, 0x02775de5, 0x039cb0fd, 0x03292cf8, 0x0396c74f, 0x002ad12e}}, Y: Field{[10]uint32{0x0026f5c1, 0x01a8b264, 0x00ab7cb7, 0x036079e5, 0x037edc0d, 0x00645659, 0x0373febb, 0x03633279, 0x03a4519f, 0x00167646}}}, + {X: Field{[10]uint32{0x01e332a2, 0x036f08e7, 0x03cc7715, 0x01d5750b, 0x00934729, 0x015108a2, 0x016a31ae, 0x030f9232, 0x005b3fb9, 0x0020ec32}}, Y: Field{[10]uint32{0x01a6da6e, 0x034c07cd, 0x014b1e36, 0x00e4b592, 0x009652d7, 0x03c21a00, 0x0033b342, 0x00160bf6, 0x0240fb62, 0x003a67d5}}}, + {X: Field{[10]uint32{0x03954537, 0x02c856bb, 0x0078841e, 0x03d10381, 0x03e5bd10, 0x01402f03, 0x02911ee0, 0x033e059d, 0x013e624e, 0x003a914c}}, Y: Field{[10]uint32{0x000c7445, 0x0344c4db, 0x0244e81a, 0x0005342d, 0x00d5afb1, 0x027a2915, 0x03bde53b, 0x02733880, 0x000ce235, 0x0012ae2c}}}, + {X: Field{[10]uint32{0x01a3cd4e, 0x033a87d4, 0x03412ac4, 0x0278df3d, 0x03ae6d60, 0x023249f2, 0x03f7a269, 0x00f65a7d, 0x00e4af82, 0x0024db04}}, Y: Field{[10]uint32{0x017b7213, 0x023a37ec, 0x02b60bf6, 0x01ec04f4, 0x00bdb906, 0x000d67db, 0x03e5bdcf, 0x02142e38, 0x03bb10dd, 0x0011bdca}}}, + {X: Field{[10]uint32{0x02e9bfd6, 0x0243583c, 0x0296b36c, 0x00597478, 0x01847bb1, 0x01aa26cc, 0x02cf8e13, 0x030f6ce4, 0x015b61aa, 0x0010da97}}, Y: Field{[10]uint32{0x0336d68d, 0x0155a18b, 0x0247e336, 0x036839cd, 0x025e342b, 0x012a43e7, 0x038559c8, 0x032b3065, 0x008dae67, 0x003e079a}}}, + {X: Field{[10]uint32{0x00b315d7, 0x02136001, 0x0067aabd, 0x0108b986, 0x02d931a4, 0x0153d898, 0x024b929e, 0x022684e8, 0x00273fe7, 0x0027ae55}}, Y: Field{[10]uint32{0x012ef59c, 0x03e568d3, 0x01c60768, 0x012bfb04, 0x02d29f20, 0x03bfea0a, 0x0020fba8, 0x03990002, 0x01927dc0, 0x000e2ff0}}}, + {X: Field{[10]uint32{0x02280d8a, 0x0392e97e, 0x0277a0e6, 0x00342f68, 0x02ecb77a, 0x0003d8f9, 0x02b4328a, 0x02f02b2d, 0x02f587ec, 0x000e09ad}}, Y: Field{[10]uint32{0x024ef271, 0x00cbc10e, 0x016e6572, 0x024e2e8f, 0x01db35e2, 0x03698fe2, 0x03e6eb9e, 0x039a6c84, 0x01fedcef, 0x0003650d}}}, + {X: Field{[10]uint32{0x00a1dde2, 0x03e32881, 0x00a21cd0, 0x02e36cf3, 0x034dbdce, 0x010d92e7, 0x0193bcf8, 0x0286f8fe, 0x0111ae0e, 0x0028d233}}, Y: Field{[10]uint32{0x0083ac75, 0x03522107, 0x001e91d1, 0x02f5b591, 0x0007078e, 0x004ada28, 0x01c202f2, 0x03ebc9a8, 0x01d3db7c, 0x0007f214}}}, + {X: Field{[10]uint32{0x03df7329, 0x03a6818a, 0x002053c4, 0x039cf2dc, 0x025d70d1, 0x01c90993, 0x027646d0, 0x037cf139, 0x0239237f, 0x002ff855}}, Y: Field{[10]uint32{0x035f88e4, 0x03413e4a, 0x023adf12, 0x0373924b, 0x03345488, 0x01dd9d20, 0x03c09d1d, 0x03967670, 0x03e61ec5, 0x00240acd}}}, + {X: Field{[10]uint32{0x003dfa5e, 0x004f3270, 0x02944144, 0x00409c1f, 0x012642ae, 0x02081608, 0x00dc346c, 0x02dbd350, 0x014d81a1, 0x0038bf6c}}, Y: Field{[10]uint32{0x0088fceb, 0x0028f88d, 0x004086c6, 0x02ca6c03, 0x02131e37, 0x01d9d818, 0x026925ae, 0x021545b1, 0x00ed846e, 0x000c046d}}}, + {X: Field{[10]uint32{0x013c7416, 0x0377b1a4, 0x0038a535, 0x03aab09f, 0x02cf1119, 0x02d2b088, 0x0263659d, 0x019d205d, 0x01c68f47, 0x002ef196}}, Y: Field{[10]uint32{0x0154b954, 0x026099de, 0x00c7a477, 0x00825d6e, 0x03482501, 0x034ff84e, 0x01d13a40, 0x0144abeb, 0x02e19fdb, 0x0007e2db}}}, + {X: Field{[10]uint32{0x02505521, 0x0137a368, 0x02056cef, 0x02dbf67b, 0x01ce9141, 0x03e169e2, 0x016f743a, 0x01e26f6f, 0x02029866, 0x00196f4a}}, Y: Field{[10]uint32{0x0378f5a5, 0x017ce74c, 0x0370c6b6, 0x0135c429, 0x02990b18, 0x030f9b15, 0x01644a46, 0x02def175, 0x00301ced, 0x000cb6f8}}}, + {X: Field{[10]uint32{0x0278e981, 0x01645ac8, 0x01406a3a, 0x02427817, 0x00e9318d, 0x0303cdc9, 0x0175a49f, 0x033df093, 0x02eb8382, 0x0007b039}}, Y: Field{[10]uint32{0x0015715a, 0x033f0acd, 0x019fc240, 0x0018cdf3, 0x02fa56ac, 0x01a5f7af, 0x008ade3c, 0x02f2bfab, 0x029cf486, 0x00394384}}}, + {X: Field{[10]uint32{0x03a9eb8c, 0x032c43d8, 0x00d9e10d, 0x0248cd96, 0x00c0399c, 0x0284058a, 0x01aceb1e, 0x02896678, 0x031c203d, 0x001ce42b}}, Y: Field{[10]uint32{0x037c3126, 0x03837c25, 0x02418320, 0x028ce6f3, 0x002c3ada, 0x037af9f6, 0x03cad451, 0x01ec275e, 0x00966064, 0x001f4855}}}, + {X: Field{[10]uint32{0x021a533b, 0x01c7a05a, 0x01eb2b4b, 0x007b624c, 0x01127baf, 0x00267311, 0x03ff7f37, 0x00dd91e0, 0x00697b91, 0x00266945}}, Y: Field{[10]uint32{0x03e2e8e4, 0x022018e9, 0x00d4c8a2, 0x03c23a8e, 0x00809d21, 0x02b9d23f, 0x00bd57db, 0x01dc2c3f, 0x000f7503, 0x00127034}}}, + {X: Field{[10]uint32{0x020394d9, 0x03eb5962, 0x018cbf12, 0x038313f2, 0x02320ba2, 0x03c6dc09, 0x03b7dbfe, 0x00133033, 0x00b13b48, 0x003935b8}}, Y: Field{[10]uint32{0x03761a41, 0x01d74d8e, 0x01b6c750, 0x03760619, 0x03af5fc3, 0x038338be, 0x035ad203, 0x001bf9a9, 0x02ac73a0, 0x002bac3a}}}, + {X: Field{[10]uint32{0x01fe1a04, 0x01445b86, 0x03459d88, 0x0160ad54, 0x031a9aa0, 0x02b48fec, 0x03e1c460, 0x0397ab2c, 0x0141507c, 0x00122290}}, Y: Field{[10]uint32{0x0312bd12, 0x008d7d33, 0x0104f0d7, 0x01ce97f6, 0x00e82f80, 0x02b58ec1, 0x01eaf25e, 0x03e31d33, 0x0066043e, 0x001af5a8}}}, + {X: Field{[10]uint32{0x03babaa1, 0x03057659, 0x028c55d2, 0x011f290b, 0x032cb65b, 0x00b7eeb0, 0x011c2ffd, 0x0295346b, 0x024ded0c, 0x00303ff8}}, Y: Field{[10]uint32{0x027e9289, 0x01f1af5f, 0x0167dbbd, 0x03859d59, 0x03a0a330, 0x037dc047, 0x01bbba88, 0x0137c867, 0x023e29c5, 0x00345731}}}, + {X: Field{[10]uint32{0x027780b1, 0x016e48dd, 0x03fb2830, 0x003fc82f, 0x0131b05d, 0x023f17bc, 0x02dd36dd, 0x01389677, 0x030206c7, 0x000cdb66}}, Y: Field{[10]uint32{0x014e647b, 0x0179fd50, 0x01fd1b05, 0x0184051c, 0x032b1b64, 0x006f6e27, 0x03e6510e, 0x029c1eba, 0x00fc9886, 0x0012bb6b}}}, + {X: Field{[10]uint32{0x02dcf04f, 0x03b38b40, 0x024a706a, 0x016b3a11, 0x019a2a17, 0x031ee1b9, 0x03d3711d, 0x029ef8ee, 0x02b98973, 0x00260d4f}}, Y: Field{[10]uint32{0x02ee767e, 0x01d187ea, 0x0196d980, 0x0290f5b1, 0x028e45b4, 0x00178704, 0x02108873, 0x01290e3d, 0x02c22789, 0x002a1dfe}}}, + {X: Field{[10]uint32{0x02da1e61, 0x01f0d84d, 0x039053f3, 0x01df0e3a, 0x0271c9fb, 0x0153f2c2, 0x0239cecb, 0x03e77d8d, 0x021c17ff, 0x003370d7}}, Y: Field{[10]uint32{0x0094eace, 0x026d9a25, 0x017782bb, 0x0275f58a, 0x0087ae55, 0x030528c7, 0x024f0ccd, 0x01c9837d, 0x02bafe91, 0x002a332d}}}, + {X: Field{[10]uint32{0x00111941, 0x026a4d20, 0x00b5b515, 0x03b149b3, 0x015d7407, 0x02701bc5, 0x00584093, 0x0282c9c5, 0x01c15e62, 0x00244b2c}}, Y: Field{[10]uint32{0x03049bf6, 0x02f561cd, 0x035adbf4, 0x02e60d23, 0x026fa710, 0x031c3769, 0x00cecc86, 0x03111f34, 0x00d51723, 0x00161305}}}, + {X: Field{[10]uint32{0x03bff3bc, 0x0339a4f0, 0x0102b5dd, 0x01a26003, 0x01ffd195, 0x03fd00d0, 0x02ec6e2c, 0x022b3667, 0x017c7c1e, 0x00085178}}, Y: Field{[10]uint32{0x0236356f, 0x02ffd3dd, 0x02b68957, 0x0222bebf, 0x00a5c430, 0x02769eeb, 0x030e9b89, 0x02cdce56, 0x01a240c0, 0x000ee29c}}}, + {X: Field{[10]uint32{0x010b1692, 0x00baa523, 0x004ab3aa, 0x002882ff, 0x0143e091, 0x000f3721, 0x024f7e1d, 0x01c9c888, 0x03367e87, 0x00392824}}, Y: Field{[10]uint32{0x02cf846e, 0x00557df0, 0x00f80328, 0x0372bdf4, 0x02898f48, 0x03e9b8d3, 0x02b8315a, 0x01bc0e3b, 0x00313314, 0x00092c7b}}}, + {X: Field{[10]uint32{0x0328db40, 0x026cdb34, 0x02bb0f57, 0x0361001b, 0x012b1390, 0x01900a1d, 0x03387ed4, 0x01166edf, 0x02dd464d, 0x003f7d49}}, Y: Field{[10]uint32{0x013a3987, 0x011f0379, 0x00963141, 0x026a9d17, 0x01937326, 0x004993b1, 0x02cf7766, 0x005b4774, 0x02c56792, 0x0010e5b9}}}, + {X: Field{[10]uint32{0x00729f86, 0x016fed3b, 0x01da4fab, 0x012539d4, 0x0252ca4c, 0x02b77cfd, 0x01933ebc, 0x01c9cd42, 0x0016b3e3, 0x0001b217}}, Y: Field{[10]uint32{0x03648d6f, 0x019bc5ba, 0x01cf1217, 0x02646e7e, 0x01e592ce, 0x0177a64a, 0x0249040c, 0x0201f979, 0x03c8520b, 0x0026d4c3}}}, + {X: Field{[10]uint32{0x00e28e58, 0x0031e44b, 0x03203feb, 0x02889560, 0x03004e7d, 0x0378033e, 0x0098ce4b, 0x038b0043, 0x023c596e, 0x0013efeb}}, Y: Field{[10]uint32{0x026ff099, 0x00d55fb6, 0x017993e7, 0x01960ef0, 0x02396b8a, 0x03d43f58, 0x02dcfdcf, 0x00d92e57, 0x0104ed0e, 0x003fb3c1}}}, + {X: Field{[10]uint32{0x0378bab8, 0x00d44f81, 0x001fa150, 0x02ef4f0a, 0x0197c1d7, 0x003a7204, 0x0283c2b9, 0x0045e4ed, 0x037b8017, 0x0026f30e}}, Y: Field{[10]uint32{0x01bc0b43, 0x002e45d0, 0x03e9f3b7, 0x00275f62, 0x03a887f0, 0x02166ea8, 0x03825ab9, 0x0227469d, 0x00928782, 0x00368bab}}}, + {X: Field{[10]uint32{0x03635150, 0x0380be5a, 0x03c8a024, 0x0098ed78, 0x00855b0a, 0x01cb44c5, 0x02956956, 0x028ecfd6, 0x00400e70, 0x00110568}}, Y: Field{[10]uint32{0x023986be, 0x02961a76, 0x0223ec58, 0x0158e7cc, 0x016843ac, 0x026bf571, 0x02921603, 0x02a7e207, 0x038fcf55, 0x0036294e}}}, + {X: Field{[10]uint32{0x005b2341, 0x00212dc1, 0x030924d2, 0x00d8b54d, 0x01b617b5, 0x03880e0e, 0x00988fcb, 0x02f3da8e, 0x01c9cdaf, 0x001579d6}}, Y: Field{[10]uint32{0x0131bb95, 0x03e0abfe, 0x015d6cf7, 0x02dd0bae, 0x013c1191, 0x0288c561, 0x01524834, 0x00d01626, 0x03eaca8a, 0x00129a4c}}}, + {X: Field{[10]uint32{0x0140e9c8, 0x018d2215, 0x024b95ed, 0x0162b6f7, 0x018d1153, 0x03720f82, 0x017e072b, 0x00f0bc29, 0x0325bee2, 0x00084087}}, Y: Field{[10]uint32{0x01a8c9f0, 0x02ff8f3e, 0x008d4ba5, 0x0071fe19, 0x034ed8dc, 0x037208a8, 0x002c98f8, 0x003bfdf1, 0x0291a770, 0x0026bbd5}}}, + {X: Field{[10]uint32{0x01b376d1, 0x031e60b3, 0x024a7a28, 0x03bda413, 0x02c70771, 0x003502e2, 0x03f3c641, 0x006bffb7, 0x011ddded, 0x000ad38c}}, Y: Field{[10]uint32{0x0309b05c, 0x02b1cc35, 0x02575d20, 0x034db1e4, 0x0248b25d, 0x015fd6e5, 0x0243d02b, 0x016c1c3f, 0x00f56b25, 0x0005170c}}}, + {X: Field{[10]uint32{0x015378b3, 0x022d7d17, 0x0091e8b9, 0x02be412c, 0x025ed91c, 0x0017496d, 0x00dbf5be, 0x01840324, 0x021c7e16, 0x0014642c}}, Y: Field{[10]uint32{0x02650073, 0x0102d299, 0x01166040, 0x01b085b0, 0x001826d2, 0x02f83550, 0x00e3f268, 0x0317e2d4, 0x02471fbd, 0x002e0f33}}}, + {X: Field{[10]uint32{0x005b56f7, 0x03d00c15, 0x016ae1f2, 0x0025df40, 0x0188b1b0, 0x01d82062, 0x007c7b28, 0x01702cd9, 0x02e454c6, 0x000ac847}}, Y: Field{[10]uint32{0x02854f5c, 0x01c3775d, 0x03506f9b, 0x01a6e18f, 0x00fff746, 0x01e984a2, 0x01a25634, 0x03f0755c, 0x015917d8, 0x001d5d0e}}}, + {X: Field{[10]uint32{0x024134d4, 0x03e52bb9, 0x021b6d4a, 0x013e5063, 0x03a3caad, 0x03dae99b, 0x038ec37f, 0x002bb8d1, 0x0392b41e, 0x0032cc2d}}, Y: Field{[10]uint32{0x028358c5, 0x006aad88, 0x008e771b, 0x00376bac, 0x00914230, 0x003471ca, 0x02b8b4ec, 0x027d2e48, 0x02decb3a, 0x001155c6}}}, + {X: Field{[10]uint32{0x00e4bc6c, 0x00f34c81, 0x012e065c, 0x0149fba8, 0x03e46879, 0x0226f99e, 0x0349d070, 0x02a85ba5, 0x03a8d2fc, 0x003d390d}}, Y: Field{[10]uint32{0x03ba97c4, 0x02798a9d, 0x009c4344, 0x03f0e489, 0x008e7647, 0x03743b8a, 0x01e51f8b, 0x02ba28c3, 0x028b7e81, 0x003ed4b4}}}, + {X: Field{[10]uint32{0x0350d518, 0x0314f377, 0x00080545, 0x012f2d9e, 0x00ce85a9, 0x024f677e, 0x02a726c1, 0x0066cef1, 0x02a76a2a, 0x0028299d}}, Y: Field{[10]uint32{0x03190a71, 0x01ff2223, 0x03fe8e43, 0x01a28f26, 0x0041198d, 0x02b901c0, 0x01816e5a, 0x02f4842e, 0x00c6b1b7, 0x00191ffa}}}, + {X: Field{[10]uint32{0x03ff7b7e, 0x00296eed, 0x0171c786, 0x01745762, 0x0275a2ba, 0x03abbbb9, 0x00544ab1, 0x0250a2c4, 0x03ead7f3, 0x00057753}}, Y: Field{[10]uint32{0x0038445c, 0x00b11c67, 0x02961844, 0x007c6c7e, 0x0253924d, 0x02dcc8b4, 0x02313427, 0x008551f4, 0x01dd5fab, 0x00226557}}}, + {X: Field{[10]uint32{0x030ca522, 0x03d8c864, 0x012b8850, 0x00ffdcb3, 0x0301bdea, 0x035d3767, 0x037a188e, 0x012d1d8d, 0x00004029, 0x002a01ae}}, Y: Field{[10]uint32{0x02b97213, 0x02fb7237, 0x010db9c6, 0x02b18624, 0x0253e49a, 0x02aceee1, 0x03f1fa88, 0x02c6bda5, 0x036547d8, 0x0012db5c}}}, + {X: Field{[10]uint32{0x039f148b, 0x02e8fd56, 0x0006df31, 0x02b3cf01, 0x0058a983, 0x0390c7ba, 0x036ff9f6, 0x01921de8, 0x023dca08, 0x001078dc}}, Y: Field{[10]uint32{0x038392e4, 0x0252074e, 0x02007913, 0x00b37ff2, 0x022753c5, 0x0336a7f4, 0x000b136d, 0x0163406a, 0x02caf27c, 0x0022ac59}}}, + {X: Field{[10]uint32{0x01bba3c4, 0x002f2a19, 0x00953ea0, 0x011fe353, 0x01690e04, 0x00251985, 0x03a3e587, 0x02322766, 0x00f27855, 0x0018ee28}}, Y: Field{[10]uint32{0x03cf787f, 0x0002cc90, 0x03a0c2d3, 0x025dca2c, 0x008c09b2, 0x03c01320, 0x0295da00, 0x022d254e, 0x014185eb, 0x000c87eb}}}, + {X: Field{[10]uint32{0x014c5963, 0x00aa6a6c, 0x0056c894, 0x036b4bfe, 0x01c1ca21, 0x0088a698, 0x01cae5f8, 0x0034e941, 0x037faa8b, 0x00018afa}}, Y: Field{[10]uint32{0x02bffd4b, 0x0275efd5, 0x030451ac, 0x0008bd6d, 0x03a36f4c, 0x00fbf710, 0x01886550, 0x0309fd73, 0x00bd7120, 0x0038f673}}}, + {X: Field{[10]uint32{0x03d20427, 0x03cb1206, 0x0199ac65, 0x033cf2cb, 0x03bc133f, 0x024bc0c4, 0x01d79a90, 0x02e27af9, 0x000af524, 0x002dd686}}, Y: Field{[10]uint32{0x021d2747, 0x02e08952, 0x02d48c39, 0x01918cfb, 0x036a6369, 0x0398b7ec, 0x03094b41, 0x0301534d, 0x0056b11c, 0x0039e154}}}, + {X: Field{[10]uint32{0x024949e9, 0x03bb413f, 0x032f2f03, 0x00f3bbc0, 0x026b51f9, 0x013418e8, 0x01df9cbe, 0x03f1da5f, 0x036d5298, 0x001396ef}}, Y: Field{[10]uint32{0x02a12188, 0x039138c5, 0x00119476, 0x02fa6495, 0x001871fb, 0x0336024c, 0x0114a19e, 0x02771951, 0x028640cd, 0x00199c09}}}, + {X: Field{[10]uint32{0x00173237, 0x02fdb7c3, 0x01200074, 0x039b72d8, 0x02b78e86, 0x0357f06a, 0x02edb836, 0x03c1a4ee, 0x003df509, 0x002a5de3}}, Y: Field{[10]uint32{0x01d0cab7, 0x03804fca, 0x025d690e, 0x0072302f, 0x019230a4, 0x002a1759, 0x03a0e50d, 0x03e44e57, 0x019186a0, 0x000cea72}}}, + {X: Field{[10]uint32{0x03570449, 0x01eed8f3, 0x03c95cdb, 0x039c9b32, 0x00757fb3, 0x02924dab, 0x01790bc1, 0x012f9f12, 0x02ad1666, 0x003c6cea}}, Y: Field{[10]uint32{0x0060cc06, 0x003ed29d, 0x02a3a52b, 0x0098934e, 0x02006434, 0x011899e0, 0x02183981, 0x037040fc, 0x01cbea3f, 0x003477f8}}}, + {X: Field{[10]uint32{0x0349f598, 0x02293164, 0x022d0698, 0x0172bd33, 0x019563a0, 0x0133c067, 0x0036ad6a, 0x035615a9, 0x013ab015, 0x00359b3f}}, Y: Field{[10]uint32{0x011efc4d, 0x033dbe84, 0x01756d07, 0x02fbee54, 0x00d8e91b, 0x036e503e, 0x03b73056, 0x03679598, 0x01b6d097, 0x0017a85e}}}, + {X: Field{[10]uint32{0x020ac7aa, 0x03f8ef36, 0x00470ea8, 0x01bcb036, 0x015d87a1, 0x0260bb7f, 0x030f30aa, 0x01744efb, 0x00f0924b, 0x00294ca9}}, Y: Field{[10]uint32{0x038d5c1c, 0x00aa49c7, 0x017ad553, 0x03eab188, 0x0374fd1e, 0x03d40e1b, 0x003de70d, 0x00d204f3, 0x0019ca4e, 0x0030b98b}}}, + {X: Field{[10]uint32{0x00439b70, 0x0397fd8a, 0x03b3e1a3, 0x03bcff8b, 0x0281ebb3, 0x0381ed8c, 0x03d08c09, 0x0220d7fe, 0x01125df7, 0x002a6ac9}}, Y: Field{[10]uint32{0x01877514, 0x00696d61, 0x00c7e350, 0x02d53a54, 0x01f2eaad, 0x0330d77c, 0x0243698a, 0x0056aa6a, 0x01db56e0, 0x00163fd5}}}, + {X: Field{[10]uint32{0x020466eb, 0x03fd1b11, 0x02521f2c, 0x012907b5, 0x0153df17, 0x024571b5, 0x004dc830, 0x00f7b306, 0x03849081, 0x00338163}}, Y: Field{[10]uint32{0x02f3e745, 0x011acbe2, 0x03d47c76, 0x01065ecd, 0x02282377, 0x013d3dc6, 0x02815a78, 0x01d05016, 0x00c45881, 0x0010534e}}}, + {X: Field{[10]uint32{0x02406299, 0x02faaa5b, 0x003d4737, 0x014e76d8, 0x010afe92, 0x0059137a, 0x0385c7f3, 0x02cdaaac, 0x036530a2, 0x002647ea}}, Y: Field{[10]uint32{0x008eed57, 0x00abe7f9, 0x014df4f8, 0x03edeb6a, 0x005d373c, 0x0136807d, 0x016dc9d4, 0x0112f7c5, 0x017677c5, 0x000a8a6d}}}, + {X: Field{[10]uint32{0x03715d8e, 0x0070fcab, 0x01e140e9, 0x03fa84fc, 0x03ddfdd2, 0x016ad205, 0x00419210, 0x013bbf32, 0x001fbd03, 0x003b9b32}}, Y: Field{[10]uint32{0x0386d8be, 0x00ebcef8, 0x00a3f689, 0x011ea5ef, 0x00df8fd8, 0x02972f01, 0x007358de, 0x03a59487, 0x03fe48c3, 0x002e3de7}}}, + {X: Field{[10]uint32{0x019c5ef2, 0x02b33685, 0x017a3c5d, 0x03fa04cd, 0x0316ff2d, 0x00507800, 0x004d5cc5, 0x01995d55, 0x0372d642, 0x0019a8b4}}, Y: Field{[10]uint32{0x01bc8929, 0x0368fdd3, 0x029a05ba, 0x03416608, 0x00780000, 0x03c99781, 0x01423b9a, 0x03d234e2, 0x016b91c6, 0x002d5f4b}}}, + {X: Field{[10]uint32{0x02421da9, 0x0171a48e, 0x00ac6adf, 0x0396b2d3, 0x037a5798, 0x031fcda8, 0x0043e73f, 0x0378e854, 0x01d9f697, 0x0008280b}}, Y: Field{[10]uint32{0x01cf34f7, 0x00db0c33, 0x02b97338, 0x00e0bf31, 0x02ab4ab5, 0x00478f72, 0x02ab61e7, 0x00d87aa9, 0x0100d162, 0x00079b3c}}}, + {X: Field{[10]uint32{0x037bf552, 0x00e8c0f2, 0x0211092e, 0x026873b6, 0x019f92b7, 0x036894cc, 0x0298b154, 0x03a07daf, 0x02437818, 0x00282e32}}, Y: Field{[10]uint32{0x01543be6, 0x02ff968f, 0x030baa1a, 0x039922d8, 0x02218508, 0x003f38b6, 0x0263ca11, 0x03664141, 0x00ebf447, 0x0011506f}}}, + {X: Field{[10]uint32{0x00c52c63, 0x005d3ac7, 0x00ffb9e4, 0x02376d6e, 0x01e0d501, 0x0172ea73, 0x015c25fb, 0x039221f8, 0x02ad73dc, 0x00145c53}}, Y: Field{[10]uint32{0x03dafebf, 0x024507e6, 0x0309773b, 0x00c6665d, 0x01a5c248, 0x019b7480, 0x02272c7d, 0x01587afb, 0x00a082ef, 0x0011ede5}}}, + {X: Field{[10]uint32{0x02451c59, 0x012b0b35, 0x03a2fba7, 0x02904d05, 0x017da195, 0x026487a4, 0x03c41f6a, 0x03781cf9, 0x03631fe4, 0x00063a89}}, Y: Field{[10]uint32{0x024df316, 0x02bb5435, 0x01e6b106, 0x020cba55, 0x00d31b3b, 0x0235f24f, 0x03e0428e, 0x02eea6cc, 0x0337fff6, 0x000e6282}}}, + {X: Field{[10]uint32{0x03c5a87e, 0x02e415c5, 0x030cd0e8, 0x029675d6, 0x03c3d1f0, 0x033ea617, 0x01ec341a, 0x0060d298, 0x034fc39e, 0x00387562}}, Y: Field{[10]uint32{0x006b3c47, 0x02648967, 0x007f2cf2, 0x00e83767, 0x01af8215, 0x02dfe679, 0x03e2ab3b, 0x03f7b023, 0x020215fd, 0x0006d8bb}}}, + {X: Field{[10]uint32{0x016c5a84, 0x03b0f9dc, 0x039a3bbd, 0x0104472b, 0x032c19c5, 0x02c94f70, 0x03f5ba8e, 0x030495f7, 0x011730d3, 0x000e5e4e}}, Y: Field{[10]uint32{0x01f18015, 0x02a929fd, 0x021e3f78, 0x02f5070a, 0x00be7b4e, 0x021476a3, 0x02cded5c, 0x00db6644, 0x0350189f, 0x0035a87e}}}, + {X: Field{[10]uint32{0x039ede88, 0x003c5e96, 0x02ef1552, 0x002c93ca, 0x021d5736, 0x02c09467, 0x01dbf888, 0x0101b4e0, 0x024b601b, 0x00126d27}}, Y: Field{[10]uint32{0x0169a38d, 0x01f9dcbe, 0x02fadbff, 0x02734390, 0x03a0a76e, 0x00279168, 0x03e7be10, 0x035ecd66, 0x00ca02f2, 0x003f3cf3}}}, + {X: Field{[10]uint32{0x00bdc871, 0x036a914a, 0x024c32bf, 0x02848907, 0x01d64e38, 0x003fc5e8, 0x0188548f, 0x03cdb483, 0x010d0b42, 0x000b3606}}, Y: Field{[10]uint32{0x00259187, 0x03bd66da, 0x02a67077, 0x0034ac5a, 0x022fff78, 0x016affab, 0x0284f45e, 0x0052416a, 0x03692214, 0x003dca70}}}, + {X: Field{[10]uint32{0x0241025a, 0x00218997, 0x006f2308, 0x03a91747, 0x02b5b642, 0x007e7466, 0x020cb2cf, 0x015198b6, 0x03111738, 0x0007f43e}}, Y: Field{[10]uint32{0x029ce0e9, 0x02460791, 0x0008f557, 0x035b6edb, 0x0294e928, 0x031c04b6, 0x007825d1, 0x002082af, 0x0288fec6, 0x000c4da9}}}, + {X: Field{[10]uint32{0x02f3a141, 0x0391101e, 0x0387107d, 0x02ec4834, 0x013f93d5, 0x02f61139, 0x0248a0f5, 0x02d6f861, 0x033bd7f8, 0x003c2397}}, Y: Field{[10]uint32{0x01902fac, 0x01b857f6, 0x0289fa52, 0x02f37c74, 0x01bf7ea1, 0x03253a83, 0x0361bdfc, 0x03ab872a, 0x03259067, 0x0000f761}}}, + {X: Field{[10]uint32{0x005ee207, 0x0172ac47, 0x005a5d3f, 0x03c07fbb, 0x03a0584c, 0x0171af75, 0x03a046bb, 0x03ea58dc, 0x0006b997, 0x002800cf}}, Y: Field{[10]uint32{0x03e268b4, 0x002a36f0, 0x03a17d14, 0x02d8f53f, 0x0039a577, 0x00823503, 0x00c2cda2, 0x039235c2, 0x0131aacb, 0x003bb586}}}, + {X: Field{[10]uint32{0x02c16f70, 0x0246db98, 0x03b1e1ea, 0x01c1109a, 0x0383ff8f, 0x005de469, 0x001e29b1, 0x0299c77c, 0x000868be, 0x001df7bb}}, Y: Field{[10]uint32{0x0264861d, 0x009ac015, 0x024b5dc4, 0x009f0288, 0x00fcc1fe, 0x0067d7a7, 0x031ae7ef, 0x01cfd8c9, 0x0228ba8f, 0x002e4228}}}, + {X: Field{[10]uint32{0x01aa72b1, 0x016a86ea, 0x019605fd, 0x03070623, 0x01994a03, 0x00d41acf, 0x01bd1fc6, 0x0043b468, 0x015ffe2f, 0x000bf37b}}, Y: Field{[10]uint32{0x02bbefc6, 0x02df5d81, 0x0145d3fa, 0x00a13fe7, 0x02b4df66, 0x004a8319, 0x00d7c12e, 0x021bc748, 0x03f6f09a, 0x000556fa}}}, + {X: Field{[10]uint32{0x015db3ad, 0x00438826, 0x02904c83, 0x03fddf0a, 0x018667f8, 0x02e91f02, 0x00add0c9, 0x039cceaf, 0x032dfdf5, 0x0007c302}}, Y: Field{[10]uint32{0x037bc566, 0x035d5995, 0x03e448ef, 0x020a1732, 0x0170f631, 0x00c9a122, 0x039b7613, 0x03d57d44, 0x03cb84ce, 0x002f5c46}}}, + {X: Field{[10]uint32{0x0237dcf8, 0x03aa3e42, 0x005ef465, 0x03b52aa2, 0x03d603fd, 0x03b7d953, 0x01bdf3c5, 0x00b11183, 0x0144e716, 0x0002d2a1}}, Y: Field{[10]uint32{0x003c62b2, 0x00e28f48, 0x0134c139, 0x01bb6f86, 0x0099f8ee, 0x00a4b2ce, 0x032e27b2, 0x03a2c800, 0x0391b3f2, 0x0014f010}}}, + {X: Field{[10]uint32{0x005bd68c, 0x016c2dcb, 0x0221a9d8, 0x0031b650, 0x03d00a90, 0x034c1ce5, 0x0331cdfa, 0x02dcd4e3, 0x0282dcde, 0x0037c3af}}, Y: Field{[10]uint32{0x00decfb2, 0x03d1cce2, 0x001c68a2, 0x038b5c1c, 0x034a1d07, 0x0292b3e2, 0x03b869e3, 0x00b95511, 0x0239e7fe, 0x0030ca65}}}, + {X: Field{[10]uint32{0x03c101c0, 0x032499c0, 0x01576ec7, 0x00396cde, 0x02f9fd46, 0x034a3e27, 0x02ed101f, 0x0230cf87, 0x01b6d1c3, 0x003ac12e}}, Y: Field{[10]uint32{0x01e0ee9e, 0x0363ca3d, 0x024eb008, 0x0120e5d2, 0x00f5ee75, 0x020b5ba7, 0x013cab57, 0x03e02cac, 0x00497f47, 0x0013c9b6}}}, + {X: Field{[10]uint32{0x03294334, 0x03dc7434, 0x01cface9, 0x003ba9ee, 0x017db4ee, 0x032ae619, 0x014b37a0, 0x031b3ab2, 0x03e2197c, 0x001ef27b}}, Y: Field{[10]uint32{0x01a72013, 0x01e0b697, 0x009a37ff, 0x024c7057, 0x01ad8fb4, 0x02d6ce94, 0x001d9404, 0x01e41aa5, 0x00ad5234, 0x00364c6f}}}, + {X: Field{[10]uint32{0x033e0b9b, 0x0106b4ed, 0x00844e0a, 0x01433259, 0x011321dc, 0x01a8fa2d, 0x010c10c6, 0x014b192f, 0x01e8f4bd, 0x002248b4}}, Y: Field{[10]uint32{0x0241c431, 0x00a9e8d2, 0x003182a0, 0x031b57b7, 0x0261c9ee, 0x00cdf714, 0x00e6abd3, 0x03887a24, 0x00f17d23, 0x000ad90f}}}, + {X: Field{[10]uint32{0x02ddcc72, 0x006746bc, 0x00e9acdc, 0x0369df28, 0x030139a7, 0x0311a007, 0x036a842a, 0x004bb48b, 0x01e33a93, 0x0010bcbb}}, Y: Field{[10]uint32{0x0326f99b, 0x038d25e3, 0x0376ac70, 0x0029afd1, 0x02ab9536, 0x037238d0, 0x0260edff, 0x026172e4, 0x03cc715c, 0x00143516}}}, + {X: Field{[10]uint32{0x016761c6, 0x009c1453, 0x02ea2f3b, 0x03ca4a4d, 0x00627549, 0x01c9ad79, 0x00792550, 0x03fac962, 0x03201862, 0x001ef725}}, Y: Field{[10]uint32{0x01a4fa8c, 0x02a1504b, 0x02269f1c, 0x039032b5, 0x0065372e, 0x02101998, 0x026f0bff, 0x02b7d5db, 0x032b7f77, 0x001c03ad}}}, + {X: Field{[10]uint32{0x006314cf, 0x0366385d, 0x023066b6, 0x011f4840, 0x01f79d16, 0x008a3868, 0x002e0d85, 0x0126fd79, 0x03a64bf5, 0x002e6d49}}, Y: Field{[10]uint32{0x020cd93f, 0x00a66aaa, 0x00eb7499, 0x00e71b61, 0x02e35b15, 0x000bcc3a, 0x022a2b68, 0x007d6e4e, 0x00642a72, 0x002386cd}}}, + {X: Field{[10]uint32{0x01e3dda9, 0x02b0961d, 0x02d74978, 0x00c56434, 0x03d187c4, 0x00f3845d, 0x00291929, 0x01dd9407, 0x012934d4, 0x002d9779}}, Y: Field{[10]uint32{0x039fa529, 0x038db58e, 0x014ef324, 0x0027b2f6, 0x03f07555, 0x00c0d915, 0x01c55351, 0x02d73acf, 0x03e74ab9, 0x000f5bf2}}}, + {X: Field{[10]uint32{0x027c6b9b, 0x0198d9b3, 0x02ca5c2e, 0x03a8d016, 0x01a036ed, 0x00fc1584, 0x03604f6a, 0x01d47abc, 0x02320608, 0x00063aad}}, Y: Field{[10]uint32{0x015074c5, 0x00acd942, 0x03dd99d1, 0x001492f5, 0x02ccd426, 0x027e479b, 0x0211f057, 0x004464db, 0x03bc9467, 0x00227ac1}}}, + {X: Field{[10]uint32{0x02d360d5, 0x007183ba, 0x000a14eb, 0x03928c6d, 0x03c7502e, 0x025b4e76, 0x01a16065, 0x02590e42, 0x00664a47, 0x00289844}}, Y: Field{[10]uint32{0x01814901, 0x01fcdc9d, 0x00ac03e8, 0x0207cc8f, 0x0085721a, 0x02066086, 0x022d9fe3, 0x0155d8c9, 0x034d8802, 0x0012d175}}}, + {X: Field{[10]uint32{0x0008a8a7, 0x0250d74f, 0x019595da, 0x03ebd800, 0x01c77ac0, 0x0173c972, 0x019dc583, 0x0214de80, 0x00b12c10, 0x001e2515}}, Y: Field{[10]uint32{0x01829041, 0x02b82fe9, 0x007a2591, 0x000c949a, 0x008841da, 0x0282f5d8, 0x02f43378, 0x0167eb2f, 0x030fed28, 0x001afba1}}}, + {X: Field{[10]uint32{0x02791569, 0x03897518, 0x025ed7cf, 0x03e67d98, 0x01f81570, 0x00b837e5, 0x03683b9c, 0x0197c046, 0x0206fb4f, 0x00065df0}}, Y: Field{[10]uint32{0x03698479, 0x0390d7af, 0x01de467d, 0x02c9d764, 0x019dcc79, 0x02a7af81, 0x03f435e5, 0x0112aa57, 0x01a3c222, 0x00379db7}}}, + {X: Field{[10]uint32{0x01f4222f, 0x02b26199, 0x02585189, 0x03530fd5, 0x01ec3b5a, 0x02b0d35f, 0x03e60861, 0x0354d903, 0x01f7d259, 0x002247c3}}, Y: Field{[10]uint32{0x032de219, 0x002b3a46, 0x0257dba9, 0x02ac1010, 0x025c3293, 0x02a35ac3, 0x027a6011, 0x0228a87b, 0x03f70f53, 0x00331782}}}, + {X: Field{[10]uint32{0x0299530b, 0x02a4dfff, 0x01e55c80, 0x0380f171, 0x0350169d, 0x0104ad34, 0x026c282f, 0x03e07964, 0x03f69262, 0x00214d2e}}, Y: Field{[10]uint32{0x017423b5, 0x0239fad5, 0x01cf9fb0, 0x008d3505, 0x00f70cfc, 0x0395147a, 0x00764c0b, 0x001cdd33, 0x0181e0bb, 0x003efbb9}}}, + {X: Field{[10]uint32{0x006f63fb, 0x012c1faa, 0x001989e4, 0x01f03c04, 0x0158fc89, 0x01516635, 0x034eafa3, 0x037f4dd1, 0x016404e7, 0x00396dbd}}, Y: Field{[10]uint32{0x0118da79, 0x01b38998, 0x00ad0b2c, 0x03242ce0, 0x008e153c, 0x022201e0, 0x01e7d983, 0x00ea2ddb, 0x03fa68a8, 0x0010da2e}}}, + {X: Field{[10]uint32{0x02c2b850, 0x02435381, 0x00e29f7c, 0x03ced38e, 0x0046e184, 0x001c91ea, 0x03dc5e55, 0x03945260, 0x028b11c3, 0x003e5646}}, Y: Field{[10]uint32{0x010ff6b5, 0x025e82b6, 0x032a51fe, 0x024fca7f, 0x02957de3, 0x00d9a87e, 0x024e288a, 0x03d61f32, 0x00362361, 0x00108ed9}}}, + {X: Field{[10]uint32{0x0372384c, 0x02482c7f, 0x038212f2, 0x01655ef1, 0x017c9950, 0x025918de, 0x01eb617c, 0x017a7bbe, 0x01d3252f, 0x000f4c8e}}, Y: Field{[10]uint32{0x02a2e57a, 0x00f2a7c8, 0x03df78f7, 0x0386a6d9, 0x03ef860e, 0x0257ad37, 0x02798bf6, 0x02beb394, 0x03b6fc9b, 0x00070f8d}}}, + {X: Field{[10]uint32{0x00c5dfb8, 0x035719ef, 0x00055201, 0x018707c5, 0x02a0a6ce, 0x002184a8, 0x028e8554, 0x0135da1a, 0x03234b57, 0x003d0225}}, Y: Field{[10]uint32{0x000a56a4, 0x014c8243, 0x03af3c74, 0x029d80bf, 0x03c3a62f, 0x015969e7, 0x02aac242, 0x03f24552, 0x03b73e72, 0x001ae0a0}}}, + {X: Field{[10]uint32{0x02267ccf, 0x02d18a8b, 0x03c64bc4, 0x034ac104, 0x0395058e, 0x0262e2d1, 0x03e65f84, 0x031d17da, 0x02e7aea9, 0x002b381d}}, Y: Field{[10]uint32{0x028b97aa, 0x0076b045, 0x0120a31f, 0x018aa651, 0x02dc58f3, 0x02bcd4f8, 0x032ed6dc, 0x02a797ad, 0x0217377f, 0x0002d8b1}}}, + {X: Field{[10]uint32{0x006ec161, 0x01bf0b42, 0x036af29d, 0x00ced3f7, 0x01b4e63f, 0x02b6c747, 0x030b848e, 0x0181a4c8, 0x03a7408c, 0x001c332e}}, Y: Field{[10]uint32{0x014d6959, 0x020b1ee8, 0x02ec4d77, 0x00e1c7ef, 0x025a4ff3, 0x0152a032, 0x01286776, 0x00398390, 0x01a046d3, 0x003f0736}}}, + {X: Field{[10]uint32{0x0358d372, 0x03798a79, 0x02ede7a8, 0x02ce65c2, 0x019e33fc, 0x02bd6af1, 0x0258d3a4, 0x016c317a, 0x00b27c0c, 0x0039b9ea}}, Y: Field{[10]uint32{0x018d4a66, 0x036cf972, 0x017049a8, 0x0297262f, 0x00b40df3, 0x024f8b20, 0x011fee27, 0x02d69754, 0x01c4c8c8, 0x00350344}}}, + {X: Field{[10]uint32{0x03216346, 0x02c74c88, 0x02739117, 0x029433fd, 0x007910e9, 0x0278b109, 0x01495b71, 0x00b9a0ca, 0x01c7e0a0, 0x00337125}}, Y: Field{[10]uint32{0x001583d4, 0x00816c5a, 0x022f0559, 0x0231b390, 0x00d51fc6, 0x03c77dbb, 0x01ddcd87, 0x0302b3ca, 0x036e9306, 0x0018d993}}}, + {X: Field{[10]uint32{0x022fc5cc, 0x025d741e, 0x02e4f825, 0x0065bcd6, 0x01d0142f, 0x02e09370, 0x022ba333, 0x00878000, 0x009c2fd7, 0x0009e13a}}, Y: Field{[10]uint32{0x003b8cf4, 0x00d7bd77, 0x001db4a3, 0x0113c021, 0x005a391e, 0x00958a3d, 0x00232b9b, 0x019874d5, 0x0266bdfa, 0x0002e962}}}, + {X: Field{[10]uint32{0x001a2390, 0x023b37ac, 0x00d0b9b9, 0x02ffdabd, 0x030c9118, 0x0212e8f3, 0x001dd831, 0x01ce0085, 0x0362ebcb, 0x002ada66}}, Y: Field{[10]uint32{0x00766905, 0x0241128d, 0x03e71a60, 0x01ede611, 0x012be011, 0x02829f33, 0x0142547d, 0x0083db17, 0x0210b714, 0x00179520}}}, + {X: Field{[10]uint32{0x035756ec, 0x00f53c2d, 0x02e08dda, 0x00aa60d6, 0x02220955, 0x01b747aa, 0x03ad6d39, 0x038dfee7, 0x03a567ff, 0x001e07a9}}, Y: Field{[10]uint32{0x02637256, 0x0141683c, 0x034b2af9, 0x001f6b37, 0x000403a5, 0x02e99933, 0x01481744, 0x00ee5f93, 0x007b46f6, 0x000f1db6}}}, + {X: Field{[10]uint32{0x0374029c, 0x002f4fb8, 0x033fd39d, 0x00ef882c, 0x03a0e1ce, 0x023fb968, 0x0004fe7b, 0x002a0a97, 0x0130dd5c, 0x001d6acb}}, Y: Field{[10]uint32{0x01914b9f, 0x0057f358, 0x0121a722, 0x03ead7be, 0x0330536e, 0x0253073d, 0x01f6f8e6, 0x00e4eb2e, 0x0147fdb1, 0x002abd18}}}, + {X: Field{[10]uint32{0x00ddaff0, 0x00433e02, 0x03ced85a, 0x00cf4471, 0x01087124, 0x0212b55b, 0x023caea6, 0x00f6a5b4, 0x02983730, 0x000a52d9}}, Y: Field{[10]uint32{0x0346f7c1, 0x02993de6, 0x00b4222f, 0x03f20be7, 0x01e5861b, 0x00e2fc7c, 0x0007fa8b, 0x00fa7aa5, 0x02f7feb7, 0x002bd35f}}}, + {X: Field{[10]uint32{0x0024c8d6, 0x031b8d2e, 0x02e55ea3, 0x03a4495f, 0x00f290f6, 0x0365c047, 0x0283b06b, 0x018e7f25, 0x02ea7433, 0x003619da}}, Y: Field{[10]uint32{0x03a7456d, 0x0296dc65, 0x0230fd71, 0x00ab79c7, 0x0309017b, 0x01aab04c, 0x00f3e5cd, 0x01551424, 0x007635d4, 0x001c4322}}}, + {X: Field{[10]uint32{0x021270d0, 0x02fb9d05, 0x03544fd8, 0x009ea4ed, 0x00cee714, 0x0361a916, 0x004771c6, 0x03d6b0ab, 0x02030d90, 0x001793b2}}, Y: Field{[10]uint32{0x00c97351, 0x02bc2dd0, 0x03b9ff0c, 0x0293d232, 0x00a93bb4, 0x00d8a225, 0x03a6d603, 0x03e2febf, 0x0143b970, 0x00113f80}}}, + {X: Field{[10]uint32{0x0180097e, 0x03c496e1, 0x021dc157, 0x00f76f1d, 0x01265c3a, 0x026d5521, 0x0308f212, 0x02ea17f9, 0x01aa244f, 0x0024054b}}, Y: Field{[10]uint32{0x03ef2cf7, 0x00d5ce60, 0x03939b94, 0x00b120d5, 0x038a6d39, 0x03f0bd84, 0x01fa3b28, 0x021a42d6, 0x02c9200b, 0x0005a534}}}, + {X: Field{[10]uint32{0x005637b5, 0x02cf2423, 0x020f191f, 0x0265ccbb, 0x00daf3a1, 0x032fcae7, 0x03a953fa, 0x01c7114f, 0x00f096f1, 0x0019f755}}, Y: Field{[10]uint32{0x02de74b1, 0x009e6f13, 0x005dfb36, 0x02914d99, 0x025fd6c4, 0x028ce318, 0x01022365, 0x019db6d9, 0x03432d33, 0x0014c9f6}}}, + {X: Field{[10]uint32{0x036c51ef, 0x037e57ee, 0x00790142, 0x015d57bf, 0x032e7704, 0x01d33d50, 0x020f1447, 0x03fd5d96, 0x02838f95, 0x0031925a}}, Y: Field{[10]uint32{0x00d752a2, 0x0099ff2f, 0x038caca8, 0x0078e8e2, 0x031177b5, 0x022c16d4, 0x0186f01d, 0x0075ce4b, 0x01d6604d, 0x00330010}}}, + {X: Field{[10]uint32{0x00c11c74, 0x03f6dbda, 0x029ad933, 0x02da5187, 0x02425bf4, 0x02043674, 0x01e5e728, 0x00eff51d, 0x030a0b16, 0x0039e675}}, Y: Field{[10]uint32{0x00ba8600, 0x027f0605, 0x02b215ef, 0x0274689c, 0x03e50444, 0x00631b44, 0x00adcf76, 0x03b8fe6c, 0x005fe29b, 0x003f0d1d}}}, + {X: Field{[10]uint32{0x01489d3b, 0x03d16b17, 0x0175acb6, 0x01d30f73, 0x02820c87, 0x0060f60b, 0x032aa221, 0x02404540, 0x03b0151a, 0x001b4f25}}, Y: Field{[10]uint32{0x02d4749f, 0x03356c52, 0x023231c2, 0x03e7b99c, 0x0264b57d, 0x033b767b, 0x0295d438, 0x035dee3d, 0x01013d15, 0x0016aa2f}}}, + {X: Field{[10]uint32{0x02517539, 0x0163bfc2, 0x00165456, 0x030ea0be, 0x03b96d8e, 0x0131a8e6, 0x01cf2d9a, 0x01f79d06, 0x02001c1e, 0x0021b94f}}, Y: Field{[10]uint32{0x0344ad86, 0x01d7c06a, 0x03520ce4, 0x02b099b7, 0x00c24491, 0x00198c45, 0x01da5254, 0x03b3033b, 0x0370f2ef, 0x0003e2c6}}}, + {X: Field{[10]uint32{0x02a9880a, 0x014210d4, 0x0074347c, 0x02407cf2, 0x03075feb, 0x023b6ccf, 0x023267a7, 0x01f33aa6, 0x0339ac87, 0x00299070}}, Y: Field{[10]uint32{0x03982163, 0x029c9583, 0x01009c34, 0x031abf72, 0x01407559, 0x01f5a729, 0x03dc101b, 0x016b14f1, 0x014f2b27, 0x0036229b}}}, + {X: Field{[10]uint32{0x0182511a, 0x004d5a27, 0x00ceb9e0, 0x03550243, 0x00b925aa, 0x0378c5d5, 0x001de436, 0x02099916, 0x03a94d77, 0x000e8054}}, Y: Field{[10]uint32{0x00802035, 0x00cf5e96, 0x0055e35a, 0x00367c2b, 0x0111154b, 0x03fc1b3e, 0x0252df38, 0x017169e8, 0x02489493, 0x00003db2}}}, + {X: Field{[10]uint32{0x032b170f, 0x030a9851, 0x0058c5be, 0x035f18fd, 0x002c2e51, 0x009ba5bd, 0x0126b31d, 0x0326b501, 0x00e8a131, 0x0039e009}}, Y: Field{[10]uint32{0x034e0c53, 0x01fd9627, 0x008eaf19, 0x00125d90, 0x013a3092, 0x036ad977, 0x0093d9ce, 0x02c63c8d, 0x014b1ad7, 0x00315028}}}, + {X: Field{[10]uint32{0x006a5162, 0x004cce2a, 0x007cc7df, 0x01878b76, 0x007f05a1, 0x0064919a, 0x00380fab, 0x03c3b1d0, 0x005e8351, 0x001e1632}}, Y: Field{[10]uint32{0x02a6de1c, 0x035f96cd, 0x03a60928, 0x001969db, 0x037e658e, 0x03111354, 0x002897e7, 0x0281bf0e, 0x03445313, 0x0032b650}}}, + {X: Field{[10]uint32{0x030263e6, 0x01c51eb2, 0x024b82f3, 0x022b5666, 0x00ddb9da, 0x02597ccd, 0x0268c170, 0x037750d6, 0x02281c5b, 0x0001990f}}, Y: Field{[10]uint32{0x032cf79b, 0x022d6229, 0x03f36d72, 0x03e9a513, 0x016f2dc8, 0x02125a35, 0x008f9282, 0x02a82e6f, 0x02368ee1, 0x0027e7e7}}}, + {X: Field{[10]uint32{0x01b2254b, 0x0164b5ae, 0x035e7106, 0x008fa684, 0x02b31325, 0x03a81755, 0x03e8f9e3, 0x03c5325b, 0x0137a286, 0x0017cdb6}}, Y: Field{[10]uint32{0x0056310a, 0x011922e4, 0x02cfc2e5, 0x0070f21a, 0x029adb0e, 0x03cbf4e7, 0x02bf753e, 0x017fcb73, 0x037cc826, 0x0002758d}}}, + {X: Field{[10]uint32{0x023e2224, 0x019dfaf1, 0x0212fb17, 0x01c9187a, 0x02310f91, 0x00a140f0, 0x0226f266, 0x0282a97d, 0x01ae93d3, 0x00084bac}}, Y: Field{[10]uint32{0x036d1b67, 0x033f51d2, 0x02fa51df, 0x03fbd7f5, 0x010bbc5a, 0x03d4a09a, 0x038d9fdc, 0x00805b1c, 0x0233347f, 0x0014795f}}}, + {X: Field{[10]uint32{0x01e9eab4, 0x02175dcd, 0x0277e9a0, 0x024e39bc, 0x01dedb3b, 0x000f3898, 0x00481452, 0x027e4cca, 0x02c8940b, 0x00149a54}}, Y: Field{[10]uint32{0x01a42918, 0x013d3361, 0x0210952e, 0x023c50fe, 0x001d9aa5, 0x006013fe, 0x01fe2fd8, 0x00aabe69, 0x03a356df, 0x002195f3}}}, + {X: Field{[10]uint32{0x001c099f, 0x022f81d3, 0x036ef8f9, 0x00f2e5ea, 0x010419e0, 0x0254e8b4, 0x03a8778c, 0x00a04b92, 0x010def76, 0x00083c5d}}, Y: Field{[10]uint32{0x02cd485e, 0x03a2cc6e, 0x0060ebd8, 0x01396af0, 0x01d9d97b, 0x01a87b0b, 0x020bf881, 0x034a9fec, 0x01f53e7a, 0x0034bfba}}}, + {X: Field{[10]uint32{0x027ee910, 0x024db735, 0x02496da2, 0x0397bed9, 0x01dbc7f5, 0x03c4f1a4, 0x023cfb27, 0x00599708, 0x03b7ea01, 0x00388c68}}, Y: Field{[10]uint32{0x0365d53f, 0x02d7f02f, 0x0011e96e, 0x000bec5c, 0x0345e4f6, 0x0337c4f0, 0x027316c7, 0x0004c7cf, 0x002e18e8, 0x002a9917}}}, + {X: Field{[10]uint32{0x01c702ad, 0x005d2d89, 0x002cbed7, 0x0189a1e8, 0x01d01aa9, 0x014b9ca6, 0x02eac355, 0x009b74f6, 0x01523fd0, 0x001e9393}}, Y: Field{[10]uint32{0x01b965d2, 0x02ccc13f, 0x01b8471e, 0x03047e50, 0x007d2bdf, 0x0335f269, 0x00612044, 0x02396ab9, 0x02b6a739, 0x000d4704}}}, + {X: Field{[10]uint32{0x03f137b3, 0x013471b2, 0x03eaa557, 0x019c6688, 0x039a8589, 0x0000431b, 0x00a5a5ca, 0x0159c19f, 0x007e7696, 0x003f4bdc}}, Y: Field{[10]uint32{0x00315408, 0x01d4c1be, 0x038aa1ae, 0x021e78ef, 0x01df00e2, 0x033957d0, 0x039b1613, 0x0391ccc7, 0x030c1d5a, 0x00311690}}}, + {X: Field{[10]uint32{0x002bb89d, 0x024634fc, 0x01373f3f, 0x0293e099, 0x036c2ac2, 0x034c121d, 0x0011d676, 0x03d3f384, 0x001e8cf2, 0x003141b3}}, Y: Field{[10]uint32{0x01d3118a, 0x019078a9, 0x02f0c058, 0x01b8bd63, 0x01bea33d, 0x03dee982, 0x0247f6d1, 0x026cccbe, 0x03b37402, 0x002379b7}}}, + {X: Field{[10]uint32{0x035c0369, 0x0012dd6a, 0x02eebb82, 0x035f63e1, 0x00ad1bb4, 0x0327378f, 0x02b901c3, 0x03e6661a, 0x0102d9cc, 0x000ba9eb}}, Y: Field{[10]uint32{0x02b0ed43, 0x000c6543, 0x03d9ce40, 0x0189253a, 0x032b2135, 0x02bdda51, 0x03648ddd, 0x000c09d8, 0x03d86d75, 0x0004488a}}}, + {X: Field{[10]uint32{0x02159c5c, 0x00e33467, 0x0279c4c3, 0x00eb77f4, 0x00f8a602, 0x028ab04d, 0x004b421b, 0x039394be, 0x01923555, 0x002ae330}}, Y: Field{[10]uint32{0x0351ee1a, 0x007c8fe1, 0x00ff514d, 0x03ad532a, 0x015a5b54, 0x0311241e, 0x029fbda6, 0x0236f08f, 0x03bdcc26, 0x000b1238}}}, + {X: Field{[10]uint32{0x01dad430, 0x02bd01fd, 0x00e04c54, 0x009fcb3f, 0x02c37784, 0x029c4226, 0x0348e1c2, 0x0107ea46, 0x02e1cc7c, 0x00223fb0}}, Y: Field{[10]uint32{0x033ed80b, 0x02277ae2, 0x02cf3c4b, 0x019bec7f, 0x02dce306, 0x02c0d709, 0x02c7a049, 0x01994d7e, 0x02884f69, 0x00332d17}}}, + {X: Field{[10]uint32{0x034b0d41, 0x034dda1d, 0x0357c011, 0x02871931, 0x02940522, 0x03a83373, 0x02c31272, 0x03d746d0, 0x03ae1acc, 0x00101161}}, Y: Field{[10]uint32{0x030e787b, 0x028e4ffb, 0x01325f96, 0x03ad7395, 0x0163401d, 0x02cd46cd, 0x0368c369, 0x0187d3dc, 0x025b25ae, 0x003a373c}}}, + {X: Field{[10]uint32{0x02b9ab8a, 0x0093469f, 0x01097514, 0x033ef136, 0x0128a377, 0x009d4245, 0x00cf20ab, 0x02a30234, 0x02b9cade, 0x00229c07}}, Y: Field{[10]uint32{0x02ba5a45, 0x02737ab2, 0x0143a454, 0x0099bc0b, 0x01265e8b, 0x02a62d68, 0x0076154c, 0x02b1c30f, 0x018282a9, 0x0013c116}}}, + {X: Field{[10]uint32{0x01ad3d56, 0x00aa9e22, 0x0038929b, 0x001b1b59, 0x0366e15e, 0x00422930, 0x02141fdb, 0x00270a76, 0x01781940, 0x0030a04a}}, Y: Field{[10]uint32{0x035db5c1, 0x024db22d, 0x01afa974, 0x039db952, 0x029c9db5, 0x032c7951, 0x0034255d, 0x03a5a68a, 0x02fb6670, 0x00215027}}}, + {X: Field{[10]uint32{0x031d72fe, 0x03ee0401, 0x021298ad, 0x02d0aea9, 0x000f8ea4, 0x002e0af8, 0x03b04d19, 0x03210e4a, 0x02b1c810, 0x0027ff4d}}, Y: Field{[10]uint32{0x01b38404, 0x028f5a80, 0x03d871ca, 0x0291a997, 0x026f25fd, 0x03ea7f86, 0x002955eb, 0x0037e069, 0x024ba11f, 0x0004789e}}}, + {X: Field{[10]uint32{0x01a48b96, 0x01be1e69, 0x02b25f1c, 0x011d78ff, 0x0239e431, 0x0143bb18, 0x01072107, 0x02c05f2b, 0x0044bc92, 0x002b1280}}, Y: Field{[10]uint32{0x02b8dfe1, 0x02233907, 0x00de2d5f, 0x02fd15ed, 0x03f526bb, 0x011307d4, 0x03498533, 0x000bfc79, 0x03ba7310, 0x001071f0}}}, + {X: Field{[10]uint32{0x0306eb5a, 0x0393a19e, 0x0214224a, 0x01b35d93, 0x0357d808, 0x03467f17, 0x03c83bf9, 0x02a482cf, 0x001c157c, 0x0031e2c4}}, Y: Field{[10]uint32{0x038126c8, 0x00dfc674, 0x001d2deb, 0x033570a7, 0x02b7a9d7, 0x013cee3d, 0x035f533b, 0x0183ffeb, 0x006eb9d6, 0x0006a34b}}}, + {X: Field{[10]uint32{0x03147cd2, 0x0396ba1d, 0x03d13578, 0x02e39b45, 0x01c24b0d, 0x02bb7648, 0x03c1c2db, 0x0122e57c, 0x03055723, 0x003423ce}}, Y: Field{[10]uint32{0x022713cb, 0x0187899d, 0x00696914, 0x02bd77f8, 0x034987df, 0x0028e148, 0x02e3e5c9, 0x01f2eda6, 0x00de0a06, 0x0009ed7f}}}, + {X: Field{[10]uint32{0x01e312f5, 0x02312ca9, 0x004893d0, 0x01471602, 0x001091cf, 0x01f1707f, 0x01db0f1c, 0x03d87ae0, 0x003d5060, 0x00103a81}}, Y: Field{[10]uint32{0x0166b27c, 0x005a8007, 0x01f30848, 0x00fbed96, 0x02043de0, 0x0167c54d, 0x02719be2, 0x00c0bf80, 0x02c42836, 0x000bbc47}}}, + {X: Field{[10]uint32{0x018362e7, 0x0212b40d, 0x02ec39f1, 0x03e76ec7, 0x0117db73, 0x0090bae9, 0x00827b28, 0x02d2cb7a, 0x00bdfb53, 0x003e7441}}, Y: Field{[10]uint32{0x01771877, 0x0333f3d3, 0x03167296, 0x03052bdb, 0x0268f4e3, 0x01f50fc2, 0x02707b6d, 0x006520ae, 0x020b6c37, 0x0035d912}}}, + {X: Field{[10]uint32{0x03f9ddc9, 0x00dde37b, 0x02b6e570, 0x028905c4, 0x00fea5f8, 0x0268176b, 0x02132b40, 0x0120a539, 0x02ee14c3, 0x003749da}}, Y: Field{[10]uint32{0x01ceb7ef, 0x0260d4e9, 0x0066b7bc, 0x0180add0, 0x034803f7, 0x025a4343, 0x02de6553, 0x03bb25ff, 0x017d5d92, 0x00026f98}}}, + {X: Field{[10]uint32{0x01155d49, 0x03a13c18, 0x012f4c8b, 0x035de149, 0x032104c7, 0x03c36e36, 0x03d11f67, 0x01ef4319, 0x0039d5f1, 0x002148be}}, Y: Field{[10]uint32{0x023ea117, 0x00ea5656, 0x00777316, 0x0375667e, 0x02e01f3e, 0x03729256, 0x039b59cd, 0x007e3db2, 0x01518031, 0x002dde46}}}, + {X: Field{[10]uint32{0x02b5b225, 0x000c362d, 0x0264eeb2, 0x01992ff3, 0x02510491, 0x018519ca, 0x0002a624, 0x02fa383f, 0x02bdb4f3, 0x001cca00}}, Y: Field{[10]uint32{0x02a3c6f3, 0x01aadc91, 0x01f8e35a, 0x018b4455, 0x02d9022d, 0x0302c973, 0x0105f92c, 0x03b875a9, 0x01ec590e, 0x001ef533}}}, + {X: Field{[10]uint32{0x0167af62, 0x036d5cd6, 0x02fc68fb, 0x02bf1125, 0x01f5ffcb, 0x022f7a85, 0x0273276b, 0x020d4887, 0x01a12c4f, 0x0006cd90}}, Y: Field{[10]uint32{0x01664048, 0x03619b66, 0x021cef0f, 0x00c81ea3, 0x000b824c, 0x02d33407, 0x01e2e153, 0x00adecbb, 0x02f5e5d1, 0x0000f543}}}, + {X: Field{[10]uint32{0x0301a7ce, 0x0254974f, 0x00c852c7, 0x01576efa, 0x010c8972, 0x02d9b4e4, 0x02cbe60c, 0x0213ffb5, 0x02184e92, 0x0034c0d3}}, Y: Field{[10]uint32{0x01d09e25, 0x03e3e67e, 0x013b48c4, 0x0313bacd, 0x0211172a, 0x017c6e87, 0x0094b058, 0x01439ca8, 0x030416ce, 0x002cd998}}}, + {X: Field{[10]uint32{0x01e9db17, 0x00c9c29a, 0x0176d65c, 0x00aa8eb4, 0x0261c6db, 0x023d3e16, 0x03a44610, 0x03d7bc63, 0x0200bd22, 0x00239ea0}}, Y: Field{[10]uint32{0x03530568, 0x012cec7c, 0x01ceadee, 0x01d466cd, 0x004a4824, 0x01c7d335, 0x03536edc, 0x025e6fe1, 0x03b51cce, 0x002107f8}}}, + {X: Field{[10]uint32{0x00a4027e, 0x02c2d958, 0x009e85da, 0x00f60e40, 0x01c4af5f, 0x005086b8, 0x02aee276, 0x0219c746, 0x00de29ab, 0x003f332d}}, Y: Field{[10]uint32{0x037f993b, 0x02f48b83, 0x01c47fa6, 0x0352fa8a, 0x01a6e269, 0x03a5df9c, 0x036ac069, 0x0226bf56, 0x0396203b, 0x002808a7}}}, + {X: Field{[10]uint32{0x004c8a26, 0x00b001f9, 0x02576925, 0x01d87e67, 0x039e74a4, 0x03ab5c16, 0x00681f0a, 0x02060213, 0x017f4435, 0x0039a33f}}, Y: Field{[10]uint32{0x0028f82e, 0x004874b1, 0x013c1672, 0x01863a7c, 0x01712291, 0x03c343ad, 0x0378d50c, 0x038ab908, 0x00a7b027, 0x002b7670}}}, + {X: Field{[10]uint32{0x006891d8, 0x0381184b, 0x029a8072, 0x0022dc9b, 0x0263bfe0, 0x022ecc94, 0x026de7ac, 0x02b05921, 0x03ad4b81, 0x0022dbc3}}, Y: Field{[10]uint32{0x024bc9ca, 0x03b2bb6e, 0x01288092, 0x023e98a4, 0x0391493e, 0x0289ff84, 0x008d328c, 0x0012de02, 0x0108a8d6, 0x0026eb59}}}, + {X: Field{[10]uint32{0x024b78b1, 0x035266f5, 0x021ba8cf, 0x010d5ea4, 0x02470f89, 0x0019d185, 0x03178cf2, 0x00652498, 0x00aa37ac, 0x00042283}}, Y: Field{[10]uint32{0x0265bf55, 0x0067d928, 0x032a75a8, 0x0149844a, 0x039b7c04, 0x03fd45f1, 0x03e302e1, 0x0255bd7f, 0x0122be05, 0x001a0543}}}, + {X: Field{[10]uint32{0x0357edb6, 0x0100a131, 0x0208b429, 0x02949952, 0x02ab8e13, 0x00dc2971, 0x032daa83, 0x0315e474, 0x03330844, 0x003fb460}}, Y: Field{[10]uint32{0x02457fe5, 0x02707fcd, 0x01e56f83, 0x00bb4fe2, 0x00b1b52c, 0x0254ba8d, 0x0229a976, 0x02ae13ae, 0x03378395, 0x0019ef77}}}, + {X: Field{[10]uint32{0x00170a2f, 0x02cbb824, 0x00da501f, 0x02108d46, 0x00848b2d, 0x02933789, 0x03ed6f10, 0x01b3cd42, 0x039decd5, 0x002fafec}}, Y: Field{[10]uint32{0x03a11573, 0x0350328a, 0x0275197d, 0x036c2987, 0x0005acb2, 0x0051b652, 0x0125fbde, 0x03e21c8a, 0x00b3bb86, 0x0004c0ad}}}, + {X: Field{[10]uint32{0x001e716c, 0x01efca06, 0x0286c9c6, 0x015e74a2, 0x02af8d50, 0x01369ed5, 0x0070d3cb, 0x034edb11, 0x02ed2a58, 0x0019c4d6}}, Y: Field{[10]uint32{0x02fd6664, 0x01202723, 0x03040019, 0x00fc14fa, 0x0230fa2f, 0x03cdd111, 0x00f3e778, 0x038fbf72, 0x02ab2786, 0x0025f102}}}, + {X: Field{[10]uint32{0x0354f90e, 0x024a3950, 0x038b9c37, 0x01782436, 0x03c3dea7, 0x0135b7c0, 0x0309dd41, 0x01b96b36, 0x01bb0956, 0x002c03ad}}, Y: Field{[10]uint32{0x029b1258, 0x03e4fbb9, 0x0164d8ae, 0x01c044b2, 0x02ccc3a6, 0x02666bce, 0x0173aa63, 0x0399d3a6, 0x02411cb6, 0x001b4483}}}, + {X: Field{[10]uint32{0x03bb73a2, 0x03cce13c, 0x03bb8ecd, 0x024b7a7b, 0x01233375, 0x028e6cb6, 0x01db6d3b, 0x00808bc2, 0x026cbe8d, 0x001c86c6}}, Y: Field{[10]uint32{0x0205310f, 0x01632392, 0x020885b4, 0x039e542f, 0x014acbb2, 0x0253e01d, 0x01ae1f2e, 0x003d1c1d, 0x0362631a, 0x00336d06}}}, + {X: Field{[10]uint32{0x038a0837, 0x028f9137, 0x03f71d10, 0x020e5226, 0x0242f60b, 0x02431083, 0x0147cde1, 0x004b2a37, 0x00ac015b, 0x0032e35e}}, Y: Field{[10]uint32{0x0296dbc2, 0x01f33ffa, 0x022d5d17, 0x022c4206, 0x03abdc44, 0x03ecb849, 0x00d3846c, 0x00d9d7a3, 0x01a6a307, 0x00202f8c}}}, + {X: Field{[10]uint32{0x00781920, 0x03b1e15b, 0x0017a0af, 0x00af8bb8, 0x0137e5c5, 0x03450f95, 0x03f3ae66, 0x03621348, 0x03cc4919, 0x0012473e}}, Y: Field{[10]uint32{0x02874189, 0x01fb3115, 0x03ee62b1, 0x0353b706, 0x003ba714, 0x01367cbb, 0x004d29cc, 0x00c2234d, 0x03502628, 0x001d8c86}}}, + {X: Field{[10]uint32{0x02b507b4, 0x01c02cda, 0x0027cfb3, 0x011b17af, 0x038145d1, 0x02088c0e, 0x02ed33ff, 0x00898c8e, 0x03ee4899, 0x0001b28c}}, Y: Field{[10]uint32{0x00b11f4e, 0x00fa34b0, 0x03ec644e, 0x002a7276, 0x038c376a, 0x002548af, 0x00a20cfd, 0x03419078, 0x02b3f189, 0x0025adce}}}, + {X: Field{[10]uint32{0x01d842c7, 0x032aea06, 0x00f8997c, 0x03be6058, 0x001bf602, 0x008b3e9a, 0x03b33d38, 0x025c6db2, 0x03cb3c48, 0x001b47f7}}, Y: Field{[10]uint32{0x03b1713f, 0x01b4a733, 0x0376909c, 0x0311565a, 0x00fa555a, 0x01bc1180, 0x017c0629, 0x02098979, 0x03c46608, 0x00020af1}}}, + {X: Field{[10]uint32{0x02a43554, 0x038fea7f, 0x01b55c88, 0x00f0f87a, 0x02daeb53, 0x01ac8de5, 0x01ac3ca3, 0x00bd069a, 0x02991cf9, 0x0028fa05}}, Y: Field{[10]uint32{0x012855f1, 0x02520c8c, 0x020fa25e, 0x03d5e1b4, 0x0165887d, 0x015014c2, 0x0206b0b4, 0x0119ebe8, 0x029be802, 0x0021e9be}}}, + {X: Field{[10]uint32{0x01d49c70, 0x0230fa1f, 0x03ab571f, 0x013cfcbf, 0x007f570e, 0x0142cab1, 0x02c7438d, 0x030ca53a, 0x03d7cbfb, 0x003f212a}}, Y: Field{[10]uint32{0x03f73dd9, 0x014ddf69, 0x0075b691, 0x00ee959b, 0x02589f6c, 0x0266d905, 0x01b3f1cd, 0x015ac396, 0x02690713, 0x001d11ec}}}, + {X: Field{[10]uint32{0x0355d1b1, 0x02090200, 0x01769539, 0x02a1ce9a, 0x01af4e02, 0x03b28568, 0x00d31252, 0x0056e860, 0x02408fc5, 0x002fac8c}}, Y: Field{[10]uint32{0x019c1459, 0x030d0fd4, 0x01e95b3b, 0x028417ae, 0x00e2bbe6, 0x006dd96c, 0x02deba93, 0x02a6ab97, 0x000d6fa8, 0x0004be92}}}, + {X: Field{[10]uint32{0x0299eb8e, 0x0180d906, 0x00f13df7, 0x00ed810d, 0x010a50e6, 0x02f0094a, 0x02373d71, 0x035fcc66, 0x0279cffa, 0x001a2245}}, Y: Field{[10]uint32{0x00772fb8, 0x01ed6dda, 0x00524da0, 0x0258b9bb, 0x037736ce, 0x01b40540, 0x02a7c1e8, 0x022a8b4b, 0x01b76db2, 0x00102de3}}}, + {X: Field{[10]uint32{0x03068817, 0x0007b8ae, 0x01d96ed4, 0x03350a3a, 0x03b42e2f, 0x023ed754, 0x022f736e, 0x02c103f7, 0x01ad1ae7, 0x0003b10d}}, Y: Field{[10]uint32{0x0096f9f2, 0x02fb23bf, 0x03ac244b, 0x01175943, 0x0126860c, 0x01b13de5, 0x0028a856, 0x010dbd2a, 0x02aa1283, 0x0004efdb}}}, + {X: Field{[10]uint32{0x03de3033, 0x0165341a, 0x0249f374, 0x01d9885a, 0x0060a755, 0x01df9241, 0x03b7ce7f, 0x01a22df7, 0x02fa661f, 0x0019e7d6}}, Y: Field{[10]uint32{0x03617ca1, 0x03ecd71b, 0x017094e0, 0x00ca921f, 0x02c8fddd, 0x023c172d, 0x00f14bfc, 0x013f6956, 0x03d96c25, 0x003fcfff}}}, + {X: Field{[10]uint32{0x0233be60, 0x026994bd, 0x02d68ba8, 0x000bb3ad, 0x011aa2fc, 0x010c1ec8, 0x0348aeb6, 0x009b97ef, 0x00ea05dc, 0x0027faf6}}, Y: Field{[10]uint32{0x02630bee, 0x0390d923, 0x0099272b, 0x0258b1de, 0x033fc5dc, 0x02ef1783, 0x036e785c, 0x00e292b4, 0x03c8ea62, 0x0030219e}}}, + {X: Field{[10]uint32{0x000b1601, 0x00df24d8, 0x03acfe21, 0x02046d64, 0x010347b3, 0x03763e7c, 0x02bed696, 0x02d23b6d, 0x0154c534, 0x003621ac}}, Y: Field{[10]uint32{0x0375d077, 0x02ad7583, 0x03964f10, 0x03064edd, 0x03d74028, 0x03faa8fd, 0x02246c8e, 0x036aa713, 0x0118aa07, 0x002932f0}}}, + {X: Field{[10]uint32{0x006e9d47, 0x03929d11, 0x0349ab7e, 0x009f73b0, 0x01096a8e, 0x03fc85e8, 0x03f6ab68, 0x028e9820, 0x03efc187, 0x002be332}}, Y: Field{[10]uint32{0x03e941f0, 0x01c5b3da, 0x03dc4990, 0x00cc96a3, 0x031662a7, 0x0395539b, 0x025b625b, 0x000e49f6, 0x027c9988, 0x0000fb8c}}}, + {X: Field{[10]uint32{0x01d3d26a, 0x00662f1f, 0x033654a6, 0x0162a65e, 0x0042d334, 0x012952a1, 0x0051d224, 0x0098728d, 0x00e7891c, 0x0007a600}}, Y: Field{[10]uint32{0x01a215d4, 0x0269dcd9, 0x013bd566, 0x03259bdd, 0x03978120, 0x020b9acd, 0x031a321e, 0x03f03757, 0x0186bd6f, 0x000c8be2}}}, + {X: Field{[10]uint32{0x03150044, 0x0193159d, 0x015e415d, 0x029a8b49, 0x00aae4ff, 0x00ea43cc, 0x000dc97f, 0x02002561, 0x02f29f00, 0x00045718}}, Y: Field{[10]uint32{0x02d8af95, 0x035f8cba, 0x01a14a8f, 0x017a2f0b, 0x02cceef9, 0x0393f7c2, 0x03660e01, 0x03397bf5, 0x00127e37, 0x00136513}}}, + {X: Field{[10]uint32{0x02e0178c, 0x01565a0a, 0x02ba2598, 0x017fd0a0, 0x033f5313, 0x0144896f, 0x00d78e8e, 0x01e776cd, 0x039dacbf, 0x000072e7}}, Y: Field{[10]uint32{0x011a4bf5, 0x01a32d2f, 0x0284a50c, 0x03421577, 0x02d7b602, 0x02f3c8d3, 0x01595e20, 0x026f2508, 0x00e37a18, 0x0023f4e9}}}, + {X: Field{[10]uint32{0x03bfe357, 0x01e7b94b, 0x0370b66a, 0x0163e779, 0x01af86d2, 0x0326478e, 0x02b2a5bd, 0x03059d2e, 0x03c463e4, 0x0018a856}}, Y: Field{[10]uint32{0x02f52749, 0x02f792e3, 0x01e9f9f7, 0x0107a3af, 0x02d376fe, 0x01bd1548, 0x02da69fe, 0x01f93495, 0x029fd946, 0x002de3f2}}}, + {X: Field{[10]uint32{0x02df505e, 0x0047a4d7, 0x01ec454b, 0x00a96867, 0x026bd2c8, 0x01cefb53, 0x0170914a, 0x006520c5, 0x00e05bf3, 0x0015d29b}}, Y: Field{[10]uint32{0x00001318, 0x0206a5d7, 0x00b789b2, 0x02ea2ed7, 0x02d02dba, 0x006a6943, 0x02a60b8c, 0x03cce3c3, 0x02cccbd6, 0x0039ecb8}}}, + {X: Field{[10]uint32{0x024084e6, 0x02b47549, 0x023194ad, 0x02ad5839, 0x01c5ae50, 0x027b493f, 0x039cedad, 0x018692eb, 0x037ca3a3, 0x001931b8}}, Y: Field{[10]uint32{0x00116067, 0x025bb59a, 0x008d3f79, 0x003a09c7, 0x004b7a48, 0x00d6b801, 0x0054a07f, 0x02d01027, 0x035656b6, 0x0039b90b}}}, + {X: Field{[10]uint32{0x0100fd84, 0x002041d2, 0x03b11553, 0x011ab79f, 0x0371b277, 0x01d581e9, 0x0246af84, 0x02379555, 0x0297fe4a, 0x00124196}}, Y: Field{[10]uint32{0x030ae7f9, 0x0217c6b5, 0x03342834, 0x01efeed0, 0x0094e721, 0x01ec9d9f, 0x038eb43c, 0x00c2426a, 0x009f67a0, 0x0026175a}}}, + {X: Field{[10]uint32{0x030999cb, 0x02532a8c, 0x009aa443, 0x0079f962, 0x028500c9, 0x03a227cc, 0x02a683b7, 0x0242f61d, 0x03f91857, 0x001bf4cb}}, Y: Field{[10]uint32{0x01d2de3b, 0x025ea321, 0x0278c644, 0x024e3c69, 0x03efbd64, 0x031afc07, 0x013784e9, 0x03c975ea, 0x00841be1, 0x0004bfa0}}}, + {X: Field{[10]uint32{0x02d3b185, 0x02e4ad98, 0x0098b4eb, 0x03109bf7, 0x012d6d12, 0x01c25214, 0x0334812f, 0x027239bf, 0x00da4818, 0x001299f5}}, Y: Field{[10]uint32{0x038150f5, 0x033a945f, 0x01540684, 0x0174e269, 0x033e5009, 0x03e9c6e3, 0x03c668ee, 0x02ddddcd, 0x03f2f6e5, 0x00163aa0}}}, + {X: Field{[10]uint32{0x039f4db2, 0x0386fae9, 0x00c85987, 0x03165708, 0x00edecf4, 0x026b6d19, 0x020752db, 0x009dc174, 0x0131d3a9, 0x003a86b2}}, Y: Field{[10]uint32{0x0322b83e, 0x03dbcd19, 0x008309c3, 0x014da292, 0x03426b57, 0x001bf646, 0x0316597b, 0x02580560, 0x030e25aa, 0x0033da26}}}, + {X: Field{[10]uint32{0x01545c5a, 0x0136fd37, 0x006c12de, 0x03cfc65b, 0x0161414a, 0x02af2672, 0x032663f7, 0x00149f55, 0x026e248a, 0x00232cd6}}, Y: Field{[10]uint32{0x000cfcfa, 0x0254b99a, 0x02a7c4a3, 0x02afcdaf, 0x01c43292, 0x00235403, 0x02dfc3fa, 0x0336d99b, 0x00e047da, 0x0012ccb9}}}, + {X: Field{[10]uint32{0x027f21c8, 0x02673374, 0x008e3c8d, 0x02110c1e, 0x00843186, 0x01160558, 0x02f8dfbf, 0x030bab3f, 0x000cf150, 0x00091f20}}, Y: Field{[10]uint32{0x031d0db6, 0x010ba147, 0x030a7579, 0x01776cf9, 0x02a70839, 0x020a7adf, 0x026462f5, 0x03468398, 0x00dc914f, 0x003320b6}}}, + {X: Field{[10]uint32{0x03426673, 0x012191cc, 0x02482c9f, 0x0133b480, 0x025e0c4a, 0x0040dc23, 0x00f35666, 0x0249f3ec, 0x03c407fb, 0x001950f5}}, Y: Field{[10]uint32{0x0107ebab, 0x023cf51e, 0x0019c88d, 0x00c0ff72, 0x0020bbc7, 0x00c7a9d4, 0x00ae0d16, 0x02b5d605, 0x029a69b4, 0x003894ac}}}, + {X: Field{[10]uint32{0x0388e6d0, 0x0155ad30, 0x026c29b3, 0x036cb840, 0x02d5e759, 0x03d72705, 0x01da4aca, 0x00ce8e82, 0x0255d81c, 0x00313c44}}, Y: Field{[10]uint32{0x00a8fd49, 0x03554747, 0x014f24fc, 0x02ac61ba, 0x0195379e, 0x0123d463, 0x00e5530e, 0x022ad605, 0x02a81af4, 0x0038b98d}}}, + {X: Field{[10]uint32{0x02019eec, 0x0363be57, 0x005981ba, 0x023f2798, 0x01b08284, 0x012bd681, 0x003d92a1, 0x00e6ddce, 0x029d85da, 0x0033c61a}}, Y: Field{[10]uint32{0x0079e3fc, 0x01156f2c, 0x0064248f, 0x01f81873, 0x006b49f3, 0x0100425a, 0x03672a16, 0x03f8214f, 0x021bc860, 0x0032af78}}}, + {X: Field{[10]uint32{0x02ea8f32, 0x02ba40e1, 0x037f6be9, 0x011cf517, 0x00fe9d1d, 0x0222e3f6, 0x015c2c7a, 0x03704f96, 0x0353ad69, 0x0039b0f8}}, Y: Field{[10]uint32{0x00690be1, 0x001f0a2b, 0x02b57021, 0x008357b4, 0x0396b5a9, 0x012617cc, 0x0210800a, 0x01707485, 0x00c94f45, 0x001f4efb}}}, + {X: Field{[10]uint32{0x01060988, 0x029ecbb0, 0x01c118d6, 0x03ddcc34, 0x01d1ba01, 0x033c8a44, 0x0295dc6b, 0x01553551, 0x03a39bcb, 0x000e09ec}}, Y: Field{[10]uint32{0x0225a211, 0x0142bff2, 0x027bfd9f, 0x01890648, 0x00c800a3, 0x02e3d304, 0x0018c5ec, 0x03ba0c6e, 0x0047b7c9, 0x000c904c}}}, + {X: Field{[10]uint32{0x006d24fa, 0x01582373, 0x0013e48f, 0x021446d5, 0x004b55ed, 0x0102c3bd, 0x01ae898c, 0x01268aa3, 0x0138a4b1, 0x003fcdf3}}, Y: Field{[10]uint32{0x01c49048, 0x00cb2b2e, 0x03ceca68, 0x0354810c, 0x01f3ffde, 0x01a14ea5, 0x03a489b8, 0x019995f0, 0x01198f4c, 0x00179856}}}, + {X: Field{[10]uint32{0x020ce509, 0x034fa28c, 0x001def68, 0x01f11545, 0x01d9e53c, 0x03a0edd4, 0x03343229, 0x00beb87b, 0x03c85b49, 0x002f7fd3}}, Y: Field{[10]uint32{0x03de3d20, 0x013f7822, 0x00b8a43b, 0x0139135c, 0x02531f8a, 0x02656784, 0x015088a2, 0x01759985, 0x00649dcc, 0x003a3f66}}}, + {X: Field{[10]uint32{0x03bcd0af, 0x02a6cf0e, 0x02aef625, 0x001c9051, 0x02e59d10, 0x00063c47, 0x032719d9, 0x03cb55fe, 0x029c313f, 0x003f5ae8}}, Y: Field{[10]uint32{0x01c1079d, 0x00fa5f7d, 0x02bf6de7, 0x03a078e2, 0x035018db, 0x0065ae1d, 0x01f584b3, 0x00430c0e, 0x035e9133, 0x00061f6b}}}, + {X: Field{[10]uint32{0x0329ff28, 0x02dc42c6, 0x03b621d0, 0x01e05017, 0x004f4b5f, 0x02b0c05e, 0x032ae1c3, 0x01a4a7bd, 0x022d4860, 0x003a8f10}}, Y: Field{[10]uint32{0x03bf208c, 0x03fbe48c, 0x02af2564, 0x01f3be66, 0x01d10b37, 0x028c5b89, 0x03637eef, 0x0381bf0d, 0x001ec6c3, 0x0039162d}}}, + {X: Field{[10]uint32{0x007b3978, 0x01c14fd2, 0x03c390f8, 0x03b6bc6c, 0x0002ba8a, 0x002d166e, 0x0228924f, 0x03580234, 0x01334982, 0x001194dc}}, Y: Field{[10]uint32{0x01adf3f0, 0x03fd9693, 0x017006bb, 0x0368ee25, 0x023b2444, 0x00850f72, 0x003bb29e, 0x0277bfc9, 0x014c1318, 0x003f6599}}}, + {X: Field{[10]uint32{0x0178d8f5, 0x00dc5da1, 0x039dd996, 0x012a8b43, 0x01b5b29b, 0x03e78414, 0x036227f9, 0x001a6ab1, 0x03f11226, 0x003f6924}}, Y: Field{[10]uint32{0x01d46fa3, 0x02e1b1f8, 0x03a06d8e, 0x02d4958c, 0x02e04e55, 0x02600e98, 0x03a69d7f, 0x004db7d0, 0x013df63d, 0x00168cd6}}}, + {X: Field{[10]uint32{0x01f3e4c1, 0x0185d3ce, 0x000cd096, 0x015f15c8, 0x027ab5e7, 0x03a8dbfb, 0x028e2835, 0x00062951, 0x02e95f09, 0x001d3f10}}, Y: Field{[10]uint32{0x018751f0, 0x02c94848, 0x010b32a8, 0x01d52ff4, 0x033760e0, 0x017e3d75, 0x006204d4, 0x0324536a, 0x03403802, 0x00332a82}}}, + {X: Field{[10]uint32{0x00483d53, 0x022ec6bb, 0x03bafe11, 0x030a0503, 0x030d98f8, 0x0239051d, 0x03818da5, 0x01e68032, 0x004a997b, 0x0002633b}}, Y: Field{[10]uint32{0x02aaec08, 0x01a26b1f, 0x02ae4d81, 0x02782103, 0x01ac422d, 0x020b0675, 0x03b82fa1, 0x017354d9, 0x00581494, 0x000bf398}}}, + {X: Field{[10]uint32{0x03cba60f, 0x00dd2c44, 0x01fc13c2, 0x01025b31, 0x01e4fa15, 0x025ff55d, 0x015119f6, 0x032f7081, 0x01b789a5, 0x0031d0b7}}, Y: Field{[10]uint32{0x02f3532d, 0x02837a91, 0x0168013f, 0x03d3cac7, 0x01b32248, 0x039b6ea8, 0x002474b0, 0x02438750, 0x012834a9, 0x0026c2bc}}}, + {X: Field{[10]uint32{0x0391eb89, 0x0027f479, 0x0019b774, 0x0360ec4e, 0x005b5973, 0x03131c89, 0x00979136, 0x0019aad6, 0x004f9a78, 0x0036e8b8}}, Y: Field{[10]uint32{0x033baf43, 0x03f29798, 0x016a889d, 0x03821c11, 0x03aa0e90, 0x005e3c1d, 0x00240e7a, 0x017dd05a, 0x01223adb, 0x000d1d1e}}}, + {X: Field{[10]uint32{0x02f6538d, 0x0271a710, 0x01fbf106, 0x02183ada, 0x036cc47f, 0x03091cac, 0x0184dcb6, 0x021619ee, 0x02436e59, 0x001b532b}}, Y: Field{[10]uint32{0x01e0a84f, 0x02ec7cf5, 0x01cedb98, 0x019f59fc, 0x02125c2b, 0x00fbfbd4, 0x03c53c92, 0x03df3b75, 0x00c9f0c4, 0x0031fed6}}}, + {X: Field{[10]uint32{0x00523982, 0x005a80ee, 0x0010f9cc, 0x00e5bf65, 0x029ec5b5, 0x02eb8a46, 0x0264ed43, 0x01ec156d, 0x036ed5b6, 0x0013115f}}, Y: Field{[10]uint32{0x00f344eb, 0x007fb548, 0x00e988e9, 0x01ffb086, 0x02a435f4, 0x029ca09e, 0x022ed682, 0x03867d51, 0x03cf20aa, 0x00124b96}}}, + {X: Field{[10]uint32{0x0346eb3f, 0x035107f2, 0x018179cd, 0x030c1933, 0x0151fd8a, 0x01d2b8a5, 0x00033bfd, 0x022907d6, 0x01223477, 0x00135f9a}}, Y: Field{[10]uint32{0x022750c4, 0x024bd1b1, 0x012ad0c0, 0x001ef443, 0x036d7bbd, 0x01eb692e, 0x00538791, 0x0274f0e9, 0x00b2ff5c, 0x001d5bb0}}}, + {X: Field{[10]uint32{0x03d464b2, 0x0311f8c1, 0x0115cfef, 0x027292be, 0x004a4839, 0x02dd3be5, 0x03c565ea, 0x0351e6f6, 0x025069ba, 0x0002b16f}}, Y: Field{[10]uint32{0x02874345, 0x02df3eb7, 0x00381928, 0x02a94a6d, 0x008bad5d, 0x02739176, 0x0322c546, 0x0042d8dd, 0x03febc58, 0x000c91b8}}}, + {X: Field{[10]uint32{0x023995b2, 0x027a1036, 0x002d15d6, 0x002d8362, 0x0224f91e, 0x014d2c96, 0x026a4812, 0x0004e6ff, 0x01412135, 0x001f6a23}}, Y: Field{[10]uint32{0x00b9c587, 0x0080d23c, 0x03eb5cbc, 0x00b262b6, 0x026a2d09, 0x025dc90c, 0x00bb03cf, 0x0293e1c0, 0x018d62a7, 0x0026222b}}}, + {X: Field{[10]uint32{0x01abf149, 0x014af8ec, 0x037d4e8b, 0x00ac1744, 0x015d3b92, 0x034f3ad2, 0x01aa3eb4, 0x02734832, 0x031a6323, 0x000e27fc}}, Y: Field{[10]uint32{0x00fe7c93, 0x03000dce, 0x02d49dc3, 0x03b55456, 0x01042f54, 0x01db0521, 0x022ab22b, 0x002fca28, 0x022fbc84, 0x002c3b0a}}}, + {X: Field{[10]uint32{0x016c4370, 0x009e9756, 0x036f8f3c, 0x012637f3, 0x02a94b2e, 0x00f55cdb, 0x025afaad, 0x00a2cba9, 0x02cf5fb1, 0x00307306}}, Y: Field{[10]uint32{0x034fd38e, 0x010279a4, 0x0153b27c, 0x02a706ec, 0x00ecfec6, 0x028aa233, 0x006bf2da, 0x02b4c5b3, 0x004d1986, 0x002240d6}}}, + {X: Field{[10]uint32{0x03c9aa3a, 0x01462d21, 0x03cf98b3, 0x015fa46c, 0x0002a349, 0x00725b01, 0x0340be83, 0x01a28a91, 0x0252b927, 0x000e66b3}}, Y: Field{[10]uint32{0x00800005, 0x03ac4d12, 0x02869786, 0x030f2812, 0x03fd9af1, 0x035827e8, 0x017ae095, 0x00e91e84, 0x00b3abdb, 0x002420c5}}}, + {X: Field{[10]uint32{0x0206d0a2, 0x020eea6e, 0x03c76d82, 0x001832b6, 0x01470cc6, 0x001694ae, 0x02d98593, 0x000695c0, 0x03fd8c9d, 0x0001a550}}, Y: Field{[10]uint32{0x031057df, 0x03a2865c, 0x01d1b6f4, 0x030e2a40, 0x00404eb1, 0x00ca6022, 0x0348f17b, 0x01cbb4b8, 0x03d9a0c3, 0x003a6639}}}, + {X: Field{[10]uint32{0x00200100, 0x02dabdfa, 0x02d6d400, 0x00f3dc0e, 0x00911e55, 0x01cac70a, 0x01289a58, 0x011bbd68, 0x014fdf9b, 0x00085cb5}}, Y: Field{[10]uint32{0x03687a8c, 0x00625c46, 0x035d9edc, 0x03afd90a, 0x0334a8fb, 0x01cac89b, 0x0020df57, 0x00397832, 0x007d3b79, 0x0008486d}}}, + {X: Field{[10]uint32{0x015e8b56, 0x017df3a7, 0x03f286d4, 0x00e84390, 0x01cc2713, 0x01248e59, 0x026847d2, 0x00939743, 0x03e937a3, 0x003d81bd}}, Y: Field{[10]uint32{0x0286e007, 0x039d5c4f, 0x008d1a30, 0x02024728, 0x03f5b805, 0x024c9284, 0x03379448, 0x00878b44, 0x03b8622a, 0x001c004f}}}, + {X: Field{[10]uint32{0x0040fc99, 0x03639c5f, 0x0214edfc, 0x00b7526a, 0x012f95bb, 0x00d0abcd, 0x0032013b, 0x02d93c7d, 0x00c2dfce, 0x0027c548}}, Y: Field{[10]uint32{0x018e863d, 0x035534e2, 0x001996ca, 0x029040c2, 0x02d53dc0, 0x0192a41f, 0x024fe3b7, 0x03c0123e, 0x0226feb1, 0x003fa3f2}}}, + {X: Field{[10]uint32{0x031eaa08, 0x024dc288, 0x0260518a, 0x00632ca1, 0x0053afe4, 0x01724f4e, 0x00674eb7, 0x019dbbac, 0x036e7587, 0x00199c2b}}, Y: Field{[10]uint32{0x03eb09f3, 0x02933b92, 0x0053734b, 0x03314936, 0x00fb59fc, 0x02ec4bf6, 0x03fcee90, 0x01c7b825, 0x035edfc0, 0x000a64ff}}}, + {X: Field{[10]uint32{0x03898350, 0x0166a52c, 0x0152465f, 0x013ab5b2, 0x0140650a, 0x03a5530b, 0x00a4e2fe, 0x0312f393, 0x018b345c, 0x000571b5}}, Y: Field{[10]uint32{0x0363cf7f, 0x0039de28, 0x02cf3a6b, 0x02a9cf7c, 0x00221b12, 0x014a34b0, 0x020f3adf, 0x01865996, 0x013b4727, 0x00022531}}}, + {X: Field{[10]uint32{0x01389621, 0x00665ddd, 0x024548a9, 0x0082583a, 0x00adfffd, 0x017e1692, 0x0293ef17, 0x03790b24, 0x02bf60db, 0x002f12ad}}, Y: Field{[10]uint32{0x01040e42, 0x00d1d846, 0x01a4437a, 0x01d18552, 0x0100791a, 0x0335c64c, 0x016bb68e, 0x038a9d17, 0x00ba24a4, 0x003f8a28}}}, + {X: Field{[10]uint32{0x013e6ee1, 0x03cb8443, 0x01c8054e, 0x0141001f, 0x0064f20e, 0x031c0eea, 0x015e87f1, 0x03cbdb92, 0x006323fb, 0x00176ac7}}, Y: Field{[10]uint32{0x02695d93, 0x00d2a194, 0x023059c1, 0x0305acc3, 0x03e7f01a, 0x039a2ffe, 0x02db4153, 0x0182f6b9, 0x0200cf44, 0x0007f430}}}, + {X: Field{[10]uint32{0x028acaf2, 0x01f0625a, 0x03bb2dd6, 0x03639c0b, 0x035cea0b, 0x030ce73a, 0x0228dbb0, 0x01f111ef, 0x0157d735, 0x000b7c73}}, Y: Field{[10]uint32{0x02f1b9e8, 0x03d096b8, 0x01741492, 0x019e6577, 0x0186eefa, 0x0136ddbd, 0x039c0319, 0x0323770e, 0x001120cb, 0x000cc648}}}, + {X: Field{[10]uint32{0x00d9ab8d, 0x01377bd8, 0x02fea058, 0x019054d5, 0x023d9f97, 0x034aeb1d, 0x0100585e, 0x036bc20c, 0x00175a02, 0x000b606b}}, Y: Field{[10]uint32{0x01f9a0b7, 0x02060f0b, 0x011c9cd5, 0x00b33a7d, 0x0021052e, 0x039b09b9, 0x0297fd49, 0x0217d5e0, 0x00d13b17, 0x003e6423}}}, + {X: Field{[10]uint32{0x037dc097, 0x0241c090, 0x00db59ef, 0x03d3c47a, 0x0367b1e7, 0x00d5bac5, 0x000d40a5, 0x00b9cc91, 0x0362fb73, 0x0007eb05}}, Y: Field{[10]uint32{0x039b8729, 0x0176569e, 0x031584df, 0x009c04a7, 0x015ae7ce, 0x01d72cc3, 0x01a08ace, 0x01444cad, 0x004ca58d, 0x003b755e}}}, + {X: Field{[10]uint32{0x00c8c98e, 0x00659e0e, 0x01a9cc2b, 0x03c266c5, 0x0245caba, 0x02aa421b, 0x0093e884, 0x02e42e03, 0x035b4694, 0x00341a82}}, Y: Field{[10]uint32{0x0347def3, 0x00833ec1, 0x02da4986, 0x00517de2, 0x0114fcc8, 0x008bfcec, 0x01b391b2, 0x02c93f34, 0x02ba2777, 0x00132b51}}}, + {X: Field{[10]uint32{0x01e53445, 0x0054ac5f, 0x01d6929b, 0x02e33e6c, 0x01870059, 0x02dbc1a5, 0x007928ac, 0x0103e664, 0x03275902, 0x00124a37}}, Y: Field{[10]uint32{0x0300d505, 0x029d468c, 0x00ac53db, 0x0330a1aa, 0x03240b83, 0x01f70cda, 0x00c400f3, 0x00ec39ec, 0x020b655b, 0x002ddcf9}}}, + {X: Field{[10]uint32{0x03a28390, 0x018e7fe1, 0x01dda1b8, 0x01430cc7, 0x03f945d4, 0x00c8a09f, 0x02992617, 0x0060452e, 0x01f9cd54, 0x002986f3}}, Y: Field{[10]uint32{0x00d93a68, 0x03fa01ee, 0x004eeb40, 0x01c3af99, 0x018e61b3, 0x0007f893, 0x0201b2b3, 0x02eca151, 0x016ed6fd, 0x000f9dc7}}}, + {X: Field{[10]uint32{0x01db93c3, 0x0106c544, 0x0093f9f6, 0x013041fc, 0x030fb8e3, 0x00029e5d, 0x031228c0, 0x02deaece, 0x01b93e2f, 0x0014d68d}}, Y: Field{[10]uint32{0x02ff786f, 0x027fb26c, 0x02e96f0c, 0x02d7a354, 0x0292475f, 0x01f0b8f0, 0x0283fba2, 0x033230e0, 0x03355657, 0x00091c7f}}}, + {X: Field{[10]uint32{0x0065d4d0, 0x01e42d31, 0x00acfa5f, 0x00ab442e, 0x00f23ad4, 0x01af9c2c, 0x02888bbc, 0x003ca4dd, 0x012ce014, 0x0039a299}}, Y: Field{[10]uint32{0x001a7385, 0x03e7074f, 0x0094c06c, 0x01f82e03, 0x00ea6e0c, 0x02b54848, 0x034ecb6d, 0x00182cc4, 0x010cc368, 0x001275ce}}}, + {X: Field{[10]uint32{0x03e25fde, 0x03c3a64d, 0x007576b4, 0x01bc22f1, 0x01f5f05f, 0x03a883a6, 0x017855c3, 0x03334fbc, 0x027a74df, 0x003a24e7}}, Y: Field{[10]uint32{0x0261b173, 0x020a7fb5, 0x0388b3e0, 0x015368b0, 0x033773f4, 0x0127930a, 0x00c0fdf4, 0x0156df24, 0x033eff0a, 0x001ad229}}}, + {X: Field{[10]uint32{0x00751543, 0x0003ebd2, 0x01dafbfd, 0x020d9f0c, 0x007fe164, 0x029b9c2b, 0x00fa2930, 0x0061d200, 0x03ea3145, 0x00125804}}, Y: Field{[10]uint32{0x038c4332, 0x00b8bc6a, 0x03f65614, 0x0022e14d, 0x02581e15, 0x020accc4, 0x00001cb2, 0x0155be29, 0x01118790, 0x002d5c54}}}, + {X: Field{[10]uint32{0x004b1e1f, 0x0370f060, 0x0120189d, 0x00a79f31, 0x01bb0f6c, 0x00981342, 0x0157a072, 0x030ea55a, 0x01b0b1ef, 0x001111cd}}, Y: Field{[10]uint32{0x0259d6e4, 0x02f9001f, 0x0321f9ae, 0x027cca96, 0x023e9a43, 0x00143956, 0x0332a857, 0x02eacea5, 0x00a3461a, 0x002c6b58}}}, + {X: Field{[10]uint32{0x02d9511c, 0x02d0450f, 0x02475da3, 0x02279dea, 0x03e88821, 0x02e72630, 0x01a40e74, 0x01f573e1, 0x02c84acd, 0x00016016}}, Y: Field{[10]uint32{0x023c07c0, 0x0204d35a, 0x02363bb4, 0x00882bab, 0x0301ad00, 0x03635a6d, 0x0170dcf0, 0x014cfdef, 0x023bfbba, 0x003254a4}}}, + {X: Field{[10]uint32{0x039a9501, 0x02ddfbc9, 0x00898dca, 0x02f711b2, 0x02c12619, 0x02da4080, 0x01c53a12, 0x031e1578, 0x011830fd, 0x0022b045}}, Y: Field{[10]uint32{0x01ca4fa4, 0x035af52a, 0x0053ad59, 0x02e376cc, 0x00d5deb3, 0x02fec800, 0x0015493a, 0x03e83874, 0x00c77867, 0x000a7edf}}}, + {X: Field{[10]uint32{0x02ab542d, 0x01ed1102, 0x01ec67bd, 0x01bc8bd0, 0x014d7022, 0x031efbfd, 0x03c8a7cc, 0x02632da3, 0x01d3e429, 0x002a91eb}}, Y: Field{[10]uint32{0x003683e9, 0x0079d731, 0x01816f77, 0x013f0656, 0x024f8e8c, 0x03d9d166, 0x034f9e39, 0x036630eb, 0x0081ebef, 0x0033e96b}}}, + {X: Field{[10]uint32{0x0199889a, 0x02236e79, 0x013e419e, 0x026390cf, 0x03d39848, 0x019248ad, 0x0133f753, 0x0053ba48, 0x0127a27a, 0x003cd410}}, Y: Field{[10]uint32{0x001b45df, 0x0337c218, 0x03313c09, 0x008e819a, 0x0256c6d4, 0x01ef2e21, 0x02cdae54, 0x01a2a213, 0x037e9f98, 0x003c6be7}}}, + {X: Field{[10]uint32{0x024bf08d, 0x03bbbb5f, 0x0398c7c6, 0x03964986, 0x02272d3c, 0x026a6269, 0x00870766, 0x039a20d6, 0x0344edcb, 0x000cdcc3}}, Y: Field{[10]uint32{0x01775a6b, 0x0172f9b8, 0x02794860, 0x01fb31c2, 0x01b6fd05, 0x02f4b5e2, 0x02a32d81, 0x005b412c, 0x0128d877, 0x000fe0ce}}}, + {X: Field{[10]uint32{0x02dfb0d6, 0x02d2850f, 0x034786e5, 0x01fef84d, 0x00a33d41, 0x02492730, 0x00bdf072, 0x03d61220, 0x02dc8c06, 0x000c5a75}}, Y: Field{[10]uint32{0x0274ce5f, 0x018fa1aa, 0x037fcea1, 0x0030bf79, 0x00a31160, 0x023d0a32, 0x0382f596, 0x00e0e6e9, 0x022dec56, 0x000aa450}}}, + {X: Field{[10]uint32{0x002a4429, 0x03f331bc, 0x038e980c, 0x0114355f, 0x03c8c43a, 0x02a370fa, 0x007a64d5, 0x02ba073c, 0x0182013a, 0x00363191}}, Y: Field{[10]uint32{0x03822aea, 0x012312a4, 0x02a7be7f, 0x011e1278, 0x02c4773d, 0x027fb8ec, 0x012f195c, 0x018eba32, 0x00519688, 0x003121cc}}}, + {X: Field{[10]uint32{0x002b6f11, 0x007da7d0, 0x03fe1789, 0x03605368, 0x007e59c8, 0x018c6e21, 0x03cb0395, 0x0091bde9, 0x001f307e, 0x002b99c4}}, Y: Field{[10]uint32{0x01ed44cb, 0x007871c4, 0x022aee41, 0x03e5f608, 0x031d3900, 0x027e68d5, 0x02767afa, 0x0027a2e5, 0x03b4a90b, 0x003d7cb6}}}, + {X: Field{[10]uint32{0x01dbd8ee, 0x035fc520, 0x00f0c1a9, 0x010e095d, 0x02b4e2ff, 0x02068b17, 0x00a7dc9c, 0x020ce070, 0x023183ba, 0x002a7a1c}}, Y: Field{[10]uint32{0x02468901, 0x03775be5, 0x023354b7, 0x02b0f5ce, 0x03333153, 0x039a0d13, 0x01fb59be, 0x0038cf5a, 0x019990d9, 0x0025a041}}}, + {X: Field{[10]uint32{0x003376f2, 0x01078d39, 0x0048dad1, 0x01e7ed6f, 0x00694ef8, 0x00cf9a12, 0x014f43aa, 0x03502c9a, 0x021c0ae7, 0x00185afc}}, Y: Field{[10]uint32{0x0080fc77, 0x01772526, 0x02799bf0, 0x016a8f67, 0x024a2772, 0x02d693ea, 0x02451153, 0x0282ea0c, 0x03832aa8, 0x002fb063}}}, + {X: Field{[10]uint32{0x033f5c2d, 0x0144262b, 0x0295f8d3, 0x033dc069, 0x0339be47, 0x03a6f96e, 0x02882b11, 0x00cf51e2, 0x0335601f, 0x000487a0}}, Y: Field{[10]uint32{0x0103b3e8, 0x00a8a613, 0x03659f68, 0x01c11216, 0x03010dd0, 0x02ffe077, 0x005fdfdc, 0x02812df6, 0x013318fa, 0x000ba64a}}}, + {X: Field{[10]uint32{0x009f1141, 0x02325eee, 0x0193325c, 0x00a12a42, 0x003a83cc, 0x03bc6f12, 0x0013948f, 0x032a7025, 0x03973025, 0x002fe211}}, Y: Field{[10]uint32{0x02ad5386, 0x01c4fd9b, 0x0363f0e2, 0x0181aaee, 0x016de247, 0x020e3449, 0x015ae3a7, 0x03475e1b, 0x03263d26, 0x000654e8}}}, + {X: Field{[10]uint32{0x02f811f0, 0x0180295a, 0x02124e86, 0x0383ebb6, 0x00dd1b06, 0x0371d734, 0x0094d4bd, 0x0003e617, 0x01a65a38, 0x001f0a3a}}, Y: Field{[10]uint32{0x02b5c277, 0x005218e2, 0x03863134, 0x035bcb90, 0x002d396f, 0x001d09ed, 0x014cedb7, 0x027c0e24, 0x01b70e33, 0x0028dd5b}}}, + {X: Field{[10]uint32{0x00a66077, 0x024c5ca4, 0x02b9cb8b, 0x0244c6f0, 0x0346be07, 0x02e48e1e, 0x00b5bf6b, 0x00b3d073, 0x01ad45e6, 0x00397b1b}}, Y: Field{[10]uint32{0x004f0e19, 0x00ceaeb9, 0x00eda67c, 0x0249e884, 0x012bacd0, 0x038f1348, 0x014bea4b, 0x000f2be1, 0x02cc7757, 0x00340117}}}, + {X: Field{[10]uint32{0x018c2fed, 0x00d85a44, 0x02043583, 0x00f8d363, 0x00703626, 0x0112965d, 0x031c3525, 0x025517ec, 0x021f9203, 0x001bf25b}}, Y: Field{[10]uint32{0x038a9a51, 0x02eaeb62, 0x0089d9aa, 0x00376434, 0x026ca7c2, 0x010e5f8d, 0x030457f8, 0x037a365a, 0x02871571, 0x00340cb7}}}, + {X: Field{[10]uint32{0x006e4133, 0x0244569d, 0x0149acf4, 0x03738684, 0x021db684, 0x01f04c51, 0x02790914, 0x02711d0b, 0x03511c21, 0x002278f4}}, Y: Field{[10]uint32{0x030c5c90, 0x00be4618, 0x00b03689, 0x02eeec89, 0x0352fde5, 0x000f55fa, 0x00b53d23, 0x0211a361, 0x030b672e, 0x002aaf65}}}, + {X: Field{[10]uint32{0x010d5890, 0x0238628e, 0x01de84ff, 0x011c3fa8, 0x00c043e9, 0x02b6e36a, 0x00eb44ea, 0x01914e1e, 0x00f0b213, 0x000ade98}}, Y: Field{[10]uint32{0x004a5244, 0x02eeadf4, 0x02f41ae8, 0x01b46409, 0x01b80668, 0x02ce2cd9, 0x03407091, 0x00ca8164, 0x03161ba0, 0x000320a6}}}, + {X: Field{[10]uint32{0x009627e7, 0x01c8141b, 0x029d42f8, 0x01e6498e, 0x01bfeb98, 0x021e0bc9, 0x037c3dfa, 0x02badf9b, 0x031ac2c2, 0x001192e7}}, Y: Field{[10]uint32{0x02f7502c, 0x016d6d6d, 0x028aadac, 0x001db2d3, 0x029a23a1, 0x0140e1d7, 0x03761dbe, 0x02f30b7d, 0x03f459e1, 0x001f0982}}}, + {X: Field{[10]uint32{0x019b616f, 0x02d8e89d, 0x035ab268, 0x006a61ba, 0x000b2514, 0x01dd2d9c, 0x0331519e, 0x008a5438, 0x02304357, 0x001e494f}}, Y: Field{[10]uint32{0x027f88e1, 0x000d61b8, 0x03f69100, 0x0363c95d, 0x02ed6467, 0x01a59972, 0x00f5bae9, 0x008d4ec8, 0x017a55b6, 0x00369827}}}, + {X: Field{[10]uint32{0x01399556, 0x010b45b7, 0x02773876, 0x00250d65, 0x01019acb, 0x0154643e, 0x02b1967f, 0x03032d70, 0x007ce900, 0x00018d0a}}, Y: Field{[10]uint32{0x03debead, 0x02d186b0, 0x037581fc, 0x00f8c4af, 0x00223c47, 0x014ccd2b, 0x00042db2, 0x005804c3, 0x01098cf0, 0x00288d42}}}, + {X: Field{[10]uint32{0x021bee98, 0x01fc60d0, 0x00223358, 0x012e4588, 0x02d7ef2f, 0x01a9d6d0, 0x0018557f, 0x03f56e8d, 0x01c38bd8, 0x001d8448}}, Y: Field{[10]uint32{0x02dd530f, 0x025ef6d4, 0x010405c8, 0x00d2bebb, 0x0276070e, 0x02eca489, 0x026eeb01, 0x01d0d443, 0x015ff9c1, 0x0010051c}}}, + {X: Field{[10]uint32{0x01453413, 0x0375819b, 0x034b3e63, 0x03870bc1, 0x0077990f, 0x039428ac, 0x01a30784, 0x037c6967, 0x00c1bfbb, 0x00098632}}, Y: Field{[10]uint32{0x02a48da0, 0x01a7774c, 0x01ab0581, 0x016cc9bf, 0x024bdaf3, 0x03a8f2d1, 0x00e584b4, 0x02daac63, 0x023720f5, 0x002b94e6}}}, + {X: Field{[10]uint32{0x00f685be, 0x007c76e4, 0x0020dab3, 0x02d70266, 0x00d91699, 0x0124c22d, 0x03a57e19, 0x03c097f1, 0x00cc10c6, 0x00350a7f}}, Y: Field{[10]uint32{0x02648edf, 0x026f5396, 0x00964068, 0x00f5bedb, 0x00a8df04, 0x02f945a2, 0x0014ae91, 0x01646379, 0x01c1ee15, 0x00368ac5}}}, + {X: Field{[10]uint32{0x00e8b705, 0x036a3639, 0x00b6d56d, 0x03d8d994, 0x01bf1e0c, 0x028b6bbd, 0x0207625b, 0x0232acdb, 0x03c7c04b, 0x001a8638}}, Y: Field{[10]uint32{0x00e94eec, 0x005762f0, 0x0049ed62, 0x010097f3, 0x0120e754, 0x03149507, 0x039c9dab, 0x025b6faf, 0x0330f56c, 0x00198a44}}}, + {X: Field{[10]uint32{0x00f97756, 0x01e848be, 0x032201a3, 0x03fe906c, 0x01d7ca3e, 0x01a88719, 0x002fa4ad, 0x03cff952, 0x0046d1c9, 0x002616da}}, Y: Field{[10]uint32{0x02a3a92e, 0x03d5102a, 0x01592d56, 0x030234e4, 0x03bb9dc6, 0x03150fe2, 0x022f2c32, 0x023dadda, 0x03dd98e1, 0x000f8ac8}}}, + {X: Field{[10]uint32{0x026e8c64, 0x024a5b27, 0x03f3355c, 0x038e5953, 0x0296fba8, 0x031ef328, 0x02ee3395, 0x00e2918f, 0x01db4ba8, 0x00252283}}, Y: Field{[10]uint32{0x00f5c1d8, 0x010c970f, 0x00d2e12c, 0x03b4bde5, 0x01c7b705, 0x03949f58, 0x03b69b52, 0x0360fad9, 0x0025da19, 0x00316cd3}}}, + {X: Field{[10]uint32{0x00a3de2e, 0x02a903ea, 0x028c4256, 0x0331a521, 0x020a437f, 0x020985ec, 0x0246b47e, 0x02c0fede, 0x002c1332, 0x0010ccb4}}, Y: Field{[10]uint32{0x02aa5289, 0x02f83762, 0x01de1e1b, 0x02adcdd9, 0x00393985, 0x025045e0, 0x00327c03, 0x015576a5, 0x016f5f9c, 0x0039b946}}}, + {X: Field{[10]uint32{0x022a5aa3, 0x0330fedc, 0x01d96a67, 0x0315ac84, 0x02f7e12d, 0x0235a7d6, 0x0150b68a, 0x032257cc, 0x03b92ac1, 0x0017725d}}, Y: Field{[10]uint32{0x0107844d, 0x0342e567, 0x0217d10f, 0x00d0d040, 0x0283260c, 0x0331a5b4, 0x03d29123, 0x03b27872, 0x00a74bf1, 0x00116223}}}, + {X: Field{[10]uint32{0x03d15764, 0x006a078f, 0x022b0c6e, 0x035f418e, 0x00605e3b, 0x00000e49, 0x030cb6df, 0x03c492a6, 0x0134ca94, 0x0016e73d}}, Y: Field{[10]uint32{0x00897458, 0x006f2f00, 0x03d1d0d8, 0x01233a22, 0x03f9ba4b, 0x0282cb59, 0x0248790f, 0x01bffaf6, 0x01c3b051, 0x00113a63}}}, + {X: Field{[10]uint32{0x01372f59, 0x035ffdb5, 0x00a6697f, 0x02c25d1b, 0x02e2feb4, 0x022578b7, 0x026baf9c, 0x01c531f4, 0x00073a63, 0x00210d4c}}, Y: Field{[10]uint32{0x00c7a175, 0x00fcda2c, 0x022d23ca, 0x01f209b1, 0x023f9fea, 0x03cbcd14, 0x037361c0, 0x02751132, 0x029e3768, 0x0035cdce}}}, + {X: Field{[10]uint32{0x021e6a61, 0x000c3eb0, 0x02619804, 0x037fe1d1, 0x008f1a28, 0x00e09b9e, 0x008485fc, 0x026d7227, 0x000e3eef, 0x00273c00}}, Y: Field{[10]uint32{0x0291543c, 0x0184bdff, 0x020a1ac2, 0x01daaa47, 0x002764cd, 0x00801708, 0x021fcb9d, 0x012cb653, 0x033ad868, 0x000acf6a}}}, + {X: Field{[10]uint32{0x00e1235c, 0x01c68913, 0x035e9996, 0x014e0ebf, 0x038ee028, 0x012469d5, 0x0088b25b, 0x00623882, 0x03dc5897, 0x002eca4b}}, Y: Field{[10]uint32{0x012507e5, 0x00bd6690, 0x023a09e0, 0x03dc9f86, 0x00d5e9b8, 0x01624cd2, 0x03839909, 0x01e18ef2, 0x01c350ba, 0x0034edb6}}}, + {X: Field{[10]uint32{0x03b7d680, 0x01c32403, 0x01ced2d7, 0x01afc9f1, 0x03efd2bc, 0x008e6d88, 0x008a21a9, 0x03b55daa, 0x01d89835, 0x002575b4}}, Y: Field{[10]uint32{0x00baf048, 0x02ff819b, 0x02468e40, 0x00e31cb3, 0x02b39e7d, 0x03cf39a4, 0x034ac720, 0x01973bea, 0x01ad39db, 0x0032454d}}}, + {X: Field{[10]uint32{0x01d09a46, 0x01428ea1, 0x00fd89ee, 0x021f7cb2, 0x0115ea37, 0x00328325, 0x02c3fb90, 0x03b08270, 0x020fa164, 0x0032f8fc}}, Y: Field{[10]uint32{0x02fb9a28, 0x00bbfe42, 0x00e8b825, 0x01469962, 0x01734a22, 0x0061b9bb, 0x02222804, 0x00596d23, 0x0354faea, 0x00335625}}}, + {X: Field{[10]uint32{0x039f604a, 0x0278a4ec, 0x020949f3, 0x03d121f5, 0x01002942, 0x0299e0d7, 0x031c215b, 0x02788166, 0x02b99bab, 0x000f8076}}, Y: Field{[10]uint32{0x0123d481, 0x0172d7a1, 0x022670bd, 0x03e7a2da, 0x00d0a556, 0x019e7cfa, 0x03509798, 0x014113b8, 0x00323336, 0x002d0777}}}, + {X: Field{[10]uint32{0x02afef7a, 0x004e991d, 0x03350972, 0x0238578f, 0x01c79891, 0x012d8cc7, 0x031cfd2e, 0x03725857, 0x00c05543, 0x000a625d}}, Y: Field{[10]uint32{0x0299da2f, 0x0360181e, 0x0257de5c, 0x028d8b2d, 0x0222354e, 0x011fd82c, 0x00e02e87, 0x0362fa9d, 0x035555f2, 0x001a0060}}}, + {X: Field{[10]uint32{0x011fdc61, 0x019e4fd4, 0x003dfd93, 0x0322824f, 0x022aabde, 0x0107453d, 0x03764b46, 0x00f25ba8, 0x034d5476, 0x00075c19}}, Y: Field{[10]uint32{0x00dfe632, 0x03ad2f8e, 0x0010e8a4, 0x000588f7, 0x02807741, 0x025d4fd0, 0x024378e5, 0x0112f18c, 0x01ac697e, 0x00259d2b}}}, + {X: Field{[10]uint32{0x000fece1, 0x02c713c1, 0x00fbacc0, 0x02be46ae, 0x0073c47a, 0x023e2d8d, 0x021875ec, 0x02e5c189, 0x0107b43a, 0x001d4880}}, Y: Field{[10]uint32{0x03aeaffb, 0x01580ba8, 0x00b7b088, 0x035670d4, 0x0041bc9a, 0x02d5bbee, 0x02ebf2bf, 0x001f404a, 0x027cc3bf, 0x000a4253}}}, + {X: Field{[10]uint32{0x03779720, 0x039e4883, 0x03df92e7, 0x0232743b, 0x03fc7f4c, 0x002eb20e, 0x01b31aab, 0x013b0c9f, 0x01ffb347, 0x0033eb6e}}, Y: Field{[10]uint32{0x019a09b2, 0x002e64c3, 0x00b06ab0, 0x001b34ae, 0x0297d418, 0x02a67ea0, 0x0322ee02, 0x023315e3, 0x017f6f7b, 0x003fedd9}}}, + {X: Field{[10]uint32{0x01cb828f, 0x03a2daf0, 0x026f464c, 0x03d35ee0, 0x0334a7b4, 0x027612a9, 0x02e46e13, 0x01580eb7, 0x019dbe3c, 0x00093ba4}}, Y: Field{[10]uint32{0x03ff1506, 0x0297a985, 0x03e29364, 0x01dbb55f, 0x01ca6514, 0x00e6e3c4, 0x020b63c5, 0x0151ee4d, 0x0356794b, 0x001100e5}}}, + {X: Field{[10]uint32{0x00b100f4, 0x00c3bfdf, 0x011dd1b5, 0x014ff90e, 0x00c50ddb, 0x02972fbb, 0x016b8f10, 0x01495bd3, 0x02462f75, 0x00166578}}, Y: Field{[10]uint32{0x001dc64a, 0x005875b6, 0x0018ce08, 0x01ac4f74, 0x03fe78ac, 0x010049ff, 0x02d7ba20, 0x01459711, 0x027c7da0, 0x001df776}}}, + {X: Field{[10]uint32{0x034d54dd, 0x035470c8, 0x019c29db, 0x00dc073c, 0x00364f8c, 0x02464f02, 0x029fa205, 0x011e3384, 0x007197dd, 0x0029c8cd}}, Y: Field{[10]uint32{0x01796e68, 0x00bbbc4c, 0x019ad92f, 0x00446874, 0x009cfdd7, 0x006a5999, 0x00a5fa00, 0x00b32ce1, 0x015eec2b, 0x000b139a}}}, + {X: Field{[10]uint32{0x032251a5, 0x015b3404, 0x01c234ed, 0x0358eb50, 0x01a57cfe, 0x037a7f32, 0x0275fcc5, 0x00872f5f, 0x0369d5bc, 0x001919aa}}, Y: Field{[10]uint32{0x01294dc9, 0x0037e909, 0x005d2099, 0x033f12bc, 0x022e0c1e, 0x03da2536, 0x0222f5e5, 0x005b89d9, 0x03896dbb, 0x001db9fb}}}, + {X: Field{[10]uint32{0x01c28e60, 0x02b3683d, 0x014f11e0, 0x02d478cf, 0x017fab8b, 0x03c85851, 0x02fca2ab, 0x0222af79, 0x0390a293, 0x00297b33}}, Y: Field{[10]uint32{0x020e3ac3, 0x0016c998, 0x023f7948, 0x038b2044, 0x03110e74, 0x019a42b7, 0x02886435, 0x0047cdcf, 0x0116468a, 0x002bf5d6}}}, + {X: Field{[10]uint32{0x029c2779, 0x03561c7b, 0x01cdf89e, 0x01813472, 0x006a15d0, 0x00fb6796, 0x02e52a1e, 0x01e367c9, 0x02c74936, 0x0010946e}}, Y: Field{[10]uint32{0x02987aa5, 0x016b62dc, 0x0138d3a1, 0x032437fe, 0x004bb023, 0x01980ef3, 0x0190c60e, 0x01c5b5da, 0x027d92e6, 0x003e877c}}}, + {X: Field{[10]uint32{0x027db30e, 0x00b0a93e, 0x01903f04, 0x03409aa0, 0x030f40c9, 0x006078a0, 0x00f6b973, 0x03308763, 0x02a204c3, 0x001dea79}}, Y: Field{[10]uint32{0x00155aa0, 0x00f79746, 0x03180b6e, 0x0041cacb, 0x03e78d93, 0x02a84333, 0x01b757fa, 0x017336f7, 0x03ef23f2, 0x00287bd3}}}, + {X: Field{[10]uint32{0x03dbea6b, 0x007fdf9b, 0x0239de75, 0x003a667d, 0x02e9c0d2, 0x015dfe8a, 0x02de73c4, 0x01386f5a, 0x0161c40d, 0x000cff9e}}, Y: Field{[10]uint32{0x01f54849, 0x0102e335, 0x03037058, 0x0251c8ca, 0x039a5919, 0x01930c33, 0x016e7c14, 0x00c1b38c, 0x01cd4eeb, 0x00246df5}}}, + {X: Field{[10]uint32{0x01179564, 0x02085c3e, 0x003115b6, 0x00054927, 0x03395357, 0x01216f8b, 0x00a9d8cb, 0x00884692, 0x032e5ee5, 0x0010fd9a}}, Y: Field{[10]uint32{0x01a46a45, 0x03de1d0b, 0x028921db, 0x0265ca39, 0x003555e6, 0x018fd7e2, 0x030cf7fe, 0x03aefc30, 0x015ffec0, 0x0014dc2d}}}, + {X: Field{[10]uint32{0x00b19bfc, 0x0116db0e, 0x0170e1a7, 0x010dcfd6, 0x03ad2f0b, 0x011baa1e, 0x00c7f6b4, 0x0041d35d, 0x021497ef, 0x0012b4d9}}, Y: Field{[10]uint32{0x035cfd39, 0x0133583b, 0x03cfc0cd, 0x0208ca7a, 0x036f9eea, 0x00dbe143, 0x02da00d4, 0x016ff57a, 0x01aa769a, 0x0023d770}}}, + {X: Field{[10]uint32{0x0012754d, 0x035654f0, 0x012f9155, 0x019a6cbc, 0x02593368, 0x016de5ea, 0x0334dc97, 0x013553cd, 0x02ef9520, 0x0025e66a}}, Y: Field{[10]uint32{0x003e6353, 0x016a1d7a, 0x02f3a984, 0x03b3a88d, 0x0044c256, 0x03124b55, 0x025b476b, 0x0385cd0e, 0x00a3d31f, 0x0012dacd}}}, + {X: Field{[10]uint32{0x01d828a1, 0x03275045, 0x00dca0fb, 0x0145be6a, 0x03c1c22f, 0x0038d759, 0x003f2525, 0x018d70b4, 0x01f0c6e4, 0x00321892}}, Y: Field{[10]uint32{0x0295ec73, 0x026519fb, 0x0102586d, 0x024d1a7c, 0x02465238, 0x012f1dac, 0x01260b39, 0x013437d3, 0x030b37dc, 0x0003885d}}}, + {X: Field{[10]uint32{0x0256038d, 0x03370b99, 0x0308e3ac, 0x039824be, 0x0061a08f, 0x033f5018, 0x0282c840, 0x021fbf1c, 0x00c5de56, 0x002d237f}}, Y: Field{[10]uint32{0x00e8927c, 0x02db467f, 0x01566277, 0x0254deb4, 0x01c0b52a, 0x01c51d99, 0x0369c7bc, 0x01c1d1c7, 0x021fec73, 0x00021f8f}}}, + {X: Field{[10]uint32{0x02357fca, 0x000ff353, 0x02da8585, 0x0134d9cc, 0x030146fa, 0x034e0da8, 0x025c828f, 0x0154d718, 0x036c62d6, 0x001df73a}}, Y: Field{[10]uint32{0x00228bd4, 0x00747a86, 0x0367e909, 0x02321fee, 0x024304d0, 0x034dc3b4, 0x01b85213, 0x025c4d49, 0x02005a13, 0x003642c9}}}, + {X: Field{[10]uint32{0x0175e49a, 0x0191d40c, 0x01c17473, 0x00f8ccbd, 0x0069cfb4, 0x0331c2b2, 0x031cd633, 0x00061137, 0x00bf4cda, 0x0016d623}}, Y: Field{[10]uint32{0x02d55cda, 0x022432be, 0x017c0d47, 0x01e11d1a, 0x01a52e19, 0x03e57f39, 0x02b823b2, 0x02792a13, 0x031df9e6, 0x0005093b}}}, + {X: Field{[10]uint32{0x0320b20c, 0x001da164, 0x003b7da1, 0x02944711, 0x032c50ce, 0x03277764, 0x00702518, 0x01082023, 0x03ba8393, 0x003021ee}}, Y: Field{[10]uint32{0x0209d996, 0x00881ee4, 0x02b5f6ec, 0x00f1faf0, 0x00f637c2, 0x032f92cc, 0x030e3455, 0x0157cec0, 0x02697175, 0x001dfc9a}}}, + {X: Field{[10]uint32{0x0031ed94, 0x011d304c, 0x02a3835e, 0x0183c45f, 0x00247d7d, 0x030b1563, 0x00b3e7cf, 0x0020bc82, 0x017b68f8, 0x00234581}}, Y: Field{[10]uint32{0x02ba3eca, 0x01442475, 0x0314fed5, 0x029fbb1a, 0x016ffb8c, 0x02710e78, 0x00f6e0d1, 0x0344f440, 0x01b662ff, 0x000f4c17}}}, + {X: Field{[10]uint32{0x01c184b7, 0x03f7307b, 0x019d9242, 0x02597878, 0x03d17daa, 0x03dcdc7f, 0x03b8cd2a, 0x00af21b6, 0x00a603d3, 0x001d7fb8}}, Y: Field{[10]uint32{0x03efa2f8, 0x03f71924, 0x0040910b, 0x027a6810, 0x01061ee8, 0x020245e5, 0x03c992ff, 0x0025d7f9, 0x00ffabc3, 0x0030ac79}}}, + {X: Field{[10]uint32{0x03368abb, 0x0170789b, 0x007a110d, 0x01d51839, 0x02dda7fb, 0x02a1dc42, 0x00925990, 0x0024f5f4, 0x0159b147, 0x0019768e}}, Y: Field{[10]uint32{0x01862844, 0x01171708, 0x03ce95e3, 0x00a32eb8, 0x00a6f530, 0x0268c08c, 0x032b463d, 0x0307870f, 0x01f52f92, 0x000d6678}}}, + {X: Field{[10]uint32{0x027933d3, 0x0102dbe5, 0x03f4df81, 0x016fd101, 0x005dda1a, 0x01d4e61c, 0x02b787ca, 0x0084975d, 0x00109463, 0x0019587f}}, Y: Field{[10]uint32{0x020e6337, 0x02a6d564, 0x01ad629f, 0x00ddb4e8, 0x02cd083f, 0x02dba200, 0x02e8aeca, 0x00a0a0fa, 0x03cea88e, 0x001301b1}}}, + {X: Field{[10]uint32{0x00c4410e, 0x0179e920, 0x016a35ca, 0x00c19993, 0x03c8a3fc, 0x02748cd0, 0x03041a6a, 0x00dc0548, 0x03807049, 0x0032694f}}, Y: Field{[10]uint32{0x036e4bf9, 0x01128882, 0x02d42183, 0x02b7c8d9, 0x02369d4d, 0x038ec9cd, 0x02f0dd06, 0x003517af, 0x00a9b2e3, 0x0026bd1c}}}, + {X: Field{[10]uint32{0x03b89158, 0x00d165cc, 0x03bf03c7, 0x00517d5d, 0x00c203f8, 0x02e68550, 0x009f45a1, 0x015b76c0, 0x01f3443e, 0x00170549}}, Y: Field{[10]uint32{0x034f4f18, 0x00d24efa, 0x03c02f5b, 0x03eb2e67, 0x0358574a, 0x01895c1e, 0x00f4c803, 0x03646b5d, 0x02f7cb3e, 0x00259e24}}}, + {X: Field{[10]uint32{0x001648ed, 0x024e72d5, 0x01454d69, 0x02a5d7d8, 0x0269bb6e, 0x01cbfb83, 0x00add6d4, 0x005c75c5, 0x00dad87c, 0x000d5973}}, Y: Field{[10]uint32{0x0062aef8, 0x01a8b64d, 0x014edd48, 0x029daa35, 0x034f02d3, 0x00022c65, 0x03d09bbd, 0x018d6176, 0x03bfec2b, 0x0027df61}}}, + {X: Field{[10]uint32{0x010e3614, 0x03799847, 0x01edabd8, 0x03744e2d, 0x004527d3, 0x00a85297, 0x00f29df4, 0x0386a2bf, 0x0334c0f5, 0x001000fb}}, Y: Field{[10]uint32{0x003048c4, 0x0131a093, 0x00e2cd3c, 0x003cd85d, 0x033d3ead, 0x0160e70b, 0x03d0a763, 0x0133bf30, 0x01524489, 0x0019c80c}}}, + {X: Field{[10]uint32{0x012ea57f, 0x01574764, 0x013931cf, 0x0088024a, 0x02138864, 0x02d25689, 0x03b7de39, 0x0141e4fa, 0x035b3796, 0x003d7137}}, Y: Field{[10]uint32{0x01eb3482, 0x0011f80c, 0x02968f30, 0x0295f4c6, 0x03aca34d, 0x028d8434, 0x03672c74, 0x02331168, 0x003e12a9, 0x002c2e4f}}}, + {X: Field{[10]uint32{0x029e213a, 0x0259e4d5, 0x010b397a, 0x0239a73b, 0x01cbe869, 0x019600a2, 0x023533e5, 0x021b36e9, 0x0280e211, 0x0002f27d}}, Y: Field{[10]uint32{0x032e06a3, 0x004fea6c, 0x01d72007, 0x03d6e478, 0x017bf54e, 0x01f48137, 0x03b94ff8, 0x01463543, 0x03788105, 0x001ab7fe}}}, + {X: Field{[10]uint32{0x01a16516, 0x02674ab2, 0x006b055f, 0x011d39c1, 0x01549e83, 0x028f8988, 0x03e15d37, 0x02204514, 0x0397f1fe, 0x001373a1}}, Y: Field{[10]uint32{0x03e668ea, 0x0381d52a, 0x01d4337c, 0x02a1d26a, 0x02fc8a8a, 0x035c35ec, 0x00fd9f37, 0x02096a57, 0x0377cca7, 0x003a979a}}}, + {X: Field{[10]uint32{0x0359b16b, 0x01a74fa5, 0x01eee818, 0x02149944, 0x02af2a4f, 0x000024e0, 0x032a0c04, 0x0255c2f5, 0x02ba1ef2, 0x003d26d6}}, Y: Field{[10]uint32{0x017c7f7d, 0x02391675, 0x01202865, 0x010ed060, 0x021d2fb3, 0x0182af19, 0x02125d0f, 0x03a349a5, 0x0020b996, 0x000b925b}}}, + {X: Field{[10]uint32{0x012125ec, 0x006fb902, 0x03fa054a, 0x001df5f5, 0x00a2d02f, 0x00afca52, 0x00ff7657, 0x038749ed, 0x014a7573, 0x0009a45f}}, Y: Field{[10]uint32{0x03cd8f97, 0x0173a0c1, 0x006780ad, 0x00c02986, 0x017eb125, 0x03e32232, 0x02fd2d5c, 0x019a80a9, 0x037eae9b, 0x002e391f}}}, + {X: Field{[10]uint32{0x0329d290, 0x03eab53e, 0x03cb1cd7, 0x01bb3e2e, 0x007ead77, 0x0084f9b6, 0x00b71daf, 0x00bf9263, 0x00d6285a, 0x0006d252}}, Y: Field{[10]uint32{0x00d3bfd8, 0x00306d09, 0x0227bdd3, 0x0266cbd7, 0x00d56984, 0x00b4a186, 0x0336c7a9, 0x0364966d, 0x001fef87, 0x0006ad02}}}, + {X: Field{[10]uint32{0x01ae64ca, 0x022f55e6, 0x036c7725, 0x03d29a58, 0x00f8b20f, 0x02a6594f, 0x019676fe, 0x02ebde77, 0x02ec8179, 0x000535c4}}, Y: Field{[10]uint32{0x000c6ef0, 0x01b8138e, 0x03ad6d36, 0x00e14eeb, 0x0006f385, 0x01cb38fc, 0x030df37d, 0x0143b0ca, 0x00a64246, 0x000b876e}}}, + {X: Field{[10]uint32{0x01952453, 0x01a53dc7, 0x038134d9, 0x02222d6f, 0x03a11119, 0x01111644, 0x01967e15, 0x01da1278, 0x02204174, 0x0001d9d4}}, Y: Field{[10]uint32{0x0182fd31, 0x01da10fb, 0x01c27377, 0x00f58253, 0x00de1a5c, 0x029c8b79, 0x0155a906, 0x02d80ce8, 0x00636457, 0x000fc7ec}}}, + {X: Field{[10]uint32{0x0149fc63, 0x012e8d37, 0x00937fc8, 0x01be5ac9, 0x020a53b1, 0x002ec789, 0x0016d028, 0x022d9d00, 0x0134a882, 0x0016b239}}, Y: Field{[10]uint32{0x00a1fc73, 0x03881bae, 0x0187a8e5, 0x021c457a, 0x0018568f, 0x0242739c, 0x005a4296, 0x03edec0b, 0x020f68f5, 0x00064f40}}}, + {X: Field{[10]uint32{0x034a14b8, 0x00880b6a, 0x02c43337, 0x0375ab3d, 0x02d618d0, 0x0064d127, 0x01135b60, 0x0158a94c, 0x02b28d16, 0x0021f377}}, Y: Field{[10]uint32{0x03846e2e, 0x01a32ea7, 0x0084be5b, 0x009404d7, 0x01cd7094, 0x038ba44a, 0x011cecbd, 0x022b6650, 0x00e67c95, 0x00170779}}}, + {X: Field{[10]uint32{0x024c84cb, 0x01de2810, 0x02d52f8c, 0x01fbac35, 0x004d4f8b, 0x03ea198c, 0x021dfe7a, 0x03427d23, 0x0225a39e, 0x00310c72}}, Y: Field{[10]uint32{0x0100d825, 0x02b8299c, 0x034292ae, 0x035b8d7f, 0x00489ede, 0x00c4a4cc, 0x00f2d11d, 0x02f9b4d7, 0x03d65b2d, 0x00114181}}}, + {X: Field{[10]uint32{0x00a3dd5a, 0x03cda0e2, 0x02c1d9bf, 0x000970bc, 0x03aaa930, 0x003b7128, 0x03af3d44, 0x0068452f, 0x01e8985c, 0x00231408}}, Y: Field{[10]uint32{0x012fb108, 0x02d82aa8, 0x01db13c2, 0x02bb50c5, 0x02b6d31f, 0x0025bf52, 0x01d74ba6, 0x0360701c, 0x00aa8077, 0x00132e58}}}, + {X: Field{[10]uint32{0x02513d4f, 0x0275c5db, 0x01bb770b, 0x012c99e0, 0x0306e7a1, 0x005df6ef, 0x017c07a0, 0x01d21630, 0x00bb38a4, 0x000ce395}}, Y: Field{[10]uint32{0x00420548, 0x02033e31, 0x026fb92f, 0x03554bb9, 0x02c44a6a, 0x019dd8ee, 0x02951def, 0x033e9308, 0x024e84ca, 0x001e1dab}}}, + {X: Field{[10]uint32{0x031f3c5a, 0x01bba34b, 0x0061bcb0, 0x0385fbfd, 0x013c7b0f, 0x03349a2b, 0x03683abc, 0x00e88645, 0x00a9efbb, 0x0021fcef}}, Y: Field{[10]uint32{0x01229b61, 0x028cfb55, 0x007f8361, 0x03c6845f, 0x00e5cc11, 0x03d7eef2, 0x001f258b, 0x03f15122, 0x02a1eccc, 0x0029e874}}}, + {X: Field{[10]uint32{0x013a3e40, 0x001eeed0, 0x01aad524, 0x037119f2, 0x00de27d6, 0x029a9e36, 0x016a0375, 0x01615a39, 0x03df8ed8, 0x0003d008}}, Y: Field{[10]uint32{0x03e178cc, 0x03e7da87, 0x001615cf, 0x0114f89d, 0x03d5e2c5, 0x03567cdc, 0x0230e566, 0x00e845aa, 0x0142fc4e, 0x002c9264}}}, + {X: Field{[10]uint32{0x006f2d3a, 0x00215927, 0x001a8927, 0x00bcdd38, 0x03453b51, 0x0398ecbe, 0x013d282f, 0x02288a27, 0x03c6d55a, 0x0033ed47}}, Y: Field{[10]uint32{0x0070635d, 0x01ffa724, 0x0125eb56, 0x004872c9, 0x03e4ea53, 0x01879874, 0x02c120e7, 0x0047b4a3, 0x02232838, 0x0023528c}}}, + {X: Field{[10]uint32{0x0243c539, 0x01f3a5ab, 0x00486893, 0x02c45c87, 0x01c45f77, 0x0089258d, 0x03219db2, 0x00051c2f, 0x020b9705, 0x00166912}}, Y: Field{[10]uint32{0x03039afa, 0x0364c781, 0x00efd158, 0x01644ddd, 0x02400ff9, 0x017ae29d, 0x021d0cd5, 0x003cfc77, 0x00a66a91, 0x0000c787}}}, + {X: Field{[10]uint32{0x00a8ee7e, 0x015c3a0a, 0x0386f8ab, 0x01cc67f5, 0x02d8e26d, 0x012ecea3, 0x03446281, 0x01e8ddaa, 0x0256ec27, 0x002e673b}}, Y: Field{[10]uint32{0x023494ad, 0x02c44d70, 0x0223062a, 0x00c74773, 0x00b6be5d, 0x01360305, 0x013b16ab, 0x017535c9, 0x0398dda0, 0x0011b83c}}}, + {X: Field{[10]uint32{0x01172bd2, 0x001eb403, 0x03cb0252, 0x00ad4a51, 0x001c6b92, 0x0369d6ce, 0x00398725, 0x006889b4, 0x036ad96b, 0x0028e784}}, Y: Field{[10]uint32{0x02abb532, 0x00286e6d, 0x023a2d91, 0x01de2bc6, 0x007dbfc9, 0x0258e7ea, 0x010fa717, 0x038238f4, 0x0358074d, 0x001e9701}}}, + {X: Field{[10]uint32{0x03001976, 0x02365d15, 0x039c45b4, 0x0154d7d1, 0x032c23c8, 0x02dd44ad, 0x02dd59ae, 0x02dd3989, 0x01253b2e, 0x001ba2d0}}, Y: Field{[10]uint32{0x012bc88e, 0x02667a33, 0x02b47873, 0x020bb086, 0x020715bc, 0x032e16a8, 0x0004068a, 0x0301157a, 0x00e1e4e8, 0x003302e2}}}, + {X: Field{[10]uint32{0x01abb019, 0x0111e294, 0x024189c4, 0x01bc7263, 0x03cd1fb6, 0x03bf44d0, 0x03b6ec98, 0x010627df, 0x02f5681e, 0x002650ad}}, Y: Field{[10]uint32{0x010e7a9a, 0x01459e63, 0x02430569, 0x01afb499, 0x02d2fe98, 0x01f26278, 0x0211e6ff, 0x00b54a42, 0x02bbb0cc, 0x00080343}}}, + {X: Field{[10]uint32{0x0078506d, 0x0383df94, 0x01744642, 0x03dcbabf, 0x02759636, 0x0122bcd4, 0x0166918b, 0x02e52510, 0x01ec3c57, 0x001ff738}}, Y: Field{[10]uint32{0x03baabd2, 0x004e8ab5, 0x0146b2e3, 0x01e5974f, 0x0353cfb9, 0x038b4b39, 0x03786ed1, 0x01db8dce, 0x02efc19a, 0x0035de16}}}, + {X: Field{[10]uint32{0x03989c57, 0x035381a4, 0x01b04a70, 0x01362065, 0x035f5165, 0x01df1e6a, 0x030906bd, 0x020fc3c5, 0x005c958c, 0x001bc4c8}}, Y: Field{[10]uint32{0x03b55ee0, 0x023c4fdc, 0x02c99e84, 0x02655445, 0x01033deb, 0x0254368d, 0x028d4f1c, 0x03920ec9, 0x015bb386, 0x0022b268}}}, + {X: Field{[10]uint32{0x0297654e, 0x03352d8d, 0x007e6e50, 0x013d6d09, 0x03cd405f, 0x0137fefe, 0x00a0665f, 0x01a6f810, 0x035d833c, 0x003e5568}}, Y: Field{[10]uint32{0x03c9ee44, 0x03e93d62, 0x0183e4e2, 0x02c9f686, 0x00f56e80, 0x0103acdf, 0x02f2407f, 0x020e2692, 0x03ce2246, 0x00227d3e}}}, + {X: Field{[10]uint32{0x02248007, 0x03edaa09, 0x00132e65, 0x0346248e, 0x010b58b8, 0x037e5e63, 0x02257431, 0x011a8d0a, 0x012d6196, 0x0036f345}}, Y: Field{[10]uint32{0x02d8ba13, 0x02d34d8c, 0x01dcec02, 0x038f4086, 0x03e57d23, 0x039a0c3d, 0x0025e9e2, 0x023f4f91, 0x017ec194, 0x0019be9c}}}, + {X: Field{[10]uint32{0x026e8ebe, 0x03a854d7, 0x035cc71e, 0x02ca2cd6, 0x0399f713, 0x00b9e54f, 0x03cfb1da, 0x02427eb1, 0x00e8e57b, 0x003c6baf}}, Y: Field{[10]uint32{0x01d9d516, 0x03d842f9, 0x0157e1b7, 0x0365617f, 0x0288b0bf, 0x00b93d65, 0x01c24d09, 0x0396a983, 0x02143e77, 0x0021d57e}}}, + {X: Field{[10]uint32{0x00b55187, 0x01b92281, 0x005f5fef, 0x016a4754, 0x01c002bc, 0x0010c241, 0x01ceab65, 0x0212ffe2, 0x024d941f, 0x00288085}}, Y: Field{[10]uint32{0x02f057ff, 0x00ecfbf0, 0x004c1bee, 0x0256b7a2, 0x01b6d4b0, 0x02e6f393, 0x0172e978, 0x01a2d479, 0x002b2bc2, 0x00038335}}}, + {X: Field{[10]uint32{0x028ad68a, 0x01011f72, 0x02861e78, 0x02942009, 0x02b1344d, 0x021fe2e6, 0x000eccb2, 0x039f7a52, 0x025746fd, 0x0015cb85}}, Y: Field{[10]uint32{0x01eb5d9f, 0x01a585cc, 0x01170475, 0x01ac283f, 0x0239eda8, 0x00176b5d, 0x02461eb4, 0x02aed234, 0x01e7c066, 0x00305d2b}}}, + {X: Field{[10]uint32{0x03eba31d, 0x0333a696, 0x00dac58a, 0x03296799, 0x00b67047, 0x01db927a, 0x00b1052b, 0x035d4f02, 0x0107fee4, 0x003d38b2}}, Y: Field{[10]uint32{0x0011c42c, 0x02fe1c4b, 0x030f8f41, 0x00d09201, 0x032b76d1, 0x02a3fa25, 0x00b8317c, 0x034b6392, 0x022d3a92, 0x002c90ea}}}, + {X: Field{[10]uint32{0x01f06dd5, 0x0258e97f, 0x00463e06, 0x0207c934, 0x02266987, 0x01a2026c, 0x029e436d, 0x015c5bd7, 0x02ec8445, 0x0029bf1a}}, Y: Field{[10]uint32{0x0018ca8d, 0x02402a86, 0x013d5073, 0x013a4614, 0x00a96b7f, 0x01d2367c, 0x02135fdf, 0x03f461ab, 0x0215548e, 0x003705a9}}}, + {X: Field{[10]uint32{0x0205f026, 0x03378b56, 0x009bcc00, 0x033ac133, 0x00c4ffb3, 0x00dfcb2f, 0x00d8eec9, 0x02594a73, 0x00175fde, 0x002f601a}}, Y: Field{[10]uint32{0x00a26216, 0x008a2cd9, 0x03f76bce, 0x01d1454a, 0x02db0482, 0x02daf771, 0x03e6a0d8, 0x010ca383, 0x02e78e01, 0x002c9e46}}}, + {X: Field{[10]uint32{0x000165ef, 0x021b74d7, 0x0251e163, 0x02c8e976, 0x032d8614, 0x032b9ae3, 0x015e810e, 0x00f482e7, 0x02676f8c, 0x003e2229}}, Y: Field{[10]uint32{0x009a0dea, 0x00f6b724, 0x0223942a, 0x014f7890, 0x03579788, 0x031ec7ae, 0x034bfe39, 0x03cfbfdb, 0x020fe429, 0x003ed3b8}}}, + {X: Field{[10]uint32{0x009ae200, 0x0221df10, 0x02fd23ba, 0x039af69d, 0x01c3182e, 0x034583f3, 0x01023a48, 0x02a9c7b2, 0x02055adb, 0x001f2347}}, Y: Field{[10]uint32{0x03907ceb, 0x0385d90b, 0x00524f16, 0x0293cb23, 0x01c489b9, 0x033a0dde, 0x02936f4f, 0x01548f65, 0x020bec59, 0x00228ee0}}}, + {X: Field{[10]uint32{0x02fabf43, 0x00539d89, 0x0159e75c, 0x02dd48a6, 0x026dfd9b, 0x024eebdc, 0x00ccd715, 0x01c48184, 0x02a4ee25, 0x0006221b}}, Y: Field{[10]uint32{0x0091531d, 0x026361b8, 0x01d31ffa, 0x0210e622, 0x02898a31, 0x01f40ade, 0x033ad3f0, 0x01a2c034, 0x0295f570, 0x00099b19}}}, + {X: Field{[10]uint32{0x03e52cba, 0x03f73e9a, 0x009a3184, 0x0265419e, 0x011242a0, 0x02b00dae, 0x039a44ec, 0x02b6f4cc, 0x031e38c8, 0x003fa9c3}}, Y: Field{[10]uint32{0x039e7915, 0x009bb38e, 0x0046883e, 0x00bf5d17, 0x02076c0e, 0x00d99c2d, 0x0058093a, 0x0306e777, 0x01f50ba8, 0x00277fdb}}}, + {X: Field{[10]uint32{0x03d1365a, 0x0312d28d, 0x00c8fb1d, 0x01eff908, 0x0096dcbf, 0x01e5146e, 0x0199142e, 0x00f241db, 0x038945aa, 0x001378c0}}, Y: Field{[10]uint32{0x0287cba4, 0x0193b634, 0x0316d356, 0x02884ec2, 0x03992ac0, 0x0006ccdd, 0x001eb2e2, 0x03799090, 0x029e9093, 0x0033b9d3}}}, + {X: Field{[10]uint32{0x02104fb2, 0x02220c06, 0x03da3739, 0x01adad6f, 0x028c2d8e, 0x03040a60, 0x03b8c401, 0x02f9e718, 0x01d1eafe, 0x0019f427}}, Y: Field{[10]uint32{0x01360a5f, 0x03ea96ef, 0x0098461f, 0x016367cb, 0x00d4f035, 0x0063e26f, 0x019049e8, 0x00365a3a, 0x01089266, 0x00043ad5}}}, + {X: Field{[10]uint32{0x00e6010f, 0x03f75dd0, 0x01b5af5f, 0x03d3fe8c, 0x01325e55, 0x01c0c735, 0x0396d4d8, 0x00d3e34e, 0x00fe1868, 0x000ad75c}}, Y: Field{[10]uint32{0x0095ed02, 0x029351ea, 0x03b1f7bd, 0x024327d4, 0x00384398, 0x02c8206d, 0x031f54af, 0x028dcde2, 0x025324d2, 0x00191b9f}}}, + {X: Field{[10]uint32{0x017be248, 0x03d8b7f8, 0x00752527, 0x008f2893, 0x005d600b, 0x02bb42b4, 0x03f7b446, 0x029db064, 0x02998700, 0x0032d098}}, Y: Field{[10]uint32{0x0019a8b6, 0x03a4e796, 0x006e65ac, 0x01413086, 0x03bcfd02, 0x03339dc8, 0x01f74eb8, 0x01832439, 0x0213f3eb, 0x0024a10f}}}, + {X: Field{[10]uint32{0x018e4e41, 0x00137b50, 0x00d25f9b, 0x014ff638, 0x0322d0b8, 0x039b7a22, 0x01ce4d01, 0x02f15c4d, 0x037e75b3, 0x000fb9aa}}, Y: Field{[10]uint32{0x034bcc87, 0x0154da06, 0x027689ad, 0x013da03b, 0x006ee1ab, 0x00cfd480, 0x01b6afc9, 0x01466e4c, 0x03984e52, 0x001a720f}}}, + {X: Field{[10]uint32{0x0087e7be, 0x010217f2, 0x01724e90, 0x031ca8e1, 0x016918ac, 0x005f5e0a, 0x0232df6f, 0x01450c5c, 0x00b0a95a, 0x00160ddd}}, Y: Field{[10]uint32{0x007c3e7b, 0x01cdaaa0, 0x0042418c, 0x03f8542d, 0x03f8f047, 0x019970d4, 0x00160730, 0x033c5cc3, 0x02660ee8, 0x000ceec7}}}, + {X: Field{[10]uint32{0x0079dc1a, 0x020e381c, 0x03fcb0a8, 0x000269e8, 0x03eb3341, 0x02990fa8, 0x0082b772, 0x009e1de4, 0x01ef3982, 0x002bccb8}}, Y: Field{[10]uint32{0x0295fd4c, 0x027b2dd3, 0x037f8b3a, 0x00c792d2, 0x03169383, 0x0068d9a5, 0x02ee7e8b, 0x0048f9ce, 0x028dc660, 0x001a6178}}}, + {X: Field{[10]uint32{0x0034d0c4, 0x02b705b8, 0x03f9c948, 0x02737aae, 0x0150f724, 0x03eff0fd, 0x020c740e, 0x01d5466d, 0x03dd3266, 0x001bb7df}}, Y: Field{[10]uint32{0x02f46026, 0x01144f43, 0x016d40bb, 0x0052edf6, 0x0164534f, 0x02c249a4, 0x030de819, 0x01f69d7e, 0x03185def, 0x003c2317}}}, + {X: Field{[10]uint32{0x01f16b42, 0x00293c00, 0x01f0072a, 0x0182cff6, 0x0086257a, 0x02060878, 0x0104120a, 0x023e51b1, 0x02455d26, 0x000ee699}}, Y: Field{[10]uint32{0x00fe7c7b, 0x006f774b, 0x00117e2e, 0x0121916c, 0x023dfa48, 0x01864041, 0x03601090, 0x01b02257, 0x0215aedf, 0x003b560e}}}, + {X: Field{[10]uint32{0x007a1039, 0x00eb429d, 0x03ae2d68, 0x010e0ba2, 0x0327b529, 0x02804ac3, 0x03cbdf07, 0x03f6c345, 0x03082b5c, 0x002f40d6}}, Y: Field{[10]uint32{0x03b2ef54, 0x003e68e6, 0x03f61ac9, 0x030e2d8a, 0x00e94a23, 0x01cafa2b, 0x0135ccd5, 0x035fa2a8, 0x03aded4a, 0x00192532}}}, + {X: Field{[10]uint32{0x015338c3, 0x0116d13c, 0x02ff7a8c, 0x02c50408, 0x024dda59, 0x022780e0, 0x03316ef0, 0x00602eb8, 0x0319fe9b, 0x003897ef}}, Y: Field{[10]uint32{0x034c7cf2, 0x0220d8c5, 0x03be6f63, 0x00467d3e, 0x007c2c8f, 0x0214b9a5, 0x02412581, 0x037548d0, 0x03f658a3, 0x00117b11}}}, + {X: Field{[10]uint32{0x00ffc9b8, 0x01cb993b, 0x02e6c7c0, 0x0170e1c7, 0x01f30f59, 0x00059501, 0x02ebea75, 0x01cd5814, 0x01cd8ffd, 0x000b88c7}}, Y: Field{[10]uint32{0x0359317a, 0x03cc591b, 0x0127d29c, 0x032fb946, 0x027610d4, 0x02892b78, 0x018f3d3e, 0x02586a11, 0x0052db15, 0x00031991}}}, + {X: Field{[10]uint32{0x01338fc8, 0x0161983d, 0x020483b4, 0x01d299a9, 0x01fd2a41, 0x00c5b819, 0x01ae1260, 0x0189bc6c, 0x01c93932, 0x001f03ca}}, Y: Field{[10]uint32{0x01cd037f, 0x008cee9d, 0x00162350, 0x013e6326, 0x01b76e2c, 0x021fd5aa, 0x0255d7a5, 0x0049cb00, 0x033ddf6f, 0x0009fbd4}}}, + {X: Field{[10]uint32{0x00d5bb48, 0x02da881f, 0x019ba31b, 0x0385c2ca, 0x027bd857, 0x01e53ecc, 0x003e0144, 0x027fbfed, 0x021cea6f, 0x0039c0b5}}, Y: Field{[10]uint32{0x023f79c9, 0x0303acc6, 0x02f2112e, 0x02bf298e, 0x00ee5e28, 0x03781de5, 0x0228a712, 0x03b8f9fc, 0x0081c924, 0x00311de6}}}, + {X: Field{[10]uint32{0x02c852a8, 0x02b917d9, 0x026d8cc2, 0x02900d69, 0x01c362c5, 0x030591fb, 0x0275c117, 0x0306d6fb, 0x0044eade, 0x003c5e00}}, Y: Field{[10]uint32{0x029e1c18, 0x01dd5c8c, 0x030f89a6, 0x00121727, 0x01e8b7a3, 0x00e00c43, 0x00f63ac1, 0x00e5dfc2, 0x01f0f31b, 0x0017e37a}}}, + {X: Field{[10]uint32{0x0312dd9e, 0x001c07c7, 0x0369f8d0, 0x02dc5982, 0x011582cc, 0x00999969, 0x0152c533, 0x016c6352, 0x037f22ec, 0x001e906c}}, Y: Field{[10]uint32{0x007fc443, 0x01425458, 0x002b9db7, 0x017890a7, 0x01344886, 0x028bc780, 0x00cd74d2, 0x00967020, 0x02132c57, 0x0021102f}}}, + {X: Field{[10]uint32{0x002db6d3, 0x033342ca, 0x02779ca4, 0x005b5482, 0x02a5ce63, 0x01f0d546, 0x00f4e165, 0x035a7866, 0x037d8111, 0x000253ff}}, Y: Field{[10]uint32{0x005c6fc0, 0x00926f14, 0x03b909c3, 0x00c0ea4c, 0x0342541d, 0x02c763b5, 0x00a75d38, 0x0030155e, 0x0270026c, 0x00120b24}}}, + {X: Field{[10]uint32{0x03f4e9d1, 0x03251005, 0x02560a54, 0x0224bdc3, 0x01d37759, 0x02c1692a, 0x00ac76b1, 0x03eaa55b, 0x004e8a3f, 0x0035a9b5}}, Y: Field{[10]uint32{0x00863e1a, 0x01ee95e4, 0x00b6cdc5, 0x021f78e2, 0x03c7b93e, 0x00ea2815, 0x023bbe78, 0x0277a645, 0x0322cd83, 0x001230ee}}}, + {X: Field{[10]uint32{0x00cdf80c, 0x00813e54, 0x03d53699, 0x024e56e4, 0x02c47c09, 0x00550ee4, 0x01dbc477, 0x03b6ac79, 0x01c08e24, 0x00330389}}, Y: Field{[10]uint32{0x011fb70b, 0x00a0af41, 0x038c8220, 0x015490c6, 0x031a977c, 0x02d29b4e, 0x0376ab2c, 0x033ced0e, 0x00b37170, 0x0008314b}}}, + {X: Field{[10]uint32{0x02f8d827, 0x0095ced8, 0x01be3db7, 0x0291041e, 0x01efddb6, 0x03ee0f2d, 0x025d0eac, 0x0346be84, 0x03684cb7, 0x0033e54f}}, Y: Field{[10]uint32{0x00909c0c, 0x027b76cc, 0x009ac0b8, 0x01406bf2, 0x03b302fa, 0x038f9428, 0x0047a7b8, 0x0046c42a, 0x0366a45d, 0x001c33f8}}}, + {X: Field{[10]uint32{0x0015d5dc, 0x02675ada, 0x0319fbff, 0x01d450ea, 0x02f8ce69, 0x03f57f87, 0x016b7112, 0x02ac1bfc, 0x02942b34, 0x0006b089}}, Y: Field{[10]uint32{0x036539fc, 0x038fe96a, 0x026154d9, 0x0348911d, 0x011bd823, 0x027859a0, 0x01b7fddd, 0x0025d53a, 0x017e02bd, 0x00290f51}}}, + {X: Field{[10]uint32{0x024d65c2, 0x03dc8c9e, 0x029e9bb9, 0x03f6904b, 0x00496349, 0x0256501b, 0x03800bcf, 0x02012bc3, 0x03ff1153, 0x00340aee}}, Y: Field{[10]uint32{0x0002a384, 0x03fff06e, 0x032f2876, 0x02087083, 0x020d41e6, 0x03bc22d5, 0x0344f9b9, 0x00cbdc75, 0x00de3c78, 0x000177a0}}}, + {X: Field{[10]uint32{0x031831a7, 0x021496d3, 0x0204025a, 0x009920de, 0x02d8a603, 0x0312ca67, 0x021cc2b2, 0x013b8d0b, 0x03478d46, 0x000f32b4}}, Y: Field{[10]uint32{0x002691c0, 0x00dac9b4, 0x0035af30, 0x00f926d4, 0x0147492f, 0x033acd00, 0x0079fdd6, 0x0156d82b, 0x024ca59b, 0x000d7a8a}}}, + {X: Field{[10]uint32{0x02033688, 0x01ee90cd, 0x0106b80f, 0x02cc1067, 0x01b3a758, 0x03fe12cf, 0x0362e90f, 0x030f3835, 0x01543e69, 0x003ab135}}, Y: Field{[10]uint32{0x01deacbe, 0x01a84bf4, 0x01dbf17f, 0x01b7250d, 0x02ee00fb, 0x036a8611, 0x00449aad, 0x01d2effa, 0x02dac543, 0x002a993e}}}, + {X: Field{[10]uint32{0x03fca753, 0x02383318, 0x037a9a02, 0x01974f6e, 0x015df624, 0x00cef8a0, 0x026d0c61, 0x00dc4ccc, 0x01b173d9, 0x000f4a1e}}, Y: Field{[10]uint32{0x00d6e0f0, 0x029ca59a, 0x00c9d8f0, 0x0230a9aa, 0x01fd38a0, 0x01336e34, 0x023eecb3, 0x02d7a2a7, 0x024d9b95, 0x0015db39}}}, + {X: Field{[10]uint32{0x0176ca14, 0x0138c11a, 0x03ce4cf7, 0x015a67ae, 0x0272358a, 0x02a31d9a, 0x0137087c, 0x01a0b894, 0x038d56a9, 0x000fd62a}}, Y: Field{[10]uint32{0x0321f29d, 0x010169ec, 0x02315447, 0x00280579, 0x01f6bce2, 0x02d2036b, 0x030f45f1, 0x02a2a07c, 0x03d101a2, 0x000f2414}}}, + {X: Field{[10]uint32{0x03fd12d7, 0x01776c44, 0x01b97314, 0x004d6211, 0x022a4ed9, 0x022bab90, 0x029df0fa, 0x03346506, 0x0289b48d, 0x0013d7c4}}, Y: Field{[10]uint32{0x00dc1428, 0x03e095b8, 0x03e86077, 0x01a968f0, 0x0342ac0d, 0x0288cf77, 0x02286ed0, 0x0195dc0f, 0x032cc40c, 0x002d70f8}}}, + {X: Field{[10]uint32{0x03376a76, 0x00e4b724, 0x03bc5ad0, 0x037fe682, 0x03e4a9dc, 0x028aeb35, 0x00e70ddd, 0x031beb9d, 0x01e2a52d, 0x0029928a}}, Y: Field{[10]uint32{0x018a9590, 0x02c05990, 0x0330b4eb, 0x0332c395, 0x01c776f2, 0x00f770d9, 0x02efe873, 0x02c6ddee, 0x00a6faa9, 0x002b78be}}}, + {X: Field{[10]uint32{0x00480e70, 0x0331f6f2, 0x02f04994, 0x017788d2, 0x00b8694b, 0x0071b4f8, 0x0186f94e, 0x03e22b47, 0x0212c4d6, 0x0037b82a}}, Y: Field{[10]uint32{0x02f93389, 0x01947e18, 0x002193d4, 0x0320034d, 0x02413ae1, 0x00cb4c35, 0x01368df3, 0x00df3ea7, 0x00d4cbda, 0x0032f66b}}}, + {X: Field{[10]uint32{0x01796936, 0x003c6235, 0x01f74f9c, 0x023220bf, 0x01772b95, 0x003ad9bf, 0x013e2948, 0x01ab86d9, 0x019dc8af, 0x00219dea}}, Y: Field{[10]uint32{0x0397232e, 0x03abe07f, 0x029ed783, 0x0075370f, 0x00662115, 0x002187d1, 0x03a24f3a, 0x0012392d, 0x00c8348c, 0x000c719a}}}, + {X: Field{[10]uint32{0x02997fee, 0x005e307d, 0x01d80ed6, 0x0306633b, 0x02f44aed, 0x02f5b59d, 0x0229bc79, 0x029f30ac, 0x013acb73, 0x0014445f}}, Y: Field{[10]uint32{0x01110cd6, 0x0395a30e, 0x01a4d174, 0x01c0c870, 0x0278f207, 0x00258d0f, 0x00651d30, 0x0217045c, 0x0004123f, 0x001718e3}}}, + {X: Field{[10]uint32{0x03141b12, 0x0328e0e7, 0x024689c3, 0x03e0d08f, 0x020a83c9, 0x00ba8490, 0x03585d45, 0x0020a3a1, 0x03646967, 0x0012362b}}, Y: Field{[10]uint32{0x0265e9de, 0x035938d4, 0x0040fdc4, 0x00d6501b, 0x011998dd, 0x00157b41, 0x029843b9, 0x01269f1a, 0x0342f07f, 0x001562a3}}}, + {X: Field{[10]uint32{0x02966d2c, 0x03a03d7d, 0x0317aecb, 0x01f7d6ee, 0x01d4060c, 0x0070593a, 0x003d4574, 0x03bb9685, 0x02c1b0fd, 0x0018aea6}}, Y: Field{[10]uint32{0x01d9450e, 0x01b04629, 0x00aedb58, 0x019cec0d, 0x019329fe, 0x01c2cee6, 0x0096494b, 0x0105b17f, 0x013f2290, 0x00196819}}}, + {X: Field{[10]uint32{0x01febf0d, 0x00a5f492, 0x0004a486, 0x00150fcc, 0x00508d8d, 0x00f1e4c4, 0x02f20580, 0x0295ad43, 0x03cb679d, 0x002f937d}}, Y: Field{[10]uint32{0x01f3ba9b, 0x01b10f35, 0x03a0995f, 0x00183e8f, 0x00ca6973, 0x032a21a5, 0x018cb8ba, 0x00f9fea2, 0x0150dd5f, 0x00306d59}}}, + {X: Field{[10]uint32{0x00c9979d, 0x010d6c0a, 0x010c3a0c, 0x00b33855, 0x02424eac, 0x0211ccc5, 0x02cdf340, 0x0381a016, 0x036ccca2, 0x00392700}}, Y: Field{[10]uint32{0x01609a1b, 0x02264b98, 0x03bcab16, 0x0078ed0a, 0x0121186b, 0x009ebf5f, 0x010d273d, 0x03f7956f, 0x025f0457, 0x00115af0}}}, + {X: Field{[10]uint32{0x03fd58e3, 0x01e9be25, 0x01302705, 0x006ab570, 0x02976e70, 0x02ddd30a, 0x03ddfc9c, 0x017642cf, 0x01eda81d, 0x002b9a11}}, Y: Field{[10]uint32{0x02d755bc, 0x01299d5f, 0x03e11e5b, 0x01b39a6c, 0x00450112, 0x014e694d, 0x026194e7, 0x038d8264, 0x0055322a, 0x0014a6f7}}}, + {X: Field{[10]uint32{0x02a25e1b, 0x03ab8c6f, 0x02d183fb, 0x02652867, 0x004c2744, 0x035c4e19, 0x00717e02, 0x02ddcb32, 0x00f8bcc2, 0x0014a876}}, Y: Field{[10]uint32{0x0189011b, 0x01a79810, 0x001dc9f8, 0x01cf1c0d, 0x03dbb806, 0x00edd4a2, 0x00e77f95, 0x01e25212, 0x032ce7f1, 0x00368a82}}}, + {X: Field{[10]uint32{0x02a2250a, 0x03ce0165, 0x02918425, 0x02724349, 0x010cc552, 0x035692af, 0x0119f50d, 0x01e01357, 0x0301d89a, 0x003feeeb}}, Y: Field{[10]uint32{0x029880e2, 0x00dfb666, 0x0214538c, 0x0043dac6, 0x022d5144, 0x00bf84c8, 0x02a47a6c, 0x018af416, 0x03b7eba6, 0x00222d7d}}}, + {X: Field{[10]uint32{0x038c942e, 0x0296783f, 0x011f9fe5, 0x0323fd81, 0x014473fb, 0x013e15c9, 0x03840eed, 0x006adebe, 0x0038aab5, 0x0001bfe9}}, Y: Field{[10]uint32{0x0202d775, 0x02131fb9, 0x01f8e668, 0x0168ab1f, 0x0350a0e9, 0x02584ef2, 0x0060dc66, 0x028100ce, 0x02dd3b88, 0x0016c089}}}, + {X: Field{[10]uint32{0x00a2fc79, 0x03b250c2, 0x00cb5a45, 0x01eb22f2, 0x00c2c1b7, 0x00749a84, 0x00f5ee59, 0x0311f8c6, 0x0258f92a, 0x00272255}}, Y: Field{[10]uint32{0x001045f9, 0x02b3ea70, 0x0338e516, 0x0057fdd3, 0x00ef4b01, 0x0378963b, 0x0255e286, 0x02f563c5, 0x01e2665e, 0x001c201c}}}, + {X: Field{[10]uint32{0x01861ba9, 0x037dbc30, 0x03bb5df1, 0x0338153e, 0x00a59bb3, 0x03afb38f, 0x01bffd18, 0x00d6c4ff, 0x020defba, 0x0014cb9b}}, Y: Field{[10]uint32{0x02bc5b8a, 0x02d1d52b, 0x027fff61, 0x003e942e, 0x0336f04b, 0x0192d164, 0x0332ed24, 0x02ef0fad, 0x01dad326, 0x0006bd19}}}, + {X: Field{[10]uint32{0x01fff425, 0x01238039, 0x02ea138d, 0x02020f69, 0x038a8a9f, 0x01432d28, 0x01add8eb, 0x01c24833, 0x0321e3f2, 0x0026410c}}, Y: Field{[10]uint32{0x0377ea6f, 0x0347c123, 0x03786ef9, 0x00937ca6, 0x02404ecb, 0x0394b0cd, 0x025b1be8, 0x00943f67, 0x0197325c, 0x00046fa1}}}, + {X: Field{[10]uint32{0x004084f9, 0x02bd1b9f, 0x0217287d, 0x01730cc7, 0x017d7908, 0x008308af, 0x00a6e941, 0x00d2a668, 0x00803a09, 0x00259e64}}, Y: Field{[10]uint32{0x00005e03, 0x011b08e6, 0x02d047dc, 0x02ab5d72, 0x02574903, 0x02ca04bb, 0x0120b5c9, 0x002ff9a9, 0x012d1845, 0x003aa400}}}, + {X: Field{[10]uint32{0x02a0afb9, 0x036b0dce, 0x006ab729, 0x006d3f0e, 0x021f36f7, 0x03bfdd85, 0x02d99819, 0x03f8433d, 0x0157915f, 0x001d3d74}}, Y: Field{[10]uint32{0x01b29eb5, 0x02750846, 0x0009a2c4, 0x02925069, 0x034e4ce4, 0x03323111, 0x02e225cd, 0x02f1d04a, 0x011e4922, 0x00152800}}}, + {X: Field{[10]uint32{0x01927855, 0x0335aa30, 0x0231e3e7, 0x035caa81, 0x0176e5f3, 0x0235e9d4, 0x000ddebe, 0x00e5555c, 0x035381c6, 0x00049a49}}, Y: Field{[10]uint32{0x039ae553, 0x03833070, 0x017b72c5, 0x03f544cd, 0x013eefef, 0x0387442d, 0x00554fa1, 0x000b5513, 0x00768110, 0x002e4b94}}}, + {X: Field{[10]uint32{0x00230d9f, 0x03801ee0, 0x028e11aa, 0x02f37471, 0x00d7cdcf, 0x03c63604, 0x036ae35a, 0x00f5cc16, 0x001b1d14, 0x000213be}}, Y: Field{[10]uint32{0x0175d42a, 0x028bb72d, 0x001bb33c, 0x0116a9b8, 0x02b0dda6, 0x00e28b96, 0x02bcf2c6, 0x033a3087, 0x022ba5b4, 0x0032b8e6}}}, + {X: Field{[10]uint32{0x009037ad, 0x00544b7b, 0x02a62dd7, 0x034a9ccf, 0x01c8d89d, 0x03b58aa1, 0x007af5e0, 0x01ab1d99, 0x01a3326e, 0x000708ab}}, Y: Field{[10]uint32{0x02aab458, 0x00126045, 0x00b64493, 0x03726580, 0x00bc4142, 0x02e79bf5, 0x0246283c, 0x029abe67, 0x00c61562, 0x003d6966}}}, + {X: Field{[10]uint32{0x024aff1b, 0x01c7307e, 0x03f4e736, 0x012142ef, 0x03c00f1f, 0x02781054, 0x00dd35fe, 0x02af56aa, 0x024ff08e, 0x001ae472}}, Y: Field{[10]uint32{0x01b31852, 0x00943f84, 0x039778cb, 0x0069f761, 0x01b3c955, 0x00413d61, 0x0368c8b6, 0x03e6753e, 0x02da85ad, 0x0031b36a}}}, + {X: Field{[10]uint32{0x01f85bc2, 0x01e2573b, 0x0188e23f, 0x02d7a3dc, 0x00b99063, 0x020dcdb9, 0x03f03219, 0x00855d84, 0x01996d2e, 0x0015eed2}}, Y: Field{[10]uint32{0x0347cc3a, 0x036dd96a, 0x0150e94f, 0x0050156d, 0x02d0a1ad, 0x01cea0b6, 0x034b9b20, 0x02a43a49, 0x01c672ee, 0x0024ed1b}}}, + {X: Field{[10]uint32{0x0233ba6e, 0x03d49812, 0x001ccb40, 0x0289e2be, 0x00067c38, 0x018f7e3c, 0x016d9f24, 0x0159b841, 0x0327ebf7, 0x001d5e42}}, Y: Field{[10]uint32{0x009d2045, 0x0267172e, 0x02dac6be, 0x01c66b81, 0x003af8dc, 0x011bab75, 0x025decf3, 0x002976c1, 0x00a3d99b, 0x00328323}}}, + {X: Field{[10]uint32{0x0074ebe9, 0x02f2ed41, 0x00a08f32, 0x03d36e31, 0x028dd7b4, 0x00c01287, 0x032b6fde, 0x01642fdf, 0x01ada90b, 0x00329e9d}}, Y: Field{[10]uint32{0x03fc69e3, 0x037b5a60, 0x03a1efd3, 0x0166b372, 0x00512732, 0x003c7700, 0x00e8a08e, 0x01479efd, 0x019c5c93, 0x002cc9e3}}}, + {X: Field{[10]uint32{0x0390b2d1, 0x013d754b, 0x0365c07a, 0x016bcc61, 0x0147b65a, 0x014aecd9, 0x02a8d6ce, 0x018a50e4, 0x00b93bf4, 0x0029b71a}}, Y: Field{[10]uint32{0x010ad45b, 0x00970cf2, 0x024de8f9, 0x01220648, 0x0237f533, 0x024c7718, 0x033c76a0, 0x01558683, 0x0167fc57, 0x00106e9b}}}, + {X: Field{[10]uint32{0x03b6bba5, 0x036b87da, 0x01b56fe0, 0x0130fd49, 0x002fafed, 0x0030d844, 0x035a0252, 0x03242b1f, 0x01f3f8af, 0x0036884e}}, Y: Field{[10]uint32{0x036349db, 0x001819c6, 0x02c369ad, 0x00743d6e, 0x0271e92c, 0x03968e53, 0x0097522d, 0x03605b70, 0x0388fa9e, 0x00256b72}}}, + {X: Field{[10]uint32{0x013da4de, 0x023893d0, 0x002cdf5a, 0x01ec8fc4, 0x03215935, 0x02aea732, 0x034194bf, 0x00018eb2, 0x00752f0e, 0x0028cac9}}, Y: Field{[10]uint32{0x03e576cc, 0x034c587a, 0x013dbddf, 0x02e0d3c1, 0x03e09f8a, 0x030d40db, 0x0316ffd8, 0x009ff31d, 0x0143bd8b, 0x0015f7d0}}}, + {X: Field{[10]uint32{0x01e9bedc, 0x00e2532b, 0x01392b89, 0x03c8b248, 0x02741718, 0x008cf1ce, 0x0319d8ba, 0x013fcf1c, 0x011d3382, 0x002aba92}}, Y: Field{[10]uint32{0x001a63a7, 0x02d85513, 0x02f4eb24, 0x00cb57e3, 0x01a7ad0d, 0x016bb61b, 0x026a3a1a, 0x0371964e, 0x029184d8, 0x000323ec}}}, + {X: Field{[10]uint32{0x007f2c75, 0x0222b362, 0x015e7ed3, 0x0170ac0c, 0x01ccf75d, 0x01a3ed8e, 0x00f3eb3d, 0x0026f489, 0x00e27a84, 0x000a4d78}}, Y: Field{[10]uint32{0x0168aad4, 0x026a4e31, 0x001640c8, 0x00343f7f, 0x03977e90, 0x00603530, 0x03d00680, 0x02b90260, 0x002462c9, 0x000313fc}}}, + {X: Field{[10]uint32{0x030fe577, 0x0091339d, 0x0218163d, 0x02581419, 0x03fdebbd, 0x02fabfb2, 0x034259aa, 0x01c94d60, 0x00769e2e, 0x001ff2a0}}, Y: Field{[10]uint32{0x01bc3542, 0x0384f355, 0x02ed99a5, 0x02e9f6eb, 0x0369cfec, 0x03f453fe, 0x003b8f6f, 0x03b48b2b, 0x03abf04d, 0x0028f770}}}, + {X: Field{[10]uint32{0x028b483e, 0x02d06457, 0x002a96a7, 0x031c4c59, 0x00bc129e, 0x01ed144d, 0x01e665f5, 0x02929fe9, 0x01c601ca, 0x00316d7c}}, Y: Field{[10]uint32{0x00b538e4, 0x01efeee7, 0x012576d3, 0x019b6332, 0x0173dabb, 0x0098047a, 0x0358fd0c, 0x0263368f, 0x0016da50, 0x0009b2ce}}}, + {X: Field{[10]uint32{0x01a50d88, 0x03eda81e, 0x034f456b, 0x01d33ff6, 0x03d7d5b1, 0x01e400d6, 0x01ecf4bf, 0x019dc993, 0x0274df43, 0x00104368}}, Y: Field{[10]uint32{0x039a6abf, 0x034aefbb, 0x000f88e1, 0x00e56efc, 0x02254a19, 0x01065e7e, 0x002ef1e8, 0x02cd25b7, 0x0168188e, 0x001c7206}}}, + {X: Field{[10]uint32{0x0367769a, 0x01634173, 0x03387540, 0x02b142af, 0x036f7976, 0x00e89a06, 0x036c5a24, 0x032002ae, 0x00ca334d, 0x000f664a}}, Y: Field{[10]uint32{0x01d2beb7, 0x03d3a7e5, 0x0115b2e4, 0x02af137c, 0x0062bf01, 0x00282879, 0x0183cdd8, 0x009ed4f8, 0x01dc7661, 0x0033f300}}}, + {X: Field{[10]uint32{0x00040cec, 0x03d0db32, 0x009192e4, 0x0387ce7f, 0x02d858ea, 0x000028c8, 0x037ce312, 0x0392991d, 0x017bc523, 0x00196a3d}}, Y: Field{[10]uint32{0x01192432, 0x01ff7018, 0x01b323f0, 0x03f30815, 0x03c9df69, 0x008affd8, 0x03f7b0ea, 0x00dd16c7, 0x00b99e95, 0x002081a6}}}, + {X: Field{[10]uint32{0x0192fb79, 0x00f99a97, 0x021531ac, 0x00e4929c, 0x0055f4e5, 0x0189c969, 0x013ef5ca, 0x001b0bff, 0x03ccbaa6, 0x00213954}}, Y: Field{[10]uint32{0x00c5f8d2, 0x03f43ce7, 0x01d674dc, 0x01d4640b, 0x014c0b5f, 0x03004887, 0x01f77311, 0x025197f6, 0x03324aaa, 0x000d35ab}}}, + {X: Field{[10]uint32{0x00773783, 0x03059a80, 0x036ac5f8, 0x02d3de68, 0x00dda3d4, 0x03451b6a, 0x011578d5, 0x00489bce, 0x01582885, 0x000ed29d}}, Y: Field{[10]uint32{0x01a59e53, 0x0021306c, 0x007877d0, 0x02f1335f, 0x021a4249, 0x013534d6, 0x00b3cc14, 0x00f30bad, 0x02fc4de8, 0x0038df25}}}, + {X: Field{[10]uint32{0x00cee6b0, 0x01b67bd4, 0x01db8922, 0x01e1920b, 0x02743395, 0x01ff344b, 0x00898193, 0x013a37a9, 0x012c0616, 0x001b6ef4}}, Y: Field{[10]uint32{0x01e02b90, 0x005845ab, 0x02a70333, 0x03182000, 0x020eed3b, 0x0069a2b3, 0x0247c17e, 0x0345514b, 0x0349b3f5, 0x00227923}}}, + {X: Field{[10]uint32{0x03c441f6, 0x03edcaa5, 0x03e02f0b, 0x0275b307, 0x02f1118e, 0x03e12bdc, 0x020b7431, 0x019205d2, 0x00db3b92, 0x002d9060}}, Y: Field{[10]uint32{0x03b25fd2, 0x03c30b13, 0x004d99e1, 0x036fab1c, 0x0033cc19, 0x03256817, 0x03a4f0f8, 0x00205899, 0x019783d0, 0x002ce53e}}}, + {X: Field{[10]uint32{0x016b5c56, 0x003c0e88, 0x02115b26, 0x02fb91ac, 0x0137e96f, 0x02ed9fca, 0x037fc08e, 0x01df1b65, 0x038cf473, 0x00085cfc}}, Y: Field{[10]uint32{0x012e2abf, 0x008becc8, 0x0136f27e, 0x006939e7, 0x023bd1c6, 0x01afb3d5, 0x008c6df0, 0x029a13f6, 0x027803c4, 0x002f680a}}}, + {X: Field{[10]uint32{0x005c5214, 0x03899b7f, 0x0356a222, 0x029aa289, 0x02ea2b89, 0x033cd781, 0x00df0b48, 0x00bc3619, 0x00d3f373, 0x0027767b}}, Y: Field{[10]uint32{0x03e921fe, 0x035c4b85, 0x0106fa70, 0x0069437b, 0x01dcf00b, 0x01f6e52b, 0x019256a5, 0x0209083b, 0x03202ba6, 0x00390ba9}}}, + {X: Field{[10]uint32{0x03af71a9, 0x004873f9, 0x0136b02a, 0x00c98134, 0x029d3982, 0x03dca424, 0x0149526a, 0x02d8bb75, 0x03ed5ceb, 0x001c17e7}}, Y: Field{[10]uint32{0x010d30a8, 0x00b30a5d, 0x01d2c44d, 0x00028580, 0x002b32c1, 0x01e9e18f, 0x0269a4a5, 0x01cbac4b, 0x017daa44, 0x002ecb2c}}}, + {X: Field{[10]uint32{0x00ef4410, 0x02130acb, 0x031a217b, 0x028a3637, 0x033fbcda, 0x03f04978, 0x037fcd8c, 0x01a6f5fe, 0x00d18071, 0x003c6a42}}, Y: Field{[10]uint32{0x00911512, 0x02a91a2e, 0x02cc14e7, 0x03921e04, 0x02d792bb, 0x0214799e, 0x01cfa759, 0x01b15be0, 0x0008804c, 0x0003a1b3}}}, + {X: Field{[10]uint32{0x01355f57, 0x03370938, 0x00d5fd40, 0x00d1491f, 0x005625e4, 0x02148983, 0x012a4756, 0x00f2071d, 0x01793569, 0x0036c317}}, Y: Field{[10]uint32{0x0283daea, 0x030ba371, 0x02629fe8, 0x0354d533, 0x01d0de9b, 0x014e7af9, 0x0321f1e2, 0x034a54dd, 0x02a9fb00, 0x00048317}}}, + {X: Field{[10]uint32{0x02423ec6, 0x03b652f2, 0x00af59a2, 0x01c1ed4f, 0x02e979d4, 0x010476a1, 0x0158f683, 0x01fa486c, 0x01355600, 0x00179356}}, Y: Field{[10]uint32{0x0272d935, 0x01ddcf98, 0x026dcb94, 0x02824a1d, 0x01c309b5, 0x0339abbf, 0x0062fb37, 0x027b4c9e, 0x03001a0e, 0x001c5622}}}, + {X: Field{[10]uint32{0x03ec7f28, 0x00abd013, 0x02bcd487, 0x0019fb3e, 0x00a264d1, 0x00904059, 0x017fd112, 0x0397e23a, 0x02083c46, 0x00069e7b}}, Y: Field{[10]uint32{0x02349111, 0x03de8c8c, 0x02aacc4d, 0x03536501, 0x0254f94b, 0x0229723f, 0x016289f1, 0x01d54c0d, 0x03fc49bf, 0x003e4a36}}}, + {X: Field{[10]uint32{0x00ac5468, 0x028ebcdb, 0x0346e86c, 0x00492af7, 0x011c3a18, 0x00e8290d, 0x000a2d7f, 0x00311b2d, 0x008be3be, 0x0039a4fe}}, Y: Field{[10]uint32{0x01649cc4, 0x002529b7, 0x00efb78f, 0x0135994e, 0x03fb4f35, 0x022bb16b, 0x032db89d, 0x00a8aebb, 0x03bd24ab, 0x00157c2d}}}, + {X: Field{[10]uint32{0x029ca25e, 0x0315468c, 0x03e581bc, 0x015d7435, 0x0043bb61, 0x017a5b8a, 0x03b12d4f, 0x00f1dbdc, 0x00b1f3c7, 0x001b457a}}, Y: Field{[10]uint32{0x017f069d, 0x030d620b, 0x0365db74, 0x02f9b8ed, 0x01173f8c, 0x0067e296, 0x020d05e4, 0x01909cca, 0x02e18438, 0x003c87cf}}}, + {X: Field{[10]uint32{0x03ddb682, 0x02aab78e, 0x02dc48a5, 0x0393fd4d, 0x0220dd98, 0x01964f45, 0x0303f2cf, 0x012bd254, 0x0127b261, 0x00122e3c}}, Y: Field{[10]uint32{0x03546e3f, 0x0395fb0b, 0x02e99c7c, 0x0075a00e, 0x02a50d19, 0x0175e1b5, 0x027e23b5, 0x01f18944, 0x01baec13, 0x0023b46e}}}, + {X: Field{[10]uint32{0x02eb3028, 0x029f03d6, 0x023d4170, 0x02923fdf, 0x008c29fc, 0x028cb828, 0x0319f291, 0x01144251, 0x0231ee1e, 0x000bb0c9}}, Y: Field{[10]uint32{0x017aa945, 0x015e171a, 0x02c91610, 0x03e04faa, 0x02491572, 0x0341f426, 0x010ee359, 0x014db963, 0x019fe21b, 0x003ae187}}}, + {X: Field{[10]uint32{0x03afce3a, 0x02e3282b, 0x017b6776, 0x019ba861, 0x007ab72f, 0x01573251, 0x012c13fb, 0x0353517b, 0x02cb3b35, 0x003de583}}, Y: Field{[10]uint32{0x0010f08a, 0x0366b9e1, 0x00510cd6, 0x01fe3e1f, 0x03d8f7cf, 0x0280bba9, 0x0140334d, 0x01ad029c, 0x00f8d40f, 0x00240917}}}, + {X: Field{[10]uint32{0x02613ef2, 0x011c496e, 0x035af7a2, 0x02e31f72, 0x01139b29, 0x0163cea8, 0x0385780d, 0x03df9bbc, 0x003e4b22, 0x002a5333}}, Y: Field{[10]uint32{0x02845409, 0x03511768, 0x00c45e94, 0x032e33e9, 0x02782471, 0x02f1a99b, 0x01ba357c, 0x03e836a2, 0x00fadd6a, 0x003bdc14}}}, + {X: Field{[10]uint32{0x01485c38, 0x018bd53d, 0x0239956d, 0x03b45c21, 0x028c42b3, 0x0315bc09, 0x03d6f576, 0x03d0c034, 0x03f86d80, 0x0039229f}}, Y: Field{[10]uint32{0x029a6255, 0x03671697, 0x00231a7b, 0x00091ee6, 0x03e429b7, 0x01ffed0a, 0x01e3c65c, 0x01ec2c8a, 0x0229b499, 0x002c5a54}}}, + {X: Field{[10]uint32{0x0322d2ae, 0x027a6edf, 0x00d9eac7, 0x02efd922, 0x02cccb09, 0x00a98cf5, 0x025b422b, 0x0320eb36, 0x008c7d46, 0x0037e652}}, Y: Field{[10]uint32{0x0345fd4b, 0x01dd58bc, 0x038c3e04, 0x01176468, 0x03aaf83a, 0x02f4f1ca, 0x001a8785, 0x03d17114, 0x0280a958, 0x00225240}}}, + {X: Field{[10]uint32{0x0322fd84, 0x03bd06bb, 0x03770553, 0x00f8a6c9, 0x032bb4e4, 0x02e8d23b, 0x024368eb, 0x03e7d1bd, 0x02c04db9, 0x00285431}}, Y: Field{[10]uint32{0x01c5c201, 0x0193ca46, 0x01ccae1f, 0x01fad121, 0x00e7b539, 0x0038fb47, 0x0122ab02, 0x01683b0e, 0x0274e152, 0x001877ea}}}, + {X: Field{[10]uint32{0x03aa0edd, 0x02a9507c, 0x024e1204, 0x03ff615a, 0x00937392, 0x0326128a, 0x03aa167b, 0x031be475, 0x01fa452e, 0x0026df7b}}, Y: Field{[10]uint32{0x03d2c74a, 0x012a113f, 0x03e7910a, 0x002732b6, 0x03b4262c, 0x0326cc6a, 0x020ef6e7, 0x01a37af2, 0x01122f51, 0x0028dfd2}}}, + {X: Field{[10]uint32{0x00e51904, 0x03b4d60a, 0x01a23d38, 0x00f3e482, 0x02ad1aa8, 0x01e69641, 0x00f75c55, 0x03a9c6c8, 0x02516d0c, 0x0031f5de}}, Y: Field{[10]uint32{0x00a44bd6, 0x0393635d, 0x00e7f56d, 0x02232d7b, 0x0108e5a2, 0x026c36ba, 0x030a7a14, 0x00d980de, 0x007d9e1a, 0x000e669f}}}, + {X: Field{[10]uint32{0x02fe73fd, 0x009e52d0, 0x02e8d806, 0x03b2cee1, 0x02fc1d1d, 0x01cf6604, 0x026c2b0f, 0x0396e685, 0x00298e4d, 0x0034c4ea}}, Y: Field{[10]uint32{0x03708fe4, 0x02a20c07, 0x02a16fc9, 0x027182bd, 0x03b8514c, 0x02ef6d36, 0x03062c5d, 0x01b8bcd3, 0x023a7eb2, 0x00194911}}}, + {X: Field{[10]uint32{0x03211e5f, 0x0181ffa5, 0x038b9787, 0x00f1263c, 0x022e6c2a, 0x00f13c63, 0x0069b8e8, 0x031a4c19, 0x023b4d66, 0x0012efcd}}, Y: Field{[10]uint32{0x011c60c3, 0x01ba301f, 0x025629f2, 0x01670378, 0x0382bb0d, 0x00605dd0, 0x03b64061, 0x01cb1631, 0x024b2438, 0x002790b2}}}, + {X: Field{[10]uint32{0x021e9cf2, 0x0114d7e1, 0x0003e3f8, 0x00ddd19d, 0x01d471bd, 0x0199f3c6, 0x027ef1da, 0x033a1b52, 0x00ed23a0, 0x0000ef84}}, Y: Field{[10]uint32{0x0066d885, 0x02c10cd0, 0x00ead0a7, 0x02432e57, 0x00edfd20, 0x026ee7ea, 0x034748a4, 0x005f0194, 0x03780cb3, 0x002ee564}}}, + {X: Field{[10]uint32{0x01ca2076, 0x02736cd7, 0x01d96b16, 0x026032e9, 0x00946da1, 0x034a7bb1, 0x01074ec8, 0x0258f20a, 0x0080d723, 0x003f347e}}, Y: Field{[10]uint32{0x02a87b01, 0x024674ec, 0x013467c0, 0x02b896fb, 0x02d3b105, 0x03e97f21, 0x00ec2755, 0x018b8713, 0x00e3a313, 0x0025226f}}}, + {X: Field{[10]uint32{0x02b317c4, 0x03009c7e, 0x0217cf0e, 0x02a14b34, 0x01f39f42, 0x023a81a0, 0x027114cd, 0x00d98acb, 0x0358993d, 0x0002d7ec}}, Y: Field{[10]uint32{0x03a71b43, 0x02ceeefc, 0x0334a791, 0x0314537d, 0x0380a653, 0x02c12b09, 0x01bfa828, 0x00b2f3c3, 0x02b8ee62, 0x00227623}}}, + {X: Field{[10]uint32{0x03e274e7, 0x00920563, 0x037c9556, 0x01fd8139, 0x0330fc13, 0x00b32acf, 0x000f39bd, 0x0118291d, 0x02d17fca, 0x002a1aee}}, Y: Field{[10]uint32{0x030753fb, 0x02de8a40, 0x01a0bd03, 0x038498fd, 0x031394ed, 0x01258b01, 0x0294742e, 0x026b1e34, 0x0259ba96, 0x00309b70}}}, + {X: Field{[10]uint32{0x0330d29a, 0x02486004, 0x01467887, 0x025309f4, 0x019dd3fc, 0x024d744a, 0x034bc7ba, 0x02f259f8, 0x01f6348c, 0x0003b4c8}}, Y: Field{[10]uint32{0x03f7c3b5, 0x00349468, 0x021351be, 0x00085400, 0x00fc5ac4, 0x03c1ef72, 0x03b44d6c, 0x0177871d, 0x0360832b, 0x002d01e0}}}, + {X: Field{[10]uint32{0x02d17dea, 0x035c6506, 0x0097996e, 0x023dc07f, 0x022c425b, 0x03825312, 0x01e827ed, 0x02e4dbd5, 0x0275e4dd, 0x003205e4}}, Y: Field{[10]uint32{0x002553a7, 0x03fa6776, 0x02622e16, 0x018f14ac, 0x038ce5e9, 0x019921ab, 0x009b0b92, 0x034597ad, 0x005be241, 0x003667c7}}}, + {X: Field{[10]uint32{0x0284985b, 0x03435f77, 0x02512df1, 0x00b87647, 0x010eeaf8, 0x03e37f3f, 0x02743283, 0x02ce0d24, 0x013f23b9, 0x001bc23c}}, Y: Field{[10]uint32{0x00bd602e, 0x00ff8236, 0x03a76a4a, 0x00788b31, 0x010665d6, 0x000dc2b1, 0x0258ed05, 0x010ce9bb, 0x0029f99f, 0x0025adaa}}}, + {X: Field{[10]uint32{0x038f9d5a, 0x031f99e7, 0x015e4b35, 0x01b28461, 0x03e6ab5d, 0x03ab0f97, 0x01f8b609, 0x02753fbe, 0x03e3410f, 0x002510e9}}, Y: Field{[10]uint32{0x03eded57, 0x003e4d8e, 0x01b538fa, 0x03756847, 0x02ac9b2a, 0x001eaf08, 0x03c93e6d, 0x0230fcc6, 0x03b57818, 0x00363141}}}, + {X: Field{[10]uint32{0x033c502b, 0x01c0fd44, 0x013d2e37, 0x0120378a, 0x01d38c88, 0x01c015bb, 0x03afcfa5, 0x00da06b4, 0x00ca3ed5, 0x0010cbaa}}, Y: Field{[10]uint32{0x03edff71, 0x00ce26da, 0x00118faa, 0x0371909c, 0x010965dd, 0x009b1a98, 0x0266a498, 0x00aec023, 0x028b70b5, 0x00278648}}}, + {X: Field{[10]uint32{0x0182403b, 0x0240ff86, 0x032c130f, 0x03ab8adc, 0x005e22ff, 0x00f1ffb6, 0x02584a3d, 0x00bf6316, 0x009a42f8, 0x000745d6}}, Y: Field{[10]uint32{0x00c39ceb, 0x003d549e, 0x00e9454e, 0x017ef978, 0x03511e96, 0x0117c31a, 0x0164ed02, 0x03482099, 0x03b48f18, 0x0027def3}}}, + {X: Field{[10]uint32{0x018e6b2d, 0x00da87f8, 0x0098b554, 0x03fffdf0, 0x021ab8c6, 0x024104b3, 0x02778ea7, 0x0211bd97, 0x01b5cd84, 0x001d0ce6}}, Y: Field{[10]uint32{0x00b784bc, 0x03d26cb6, 0x03145fb1, 0x02739733, 0x01e84ff4, 0x0006dbf4, 0x0166d3fc, 0x006f9399, 0x001a8280, 0x00371b32}}}, + {X: Field{[10]uint32{0x0110b2a7, 0x0268369e, 0x0071fa27, 0x00cb817e, 0x025330d2, 0x02d7e490, 0x023e80e3, 0x0123058b, 0x01583b28, 0x00390de1}}, Y: Field{[10]uint32{0x01624b68, 0x036b3c15, 0x011f080c, 0x006f41db, 0x01d5e242, 0x005e6862, 0x013f99f8, 0x01e3901f, 0x0171aa49, 0x0030e6d0}}}, + {X: Field{[10]uint32{0x0318d63e, 0x0009acd9, 0x02a10664, 0x033bd7d0, 0x038f8a99, 0x00029918, 0x0355ac7d, 0x00e6a3c5, 0x00a31b16, 0x003bbdda}}, Y: Field{[10]uint32{0x0224a991, 0x01211cc7, 0x01ef5ee6, 0x02e22f8a, 0x01878efc, 0x03a5ec19, 0x030043af, 0x039a186b, 0x01f4cbf4, 0x000aa401}}}, + {X: Field{[10]uint32{0x03c91fe9, 0x0032a86f, 0x0129a180, 0x027ecb7a, 0x00fc2afa, 0x01807612, 0x00dce1bd, 0x0184b3d0, 0x02872504, 0x000576d1}}, Y: Field{[10]uint32{0x027eded8, 0x01c43313, 0x03515f17, 0x002e568b, 0x021e7236, 0x0242e0b2, 0x00678a9d, 0x02366941, 0x024e7d50, 0x002a2db9}}}, + {X: Field{[10]uint32{0x014a4191, 0x015eeb43, 0x022a0c77, 0x00fbf1e3, 0x01d2b330, 0x015a87f6, 0x028d2a04, 0x02a12e74, 0x02cf2529, 0x002b517e}}, Y: Field{[10]uint32{0x0254f069, 0x012a234d, 0x0125aa6b, 0x002583e6, 0x01bf8d81, 0x03ddf56b, 0x02f58678, 0x00c0d45b, 0x0171473f, 0x00069e39}}}, + {X: Field{[10]uint32{0x01151824, 0x02526d6e, 0x03d8958c, 0x01b57e92, 0x021c19b6, 0x0224aeb0, 0x0375050a, 0x01ed33ad, 0x03446e02, 0x0010680d}}, Y: Field{[10]uint32{0x01140317, 0x0150df65, 0x00e74bb4, 0x033590d7, 0x0027c53a, 0x00381ea1, 0x021cb2e6, 0x034e3e9c, 0x00ddfa96, 0x003b5f11}}}, + {X: Field{[10]uint32{0x03217ae0, 0x0047c749, 0x00740560, 0x035836b0, 0x015a70d5, 0x003c410f, 0x03645890, 0x031ffcb3, 0x006958f4, 0x0008082e}}, Y: Field{[10]uint32{0x01c4e9e0, 0x02e53df8, 0x02aa0490, 0x0184a754, 0x02b37f59, 0x0093ac71, 0x01946171, 0x03d0c686, 0x01e22757, 0x00044656}}}, + {X: Field{[10]uint32{0x02bd4ba1, 0x00e0ea7a, 0x00180283, 0x0155c400, 0x0299c5f7, 0x021685a7, 0x033bf27d, 0x01d2a543, 0x0146859f, 0x000be66a}}, Y: Field{[10]uint32{0x0389fc53, 0x0153dd37, 0x039fa128, 0x02753a35, 0x0236ecba, 0x03982164, 0x024ed246, 0x03aa891e, 0x0182d3ca, 0x000f9888}}}, + {X: Field{[10]uint32{0x02369baa, 0x03af7467, 0x03a3c177, 0x01d752a0, 0x010e7c56, 0x03889fca, 0x027688c2, 0x014e4005, 0x018957f6, 0x003773ce}}, Y: Field{[10]uint32{0x034b2431, 0x0077004b, 0x01b873da, 0x0233cac4, 0x01c3c342, 0x02437408, 0x01a3ceea, 0x020ce88e, 0x023f3fa6, 0x0029c031}}}, + {X: Field{[10]uint32{0x011ace4f, 0x03441086, 0x0117b73b, 0x02ab02de, 0x0392df1e, 0x024c6716, 0x022fa9e0, 0x008d8067, 0x03b80425, 0x002618e9}}, Y: Field{[10]uint32{0x003b69e6, 0x018d58b8, 0x02b6a3bf, 0x02b93c6c, 0x023a1fa7, 0x00928c3a, 0x0309f8c7, 0x02ac852f, 0x01a9281d, 0x00126926}}}, + {X: Field{[10]uint32{0x01733886, 0x02a3d637, 0x01d2e467, 0x03bcf1b5, 0x0219cb4d, 0x012e3a4b, 0x033734a6, 0x01645cd3, 0x01f9ea2c, 0x001b1519}}, Y: Field{[10]uint32{0x020e733c, 0x03f110c7, 0x03c8d3da, 0x017e8701, 0x03768f65, 0x00c66acf, 0x02a2616a, 0x03cd7456, 0x02bb179d, 0x00015f88}}}, + {X: Field{[10]uint32{0x00f3fcdd, 0x01e7c514, 0x03a530d9, 0x0153f9c0, 0x0025acb6, 0x02c281a4, 0x00ca387f, 0x00efac34, 0x0113360b, 0x002acdd5}}, Y: Field{[10]uint32{0x0041be4a, 0x01170bdb, 0x027c5464, 0x01d940fb, 0x0157f0f7, 0x030de9bb, 0x03842f43, 0x00b7966d, 0x0149309a, 0x000fa704}}}, + {X: Field{[10]uint32{0x002603d2, 0x00481e93, 0x03111482, 0x02a7a450, 0x00ff0878, 0x0016c8b4, 0x03aee379, 0x03bac2c8, 0x03ea4a72, 0x001ab2f8}}, Y: Field{[10]uint32{0x030d32b9, 0x032c6777, 0x025330ae, 0x00f39256, 0x02ac2ca2, 0x03279a01, 0x023dad76, 0x01365a85, 0x00be9f93, 0x0007b3bf}}}, + {X: Field{[10]uint32{0x02955d89, 0x03e573ce, 0x008c3653, 0x00141fc7, 0x03b4ddd1, 0x01d9b894, 0x00ac9f9c, 0x00310979, 0x014458fd, 0x001e5574}}, Y: Field{[10]uint32{0x0250aaca, 0x00d40925, 0x01245847, 0x00ec0349, 0x0340c672, 0x00e880a1, 0x02892255, 0x021fc252, 0x01f73043, 0x0023ea71}}}, + {X: Field{[10]uint32{0x01ace377, 0x0083360d, 0x0213228c, 0x02ff95e0, 0x02d488eb, 0x01ef4f68, 0x02b25a22, 0x010cfdc0, 0x010c0090, 0x002d65cb}}, Y: Field{[10]uint32{0x02b008fa, 0x035932d0, 0x03212cf3, 0x0211702f, 0x00e3e78f, 0x005d2cbf, 0x01ef70ed, 0x00f7949e, 0x00bf7fbc, 0x0008d51c}}}, + {X: Field{[10]uint32{0x00bcf886, 0x02d22f41, 0x038e4d9c, 0x01f91257, 0x02cc500d, 0x00f31e7c, 0x004f3bc5, 0x03e9a288, 0x001033a5, 0x002899aa}}, Y: Field{[10]uint32{0x015949f8, 0x022def7d, 0x011ecb56, 0x00916c2e, 0x03d52b78, 0x011bcf8d, 0x00390e6a, 0x0056dd99, 0x01a1958d, 0x000c6a2c}}}, + {X: Field{[10]uint32{0x00b9cc15, 0x03908751, 0x03123451, 0x00fdf783, 0x01ae7f4f, 0x03a7df08, 0x03bf47e1, 0x006d8d6e, 0x02ec2119, 0x00071904}}, Y: Field{[10]uint32{0x002c685a, 0x0188a131, 0x0169d82a, 0x006c8bfe, 0x016e7fec, 0x000958c2, 0x0173851d, 0x0313cfd6, 0x022c1111, 0x0020cfe2}}}, + {X: Field{[10]uint32{0x020b7fda, 0x018841cf, 0x01f68a74, 0x01f17989, 0x03817267, 0x03b813fc, 0x019ccbef, 0x016d5e70, 0x02ab1757, 0x003b8d4c}}, Y: Field{[10]uint32{0x027e8718, 0x03d1441b, 0x00f53a9a, 0x02d24acb, 0x0304b704, 0x03123b9a, 0x01ff04dc, 0x0261ee0f, 0x00c8b2fd, 0x003c4b84}}}, + {X: Field{[10]uint32{0x021a3838, 0x011367fb, 0x0115e379, 0x012c0259, 0x0152ef9a, 0x01fd6d2f, 0x012765af, 0x01e4dcbb, 0x03be0486, 0x0017b443}}, Y: Field{[10]uint32{0x00080573, 0x03218ced, 0x028af2a8, 0x01ed7ef1, 0x02a4bffd, 0x00977399, 0x00ac6410, 0x00e493b6, 0x01b49fbe, 0x002313ae}}}, + {X: Field{[10]uint32{0x001378d2, 0x00754d74, 0x0152a15a, 0x0165c208, 0x01b8f6b8, 0x01cd0838, 0x03e7345f, 0x0217b5a7, 0x0221f04c, 0x003f8d22}}, Y: Field{[10]uint32{0x001f2b7b, 0x0273f482, 0x019117fa, 0x00f5f67e, 0x03506947, 0x038e3908, 0x02abd103, 0x02afd173, 0x0046c9f5, 0x00356575}}}, + {X: Field{[10]uint32{0x032436e9, 0x0221d17e, 0x0223dbda, 0x02730245, 0x03b57367, 0x016e8e5c, 0x021e1c0b, 0x012e8021, 0x0369b7b6, 0x0001c500}}, Y: Field{[10]uint32{0x03a12b2d, 0x01da9520, 0x010ad1f3, 0x01881cb1, 0x0240dfa3, 0x003199cb, 0x003bc213, 0x02581ca3, 0x0350f979, 0x003c1dc0}}}, + {X: Field{[10]uint32{0x01dad15d, 0x020855e6, 0x01bd40aa, 0x036ea0e0, 0x020a7465, 0x0048c025, 0x02c6b88b, 0x0078eb9f, 0x00e48e98, 0x001b4531}}, Y: Field{[10]uint32{0x03e0f841, 0x016c1439, 0x0299a50e, 0x023ed6fa, 0x01f9c6de, 0x02d62cb5, 0x02635f6d, 0x0344aa93, 0x02aaa5f2, 0x00097934}}}, + {X: Field{[10]uint32{0x024383da, 0x036c2bc6, 0x0228daea, 0x01c416ed, 0x004dffe0, 0x015413a2, 0x020558e5, 0x01f5f8d8, 0x01c6a683, 0x001e4c6e}}, Y: Field{[10]uint32{0x03e80c0b, 0x033fb7be, 0x002ff9d5, 0x0012108b, 0x0196b7a9, 0x03cef4e3, 0x0112128b, 0x00971b77, 0x02733209, 0x00161b2a}}}, + {X: Field{[10]uint32{0x01cec834, 0x03342f79, 0x03d95b0e, 0x01149eaa, 0x0088dca1, 0x005462e2, 0x00e1f32a, 0x00f50d74, 0x016a35b8, 0x000527a7}}, Y: Field{[10]uint32{0x025606f5, 0x01d316b3, 0x02e1fcbc, 0x03300641, 0x00f87b11, 0x03404bed, 0x01d49b38, 0x033197a4, 0x02a0fd84, 0x0011601e}}}, + {X: Field{[10]uint32{0x01297394, 0x026f49c3, 0x03ff7b80, 0x025b0a12, 0x001bf6e6, 0x01e52404, 0x02f2b59d, 0x0146a088, 0x036eb4b3, 0x00195ac9}}, Y: Field{[10]uint32{0x03763291, 0x01cca05e, 0x025d9b64, 0x034feaa3, 0x03905eb6, 0x0038d624, 0x00ebfa9a, 0x010e8a4a, 0x03095f86, 0x0021d1bc}}}, + {X: Field{[10]uint32{0x031eb02e, 0x012d8283, 0x000a6988, 0x00814e62, 0x033656a7, 0x01e14b87, 0x022370ff, 0x01a627b9, 0x01e36808, 0x00183ce6}}, Y: Field{[10]uint32{0x0044ad59, 0x02cadbf5, 0x0267d4f1, 0x03f937bc, 0x039e5976, 0x0082dde7, 0x0251676d, 0x02f85214, 0x005a8347, 0x00157728}}}, + {X: Field{[10]uint32{0x006eaa13, 0x036f9062, 0x00e0d4ca, 0x016a4063, 0x01034a30, 0x013e6f70, 0x006f4175, 0x02907029, 0x03030a67, 0x00136f68}}, Y: Field{[10]uint32{0x03a48fc4, 0x01616e0f, 0x03970c22, 0x025748f5, 0x01909a3b, 0x010cedd1, 0x01f9fe64, 0x00d16359, 0x0086fec3, 0x003818b3}}}, + {X: Field{[10]uint32{0x010363d1, 0x03ca8037, 0x03111d07, 0x0313d256, 0x03f8c8b1, 0x0360671a, 0x03c10c8f, 0x01336569, 0x01ca04d6, 0x00205ab8}}, Y: Field{[10]uint32{0x02526009, 0x03470619, 0x0366b2df, 0x03c83524, 0x03b12187, 0x03a744ee, 0x02a55208, 0x035bf55b, 0x03ffc331, 0x003027da}}}, + {X: Field{[10]uint32{0x0081b52b, 0x00636be0, 0x020a000f, 0x011305b5, 0x01872029, 0x0178a22b, 0x032b8fae, 0x03829f0e, 0x039c983f, 0x001160e7}}, Y: Field{[10]uint32{0x01dd8649, 0x02169a99, 0x004db2a7, 0x01af3684, 0x01aff40c, 0x0020d6be, 0x01f7beb3, 0x013ad020, 0x02074de7, 0x003e4da3}}}, + {X: Field{[10]uint32{0x00223465, 0x016dba35, 0x00d5063c, 0x01f6c8ef, 0x0244b715, 0x0309153c, 0x004c482e, 0x0080ec78, 0x02483a49, 0x00142b92}}, Y: Field{[10]uint32{0x015f3008, 0x02e8df9f, 0x0065836d, 0x00a170d9, 0x010a6190, 0x0160ef69, 0x032031ec, 0x00b87d97, 0x03d7e7bd, 0x00386e33}}}, + {X: Field{[10]uint32{0x016b72d6, 0x010657d8, 0x039dba69, 0x012fb49b, 0x03c5d8bb, 0x0086b39d, 0x02dde15b, 0x01422467, 0x02316039, 0x0037ddec}}, Y: Field{[10]uint32{0x034344a4, 0x03254022, 0x0303717d, 0x0032ccfc, 0x00c99e27, 0x019cd997, 0x00cff822, 0x02fef2e2, 0x01b89ece, 0x002292dd}}}, + {X: Field{[10]uint32{0x0233277d, 0x02c2e3bc, 0x01345437, 0x02358ecb, 0x016d2d23, 0x0009d01d, 0x00419d67, 0x00bc62dd, 0x0219978e, 0x003b1b03}}, Y: Field{[10]uint32{0x0236e553, 0x018fc2c9, 0x02d8a4a3, 0x01a05cf3, 0x0296bd39, 0x016ff931, 0x0171dc13, 0x03133189, 0x039a02df, 0x003e436a}}}, + {X: Field{[10]uint32{0x017b3329, 0x00640458, 0x03e4ba46, 0x0215214a, 0x005af2a8, 0x029c8886, 0x014eacb1, 0x03f39a9b, 0x016f90e7, 0x000a1d10}}, Y: Field{[10]uint32{0x02eb4466, 0x0374997a, 0x0282d448, 0x01256d36, 0x03b8628e, 0x0244ab5f, 0x024c9af7, 0x0359222e, 0x0275f6ce, 0x0007cc8d}}}, + {X: Field{[10]uint32{0x00ff4247, 0x02b3cfdc, 0x01d2be7d, 0x032e25f2, 0x02529de5, 0x00edb74f, 0x0087f3e8, 0x00ea03e3, 0x03ec586d, 0x0021c8d9}}, Y: Field{[10]uint32{0x02a3ac05, 0x01a144a9, 0x02eeceef, 0x032792d8, 0x017dc571, 0x0109f802, 0x00768b5e, 0x0210ede2, 0x00e0fae0, 0x00396ed8}}}, + {X: Field{[10]uint32{0x024713cc, 0x02368f90, 0x01f4891b, 0x02c84efc, 0x004339a0, 0x00312bcd, 0x0030ce94, 0x03f4c2b9, 0x00040baf, 0x003043c8}}, Y: Field{[10]uint32{0x0231c7ee, 0x00dfef61, 0x02e59c35, 0x01e58d0f, 0x03bf6dbf, 0x00fe0bb7, 0x006d456b, 0x026cdb15, 0x0055f0c3, 0x000defa4}}}, + {X: Field{[10]uint32{0x00d847c5, 0x01b7651c, 0x0059da35, 0x02cee4ef, 0x00733b8b, 0x00cd4fa0, 0x01f0f150, 0x00c015af, 0x02e191c8, 0x0005384b}}, Y: Field{[10]uint32{0x03efcfb2, 0x01438ea6, 0x020dab15, 0x00c80634, 0x01d487f0, 0x019b5c91, 0x0332ba7c, 0x005e044a, 0x038ee00c, 0x003a5c1e}}}, + {X: Field{[10]uint32{0x009fdf36, 0x01e08f12, 0x003057b5, 0x02d2ba01, 0x003687ea, 0x02b414f9, 0x00dd89f6, 0x00de774b, 0x021e2583, 0x0036b0ee}}, Y: Field{[10]uint32{0x03e2c041, 0x011d171b, 0x03fa4761, 0x010bf4de, 0x02d13a69, 0x00b47b13, 0x0020ab1c, 0x00546557, 0x024d8821, 0x001178f6}}}, + {X: Field{[10]uint32{0x03800bf4, 0x01373faf, 0x00b09264, 0x02eff74b, 0x00a2507d, 0x000e968b, 0x039fad0b, 0x021abba1, 0x027a05c0, 0x00366ff1}}, Y: Field{[10]uint32{0x02be6730, 0x00518d00, 0x02ca42fc, 0x023ac8f9, 0x02e5bb4e, 0x024d243d, 0x036c8b1e, 0x03d6f454, 0x014b5a39, 0x00380577}}}, + {X: Field{[10]uint32{0x0196c61e, 0x01861cde, 0x00b34007, 0x00704bdb, 0x028a9a98, 0x03659660, 0x00d7e581, 0x03283c5c, 0x00522f04, 0x00379bcd}}, Y: Field{[10]uint32{0x032a0cc7, 0x00153bbd, 0x00e3b826, 0x0053fc09, 0x012fc6d8, 0x00d3857c, 0x039c251f, 0x013ea50e, 0x033b28d7, 0x0007b05b}}}, + {X: Field{[10]uint32{0x00e30eaf, 0x02fe0a28, 0x00d93f54, 0x00e93ea3, 0x02b35c87, 0x00d94a0f, 0x00a15ef2, 0x005eba21, 0x0355338e, 0x0010caac}}, Y: Field{[10]uint32{0x01447807, 0x00f73fe5, 0x02b9e870, 0x0029f61a, 0x01caa9af, 0x00830429, 0x023e0767, 0x0036fc22, 0x02a10a13, 0x003d5819}}}, + {X: Field{[10]uint32{0x037c4d99, 0x0102359f, 0x02afa35a, 0x0036d6fa, 0x008d9699, 0x02550c75, 0x010f546d, 0x009f0e8d, 0x0107cfa1, 0x000f4b8d}}, Y: Field{[10]uint32{0x035f74f2, 0x015564e8, 0x02ac51b2, 0x0020aef4, 0x017f4a05, 0x003e288d, 0x01655cab, 0x030dcc51, 0x005f4711, 0x00369822}}}, + {X: Field{[10]uint32{0x00ba87ef, 0x01b94609, 0x0183f457, 0x03180646, 0x03f781c7, 0x017cedc6, 0x0029d0a5, 0x0352f8df, 0x031cb96d, 0x001fcfd0}}, Y: Field{[10]uint32{0x00b8bfec, 0x032009d8, 0x021c1695, 0x03093a45, 0x02cfdb08, 0x01c5dee5, 0x00259f6f, 0x034930ae, 0x03457649, 0x003d37d0}}}, + {X: Field{[10]uint32{0x03687143, 0x00129fcb, 0x017163d6, 0x0357c4a3, 0x026f7b67, 0x015639ab, 0x036cdd8b, 0x01c00112, 0x0359f2c8, 0x00109c2f}}, Y: Field{[10]uint32{0x01a99315, 0x023aaf53, 0x0174e0d0, 0x0037b494, 0x006c4a18, 0x01689549, 0x025da0a1, 0x03e465a1, 0x00ef2e8f, 0x00000d63}}}, + {X: Field{[10]uint32{0x03603852, 0x0256e31f, 0x02ebd46f, 0x02ac3af8, 0x01b7931c, 0x0147194e, 0x013af50d, 0x03f27104, 0x022b9930, 0x003198dc}}, Y: Field{[10]uint32{0x025ecfab, 0x01c237a4, 0x0313f719, 0x0231e3e3, 0x020b9476, 0x00f292cc, 0x0132a310, 0x008f63ad, 0x03b32cdf, 0x000d10f9}}}, + {X: Field{[10]uint32{0x006c4e14, 0x023c58b2, 0x0214f21f, 0x03ce56b9, 0x010168e8, 0x019b95fe, 0x03d7b65c, 0x03fc0b3a, 0x0064e396, 0x002c0052}}, Y: Field{[10]uint32{0x002eb876, 0x02f92e86, 0x0272cb7d, 0x027a8381, 0x004a80b6, 0x02d4048c, 0x025007da, 0x02537bb9, 0x01d7e2ec, 0x000fdb26}}}, + {X: Field{[10]uint32{0x0284f41a, 0x00310436, 0x03b2e125, 0x03d34919, 0x03c2d735, 0x032e0b90, 0x03329f0c, 0x02768d74, 0x019398fe, 0x00193273}}, Y: Field{[10]uint32{0x024372e9, 0x02544555, 0x0105ec8d, 0x01e3fd42, 0x01c223ef, 0x033b7c12, 0x0206fc6d, 0x0180cf44, 0x00ab71bf, 0x003492d4}}}, + {X: Field{[10]uint32{0x0129b766, 0x03f676f3, 0x02736ab4, 0x03533cc9, 0x00ecccfa, 0x009f6e58, 0x0359706b, 0x0161893d, 0x001d51e0, 0x003ff821}}, Y: Field{[10]uint32{0x01cf2562, 0x001d245e, 0x00a0177c, 0x0244c2cd, 0x03eb5d83, 0x01360193, 0x02c15952, 0x01b0413f, 0x01c9f695, 0x001af47c}}}, + {X: Field{[10]uint32{0x03ca7432, 0x034fe6dd, 0x020fa47f, 0x01873c3c, 0x034b4518, 0x03103479, 0x0138d630, 0x03165eeb, 0x00c0c053, 0x00034774}}, Y: Field{[10]uint32{0x0055976f, 0x0288ef5b, 0x0103280b, 0x02b77a4a, 0x035c9dc5, 0x02aabd9a, 0x03b5628d, 0x0257c0f9, 0x03fdb594, 0x000d2aa5}}}, + {X: Field{[10]uint32{0x028e5779, 0x03b2916b, 0x01d8df99, 0x00106c61, 0x019153f7, 0x03e65bc7, 0x0249cd3a, 0x035fde8f, 0x02e8c76b, 0x0021e90d}}, Y: Field{[10]uint32{0x011006f3, 0x02f9e5fc, 0x02027b6d, 0x03fdaa26, 0x00369ea4, 0x0287f0db, 0x0105d5b2, 0x00e113fe, 0x03f91255, 0x00234b3c}}}, + {X: Field{[10]uint32{0x0327c379, 0x03a7b2f7, 0x016e4b59, 0x0037354e, 0x00180107, 0x023f58bb, 0x00f707da, 0x031100e1, 0x00a74899, 0x00295140}}, Y: Field{[10]uint32{0x03cb2668, 0x00d15c8c, 0x02cae2f3, 0x00fc4768, 0x005315df, 0x00b249fe, 0x035b5e57, 0x02ec1817, 0x004a6d26, 0x00388591}}}, + {X: Field{[10]uint32{0x03d8187b, 0x02f54695, 0x00a9c88f, 0x01c821a4, 0x0328417b, 0x012358c8, 0x01aea85b, 0x0067d3e9, 0x00f799a3, 0x0024dfa9}}, Y: Field{[10]uint32{0x03dc9d9d, 0x03215533, 0x027bbb24, 0x036a9f4f, 0x00fce77b, 0x00510e2b, 0x01ce4afd, 0x02bb22df, 0x03fc9eb4, 0x000a4c69}}}, + {X: Field{[10]uint32{0x03fa6f36, 0x02c1766d, 0x03f07a1e, 0x018e3525, 0x02c70608, 0x02c13fc9, 0x00dbc96c, 0x012a8c81, 0x0076bb91, 0x00141e4f}}, Y: Field{[10]uint32{0x00bdab21, 0x00ff59c1, 0x03fbdeb1, 0x000daec7, 0x03d963b6, 0x0077a7bc, 0x00940df4, 0x001d8ada, 0x0078b5e3, 0x002beabf}}}, + {X: Field{[10]uint32{0x02d8bb5a, 0x025d9bc1, 0x01bf13a2, 0x02098755, 0x01f8da52, 0x02ff86b5, 0x011c5709, 0x03959373, 0x0230fada, 0x0022d801}}, Y: Field{[10]uint32{0x032916c0, 0x0108481a, 0x01f4dc11, 0x026e7080, 0x01788538, 0x0164dd30, 0x005a7c38, 0x010e6bb1, 0x024a3bd0, 0x003efc6d}}}, + {X: Field{[10]uint32{0x038c8458, 0x03cf40b9, 0x027bd635, 0x010c8ac5, 0x021fc616, 0x03ff062e, 0x03c96500, 0x0057b68d, 0x03dde32a, 0x00053a22}}, Y: Field{[10]uint32{0x036f02c9, 0x007bfa65, 0x009d735b, 0x004dd809, 0x035cc2cd, 0x01d6bf82, 0x02355be4, 0x003ea97e, 0x02c3dc24, 0x00020b07}}}, + {X: Field{[10]uint32{0x011c6c06, 0x00bf3d26, 0x00a30a91, 0x024bbf1c, 0x01975a3d, 0x031e2c72, 0x013dc028, 0x0211cb51, 0x00a324b6, 0x00308079}}, Y: Field{[10]uint32{0x00e2dc08, 0x01a7a73c, 0x00cee624, 0x02334e37, 0x02a82f5f, 0x031e1a84, 0x03f3e503, 0x039b423a, 0x015441d6, 0x000098ea}}}, + {X: Field{[10]uint32{0x019db4fb, 0x03443b82, 0x035a70c5, 0x00b9846c, 0x01409418, 0x0060a337, 0x0061b1e1, 0x022cfdc6, 0x025d319a, 0x001025d9}}, Y: Field{[10]uint32{0x027a506a, 0x02dc3540, 0x027a85dc, 0x0255415c, 0x03322a6b, 0x01bffb80, 0x02cd1ef5, 0x00ac7d5d, 0x00ebb1aa, 0x0032835f}}}, + {X: Field{[10]uint32{0x0027fa92, 0x03aad26d, 0x037a445d, 0x007cde94, 0x01371334, 0x02f814b6, 0x02021a04, 0x00a4fb74, 0x007aeff9, 0x0005cf4a}}, Y: Field{[10]uint32{0x02432548, 0x02691b05, 0x00e541fb, 0x00b34fe7, 0x0172e530, 0x015c9519, 0x03c37b58, 0x00621b09, 0x0204f03a, 0x002589b8}}}, + {X: Field{[10]uint32{0x014d4256, 0x0086911a, 0x039e78f1, 0x031a3c7c, 0x01227fb8, 0x0098a6fb, 0x014b03c9, 0x00453cc3, 0x034d001b, 0x003248f1}}, Y: Field{[10]uint32{0x035b3d29, 0x004d1016, 0x002731f4, 0x000f62b5, 0x00c9f918, 0x03c089e2, 0x00d1e08e, 0x004e0842, 0x026bdd5e, 0x00163b6f}}}, + {X: Field{[10]uint32{0x00b92d46, 0x0312adc3, 0x01a57c88, 0x02f9b2e4, 0x0393e5a8, 0x025b3cc7, 0x03104c51, 0x0170b4f7, 0x0106b1f2, 0x0024be9e}}, Y: Field{[10]uint32{0x0087f307, 0x0185d472, 0x0024079a, 0x017b3962, 0x00ae99a7, 0x02f34367, 0x0374db62, 0x007f07a3, 0x02bd7934, 0x00284858}}}, + {X: Field{[10]uint32{0x00639140, 0x02a8f102, 0x0294c691, 0x024412ba, 0x00976a9c, 0x034c3577, 0x008e17ee, 0x01e30aa7, 0x01f6f51f, 0x000dd1df}}, Y: Field{[10]uint32{0x00089872, 0x0357f0aa, 0x037305c2, 0x019bd419, 0x0325c3da, 0x0142c114, 0x006e15de, 0x0195b193, 0x02ed1955, 0x001a9a89}}}, + {X: Field{[10]uint32{0x010521bf, 0x03682637, 0x0359667a, 0x0090db17, 0x00be9bc7, 0x02fc03ec, 0x034e78ca, 0x03ce37e0, 0x02591195, 0x002d6cbb}}, Y: Field{[10]uint32{0x01ddd5e4, 0x01c1b885, 0x03e44314, 0x02c03f63, 0x00cc8bae, 0x0146afa4, 0x01d276d9, 0x00c0211b, 0x03859523, 0x00043cdb}}}, + {X: Field{[10]uint32{0x02a137bb, 0x0116c0f4, 0x03630948, 0x00d5dbb2, 0x02560393, 0x034c1fbc, 0x02415e90, 0x006ff8da, 0x01b8443f, 0x0002c174}}, Y: Field{[10]uint32{0x01066cbc, 0x01fc189f, 0x02f6465f, 0x01200f87, 0x0054098f, 0x03c358fe, 0x002a4156, 0x002cb0c4, 0x024bddc9, 0x00267fb3}}}, + {X: Field{[10]uint32{0x01d918fd, 0x01aba281, 0x03179de7, 0x0219b342, 0x03d69dcd, 0x025496d6, 0x03d703ae, 0x02cef73b, 0x01bd4778, 0x003975c4}}, Y: Field{[10]uint32{0x01b64248, 0x0070d71b, 0x01327542, 0x0092bce2, 0x009685d5, 0x03fbd5a4, 0x0088e218, 0x016ca683, 0x00ae5aa0, 0x0022bc05}}}, + {X: Field{[10]uint32{0x02fa4f30, 0x007de1a1, 0x03eb9f4f, 0x00471092, 0x001e217d, 0x0344de66, 0x031c6fc4, 0x0120beff, 0x02b8377a, 0x001dc0f2}}, Y: Field{[10]uint32{0x0084e8b3, 0x000d5c7a, 0x03f0a8e9, 0x03b5082b, 0x008dd329, 0x015a324b, 0x02247fd5, 0x02e36f1f, 0x01d13c80, 0x000cc8fb}}}, + {X: Field{[10]uint32{0x014f3cc8, 0x017d8985, 0x03085540, 0x00b3052c, 0x032c87da, 0x00a910d5, 0x02cf7225, 0x02d220d9, 0x0329c18b, 0x003e0d2b}}, Y: Field{[10]uint32{0x015ab248, 0x0007fb6f, 0x015c2820, 0x0311c5d8, 0x026bd8f7, 0x03f56f31, 0x027dc094, 0x01068a78, 0x02c0ca54, 0x000ba282}}}, + {X: Field{[10]uint32{0x03bbaee0, 0x01d0cd92, 0x03a794c7, 0x01f40740, 0x0213bbcd, 0x007614ab, 0x038ee845, 0x00f18076, 0x013d13f3, 0x001e0ec2}}, Y: Field{[10]uint32{0x00ae5b4b, 0x0326e09d, 0x001ab66e, 0x031c105c, 0x036b5fb1, 0x03b0b3be, 0x00dbfb20, 0x01aaffe8, 0x0301cfde, 0x000eaa42}}}, + {X: Field{[10]uint32{0x001c3391, 0x00b69678, 0x022666f9, 0x02087062, 0x033ae42e, 0x023bcb1d, 0x00a243b4, 0x002e6405, 0x0035a777, 0x002f8f31}}, Y: Field{[10]uint32{0x00e4a701, 0x02a49d97, 0x01c51e6a, 0x00149775, 0x00a560f7, 0x0187af16, 0x01fc64de, 0x02316056, 0x01360911, 0x003c34ef}}}, + {X: Field{[10]uint32{0x003b606d, 0x0024a15e, 0x02a08fc9, 0x001a115d, 0x0197f89e, 0x03fb86b8, 0x03624545, 0x0003bbf8, 0x03d7adac, 0x000fa602}}, Y: Field{[10]uint32{0x01c5c228, 0x00ccffba, 0x0088a34d, 0x00c14ff5, 0x0367455e, 0x03824451, 0x00734347, 0x0251b1d1, 0x0241204c, 0x003193c3}}}, + {X: Field{[10]uint32{0x0182b442, 0x02f3ecb5, 0x027c335b, 0x01517757, 0x0291d7b1, 0x025e435c, 0x0159bf12, 0x0079a8d2, 0x0140aa62, 0x0029ac10}}, Y: Field{[10]uint32{0x03cce830, 0x00705a6a, 0x0137f804, 0x0363b90b, 0x03a997f8, 0x010abdb9, 0x021d1515, 0x01765d79, 0x01e29cc0, 0x00272cb2}}}, + {X: Field{[10]uint32{0x03fa721b, 0x02038a91, 0x002e51f2, 0x00b4888e, 0x0229ba43, 0x00a6cb0e, 0x009a6a1b, 0x032e3e84, 0x003fc133, 0x001fa9ea}}, Y: Field{[10]uint32{0x0299d7e8, 0x01f763a9, 0x031b45bb, 0x01d78e15, 0x026aabab, 0x03450c29, 0x01c5562a, 0x01dcc60c, 0x00e88a1f, 0x0032f8e1}}}, + {X: Field{[10]uint32{0x010fa042, 0x00ab2982, 0x026c8d84, 0x03b851aa, 0x008189f9, 0x0052e9b5, 0x002b5fca, 0x027af8be, 0x007ef0fc, 0x0021497a}}, Y: Field{[10]uint32{0x0332c86f, 0x01c39d5a, 0x022a686c, 0x0391f7f8, 0x00192873, 0x028d295c, 0x02a393f2, 0x028f3c60, 0x0278f311, 0x00373c1a}}}, + {X: Field{[10]uint32{0x03d56dce, 0x029ed06e, 0x00fc0952, 0x03cdb341, 0x0316daff, 0x0197fa59, 0x0129c337, 0x0034327b, 0x037dfa05, 0x001d5569}}, Y: Field{[10]uint32{0x03152177, 0x035bc7c5, 0x019cfd0b, 0x024a0c1a, 0x0118dc03, 0x002bcc44, 0x03d0a3cd, 0x03707f62, 0x00a7bdc3, 0x00261530}}}, + {X: Field{[10]uint32{0x02ac296b, 0x03b85f66, 0x02f710be, 0x02eefb98, 0x00972bb3, 0x00cf8031, 0x026f0261, 0x036b0453, 0x02a07a0a, 0x0027b450}}, Y: Field{[10]uint32{0x037a9d08, 0x0142880a, 0x03f6a391, 0x02144709, 0x009f4dca, 0x01a66bd4, 0x00d4006f, 0x038ee349, 0x02416c80, 0x00307aba}}}, + {X: Field{[10]uint32{0x03c56b79, 0x00ec6a37, 0x029d5fb1, 0x0310b805, 0x00c9d761, 0x00463f60, 0x02aa67c8, 0x02333424, 0x00b3784d, 0x0028ff4b}}, Y: Field{[10]uint32{0x007ea755, 0x02ff56fe, 0x01f6d659, 0x03c9e827, 0x02b0d13d, 0x03243562, 0x00fcdd48, 0x0157cb54, 0x034155db, 0x001d7366}}}, + {X: Field{[10]uint32{0x005ad251, 0x014880d8, 0x0142fc99, 0x038a2edb, 0x01554338, 0x02703884, 0x01ad598b, 0x01fba1e6, 0x0205217e, 0x000aad2f}}, Y: Field{[10]uint32{0x0076d853, 0x03d78c55, 0x01dc7bd8, 0x0320f231, 0x03b788af, 0x00f8791e, 0x008c8eb8, 0x01b529ff, 0x0258da06, 0x000b0a86}}}, + {X: Field{[10]uint32{0x0248c383, 0x02959ee1, 0x033592ce, 0x002767e3, 0x0308c95d, 0x019bb33a, 0x02268af5, 0x006ababd, 0x0088af8c, 0x0012bf0a}}, Y: Field{[10]uint32{0x004f5eed, 0x0164cdaa, 0x0005458b, 0x012f8778, 0x03cf3f28, 0x03a671fa, 0x01025797, 0x03a4ba62, 0x03825e69, 0x002c789a}}}, + {X: Field{[10]uint32{0x018e3d4a, 0x00086d4b, 0x0188b548, 0x03236bf6, 0x02f63f5f, 0x02b070ac, 0x0038600a, 0x0274b920, 0x03aa9231, 0x00376003}}, Y: Field{[10]uint32{0x0039ed7d, 0x006a5dc4, 0x0260ce8e, 0x024853fb, 0x028fdbc1, 0x006206f1, 0x02522ac9, 0x01a35d83, 0x00926e04, 0x00167fa0}}}, + {X: Field{[10]uint32{0x02378c91, 0x029d3cf1, 0x017e2af5, 0x0209b7e7, 0x0007bb51, 0x02bec1fe, 0x039bc886, 0x0297e226, 0x03d1daa3, 0x00212abc}}, Y: Field{[10]uint32{0x0035afbb, 0x030a920e, 0x030e8011, 0x021add13, 0x03a04fd5, 0x0333825a, 0x0331218e, 0x0375be98, 0x02b845ea, 0x003d0592}}}, + {X: Field{[10]uint32{0x03c40b2b, 0x02b4ea09, 0x02fcc8ad, 0x0202e233, 0x00d2ffc1, 0x037feda4, 0x02823a3a, 0x0276e2a4, 0x02c39e2e, 0x002ddc3c}}, Y: Field{[10]uint32{0x000d53e6, 0x01667a37, 0x0122e79f, 0x025f29b3, 0x037e319c, 0x01ba9593, 0x01b90a91, 0x01260974, 0x02370989, 0x0003df1b}}}, + {X: Field{[10]uint32{0x02bb2b29, 0x00879fae, 0x0336236a, 0x021c924f, 0x017cb1db, 0x02c41f32, 0x0145c5fb, 0x039559c0, 0x00a8a0d7, 0x00298182}}, Y: Field{[10]uint32{0x0354de5f, 0x009715de, 0x00e1906f, 0x007ed603, 0x01a289c9, 0x03528e06, 0x0006f906, 0x01152259, 0x027c4e41, 0x000d08d4}}}, + {X: Field{[10]uint32{0x03414597, 0x02d926d4, 0x032d921e, 0x03dff2af, 0x0320f6b0, 0x0324469c, 0x02b4e5fc, 0x00e4e979, 0x00f97b7f, 0x00203d1c}}, Y: Field{[10]uint32{0x03d9adc3, 0x033a7c4a, 0x03e4afa1, 0x01392d6d, 0x03770fa1, 0x004f0fce, 0x028faea0, 0x02f8304c, 0x02f96e1b, 0x0015f63c}}}, + {X: Field{[10]uint32{0x015abb6f, 0x032ccea6, 0x017fe261, 0x036c7c0e, 0x0072e4a3, 0x01929ed6, 0x03f0096c, 0x012330ff, 0x03f21f52, 0x00138446}}, Y: Field{[10]uint32{0x02eb2b9f, 0x02b2eda5, 0x02b0f6d5, 0x0050c7ea, 0x00c03af6, 0x0182f64c, 0x01829c1d, 0x00cefd7f, 0x01721027, 0x0009273c}}}, + {X: Field{[10]uint32{0x022844c9, 0x005b1a31, 0x034f0184, 0x0037ce05, 0x00960cb7, 0x0083a17b, 0x0254660a, 0x00763040, 0x00b547fa, 0x001f6303}}, Y: Field{[10]uint32{0x0335a271, 0x00015c57, 0x00743404, 0x02b87daf, 0x0372b0f1, 0x00d633f4, 0x017335bf, 0x0135e685, 0x023c17ec, 0x000b5e6e}}}, + {X: Field{[10]uint32{0x030a0034, 0x00aabe59, 0x013aaf61, 0x02e26d65, 0x0014b132, 0x016a7cbc, 0x023d48fa, 0x01be95fc, 0x00bd9589, 0x002f0353}}, Y: Field{[10]uint32{0x03a0639d, 0x0283d20b, 0x01412480, 0x00fca3a9, 0x0383d756, 0x015dcef2, 0x02410915, 0x019605e9, 0x02707b31, 0x003d7419}}}, + {X: Field{[10]uint32{0x02d37a40, 0x039c3ead, 0x006a42df, 0x029a9f99, 0x015cceb0, 0x024c8785, 0x02ddbe1c, 0x03445657, 0x02aead08, 0x002c5528}}, Y: Field{[10]uint32{0x0216592a, 0x01794fcc, 0x00756c8b, 0x0234278f, 0x0217120d, 0x0257225b, 0x01e586f6, 0x0344af40, 0x0221674d, 0x0026aeb7}}}, + {X: Field{[10]uint32{0x0372e1e4, 0x01729615, 0x03325531, 0x0159f91d, 0x02314be7, 0x0107f8b9, 0x013bc318, 0x001bc9c1, 0x0034a6ce, 0x003bd80f}}, Y: Field{[10]uint32{0x009ad65d, 0x02b965f1, 0x00f5164a, 0x023cef42, 0x0115fced, 0x0206688c, 0x03a7e57d, 0x02c2e648, 0x022896f3, 0x003e7aef}}}, + {X: Field{[10]uint32{0x02aa9376, 0x0388ffa0, 0x016e2c04, 0x03686b12, 0x01014f7b, 0x02b70010, 0x01a05d91, 0x007aeeb5, 0x036c2d90, 0x00298045}}, Y: Field{[10]uint32{0x02e88ab8, 0x0228c0c6, 0x01e68f8c, 0x03e74fab, 0x03d59abc, 0x03a450dd, 0x032fb849, 0x00d924dd, 0x01b7ce0c, 0x003de077}}}, + {X: Field{[10]uint32{0x0031e6a7, 0x00c54e57, 0x007eb273, 0x03bcea40, 0x03b1c7f0, 0x0326a409, 0x03968b9b, 0x00413bea, 0x0147b6b3, 0x002af105}}, Y: Field{[10]uint32{0x017e0ec9, 0x02e28df6, 0x00dce879, 0x034d498a, 0x03594c5b, 0x035e0e66, 0x00a1821d, 0x0075bef6, 0x00a228f2, 0x00334a16}}}, + {X: Field{[10]uint32{0x007f5a81, 0x038e85f6, 0x008a92f2, 0x029b4c6d, 0x02941d1d, 0x009b904e, 0x024c4300, 0x031c86cb, 0x010500c9, 0x0024a240}}, Y: Field{[10]uint32{0x0260a5da, 0x025fca36, 0x03e2bb30, 0x02669f2f, 0x0015c223, 0x004ed1f1, 0x0032e17c, 0x03185c79, 0x007b1bdc, 0x003072b6}}}, + {X: Field{[10]uint32{0x037ca563, 0x01129f70, 0x00228ad1, 0x0201af59, 0x00500a7a, 0x0251da43, 0x02468319, 0x00d7291a, 0x02a69f4b, 0x00394837}}, Y: Field{[10]uint32{0x022a82de, 0x02c34f22, 0x03356638, 0x002b6d9c, 0x01e2330b, 0x02b538b6, 0x0355dda6, 0x023efa40, 0x0366ac3f, 0x001b0035}}}, + {X: Field{[10]uint32{0x017fadc4, 0x00b5c071, 0x03fb3750, 0x005463c3, 0x02ac2e93, 0x035bbc97, 0x03d18a79, 0x03c70695, 0x0223e2b3, 0x00300cde}}, Y: Field{[10]uint32{0x00808b65, 0x00851bd4, 0x021eccdd, 0x00e3db81, 0x017ac7e9, 0x001e95c3, 0x029c3d5b, 0x037cd51c, 0x0073be22, 0x003f3a96}}}, + {X: Field{[10]uint32{0x0181ac04, 0x0049e6ca, 0x0193cfa5, 0x02583d4d, 0x001b796a, 0x00b47589, 0x01fb6a76, 0x00b01dad, 0x02bb6a8e, 0x0009db18}}, Y: Field{[10]uint32{0x021afc1a, 0x00ba85db, 0x0292b73e, 0x01e0223d, 0x00773c45, 0x01a588db, 0x01284d7d, 0x000748fe, 0x025abb6b, 0x001714e9}}}, + {X: Field{[10]uint32{0x01663a5f, 0x00776fa3, 0x01ed4fad, 0x01bd9ea7, 0x00c4a2de, 0x00f23b79, 0x037ccdd4, 0x00770ae0, 0x0287e505, 0x00181387}}, Y: Field{[10]uint32{0x03429bee, 0x001ac9e2, 0x0034902d, 0x01ce670d, 0x02ace4c4, 0x01113618, 0x014d6759, 0x0065ce4f, 0x023ce351, 0x003dc3f8}}}, + {X: Field{[10]uint32{0x0041f6fa, 0x038e21d7, 0x00eec3b6, 0x02bbdf93, 0x024aba16, 0x03a40e6e, 0x00b05be5, 0x02441b56, 0x011f470d, 0x003cbf05}}, Y: Field{[10]uint32{0x01e98de0, 0x02a485b8, 0x037b85d2, 0x01ce705a, 0x00d41887, 0x001da418, 0x027f2d6e, 0x01718f63, 0x02c7f1aa, 0x003d26f4}}}, + {X: Field{[10]uint32{0x000ac560, 0x0240b84d, 0x00315eb0, 0x025359ac, 0x007ee0b2, 0x0391babe, 0x001d9cd7, 0x00d3bcee, 0x03460e9f, 0x002380c4}}, Y: Field{[10]uint32{0x00394296, 0x00517e4b, 0x00dca450, 0x023003b0, 0x02006b02, 0x03b81413, 0x027441c0, 0x00787944, 0x00bda5e2, 0x003fc032}}}, + {X: Field{[10]uint32{0x01a9970b, 0x027d03f9, 0x01a0a96b, 0x02cea174, 0x03d4e26e, 0x02ca553a, 0x021cbe16, 0x01ea3c9e, 0x031ad75b, 0x002a1a03}}, Y: Field{[10]uint32{0x02070c01, 0x0065cef9, 0x024c6950, 0x02fb10a5, 0x02757401, 0x00fd4a25, 0x03281f2a, 0x036b18e5, 0x0341a55b, 0x001831af}}}, + {X: Field{[10]uint32{0x004f4658, 0x039b1bd4, 0x03066128, 0x00035372, 0x0009ca8c, 0x002171e5, 0x03407c05, 0x00ba8780, 0x01e7f4d8, 0x00135a28}}, Y: Field{[10]uint32{0x03d1ce76, 0x009979e8, 0x02af4d36, 0x0028e99c, 0x0126a955, 0x030db75b, 0x0295d2d2, 0x00da44aa, 0x0211e5dd, 0x00217177}}}, + {X: Field{[10]uint32{0x02c2a7a9, 0x02882bb9, 0x024835c6, 0x0306b9e2, 0x01758c0b, 0x0340bace, 0x003cdc1b, 0x021925a6, 0x001c2a6d, 0x000dc23d}}, Y: Field{[10]uint32{0x03ec4152, 0x014febea, 0x039e7f45, 0x01171c2b, 0x023c2b71, 0x02aac64f, 0x01ae0f87, 0x03d77572, 0x019e79b7, 0x000c42de}}}, + {X: Field{[10]uint32{0x0115f059, 0x038de028, 0x01a92f6c, 0x0334eaec, 0x022d1a18, 0x00fd6dcc, 0x03961814, 0x02317fc6, 0x01674502, 0x0023220e}}, Y: Field{[10]uint32{0x020725d8, 0x0229f9d8, 0x00e10b00, 0x01097237, 0x0040128e, 0x019b761f, 0x03441800, 0x01212830, 0x02d4e4ae, 0x0009158e}}}, + {X: Field{[10]uint32{0x018f8fb0, 0x0387fd35, 0x0305d0a0, 0x03098d08, 0x03652e83, 0x0129c98e, 0x010fd1a9, 0x01eb4ef7, 0x036a7b37, 0x00311179}}, Y: Field{[10]uint32{0x03acc89d, 0x033a9872, 0x01b8cc94, 0x039c8c19, 0x02f60ae2, 0x02ab9f71, 0x03bd3c13, 0x036d84eb, 0x001adc8d, 0x0012fd69}}}, + {X: Field{[10]uint32{0x02419f16, 0x03d976a3, 0x02e8deb2, 0x017bb6ab, 0x0236949d, 0x0292e7f5, 0x019f1d4d, 0x00d7f983, 0x013ac8a6, 0x0012b658}}, Y: Field{[10]uint32{0x00b0d7c4, 0x02d2545a, 0x0331642a, 0x01ded2c1, 0x01387458, 0x03c6a06e, 0x0131c83e, 0x0283eceb, 0x03068f67, 0x0016a6d6}}}, + {X: Field{[10]uint32{0x0360c943, 0x0074a7f5, 0x00b0c20d, 0x02f163a4, 0x022e397f, 0x0122a998, 0x0349d776, 0x03f9b26a, 0x02e1958b, 0x002facfa}}, Y: Field{[10]uint32{0x0382c9b8, 0x03bfe200, 0x02678dba, 0x01edaa08, 0x03ec76f2, 0x02a9a36b, 0x01dc6fb5, 0x019eac89, 0x02bef43a, 0x00035691}}}, + {X: Field{[10]uint32{0x0134f397, 0x026867f4, 0x018ab9df, 0x0050f900, 0x034623fc, 0x035281da, 0x03f1daea, 0x0086cef8, 0x02b0bc0e, 0x002aaa6a}}, Y: Field{[10]uint32{0x0342e40b, 0x01c0ee89, 0x0390ed3c, 0x03e2ead9, 0x02d3f094, 0x03e8b6b4, 0x000347e8, 0x00b1969b, 0x03fe1964, 0x000271f5}}}, + {X: Field{[10]uint32{0x0199dc52, 0x035a956b, 0x01356604, 0x01867f57, 0x00d40116, 0x0073e749, 0x017ae86f, 0x03d118bf, 0x028999d6, 0x00154f07}}, Y: Field{[10]uint32{0x0150cebc, 0x002f5bfd, 0x004ed646, 0x0250de4d, 0x013f6fe4, 0x01f17c37, 0x02ba776f, 0x02b169b4, 0x013b8410, 0x0009ad03}}}, + {X: Field{[10]uint32{0x02a1abc8, 0x03afe096, 0x0128ab47, 0x0025567b, 0x00c3d565, 0x01c97581, 0x00dae9c4, 0x023f10e6, 0x01ea3637, 0x00216621}}, Y: Field{[10]uint32{0x000687f5, 0x00c7f3fc, 0x030669e5, 0x02a8f102, 0x020e6e84, 0x02cb458d, 0x02fd9305, 0x02e58eec, 0x02f9fc74, 0x003eb96b}}}, + {X: Field{[10]uint32{0x00368f93, 0x01ef7bbc, 0x0254b0bb, 0x00ca9c31, 0x0189e510, 0x00ee08d1, 0x00bf7c16, 0x01752155, 0x0118679c, 0x0017ec28}}, Y: Field{[10]uint32{0x03c2a2d0, 0x03c6099a, 0x00c70a4c, 0x02b4e765, 0x005b9966, 0x02e5761a, 0x0302111e, 0x005b4efe, 0x01f04a68, 0x0003a355}}}, + {X: Field{[10]uint32{0x00f91dfa, 0x02fa0be5, 0x00302194, 0x0175df39, 0x02bbed44, 0x039c376b, 0x03d737c1, 0x03854f26, 0x034786f3, 0x00029090}}, Y: Field{[10]uint32{0x03beed46, 0x00595239, 0x02496971, 0x02963b04, 0x01a54239, 0x0096da7f, 0x0012f4df, 0x03f6a704, 0x02d6abd9, 0x0009f472}}}, + {X: Field{[10]uint32{0x00c821e7, 0x006e4868, 0x003eef57, 0x0115cac2, 0x00394659, 0x01ca4c43, 0x028213cc, 0x0307ce82, 0x0108063f, 0x0017401d}}, Y: Field{[10]uint32{0x02b2df3a, 0x00744aff, 0x007f939f, 0x0205ac10, 0x02d99bfa, 0x0048e121, 0x00c26056, 0x01681ecb, 0x03c45d05, 0x00394e3e}}}, + {X: Field{[10]uint32{0x002e3db9, 0x00bd7a0a, 0x02a525f8, 0x02a9c737, 0x01e80393, 0x012aadfe, 0x00605a0e, 0x000a1a4d, 0x01b897b1, 0x0028fac9}}, Y: Field{[10]uint32{0x01e7f77d, 0x00f60fdc, 0x00c6f030, 0x022f9a24, 0x036beec5, 0x00a259f1, 0x036baaf1, 0x03117908, 0x00c21430, 0x0038acd5}}}, + {X: Field{[10]uint32{0x0097981b, 0x00b8273a, 0x01f0fff7, 0x01453a8d, 0x021e309e, 0x0043f205, 0x033f51cd, 0x00c80a5b, 0x02208a13, 0x001cfd8c}}, Y: Field{[10]uint32{0x02420179, 0x03b41cc2, 0x01dc4015, 0x01ea286d, 0x02309525, 0x00d26a4b, 0x01f7ded0, 0x03ccbb5b, 0x0159cc78, 0x0010d04a}}}, + {X: Field{[10]uint32{0x00da41af, 0x03b139d2, 0x01bb4ccf, 0x00b7c6ee, 0x00776051, 0x01811992, 0x00d9628f, 0x02d7ce3c, 0x01d1c21b, 0x0017c209}}, Y: Field{[10]uint32{0x025c0cab, 0x0108e7ff, 0x02323b37, 0x02e30925, 0x005becd4, 0x01964a09, 0x031abd5b, 0x03784a13, 0x020e1d95, 0x0037aeb1}}}, + {X: Field{[10]uint32{0x03d84294, 0x00967fbd, 0x0276da10, 0x03ff19a9, 0x02efc26d, 0x03448a53, 0x023f624c, 0x03a7cbeb, 0x02f2b4a8, 0x003310a9}}, Y: Field{[10]uint32{0x03230519, 0x0383850e, 0x016901ba, 0x0385a804, 0x03118a7a, 0x02d7ec5f, 0x03f2adb2, 0x02f417c4, 0x0200f92c, 0x00246c99}}}, + {X: Field{[10]uint32{0x03635a17, 0x0000bb1b, 0x022618f0, 0x035af44d, 0x034de0c5, 0x03bef347, 0x01aad7a8, 0x0384fea0, 0x00e76eeb, 0x001f55b8}}, Y: Field{[10]uint32{0x03fa1ad8, 0x004eb090, 0x01754f7d, 0x03b156a4, 0x00051122, 0x03a9779f, 0x01ca813e, 0x038fb91b, 0x0307fe55, 0x00255189}}}, + {X: Field{[10]uint32{0x03a5be61, 0x015301bd, 0x00dc6add, 0x03f0f1d9, 0x02fba8ca, 0x02b6d5ad, 0x03605b3a, 0x017b12b2, 0x021b4fe8, 0x001e5cad}}, Y: Field{[10]uint32{0x02b8c7d8, 0x0249b24c, 0x037dd9f4, 0x03397516, 0x024764c4, 0x011aa3a4, 0x00f5141c, 0x03e9ba9f, 0x02702642, 0x002e8619}}}, + {X: Field{[10]uint32{0x01025626, 0x00208d75, 0x02e0bbbe, 0x01fcd87e, 0x034344c8, 0x019d3e43, 0x01f63609, 0x00540226, 0x0040347b, 0x003b7229}}, Y: Field{[10]uint32{0x032cd77b, 0x007b3106, 0x024864d0, 0x008a6947, 0x027bf841, 0x034502cb, 0x00c7cefa, 0x02fd666f, 0x03409a14, 0x000be049}}}, + {X: Field{[10]uint32{0x01b16899, 0x021df34f, 0x00d18d54, 0x02fc9558, 0x02d4ea1b, 0x027e6661, 0x0327b571, 0x03d354bd, 0x01c97a8c, 0x002f66d9}}, Y: Field{[10]uint32{0x02fe432d, 0x02638af0, 0x019af7db, 0x00fd77fa, 0x01ee9c8e, 0x02f93e18, 0x00d9e02d, 0x023972fc, 0x01274e87, 0x001673dc}}}, + {X: Field{[10]uint32{0x00f35782, 0x038ab313, 0x02106f3b, 0x00096542, 0x0072d918, 0x01317636, 0x03565714, 0x03a3334d, 0x02381191, 0x0009d8d7}}, Y: Field{[10]uint32{0x00d1ab7d, 0x0264bdc3, 0x00ce9db1, 0x03cdf9ae, 0x00eb5251, 0x03d46eb5, 0x03fa3ab8, 0x021c3401, 0x0247a019, 0x0030d67f}}}, + {X: Field{[10]uint32{0x0321d85c, 0x0377c84e, 0x03261839, 0x03d2577e, 0x00359950, 0x01e803a6, 0x02abad14, 0x014c02a5, 0x00c316c0, 0x001124b7}}, Y: Field{[10]uint32{0x009ad35b, 0x00d3b5f7, 0x02433189, 0x02fe9630, 0x02fafed4, 0x008a7716, 0x03b8c6d2, 0x00790b6f, 0x0371a4e8, 0x0003b7c4}}}, + {X: Field{[10]uint32{0x01f9c67b, 0x02a981bb, 0x03c01279, 0x031b3b8d, 0x0325887f, 0x02f623e3, 0x028a3869, 0x00079637, 0x0040409e, 0x003e0493}}, Y: Field{[10]uint32{0x026fa6bc, 0x01830868, 0x009d3655, 0x0231879d, 0x022b0f00, 0x035fcd98, 0x026269c3, 0x03b82a28, 0x01d1d31f, 0x0003801c}}}, + {X: Field{[10]uint32{0x0205a2b5, 0x0212f0e6, 0x030b1b57, 0x00ce3d57, 0x02ce3aed, 0x03579470, 0x000716ad, 0x03337e8b, 0x0367066e, 0x0033165e}}, Y: Field{[10]uint32{0x00682865, 0x00e9061d, 0x022da74e, 0x039fcfbc, 0x03df52da, 0x00a3a356, 0x0212ec40, 0x010f6747, 0x01fc394a, 0x0004b80c}}}, + {X: Field{[10]uint32{0x005aeda2, 0x034c78a0, 0x022ee6fd, 0x01c698c8, 0x03d4a45f, 0x03549774, 0x01642707, 0x020fef48, 0x02c6bc12, 0x00050b2c}}, Y: Field{[10]uint32{0x02d66ec0, 0x017b7197, 0x02f2e181, 0x03edf1a1, 0x00ed082b, 0x02fb1916, 0x015b7180, 0x0108ab93, 0x0112c72c, 0x002f7a4f}}}, + {X: Field{[10]uint32{0x001d2d3c, 0x03645230, 0x0147968f, 0x01d78fc3, 0x01c33273, 0x02a25dea, 0x016704a1, 0x0165079a, 0x0202dd76, 0x003efd35}}, Y: Field{[10]uint32{0x006afa8d, 0x03c4e5b0, 0x0118d08e, 0x02ca6bdf, 0x00c7b96f, 0x01a3d858, 0x014cae8e, 0x02572e9b, 0x01f799e8, 0x00196d1b}}}, + {X: Field{[10]uint32{0x01bfffb8, 0x0048f863, 0x02bc7c6d, 0x036f3163, 0x01f09436, 0x03053143, 0x0300ea5e, 0x03a3338c, 0x0157bb5f, 0x003bf6d7}}, Y: Field{[10]uint32{0x0203fe01, 0x01ee2900, 0x00deb813, 0x01fb7758, 0x01d444e4, 0x019ef627, 0x019ce931, 0x00318988, 0x0003d9a9, 0x000e420e}}}, + {X: Field{[10]uint32{0x003f35ad, 0x0241d08b, 0x03d74976, 0x03c7ab7a, 0x02921f59, 0x01afcb53, 0x00b36c7b, 0x00155c2d, 0x0334faa3, 0x0016f290}}, Y: Field{[10]uint32{0x021206e3, 0x03489ef0, 0x0345b520, 0x00a8d4fe, 0x0179d27f, 0x03591b6d, 0x03f2fe1c, 0x018fdc8a, 0x02f5e2a6, 0x000f25ee}}}, + {X: Field{[10]uint32{0x01156632, 0x03c7cfd4, 0x00d4c49f, 0x025c69cf, 0x01ff921e, 0x012a9990, 0x018a0f05, 0x03c1956b, 0x03bce90c, 0x0026a876}}, Y: Field{[10]uint32{0x031a4200, 0x00efd00a, 0x012dc651, 0x01eae404, 0x016e0b33, 0x02730449, 0x002f0f0b, 0x03a176e0, 0x001d8bf1, 0x0032fdba}}}, + {X: Field{[10]uint32{0x03c2d408, 0x02a5589c, 0x01b86aba, 0x01bfbfc2, 0x035386e5, 0x037b0a09, 0x01d4d23d, 0x01d9d935, 0x005586ed, 0x000bf1ff}}, Y: Field{[10]uint32{0x01d6285f, 0x0272041a, 0x03f3f54f, 0x01617531, 0x016019a5, 0x000c42d7, 0x037b0c3e, 0x00d2bb91, 0x01e4773c, 0x0016ffda}}}, + {X: Field{[10]uint32{0x034190b2, 0x03332ef4, 0x03f34764, 0x00403cbf, 0x026ef3b2, 0x0037e445, 0x01954878, 0x01bcb10c, 0x0141c3ac, 0x002397ee}}, Y: Field{[10]uint32{0x0110d2ce, 0x026ebaff, 0x02c4b1df, 0x027b73c6, 0x038d29b5, 0x039eccbe, 0x03ae154c, 0x01a38b18, 0x01b15f66, 0x0036f8b0}}}, + {X: Field{[10]uint32{0x033d49c6, 0x006f5842, 0x03690480, 0x001c99a4, 0x02dcfbaa, 0x02a56e36, 0x013389ea, 0x035b7417, 0x03594748, 0x001e96ee}}, Y: Field{[10]uint32{0x034187c0, 0x03b7ab18, 0x03fa7fd4, 0x0073bff8, 0x00ca1386, 0x0048d71a, 0x00b755c6, 0x00cffa36, 0x0043a42d, 0x0030b4a0}}}, + {X: Field{[10]uint32{0x03b76753, 0x03ebc86f, 0x00745f87, 0x0388894d, 0x00917c2f, 0x02d8c738, 0x033ee1b1, 0x00d4c6b9, 0x00bdf0d3, 0x00256fae}}, Y: Field{[10]uint32{0x0064f45b, 0x030bc2c3, 0x00adaa43, 0x020df88c, 0x03b9bd77, 0x01283932, 0x03e269fb, 0x0165d549, 0x0200d9c5, 0x0031b3e1}}}, + {X: Field{[10]uint32{0x02968d25, 0x003488f8, 0x03a32054, 0x0365dae3, 0x03576dbb, 0x002ae5e4, 0x00fa4809, 0x01b700c1, 0x030c6d89, 0x003d13b2}}, Y: Field{[10]uint32{0x0321086a, 0x027cd4f0, 0x038106d1, 0x003d79db, 0x01e20e47, 0x03a91a82, 0x0203c629, 0x010ca5da, 0x00f62964, 0x00151419}}}, + {X: Field{[10]uint32{0x038109de, 0x01274994, 0x01e074fb, 0x0309dc18, 0x01d56d68, 0x03deb899, 0x033ef501, 0x024db985, 0x00d33dbd, 0x002374cb}}, Y: Field{[10]uint32{0x003f1e76, 0x0217dc1f, 0x00851ae9, 0x00968430, 0x00ad158c, 0x011f5b64, 0x012bca8a, 0x02b0814e, 0x025c80da, 0x001ac443}}}, + {X: Field{[10]uint32{0x0237997b, 0x01d77698, 0x01a8c770, 0x00fe2473, 0x010fea5e, 0x01c74113, 0x03bc77eb, 0x03d5e353, 0x0130b0f0, 0x000f52bf}}, Y: Field{[10]uint32{0x018bb9ce, 0x02c7bf01, 0x0093ed83, 0x02af9d21, 0x020ae286, 0x02708eb6, 0x013d4424, 0x03d5fb1e, 0x00e8664d, 0x000a05b8}}}, + {X: Field{[10]uint32{0x01d95ff1, 0x03ff45e1, 0x020200a5, 0x0204b4af, 0x02b83913, 0x01a81ee8, 0x015ccac8, 0x00ec8aca, 0x01fbbeaa, 0x002a6dce}}, Y: Field{[10]uint32{0x03b84f1b, 0x016cabaf, 0x02d401a5, 0x00ae3b5e, 0x00d3c5d4, 0x0310ff7b, 0x016d7323, 0x029abbda, 0x023021d6, 0x00287420}}}, + {X: Field{[10]uint32{0x0203715a, 0x01fd1ae4, 0x03632bb7, 0x019eb3e6, 0x02a37e5d, 0x022d5659, 0x02cc754c, 0x0147aff0, 0x0347e512, 0x003a4025}}, Y: Field{[10]uint32{0x02f9df72, 0x036ad3f3, 0x03907d9c, 0x01e85f38, 0x00756f27, 0x015c6962, 0x03476f25, 0x03e65dc6, 0x01679ea8, 0x000d0962}}}, + {X: Field{[10]uint32{0x021a3f2e, 0x01d90e7c, 0x006c1a83, 0x0104eb13, 0x002108fe, 0x02ccc821, 0x00d09b96, 0x035d3309, 0x00ed55aa, 0x001f8d23}}, Y: Field{[10]uint32{0x00389e5f, 0x033e0fad, 0x020f91ed, 0x00bcd964, 0x01c884c2, 0x010e793d, 0x0065706e, 0x009e5761, 0x038e3b72, 0x000e61d3}}}, + {X: Field{[10]uint32{0x03b1f55a, 0x029d29be, 0x01220aaa, 0x02da2834, 0x038e340f, 0x003f3034, 0x032cdabf, 0x035c055b, 0x02765ec2, 0x0029f759}}, Y: Field{[10]uint32{0x0341d447, 0x029439cb, 0x00e73760, 0x02b5117a, 0x0163710d, 0x02c02efa, 0x02ded9b0, 0x0298f4a4, 0x03f2ab00, 0x002dc246}}}, + {X: Field{[10]uint32{0x03f57025, 0x02354780, 0x03a96a30, 0x00a91a4f, 0x0051c085, 0x01b624d3, 0x0033a481, 0x032fdb70, 0x01e9a8cc, 0x0002e15e}}, Y: Field{[10]uint32{0x0158268b, 0x0337315c, 0x00feca8b, 0x00cdbda5, 0x0242c888, 0x02f046f6, 0x0164a3e0, 0x00546cbc, 0x00df4d79, 0x0039a5bb}}}, + {X: Field{[10]uint32{0x03f57af8, 0x00b0b0af, 0x03cdabb4, 0x007519e1, 0x03184f1c, 0x01ed669f, 0x00c8c72e, 0x002032fe, 0x00459de0, 0x0001eca7}}, Y: Field{[10]uint32{0x03801799, 0x011b7a57, 0x026145dc, 0x02dc97d3, 0x02817578, 0x000ddbb7, 0x0101ca56, 0x0344f506, 0x0367a6d8, 0x001037a0}}}, + {X: Field{[10]uint32{0x02f00f9f, 0x026bf765, 0x0214e017, 0x0276cc7f, 0x030d1c4e, 0x002df940, 0x020e34ef, 0x016f9eb0, 0x026f89b6, 0x00073bfe}}, Y: Field{[10]uint32{0x0276f179, 0x01d12d46, 0x02da979a, 0x03d6f2a9, 0x008e293b, 0x005e4384, 0x018feb78, 0x00c2f7b6, 0x00b1f059, 0x001bf7ba}}}, + {X: Field{[10]uint32{0x01e58d74, 0x0365f645, 0x01e47ca2, 0x03fa8013, 0x0280ba4e, 0x00078bb1, 0x01d01e9a, 0x000715b5, 0x016d11d3, 0x00155b8b}}, Y: Field{[10]uint32{0x0249d711, 0x00b175d4, 0x0096108a, 0x031cbd36, 0x013d66e6, 0x03bb2f26, 0x01ba7eef, 0x035edad5, 0x009bb633, 0x0025620d}}}, + {X: Field{[10]uint32{0x01e51586, 0x02ae45e8, 0x026ba6a7, 0x03d3a7b9, 0x02b97f7b, 0x00ad8ba8, 0x004518a4, 0x00f723b4, 0x028873b9, 0x002cd41b}}, Y: Field{[10]uint32{0x030b3b38, 0x00eb9306, 0x023fd582, 0x027c7e3f, 0x025917a3, 0x02b2ea7f, 0x0293eaa7, 0x03edeff9, 0x01001230, 0x0011d3e0}}}, + {X: Field{[10]uint32{0x012628f3, 0x01d2e5af, 0x00504e97, 0x00e86665, 0x001ba7ff, 0x0243b99f, 0x001a886f, 0x0124236c, 0x02f389cb, 0x0003461a}}, Y: Field{[10]uint32{0x02a2db7d, 0x023dfbbc, 0x0021d5d0, 0x01bfd046, 0x02d01d74, 0x0218bbcd, 0x0378c75a, 0x01f372d1, 0x002bc656, 0x000ece5e}}}, + {X: Field{[10]uint32{0x03987bb7, 0x02215cbb, 0x00d55d67, 0x0200aa04, 0x0119e8c9, 0x018b18e7, 0x02459000, 0x016b08fe, 0x0121e106, 0x003e5476}}, Y: Field{[10]uint32{0x01d7d950, 0x002631fe, 0x0207055d, 0x019aedda, 0x01051abc, 0x03d54ed7, 0x03db2397, 0x03a5d409, 0x01c187f8, 0x00373df7}}}, + {X: Field{[10]uint32{0x00d915ec, 0x00f83eb1, 0x0242ebb5, 0x01d3f20a, 0x038bcbf8, 0x03cd0382, 0x021b75e8, 0x01bf1845, 0x02167bac, 0x002373a3}}, Y: Field{[10]uint32{0x00ae940c, 0x004985f8, 0x03674e32, 0x03d240cb, 0x039c0287, 0x01349bb5, 0x00b410b3, 0x02e7ae6d, 0x03a14a9e, 0x00047394}}}, + {X: Field{[10]uint32{0x01e26e2b, 0x00e7baa6, 0x005dc4f4, 0x016bb56a, 0x02755dfc, 0x0304a9ea, 0x012ed15e, 0x0290f35f, 0x00dda0a7, 0x00338b4f}}, Y: Field{[10]uint32{0x03a5a145, 0x025f1801, 0x0009a36b, 0x0191f886, 0x036a8eed, 0x03160881, 0x035c2853, 0x009d03a9, 0x02bbe7ca, 0x001aa5ab}}}, + {X: Field{[10]uint32{0x00d92092, 0x00e42a37, 0x000f05ea, 0x00295632, 0x00f712c4, 0x020ce492, 0x03367b5c, 0x0353173b, 0x02fcdcc2, 0x0008e519}}, Y: Field{[10]uint32{0x03ac28cd, 0x02157849, 0x0318ed0e, 0x02acedf5, 0x0265d176, 0x023805cd, 0x023ee8e9, 0x03c22f29, 0x023c9b49, 0x003cb388}}}, + {X: Field{[10]uint32{0x0163e033, 0x0297fb8d, 0x0395e0f6, 0x01911d98, 0x034a2f3c, 0x00c7825c, 0x005bcd83, 0x00f02367, 0x0364341d, 0x000882ad}}, Y: Field{[10]uint32{0x02df5011, 0x03360dd5, 0x03f4cf9d, 0x028d5e05, 0x03aa51a9, 0x02d48300, 0x03dc7a42, 0x004fbd19, 0x0060d030, 0x003b0791}}}, + {X: Field{[10]uint32{0x004b469f, 0x03ffa024, 0x03db4ee2, 0x004993e8, 0x02845f0b, 0x00f13443, 0x03ffd81f, 0x01a9b1c3, 0x01fe1640, 0x00355157}}, Y: Field{[10]uint32{0x020aaf9a, 0x00428401, 0x019b8088, 0x03c0abe5, 0x0028a20a, 0x0056125f, 0x01d99e49, 0x00798899, 0x038d257e, 0x00283e4e}}}, + {X: Field{[10]uint32{0x00e60c72, 0x03627ca2, 0x0137e1a9, 0x03e73f07, 0x02f5039c, 0x007bb034, 0x0054665f, 0x03c1777c, 0x0377a1f6, 0x00148d9c}}, Y: Field{[10]uint32{0x02c7bb41, 0x027f1767, 0x01ce6a03, 0x005b663e, 0x00d05e70, 0x038925e8, 0x018d0477, 0x030d4b35, 0x0355430f, 0x001e3627}}}, + {X: Field{[10]uint32{0x03a56395, 0x0377a957, 0x02c9f4c1, 0x03c644b9, 0x01a8e569, 0x01cd9049, 0x023dc886, 0x0250889a, 0x01133ecc, 0x0016e658}}, Y: Field{[10]uint32{0x02436d0a, 0x010abd93, 0x00f19101, 0x02a84226, 0x03f7a0bc, 0x0178bf57, 0x00ac902c, 0x01b2bd76, 0x03641207, 0x002ee75d}}}, + {X: Field{[10]uint32{0x004c13fb, 0x0093ccae, 0x00f0c07c, 0x010f6e5b, 0x03eecd1a, 0x02c299dc, 0x007fa4a5, 0x03479963, 0x035cbfbe, 0x003cdb36}}, Y: Field{[10]uint32{0x018c394c, 0x01b24640, 0x039b9315, 0x039d1e4d, 0x01993744, 0x006d8996, 0x016aee18, 0x03b68a45, 0x02f05ee9, 0x0033f1b4}}}, + {X: Field{[10]uint32{0x0079a6f9, 0x017ee45c, 0x03e44059, 0x00cc43b1, 0x030842ce, 0x014c499b, 0x00bf7545, 0x01ebcace, 0x018e2510, 0x000c8231}}, Y: Field{[10]uint32{0x02c785d7, 0x011d628c, 0x001c645a, 0x028b2220, 0x03653599, 0x0257b0b2, 0x01d9ab58, 0x02db2581, 0x01cb5346, 0x0020c71b}}}, + {X: Field{[10]uint32{0x009927a7, 0x014e4623, 0x025a8c52, 0x020d9406, 0x02472535, 0x01135cd5, 0x0021b80b, 0x00438aa8, 0x02071f85, 0x002981ce}}, Y: Field{[10]uint32{0x0364fec9, 0x03c64698, 0x032462a9, 0x00361600, 0x026fefa3, 0x033f26ee, 0x0318baad, 0x01d84859, 0x03c54c8a, 0x003a4ea7}}}, + {X: Field{[10]uint32{0x01f0d913, 0x00d5d62e, 0x007139e3, 0x01f8d589, 0x00f7ec1a, 0x02a9fffa, 0x00f21476, 0x02bdfc98, 0x0062f79e, 0x000cd42d}}, Y: Field{[10]uint32{0x01152959, 0x01c5c448, 0x00d4e805, 0x02f120a9, 0x03020f33, 0x02a34ba4, 0x03d2341b, 0x0048883e, 0x01b30fce, 0x0007c327}}}, + {X: Field{[10]uint32{0x03073caa, 0x03893380, 0x0344c11d, 0x00f99bd9, 0x00177391, 0x02859433, 0x007c89b5, 0x00a9d248, 0x03170bc8, 0x00295356}}, Y: Field{[10]uint32{0x02cd3ab8, 0x01edec4c, 0x033afcdb, 0x009be4ad, 0x02fe62dc, 0x02488b27, 0x007fe5d4, 0x0374460f, 0x035f5309, 0x000f090e}}}, + {X: Field{[10]uint32{0x00a04cf8, 0x0095ca41, 0x005cae5b, 0x01b558e4, 0x028a7d34, 0x0071e18f, 0x0024f7b0, 0x01e8d285, 0x02bf676a, 0x00196428}}, Y: Field{[10]uint32{0x03e781e7, 0x01419168, 0x02f09396, 0x03b10919, 0x004f8d0c, 0x03a8bdcd, 0x002d972e, 0x0106684e, 0x00030490, 0x00047356}}}, + {X: Field{[10]uint32{0x03cba9a5, 0x025bb271, 0x0159289e, 0x00f7ed6e, 0x01884039, 0x028d9c04, 0x03461a20, 0x03d22f4b, 0x00029fc7, 0x002cf027}}, Y: Field{[10]uint32{0x00f5cfa9, 0x03324ac2, 0x0360ab97, 0x035abcb6, 0x03c6a3e6, 0x0300c38a, 0x03bb1bda, 0x012b4065, 0x026cbce5, 0x0039ed6a}}}, + {X: Field{[10]uint32{0x00fa8bc0, 0x024a4e46, 0x0064426a, 0x03be3f75, 0x02cdc693, 0x022ca65c, 0x03361439, 0x004de9f6, 0x02a8044a, 0x0035e5a3}}, Y: Field{[10]uint32{0x0157a75c, 0x009bb22b, 0x022e5283, 0x01d35d36, 0x0156dd31, 0x004338b9, 0x015dd294, 0x010d3b2f, 0x01892901, 0x00209009}}}, + {X: Field{[10]uint32{0x038e8304, 0x0167c020, 0x0365c6d9, 0x03212d40, 0x033bf6ed, 0x009406b6, 0x02ca172b, 0x03e73347, 0x006c2f98, 0x002295ef}}, Y: Field{[10]uint32{0x03e7d14e, 0x02ff8361, 0x038b992c, 0x00404691, 0x01bf6434, 0x02fe9a30, 0x00b5d67c, 0x0166150e, 0x0062a0f8, 0x000bafd5}}}, + {X: Field{[10]uint32{0x0073fd22, 0x03435418, 0x03b4e551, 0x034dfc3b, 0x011a555d, 0x023218f3, 0x00b8d18f, 0x0142a30f, 0x00416847, 0x0014621a}}, Y: Field{[10]uint32{0x02f3f192, 0x0145f68d, 0x03691f30, 0x0141b14b, 0x006a28ce, 0x00bd660f, 0x00e0f15c, 0x00eb429b, 0x009b9e98, 0x003ac17c}}}, + {X: Field{[10]uint32{0x027c85f3, 0x0124f8bd, 0x037b0ab7, 0x005a6e7a, 0x02d3a026, 0x00575574, 0x02ab8566, 0x01e53ea7, 0x035f27e4, 0x003faa30}}, Y: Field{[10]uint32{0x00148864, 0x012940a3, 0x03c889b5, 0x03d52aa5, 0x03b24158, 0x038ae8b9, 0x01123378, 0x01b8ea61, 0x0297cf0a, 0x0030c977}}}, + {X: Field{[10]uint32{0x01f94b63, 0x01409fb4, 0x0051077b, 0x01a5fbd3, 0x01d79d5f, 0x01707273, 0x01ab955d, 0x009793e3, 0x00ccd7bc, 0x001984b3}}, Y: Field{[10]uint32{0x0057860b, 0x0012668d, 0x0320073d, 0x0200570e, 0x03e9bd6a, 0x0094f7e6, 0x02abab50, 0x02342b9e, 0x02c17a37, 0x00185544}}}, + {X: Field{[10]uint32{0x006f8746, 0x02f5f92a, 0x03533cbd, 0x019e7db4, 0x02f8a7ae, 0x00c66655, 0x009d6983, 0x01676c13, 0x007a4998, 0x0032662c}}, Y: Field{[10]uint32{0x01d17138, 0x0046fc23, 0x038a66af, 0x03a444e0, 0x0137d6b5, 0x03a881ba, 0x019d81b0, 0x01dd7a89, 0x0371919e, 0x00367804}}}, + {X: Field{[10]uint32{0x024cc1e1, 0x003ec30e, 0x004bb052, 0x00551835, 0x00c32e39, 0x00f77242, 0x00fcd0d2, 0x02597e15, 0x0269c5cf, 0x00170391}}, Y: Field{[10]uint32{0x035adea1, 0x02e42719, 0x0055464f, 0x03b722cf, 0x0189f5ed, 0x0343df2e, 0x0335ffac, 0x0269374b, 0x03af7e0f, 0x0033faee}}}, + {X: Field{[10]uint32{0x0158c0fd, 0x036fee1c, 0x0350bcb2, 0x016d93e5, 0x037ab319, 0x01aa74fe, 0x02f6433c, 0x01459fc1, 0x02483038, 0x00343f76}}, Y: Field{[10]uint32{0x031283db, 0x000838fb, 0x03c358f0, 0x0057442a, 0x03f5c6e3, 0x01860cda, 0x02e13598, 0x03d87f20, 0x01776a34, 0x00133795}}}, + {X: Field{[10]uint32{0x024a3e81, 0x01c0617e, 0x00fd37bc, 0x014c66df, 0x0007cab1, 0x0088b39d, 0x01482656, 0x03d96817, 0x030fd78b, 0x00364955}}, Y: Field{[10]uint32{0x03c1924c, 0x0360dc21, 0x00ed1673, 0x03833740, 0x00ff52be, 0x027195d7, 0x021a5c7b, 0x02ea4068, 0x019ac448, 0x00000f0e}}}, + {X: Field{[10]uint32{0x018374c8, 0x030861c2, 0x00f9a1d0, 0x013f5e06, 0x02a023cc, 0x0212c200, 0x037d6074, 0x012eb081, 0x016d81f8, 0x001174ad}}, Y: Field{[10]uint32{0x0019d7f4, 0x01901067, 0x03f05030, 0x007e122e, 0x00982941, 0x009598f3, 0x010506ea, 0x032cdeb5, 0x00d192a9, 0x00053286}}}, + {X: Field{[10]uint32{0x02157400, 0x005c2de7, 0x03fba5b7, 0x01e196a4, 0x00ea8c19, 0x03e6843e, 0x013404dd, 0x0316efde, 0x00118588, 0x001ab4eb}}, Y: Field{[10]uint32{0x011686d7, 0x018bfa60, 0x02c97a87, 0x02b45cc7, 0x02382eb5, 0x035d8a4b, 0x0320e80f, 0x00b0ffb7, 0x001f1e24, 0x003e895d}}}, + {X: Field{[10]uint32{0x02595f52, 0x0387afd2, 0x00bf5028, 0x00a00b77, 0x0026d540, 0x004ac876, 0x03ea9e39, 0x02582de4, 0x0045b6dc, 0x00176891}}, Y: Field{[10]uint32{0x01f16026, 0x01007cd9, 0x005fd01b, 0x03663222, 0x02fabfa0, 0x03e28bf4, 0x015063bf, 0x0329a626, 0x038cad1d, 0x002f063f}}}, + {X: Field{[10]uint32{0x0132b346, 0x0057bf2b, 0x00f445ed, 0x0227549f, 0x03d7b5f1, 0x01975c4c, 0x039b89f8, 0x021b4a4e, 0x006811ce, 0x00377fd9}}, Y: Field{[10]uint32{0x027f5737, 0x03b68d95, 0x0110db1a, 0x019c4fa9, 0x034d236b, 0x004ac070, 0x021ae080, 0x0005af84, 0x0194cb22, 0x001c983a}}}, + {X: Field{[10]uint32{0x0097f029, 0x0279a6fe, 0x012436ad, 0x02637275, 0x02c1030d, 0x02142611, 0x032f50bc, 0x03ea4f43, 0x033b9120, 0x002a2e7f}}, Y: Field{[10]uint32{0x0066c591, 0x01f8cca1, 0x017b2359, 0x03da8ac7, 0x00c866aa, 0x00ec1fbf, 0x01a4c2ca, 0x01a1cbaa, 0x029a4e51, 0x00172fe8}}}, + {X: Field{[10]uint32{0x01dbcafd, 0x03068054, 0x00eb7a2f, 0x01921a3b, 0x02628752, 0x03237bac, 0x03c18eda, 0x0275a9c8, 0x03fb177b, 0x00250c1d}}, Y: Field{[10]uint32{0x00e7eb4e, 0x03d2a546, 0x01442e48, 0x004be97f, 0x03ccb6e3, 0x031f7e4f, 0x038248da, 0x0007274f, 0x01fc41ad, 0x0000866a}}}, + {X: Field{[10]uint32{0x0058b8e3, 0x0043cd99, 0x0174e9e8, 0x027e9593, 0x0382b33f, 0x00917aef, 0x0360f524, 0x0205ebf7, 0x01ac09c9, 0x001d72d8}}, Y: Field{[10]uint32{0x0003c367, 0x02b7f7bb, 0x00fb85b3, 0x01df3563, 0x02664414, 0x0277dae7, 0x00986f5f, 0x00210d18, 0x01bdf66f, 0x002aa04d}}}, + {X: Field{[10]uint32{0x031fccc8, 0x0039f238, 0x010c5075, 0x03cee6eb, 0x02c34fdc, 0x0239fc2b, 0x00922b22, 0x023a152f, 0x017727cb, 0x0006edf8}}, Y: Field{[10]uint32{0x00221ca3, 0x00368e30, 0x023d5238, 0x0030f989, 0x02855ea0, 0x0109737a, 0x01e322c2, 0x0179c2f6, 0x00861e85, 0x002efdca}}}, + {X: Field{[10]uint32{0x03ee8dbb, 0x02a536a2, 0x02a2eafd, 0x01c72638, 0x0087f024, 0x001743cc, 0x034b41cf, 0x036fcd16, 0x004b39e9, 0x002510ce}}, Y: Field{[10]uint32{0x024544ee, 0x0380723e, 0x02504aba, 0x015fdbde, 0x03e7b5da, 0x01f8e4e7, 0x00ac6e22, 0x0047d8e3, 0x0173ccb2, 0x0038d984}}}, + {X: Field{[10]uint32{0x03740d25, 0x033a9dbb, 0x0183961c, 0x015359a4, 0x00b4c27d, 0x0306a59a, 0x011638ae, 0x02aaca35, 0x01d5a68c, 0x00126f45}}, Y: Field{[10]uint32{0x0318c6e4, 0x01d0e7cf, 0x03e579db, 0x0183ab3c, 0x0377563b, 0x02657303, 0x03b9f0bd, 0x0391f7ef, 0x00688760, 0x001923f2}}}, + {X: Field{[10]uint32{0x02cfed85, 0x02517f5e, 0x02f9073f, 0x01e2960c, 0x02c151aa, 0x001e241f, 0x013684fd, 0x027a1613, 0x038e9280, 0x003431ed}}, Y: Field{[10]uint32{0x02970c89, 0x02e56ce3, 0x01d5707a, 0x01d48ab6, 0x03be91e4, 0x030c1480, 0x0129046b, 0x012902d5, 0x01abbe49, 0x002a0365}}}, + {X: Field{[10]uint32{0x02eb9275, 0x01af5f64, 0x00bf0cd9, 0x0361e5d2, 0x027c4c28, 0x033721d6, 0x018f9c75, 0x0088c97a, 0x01463ab2, 0x0037af77}}, Y: Field{[10]uint32{0x02b9799c, 0x02531c42, 0x00754ab5, 0x0192c4af, 0x0150d020, 0x01cebc96, 0x03b3dd7a, 0x03f2c17f, 0x008dc3ff, 0x0003440f}}}, + {X: Field{[10]uint32{0x03f33998, 0x01004bc6, 0x02dc33f6, 0x032152c0, 0x029f9ebc, 0x03681cc4, 0x022d6bf9, 0x01a8563a, 0x017c192a, 0x00075e6c}}, Y: Field{[10]uint32{0x00f60a5e, 0x039aef53, 0x00a12b78, 0x020af102, 0x020c7876, 0x033d91c0, 0x00d986fb, 0x0322a014, 0x00b3dbc1, 0x001bb206}}}, + {X: Field{[10]uint32{0x0281ca1b, 0x03f4db9b, 0x018449ed, 0x015c9931, 0x0374bd3b, 0x03454d7f, 0x009c38d7, 0x011fa5ca, 0x02ebff5d, 0x000bfadd}}, Y: Field{[10]uint32{0x01f93b74, 0x030ceee2, 0x00899378, 0x01d1e267, 0x03bb462e, 0x03e72af1, 0x02e18cd1, 0x02a08f7e, 0x024a7ba3, 0x00116f53}}}, + {X: Field{[10]uint32{0x00682573, 0x00bf82ec, 0x013c0637, 0x00e52619, 0x013eef1b, 0x0393d7bf, 0x0372ab62, 0x0169dfd4, 0x0190faef, 0x00005343}}, Y: Field{[10]uint32{0x02081453, 0x02a4bd8d, 0x0131236b, 0x025dcae8, 0x01601a4f, 0x01c65a0c, 0x0130f51d, 0x02e4c13d, 0x029a80c2, 0x00145fc5}}}, + {X: Field{[10]uint32{0x03313321, 0x008aafff, 0x02476fd5, 0x00dd1b4b, 0x02ad0941, 0x0042ce6c, 0x00bd9adb, 0x02470ce1, 0x03a5728f, 0x001cc1a9}}, Y: Field{[10]uint32{0x03a915a2, 0x005ee06d, 0x02a85a8e, 0x03b496e1, 0x01574c85, 0x0124bc6c, 0x03bd4e4f, 0x03a1ecd6, 0x02aba5b9, 0x00085788}}}, + {X: Field{[10]uint32{0x0255aaba, 0x0134d89a, 0x0171976d, 0x01e9cdfa, 0x00fd2406, 0x0263eb48, 0x02873a06, 0x036e32cc, 0x014f870c, 0x00217611}}, Y: Field{[10]uint32{0x0117e4a2, 0x010d2c4c, 0x033bb951, 0x03b8446b, 0x01539fe7, 0x02e720cf, 0x02a0715c, 0x027a3948, 0x000a36eb, 0x000db58f}}}, + {X: Field{[10]uint32{0x034384c3, 0x0028392c, 0x00dffc1f, 0x00a25b63, 0x0202f7da, 0x0386448a, 0x01b21cb9, 0x019ea896, 0x03829930, 0x0031a3d9}}, Y: Field{[10]uint32{0x0079e94a, 0x030da04c, 0x014ffb7d, 0x024daca6, 0x0308dcd4, 0x026575a8, 0x02484fb0, 0x00ce1dfa, 0x016a331c, 0x001d39ba}}}, + {X: Field{[10]uint32{0x00214dd3, 0x038c6101, 0x0217fe18, 0x0141a1c2, 0x00e29cd8, 0x00d47227, 0x02d5c9c3, 0x01554211, 0x01115dbe, 0x00205120}}, Y: Field{[10]uint32{0x030d19a8, 0x02af2c59, 0x02785210, 0x00f97b75, 0x01540ea3, 0x011e1a27, 0x03740e92, 0x030a71a5, 0x00b3d4cd, 0x001d775e}}}, + {X: Field{[10]uint32{0x00c945f5, 0x00120558, 0x00ebe3e2, 0x006f3d85, 0x0324214e, 0x01c1bc87, 0x0325993a, 0x0351e3d7, 0x0319de24, 0x000c42d6}}, Y: Field{[10]uint32{0x004318c3, 0x00ccc9c4, 0x021a147e, 0x014fc0a8, 0x01bf04cc, 0x03a1035a, 0x01d017e2, 0x03481782, 0x02ca0f01, 0x0022d0b1}}}, + {X: Field{[10]uint32{0x03c4bc3e, 0x0165d302, 0x03420a02, 0x00471a13, 0x01b0a90f, 0x00b9b514, 0x01e4bcab, 0x038ae77f, 0x03c74baf, 0x0033e291}}, Y: Field{[10]uint32{0x034c97d1, 0x00806ef8, 0x01c3d1cc, 0x01a70299, 0x02614d8a, 0x0321d8af, 0x02331e62, 0x021a65e1, 0x0264a9a7, 0x003c2dec}}}, + {X: Field{[10]uint32{0x038650fc, 0x011ebe62, 0x002d33d7, 0x0221a6e6, 0x03ab5533, 0x00f4ed82, 0x00100ec6, 0x02a4139c, 0x02267352, 0x00283f18}}, Y: Field{[10]uint32{0x0385865f, 0x025bcace, 0x02497e2b, 0x02cfe659, 0x03cd162e, 0x00870e67, 0x0388c395, 0x013ad192, 0x014c16b2, 0x002e8eb9}}}, + {X: Field{[10]uint32{0x00ff8bdb, 0x038f08db, 0x03fb07dc, 0x01c29386, 0x032e1eaf, 0x000114cc, 0x00d03391, 0x03751d61, 0x03e2535e, 0x002ab976}}, Y: Field{[10]uint32{0x03a7449b, 0x02554ced, 0x00321911, 0x03168d56, 0x02a51d85, 0x011cdccb, 0x02784392, 0x001adeec, 0x01f6e558, 0x001f3ea9}}}, + {X: Field{[10]uint32{0x0103ae39, 0x0285eec1, 0x01bd50b0, 0x009a1b69, 0x005c3172, 0x009c1686, 0x000792fb, 0x01d5432f, 0x03115b89, 0x002293a4}}, Y: Field{[10]uint32{0x017cef2c, 0x03a48ff4, 0x016922dd, 0x0362a770, 0x022442ae, 0x02a85d5c, 0x011b976d, 0x00231c5d, 0x01c8d85f, 0x000588eb}}}, + {X: Field{[10]uint32{0x03066463, 0x0336b1a1, 0x03f26a51, 0x028332eb, 0x018627e1, 0x02404096, 0x015cd612, 0x002c254a, 0x0135eca9, 0x0032f3bd}}, Y: Field{[10]uint32{0x03212653, 0x01fee35a, 0x03c259d8, 0x005cd18b, 0x02498fee, 0x03143855, 0x00afb9d8, 0x032670ff, 0x03fac2a2, 0x0019470b}}}, + {X: Field{[10]uint32{0x010f8c99, 0x00bab07b, 0x02609990, 0x0134bab5, 0x010bf12c, 0x00ae7210, 0x0290e336, 0x00af42ea, 0x01594d6a, 0x000965c5}}, Y: Field{[10]uint32{0x0075245e, 0x02b4afca, 0x02a8294b, 0x008b4289, 0x01d974dd, 0x00cfa2ec, 0x004002bc, 0x00132e05, 0x036cc974, 0x00127806}}}, + {X: Field{[10]uint32{0x02f1445f, 0x00b34a6d, 0x02a89167, 0x0178fa6c, 0x00a707da, 0x0203c0d9, 0x0389044c, 0x027daeb0, 0x028b2b04, 0x002dd535}}, Y: Field{[10]uint32{0x01e37740, 0x02bb1793, 0x01da1af2, 0x01097d37, 0x02bea555, 0x037f0bd3, 0x0092e3ed, 0x008f459c, 0x03c1625e, 0x0006ca6d}}}, + {X: Field{[10]uint32{0x03084037, 0x02263fd3, 0x0040aafa, 0x022f4a53, 0x02ab0bde, 0x03ce2d68, 0x03ca2fe2, 0x023ce731, 0x01a850e6, 0x00082ba9}}, Y: Field{[10]uint32{0x03f59444, 0x03877c00, 0x00fc20b4, 0x00f0c48c, 0x02ab1e88, 0x03f9f86c, 0x02fd6a56, 0x019bb1aa, 0x02b3f176, 0x001bb55d}}}, + {X: Field{[10]uint32{0x031979a6, 0x017876f8, 0x01e7bf0d, 0x0341f340, 0x02c6939f, 0x025fae16, 0x008cba9a, 0x03a48cca, 0x0202919d, 0x0009a113}}, Y: Field{[10]uint32{0x009ebfb7, 0x03154817, 0x005a16c7, 0x030a0cb1, 0x00cc08a6, 0x0063ed83, 0x026f11e5, 0x03eb4409, 0x028e06a5, 0x0000f7e6}}}, + {X: Field{[10]uint32{0x0028414c, 0x0372a577, 0x033fd485, 0x01ac68e2, 0x00efbe0a, 0x03b37e6d, 0x00fd413b, 0x026abc9f, 0x026133a6, 0x00046bf2}}, Y: Field{[10]uint32{0x03737b1c, 0x007d6b36, 0x0377b212, 0x03eee724, 0x009e4678, 0x0391ed00, 0x0047bbf8, 0x01ff988a, 0x0390c067, 0x002352e1}}}, + {X: Field{[10]uint32{0x00d2a63d, 0x01e37bba, 0x0160df3d, 0x01ec8f9c, 0x00498633, 0x039fa578, 0x03be09fc, 0x017594de, 0x00d52fe2, 0x00311b85}}, Y: Field{[10]uint32{0x01d2b723, 0x01d7563d, 0x017589b1, 0x03bd0fe8, 0x011f04b9, 0x0377d9e9, 0x0008dd77, 0x03a7fcb4, 0x01ab4211, 0x0028803f}}}, + {X: Field{[10]uint32{0x0055e4d7, 0x03673635, 0x02142d31, 0x00f23d63, 0x01241228, 0x00429d81, 0x01f598a2, 0x03f82491, 0x0212578a, 0x00015c2a}}, Y: Field{[10]uint32{0x00c50ac8, 0x00b03c4b, 0x01601b93, 0x02a57429, 0x019a2bed, 0x0144a81c, 0x03439e08, 0x00378750, 0x0361f8e9, 0x0030a3f6}}}, + {X: Field{[10]uint32{0x03c3fa64, 0x00c4237e, 0x00d1f3a3, 0x02b33ec5, 0x02224236, 0x00e15385, 0x0170b84e, 0x033a80a1, 0x035e88a1, 0x0034c4b6}}, Y: Field{[10]uint32{0x0397e1de, 0x0185fdb3, 0x026cf36b, 0x012ba9cb, 0x0064b8aa, 0x000c724c, 0x01fa0aae, 0x00e0f211, 0x00891843, 0x00329794}}}, + {X: Field{[10]uint32{0x02398087, 0x013b022a, 0x00a6d1fe, 0x02e1d889, 0x01c9be5e, 0x009e7c00, 0x01a9ad99, 0x019c3853, 0x00769981, 0x0007b88a}}, Y: Field{[10]uint32{0x02176dcc, 0x00c727c0, 0x034526ff, 0x02896031, 0x00b68603, 0x01511835, 0x0242c650, 0x038deb7f, 0x0114e303, 0x00188404}}}, + {X: Field{[10]uint32{0x03bb81a0, 0x02a6a955, 0x004a94af, 0x035cb530, 0x011700b9, 0x03259300, 0x005511d1, 0x013fd2ba, 0x02cde2b8, 0x0007ee72}}, Y: Field{[10]uint32{0x03737fcb, 0x0159d497, 0x0038ee04, 0x01acb3e8, 0x0115b130, 0x0108050d, 0x019f59f7, 0x017cab5b, 0x03c1295c, 0x0010c2dc}}}, + {X: Field{[10]uint32{0x011c085b, 0x00685d98, 0x01145f19, 0x02e7e913, 0x034a998b, 0x0201f9d0, 0x032934a9, 0x002d1da7, 0x002dd3cf, 0x00341332}}, Y: Field{[10]uint32{0x01be5fa9, 0x00805a40, 0x0392d155, 0x02b32196, 0x018f4c13, 0x03848f75, 0x02cf1cac, 0x03454710, 0x01afb551, 0x001e9286}}}, + {X: Field{[10]uint32{0x03e7e9aa, 0x03a1c133, 0x01e15712, 0x02295237, 0x038a544f, 0x009f7d77, 0x00b97f1f, 0x0345faea, 0x02088bd4, 0x0007932c}}, Y: Field{[10]uint32{0x019b828d, 0x0119b369, 0x03e515e8, 0x025971c6, 0x03db0663, 0x00ff68fc, 0x019930a5, 0x00cfb39e, 0x021eb729, 0x00360171}}}, + {X: Field{[10]uint32{0x0251590d, 0x01b71237, 0x028c717d, 0x01a77cf7, 0x008f769f, 0x02f3f6ae, 0x032bbadc, 0x02168359, 0x0398707a, 0x001482a8}}, Y: Field{[10]uint32{0x02e9ada8, 0x01495513, 0x0052a39a, 0x01366638, 0x013b5472, 0x0045daab, 0x01095e2f, 0x01e88b02, 0x00e4a904, 0x002634d1}}}, + {X: Field{[10]uint32{0x03614ef2, 0x032b1b9e, 0x005d7a79, 0x0325e0c9, 0x00e7080a, 0x001a4ff2, 0x00d45a06, 0x03bdf0b8, 0x03de165b, 0x000ea7f8}}, Y: Field{[10]uint32{0x03038d4a, 0x00187bdc, 0x0398e151, 0x0126a9b5, 0x007607ff, 0x024d3222, 0x02895f52, 0x037bbf1e, 0x0046fd3f, 0x00014625}}}, + {X: Field{[10]uint32{0x02149938, 0x03639cf6, 0x0005665f, 0x00190dcc, 0x018e3c68, 0x02db5a32, 0x0289a3a2, 0x00201790, 0x01ccc26c, 0x002724a7}}, Y: Field{[10]uint32{0x016ba2fa, 0x0285034e, 0x02dd956a, 0x00b6aaf9, 0x02c81edf, 0x00409d8a, 0x039f6bab, 0x024824fc, 0x0140b4c2, 0x001b7efe}}}, + {X: Field{[10]uint32{0x01be419e, 0x005dd222, 0x00a660d1, 0x02af1a6b, 0x03ee22ab, 0x0179e822, 0x02f1e42e, 0x0019462e, 0x00cef4e0, 0x000d56d8}}, Y: Field{[10]uint32{0x002604e2, 0x011bd0ff, 0x031b1ed1, 0x02baed13, 0x034fc01d, 0x02d4fedc, 0x020eaaac, 0x03ec417f, 0x023bb277, 0x001fd1e2}}}, + {X: Field{[10]uint32{0x03f7f37f, 0x039efcf5, 0x01705dfc, 0x02465d0e, 0x01ea9660, 0x00478406, 0x0389bb1c, 0x01110b84, 0x014f21ad, 0x001daffc}}, Y: Field{[10]uint32{0x0289d763, 0x01a95260, 0x0307b93f, 0x03e2488f, 0x02a29a34, 0x0308b80b, 0x034da79b, 0x02ac4ad7, 0x0291376a, 0x000e1568}}}, + {X: Field{[10]uint32{0x0156b454, 0x023e2d98, 0x021dbfa0, 0x02ffe88b, 0x02becbb4, 0x01620ce5, 0x023aadd3, 0x01e8edf8, 0x00df1057, 0x00246ee7}}, Y: Field{[10]uint32{0x00edbb91, 0x0333c965, 0x01a1ef2c, 0x010b0b2a, 0x00a3edea, 0x005846d7, 0x0053e93d, 0x026c0bb7, 0x039e4f14, 0x003b1b2e}}}, + {X: Field{[10]uint32{0x00865562, 0x00c4296a, 0x02537f8c, 0x01f53acc, 0x010a7dde, 0x003116c2, 0x0081204f, 0x01b184d9, 0x010f1ba8, 0x002795ac}}, Y: Field{[10]uint32{0x028aa67c, 0x010d8756, 0x022d516f, 0x02bc3461, 0x028b523e, 0x027ba31a, 0x03ca1a37, 0x0305b122, 0x013d8552, 0x00337cd1}}}, + {X: Field{[10]uint32{0x008e09f9, 0x0125cb66, 0x00af500f, 0x01d53a69, 0x01a11dcb, 0x00e4c15c, 0x02e28a42, 0x01af7939, 0x014daf28, 0x00139cd6}}, Y: Field{[10]uint32{0x018a36e7, 0x02d47c51, 0x02418cd1, 0x014c20a2, 0x01af0d8e, 0x0289d00d, 0x03d812ce, 0x010b3b80, 0x03d070c0, 0x002967c8}}}, + {X: Field{[10]uint32{0x0123d860, 0x02b254ce, 0x01bb1d9f, 0x01cc12c4, 0x00393d59, 0x032cb185, 0x01d3c557, 0x0227e9a4, 0x03f7e92d, 0x00055bf7}}, Y: Field{[10]uint32{0x013b360b, 0x03ac04e8, 0x032ee620, 0x033408c4, 0x00bff653, 0x0199408f, 0x02d68f64, 0x01d833bd, 0x0237c448, 0x0013a4a5}}}, + {X: Field{[10]uint32{0x028ea03b, 0x0029f9eb, 0x0356998b, 0x01487e24, 0x0170d23d, 0x00f4d36e, 0x017a9052, 0x008cd975, 0x0250eb37, 0x003cb22d}}, Y: Field{[10]uint32{0x001a7881, 0x010aa1c6, 0x0183d72f, 0x031d9ce5, 0x00204488, 0x002f7a7b, 0x03422a56, 0x026fda5c, 0x031484a9, 0x002f66b0}}}, + {X: Field{[10]uint32{0x0351e3e3, 0x01399eb1, 0x0316cd4a, 0x028806b8, 0x0288d526, 0x01ee05ae, 0x01bb92ba, 0x01d0c17d, 0x0257a4a3, 0x0009f74d}}, Y: Field{[10]uint32{0x03be3304, 0x019092e0, 0x00e8c022, 0x0007df61, 0x008a756b, 0x03fa5d79, 0x03af3d51, 0x029005ab, 0x01d3c0fa, 0x0022033f}}}, + {X: Field{[10]uint32{0x03b3d1bc, 0x013c58fa, 0x037081c6, 0x020b099c, 0x037a3901, 0x03312dfc, 0x00c5d981, 0x00d5f00f, 0x020c19f7, 0x003db097}}, Y: Field{[10]uint32{0x0289e43d, 0x039f08a3, 0x03c2f183, 0x014ab7cd, 0x01295341, 0x010ecd62, 0x0144d666, 0x0283e8e6, 0x03ea7c05, 0x0023202c}}}, + {X: Field{[10]uint32{0x03fad4f2, 0x02b1fd29, 0x01f45087, 0x0015c5bf, 0x02ae2803, 0x0274dd84, 0x02847d3d, 0x017a87a8, 0x000c7130, 0x00319e20}}, Y: Field{[10]uint32{0x000b63c6, 0x0127a21b, 0x022d92d5, 0x00e7c41b, 0x0055d41d, 0x02fabd76, 0x0349a42e, 0x00ae3376, 0x03f4d2fb, 0x002f97fe}}}, + {X: Field{[10]uint32{0x03f6d560, 0x0244ba04, 0x03d30931, 0x037e816f, 0x02f98177, 0x023c347b, 0x01e2d3a6, 0x01de1bf2, 0x0221e66b, 0x003cd76c}}, Y: Field{[10]uint32{0x003f29fa, 0x01f30039, 0x007c7bb6, 0x0054da9f, 0x0209eccb, 0x03f96c7b, 0x0174ca5a, 0x00810226, 0x00080e6b, 0x0012266a}}}, + {X: Field{[10]uint32{0x03e69de9, 0x00718e64, 0x00debd02, 0x0013101d, 0x035d944f, 0x00ce2230, 0x01843d6c, 0x018cfb6e, 0x037da915, 0x000ae4f8}}, Y: Field{[10]uint32{0x030522f0, 0x034f2212, 0x001676f2, 0x017f1c94, 0x00366a4a, 0x004c83bf, 0x0372a58f, 0x0287324f, 0x0095c6ff, 0x003acf44}}}, + {X: Field{[10]uint32{0x02091b69, 0x02407459, 0x02331060, 0x02522c52, 0x03e4875b, 0x03f6d01b, 0x01913ab0, 0x011c5bd4, 0x03b39045, 0x00206008}}, Y: Field{[10]uint32{0x0227e7b1, 0x039130a8, 0x00990f98, 0x0227e9f6, 0x026fe573, 0x00e393cb, 0x01af3e1f, 0x03911c31, 0x018a6224, 0x002cfd5c}}}, + {X: Field{[10]uint32{0x00662bb6, 0x00fc180f, 0x001fbdb3, 0x01ec84f7, 0x006645ce, 0x016c5061, 0x02e565b6, 0x029a76ca, 0x026a244c, 0x000059db}}, Y: Field{[10]uint32{0x022e0298, 0x028c7ee0, 0x001fdcf4, 0x026c5bb3, 0x01aeb968, 0x034b1f03, 0x03208300, 0x0177049a, 0x03a5deef, 0x00223872}}}, + {X: Field{[10]uint32{0x00298d54, 0x00b2c877, 0x02e4c391, 0x0150c38c, 0x01d96574, 0x008f8bc8, 0x0229d733, 0x00df78e1, 0x01a1a925, 0x0000be4c}}, Y: Field{[10]uint32{0x030ef904, 0x0077eba8, 0x03ccc52e, 0x03442f6e, 0x0195a5b2, 0x015899c4, 0x036fe43f, 0x003ebbbb, 0x01086fbc, 0x0024ca4b}}}, + {X: Field{[10]uint32{0x01fd0279, 0x01cc3228, 0x001af2d1, 0x03044898, 0x02be8a32, 0x013d1521, 0x03f20d9b, 0x0232462f, 0x0212f0dd, 0x001ee935}}, Y: Field{[10]uint32{0x02401179, 0x00d39e34, 0x00310d02, 0x0316f131, 0x013018e3, 0x0334126a, 0x0220af14, 0x0190c6cb, 0x02a1f5b0, 0x0022ab5e}}}, + {X: Field{[10]uint32{0x001d5e78, 0x01aa9872, 0x023d8528, 0x00233323, 0x03d6974d, 0x008de67a, 0x039b2be7, 0x01ea45a9, 0x02b085fe, 0x0003a37e}}, Y: Field{[10]uint32{0x023f926c, 0x02ead01b, 0x0181c37d, 0x00eec637, 0x00fbaec5, 0x01521eee, 0x0195d47a, 0x02d55b99, 0x006e519d, 0x0008485a}}}, + {X: Field{[10]uint32{0x0184ab5e, 0x02432683, 0x0264c94c, 0x028554d6, 0x02ea751d, 0x01facb9a, 0x01071061, 0x01fbd1be, 0x03bcb159, 0x001f5588}}, Y: Field{[10]uint32{0x00ce7575, 0x0372f0a8, 0x037e4204, 0x0351759a, 0x00701b3c, 0x02f8ba2e, 0x0114b70e, 0x031378c5, 0x03318004, 0x003718e7}}}, + {X: Field{[10]uint32{0x00a7ffa3, 0x03213ee2, 0x02ad57b9, 0x005a0778, 0x001e4ac9, 0x00ee0880, 0x0186194b, 0x02fb1d22, 0x022d8074, 0x00023a07}}, Y: Field{[10]uint32{0x019fa890, 0x02052641, 0x03e6cdc7, 0x026a37e4, 0x03fa94e9, 0x018b40fd, 0x016f6cf7, 0x01120329, 0x001df4a3, 0x0010217b}}}, + {X: Field{[10]uint32{0x028da71e, 0x034ea169, 0x0052b53e, 0x0324ad73, 0x0173e68a, 0x01a71a0a, 0x018affd1, 0x03b98978, 0x03e78290, 0x002a7568}}, Y: Field{[10]uint32{0x00805fd6, 0x026f92ad, 0x02536ee8, 0x0083391e, 0x028d6e8b, 0x01e4ce22, 0x009ed298, 0x01622546, 0x016bf9eb, 0x000736ab}}}, + {X: Field{[10]uint32{0x03dba2cd, 0x02c48f15, 0x00497d64, 0x03c391ab, 0x00984985, 0x00c4be12, 0x037b3134, 0x01f0380e, 0x03cabcda, 0x0013df05}}, Y: Field{[10]uint32{0x034a25d7, 0x02d72a28, 0x00f5e888, 0x002a6eaa, 0x00c87701, 0x0141c334, 0x00be7c1d, 0x0030efcf, 0x01d95f47, 0x002182fb}}}, + {X: Field{[10]uint32{0x03a64921, 0x02ec2ae7, 0x025b5b4f, 0x00f14d5c, 0x01034b8c, 0x0155cd3a, 0x01bd016f, 0x029ee6a4, 0x017a9234, 0x0011e3cf}}, Y: Field{[10]uint32{0x00051a1f, 0x02d364ee, 0x021018ff, 0x015360fc, 0x003f2530, 0x0087a69f, 0x02bca05c, 0x00fc63ae, 0x0394f025, 0x0036e5e8}}}, + {X: Field{[10]uint32{0x027963d5, 0x014bac7f, 0x02329f25, 0x02ad87ee, 0x033ea09a, 0x007685e7, 0x037cc01b, 0x01b9f5a7, 0x017b73d9, 0x002b39f9}}, Y: Field{[10]uint32{0x02908918, 0x03bee249, 0x0211b796, 0x013040c1, 0x017e213e, 0x03809659, 0x010f824b, 0x02f413b2, 0x01f22b8d, 0x003e8094}}}, + {X: Field{[10]uint32{0x0108d1fd, 0x001039ea, 0x01f24374, 0x03e28742, 0x034401f2, 0x0337da7b, 0x013757cd, 0x001dc609, 0x0067f517, 0x003355ba}}, Y: Field{[10]uint32{0x03338fe1, 0x012ee89f, 0x03b90a45, 0x02109ded, 0x0183e4bd, 0x03d8831f, 0x02b29a22, 0x002e9228, 0x021652cf, 0x0021e3dc}}}, + {X: Field{[10]uint32{0x024d5329, 0x00f944fb, 0x03e33e92, 0x01cae819, 0x0167a2c6, 0x01ec9769, 0x031dd249, 0x03e26992, 0x025cd9d2, 0x000c10ba}}, Y: Field{[10]uint32{0x0268b1fb, 0x03906cd6, 0x0261281c, 0x021a3817, 0x02d3fa1d, 0x01b489e8, 0x028568cd, 0x01a85282, 0x0144d551, 0x0002e130}}}, + {X: Field{[10]uint32{0x02712ec0, 0x0147b267, 0x03f1bce3, 0x02455ebc, 0x0130a2e2, 0x02be80d1, 0x002b042b, 0x03b49802, 0x008da094, 0x00015782}}, Y: Field{[10]uint32{0x026b33e9, 0x03274bb1, 0x01db2082, 0x037e0b54, 0x0100caca, 0x00531512, 0x00919335, 0x020c9258, 0x017f6439, 0x0031be0a}}}, + {X: Field{[10]uint32{0x03408966, 0x02d1a44e, 0x01875e63, 0x020fbb5c, 0x01e0e0da, 0x0295e83a, 0x03f91817, 0x024ef28d, 0x013a69dd, 0x002f4b6c}}, Y: Field{[10]uint32{0x01b0da2d, 0x029d0a82, 0x00cf8078, 0x0391016e, 0x00187ee6, 0x03d96cfe, 0x03c25d50, 0x026cbc48, 0x0260f948, 0x0011b849}}}, + {X: Field{[10]uint32{0x03d3d210, 0x0158939f, 0x03ecb609, 0x006661a9, 0x00ef7c52, 0x013b4685, 0x02678e62, 0x0211557f, 0x0110cdbb, 0x001f5e94}}, Y: Field{[10]uint32{0x02c6c37c, 0x01d2965a, 0x00867727, 0x03680570, 0x00626a46, 0x02ea9281, 0x019d640a, 0x011493e0, 0x01c3c0a5, 0x003255e3}}}, + {X: Field{[10]uint32{0x037a3fa7, 0x02cc3d24, 0x037825bd, 0x00a406f5, 0x02fd4e6d, 0x013b6af1, 0x01669813, 0x004d50aa, 0x0317513b, 0x0007bc48}}, Y: Field{[10]uint32{0x010e1ade, 0x012276d6, 0x00039909, 0x02651a13, 0x01123198, 0x01aa327e, 0x011cee33, 0x02f3bcd1, 0x0288a391, 0x0038392d}}}, + {X: Field{[10]uint32{0x0206baaf, 0x00c33a85, 0x01d1949d, 0x021a2e68, 0x029f463b, 0x00cb4bc4, 0x02c6b2e3, 0x02e5db6f, 0x0003766f, 0x003bfe81}}, Y: Field{[10]uint32{0x001cb082, 0x00877bef, 0x003c2382, 0x03116d28, 0x03b0cbfd, 0x0280f785, 0x00de1b7d, 0x03e993ce, 0x0083bf3e, 0x002316c7}}}, + {X: Field{[10]uint32{0x0087d65c, 0x03699868, 0x02069df5, 0x0036743a, 0x0320bf78, 0x01cebd6f, 0x025f0222, 0x02810955, 0x01e976a9, 0x0037249c}}, Y: Field{[10]uint32{0x023d6063, 0x033629ad, 0x010c1944, 0x01f18852, 0x0055ce7c, 0x031ceddb, 0x02f11bb1, 0x034c3261, 0x01e7b27b, 0x0037219e}}}, + {X: Field{[10]uint32{0x00264619, 0x02ad052e, 0x031b2384, 0x024c0376, 0x02a1336b, 0x01d54075, 0x00f69462, 0x0280b086, 0x01c21e1c, 0x0002b877}}, Y: Field{[10]uint32{0x01b26b48, 0x03d0881f, 0x0076a01f, 0x0326a21f, 0x0332466b, 0x026a9db5, 0x00e5c8e1, 0x018497b2, 0x039d300b, 0x000871ac}}}, + {X: Field{[10]uint32{0x0282cf5b, 0x0338ead3, 0x00a1285c, 0x0226fcaf, 0x01033dd9, 0x00c5918d, 0x00924808, 0x00d724ae, 0x000ffe58, 0x002ba8b0}}, Y: Field{[10]uint32{0x03dfa97f, 0x0064eca4, 0x029673e8, 0x035014ee, 0x039aad65, 0x019c2c64, 0x0220e84e, 0x0184490a, 0x00cf935a, 0x00185566}}}, + {X: Field{[10]uint32{0x02ebf696, 0x02322fa2, 0x0066b634, 0x00f98db2, 0x01b45e72, 0x02451d9f, 0x01b30b65, 0x00ea1bd5, 0x021634b4, 0x00244f43}}, Y: Field{[10]uint32{0x01971a9f, 0x01e9710e, 0x00305148, 0x00385235, 0x0039c0c1, 0x00c5c809, 0x02574af4, 0x03f69340, 0x020751af, 0x00385319}}}, + {X: Field{[10]uint32{0x03c26fc0, 0x0094b48e, 0x0005a301, 0x00f621e3, 0x0040fc16, 0x02ec3e72, 0x00d61916, 0x02b20178, 0x0354775c, 0x0013c2cc}}, Y: Field{[10]uint32{0x018da1e3, 0x03f0fcef, 0x01ac3fa8, 0x01ddba15, 0x016c0e10, 0x03cf897c, 0x02eb2eb5, 0x03f7e0e9, 0x00863aed, 0x002c2dd5}}}, + {X: Field{[10]uint32{0x0316129d, 0x028f693c, 0x0083b181, 0x02583e02, 0x02f469df, 0x03197ab4, 0x033b2f75, 0x025e3dd9, 0x014073cc, 0x00176886}}, Y: Field{[10]uint32{0x02f311d1, 0x03051663, 0x031eaf3b, 0x036d8a16, 0x030237b1, 0x0067ad50, 0x00d5e63e, 0x0099c15c, 0x0080743d, 0x002145b4}}}, + {X: Field{[10]uint32{0x03e74a23, 0x03bbb45a, 0x0163dd4b, 0x00c89a74, 0x02a8fbc1, 0x00d0134d, 0x0392fb46, 0x03e46b32, 0x0330ca7a, 0x001db86c}}, Y: Field{[10]uint32{0x027f5326, 0x02b83787, 0x02791bca, 0x000000c6, 0x0002ce28, 0x03fe837b, 0x016f2e52, 0x023bcfb2, 0x0253c590, 0x00042ce4}}}, + {X: Field{[10]uint32{0x02393e64, 0x025d743b, 0x01be1d76, 0x015d9c77, 0x018fe8ef, 0x022c8cd6, 0x03912637, 0x003b860b, 0x008b2f21, 0x00312f92}}, Y: Field{[10]uint32{0x0379f449, 0x01389c2e, 0x02aee10d, 0x01c3e01f, 0x00b910cd, 0x02632809, 0x00beadcb, 0x02695120, 0x012fa1a0, 0x002fb04e}}}, + {X: Field{[10]uint32{0x0333ff37, 0x00329724, 0x0254256d, 0x000134da, 0x0025f5be, 0x00f58230, 0x0313848d, 0x03f5dec7, 0x018da141, 0x000151a4}}, Y: Field{[10]uint32{0x01914ac7, 0x008fa3ce, 0x004dcc2d, 0x02920cdc, 0x03b0b82b, 0x033e686f, 0x0300d716, 0x02f86973, 0x00c79684, 0x0000f475}}}, + {X: Field{[10]uint32{0x026078de, 0x03065809, 0x0210a320, 0x02c6719f, 0x002e6df8, 0x023fc3d0, 0x03368b09, 0x03af44b7, 0x03c42c51, 0x00337f1b}}, Y: Field{[10]uint32{0x0189cb0d, 0x02f81a3f, 0x0063c0fe, 0x0046dbdd, 0x03c26894, 0x02cddd3c, 0x03bef456, 0x01499151, 0x0130023e, 0x0016617a}}}, + {X: Field{[10]uint32{0x00f03034, 0x02ef351f, 0x00e99c99, 0x012d1c63, 0x02036f0e, 0x01023851, 0x021eec62, 0x005281bc, 0x00cc593b, 0x001dcc3f}}, Y: Field{[10]uint32{0x02016b72, 0x023e644f, 0x0001ccc2, 0x02ddbe5c, 0x0152beac, 0x024aa9f7, 0x030151b4, 0x03904a70, 0x03e20736, 0x003c5f43}}}, + {X: Field{[10]uint32{0x0141b3ea, 0x01acd51e, 0x03090572, 0x02a57eb7, 0x01d855a7, 0x03e256f1, 0x00c7b559, 0x0023d19d, 0x03de4743, 0x0022a930}}, Y: Field{[10]uint32{0x00b8594d, 0x0357dc57, 0x018be7db, 0x01085432, 0x0278d9da, 0x03d00fb4, 0x034ae9ad, 0x00988c6f, 0x004a0eac, 0x003c9d71}}}, + {X: Field{[10]uint32{0x0325bb79, 0x01534434, 0x0313c5cb, 0x0375e156, 0x01f32d33, 0x02250124, 0x036f87ff, 0x03a49625, 0x01a497a4, 0x0005649b}}, Y: Field{[10]uint32{0x03ce8e51, 0x03c5b619, 0x00d40d35, 0x01e20a20, 0x001aa03c, 0x0327dc6e, 0x031bf67e, 0x02fea3a1, 0x00b65b1e, 0x00056b18}}}, + {X: Field{[10]uint32{0x01b1710d, 0x02bbaf7d, 0x02dbb35f, 0x01175159, 0x02fc99f5, 0x00005a23, 0x0062b48f, 0x0055d1e5, 0x00feaa74, 0x00157d3d}}, Y: Field{[10]uint32{0x0302d15f, 0x01486d2e, 0x03e0f662, 0x02b6db8f, 0x03d015a4, 0x01f7fb0f, 0x027b8945, 0x0132139d, 0x020563f2, 0x00203b3a}}}, + {X: Field{[10]uint32{0x00e93cee, 0x00dfda38, 0x03e0d0b1, 0x035d335c, 0x02f04a60, 0x0136ccdf, 0x0357c4ae, 0x01fccfe8, 0x02cf402f, 0x0025695a}}, Y: Field{[10]uint32{0x036501fd, 0x0086d3bb, 0x021a4bd5, 0x038f396d, 0x01d21c89, 0x00c326b9, 0x034e72ca, 0x02ea105b, 0x01bfb7c9, 0x0039c901}}}, + {X: Field{[10]uint32{0x027a2aac, 0x02206ae3, 0x03cd64b0, 0x03fc1266, 0x03c2a697, 0x00daa5e0, 0x0034b7bc, 0x01eed44c, 0x0190b50d, 0x000a2a7f}}, Y: Field{[10]uint32{0x0394a788, 0x00fea8e5, 0x01720b58, 0x03d453e8, 0x01a37cfa, 0x005421e0, 0x02635968, 0x01fa9268, 0x01b05c7e, 0x001dac54}}}, + {X: Field{[10]uint32{0x0334b672, 0x03e97bf9, 0x0393cb36, 0x034e6736, 0x00b571e2, 0x02b0e3ac, 0x0116b93e, 0x018b1290, 0x01136d64, 0x001901b7}}, Y: Field{[10]uint32{0x01d7fd1e, 0x03a8d617, 0x0274fdef, 0x006a5df6, 0x01b4c5eb, 0x00aa447e, 0x019c9d06, 0x0398514b, 0x037b92b8, 0x000e5d31}}}, + {X: Field{[10]uint32{0x01066529, 0x022d99bc, 0x003c2e3c, 0x01f8dd9c, 0x029d40c3, 0x024cdd1f, 0x03ef9039, 0x03870253, 0x023fcb62, 0x0023f63c}}, Y: Field{[10]uint32{0x014ab5c8, 0x003815c3, 0x02baf310, 0x004c8244, 0x025ba190, 0x016498a5, 0x029099d7, 0x005d6c92, 0x039bde10, 0x0022c2cb}}}, + {X: Field{[10]uint32{0x03a1a24b, 0x03bb0558, 0x023cc3e0, 0x02acb49c, 0x03cc525b, 0x02325390, 0x00679bdc, 0x01cda270, 0x022bd445, 0x00145e02}}, Y: Field{[10]uint32{0x00e01109, 0x000fe8bc, 0x03dfc646, 0x028cd4c3, 0x014b6b08, 0x024e4713, 0x006e5db2, 0x02347b1d, 0x019b0e17, 0x001409b3}}}, + {X: Field{[10]uint32{0x00283561, 0x02d0aa63, 0x01065bee, 0x00d1a123, 0x025b8c85, 0x0364e772, 0x02fe0e5c, 0x03e6fcf4, 0x013ae7c7, 0x002a8052}}, Y: Field{[10]uint32{0x00da82d9, 0x0220440b, 0x030f0e9e, 0x0022cf84, 0x021783e9, 0x006678f4, 0x023af145, 0x02d78d91, 0x03454a42, 0x002823c2}}}, + {X: Field{[10]uint32{0x00ceab70, 0x029814c6, 0x01afb97f, 0x035065b3, 0x010e4456, 0x01a89fa0, 0x001c4fad, 0x039b52b2, 0x0349d4bb, 0x003362ad}}, Y: Field{[10]uint32{0x01f59beb, 0x00bc6e17, 0x01231da3, 0x020ec14a, 0x01ca8621, 0x0335eb4f, 0x01c92493, 0x02883780, 0x0339bd68, 0x003f1b1d}}}, + {X: Field{[10]uint32{0x01fe3e32, 0x02fb1715, 0x027eae00, 0x03871668, 0x02379f56, 0x002ed221, 0x017bc54e, 0x014079e8, 0x02f2e824, 0x0039a737}}, Y: Field{[10]uint32{0x02c41cd4, 0x03616362, 0x03c80f41, 0x0399b12e, 0x013fe735, 0x018a45e4, 0x0125338f, 0x014e6040, 0x01104037, 0x0003a03b}}}, + {X: Field{[10]uint32{0x03ff8a8d, 0x00623836, 0x004a2f30, 0x01a5e406, 0x00f6b6ec, 0x038c6073, 0x0308af19, 0x007dfbbe, 0x02d9182b, 0x0016939c}}, Y: Field{[10]uint32{0x01f9da19, 0x0049408b, 0x00bee2d9, 0x0189ed6c, 0x017b62ea, 0x02b0ce97, 0x031c5885, 0x015f60ec, 0x03f2d5a8, 0x000b473d}}}, + {X: Field{[10]uint32{0x00984a2b, 0x00f46d7e, 0x0330a8f2, 0x01517740, 0x020d78f1, 0x024829e7, 0x00416b03, 0x01884504, 0x005948bd, 0x00278002}}, Y: Field{[10]uint32{0x008e3f62, 0x00459d32, 0x03338db6, 0x01683634, 0x00151ab8, 0x036c37f2, 0x030680ce, 0x03f4f308, 0x00920412, 0x000dab81}}}, + {X: Field{[10]uint32{0x018bc6ff, 0x00bc84c9, 0x00d18ac8, 0x0217c2f2, 0x0399f884, 0x03a90971, 0x02d35d4a, 0x021cd3b2, 0x03aeb12f, 0x001f82e5}}, Y: Field{[10]uint32{0x01f3946e, 0x01902d5a, 0x037bccc7, 0x01011a4b, 0x00ab95fb, 0x02c2db97, 0x003b0b8a, 0x006da8ff, 0x0224a4be, 0x0039dbd3}}}, + {X: Field{[10]uint32{0x01038ee2, 0x00cdb198, 0x00c860b9, 0x039606f8, 0x02b3064b, 0x019e1e3e, 0x0281ff28, 0x03125772, 0x00fb1bdf, 0x00188a17}}, Y: Field{[10]uint32{0x009b5161, 0x013705e1, 0x024f771f, 0x0360869b, 0x00a65ca8, 0x03c56775, 0x0285ea08, 0x03a7cd03, 0x03e45f60, 0x003cb246}}}, + {X: Field{[10]uint32{0x02c82623, 0x03c49aa9, 0x00ac8006, 0x02ebbbcf, 0x00cd3765, 0x01b57067, 0x01870ef3, 0x02d735a6, 0x02812de1, 0x001c08d3}}, Y: Field{[10]uint32{0x01330736, 0x00e6ee10, 0x036ec071, 0x01a43f56, 0x023140f7, 0x0011ce2e, 0x03f3c920, 0x029ddc98, 0x018a0f92, 0x0038b6fe}}}, + {X: Field{[10]uint32{0x015db07d, 0x025e29f3, 0x025e6136, 0x0399fd2f, 0x037dc1b4, 0x010d2c29, 0x0240ef57, 0x035737b7, 0x00618f31, 0x002b9dc1}}, Y: Field{[10]uint32{0x013d16e6, 0x034fa4f6, 0x03b01d46, 0x004a5459, 0x005cc43e, 0x001d00df, 0x0120e420, 0x01121cfd, 0x01646558, 0x00293894}}}, + {X: Field{[10]uint32{0x006f2b53, 0x0126dbc9, 0x026049e3, 0x039f590f, 0x005b7f4c, 0x01a39825, 0x02b78fb7, 0x01a62d22, 0x008fe4db, 0x0033b1eb}}, Y: Field{[10]uint32{0x025fadfb, 0x01b4006d, 0x03c325ca, 0x03d2035a, 0x017f5d3c, 0x0293f20c, 0x03bfd2a7, 0x001a150c, 0x01459933, 0x001246ed}}}, + {X: Field{[10]uint32{0x005eee36, 0x013571df, 0x006658db, 0x033f0bfe, 0x010852e4, 0x01588a5e, 0x02f62e83, 0x03927c9d, 0x0296b051, 0x002009db}}, Y: Field{[10]uint32{0x002f6d9d, 0x035f713d, 0x0330cf06, 0x0394dccf, 0x002c4d4c, 0x03dd44e9, 0x00d526e5, 0x0227c21c, 0x02968825, 0x003d4435}}}, + {X: Field{[10]uint32{0x0285b27d, 0x0110c5f6, 0x02741b89, 0x03260af6, 0x00e9e351, 0x03e3e142, 0x0163934e, 0x03eabb98, 0x03d49d85, 0x002c6409}}, Y: Field{[10]uint32{0x0247a824, 0x02ecdcba, 0x002d6dba, 0x0048815d, 0x028439f8, 0x00bac10b, 0x038443af, 0x039a72cd, 0x01cbdec0, 0x00304918}}}, + {X: Field{[10]uint32{0x030c792c, 0x0016cb95, 0x0308129e, 0x01bfef10, 0x01989c65, 0x02b851fc, 0x013fc78a, 0x0300074f, 0x014acf07, 0x0015d667}}, Y: Field{[10]uint32{0x018514b0, 0x02ef7100, 0x03a23f13, 0x03ce4042, 0x0238b57a, 0x02d2d3c0, 0x00e181b1, 0x02e85b86, 0x020fd215, 0x00173e3a}}}, + {X: Field{[10]uint32{0x02e6e4b7, 0x01b9063a, 0x01490bad, 0x0230ac1f, 0x00306e6f, 0x014f9d8f, 0x03cda2b6, 0x002e0b14, 0x0283fa11, 0x0016add8}}, Y: Field{[10]uint32{0x015e8ea0, 0x00deaead, 0x02884f74, 0x01c9058a, 0x03aebe82, 0x00decfe0, 0x027de95b, 0x01e38c5e, 0x0243cc2a, 0x003fcd95}}}, + {X: Field{[10]uint32{0x019d4a85, 0x000f9fe5, 0x00898649, 0x03910943, 0x0266ea88, 0x02800c77, 0x012dd45f, 0x035edfa9, 0x01e48602, 0x001ee4f6}}, Y: Field{[10]uint32{0x022b52f0, 0x01474cc5, 0x01099a48, 0x01807cab, 0x030f6dd0, 0x03beb5b0, 0x00f50a0f, 0x007fa428, 0x02015ab9, 0x0026732c}}}, + {X: Field{[10]uint32{0x0396ebb6, 0x038b38be, 0x00a9307e, 0x0086e584, 0x011de26a, 0x02cded2e, 0x0101be72, 0x009dd904, 0x00b6af64, 0x000b561e}}, Y: Field{[10]uint32{0x00fc585a, 0x012f5f0b, 0x018f547d, 0x01aedf48, 0x00a88706, 0x019c5bcb, 0x00815d94, 0x00013a08, 0x005ddf4b, 0x0004e3b8}}}, + {X: Field{[10]uint32{0x0160af3b, 0x00c9a739, 0x03ee7ac1, 0x03d4e33e, 0x03cf1ccf, 0x039072d5, 0x00a0fce2, 0x00cb6809, 0x0068eebc, 0x000758dc}}, Y: Field{[10]uint32{0x0276eadb, 0x0333f4b0, 0x009ed1b4, 0x0252dfba, 0x02d589a4, 0x0377282b, 0x005ce542, 0x0191159a, 0x01f1a289, 0x001aa4cb}}}, + {X: Field{[10]uint32{0x027de64c, 0x0273c111, 0x029a3947, 0x03bc3fa4, 0x0326a478, 0x0244ac15, 0x0187a680, 0x0048d7cc, 0x036b460e, 0x0020aeae}}, Y: Field{[10]uint32{0x0345647f, 0x00227844, 0x00faff51, 0x0068c9f4, 0x015de43a, 0x013560da, 0x033c11c9, 0x000e5807, 0x0233603d, 0x000ea7d3}}}, + {X: Field{[10]uint32{0x0348090a, 0x01b72a82, 0x01262c27, 0x00d0306e, 0x00a01c51, 0x036ab984, 0x03d899a9, 0x016ff6d8, 0x031d4e71, 0x002ba1b9}}, Y: Field{[10]uint32{0x00fd7b5e, 0x00778a53, 0x02126a30, 0x020e7271, 0x006f2f9e, 0x02d1619e, 0x02c4df93, 0x023deffa, 0x008bfcae, 0x000d592d}}}, + {X: Field{[10]uint32{0x02a413e8, 0x01d0d90a, 0x0000ef57, 0x02f247d0, 0x02664c50, 0x007accad, 0x02d6ad7f, 0x00730fd2, 0x02fbfc66, 0x000d6970}}, Y: Field{[10]uint32{0x02d6cde5, 0x006f33b2, 0x02752711, 0x0249332b, 0x01b901d6, 0x022a0721, 0x00727826, 0x019920f8, 0x01a2887f, 0x0012940a}}}, + {X: Field{[10]uint32{0x0058e2dc, 0x01ac1a56, 0x0360ecbc, 0x0259b1b5, 0x02763244, 0x03494766, 0x027c29ad, 0x00229d87, 0x007f4dd5, 0x000e1afc}}, Y: Field{[10]uint32{0x02407696, 0x006b61f7, 0x01f41e81, 0x008456a0, 0x020f07c6, 0x023ec52c, 0x0103e196, 0x0280e076, 0x00049c1f, 0x00353c52}}}, + {X: Field{[10]uint32{0x02346f96, 0x0379aa84, 0x00909fab, 0x01f32f5c, 0x03f9c46c, 0x02441361, 0x02c445ec, 0x03d33142, 0x001c9bd6, 0x0037fb0e}}, Y: Field{[10]uint32{0x017553f1, 0x033fc09e, 0x03f2e56c, 0x01da922d, 0x03d1ce0f, 0x0365a516, 0x017ef3ca, 0x01926f7e, 0x00f825b6, 0x00179cd1}}}, + {X: Field{[10]uint32{0x002abbb2, 0x0307aa21, 0x00aaa007, 0x000b48d6, 0x02f8a243, 0x03a82ff0, 0x013e0b70, 0x00133152, 0x00c604db, 0x000d81b7}}, Y: Field{[10]uint32{0x0287301d, 0x011f9e15, 0x025edbb5, 0x02c6f880, 0x0387eea8, 0x03b28d99, 0x03569a1f, 0x026dd2e2, 0x003bbc4d, 0x0029721d}}}, + {X: Field{[10]uint32{0x012b0016, 0x014a0979, 0x012b6660, 0x00e239db, 0x00db0860, 0x007464a8, 0x03025a47, 0x025b8a68, 0x0337e190, 0x000d1079}}, Y: Field{[10]uint32{0x01eef0da, 0x02d83de0, 0x01b9e7db, 0x0128de18, 0x015eb9bd, 0x02c8ce8e, 0x003ad47b, 0x032639cf, 0x037ed5ca, 0x0001b443}}}, + {X: Field{[10]uint32{0x02636e99, 0x01504289, 0x03030002, 0x02fd737f, 0x01b1d902, 0x015aa73d, 0x02a7a5c4, 0x0230d2d7, 0x002e460d, 0x002cb25f}}, Y: Field{[10]uint32{0x02057b7c, 0x0227a8f8, 0x02bfa232, 0x007c9c85, 0x021f151e, 0x03da5cf8, 0x03417b3c, 0x03bcc1d4, 0x0081a8c8, 0x0019c4cc}}}, + {X: Field{[10]uint32{0x03e045fd, 0x03054055, 0x01a973b6, 0x02dcf6d1, 0x019b7932, 0x016409ed, 0x03fdabed, 0x00f773e3, 0x018b59a4, 0x0009d02f}}, Y: Field{[10]uint32{0x03b02a85, 0x01e01fa4, 0x0182e1ea, 0x0392c3af, 0x03987aab, 0x0304ddd4, 0x00787a63, 0x006b50b0, 0x02b1f69f, 0x002041bc}}}, + {X: Field{[10]uint32{0x01b6c21b, 0x01597862, 0x009a69ee, 0x01a76331, 0x00aaa8e2, 0x00fe5003, 0x00b4f400, 0x02530336, 0x03d9bdbd, 0x00286b3f}}, Y: Field{[10]uint32{0x02f0235b, 0x0305afc3, 0x00a66df7, 0x03033065, 0x00bcc4fd, 0x03d393d1, 0x00acfbd4, 0x03d4625d, 0x017e0733, 0x0018bb1f}}}, + {X: Field{[10]uint32{0x03349847, 0x007d05d5, 0x00cff630, 0x02f4ccb6, 0x019a5357, 0x00e34eab, 0x038c0f15, 0x012b30c9, 0x02d68d52, 0x00142eca}}, Y: Field{[10]uint32{0x03acfb32, 0x00d4a1fe, 0x03139b85, 0x039659df, 0x02ba4b33, 0x03bc062e, 0x03d4c6e1, 0x009af6e5, 0x03d5d035, 0x00363f0c}}}, + {X: Field{[10]uint32{0x034fdbd9, 0x03420e17, 0x0132ec9f, 0x02823f43, 0x01948e2c, 0x008a2040, 0x035e8601, 0x02d3eb59, 0x02626031, 0x003af7ec}}, Y: Field{[10]uint32{0x000dbf2e, 0x018a69e9, 0x02a0a9c4, 0x010a2546, 0x034f853a, 0x019b8c66, 0x03964e44, 0x0044f76c, 0x026cc470, 0x002c1e01}}}, + {X: Field{[10]uint32{0x018bd48f, 0x022dd0ba, 0x001f63a4, 0x03e05c55, 0x01d57b35, 0x0023f56b, 0x02f73e82, 0x00a8bef7, 0x00236548, 0x00176bd3}}, Y: Field{[10]uint32{0x0287f967, 0x031d728b, 0x0327db2c, 0x03cb08c0, 0x009cbd11, 0x03e8f7fb, 0x03fc83c4, 0x02181fd7, 0x03cb5a24, 0x0024056f}}}, + {X: Field{[10]uint32{0x028533c7, 0x0147327b, 0x0277d085, 0x017cac4a, 0x01238c90, 0x00d4fe09, 0x0219517f, 0x0020519e, 0x00205d84, 0x0008b6e7}}, Y: Field{[10]uint32{0x006dcdf8, 0x01c0e2ce, 0x0231c85f, 0x00a6d811, 0x027ad19e, 0x02e6b3c3, 0x02192642, 0x00a8a28c, 0x03c82343, 0x001a0286}}}, + {X: Field{[10]uint32{0x00c100ae, 0x01ca1875, 0x00d4f4db, 0x016111a5, 0x019fb446, 0x021b9b95, 0x0225213f, 0x02f94649, 0x01d102e8, 0x0010110d}}, Y: Field{[10]uint32{0x011586d1, 0x0213de1b, 0x00f4cb62, 0x016a5078, 0x02dd734e, 0x03e09246, 0x02047768, 0x03bbeba3, 0x0282b321, 0x0027af39}}}, + {X: Field{[10]uint32{0x0037530f, 0x00994cba, 0x009f260c, 0x027331a7, 0x00fe59df, 0x0354b687, 0x0200d1a3, 0x029b7be1, 0x02ff6831, 0x003730db}}, Y: Field{[10]uint32{0x0377a893, 0x0256b307, 0x014d65b7, 0x03fda643, 0x03b6b385, 0x01e159b2, 0x0298c135, 0x02dfa17a, 0x01e67360, 0x0021826d}}}, + {X: Field{[10]uint32{0x001a1514, 0x014f9e67, 0x019a8b43, 0x0101178b, 0x00e991d1, 0x018cf2d2, 0x004cd04c, 0x00e0f929, 0x03941a1c, 0x003bc37e}}, Y: Field{[10]uint32{0x036f6f42, 0x01721abd, 0x006d461e, 0x02f0f8cd, 0x019c3599, 0x01a4fb41, 0x033afabf, 0x017e6adc, 0x0160f2a7, 0x00009a17}}}, + {X: Field{[10]uint32{0x01766b8a, 0x02f14dc7, 0x01b3086a, 0x02eb6758, 0x02410b0f, 0x03299ac1, 0x012e18f2, 0x03bf5ad3, 0x00fdc6c3, 0x00092213}}, Y: Field{[10]uint32{0x00e2267d, 0x01ec5f6b, 0x0119e465, 0x0066a9a1, 0x0086a786, 0x0288f04c, 0x015c6bf8, 0x036a9f4e, 0x008566f3, 0x001f0737}}}, + {X: Field{[10]uint32{0x02cd8b20, 0x01d18c92, 0x01a450de, 0x00219e36, 0x01485b07, 0x0206dbc1, 0x0207756f, 0x012a04b1, 0x0291c700, 0x001506d9}}, Y: Field{[10]uint32{0x01c609d7, 0x0179d931, 0x0117fc7f, 0x037eba61, 0x00cefff3, 0x008e0de1, 0x009f0d50, 0x010a6b1d, 0x03018a3c, 0x0037733c}}}, + {X: Field{[10]uint32{0x01fa822d, 0x0090b068, 0x03b9a138, 0x0322ee76, 0x02f792cf, 0x03c7e0a5, 0x005eea4f, 0x00b8fea4, 0x01696726, 0x0001518a}}, Y: Field{[10]uint32{0x01e6880e, 0x02b6ff88, 0x0218570d, 0x01c043db, 0x03da2d73, 0x02195967, 0x02d8e7f9, 0x02549d3e, 0x02898e42, 0x0018c048}}}, + {X: Field{[10]uint32{0x00848e83, 0x0200833b, 0x01f6d6e1, 0x01241b3a, 0x003ddfd9, 0x001185bf, 0x0122bb97, 0x004a7734, 0x0112ad2c, 0x002501c2}}, Y: Field{[10]uint32{0x0314017b, 0x02e9b66d, 0x01536d1f, 0x03e0ad5c, 0x00b5d261, 0x0169cca9, 0x0101080b, 0x0327c532, 0x00e56bfa, 0x00270ece}}}, + {X: Field{[10]uint32{0x023ca6c9, 0x02e4a95b, 0x020173ed, 0x0180d94e, 0x02ea73b0, 0x00505ee4, 0x028071cc, 0x01987abe, 0x00e48ddc, 0x000a98cc}}, Y: Field{[10]uint32{0x03fc7d79, 0x01d878f0, 0x016f3d8b, 0x00e1ad54, 0x035802bc, 0x02fd3eea, 0x02d56a3f, 0x030d42e8, 0x01cd4754, 0x002ce314}}}, + {X: Field{[10]uint32{0x03f7424d, 0x02c11eb4, 0x00c39dac, 0x0071fbf1, 0x008c418c, 0x03fd69f5, 0x024078c5, 0x03685d6b, 0x00935f95, 0x002450b9}}, Y: Field{[10]uint32{0x0085cd05, 0x022b732e, 0x02ac0e69, 0x01fd629f, 0x0137d0ab, 0x0293e6c1, 0x0284ea55, 0x00cea7a1, 0x0274c471, 0x00054596}}}, + {X: Field{[10]uint32{0x0285804d, 0x03a995b2, 0x0169ad1e, 0x01c9ff2f, 0x000bb8d3, 0x022351fa, 0x0263ef38, 0x0137bb6e, 0x03295cac, 0x000b8662}}, Y: Field{[10]uint32{0x0380fd52, 0x01ae7b19, 0x02e63067, 0x01a07148, 0x00eb3824, 0x02c720c3, 0x02b0c2b1, 0x03fef854, 0x01b3e700, 0x000c7757}}}, + {X: Field{[10]uint32{0x0272f72d, 0x03d4db2c, 0x0264e5a3, 0x038befc0, 0x0032a671, 0x02f66f16, 0x023e52a7, 0x032bebc4, 0x01e9b2ef, 0x002d138d}}, Y: Field{[10]uint32{0x02a43423, 0x005a9696, 0x02b0871c, 0x0304e4d2, 0x03f80c81, 0x0090f992, 0x032b80a1, 0x027f5098, 0x03e3beb3, 0x00235227}}}, + {X: Field{[10]uint32{0x003a3cd7, 0x037d906e, 0x013beefd, 0x02d6439b, 0x00f609f0, 0x008918f7, 0x02cf365c, 0x012db6d7, 0x0101e132, 0x0037266b}}, Y: Field{[10]uint32{0x0111b682, 0x03f921bb, 0x003decf0, 0x02511e81, 0x03a4c1e7, 0x00e4f021, 0x000ad6a4, 0x02fabccb, 0x02ca2fea, 0x002d2d08}}}, + {X: Field{[10]uint32{0x0162a359, 0x03146ebe, 0x0237648f, 0x03f3a8a1, 0x013029eb, 0x021a3d34, 0x02af89bb, 0x0070b73e, 0x038eeb99, 0x00385d20}}, Y: Field{[10]uint32{0x00e7570b, 0x016b4aa8, 0x01ec70c0, 0x018a086a, 0x000238dc, 0x0369731d, 0x031b60a4, 0x0377252e, 0x008727cb, 0x003e0373}}}, + {X: Field{[10]uint32{0x02583d33, 0x00437ea8, 0x0349765d, 0x0062d5a2, 0x014ca21d, 0x02dce7ad, 0x00d79a48, 0x005b510b, 0x018b15bd, 0x0018900d}}, Y: Field{[10]uint32{0x00ec2d00, 0x00f0375b, 0x0013fa61, 0x005b7ccd, 0x01fc5461, 0x0290db54, 0x02d8caa8, 0x01d543b5, 0x014d724e, 0x001ab2c1}}}, + {X: Field{[10]uint32{0x023f8d70, 0x01a0d0b9, 0x007b2e62, 0x01dcb070, 0x02aa61c0, 0x03f4ebde, 0x03a29b4b, 0x02b03d50, 0x00eb560a, 0x0029d5ff}}, Y: Field{[10]uint32{0x000352da, 0x0031033d, 0x0057b39d, 0x01419d25, 0x02b4c074, 0x02f1a880, 0x00713e27, 0x015743ed, 0x02eff808, 0x00161933}}}, + {X: Field{[10]uint32{0x03777bba, 0x02f5044b, 0x008143a1, 0x02602f1d, 0x01d4b1f4, 0x03942746, 0x02e94162, 0x00527640, 0x007357c3, 0x003cdb84}}, Y: Field{[10]uint32{0x03d1993e, 0x02a5a60e, 0x0025a14a, 0x010de3c3, 0x0045f74b, 0x01b0ff92, 0x00d93967, 0x009a4f90, 0x022d139a, 0x003535f6}}}, + {X: Field{[10]uint32{0x024af99a, 0x01a75648, 0x0020b172, 0x013f3125, 0x004a8e0e, 0x0189dfbc, 0x0134949b, 0x003fdc4e, 0x014b55a4, 0x00213bcb}}, Y: Field{[10]uint32{0x01ea73a6, 0x020c2161, 0x03e3e80a, 0x01d9d53b, 0x0260465e, 0x02c759d4, 0x03f2b7a0, 0x01423d97, 0x00b701d3, 0x0015ebff}}}, + {X: Field{[10]uint32{0x03ce7576, 0x01e1e10f, 0x03f4784f, 0x037d022c, 0x0296b046, 0x03fca2eb, 0x02fdca34, 0x03d9b5f7, 0x024b274f, 0x0004e3bd}}, Y: Field{[10]uint32{0x02e1ecf1, 0x021546ff, 0x03d4ced9, 0x004bb929, 0x01dfe979, 0x000c94bb, 0x02010cbd, 0x01f10d04, 0x00e51d51, 0x003af741}}}, + {X: Field{[10]uint32{0x011f318c, 0x032d820f, 0x0189b435, 0x00a38b66, 0x032d4547, 0x01434c15, 0x02a11455, 0x015a4884, 0x03fe2ba0, 0x003a0bc0}}, Y: Field{[10]uint32{0x0012dcda, 0x017d8fd6, 0x010f2eb2, 0x00dd8099, 0x03613b29, 0x028d3848, 0x02aaf1fe, 0x0162064a, 0x03b9cf29, 0x0006469b}}}, + {X: Field{[10]uint32{0x02afb317, 0x02f4b216, 0x0296be44, 0x02630346, 0x00111170, 0x03cd17b0, 0x035fb3e7, 0x01beb1fa, 0x0000676b, 0x0015a9a1}}, Y: Field{[10]uint32{0x031dfb4e, 0x016c33a7, 0x0194903f, 0x03f33874, 0x02f49ff2, 0x03106067, 0x01dcb5f4, 0x02df316e, 0x027a5ae1, 0x000e9060}}}, + {X: Field{[10]uint32{0x001309f5, 0x028f0cb7, 0x010084ef, 0x006b9029, 0x028f735b, 0x007c9982, 0x02fe255e, 0x00f6d3ce, 0x007f1b35, 0x0020bd5d}}, Y: Field{[10]uint32{0x024a0144, 0x02a64189, 0x03bd7dd5, 0x028a933d, 0x03d05f9e, 0x0055caef, 0x007e4c67, 0x03007dfa, 0x0103f4cc, 0x0010ba2e}}}, + {X: Field{[10]uint32{0x02e0cf13, 0x02b5651d, 0x002bb0bf, 0x03040678, 0x0280ef76, 0x01dacc4d, 0x0389e0c3, 0x00659292, 0x0141c47b, 0x002244da}}, Y: Field{[10]uint32{0x002d3f3b, 0x01d4de8b, 0x0221af6f, 0x01641dfd, 0x01d722e6, 0x005df18d, 0x0071bc50, 0x01593fd2, 0x0385fb6a, 0x002ce8a9}}}, + {X: Field{[10]uint32{0x02238909, 0x018297d0, 0x01df1c73, 0x02ee5d9c, 0x010b9954, 0x03bd7628, 0x030cb51e, 0x03d60003, 0x01690c98, 0x00318942}}, Y: Field{[10]uint32{0x018ec724, 0x01cc68c1, 0x01240219, 0x0365ac7b, 0x01552d5b, 0x0065f83a, 0x013f935e, 0x02ac8937, 0x024c915e, 0x0020f40c}}}, + {X: Field{[10]uint32{0x03c7e3b4, 0x0047f523, 0x00184274, 0x02377439, 0x01ad1293, 0x03aa6761, 0x024a481d, 0x00c80119, 0x02d96391, 0x00388e66}}, Y: Field{[10]uint32{0x03c69d47, 0x01537e24, 0x03298f9b, 0x0287ec43, 0x005d8b1f, 0x02270de0, 0x02836ed3, 0x00a388ba, 0x0162beae, 0x00183fff}}}, + {X: Field{[10]uint32{0x0003d959, 0x03e0870c, 0x007b85a1, 0x035f09f3, 0x020a59c5, 0x032345e5, 0x02383d6c, 0x00a64a69, 0x031c186d, 0x00013402}}, Y: Field{[10]uint32{0x02487640, 0x00c9fa33, 0x01cb4687, 0x0375be35, 0x02dd4aa3, 0x002df1f9, 0x01c8ce7a, 0x0067f527, 0x02d127eb, 0x0021d4ba}}}, + {X: Field{[10]uint32{0x0264121e, 0x025ceba4, 0x003185ea, 0x028d6591, 0x00933cbf, 0x02df8712, 0x02548e98, 0x014b246a, 0x03ef8b8b, 0x000d1198}}, Y: Field{[10]uint32{0x014d9efd, 0x02b9d814, 0x02b06dfe, 0x01738bdc, 0x036fe388, 0x02fa959c, 0x017e6240, 0x023bb2e5, 0x01c89dfe, 0x001cf426}}}, + {X: Field{[10]uint32{0x00de6648, 0x0222ef68, 0x019e35c7, 0x0355f28c, 0x03f411d3, 0x02526d3c, 0x03038d47, 0x00aa60cc, 0x004ddbd2, 0x000dffd2}}, Y: Field{[10]uint32{0x00547c67, 0x02b9aa48, 0x00bfba9a, 0x021a0e60, 0x03a45cf0, 0x03b07d70, 0x03b14554, 0x0236074b, 0x014b5161, 0x0015694e}}}, + {X: Field{[10]uint32{0x03556ca5, 0x0256c185, 0x012e14d7, 0x01c035bc, 0x00d2881f, 0x0331b4f6, 0x01339d14, 0x0019ae42, 0x01db0ad5, 0x0033cef3}}, Y: Field{[10]uint32{0x01678a6f, 0x025e91c4, 0x000b13c1, 0x03dc22df, 0x00b61b90, 0x009d8089, 0x020e4023, 0x003c8188, 0x02bc99e2, 0x003849a1}}}, + {X: Field{[10]uint32{0x01a73402, 0x000bb7d7, 0x00d4149f, 0x02852606, 0x03d35e47, 0x00f5d296, 0x00f91101, 0x0346b28e, 0x02e7db8f, 0x00258740}}, Y: Field{[10]uint32{0x01fed240, 0x0014561c, 0x0282a1db, 0x02b7f8be, 0x01765dc8, 0x03fc85fa, 0x0115ca3b, 0x019df059, 0x02acd698, 0x002518ba}}}, + {X: Field{[10]uint32{0x006ec3ba, 0x02be5fad, 0x0135c5e1, 0x00901169, 0x003648b7, 0x01d2052b, 0x0122ca60, 0x02399497, 0x0390574a, 0x0010f98b}}, Y: Field{[10]uint32{0x01939734, 0x01a8d6cf, 0x033a318f, 0x02167b71, 0x03e141dc, 0x00634140, 0x029e20ed, 0x033c5e4d, 0x025617c1, 0x001b7bc2}}}, + {X: Field{[10]uint32{0x03dfdbb7, 0x02001495, 0x0116033b, 0x02d2a58b, 0x020457e4, 0x0237a4ec, 0x02113cf9, 0x000630d4, 0x03799d79, 0x00279a0a}}, Y: Field{[10]uint32{0x0049041b, 0x00fb1754, 0x001e93f2, 0x0153ba6a, 0x01b29833, 0x010174b2, 0x00468a06, 0x018d0e27, 0x0316bfe9, 0x00276e72}}}, + {X: Field{[10]uint32{0x01a1a8b4, 0x021db935, 0x008f9436, 0x0390800b, 0x025f9682, 0x02148064, 0x0222d130, 0x02d676ca, 0x03a78079, 0x001e4061}}, Y: Field{[10]uint32{0x03fa456e, 0x02564b2b, 0x004de17e, 0x0075a981, 0x02ade0ad, 0x01aa39aa, 0x014381e5, 0x00c600d9, 0x0346f6b4, 0x00009722}}}, + {X: Field{[10]uint32{0x00169583, 0x0339557c, 0x02b1d683, 0x030c356e, 0x01662a0d, 0x016887ff, 0x0222d653, 0x012cce67, 0x038a6c74, 0x0024a292}}, Y: Field{[10]uint32{0x026fcf84, 0x01373266, 0x01eaa75d, 0x03d9a1ff, 0x01323d55, 0x03fb21ea, 0x01af7e45, 0x02552f87, 0x0284c064, 0x000947fb}}}, + {X: Field{[10]uint32{0x02084c88, 0x01b0fd2f, 0x03fde6c1, 0x00fa6efe, 0x03a6ffb7, 0x03262e1b, 0x01872de8, 0x00bcb2b1, 0x00da8118, 0x001a13a2}}, Y: Field{[10]uint32{0x036383fe, 0x03c19173, 0x00bb60bf, 0x02c1abee, 0x03ad179e, 0x01d55eac, 0x01ae45ff, 0x018b5648, 0x019dfc9d, 0x0031146d}}}, + {X: Field{[10]uint32{0x01174343, 0x02defe93, 0x02f6cad7, 0x033aa165, 0x038e8166, 0x02526f3a, 0x00ebfa86, 0x02c335ea, 0x0283a403, 0x0022f74b}}, Y: Field{[10]uint32{0x00177172, 0x032f23ea, 0x03bad08c, 0x0167a7bf, 0x03643bb3, 0x03b24df0, 0x0307b2fe, 0x020be1f5, 0x014797f6, 0x001c8830}}}, + {X: Field{[10]uint32{0x02399543, 0x03a02c2f, 0x008b4b69, 0x01a791a5, 0x03b71958, 0x03e487da, 0x0258ef50, 0x01254a14, 0x03216e3c, 0x0030fe8e}}, Y: Field{[10]uint32{0x02ec1796, 0x03b654c2, 0x0310fc8e, 0x0285d22e, 0x015a519c, 0x0009b0b1, 0x00880503, 0x01986ddc, 0x00ed21f6, 0x003ac811}}}, + {X: Field{[10]uint32{0x037e63a2, 0x028e29eb, 0x02b483d6, 0x034b990a, 0x00195a8b, 0x0034d578, 0x01fb0df5, 0x00a564de, 0x0013eb2d, 0x0007018f}}, Y: Field{[10]uint32{0x030f2abb, 0x03d5cde1, 0x02ed7cfc, 0x01d1fd11, 0x02b00428, 0x0310389a, 0x005005c8, 0x027fd9d7, 0x0392d14c, 0x000814e3}}}, + {X: Field{[10]uint32{0x0331d452, 0x006d7803, 0x0399981f, 0x037841f8, 0x016c6086, 0x009f2d4e, 0x002dc6c2, 0x03063d2e, 0x03977b54, 0x00183019}}, Y: Field{[10]uint32{0x0098429a, 0x0157c637, 0x0013b737, 0x03dc2ab3, 0x02ce0e8b, 0x015ebebf, 0x03d2617b, 0x0046cb9b, 0x02c4e3eb, 0x000fd151}}}, + {X: Field{[10]uint32{0x02a36856, 0x03c022ff, 0x01722c0a, 0x00aebc61, 0x03421cdc, 0x008c7b62, 0x0263e90a, 0x01aaef3c, 0x03999225, 0x003f0573}}, Y: Field{[10]uint32{0x0235d798, 0x00d375f1, 0x0197e276, 0x025fd726, 0x00c01dbd, 0x0268efc9, 0x01d46e46, 0x00214dc3, 0x02a4d9c4, 0x002af8d1}}}, + {X: Field{[10]uint32{0x03249454, 0x023f9109, 0x02ee5c6f, 0x01a99649, 0x001a92b0, 0x0322c1ee, 0x00da262b, 0x00eedd0a, 0x01851817, 0x003d850e}}, Y: Field{[10]uint32{0x0301cf84, 0x00f38635, 0x004aab9f, 0x03a6731e, 0x0011fced, 0x02fa397a, 0x001f06d4, 0x01630835, 0x02ef3a25, 0x002c760c}}}, + {X: Field{[10]uint32{0x0261b5f5, 0x0085b73b, 0x00bc7ad5, 0x010c4275, 0x0301f1fd, 0x01a845aa, 0x02685427, 0x02110907, 0x00a96221, 0x0015e516}}, Y: Field{[10]uint32{0x0053e2d8, 0x0352d84b, 0x03e237bd, 0x01365eba, 0x0021274a, 0x00d6fb5c, 0x00c8d461, 0x015f1857, 0x007468c1, 0x000cf959}}}, + {X: Field{[10]uint32{0x01fe62e7, 0x01479e90, 0x023bd8c0, 0x0007f85f, 0x03abab20, 0x038d57a3, 0x0162678f, 0x0104cad5, 0x03dcb080, 0x0018dd54}}, Y: Field{[10]uint32{0x03572dce, 0x005e4826, 0x00d3c319, 0x025a1d38, 0x036989b2, 0x019ee853, 0x026a9511, 0x01b87fc6, 0x01c2ad58, 0x000a2f5b}}}, + {X: Field{[10]uint32{0x0180e2a3, 0x00dc8bad, 0x028ea66c, 0x036d5dfe, 0x0389e99d, 0x03953d60, 0x01ddb923, 0x02156f88, 0x030f6f64, 0x003baef5}}, Y: Field{[10]uint32{0x02fd4d68, 0x021a09cc, 0x00e1dedc, 0x0260f7d8, 0x007c9866, 0x034eb13b, 0x015606ea, 0x000d1529, 0x017915b5, 0x000f46da}}}, + {X: Field{[10]uint32{0x006c56fb, 0x0143909a, 0x01ddb2e3, 0x022db971, 0x023a6e88, 0x01de448d, 0x011135f3, 0x02c769a2, 0x031f2bf4, 0x0013b224}}, Y: Field{[10]uint32{0x02a09bc7, 0x0277c8d5, 0x019f535d, 0x004155a4, 0x003cbab9, 0x02370f8a, 0x03197704, 0x00c1aaf5, 0x02794c2b, 0x00357db1}}}, + {X: Field{[10]uint32{0x02e9730e, 0x03094eaf, 0x001a735b, 0x01733137, 0x018f4937, 0x03f571dc, 0x004deabf, 0x01f9e9f6, 0x0376fc5b, 0x001ad69f}}, Y: Field{[10]uint32{0x03b58af8, 0x0277d910, 0x00b7af8f, 0x02afdab6, 0x039eafb8, 0x006155d5, 0x02562df1, 0x017daac4, 0x01c48fbf, 0x0007a4d7}}}, + {X: Field{[10]uint32{0x02013af7, 0x0391e227, 0x00f27683, 0x03cc8753, 0x035f5b73, 0x01f8a601, 0x024c7591, 0x02562909, 0x01ebf620, 0x000a8c4a}}, Y: Field{[10]uint32{0x01020da4, 0x006487f4, 0x036c689a, 0x00be9b09, 0x01406673, 0x036e2b1f, 0x0346edef, 0x00a2cfe8, 0x01e4c1fc, 0x003a503d}}}, + {X: Field{[10]uint32{0x0328b5ab, 0x03d458ee, 0x02d124c6, 0x00ef120d, 0x0294a872, 0x02fcb209, 0x0307f345, 0x010fcde0, 0x001ce994, 0x00022ffa}}, Y: Field{[10]uint32{0x00433c71, 0x0192b0fc, 0x01348364, 0x01214b99, 0x0087de98, 0x02345de9, 0x028edc26, 0x017ebe5d, 0x0227857e, 0x00162c5b}}}, + {X: Field{[10]uint32{0x02d61be3, 0x00cdef62, 0x00f831c1, 0x024a8143, 0x01054236, 0x03934d5b, 0x039daf3e, 0x0159b4b4, 0x00d9449c, 0x0011e083}}, Y: Field{[10]uint32{0x0152c2e4, 0x03ca3326, 0x026655e5, 0x0232a6ba, 0x011200d3, 0x00bc9d11, 0x02d069d2, 0x02a04001, 0x02032988, 0x001237eb}}}, + {X: Field{[10]uint32{0x01a934e2, 0x03a64855, 0x01131cd6, 0x0149075f, 0x00f9e8dc, 0x0130fbca, 0x01221d88, 0x00d81627, 0x03ce8e45, 0x000b5fc0}}, Y: Field{[10]uint32{0x03ee9c72, 0x00ae3a2d, 0x0043a57a, 0x01c9b5b2, 0x0116a7b2, 0x00a1813e, 0x014d55fe, 0x03ce387c, 0x03c05a39, 0x0021052c}}}, + {X: Field{[10]uint32{0x01d8e37b, 0x008017a6, 0x0267f1dc, 0x01b2cec7, 0x03f5a5b0, 0x02109416, 0x0150d4ee, 0x02321b08, 0x00ec919d, 0x0020e21f}}, Y: Field{[10]uint32{0x02b4c009, 0x03ba5064, 0x03e327a2, 0x039fe620, 0x03fcea9d, 0x03962117, 0x0134fe12, 0x03ab89e3, 0x03cdf5c9, 0x003fb839}}}, + {X: Field{[10]uint32{0x01ca1e24, 0x037c6474, 0x010f3f37, 0x002469ed, 0x00a9d0b7, 0x01970ff8, 0x028c03f5, 0x02eac836, 0x01e1138b, 0x0001467e}}, Y: Field{[10]uint32{0x0261ba9e, 0x0300da86, 0x039eb367, 0x02a6b79a, 0x01ef6cd6, 0x0207a5bd, 0x0231ec07, 0x033908fd, 0x02fe2bff, 0x001935ae}}}, + {X: Field{[10]uint32{0x028fba61, 0x004eb652, 0x02e6c3cd, 0x03998fb7, 0x023946ff, 0x00a4d854, 0x02de2087, 0x01d3a9a6, 0x038f84bc, 0x0020247d}}, Y: Field{[10]uint32{0x030bda1a, 0x00ea7302, 0x02212fe1, 0x03b0e79e, 0x006765fa, 0x01c02aab, 0x03a5d90d, 0x01a23072, 0x018baf84, 0x0006aaa9}}}, + {X: Field{[10]uint32{0x02db3afc, 0x023a5f9e, 0x01bb49ed, 0x00815b35, 0x018388cf, 0x028dbc43, 0x02a53434, 0x015d21f0, 0x000dd3fe, 0x00142af0}}, Y: Field{[10]uint32{0x01ed25ea, 0x00390763, 0x015d68a8, 0x03640eb7, 0x01670fe0, 0x026e76c0, 0x0064f01d, 0x00103ec7, 0x019514b6, 0x002ae2eb}}}, + {X: Field{[10]uint32{0x02a2f110, 0x001dcacd, 0x0131faa2, 0x00b9b44a, 0x0120e572, 0x010dab9d, 0x024f2533, 0x007d12a7, 0x00bb4da0, 0x002a690a}}, Y: Field{[10]uint32{0x034c0c5f, 0x0321141d, 0x037a0557, 0x02da16d0, 0x00f8c226, 0x03e94f88, 0x00f05822, 0x0289b110, 0x021a1830, 0x002e8144}}}, + {X: Field{[10]uint32{0x007a83ce, 0x026c742b, 0x03ecf64e, 0x0396ddd4, 0x01d6948b, 0x0047a668, 0x03fa11b2, 0x0359ddc9, 0x03d46314, 0x0035ebf6}}, Y: Field{[10]uint32{0x00e21d04, 0x02e8734d, 0x008f480a, 0x03e945ca, 0x03ee9b2a, 0x0272d0aa, 0x010ed9d7, 0x012aee8e, 0x017d748a, 0x002d7e2e}}}, + {X: Field{[10]uint32{0x036de265, 0x00aaff66, 0x03a99d62, 0x006b5462, 0x0113f19b, 0x019cab15, 0x0141694b, 0x01119a8f, 0x034cd2b5, 0x000adae0}}, Y: Field{[10]uint32{0x02b9b0d6, 0x033b141e, 0x01df187c, 0x026e24b6, 0x0174ec84, 0x032facb9, 0x01d52dd3, 0x02cf4ab4, 0x0193ddc0, 0x00306489}}}, + {X: Field{[10]uint32{0x016ac8ea, 0x018326ea, 0x025a2513, 0x012c68fb, 0x03f29c34, 0x0270471a, 0x016ef7ea, 0x00fe8c56, 0x034ad7f9, 0x003ce4f3}}, Y: Field{[10]uint32{0x028133e1, 0x03b6ea9e, 0x027ec41b, 0x02ccd78e, 0x01fbfa56, 0x00341849, 0x02480163, 0x033bae43, 0x00a9de67, 0x0013a047}}}, + {X: Field{[10]uint32{0x008f418a, 0x0235d7a7, 0x03c0e084, 0x02f414be, 0x00bbc546, 0x028922a5, 0x03050120, 0x02c95204, 0x02504e14, 0x002f0ee4}}, Y: Field{[10]uint32{0x02a58223, 0x03bcab69, 0x022d9af0, 0x00e31d86, 0x018f5eca, 0x00475e31, 0x013a911f, 0x021f05d9, 0x03c6f8b4, 0x002694ab}}}, + {X: Field{[10]uint32{0x036055c0, 0x019fbbd7, 0x01cec014, 0x00eefdbe, 0x03e71edc, 0x02af6c7d, 0x021e1704, 0x03ee29cc, 0x0273c601, 0x000bd683}}, Y: Field{[10]uint32{0x0153e393, 0x00fd1099, 0x002ebc5a, 0x033c4f65, 0x02b79a5e, 0x03e01c84, 0x01d97f80, 0x00b2c4ee, 0x010d142d, 0x00362ec7}}}, + {X: Field{[10]uint32{0x03a54ae8, 0x00fb4d1c, 0x0215bfa1, 0x01efd72f, 0x018d8d8d, 0x0245b047, 0x01099b96, 0x01a6b213, 0x01e3b4fc, 0x002e0f94}}, Y: Field{[10]uint32{0x023dda5b, 0x00d970b2, 0x02a78f3f, 0x0211b876, 0x01daeb7a, 0x01f3f094, 0x0018084a, 0x00e48c88, 0x038869c5, 0x0008cb83}}}, + {X: Field{[10]uint32{0x03516377, 0x026902f9, 0x00c0ea24, 0x00c16423, 0x00e90e9b, 0x03ba2416, 0x032b3722, 0x01e8c854, 0x019350b0, 0x000425c6}}, Y: Field{[10]uint32{0x020a1055, 0x025adb96, 0x03f672c7, 0x03e7395b, 0x010dc735, 0x00c21e67, 0x023a3a5e, 0x0168126f, 0x027c7bd5, 0x001a682d}}}, + {X: Field{[10]uint32{0x005c4477, 0x009e88fa, 0x01647dcb, 0x0053051a, 0x02622508, 0x000a6774, 0x0171711a, 0x014063cf, 0x035cc95d, 0x0036fbbd}}, Y: Field{[10]uint32{0x00d66413, 0x01daa422, 0x0175335e, 0x038c72fe, 0x00676311, 0x03148dfe, 0x02a68556, 0x013e38ae, 0x02cd1633, 0x003751c4}}}, + {X: Field{[10]uint32{0x03af114f, 0x0201b55a, 0x00d29d96, 0x02239328, 0x03027238, 0x00ded043, 0x0005f185, 0x03a4e3cd, 0x01992bde, 0x000a32c4}}, Y: Field{[10]uint32{0x001e5aa3, 0x03afd2fa, 0x03fea695, 0x01b30a95, 0x01c3e2ef, 0x00e973a2, 0x029fc1e8, 0x0376078e, 0x03febbe5, 0x00039b18}}}, + {X: Field{[10]uint32{0x029f60ba, 0x02e8b893, 0x02da3790, 0x016b919d, 0x00caef38, 0x0273b175, 0x039f1768, 0x03a67997, 0x030b64ef, 0x003c28b7}}, Y: Field{[10]uint32{0x007a4519, 0x02db4520, 0x01a85713, 0x0081ef3c, 0x02006a25, 0x02a9df69, 0x0098c12a, 0x03d99051, 0x0208b900, 0x0029f29f}}}, + {X: Field{[10]uint32{0x002b0f00, 0x037ff952, 0x01410799, 0x001a6aec, 0x0254fe9b, 0x03d54c41, 0x007ad4f0, 0x010e5837, 0x02eb38e5, 0x00346ed1}}, Y: Field{[10]uint32{0x02ce4214, 0x007e48ba, 0x00b14a03, 0x00b2be4c, 0x00d03bbd, 0x01a09adb, 0x00a54639, 0x00c2d834, 0x019fe088, 0x00052c18}}}, + {X: Field{[10]uint32{0x0369517a, 0x00333807, 0x00a8415c, 0x00083152, 0x0185d740, 0x03074268, 0x01adb31a, 0x0049a97d, 0x02567705, 0x0009ef4b}}, Y: Field{[10]uint32{0x01468d32, 0x01e064a9, 0x0008f655, 0x02b61cd3, 0x03202690, 0x0238c0b5, 0x01ce428a, 0x00734a7e, 0x01d7cba2, 0x0004880f}}}, + {X: Field{[10]uint32{0x03d21d9c, 0x010c806f, 0x003bd61d, 0x0376e36f, 0x0355441a, 0x02cad9db, 0x03835efa, 0x038805a4, 0x03901c72, 0x001acb31}}, Y: Field{[10]uint32{0x02dd7456, 0x016ce8d2, 0x015601bd, 0x0014639d, 0x006690bb, 0x018bfce3, 0x03f90d4b, 0x00124f6b, 0x0006deea, 0x001665cd}}}, + {X: Field{[10]uint32{0x00840f27, 0x0027ed65, 0x012675df, 0x024f981f, 0x01c63c3b, 0x02ff35af, 0x02a8bcc6, 0x014f158c, 0x003f32f9, 0x001d7a17}}, Y: Field{[10]uint32{0x00b6bb30, 0x03c07b5b, 0x01c47723, 0x02832fdb, 0x00bc59ac, 0x0109b99a, 0x0324f89d, 0x031cf65a, 0x03768714, 0x0008bd68}}}, + {X: Field{[10]uint32{0x006d56a7, 0x00802e7e, 0x0268315e, 0x0149a314, 0x02f26e17, 0x038a3c79, 0x000eed57, 0x0054bd07, 0x0071969e, 0x0034de8c}}, Y: Field{[10]uint32{0x02ff6181, 0x0080d59d, 0x036d3abe, 0x030ed1d0, 0x0370e296, 0x025885c8, 0x004b1fbd, 0x00747437, 0x03269875, 0x0014f549}}}, + {X: Field{[10]uint32{0x03414976, 0x014407a9, 0x001d237d, 0x0262538d, 0x02676931, 0x03860eec, 0x01466408, 0x01a5ccd9, 0x03047f5e, 0x001c56ec}}, Y: Field{[10]uint32{0x01a968d4, 0x01827ba8, 0x01acadb7, 0x03ec0f60, 0x02a89dd1, 0x03a570f5, 0x01ea6722, 0x0357a1e9, 0x035f9e82, 0x000a1103}}}, + {X: Field{[10]uint32{0x02c642e8, 0x022b7df6, 0x0013968d, 0x0292c21f, 0x028e4924, 0x01a04bb0, 0x034a52cc, 0x0056569e, 0x002a4f5b, 0x003dcb45}}, Y: Field{[10]uint32{0x021087dd, 0x023e5e9d, 0x007a6537, 0x0333eebd, 0x00585486, 0x03165305, 0x02ab9bbb, 0x0010b3c5, 0x004bb5d8, 0x001406d9}}}, + {X: Field{[10]uint32{0x01284c26, 0x00ee58b0, 0x03f28024, 0x01b363ef, 0x00384084, 0x0291a7cd, 0x003cf020, 0x0228e97f, 0x038fb4ca, 0x001ecfbf}}, Y: Field{[10]uint32{0x01748579, 0x0240ad6c, 0x00522811, 0x01bbf544, 0x023bbf63, 0x03858408, 0x00bc5555, 0x01849294, 0x00fd1539, 0x002f8962}}}, + {X: Field{[10]uint32{0x02113dd8, 0x017f0de2, 0x018a59cc, 0x00d7fcad, 0x03ec2a70, 0x025d3933, 0x03652257, 0x03b29334, 0x00d771fb, 0x0009106a}}, Y: Field{[10]uint32{0x02447981, 0x00a624e0, 0x00fccae1, 0x00b64c5b, 0x00fe035d, 0x02b08cd8, 0x03f4c6a7, 0x019c4d2e, 0x03760531, 0x000152c1}}}, + {X: Field{[10]uint32{0x00cf7591, 0x03a68a85, 0x0024de78, 0x01f2d92e, 0x02512d09, 0x03d2ace1, 0x03916b12, 0x019f2916, 0x024ed054, 0x003083f2}}, Y: Field{[10]uint32{0x00eecc02, 0x008d56b9, 0x0346d02b, 0x022c8e33, 0x03931fc4, 0x036b4439, 0x007e69c9, 0x0101cb2a, 0x00c796ee, 0x0022146b}}}, + {X: Field{[10]uint32{0x009ec8e7, 0x024bac81, 0x01d67634, 0x01b5a437, 0x00a34c6c, 0x035d604c, 0x00e415aa, 0x01498edd, 0x028d0137, 0x000bdac3}}, Y: Field{[10]uint32{0x02f25dbe, 0x01354e36, 0x02868e38, 0x01d7d88d, 0x03adc722, 0x02d327d9, 0x02cb614e, 0x03da9e5d, 0x01f8438c, 0x003431e4}}}, + {X: Field{[10]uint32{0x02b665dd, 0x02e47aac, 0x00762c5a, 0x00f0f763, 0x01fc0037, 0x00dd36c8, 0x00b3ed11, 0x0015b5be, 0x01be426f, 0x002febf0}}, Y: Field{[10]uint32{0x010e2a2e, 0x00d84545, 0x02781684, 0x01429d64, 0x006dc400, 0x02841b69, 0x027b0710, 0x0000e9fe, 0x0297a4cf, 0x0027107c}}}, + {X: Field{[10]uint32{0x01cb4e8c, 0x024c1db3, 0x01be91df, 0x03dc5ca3, 0x03895980, 0x01d675d3, 0x0376f860, 0x0009cdb5, 0x01ca9056, 0x0033dc47}}, Y: Field{[10]uint32{0x034f1cd5, 0x0102a9dc, 0x020124e1, 0x02991fb3, 0x022f91f6, 0x02226c8f, 0x0156defe, 0x0085bf8d, 0x01bfcf25, 0x0014a8de}}}, + {X: Field{[10]uint32{0x03d1384b, 0x0145b26a, 0x0394e1c3, 0x01d46191, 0x03f516fd, 0x00da43cb, 0x0001ec36, 0x03c6630c, 0x01de27aa, 0x002e6fa5}}, Y: Field{[10]uint32{0x02cb6df9, 0x030489c7, 0x013cd27f, 0x0160aea1, 0x001ff85d, 0x02232e3e, 0x029b6144, 0x03710c0f, 0x0397dca1, 0x001a21d7}}}, + {X: Field{[10]uint32{0x00e9638e, 0x014ddcca, 0x03331fff, 0x02cf095f, 0x037bec31, 0x01466b80, 0x0042b377, 0x01aa314d, 0x03e6c4d0, 0x003d7c95}}, Y: Field{[10]uint32{0x03e986dd, 0x03c85950, 0x0169e35f, 0x03b2ed00, 0x02c80bea, 0x03483432, 0x012e3ed0, 0x00c84eed, 0x020a48d0, 0x002da879}}}, + {X: Field{[10]uint32{0x00099ce7, 0x02455799, 0x02bf9df0, 0x00ff2db3, 0x02a5281b, 0x002bdf64, 0x00036033, 0x022a8456, 0x034c17e3, 0x003f0d71}}, Y: Field{[10]uint32{0x0379dae9, 0x00e489f6, 0x0245ac62, 0x02ecbb23, 0x018421fb, 0x0205344c, 0x00c1c589, 0x01a4ed69, 0x004d41e8, 0x001b8be6}}}, + {X: Field{[10]uint32{0x014384dd, 0x00bf33b5, 0x00aa7473, 0x0287338d, 0x02c1bc18, 0x027feb29, 0x005e5a98, 0x01cd8dd0, 0x020149d9, 0x002b04d7}}, Y: Field{[10]uint32{0x02f021d0, 0x00685882, 0x01cb1c47, 0x014d844f, 0x01d8e545, 0x027e35c2, 0x00cbf630, 0x0129adaf, 0x02cdff95, 0x000f8e2e}}}, + {X: Field{[10]uint32{0x035f345d, 0x01d3e4a7, 0x01055f36, 0x015f3d30, 0x01bfd8f6, 0x01e46806, 0x02400c4e, 0x03175e00, 0x03fbefb3, 0x00182804}}, Y: Field{[10]uint32{0x00a1bd97, 0x00817cce, 0x035b2711, 0x019151a2, 0x039907e3, 0x028c8004, 0x00a5138c, 0x03f8f8a8, 0x00483582, 0x001f9d8f}}}, + {X: Field{[10]uint32{0x01a7acb7, 0x03413a86, 0x013a906e, 0x01642fbe, 0x02ceb3a6, 0x029e2664, 0x023d0273, 0x01ea290e, 0x01065d90, 0x00282668}}, Y: Field{[10]uint32{0x03c5a50d, 0x038f5ed6, 0x007db06f, 0x02836c50, 0x02d5cca4, 0x03c326d1, 0x034bb579, 0x008bff00, 0x03fbfe3c, 0x0004dfe7}}}, + {X: Field{[10]uint32{0x00a792ab, 0x03d3f0e5, 0x0107b09e, 0x005c127c, 0x00c6ed70, 0x00472769, 0x03ea5a8c, 0x018f5861, 0x0286d027, 0x0026e876}}, Y: Field{[10]uint32{0x0263f741, 0x00866759, 0x01650c47, 0x029970b6, 0x008716ae, 0x0005d461, 0x03879089, 0x0167156f, 0x02d8ab54, 0x003c6788}}}, + {X: Field{[10]uint32{0x0277ada0, 0x01453269, 0x0134f63a, 0x00e24d42, 0x01b5e022, 0x03ca3643, 0x03e93633, 0x0050c05e, 0x001ad30d, 0x000d909c}}, Y: Field{[10]uint32{0x01aba970, 0x00378efc, 0x02c22344, 0x02613d4a, 0x026432fa, 0x02a2ef61, 0x0279f487, 0x02ef1b13, 0x02b9c76b, 0x000bf7e6}}}, + {X: Field{[10]uint32{0x02941a5b, 0x028e94b5, 0x02c31c2e, 0x003551c4, 0x0106188c, 0x00b261c6, 0x0153012e, 0x01c26363, 0x0058100b, 0x000a7de7}}, Y: Field{[10]uint32{0x022d524b, 0x01a242e6, 0x01bf3721, 0x02dc0b56, 0x02919d5b, 0x021a8a01, 0x00ec42f5, 0x0306ec34, 0x0199eaa6, 0x002fa7b7}}}, + {X: Field{[10]uint32{0x01ba1bbc, 0x034b11e2, 0x03061e5e, 0x0342b17f, 0x0004b470, 0x00ffacd4, 0x02d5030c, 0x00a13e05, 0x02dfbc35, 0x0038046a}}, Y: Field{[10]uint32{0x00c979e3, 0x0030068f, 0x0270055a, 0x02a4fd2c, 0x03021ec1, 0x00a4ef9d, 0x026ee97f, 0x016468db, 0x03934f2b, 0x00382a63}}}, + {X: Field{[10]uint32{0x03d78585, 0x025bb813, 0x02dfb3ed, 0x0145dfff, 0x020ee06a, 0x022e4887, 0x02b54b68, 0x014d58df, 0x016b00fe, 0x00297220}}, Y: Field{[10]uint32{0x01ff8e5f, 0x02f96a32, 0x0076fe03, 0x0076bb59, 0x037d6595, 0x029abb54, 0x00977929, 0x02c46912, 0x037b9d63, 0x000fe198}}}, + {X: Field{[10]uint32{0x03194707, 0x03c5b271, 0x02509abe, 0x038244a8, 0x022e6d49, 0x01c23f39, 0x0207798e, 0x00d42e54, 0x00237e44, 0x000ee54b}}, Y: Field{[10]uint32{0x01d68936, 0x026d676f, 0x02edaff4, 0x00c5af37, 0x02e6ebb6, 0x01e44b99, 0x0141a385, 0x01b22b27, 0x032a419e, 0x003de125}}}, + {X: Field{[10]uint32{0x0157af04, 0x000bc937, 0x02632725, 0x004667e1, 0x02b75dd6, 0x021e92aa, 0x007982a1, 0x0054be03, 0x02bcd9d8, 0x002365e5}}, Y: Field{[10]uint32{0x03e611bd, 0x026080ad, 0x0092c89c, 0x034a63a6, 0x010317c2, 0x035a2654, 0x015695f2, 0x0078e8a3, 0x007994a3, 0x003ee6c5}}}, + {X: Field{[10]uint32{0x0202de40, 0x005dc11a, 0x03f51845, 0x01edbbd9, 0x014fde4d, 0x01e2259a, 0x036f689d, 0x01911454, 0x005b2f4e, 0x0025acaf}}, Y: Field{[10]uint32{0x008e89cc, 0x01712842, 0x0178b214, 0x026cd4b0, 0x01914eee, 0x03eff394, 0x039bbf5a, 0x020b6d40, 0x0126f919, 0x00382ddb}}}, + {X: Field{[10]uint32{0x032e2d79, 0x03bd7490, 0x0103625b, 0x02e68743, 0x034e3ab2, 0x01963be5, 0x028f54d8, 0x0254038a, 0x03109f12, 0x0026fdf3}}, Y: Field{[10]uint32{0x016e8582, 0x0343c652, 0x0020be32, 0x029c66f3, 0x01dd6373, 0x0223af49, 0x038bb521, 0x0071a146, 0x03adf77e, 0x000844f5}}}, + {X: Field{[10]uint32{0x03d4f1b7, 0x0013cabc, 0x00dab11a, 0x00f58756, 0x00c91f85, 0x0366a861, 0x008c7414, 0x016d7abf, 0x03a72037, 0x000434ff}}, Y: Field{[10]uint32{0x03298c90, 0x0043a8c3, 0x0321beeb, 0x002b505b, 0x02c98d75, 0x03e30fc0, 0x015c7046, 0x03d0f2c8, 0x032a8a96, 0x00307e12}}}, + {X: Field{[10]uint32{0x003a5eb6, 0x019e7a03, 0x00e92c0e, 0x01fa210c, 0x030e9257, 0x006da1cc, 0x01636920, 0x007342e3, 0x022b6adf, 0x0015b593}}, Y: Field{[10]uint32{0x02f71cc0, 0x0069badf, 0x0382451b, 0x01f89792, 0x025d4b68, 0x01f579a5, 0x00427c25, 0x02108d22, 0x030efbe9, 0x0000004d}}}, + {X: Field{[10]uint32{0x031528bf, 0x02b70d1c, 0x021c1420, 0x014a95a0, 0x026dbfa3, 0x003091e4, 0x01eddbd2, 0x033c81d7, 0x003e1c83, 0x003fb128}}, Y: Field{[10]uint32{0x01a95509, 0x01f9aa2f, 0x00b2aa78, 0x023bf5ef, 0x031bab78, 0x00e1fa6f, 0x03a0d98f, 0x0390b4ee, 0x02af8670, 0x002854ac}}}, + {X: Field{[10]uint32{0x03ee92eb, 0x030983cb, 0x03001779, 0x036ca6a1, 0x02a45d11, 0x02256796, 0x02e6d53e, 0x02a6b18e, 0x01177cce, 0x0016029d}}, Y: Field{[10]uint32{0x029e8edd, 0x03d3e719, 0x02a06862, 0x02436304, 0x0086733a, 0x0054dd69, 0x008c4111, 0x03193081, 0x029c3263, 0x001e4ef9}}}, + {X: Field{[10]uint32{0x02f636f6, 0x036e5d9a, 0x002f535e, 0x034b437b, 0x02991b46, 0x004de866, 0x017431b1, 0x0073af3e, 0x03e57893, 0x0024a1af}}, Y: Field{[10]uint32{0x0329f516, 0x006d6974, 0x015f28cb, 0x020147b7, 0x00c55fce, 0x0014ede0, 0x00b38fb2, 0x036d0a0f, 0x0130e962, 0x001f9dd3}}}, + {X: Field{[10]uint32{0x00f4890d, 0x008b070a, 0x02041e54, 0x01476982, 0x02803e38, 0x03fbb196, 0x002cf2ee, 0x0099494e, 0x01a99b70, 0x00181b55}}, Y: Field{[10]uint32{0x00eda1a7, 0x02295314, 0x02e5407f, 0x00147d3b, 0x0379ae2c, 0x006e2a85, 0x004a1e03, 0x01904528, 0x026e3c2a, 0x00372256}}}, + {X: Field{[10]uint32{0x01f917f5, 0x001fda5d, 0x00df66e8, 0x03180139, 0x0011387d, 0x033f23b6, 0x03ef2f1b, 0x03073773, 0x0140833e, 0x00285a83}}, Y: Field{[10]uint32{0x022d6527, 0x0246f620, 0x01388ba9, 0x03658c04, 0x037fd281, 0x02203421, 0x01f32a82, 0x01294c54, 0x013713de, 0x0015235f}}}, + {X: Field{[10]uint32{0x039f0329, 0x027430d3, 0x0262d9b7, 0x0057b7d6, 0x004a687a, 0x03881c9b, 0x03e3e7aa, 0x01388e68, 0x01d2be57, 0x00001652}}, Y: Field{[10]uint32{0x005288a9, 0x02a44851, 0x0255f337, 0x01de5c8f, 0x02f7f4e7, 0x01203de3, 0x01d94275, 0x02c970c4, 0x025a167a, 0x001c772c}}}, + {X: Field{[10]uint32{0x0168b240, 0x01f1395e, 0x01536cef, 0x00ce0840, 0x03cd1e23, 0x02707fd3, 0x017b295e, 0x00362927, 0x024ae67b, 0x002107d3}}, Y: Field{[10]uint32{0x031f4161, 0x019c7415, 0x03d5cb56, 0x00de335c, 0x01ccae80, 0x0236f99e, 0x03979f4a, 0x0293b43a, 0x009c265f, 0x0007d587}}}, + {X: Field{[10]uint32{0x02cb7442, 0x00fb0791, 0x0240ddd4, 0x02b80289, 0x03faf680, 0x0109e23f, 0x03d4b831, 0x03a7ca22, 0x01f8c748, 0x0008988f}}, Y: Field{[10]uint32{0x03a55da3, 0x003804e1, 0x03aaad5e, 0x01ed2530, 0x0317d582, 0x033a7de1, 0x024381d0, 0x02d64be5, 0x000adfcd, 0x000e03bc}}}, + {X: Field{[10]uint32{0x005185e4, 0x0319523d, 0x02e2dc88, 0x037aced9, 0x02670083, 0x0298285f, 0x007a21e5, 0x00c07ba8, 0x03c36438, 0x00205819}}, Y: Field{[10]uint32{0x01c4cbf7, 0x020abb93, 0x02647f59, 0x03b11409, 0x022eeedc, 0x00dbf0e7, 0x00f4e8e2, 0x03a7c7c1, 0x011b9a95, 0x0016be8e}}}, + {X: Field{[10]uint32{0x02085c1f, 0x01a49373, 0x02485354, 0x0270b065, 0x017d28af, 0x02a38109, 0x00f6431b, 0x0314c493, 0x01614745, 0x003e3c8d}}, Y: Field{[10]uint32{0x0334750f, 0x0199d4d9, 0x01e7507f, 0x01d6b34a, 0x02bd1012, 0x03f9dad7, 0x008c1b93, 0x006d5695, 0x0067e3b4, 0x00028594}}}, + {X: Field{[10]uint32{0x03f2f57a, 0x00ee4cd5, 0x03e23775, 0x00f77812, 0x0228bb93, 0x01c214ec, 0x01537d4c, 0x02285709, 0x0184e25b, 0x00084c95}}, Y: Field{[10]uint32{0x02e873e2, 0x02dc9fa1, 0x01f53d20, 0x03c566e8, 0x03f627b5, 0x01fc869b, 0x00b00d51, 0x03d5e83c, 0x00f2078e, 0x000dc232}}}, + {X: Field{[10]uint32{0x03dfbda3, 0x0335a98f, 0x01c77845, 0x02b2f245, 0x0188b0ba, 0x03feb050, 0x00c24b37, 0x0066cb00, 0x03fcf485, 0x002cbd3d}}, Y: Field{[10]uint32{0x0157702c, 0x0138a31f, 0x03e171c9, 0x00eb356c, 0x03de4972, 0x03d33cf1, 0x03196bb5, 0x03b90cf9, 0x019e6f52, 0x002c81ad}}}, + {X: Field{[10]uint32{0x027f7265, 0x004bfb3b, 0x02064622, 0x014f6b2b, 0x03fd9c5c, 0x01593e70, 0x0070fd39, 0x00001adf, 0x014f5f42, 0x002d3997}}, Y: Field{[10]uint32{0x016bee0e, 0x01cd41a0, 0x025bffc0, 0x0235a119, 0x0003c75b, 0x020fb0b1, 0x021723ea, 0x00efd3cc, 0x02f2e399, 0x000c1edb}}}, + {X: Field{[10]uint32{0x023a7240, 0x00d4ac77, 0x00bab8f2, 0x007410fd, 0x03aa58b6, 0x01e63ba4, 0x033968e9, 0x0026b497, 0x01939ac6, 0x0013c411}}, Y: Field{[10]uint32{0x038179ae, 0x00887b9f, 0x024bd186, 0x0224fd2a, 0x03ed9d0a, 0x01569424, 0x01698f5c, 0x0257e960, 0x03bb9883, 0x003b6361}}}, + {X: Field{[10]uint32{0x014672fa, 0x01f00592, 0x00738d09, 0x02148e22, 0x0390018e, 0x02b5d4a7, 0x026b2157, 0x0304967e, 0x00ffe515, 0x0026d79d}}, Y: Field{[10]uint32{0x01fece15, 0x00f8ebc8, 0x00bc43db, 0x03610786, 0x01fe2df3, 0x00fecee7, 0x01bf70c4, 0x00c3c5ef, 0x026d4c4e, 0x00075561}}}, + {X: Field{[10]uint32{0x0217e302, 0x0205f21f, 0x02cf510d, 0x030b1da8, 0x0330f8a2, 0x024e1ec6, 0x02968f94, 0x03dc6040, 0x0042ac8c, 0x0001defd}}, Y: Field{[10]uint32{0x032af0e9, 0x039d5bf4, 0x021f26a6, 0x0217dbbb, 0x01e4daaa, 0x01b16fbb, 0x03b1103e, 0x0011ac74, 0x02611d90, 0x002ec3e7}}}, + {X: Field{[10]uint32{0x00c266a9, 0x034e22de, 0x00fe64bc, 0x01a4c20d, 0x00d2f5d4, 0x005aa662, 0x0028f34b, 0x008125ac, 0x025cd49f, 0x0009f784}}, Y: Field{[10]uint32{0x00b54bfe, 0x00f78957, 0x039b81a4, 0x00b4c8e5, 0x0384cdfc, 0x000e6b4a, 0x019dac24, 0x0364a8ab, 0x02a8483d, 0x003d0f61}}}, + {X: Field{[10]uint32{0x03e9c116, 0x00262712, 0x01b13225, 0x03c1fe11, 0x017f026c, 0x03bed6a3, 0x03b60ae4, 0x01d78652, 0x0178ae1d, 0x00086fdc}}, Y: Field{[10]uint32{0x01b8d967, 0x03da26bb, 0x0081d434, 0x02455a59, 0x0076b522, 0x034ed63e, 0x03444664, 0x037c5745, 0x02adbc21, 0x001b2aa0}}}, + {X: Field{[10]uint32{0x0232e234, 0x00916c15, 0x0156a66d, 0x03e6702e, 0x02dc9100, 0x020a2768, 0x0365b7f0, 0x0005a906, 0x025493ee, 0x00000924}}, Y: Field{[10]uint32{0x03c45b3d, 0x01738c41, 0x016f82ed, 0x0119ebb2, 0x00d883ff, 0x013dbe41, 0x004c5367, 0x007e6054, 0x01941cb5, 0x002f28c0}}}, + {X: Field{[10]uint32{0x01867f76, 0x039d4e1f, 0x016fe230, 0x00966e4c, 0x00ea8e94, 0x02e4dc42, 0x02d89b96, 0x00ad3351, 0x00c1e347, 0x0034fd91}}, Y: Field{[10]uint32{0x018cade5, 0x02cb6943, 0x03b7c597, 0x02b8c5af, 0x0202e536, 0x01489e50, 0x0337ed9d, 0x025cca8e, 0x0203fd62, 0x00246089}}}, + {X: Field{[10]uint32{0x0325b261, 0x00dfdeb8, 0x02e89d03, 0x01d51894, 0x01915c26, 0x011fd95b, 0x00e52c81, 0x034532a2, 0x034b0e2b, 0x00321187}}, Y: Field{[10]uint32{0x00dcae06, 0x033bb6a7, 0x02b07e38, 0x016aa2a4, 0x01fa3b61, 0x011bbf7d, 0x0232868e, 0x01e66cfd, 0x018197ac, 0x000625c4}}}, + {X: Field{[10]uint32{0x0395a380, 0x00cd0ab0, 0x0060d913, 0x01aaaa96, 0x01a8c240, 0x01ef5b28, 0x0357e1da, 0x02a4e306, 0x0190be20, 0x002db97d}}, Y: Field{[10]uint32{0x018a04b6, 0x011b579f, 0x02026ff1, 0x0325a9b7, 0x01cf01ee, 0x02d698c1, 0x0186569a, 0x03ab79cb, 0x00f1a2f2, 0x00299ca3}}}, + {X: Field{[10]uint32{0x01eb5d6c, 0x013b2556, 0x008c0312, 0x0237c524, 0x018b7013, 0x017bf043, 0x014eee4b, 0x0007415b, 0x039d4657, 0x000f4945}}, Y: Field{[10]uint32{0x0395980f, 0x00ca9c62, 0x03c8c3e0, 0x028ab155, 0x023b56f7, 0x00f1625e, 0x03e88e2b, 0x035fb18c, 0x03fe1d61, 0x000562de}}}, + {X: Field{[10]uint32{0x02f94d99, 0x026965d1, 0x02927984, 0x004646bd, 0x00d85155, 0x03689fc4, 0x0093425b, 0x00526656, 0x0154c717, 0x0002aed7}}, Y: Field{[10]uint32{0x00b9a161, 0x015108b1, 0x03ad04e4, 0x002b64f5, 0x037012ff, 0x03d08270, 0x0106e89f, 0x0237a8db, 0x03cc3be2, 0x001337fa}}}, + {X: Field{[10]uint32{0x0325c73e, 0x014a41ec, 0x0224c523, 0x0219cfb1, 0x02f12433, 0x038c72ec, 0x00dedaa4, 0x03e70a40, 0x0125115e, 0x00262740}}, Y: Field{[10]uint32{0x00c6c8df, 0x01a081a5, 0x000c8d16, 0x018ca547, 0x00d553df, 0x0109e5d4, 0x01f28ee1, 0x0381c3f0, 0x02e9945d, 0x0034da67}}}, + {X: Field{[10]uint32{0x02013884, 0x03908c97, 0x02af82d0, 0x004f20a8, 0x015e05db, 0x003b7dc3, 0x028bbe4e, 0x0347fc18, 0x01d429c3, 0x00313171}}, Y: Field{[10]uint32{0x03a97eea, 0x02e9f9fb, 0x023ee0f2, 0x003744cc, 0x03ccee86, 0x002b7a5f, 0x029da677, 0x0222a7f0, 0x00b88251, 0x0030b1db}}}, + {X: Field{[10]uint32{0x02c0807b, 0x00552789, 0x01edc360, 0x0047b02e, 0x03be9471, 0x000283a0, 0x035080a9, 0x02d97236, 0x0050c623, 0x002198b6}}, Y: Field{[10]uint32{0x01da840b, 0x03c3db8d, 0x01526b3d, 0x01333e32, 0x03f91e72, 0x0246020e, 0x02a72b32, 0x039e93d9, 0x0277b0c9, 0x00029c75}}}, + {X: Field{[10]uint32{0x01083898, 0x03b6c5c7, 0x02626cbd, 0x031f03aa, 0x00543b73, 0x00eaef51, 0x0309b389, 0x0166fccc, 0x03497e73, 0x00349bfb}}, Y: Field{[10]uint32{0x01851395, 0x00e07e1e, 0x03ad956d, 0x00835236, 0x0004d60c, 0x0141c3e4, 0x0101ea9a, 0x002ce5ad, 0x0209bb09, 0x002b62ec}}}, + {X: Field{[10]uint32{0x029d8d0f, 0x01e17488, 0x009838f8, 0x03d7c5cf, 0x025b4560, 0x02d00844, 0x0342ff85, 0x02da09f5, 0x00e8c584, 0x0015a6fa}}, Y: Field{[10]uint32{0x001b8559, 0x036bf1f5, 0x0235422e, 0x00cd789b, 0x0247c74a, 0x02692754, 0x015581bf, 0x01f626a3, 0x01a4a826, 0x002c24e0}}}, + {X: Field{[10]uint32{0x030116d4, 0x0279e534, 0x02255d4a, 0x02ef256a, 0x03842f82, 0x01658363, 0x0167bc6c, 0x021eceb6, 0x00c34d17, 0x00378d2b}}, Y: Field{[10]uint32{0x021816d3, 0x02cf5de8, 0x00505b6c, 0x002fbc26, 0x00e322c4, 0x0220f4fc, 0x00f4d3e0, 0x02d4a95f, 0x001cb2b6, 0x000bf76d}}}, + {X: Field{[10]uint32{0x01c50b1a, 0x01bea671, 0x003d5544, 0x0101c376, 0x03ece852, 0x01d0a96c, 0x0149b861, 0x02dd89b5, 0x034876db, 0x0011d0c2}}, Y: Field{[10]uint32{0x03200df1, 0x00d5e92b, 0x033e85af, 0x01223771, 0x02b53dd0, 0x0323b1dc, 0x006a0ead, 0x0115cd63, 0x02ba0700, 0x0035d564}}}, + {X: Field{[10]uint32{0x02e9fe13, 0x002c25f5, 0x00fd7914, 0x03fbdb1a, 0x018c2d8f, 0x01aeeadb, 0x017339b7, 0x01c99ae8, 0x00b5e668, 0x003c7478}}, Y: Field{[10]uint32{0x0324e580, 0x0150f56f, 0x0350bb96, 0x013699f6, 0x03a1d849, 0x008c03e5, 0x01c54837, 0x00ce14d2, 0x0226fc23, 0x00002958}}}, + {X: Field{[10]uint32{0x00cdbcd0, 0x0056e17e, 0x004c3c05, 0x03fce0fd, 0x006e8132, 0x025a30dd, 0x03d0426e, 0x003784f6, 0x03357614, 0x0008a9bd}}, Y: Field{[10]uint32{0x03d18d1b, 0x038d157e, 0x01e48e69, 0x0276a101, 0x03430a39, 0x003e5690, 0x00dc0044, 0x0038f8d6, 0x01a89027, 0x00277362}}}, + {X: Field{[10]uint32{0x01a9ada2, 0x019538f8, 0x02867b46, 0x00c30a78, 0x02fc307b, 0x01d10ba3, 0x030c6ea5, 0x0232826e, 0x03280afd, 0x000b7714}}, Y: Field{[10]uint32{0x0087dee4, 0x03b6dcf0, 0x03393b5f, 0x024c665d, 0x0107d077, 0x007fe438, 0x02daa6e3, 0x039ba1ef, 0x010edb84, 0x001ee6ae}}}, + {X: Field{[10]uint32{0x01da0fca, 0x0078b065, 0x03a9e1a0, 0x015151b7, 0x011fb1c8, 0x0162e719, 0x00a116c0, 0x03d4bf4c, 0x0039a60a, 0x00182dbe}}, Y: Field{[10]uint32{0x00d26c40, 0x01360f88, 0x02bcdca5, 0x00187615, 0x03b0e743, 0x011a763a, 0x039b07b2, 0x02d052f8, 0x029f28cf, 0x00179dfd}}}, + {X: Field{[10]uint32{0x01dee53c, 0x009a9f43, 0x02776dcd, 0x00a15f25, 0x022a1f1f, 0x0257a90e, 0x0306bfdf, 0x024b9432, 0x019b9b90, 0x0009e430}}, Y: Field{[10]uint32{0x014e7f64, 0x01767cdc, 0x005b6271, 0x01662caf, 0x00de0677, 0x00085c26, 0x0387afaa, 0x01b9e2c8, 0x0120d04e, 0x003f7ba8}}}, + {X: Field{[10]uint32{0x01113803, 0x03e411bd, 0x037c00d7, 0x028d1453, 0x02db181e, 0x03eb65e0, 0x03576b16, 0x02f22c49, 0x020f9ee8, 0x0039510c}}, Y: Field{[10]uint32{0x00510741, 0x00465cb0, 0x01e0f952, 0x002b89ad, 0x023c7368, 0x03739f0c, 0x01b63dd9, 0x01d1139a, 0x02fb0239, 0x002e4dd8}}}, + {X: Field{[10]uint32{0x0355313d, 0x026abeb6, 0x00cee39f, 0x0335a6ed, 0x038e2706, 0x02f535d3, 0x00a236cb, 0x00a35618, 0x01ae73e4, 0x001b1fc9}}, Y: Field{[10]uint32{0x00dc9121, 0x012d6072, 0x030916a4, 0x012f577f, 0x018db30c, 0x0163aa48, 0x020864be, 0x026c63a6, 0x03c9e33f, 0x003632e3}}}, + {X: Field{[10]uint32{0x0393d4e8, 0x03a94ee6, 0x03499121, 0x00e80c3b, 0x03dd9eaa, 0x00e54bc9, 0x01e9c3ef, 0x00351d34, 0x0328ff71, 0x000a2746}}, Y: Field{[10]uint32{0x02880667, 0x02ce52bb, 0x03e38cf2, 0x00c9dfd2, 0x02642859, 0x0116cf2e, 0x00d5cb72, 0x00b75613, 0x000aaebc, 0x003cdabe}}}, + {X: Field{[10]uint32{0x0110b5aa, 0x028769d6, 0x03476b9f, 0x022b53bd, 0x002a6f4a, 0x0244c306, 0x0287b5d2, 0x0359cc97, 0x0197ac01, 0x003c0aad}}, Y: Field{[10]uint32{0x00e38adb, 0x025902b3, 0x02aaffe8, 0x007d97b2, 0x01d3262d, 0x030d18cf, 0x02c53795, 0x022c4fb3, 0x002aecf2, 0x002ba230}}}, + {X: Field{[10]uint32{0x00a0413a, 0x03e10637, 0x01a8d2d8, 0x01c13b0a, 0x03c625bb, 0x01b531b4, 0x0332c82d, 0x00c4195d, 0x034f71a7, 0x0002a6a5}}, Y: Field{[10]uint32{0x01b372cd, 0x022496e4, 0x01c2126e, 0x02b33f47, 0x01af1497, 0x0183b479, 0x02f222d8, 0x03a5bf57, 0x0033eed4, 0x0030837d}}}, + {X: Field{[10]uint32{0x0177496a, 0x0073d023, 0x0071f4a2, 0x03f05941, 0x024cc392, 0x018d2d57, 0x020e9c78, 0x00226466, 0x010d728e, 0x001e1986}}, Y: Field{[10]uint32{0x000cfd22, 0x004a44eb, 0x01b23035, 0x038ea4da, 0x0029d79d, 0x00d68799, 0x028e265c, 0x008bbf2a, 0x00d95404, 0x0006ed7f}}}, + {X: Field{[10]uint32{0x0333b9ac, 0x004c2920, 0x00773ce0, 0x016a4443, 0x0025cc11, 0x018f6550, 0x00e4e2de, 0x02e3afc0, 0x03e344b3, 0x003229ff}}, Y: Field{[10]uint32{0x02e67b6e, 0x0148ff97, 0x02806dbb, 0x003f6a5f, 0x02ca9128, 0x032a1c91, 0x00141aa5, 0x018ed59d, 0x03e5010c, 0x003287fe}}}, + {X: Field{[10]uint32{0x039208ba, 0x0259b993, 0x033472f9, 0x00cf533c, 0x019cc1e6, 0x01369a1c, 0x0019e84e, 0x01ab4e0d, 0x026a13ff, 0x0001b2ee}}, Y: Field{[10]uint32{0x02214a88, 0x0228a987, 0x011fcfac, 0x02258a9f, 0x03058598, 0x02711986, 0x0392c34e, 0x024fd13e, 0x01820c78, 0x000d4489}}}, + {X: Field{[10]uint32{0x019de719, 0x008ff6bf, 0x03e1287b, 0x020526e8, 0x00ffe9aa, 0x031d976b, 0x01450c82, 0x021847ad, 0x01bd691a, 0x00381fe3}}, Y: Field{[10]uint32{0x00fbc509, 0x02c18763, 0x02bc6894, 0x01b96d49, 0x030acb0c, 0x0384631f, 0x01937994, 0x033fba89, 0x01f08e39, 0x0024cb8d}}}, + {X: Field{[10]uint32{0x02d2c5d4, 0x00ce8b21, 0x029b84b6, 0x00e3f331, 0x0151f3e2, 0x034fcca9, 0x02720d71, 0x02505b37, 0x009832fd, 0x001884da}}, Y: Field{[10]uint32{0x02784e9c, 0x03dc576f, 0x00f68206, 0x01b5a72f, 0x03791f3b, 0x03c79665, 0x016d9684, 0x01f90616, 0x024d6224, 0x0004dfa6}}}, + {X: Field{[10]uint32{0x03a7b9eb, 0x013a3036, 0x004f2325, 0x02e87a9a, 0x0240a318, 0x01c43021, 0x03eb2faf, 0x019c1894, 0x018862de, 0x0022c041}}, Y: Field{[10]uint32{0x01bfd264, 0x008dc686, 0x0348e2ce, 0x00655bc3, 0x03dbd7e4, 0x01e8cfe7, 0x00bf43cf, 0x01b18333, 0x0062dcc5, 0x00152922}}}, + {X: Field{[10]uint32{0x00f213d8, 0x01203aa1, 0x031cfeaf, 0x021f70c2, 0x023fb2ed, 0x015af2eb, 0x03bbbace, 0x020d1bfb, 0x008c14af, 0x0004b4e4}}, Y: Field{[10]uint32{0x0267fdfc, 0x0206a626, 0x0024ecb1, 0x01766396, 0x01fef41e, 0x000b1366, 0x02764210, 0x036b2611, 0x01fbdf7d, 0x003f1185}}}, + {X: Field{[10]uint32{0x01784cd2, 0x018b4580, 0x013dc8da, 0x01bb7df0, 0x02b47428, 0x00a48a64, 0x00e368f6, 0x0331a6ef, 0x01e2a7b8, 0x00086741}}, Y: Field{[10]uint32{0x034c7f5c, 0x00785e28, 0x02de2076, 0x00ec8587, 0x03dd2820, 0x023eeafb, 0x029407de, 0x02c79e3b, 0x03739a7e, 0x0022bb93}}}, + {X: Field{[10]uint32{0x005de204, 0x00016db6, 0x03074852, 0x004f0e32, 0x0049bbe2, 0x034997ce, 0x011fa23a, 0x03ea47da, 0x01599a76, 0x0035f433}}, Y: Field{[10]uint32{0x011ce2fa, 0x023cdf24, 0x019d1e93, 0x018302c7, 0x03ed1a2d, 0x01c9683b, 0x021330ea, 0x0036b97a, 0x032c6075, 0x003cd255}}}, + {X: Field{[10]uint32{0x02bb6c6d, 0x03d25e3a, 0x0042d635, 0x02ecb1dc, 0x009f65cf, 0x03ea3f0f, 0x018b73f6, 0x02408e0f, 0x01f5a04c, 0x0028fe9a}}, Y: Field{[10]uint32{0x03cbdea2, 0x007296b0, 0x03e8372c, 0x035d6665, 0x010accb2, 0x00e268bc, 0x0395b18f, 0x02aac52b, 0x01a89994, 0x0031e628}}}, + {X: Field{[10]uint32{0x03b2d1cd, 0x0322bec4, 0x00e92cc5, 0x01307414, 0x00854073, 0x0176505c, 0x0072e71e, 0x0115f5e6, 0x001a825c, 0x00240ba2}}, Y: Field{[10]uint32{0x01a62d43, 0x020b0c2f, 0x01e338ac, 0x001f33f2, 0x02de099f, 0x018be091, 0x0163cccf, 0x01bee444, 0x013263bf, 0x003fc1d4}}}, + {X: Field{[10]uint32{0x0329c144, 0x03318381, 0x03505d34, 0x01693e32, 0x036923ea, 0x03c64cae, 0x021aa2b3, 0x00155b4d, 0x01f24c47, 0x000c97c6}}, Y: Field{[10]uint32{0x0294bec4, 0x01f11ae7, 0x021782a5, 0x03058665, 0x0173e3e9, 0x006fe3e7, 0x001bf358, 0x028337e6, 0x02b829a6, 0x003d2a6b}}}, + {X: Field{[10]uint32{0x021edd4b, 0x02c1f1be, 0x0024763b, 0x0117ac1e, 0x00bcdf72, 0x033ffeb3, 0x025f8602, 0x033d854f, 0x03b441a6, 0x001a653c}}, Y: Field{[10]uint32{0x0074c174, 0x02c45806, 0x03bd927d, 0x02ae1fdc, 0x02198ee4, 0x00fc1454, 0x00479d8d, 0x02a25ca7, 0x01ea892d, 0x003b0bf1}}}, + {X: Field{[10]uint32{0x02cb2d8c, 0x0284149a, 0x0137f3b7, 0x028ad6eb, 0x005663c5, 0x02307daa, 0x011bd2f0, 0x01e5bff5, 0x00324e8f, 0x00086156}}, Y: Field{[10]uint32{0x01897c2d, 0x03475da8, 0x00cf4b15, 0x0255759f, 0x033b93c4, 0x000d0efd, 0x0290d44b, 0x0300f265, 0x02cb33ce, 0x0039df3b}}}, + {X: Field{[10]uint32{0x0191b099, 0x01d33be7, 0x021b0a56, 0x00fd21ea, 0x01319693, 0x0391dcad, 0x027c312a, 0x02a00695, 0x023b32f2, 0x0024176a}}, Y: Field{[10]uint32{0x01cf369f, 0x0161c710, 0x021d6b69, 0x010d6cb2, 0x0382b648, 0x019ff705, 0x0291d5d7, 0x005c644d, 0x01c36d27, 0x002fd8a1}}}, + {X: Field{[10]uint32{0x025339f1, 0x02547bad, 0x017f5b39, 0x01d8c54e, 0x031b6853, 0x036f839f, 0x03e51613, 0x001491d7, 0x038434b6, 0x0037df3e}}, Y: Field{[10]uint32{0x03558243, 0x00333d37, 0x00d2ee58, 0x00f1be91, 0x010d1beb, 0x03659475, 0x0153393d, 0x039154b6, 0x017e1419, 0x0039c973}}}, + {X: Field{[10]uint32{0x01732491, 0x016f2d39, 0x024a5d8c, 0x01d8a33d, 0x00385cb2, 0x03297ae0, 0x0096b821, 0x00ae7a8f, 0x02fc8884, 0x0039fee7}}, Y: Field{[10]uint32{0x00f22331, 0x00a054de, 0x03d5f5e9, 0x00a3b76a, 0x011353c1, 0x019d6a5f, 0x03b83900, 0x0380dc98, 0x02bca6f9, 0x0032399d}}}, + {X: Field{[10]uint32{0x0124285b, 0x008da773, 0x012fecc1, 0x00575c78, 0x01bad797, 0x029103d6, 0x02ac0a3f, 0x02885879, 0x030c272b, 0x003468d7}}, Y: Field{[10]uint32{0x019edb3c, 0x02e526b2, 0x02ec1806, 0x02a25840, 0x0049dc41, 0x02c55900, 0x02f2f21b, 0x01c5b6e7, 0x00f7d475, 0x0007d6dc}}}, + {X: Field{[10]uint32{0x027b079f, 0x0043694a, 0x032e5551, 0x00a41164, 0x024f4204, 0x01eb98a7, 0x03da74ac, 0x03753385, 0x02e85f2d, 0x00019ae9}}, Y: Field{[10]uint32{0x03a80402, 0x002279c1, 0x03733263, 0x0010d921, 0x02219679, 0x026f7fef, 0x01a4f357, 0x03bef3d3, 0x005beb8e, 0x00363aeb}}}, + {X: Field{[10]uint32{0x00f3a749, 0x03ce682d, 0x01e487b1, 0x008875ee, 0x00c36e7c, 0x01d7e714, 0x03cf8065, 0x00414ad2, 0x029a2688, 0x0001bdfd}}, Y: Field{[10]uint32{0x0331a4c4, 0x00d6a99c, 0x0202b892, 0x016096ed, 0x00bc1835, 0x03058394, 0x00352b9c, 0x02e22ead, 0x03840d89, 0x0004741a}}}, + {X: Field{[10]uint32{0x026c0abd, 0x00308724, 0x01b90eda, 0x03fa132b, 0x0141c23a, 0x017006b1, 0x01699067, 0x0140ec98, 0x016f571d, 0x0012f85b}}, Y: Field{[10]uint32{0x02c1d06d, 0x013f8ca7, 0x011bd9a0, 0x023f2c8c, 0x01d9ede7, 0x034cffb5, 0x02116c5d, 0x03cb7586, 0x02deffa1, 0x00004107}}}, + {X: Field{[10]uint32{0x01e75886, 0x03c142c0, 0x029bd33b, 0x00d43b95, 0x03191603, 0x005a6315, 0x00abbc79, 0x02b2d9d8, 0x005db55e, 0x0022be23}}, Y: Field{[10]uint32{0x01d9a12c, 0x02fd65af, 0x02beaf61, 0x02d74af9, 0x00ca203e, 0x025801f0, 0x02eeb245, 0x02d2c4a6, 0x010b6bf2, 0x0013d6e1}}}, + {X: Field{[10]uint32{0x00ef8672, 0x02d82213, 0x035072e2, 0x00602339, 0x01edb695, 0x00e457a0, 0x03648491, 0x03ae3869, 0x037a3316, 0x002b4cf9}}, Y: Field{[10]uint32{0x037ccd90, 0x0297932b, 0x0313f16c, 0x0227c563, 0x016c4f4f, 0x025431d7, 0x01157fd7, 0x022f6769, 0x01e24bc8, 0x003e8058}}}, + {X: Field{[10]uint32{0x01d8c2bc, 0x037b6cf6, 0x01ba069e, 0x007d808b, 0x01cdb51e, 0x0070d121, 0x0196ee9b, 0x02bf9e47, 0x01ef7620, 0x001112a0}}, Y: Field{[10]uint32{0x0351e2fd, 0x006bc465, 0x03b52e64, 0x00a47beb, 0x02bd2683, 0x02ff366e, 0x02811c7f, 0x013af0bb, 0x03d9a49d, 0x002a2005}}}, + {X: Field{[10]uint32{0x02aa5c51, 0x002d98f3, 0x00aa51d1, 0x034492b2, 0x0377af3a, 0x01940e8b, 0x0387e9d2, 0x03e2d981, 0x03a39530, 0x0016c781}}, Y: Field{[10]uint32{0x037810b9, 0x00311c3d, 0x0013b450, 0x0041eef4, 0x02e87cb5, 0x021aa01a, 0x031e59b6, 0x0383ec9c, 0x00d38d55, 0x003f3d30}}}, + {X: Field{[10]uint32{0x03174309, 0x00cfb45c, 0x02844ba5, 0x01f65897, 0x01b1d42e, 0x00c5f99f, 0x034c4033, 0x01aa195e, 0x00170e98, 0x00000fa3}}, Y: Field{[10]uint32{0x00cd6caa, 0x03d54865, 0x03e5e696, 0x03d70a5b, 0x029db702, 0x00f1fb83, 0x020f3966, 0x028d743a, 0x009ff4f5, 0x0037baf9}}}, + {X: Field{[10]uint32{0x00d112c1, 0x03a0f601, 0x017e5746, 0x0241fc75, 0x036432af, 0x011ad4a2, 0x024c078b, 0x032c6674, 0x02ee5e9b, 0x0028425b}}, Y: Field{[10]uint32{0x02e7c6d4, 0x0229db74, 0x02fc13f0, 0x003f87a4, 0x0097eace, 0x033553cf, 0x02b3019a, 0x00db3595, 0x00fe6994, 0x002f44f9}}}, + {X: Field{[10]uint32{0x0265f2f0, 0x001c6dd9, 0x0093898c, 0x024d37b4, 0x00368610, 0x0269d7ba, 0x000a6d89, 0x0379d76d, 0x01794218, 0x00151d61}}, Y: Field{[10]uint32{0x01174548, 0x0184fd86, 0x021b5c6f, 0x02fca71d, 0x026bcde4, 0x0376a995, 0x00dcd94f, 0x031a25c3, 0x024213e1, 0x000ef555}}}, + {X: Field{[10]uint32{0x01456057, 0x02f1a511, 0x02df7f7b, 0x02417ba6, 0x02a44002, 0x013dd161, 0x0356604f, 0x02f112ff, 0x0192fcb4, 0x0013acca}}, Y: Field{[10]uint32{0x0245c3d4, 0x0185502e, 0x03609216, 0x02319b6d, 0x00e0cc9d, 0x0014400c, 0x0277c673, 0x027c06b6, 0x00f26834, 0x00215daa}}}, + {X: Field{[10]uint32{0x0261a22d, 0x016d322d, 0x01ea269c, 0x008fe4b9, 0x000f2917, 0x026429f0, 0x01428e75, 0x0124cf1b, 0x01efd2eb, 0x000d42cb}}, Y: Field{[10]uint32{0x00de6943, 0x003ec964, 0x0159e354, 0x02a04c83, 0x0370f807, 0x0203bd6f, 0x02126d83, 0x03cd2fcd, 0x0300add9, 0x00186b36}}}, + {X: Field{[10]uint32{0x01f360ff, 0x03f6611d, 0x03017d7a, 0x01ac0c1a, 0x032da3c9, 0x02b284a6, 0x037341ee, 0x0220654c, 0x00bece7f, 0x002453aa}}, Y: Field{[10]uint32{0x01ac7b53, 0x01ca98e1, 0x01213d32, 0x02927f22, 0x03582948, 0x022c90b6, 0x03b563ce, 0x02029d20, 0x0148ebef, 0x003caa95}}}, + {X: Field{[10]uint32{0x03dc0fef, 0x01891ae0, 0x01a33459, 0x03e714f8, 0x03ad6d44, 0x01c38fd7, 0x02baa6bd, 0x0097d2ea, 0x021738da, 0x0003d95b}}, Y: Field{[10]uint32{0x01fd83e5, 0x0076b256, 0x03ef54c3, 0x012c8103, 0x00c742ce, 0x00dcf0b1, 0x025f53cf, 0x024a1c29, 0x00fc3463, 0x00102a2d}}}, + {X: Field{[10]uint32{0x033b618f, 0x0399dc64, 0x00182ce3, 0x008e8849, 0x02d77e10, 0x0036a99b, 0x00310bbc, 0x00f39519, 0x02f0334e, 0x00291f22}}, Y: Field{[10]uint32{0x000c7f08, 0x0254a503, 0x02c4b522, 0x00ba1c57, 0x0341ec5b, 0x0285c4fa, 0x031694ff, 0x01f1d579, 0x0354056d, 0x001b6f32}}}, + {X: Field{[10]uint32{0x00753ca9, 0x01bba74c, 0x02688676, 0x00c47ab3, 0x003b5fde, 0x0085e357, 0x007947f8, 0x0012997a, 0x00625e1d, 0x0002a28a}}, Y: Field{[10]uint32{0x02fc2169, 0x03cbc78b, 0x023ba94d, 0x01d75ce4, 0x021feb3f, 0x03e8426f, 0x039e672e, 0x02813429, 0x02f7483a, 0x003e0ab5}}}, + {X: Field{[10]uint32{0x01c017d0, 0x00fde88c, 0x008371e8, 0x002283d1, 0x034fe062, 0x03f501fb, 0x02903cb3, 0x02e15789, 0x014e5f8e, 0x002807fd}}, Y: Field{[10]uint32{0x032edf92, 0x016cbb83, 0x03ee2f0e, 0x00009d98, 0x009fd59b, 0x01f64945, 0x0018ec07, 0x0069a213, 0x02f9c52f, 0x000891f1}}}, + {X: Field{[10]uint32{0x0142aed1, 0x01f21d63, 0x0072ff2d, 0x038c47d8, 0x0061ef4f, 0x02668c83, 0x02adbd60, 0x03226db2, 0x003a626a, 0x0039ec27}}, Y: Field{[10]uint32{0x00609fdc, 0x02bbf34e, 0x005e2c0f, 0x0285b667, 0x0337c3c5, 0x000f3d68, 0x01c64ace, 0x0143a639, 0x02d36a7b, 0x0023b665}}}, + {X: Field{[10]uint32{0x023ff2fd, 0x016916e1, 0x037173f3, 0x025cdcf2, 0x0196307c, 0x01816410, 0x009fb522, 0x00a81b2a, 0x0253336c, 0x000eeea7}}, Y: Field{[10]uint32{0x03d24799, 0x03a0d049, 0x0160d52a, 0x008dba32, 0x00419d51, 0x0153a6e3, 0x00ccaeae, 0x03f05bd6, 0x01093faf, 0x003cbfa4}}}, + {X: Field{[10]uint32{0x000630a3, 0x0017e70b, 0x00acdaf9, 0x0086d890, 0x0311950c, 0x010cbd4c, 0x01224000, 0x0005d088, 0x02b6dc66, 0x003d8748}}, Y: Field{[10]uint32{0x009ffb05, 0x006915c1, 0x02796142, 0x01405778, 0x00692bb2, 0x0337eac6, 0x02b7e865, 0x00b3ce4f, 0x035a1a66, 0x000181a3}}}, + {X: Field{[10]uint32{0x00a80962, 0x026f9c3a, 0x02d13718, 0x037009c0, 0x01891c45, 0x03cf91c8, 0x0038dcb8, 0x0288b62f, 0x00556b1a, 0x00296d82}}, Y: Field{[10]uint32{0x00b1ddb6, 0x02640cbf, 0x0234a071, 0x01a5f357, 0x023a9b3a, 0x01b060ab, 0x0220b99e, 0x0017287f, 0x03d2d5e3, 0x003ddfe5}}}, + {X: Field{[10]uint32{0x01e1a259, 0x02a97321, 0x02ac1be3, 0x006ca008, 0x02f03030, 0x039bd64b, 0x00ae950b, 0x00958b87, 0x02f900eb, 0x001c30ea}}, Y: Field{[10]uint32{0x00587583, 0x0085ee53, 0x01deb61f, 0x02fa85eb, 0x033f91f2, 0x004eabbd, 0x00626f72, 0x034c6739, 0x03cd31a8, 0x000fcb2d}}}, + {X: Field{[10]uint32{0x0106e530, 0x01744da3, 0x03d93b97, 0x02bf0cf9, 0x01a67952, 0x010f9e44, 0x01fcc4d4, 0x0178dca3, 0x01d1a875, 0x000775c3}}, Y: Field{[10]uint32{0x0190d084, 0x0077f35c, 0x020c4014, 0x01f6dafb, 0x01240e67, 0x03b31cf7, 0x00400742, 0x0253bd1c, 0x01741f58, 0x0011a13e}}}, + {X: Field{[10]uint32{0x0083fcf9, 0x020331a4, 0x035462b1, 0x00f5195c, 0x02f5d37c, 0x034372a0, 0x016bb7f2, 0x03f52f63, 0x018d7aac, 0x0035135a}}, Y: Field{[10]uint32{0x007dc407, 0x026fafc2, 0x03e47281, 0x0104dd02, 0x03c0c940, 0x031056f5, 0x0067b0f4, 0x00a59643, 0x003d0423, 0x00286360}}}, + {X: Field{[10]uint32{0x01b34ca5, 0x02700414, 0x019f9410, 0x00418553, 0x0362730a, 0x02c6f0ee, 0x0122ae74, 0x015d0a15, 0x02e13045, 0x00211626}}, Y: Field{[10]uint32{0x03b3606c, 0x03d88d4d, 0x0390349b, 0x02e8f78e, 0x03de14fc, 0x00be9c1f, 0x02ffce9b, 0x02bd26fd, 0x0208f2a9, 0x002e5e7e}}}, + {X: Field{[10]uint32{0x03724627, 0x034bc122, 0x006f5469, 0x00fff413, 0x01bc84e7, 0x03fc5707, 0x0131c1ef, 0x02265afb, 0x03df8911, 0x000f7b23}}, Y: Field{[10]uint32{0x03eb2c8c, 0x0389c406, 0x0310c16a, 0x028aff50, 0x03daccca, 0x013fe237, 0x011a555f, 0x016f3f6f, 0x03c1e20b, 0x002c50fc}}}, + {X: Field{[10]uint32{0x00cac160, 0x03d0dd02, 0x0012a2f0, 0x037905ed, 0x02023a8d, 0x00339197, 0x01bfcc47, 0x0367180e, 0x03c5519d, 0x000d9e97}}, Y: Field{[10]uint32{0x03f021a6, 0x03eb1729, 0x03cc2dba, 0x00825ea1, 0x03faa648, 0x00f83e3c, 0x011b136a, 0x03f2438a, 0x01df2c6b, 0x0016e3ef}}}, + {X: Field{[10]uint32{0x0063efc1, 0x00c95b25, 0x02cce5fa, 0x03f521ee, 0x031e7c2e, 0x003623a4, 0x03ab6b32, 0x0181bd82, 0x007e7777, 0x0022a956}}, Y: Field{[10]uint32{0x03f091dc, 0x00e7f474, 0x00c1888a, 0x00d11278, 0x0150beeb, 0x02b548a2, 0x02921eca, 0x0284cb05, 0x036c98bf, 0x002b16e9}}}, + {X: Field{[10]uint32{0x0084cae0, 0x01afcf03, 0x038c6a5d, 0x0107b299, 0x02af3aa4, 0x02c34471, 0x00fd9e60, 0x00cba80c, 0x01910ea6, 0x001e7000}}, Y: Field{[10]uint32{0x01dfb899, 0x034b608e, 0x01e85472, 0x037caf46, 0x01ae9c8b, 0x03d0070b, 0x000b659b, 0x02a504eb, 0x00703b19, 0x000fe550}}}, + {X: Field{[10]uint32{0x03a04fc8, 0x03e2fe00, 0x018b3d4e, 0x0292b692, 0x01e858aa, 0x01920c95, 0x01951a06, 0x027a5737, 0x032221a5, 0x00321379}}, Y: Field{[10]uint32{0x02f0a0b9, 0x02f11452, 0x01102158, 0x03483d8e, 0x010548fc, 0x01888112, 0x0011109a, 0x02fca37e, 0x0158915a, 0x001cf37a}}}, + {X: Field{[10]uint32{0x01a9d6d5, 0x01ae24ad, 0x00c218cb, 0x0373f9a5, 0x01fedf74, 0x028f164d, 0x023822b2, 0x01f58781, 0x0050c632, 0x0022c6e3}}, Y: Field{[10]uint32{0x00fe168b, 0x01832c00, 0x037f841f, 0x01ad6d90, 0x00c03676, 0x03fd0c53, 0x03dfc479, 0x0190d7d1, 0x01529f15, 0x0015ef62}}}, + {X: Field{[10]uint32{0x00702c52, 0x00ff5492, 0x03650e78, 0x039dc675, 0x0033a31c, 0x0107e061, 0x0117c4a3, 0x00be6148, 0x008a3ae8, 0x002d17bb}}, Y: Field{[10]uint32{0x020a1c90, 0x0231b867, 0x0046dc98, 0x02167ba4, 0x03254117, 0x0280525e, 0x005d0fce, 0x01ad3c24, 0x035cc708, 0x0033555a}}}, + {X: Field{[10]uint32{0x00757319, 0x001de020, 0x01cd2c57, 0x004e196a, 0x0031ab70, 0x031632f7, 0x034871ea, 0x025b1d9e, 0x00ddd930, 0x0028b577}}, Y: Field{[10]uint32{0x03064547, 0x0351ab92, 0x001a60a6, 0x02a2bd8b, 0x03227ae8, 0x00782d4d, 0x02b5978b, 0x02c8fa79, 0x02b4b130, 0x001ea901}}}, + {X: Field{[10]uint32{0x01ed2b2d, 0x0053066e, 0x025db3d3, 0x0064486b, 0x01e97f6e, 0x01426fb0, 0x0164ea83, 0x0165429d, 0x02b4e5d3, 0x001c480d}}, Y: Field{[10]uint32{0x00a93616, 0x01d0539a, 0x0172a21d, 0x00cbe725, 0x00e3a322, 0x0094d0b2, 0x0298d2f4, 0x0183a811, 0x03f38d05, 0x0009618b}}}, + {X: Field{[10]uint32{0x00bfb392, 0x00ad54bc, 0x02df0756, 0x038c1e56, 0x03dca402, 0x026bf25c, 0x02e58c87, 0x0322ea50, 0x00f7d70f, 0x0016f3bc}}, Y: Field{[10]uint32{0x03af1919, 0x032c2242, 0x0247454c, 0x0391cc95, 0x011a444c, 0x00ff15be, 0x03b0e12c, 0x016ff4fb, 0x024cecb4, 0x001f3216}}}, + {X: Field{[10]uint32{0x01741ada, 0x0076164e, 0x02b0eb5c, 0x00519d9e, 0x03b9e5f2, 0x03d713a6, 0x03ab9f0a, 0x02286c2b, 0x002f9d50, 0x0037355c}}, Y: Field{[10]uint32{0x01cc1fa1, 0x009463b7, 0x0335f9eb, 0x0161bc31, 0x013369d5, 0x00949940, 0x00d40a4a, 0x038e9f73, 0x02d7ea13, 0x003dfaba}}}, + {X: Field{[10]uint32{0x02cb3d9f, 0x02e46ef9, 0x02ec9784, 0x02e4974f, 0x02363bfc, 0x02e2dc5d, 0x01c3ade1, 0x018a7424, 0x00d0004f, 0x000b3a8c}}, Y: Field{[10]uint32{0x01c42624, 0x011825a8, 0x036e3444, 0x0152ce6c, 0x03c48ba4, 0x00f778d2, 0x009a76aa, 0x02c5c73f, 0x03ada42a, 0x002a0fd2}}}, + {X: Field{[10]uint32{0x01c32f8d, 0x01b7f1e8, 0x035d009c, 0x035ba540, 0x01150e54, 0x029064d3, 0x015fcb13, 0x00647b7c, 0x01f2767b, 0x002162d0}}, Y: Field{[10]uint32{0x03de8dd7, 0x03b3e0a7, 0x01358e5c, 0x0277d975, 0x00b34d6e, 0x01200a8a, 0x00a21720, 0x0257d51e, 0x017d76dc, 0x0020602e}}}, + {X: Field{[10]uint32{0x030e81e6, 0x03f40830, 0x01294245, 0x01a034bc, 0x033eb9a6, 0x03d06004, 0x01234e5f, 0x0166e1b4, 0x0002bee3, 0x00357260}}, Y: Field{[10]uint32{0x033781de, 0x02bad256, 0x0376d921, 0x03a47640, 0x03a0b6bc, 0x00bf21ed, 0x01a2e4ee, 0x031e5419, 0x01a4cd2b, 0x0013948b}}}, + {X: Field{[10]uint32{0x0120c1ed, 0x01b0e865, 0x00fb7d4d, 0x01db6a2b, 0x0134002d, 0x00b792df, 0x024ddf58, 0x03aa7dc6, 0x01622f9c, 0x0003afe4}}, Y: Field{[10]uint32{0x02d4e251, 0x02074616, 0x0136ecd4, 0x0126394d, 0x027e43d0, 0x00631d6a, 0x03fb4833, 0x02073638, 0x03223e18, 0x003bb9d4}}}, + {X: Field{[10]uint32{0x0261db4d, 0x01bdb202, 0x01ff6b40, 0x0013cd9a, 0x000acc45, 0x03dd2f9a, 0x002e111a, 0x015bcc23, 0x02a9d087, 0x0000e1fd}}, Y: Field{[10]uint32{0x03cdd28a, 0x02d54ba1, 0x00c4a59d, 0x0288dc89, 0x01ed0bbb, 0x033d73d3, 0x01f96d5d, 0x017e449b, 0x01e3ea1d, 0x000a2165}}}, + {X: Field{[10]uint32{0x03e46714, 0x01d255b7, 0x020df255, 0x03ba7fbc, 0x009aa409, 0x01648051, 0x03a2d70e, 0x0354b8e0, 0x01c0989b, 0x00225ffc}}, Y: Field{[10]uint32{0x01adc9d1, 0x03b3e942, 0x016c6bca, 0x01a4db7f, 0x02de0940, 0x0112a1ce, 0x0295a006, 0x0194a7d3, 0x00c9308c, 0x000f3ef0}}}, + {X: Field{[10]uint32{0x01a395af, 0x01fbc6ad, 0x03eefb57, 0x00ddbe13, 0x03bbcbb3, 0x00b62c93, 0x02bbf21e, 0x02131e2d, 0x00a68e04, 0x000c956a}}, Y: Field{[10]uint32{0x0112aeb3, 0x0089664a, 0x0081fd81, 0x0355107a, 0x0379ef3f, 0x00b5d224, 0x014a426d, 0x012e139b, 0x0002f920, 0x0005ecf0}}}, + {X: Field{[10]uint32{0x01c55599, 0x023be7f7, 0x01b7e277, 0x00079c1c, 0x011fbca1, 0x007b6889, 0x003eeafb, 0x038ec0e5, 0x0152d4d9, 0x000b292a}}, Y: Field{[10]uint32{0x03891e00, 0x00b858c8, 0x016a0989, 0x032d8f28, 0x03e98631, 0x01d231fa, 0x01a2c044, 0x030637e0, 0x02ccdf02, 0x002feb2e}}}, + {X: Field{[10]uint32{0x024383b2, 0x0017dab7, 0x03d73105, 0x03e22936, 0x02046ee5, 0x006dbb2d, 0x03b0410e, 0x00cd2b51, 0x009c478c, 0x0030fa0a}}, Y: Field{[10]uint32{0x02f0f55f, 0x00012cf5, 0x0391fde4, 0x03b89c9e, 0x0000229b, 0x02d3b488, 0x03f4309c, 0x0048e191, 0x02ceb043, 0x0015e4b0}}}, + {X: Field{[10]uint32{0x01119049, 0x02f49f05, 0x019d5f87, 0x02376e4b, 0x0086fb96, 0x01fe6108, 0x03ad63c6, 0x024be619, 0x0360a862, 0x000aef7b}}, Y: Field{[10]uint32{0x00a85362, 0x0219d598, 0x03538802, 0x018953c0, 0x00e75dac, 0x03503534, 0x0099d193, 0x0311e4a4, 0x03623536, 0x003d292d}}}, + {X: Field{[10]uint32{0x032496a9, 0x00cf2e7f, 0x03d2ce03, 0x01ef88ab, 0x01fe3ee4, 0x005292f8, 0x0014ef07, 0x02b2cc60, 0x00909e7d, 0x001de9b8}}, Y: Field{[10]uint32{0x0251065f, 0x01746214, 0x00384381, 0x009f858f, 0x0234461e, 0x00658524, 0x01915d18, 0x0241b347, 0x0075b1a9, 0x00153c39}}}, + {X: Field{[10]uint32{0x00f40ff0, 0x00e79141, 0x00b1145c, 0x0391e4d4, 0x02ea94d5, 0x01e7d935, 0x034f4139, 0x0249537a, 0x016b7871, 0x0034656e}}, Y: Field{[10]uint32{0x00e0636c, 0x01fdca70, 0x0069bd99, 0x02b696bd, 0x00b8245c, 0x002936e2, 0x032d4b2b, 0x0211ba51, 0x0040613c, 0x0008e291}}}, + {X: Field{[10]uint32{0x00815b1f, 0x029866c1, 0x01bd8113, 0x00552369, 0x00ad024d, 0x00213d05, 0x03b0f3c6, 0x029975d6, 0x0336208a, 0x0030e6a8}}, Y: Field{[10]uint32{0x0126fe5a, 0x00cc54c4, 0x012004b2, 0x014db612, 0x02455a00, 0x0395cfb9, 0x0083b226, 0x00775052, 0x02d63274, 0x001eaac7}}}, + {X: Field{[10]uint32{0x01e31f30, 0x01dd933f, 0x028d2296, 0x01c11362, 0x01d6661c, 0x00932ecc, 0x020bd270, 0x020b6f2f, 0x023d0baf, 0x003a0328}}, Y: Field{[10]uint32{0x0197451b, 0x0211d129, 0x017138c4, 0x01091a18, 0x01f67e81, 0x03ae0f97, 0x03c583a5, 0x01e1e2f2, 0x01d47318, 0x002854f4}}}, + {X: Field{[10]uint32{0x0272ef80, 0x032dec0b, 0x00120711, 0x017f82bb, 0x01f3e850, 0x0356569f, 0x016723a4, 0x0308e83e, 0x0265a5a9, 0x000e56de}}, Y: Field{[10]uint32{0x009bf990, 0x026979f9, 0x034b6222, 0x000ca64b, 0x034f88cf, 0x02895950, 0x02d37b19, 0x01b8e4da, 0x01d54747, 0x00164083}}}, + {X: Field{[10]uint32{0x010b495c, 0x03f688a4, 0x02577644, 0x0117ffbc, 0x02e8b495, 0x0144a976, 0x017e2cd9, 0x008f49ed, 0x00dbb83e, 0x0019e9fa}}, Y: Field{[10]uint32{0x00965735, 0x014c0cba, 0x01f15a87, 0x03b9a338, 0x0041fd34, 0x03a02d04, 0x00a89f78, 0x02e7d040, 0x019d3791, 0x001f0052}}}, + {X: Field{[10]uint32{0x01c0c7e7, 0x02cecfdb, 0x03892ac9, 0x00218508, 0x03ecfb4b, 0x032f8b38, 0x01863952, 0x039ec21a, 0x027d76d2, 0x003100e3}}, Y: Field{[10]uint32{0x01e92f3b, 0x0080d459, 0x0229e72f, 0x002d9909, 0x00012946, 0x030d3f23, 0x02a27bab, 0x026df4c9, 0x030d9efc, 0x00186ece}}}, + {X: Field{[10]uint32{0x03a25e5a, 0x0095a630, 0x019a88a5, 0x00201c28, 0x01b9bdda, 0x03f0fd5d, 0x029c52f5, 0x034ebbb9, 0x01e226a4, 0x001dc169}}, Y: Field{[10]uint32{0x03c7a1b7, 0x020f92d4, 0x022073a8, 0x00088901, 0x0244be9e, 0x0071aa60, 0x0026973d, 0x001be309, 0x016cf019, 0x00116382}}}, + {X: Field{[10]uint32{0x00ff48d0, 0x028d1d4d, 0x028759e4, 0x03c6d192, 0x0268a5f1, 0x007f80e5, 0x02994fa0, 0x02d7985a, 0x03c35958, 0x003cf3a2}}, Y: Field{[10]uint32{0x010058fe, 0x02891cf8, 0x00d6b222, 0x02821d40, 0x038dc92a, 0x01ebb18f, 0x008c441f, 0x035e2d9f, 0x0197be3a, 0x00270687}}}, + {X: Field{[10]uint32{0x00a4e0d0, 0x0279fccf, 0x005d7664, 0x02b6bd5a, 0x003ebb94, 0x00075be2, 0x029d764e, 0x033af6e6, 0x0120de69, 0x002417b0}}, Y: Field{[10]uint32{0x00a9d554, 0x039127a7, 0x030e93a8, 0x004b5e6a, 0x024d42ce, 0x01470032, 0x00a75d0e, 0x02a8e9dd, 0x02993974, 0x0024985f}}}, + {X: Field{[10]uint32{0x0321eeed, 0x02b69a26, 0x006b4f15, 0x011ff6c9, 0x0127d484, 0x01993078, 0x02d0edc3, 0x02164a2e, 0x024da357, 0x002c6dd2}}, Y: Field{[10]uint32{0x013206d9, 0x02c9baa7, 0x021328f5, 0x0240cf13, 0x00c14e4d, 0x00c8b134, 0x00e38231, 0x027a3ef3, 0x01c7b84e, 0x00310d4e}}}, + {X: Field{[10]uint32{0x03d8bcf1, 0x03ee58c0, 0x02025bd5, 0x01344b4f, 0x038dcf81, 0x0310b6ad, 0x03a2a471, 0x00b51acb, 0x0165c72f, 0x00035100}}, Y: Field{[10]uint32{0x0343ae3e, 0x001c87d4, 0x0022aca3, 0x01247601, 0x03fabab7, 0x031da0f7, 0x03ad9cff, 0x017eb3a5, 0x0150261f, 0x00382192}}}, + {X: Field{[10]uint32{0x0053b303, 0x00fe4e54, 0x02ed1de0, 0x02bd9602, 0x03fe08d5, 0x0355ce95, 0x03910be6, 0x00669fde, 0x004f722c, 0x003fd493}}, Y: Field{[10]uint32{0x0353bf0d, 0x02ea986d, 0x0391398f, 0x01a18bd7, 0x035b9f13, 0x00c80cd6, 0x0262deab, 0x02aa2ece, 0x014e5b25, 0x0003f52b}}}, + {X: Field{[10]uint32{0x018d091e, 0x017fbc63, 0x01a4463a, 0x02c128eb, 0x038fafa2, 0x02706e90, 0x0376a53c, 0x00420f92, 0x00bd331c, 0x003bff78}}, Y: Field{[10]uint32{0x01947dde, 0x038530c7, 0x02b9aee0, 0x037cad06, 0x02c563bd, 0x01b33bc3, 0x02e54208, 0x0084179a, 0x029ca75c, 0x003f5ea1}}}, + {X: Field{[10]uint32{0x033875e8, 0x03115c4b, 0x01278f40, 0x01939027, 0x021115ba, 0x0160eb6c, 0x034a304b, 0x03667a22, 0x02c099c8, 0x002979d1}}, Y: Field{[10]uint32{0x02934a68, 0x0307bbcb, 0x00c07fd2, 0x00e7767a, 0x02841709, 0x001cfdff, 0x00baba4f, 0x00e0c0b1, 0x0112c2af, 0x001fe0c8}}}, + {X: Field{[10]uint32{0x02ccb431, 0x006424cc, 0x0246a1ba, 0x01d121be, 0x037df5e2, 0x03f91544, 0x00daa722, 0x03a50e76, 0x01e3af5e, 0x001ab32e}}, Y: Field{[10]uint32{0x0328dcae, 0x03277267, 0x01dc443e, 0x00207f3d, 0x01a3faf1, 0x01a3e4b9, 0x03c26a9b, 0x01960141, 0x0258842d, 0x003c3785}}}, + {X: Field{[10]uint32{0x032b6d4e, 0x0225e2bd, 0x023ba1ec, 0x00c7b404, 0x00b86f3d, 0x03be15a6, 0x00e782b3, 0x00cafdba, 0x0055e40d, 0x003204f4}}, Y: Field{[10]uint32{0x01068ca6, 0x01e40463, 0x0128d288, 0x03d0aee5, 0x0047d37e, 0x021318a0, 0x01a41916, 0x0118c713, 0x03572f92, 0x002ebdb5}}}, + {X: Field{[10]uint32{0x03c7aaf9, 0x02a11365, 0x01177038, 0x0398bf7c, 0x03599dfa, 0x02f93561, 0x03baeb58, 0x03f18913, 0x00122cad, 0x0022e208}}, Y: Field{[10]uint32{0x02f7a6a3, 0x00f1e081, 0x00b2d409, 0x0291da02, 0x007867c8, 0x029690aa, 0x016e131f, 0x003693dc, 0x0293ac90, 0x003d79b0}}}, + {X: Field{[10]uint32{0x017310ce, 0x006760cb, 0x017ee096, 0x00d1341c, 0x03bc02ff, 0x03fea910, 0x00a5acc4, 0x03960ad5, 0x0050f49e, 0x0023c1d4}}, Y: Field{[10]uint32{0x01f7fd3f, 0x0284c56d, 0x021c9b99, 0x02a1adc0, 0x01f1f9f9, 0x011e668f, 0x00555c4a, 0x034c95f3, 0x01bb7ab3, 0x0004ee40}}}, + {X: Field{[10]uint32{0x00374c58, 0x035047ec, 0x01f66921, 0x036c8720, 0x0389a456, 0x00bdcb25, 0x025fb1df, 0x00f950f1, 0x02f8cf64, 0x002ef214}}, Y: Field{[10]uint32{0x030a590b, 0x012ee8ac, 0x032cd4c1, 0x00be13c0, 0x03a27e1c, 0x02c922cf, 0x03f604cf, 0x007892ca, 0x02bbe797, 0x002b423a}}}, + {X: Field{[10]uint32{0x0280bc1f, 0x000940c6, 0x009fcffa, 0x0332c795, 0x03009278, 0x03730b72, 0x00edddc9, 0x0156ee1e, 0x004b662b, 0x000b5df7}}, Y: Field{[10]uint32{0x00d058eb, 0x01821c3b, 0x03fffa8e, 0x0282272b, 0x02c07707, 0x01dbbdbb, 0x01a62f4e, 0x03ca86b4, 0x00d84fa7, 0x000a22ec}}}, + {X: Field{[10]uint32{0x03ccbdf9, 0x01e452b5, 0x00b4ffea, 0x02ae7216, 0x00c90945, 0x012ee9b2, 0x03df7d99, 0x02a1bae6, 0x031ff3b4, 0x002f20fd}}, Y: Field{[10]uint32{0x03232292, 0x034f9252, 0x00b30020, 0x018e8ea2, 0x01fa3c25, 0x03446550, 0x01ed4553, 0x01f48e02, 0x03a3e506, 0x00063a47}}}, + {X: Field{[10]uint32{0x00200919, 0x036d0d4b, 0x037b3205, 0x03038aee, 0x0045f83d, 0x011f4149, 0x0211b7e8, 0x02239ac3, 0x02578d9b, 0x001f56e5}}, Y: Field{[10]uint32{0x00515ba9, 0x03d55c24, 0x00d352fa, 0x01caabf5, 0x00b1c9e6, 0x015a6bd3, 0x00e7230c, 0x0304370a, 0x037b8830, 0x00079a27}}}, + {X: Field{[10]uint32{0x000cdc80, 0x03e4a288, 0x03cdc1ba, 0x021f2b30, 0x01516148, 0x01183128, 0x01bab4c7, 0x021a20c7, 0x03648d75, 0x00217a7c}}, Y: Field{[10]uint32{0x01369e27, 0x0239684c, 0x03a9dd5f, 0x03d300ff, 0x035ba5e4, 0x001fdff0, 0x025224cc, 0x01170161, 0x01180d50, 0x001fd339}}}, + {X: Field{[10]uint32{0x02cd0810, 0x00765d12, 0x0065da10, 0x01dd16c7, 0x029c1d10, 0x02ef6dc6, 0x0055816d, 0x0252f4d2, 0x00dfc1c0, 0x001094e4}}, Y: Field{[10]uint32{0x0349bc00, 0x01df53c7, 0x0327d1e2, 0x030c2303, 0x02707547, 0x0027785d, 0x0026d94f, 0x0135c1a4, 0x00dd20ef, 0x00207c53}}}, + {X: Field{[10]uint32{0x013549d7, 0x036bfd90, 0x004194ce, 0x0026fe39, 0x02dbb594, 0x00283dd6, 0x00d00bb6, 0x024eb094, 0x030b66dc, 0x000f31f3}}, Y: Field{[10]uint32{0x00204a58, 0x01307587, 0x0323a066, 0x00668afa, 0x02ae17b7, 0x037dc399, 0x008bcf99, 0x036267da, 0x032fc3db, 0x000cc698}}}, + {X: Field{[10]uint32{0x0270853d, 0x00acfaf3, 0x035f017e, 0x00a8af8e, 0x009d6a0b, 0x03fde276, 0x03c923bc, 0x02f3a023, 0x008db8a1, 0x003f5c82}}, Y: Field{[10]uint32{0x01eaf599, 0x0037b242, 0x03494b71, 0x02a37d91, 0x0193db4a, 0x0282fb76, 0x03296383, 0x0066ebac, 0x0323a388, 0x0034e44a}}}, + {X: Field{[10]uint32{0x03e65060, 0x02cd6b3b, 0x037a6b72, 0x01071f74, 0x01c73185, 0x0282ea89, 0x00940af9, 0x025b6936, 0x038d5e00, 0x000f9563}}, Y: Field{[10]uint32{0x0260e90a, 0x01414f79, 0x00dde769, 0x00c5ffb0, 0x03f78f64, 0x02ea56e1, 0x03bdb3ef, 0x020170fa, 0x017f069d, 0x000a900f}}}, + {X: Field{[10]uint32{0x00694a7e, 0x03c81276, 0x00b01e82, 0x00aa43f4, 0x03721ec3, 0x0386dd17, 0x0000149f, 0x03c8885b, 0x0223f525, 0x001c1c20}}, Y: Field{[10]uint32{0x03d12569, 0x036afafb, 0x0354b410, 0x02218d98, 0x01fce17d, 0x01f650ed, 0x0186ac90, 0x0354fc67, 0x0387f0b4, 0x003bd2b5}}}, + {X: Field{[10]uint32{0x02414f72, 0x03a4452a, 0x012fc6e5, 0x02537be7, 0x02440b4a, 0x007933dd, 0x01eddb71, 0x03ebd92e, 0x0225eabf, 0x003b28a5}}, Y: Field{[10]uint32{0x037618cf, 0x00e2e388, 0x009dcd35, 0x00a0a0e6, 0x03f798b6, 0x03162433, 0x03bb2274, 0x028ff2c8, 0x007575af, 0x003c7e0e}}}, + {X: Field{[10]uint32{0x03297695, 0x00e3d957, 0x00108778, 0x02959b5b, 0x02da7423, 0x02186496, 0x0206db46, 0x03c31311, 0x0350542d, 0x0016df11}}, Y: Field{[10]uint32{0x011f784d, 0x008ae79e, 0x010795f9, 0x00b57a01, 0x01de04db, 0x033669a9, 0x00cb1a24, 0x02227f5b, 0x03661ae1, 0x0010a044}}}, + {X: Field{[10]uint32{0x00012042, 0x026e61af, 0x0038cb37, 0x01a20016, 0x02bd5da1, 0x039e20bf, 0x02982dd1, 0x02cbbb4d, 0x03e6040c, 0x002bc697}}, Y: Field{[10]uint32{0x013e6224, 0x0104856b, 0x00778b7e, 0x023a18f5, 0x02576877, 0x03f3f228, 0x03d12ed1, 0x0298d298, 0x0149305f, 0x001c55c1}}}, + {X: Field{[10]uint32{0x0366b1d2, 0x00659da4, 0x0346a9a3, 0x022c755d, 0x03e1e8b1, 0x00627132, 0x03cd1be1, 0x01f9c3e0, 0x03a24678, 0x001c9d10}}, Y: Field{[10]uint32{0x0116d540, 0x024a341b, 0x03dead68, 0x0303480b, 0x004df56a, 0x01dc396d, 0x02565cc1, 0x00fa2684, 0x00269bba, 0x00218d5e}}}, + {X: Field{[10]uint32{0x02640b8d, 0x03866284, 0x012556c5, 0x00aeafcf, 0x03ae2c9a, 0x004e647d, 0x01e68352, 0x0398a852, 0x0179db34, 0x0000259e}}, Y: Field{[10]uint32{0x019edcc4, 0x0301f07f, 0x03b014d4, 0x009c946c, 0x018547b8, 0x02fcf47b, 0x02e44ac3, 0x015944f3, 0x014f5244, 0x00267707}}}, + {X: Field{[10]uint32{0x03203601, 0x03ee20eb, 0x038b159d, 0x01f6f95e, 0x02be5693, 0x0016c1ac, 0x02f9d739, 0x0124789f, 0x01db08f3, 0x001e5002}}, Y: Field{[10]uint32{0x02da40b6, 0x0329878a, 0x017e750e, 0x009090e4, 0x005db60d, 0x022761ad, 0x026a0872, 0x03873456, 0x024d7ee5, 0x00169ab5}}}, + {X: Field{[10]uint32{0x01851d10, 0x018a5faa, 0x015110cf, 0x00bd41e4, 0x03d2f421, 0x03ec3747, 0x029470b1, 0x02c2436e, 0x02396f90, 0x0021f2f6}}, Y: Field{[10]uint32{0x001b63f0, 0x02480169, 0x013e773a, 0x014b8473, 0x03fb8f79, 0x01561771, 0x01fb4c9c, 0x03e65d40, 0x01f3a2a4, 0x00272825}}}, + {X: Field{[10]uint32{0x0110acb0, 0x0116c06e, 0x01fa84b2, 0x036816e5, 0x02cd1f3a, 0x006f9f84, 0x00207720, 0x005d4963, 0x0303475d, 0x0027b55e}}, Y: Field{[10]uint32{0x03bbd5eb, 0x03ba8da8, 0x0350d324, 0x0112387b, 0x03253106, 0x0032cfa2, 0x0058a7bd, 0x0206be17, 0x005443bd, 0x00356324}}}, + {X: Field{[10]uint32{0x028b0402, 0x00d53980, 0x02be7d5d, 0x0087f499, 0x0335fd95, 0x01844cd8, 0x02c77e38, 0x011260b6, 0x022292ca, 0x003be342}}, Y: Field{[10]uint32{0x00b58b6b, 0x01629d0f, 0x0037ff97, 0x034b8ad0, 0x02f2f547, 0x01df06a6, 0x0223e5b6, 0x02076a92, 0x034a5568, 0x00395712}}}, + {X: Field{[10]uint32{0x0127e3d9, 0x000565f4, 0x01c75abd, 0x0386c4bd, 0x002299f6, 0x03e93b42, 0x02d369f4, 0x03ca7540, 0x01f5a274, 0x001b6e88}}, Y: Field{[10]uint32{0x01a39d94, 0x0369de94, 0x00f3c930, 0x02774b7c, 0x01c951f6, 0x039ba720, 0x00302de3, 0x03907a31, 0x032f0a0c, 0x001da17d}}}, + {X: Field{[10]uint32{0x00399a3d, 0x0111a4f2, 0x032aa6ba, 0x026dfecc, 0x02784196, 0x01bb4a94, 0x001b0f42, 0x0308d5f7, 0x02bf857a, 0x0023370f}}, Y: Field{[10]uint32{0x03f910ca, 0x01dbe92d, 0x02beca58, 0x02ac9d22, 0x03df250d, 0x02da2866, 0x00d87249, 0x031c501b, 0x03c1915a, 0x0008d374}}}, + {X: Field{[10]uint32{0x01eca2da, 0x03f620ad, 0x00de1e88, 0x03e8a4d1, 0x00a9c790, 0x011c1a26, 0x03391b6f, 0x0196d1f8, 0x01c8caa6, 0x0028020a}}, Y: Field{[10]uint32{0x01424110, 0x02d4c5bf, 0x02aa8184, 0x025d81a3, 0x00234862, 0x020c6095, 0x004b1299, 0x01333962, 0x00c71e83, 0x002df23f}}}, + {X: Field{[10]uint32{0x0149ce6a, 0x02007748, 0x005f5640, 0x00bbbfdf, 0x02a4ed5b, 0x0353c8b5, 0x012e54a1, 0x02fac528, 0x0362446c, 0x00161cbd}}, Y: Field{[10]uint32{0x00ee198f, 0x0283070a, 0x01e2ac75, 0x0362eeb3, 0x004c37d5, 0x010d93bd, 0x030c29e2, 0x015fe869, 0x03e88627, 0x0022ab34}}}, + {X: Field{[10]uint32{0x02fd34f2, 0x0331ae40, 0x03b2fec4, 0x02b24674, 0x0353e7ce, 0x016d4cb3, 0x02677d2e, 0x01c543c8, 0x01c05dba, 0x002dc3b5}}, Y: Field{[10]uint32{0x00d28cf8, 0x035120a9, 0x0083126b, 0x026c2158, 0x0376c3d6, 0x006363f2, 0x03cee0b0, 0x005c728b, 0x0128cc74, 0x001f90fd}}}, + {X: Field{[10]uint32{0x0053bb52, 0x00305ae0, 0x027d309d, 0x00169e42, 0x022e8ca5, 0x03ac272e, 0x01a6d7c8, 0x0187431f, 0x02133c61, 0x0012faa8}}, Y: Field{[10]uint32{0x01d4f6d5, 0x02b372a6, 0x03ffadb1, 0x01b30a62, 0x03070349, 0x012cbb84, 0x0226d8fe, 0x0368bb19, 0x003c9cbd, 0x00369302}}}, + {X: Field{[10]uint32{0x01804831, 0x003a07c1, 0x035fc8a1, 0x00d134d3, 0x0108594b, 0x017e6af4, 0x00de363c, 0x0060d29e, 0x02c653ce, 0x002a34c7}}, Y: Field{[10]uint32{0x02c5cff9, 0x0130a1b6, 0x00bce64f, 0x00616529, 0x008c462c, 0x02df22e9, 0x01b5601c, 0x038dc27b, 0x01cd7cbb, 0x002d35aa}}}, +} + +var prec = [64][16]XY{ + { + {X: Field{[10]uint32{0x02f81798, 0x00a056c5, 0x028d959f, 0x036cb738, 0x03029bfc, 0x03a1c2c1, 0x0206295c, 0x02eeb156, 0x027ef9dc, 0x001e6f99}}, Y: Field{[10]uint32{0x0310d4b8, 0x01f423fe, 0x014199c4, 0x01229a15, 0x00fd17b4, 0x0384422a, 0x024fbfc0, 0x03119576, 0x027726a3, 0x00120eb6}}}, + {X: Field{[10]uint32{0x00709ee5, 0x03026e57, 0x03ca7aba, 0x012e33bc, 0x005c778e, 0x01701f36, 0x005406e9, 0x01f5b4c1, 0x039441ed, 0x0031811f}}, Y: Field{[10]uint32{0x00cfe52a, 0x010c6a54, 0x010e1236, 0x0194c99b, 0x02f7f632, 0x019b3abb, 0x00584194, 0x030ce68f, 0x00fea63d, 0x0006b85a}}}, + {X: Field{[10]uint32{0x00e036f9, 0x007c44ef, 0x019b0860, 0x01160dbe, 0x01b531c8, 0x0227548a, 0x0344f85f, 0x030c4124, 0x02019258, 0x003e4c22}}, Y: Field{[10]uint32{0x00b8e672, 0x027f5d61, 0x0231b6cb, 0x0264d308, 0x026500a9, 0x028dfcd5, 0x02337e62, 0x03a0503f, 0x030f632d, 0x000e23de}}}, + {X: Field{[10]uint32{0x00c4cd13, 0x02a52afa, 0x0358474f, 0x02403b81, 0x00cc6c13, 0x00c2c501, 0x01e49049, 0x0203cd60, 0x03f1c10d, 0x003924f6}}, Y: Field{[10]uint32{0x03739922, 0x025ef711, 0x03e40cfe, 0x00cefef7, 0x00d967ae, 0x03a94512, 0x002e2098, 0x0156dd59, 0x013ea0d4, 0x00147b66}}}, + {X: Field{[10]uint32{0x0240efe4, 0x02355a6c, 0x01ab7cba, 0x02f77186, 0x00e88b84, 0x0297144a, 0x034a7250, 0x00824d56, 0x024d1a07, 0x000be2f7}}, Y: Field{[10]uint32{0x02ac62d6, 0x021f4ea9, 0x02840dca, 0x006eac35, 0x02f78827, 0x01b27109, 0x01ba9dda, 0x038f5b53, 0x022636e5, 0x00362b08}}}, + {X: Field{[10]uint32{0x00297556, 0x015e8518, 0x0218b2f0, 0x00be15a2, 0x0382f647, 0x01548d74, 0x0053a143, 0x03ba9081, 0x03d5755e, 0x003ffe5e}}, Y: Field{[10]uint32{0x0075f297, 0x01c30dac, 0x024a03c8, 0x03d9463f, 0x00de80f0, 0x03d17158, 0x03e96017, 0x02d883ce, 0x037aacfb, 0x002b849d}}}, + {X: Field{[10]uint32{0x02c4f9bc, 0x02f77b72, 0x0239ce92, 0x01f80cc3, 0x023d419b, 0x00ba9e83, 0x018f365f, 0x02d3aa8e, 0x00646e5d, 0x00172f7c}}, Y: Field{[10]uint32{0x007264da, 0x02098a02, 0x027b5a50, 0x02e04ff7, 0x03a813d0, 0x01869536, 0x0178d6d8, 0x0165828c, 0x0240ba25, 0x001abaf2}}}, + {X: Field{[10]uint32{0x010a2a01, 0x0213bcf8, 0x0088a677, 0x001796be, 0x030a1bdd, 0x01c3cf0b, 0x033843fb, 0x00d476bf, 0x01e15cca, 0x000bc079}}, Y: Field{[10]uint32{0x00bde904, 0x028b2ddb, 0x03617b5d, 0x035ae96d, 0x00c2e213, 0x00cb44ed, 0x03d082a1, 0x026524a4, 0x00a74153, 0x0017136a}}}, + {X: Field{[10]uint32{0x0027ccbe, 0x03c4437f, 0x02714c35, 0x025d315f, 0x01e09796, 0x03d566af, 0x02d178a9, 0x03d94c26, 0x00e2f0c7, 0x002b3521}}, Y: Field{[10]uint32{0x024f9c37, 0x03098ab1, 0x00e0f05c, 0x0290dd7e, 0x01add888, 0x018ed87a, 0x03809717, 0x0367f590, 0x0121b0a7, 0x00330ce2}}}, + {X: Field{[10]uint32{0x03e247c7, 0x01a38a91, 0x002b752a, 0x026c650f, 0x013442d4, 0x02b9ab97, 0x0077c7b1, 0x032188d5, 0x019e47f3, 0x002810d3}}, Y: Field{[10]uint32{0x037368d7, 0x03b94ec0, 0x021593cb, 0x00bb61de, 0x016f794c, 0x00e8931a, 0x036c7e69, 0x02f09e8e, 0x02425419, 0x00224eae}}}, + {X: Field{[10]uint32{0x01a008cb, 0x0305e257, 0x03891bbe, 0x002f9705, 0x00564998, 0x003196ab, 0x034246b7, 0x0104797b, 0x03f858a9, 0x001dd2b9}}, Y: Field{[10]uint32{0x0153c61b, 0x035d3272, 0x016a8301, 0x038b7fe7, 0x01372db1, 0x01edecd9, 0x003dd56d, 0x01786409, 0x0032eb6b, 0x00366128}}}, + {X: Field{[10]uint32{0x00afe85a, 0x003d1c1c, 0x0095bc5b, 0x01065880, 0x03687cf4, 0x035cd18c, 0x0038f004, 0x01586c57, 0x01d548e7, 0x00340445}}, Y: Field{[10]uint32{0x00062327, 0x0146c4fd, 0x02d526b0, 0x017766a1, 0x0179238c, 0x005ef605, 0x0364537e, 0x03835ea2, 0x03fdc815, 0x002a7cd3}}}, + {X: Field{[10]uint32{0x01405aa8, 0x0377e3c6, 0x018cddee, 0x03198439, 0x01b075fb, 0x00dd2194, 0x011d205c, 0x00a22f1f, 0x03c2d975, 0x003ca1dc}}, Y: Field{[10]uint32{0x0303ed81, 0x0172d4b6, 0x0291f29b, 0x0369487e, 0x033a1a06, 0x01736bd1, 0x00212eb6, 0x002a25d6, 0x002e8d88, 0x0002ac24}}}, + {X: Field{[10]uint32{0x00e823e4, 0x02c90698, 0x009e6e49, 0x018d9e25, 0x0226aa7b, 0x01f4e38c, 0x024e67f0, 0x01c673f5, 0x039e895e, 0x001267f7}}, Y: Field{[10]uint32{0x03a13f5b, 0x03d03500, 0x015bcc65, 0x0309e8fe, 0x00464279, 0x01ecf519, 0x03044e4a, 0x02154643, 0x02c4b54e, 0x0032b0bd}}}, + {X: Field{[10]uint32{0x027e080e, 0x036f3e38, 0x0379e44a, 0x01bcf217, 0x0131e594, 0x0257fd04, 0x0065ae30, 0x03aa5969, 0x014f7d43, 0x0035e493}}, Y: Field{[10]uint32{0x02a26b58, 0x013727fd, 0x013a5c50, 0x00af625b, 0x03ea40af, 0x02331b7b, 0x0042ec22, 0x01ca9a0e, 0x0072a86c, 0x0016078a}}}, + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + }, + { + {X: Field{[10]uint32{0x026dec0a, 0x03ba278a, 0x01ae9c44, 0x01a6e1e9, 0x03b2a313, 0x00708fa5, 0x011aabc2, 0x027b14c0, 0x0293b59e, 0x003983f3}}, Y: Field{[10]uint32{0x01616821, 0x00cb339a, 0x03f0be1f, 0x00791348, 0x00129689, 0x015e4dc4, 0x0399f34f, 0x02564a76, 0x007399e5, 0x003df8d4}}}, + {X: Field{[10]uint32{0x03143e65, 0x0036f501, 0x0261d75d, 0x02e26412, 0x02dacffc, 0x00bcde33, 0x036e054e, 0x0288b51e, 0x01d74fb5, 0x0034c066}}, Y: Field{[10]uint32{0x00106ab9, 0x00ffc7c9, 0x0019605b, 0x030d93b6, 0x011f760c, 0x0260e019, 0x016dec9e, 0x03570ecf, 0x019d0ae3, 0x002540e3}}}, + {X: Field{[10]uint32{0x0118e5c3, 0x021c2a84, 0x02bc19bd, 0x009d14af, 0x03fc579b, 0x013996d2, 0x001656ef, 0x00c1f6d1, 0x035d9645, 0x001bb28c}}, Y: Field{[10]uint32{0x01a08668, 0x028bde01, 0x02c34498, 0x00e8efe3, 0x003a496a, 0x012e1d68, 0x02f57907, 0x001c4164, 0x03b57a7a, 0x00354048}}}, + {X: Field{[10]uint32{0x0074ef8b, 0x024639be, 0x03d81e37, 0x007736eb, 0x00fc4c6f, 0x020ca08f, 0x01051eaf, 0x03aadc2c, 0x01542d16, 0x002fc8f0}}, Y: Field{[10]uint32{0x02831d9f, 0x00dfbf99, 0x02f784dc, 0x01520478, 0x00c522fc, 0x0294e4b9, 0x01928a0b, 0x000dcdeb, 0x026fc330, 0x00172ce1}}}, + {X: Field{[10]uint32{0x0387f62e, 0x034c7853, 0x021270ec, 0x00e18dc5, 0x0010e6e6, 0x00d1967c, 0x03c744ed, 0x0243b035, 0x03bef1bf, 0x003a588e}}, Y: Field{[10]uint32{0x004ee737, 0x004fabe9, 0x0044e530, 0x032775a2, 0x01fe6043, 0x03b6aa4a, 0x03e953a8, 0x0267a783, 0x003b4bc2, 0x000e2a5d}}}, + {X: Field{[10]uint32{0x038cb0e3, 0x00ceb29f, 0x023a4439, 0x00ff87bf, 0x02a22eb5, 0x02cbadcb, 0x0264e044, 0x01b63e3e, 0x00e57445, 0x000fc3a0}}, Y: Field{[10]uint32{0x025f404f, 0x00a278ba, 0x013a4cb0, 0x00ea996d, 0x03950125, 0x0217406c, 0x00b9c084, 0x02f247a4, 0x03d7296c, 0x0032d9b5}}}, + {X: Field{[10]uint32{0x028d733c, 0x02ab7e0a, 0x028f9eb0, 0x02fd8bf2, 0x02ffc274, 0x002035a0, 0x004a36f2, 0x0076e822, 0x0173e516, 0x002f20b7}}, Y: Field{[10]uint32{0x007797f0, 0x0218413d, 0x017301e7, 0x02eb9ce2, 0x03ae93a0, 0x0067c0b7, 0x029b4bf7, 0x0072b152, 0x003a044b, 0x00397ca3}}}, + {X: Field{[10]uint32{0x0369a24e, 0x001dd159, 0x01655647, 0x035c014d, 0x00bcf55c, 0x01f459c7, 0x02c3d09f, 0x01e819a5, 0x03e4033f, 0x000d3fce}}, Y: Field{[10]uint32{0x03cc2f1a, 0x00419e9c, 0x03681849, 0x030fa3e2, 0x0055df16, 0x020c8263, 0x02619d89, 0x01b154fd, 0x01623a23, 0x00176744}}}, + {X: Field{[10]uint32{0x03bc7671, 0x03f88c57, 0x00e32d7e, 0x03214a16, 0x00743f1b, 0x01e63d24, 0x00291ce1, 0x01c84748, 0x0248c765, 0x00238f44}}, Y: Field{[10]uint32{0x00717dec, 0x00771906, 0x0144a7ef, 0x02aa98f8, 0x02b9352b, 0x00e4fa43, 0x00480e19, 0x032e07d9, 0x00e10ecf, 0x00026692}}}, + {X: Field{[10]uint32{0x01b03f6c, 0x030cab54, 0x0184b05e, 0x0048aa6c, 0x02a4d047, 0x03dcfd5d, 0x00776838, 0x036488af, 0x03a27a52, 0x000c2244}}, Y: Field{[10]uint32{0x00fe4c67, 0x02d7bf3a, 0x01f1260a, 0x03aa0af4, 0x01a8333f, 0x01b00dd7, 0x023531f6, 0x02f97e47, 0x009543fe, 0x003d296c}}}, + {X: Field{[10]uint32{0x02b31db2, 0x021d0caf, 0x006a0f32, 0x009e23d4, 0x028fcae8, 0x002228ad, 0x02a193ed, 0x02926225, 0x01aa2234, 0x001e2a24}}, Y: Field{[10]uint32{0x01fa4343, 0x027588ee, 0x0382d306, 0x03376002, 0x0254379b, 0x01cc0b7d, 0x035f2552, 0x00d72ff3, 0x035beb50, 0x001a44a8}}}, + {X: Field{[10]uint32{0x03ce1752, 0x01d43dcc, 0x0204ec7b, 0x025f5f34, 0x02e783c7, 0x026726ba, 0x02ddf64d, 0x0318d604, 0x0258d01d, 0x0035e836}}, Y: Field{[10]uint32{0x0362cef4, 0x0009ce01, 0x03742bbc, 0x02a3018a, 0x010be040, 0x0038a119, 0x03292834, 0x0200cbdb, 0x00e06800, 0x002449dc}}}, + {X: Field{[10]uint32{0x01b0e595, 0x0123dde3, 0x002bb653, 0x02e7ee82, 0x03a7163c, 0x00581dba, 0x00e37658, 0x006c5f5f, 0x001855db, 0x001f619e}}, Y: Field{[10]uint32{0x00733de8, 0x01478eaf, 0x01532999, 0x01383897, 0x00293784, 0x0353e20e, 0x0162e2be, 0x03e1dcb9, 0x02dfec86, 0x0038ae66}}}, + {X: Field{[10]uint32{0x00e6b514, 0x03115c1b, 0x03322609, 0x031e6cd5, 0x01890905, 0x00211352, 0x005c3560, 0x03b45622, 0x01c2f919, 0x00022f22}}, Y: Field{[10]uint32{0x00c95157, 0x00fd33aa, 0x036f06f6, 0x0158449d, 0x01172d30, 0x02d624b0, 0x0376fec3, 0x03305b79, 0x03cdd7cd, 0x0034c4fc}}}, + {X: Field{[10]uint32{0x02060dfc, 0x03fbe145, 0x02a2a008, 0x02108179, 0x0276545f, 0x0106ac21, 0x0094b9dc, 0x00ab2121, 0x010f0058, 0x0037714c}}, Y: Field{[10]uint32{0x03820ca8, 0x03e2adb9, 0x00730fb5, 0x031aaf41, 0x0041dbaf, 0x0323c3a4, 0x011ab6dc, 0x025a4806, 0x033af20d, 0x002e834b}}}, + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + }, + { + {X: Field{[10]uint32{0x01f51508, 0x01b88ff5, 0x01ca1064, 0x02af56b0, 0x00d8c39c, 0x01cb788e, 0x02a6e3e1, 0x002767a8, 0x023212c6, 0x0020a089}}, Y: Field{[10]uint32{0x02e26caf, 0x02dbabfd, 0x017bed31, 0x02b0bdec, 0x0262d613, 0x002d82b3, 0x00256e83, 0x037f917a, 0x00098557, 0x00047e2a}}}, + {X: Field{[10]uint32{0x0334a24d, 0x038b003b, 0x019d0926, 0x01a36785, 0x010adbc9, 0x033e4635, 0x01a857a9, 0x027fce41, 0x00b287a7, 0x001194dc}}, Y: Field{[10]uint32{0x033887f4, 0x023ec82c, 0x03a10a2f, 0x02c8574d, 0x01588e09, 0x037bb0b0, 0x02f8bdaf, 0x03020a92, 0x01b38368, 0x000d794c}}}, + {X: Field{[10]uint32{0x017e8dfa, 0x03032e79, 0x02184fcf, 0x02468f1f, 0x00098091, 0x032a6328, 0x01a30f8a, 0x02713036, 0x032ff079, 0x002098b3}}, Y: Field{[10]uint32{0x03ac376a, 0x03fe363e, 0x0047835c, 0x00ccac53, 0x0057b6ed, 0x016cd3cd, 0x03ee22ec, 0x0279399b, 0x01e20910, 0x0020ff65}}}, + {X: Field{[10]uint32{0x0285131f, 0x02406cb8, 0x03088d5b, 0x0337204e, 0x00aaec6e, 0x01ab5890, 0x024a18f6, 0x02f5df59, 0x03b8e23c, 0x000907fa}}, Y: Field{[10]uint32{0x0350026d, 0x00f99bc9, 0x035afabb, 0x003ef432, 0x00cd50fd, 0x00e6077e, 0x00420bd1, 0x03e34f5b, 0x00d9ff94, 0x00144cde}}}, + {X: Field{[10]uint32{0x026bdb6f, 0x00b922c0, 0x00b94905, 0x0351edcd, 0x037ca41b, 0x033a6721, 0x00105b24, 0x0377545a, 0x008b1da0, 0x00066097}}, Y: Field{[10]uint32{0x009cfc9b, 0x03dc2131, 0x013a6b5d, 0x033233db, 0x00ebe9ee, 0x013d67db, 0x00261cc9, 0x021e3cc8, 0x010f0d4c, 0x0018a50c}}}, + {X: Field{[10]uint32{0x0070620c, 0x03307c9f, 0x008d9d17, 0x02faaf0a, 0x004998c4, 0x02d9c5e0, 0x00dd31a2, 0x008db718, 0x00a48d2c, 0x000594ea}}, Y: Field{[10]uint32{0x015b32cd, 0x00ba074c, 0x01c526ca, 0x01237f4f, 0x00012af7, 0x03be9c07, 0x03a99474, 0x01fdebab, 0x010935af, 0x0000ce0a}}}, + {X: Field{[10]uint32{0x0182824c, 0x0342548f, 0x034e650e, 0x00d17854, 0x02dfa58e, 0x01b0a667, 0x005f56ec, 0x0064510f, 0x006c1160, 0x001bc4b6}}, Y: Field{[10]uint32{0x02eb34d0, 0x0270d201, 0x03c5b857, 0x01042152, 0x01391c92, 0x03588dda, 0x01994f3f, 0x02fe821d, 0x03f44ab3, 0x001713fd}}}, + {X: Field{[10]uint32{0x03920471, 0x02d8c1a6, 0x01e0dedc, 0x0217d08f, 0x01fc318b, 0x00f63e36, 0x024cc298, 0x03e9e7f3, 0x034ea172, 0x001746f6}}, Y: Field{[10]uint32{0x03b83103, 0x00c199bd, 0x02e7b703, 0x02665b15, 0x0279eb1e, 0x02288995, 0x00bb9943, 0x0278b9e5, 0x02677937, 0x000a10e0}}}, + {X: Field{[10]uint32{0x03453629, 0x037700b6, 0x02603076, 0x03703d67, 0x0245cfdc, 0x008eafbd, 0x0262716a, 0x02a97450, 0x006f9a0a, 0x00080ea3}}, Y: Field{[10]uint32{0x03f89f84, 0x0071e14f, 0x01ed4597, 0x009714a1, 0x02686deb, 0x03d04184, 0x00c76d15, 0x0366e4db, 0x0353de5d, 0x000ec3c2}}}, + {X: Field{[10]uint32{0x0147f3d6, 0x011955ec, 0x00b45b94, 0x0085eae3, 0x03553199, 0x01195440, 0x026a3632, 0x02c78467, 0x0332c294, 0x0011d291}}, Y: Field{[10]uint32{0x00628ba4, 0x03a14a0a, 0x01300dce, 0x005c0438, 0x0311fa7f, 0x00e922a8, 0x02cc30cc, 0x03c13bb4, 0x02231206, 0x00251897}}}, + {X: Field{[10]uint32{0x006c7ecb, 0x004c3779, 0x00ce9783, 0x00ff96ed, 0x009d3aed, 0x0219b87b, 0x01ef7334, 0x01060720, 0x02eb3d03, 0x001b8ab2}}, Y: Field{[10]uint32{0x02bc8720, 0x024807bb, 0x0112c844, 0x02e46d9d, 0x02fac706, 0x003ed90e, 0x000c4daf, 0x03b85276, 0x006797ef, 0x00279869}}}, + {X: Field{[10]uint32{0x031dabcd, 0x010ae9b9, 0x00b4f47d, 0x01262797, 0x0354d3fe, 0x002d4dcf, 0x018ae326, 0x03d0f182, 0x00fb6b63, 0x003527b9}}, Y: Field{[10]uint32{0x016603c2, 0x02a433c0, 0x03031e66, 0x024c4bfd, 0x02129c50, 0x0186fcd5, 0x0087ea7a, 0x0124375f, 0x039209a5, 0x00014c78}}}, + {X: Field{[10]uint32{0x00a4147e, 0x00063cfc, 0x03201eb7, 0x022fddd7, 0x002747dd, 0x02924296, 0x021717e8, 0x0055aebd, 0x0092e9e9, 0x003569c1}}, Y: Field{[10]uint32{0x03fb65ff, 0x02cf2e0c, 0x0357f8e4, 0x0211e59f, 0x02f4c4d9, 0x0197814c, 0x00909907, 0x02271bf1, 0x02f5dbab, 0x00276d49}}}, + {X: Field{[10]uint32{0x003841c6, 0x02a3da2d, 0x02fbd63d, 0x03034d0f, 0x0212aa3c, 0x033afd30, 0x03b6b52d, 0x00226526, 0x009e03df, 0x001b3044}}, Y: Field{[10]uint32{0x0154e94d, 0x00ce91ae, 0x02cf5b97, 0x00f8b641, 0x00d79b43, 0x028a7ffb, 0x03d3d6b0, 0x012dd83f, 0x02fe9c09, 0x002bd586}}}, + {X: Field{[10]uint32{0x00edcec6, 0x036d1af6, 0x00f454ed, 0x030b4d8d, 0x02a1061c, 0x000b36b1, 0x023efc63, 0x022ea014, 0x019aabe1, 0x000e3144}}, Y: Field{[10]uint32{0x0133db08, 0x0382fec6, 0x030a6456, 0x0208ad54, 0x0328a16c, 0x01d7ca0b, 0x00cb2da2, 0x01cca99a, 0x012285d9, 0x00399277}}}, + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + }, + { + {X: Field{[10]uint32{0x01e5b739, 0x03396d54, 0x022ed73f, 0x00cff488, 0x01e0b938, 0x01bf211b, 0x0399cc6c, 0x021969cb, 0x019f728b, 0x0005d785}}, Y: Field{[10]uint32{0x01fed695, 0x029bffba, 0x0345c6ef, 0x016b7490, 0x02acb595, 0x03fdc7d7, 0x02f97a51, 0x01e7ae93, 0x020d9e3c, 0x0034d41b}}}, + {X: Field{[10]uint32{0x02bc47d6, 0x02012791, 0x0121bce7, 0x02d71b68, 0x0130fdfe, 0x004e7188, 0x03fbcc8e, 0x00cb5e97, 0x013f03ff, 0x00108e80}}, Y: Field{[10]uint32{0x03548a34, 0x00db9b62, 0x0009ed12, 0x030d493c, 0x03720d8e, 0x02bdacf1, 0x0179f7bb, 0x0365c284, 0x000fe1e1, 0x002e46b8}}}, + {X: Field{[10]uint32{0x01041216, 0x01fe3c71, 0x0036a65b, 0x03da10ae, 0x023f7335, 0x030bfb54, 0x00b59efd, 0x02b3d04a, 0x017b21f7, 0x00369d4c}}, Y: Field{[10]uint32{0x02708572, 0x034ca61b, 0x00edadae, 0x01eb9deb, 0x02e9aac0, 0x010b5ff1, 0x019e21b3, 0x0357c37c, 0x0046bf72, 0x001cfe28}}}, + {X: Field{[10]uint32{0x0016824a, 0x037dbde1, 0x02741302, 0x00bcecf8, 0x0249df66, 0x0335a1dd, 0x0107a7ab, 0x02e41422, 0x0245ac1f, 0x0004475a}}, Y: Field{[10]uint32{0x0108e9d0, 0x00447508, 0x00a4ca9a, 0x02265b6b, 0x02f07000, 0x03c19654, 0x00d48dbf, 0x02bfeee4, 0x011c478e, 0x0001a5a4}}}, + {X: Field{[10]uint32{0x0065a930, 0x010f9c79, 0x012fdb01, 0x0305ac4d, 0x022587f1, 0x02a0bac7, 0x033c58c4, 0x01275c15, 0x01b48e97, 0x00071c71}}, Y: Field{[10]uint32{0x034638b5, 0x01cfdb30, 0x00d471d8, 0x00fedc5d, 0x0079345e, 0x0092eda3, 0x013f1f28, 0x03e8309c, 0x0334e8f5, 0x0012a470}}}, + {X: Field{[10]uint32{0x0062bac0, 0x014c93cf, 0x02b06950, 0x037d47c2, 0x0219150d, 0x00fa2dc3, 0x024b7d2c, 0x011a704d, 0x00f9023f, 0x00254c3c}}, Y: Field{[10]uint32{0x0218e309, 0x02af6a5d, 0x01c68478, 0x0214bc7f, 0x00e25b32, 0x026cccf8, 0x01d2f7f5, 0x008788d3, 0x005a8f9f, 0x0023cf0c}}}, + {X: Field{[10]uint32{0x02db6ee7, 0x0236b96e, 0x02077e31, 0x010c9d12, 0x007850dd, 0x0026d327, 0x02e837a9, 0x02959a4d, 0x02fc1f31, 0x00361392}}, Y: Field{[10]uint32{0x002ebed2, 0x0155b9b5, 0x0264982d, 0x025d2a8f, 0x01fdd8ac, 0x01597793, 0x0238d58f, 0x01e7384a, 0x009a7c7b, 0x00394960}}}, + {X: Field{[10]uint32{0x03ced775, 0x03b77806, 0x00e56ab5, 0x02297bdd, 0x037290b6, 0x032e773f, 0x0395dbeb, 0x0322e2b5, 0x01c97ac7, 0x0012929b}}, Y: Field{[10]uint32{0x038dd66d, 0x03e3da29, 0x002acb2b, 0x036d091d, 0x031de90c, 0x02703d15, 0x03ef9f73, 0x0079ca50, 0x01b01663, 0x0014a644}}}, + {X: Field{[10]uint32{0x009e6d10, 0x03a7b3e9, 0x019d2394, 0x03cebab2, 0x03f60adf, 0x017fdbb4, 0x0322b928, 0x02053506, 0x004bde66, 0x003cf511}}, Y: Field{[10]uint32{0x0347da3f, 0x00e33014, 0x02c630a0, 0x01433a75, 0x03fc1ada, 0x026292d6, 0x02b95ac1, 0x0058f52e, 0x00dfa6f0, 0x000290c9}}}, + {X: Field{[10]uint32{0x0147b4b3, 0x0246dde9, 0x01411f5e, 0x0347f599, 0x00356929, 0x0026548b, 0x0382efee, 0x013dd477, 0x002f1d8e, 0x003c01b1}}, Y: Field{[10]uint32{0x006aa74b, 0x03d127ea, 0x03ae1b5e, 0x03bb5af9, 0x0275c933, 0x0393df45, 0x007848a4, 0x01482971, 0x00d4a666, 0x003da055}}}, + {X: Field{[10]uint32{0x01d33a07, 0x02cd01ba, 0x03cab48c, 0x0022a8e6, 0x004e72ee, 0x036f7d01, 0x0085520c, 0x007627e4, 0x012c9d9c, 0x002b8c19}}, Y: Field{[10]uint32{0x00a0b2a6, 0x01c303d8, 0x0295c748, 0x03d77f5f, 0x031c9c37, 0x036e3573, 0x00ce7d33, 0x03f95fbf, 0x01c38d63, 0x001b2e76}}}, + {X: Field{[10]uint32{0x003c9c8f, 0x0010e177, 0x027b2067, 0x03b8f90d, 0x00f2816f, 0x02a8ccac, 0x009ff43a, 0x0263f5bc, 0x02dcbe42, 0x0019ef80}}, Y: Field{[10]uint32{0x013652d9, 0x02126616, 0x002be553, 0x03d82e23, 0x03cd993b, 0x020a45a4, 0x00945b60, 0x03be128b, 0x01a73e4d, 0x001ea6d5}}}, + {X: Field{[10]uint32{0x0028caca, 0x01952e43, 0x001da759, 0x02ef320a, 0x021869c7, 0x00ce2326, 0x0217e758, 0x03872057, 0x032a5bd5, 0x00363706}}, Y: Field{[10]uint32{0x03b3ec7a, 0x019dba88, 0x028f6cdb, 0x00b3b204, 0x007d315d, 0x00091f65, 0x02d8da42, 0x031f5631, 0x02d927ce, 0x00233b02}}}, + {X: Field{[10]uint32{0x018b01b5, 0x00be5d14, 0x03adac5c, 0x022e1c42, 0x01ddccc8, 0x0149016c, 0x0250c453, 0x03a21706, 0x0346403d, 0x00039a6c}}, Y: Field{[10]uint32{0x00d965c5, 0x03b8da1e, 0x0283e418, 0x017cf401, 0x03cedf59, 0x01f5f74d, 0x01ed70ab, 0x03914987, 0x02c5fcd7, 0x0002d3be}}}, + {X: Field{[10]uint32{0x03c4416f, 0x007ed98e, 0x00402892, 0x008fcc2c, 0x01a7aefd, 0x000cbcc7, 0x01425a8d, 0x013b3356, 0x0292c5f8, 0x0009d278}}, Y: Field{[10]uint32{0x006bbd8e, 0x022f78bf, 0x021057e9, 0x02d97ba5, 0x02f59e9f, 0x03f2b6cf, 0x03d94990, 0x00af1100, 0x014e3767, 0x0014330b}}}, + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + }, + { + {X: Field{[10]uint32{0x03ff4640, 0x02eb63e0, 0x02ffe526, 0x01f95554, 0x0053441c, 0x01898bb8, 0x00eac05b, 0x00327267, 0x00d447b0, 0x000d8f64}}, Y: Field{[10]uint32{0x03ee9de9, 0x000f1fce, 0x01ecb620, 0x02402066, 0x0145b9a8, 0x01fccd8c, 0x03b44539, 0x00888654, 0x03adfc73, 0x0001389c}}}, + {X: Field{[10]uint32{0x0392c541, 0x004a972b, 0x0359dd27, 0x0004bb7e, 0x030b62fb, 0x024ec0af, 0x03973c6c, 0x01fa6d54, 0x0066ed9a, 0x001306e6}}, Y: Field{[10]uint32{0x028fe020, 0x013cff71, 0x031ad72c, 0x035f90fa, 0x00c652ea, 0x0395b9a7, 0x03cb753c, 0x02283dfe, 0x02d320be, 0x00307de4}}}, + {X: Field{[10]uint32{0x02e55dc8, 0x024485bd, 0x004394b8, 0x02dbab28, 0x026ff95a, 0x00142510, 0x004a440c, 0x03fecaea, 0x004790c5, 0x00110c50}}, Y: Field{[10]uint32{0x03e323b3, 0x02512bb6, 0x02e5031d, 0x02de7aa8, 0x03a66a29, 0x0190bfb5, 0x019837f5, 0x019be3fa, 0x0142e653, 0x0025ac30}}}, + {X: Field{[10]uint32{0x02aaf3d1, 0x023ca32f, 0x03135e0c, 0x02f068a3, 0x023233ed, 0x01e02d53, 0x01a2f3c0, 0x02c4ad4a, 0x0077ba83, 0x0029020e}}, Y: Field{[10]uint32{0x00b254b9, 0x02d4d37c, 0x02f90b12, 0x015dbb47, 0x022001e7, 0x00d86cf8, 0x03f83d69, 0x02f1e6e2, 0x0212feef, 0x00103a7d}}}, + {X: Field{[10]uint32{0x001b23a8, 0x0252175c, 0x02e0adfe, 0x011c2a1f, 0x01ab7b7d, 0x02484227, 0x02243d5b, 0x02a1f049, 0x028d866c, 0x002788bf}}, Y: Field{[10]uint32{0x0084edae, 0x0104f142, 0x01cecf7a, 0x0127ed44, 0x03c0f7c9, 0x0267054c, 0x03f3f020, 0x00b4405d, 0x00e9ca12, 0x003f4bfc}}}, + {X: Field{[10]uint32{0x03f0e9aa, 0x0178658c, 0x0134b3eb, 0x01dac46f, 0x02681127, 0x01604e34, 0x0124ae0d, 0x009ab6de, 0x03e8575f, 0x00394e03}}, Y: Field{[10]uint32{0x0082720f, 0x02904d90, 0x0318ec4b, 0x0177d1a0, 0x016fb94e, 0x00932380, 0x02913639, 0x02d0756d, 0x00739087, 0x002e5ff6}}}, + {X: Field{[10]uint32{0x031a70e4, 0x01022fc1, 0x03475dd7, 0x007d7d73, 0x01cd5ee5, 0x01c14c1b, 0x01d69e64, 0x00aa34bb, 0x02d503ce, 0x0014237d}}, Y: Field{[10]uint32{0x01950984, 0x0396fdca, 0x02dfedf2, 0x00a3ba2a, 0x014ec032, 0x00cf9271, 0x03304aa7, 0x0310b5dd, 0x039b933b, 0x00055310}}}, + {X: Field{[10]uint32{0x0140d33a, 0x00f6d69e, 0x003b98cd, 0x00291508, 0x036e0d88, 0x03d5b21b, 0x00e3e1a2, 0x0302d4e9, 0x0241d28c, 0x002a0131}}, Y: Field{[10]uint32{0x0146967a, 0x03a57e9b, 0x036a943c, 0x02a273dc, 0x001af18c, 0x005811fa, 0x02c2842c, 0x029b40f7, 0x03252b2f, 0x00256fa0}}}, + {X: Field{[10]uint32{0x021abe11, 0x03f69db3, 0x0220f6ea, 0x0309672c, 0x02dab921, 0x00c0496c, 0x00df5819, 0x025d8cce, 0x03845510, 0x0038f6ff}}, Y: Field{[10]uint32{0x03a8de63, 0x026b5527, 0x01c414b4, 0x0240f1ad, 0x03d3c97d, 0x02e2a3bc, 0x038fa75d, 0x00508590, 0x01099a34, 0x0001bcbe}}}, + {X: Field{[10]uint32{0x023968b6, 0x00a4de2d, 0x03ab2e69, 0x0197b678, 0x02f40261, 0x0224224e, 0x005a9600, 0x01e7ed0f, 0x023dfc65, 0x003de92f}}, Y: Field{[10]uint32{0x00c34882, 0x03768cb4, 0x0105e494, 0x02e34440, 0x0299702f, 0x023294b4, 0x01290303, 0x03185487, 0x036ce823, 0x0035b77b}}}, + {X: Field{[10]uint32{0x03593449, 0x006c8d80, 0x006ffdcf, 0x004b90a9, 0x02f61b7c, 0x001f4052, 0x00d9c13a, 0x0250361e, 0x0064c7de, 0x00066b38}}, Y: Field{[10]uint32{0x01f83631, 0x0052e4eb, 0x0068a3a4, 0x027d0210, 0x02ac710b, 0x02500b11, 0x02bd739d, 0x028cceff, 0x02035268, 0x0038de64}}}, + {X: Field{[10]uint32{0x02bc61d6, 0x034d86fb, 0x002de1ae, 0x029f67fd, 0x018a8fd3, 0x035ac7d4, 0x015f0d15, 0x026bc30e, 0x03e4a3ed, 0x0024e7fc}}, Y: Field{[10]uint32{0x03f5cb70, 0x03a919a8, 0x03f82e75, 0x01bade31, 0x00980bf2, 0x03c05b01, 0x006fc4ee, 0x02a43a75, 0x03cf08b7, 0x0037aace}}}, + {X: Field{[10]uint32{0x00ba6b63, 0x03a624b3, 0x03bb5ee3, 0x01d3f42c, 0x010a0fe6, 0x03aa238c, 0x00c33228, 0x01f6a842, 0x00ec20f8, 0x00361d03}}, Y: Field{[10]uint32{0x0134c5f3, 0x028db01a, 0x0294abee, 0x01730e05, 0x0140104f, 0x000eb0df, 0x00a6ee99, 0x00cafcde, 0x0133c6b9, 0x00191cb0}}}, + {X: Field{[10]uint32{0x028ff2cf, 0x03b5ba22, 0x02094a34, 0x0171ec18, 0x0038ea75, 0x00901469, 0x03a98dba, 0x02b8c1e5, 0x025f1c4c, 0x000066a7}}, Y: Field{[10]uint32{0x030e4352, 0x01f9d9b6, 0x02d353a7, 0x03ba2121, 0x000ce7eb, 0x0004adcc, 0x01062925, 0x02bd7bea, 0x0067ea85, 0x00079987}}}, + {X: Field{[10]uint32{0x033ec038, 0x013fcb06, 0x02b27619, 0x01ab9831, 0x00d9fd51, 0x03ca4294, 0x0083e762, 0x01820d92, 0x03391b50, 0x00162b0c}}, Y: Field{[10]uint32{0x00246279, 0x02a8fc44, 0x03bca16e, 0x00f02d3e, 0x03021904, 0x02647fa5, 0x0379249e, 0x024b65e1, 0x0306d55c, 0x002458f5}}}, + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + }, + { + {X: Field{[10]uint32{0x03fdf80c, 0x01e69577, 0x00d1b69f, 0x0206856f, 0x0043e4a7, 0x01d158e2, 0x02244b5b, 0x030afa31, 0x03165df3, 0x0022d2d7}}, Y: Field{[10]uint32{0x03d4fd36, 0x03fc3197, 0x02e56b3e, 0x0151858b, 0x00f9e336, 0x02ac3681, 0x03bd7813, 0x0022d2cf, 0x026f68d3, 0x0012ab42}}}, + {X: Field{[10]uint32{0x0355e4be, 0x03c99c51, 0x0197abb3, 0x03b905f2, 0x0071af64, 0x020f1844, 0x0217c7ec, 0x0245c633, 0x00e4e132, 0x003b4317}}, Y: Field{[10]uint32{0x007bf42f, 0x027e9ba8, 0x01ab163f, 0x0095d8f7, 0x0049d939, 0x029fa9a0, 0x03dad7f5, 0x0116f6fc, 0x03c7bc23, 0x000886a7}}}, + {X: Field{[10]uint32{0x015812dd, 0x00a960bd, 0x030e2a0a, 0x008d54b4, 0x023d4467, 0x00163de3, 0x02abed6c, 0x00d4bc2d, 0x017a92ff, 0x001c0a6f}}, Y: Field{[10]uint32{0x022d2927, 0x03319ac6, 0x0073c721, 0x01090ecb, 0x0047dae8, 0x00c1a0eb, 0x016544ae, 0x02cf49f7, 0x02dafde8, 0x002c3bbe}}}, + {X: Field{[10]uint32{0x03cec8ab, 0x01b9b201, 0x012ced4b, 0x0159b815, 0x00e53254, 0x00fc7eba, 0x0315c3f8, 0x039a52ce, 0x0013c44c, 0x003ebb2c}}, Y: Field{[10]uint32{0x03155070, 0x0077f66a, 0x02e2e898, 0x021ae178, 0x019c32b2, 0x030bec4f, 0x02e02c6e, 0x032d5ff0, 0x01e90e9e, 0x0033026d}}}, + {X: Field{[10]uint32{0x01486ed1, 0x0395a0ef, 0x01b6a49c, 0x02e92559, 0x005745be, 0x0233dd58, 0x01d4109d, 0x01726402, 0x01caeae6, 0x002733fb}}, Y: Field{[10]uint32{0x01e95d8d, 0x03567b5d, 0x02aa24f6, 0x0165a564, 0x01242167, 0x0002cd04, 0x01224812, 0x00cb3ed8, 0x01713d6a, 0x001f0bd3}}}, + {X: Field{[10]uint32{0x0181fdc2, 0x02affe6c, 0x02364dcd, 0x02ed7318, 0x02dd2f62, 0x0228d39f, 0x02264b81, 0x01b91d2a, 0x002af47e, 0x003d0b04}}, Y: Field{[10]uint32{0x0085d7fd, 0x000024e9, 0x00f2681f, 0x00b668ab, 0x024c1550, 0x021bf88a, 0x03ad05cb, 0x0201b1e3, 0x02b46cfe, 0x0015d40e}}}, + {X: Field{[10]uint32{0x03d0eaca, 0x01ac69d6, 0x00ab7a20, 0x01dae8b5, 0x01d0c745, 0x032937c6, 0x028fde33, 0x01050cd6, 0x03876341, 0x00336692}}, Y: Field{[10]uint32{0x03ff4acc, 0x03ebed6a, 0x0234f6e6, 0x023bb5bd, 0x030127b3, 0x00cfa822, 0x01488ae9, 0x03c8fa05, 0x0079a1e8, 0x003c1156}}}, + {X: Field{[10]uint32{0x02d1b1f7, 0x0193aba6, 0x00d3e07f, 0x02093c8f, 0x01b3b2dd, 0x01f2f2bf, 0x0331a0b3, 0x034bcb21, 0x02132dca, 0x00026ee2}}, Y: Field{[10]uint32{0x03811c80, 0x00c189f0, 0x02d53641, 0x0103d1d4, 0x010f54a8, 0x03e18fa1, 0x039dd284, 0x038ee6db, 0x02b2afee, 0x002516ec}}}, + {X: Field{[10]uint32{0x03bc57c6, 0x0254e8f1, 0x036cbf20, 0x0288fac9, 0x004903d7, 0x00f58c25, 0x00f2d2e9, 0x026faa21, 0x002f88ed, 0x002b4262}}, Y: Field{[10]uint32{0x024a0ab8, 0x00b03b6b, 0x022d3ca3, 0x00dcd643, 0x037b311d, 0x0276af97, 0x00186c72, 0x0294ae8a, 0x008c42fb, 0x001c90f0}}}, + {X: Field{[10]uint32{0x03927dc7, 0x036ad913, 0x018a49e2, 0x00358f50, 0x0337a7a4, 0x019a8508, 0x029ed953, 0x029aef99, 0x00cc082b, 0x00389828}}, Y: Field{[10]uint32{0x02aef35d, 0x03cdbd11, 0x0382da45, 0x02d118b2, 0x00edbcc0, 0x0096fd10, 0x033cb3d7, 0x02759fc1, 0x0344b0da, 0x000dfb99}}}, + {X: Field{[10]uint32{0x03a56302, 0x00c31caa, 0x01862ea8, 0x00debc3c, 0x00f506a9, 0x027eb4b8, 0x02da2d2a, 0x02907c7a, 0x010aeb3c, 0x0036744a}}, Y: Field{[10]uint32{0x00291c29, 0x0376bea2, 0x00f2aeaa, 0x03367e9d, 0x001739ae, 0x0098e1b9, 0x01715c67, 0x00fbb40a, 0x0113ec2d, 0x001fad4c}}}, + {X: Field{[10]uint32{0x02dd7dd6, 0x01b51f7b, 0x0168c386, 0x03899786, 0x0049376f, 0x039f3f7b, 0x01a7840e, 0x01492f29, 0x036a24c7, 0x000cb3f3}}, Y: Field{[10]uint32{0x0208e330, 0x03512bbf, 0x0208b25f, 0x03480d26, 0x027a0d8c, 0x0027d587, 0x008096a4, 0x01dd2188, 0x0234976a, 0x0008611a}}}, + {X: Field{[10]uint32{0x00d1243a, 0x034dc13d, 0x025fdbac, 0x0008fd52, 0x0002b126, 0x018fd561, 0x00d21ac0, 0x01b3be47, 0x01de539d, 0x002f141e}}, Y: Field{[10]uint32{0x015db68a, 0x02545a21, 0x03169f5c, 0x03d6c7d1, 0x035f7ee4, 0x037ff235, 0x02c72b94, 0x0172ee3b, 0x023b3a70, 0x0019418a}}}, + {X: Field{[10]uint32{0x02abf83d, 0x0340ff7d, 0x00596696, 0x0163ecb4, 0x02b8f940, 0x00348b00, 0x00be68f1, 0x03127cfb, 0x02dde85a, 0x0008d72a}}, Y: Field{[10]uint32{0x0133e191, 0x03b27a43, 0x010ae7f4, 0x0358c8d8, 0x013f0518, 0x0324eb62, 0x00232a5b, 0x011fafb9, 0x01c745fd, 0x003704be}}}, + {X: Field{[10]uint32{0x034a3f9f, 0x009139ad, 0x0016908d, 0x01977026, 0x02c287a6, 0x036c9896, 0x03deaae7, 0x031fa244, 0x037e505f, 0x00134c69}}, Y: Field{[10]uint32{0x001e0ba7, 0x02c0904c, 0x00a754fc, 0x0146db80, 0x03cbf6fb, 0x01e009d4, 0x0318f38c, 0x015d6c1a, 0x02c96098, 0x00088907}}}, + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + }, + { + {X: Field{[10]uint32{0x0232fcda, 0x00456494, 0x0277bcb6, 0x03fe9b03, 0x03b700db, 0x02f55231, 0x03771c00, 0x0265b5af, 0x02a6e5db, 0x001c8f2e}}, Y: Field{[10]uint32{0x02b39f5f, 0x0301a767, 0x0094801d, 0x0194dde5, 0x022660a0, 0x0220935b, 0x02113748, 0x031262a4, 0x03b5595c, 0x0025ba19}}}, + {X: Field{[10]uint32{0x00a030d5, 0x00e0f583, 0x009071fd, 0x010c1e61, 0x022d240a, 0x01dce8f1, 0x03d7dc45, 0x01d134d0, 0x0386437b, 0x0015fbe9}}, Y: Field{[10]uint32{0x00b02f9e, 0x02ad109d, 0x0174ab07, 0x00ab97a6, 0x00689b6d, 0x023780fb, 0x03627c92, 0x02146224, 0x030bd1b4, 0x0035c4b6}}}, + {X: Field{[10]uint32{0x00633cb1, 0x01f827a0, 0x02113256, 0x012da740, 0x03575a22, 0x008607f2, 0x00627321, 0x032b5003, 0x00f317aa, 0x001b77a7}}, Y: Field{[10]uint32{0x03ce6b34, 0x03526a99, 0x01ef357d, 0x036b3e16, 0x0080b27f, 0x006e99aa, 0x019ef86a, 0x03907572, 0x03e7a707, 0x0024623e}}}, + {X: Field{[10]uint32{0x00584dd5, 0x03f1ddc3, 0x0012a7fa, 0x01f8c9ec, 0x01108057, 0x01489b2e, 0x01f7e9cd, 0x02f10a8b, 0x01436a28, 0x000992ef}}, Y: Field{[10]uint32{0x0304ab11, 0x0089e4dd, 0x00d8de61, 0x010dc5ee, 0x026a1182, 0x030cef88, 0x0375ce24, 0x024ed353, 0x03a94ee0, 0x00361f1b}}}, + {X: Field{[10]uint32{0x0133f3c5, 0x0294634a, 0x02522419, 0x01c457c4, 0x00085a0f, 0x0391ee14, 0x004bb7f8, 0x0337a04f, 0x032cd5b5, 0x00121be9}}, Y: Field{[10]uint32{0x02fb0f53, 0x0129c6b2, 0x023b79ad, 0x020f3c3c, 0x0362d9b7, 0x03323c67, 0x00c48bae, 0x03750f92, 0x0319f56b, 0x0018b848}}}, + {X: Field{[10]uint32{0x00e5467d, 0x02f5da91, 0x03ace4d0, 0x02e066ef, 0x0140908a, 0x03b25c3a, 0x021f62e0, 0x028488b0, 0x00f0fc69, 0x0025f419}}, Y: Field{[10]uint32{0x029cb3fa, 0x00c03f47, 0x03ccd797, 0x02e153c5, 0x03da5fb3, 0x02142187, 0x037c66fa, 0x000b300f, 0x032ed334, 0x002265d3}}}, + {X: Field{[10]uint32{0x0299f728, 0x01650897, 0x02204ebd, 0x03ef9bc4, 0x03677375, 0x01da94c0, 0x024ff27b, 0x02bd3ed9, 0x0174a894, 0x00091e5a}}, Y: Field{[10]uint32{0x03aaebff, 0x000145ba, 0x022d837a, 0x030255d6, 0x025adbf3, 0x03635992, 0x012e87e7, 0x00c007b1, 0x0144688f, 0x0038f5e3}}}, + {X: Field{[10]uint32{0x032438e8, 0x009af612, 0x02c9d2bf, 0x007f56f7, 0x01a78bc6, 0x008da9e7, 0x0085c056, 0x034aef6b, 0x0124bd40, 0x002a5319}}, Y: Field{[10]uint32{0x018661f4, 0x00b236fc, 0x01b2bc2e, 0x0182838e, 0x027e5d3c, 0x0140678e, 0x03921950, 0x018a03f5, 0x03d992f9, 0x002d4807}}}, + {X: Field{[10]uint32{0x03b0079a, 0x0031b50b, 0x02049c9e, 0x03dc8e49, 0x00916f9e, 0x01ace0c9, 0x01a59ee7, 0x017fc18c, 0x03daa3d5, 0x000bce72}}, Y: Field{[10]uint32{0x005690ba, 0x00a5cc0b, 0x00230fe2, 0x02f220a8, 0x039bfb3f, 0x01e36962, 0x02936d02, 0x00e60d36, 0x03de1386, 0x002afab6}}}, + {X: Field{[10]uint32{0x018086c8, 0x01bca26e, 0x023ff5f4, 0x00d2d899, 0x0040c10e, 0x02aa39bf, 0x01263b70, 0x00af74a2, 0x025baa80, 0x000fa10b}}, Y: Field{[10]uint32{0x02e939a9, 0x012d44e3, 0x03d4ef99, 0x01dadd79, 0x0037b8e5, 0x006c1df0, 0x01370463, 0x039cb86e, 0x03f5fc92, 0x00227c93}}}, + {X: Field{[10]uint32{0x00f7ab73, 0x00c02cb9, 0x003a7793, 0x03aa7511, 0x0262e3d4, 0x014d2bb4, 0x0239e86c, 0x0186e95a, 0x016c327d, 0x003968c7}}, Y: Field{[10]uint32{0x00561f42, 0x00e8ff1c, 0x03a21391, 0x0126a032, 0x01bf8c44, 0x0293b397, 0x0118a977, 0x0275e830, 0x003d8d1e, 0x000dde23}}}, + {X: Field{[10]uint32{0x03613bec, 0x02072e44, 0x03e67cca, 0x02744073, 0x028bb5fc, 0x01d3e5ca, 0x031b33dc, 0x00def7b7, 0x02b8c939, 0x000b73f2}}, Y: Field{[10]uint32{0x02039215, 0x00c24926, 0x01f383e7, 0x02eb4cfd, 0x003732cf, 0x01bdb1bd, 0x03088b7d, 0x02904997, 0x00dd9474, 0x0011b6f1}}}, + {X: Field{[10]uint32{0x014dcd86, 0x024a68f0, 0x031b588f, 0x00825afd, 0x011fc5d4, 0x0014773c, 0x010dd982, 0x00d11f7d, 0x014a0d15, 0x00330e27}}, Y: Field{[10]uint32{0x00f0a873, 0x02db7672, 0x0387468e, 0x0063f9f9, 0x0205c57e, 0x03aa4432, 0x0168bdbb, 0x02efb66d, 0x03d660f6, 0x0024eb93}}}, + {X: Field{[10]uint32{0x03b4f6be, 0x00f5d937, 0x02b64844, 0x03fd3e8f, 0x02b567d5, 0x023c3a2d, 0x004bb042, 0x0208a23b, 0x03d1ae75, 0x0028ab94}}, Y: Field{[10]uint32{0x02eeb9a2, 0x008959d2, 0x00436c04, 0x019f0f50, 0x004c0efa, 0x0306d51f, 0x015679c7, 0x028261f2, 0x014d44b3, 0x001a4cd6}}}, + {X: Field{[10]uint32{0x00819311, 0x0271bade, 0x0314724f, 0x0388421d, 0x030b3e1e, 0x033d7b47, 0x010a17e0, 0x03a408dd, 0x01c89d71, 0x001fe4a4}}, Y: Field{[10]uint32{0x002eb125, 0x03e6d5eb, 0x02174aa9, 0x0102721a, 0x02120aaa, 0x0149056d, 0x010de8c4, 0x00fbc3d7, 0x011063ec, 0x00276803}}}, + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + }, + { + {X: Field{[10]uint32{0x027dd7fa, 0x00cfb283, 0x019839a5, 0x0048dea4, 0x01094796, 0x00b0b4ed, 0x01feec81, 0x02fe62e9, 0x00d493be, 0x003bafe9}}, Y: Field{[10]uint32{0x01de8999, 0x0353f6b8, 0x03712ddf, 0x030e9c47, 0x019ae4cd, 0x005e0227, 0x02e7edaf, 0x03c3c9a7, 0x00a3970e, 0x001766a3}}}, + {X: Field{[10]uint32{0x03d297fd, 0x03ba4211, 0x026d676b, 0x03023d9d, 0x03c4ea4b, 0x00461257, 0x01c6031c, 0x01eff698, 0x02d7a7a9, 0x000e0712}}, Y: Field{[10]uint32{0x01493fc5, 0x0338c61f, 0x01c0093a, 0x00cb6e4e, 0x00f04510, 0x026457b3, 0x03e5fa70, 0x03bb923c, 0x013b238e, 0x0024dabd}}}, + {X: Field{[10]uint32{0x037ceceb, 0x019e3fee, 0x03af0f3f, 0x024e225f, 0x0073a59f, 0x03db9a05, 0x03fb8126, 0x035140db, 0x02204276, 0x0010dea1}}, Y: Field{[10]uint32{0x02c181e1, 0x00ef30d5, 0x01782736, 0x033f723e, 0x0387220f, 0x0274a5ff, 0x038feb69, 0x030cbda6, 0x03a13eea, 0x0002e45a}}}, + {X: Field{[10]uint32{0x02de454c, 0x035c108b, 0x008b2448, 0x017fbf74, 0x039cf1d0, 0x0254e311, 0x0210831d, 0x0318ef33, 0x01cd05ad, 0x00387bee}}, Y: Field{[10]uint32{0x00913797, 0x03f48cea, 0x014c6ad9, 0x01129e8b, 0x03464e32, 0x0391dc48, 0x0154c1ff, 0x026f9ec0, 0x0130d8af, 0x0003b2d1}}}, + {X: Field{[10]uint32{0x017f96f2, 0x035ca782, 0x0335cd58, 0x00a74b21, 0x03358235, 0x028f309c, 0x00b7e3b9, 0x0226f20f, 0x0313e2a4, 0x002a7be7}}, Y: Field{[10]uint32{0x02c04be4, 0x03556c15, 0x00702c03, 0x02bd6a6d, 0x01b74f89, 0x03aed84f, 0x016ee160, 0x0275f365, 0x00e59455, 0x003a0533}}}, + {X: Field{[10]uint32{0x00bf00eb, 0x036761f7, 0x002274c9, 0x022f0634, 0x0241b4e9, 0x0068c2f0, 0x03e16f6a, 0x03537126, 0x00ae96ea, 0x002e241c}}, Y: Field{[10]uint32{0x030e664e, 0x03c6f346, 0x02a671b7, 0x001adae5, 0x02cb0d8b, 0x007129d9, 0x02294e4c, 0x03623d1c, 0x00c2c8a2, 0x001bc932}}}, + {X: Field{[10]uint32{0x010cf77e, 0x02ad684d, 0x02b0dbc0, 0x01d152a2, 0x0207dbf5, 0x03ea8190, 0x03827d69, 0x00d6f954, 0x0141ee1d, 0x0019b601}}, Y: Field{[10]uint32{0x00eaa3a6, 0x03e5ebe8, 0x0376d2a5, 0x00eadec6, 0x029444b4, 0x00d584fd, 0x031d4205, 0x03ed0b0f, 0x03e732ff, 0x001473f7}}}, + {X: Field{[10]uint32{0x01eb99a4, 0x03fbacca, 0x03b18d33, 0x027ccf51, 0x00c7e541, 0x02bd1d6a, 0x02c235e9, 0x01c04316, 0x01b1a269, 0x0014c63e}}, Y: Field{[10]uint32{0x0291f92d, 0x009bbbbf, 0x02c652c7, 0x0103478f, 0x00a41f2b, 0x02ed017a, 0x032d93ae, 0x0290655d, 0x03eb4bed, 0x003d1333}}}, + {X: Field{[10]uint32{0x03213a5a, 0x01218a21, 0x0262b935, 0x0129e17e, 0x000b7320, 0x019330f2, 0x03508a1c, 0x00fe8afc, 0x01e13650, 0x0018ab01}}, Y: Field{[10]uint32{0x006a9e45, 0x0348703d, 0x014efc10, 0x000605e6, 0x01e55909, 0x01ea495e, 0x015e79e0, 0x029b934e, 0x01f3a0d1, 0x0008dbef}}}, + {X: Field{[10]uint32{0x03c76ac1, 0x0086cf3b, 0x02c05d6b, 0x02572908, 0x016124c3, 0x0354fa26, 0x021859a7, 0x00de10df, 0x03bfab10, 0x000623bc}}, Y: Field{[10]uint32{0x028f00bc, 0x0180ca94, 0x03875351, 0x03a0f1d8, 0x00e4d66d, 0x03ce638e, 0x005fb18c, 0x02ea6740, 0x017a052f, 0x0039bf26}}}, + {X: Field{[10]uint32{0x03bad12b, 0x03f52619, 0x02e1ec30, 0x0003abd9, 0x0385d5ea, 0x031bcb6c, 0x03613af5, 0x023d6d6f, 0x00497244, 0x003284f1}}, Y: Field{[10]uint32{0x0323b0f2, 0x0267d1a5, 0x03566896, 0x01c44695, 0x026370ab, 0x02ab68f5, 0x015fa64e, 0x021f22b0, 0x018361c2, 0x0020ea82}}}, + {X: Field{[10]uint32{0x02fbe7b2, 0x01bfe6ad, 0x025a3b9d, 0x03051635, 0x005eaded, 0x00aa2118, 0x036bbb1b, 0x0107e3cc, 0x03669cb4, 0x00099221}}, Y: Field{[10]uint32{0x01bc2a34, 0x029e2f08, 0x03603932, 0x0205a83a, 0x005638d9, 0x000b77c6, 0x02f2dcad, 0x0112623c, 0x02b4b201, 0x00278576}}}, + {X: Field{[10]uint32{0x0080414e, 0x03b97e57, 0x00f7fdda, 0x0218b59b, 0x0114ef8a, 0x01182792, 0x0011c4f4, 0x00aba16b, 0x0101a705, 0x00073b2c}}, Y: Field{[10]uint32{0x02169a3b, 0x03a524b4, 0x031d0dca, 0x039511c8, 0x02907557, 0x017b6b45, 0x01aa3283, 0x01f3ed39, 0x00669609, 0x003cd0d8}}}, + {X: Field{[10]uint32{0x0320907d, 0x00793462, 0x0051c50d, 0x0358581e, 0x003b15b2, 0x012143fd, 0x002f4589, 0x03089ec0, 0x01bc3e54, 0x003e62d7}}, Y: Field{[10]uint32{0x00c926af, 0x004c66d7, 0x00e35835, 0x038096a4, 0x0241fcd9, 0x02ea7327, 0x0139b706, 0x004fe90a, 0x00bd4f4a, 0x0038b542}}}, + {X: Field{[10]uint32{0x02d810a9, 0x016f2313, 0x00155c4f, 0x00fcf1c0, 0x024f889d, 0x0077c8e4, 0x010daf5f, 0x023e7325, 0x007504d7, 0x000a9a64}}, Y: Field{[10]uint32{0x029b4728, 0x01ace23e, 0x005c7cf8, 0x03a5fb05, 0x00667d47, 0x013ec13f, 0x02c58695, 0x03ff6b0f, 0x039b6c3d, 0x00153e40}}}, + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + }, + { + {X: Field{[10]uint32{0x01a48db0, 0x01e0d6ce, 0x003bfefd, 0x028a6cf0, 0x019f1215, 0x02def791, 0x011d0a09, 0x01c59c9e, 0x00da696e, 0x000403d1}}, Y: Field{[10]uint32{0x03c65a09, 0x0357358a, 0x015ac0fb, 0x0063fd46, 0x02b7ff4a, 0x03024199, 0x008f3300, 0x002ddcbb, 0x013192a0, 0x00337678}}}, + {X: Field{[10]uint32{0x024df706, 0x014a13c7, 0x008084b0, 0x03e48df4, 0x01d8d9c8, 0x02d31066, 0x0015dff2, 0x031dc6a1, 0x01f2ceb5, 0x00230262}}, Y: Field{[10]uint32{0x0172fa98, 0x02b168d7, 0x011aa736, 0x03d45594, 0x0060de6b, 0x0277259b, 0x012172cb, 0x0080d3ff, 0x01044f43, 0x003ed36f}}}, + {X: Field{[10]uint32{0x01bc15b4, 0x02684d25, 0x02ee69cb, 0x02391968, 0x01927502, 0x03b5f2a3, 0x0058ee9c, 0x02b727b6, 0x022e51ee, 0x00043a43}}, Y: Field{[10]uint32{0x00aa258d, 0x02f98256, 0x02a8834e, 0x018c0aed, 0x014ca589, 0x01ab47dd, 0x017a8c61, 0x03810935, 0x030380d5, 0x0031a28d}}}, + {X: Field{[10]uint32{0x0047bffd, 0x018f0cf7, 0x03c1bb1e, 0x00e6f256, 0x019c5285, 0x0098b009, 0x02481743, 0x019c1312, 0x013c5e26, 0x003ee3c5}}, Y: Field{[10]uint32{0x0149b095, 0x02917776, 0x02613090, 0x0226b150, 0x031dde13, 0x012f3354, 0x03a11d9b, 0x0188605b, 0x029dc5e0, 0x001b289e}}}, + {X: Field{[10]uint32{0x03e75269, 0x00ff0c0f, 0x033182dd, 0x033014f4, 0x01a377a3, 0x0052df73, 0x035b90b7, 0x0058e115, 0x0342da54, 0x003dd08b}}, Y: Field{[10]uint32{0x03e49bd5, 0x0203a1c5, 0x018e0189, 0x00dfd28e, 0x037fb3a2, 0x027d8d65, 0x00ce7dcb, 0x0024ff46, 0x031a3313, 0x00101b0b}}}, + {X: Field{[10]uint32{0x021c0a80, 0x00aaf21e, 0x01c740f6, 0x0163196a, 0x034d6251, 0x000bfe70, 0x03c9be70, 0x033296c5, 0x0268a614, 0x002dac56}}, Y: Field{[10]uint32{0x01ce0a03, 0x03404410, 0x016eeb6c, 0x02cc20b8, 0x009c9a12, 0x03d94db5, 0x00e223ee, 0x02d87a95, 0x0214d6cd, 0x003eb98b}}}, + {X: Field{[10]uint32{0x01a7175f, 0x02d9a5bd, 0x0342a653, 0x01c74c73, 0x03edb8e7, 0x00b577ae, 0x0079a558, 0x00f3fdca, 0x010417d4, 0x000b632b}}, Y: Field{[10]uint32{0x039d592a, 0x01eee46e, 0x025e0cf3, 0x03f672d7, 0x037a846b, 0x004b274d, 0x03232fa6, 0x02a529ee, 0x0383318c, 0x0031cfce}}}, + {X: Field{[10]uint32{0x03b2629a, 0x0286e2d2, 0x027b8b8f, 0x0161dcde, 0x0065a02c, 0x01ca1c21, 0x00cc9f0a, 0x0145d568, 0x033fd75d, 0x0039d1cc}}, Y: Field{[10]uint32{0x0146f6d6, 0x0365869a, 0x0169a9f8, 0x02a9b86a, 0x01c88376, 0x00130960, 0x00436038, 0x00304533, 0x02014507, 0x003cabff}}}, + {X: Field{[10]uint32{0x00b51045, 0x0326f0e5, 0x025b3e34, 0x025bcc70, 0x03bbc6c8, 0x007a33dc, 0x0273d4eb, 0x01ba962b, 0x011db98a, 0x0007b2ff}}, Y: Field{[10]uint32{0x02c70026, 0x019c4040, 0x0022d53a, 0x011ad0d9, 0x00b19006, 0x0126a6ce, 0x03d0bb18, 0x030e9911, 0x02308b99, 0x00073db8}}}, + {X: Field{[10]uint32{0x0013e439, 0x016d5b19, 0x02f674a3, 0x03bf7757, 0x02f92f69, 0x01fb6d92, 0x00b1bfeb, 0x038a5abe, 0x03b8b477, 0x00265d06}}, Y: Field{[10]uint32{0x0032cd5b, 0x015f609a, 0x026e43e6, 0x0325a5d1, 0x02b17c15, 0x01638f9e, 0x035aa562, 0x0326979c, 0x01b07bd9, 0x003791fa}}}, + {X: Field{[10]uint32{0x01358533, 0x0335d9ba, 0x00b9df7a, 0x03e753ed, 0x0010a933, 0x0074caa3, 0x02955a29, 0x01d4a20f, 0x00c5fe57, 0x00268225}}, Y: Field{[10]uint32{0x0360ba08, 0x03871770, 0x01dadfb3, 0x02f6ee03, 0x0165a6e5, 0x0153f0c8, 0x0117d5f9, 0x023f0c7e, 0x03c4201b, 0x0029e620}}}, + {X: Field{[10]uint32{0x02b062d4, 0x02a942a4, 0x02141a7c, 0x03966eda, 0x027a5ce7, 0x00fa889e, 0x03b17128, 0x03ab281b, 0x02a43256, 0x000d658f}}, Y: Field{[10]uint32{0x03b25302, 0x02a9346e, 0x019b1a10, 0x02e59379, 0x02d04082, 0x027022a5, 0x00ce196f, 0x039726ff, 0x01454951, 0x003d96f8}}}, + {X: Field{[10]uint32{0x018ef7f6, 0x01017586, 0x00f9f694, 0x03dde81e, 0x025923f3, 0x00ee2ba9, 0x019c8527, 0x034b8d6f, 0x0049db4f, 0x00199376}}, Y: Field{[10]uint32{0x011eac94, 0x025bfcd7, 0x02ecee74, 0x02cc6e39, 0x03fc3d3a, 0x03411633, 0x0048ce5d, 0x01e4ca85, 0x001717f2, 0x002b5448}}}, + {X: Field{[10]uint32{0x019334f0, 0x02d9bcc4, 0x011b60d0, 0x03ece82b, 0x0174728e, 0x0170a790, 0x020e8248, 0x030c871a, 0x037b02cf, 0x0033aede}}, Y: Field{[10]uint32{0x01e45191, 0x0142f494, 0x036cb167, 0x0276e780, 0x004765a2, 0x0374b8dc, 0x01ec0f74, 0x0128cae8, 0x0243633b, 0x003f8f7c}}}, + {X: Field{[10]uint32{0x03c934b3, 0x0029adf0, 0x022c4e0c, 0x02016c2b, 0x022b31f5, 0x020469c0, 0x031d9669, 0x02e18e08, 0x029377d0, 0x0020844e}}, Y: Field{[10]uint32{0x002c6a0f, 0x01798ab1, 0x0280377e, 0x009a6911, 0x00aa1f7c, 0x0168318a, 0x0066cf2b, 0x00d99821, 0x00dac9ae, 0x0023686e}}}, + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + }, + { + {X: Field{[10]uint32{0x0134fd2d, 0x02b379b9, 0x033852c8, 0x011193ce, 0x03a77f8d, 0x02813005, 0x009227a4, 0x03b46c77, 0x03e262c7, 0x003840c6}}, Y: Field{[10]uint32{0x0056a00d, 0x03c63ca5, 0x02d79a44, 0x01067873, 0x02f292dd, 0x0165d4d6, 0x036a4176, 0x010179ae, 0x01928940, 0x00275c18}}}, + {X: Field{[10]uint32{0x015c8356, 0x009f8daa, 0x0185784e, 0x03177a53, 0x01028a6a, 0x03ca6cb2, 0x0395dcd0, 0x0227aae7, 0x03224c80, 0x003d2e4f}}, Y: Field{[10]uint32{0x02001fd3, 0x02186e6f, 0x0209abd5, 0x00d12455, 0x00c37ef1, 0x0103bba4, 0x025f6a7a, 0x018b7ec3, 0x02ec0629, 0x00299ea4}}}, + {X: Field{[10]uint32{0x03028d83, 0x0188ebbb, 0x03961579, 0x01b6e9d0, 0x03619592, 0x01779a76, 0x01abe5a1, 0x0217b1a9, 0x03c4e3c7, 0x0029fafd}}, Y: Field{[10]uint32{0x01d0bed1, 0x000e4ae6, 0x03919964, 0x009d2c14, 0x0347a389, 0x00112012, 0x019c7377, 0x018b573f, 0x012fbfe3, 0x00188145}}}, + {X: Field{[10]uint32{0x03160e8a, 0x018bf85e, 0x0296c20d, 0x004be5f9, 0x00d51e85, 0x0096c22c, 0x01622ea0, 0x0148dac6, 0x00a1fce5, 0x0002746b}}, Y: Field{[10]uint32{0x00a04c44, 0x0014315f, 0x035e534e, 0x03ba484a, 0x026fe9e0, 0x0036309f, 0x016692ce, 0x03c318f9, 0x008f5101, 0x000454c6}}}, + {X: Field{[10]uint32{0x03dd5cfa, 0x00390089, 0x014b5bae, 0x004dfc27, 0x036a89c5, 0x0098d18c, 0x01c6a534, 0x013d3073, 0x008dcb02, 0x0016d728}}, Y: Field{[10]uint32{0x0248e98c, 0x0129be67, 0x029d3e66, 0x0332bcc9, 0x00bfd067, 0x0221a425, 0x011f0cea, 0x016097a6, 0x02f70aa1, 0x000fb32d}}}, + {X: Field{[10]uint32{0x03b61ee5, 0x021104de, 0x00c13f28, 0x038bec7c, 0x02da4f04, 0x025d2b9b, 0x02638cd8, 0x0086e198, 0x0230cc87, 0x003524cc}}, Y: Field{[10]uint32{0x01d694a8, 0x03693439, 0x00ddc662, 0x0231690e, 0x021ad12c, 0x03b2bed7, 0x00c5e9d1, 0x02748fb7, 0x01abf51a, 0x00008702}}}, + {X: Field{[10]uint32{0x03531f82, 0x014a38c8, 0x02c9f2b9, 0x01aec430, 0x01ff5132, 0x02708b0a, 0x02f3e748, 0x012ed733, 0x02acc111, 0x00011bc9}}, Y: Field{[10]uint32{0x03ceda07, 0x017f22c2, 0x01c7fa50, 0x01736ad5, 0x01d02594, 0x03f0c95e, 0x02370ac2, 0x020bab38, 0x0331635b, 0x001ae012}}}, + {X: Field{[10]uint32{0x01ba7fc2, 0x035f411d, 0x01562e97, 0x024eff0e, 0x03518b3a, 0x02087379, 0x022ad793, 0x00ae7862, 0x01cc454c, 0x00319b16}}, Y: Field{[10]uint32{0x035f5956, 0x00f1a73d, 0x015977ec, 0x0376c565, 0x02f00a60, 0x02b0432c, 0x024f3cea, 0x003f3efa, 0x03e2bfb3, 0x0036564b}}}, + {X: Field{[10]uint32{0x00432711, 0x00550dc4, 0x02b9060b, 0x00bf7645, 0x02cf140b, 0x02265916, 0x0396f0f0, 0x03bed4d7, 0x02d931e0, 0x00304649}}, Y: Field{[10]uint32{0x03e2610c, 0x009878bb, 0x00055e49, 0x00b283cd, 0x0383ab92, 0x01b331b3, 0x0094bf18, 0x02da2461, 0x00cc7d25, 0x0022f87e}}}, + {X: Field{[10]uint32{0x02be316c, 0x01b1b348, 0x03ad0f83, 0x00fc9e39, 0x016bf404, 0x0097bd7c, 0x017cef5b, 0x00deccac, 0x01aa4a0b, 0x00156735}}, Y: Field{[10]uint32{0x03e04013, 0x02ae7267, 0x000e71a6, 0x0074d81e, 0x038a389a, 0x01d31a4b, 0x01ba9298, 0x0101dbcb, 0x009c08d4, 0x002ab551}}}, + {X: Field{[10]uint32{0x01257963, 0x0261d3e8, 0x02861c17, 0x014b0d2a, 0x005b018d, 0x00e25e71, 0x01bb54b5, 0x023cb9b3, 0x02e9eb68, 0x001a4211}}, Y: Field{[10]uint32{0x026f9835, 0x01d96651, 0x02b253a5, 0x02a08724, 0x036cbc3c, 0x024beedf, 0x0017024f, 0x03af16d0, 0x03cb7f3f, 0x00389217}}}, + {X: Field{[10]uint32{0x0004554a, 0x03772f3b, 0x00ffe530, 0x02ed1a23, 0x00aadcff, 0x028428bb, 0x00652c27, 0x0346811d, 0x03c89873, 0x00225bcd}}, Y: Field{[10]uint32{0x029138df, 0x03e7f864, 0x017dcd68, 0x0186b310, 0x01e6085b, 0x03a046fc, 0x0222bb04, 0x0312b369, 0x03e7224a, 0x000e0108}}}, + {X: Field{[10]uint32{0x02e23ace, 0x004e52f7, 0x012fd2d1, 0x0196d537, 0x01dec87c, 0x0128ca45, 0x027552df, 0x0082eaee, 0x03fb8c92, 0x003ecf7d}}, Y: Field{[10]uint32{0x0322e8de, 0x037bd325, 0x03f5ee09, 0x010bfb49, 0x029e7271, 0x036ead62, 0x02251540, 0x00f1594a, 0x01bc11c7, 0x0014438a}}}, + {X: Field{[10]uint32{0x00d36f89, 0x003c4c17, 0x00b925f9, 0x031b9c03, 0x031e4754, 0x00a403b8, 0x01d68b87, 0x0148e594, 0x03176915, 0x00120adb}}, Y: Field{[10]uint32{0x00a4f423, 0x0328dc9c, 0x01a68467, 0x00d10b52, 0x0219ee07, 0x035ffa4b, 0x018c23e6, 0x03316b2c, 0x011df9a5, 0x003a30f0}}}, + {X: Field{[10]uint32{0x00272351, 0x01f3fbd4, 0x03109860, 0x00f7e67f, 0x0170734b, 0x02ac7350, 0x038a3eb3, 0x01462cfa, 0x02c24f5c, 0x001b7617}}, Y: Field{[10]uint32{0x03c7664b, 0x01fe8adf, 0x0017c9b0, 0x03df0f82, 0x03877c6f, 0x03d7106d, 0x01407f9a, 0x0109f827, 0x03f4121f, 0x0005ba99}}}, + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + }, + { + {X: Field{[10]uint32{0x0094696d, 0x039a2364, 0x02af52d5, 0x019a9075, 0x005cf8b2, 0x010ef5fb, 0x002839f1, 0x016d4c2b, 0x00ae46d5, 0x003fba9b}}, Y: Field{[10]uint32{0x00090088, 0x0177afc6, 0x0042d315, 0x015f3105, 0x00981c89, 0x03cfb357, 0x02e4e12b, 0x0386eac1, 0x036c97dc, 0x00395f1a}}}, + {X: Field{[10]uint32{0x02752b08, 0x010102bb, 0x021870aa, 0x0382ccc6, 0x01141eca, 0x036cb85e, 0x03261af9, 0x021f8714, 0x03621adb, 0x00134002}}, Y: Field{[10]uint32{0x00302cea, 0x00a147d2, 0x0293a3e7, 0x03c4671c, 0x00cb7df5, 0x00b65cb3, 0x02d82558, 0x0349572d, 0x038f18e0, 0x001a8356}}}, + {X: Field{[10]uint32{0x00dfd587, 0x00d86ed2, 0x02656079, 0x00e326c0, 0x015ec4ba, 0x033d684b, 0x0067aaa2, 0x01422cd2, 0x001bacf4, 0x0014212d}}, Y: Field{[10]uint32{0x01470e89, 0x027a5fe4, 0x035606e7, 0x0181a247, 0x035db6f5, 0x014a49d1, 0x01aa6c85, 0x0034c586, 0x031a1d98, 0x000d2a58}}}, + {X: Field{[10]uint32{0x035c58ef, 0x0258bf51, 0x01b77f89, 0x0100f87c, 0x00d657a0, 0x011c5c4a, 0x02a26211, 0x0281775a, 0x00ca203d, 0x001c7d5c}}, Y: Field{[10]uint32{0x035d420e, 0x01269cb4, 0x03e7df86, 0x00030cd8, 0x01f2445d, 0x02f256e3, 0x01557345, 0x02203749, 0x015b95dc, 0x003ad090}}}, + {X: Field{[10]uint32{0x02b34cc6, 0x008c985e, 0x00a12d08, 0x01d9f3cc, 0x00c80c29, 0x00635c4a, 0x03b3f1fd, 0x0357a94f, 0x003e0642, 0x0013c530}}, Y: Field{[10]uint32{0x007e681f, 0x03094be6, 0x01d0225e, 0x033a3a07, 0x00b9de3c, 0x00e98950, 0x013a70f4, 0x03a25319, 0x00a8caa4, 0x001ed4f4}}}, + {X: Field{[10]uint32{0x00953fa9, 0x01655b5b, 0x003db4d0, 0x00a7c2e3, 0x0228ab26, 0x02f46301, 0x01f485d4, 0x024c8ce9, 0x010eaaab, 0x002927b4}}, Y: Field{[10]uint32{0x02fb4c72, 0x00af4891, 0x0181b67b, 0x00d25a38, 0x035ae875, 0x0037f77e, 0x03476c0a, 0x014e6380, 0x0094660f, 0x00331cae}}}, + {X: Field{[10]uint32{0x0241d90d, 0x01dc4044, 0x004f8342, 0x01076c91, 0x03e81cf1, 0x03b774d8, 0x01436095, 0x027b4750, 0x007e49c7, 0x0029d36e}}, Y: Field{[10]uint32{0x037adad4, 0x01462e0f, 0x02313f32, 0x024d1282, 0x00a9ee50, 0x02205c72, 0x03dd08a5, 0x03bbcc9f, 0x01cdaf23, 0x003de1a4}}}, + {X: Field{[10]uint32{0x03ff8359, 0x022c1810, 0x03651604, 0x00771979, 0x0046b482, 0x00876805, 0x01282b5c, 0x03494edf, 0x03629f7b, 0x0028adec}}, Y: Field{[10]uint32{0x0286fec2, 0x025ffb3f, 0x03835a23, 0x00d411bc, 0x0110d108, 0x01c78a72, 0x02937a3f, 0x0048b55e, 0x00941695, 0x001a4c0e}}}, + {X: Field{[10]uint32{0x01c1ae1f, 0x0332888c, 0x000b2a5e, 0x031a2b35, 0x00456e58, 0x02e8d596, 0x00dcd44e, 0x028b3e6b, 0x025744ba, 0x001a407e}}, Y: Field{[10]uint32{0x022838b0, 0x00cc1974, 0x03a930f8, 0x0297971d, 0x01d79f3b, 0x00a72403, 0x01b5380c, 0x03084918, 0x00882273, 0x000d7797}}}, + {X: Field{[10]uint32{0x01f1f366, 0x002404e6, 0x036be34f, 0x01e8f401, 0x004a7905, 0x01265364, 0x015f216b, 0x01fdee92, 0x025c5da4, 0x001744d3}}, Y: Field{[10]uint32{0x00990f2c, 0x0034fa71, 0x00b39e2b, 0x005882a2, 0x03cf02d6, 0x00ea0adc, 0x03e2a4ae, 0x011410b6, 0x034d3e08, 0x0000ec7b}}}, + {X: Field{[10]uint32{0x027a4bdb, 0x00c4206c, 0x00cac4b0, 0x0010d525, 0x01046a6d, 0x006ee8d7, 0x004b643f, 0x02049e89, 0x002d1d43, 0x00234f36}}, Y: Field{[10]uint32{0x029a8a2c, 0x00d31f39, 0x01296c3d, 0x01f4dc2b, 0x02d4e380, 0x001d88db, 0x00fbf9d0, 0x0107d1c3, 0x016180ee, 0x0026f509}}}, + {X: Field{[10]uint32{0x03a1d916, 0x025b4ff9, 0x01f3a3c0, 0x00e5747c, 0x00315b0a, 0x0176ec1c, 0x006158a6, 0x027432eb, 0x01acb6d5, 0x001943be}}, Y: Field{[10]uint32{0x0068387b, 0x0127299c, 0x026ba858, 0x00229db0, 0x0158bb46, 0x01e6e0b1, 0x029c0b92, 0x02c461c3, 0x01f21162, 0x00021744}}}, + {X: Field{[10]uint32{0x00ec1d2d, 0x0334f1ad, 0x00f45440, 0x0171b9f6, 0x03d9099f, 0x019eda47, 0x029d6729, 0x011ce6bf, 0x0363d606, 0x003abe60}}, Y: Field{[10]uint32{0x00838452, 0x039d5813, 0x00b53fcf, 0x01515fa1, 0x02a9f52d, 0x01ac666a, 0x01228a0e, 0x023489dd, 0x003a7fe7, 0x00394606}}}, + {X: Field{[10]uint32{0x03d98ee1, 0x0323a022, 0x012bed42, 0x01ea4226, 0x03579df3, 0x023ee865, 0x027c924a, 0x00860ffa, 0x02ce0ceb, 0x00075dc2}}, Y: Field{[10]uint32{0x0138ffca, 0x02e05e47, 0x017ecf9f, 0x029038f5, 0x0237f61c, 0x01954aa1, 0x0163038b, 0x03d779e2, 0x0005f46e, 0x0009e3e2}}}, + {X: Field{[10]uint32{0x005ae767, 0x00d6fdc1, 0x0371cbcb, 0x032e7a25, 0x00c273a9, 0x0301b976, 0x0340e052, 0x02d8d19b, 0x01163aed, 0x003ee56f}}, Y: Field{[10]uint32{0x03bf0e11, 0x00fa82be, 0x03134185, 0x01c62967, 0x03b816f4, 0x01a089d6, 0x0004d9d3, 0x0376f148, 0x00d811a8, 0x00199305}}}, + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + }, + { + {X: Field{[10]uint32{0x01ec6cb1, 0x02a5e2f0, 0x003de33f, 0x01f60216, 0x00feed65, 0x01bff28f, 0x027be4be, 0x027372cd, 0x011d9104, 0x003699ea}}, Y: Field{[10]uint32{0x0268be1d, 0x03aa389e, 0x000a17e9, 0x031423dd, 0x01dec7ad, 0x0325e039, 0x03463f7e, 0x010af107, 0x02354816, 0x0026eb2a}}}, + {X: Field{[10]uint32{0x03e741c9, 0x00f32087, 0x01a835ee, 0x00d733a9, 0x018bbd9f, 0x03c0361c, 0x00c0cfaa, 0x03bd61f0, 0x01365fa1, 0x00136eb3}}, Y: Field{[10]uint32{0x038eb623, 0x03843e0c, 0x0135f60b, 0x02827f01, 0x010cc384, 0x020e0a67, 0x01cfd59e, 0x0224b9ff, 0x000e8a51, 0x0005b0d5}}}, + {X: Field{[10]uint32{0x01bc8a44, 0x03741945, 0x011a19ef, 0x01df2f85, 0x03684101, 0x029697f1, 0x00565a4b, 0x03b68f4e, 0x00583cfc, 0x00134060}}, Y: Field{[10]uint32{0x02dbc09e, 0x03e53246, 0x01a362f1, 0x011a160b, 0x03969420, 0x01f58e04, 0x029ba800, 0x03d74d9f, 0x02c18cb4, 0x000e8cf1}}}, + {X: Field{[10]uint32{0x00e218da, 0x036a2ead, 0x0205087e, 0x03c549a1, 0x010f4c85, 0x03d07096, 0x00f17d8f, 0x026fbb9a, 0x03c48150, 0x0004f47f}}, Y: Field{[10]uint32{0x03191c19, 0x02d06776, 0x01127e0d, 0x0081b56f, 0x01a4ad01, 0x006dd62f, 0x00b9337b, 0x0258773b, 0x011fa991, 0x0018020e}}}, + {X: Field{[10]uint32{0x01daeb00, 0x02ad4a19, 0x01f76bc1, 0x00933991, 0x015923eb, 0x00edba74, 0x02cb6a27, 0x03e55c20, 0x0107df5c, 0x000bd985}}, Y: Field{[10]uint32{0x033992c0, 0x01d9e260, 0x0308c122, 0x009c6574, 0x006ecdee, 0x00802b74, 0x039537a8, 0x02ccfdbb, 0x02136f52, 0x003f5704}}}, + {X: Field{[10]uint32{0x035b4eb8, 0x0084f924, 0x01a3cf52, 0x03c6ae2d, 0x0207f557, 0x032bcb73, 0x03f54a3c, 0x00895bc3, 0x00e43adf, 0x0030465a}}, Y: Field{[10]uint32{0x03911add, 0x01265b5b, 0x0149b704, 0x02504a9c, 0x0242f8b4, 0x019d9be0, 0x039d81fe, 0x01163e0d, 0x02937786, 0x002ffd79}}}, + {X: Field{[10]uint32{0x016aa6d9, 0x02a42824, 0x02dcf182, 0x02d91dc0, 0x003662c8, 0x0060d68e, 0x00f174da, 0x011f4895, 0x017d05fe, 0x003d6504}}, Y: Field{[10]uint32{0x032e50cf, 0x001a5baf, 0x01b86c7d, 0x0220f9ad, 0x037a9277, 0x00252f3a, 0x025dbdab, 0x006c4b3d, 0x01a56e97, 0x0032a9d8}}}, + {X: Field{[10]uint32{0x02e96db8, 0x02d032a8, 0x01bff133, 0x005b38a7, 0x033cc9d9, 0x016c14ce, 0x019c79c4, 0x018001d9, 0x039cef6c, 0x000866d3}}, Y: Field{[10]uint32{0x013b6bc7, 0x03c069e3, 0x0176527d, 0x0314fa41, 0x02394f8a, 0x000dca9b, 0x0244180c, 0x03bfabd6, 0x0205d959, 0x00093671}}}, + {X: Field{[10]uint32{0x02c6f4c0, 0x0380e55e, 0x01c4ccaa, 0x03a3312f, 0x01da4e8d, 0x01a59c47, 0x021c38be, 0x02737b13, 0x017f1f4d, 0x0003cb53}}, Y: Field{[10]uint32{0x02339b58, 0x01eeeb5c, 0x02656e7e, 0x029e4090, 0x028f6a10, 0x00e079c7, 0x03b27fdf, 0x0379345f, 0x03857e93, 0x000fb227}}}, + {X: Field{[10]uint32{0x00284327, 0x0347e6bd, 0x02facc56, 0x02c0e0e9, 0x03ac4020, 0x001a8d05, 0x003ebdd8, 0x02d17375, 0x00bdcd64, 0x0003da10}}, Y: Field{[10]uint32{0x01e2ab72, 0x0349d691, 0x01eb7400, 0x029dc4ae, 0x03b68dab, 0x02d8452b, 0x01e8bff4, 0x0069dd25, 0x037f100f, 0x003cc134}}}, + {X: Field{[10]uint32{0x03428cb2, 0x01414ff7, 0x02b55d85, 0x03f59a88, 0x01233822, 0x0256343c, 0x037a1815, 0x012ef47a, 0x02c2e2a1, 0x00075773}}, Y: Field{[10]uint32{0x015b189b, 0x03b44022, 0x004a51e5, 0x00be1d81, 0x00bd3e91, 0x021bc2e2, 0x00787824, 0x03231434, 0x0083b142, 0x001b9710}}}, + {X: Field{[10]uint32{0x01dffc96, 0x02e84256, 0x01857295, 0x0296beb1, 0x019228cd, 0x0205fac0, 0x039b395c, 0x00f7abdb, 0x00bee148, 0x0005871b}}, Y: Field{[10]uint32{0x03492de4, 0x02f3d846, 0x00621c93, 0x0324babe, 0x019b9634, 0x032c60c1, 0x01259391, 0x03fe616f, 0x0292a6b9, 0x002289b2}}}, + {X: Field{[10]uint32{0x00381273, 0x03aa23ea, 0x01ae5fb0, 0x02581a4f, 0x02d84376, 0x031049b3, 0x01ea9b2c, 0x019d0e7f, 0x02fd3009, 0x00227668}}, Y: Field{[10]uint32{0x0309773d, 0x03acfbb4, 0x03324a03, 0x0202b449, 0x018f61d6, 0x01b3d8bd, 0x03aaf207, 0x01bd40dd, 0x01b451d6, 0x0037f289}}}, + {X: Field{[10]uint32{0x010a683f, 0x018557e0, 0x031be4cf, 0x00c6fdba, 0x005248bd, 0x00626aa3, 0x02c7285f, 0x035283f9, 0x02cc3f64, 0x001e0f43}}, Y: Field{[10]uint32{0x00f54c4c, 0x019b38b8, 0x01ee9dfd, 0x0221c8e5, 0x02b5de92, 0x01fcb547, 0x02b74572, 0x03d28c05, 0x01029073, 0x0008029b}}}, + {X: Field{[10]uint32{0x01c71d91, 0x00cacb2d, 0x00fd21cc, 0x00b8aa25, 0x0223945e, 0x0056bfb3, 0x02a1c131, 0x002b8714, 0x038783a5, 0x0020c646}}, Y: Field{[10]uint32{0x02148a61, 0x027b0238, 0x005ee70b, 0x0145d411, 0x0217a11f, 0x005f2ba2, 0x006de13d, 0x006dc278, 0x03157380, 0x00382b1f}}}, + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + }, + { + {X: Field{[10]uint32{0x0237b7c0, 0x01173306, 0x0069f575, 0x03deec44, 0x01ec08d0, 0x03bc8854, 0x02000935, 0x0133769b, 0x03aa0b33, 0x0014e413}}, Y: Field{[10]uint32{0x022771c8, 0x02c25ac0, 0x034699dc, 0x02078510, 0x00139999, 0x00834f07, 0x009eccac, 0x0041b623, 0x03d0bc80, 0x0016f021}}}, + {X: Field{[10]uint32{0x00a47ca9, 0x0343c7ce, 0x005ad57c, 0x02aab43e, 0x012a6ee7, 0x00c5a657, 0x03991196, 0x0119d4f3, 0x01af9d41, 0x0000695d}}, Y: Field{[10]uint32{0x03ebcdb7, 0x0177cb9d, 0x03ea667c, 0x01767d35, 0x00bdb93c, 0x006ee1a6, 0x015fc52e, 0x00370f31, 0x01cb8ab2, 0x000c0e3c}}}, + {X: Field{[10]uint32{0x00a2050e, 0x0310bf92, 0x00a6771a, 0x015d857e, 0x01742ef5, 0x0391e6e2, 0x03769cc6, 0x01cc625a, 0x00fd24bc, 0x0019cdc9}}, Y: Field{[10]uint32{0x021d3d70, 0x03269241, 0x01cc2b90, 0x03f50cd2, 0x01be6bac, 0x02a21adb, 0x03482c09, 0x01288080, 0x0257896a, 0x003933e0}}}, + {X: Field{[10]uint32{0x0315565b, 0x0275d578, 0x00c6ee30, 0x020f4f08, 0x02d3a61a, 0x01d85575, 0x031f5c1b, 0x0350e729, 0x00437621, 0x003d7c38}}, Y: Field{[10]uint32{0x012ecc82, 0x010c2bf7, 0x0240a678, 0x02fcfb5f, 0x02a5bf61, 0x037dc406, 0x02189160, 0x0014afd8, 0x0262be5a, 0x001ae7d3}}}, + {X: Field{[10]uint32{0x02de63bf, 0x01b920e0, 0x01c66cbf, 0x00ca1c98, 0x00e03af5, 0x03d859aa, 0x0198a631, 0x0130c279, 0x03a472df, 0x0010d9bb}}, Y: Field{[10]uint32{0x017924cd, 0x01a90238, 0x02d6b02c, 0x01496aa9, 0x02f33b0c, 0x00c09a3a, 0x022537e1, 0x035f38bb, 0x0109bee2, 0x000b9f76}}}, + {X: Field{[10]uint32{0x01a78179, 0x03d807ea, 0x02afe34c, 0x00149835, 0x036b50e9, 0x00827b67, 0x01a47336, 0x02e37241, 0x03f37081, 0x00265729}}, Y: Field{[10]uint32{0x03ec1f47, 0x03eed32b, 0x00e52931, 0x015a6ad9, 0x02bbcc85, 0x0124a18e, 0x0234d880, 0x015cead7, 0x01e95553, 0x00366816}}}, + {X: Field{[10]uint32{0x02f96190, 0x0149ffc1, 0x0125ef10, 0x03a41f25, 0x03d1f02d, 0x019ea9d7, 0x03e55696, 0x02ac7e5e, 0x03627991, 0x001ef5d4}}, Y: Field{[10]uint32{0x03da00f6, 0x005c812a, 0x02695a3d, 0x0170783a, 0x02ce0fcc, 0x010e09f5, 0x02d64749, 0x018c2757, 0x02b3dbba, 0x0020cdbc}}}, + {X: Field{[10]uint32{0x01362d33, 0x01e0767d, 0x03642cbe, 0x00851889, 0x0347cbc9, 0x01c32938, 0x027f36d9, 0x01ba695e, 0x030b6c0b, 0x0023d41b}}, Y: Field{[10]uint32{0x03fa243f, 0x021f4321, 0x00eaf304, 0x01750eee, 0x0048cf92, 0x03c70cda, 0x030c5424, 0x0185c654, 0x015d2afa, 0x0011a7e5}}}, + {X: Field{[10]uint32{0x02ad41ed, 0x0054c555, 0x0352433b, 0x00d7d3c0, 0x020308ac, 0x02463724, 0x023419e8, 0x035706be, 0x027bddaa, 0x0013dfa4}}, Y: Field{[10]uint32{0x02642d57, 0x00d5e19f, 0x0375bdf4, 0x01c53abd, 0x022e7314, 0x00ea3da9, 0x02980df5, 0x022c4154, 0x005156a8, 0x0037f9dd}}}, + {X: Field{[10]uint32{0x025e6618, 0x010e868f, 0x03cb4c18, 0x03d6763f, 0x03166d65, 0x03904918, 0x02017141, 0x01f6fe1f, 0x007338b9, 0x003ef084}}, Y: Field{[10]uint32{0x0230c860, 0x01536808, 0x00cf20ed, 0x00fc772f, 0x017f3c4f, 0x03ce6c47, 0x0160c1a6, 0x025052d2, 0x0059185c, 0x0027e6c2}}}, + {X: Field{[10]uint32{0x03748690, 0x01814499, 0x00b01cfa, 0x0137618c, 0x007d5790, 0x0374cf40, 0x03452b1e, 0x00733252, 0x03867d29, 0x0008d572}}, Y: Field{[10]uint32{0x0089582b, 0x011d4c53, 0x0139147c, 0x01633472, 0x00582868, 0x016a9f16, 0x01b85ec1, 0x0387e3d5, 0x018a5a71, 0x000870bc}}}, + {X: Field{[10]uint32{0x009135d3, 0x02361761, 0x031fc13d, 0x03404b90, 0x0274203c, 0x004c2c5a, 0x00134294, 0x02a16997, 0x03c7ef82, 0x00016502}}, Y: Field{[10]uint32{0x022255d2, 0x035d1465, 0x02391d02, 0x00a32640, 0x02f12863, 0x02ad9a1e, 0x035b0c7a, 0x02ad84bd, 0x0185eb4f, 0x002414de}}}, + {X: Field{[10]uint32{0x02de7f16, 0x03a88582, 0x0028c6da, 0x03a4f2f8, 0x00ae9cba, 0x0309d749, 0x03592ab6, 0x0295b004, 0x025b9b3d, 0x0002d9a0}}, Y: Field{[10]uint32{0x00c56217, 0x01109a12, 0x00d2bd94, 0x0037cf9f, 0x03b7243c, 0x02d5ea5f, 0x03a76ba8, 0x026cffbc, 0x00b818e0, 0x00287ee8}}}, + {X: Field{[10]uint32{0x00d2374d, 0x00c1c059, 0x02b2bc63, 0x025a133f, 0x00dcf38a, 0x02cffda9, 0x025a9f71, 0x03274976, 0x02d8b5e5, 0x0005bba3}}, Y: Field{[10]uint32{0x00865998, 0x016f2d3f, 0x01dd980e, 0x003b9b53, 0x02075513, 0x016dbfd8, 0x026b843e, 0x03c44228, 0x03f0546f, 0x003d4039}}}, + {X: Field{[10]uint32{0x01060d5b, 0x01ac08a6, 0x03a7c290, 0x02c470e8, 0x03904613, 0x027e5472, 0x0109b2fd, 0x0008b2d8, 0x003cf0bd, 0x003d8081}}, Y: Field{[10]uint32{0x02f88f13, 0x01bd42c6, 0x01a3f76f, 0x034adf74, 0x0237aa56, 0x0313defa, 0x01a8f64a, 0x033c6620, 0x0306c1f0, 0x003c0dad}}}, + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + }, + { + {X: Field{[10]uint32{0x02d86047, 0x02567d0e, 0x00bcaeff, 0x0010ea6e, 0x0379b53a, 0x0132a419, 0x01cca776, 0x020e9dc6, 0x010bd359, 0x00239ef3}}, Y: Field{[10]uint32{0x0060372a, 0x00011fa1, 0x028b3ea1, 0x00b91ff5, 0x0179e88e, 0x032a5451, 0x00310420, 0x0292ce50, 0x030b2a3d, 0x00042ddd}}}, + {X: Field{[10]uint32{0x013f0351, 0x00a022fc, 0x009e777d, 0x0234f40e, 0x033bc15b, 0x025a5437, 0x010f3199, 0x01ca770d, 0x03aa195e, 0x000cecd6}}, Y: Field{[10]uint32{0x038d7418, 0x0140f332, 0x01b702bc, 0x03bef222, 0x00aa6560, 0x012354af, 0x00640362, 0x02fe1fe5, 0x0185640a, 0x00296280}}}, + {X: Field{[10]uint32{0x001ead4b, 0x0221e681, 0x003c1ffe, 0x03eda46c, 0x023a75ed, 0x02bf9daf, 0x014734ef, 0x00cdfb1c, 0x000c8c8f, 0x002ff243}}, Y: Field{[10]uint32{0x02fedaed, 0x00b1bc21, 0x02e3e745, 0x03fccb82, 0x02fb468e, 0x01410b4d, 0x03a718dd, 0x037b4936, 0x01b1e09c, 0x001ea520}}}, + {X: Field{[10]uint32{0x0014bb36, 0x0371ec91, 0x03ca6d71, 0x00272b5e, 0x0256f6e1, 0x01c7df88, 0x0383ad20, 0x00fe5572, 0x02ae22c9, 0x000dd37b}}, Y: Field{[10]uint32{0x01af734a, 0x016faa63, 0x00321787, 0x018c0395, 0x013828d6, 0x0201bdca, 0x0032c06f, 0x013e6458, 0x01b64fcd, 0x0005c459}}}, + {X: Field{[10]uint32{0x01bb3b3e, 0x01ef41dd, 0x033cb26e, 0x005fbe7d, 0x03507536, 0x030b4fd6, 0x025993e8, 0x02aa9372, 0x011cbe3f, 0x001ccb7c}}, Y: Field{[10]uint32{0x03366693, 0x01df87b5, 0x00436cc5, 0x01b59316, 0x02e69dad, 0x00094e45, 0x03e25584, 0x0265df2d, 0x003ede8f, 0x001fd064}}}, + {X: Field{[10]uint32{0x01b7ad0d, 0x03215bb9, 0x011d3694, 0x01f2a743, 0x0076ee76, 0x01b45b11, 0x010d8a49, 0x0380370b, 0x010dabb5, 0x000e955a}}, Y: Field{[10]uint32{0x02e8c407, 0x0261e42c, 0x01218d6c, 0x022b2b0c, 0x0301cacb, 0x01fbe67c, 0x021fbac9, 0x0195efec, 0x021975a0, 0x0030f8a3}}}, + {X: Field{[10]uint32{0x008dc3b9, 0x016cf062, 0x00c99c5f, 0x0093a5dd, 0x0019a669, 0x0325fbd8, 0x01a8840c, 0x011ed0a3, 0x00b96039, 0x00133825}}, Y: Field{[10]uint32{0x01c0de52, 0x013dedb9, 0x006502c1, 0x008327a8, 0x0216205b, 0x029dab28, 0x03b4d80c, 0x026cfb55, 0x03babf1a, 0x00014e43}}}, + {X: Field{[10]uint32{0x02e7d616, 0x02992b5a, 0x01f0c5e8, 0x03cad8aa, 0x00944dba, 0x016bac37, 0x006e0739, 0x03ab95f1, 0x009c7f3a, 0x0008e030}}, Y: Field{[10]uint32{0x021bbc1a, 0x026f9205, 0x02756009, 0x00523e11, 0x0293af92, 0x01426c26, 0x0198aefd, 0x0255abc5, 0x02193464, 0x001be3a1}}}, + {X: Field{[10]uint32{0x02aafe5a, 0x01d782c2, 0x02edd4c3, 0x02ce9426, 0x00e25470, 0x02c08ff4, 0x018a6a95, 0x019f7a5b, 0x02b76fc6, 0x0026a5a3}}, Y: Field{[10]uint32{0x02d975c0, 0x02ff5093, 0x00cc0ce6, 0x0029979c, 0x02e7b588, 0x03618743, 0x03c66d03, 0x02e8a553, 0x0307a6d3, 0x002afdbe}}}, + {X: Field{[10]uint32{0x03a32402, 0x018b453b, 0x025348d9, 0x0184f19a, 0x025e659c, 0x000e00d3, 0x037db3bb, 0x03aaaf83, 0x02ced74c, 0x00060293}}, Y: Field{[10]uint32{0x00894b4e, 0x00de0371, 0x0118b320, 0x024dff73, 0x01a602c5, 0x013fafa1, 0x03bfc2f2, 0x035f8ab6, 0x015747ba, 0x00126293}}}, + {X: Field{[10]uint32{0x034c6397, 0x0072fe7c, 0x00d09375, 0x02d401d3, 0x0107dd3d, 0x014dac88, 0x00aef802, 0x0186553c, 0x03ed0171, 0x0034f1be}}, Y: Field{[10]uint32{0x00cb3f9c, 0x0323415a, 0x00e00b1f, 0x00224178, 0x028a0c77, 0x00baad91, 0x018394d9, 0x00abc651, 0x02c55e5e, 0x00128374}}}, + {X: Field{[10]uint32{0x01b2df82, 0x0291ec26, 0x00fb1927, 0x00591c41, 0x00ec5e7a, 0x0338cb01, 0x012d18ec, 0x02e4b332, 0x005c62bf, 0x00101699}}, Y: Field{[10]uint32{0x01307dbf, 0x00a0d282, 0x0062b5da, 0x02cb3b71, 0x022ffa9d, 0x008df9c4, 0x00aca61e, 0x025b83d7, 0x0014f44d, 0x002f0f2d}}}, + {X: Field{[10]uint32{0x02c3137e, 0x020964c2, 0x0244619b, 0x018a96bd, 0x03fe925b, 0x02aace54, 0x02f06a76, 0x010ee380, 0x03981292, 0x00132f78}}, Y: Field{[10]uint32{0x02c02fe6, 0x023c573b, 0x02d60c00, 0x02b9623a, 0x00d193a7, 0x02e530dc, 0x0092a134, 0x01856540, 0x00608f13, 0x001b3955}}}, + {X: Field{[10]uint32{0x010ce56e, 0x006788f9, 0x014a3c71, 0x03c35de4, 0x02c8293a, 0x032f9e05, 0x00590fca, 0x006bcf9a, 0x00d3ce53, 0x002a9b71}}, Y: Field{[10]uint32{0x01edd739, 0x03ce8d1f, 0x010a8b9d, 0x036be3dc, 0x03c11984, 0x03997998, 0x01f6edc5, 0x0394a5b8, 0x018fa241, 0x003af1e6}}}, + {X: Field{[10]uint32{0x00fbf84b, 0x008c1b38, 0x00b8a47a, 0x032ef0fc, 0x0303c48f, 0x030533ae, 0x03d9c730, 0x01891ee2, 0x033c82b1, 0x0012e74c}}, Y: Field{[10]uint32{0x036c3c48, 0x03b92d28, 0x035e6239, 0x010f8bd6, 0x036766d5, 0x019e6dfa, 0x0313d982, 0x03054954, 0x03fbe24c, 0x003f5ff1}}}, + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + }, + { + {X: Field{[10]uint32{0x01c43862, 0x01078566, 0x026690a8, 0x03c60e5f, 0x0271a7f4, 0x026e06f7, 0x01081868, 0x03fc879b, 0x0134c1cd, 0x000e17bb}}, Y: Field{[10]uint32{0x002e5453, 0x0163f955, 0x01c8cc04, 0x03b0821b, 0x036b304e, 0x027afd15, 0x001de19e, 0x008fd59c, 0x03c3e8ea, 0x000a0efa}}}, + {X: Field{[10]uint32{0x00f2827c, 0x00e89c1e, 0x01ce2dc8, 0x010afbf0, 0x0147c826, 0x0357d9f4, 0x016be134, 0x01520011, 0x02083daf, 0x003dbd88}}, Y: Field{[10]uint32{0x00aaa102, 0x02c82d48, 0x01bf6d15, 0x01d120c8, 0x03e657ca, 0x00d9f3b9, 0x02c5715b, 0x00e83ebc, 0x02817de7, 0x0006f353}}}, + {X: Field{[10]uint32{0x02e2d9b3, 0x034c1aad, 0x0163514b, 0x020c6ce3, 0x0241db92, 0x0273e115, 0x012ea613, 0x00179d78, 0x00f397c7, 0x000668c5}}, Y: Field{[10]uint32{0x03aaaf33, 0x00bb8972, 0x03e56d55, 0x00749012, 0x03a5021d, 0x01fd4a2c, 0x00965f88, 0x00a3748d, 0x00f5dac7, 0x001b2b36}}}, + {X: Field{[10]uint32{0x015adcb6, 0x024c825c, 0x02f369d8, 0x0339f631, 0x01cd91c3, 0x0347f095, 0x030cb3c3, 0x00f78af5, 0x01188f95, 0x003ec9b9}}, Y: Field{[10]uint32{0x00ba68f3, 0x02f28ed6, 0x02b5449d, 0x00c6e2de, 0x0116d2cb, 0x027405da, 0x02846a71, 0x028d3563, 0x00811012, 0x003cf84a}}}, + {X: Field{[10]uint32{0x02f00480, 0x0161fac4, 0x01cee7d8, 0x00128403, 0x01203588, 0x013d9c86, 0x01c98636, 0x036a8d57, 0x014b95a8, 0x0016103b}}, Y: Field{[10]uint32{0x0222cf9e, 0x00b578af, 0x03872159, 0x01514ab8, 0x02ba7522, 0x00577636, 0x0168deaa, 0x03c5041e, 0x026b220b, 0x0019c336}}}, + {X: Field{[10]uint32{0x03a52264, 0x01cdf658, 0x00b3752e, 0x000c5500, 0x03d0adfc, 0x02b9473f, 0x006e2a9a, 0x01ffa6a0, 0x000de818, 0x00217ff7}}, Y: Field{[10]uint32{0x02da2082, 0x01f4a6a0, 0x01d0498c, 0x0324ac5e, 0x00678182, 0x01551c1b, 0x02568f50, 0x0252342f, 0x00187ae2, 0x000ffb8c}}}, + {X: Field{[10]uint32{0x03f54c42, 0x0137ba08, 0x03dc8e48, 0x00f09a68, 0x0145dc1a, 0x03b394c9, 0x0058c1f4, 0x0063ec77, 0x01a53469, 0x0027d5c0}}, Y: Field{[10]uint32{0x03eb6a21, 0x0387124b, 0x02527860, 0x012ac867, 0x0189ee78, 0x01ca6ff7, 0x0395b6b5, 0x02795efe, 0x03b8801d, 0x00339ee3}}}, + {X: Field{[10]uint32{0x00788c1e, 0x0136dd58, 0x011d7ed4, 0x00183a2f, 0x03d18c37, 0x018f3aad, 0x035c6bc7, 0x004cb4a3, 0x025911b9, 0x00226448}}, Y: Field{[10]uint32{0x028f0ef1, 0x031088a3, 0x01e11635, 0x0213f7be, 0x0236969c, 0x026c4dbe, 0x03876355, 0x02b26c9e, 0x01987cc9, 0x0036a2d3}}}, + {X: Field{[10]uint32{0x0122461a, 0x0104cca5, 0x018327e9, 0x00996f1c, 0x00bcb30a, 0x019fbe68, 0x03b87010, 0x0233f006, 0x0169235a, 0x0009fd84}}, Y: Field{[10]uint32{0x03301a2d, 0x0132be71, 0x039446aa, 0x00836a18, 0x00e4981b, 0x01d0a3ba, 0x008c5612, 0x01ab4ba9, 0x01a9900a, 0x003944bc}}}, + {X: Field{[10]uint32{0x02ddd3ac, 0x03662579, 0x006516db, 0x00ce8bc0, 0x037bf8f6, 0x0338b568, 0x012d90d6, 0x00b82561, 0x03e6732a, 0x0025bb94}}, Y: Field{[10]uint32{0x029b6fde, 0x0096cd9c, 0x01c06fbf, 0x025db19b, 0x02ef0d07, 0x03afc783, 0x004c9711, 0x00a7cb63, 0x02eae4b6, 0x000e6e72}}}, + {X: Field{[10]uint32{0x014f36b9, 0x00b26cb4, 0x03390cce, 0x02ed8ee7, 0x012598ca, 0x017d2a60, 0x01bf2f43, 0x03e50498, 0x01856cee, 0x001901de}}, Y: Field{[10]uint32{0x00b4b50a, 0x02c7ba79, 0x02eb2894, 0x01c12673, 0x008cda08, 0x02169edb, 0x010d75fd, 0x01bbebbe, 0x028f44e5, 0x00369864}}}, + {X: Field{[10]uint32{0x02a88c9c, 0x03fd692d, 0x01f069c1, 0x0198c527, 0x02a37b68, 0x01cb2a8a, 0x021d9ac9, 0x0244e62c, 0x0081e547, 0x001e1964}}, Y: Field{[10]uint32{0x01a7d19b, 0x0164d15d, 0x02a155e0, 0x026c0ead, 0x0112cf91, 0x017a0658, 0x028fa722, 0x0034ada7, 0x007792a3, 0x0016688c}}}, + {X: Field{[10]uint32{0x00d6b76f, 0x018f7e65, 0x015dbcef, 0x03eed320, 0x027fe5a9, 0x00277fab, 0x02f708bc, 0x019a7d14, 0x00e31c85, 0x00288dd4}}, Y: Field{[10]uint32{0x01cca8da, 0x024b3323, 0x008d141d, 0x0047f6e1, 0x03e7707c, 0x03504444, 0x032fa3e4, 0x0379b6b0, 0x0314a6e7, 0x003dcce6}}}, + {X: Field{[10]uint32{0x00c13079, 0x0336c4f4, 0x01688d4f, 0x00055374, 0x026f3e5a, 0x036bcc05, 0x01fea76e, 0x003aee02, 0x010b6e1f, 0x001794ad}}, Y: Field{[10]uint32{0x00e1296f, 0x00f1239c, 0x00e1cc10, 0x0344f58f, 0x004a3829, 0x01280fab, 0x02987853, 0x012c326d, 0x02e73a35, 0x000667b7}}}, + {X: Field{[10]uint32{0x00eee475, 0x03a7193f, 0x0382b12e, 0x00a103b5, 0x01ab6ac8, 0x00f2bfd0, 0x013c021f, 0x00de357b, 0x0007a3f2, 0x002efc6b}}, Y: Field{[10]uint32{0x03fe5067, 0x008a8021, 0x001d6846, 0x02250e2d, 0x0324eb9d, 0x01ac57f8, 0x0083cc83, 0x01839842, 0x00deead4, 0x002d2fee}}}, + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + }, + { + {X: Field{[10]uint32{0x03fac3a7, 0x01bb61b0, 0x03bc9c60, 0x0129651f, 0x000fddf8, 0x004f7e86, 0x03c73a44, 0x03c6458d, 0x01b803ec, 0x0001be76}}, Y: Field{[10]uint32{0x02842160, 0x0224180e, 0x01002d86, 0x00bd70a0, 0x007ea4dd, 0x03917135, 0x038e2a30, 0x0166e9a6, 0x028e6030, 0x001f2031}}}, + {X: Field{[10]uint32{0x037fd72d, 0x03489d12, 0x01a175c9, 0x03969f93, 0x01da1745, 0x01120a4e, 0x01c36c28, 0x01047073, 0x02ea252b, 0x002ba1bb}}, Y: Field{[10]uint32{0x02ee38bc, 0x0132de93, 0x03728233, 0x015451cb, 0x018d9211, 0x0227fc3a, 0x02b0ace5, 0x000be58a, 0x03c97073, 0x00067a64}}}, + {X: Field{[10]uint32{0x021ce204, 0x035d7a34, 0x023d524e, 0x0239099d, 0x03b2a725, 0x0329bdcb, 0x0374d859, 0x03193ee0, 0x01d162b3, 0x0010f290}}, Y: Field{[10]uint32{0x034a8f6b, 0x014113a4, 0x02468e52, 0x02ccfa92, 0x039ab6c7, 0x0236e8c7, 0x0250f921, 0x008fe871, 0x0282e370, 0x00373a96}}}, + {X: Field{[10]uint32{0x00169290, 0x011d099f, 0x032ee7a1, 0x01d73cdb, 0x008718be, 0x01b70b12, 0x01d2f8c5, 0x03fd5798, 0x01f90bbf, 0x00089232}}, Y: Field{[10]uint32{0x003ea257, 0x036284a2, 0x02be2369, 0x0008d768, 0x00e16375, 0x010d6e86, 0x006bb55b, 0x03bb5e94, 0x00692d21, 0x003e8165}}}, + {X: Field{[10]uint32{0x03e6efda, 0x033a4b3a, 0x0005964f, 0x03cfe1ca, 0x01922d4f, 0x0216941b, 0x026f7237, 0x00afd6d9, 0x02ef2289, 0x00270f81}}, Y: Field{[10]uint32{0x03aefc7d, 0x0103cca9, 0x03df7df1, 0x01a1ecdb, 0x01d43bc8, 0x03389bf5, 0x030b2d44, 0x0248f62b, 0x01e5e762, 0x0029edc2}}}, + {X: Field{[10]uint32{0x00978583, 0x0290c805, 0x0213f5b3, 0x02bbc185, 0x00cdd6e9, 0x003e4885, 0x03841999, 0x00c4dd25, 0x009b9cf2, 0x000c2afe}}, Y: Field{[10]uint32{0x01c75777, 0x00600d47, 0x004ac446, 0x0288eed6, 0x0063120e, 0x00386ae0, 0x037b4f2d, 0x01d26337, 0x0115477f, 0x0012c0d4}}}, + {X: Field{[10]uint32{0x02c88be2, 0x009ead71, 0x025e2791, 0x008341bb, 0x03ea2c78, 0x020c1dd6, 0x0372759d, 0x003c0cee, 0x02a313e2, 0x00175be2}}, Y: Field{[10]uint32{0x017ad75d, 0x03954fc3, 0x012c2892, 0x023a9afe, 0x00edab6f, 0x02c22f08, 0x01aaf33a, 0x0353a31c, 0x018d8d56, 0x002b712c}}}, + {X: Field{[10]uint32{0x010964e3, 0x036b12ed, 0x02f76fd0, 0x01df7471, 0x00a99f08, 0x02502174, 0x0011b48d, 0x01101d2b, 0x0216e05c, 0x0038469b}}, Y: Field{[10]uint32{0x0282bfc8, 0x03efe2c1, 0x00c6f767, 0x0384e0c6, 0x0017adc6, 0x01bc2bc9, 0x02d5e259, 0x0350c386, 0x025b87a2, 0x0021f581}}}, + {X: Field{[10]uint32{0x02d1b844, 0x024d46e4, 0x02484f28, 0x020b05cf, 0x01c69c03, 0x004e22f1, 0x02b15c3c, 0x00357f21, 0x01c304a6, 0x003d5f4d}}, Y: Field{[10]uint32{0x01266837, 0x02eaef58, 0x01c6a464, 0x0080c245, 0x00700697, 0x027918d3, 0x004d3f5a, 0x03d365e4, 0x019ea98e, 0x001c1fcf}}}, + {X: Field{[10]uint32{0x021f51d3, 0x01c591ec, 0x03df8739, 0x0118b0e7, 0x0011f80d, 0x036842ea, 0x00d419b9, 0x02a5573a, 0x03216726, 0x001a9cfe}}, Y: Field{[10]uint32{0x01224b17, 0x00937669, 0x03774018, 0x011a2d82, 0x022db482, 0x025c844c, 0x02a7d294, 0x03cf09ff, 0x02fca1ed, 0x0013cf3b}}}, + {X: Field{[10]uint32{0x00c7cb09, 0x03401fcf, 0x03435234, 0x01a28746, 0x023bc7eb, 0x00f61c51, 0x016e1fee, 0x025297d6, 0x007a3a65, 0x0004f9d8}}, Y: Field{[10]uint32{0x00079160, 0x01d6a282, 0x036411be, 0x02ed9ad5, 0x0165eae2, 0x02cd0a67, 0x025fdd85, 0x02e2c78c, 0x008de8fb, 0x000a1372}}}, + {X: Field{[10]uint32{0x00288015, 0x00df98fb, 0x019cc39a, 0x014fbb72, 0x024673f8, 0x0016daa9, 0x01fac61a, 0x0379bda0, 0x02aad936, 0x002a8053}}, Y: Field{[10]uint32{0x02c1006f, 0x00539991, 0x00ad9df8, 0x001d0f3b, 0x03ef4b9b, 0x03dec3d8, 0x032a7e43, 0x02fa6b0f, 0x03c04636, 0x000f7a44}}}, + {X: Field{[10]uint32{0x00cdee05, 0x00338496, 0x003b9006, 0x02c85cbb, 0x01a8761f, 0x02c1a407, 0x000250b1, 0x020b9890, 0x03225681, 0x000a6fa8}}, Y: Field{[10]uint32{0x022651c8, 0x0280d669, 0x018e39e4, 0x02db231a, 0x03f9fc31, 0x021c17b1, 0x0009b3fb, 0x02683aa4, 0x01a2690e, 0x001f1036}}}, + {X: Field{[10]uint32{0x011d45f9, 0x02155e3c, 0x026144cf, 0x0379b1e5, 0x02ba4c1c, 0x01f6de5b, 0x022ef2c7, 0x0144ad3a, 0x03d35337, 0x000dabb8}}, Y: Field{[10]uint32{0x00febad4, 0x02eacfdf, 0x036069d3, 0x0342b11c, 0x00004b35, 0x01f263d5, 0x00b95470, 0x018271e7, 0x0235cd69, 0x0032ab76}}}, + {X: Field{[10]uint32{0x02f18ada, 0x01b1d584, 0x01bcc11b, 0x024eef6f, 0x01d460bd, 0x00cf5296, 0x0036faff, 0x02239f67, 0x006d2382, 0x003d485e}}, Y: Field{[10]uint32{0x03953516, 0x01a2bf48, 0x030981dd, 0x028db16f, 0x02aa5ef4, 0x03347475, 0x0026102b, 0x036d5fb3, 0x03bf6038, 0x00381a1b}}}, + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + }, + { + {X: Field{[10]uint32{0x02d0e6bd, 0x01f839d0, 0x01e5313b, 0x018f6c3d, 0x03f774d1, 0x00135bb2, 0x022147c1, 0x0138960a, 0x0001243c, 0x000cc8b5}}, Y: Field{[10]uint32{0x0028b2a0, 0x00e8ba5b, 0x03af624f, 0x00fa8a1c, 0x032805f6, 0x0376be6d, 0x03019bc4, 0x013bd6fe, 0x0397e966, 0x0015b9c1}}}, + {X: Field{[10]uint32{0x00ade462, 0x025b4cb0, 0x00f29fc6, 0x0323ab6f, 0x010d4cdd, 0x01320335, 0x00ef31b0, 0x02f6b848, 0x000250ce, 0x00234988}}, Y: Field{[10]uint32{0x0326470c, 0x002a2e43, 0x00b3ad8e, 0x0139c99e, 0x021d4afb, 0x00fb8dae, 0x01f6f2dc, 0x03d0df4c, 0x03b4715b, 0x003afb4e}}}, + {X: Field{[10]uint32{0x019ab499, 0x0274fc81, 0x00330abd, 0x0271b9cf, 0x000b1329, 0x019fc06f, 0x02196b3c, 0x0016e974, 0x03f3015c, 0x001e2eab}}, Y: Field{[10]uint32{0x02e097fd, 0x0348c63f, 0x01199681, 0x03ba3449, 0x0291632e, 0x0360820b, 0x00a84e0e, 0x0302bebf, 0x00dbdb06, 0x002b52f7}}}, + {X: Field{[10]uint32{0x0116e633, 0x01190f85, 0x01c8b916, 0x00341cb6, 0x038ed493, 0x0165340e, 0x00068a1f, 0x02faa739, 0x00766eae, 0x00048e30}}, Y: Field{[10]uint32{0x037b7805, 0x036dca31, 0x0022805c, 0x00b731d0, 0x03094625, 0x0070f705, 0x00979e2d, 0x004d675b, 0x002dbb27, 0x0022a76c}}}, + {X: Field{[10]uint32{0x0106ace6, 0x00f85b3f, 0x020ca449, 0x00dbe0e8, 0x0223709b, 0x024a6ac6, 0x00b84984, 0x038f5308, 0x0211a14a, 0x001bdc3c}}, Y: Field{[10]uint32{0x0202d5de, 0x02fb4d2d, 0x005ee048, 0x019af96b, 0x00753295, 0x01ee67d4, 0x015d8f34, 0x01edcdbe, 0x02309402, 0x001e47a2}}}, + {X: Field{[10]uint32{0x01cd5379, 0x018ccc29, 0x03cadc30, 0x00e161c2, 0x032db794, 0x02a93488, 0x002481b8, 0x004e0a9e, 0x02d56bdd, 0x0005f01c}}, Y: Field{[10]uint32{0x0108cd25, 0x02b8146c, 0x02d0df7c, 0x01d8996e, 0x038959ac, 0x03c740d3, 0x03c1247a, 0x0281939d, 0x01f4283d, 0x0036406f}}}, + {X: Field{[10]uint32{0x00ee1b40, 0x03b8fb98, 0x02247dc8, 0x016dc7a5, 0x008ced48, 0x0040f335, 0x00949f19, 0x029057e0, 0x01b29d6a, 0x00385667}}, Y: Field{[10]uint32{0x038f93a6, 0x018997b5, 0x0199de1d, 0x01d2f0ca, 0x03a6363a, 0x028bf1f3, 0x02f894aa, 0x035283be, 0x02232a81, 0x001e4cd8}}}, + {X: Field{[10]uint32{0x008e7a66, 0x0005549e, 0x0021619b, 0x00a0ac3b, 0x01cddcd7, 0x029a846e, 0x032ea758, 0x0270579e, 0x030770cb, 0x0009c756}}, Y: Field{[10]uint32{0x003c9727, 0x035c9638, 0x0024e7a8, 0x038d422a, 0x03e2a065, 0x026b21df, 0x017d0994, 0x03d24791, 0x005834e7, 0x00174ea9}}}, + {X: Field{[10]uint32{0x01c00c3e, 0x037e8a12, 0x008e2f81, 0x000f2448, 0x01f00e8f, 0x03514616, 0x02562d33, 0x01a5590d, 0x00970440, 0x002ec2c1}}, Y: Field{[10]uint32{0x01955a35, 0x02a60b44, 0x0090a799, 0x013a4177, 0x02fe6704, 0x02ac6c14, 0x01d2fa17, 0x027d8d95, 0x005853af, 0x001019f9}}}, + {X: Field{[10]uint32{0x00a923b7, 0x03a1f62a, 0x01b30da1, 0x03bb6071, 0x02aef650, 0x020ce099, 0x00708ab6, 0x0269c150, 0x039b2199, 0x002b0ab2}}, Y: Field{[10]uint32{0x03cd20a6, 0x030492b5, 0x03a4fa2d, 0x02fc4b49, 0x0360b0d0, 0x004f67ac, 0x01afa0df, 0x01c93472, 0x028511c1, 0x001da110}}}, + {X: Field{[10]uint32{0x01dd32e6, 0x01d6e701, 0x01ee7e0e, 0x0146d4f9, 0x03c663b5, 0x01d697ef, 0x0249dbe0, 0x01e27a6d, 0x01554195, 0x00371690}}, Y: Field{[10]uint32{0x014a99b9, 0x01f6de9d, 0x01bcf80e, 0x0241db92, 0x002ff2ee, 0x006fd651, 0x00ea5e20, 0x019e9db7, 0x00a63f9f, 0x0012bcea}}}, + {X: Field{[10]uint32{0x022d8dae, 0x00f00632, 0x01ea9579, 0x03e47f49, 0x02ac32a5, 0x032c895b, 0x02b25ef9, 0x024be6e9, 0x00026211, 0x002209c7}}, Y: Field{[10]uint32{0x021e77d9, 0x009b03cf, 0x01099fb4, 0x01b71c5f, 0x00c30087, 0x016afd6b, 0x01c8b3ae, 0x01daa900, 0x01535071, 0x0035c677}}}, + {X: Field{[10]uint32{0x0144e7cb, 0x0116eb11, 0x020359ed, 0x0096d4a5, 0x01a10642, 0x004053a6, 0x03354a57, 0x00ee76f8, 0x01703987, 0x00055b86}}, Y: Field{[10]uint32{0x01250a37, 0x00e4b02b, 0x039cd6d5, 0x02357ad0, 0x009496d5, 0x00e0d2fa, 0x039572a6, 0x0241f6a4, 0x019f8f31, 0x001af023}}}, + {X: Field{[10]uint32{0x0089240f, 0x02eb7267, 0x03b858f5, 0x02ebe8b9, 0x0274f8c4, 0x01f8385d, 0x00ee0919, 0x01cce386, 0x010d652d, 0x00056e0e}}, Y: Field{[10]uint32{0x0326f04a, 0x03e7be38, 0x033352e2, 0x02ad7068, 0x01b30367, 0x01e967e6, 0x03dd7ccc, 0x023420ea, 0x020c8efe, 0x001e1b3c}}}, + {X: Field{[10]uint32{0x019853ca, 0x02f0a731, 0x03f54dbf, 0x01ae7c66, 0x0348e962, 0x0239c584, 0x00a76a22, 0x010e09af, 0x00cecb68, 0x00109a6f}}, Y: Field{[10]uint32{0x01b8d367, 0x0163bd4d, 0x028a3da9, 0x0297e796, 0x01fd3940, 0x010c6902, 0x0084ca9c, 0x005adc8f, 0x001a82c0, 0x003b4ac7}}}, + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + }, + { + {X: Field{[10]uint32{0x0134ab83, 0x035d34a0, 0x03397721, 0x026bdd90, 0x00741b3f, 0x0259961a, 0x011770d8, 0x02df68af, 0x007d2de0, 0x002159cb}}, Y: Field{[10]uint32{0x010313a6, 0x00c253de, 0x00f44c8e, 0x03f314a6, 0x01e77f17, 0x0298b0b9, 0x034049bf, 0x02cbad8d, 0x039b5b43, 0x001f1206}}}, + {X: Field{[10]uint32{0x0317fc25, 0x02e42f07, 0x02d96998, 0x011b7cb9, 0x033b89ea, 0x01722987, 0x00186121, 0x027b00db, 0x036b740f, 0x0014d333}}, Y: Field{[10]uint32{0x03e86e76, 0x031fdbb3, 0x028ddd71, 0x01deff74, 0x010ae3d2, 0x00b550d5, 0x02ae3dd3, 0x00b76d18, 0x00b09c8b, 0x00355c57}}}, + {X: Field{[10]uint32{0x03ba9000, 0x001c8ea0, 0x028b6fdf, 0x0271a097, 0x01c4872f, 0x0210050f, 0x00876075, 0x036305a1, 0x00f9fff1, 0x002b0e1d}}, Y: Field{[10]uint32{0x0310cf0a, 0x00f1f65b, 0x029fa4da, 0x0035fd9b, 0x03085e35, 0x01045fe4, 0x022dde89, 0x0301a6e1, 0x012308a1, 0x002a997a}}}, + {X: Field{[10]uint32{0x00bee8b6, 0x01c248fa, 0x008d2c71, 0x011fb3ef, 0x0179020d, 0x023e2abb, 0x01e14201, 0x02dfcc20, 0x035cee87, 0x002a4747}}, Y: Field{[10]uint32{0x010644c1, 0x0345aa90, 0x03225003, 0x027d8a32, 0x02f80056, 0x0376b4ec, 0x03189c8d, 0x023b8569, 0x024ee2df, 0x001d228c}}}, + {X: Field{[10]uint32{0x0106dbd4, 0x001bd9bb, 0x00d081a6, 0x0215e288, 0x01ec0e3f, 0x0268f9ca, 0x0114075e, 0x01c04e6b, 0x00e7aa68, 0x0015c357}}, Y: Field{[10]uint32{0x011ed495, 0x016fb3af, 0x00bed5a6, 0x01b71918, 0x03b683a3, 0x007406ee, 0x0366e671, 0x000bd816, 0x0349420e, 0x0029ab94}}}, + {X: Field{[10]uint32{0x03ba402e, 0x0358c2c5, 0x02989ae5, 0x0170b410, 0x03c3b81a, 0x021238f0, 0x03ead0c4, 0x0280a962, 0x035cd18f, 0x0023a246}}, Y: Field{[10]uint32{0x00fad9e0, 0x02d89e71, 0x027ee8e1, 0x0090855e, 0x02af650c, 0x013ca8c1, 0x038d0e40, 0x0319a02c, 0x020e6a9e, 0x003974c3}}}, + {X: Field{[10]uint32{0x012d230e, 0x0307e482, 0x03928434, 0x02834a4c, 0x01daee32, 0x000d9bbd, 0x03c229ee, 0x022edbe1, 0x00702826, 0x001d6d7e}}, Y: Field{[10]uint32{0x011570b8, 0x032f7ef5, 0x038fb037, 0x02c01447, 0x020267a4, 0x01377ea3, 0x01787455, 0x02148d8f, 0x0221e3a7, 0x00149f33}}}, + {X: Field{[10]uint32{0x0184cf74, 0x02870956, 0x01f10aa1, 0x0116fbd8, 0x000735ae, 0x00b50e0f, 0x02214dde, 0x0238d706, 0x0023d90c, 0x00305723}}, Y: Field{[10]uint32{0x01ccb000, 0x0123360e, 0x015a2c4a, 0x00b542c0, 0x0247bf77, 0x0097f5ee, 0x01c6f45e, 0x0088d723, 0x00d82852, 0x000aea55}}}, + {X: Field{[10]uint32{0x034fcc0e, 0x01afdab0, 0x0084c47b, 0x0290af8e, 0x00927f10, 0x01f49672, 0x025b80e2, 0x037b0ac2, 0x02fae1ed, 0x00113f23}}, Y: Field{[10]uint32{0x019c420a, 0x03c0c79c, 0x0089d9cf, 0x0292f341, 0x03720e94, 0x020cf4f5, 0x01267e78, 0x004d9f92, 0x0294ba9b, 0x0034b1f7}}}, + {X: Field{[10]uint32{0x0142dea9, 0x004fc3a2, 0x03130584, 0x0232e2df, 0x02ab35a9, 0x0182a1ff, 0x006ad8ba, 0x0176d9e5, 0x02133428, 0x000559a1}}, Y: Field{[10]uint32{0x027be3df, 0x0151bc0d, 0x02dcbf92, 0x01a22c8f, 0x02de4828, 0x02c83f48, 0x02894eff, 0x03c14413, 0x03aa0e82, 0x0013cd65}}}, + {X: Field{[10]uint32{0x03b69991, 0x01207f22, 0x03175d5a, 0x028b0cc1, 0x01fffb3f, 0x0380bd4d, 0x02a16620, 0x01ef1a19, 0x0247bace, 0x0037a8ae}}, Y: Field{[10]uint32{0x016fe2df, 0x01d0aa7c, 0x019bc706, 0x02cd887b, 0x03229dcd, 0x013dee79, 0x01cbfec8, 0x00a392b1, 0x03d6d90c, 0x002b8a2f}}}, + {X: Field{[10]uint32{0x036bcfe8, 0x03b58794, 0x03bb3e61, 0x027b5a6d, 0x020e0c17, 0x001acc66, 0x02ca8f23, 0x02666d1c, 0x00bc1cc6, 0x0004ccbe}}, Y: Field{[10]uint32{0x02e78402, 0x00374b36, 0x0021451b, 0x009356a3, 0x01ba93b4, 0x017701a0, 0x0367c453, 0x00bb5c4f, 0x03ee2960, 0x0030e771}}}, + {X: Field{[10]uint32{0x014fc9cc, 0x01034094, 0x021658c2, 0x02f0a691, 0x0226d00a, 0x012e2a0d, 0x001cf6cc, 0x01a35bbf, 0x0098a6e1, 0x000e5a3f}}, Y: Field{[10]uint32{0x03ad37dd, 0x00e52257, 0x03334019, 0x01dbfe23, 0x011a1465, 0x02ab4cb2, 0x037982d1, 0x0164a048, 0x03d0db4b, 0x001e272e}}}, + {X: Field{[10]uint32{0x00cc84bf, 0x00ebcf85, 0x01f27c02, 0x01b7bae8, 0x0380bf1d, 0x030a9254, 0x00e37159, 0x00205a0c, 0x01364e54, 0x002d775a}}, Y: Field{[10]uint32{0x0374750c, 0x01485f38, 0x01a90c78, 0x037b75ac, 0x01353110, 0x01635051, 0x0118733c, 0x032dadaf, 0x005853c7, 0x0012cdbb}}}, + {X: Field{[10]uint32{0x020c85f1, 0x0308646b, 0x03a250ae, 0x014d80e8, 0x01a6a52e, 0x015e5175, 0x0325df09, 0x01a8a49a, 0x010698e0, 0x001a25a4}}, Y: Field{[10]uint32{0x01c1de21, 0x01208ccb, 0x003922c7, 0x02768354, 0x011f40c1, 0x021175cb, 0x03305c1d, 0x025e495b, 0x03b4b38c, 0x002bbf4f}}}, + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + }, + { + {X: Field{[10]uint32{0x00c82a0a, 0x02566bd8, 0x00832ffd, 0x03183d9a, 0x010f9226, 0x006504ec, 0x006c9f19, 0x022291ac, 0x03809b19, 0x0002522f}}, Y: Field{[10]uint32{0x00c8e589, 0x02dfe236, 0x012bed4c, 0x002325f3, 0x006d4dff, 0x0070d063, 0x02b74c5d, 0x01991b71, 0x02856dcb, 0x0014e958}}}, + {X: Field{[10]uint32{0x028b000a, 0x03ac115f, 0x01e51396, 0x00cc7a09, 0x02ef16c1, 0x00a47c2d, 0x01ce4c66, 0x0164d835, 0x007f372e, 0x0009a54b}}, Y: Field{[10]uint32{0x01ef705a, 0x035007c1, 0x027318c3, 0x023d94f5, 0x02debe39, 0x035a2108, 0x03c893d2, 0x029a218a, 0x024c5800, 0x003d44fa}}}, + {X: Field{[10]uint32{0x00c8ac7f, 0x00bf97ee, 0x02a52728, 0x03b9978a, 0x01641242, 0x0015be12, 0x003396d2, 0x00aef2d7, 0x02fbe382, 0x0026516c}}, Y: Field{[10]uint32{0x01aea3b0, 0x0250e85a, 0x00dfa96d, 0x008fbb6b, 0x01282f7a, 0x02ca3bfd, 0x03db44ff, 0x00a0b581, 0x01824b0f, 0x000fbbfb}}}, + {X: Field{[10]uint32{0x02134f96, 0x0096225d, 0x030e9f10, 0x0195cb5a, 0x03f52119, 0x00c7fc90, 0x032be8b1, 0x0316f6fb, 0x00e6fc23, 0x00318b96}}, Y: Field{[10]uint32{0x014cf97e, 0x01dfb534, 0x01c3e822, 0x00d58dcc, 0x01bcfb85, 0x00c507f1, 0x03d67675, 0x02859e30, 0x027d45b1, 0x0010e5e0}}}, + {X: Field{[10]uint32{0x029e353a, 0x035e78e5, 0x021f6ed1, 0x00214aef, 0x0210a044, 0x0041f57f, 0x01f82227, 0x01c3988d, 0x006b2058, 0x000a8c53}}, Y: Field{[10]uint32{0x01746067, 0x0249b879, 0x018bfc25, 0x02ab6c99, 0x00138a54, 0x02ea86e8, 0x0063e476, 0x009eb069, 0x000bf35a, 0x0005692b}}}, + {X: Field{[10]uint32{0x02fccf64, 0x02926624, 0x0318e3ba, 0x03789604, 0x033bd278, 0x01f2576f, 0x028772c7, 0x018df6c1, 0x015c0eb4, 0x00031f44}}, Y: Field{[10]uint32{0x0078fee0, 0x01b4ecca, 0x0268d53f, 0x020e566b, 0x0148785d, 0x01e2bc51, 0x02424b84, 0x02c111ea, 0x007b1925, 0x0012aa1d}}}, + {X: Field{[10]uint32{0x01b84966, 0x00bd27ba, 0x03ff989e, 0x001b75fc, 0x011b4f41, 0x029adb24, 0x00b6faf3, 0x03f0b526, 0x0100b703, 0x00165669}}, Y: Field{[10]uint32{0x03473a6a, 0x0198c861, 0x0242640a, 0x030233f8, 0x009100dc, 0x03720a9c, 0x00312820, 0x02a25fe5, 0x02741f5c, 0x0000dc39}}}, + {X: Field{[10]uint32{0x03188cbb, 0x01be2002, 0x01e97368, 0x0080201f, 0x00b81c03, 0x005988ac, 0x003329a7, 0x0171d05a, 0x00520eec, 0x00041d18}}, Y: Field{[10]uint32{0x03272124, 0x01ed8d87, 0x03da601d, 0x01d23738, 0x01242e0d, 0x033d5284, 0x0326b9b9, 0x016630d4, 0x00c09a21, 0x002af975}}}, + {X: Field{[10]uint32{0x03c6b173, 0x0326e48a, 0x03feb3b0, 0x00f1fbb4, 0x017dd862, 0x0016d7e7, 0x0160c463, 0x00bfa384, 0x01393722, 0x0027bacc}}, Y: Field{[10]uint32{0x0323a71d, 0x02588365, 0x00c4b953, 0x02fb439c, 0x030ea71a, 0x02ee86b8, 0x02aabfdb, 0x03563654, 0x01e0110e, 0x0038487c}}}, + {X: Field{[10]uint32{0x02d2cf25, 0x03a6f24a, 0x03a94457, 0x0136f249, 0x037ba49b, 0x009ecf0b, 0x011e80ba, 0x02a72c63, 0x029bf3da, 0x00148366}}, Y: Field{[10]uint32{0x0285181f, 0x02db20e8, 0x030c7610, 0x019446fd, 0x022bab0b, 0x012ea5c1, 0x030ae71b, 0x007ab923, 0x009b1027, 0x003949bd}}}, + {X: Field{[10]uint32{0x02c805f3, 0x00910fdf, 0x01591577, 0x01d42766, 0x007de40f, 0x001ba5e2, 0x02bb2388, 0x0063d45b, 0x03e4c7f7, 0x000e7313}}, Y: Field{[10]uint32{0x023c48d3, 0x0068304e, 0x012e4d19, 0x00dcff24, 0x01bbb957, 0x03d0b79f, 0x01e6693c, 0x03e3cc54, 0x032c5a46, 0x003b2c51}}}, + {X: Field{[10]uint32{0x008d5622, 0x02baeb15, 0x03d2e8b5, 0x03bde946, 0x03e1db07, 0x02fcce06, 0x01586a81, 0x0254d68e, 0x011e6168, 0x0017f1b0}}, Y: Field{[10]uint32{0x01ac1683, 0x03610040, 0x03f300d0, 0x00239b1e, 0x030e05ad, 0x000d9eb2, 0x019ba2db, 0x03676e70, 0x02549aa1, 0x00043a03}}}, + {X: Field{[10]uint32{0x0222580e, 0x018bed73, 0x0388793d, 0x025b4b5b, 0x02c71328, 0x0136f534, 0x012ffde6, 0x0371a5a2, 0x007466ec, 0x003e5320}}, Y: Field{[10]uint32{0x0127db82, 0x0148fd9c, 0x01d4e81e, 0x0114c8dc, 0x029887ec, 0x02d6a07d, 0x014bff6a, 0x00896a46, 0x03dc6785, 0x0017a71f}}}, + {X: Field{[10]uint32{0x00a3d8a5, 0x02ad81f0, 0x02f99123, 0x01a115cf, 0x0126d77d, 0x00fb426b, 0x031274a3, 0x035ba4d0, 0x03e5d872, 0x0016a90c}}, Y: Field{[10]uint32{0x013c2ba7, 0x03dfbddb, 0x02ef4fb5, 0x03d4b675, 0x0116475c, 0x01ca2958, 0x02394aec, 0x039e6866, 0x01fc682a, 0x003773a8}}}, + {X: Field{[10]uint32{0x00c4f21f, 0x0102eb44, 0x01a7a6be, 0x0165340f, 0x025024a9, 0x02c66674, 0x0002068d, 0x03458bf3, 0x006c6ad5, 0x0023332e}}, Y: Field{[10]uint32{0x029dfea0, 0x0049ba9c, 0x03e28f7f, 0x02b20992, 0x014b92dc, 0x0321d629, 0x01bef549, 0x00710da6, 0x02586275, 0x0015fe25}}}, + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + }, + { + {X: Field{[10]uint32{0x038fd8e8, 0x0336067c, 0x0352acce, 0x0137f1a5, 0x00f1b0e4, 0x000a1cea, 0x0067ce0f, 0x00070d3c, 0x027f4618, 0x00189833}}, Y: Field{[10]uint32{0x02b4ae17, 0x0213a56c, 0x00198c1a, 0x008e0147, 0x03ecd292, 0x01da87bd, 0x03090497, 0x02d5c69f, 0x002b6fa5, 0x002f0b6a}}}, + {X: Field{[10]uint32{0x01477c2d, 0x019d1bcf, 0x0127e076, 0x01465aab, 0x0316e65c, 0x0213c684, 0x008409be, 0x0069cf7b, 0x024748ad, 0x00217636}}, Y: Field{[10]uint32{0x03d1dd70, 0x02605bf1, 0x015a6207, 0x0080cf13, 0x0094b0a0, 0x007bf1ef, 0x02b53653, 0x019a4161, 0x0353665c, 0x00162522}}}, + {X: Field{[10]uint32{0x01136602, 0x02e91950, 0x03a5bbb0, 0x01203678, 0x0138c46f, 0x008ccecf, 0x0058937f, 0x037f0cf4, 0x03280482, 0x0021f449}}, Y: Field{[10]uint32{0x00af6aac, 0x020f1076, 0x03f7c4f6, 0x01d1bf4e, 0x0387a884, 0x03d9dd14, 0x02a276cf, 0x000f7a49, 0x00870a5a, 0x001c7389}}}, + {X: Field{[10]uint32{0x000b80d9, 0x000c4b5b, 0x007f0485, 0x00403f71, 0x024d1e7e, 0x030fb8fb, 0x00892e9c, 0x012e5a30, 0x0166e7ec, 0x00238a9c}}, Y: Field{[10]uint32{0x02b29f50, 0x0187cab5, 0x0349a49c, 0x02235c18, 0x005297b6, 0x005aa752, 0x02dd29b7, 0x02f964b3, 0x03a9ae2c, 0x003ab6c2}}}, + {X: Field{[10]uint32{0x00c5a916, 0x00175cd2, 0x010f25b2, 0x00354d58, 0x013f5c44, 0x02ad52a8, 0x00acc63d, 0x03a5d1ac, 0x013fe261, 0x003f575f}}, Y: Field{[10]uint32{0x02db8bda, 0x02cdec1e, 0x02faab14, 0x0052f73d, 0x03e5d738, 0x0271ed4b, 0x0343ca67, 0x016c1f4a, 0x02d0eeb5, 0x0003760f}}}, + {X: Field{[10]uint32{0x00e74459, 0x028d722c, 0x036dd674, 0x018e1f76, 0x01fef237, 0x004f22a4, 0x00f46587, 0x015a0164, 0x001d4ec0, 0x000a37de}}, Y: Field{[10]uint32{0x035e656f, 0x001f303b, 0x02f0a8de, 0x029406b9, 0x00a3795b, 0x003c89e5, 0x00db1789, 0x003c5f2c, 0x02a66a13, 0x003c5267}}}, + {X: Field{[10]uint32{0x01f7529c, 0x0264258d, 0x011dd45d, 0x0262d6f5, 0x0138765b, 0x034d10e0, 0x02453c32, 0x009848ae, 0x0010981c, 0x00378375}}, Y: Field{[10]uint32{0x00cd88fe, 0x008300b9, 0x0374063c, 0x031a226d, 0x00178924, 0x035e8d5c, 0x02109822, 0x00517e6c, 0x029d10a2, 0x0035c29b}}}, + {X: Field{[10]uint32{0x004561be, 0x007e8f4b, 0x0190f992, 0x03a04d67, 0x00ee4ab2, 0x01e3e254, 0x00366ecd, 0x03d63b72, 0x035842bf, 0x001da6f1}}, Y: Field{[10]uint32{0x00d9685f, 0x0082ffec, 0x033add59, 0x01d9ede1, 0x0341a177, 0x01cfd751, 0x01ce4cef, 0x020eeb23, 0x03362fe7, 0x0012fe05}}}, + {X: Field{[10]uint32{0x00f76d11, 0x00bd234e, 0x015573c8, 0x003efe14, 0x02151100, 0x0270a4a8, 0x005befc3, 0x03d139a7, 0x008ada4c, 0x002c9b08}}, Y: Field{[10]uint32{0x03b7356b, 0x03002c78, 0x0224bdc1, 0x01967609, 0x03050030, 0x0033590c, 0x004e87d9, 0x034cf3c3, 0x00820949, 0x0007c73e}}}, + {X: Field{[10]uint32{0x008e129e, 0x00e76825, 0x01b10312, 0x02cb00a2, 0x032bd1df, 0x0394f0b7, 0x00f8de28, 0x0133debc, 0x00efb7b2, 0x0019b8ff}}, Y: Field{[10]uint32{0x02e7bbea, 0x02f0d80b, 0x03b5172b, 0x027b4694, 0x035fd7d9, 0x0337e032, 0x00b5bf34, 0x0303d966, 0x034fb770, 0x00082fe2}}}, + {X: Field{[10]uint32{0x029e22db, 0x038ec199, 0x00933f94, 0x03d67e72, 0x02ac993f, 0x00630a53, 0x023bd290, 0x03d48e9f, 0x00b8fc7f, 0x003f3ac5}}, Y: Field{[10]uint32{0x002260a1, 0x01cb6c97, 0x03e4cbf5, 0x01e4e93a, 0x00ad550e, 0x0097c249, 0x018a5a75, 0x02e347f3, 0x033a40d6, 0x00192a9a}}}, + {X: Field{[10]uint32{0x01c71143, 0x0367714a, 0x017ea346, 0x02b113c1, 0x012e7ead, 0x0008fe8d, 0x027ccf90, 0x03a840f2, 0x039622bb, 0x0003ad17}}, Y: Field{[10]uint32{0x0370b136, 0x02336882, 0x01bf4c8a, 0x03a9a8ac, 0x03d65969, 0x00078a15, 0x03601f59, 0x02f43d5c, 0x03585838, 0x0014b10b}}}, + {X: Field{[10]uint32{0x038a2755, 0x02105e68, 0x005506f0, 0x01c59527, 0x0253721a, 0x02d41fea, 0x00175774, 0x0172b157, 0x02623ccd, 0x0013a426}}, Y: Field{[10]uint32{0x03cca3de, 0x02927d88, 0x0000caf7, 0x025348a6, 0x03b6cd53, 0x001d5676, 0x03246dd5, 0x00d6bb3b, 0x02878cce, 0x002b95b6}}}, + {X: Field{[10]uint32{0x0007d7c8, 0x0345234f, 0x0232f00c, 0x01d7e0a7, 0x01e0f196, 0x03cf5226, 0x0070411b, 0x02dcf5a1, 0x008ab230, 0x000f3e48}}, Y: Field{[10]uint32{0x024cee08, 0x02a476b6, 0x0059c0c4, 0x032356e3, 0x009d4684, 0x017059c8, 0x02ce6ca6, 0x02197547, 0x024c15af, 0x003780f1}}}, + {X: Field{[10]uint32{0x003ba64d, 0x01625666, 0x015a3a82, 0x01de2316, 0x02bde60f, 0x02e39038, 0x030a145e, 0x01300efe, 0x015c22e0, 0x0030d9d1}}, Y: Field{[10]uint32{0x022181fd, 0x03323e5a, 0x00f14614, 0x02b285de, 0x0342626a, 0x01365931, 0x00e0e6e8, 0x0180cc20, 0x02d069cb, 0x000e9482}}}, + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + }, + { + {X: Field{[10]uint32{0x0037fa2d, 0x00f32348, 0x01c43295, 0x03d5d6ff, 0x03043ec8, 0x02efd040, 0x00348414, 0x036350f6, 0x01e0afc1, 0x003940df}}, Y: Field{[10]uint32{0x01755bda, 0x01772107, 0x01f10e0e, 0x000fb120, 0x01bd5f5b, 0x02e642f7, 0x0398d09f, 0x034ed7e7, 0x034baa94, 0x00115c54}}}, + {X: Field{[10]uint32{0x023d34ef, 0x00f231e7, 0x02ddb8c6, 0x01f1e4a8, 0x02c3ab21, 0x00b586cf, 0x00b6cf7d, 0x015253d0, 0x01a467fd, 0x00297803}}, Y: Field{[10]uint32{0x037adb4c, 0x0171738b, 0x000acb85, 0x03f9e424, 0x025b60dc, 0x026fd0f4, 0x01726fe9, 0x02155508, 0x01f5e560, 0x000263f9}}}, + {X: Field{[10]uint32{0x037e7775, 0x02a29b85, 0x015f6388, 0x024e23b6, 0x02b5e155, 0x03d4a46b, 0x00543bac, 0x00cf3b96, 0x023aff96, 0x0027625a}}, Y: Field{[10]uint32{0x02056691, 0x03db4eae, 0x0253befc, 0x01fb8a64, 0x01e899cd, 0x0094249f, 0x02964ed7, 0x02fc2e53, 0x01e43f49, 0x0037646a}}}, + {X: Field{[10]uint32{0x03b91252, 0x00dc5835, 0x0172ae67, 0x00b911dd, 0x006d4afd, 0x0326fef1, 0x019f4bb1, 0x00ad00d4, 0x01f5ef3a, 0x002a6505}}, Y: Field{[10]uint32{0x03edc264, 0x00ddeb12, 0x00ddd73a, 0x02b5643d, 0x02899a16, 0x013dbdad, 0x022f10f2, 0x03e12ee7, 0x024cae81, 0x0020b439}}}, + {X: Field{[10]uint32{0x002a3293, 0x0381378f, 0x0076c5fd, 0x01bba40d, 0x015688b8, 0x00a0bd33, 0x02b0a573, 0x00de4b43, 0x00ee7116, 0x0020c9ee}}, Y: Field{[10]uint32{0x020df9bd, 0x02153863, 0x02a416bc, 0x02d3b8c9, 0x0096afda, 0x009e5c21, 0x03b3ea66, 0x02a63862, 0x02266ee0, 0x0001265f}}}, + {X: Field{[10]uint32{0x00904ed3, 0x015fc7a3, 0x01784159, 0x01624161, 0x00df2a74, 0x0049c8e1, 0x03f8e643, 0x00637fe5, 0x002d2db8, 0x000033e3}}, Y: Field{[10]uint32{0x016f77c1, 0x02658ede, 0x02827b00, 0x01e74cbd, 0x0122991d, 0x0146f604, 0x01d5c1bd, 0x03510467, 0x000ea781, 0x002aab40}}}, + {X: Field{[10]uint32{0x0162c042, 0x006c9b11, 0x03b1a242, 0x008d2e37, 0x02092d23, 0x03e6a3b5, 0x016661d8, 0x02c5a25f, 0x02aa2a6d, 0x0016b90a}}, Y: Field{[10]uint32{0x0379269c, 0x017337e3, 0x018dbf90, 0x025441f3, 0x0294e0db, 0x000e2752, 0x01c1ddc6, 0x00147aad, 0x027c05ff, 0x0026764e}}}, + {X: Field{[10]uint32{0x02540f17, 0x01196d9a, 0x0132bd8c, 0x01c17c30, 0x004c750d, 0x023e4d7e, 0x00edde09, 0x0347f1f6, 0x029f9e4f, 0x002d5bd3}}, Y: Field{[10]uint32{0x0200102d, 0x00bf2b80, 0x0285446a, 0x018f2f32, 0x0121d429, 0x00160b47, 0x01c11adf, 0x02a15b4f, 0x013429cc, 0x000cba39}}}, + {X: Field{[10]uint32{0x0285af61, 0x02204a17, 0x02766b34, 0x008b752b, 0x034e8ed7, 0x01b086c3, 0x02eb68ff, 0x0323ad66, 0x02e426a1, 0x0024b08e}}, Y: Field{[10]uint32{0x036a2b09, 0x008d9a70, 0x02fed4e7, 0x020ad8a1, 0x012d23ad, 0x01ce355e, 0x03217d5c, 0x006ed027, 0x008f0155, 0x0010533e}}}, + {X: Field{[10]uint32{0x01e5d1b3, 0x02a92096, 0x02a3e280, 0x0227f5b2, 0x0048c9b7, 0x003f36cc, 0x027e4c6f, 0x0120ef47, 0x0151caf6, 0x000eae94}}, Y: Field{[10]uint32{0x02f30087, 0x02d9e350, 0x02ee6a85, 0x01674b79, 0x01e18463, 0x01f5cb32, 0x024ec804, 0x01474241, 0x0223bff2, 0x0023079c}}}, + {X: Field{[10]uint32{0x03b5eba8, 0x02bc6cb1, 0x02a36ce2, 0x031fe463, 0x022dabed, 0x02be37d0, 0x010f4176, 0x037c4223, 0x008c76af, 0x003fb958}}, Y: Field{[10]uint32{0x010b9b5c, 0x00574da3, 0x014793f5, 0x010afe41, 0x02e380ff, 0x00a1f053, 0x01402f99, 0x0162bec4, 0x019134fe, 0x000e01d6}}}, + {X: Field{[10]uint32{0x00f8cffd, 0x02d66223, 0x01ae61b2, 0x0056de91, 0x01432e6b, 0x01e6f762, 0x01afb88f, 0x02306f51, 0x037f1fe7, 0x00002026}}, Y: Field{[10]uint32{0x01b5f32f, 0x03516863, 0x01f93d91, 0x03eb64ae, 0x0112a340, 0x0394bf72, 0x008c836d, 0x02a18c0a, 0x0022bf41, 0x003e05f8}}}, + {X: Field{[10]uint32{0x0063caf4, 0x00ee92cf, 0x03d5281e, 0x02aca3d4, 0x00a28ff3, 0x018a9abf, 0x02113b4c, 0x019f9882, 0x00eb92e6, 0x0010b951}}, Y: Field{[10]uint32{0x029c29c8, 0x02bb0265, 0x005f1187, 0x01edafbf, 0x0073a50e, 0x01d0579e, 0x01f220c1, 0x0319c7dc, 0x00e0f91c, 0x0027fe15}}}, + {X: Field{[10]uint32{0x03ed9ef9, 0x006417bd, 0x0063d6c6, 0x02803bc3, 0x02ad2ba5, 0x01ff064a, 0x01f78494, 0x03529d07, 0x02ddd352, 0x000cb779}}, Y: Field{[10]uint32{0x031fb871, 0x02e11a00, 0x034b21ab, 0x00de7263, 0x0059ec1b, 0x0356307d, 0x036a4f94, 0x019ef388, 0x03dc3420, 0x0010745e}}}, + {X: Field{[10]uint32{0x020f09a1, 0x00af6617, 0x0328380a, 0x03c6e500, 0x02f0a109, 0x011c03bf, 0x0196ed2a, 0x00b38e0e, 0x03b66553, 0x001ebb60}}, Y: Field{[10]uint32{0x01857d73, 0x036337a1, 0x00a54045, 0x00c03cfd, 0x02d88b2f, 0x0040cb63, 0x01afd0ab, 0x03bdf1f7, 0x005f9a31, 0x003d6e15}}}, + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + }, + { + {X: Field{[10]uint32{0x00fce725, 0x019a82b9, 0x005b7258, 0x03471a9b, 0x00e7e8db, 0x03c5dc6d, 0x02a905e8, 0x001eb7d7, 0x02b0f4a2, 0x003818dc}}, Y: Field{[10]uint32{0x02ee31dd, 0x000d3e53, 0x00870b27, 0x01de1c41, 0x00d7484a, 0x03569223, 0x0227bb2a, 0x0233f84a, 0x0174bce1, 0x001ea422}}}, + {X: Field{[10]uint32{0x02d2ff3e, 0x026bb90f, 0x02d3cfe0, 0x036d3b1b, 0x00045ebf, 0x03eb4fcf, 0x00dbd304, 0x01ae3e72, 0x034ca204, 0x0003ab04}}, Y: Field{[10]uint32{0x01210988, 0x0081881f, 0x01376e17, 0x025adfc8, 0x01ac19f6, 0x00ac45e6, 0x03f103bf, 0x026d0916, 0x01be7935, 0x001258c3}}}, + {X: Field{[10]uint32{0x02328d6a, 0x02a06236, 0x0018bdba, 0x00ea56b7, 0x03b24d77, 0x016c23e9, 0x00689918, 0x0138028d, 0x005ba623, 0x003198f0}}, Y: Field{[10]uint32{0x02c9b8c0, 0x002edaaf, 0x039cc23b, 0x03a944af, 0x03dd8551, 0x01d5c4c5, 0x01afdcf2, 0x0070e34e, 0x018d5f72, 0x000ccc7a}}}, + {X: Field{[10]uint32{0x03bfa4dc, 0x01c1b937, 0x01b17476, 0x01e01321, 0x03f5948a, 0x02b6ed07, 0x012119d7, 0x03a8660e, 0x0190731f, 0x00359e21}}, Y: Field{[10]uint32{0x013b5406, 0x02f35aef, 0x0207cca7, 0x03137726, 0x026206f1, 0x008704ea, 0x00ef5c6d, 0x018f1250, 0x00c89d50, 0x000a3aaa}}}, + {X: Field{[10]uint32{0x0196de2f, 0x0072120e, 0x01114bc9, 0x00bb82c9, 0x0177cedf, 0x0283f93a, 0x02b30dee, 0x01a91673, 0x0282dfb8, 0x0034ff09}}, Y: Field{[10]uint32{0x00526f8c, 0x02489075, 0x03f168c4, 0x02637dea, 0x024e59b4, 0x013de076, 0x00b4754d, 0x002863da, 0x0399a45f, 0x00313c37}}}, + {X: Field{[10]uint32{0x02143fb0, 0x00d69958, 0x005dd6dc, 0x020c2f08, 0x03a9fb92, 0x011e6565, 0x03aff339, 0x020de433, 0x001c33af, 0x000a4ab7}}, Y: Field{[10]uint32{0x036ad01c, 0x036d8f38, 0x01d4d8a9, 0x00b5cd7a, 0x02d83e66, 0x03313b3d, 0x031968a0, 0x02d91fcf, 0x021bcee0, 0x00281c99}}}, + {X: Field{[10]uint32{0x03e697ea, 0x03123440, 0x003e85c6, 0x03ee617e, 0x019ce678, 0x028feaf4, 0x00a1fec9, 0x03008df7, 0x0343feb2, 0x00305e92}}, Y: Field{[10]uint32{0x02dc6c87, 0x00ee1f77, 0x002ab0ee, 0x02d5fe7c, 0x0296e1a1, 0x025807eb, 0x02178f71, 0x0165532b, 0x002d55ab, 0x000e4d57}}}, + {X: Field{[10]uint32{0x008ff9b3, 0x017ed039, 0x0301a727, 0x00815666, 0x03c7b1a6, 0x00adc752, 0x03f210f1, 0x01025d2a, 0x00cbd9a0, 0x001a4c3f}}, Y: Field{[10]uint32{0x02e96a4e, 0x036ad7e3, 0x0051acfd, 0x004f92b3, 0x00090f9b, 0x01d7db5e, 0x030fcdb8, 0x0007ab68, 0x0294b947, 0x001fc0ab}}}, + {X: Field{[10]uint32{0x0163da1b, 0x00b0c08c, 0x0231182d, 0x03983e4e, 0x029a0ede, 0x03f047f7, 0x009349d7, 0x0242d1a3, 0x037ca267, 0x0023d862}}, Y: Field{[10]uint32{0x03bdd76e, 0x00c48440, 0x036e7c7f, 0x01a8c926, 0x026450c6, 0x01eb1690, 0x03bda74d, 0x03adbad7, 0x0325f08b, 0x001e08cf}}}, + {X: Field{[10]uint32{0x010cec10, 0x02c26d53, 0x016b084f, 0x03f2ab7b, 0x02ba25f0, 0x00b4f39c, 0x02b0e61b, 0x0079a6ba, 0x029ca332, 0x0013654a}}, Y: Field{[10]uint32{0x03d06932, 0x00dac4ee, 0x014da8ee, 0x037f213d, 0x02ba4aa2, 0x01ed72d3, 0x002aec78, 0x009e7915, 0x004a66dd, 0x002c5e06}}}, + {X: Field{[10]uint32{0x02c8ae90, 0x01643f83, 0x005deee8, 0x024ba2ef, 0x00cfb26b, 0x0320fc6e, 0x02d5b8da, 0x0079bae1, 0x00f15b7a, 0x0025e630}}, Y: Field{[10]uint32{0x012844d3, 0x02b0bab9, 0x008e27a9, 0x016f40c6, 0x02e2e496, 0x03e71cef, 0x02ec9494, 0x00bb4f74, 0x02aa75a4, 0x002e9038}}}, + {X: Field{[10]uint32{0x00b90e0b, 0x03079b0c, 0x00a4589e, 0x00e7ec25, 0x03d6ff1d, 0x02719d6c, 0x01c804a5, 0x019f4ffb, 0x03f9ad54, 0x00290d41}}, Y: Field{[10]uint32{0x021fdc20, 0x0002e64e, 0x01b5a3f0, 0x00d94d66, 0x00dc2a20, 0x0102fa30, 0x02d07ccb, 0x035c6850, 0x01c94c3f, 0x001f23cb}}}, + {X: Field{[10]uint32{0x01d66b7f, 0x0065e3c4, 0x01c8105a, 0x0141461f, 0x017aa692, 0x0224a11d, 0x00f1b90b, 0x00b59d1f, 0x02e3fb5a, 0x003f7e9b}}, Y: Field{[10]uint32{0x00e5178b, 0x023e019e, 0x00de9daa, 0x03744f5e, 0x00d846f9, 0x00f68631, 0x000c1c9a, 0x02636e4f, 0x031e2249, 0x0013673c}}}, + {X: Field{[10]uint32{0x01c0d7ad, 0x01ad6196, 0x0093ab83, 0x036de8ad, 0x011ddb64, 0x01d2799c, 0x0211ca1a, 0x03eeebbf, 0x02cd4b7b, 0x001cac13}}, Y: Field{[10]uint32{0x0323cd97, 0x039bfd19, 0x034fb2ef, 0x01a0771b, 0x0196265d, 0x0364d340, 0x01d452d6, 0x028d633b, 0x03ea0e64, 0x001a196c}}}, + {X: Field{[10]uint32{0x0265bcf0, 0x01d5e124, 0x03d30b80, 0x01e10471, 0x0269ce2b, 0x0073c883, 0x01ea9a46, 0x02790eb7, 0x0238de22, 0x003f5633}}, Y: Field{[10]uint32{0x03996292, 0x039ea73a, 0x00d1df33, 0x03f8a3c7, 0x0387261b, 0x0121793e, 0x0382ab9a, 0x00856f54, 0x01e53763, 0x003ff829}}}, + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + }, + { + {X: Field{[10]uint32{0x00559754, 0x035a4234, 0x0358540a, 0x03778a8f, 0x0204b10b, 0x03033808, 0x010bbf9d, 0x03514d63, 0x02715cd5, 0x00084f1e}}, Y: Field{[10]uint32{0x00b458f2, 0x00b09d4d, 0x03eeddff, 0x03d7cda9, 0x00bb4850, 0x0116e864, 0x013ad062, 0x018941c0, 0x010b5ae4, 0x0012db6b}}}, + {X: Field{[10]uint32{0x02c87fac, 0x00e25783, 0x03cf0899, 0x01d188b9, 0x020d1ab9, 0x00c8d203, 0x02e9fed8, 0x0269fd9a, 0x008132b4, 0x00071795}}, Y: Field{[10]uint32{0x03c2d4ef, 0x035ecf57, 0x0324c555, 0x03ac9bf8, 0x03a3deac, 0x03530ab4, 0x03959fa1, 0x011a3cae, 0x020f837f, 0x0013ff3d}}}, + {X: Field{[10]uint32{0x0205dccc, 0x03600467, 0x0293e532, 0x03b53066, 0x02ae3fa3, 0x0254f45c, 0x006e096b, 0x0280c255, 0x02e1753d, 0x002e33bd}}, Y: Field{[10]uint32{0x006d5750, 0x012833f3, 0x02813301, 0x030da9ad, 0x01df757f, 0x0134af66, 0x00d4a74e, 0x026efda9, 0x0260a6cc, 0x000c0ae2}}}, + {X: Field{[10]uint32{0x00531dbc, 0x03f2e875, 0x00970e20, 0x0067fb57, 0x021f901c, 0x002ef1f3, 0x036e9421, 0x019a377b, 0x010602c5, 0x001189db}}, Y: Field{[10]uint32{0x0286b8e2, 0x01cc0265, 0x03c99af8, 0x03efff86, 0x01498bad, 0x01c37b66, 0x02922875, 0x01d6e128, 0x0324d44c, 0x000383df}}}, + {X: Field{[10]uint32{0x033bb31a, 0x037fb84d, 0x017b485b, 0x01ad7f6e, 0x01701f7b, 0x03aed7d2, 0x02a0bde2, 0x01ce1780, 0x03e779b4, 0x0000fecc}}, Y: Field{[10]uint32{0x01215c9e, 0x032f9a5f, 0x000d4e34, 0x01db11d9, 0x03c65a7c, 0x02eed5ca, 0x00c161aa, 0x03f8a078, 0x0152548e, 0x003cdab6}}}, + {X: Field{[10]uint32{0x006df50d, 0x03bb405a, 0x012bd0c4, 0x00a871be, 0x00cd5e79, 0x03020818, 0x03d87442, 0x007c0b5b, 0x0230935c, 0x000e95c5}}, Y: Field{[10]uint32{0x0059679b, 0x0162ca3a, 0x01a11d21, 0x007aede0, 0x01e0aaf8, 0x015c2837, 0x02f3ff2e, 0x03ccbd45, 0x0073b599, 0x0021784e}}}, + {X: Field{[10]uint32{0x019a4ab4, 0x01457af7, 0x037c0a5b, 0x0306156e, 0x02717c36, 0x0343de8d, 0x0316f7b4, 0x00f84587, 0x00d109ec, 0x0012c5df}}, Y: Field{[10]uint32{0x035ab6f7, 0x0377f918, 0x01f558aa, 0x0157c5d0, 0x006e37e2, 0x00d89ad2, 0x028f6729, 0x03e997f6, 0x02e9a5e2, 0x000fb259}}}, + {X: Field{[10]uint32{0x022f001d, 0x013bc4d4, 0x01899611, 0x02b371e3, 0x036850e0, 0x030c6458, 0x025eb211, 0x03093d39, 0x00eca7a6, 0x003bfa9a}}, Y: Field{[10]uint32{0x03bc4415, 0x021067dc, 0x00771c12, 0x027ece12, 0x03e41395, 0x00dc6685, 0x0150307a, 0x00f05368, 0x03869d58, 0x002aae11}}}, + {X: Field{[10]uint32{0x001c23a4, 0x01beca6c, 0x01cf56f4, 0x01611e92, 0x01c22a41, 0x026e735d, 0x0203829b, 0x01e81b0a, 0x035206a2, 0x0017a1c0}}, Y: Field{[10]uint32{0x00d986f9, 0x01e65ac4, 0x00fda121, 0x021d2933, 0x01a2171d, 0x038b1b8b, 0x01755d1a, 0x0248879c, 0x004efb9c, 0x0016e599}}}, + {X: Field{[10]uint32{0x0291dc6e, 0x007bc8b0, 0x01fbd8b4, 0x02a537ca, 0x02661fa8, 0x028f8e3c, 0x03136c23, 0x016c9171, 0x0347a3f1, 0x0033c2f7}}, Y: Field{[10]uint32{0x037a8196, 0x00f05136, 0x032a99c7, 0x03f4aed7, 0x02b4fc6c, 0x015e463d, 0x00523b4e, 0x03d44693, 0x001c6e61, 0x000e30b8}}}, + {X: Field{[10]uint32{0x007b0c66, 0x03cd7480, 0x006fb1f3, 0x039195b2, 0x0034a7fe, 0x002b3add, 0x032244f6, 0x01a02911, 0x0301930d, 0x00395170}}, Y: Field{[10]uint32{0x01f2d470, 0x03d5f49c, 0x0239dd87, 0x02386d68, 0x0397e582, 0x02566f2f, 0x01c6fda3, 0x025579f9, 0x000e8c62, 0x00381a8d}}}, + {X: Field{[10]uint32{0x008f7e09, 0x028ad9fe, 0x012cde2a, 0x01e6e9f6, 0x02b3a037, 0x0117702f, 0x00e12e5a, 0x017f2ef6, 0x023d4f20, 0x00179aa1}}, Y: Field{[10]uint32{0x00dfca97, 0x018a19d2, 0x00fe3bbd, 0x00dc8ed3, 0x00a68e50, 0x01a5008d, 0x004a8d1f, 0x023b7f11, 0x02078a38, 0x003095c6}}}, + {X: Field{[10]uint32{0x03648bba, 0x020642e0, 0x007444a5, 0x02c1a70f, 0x0082a0f0, 0x03c06ce6, 0x033ee225, 0x03d60284, 0x02157a54, 0x002ca910}}, Y: Field{[10]uint32{0x00fb6452, 0x03ead280, 0x017bb246, 0x00547270, 0x01c0d855, 0x03ef5f8c, 0x01fbc978, 0x0199867a, 0x03c2b693, 0x003f93d7}}}, + {X: Field{[10]uint32{0x0304ab91, 0x039d78ac, 0x01557679, 0x00650914, 0x0325a40c, 0x02de0470, 0x02383063, 0x00452e29, 0x03ea8fe5, 0x0001e87f}}, Y: Field{[10]uint32{0x0397e554, 0x03d18ed9, 0x01d9d35a, 0x03a86402, 0x01287e5d, 0x00d12965, 0x010437c4, 0x01f151a4, 0x0021b0fd, 0x00384301}}}, + {X: Field{[10]uint32{0x03ab27d0, 0x03748bba, 0x0103fcf6, 0x03e8b114, 0x03f70b41, 0x02365c01, 0x02970191, 0x00e1946e, 0x020f3d45, 0x0006e423}}, Y: Field{[10]uint32{0x00d3d110, 0x0219d790, 0x011b571e, 0x024d61f9, 0x02b5bbca, 0x005f12e6, 0x0357c918, 0x01ad79bc, 0x025eec46, 0x0026db58}}}, + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + }, + { + {X: Field{[10]uint32{0x00fbd53c, 0x030e8ec2, 0x02cddf0c, 0x01c2b718, 0x03e2838c, 0x015066a1, 0x03b9352a, 0x02cd3a36, 0x032a7af4, 0x00139f09}}, Y: Field{[10]uint32{0x03dcaae6, 0x00e50605, 0x01d33e0b, 0x0052ffdf, 0x03530b96, 0x037bda06, 0x02fd09f6, 0x002c6385, 0x00766c9d, 0x0005dd27}}}, + {X: Field{[10]uint32{0x006e1b4d, 0x00879b9f, 0x00790e28, 0x01686fbe, 0x009b11f2, 0x038e1767, 0x00a269f4, 0x02223c9a, 0x03b02696, 0x00226405}}, Y: Field{[10]uint32{0x0014ab2b, 0x02baf6b6, 0x03212009, 0x0303e4ca, 0x02e4e51b, 0x018d62fe, 0x00579833, 0x00d3c2ed, 0x00dab5b3, 0x0010eb8b}}}, + {X: Field{[10]uint32{0x0121b3ff, 0x02611939, 0x0350cee2, 0x005fa6a9, 0x01233c07, 0x026b8929, 0x0244d2be, 0x011571d7, 0x023010c9, 0x00009213}}, Y: Field{[10]uint32{0x0269da7e, 0x02b92e40, 0x008bbcc1, 0x037a48eb, 0x03ad7006, 0x02cb43ba, 0x02c2b3c2, 0x038c341f, 0x00a0aa23, 0x00258674}}}, + {X: Field{[10]uint32{0x025f712f, 0x018d685f, 0x003a8af2, 0x02fe46d6, 0x022831f5, 0x00c89fc3, 0x034728e6, 0x017f52a3, 0x00f76e90, 0x0019fd91}}, Y: Field{[10]uint32{0x007160e5, 0x02b2d79c, 0x02198d68, 0x0223df4d, 0x005e0e14, 0x0161b3de, 0x01adeb7b, 0x017413c1, 0x028f6644, 0x002e0cf5}}}, + {X: Field{[10]uint32{0x004ba7b9, 0x02de7ea0, 0x01751f96, 0x01c0c1d0, 0x0220d6a4, 0x01cb2553, 0x039b70d6, 0x03395fbd, 0x0126cfb6, 0x0005b071}}, Y: Field{[10]uint32{0x005bd741, 0x02f8e947, 0x029cc475, 0x0006f726, 0x02ec755c, 0x0322a537, 0x02627459, 0x0050e418, 0x037c3403, 0x0036c55f}}}, + {X: Field{[10]uint32{0x00692fd1, 0x01825850, 0x00dfe2b2, 0x01b32f64, 0x02dcf43c, 0x02c7c643, 0x00aadef4, 0x03fe0038, 0x00b49901, 0x001394f2}}, Y: Field{[10]uint32{0x028625e0, 0x024c39cc, 0x01753934, 0x03695ff2, 0x01a87a50, 0x01c86768, 0x02cd709a, 0x02807861, 0x024f4d41, 0x00375b8f}}}, + {X: Field{[10]uint32{0x036683fa, 0x01921ea8, 0x00825e83, 0x014e03b0, 0x0295821b, 0x01149ed9, 0x0289ce77, 0x00c6be1e, 0x00d753f9, 0x0000e5cf}}, Y: Field{[10]uint32{0x034a577f, 0x03ecaddf, 0x001dedf5, 0x03863fa6, 0x00d77884, 0x00ad689b, 0x03e12b63, 0x028e8d90, 0x022cc30c, 0x000e33d6}}}, + {X: Field{[10]uint32{0x0389a762, 0x0098fb4e, 0x02b8dc10, 0x00c04bb9, 0x02930dc9, 0x01a2d1c4, 0x000a0549, 0x009557ea, 0x036c9365, 0x000c9fe1}}, Y: Field{[10]uint32{0x01203301, 0x03f6566e, 0x03dfe9c9, 0x01c3faf5, 0x01755350, 0x038665ee, 0x01969255, 0x01009ac2, 0x00eab352, 0x002cb501}}}, + {X: Field{[10]uint32{0x00bf6f06, 0x02ce6670, 0x03b57180, 0x00c89410, 0x01713c13, 0x000815d9, 0x02c04f4b, 0x03c54470, 0x03ba72ec, 0x002e9aa6}}, Y: Field{[10]uint32{0x001db551, 0x02fbdc1e, 0x03aafe32, 0x03deb1a5, 0x029e5d14, 0x01562f63, 0x0020bf2e, 0x0046c0c8, 0x0238b34a, 0x0004ddc7}}}, + {X: Field{[10]uint32{0x01637b39, 0x03c46655, 0x01fa2799, 0x02617b1d, 0x026c52b9, 0x0300c05a, 0x015b9286, 0x02b1730f, 0x01da6b99, 0x00033cf1}}, Y: Field{[10]uint32{0x02852a40, 0x01e8f5e8, 0x01c3cd24, 0x00148f09, 0x0137acd3, 0x00600929, 0x00671adc, 0x026d904d, 0x012fd9f3, 0x0000b3ed}}}, + {X: Field{[10]uint32{0x01231a43, 0x03be7c1c, 0x003b9fd1, 0x035996b5, 0x0344d514, 0x0137910b, 0x02ed9506, 0x01374b62, 0x00cc27cc, 0x000d716f}}, Y: Field{[10]uint32{0x0220c8f6, 0x01cb9145, 0x030ae7db, 0x033018f3, 0x014cf7a4, 0x01be9627, 0x00e5820b, 0x011b39cd, 0x01723b97, 0x00038d9d}}}, + {X: Field{[10]uint32{0x0149827b, 0x038d5f6d, 0x03d6148c, 0x03cf8486, 0x01fcc4f7, 0x038b38c4, 0x0212e06d, 0x01d7cea0, 0x00f5e0d3, 0x003391f4}}, Y: Field{[10]uint32{0x03aed097, 0x032697fb, 0x029df43c, 0x00bfc15d, 0x0329e659, 0x016e6b43, 0x009139fe, 0x00352756, 0x00fb9963, 0x000571a6}}}, + {X: Field{[10]uint32{0x01d40609, 0x002f15bf, 0x00d76bf4, 0x02603607, 0x02c74190, 0x01620d5a, 0x022f12fc, 0x021af284, 0x00245c55, 0x003f51e7}}, Y: Field{[10]uint32{0x0264ca53, 0x00bc4d9a, 0x024739de, 0x035c9872, 0x019113ae, 0x0326107f, 0x00ad7a43, 0x02bfbfcb, 0x03b52694, 0x000c1a73}}}, + {X: Field{[10]uint32{0x0148be00, 0x03f9c55f, 0x03e13b38, 0x03a85a63, 0x03f60682, 0x03e550f1, 0x030e2207, 0x010bcd3a, 0x00bd4a8e, 0x0024c6fe}}, Y: Field{[10]uint32{0x0344f452, 0x01aa44c7, 0x01df5158, 0x01aacccf, 0x026a43ee, 0x00503afb, 0x03388e61, 0x00820f46, 0x03f0489c, 0x003c454e}}}, + {X: Field{[10]uint32{0x03799a7f, 0x01c0bd4a, 0x028424db, 0x03354ee3, 0x004f18b6, 0x03cb1f55, 0x02d8eb9a, 0x036192f7, 0x002a3acc, 0x001b1000}}, Y: Field{[10]uint32{0x03c81e32, 0x03320b34, 0x003f68b5, 0x01320812, 0x01c07abd, 0x0387772f, 0x00b836a0, 0x00d6f9a4, 0x001530b6, 0x002570b7}}}, + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + }, + { + {X: Field{[10]uint32{0x00fb27b6, 0x009f8a10, 0x00576324, 0x02caf90c, 0x01c76e3d, 0x005a1aa9, 0x03238ad6, 0x022c6c43, 0x023dbe77, 0x003fa9d3}}, Y: Field{[10]uint32{0x023cb96f, 0x034f6dfc, 0x03b77701, 0x01ae5cfd, 0x03126b59, 0x032dabe4, 0x03674dec, 0x004ca5f3, 0x00db9b0b, 0x001b815a}}}, + {X: Field{[10]uint32{0x039756e4, 0x025f2587, 0x030488fd, 0x039778dc, 0x02bb570e, 0x003a3343, 0x00e03d85, 0x0203fc60, 0x01c83042, 0x003b6510}}, Y: Field{[10]uint32{0x033abfae, 0x03827e4f, 0x0298bff0, 0x01d3f937, 0x0209f237, 0x02c4e447, 0x02176128, 0x03e866be, 0x029efe8b, 0x000f6fa7}}}, + {X: Field{[10]uint32{0x02889756, 0x0206ba6f, 0x00bb25dd, 0x0265ec01, 0x03f27b64, 0x01c6267c, 0x02cd97b2, 0x03faa089, 0x03c33211, 0x001d8ba2}}, Y: Field{[10]uint32{0x00a6b774, 0x0096781f, 0x03a5e25e, 0x00c52213, 0x031972db, 0x0260b8d1, 0x03cc4f14, 0x03a5f0f1, 0x00260af3, 0x00300a25}}}, + {X: Field{[10]uint32{0x011cf119, 0x02b40cf5, 0x00d3015b, 0x03613ead, 0x015b10bd, 0x012d21d4, 0x03ed3f62, 0x01f0ff27, 0x018ee67a, 0x000a765a}}, Y: Field{[10]uint32{0x01056339, 0x021d015d, 0x002963c8, 0x003a4e9f, 0x03b89c94, 0x013c725b, 0x03a12540, 0x00ad149d, 0x00517dc8, 0x001ff40b}}}, + {X: Field{[10]uint32{0x0175d2ea, 0x01d7a5c2, 0x028ea26f, 0x03e84053, 0x011e52ac, 0x00c23d2a, 0x019bdbb2, 0x0254d238, 0x0147df60, 0x0037c1df}}, Y: Field{[10]uint32{0x01936f95, 0x030b678c, 0x01277aa3, 0x02e13ef7, 0x008a1ec5, 0x0228949f, 0x008425c9, 0x01fd1093, 0x028800ef, 0x003e185e}}}, + {X: Field{[10]uint32{0x02714560, 0x01602969, 0x006c2875, 0x0009f95b, 0x00247f21, 0x00696a17, 0x007ef64f, 0x034dae75, 0x0275579a, 0x000e2e0a}}, Y: Field{[10]uint32{0x0374299e, 0x021ccd29, 0x02284ada, 0x00efbdc5, 0x017d94f2, 0x00590d16, 0x03f56346, 0x007bd0a2, 0x02976f26, 0x003e7629}}}, + {X: Field{[10]uint32{0x004c92d7, 0x01247eef, 0x011b45b8, 0x01bb950e, 0x0135db4d, 0x00d2c50a, 0x017dea83, 0x03680cb8, 0x01758bd3, 0x0027cf9f}}, Y: Field{[10]uint32{0x014906dd, 0x02eff3ec, 0x021186cb, 0x000f5a53, 0x02452a23, 0x02eac540, 0x0062b21c, 0x0119ad62, 0x001ea77d, 0x003b34a1}}}, + {X: Field{[10]uint32{0x03422491, 0x031114df, 0x00cff467, 0x012a1818, 0x01fd453e, 0x00d6028c, 0x03fb7bd3, 0x024db5bc, 0x03d05013, 0x00049ad5}}, Y: Field{[10]uint32{0x01a3ef84, 0x00c7c667, 0x01347afa, 0x030c2fce, 0x00e148ba, 0x00afcfec, 0x004a3eba, 0x018b0b8f, 0x00130616, 0x003069f7}}}, + {X: Field{[10]uint32{0x02a8c483, 0x0035ccac, 0x00ac35ae, 0x02231410, 0x01174b0c, 0x03be54a0, 0x038c3d22, 0x033e7b70, 0x015d7b5c, 0x0028331e}}, Y: Field{[10]uint32{0x02cc6ba9, 0x019d1564, 0x03605509, 0x006f7da4, 0x006b348f, 0x008c77de, 0x0374fc97, 0x021cfb88, 0x0122f8b3, 0x002af0c0}}}, + {X: Field{[10]uint32{0x02faf403, 0x01588e8e, 0x03576051, 0x03ee5eb5, 0x0338a0ae, 0x02282d6f, 0x00faffac, 0x007d59c3, 0x0179b9e8, 0x00068904}}, Y: Field{[10]uint32{0x00d79a16, 0x02db9039, 0x0360d590, 0x03d05e37, 0x002c8177, 0x02416ddb, 0x03f27493, 0x01030b12, 0x00c0a867, 0x00238728}}}, + {X: Field{[10]uint32{0x01dd3aee, 0x03c6daf1, 0x012f2170, 0x022a3e5b, 0x0213153a, 0x01aa5db2, 0x0222a9ac, 0x031f3383, 0x00a51553, 0x001b4714}}, Y: Field{[10]uint32{0x01f597f7, 0x00d5393f, 0x013adfee, 0x002aa3b5, 0x00851e31, 0x00a1f51d, 0x03272002, 0x037f725d, 0x008e06ab, 0x002bffc5}}}, + {X: Field{[10]uint32{0x03720b26, 0x00bac126, 0x03cd0762, 0x017e6333, 0x0026f283, 0x004e4188, 0x006bbed4, 0x01a3b87d, 0x01ae9ac9, 0x000f8431}}, Y: Field{[10]uint32{0x01d92db5, 0x03a631eb, 0x01e43346, 0x02936f82, 0x00e2ff79, 0x01c8578a, 0x00665b28, 0x0222456a, 0x02cffe42, 0x0031cd71}}}, + {X: Field{[10]uint32{0x00a6d0bb, 0x032a6df9, 0x02fdc678, 0x008bd686, 0x03659d31, 0x02299063, 0x011a6d8a, 0x03e7cfcc, 0x01618b97, 0x001797c7}}, Y: Field{[10]uint32{0x0033eaf9, 0x00e11e44, 0x0253a168, 0x00b941bd, 0x0272555f, 0x0139c876, 0x00f6bcd0, 0x039bdcd6, 0x002b06a7, 0x0035ec54}}}, + {X: Field{[10]uint32{0x01543cb4, 0x020e9f59, 0x00299e00, 0x02db08b4, 0x003c4529, 0x0203aa28, 0x03684d05, 0x02152a2a, 0x03ae9734, 0x001cfe1e}}, Y: Field{[10]uint32{0x00856cdd, 0x03761cb1, 0x02d7a3d2, 0x03d4d5fc, 0x019d5c42, 0x028500a2, 0x03fbfc11, 0x03e1bfba, 0x00f03a87, 0x000df19b}}}, + {X: Field{[10]uint32{0x03005e3f, 0x026d7913, 0x01bd2dda, 0x00c6fb0e, 0x015af68e, 0x03806852, 0x013cb9ac, 0x0109ffff, 0x026b3c16, 0x003e04e2}}, Y: Field{[10]uint32{0x03357eb7, 0x01f8080b, 0x0221342d, 0x02f5552f, 0x01f4ec41, 0x02a972d4, 0x01015e57, 0x03af67e7, 0x033befb4, 0x00329d63}}}, + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + }, + { + {X: Field{[10]uint32{0x03bdde39, 0x000a9105, 0x0032952c, 0x01e6dd81, 0x031544e1, 0x02665a34, 0x022570d5, 0x033c3842, 0x0113f677, 0x001db990}}, Y: Field{[10]uint32{0x0101ac01, 0x005d4b46, 0x02032b4b, 0x034ad5b4, 0x035e2a33, 0x01a07c34, 0x03066d70, 0x02573d5d, 0x038dee4e, 0x00324377}}}, + {X: Field{[10]uint32{0x021187a5, 0x02666a0e, 0x02e691cf, 0x0188b0a6, 0x00005d57, 0x00587204, 0x007c9d88, 0x031cefba, 0x030e9e52, 0x001c2294}}, Y: Field{[10]uint32{0x033db9c0, 0x013c66d1, 0x03e8a58a, 0x00f1b4d4, 0x003ecda7, 0x02db4e0a, 0x01656dcb, 0x02a25fea, 0x0011e1f9, 0x0026e212}}}, + {X: Field{[10]uint32{0x0078ee8d, 0x01424730, 0x019442f0, 0x033941a4, 0x024ebf20, 0x02a6d3fd, 0x03f7263a, 0x02a6f897, 0x03ad859d, 0x00342395}}, Y: Field{[10]uint32{0x01a63e86, 0x01fd370b, 0x02d9de99, 0x033e508b, 0x00123ef7, 0x015f9b7d, 0x02172ee7, 0x02235cb5, 0x03984ab4, 0x00214ba5}}}, + {X: Field{[10]uint32{0x01e4f5be, 0x02c5b1b3, 0x0359e2e1, 0x01b61aca, 0x039f374b, 0x017918b3, 0x03d64839, 0x00ef8866, 0x034fc48b, 0x000673c0}}, Y: Field{[10]uint32{0x03321af2, 0x0054cadb, 0x01c0c0a9, 0x0324fc3c, 0x03ef91d1, 0x02c60651, 0x034be68a, 0x02d19b0e, 0x0306a15a, 0x000a38ca}}}, + {X: Field{[10]uint32{0x029129ec, 0x00519c10, 0x02548159, 0x033c7920, 0x000cae3a, 0x0334c742, 0x018be80e, 0x01349d7d, 0x0085e4d4, 0x001f69b0}}, Y: Field{[10]uint32{0x00d9ff0e, 0x002bb8ab, 0x0186aeb5, 0x02195329, 0x030448c0, 0x024589ef, 0x01d02074, 0x00615d44, 0x006bb9f4, 0x003d2605}}}, + {X: Field{[10]uint32{0x029c22bc, 0x02b950c3, 0x0042fd43, 0x035a46f3, 0x0201da67, 0x026f1ef9, 0x01b3444d, 0x03ac8dd9, 0x02a5e99e, 0x0014cd73}}, Y: Field{[10]uint32{0x03dacb60, 0x03099cb2, 0x0319b3c2, 0x008db287, 0x02c8c30c, 0x0033ae1a, 0x027f080f, 0x01489281, 0x0020769c, 0x000efe34}}}, + {X: Field{[10]uint32{0x01654f22, 0x00f52554, 0x02ee94f8, 0x02508c6a, 0x03b2f7f3, 0x039a7653, 0x03e9001b, 0x02f9b886, 0x00cff5c1, 0x00243424}}, Y: Field{[10]uint32{0x001a43e1, 0x037815d8, 0x038740f5, 0x0194f68f, 0x036dd635, 0x01afdc0c, 0x03f021e0, 0x03d86a54, 0x021d2bac, 0x003355a6}}}, + {X: Field{[10]uint32{0x017cf3e8, 0x02f08274, 0x02219e3a, 0x000d2fa8, 0x02ee93bd, 0x00e5fd5d, 0x0319c2f8, 0x017c35f1, 0x00a078cb, 0x002bdb11}}, Y: Field{[10]uint32{0x0351baea, 0x03741805, 0x01435b8a, 0x03a9f283, 0x03ec362a, 0x032c91b7, 0x01e73153, 0x012cc2be, 0x016fe85d, 0x0001e102}}}, + {X: Field{[10]uint32{0x036b19fa, 0x03bd9471, 0x019d71b6, 0x01b41a20, 0x02d9d6e0, 0x02084a4b, 0x0322c310, 0x0347b31c, 0x00587cf1, 0x003691e6}}, Y: Field{[10]uint32{0x026f5af7, 0x009bbacc, 0x03c206aa, 0x00fa554f, 0x02a67bd1, 0x038595a7, 0x03369077, 0x02bc0745, 0x03789bcc, 0x003aec75}}}, + {X: Field{[10]uint32{0x02569044, 0x03e47b75, 0x02ef96d2, 0x01b3e833, 0x0033c039, 0x017163cc, 0x002bafe9, 0x01894e75, 0x020d6f7d, 0x002a8871}}, Y: Field{[10]uint32{0x02f37766, 0x00931070, 0x00334c19, 0x03044e4a, 0x02ee5aba, 0x0106b7d3, 0x01d26add, 0x01aba9b4, 0x0086fc4e, 0x002cab9a}}}, + {X: Field{[10]uint32{0x01135dbd, 0x00bed96e, 0x0231ecd9, 0x02bce761, 0x00f0c087, 0x00ba625f, 0x017aaf58, 0x03b9ab60, 0x0104a8dd, 0x0038f91d}}, Y: Field{[10]uint32{0x0348045d, 0x01abcf91, 0x01da9690, 0x03fd7b25, 0x02a5a202, 0x00ae0fff, 0x018c8195, 0x031b102e, 0x03f809cb, 0x0024c296}}}, + {X: Field{[10]uint32{0x03f4de54, 0x00798853, 0x002be5bc, 0x0247a74f, 0x00a5cabd, 0x00528a16, 0x034031cf, 0x000a8b0e, 0x00355df2, 0x0015c5b7}}, Y: Field{[10]uint32{0x00100fa5, 0x0293f554, 0x02417d3e, 0x0333411f, 0x01ebf3fe, 0x0264c931, 0x02aa661a, 0x020fce47, 0x00400a5b, 0x002617db}}}, + {X: Field{[10]uint32{0x01ee455f, 0x002e7973, 0x00075cbf, 0x039ba339, 0x02ff67ff, 0x0202f6d2, 0x0345338f, 0x02a6c291, 0x016fe870, 0x001fa319}}, Y: Field{[10]uint32{0x031b9cba, 0x037a6605, 0x02627173, 0x019d1bd1, 0x034aa2d1, 0x0200e94e, 0x03f760f4, 0x01d03ca8, 0x0232ca30, 0x002f7771}}}, + {X: Field{[10]uint32{0x0369b57c, 0x00540365, 0x03c7b1e6, 0x02f0e78b, 0x01da5033, 0x02f8fc13, 0x008f1925, 0x00a0ad4d, 0x01cb592d, 0x0000c194}}, Y: Field{[10]uint32{0x033236e3, 0x00e9417c, 0x038057ff, 0x0061ce7d, 0x03192a4d, 0x0215a0b0, 0x00e2423e, 0x030262b1, 0x0033bb7a, 0x00094822}}}, + {X: Field{[10]uint32{0x0298b59e, 0x025ae6d9, 0x007a4377, 0x009624d1, 0x020a3359, 0x00f8f1c9, 0x02b035ab, 0x017ac56f, 0x01f891a9, 0x000f7e10}}, Y: Field{[10]uint32{0x0392baf5, 0x02399e5a, 0x009f8bcf, 0x01ec8525, 0x027bfc86, 0x00473ce1, 0x002bae8f, 0x02430768, 0x02df98b0, 0x002ce3f9}}}, + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + }, + { + {X: Field{[10]uint32{0x03cbb891, 0x0054090a, 0x00bee3ab, 0x010f7c9b, 0x028f7cc6, 0x010fe3e6, 0x0281baa7, 0x02af87a0, 0x016b03b2, 0x0031ce31}}, Y: Field{[10]uint32{0x019a84c3, 0x01cd765a, 0x00fe917e, 0x03bde203, 0x0382314e, 0x032feeee, 0x0318f2ea, 0x03494dfd, 0x0178951a, 0x00224fed}}}, + {X: Field{[10]uint32{0x0262ab1b, 0x02ac1e11, 0x009e4dda, 0x03a926e3, 0x00647197, 0x00b9eaa5, 0x0332a699, 0x000dd0d6, 0x005ecd7c, 0x00155e21}}, Y: Field{[10]uint32{0x016f3511, 0x03463cc1, 0x024de316, 0x01d1a975, 0x03f653a7, 0x034a9014, 0x026d0a51, 0x038b0f3a, 0x03978b6d, 0x00398741}}}, + {X: Field{[10]uint32{0x0361d58d, 0x02abcce1, 0x00e2f34b, 0x03902358, 0x02ca4c9b, 0x01c837de, 0x02240a35, 0x01851842, 0x0127823f, 0x002e3118}}, Y: Field{[10]uint32{0x011051a4, 0x03a82ea7, 0x03c5b638, 0x01e17841, 0x013f7504, 0x01fcf141, 0x02458f69, 0x038df452, 0x016c5170, 0x0023e7b6}}}, + {X: Field{[10]uint32{0x008b6c29, 0x021a6e25, 0x0196094f, 0x0153f38e, 0x0122f123, 0x03433b33, 0x03fa3bc1, 0x0193312a, 0x003888a3, 0x0011fcce}}, Y: Field{[10]uint32{0x02537ef9, 0x03b84483, 0x014a81ed, 0x025623e6, 0x0118bb49, 0x02d05b1c, 0x00e48675, 0x00a4dc64, 0x028d0f03, 0x001232a6}}}, + {X: Field{[10]uint32{0x010b0040, 0x002cc101, 0x00adc2db, 0x02e7c04d, 0x01f3f47d, 0x03a68d9c, 0x010c993f, 0x01c7de8d, 0x029f7102, 0x0002355b}}, Y: Field{[10]uint32{0x033fd0a1, 0x03899e96, 0x002beb58, 0x01c8385e, 0x01f6d7c4, 0x035e6ca1, 0x03d150a8, 0x026a887f, 0x01aebd0a, 0x00284861}}}, + {X: Field{[10]uint32{0x0166ff40, 0x037a8684, 0x0336da14, 0x012907ff, 0x02caeebf, 0x0392028b, 0x038125d8, 0x0234adf1, 0x00331881, 0x001ac010}}, Y: Field{[10]uint32{0x0171b847, 0x0104c3a7, 0x02de9eb7, 0x03db9fcf, 0x00076883, 0x0242fcbc, 0x00943a05, 0x03eb265a, 0x033ae8aa, 0x00107346}}}, + {X: Field{[10]uint32{0x03573b7f, 0x0158f7c4, 0x02270f56, 0x017b4c2d, 0x03889a1c, 0x02f9968d, 0x0220f977, 0x03398d07, 0x0232d42f, 0x003704fc}}, Y: Field{[10]uint32{0x001f2ba6, 0x03348a13, 0x00b1c42a, 0x01c05d01, 0x02704554, 0x012a429d, 0x03410da8, 0x00d030f1, 0x0280429e, 0x0032426e}}}, + {X: Field{[10]uint32{0x01ff4adb, 0x029b23c1, 0x03768a81, 0x035bf2fb, 0x0214f570, 0x01a9757d, 0x026b4c9c, 0x02e33f91, 0x0334ae41, 0x00303007}}, Y: Field{[10]uint32{0x00351065, 0x03bfdceb, 0x01b85fc4, 0x0345c345, 0x02cdbc43, 0x001d6e33, 0x0137a0b4, 0x01fd71f2, 0x01bee435, 0x0002e13d}}}, + {X: Field{[10]uint32{0x03ae9ceb, 0x03d642e1, 0x02d14b02, 0x03a9c3bc, 0x00226c21, 0x02c8466a, 0x0319565d, 0x01fc1ceb, 0x01e601df, 0x0009700b}}, Y: Field{[10]uint32{0x03c6e275, 0x024344d2, 0x00726470, 0x037c2996, 0x0137c641, 0x03eb4475, 0x0084e0dc, 0x00e0f032, 0x02d2c812, 0x0022a7fa}}}, + {X: Field{[10]uint32{0x032c1a1c, 0x000675e4, 0x01d6e365, 0x006808af, 0x03a2f32b, 0x002d8ee4, 0x0229ea40, 0x032f6cf4, 0x03bc468e, 0x000ea4cb}}, Y: Field{[10]uint32{0x01343540, 0x02a49a5f, 0x028b684a, 0x0055d268, 0x02c0417e, 0x03720742, 0x009547d4, 0x015ea007, 0x00540f34, 0x002b4f60}}}, + {X: Field{[10]uint32{0x005a3c34, 0x00263dbb, 0x009fe1f8, 0x0300a565, 0x00aece82, 0x01eb8f96, 0x02b9f4ca, 0x039273a2, 0x011b2cf8, 0x003fb767}}, Y: Field{[10]uint32{0x013d7714, 0x0152fd38, 0x0029762b, 0x011a66fe, 0x00adaeb5, 0x0323d2c0, 0x03e85312, 0x02e382c2, 0x00c31853, 0x00294b89}}}, + {X: Field{[10]uint32{0x00d6bf1f, 0x00841ae0, 0x03cbb045, 0x00fa6093, 0x0146bd03, 0x01acd1ae, 0x0121e927, 0x02e0f28d, 0x0343451c, 0x0030ccdc}}, Y: Field{[10]uint32{0x00b01f48, 0x0396108f, 0x02162f95, 0x01083899, 0x0198ba36, 0x01cb0c55, 0x01ff31af, 0x00b3684f, 0x01391b81, 0x000bbbfa}}}, + {X: Field{[10]uint32{0x02b6a396, 0x0395346a, 0x020769b4, 0x0246844d, 0x0373021b, 0x03a1222c, 0x02e2d7f5, 0x029230b7, 0x0286bc6e, 0x000f838c}}, Y: Field{[10]uint32{0x0180e27e, 0x00c79236, 0x00f6a2eb, 0x0107cd1a, 0x026ab010, 0x02d14ff1, 0x031fe1de, 0x00de593c, 0x0172fa3b, 0x00329120}}}, + {X: Field{[10]uint32{0x02f027e9, 0x03d31236, 0x0277e27b, 0x036fb951, 0x03d7ca75, 0x01fb5b45, 0x03c7cd53, 0x00f894f0, 0x033d3ea8, 0x001698a1}}, Y: Field{[10]uint32{0x004c68b4, 0x02764161, 0x035fb319, 0x00c27299, 0x03988af4, 0x03b15e90, 0x02409cfe, 0x01abf69d, 0x0079a5bf, 0x003db651}}}, + {X: Field{[10]uint32{0x001023ec, 0x00d6188d, 0x03570aaf, 0x03ddbfb3, 0x035645d8, 0x0260ae6b, 0x002e0200, 0x00b4a126, 0x013080c3, 0x000d12ae}}, Y: Field{[10]uint32{0x021eeb87, 0x02260a47, 0x015d704f, 0x01abf0e6, 0x03fc4e97, 0x02945317, 0x038f2d1e, 0x0118a9cf, 0x03042b24, 0x001b870a}}}, + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + }, + { + {X: Field{[10]uint32{0x00f6c14b, 0x03a7d962, 0x01014372, 0x017cea49, 0x03d1d72e, 0x0325ca1d, 0x024c7637, 0x016e0789, 0x026548b6, 0x00362558}}, Y: Field{[10]uint32{0x017d991f, 0x018fb5d7, 0x027e1793, 0x018caec1, 0x0303428d, 0x0230d03a, 0x00ec6081, 0x01fab9ca, 0x0238f2bc, 0x003fafea}}}, + {X: Field{[10]uint32{0x03078424, 0x02d652dd, 0x00c3fba5, 0x01e83b10, 0x0303ecaf, 0x0000e899, 0x03a43622, 0x00113a28, 0x02ef8971, 0x003f44db}}, Y: Field{[10]uint32{0x0271ddf1, 0x007bbbf1, 0x01fa8cd6, 0x03de28ab, 0x017cf2b1, 0x01717be9, 0x021d191b, 0x014b319e, 0x0034f3c6, 0x0008636a}}}, + {X: Field{[10]uint32{0x0127b756, 0x02a1ffd8, 0x0170480b, 0x0392ae82, 0x0203428b, 0x00182d05, 0x01362da5, 0x03c499cb, 0x002f716d, 0x001b631e}}, Y: Field{[10]uint32{0x03172571, 0x007dd2af, 0x01cca655, 0x0368b5f3, 0x034e3aa6, 0x01b4d36b, 0x019a82d3, 0x02e44451, 0x030896fd, 0x00266bb7}}}, + {X: Field{[10]uint32{0x01b1cb3c, 0x03613b23, 0x0024a5f1, 0x028350fc, 0x021b7003, 0x01d467e1, 0x01cca536, 0x0234503a, 0x029dd963, 0x003667a3}}, Y: Field{[10]uint32{0x038637a7, 0x028a78da, 0x0365cd88, 0x03e3ff21, 0x026286fe, 0x02f3ae9b, 0x005bb321, 0x028e9ea5, 0x01ad1cc0, 0x000db706}}}, + {X: Field{[10]uint32{0x018cf17a, 0x03869cdd, 0x023524de, 0x032e9620, 0x00f1f85d, 0x02d025fe, 0x0059aef1, 0x01eb2a34, 0x02dd95bf, 0x003af2af}}, Y: Field{[10]uint32{0x00aa0ccd, 0x033717d7, 0x0295c446, 0x004b42b3, 0x0310fad2, 0x01f0cb9a, 0x0000a1b6, 0x02e72c0b, 0x020f8f22, 0x0011f4f3}}}, + {X: Field{[10]uint32{0x01a3c43c, 0x012cb154, 0x02258e4c, 0x032a3b3b, 0x000df701, 0x02ab99c5, 0x00c1f2b4, 0x03356d23, 0x029467ca, 0x0015b276}}, Y: Field{[10]uint32{0x00d7c9ed, 0x0362df48, 0x00aa1824, 0x03e4cbb7, 0x0241d40f, 0x0372da14, 0x03c7964d, 0x027b0bcc, 0x02cb42c7, 0x000e351a}}}, + {X: Field{[10]uint32{0x00855c5b, 0x03b9456b, 0x00afbbce, 0x006805f2, 0x00118562, 0x0385ff0a, 0x0331a369, 0x03389114, 0x012e4bd4, 0x003a37d3}}, Y: Field{[10]uint32{0x02465650, 0x0179cb0b, 0x00d7d59d, 0x017c7879, 0x019663b5, 0x027bccb1, 0x004db4f5, 0x026c9911, 0x0170c47f, 0x001b15ff}}}, + {X: Field{[10]uint32{0x00385172, 0x01bda34f, 0x02636fd4, 0x00781103, 0x01d20335, 0x016c2464, 0x03d8a54e, 0x020c5e86, 0x01619a19, 0x0000ff7c}}, Y: Field{[10]uint32{0x00cb9794, 0x0319fc3f, 0x0232b79a, 0x027a439c, 0x015b9b92, 0x03215cdd, 0x0070c7d3, 0x004b0ff9, 0x02c06e5c, 0x00102340}}}, + {X: Field{[10]uint32{0x02e7e454, 0x03d6f694, 0x02150d08, 0x03bc3c39, 0x02fe32ef, 0x02a60598, 0x02486023, 0x02a0ca44, 0x03d718ec, 0x00101a34}}, Y: Field{[10]uint32{0x00ef191e, 0x02b37976, 0x03332779, 0x03b44f0d, 0x01988d21, 0x03674e34, 0x02c14597, 0x011eaae7, 0x03b7254a, 0x00233614}}}, + {X: Field{[10]uint32{0x01d8247e, 0x0307fd4d, 0x011eb400, 0x0309445a, 0x00cd4780, 0x03e82de8, 0x02101f9a, 0x0157395b, 0x01bba2c3, 0x000cfab2}}, Y: Field{[10]uint32{0x033da9bf, 0x005aac2b, 0x0007f372, 0x00dedfa9, 0x0184f8cf, 0x03457bcb, 0x0061f2af, 0x01f10751, 0x0173e4e1, 0x000d65cc}}}, + {X: Field{[10]uint32{0x02c5d939, 0x01eb7e11, 0x033de085, 0x021deea4, 0x02a475a2, 0x0032809f, 0x01bf32e6, 0x009782d5, 0x02cdb1d8, 0x00049543}}, Y: Field{[10]uint32{0x01e757c9, 0x01d3f156, 0x0143192a, 0x007fb363, 0x02838b74, 0x01dc929c, 0x008e43c1, 0x035e9d51, 0x0334f872, 0x001ee3e0}}}, + {X: Field{[10]uint32{0x01f771c8, 0x0092740b, 0x00c87b9e, 0x0047b825, 0x00335a52, 0x0007e1d4, 0x032c2b3c, 0x03240a74, 0x006d922d, 0x002dc795}}, Y: Field{[10]uint32{0x03f48c51, 0x00e89be4, 0x02286245, 0x00ad56ee, 0x0026bd52, 0x0338a23d, 0x0112a4cc, 0x03e401e2, 0x03a8cec9, 0x0039f33b}}}, + {X: Field{[10]uint32{0x02c8a56f, 0x002ab195, 0x0342138d, 0x0150d3cd, 0x0385093c, 0x02beb423, 0x01bb7b53, 0x0217531a, 0x031ac3b5, 0x00251359}}, Y: Field{[10]uint32{0x027be289, 0x01371976, 0x0117eb9f, 0x01d37419, 0x0167d4c1, 0x00ceb186, 0x01439361, 0x007ffd30, 0x01977b50, 0x0029c419}}}, + {X: Field{[10]uint32{0x03194444, 0x01cc24b4, 0x03ea268f, 0x0252ea9f, 0x02850fea, 0x0361e867, 0x02239666, 0x009ae184, 0x0196ba15, 0x003eb3d7}}, Y: Field{[10]uint32{0x00bad676, 0x02fd2211, 0x0100b552, 0x0116e51f, 0x02be72b2, 0x024b76b1, 0x01b77563, 0x0113da4d, 0x007bb8ad, 0x001f3ae4}}}, + {X: Field{[10]uint32{0x0208f15a, 0x02e2862b, 0x0100baee, 0x01b7204a, 0x01fd69e5, 0x02b4f0c1, 0x02b03655, 0x026833f9, 0x0291cd09, 0x0021a953}}, Y: Field{[10]uint32{0x01388308, 0x013479f0, 0x0254d352, 0x00496cd4, 0x0377129d, 0x035d5a19, 0x032a8d06, 0x021180e9, 0x014837a7, 0x0033fb98}}}, + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + }, + { + {X: Field{[10]uint32{0x03676e03, 0x01429593, 0x00edd491, 0x00da4fa1, 0x01ceffc7, 0x01c7a1d8, 0x00f64335, 0x01d463ac, 0x00032a95, 0x002e36a5}}, Y: Field{[10]uint32{0x02fdf6e7, 0x023939d3, 0x03b51148, 0x013657fc, 0x0092cc58, 0x018a022c, 0x0099cc97, 0x0287935f, 0x03a44805, 0x000a0137}}}, + {X: Field{[10]uint32{0x01af726a, 0x00fd0531, 0x036e6d41, 0x0172c96f, 0x01469a3e, 0x02ad883e, 0x032cb698, 0x0317394f, 0x0105ed8c, 0x001b4db4}}, Y: Field{[10]uint32{0x03f9fc7d, 0x00124684, 0x00a35c57, 0x00dad042, 0x01dcc599, 0x0171400a, 0x018c66c9, 0x019a79cb, 0x0034e377, 0x00392e97}}}, + {X: Field{[10]uint32{0x02e1346b, 0x02612771, 0x031c5ea1, 0x0040e16b, 0x005abe7b, 0x013454b0, 0x00c761f1, 0x03442f95, 0x00ff0982, 0x0001a41a}}, Y: Field{[10]uint32{0x03226c13, 0x01629535, 0x0026e7bb, 0x00e65318, 0x02a4f689, 0x0021910a, 0x005db2bd, 0x03789b6a, 0x03e090bf, 0x002e18f8}}}, + {X: Field{[10]uint32{0x0140db99, 0x00a8c329, 0x0012286e, 0x03014d2e, 0x03eb1309, 0x01bc2c38, 0x02883fa6, 0x02b03341, 0x01e10cd3, 0x000eadaf}}, Y: Field{[10]uint32{0x03da78a3, 0x01cff8c6, 0x00043e68, 0x02c38da7, 0x0038d137, 0x0284fa67, 0x03117a96, 0x01c75ff0, 0x02079be8, 0x002eb298}}}, + {X: Field{[10]uint32{0x00a1f6a1, 0x01a47f37, 0x03f1a30e, 0x0050d233, 0x01068cbd, 0x007a1b38, 0x006dc5cb, 0x025d854a, 0x0093cb25, 0x0022630d}}, Y: Field{[10]uint32{0x024f647c, 0x037083c5, 0x0179ca4a, 0x025e7caf, 0x03b2a7cf, 0x00ab1ba4, 0x00454245, 0x02955276, 0x0186ab56, 0x001d7dd6}}}, + {X: Field{[10]uint32{0x0235c795, 0x038aef1c, 0x001d7584, 0x0163af55, 0x030b0d89, 0x03472275, 0x03b05b37, 0x025d2ce4, 0x022435ef, 0x00018f11}}, Y: Field{[10]uint32{0x03110258, 0x00b70256, 0x029bd3f3, 0x02b3e926, 0x029e4acb, 0x00c7216d, 0x01f660d9, 0x0210110c, 0x03b91303, 0x00389fe6}}}, + {X: Field{[10]uint32{0x011e3998, 0x02780f0f, 0x00328aa6, 0x02e45e81, 0x025e56c8, 0x008a89d3, 0x01299d70, 0x022fc069, 0x02fed291, 0x002c84f8}}, Y: Field{[10]uint32{0x025fb81e, 0x032f718c, 0x01175ec2, 0x016faf7b, 0x03d53416, 0x00e90ef0, 0x0161ebf8, 0x00f04b0f, 0x02c20f2d, 0x0008a7e3}}}, + {X: Field{[10]uint32{0x031048da, 0x01efc9e7, 0x013ba777, 0x03cdcf77, 0x02ba2fd4, 0x0341ef38, 0x03a069d9, 0x015bc3f6, 0x00e3f1ad, 0x001e598d}}, Y: Field{[10]uint32{0x0106cf01, 0x026f8928, 0x00862e8f, 0x03633f5d, 0x02532576, 0x029e49fc, 0x01e74735, 0x002e255b, 0x02b6cfb2, 0x001363b8}}}, + {X: Field{[10]uint32{0x025be234, 0x0387fb28, 0x0350700b, 0x039c377c, 0x020e83e3, 0x00581b81, 0x01d0ba69, 0x03e4f974, 0x02d816c7, 0x0012cece}}, Y: Field{[10]uint32{0x020e8362, 0x02df80e4, 0x01b84063, 0x024b3c84, 0x0041e7fd, 0x03633013, 0x035e96df, 0x02f271e1, 0x023b85da, 0x0017bb00}}}, + {X: Field{[10]uint32{0x005201e1, 0x0026b270, 0x0377dab2, 0x016ba0da, 0x01d264cb, 0x03a8d7e6, 0x02bd55cd, 0x01e2ba14, 0x02b06e6c, 0x0030a671}}, Y: Field{[10]uint32{0x00f51ba3, 0x00cc4e94, 0x02ae9add, 0x03d60eb0, 0x03bd74dc, 0x035dd335, 0x0084f24f, 0x02016ce2, 0x01923611, 0x0016a9ce}}}, + {X: Field{[10]uint32{0x0289f55e, 0x018d29f8, 0x02707b96, 0x03c38b1d, 0x022976b0, 0x01e2596f, 0x00251b02, 0x013e5808, 0x00b6ddb0, 0x0027dee2}}, Y: Field{[10]uint32{0x021e4bde, 0x034ed97f, 0x022b1b3c, 0x0383ac42, 0x03c0e536, 0x0263f1c7, 0x03146b42, 0x0043def8, 0x0384c704, 0x000cbe7d}}}, + {X: Field{[10]uint32{0x001cbaab, 0x01e9fc5b, 0x0164cfd3, 0x01e40cf5, 0x001acab8, 0x029c18d7, 0x00ab6c18, 0x0181c566, 0x0298fb35, 0x00340c6b}}, Y: Field{[10]uint32{0x01116b26, 0x02411fe1, 0x01fdc4c3, 0x013f6f59, 0x036dfb4a, 0x0372d373, 0x02e4c06a, 0x01613a39, 0x02b4e954, 0x00105465}}}, + {X: Field{[10]uint32{0x01fe1d2b, 0x01272307, 0x038e5165, 0x002795a1, 0x00c493f5, 0x00fedce9, 0x02ccadfd, 0x01238f9d, 0x03e9cb74, 0x00356290}}, Y: Field{[10]uint32{0x00d50922, 0x009e56e3, 0x02fbffcf, 0x008572f5, 0x0354d9ba, 0x020a09da, 0x02729132, 0x020f3c42, 0x026ba058, 0x003f05e1}}}, + {X: Field{[10]uint32{0x007996c0, 0x03ef5611, 0x0269a626, 0x01c9dae8, 0x016e2eed, 0x02fb743a, 0x03979577, 0x00d590e6, 0x02d86a95, 0x0005ba16}}, Y: Field{[10]uint32{0x00151d48, 0x022f192e, 0x01d54488, 0x02b6715a, 0x0221b642, 0x0003b556, 0x0217e5ce, 0x0124fbec, 0x00aeb424, 0x001d022c}}}, + {X: Field{[10]uint32{0x009c795e, 0x00546f89, 0x0005e124, 0x02aa673a, 0x02ed4406, 0x0309fa93, 0x02d969c3, 0x020c4335, 0x01397111, 0x0008749c}}, Y: Field{[10]uint32{0x01208ece, 0x004bb0e6, 0x03761b00, 0x01292b7e, 0x03d67194, 0x008aed30, 0x0335b855, 0x02b3a85d, 0x01b4b075, 0x0025317e}}}, + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + }, + { + {X: Field{[10]uint32{0x03c0df5d, 0x0045de38, 0x02792f1a, 0x03ed455a, 0x032019ef, 0x01d75fea, 0x00adab94, 0x02cce9f6, 0x0214441f, 0x003a03fa}}, Y: Field{[10]uint32{0x02c9ec78, 0x010a46da, 0x02ea9fcb, 0x0202bcc8, 0x032d155e, 0x00f2a511, 0x009768ca, 0x0001dc7a, 0x027f638e, 0x003bb477}}}, + {X: Field{[10]uint32{0x0383cd58, 0x0039e2c3, 0x039162db, 0x00e1df4b, 0x03122dcc, 0x03bf9e8d, 0x01ac4ed1, 0x00499660, 0x01f08ea4, 0x00110328}}, Y: Field{[10]uint32{0x008a3f4b, 0x02f01a6e, 0x02260b07, 0x0109a702, 0x02a21e4d, 0x03538bc0, 0x00954dc9, 0x03848abe, 0x00d2cd5e, 0x0029b22c}}}, + {X: Field{[10]uint32{0x03592d55, 0x00d67b35, 0x010192c0, 0x011d038d, 0x0106d5b9, 0x00cf38ec, 0x02fef696, 0x00149822, 0x02dbc4a1, 0x00174bb1}}, Y: Field{[10]uint32{0x035183a7, 0x039743ab, 0x01174266, 0x0336b445, 0x010e2a7b, 0x01a335a5, 0x03710fa2, 0x0117ad63, 0x01f89c6e, 0x0002a4b3}}}, + {X: Field{[10]uint32{0x02998b10, 0x02f689c4, 0x029d9e81, 0x02f306c8, 0x019bc70e, 0x00ea41e0, 0x037f829d, 0x01b07317, 0x03af2b96, 0x003da532}}, Y: Field{[10]uint32{0x00f05e51, 0x0222c5c0, 0x02a47f67, 0x030c60f0, 0x02eb6c64, 0x0311b60a, 0x03c5ffac, 0x03c0f58c, 0x02ba61be, 0x0010298f}}}, + {X: Field{[10]uint32{0x028f9f5c, 0x03d2d27f, 0x00a51991, 0x03856620, 0x017361f1, 0x0057d013, 0x02cae342, 0x03dd0bf8, 0x01c3b11b, 0x002b0dc7}}, Y: Field{[10]uint32{0x025a503c, 0x020ffccc, 0x01e1d17a, 0x0163b9d4, 0x01229534, 0x009539cd, 0x02101e73, 0x0291dffc, 0x02c18709, 0x00314585}}}, + {X: Field{[10]uint32{0x015bf84c, 0x012e3e39, 0x01027a74, 0x03b55c36, 0x03d964c6, 0x008f2b93, 0x01d3c252, 0x01b32397, 0x0099ceb9, 0x00189e0a}}, Y: Field{[10]uint32{0x0315fa2a, 0x0073ead7, 0x036ed6f5, 0x039f7745, 0x039a020d, 0x025c99e0, 0x00549722, 0x028a2407, 0x00a40911, 0x00359c2b}}}, + {X: Field{[10]uint32{0x01e33446, 0x00723546, 0x0385df4a, 0x03114abc, 0x0240893b, 0x0088a85e, 0x008c0bd0, 0x0210324d, 0x003a14f1, 0x00225080}}, Y: Field{[10]uint32{0x02387689, 0x00e28039, 0x00f9840d, 0x00d9e79d, 0x006bfd77, 0x03bf7938, 0x00b2d6d0, 0x001de936, 0x039595a5, 0x002a7f40}}}, + {X: Field{[10]uint32{0x01d553fd, 0x0284cd63, 0x02414f95, 0x0257022d, 0x0047abf6, 0x02689654, 0x036d4f43, 0x01a12142, 0x022a3556, 0x0022dba1}}, Y: Field{[10]uint32{0x029be5ed, 0x00f6b4cf, 0x003d0d80, 0x016860ce, 0x0124ac3c, 0x013ae7e8, 0x010bc2df, 0x0072d034, 0x00910ed1, 0x003a9782}}}, + {X: Field{[10]uint32{0x0113cb26, 0x00a3256e, 0x016d03d7, 0x027004ef, 0x0099eb41, 0x01541726, 0x00da44ff, 0x010aa28b, 0x026b30a3, 0x0009dc09}}, Y: Field{[10]uint32{0x0348a7a2, 0x01c5ccfc, 0x01bebbfe, 0x006f3205, 0x00e940c9, 0x01fcacc9, 0x012d24d0, 0x036c6955, 0x005e79b0, 0x003d926f}}}, + {X: Field{[10]uint32{0x030c58bd, 0x010912b3, 0x024ce23f, 0x0137d911, 0x0228d49f, 0x01aabb3d, 0x019e1005, 0x013024cb, 0x006e2484, 0x0034eb7c}}, Y: Field{[10]uint32{0x03c89387, 0x0392ae4d, 0x00c9ce52, 0x027e92e6, 0x02aee386, 0x03fd8e2e, 0x03b2febc, 0x0181def7, 0x01b4fc2a, 0x0015fa67}}}, + {X: Field{[10]uint32{0x015e8247, 0x02a80856, 0x00d1af0a, 0x01155a1b, 0x0097bfdc, 0x033e2ea4, 0x025e6e01, 0x03b485e3, 0x00d383cb, 0x001d7934}}, Y: Field{[10]uint32{0x01982d22, 0x00ff6756, 0x01893ca2, 0x02dbaa6b, 0x007ddab5, 0x01edc9b5, 0x01f970ec, 0x002641d0, 0x02a17541, 0x0007f390}}}, + {X: Field{[10]uint32{0x039715c2, 0x011c743c, 0x0129a399, 0x0087e629, 0x01690065, 0x028cffb7, 0x011f78ce, 0x00f616d0, 0x0288f19a, 0x000bc627}}, Y: Field{[10]uint32{0x0171dfea, 0x018d6110, 0x014f066a, 0x038b0da1, 0x03eb3333, 0x03443e7d, 0x0308475e, 0x035f3f7d, 0x01f8f3c5, 0x0032468e}}}, + {X: Field{[10]uint32{0x02333323, 0x027d1369, 0x02bf4747, 0x0071a3d2, 0x009cbbbc, 0x026136a1, 0x0020d605, 0x02efc0fc, 0x02383361, 0x000fb46d}}, Y: Field{[10]uint32{0x01d61ba3, 0x00ff122d, 0x037294b1, 0x02842de3, 0x02a9b728, 0x0223e4a7, 0x017c9896, 0x013b9d76, 0x01a48b5b, 0x003613cb}}}, + {X: Field{[10]uint32{0x023eb3fc, 0x018bb73e, 0x02398875, 0x02513643, 0x0277ee68, 0x02229bdf, 0x0246b408, 0x01aedddf, 0x00bb0a1b, 0x0034b372}}, Y: Field{[10]uint32{0x02d37564, 0x021f6cf7, 0x00927442, 0x02e4c42d, 0x02c1f217, 0x033e49bb, 0x01e95362, 0x018411b7, 0x02f9e5c5, 0x003154e2}}}, + {X: Field{[10]uint32{0x033980bf, 0x0015f52c, 0x000baf25, 0x00b94374, 0x0368a370, 0x00d23750, 0x006fd772, 0x020606e1, 0x02f06a75, 0x001c3f74}}, Y: Field{[10]uint32{0x00b75785, 0x03aa33a8, 0x00a5612e, 0x020e175d, 0x030a1035, 0x007b965a, 0x03a410d1, 0x021a5a55, 0x02c0d0d5, 0x0017b7f2}}}, + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + }, + { + {X: Field{[10]uint32{0x00e16070, 0x001eef31, 0x02915ddc, 0x000c7bf5, 0x03f2a182, 0x03559d50, 0x03a48e51, 0x01c10c4e, 0x017bdfcd, 0x0028c05a}}, Y: Field{[10]uint32{0x02177ea1, 0x03468107, 0x01a130c0, 0x03df0284, 0x031735db, 0x017503e6, 0x01809fa2, 0x0393d420, 0x011cfb67, 0x001cdc3e}}}, + {X: Field{[10]uint32{0x024ba5ae, 0x0080c5bc, 0x035d8114, 0x000130d2, 0x00b43965, 0x0382ffdd, 0x028d2419, 0x03c127cf, 0x019cff79, 0x0009f879}}, Y: Field{[10]uint32{0x003a45b3, 0x016ffba2, 0x023f784a, 0x029a6be9, 0x01df48a1, 0x031e77c1, 0x01b5e3cf, 0x038827b8, 0x02a6c804, 0x000c42c9}}}, + {X: Field{[10]uint32{0x038011fc, 0x0049c004, 0x00562670, 0x019eb5ca, 0x0183596a, 0x00880293, 0x02b13308, 0x03ac4455, 0x03a30815, 0x001ba0c4}}, Y: Field{[10]uint32{0x0315ab7d, 0x02da7e8f, 0x01f9a6ac, 0x016ba714, 0x0026af91, 0x0076b0c1, 0x0212db20, 0x03c81306, 0x018bdc24, 0x003051e0}}}, + {X: Field{[10]uint32{0x00aed7ae, 0x0245d727, 0x03b4f996, 0x037a13ef, 0x035a39ad, 0x024b5f93, 0x0188ec38, 0x012bb859, 0x03a5f686, 0x0031c4b9}}, Y: Field{[10]uint32{0x02156294, 0x00522a91, 0x0263784d, 0x01512c33, 0x01380d8e, 0x00477679, 0x02d4b823, 0x018ecd97, 0x01075163, 0x00125910}}}, + {X: Field{[10]uint32{0x000e6ba7, 0x01d26e34, 0x02f7f53a, 0x016d1245, 0x003d36ec, 0x0136786d, 0x011e038a, 0x02147caf, 0x01099784, 0x003e54aa}}, Y: Field{[10]uint32{0x0175e4c1, 0x02bbb940, 0x022b98db, 0x01ed318a, 0x02555716, 0x009fe83d, 0x01376a2e, 0x033afe18, 0x025b08ab, 0x00362a4e}}}, + {X: Field{[10]uint32{0x015b6f7e, 0x0127d716, 0x02021f95, 0x014f4e2c, 0x01beb32b, 0x00261db3, 0x02053aad, 0x028c320e, 0x011d04cd, 0x00296b1f}}, Y: Field{[10]uint32{0x02b19c84, 0x02edcc22, 0x00a4848d, 0x0183d606, 0x0399e391, 0x01f67b86, 0x00c3c924, 0x03d56cdb, 0x020ab540, 0x0037c2e2}}}, + {X: Field{[10]uint32{0x03aa0e93, 0x001968a0, 0x01f62690, 0x010ebbec, 0x028f2e39, 0x0367a24e, 0x00031a19, 0x03fb9d41, 0x015e31d3, 0x0025005b}}, Y: Field{[10]uint32{0x03addac2, 0x03b49a21, 0x0307a38e, 0x00eea95e, 0x03f48437, 0x03bb9bf5, 0x0355d354, 0x01365900, 0x02ee5c45, 0x0019d40c}}}, + {X: Field{[10]uint32{0x00a6db03, 0x00f87f91, 0x01d791b4, 0x01bd609d, 0x00b2c85d, 0x02e19d7f, 0x01c0d426, 0x008d7419, 0x0104a4b3, 0x0002ff01}}, Y: Field{[10]uint32{0x024b8542, 0x03234691, 0x00f0558a, 0x025cd175, 0x02374271, 0x0129b264, 0x038ec7f9, 0x03cd14fe, 0x027a6c34, 0x00065551}}}, + {X: Field{[10]uint32{0x0266b17b, 0x01218b80, 0x03b32b0f, 0x0288098a, 0x02023568, 0x02a7c270, 0x03978846, 0x02ca246e, 0x0174d59f, 0x003bc8b4}}, Y: Field{[10]uint32{0x01dac83e, 0x01b810de, 0x001b732a, 0x01bdc70d, 0x033ee727, 0x038d2841, 0x039ccc3a, 0x0131d5a3, 0x00c97ab2, 0x002f15e1}}}, + {X: Field{[10]uint32{0x034318b5, 0x00b150ba, 0x0045657f, 0x0204bd6e, 0x0272ed5c, 0x03c815fb, 0x0388a38d, 0x02343d55, 0x01fbe194, 0x0026217d}}, Y: Field{[10]uint32{0x0199175c, 0x01509505, 0x004af2fe, 0x03b59da4, 0x027c82ad, 0x01a33ae3, 0x012c4677, 0x0263e65b, 0x02f69ef1, 0x0004d7f5}}}, + {X: Field{[10]uint32{0x02d382a0, 0x00c056a4, 0x019ae231, 0x02f38bb3, 0x03f28dcb, 0x02cb7e49, 0x00acc780, 0x0224b4e7, 0x03ce4ceb, 0x002d7dfb}}, Y: Field{[10]uint32{0x01b4b532, 0x03c2aee9, 0x038c5ba2, 0x01b4a6b3, 0x0371fb09, 0x0032f774, 0x00957c6e, 0x03c8d4f0, 0x005b51c3, 0x001a10d5}}}, + {X: Field{[10]uint32{0x0281c1bc, 0x0292b933, 0x01b33b93, 0x03962aed, 0x03d25365, 0x01a339d9, 0x01815b8d, 0x00118d6b, 0x0305465c, 0x0000cd83}}, Y: Field{[10]uint32{0x026cbedd, 0x034a2595, 0x0150176d, 0x03ad7204, 0x03231728, 0x004c19d4, 0x0369c425, 0x0140053f, 0x01f90c57, 0x001f922d}}}, + {X: Field{[10]uint32{0x012cffa5, 0x02491910, 0x005c47e6, 0x00219a33, 0x0389ed42, 0x02f51890, 0x00754d8f, 0x0041d902, 0x03d2b2e7, 0x00073770}}, Y: Field{[10]uint32{0x0121954e, 0x01b62735, 0x03528ade, 0x0109acda, 0x02c41c98, 0x0250ac22, 0x01b126bf, 0x03e298ff, 0x020cb2f1, 0x000791da}}}, + {X: Field{[10]uint32{0x008993f7, 0x027dcd01, 0x03ce1150, 0x008fe09c, 0x02962552, 0x0322eb90, 0x034fbe1b, 0x0214458c, 0x006a56a3, 0x00021d4d}}, Y: Field{[10]uint32{0x02b9dcc2, 0x030b205c, 0x0018e601, 0x03c6c498, 0x03c9f4d4, 0x01d7e8a1, 0x02994e6e, 0x022c0c43, 0x00a8a2ef, 0x0001939b}}}, + {X: Field{[10]uint32{0x00a9f22f, 0x03f90e4d, 0x00e2ad35, 0x031485ea, 0x00cc0819, 0x01220d6c, 0x01f8b8b9, 0x03a4e7c8, 0x0359f25c, 0x000ab32c}}, Y: Field{[10]uint32{0x035c4927, 0x01772ced, 0x0150b7b7, 0x02fb16e9, 0x01154bd7, 0x037c3b7c, 0x0213a37e, 0x034b9464, 0x00e9588a, 0x00354629}}}, + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + }, + { + {X: Field{[10]uint32{0x03b04ed4, 0x02b18f8f, 0x03fffab7, 0x002c44c1, 0x0208cc33, 0x0099e378, 0x03f9d051, 0x02e4d918, 0x01b389d6, 0x00242b61}}, Y: Field{[10]uint32{0x036ef150, 0x03535232, 0x0094d991, 0x02f8560a, 0x0039aefa, 0x009c88ae, 0x03dcbd94, 0x020986bf, 0x023620a3, 0x0003941e}}}, + {X: Field{[10]uint32{0x03dc0151, 0x022c3b69, 0x03bad281, 0x039919c1, 0x017e125b, 0x0210978f, 0x00b1d154, 0x0101dfd1, 0x000ef8c9, 0x001f8b35}}, Y: Field{[10]uint32{0x00721ec7, 0x02f14e48, 0x0082c9a3, 0x0102bbb8, 0x01889bee, 0x0087be57, 0x0261a8b3, 0x03eace0a, 0x01082adc, 0x002416dd}}}, + {X: Field{[10]uint32{0x00b7b678, 0x0176ccec, 0x03816627, 0x0046f3d8, 0x02f13c43, 0x009adb1d, 0x0186bca4, 0x008c6e86, 0x017334e4, 0x00061b92}}, Y: Field{[10]uint32{0x00d91fc1, 0x001dbcbe, 0x035dca7a, 0x00951254, 0x02110772, 0x002df99f, 0x03fc825c, 0x02f612a9, 0x00e49807, 0x00303518}}}, + {X: Field{[10]uint32{0x0345e597, 0x000eb904, 0x03cf90e1, 0x03e76e14, 0x039c636b, 0x007bd4a9, 0x00975bbd, 0x036b3887, 0x012195be, 0x002851bd}}, Y: Field{[10]uint32{0x005a770a, 0x0159dabd, 0x014b0767, 0x02c887c2, 0x00ea67a5, 0x02ecc6d0, 0x0295dd2d, 0x03fac26b, 0x030ab053, 0x00296a66}}}, + {X: Field{[10]uint32{0x03421fb8, 0x01b972ec, 0x015d0cf0, 0x03cbbd69, 0x02984971, 0x00edc904, 0x0206b34c, 0x02fd8b9f, 0x01834f6d, 0x00018723}}, Y: Field{[10]uint32{0x023ccd80, 0x03bd9a13, 0x00dd2995, 0x012ce9bf, 0x00806713, 0x03817ad7, 0x01392590, 0x02d2deea, 0x02d99003, 0x001b7f1a}}}, + {X: Field{[10]uint32{0x03b9dc8f, 0x03226e12, 0x01333d08, 0x00fbd7b7, 0x01aba9e9, 0x0149e1f4, 0x00f70353, 0x01a19092, 0x01cee1c2, 0x003f6650}}, Y: Field{[10]uint32{0x019780d5, 0x03ab94f9, 0x0138d743, 0x03f7bbfa, 0x027872b2, 0x02221679, 0x0297e057, 0x039bd1b7, 0x0075bd40, 0x001e907b}}}, + {X: Field{[10]uint32{0x036b35a4, 0x012f862b, 0x03b48712, 0x029aac9f, 0x01889f37, 0x00ce9a2b, 0x03632407, 0x03944edc, 0x023a208e, 0x003da9ad}}, Y: Field{[10]uint32{0x01f422a6, 0x02dbfb20, 0x01862cae, 0x01b9d7b8, 0x0319d575, 0x0158061b, 0x02d3704f, 0x004e2c72, 0x00a8002d, 0x000f7df2}}}, + {X: Field{[10]uint32{0x00e45444, 0x02d4ff13, 0x004e20cb, 0x007bfb33, 0x00dbde42, 0x0096a045, 0x03bf9dab, 0x024ee6f3, 0x01a1cf19, 0x0034931d}}, Y: Field{[10]uint32{0x03dd4a57, 0x00c91a61, 0x02524cb9, 0x03d267c7, 0x02bf7593, 0x003969e2, 0x00b7d181, 0x0307473f, 0x012de84d, 0x00163f87}}}, + {X: Field{[10]uint32{0x02954c11, 0x0208fa29, 0x01018b96, 0x00f05583, 0x037fa8a4, 0x0141de3f, 0x00d1b0f1, 0x030dd888, 0x0028c286, 0x0021e8bf}}, Y: Field{[10]uint32{0x032a8b45, 0x038ccb89, 0x0124b756, 0x00fca9e0, 0x02cc4893, 0x00349d4c, 0x031948da, 0x03b3be5e, 0x018b45aa, 0x000ceb54}}}, + {X: Field{[10]uint32{0x03a43ddc, 0x006bfa61, 0x02e4aeeb, 0x0286a655, 0x0124282c, 0x039ef7d5, 0x001eb85e, 0x02b1b684, 0x03864946, 0x002a2c22}}, Y: Field{[10]uint32{0x03a2a6b8, 0x000720b7, 0x036c3870, 0x0114ac41, 0x00a325b4, 0x03c3a3b7, 0x01591ffd, 0x01a807cc, 0x028bc8a3, 0x001fc03f}}}, + {X: Field{[10]uint32{0x02706ab6, 0x01d1cab8, 0x03c0dae4, 0x00774b94, 0x023c0b34, 0x030e133f, 0x0156efcb, 0x02069a11, 0x02046e78, 0x003851cb}}, Y: Field{[10]uint32{0x0158de05, 0x021a85a7, 0x0127536e, 0x015514f3, 0x00aa589d, 0x0321887e, 0x03691978, 0x023f1a0f, 0x02aa47c5, 0x0020b364}}}, + {X: Field{[10]uint32{0x03963645, 0x0250cb0e, 0x031f8e3e, 0x0201f9c7, 0x032dcdb2, 0x038c4cbe, 0x034781a2, 0x0298f9b9, 0x014fb1b8, 0x00317c25}}, Y: Field{[10]uint32{0x008be2dd, 0x0221d3c0, 0x03e4edbf, 0x00ac011e, 0x02a33050, 0x009835f9, 0x023cb440, 0x02dbec62, 0x031021b0, 0x003554b4}}}, + {X: Field{[10]uint32{0x03a84fb6, 0x02b95081, 0x01021ebf, 0x01d43e85, 0x03c42368, 0x03922e7a, 0x00b4d601, 0x02bbd77a, 0x02c804f8, 0x00072be4}}, Y: Field{[10]uint32{0x03149109, 0x00606409, 0x0267616b, 0x01a5a8b3, 0x02ec1cc1, 0x03c40588, 0x01a64f8f, 0x0394e920, 0x005ac976, 0x002f092e}}}, + {X: Field{[10]uint32{0x01c8381f, 0x024c48fa, 0x011a753a, 0x0358e0f0, 0x000ed3d6, 0x013f8404, 0x02beb463, 0x025f38d3, 0x0355bc6d, 0x0037ceb3}}, Y: Field{[10]uint32{0x0347de3a, 0x03f5a588, 0x009e61af, 0x01f99f8e, 0x03b10195, 0x036b347a, 0x0099c1de, 0x01e9d698, 0x00ca5190, 0x001acf76}}}, + {X: Field{[10]uint32{0x02955911, 0x0233f852, 0x0152db76, 0x0289837b, 0x03107e16, 0x00f5e0e5, 0x009efe9b, 0x01943496, 0x0169af09, 0x001c16ff}}, Y: Field{[10]uint32{0x03d200e4, 0x01f1a4ff, 0x0272d8bb, 0x0148a90b, 0x02297f3b, 0x0150147e, 0x0263d81f, 0x03e6429f, 0x00130b73, 0x003852a9}}}, + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + }, + { + {X: Field{[10]uint32{0x02c4c0da, 0x02d11327, 0x023351b7, 0x01e1c8fa, 0x02e88c56, 0x0207c58b, 0x039c1ad9, 0x017cce48, 0x01d2f63b, 0x0023da2e}}, Y: Field{[10]uint32{0x001fff82, 0x032fde54, 0x00bfdf23, 0x03fa5544, 0x01bbea2c, 0x01af8857, 0x01d90c2b, 0x00e61b78, 0x032dba06, 0x00198aa7}}}, + {X: Field{[10]uint32{0x00f27076, 0x011f7e13, 0x03eaee68, 0x02b79d89, 0x01d89858, 0x03f66bd6, 0x02febe77, 0x020563f2, 0x02fd784e, 0x0013526b}}, Y: Field{[10]uint32{0x03aa781e, 0x002d9880, 0x018466b9, 0x0069f7d3, 0x006e0f2d, 0x016729bc, 0x023f2103, 0x0344d79c, 0x0059a10d, 0x00334cbf}}}, + {X: Field{[10]uint32{0x023809fa, 0x00ae3b74, 0x014be18e, 0x02cd4765, 0x00fd845c, 0x009147c2, 0x0293363f, 0x027c8a2e, 0x01be2e50, 0x000e0e07}}, Y: Field{[10]uint32{0x031fed52, 0x001d460c, 0x0324dbd7, 0x032ccb63, 0x003681fc, 0x0083ac73, 0x01405a55, 0x005f72c2, 0x010a0fb9, 0x003928cb}}}, + {X: Field{[10]uint32{0x01b62026, 0x02f2d5ca, 0x01d4ee8d, 0x03822274, 0x038d2a3d, 0x03d716a9, 0x016619e1, 0x01be14df, 0x039e85d5, 0x001d5914}}, Y: Field{[10]uint32{0x02ce0cf3, 0x00b23eb6, 0x01f33417, 0x036552de, 0x01684aac, 0x029c8a49, 0x031df524, 0x02cf1948, 0x01413749, 0x003075a1}}}, + {X: Field{[10]uint32{0x03c2a310, 0x01099225, 0x026303ea, 0x02950048, 0x01f186ae, 0x0291a668, 0x0121b82a, 0x00ab9bda, 0x0324e437, 0x00124989}}, Y: Field{[10]uint32{0x0227ded0, 0x006da057, 0x038ce0c4, 0x004a9d7f, 0x036d1636, 0x01c50c0e, 0x02cfa569, 0x02afe568, 0x0373bca7, 0x0004cdf9}}}, + {X: Field{[10]uint32{0x03663da4, 0x019b0640, 0x00b81f81, 0x02467d74, 0x03a5a362, 0x03112a8a, 0x008a6ed7, 0x01c179a0, 0x02356aa5, 0x001a9992}}, Y: Field{[10]uint32{0x03fc22c4, 0x00c4fecc, 0x004c9c28, 0x0049f9b0, 0x01089916, 0x01afc335, 0x0386ec19, 0x03a62ca7, 0x025954fd, 0x00112684}}}, + {X: Field{[10]uint32{0x02bd2d31, 0x012c1e73, 0x01b8d138, 0x015bfc1b, 0x004dcc1a, 0x011df8be, 0x02253b3e, 0x00324357, 0x028c1a24, 0x0038c195}}, Y: Field{[10]uint32{0x02546e44, 0x02d020e4, 0x03826692, 0x010af8dc, 0x02ffbc80, 0x03df436d, 0x00f2b107, 0x01098222, 0x03e37893, 0x0003ab1b}}}, + {X: Field{[10]uint32{0x03b4a278, 0x0136b355, 0x0082b536, 0x017c7fd0, 0x0078f61a, 0x02b67332, 0x006ff301, 0x009de59d, 0x017ad9df, 0x000842a4}}, Y: Field{[10]uint32{0x007b2231, 0x01c4ff43, 0x00bfc7f2, 0x006abfc8, 0x013789e6, 0x02359cdf, 0x039be81f, 0x0395ede8, 0x035450b5, 0x0019c386}}}, + {X: Field{[10]uint32{0x023136b0, 0x0030e78d, 0x01dd9c53, 0x0366aad0, 0x0374ebf8, 0x00fef58c, 0x01b0e762, 0x033bf09c, 0x000e2428, 0x000ee784}}, Y: Field{[10]uint32{0x00dbbc8a, 0x03b05bdb, 0x01f81953, 0x028ceb4c, 0x02a2ae28, 0x03d1d6c9, 0x01533eb8, 0x02edc77c, 0x00152d16, 0x003ebee6}}}, + {X: Field{[10]uint32{0x0190124e, 0x023ad4f7, 0x0085dea9, 0x01a14a07, 0x02c1e802, 0x036ce055, 0x029a1946, 0x015505df, 0x0293c06c, 0x001ebab2}}, Y: Field{[10]uint32{0x02021e31, 0x001e0408, 0x0104b3f5, 0x03e6e42a, 0x0159bc1b, 0x01b07654, 0x02caff04, 0x0243c13e, 0x03190c13, 0x0037eca6}}}, + {X: Field{[10]uint32{0x03485d3f, 0x023c11cb, 0x03eee960, 0x01a2041e, 0x0317ca07, 0x0177b7bd, 0x036ca80f, 0x0326a4ad, 0x0149712a, 0x002ec2ab}}, Y: Field{[10]uint32{0x00a2f975, 0x00e4940f, 0x00bffe79, 0x03e8c59c, 0x00895a5a, 0x00a5f68d, 0x00d201f7, 0x0151e63b, 0x0053c583, 0x003a9a67}}}, + {X: Field{[10]uint32{0x01ed815e, 0x01c0b541, 0x017b470f, 0x02af0700, 0x0166f440, 0x02551eb4, 0x035fad21, 0x0128cbae, 0x02c679f7, 0x00155a36}}, Y: Field{[10]uint32{0x00602df0, 0x02fd9300, 0x02151d9b, 0x03bb8960, 0x03eb05f7, 0x0341cfca, 0x00d6fe01, 0x02e99160, 0x00742788, 0x001ea17e}}}, + {X: Field{[10]uint32{0x02718dc9, 0x03b4ce8d, 0x023de4ae, 0x0136c044, 0x03e1e58b, 0x02bf8044, 0x028eb197, 0x03f30353, 0x02c8e4ee, 0x001e4242}}, Y: Field{[10]uint32{0x00fae7c5, 0x00c8ac47, 0x0008b963, 0x02dc2ea4, 0x02dd36af, 0x0366aa95, 0x01816cbc, 0x016e3c4f, 0x022b9190, 0x003aaadc}}}, + {X: Field{[10]uint32{0x0244a0c8, 0x0306f70b, 0x01932abe, 0x0100bb8a, 0x032c9be7, 0x031d0db0, 0x01bae600, 0x0250f2f2, 0x02884807, 0x001807a7}}, Y: Field{[10]uint32{0x0200e557, 0x024d04ae, 0x02659547, 0x0169ad1b, 0x01424e0c, 0x03feaeec, 0x00b8cfa9, 0x023b31c5, 0x02aa6fdc, 0x00169e88}}}, + {X: Field{[10]uint32{0x0360c7d1, 0x025a531f, 0x01ad2a26, 0x039f35dd, 0x028dd71d, 0x01526e99, 0x003dbbce, 0x01ed5470, 0x01ade9f9, 0x0039df20}}, Y: Field{[10]uint32{0x02d72449, 0x01607ca0, 0x006d34ec, 0x03dc70a6, 0x03631470, 0x03aa0550, 0x03c3b323, 0x004c8717, 0x0078eef8, 0x000eb3c5}}}, + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + }, + { + {X: Field{[10]uint32{0x03231e11, 0x01bf5414, 0x01e3e668, 0x01940da0, 0x011f48e8, 0x02630d82, 0x0399ff91, 0x0217597f, 0x030176af, 0x00393cfe}}, Y: Field{[10]uint32{0x03eb73bc, 0x030e15db, 0x011c9822, 0x013b2547, 0x006cc7e7, 0x0280adca, 0x021a6d0e, 0x013c7059, 0x033ad0ef, 0x000798d8}}}, + {X: Field{[10]uint32{0x03cdaf2f, 0x03b888ce, 0x032953bf, 0x02096e85, 0x0388531a, 0x02f6cd8b, 0x0064110a, 0x01cf807b, 0x03b76867, 0x0012cc32}}, Y: Field{[10]uint32{0x0126b5b7, 0x00cf518f, 0x00575680, 0x020790d2, 0x011fdf3c, 0x01f0f12a, 0x01e2c577, 0x018a6dbe, 0x010265bb, 0x001d318d}}}, + {X: Field{[10]uint32{0x03f05bd6, 0x027c139a, 0x01946539, 0x000c84aa, 0x00a2f56e, 0x02d1c37b, 0x032f51fe, 0x013fa420, 0x0241bee4, 0x0024030c}}, Y: Field{[10]uint32{0x000d358b, 0x00ab4efc, 0x03b15de5, 0x0160f13b, 0x01d69853, 0x01c2c90e, 0x01c72045, 0x03c3d7e5, 0x01e8e8b1, 0x001b0c7e}}}, + {X: Field{[10]uint32{0x0273059f, 0x03a70a69, 0x03a192ff, 0x01414383, 0x03ec1171, 0x01d19205, 0x015b20b1, 0x01c03734, 0x00aa7ae1, 0x0032ed0d}}, Y: Field{[10]uint32{0x027c070c, 0x02a59088, 0x03845b7d, 0x013c2b57, 0x0141d45e, 0x022d77eb, 0x02d49233, 0x02f45d58, 0x000ab4da, 0x00128688}}}, + {X: Field{[10]uint32{0x03105c50, 0x030a3327, 0x005257a7, 0x03bdec4e, 0x0182e0de, 0x00f08cf3, 0x028cc340, 0x0242ab58, 0x0362ab05, 0x0016a340}}, Y: Field{[10]uint32{0x00a4cde9, 0x02c8060e, 0x013c35c9, 0x02299b40, 0x00a605f6, 0x0050ffdd, 0x02a6b724, 0x0394da4d, 0x02b113d4, 0x0030167a}}}, + {X: Field{[10]uint32{0x032e294d, 0x03ecbde9, 0x00dd5be6, 0x028fc034, 0x02f158eb, 0x037dfb71, 0x02289eae, 0x00d2e469, 0x00805cd5, 0x000a77f9}}, Y: Field{[10]uint32{0x00469b52, 0x00dc983b, 0x02e69441, 0x0070e4a7, 0x01d1f196, 0x02281793, 0x0034e758, 0x01cb866d, 0x0026d006, 0x002fd9b6}}}, + {X: Field{[10]uint32{0x02d64feb, 0x03862e6c, 0x0292c647, 0x02964a48, 0x003772f8, 0x01b2e93a, 0x02f3a577, 0x03d82923, 0x01031232, 0x00364fd3}}, Y: Field{[10]uint32{0x00698359, 0x03ef564d, 0x00da37b0, 0x002fbb24, 0x0193e043, 0x01372313, 0x037311c5, 0x009cce88, 0x015d45cb, 0x001e4955}}}, + {X: Field{[10]uint32{0x02de12c0, 0x01e1b841, 0x010e94d4, 0x03161d18, 0x006d9cda, 0x0155c913, 0x02d7b1e7, 0x00b07341, 0x016d9c10, 0x003d1e01}}, Y: Field{[10]uint32{0x025361fe, 0x01db39b2, 0x012d769a, 0x03d826ae, 0x0026c17e, 0x001a1a53, 0x00095e01, 0x00e51b9a, 0x0210f33e, 0x001fc279}}}, + {X: Field{[10]uint32{0x039fbc84, 0x00813350, 0x02016722, 0x0245815e, 0x037e7062, 0x018ab196, 0x014e2bc6, 0x00a1106c, 0x01c6e36f, 0x000bc1da}}, Y: Field{[10]uint32{0x00201bec, 0x0240b787, 0x015d73fb, 0x01a93137, 0x01cca79b, 0x02438852, 0x01df0079, 0x02f777e9, 0x03724d73, 0x002d0d3c}}}, + {X: Field{[10]uint32{0x0026dea2, 0x02cbf4b4, 0x005d8928, 0x0114b167, 0x0187c84c, 0x0269b758, 0x01a1e26d, 0x02efef5c, 0x0248d561, 0x0007773e}}, Y: Field{[10]uint32{0x003de522, 0x0121cf46, 0x0273406f, 0x02314701, 0x00666fd6, 0x0100b008, 0x03ea34d6, 0x00e9f507, 0x001fa992, 0x0031be90}}}, + {X: Field{[10]uint32{0x02a758ea, 0x01fab321, 0x019c4d53, 0x006249fc, 0x01911883, 0x01505b8e, 0x006895a1, 0x000c2656, 0x0380559e, 0x003f9f99}}, Y: Field{[10]uint32{0x037ab649, 0x008b6576, 0x020d1e4f, 0x001d10c4, 0x033b8017, 0x02124947, 0x0008e169, 0x0372e623, 0x0167a281, 0x000e2a9a}}}, + {X: Field{[10]uint32{0x033773f7, 0x03c011b0, 0x019953c7, 0x034d16d6, 0x0150d44f, 0x0278dca8, 0x01410c00, 0x008db4f8, 0x0226f5dd, 0x000d56cc}}, Y: Field{[10]uint32{0x0087c182, 0x00f0ffc6, 0x01109005, 0x01e33389, 0x001e25df, 0x03487f2e, 0x0310eedd, 0x000eb527, 0x00807047, 0x00023b29}}}, + {X: Field{[10]uint32{0x00fffefa, 0x005589a3, 0x01afade7, 0x013dc194, 0x01101804, 0x0030ebe1, 0x01f6f915, 0x00c49f5b, 0x01ca7538, 0x00246ebd}}, Y: Field{[10]uint32{0x037f6faf, 0x00dbcd37, 0x0303dc7d, 0x00439bf4, 0x02f4bef3, 0x01f74f64, 0x01969f12, 0x02f3af97, 0x03119347, 0x00013973}}}, + {X: Field{[10]uint32{0x00785491, 0x037d01a4, 0x025d1dd3, 0x01792baa, 0x035291de, 0x00be19ad, 0x019f43cb, 0x002eb958, 0x00f17f26, 0x0024ac78}}, Y: Field{[10]uint32{0x00be555b, 0x0234d816, 0x00d7b9c9, 0x01df88a2, 0x003985fb, 0x00d396b4, 0x027c1d10, 0x02798f85, 0x00028d8d, 0x00207b11}}}, + {X: Field{[10]uint32{0x0133c546, 0x00245fa3, 0x01af32fc, 0x02cca17b, 0x0382575f, 0x003d7775, 0x02c5373e, 0x01e29f2c, 0x0121cb3f, 0x00111610}}, Y: Field{[10]uint32{0x000b4fd4, 0x01b461c0, 0x0273660a, 0x00f3ecb2, 0x00852f0a, 0x0246b688, 0x0225eae3, 0x01d4e9dc, 0x0377f3f8, 0x000c2364}}}, + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + }, + { + {X: Field{[10]uint32{0x00eae29e, 0x02dbab88, 0x01d0716f, 0x00bc3538, 0x02c7034f, 0x01169099, 0x0161537a, 0x03ccc7ae, 0x029b18eb, 0x0023003e}}, Y: Field{[10]uint32{0x0302414b, 0x00a93199, 0x02c54e7d, 0x03ea078d, 0x00c2fada, 0x01cdb25d, 0x01c343a3, 0x008686a7, 0x0267fea5, 0x003be91c}}}, + {X: Field{[10]uint32{0x018ada5f, 0x0326ac30, 0x02fb3e84, 0x01fca448, 0x03fd7e29, 0x00daf87b, 0x03b5bf96, 0x02d1bea2, 0x00176da2, 0x000933f0}}, Y: Field{[10]uint32{0x038a586b, 0x02984e65, 0x014f268f, 0x028693e0, 0x03ed959c, 0x037b6a49, 0x028714d5, 0x01869a61, 0x03bb079c, 0x003affe3}}}, + {X: Field{[10]uint32{0x03fd913d, 0x025580fa, 0x009eac3f, 0x039bb953, 0x0050a680, 0x030aa348, 0x0107a084, 0x0377e1d3, 0x02a7e907, 0x000d8d8a}}, Y: Field{[10]uint32{0x012e243d, 0x03e6bab1, 0x03aafc44, 0x00435acb, 0x02d830bb, 0x00368aa0, 0x01624437, 0x02bf54d0, 0x00676cb8, 0x00123c9e}}}, + {X: Field{[10]uint32{0x00679da2, 0x00c62565, 0x017edf10, 0x01ff1fc1, 0x0216ddd6, 0x004a4bb1, 0x02ded72a, 0x02f20ba8, 0x0158d4b9, 0x0000129f}}, Y: Field{[10]uint32{0x039ffe26, 0x01fd211d, 0x0228a487, 0x025258fe, 0x0371c3b4, 0x03b1c6ce, 0x031d8147, 0x032dd79a, 0x01b76702, 0x002e62b1}}}, + {X: Field{[10]uint32{0x01132896, 0x02eafe6b, 0x02c967ca, 0x02eadef1, 0x01fcb1e3, 0x03764803, 0x015ad962, 0x00780bca, 0x036df32a, 0x001121e5}}, Y: Field{[10]uint32{0x03685248, 0x0006c4ab, 0x02a7a48c, 0x016989da, 0x0306b40d, 0x0115868c, 0x009a9077, 0x02bf87bf, 0x0060d115, 0x0009ef56}}}, + {X: Field{[10]uint32{0x035732c0, 0x021934dd, 0x037aa859, 0x039c8cdd, 0x02202fe5, 0x032c425b, 0x00a5d1b7, 0x012e6d89, 0x0331f8b7, 0x0023cf33}}, Y: Field{[10]uint32{0x01b9415b, 0x02f79799, 0x00825e73, 0x01dd5216, 0x00a90e68, 0x01f394f6, 0x02f46d99, 0x0394c627, 0x013e2d39, 0x0019fc73}}}, + {X: Field{[10]uint32{0x03a2670c, 0x0055bdaf, 0x033e6e08, 0x00ae8189, 0x007400f8, 0x00cd40c9, 0x02a9caa8, 0x020de22d, 0x02c28bcb, 0x0012934e}}, Y: Field{[10]uint32{0x02c1764d, 0x02e7ff75, 0x03eed808, 0x0132fca6, 0x01493059, 0x03bc0ae7, 0x027711dd, 0x01693c5f, 0x011c0184, 0x001c2aee}}}, + {X: Field{[10]uint32{0x007c4b65, 0x00d3ab72, 0x032a9ccf, 0x0228781e, 0x0196f880, 0x0019b392, 0x036c5e2c, 0x00071ff1, 0x01c4cbd0, 0x003b9f5a}}, Y: Field{[10]uint32{0x0136a95a, 0x023d13b4, 0x002e523e, 0x0266eba5, 0x02c33e89, 0x00c3cbb8, 0x0192abf0, 0x004e0868, 0x026ec1a4, 0x003b3218}}}, + {X: Field{[10]uint32{0x00b24aa7, 0x01abf893, 0x01c530d9, 0x0318e4d1, 0x00903108, 0x03fe3f86, 0x02e6fd89, 0x00600b0e, 0x01190ae9, 0x0017decb}}, Y: Field{[10]uint32{0x02693d7d, 0x0201d0d2, 0x01d0c6d7, 0x01c24f20, 0x03ce8deb, 0x03399f11, 0x023f80a3, 0x03caccc2, 0x0200c4fd, 0x0001dc0d}}}, + {X: Field{[10]uint32{0x03004130, 0x018cb5ff, 0x02b09842, 0x00ce070d, 0x0249fd86, 0x01532d6a, 0x02a14e52, 0x0061ac99, 0x01b5f72d, 0x001435dd}}, Y: Field{[10]uint32{0x036e406d, 0x02e31937, 0x024c3456, 0x0117bbda, 0x032975d9, 0x0004018f, 0x01724346, 0x02955f14, 0x023b0f4e, 0x000d007b}}}, + {X: Field{[10]uint32{0x037fb8bd, 0x006f17cb, 0x0090a419, 0x02857f90, 0x007bc464, 0x025221b6, 0x02c24e6d, 0x024340ab, 0x0051339d, 0x00144e5d}}, Y: Field{[10]uint32{0x03908c0f, 0x012b0b60, 0x00d5a809, 0x034f8fe6, 0x03fafc32, 0x03a05711, 0x008fefda, 0x00efcd2e, 0x003e4764, 0x003f35c5}}}, + {X: Field{[10]uint32{0x00889f3f, 0x007e0e4d, 0x01da7f2a, 0x022d1425, 0x03c4feb2, 0x005a6c3a, 0x02a3469b, 0x00465887, 0x0026f1b2, 0x0021e644}}, Y: Field{[10]uint32{0x03bb792b, 0x00b7e6f0, 0x0037b49e, 0x006fca18, 0x01e932f6, 0x005fc9e7, 0x032f2cb7, 0x00765884, 0x014ca5a9, 0x00377aae}}}, + {X: Field{[10]uint32{0x0236ca73, 0x01d2457b, 0x033ede2b, 0x034daeef, 0x03eac864, 0x03c05221, 0x0029112b, 0x037ee2a9, 0x02d62bfb, 0x0033e0c5}}, Y: Field{[10]uint32{0x02c25534, 0x0248650b, 0x0310f5b4, 0x02636235, 0x001c9615, 0x0037329a, 0x00445089, 0x0275cf8e, 0x018deb5d, 0x00027fad}}}, + {X: Field{[10]uint32{0x019c8f0a, 0x036611af, 0x00e64afc, 0x00b22f61, 0x00af3e9f, 0x0300ea1f, 0x0126603b, 0x02913f0e, 0x00ed297b, 0x001b8845}}, Y: Field{[10]uint32{0x016a2c9b, 0x02452374, 0x0195ebd7, 0x01d743e5, 0x01090bec, 0x00317647, 0x026d50f8, 0x001b89f6, 0x020cc26f, 0x00015646}}}, + {X: Field{[10]uint32{0x0352f97d, 0x024df5ad, 0x036613c8, 0x031d7cd1, 0x025a2efb, 0x0233e985, 0x039d2866, 0x02d27794, 0x029a4c4b, 0x00218437}}, Y: Field{[10]uint32{0x031b1af2, 0x01f73507, 0x003e0805, 0x027d5155, 0x0257ab4d, 0x014cfe67, 0x03cd99b2, 0x002ef24d, 0x03a02b63, 0x0034c665}}}, + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + }, + { + {X: Field{[10]uint32{0x00cb3e41, 0x03f77f18, 0x012c0997, 0x013cc22e, 0x03143d08, 0x027a63b4, 0x010cec0a, 0x020a7cf8, 0x00e69dd4, 0x0039e89b}}, Y: Field{[10]uint32{0x032cfd51, 0x02a50873, 0x003e20e8, 0x0301083a, 0x00d0a6b2, 0x02abeec6, 0x01b006a1, 0x02612d1c, 0x02300fa7, 0x000a9d63}}}, + {X: Field{[10]uint32{0x034ae861, 0x0396e45e, 0x02fa9d97, 0x03935b8c, 0x01203c35, 0x01c8227d, 0x038bfb67, 0x03e34034, 0x02ba036b, 0x003d72be}}, Y: Field{[10]uint32{0x0182239c, 0x0308e703, 0x005f3cc9, 0x027154bc, 0x019b3b2a, 0x01020e45, 0x03f99046, 0x01b605ef, 0x038a022a, 0x00067a0e}}}, + {X: Field{[10]uint32{0x02ee42db, 0x027f4afe, 0x0314a70f, 0x016d1cc1, 0x01d9bbbc, 0x007b2ff0, 0x03b6edb9, 0x024543f1, 0x03e7d9b5, 0x00330d09}}, Y: Field{[10]uint32{0x01d87bdb, 0x00a70045, 0x0022dc62, 0x02b639c9, 0x0010e5cb, 0x02c85480, 0x01e3fd3f, 0x031a8621, 0x0041a521, 0x003a8926}}}, + {X: Field{[10]uint32{0x012a9651, 0x035335ef, 0x0182084f, 0x02712532, 0x028f9e50, 0x01fa0150, 0x01f5156d, 0x00fc7c4b, 0x0024ceb6, 0x003a4e24}}, Y: Field{[10]uint32{0x02786824, 0x0378add7, 0x00bfefef, 0x033b19dc, 0x018d7110, 0x019c6abc, 0x0287abaf, 0x019657e4, 0x00872372, 0x0021921a}}}, + {X: Field{[10]uint32{0x02d4a086, 0x00d9b19f, 0x0010eff4, 0x00563a71, 0x00b1d75c, 0x02f2d73d, 0x003c585f, 0x011177b2, 0x01bacd98, 0x002523c1}}, Y: Field{[10]uint32{0x022bca4b, 0x006003e7, 0x022d1a2a, 0x029c70fe, 0x011c2328, 0x00044e50, 0x03450a66, 0x00a8ce0b, 0x009ffb5a, 0x0021932a}}}, + {X: Field{[10]uint32{0x0296e4f1, 0x029c594b, 0x00030cb0, 0x01802ba0, 0x02ff5f01, 0x00d7bf32, 0x01777083, 0x0065f880, 0x008f0198, 0x0015aec5}}, Y: Field{[10]uint32{0x02b0582e, 0x027c067b, 0x030eb588, 0x0348012b, 0x037313d1, 0x038c3aa7, 0x0303ed8b, 0x0028cefa, 0x00a56130, 0x00282561}}}, + {X: Field{[10]uint32{0x03542c21, 0x02fa9b2d, 0x00c15c0c, 0x034a3a99, 0x03ae19f4, 0x01475b50, 0x016fc454, 0x026b2419, 0x01629291, 0x00096106}}, Y: Field{[10]uint32{0x032bfabf, 0x02f8c659, 0x02d7b3be, 0x021b930a, 0x01f3e3a1, 0x031d44f5, 0x025daa4c, 0x00912007, 0x031f1cdb, 0x003f2cd6}}}, + {X: Field{[10]uint32{0x00ddab8b, 0x03506b9f, 0x00e6fcf2, 0x00494f1a, 0x039f0e4d, 0x020b430d, 0x0116900d, 0x0095afb4, 0x01d87829, 0x00099156}}, Y: Field{[10]uint32{0x001de473, 0x0192d140, 0x031e6c9f, 0x02bce72b, 0x037a8631, 0x00d01cb5, 0x03bc6370, 0x0144b3bd, 0x011926d3, 0x001e796f}}}, + {X: Field{[10]uint32{0x001ecbf8, 0x01187d03, 0x017ca43c, 0x037a6bbb, 0x036489f0, 0x007a1087, 0x029754cc, 0x0314948a, 0x01c41373, 0x001f84b3}}, Y: Field{[10]uint32{0x00bed615, 0x016e336c, 0x019f59d4, 0x00763f87, 0x01c969f6, 0x03934496, 0x03f94dab, 0x0320dc50, 0x0388888d, 0x001c4a13}}}, + {X: Field{[10]uint32{0x018a26c1, 0x028a3ee2, 0x0304ae2d, 0x0285ce4e, 0x019a954f, 0x0309b871, 0x02351579, 0x014aedba, 0x00fd373b, 0x002da832}}, Y: Field{[10]uint32{0x0278217c, 0x0143b6a2, 0x01a06f55, 0x03a162ad, 0x00fc94a5, 0x02f69feb, 0x0101e3fe, 0x01d2526a, 0x03bfda03, 0x0017bc64}}}, + {X: Field{[10]uint32{0x00557d86, 0x01994705, 0x03ff417e, 0x011e3999, 0x031cfeec, 0x028169b3, 0x02b91ca7, 0x010a99dc, 0x02ff2a37, 0x0012e3b0}}, Y: Field{[10]uint32{0x01167eb9, 0x026c646d, 0x03692bdd, 0x03bc3f0f, 0x0328d5f2, 0x0149eb17, 0x024072de, 0x015eac52, 0x03ff04c1, 0x003f79b0}}}, + {X: Field{[10]uint32{0x01f23d1f, 0x015fd660, 0x036d8a4c, 0x035c8300, 0x02b6b25f, 0x03f62829, 0x03d489e1, 0x002eeef4, 0x00153d67, 0x002ce63a}}, Y: Field{[10]uint32{0x032ff3fc, 0x00faffe0, 0x016cd158, 0x022b4985, 0x02ea791d, 0x02c02e94, 0x037feb2f, 0x03d1fc1f, 0x0022572d, 0x001a7d67}}}, + {X: Field{[10]uint32{0x0380763c, 0x020b4ed1, 0x0291d52b, 0x017a4995, 0x025f8a6d, 0x025eb01f, 0x02436dc6, 0x00e9094c, 0x01073396, 0x003f3570}}, Y: Field{[10]uint32{0x00e851cb, 0x039d080e, 0x023a4b54, 0x00b9c591, 0x00b119b2, 0x03dcb8e3, 0x0320db35, 0x00b118ed, 0x03e2e552, 0x0006376a}}}, + {X: Field{[10]uint32{0x03e9fc8d, 0x0311e98c, 0x028ad2b1, 0x0026093c, 0x0348b848, 0x0118c69c, 0x00d0b205, 0x0177fe9b, 0x01c1bb42, 0x0018d283}}, Y: Field{[10]uint32{0x033f87b6, 0x01fcc2c9, 0x00616958, 0x02863b57, 0x03519ad5, 0x03792a73, 0x0205a657, 0x012db2bf, 0x021fe75a, 0x0035d6f8}}}, + {X: Field{[10]uint32{0x018ef686, 0x00ef8c17, 0x02e66bce, 0x03d0089c, 0x03f68e48, 0x02099b94, 0x038a5daf, 0x032f9488, 0x00ee5843, 0x002403cb}}, Y: Field{[10]uint32{0x0121a8cf, 0x029259f8, 0x016d5073, 0x03d0f245, 0x00596cdf, 0x00d27444, 0x01c551b1, 0x01096b58, 0x0155ec60, 0x001ccab0}}}, + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + }, + { + {X: Field{[10]uint32{0x026b80ef, 0x00a7acf7, 0x0024f3cf, 0x0259f5e5, 0x0171cbcb, 0x00ef2f71, 0x03540c22, 0x00bb2348, 0x020ee366, 0x002d9167}}, Y: Field{[10]uint32{0x0271ba45, 0x02fc2d86, 0x01b2ff30, 0x01b5238d, 0x03c4b3ae, 0x0159876c, 0x01adf16e, 0x0381b787, 0x036d06f3, 0x00019f21}}}, + {X: Field{[10]uint32{0x033eb51f, 0x03bcdd40, 0x00211253, 0x01daf9e7, 0x03b68905, 0x007d0564, 0x0136f730, 0x00f22393, 0x00f0d982, 0x0039763a}}, Y: Field{[10]uint32{0x0262a2d9, 0x016f6596, 0x0354979d, 0x011b67c3, 0x00e509dc, 0x023fbbbc, 0x0316a57d, 0x00f812ae, 0x01b7861e, 0x0013707a}}}, + {X: Field{[10]uint32{0x019888e9, 0x033c9e4c, 0x00a8b439, 0x01afc912, 0x033d12ba, 0x0259a059, 0x0260d302, 0x029b8b77, 0x02773ac3, 0x0007e43a}}, Y: Field{[10]uint32{0x03113b79, 0x037f25fb, 0x022e656f, 0x03fb9654, 0x00213751, 0x007ae5aa, 0x00153d27, 0x02843a56, 0x027c15da, 0x00226f8d}}}, + {X: Field{[10]uint32{0x03155e64, 0x019d9203, 0x0011737a, 0x013ea28c, 0x01ab66be, 0x006eb837, 0x02b0f732, 0x0230f715, 0x03f77dbc, 0x002a7289}}, Y: Field{[10]uint32{0x021b3297, 0x03cccf15, 0x030ae1f3, 0x02086f2b, 0x00875d41, 0x0300b401, 0x017d2246, 0x00535346, 0x035678fb, 0x003d2ecc}}}, + {X: Field{[10]uint32{0x0162222c, 0x03bedbcd, 0x032c6085, 0x01e6479b, 0x02de0344, 0x00d2d4ae, 0x0302bad3, 0x0382b5b9, 0x014dedff, 0x0004e939}}, Y: Field{[10]uint32{0x00200145, 0x0059a32a, 0x004c08cb, 0x01deb724, 0x02d4f9c5, 0x03582694, 0x00ac2f81, 0x03a04ecb, 0x014e5816, 0x0032759f}}}, + {X: Field{[10]uint32{0x01bf6c42, 0x02acf770, 0x0075393e, 0x026c4662, 0x02f7793d, 0x01b3b9d3, 0x03465481, 0x00171fb9, 0x033cd6c1, 0x00340b86}}, Y: Field{[10]uint32{0x03bc54cc, 0x018ca3e1, 0x02aac133, 0x026e4c6d, 0x02bca587, 0x00349149, 0x0332270d, 0x00896049, 0x00f3ca8e, 0x002682dd}}}, + {X: Field{[10]uint32{0x003b46bb, 0x0393703d, 0x02525437, 0x018feb24, 0x0112ed3a, 0x0211576f, 0x0007c05d, 0x02ab7475, 0x02bf233c, 0x00186647}}, Y: Field{[10]uint32{0x0020a848, 0x03d64073, 0x00d8ef48, 0x027294bb, 0x011ca872, 0x01beeb7c, 0x02f38716, 0x03924a54, 0x0308f3fd, 0x00007178}}}, + {X: Field{[10]uint32{0x02ee247c, 0x02f18a75, 0x00ee06d4, 0x0211fd47, 0x011f478e, 0x0073f9d6, 0x03a10561, 0x035fc97a, 0x01800686, 0x001a3edc}}, Y: Field{[10]uint32{0x0201865d, 0x03e08b46, 0x03c9dae1, 0x002c131c, 0x039a8d58, 0x0006c301, 0x03354275, 0x0258d9cd, 0x023462dd, 0x003344b4}}}, + {X: Field{[10]uint32{0x021add3b, 0x02f8f774, 0x03d8f7e5, 0x013d15c9, 0x018b9a94, 0x03458984, 0x0039cdb0, 0x034e1d24, 0x02a4b787, 0x003a89eb}}, Y: Field{[10]uint32{0x028ce7dd, 0x038a476d, 0x01be71b5, 0x035a3938, 0x0278b212, 0x00970bd8, 0x023ceb23, 0x005f795c, 0x01e6e42a, 0x0031c3fc}}}, + {X: Field{[10]uint32{0x02da1f54, 0x016af6f8, 0x025df934, 0x03088c50, 0x021b2b52, 0x024d1445, 0x03550ab1, 0x0183ae61, 0x03b23df2, 0x001c4dfd}}, Y: Field{[10]uint32{0x01c3edbc, 0x02350db3, 0x01bb84af, 0x03551b3f, 0x03ebf081, 0x03c98029, 0x00dacb17, 0x0201d397, 0x02d80435, 0x0017f9e2}}}, + {X: Field{[10]uint32{0x011ff757, 0x02be2ed8, 0x0226e6e8, 0x01d07130, 0x029b4ce9, 0x01b8adb6, 0x01010f8b, 0x03f552ea, 0x01356b7f, 0x00165194}}, Y: Field{[10]uint32{0x014d031a, 0x019bb2a2, 0x03e3b28a, 0x01edfeff, 0x01961bbc, 0x017101be, 0x02038d01, 0x009d4010, 0x020ce5df, 0x000d844d}}}, + {X: Field{[10]uint32{0x036c15c2, 0x03d1fc63, 0x00f1ca1e, 0x005323ce, 0x003de764, 0x027450d2, 0x01739813, 0x01d5ffa8, 0x0052bca1, 0x002115aa}}, Y: Field{[10]uint32{0x03174134, 0x03bf0ca2, 0x03671ff1, 0x002615be, 0x034cc90f, 0x0041e79f, 0x0349ec37, 0x00b37bf4, 0x0246d484, 0x00386e76}}}, + {X: Field{[10]uint32{0x036160b5, 0x009628d8, 0x02bc0676, 0x0091c39f, 0x00ccc53f, 0x000247b0, 0x003af797, 0x00ca43a1, 0x023915f7, 0x0005ac9b}}, Y: Field{[10]uint32{0x00a1dc0e, 0x0097efd6, 0x03ef8146, 0x02b1c2e8, 0x00e1363a, 0x018d9535, 0x03643524, 0x03be2ed8, 0x025a6302, 0x000183d5}}}, + {X: Field{[10]uint32{0x021b793e, 0x0077a4e3, 0x025183d6, 0x028ac34b, 0x01d36aee, 0x033eab93, 0x002eccf2, 0x00739970, 0x017c9835, 0x0013c545}}, Y: Field{[10]uint32{0x03ba9889, 0x03307f70, 0x007aab4f, 0x012cd529, 0x02c0daff, 0x03352833, 0x01da9db9, 0x02e4e7f2, 0x0366079d, 0x00302538}}}, + {X: Field{[10]uint32{0x03b32db8, 0x0134a24d, 0x0391f396, 0x0127d91d, 0x01c91ed7, 0x010b3aa1, 0x02a143c8, 0x027e4c6f, 0x0295c455, 0x000092d4}}, Y: Field{[10]uint32{0x0264f760, 0x0153eaaa, 0x001a9594, 0x0044816e, 0x0062ab68, 0x031796fa, 0x02e2821c, 0x00c271ed, 0x038f5bff, 0x001827fb}}}, + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + }, + { + {X: Field{[10]uint32{0x016943e8, 0x0283d6d2, 0x005a5ded, 0x0319f9cf, 0x031d6f1f, 0x0063c188, 0x03234aa1, 0x02e101e4, 0x00c8280b, 0x0035a2a0}}, Y: Field{[10]uint32{0x03133120, 0x0321099a, 0x0295a294, 0x023de114, 0x035b0e7b, 0x01ec38a2, 0x00b1f917, 0x021b4031, 0x01fff4b5, 0x0036e2ea}}}, + {X: Field{[10]uint32{0x0012b6fd, 0x02888b29, 0x02b828bd, 0x00f1bdc0, 0x00aced05, 0x01d48dcf, 0x02f8efb3, 0x0102f900, 0x009c677a, 0x003c5a90}}, Y: Field{[10]uint32{0x00a052da, 0x036b9dfb, 0x03ca4268, 0x0164927a, 0x02165406, 0x0138c393, 0x026a75a7, 0x009e675e, 0x01171453, 0x000a904c}}}, + {X: Field{[10]uint32{0x00a1c4f9, 0x010aa863, 0x0228235b, 0x00d32adf, 0x004f4efe, 0x0187c5bd, 0x000b83da, 0x01ca3131, 0x038f22bd, 0x001e057d}}, Y: Field{[10]uint32{0x0378bc15, 0x007a8dad, 0x011e19ab, 0x039855df, 0x015cb42d, 0x011630d7, 0x0193cf31, 0x02bda9f7, 0x01e8cd39, 0x00307180}}}, + {X: Field{[10]uint32{0x026dd4e4, 0x0282db8c, 0x018325c1, 0x00bdafb6, 0x01b89f4f, 0x025dbe13, 0x0237f699, 0x01bd0bef, 0x0106ab76, 0x0010552d}}, Y: Field{[10]uint32{0x035ded1c, 0x0164a541, 0x02dd46c8, 0x03674788, 0x02414ea9, 0x004097fd, 0x006e44d6, 0x02622253, 0x035043c5, 0x0008eb41}}}, + {X: Field{[10]uint32{0x028c8530, 0x01b870fb, 0x00d8e6d2, 0x0207be3d, 0x01512df6, 0x005a9b1b, 0x0377c640, 0x01005db8, 0x03cda0ec, 0x0030e49c}}, Y: Field{[10]uint32{0x018446c7, 0x00c3c3de, 0x01715c40, 0x02f68bbb, 0x0050edfc, 0x0070c666, 0x001d3944, 0x00f23a74, 0x02425743, 0x0023106f}}}, + {X: Field{[10]uint32{0x03ed5996, 0x0133a2d0, 0x02f53bde, 0x01664d82, 0x006831fe, 0x00a06e49, 0x02fbc903, 0x0293a924, 0x03e9fe99, 0x000691ad}}, Y: Field{[10]uint32{0x00c85cae, 0x013b447a, 0x0345c2ee, 0x02a7bd49, 0x01508794, 0x0018fafd, 0x03ee084a, 0x03715c38, 0x001ea3f1, 0x001a0f3a}}}, + {X: Field{[10]uint32{0x037a26c1, 0x00902ec8, 0x036a531f, 0x0163036f, 0x01166c6e, 0x00740ec9, 0x0122431c, 0x0046c09d, 0x0047f584, 0x00368c5d}}, Y: Field{[10]uint32{0x00f74d6f, 0x020dbb3b, 0x01525f51, 0x03175ea0, 0x03d36836, 0x0096762d, 0x0384167c, 0x0231a748, 0x03b87f5d, 0x001d4ee5}}}, + {X: Field{[10]uint32{0x037f0246, 0x0069e98f, 0x03ddf4c5, 0x0127f1c9, 0x0293e86e, 0x02d655ba, 0x00a8d4d0, 0x02570420, 0x012769cc, 0x002dcf19}}, Y: Field{[10]uint32{0x022a407b, 0x0394593a, 0x014e5597, 0x03931b95, 0x021a0d72, 0x016db07a, 0x0135893c, 0x032a752d, 0x03107174, 0x002699f6}}}, + {X: Field{[10]uint32{0x0339dc49, 0x018a2a4d, 0x01603d2b, 0x03699bd5, 0x02239392, 0x02ffc8c6, 0x024ac508, 0x0039b041, 0x02cb02af, 0x001a92f9}}, Y: Field{[10]uint32{0x02edd5cf, 0x028ae77c, 0x00a4d3e6, 0x0132c529, 0x00ab7e2b, 0x003ea016, 0x00166e36, 0x001d65f7, 0x03aa2a89, 0x003c5763}}}, + {X: Field{[10]uint32{0x00f8fb8c, 0x026fe776, 0x01e148ad, 0x026ea96f, 0x014cdc2b, 0x031cc044, 0x012facb5, 0x00803254, 0x027060d8, 0x000d966e}}, Y: Field{[10]uint32{0x00c8a3d1, 0x011ae31f, 0x0313575e, 0x0353912e, 0x031e142e, 0x031d261f, 0x01725f8e, 0x00685c4e, 0x01e806e0, 0x0013b9ea}}}, + {X: Field{[10]uint32{0x02987fac, 0x03a28311, 0x02f6798b, 0x021902a1, 0x008bc90f, 0x03b2628f, 0x02982603, 0x01fc4d13, 0x029f13ae, 0x00007df1}}, Y: Field{[10]uint32{0x01174c68, 0x0079ce06, 0x03c263f9, 0x038867da, 0x01cb7f5d, 0x00a6adbe, 0x031036e3, 0x0288b796, 0x003f36fd, 0x002753b3}}}, + {X: Field{[10]uint32{0x022e607b, 0x034d673b, 0x036aa1f4, 0x03b1b03c, 0x0388aa1e, 0x015ff74a, 0x01111f56, 0x01dcb083, 0x0367fd31, 0x0001dccf}}, Y: Field{[10]uint32{0x00614763, 0x03cc4773, 0x017d26a2, 0x03816f80, 0x0089e3bd, 0x02ec55bd, 0x0263a8c5, 0x020a17ab, 0x00fbac17, 0x003f67fa}}}, + {X: Field{[10]uint32{0x02daba4d, 0x00e86f5d, 0x016261d3, 0x003880c6, 0x039c65fb, 0x023e8af2, 0x03062edd, 0x034e072d, 0x0001761f, 0x00155fa5}}, Y: Field{[10]uint32{0x03a52316, 0x01d286ed, 0x0190a513, 0x03d7e90d, 0x02c5e9b8, 0x01732f21, 0x0135cfa1, 0x029f811b, 0x033a601f, 0x001e9fa3}}}, + {X: Field{[10]uint32{0x0005fbdd, 0x00b6734f, 0x001396e2, 0x0149d392, 0x0279589d, 0x01abe80c, 0x0120654b, 0x003120e2, 0x010a0031, 0x0038f91d}}, Y: Field{[10]uint32{0x0135b883, 0x0088c745, 0x02ffbcba, 0x02ff173e, 0x00b46587, 0x01868481, 0x02350499, 0x00964014, 0x0301abad, 0x0003e9e5}}}, + {X: Field{[10]uint32{0x01f5341a, 0x03d4bfca, 0x036b8038, 0x00b19a58, 0x019cc7a3, 0x01ec4050, 0x029d40ea, 0x0216a4ec, 0x02821998, 0x000eb6b6}}, Y: Field{[10]uint32{0x0186c6cc, 0x016024d9, 0x00fbcb51, 0x0396d17a, 0x03e9d6d2, 0x01aac405, 0x02e35bf3, 0x00da7d54, 0x02228999, 0x002ffa87}}}, + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + }, + { + {X: Field{[10]uint32{0x028d3d5d, 0x016603f0, 0x01cea409, 0x02e5cd12, 0x009612ae, 0x001e8c2c, 0x01c02709, 0x0201094b, 0x017df65c, 0x000c92bb}}, Y: Field{[10]uint32{0x02ab7c84, 0x00892be5, 0x02843967, 0x0031f8cc, 0x0319213b, 0x02bb07d3, 0x030c0c35, 0x007cbfc4, 0x025774b6, 0x0019228d}}}, + {X: Field{[10]uint32{0x02919749, 0x00e0e06c, 0x01b1fa8f, 0x012a3783, 0x03f72b3e, 0x02035c80, 0x01326818, 0x012408a3, 0x031ea26f, 0x000cb24c}}, Y: Field{[10]uint32{0x0290b5e3, 0x03a5ec3c, 0x02b09631, 0x02f6b8e6, 0x00268a4a, 0x01bcf6ee, 0x01a2f02b, 0x0272d5a5, 0x032b3420, 0x0035f349}}}, + {X: Field{[10]uint32{0x03d53ed3, 0x0245d60b, 0x02ccef5c, 0x03ee7695, 0x01163f74, 0x0077df12, 0x00f60b93, 0x01cab56e, 0x03d59967, 0x00082102}}, Y: Field{[10]uint32{0x027a7132, 0x010ff946, 0x00899871, 0x01ce539c, 0x025487c4, 0x01aebeb0, 0x03bd476a, 0x02090d21, 0x0097cec1, 0x003ca64d}}}, + {X: Field{[10]uint32{0x039795e4, 0x0308949e, 0x02b8e1e1, 0x02db8611, 0x0069c161, 0x03fb1ac7, 0x002f6a70, 0x00de1528, 0x033b3b98, 0x003aca4b}}, Y: Field{[10]uint32{0x0253a0fe, 0x03a74beb, 0x01c6f5b7, 0x01d42444, 0x0357131d, 0x005160d6, 0x016634af, 0x02fa005a, 0x025a96ee, 0x002310f0}}}, + {X: Field{[10]uint32{0x00a35b35, 0x00b2ed62, 0x0121edbd, 0x02297028, 0x011ab5d8, 0x01623aff, 0x013d029e, 0x00e6eef4, 0x03f60eb3, 0x0039adaf}}, Y: Field{[10]uint32{0x001007bd, 0x00a4f6e7, 0x019c7c57, 0x0274efa6, 0x01fe3b6c, 0x00d65877, 0x02f43e38, 0x034bcc99, 0x02bd3300, 0x000697fc}}}, + {X: Field{[10]uint32{0x0032f9a2, 0x02e38a48, 0x006ccc48, 0x0143e87f, 0x03ce566f, 0x007fe3d8, 0x02374cb3, 0x009903b4, 0x02bd9a6b, 0x00096ab1}}, Y: Field{[10]uint32{0x0351d4f0, 0x008c284a, 0x033d9e76, 0x02ef1067, 0x02559883, 0x013c643d, 0x0332f54f, 0x0151b05b, 0x023ba644, 0x003d69b1}}}, + {X: Field{[10]uint32{0x00360dd3, 0x03be34b0, 0x022090d4, 0x00db6143, 0x0347a8a8, 0x038338ee, 0x030b8086, 0x0266ca22, 0x03745be4, 0x003814c5}}, Y: Field{[10]uint32{0x0024f87b, 0x03b3644f, 0x03dc2b2a, 0x037a6040, 0x0061b987, 0x016da805, 0x0009582b, 0x00bce736, 0x0371a5d9, 0x0037070e}}}, + {X: Field{[10]uint32{0x01303fdd, 0x00e755e2, 0x02d35aea, 0x01fc6747, 0x014d7145, 0x00127ef8, 0x020d4310, 0x017bcb98, 0x0201df3b, 0x0029968e}}, Y: Field{[10]uint32{0x02e68703, 0x0112a340, 0x013cadad, 0x00093ebb, 0x0286861d, 0x003b4b1d, 0x0343d8d9, 0x0171bee3, 0x00940cff, 0x001e63a8}}}, + {X: Field{[10]uint32{0x0098dfea, 0x011998b4, 0x038797c1, 0x0324ba99, 0x03fadcb3, 0x020e9795, 0x018e5d2a, 0x01b16780, 0x033a7788, 0x002a054e}}, Y: Field{[10]uint32{0x026d892f, 0x026a77db, 0x034158a4, 0x03dd0b6b, 0x03b1b5e0, 0x01e14f80, 0x018db9c5, 0x0183f14f, 0x016461d0, 0x000a91ce}}}, + {X: Field{[10]uint32{0x024c9489, 0x00c354b4, 0x00a98616, 0x039b8539, 0x00c0aef4, 0x01ba754a, 0x027887ff, 0x019f0a68, 0x0315d9d5, 0x0018a06e}}, Y: Field{[10]uint32{0x01f42bc6, 0x01fc9ae7, 0x033ad918, 0x01374c86, 0x0145fd96, 0x01ba6efd, 0x02738f45, 0x02a19648, 0x01a0908d, 0x000bf4f1}}}, + {X: Field{[10]uint32{0x03cecfa5, 0x039de922, 0x03b020a7, 0x03686c5a, 0x032a0d62, 0x00e3b68e, 0x034695c6, 0x02b76b7a, 0x03b30fec, 0x0013c170}}, Y: Field{[10]uint32{0x01d37b53, 0x034092a5, 0x008cd2ec, 0x00c7c06d, 0x01447ee4, 0x01654d2e, 0x01632361, 0x0109beb7, 0x01ea603d, 0x0014e926}}}, + {X: Field{[10]uint32{0x00445a7a, 0x00c72ea5, 0x01ec5901, 0x03c2073c, 0x01df9535, 0x01807235, 0x02f11b6c, 0x031afec4, 0x03bc9f06, 0x003e0bfb}}, Y: Field{[10]uint32{0x002a7a98, 0x02b38619, 0x011e5963, 0x02d91903, 0x00b51c83, 0x02502d29, 0x003942c1, 0x01ad9d54, 0x03bdc6fb, 0x00252ecd}}}, + {X: Field{[10]uint32{0x004b96aa, 0x039d9642, 0x03cce461, 0x00d548aa, 0x02d02986, 0x028ee603, 0x02405e1a, 0x02a46f89, 0x02b99f67, 0x00364c26}}, Y: Field{[10]uint32{0x02b28a86, 0x0313cdf0, 0x02978f26, 0x03eebf3f, 0x03d3b6c9, 0x009d32d7, 0x0210f066, 0x03155f5f, 0x032a9b4e, 0x001bbe66}}}, + {X: Field{[10]uint32{0x02b7d2d5, 0x03750ac5, 0x02a66f6f, 0x0134755b, 0x022637b8, 0x00bbd40b, 0x030f3d32, 0x01080f20, 0x03aa9783, 0x0028a16a}}, Y: Field{[10]uint32{0x0001f99c, 0x01754be4, 0x013e9c40, 0x0086dadd, 0x02d86573, 0x0042cb8a, 0x03952dfe, 0x01eb1a4a, 0x0292cd1b, 0x00395ba5}}}, + {X: Field{[10]uint32{0x038fcf0e, 0x02e34167, 0x026facf7, 0x03f79f12, 0x01d65b6f, 0x03aa8d04, 0x01c3446d, 0x00b4d6ea, 0x00a13856, 0x001f561f}}, Y: Field{[10]uint32{0x00bc9459, 0x03068276, 0x0380a501, 0x002b4c8d, 0x00c46390, 0x033f5ab4, 0x023400b6, 0x0131849c, 0x00038830, 0x0029ca57}}}, + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + }, + { + {X: Field{[10]uint32{0x01054c96, 0x02f4dcff, 0x00a888e8, 0x00eea347, 0x00eec414, 0x017fb977, 0x011dfdbe, 0x03987db5, 0x014919cd, 0x00137e70}}, Y: Field{[10]uint32{0x02d10d5d, 0x02eb01b2, 0x0090192e, 0x03370a21, 0x00b5d506, 0x02876175, 0x00974c23, 0x021ca014, 0x0051092d, 0x00000d7b}}}, + {X: Field{[10]uint32{0x01a49e04, 0x01ac3f07, 0x00d70c0c, 0x015395ea, 0x00e9de45, 0x012e1c22, 0x01317d4e, 0x02663349, 0x02d8d2cc, 0x003b4cb2}}, Y: Field{[10]uint32{0x001db9e0, 0x0048345f, 0x02b7db63, 0x02b2d27e, 0x0352da9f, 0x02167482, 0x001ca375, 0x00081295, 0x035f1d03, 0x0004a7fb}}}, + {X: Field{[10]uint32{0x01ef001d, 0x00897697, 0x0227ef4f, 0x035a626e, 0x0321f9bb, 0x0278ed92, 0x020bd1c0, 0x00b2bc83, 0x032db27e, 0x00295268}}, Y: Field{[10]uint32{0x00624783, 0x036c69fc, 0x0305add5, 0x00a98b25, 0x02eb141e, 0x02296515, 0x00cc30ed, 0x019b2f7d, 0x027906d9, 0x001e66de}}}, + {X: Field{[10]uint32{0x0083f855, 0x0106353a, 0x00016cb7, 0x032d8f0d, 0x0228c36d, 0x031c0d9b, 0x009e4111, 0x0183c601, 0x03724d63, 0x003a086a}}, Y: Field{[10]uint32{0x01852ddf, 0x03831a96, 0x023efed4, 0x031853b0, 0x018b3b19, 0x0105b3d6, 0x010d4115, 0x00f38d9f, 0x03f863f5, 0x002b7bf2}}}, + {X: Field{[10]uint32{0x012ed4cb, 0x03bc7971, 0x02c5a05a, 0x03ecf027, 0x02c954de, 0x00d4cb9b, 0x0308bd98, 0x03b3448f, 0x0330da07, 0x001f9e63}}, Y: Field{[10]uint32{0x00bb9462, 0x005981e5, 0x037a1257, 0x006ffe7c, 0x03b17357, 0x03bcbc15, 0x01a9549d, 0x02b20c10, 0x00c4a24d, 0x00348f73}}}, + {X: Field{[10]uint32{0x0206e37a, 0x01de2b10, 0x00731a24, 0x02523141, 0x034d8c18, 0x02d689d3, 0x00e83f46, 0x02000b3d, 0x0387f286, 0x002d49aa}}, Y: Field{[10]uint32{0x00c5ccab, 0x019e3ffc, 0x0392abf3, 0x026c03e8, 0x0128ce53, 0x0029bc63, 0x00aaced6, 0x00363b57, 0x01d77810, 0x001907cd}}}, + {X: Field{[10]uint32{0x03630834, 0x00e83ef4, 0x00067fdf, 0x00a18f6b, 0x008463f1, 0x02a32042, 0x01b9e96b, 0x011e0eb5, 0x02003151, 0x000893e8}}, Y: Field{[10]uint32{0x007a2272, 0x0311cdf1, 0x00f75cd3, 0x013b0294, 0x013d6292, 0x0247427d, 0x00b70fa3, 0x036970f1, 0x0232bb3e, 0x002ef953}}}, + {X: Field{[10]uint32{0x0041742e, 0x03d67bad, 0x006e9fbf, 0x011ebce0, 0x032f14a5, 0x0325a4e9, 0x015452fb, 0x03484bd1, 0x0194e51a, 0x000fc362}}, Y: Field{[10]uint32{0x03ecadbe, 0x014d8ef3, 0x03d958c6, 0x00b0eb44, 0x031e205e, 0x011e9b82, 0x025cb0e8, 0x00f71117, 0x0023f28c, 0x003ef5db}}}, + {X: Field{[10]uint32{0x003c19d7, 0x01927456, 0x0357bb67, 0x0116b0b3, 0x02bbbb5e, 0x0108a3bc, 0x01a25cce, 0x00e7904a, 0x00cc600a, 0x0030b528}}, Y: Field{[10]uint32{0x0107928d, 0x00a2e0b1, 0x01c9772f, 0x020c5cd1, 0x0126804a, 0x03d04983, 0x0183b5f7, 0x018a5350, 0x00f9c080, 0x00196b68}}}, + {X: Field{[10]uint32{0x01848116, 0x01507957, 0x027bba04, 0x0003f278, 0x001cc9b1, 0x03a52115, 0x0072ce10, 0x034ef814, 0x019abb39, 0x0005a4de}}, Y: Field{[10]uint32{0x027198b3, 0x03d9b080, 0x012e483d, 0x03971366, 0x02c03193, 0x01b1837b, 0x02af60f1, 0x03631539, 0x033b9cb2, 0x00312710}}}, + {X: Field{[10]uint32{0x00940c9a, 0x0202b52f, 0x0233084c, 0x0384ebd0, 0x0113cf3c, 0x01137708, 0x01585e27, 0x03cc6439, 0x027ec305, 0x000bb08a}}, Y: Field{[10]uint32{0x011e7a4d, 0x0253f661, 0x01bdacd1, 0x020f668d, 0x03124051, 0x00a71ffa, 0x02e24f50, 0x01e5a130, 0x0068de33, 0x0022c769}}}, + {X: Field{[10]uint32{0x01d9123f, 0x00e0c7ae, 0x03a7d7e9, 0x006c7e22, 0x0129fc79, 0x03ef47a4, 0x015f8eca, 0x01a9bcbe, 0x038f72aa, 0x000d06d4}}, Y: Field{[10]uint32{0x00bb9a40, 0x0282abc6, 0x026ed19e, 0x029c14a8, 0x0072dee6, 0x0049366b, 0x02f2f041, 0x03167ae9, 0x024719c1, 0x00161604}}}, + {X: Field{[10]uint32{0x01683eeb, 0x003b97f7, 0x03133aa7, 0x00e28234, 0x033e36eb, 0x00212e3c, 0x01af6525, 0x0233b2ac, 0x01738f9a, 0x002bf19a}}, Y: Field{[10]uint32{0x00cd4509, 0x00a72acc, 0x01fdc91e, 0x015497b7, 0x02570bab, 0x0288e705, 0x0359c7fc, 0x009d4af0, 0x01976dd2, 0x00000b08}}}, + {X: Field{[10]uint32{0x03aad77f, 0x001ec731, 0x03b7fa7d, 0x037c3d69, 0x006d4ebb, 0x01da659c, 0x004afc3a, 0x02e378ca, 0x033ec68e, 0x0013c3aa}}, Y: Field{[10]uint32{0x00e6eea8, 0x00fc4773, 0x0092ce6c, 0x0234096b, 0x00adaa07, 0x00ab0bca, 0x008de306, 0x02dd5d68, 0x027176eb, 0x002ca3a8}}}, + {X: Field{[10]uint32{0x036f4293, 0x0007e1ed, 0x01139ea2, 0x02d594f1, 0x0210e978, 0x01c2ca0b, 0x01bc8cf3, 0x00cc2448, 0x035a9f34, 0x0034955e}}, Y: Field{[10]uint32{0x0282740a, 0x0061e894, 0x01a5f1db, 0x00e37901, 0x03e34b68, 0x02d2b487, 0x0282f06e, 0x009fc049, 0x034355e4, 0x0029e1ec}}}, + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + }, + { + {X: Field{[10]uint32{0x001f98cd, 0x0326722b, 0x00308cbf, 0x001535fc, 0x01523489, 0x03319808, 0x02d8a9c1, 0x0121c3eb, 0x01a84a47, 0x00270e46}}, Y: Field{[10]uint32{0x00fc599d, 0x039780f5, 0x008e6be7, 0x03ddb193, 0x01905326, 0x00983990, 0x00f044bf, 0x03755d61, 0x030f4a4d, 0x00376e13}}}, + {X: Field{[10]uint32{0x014a09ec, 0x03bededa, 0x035f0435, 0x0294fa14, 0x000cd326, 0x01724aa9, 0x002fc69d, 0x03603c29, 0x01326255, 0x000b8f01}}, Y: Field{[10]uint32{0x00c7327e, 0x0121a062, 0x02651253, 0x00f1c1ed, 0x03e048a5, 0x020bf06a, 0x01ae240b, 0x01bed6f7, 0x0091656c, 0x000007fe}}}, + {X: Field{[10]uint32{0x03b64db3, 0x026354e3, 0x0138417b, 0x0328e775, 0x02a7ede4, 0x0394ee35, 0x03bb83fb, 0x0332dd02, 0x039229bd, 0x00304508}}, Y: Field{[10]uint32{0x000259be, 0x0033a7ff, 0x027d1e23, 0x02413515, 0x01a87580, 0x03a5e2f4, 0x00ecde4f, 0x01bf0a97, 0x02dc5b48, 0x00048dfd}}}, + {X: Field{[10]uint32{0x039c7ce6, 0x03c668aa, 0x00934205, 0x005a8642, 0x00337103, 0x03893769, 0x015fb7e3, 0x00561eb8, 0x024ccfa4, 0x003a38a8}}, Y: Field{[10]uint32{0x0036267c, 0x0007ada2, 0x03a73b2c, 0x000ed709, 0x016e09e6, 0x02fb8816, 0x02f2b2b3, 0x01746d32, 0x03ce0c6f, 0x0011b260}}}, + {X: Field{[10]uint32{0x03081e46, 0x03b60d00, 0x019ea1ed, 0x02315515, 0x013a5221, 0x02498d1c, 0x02d9c2c1, 0x01c89020, 0x03f831a7, 0x001b16d2}}, Y: Field{[10]uint32{0x03fbcd70, 0x03e72e02, 0x02a62ed1, 0x0209ab08, 0x0041d0cf, 0x038af91e, 0x0347863c, 0x0350bec8, 0x03714926, 0x0032c144}}}, + {X: Field{[10]uint32{0x011349e2, 0x00cab77c, 0x00c05808, 0x03d05d49, 0x0160e3ec, 0x0106b5e3, 0x02147e9a, 0x030b9f98, 0x0324c6b9, 0x003e0160}}, Y: Field{[10]uint32{0x032025fc, 0x0311a796, 0x0288d5fa, 0x02d589b7, 0x03509498, 0x03a84488, 0x0281aa60, 0x015b3737, 0x025a0a88, 0x00257183}}}, + {X: Field{[10]uint32{0x024dcd4b, 0x0396bb11, 0x00124dca, 0x03566447, 0x010c30c7, 0x02ac4291, 0x0270665c, 0x02b792d5, 0x0056670c, 0x00387a6a}}, Y: Field{[10]uint32{0x03041f2c, 0x02d897ae, 0x02b292d0, 0x026ab285, 0x027f44d1, 0x02c95de4, 0x02c43599, 0x0314c6de, 0x02954455, 0x00158ac2}}}, + {X: Field{[10]uint32{0x02c7b3c2, 0x034e59a2, 0x01b5f5b0, 0x0248e0f5, 0x0212acaf, 0x01c00ca8, 0x030a38b1, 0x01cf0acb, 0x02ac5d85, 0x0029d526}}, Y: Field{[10]uint32{0x0287eaef, 0x03245c64, 0x016dffa0, 0x00554dc4, 0x035d6b51, 0x00651f4a, 0x01a1d70c, 0x009054cd, 0x01b90d1c, 0x002f45f4}}}, + {X: Field{[10]uint32{0x03add73c, 0x021dbf8a, 0x00b7d005, 0x03640a99, 0x008fd9cd, 0x03b70508, 0x00a74e42, 0x02c265de, 0x0257ad11, 0x00146c86}}, Y: Field{[10]uint32{0x0336d8d1, 0x0352b87a, 0x034ba6f7, 0x003ca31c, 0x026c2013, 0x034b073e, 0x00a07f01, 0x034f9755, 0x0010001f, 0x00001e4c}}}, + {X: Field{[10]uint32{0x017e2c95, 0x037265af, 0x00d82ab7, 0x02852e1e, 0x036f3f2b, 0x02b15055, 0x019a12a8, 0x034697b7, 0x03fbb24a, 0x003281f2}}, Y: Field{[10]uint32{0x0150dfa2, 0x0266eb23, 0x00cbf05e, 0x03ccedf8, 0x013ac306, 0x030419b2, 0x00a2267b, 0x003b7d2a, 0x011032df, 0x002bb70c}}}, + {X: Field{[10]uint32{0x0309f34b, 0x01742dce, 0x026ce6d7, 0x03982331, 0x01e58873, 0x00fce758, 0x02b6296f, 0x02de6186, 0x03a63b1c, 0x0025c07c}}, Y: Field{[10]uint32{0x00df5793, 0x03214330, 0x00794acd, 0x00e5ff73, 0x037104bc, 0x0055a0cd, 0x03031b53, 0x003b4575, 0x03bb8caf, 0x000f7512}}}, + {X: Field{[10]uint32{0x02548418, 0x01c7446b, 0x03923173, 0x01f62260, 0x02dce488, 0x00de8d06, 0x03072b05, 0x01f8a4be, 0x00c9e481, 0x000b9b6c}}, Y: Field{[10]uint32{0x00a2b918, 0x01e4b004, 0x035f1e69, 0x01cf870f, 0x004b8e1d, 0x022a4459, 0x01314897, 0x01befe88, 0x02411d77, 0x001d3ada}}}, + {X: Field{[10]uint32{0x031e2f46, 0x039888ef, 0x0383015c, 0x007a1c9d, 0x035270f7, 0x00358f15, 0x01592e04, 0x019b3111, 0x001d2c9e, 0x00280dad}}, Y: Field{[10]uint32{0x02ffb349, 0x00789a57, 0x031f4f73, 0x020b3fc2, 0x010680e2, 0x01e7ac23, 0x031f6aa4, 0x01acf5f7, 0x01a003e9, 0x0030efe4}}}, + {X: Field{[10]uint32{0x03db2a09, 0x00154580, 0x01bbf096, 0x021f7080, 0x01f63142, 0x029d9b68, 0x01638800, 0x0030d4af, 0x0004d9c3, 0x002c2773}}, Y: Field{[10]uint32{0x00b1a093, 0x01f6cea0, 0x014e7aed, 0x035305ab, 0x026a951b, 0x02bab403, 0x008d1635, 0x009037dc, 0x006481cf, 0x00229fcc}}}, + {X: Field{[10]uint32{0x004cea08, 0x022e40e3, 0x0221dbcd, 0x02e8383a, 0x02654b58, 0x01001194, 0x00a61153, 0x023141bd, 0x02dbaa4e, 0x001aa17e}}, Y: Field{[10]uint32{0x0062f4f3, 0x037b3966, 0x021b6a19, 0x012d0f5c, 0x00b4271a, 0x023f988c, 0x01933c14, 0x0196754c, 0x0204bae4, 0x00002d91}}}, + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + }, + { + {X: Field{[10]uint32{0x00a959e5, 0x004e0848, 0x014cc5a2, 0x00ea2e47, 0x0391e149, 0x036381ae, 0x0205f281, 0x00bf7e37, 0x030b1dd1, 0x001815c5}}, Y: Field{[10]uint32{0x0385a2a8, 0x026fa4c8, 0x00c65e89, 0x02f0fb89, 0x02465152, 0x01c77c98, 0x019a2daf, 0x01201eb7, 0x00b26a6a, 0x002686bc}}}, + {X: Field{[10]uint32{0x02fd545c, 0x02729760, 0x00e66189, 0x0237528a, 0x037c133f, 0x01b72177, 0x014110a4, 0x0381900e, 0x01677c52, 0x0019dcff}}, Y: Field{[10]uint32{0x007eb1ae, 0x01fc0d25, 0x00f98e8c, 0x03d6871b, 0x03ead780, 0x034ac91a, 0x00f25c9d, 0x0194bc3c, 0x02d8cd97, 0x001113ad}}}, + {X: Field{[10]uint32{0x031c032b, 0x036858a5, 0x01c980d4, 0x02285ebf, 0x01ff6b66, 0x03f1d9b1, 0x0111b5fd, 0x000980f7, 0x00fcd6e0, 0x001c7aea}}, Y: Field{[10]uint32{0x0268359f, 0x02d6a385, 0x00755e7a, 0x0345dd2d, 0x0371931a, 0x01532edf, 0x0260516f, 0x034e77bd, 0x02624b61, 0x0034bfc4}}}, + {X: Field{[10]uint32{0x0386f021, 0x03185ac2, 0x00050373, 0x00e0411a, 0x020374e4, 0x038321f0, 0x03c79aac, 0x0395948d, 0x0194d17c, 0x00383e1b}}, Y: Field{[10]uint32{0x01bf325a, 0x02de732d, 0x0045b3b6, 0x0300457f, 0x009a80bc, 0x0072268b, 0x011e832f, 0x02f3d1ea, 0x0073730a, 0x000315c7}}}, + {X: Field{[10]uint32{0x0203a61c, 0x0391d14a, 0x00574d06, 0x03d1a41c, 0x00507868, 0x02aaa774, 0x0217442b, 0x02748cb2, 0x0305b324, 0x002157b0}}, Y: Field{[10]uint32{0x025dfc07, 0x031baab1, 0x004965df, 0x013a85f9, 0x02d332f7, 0x02d0bed3, 0x003cbff9, 0x00705fd5, 0x012ec5f0, 0x00037617}}}, + {X: Field{[10]uint32{0x02aa138b, 0x00367dce, 0x02cd66df, 0x002fbde1, 0x0363efba, 0x03119c7f, 0x003ebc18, 0x02b8a1e5, 0x0249d3c3, 0x00105ff8}}, Y: Field{[10]uint32{0x021ae869, 0x0246ccd2, 0x026afd1c, 0x037b0155, 0x03c19daf, 0x003ea795, 0x00a5d29f, 0x00f8e308, 0x01d7bcd2, 0x00008d62}}}, + {X: Field{[10]uint32{0x0332d706, 0x03029207, 0x00678b00, 0x0291d1a8, 0x020618cc, 0x00256fe8, 0x010d29a3, 0x03efc7c5, 0x006abab3, 0x000f3912}}, Y: Field{[10]uint32{0x007fd9e4, 0x01cd8dff, 0x0289f40b, 0x010f3587, 0x02edd156, 0x00425241, 0x02fd046b, 0x01e14a23, 0x008daae3, 0x0039dd50}}}, + {X: Field{[10]uint32{0x02da6e03, 0x001dcb00, 0x016038ad, 0x03e4232b, 0x034c277d, 0x035a5bd3, 0x0191e193, 0x0141073a, 0x01ab9f24, 0x0010b285}}, Y: Field{[10]uint32{0x00347793, 0x02227ea3, 0x03ea7836, 0x029a041a, 0x02d66e85, 0x032e003b, 0x03ce4d1f, 0x015f2591, 0x0326c81c, 0x001a34bb}}}, + {X: Field{[10]uint32{0x011cd3fb, 0x01032ede, 0x03e686db, 0x03f65ca6, 0x034a2a33, 0x03e2113a, 0x02e03218, 0x00dfebc0, 0x01143f4e, 0x00047331}}, Y: Field{[10]uint32{0x01160d86, 0x01c5ae95, 0x03472a93, 0x03f4b374, 0x01fa0b1e, 0x00e3308e, 0x028e2449, 0x00477ad4, 0x032a902b, 0x0012a95a}}}, + {X: Field{[10]uint32{0x01583a3e, 0x02ebc10a, 0x02808108, 0x02662c55, 0x00b15205, 0x036521c7, 0x0275dbbe, 0x03df955c, 0x033f16d0, 0x00162255}}, Y: Field{[10]uint32{0x025b124f, 0x016632df, 0x029cf8f1, 0x01335331, 0x0096fe29, 0x0269ad39, 0x00f5df8a, 0x015bf811, 0x0062c558, 0x0006be8a}}}, + {X: Field{[10]uint32{0x018f7552, 0x02e44658, 0x00fac387, 0x022e6015, 0x01bd4113, 0x0208e0b7, 0x0397774f, 0x0271bd0e, 0x0317e514, 0x0000942e}}, Y: Field{[10]uint32{0x0110b14d, 0x0212588d, 0x02f1e3f0, 0x00f0ccf5, 0x03da006f, 0x03fa7605, 0x02d7df75, 0x020208d0, 0x00fc9bbe, 0x001cc64c}}}, + {X: Field{[10]uint32{0x0307e636, 0x0162d040, 0x011d97e1, 0x039cc858, 0x00b4a77d, 0x028844b2, 0x01bc29bd, 0x01d910f7, 0x01601638, 0x0008867c}}, Y: Field{[10]uint32{0x01f15109, 0x0286cb5c, 0x02f55e07, 0x0034fdce, 0x016dd723, 0x02e08c2f, 0x0006d4f1, 0x028bd86e, 0x00ac5cb6, 0x00012a61}}}, + {X: Field{[10]uint32{0x03725d12, 0x004fa4e7, 0x0347505d, 0x02ef72d7, 0x03d94642, 0x02808bef, 0x00a39ce0, 0x01ff4ead, 0x0088b346, 0x00069d27}}, Y: Field{[10]uint32{0x03ac56e4, 0x01945348, 0x01aa7013, 0x01a62643, 0x03607208, 0x00abcf63, 0x018be75c, 0x0038b3d1, 0x019573ec, 0x001fa474}}}, + {X: Field{[10]uint32{0x02c704c0, 0x00b59c2d, 0x0394f5d2, 0x0183b378, 0x00560446, 0x00d41e09, 0x027f8a6e, 0x0099d285, 0x0107c92f, 0x0029deaa}}, Y: Field{[10]uint32{0x02dfea48, 0x02f1c11f, 0x01462af8, 0x0311d056, 0x014c921f, 0x030af56a, 0x01e188e5, 0x033f93c8, 0x02e5bf35, 0x002e2206}}}, + {X: Field{[10]uint32{0x01fae458, 0x0012394a, 0x0097fd61, 0x0109d9bb, 0x028b0a5c, 0x037edecc, 0x01d156a5, 0x00863042, 0x005be0f8, 0x0031d41a}}, Y: Field{[10]uint32{0x0357b598, 0x01a10655, 0x011a2b01, 0x0140cd65, 0x000a5dca, 0x019cb1ed, 0x012f414c, 0x007817ed, 0x01f8cf92, 0x003ab5e5}}}, + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + }, + { + {X: Field{[10]uint32{0x00b94266, 0x01a5cfbb, 0x01f12b1a, 0x03ee9f53, 0x0080cef0, 0x006368c6, 0x01439a45, 0x02104508, 0x038e23a0, 0x00295db7}}, Y: Field{[10]uint32{0x01b28ec8, 0x02f846b8, 0x019f3ee8, 0x029fd453, 0x00432e10, 0x0163360b, 0x02b97afe, 0x0102cb24, 0x0320e766, 0x001029af}}}, + {X: Field{[10]uint32{0x02704896, 0x015c96f6, 0x03b8dcec, 0x018f26b3, 0x026f3ba0, 0x02f9c6eb, 0x02520867, 0x0168ed51, 0x0062ef3b, 0x00279773}}, Y: Field{[10]uint32{0x0282c835, 0x009da772, 0x0351248f, 0x006180c3, 0x0279605d, 0x0131d848, 0x03d3a215, 0x017cfa97, 0x012ddb92, 0x001bfb74}}}, + {X: Field{[10]uint32{0x019ed6c1, 0x02bad633, 0x013d6b68, 0x016f0f56, 0x02c24e74, 0x0017b743, 0x03fc1877, 0x03d4fa02, 0x036dcb74, 0x0000ca0c}}, Y: Field{[10]uint32{0x00fafeee, 0x01baf9be, 0x0094adec, 0x037c972d, 0x00265bf4, 0x00835f23, 0x02d5943a, 0x027ca311, 0x003812fd, 0x001c6a26}}}, + {X: Field{[10]uint32{0x00bf7ea0, 0x03b561d1, 0x01833953, 0x028173bd, 0x00e33625, 0x01bc0ec8, 0x016e9f97, 0x0116b7e3, 0x00375b87, 0x0029f782}}, Y: Field{[10]uint32{0x03bcabaa, 0x030154e6, 0x01aa2e04, 0x0303faf1, 0x02645a47, 0x012223a6, 0x004a0b33, 0x02979484, 0x02b057ad, 0x00298f65}}}, + {X: Field{[10]uint32{0x0235983a, 0x02a6a34c, 0x00eb2919, 0x00dc04ef, 0x01e38a10, 0x003f854c, 0x023926d7, 0x00715371, 0x02ae8b91, 0x003393d3}}, Y: Field{[10]uint32{0x013cdecf, 0x035ac643, 0x0340aecf, 0x008a3afd, 0x03526c65, 0x039c1d50, 0x02de0249, 0x03eeecfa, 0x0173c390, 0x003cf27e}}}, + {X: Field{[10]uint32{0x02da57e4, 0x01592299, 0x019f86b7, 0x01bbf737, 0x0298c499, 0x018c6f07, 0x01ea2a74, 0x0062e76f, 0x02e39839, 0x001a4336}}, Y: Field{[10]uint32{0x033f33bb, 0x00656d24, 0x023d42b6, 0x03ef3a56, 0x01f863d8, 0x01656253, 0x01fd91bf, 0x01e691ea, 0x0079677b, 0x002102b7}}}, + {X: Field{[10]uint32{0x01b0e6c9, 0x02aad995, 0x00c89a6d, 0x033de1b9, 0x01db5ff9, 0x037e2f2f, 0x0228fb36, 0x018889e3, 0x03a54b98, 0x00136faf}}, Y: Field{[10]uint32{0x02b2cc25, 0x029e1557, 0x00efae94, 0x02caf141, 0x03589311, 0x03888a7c, 0x01a626e6, 0x00ebb7d1, 0x03b03c91, 0x00043fb9}}}, + {X: Field{[10]uint32{0x02d916fb, 0x023e8412, 0x024a3a9f, 0x03f7a527, 0x03e68065, 0x0073fd32, 0x03c35ac0, 0x02032704, 0x018e6890, 0x00309999}}, Y: Field{[10]uint32{0x00887814, 0x03bd4ae8, 0x0138856a, 0x037fad84, 0x036b8fec, 0x009189ea, 0x0398170b, 0x036aac3d, 0x013854e7, 0x0039fa16}}}, + {X: Field{[10]uint32{0x01857295, 0x00068469, 0x03f0164e, 0x01fc0d0c, 0x0069c8e4, 0x02872848, 0x02e118fc, 0x0170862c, 0x000bfef4, 0x00290a89}}, Y: Field{[10]uint32{0x027eb9c1, 0x00ddffb2, 0x0139556b, 0x00b34546, 0x0027a1c2, 0x01376931, 0x026b22b2, 0x0175159e, 0x03f26100, 0x000ea82c}}}, + {X: Field{[10]uint32{0x005c5b40, 0x02f3f580, 0x03d1e269, 0x021e6ee7, 0x03150b96, 0x023330f7, 0x01ed382e, 0x0334536b, 0x00c8bf53, 0x00292d4f}}, Y: Field{[10]uint32{0x01c61bfd, 0x017b45b4, 0x019e3d1f, 0x026fdd49, 0x03199cca, 0x037f6961, 0x015ca003, 0x016e0112, 0x00ce8300, 0x0033bbc2}}}, + {X: Field{[10]uint32{0x03cdc098, 0x003fd55b, 0x02803222, 0x003dab91, 0x01550ae0, 0x00312670, 0x03f1f86c, 0x008899e9, 0x032f96fb, 0x000d384a}}, Y: Field{[10]uint32{0x027474e2, 0x02c6b79a, 0x003f664c, 0x00c3c662, 0x0304df51, 0x005e5cb6, 0x034cbc84, 0x034c8b65, 0x02ddd7b5, 0x002992b0}}}, + {X: Field{[10]uint32{0x00fb8036, 0x02262a97, 0x035085f9, 0x024b0368, 0x033ad09a, 0x03f59fa0, 0x02117dd1, 0x011ed22b, 0x0351fb16, 0x0033fd89}}, Y: Field{[10]uint32{0x00f59de0, 0x03ced689, 0x02825843, 0x0363d80c, 0x0278a589, 0x021850f1, 0x03e34b58, 0x00b46b17, 0x0126bd54, 0x00337d3b}}}, + {X: Field{[10]uint32{0x03173b92, 0x01bad7a3, 0x037611cd, 0x03d05a7e, 0x003b7e72, 0x03d3595a, 0x0231a218, 0x0247ca6f, 0x0240d9bb, 0x00043d34}}, Y: Field{[10]uint32{0x033146c2, 0x00801b58, 0x02db7c90, 0x0274521a, 0x0290bb76, 0x00ce422e, 0x01b25a5a, 0x014eb484, 0x01950917, 0x0021438b}}}, + {X: Field{[10]uint32{0x004393d7, 0x01983b74, 0x01de1ee6, 0x00959dd2, 0x03869dff, 0x008d5cf8, 0x017f8936, 0x03cee10c, 0x00018a78, 0x0037a87f}}, Y: Field{[10]uint32{0x01710ccd, 0x01f53be5, 0x00cbdbf9, 0x0268ade7, 0x03af6def, 0x01b59b80, 0x03f134ff, 0x0171434e, 0x01cc942e, 0x0013d952}}}, + {X: Field{[10]uint32{0x00d84958, 0x03f4766a, 0x005caee6, 0x02c5b2b3, 0x026a11de, 0x03503321, 0x0319b976, 0x01df9d27, 0x000b69b6, 0x003a11ba}}, Y: Field{[10]uint32{0x0082cf9f, 0x01191ede, 0x001a640c, 0x00d9c783, 0x03ad51a3, 0x01e62ddb, 0x01bd9104, 0x01f89507, 0x00fc894c, 0x0028a72e}}}, + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + }, + { + {X: Field{[10]uint32{0x0258ad71, 0x018e226f, 0x03a208f7, 0x03d73e68, 0x00bb30d1, 0x0277a30e, 0x005fe962, 0x030f8c28, 0x038c28de, 0x001dde29}}, Y: Field{[10]uint32{0x019f43ac, 0x004ff07f, 0x02c563b5, 0x0047fc92, 0x0087b384, 0x00bfd600, 0x0098e12f, 0x02c8bfdc, 0x019ab5a5, 0x000d189b}}}, + {X: Field{[10]uint32{0x0073e879, 0x02870944, 0x02ea7a7e, 0x016b8413, 0x032cf16a, 0x03c3f8e4, 0x02f482d7, 0x001b458c, 0x016b5ca0, 0x0039ee5e}}, Y: Field{[10]uint32{0x02a89d98, 0x01c4226e, 0x00af338e, 0x0097b6a6, 0x029cb5bf, 0x00df3072, 0x002102a7, 0x0278bf7d, 0x008c1916, 0x0004ae26}}}, + {X: Field{[10]uint32{0x0319c869, 0x031bab8c, 0x032702f7, 0x0175d87a, 0x0018a9f9, 0x03f32b37, 0x01839022, 0x00ff2340, 0x005d9817, 0x000c0601}}, Y: Field{[10]uint32{0x02b856f0, 0x031db274, 0x01a7bfc0, 0x032928f6, 0x03ca2a84, 0x03588b8e, 0x02624320, 0x02dedbe1, 0x01782503, 0x002b17f1}}}, + {X: Field{[10]uint32{0x02628f0f, 0x035c8afc, 0x02919865, 0x02abcabb, 0x0365423d, 0x02f8269c, 0x00915a24, 0x01880f0b, 0x00185087, 0x0001c6fc}}, Y: Field{[10]uint32{0x01a1c334, 0x03172f51, 0x000bbb57, 0x01a88c72, 0x02098f9c, 0x03021338, 0x03600bc1, 0x033d2b8c, 0x015d504d, 0x00149ea8}}}, + {X: Field{[10]uint32{0x01ed29b5, 0x01a61be9, 0x01d1b4c6, 0x0181c4ab, 0x01f5830b, 0x0298f221, 0x02b67db9, 0x01fbcd0e, 0x01b61ee5, 0x000c8a20}}, Y: Field{[10]uint32{0x00d15ad2, 0x03c49b9f, 0x03604ef4, 0x02ae53b9, 0x01ca83ae, 0x01054c78, 0x010b19df, 0x00d13ac4, 0x028417a0, 0x00059dc0}}}, + {X: Field{[10]uint32{0x00953133, 0x01f726c6, 0x021ae647, 0x00a9d21c, 0x017fb3b4, 0x03f337ea, 0x012806c0, 0x03748e20, 0x034fed0d, 0x000282ca}}, Y: Field{[10]uint32{0x00af0fc9, 0x00928dcd, 0x00ba94bc, 0x03a2c3b5, 0x016fa384, 0x01916323, 0x001c6ca8, 0x02fcbc0f, 0x002cfb5a, 0x00336846}}}, + {X: Field{[10]uint32{0x02c96100, 0x02a101e1, 0x008e63bf, 0x006a9ba7, 0x00a16301, 0x037cf6f3, 0x003dd9b2, 0x006e7fed, 0x033ac0fb, 0x000fce11}}, Y: Field{[10]uint32{0x02624707, 0x00ab06fc, 0x031bcf1e, 0x01f02dd7, 0x0166571c, 0x03c1e739, 0x034c4462, 0x000e5494, 0x0055f5d4, 0x001c31a7}}}, + {X: Field{[10]uint32{0x039620e1, 0x00ddb7e8, 0x013786f6, 0x03214048, 0x025b1911, 0x0300f0e7, 0x0232e594, 0x0395a0ce, 0x003acb9b, 0x0000860d}}, Y: Field{[10]uint32{0x006998b5, 0x00667d94, 0x009ec5e0, 0x0290bd0f, 0x00443299, 0x000beff0, 0x03f24fd6, 0x0142fabc, 0x0148970a, 0x002faa07}}}, + {X: Field{[10]uint32{0x0122d2ac, 0x031bb1bf, 0x02ce0234, 0x0049b72a, 0x0310ddfe, 0x01e177cb, 0x003c0e09, 0x029db72d, 0x03c5fd27, 0x000a2044}}, Y: Field{[10]uint32{0x0342a268, 0x03ad57e3, 0x008fd081, 0x01285523, 0x03ddc3d4, 0x0325d84d, 0x00777260, 0x031723c8, 0x030158fb, 0x002869fa}}}, + {X: Field{[10]uint32{0x02e515dd, 0x0284ebbf, 0x024228c1, 0x008cd0ea, 0x029d0453, 0x012f7f8b, 0x035866ab, 0x0306083b, 0x02fee6ee, 0x0028afe6}}, Y: Field{[10]uint32{0x02c30212, 0x02a5ac01, 0x018745c3, 0x02aa6a3a, 0x0000f2e3, 0x03017a8a, 0x00a5e2ab, 0x02adece8, 0x0071c55c, 0x0016846f}}}, + {X: Field{[10]uint32{0x005f8ea8, 0x02a03749, 0x02900d4b, 0x038e5934, 0x01d17248, 0x01c467f9, 0x03f4d95d, 0x00e8a954, 0x0200c846, 0x003e58e8}}, Y: Field{[10]uint32{0x01bc99eb, 0x0157ec16, 0x020824bc, 0x00d6762d, 0x008bb8f2, 0x03fd09c8, 0x03722301, 0x020f028e, 0x00268c7f, 0x00272165}}}, + {X: Field{[10]uint32{0x030a2a53, 0x03c3b037, 0x0211e7ea, 0x02cfe059, 0x02d51dca, 0x00ea6e24, 0x00394574, 0x0265f0ea, 0x018d07c3, 0x001be194}}, Y: Field{[10]uint32{0x033bfeb2, 0x02695d1c, 0x01f35113, 0x01cbaa81, 0x00bf54f7, 0x029c265a, 0x0376ea95, 0x020bca6d, 0x0216fd45, 0x003542bd}}}, + {X: Field{[10]uint32{0x0206a315, 0x02a20c49, 0x023ad9e1, 0x01cbc9a5, 0x02407260, 0x0243825f, 0x00d8b2a5, 0x03669fe6, 0x024cff70, 0x00297648}}, Y: Field{[10]uint32{0x023b68d1, 0x0184cd67, 0x027c9d35, 0x00d1f446, 0x01ed4d0d, 0x01e6037a, 0x03306abd, 0x03696cd0, 0x03003b20, 0x0021cca2}}}, + {X: Field{[10]uint32{0x00d52891, 0x027abd36, 0x01f52af1, 0x03620fae, 0x0339a0f7, 0x02c5ffe9, 0x0244de90, 0x02378d19, 0x03c9cbc5, 0x000ef092}}, Y: Field{[10]uint32{0x0105b79c, 0x03478a13, 0x032d1386, 0x00a02921, 0x004da845, 0x02fed23d, 0x02bed840, 0x00f629ff, 0x00a48a78, 0x003c238c}}}, + {X: Field{[10]uint32{0x02231493, 0x02ded501, 0x00d469cd, 0x020c3331, 0x0096411a, 0x003979a9, 0x034e41d0, 0x030d813a, 0x002e1b73, 0x003c7fa6}}, Y: Field{[10]uint32{0x018848c1, 0x02a6699d, 0x030d0196, 0x00d1b97f, 0x03f173fb, 0x03df6674, 0x02d3c205, 0x01377085, 0x01eaed9a, 0x000b8806}}}, + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + }, + { + {X: Field{[10]uint32{0x02d903ac, 0x03b6a701, 0x03e5cb09, 0x01d396b5, 0x02d5f962, 0x039ebf4b, 0x0329fd30, 0x02a1118d, 0x015ee637, 0x00024a25}}, Y: Field{[10]uint32{0x03cd091f, 0x0203a4d6, 0x0183fc51, 0x03bea2a3, 0x02ac3d26, 0x024ea57b, 0x0378a130, 0x010aa09e, 0x01003d3f, 0x00309588}}}, + {X: Field{[10]uint32{0x0359dd9e, 0x0011e983, 0x030e7231, 0x03156d63, 0x027ce5e9, 0x032c62b5, 0x01163b04, 0x034d436b, 0x01ee3771, 0x0013e26f}}, Y: Field{[10]uint32{0x0156b049, 0x01ab8c80, 0x01f5c101, 0x014198e3, 0x031e4882, 0x010eec91, 0x00baf4c0, 0x007da571, 0x02d5227a, 0x00329e54}}}, + {X: Field{[10]uint32{0x0074b839, 0x004a1d5e, 0x02b41811, 0x02ce54f4, 0x02be4115, 0x008c2dab, 0x03df0dfb, 0x0396a014, 0x001fc0e1, 0x000f80ee}}, Y: Field{[10]uint32{0x000594ba, 0x0073959f, 0x01b8da0c, 0x03c3f6ad, 0x027de5c5, 0x01c663d9, 0x00f66075, 0x01fd0b11, 0x0163dff0, 0x00344eb8}}}, + {X: Field{[10]uint32{0x03f01197, 0x030c533f, 0x005bf529, 0x03c1e689, 0x0194b668, 0x00b0f132, 0x0396baca, 0x0316a030, 0x0304cae3, 0x0032e7a0}}, Y: Field{[10]uint32{0x03989c1d, 0x01381d8e, 0x00a24c33, 0x02300578, 0x0341b2d1, 0x03c22245, 0x03258cdf, 0x0039a849, 0x02801eb8, 0x0018b1f4}}}, + {X: Field{[10]uint32{0x0357a513, 0x03de39a0, 0x0023f3a3, 0x004d16cc, 0x01f151bd, 0x028a48b1, 0x02fa283a, 0x0124b358, 0x00b7a2f4, 0x003998b0}}, Y: Field{[10]uint32{0x0017d07e, 0x02880728, 0x00d89192, 0x0358954e, 0x01d8035c, 0x00486906, 0x01ae208a, 0x01148c17, 0x013ce612, 0x002ac2c6}}}, + {X: Field{[10]uint32{0x01a7d197, 0x03a434ee, 0x019459ba, 0x030623a9, 0x035e83a8, 0x008b08d2, 0x038ffe0a, 0x03d8e51d, 0x0254280d, 0x0030b162}}, Y: Field{[10]uint32{0x01eeb5e9, 0x00732fe2, 0x002484e4, 0x011516b6, 0x020a47ec, 0x00bb4e69, 0x03041ab6, 0x00249d5c, 0x0288366e, 0x001cba8c}}}, + {X: Field{[10]uint32{0x0337d242, 0x017dfbf7, 0x014b0499, 0x02981e70, 0x01c29fec, 0x02f8d61f, 0x03862c7c, 0x03db2e10, 0x00b1c94c, 0x00102fe0}}, Y: Field{[10]uint32{0x02405088, 0x03609e69, 0x035583d1, 0x02e90af4, 0x0274321e, 0x02c9bf84, 0x013fe9b1, 0x02abc13d, 0x0135d856, 0x002d5e77}}}, + {X: Field{[10]uint32{0x008d2cc2, 0x027ff094, 0x0058c15f, 0x0351c123, 0x018e0bee, 0x001cc371, 0x00cf2a41, 0x01a6f4f2, 0x01b0f89c, 0x0038bcd2}}, Y: Field{[10]uint32{0x00d4c04f, 0x011ef638, 0x03db37e3, 0x03a38272, 0x0242344b, 0x0180856e, 0x0060aec7, 0x01c8de06, 0x03280f82, 0x0007facb}}}, + {X: Field{[10]uint32{0x015a3558, 0x00acd916, 0x027f2baf, 0x021788d2, 0x02ac071f, 0x0236d67d, 0x02f97813, 0x0329c201, 0x0297601d, 0x000f453f}}, Y: Field{[10]uint32{0x0043df4c, 0x036ceb19, 0x01727c6a, 0x03851f07, 0x0082e0a2, 0x02fd5b85, 0x029a931d, 0x0207be3c, 0x01d6e846, 0x0005b1af}}}, + {X: Field{[10]uint32{0x00ea4178, 0x031c0905, 0x03cd510f, 0x0153931d, 0x03782e03, 0x01dd2532, 0x00453c6a, 0x018da1a0, 0x0072d175, 0x00011c2a}}, Y: Field{[10]uint32{0x00098bd6, 0x01127c6e, 0x01aea079, 0x01c1a613, 0x0319b568, 0x034e7032, 0x02145e9f, 0x026b359d, 0x03a9c110, 0x00022669}}}, + {X: Field{[10]uint32{0x02b1fc24, 0x027d6b60, 0x03570ede, 0x0071f8fd, 0x012528d8, 0x03249219, 0x001ac4d2, 0x01949473, 0x0140e82e, 0x00375be9}}, Y: Field{[10]uint32{0x029b74ca, 0x00c71183, 0x022304a4, 0x01afb5cc, 0x03ec10de, 0x00595f9d, 0x026f1ebf, 0x0061bf8d, 0x037eb1d3, 0x0019f98a}}}, + {X: Field{[10]uint32{0x03369217, 0x0379b658, 0x011ead74, 0x01a40198, 0x01ca1c39, 0x01013ab3, 0x01a278f5, 0x03589288, 0x00ffcba4, 0x0010b714}}, Y: Field{[10]uint32{0x022dbc57, 0x0025f88f, 0x01e841c3, 0x03b2a380, 0x03a7a139, 0x0182ea14, 0x0178f5f1, 0x016c75fb, 0x021f6638, 0x00296ea6}}}, + {X: Field{[10]uint32{0x01d08e02, 0x02a4564f, 0x0302881e, 0x02dff6b7, 0x00108547, 0x028f47a0, 0x0069499a, 0x0175e03e, 0x01a82de5, 0x0004fe8b}}, Y: Field{[10]uint32{0x00b03410, 0x0150770f, 0x02b97da5, 0x02ec6690, 0x03e644af, 0x02ed0cb1, 0x03356206, 0x0369c8c4, 0x00b04555, 0x0004d8ce}}}, + {X: Field{[10]uint32{0x0246a9e9, 0x006b3a45, 0x03b0423f, 0x029f62b9, 0x015dcbb7, 0x03329d77, 0x01f82bb9, 0x03bdd5f4, 0x039c4b0a, 0x002560ad}}, Y: Field{[10]uint32{0x0256a698, 0x035d24ea, 0x002ffbc4, 0x0317c4ee, 0x0001cbb5, 0x02be39a9, 0x02c6acee, 0x009bbb53, 0x01800ed4, 0x0008819f}}}, + {X: Field{[10]uint32{0x004ee41a, 0x00ceae65, 0x029a6ac2, 0x0374edf5, 0x02879b56, 0x00b1a0a0, 0x03c10b67, 0x002910fd, 0x0051d3c7, 0x00341b12}}, Y: Field{[10]uint32{0x03295e6f, 0x03e13a62, 0x02e252f1, 0x00d1858b, 0x019b7b84, 0x013d8c24, 0x030acd4f, 0x0342b6ee, 0x014c0584, 0x0016057f}}}, + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + }, + { + {X: Field{[10]uint32{0x03d82751, 0x02b9d458, 0x0354527a, 0x02a41eb4, 0x015645b4, 0x0038eca1, 0x01064f3a, 0x02c424e6, 0x02f3ec6d, 0x0021743f}}, Y: Field{[10]uint32{0x02b1f962, 0x008de893, 0x0331582c, 0x03a5a1dc, 0x023e8751, 0x020b3d59, 0x01d496e5, 0x02302f8a, 0x008413a3, 0x0007c0d9}}}, + {X: Field{[10]uint32{0x015fcade, 0x015b4507, 0x01ff7563, 0x038025c4, 0x0068b482, 0x034477c1, 0x007a6cfc, 0x0313d3d8, 0x034b19a4, 0x001ade43}}, Y: Field{[10]uint32{0x0338d3ff, 0x03fe1bf0, 0x02b0ab6f, 0x02d1ef89, 0x03a83fa5, 0x032b8272, 0x016661f9, 0x03acfbca, 0x001b2ff9, 0x00340ea6}}}, + {X: Field{[10]uint32{0x00de4cf3, 0x0154187b, 0x0066ab99, 0x00d51e28, 0x039340e5, 0x005766b9, 0x03c2d26d, 0x008b0ef9, 0x034ac114, 0x000e136a}}, Y: Field{[10]uint32{0x012d0566, 0x01e5ac89, 0x03a73b7c, 0x00ce5d46, 0x001f430a, 0x00ad31bc, 0x034ed6da, 0x03290efe, 0x01bcd1b9, 0x0035b8f1}}}, + {X: Field{[10]uint32{0x03a3e0cb, 0x03336af8, 0x00be0bb0, 0x037a165e, 0x023d2479, 0x03313e3f, 0x022c367a, 0x02fb4f05, 0x032c2d7e, 0x00104526}}, Y: Field{[10]uint32{0x039033a8, 0x024ba60c, 0x00f2470e, 0x0017bd24, 0x00b3ec78, 0x0240b3ca, 0x0015c9b9, 0x00c150ad, 0x0392db7c, 0x00324356}}}, + {X: Field{[10]uint32{0x025238c2, 0x03cfa487, 0x00b8b98a, 0x0170e03b, 0x0040355f, 0x03a0bb52, 0x031610b4, 0x0056a906, 0x000eb7d4, 0x00053c3b}}, Y: Field{[10]uint32{0x02f07922, 0x01a8d1e4, 0x0139d6e8, 0x03600c12, 0x03d25c00, 0x02109d1f, 0x01fc73e3, 0x01760248, 0x013dd483, 0x002ac4b5}}}, + {X: Field{[10]uint32{0x02972627, 0x00d9a822, 0x01e1f8a4, 0x00100948, 0x00e19216, 0x02f11068, 0x018c1efc, 0x03857206, 0x030949bf, 0x00228c61}}, Y: Field{[10]uint32{0x02bb8af9, 0x011ed591, 0x00bcce7b, 0x016b0fbf, 0x00174436, 0x0161eea9, 0x0177ed28, 0x02993425, 0x008768f7, 0x00192edf}}}, + {X: Field{[10]uint32{0x0143e94d, 0x00d4bbf5, 0x00e188f6, 0x029d5be6, 0x02dd1302, 0x02968376, 0x01c34678, 0x00a1fb10, 0x03bb782c, 0x003ad0bc}}, Y: Field{[10]uint32{0x01924d89, 0x01677911, 0x02d42405, 0x02379835, 0x034cd846, 0x03f37edd, 0x020dd572, 0x0364b726, 0x01074f25, 0x0008d29b}}}, + {X: Field{[10]uint32{0x03f3d3fc, 0x03774a38, 0x01cebf8d, 0x0208170a, 0x02664a9b, 0x021ca9ee, 0x02c3dfe2, 0x021277eb, 0x00fa4e7c, 0x00347eb5}}, Y: Field{[10]uint32{0x00f3704d, 0x008d0f14, 0x03326ed2, 0x00c7bfcd, 0x00bad371, 0x0162de06, 0x033f70e8, 0x03f7f951, 0x0314a348, 0x0023f865}}}, + {X: Field{[10]uint32{0x0219aaed, 0x01396d5f, 0x03327032, 0x037a3199, 0x00459bac, 0x0381aa48, 0x02ec02f6, 0x008366a7, 0x00ca5168, 0x00073c4e}}, Y: Field{[10]uint32{0x012f400e, 0x01ba975a, 0x03ffbc13, 0x023fbf1d, 0x03479eef, 0x02db7785, 0x00372a66, 0x018e197d, 0x02f3171c, 0x0035bff6}}}, + {X: Field{[10]uint32{0x00ba68dd, 0x01cee8b8, 0x02d65374, 0x010e31fa, 0x02bca7c9, 0x0076b4c4, 0x0266838c, 0x01d049fc, 0x02abfe2b, 0x000172fa}}, Y: Field{[10]uint32{0x01d03959, 0x00a7cc9f, 0x033b5942, 0x01c17794, 0x007f3d96, 0x0141bbe8, 0x01386665, 0x0055baba, 0x03b6fa90, 0x0004f288}}}, + {X: Field{[10]uint32{0x02a8aa39, 0x0303a7ed, 0x03ac55f6, 0x01ed29e3, 0x0137a663, 0x01266436, 0x035a0968, 0x03504b21, 0x02be5f40, 0x002d61a1}}, Y: Field{[10]uint32{0x03493c1f, 0x01e4d74a, 0x0347b8fc, 0x02639b6c, 0x01abbdaf, 0x01302a47, 0x01478d45, 0x0230b052, 0x014324c7, 0x00158cb5}}}, + {X: Field{[10]uint32{0x023a1550, 0x011319f2, 0x01f279a5, 0x027e3bff, 0x01801da9, 0x007e2dd4, 0x0130976e, 0x015d04b7, 0x01ab3405, 0x003aff1a}}, Y: Field{[10]uint32{0x01362f6e, 0x010afd90, 0x00b1951f, 0x00639a30, 0x037983c8, 0x01fd3f41, 0x01f199db, 0x02d5028f, 0x00cdb99c, 0x0038bffa}}}, + {X: Field{[10]uint32{0x003b4cc5, 0x007af8ec, 0x037c2ee9, 0x02e96871, 0x02572831, 0x01fcea00, 0x035bc4fe, 0x0330ad9e, 0x01b06b8b, 0x0017f067}}, Y: Field{[10]uint32{0x01b57c28, 0x00e7ee19, 0x03ec4a3b, 0x000f3021, 0x009276f5, 0x028e97bd, 0x022138f9, 0x031f19bb, 0x00c0ec98, 0x003b23a1}}}, + {X: Field{[10]uint32{0x028d319f, 0x02fce397, 0x018e948b, 0x0185b510, 0x00e66aa5, 0x01eab260, 0x010b6533, 0x02a19841, 0x0350ce93, 0x001b3970}}, Y: Field{[10]uint32{0x01cf513f, 0x031af5e5, 0x0378308a, 0x03803b14, 0x012da8f2, 0x02ef88fc, 0x013e3e8c, 0x00f216fb, 0x0026e250, 0x00254340}}}, + {X: Field{[10]uint32{0x00b38cb5, 0x02e15f53, 0x00948bb4, 0x037d34e2, 0x03e10b7f, 0x034fba86, 0x03a8a40f, 0x038a277a, 0x030d42ed, 0x002e23ed}}, Y: Field{[10]uint32{0x0165f3d7, 0x03e9d596, 0x00c7197b, 0x00489ebe, 0x024d4f3e, 0x02cd6a38, 0x034bb994, 0x00ca0180, 0x02ad46ea, 0x0035b1cd}}}, + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + }, + { + {X: Field{[10]uint32{0x0126087e, 0x01012091, 0x020308f5, 0x02220b68, 0x01fdfb6d, 0x01e62e17, 0x009b6041, 0x033a5f07, 0x01ce97ee, 0x003fcac3}}, Y: Field{[10]uint32{0x00c29907, 0x0147807c, 0x02ceb2c9, 0x01bee438, 0x02c7b7ed, 0x01341e4d, 0x034c4dc5, 0x02e8622b, 0x03fef524, 0x00124f44}}}, + {X: Field{[10]uint32{0x0149f8ef, 0x00ea6bcc, 0x034583bd, 0x013b98e2, 0x023deb5c, 0x032c6ec8, 0x0229ebbe, 0x01b27de3, 0x03bc5f36, 0x000a60b6}}, Y: Field{[10]uint32{0x02c7a248, 0x01c9ac05, 0x02d8456e, 0x02504b8f, 0x01095db9, 0x01ed6f27, 0x03a5339c, 0x00882ae7, 0x03e9af66, 0x002986d6}}}, + {X: Field{[10]uint32{0x01d681f9, 0x00153f9e, 0x02b9fc59, 0x03beb23f, 0x0066ce0e, 0x000b252c, 0x037ff25e, 0x008c2222, 0x01f2775f, 0x0031d17f}}, Y: Field{[10]uint32{0x03bb1247, 0x005cd0de, 0x005c7603, 0x00d719f5, 0x038cdbd3, 0x003a0619, 0x031394c7, 0x03979e29, 0x02f2f6b9, 0x00164088}}}, + {X: Field{[10]uint32{0x0380441b, 0x0227d848, 0x03658852, 0x01160385, 0x0060011f, 0x0125f6d6, 0x036eb590, 0x0303dad0, 0x01042af0, 0x00068a39}}, Y: Field{[10]uint32{0x0052af25, 0x03d81aa1, 0x027aeb05, 0x016d1bb9, 0x0104b3e7, 0x025dbc3b, 0x038329a8, 0x0276adf1, 0x027996c5, 0x00155de6}}}, + {X: Field{[10]uint32{0x01cd0ea3, 0x0133bb4d, 0x004815e0, 0x03a0832b, 0x02b34478, 0x019cb9fc, 0x0259e5eb, 0x00142c9e, 0x01f3a975, 0x002aec9e}}, Y: Field{[10]uint32{0x00307bce, 0x024c4cdf, 0x033b6470, 0x0016780b, 0x007c9769, 0x00c1e3b5, 0x034be0c0, 0x025c367e, 0x003bbf17, 0x00177b84}}}, + {X: Field{[10]uint32{0x009a2115, 0x03f54d19, 0x025ebe77, 0x00245e95, 0x02ec7960, 0x01902606, 0x006aca9d, 0x031b1b75, 0x0052b194, 0x003f5cf0}}, Y: Field{[10]uint32{0x02ba6cda, 0x032adee9, 0x0021f049, 0x0158ba75, 0x0104f601, 0x01bdf5b6, 0x00abab02, 0x02211008, 0x00c1c817, 0x001881da}}}, + {X: Field{[10]uint32{0x03c9ee3e, 0x038bcfc6, 0x0382c5c2, 0x02a58f9c, 0x01ea9fa1, 0x0099fb44, 0x03aeaa74, 0x01a0a09f, 0x010b59fc, 0x000fe045}}, Y: Field{[10]uint32{0x019aae06, 0x02b6c316, 0x001603ce, 0x0373f36a, 0x027623b2, 0x011e5598, 0x031beb3c, 0x02a0b519, 0x0268fdbf, 0x00067222}}}, + {X: Field{[10]uint32{0x021e30a7, 0x03c38e58, 0x003242ee, 0x02de6176, 0x002edd5e, 0x034fc805, 0x0250cc0b, 0x00c18074, 0x03e9535f, 0x000322e0}}, Y: Field{[10]uint32{0x03f688de, 0x03defae7, 0x0134dbeb, 0x00dee61c, 0x00aacad2, 0x03bf7215, 0x010e3f17, 0x036b1ee1, 0x0077065f, 0x0003731c}}}, + {X: Field{[10]uint32{0x00e4a007, 0x006fbebe, 0x0358b617, 0x033c22ec, 0x0015ecee, 0x0295b1fb, 0x014ba33a, 0x00b79a56, 0x032dd008, 0x00173e04}}, Y: Field{[10]uint32{0x0068b883, 0x00fc2424, 0x03fe8ce6, 0x025b1e71, 0x02c8946f, 0x01230f7d, 0x02d41588, 0x03e837d2, 0x025c0d61, 0x002d16bb}}}, + {X: Field{[10]uint32{0x003c18e1, 0x00fbf313, 0x03230300, 0x03eeeab5, 0x00ba4ae5, 0x012eb1fd, 0x02267110, 0x0035ae44, 0x01458351, 0x002cfe81}}, Y: Field{[10]uint32{0x02aa2b4f, 0x007efb84, 0x02542cb1, 0x0267c433, 0x01aa55a4, 0x0193f9bf, 0x02182980, 0x03d5adee, 0x00759340, 0x002a1709}}}, + {X: Field{[10]uint32{0x02c2d4a7, 0x01bf9ec9, 0x03fb1095, 0x024cef3f, 0x021bc36f, 0x031013b4, 0x03e33973, 0x02925194, 0x024d0d4b, 0x002db57f}}, Y: Field{[10]uint32{0x02e86371, 0x03739f8e, 0x03cc8118, 0x0139bd78, 0x02745b7e, 0x037fff63, 0x03cf9209, 0x035b0537, 0x03a13abb, 0x0011fcdc}}}, + {X: Field{[10]uint32{0x03816b2f, 0x021b0d46, 0x02e11fdb, 0x021048a3, 0x01ee0cb7, 0x009b1757, 0x00165fe1, 0x00699dba, 0x02dd6595, 0x00169351}}, Y: Field{[10]uint32{0x03e86c60, 0x01ebae1c, 0x00cebaf9, 0x0317ecfb, 0x02b50e6c, 0x03cf7f35, 0x003e27f8, 0x0182ac0a, 0x0396ca0e, 0x001df248}}}, + {X: Field{[10]uint32{0x0066dd33, 0x00cd88bf, 0x036dc509, 0x023fc771, 0x02ea8fbc, 0x000a6c08, 0x03b1b150, 0x01621c1a, 0x03c066cf, 0x0018722e}}, Y: Field{[10]uint32{0x02f10bfa, 0x02ea7ced, 0x00c8ca3b, 0x03ab0a08, 0x036a5106, 0x026174fe, 0x0269994b, 0x03dc0d11, 0x02239e54, 0x0024d667}}}, + {X: Field{[10]uint32{0x035cacbb, 0x019233cc, 0x01b26fce, 0x00a2f58d, 0x0118ac30, 0x0318899c, 0x0177e5bd, 0x003335ee, 0x01b12c72, 0x0013f5a6}}, Y: Field{[10]uint32{0x021ad839, 0x00bbea23, 0x03e6133b, 0x02cba088, 0x00aa998e, 0x036d878b, 0x0079dbfc, 0x0282bb65, 0x02f3f511, 0x0031b243}}}, + {X: Field{[10]uint32{0x016b2ff8, 0x016df337, 0x008fa980, 0x0305ca1b, 0x01876336, 0x03b0ef7c, 0x009f5373, 0x01e1461f, 0x03a57426, 0x002538ca}}, Y: Field{[10]uint32{0x00e1af3e, 0x0121554b, 0x03e13add, 0x010949af, 0x00b33af0, 0x018b67a3, 0x031e4886, 0x0013864b, 0x008b43da, 0x000346d1}}}, + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + }, + { + {X: Field{[10]uint32{0x0056e241, 0x03978b3e, 0x01d28780, 0x0052335b, 0x0357f1ee, 0x0006c84a, 0x012b2e63, 0x0203aa7b, 0x03e4b1e8, 0x00209fee}}, Y: Field{[10]uint32{0x02c293ec, 0x016da2eb, 0x03166d60, 0x00c61a40, 0x007ff7a6, 0x0347449a, 0x03ef2c67, 0x01ec2dc6, 0x00923c72, 0x003183e7}}}, + {X: Field{[10]uint32{0x00b1815d, 0x03912dc3, 0x03461ef6, 0x024862e1, 0x0260470a, 0x01db9acd, 0x02d7c8d5, 0x01ae5cf8, 0x02a7dce5, 0x002ddfc4}}, Y: Field{[10]uint32{0x0257dbc5, 0x00f4af23, 0x0016d6ba, 0x03e46912, 0x014c42f0, 0x00f30b99, 0x00cefb37, 0x02b310fc, 0x01b14f86, 0x0012dbe1}}}, + {X: Field{[10]uint32{0x03b80fa7, 0x012172ce, 0x01388634, 0x01aedc10, 0x033aa7da, 0x00c82067, 0x011a06bd, 0x030bef03, 0x031f6308, 0x000215f8}}, Y: Field{[10]uint32{0x01366b2d, 0x020847c2, 0x0016abd9, 0x0010f35c, 0x03172e37, 0x0372dc51, 0x017cc9d1, 0x005c824b, 0x03423ae0, 0x003d90e4}}}, + {X: Field{[10]uint32{0x005565ec, 0x0176b4b1, 0x005970fe, 0x037d25df, 0x02d858d8, 0x02de7e55, 0x03308b2c, 0x02fc491e, 0x03943018, 0x001225ce}}, Y: Field{[10]uint32{0x02ed07e9, 0x01e41d7e, 0x037b83b8, 0x02596011, 0x01511b35, 0x005116bc, 0x037bb3a0, 0x03706d90, 0x01684f3c, 0x001d87dd}}}, + {X: Field{[10]uint32{0x01c70e63, 0x000b0e82, 0x01496f5d, 0x01e39d4f, 0x029cbb8b, 0x019299cb, 0x005c6557, 0x018010d5, 0x00ea56bd, 0x000a2ab3}}, Y: Field{[10]uint32{0x0057da4e, 0x000e20bc, 0x021e8b9f, 0x03391136, 0x03f5fc59, 0x01da3aed, 0x0289667c, 0x0038559e, 0x022ef81a, 0x000ada4c}}}, + {X: Field{[10]uint32{0x036d6cd3, 0x0002af9e, 0x0378833a, 0x00740e24, 0x03341661, 0x015948e5, 0x0269b870, 0x02061206, 0x02167f2b, 0x003a8499}}, Y: Field{[10]uint32{0x00f450be, 0x018a497d, 0x01a88aae, 0x00b7aef8, 0x01b1c975, 0x00451789, 0x00e112bf, 0x038ff6ab, 0x02e5078e, 0x00086938}}}, + {X: Field{[10]uint32{0x03e674b5, 0x03714bdc, 0x00aac601, 0x02739c18, 0x0392d8f6, 0x033ae293, 0x01db2c9b, 0x02998517, 0x0225a055, 0x0028bced}}, Y: Field{[10]uint32{0x02937941, 0x00e32383, 0x03a53b09, 0x00c5f0cf, 0x039222fa, 0x00ca9f12, 0x0044a90f, 0x01a2ba00, 0x0159614c, 0x001883a8}}}, + {X: Field{[10]uint32{0x03fd71fa, 0x0135d0ae, 0x027d4a4d, 0x00996d14, 0x030b775a, 0x029c1305, 0x02972728, 0x015671b5, 0x018e8eb5, 0x003a4c49}}, Y: Field{[10]uint32{0x034d3307, 0x02f434c5, 0x035f33d9, 0x0386ed78, 0x00b3946c, 0x032552d0, 0x01eb4169, 0x037b83a1, 0x03364c3f, 0x003ec78c}}}, + {X: Field{[10]uint32{0x011eb056, 0x00058c76, 0x01386c76, 0x036e3b3f, 0x01a002ef, 0x00fd457d, 0x018b5c6a, 0x01648c76, 0x03c9eaae, 0x000f13e0}}, Y: Field{[10]uint32{0x005cecab, 0x01624f68, 0x02b87742, 0x0112073d, 0x001982b5, 0x00ec9e20, 0x02d6573c, 0x022da8ce, 0x0007514a, 0x002511e4}}}, + {X: Field{[10]uint32{0x008fadf1, 0x00f632d5, 0x01f9de64, 0x021e9c4b, 0x0300359b, 0x0224605e, 0x0365f8de, 0x01091270, 0x00387f7f, 0x003b7ce1}}, Y: Field{[10]uint32{0x00415fb6, 0x010db3db, 0x03d2879c, 0x004f7a8d, 0x030f4e88, 0x0082a9ad, 0x01802351, 0x0214037b, 0x01b0a189, 0x001cb4ed}}}, + {X: Field{[10]uint32{0x0186dfa9, 0x0187f6ef, 0x013a7190, 0x029026e6, 0x02dc38b4, 0x02040eea, 0x01c1e03e, 0x019f538a, 0x01288a99, 0x002bfe38}}, Y: Field{[10]uint32{0x01d12681, 0x000f0db0, 0x039c7071, 0x02a51067, 0x00f9116d, 0x03f3d4fd, 0x013ebaa1, 0x01f0ff4f, 0x03b32137, 0x002362d2}}}, + {X: Field{[10]uint32{0x00ff55c5, 0x008f5097, 0x01ec9771, 0x00a0689d, 0x035f4efd, 0x020ad2d8, 0x0012c1e7, 0x0110b29b, 0x01fdfb25, 0x0033cdab}}, Y: Field{[10]uint32{0x01a0228e, 0x009e2148, 0x02706aca, 0x03097034, 0x03a7547e, 0x02f67c81, 0x002f58b3, 0x01da1927, 0x02166ae0, 0x00345a84}}}, + {X: Field{[10]uint32{0x009ba9c1, 0x009cdae6, 0x0338e28f, 0x02968274, 0x01e40f7c, 0x03b3b95e, 0x0058262a, 0x0002cfa1, 0x004528dc, 0x0034fede}}, Y: Field{[10]uint32{0x0351b267, 0x02e237fa, 0x02de0061, 0x03570046, 0x02341ced, 0x022dc3f9, 0x03ca0575, 0x02d39f29, 0x0034efa6, 0x003e2535}}}, + {X: Field{[10]uint32{0x0181f79b, 0x015032f0, 0x02db4fe8, 0x01943392, 0x02e045d8, 0x01a97289, 0x01f82e7c, 0x037ebb8b, 0x00a26c63, 0x000c7203}}, Y: Field{[10]uint32{0x01225400, 0x027949b5, 0x025f1f0b, 0x03abd444, 0x01622ff9, 0x023cc364, 0x014e4d36, 0x009b7cc2, 0x02c12029, 0x0024ad67}}}, + {X: Field{[10]uint32{0x032bb909, 0x025b0743, 0x00d999da, 0x01f14d66, 0x03639102, 0x02461f5f, 0x00729883, 0x02aa23fd, 0x000e0ac9, 0x0013b24c}}, Y: Field{[10]uint32{0x00cf4071, 0x028e0fe9, 0x03827b88, 0x020836b0, 0x02d52e16, 0x0213126e, 0x000dc451, 0x00137172, 0x0106be1b, 0x001e0ae8}}}, + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + }, + { + {X: Field{[10]uint32{0x0120e2b3, 0x02d63e88, 0x039aa7f3, 0x0339fd1f, 0x017a58fd, 0x0339b948, 0x03e4ae34, 0x02f6eb9e, 0x01f21f51, 0x003aa992}}, Y: Field{[10]uint32{0x025ad93d, 0x0294c16e, 0x03e59d47, 0x0197c4fd, 0x0201a6b9, 0x021e6a96, 0x01a80f89, 0x02c0eb1a, 0x01ed5bbb, 0x002f8c9e}}}, + {X: Field{[10]uint32{0x03c9b0a8, 0x02f07307, 0x03db453d, 0x0171c17c, 0x029e337b, 0x00089e7a, 0x0223ea50, 0x025fbb09, 0x01b3beb9, 0x000eb6e7}}, Y: Field{[10]uint32{0x005bbdda, 0x039e5d7c, 0x026cc61a, 0x03e61c09, 0x02aad9c8, 0x030257fd, 0x0374de07, 0x0139c4f1, 0x016daee7, 0x000dd38b}}}, + {X: Field{[10]uint32{0x032e070d, 0x00ff4e8f, 0x02a98f58, 0x007314a9, 0x0229aab7, 0x021411f8, 0x00731c3b, 0x012affd2, 0x01e9042f, 0x0012dca9}}, Y: Field{[10]uint32{0x016dd780, 0x02ea0bba, 0x00c3de44, 0x03774a52, 0x00b0b465, 0x0343cf04, 0x0277bb36, 0x03873d80, 0x014e1d6a, 0x00166787}}}, + {X: Field{[10]uint32{0x00ae86f9, 0x03a78324, 0x03caf054, 0x015a58f9, 0x01fefdff, 0x01b17f1a, 0x010955e5, 0x0272edf8, 0x03ac428e, 0x0004a794}}, Y: Field{[10]uint32{0x0289c85d, 0x03bf7347, 0x0201b822, 0x03f45acf, 0x03b2a232, 0x01c4860f, 0x01a2115b, 0x0268a6cb, 0x03958aee, 0x001057b2}}}, + {X: Field{[10]uint32{0x0202591c, 0x039ff612, 0x025a1e9c, 0x02596144, 0x013ef549, 0x01787f58, 0x026bfbeb, 0x03238a16, 0x03fc6539, 0x002a7f24}}, Y: Field{[10]uint32{0x01bec2dc, 0x02b77bda, 0x03253790, 0x01057f3d, 0x01ca888c, 0x02a45979, 0x004c17a1, 0x021c5cfa, 0x0339dc53, 0x00270b39}}}, + {X: Field{[10]uint32{0x005912ec, 0x01c0283e, 0x01113428, 0x00139182, 0x0327f9ca, 0x02abc150, 0x03499694, 0x016de1aa, 0x01d4e3fb, 0x002a9c48}}, Y: Field{[10]uint32{0x02e35978, 0x0132c992, 0x02cbdb11, 0x02a33815, 0x03fee134, 0x01a8bb7a, 0x005266b9, 0x02542714, 0x0077dad0, 0x0031a43c}}}, + {X: Field{[10]uint32{0x01968b59, 0x001b838b, 0x03c2e110, 0x02b84f2e, 0x0309a28b, 0x0026c09d, 0x03d7ac12, 0x027c29a9, 0x017c1a6f, 0x00325000}}, Y: Field{[10]uint32{0x01e572fb, 0x035d9023, 0x009c8fef, 0x02d90e43, 0x00e2842c, 0x016d5d0b, 0x038a1bfa, 0x0218804e, 0x02500c9b, 0x000e7648}}}, + {X: Field{[10]uint32{0x0055b8da, 0x0090f57a, 0x00711922, 0x01f44a25, 0x02c75626, 0x03b84255, 0x005ecb6a, 0x0251216e, 0x0094c8f6, 0x00180511}}, Y: Field{[10]uint32{0x034e4bbd, 0x0001643c, 0x02a4bad5, 0x0309f8fc, 0x03543955, 0x004cb996, 0x00be1fd9, 0x03991a7a, 0x0269f681, 0x0022ed75}}}, + {X: Field{[10]uint32{0x026b3332, 0x01cccd5c, 0x01de6a28, 0x0341cfb9, 0x00310388, 0x01c2fe38, 0x02793a5f, 0x000093b1, 0x039d7eed, 0x0007e12e}}, Y: Field{[10]uint32{0x00e8d52e, 0x010a28c5, 0x003a2554, 0x00b50db7, 0x00c2bcce, 0x016e7b7c, 0x007c27f7, 0x027b3095, 0x01072bca, 0x003b9c9b}}}, + {X: Field{[10]uint32{0x01972bcb, 0x02565e6c, 0x00ceb9dd, 0x00f8907b, 0x02c2f22e, 0x03b685dd, 0x028e0213, 0x027c0a3d, 0x0057c8bb, 0x000f7cb4}}, Y: Field{[10]uint32{0x025d09df, 0x008b34f5, 0x00771b28, 0x025a0065, 0x031b9144, 0x011a9a12, 0x026b23b0, 0x01bbab5b, 0x01c640c8, 0x00371fac}}}, + {X: Field{[10]uint32{0x01efa98e, 0x02a952b3, 0x027995cd, 0x01a046b0, 0x03724844, 0x02647a71, 0x028157b3, 0x03f341b2, 0x00890945, 0x0003c4f8}}, Y: Field{[10]uint32{0x02286767, 0x029dda6f, 0x02ccdc08, 0x01785b3a, 0x03287e70, 0x01ecd8b6, 0x023f8b0a, 0x01f140d7, 0x01f1764e, 0x002b7548}}}, + {X: Field{[10]uint32{0x03d292dc, 0x001a893f, 0x014ce1b8, 0x0202c5dc, 0x01775e26, 0x01ef5e76, 0x008070d3, 0x03e4d2e9, 0x01533720, 0x0012e645}}, Y: Field{[10]uint32{0x03095ca6, 0x0297ff95, 0x02afd433, 0x03116cdd, 0x03938323, 0x017c07d5, 0x03c0a74b, 0x00e889b7, 0x01496110, 0x0038c9dd}}}, + {X: Field{[10]uint32{0x01f59b6b, 0x00700efa, 0x00e2fa5e, 0x018f0622, 0x03e9b38c, 0x035609b4, 0x0328a1d2, 0x03b1f6cd, 0x01a551dd, 0x00377864}}, Y: Field{[10]uint32{0x02cb1410, 0x03658a49, 0x00fecf6a, 0x02ef9c55, 0x028b5738, 0x0314b853, 0x02757d61, 0x01d72f82, 0x03780282, 0x0016cafe}}}, + {X: Field{[10]uint32{0x03b43eeb, 0x0346cd08, 0x0184feee, 0x0006fe04, 0x00181c94, 0x03cd6717, 0x024825ff, 0x017a4dfa, 0x03979eb9, 0x0020f100}}, Y: Field{[10]uint32{0x0084fb51, 0x00d021b5, 0x03b40aff, 0x032ad54f, 0x0295b6bf, 0x0003586c, 0x03c1e46d, 0x03b8f42f, 0x03f2437c, 0x000a55d7}}}, + {X: Field{[10]uint32{0x01c6b699, 0x03157f72, 0x02871b68, 0x00d5af91, 0x02a86f57, 0x01ed05a0, 0x016d7bf9, 0x01bde968, 0x012eed83, 0x0017eac0}}, Y: Field{[10]uint32{0x01c6c3aa, 0x00c854b0, 0x03519b17, 0x01ffaa20, 0x0390ab11, 0x00358bde, 0x02bb4113, 0x034513a7, 0x0270a3c3, 0x000b66fe}}}, + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + }, + { + {X: Field{[10]uint32{0x0234d24f, 0x00d8cb76, 0x037401e2, 0x03c32684, 0x0141b6d8, 0x033d0bb9, 0x011df6de, 0x005a764e, 0x0143c5cf, 0x0039290b}}, Y: Field{[10]uint32{0x02ba9414, 0x03dc4c77, 0x024f13a7, 0x037ea363, 0x00e886ee, 0x02e2b4d3, 0x03c99ccf, 0x031cd49b, 0x02e716d1, 0x001367e4}}}, + {X: Field{[10]uint32{0x028f62bb, 0x03cba8cf, 0x00d2a303, 0x018bdeb9, 0x010553c5, 0x01b13bd3, 0x030acf85, 0x02c634fb, 0x01fb84cf, 0x003f5914}}, Y: Field{[10]uint32{0x032c0911, 0x03642184, 0x0283fd0a, 0x024b4803, 0x00fa2ab4, 0x02f0d133, 0x03e7a5c1, 0x0055e2db, 0x02b2b187, 0x0039d173}}}, + {X: Field{[10]uint32{0x03ea0c68, 0x01042bce, 0x0392b5c8, 0x008d9dec, 0x03094301, 0x034e5beb, 0x009bc8e8, 0x028e8925, 0x0234e156, 0x000f9065}}, Y: Field{[10]uint32{0x0245edb6, 0x02dbfdc6, 0x01a1abcb, 0x0118c0f3, 0x022fa119, 0x01c1a4c1, 0x033cbfe3, 0x0087dfcd, 0x019d924b, 0x000048f1}}}, + {X: Field{[10]uint32{0x01fe696b, 0x0347ee75, 0x007a1fa1, 0x035773cf, 0x030042e2, 0x03e7b6ee, 0x02e81a06, 0x021af1c5, 0x007cb240, 0x0007bb88}}, Y: Field{[10]uint32{0x0029337b, 0x0159c39d, 0x0294ebb4, 0x00b82bf5, 0x037a0206, 0x01187257, 0x03196d12, 0x009a734a, 0x0119aef6, 0x00194b2f}}}, + {X: Field{[10]uint32{0x039824d7, 0x01748f24, 0x01897af7, 0x0130d472, 0x036eb7b6, 0x03dfc2d5, 0x014a3e62, 0x01d423bb, 0x00f5455d, 0x0023650e}}, Y: Field{[10]uint32{0x0366489f, 0x0013d224, 0x0063d8a0, 0x02e0c9ac, 0x038fb9e2, 0x02adbbdb, 0x0260bd31, 0x01b0a8b2, 0x00734fee, 0x000c9878}}}, + {X: Field{[10]uint32{0x03d4b84a, 0x02053105, 0x033e69a9, 0x0123c7d0, 0x00621ddf, 0x00a141c1, 0x022a492d, 0x00bf2c31, 0x01e58dc7, 0x003c4ea6}}, Y: Field{[10]uint32{0x03fd1c81, 0x0243f154, 0x01962859, 0x011c43cb, 0x02b6e37d, 0x038ff81b, 0x02b91cd1, 0x03a656a9, 0x00cd0f0b, 0x000cf0b2}}}, + {X: Field{[10]uint32{0x00d713de, 0x0201c6a6, 0x026208e4, 0x03edd0a3, 0x039360c2, 0x03f95150, 0x00a912a2, 0x01510835, 0x00c558ee, 0x002dc949}}, Y: Field{[10]uint32{0x038350e9, 0x03f94966, 0x01fcb76f, 0x01bf9129, 0x010482d2, 0x0275a505, 0x002d182e, 0x00f91441, 0x039a8a28, 0x0013146c}}}, + {X: Field{[10]uint32{0x0394c0d5, 0x0103c67b, 0x0257908d, 0x0005f15c, 0x01e1c0fc, 0x011b8844, 0x025ab2c3, 0x03ac5351, 0x033ea8a9, 0x003303a8}}, Y: Field{[10]uint32{0x03452fe6, 0x02f965eb, 0x03543dea, 0x0099844f, 0x03f6074f, 0x017ef998, 0x03dd203b, 0x0228bec8, 0x023b711c, 0x003e641e}}}, + {X: Field{[10]uint32{0x023b2cb4, 0x01b0a4ff, 0x010402cc, 0x016fcdc8, 0x023049f3, 0x00484527, 0x01c76e38, 0x0049466b, 0x035a216d, 0x000f7917}}, Y: Field{[10]uint32{0x007eb02f, 0x038ceb0c, 0x0044cf61, 0x03996a1c, 0x02823e28, 0x025f2441, 0x0208aa4a, 0x02b77143, 0x0198405e, 0x002e8aa1}}}, + {X: Field{[10]uint32{0x020c0222, 0x02f5d44a, 0x00b559cc, 0x03e720ba, 0x0016937e, 0x005c03cb, 0x00a18bfc, 0x0228111b, 0x024d9ca5, 0x002792b1}}, Y: Field{[10]uint32{0x00fdc9bb, 0x03dd9ce9, 0x0104e16c, 0x003cf6ae, 0x001c6203, 0x00ecc034, 0x000e8df6, 0x039d34c2, 0x011d9fe4, 0x0033a917}}}, + {X: Field{[10]uint32{0x00e4e5bf, 0x011d9bdb, 0x005b1723, 0x021a8240, 0x029b67ca, 0x012241ab, 0x023fce37, 0x02fa1f07, 0x01c68959, 0x0021447c}}, Y: Field{[10]uint32{0x01789c08, 0x024a5130, 0x025262fc, 0x0226f14d, 0x032da878, 0x01aa8008, 0x01ddf7ec, 0x03521d30, 0x01cf91bc, 0x003b37fd}}}, + {X: Field{[10]uint32{0x02735a1e, 0x030ec513, 0x01fa05f0, 0x0259af98, 0x004003e0, 0x018480bf, 0x038cddad, 0x015b2d1a, 0x03c0799b, 0x0019e2b1}}, Y: Field{[10]uint32{0x02f7c055, 0x00e97dc4, 0x01457a36, 0x02ccf4dc, 0x02597fff, 0x01c417a3, 0x030ff3d5, 0x00a16de9, 0x0233d9a5, 0x00021453}}}, + {X: Field{[10]uint32{0x013258ab, 0x0159a28f, 0x014dc31b, 0x02062af0, 0x0157d242, 0x03852ad6, 0x03a1c72e, 0x018088b3, 0x012e81cf, 0x00231681}}, Y: Field{[10]uint32{0x022d0f8f, 0x038214c0, 0x004ade57, 0x03e70365, 0x0246dae8, 0x00130230, 0x01a80c79, 0x02f6841e, 0x034bb443, 0x001a0476}}}, + {X: Field{[10]uint32{0x022aa9b8, 0x03a5dc20, 0x02f8ed7b, 0x00a4cd41, 0x0300006e, 0x0316b517, 0x026895d9, 0x003db375, 0x0114d868, 0x00192ea5}}, Y: Field{[10]uint32{0x02163565, 0x0347ee6d, 0x03b35e93, 0x01bda0c1, 0x025fef1b, 0x0066f927, 0x0207728c, 0x006f6edf, 0x0322a643, 0x002049cf}}}, + {X: Field{[10]uint32{0x0391bcee, 0x030a82af, 0x00d84158, 0x023c7830, 0x03f5cf1d, 0x015afc4d, 0x0063cec5, 0x00d582f7, 0x0016debd, 0x0033bdfe}}, Y: Field{[10]uint32{0x01966b33, 0x0136a7e0, 0x036ac6bb, 0x000a85cb, 0x03a63e4b, 0x00074917, 0x023b339c, 0x021c0491, 0x00836374, 0x0019f9d3}}}, + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + }, + { + {X: Field{[10]uint32{0x0300bf19, 0x01cee750, 0x02a49471, 0x01daa23f, 0x0392b535, 0x02cd4ada, 0x0160fada, 0x02f76550, 0x03ef360c, 0x0007b203}}, Y: Field{[10]uint32{0x0107cefd, 0x03370730, 0x0207b671, 0x01fd8a56, 0x020146e7, 0x01eaefd7, 0x03a4958a, 0x00d034bc, 0x013756b5, 0x002bbbfa}}}, + {X: Field{[10]uint32{0x014ff9e4, 0x03a01750, 0x010560da, 0x03dbaf62, 0x038e8462, 0x013f242e, 0x02eaa034, 0x012f1b2f, 0x023519f0, 0x0016f9fa}}, Y: Field{[10]uint32{0x03e0bdbb, 0x002c1e11, 0x02309403, 0x00c08466, 0x020e99c6, 0x0156adff, 0x03f890f6, 0x0398151d, 0x02c3f638, 0x000cbccb}}}, + {X: Field{[10]uint32{0x02fea1f9, 0x01f2ef14, 0x012b94b1, 0x01423011, 0x01c4ff0b, 0x01c4194c, 0x00fddab6, 0x03cba0ef, 0x000a55d1, 0x0029b722}}, Y: Field{[10]uint32{0x03c345e9, 0x0305391e, 0x037e63b1, 0x036df9a3, 0x00057b89, 0x01ab2f14, 0x00683a11, 0x019f0c0e, 0x00547dc3, 0x001fbc6a}}}, + {X: Field{[10]uint32{0x01db7bb8, 0x02d517d3, 0x03991e3f, 0x01927e14, 0x00d50028, 0x0237dfd7, 0x013fc869, 0x01399420, 0x01116eae, 0x00163c26}}, Y: Field{[10]uint32{0x025b2d6e, 0x031cd60b, 0x00302bde, 0x0018b45d, 0x02507ee4, 0x0118e019, 0x022ff761, 0x00446835, 0x002aaffe, 0x001f81c0}}}, + {X: Field{[10]uint32{0x02d6c9b3, 0x01030fc1, 0x01637c8d, 0x03a1d219, 0x028c6c4c, 0x0229206e, 0x01c229c7, 0x011664af, 0x013fea42, 0x003f9aea}}, Y: Field{[10]uint32{0x0148bdfb, 0x031e23ea, 0x029b00c2, 0x02fc170b, 0x02d980f1, 0x01504ed5, 0x03b41b34, 0x0261cada, 0x00d74053, 0x001fba46}}}, + {X: Field{[10]uint32{0x007985c4, 0x004f9dc7, 0x02b108b6, 0x01256e78, 0x00134bfc, 0x00bdd30d, 0x00284280, 0x026df395, 0x01caf7b5, 0x0008c82d}}, Y: Field{[10]uint32{0x002c6d44, 0x013c77d3, 0x02b8d4ff, 0x00847367, 0x03d96f10, 0x03e6f2a4, 0x00721b81, 0x03a50c63, 0x003dc88b, 0x0031e7e5}}}, + {X: Field{[10]uint32{0x00f95151, 0x03c41cc3, 0x00b64422, 0x01b910b1, 0x01b96480, 0x030237b4, 0x020c8c2d, 0x0262fec0, 0x02f146fc, 0x00057578}}, Y: Field{[10]uint32{0x03f8ecf2, 0x0281f30b, 0x000f9482, 0x02e5f763, 0x01bb204f, 0x022408fe, 0x010e1097, 0x0353b1fe, 0x0231915f, 0x00296dcb}}}, + {X: Field{[10]uint32{0x009a8e2c, 0x030581b3, 0x021c1413, 0x00693306, 0x03823d8d, 0x021832c3, 0x03cc04fd, 0x0242d8ce, 0x00b9b297, 0x002c3e79}}, Y: Field{[10]uint32{0x033d0db4, 0x0019b137, 0x00ee76c2, 0x000b05c7, 0x003350cc, 0x01bf78fc, 0x00bb0b90, 0x0379b507, 0x03f1843a, 0x00127a0a}}}, + {X: Field{[10]uint32{0x016a5658, 0x02042e4a, 0x025643d7, 0x014907bd, 0x023814b2, 0x01eb8a6f, 0x007e0092, 0x0111eb63, 0x00725688, 0x0021303a}}, Y: Field{[10]uint32{0x001b80d1, 0x019ca6f6, 0x01fd22d9, 0x02607d3c, 0x02d3a61a, 0x0194dc97, 0x007e3190, 0x008b1282, 0x0380c160, 0x00099660}}}, + {X: Field{[10]uint32{0x01d6fad4, 0x000bca76, 0x0124c5aa, 0x033c7268, 0x0094b357, 0x004f567d, 0x02d04ce2, 0x0247b23e, 0x0280670a, 0x0015b6d8}}, Y: Field{[10]uint32{0x019e0836, 0x02703f4d, 0x01cc867a, 0x02868c79, 0x03f5b8b2, 0x035a0c31, 0x03591016, 0x009c9143, 0x0394db57, 0x0036834e}}}, + {X: Field{[10]uint32{0x00dc6a0f, 0x02ed7225, 0x01575375, 0x02450bf8, 0x02744341, 0x00b01df0, 0x01264e7a, 0x01cc7559, 0x01c71a93, 0x003fb5ac}}, Y: Field{[10]uint32{0x036fc7e0, 0x0235cb65, 0x00409ccb, 0x024c28ff, 0x031374d5, 0x0134eb88, 0x039181ae, 0x03fc2a11, 0x03e6b0ff, 0x002378aa}}}, + {X: Field{[10]uint32{0x023a809c, 0x0382c2f2, 0x0346d79f, 0x03d75e60, 0x02dab662, 0x00952a27, 0x03cf97e4, 0x037d5afe, 0x02c83933, 0x0004979f}}, Y: Field{[10]uint32{0x009e70d9, 0x032402a5, 0x00a3dda8, 0x00bbc1ff, 0x031e4e3b, 0x015c868d, 0x03747caf, 0x032ce221, 0x02ede254, 0x003834fd}}}, + {X: Field{[10]uint32{0x00e29355, 0x02217c46, 0x00d86db3, 0x024ce5c8, 0x002f1c8e, 0x0008ee76, 0x00ef8604, 0x032f1c3f, 0x01d992d3, 0x000a9a93}}, Y: Field{[10]uint32{0x01cc2872, 0x00f803ed, 0x0076c005, 0x00e99313, 0x01fe905a, 0x009a3e43, 0x00fdc81e, 0x01f831d8, 0x03ba7c4a, 0x00219df7}}}, + {X: Field{[10]uint32{0x03681028, 0x00a54479, 0x01bb47f5, 0x017abf2e, 0x03196e23, 0x036bcf63, 0x033ce97d, 0x008386fc, 0x03f1185d, 0x00286b2c}}, Y: Field{[10]uint32{0x00a11c9d, 0x02918f85, 0x017881f1, 0x009c7e83, 0x0266eecb, 0x0223c316, 0x00475882, 0x02ca6da8, 0x03a61abb, 0x00156a20}}}, + {X: Field{[10]uint32{0x0148dabf, 0x03ea23f8, 0x038eb1f9, 0x02e4d275, 0x01c1add2, 0x017eb9cd, 0x0364ec23, 0x01d51b65, 0x03026c92, 0x00390b64}}, Y: Field{[10]uint32{0x011e1361, 0x00b1d5a0, 0x03eb9d77, 0x01c0679d, 0x00327275, 0x037ce14c, 0x0338cebf, 0x0212c362, 0x022c6e2d, 0x001904e1}}}, + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + }, + { + {X: Field{[10]uint32{0x026642be, 0x02d64a0d, 0x03a889dd, 0x01c5f562, 0x03ce3490, 0x02037ea2, 0x0300af46, 0x0030be46, 0x038c0467, 0x00051a9d}}, Y: Field{[10]uint32{0x0183efd0, 0x00a5d20f, 0x01ed1d0b, 0x0074bdf9, 0x030aaa97, 0x02752ca1, 0x0269827f, 0x000a2b75, 0x00ec3354, 0x002cc638}}}, + {X: Field{[10]uint32{0x01de5cac, 0x008d955e, 0x0261911b, 0x00f1fb2c, 0x03eefc98, 0x02f34533, 0x0270b5c0, 0x01f89395, 0x00ce8a59, 0x0015d3bc}}, Y: Field{[10]uint32{0x035a4805, 0x026ba9b1, 0x0008cae5, 0x01efbc40, 0x011a260a, 0x01a6de11, 0x016ada05, 0x00671cef, 0x0130281f, 0x00026e66}}}, + {X: Field{[10]uint32{0x03315443, 0x00e1ce09, 0x027299d9, 0x03552ba1, 0x013d79bb, 0x002850a8, 0x02c89982, 0x024d7fd0, 0x00040660, 0x003f1a5b}}, Y: Field{[10]uint32{0x03d28960, 0x003582d5, 0x011b1749, 0x0218426f, 0x01487ff4, 0x01a59ded, 0x030e1cdd, 0x01624aef, 0x03ebf83b, 0x00383389}}}, + {X: Field{[10]uint32{0x020966d3, 0x030b5d09, 0x00645808, 0x0306bbfe, 0x0110a770, 0x026320d7, 0x0109397b, 0x03e7e176, 0x02799d8b, 0x0034f65f}}, Y: Field{[10]uint32{0x033c2e52, 0x03ae1420, 0x004eebdd, 0x0046fa37, 0x03b5e487, 0x03500eb4, 0x02a89275, 0x032579aa, 0x006376ba, 0x002376ed}}}, + {X: Field{[10]uint32{0x02fdb4eb, 0x02cbd705, 0x02a79d1b, 0x01e718b9, 0x028fa3dd, 0x00afac24, 0x0256a356, 0x03cab46b, 0x0221ff4f, 0x0025d2bc}}, Y: Field{[10]uint32{0x01f6f484, 0x0270f7ea, 0x00234840, 0x00a8efff, 0x01111c57, 0x00b0243b, 0x011e43d0, 0x000f2993, 0x007d5350, 0x0015548e}}}, + {X: Field{[10]uint32{0x006b5b56, 0x01857f5f, 0x00b607f3, 0x02abb622, 0x014185c8, 0x02fc8039, 0x03587ed3, 0x010ce337, 0x025700ef, 0x00283a21}}, Y: Field{[10]uint32{0x021d7518, 0x02f7944e, 0x00a51a16, 0x0075c216, 0x01526b87, 0x0214f7ab, 0x01a6b89b, 0x02b542e6, 0x02839fa9, 0x003d6e91}}}, + {X: Field{[10]uint32{0x015aeee3, 0x0012b6d7, 0x00813739, 0x030d9963, 0x01e8284b, 0x01a49c31, 0x0121b3a6, 0x00e62c24, 0x019b49de, 0x0016eaad}}, Y: Field{[10]uint32{0x00f69717, 0x00a6bedc, 0x01eed82d, 0x0276af4c, 0x03215ddc, 0x007ff6bd, 0x01a00866, 0x01fa15b9, 0x03617c0f, 0x002295df}}}, + {X: Field{[10]uint32{0x028c6d4b, 0x003ee4e5, 0x00c12004, 0x033e3d25, 0x02b2be78, 0x032efb82, 0x0174e782, 0x006261ee, 0x013288b3, 0x002c6a99}}, Y: Field{[10]uint32{0x0091ac51, 0x02798aba, 0x03cc383d, 0x02427588, 0x03100a1d, 0x0358ea0e, 0x004aa8e2, 0x0035c49a, 0x031c6081, 0x001fb581}}}, + {X: Field{[10]uint32{0x01726890, 0x02c7913d, 0x03d15851, 0x03fab20d, 0x02e59025, 0x03e44283, 0x0032fceb, 0x0310f404, 0x03a7eb49, 0x003eda17}}, Y: Field{[10]uint32{0x0035783a, 0x03aa3cee, 0x039b2606, 0x004ba439, 0x014fa6cb, 0x02192e82, 0x01ca16d9, 0x0178ba1a, 0x0322c98e, 0x0035d437}}}, + {X: Field{[10]uint32{0x02c6e5bb, 0x03b6bb18, 0x03e6ab7e, 0x03b8d5b3, 0x0324fdff, 0x024a965f, 0x00ab0b83, 0x00417cd6, 0x004108c7, 0x0009445b}}, Y: Field{[10]uint32{0x037e1321, 0x011cca83, 0x0272d4dc, 0x037d4730, 0x0377c508, 0x02057763, 0x037406dc, 0x01df807a, 0x0113e771, 0x0018361a}}}, + {X: Field{[10]uint32{0x00bca48a, 0x012fc4ea, 0x0362f546, 0x03d3a0f7, 0x0178b4d5, 0x00a1fdc7, 0x0327b91c, 0x0265682a, 0x03f659e2, 0x00177963}}, Y: Field{[10]uint32{0x02fd41cd, 0x0253a034, 0x00aa9587, 0x0271383e, 0x003fe5bd, 0x014b4f21, 0x01a623c2, 0x026d54c2, 0x033d8035, 0x001a168e}}}, + {X: Field{[10]uint32{0x00cedd26, 0x01977dd4, 0x015541d7, 0x0277a95c, 0x023cc8b9, 0x0258e78a, 0x01d8100f, 0x03aec984, 0x00372961, 0x002be212}}, Y: Field{[10]uint32{0x00e43f7f, 0x039eb4ec, 0x001708b6, 0x01219ea9, 0x0254549e, 0x02fb4be5, 0x00cbb88e, 0x01c0c34a, 0x03f97b16, 0x003715fe}}}, + {X: Field{[10]uint32{0x01ef63b6, 0x00e0d139, 0x0182ebde, 0x0059cc6c, 0x005ab4d0, 0x02d3f072, 0x01b7fda3, 0x0062febc, 0x01cdead6, 0x001bc609}}, Y: Field{[10]uint32{0x01c655f3, 0x0211b3d1, 0x0145412c, 0x019009fe, 0x013c895a, 0x020ccd15, 0x034204d7, 0x02446e63, 0x027dd591, 0x003fc25f}}}, + {X: Field{[10]uint32{0x02a50e2d, 0x02796c7e, 0x00bdc39f, 0x03b3dab9, 0x00b5a275, 0x00206b74, 0x0256e3ea, 0x0200d96c, 0x02605b88, 0x00148435}}, Y: Field{[10]uint32{0x02fda8ee, 0x026a24d6, 0x0286eb02, 0x03371909, 0x035a273d, 0x03fd9622, 0x0013c0e7, 0x034c04e7, 0x034a5dec, 0x000d7d99}}}, + {X: Field{[10]uint32{0x00a63f3b, 0x0011fb7d, 0x039727b5, 0x000665e3, 0x0183203b, 0x039db1d9, 0x007115f5, 0x028ddad6, 0x0095f762, 0x00317b2e}}, Y: Field{[10]uint32{0x01005024, 0x03cdd1a1, 0x03ee5b53, 0x03b978c2, 0x008beb65, 0x03e48cfb, 0x02a4058f, 0x0207cdd3, 0x01181978, 0x00088949}}}, + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + }, + { + {X: Field{[10]uint32{0x0180eef9, 0x01aa1e4c, 0x039776d7, 0x008268a2, 0x028d0012, 0x02a81ec4, 0x03acebb1, 0x0397c1f8, 0x00f61d22, 0x003e9430}}, Y: Field{[10]uint32{0x034f2811, 0x03635f4f, 0x0213b38c, 0x024e95e8, 0x025e6832, 0x00a069a2, 0x02cd2872, 0x03aea6dc, 0x02922397, 0x001ae131}}}, + {X: Field{[10]uint32{0x007f5048, 0x016f88c6, 0x006d459c, 0x0349120e, 0x02e72328, 0x00ba420d, 0x00140fe0, 0x01d381e0, 0x02ee6190, 0x0018e593}}, Y: Field{[10]uint32{0x01309df8, 0x028a1362, 0x02c84383, 0x024d3779, 0x013d580b, 0x00d2fef2, 0x01ff9b1c, 0x033d068e, 0x033a6b89, 0x000edb3e}}}, + {X: Field{[10]uint32{0x01da5e12, 0x03838ce4, 0x00b2971e, 0x0100572b, 0x02a9c60a, 0x028728ad, 0x02329f93, 0x038c6f36, 0x023c4379, 0x003dd40b}}, Y: Field{[10]uint32{0x0385f4eb, 0x02e717a0, 0x00ebc7a4, 0x00bbdc97, 0x007b86d3, 0x00f59c81, 0x0170945c, 0x03ebf566, 0x01edd67c, 0x000f15fd}}}, + {X: Field{[10]uint32{0x02db2a65, 0x012e87ae, 0x01a31f81, 0x00ab4f2f, 0x01afd7f1, 0x003f27dd, 0x01469ddf, 0x02df88b4, 0x025b4d15, 0x00168f38}}, Y: Field{[10]uint32{0x01327f1d, 0x005c33c7, 0x03e8ed8b, 0x030f6097, 0x033ee28b, 0x03cfe66b, 0x03a6dbfb, 0x017d8e1c, 0x025b92e0, 0x0022cd04}}}, + {X: Field{[10]uint32{0x00b7d105, 0x0124cc44, 0x03c9f207, 0x012e5395, 0x03f4ca5c, 0x038d156c, 0x024f6624, 0x01618a8e, 0x00f983ae, 0x0004bf9e}}, Y: Field{[10]uint32{0x03794a60, 0x02b1bee7, 0x010b8458, 0x01975bba, 0x031dece2, 0x0269f2dd, 0x02b5aa19, 0x02f3dde1, 0x01a338d6, 0x000818bc}}}, + {X: Field{[10]uint32{0x0232478e, 0x00c481cf, 0x027ed237, 0x023caa6e, 0x0024ab31, 0x03cccac8, 0x02c6b7f3, 0x004e203f, 0x01d60106, 0x00350804}}, Y: Field{[10]uint32{0x004e88d4, 0x0015a074, 0x00cc31ce, 0x00bcd542, 0x036fb24b, 0x012fe11e, 0x02d5f5f4, 0x0138306c, 0x00e9a37d, 0x002eb975}}}, + {X: Field{[10]uint32{0x020c5d05, 0x00760ce7, 0x02daff62, 0x0142a95c, 0x02480e6c, 0x020212c6, 0x004bb102, 0x011cf563, 0x031347df, 0x001daab0}}, Y: Field{[10]uint32{0x01ece63e, 0x01866dd4, 0x02ee3556, 0x033c0579, 0x034b1225, 0x00809897, 0x02f32c83, 0x01c3beaf, 0x02ef0d5c, 0x003bd55d}}}, + {X: Field{[10]uint32{0x029f44d0, 0x01ccdd52, 0x03a0016a, 0x01b9a6a3, 0x0385dbcb, 0x0037907f, 0x010be34f, 0x00fb69a4, 0x01af98f9, 0x00173981}}, Y: Field{[10]uint32{0x01d30105, 0x0017cd22, 0x00cc6c0d, 0x02fe8cbb, 0x00ab3cb1, 0x0071db16, 0x0256bd03, 0x01aff9ee, 0x039bec22, 0x00133773}}}, + {X: Field{[10]uint32{0x0053c086, 0x01bd217f, 0x01aec9e2, 0x00d27268, 0x00c6b55c, 0x017a2041, 0x0260c314, 0x0173321f, 0x025bbe5c, 0x002998ff}}, Y: Field{[10]uint32{0x01016201, 0x03140ca9, 0x00fc0e69, 0x0295ce65, 0x03991ecc, 0x02608f70, 0x01b102c8, 0x007efd74, 0x017f6b21, 0x002d5066}}}, + {X: Field{[10]uint32{0x01f40840, 0x0035a472, 0x0359eaa2, 0x010a7954, 0x03a71df4, 0x00e290d1, 0x00eaa239, 0x03dd07f9, 0x0121121f, 0x00380d1b}}, Y: Field{[10]uint32{0x03d7ce72, 0x0286abfc, 0x033edc39, 0x0269baf4, 0x02269cd3, 0x03b9ee8a, 0x016d4a97, 0x02255b5d, 0x03713c99, 0x000fb9a0}}}, + {X: Field{[10]uint32{0x03758574, 0x02007b52, 0x01c6e9ad, 0x02250d3e, 0x03d83266, 0x02b8af7c, 0x03ca1027, 0x0336096d, 0x027a0206, 0x0037a554}}, Y: Field{[10]uint32{0x0367232a, 0x037c7f3e, 0x02deb4b7, 0x00145568, 0x03bae6a1, 0x03c5a7b5, 0x021dc847, 0x03453938, 0x0056ac93, 0x001334f8}}}, + {X: Field{[10]uint32{0x016ddcd3, 0x01c8dee8, 0x0003556a, 0x000087a8, 0x03044b11, 0x02e1d86b, 0x035beb6c, 0x0267b7de, 0x0136f64e, 0x0006b86b}}, Y: Field{[10]uint32{0x027eb2b7, 0x0118674b, 0x0213c7cc, 0x0377f2ed, 0x0159616a, 0x00841122, 0x0074f775, 0x02488167, 0x014987a0, 0x001c0581}}}, + {X: Field{[10]uint32{0x0185474f, 0x026e2aff, 0x00668d77, 0x00ae258d, 0x02894c4a, 0x011e16ba, 0x02dccbe4, 0x00ab76ff, 0x00e066d3, 0x002369af}}, Y: Field{[10]uint32{0x017b4ef7, 0x03e71f4f, 0x01d7a5fd, 0x024c176f, 0x010b1cc5, 0x01c77ffc, 0x03ddf5d0, 0x0353fe13, 0x006af31e, 0x0004ff1b}}}, + {X: Field{[10]uint32{0x029de533, 0x03ffe242, 0x02e3c80f, 0x019c08d5, 0x002a9bb5, 0x0191c49d, 0x02979f6a, 0x0243e483, 0x01123337, 0x00044e2b}}, Y: Field{[10]uint32{0x01332573, 0x02dc253f, 0x040006a8, 0x002d1528, 0x03f679bd, 0x03e569f7, 0x030dc3e9, 0x0076521b, 0x01b75875, 0x002cd549}}}, + {X: Field{[10]uint32{0x01d042ea, 0x0350959f, 0x02fd06b5, 0x0299163a, 0x02ebfa26, 0x00cf24ef, 0x03d6649e, 0x02e8e6c6, 0x00c7cfb3, 0x001cca6b}}, Y: Field{[10]uint32{0x035c94a1, 0x0233fb0b, 0x034f0ada, 0x01cc77ea, 0x02184897, 0x03eada3b, 0x0284e794, 0x01bc5224, 0x013541b7, 0x00249c92}}}, + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + }, + { + {X: Field{[10]uint32{0x03067ec2, 0x00f4cad7, 0x025220e5, 0x02d756ee, 0x021a288a, 0x03623a10, 0x025bf6b7, 0x006846c6, 0x01d0ca72, 0x00368758}}, Y: Field{[10]uint32{0x02d836f1, 0x03ee83c6, 0x0348a655, 0x026749e6, 0x0166a738, 0x0072478a, 0x00076616, 0x00c1b1e7, 0x015a7c99, 0x002055fd}}}, + {X: Field{[10]uint32{0x00d3c369, 0x0084348b, 0x02934b3c, 0x020f87e3, 0x02236054, 0x03704a0e, 0x005d5f61, 0x0311137e, 0x000b4ef4, 0x00271ef8}}, Y: Field{[10]uint32{0x02329515, 0x038ffae8, 0x01cbd29e, 0x00e859da, 0x003e3115, 0x03390052, 0x0226d455, 0x0034814a, 0x00de74b2, 0x00248830}}}, + {X: Field{[10]uint32{0x0295a8db, 0x021dccbe, 0x036f615d, 0x03111e74, 0x03b83ec0, 0x0246c5c8, 0x02966469, 0x03741067, 0x01a46303, 0x0038fa43}}, Y: Field{[10]uint32{0x030d1cf9, 0x01b3dfc6, 0x00d3d101, 0x025f3261, 0x02fbb1ef, 0x01c0b9da, 0x00faa90c, 0x005e2ec0, 0x03c0056c, 0x003ef94e}}}, + {X: Field{[10]uint32{0x03b8c9e3, 0x03364b5e, 0x0178e76b, 0x029c1504, 0x0174dd06, 0x02333124, 0x01664b23, 0x0098eed5, 0x03f42825, 0x0003f360}}, Y: Field{[10]uint32{0x034aa9ad, 0x03557ef7, 0x03bf4e86, 0x0337c589, 0x03adbeae, 0x017f6da0, 0x018232de, 0x03ef3b47, 0x01cfeac5, 0x001b02f0}}}, + {X: Field{[10]uint32{0x012ee214, 0x02bf5904, 0x0154017a, 0x025e564c, 0x00782a4e, 0x01703007, 0x03650dfd, 0x035dd6a2, 0x02c732e3, 0x0027d3ff}}, Y: Field{[10]uint32{0x0085f37a, 0x01108894, 0x000283ef, 0x024c2f22, 0x019719b6, 0x035d71a7, 0x0296682f, 0x00bcb983, 0x02e1318e, 0x0018e738}}}, + {X: Field{[10]uint32{0x001d0ce6, 0x030f72d5, 0x00d41f4f, 0x028b3d66, 0x02748992, 0x00e817ec, 0x0214cce3, 0x02a504bb, 0x022937f1, 0x00050a56}}, Y: Field{[10]uint32{0x0338bb86, 0x0206a2b5, 0x0241a52a, 0x01806d74, 0x01310895, 0x011020ec, 0x0031c448, 0x0141c46c, 0x0363df11, 0x003fa9d4}}}, + {X: Field{[10]uint32{0x0361a0a5, 0x01a05147, 0x00e3ef8b, 0x0386cf05, 0x004b1253, 0x03d102cb, 0x031a0a41, 0x012b06c5, 0x022d4113, 0x0010c7d8}}, Y: Field{[10]uint32{0x00cef899, 0x01edff9e, 0x0177246b, 0x0010d559, 0x0241baaa, 0x01c8ea9c, 0x02de6519, 0x010e3db5, 0x027fe7aa, 0x0028a60c}}}, + {X: Field{[10]uint32{0x026b64f1, 0x00e6512c, 0x02d995cf, 0x00a3d51d, 0x01b7edcf, 0x01447967, 0x00da4c62, 0x03c04353, 0x007f1b58, 0x001c5d50}}, Y: Field{[10]uint32{0x024234d5, 0x039fbeac, 0x01d2a426, 0x02ddd11c, 0x02b01fe8, 0x00d3321b, 0x02d34011, 0x035543cd, 0x014344e3, 0x0010ed15}}}, + {X: Field{[10]uint32{0x03748503, 0x0099f559, 0x028e7cac, 0x011dcc4c, 0x000e6e0e, 0x03e284ab, 0x0362ef39, 0x023ee1b2, 0x02ddece7, 0x00264f6e}}, Y: Field{[10]uint32{0x02b0cee2, 0x01cd84df, 0x01aa49ba, 0x03da6e2b, 0x0217f87b, 0x01e87d46, 0x01f78478, 0x03bbade1, 0x01ee8569, 0x0029486a}}}, + {X: Field{[10]uint32{0x03421e21, 0x0136ea65, 0x022f4e46, 0x0288f3bf, 0x003aca86, 0x010633eb, 0x00289212, 0x005dcaea, 0x006b84e5, 0x0003083a}}, Y: Field{[10]uint32{0x01aa6a45, 0x020f5928, 0x01349dfc, 0x03d96f42, 0x0386ee76, 0x0386696d, 0x01237a11, 0x02b6b068, 0x01bf76d0, 0x003d587a}}}, + {X: Field{[10]uint32{0x02d23d80, 0x02889d69, 0x00d478de, 0x007c991d, 0x00e10bd1, 0x024258b0, 0x039431cb, 0x017a968c, 0x02ba06ad, 0x001d7c5e}}, Y: Field{[10]uint32{0x000dd57e, 0x02a16c0a, 0x02590986, 0x03b6ed3a, 0x02372ffb, 0x0066d8a4, 0x03c7d0bf, 0x026a031f, 0x02fe1563, 0x00281e98}}}, + {X: Field{[10]uint32{0x03344f7f, 0x0233e712, 0x020c4c71, 0x03f52339, 0x00ee8b89, 0x0349b504, 0x017e32cb, 0x0382b83a, 0x004bd972, 0x000d5332}}, Y: Field{[10]uint32{0x01db82d6, 0x02c46ba9, 0x020ec7e4, 0x0006180b, 0x018e36c6, 0x026ea215, 0x010b493f, 0x01ad759d, 0x0329291c, 0x0027012f}}}, + {X: Field{[10]uint32{0x01ad3413, 0x02e6db58, 0x01684ae2, 0x00100c9f, 0x028db9c0, 0x032e1ede, 0x0295f485, 0x03d2829b, 0x015e11d9, 0x00199e15}}, Y: Field{[10]uint32{0x02bca672, 0x0204081f, 0x02660124, 0x0054eb71, 0x02a6ce2d, 0x01f2f7e7, 0x01266d92, 0x03d91a49, 0x023de278, 0x00144376}}}, + {X: Field{[10]uint32{0x0102b4b1, 0x01ed7e0d, 0x00a44748, 0x01535b02, 0x01c4af25, 0x018884ea, 0x0086c0f2, 0x0250a101, 0x0018da0f, 0x002b3bc5}}, Y: Field{[10]uint32{0x02e85bfc, 0x007e9e59, 0x0078c6f8, 0x0242b7c6, 0x012a3f62, 0x03625c73, 0x00017b53, 0x01e93781, 0x019fd7e8, 0x003134d5}}}, + {X: Field{[10]uint32{0x02cc8563, 0x002bd6c1, 0x001eaac0, 0x016fff84, 0x009224df, 0x00658da2, 0x02c82bd8, 0x01dd22b6, 0x02362cda, 0x003af712}}, Y: Field{[10]uint32{0x0394ccfa, 0x005ef3a8, 0x00f9249b, 0x02492481, 0x03bec407, 0x033753c1, 0x01ee35e6, 0x034d7e6c, 0x0144e856, 0x0019668c}}}, + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + }, + { + {X: Field{[10]uint32{0x01064e13, 0x00ec1843, 0x01e062a7, 0x038111bc, 0x0215311d, 0x023f5059, 0x015ff98e, 0x001a41c8, 0x02ff0c97, 0x002a38a0}}, Y: Field{[10]uint32{0x01f4cc0c, 0x01f1cc44, 0x02bd6cef, 0x00f94375, 0x008b679a, 0x02c94562, 0x03b7f3c5, 0x007026af, 0x015b8db8, 0x001fe5cd}}}, + {X: Field{[10]uint32{0x037653a1, 0x03ae7a9f, 0x027c1c15, 0x02a9d4f5, 0x03efbe9e, 0x03a99b98, 0x0076f805, 0x02bb2f2e, 0x02e7e27f, 0x0032b1bc}}, Y: Field{[10]uint32{0x02c5e556, 0x0042b43f, 0x003a068c, 0x0395a204, 0x0081e83a, 0x010a8d14, 0x01b65d9a, 0x01bc6533, 0x02e5e2aa, 0x003df505}}}, + {X: Field{[10]uint32{0x023979b5, 0x00666c2e, 0x0029e22a, 0x023799fa, 0x00ba288f, 0x03b90394, 0x0337f0b1, 0x03898c9f, 0x03c5cdad, 0x002b8881}}, Y: Field{[10]uint32{0x0050fa6f, 0x00f359a1, 0x0388968f, 0x01f4df53, 0x00fca87b, 0x00eb5c18, 0x00c92452, 0x027dc6b5, 0x02510c07, 0x003aa47f}}}, + {X: Field{[10]uint32{0x0224003d, 0x03d2ac21, 0x00b11cc9, 0x00a508e3, 0x014ab767, 0x016390c9, 0x03c5932e, 0x03481bbe, 0x0246ee37, 0x0039b7f7}}, Y: Field{[10]uint32{0x0216b93b, 0x02194388, 0x017dd754, 0x03a949ff, 0x003b1ce5, 0x0223e488, 0x02f48f7b, 0x00e5263c, 0x03b7be91, 0x0021c9ec}}}, + {X: Field{[10]uint32{0x02fca824, 0x00064403, 0x024fae41, 0x013fa885, 0x01e0be0c, 0x01961518, 0x02c54100, 0x02b39673, 0x010cad72, 0x0032e37b}}, Y: Field{[10]uint32{0x03227361, 0x002f4163, 0x01742f14, 0x037f1e4c, 0x0096ad1f, 0x028b32f1, 0x0316c487, 0x0223216c, 0x008f740d, 0x000ce940}}}, + {X: Field{[10]uint32{0x00e4dd6a, 0x0384787b, 0x01cef559, 0x02728c88, 0x020a00e4, 0x02359311, 0x01eca37e, 0x00ad92f2, 0x00f7b279, 0x001276f9}}, Y: Field{[10]uint32{0x029e3eae, 0x02dca90a, 0x03b69b13, 0x00bf2816, 0x021c3855, 0x01a48956, 0x01fe33db, 0x02071cb1, 0x02984704, 0x002e2d5c}}}, + {X: Field{[10]uint32{0x03cbd327, 0x006d368e, 0x02aee941, 0x01488792, 0x02b04e08, 0x01f9dbb5, 0x0294900d, 0x020d9c23, 0x03298af1, 0x002c314e}}, Y: Field{[10]uint32{0x017be436, 0x01af128b, 0x02a0f161, 0x0031d18d, 0x03d82a22, 0x02d9acab, 0x00f6a601, 0x01fa858e, 0x03401fbd, 0x003b8aa5}}}, + {X: Field{[10]uint32{0x00dce109, 0x00440d52, 0x011d3b0e, 0x005273c8, 0x02e250e3, 0x02b25820, 0x0240cfc7, 0x0208f59a, 0x009cd9a6, 0x000f1382}}, Y: Field{[10]uint32{0x0219aeea, 0x03d9648e, 0x02697e2b, 0x010b65ff, 0x039579e1, 0x015d934d, 0x0357bca1, 0x0246d201, 0x02669fe1, 0x0010feef}}}, + {X: Field{[10]uint32{0x03b836a1, 0x03bed8e5, 0x01ef7de6, 0x017fdd9e, 0x02c80640, 0x039dfd49, 0x018862ec, 0x02e48353, 0x033f329d, 0x001bdae9}}, Y: Field{[10]uint32{0x02832b84, 0x037cbec1, 0x03f934db, 0x014a2387, 0x00d8990c, 0x016fba70, 0x030b8a40, 0x030638f6, 0x0217ff5f, 0x00371de2}}}, + {X: Field{[10]uint32{0x025d5241, 0x015adfe0, 0x012f6680, 0x032a482f, 0x02563ed7, 0x002cfaa2, 0x00277d34, 0x019d394d, 0x01ada779, 0x003e3307}}, Y: Field{[10]uint32{0x0070e10a, 0x02bc0e3c, 0x00bd4960, 0x01b187ac, 0x0052c2d7, 0x01459bc1, 0x03e892fa, 0x01c3facc, 0x024410b1, 0x0004f793}}}, + {X: Field{[10]uint32{0x02b39ede, 0x038d0827, 0x012d42ae, 0x00cb5c18, 0x00310880, 0x004090d8, 0x00ff467e, 0x00abd2ef, 0x027dc742, 0x001f51c6}}, Y: Field{[10]uint32{0x03f6607e, 0x02f3652a, 0x028fd0c9, 0x01f4708a, 0x027795cf, 0x03ff21be, 0x0382231e, 0x0215941e, 0x0319f3a6, 0x0000129e}}}, + {X: Field{[10]uint32{0x00e5f03a, 0x022d6f7d, 0x006d54fe, 0x03ac7858, 0x0196565f, 0x035f7f8d, 0x03dcfb33, 0x02f8cdcd, 0x03dd0289, 0x002030d3}}, Y: Field{[10]uint32{0x023ca504, 0x03d151bf, 0x005cb117, 0x03bc7cc9, 0x03d30b2a, 0x01f72680, 0x02db5700, 0x007b3557, 0x0056a78c, 0x00091f82}}}, + {X: Field{[10]uint32{0x025eb1c1, 0x03527895, 0x01c5aa56, 0x019f36b9, 0x027fcd75, 0x0260bc25, 0x030fcc31, 0x00feb1c1, 0x0163f9b7, 0x003c0094}}, Y: Field{[10]uint32{0x01de2ae0, 0x01f5c11b, 0x011e57da, 0x01735b34, 0x018576ff, 0x0289abfb, 0x026b4a5d, 0x00837d31, 0x01e8883d, 0x000153aa}}}, + {X: Field{[10]uint32{0x0214f422, 0x00281872, 0x00deca61, 0x03b67931, 0x00b383e4, 0x0136f1ef, 0x03e80221, 0x037cf52b, 0x02e897a9, 0x001b3b46}}, Y: Field{[10]uint32{0x004fc091, 0x00f690f6, 0x00932ae7, 0x0321e6a7, 0x008ca102, 0x02f9ae6e, 0x0095a728, 0x0239eaed, 0x02eb1b0f, 0x00096222}}}, + {X: Field{[10]uint32{0x02c32c64, 0x00d424f6, 0x00bf84cf, 0x000fb2b9, 0x020e36fe, 0x03d1dc57, 0x0304e950, 0x008ea83d, 0x000001ed, 0x002b0485}}, Y: Field{[10]uint32{0x02b1a867, 0x00ab6eb7, 0x03089881, 0x00e9694f, 0x03ed5a5d, 0x00c12668, 0x030b6957, 0x022ebc61, 0x00cbac33, 0x0033a3af}}}, + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + }, + { + {X: Field{[10]uint32{0x0319497c, 0x00e0b7a0, 0x008c022f, 0x03e94494, 0x015d59b1, 0x0244f2ac, 0x039e56e6, 0x02161cb4, 0x03b9c9a2, 0x0005d294}}, Y: Field{[10]uint32{0x039afa73, 0x0284eb01, 0x0054383d, 0x007632e6, 0x02646b3a, 0x0311fe79, 0x034155f2, 0x0270595e, 0x0037abfc, 0x00333277}}}, + {X: Field{[10]uint32{0x000dd273, 0x0368dbe1, 0x001115f5, 0x00383914, 0x03d53d28, 0x006e4ba8, 0x007071ef, 0x01aed8c3, 0x02e79694, 0x000839b8}}, Y: Field{[10]uint32{0x0346b593, 0x033f456e, 0x0293cc07, 0x01e4f6a1, 0x01811ec9, 0x01e1d195, 0x00ba1ad9, 0x01679128, 0x02fe4f15, 0x0034eb5e}}}, + {X: Field{[10]uint32{0x014b8367, 0x0201cf5d, 0x006bfe94, 0x01f59f54, 0x01b775b7, 0x0210da97, 0x00aa5d45, 0x0149b903, 0x014ae446, 0x00179682}}, Y: Field{[10]uint32{0x01ce85ca, 0x00a6a764, 0x03fa4453, 0x03bcf797, 0x02796aa9, 0x01ca92de, 0x00901f15, 0x0178170b, 0x00c9a479, 0x002ba2be}}}, + {X: Field{[10]uint32{0x02077674, 0x0153cc06, 0x00ca3e7b, 0x004db309, 0x0035ae68, 0x039c76dc, 0x00280a07, 0x01476ea0, 0x0024d7a3, 0x0023832a}}, Y: Field{[10]uint32{0x02b7ed98, 0x0132fb04, 0x010290b8, 0x00674be4, 0x03cff604, 0x0298b3d5, 0x0169d24d, 0x00b50771, 0x02075919, 0x00013b15}}}, + {X: Field{[10]uint32{0x03b10d9d, 0x0215e4e5, 0x00fcaf19, 0x0062747e, 0x01e6a52f, 0x00432e0b, 0x02ccb833, 0x00ba1677, 0x00adb970, 0x00003538}}, Y: Field{[10]uint32{0x0140dced, 0x0040121c, 0x01923e82, 0x0325e38b, 0x030b5898, 0x00c8a1fd, 0x012f8464, 0x0190251f, 0x01981837, 0x0021ee00}}}, + {X: Field{[10]uint32{0x00bcad59, 0x017a0d83, 0x02aa07b0, 0x00169382, 0x017c845a, 0x017e40bc, 0x0217c85a, 0x00d801ea, 0x001152ac, 0x000bb5db}}, Y: Field{[10]uint32{0x00ea66fe, 0x031ea271, 0x0394114a, 0x0004c29f, 0x015f72c6, 0x0205d9fb, 0x01a6eaec, 0x017c88b3, 0x014043b8, 0x0018e7d3}}}, + {X: Field{[10]uint32{0x009caee8, 0x00469827, 0x030bb208, 0x0116c689, 0x03632e20, 0x03b12999, 0x037a19ae, 0x01d303db, 0x021368ef, 0x0000d994}}, Y: Field{[10]uint32{0x0372b711, 0x03b1a8ed, 0x03a7f0a9, 0x0224ca56, 0x0101cba9, 0x02e9a511, 0x009fc681, 0x037b6665, 0x032b2a93, 0x0007c630}}}, + {X: Field{[10]uint32{0x00192441, 0x02bf17aa, 0x034afe96, 0x00868c86, 0x01afdb58, 0x038f59b0, 0x03a63553, 0x020b4717, 0x00da51c9, 0x003deed4}}, Y: Field{[10]uint32{0x005165ae, 0x0103a875, 0x0074bbc6, 0x007eef13, 0x01b1cfdc, 0x03799217, 0x01bc63bd, 0x029498c4, 0x03e30334, 0x0024f30e}}}, + {X: Field{[10]uint32{0x0046c85c, 0x03e5d465, 0x0006353f, 0x00239807, 0x02de37de, 0x00fdb1ba, 0x00676c45, 0x023c7ea8, 0x01056fdb, 0x00039624}}, Y: Field{[10]uint32{0x0148972e, 0x031df9c8, 0x01add5f6, 0x013a0337, 0x00f49023, 0x03d20626, 0x007418ba, 0x01ef683b, 0x005f11fa, 0x0038e692}}}, + {X: Field{[10]uint32{0x015ae087, 0x01240401, 0x00a57e03, 0x01be8d25, 0x00c671b9, 0x010e8544, 0x03945fb7, 0x029660b4, 0x03155b6e, 0x0028d199}}, Y: Field{[10]uint32{0x02887627, 0x03cd98c8, 0x030bccb3, 0x01bc8e53, 0x01c53eab, 0x028a8c14, 0x02fe9a1a, 0x0316f637, 0x03a5e56b, 0x00087297}}}, + {X: Field{[10]uint32{0x022e1259, 0x022b7cf0, 0x0362aff1, 0x02901a04, 0x01931739, 0x0001dddc, 0x02cf5faa, 0x0118fcad, 0x026d26f1, 0x0029d004}}, Y: Field{[10]uint32{0x034a5f43, 0x01c5c90c, 0x02dad5f7, 0x01d4ec75, 0x0117865e, 0x019f1fb9, 0x005f174a, 0x03c7fc6c, 0x03baf194, 0x00016a7f}}}, + {X: Field{[10]uint32{0x00b84b48, 0x03d15c79, 0x017ea830, 0x031e67a0, 0x0091adf4, 0x03505fdc, 0x0110f577, 0x0293d506, 0x030e7d45, 0x0017ec77}}, Y: Field{[10]uint32{0x03be8eb8, 0x037a9a8d, 0x021ad77e, 0x02421cfc, 0x020629c3, 0x039b4960, 0x00f4646f, 0x013527ef, 0x03bcbc3c, 0x000854be}}}, + {X: Field{[10]uint32{0x0308f1fe, 0x0285e8f2, 0x007bfd88, 0x039c2e82, 0x03d7ce7e, 0x0360b45d, 0x01405765, 0x01d39299, 0x00216d94, 0x0021f92e}}, Y: Field{[10]uint32{0x02d5e2ec, 0x01d2b26b, 0x02d9d75f, 0x036f59e1, 0x006e2f23, 0x00be30b3, 0x03d7f8ea, 0x01233b35, 0x02c07663, 0x003dd38e}}}, + {X: Field{[10]uint32{0x01b8f255, 0x01b661fe, 0x00d21114, 0x039d24a8, 0x01e77d43, 0x02aa0bfa, 0x022e4608, 0x02e29058, 0x017478e1, 0x00256ef6}}, Y: Field{[10]uint32{0x00361439, 0x038ffa0a, 0x03fc1010, 0x02bbf1dd, 0x00f2ba72, 0x003cb436, 0x032c208f, 0x031dff7b, 0x02d129e3, 0x002fb50e}}}, + {X: Field{[10]uint32{0x01c4d15c, 0x01c039a8, 0x0274b9a8, 0x02fc1f03, 0x00105ea7, 0x00495291, 0x02c22c0c, 0x01e696a4, 0x03463fea, 0x000d7a86}}, Y: Field{[10]uint32{0x033fe1ea, 0x00e6ebdf, 0x0095edc9, 0x0280c194, 0x005d633a, 0x01d34ec6, 0x008fa5fd, 0x034b35e2, 0x01651b9e, 0x002b4864}}}, + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + }, + { + {X: Field{[10]uint32{0x0075b7ba, 0x03f7fc25, 0x00b3d884, 0x00c39246, 0x03e039e7, 0x01406336, 0x03e57edf, 0x01e170f4, 0x02981943, 0x002564e5}}, Y: Field{[10]uint32{0x0124f2fd, 0x022afe1d, 0x01385e9b, 0x019321c2, 0x009c653f, 0x02e735a1, 0x020386a4, 0x00c7762e, 0x012888c3, 0x000b9f95}}}, + {X: Field{[10]uint32{0x03c8f53b, 0x01d6a502, 0x007c7072, 0x01ace45d, 0x02d70222, 0x035cf657, 0x0232ca7d, 0x029f7abf, 0x0005ff0d, 0x0032fb85}}, Y: Field{[10]uint32{0x00c87f45, 0x00b9ac9e, 0x03728292, 0x03da049b, 0x030d9ff4, 0x02e0a533, 0x01f3e689, 0x03e40ad4, 0x034f4e75, 0x003d8847}}}, + {X: Field{[10]uint32{0x03d69985, 0x03177643, 0x032aea09, 0x032db77d, 0x009f309c, 0x02f333c5, 0x00f690df, 0x00bdf9e2, 0x0275ceb7, 0x0002ba5d}}, Y: Field{[10]uint32{0x0009a003, 0x023ad045, 0x01aff89c, 0x0105ebb8, 0x01d0b99d, 0x01469531, 0x038dfee0, 0x023453a6, 0x0173f6e4, 0x00244866}}}, + {X: Field{[10]uint32{0x00b311dd, 0x01f222c5, 0x01b9cf37, 0x02bbef5c, 0x003de3be, 0x02e894b8, 0x0180bfa0, 0x03d6b375, 0x02d28faa, 0x002b756e}}, Y: Field{[10]uint32{0x01d6c38d, 0x0260bcd2, 0x01b8902f, 0x039d9a6e, 0x0352d4e1, 0x00d66053, 0x00e434f8, 0x030e965d, 0x00f4da3d, 0x003a710f}}}, + {X: Field{[10]uint32{0x01262b90, 0x0064f7f6, 0x0029a9dc, 0x0307f8f3, 0x03b723c4, 0x02009747, 0x0365f177, 0x0184bb26, 0x022a5ac1, 0x000ac561}}, Y: Field{[10]uint32{0x003d7557, 0x0265b992, 0x009a4991, 0x01c3e652, 0x026f5349, 0x02a1d241, 0x0230d52d, 0x00cfea9e, 0x013daa0a, 0x000bac01}}}, + {X: Field{[10]uint32{0x0078afb0, 0x016b9e58, 0x021974e7, 0x031b1049, 0x0314ff12, 0x019b45c1, 0x00d4468c, 0x018ed492, 0x03cd7661, 0x0008275a}}, Y: Field{[10]uint32{0x0340b310, 0x006ddd69, 0x023e385d, 0x024ce7d3, 0x0301edb7, 0x02626296, 0x0165baba, 0x00ca0282, 0x03429e7b, 0x00068bc4}}}, + {X: Field{[10]uint32{0x00e7be40, 0x025c532a, 0x00ee593f, 0x02524410, 0x02f2d2c8, 0x01b91da6, 0x0295c161, 0x03b99dfb, 0x02ed1a96, 0x001abe7a}}, Y: Field{[10]uint32{0x02387e1c, 0x005b809b, 0x01569fa4, 0x019a83d6, 0x0145e3f6, 0x00d1f720, 0x009ea428, 0x0199259c, 0x02116900, 0x002ce04a}}}, + {X: Field{[10]uint32{0x017c0979, 0x01900283, 0x00c96f5f, 0x0052f16a, 0x024a29b3, 0x03d073b4, 0x029df3df, 0x005c50fe, 0x032ba817, 0x0014fc90}}, Y: Field{[10]uint32{0x037b36a2, 0x01fa4314, 0x03845f9f, 0x03d727a2, 0x024bd5a4, 0x0046c1f7, 0x014e3e09, 0x01e6df33, 0x03fbc1f0, 0x002f54bb}}}, + {X: Field{[10]uint32{0x0082801e, 0x02dbe83d, 0x00155d26, 0x022f16f5, 0x0140794f, 0x032e35be, 0x03aab424, 0x00513bac, 0x00ee0444, 0x0016599a}}, Y: Field{[10]uint32{0x00870c37, 0x01c523c1, 0x0135ad47, 0x032d8f4d, 0x028db6c1, 0x01dc4c13, 0x008f9608, 0x03bd7c7b, 0x00a85bba, 0x002526a8}}}, + {X: Field{[10]uint32{0x00977063, 0x00102962, 0x00c4fef4, 0x022fec4c, 0x0365bf6f, 0x019f83f6, 0x0150f838, 0x0269bd87, 0x029e047f, 0x0029d8b9}}, Y: Field{[10]uint32{0x014f6ef1, 0x00da7e0a, 0x00e62a06, 0x028e5b7f, 0x01958b48, 0x00cdcaa2, 0x021732d9, 0x00455e06, 0x0157cbed, 0x001ae637}}}, + {X: Field{[10]uint32{0x032c19fd, 0x026cb9f0, 0x028c3e4c, 0x03a41600, 0x034acab8, 0x02d5c2d6, 0x01f4d17a, 0x0141d8bf, 0x01881b50, 0x002fa134}}, Y: Field{[10]uint32{0x02f1281f, 0x025294dc, 0x01c37676, 0x03d57943, 0x007955a7, 0x00c20e65, 0x01e65f48, 0x01425134, 0x00cb32dc, 0x003bfe58}}}, + {X: Field{[10]uint32{0x0355a9bf, 0x02c0a637, 0x01bf8ebc, 0x03bca7a9, 0x00f6b015, 0x0075f15e, 0x00307f60, 0x00c60604, 0x00eb9c6e, 0x001c98a6}}, Y: Field{[10]uint32{0x003accae, 0x01be2c2f, 0x033b4e11, 0x032f0019, 0x00be797b, 0x00f42678, 0x0035a2ef, 0x026ff6a6, 0x0001a9de, 0x000e3522}}}, + {X: Field{[10]uint32{0x02c69482, 0x02dd7f55, 0x02167bd1, 0x01004cbe, 0x00cbeab5, 0x02bcaf22, 0x0357274c, 0x01fb9507, 0x00314c0d, 0x002619e8}}, Y: Field{[10]uint32{0x03792cd7, 0x0018451b, 0x028a916f, 0x033d4558, 0x039e6245, 0x006ea658, 0x0392d55b, 0x020d3e71, 0x015a3b10, 0x00340b98}}}, + {X: Field{[10]uint32{0x01a7e7d2, 0x01fcb610, 0x03d85995, 0x0230fbea, 0x03a4c90e, 0x0251b791, 0x03af7555, 0x039229a4, 0x030f1339, 0x002e4d04}}, Y: Field{[10]uint32{0x00653d39, 0x02646a26, 0x00c41a4a, 0x036f9c37, 0x03ffd381, 0x02fde347, 0x00929a5f, 0x0015daa8, 0x036b9b2d, 0x002548cf}}}, + {X: Field{[10]uint32{0x01557aa1, 0x008e7647, 0x03c2978a, 0x03fb3407, 0x03df1d92, 0x002675aa, 0x027f2ea0, 0x02056964, 0x024540d8, 0x002a19bc}}, Y: Field{[10]uint32{0x01430634, 0x006eed30, 0x01a4b798, 0x0319f184, 0x0161eb69, 0x036c384e, 0x013d8fa5, 0x00ad135e, 0x01f6a802, 0x002d61ce}}}, + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + }, + { + {X: Field{[10]uint32{0x0182b151, 0x004d0327, 0x03a2dbb5, 0x00f5587e, 0x03cca0a4, 0x02c426a3, 0x005a1153, 0x00795b59, 0x0250ae40, 0x0034a98e}}, Y: Field{[10]uint32{0x00f89405, 0x01085d37, 0x00a52d41, 0x002bd213, 0x00a70f75, 0x00a52088, 0x01aee58b, 0x03f2dd59, 0x02fb6443, 0x003a0b61}}}, + {X: Field{[10]uint32{0x0272da5f, 0x0312eb32, 0x013497c6, 0x01acdb10, 0x0122b9cd, 0x00cdc97e, 0x03c72020, 0x0149788e, 0x03a76100, 0x002ebc60}}, Y: Field{[10]uint32{0x00f2a0cf, 0x03398a2a, 0x01361377, 0x031729ce, 0x018e2336, 0x035a6c74, 0x008bd58d, 0x0134cd5a, 0x03be9ccb, 0x0037ab27}}}, + {X: Field{[10]uint32{0x024b3ba0, 0x027d8d7b, 0x031f1785, 0x03d7c62f, 0x035c2abe, 0x006fc917, 0x03e170f3, 0x03edcefb, 0x0105221f, 0x00104204}}, Y: Field{[10]uint32{0x03525595, 0x02587705, 0x02455486, 0x02159681, 0x00133649, 0x035ae126, 0x00a65ae1, 0x0159a3cb, 0x036976ff, 0x00370dfc}}}, + {X: Field{[10]uint32{0x016c3943, 0x02b29631, 0x02a5ffa5, 0x00b55add, 0x015adbd0, 0x03923dbf, 0x01332906, 0x01008e3e, 0x00a7e384, 0x003debbe}}, Y: Field{[10]uint32{0x00f442f1, 0x03d89feb, 0x01003431, 0x0212a373, 0x03eec301, 0x00eacff3, 0x0042bbdc, 0x0369e5f1, 0x0344d5ff, 0x00138ec2}}}, + {X: Field{[10]uint32{0x03d98ded, 0x02726e24, 0x00218462, 0x020cee28, 0x02dbdf22, 0x014c7597, 0x00f22990, 0x03032323, 0x0210a16c, 0x0018e8a8}}, Y: Field{[10]uint32{0x00d1cfc2, 0x0065f538, 0x0073a519, 0x0280271e, 0x021fabf6, 0x013b6511, 0x02503325, 0x031dbf41, 0x02e2e7fe, 0x00220ad0}}}, + {X: Field{[10]uint32{0x000e5485, 0x02799a80, 0x01df0208, 0x022fd769, 0x02451306, 0x01cc83c4, 0x02c70862, 0x02f7fe38, 0x02d793a2, 0x0007349d}}, Y: Field{[10]uint32{0x005fbd7f, 0x033c1462, 0x024ecca5, 0x01c2c826, 0x0399d0e2, 0x014ba5df, 0x00b34d45, 0x02bdce35, 0x01d18b2e, 0x0019856f}}}, + {X: Field{[10]uint32{0x00045445, 0x0186942e, 0x00d7eea8, 0x01c6407a, 0x0080ff73, 0x0355efbc, 0x0312e2e5, 0x019f28f7, 0x015d449d, 0x00030560}}, Y: Field{[10]uint32{0x0054a206, 0x03e1f550, 0x00ea3214, 0x0390d963, 0x00ba3054, 0x0198f34a, 0x0293c3b6, 0x01045742, 0x020a3ae9, 0x000bcc35}}}, + {X: Field{[10]uint32{0x01924459, 0x032515c4, 0x0278c1fa, 0x00968f1e, 0x037af2fa, 0x03776ec7, 0x022e29f0, 0x0240db16, 0x03cb1001, 0x0037ed51}}, Y: Field{[10]uint32{0x0065fd9e, 0x00178373, 0x031dcfa2, 0x00c39700, 0x0022af09, 0x03721933, 0x00389ce9, 0x011c222e, 0x02a9ba0f, 0x0026b334}}}, + {X: Field{[10]uint32{0x03857faf, 0x0048e730, 0x019701e9, 0x03787a58, 0x03882fca, 0x020a3bdf, 0x017ba8f4, 0x022a7035, 0x036b89ae, 0x0031d5fa}}, Y: Field{[10]uint32{0x00584ca4, 0x0276c328, 0x014c101d, 0x00344062, 0x03627d31, 0x022fb186, 0x03369f20, 0x03fcd895, 0x01cfcd23, 0x003c0e96}}}, + {X: Field{[10]uint32{0x02f8b517, 0x02ecd463, 0x01bac9a8, 0x00691c5c, 0x0177c277, 0x02845789, 0x01bc8064, 0x036c9257, 0x02f7ccc4, 0x001c4808}}, Y: Field{[10]uint32{0x009da1ac, 0x01f7ca09, 0x01d7748b, 0x037cef5e, 0x01a3603e, 0x00251d50, 0x03101f9b, 0x03a4a2b9, 0x0338de4d, 0x002f55e0}}}, + {X: Field{[10]uint32{0x0059225d, 0x034613d5, 0x018d10e4, 0x01f8b621, 0x0244faf7, 0x006700a8, 0x015d4099, 0x028343e0, 0x03aeadaf, 0x003ea018}}, Y: Field{[10]uint32{0x02ce1507, 0x02df8edf, 0x0059c3a2, 0x00db401f, 0x000a2b6c, 0x00931097, 0x00de2208, 0x0301a458, 0x039057c0, 0x0002e9c7}}}, + {X: Field{[10]uint32{0x010bc03e, 0x014f566a, 0x015e33c7, 0x024d4780, 0x0084b0f3, 0x011143e0, 0x01a925f7, 0x001cba79, 0x00ed2c82, 0x000b3bb6}}, Y: Field{[10]uint32{0x02b82adc, 0x01cae2de, 0x03cd01cb, 0x033c8354, 0x034a1df9, 0x03f1f6ba, 0x0050eb7a, 0x0378fb36, 0x0380e9b9, 0x002909da}}}, + {X: Field{[10]uint32{0x02f0d044, 0x027fa505, 0x021a7967, 0x03524279, 0x01aaba9f, 0x018bb829, 0x02f69cf8, 0x015ea278, 0x03c59d02, 0x00196328}}, Y: Field{[10]uint32{0x03cb872d, 0x007ccbbd, 0x00e89add, 0x018f1063, 0x0255a167, 0x004ef4dd, 0x0165d627, 0x0095183c, 0x01377aea, 0x002b9730}}}, + {X: Field{[10]uint32{0x02aa2494, 0x03538c50, 0x00c9a50c, 0x03f9f744, 0x027bdcdd, 0x013aef20, 0x01136e7c, 0x03a3b374, 0x009a4539, 0x000de71d}}, Y: Field{[10]uint32{0x02c86c63, 0x03ea7a33, 0x016435be, 0x029edfa1, 0x011364f6, 0x019e0fc4, 0x01c0ef1d, 0x0300c4f2, 0x03848bf9, 0x00289518}}}, + {X: Field{[10]uint32{0x0296756d, 0x02b255cd, 0x01417ab5, 0x01815958, 0x00676af1, 0x034fcc17, 0x00c19835, 0x03caeb39, 0x034aaf91, 0x000c7252}}, Y: Field{[10]uint32{0x0208ae78, 0x0117a377, 0x01070abc, 0x032b9ab4, 0x0283aedf, 0x02bd0581, 0x00b8b59a, 0x020ea6fd, 0x004b556e, 0x003e03e2}}}, + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + }, + { + {X: Field{[10]uint32{0x0217e073, 0x01be6d15, 0x0317b343, 0x02f4e0e4, 0x026bacbd, 0x01f3f721, 0x02e7896d, 0x007ae243, 0x02233547, 0x0019161f}}, Y: Field{[10]uint32{0x03af6589, 0x026797a7, 0x02ab3582, 0x00e44ceb, 0x0185b90a, 0x01f0a668, 0x016dd644, 0x000b8aba, 0x01d5bf69, 0x003667f3}}}, + {X: Field{[10]uint32{0x0384480d, 0x03362310, 0x032ef44b, 0x0288aa47, 0x0294e0b6, 0x024bc304, 0x0328b54c, 0x02503cb3, 0x02b142df, 0x002e19b5}}, Y: Field{[10]uint32{0x004cafa8, 0x0166d1c3, 0x006d60e6, 0x02012c76, 0x0024e522, 0x02a6b5eb, 0x02278d7e, 0x03adc226, 0x00b3426a, 0x0006452c}}}, + {X: Field{[10]uint32{0x02103dd6, 0x01c51c83, 0x00859adf, 0x0301f001, 0x02c34604, 0x0164a85e, 0x02213cfc, 0x000fe0da, 0x03d55a42, 0x002f11de}}, Y: Field{[10]uint32{0x02f7c343, 0x0020b635, 0x004ac639, 0x01cb18ed, 0x015d2935, 0x01b7a98e, 0x03ac552c, 0x037549b2, 0x022429a8, 0x0038c787}}}, + {X: Field{[10]uint32{0x01b20d6c, 0x02736a07, 0x02455d22, 0x0393b53f, 0x03e2d52a, 0x0040aea1, 0x019d1646, 0x02067b13, 0x009085de, 0x003b0aee}}, Y: Field{[10]uint32{0x029cf4a0, 0x02671358, 0x03a98a0e, 0x012fa1fb, 0x0233a236, 0x01425031, 0x02f66f06, 0x004e84cc, 0x017661e0, 0x00333b30}}}, + {X: Field{[10]uint32{0x004eab31, 0x0370ec35, 0x034907d0, 0x00501398, 0x000ac5af, 0x019efe3a, 0x003b4232, 0x02e0e00c, 0x00fe5a6b, 0x0016276d}}, Y: Field{[10]uint32{0x01361f6a, 0x02baf9d4, 0x038db941, 0x01548523, 0x031f610e, 0x012f643c, 0x00706202, 0x028a93d8, 0x005c108a, 0x00189551}}}, + {X: Field{[10]uint32{0x02695f94, 0x0202c60d, 0x03fa592d, 0x031a4589, 0x0362a169, 0x02be6a73, 0x00cb8683, 0x023d7f43, 0x0151b455, 0x002c7497}}, Y: Field{[10]uint32{0x02e32736, 0x01fae697, 0x03edca5b, 0x0236ae18, 0x0360f6f1, 0x026aea05, 0x03ea0ac1, 0x0242c7de, 0x0272030e, 0x001c1b76}}}, + {X: Field{[10]uint32{0x020c2c41, 0x02585ca6, 0x036c67bf, 0x0071580c, 0x0042831c, 0x035bb6df, 0x00a1860a, 0x00be8baa, 0x0337d16e, 0x0004ce6c}}, Y: Field{[10]uint32{0x01f1bc2b, 0x03c152ea, 0x023a4185, 0x03e1f7a4, 0x006b1227, 0x0044e8d0, 0x023240fd, 0x02b96e9e, 0x016362c7, 0x0027e6ca}}}, + {X: Field{[10]uint32{0x03b09d0f, 0x0183b2c8, 0x03ecf38a, 0x01903d42, 0x01e50050, 0x03951641, 0x01d75ef5, 0x025b3b4e, 0x03e389e2, 0x001c7129}}, Y: Field{[10]uint32{0x020ddb62, 0x02c7c05c, 0x03fc7637, 0x0021298b, 0x02786f2b, 0x00be042a, 0x033e0a29, 0x03cee82b, 0x02db737a, 0x0004c4fe}}}, + {X: Field{[10]uint32{0x00fc47af, 0x012c7e16, 0x00dec370, 0x0320cb03, 0x00a8ddfe, 0x00006d5a, 0x010329b5, 0x033c5f31, 0x03a11363, 0x001ffcee}}, Y: Field{[10]uint32{0x01ba43a7, 0x0185933e, 0x02c297f8, 0x006b462e, 0x0317a53b, 0x011cd11a, 0x03c891b7, 0x0298a682, 0x03ae8018, 0x0007dae9}}}, + {X: Field{[10]uint32{0x0241e20e, 0x03132ea7, 0x03864d1d, 0x00f5e34c, 0x0138a87a, 0x00e934fa, 0x030f7f00, 0x013722f2, 0x01c4a511, 0x003f0e57}}, Y: Field{[10]uint32{0x03cf42ee, 0x036330b9, 0x00e2b77a, 0x0169a179, 0x02022147, 0x02f76db5, 0x02b81a98, 0x01f42533, 0x009108d0, 0x000e19b8}}}, + {X: Field{[10]uint32{0x01213775, 0x01358025, 0x02a99018, 0x00ec8f50, 0x0100b429, 0x03fb1fd8, 0x001e9395, 0x0182ed85, 0x00463ceb, 0x0023b19c}}, Y: Field{[10]uint32{0x0041ffff, 0x0043cf9e, 0x011e90e0, 0x0282f33d, 0x0271da98, 0x033b7b83, 0x02643415, 0x016f8c1b, 0x026fa0da, 0x0023d629}}}, + {X: Field{[10]uint32{0x02f83231, 0x01c4062d, 0x025e3499, 0x0239d810, 0x00b7c30d, 0x016cff74, 0x01158276, 0x02e89aa3, 0x00c53502, 0x002143e3}}, Y: Field{[10]uint32{0x032e8373, 0x00c6a757, 0x0177f4a0, 0x0285dc8b, 0x010a85bf, 0x020b31e2, 0x03f7086b, 0x02414f42, 0x01be02a7, 0x002f12a7}}}, + {X: Field{[10]uint32{0x0052abbb, 0x00ffe34d, 0x01c2e3cb, 0x00bf8ae5, 0x01ae6aa7, 0x03657525, 0x01bac3fe, 0x0006ee27, 0x01b441e7, 0x0020f798}}, Y: Field{[10]uint32{0x014eb66e, 0x0145dac1, 0x002918a0, 0x00daef39, 0x03d79c5f, 0x03138558, 0x03fb6af8, 0x01827e9a, 0x0334a34c, 0x000cbc38}}}, + {X: Field{[10]uint32{0x032e6ffa, 0x00441937, 0x0176388b, 0x00dedc55, 0x0246be9f, 0x011d4351, 0x005bb6a9, 0x0067ec51, 0x02f98f94, 0x0014ffa2}}, Y: Field{[10]uint32{0x00e92eb5, 0x03acdc99, 0x030c22a1, 0x03980ef5, 0x005fb5f8, 0x01193797, 0x000cf6c4, 0x01518859, 0x017e7b51, 0x0024ca20}}}, + {X: Field{[10]uint32{0x019276f1, 0x022309bd, 0x03b15e96, 0x02ca4a85, 0x0033ae25, 0x03df361a, 0x00bb5c00, 0x03076c6a, 0x03898f50, 0x000f5d98}}, Y: Field{[10]uint32{0x019cbcb3, 0x012996e1, 0x0178601e, 0x008066c6, 0x02f32198, 0x02b60ccf, 0x0176e34d, 0x01f76d82, 0x01737a18, 0x0034dd9a}}}, + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + }, + { + {X: Field{[10]uint32{0x0145e458, 0x035b21b7, 0x027fd358, 0x033a8943, 0x002f0aa6, 0x01527781, 0x02546d3e, 0x036216ce, 0x01e0e4e4, 0x0021206f}}, Y: Field{[10]uint32{0x0379057e, 0x012c6d65, 0x02e556d6, 0x0310ac98, 0x02900a79, 0x033b2cb2, 0x0225bf39, 0x00137612, 0x038cba54, 0x000e3b9e}}}, + {X: Field{[10]uint32{0x00e9f114, 0x010cd49b, 0x021dde54, 0x0014a655, 0x03392ed6, 0x007524af, 0x0143c6cd, 0x00ea2e7f, 0x0050bd38, 0x00258a69}}, Y: Field{[10]uint32{0x024aa391, 0x025cb128, 0x02f8dca3, 0x00f9715a, 0x01b92559, 0x0033bd93, 0x02befd22, 0x02db5d5d, 0x03280c5f, 0x002fd0e6}}}, + {X: Field{[10]uint32{0x012da17d, 0x0283e905, 0x0246b160, 0x036c2341, 0x0011dc13, 0x03f802f2, 0x014e6b05, 0x02317c22, 0x011e0f51, 0x000efabb}}, Y: Field{[10]uint32{0x00c768d2, 0x0012617b, 0x00416ce7, 0x01ee37fb, 0x0154cde7, 0x03a0386d, 0x034a8beb, 0x01eb37fb, 0x03f55aff, 0x0030ec35}}}, + {X: Field{[10]uint32{0x02ca6cc3, 0x00e36589, 0x0218383d, 0x011f861f, 0x031477d7, 0x033224f7, 0x01730da7, 0x011a23ac, 0x0047ef1e, 0x002dcec7}}, Y: Field{[10]uint32{0x014fdba3, 0x00d75da9, 0x03f5afac, 0x014825d5, 0x017322a2, 0x03320142, 0x017d64bb, 0x008aa429, 0x01cb2949, 0x001610c5}}}, + {X: Field{[10]uint32{0x024edcc5, 0x03e85f6e, 0x011b7234, 0x0085080c, 0x03e74e32, 0x0249d665, 0x012dfc03, 0x0275861d, 0x03a0cbdc, 0x001b9cf6}}, Y: Field{[10]uint32{0x019da0e4, 0x007df375, 0x039037b3, 0x0369c019, 0x03278a77, 0x0220a1a4, 0x02455088, 0x033122fa, 0x01fc49ee, 0x003b82b0}}}, + {X: Field{[10]uint32{0x0063e1be, 0x026b4134, 0x01a75c1b, 0x028bdf8e, 0x03a92429, 0x036f3c09, 0x02615253, 0x00ac51c8, 0x01d11d60, 0x0004c590}}, Y: Field{[10]uint32{0x01fec890, 0x007fcf88, 0x01b77fdd, 0x0303e5d1, 0x03bd0fae, 0x036f4afa, 0x002e30fc, 0x00e7c1a9, 0x02617960, 0x00130ef6}}}, + {X: Field{[10]uint32{0x0280b979, 0x03131092, 0x03b31409, 0x03e8ca6a, 0x000490f5, 0x0291f0c4, 0x027d97ea, 0x02d649d8, 0x018937e5, 0x001dc1b7}}, Y: Field{[10]uint32{0x0126cfde, 0x03d20410, 0x03e3214c, 0x00d3f5fb, 0x0117fa0a, 0x007aa71c, 0x038dd799, 0x02dc51dd, 0x01827d5b, 0x002280aa}}}, + {X: Field{[10]uint32{0x038f93e0, 0x038864b4, 0x0099f9c6, 0x00eed9da, 0x03d05b2a, 0x01e8bfbd, 0x03989200, 0x00600c47, 0x02b2db40, 0x003b7f85}}, Y: Field{[10]uint32{0x029405ad, 0x005e4f78, 0x0227e3d0, 0x000311b8, 0x025b3d51, 0x02c17434, 0x0174faa4, 0x036cda53, 0x02f1fca5, 0x003b9a40}}}, + {X: Field{[10]uint32{0x026fe285, 0x02e712dc, 0x03127dcd, 0x00a504fb, 0x02a45bac, 0x007e781a, 0x02f3c7a4, 0x0303e034, 0x02c5929b, 0x0005b508}}, Y: Field{[10]uint32{0x0155b441, 0x003ff9b0, 0x00d4233e, 0x0044dcd9, 0x01e93f0c, 0x018d4c6c, 0x02b7e69a, 0x009906a2, 0x00fa51e2, 0x00037e22}}}, + {X: Field{[10]uint32{0x01e306a5, 0x004cae1a, 0x007f15d3, 0x00931309, 0x02b8b5f6, 0x017cb971, 0x027129b3, 0x0030cd24, 0x0363f9f3, 0x0025cb2c}}, Y: Field{[10]uint32{0x02e86295, 0x007f502d, 0x00f35d06, 0x03b732b5, 0x01b85702, 0x02f1941e, 0x01e77fe5, 0x024aa97e, 0x0304e2df, 0x002b98d1}}}, + {X: Field{[10]uint32{0x02cfa513, 0x0042f2ae, 0x023aeae3, 0x027e6983, 0x004e2407, 0x003d5aa7, 0x01a34475, 0x01b58ea9, 0x0247eec7, 0x0007f303}}, Y: Field{[10]uint32{0x007afc9c, 0x01d6e904, 0x03918750, 0x03459260, 0x004beded, 0x00ce7e6d, 0x00e38754, 0x0151e2d2, 0x01a041e3, 0x00059770}}}, + {X: Field{[10]uint32{0x0046e079, 0x0280d49f, 0x0078dd12, 0x002e17a7, 0x00ab6693, 0x000ae8dd, 0x02f75adb, 0x02b14c3f, 0x02ad2acf, 0x002ae1b0}}, Y: Field{[10]uint32{0x0236ffe1, 0x00a2f05d, 0x017c0ec4, 0x03a12143, 0x01ce7728, 0x01cc8032, 0x01c46d4d, 0x00a6af3d, 0x0286019f, 0x00048270}}}, + {X: Field{[10]uint32{0x02dc69b2, 0x009c1f3f, 0x0371721a, 0x0226c9ad, 0x02a50a60, 0x0172a8e1, 0x00643043, 0x02e285cc, 0x0073ad6c, 0x00304ae4}}, Y: Field{[10]uint32{0x00dd41dd, 0x02ba6c08, 0x032a0032, 0x02f8f49e, 0x02b8ee1d, 0x03e2525d, 0x0372dc89, 0x0337c765, 0x003fe534, 0x000c5cf1}}}, + {X: Field{[10]uint32{0x02341142, 0x031ef3a7, 0x02760d3e, 0x03add91c, 0x007ae684, 0x0268459a, 0x021bd217, 0x028ec06e, 0x00110c2d, 0x00319c07}}, Y: Field{[10]uint32{0x020f4dad, 0x01318567, 0x03e57892, 0x02e96f26, 0x015d07fc, 0x03867d68, 0x03869bbd, 0x0376654b, 0x02b38d6c, 0x000a8083}}}, + {X: Field{[10]uint32{0x0161fe4d, 0x03d6177e, 0x03197ab6, 0x01be2c41, 0x028a1488, 0x004b29cf, 0x033e9313, 0x01ea3e8f, 0x0385dc32, 0x0034166f}}, Y: Field{[10]uint32{0x02e823c2, 0x00d6c19a, 0x0364cb99, 0x0287d36a, 0x00fd388b, 0x0212556d, 0x020765dc, 0x014978ff, 0x0260c08b, 0x0011441e}}}, + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + }, + { + {X: Field{[10]uint32{0x00af666b, 0x018c0fdb, 0x00e30bcd, 0x034f12c7, 0x037ffcfe, 0x0205fd18, 0x036979ae, 0x000aa98a, 0x0257a781, 0x0004d192}}, Y: Field{[10]uint32{0x036ecc27, 0x0256a41f, 0x002e13f4, 0x02a07425, 0x0248f300, 0x00f32c32, 0x03e43345, 0x011603bd, 0x01900461, 0x001a6f85}}}, + {X: Field{[10]uint32{0x025084ae, 0x02127181, 0x02577c75, 0x01f73aaf, 0x019182be, 0x017f84b4, 0x005c88c8, 0x014d8bb0, 0x00f53224, 0x003acf3e}}, Y: Field{[10]uint32{0x016b9480, 0x01f07ffe, 0x012a66f6, 0x03179f6f, 0x01f52b45, 0x03f72928, 0x03e63dce, 0x035c010f, 0x038222d9, 0x00320cf1}}}, + {X: Field{[10]uint32{0x02ca5f51, 0x01ac8263, 0x01aebf21, 0x006e53f2, 0x03ddea17, 0x03c16d73, 0x02ed6b2b, 0x039a58b1, 0x0114dd9e, 0x00377a75}}, Y: Field{[10]uint32{0x00c638f7, 0x01a69cf4, 0x0171f9ad, 0x03a37a25, 0x0150feeb, 0x029fe3c2, 0x011f34b0, 0x02044762, 0x01133ce2, 0x002e139a}}}, + {X: Field{[10]uint32{0x02e9a5d0, 0x016f2f30, 0x001d9f8e, 0x03e61288, 0x02a576fc, 0x0211466c, 0x03a60f21, 0x02665d3d, 0x027d092d, 0x002f7c69}}, Y: Field{[10]uint32{0x0162ff7b, 0x013dc061, 0x02461cdb, 0x01879589, 0x02a6280b, 0x01afdeea, 0x00be54a8, 0x0286aaa0, 0x002bab65, 0x00102564}}}, + {X: Field{[10]uint32{0x019c88e4, 0x001ac166, 0x006ec2f9, 0x00f882b5, 0x039aed51, 0x004812c5, 0x01f406eb, 0x024dcdba, 0x02102369, 0x003f4698}}, Y: Field{[10]uint32{0x015bc8df, 0x02324596, 0x000f299c, 0x03525730, 0x02dc6b71, 0x0125dde0, 0x013c0695, 0x03082fec, 0x0354b9c8, 0x0006b25e}}}, + {X: Field{[10]uint32{0x009b0cca, 0x031a9568, 0x016f01cc, 0x02249293, 0x01a34575, 0x028a3696, 0x00454f68, 0x03d32357, 0x00b1dbb0, 0x000354e3}}, Y: Field{[10]uint32{0x00929e05, 0x02c51f83, 0x034c9731, 0x02676244, 0x038534cd, 0x003bb5f3, 0x00a8d5c4, 0x0304432c, 0x03ac7a3e, 0x0032065a}}}, + {X: Field{[10]uint32{0x038018ce, 0x0056d6d7, 0x02d68bd5, 0x01ce3624, 0x03cf2da5, 0x00b21b71, 0x03ffce4f, 0x025ae7c4, 0x0131d8c2, 0x0013b921}}, Y: Field{[10]uint32{0x0248381f, 0x016986c7, 0x006013c3, 0x01c6d3a0, 0x02710749, 0x0031f179, 0x03b4408d, 0x03e2d7f1, 0x02d4810b, 0x002da3e7}}}, + {X: Field{[10]uint32{0x0327e771, 0x017f05ce, 0x0262abde, 0x02591df6, 0x008c3b41, 0x019120ed, 0x01be267b, 0x03b0a735, 0x026eddc4, 0x001a215a}}, Y: Field{[10]uint32{0x03bbdab6, 0x02358a81, 0x0333a611, 0x03ca4ec1, 0x02331d22, 0x0067ded2, 0x036fd49c, 0x0287ec4e, 0x01f14f79, 0x001de8cf}}}, + {X: Field{[10]uint32{0x01473678, 0x014ba47c, 0x012f7028, 0x0254250e, 0x00cba057, 0x016e301c, 0x01e314c5, 0x00036ffd, 0x009c34c4, 0x003f5db3}}, Y: Field{[10]uint32{0x01144f4f, 0x0193baa3, 0x008437e1, 0x03b85007, 0x0260628e, 0x0340cb35, 0x03ee0a73, 0x010f6b83, 0x01437871, 0x003c8119}}}, + {X: Field{[10]uint32{0x02e66b24, 0x00014cb3, 0x00366b5f, 0x003fb5ee, 0x02e8b9c6, 0x03c6b7b4, 0x0244d99b, 0x031ee203, 0x00cfb9e9, 0x00133576}}, Y: Field{[10]uint32{0x000932fd, 0x03bf6ebd, 0x03aed221, 0x01784b4b, 0x03ca61e4, 0x0335b440, 0x024e8c39, 0x012d567f, 0x0282deb9, 0x0015dbab}}}, + {X: Field{[10]uint32{0x017a2193, 0x002dc523, 0x0146edf0, 0x0113c65d, 0x012c691e, 0x012d3a88, 0x026ce827, 0x02d00867, 0x03a33123, 0x002168aa}}, Y: Field{[10]uint32{0x00cdcf3a, 0x0320f52c, 0x012427f0, 0x037e70ec, 0x03e1c6da, 0x007300a7, 0x02c6082d, 0x00145b60, 0x0057eb2b, 0x002704a6}}}, + {X: Field{[10]uint32{0x01d7e577, 0x00c0f3bb, 0x004d56ae, 0x015a14db, 0x03d3a0f2, 0x003a8841, 0x00604727, 0x03dec96b, 0x010f8828, 0x0030d4b5}}, Y: Field{[10]uint32{0x00d9b570, 0x013fe23e, 0x017063ca, 0x02cad848, 0x0300a8ab, 0x02f39e7e, 0x03d53145, 0x02e6e5aa, 0x0038ba76, 0x002f9dca}}}, + {X: Field{[10]uint32{0x037568b0, 0x000c16cd, 0x03b0535b, 0x03406780, 0x0335ae8d, 0x01e0d943, 0x00b6d6c5, 0x03f9d110, 0x03fc73cf, 0x00349776}}, Y: Field{[10]uint32{0x0339929c, 0x004e49b7, 0x03f0060a, 0x022078f0, 0x03832273, 0x0379f64a, 0x02aef74c, 0x01224e2f, 0x037593f8, 0x001e8ebf}}}, + {X: Field{[10]uint32{0x02712536, 0x0158fa07, 0x03e71a33, 0x03d5bfd7, 0x02a85051, 0x02d8d7a7, 0x006de71a, 0x00ea7f82, 0x0286b0a4, 0x0001a453}}, Y: Field{[10]uint32{0x001128f1, 0x011dc4e0, 0x029da2a2, 0x01ac2bde, 0x00896c22, 0x016b0a30, 0x018aceae, 0x02f4149f, 0x012852d9, 0x000adf9e}}}, + {X: Field{[10]uint32{0x031d7c13, 0x03944629, 0x03a3855f, 0x03dfe83f, 0x01641ab5, 0x01eab201, 0x0307e9a9, 0x0129c957, 0x013143e9, 0x0011604d}}, Y: Field{[10]uint32{0x02ff63cf, 0x022f154e, 0x016b9963, 0x01550af6, 0x01702006, 0x01f75a72, 0x03f50f17, 0x026b62d5, 0x00ec1497, 0x0027d616}}}, + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + }, + { + {X: Field{[10]uint32{0x0183f366, 0x028e834b, 0x00588cad, 0x03b78bca, 0x020cd9cc, 0x0307725e, 0x02f430bc, 0x03f8ba6b, 0x01f5b713, 0x002f12a7}}, Y: Field{[10]uint32{0x001f33c1, 0x02359996, 0x03b16d75, 0x03efe951, 0x02a6e8a9, 0x012de632, 0x03937adf, 0x017018e0, 0x01ca6e78, 0x00034ea0}}}, + {X: Field{[10]uint32{0x03fceb19, 0x0379517c, 0x00409282, 0x0087de17, 0x002e89b2, 0x0339eead, 0x005c7626, 0x033302af, 0x015e11ce, 0x003690cf}}, Y: Field{[10]uint32{0x02f5cc64, 0x039c4829, 0x03277684, 0x00b6489e, 0x018e77fc, 0x03e57948, 0x02bbdc4a, 0x0040c077, 0x03d321a8, 0x00392636}}}, + {X: Field{[10]uint32{0x0312be3c, 0x028b8cbd, 0x02a66b06, 0x023b6851, 0x007295f1, 0x02c0054d, 0x00725dba, 0x02cde34f, 0x009d9331, 0x000e75cd}}, Y: Field{[10]uint32{0x006ff65c, 0x00067d07, 0x01644cc3, 0x0297b290, 0x00ef5ef7, 0x019a04ba, 0x0127554c, 0x00efdfec, 0x034f56ef, 0x0023e4a6}}}, + {X: Field{[10]uint32{0x02cf692a, 0x0389d716, 0x03e0654d, 0x0229c881, 0x01bcc483, 0x00705bbf, 0x01c11698, 0x031fb070, 0x021ee9e8, 0x0000c7a3}}, Y: Field{[10]uint32{0x016f667a, 0x00aa13ac, 0x033b09cc, 0x009f16fd, 0x03706498, 0x00359d0e, 0x01097029, 0x00d4f767, 0x035b465b, 0x002b5f9f}}}, + {X: Field{[10]uint32{0x0377f22b, 0x0393ef37, 0x02e035aa, 0x00e653e0, 0x02c69972, 0x02656bc9, 0x011cd6c2, 0x00774279, 0x0217f7dc, 0x003c32e9}}, Y: Field{[10]uint32{0x0109a03c, 0x0238b1d6, 0x015661fc, 0x01fa4282, 0x0004f18c, 0x0145b410, 0x03326c36, 0x037e627b, 0x034313f9, 0x0006896a}}}, + {X: Field{[10]uint32{0x03829372, 0x002a929d, 0x00553dec, 0x003222e9, 0x03c49b30, 0x00e15e5a, 0x03626ae5, 0x0034ecc4, 0x00c90f3e, 0x002d0c67}}, Y: Field{[10]uint32{0x02dd5427, 0x02733002, 0x011bb772, 0x005728f8, 0x02707b12, 0x03087168, 0x037afe09, 0x0140affe, 0x00499a6f, 0x0011c1f5}}}, + {X: Field{[10]uint32{0x02509c12, 0x03373531, 0x0347658a, 0x008d6f47, 0x018d6bfe, 0x021c9a3b, 0x01170e8d, 0x01534c87, 0x02b9db21, 0x000e075e}}, Y: Field{[10]uint32{0x02b46102, 0x010aa38b, 0x02af7546, 0x0161b39b, 0x03205828, 0x02996079, 0x01d24573, 0x00f6a7ad, 0x035b7fda, 0x00291eaa}}}, + {X: Field{[10]uint32{0x01f488b6, 0x02f5ffe0, 0x0291592b, 0x00d8ff1e, 0x03e9c9bf, 0x00995fdc, 0x03e00d86, 0x01845574, 0x0207a88d, 0x002a61e1}}, Y: Field{[10]uint32{0x031dab1d, 0x029eeec0, 0x01c6d495, 0x006592b5, 0x0239d0f0, 0x00855f08, 0x0063e7c8, 0x02575870, 0x01abd588, 0x00346068}}}, + {X: Field{[10]uint32{0x004fe955, 0x00ed358e, 0x03ce48db, 0x0296818e, 0x03f69956, 0x02532294, 0x013b73e6, 0x021f991e, 0x005467ab, 0x0029c0fc}}, Y: Field{[10]uint32{0x021344bd, 0x02cbbef5, 0x0277fa26, 0x00a7165c, 0x03539e16, 0x02c64666, 0x02a792d6, 0x011eb703, 0x0135a2b0, 0x0035403e}}}, + {X: Field{[10]uint32{0x038a8cc6, 0x0024edb0, 0x038fbe64, 0x007a7da7, 0x00ba2e12, 0x03b5fcf7, 0x02279ff6, 0x0105f923, 0x00c750b3, 0x000cc649}}, Y: Field{[10]uint32{0x02587810, 0x02383ed1, 0x01b54c4e, 0x026b3a7a, 0x017fb99e, 0x038bfecc, 0x025b601b, 0x03c060ae, 0x01411b33, 0x0032a3de}}}, + {X: Field{[10]uint32{0x02eace58, 0x02595b01, 0x0211d349, 0x018e8bcc, 0x031b7e45, 0x0014e80f, 0x006ad0d7, 0x01435d1b, 0x03c5aad5, 0x001cf1ac}}, Y: Field{[10]uint32{0x02f8654e, 0x002a45ca, 0x01291717, 0x0236eee3, 0x02aa6a87, 0x019b6471, 0x02909913, 0x013dd06e, 0x00a4733a, 0x000e8bed}}}, + {X: Field{[10]uint32{0x01cbcb9e, 0x03c449b3, 0x03c3df4b, 0x02277360, 0x01d6fa56, 0x03f50dd8, 0x00c32447, 0x00cdea7b, 0x02d7119d, 0x003372c4}}, Y: Field{[10]uint32{0x0161cfd1, 0x029616b2, 0x03340a08, 0x0090d637, 0x01a199af, 0x01b7a652, 0x02fbea09, 0x03c47eff, 0x02e17bb9, 0x0039a678}}}, + {X: Field{[10]uint32{0x00181d5e, 0x00e22fc0, 0x02f2054b, 0x02a6e56a, 0x00de71b3, 0x0303b76e, 0x0100d3a1, 0x011ff687, 0x03e7506d, 0x003189fc}}, Y: Field{[10]uint32{0x029f886d, 0x0240298d, 0x022c3927, 0x0015272f, 0x028ef6b0, 0x02287df5, 0x01696013, 0x00a98ecb, 0x01d71e44, 0x0035e3e7}}}, + {X: Field{[10]uint32{0x025fe9cc, 0x011f3dcc, 0x008db1d7, 0x02ecd276, 0x03fbb883, 0x00b52b08, 0x00411084, 0x00c6c4dc, 0x026328ec, 0x0031bb57}}, Y: Field{[10]uint32{0x028fd94b, 0x02f38712, 0x02cf10c0, 0x00ad83c8, 0x02844f97, 0x031fdeca, 0x032ee125, 0x03e0c0a4, 0x005b49d7, 0x003791d0}}}, + {X: Field{[10]uint32{0x03828b16, 0x00a367ed, 0x0047f34e, 0x023ca292, 0x03a04795, 0x03c1b794, 0x025f40a6, 0x0348cfe8, 0x02be0edf, 0x002ee23e}}, Y: Field{[10]uint32{0x02ea5df7, 0x011ce882, 0x02969c51, 0x01d38e87, 0x03ec4a81, 0x00456458, 0x01dc5960, 0x03a374d1, 0x02b304f5, 0x002dcd9d}}}, + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + }, + { + {X: Field{[10]uint32{0x01324caa, 0x02acc3f9, 0x032a3954, 0x038c2a51, 0x02694b65, 0x0114a8cb, 0x03d8c749, 0x022f0348, 0x017bf829, 0x00230a2a}}, Y: Field{[10]uint32{0x03ef9482, 0x00771cf2, 0x039459e7, 0x03c11472, 0x037ae784, 0x03df303a, 0x00fedf31, 0x01464cde, 0x0063a330, 0x001028c1}}}, + {X: Field{[10]uint32{0x0211d8e2, 0x02c807dd, 0x03c4d5df, 0x03a37927, 0x02c8130f, 0x011fc368, 0x03ed5a60, 0x028bc65a, 0x01872a38, 0x002ac6b0}}, Y: Field{[10]uint32{0x0029d15b, 0x01607cf1, 0x0145f01a, 0x034cf879, 0x02f7ef93, 0x02da90ad, 0x02a5f39d, 0x005e87a6, 0x037a324d, 0x0004fd28}}}, + {X: Field{[10]uint32{0x0354dd40, 0x03a1c551, 0x026cf863, 0x00c7f0d1, 0x01a24226, 0x035cbdba, 0x034841fc, 0x037f3d16, 0x007032c0, 0x0025ca49}}, Y: Field{[10]uint32{0x02a36143, 0x02d24bca, 0x02f49384, 0x014956b2, 0x0290dae8, 0x02f537cd, 0x015c75dc, 0x03a87734, 0x0244265f, 0x00247468}}}, + {X: Field{[10]uint32{0x0251b3fa, 0x02bb9909, 0x03434226, 0x0195dcb7, 0x038ea1b3, 0x014fcc7b, 0x003a6072, 0x03e0b4dc, 0x029b5bee, 0x0009593f}}, Y: Field{[10]uint32{0x01e5122d, 0x00b9a8c0, 0x0016edb8, 0x02adade6, 0x0314f37d, 0x0080e497, 0x03a14ae1, 0x00e24257, 0x03a60678, 0x0022b67d}}}, + {X: Field{[10]uint32{0x002ca7ff, 0x0360bae3, 0x0021a3c2, 0x0176577c, 0x03180364, 0x028bc9eb, 0x00791ad5, 0x01e5b814, 0x0397580a, 0x002258df}}, Y: Field{[10]uint32{0x00493e68, 0x0105785c, 0x02ab7bed, 0x028e390b, 0x01f87bc6, 0x010d5d22, 0x03b9cf15, 0x02109355, 0x01248c88, 0x000b47f8}}}, + {X: Field{[10]uint32{0x007a89ee, 0x030d4cc3, 0x014f8057, 0x0271eadb, 0x024bdbc5, 0x03261962, 0x0060b88f, 0x01e7844a, 0x00e26a41, 0x001c7be9}}, Y: Field{[10]uint32{0x01366a2e, 0x0224ca70, 0x01a0b4f4, 0x02e2397a, 0x022aaafa, 0x005ca528, 0x03b2c32b, 0x0092ba7b, 0x001f8bb6, 0x000517ea}}}, + {X: Field{[10]uint32{0x00a8dd7f, 0x01b58e83, 0x0381a618, 0x000d5a84, 0x021bc728, 0x0354d5d0, 0x01c9da03, 0x017824bf, 0x00e71be2, 0x000c204e}}, Y: Field{[10]uint32{0x0292c7f2, 0x017c91e2, 0x01915e41, 0x01190d2b, 0x00c81656, 0x00502386, 0x039ec45d, 0x03f24978, 0x02d28828, 0x000a3478}}}, + {X: Field{[10]uint32{0x02180068, 0x0238f4eb, 0x03103b17, 0x01b082f4, 0x027ea3d5, 0x00c37006, 0x006c5c0c, 0x016c32ff, 0x0136ffac, 0x003fcf58}}, Y: Field{[10]uint32{0x008c6077, 0x01aedb86, 0x035e670a, 0x03c90007, 0x01547676, 0x0365ab70, 0x010372cd, 0x00003903, 0x01be84e4, 0x0004cc8e}}}, + {X: Field{[10]uint32{0x026a3fb1, 0x03315a21, 0x02206c0d, 0x00a0664b, 0x036ec009, 0x016da18b, 0x025750c8, 0x03ad9747, 0x00e82a6d, 0x0015d7f1}}, Y: Field{[10]uint32{0x002655ad, 0x023a42a4, 0x02f2f09b, 0x01cf1a8e, 0x02ed33b5, 0x01e3a1f6, 0x031dbc29, 0x03f28b59, 0x039042a6, 0x001bdbb6}}}, + {X: Field{[10]uint32{0x0121250a, 0x039ff72f, 0x00ad4954, 0x01d60e66, 0x03df45e1, 0x010d5579, 0x01e342ba, 0x022b494c, 0x01480bab, 0x000fea45}}, Y: Field{[10]uint32{0x02a76731, 0x021b00be, 0x01fb791c, 0x01680cad, 0x002e45e5, 0x00eec49f, 0x01bdf960, 0x02c0c33d, 0x02905499, 0x002fe6d9}}}, + {X: Field{[10]uint32{0x010117df, 0x01aa291e, 0x0102921b, 0x02ef3880, 0x03da253b, 0x03ba8aa3, 0x03f26f81, 0x02ade889, 0x0036b64e, 0x00297b24}}, Y: Field{[10]uint32{0x006462fe, 0x00a04cfe, 0x02363d81, 0x03c15852, 0x031c8461, 0x0347e83d, 0x0197983a, 0x01010031, 0x02625ec1, 0x002de771}}}, + {X: Field{[10]uint32{0x01e0545f, 0x0008d263, 0x0074f5cb, 0x0368841b, 0x0080e625, 0x02cd422b, 0x035ea004, 0x01c4928d, 0x03cc58e0, 0x00148116}}, Y: Field{[10]uint32{0x006c3d91, 0x028d3014, 0x01af236e, 0x003caa3f, 0x03793b9d, 0x00338c4a, 0x030ed9c2, 0x0048eb50, 0x01fcebe3, 0x0006cfcc}}}, + {X: Field{[10]uint32{0x032ad712, 0x03e5d705, 0x007290b0, 0x02c37841, 0x015a398c, 0x0118d26e, 0x01e79761, 0x002c2527, 0x03e91331, 0x002854f7}}, Y: Field{[10]uint32{0x0148fdd2, 0x017d94e3, 0x03329c8a, 0x00a16bc2, 0x02bd053f, 0x007c6e26, 0x00318d5f, 0x016cbf12, 0x00413fb0, 0x003f6536}}}, + {X: Field{[10]uint32{0x0220479f, 0x004f430c, 0x0338a89f, 0x02579796, 0x035de47b, 0x00dd80d8, 0x0162c8d2, 0x00bf6e00, 0x036ebe47, 0x00162d50}}, Y: Field{[10]uint32{0x027db17a, 0x01cdd795, 0x0334144a, 0x03120a6e, 0x0396af27, 0x00bdb7a0, 0x02913a25, 0x019cb138, 0x02b055cd, 0x002175ed}}}, + {X: Field{[10]uint32{0x01cf5b3a, 0x030dc044, 0x02781030, 0x020ef6d6, 0x00c4433a, 0x023b7209, 0x01c34d08, 0x0118564d, 0x02c6af79, 0x00269506}}, Y: Field{[10]uint32{0x02a44ae4, 0x0155d7cd, 0x0252d63f, 0x0389487a, 0x035548fe, 0x0223d1d7, 0x03e1af36, 0x01aadf2b, 0x00c1cb10, 0x002d9852}}}, + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + }, + { + {X: Field{[10]uint32{0x03accae0, 0x012e8447, 0x0333748c, 0x0031692e, 0x023c8b35, 0x03c1c7f4, 0x01d94ce4, 0x009ea307, 0x02661395, 0x00023aa5}}, Y: Field{[10]uint32{0x0262b945, 0x03cd28c3, 0x038e955a, 0x02fa73c3, 0x0335b783, 0x02e57175, 0x00e7c0cf, 0x009e0b89, 0x02bbc8ee, 0x001883be}}}, + {X: Field{[10]uint32{0x0190b632, 0x00c4c768, 0x01ab9a29, 0x008e92ad, 0x0263cf2a, 0x01556760, 0x0266df31, 0x003367ce, 0x03717622, 0x003097d8}}, Y: Field{[10]uint32{0x009590cf, 0x02fcf5bf, 0x03a1d6ee, 0x03fe7809, 0x000a9f04, 0x020275e6, 0x01049903, 0x00a1ce62, 0x03ede94d, 0x0014c553}}}, + {X: Field{[10]uint32{0x02a06f5e, 0x0102d659, 0x0037021a, 0x0145ba82, 0x02a34192, 0x0098edc5, 0x03b0d421, 0x0094eb0d, 0x00fbea14, 0x000e0ec9}}, Y: Field{[10]uint32{0x03c6e772, 0x03d1e1b4, 0x02b04089, 0x01d2ee30, 0x01e8f6ae, 0x013a9686, 0x00f566d5, 0x02e88113, 0x006ac4ed, 0x001533dc}}}, + {X: Field{[10]uint32{0x0066d561, 0x032cedf5, 0x00b4de2c, 0x0370c65e, 0x000c7b55, 0x01a21513, 0x002d82a5, 0x01aeacfa, 0x01fe3cce, 0x000aa7a3}}, Y: Field{[10]uint32{0x02e76373, 0x0333d494, 0x02182f96, 0x03b05e80, 0x035e01ea, 0x0022e5b3, 0x007b5ad6, 0x01947eeb, 0x01a5c16e, 0x000077fb}}}, + {X: Field{[10]uint32{0x0238a136, 0x01d70751, 0x00195c79, 0x038cda0e, 0x002b0d1c, 0x01835e43, 0x01e59c6b, 0x03b5b5e2, 0x02d03e02, 0x0039a10c}}, Y: Field{[10]uint32{0x006c2584, 0x03460423, 0x03336aaf, 0x03af6cd5, 0x032e09e3, 0x02807991, 0x012a7303, 0x01699893, 0x001398e3, 0x003296f9}}}, + {X: Field{[10]uint32{0x03cf2dce, 0x026d0236, 0x006c0213, 0x00417077, 0x0068114a, 0x00bfe660, 0x009e4c99, 0x018862f5, 0x014292e4, 0x0025798b}}, Y: Field{[10]uint32{0x00c86594, 0x0377f7d6, 0x0120e62b, 0x0180dc13, 0x025e7b30, 0x010a354b, 0x03a26e2b, 0x00a1d460, 0x0184296c, 0x0001ada0}}}, + {X: Field{[10]uint32{0x02e8c10c, 0x021f1105, 0x016807ce, 0x017ce46f, 0x03b47298, 0x01cc1b9f, 0x02fbdece, 0x0170a83b, 0x0159e2fe, 0x000e5775}}, Y: Field{[10]uint32{0x01fe638e, 0x035b64c1, 0x0122cbc3, 0x0013719a, 0x034c909c, 0x03fe9389, 0x0013e87a, 0x00ab1741, 0x00d4b459, 0x003f58b7}}}, + {X: Field{[10]uint32{0x038be384, 0x034c810f, 0x036c3e8b, 0x02b68c76, 0x0271ec0a, 0x03f7bc1c, 0x01ad6c94, 0x00f86c94, 0x00a42be6, 0x002c8de4}}, Y: Field{[10]uint32{0x0319880e, 0x0291cf7a, 0x00b58d10, 0x03d0527b, 0x0117f004, 0x02a07e51, 0x0150f88a, 0x017b6fa3, 0x014919d5, 0x003f1ada}}}, + {X: Field{[10]uint32{0x016c14ef, 0x01936c83, 0x03c8f516, 0x01d41be4, 0x000858fc, 0x03b89920, 0x02eed5be, 0x01772e7d, 0x02dc3552, 0x001e9452}}, Y: Field{[10]uint32{0x033fbd13, 0x00f861c2, 0x0224f7ad, 0x03dcaa9b, 0x0329beae, 0x0323d70d, 0x017f0b94, 0x039363a2, 0x01fed152, 0x0015bb74}}}, + {X: Field{[10]uint32{0x017ec94b, 0x03c14f42, 0x01c2dff9, 0x02472356, 0x0127ed70, 0x02b9a060, 0x02215aa8, 0x03bfb47b, 0x03cb7b4a, 0x002c844e}}, Y: Field{[10]uint32{0x007831ad, 0x03efff1a, 0x010fdbd5, 0x002c8d5f, 0x03094322, 0x01532d3a, 0x01a0b534, 0x03b9cc41, 0x027399e8, 0x0024efa7}}}, + {X: Field{[10]uint32{0x036d65eb, 0x0118f413, 0x021524a9, 0x01dd5100, 0x035a9910, 0x012423c8, 0x028ef3bf, 0x0364363a, 0x01584325, 0x0007b87f}}, Y: Field{[10]uint32{0x0122941c, 0x00dae497, 0x002b11e0, 0x03a618d6, 0x02ca32f4, 0x03d0bf3e, 0x03ab9fc4, 0x031cf073, 0x0091bdd6, 0x002eda4a}}}, + {X: Field{[10]uint32{0x03a6257f, 0x01499165, 0x02c40b80, 0x02c689e9, 0x011873c3, 0x02c1f9e2, 0x0024274a, 0x013c9699, 0x01c8e1f5, 0x001c7a4d}}, Y: Field{[10]uint32{0x01b1e582, 0x005d1874, 0x00f7a5b2, 0x015033dc, 0x02ef2523, 0x01eb8a94, 0x02d86ba4, 0x008944f7, 0x0259f47c, 0x001e364f}}}, + {X: Field{[10]uint32{0x0236cb44, 0x02543bc3, 0x020191f1, 0x01b23728, 0x01617e8b, 0x0220cd5f, 0x0058fd0d, 0x02aaa2f0, 0x0234d38f, 0x00055455}}, Y: Field{[10]uint32{0x03495a68, 0x02bd1947, 0x001e5329, 0x01d7c083, 0x01a8c371, 0x0118c817, 0x030e3f0b, 0x0148578d, 0x03c75557, 0x002ad3ff}}}, + {X: Field{[10]uint32{0x01ca950e, 0x0211c91e, 0x03bacbf0, 0x01d8aec4, 0x0139e015, 0x03b8b118, 0x02f8be79, 0x02572b14, 0x01ca4ee7, 0x002af114}}, Y: Field{[10]uint32{0x029490d2, 0x039f6326, 0x013ec07c, 0x00033a95, 0x02526840, 0x00b24515, 0x01dfb80c, 0x0029676c, 0x00befe82, 0x002b89c6}}}, + {X: Field{[10]uint32{0x0027bacc, 0x0251841d, 0x022e151f, 0x019374b5, 0x029e7331, 0x0163712a, 0x0358eb09, 0x014804d8, 0x006446bf, 0x000ef1af}}, Y: Field{[10]uint32{0x02d6fda6, 0x00cff57a, 0x02b4714c, 0x02948a2f, 0x03d71b75, 0x01b5b00a, 0x0362ee22, 0x030c1736, 0x00c07176, 0x00238c17}}}, + {X: Field{[10]uint32{0x039a9787, 0x01db313a, 0x0168092f, 0x02056566, 0x0189bdde, 0x02f4de23, 0x0269716b, 0x028181d1, 0x01faef5b, 0x00374d89}}, Y: Field{[10]uint32{0x0244a573, 0x01a34031, 0x0395937f, 0x0260a20c, 0x02941461, 0x0115cc72, 0x01a25010, 0x00c35187, 0x03a3520e, 0x001e8623}}}, + }, +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go new file mode 100755 index 0000000..051b8d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/secp256k1-go/secp256k1-go2/z_init.go @@ -0,0 +1,113 @@ +package secp256k1go + +/* +import ( + "os" + "fmt" + "time" +) + + +var ( + pre_g, pre_g_128 []XY + prec [64][16]XY + fin XY +) + + +func ecmult_start() { + return + sta := time.Now() + + g := TheCurve.G + + // calculate 2^128*generator + var g_128j XYZ + g_128j.SetXY(&g) + + for i := 0; i < 128; i++ { + g_128j.Double(&g_128j) + } + + var g_128 XY + g_128.SetXYZ(&g_128j) + + // precompute the tables with odd multiples + pre_g = g.precomp(WINDOW_G) + pre_g_128 = g_128.precomp(WINDOW_G) + + // compute prec and fin + var gg XYZ + gg.SetXY(&g) + ad := g + var fn XYZ + fn.Infinity = true + for j:=0; j<64; j++ { + prec[j][0].SetXYZ(&gg) + fn.Add(&fn, &gg) + for i:=1; i<16; i++ { + gg.AddXY(&gg, &ad) + prec[j][i].SetXYZ(&gg) + } + ad = prec[j][15] + } + fin.SetXYZ(&fn) + fin.Neg(&fin) + + if false { + f, _ := os.Create("z_prec.go") + fmt.Fprintln(f, "package secp256k1\n\nvar prec = [64][16]XY {") + for j:=0; j<64; j++ { + fmt.Fprintln(f, " {") + for i:=0; i<16; i++ { + fmt.Fprintln(f, "{X:" + fe2str(&prec[j][i].X) + ", Y:" + fe2str(&prec[j][i].Y) + "},") + } + fmt.Fprintln(f, "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g = []XY {") + for i := range pre_g { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g[i].X) + ", Y:" + fe2str(&pre_g[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_pre_g_128.go") + fmt.Fprintln(f, "package secp256k1\n\nvar pre_g_128 = []XY {") + for i := range pre_g_128 { + fmt.Fprintln(f, "{X:" + fe2str(&pre_g_128[i].X) + ", Y:" + fe2str(&pre_g_128[i].Y) + "},") + } + fmt.Fprintln(f, "}") + f.Close() + } + + if false { + f, _ := os.Create("z_fin.go") + fmt.Fprintln(f, "package secp256k1\n\nvar fim = XY {") + fmt.Fprintln(f, "X:" + fe2str(&fin.X) + ", Y:" + fe2str(&fin.Y) + ",") + fmt.Fprintln(f, "}") + f.Close() + } + + println("start done in", time.Now().Sub(sta).String()) +} + + +func fe2str(f *Field) (s string) { + s = fmt.Sprintf("Field{[10]uint32{0x%08x", f.n[0]) + for i:=1; i 4 { + log.Panic() + } + + return sig +} + +// SignDeterministic generates signature in repeatable way +func SignDeterministic(msg []byte, seckey []byte, nonceSeed []byte) []byte { + nonceSeed2 := SumSHA256(nonceSeed) //deterministicly generate nonce + + var sig = make([]byte, 65) + var recid int + + var cSig secp.Signature + + var seckey1 secp.Number + var msg1 secp.Number + var nonce1 secp.Number + + seckey1.SetBytes(seckey) + msg1.SetBytes(msg) + nonce1.SetBytes(nonceSeed2) + + ret := cSig.Sign(&seckey1, &msg1, &nonce1, &recid) + if ret != 1 { + log.Panic("Secp256k1-go, SignDeterministic, signature fail") + } + + sigBytes := cSig.Bytes() + for i := 0; i < 64; i++ { + sig[i] = sigBytes[i] + } + + sig[64] = byte(recid) + + if len(sigBytes) != 64 { + log.Fatalf("Invalid signature byte count: %d", len(sigBytes)) + } + + if int(recid) > 4 { + log.Panic() + } + + return sig + +} + +// VerifySeckey renames ChkSeckeyValidity +func VerifySeckey(seckey []byte) int { + if len(seckey) != 32 { + return -1 + } + + //does conversion internally if less than order of curve + if secp.SeckeyIsValid(seckey) != 1 { + return -2 + } + + //seckey is just 32 bit integer + //assume all seckey are valid + //no. must be less than order of curve + //note: converts internally + return 1 +} + +/* +* Validate a public key. +* Returns: 1: valid public key +* 0: invalid public key + */ + +// VerifyPubkey renames ChkPubkeyValidity +// returns 1 on success +func VerifyPubkey(pubkey []byte) int { + if len(pubkey) != 33 { + //log.Printf("Seck256k1, VerifyPubkey, pubkey length invalid") + return -1 + } + + if secp.PubkeyIsValid(pubkey) != 1 { + return -3 //tests parse and validity + } + + var pubkey1 secp.XY + ret := pubkey1.ParsePubkey(pubkey) + + if ret == false { + return -2 //invalid, parse fail + } + //fails for unknown reason + //TODO: uncomment + if pubkey1.IsValid() == false { + return -4 //invalid, validation fail + } + return 1 //valid +} + +// VerifySignatureValidity renames ChkSignatureValidity +func VerifySignatureValidity(sig []byte) int { + //64+1 + if len(sig) != 65 { + log.Fatal("1") + return 0 + } + //malleability check: + //highest bit of 32nd byte must be 1 + //0x7f us 126 or 0b01111111 + if (sig[32] >> 7) == 1 { + log.Fatal("2") + return 0 + } + //recovery id check + if sig[64] >= 4 { + log.Fatal("3") + return 0 + } + return 1 +} + +// VerifySignature for compressed signatures, does not need pubkey +// Rename SignatureChk +func VerifySignature(msg []byte, sig []byte, pubkey1 []byte) int { + if msg == nil || sig == nil || pubkey1 == nil { + log.Panic("VerifySignature, ERROR: invalid input, nils") + } + if len(sig) != 65 { + log.Panic("VerifySignature, invalid signature length") + } + if len(pubkey1) != 33 { + log.Panic("VerifySignature, invalid pubkey length") + } + + //malleability check: + //to enforce malleability, highest bit of S must be 1 + //S starts at 32nd byte + //0x80 is 0b10000000 or 128 and masks highest bit + if (sig[32] >> 7) == 1 { + return 0 //valid signature, but fails malleability + } + + if sig[64] >= 4 { + return 0 //recover byte invalid + } + + pubkey2 := RecoverPubkey(msg, sig) //if pubkey recovered, signature valid + + if pubkey2 == nil { + return 0 + } + + if len(pubkey2) != 33 { + log.Panic("recovered pubkey length invalid") + } + + if bytes.Equal(pubkey1, pubkey2) != true { + return 0 //pubkeys do not match + } + + return 1 //valid signature +} + +//SignatureErrorString returns error string for signature failure +func SignatureErrorString(msg []byte, sig []byte, pubkey1 []byte) string { + + if msg == nil || len(sig) != 65 || len(pubkey1) != 33 { + log.Panic() + } + + if (sig[32] >> 7) == 1 { + return "signature fails malleability requirement" + } + + if sig[64] >= 4 { + return "signature recovery byte is invalid, must be 0 to 3" + } + + pubkey2 := RecoverPubkey(msg, sig) //if pubkey recovered, signature valid + if pubkey2 == nil { + return "pubkey from signature failed" + } + + if bytes.Equal(pubkey1, pubkey2) == false { + return "input pubkey and recovered pubkey do not match" + } + + return "No Error!" +} + +// RecoverPubkey recovers the public key from the signature +//recovery of pubkey means correct signature +func RecoverPubkey(msg []byte, sig []byte) []byte { + if len(sig) != 65 { + log.Panic() + } + + var recid = int(sig[64]) + + pubkey, ret := secp.RecoverPublicKey( + sig[0:64], + msg, + recid) + + if ret != 1 { + log.Printf("RecoverPubkey: code %d", ret) + return nil + } + //var pubkey2 []byte = pubkey1.Bytes() //compressed + + if pubkey == nil { + log.Panic("ERROR: impossible, pubkey nil and ret ==1") + } + if len(pubkey) != 33 { + log.Panic("pubkey length wrong") + } + + return pubkey + //nonce1.SetBytes(nonce_seed) + +} + +// ECDH raise a pubkey to the power of a seckey +func ECDH(pub []byte, sec []byte) []byte { + if len(sec) != 32 { + log.Panic() + } + + if len(pub) != 33 { + log.Panic() + } + + if VerifySeckey(sec) != 1 { + log.Printf("Invalid Seckey") + } + + if ret := VerifyPubkey(pub); ret != 1 { + log.Printf("Invalid Pubkey, %d", ret) + return nil + } + + pubkeyOut := secp.Multiply(pub, sec) + if pubkeyOut == nil { + return nil + } + if len(pubkeyOut) != 33 { + log.Panic("ERROR: impossible, invalid pubkey length") + } + return pubkeyOut +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/input-hashes.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/input-hashes.golden new file mode 100755 index 0000000..445d849 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/input-hashes.golden @@ -0,0 +1,14 @@ +{ + "hashes": [ + "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925", + "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "ae1d9ccf7ce3717a9aa3316c6b7850d0a85bc0466bc1b572545f90ccf1b59130", + "a4cfaddadceb816c4dad0a10d933a1880f9b47b9f943ca93b91cc3a046567fda", + "1d93be8a70df9e7450a0ce98231c58d7353e025cd1e9db32a00c2fd0a1643d96", + "a0c10151fc212bc313332c58aba5e19de1d6787178613819ff8dc6db270c66fc", + "fc54b1c9039285084cec65510329331a82397afff54706a9ac611b95c933f783", + "621484cec82cca5d8fb163d80c361ddf7320913fb294a3855c3e4db60440919b", + "b780c445c161b65c3dc1046cfba900161fe8a5f644907995b077f1afd231b230", + "4eefdc2b82e79d98fd3f323b5c284a1c35f4a8a862d9e83c8b96cd647ca3794d" + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/many-addresses.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/many-addresses.golden new file mode 100755 index 0000000..e5e8edc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/many-addresses.golden @@ -0,0 +1,5005 @@ +{ + "seed": "d2lyZSBqdW5rIG9yaWdpbmFsIHN3b3JkIGJyZWFkIGJvdHRvbSBhcm1vciBkb2cgc25vdyBhY2NpZGVudCBpbmZvcm0gcmlnaWQ=", + "keys": [ + { + "address": "2Niqzo12tZ9ioZq5vwPHMVR4g7UVpp9TCmP", + "secret": "e7550f33084a1b8ba935e2a943201adbea065ba9e87ae1e07c5a0b1d87ea8f3e", + "public": "024386ad78055064e65086ab69ae5c1629aca2fc7e4857261d141c181236700ae0" + }, + { + "address": "2UDzBKnxZf4d9pdrBJAqbtoeH641RFLYKxd", + "secret": "cd6c5e2d56c302496009c0cd8006e9264a69606524fc7f58b45351d2cd883209", + "public": "02b7e753683d5b53b5ce1c800dbfee62594d7d3f1d5f8a2af8f9b9b6d01fac02e3" + }, + { + "address": "8LbGZ9Z9r7ELNKyrQmAbhLhLvrmLJjfotm", + "secret": "4976bba22c7f481334844d8f6c8d513c573d881f64a55981506b11dab581c39f", + "public": "038c977ea6bdef6f74ab9864cdbfa3065b5aeecfb1b9fc71f2459e3609a242082b" + }, + { + "address": "7KU683yzoPE9rVuuFRQMZVhGwBBtwqTKT2", + "secret": "097669b9fa165f102c4c9aa098ae3ee4ff2554788b875cb5b0aa76d225eaccf5", + "public": "021c52a4b715fc1cdc6ab6d7c8bc8d9e0ace43ae5321a07a950d63eced0b82f8fc" + }, + { + "address": "gwgdez9f3BLvQyNE5tMFS75p69zs2i3mRq", + "secret": "52d5cba120ee89ac59506d19900833e0d4d696fa56549f3f2418958791d5f880", + "public": "022e678bb9add17994fb4603914c8fa229b5c0aac6b725e24e256f6533bb185ae7" + }, + { + "address": "aSEqXrooiycfyXDc2aLYLGSmjrozJh3jCn", + "secret": "3bd338e8674ca06431eeca83d062f17557402b88afa9daa015783e47788168b1", + "public": "038f4cbfb7b0548f53a8fe25cce2c938acbf2d17ccbea347a10872317cb5168178" + }, + { + "address": "2Z6WpR2RoBBF722hZ75ShDp1LVmojSRfAiF", + "secret": "d7f3f12937a4429299e67d5f916a503fdc2ba3064d89b6b39930f5265a8d792a", + "public": "0363044bd9d59c9461dddd3a0aeb5e973d696ff5f1153c1e930263244aa8066a87" + }, + { + "address": "25sH1HLTQbr1CR4uxkMFtJY2WLLwFVPqzKQ", + "secret": "2c47f82501fdb00b7d47a545ab5d1e0a148c1ed6d47e8f5630091561465ed40e", + "public": "03992d87f8e40ed2e55304a05e3bf7e12c9e8713498a90acfa51c046c9746d8f0f" + }, + { + "address": "MGiD4Bg65F7bQhaKmhCLsaVKKeEFLuGgA3", + "secret": "fc7f9fb98804537752ec2d2e58618ac316e556af202294a109ddad5747b18d31", + "public": "02f4bb55716f1c7d7bd69e1f0fa7ffc50094fa348be3633a916c8da21298c2db55" + }, + { + "address": "2bYFuBzZ7QiEbpJophC2pFhQLbEFt3YSSJH", + "secret": "c8c40438a94ccfff9b2fe7150ff7a4193341a55893aad88c06f05b904bc2aab3", + "public": "0377b14de3039f77bcf3f5f4ba852a9b36eab3d7618c59c33336aa17870162d446" + }, + { + "address": "yExu4fryscnahAEMKa7XV4Wc1mY188KvGw", + "secret": "ccf9b32c1f573a7e1cbdaefb791e515847e857fa6e44a42a4bcb396c5e5e7544", + "public": "0399e8ac882b086491e424a04cd8289e340a5cf132c74950659bd21262db5674a7" + }, + { + "address": "23GxEvPcy5vFPuzuP8o3PBag3HgQdoaWyXb", + "secret": "815d3fb815e4cc29c5e17acd597c570a8f1f9108ae955c01fd756ba5564bba4f", + "public": "0370dc9f523c4bef8697e87a59cc6c54f4e89d513a8bf08b1cabab7a357a508957" + }, + { + "address": "2C3JbrfoE4dSjZ5dE4hxrYCmmmrcFEGyiUL", + "secret": "5e01bf90d5331617a5c83afec44ce5b13dadbfc94efa58f2445ac2e9885c867e", + "public": "03761fa32c428788d875e670ad62f128da4ee70ccafc9577b6f1e3ba69a5195137" + }, + { + "address": "KE9oA24AuPzDzWBEjhGJu7PHZsQjGXYcww", + "secret": "70a250282d1b56abffee25badeb702c2ca82650c67ffa8be526cd600007406da", + "public": "034e06e04e3c6a32ddbc25c7572343d50a3c4eedd596550ccea33aeb24410d2422" + }, + { + "address": "2KnZdRBrVkK7EyzPxFdYrAoZ17MwjxxaCR", + "secret": "4627499983552fea4be50a879b5923f039959baa3af2e0699381a95507f0e6ab", + "public": "02dba9c7be5ea5668554d295027eaec51b69a582f4561d13afa8ee9004b2941b2a" + }, + { + "address": "2NGNQTdVNxZQPpBvj64ecidwXF3ZhhkX922", + "secret": "76446750f1f12301fed6037803d0560c008a98a2fa34ab5a1ddaa8ff9dcd3a52", + "public": "026341de878a483526cbf90a591fe8b6fa77fa775d3dfabca8ac5be72aa83690ef" + }, + { + "address": "3sNLvvtb5wFLMhoFxhSb9FiySLGoAzNbGd", + "secret": "9f9b67cde19a83f752c9639a86ec935526e1ab8a38dd23a702686e0e9d4e45b0", + "public": "0398a29c3eb0462bb65757990a762f7e5062db04fa228168c8a308348f1ff5903d" + }, + { + "address": "2kaTspbcfCyWNatPbRNZ55Xg8zyp77rNgv7", + "secret": "2ef76df65020b8c65ba9c6d71dd027cac4892e7e8ff1c8b12f87a48be1e117d0", + "public": "02d16798077bb6dc624d3dbbe99c698c7b91b17157beaba72216b6d85b436a3529" + }, + { + "address": "2mcYBt3gpiYFjkTZQHP142R3NF4JZimhSzk", + "secret": "7c2e5e465f172630375aad2b57a45b654c10a9a805f0f25b1a34ceec1b420a74", + "public": "024ab0a1303bbe5e09222c39276da19ff1f761cd1a164dabbb48e6f388a7a82f8d" + }, + { + "address": "d4vFNveNynBj56XWK4M5cHw5JGLdc9arDb", + "secret": "0e956d92efe55a0b6c0b4db9a2f25d370961da54295ebf45fa8cd0bf4d4c3a3e", + "public": "0396a73e38515653a2b58030489cdb85b8dd000293597eab9616dcbfe0d02892a2" + }, + { + "address": "trJzid787SDzbZke8HGGabsRJxf5UYQ24t", + "secret": "aa3eab38c574d811d2238f88a8db27c3973c5f3454e50224340abbb70510da2f", + "public": "037570e5c30c2cd11af39ef7cfd8d3d1d09bc9a6618fa649b484f76560f27d9fdb" + }, + { + "address": "843rtbppb1fS7GLipW2VdAJ6U3ASNYEYXS", + "secret": "f700853e5a35c9993f7951b5b7c9bcba595f8a0ac6394e233fdb40c2955bafd9", + "public": "027b6f77c26d08e3ad3bed214f8bd450635c3f53879c60ad51560eb877753dccda" + }, + { + "address": "Jn8SM7bRtzC49hb5ndj8RSjbqUUUPqMj3A", + "secret": "dd09b66bc338c831be7d3e781345957e0b04c691cb9e3fec7104202aabc3b949", + "public": "036abfb1f082662fbe2d39ad34c9cfa4f58f57160d77a7ef997c6738ce7cc496fd" + }, + { + "address": "2BwTfjCK38ucP4UAdAX1HbzR7etZcBY6FXr", + "secret": "68928b66031781cc596dd42bf1234c6ae315df97791a2f96bd5c74d2251497bb", + "public": "0328b1281495e1547dc27a29fb29f4a1b66b66fb8358e126beafd76dadbc8272c5" + }, + { + "address": "2XRhzqNgRJgT6rNp1FVp2SyZfrDedjSKUWx", + "secret": "8800062e991bed81298c23b773050edc552390bc5d0eefa6abec0237524a1866", + "public": "020c41cb5d5294a18378f8141b7868d39c9f9c7b0ed2d5f862222a103cd9d491e9" + }, + { + "address": "o8xuJ8PVfeBCSsZkR5hoB12ooBwXJzVztB", + "secret": "7a54ee9f88101d3623b81556b36922b18b6fe2bff154170322544602daa2685a", + "public": "02d8f4e328d0c04218f563ad17edf39af82dcc8b5f8d5639a6ece03239c7695d4e" + }, + { + "address": "S49fz7SUwStZvhTM7DuJfN2DKPgkb9bo5r", + "secret": "9cd5662056a5ebfd882c63852c8bcff133d7fdec0c7c51d3cecc4b41dbb9c5aa", + "public": "02bc622382316e90b2dc4c63a6638719f710dad0024818d96a42c67bbf49f49632" + }, + { + "address": "FZRetm6mneEEkXzZTGhMfWvK4yaSo1rjf4", + "secret": "673a827dc5452987a4e944dd5edfc286f815c3fcaa7a9f219d46cfcbb56b5dd4", + "public": "03abc7caef609535b9bbec78b24c2f0944e2d3cd472021e2e714f5136b757b85c4" + }, + { + "address": "pC4nG37Nz9VWTfEXJjgSP7wKDRzNkF4bn2", + "secret": "a76c7a8c63a7c65eedf815ec927b0ec4236944d57bd975cbe3b0ba7c15a238a7", + "public": "03e9bf477af127058244bd5ada03d17f966ae1ac35fee464347aeca568643dae4c" + }, + { + "address": "uVfk3t6iE5f37MVCDKrquUewt2KJWZJNTP", + "secret": "f1fada84b0e61f65814ac2647a8e8f776fed9d07659cf5540817e712ee4d603e", + "public": "03ac4c5040d5e6c0fb9536968e4c59b826a5bcded4af44a1c70cb06c2998e772b6" + }, + { + "address": "25sESDqRTSKZbq1Z7UUykw1UxnxejaeHKNV", + "secret": "e66fce8a4934642b40de3206937bab985279d043a5dd063e04c2718d93612d00", + "public": "024b1e68e39344b6e3857434c4929f3c0409897725ddf6b82e363446964a5a7f8f" + }, + { + "address": "agYZZqeEPpHYS2Ks9tmtbBEg6xTCYZVatb", + "secret": "8b111a441d22f5bc465913e318ff99a5dfe7df5cb011c59d8197809209e47ad6", + "public": "03e36c45480e687f6f2ac25608d0b8e75ea8ada441965c927a4b15a78e3f94c82a" + }, + { + "address": "2TpoqeGL2tHKnfBzaBpD6oo3E37rA5X74bA", + "secret": "09bc51ed1979b9c3011519f2a6c900762cea345aa1af5c73a2ab94054c0e177c", + "public": "021b11212bd1127d4606e48c36938a92696d115dfb37880e3e81b8d5b59171fde3" + }, + { + "address": "22y8iKcVhL9337QPXWAM5m68f9eKHcjhU44", + "secret": "af7212e928b268c0c8078fe972dd394cace9551d36b6c0c60fd264542b6b5256", + "public": "02c1147a11a54d5545f696f6c5047d1571e6b432de8a57e3dff461f159f59a88ea" + }, + { + "address": "f1YscDhp9YWMEnYbPtdJE4F7yaV7GsNTPS", + "secret": "d8e41cba017811d71814bd36bcd31eb63fd6ee9745a3b2436eebdd2700f58bc1", + "public": "03346a3a79d5d6eea45ba3abca39284ff97d0ccd4371487d72f3b4767d70a5df79" + }, + { + "address": "nHPDziRL3wwDpe9rGsTUEocAQbyRHAJigC", + "secret": "c1bfbcd71db2d80d2cfd1d703a2c77d218cfcf887bdc31e54c8de628b9056fbc", + "public": "038e900f336f7c079594b2932ab6a477c88c0fc15499eca290c1901408ac0f5b6b" + }, + { + "address": "bx6Z6THQsmto8ANcgNb9WGhpedQWhvKiPD", + "secret": "909c29237a00742601bd955e68bd816f7e7bc6dd59ce3073c29bd33d541a2bae", + "public": "037b9af02809edd2690be5816a2884c2c13b81dac4664ae9b77955c1311b270116" + }, + { + "address": "2NAfLeTNC19wof25NSBNpKGTtKt1iEZtxDT", + "secret": "2e9162ff3277034514612537d06bff053b0739de417887d3aff7f4cad7234422", + "public": "02210135701345e15b2aaf4deda129cd751c47e3a37911d38c9cc69c2865b69c5f" + }, + { + "address": "9L2uQrmvmgeQDYSgiPAmczWAgJTWekBG6X", + "secret": "74e851270b94649cc8b53aa56ae2e188de32d43346a17e7e82e492dab1104a3a", + "public": "02adcb621c62eb75c79ea6436017e5d34631cd376aa8e965d760cfd8bf7f9a225a" + }, + { + "address": "8pDsA7hNgcGmugiq9SqbpBAr8LNvqXhYCd", + "secret": "df3557714a662940a82c11d84663c55c8de236095c28a31b9ec1b149b0a7bdfc", + "public": "03f1ea020b8a21dcf7c6fc3540f96ff6444f121f397ae04cadf65cb057848b80c6" + }, + { + "address": "HDVGBNTJmnVeU1wY4iEiDmT4KoNoJ97DVk", + "secret": "5041f6146dd91ca0213e2df48cf8c9bd0f99c64fc8a0b64726b44fbbc5f547d1", + "public": "031a66ada2536a17a5490072f0aee3d980b13de58700d933b691d2b95491701eaf" + }, + { + "address": "28GUdCt1ACa7Rn8pN9ekxugDh1hWgiY8W5m", + "secret": "a60c4ba7fdf08fd40149620ae0e8fc4286d6283269239f302407cd1281d57580", + "public": "023fecb3e413741c3f97ef44ae34a3c9b1d32bc77ec1cb5d2e0a62c61dbb336248" + }, + { + "address": "zW4yhXcYE1ehseDfsCyRJCfsT9aFJ1P7j9", + "secret": "121b9d7572889ef55b0208dca8a483887c0b2058db5a891196f561210f0fddb4", + "public": "037cfcbe2648f52ff55a77fbd120797beeeb12b3dafa78ad161bcbf539dedbe336" + }, + { + "address": "8oEmZLjUnFx8DCt6Jpbyz7iNDEfgg5FwXG", + "secret": "4c3c253abc435b410fd2705af8f0f790c3eab26415e25b7209472a40d0b0d1f3", + "public": "028d7c6613d9a95c0eab9698afbc2f2429c2fc67e62380b6536421e1b4cb4cf059" + }, + { + "address": "2FxepT5DXPGNW647tuCakM4HxzLPKXA5mnP", + "secret": "a938eed62cfb072cc74404a3133c91cd2cc056ceb466c00f466e000bd466983d", + "public": "03e72d38296b249fe8104308120c09a46155d8a31abb0e1869a56c66bd3e87f7f5" + }, + { + "address": "2Rt2P1Vh4o4GK5EwfqF8ndxscxRZErTuyV9", + "secret": "ee422bd4c063752400d45bae49135f9af10fe29d20fd5eca3116377406523de1", + "public": "0314e0b4a496c865dd68c18cf89f19d8f09cfc0fd4f6e94578af99c6325e699802" + }, + { + "address": "Y1g9wuCKZjCArscCAdw2YjyWoiwv5Dgv7U", + "secret": "550c62a0491ad444acf71d6eae431b4b0503df53f9e495d2340f36d4da47e9c4", + "public": "032f92422e238e703eded027945a9836efad0f1007bee51e4c32b457cade288e80" + }, + { + "address": "2Fafftp7czxeoiio5bNHUN3WbfvrJPghVZn", + "secret": "f4a0576bbff57e5d01ca0fc14b26407325ee7f5bc5b7f5f146dee7a6cfb0a31e", + "public": "038f0dadbe3227fae1a18427cacf83a004c63c51dc8860b7028e95cf148d000d57" + }, + { + "address": "2W5K63cGj1DsvB7RkjmpM43PgajoJKemynv", + "secret": "f0f2c983402bf6273aa88b42de4f03876f7beda8f8ad4d94ff35cf1c784667b4", + "public": "02d1c067f11e13275865477cdbd4596be460eace6d76a28e2a4190869c2a2ce598" + }, + { + "address": "2JmV5HRoUcQY4qfBCfUFgg1GKSbAW24iFDP", + "secret": "95d2a4a278f65f262f265a485d0341b5cbadfa913a06fe4ec168a94eb469c78a", + "public": "03b3856f613e7cf421e89c7ed8d9f218835bfff56fc85813a774545d811c4a1d05" + }, + { + "address": "JWyJu3N51syANQWy8CR5H8UyoM1W4zHbja", + "secret": "40709c6b0060a61fcbbff96623330fb65bc38d193ccaaf612ad06157c5135772", + "public": "03bdf149804ccfa96942a0985132dcadba7275b30f7cecff92f36dfff4195c4336" + }, + { + "address": "atsx4Dc6dnqoJQHKPDjR6hgjjEtF7cNhSw", + "secret": "c4e95cc86105d81321c5d7c5d93f7ca9956511e621ebe0a92a18e36c333922e9", + "public": "0314ab127f4fc734f7421a4e470f8bd763f6c63c6bd7e27644a0964f50fb736a5a" + }, + { + "address": "G6TVGZhGKttfCybksiQ77EYuQ6QUuXVsFs", + "secret": "5a1e028796d742347c7f17c2cabbcafc47c5d8fef5c34e31bcfa012cca8bb724", + "public": "028f2dc1e3dbb4cd78cdfec0a0a9d8e88d4f7d3a231530136030714b5c82040c2a" + }, + { + "address": "tnmiayXaehMjUutwQiMnjfwumiJii3Negi", + "secret": "ad96aca0144c11368637c0a0c204cb54812d2e6e401c35b414ac3b8e020a3d56", + "public": "03aa85be4ad8bde40cdd03f1733cab365ffe8645ac8860c13f8ee98eee7f587a47" + }, + { + "address": "qKBvbpxDrCC13fJih6z786gYkCMfPr4yt9", + "secret": "e62bcf14a9c22421cf790b112a49a41d292abf8f957c595d1604fe242218617f", + "public": "033fb1376285345ea5d55f282239c9ebe6a34b0bdcc2a24fd7e50f2dcd7a9f0323" + }, + { + "address": "2Q3fiiv1VnZq52EXRegs7Zm2uNuN1VqYEr6", + "secret": "402d0cd54cf447d0d1a6edce5b363f6d052ac923ac07880261ab1966323970f3", + "public": "036491f6619e034c7031284cd222785b9ee0873f20019e49eb80e599423050a4f2" + }, + { + "address": "2XTfvKh4sjavjxWzUpun2aEioprqmjy8DRg", + "secret": "4dccf074e0c8e4d01fb29a41da3b05acea13693c0d83ccef456f78493787de7a", + "public": "023c992a18276d82533dc77c0d12f65668083a75f9b4b8963fc1284f34b1bfd6dd" + }, + { + "address": "rDdVaVDJhB1idZHPXbQ3PmDFV1ieXp51hq", + "secret": "2fa5575b7df071950d930de9c9e00adfc8d7e41ae4e7731296b938874c4d324f", + "public": "0252de761de10cf981f0cec0171f713090944a85970cc911e35433427991e5381c" + }, + { + "address": "5MyhUZ9JkQ8nNh11JManWvm8btNEmBDHm9", + "secret": "12be2aab0d9b3556254e6ac9ec5480f9eeee5a9e9cd48d4ee5b26863cde25694", + "public": "03d0325101940bac1762da47ed2a30916fb381a461474ed6611afaed556d32836b" + }, + { + "address": "2faGziNRteqfmS2iT2JHrqg3DGJCr7bwPuf", + "secret": "d90f354a51fccdb09f854300ad60d85999062cb716b1f3e8ad706b20e99f6571", + "public": "03637c8155e9858f168a15283d0804840e01b02654ab30dc7505fdf88d7aa88ae4" + }, + { + "address": "s6nvRxY2XmgzUNxHPhpvZWL7KxgXHjpeEx", + "secret": "caa73fdc76cecdf09c278d82eda4ce9ff40c297580dcdc191a4bd43ac0804d53", + "public": "03af813f6b8137f46ba8b77cc9f1cba50f93689ba7ce5498a7edc59a0e3314c6c4" + }, + { + "address": "i4NJfp663DS2BKoZqRrwZWyqJmhV49rWVM", + "secret": "5becbb9a2f3dd5ddfe991b5d8d4c7c2d578ae4d612e92fc64fe902a4233a1ee1", + "public": "0237fa3963e2fc18f0f29e323ce3c01a7ec26550a4e17fa5dfbdd748d4a0a9e116" + }, + { + "address": "fcvhLM6vswQ1Gv6TjSjiadS6zoE7zDshJa", + "secret": "3dcf4be5fbd7fcec93f17a2a07854e902396f8ee7f0ee136633520c00bf8f26a", + "public": "022c509d2fa07aa98b90d4056497822853c53115f519eef7560aa0b08504c59a73" + }, + { + "address": "nfSyJEW2ABm9W8vEQiRsrWEiFu7t68YkYc", + "secret": "26e4d66a9d8a84b8bb249179d360817f042b065ed4f6dbd88ced895efdd660d8", + "public": "025898ccdd8f913077758d97d7dff8704eecbfcdc9d6ed6aac6e46884aeeff1b80" + }, + { + "address": "bQB98uNcaCJXWWeGr6x6xrGq5NMzbSfw7B", + "secret": "e01f466060b0a3ed01a453362d3ffd0f0612ae7dd8f9b5c1d23f3e5df7cc40c2", + "public": "0361f9eb0b245e30d44fe15780b06d67f04d1c175f2ee155e6028a14f6dba72864" + }, + { + "address": "242BmWuosWU4Sj5e3kvDQ6ibvzNqZUzZ4de", + "secret": "4730bf793535f544e4c3abe6d54921801305850f769cbcb64bd65f76da1928fd", + "public": "02f311980d0636ff8fe655b6a695d6214fd09d02d03ba426d1da42dce5585802e2" + }, + { + "address": "26BWqf1QCBxGUdnbuonjWRi27LVVLmab2Z3", + "secret": "ea4b5510b9a4fbac1057012004999622d16b0e8b89cadce161ff1196cdb5cd17", + "public": "02080ce1982679c7cc351d36a4f4d4725bec9167c781df0f93de7a63d02117eaa2" + }, + { + "address": "MLXZvSFYD2Q3ST9hWHJK4wgMmoSCBW4cvi", + "secret": "fb0b97b8fcd171b41fd436b8b513794adfda84fdfd2c6f472a40380a49508462", + "public": "0314787b7d974e093a356713a5be01b14586351a91464f8762ed179290e1324f9d" + }, + { + "address": "wdVZgcdoPVpdEhAM5SBQ4gm3aZQU5rbCjm", + "secret": "4f6c7aa166ebedcf651b11804a969cb0ab939b1bea36bc0c7ca50f0bcb208798", + "public": "03876a421f40c2fc8c6aabc3e4449f882915c2ab5a1d15b5c3329c46e61e417508" + }, + { + "address": "22z6getjDD2GNjXZqe8tHjt5ypjutAEFoLo", + "secret": "0f3d5966a4dc8b6dc64a338e16de058728c1cf2c3f839b3cb05931bd1745eec6", + "public": "029512639e507dcccabde5d47fc5e8a4a95e222c86f5b62bf210329aec935a63b0" + }, + { + "address": "2GEFesXK5Uv14hn5Bmqwd61c1CCQGMvbZLh", + "secret": "4cf001cad4d96d2f2a43089246a1c756e1c23729d1d024f5d332de17e7800c53", + "public": "03045c57e07f9a97d650fe10bf7f3fee1ec1fcaa706e4d7438b5dab09198b840a0" + }, + { + "address": "24zxvoEFNb6ww8zDnchMsqdBoJuBL2t6LQD", + "secret": "fdae58716ebdc041a3a15c70b829af15f13560a371f57086a9f44f3a0faa772f", + "public": "025b943230dcdca2a78d9e2ef9b655c310fcc1bbe6493f05f5cb685b8fa4c570b8" + }, + { + "address": "2F9PfKBjsUMEViRoM1jKAG55T1fSu6hg1aU", + "secret": "219b0e3e367bb102d9e221b3f9505fb808bc086c9bd39d85f3043d59a0b858e4", + "public": "037cd54ab5c37e03c911ee05f7a06dac32bb55b5a18c8c51a2098905ee4f4d2731" + }, + { + "address": "k6s7miNx1cnYVEgUPQD2iqufKzQpRDmzQ", + "secret": "ccc0b397cada9ce4237a0a99697ade6adb57902cb30b7205c1572c377b34b778", + "public": "037bb2652a57a019ba2409b589522ef8a469a140537b33550e161676c0ba609fb4" + }, + { + "address": "S8kVNfBsuRPY8UcwVC44L4JmHF9c2vdoz", + "secret": "02a608c34f19e5f5d48eb3779bc61997c6228d6a83d32ffa21cc5e00c0c66a63", + "public": "0264d8c516969cbe5bf6882187105c72e33c44534203c935cba5bceda4875bd48b" + }, + { + "address": "2ELFHvS8iJs7g9hAYmSQ4d3fPkHPZ7GSYb2", + "secret": "c4d7f23d8df026b38083120e820bc90150557567591f16891de724d1cbef936c", + "public": "02773b43ebe9825f49ffbf9869a63870427c0a2d952e259fb6f14d177100fc918a" + }, + { + "address": "hVeQGNagmE3VdB8FAipt4Ya792T7JhXruJ", + "secret": "4197e0ecf350e45e082214b47e17284ecfaf1fea454032595b143a0d89d79aeb", + "public": "037e25ac47ca505d157eb26196263b1747e71548381130bacdf8688c0f31e29d58" + }, + { + "address": "2gzCB5wvkKAAjind13d6r4oSm2wasV4aTjA", + "secret": "9e7cdb5242980b321a79f4247362d34c0df1552dcacab20f8dc831c06d4687a1", + "public": "020b81829cd7049a05c9403d9243247b62099a7373b5687300c4f05a3d6996522b" + }, + { + "address": "6DhQZL3HQG1Ai4pH9c72G2Svy2ELaozDpH", + "secret": "ea67b633edf994dae447cfbf50852ba075be004e23f4d99962317c62d25be769", + "public": "03e11ab39dadfac039500dd103f7f466b266a08e69ab2b3b0990b620720bafebfe" + }, + { + "address": "2Tw4op3FCi2aXuSySqPEkxUxAVHCi8Wyxwp", + "secret": "9a921268064f24b0e07d8740b72cfc658ca198dfe2af0b373ddf643dba4de755", + "public": "02aba206211ca5a9eff06f96823d3214dd21b2b7456de48f7fe51ffe4f7b7074bd" + }, + { + "address": "2apYHtvxjoen5tFVrb88XkjPRHp61bnMmYF", + "secret": "7828fe7605bbbf70fc0003d04ec85a860376e8d1d8ea13fda2079be6b11b5c2d", + "public": "02e717897f6b0f94f69a393f895c9df2da0e45d895cddbbe95256f6ae0c433c7fe" + }, + { + "address": "1NdzQhMertw6PGza5eSxqfWMhMjGhbYszx", + "secret": "6f539af4e8b9001e591421e2830a3a2508dcb1637f46203e5a80fe84a9952a9b", + "public": "0263b7563c486dcc9ab1f0d46a5c10ceae652339c353031296c9f1d7deb3fd2683" + }, + { + "address": "xQgKsD9dAHf3NAazojsQ8WYzbaAyrJZeVy", + "secret": "ac07ce6a66f23f5ecfd0e0d983297e18a945730cf653405029c2e94cc7975ad6", + "public": "037104e7bbc30d57f60ce85bd56b19ad72507079dbb9befeb524bec6c6f6b35f8f" + }, + { + "address": "2SShMG5rU7mJ7v6wsjtFYgxrNB56P3cpdrS", + "secret": "4a59d42ba0cf18052321f70d008820256b790ca132461ec0bbbdbe1e03bcab40", + "public": "0321b0224eae60e8518343b6cc8ac9943561edb276bfc468aac589eed9e1044415" + }, + { + "address": "M6JKu4bqGgnJ9ZFuodqfxdzN7Y4q6yoDYZ", + "secret": "dd8a0861ba597070c6d3b43be005e764dd2960bd12ba86baaec4c914132eff60", + "public": "03b046f7c69dee941ebdd54498386338bc2378ae983c9d6b949e3019205dcc7be6" + }, + { + "address": "21vVXWwfSgmhVjMZKzRqQphhHWJhQN9PDmy", + "secret": "29d4bc0900ad68a07c4d4678f9b75155fd06aae8d8c96637a75cce4f2cb332ed", + "public": "029b294458e653d166fddc0f96898b19b74b7ef9f5372c722ac159dcdd7a633557" + }, + { + "address": "HPju6EpzFnWijK4YF2PKhGw36zpC5MTPqc", + "secret": "c1a77068a552a8183a634ee9aa117b21cb9c9d3d71bf885f747cf45a109f3bb9", + "public": "03b13f40cb83bc0fe2386b36ce0fa0c4426ebe68cca13d969951e019539aaa67dc" + }, + { + "address": "B4X6nsN8LUFZnyzPU3xuVJvJseVy5QFywn", + "secret": "5eb166ba3ca4da3353078eca2ca23fda60698388b37f860456a84a1317c669d5", + "public": "020d49986dc4f72bbf500b1d334570fbe96938b51b659f2628f51f65a8211e3afc" + }, + { + "address": "rA8hZGYDhU6mpYdXvwJwdMkCijiGHxGG22", + "secret": "d8e8829f9729315b9ba98dc56e4aad0e85464b9f6bbb4728f705c1c40414177c", + "public": "022764a5135d53da5c995b93ec79259ad4895d0252f61020f9244914957ec4e67b" + }, + { + "address": "fHnsaH3e5F4iMSAaRBFdDvNuEXWMiG4h6z", + "secret": "01897cda7e654eaa1204a88bdd0cc1a3c97ead4a56d5fdf0392bea2e5e188146", + "public": "03f1ff4bbe86bcd2b9a352f886df871b09b2cdd0820db6ec12473a620e3ab40cab" + }, + { + "address": "NpcgbvncaoAW2TZDbLvA3SgRBKGKjFBnss", + "secret": "afc18ea7580c9563bac4fad5408e27bed5fa5c3b48f72b71de3771e4f4daa9e5", + "public": "02401f34ac31518444750a1aec8aebbb98396a788bcee54235c62cc8c7f1855d38" + }, + { + "address": "7mZibtJzH5BV7nTsk2L2E8ybPJQzXgsjjY", + "secret": "4f8468222e72f899d3eca4bb752e46338430df815ff32dbea405077a970a42a3", + "public": "033c5e16a1857eb18cbdaa0760defc375c11c7a990f22947b32f603127fe8fec81" + }, + { + "address": "rTrV5jQZ1116ubbxqTD3r9VVgd9bRausbm", + "secret": "f26dfd8767fe4f2d99a006b20dcc1b760a1784e11469f601e33da7413006721d", + "public": "02d53189e1719326ca40f472c452f18bcf499f2eec21e11f39c366ba3cd1693f4d" + }, + { + "address": "2HCBvVq4Z7rsJ7o3NdRGoG2DT1KZ5EinoD7", + "secret": "02a404e6b1ef80a48f9339deab225c0ded0b6a80d26b28746e1292ab01413a14", + "public": "025318a298154019bda73f131fde9878ec04832efb78369cf1fc90d2c3a6da74f0" + }, + { + "address": "2RUhPZhqiAoSiEYBrymsdAJ6t5VkEVV8sTc", + "secret": "4557c781294d893b66792f88bd6c7557ed85bc471d735b0cdaaa9e070dab173f", + "public": "02e2dd3b4e6ba39a59977a0ea678293255b3bc7d29351f0ec053c203a778dcefe2" + }, + { + "address": "Avk4QuxAyeFr7VtchVebEY6Raz4uRs4UZM", + "secret": "c73eb18af7efe89e31f452d912719611f8cab5872fa2d66c61ff376cf57fc9fc", + "public": "03907b52c063332d80a3aa3b9824c2a1873e966caee5a05c495487cd4bd30d2662" + }, + { + "address": "MGgcz3urE7CCqBm7BrUyiv5YgSkzM1zmAk", + "secret": "7ba7d4ae04765fe5f69d8e1072b22dc2bd5d8e89fc7ea9177e51e7407cb80324", + "public": "023ef86e43a831ed5ea3faa6c0b6c92ef447ead071c32085ba186b615af3e7849f" + }, + { + "address": "2MYqwgpjcM4KooQG5kPE7nqicqqma8TPoQH", + "secret": "5a26e22f142054c7e91ac5de6e257d341a66dea9b377f5a1524e8733909061be", + "public": "033956c4733f9983bb70877076e9a16da0a3192bb6412fe7285048f1efba2a835d" + }, + { + "address": "ae8Ah32GU21Jk2K8ryWB3xdcyBmLZT7Gob", + "secret": "1831d4b0c420224c83020eb30671836d8722e752619e8bbfff631ef4f4d229fb", + "public": "03b88178014789d21bc222e02cd802496baac40ad729b0183fb2da47d6b0bdf879" + }, + { + "address": "Hft6JuhuFhKpQmCteJp4y63GHadLWbtP5m", + "secret": "815d2fdde17cdf80623cb0e4798553f929b247b79faea9cde29cb213be378b56", + "public": "02fb184a0fa61e856f1c3e6324ed6089fe81e211bfc1ab746c89d4962b4ffe525a" + }, + { + "address": "dNwZxggozhUJ9Kvfm3ArnH2KDVFi6gkG9z", + "secret": "9547add3c5808753234603f06a90dbee06728be93345d74c6e1a5639341053f0", + "public": "03ba596f4f81a2b4033a557175e9fff808ea41804ebdfb2583bbb7807c1a7242d8" + }, + { + "address": "2LBqp8gpoo7V5Am7ExiaycspCkzwDybmCus", + "secret": "2fefb1881c3102faaa2105597a139f601105fb705f2a7c7a23e12049507b9236", + "public": "035421fe09128dbccb1bb951847800525cfd979006482a0576f3db7983f005b9b9" + }, + { + "address": "CNoWEhb8kKXFWESa5vyqkpnEm37owGLncC", + "secret": "3afab960a2d0fc16cc418946397251ada6243348bfb8cda133157e1932e519e9", + "public": "03e8f8a2ba639a925de7f93538838b6530b68ef53a7ebdafdc399b1e2e6066088e" + }, + { + "address": "2jSnuGTDS7fbkfgwjkNErXGyz4Xx8hNT5CX", + "secret": "7c124e22cba0f682a2a2a94144adf670f8e5c09228decab2a1cf531ffa59f82c", + "public": "03f88d2c546d56f7034fdd597f6e2c6cb1c00d54d69b605e3d0bb02b743bd9159b" + }, + { + "address": "BK1sByWwm6ZyCFvt1MYCnuhutEEoVKm1sL", + "secret": "51607221de3b4eede57796c66a418200535af5af75b73b8d48d47effa0d08e9c", + "public": "03efb377e6ee222a37a0d7f73be09a25947c5afc5b0aba90138344b44dce8e11c0" + }, + { + "address": "zmQok3As5KxobevD9YvReWkQDGC6AVNExn", + "secret": "f121104cd3d4fa345efd445fb8a39f52dec4a01d9948805dbe2fb2d8dd1153a0", + "public": "03997df1f0d27b539122782b6612529fdbef763de2ec3142844953b7f1fd91a254" + }, + { + "address": "JGRc5N3eEWYhasHmjWpiQ8RqFEQHFsgVev", + "secret": "efe5cb99efa43af9966268472eb5f2836af65d1878e12b3483dee1cd7f5ee967", + "public": "02d3cddc6ceb7eb6bc94244760b1b80e0fd8d32653c762a046f07379473e7a069b" + }, + { + "address": "5yDKACKJgXGeMLTJoT9Ak8GMKQrMuZtAXX", + "secret": "311d2ac25e2e93b75e4b221744a0544cd2c61cbed0f2ae9f2d1b96fb685de826", + "public": "03a460ee0fa4ae57cece255da2d237b155ef36add87596945c45ee399d9d092a61" + }, + { + "address": "Qt4eK48vohSAe9KL1VguDCdTsRbwqm4Nxi", + "secret": "65e4f0874bed373e927927bcf2c4a0b3695d623dcd9b82699a23e090f4d695ff", + "public": "03cdb9a9ca9e32fa1c21f45f97951d2e86d5801800f0e199a171a5932c46ee59d0" + }, + { + "address": "oDydBKTwxrA5SG8BRXkjgC8p8bCLCKX7CB", + "secret": "532b52c6afc906733f9a8d54f571bb46f8236aedbf99950f9441fd66195869e7", + "public": "033a17e3b255c31d2c462612cf55c7822b462072823c7aebd64d758013eb321ef8" + }, + { + "address": "2mtd6hKNAebgEXs3MKLUZj2Hbw98B6RWVJu", + "secret": "1d5df1bf4861aca59db4601886abf9c14215bb47dd498328d0854f5958e2cd52", + "public": "0217ffc7084bdd74bc7c512251ae2b6875d6dad5e519d6d91a39e9cec457b77b58" + }, + { + "address": "SnSBaGjufieLSyi193EDTNP2nqS3CRuEDr", + "secret": "f22dd87c70e283100b42adafc2d766153ed090247dcd909894e9340b35926464", + "public": "031d9e9e4e86b10f0a32a6af86dfd4c0ab8c1e18e1a2410a3abfbcdc6fa54d74f9" + }, + { + "address": "aBbez48E247uZMtn4vQVCFkac8iuuJZXu3", + "secret": "cd5ccab9036554e4d7d5124393ca441e115d3b681543c1ae0e09e8cdce38ccc8", + "public": "022c1a6fcad7a9a2ae3a66dc2802482f028dcf9e156377de508592b6ddabc84a4a" + }, + { + "address": "RY9YMTk1PavUEQNbdqyVHdNNVPDDQvisys", + "secret": "7ce9cc17a56b261615d768361a89bd287ea24f845267e5cc5fdd8f8d492e5cf1", + "public": "030ff1f4d7abb8780198d610d84a21bddc57cbea7625b43eab90a612f5e360345f" + }, + { + "address": "YVjTfb8TGxDRfXCnqNmZj9WocQ8t48bXid", + "secret": "94594f06051e8d60e315dd05dc7efdd99b033bb01071a48f2c4f0c5d14bfdeb6", + "public": "036d46388cb90f08c49d8c58ceb89b9713f9f28d5e40fc6ebeca7d1ffb628a3b93" + }, + { + "address": "4y2U1dJwDgL17A919tqmjqEfzXqMN1sfJr", + "secret": "0d845f4f5b6fef53b40bfd07d7175881f96cf26861a298c96d1310969174e9d0", + "public": "0349290922a67e016f3fa308f0a7dbb151b1f86f19be4cbcab6ba870b5075f1fb7" + }, + { + "address": "NcapPnAXXQbKGRrxGi83uJJLb5vk2VaRT5", + "secret": "183ceb7edab8ee4a5aa307f66f3cf7a55f1e271f8064e0ed74f2390a954c9005", + "public": "02977fcd738a85253b58b7a2ef2ff36d47a5b3a6aa1aa343bf6bf62954b878b9ed" + }, + { + "address": "D8PPZ13Ex6wr5Mn64RRBorPcQnfGYYrpHo", + "secret": "8f619639b6eb91aedd1213d9581e1651fe0b564ddf7a2623cfed817c8c181da6", + "public": "02d41cdbdb8785fd538e887f82752fbef97efc94669001849fae65fc1d68f84f52" + }, + { + "address": "2d4fGA1RtyybodYc3q7sMiKX1BrznHP53Px", + "secret": "c7eea265a0472d0de21010f87c0db5a88b7f6bbccbb7b2fc89f12bd9198d9f80", + "public": "03b0599b68daa9ec4c330d840517d041f638dcae1ca8cb93bad5c2e83db2a6010b" + }, + { + "address": "vaeR4TDLoUiYzJULM7FByv9owEKMkX5cG4", + "secret": "e27f88009bf53b0253ebfeec1c5cfa3831041a6a977a0a1fbaeebcfa3b515ff0", + "public": "0394fbf78b5909af228443f95e3bba853e1669a17e328314e27906637ee3e879c5" + }, + { + "address": "HHiby3rggQqcvcMWey7B2FFAwn4UPQSsky", + "secret": "0e513ab67bc9eae469626faee07dcdc95d886feee2dba72160cd824dbdcb002f", + "public": "025ac4561cbd4acecd25d95e09d1c0df88f3f181120be234cb182e4c6422090172" + }, + { + "address": "DRbn4e9kumeadJD6bx5Zwc9hJR33pCJ3Eu", + "secret": "e1a3e5b5f6378bbac69f4c851aba44d5508b6879ae173ed538a7f58eee98c005", + "public": "03b2ec20a6bc7089b22e02f3877648ae92d6a961cbb0764264aff9635cb9b8bc66" + }, + { + "address": "eF2QTjnUujZiyEReWFFtgCcF78bseuf2uR", + "secret": "5f9ac6bf76829a442c2e524d424fb91123e2afc9520df6fdeb9fa7985c017e9b", + "public": "021bc1cd131c269c4413aa235851449bf66d433ad2f7a6abe426f3d4251a38b4e3" + }, + { + "address": "GpdAHSAGjNBLy7f35PSgQd8fvmCYBWDS8k", + "secret": "18fe04699878a57546523dc3076b1c47d63bdb091eeefb2839eec162619fc1d7", + "public": "025d0f942436a465d4f027c00652717f6b77a09485ae5631a7cb0c7c0ac3edb40b" + }, + { + "address": "2epTtuKgNH7hzfbFV6QNSzEvP9vv2uUpfnT", + "secret": "c8755985ea031954c0501c048d8950c35685577cd543adc214c03437af59cf20", + "public": "03c88abdb994b24ea489bda4ab140e4c5cd9fadb95d395a11fb99fe7e790bbc4c0" + }, + { + "address": "2Qpz4d9HZzb1uaeN5uyjDonR3MR1f5v4qjV", + "secret": "b8ea20e202b9e411ab47c6da122aa0d2b2953567d61a99471a4ce66518bcb8be", + "public": "025c77a070003120f1af15aa42ae9740b44abe229ea7250b77eb1ba0033220a9d2" + }, + { + "address": "2iG4Fs82QP6WxCxayVbTfmoTH4M4N7Lvos9", + "secret": "9fcb5c59bf38c087b0e427e6c10db9990056b65560b79402e1fce98f14652cd3", + "public": "031d315e2eb87ee8032dd461a5485876c1139a9c28c7e624cea4a3649f8aef35ec" + }, + { + "address": "2NKE64LsSB77PCUPud1heKa8xmjadonV3SU", + "secret": "9b05f64e513868d2388c06a9ad974146a2b036a40910f9ddab77a9d75c11a751", + "public": "03adfe42ccd50b9577fa7620945d72c70a5b096d6c97d0b6fe3a3f25a4fad56f6f" + }, + { + "address": "Aezo2HdLAbaoZguPpszC9ZUxhmJHmAFnfT", + "secret": "c4a375cc88e1b0164a8a6e1d02d309312e256f84b18ea085d31806a1268c98cd", + "public": "03bc9e850dd82d2171f821fe8eeb98497dc0d3864544099ed2df96d26afa407e30" + }, + { + "address": "rhhySrhPyMSZ9DxDHFrHR7ktnEu7AkqB4K", + "secret": "0c41ee6da35751a7dbaca48f0634f69ddc5b69d2586093a1047011cbf10cfde7", + "public": "03b1952ff8bcfd8d1febcd8876e11212108860879eec9e05d8f985951861df81b1" + }, + { + "address": "bxfcnYtu2tJU23uVKmw9qV9CffuN2Lzvu9", + "secret": "a999df119d86f4a42617d53bad1a7536c5241d9bf63600a9d4245f07df3d3bd3", + "public": "0350e14e6de722e11f27ccb942e2a564738748a4678213a640ba3d3af0083f1f92" + }, + { + "address": "2m8ndBh1iPqPNBNGJe9vd5gThJ45KzTz4Fd", + "secret": "0523f1e4e57c30371b7f7b7f89f47ee9bb4d2d177c57da5a28d25ebd7ce71a46", + "public": "02e8a36d23ea250088c113d0b6f41ed40d22c3cff4ca3356f50637eb020088aa43" + }, + { + "address": "PHXhq5ArUzYZJSJ8PiBSUj4ef2sc4zEtW4", + "secret": "afc892144fd61f4c3ad6c1cbc493c317ed007dc43fc414f73a380f08697303a8", + "public": "037ffedafde38ebc382fd26c61622a258a1ed18d2f7a0587a5c37a93b6e48e0f96" + }, + { + "address": "2WCPdhx6QR9RxRxDntTG6iZa1as2ja6btJR", + "secret": "1818a34ac2b005aa1f3f259dc16d189620f76515a3528985766761fe9198c53d", + "public": "027fee0b90497183521704f2929cded0adb3cf7123fc17b929e9de3a45d9927833" + }, + { + "address": "2bFrdk6bqR8FLQ6kYF4UPgnVjs2mF1DsfoS", + "secret": "f5c7bd0bd1853186cdf8a529d904f1916076880a1c5cd4a828730674a09817f2", + "public": "02c4e443c03b8c12e140ab0270fc0c67a144144e3dcd02963e107facc5dac5e428" + }, + { + "address": "2cwNZy4SWDT1zX5uJesdCKU2fFKjrcmpzvL", + "secret": "38296af1206f02b7650d5be42b8533ef5870c54c146c39239beabf6d500218e4", + "public": "0290aaa6866d979208b6a7ac2984015813ed4ec47f6a9ac49cc032fbc16b4533f3" + }, + { + "address": "2bwm9u7aGPMc7pfmHezfhLFabAuH7H6EBTx", + "secret": "c98a3735e47a9c498dabae93f8b40683619eb1a37756e3b786b2d40dd001d7be", + "public": "03b9f0815dd914ef4e71caba76a11cfa41fc8d7063038b337a9c600c9a36273822" + }, + { + "address": "d4i4nQXJnoPiyPXnBFobXGM7nFqR7kJNZe", + "secret": "e3ed12b80054877ae1d5d9ca1be4dfc483d5ad4b44dffb14b331e9b8c07acae0", + "public": "02317c1f881a8f39c9987cf6daa3c8887ca03d91b3bd5f915d3dd3c8eb7dc90c29" + }, + { + "address": "2H9VJjLXy8nugAdyLLCRSJi1dwRx8oWxFaU", + "secret": "e296d63f3558df4bd455a9850bd9420e2ac5f3bd2cbf8de148a14369705370a6", + "public": "03b4fec118a0e5409f5c7ae65462f56d5f40f477b0227083f238f49b9f90f8f70b" + }, + { + "address": "2Mvc6WgBeU4p7QKaDbKPspwfNvTbncAY5Et", + "secret": "20dd7688888654a5f214bee8d411c5635e0be8c8b13d9ea4719521959e65840f", + "public": "020993b1c2fb2e251064b1c53bcd1e5f18e7f7b5b845d8fca619ff5654de57bab6" + }, + { + "address": "2UjjeJqwrL8zhL9hiQHsfyQS1ACo7oQQnsE", + "secret": "8dad55ff69be245c2f6714dd514338118b4e18f4743b65c1a318b8ae8acafae4", + "public": "0294b9b8baa6b0f15f00f707a02c5f4002074bd9461982c6153b87573c7e2176ec" + }, + { + "address": "2N5b3ujSAFtGPbAVvZ5PSMtirXPAGxXDbzm", + "secret": "0c878e067cb6dbecf3af796ea802d685a6bd463f24b84a3ef973797596081e52", + "public": "033df20062b208d521babdbc6105e65e02f40283132af33fea83aaf1e41b9a5c23" + }, + { + "address": "2LD16WXviY1JcFLL3Zz1Amcb4NPhMAzeqCB", + "secret": "aa9f09e643003c1227741d2c7c031d84cc4bc78269e988576a1e96ad94ab7baf", + "public": "037f33fdad8e27e15217a7c5a9b9ad7072439ee03176fd747c16a240938fe855dd" + }, + { + "address": "NRA6Li4MRknBbKaNEhRoxkP8g6r94r2Gnm", + "secret": "4c44a49639f2885c2e2897a98a4d1135255a8a5fcfd17cec0f452571f547d7f0", + "public": "0334f64e4c6af2e283a7a994132ac8d6f652b1de0442540028c168e36007c998ac" + }, + { + "address": "2hnM4BQEaaNjdyGDcRe5yRVXE9i3oLDUxY2", + "secret": "fc1b2dd7770ff800de4fee7eb01ec6c06499939dd9c4ae6ac51047dc803f177d", + "public": "036c44f8a8ba59edcccf49a6dee7d22ddda61272fff258ba19614a529768105dc9" + }, + { + "address": "LZh8LgTSoTo1YgRpSkh5etREEyFgkLtQyh", + "secret": "08d6246e2b3ae9ead57557f64d369507f2c6de10823864c33b68ab824229b7a0", + "public": "038f5db7aef3d2086f0e4f5fa6fb84057b8a7ad37eff06ee446911a385fd8197f1" + }, + { + "address": "KGToyy5gNPmoSxM4hUu4HDYjEVEv7kf7xQ", + "secret": "ad4a60e329f80e0b3ed882b9497f5078f61e15168c92181c4cf6c86142cabfd2", + "public": "036e48c7dd1294354ec1181c1c41f55211c5c27069fa98c2c192c1fb6f1095fc23" + }, + { + "address": "2eVWTrgYXbDZnke76xyAFdFZeRWykNf8SFx", + "secret": "3e2680dc4b231fe0c8f51b8a2c134b1fbde1f03ef8967011c1eac2054f65c741", + "public": "03c40c4d319aecf727e8b79e8b5dd2bba74d2d97d8da3486bf0e7df85458c3e7ab" + }, + { + "address": "EXeNXEayVMot8oAPsa4moaMyZ7ZqTNHdKN", + "secret": "bb4b593aac3b8938757e975b5f2f1ea203d56d4072c53e80f9b605ab35a70d55", + "public": "037a7744437290765a6024781596087b7554387227430c1feb5829879d242e3409" + }, + { + "address": "2Vt7Jv3tRKuTKu3H7eBffotFssGtcmxeUGG", + "secret": "5c6e8086199ecec957180e2bc5ddc894f91cb2ff118f10815358766dd6ce03d7", + "public": "0227df153973f5468a6b601b0aec4bf6c4f50ad3293b705d47fbc767dfe112cfdc" + }, + { + "address": "2anB6NqHTEP4MZ1kBf25m1AoZPaF5HCRNf2", + "secret": "f458a9a6f1345679295b52660daaab2e6c2ddfd9eec96de1309d29b8645de564", + "public": "030651edf0fa34aa2a8bd48f55304c30fa3156636ab22b72978fa2ede9c035238d" + }, + { + "address": "2MR9xtMD2fVReBmXauYAomuaMgjvgnuBzit", + "secret": "97150bc09d496aac364d1e9dd497a082b8671d47c1fa3479f55131bcdbdd9e02", + "public": "02ff32925ac8e230d9652d112b61908ae00ced09d71b9353bfa8eba16c328e772d" + }, + { + "address": "2iRSWoCyw9nNSkcWzV1ntHZDzq4g5d7EjpM", + "secret": "4d60df4c11698ccd0ee61e1df48016f37bf4f2f5bb14518003b1d69b1397bcd5", + "public": "03907ffdf7c2ce2d673625e03967b9bb40b5ecdee8143f92a61bc5f8e46cafeaa1" + }, + { + "address": "Up9XUznLumQuJ6waAJAYCCvFimKkStGJ8", + "secret": "5519a06420ba5c073901876d3b1f11a9fb8b5be9766e0f05c025e525fc0a1ab2", + "public": "022463fb3a5fc5a850c12fa1da8a7c6b23f604a60136600234ea6a5ce7224e0735" + }, + { + "address": "2LQzzLF1wzgXVJGfrJwbj8fbCCKHsYPcpdk", + "secret": "ee48e87aa610c69d99b3257bcc5359730d16e6afc06b9b9a9757c277c0c94c47", + "public": "02da4067d72fe2d00b13d22843fac5d8b6153eed2cbed55810c22416906f7072b0" + }, + { + "address": "LKziTaWPqm1mqcuuFy25uk3nPgjQCeKpG9", + "secret": "6222fdf0802f55ca91e656fe74408245aa477486acc16a1dff9bec220f26c3c1", + "public": "023298ce81f51ba19e8b93442cdebb4d34c5d25e82ed9cf89da090a6919bac92a4" + }, + { + "address": "2KJ5NEvapzdghqB7b8gVdU9eaYMk5Tgy2Me", + "secret": "6aa4dc4a06ef5063e3ebc083430def90f28cd90a05b13ce4ccbff29661340547", + "public": "0391782a7b3a5d8d2b34f7d2d0220a8471c1bf049ec51ea87712ba8f24a735f0fc" + }, + { + "address": "wteD4LYHyxZSBfnaik89dbELxBWoQubkB7", + "secret": "03f083aced4af42b6aab54b7aa648825fbee5fe9b5b6c61535e9f6017142e256", + "public": "027c3406cfff5e4af70371660b31bc6cacca686299f24eb69becbdf30c991c8510" + }, + { + "address": "2L1CsK1CdeAG7tkwa27y5QVkHPLxzizcdTC", + "secret": "c92dbefc11b3067762d632b5c0dfb335de6503ec5611599a98021ffccc72f3e4", + "public": "03910aaf182abbfb2cab0b137c90c2069451858ba4178f8e3b37ef395514581943" + }, + { + "address": "2Hba4NtNTJNhCPbbPTgiXNf7zGiuN22WDhC", + "secret": "9ee66eee2ed4f0025c5f83e6042eebe189eaa46bfe6f6670bc0b32400cc46e98", + "public": "03fac3efccaad9eb1302982d97e76d0b675752e98f37d7b6bbf7a014bfa373a292" + }, + { + "address": "Fct5xp4TiAfoVj53FsVgz2Xvfu3VoSoGwh", + "secret": "68533cfb6e102c1218d07c468bc0111e378ee524438c7493f0c6599280885cff", + "public": "034f00bfef452bdbdcdd0c55cf0e328acd67c9769dff7c8097f968734598c512d9" + }, + { + "address": "22n8VjKLqCBWMBrsmorJL4LwN3tezm5gEmS", + "secret": "4412597ea62ba47aa723023684be9f579628c79c40df98b139400304c4b32429", + "public": "037334c374d9ab761d5d9b738b07a48434444156f3fe293f222ee621615a008cd0" + }, + { + "address": "ZpBxiDKig7YMP4kpb26aGHyL2smaebcEHr", + "secret": "d941ba613cdc2b87609c336d2063bf612e540875a4dc904ea4e63d9db4210650", + "public": "036c7bc521bf8a4700a2629a0643dcd1d157959284aed13b74339a0006357838df" + }, + { + "address": "2P6fGBjKESXhkpCPmij9e6A1NerU2ryy3xV", + "secret": "5a6082c021c71535cacc07a5df04fc0e8a6eacebbdbd454ebeec87be95309c7f", + "public": "03c981d0bc997b4ab838a0f2009fa4e3211b2073b4b15a12a711ded2895bd69f9d" + }, + { + "address": "gByzB6sPJ7RmVpk1md1sXm6HLGKU8knjWi", + "secret": "e4f6298b83374823d72aa3796d7a4054a669c377090f61d1a11521390ce56745", + "public": "0227e1fd95615063c435c4f9ebe82c2d5dea86491c8b412d60b56a7e48bfbd9a4a" + }, + { + "address": "CwbKzRpBo1KMi4hrBBhQpfRbYqp4V8Zbf4", + "secret": "688f61a4f695771ec1bc1329c86d057b551cf5aff926b184be538846483028ce", + "public": "03407a7bf3e89de64044ff4d28d289a54651c3320edf98640dfa479501b5c67de3" + }, + { + "address": "HvvEsysCjqffVAu4YWubvfv5yYYzf57Vnw", + "secret": "08b6180067c0e32854776a2b70c226abc9bccbb9c03b718ebfe625563d139d4a", + "public": "03015c8f13f0029cd5f666211955f1a1208735844256cf32ca32486853175c2abb" + }, + { + "address": "nVyEuvxiTYTzN6QqcmRj9wU17fHMa4VJta", + "secret": "98bb4aea9cdc25f26e9ea16f0c17f171fc2b52645c25c72ebc02e2be0b561b86", + "public": "03b557c6cdb5bf376a38d06f53450b3fd5a9925e73f1c3ce03daf7702f98040621" + }, + { + "address": "2Swcj8nQBcNTtpExUnDLxhfYuvgo1ZPzX2N", + "secret": "c3f23a6efd8d79499b054bf933460d843aa62ff66dfdaf69306ad92ceb0b63f8", + "public": "0256bee55434ce76ae429e74b63cf7c3c7961bb1c702203200f08ab063f1f895dc" + }, + { + "address": "fYMS9Gw91GaQcUNS8yCSVR8aWXC7RCJ79H", + "secret": "64ef7e0063f803ec119a6afc327c4a4df9d196ecec2deac3e4c64b418a72fb79", + "public": "02ac29f3444911103ce467990640372b23c2f1a98e8495e193ac576686eeee6948" + }, + { + "address": "AsNPg1CrLTFKNa1vviV5HkMJSZ38NXvVev", + "secret": "68d3bec66658ca2f4723d3c514a3ff65cab561e75e694204849b5c1b4733def2", + "public": "03c8d03e195092d202c6f75bd17c26d30c9841df9266a450e5a153bbb85951c2a8" + }, + { + "address": "uomhwkEj2mEc9JNvZTFpufDuxpornqcLr4", + "secret": "b0b2c25646387fad2336a3abd66d20fc7fd261b5a776e4e510e46975d5678034", + "public": "02047af97b315e20bb41c74427bf67feb838eca34bd82d8a1a78631c6450409a36" + }, + { + "address": "288trEspbRwW1NXhMUG6zSMmn1z1Yupss7K", + "secret": "248d74d293a4689cb6a0160b4d3368b4ed8dd7a850587b3b23d069ea1e61039b", + "public": "03b65684d345fb8b319d50f4cffb672e9fd2ef99cbabf8ed13db898a1b40c2eb54" + }, + { + "address": "mC5F53X8PeJTqw8C8oAmbG6AcYA7zHTpWv", + "secret": "f88ee9fd93b3ef3bbc3e0abc31c0e14132079f91877bf27fc45fc612a11c8d04", + "public": "02ffacc6e508e69889db4b3df93b5c04f9ee20655bca13c0c76ae7d442d9a824a2" + }, + { + "address": "2N9TR5jDQWfSPvf2UTneWTTPzAzGixTUbxt", + "secret": "4e8e791dd29ea7842d682b42a7e1236be9c787706dd5f130de9b2262f4aac59b", + "public": "03e1288e0f91cc983220bbde8a8eedcf82e0727670fe746d54ccad7aad336919ee" + }, + { + "address": "xQZoBgh6s3YEkaWxJcBJJj1caCqEr3qs18", + "secret": "09e91887df03369c64df32b6c05c19d4eab03760c6949586173b8df7f55e5528", + "public": "026e4ee5352bd39ed09ccc6b4f1f6893b450b6c554680277af3127d66925aa29ff" + }, + { + "address": "o1DeUpx1vAjsgz6xwdHQmjpVPsmaeArGYy", + "secret": "eb76ba401eb1ce6f42a8a9b24766f98add7e717c96197b79806c5ae08c7fc36f", + "public": "03a5931787aa1f2e1bc5f03c160b1e72c42f00cc8ed5a6f78181ae26cf016699f4" + }, + { + "address": "26uyax1suGxdRZ7gJUjFKH3t8ptAnB3f1Ab", + "secret": "42b0c6d8afdc6c266e6afd7feec00f6fbc4298bf4b3e63e2c20a29c736b7ee3e", + "public": "02be4b56afdba2426151e542100fdb523271e8d0ca4fff3dde46a5ef90a2010bed" + }, + { + "address": "2GYqEYdWH4wd3aeCxWnAXAVBvfMiYL1rRpk", + "secret": "8662f1b8d3ca64d2eb00eebe3e245e99054d4bcb67d8bf7aad5f928516885e09", + "public": "0307c321ea95fd65d2e6b3985155d0d9899b6818bd7892347ffe8c261862da2b23" + }, + { + "address": "Xp5R1dYx4haxYjmZDpjBTUaGAqYTU6jRtP", + "secret": "f5c6a132ec483f08b48d7965fa5c034a26247f1e55d77e6dc4ebccc781902680", + "public": "03245b41ed7ac350d9993fa89a6afddaf52d61244229a8b89c653af757054b9516" + }, + { + "address": "ZLwQzFUw75sbsMWTLS8H9jA2m3czji6hop", + "secret": "1f05950172c640ab56ec5752c11139569f7c76736f00b94b397cad2c4f4977c8", + "public": "03b8b5bc8dd2c640e69c5f88c98f6ac0bed85f8119409147e7638b80c3931a2313" + }, + { + "address": "mLP32Fyc39JZxnvp2ZsEDK2xVKUv4YSQ49", + "secret": "8d74584cca5c9941d4306ed7061a4d5632546d22635f0aaf54fabf4081078c10", + "public": "03bca03957963890c237254b7a6293d398df43f275d1705d9d2ee81dcad889163e" + }, + { + "address": "9H2rHSAsnEPey7Q9reVfQjFcn6HeuA6nZU", + "secret": "f57f5c41a54b051c24195e9fda9e17c69ada46354ad0e100358db1153c15219c", + "public": "0294cac47535ba46b16380074e5a20b2e106eda46ef58d8588b34ffdda2b649753" + }, + { + "address": "RWeWyPo5jMW3RTQZhi4umoomc26asiQg71", + "secret": "3dcce71b3d62e7e9d60a8b0a7e7db415d2f29dabbbf9a90d9e4d028f5a2526d5", + "public": "0255f81c8260bb65c55b53ad5fcacfe14542dbb1478230bfc465f74d35f63d2ef7" + }, + { + "address": "489PcrGj1QQtFvdnrLYpabE99gVhK7CZDb", + "secret": "25e23bc3379bb160ee17faeb169d5b10e378cd4ff0c241ea47639d5ca5e3393b", + "public": "02351b30079c2adcc588fd1c50a68ca4c6b217129f0605f35057668eaf8528563b" + }, + { + "address": "fvAjpa6JpTXEEbuDLVd7fbaxyRpS97a35S", + "secret": "52724a60664d7b0d1b3f463324910c2b1924450be5b05e8d7a2db4bc53d453eb", + "public": "0209f0eb2cf37d24b74f01d385e77200d75e5ee67b2977c578443c8310fb9b2d7a" + }, + { + "address": "ZCV1g67KVwHfSGNfafFSSQBUHYeERkPNas", + "secret": "d6a7110de3a1ad13e9c01390c665810a596d8c6d1d4941532b32260b6defe285", + "public": "03b765ba10a5e030c8da62982214f549120fe18358f18f60855325939adad24c4e" + }, + { + "address": "2UQ9bjUN8YBtaLZrXFoFgdEz6H3PqfQRPnJ", + "secret": "8312de52989274e63b461bcd89cf9341b8014d3324892b8424146f3538e2ee27", + "public": "0318382d608f7da849b65e058db3afa32136f3b893f90b678001f0241a196ab325" + }, + { + "address": "2MdhNzpmAJxHnHBqsGmvSJVLzVYmMiX2qVq", + "secret": "fe3cd4f2731045ae184501ce477eb7745300158369ee44c3fdf5a87a2d5b8952", + "public": "039c452532ea6ca6af3eb68772172d42778c090cd199ba3e7009c06b0cb6c51b1f" + }, + { + "address": "816Gwzyu248U21D6f46r75pnVuv3AtHWrF", + "secret": "a71958850157ca5af9430ac1f7150f12970a3e5cc49f2b2f0b250f7262ee657e", + "public": "023385b52bd7cb2b0e5a749b59f1402237ddc355258a36011e03b860679e4b2728" + }, + { + "address": "NKYP3ZvpAa6ad2SvENi6T5HKwHeLbrVYT4", + "secret": "01ca13b25a13f4fc7d4712b11861bba3d213e4ccb65d06e0572cdc7d14ce15a6", + "public": "02b313de4985803a1d054804fba3e723f88e64c6a2ec7fbe44303d1c4652c98c3c" + }, + { + "address": "2VjJfmxYideGu2ypmZJfLJZhVv3yxYED7of", + "secret": "f58e7c75269761d1cbd1c9c034afb754434f05f327e291ba96ca8ed727caa66e", + "public": "02be84a327e37a6d8267bc626c38bed05d2950e2ca1e4349905704f7f5c404ebeb" + }, + { + "address": "eAPpk64h74tsYepanFtSFzPzr82B2avcDT", + "secret": "7a0d7756af1ceb796d4aa202b10dd626bae3b530b714a3c90e075a2f0e301ab1", + "public": "0280324942ed3da9244cc0fec7fc32240792529d313e565c5f7cc8fb3dd38f453e" + }, + { + "address": "dT9rzRU52tZEUGohPpibWgGwZHSe7H5xjG", + "secret": "39b16997962b2a8749203fc137aaa5bc3ed17f0202f6e7965a60c2dd7302f4b2", + "public": "02c35a4dc1a33451a49ff10a38cf2e040054d775df92749f98c220d9665de0d3b4" + }, + { + "address": "2NJ6w1Q7oKUnLPZ4rkdFqxoSXSh7jPdkPMg", + "secret": "cfb00a95d0bfbb4a1f2f5fbaab246b537ce130006f503dd3ed6108cb2f6fc25e", + "public": "03628ab3111affac3e804cca531c6392f25cb9accad0bc3439bc3fa3396c075756" + }, + { + "address": "sdrAWYjVrewkKMcpmxvcfS8NpFVoz8mQta", + "secret": "122f3a66ae026891431a535ecd4a7ce87b766b36ee06cc982bae63d55b48840d", + "public": "03856a4861a9d5d1d0dcbce11fccfd15b14e621965577d7f84ad44a008a3a82488" + }, + { + "address": "AtpEoDv9QzZ1msqRpS67AfKmNUYMdZqtWR", + "secret": "ad22f66b3f09fe8150b318dc2bf070c0e994a7a303eea67e5c784dc91cf93781", + "public": "03c43d4d1115804698e7f1e154b93537c91a61e579044682385b38abf606fc13f3" + }, + { + "address": "2RJsEraWYadfeoBhfJrBrvidi3u9VxTYpow", + "secret": "828c57ebac860ef0f55510655de61e642aa329bd0ef90a0a407ad88a4cdb6c2f", + "public": "0200ba05a1798468845e97875530a31317ed9a428393f972f4f0bad6786cb77d77" + }, + { + "address": "8hjVBQTV9x3eL7MRXgqV9UM64rYur64iJt", + "secret": "202190f9d8a5adbc1ba486df7f076fba0338440a97595a88c49c870e4f1cc39b", + "public": "02d25d29264dab7b03d48aa58091d249de7ce2ccad2db54bf18949bf19b2c9eb05" + }, + { + "address": "PEq6dSumPciu9yo98jMQdHQ8msF2JbfnXc", + "secret": "fb4a81bfb954ec7bdc5f6c6ccb2bc18d00428be1a64ad095154939ea8d945449", + "public": "02fc4697cb9d1a8c364b685342894127d162ef5d7a3b7b9b26a0d9931247a4d549" + }, + { + "address": "2VV5BMupLapDN23JrhZu1rbS97zcYBbqkgU", + "secret": "6970bfcd764f98f6095604f78a59ede3b079fdc7b9b369c28617405def807d85", + "public": "02a25a01476d6ea82a58c4022a8b5a379f4257a1aed8bee8968cbf3c162c84a16d" + }, + { + "address": "QcQpkqG2fRxcQsirLKHGJ2sYs5HTYrf7v9", + "secret": "1aa78e544b013fba58e38ae786767d93384cd75e02f3d4d059fcd0a099e34ae5", + "public": "0310f3a6b1152884ecc8d16417f0b9de900d86c29707538900f1fed76a8388af64" + }, + { + "address": "GEir5to36spsZ5uzSTck3pdLCFG2Tuq1p8", + "secret": "f48ba7c9a2b190d50b093a4bda6b0979dd4110cfd7fb3405c965805aebe44b67", + "public": "02c20825470a7658c012e38b3901631f41d4371b0048653f62975cfb0fbdd2c867" + }, + { + "address": "8KM9nD2XJTrSSff2vfuFYVvZcGbLj8eA7u", + "secret": "f274cd6a8279bab87069888a3d1dbf029ff46be4fd2e57d1a2fc82643a99878e", + "public": "0234e5b6d95fe79d493d0ecec613e9e0f0bc738c36ba1b77addf4b1f2fa6b71c67" + }, + { + "address": "2XaPonNm8z6upuKv5xtQpd7WmeRKTPUuoKH", + "secret": "b866d4cac48a0670f498e9b4c10edbc27560db7fb0701e4ff87a13f6e24f9f19", + "public": "0321c3fb78a69728088f6b7316e03795bc487b41ba87a5cb92c3be85377ae95871" + }, + { + "address": "iN2qYbja7wU1Gp2JnoMUH5QiSammUC7baZ", + "secret": "588ceb37fe6370051d4cdabce2bf19035fd8ad9e8dfd334322d43fc2e16acae0", + "public": "02e3132cdd81d56c6628cd5d851cea5930f0f53e5ffc6a5e35d87a9f85186d823a" + }, + { + "address": "GbTRDoRiK7FrTca2MVEbQ9r9TK9PGqLhLX", + "secret": "89898c1b41e26fcd6a41e97c27f560f5db50c92e6830377379d84d767e6b6a3c", + "public": "03bfb7365227b03415f2f4e56821a7ad1baeae87b7c35b3e4bd393e7ff5218c392" + }, + { + "address": "SnfWDBRmDkshVcSgLfw5cYoAgmKVFygyS", + "secret": "26030f3717e988f6739b27292401aaf8f9f7731c016fa1f5e1a7af384f22db2e", + "public": "03c754deb4f25d2d81cba3b6f0bdfa68907a37d9d87b7f5127f477cf3b1446d567" + }, + { + "address": "3SLNRTzvWE2qxPJH3zJdFZmZSNu2gnpXwr", + "secret": "bf33312864090d552a1f1c17435fab813d9dcfc5000f9b2a7aa693355856fef0", + "public": "02f684e4edc5d1dfeb37a770e08e57dd6a49cd8bda524631b7b208d6523c29b0ba" + }, + { + "address": "rsnD7sxaPfXqbqYXPggvLnWYQ9FTTERHYA", + "secret": "aae8981a907d7e0e5bd0baf1919f8dc663504a215223c3ed57cf70c823a3cacd", + "public": "03d18f871b16e48337b99fa6d9cee89212e53bb26eae9d73017ec796a09480fe64" + }, + { + "address": "2Ni5D2DznHv38gyn6E5Hc8mqBkrMQ1VfKq3", + "secret": "7673157ecbf104fec8687bebc5d8ad81dd5e93a0a8b92bbfcbee246dc7d3c7ef", + "public": "02bac8f5f1120987cb3fd7ffd4958cdc50e3906ffdd6062fd9ef4b96c7ff769970" + }, + { + "address": "2bso1AeKwYVDgZuiN8XLjNKx3xBHMm7M7xo", + "secret": "c41954726c0d4369932006758b39f1afdded0d309ff99d8c1772f993570f267f", + "public": "039c3f264f985f26dd31cff7b0830c2bcc58ce13f54c191fce6d45fb827500ae83" + }, + { + "address": "2kooXVM5k6vn4y4jJcmgCJPnoqB4ydkTtUo", + "secret": "4db9d88541c0efd0cdb9fa3acbb3b6e0ab3db4010a59aa78dd1488ad8c28ed14", + "public": "03bed7e9a58022dd6b2727439e1993b03088a61f2518a78436e4208efa19c4883e" + }, + { + "address": "2QiJF7CCM1tf6ESVHzrJbVckHcehKtGKAXP", + "secret": "d530371a1e54014249b716d0f58ea68ca94a8c29cc2c77766032f9ee7675d076", + "public": "021bec8c0d092baf315dc4f51bb6a74ab276f3366a7f5a9aa72da8531b6dfdc93a" + }, + { + "address": "2ZFwFc7gPebsz3329NMpZPdrbSdTCvioRjn", + "secret": "7bae0524fb5739792d1ca70ff661eee59d193113d2959308472efad7f745abc0", + "public": "02a497a0c6534627babf9ac0c9613702bf0774e3c663faa3a173daa489cfe9c032" + }, + { + "address": "2crTgsFrcHwrx96qTgNd5v2eZRhDSGwD9KU", + "secret": "0144fa3a146902f05d05ce1ea93d7f9f7740cd9515463541234b035ac7c13c10", + "public": "02a749c44375ac2f409ccade010712fc0b7108faedc9066e52656df90713407c1f" + }, + { + "address": "WTGdQJWnTZJy8BheAdohn9bDj1S1CJbcMK", + "secret": "320fff3d17aee027ab0a021d62984dc71e20e2a313d550d6bc71a7037da76ad4", + "public": "030b6ffda04d9048c4bcc32a2746f994eefde6b4a1707b5b2f4148503115227cbc" + }, + { + "address": "28JuPfNb5KQcTbMZorM5ffH5Z6dnqYoH5rs", + "secret": "5bf42214cfb2fb2b370dde6c400b89659c5b10d82623d5fb37051082be4dbc69", + "public": "03f727682db76736b93347b8f31414520db4fbfa8de36864ec33a5e397ced943de" + }, + { + "address": "2jYZCimvDikD1etTuiwNVkYdDVYoRkW5ajL", + "secret": "05140478b6c6839636564892946b45df6b3019681672f9b104c86ccfad644f1e", + "public": "02b04c95e8face2cb50c64526ca0d7c804811e4ca45ccd34ccc954d86692a39537" + }, + { + "address": "2Ws2CbP8zi2rmDoTV5wxXHYiBSgC4FcFbDH", + "secret": "2bd204df49886647bad2806269730ca62d071fc446f42881cd2b4f1fcc98d00a", + "public": "022aa6887280a4006676f44589b4b74a0e8358b627e797964f4d9ac466b35cf42d" + }, + { + "address": "eZLF5WNWovZ5N4KC8vZtS38K2A4u4BQs7w", + "secret": "e7a78096dcea1a150b559775f643908650d1eac4bcca20de411a2764790ab1f5", + "public": "03ee354b340b4a723fdcb1ba2c11331bda62c40fd1c0f0cc52c5f876c66c95ff58" + }, + { + "address": "fadbXiZAhdLmL4DPDPFYGyqsZJxhDGrBnv", + "secret": "c05043fe99c3315c8354326c6a7e38410372f2b27f68eab88e74d6f73f170993", + "public": "02a96ee70543de38766532aa7d58eb3d36ec7846ff57f3ac251e2522ff072cf046" + }, + { + "address": "dmEhj2EdVXyP6gTmNVwAv9cg1jsHNFR9kG", + "secret": "a09c86ebcaff266c7213d42a8fa98c1ffbbe12b91559a0d0b6a7936b3e16503f", + "public": "039dbf5a286018aa46bb4714984cdce0ae4eee0f35803495ca595b69adc5e07769" + }, + { + "address": "6MyEQAeTLFjYYxG52FPgpNrHDasYFrjXgy", + "secret": "7a37469469c1063b3ec2ff3504df6e7a6a91aa1055a998dcc11e2781168b3797", + "public": "02980f6dc6efc5b1a259b1c588fb27b9c01ce6c366da9dacba815616351d62afc6" + }, + { + "address": "2Qh8ycrQGRuDaTmqjtJ6GQQCjL5KRCpAE7L", + "secret": "53c278e573892656e5ebc94420ad4f4460f368c2c9ea6a89b3534414d5cd8635", + "public": "021543e5108cd46d6038eb2f2274c59cc2670ac395b73611b0f381734f2acf6641" + }, + { + "address": "2aceT88Aq7FHfqxo2aBoiyDDw7rB57QsWtn", + "secret": "d30bc636046b7fd619fa64d056c7bcae6d183b1e64e003ce9a358bd9be3ef3bc", + "public": "02f7c3b95e046785f21c280ead0a1eb3db86e87ba56a95671d1c44b5f72e93cb32" + }, + { + "address": "4Smrr2YzK2W52cxZxiCLoJhgPi81mSSZ2U", + "secret": "0641dcb8d208b0012909b8e7705ec077fd485e43778e4b8dbcaef8eb925c42cc", + "public": "023143e54417d2df738825c2d521e283ba6b2ef611b3d53bb4fa0ec09ca33671f7" + }, + { + "address": "2b7YVEDW5WkLzrqfoZrkxzhuESHEwHF3xph", + "secret": "77ebcdd32c08a25ff00b56603fbacb18d44eb869107e1b0a5b34f85bdcbb1672", + "public": "033c0e22d985b797c944acb9d176ff51200446aeed5a31cbd452b8aaa3f0364e1c" + }, + { + "address": "JaR22JZKMWEBSPNFiDKKCM8gatkWo9LVrJ", + "secret": "e31e98a9043ecbb6ffa15fd480e0f1f169d86ffc440a56581f2cb994b887f71f", + "public": "02d604d042b35e8882515b5bb6d3c3a8f66b0fc816fa6dac3b88aa97ea9a8c8442" + }, + { + "address": "2j5pAjhg9yPyLuzBJnG6jPFq8Moi58Db1Fy", + "secret": "7ca8e3dec55937eb12e1abce3ae262ae1ecba643c69d4268c0b39b7c38e902f8", + "public": "0321f9d1f269d36138604eb84dc1087ac7b06e3bd0511a1f1128c089fc6b61dcb2" + }, + { + "address": "25PWupb7kLuFdM3UQK8tvcT98h7i5UDHkXT", + "secret": "15c148fca7434a18c484b539830abfd9ee169d39c3bf95e13cec5877ae5137bc", + "public": "023ba5a705ac79594261ebe524de80c022dfd42bda9094e8a4fa69889e6ccfcac2" + }, + { + "address": "2LWHyVRV3AEtYLvN6TwUzbFE7g2ccmhTVEm", + "secret": "3bd05a85518a0596564796356e6ef267e99e8de6aa529a0bb70a992dfbd1abfe", + "public": "023f07f1368ace33dab9fdf039e05137b8df01ac5864723a8e913d7c74eed72c3a" + }, + { + "address": "2mJ7HbAJiYmNahgLpCSmxWg8HbAx15XPkzy", + "secret": "4929beb2e5e57a9a5f1679b3a60bd6d20dbcd7b2a2527dd55f036d6e0a0eede7", + "public": "03ecbda83c01407aaf4f4856865fdbf082c12884a82e787ec0ce3d9c02bd6fa565" + }, + { + "address": "rVg9n43dSffZoVYdPyhpNemNbHDcZcnFnh", + "secret": "c564ddbf95b83a7806655aed2277f7aab9b7fb14bb106baa03f497dbf3d7882f", + "public": "03972a262ab0052092640c9ab72b82617883a49b58df548f00b627286dd658efea" + }, + { + "address": "BvURWh8mAbBBqpqN6YcaVMo4xaqABPkjAK", + "secret": "53f6d7e20bab00854fe7cb1671eac9ce35f997ccef7a5c68088a60709ba3598a", + "public": "02b92fba69673ce455c828a6eb473a185a3b5739fd928bbdf0e017c85bf973a084" + }, + { + "address": "298GYxeyvXBFpA9b32nf838vHz2L5bGQoKs", + "secret": "e30820c25276c84d31b3048597f19f42b3eb204572d8d275c8f5f76788c9d3f5", + "public": "0278dc9c5578ed235bf491b5ce0fb47afcb1a1a57f73db7cc9f303055a124ba7e9" + }, + { + "address": "nRJwAXzpr766ne9BbdgX4wtf3vCkb6FFe", + "secret": "70ca6ef64244fd4f00651ed245f1f87390320b79ef721bdb6d87c14b52693c6e", + "public": "0362e369ee21ff7d59208212a8b9b696c617dda85821e4ef42194aa96c3581549c" + }, + { + "address": "TCXZMKsbdqy5yMnkuWgpVA5h8rZdK6odrS", + "secret": "6d5b53a3cd6e1b4b6cdfc44989627c71d5fe406dda8043eee286e40d4691890e", + "public": "037a95a70a38f2371799bc3cf2f329986d6f64bcad8455b93ec368c619696df252" + }, + { + "address": "yUMbbPX3JyD4oSA6L9cYDiEHpRqM5DZzEK", + "secret": "ac9c752c92b9fab9859f41d4df2799ba3083c0d0261557d1563ce10ba2c14763", + "public": "027c5e3452c791d2d21e9a11f2362fc86258ea4470d3271422cfea29aa18d65e0d" + }, + { + "address": "22LAVaqjZaQk66dw8thM5eN9883pfwxF7ve", + "secret": "1da6d30d4fed6353c051770fa8df8bb25073d2a65c83be50516c7ece3407b698", + "public": "0333620b3e2078bcd027a76ffe66baa972baea3b1eefe02ed76b9a17ccc7d995b1" + }, + { + "address": "Gn9QCBzKVxHHh8SGb66wpu84BZuCw7PHbm", + "secret": "16b00b79e3747c8e166120fe366546c32799aee2bab5ad442227b5c2173dc94f", + "public": "024726f46895b7ac02795bd5bea795ba7a51dc2ffd53a90c840c73657b25680c63" + }, + { + "address": "2kT2ZUiL7vzt446hY8Xc2Nx2ohGzcFjtZwM", + "secret": "f0daf3cfa005eb279b7244beb2ea779ac76b1ea77045cf00c7379b75aad4805a", + "public": "03a8f0fef09af25c1f30e8267af7759b02942875d12e265a3896e7ef6399cf43af" + }, + { + "address": "2g7bpFrHiyyZhjFr8NNLoVoEL1HLcGyfXFP", + "secret": "42e7c043b5bad590914cabd9da1c64fd95ba0e3618cf217c9e56e2cda849a1dd", + "public": "03d315900f1fa2b0363971f66067cb95b5e062799542417861acce3905ef009924" + }, + { + "address": "2aFx6zgr764yaew5kBJL83xKvJXtaFYrNe5", + "secret": "609ef2d18c07a72423ae24c2c0de839b900dd660106a4d2352606be503ab887f", + "public": "03070b88d231d49d34e46cf719e47fb0abd2d9b9db9dd571931cd0e33e9a21f251" + }, + { + "address": "2axw8SpzvpY6QJze48DubE7SVwhpfEdTt1e", + "secret": "3ae1e46578207468ba3ff0dc9e8670d3e92361eb8e4bdc7f372096a10fdea1fd", + "public": "02bda68d95c5516ec84e5e8ce328f6354a7f3fa1e8e0376b8708d570dc4e7cb551" + }, + { + "address": "y8DV3nCwaDs9PtsQbiZnueVcbqB5FNho3h", + "secret": "c4c7d8f99d6df9127b6ce974e4b5791619b7a6d9230bd7ea494ddd5321c3b02d", + "public": "032da1fe104a466b03731eb9fd85709ee31a91b3eaedbaca165413526ecdd87dd9" + }, + { + "address": "eJHjp2SLL6ZUtYHhfEMNdN3c49k6QU8W1k", + "secret": "fc4c34570ee70911601b48a8881e93c713d9552cb9499c871454b1247619f7f1", + "public": "036cbcc6c350ae878de0382b4d4a998f85490f6ccd288aa37356730eae31e1d3e4" + }, + { + "address": "ZBRYcydEtrkGHYVFRmHQpzVwfDimNC7rfj", + "secret": "2df0754861dd3c563c5c1a3efb75befff40774022fd74835abe23fae37c03f49", + "public": "03f5e7d8028debaee9b5f29b2196c652cc7dbeb05f6dfd2ff19e1a7934febac699" + }, + { + "address": "J2Lu6gP8zXyq6EjayWtV8cDmdi6M73Jn5B", + "secret": "4f82d68560df1e74999982c4087955f02eadadce6502054ec431a2a2958c27d5", + "public": "038494fb1ea6767a31005b3e2018500644fe5f9229d1facc6d3cbd086c1434a120" + }, + { + "address": "kXVPezUrC5jjzS1bcVEUgaXfqqPYpPG3jQ", + "secret": "72b9f75282bcfaf7c3e468f7a090bb3322ea4dceb96449a0e02d25826e242dcb", + "public": "0335224bb5460f92b2afc546fac694cc6af797543dbddc491235fe9469c269b5a8" + }, + { + "address": "sfBsXAZBz5VynyFGyEx1TA1EVA2SNS4Q3S", + "secret": "599c05c64d67fbf675b01219f15e82a4837acdefa30d714a7d9162550604ed51", + "public": "025eef68fc3790f499996747cf941398c8f90f57a47d8ec93cccbea84081b51058" + }, + { + "address": "2Q6guBQ4Mota7bUYx2TD3xwWd9oMRScu8q4", + "secret": "34378458342db0df22be23ec49aa0f0e911900447c6c7f8ee2e69b79d6e9d309", + "public": "029cb1684854b84198bc61cc8fd7f42d39d259912c6f7e65d228bef8846433720f" + }, + { + "address": "9DqzJkWCWK5kCVaqY1cXszUtNdwvNZJSJd", + "secret": "e381d7d02fc85b55ef129e13a10d5e7980bf88ecb631d55a9564085b6955f7cb", + "public": "033005b5aac2fdba5442c2d30adf6bac3bef6989b8f71530c91a28a7fe76908a78" + }, + { + "address": "CitkJhr47JTB2gTQhwcYXBsJrxLiHqixK4", + "secret": "7c776045c28bc10641f50461d4e985d6f28687f01a6635fb52406e2c073837b4", + "public": "0251c6fff14db8af2f982a840921ab6b228bab890ffcb2047ca9999029aa26f068" + }, + { + "address": "vFUe7fcmLXGhF2fKRF8zfWCLUujDEgLVAn", + "secret": "f643dfd7a3fa2b46e5ea2ec8d63e1fa81aa0124f24cec7902b55e8090f354867", + "public": "03cd6e4e5cc5779262e293938773a1fe3537e8bd0da18f8353a002c516a491a364" + }, + { + "address": "bNM3CoJCTquonnV3fGAHSHjkXU4VVXAtnm", + "secret": "b1303503a813b58803536d68466a197b1bb3a101ec9a1bf8fbd2369d49b364db", + "public": "02a1e47b9d9f2438582fb53aeb049c715b7a061ec5f5ff0a4390a27c1c9fb5daee" + }, + { + "address": "2BDGGpDt5TeQqtxJiwCsYfUqSH3RnDaJvrT", + "secret": "62ae0cb5fb989bac7245e194d13deb83bbe7997b316a13b384afaab7d8160c27", + "public": "02285851f4a07f8247d0e718dfc9ba3c0739eb0384025bd1088e5b2fc5075cb544" + }, + { + "address": "WPP7JbSpJbHy13p3tAtSxFgKg15tna37nz", + "secret": "81158f1ca73b5b92e88e35864c2cc32a7e6dc4aa1dc69549b69488be0f939210", + "public": "0399c5c339ea989ac64e6c0b8c46088241e654ea12be19055b0f3602185f59113c" + }, + { + "address": "CLWUkduHRQ3VDqWCtLPu73CWRuyYRcywUh", + "secret": "a2e2f95581ae88117371cbae30bfe82ab85b16ab30ee792c99815515f4b03144", + "public": "021025967d1d2d7cd6bae8259ade3dbec5c5c7340f7cc96ef9faa98a4e8e89356b" + }, + { + "address": "2hsch7LCnK94zgFRBbL6N5nSwHHoZLv55iY", + "secret": "919e0a2d7d8f4ebb28bb9f8f4725433850e5e3d3ec90ba4f2b8bed56b736b095", + "public": "021da1eacfee5cf2ad3c323953c8ee5be4ef8ee23fb2abe88b2cb4114c24402ac1" + }, + { + "address": "GJLtCoZnL4di3kHwvkJtR8CW92iN8Vjmcv", + "secret": "e7102c8e401b2d30627764d44d7233d37ad7f5e83f935499581c4118e7c3e545", + "public": "0297dd6e1b2b55a29022578bcb8f2a97c4ebd1f04e14004c83742948baf15db34a" + }, + { + "address": "dF5jq7t2pMQJbacvfPFbxbiTRYi8dt8Mh2", + "secret": "aa520684df5e3db05607e59f3e1a039348113fa32f844473c5a3b5be8cba448b", + "public": "039230da7d6b4324dbab6315c9268dec4c913e9eb2fc2cc59daf29e2195ba0c0fb" + }, + { + "address": "W1DHb2MP4dfnLYgS7YmTGrwT3jGkyYzTaV", + "secret": "4dc879f1a4d782bfcd3921714deb2371da5df3b2f46537283ccbfe919a21ee3f", + "public": "02a1596f4f937a01189f494ed81fb8354101e1c5f633d34ab6e6b189c99bfd5d95" + }, + { + "address": "14Dzj9AmYcmqHADtmZaiaGAAYPTJF5iu3Q", + "secret": "3179eab44f64ab0e35f3b4842112eb6cbb18ccba16b7668866adcda6ddac4882", + "public": "0395997101d2d8ca8ab15058f8e465d4b87a422ab825aaa8616dc62373f01c81ec" + }, + { + "address": "Qt3q3oPi1HN4v6iPj3EbfaaV9kMU6Qb9hh", + "secret": "ea350bd2044b3a9352393f5169c3881d8146a5577da478c0e2185b56d7e84e59", + "public": "028959d6882142bb5dec9fdd5b4a2c93b2762df2923598e056622b899ed332f062" + }, + { + "address": "2LdwMr8hZ7MeQ6uS5e89Jwq3KjqvWQguXpN", + "secret": "2e145d25d59f1e5314ba3f290a81ccd6d71dfe6b998352688dda120aafeb2b4c", + "public": "02e0a927394aa47473cf544a5ef5a21985d14204adb5e1bea315096f41d5d38307" + }, + { + "address": "6z7d9KEtvBw8q2VZqz7PBSwHaCAYD9SBiz", + "secret": "ec9dc327f748b8a02b7b931d761e41f9406fa1ef637113acfea60a395f07f703", + "public": "03610bf697e09ce02f54c830792678c008542d19fca2e625706fada2eb5012a3a8" + }, + { + "address": "SeECPVtog2nqdBuhCASpu5GFW7kAQ2aWse", + "secret": "45cf169176971687dd96d56d544dd4739b3c3c7b24eef38e2b2eec449259fa09", + "public": "02f2ecfb3e58709626fdc9de870bb11d8a5ada1b5088af73b0d49ee2397ebdadfc" + }, + { + "address": "2RfMB8P2jTG5dLcrLus4CTZZH6mke47G1yF", + "secret": "72082e472815e974af51c5ca2611dbd65be5d498305616aeff0e21845eb2f6fb", + "public": "022736c896b113689d8891ee1dadd6e90a357d25143199202223637127c1c082be" + }, + { + "address": "jsHspZyTeoWLQ5R3GAXPDmMdXiWMos8Lfr", + "secret": "d3b02aa4038b4c0a71588a45d9f75a670c35e28c600cee1d2de7d2a04bdb720f", + "public": "03a2ddc1d41e53f6b73967a1b47a6928be2bd29a3c0729a267d71ef8df83b4a05f" + }, + { + "address": "25CSv2NqfsHSodz2cRueFGwAbdzUiuHHLxb", + "secret": "f556a089f138f59e3000571593b7f9559c1f546b5f9d1f475bcf6768611c9baa", + "public": "0305705d3549479c977fed1227e84c0bb1e349c6fa2374e4f8931c7592f1e980d5" + }, + { + "address": "2SitgCMQcxkiCF9Jf4pACRa5H5z1Y78BQ87", + "secret": "219e289fee89a7afeb2fc1316e8399953bf879f607cbebab264bbe1927cf7527", + "public": "027a4480740e264da975b95df8333c4877180c546e26cd4ef280de97822491b479" + }, + { + "address": "Gr1aAJwLcHgR2bumhPAyS9en2VnRFZz278", + "secret": "9980f094f2582e0810ce8cbf488c44d68ed60f6a45b94d4a5a56f4dd95ee0954", + "public": "02554006809341e915b01dc0e9687efab3f00b274b47bb61febfb2b5898128b95b" + }, + { + "address": "22k2EBqKnNRAbuGRdSCoL9EkrfvocHs2w8j", + "secret": "8382c706a7533cff4bca93e5dd7428eef94df089461c3fb11c9dc9a0ee3b4bd6", + "public": "023f7dc5cbc6164735acf1e0abab395d99a41fb4ed26056be2f7844c31a03c48f4" + }, + { + "address": "N31RqZUYjL4e4VFFR14rtN7DqgrnZwqbC3", + "secret": "2b6c4d56af2d787de889eaad0d97a07f209851a2b6589edf5a1c7a3a4f33e09f", + "public": "0312eccb8c1542b4c5d108538da52ddc5850175df7a7de3b1398155614e792cc7e" + }, + { + "address": "9Pkybqiwz1EmDy2b9L9Nkc88mc6zvPRsWT", + "secret": "1c055ba9e77726033ebfe32237bd425a140110549d82e2311d086bb48af1608c", + "public": "035304c818e2c5c93aa671d150ec763a193064d9cd95d8711254a77c8995e3f52f" + }, + { + "address": "BKvj6kmqdx2j35qJdJ5DPAKjJR8vzLU9q9", + "secret": "30130b623de1c08e1cb7ad95a1dd87a3a321f402b9712229e6ce62b7e1efc501", + "public": "026878a7175b2fc3d0ef5a458079eeb1b63d1a63505ac71fa0667239efb3a348da" + }, + { + "address": "RFR4UhmnBPFZb5sg7zyQrr3Jw4So1u7tmv", + "secret": "bb50fcc6980cdcd78fb3e58dd73b9a0adf6fc4539c7e56b8af9f04437f740b10", + "public": "034aac6f55a6ec5e87ace89ae7823b04ef43851316eb3bf85b52a783cb9f97927a" + }, + { + "address": "2W81p8QoSnMKvTdnBqb91J2aucdtjwVNUFo", + "secret": "b3e1914296ef75748cc4cc7772880186b0ea31afea9f36a92836c3d03d66b28b", + "public": "03d9677912768e36ebab0aecb6849c9e09b161e689521bb93e3cfd5687d5eea42b" + }, + { + "address": "rLjhyJVYUrqpgimkycfCdPfi77GGTerroe", + "secret": "192af09cc5032ee7dc03652c72ef0936efc1a413eb74c3b98acb50ccac9a97a8", + "public": "032eb1861040be977bd41a7ddfb8230e6d9f0ecc53b43dc6bfe3f873455011ac45" + }, + { + "address": "2GahVFLmUyYWycDo9eXvq51ekc32VgxKwRs", + "secret": "536ee03f10031d63eb4c1f4433598dfa587a9edf031c162770eb76ea300b2410", + "public": "02be4a70bcb626976057df5e8a87f2727c6dc6dec80c1a5aa63e14d14a606387ac" + }, + { + "address": "23CNqwuhjigvmeGq1MABeYoTceo6PMFndun", + "secret": "89a4c39206bfe84ee531233692ec4d7da526f15e24fe66b06c0f539920620f87", + "public": "028b954910c22532fc7a3af3b5b3b03460209711c048c19d46e756312c06f6bf44" + }, + { + "address": "2M7tTKyESdcKE66Q4gJpvbDGAxryCM2MfjF", + "secret": "72c021662645cc9b8b2177ad62e0f5211ade182742976a8fbbea55a44c26dba4", + "public": "031bfaf003af08ef951f3ce58096fb09eeb6935b6e3e7e5a230b70c963652f9d40" + }, + { + "address": "2A8vRNeRFyB423goYsfaf2XJfFnwLVBEogG", + "secret": "3f193e4554fd7e6755b017b7db495c2d290351cb65ef3cce34c69e340cfaf177", + "public": "030b4d89c711efc08d9392c4cfa106bc1313c478826453fdcbc115d69866a6d896" + }, + { + "address": "2QRYen7D9tDdLeJD5bXuKfuYKBbo23o4ABo", + "secret": "69da90dc5871fc04146acf8a1e4121de64e55b97e1629cee8d0bba6b464f6a8d", + "public": "0203ffa8dfeb26dda72992ef3d4126c989651cd6279d4e738110296ab9b90b2515" + }, + { + "address": "2SkcSFj97J2BQU5hd4QTm5onBeXiwRsVtmd", + "secret": "3d3e5bbba89085b9f3925abf1a892d4e6be4f459e935e05a71ad04ea88fe6ddc", + "public": "03c1cafc2eae3d0f3b109f942234d1fd83489e040373477dba9e27a801b3bd6588" + }, + { + "address": "fA4ByNSX3amgkeVF3ZFQ44gAsDybhD1urU", + "secret": "68a10f706545aa984a8df888700d822793d8ddf9c1999e329ea6a579bbc33175", + "public": "02cd9aaccfabadcc58ae9612cc034054595a8004401c05b314121a4d83fd966339" + }, + { + "address": "2m6BdfcCCGxbSXELzBjGNnAMxPoej35TLwt", + "secret": "bafb45146ecd2536e463c08c6b3b18534dff04f03d2a2828c889792b83b2b6b7", + "public": "039ae122d8357f4d6053be5d29a3d9ea72926c6c3fe6b586179fb11808e561c0b9" + }, + { + "address": "f9hJHRytfpoEa8B4BpNs8gvT1unMjvTFpf", + "secret": "ed643cc27ce09053207c7b8eacb7ab98cff341217f2d398dc80728ba3dbc319a", + "public": "029e91944afc94461da0b314b75f07e1aca7de0af053329bf9eca191f5e9480471" + }, + { + "address": "26F9aPSV1mHR2wmqWtiY2FdXwiZG6GC1WxZ", + "secret": "5207daceea9d884ed6e35ce719fbb356a33d6a2013e1d1159d021da4cbc4ebf1", + "public": "03d41debc510d99b3be9a3fd290ed44cb6edbd4c94fd6e18cef6faacaf8a931e1f" + }, + { + "address": "62mX2aD2aDNfh5zCrrLAyw5bPPoVtsmsaS", + "secret": "c702c01d2a48e072f21d811535ec30edf8d1940957ec61bca0082e3959f6b2fe", + "public": "03b1daa11a074fee7dda44270d842753c49eb916c19066e85bf5bd0608409060aa" + }, + { + "address": "QroU1WomNFwEpKNooGfSVqJhaPepn82jx7", + "secret": "21e0c30a0af7930ebbab4de7723849b2c712c670d8caa66c7a600c44774b1f30", + "public": "0379bef14165a6c65fc2bd41d11077d25fd4701afffb0e3203422cdc85d0cd2b88" + }, + { + "address": "B2qurPj5Vosgdb3vMF9tNSbzvCwQvZT6Vt", + "secret": "67538ed445290e3552443d4b0b5def55ce9e14127055b89ca1a58a21589896e7", + "public": "0374a42e90a4336a0c7147d624f69070ac3ad046a3c2540fac75d874a518f2ef6e" + }, + { + "address": "rKR2aYWXsKdPe7TfeLCKpC99zZe9KrTjMK", + "secret": "4249267d631619da0bcbb7296779c2c74df42c3a21e7fb0241e9e45ebdf31bef", + "public": "03d0abd9eeb44e08e9e57f2c750657113eca20b16bf0ad63c46834bf526b9c7067" + }, + { + "address": "2fH2mNcRGcwTqUhi6yBhieXGuU45AiR1rSA", + "secret": "c1bbea6cb9ae73181b273c5f5bd7918b4c28d0e3902efe8eefa837a03c8b6f61", + "public": "03289894de48c672ca592a35fd083859bbb1d991d77cfef8d20b0fed1159e80e3b" + }, + { + "address": "61w9ZrrWmSXprKv87Nt4QRVf7vy6xZxx3S", + "secret": "9473ca381c03ece2f1895ca34c58ebd8ecfd6469e486d8e15baff9badbb8798c", + "public": "03095b664426e488732806e0c08b4b7e5cd49a2653c029eee6931b93cb361130e4" + }, + { + "address": "EiRhqw7RKPTSwmkEUzmWTB9anAfxB2u3HT", + "secret": "847acc35d8932f3f0d2e9fbc57557b949be580e93a7228a4e6b8fb154f448208", + "public": "033f3d37b184bac7eccb3fbe9bb6f3fc1416f7234b8670b67b65f8948e8f8fec16" + }, + { + "address": "2SNQebSnRZUyMKRyEZyemuRZWPiiN4iSUSu", + "secret": "b065935a2dc91950e4381a88907ea5bcb081eb9115e88e573c8ee73baa3bdce2", + "public": "030d9f84a7af08f7d8b104113e72e1bf56efa5cf8f9bec50356f442ac71fbcf767" + }, + { + "address": "FuBAryyosutbMmanUFRzJyqwXkwh7kdGEU", + "secret": "0ff066fed0235320963798399f2a8def41aa9700d2f84205f6caa63422ba6dcf", + "public": "0333e807c0be00d228199cb50869176b8d3021e58faf2f3e0403a09bd010216f28" + }, + { + "address": "ovUyGnQCsAFCY4CzfNGPfpBNe4L1yXoPS7", + "secret": "cab4652334411dc9504f420b936d5ac85a6a50c4bc5245cec04e08898ae6a236", + "public": "030ef30e7219e020b9f9e77240fed42739b5b47063373b8e5fa2a4cd19cab80d9c" + }, + { + "address": "z8EFc9WUA6Z4PnWDHC1rcby6mMxR6yq8uj", + "secret": "396b40376a1f66fe79b8050d8c2b7fd72c5442429cea1de9c3e9b7b10b93c36c", + "public": "032194941eefbd5480556832f47fc9495f2dd4daee52153fe4bca687f13e102c54" + }, + { + "address": "2cgrysvL5TgPD3Zo1bQ7atHePjU7pBbi5HM", + "secret": "66dd774702819987b97c150b2baef6ca69d7fa77b474ae6b827b434a4a22190e", + "public": "02e84cfcfbaae65066fc96271c87c2a74f6af8870cd5f90b19003abb2695bceef0" + }, + { + "address": "CBC3XTB4jQeeQiw1K25MBVy665AmN7ndcS", + "secret": "dec7e76355a27ffaaf7d706091b3321a877bff8acd255fda5a34a21819b413c0", + "public": "02c7e48a9e20852a8e25ea0670ac9a320c682d4a2f1602c1ff4b00e00bde283e91" + }, + { + "address": "x8Amv5taKJPoBogmVgNJjtyddz21hYeGzY", + "secret": "a11279a7533f382fe1c4797a35ca4c8e62577de9d32be5002037abb63c917937", + "public": "037d4322a6cedd200aeb6403700b5f723b8a4aea1f922527657572ae7da751dc8f" + }, + { + "address": "2f5JG9tVG1eJsCV6MiSAXXn9z2qLu1WwPBZ", + "secret": "63cb1ce295c72df8d9a5cdf619aaab3f6531a6f8f428fb61676f319f6443b1ba", + "public": "028e3738fa11f56333e6c6319de2acc192d998767100b079dec938c66c33447d10" + }, + { + "address": "2YnwtL7Eax6ALym5ZhtbZc5mVi69SAQa7qW", + "secret": "fabc193d52d4bf936067eadd28c936e7c4bbf5b65bdf904e00cc80e7aad8aec4", + "public": "037e8be0c5076b7b7d9aafcbbeb1deaa872bde340171362dca6a32595c08a71501" + }, + { + "address": "n8VxbBynsNFRjMpjx2PoyCsqCobNd3tTGy", + "secret": "d3b704c0fa85c62df383ef4c5d691920cb56f8a2eb0c676662349f592b2fda35", + "public": "0223c0bdc26f80f6b8689286475a1f6a1462b3f763368c8926681dc212e8a49d37" + }, + { + "address": "2GcfeP65kgZJsQxgjTnAbUDNXUX5pMS6qwA", + "secret": "3084c64edd34f827750497f7ae3c432484bc86ec1ee03c236c83c10c2189100f", + "public": "02cd4aed33c68c2380060d807b2eae38c8460bcb494a68882b3560e5e917808150" + }, + { + "address": "SC23LSoVTHMLfdsy1dZA4ysYzLWYwLe3VW", + "secret": "04c3536aec2531dbab08bd614adfd9839150b82b8f15cb7a7228b04171cf9310", + "public": "0357e08cbc0fae044ee6109394bb70675c05effee3d0bc76c95cd1f3814498dcb2" + }, + { + "address": "2mBQma7LZa74M3WFJCws6dwZKn3YQBMg6rA", + "secret": "aa5e825ace5471708b05f3f50929c180f85e8cc19db9975bc02934a3e0469cd2", + "public": "03474646c2920067a9fe223c1ba7411afe48327370afa1298fdf08b8077d9ee19e" + }, + { + "address": "2FxdQDCLe7c1mhtKGJEnj5sTmcyoEuQwit4", + "secret": "5732ba0920c7688da18a7d2313c982cb4f05de6c8f8cd953b57883c64d19d01f", + "public": "020bd054f35df3619681e88b8f5b1e02d16e92136067ea29d0e944065bc17febe8" + }, + { + "address": "opjMWDaZnfGytaigCzDS1WZcMRCZQEvDSh", + "secret": "960c1024d6b803bb61d729f56edaca88bebd8dd25d611cd90f8c1553d72cc23f", + "public": "02c6ca3390d4ca5b9f9d8ffa81f217438b371505f7943f1b821ccaf267502896c7" + }, + { + "address": "287avDBot4sKcLa6uVHX6CEActGrW5z9W8J", + "secret": "0b7f4c468e9b57a69e7af6887e055ff0bc9b6c0dbd236c738b8d83e515eba25d", + "public": "0297142932f8df1b0e6def85fad14db4f5e99cc34a2bdaf9e1d4d94d5d43ff09b6" + }, + { + "address": "VDkbYkMPHKbXHs3hLyh4XC5ohQVUeyhw91", + "secret": "92e524d5eaeea948e6d5562488d971f0e4dc45d2a5f94dd4af7191bb91b93fb6", + "public": "02a5d4694d6485b3b9bc18e875d04773fd35eb4bd68cfa10bcc6e9348b5c845965" + }, + { + "address": "mAtUfYshMbtEJzjuKYcU2t6T3dZe4y2khb", + "secret": "c553186bcc8b7b6da5dcff3f522153b6a5af4df9e358f028e3fab1b02d7a7dd9", + "public": "039a29f469d54ff46f32bc5f246aa5c3714480304984e3232b723838c4d06dad0a" + }, + { + "address": "2NAdsgf4ZJJt5mFNw8at8hCR5RMQDNzwiwJ", + "secret": "652f9b2e81b4882b0a3ed0acad1870f906c47b741f3264e9437578270a77fd6f", + "public": "0224d49247228129e7e7ac57aa56be2d2a318dc57841975d5d11400ec226101326" + }, + { + "address": "vcGe4piafnmA7HooScfnaPoMeAUzkGV2es", + "secret": "3d36f0ff8d896a4e29ee908c90269ef4da1950f5d43d709d46ebef82b42ec902", + "public": "0232b6196f9a91a97bcef66cefd06ced834b6e57962915762b7f3d93347eb7512a" + }, + { + "address": "TU2RS7a9ZDUuj1X7fTBXhqo9jJpa5wRGEh", + "secret": "3404371d8a927f2b948ad1050a085d8c152051e6ee97aedb77c44ed3f6c0a86b", + "public": "029b1d98a32c56d68abb0c7b74f5508b4b0cbb23ffe2d6c53e7859c8fc047ac16f" + }, + { + "address": "2d7H8CquSYs2nin9jaZ13hGZta5FsStFZo8", + "secret": "5039e52f7321bfa5b97ea5b6bc585df9e54d5e5d1a27758135cc842b65898882", + "public": "03e9ea87ac0e016f2fe8b789bbfa4a941c3cfcfdbadae82c4c5fdb13b5ba7389f7" + }, + { + "address": "AvV5YY5QUnFLLSJMKhu9DsuxxrZt5wpvdQ", + "secret": "a75da19d2e65a262e1a3560376e2d292a741f3a4b679fc3b86a6f342c41f7595", + "public": "03388b89a69105f3fbad86cff7edbbda8c7a6b65f670bd1ea65c1bd29ab8927794" + }, + { + "address": "ZnvGRWPCyM8BVpFWNMwAuNJu3W9Qu4EcjM", + "secret": "b36e756f2985b372c860d9c8ee82d701446a99df55369a09d9245cebffb7f6fc", + "public": "03211ffaccb7fc6be9ec8dfca941bd18a24834ce783071324e7797167966c169dd" + }, + { + "address": "qoVWHHmz3cst7ejrDs5Ak1veNqXvc6bKNs", + "secret": "6d9ba763e4b5ece32546a46271be8024627663f8a05eb90cf7ff10aad43bb0b4", + "public": "03ae2573c7cac526eed1b7ea204d98b57b905ccfa565317562903238d9047318b6" + }, + { + "address": "27WSr8SckJGeSd9wZeuWmEXhkwZagupQBhQ", + "secret": "0eed689ddc8783a2d7405b3c7b727f5e283adf51a79c00633e06f4d7af69ea71", + "public": "03e01b17ede565155704d1d38b169772189c572f3d8daf7217bf10cfdec744f00e" + }, + { + "address": "jfHgeppkfWrLrfLDefT1ubVcX8CZtEHrxd", + "secret": "ac6093af30358cd772157c99144ca77b8b51374d4d42d16ff4c044a79f659d1b", + "public": "0244bb127e905e68ac4f77a02d36f8bd43a180fdfda205c5dde80c216027fe5d3d" + }, + { + "address": "7kUKMbna5G2BnYdRaUNguDcRxZqU4DJE5Y", + "secret": "aeb2ba2cd9a26758c46ff42fdd59fa2e109a57a2a7e0b6a71cd929cfb7d3c734", + "public": "02020ceac637c2e0a627a5b495991925432b2f38b278a39972c6ae3e77b5cf72dd" + }, + { + "address": "uXumjBr72CzvyStXFAcQZ7KyHazCGC7bYF", + "secret": "3e1745a1032a59a4f381389fb0371169a87286a29f9d7697d095b5d65cca2457", + "public": "02da2344d15c5d43d19b9f350b1c725c636004934f087b67b240fb44d674344af7" + }, + { + "address": "2cjZgqBybtHQNio2h1hmb8W1VuNHZ9CiJMo", + "secret": "866bb52ec8c6e51e52120b64bc42277b0123c5d200ea17d20cf365eb0f343087", + "public": "039391283693aa699e839a7ac00962bc23dbb563882d1b5db5774418a5d16093d4" + }, + { + "address": "2KuhVZmuxygrtPKYXygnzWmrJxyth7aHmHo", + "secret": "114e79415b9b6162578bd08983fde25c8708fbc204669e32d244761adf81be6d", + "public": "034f94c72ad911244a5dae6a7d2cafd9e1e88edf87d244fb8478ebfcc607c8b5c0" + }, + { + "address": "9f51KEwdZ2k6fbJKw2No5QcEZfh1FcQT99", + "secret": "e36c8f6818e4f3a759b1f1c22339cb7a1a560bee4b590270ecde2789990280a1", + "public": "02dec657da3437d526c7bec71d91cbe3ebb9993e7cbb69b5844fe8d02c035a29dc" + }, + { + "address": "CUFdMUnVtSmLtXAC5ktYSSywEaQ9uxUivn", + "secret": "f8c15fcb6c56e3d1a5f13b02f3d6f3d751c9f113ec3837ac9ca49986e5c79938", + "public": "032e56e60227fdc1c4e7100e1a5bb8853c102efd072f7e3d3b255d98da7645e7ff" + }, + { + "address": "2QVfVHQ7c81vSHQjXwjfueUxmycPXeSoh8p", + "secret": "dd71cbe703a2aafbd6e4e9e33d5dd9845d432ca8c16dd0076330cd2aad1ea18a", + "public": "029f3682ffb06648d5ccae4e579920840a162e884cf18ea1c76f7861038d41c715" + }, + { + "address": "2aT8vQA3MncGyw2XfhqisJUuTeL8gt67r7N", + "secret": "6f4002a5258fd36acfca3ffca8f46148788346ba97e290ce1580e3f0e40a67ed", + "public": "039ca89216842186b5d4c3d8824d9a62aa7e6a7258c51fbbde2b7582c6ab3cfd61" + }, + { + "address": "2LjJYUvxEeiuSHdmqa6WriCcrVMUgbYsC4g", + "secret": "9d5b1907abaf169e86622e520f46530b15016a3c56e6473980783eb9e7e3bb1f", + "public": "03d47c7a4ba64efd5ceec1d90370dcb79c4a5792334f2a8fb3f816ab3de0aba6f3" + }, + { + "address": "H8WyRMJiyuttgg7raK3MHvuaP1sYYVt2GR", + "secret": "d8d258e9d6ac67a32b2bbdb2fe56c753a3d4b2c45370c2081f539c87119db3e8", + "public": "0237505507f545ffb6e5762d3ee5ba7b2dbe03e1cb0b73454538331009dbb06474" + }, + { + "address": "RnvXdAurMy5aeEpGKfanQsphVYXtvPvyws", + "secret": "b3767d3cb4903870b7c40b50d235366e58fb24c7a2e5ac1607ced94126d308e8", + "public": "02cf83f66d10e315d6d84644682cd792e45cbad330704c7fc8951176c301ce6a09" + }, + { + "address": "2EGguQkd9xNM6rz43bQpPH5SUBbyPCypu2Y", + "secret": "544b281008d4de4530b39b3cbfa257b8d6c7df865fadb0f3ff875f0a024f16ad", + "public": "03b2d7195dabc09a3ed2ac92d44436ad57e5150d02be25db571fa2a9db513c72ed" + }, + { + "address": "2Zo7LMedeibm88xHbD6BihxYF9VbxueAsww", + "secret": "10cb3fc3bfe1039921b82dd2be1a036ae7d989ac5f1308441e7cb27bfa999706", + "public": "02b69743fab8f7ef1c5572ed9efded6802054e8668c8372a718a1ed231f376e9eb" + }, + { + "address": "Er7xL49Yz8yTdxTHZ2aWF899fZwuBcN2w9", + "secret": "ee2dd1b1a27c83e12f78fd0eacb66c0b9ee63f71f49f62f2163cacaf24c96724", + "public": "037c596ce52db6b28e1a9080c0e8d0914768e7f7cb4c1b56ae01437602d91c14bf" + }, + { + "address": "Ssu5YEgifibQKpoPKNZmwPVAKEt6gdqXrS", + "secret": "94c8c227b8cef1971f0c88b79742da648da391682eaaaf72639bfc516024ce14", + "public": "03e6aa8cd03076584a0664a1d61609e20ea12e900eba179c7c0f1c935ae90faf52" + }, + { + "address": "6ZEir4GMrZ9dCu3LjF1txAyKxmHP1Z6B64", + "secret": "567c951ab4d83106e0ec0dfcabf84d9d4f553e828a8bf29ba3ebe2c3f2f6a6df", + "public": "026eb292c89a292a5386cf84cc0150b9d246b80e7993b15bdb63ac6ad84ff3ebcb" + }, + { + "address": "uF1CcstJsQwissNWqN6HUzbedUVHeWN919", + "secret": "3063086d76d5cb9e8a6b5fb1cfe9cb962dec10b02f84b52823ef66a29031b883", + "public": "0374369d1129cb7e0ee36c245f1de5cdce492addf44a3121fadc088aeea218b41c" + }, + { + "address": "LumhVq7XrSSzaV6EcGFcNJa2PRhUw4EvRS", + "secret": "b8e85174ad383c1b31cf412e36a8dfc5c7a70be075bb6dbb3f1265c8d45a1716", + "public": "033e763b16e8be84bf728c03a8a842de3e9b668db298e1d7a9a42fcbac397a87b9" + }, + { + "address": "928Epy9MYb3aXiSX3jViUK2quJUHddzm24", + "secret": "3b6bf331929bba2a60117ede5aa6e82be42dcb59fec6dfc8b7d56da04229ac15", + "public": "0247c4215f2b6d5b7e9741b229653aebcb9fd407023ce710dfa8a0dcbd6f2061b8" + }, + { + "address": "x6fedkRZ2f3uAFWYuAhMHbwvezuW4YakrZ", + "secret": "be633fc2e4797327d173ff4129d17b7f00164cdf4e6bcda36575ed50e733f6be", + "public": "03b73a0b399d47ce4790adee1f5b7cab3beaf7d127ce8137d93fd8dd0589e69fb3" + }, + { + "address": "jzij8bbtnsQMJox9mVxE9Wbt2cZji1av1Q", + "secret": "6c5f2687c2a14db0bdd44e293294da17b6c48cf1a245dec3a724a503ac7d2d20", + "public": "03ea4ff6cc2f3bc601adfad608e0558418bf0982b803bd6c61fab1d5f7082504bb" + }, + { + "address": "24JypXuBsutTE9Au31byi6cgYUVfXDa76Yx", + "secret": "caa801e43715a4080604ab1962a74b6985481a4c42377f5c210b969bae817522", + "public": "02fd5562bea861fec333eddd21a49611e9efaab8e593b7f8898614982e414fa537" + }, + { + "address": "sq1oxMdWKu9y1GqYDQzydUsLsnCaSsgFdV", + "secret": "115a9ee9d3a969c4c6777347e3047af13158f6b2feb2f96a207fc2bbbe6b989c", + "public": "0357723a1e36cfc4ca932d05aef4ff571a74dd01d72bb21df6a1df2b6dd6634c06" + }, + { + "address": "XF3MJCJf34rbZ71QSmTWzsc2K1EW5zp11L", + "secret": "a15da09058bb45eee32fd2ea2421f1cd9910e1f822355aada7abaf98ac09820d", + "public": "0296785ce0760c05db6e9f81d1650d5dd71a70fe9881039592e91f3ae1f905cf37" + }, + { + "address": "2MuLPu4CtC8rCaGvVXdaFsvZCGEBSFquKyT", + "secret": "c2d06a485140ef111c0df041d019cf7f5f6f2a57a88f98b4818bcd3471fefbf8", + "public": "02d037fa293b9c13d7332fb57873a5c9ef6fd3faec48e2192073e4cecafa383c7f" + }, + { + "address": "2AjTTLFwqFBTv9B4TqEttxgGxd6qdb6Rc95", + "secret": "00755ec32e300f700b65e584e00d642a7f94b68bac09fa56d9dd52f68367d06c", + "public": "021767b3cb8da064c221e18e5da4aba858c0783253b807cb0e7d3034e2a6971a40" + }, + { + "address": "YVao3N44KWz1gWwFA99SzE4eEWuiNDQa6", + "secret": "5d419baf49e43360a2db92ff445473ae5369a3854274088447f3b8aaa730e4a1", + "public": "02671cc9348c2b37412f7be7f44cfaf887878faa61ba2977d76a341121ec8543f5" + }, + { + "address": "2B6CQHAyf7hXBdujhdth8m3iXeGKoj1cUy5", + "secret": "5ce953dbca541c64186c6cd9be8ea528b4b2e46ca018da86c568eff924bc2950", + "public": "0346f13ae7df82aeacc3f1a0264b7e1d710f09e8464acd68989bd4009d8df44912" + }, + { + "address": "9qNtyuayg8LsLBxwByHFrSo6dMK5okoFVj", + "secret": "22c33cd73e3c93597e7a30e0e2f7263100dff55d1fbb1cbc28862a4adc01e393", + "public": "039f4e4dcdc790708675a86f89ff79ece90e2d2db6963453bb05639cea1277e0e6" + }, + { + "address": "KEaVf8Zwk9erYrwqYg5vLuTWGDZfFZvzH6", + "secret": "52b2e3d1fe43daef1de9ecc03f26d769d2a585e75caf027dcdd8e9a001de559e", + "public": "02e4ef2ea0fe31a8cacff87eb21d60c54bae50e6e69c725c06dae4851853c1f821" + }, + { + "address": "273HzqvvGsbfqN4DzmLXSHwxoQGvr6h2JDa", + "secret": "76ad5b4e12a5ab1a7b8b229bda86214d00a8c96a48d36ea2b10c7407ce385477", + "public": "0251e9738384fe9bd8c9bcdb49db45b37cb817032ad5e972bbc4e62fe221f6537e" + }, + { + "address": "tCmpCM4QEmcW4KmfyGJHCUGtdpwKM95M36", + "secret": "430d620b2194fa6ae143bf501ce4c6afa86cf59deff48e94d4a61aa0eac3af84", + "public": "0336454abd9fcfc96d5b9089939265878f0c192beaab0266792496b3547b999624" + }, + { + "address": "2Nr54S79UTeMQai98FHMbytUvoYpVhhTXSA", + "secret": "302e30106eb4510299016075449887cfe695e7b5bcc64acadd2b9257caaf8307", + "public": "026f54ddb61336452eb33fc82ce2eaa1cb2a1fc463d5061a6437e6a379763d6725" + }, + { + "address": "VETgdwGFKAc417h7jG8AcpDWvVaSvJja3A", + "secret": "ee896d44fd6a6d9a3c5d54843e1d5e2acdfd8f8b94a89e971af11250b7001ab6", + "public": "0321a92b89701a16780e524564a01b8a8c487927f6be5e5d1e8e503c1db8b6656f" + }, + { + "address": "aDooZkbTToo2zhsthv4DLzy4b2sB1hL72y", + "secret": "5036311405ab856a08752b575c77f9689d034804fd88013cd61ab1ef8ecfdc88", + "public": "0332eabe8dd5ad5bf2df2eed4c194a194688f55d559873362e19879486395404fe" + }, + { + "address": "2TeicjTeiN788NHkpLCYXabcViRYRzyHnS4", + "secret": "0d5615b3585c8039e8111839037d5f278761e3e2516ee747b92a8bdfa8a3042d", + "public": "02e46c9b263f06841bb8df6d05edb7f965272cfd7a84c79a7cc34eca522f3d5aa7" + }, + { + "address": "9gAGvw6ALttV6qsCv9yoHn2duKkvawUMT5", + "secret": "4461a0e36f4e178dd98d073e524f6c175c4af13d69e5895ca7d113155b7058b6", + "public": "036d44c748a5f4a0da05e9f08412ac59370fcc1456657c8da02696042b6e549319" + }, + { + "address": "2RymuWexhMxWGqZMK8H7gjcpKHYzJ7KTW3K", + "secret": "fef98b243643886cd6eaeb4b03718b2583e98a5cd335f7aa145888df0e3e62ac", + "public": "0363f7994223cc65f5c344a5418bedd4fc7ec3f153651fe9babff0e387c07cfdb1" + }, + { + "address": "tRzJDgcGujKjFLvhiP29DwCFcSENXwD8NQ", + "secret": "c550510324920ebc38c2b3d8f7207b45c72f53146bbe75297f65fda29adefe70", + "public": "03f1c9b77f74670325f9ed5c9144405e227a4ebc19fa2f71f263197cac542f1090" + }, + { + "address": "4fnAyeKwaaFqhL7KpWVk3dXGjTUKkZMWAE", + "secret": "adefed215155b9c86cf6b529cdaedeecf54813be2a92b7e25cf3607b635def63", + "public": "02b9ee73048d5e1547f6064c8ef19a40e334c239a0d50e2e7742881abccf4834db" + }, + { + "address": "cUg6C5xPeULFUYAi7k5z825UCFktGr8QHg", + "secret": "6ece6dd12c75bbc6147091af4ee1eb6b9ca83daa4c8c74fb857dde9a559ff354", + "public": "03ea642b0f6dfe84807c2be013b697e811b056f38854185c0624e509fb115696b9" + }, + { + "address": "vJVpVYYvDY4mA8kdrtuo8W1A1TeyRqou8y", + "secret": "a1536d32a2a0b53847cfc69a2ac15934c8f4b5d5d3601a7ce683f454c958a9bb", + "public": "031edeb3a15926ab996d39934138f4776c8903cdd2b3373b93464a19352fc0119e" + }, + { + "address": "y8hhvxPjZpinCChM9K2PLDBW4g1av1ZcHE", + "secret": "e29e15da9d8b981d7e511eee9ce4b3320b72eb476a7ea405431b15ebb04e8a9c", + "public": "0220c85610ff73b1eec67c09305d94cf094acdde37396da909de697e6c2a91f9ec" + }, + { + "address": "2mMfN6DGbDSjaUVVkigCvBUvrW2Te1jkWCt", + "secret": "8409735d24e573dd2c8b49f9eed1a4b43a92a0b0538fdb1a3453b012b7862c41", + "public": "0203e0317f62b21015090c038e8402cf9f68e90b4f309f848479290fff989ea77c" + }, + { + "address": "2fZZnSM65DF5XKtnNttaVkNBAEky9GNdoEG", + "secret": "ccc43a9f9b194263c547e8bc7c386513d0aeed9d16747e86ff0be5e70994515b", + "public": "0358b3ce59c1362d05214c30b581fc4571053672e84c4a7bc2a94293f4b3f47c89" + }, + { + "address": "8yh8LN8kFCg3pXqEtzyTKNMwyjNAVDsNVU", + "secret": "38d2135b506023ea860c37fd7b7744daa81e25f170a746cbcd7dc0ecf54e2415", + "public": "02112e98e0e9c524440a36f77cab80a971369f4e21d9e19492481318ccdc081090" + }, + { + "address": "jkFvb3j5YzTCg1LnEKrUGnjbAQmJqFhHuc", + "secret": "be596616d27c8e0396ebefdcb1897829bb39a7710b92f17548ae6812cb367b2e", + "public": "02959ca4a318184bc71c8e7df8636fc4d6cb3704386453967972fcece861df57df" + }, + { + "address": "m7QnzaABKgNqx4ekdVLf5SdWGUxVSFgPHP", + "secret": "d1c9d0827322a843c37fe58d3169d145d5e8477f9714e44ac6575de9f20c5bce", + "public": "022169ceb4f864b4766f7f1c085564f1334a63c6c7611787ea7f80828d9e41671d" + }, + { + "address": "2Db6fRqRY7fkYpdFMp7ik9eSicRHUPcXXuY", + "secret": "1ca5d69c367a4dd6f7ad4b702825e17fe66a2c0a6e219b03f00f4648598b056d", + "public": "0215e7d934e04d7b12385ffbe6e55b4dd539d4bb45b138396c18c5aa9854562896" + }, + { + "address": "6MiD95xbpTiX85WaezBFMx31qHU2Cy8mGb", + "secret": "cc3e2454363c09febf2940941b07477d226af5ab09d598f57818423586ddc3a7", + "public": "025ed910484ad0d8d837475339882248638efa73f1d96b29ee681b8dd1f3e710bf" + }, + { + "address": "2j3PE1Gnw7dimka8tbe2DWM7nadFtKZDRCi", + "secret": "b33249380ad2c5ca60577db005bbf15e24cd260e5dbe06c8da9e877373d79bea", + "public": "02e90a239e782a8dbfbee2aac3d2d729bc45059a80f67ee3d52ce4e24b24a7aeae" + }, + { + "address": "oUmQZvH1kKqfKEhj9EkjPH7mJsDd9PekUH", + "secret": "ed2166711c446df7efe1615619a99ae9f9192cd548f28c2d76e0ef224003ea01", + "public": "03f2707b4ce0ab1664b4ec6ca958e9a6ad53de97687b933b11f36309c3ae9463ec" + }, + { + "address": "P381ZTCxZB7XJgTBnv8Je6YdQj5oRCnWrV", + "secret": "20412f51c1283546151fae13238c8173f71517e839df2399f59d6975d867ba00", + "public": "022fdf6aab50d1c7ba9f07dca660507294c2347e9f0455e9d906a8b76d46232be5" + }, + { + "address": "bvjjm4USaFY153twBg4k11mKKW1SZri7Kr", + "secret": "9ebc684f04adf27593e3d3862042c867d9e7b93a15486d1b910cd3df01d6f5e1", + "public": "03a26dd8d7c5536fa1ba0b8ea88974a1449796bd7a03613c7a8d0386f634d83605" + }, + { + "address": "SjAB5JX8MngBBmZqHAQv6b4xBf8EU6TUdH", + "secret": "ef9391016d560ed1bb76e27712b3eafba14a97d765e3a2c95e4a33c91e3daba7", + "public": "03e7e8262b1b397ef1f5d956b9b4ef46a87670c6e74bb84dd63d649074d6a90d95" + }, + { + "address": "AaowUNsWWGCTSQt8Ubg9t7t66WXgNm8qj6", + "secret": "ce21b58c3a7f7eb5d7c5231a906215a39d13771d903ee07b1bd6ed2175180f68", + "public": "03c5b1e76ad124d9558599a670af3f196aa8380ba2068a3f8fd86b78959553af50" + }, + { + "address": "7M5c2bpc6vChU5LjgSenmEiRxKvFrjdJRm", + "secret": "a9b800fd9e55855e3938b2d81b7ef5f38c3ca48f4ff6f16e2a846bc8924daf9e", + "public": "02db984277e99de74db246766d96923d0da2025588bce93b3002f67020bef74a60" + }, + { + "address": "2A5Bu1Ho179P2EyoNcY6iuuweMpnTo6Dszj", + "secret": "916a59a3fb9e8cf7ca8b57e12c479a3bececb4e2cc045b138c30d24193b2907d", + "public": "03f05db64aacd7f1872deade0890c84144ce00e38a5dc07e2880079f8e480a2eab" + }, + { + "address": "25dcnottoLnueHerPbKAhZRmUoXjKHpUTi1", + "secret": "787132dcc79020e6037ad2b33708a2ccf0221154be3a53779bb13ac7fff938ab", + "public": "03b740ebcd062875de83f984c37d71f1dbe56b054bb39ac1d1294d52e8cb702d58" + }, + { + "address": "Yez45aeDFBzSDLpLRT4j1ZW6Wu4dH487QH", + "secret": "b55fe82dbcab00982ae20bdc5d6d2205132161e91eb4bc80646e5d3e56e26deb", + "public": "024b71d54e31d943a04299bee61abaa0410b665724fddbc02062544521826b66c8" + }, + { + "address": "4wzjraRSLhkmQBfdzPYu9DcLoJCLtg4PjN", + "secret": "a0297d49a0ac7db02f303fca9e342fde7d3fa9588322a50be65711f3b33125ce", + "public": "0363eb9e525f712ce3549366d42944d9bb11f4489d38f61d30bf319f242f0bfcf6" + }, + { + "address": "PCgs68kierVHr2ZqQKkACJe5uFCaqn4Twa", + "secret": "362097a58bdd050e595df2f2e49ad7be2202eacb5a7bd86c50a9b44c9d10ad73", + "public": "023f74ca7041a7d9f3ac4c524f8686018d8a24a735fbf942b271ceb2eaa840c875" + }, + { + "address": "pJ1EMgaUEpeTSXu1X469gtXhjd6RvCjNq1", + "secret": "556e1fab62c57725765b5250062b6b9e3d2af8bbdb522255d1304f12047d283e", + "public": "020a6a5ab65ffb60e706fc1febcdbabdee7f8f3f916a2100dcab925cc8ed0b34c0" + }, + { + "address": "PY91kddKVU4mVe2pcM4ZmEvsdP25rFze7J", + "secret": "23bfe9afcd904fd9aff9838dfd1edd67b897cc9b2aef6fa5eeff116103887a6a", + "public": "038824148c1b8ecf7848dd3d1acb359423334c5822fc46dba4016da02810d30f74" + }, + { + "address": "2NRQSCu82A61Q3Crm6fMJLUuwEnwMraT2FF", + "secret": "c352efce59357fb758de15e09f00e2638b504123212003157a3917e8f41a2e96", + "public": "0202ccfdf6248cab6f045e620789fc7c9eb2a561ff80c2a89f0cd478b15d1576b0" + }, + { + "address": "3RRzhD77qJoXvM6v5D9qxdHfoKjUhnEYhX", + "secret": "63c1cb5a1c165c78c847548390a01b8bff6682a1b247373ed6887aed21dc4bb3", + "public": "02d608b2d0df929b6ab7b261f5670d53f406e27b2bcfb00e024dd256c85623b77a" + }, + { + "address": "2d1BVVuCTEhTxdKfKJnRYB1QZvAZQnzKqKb", + "secret": "c888dc692ac017a6e7937fe04612473ee816f3f35c0a5a099d13adb9af7f7571", + "public": "0219c3f2baf3665dc97ddbeabbfbda43c37f9a797c66623c2d2f991e8b39a99858" + }, + { + "address": "HqZLYWBYACeiSgC3ZugJuq9hwgmDTrDgRN", + "secret": "fd1780ef43c24ede009e36107e15903a29fc150a1581a7844370e440cc922e56", + "public": "021ebef79e0e5afce2d4d4eafb2199cd558507ca1a0ab33556c464b41b020aa5e8" + }, + { + "address": "2cXxCXNXbFx6vF7AyK4Jq4Tn8gvL1tGxjJZ", + "secret": "fb90dd91878c0a09f823b8142f71f702bbe2cec4319403b37967e17cef6aee0c", + "public": "022491a0e903acf81c62f8e13c2e342905374acc4afe48b8cf8650f269899e5bee" + }, + { + "address": "u1qW96EaRAuxaKWTJT4Uu7v1EEiiDkDbpT", + "secret": "5a3211ed2aff62a77006ae14b4af4cbece71e3932fe835cab03e7778b42684dc", + "public": "02676a8a39902a79d7057b177552fa7c99ccfeacd8d1ed5f4cef52d20909bdf067" + }, + { + "address": "K5PVBVZjJkg84f83p6A4Bu66NJPJBoVHYp", + "secret": "1214af921adc1234c210a62675b5c4b962be4708638a67b2c840b950a7da2bc3", + "public": "02ac6ece3449fcaa163302eed3e3dd9293a46457533e4b5f28c137bed59da53e4b" + }, + { + "address": "2Gg92Ak9qtPMmijPb5W6kB8M3S5J41qwJHT", + "secret": "7a9d1e7742bca2aeb4a5b1a2bdbb304293477bb14345676a27a2052e5d4ca1f8", + "public": "03eea804e1a66b4b00ab6957a03e07750b9bf716be5deec43642e20549f54af1e6" + }, + { + "address": "CmFiKdFeKorB7hsKCmjhKCw8UScJCfXx5d", + "secret": "7be562525ad05357770a38a48380a23ee8d1b9b6118ff0d36f1205d3b265727a", + "public": "0316c776b70f4ae4c158e68c3393a68b3f9bc76864c805386e93057fccde70953b" + }, + { + "address": "29tcDz14WSM58YkXMhaPJfiwUtTJDAXt2zn", + "secret": "c0bb01bbb159b0bedf44cb7ba6f8d688ba94370daa08bdaaa5b8644b57045758", + "public": "029f5edc881fd9c965626bd57608b3d39cbc03bc12891684bd3545e02e77932c98" + }, + { + "address": "23QXSzuMwpeTpdfag88sM7teo2BC2dEiqUm", + "secret": "34ba38674aef49b33ce5deee37b685e6ebec56f3e1f249c4d9ef6bb5169c775b", + "public": "0242e775c22b176ec52c313fdb2c070c34a1de75b9f5b0aaeb5c4f37858c7541e5" + }, + { + "address": "j2twcqftn4NGiaEKTG8C8EE8ThV5E854NL", + "secret": "646c729eb1df22aef8c1ae4ae5fbc493241b2beffbed8cf80fe29b59c61b5946", + "public": "03ceae5231f5e67bbc1958e45cd8e13861373bd273f8a014c031af845384c26642" + }, + { + "address": "XPNkBF8xkXbFZnwvJs2mGKVtzqbYT1sxMu", + "secret": "69e76a9701546342dc4a67b4b96d88387113cd0ed03334e76ecfb7f760539b90", + "public": "029dc62e8c891bf8996292dd7b9dbd4f35de762e82ca1e34075aa7772f3bde6340" + }, + { + "address": "2GWkZ9KZZ3tqL5b3WU7bWQBBAPTnoffrRch", + "secret": "e8b1495cd299d98bc817123bc3925aa58b43d80fc2e54f2572bce0ebcf890167", + "public": "02763f7a152c2190cabe16a1f29035c6c70b80a3636e5568fa4fdfcfe35094bfae" + }, + { + "address": "DmJHLWMHp5JNCFcpwt3JmxbywjNrne5jEi", + "secret": "8c2f4d83eafc53c13a85ff8035403c61d9e4c17f1453cf87b6be7b0dc6ef9e9b", + "public": "0371288fe9beaa9fc75a63444803969ad821550141e74712e9dbee02b21725875d" + }, + { + "address": "26jmnqf7s3FPRu2wLBqQc5KfbBKrkgtLerT", + "secret": "026406771a4e3b8baf98de0521150c91eb068422d37af2974bfc6ae0d4fdcd50", + "public": "03e47579aced7c10ad1c479e46e13e930b535ac90b628d29d89f6d02a75ce6bf80" + }, + { + "address": "2UUvsfNWQNycy6smEG8c2bMNyCh9qQ9P5EY", + "secret": "1814c9a6e012f1b4dabac7e7040adbe519e3e8071c15089b5620d091e3c26cc5", + "public": "020429f24353d0ebf7a17c9acb952df72b6364a010c69d5d98c61ccb462a65b2b5" + }, + { + "address": "haWRgQvuH4MdCSyjAUxzzunVLwNi3vgoj4", + "secret": "5ae9f61a0c40f15c178775033192c68581f7dc014a5c7f23b1f8342e853a919d", + "public": "022139698f089264428fe2e194d7ff0138e633f3b21cb39768b9c6f65dfa689eb5" + }, + { + "address": "28wV2r2XHDMdAgriHeYL9Mq1W7TmJufBwp9", + "secret": "bc37955215e69841e42c9881e284fe53eb090598f3f511fed533e3e82478e83a", + "public": "03c2c2c3a698da61e8a3d95744326e1015c1842aa84a091565cd3b235b1d55a16d" + }, + { + "address": "28WhxGF5tSuvWF4D9tSJqp4Tz3dAynY4rkx", + "secret": "c7666cc0687a4cf835972c65c58f5a395beca834eeb8c7e0db1e87de1ee5ea43", + "public": "03c2ed06a2d7c5ab80d35d0c792ef4b3c9630a50ebb6c23aa886d4981437c79389" + }, + { + "address": "etcmKzzd4K8NT6n8aTiMtUkNxFc8sz8vyx", + "secret": "a3fd517ccfa8ab4623d02331e818c4d713e26f7cc7d18b2a7e1125ce3e405335", + "public": "02e1438126acabe6a4c2eaff465a5b0899b4cf66fe762f92434d6ad91b44a3ae3a" + }, + { + "address": "F4YnpYwedDV3DSuTVgAqN2F7mikJkRhcTP", + "secret": "efa78a590bd91f5b51964d3a4537abd76f03c41d93e2f68923df89662f52d32f", + "public": "03b05cc039402bd180818546c50dce27f21cc34f85d0f0a108fdadf8a6aa670d82" + }, + { + "address": "2c6N2MabsomEg3JKDkch4Jpz29bsNU2chWp", + "secret": "f0873cd7a110412e885761425372f29c72555e50fbba2af0cbdc2745f60717b6", + "public": "030da68239a9b2f59b09726846321a3ab9268912b01802743098721229b4e36c90" + }, + { + "address": "23LApPWq6hQYCe6G4cgaPnYVS8pAX84FBaR", + "secret": "52aa35161bc67fbeb4db60e92872d737679da25a4fb65331f8ff49cebe9ec56f", + "public": "03038fde27b7f8ef7554632abf454ddb8e0dc428785851afb742599a4a69371822" + }, + { + "address": "xFw9ZDCbQFG7DpRiQPTzb2WNRHqrkj7RGQ", + "secret": "eca2b0b5b6b1d84723b01384112f25786c5c8f3445c941070a71cc76aa95ba88", + "public": "039b957325b2c35cd8734b8d1cf83facc02e497ad886940350a68e2f480768b0e5" + }, + { + "address": "268GpgoU9Hv289M8Hse1akwZde5ag9uj53x", + "secret": "2b5b22635f3aacc25b8e49aeef42bd6d64a02417a80e9ec724a68cb219a7c0a2", + "public": "02d8e1b7b6ceee82a2ed233139abca00cf638c8f2398d477f0dd06b4660e294f45" + }, + { + "address": "2FCo3HNQxWgh5K56mfG2RwLAvzagB6d1jah", + "secret": "4d9df01b27be68b30693b07335823009231b9da913c91b8e5d8b8d4bf0f52f5b", + "public": "0313287d7d4684f66fe587df1543766dd415c9086e8c95b8daba9242d0853b164a" + }, + { + "address": "2MpDqMjjZ5yULWt4CVDCxdPQGJVuGhaajfw", + "secret": "f54df30c69b3319ed9b23ab5a6b8f304bde489876d94a321929551d0a8308519", + "public": "02b67fe14d0c9341f3ac2aee4469517c8afe0a7e4377bd17a23016a08489f4a9a5" + }, + { + "address": "2Xz7wn9Bxb2tszHxPDNgewe4FkxQk4SccBT", + "secret": "2c1a5fd49bb16649b9a928dcdb0d3c1ecd6846a53cc59d1456883b7669dc89fb", + "public": "03c627ab67dfafd83933b644c17154cb3952fefd97cc88d80b4710c0e90f4175fd" + }, + { + "address": "sGEef8vBoVE4EroM3Zt1f1isXbpyEkQDMb", + "secret": "8a630f2682bd44c03490b6387bae44e5842af0b6b08b2b1c0a4549e73342fb53", + "public": "029d3349abd73409c2ab4ca0d69159dd09f3648abd85128f559a422a61499cf46d" + }, + { + "address": "HxKmR2d1tRHRXeAQ4tL7ekbi3MRfyHVWow", + "secret": "3d7de091a784479b3af9ca73d8dcb8646b055b33faf8ee18b88a188a6048bd40", + "public": "03fa8f11fc56eab51d0f1658b8476afda73eae0e5d4adb3af4e721fcbd732ca25f" + }, + { + "address": "2eD58A32HBAUhHVfCgF9udzJRdswTuuG5mi", + "secret": "6d6790b0807b0dc719eddfe623b1ea711075609d3be17609731f5d9ed05d6365", + "public": "021a69827e26d0c81e1fd1a690f84d94fc183bfc066e8aea1f0485ce1fffb4faa6" + }, + { + "address": "2e2Mr8MjvUHmMSf4DayyoVqgSerZyFsK79W", + "secret": "f09b7f763a7cbbcf01a63a81dd0a60fa014e0a96ff609dc544b3d003d0f82b70", + "public": "02746c6784634fb65f5d0b6a73a023464c47a4232831b548a57b5d4039a177388d" + }, + { + "address": "27JVEagjW413PVigf6ALjqNCgm99xS5jj25", + "secret": "e4d69a0e022f119941ece60c0b0fe8f36d93f7f7115fba75ba6c3c646bc0b804", + "public": "039ad4b9726873f1ddd35ee87cd49aafd1734cea699ed9feb3c5fcc6f5a20ab237" + }, + { + "address": "d2LgfFBTFTwxP7PyzHwpqhHKc4BLPbA5cv", + "secret": "fc46fbbfa893010b6b3b7a82aeb52290d58f6d14d25a68232f0143b99eb95966", + "public": "0248ef5a23acdf96f41e3a3f1b796baa6e4bcd303f223f92b34025f11f3875117e" + }, + { + "address": "DYnuqgGZsGk49sU7c8SFqCezEzeZMnYT6h", + "secret": "dc7b04fe3530713ecb0bc55ad66236040f3df7962d0f7764184059a5300de5ae", + "public": "023240e626ea68612bf3a722df5cf567052e807a555b63eafd3c3fdabab1aa60fc" + }, + { + "address": "2XpYsb37q5XDQHvtK19wZbsTrNzkH7BVc21", + "secret": "b2d00fb19032ca52ab73f6308248e3fbdaa6e747a5f00af9cdb4fa914d76e19e", + "public": "021a7d5d53479b596f9510b9fa23e682dc02930e715550cf70ef9844c62a9f7944" + }, + { + "address": "ucW7K9gf3qU3RN2b4i6bGxFYrL3woqAGgb", + "secret": "9ad70994a257aee7ada71f7f93ce52973febe7cbeeeaac7ebdbdf1e6c481dfec", + "public": "02ea5e47e063bdf92c93e0bcfa3ce25fba9f4df0c28ff008c6b17737bd0e994292" + }, + { + "address": "25fbmTF3vThUywruNQqVXE45sViGFJREY18", + "secret": "f62247d6d0644814ab52dd187d34a409d7e4fd92cf84525adb6703a1d85aad7f", + "public": "021f05d696dedef4f9739c6a7a258e49d62cef2d53c23a37a0a3589f95e6cf7b02" + }, + { + "address": "xYMp4hezFHZQDDyRZeAdv12fwaCiJ2vMdY", + "secret": "6b4ab66f5d8913678ba852718f6ea0e663a6433f7f3d748966b4063c3a6177d9", + "public": "0302f82272e3d4ab41c5f2d90af3d457f1317ec703cb28e10f657f34c4b702142d" + }, + { + "address": "2QtyuU4brhrHAfUTKba4nRTMzGk1tEXruVM", + "secret": "6e9aa8ecbedcefbbae841c8b9abf7c72d047ee02d02ab3de3235e02d24d9bcd9", + "public": "03eb4850fb800b164540382b34d7d92c07f054383c4c5e8cd6da2b2d721fb27c42" + }, + { + "address": "2kvThk3SQYaNSNN5HrjPTbTFM74vXj3T65T", + "secret": "bdf9c95a73abeb67f87cb4cd628ffe1c8f11efb6538feca26b50bd8697b6df2e", + "public": "02d4cec5d6667aee1afb4c077f34031b05879ab4246decd0eed08218a8bfca1778" + }, + { + "address": "gEnn3tL7KwqmVuXQgndgbdxKesw8XLwMJ4", + "secret": "e98a343f67ba8e50dcdd8d23a32bb4fca328fc6c3ed3dfb21646a48e396c0c08", + "public": "03a69b41e972c2735d740f1c1e96b7bfcc9c20d157c3fd6981170f5171fdb0a5de" + }, + { + "address": "QhJj9DnTETkK6BKN5hX8CNxoiDrpRvp9p8", + "secret": "e4e661663ed2750e8abdb0c6a66dd61bf3883155212c83e0d6e2ebfaf47c4138", + "public": "02e8d9982798c5f006a0adcbef9ec806a894bc88de7adce0b7839a197a437fc417" + }, + { + "address": "occqAdzZCGaz6ZHLmyW1FCSrRcL5Am49Pv", + "secret": "20b851a7b0615ceade0f4777e0d58b0f6f8531d1e367a4523f8f182d534bfe55", + "public": "03bea4e1361b538fe990a04555d9dd02fbf7f7b6a7e04fffa80914a5b1f5b9d74d" + }, + { + "address": "22YUVaU84KrbVogn9sjpATTEVH4KsVWdmsh", + "secret": "d75b07572d7bbd6aed033392cef11e46ea53b07a309e10a88cb13b7dc7b895fd", + "public": "0235ac4849583dde931ab62f283ca3b6788acfbcdc9118f95e8e70b9235b0f20f6" + }, + { + "address": "67Bvi6FjvJrmtVs8knw5jrhbB9CHbydGmb", + "secret": "f1ab28b4d9a4e7154200f9e97021b505680f2b6aff67b84556d3595f24b3526b", + "public": "03658ae2dfaf17d476e66d3fc37c60589a358dc2cee8a0da100745672266c6f174" + }, + { + "address": "234EUS3L1CSktQjv7Gew3XyuiWfuyYsW7zk", + "secret": "34d2973733c9907551bd889bf373e43a2e8c5b725c047f30fd280c11fc5022a0", + "public": "03f26a30354f239883057cb42ef7c332ab02509d0cf65abf0a4a62023a8d649ecc" + }, + { + "address": "rh4HV53HPjP5EVzovH1N3MpS56xEFHBWR9", + "secret": "1ea8940d0b18999efd6f6cf7d59f40372732e10abd9f08d2bdf366fe3daddbd4", + "public": "03eaf9fc065239fba9e5fc042b250988c52aa6ac9e5775d4719004b20b431297cb" + }, + { + "address": "2YzJk1MuPpnAvKXYMTyRM1VsgwrvsdxfjT", + "secret": "bfc39b678b8ab0c31baf501d510548b7e88f1a2c4c0d61a56d99ac334eb4420a", + "public": "02e73b0cb3d96c20b4611e74cdb81501f5dc8aec50784e021cee7e3a3599eb8de4" + }, + { + "address": "2EkVeCkNTSD7QEaz88g6tL72174si87xSVL", + "secret": "4412a0ad23f28be3735698d4a086e9c285a5f6ae1651a95b526f3bed320b3de1", + "public": "02fbf462883546a2e516aa22f1f5f06c89a6a3b7cde80b59e7ef39bfcb94a78e50" + }, + { + "address": "2L8NW3x6F9fnMVgosWWdEcXmdkt5Sfhkyip", + "secret": "da5743dd6f09bd139c9c6e2105843b19de9a3393a7549c79edf91532387bd6ad", + "public": "03fd90e6f33e338fa4e9f6111396585c124b83d6b390b39f92d072bdd862831d7e" + }, + { + "address": "22ZB5dM2NVyz13YiuwvW9X7uKABoEbHSwYN", + "secret": "910176e477b73d66007ae2f5d44a7bc71fc21891ad1bbfd988d8badcfb1fdcab", + "public": "036d9ba5504a7fa6f55577ee34b5e8f2e989aab504dca6ba265d26e6518f5fc5a6" + }, + { + "address": "2RcNdAmomK5hPkrzEagpBPbJKPG1YhfqBZX", + "secret": "8b656b8a83350a408db0258f81c1fff913c6caf10fcb53049be6cdf5f6850ccd", + "public": "03e0e7fd4a33c7e2af83e476ad5d78f5fa91cd8f16c5f3a3904875444f76b038de" + }, + { + "address": "mECP2omm6nNKCRbUUEA3ngU83gBtbG2p53", + "secret": "3306fa898776691df724ca8b72dd5ebebe9a166a9f107a281b7e83e0bcf34d8c", + "public": "034a9096445d1401a979fc821bdefa15f44df8dc02ae88e051c6a7b45a577dfc64" + }, + { + "address": "22nsdEVSxa5aDvpFPeyTz9qpcc2h8PLzRt4", + "secret": "e6fe5bdf75d6e4f7aaea16388cf2450fc1839b088c415bd3f7b9a65958c08f18", + "public": "03349d2964d9d6dada8ae6934b76145cc4d92bc43a41edb55d548a7da36530ed2a" + }, + { + "address": "2gadfsU9qYJSKcjYSbYGjrRXffK9grr74T6", + "secret": "56d995f35b80a3046af165ad9dc0a507ecdafa9a947403ceb63c79a3084be6ba", + "public": "034010692d87e47df712c37a3490f096d4323b0148d71eb06756d1153e47de9558" + }, + { + "address": "24krePYfSFjn21YTDA2e5FAWZefu8qE8Z3R", + "secret": "493102a3bbcfb4178ec7c1072631ce03f7f3e1d07d5876f07c3902cddea3e5fc", + "public": "03253e2a852b5aa4f8fe11d5d32cb8364dcd5460665935b47138ab945a1b7550a7" + }, + { + "address": "rcqLsBcsWXHodbDaCLHcjQJKSJ8kD1q4Ff", + "secret": "cc8d395693f126bdbdabb3622933d1c0bc148a2d929bc30e66e22f07421f1592", + "public": "027558c499a52a96043a001f8999a6cd38a3fd2527fccf28d12edbc90fb7641aee" + }, + { + "address": "wvFzxVWV9xGs2ppokV3wmpy2C9BcUe3DZy", + "secret": "e8e09e51b8add90be81a392196c76930e876c97cb8b1df408eec8df13c215b19", + "public": "028e99b6990ae84d590aa30acffe4b9a1fe5033cbbdbcd9971022c6e249b43d98a" + }, + { + "address": "21124BfJReTshKP7zKthRyLAkjSnvbo3JL2", + "secret": "f452d999bbfbe7da6cf10d8e602a09543ed716167649dbc6b260f218d08d0a33", + "public": "0323535070dbdc40d0e3e5ce3f1f75af79922dafed3f8a3d102fbc891b9be3efaf" + }, + { + "address": "KKqLNqWvbsMZ5sYKAZpXLZm39jZ8zUamy4", + "secret": "0fd7f48cc79b6252dcbd7a24d5f3e4099acfd16368f8f2e7c7db356ad1488284", + "public": "02cc8fbdac02a1050df58a28793247184b810bceeda25b7e2879ccc4b695cdfd20" + }, + { + "address": "2afkMQHbNM5EGuVPt69yjjzxfPsih4hzfAt", + "secret": "7ef7f98aa685734f83c7faeae4cb687b246c21998d29961d5899757814a1c28b", + "public": "0321f6a774876011ce97bb51f15a35ef2aedee2bf9aa9e5a2be3193d7bdd4020df" + }, + { + "address": "QqrvnPdiJm4qg2PZuhAEYWCHo4s9VRzQ1d", + "secret": "3ccaf169d3c906c5475f0d2ed148a6a0bedb23b88df3a16f485fb7a27c61f465", + "public": "031d90572ce93b645673c299b4d3540fcb11cac5137356ebff65f29e47e75bf921" + }, + { + "address": "26oEbwGTv2tGemBwWvbANw5z9oW1odHLKU", + "secret": "cbdfa24088c30d9c07bf634e84a739773b79bfadea68db57e7e690cdce00395d", + "public": "0320275a12cbc4888b9b0390de849c2bf6811a128212e43c2359fcecd2e5bc3fd0" + }, + { + "address": "2bNwEBFte5ezxWk4hVB2gSDzh3YTacKYxKo", + "secret": "a216d679e012a931b34ddf4716f4d5184073afd962f3ffd293cdd1974eb5e919", + "public": "03fca51ddac76f423fc3863eeb7681a564f75c16026da6bafa50096c6748bf4dce" + }, + { + "address": "2M9Ms8uouj4wVZSd9sJXNFMYMDCBrLQPwNj", + "secret": "2e3757e0b1c32e5c930c27f9ef8a60f8eaf934b063cdfb788370f0f4a0b12100", + "public": "03022caa31c325e86fe4f9f28b7a3f4474587722821c7e0384a7e05b7aa6a8e72e" + }, + { + "address": "ZVD9KiPi2BjuXvqa2uVSUz9UVvyt6bCin7", + "secret": "16d14664cb9c65122d76a74d8fcdf542f5a4badc4e63da12f9a2e21a49364142", + "public": "027044e66f79defc67e06bcd5aab6921a985c1a78e5f9c965b2b8b576aec5be7a4" + }, + { + "address": "EWFzgYgdjU6CVtPXyP4WrwMondHoPX9VSi", + "secret": "bf6f0cf4e0786300a07294f18d9c0619ee77e224274ddb0b4c74ef9b5ae12bec", + "public": "02c402d13f5bda635669b0b384e2a7f937ea3668d14c6667472fbe974027f338fd" + }, + { + "address": "frgeQ5LGCQiJdqbBPmzJrvHf7osA95iCN", + "secret": "1b533323661fc93337c9a09546613f13f10c0dedb756a935791336b1c847a012", + "public": "022dc106b9222bd5779688fbc75010ee6f24d9491a7db1dea0bfad969d27080483" + }, + { + "address": "2Ygc9Y4SWt6pErg3smALUqb4nxe8y3Aa5SV", + "secret": "5aff64e7ee0c57c08b80c66d91c5db5d0892a7a182eaaf9fb775eb77d128e731", + "public": "0349af83b3db967df7319957aad339eeb85550e57835f4acc07293e2eb353de8de" + }, + { + "address": "VZSQ6ji6oeLZgxd5Nzzt67JPUFzm9oXa7D", + "secret": "bdcf7de5460ecaca02d4e485892a4858ad4c4a7a17d57fdfa8f311a0a3b386c2", + "public": "0335f1138f086f04fba73c261ddbc263f9187454b9dcaaac91d2f628ff64e2d7fb" + }, + { + "address": "2UtPuf7UmE1RMaKaRnQnsUmHsHmTyv2GCqd", + "secret": "33f62c9b2d5984aaa7df578a2d8109a010f400b522d95294dad79d0579b69790", + "public": "032c2ca487f68198688cff80a29f59ff68dcd659082b8b28e850343a810702b6d0" + }, + { + "address": "CQNjG6VeT7XLoFd2DHxj7Bdu1ofdkvf9Hz", + "secret": "0d323574b86731c76d23912641b4272aad76c610641794f6008de85245d90501", + "public": "03cdb086cb3d513a001501591289093bff66c0e4694390b120c9997af573789fee" + }, + { + "address": "cFhdRpgfDXFD1d9tzSGTDxVkyexiHHbscT", + "secret": "04b1bc8cc808c62c32ff387b2cfae435b3fa48e6775a98cf564e5c77d58c4d80", + "public": "03214b11698b52fa5efea3549a08c69afad4d14d2e1949a267f29a7486f40d1662" + }, + { + "address": "EPqkNxDnvQorZaKoEtjGcGKURNcywr3dny", + "secret": "de6c09ad0b43723096aa1b5ad133a194954793f2005066d2f3f7f629bbd14429", + "public": "0285584deec2240b44f3ba9fa9380b39aed1582896e38fe0c8254bdb1e14bd7f0a" + }, + { + "address": "UhCE6NpRtm1Bd44MkPgVKToavRRLqoJbDr", + "secret": "3fb29d455a7d5917a88f001aec8bb44ea20d17d7a68019b4e29320cb1bcd4561", + "public": "025c453cb7b8c4470678976e1e08baf10852d9b28a5a21b55376766f302af15d32" + }, + { + "address": "j6rcr86aiDCMtHj57zQt3f4MkG9zoscywy", + "secret": "1e05688f0796d4bc347a92bac8748bca26fc4cf749836672d240fcae8b8ac467", + "public": "038b8875d803161483165346766f9a1bdea5b123b38d7705538d6a1d8d5cdf54c8" + }, + { + "address": "G8unj5XY9mKMjPZ66KNrADKojueP3FxpFV", + "secret": "4eb017d642be8864dd5c54d0e81d4804fd588361fa14f31b099cb5211a0b14e4", + "public": "03c0b736889e8cfa84b9fbbe9053f508a5cfe44c6148e0b575cf0d136204adc9c0" + }, + { + "address": "iEY1wongyqqfMMCwwKa6yKnrBPzWRv6Cjd", + "secret": "205d5d8cac7ef46d7049a8e360b5db56690c939178ca1cd46db8a686d9f2ca81", + "public": "026953569b00b6d1545899246f12bbace2fd78f568a004d0d08ac61525c0eb8e10" + }, + { + "address": "8MofVFHLEyfDbybjEuj8Av3tvtAHm7aB6i", + "secret": "b88a93973a8a62453a83c10e00817112922471d2270d1cb0c8490fffa98ff4a5", + "public": "034abbe2d59395e30fa5e769961bc54beaa08598370b3e85193a9e200d8b18213c" + }, + { + "address": "LokNHE2zyrZgjpXXWrWY5L5BNsXR6qJR6D", + "secret": "fab1c44ee39d0839860710e49df3f47b35d48465573c0251bd844fd90a6366f2", + "public": "0251740aa6f68cb3290cb0d72db8d9c03447bc747da7f272847417cc8e40330e9c" + }, + { + "address": "NXV5XL7rggQ8GAPDjJ62jpXkYGJ8VAXSba", + "secret": "631b5a1fd96e7a99ebe33d4788a8d6e45a6d4b116b11bac53aadd116f39c4c11", + "public": "03670833bc074d7009dfcd1a61cf5b63a08ea0bd58f0f295121b8d5825d897dba8" + }, + { + "address": "frEtjtXJoKyuyq49akz1Zx3yLMpni5gYh2", + "secret": "8d50af61f21107f572606d21c35e453f997ec17e941f2b7afbc051acb36283f2", + "public": "038daf6200f2ca021673a6915e57b4c424ab2ac1c1b749db8dc059607d2092b1e3" + }, + { + "address": "2Fp1fioauYwyMikcL9VphTrG72ZBwP21WF8", + "secret": "af01bdd50bf4187bc8fd855962fc0a68ba55b3950d9abb192ec7b5179638e045", + "public": "02619d27f77c97b36ce895a9ad47339ef69a9f02a6953379d077d078ba7bc6535b" + }, + { + "address": "PeoTufGJDpATgy7y5fKUkM9xoL8tzk4LUA", + "secret": "f8c45f4c7034fff54f2c8f2f2b8f9ea356b299c73a66a9979832ab7e162ecf59", + "public": "03f4f3d208cea7bb257b6e6e84def31a26b22a2375c9ed50e0e02041ece9b09f50" + }, + { + "address": "2avexrXAe1yFcmEaFSMpp4E6bkHDyonTg8i", + "secret": "4f62ec6881c21bc8ec63676b124ce103a59d2acfac567827d29d9f3bd8015562", + "public": "03e17e14a0c2691b025b2a07d63ac21fb28451db69d8e18904ff8161ca6bd93f68" + }, + { + "address": "pwNab8Wa7Sag9Cg2FmEDF56izp8mD7kzQw", + "secret": "fcdf5e499b22ec63290dc2c680f87745aea192abf5aaef858c007e946ac3002b", + "public": "02ad66e1ecc629d989a0c80f81997906f5465ab1d4ff908f02f23e8a96cfe00f50" + }, + { + "address": "scN5GgoA6epthFqoXEKc2Y5QZz8jyT9FNf", + "secret": "24decfe6e2e505c5fb7a9a7a6608587883554ed81bfdc581921525a5a23f6305", + "public": "0344f0bedc327fa09c9686235ea3b2139c07259497264c2b4461cedda3f55399fb" + }, + { + "address": "SEAR4hqpuvGLPVoGLpd5U61aoYHUc6jNqG", + "secret": "b5093a711d22263967e5ce2b2aad751e6742cb34ab51c8d517a328cb406cf801", + "public": "02b5fd3eb5a00f7bb172fab386af63c965e72c1874520fcf2121bb3bb96988f68b" + }, + { + "address": "2agxCQqyVw2Ne1n4CtBboaWQ3YjmhXaocdh", + "secret": "ae897238f5b80a8312437b2335442d83c695feb68b44482f5bc2684079ca40a1", + "public": "0294e9cf3b98d6c5386dee498da50e2a0fd28244d9edc82aa0aa3212c4c0ef06a7" + }, + { + "address": "XoHShPLTkcUeFqiwSEfRgvJnHHKhNYAHc6", + "secret": "bcc65eae057e0fcf3e423255a0f5ae2ce146919bb707dfd4bd3fb762fd69d78e", + "public": "03c740e434cf3614b53c2788274f7a356905a8a1a27725d6ae9e67cb1a006027cf" + }, + { + "address": "2hGNn3KRW1Amg5xWEW8HXDW9pNhdyvp3Bxa", + "secret": "7b39b68fc581a9bd7d759a74dbc1d7beab35e0a64660372ea1d598ced36d9ee8", + "public": "02a8f5bdc94366497ffbdf88fdc423b51718947a0a523ec63547f88b1c10c0382e" + }, + { + "address": "26T57mqYiFif4KBVW3N9w16RGfSg8VP9FfW", + "secret": "c71f7cabea5b39352997f647f1481710c13ae1a29a06f01480af3cab1e6b2f8b", + "public": "032f0a83a1826005975aad6e23c87088000bef7fafd11a52e1dadfae590e859a0e" + }, + { + "address": "2eCjgi3o6eTNtj5fiTs9Lu7CW5WMXWZhfXN", + "secret": "8d6142ee69ff6eba19bcd25fb16f1c781a93d404385dd9b90e85a4881187797e", + "public": "0339f788c880d61c3f6fcc23e0e90a1c18f79460533f392389650151314d59058b" + }, + { + "address": "22a6YptFqi4MjqsDjFp2L3d5ZGV9NDuczfh", + "secret": "865f1a3d7d1a95b54627dcf64e3677cca758a7cf35aab7389cb2eba2ec6607d9", + "public": "0266e102621ee4087707692aca8cb858cb51ecbcb5579b99cb2725749674394766" + }, + { + "address": "2Tzi3mCkXk2h3GshRuw89zcku2WbvZiYXmf", + "secret": "1a4167d782b49faacbb3c89994bad131ce61850641f79e52e4246bb1a05bbce2", + "public": "02632b4a6bb063f28ddf1034ede2e900194dc1d4d709c33672fd33070291f53d3c" + }, + { + "address": "9YRxCxLexL89oe8RV2SFCZy4AQaBYXAsLf", + "secret": "253249e9c22d9c28a110be2d8be3acbdc6a3d04bd001a07aa6759a3be2a4c591", + "public": "02548f69543f4622659ee0ef77db503e734112813f70d3bfe6b4223b395a74364e" + }, + { + "address": "EXAHo74kkrdfFnFTEU6zKSMubBYyY6ZmWL", + "secret": "1a5f08c53c600ab5a52e948bbbe77cce9ad52e90aa14d16d78938fbacebc2c4b", + "public": "02cfb2fcf1ff02fe24d210df86d12cbbdc81429eea6613824c031a8da77db2065e" + }, + { + "address": "2RRBNvJSxReWxHRTqxHoUs8gMuhkBAvQaVM", + "secret": "4ad2c6899bdad0d7a8b36ae0ba0fa22cf6713fe48a454327ebafd2a2cee2bf57", + "public": "02835fe7180f085ed98bbb305c84470d585a391a9b53cccb344f26ab0591efe186" + }, + { + "address": "DLLAzoNAdSqmjoeHY1Zs4C8cF5TsVrhxMw", + "secret": "436f14e457a94af30f1064a3ebe4b925feb0bb08728b9b37ce6e3fb2f048e6d3", + "public": "03e6c236453466b1c7e7ec6edb05d8ce526f9b34ed696526e39cfa0e7974289043" + }, + { + "address": "2g7WeX2ieVcucWtFhqVouh2U34VT7jBTKvY", + "secret": "6c147b748cde69b07054d13132180dff1e2968ec311727c3d5b430074abcc53d", + "public": "02515f6a52401a03498092aa16c0fe94725030545b987e2572c5700e91c7dbb7a1" + }, + { + "address": "27rnygUUorp69QkwCHqzy5WJMc1hnxoxN6n", + "secret": "2f0606e012fa536aff11702f3fc192550abbea7ca580f65ff44013f6e6d2ee62", + "public": "02ddafc8f9963dab80b74c602d49a42f9ae8fbee1ebe9c10d72ef00284c563527f" + }, + { + "address": "2RcdcDLnqB9pvNPy15MaqcSNjFjZ3ToYQt5", + "secret": "0fd61a8d1265e0479293983b5b6628867fd99f965179e5d51901c602ef2c8671", + "public": "03b9420f1acadb53799c7bcc7693d1024e45b66998821c957abf57def534c82d3e" + }, + { + "address": "2L4E53nxkgMtdEJMVEetmEqN8VsH8bvN3qL", + "secret": "5bcf2fd07fa946483b0bff30d0008398e584ff001093e588c99d4fb4303a6654", + "public": "02cc1fd871d6ad834a8c7997c38b1101b7bb781ca886add7ff39032d7e11774031" + }, + { + "address": "nasKi6MWvCCyupab4SoScbhxJDYyzS6NzC", + "secret": "9c3dce71afa6edd50d843534d0d5bc755c36e0609ebb4d42c14f144d67b57867", + "public": "033b9a12e3ac267d17c0ad1fcbd0e6204d57f021cdc3e7d63a186fb6b46c9a9344" + }, + { + "address": "JtrbAukxBVGesZgcuU46nqwYnMJxSvS69w", + "secret": "f6f2398e745d764547fae8d939cc137b21f0788f4bcc2b18aaa98ce9b5bfe3e6", + "public": "028a5936ce42aae51a92e89ed3d000b81e186892e3ab72da8ea02f36e1a09656d9" + }, + { + "address": "CmJZiinFtNVFsFGCo4ad5Trup7DBmehmB1", + "secret": "deb89ee1539b6cb4ed4a3ac1153f6893565b4279d9aec526651e712a02bd29e4", + "public": "03b3ff7fb687b17b45178138fbce9bba96f1def5781564adb5964bb5c1d292f2da" + }, + { + "address": "28t9se5L397uuatoiv2y4q65ZB73C2dxRRw", + "secret": "ac33995bc96e8ff83a12a49b22673484f8c3f742e2a9be2ccb74739d603e023e", + "public": "02863968a7c079c5ec060dea520c87396a60b840d7373cb6ea1a1c250f8e273031" + }, + { + "address": "2bjyscrwVN6nSWxM8L1yhavTY5326GUgdMU", + "secret": "54faa9a7a42f6159ddd56d8edf97acf1004129786d6e7beb88e0c7471ca32c67", + "public": "023f441a065b9026c6574ab08869d322d1dee79cae99f7bc1b71b98db92fab567d" + }, + { + "address": "2fmezc3WLhTCwfTz5AG9C9s7YtmGaisLSLz", + "secret": "c2c7d6d6cda61f543af9793d80508bc62b19896216039ef946d8ba68fcf84798", + "public": "0290d8e460b751e0cafe38855a130effeb6f090a0213374b537d6759c617ff4c68" + }, + { + "address": "2PwxALhCSc4XrgRCMknLxFWMoRwc8WYF2cr", + "secret": "c7c3b8f070204163dac5aa2b4318181540662a63bd4f0ba14906e44a6337fbd8", + "public": "028af1aceed2ebe9cf27ff522fecf8136c066d6c6c3af1e4030c8f9e124ef71602" + }, + { + "address": "BQFdx54A54kcGLx15CGi6Ffnaz8iCTksfX", + "secret": "f7ec3ed86093aebef546cb068c0aff22079f84f388d16399ae7410d171b8a095", + "public": "020310b0d4934d5f28db1e6db364392d3e71cd6e31b95a94d4bd5cc23b7d9e8c41" + }, + { + "address": "UNEV8oNtzoUHHTRuYSZs4uMCEYZFk8Bob5", + "secret": "8e0c7f3926a867b0bfdd1d1b62ed3462f9e564040f013039ee4e94c8b7519512", + "public": "02450766db9e74917020297e0e3d509a584390be68fed4ee488362734f075f38d1" + }, + { + "address": "2ZMV9ShQLokk1HTUVhqzR8J9tABBxnzASnA", + "secret": "ab2059ce17a55d13e96137be6838b108105d561e6a888116550d0fbfbe8d1e31", + "public": "02d21a40b09a09dbf8947f67317f2262d2c72fbf0a96c8f143c65a09355a3b96d1" + }, + { + "address": "KeykKcYHZy4WKXXsEor6o9PuUJFTUVXbz4", + "secret": "d7a282eeb2a7b1182977013d3583fa13e80d955be8ce2cdd2125635812a79a73", + "public": "022d38ed4c43431b5ac35352b2aa5291c3754075a232b694a6e06740be7f2353c7" + }, + { + "address": "irKDBpNkRF59SEC4aeJ3uBnGfsX6T991dx", + "secret": "be96ac4a73e5aedd538eb1c38bdd31ecd4600b1f4987bf64128bede52820f02a", + "public": "0233d41add351854a597a7fd80ba47c5124ae8d926c3c24b531600c2e4f9688275" + }, + { + "address": "2LWEVDkftAQjJBgaW8MPPTrijdXyH4wGjEn", + "secret": "f6639cb6b9a3ae2cabfe37404110cb17a0787fd92a109258a6fa19b183003764", + "public": "0381f5570ce75b62b655e9aecbb02bf5376adba0e91f21e893ea92e21c8a50bc2a" + }, + { + "address": "u7uJsj6EsCd7Z57jQnGQNFAis2YiyoeuuM", + "secret": "034d44196c5ee1eded33599fb1bc8cf205b544f86e8947afbf49a868d081206b", + "public": "0245a408560b1f747c86b47033b083729f5785ef6b00cb37fba401ddc4545384da" + }, + { + "address": "EuuHKQUFGgHN68T6VkssAwNxP4e1htMEAU", + "secret": "cda4c7df62d18d8ce0141c62fb52f05c7a987706ccbc26fdc8a900836711772f", + "public": "02894d1a4b8e222e1ae067c20567475322f925dfeca1405e2e30b845e3ef047756" + }, + { + "address": "TFVXLJKgoGENxDPfiNn9h1eXWLbER71Dgn", + "secret": "0e7d7e87f806b6d5e1063318268fc1df380d1e0aa13499d2b7e6034b89e94943", + "public": "033e8aba7f8c579c7164aa2369c62a3cbcb24bd0b49bf5339841d3c42048405a38" + }, + { + "address": "2bFS9uBumCkSkFhbaV8q3dYnNxx7725JVDV", + "secret": "28672a34711c4d818c8feb835dd2198e0dda20d4dffeaf78dcdffef05c991370", + "public": "03c88bdfb32a4c8932ef3b06d066495700cc5161886f6350f7dd46469b56ac3ca2" + }, + { + "address": "a3QUbyUgZaXcZtZPFm9ChWNt5DjYgo2wKH", + "secret": "dc644efb58c344e4f999080d7d8847ff159710c85d0726b80036c47e336a0ec0", + "public": "03494aee0e1406ba2ebf85de3d3fa5cd19877e81720be24140d9d703eadd14d881" + }, + { + "address": "2NZGkbUWx7CHzJ6LHTf7KpcDJNbMmM7PG6z", + "secret": "5d4fa6c7fdf51ef26a9095245dfe6ad181f5284d338cb5b008e38a6e07399b68", + "public": "035492a39daa2b6abd7530b5846e06fce0ff45f69f62ac722f0e315a092d377923" + }, + { + "address": "2daa3YQCFEXFqwZ7HwrfhSQXgmDucjkKC2R", + "secret": "a9d6dc77d7e4633075d0581eb43cb6266bedba600c62a98fd2a6349b04b98ef2", + "public": "03d83767f81104accce7893437d33f613567d85ddede6b88c0973ee8ec672fa7f0" + }, + { + "address": "2HrVw78xZrjDMz8YahiRXVgghRJNYxvoMv7", + "secret": "65a75bf3ea1df83c1d56297990620ef347b6671e4530991a15a4a0abc4b91c53", + "public": "0306ca67b3fd9b45f14865afe7405dd8810d81ef0fb27e11d4a98862565ea54eda" + }, + { + "address": "isQzfULaF8qsZwEjVqttXC5p3CwWdVrsEm", + "secret": "f421529f43cf5de54382f390fb7d4118f7151bf2b114eec6205d9fe557d07024", + "public": "02727f6d688ffc1afb11202b85b37e35478b5619afde09081620018f485970cae9" + }, + { + "address": "bBHE5LpRBZEaY7upVZrk9THomitAmUQ7pw", + "secret": "22f23e4560ace182ebb9e4c809236e3c37e636d02cbe41dc7f57f1b0d53c3034", + "public": "03457a68ca3c395a1615bd7b41db4338b1648c076fe008973377252f23d538637e" + }, + { + "address": "R2Tmy6uLAyyBVkV9c5EzLvx7dn7QWkgRCp", + "secret": "5f6cd6f06cc6c5658f2212002bb31984e98edce455cae435b0abd2dd68549c95", + "public": "03a51c801274b5774032661bbfb691d832da2ecf19d77a6be035a4e0080b618d8e" + }, + { + "address": "2FbLk1kx2pqoKJifFNVKYYdhxKQEJLqBa4p", + "secret": "bd3591b1afd596cdceb604d4c8755faf9effaa8e6a42637066db28b22bfbfd7e", + "public": "03717c0ad9214a4e590fc0379be9696c4168443458e75a3552cb1cce9f40e5bae4" + }, + { + "address": "D4F4Vo5xPLu4YX1sTaKzQfUGnmGk3yCUb3", + "secret": "03e60b222f3d7571669e7f943e85d08a65693c8d2054da755149802a69307411", + "public": "03078a2be8905c0c4bd5bb15bc52388f90c996f7e59c8a0351dcba8876e0102c55" + }, + { + "address": "uZKWALKm9AYC3GQxxC1T5i4SZTtDaQ3ov4", + "secret": "be694dcc0b7c37ca2251b509dec610b1501ea16cf2dc7e48fb44953eb881373b", + "public": "028fb5be4d87deb707259c4fd9fba441f3f89f171c9b5b39cc7cdb3aa694694bec" + }, + { + "address": "2Bg7DduvSuHQQodT8rDm3zgubnLApfwe1qF", + "secret": "6a10bfa1c59f6d4cd1be7e707320efa6160853bdfbcc7969f9b30fbf0a9626b9", + "public": "03bdc46bff88f5854dd6aacf5a69e8b344a45633c6b2fe46b902188f70d7f4af46" + }, + { + "address": "XLkHshahJQ4QM3XdFqeuTEfzq2B2Sut1gB", + "secret": "48d4aed38ddaf9131b75c34976cd6983d4c35009eda7461217f9f24dcf51c854", + "public": "02ea0380924ec74c9a1e61ad665c283c6dd8e69d5a403318ea0c9f6dfe6bb71c47" + }, + { + "address": "2BPMq8EUBGRyrz8NDSaUSGT9NrFrcDjq1pN", + "secret": "96819304e4803e15daa655205cee676dc04417c368b9851280c2c54fe509956c", + "public": "02382b4e6a8feb6d13de1394bcd4fd9dab6e6bdf4de96c9f0efd917d5997b94f21" + }, + { + "address": "2GGWkSEStqCKs2kGUa4pDbg4RxHJVhh3DyQ", + "secret": "e81e01c500a5f159cd5451b054568ee1ffb2700ddf61fd38371d0e128934007a", + "public": "0270cfe30a0fb41dfe30b9d897580ea16a401c4c41babfb41a78b1f20c12caf0d1" + }, + { + "address": "2JAihz1jHZxDVSJ478Yx2cdkseqm6ZfNnr9", + "secret": "c40ae6bb5a1c19764797563de1eb978ba85c686a379247adcf36426918f8f25c", + "public": "03d8a1fd67726ce2aba192f8358ce9143b8eec0066d80e93333f27931c8c96af56" + }, + { + "address": "2e3SyTQALdRjunDL4VpUkQqZ7kL45twGSvy", + "secret": "443200ff2becf64f313a047c0afe64470a1b79ea56802a2a782d8a4c3b0e8bd7", + "public": "03245acebda4649d21578bd2ac5466470125d9785668e0d0e6d6969ef23d99dfc5" + }, + { + "address": "iXws2tgmeN1i68GAoneEcEzASNosHZCrR4", + "secret": "a525b3c37481552bebf2b7f6849d5cbf8d891f804427ceb01b4d0fcffc3e6a6b", + "public": "03631cb9c53d25e67cede82f50e5fb1c905a166569894b2f1a75109253ea455ce4" + }, + { + "address": "RULqwD1WjY678XddBPK3qRJC1KC1MLg5zi", + "secret": "9d465bdd07bbde238dc7dfe872cb05a3a8461893af61ea37f85a8805edce44d4", + "public": "0379f5996ed66ac9a17a990cba9b619cfabf87336fb41043145d240bf88c1c4087" + }, + { + "address": "2e4ekDcVtjG6PHuaeVBd6y7JSiLKphizGo9", + "secret": "601832e7a373217b5c84c5d77cfb1581069f970c0ec3f96f59f2907a69bb9c6a", + "public": "026302c344271cc040efd6536cdf77fb09f2a8b7cf49a2159a595770e25a741873" + }, + { + "address": "2iLYSsW9o3GGnEWRgcuPiXrmZ3xpKR5SbH3", + "secret": "130179676d01bc4f06e818b9746ebefbb2ae3d7aeeb287e85db1dbcfd1f12ede", + "public": "02057b44f1b07039ff175a24e133240ee378d036fa07b82b6f897ae352b8e9c66b" + }, + { + "address": "5Xx14ZZYBtd32jH8vRaQVydBo37PKDPXSn", + "secret": "bd8f3c1423a321e75bb1358e9e48befad2730aa0eb351f35b89264686482833e", + "public": "024cac9550b8b534595cc4b648335256ce22e25911cfe85e6b50a59484ef0a6331" + }, + { + "address": "28m9mZA2vpkYVRotYxaWU2cAJ5rNA4fU8qo", + "secret": "43e19b1dde61837e9237afd145664c21d57ef0878c298b22db20d9f1383c5a0d", + "public": "02c2d5b3e587facaa13bc9b480be8995b06cdbb83edecc7b9a751342a1dc47d3e0" + }, + { + "address": "k5zSTYgM1JJygeyj1HiH29quDhz7kp7CdE", + "secret": "037824cdfa5b27ea0918ffaa34a700a32a8d216f04aef0335d775adc5dd47ef9", + "public": "0257aaf74b90dce0b3bcc41b0d28ccbcb6f4bd6c06fb24c283a740bfae74cdc136" + }, + { + "address": "2Q8onKZCoJE6YLfSqENhPyvkHtxvduBy2t5", + "secret": "53e6dde235adc370674fa60b7718b8b8e66e37ddadad2c4a75acf50f8d1975a5", + "public": "0244e3aefc7b751b97ca4a0302d31f361a93fcbb1d89ac1b1b8bf6039975c6088e" + }, + { + "address": "2K9tDb6pEaLXzndCDnSEotEiYBQazoDEmMd", + "secret": "127cf350a9dd07e2622d53b5c3ddbf73030882d55538746896b135004e9668e8", + "public": "0299325e94d7e822b53055d1400a91d914993b96b78b2273d52e9032710a2d7404" + }, + { + "address": "2Po1yzP4RSDm8p1w1tF2nbwcUcCKaEEoQJq", + "secret": "74ed922d8ee20fa41c5cbbec171d1248da080b3a974d0784737709749c6d9374", + "public": "0316f6d02dc551aef7eb45cd6d271a333ffea11c2a3b6c95ba84f44b1a7e366da9" + }, + { + "address": "ztvFFxYHYLzGDmW83chkUToB8Htkz8119D", + "secret": "1696d5006de140218790c9620873ce0b1b605711686a0b9fced1c0b10677b5be", + "public": "025d0053049ba7034a6d227041ee2800b3d4b575506c85b62a0a2e22791f88c093" + }, + { + "address": "22QmSnYryfxUNRpgM6j9uA57Dn7Jhn3JxFG", + "secret": "05042fa3951fcc1c3e392349d8589cefdc6a1eb6d986f497fce500bcc454b4c4", + "public": "023ec539cc83b92a8121c0e45a3d21ac79c364455efd3df406a87845ecb7f120be" + }, + { + "address": "1EXdxZfNk4VW9ZdXd8VHUah3nBmARtfD4r", + "secret": "291a3c544d77662dd4266425368f39e05b91ca916a8b0b4bcc773567b0bc461a", + "public": "03612f2c6450b0e95960d8b5d6b56dbb12652193f843b30cc9770e46761cdfd24c" + }, + { + "address": "AH5WE6cxeqJ7g8ThBWCt6351dpmqZxEtvR", + "secret": "387d9f7de29bbcac267ce51dd1cd09cce463cf4daa2e208f5a5caf79129cb03e", + "public": "02144e16ad2e88d743de602393d93b9154c30579789546f39b1538c787934d23e9" + }, + { + "address": "2bUvBzrA2rySkTsTz8ubjxUiLG2X2UXk132", + "secret": "730001c2c9564606fe0148a9b25a22150b386edbc657b81bcf63fe4f5e77e9ae", + "public": "03ae3acf63026f08d3369d57ea42f277c6b5dcf5c2c36f1dbe1d1d8b54b493cc82" + }, + { + "address": "K8jHVZcygoN3e7Uh57nUfQJzmews7rWi79", + "secret": "02b6931812541d3cb7de3dcc88c877918d477ca0cf6f25ee7d728059bf11ba97", + "public": "0225b37ef3f5014dd5b6eeefcc480e1b136c28e9147f98e14ffcbaa6ee2283ff11" + }, + { + "address": "Cr2ErUjL1UqhiVMVuPu5o73NDQhRFp43up", + "secret": "e55e26e1fa9decc1e8030bcabfe2c996e08a2a009984128e7301cb815d96bd61", + "public": "037599174736e30d76f9ecc5dd1107ba032353641ed7eb6acce126b0018c7ce71e" + }, + { + "address": "2UrDkbr8qkLaUJHMYkXN3k9xvmh4D19Ucei", + "secret": "4a8f360f40ee58ff53e957782eb3aadb861a6e0ec252339c83b5579c1990a37e", + "public": "03b9c9c0631811a24edf9e79901114d1d03b762561183d2651443ccd65e16568d7" + }, + { + "address": "2SnMjTtr3WRJ6q8GU68CnT3vMPtrXcRLiHK", + "secret": "9ca92d31e7fa4b7827126bab0ab02d2bcb608af1e9efbf4ee0edbca3c387fa36", + "public": "03856adf3f6a7079e6d42275a21fa0ce851eda69b1cbfbd96d25f2d72228498b1b" + }, + { + "address": "2dXPVZij2rRzCERmaXs5fjnB2epMy6ftAsj", + "secret": "28ca80b3f0db34c13e73b7ad5ff8605a6ce9099f06494a1a7b6727c51c64110d", + "public": "03545172070d03df86e8ad6580ae6fcebb6a775f2a0612d373395279debd7269e6" + }, + { + "address": "aMdRuCA5s1Ak8QqcEn7gmX9xFUJXebbntH", + "secret": "d24f4bb16b89077ab63a2faa921162f4f9ff33558c6ac33ac72f76af45cd6fb6", + "public": "02866b765a68f1befb293cce71775697e8cd03cf3102a9888f337e5b1703e751d1" + }, + { + "address": "HJd5e87cu7zu2GEWweaf4SVYX1PCxHnHmE", + "secret": "be3aa9e7df5bf981a75ed0b655c7490d2611c23b973a902d8dc5295c4b41b555", + "public": "02833598127e11f7935000892baf351e5a0de50a008d5864f9a951fd5449859e66" + }, + { + "address": "RjvjFhLR8UWA8UUBwmyPFV4V99snhSujJU", + "secret": "9f17ea1077558a3c898f0d080eccb1bb2385beabf092b3f84e027a9a84fa2e1b", + "public": "02f6ae99ad5a0e79e75f681b8c365e33ed31041d6038139c8f0c46a9cc467b0efe" + }, + { + "address": "smnUYq9hco8u5Q19wWRNtMieS91EA76vCY", + "secret": "b813a912be979cabdbca7b9b7d432b6b969c8b7d9b9b0c69f7e697945989aa98", + "public": "03ac5574e7787a94d7e79733f7c1f428805bd502608888a670e41c548cd3d466d9" + }, + { + "address": "2KKp3DbztvFi1Dq7fCbqJW3jyMLxRcVgoXf", + "secret": "8bbb021e60073065cd2250b0784e47fb0cca7974853166e3e942c070ad192a95", + "public": "02fd39b777e33098fa4c953b2f98660005a27fbfbea9c8ec8bb96fda649a139edf" + }, + { + "address": "oPWJvhk5tDy222LCYAzJUJZce13cVoZTba", + "secret": "0ac8ae1963c9b62b27d6a0dc32a21daab5197c4e81ce81bd5f06253a36b0eece", + "public": "03c29d315728a212c153f094f68a93693bb09aa3868f5c0ce9dc349e2792f0bbb9" + }, + { + "address": "V2KpF1Yoht3iGMEpJ6VKLpm65uYxEmk6L8", + "secret": "c1786113036db1edbd2e7e85322ba5b0f49a71b49d975cc503ec0bbeef70c8ff", + "public": "02a7359427fc56d44639ad1823805fe2790034811320361c0884e8dc3f9253bea1" + }, + { + "address": "ghZL4ds3pEAQ86zaZ2VqXaHajC7AWPvazN", + "secret": "7ecedb39e58d7dad0d035c947e350d7266a836533294dd0b645288f31fb6ce3e", + "public": "03ff6b7ae9a48247ae440fe8277a748995d1294ad40175eb63810864bb05624984" + }, + { + "address": "jRzDnixfu9hJoTGA19diDvUZmx4wFMFzYz", + "secret": "184e8fdc7e1cd4d666c578601f9230f93611f465bce0e429b2e7406f41a249f2", + "public": "030e121a88721a5e312c6508e3d76cae63d27cfcd5fa0d5109a620174bfecc7355" + }, + { + "address": "24ZgZVdovTJGACYDmzTr2UmCiXvLS2BDisr", + "secret": "6201e4a74d799d9322a373d5577466f0b958ebc66e36b0c943837be70c4856c1", + "public": "03cfde6af9a8673a45c7394073a7bef3d5c734ed5fbd9e5d6bff0905521508f036" + }, + { + "address": "9QLaTBBFzbNT7FqtLyr4mC3SjUF81wscKu", + "secret": "e14ed2a6506c03fb7235637ec696508d9a4f224130db2112448284d97319f729", + "public": "0257544ad0489b631d7f839ba50ba8d817fce3b68849b014535c7c579b053af479" + }, + { + "address": "2mrdnsDH8GkDxzTfKLGM5Qic6twVNnUzUCp", + "secret": "4272244bad296247de956a03b15027018dc3eaa997c7eddb62e11eb4b62a5fce", + "public": "025079ec188d81448851558da00f1375167a99f5a47ba55178c23bd5fd83e8fdf8" + }, + { + "address": "5r1ppyYuyjxLRchj8iR88z2v2YmSjA4uRH", + "secret": "41399be04144c30fba7767d2a8b320b051efd72727a73b0eede7503a150b82c0", + "public": "0348852f17e6e423f99a927ae6711f0ca386950dadfd23e87d986e13c049249636" + }, + { + "address": "d6Kr1rcKXZFsbiA9XnAvYraR7K9b14mtJN", + "secret": "6dde963a31bd1c4ea9dac7c262a503f73f7f00a30b6bd684d39c7b774fbff32b", + "public": "039e9dfa055b56922799d5abeb4d9ac9afd653563b5827c1c0a3382cb33d32b937" + }, + { + "address": "23w3Mpx7B6T7YzS61KzGRTdFaqqVhfhSPVh", + "secret": "3e1e627486422c1e38525ffd5f3a20b84698337fd376a6298914b9f7ad215cc5", + "public": "03fc41d428a7984ab2e8a86de2c72fc843e3cd0822694a58b33f1d30295384b091" + }, + { + "address": "2UE1RjgYByFJTaZWm7CASrJ1zLpD6A2ibpN", + "secret": "1658c7ea9d9c887b47df2bf778a2a9f02acc7342c7ee98e16250e51193f70e20", + "public": "020d1c92e2a29a11e5b77449d817edaebb620f4bcf089108fd5892d5e293760855" + }, + { + "address": "2gUQycnLvW5PNbjx8zbX6qqKSMx8AZcbHJN", + "secret": "29990b7a22aeaea7dc196cd588c0855ae29b9cc501ef5f36a0e48493994c8121", + "public": "039a9f1c0426e4acc12d754e38373d7db58eb5fb5eab6adfd920ab57ee786d7b5c" + }, + { + "address": "LJJtdHQ8YwTXyv9ZiNTrCGgh8N6iud2jH8", + "secret": "0f7a45ac7fa48214e22ae57d598357c6502b0120a53f0846a89d24b278869625", + "public": "03f96bd4d570ad5e3a424ca6b5e1fcbe2baa3990e9f930d8d096ae6e72f41908da" + }, + { + "address": "2erBQmqWbCn42XHgv5mX4FGdYmWwGWNwJtF", + "secret": "fc8ca55c4e86af2ab9d79035618bfbeea89c4582c39f6a53cf254fa0334eadd6", + "public": "02950e3d4516dc08c46228b6a77b0f28d73eeea47fd4d31ad9fb9246ff0c02fb13" + }, + { + "address": "pvvZnFhT5braNsvEF1LEDABDLXJPPy9n3D", + "secret": "f9d86da49c0584a6640aa990599f0d9986f58650eefad763a7eaaa90b747666e", + "public": "0268c65be7256ea4d769e8a723698db683faccc1e21b1fd38a31a591825d07202b" + }, + { + "address": "6SnfZwj1UeVtzg25n9wnkj1dun4ZWHMUwa", + "secret": "6d3afb2bab90de214060fed091f8dfde04fa19c540d896b5c81495d98e5256af", + "public": "03484096e0e52f26f11fd5bdb501666d4c74cd15c291d038aa9b3f9680f097d6f1" + }, + { + "address": "22Y6d1jn78SCSrea9dipxWZsHMmGYVVzrEa", + "secret": "0669359fcf951af5c51ae9731c5064bd7c937015ff88842ea15971fd8a01cf8c", + "public": "03004bda791425eb21c1143628c200df0cbe2e26349a175fdcb2a6dd54e135e03c" + }, + { + "address": "c6sPKAa4oJ6pnVdLSpcsfBtvseHFCN66p3", + "secret": "983bb4b8c8390b8a00024074b43227e2afeb1b30080e91bdb241f2434cba3c9a", + "public": "037b6f7922f08910e0b282e08206517659565254795299cf212724bc10063a76dd" + }, + { + "address": "HgoqRHGQCqjBaib5JnGxzzqJerYpSQDoDo", + "secret": "c43caa26364198a11e898020edb42eb38b48715a7047b4a970b6bd80038c7c6e", + "public": "03b6ece9d98596d9ac7b3e2297c0b321a897bdb539f38c7850a9981ab940a464e7" + }, + { + "address": "vujxJAz6RJrNhwGpRKEHTnwFvTQ4mQwfrs", + "secret": "031b4b8e634853c180f13d3f8aebf5a44dc3d85eef6f5e86ae3091abf8e49a06", + "public": "03bdd90e83de029d7d1e9950d4ea800542b47fb1bb2e5666ab1b5ba4f5d12c1d05" + }, + { + "address": "HXdBWU4ned4Q19MUJvr1T8BkC2Y7gYJHhq", + "secret": "06962e39a38fbe298731924221cfa42ed0ae9abb105843cbac487019252879a1", + "public": "02363ee0442a993d4dad2666ebdc7465e2ad30b38f74ebc2ce5be39cc5731283ab" + }, + { + "address": "2mJtA9XppXTh9o2267QFqmgUc4vQtMxH4Pf", + "secret": "a3c41a8aa49ac7c989744f59037ab6e7ba02305e3ddb09948664698fb3c7b546", + "public": "025677fc7e26cbff2de1d162979d011fb49c2f94a51ae0049a96354798f8df9493" + }, + { + "address": "2WuGtr54gfEM6E4hzARgeDMiVke4mZGjyK8", + "secret": "e701ca2b190297d5b5d17fc8e85400e555a1cd4ce59d9ec9039615560d5a77e1", + "public": "03e4a81a81a0b38d3804c998ea6d3e40eca24b301d9200d7a40f47a7bef8b1bfaf" + }, + { + "address": "21SkhMpvCAxvVnVRa3QnKEocXrPbEfpQXer", + "secret": "06f71a679c3dba236d942839f9cecd105c93df008dbda4e88502a70c67aa66b9", + "public": "02e0b7a344d4a571cdaf8b0f46feb2007a80c24027f71848745568685a33ce9a84" + }, + { + "address": "2Hch5H6WNpXjExggAWUVUozAZaBRWEWvpsE", + "secret": "ffbd71a2fe82aeb6afeba8f7dc4247820bf479ac5beb7a95ee12e1d511736cf9", + "public": "028b22c80b41a8a2fdf64d78ceefc639745b87b6909dc4130c7bfa8828d5aad1f5" + }, + { + "address": "2FRNJ4e3FDtY9c8RALijiiXqsqZNbkHHGsB", + "secret": "ea2a4ac1c298304f065d00f113125596155c2c99641988240be833c09673bf05", + "public": "030f33fa43b5854f000799468b1802e61baf183baac079e66f124c2a133e3997ab" + }, + { + "address": "iszc3eZpwcUu1GQQSz3CMnN4veQ44yMYRs", + "secret": "ea333ff90f76fb162dae8290d0984043e39cf6339e608e1265fb5b747b49d9a1", + "public": "038f2cbe9174da40beffc058f1a89467b1c37dce1777ab9352992f90a38763f02c" + }, + { + "address": "2iaaVJguAHYeytjfLcDVLLJLVSgPtAxBHHb", + "secret": "0c4a939514204b5f8a7327b36c491281652900993a1d78d356cad26f4370ea23", + "public": "023611dea864deef27decd48b58def13dab411eb9cdb8c32662f457af30cbece7b" + }, + { + "address": "2W3ep1m7sk4opyxoX3k4CTsmgHeqfSGuZ7y", + "secret": "3b21495ebefdbe33ecd33bbd9bef707648252d3306256b3852f2c1e32cf19301", + "public": "030e7e2017177e74a272c6f231dc429d47d842b86032f9e825e26dcd33808d7052" + }, + { + "address": "27qTt9ETdo1L8WjA38ui2mVctqu1akWnPn2", + "secret": "bd2722b3935a9f91cb7d158a36a53c33a27f32a07d02f4ea160596d96d9d2682", + "public": "02932a6c3dbb4efebec33236009ed9f625560df67703ce162d8579af9c2c28817e" + }, + { + "address": "dBFXCh3oZmfLEadzRpZuLvp7b6ty6MUH8B", + "secret": "080caa4dbf128bbb328ec33fc87ccca81171ce16f30697b4198e247bdd49295f", + "public": "0260863678aacc4fd7ab87668e54d7be15a7a762a276070efd6cf3f93a285ee4a9" + }, + { + "address": "Vm38DRDiryXCdiUUy7L3ewfsADF8x3xrvG", + "secret": "9f8df7712861e96c82d2af651ebd06ddfe79b31635aca4539a018e6ee3533ecf", + "public": "02d40797f08f3d9ac42c73367db84b4243fc87dedcefe91f1ad44e288e58177389" + }, + { + "address": "x4FCuwHK2B8uxy6TcW7v9V4rMTe2inrjCp", + "secret": "ccc879b0ea61fc4960ad3933d592c407618af109c4cc87221fe9235adba4c499", + "public": "02ab01ad4cad7b1bcc9d20219415fb92fd9bc819f6cac43cf36867e8284d41d50b" + }, + { + "address": "2moHfKQdFLvdpdioxUiewyQz81yBKA2T22m", + "secret": "cb2e589bc0fc5c3fc5f9dfbaf454f5c5d6eb2fc7be47a547c4ffceeafe074cfa", + "public": "020233f795f9380e7d04c9c8d4639c7d8ec598e4e4c8de59a4c73a76c3bfd4f161" + }, + { + "address": "eNpWwxqZeY1PYuj8M4M5TwoF3jPFsoKifj", + "secret": "73ba8fe059ce1c08c5c716300d2bc92097b9dd92fbb0581f624d7b064ba0fb29", + "public": "037382d2900cea5956f8cdedd21e8cd81a63ea0227090deec7f5a7685279c711f4" + }, + { + "address": "2g51QorpyKSr6rrCxf4dD4CeZEYAMURc3dw", + "secret": "f3861c2d1e69b93b666aacdf0cc2cdffea36c7e7b83dc1718829ce79e7513c68", + "public": "02381d60f8d1803ec10ac693e9d3060b9b796946f503ee7eb01f967c8bd5e5d89d" + }, + { + "address": "2DKTyBvzGiaPU2kL51AVubLGQFq2mjTr4HE", + "secret": "c3b3d02cea87e4f6c335784d4cfbdaaec7bcd7e45836567c60230f49ec8b304c", + "public": "02274e27234d8e7a0a15155fda616f7e75188cc1b96e463ae399d77cd17ac56db8" + }, + { + "address": "2CFcXpDqV5vNd4UzoHTsjPDTWuryZcQExsR", + "secret": "a239a35c1279ceeaa4f6f23837e92c464e71dcc86a2217587b1c1d0fdf9d4657", + "public": "02c8dfb3b231c7ba9cc67d84b9c6fdae1945f5c61ea5ff9b443abf866e373e2050" + }, + { + "address": "2gDrnTUUeZ1xrC3hCJyXhkrkm79yABLpdxP", + "secret": "6c3652adfe9e2cd2704fa0b1181b90ffd7dc4f8a4153a633103057e08b5ff881", + "public": "024b3b047a60af29f997d46cfe157a57bc77bd53a894dc6c8557d038e6d817d763" + }, + { + "address": "5fHL9AfwcqgYEMvjqyX5RVeksU5x4hEG75", + "secret": "f3451f3fc143fbb7dc7b1302841dbfb29c795dfd86402e2dd625c9870382b801", + "public": "02a858158514e7355b25ade1ff88d7381c3a0bc2b3d0af7dc7a15fc085e3e9ef36" + }, + { + "address": "2BbgUyWCqJ66xaznA5o84Fu64DzBrCTwvyK", + "secret": "17bb9b6b89948673b6faf3bba8c0680ca1b77ee23b16e0b2b23d4d31693de961", + "public": "02fd5e3ac72dbec55b340529bf913c62075ccf8cb399d008c8716048468cb1931a" + }, + { + "address": "2G8GaA8JYfVqj3ooDtkzWN2fNideKU8b9xK", + "secret": "770fa4cc2d8f1a8a686281e8aab3ff589a852ae450983bc3accca5080495829b", + "public": "02d69f91cb1e70caeaa8839c1635643b0360f0cafc9d890ef8c1bb7c91ca40ea35" + }, + { + "address": "2BwjUtSuGKCph4EfkthDa2CdyaGzHy4WDjD", + "secret": "b6dccd72e79f39bb939f2efdf1a90868a09dadf400629465e1ab97e2236ee7cb", + "public": "039cc9b2602ab2ffa175f87ad776a1e040555d4dd3485fc09a03dbdbe39c8740f7" + }, + { + "address": "wa5sR5oYKKY5PyqG5rnBCzafjhFmU5Mk2o", + "secret": "3879cdb11ae8bd760a2378c178b29fd694d3c7447e03d161f8fd19dcfad6512d", + "public": "02d6fb32ef1862b79b935dff7bb5aa868b040749ff08a9dbe8f6054e953dd3504a" + }, + { + "address": "2APKsjpuiYDw7DgC1rK4NEtGCu61V4zAc4o", + "secret": "91b23e1ef44587743475ca071a4ebdc3be0e87ffe46657be9299e17b3f0fbdc0", + "public": "0314cb0648861cb94994bc2631a4c782bcf0bdabec37bf3de1a170fd0503b9d258" + }, + { + "address": "2FwB1ZYgAB44ENWpudrpmYujkFZBT1ARF2q", + "secret": "16f82f75f6ea09ab92cb4110e1a397dd71fbec81ad7faa9c7a54c90875757a3c", + "public": "03017078b4d051aee4050e7dacd1b886cf27432d4e90286e47fd9501922476617d" + }, + { + "address": "WFNNgbZzsTztN2HvLroNXNDjP4y2qz2Wgw", + "secret": "b245f9311b8a69ade2b61164e18585ec636b0b4b9a5356b7561950c9b5beedb6", + "public": "029b5a844da9c824f7338a5d759402f7dc871ca4e331f38bf363f7e91cf7057ee3" + }, + { + "address": "JrF81tT3NehqrGLEWJPqTntBecMkZHbTLa", + "secret": "a7fc0662dfd8fd39f8589903c95abc60b22cdf45ad67fb2a5a65dc7e2c3ef9ab", + "public": "03c67fef9d6aec9e842b7915d78a060ae2271b01cb8945d1e14fb8c16ae2b8a3c5" + }, + { + "address": "h3vEzWCwWSGxyEXHhmVbGurjYNfJbnxgpX", + "secret": "287cdfea83b55bf184e81c0ea6889832db112c8a8762f2331d78caa7cf9baca7", + "public": "02b1104780c99c9e6f9d94ae9a564517362f374c536271f18fdad6334f219f45c4" + }, + { + "address": "2UnSqnvfPVgWXEuNuEdmBKoyJ3xBvPnY2fo", + "secret": "df35877a008cf9e514c9f64b245b5a3e0ad134bbc2e95ce9557551c79e46fd52", + "public": "03284b8af8e7cf913f02734f74a00a1df9102e8f6e93e826176a830a7aa5324fdc" + }, + { + "address": "VZptjy7VaWQjY5crMtFbDWq3mu4t5Lypso", + "secret": "f91ba72711696fa175a549dbed4efdff703664fbd7dc98dc7c64619ba32e6390", + "public": "02b1bc13a83d263633164df5fb9eb71e913105bf2e6589ac9b5607223f7170b481" + }, + { + "address": "K6Zvz4DHtdih5k8JBcPdcXZRRDhTBWMtD3", + "secret": "fd515d026596d95fd283ea3ff94a3220e58c1e283711f79b0720d8bae7df5801", + "public": "03bb2baf3490d40fab6171d4d2e4387d72f43d40f516e8ea219530ebab2fc19a47" + }, + { + "address": "23WQc4TFLtfZQADK42fTfqLvqd5fVc3eCFb", + "secret": "9f49138a3f36e5fe5b2b020e7595ea39cedb7db6c55da6864d15966b118ab3d7", + "public": "02a25227209e5620211e2b5c61f20f7376c83015fdd338f6ab30a5221d71a5fcb7" + }, + { + "address": "GLSoByoK4BEQWfiZ3rbLqLxmSyhfijHrbj", + "secret": "027bf03c34f696cee5042061902d4b15e7f9c5163e2abef6d2bbb24989e3660b", + "public": "038d3c9c0734574ab07c02d905a7c045571803fc0ee93cee1626b3a15b4c993f49" + }, + { + "address": "tNdNWcH2F96PAUtB7pC4n5M5TBSTpxKVse", + "secret": "e9415a0e3e395800cc7551be12b54bd04dc3c4bd29995a031dbf11ea3121998f", + "public": "02db97fd454c0d93e60841a153d22471ba7e82b6aa2e3f49d19fb4bc52a8c1f5ba" + }, + { + "address": "2VNyTcriS4FrYVotvAJaqmQuYwYSBAYEKjk", + "secret": "347e2aa0653c13973c2694e3bf368f9e84deada71edc0cd4d6f8b587b81d767d", + "public": "02b4a1fa85c4a9d2a6868efde449a41249bb4f8c1b3081fa9dd0085ed414286497" + }, + { + "address": "2eu6HH8nryPEjbg9TMvxNi5miWwiFHdXEbf", + "secret": "e1086f1538f9f99ac01dda8b722c6973ac2b890fbd8c0836115a1ecf8196c84b", + "public": "03e52237f3adc43fb7f086c089c452f85fd9fedf8b50bd1c69965124e7828c31eb" + }, + { + "address": "UG8Dvm24teXpSs4MWY4BpBENnT7BnFbDNK", + "secret": "3bddb147f42c46c265fa2cee35c90c182604618d822e22760dedfd5bc2c41199", + "public": "039087ce76a965f0b3dbbcb3b3532544b94c96d73ee4d41804f358d19648642bce" + }, + { + "address": "dzdJh62tUkWbFkHcEJYNeDrNYF6osZew1S", + "secret": "e5b4fd658c62ede1ec0a9b073ab9a70cf63fd0cb55a00d173657893c935d4909", + "public": "037a2e8f9a1600a8550a27792d7a543bfeaf4e6183f2ff280bef6c1f8ed85d9d07" + }, + { + "address": "a6zxRQZdY7ZurpcUXEo3GBpX5Kf95F7JhX", + "secret": "d3968dada23fbe55a954aa2d6b34c7570d5846a84b806c052c3a3adcab120b79", + "public": "03db3c65748908d1b55ad7b8c96eb8973df440e1971f05066636f4c39b53262361" + }, + { + "address": "2GGTTctwYB3iHjYBDE9WFxGXJLFBUn7UzXn", + "secret": "48435832c57f48ee7f19f6a09c752e5c2e0f230ce6ff1904445b39c3e9203e0b", + "public": "02c686311de0b0f37073bef4e2743c2f42052e0258e1dc6541cff2571268d1c852" + }, + { + "address": "2aVNmkkrKkCRSxe5JnX9QnvMhNXwwczk6nN", + "secret": "0eeef28c43478e967e0434dcd1231af081abd3ba31d80a8b021cf0fdc8847307", + "public": "03881a9cc92cf911a5d1c7e7c7ed6e1f38f85cdf42415dbc27a5bee88c17c52836" + }, + { + "address": "21py334hX7LKskHjLZhUPeEtJ7TYKVqfaFY", + "secret": "eb9e056f34028cf4546c287c7f4dc37c92d58c26b6546dfc17911359c93ae7aa", + "public": "02e3c5bbe2ccd4edee09601caa941e19847df1e8b40117557fbcf95354b817abda" + }, + { + "address": "2TKYS9gbr3CnSmAiLewX7RppUzC7r8NX6Hd", + "secret": "f792b0c3e445775b4ba17400525848f3e27199bebd29380474ffcacc1a8a6ac7", + "public": "033ed56d7ba7138d71a213adcf823d9728547e849afcdf02aa0c40f6536537109d" + }, + { + "address": "27T6vpidojqAZgPhFA1gV32hbAGEvxYhrhk", + "secret": "f5b982ac586e994fa405c8b57225d4cb9f79e6823439e930ca6c3675856bf87a", + "public": "033f52847eda3a395ba83baa7aff6c40b6c27cab7e31bbff2e59aad5fcd2c39f7a" + }, + { + "address": "fKRmxuEydH3xr84jJbM2RmXLTrUQY754CM", + "secret": "26d4a55a93849fdbe9df353a8a94f36fdc29850c26a80af1efd9052d77f7f97e", + "public": "035ef6fdf9d281e09fe89737a9d5aa1ba7a2f353471ccf753035a4d59b084a36c4" + }, + { + "address": "oxCKHFyceqKrQz5ufoNkiNou9vx6yiCxrf", + "secret": "7d88523fb836a1e68249bd8b30052e2dd0105f925b0bee6192f318df099e8104", + "public": "03be2cbff63238343dfa80072c431a7fdc09efddf529b0fd403722ae3976ef6981" + }, + { + "address": "3RJy9j7ztK14sJgA5NyoLMLAUNxAFg11Lt", + "secret": "7476b76ac6ad3254575f2cebf43333b02ca6b263ad06938286c00e217f39864f", + "public": "03755eb7bbd9500055a58a6c05144b2479888bc59d4284b3d66bbc7e9b8d78c903" + }, + { + "address": "99Rq9gQBzT6o7hHVh9mwBi2KWpDrVueokr", + "secret": "efc2a3b8cb9d78f38c3432040e2e2ecc6588125338224a90ba96a72e6df63150", + "public": "03bd8601f987579cebe725c52db9f343744165c023c8cc011b643df1cd0f9c4187" + }, + { + "address": "229uFKbAxjKb3S3dWxGLRUhU7nN2rm7AjJ", + "secret": "9fb9f20b2e6a51603689d48f53f7c65f3fbe37019f6e4dd86f37602599a8c4fc", + "public": "03735784436e95bd5de80a203aebf28f4ff01d51c15bc724cafca7b7681abbc5f8" + }, + { + "address": "R1EMZ6BCUN2euBPftE5P9xMcR2wH6wFyuV", + "secret": "29b9c973254a1fde206af582fb3bb1dd6fe5719180640d5f15a52c963bfa17d5", + "public": "0371f270f8f053116ab75c995f06ad975417c10a3bd6134d6032fffad8e8d08114" + }, + { + "address": "KbDQwkTKbeG5WSWJo1Vvp4RoRktGyDuUTx", + "secret": "55bf5909518a71986710f11bb911c42c9a2af2714041c2cd5cb85f3232035fec", + "public": "02d133fc33f2ecef76aff19b8e0730a1fb3b63287b1a68023ab5403cfc56d02f27" + }, + { + "address": "xVa8iZKV9oFwgCDooUJRpSmj6GV7HGywBp", + "secret": "8590b46cec2d565adf8e9463a5a28b3f8e3c6f6ac7ca54e7446f5f8aa61ee7c3", + "public": "033d2efefd95dc97173cec2327ef9ad8f643ef40811cee511e63370ed052904e71" + }, + { + "address": "mhkWnCSekNPca91xzoGijAzk7pK5xe7YVa", + "secret": "81bef4b4678092a023b72b425ba9518d577e86f5a8b9337f77ce3cacfea56f6a", + "public": "027616c1c5cf8efdd7a148fa20c037c2a3910ad6cb6518844aa56f4b8cc0cbdae9" + }, + { + "address": "2H5W2Jw38hV6eoLWNUPqExSJ8AuQC96Qfav", + "secret": "c3680727fbdd7b7d8b79d7f736886df08470801cb2a868e010b27e4d8414e1d9", + "public": "02811390fbacb53a0b30d76f70acc9da9e06aa5acf0166b8206dbc73c3836b5ebf" + }, + { + "address": "gBqUqD4wvWmsEMk73iZ77fL9QwKXMX2C4c", + "secret": "c44b381379048198f1d676149bc496aee52a78ae356cc8ada3f6ceded0b8f9bc", + "public": "02603067281ccef6bef438e77296ef76679128c0eaf4a43c215df5dcb08a1d15fc" + }, + { + "address": "2aBtN3zU8f5nHW4z9HgRyaviqQAx4kNoUBt", + "secret": "2584c7512d2ec4a9e2836db33adfd709676768b823266260d8ef86abcfaf3cb0", + "public": "03c64e69cd4d2c448425dacbd34b68104820d14dcda260a9e088e1aa6bb13f9832" + }, + { + "address": "MpJfVPxdSwDePFQqzqreFqFHyFPnFvPmxZ", + "secret": "8bf59fcce66654480b1ab5f0d792532b11829ec84b93ee325f4fcd7b7da99fa0", + "public": "02dc2a97e5e0b5986db4d7682928b3d18aad18a4375b2ca4f5d5b611592d629170" + }, + { + "address": "fMXu7ACfhpAddDQUcYMhFVtBjfeXTxPZSg", + "secret": "ad848094a7299cf5e485debc38ae745312f1de43297c214eca1712a8ed56aeda", + "public": "022e13429bd73cf57a0b81b2d14e99a6f215ca643f567275b9a4ea48aa98d2bc36" + }, + { + "address": "2HzJgfGUhaszpeqvvBkxTunGQWvMo4oi4De", + "secret": "817eafc5caff271c2a4caa381c4340d70594110ac5a5564b322b2bd9b7317fd2", + "public": "03f2f8dd9b867e863d7afc5e222d49788cc80f937b3a69d27775866f28ee557f00" + }, + { + "address": "TEfAFxc3b7BTnq2nBQNbwNDdNQVGLEDzZi", + "secret": "040e3177db9566e5902b2c8313d31e29aa17015580de4b66b0dcc3a6760fe697", + "public": "02a8cdd0040d877f7553f35021f8ff7bc13cb6f6f7b16d4bf71f1eeab8b417ae48" + }, + { + "address": "MQ9xeCGvPPcQsrjeu1tQ6h4W1Kf2q9BoG2", + "secret": "9aad6041f7eede6e858e0379c0afd24f60a9c73346be12ce9fa23bc58607f0e3", + "public": "032afabdf323ebf7b961340fd32b8cd5dceaca5b58f81f3f28bf547fc978fb34c8" + }, + { + "address": "23cxi2zraJZqyHLG1ModJpLBSohWDn7T9ZP", + "secret": "cb9886037a6d33329a05f8eb2668f9c68721682ac4f68767bbed2dd087938b5e", + "public": "03923baf3cc7f3e53edf3cdc60c7d64f83649ec9b8ad611a190bfc93f77cf165ca" + }, + { + "address": "2ARxqoM21PhW9zLqreZvoyhG2xuVQBnWVsB", + "secret": "b8d18a20d90c3be8509e1a1c14ea2a084c546dce3800fcfd64427e8e11cb842a", + "public": "03c6a58df05a703a561a9bda49ac053ee063f4684e2d689e64a57eb415a799bde1" + }, + { + "address": "2hFDnFqkKbfBgrShepvK2DazTQv4Lvcb2fS", + "secret": "300d26fcf88f23e874f714b16e5c9539064e74d3e5fd379e0bcd407811885ca9", + "public": "02c8b777679aa8fff406b3065f92815e1e7dd4e06acfb2cc2cf73d834640efba6f" + }, + { + "address": "2EMb44AyrsLU9tcMaGZH5qKMAWURWjXtj1C", + "secret": "2c7d8fbc9e91d0754a184b52363b2c5ce304031b30d7488a15ec53404ca1f81b", + "public": "03aeb51a80bd56711beef6bbbfc26cfeb2356e932fbc3c6c6b8c6d7442b1d2556d" + }, + { + "address": "RsWcgENNPyhM7KHFTo9VCLw5b4uU4CLmpU", + "secret": "ac9a2f724bba9198c756b026e5df829b8e72df7837182cff61a961a84ded209b", + "public": "0364313c902a7e6197e95aaa85218532b2626b10836d2dcc8078dd18022d3a28ad" + }, + { + "address": "2SvGwVovNFjwS91HNF1vrMjEfT7STTG9r4N", + "secret": "ffb644d19360dd7eebf66abfa70e492ed3a276aefe38c172a11b0284aa169541", + "public": "03f3a1532a61087e9bc8f6a6ba81102d429de7414ae0085ba9f51594e68e3d1a97" + }, + { + "address": "rZMkh43Pod6kpNBGNaBXNoqXotme9NHBC8", + "secret": "5558f95e18cf37496521c244e37fc0f842e936d20cb203c3a0e6bc8f6d2e8a9e", + "public": "03f571e0a9a233ce8cd348606b097c728649f7c5c1dcbe0f5ca2874dad3de77919" + }, + { + "address": "2RxvaL652F4Wyoq3PLjr4tFEaSbbeeJZBqe", + "secret": "f5b3d206cc14c4b57df04a2fabbbaf91cd6a7e9d07c1d09bde4c0ebaa43b3ee1", + "public": "03bf9105249ae909f87dab44e18a8a052940a17180b4da0f5222f8cb5f2562da76" + }, + { + "address": "2Mt4eBP7iXYxYJD59UET1DpFJSG6HoTavJg", + "secret": "7ffc75211c93ae6363522dd6b1750ff54204c0f1204edce6e368ca3b771ba821", + "public": "0221463c98407c8e24b21cfa4ec10960747daca19569ea4b3f11c71e98d27da0f6" + }, + { + "address": "qDQMt3d5dYCohkMT5B6izsGHkPRUeVZcLK", + "secret": "b683a64ccb4319188831f8ba86c7bcb596da63d10ce89d0ca64c8dd1915cf669", + "public": "02b6a6fa5b9c8ff7836fc761be9ab4da0d2e27c53ebde0d8869a7d128cc72801a8" + }, + { + "address": "2S5Nk6LmUD1cPeVk1gBkVT9ca47EPxrmZqi", + "secret": "d3874feee7af97339d66a43890b16e1fa4e490ad6d8bca3eb69ce2b20fd8ad55", + "public": "036918969f7908670b5dffd58efd16003757f43e647c7698496ef534bb7332703e" + }, + { + "address": "2j8fTL6mXwNG1aHz4xfGLcNxomnNtsDeyXY", + "secret": "0f3bdc50d6664a7b9b1b537aa8c34bdfa648c9a3cbe5f45afa88cdeb15feec44", + "public": "0242704747967357dda0fe5f6f2868e2e558dc7fe8bbd653164cf87b94bf309cdb" + }, + { + "address": "2kEpigdrfgbuN2sczody557JbVjLVd6CtZb", + "secret": "a34e6bf7b8d3b20500f51695d36b667d9b88ba9f442cf4290260baf8e15bedbe", + "public": "03300db6dc465d523c01152f1e91ff50537804890a0b4457607e5bed41ce268993" + }, + { + "address": "2KGErAn9X6KUykj175VQ6GWkcHTQ9xg4yvK", + "secret": "c6f96ec8d7b9bbd628852c417ec221fd8cbe301af5800914bd48886099a99a31", + "public": "027b6393a34246599475d26a5c35169431d79ce0b062d3bb25ce4a00b5f469b63a" + }, + { + "address": "Md27STrLZhDXCzeyiWV4dnYha4LLwoWbjo", + "secret": "2a0b423abe24b1554fbdf5a0cb23b8c537ae9763e94b27a4492ec5f73fe37c10", + "public": "0249ab7ea2652438992c2cda1f23b01678f9de1b037d2db8c1171c7e3a67fdddc1" + }, + { + "address": "23YsH6ZZcyVsVmoKhJ1GgFL3HudWQwUgrm9", + "secret": "db525456d04f0fec18a228065fe5c977e818854337937d491a4eeb9401236550", + "public": "022bbdf07624dc2bb2ae619781cf217cee4121fa53267a7e99c275ec9b692f8f76" + }, + { + "address": "SCWSUcZYva8MDEKRY7YmdYRoNj5sFe1XQJ", + "secret": "e0912a7bb851cedca4500657294f1bdd3fb6549f2187d458edd7c8cd468566ed", + "public": "032e20e706fd2f9745569d6f714c6fd0941f6c4b2806c00ecf15409a8d9256db72" + }, + { + "address": "2JgFxPbynhqiMvRREQ45cKiDdsiibSjK2et", + "secret": "09d3054ad1d287561b31569e18c1d46a3a45ff74ea86515c1d0aa119a993b717", + "public": "031e2aa54504dd6cfb2d6911033df39de005a31bc110916dd046bf15f82fc9347c" + }, + { + "address": "2k9byFja2RVJa4rFc9reVuNdn3Qq3cZFoRY", + "secret": "943b62a940a348d81993958200d8bdfc00c13b1b376478635e07b68f080a6178", + "public": "02421da715e7043dbab22e0016018e4c94e8bee58f4c9335fa115f0c83244dce18" + }, + { + "address": "2MoEjzeLCtzMPv8ZGbkAkQeC5479wH9ha4w", + "secret": "c65414ed2eb2d83ac87c77ac6646ada456573761400108b8e0d05de9a5ce5fff", + "public": "03741c4051901ea5bff8e8d59676f0fd6ed7763d295e92fd1d800c6363da1609ff" + }, + { + "address": "zTtMPPtk2wiUac2uB7Qc1k7JC6ssPnTeRy", + "secret": "79a8da2939915b0da33fe11abce0fe80c7a68e0fc6d372b500fbe06f3269d165", + "public": "02489ef908c3f224d8b8e68d7e9399dfa66ff53dbda4a452d55a01ca2ff7278d7a" + }, + { + "address": "21jfiioBpG4oYW8KjYpSs9cV14aub75ZQha", + "secret": "9aa3371acdc4444d281a770e7579c42d2b81f24b5e8c7434fd3754212b577bd1", + "public": "03d4e9be8f6b7378f7448435a1043636bf9a77602b6a2446c417c8f0d289cf04b8" + }, + { + "address": "2jhGXgUkXV7L6o2ooBSJTRiZp8voCXsws8L", + "secret": "312c20808b5c6ccb4305db4cc49831322ed841aa354c5e6f6f78ad58ea770381", + "public": "038aec6a7a2ff76b2ef68347d8cae7b6fbad292a07466ec69ba0643bf21ac3b2cf" + }, + { + "address": "hkQ28aDsUPiqtGAvVdhq9HS2JYGZPvSy7c", + "secret": "fa115d4a9929c01d41d7c1c23a197f377fb06166d0207f859bf469e75675c6dc", + "public": "02896b7c2842f4b641a3f723adc9445620f6ef1f6c354846958569349e19f15a9b" + }, + { + "address": "2HXGxGiyTiiA5JViSuYDva96pacPkKEg2DU", + "secret": "1091f0c9a82613f7879461d623e5420981116629d8163a6486ee564c95407f9f", + "public": "0277d34e24239b4be68dee716c04c4f29961bfdc89c0f1a90250d8a4a1b0ec508b" + }, + { + "address": "ETt8tPLv7KdEn3isJ8ovCk6Arpt38R8Xi9", + "secret": "2d5964c37e55bdb7daba25b8f73cd30e7658263f679a9771c6eaa76d73a469da", + "public": "021098ab98d1dd4beabaab7108e2dc267d96085defb391db4797119bdeb7b6c10d" + }, + { + "address": "2aL2T8aem5nGM2dzzkQUZyhoYziUZ2q6fWG", + "secret": "ce625aaeeb7aa8d0967c20a572040b71622d225abcde8c7166f0e355163be56b", + "public": "027ab9006f88a03876f9ffa2bdd87fb687f3c9edfcec37bcb4023f7fbed35832df" + }, + { + "address": "MKutfh1PF7dQ2yyLLyVyUyKLrCcKFcrXi8", + "secret": "c52636ac3ebdadae875e9a74b264d1b2ce4c82034415ebefb5827e1bb6fd1e4b", + "public": "029ecbd866ab779ed2cd90dbfb34b7283da00d3f9b71ed805ca92c6944ee30955f" + }, + { + "address": "BcpL5eUt2jXBMCUEYJMKbDzsNHqFbapSUf", + "secret": "0ec1616139c61bdcd4f93d86c1115077e769080410b5d077718d43715eb49323", + "public": "03550226d015d7cd3298e48acd54bc0a5698905a87c5ada8467d4d0a0565362f7a" + }, + { + "address": "C6wHriSkyTXN1MxkX3c4tDFUw8qAS6gZt6", + "secret": "7e74eceae672c54786531c9c37840da266cdccdd334271a4034fe87805fa22dc", + "public": "036af0726c32dbda8b224d655b1f572bcf625bc8701ecc1f53fa0e5ca45b2a5809" + }, + { + "address": "21QWTX5QyFovW5ezTQ2as3ndPtmk5ScYiFS", + "secret": "65da770ee49d0b6f62cd85db5153a6961d4345f02cd1e460209b9abac795624a", + "public": "03cb526f36a2bc9dce0adaa33c27cb10302927c9ad50de88ea541e81789b246298" + }, + { + "address": "LA9fKvqm5A9k1agtszrWfnPKKjgtu8VxFR", + "secret": "4e02f9b57a3ad01a77e30951c2ca97ca0955f39a54346ce47311cadcedfc2f08", + "public": "027ca7b0b8a83845c3d1318b3e54ba94fccd14f259865dd770b80443b5631fa10d" + }, + { + "address": "2TxMvLAFWwm145FndHzESjU6HZLU6r4vQAq", + "secret": "c0c11b487b7d307d0cce023520f94c9d2e5d1e656ea3eb2ca3adc1361998ad04", + "public": "03ac77cd63f2176fef590a3a30e619e4127fe6c1b45368682b468375bc908dbcf3" + }, + { + "address": "xd9dBK1mKxiXDBHgd9Eg35Cz9sLbkgcLws", + "secret": "ff38df8c6834713082048d42afd3218bab991ca44044c971774ff2fa7a0dc918", + "public": "029b1c4622f0248a0975cfcd8502fa6d528d6a2a6d397601af0628fd09b6c4dcbb" + }, + { + "address": "NwGDy3Qoj6k8nqRqaTQk7r2jUfzLs5AEny", + "secret": "b79e882093fd2adb54b4fa6e408cea0273f8252acd4179540d7fdda6ad367dcf", + "public": "03dbed449745129f24b6b18b68272ff5d9fe3008ad4670adee385b669674f34d4f" + }, + { + "address": "d4H2t1an8nB89LEK4Jt5mWdFokoW1cWieK", + "secret": "4d9d83192e7fed98e7db7ce06a84c0c0b7d909fecdfbe5d0c357f69ac9838869", + "public": "0259d4c22e3388e6720f75481de2c0ae3b45d08c0e1c8ba6876d2cda2c65d2d225" + }, + { + "address": "2jTF7ftopY2Hj6xqNeLGcWv9PtPZoo2JYav", + "secret": "5342506eefc9b01f50e4844179ec6d2c180e35b28b05f56b8f6af2de40f6edd1", + "public": "03d628a9bb74f35bc9318b7b28ba90421fbabd774cc0c004bb26b567c3beaefb94" + }, + { + "address": "2Zbxb2VLkptcheURB1GvfgCor8c7QMtiWbr", + "secret": "7c4cf9f367c4e6b48edd68b8c8cd9e8871f7e221374f2b5d8cd3d08203b076f7", + "public": "02aef811f1013bbb834716e05e798f73e5a6921f58dfea6c8c3398b9f3019fdc6a" + }, + { + "address": "2m8BVtBjvPHX5gki7X1BnyiTmK66t35mQDD", + "secret": "b057ced7e5492e9ded80586b5eb2f76114a6c251ed5e39b24c3ec21251fea1be", + "public": "034b17a6fd6bfd049ef97e8784cbf60e107c8221b78d5500cba83aa9e59cf738ec" + }, + { + "address": "2FaK8WZ1F1BKHSjbdhyfSsJsEK3QoHcJSKi", + "secret": "c79f87f1bf048398a6472d874391d4cd3b5c7a39a6ff61e086f175640d7447bf", + "public": "033db0c425c4155a970fd67804944b021d40ff2d3551950ed9da5c610a43425d55" + }, + { + "address": "2CRGhkAxp5buiGacrgrfubi7Uhn4X8KHJdG", + "secret": "26865442a8640529bbe092aa2f91668866ab75c8bf0749f4be250f873f62881a", + "public": "03cc4acb6abce20eadd4ac2733842dc94d8b8af31cc6ba1199190c48bfcd07e7ff" + }, + { + "address": "VNy1SQuLkrD7DFtUGCv2ZRovVoRYTgQxBB", + "secret": "246e7490fb721da5d00e3ef037a0cf91e83b9448db618d4e7f1529a5db2f3dbd", + "public": "02c5697d970be8cae8b2f74e5b8482b872f130fd396d317494865d761303c969ae" + }, + { + "address": "gRiFHzstLZD8DYbVGUwy5wnX9zA6yVaUs", + "secret": "d1e407b654de28a5edc1e76efe740d22c57e12dffb6651851272e1b50543822f", + "public": "03acd87ee0ba18abf1f86526d38e7e0e38869cc08f612439ee3a30fb3c35406167" + }, + { + "address": "2XAGsYg7bbb6wcFb6TJzSsutWpGQb95LQLS", + "secret": "e6a4e56812750dd194a556f6e0777f09fea03b4bb22e2529344f7ab664e64321", + "public": "031039ebe4e1d925358ce5640fa9b740238ce14f568d26835927449c5274e8a992" + }, + { + "address": "pYg6r2ysRY1v84tzCunvg9G3VZkF6cD2LN", + "secret": "7c553337f10619cd16eb1659a3edd2e897e7687960f27c6fc4b56805b048c3e6", + "public": "02a21ce35dc6e62279f2276e5a3eb684c6f15164218be90b39caf52fb2b5cc092c" + }, + { + "address": "wRT6Q3pkwHcgqWQBMh5QJQgzGQ9p2rDo64", + "secret": "b0736043e34e014da806c851fd4ba9b5884871f1a8bf907255d0d75087295424", + "public": "0231bdbf26e1d2bf65a713ed36008a6b471db068266de238ec15d02f46b1a349ee" + }, + { + "address": "Zu6t4hJBBUJU4ovfceA2HL7VSPybkzxPk2", + "secret": "1994b927514fdee4f75f6421a03536eae2fb2af384e9fdd8d070cd1b8bb1d310", + "public": "0220bd88e29aec79bdd0b5ff0117273722f4e27e37e2fda6211489bbe3df06c1a8" + }, + { + "address": "rj8c2gwEmCqPPQ8aeCrDTkJdmxDoScddVA", + "secret": "3bff5ba7558f7b7dbb57f9bac31ed15f5c8593497e847124808990dba099137c", + "public": "02f4de29bd53fe8376aee85bbdca748fb83bf80b1161efeaa3e23cc939035de782" + }, + { + "address": "EhEDFabctpkEQaJQ733WLfWUn6MpqZU42v", + "secret": "29da61ba08814ac6cfc1c06e931142afe3785bcc8640ad712d817de2fbb0eb23", + "public": "02c890ef71edf9fe2b1d3b8a8a7cd8e0925e9a55b093fe0e34a1ed5c336b0051c9" + }, + { + "address": "gpAimarggdCr22gAJ4kxiF3aQecXaxQR2V", + "secret": "83b195bedb8c8ab123ac337aa943fb8366e87a0b78a46f11a6e99811b754cc28", + "public": "0233a097a9f450f42884d32110ba6b9b384339044ad7abbdca8a9dbd10644c7c04" + }, + { + "address": "277i1qEXLAMWB4EWpimpnHSrVu6zB765nfM", + "secret": "d4e2ab32dfac3fd6db1aa5e48f93369f71fb22519512aa08e27780e900bcab8e", + "public": "02734ce3a6116b3701a67d169c0cae42422bf81f2e16ee10626ae8b2534fffc8cf" + }, + { + "address": "vKSL2GSF1kf1GQ7dLqqLsvJBXbaijecZwm", + "secret": "1e9ba0985d8e225e6b5df2a15e38503886df0fc2173b3e3d9ac7660a72f3ab5b", + "public": "0321019f74d1f922b8bb10eb6a5445c7fd7cf4e4dd4f0867bf64f43c0be0c0c800" + }, + { + "address": "2E83iNBy7MQyBCuHy42D69ib4fY3PmpJGzK", + "secret": "ac1edd6226835a859e5fe8c5cb1a0fdf94f68ed17219da5743083aaf93f3eeac", + "public": "03c4b5da359619972014f1f55197d9493e392aedc96d9e814ca71128747cfc20b4" + }, + { + "address": "CpZCFZEjSxMnMqeWWXuo3QgNw8zMUS35fb", + "secret": "db3c84f4b276bf9985c9a645f92a477fea63e5d5eff9a51c35d323a87f9b4c42", + "public": "03dc61b6619fb09fd7d69559f5c6775651b92c5c988290f481cbb7e7a2fb8365e7" + }, + { + "address": "14fcNNPALfDmtfjt3iqnUx5ECKozQwpNuY", + "secret": "00d33565e34e583a79468d6401a4789e7d623fb3e69d8d20b9f4d5751f7d0551", + "public": "0244b282442667183a585263c8a631c7abf0245228829b59d7314da2792066f92d" + }, + { + "address": "yqK6WFVBpuDN4kfcqVqMi5YDVkwE2iuozQ", + "secret": "e155a8a39e9e4ba79e16ec0ba2f7c60bf2bbb9b70011219400999a920706345f", + "public": "02b55a56bc0b74fd16fd17aba5211421f040950e9484483af788ea07dd3d7183e5" + }, + { + "address": "W51H6pd82ZWMw69h51yqufMkFKKTLJ6cUD", + "secret": "ee32e6b847c7061bf1a351c1b37ab31d7c2f7d530a59757c6c69929c9a50277c", + "public": "03186946c764572808287eff9ec29cb1db45511785f3ab3372d77ba90fb27c8f1c" + }, + { + "address": "WeBMYEagMqSvmHsFA3KuPAaarBwZyXGSG", + "secret": "1b3c9c5dd6b081a20bc2d24262b8007dbc2c541b71d18cf38c21f41451f90205", + "public": "031f28f96a5ea3640814207a223679603599e47b4f5f97f84788263760051d72be" + }, + { + "address": "xDmCFbvJ54uUFsWs9JdMVRc4pLgGSfMJg7", + "secret": "8ab8de8bcd5b3ca578efc354834fd5808e732785424f14041b5bd88e52d74058", + "public": "03afbbefa4aab3a996d06d66db94d6a2bfe3c73e2ab06866b267322eedc4e8ad74" + }, + { + "address": "X6yjHdHhJjoZd22mBKzPbtmoAdn1c1GEFd", + "secret": "960bf9bbad1970f6e29a9dc94e7257fd97c2921336b71345575b701853b1b03b", + "public": "029a88fc03edbea796c19081151942fadad9def61bacbe4acbb2d8e5cc32b3791d" + }, + { + "address": "2NtkQYTkB1Gtv5vEuxnJ2rnw7vBx2MaFZ3f", + "secret": "244dff8ab639cd4d1ae38e838fcb970d0e409440214aade40ccac2b0c93748c0", + "public": "02f15c4404d16679aecaf06a4c0a84599287f9a672ef81311c85b25f6d11fe2bac" + }, + { + "address": "qdUuCBtnWFPkqoLS4T4QeJhv1MTFd65ir9", + "secret": "328e730c6ed08d616ca8740bc05de4144f1f39a89b2840636d13dd9eeb69a1fc", + "public": "033cae48014b7dd9aaf8ac182b9d11acaf2119c4e8b136ea2eb8ef42a75e7b45c0" + }, + { + "address": "Ce24goELgjozPagSMjUJrKdYCwfzi7guUF", + "secret": "f37bba7af44d3338c12bd91f95d0879aed78bd8763925dc657faf33f0335b089", + "public": "038ec03df3b4b5c5a51abc135de0d2641a892382732fd2471133b70b9da2a99944" + }, + { + "address": "C5x5R9HUaTp5nr44tX7KgguMp7FW3874Ri", + "secret": "fa0d9ece0ac17368976ec01348503cc026a19510218f660ae0abbe6965233e2e", + "public": "029e6d69030cb4730b95648443820e3f974e70b9d7d5ce2a2559163e0463668153" + }, + { + "address": "2b8k8jUXfHnDpEDk9APRWowqVHMs1C6u2xd", + "secret": "fbe064b4fcd145c2155d717bb1916b1c7d73c1d624691b36bf7df1332de410b2", + "public": "0292d4e8e577b274d72e74b3fb54e56443cc2f4ea586748e86a8311a474457e2b4" + }, + { + "address": "MPZ54f9653bA1V9sDRTgPFgnYWdqdU7ye6", + "secret": "2fdf6ae40789196480461853f075b6bf34fda7f118949c4401b5d4c05dca43c8", + "public": "03e3178668134726e267877354a3e34383823bdffee27b3f7edde6b882fa4b2183" + }, + { + "address": "CicfeSE7jKdooXwA6pb2SFVmTKnBd2b2RB", + "secret": "a1f4b57b2de3389fd1b45bdb838b789a7699c5ca1d0bf458d84faa4a9e68512a", + "public": "0343a7cfd8b57d9359de6062547c3fda453cccbc4ba7524656e9ca58bd5e4f1ec1" + }, + { + "address": "2itVDbUu9t6Y1sJB5hqGUECp3r2mA1KEg3D", + "secret": "2b5a9358c31be11e49985c2f6e11c9039e105ca9175980609c7052cd5ad10b73", + "public": "03c06daebbf6d2c25955b3461fcc8fe73c93f1fb35ec46f0129cd03560137cab17" + }, + { + "address": "hmMGDgFx1gEVCA7FsB9Xo2AmiGXnYaZAck", + "secret": "a53404405b2c79359d04eaea710d283371a92e18caabe8e0cd169bb77cada7ac", + "public": "0332aed6d0d7cb573817142a69be2f34257bd95b95e04a7f29750ef284fe248ffd" + }, + { + "address": "2Hz4RbBvSeNbTwhFer6vV1Y7uUfqbN7FiFX", + "secret": "f5643dcfc17be04b092340b11fdad373d4bc5cab710761bdcfb94d76c005383e", + "public": "033fe130623f83bba6cbfeed537952d030f0ee3f99a4b9bcc18ebf6471274e1851" + }, + { + "address": "9Q5qJ39aeRmY8ippsZCiodMyon2wzfhDYk", + "secret": "37e970e52d13e3b95c4db1e5e5b8b13b87a03fcc433e81d49912726033ba5b12", + "public": "02d02350a1b27a087cf0301583551ad488d336b5cd2dec48006b6dcf2a08ab0509" + }, + { + "address": "pXys5mPkk4jwQW3xYRyqEyQJLKz4WEypsv", + "secret": "381dd50ffc4dcc059beeada39ce30da070c0fa67fbeff5f4b183c2c3e427e7c6", + "public": "021a36d9ab658c57ff3f5734eafed081feed61ae1d6e15f0fd56bef992ab9a326d" + }, + { + "address": "aVp2GMSoJaXJp98jfksbyGxUVmkyYCTyHK", + "secret": "9598203aeae46c16a3f57551ba6541dc83052eb62bfffa65c67beb66e2468c16", + "public": "037985090f64098cbe218815361bf49a1143de4260e85519b9bbe64a18d7a009a0" + }, + { + "address": "2d6weK4E7LmeQ6viCECBKteexwQfmXJefeV", + "secret": "55c82c51607d2612d2c558c87c0ccd2b1c1b02a16616d632f09eded8ca9eeb5d", + "public": "0378bb0f40994c3bd0d789b5cc48aea01872136c0e25eb27e0593c4f8fdae2b63c" + }, + { + "address": "17eYicrsFCUDmQ9Ay6k2enNG6kDRpH27Um", + "secret": "1d5a0997833672800fbf7f55b9dbd5eef6bc53c033c0659db8a474faba7428bb", + "public": "039fa99bbce21aaf219d1eadd3c9851280b447a21f5e42c3083e01243093f5d237" + }, + { + "address": "2SSfBC3MeLVgb3XyBGGXsKYzckjCbYKUgsP", + "secret": "c948107863c1f274f82c8e7759521f575b616fc0b593bb7a3f16cb84337ead51", + "public": "03fb19b4b9769665a86d3554ee26b7e44585f6d9a90109a915cfde83271d7bc5c3" + }, + { + "address": "2n18ViQiVXuUqwjEszaSWvi1kANDYKeQH5y", + "secret": "497d87deccaf1e7c30cf18833c580ac4263ae6e010273805b1940a0e652ffc3f", + "public": "02e5ee7a913f43f7f6adeb6a6f52f0eed025267b930426747909af342b5123e106" + }, + { + "address": "2UmBGe17SSXBpYpp1t68zCU9ojfjk66dYNH", + "secret": "d42ac161ded15f405c83b5bd2645ffb3f9c8f28095dbe2277de723395550a453", + "public": "02118d8b12f20485921989d7156e9cd06a9233abe03286992fd94116fa57b8df4d" + }, + { + "address": "U8YL4g25u9NnpALPn5aBGbosJXidvCooCr", + "secret": "b6b75cfa9529e12e39394a5852a077061b172da0cd6090a4271f4f942b82e7d6", + "public": "02c5094141d4e994dd81e81e4e91a6b81051370b96ebf41a624f3499f9b4525119" + }, + { + "address": "2U2k86ibWdUoe5BNBj54d96sw3rFYXnSySH", + "secret": "e715f598acf607c8552679d0d1833e4ca10aef44e4d662aca8ea84adb71840e9", + "public": "024041c3512656d1736bf7ee532a726ff43a4b4b93a89cf437640ca3f6f17f8eee" + }, + { + "address": "FaibKxHFYdqaorDr3KYXq1pnAYE8581MuH", + "secret": "cf2ebf9d3f6d34189b32c7e7730de432e6ccf9858becc80be734523c5876ce2e", + "public": "02b6b3963a2517bc2010d3042e5e8e595c6074538b22db7fdbcc0c2d6cf5931922" + }, + { + "address": "pB9Q5eXorXGxNZtxfr2Mzuk7xFBYNpMnEo", + "secret": "8f92555b725ed6e25a5e5805f53c5624b58a9706cb144d5a07d60509713fbdc7", + "public": "03c97d38b690b41240cd7e1bbf23529d178742736d6f1ff9f5a8a688747eda0e71" + }, + { + "address": "2Rbxzsa7C3B6cYTdk3Fun32woki93ewxvNu", + "secret": "bb6d4b2d400e6c1b631eed7d4f572fabb51081327bb6645c425d9663e0ef8a12", + "public": "0363d28fb085932c0cfcc17f1174fd70973798ce480af85ff4430bf0bcd4715199" + }, + { + "address": "Diq3gG7K6evBUEE8osDTPq4QKtXzbxUtDi", + "secret": "81b5d2598b5dbb522a57b67073bbb6a130f0711923448dff127c02861b03a946", + "public": "03b0bb0ab5ca2984c0f0fcada6907ca8250d22a001ee69380b083df443265e3a98" + }, + { + "address": "2epzEVetCYHwuGNZefGrZmzYtpeaHoDAQEY", + "secret": "8dacd77988acda3ff11b62ea1d8ae24b45d398b43f91147cac23451c5b68afb8", + "public": "035afc03e6b69359125261b3c78994c6b04525f09b0ae1c5111357be772ca88aa1" + }, + { + "address": "2Qkx7LFzEfxJzqWRPxTGjE4h8sFwnnfZSsw", + "secret": "d828a1ea868827488473c9cd4347c10408c00b4b42c649a975f9385560128607", + "public": "0381df65e2ae07acc12d48e09253698fa510bcc9c9f8ec34a136c9fe248c432103" + }, + { + "address": "gj6RTW7z32ScNorWP5WzHCgPPrh3KT8kmU", + "secret": "6d10041a9ef43512dffb1a94c82171ae2afecdb62a729c48072a877967d2264e", + "public": "036bc174c86d63f4470e151ada6b664dfd7c29bce402543ed249aa7ba67568df00" + }, + { + "address": "zAS1wCFHtdeUgwRWFY2N4cMCPnSTLd5R6A", + "secret": "0c072c2ec7c3a4feb9b946856082b9ee4f35295bf9b278349a254d3d12260c80", + "public": "02439f39e43b0a399cf84982f1e7085b5a2c0fcc248aa6ff6a7a80e1260c8293c2" + }, + { + "address": "6Fs7FRMk3GN8Z1wxksyJQTbmwjgZPcT3Qj", + "secret": "11fa5cc4f1da12b142b18f031b8de70588492f3f7c136b8227236da184bbd17b", + "public": "02773f6b07f15b38a96b3f3395206513372e92376098c2421bc8778424ef19a199" + }, + { + "address": "WpjbGPfvrPARdjnfARbsPhA64BU36oaKms", + "secret": "a3ca77abbd98c442c15ec3a9d755f708474576986d00a082b4999939786b8bd8", + "public": "03a4b79952218f7d035de076d464eb61ef837bf58db060a4765462c95b4342a8a6" + }, + { + "address": "26XKvqVnXe91pE1a6nnfZyjHRmNcHNQX14Q", + "secret": "816345565c3d408ec600f7f012185e5e35fb201a2517f56235e96730021a032d", + "public": "02d5ee48f9e78e6ccfcf20716ad8991624df0e2f08f9585071852d7cdab2505306" + }, + { + "address": "6ymppMLFLv9hDKngn3vUGXuKa82n8fVNRX", + "secret": "04341a22e621f8e46dace5b8f4e6b4a7160b864474c04c3d96874e02d1ef1277", + "public": "038c519a633e90ad55987f55ee03acac4bf269323dd3e5367597e56dab4f0a16dd" + }, + { + "address": "3BfpvXz5km93FKb1L9q3e4gZ5tiLoNN6ES", + "secret": "388a333fde8f497babb32008b17f4172849320f16bdd6688fd6582a52d61be2f", + "public": "03ed04ed7f880f3cd8290b53ea0f41f44f227e842abcc43d73a9640e5ce216a79a" + }, + { + "address": "EaBntaU8c9V3EnfSo6uALdB7NVNVm7BSfU", + "secret": "2f0cea8d8d0be0bb2b826b813cd24da9bc6a059f785dfca5f372d1fa3ed66020", + "public": "03893d78ebea3f3835ec5b88aa5b0fa616a165af23384328a1689c684af46f74e0" + }, + { + "address": "85ewkkmYE23QsaJ8QGHDQ6c788CUTDEh2m", + "secret": "8156a464cd249208b3456c7c1be5d8ecad3d42212278cb5db58d036503316501", + "public": "02cf694432823e75825bf1a9034c2b7ad054210bad5d58250b0dd8e8107a808abb" + }, + { + "address": "2fkBZZHm9KzJCj9uTwyU2EKeGVGaq2T6Tsh", + "secret": "1ba157b63be9213eac9504fe35bb9b8b8441256bf486e1184d1ec95de2360b62", + "public": "03026989d4b9ba7c82055586525a3081b52ef0bdec1c60dd72c5cd2a317d7b7b9a" + }, + { + "address": "shgRMgZie6idoREA27V8zzB4YKHp6g3D53", + "secret": "0b530bc844170e8c96e2fa0270bc25b18158b1cd0a0dc335a2082ad78ab952ce", + "public": "02b9be84fbe4377cb38084efb37101296fa74871438153bc7c10b50e648a467f59" + }, + { + "address": "2WXMUMWm9BxPgg1nu8Pjo9VAA3kv6z1wctC", + "secret": "677e5a6bd11d2d7950ed67cdf19b2321a7ef6735793540615d7dee25f4a89099", + "public": "036d544ff08e196318752c2d0694cfdd2df265fd37f8f701309b206169c894464a" + }, + { + "address": "9h7vgZXrxvpSNkh9v4di38NfsAAoCKxdTV", + "secret": "64687125d8d1d0301bcb7c7f8254148ba674f2fd7976fbfd478e388e2fbdaf34", + "public": "03dda10d0169d9492fe86e73dcb4bee444f8655a3ec54630599e1873b49d62361c" + }, + { + "address": "2A8uy8LLb5VxUt9z2V2tqvFJZujEQKBvHk", + "secret": "4418550903f77fb6afc475aa45f6d46385505aaa261d3333782739aac63775c7", + "public": "022ed942f2c7f4ae006a56d40d2f2973a9f6489539712b09755611e519861a915d" + }, + { + "address": "QcURHwLk8cNaycfrcB2Rw4eLojXTXFafrG", + "secret": "22ca073353e4e79b3568d7f273bdd4d7798f32211856394caa568c06e45eb379", + "public": "02a633a0584586a40799160dc620f5198cbf9288ca1e067cce1f9983e7cd536616" + }, + { + "address": "251iuEvBheMsacZDSmnQeekfPtwjQpf33hH", + "secret": "63751fb3da5decacd945ca81560f083dff8eb89807b8e9111e306e547578ad5b", + "public": "02ed51caff4445482542a0b6ff7156da9bdf7cfa8d722c7b181c1c402e5b33beea" + }, + { + "address": "CJPiAxCd5B6SEg8gwPDGFi8wfQ7MmmCY5U", + "secret": "1ac56d8474ba1909a44e93fd62516514219c3df4b1d83a0caa3cfc8a9926ae98", + "public": "021c30a39512cd8ae0a1dac9bbe80031548c2efea00046312e84bb90265c674315" + }, + { + "address": "2WngTwv8JkpeBGnz78k9WuzUYhspAcjV4zF", + "secret": "e077f3e181e3870cb6c3f3ee95b61c3cb61a05c40661073729a71e228940486c", + "public": "03da594d2e0fa86a0e77bc47b832fd1f270189b8e509dcc14e801103a202388467" + }, + { + "address": "282LaqNpQNhgBAGQW3uVJgTTFFbjX1qvAEp", + "secret": "26e1bf94fa2c8a12ea407e10bea604142e7b81c879cadd378a8c151503a1dbcb", + "public": "03609ceab8230f56a60c6d85f9a4ee0b5f3275ae6ee204c297cf3906404a0e607d" + }, + { + "address": "2M2nyEzS8KcEgBHTFpTpQu5WuCHMqpwyaZQ", + "secret": "485604374652f35a5812dd9b75019d7082209c02cf775e837500fd0233436a03", + "public": "03a7cdab6917f1f5d458774a1a6a37216da8476822bc1f9e89c66bdc7cd0650997" + }, + { + "address": "P9xPYDRBaZxSczCGXnkepWtZfvjKWcjAJr", + "secret": "9abd8aca5eb851431dde8a2aba245fa3dca2f196596c75bee0b4b1f5c54a8bae", + "public": "02baac3167bc9450f0595027f30bdd5fa52e8e7e2c3db98528b4bec3b116ba03ad" + }, + { + "address": "23avPf1yDCPwYDooFJ2uA3ygMshBq24oa3b", + "secret": "425570cb9fd473ffafa9c3b10aa9658301e94171cf6625b8a0c8f1a1f284575e", + "public": "02b3c25bc926088840fe0325c4c277d1e5e135ecc47d77ee30135824767a682af3" + }, + { + "address": "MFY41NGXYtAxyWsrSPFGojAVuLRUS24tZ6", + "secret": "aed7361510bb9fad15a1efb6599d7759ae3e4c154145f386e415d2d86af09b3b", + "public": "027658dc03f023433ebae5b19fc13110b8bc81786355a62cb0395fc4f3e44f200f" + }, + { + "address": "2mJhg63fvEcfvHkjABt1sqhsV9U1R9fi67g", + "secret": "c0739f6996b0fece57a490c12a6b037739526f709e56e8ec93db7ec58b27a341", + "public": "0383d00c097840d92b66c828d555f038dd23f160e1408394ab9708ad9602811803" + }, + { + "address": "B7uERaApqSwMahW6VeqZ2HekW6EHSRLuhu", + "secret": "e68379b76208250614afae494bbfe5da612e9c0de863ad2c916aae46f5a92887", + "public": "0256404e09850fdbd455763e45b75b79aec15b5eb005cb89b906fa5c6099f84ec3" + }, + { + "address": "68qcyx2YJY1C1sFvBkSPpmqpN2G88e2CvA", + "secret": "f9adaa10140355edb590e61818712040662491a6eb59765fd3d8364badcb27bc", + "public": "0321c06486d367c4c40313672c3b6998c7291e3cbe0519e13827a7c4049d5c16a3" + }, + { + "address": "2FaMkeRPxhdiuDhUhXqLPv15pnmsS1oSkqo", + "secret": "f0ad71ef9b7bbd682988ee3b7ec68ead4c9e7dae2e0fc41813ccf719b6ce2857", + "public": "02647a9839758ed0830bdeb1c1ce2769acbe4e8deeee42ee745d3d7f18e8f261d2" + }, + { + "address": "CFdDHPNwmVk6WhC39WCvWyrzs6SRo2bLXz", + "secret": "ffa8b3da58c93aba377e1292afc33849cd796d826d185aa04964473f0e978343", + "public": "0288f6df8b041860d17fd8d991c87a164ab51905f79c85bf93930042ce196c1df9" + }, + { + "address": "FKmFe5i5z2krYxQkg8NTq8PgPXRdP6xjLs", + "secret": "06e70a542984378260026ba1a0cb09fec849a6e3de827129be09234c45959046", + "public": "022df795fa62b6497c171898520b4012b89ef28e66dfb2ec4c01dbd83d6a633d08" + }, + { + "address": "NxKCPRWfvHmpavAZw5MjP5d9JcXieC34Kp", + "secret": "9ccb0d6970a675903491fe280f6b07dcb018d3d7e470f3c1a6ec2984aaee7bcc", + "public": "0220b8d468f5f1f65ef33948aca4606fd21bc8b908a28f14b0de18dd18ccebb838" + }, + { + "address": "RJgPnJMTKBo7KuEDPd7GQQB4DeEtyczUT5", + "secret": "3a765a74fd919c407a95ce6d2ad9491641589a60878b785d9e18639e3ed185da", + "public": "03fbfd66876c8200c688488876f227df16a665e50f455ad01b3264658797c54f73" + }, + { + "address": "2ZK6KxmX9T9qk5UnFb9SfNM8LvrJejux5kt", + "secret": "0990c94bb8b0d8f7cd3e7e097efc6e85525720992a9b8af9bf1f2e5127f11277", + "public": "0393941b893f7b4efa9d0ecc06df1b55d46ade9fe9b385bed458fc172094b9cbf8" + }, + { + "address": "2N3RdM5K4r3eYmHCFDH58CnUGx1gFMmx9o7", + "secret": "8cb43acb4b196c151e45227fbde9488d9e15bbf8da3a1b45b8997dada8700cde", + "public": "03f6c1da3c8f27ab64794a00599887c97f32cc9e42a822451ecf26d508eca9ad82" + }, + { + "address": "2H1VNSr9z5w1szqtva9bRUCLXsyvLNSXWrq", + "secret": "b695dcc4a615914926331365f1e894c6efb33078e44d87542bee580574f075b5", + "public": "035020067ebc6f0b5ada96bf2ee82177cbe2fab157cc6733cb52a05047e122e0fe" + }, + { + "address": "msNB3k7p23RwHgHhttqpuvw4psfysq1Rkh", + "secret": "75b36b96993b83d56a21376aefb2638fcadc03b3e1a1d67332aa4d5e05842167", + "public": "02cb48b18b854d05d3fe595c9036a3e0f486761c43e7dea7858a5378b97040f5f0" + }, + { + "address": "2f7axMoMyTFgCbkbsXvi7zRYgQFdhPZXh6P", + "secret": "04fbee77d3726559ed06eb2f63c11dcc231547910d70869a0e061cc858efd0fd", + "public": "02594db5ca23a3c18801205e3aa94b1e70e1eb632ff0e5fe092d1b8f109932a9e1" + }, + { + "address": "4nJxCkfZkzFC3Gcng9yB4jTYbc9jYoeWui", + "secret": "7b4eaa2f5be99c3ff630558e26ec8df249d2f3faa2f6d5e150ada68946e56024", + "public": "02d6e473a3f1d0ab1d10f3e49b22a0f10a0c7aaf6a91ea20a4c0cc402e7be557aa" + }, + { + "address": "yuGQw5TzntwHHSFZ3Fj1yNfU6DuVtrK2Bx", + "secret": "d716d9193356f96d634913768b0a9fd5c76378d87e472a20afb086566b17ba7a", + "public": "03442b91d87ed6772e0fb557ba5ad2b481c78cca2730b4ffbc0cb637c14472f054" + }, + { + "address": "1L33Kg34Gj7yccMoJKXj2ivzQyxihoybaY", + "secret": "4583af591c90d5df33029f874c76ada794ba7ba2800fbd91778131ab8fcccfa2", + "public": "03723d1d42bfc722cfdebee030af95936030f602ce3c464593eac6bb048df5989a" + }, + { + "address": "2NwiemjJATwoJ9r25Jfmi6biyYtBUJqZ7vD", + "secret": "c96a2a6ecc7c964766e15cb3e6e976500153b5d6192d8dd4520a8ac9077bac4f", + "public": "03054413578006144e776be5d65c171667fd0466f41c865fffa8d8ca4f58d3b46d" + }, + { + "address": "wh6cxtvGracfHfKPga1Gw5aAYL7YjiaoLV", + "secret": "8c2e6470f1505d55fb80d4112807f7dfafcbebb3e33ed5e5bdf844fcd8415e09", + "public": "02a8e00fd4e4a06e017c17f3d93edac7060a8f97ec4c2226552b6881d94e102449" + }, + { + "address": "2jTGRGAkWVojYeNrJ1PtE1ppcq2mt2dCQP2", + "secret": "f41b9f940cc71f9fc889bf8e1c42df2c8cdcfe051f6e9c0bca2f3567f991d9de", + "public": "03de30a46efc8ae7e14926487fd940bfbf9752fc48f8260d17362e59fcd98c3326" + }, + { + "address": "2gunAdaL2kStrQEcaiN3wYXpyuTZVdCQgJu", + "secret": "ad8a98fea822a9f6e3dde77720ac33b645f1ee653653b5002daf0b51b36054cf", + "public": "03e71f0b9923dea45f5b36f03cb39ec95091be101f50b515dc4e7305786265f12a" + }, + { + "address": "2aqkXB7Ktc9UqD3cpD85LXWM6K15sExbmjd", + "secret": "ed8a62664b20244f817ba415b88748ece10c6c017b47c1eadb6aefa81a1339e4", + "public": "032340ae72ed38c789d18e9c79337dc7ed3b758bf79ca46bc96d859842522579e2" + }, + { + "address": "wAzQNGrVRX4YUpa1cVAHHAfhDUNedenZq5", + "secret": "3142f3da96ee43338c96f9adfa031a4c8f9fd6c2ecb1a3445dcbb1120c25e9e1", + "public": "023795f20aace810257af3d7b3657f91871dd420dbf71b8325bf5d4c7483f64566" + }, + { + "address": "EPMifzsxYan5zGa4vQucqTqRhoD3FVppLJ", + "secret": "c4822448039a8158ce1df9226658200617b9567731d40eeb194932420d3fa3b2", + "public": "02d9cf102f49f1f4a179bc1c3f1b1f98d9b048521a4030adefec219c578b084a40" + }, + { + "address": "S2A5TZc9KreFuyALfSrAEqtfAnDpNZc94m", + "secret": "447e435d5b33194e4d9e4fc2843f0565a7d0d4b70f5aa9e5013b41f248cf91cd", + "public": "03c1fb28de9f691912d2a70babbc75bbb98f631600e271abfabf61d91cc8cc4daa" + }, + { + "address": "iAYSpkDoyaLaR84EfrtQvN717B9u6fj4qh", + "secret": "e7f0edcc22d803e6cb9d267e081749371654f455ca285fe89933c036dcb371bc", + "public": "033557467e9d623824a3fedd7291f0305b8ee6ae2425031a9950bff58174971671" + }, + { + "address": "2K1nzfXsFnvSVZwMJL6WEvhW8qxobLtaQR7", + "secret": "e7698cbafa77734600bafc754f0d9a24ef84b94c16d69ef4594c375bc0c849f2", + "public": "026525ef0253337c276ccbd8d7c0182ab7ab48583d5ec743ab408514d6af2ecb0f" + }, + { + "address": "2NLypD5yFCBvqNQ46f8y2AjTzrQtmdR8Amg", + "secret": "63356b3d581b1416150cfe17c698db997c734b2303b7e7364b91b42139597a14", + "public": "02174eda85628cdf4a38a6059ff96b58435c1f841d70ebde77838f14ce029de210" + }, + { + "address": "ycaUcxZ297suGDQHX8rAE2o66uBbaHSa9K", + "secret": "22f75ca0d85ba3ab8ab6133c4f8222cca188418422d6c8f30535f0db6399a747", + "public": "0287d014af5975037275978bd20691124f4d906be9c09ac5901d6388abc6fb2806" + }, + { + "address": "cvDxKoZWNEhuG73dxxjwBHJwHqHoj82qQJ", + "secret": "3cbc7c5436572ea5ff736489d84420158600d5c39e8175d3d1f752bc1ced2b90", + "public": "03279f03cfaa48f1eb80c66138e4e32b22b943c0b46c387c4a26dbd1cca5ac4147" + }, + { + "address": "2V6bLf431P4U8odSUTozXtNVyVhhfD1x8ks", + "secret": "4a9234206aefb76345294863efc3e344ac8294542d6c78eaa8f0f94a396eca29", + "public": "02a096ec8754944a523602aa7141c17e76de62c2d910edc107d9e5d2e2ddfafac9" + }, + { + "address": "78CiJEYytgY1GY3e7YkEEtc3iKUh17BsRB", + "secret": "e9fe953daa778f1a4e2ebac0f2d5efd9a10835d3301f51f6c23b3c03c1d6bd2f", + "public": "0311cf95a60d6e04ac1b08b3354efa2d364fc1f26d552b1f6f864379a264d49dcb" + }, + { + "address": "KxXp9kXfiUwqYApRBpSieRjG2gUz8MCAeA", + "secret": "f9b6f18626230dc0221df145949885138b66add73f216febbe8da03216852fa5", + "public": "0200780f30aeb162071b8e8f863d81ca0a9aff46fbf8475da8faa702ac66f7a705" + }, + { + "address": "TRXyHSr7oGbVbJurhkJGgSA3Q1NvPQadqs", + "secret": "189694b3d311db623cb393808e89cfcdff228f1675a8392f3a85882d116a442c", + "public": "0280a7a939f549d5d8c8fe377ebdde1413223b36708ea770a9fc37fc5bb4cfc742" + }, + { + "address": "2dzxhFNvfELuA7cPFsHR6z8NnoCZbBrwq8b", + "secret": "626fa9e02b3cb633ec3f5bd75aa7f39cb9c0c494ee9ffa1c059032086542ba54", + "public": "03aa1d51380d5ad3fe1e6c3bda6fc013d02dcd620784d5c1e37dbee85ad2296cb7" + }, + { + "address": "2NWM7ZKdpa1KAKbJGoh2kjKQWnF4PSRuTWd", + "secret": "77a01079dad73056ca87d84251811bd0e4925e59e64ea2a957fcab3368f56d5c", + "public": "02ab48fa9293ae86ce7eb083a2c90d8f63301e115052cebe7e1dbb281f424ddb8a" + }, + { + "address": "23X2NT6wQJicBDvZMUDysSV3wMgXVSoxMr3", + "secret": "aa7aff9bedd949cd11efdb243fea9e09e8a36700cf97d611122d9eeee9d597b4", + "public": "02bd0d5009b71f203acec6294881215d7db08595e9ed86dc92e634d5b0d2f23f0a" + }, + { + "address": "LH1YBP5AjvYaen4k7DYgFyAzqi9pKXBkgW", + "secret": "464afa06ba6e8c59a1f16315cdaba68549cd1616644a7a25b343390ca5d86bd3", + "public": "039bde448da1bd733e8582cd0a99f6288fa227e0f36f1e945603b2d83e5bb1edd1" + }, + { + "address": "LPedwEmoxZPp1Hfh2gM19aadcfjznvdcvA", + "secret": "ea2e750dbbaba5eb4f25597e27f0ecdad267de8404adbcbdffdf9ece9cb0e168", + "public": "021d0f2e38c66ea712101b9c522e9ae53c827e8c3124608ef64fc3cb316b4f099f" + }, + { + "address": "iuEGDZe6HGaVkR8Z2UgdDopPQaJZ9GahVc", + "secret": "88f6191752848ad861182bc02853fa7a62b2ef1e6a037a81738eee0ee0d5d495", + "public": "0224a18069cbaa5ce86031530cc6c53f5be72cce4affe5aa9e2fad32e93b231c58" + }, + { + "address": "2fFT7hVto1ijQx5S7mNtiRA14nkxKHmd8X2", + "secret": "a2a4095a7ee80b306c02c0dfa672f6de067ba62f6dd23e48cbf925e7cffeb376", + "public": "03b12f22cfdccd4999c0f8623e1b482f11679591198d76d7c448de1209c2b75a6e" + }, + { + "address": "2epcFgre2Cfgzr1nkLgB5LHmQNPxdebFHVW", + "secret": "3b9ab3594ba9909e49e46438c637f9247c3b343027196533047369af3f86d761", + "public": "034075500701002c771f867a354c5b63dfd7a27b230d6604e2b8063b945e1c83d4" + }, + { + "address": "Vwgtss72ku5Ud7UDZL836MQJohdcSuwGub", + "secret": "76690e5179208d5b72b57b19e492cd8201ee8867d5ebe40bdc8667af33b62da3", + "public": "03b88ae823021df56ada42cfc8c1fd88c7143eadea1ef884f1f0ee2e2943b8cdef" + }, + { + "address": "cXJ5ihXqFezFnWMygwsfifaskFT7xV4ghw", + "secret": "dc352ef72b282321a30ec9b0d959d4d9b77063a45f32d8c905448d0873460b69", + "public": "0320b8d9fb36ac1b22177930e31430d5b84c89aeb89ecdcd554872362c85afdc2e" + }, + { + "address": "2B5gSmoLbRppmBiHx8wxWwnX9Wt5XhV8c4m", + "secret": "aa687c90db3b0c2f87bad5455fd030bc8775dd0ff8a65948bddb2476f573aa46", + "public": "03bc34b2d5cfb361477821c4d7707f239b95c87d26e6928d4f3f4acc2d6718149a" + }, + { + "address": "CrMPQ1PjwKWnDdPVAQaSfozkHPuKzDe4JK", + "secret": "688c5018bec02673824ff63699d3002f80382aa6ecc7d2767f8f3c74ffb0590d", + "public": "0341fb80c77b69a986a39d1797a0c5b8cf1b9ebbcbf4c108a122b153e2d8ac3063" + }, + { + "address": "UxFfwBKAquEJYus4FZRJXu3Hqcrb6XgVXA", + "secret": "1be47e095bab584745b8474c9b8e3c1bd03cd14ab6d4cdad4278a33d804e6018", + "public": "022b2ca9b29ffab11f2ce848851c326eb8f016e7d402477c80fadea819b4c7dc2c" + }, + { + "address": "2bKghkQxAUpLRL2CH5UXi5obZR3e7bMXjev", + "secret": "4c8f815282e42bf87fd63533bd11c27bf2f684886419927ab539165869dabb47", + "public": "0327ff01fc52d974f53769efad15458ddfafc7526628faff0834b1688429abdb3a" + }, + { + "address": "yNQkWKwwyYaSWQRqxkuCPWLBDUny2VwRW5", + "secret": "e0a08d6aaa1efe1fd000901732256ef93946d68c038735b3ea99b54d0aeee8c2", + "public": "02c8c10b617f36160a432cf69551aaf10e5d92a3ef55b7960bfdea86b85c6a2aac" + }, + { + "address": "Ehy18wxh4BaU4H4ddKzhTe8upRdHdKgM3C", + "secret": "cf82029c3429bf9e3a2918fbb059dfdf667f56ebab79c62bb3379c4bcad9fccd", + "public": "0341b4c77a846dfb985f5e25c21dded44577d51b8cbd2c6728f1ccfea6f80ba547" + }, + { + "address": "87CxDUGMUEG4TbmKuJrnE81tnDfdbji3iD", + "secret": "7d9656cb64662392ed93c60d66c7c2e5c6d917bf955729c4672841b63e6967ff", + "public": "038a4b918b57f7b303ceb32f8b3e4a0a3f93907edca2c028b1eb1730890ff9de1c" + }, + { + "address": "M5Hd2UfGCYHHHAMRhhRNuMiH1L4PFTdBu7", + "secret": "7f96a3f77ee706de79268dc5b161305f0d60b32b5e39f827fb7c59c9d2c6f594", + "public": "03355b8c6ee5d09e41c5cfd0aefa230b3de94484bf65fe04b2b4ddad68a452cefe" + }, + { + "address": "7dCt8NcfvF2eqSDU31BSX6sdfbuYg6D7s3", + "secret": "c6d2f40294eeb8d5e9b05f79ff0011dcd641c318981f2a6fa118c1fee8301787", + "public": "026a28127485642665a7d791b8a94b7a19ec42ebaa30a6cae318ded26fc2e120eb" + }, + { + "address": "EfjaJj1zqUT7c44FtWTpTtZd9SctAsgYgN", + "secret": "5fa1c6aefa6b2c3265181f94362798bd97ac1157e2825a555c3a73ab298c9085", + "public": "03c51dbc5d349755cb608535d9678b67690a83ce6f4b4abd2b4b1bfa3d8deda428" + }, + { + "address": "G4t7VPjovTXpPkB4WFR5NsQs6UCKsZMrTV", + "secret": "a92f1ab3e1c387727a160af2236d5b1140b69016d8e328d0600e3ba933eae344", + "public": "02f5ef7788d11f164cb17facc1c3d755954373ad43c350ee22de71b1b4d3f6a921" + }, + { + "address": "EqnAHqETs7ZqSEwmVGcUBWENuXfF3AwX7u", + "secret": "8ed59413c05a8fb4258a38bc8e2ae33c549c31e953737433edccc00f6e281375", + "public": "03e99890fcf8468447dda686a52fcc4d2ebcb4a2a9598645cf17bd35e1b2036e4a" + }, + { + "address": "9JY67nL2TLrh4rf8W5KezEjakLffjJ7ZJv", + "secret": "819c8cc72b0c266c144c6c77f359d0c5f476fefc7d5e48b0cc32e694e00a1be9", + "public": "024eb7dd60ec2195640e68ae70cafbf9d3f32ed84491e9ef9917d50a15da31156a" + }, + { + "address": "eJhighy1FQDgytHobEPkFUrc8MRRDUrERX", + "secret": "d8ec3cefb2571360c9a63e100c133e1a28f5298479f6b71f24fd2e35a2ff391b", + "public": "02ae12cd82ddf09f2d41f2eeb4c89d7bcfcf7ea6d045825d5e7ff480006c873cac" + }, + { + "address": "sXKjeTQx1Kxg7JiUsY1s9JzxmaZAxJGz71", + "secret": "6d2213281136b28c2311ba20c7f06dfa2631023cb9c41600a343b12eab7a1fae", + "public": "03efe76de2c6f2bb427d311f819421fd737d9796ec4b5e884724bc83313bc7df25" + }, + { + "address": "2P4vNsCQX5e2TEFsA3phiEzzLNcsa55z5ZN", + "secret": "7e34200c29f235e7d41165de73e3e24345b333f2d62b1332d1645c79a131fe41", + "public": "02431861ed3afa26be09c750021b2f0e91b115216ad177403e45135346d037c421" + }, + { + "address": "2hK3XCyTcLDihcW1EpBqvRhUEfQTySJvtZj", + "secret": "26e1cbc5e0d46ed4ce85ffec8e2673ceb4703796b88a3dc47207f2e08dcff8dd", + "public": "03c07daec002df3915d53e49dd3bf592056f9ec01c4c9f71463bebf622d8db9651" + }, + { + "address": "CMyzndV7XRPcWyvLQtUckf4AqXh2BzeDaZ", + "secret": "016be155c064286b20c31e3eb78570aee436b4a1bcb51553a98a3b88db3f1a0e", + "public": "02dffd952d6087b6839ff2fb5406f8df0a588b47fa37f6b6501adef82237cc91e5" + }, + { + "address": "2Sx6BgyjTNa4SRGzrtQ3XczPtwKykMDNYUU", + "secret": "fd0f956556804aa600fbe8d179a5cd5293fa543f4b301496df71d44ca18f9f44", + "public": "021306263d266c508be82703eca67e924138e8373fad6db63fb082b173e3790a83" + }, + { + "address": "X54kZpzfh2QgJKptToev26n3DKtREcoPu3", + "secret": "5ebdaf145155d2c3b8f3c2058878121d4da049de70569287afcabdcedf9e548f", + "public": "0318d7c0dee3c80ed280adeddc136dfb8addc4a96a0fe1686ae40ad48c4538485a" + }, + { + "address": "2dy28oXtQ5xjMmk5WZoxestCyYrdDKp4k9a", + "secret": "9fef49579fb653c9a1cb089f286318cd125db8da7a02e1603a516ce0e90b9519", + "public": "0367c6fa57634d2dd0ed737eeaf9a968ee566f0f9ff8c080fb5d3a20955f1b9cd1" + }, + { + "address": "2YsSC6ULU9ud1HFPx61iK1EmbtFPwuPvLmX", + "secret": "93ca92327524ca10a615c97c803c31e181ec25e1221a66f6cf4ed45549832f05", + "public": "0272595118ad56acb6fd1a7e733d580fef7bd7177c8f5150e834daa4ade1f69d2c" + }, + { + "address": "c9yNnwGMSciNxtfCfDpZYQBqkKhcruoCBR", + "secret": "1837ba45ee86dbaa69529292dfbcc93c1424326ebdf8a77608f1a0f7f4e46679", + "public": "03a7a4a53f0e573ea39f83bb9bacd91ed402937678c7909a2630c852f6a677659c" + }, + { + "address": "2cPy9RXG1kqppk6hvBWJdYPusTM9oaNpaGY", + "secret": "5838f6f51f7ecda21c6bb33bb6878c0a9d25a86015dba6d79b0cdc472577dc4a", + "public": "02fb56f26293d4ac62f3e49e3b87e81c78661b8af91ccff7ee4f452cace307d842" + }, + { + "address": "2RrSuZnng4zVoTt4Ytq2tGqg9yYSXB4pwCn", + "secret": "97b347bb13110f84c58bb17e8ed424714a897f72893ed476f285db2e4fd8c80f", + "public": "0302adfd41a08a7f23338dcc45dd6fbd0bf3f4352f8abf814c10729a63c99863e9" + }, + { + "address": "3ThUUSbyeiP8sYcKUJfjTh68rZSBh2K1Qe", + "secret": "b5396837ab1890a661f493011d5d3198849ddf54f3620ddc89c7127cdc6e1031", + "public": "02a9b07fce49c94f70ad821eed6691d35435124528e4dfa060b218098794288782" + }, + { + "address": "2P7eu8oaRGRqfZMkm7XQCA4bkAMVuW7XarV", + "secret": "aa11b35c65657a62aa20b44fa2d79d7e39f0d50af94c83758db244e63cf3deb7", + "public": "0301a3fe3b088d93bc40f197f476017d02a3f269bf7e402bc30e8028f95eeb323d" + }, + { + "address": "wDgABtGkzH1fFoPRFRdXXPC8Eh4fbXA44X", + "secret": "e7e5b7774a59efaa663bb190f4141a443811fd915a0542ae6d5b80350ab4d566", + "public": "0398a4a1db8426a805b7c78a101605173073a26395b9e870894bcc19edad3ca1bf" + }, + { + "address": "2bxejRENs8r4JTvfcjzzPrYqAFHCZWZpUgT", + "secret": "fd684a261ce599c7e60b4ae3dd8c25ce6f379cd0917145e784b2d65bee3dbd40", + "public": "035ecac650a6ad90a0c7ce37c4a8f60470f720bc323665342b4c8a0891223e24fe" + }, + { + "address": "2KGpywnakyuFh8JwrQzkZVYZCNTUjNUP4QH", + "secret": "1f6f6a383bde7f74e62906fdd0e732777bdbe083d8cbc3f937911ea97527fb09", + "public": "02710b1c5b760022a5defcd04a471cb156304bc97b0f2888ec0319677de684d1b3" + }, + { + "address": "RtK2DJPZQKcDtFQUEvmjDrVWGzZ7yBL5SY", + "secret": "398bcee8a98af1760b796cf0ffb3b97915a5f7395976af48e56a88ff1723abc4", + "public": "0395443d2c26ad2e5b14c62d83d742c212741ea90a9f862270e9b6fa65f7f93eec" + }, + { + "address": "gSHFa7incxNmjnTRVeu9adx3H491Q6Z7gL", + "secret": "6f75672a799f02d99f8be68c3f5ec9cdaa4e225d6b63fb28413210592852339d", + "public": "0296ca726068a5902489957ec48c85cc9d77e868b159ba9ccd50e6a5a7208515b4" + }, + { + "address": "2VErjgC2zSFHYp8upgaUmYTpyqZm54HuaTy", + "secret": "d9a70bdb789be436b144ff6b337fc2179ae4dab76cd17ac61c69f81eb669b7db", + "public": "032ddb910371263818b94e8d5d763718ad8d6a1134bb806c1f6c84358482cc68aa" + }, + { + "address": "aGCeAXjw7P3grVg2N7ccWqvM6Urtsrr56k", + "secret": "1f6ac2fb2540969789c1e435cbf10e32f537603beb33afb9cc2561e1612bd3f0", + "public": "03930f9ac4c718599a2bb6dfa60215ea9679d393a57e2f1d0c1df60dd813b0e320" + }, + { + "address": "2Amstf2g1ABsQwZARZdP1hsyuTF2To4Qb7E", + "secret": "d5500918f2cf90b27f68e476a7f542201f881f62ab571c1a56f92b3ef2bbde98", + "public": "02d5c5807716a26bd520189294ee1394f9e331b052904bb74529e11af87ed4725a" + }, + { + "address": "LZH9W2Au9PdRNYChRYhQQ1WygQR2m1Gv8E", + "secret": "8565e2c08db9f98f6dceb06f01b6234960005f049360f9ab778864b278f53935", + "public": "035c4e48eba28145bf0c949a21b2d6d8ef0bb34112a5f75341372af93aa23d749b" + }, + { + "address": "tCNwshNocxoMVaRprwjnbfSoBtNXYdZbva", + "secret": "e5125d5a11dd0bd007cb96b665ce5a6924b3980d9707324961f3a5d98eb37fc3", + "public": "0203fa587df0939b087dcfa338bdf509674ae0b3b8c2554717c0f9bd0accf7c0b1" + }, + { + "address": "2KiyEu5BhXanjwmjASUNXS3d5fgk1ra2Dwj", + "secret": "556baa1dc55107be4cfe1c345350aa3d0d6c029b3b7e11287b06ef648ef799ab", + "public": "03003633353160cdf7887f5cd7a1631c28b52589d6349fe26105fc7831822dac1f" + }, + { + "address": "26PYDLjvhxjrKMaRnqrBoNtD523VdpsbsfA", + "secret": "a14b726d7f34d630b51c2d668c9d4a309ef13caa9d29faa9b25fb1acea77971f", + "public": "024015911a99f20fd61a7c836ef8bfb8c036322e9555d4f87fbfec8a280f251b13" + }, + { + "address": "2PMnPZxbrtjJBj4HtWnbNEJXGqNVuzg7L6T", + "secret": "1e057bdc28c90b117348301d61b7788799fa48747633b3ef65f128db85bf5f94", + "public": "032c82d55599f47c022b7ec1f2d94a63a980f88ed47e07eac48bbf0ac0bde7c3b3" + }, + { + "address": "ngEoKTA5kLWYecYcHpLUSrP8Renp5xG3Vf", + "secret": "63e673ad8615535dfec17d8d4232df7ce645556517e3a7a9b77cc535b62755c8", + "public": "037ffe90571b19501cc7c0e7619b6ee64f00f2f5f9bffc54b82e9637506a5179c7" + }, + { + "address": "2XTu3GjDN1haGmdP15JiedULe17Yvou3PUA", + "secret": "d0354da826bc9131d5c511bab8180df24445d4ecf3ac1d163c586a60ba691639", + "public": "03ae79c37f3806808c63ee7ccb22f82b2f43ac4da2081fd15c26c2361585415d11" + }, + { + "address": "Mi81U5WwUVeD8gvQUHk4uVwARQbW6GGdCN", + "secret": "cf4559eb1ab7e0dc0e2589ae74744a6c6440acc1c47c1e20af6597839302cfd8", + "public": "03f39538cbdae0192c6e467950c14e8b78181ac80a4f4be7118b920a0419d4748e" + }, + { + "address": "JS6ktiN7Ms79KoTQWGzZ1M8VAtRcrERu2N", + "secret": "753330d28ab5b9236fc9e3d2b0e289b61dd9f08f38f1326cb2adc79d10465d4e", + "public": "0369365644818b84383ec3f85eaaf5de68874b2f0993a2ca80e9fd5520a80f1142" + }, + { + "address": "2ZNsWDs1TacJQw5JxiRgVhUAcxThC6WHuJe", + "secret": "fe014fb4af0b644d30ca6cbf94dd56f9489cfe049e76ea7868f4ff77302934f4", + "public": "032efedffc122bff9baef556ea5925ecfa2c67c495cb19d981a1bdcaa44e74351e" + }, + { + "address": "LxgmkPM2f1HRcRrmzr9N3cEXugNmXsN8qH", + "secret": "a21b407ba7d8c319036912b3959a158be0f06aae3736502c8b6f9e45c3622239", + "public": "0370e1ef67eefb04dc4b36793e1d8dacef50f1956062a41e16aefd0df257ae0690" + }, + { + "address": "222JtJnk5pvmP8nbET1au9SZbomfzwUKFs5", + "secret": "fd1d0d6acb0f13009f1cc4067456d8b3e2ef43b1cd7ca9a5dceb9b682a29d10a", + "public": "03e193aa4c3448f010c380254a79bf4ec7936b92acda213d33b46f684c52077237" + }, + { + "address": "24voKQR8GY8aWuDp6deB16Nq8ZQMo1eKpmB", + "secret": "dc2d1c7680935541cd768d6a15304edbd709b2d8a6d2414d138292a707b17fbd", + "public": "03e75c1f8746e2d0c7001212b5a2f81b1703efc0bf9cb8f8b34fb10be810fd543b" + }, + { + "address": "vWtNWUB6gkdeCn5YUXbXArYNVfJLP4Cz87", + "secret": "0fb2a5b69860ebb7b5b17dcc20d283aa5f45983cbe0cd4a9fc2972f3b17b90f1", + "public": "02977a6e8bd289782fe6bc933e212fa7f13c6e915b44f8de61bed4786dd16f8f3e" + }, + { + "address": "F7vSLH9cg77q973YtGaWc5iodkMBpHiJ3T", + "secret": "57ed144cbfe320f19d3a3ad3d5d3e7103aa2fb62586d42da71e7f987da14b648", + "public": "022187aaee0d76e40534cc89ec0b299bc9e80fbf3fc10bcc0c01fead840cf80eb2" + }, + { + "address": "FuTw7roSkr6CNsKqzpUyQJvMpUReBSFTUd", + "secret": "31ca978b4bd2bf895eee56004c56e7a3d21e8ebdafeb572bbbecb36e0e16a5c2", + "public": "029eb0564cc27d0a4a65c1942e446585105cd05dc22a96f19764cdc8b7d0228f9b" + }, + { + "address": "hFGCMRbvKs4m1zAV1RqEGcyAi5SpMCco5N", + "secret": "68cdd1bbbf0b0b8774a6f45be72e0b561e6d30348d64dacec06b194e4c957365", + "public": "03d126e5cdea74eda90d02651be16a70d0580315e1617a70fe46531016a2c00cd4" + }, + { + "address": "6GPVFb8T8Y4iBd3bAmyojBiMM8RnPYgZKS", + "secret": "ccb1e0206867f641e3abd217c1e9811ae39ab55909a7711a04702e5603827655", + "public": "02fd2e9b6e7468dc351f32e6dda6ab83edaab1eb3d7e4acdc3d740677f106ff907" + }, + { + "address": "Ef8qDc2Q7Sz7J3eFnvd98SMEJCHmURdzS8", + "secret": "3a09f2bf6b43df6c213a94214dc65a9ad30c651d09e008be435e66e46ed41c14", + "public": "03cba4c199f928595615b8dbec52e7b20f1a10b40735adbbf7b6f107cd12751308" + }, + { + "address": "2DHxwQdqxY8NvwXBnwX7xhzs9aGKsspDbX1", + "secret": "e8813cacbdddfa7e48271964fb91a63eea487ca3f462e64ef598d3b5748f13aa", + "public": "02f156980f66466742b818fbe5fc452f7557f9e51f51e188543b746e5496fce569" + }, + { + "address": "gecvozAwkyuw9r6eUn8Rg59Y8DcgYk2dFB", + "secret": "fa9f8353f6a67de64f4a7d2719bd0c53bc80d48d05c272d59c7c3bd45d458bba", + "public": "02afa8788e25f7be793cd8c9cb505f7613015f1c0a2de08649757ed5bdffefcb94" + }, + { + "address": "81eQpxzb3xiQs6C9R16rTKJKKcPjAYP8CS", + "secret": "fb50e96115ca8e95e5def16d2ad10834dd2c5fc3fc5cf819d86cc47355bf9579", + "public": "02e5f672d5af83ce1aaab51e99a1225574598b27c922b4f1a3feca3c20cd6d3ee3" + }, + { + "address": "9RckSwNRZvVSWHRYTGW5TpYzWYAfa14CuW", + "secret": "c0c14f4b99871b6ab8da7d3e44e76f943481e7d313f7df492f15512c42fd9bfb", + "public": "02f57a28bc829e1fb9862d0a063f19b99d7a1acf93ee52b21ef838ca5cce45a822" + }, + { + "address": "kR5sYz4U3hpfvV9UpJoHpGe4b5dvSgxq8d", + "secret": "9b8e0a6e8e1ab9f089049a33be70b0ba67f9204227e49fa7085cfb12b9ffff44", + "public": "0271bc6796ff472cc141b0afc0169efccc865786b0d3a607cbaf31dd45fe1262e8" + }, + { + "address": "Nxo31uJshFSDeQqKTrFBayX2Kp4CELgnbi", + "secret": "29e4fdb5b7725afb1db7035cef6d4ef29cd818c81e66981a58d597c5d4259758", + "public": "02e95df9d7dca346d3fbbfb4a5c71689ff2226200f41118f951a3cf8d4f5574f78" + }, + { + "address": "2A7CxHDjsapYNt6NHQjWVKvxrXCFccKi6a4", + "secret": "2087742e97dd285b394d6b2f171009da8b0fb858bd4a0527a4e1fd8d04f922c3", + "public": "02a10f6ff9086e45bb2ffd96f56dcaf5adc8759da06fac9265cd116f6da6cb8d0c" + }, + { + "address": "MydhPQrxZubrT36DLVBvm4ww8jPgwXh3FR", + "secret": "a7d1a0b8a57b64b6149903ebf0b6aec407c5d8a7f5a0765b0fb62807fefdd9ee", + "public": "02858feda2754c0e692228f459b4f5b563adfc1c0d231d32777c369bfd12025261" + }, + { + "address": "2RCHxBQrfCpWpDgHhQMx9CDdNXuRSdBvQW7", + "secret": "9e59e8c9248db0067f382ec45f8b50fdb229b7d35145912cbda5a60652e4e2fe", + "public": "03ebf7323c9d07ae87639780e7fd2368dbb2a2be81fe2422a0a6caa3fe95af8070" + }, + { + "address": "2CibMMEZLdQNDNUkeGTxukCyP9ZQyKTdTwr", + "secret": "20ef1184fdf206000b3afe262bb8c7c1f7e47779c37e25b4aa8bc9ce1fcdd5ce", + "public": "0228a3cbbdbe7b3c06de4ba6a57b90f0a32353d967b1df3d2a735eea9985483531" + }, + { + "address": "2kS7peVSHev3CmmdN7DLaZtjEzvfvKkk5YD", + "secret": "92bc9d6ddf02530375b614e6dd951c0ae3732ba6186cdbac6ec2f0c85f40136d", + "public": "025a3b72d6a01728ddb251dc64295c7ccc8ece2dd068054c694ff856db247cf232" + }, + { + "address": "21oC4NFV2TGUjrGcrvPwVKpzgFkKM97kmB8", + "secret": "e61d9affee3d90ba37ea488fc7afc55ab78dd71e8b1b93b04ff83226aa4b73ce", + "public": "035d082c055d9c298234e57ec9871914c996884b2014de1c0eba6f958bd1353077" + }, + { + "address": "8u6dLFZSABo5ALndKjJ5ScYpDFv9R9uZDG", + "secret": "aa14f51b05ab597628809bed7e01008280d702fa85dcd8d6a284bdd5d18a5402", + "public": "02c089c13a962d52e5c46a445c5b6b4beb86ba95fa56359465e2308821e92e1261" + }, + { + "address": "k5Tw2oc5wEF7msAycqGdG6f7dFmSg3Y1Zb", + "secret": "a6134facf7ed270bc3bc2c69cc8883f8f63e9c937232bc4c0cf6cead6bcce999", + "public": "02a63bff81da219a749e513ac2971ddf06938ecf358c7a0d4ab4a2cd3498deed9a" + }, + { + "address": "JYXHANNbaSnXJhNsCxjytkA2F6rxE2KidV", + "secret": "19b88e4a1a08ca94d8b1a63ebb5cac5e3f862bfd33c246ce754db589e322e19f", + "public": "033ff55a1af67ae3b294be6a2d8995572681e3b71b95aa70aa2d26ace15d2fa165" + }, + { + "address": "2MiD5TDqRpKggn1kKrgrtpAUsYaREZrAcPg", + "secret": "14d82b366ef04a93bde3bce086256e54cbd55f597f9d9cdd9fcbfb17c7fc751e", + "public": "0352d8e915e865373d83be53fc117872ad560b7a82e2f5db84bb4785dfa7f2fc26" + }, + { + "address": "2hSv2av4dyyrsA7PWyt8Z6DfRgTxQCZV6KF", + "secret": "0cd99b278bbd4b0c3de49d5ea72b853e45e22b699086efacd3989aca748be469", + "public": "02382bffabcbfd3b8511528b3e0a2a17a543c8739475fdfe750874f3e04f57e3a1" + }, + { + "address": "RMEbHrzzidye3H366c38zoT9sEHcxbsndj", + "secret": "4d8949fda234c91983c3fed2b20e2122136f027b415c53c3b28fd3a9401030e4", + "public": "03413090be4d221f8a0d6a14bd411c296569417d04efd2a6bb75459a6808380bda" + }, + { + "address": "Vu9f2FuXNzXHhVZqLPjDjyaNLvF3eirA5B", + "secret": "d2de1f7c3105cbac90d122261c0fcfcc74cca0b0bfbfe9f334f753f3e36f9021", + "public": "039923f773cb3c12812c304aab95965c1a86c576d88508bc8ef97265568684c465" + }, + { + "address": "PvJvPdr2V2B4rRZosBo2x2tHmWefXdgQhr", + "secret": "2ac57beaa74675d799d24540f398b2f08672db637eda8cf024eea9e458af72cb", + "public": "02ded23068562062cccd51936e7fad88f7a202a55349f54c47cfc6f9be27a78309" + }, + { + "address": "2kaCFQ7x8rBJ6JttjYP4psf6ejKwADrH3Ed", + "secret": "341b2bec8e242e758ccce37178a134a50b3a97821c9d8a78c5f7f7c8fa545b72", + "public": "020dd4d4be64e0e7305e59bb928340e27f8381c3659e0b4f5fb3b746882e8fc609" + }, + { + "address": "2AYJYq4zBgKb1ZtC5RCF4TdG2zbbEAnfNch", + "secret": "1c304b592dcc3f935134a24eb57988bb8344a8c061d2f82c045868295c8be5a3", + "public": "0213136dc207e6b37ac9de79bd26598d2fa2ec25dd0f1fb4b9d41595b58502b348" + }, + { + "address": "GK9gno6miV6T9UTUswvc8pRdFf8NfNQLwN", + "secret": "fcc02916da58e734019b145f5850d1859905b9cdd48944de073f12d2115702b7", + "public": "02a97331c4f06faef53ba8936e0965516c6ef605724decfe69481443cf4fc2a755" + }, + { + "address": "iUkqHafpgjy6onWwQnvzdHnZDEe8rQXLdR", + "secret": "01f973071fd0188319092052ac43ffce7972283d98855265d3d82ea6a5c7cff9", + "public": "039a5cab52c9950588ac44cb5ac805d27aca17a6f7515f03f6d8b2ba5f6b12c93d" + }, + { + "address": "txb8qzZRZT1WRXrg84kQS93omLXhnTF8As", + "secret": "bf709d3b0eed838ff3edf0838a585d48de69b9ce8bdf389bb7d657cdde26a132", + "public": "03a08d2ab339e68465101d9dfbfa2b83265902ff5326b11b7ce53ea7f419bcd6e1" + }, + { + "address": "wydSm3axBbXCtygk3LEoUC6TDYzrASvY5e", + "secret": "8f3691f710738866731a562873a18a11b17aefeb5981a1c528cf94fb2961c1aa", + "public": "0342b15f8b54187e0528d67455f4f13fee993d2ce6c3e0330a48e805cdd8ffe8fe" + }, + { + "address": "GrcRWScVaDgjfY3vfybHCh4NiE3satxdYm", + "secret": "7e10f5ebf6a8ebf21e62c80ea90bf39c8c885b0b682d488dbe5b3146ae3df21e", + "public": "03be16c5650fd39e75e6344f1f94e56b8e2e32200cde1caea4a2d6a9d0b72260c8" + }, + { + "address": "2bWdKXnEMhTD1XUY2aMeiVS5bZkUHpYmMGH", + "secret": "185c0f312da84fecb88764438b48185aad42c7236180dc1961cedf4ca3bcccef", + "public": "030436246f3aea56925db62803f8e30d620b744aeac79e494890e2ecaaf6699fae" + }, + { + "address": "2V2Zi5eW2Uizu8mqBoCgfM2wNEsuBUV75MA", + "secret": "21f8705279bc92569a2d0cc3be054f6a34da982c7d8046ba3f92a7165bdaad2b", + "public": "030a582da2554ca666e19603ab129046e69afc88b2e10a643a053f935fa1ac91f9" + }, + { + "address": "2eoMqcWAh4CZ6fr5VF1P7JWByp9ZZyXxoLt", + "secret": "596d3109aa4d63509bae68a6d23bfa9b31f5118823208fafaa93e37dfb388ecc", + "public": "0212d52f6325785a064fda843f18936f41ab825adaf9d013b0cf6beb792ef3ac3d" + }, + { + "address": "2UJfBnL4wU9YrrC6qadiNHysCXn5uYSgJag", + "secret": "00e57b2fea94a45bb324b69c6efe451164dcff3f030197294e71c9e38abae3db", + "public": "031fdd5da24da4f04ad91c96c764caff0c9d5f61234446b2d4587c141e7741b754" + }, + { + "address": "Prd3few66cjZHCdB6za6G4v7fnPzeSD2iN", + "secret": "efa8feb48f1da1eeff8a66b0e051127846b73aa22c5bed6966048b8e09a17f47", + "public": "03f6e0fc17b5b3efc249986380633183ae578edd267055e9cb4b5c753414acd523" + }, + { + "address": "bs2oWEVpaH8fi2YqaDZ4VpSgEAcpjrBuLH", + "secret": "2376d1e38d7b79a5edc8db82291f7d23226ae0c9c8e541f8197e67bdef978660", + "public": "036a9e6eee4f778b184b8252ff0fa93e7054cf00e01cdba67907a3d04cf4812b27" + }, + { + "address": "jdXefcHXereUDbC6JyM9p6YKDMr48q2WPg", + "secret": "92181da42717c4ef58029f272e56e497b15147268b0c9e3830d8a76ac8293a73", + "public": "025e49a895fdd528d99561d7864076d1067683e374fcdd2b550a8bededeab01337" + }, + { + "address": "5NxWC4oktPpNE1bHAPksR6WRBuKj1dgdgj", + "secret": "3797eb0d846c2bfa231b21a88f68aaecddc3e4bb5f5c40b08e12a30ca5a9a8b8", + "public": "031ad96ab1dfbeeaca199c561a185165fb957dbc9ab615af157954319936759915" + }, + { + "address": "8MAM31HoWXZvDucv6K2qXDoTiVEDUoTZVo", + "secret": "d8c3a2b3899f1a4564d12960caf8bd2e02135981224d1f1251209209a1a7c3eb", + "public": "02be30b3205f3dd43c5224c96fc73460ba227ce463dbe3accb9f8cdd5e36e05bbc" + }, + { + "address": "Mzymc2SJmEtizbeBctHtWvLwkejj88PG84", + "secret": "5450122d57559c9524eb51445add43f6fdb9b5b3ef514daedbbb2409380f8091", + "public": "02a630725197056ad33d7d65e93ef00353de3b8516732ad3bf01b227457d4e2d33" + }, + { + "address": "pg3L2zkpFxWvZoFFrqJB6rpbLCc6AGzuRb", + "secret": "e43543544e2c5587a10cb0ac69cdb99a46f31cb8fcedf0d1aba4bef755175915", + "public": "035b250809634ca72f8ff5951c8b33b26665aa4d62e367befcee476d654c2db75b" + }, + { + "address": "2ND4LcwLPgoVf9h3mWCwNzRoMKRWiNtDaVb", + "secret": "e8338cb5e4f5008d4c2a133a5f2c5daef0b9ad807b1edca149a3ce48302cd4e6", + "public": "028f8a7bed139ce4a708872273115dee124e9187936318afce6614aaeb68efe348" + }, + { + "address": "JbxjtGo3m6fb9NHD1PXdXiePmjQoCxYGcJ", + "secret": "4e8ca2101270bdf9d18826f5b4cb19d2dad0aff9e848583d4574ca4442e6c721", + "public": "03b1b4eb17becc25c2299489bf28db1bff7d4cd282128591ba6c849d2e76c7ded1" + }, + { + "address": "2Lu6tTQ72MKV9wquyaXFja6XU9vLFScmUiF", + "secret": "e5dbfadb988d7117ff6ffe71064f6b0af0f689a7a30a605444f45a22dd998d43", + "public": "03b6764c3cf877df3cd6cc04813061985ca1fab72eeb0fdac8020d491a9b9cc8e6" + }, + { + "address": "Bk9aopdh4aVS9DXFVteEfnvK6B1G5ZQ6yF", + "secret": "3fb44c013e9119aae6de00c4d31911a9e3c8a8f7574d6087c16e97161b8d4fd7", + "public": "03679e922161ee237706bfb3b5d08b0ff3cd83cfb91b62687ce400e917115e84a3" + }, + { + "address": "pPHJkUrsgLHLrTW3W6A8MgdrYTCyb6uipf", + "secret": "e5efc89a01ff944f078aaa553ce1fd81774c5a0b8f74f39c49404cdb69bb3e41", + "public": "035b2e1d01c7dd09eabc905b3c274365abed2a5439b2dee9754bb1d3d760aaef48" + }, + { + "address": "2euWrr8eWQUwofQ84zQfpStygyUdLBmHG6T", + "secret": "8985df67d23fe2ed3ba1a487d9f4e6677752497c7690ef1d6b97242bba7e218d", + "public": "03092935e59628015a627db9dc3816d2b6323fc1b383d7b6c1bf0e7ffaebb7ff78" + }, + { + "address": "2JbV1HpUFaQNxBGGzXvmgKgsMRtRLiuu4iW", + "secret": "403c5105e61a06dae3846df4bb9cb015c7073137fe8c5b69633ab5fafb2f50d2", + "public": "021bf36446a0583323f37b4ccf6c3a1f7eeb9c5b16dc164a9222ce1bf58e9765d8" + }, + { + "address": "nkSd3RskDcX1UVrbi7McpTWjDDHTatAFuC", + "secret": "936535f0861ab8774e63a0da8910311215ee5b868d2b0fb7c63e9a6bd52556f3", + "public": "039b7b5687043d02634c7a37bdc49763da72ab6dd94e0e4bb9a57f46572d1c2c5f" + }, + { + "address": "2Tsgim6KU6LQmfdvhdWMFBQmLtYU8HhJ6h2", + "secret": "9e4dd2b272096951ef4776cdc7f176629c4fcdc964034847a482c3cc7de5eb02", + "public": "02a8e2ab0a854e1381b0632b0961633d541f31841512aae1089be8b8a89de1f96f" + }, + { + "address": "mF5CK5hbyT59F5mjS8Nmxhc8eqpu7ZoeiV", + "secret": "9f4424d21a2ae111217aadf776c9070f9e499beede5c0c6ab9d6a7e8f9e5a691", + "public": "03c3bb8a4676d5eb6d32c53c82c9b2bc6d37b8d98f414e67e59fc3ec4766e52b22" + }, + { + "address": "J5XUnSVpD5BoUQHPsJb1iHXBsmpZBnFoYV", + "secret": "c41cd6d22063a0f9d674e1c23f52f1842bed8938b17bf1f32db7d1ac70b10ac0", + "public": "02489d6562dacd0b39bd71d53c123dcb69b0edda93ee428554a904bfab2d77bed2" + }, + { + "address": "QJ9mJXCzFBRSL3xgVRSD9N2qJBZJfsMXDc", + "secret": "7f399ba3f61828187c23d5649ca93a4dccff0170df1b98eace826bc10c44987a", + "public": "022a0380050debb4516116c052c6b6369da3f99d8e983227d1f1ab083a776c38f0" + }, + { + "address": "qeSQ75vnGJSdfBwHLdaxNbmmh4ubrnDAju", + "secret": "022965e0753ecc622455ce3e794efc10afd2969f588a5653cd14858a922de550", + "public": "02f3aba0f28b0c36eabf82777f7eac06b65da1b344b4d1564d66255fd9ecaabde1" + }, + { + "address": "DQBDX9kunUZc8EhaCDaTsWCsR8fQdMFqNJ", + "secret": "34b344be4497e6969cbfae8e154d837c72c85f246bff54fa5a18eb16964b3479", + "public": "02e96f90e75ea904486562d31ec162cae8b75036a75d44888e55a2a062276c3c2b" + }, + { + "address": "2M8ffrt5gQ96ec8mid58y8dob4RpEQeKRtR", + "secret": "d072f6a2b4f85461aef64cac0d2f63134ddec4b9891359295b9a155eae735c15", + "public": "02fd82ff7a4f209b35152da7dec8c55a6d715c3643ffe23e53cd701b7d665da62d" + }, + { + "address": "23q2Y6do8YQ5hLqgMWPLRJoGCgHCpnmFceJ", + "secret": "ce494783eaea98c9c19083b79aef2f8fd4ff0e5ee27acc3ec3ab810706e7d8f3", + "public": "036226b6d29fc4db7410d7887be144b48ec7cf865bc2c8457417f2e5a4fe6c95e5" + }, + { + "address": "Mj8Az1NanWTB2bmQyyGjybYuVBvnRKjJvf", + "secret": "f75fd40219820fd2984e000c531e758cc5b8ae4fbc422f63ac3f8835b0eda06e", + "public": "0388fc76f02ccc90b86c240d880c9abf9a1a2299f7a59eb21f26f3d8d55bf5a6b9" + }, + { + "address": "2ZrbqGFYr8p9AHYrsGpMX81Svf3esHnv23w", + "secret": "e84439ec6b8da8758f88e91f33fa37a47ff218098520c634e71fa21897720bf9", + "public": "03db7a56071a216deb554b5b3bba3966c531a63c4312a18504e2d0b5780303fca0" + }, + { + "address": "2buvFGVozbDCzRpadgLt8gYqwkYApVzWzXq", + "secret": "648af6bb80e569e9e7d8155f81459d717fd7951362fde9ca5521cec0d7a8b44a", + "public": "021559a6f9630c7345bfa81feb9181624af8a21d831a49ecc9003a107619dd7cf0" + }, + { + "address": "rYd8g48TD4MQtPbKaCoZt8xzMNx1ppHqPd", + "secret": "fa0a33e154a972151f7b7b371d5184b07ac8ddda8141e1d0b521003ddf05dd69", + "public": "03b12cef132a3b0d6fcf79acac849681f24478df506c778c34389b5a02c660778f" + }, + { + "address": "2LVoYHBtfPiXybV5D6DRq6X6qrQxbDB6wB4", + "secret": "5a350017532d09953ed6e32bd8abb0f7a47268e0e4022cf15cbfadedf890518f", + "public": "03c7475b5097a89c68652a7aeabbec758aa18f102b2fc87289f993d694f0e89c80" + }, + { + "address": "nCGXsbdNQgf8HjjRDYzDouvFvQikmaZZVr", + "secret": "f6579d55c6fc7525d283831af9360d8a20a7c856dbf92fb1c5a02c146f0413a9", + "public": "021780bf8d1862a81ea1a75a89a9576e0330d0b4d20a61e0817bf3b9f9d52a815a" + }, + { + "address": "9z44BB51AgYhr3Ljqb2zMWQrvLpbLYd27j", + "secret": "80530625c63b9b6c1dc510039f379a8b01b0d646fe569ea2ce35322a1894fdfe", + "public": "02765c54f55f261a24c164a2ece6662d0008eb3a9f3a379d19d2b624d431738a53" + }, + { + "address": "ZHmtrHfaxG8U7y7pjf9azLyUtvYuX15egH", + "secret": "14b437e7aee69001945c95d203c08f9d19dc8a8dde97c7133d296b883e58292c", + "public": "0394c3de2b6d85c29b7b066318a8bf83f9758474f595541d9154399a790d1a0299" + }, + { + "address": "bd1D8ZA24hn2nnXJFu8BVdCZ9k1TmMADoQ", + "secret": "e32ec60d9815b47f4de798dec53ce29d706abd85838f6aed87bb9d251ef25114", + "public": "036c0a31bd777b096d09636c11892bcf197668cadd72d339a926a404fdb6e6c9d7" + }, + { + "address": "2g5eNKbSsUF2NXqGkPP9TuTa6YuiJTaPKgF", + "secret": "12346069b478a1004cd81e9056a4d56c8e8dbce92cca698916e93e1609bd603f", + "public": "03861f1e168860ff59e647b1b64617bb08133815ffa56fe56a79d95f2a97654298" + }, + { + "address": "tDw9LMweotZST3PeEAneUJKM4qn2Ti8Pwz", + "secret": "a84d45ad2f527acbb1baa76fb15f252a4e5e79763a059232a412e585030446a8", + "public": "02300b36d580deb81b563d5430f1f91b930ec72838008a1f7304c466ffc70bec66" + }, + { + "address": "wHVfmjDbVKmfYntbXYARdPyDuUUoAAw6op", + "secret": "206f1e19e7b1b8c61fa20a1aef9863d3119f348c9b82d4f8fcae8de42525e6d9", + "public": "039a54db3c39cfc2fdd8a2386f9e98e55462c1f1a041432ee5fa87c1fa4f70efba" + }, + { + "address": "FgkCgYgEbc9rAuuNUdZgeUwCw3XrnGFX3s", + "secret": "db7cde643d4847775836ec285af69de816f699048e64571cb911444e258cc40f", + "public": "028332c7267e536582c2308c166c5be90c1365fea194a4916bec575f19295259d3" + }, + { + "address": "2R9QoPRT5ucDMXQku5T3ZbHymPGkX6SNSgH", + "secret": "9cb4301d96c544ce6f3c19071c5145b89b100ec8aef58bdf90c90aec054ce985", + "public": "03e9b2e1541e9559887ddc09f22f575de87db66b895eadce25cbb68bb243068b20" + }, + { + "address": "2n1NfYxcLwoH1jakovQ2sM4ShKH3Tcs4rWL", + "secret": "7b031409b353b33f8921ede8a6b03c6b61a6b1a4fe81769c79751aa7b023ae3c", + "public": "03f024762d6f497aef1a1fb90deeb34da641b8a1a0470040a784fe85dae164a406" + }, + { + "address": "2E21TE2z5qCtTT9WwXNWD2jQBLeH7nGB6Kt", + "secret": "555190ea46cad100a23dc8261250dce85ae205d2848c81477ad0eec31d9070dc", + "public": "0252684dff78d0b15faadb0e0d4f3fdc9ac9f168b62721119bcba98609bded5caf" + }, + { + "address": "2gRYextJNcQE2TJUSCBxhcnEK1siAtH7mhU", + "secret": "fd895903859ca6a879f8a6214b67a4458a804965fcf85f893d04df4fcc1dbe30", + "public": "037b4075a8e23d4d14e5b2090fb78c0cb72737197f27ce1da81ccd1097cee99db4" + }, + { + "address": "2M2KmM33LeLGZ18e4G9CioqzSqaAsii44bE", + "secret": "2bd1ff5e663a33f3d36df0dce93148789ec358093ff3e335e88897027a639f81", + "public": "02e579ce75e735146329eb9b67c5af870fd95ab070bc18b80ce8a536c92db98189" + }, + { + "address": "zeUUj9uFNSgkW8VTHjR7AwhcfKsa7xDwMi", + "secret": "ed2b56c6babfc1a1a55f8d393f35b517993a61651b6380d938ab0dc322a00e66", + "public": "029306804e046440a614e43dca6854a37d194dd58867c2efbc109500a63b85a38f" + }, + { + "address": "2DdyebEM9mHwrX3jmcTvzgnmdBQYetyNWY3", + "secret": "4eb31d856d118fbf86e151a08615bd20248315f8ff9666e7470e5ded6423019e", + "public": "026812e3cfcfac2970a723e05c5c457ba99e2298b4ec06a5464e59064f29a10d95" + }, + { + "address": "WXAafhTwvot8bnNY1ekUDmad1b3xzW5KoB", + "secret": "98690f96a8bcb814cdb88a6ca5c5bf260586a1919913a2af3e5bf47f4843cfc0", + "public": "03c1ef010a6891cb5f9a34302b52f6cf47e1859dfebbb0d8aec889ff93e95a27c8" + }, + { + "address": "5Qf7bQMDQgJSGMXPh6nNJdFHjbbPr6vyB3", + "secret": "87cac60697e5670624b0086a10e5a3a29b54fabcd302e8fb22e1f46a319c14b2", + "public": "020edf7e9ddb148abc5e22cca11b3eae82a28832d0069c0dd54d75f87105f1d2b1" + }, + { + "address": "SKVDSRbKdqMjhR2ciTEc8nr8zXNHAcrSfS", + "secret": "84f3f3b47fc67662ff7353d14f28c64d824b2e877d457fc749bc437e6bcd7058", + "public": "021e6d35f208aa9bb7d4c920c3b4d10eda891efd7f9af569e6e6bc624ec5c8f3f4" + }, + { + "address": "gowLNZDHBB9tNmEG6qz2NNwGkY1SouL1tm", + "secret": "b25ece468580847a3857d3d694924060e1e385d8d6c85e98c1b495bdfd8cdcdd", + "public": "036a8d7baac3beadb20bf1b5b6e900c99f1a476b91e3ffdbd8ad6cbc2310055bb5" + }, + { + "address": "Fsh4tkUymVnqmGiAYC9wX48fw2fucNipFb", + "secret": "e3877a2e5b413ff58ac84a792cbdb604d38b960dd5e5ea978fafd0a60850f746", + "public": "025775cf3978b487bf7aa201683a82930a0c1e8a61d466936c07006f719bb7fdf5" + }, + { + "address": "2Ma9qXTpbJ9JmYuUhZU6y1nwXKzJwbE3i5B", + "secret": "6625fc71d334dd607a82f6cc4e73a260eb9ae5a08b31f323bd896714eb38c7a0", + "public": "03132099778fce50227afc5e41c65d9830ee2930bc789e242dc11f153dab5538dd" + }, + { + "address": "nsjzo4SXJK9AXaw8fSkossG7einZQxmjuj", + "secret": "5665f7c5048337a78dc75c98c591b31901ce7fc43a8ba5ebe7f45a5ab062d80f", + "public": "0263deef3218d427110f58d0d72a66d0deadfb2d9cca0aa2b2cd283ec805cf87ba" + }, + { + "address": "2ipWusQvA7UN552H7e1zY8pXb5h7z9cvwaj", + "secret": "e0842dc4b26eb0d3f04ac0aa9abe86fd1bfa7202789543ff34fb08078457c419", + "public": "0252193f968bee3c45adb88c4881c0770b49440782a1ebc5095ef6c1453a3a039d" + }, + { + "address": "f1xfUvKjRCeBzvwdfCu399cebpX1vDFESV", + "secret": "f7b7138be61f2785e5d7dc9c4e987c1dabb7913c5c675d68cf0dbf6ea3511238", + "public": "0313f2f2a40cff2672943935a0b529624bd8be43d65de1eb076e983b2f0b60d36e" + }, + { + "address": "o3YhEi1J9QoEkk48YwCdhdSPTZVX3FJDGQ", + "secret": "2acfe55aaeccf96199403b04f37e350244b04875946bbacefc321f5514de675c", + "public": "02eded9af107b76a0339242ac409f01664979a8edf182760c393a2a67e9f78ed40" + }, + { + "address": "49SvQFsbWdBB5y7ijBYFcDJL59Aj5NckFY", + "secret": "766221b7013f73b64fa328c2633456eb66fbc9dab7dabb17d3a87d1ed1fb1517", + "public": "03268b627d2d62a7541c7a376738a170c897316d93a07cfb3890414f010fb00db2" + }, + { + "address": "joV4SQMdpCUDUZftsKLd7NNLshkHxeysLY", + "secret": "83fd7eaa0dfd5f7e7897994d162de93d91b09aff9b9b685133c3b3f372e00ced", + "public": "02afb8fbb2f77e29f3751a5e3c9be92b4a42e05955c7b58d5c09d878c233571460" + }, + { + "address": "SmSro39dpb6RCTSd3xAVpQcXtauUk2zzL4", + "secret": "88c46c1b53ce49abc62814e5564496b3b0c1c3a51dad775191f8ddeec522f30f", + "public": "03cf3e3cb197c3746187b8a0f3550c8389e2a00af834dfcb81ef3eeb21c5143dd7" + }, + { + "address": "QQwrjn5k3khUgvHjPst6GVHn6F2AwNYs1p", + "secret": "c82e491f70f9bbadc4bc518cc6d74eb9149b1a10e67529874dc9292339277d74", + "public": "027ab1776783179393527326b64836d737832cc5b9909cfd1219024e1e0fd0fdc3" + }, + { + "address": "JAgmiif855wDZgaC7U5wYg9dyuWi5nxPHr", + "secret": "25830dd91c4037776b390ee7f598aa8fe65847169437dd925e240883b1947b8d", + "public": "02b9f656a6ac504eac5f22cab1472e4760fd5064589ea36492dc6d7ba2753ee5e0" + }, + { + "address": "26MHnfJWUL4uNee9LjdAGLGa7HC4EpLH7S", + "secret": "e70d55437795dda9fae07616b2eddc1f3ea6f3ab0f971e5f7091a225caf2fd88", + "public": "03440d9fd95ada18ac1076623f92f9e2fd7d2c4493c504bfb5faa2250aa7d50cdb" + }, + { + "address": "k4jTLy6nhFhpxXKogNAcbbhXeKYJXKqgA1", + "secret": "fb3c20a167fa642a78d55347fa54d9e1d7e2a3a0f0b43534faa6d846b84516c8", + "public": "026648469e9a9f18ec527885fe8f2665acffa546979007758fe6ce2892f0a26e65" + }, + { + "address": "gMDDYLmdNigohzJbpH4pkZEVHGzdpJC9KR", + "secret": "b06b09ff98110ed0e7b76ca84288d7a0a73693d0d1058310b46922873b276252", + "public": "0298bcde4659aafc2d6f55b394de41107c400ea786460e01595c1b0ce568d0f928" + }, + { + "address": "2QXKE1KgQvHLfrUuP7pK1xDo8BHsNNR5wu1", + "secret": "b476c0ede7587bb5d76532c984fa5a4d810aa4341990837ebdb70e9e4d4c2099", + "public": "0378972efc8ed0aff8fe5a9b530bd70b697150c45799567bb21fc24542802157e9" + }, + { + "address": "zRH1vs7WRARth893W7ZXL7dkp24JJEHLfm", + "secret": "137303696ccf1fe9c4a3167dcfdab890f10fd46861634c17b75203d1ed181bcb", + "public": "03b241d494fff26c5fc1a8f9c509284151794696e4bd5736184e42bda7a2d1ceb5" + }, + { + "address": "2bgEuW1vkDRfSvzVaHrsN2V7mahtMsopgJB", + "secret": "7584cf68badbf5cf89950fa55e92d38ad678b320a2dd87baac186ed272e3fc73", + "public": "033697a7ff566de076c1f62e21964078876ff0bf00cb52c6b0ec28885a5703b4c6" + }, + { + "address": "S3M5uARXPFWon4dVxJbFt9oL5cPZDLGEzW", + "secret": "34b07e4545dc8d5681058630b94d16b76e302020a295fa72f1f3ea5f9e555ec2", + "public": "021f506a48039b0b9daf3857207c85213a2e6e9a86b9e7f19174835c0a7fc7ff3b" + }, + { + "address": "29LsJE9Rp9EfDjMCoFSwhsJPy1BvB9v7iaY", + "secret": "dc9574c4593e48481e7ed0e4178289f238f63cbeaf659d9d7d9e67a919b60ddb", + "public": "022922ad2cb0d3f22f0d7c8b990db9b1c98bbbdc5c172598da5c9b0cef6d8f3537" + }, + { + "address": "29gtaNw6Sh6Eza9CLNTR6AsLYP2s5RqxBcZ", + "secret": "a76b65ce9b49e5ecd1952d117713097b3c8610bd6a024190fbee18e516e87d86", + "public": "03428a59615bb06d26ac224215f79b47b3b90aa677db112a2a80d8a9848722ec25" + }, + { + "address": "21iG54TP9jygdxhcdceUrk2Szvg3PRHteTc", + "secret": "67c4ef1f760b5953ebb32055fd76d8c2bc2415c72ef8bfe1a8eb40647b199d7b", + "public": "0397a70380961422ea32c25a34b0cec7cc58fe7f62f9501177ece0b6acadc86c59" + }, + { + "address": "XEzXQfHKhQuMtgCHRRNWYZ7VTNCJUCy5Dr", + "secret": "8b71c09585dcede6d668bf0020787ac50c9556714321c288b4e0eb8302864386", + "public": "03bbb9313b566fa2e5bb153af95992adb39d1f3a8f77ebe6d36cf1d9e874dec0fe" + }, + { + "address": "8safALsBasgBw5U52rryWk5vWa3XWmQfks", + "secret": "ebb458a1777415e80574e94ba3fd381ecefd7871dd3f8e231ac97948d9d6af2e", + "public": "027841bd654f450121a3730982808e7526365f4ead99ed226cde64fbf460c9ef52" + }, + { + "address": "o5j27rParabrSJPUGGC26yX6pBqqNcDi7", + "secret": "5091e3ea0d50a88d12c2f331717f87b5289f26f12aab3145c017e59823617b9b", + "public": "024a2c3b28276e59db236ac1458c165a30f6e8fa8af411e663aa815d2f0e0f5a1e" + }, + { + "address": "26XbTkFX3sXem69GaSBHezQkmRzGJLJsdio", + "secret": "dbad683919d198390157accf51d1c246fa6282d0ab494aa418aeae9152219445", + "public": "03e4009cac3088edb22bfea5ad639016b64b36debb1f12475cf036c37ad4e5e69f" + }, + { + "address": "yuFUDW1RSa226gQKLG7d8GcCFxFVaSb3Zk", + "secret": "d2b5f0954912e055d0dd56cc3e921147c62942cb665b4d52e60530edb32d72d3", + "public": "03d12828f548687480d31b41dcc6c4e90b6abce46ddec55586a6e8acb7727157d4" + }, + { + "address": "2kmy4ccRfRCDcaFJw2G5WwikcoFCxTyFmTM", + "secret": "4381f86b3987baf546fd72efa280b8dc6b0819fb463d8ae5d591ff5061b1c12e", + "public": "021b20bd44372c14999ddb5f777d7d16bb7c2df0123b210e1a8c7e56701accc848" + }, + { + "address": "2K5dB6rem74XYuajLLhmxk1Ym5ktyF2rHK6", + "secret": "d6aeac3755497bac024965298fa8e8c02766122c5e99af88091751a051a1a84f", + "public": "0243b5a4cb7d2a422e2ab703520fcafcad3a62c071a1e18e827cbdd16b982af1c7" + }, + { + "address": "DS89RK7MsmZErHe4vc4a3zqp7BCatZYYh1", + "secret": "198614c6bac55b6f1ff6561051c70cf4aea344587f637e526de39e9179d3a4da", + "public": "02c92b2f731386e94d4a43f965cc443c19e5da1b7915084ab4888cb8348944194d" + }, + { + "address": "ccuSWwS7Hvw7UdQgNaZGqeAXH4v3kCsoJi", + "secret": "b1e8829213ff5231968cf5e7b9ff13cf83d945a7de3eb903eee46d857903f544", + "public": "0334c602e039256862c040ff3200bfd591fe65c5f10e0ec6fa8b173a03ab4b20c1" + }, + { + "address": "QxgofLYmG7Cyyqg9PPbcYWUE4Jf5r6JMmK", + "secret": "9e617dceff8339cd34094b9ff8cf3ad9f66c702528b58391e94f7c9b775a2313", + "public": "02913bac8d16a9df9c8a94507a2d93d21d7bbeb5733e3f16a1a619c8d4649f610f" + }, + { + "address": "24BL6QMtEsank54gFDG6JfGbKkzcfmbYHvH", + "secret": "64dbde8e8125fc928c4805122ed1def7a968ac458d949d50e77b02a9b72ff16a", + "public": "029a30417b752a63570caf8b4caf3bbc9df6ace56320121f59d9f3f73ee5c66419" + }, + { + "address": "iNCaYPUY7iFwuNdKkBdF2QRbuJG2Z89T5T", + "secret": "4532262c82d391663f96fb922d3eee86179deab0395f32e658c243dfc4b259f6", + "public": "03e9f19634daa5aea15533f097d2e65fee7e427a26f690530f8bdf8592e08563f8" + }, + { + "address": "B5PrWYoMX4X6xQy6vavi6aSB7niTTxBEUo", + "secret": "e43f066ecb51d8b88e92ec6bdc39b62482ef349353eea9daa6ba866f336d12dc", + "public": "03e36925d3826236e41efb6fa4c7efea1c84979cdcbb299707028fe8deb3344140" + }, + { + "address": "huYwnnc82FHNNdF6MomXUGE2aFu4Apo1eB", + "secret": "e835d2a47abf7865afaf03d7399e038ade3c79ed40ded121b3879010ea437ada", + "public": "0397c04c78b5f17306d04bdb8aa986808e2aa9f736376cba5246bc3c766a552f29" + }, + { + "address": "2Uidx5h6vU5ijGsigtrhtCymmXgkdScXu2A", + "secret": "9c97a07295238b5e968fb6d256efc0298b2d86ad339f41a22aa99208e441462f", + "public": "0366fa3afaa882fe120c5461c7831818ad771eb4454ac1833be66e4409d68c1d5c" + }, + { + "address": "sssGhHuMTELS4afckMa5xCfFwUdoTpQogR", + "secret": "b682db37d4e64798e7ffba455ecef95ee7134582f7ad72a4f077a4612dc71eff", + "public": "036b3043af63338f60227ecd8b810e122f6efae22fd83e579b7cfa75dffaca7638" + }, + { + "address": "23FmY9Rvb9WWDZnQegW9HcwPcSSWXJYy9rW", + "secret": "92bbd9023b9bd5a1871b23a4ec30144b4a9403a27aacd207df2072096fc74a92", + "public": "02530c3e0158aeb99422c5c23114e494ccefbc6581b27e46b9c1163fe71973fbac" + }, + { + "address": "fqdRNStjfsNdmpK3DQK9WVTtSs2mph8Kwt", + "secret": "66fb2e78682b560c4ae978c5ab294c8d7f6d710cdd5914b4d613aebd89d3572f", + "public": "022d6a236600e6672d9e4f7f10bde1b42f2950fcf21248c8f6488b95303539a3cc" + }, + { + "address": "ZJiG2CGoqtSx2GkuxFvoToLdcnVHHzDtHi", + "secret": "6d95dac69ac754af9e1afae5ca34aabdf9b810a108804c58723248fcf4f05466", + "public": "02092f669a4858e627bb5a371f629aa9de2db91e1ad7ba633d027b6354af8b6811" + }, + { + "address": "stC7w5uT6NxykyuDTr8wa5yXhHL1RQHHHC", + "secret": "61073b41891fb56c71e5f7483e63807b6912763019630267c19ea9d9cfc93d84", + "public": "035c445fb99914723945b2c1e1b54b7ac35bed350284b0d93e5d492a41cc87d86d" + }, + { + "address": "BpWeZBhPNCYMpzBiKMcUNaR8qX4kdxdy3E", + "secret": "5ab3d7484566f08ff1be3c9c9dc74d001c5531fb5ecdf98f87bf4e36b6154153", + "public": "0229270ef80ce2340bdfffa6e4809fc43f9a033037f63a865acc69c12773b64054" + }, + { + "address": "2SMsFtscMGLu9Sx87HBebRG8naW4iLA2cZz", + "secret": "1e528bd5632186db07cdef8449c1eedfae575ac4c56f0bf9440b4e6be28ccb27", + "public": "031b597d85b54343593060588e1c4d820a0295ca573cfb88b066be174b69a93a69" + }, + { + "address": "bnDptZijEK6av5LjjaywjhgkqyU3xRyadj", + "secret": "abaad2674b08b8869a3c66dd86a6197c3f0505cf07b1f20a8f9ae934ba2dbd1b", + "public": "027e4a5d95c683171da70094a3a12c2bdf9012745d509d1ee732e58c0045035a9a" + }, + { + "address": "wwW42DUNggV9cmupj1Qf6uHU5RmipL1dSC", + "secret": "1b9a75bdcaf6b9b4d4f4994233126f28d63f56ed11d7067a69fabf946b313456", + "public": "02a842939d4a77bfcce9994708751b564ca29233672149b4d144da27586c98ecde" + }, + { + "address": "BnRkAyySwtJ3RU1AcqLfNBFUwi1wp4SoLP", + "secret": "9d3cbe92944aba5c8c0649161a398d3f8f458c269d760e9b625acce3a476ed8d", + "public": "025e1cd036ecbdbfb9123ff839f007ec0feb3cc66d1a82965ad373508079669031" + }, + { + "address": "jdgX9aogovnV3BLVg43MoRmSBXUKAaKwaT", + "secret": "3291f3e77bcc03cb913fa0aaec62c75f43311037ee80c80df8d162969a8756ce", + "public": "02551abd2d1ba1bbd28d2e6016bc5e41a56d153313c762797c7b8749643134c4f1" + }, + { + "address": "ZG3RtZogdoEj2gUGkgZgyqD36EJnGaBKFL", + "secret": "3dc50dea1948cac53baa20453eb4e457c545e7b6d07c07eab23952188bbe041d", + "public": "03a100b0493995563b865c1a58612843e9120dc6b0577f95b04e5839f0260d56c6" + }, + { + "address": "HvNoZMcknBtSHMGmkNAdviAqmiynJbkbEg", + "secret": "6ba1222dddac6d0a5bf8a3539d01e4117e69b559287b0bf56afdd6055d927bc1", + "public": "035559216c7f0bfdd24b03208e5d77c82dffb7108570589b4c6e9172e982c9ca03" + }, + { + "address": "2R94sJXypsCnnhWauFb8XKtJrLfNJ6Jki7G", + "secret": "4c8809559e07f860b56132a1cb6ab660db9bd15bee02991c93dcfcd9c453b7a4", + "public": "023c9af631584445b2a6c7c22353478db1ca9d546b7af5c7384e038dc6dc38085e" + }, + { + "address": "Bf3doov6qd9M9iTzw6ppuNSiv5FnsBnPFj", + "secret": "f513f76c64ddde08ddbbf2a38a39f864218d65ae23bf457a790ce5e1c5b37893", + "public": "0304b8ecf1a3aac1eaa6b67032047848389aa3feccdcc3cc6dd5ea661c85ee5f35" + }, + { + "address": "e6297wnTqHemj3UjUsHEcfkWgoYLY34ESP", + "secret": "9d69dc4a3bec0c7c706356c6ecd1c7ac5162dca35a6aae6c9ed8df86885aae50", + "public": "0305c56afe0588c191b0dc1b0ce37df4dc8e71cf6e9e55fe68c18c094ed9dcbb5a" + }, + { + "address": "sFwqVVHrN7KHN41F8jU9g7kwYpAJkQ2YXf", + "secret": "2fc60a5c19c707445faf08a76ef89f1d4d8ce0e6ab883711ba859851ceef19a1", + "public": "023e2ee53efc59e8516a65c36f5655d57b67ecf64afa4362235568d6fbdb9aa872" + }, + { + "address": "wTttDcbFvgPuniukJhxKV73XKxTGjLt7vA", + "secret": "545c0b9625e5b9c9929e267c4f10379447b7c5ee9fda6f6f6b3038ccd563266b", + "public": "0357953cc18907b20e5516dfe2fac4b35c33a778559fd21f2a7266defcc5b0b8c8" + }, + { + "address": "2SCgJ7nLb3To7LihhrKWfZLNoDr88k4pcEE", + "secret": "8f37ec0ae63e299a6ec5db7fe241dc30acc8bcb1f629d66326c7aa79f5263d6a", + "public": "03eba8479f757c91703601cafbb601db428be8f9acd9c6d2c05440fd42d87fbf2f" + }, + { + "address": "265SGFsQ5a65k16Mifui5R1GvtuDpnuN49Q", + "secret": "c98ec995d808922549bcbc5217c826bd3e0369754dd09396bbda8c5a7be6b1d2", + "public": "02cd1a00f584cab9c9fcddbc21ee8ce269d055ce230085a6318922335c00f0fabd" + }, + { + "address": "WJcJburNm8edTpbPVMNqnTuWFWWGRFUhTL", + "secret": "3d8e9968716ef2e8ecf5c260a78af235a76be4c35c33b7ef44c9612ad061252b", + "public": "03aeb0564afd126b603a47116caa9a6a9bdaae72f6b16b57c278c8850e77669e63" + }, + { + "address": "2ZVfdVcExE27kEsqXTHRvH4CWhtrgerytru", + "secret": "017a418ec986559a235f235e40dc1a4847c6ab6c8379769ca1e3f53263608a1e", + "public": "03093f374e5184893941460723c082e6c03edb07a24481011dc4913045e1988f3c" + }, + { + "address": "rrzosBqV6qPrLcXmUi38E4JuT5HK9p5EZ2", + "secret": "2be9b2d68a22435750341c07bfca519a0282f6b8e8a89504cf327fc0361d1794", + "public": "027ce626a4c6ed8ec8442d196c2779eefd48a1dbf14136cb4a2f1fe203d1a5488d" + }, + { + "address": "CAh4fftzSytRiuoD1mhKPr2odx1we74S9M", + "secret": "7d86a42ac216a345c761f28412c606c3ddc518021c44ed5d9316469260eceb77", + "public": "02369a7e1b3527c29616f6b9cd7a9264ebe7c4fca5cec9249ec9c2fbdbaa79fca4" + }, + { + "address": "hT9MrhFKQ3st4LaCSpiLYMvHhKDjHsWhdM", + "secret": "88e7e0a3b6709d657b686c3b44c7c94560f4287752206a80c819d18672042bbb", + "public": "02b1fe72058c93ef78e3a0d766a577d0483b34fb8e1310ebdfef3072373ee380d6" + }, + { + "address": "24U2xuWF4Sy7H54J84cTwMe19tZpJGFpYv6", + "secret": "f66c96e161c59ff504434ef31cba28cc01bae76f9782c0ddff2b7a2b3483b44c", + "public": "0369d6be394fe7eabb5340fb2703efb82b07d92fafaf46a66716ef3e158abba759" + }, + { + "address": "2GdfV6jEBBCq39A1TAuReBR6MGu68NfAzQv", + "secret": "ed97ecfd2dcffc1bf79853d1b659720afa9334b3e94650a4a7561580e97699c4", + "public": "02abb05b3015f33f2c30230978b680f1e8e9ea00d1ee067521cb54ec3a5320a712" + }, + { + "address": "G4W6UDwRi3n4s3erXq5viKHfD8Gt6Dv6Jc", + "secret": "36240bebec42b7928104606f9f939eb155ba296e567b8c62dccec004ad603339", + "public": "038808ca90a168226c3083378e9d6a43e2637d0a3ed61ea1ffbdd5619a3b2ddb03" + }, + { + "address": "2EDc2WfM84fEXwahWNynu3iDXLZeJvzSunL", + "secret": "c9604c86f8a949e0d186bc656d6d3625dd3e248416e408a5c2ab8b7f70835926", + "public": "02fb89b41148210016e8ab63bc4175b0d3e8c07784536435f1535c37db523b5f04" + }, + { + "address": "2f7WZfa6CMs8YBuBpha6U7H2eSj93ePBX5j", + "secret": "e6de015f90b46bff63dc0977b3e9c48338865bba24a09ee7012696c4cc56662f", + "public": "03fec5fff6df86f8783056e7e7e0d0ce9d160a62394afdbd7f4e73e1ca7f2f1a0a" + }, + { + "address": "6CGm1DqHawvJrfQjt2UfABWo3bhkr8UJQD", + "secret": "8d5e6cfd6440a1ca8583c59cc1f0155bcc3d3aa5e9b084d2490603acabc0fb75", + "public": "02357f3dcb10b5630bd904259bb75137889c04123b509b77cb9dcc33b9de2e1a69" + }, + { + "address": "5yq6MtxX9tP9dfM3A8FKH9xLY9UpAcxm4D", + "secret": "fea98f69b33c8a708459a4c224c4fefa66a152a0e6a853b85585f7147c0e95e0", + "public": "035a2b87b8d9ae00d39606bd626ab395814e2e1ae1fde6add2dba581ca00dd6200" + }, + { + "address": "GMaMEgBcs5csC5XamNTYyniVTo5ngHD8k5", + "secret": "0da55fb8a6846a8a34e3965fcf0a33d314050c160bc3b9537cab8a385776ba42", + "public": "020c3aed49b27d6c62d76f209fe5227a2d4fbfaec5d7eff7015c5cb2c6403c2ff5" + }, + { + "address": "VPHFDCFDchimwsVGtc2jmPtycJwDnbp5EU", + "secret": "c9dd55ca1018b0d8533ba318ed08f1af73f9b98eb919f4b6af4c360becd3658e", + "public": "02b0dd156151a6228dc4cd5cc1ec9642f3215b919d793efb9900266bc18937345f" + }, + { + "address": "L3qpTuDGH5wem8EWY82fUwo1oYzFctess4", + "secret": "b1e2ffdae4f2aa3b20df169a5034bd20c5a939084ac1539efa33cf673dfd1534", + "public": "0251e2d2a31adbf37e00c3e0406a15c0f97ae718ac2f284013154bd82a5b8d16f0" + }, + { + "address": "2BKAxsB6REMxDhQt3Bg4bRjvQwgpzYrpHGD", + "secret": "94c2ab6880546c63f83e5704041aa006cdcba445233cf0ef710dc774c917af83", + "public": "031fc9a3ed32e2ff9ddbf8d64c5de39ff74847812ffd5a426dd35f7eb8ac56fea6" + }, + { + "address": "h4UF9sekW8WJDERLXiSU6JiwBJPCFXCVQz", + "secret": "e256c250043f7d7f4a60421c378c734a1b956dcbc22ff828b57e09f68fda47a7", + "public": "02c942fe2db3ef7c37ae64a7943733ed40da2bf4c7f479a5b1210fb5e57aa722cb" + }, + { + "address": "2C3wT9Wf7xsE5BNEPSj8KUerpPiYSeM9PLo", + "secret": "85023f5d7ae3a15a82548e7785f9287d0d39b1c59920d08cd8f2dd61a227df87", + "public": "02bb78ffb03ee30ff07ae445989b15108df51c1306d5d712358ff3a77356fc928f" + }, + { + "address": "MeUC8cndNSMJdT2P7THbb7TzhfZEYbQwTF", + "secret": "abfad820eb18e0fb504bdd0dfadfd98be92ca215d738c1d4c21aae87ced8fe79", + "public": "02bd31ffc3fc02ddc9c6bcfd3dad9ad4b2d51965cf368f854d9dff66f33b27e87e" + }, + { + "address": "MW7nP3oRdP1rfN6kpBjwQZ8f3MWrGEpc3F", + "secret": "77b3b0b050d0ceb25ef73cb3cd47c16afc954b1d87b57e0b7e7215f4a1150c0e", + "public": "030ce0bdf4ee5b7fb72a4dad6d047832d52ddd34ecd8d81f81645f989c8dba2107" + }, + { + "address": "xHtjPK1SPcKTKmA6Hd3ybsL6GwBD1xyxUb", + "secret": "2a609e0536a025e55366035efbf9e28c3283f15daf9b2273e43154466e7afcf2", + "public": "02ac89388615f2b53f6890a31fbd75b31c6c27d522214843364da96ab41fe70e9d" + }, + { + "address": "2EUCXDL1Pnr35Abe3BAmewZkNtJX2Hqc2Ro", + "secret": "ec3bfc75efdb69da3ef0f609ded06b9848e7c5ba69cc76b4ba8e0f2fc5fac011", + "public": "0385bba88e897783786e06b55e535f13057ae68ef6f57b14ceb70e9dc4e34e92f8" + }, + { + "address": "2icjs7U7LjPRWArUe4dfKWEyXPNMKYfNqbf", + "secret": "81995ff5e709bed9cf86966f88cb8da6095831f7090bdd64382b5e539246b454", + "public": "022f1466e726b826363ba710ab7575000f41e71e0ee7994f1af7331246224d766b" + }, + { + "address": "RJXHk1XPZv3gyQfydsSLY5vb82USLdpUTh", + "secret": "a627d0c088ae6c6a004435f93be2019e9735930e4026d14fbe0fb0309039a198", + "public": "02f200888ad6d3f3547f012d72d264fcf780e124f04aaad4acdb2617bcd901566b" + }, + { + "address": "2L5QFAHBPcogj4tVPvviCGgoEgK4yF9UHqK", + "secret": "1fba9300ae3acb7d9d02b6be35bc7cdfe3fac495d79ef4080d25656632a75035", + "public": "03723bea8eae042c976de6884d9b54c0aa19286db7ee4c6e9740064301f465bc32" + }, + { + "address": "xz8JrwJdYru4vwnNbpt1wrXRF2NH89Khst", + "secret": "a785c36c66f28f4c19818cbc54faaef43e574b2d42f8df864dbce43e177cfaea", + "public": "02ae807160537347a4eba3a0761b53e2f9c464b47e526d6d4d48052e888f434e0a" + }, + { + "address": "2EyfYcC8rHjycyL1yQqCBS16BtCvA1cwYxY", + "secret": "bb152d93f18912155551d152c10ddab0c6ce77adf9092545dc458dc34dfbb603", + "public": "022c3c113b27a7726a6ad38e198b827f94a0de62cd319db41743dd08a740ed6b45" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0000.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0000.golden new file mode 100755 index 0000000..b086942 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0000.golden @@ -0,0 +1,175 @@ +{ + "seed": "aG9iYnkgZ3JhY2UgbHVtYmVyIGN1cnZlIGRvdWJsZSBzY29ycGlvbiByb3RhdGUgaW5zcGlyZSBzaGl2ZXIgYWRkcmVzcyB3ZWFwb24gZG9vcg==", + "keys": [ + { + "address": "cfb24jWcms9pZtvEx3UjUuLPdT6rbx6r9M", + "secret": "6614f0956f4e08e07ec2d4c2767b9f7121449fc2269e2b22f1a549d63e9f719b", + "public": "03b79123b2a3100420b19cccbfc688aa39f510b8491b67bdd296a92a021a3d0d8e", + "signatures": [ + "9ba679ebbcf6ebe265512d46265bdad40df99b5cb44a34f28466143cbc5f152d0e522018b8f4298ecadc129a1b471b0fd62cb51ea9305d93e3b189dd2b08e06c00", + "cf17711343205a01e4f5a6eeb81d3dbb523858cfd97e11281cff9617bd70932067b11313cde8b21487cfad20f7cca5f24fd7f1687fd073094eb2becf2e2ce37a00", + "1b45f0df19184f9e6047d2e4ae89cf5cc4f929fbcaed499ee7b2fc57c14e973f74ba3813bd28ea910a3e3d94ebab060353d564bac41cafcdc415226e9b8574d901", + "6e65a200a5a02eb1298c37d82005ced3e844d7065271db5752d242b611fef8ef2e3d811bbe83eb872213ca64bb9008bf6fe7edb548fea97e85dad05b4766cd6e01", + "7c020637b7d0f1748ad9891091de7f05f9b024d9bf4a68044515426f65d57cc3091b52ea7f72a571fcdcf629eb006523f4e173f0ab9fef7d1a906fa2956ef5fc01", + "1ca1cb90743f5599b206227ed8ae620b6e501cbffe662369a447f9846277d70569be1ea604c2c4d3af99ff5b1e5c4da0068bfa412f58f9c505d4747acd04962f01", + "af95ec5a6976f1da014accbc98aaa62340a4efd5f42c21a2ba73a53cf388b19022874e03e56cd77e9410e39fc937da8e02c23de7e3889c731d652c0da9aae16500", + "d1154d77593d24227e95233ffdb2862145457b97d27b4216e56b6a81523c9a455e37a98694c465d86573f0a55d20397a25f089738475114c954fa746b0c5ca1100", + "7d8e327ba9d328bd124b43f3d472b2a2ec45d4dd44be4a6d2a1edac8cb019c98675bcaf76e531e06e2c6c96294e8fefb1fbd29640e528a2d7671b1091c0a55b200", + "352d7850e4425012640dd63540d7fe760c728b6057bdd5722c862d59337dfe7c47bfc33bf439465ec4f833f10ef658469933765be14963982f6c112402e26d6000" + ] + }, + { + "address": "nJUPS5CrLV2iBdMvdMzMiP7iA2dzumaWGc", + "secret": "93876705c31fbf77f756c7a59616ebafe12b5ec6bf6f0c85014b918fd79d6df6", + "public": "03e0298390270c0b67c62cc35b493503ae2b3e02d2d2e7711e03beb2b6f481115d", + "signatures": [ + "d6c5510639c65b5c78f2964b0d42e1ffbef3101cbe51b23ee9bb9bd627020bda7fef7c1d291fdfd46ae66825e0d419a561be56bdb4e6585a6d65bf9b25d4206e00", + "789de29db7d31f0fd788a2cb161290abe58f48c2538ea620c1ea9f1a73d723bd3d75287ecc450bfd0c401ee43f67f45ef003d53dd85514f980e69d6be3fbe2dc00", + "57c4cec61bcfb07af8d934d28afd239caa988c5b99e12fe3b157010bbb4200882896fe9d1aee6b53ee0cb59ce34e3184b347613d22ffd18d34e5ee32b14f4a0200", + "01598d2f3248547c4438669dd9cd4ddd43528d71de8d91493fa65297a88b6c8d23c876f2ca5e0e2ce2d9106342faf4cc2a5d7e71e8c363244e5e0d0a1723f40700", + "721a84e14995fd84f3d2b65d45e79bd012e59e1cb4f0a801a67129739f7949c91634cc5fed042d573d552b9e5b1c9f043b77b23988e2b1ec60f37a61c1e469bb01", + "c557e15d55028b279f899a6aed370aec27a66e59f2d3cfff517696b64d74a5a05106fad5e5b795f45383c358f554c4bd97d93728fd0bf41940005a72f85dd72c01", + "54241216147f863da2d7e0ec30bb61365343c498847fe3a788568e343e42fab947368fcb8a879766e99a85bd7614c968bd517e5ff1975195a49f999767b43e0e00", + "85c2649489658ab69ee9936b616d98a38d6c639c73d6dbc4bd434e0cd079b605131521529b2dd6d50b1d45621b7974cac8e7c6f0ad836ef102df53f60a43d8f801", + "58462dde6faf9bcfe80e3aa81e3976a3c1a5fbd4d0090b925641a15c21bc6d6a26dc6ba374765e7c470ddee3892c01c310c19a2178cbfb7260692fd3e3e3b67e01", + "ce1d26440fd13d4a4501b6417b8823c8e447f507c7a198e351633081e05a91df5d7d4fe3632c11a7d69cd1a646a23bedda6e4cbad037189b145f97713436e90e01" + ] + }, + { + "address": "UxnG3PoFvKtRuLu5nyFdb6eu6pu1SZadkR", + "secret": "c1b8c857a2039d6249d3bd4e25d40b34c358e136869592d03c1e3ea85e2916a9", + "public": "037a13b47233d512e123c180984a67571c6b0ed10c012351842846a4eb33b26e37", + "signatures": [ + "d08141df6b5627105e2ad7444c6ac67031eae74fffb1ac993038ab38081b05841c591e997942501dea90332e0c8c1c8d8d1fc041cb0284819935adac9998066a00", + "73dd6d14687efe1ba1a03e8de150dbcf16e4c91f14eb626bb39b0fb64df9156836e3923a84d95d6aecec4afb71b406c71fb6145541787830c6ca8bd07b74017301", + "033beb311d4a6306303d3e7c7089f51b06e8bf7ea0f49c2450e26cf228d0cd347e4aec6143db99a87db6bc4f25c3ba72aff652b95d8f09fc8c2bde54624540ca00", + "d045036a4c717792cd1b76d2b54218cbb2d0c3347cde1b685635ddf76fd310dd4ce356e1c97e25cb304f3850c751fbdae646f4c028c68bbef0ee0dcf5fb0ce6801", + "96ecb1fe556f543e6abdd72255f8b844e7574afb928617fa7f347030d17bbf8c745484dac51073ed18a9a1287844fa22d5b46ad5acbd67096d857da1b303e14801", + "3bbb6961256e153fba0c749b1cd73bc5d5aef993e37c28111a3f10218af4a8625d263224b43193c00d0b383c0dfd6ed5017cb764f0be76b744d0e01d1df8e66601", + "ea391ffb47c13a48f74a70b96490f7b0f7eefbe4222d55f7bfe004b1b04b983a56a465da3e033df40a3b51e63becdaddcdd38bdabcdc33b249a30a13689e5aca01", + "0bd57e44ab89c2c677eb0c491b6ed609c85018f0e875a7e1300d4699d60529e875e7850562e96fb90c897f316e5fd56d54170b3cd6320be2ce3eb5362d03cd3800", + "b27bb5e4a094442b30b7d55ba2c4996cce6e454f79c88c339ef89bb754c2b2ca561086e3ed647881fc4f6079831076d413ef027f942643a5e939ca41e583037401", + "26faa7a87708f5d27731e866ca1cce8864a4fb2e258eeb16de8bbf86c1fc4429736f07693a5e42f0bab79c696024ade370fd7374c93cc8b692bd56fb7093295600" + ] + }, + { + "address": "SZRDLCVHyoP7Xo5FEnEw7ckibmitbNx25V", + "secret": "2ccb1679652e9bad28f3a316dd8d98ebfb5d8d72d679655365c4fd42e07089b1", + "public": "0284eefe3f4d6500fb563b69d52c7cfdf3152a3394321cfe1dc8d1de1e2868e3f2", + "signatures": [ + "392f6b36bf19de26894386049ae581aeb4f358296a02ea0666fa7a0c4732aa950d5b0410757644af454df89b1b6c6e8922676b21e095dc0fd094aee93e4be6a100", + "6eb48f725ed820f3001b88814a7ddbfc2dd60264612a29c2a6fe619dcd227fc3641873b78539dcb14fb74024e617b1e9c59ec71edd33f7292b5771a52bb6289d01", + "4b81f2caabe43a42915a7e19b34234f624f0dfa69353ccdc613874264bb5335003e6e04414ec7c84f4127f720b84772209ca59382fb4f38d102d312ecd4e64ac01", + "2428b1fd886fd31eea75246479dc120746ced1a4d97e633cea7a22ba67378f5636a09f06b6e9c66824efd5c761f1106b6aa15d4e0594c29239f4cb9dc1089bb800", + "627dde5f3179cfd4f1256018e59f17af2426a23d2131c4bc68d6cfb82b19a08f70e0ae7fe7d1029c71112272577c1db86086ed84ee5a7b17c112badcba0a601d00", + "8249b9da32a7f5c94035279ac4eb27f0e62cb50d230d1b30347d7cb0292dea8f2b662f54585a7bbd462858210010298abb3f7d1c16371d1221ff421a74a3744301", + "cd8c4985681c319ba9f7c797f5b9ba9c683776367dc4a90370ec09fcc8f6e0f07c7208db052e77ab6d595879e14423579eb2e2bc55ce04912e65f82601abbf6601", + "0aae569e4ceabbe5b8e1cec72ffc180fd9f93d5f17bc1b7df01e8951cb4c35a675f55a49ec380f8f33b561ff1647a063d4147808e94e2ae99dbcef97d2f1139d00", + "5b984636c673f60e7abe58c10a2e079f3e01da2fd8b41a239e6f596219dee2511ce4f0b35b1531ca8442137764980163509a3c05c219106c79a8e2f62b23d14701", + "9c6ff83bb5482a96c22eeef69246cede55105641018ef2d9cd40a265e45d402620403f555329262e20a5a0d053792ca7ddbdfc16d80552e4e0a8d6b83da86b9400" + ] + }, + { + "address": "2hSc4vmw59H1FEfsRUQ3eqvkceAAv6nanQE", + "secret": "867f5d21e6e2c3204b6c526ddd8a5d3b7fdaf8612f5bcb5423956a0d9eac9761", + "public": "02ddfd5d6c55293a925a7003bf23df040a91002f603c5db45c8605822f79caea01", + "signatures": [ + "e2255269e581bb78a86cd9b056d5089f03b77724401cfb900373571b5bce0c8069660bcdaaa99dc5df44214ffdf270d7e5065236867f20c2e692d2c4d7de0a4100", + "959d6ccae8bb8234634a5b15327a3e5ba03a15a6ac59341ed45f4e5767731bc358e2113667bf1fb15f15c0bde8b32d6aa83d4d9f91a8e479758373729641901401", + "cc8e9ec5f38f3d0a3ff71d507b9cd185ad7379448c2d33f4fc0944c4cf8d072f756e7cf1c38022375865105dbfaf5b7f71725e8c7a6491a1468db8ed93aa72df00", + "b82e4a33f0d9c4f6bdcf8a20acf103539bbd29d6e34dcbf15e396b980985f3a21d7903f83d6c61278d28de465f2a7ad2e8df1ae5db2bc823902bc63353e0937401", + "0783f3743f119b073a1ed59dea2641b5546fe585831597c655cb9841bc8ac16f656ac3ab9d16c57410bde691053675126c739cfc49694a3cf3030d776bb8def001", + "bfc6d5273d529ba5687a925e177740f33035a7677f366a3cb1660840954b417c0b9876d130231c1cffba939121d9ea12de9cecd88d6e84d5e9e061b4b443cab600", + "8edbbc3fa3c844abc1263b9ea429cde5df75524bb2acf2ffef42f65e4c1922b5676fa50b316ee8afec86fbcd116dd55218a44ceab2645d4bfb9e277822ea305a01", + "584242e0143eaa13dfb4736fab23f6a5e19848a3b625e59b9bf6c603789b00047371314b12fadc3b554437220c6af2ce6a406e694393d8e3da445496891d3ac800", + "d8fff1e095c12c899d7e993f5918e99164fa362d6262227d13f0e1f6ea40caa01fbab5f7b0252f306baa364a29e6824d4217bca7771b98e3114a6d9ddf72970000", + "6e4241e151308d5b33cd8256c7d614f804e668a61a16b4b7273f023c21d7e3006b41e1aff2703b4c8ce93da01484a70b6e9f09ebe09390f6f611db0694df44e700" + ] + }, + { + "address": "5vbcxd6wjxfVaa2rYqHXXYkW5cjFLmh8BS", + "secret": "2bf3f42540a08a15ca280560e43efd112e843d4de930a2ad8de07b1befcf7231", + "public": "0243e58f57f152aceda76daef9332f9ef9f844e4ef5c1b15685359d0d0dfa07799", + "signatures": [ + "c562d6f8476717a027f1ab8c14f95e444f6a5c0eb789a640a56f58dc0339ced44a62e983abecb139a3a96ff2333a7561df23fa8b1705b8c06bc3b921a51afb4f00", + "4cc7e74e1f2e6136e1e122817f39f83faac6e9e022bd9d0361506a26b368ee28128d1ea7f0bbcb6971fda0caaed4e1e52a0270aeaeaf3daa0fd833ca1e17715201", + "88674e6524a76d0d2e1b8d07067b5342e890d9bf11091b0993b6a5cebc74f71e29dcbe6b0a41446e3d7079c1ba2a6a4df34a8a9cc9724c3dc887d40bd7f5f64401", + "488a99706031b162594963d5bbf78d426fb22dfef8491b32ff9b30a0dd18fb5f085021d97d2bebfb1132d86cfcf72e498a791e19811ff1b3985a499b059a1ebb00", + "438fec175b65eb9644fa9c88e4ebdd7d77c760822eef3bc0bc4ddbf7d04e5d5738928c1ba5e2a31cf006a21a4a888d1986043601a563fcea71afd4e7a46fc38c01", + "f7e70b4a33131be328f844d0011efaee24b63ae60c38f3e79d9cd29583f479d6125c20606de51cd56ad5bc047209f4abf0244335c8bd666306e318dfec5b11b200", + "c61983d341ea122a3001ad70a9e7bc009f564e57b0fb0b8af60e3d72f9326a6248cbad7faff8740da7b907fdc2bafbedd1593c9b83ceb418157232c8fa1802d001", + "afabaa96aa5543d5b7fee0b63c84a9a220c6de4fec3ca7a351b793aa417c28391455cbb90f298b873349f9abeff8fea461a6217a8e1694c69fba51a1d1b10c0500", + "faf1e87ae00172aa9832fa7aaf13297bda608165fc583623062d13360bcb4ab42d8ab9a9f202885030fafdf12c8c21f4bb2ff85a7855e8190b15f52dad3b122601", + "50392beddfed77190bc6c31746006ae525d6be392ebe65a71992711456491031238df2641834bd50cf119074b8f44cbbd5d44bbf8d939461d4d2d09cb022904101" + ] + }, + { + "address": "2ACC9xnasQo1uuJQiZwyxtLnCBxMACcZ5HA", + "secret": "c2a0cef659813cf70809fb35804c0f6446524c039e4e14444c54f71d99888527", + "public": "0286b5204bdac7367a78f615f9cdfeb560fa36a7e2c9cd87d7193fb6dbd856a403", + "signatures": [ + "c77ab13d8107f4965708b75f24bdda7df11bb99b5cf0b8f7bdc8e071db62026b7179fb6256db5e36d926d8fc5227683e52277dea74b95f12c7eb6109049f813e01", + "958d52862b8f9c93bc63c3187a15e1f08e823aa0b4ce36b511668e7e082d05d976afc60b13012199bb5557f0d7726043f25e11434129f6bbc2ef665ad148492200", + "b9077e49d9f986de93cc360e5be3dbf8f30d91fc0f815752eaf0cbc64071000b16fbb965787a4a40eeaa8fd58d6f19e3ec49cdce059aad5f3674c4adaab72da901", + "3cbb3e9169b6116aef09e671e1f35cdbb7dc0fcea9e6f8152df98c371b3648491eaaf50a0cc6e672ed5e69f4255b9bff79532f8da101fa060d0b68ee0e86a86900", + "002895c8bd7a3537095f2e7670a909fd9502e25a6492278d2ae1b65a3f75642364dd31b5446c251174c57bccc5f40f9dfeffb959386a85b9473fabf1578be9f801", + "e3d5e49b8889cb5d655f4d4bdf16a2e3a35c88bc89f1a5c4a75aa82f93c8acc213770b1784c9bf5503f4ea127f4f928e36127d954b18cd3a5d75b1015966da1401", + "990c379fd3f47f08a6899f82f218ba9350e2a94fe046f9865b5ebef04dc734a808769bdfc057f45ea24ebc2a16363dd215c2656fee82792a34439c466a0c3fc201", + "60f194e854753e978e18455dfcd17ed6fc50dc9ecde80c9e78e9ba84238627a815f47b9a7633d6c0e963571a661c7e3896cd4fd26555df11b842466efa4de2ed00", + "12bc90a0c84c73c7b3331ac5106bc5b33202fd28428411721fb084bf5b57cd1517925c8f63265583c50ddafeed9c53c1817b1668a64480226161ec8aa43a73b101", + "ec850e2bc4ad3c96db1cb54cff954ed88566ed2046c806afb0f8218f92b66c9a2a51f2e948b36c5a0137781b82a401639e58301c790d2fad02c17de493bd9f7801" + ] + }, + { + "address": "kaVexneJnxkAbJMmmStgksNmJnZLC426Cm", + "secret": "af9e2a6f2298c2e47f1d77aa23707fdd2963fa83ec431bf48a8b9d15de8a790b", + "public": "029453f88f667c4f636d2461e03fdb8edd01376bf04c0f67ecdac93c38eb869f47", + "signatures": [ + "821915081c72f5b5c953d31cae7d74e65f4156aff94befb9fe18f3b6b4436102488d841a3112eeeb9cbaf1e07450fba1e76714983d5bb40cdbd4581c3a42a71700", + "2295b3fe78e5f199f8eff8648ddedb640dea47b46db10ee38a8942941ae1f70b25da39268774726427c3e77df81e338a91d1a1228053b417c33a9ea01e35854100", + "ebcb5e094ab5ff2c05ce9e6731d879379a59cde87168fda1c066cf8439bde9e53c463a4fecbc1e7eb72f65bd39ecfcc0e67f57dee9e866766e39ee3431e0337c01", + "afaec530e77e9e2906857324943441e574548873d1448348b4a754267d68217707bd6a5074ec510e6144f0dde0dfc8bdaf7e4e7dd58cdd83cae5454a7d0cac0f00", + "61f7f2667cec398d5f03b4d59abab20a7da2f9989efa068659f884bed748f49a449cc53a84a1d7ecb717902d4600c63cd2a4baeb16504563bf5b417157b43c5600", + "7ec0f56f2bb9cd8219ea83a4ac71477ce20061ac77889568f4e26633c68cd35b1cc2177e801eace67e7e11ec23c4d68a7fa324e6c32496cecbe0745eae3fbb3f00", + "25fc127004c1ea09e9f0b0c5bcb62ee8425b2a45484160ba0cdec8c3834ac2707963c59ff546e96f2912107cf0f808fdfc2c56562e19f9398ea37c888dcdfeeb00", + "9db1af6c0c87542eb3af726044951cf603faab78865862314283c48f608aa35846d660253b7d09f77a5b6873f3f77597e8f67f1cc02df53a7072da9cb7fe867a00", + "4c0308e93abf3ac49235e2d97b35f7ea80d18e7bd8da96cabc24c324e97705cd34094509727518ea807c20fc0b54b5d5ad0984d39c5c417b67db098563737d5701", + "6031dd2e342edf16e3d6de88a462a4bccab609efc48deb8c7f1d4d31de655c845e0513a38e2146043eaeb03f0bddd77d583e0ba55dd01379570f0c3116d2215d00" + ] + }, + { + "address": "JAiiQdrBFFSAgY2NxbU4PgKSzzycdjAJN9", + "secret": "2e6a21b2b939aae41056675f2aa47fa9015ee2472864b0da10cb0b3ab81c7d83", + "public": "028022f636b47fd06b43abed097bd3c0fadf44689936cc5cef4e40291281964aae", + "signatures": [ + "ed6a323988302ae35f6bf4344d0feeaf6ca2cc98924c61d89d2baac4756f84af157c96fab9ccbf05ac1f3bbda3ab26c01bd0de2ea5d7516f1740f21990c0582700", + "816166e485e7a1fc98f013bcba8c86929b81d2b4ee98b116146bbfffc51405d61bd43d91a03969f08a062a74dee64eda518555a2f71ab2fe54606b11e010d23701", + "fa66344d7212ab12eefcdc2e30bead3eb015d9e328a09ee342a60fb50fdb1ab91db7ad1b0391a2c5e483435e177d2190dc9624212b02b9c4a8ebb6d8e23e5add00", + "92e6d0c388cc9bc4a2a42c7cf7d4eee0e9969ee2673d1b3f3cfa049cb069e361255f0e5e3fb1ad08eabadaf8338b990b9a3c03775e20499952144653c7d4c56701", + "491cd9ddb98909e25c019f93f75f42a3f3be73628ad5c822e619eb63d2bd47022d38afa0b1017529cc5afbcb8ffad74cdd216ba9dfd934b48b1d5a5f47f581da01", + "5407be85be4c256f186dd2b552c47d3a5a50bfb6bba489f9c3dfe3d95b7213372fb5a884beedd1ae250066ac2b264a5d60fd8520798ae0f990c1459bc3f79f6a00", + "35ab96ef9cf604e2ce83b7a2475700435426789bb56b2a4e3e39f2fbf84692f85b4501acb8129ff57f769a9ef1d5826509ff86474fd12e9882b204e956d7832b01", + "b4598b238badb2b0b06c6bc3f37ee59ad802cd45990646c1fc2ac157821ce159497fe4b0cb90dff620b1516952007b12af295aea98d3dae4d5b16820f17145a800", + "971802ee62ad7818279facc0c549f6a54da277b69d55e01fb02d557ce93788f32eddbed9fc62fcb68fe0429fa615369cb0fcf9dde3d5305477348acefd19e0cf01", + "4afc9fb67f058d08575ba3eea93fb6e6309cccca16e359197a6aa838c9be7c065138af45c012aca1f74914402b8c3d84f7094daf6300c9045db74e7ab1c3fa6701" + ] + }, + { + "address": "Z6XPgNGMRjR3dVjcm4A5CBqLS3aqVQcVaA", + "secret": "0deaeda9c4f6391c54bb1ec5d16a31474b297f33d4e7af256286cea76e4fc40e", + "public": "024945c67ebb6749835872e06e9fe8d3f0fe13c154a5681764072daaebfc9f6c60", + "signatures": [ + "e8148d32e2bace9e7c8e6017e7229c3ce809ec88ceb83a01a2a2299fb87700576f79df74e7071e3216649de4653807a1c94193ac38f0d74d0abf25a6f8de750900", + "0ab4d582a506ccbfe351f54f676a97830fbc3efc24deb49f9410d8d80e0767e16fe6e0890c72b16774fc8aae801c698072e001b2d0c6ec2cb6637cc52517692900", + "1c6bf51244d387fae3b6409e5c42428c5a39db4178746298e29cf397b21335fb49deeb64ce486281fe6318f235213d016ef7142c7540fae3163a5de94f209ee600", + "f18778602f0cdef09fbc469c219e92c5bc52a5dcd7d873c2a4759d0938e503dc0d022341130004e45be1c7644d3ec3a338039d9c410352afce7e41dcb300728d01", + "2e0978dae226b1e70b46e88ab1fc2126fa1db334f022b0b960b3611e341b6986233ef8fc90a1a1ce28183b18a9ff5c701fbf340ddb4c45a88b1dfde74f7f39e101", + "3fe60797a43ffc78e26e55990e3eeea76e6e920e47ceb4a51a07ee22c2c0be1b7e51d098536a38537aa99d24af3c644db97337d51b65d13ccbd218b9839f179c01", + "ad77f584346779975e2fa12d3e7aaf0ea35b025298fde1f211488ed5b92d25343c86b4c2c0202748b80c2de9008fd043aa1d3f60262ec1f9f0f0e95dd4c2fa4800", + "27d66336014a5a93c5e2177ea72755fc0b858d7ab79a5976e38e5287549a6d0d0cee44bff45c3b7b89d6a1ea30cfda80c13f9a772d38bcd57c72f938db85afc101", + "9417eb0a9be763f5fb0ee8b189df8cf1a52657b87e545c28908802a7fa0c06442fd47c5ae49bd8fbc4e4985f82da6f86c2149e17fb903303420c7fe4d05a6b0500", + "421dbe10f4f49c005f3918511f9ff71ea6701ea76226cd1e6984329adbe4428745ce14e5768970e2e3fcd1408055b2f194f73cfff88aabd933bc8de4d607426f01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0001.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0001.golden new file mode 100755 index 0000000..db7a542 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0001.golden @@ -0,0 +1,175 @@ +{ + "seed": "d29yayBwcmlkZSB3YXJyaW9yIHRheGkga2ljayBhdGhsZXRlIGdvb2QgbWF6ZSBicmllZiBhZGRyZXNzIHNoaWZ0IGNyZWVr", + "keys": [ + { + "address": "2XDHP1JPEun347k6C559npPHT23V5GWeMkA", + "secret": "0e1e9ad1a0a6c688d9d04af22b2e07a13af293a05859ffb557c841daed509127", + "public": "02fbb044de5c57fae0a3e95ff02b9054ea82b54417a649088b76b4c340a38010ad", + "signatures": [ + "7d3283dcdfb1405890548d18839f6b7ecafe2087c5059e9d480e6161a79d6454213ca3da4653d39c269ecc909602f31fc7b3d6e7490d254baa166381281209be01", + "346269476c810294bf435f0567d1dbb397edef6e14e933215beb5cfbc07626c654e3012b5b56d218bb06ad9d384e19610824d80d618eb9c319ddfe206ba2655c01", + "1834af9a12d6a1f445441a23d320ab4f8a33b838c2055a3ba504c2e4b4e778fe5e2f7b1982f21129ed41eb20fa045f6bc0d248af77bf85830699826bf5b285d200", + "deee28aad8b2c995811b297d38ad4a27bbce26e7cd3a66e9ef69049a0336ccdb6a5d10c95b48cc561d1138b2eb21441bc83e7c02b7e759c8c270b17184d6f1e300", + "4b3657dff134d534749c5843eb3ddcccaa4f4c0cc7cc8d1916f002975dbc49d7731a595924b92d943a8c851f86ad78a017b35333302d51367b7029ab4750bcc301", + "5e045424c0cc976af4aed5c82418eb552b65f3daa5faed4ce7252e58edf6055c4ddde6b3769fbcde1daca74eb7681cc675cfbc2041d9b72094fd8dd0b87201fa01", + "9c5034280942f96a7dc805c436984a048a5f69b66c1dd1e8ebf07d9a34997a5f2f839a6bc4d6f17bf0f36fb3aab950dc9e5b62bee81bddabfc7d3aca80edf69b00", + "ffbda2b52e5f3e66b51feadecce7bfdad2fe28599233c5d458bad947f8760d11290a822629788ef521d39d7e0a7acb8b4bbfb7e69d3b45c88b98d594ba2bb84c00", + "0a21297c3a3b0ec4175428c78b656bfbae6864b4175fe02fa76cd9b353ca818a3ff3016c73ee471818f59d56112afbea170618e80eeb993d187bf7e4e608099f01", + "5edf4fb85781e57e15ac862da6bc40052edcb038a2716ddcbeaf99c6aa5e44037903672256d3d7959cc519fbfcbba47632f9c0648869844713e57dda74b87b9300" + ] + }, + { + "address": "Vqab1WiLJNvuijFgF1MMpvBxuq6sFUCA3T", + "secret": "2c7035ee76f97882a5c42f9876dd754babbf09acb0b78e05e7dcc51abfb41487", + "public": "03e775cae88d586b8df030ca149b93a71957a0a94c7e46c1d3a73b7f3c6488bea8", + "signatures": [ + "f33228d492945ea6ee40ca7b70161a9326f908f6153c2de82658047a0569f51f248cffb24033dbe9fffc6d7a9ec9745a3e52352ce3932a536fb6b4989506ee1101", + "e0509cdf76cd8a7dde14751190e8aa1272a04fe7635a51f454726e914c81e9a7744f189a3b62886bfbc33df0e5e56be6a16d555974955c124cea192cd0fed73000", + "7bb2e5b1162127af297a6cb76ab5979b1bef18bd309baa96e720aaf7188219ed58d0d520700c8415d4d5fbf75ad2d40960e63266d7db8a1c922940bb3770c46001", + "db6426d28e2345597df9aeb13b12a6921b4fcdd2c8017f33b98ad0a0062041072a1a270431d05a4af1a5f7e75eed79bbfe375682947e793011c31d4e1ac02bf800", + "01c403fd1157ebef2233dad324262fd6ccfcdb4a6537476acd9dff6490219fd214395056c03118f9543854822556667f1380bef6004b307683629ad0787c219a00", + "59eb6e47198963496cf86545e83375d5681031561de90e3e845d59317977a7aa4e70b08b87106f149139fce3514fbcf9d63d9da31a33c52a259b438050b86a7000", + "85e49ce059db04f9c567766831dad49aca85f1365d9a87e3b4cd3a948a42be82105b4d54cc47684c135b453e685b73e0472f42565d6f7d155937826cece3ff5000", + "f49bda680022309cb2480beaf3eb31dc88b6a17bb4f6afd00b75097ea8a17aee4594137fa0de216ae3e9b20846eee984e7cc4d5b68d9ea156ecef90bb371728400", + "93fe26c6153eb35fce04f0308ea84a36d4843f474c6afc4ab1ff8415b8274d1236f1d0b683b73b3098802d53e5ac2a0da06d9cd62de7cac8695e8d167baf15ab01", + "a65eaaceb3624a1e0ed73e5b04bd499b818e1636fa4f3145ba571e0d811a8ca42b8763f27a2a07b521fcb4c1f19e5e991127ca54692db641cfdf44d0bf39455600" + ] + }, + { + "address": "zAvpEnXXBKqLqUuqW4SXQKKpMSPRF78Pod", + "secret": "ba66a37d7ef52c9145221b0b744afdc2a39922e512af4387fa6d109392929566", + "public": "02b2508601b986a275cde7ff449580639c8b78442ce0d87539110c5fbec4886f8e", + "signatures": [ + "8c2202d04ddc46d2fd066b440c263e00102a2c62efe4ad53bbbcfc7c119aa7a83130d56f7e7a117876a0d4285ba056ebfd2c66f8ae81272d9f0c39d0602a8cca00", + "50526c8372452645fb21a4f8b5a7cdeb4c937bc5d051beafd389911f6360514a4ec32e6d08c6227de99d7e03895385518dd5d4948b392935b7f8b69779ae1dae01", + "e4eb76d581d4f99b1904be74387ab7954b52bbd387e6f7c033083dd7024ca3c31952acb23da09ce66af2ccff81a2d59baf17cc454ad71d6bd4a109486fb4fdca01", + "84c8ec314681261c43bf9120544b9be17d2378d508ebb833a353c34216051f4d28c9713bad786d5a90b3a3b228467085dc05f4da092d6eba4c8643b0adb4e6d700", + "f46706a56fb07d67fd6cc2a4071af59863669acf2d7f1a9941f8b36bde42c47e767089a7e26eab64b5bc8a6e116044a9a5eb3eb1f2d0cb7d4f51f9e50a76ceb001", + "56e4b18df20901bfeae20cc9c9f45ad7a7a3c7d6d2506acf7571c04415308e00379fcc74cbef49823c51dad0c063f269596fa1ac434b8405cfb9d1b125b0a47500", + "0855cf0318fdc6d0c7f106630911171e7c51106e5e837df48fd117be59d92d5144d0ccba6a42791f48ba49f3388686176a2ade9f0a7d91a103b2add7ad3d682100", + "42c0522ac061f7d596462a20c5994201e1912ca4c0181ef7002570b0773181306038a5e0221b971f069599a1600d20cadaab5908d3944f885e1389b20ea16e0400", + "643bba11d65520ed42000e94d2da7800e7b595475606114d87b603c1af4276780d83db0cd39999ac96fa35cf9977ed5bc8352c2a94ea4629bb7d6ad733c73eb501", + "93b65ebc83179381e53c4010a7a63e95e2daa9ddefd4d05c342a6aa0a5891262764c21bd85cccca2a8f040a00b983836976540968e65f26ba62eaddf597d977801" + ] + }, + { + "address": "GykRXwXiz5kjHyBsrUkHRNToHWSKEEhkAd", + "secret": "0c335f2076e58db76dde9a26dba8995028512180208c9ffc9c01928682814d91", + "public": "03a6963955bfa042116dbd4670361b989bcc0d841b96c0c402c83e7e1e23b64708", + "signatures": [ + "f9c115799f868fd84a1201021830966916a492e68a56592d5eb8dfbaad0d9c34564f420ab00996831f19db39bb94d81af763baad2d3e71f670f53e0e8003e1d301", + "a1ef2a9c00f6a4581105f586d735121f21f0236c48b1ad2d5466d392c53ad88f4bbe91493b909e48f6fa5a9ce5e7ebd93fc3c9a071bf2b760c6c771f04ed0b0601", + "394fee301cab788f7cc4af12f245a0b4765519cec1af7208409cabb06986add670f6c8641c4b40b7cd516d0283fe6c2ad872d953fb34fb9b554ac272268fb7a201", + "86493a09108cd772ed60f67ca2e5dad4c61d04e9dc24809247156400ca41e7ec31af35d01d71e24a3776673e7c825100678e9b7d060a7b5b5013160ac4f0a10e00", + "aefdfecc52c33f074351c497ffd2508d0bdb651f7b5745bdd98ae384c266f993336b6bd67d575d749db3c54bb2dad5d977958840309b954e3586e5b01fcb7b0701", + "3b032eb1fd883530a7d8f4fafd023f83da857f8c4381c1d0a055b8ffd1a3ad8b5554a1a295d188cca6ad6ab1ef9964610ea53d92cb868fc83b46a12206c70a8c01", + "e59f70fbfb3b23e75e290a0569f323ed6c82e721ba7b268b75b5833dbb3c739f4ee0d92593ccba21970fadae8904ce4e95e6edc6429377229b74f6bec34ec77201", + "b3936090c63f04f6a52720a102f1dc5ee26123758637b98e23c01dcee3d6f280266963e980439eb9bcdae68095fa5cb1d8bda02a1440be90a5e597f8c426bdb600", + "09cbc77d194f64d03a3ef27cc4716241f815e8b3b46e5ad4fa68277c5d8d1ecd72bdb8576be4e325fcbbc67aec516de0aead8f871ab9087ac53a39bf6f9db26601", + "704365c292a1d934d26956584bbe34ac0db54cf5b03ce3f9b1367805cd488ff830f0e2fe34727e8c7409fae6bd4878e10ae2b452fdf15c9a423afc79e653ea2801" + ] + }, + { + "address": "aZ9jLZm6MWpy6kF3kpjJTNo2eo4oLbeeXx", + "secret": "ecaef882b218b8e182f17883ed7462b4120064f26d5c7880a596e9f8bd0cff52", + "public": "0268e2cc53ec1d81dc64731495428a98db2331e9eab7ff899251931662ddd6c12b", + "signatures": [ + "b56be8c206b65c96cb8e0d174b289dc0f78d3d1657edf35eb2dbeae0260a89b96e7bd8847e206129348e0ab303f2a7f331d34fbe81d11b85aa02a6c0e9d3ee0200", + "b4bc4d5be6e24a0fb415c211f4420dc92729f0a1085126342d04fceead2ac7c1699542e02aef4e7a5b8426915a1a68beb1687669344256ac899e5332066a455201", + "4f037576467400a8b68bed9f47deac9956a1a6eb353677f10e21b5a424b2a0656efc0a949f9c0b125dc1c1208c80e708c5ab29eafdf97dd40f26172decd1726601", + "2365b10f2be2fdde0b7831bf3f9aa24fadcdf4713a6efb422a6790e353dd71c74d813e137da07a6f9e1ca515b10abfc316ba280eea0eb8d1645fbaba20c2e81800", + "cadf2560137316bb8827417e8ee322644cad64c4c1ec9aac63967f4a5ac0ae7971f5260c83d792c044332f07da13a0d573c9905f588b607486ffb00755a94f2600", + "a16edacc86031c008d0b5cba9365ca9c39ae724d030fa288d11726adf59e7e3f4060155ffea336028d03ccd08393dc27b427121fb5b63fba892171aa0d00920601", + "e85d863e3e5b30e31ca57c511614f6a53794a48a16197d2a504f6b4347e8417f73b2d1367988d687568f8b413c4d3b854daac8df95a64c22153b76e7ac03123201", + "a98e2e0361339e11417f4d8d45585e8fb3a517735793b2c4dcb7d06838ef80fc06706b99f91dbfdc7568ef720d9915169e63003b435c2e2d03557c90baca319e01", + "f2b62c93fb7d36e0bb6152ea57b7eb158fb93984f12fc7eba7151a8a4ebfeec902f2c2205a910c79288063e3b73896429f162cc253360f50aabe4372d81badff00", + "3d99597f0d9f53dbd009640fde0e7c44ff567babeb4d5eb54b7f00f50c337bc92155b9342cd817fff6291d70e614681b3d890a1249debd89a6d3e14e6641e2fc00" + ] + }, + { + "address": "2mLzdkpXtaLWvFuVvzNgZFcQgBnd2Nz6wEh", + "secret": "d35734c6a9df59900f8fac59396a1e1e735eb0c43443bba39ff814c9f91abd4e", + "public": "0272b067783e0ae0660364318bf3b408b12c105f6f75ad6da46bd88131f8cee2fb", + "signatures": [ + "ab9ea96f4f3638fdf6b5166d7c971b7e5aa71c042704ffb4c21657ef29cad87e2ec2c8b1d220ac68f40efbc7f9236bfb28c02762d52bf1b5677a7063682cacf600", + "e16e160405c0b410d1037fc217b32e2fcf626a27a5f50ee003065a8059bd40757e18a5f1d469009458725b936ba581a99af1183838fe7b0b3931cab941814cfb01", + "80c491a4668da1a22eb4eae950c1456a07919286656e327c0b9190c7004922ad50bb59de0620ef381cf1c10515b2f31d2850650ee65d3cf60fe44276bc7ce04f01", + "3d3f547e2644e3b8c49dc5a54882100bdb499879017f51949cf4bb8ccba9591040b1036483de48b27aba1bb7f8d73ac90a96fe787dddd233ee5406d3d8fcb4f600", + "72ccf7ebdef8e297db0a7348ff83bf6149e50daa24a29e38dd2c5f0d8ddd689f58034fcf8eafe64eacaba243dda0bfcc498743521f569301c9b19f95ea71d9ca01", + "b7347269ce29185b3ac9bf94f623307108dde70145978005d09c396d0739682028a3bbf0460eb7c848f3fd1648af5e90611e42b49901c40aa22e4f73bec0290b01", + "3658c5490f32f423ccdd10fbdb2c5ce674424c8635c1236ed88a37732f253d6212656ed16c70fbb31e9980f27ebbd34400a424d2110baf67c348c167033c7a0400", + "a4111d9b5b8ab7bbca90adb0b4c93faa45fcb03b717a6f11ac485b64ab3b0da505e2b749d971c700eafafea370c9feb66a1385943515950291fb3253b255505300", + "34e8c561770c77c2aa14f6955a1f5acfb29b7fd9ae846bb537c50f02833a35d656a8146517cb3312577a751f8fa1d3a1d48377a9ae6f3fec5fff3806f335fe3900", + "ed91dc06187be3c4688ffb6da8fe16392daf976dcc965faa4dad753a46cf2da476db8956787d98cac6af62665be2f31a9556b76d1cf4684127f90502d9a4ffd301" + ] + }, + { + "address": "2QDx8n4AqA2Zg6BjHPbvKa6jjTqn8GuvDmN", + "secret": "d65af2ad4afa373ec16c002605d384c6dacc8e6f5b803eef066626f518eee964", + "public": "034591c117b23c0125cc41e78d887fb64d3ca4f4ba6c14ba9e5a03380114096ccf", + "signatures": [ + "0b4418424dc07e0ef668f9363ca9e069946c8f5f2e0e733177fc37ef9e9a0b17626fbc899ced973cd2b2794b9980bfe8004c5bd5f9f8e7545fbcf3d45387844600", + "18889e1bc48c7ec850fedb15d991145607c097c061c78eb8a88b709b01b7a996479f55f3ed9e44c8e48551d56e2292011e5e2af8820bd48e43a0a572dfd2197801", + "45e65bd3a99910aa5cde9d482bfb5ce61b138b8d3f0269b7d892e5975bea8c9b7ac6b85541000f75f7eb0998161357fb7cc54fbaee11436fbaffe77ccd0f0b7201", + "ec56ea2c59898f2885313db13dc7386d7d7339968139190905c0c8f6c1b93dc868b03b12f19efa0de748beda1727c9e7d2ad5b5f7121a4d77c38e675c70fcd6600", + "893f74090ec8b968a3576e22280c946f75fb59b6bc8b32c1f5b74485f1d555ca050285b91ee0ed5a3d3e997a7c9c2f3e680092025065f5047631de41e8b7359400", + "018748f5470e0ba9560ac9b284265fd93a7e65284cbde89cb8bd17c7bb570cc94ba0084159d0046769f2172152e53652e29c176fec65f03d8f319c1187530d1600", + "8abe93c4ad0a2860274a38adf092dde1e49ca71501840d66f1b3f515e99ba6b05f231a7fae44eaf376030f1727a0bd60d7623573b85198e6a4d995b84d89c8bb01", + "7767f6d6810a2026620886014d9197e67f73bc091b6c1356eca1eac80300f0a6080d8dbeb24785d1a53ee87612d833001b7f0368ed9699c559c7443c3148a95700", + "9740dce7801a4845fa194ad13ceab4179441f2cd708797ef1c1720bec9039d1a7adfc34098b756dfee4b02356ff86160322afc29ee603ba4a8091108ff4c619501", + "e75ac790094525f7eff99f14d92e7ec035b0134442f1ef55c6ded7af74d42a6c6f689e9fcbf2d9b3de722f9e1415e5c7dce756946e8ae8174a0866c22b8d9a8f01" + ] + }, + { + "address": "nSXnnQA2aaLHdzg9LXgyoY1bkRYyoJcPNK", + "secret": "3a6d13f46da4a800ef8c2e350f48e53cb601efca9c1af27f0650065d9334583b", + "public": "03865c2b491360dfe2afe6e918261b9e909cd87e53b61afa3edf4fcf47bc4f9d51", + "signatures": [ + "1d9ff908a3bbd7416efc2a9ad50ef9a3b7db795857755c79ce0457360812116f516960d1c6f97d1d8d0ac3ea2975cf2f4ffa0d08b1d35224ae9799e91b04fc2a01", + "957ae4c1a90e1465564112a513597c3bd6c8a1e341f682b8a251a0c6272e9f562a0d3d81665425e7f710fc3d20a9f8a4a28b6badd63c92922b1933fda2d8376b00", + "d791eda6f4548bb24fe5f0b1eddae7db453156187a10538fcd837fc63dc189f40359ed7cadd04c6dc65946488149854e4cb5baed743ddfd1c49247e7305d9fcb01", + "7188ed823f256af8a430f9c6e56769c3455b093fc649bfe6e779a97219b9d3673dbd5748cc3bfb8097708f997baf7b901290ba0daef661369738a5f7794e72cb00", + "5b5bd1b9b1ac663480cc4f1652151aa0a27d456392dbd7fa5c1077f14c523d200b9c677b150e4a03f68c363c987495b05cc7dbc1498f9347dd7e7b1c598f1c0b00", + "1d9535097480035b32e949d5b678ab1bc0a40f998eab8f411d8917232ac58af0022d32d709431a693639926e36ef70dcbdba6841bf8a6edf007d4b2b339b02bd00", + "f99830f86e5f4c812104bc7f7d4b0f2dea4e1afc0cc338e93f378cd82f044d4f2647771d665af37c3b83fa4ad153516a120f6177cad4c6b151bb7fbe057432b801", + "d28e2d7aa2964f048b262c9bcbb9a462196d81ffd491b36700cf1ebdcbe51a6104a97beff3265896731d03e7f98239358c14235e2480d10665573e838b6e6db000", + "97ed4c87a77ef0bd231debfe414bf1335e74be8a1d56dfc5fe7d8f611246506f1e7c6aa6395f2a0e31547d71e766358ab048581678d83b2ee2362b3e52ef7c3c01", + "d6717596c6f62d6430c475a46f6ae0e062cd667c1bbbee66cb448daef72e6ef1093011f7e398488b280ac763f3b11b93b2d643380d1e0514dbaac2d6293271c700" + ] + }, + { + "address": "25qo9WDafW5bL8J1rrfDo3zAFFmUbWM545B", + "secret": "03a71adfe4f3a34087b6b0f303f0678b218b386c3d129a8366f9fd40e11c1050", + "public": "03d5b421cffd4fa34d0aa36716d7b5f34c78ec362f6b2396d1104c490ecce196d0", + "signatures": [ + "2aea2918de643baa9bec04ea49f9c3bb7858b09e7d0a2dfa8ac718367951ebfe6e3825f4a5aa08f3a8ce3ac1fd021aa8dbd68f2b05ed18746a53d70cdcadb26400", + "c0475aa5ee4dc3d3264703195a145beb28731516684194fee43c9538444079670f30eb13522ad7ef654deed6a7a6a818f38d79219bdf6138461d43d8ede9aef901", + "7ac1e3195f1ef8b99084f2d97250b8dba8cd55148807f8d3437406e252938f1d78d86fa5f9b6949942ef4579fdb0a8dcbbf3cc37cbcecf51605ec4aa2922cf2500", + "af2afcacc960b2d12395e1de8668a456eb2526b250e5942db785fdf3a0b055d56015c367ed6de7efd680eeddc1a8f789ae787eda887b23a7e4f6c2f7575f10b000", + "4b9ab114829349ba27e34152b51f9d3c83198673a354a949934399088508d3d014baac7e910c367627e37a1544bab8ce1661600be92c346463497e6965551a9000", + "7e5c5d8f8f27d2c1461b6653089e7727c7a0f630ebe5012d07d75979095658ae0b5c679b3daa5ae34a528993d6c9f60319668f36e583bf607782766adc7d9fc400", + "ccd7e23d4de2f095d77d08b6e34e134521c5aeab84c9ae78c427cbdb0f72c310261444cf20d21ab84ac2ee6472b8163204323b5108adc59c6c01e72fdab6eb8100", + "f7eb4299d5b9fdecc1ea7b366b1d82713322d15390c057953d6b42ac76d0bacb36d9f3c5568bf2f5c6372d4f0fbcd630588f3c27c2309e1da4e02a09d4d6ce4201", + "384b61a3719213b153ca45d788c34738860c6353d6d15751225ae3d6dc35bc192c0189edd24f96f95898a29164291c047a1d11099d397600820e171dd813b94201", + "9392c342570352667d1d6ed8c1a8438bd8caae455e9901194f788c4fc653e04f43d328453c9818c0a1b009767e36a630ef9453a51b4aab4de80581a78119212000" + ] + }, + { + "address": "2U9tv3pcptMson7aVDj7epyVhuJBQkSTA8W", + "secret": "a7832a68c6f1ce353b341c78661ec2e39291a3d02676a7804c04eae2a638a68b", + "public": "035bbcfedafcabc3f0bd26f3af4e9046d01e96e6d596e751e2a3922815f586d70e", + "signatures": [ + "d0857d3237ec891c839269dafd3df42be1e8429765673bcde990d2e760f827b9189da08b0037bd8a0423bc541798925a4396b79688cf9e329cf42881aff93d1a00", + "bd143fbef42414fc7520308c6492dde2fe442b19deb2d2c8412626c0f07526292ad3bca282cda727915408e14da782d3bff8047eec4011363a8db4ad562cba5700", + "4893755c3b2c465c3a503465a0cfc7828169fcdd52139f042ce4799dc9d0a4003cb4e40c271de767fc8df0a6f93745a591fc2dc13f6b17a12c95473c1042857a00", + "62f03a6284039b98acac22c0d64447ffd65be2101b22d104eb098e4a065d995d157226a117a6d34a2e2a053dc199b41a6e23074a8a700554c76fa45ffa4a1b8b00", + "99d7cc90fb119c8b722c0582bc097b5bb260b0a871c9c05439dad466d1c970f112cb4311efe7753d44e91dc0162c3d2befca32848767fa642b50725e02e02b1501", + "de62021fa95a4c90a5cee0b902d03119bb801ef99a6c575577b32f432be9da047e8b2a7e32e9910116219bf1c41dfafddf38f99ddeedd01ed1bed9853779e7e800", + "dfed34d6c672783dd664ec8f4444467b1e15c2e3aaefb21804545fb47398c3d3728c86c27e1507d6b14bf3c5f952d7a308f0fb5e5cb947dd0971cf37440086c700", + "4d410ada413d3af780693aab75d8280da0d9af542875f8b71f50ee194cf9829a33e23686760fb9a07f3bb37af99b1c97709c124b15c0fa89ec3f9709a1439fe801", + "a5ddc28a3ee448ca1cf28ea8ac3991ce2f1fe562d52c8a7634d58871744253f2132e8bc1e7c13a370429eefa26c6956c19cb548d5e4e663e47dca12fedd16a2300", + "3da1a98584f6ed35cbf918d514fcd5074157d91b99d84ee1267b10d40fe0d34b42d552f8ea1d09b44de9e32fc2339d1d784046d834c790c471fcb9249d4030a500" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0002.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0002.golden new file mode 100755 index 0000000..585fb02 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0002.golden @@ -0,0 +1,175 @@ +{ + "seed": "jvgFL+YrrDSJWjeXY3tJo3dek4BbeV+UzrMZ3yir9Sg=", + "keys": [ + { + "address": "JQCEabhVC6ZbsgxbmA5MHTzhifUbX2PUPR", + "secret": "e7c807f67e53438daeafd79a7c52ffeb8d80bf5eec00f281515e7c1d7ceadd13", + "public": "02661206c9ce3649dc890e58e24763dd1f102e7312cf778bf15c0838a589736c7a", + "signatures": [ + "c8d3fdfa608b495c14fd0b47d6f8408a083986ddb58336082f1b0b2aad32aaeb27954f329267c4f2387104f80451a6abf237f40b5e93dbdddf39262fc35cc07e01", + "411f4b6179671d9d13233d9dc9ae4c41982b1e7ee5beeb7389435f8351ae1dcf31d2fed790a49d66cc74c714792d2029a75dea964dc2737428efdba056b4a7f001", + "87ab0f994df1c137ef4b0cdeb657630509eedab2f3fa390de2d8ef51f605743522119933f6751f446975616a95577398e7b0c44ab997634f716bbabcea9793c300", + "77714367c993faaf9162c73cff53f78a0f2bfe6be96b71d28ef2680cab54145047f69c6b592da393aa48891f87fdc261e0dbef1ef718fc0fac80cd11b4d9089200", + "1ee6bf3930d3220d2338a50e66c0e8192bfb98d8ab19e2bab7d0fca6aaf553d95e3f4dd3063d0a6ebf1f9d34a8a0f42c69c2050ff9174ec5a93269e7d6d4c20801", + "026c0be15dc3c74994c403ded0ec0b62982a4916f6cf7acbe644f1205b5cefbb1353ded02926f8450274ae95c89892032d23fb6a03ce192ee0a4408af42332e401", + "4739117ae45320d82e2e1b41ae3f60898e9bc0258d1d7b3f90de521db1ed8e9c67e4d9ee8b5d9ccbb1e5ca76d4cc3caa7bd1dc5fe343a4792b26ff29f0d894d301", + "1c367647b6f9f5da5b1d1ebe3ca06028cc285037c3df4d52c95c832280312e9833e65fadb77fff05e5d649ca5a65b57ed33135d5e190186f376eab30c195b2f901", + "21437ae018a00fc75f3ff8ecc69055fa20f320786bfc87e5a3dfd50767f5e64a392ff9dfdbfee7b28b25bfd043e98932ae3c2019e62bebc5ee09ce0385944a0100", + "93232ce00bc5f85f28cd93237be83f861f1fdae74d53c2ad024d4036420178bb1f6df282a829ca5b7361ea348d188ca88c537878644f8e1ccf3bef0e64536d2100" + ] + }, + { + "address": "2xYA6Ty5ngQSGxUxLarPiVpGexTWa7kmZ4", + "secret": "cb09609a37b47ab42e522acc616a8276488b255b07c7d592a03de5fc19bd3ad4", + "public": "02be247f8c246ec549cd378ce34bcbfda52a59bb2cffc92cacc26877c2d0d4e06d", + "signatures": [ + "b218b9da47c96150d6477b44c656ab5bd4e3098f0a36cc37aee30d327e4bc1d37dde4dd8a4167d0fb54dae0b56fd7d7a7aaf7f7671898b81ed0958e4f51bcc0b01", + "3efdb6bd6b772dc8039ea5ce52c9d4714a3b075463180b5a45598523da21a7b32fc6e730a2b7cd48b7e3fb04f61bc8acf07ed6b97922dd3600a837a6d6ef601301", + "fce5664c0d550e19256dd04eb20ba1ae255a855702c7cbfc22576b9057ec32875953066bb020030eaa9a8c7856cb8c2c58c6a3e4cd2dcd7895de8f6bcd5157e801", + "95fe28da7561ddccc725d2fb3aa540bcc8e4571c60b0e744f0ada9db5ec772885a0efc8de1dbee4d347b1caf601f37d8d74a075a6dc290f4960cf70c8370563401", + "b70a88c6c2a2c76df89b481f3546e2a7ca08882f70447043313156a2d5b90e8d0de40c0c27e5dbc565d6148247582b6b05410d9d69998ed4332811436c7b458101", + "fb0f74606f4e239fb7134c6bf3d91cf3a2b76c4cdb08d4c8189c6b457b0663cb7272c6673c93d94e4d7cf94bbbf3af983f541b46a3598a0efe60bfa2fea4508b01", + "3c627b20e0298231599e59d4c803b8a49bab9baba4f45a49d616d4cd06660ffb1c2b60189845cf79546322b22396f613314807e034163e66d47318b9d0d35be501", + "4363cd2d43a6c23df3304023887d7a4d291645c425aaa1afadaf96f1c1ab51b709c054741e5ae7837de4238d0587634c2e189eeb0f01f6bec00cf273a9028c0b01", + "71448bee0563d244d32a17f4683da5c20b786f831cf32bd30f05cc12e376fd9f27c9c60a1130bf9887f2249f3286e4a855232091f1a8900dbfef9b1ad863f70500", + "10ea5ad3a7699ec6de2d3402c333f2fa8ba7b186a3eb378214098a8d1e829e6a4e42505ead889f03113b1a4088b583dac42830879876a9bc74cdd53a815c379301" + ] + }, + { + "address": "zNyfR5GRMNki3HcyWe8da1vhnq1Huf1pYE", + "secret": "1469780a7a54f01572e2a29326b8726a1e5147a2d96222b1e8220b01e7ecb428", + "public": "02e8c038377cba9acf5e6bc9d886973538b8897eb34de689c957caacabe8db839c", + "signatures": [ + "2de7268716605679f813e044d0dc9592660ec76d9fd77eb6286c3ed9a56cc8726b63b69874c186335a5acef4477771748a33d4ea4c7040b6b712aa38e975a98701", + "e320dc92764ecec970a60a0a47fe1580162f2f97438bccab0496dda3a1d985d8132a3d7c5c2eeb7f0aca5ec71a855f9121f06778150d7d0505135304fe991edc01", + "fa5edd7910235a8e57b31fced17ae73d32366642eebb7919538ba17c565e40e37f3730ffecfc7ae42207e531921b7e0ca87bdef76523640659dc7337fba57a4101", + "04c046ff48bf60c1ae74b128d71988f5ce435ee99af83cadbf14c6dd7edb1ec61051fc0ff3c18b020ec642219c72dd45b7c76f4828bc432e181b37959f82d40301", + "b676b3cc400f3362342dd1d279a7230c57dca3973f5a82486717ccbe00dcddd87bb81cadd29fb322d02b2dcc59a3d47b78cdf25ea788ecd3e9ba7cf338d248c301", + "f8adc3b7f0c241f45d8c3ca7b4add88b819ff8388c6eda817f8fb44b5d46e1cf4f1a2554f68957ba82a36996926f25292b7dbce9a37047875eab3ccccea19d1e01", + "1c5c583bc903de18d020ba9dd2494fb9249b387252c3a7967f93ce8aaebfce184cb3edefa7480b886a944d1b1712e323fecceceb70a34371eaf1d87a5172a9fb01", + "7a20e7d8587ab4e612033448e19cbf2d76309ea3914b52578d6000fdfc8243d53ea7f25c81acba7eccb9feec3d09e20fe8947656beaccbc9d63bd6ef79ef96d701", + "800f68685440c16a9fe8eadf94e703b6cf750d798c19bb21df50e0afa2ab85e10a67b1773e571e55a26bca2d9c40ca6661815ad8723c5dc077be6a125d9019b800", + "479d3e035de00b7dcf5cbf5e5ca641b8524f8dc415ec6c60170fa367b9bfd3002cb2a9f477130f105d0ae4ce2d56ac4c4d6cb8aef7244f65ca04c149f469caa700" + ] + }, + { + "address": "2JLkLasmC3aZWegxfrFBMegUwPMMaTRHezu", + "secret": "0c0290d80263d5ca9c3a0d4a8425bfb340387660feb48de1e0020853daa12616", + "public": "03491b93d73f48083311ae3c06f3ecd8c16474e795a58e3ce301ff548e9bac33ed", + "signatures": [ + "13728767950c9ce26b4b7ce9c520a7ad36044ac27fa72a7264764b15b4fdb2e3404d3cd1e716907231fda3db6d4d7b9f1055cada44d72fc3939fe892f4bbf82401", + "d257c55f64e001336df83863ce2b065efab6c60799f7b13839f7abffed5bf5dd6a108c7db8b00dd4cc313150966a88b34770c9d963609054c3f791c15ecedb1401", + "531982656772e00adf2d87834a532310a1fe018a7e44a26b110db88cd51c240e3501514398eeb26ac535613b35a2f71942f6e621598d026c18d29127a8b5c33201", + "4095c7b25fc5deaeb3ceddbfbf65cafc5b060e5a790e9cec3b9b791d2e3a556258eea375d87839bbbd3e277c53be855c51417225dc9d586568cfbce1d542da4000", + "87511d32bd897733747252c3373a17849dd6b87c68f3eec30e30f47ff75a40982546d22a33bd2398d2525ff99980aa96ac0e17ed8ea8574329d427262cfb5d2401", + "d2011487bbd4b997db6c12978637c3c042e397d17d9924d65417b2134467a9d36ed7ac74fe0727ce3727dfff6d90e1607062edd16407f93b26e466162f188fb001", + "5f65d112bc25524334e028ac597c3f9e289394a0afb2e0af6b038eee2a66a40169246279115b5b95e0c4c79e9ce738ea79636c0ae7c1f1e2178a15acf3617f6e01", + "3e87be40a4d5a3c9bf3a8c5e8aded3e311788fecafa3736495a71e06876f55055d34376352cdc8c99de89ae69e48c7dc7f845278408562c681f1aaa02860995600", + "a92ca8f889bdce1c2bb27b1808156afee9c5448cbbf9eee7941e379797261a3346258d418dae445da9c483c55b68c10285c8c5ac59b9e9690b3f0bb429b8782000", + "138752502a10679ca518c2f1c8394b0f49a258a8f92f3e07752a72700817310a08e76da5600f15d214b58b0f3fa00a5797a23e294cc76f72c3913ebf624ed2fb01" + ] + }, + { + "address": "fVQJVXDCg3xx7nSK9NtLm7xw5wfhPenak8", + "secret": "7a64f76a55d52e9ebcc2fd8703153eefe458b7983e8be501cd7b53e99eb7bc38", + "public": "032849624ed86775b96a940bb4c3ea30ce87d2bbf1bd78a8dffac5d5a26a32edb2", + "signatures": [ + "ad8e2123a55c325578facac3b33a4f893b3f2afb1065b6ae51b26a4937d4ac094b89ac89036849a7474539be19af5a82a10476bc9cba60a3c29eed8e16cdd97200", + "3e3811c10b7e1644e4cbb4feb05713be87055c3692124abb51f046d3572ce88367cb91dbbd56208c0958482730cfade12f481babc35839e37c063826f5b3165900", + "c3cc2e9ba9068e6896f15e522dc64a07c2d8767a50e3c95f5d591e708101575655006f4124a433c8045248737772d4f8c49db07bb4fb7e4638592ac2901dfdac00", + "f7e7bd47eb319bc33e14d340b73340c78527587e470a92a5372ff4d4b10780a03ec02ee20ba8387d2bc1f6faa4661c94e2193009c22bd3ae3c7218b70598dfd601", + "d25814fa5075fe6f6dde48d0036638803bde3cdf6162d284cd49182488cb76985f3a27becf6ca57a04a17286fd6479ce89e6e137e47b01a347db4df0983193ba00", + "d9db8532cc2595e35e499319e2193e28024d08f845c6ab83fc069009c3e901f9051953eefa426591d56d092ab7a4b7c8e0cafe3e6704ce0bd10466589cf7e75d01", + "5a7556a143df94e47195afd3ec97fbd8e5a10d970fee7135674a5cff47da053171750083f985fb09dceb762dc97582f87ac312331ae2d2aaef9f34c536bfaa7b01", + "b7e4cb3d1dd9405fa7c4342352fd0920078ceaacea6dcfb3fa5fc5b95ec4e9550c50500507cc8584f9671c8f2c52cc7f773451d94b34adde0438e14aa433461000", + "fb48718e2d5f99114064c368f825842544968cb59a59fe3247a21b0f959397723b838a8b8a9b52690eb14a404987206f5408600e5afe1f03918a1a91fc53451501", + "13cb6373816e236bdcb07c5700078604cbb6de83324ec4f952d9ce046991818242b3730f43bbc5644448fc65097c450191a3cb4a07aaa3115bf7b01de5c0a46f00" + ] + }, + { + "address": "65uJtfRcuUQnQ77iXgusuMwUUE8X3YypDu", + "secret": "1e83fd70b9c3c83271856870fc194779562aada020bdd771e9db16a26fe0e699", + "public": "021733c35bab05988350a1a4012f1a960c9ec09df6581d0e205de3ef8b5589a006", + "signatures": [ + "2d41e8b8bb40a4f4e7a6f3d4e62ad54a1ee0606a968e317bc453a45632384fef6768fc26faafbdfda6893b6cd397d11f25bceab298bdffa0d15beeefebd4f51a01", + "9c7b0470d72e6adc12b1a1bc3cbce3a94a6a899f7a7cd29e4103f8ed25f1ea284dc034e5a4daaa44046869093bf65e5a918532b5f7ca9f3e5cfc5fb41db1341500", + "4376eeb10daf7003a33f1e09c8b308673b51395c607bb64dc2559dfbb669ecc84ab7ce243646b4f1078988051d1c2721a1ec834852313b2f0b1d0473d703914701", + "9e4c7b2251a21ecfa279428137229e0689e5d07fd045e5937996cf2ba36bc85e28a80a8dcc0d08d71a9aaf69e0681002dbdd0e7bf996220fb113e73e5a75d7cc01", + "3ce1f8df018a64a9d076f8418f92c4766aa48e4863b4dcf9e5259f844d8e93d35d04853654e953be812d13282a996efcf7bcbab951aa315e3f8bac3b4c0fad9f01", + "2f86dc5d8c351fe522dd28c48154f9012055cf84efe1e5ee852c35e0c1beca515df764310a3261656123cbb135cedb066f1e2d15c6d3da50809108b1dfee957100", + "630ec741f809aeeb3427b0c3ad6b87d579fec9fe1783f927a9186df5059d5c1803b9d0a91d1f4d7761b374cea2ed1c336de82f0abdbeafeb718894f0b2ac253400", + "211d06f41bdba332658455ecdb19e70f13533319e25e2d9e701201c4f6eb038a22a04478802a9fdc5da0ef96b4e97fca848d142c12d831269641aa013dd3da3000", + "e35d120fb5a7ee7d644bc0b4b22a81b3eef841ec1388d0d094c3aa85322f04325b208770d47a5d9dc251e7551d63801fb502d9d10d6d5e216ccf4f456408350000", + "7fdbea3efd7bc036fec0ca9eb26e0b7a257acf779ebcec1689b206f77dab863d0508e14c3cda0411f958975646b85ea99d67246eb0e000f96f7840a29c9878cf01" + ] + }, + { + "address": "DrbwF4PMmGLwV1n6b5r1yUcnRjESsB3xER", + "secret": "b2cac97f1fc63a1e1a16d1f322f4a33c173488ba3ebf5049931103728a822624", + "public": "02fefbbfe2f400b83ae244bb3bcd2e4073335d58c35659100f2b323d887982918a", + "signatures": [ + "d412750a5c4e7fe4564bee6f221389f0ada48c6ea612f77a9b1aeb586d8dc4a7129ff3e8aab7cfb9944e344d5e2129de4730a21e20d612a2e37f097549880b5a00", + "b2fa691f873903b0154d6347be1eddf989e67f390ab1e3f1e4c8cf1470acf4804a5d55356807561d5c6c3cd9ac7ef70d54f845d0afc42734a05310ee7bab55d801", + "e21e1102033378122861e21245e0ff0752aa94d7b097a26a16b92aebc7b7291670b5f9efa09b60bd72b21c1e386779400455708ffe36518299b25c1bc4695f9100", + "52351ba65627367f19b6ad38ebfc57b2d797770aaa45a5441e61857ba0aa07f5452412d20710e6ad4e15a9353244cd69fa01d09b17d1b2539774c0c2ee477f8901", + "129d602024659785f35229d08148eeb270192b5600a4f64ebd30bf1721f40ef70312cc10cb97cbcf2dc53da1e8b10723c43bec6b380344f635130ddcc89403f000", + "e7e63d42e064530b329837dd38955731fe3cb68c7f8cfbf7bb7452df2976842b299624c6b91be28fdc3c70fe80d844104d4f35b5c5a6f550471975de4519b66400", + "800fc84bc5cc7947c1860eb2d84e0a4a16995c75ed6023b34ba69b7b3ca0da10146fa36b391e95fd48af4e1281d129b73c66b7ae12141f1db72a177efea7835301", + "5bc5e990c347f77cd4a0db7debcdc92bb6c8d8f0287b2ac7e542ece2f5df3a2834490e90bb3ebb3021f444fc6638c6361a51f92b62616eb31730e53c74d17afe01", + "5b9537851a702c03851633a514750f4050f08430a287a885312c2b0db992879c5ac20bc4725ee26a83551f220314572fd8f23e5aaccfa0df80b8e9b38f357f1100", + "ef0c38e69e2a6f90da8bf5366984a20bcd1444e46d5a96448f7c7fc2026f13150822069375ad746c3502897ecb977b78df08e3c65cb4f2c26981f34a9e0dec7701" + ] + }, + { + "address": "8UtRig63MLaLcBWz1roupZjzgNFWZjFDPC", + "secret": "84401dfa69739cf31e040af784a9f2fc92d2c403b77244c0ee1fda554b26609d", + "public": "036affad9cd7bae39d491c37cffe118d5b3d23a82cb7d251bd9b0a26e02ecfad91", + "signatures": [ + "93b45998033de9db250380fce60a61e3ade7e75eaaa616752efa84756278a152260b96b3d32033a243c525e81b70c7b304ba6dda691be1f031e1db5b8e40de2501", + "2993e15ae39378a443662deb0a2389df953c1b819c760b05bc8c57e8b2a47df76af6d61d06a60d16da662ede2e0e608cdb3a12d8789a8c4fe6a21f1eae6e63f601", + "dc85027cf73b354bd47b8399a22057baf11c4c59a133a335f598c5a32e3d0b410060a0e37f14b4254def16fc8b93347ab0bfdb56325dc3f361be6a45239c5b8600", + "cff714d386410016878b11ea5a20c756e2b8eb5126cd92efd668c48d4b3d1543499aa234bccd23730bc745954cd901e645763d3f0e25472ecf5b86563b15448a00", + "3a783749b0b78225ba0e6391927e4bc8093c1c0f7d165e79241d97d77dc969aa302a4447bdcf85ec3d2807ec49148dac1bd3c34c46f50ce835c408210d449fb501", + "f1fd6960250d78d7773fc114cb8b08eadc5616fba800ecbfe6591ed4351e0da77668b8691157742ba1046c957de85db1c2337da9c852270906b5f1edf262275801", + "8559c8902387ede48f83e19e9b9fbdc6aa4b30feaa5911c02311e02e683de49230895dd2de9cbea7cbd2c87c62705e3ea669f436bd131d2e14c946040a53c47b01", + "3194e03f394b5f5f73ec5cdf98188be9cd702a4b23650d34dcbc6ba838c449c6346931eca359b9014dfeaf59e223e49977cd48b997b2b95ce612934919583ee500", + "b56a1b1db892f1b55157f4460baeb410acb9e3941375993cd9487245791c45667de87e6a27130deac8ad53930cc7f4f36f60c194a6f9738b9b76099bdd9d258f00", + "fec84af4b8fab37a828ff011beed6850e12160d08c4bb5bc41d175f40b034b25357589de2f8a2c4031be33f6cba385782143870947d2238f3071bbe6a780492a01" + ] + }, + { + "address": "2FEcDysCMv4HMzwXqUGYdpEqPPzJmAanfo9", + "secret": "e44eac00ad22c4e17a0749103e842c381db7bfdcf5589fee225d0171b044fa19", + "public": "029f93f0c3a354d1b89f6aaa93b80ce26cf674988a9cb8042b9291b47639b621e4", + "signatures": [ + "61d574bde2ad3a35a6d7ed33b47f5885ba88536f1dbe54bf4e61a4fad6eb383640da8d0e4b6f5552172cc7d0c9db11c4c7b4e8329223ebabf3349ea1dcf07a9101", + "4f2c6bd0058643ada8225fc910ae42edadd4ed77894880594fc6a14587d56d9b5b1689780ff5ffe0550e336ce8340915a4ed2e07d5317eeb8e8d4a195b31251100", + "6f4339f187cde041b7f4eed3171066abb1ac510afe00b334cdc6dbd460cff0be41ad89604f191db6666cf50a2cde47bb6b7555e6b200d4c1ec1ea22102adcd1201", + "1d1d56be698880ed0e3edb50071838b0cdf622cc9401c63b46497d121c7a35b44aaad0415496ac0ca4e7a6efc2c28aeae509cdecccb469335cf7dede8301b86401", + "8a33f78cb1e2767147a40bb33b2aa5ae367d4e07f9d954a11489901a49edf823431b7da2d23d48958416e310e9089e00b9f2695fcf0508993e8efab888703f0e01", + "02a2752aeeba167d66f8ec9443ad8575570d766bd226d4fcfa7f1037392c33e520750a77e8b62577d8e469fb05a3d33f8e9c18fb3a02f2ee69ca8043b063031c01", + "7ae9f070f1ac3292c3fed78d8676351fb330a8cccd016876576ad3d50bb861e41963bc58a736ec0f515e3879dd36ba86fa71632dfa1627b6a5f092d228e990f301", + "a9dc1cdb26c36c56346f0cdfce899db2dbea965e695846e09623cf09185e17b8495511b6e5972cc631f71f9735102585e744144ea36e990fefdc215da688c5df01", + "70ac0d8ba64116397c25d5515e9a9abd9a80eb028dfb44bee9b3ac97b2c00e9f0e8690ffa8d0ea8aa6bf6aca24b2fba06476c88170ef621f3002da946de2a83301", + "441200b55b63ae560addc5a020b56937fd25021b23e1d951ba7c57d90ff7672a371513739db52f4294bee054fa2ef8adeb4ed38bb4d0a2e83cacfbf9828bd8d500" + ] + }, + { + "address": "CZQfJSz4sSF5t3FVzu6kyvXYDugW3aSNVu", + "secret": "c7a2c3a4d66588696d0bbbdae561d44c5ebfae50965bac29a5c34be86f9f2ad0", + "public": "03e40a507b0a3a2e27734098d565f8bd1892db382c325838b4bae875453a0cf5e8", + "signatures": [ + "785c64e60448d4c3c6e1e56bd0a1743c70fdfccfa0866385db6c86cf64dec8ea76e655a5621cb0c8f2f1e3e20b8aae8fcf2efabcb0539831ec7962fe310ea92b00", + "c0a18cb45d85e65de31fac27e60c602452ccf320e93bd217e001bba8a96a2fec3c51f6e6983386310a4f3ba3e06ea8b4fb6c62ec7698d12a41bde9fe278dc8f601", + "de824e91917697141f4d1ab5174477488468ed853dbff47710805d1abecd3df9454f497eecfc98a32189e00b5ccc0019bb0a06b56f6df7c77afbb4fbb65f639e00", + "1a54dbc4c6fbc4905feb7d3cdce1143f0e5bb1836c12b6e4bbf9fbece2987f6a3fc6838fe5704fa6fe97e0be3cbf73fead915bb9a9b1fd555eb6dda4ba69082700", + "7ff1df7d20ae44dfa8d03232328d0c921dee85441065691715b6a5604c74af135ec9de99dd075360893432889b3a4cbcd65fca62bb4a4b7de9d72ac9bb90e19200", + "27bb1cf484ee097e6eb0e0d1c09611e162ffb41479d172c8fd040d89781c268732dfabfa77c1d8c21b8a2be1167c24054960273005432edfcbe82bf86c7752fa00", + "adb2af1376af5008e9e59d1d7fd09e283ff2fabb9a8e0f75fed093418576f103311064ad3228a23e34363142f5415333bf97bca296f20aa2efaf11c5696428fc01", + "37135bb0ec3ef75b4490c32cb476bf80d04a8c175480a755edf07bd87a0575dc213e25cec0cbf100114daa083875390dad119f181a4044b61c1575414d5f38cf00", + "b0af6e597e32d5a34c75d1c7bcf9dba46edf8980a0da02378a4fa80e13c5c8e6684ab741a8dcc60a4032aec17310451c21d167493e4f91157f9054142090882f00", + "df3b1d979e90dc35f5f89f98a29f041b261f1e18d9c9ab4cf323b797e7a077d45db26932095c28d3e7a2cac92ed38079c8d3f3f2bfc60173fbd2ae64d51dfc5300" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0003.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0003.golden new file mode 100755 index 0000000..ff562a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0003.golden @@ -0,0 +1,175 @@ +{ + "seed": "osqujzBPUMZxaJ3Do1Y7kNVJkcvcD0MeduHY9y0YTG0=", + "keys": [ + { + "address": "DC6BLZG8zpsiSa1gGefwdPzuxpUccKrbXe", + "secret": "325da6487b7076dcf1eec385918306aa041351226beb3781640eae8a432e1055", + "public": "020f3512b4c14d806f71faaa21dac57a07649f3b6871425f654e3fbc7f65be1497", + "signatures": [ + "809c24982147fa79488cfbd3940e73e2ecf2ee9e467f0e18e39fdbf18db776de60419e3535bff3cf67ba2791457afe74722744a872e3fe18d3bc37d3d8d397be00", + "b4296714ecc2176ec0322cb6a13f9bd75a34f09d5365ae5131468682d1f674412c61a0c67085ad839cb61b51e9c5a7eaddcec7de4743ade77825b2e746b4963500", + "508056bd0ffed1dfd2c6b0cc0c9c6ad26225db5c43f315a87bf8251355686ae212746fe8f679b7a9fa1686e6fd4e20dfa924ad9f0d186431bd0e5854ee58193c01", + "4bb6ffcbdf92372d6b34fd216197482fc25a39492641e74fadcb54f461998a4339480cc1d2a6f9d082b8603ed0bcbaa3981ca871f515e32ebb4ad6fce804556701", + "2b9d6fb8dc332b4c35961b916ca8a2ff62992fc841302ccd8dc199b3795e95d0750b6b359841fbb1f9deb5d28040d3a13e8deb759f8c3d5e95a7b51de70c1a7a00", + "6295a6d33266334ca84e5f27937ca2eb0ad7de6e28e89607a061c6be2d26714f3dffdac337c67840d78dfbdcdef5f175cdcc681d31bca40ef33c742da9cdbf2b01", + "fa2c67f056fefc0345e38cea031b98deb7b94c0e8b354e4e14aa8a28e7e2f88e717fbc72ac2c7336f000180be95bcf2f3c72704027e91fadb91a1cf3794d977401", + "4c2e02faaa872d69564c1ec25d6ff77893808cf4b025a8271f716497e16f9244079b7bd642877f8595c5cec0a009b5773b1627017c2ef31fefb558e3ca87d09900", + "116efeb0211296184f0c6b52b71f43b9dfb7dbca6a641b6a5daa4646b44655b3094dda11541899c235ead9ee5ed5ea9888ed68f9fdf51a77c973dc27243c055c00", + "91007e5048b024ba6ea799d14c5d907d7febcb896d8d6b37c528d59f43f0ff033ba752ad336bad95cdb162c6b2c991e06d4e2aa72769de959d536a15049c6af401" + ] + }, + { + "address": "2dJiYdLAPrgJtNxmYbmx6Yjf3J6o6tTQTd5", + "secret": "ca3448d20174e2bef91842c97cc89961ce108b634798e3add08349d2ebb3b7af", + "public": "0363cad05bc20e6061d1687f02cbe2c23e188f7272bd06a17f5e1035b434215d95", + "signatures": [ + "707b5c34007269e88ce9898b604a1c9c9ad31e5989f8ee6fc682a5bec4b98c3832f33d84d9efb2f3ade0b8813aa5f3305517762719278172645d842bb0a3175600", + "ccbfac78d5323f046a6585ba6b6fe674edbe1e565d33207b0f662a28176d0e1e7711309c9df63edd6e08f3a7c454d94cde4fe146cde5f4cd686a2103e788ee4700", + "60b58eb3b8020113be1ae1025f5a5d57ddb4cb27adf0471f653fc4bf5a937a805d523921ce98c3f2f3f39811ca47601b4c1a5bef7ef3ae47c87877dfe49a04bd00", + "1cdc3524c0e0a18011f5e8a627979309606c826272e1339444349c356cdbc2c05728c3aa674446b38f076641ea3c032a007a030e4069a570874545c4663667ee00", + "786aee30a6087a5687781b3ed888907d1c067148339552b90c022b21728472613aa715b75cb141839c02b3a3e7d72b58e6cf1a66733be1bdc7d9f209a0cbcf2b01", + "44e13e6d249dc2120e5920a93ff9d14b6d8b9f4f76bf3b160111e7247d816a0d673da37fed5407fb4adaf4974751d17212a88d646889f3c21d18dfcb8236847101", + "d0665523c04db55188b1285f0f6fc79693f9468446b0e2209f1573bf2f1781b16d06368f0f1d7483ec3038e64af75569cb474eff030838397e1bfa331394f26f01", + "d73c18368eaa83cc36ed1ba70424ed51b6889a1bd184e8e63b05b320f0231c876d70bfbd5e287e81ee947b1961c88790285c70b3167197f04a3cbd026b4a9af800", + "d99efa290ad64474bc2c650af2e4623d491aab54317d73a4cbadbf10f706d49447b508e2874fe41fb5d62d8676df9775d3fe533e26c3b59e8290d02473b29b5901", + "e4708608839de5df88e9d8091816566060ce16715e6488c0b376a31dd977777279a6f88316f3d2c0716d92048b8d10689b273d83dadf5d4b167799abac89b59e01" + ] + }, + { + "address": "tNP6Z6m64tN66qv8MNbpgs3hXphXY84rLm", + "secret": "52296f8c8b894ddf388ae2b000a023b6bd48817b9139e2495997a74775f5205c", + "public": "0229a7d3b520548fc3ce2d2008368d9b00ad9ff5ef045ac9ac7f3f8f3036434917", + "signatures": [ + "4bbfb348b79a401708a6a2a420e14fd003fb4a1a705b375ab679fc22a0a41f4272459c5d5f85282fc28566934d4577ae9b1a7089869331185a5f582dfd0e94b001", + "1c5c40dfd36fe3787fb6dd38be1dae85f6a6fd4b871916cd1b95c1034429472e4934998b8bc82bf166e14aa9367dfc18331db53224a1194ec97e506005cff1cc01", + "d90f16cea7f7098d6ff350a99a75747ae4d09052434c11d60d1f3bf44366d4fc310e19b33618ec4f3be097cf01c24fbc3cb5bc9289659e5b1cea5229490979a400", + "3ea89cb88d288bfe01f48409a9de0f869ab9de596ec9d01df313f5362d33b44845e96e60146b218a085a0d55526a6418eb02c37355167b0b632268becc33731c01", + "9e497a538a113c0872cd2427795e37dc0c6062065917cce07a6f406f2bcb1d203fd2fd6b2a411287cb253a6595da66c2c253e3d9035448bf1a867fc54afa719000", + "c19122058a54edb872e7c010a2fd7fd4f2c0612f5fe9dfdb69a23c257817643f4ff5774d3714b6efa9b5a585f5b89f1bd3febc43031d10526b78ba1c65a753f400", + "d2d796df07fa14f76b3ea84efef72d4412aaa67be7ced6b4c0ab2768968878614820fd94dab1b679a64548a4854f0beb7d6ce495d59b32e7226c4aa55b04be7800", + "7f9fa76140303717d61f6fa1beb1cb1d492599e8a4e9758a76c36f9bdb0f2e165a86cd84066d094b7b5a5b1f7e6669fed39ae381f03b54862662fdfae9317ba300", + "351feefd233570aa5390987f9dad774999ba97b2c1f39affa31a80b68030a4ea2afcbc0443ad0e90d6198fb22bc99a42afd1a264cd4866e2d7ac93a9bf03a79201", + "12683e4bd838a9ccbbea355a374eeed3eaa0339055cb90040c79570736175deb5568ea3b22bb642067a2db8245e83fa3e9ff14cfa17bfdcd7538d91784a8e75200" + ] + }, + { + "address": "28Jw9pmX3U7cckrah9kEkp72nPQ1rsRVEmN", + "secret": "324ea8f53efd2dbd840d97b8eb1a81f4446a33ca0694c9e91fe87e82f0930d43", + "public": "03dfd1e1219d411414b1dd12efca1a54e96ead409cb810020af7c92c8bc6a03d62", + "signatures": [ + "095e9e13403b7b398249ba6b07121adea43086c9dae49259955c77bd0c42c84a66f58bc0cb6fe7e471d6dfb085f3fa936a730725ba551874b90c12d1f09e463d00", + "1872730df7a78b2400ce26692298c979460552a7e1bda64c702fd10d8df1956131fdcb3c53621ccb2032585ac0e11a5d685e12e658c7f3f0d105ff9b4176c30e01", + "c048a79e93c15a2820821d0a9f5d64ed5c1560c4a791baa79320b865a636d48932ac1db2fa43a58fb9e422da818bb971aa9a25be0e13646251d28ae94c5e2ba600", + "c7e67e2222a5243970e88be22d5cb13620635e2e2e93e1d81f441a4c7298c14f29a897b38b59bad93aaaec08c5e408a374804b2418cb6044ebb3cc3029afb7e401", + "cfe3f39d79f18c868bc9cd227f8cb32ccaab48b4e6481b72f9f3e74f17b87b5e5af1033b0ee04f410ccc20fc96242a5e5292ef40f91e3caddc3ddf6e83d1912401", + "a06f1eae2fb6125574ddd35a586b2034630d672a38691b459206b8ff1ec0a6e8681ea699daf0af611faf1e17fbad60436fcd5ba7022a0401c1936b77ac6e081e01", + "9ca4ab63017ea7639c8c17195e090c7d1006289da7ea61adb27cb3d647a9f44e756791099fbd7a380b780f6818eef289e7576140620a418a0fce013de7240a2701", + "08d70e714be4493282719e96c6ff7ca063b003e595e3c1fb7925c8494b17d2aa6d17eba028e8419fc2fd76e7b1352074d711964e9b2c3818eeaa6b611f4895b301", + "af0477044a15ecc71fcbf118695030d582930842eb49c1675a969cf2575dc2eb0d14d742ee694fd6dae8ca424143a5f22e53e01cf077ca8cd95434f0ff926d7701", + "f0f6f7da0e96362162e433b3b3c445ea90f1d18b32d9cc1413248f0dc27e68c6703af07525f4dfab6e09ca83bb360d9962f8b67e271fa1bbb485b884aca6bef801" + ] + }, + { + "address": "NBhY9RijacMUvN18h11DmPVSQTfiqwVd2a", + "secret": "b07bcb05916fa130aad994a1d7de445acc2c28b2acfe97c1e6fbee7c95baaf5d", + "public": "029d8e3cce3767b3ecf6f615dfe46d8ef93538f2748d4f0a116eb4f55d6812d4cc", + "signatures": [ + "96d040001d138f7e8e8facf6add8ada3f2b3cbd73a9a7ce4184de7c6c8da694964df193acceb01fd53007f5947fbc035d8e85e84fb59d352ea746a068229326001", + "67bd4e12abb98df97009a415984c1c494f00946f0fe58ec8b93fb40a05bbbd571fe50029c7de9142a2466b60e835d78c33e0185aeca77af671be437a8abeef7b00", + "f4053547b9dedb47b479966fc4f31162f7d63c749beeebed4f9d0de0e59aef85145fe85cc249a776f35f0798d4c140f75babe24db0898e8e5aa0ad094a087d5900", + "91f63bb31c6ebc767194b073b81374d6748cebf10f46d8aacad986c450641939490f6a3380186f98540c5252882ab19d8093c25275d656577a67f2b4a51b573201", + "5fa1ac1fe4fc4e07923241de99b7a3d7471ae5d601277bbe3c21cda7c5ec9db44c89674432eb551580175e8001586203f4163b9686d82378c5b027f844c0da5601", + "c4fd4007a107d2b58389eb9bef87eec5e8e6721eab888a13a19b5059aba4a329162c64e9e7bcaefb043fb1fe677b2d6434fc99a9cfb1f60067c00d98b3cc5f2c00", + "4b2c0f225d0a94279ba2f99859a730aff20ee09eb161c9f74650f4061c8919ba364504dd91ba52e0339acedad7d65a5ef9734d5aada7aff1c3b707e28431772b01", + "f28b175b0ad668f075c998e6cd1325515dd6795e506b4e7f3b1b41167f8f7fc84ddf8eb85bbe32241347fb81c22a7ba46e052817b168102f43d630ed909231df01", + "ed07e4b55f64713de65af6e2d65fe9c88c782bd9f54b0cd30fc0c95f2b4d8e48244398e72b4aeb7bbe698f3032a5cdb39329e06952683dab69802861cf3f325200", + "c042e9d6c8a0919a297843013b0da4f16f62b0fb98ce047694f50f433ae9ae9a4dbce35a715a374d54034386efed191de09cbd4d1e180c5b292f06506298a74801" + ] + }, + { + "address": "2FyNgfqHoLncq9y2Ruz29KwueL7oK9aKryi", + "secret": "f46a54411adb3a34ed4a11e4bf01d3d87ffefcc2a2ce158f415078c20e5b01f1", + "public": "029db862d6ecaa866217c85468d7b0164208dd37087a90c5c8428524959e982d79", + "signatures": [ + "192f8833f7172283c5c9c0294baca36002429782595fdc924c987099bddc7c6065683b14dd858eaa55ef7f87441e6848130ddba06b9cda2a41e635ab072f378601", + "93e6c81c91dd59aabd9247892a73f3939f1bb0b8ad6229c08e1f308f72275a066910573dbf60ef1f3a72f31bb0848e66e14c55771f5862d9d90b230c6fc8d02d00", + "1ce3643c9c018800ff12ba0a121b98a0f858ec40c2e6a9b5fd37abe0fd6d9e7d54612e64474ed28831fc0175bc989aa9f1aaa436a635207cdfa085d6e18906b001", + "429bc18483a652f86ae32e20c917de9ef043abe922c6bdc95d76724d95aae40c7c9e273784f58255e5ea873de4826b81686789470895984c7d8aac2a13365d3500", + "f4dd8039559a894885d1cf76043a4c4bc69be4e439050d965c4e2889818f582021d0850d7e2691b941d63b79819d9d11ee443f953395a1b76a54c794125a95e901", + "6f5b2ad4c639745a02a5633dc6f336ad1f8d4e035573abb8b9d91960b2ebea7601f62bacc3eb8c89b1707dc0ca3da4d0f8faf5b34f18ff8c0c86578d5340674c00", + "e9e052fec6c7086b57d7dc12ceec2f637eba01863336e6bc5a6d6405c8721ddc13f41a526937e82725037feef805603ce6a4c97421a28e5804c74ca66434404001", + "10c5f518ffd52e5b0759565706b618401d958e994a8cc48773b4081abe5f1c693c3d33378c08e29703018226148079fcb929c47389cca503155ffb7663c3fbfc00", + "3d943c9d9290f0c01410175ebfe7d33926c309b5a6724742632e962e2492181809596d7f5b712f64e82dcfef0e5f2dfe76d85911146e9920e5ac5392da1589de01", + "67bf7d8eaf1636985fb661774a0c4b5377184b5a5ac1f6f8c6ee4edda83ddbd22f161d315e924331ff5ae0919f83b1ce1b49cff295defe5617264e21aa75f18801" + ] + }, + { + "address": "24sXyRBQRq1kYZhwhfHhLU98DZGcTeHwQNz", + "secret": "af178cc4704bdd222cc94016d529c5420710de96ec8926bb0a395855875163b2", + "public": "0306b389235982bd983d081f6584bb45123bb45e8055a844562b37ce7971c539f9", + "signatures": [ + "a6d3d5d20fdd1620c4a60e665272657e24fbaee36f61121cf9807f2207823bc51900b811ffb4ab32a2a03081ff4faeaa2d16d73fa82dd1814c683d53add34d8101", + "a176b6bd3ca6d38d8b38492178d78950575ae7ba22a6e4c43c30010d0b88e37f7a59d1da6430c92ce9f45276ba75cf48a4ff25f4dc73be8428ceae7943c7a79101", + "ad4287bb732b1d2dd038d3a3efff7c14a617d1fcd14d5431a5dc3264f082ed0a4aceb53231c0025fff20ace3215755d83a4380e61d1762f5b2a7139678830be500", + "394c94399fea17bdc9d5ba2ce5895c671ab755d10a7b10cf9e414b779762b5a309960d0a5c6a63490959ac2aea2b78e3a46ff404d001bfb89217daaf6aac135801", + "2656802a9978b3ebf7bce6153e7ac3ceb227121a2a030d0a18c7555c30d332e80f75e0b528ba372f44e457989a5879016b84c06b2d9ba305adad899817ef2cf201", + "e9a7e15fc35ed1b76dd33a5bd54893e8655acea9313cc3c2c4e5561b07d97d9e67e953ebfa256470c8c680bb80ba373ac03d3cec9c8a11a036665df7db9001ef01", + "0fe18385d5e354c2d53398351d94f0c4716a27e8b2ed564643939a2ffe8f0bae79a0b60e15ed1d26a57277f25440aa1ffe87da1311e735f22c76bfe183f777c001", + "96ef9eb7cb0d210642b35dc139d86ec9bb1244045faed3b3e81fe03874aabdd316fe4c261d075373282a678c57b996f9c38f9aea0fafc7f95202fd057325492101", + "7b9fa00ed2687eece3dc9ebfd517c76e49cc435048320699b7983aab895c196a25eaa9c3b423aa5a56ebd27bc197ee40ca0705ed0bc082b5bf826d9f1faacd4f01", + "163d0482069bcec72d0cd9aacb4601902e41ff7c5268f8a80e3f3f1bea5390d2592d8c24c2784b645f5c1776835614a85679da210b9e2d67fcd72462acf73d9101" + ] + }, + { + "address": "2eEijADfBZAFk5WpNhQg24DnqPPWaUwd8G7", + "secret": "a3d764738e2dc9eff6c1d423362b537d2e2d8346483d6a5a034293fd9d057aea", + "public": "02e7f5c694d4f4b4ecb146a634fbd3fe450b017a0b8306f4f351dce5773e81ba8b", + "signatures": [ + "4611b93df2c55426447f5bc13cb2dc60d738bc62b90e823e25cd0607154fe0b6194df3869d33c25db8c9ad94b89443440e01d617b26d628fe090a70db05588eb00", + "a7102de3b33131aaf1462c9b37c31da6c5e8fd8bf8f6ea5821eb3aec8672a93b42bc359635a36bddd0a0fff3ab605776cf63544adfe5044dfc302d6665f7d98c01", + "2a78f73c5fe82809661e4ab087fcff0275aeb6dbb6e5200359352d708705f6855828916a6442ee15e3689113ff3a00b0cd9617fdffb429d96885a5b881b1f6d700", + "b0d5621cd30790b21e32d079eaf465bb13356aa1972d91017ce5e53aa8d1acaa06bfb3850f59edcd71b5b7a5df72d87af038f1ae4a5bf19b6628a8fb046c360a01", + "ed1fc78e0f115aa052a9d3146b057516c140365176da613af737d1641d7c70f71324a533c06189f3bbfdb1420febb09917dec38ba2bbbe5cc4bccb89eb8f82fc00", + "db6cf55a88608ae3d438cb994c490c0c99a036c4254414f0c04be67475c179c95f5d6be14f009dbe391dc6c5c078c673e2b627b9018f425490d07e87352159f401", + "b43fc4b582eb91acc18cb03caa1b8460e85364115268cb4d70236b87fa58140b0644123f8df014d3c7195b3ce081294a9a7bb2946050ae24cbb98dd643e7e30100", + "5a14a381c75753e4f1403fecbdcff1ce0a0207ceceac88a6264b68eaa164a4263e419903c61b455b5894a3e83fdabf4137fe27ef57501b252a5a40b1733c2d8e00", + "1bc9144b3cc9c33032864d23c42d58da1cda12e782fcc20ff66487b6b4eac7655f4ba61d26aa2632c9033e9b5231da547d3737ebebe86c36d7219562e04792a901", + "44fa785abbbfd89a8dcf6bca7785e1fcd52188baf3368da756b7a8fba7d6360f54a974a54db38877cf84ff45ed136c0cb36573c3a26f952eba03a77de1a49b8700" + ] + }, + { + "address": "1CRfbjpqCGsrFuU1iRWQcCEfiS9vSDGDnb", + "secret": "7c4fd501bb1a2f4dbf7dbf0bb9d0134fd90935d7ae5689d2005a030ee64ff0a6", + "public": "033f24693c5e97edcab4c2fa1a3cba46354af26865b055c6b7f699cd61b0731d69", + "signatures": [ + "9f01d4332f3e069d930d98ca5f7c8f23374924c317503b2859537fe014ab351c07c36c8a6ecf6a4c8bfc571558399cf3c31b4dbaff4b1d5ab37dfb0c0b0e384601", + "7e18b44021d19c3d4d36a2fccd3139c6bcf8f7e3bf2ecd0270d3e01eff0b94ca6366ba2e8fa086a6f2ee3d5d9197a47114333942b754ea9cef3e210e528af0c500", + "8912e1fa6852554783c4d77be8e45e7a14c0a4c8b0473201813430b1ea832a700031ca373e48ae06a78cb3d95f2cc24b93c0a2eb4c02db2511e3c2db7fffe4f401", + "1591e3f7dd9b74483bd6c65846b9e59f94aa2f6dd02213c715f720e098e19f517aecaed7eba340374cd69bd39c7c9d0accd78bb9c3b6caed9704e7751a27710e00", + "9ab1221cdb071b3baa1943e1e2065f581d2a81c1d33d42f00b106c0e52c03ba5326e99bad3e1a4fe76a5fec41a29a82a366d2df1ed7b5688e1c9c591a8c937af00", + "699e98e30bd3e769bac617bb874a84137e279a420e09acb1bdc85f69d1d8132509f958813b914327aefbde00232d2fd860bf37f0aa085c2c672a3b47cabe0d9a01", + "e731c954198de65dbb56cc586274804ca0148a1a9f0ab562be25c7ca5ccb5556101dcd76b3137da7a8847bf63465fe174e537a80e7f507dcbcbe29e8f99fd61401", + "2d8790ab17a76d20e1b6d213505d08fb95b0e949eae75c4aacf7e575680179620be72cb7781037aa4e5e9656eb8b6f86eb81644dd102bd4b8259668e7eed38b401", + "ddf5b3672691bb851ada7425a749bc95fda1fc6f5cd2a14e11881cb06033543619ae8665086e22c308040b5488a2c7885e4f73e506b69c7138ff7a67f474c11300", + "a835ca7b0a5b355dd58983932cf1d4d15035a86e49df81128ecaf9fb783317115f69aa5d6d75302a0c128e3c531577f77ad0d5b6d215d25b890e941938d3bab200" + ] + }, + { + "address": "2bDMZ8tKNd9jjpaxor2mNN7eyD3tvGQvGrh", + "secret": "5b5ca59c4abe3a782c370365bb9b85cb64ef66ed194fa2a0fb6b66616735d9e1", + "public": "0372ffabf5e1fe4289af91fdcded36bd3841e20926f9ea1e1048c1125c2aefb7bd", + "signatures": [ + "9760ad87d8566f068df40cb8b7510cc58fd5d8417c3c24e4a640f29e4af047c13fbfa476656295689a0a4543c0235af56a2b73cc310f9433f8392e8ecd36645301", + "5136f29e66edd0961f8a21511d04230ab71639aede10447cd21783ca79af10514420c3571d364112b3236e8e2c4613a1b35d365d522d7e57578d06bad5d6dd5701", + "206af9e7a04b8ff4f34fd353ff67c74723abcf6947c897901ada314ae14d5be60939fbcdfb0a19abd7dee745d4ef41d536dba5af63ff4ed51a9527f75d7653a000", + "39a21464e465370c3303fe9615535efd132b2a9625a5b687bd48dee0529cbd7926e45514566d8800bb0d730adca3a81a70d6092be7e0cce3c990585a37954a5701", + "177e0155ab098387673b2b95627f10437aa81aca8dae9d485f0a81d3a1954bee644ee54b2fbacb76ea2e3990d5ccbad69b6048adaad9f365627c3d4d62ff44a600", + "0e1e137d69c9b30ca391eeaafcc3e6c43b4d8261fa591ef9710e666797c214b54cedbfc2057a5c4c7f30ae3328b8286ee33bc38e301003b7d96a696628948f0401", + "0f6350ba71a39d629a37b79e4deeaa785dd634d833667379b5f56425632be10a7be104ebdfcc3304e6d2e7b672066305ee894187a86b1d04be617cea14d3b86b00", + "89d2aeccb2685af100c6df043f2ac618abffc9c25aac53e459231a9f86452a89005a26d25559688e543c24c23871e2c374a62237bf2d3c308c4b4e334970038200", + "e22ff4a474f973a28d084a842a3aabac7eea8c6d7f098b8dce13a327f9b4957b625ee95f947c86c072490a2606908dd6068df998106ea2a1bfefbdae1ee59f4c00", + "98902bc39b4e4d58dbb9906384dad91b0b2ba15f9b59f47b6d1985e1e48da08f213a4e785d5a1c18da576f5d9d2a37b4a6b21c330a26d4cad23bd75f1419e2cf01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0004.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0004.golden new file mode 100755 index 0000000..646b5b5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0004.golden @@ -0,0 +1,175 @@ +{ + "seed": "Y292ZXIgZmF0YWwgd2F2ZSBjb21pYyBzd2VhciBldmlsIHJlZ3JldCB2aWNpb3VzIGJyaXNrIHNjcmVlbiBjbGF5IGJlZm9yZQ==", + "keys": [ + { + "address": "2gSg5K2Aq7V52tPkQFMCfgHNhkae2KsTE7x", + "secret": "6f1d4cae19bb875ef2588591612a73972d824ff40bbc8ed709831e71764e7897", + "public": "02e28e6d645e070e698c35fbceb8a81ab5e5d4912c8957d3e065e8966d19ad8960", + "signatures": [ + "ad1d4a3a61606df19d2d56083c4754f158a3cd76e60fbf6f12ec5293fe45fd0f7053bbc931322c3b6c289ed8b69eddc4517afcc9574eb6abf85dda7aca90eb0401", + "ca7cea4a7b3b705aec86d1cd5730ccbbc3521c9b4e5916db5df089307c14d89b655ee0d17da0729f7220b6ba79f39fad2fcf4370b1c1ebb1ab8d787868090ef301", + "f485b3a381b0f88629afddaaf895ca7dbe0f173db225c5f1bfd05b80bef18e5e330b2dfa46b460eaa11a0434010a76c8c710e44e489fa879091112f9f7ce51e501", + "c3f369e6685732b3f07deb7a271f786f90b3fa8cd69f217443c9e5d05aa2e9286225f6435ae60a3b7a5206bf35166a7960bbb640a5becad2d881f3a953b6887901", + "800b70203dea088ac2fd6e6e5c8a26b831a245998d540292cb2a69bec83f15ad172b805b8670a485ada4069816efea4c50fb1603913e00331562894c7df87ad001", + "bd558108807f9fdebe5cd192230d0acb651b992fdeb54f4e9b2e5fa0a13e069f366b8442478a62032847a832cc5462aff4b7458f18eb104ed8aba8501e4470a801", + "a5604f914b5169099a990f95dcd38d9f78d145b99f5c4160118c0b6f8f8948d47f0cf1a41887efcc6f821cb72eff0b66f5b7befd824ef9ed8f3a07ca671a1b6501", + "31455eed1035e50088ec9ab7097ee54a8e9f6dd5f233f1b95f2c6cdaced59dac23118ee87da70ec88056e48ad033ba81fa8c14ea891a6bc4b65ea2e08182f2ac01", + "5cbcbdfbc91b05bba7cf8a24ab13d5872dd0b148ec6141a4eae664b03b08e6795d89bf71203a6cc2021fb3a16429992c3de07d3a8d3f4504a0c2ff48e8dac5c901", + "0a42a468246b2807cb1b1a83edb251e1a81838fefb0c2414d569b593eae8d3932bedc14a5daebe0edd1910cf64e18d0ce70dffb536eefe8b7b9c27f2a630cad101" + ] + }, + { + "address": "DwLc3z1ff7uKUgcyAR3gQhfzJUHGMXktyj", + "secret": "8592f9f419cb7b0fd4216e314b17cb3b58ec944979f8f6a34e21fda09e01fb2c", + "public": "02c0b5b53873ec9cba0790588c64244579b0b23eda646d6ddea6153cb97538b3bf", + "signatures": [ + "f174e61cabae3b37f1cfe3d1abbd606621765d02ed6bfa7124dae185aef762a51f6af575745d33d4b2d1664a0d95dfc82e9010bec8830e13aec03cacd6ab158801", + "28cc5c115b8bc99e6bc9d6281877417a2d5b45806205f4c430210157794920490d11d4d0de202357df8e8603dc3c74426b98d3c30fd7963198a0ac15a6e6954e00", + "c28d5d073b95ace0e2e0fef8c34bf5288633f5d60c33d2fc5fcf427c1d70a8a9045ba9db1510b68de5cd9ba2c8709a6cbd0e8c5b57cde5a601d1737f854a4e3f00", + "2c67e279048522919862955b1afe7c32f432deda62d90219505cbfe7473a976e1968d180f7d43b2b018e7f4f265d489358afc66ce0efc1836348f065fb03197c01", + "f8ede7998f1110729adce0af5f3926a3bd8927c178e98c45ba1529943913ea337d4b6661c54914d323be43a9d7596fe7ecba2a8717981ad2d9db835b898e08f701", + "8b8b94e9962b5332f1289a299b3b99529edfd4fe17ded5c0b38d6a23364cd41759f40ee4454dc9889d207a920fd09bedeaad78885a0af853cce2d1c15472412e00", + "697b517897a92769b59d9cfc86e2ce8650a51a318bee6808a10ae9e752e8fc6a587073b92da7431ac39fb8d7e77c98de1b19ae90451df69a03dcda911587c06100", + "e79c81ec05b0bde926a1ad3310ffc62423016213895bfcbac1e120cad6db1ba872dce323156b76bfe316467c26475a3ff1468e2e285cbf0c23e2ea542c3447e901", + "4f90c8736b8081e2d354c22f5e2f7e15f5fbd230305257a3f63fa89276c21c9206716122be313ca3c8560fe86c26c09b9d6e9ecaf8c7d4bffaebe20edef7444600", + "0c3e651b2b03dcbb6cdddce3612f4d0f414e11f949d046d9befb8b34b0baafb57fd3d8968f27c994a08be0fdd6be016bd55c73b4a9fea07ed44801e3dab6086e01" + ] + }, + { + "address": "25F9ZVk6tvues2LcxpRUCCjh7yubBBUXf1o", + "secret": "618adb045d65f9c1f99bd8e8ff6098aa1c2abea4c8424a9ba50d2a46c7a4340b", + "public": "03eca0e99aec7896b84c683db6eb93fff2df7cf03389720ffd214eddf15f901390", + "signatures": [ + "c19580a393f382b914baae4fb0861c4bd667914729dfc2a2ba04359c247669e55da6940023902e17d1006bfb14b71e2cd6abf4388ba0f18964f51d8b4ac272ed01", + "97920bcbb32e3b0e853a2a7369d0c777826fca18037ec9711e74fc04e31de4af309a5cc22311e13d68197ec991abb351f3cdf8e0d8c112d0774d1ed0585f93ee01", + "febf199c3d88e46fd9aad05f1c612d95dc2b14a0e81113b844fca9152964fd8407866c9348572f70f8b1a8f6d313ced36314f04a616383cc3cff9f6faabffbb401", + "e5da5885db7f22a5aecc0bb7b8573703b450ad8fd454e65f658ce3e99280495a6201bcbc756ae9f7bcaaa387819f6e7bb921ba33d142077344bac8bca489cded00", + "52086e02e21e9ca4349ef74aadba227f30062a46b150fa6ba478a238084617dd48bf5cae7823683b1dd7ed0c1190ef301a5a9235fe0636fdc32cfd4a4effe0df01", + "3ff9158189c485c5dac9ca9b588291e8c7e02e148be3ac5dc15c8d1e744483b315c6c6d078d025e9537ef2a03ec813cfaded0de7afa37f329e94b6688f566c1a01", + "369c2bf1bce93ff4324683029bc35655f45c2214f7137a2ca67da406b982a9bd53f5e3a728abe88decc966ea4d7516523986b504ddc9f6e4038a80848a81ef9301", + "e673fc1269619a2bb56d3a5ab9d5d25412e8015074585abc94ec66bd5179d8c0272b48914b95f37e8ae92a25fabe6714e79ee90ef32d0d6a02fb55b72191ae5000", + "1defb8dc62e55cf8666b6f02ba3814095c686211a5194b214ef01a655f3ad03f71fcabac8760e2be64448207dd7a94e3c6502d272aabdb1bb2fece29ec4e82da01", + "96b40f52ac8edb532955af2b023078bb10a8583e06f50cb769aa79f27b6b1d6c487c1abfa02cade78f960698439569fc8fd75f88933c745ada0bc2c6efd7611201" + ] + }, + { + "address": "DJGUeQoBFUFmCeVSGkVY6DTcDzwAn3f6KX", + "secret": "4fe0e662f034a0b4937c6d8ab1c9f49e6f612e8fcfd57d332705d69b05a2bee4", + "public": "0340c46145683e5aeb80354625ac586fa8142eea1894cb2b858a162673914701e1", + "signatures": [ + "d7a1198628f61f4925a314cd3468093d3231c99defa06f40bffe364693b5a06905d47a8a380666279e7a701d952ac3d148d99cfef84b60c39239cd2669ee641401", + "cb68e677160ff64bb60f5ebaf34317dfa0a88977819f807e5fca01320a493b192841804684874177c82a269eb867d118ad9e7e785d577b217b86a694a322c94e01", + "d901fe90a9b825ccdc5a0c7f154d839961658e6b0277310ebce6e27ff94ff05459b3356686cdd942060efe49413445e86ed1be410f5bbf88f0b4e5df35f9098e00", + "2c9d4bfc9ef82226b0b71cc4d725bc0b35ae15a8635e4c5900230b942ca0303e3a4ab3d5d57a02af7acd4bea6eb9d25fb52c3d0d43da43a854a309231ea9040f00", + "d01f41a7555d7d232e34dfcbfa6dffb0e0df120aecd9f6cace922c87ccc08063437073c07000b8b799ee52bb0cc438750502455141b5033a974eb3c4c7ead62000", + "908c2b370bd5a5bf23ee6e45211dd823bbc381e3d5b67b1a0844c7148b556c6e077ff844f4a17253993992be91ef1bd2f546f2847b9a5490fac0898e7536673b00", + "3fb2652982f07cb81c9b4df36b5719f29f42b2cd63f37227727a66652a757181620b676fe314394a9161e6a9193f6fea9244107d160bc02850484ebc0a2b1bc600", + "f1c38343dbcf9f4da4860554eeefa267cb18a35aeae5c0be0d6f4e81630b507860098120ce12924e7e237f4b72d0a3eb3669e687aea9b162db21417945ee679700", + "39332bf80f31e75d34ef1300cee7dbd87b5605d0714907e08d0cc552f86baf6e6346b68501bca34feb81f776af53053eaf36c91343d15e6e76d25f79c47fd6e801", + "c183c3f38336efe21ce302b914dcb06ef151f70bac7220c318b1cd68cc5d90f90a171263f5f67ca870fcb680e0307f1d872948d7d3458010864f0a3f284136b901" + ] + }, + { + "address": "Vh9Zt9oPMjsJxNVphCjiGUxHSixS48J3dF", + "secret": "c2fde07e45562dc50c18c1e7552e03ef28639c44b2bf3a4d363314203e3d5f4f", + "public": "02d40df519e11c34b78b2124820d5dc04c6f59f465d6263b68347a9f74a98048e7", + "signatures": [ + "a2d420be32276ba19ada464ae8b29eab9b07b20be80ed9a2998d7ed9cb872b767d4ddbaa6babeebac811a6dce35915d9279cc6d3c0a813fbc82a54dada6dfed401", + "4459aa264b6e3d724abc8043de82bb8eb3f2dbbca1367d4b36327738a37c2f842d92698747c24602274588a91c8b191d17f0b82fe10b48ef01a9defb14fb07bf01", + "7c890ef0145c41edbb3d56f37919efdc817b3d5e82976fe2ca0f98460315253325c47f553e91ab6a6c0531fefe7061d9c79f1f3983e46c7cc5d21fe7d4068b7701", + "20ed571ec5dbf4a322c3b447cc8d2b454150ddedf84ba086e5735451698f99101f86f82802643c9e49673f83a988d7b8193a011ce0a3c52e84c6fccb1172f8c700", + "64325c6f0ab86cadcb791a37de986659a83df1faeacd4112216b8ef2f7f0c1337c12e6af249244ed03a460c3b12636593cba964cce2beb052308d20777343b0501", + "1ed1e4d8ea4b5d925b7bc270d5013d11c5b99992c6f22fba3699c1b7fb08b79835f7ca88c52416b191cbba7cc275d7f5d9d6d693990d85c41e4a305469d0aa1400", + "02b1d63de47256007c751b9b7854ec997bf7c543af9f3536d831f2758643885b3e22d15755247365b21a5200aaada52e603b53187ad8ee5c73306ea8cd0a7cca00", + "3b7680d15858017a6795d2c3a3e292fbacf2604c5f7db30ef2270d9b6093648411dd4f1c1868a9cf2cbd51cba1a8c68f35f3492abfa9af493db4260e04438bf201", + "c1b24bcc8d83c07ab3bee8fd90cab612421c1e2eff21f03a26f49c933d94e4734b79ae74268d591b6b58d68b214b3458412f0585e9d2f9a7ae1b17ed36b0102d00", + "c0ba9d290f95ed0068e90cf68c4b98ee935d463820fa35cd152ca085b548dc6b08035498a6f23cc28da907ff320260b9aee8bc589c481629070673d4cb1cbb0501" + ] + }, + { + "address": "Z8JM2GA3ABPuKYwufFGkhvQrD2y52NFT2s", + "secret": "bdccd360c259b643e5f48a52043602ae46cf5f71a4604142794b687d21d1b8eb", + "public": "03fc611f00d187b85fb2d056a6a7e03a078939b1e9ff472c3f7b9575f5b459145d", + "signatures": [ + "7f023a6462b1eac2ad7226dbe884ffcb79cc640247f720a653cf62e4bca47d8519b98c45a7f5bb348f15f75cd33f5bdad5041dae85e9ba3ff073432a77f36bab00", + "1f9b6736fdaf0bc3934c687a0915acb1488f1ba30fee969c73f7f2dd16d011f65bb030cfb3738ac7dbed8b36585151f5adf2138075fcbe61ec7c3a2e0e5a6f2101", + "7fc3dab6e22ad333206069656f10ecc9600916f1cd0b49c5cc874c42102907f33bd20b18d4bf5bfdad1456eb7c8c7cfca1a676d525314f37f92977156af808fd00", + "a7697698ee9ab3368b5c6e75dca0fddf3f2ecf0378bd73481fd49e1d4f73a8b73988ea189cd301cf35b2bf4c9c8445f0a88bc2ed1d17f2e79f46336d6172442e00", + "0f6e0373d049e5cef26325258bdbc6d052826e18e26d8a7d4e7231d4c2f7f8af7f783fc5994c609e4acee8bc6777fcc62d40ee4595a2962b061475130b1e584f01", + "5727d799b297cf70b70c7267424f842cc78ff7853c7b56f0e47af60fe73a305f7713d11b418a1c4f214cfc2d87aeb5f90654e957a1752358a8bf160de86893af01", + "6abb7a9d88d099d1160ebb9f0f76e54874447214bea3d8bbcedae00c4eee34df5da3e84fb6cb35faa42688e7075351ef22b9b8543664dec354725de47c1f83b300", + "ee5966c6140b76fd30c4241c55ebb4e6e59be0546b41a7a2618a845b56edde5d63a0644551cca495bc6d1b4c8f8ba7067c3849391bba13a4a38a1c040f5ba44500", + "0692808145227bab7af3087c5e45f0fd2a468db2970c5fe37f0dfd2eab8dfc5752f18a2475a008f439c94d178a4b335304d4369096dc7e33735f73dcfa46e0a101", + "d6aabbf59d8b2ba240e9c415f95955892c7ea91e78e5c097ae126934a3ba6d592575f48b9ad58a1e65ebdd9d0464d5bfcbd4af4b849dca17d1dc2b17013623bc01" + ] + }, + { + "address": "22GWk6z8PQVKDoRNR9Mt3YusZBqf18RBdb2", + "secret": "02a29f33493d777d410677a8ffb9049ebd37c08e994e48ab7664b66f02fa034d", + "public": "03c2d659597aa5b59c6f64f7b75321d824432b5a41724a74a91a667d3a183e9d2c", + "signatures": [ + "94ba8c0c74b89e5bf2ea16b610de49b6cb82dab492228f7e2a08317fd32ffc994c0c440715c24bfa144d5e8f73d6bba3f66dedddd6524946eabad7733df86f0a00", + "ac497705c165952cedb8d8060cabc5753fa0de358af047a9569c0b989931ad25357887605eac25ecfd15fbd0c64eac6ddd65af25de11dd16ef24863f20886fa801", + "7a3c728bc7aeaf467d9285eb8b5200f9a9fdf97e9cc7c5fbf4fccc8a12c2d76b7a652321bba91e9f8a30569b56b5357a7b19a6b1870399dd9ac24ba5a199986d00", + "68bdd162a269d6536d8f03cfc395f5c3fbef268a18d6d85c535af73aac08d87d77c913500ef9fb9b5d6222d084111953b8f04f14ea7a73e1aabe36ef884ce32100", + "dfa9cb7e3a83c637e8759701edab94800808e4ae0611c6dd1a753b01431a84081ec0fe95dd4b0ad18884fc307d81292806ffcf837ccfec38ecc99f32659564b501", + "2ce3a840fa0cc355e9f0ba33571580c177753bffad543ceb20785319832eb6c71414d06f9c15e06311b201f8cb595f5abe5deb471a9efc8472ec1ffbd6765b3200", + "5b87c2450e587f2ba62fedb4fe46dd8b487ff19b24632c3dedc1999035457a37088c380db077ab84fd31cb414f80c99b05444dec8e0295f337a13f079747e8c300", + "712c0e4c8b261bb86d46b458c51fa33de865414dc008229d9fe523bc97a6eaba22b0b5e70be850b833a78db5e2cd4a3c64ec8380a7566d72bcb9a986234c84e001", + "e4671df444064977c74fccc8692f11eda6a7460765e437edda902d3c5aae2dd1353c88d783dc0200d769bd420d989155cbafffda4762795343055cd3d21ac7ec00", + "8c4077f1f6e7fdf022e0ab07b55b3f6c876e73879d1af32ce281f77cc936d4ad5a86667cb593d0c142efc707eb4f8e6c6770c8c72c2d89aa1fce466875afb7dd01" + ] + }, + { + "address": "Gy7bWVonUXNhGeuba6vuf9VCMxSDopVwXC", + "secret": "127e2ae002a0089db7c77259210be6b39559f2de9e0dbf1a16e362c73e8e539e", + "public": "02b2bd36f4f2cec30c5679311a2a918b61593c46b6cf522908daafdc337bf6c73f", + "signatures": [ + "3c7e5cd75e42e58d4ffa2ca1a6f7d27df4c29454162329ee4395137fd911f90e2b3c855f37b20fdb915057be390de611ab7b9f8a306585a98bf37c9e9f9c74d601", + "5924e1c81b54945b3f1654ee12010984c18f39cdfe438339e672bb24b3ea245f55d46a79bf6359b41f08bd5317e7f52029ebf6a11001c184a2719f6e6312f94600", + "2dea341a911245608f6b92037f2ff9389ea009dca319db7ced270d766631d30043b8a627b5237d89c12c75085c84e0ea96e1a1cbb7ec44eb9b45646763cbba2b01", + "6270ba0e3dbd54f697f440cb4ec22c6551332ec07bd8040f6367df6717470fdc3957791332a244d270046d164124c80472ebaa7978d339df19dfbdab5c109d1f01", + "25ccbc38150545974f3b9cc52ef96130246fa9a3f64e6069a762989f5f8e9d8f015bad4faf0100a6eb0078770cf32c2bd997dea56facb314c47b3cdd37cc3d4501", + "6cdb3de2d53293aca9bfd74c6621c82af5f6e7102ecc4d658189d28021371791728c859162fa51f8b1823ceb19aa3037090bf18ce50fa5cbc56e5abd728eed4500", + "8253acc32c056cc0f10941e21ff25b17b4e2ff4ada8716315852e6ce459ee3b82f45747d867ccf0188a6b3799990e72298c31670f8bde9fd788c986e1779899500", + "7ea062c2bba7b93d31073f90df27a26543b67f357992fdcfa8e3a7db368cb0f141629c1498f010f2af86f1805556ccd4758fb8fbcc28a043e8b2025066d6f8b101", + "2e1270c4031965205ba2b8a4b85bc1945c0eed13b758e02fd627f96d89758b9f2f9819f90dc9f19fbb7f27c8b91adebba02055f72cd7ee3a07481587481c975001", + "8806abc33816a9fc503bc6f560f399b4073e8c27a42ad3e78ccaa643943164f41f8f0d016f9f32b25fcd98259b8e6d9244cdace4e0a813ec78d7ca6d9a89de9401" + ] + }, + { + "address": "C8jt5AnTY8rbxTpbY8JwWkPXYfoAQ4fikt", + "secret": "6612959069c41c6ed02d7e1a2a868a241fabb65bf8361c0082c797a87eafe119", + "public": "03e0f8e7fb3d410563352dbc65fdc0a42dd4f6c3702440c63f249d76b96585bafb", + "signatures": [ + "03fbaf561b2dc8eb519fdf55b887286d29ec6685ab043adcaefd84a5525a4e406d62f5209001e0dd07a5865603d36f29575322b21575d26e5644bf19bdaf46bb00", + "a5af3b7b26b4a0ef7099775a9ab9155b9619595146e584e794f08ccef4f870ac74b1cca792622fc0932025cc88f44a2b436e1035a377aa2fe31c51ee76fdcc4901", + "28bd55dc280a0d32cfc09325ba0c10cf83b45148d3b8e5b6e71f518c731426ee670a71850ce30bffd3faff287a75f338000b5faf4d3ce8e3625dbce87b09774d00", + "61b4dfe751c918060ea390cfe695b5284fddb0e260ed4a8fbd3bd50d2de7dc49260094650012c89f5f0a93fd5a29a0aa0a23a34dbdc46b0837801e6a2b8f744600", + "6ff07926f05fb316a1eed1bc6157681063c8545aab1b05b37f6d328564659cf0621bdb4935fc4d5dacd751132a1513b2ee23acc7eb7cc395e8a27a83b26f7eaa01", + "45ba72c2a125e68610f5f453709f4cd08e3be050f053bdc9d1788e65b2da7b085d36fee291feff41430a429a87a4b9cd8d43ea005e3b9f4b099a0c2c997983e401", + "4ab3341c870bc25dc9441a6e920b11ebb47cfda4f4645e51cdcea6fa99aeb68c06b5a0e4b3b41da3ecdcc5fb162609cf1f71d49c0461cbce484fd11c0a8557b700", + "aa253e2de851ccf7d3a41096ce5c0029cb4ac90f4ebee3eeb4395a54ac50361d3d16cfa3e8b764dcd8756f8d890bd5adfc72a43347c9ca81b072dec40b75ea3901", + "ecc90584883a76a56b914f73fd1367329db16d547e692a64fc59ba4ea86e5bf93598d53f0236834c98c3751795030578ba249fcbc69da087dd632886611ab96b01", + "0b9462cbe619e461b8a72a52194d0599cd63d130f10e905a1ffe8af03aa1584311953db3006f00e7d7273036b0d9c5347c3c586a8b8eeae315dafe6f8bb2340901" + ] + }, + { + "address": "baYpCovQfbz8Q2A9q5zp2AR4Q6hhCBL5pM", + "secret": "1ec466e5d354246ba0b60dd2de440908d7909fa5c2443b67ee2d5d151b94bc3c", + "public": "02edc9f522f60e60763359f6fa8d55760ba814552961fba4e3035c2b722a89c2fa", + "signatures": [ + "7de1174714dd3ae5dbe8e6799cacdcbd03ae68b0440b04adeb46bb1136f333e55bd410dccc8489b3d01c5e4073a956caf4388bb803cc8d0105f22a585237a0ae01", + "2864b63a0ea3bec590a1cd4be61a31e086cae999fb7c78955fa86696fb3ace04753e70d4f14c83cb20b05bb9a30528aaba1f6f5a952995343495a4fb6c05079300", + "703edaf07205c2cc3bcfd26cf1608d679458bf92861880d7856489c42c50d712460335658b68625f9083430f5338d6bf42d3ba0f144f5ab533679556df92000a01", + "d4be1600c0cb92e0b07ca0263cd57d6c909849fdbbe5178fa97d983a406839a94c8b964b06066c27d13613d6addf21e151c630bff8c38092ed00de017d1562de00", + "c842070d8c933f4fd86667ed96cae99037195a88d5033dc76b95969766ccd9ac41432953188335399e7b2224958aaf08c5262bdff78a65f9191b5fa13547915d00", + "0dffc1ef0f4b1d62b997965a884728c25702d6fce447df95a0549e4cedfafcfd056ab44346bde268b8cd848b4e61d3c0ab8939cc251a935336ebe599886bde9800", + "d59b89ada61d412d26eb7a1451ff13c1872d93250243b359a368a1dac24566b0617172f14b76091b80f49bf8b02a8beaf85a461a521f1a977bbcfca1ad81225801", + "af4db82905ab7d4038d17c6c511cff360af7140ac3a99e5f9c4165d197f45185443fd0090e7be38f3be83cb3bb6fd2ab7b5f913fbfbfa0fb8c676936e995499701", + "005009764d6b272d9049808915172c3e8e38060c6227ea8fae538bbd273cd815393c215b0c04dce8400084dc3d83de618f7bb3f2f98f30a3a930b1e3286ac50100", + "85281a5f09289a2625bd5f23012e98c16ab43596c0bec18b64f47e0c67265b8020132a12b3c9e32c95c7155122ef88da0143d629f4256beb6c77db4077c562ad01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0005.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0005.golden new file mode 100755 index 0000000..f5f9a0a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0005.golden @@ -0,0 +1,175 @@ +{ + "seed": "rg==", + "keys": [ + { + "address": "E1YWJLum4Zo67o4HvSHcGwgTRRS5jsbM1S", + "secret": "28cc037e29023331566461ef67695ec84cfe2e3963b3284cd39ee3be4340cb3f", + "public": "039f1cade86afd2d1c2aab43bb91f346dce39aade4f1c4539b68b220b2deafd2db", + "signatures": [ + "582ed859fd7ac1047451c96dece2fce048a7a2769dbf7d6e26fd6d8665ca77d74de3e4fff87cc8eae6d2be699110bdd461ad3d2cd26a5f3b0a1ee57eadb8926e00", + "65147b6a8bf3b95a29d3717c77c0673e03abfb2e1a1d087686272130b3120d5425970e25ef2f2fee5c094c41d3a6a61314b73c1d505b53bce259904854da270f00", + "be54697842c0ddc05fbc4456ed2d25c52c8cb6a421d63b69c8a74717a70245a9574314b50a9da78ee7ae1456693887b662699ec495e0192d6df6acc1fad1c28701", + "93bd2264ae0770bc43304dbf03d841044b92a9a0e1bcaf02616c9fc27981efea59bc48fdecde42419d8504889f2142d1912f68c2526ea6bac7bde4cc6899818900", + "279c3f244cd708c0382585497edbb979542362842f431bbb2fb79c1e32c349b95c53b90d170f18aac97fd8cf5f7a44d3e3d4ce80d44bfdcc28fdf96404c04f2200", + "790bd0d363885beb9ff0fbc40c2731a09efe3239a5c1bef3770f20845e15456967dae17ebf7672c3520b3f2056f1c041723d8adf6035a79bfadfa3538952368900", + "f7bd0099fd178cb133e8d756dc78b4ba9f35f0eee557d5a6cae15adfd3b5274c7b41077a8b1d938d7864cef8654ec0154f6698735fbfdddabdc11baed63b180f00", + "29e7751f0cee32a72664925334dfe384347524b950776f19bb8f1f65a6e709a23f9f8970f3e3bf47536a99ed2926aa5a9275b75f3383b3d34baf662c03bfbc5f00", + "a4db1d71434b9eb07c3f75e9b6f4116a0ce972420c1873e588410fbb89dc31ac3d812e71cf4909386dd46824f6baa9c5c3b6b27a5bc7f9e5988c60fdd5ec506f01", + "fcd688f407736fcf408a7aaf27f1b2cedb72f4f9f6de248c1b1be600d1a79d8200aadeb8d330062861b4a93c948d1be588d062d02c36bae498d3d969c4194c9a01" + ] + }, + { + "address": "2TXZrhjdPPVWX3mropZdAJ7C9tfKA1H5btJ", + "secret": "3a6ac4318cb089dee2fe368495932155be25dc2cfb1994986cdd5a4eeb97951d", + "public": "025a9903b928ef2f66596d3fec381bd8ab02be4dd419d6147a2839f4883720c424", + "signatures": [ + "0d1ce484bdef0becc50ccd02245871e1bd28338313ce57f754c931edab9a822638f9dcc028b722e0738d5beda6ff9ebe71db9a1c432bc144608a58da7b5a73a700", + "d1c15c29c7d9cfa1312ce992120ea80ad20b79d46edd91815c4bed09f414d4244882d6fdc99d7416a35f2af2a148ebf2adcf66d35e6f2acf9fb61d23ed31714201", + "8b746e791bdb92becec684471b0463aa4191ea1735599b5c48850693f79a1b4e195d559735e0db727ba02ed790cf17d724f2c8085bbc755b3e165eb7afe52aee00", + "4b8fe3f64d924f290d451cb3b34ad3433cf0f5a1e63e2ebaeadd8c19507a8f5d558d012dd1a348a7143a995f1d6fc87d476379843271c1a3b217eb835d6c1a5401", + "06548a750b3a35ebc8408d251aeec0e2deed67e37f297120acf78391ba611ef625bd64a40e2521acc1110b9fe4fbb47b8130a70d10e7f16f8d15ebdcae50cb4501", + "75d7cfcaaa4e9f483d11087f4e1460991b96a47e3c13be1c7711dab7f9fa9cf577085bdcd8be8f852efae4cdb5ff32acbb7c62f944565e5fa2773760279efa6401", + "2ab8f885369a6671cd27ff2990a8c363a7c4a06b7f83db97421443241204a410170c37e10c8912aba3475ed773b80853dfe6d17ed7d3918191ccbaf84640a62c00", + "8590c0d45abb75fa18976c9e5c9f28aaf157a5d00611321d7ae86d1adc4ef87a560dd28f3dec5db3ab0156c19431a19d900267a36d88bee206e42c17e0586d0f00", + "c4dfa4c79fa9ebdd739a89fac870cb8d38aa52480e63c59f42aa0046dcbbea5c2fca4e64421852c8dd62ff7870ca24fe44b5513374560d4aa49f60921ac712fc01", + "8a3d9436b8230a13ad2c00173e819deb4117fc106064b044ab560c89d7f01a065d6533d1d2aad1565b22f1b69d005ece97de62c6e8c45da8f853f532ecefa24f01" + ] + }, + { + "address": "PTu4VmJMkpSZNPyReRoH8n5MG1o3gaicPs", + "secret": "a9e8dce4a111f6e752bdf29a5879c2c5f77ecd1c5f612df3e9edb8b251df803c", + "public": "026c915201c05aac2a8893115fe41615a49ed8d601bbee9867c53c7e3813f95088", + "signatures": [ + "c723e8e7ac59644eb1a9a59e6b8dc261104e7f89cad7e7e508be71a93a9ecea70c63a10f0d93eb5edfb23b0183e0a654dd042cf2420c6228818e819f8a63a4c000", + "50bf3cd499902e7350d89531941af889a0dd9bb0e0bdea2282313c99b291a6884080095a1eeb55f5a65ebbd209d889dc264bb7da5ddb7e13706a88dc532e3c5401", + "f4a9c141f072faf21151839182d55e841e48ce3d793e14ffc36088ffd76b1d650760bb36721ae64b2792cf2eed0afb0fe1d862d42ba9673348382ff3f1ca245f01", + "37a7ff5a750b8b77fe93cc01f71f4d4a324ac70fd5d1527d5ab41c1775f09087321f3da3198c38bbef0cbb886596804a22006c704f6592652aae8366a1784e9201", + "95fa2b244623e26c29ee4cf050c73cac85f1b49246790f34838d2922e4b3c90d28377d332cd9f9bf122afccc889a84930b5ec196b399c9550b1b83372ad7486e01", + "b391dc7753846b34c00091914219addb98d2c8f843d21c72c8f0b57c9292ee4642599181c94129464cbdd8704b93babe7cc0b76d281555536a93b6a17ccf042001", + "54325c4d401df59c618bc76f16c1684f3cc25aad328f5944d232a9f0a3170d8a393ec2c78c7389be320044f0770bb6c2f9b97a0c8df111425f7683753c783e7600", + "9479da56bd083cd4e8f53e492e651105659ac18682488ccf9019084d14c8fa9560873c07e85f5fc002e573ff7c5465b8167382652d088082ec8584f93db0d5d301", + "a4c4429e46ab80549c155fbf05fd7ff5d1adc497024cff628f751522ce429a825856c0c7f62a1dc92fd95d62bacecc002a6800d41ef6db5d8737dacb9d60e08601", + "fc82184adaf042736fd92e36fc42dc7e0b63125b6014916065bd3858402a4d891c8c206bc05f3a60ed6623b107ee34ea8bfb5182e5d75c33b8b5672ec5c536c100" + ] + }, + { + "address": "mkx9CqV8vnX8m6wgMiQbW8gLLnHh6vGz4N", + "secret": "ec677f802da9627a8c4a90d385ae68399bfbb69c15dea4cba08573cd81ac5a9a", + "public": "038797d2c1174dbb2e128e165c9d3814cbbebcce024c6fd459043f0dc661c7db24", + "signatures": [ + "273a38e3d7ba7ac27064fb70420911526994f497976c809803cbf933b95651f570c82ed60b0d5eee3e434754f525716ba85d1fb4f4b6ccd85680f12c178af1fe00", + "e4efd05ec215a0bccf810283ce8397f023cb79cf549e9b84cc9a879da14a1def127b603baf0756698db559d4ce57f12c84a90233eb952857e3864236bfe413f900", + "cd7bdb06aa7c5fe19a365ed29c120edc4936443b074437e048a174525fc8a49678e6e5d34355d771835c176f281341eb621d1c9912db8d04d51ef9e8289b3c6301", + "186363b97aa04417a725771ab2f53219f75bbedcca84a7720c542bcf1b7a7bac1d195cad9b52b23efc8278e0035856d1c405220164b29189ed094dec7618656600", + "c6eec9029162fad395aca44947e6cda7517f10835e5ca801462fe7a868086eef3cf8d712bdda3f4aae38b288c09a3851cf6d8f418721886a0a8e87e9fab6bf2200", + "aefb39fc91f106de7f7349b53ce3e8efa97986ce3503e8ab527af820aaae04a053cf336698cebec7d306cf5c52618ff77aca763ae5393ce8d5f45a580ef9ad8a00", + "7f2ace494c7b7ddc380da34d60ef4152f1cdf8bdfe082603d86a9d52a543e66253635ec64531f6b09d5a546549300d0df2ded35ec25e84f7b0a961f8b392423500", + "1fc025543feb8990d415283e946d3d42593e3f4259ad36de79d3211640b61c2607da58688dc13734c15beb10018238aa22cea4460deb1c0a95626699c0b58f8201", + "a08ecaa36a67fffac7189c82a72ef65a419f8ac513cf87e7d1e2780c25da17e72d21e72755f88d6fad7f5c9b21fcb5d9ff3e1cc0796d46b978e0023663fed85d00", + "58733846895c696b0dc113a50751747fdb0dcf32b43171acc591013c2c6fbd7239f707a1c5820a8b922544d2cbd3f49bdcbba5e7bf28db69035bf30b202da4b601" + ] + }, + { + "address": "ufRofY1rDAa2QQojenfxsM4X6ibkqCeEb6", + "secret": "661e38c38e3a9a5463be99e2e57d9dd6efd5569545cc0d4eda18be36911408e4", + "public": "025b6f563fdaf60aef899c7ea420397602b1b3ff23ff7a36230cfe55fd88368b8b", + "signatures": [ + "fc478aaf82572939f34775beba8665c9fe1366969dbe69dffc17824447f45192506556092180d7f76d3a317902e33a9706fce4d9dd41cfbc29794e31d00d123501", + "53bf45832787f16e51cb6bb8468a790cd494a3719b4430b84d1d4050a487d7ce347fc6e1cc810583b681447bbbbe0c9b2a98b12552417a4c687ce4de59de5e8400", + "fce73f2e0970d1d02338d808609010351a2c3cfa41f63e7e632b32741978f598158096d5dcc54584b05e288b3522db48d01e6295a1a64750d8c971e734d0597200", + "c44114e4381adc869165fc09554859f1f920e8cb25abbd10bda4f20c34fce4665b4403b43ab653f14354ca43e1cdc78e669b5448e4b9db5424704253141b62c500", + "80f551c54136d983cccb8e656eeba08874318b0fbb1239d2d0306d49a262591e7c44cfba78775ea5153b2bea5e6c108398b17c20fd8e401929c5e36aaa3b692801", + "4c978f3ffb2986d0251e54672cc393e1bbfed047083fd3ada43544bb2beb3f9b14f79550b5251431a4993ade176063589dc0df26ff16355b65b5ad6e06d9892100", + "460dc20c24368bc2793c15df634b3da1ecf55ce3d86507514a03d9b945663cf00887da944dc845fb1ef423e7ab51fe556b7391d697e6a69400e1e676f1ac24fe00", + "c90f01c37871140f69d90b2c5338ee058b0baacf05277bd5d1945fe465cbe0670133edf40c746ac174a5926b102dea63cde0e283e7d7d6b7cbb1faed0f5ffbe101", + "1ead603fecd7f7860eaed98169f33f479e45ca8ee2aa8bd220e9e602123435c84581a5f8603b2a9d16fd5811a3e6ade670fdc5114d7300bb1e12990c5c9eef4000", + "6731612a2c6b5ec693f8c710c9633840f321e572ae0a2a0e641193bd1fa543f55acf916bc16438ab756b365cefa68d749569fc49bd75a993cf193ab3036ea9b900" + ] + }, + { + "address": "jhRanaAD1Ta8fVFa6jR7u8sMtnABK8i6Fa", + "secret": "1d3da4928ba90d5bf443fd7fb56a6ebfc2a01fcc30ee33eaf8465d82b683850b", + "public": "03f3cfdd8ef2bf64c313f2feb8e9a0124bcd5d633134fd8eed177f46e957a77e96", + "signatures": [ + "813cc034cb0a590d2b264178509c874a27978e1590b39536319fba150cf16727759965f1c02ec72d01d2c76b403753460cb569739a2b4193f94184508c5733ad01", + "eb31c1e18718ea401dd5b1bbeda01886a4c40272c8f6d0d56a5ecde09df3085d513be8293fb7e47d37de19849a756ee6fc7ac73f3a8a215b2096c5f7662cf2ba01", + "a8850cdf7936d3f8339029efa5bea9c9422719c52fd31386044c0f7ab8a628622b118d80df8a5972a5e0736de5a2ddb9684fdb8d620f7a68dd72e4a09c10bc7601", + "9d6c8ca1145714afed5a3b6e2ee995375ab6262cccf0d24f22cd7067a4350ed0751dd15bbe7ebac345a4d56d75a3c850f229d3aae44dfb7916c39e07f252d37900", + "84eb2b5c4d183334cfe54dc7601217f81672985a6f2504440ea867cea0eb8446193a6f82d38a1bf7a32c3d8f2bbd3afb57767837986537a1d9b7dfd05e4552e601", + "afb88d11917ae3cc498bf982efa0e5afb1c2d23eccd20dd5494766e763673dfb664aff38e6f6482deb6cb05f38439355ca3ffa395af381cafb8353a105cd321500", + "a4f772b50f0e7ad5bfac148f58bad6bf83a98954d04d51608a9a218b9adc1e5417fb5ca3210a3f04d0dfa2ab09e44f6b667a51f6f005e8366d83032e219706bb01", + "21bcb3564cafda1143937042447b79a89bf128d881a88099654a12c5ebc05f4b6b477da247639e2080f1e0a0c0c5cd5180f902735e634026235c2f3e1a9407db01", + "18259cab8828b0a8b4fdf6b116ea053a82e1ddb71ac3b8868d8f14b4ed3b8d290dbad8a67f9ebe626ecc213db20e3fd90ebda5edb995682be0afa8f35690bebd00", + "41d91535c7fd4a9d7835149d3eec0c72b90a6d1b73a92dc91c35af16f2d35c107bf9e4c2123e09921439e161891becc5a2be9c5ddbc8b1795cc6804ed3eab34901" + ] + }, + { + "address": "77W85kDVi2ygMY6EjQffPtZQ2A5K1kJeTp", + "secret": "450e7d29bdee2f8a2e15ae2730152483498dd0b31dfc693ec7e4fbc6eac502fc", + "public": "024e94e6e275c8a3c6e409c91b071b70c0c1ca2ddfbfd3d08cc76c1a98ea719eec", + "signatures": [ + "647bbd3dd48454ed1ca0075cc15a39a2be0c91842dfaa57907eabaf9ca6d561219e69cdd04804ac2b83508b779a2acb71cd3bae1f6e9e8352a8b1d9240fe9dc700", + "04e7cf21fbddb4b196ddda4b75bbc92e82f7ec92fae5c824da045e352845b4a127f84d07069132fc1530b425fc64791d556733422ecf6a571425f622b58cdd1f00", + "90545da6f9a0e89c703bea93df3ce2ca7c8cb05d137659a2a3407707164913f928712322ee2067b26ebff4cf052f811e630936f0ce21affcdc7d99f21e25fbe800", + "21ed7cee0e1df586105273b54228c54a21e7621fd97592d6ba5501e2a277ef7b03282b2109dc87c2770d28c3c9b381ad82c7c79b619322a1f797b5c95d95a9ea00", + "0f4fcd6374b0b9aa05a3a702e41afea1173bac9077f8b5d037395097ac5482931775f134d59c55f546ff33211bb1ca83911c1901f2e4aa44358d3e2df97a558000", + "4b3f21d76694fe2f03012f2f4cb506e128f610ea3e8738ac94f22523bf5e1f4830e712d3902342ae2779c49cb8ab05de744540443f69900f1904f5b2e5a767b901", + "e1a91763cc1105ea763e67b9cd1c25f74d41b39f400df22003d779f2c91e4ee20ef444a3c454f8eedfc6b127c8961be3e6b25a75db3ad49451774606d35bfb2c00", + "395b880f1c233c3c12c0a7d9ce08c5e95e35873e7b5659f8a1472f9a197f59d8345bf678724bdc2f83138cff4c3ccc5de81bb074efeeb2105a4aa28e66825e6e00", + "0ea0f9b45f425ea224675d88e24c092e369a2d2a969ac0bc959d4d7b1418c10223aab768d397b7a71967e27e3eef91494260b43a9da4460ed5f973220221c6cd01", + "4142a63fc2be7e70c9da1501360b84662bd02eda9dc2d7d5e6c6217d075d1d683faa45cea9069cc8fff98348c7f2f31ea30ef5da710f27a9203d13a41b89c00601" + ] + }, + { + "address": "2fDFwpM7P6tK3krFcrhaYY2x93B7D86dCnq", + "secret": "189bd3947f4682e4bbdff3195eb88cc75c023248242fc1a2d3e37d707551e593", + "public": "02ba296ae39678461dc7a1963624b71f8038d6f74785f01d8e884c72f228cf7e88", + "signatures": [ + "89fe07b2f3da7f6e1c5de1dc60111033b8976a7e79e7fcf062c0c8ab3d7e9ea0206e68b8b01170fb5d7f491142725573625b3a006df68af15836496f00013b1900", + "62923dcc288cf2e7a118e44a4e087d13c86cc63f1f5157f0199ae98a900eb81d20702990fb9804c7d3ee668ddb80ed1cb36855ce479b54f0971ef7300373e72d01", + "59479f47a39299809c24b8e206f129d204597f2bfb416bbfbd4b8608a1d89fe33d3c1ccc4ac469393b12ef514f5c82d2e2ca780187ba1ab1e376f164649cf62501", + "d3fd138264c4b63d19341ba742456ff50b63bfb62bd7b2d70f18901a1d1478b73f03e45328e587d0f11c16c3dbd43c1ddab6c4ad989975e47093a4362287313200", + "397e578ba4e262ac884394d924650ea6b5065c72ea0ad1e917ba256875afca776055d0cfb36f4720d76f7b276da462fcd09e2f3ff791827660cd3ac139d1deb801", + "9fa423cad02fb69b578d38a059bcbe142ff273a91a042f61da0f73b72c80f8e24ed3a7cd1c8986af7de8ca603b2fd09812d14c098556fcb3879be8fd65fde9a501", + "a35ad7955b416e9db5f0070fcfcd601084ea72d313f1f5f20fe7ddda8f4e8cb0608d0a524ec33c0c7c7b9e22942cc26c13f1b5d986695ad9611aa38490dcd2d900", + "ea661e1459ead9509b69621676e1bc53ab2844c189df802caba4894d22daf93b1711c6ed4095ecf989794c5ff7f6af97f2cdb200fc4185b657a986b75910c90500", + "16064c60d7077e55795adc7c0f34ab0fdaffdedb7a128e99c0af9f1365463ffe62c8e537e4f591b0dcd3a26393f04eaa0651a9fd4f3d9152da2cc96e3b0590af01", + "98ecc21e4cc24e917150352ff2cd1df43a18fd7c81934ab5826763d300848962261ba895d13a8b5d102c1b4897cefcc5ae3bb777dfd882dbcc3a0437b1a7d9d301" + ] + }, + { + "address": "Ly5LPYccXjDtx3EA1Amb6kwZe4xL2HTCJT", + "secret": "2a00b256c613cf7de4acb7b47efb7b5be2cc328012717f3d585e6eea02df6f53", + "public": "03713f5421167dd1b76aeccb351d4bcf4086edc9c9be95d4f9efc4b27bb41c93b9", + "signatures": [ + "e8b8246e1dd328a7fd59d5e5023ae736d14f03f55c71a1e164642f0abd2d46975c27ae7b4ba1cd0acb39cf55fb24e7c6146011e3bb4fa7d425693b0ee8a3fd2901", + "c92fff56058c70c86863c7b703cf245a73ef615f4985c9951b2647be5c4b543f0c840ef819c7bf0583a11627785ab310a21338597fbc8900aa2f0b21fe81f90701", + "4f319b9e8697570ca0acae7423498da1aae0b53497f5feb3752279c7416498eb4b8a0b61f9be697dbe59bf9071c4c507fc0d6f59cfa29003aba8789a2caf5cde01", + "6ca0e05d533fffd7a3514c8d0cf7be303cb901dd19171a07b9dedccdcee28c830231e465c24d2f728dc88e9d9a742923b237f69132fdd45d282bad446e60750501", + "e8a4f6ce818a4a66e9fec715a01d4412d6bc8ec64199764f6864cd1004a6a54919897cc7403ef9106a5dfc76c16d56fbfcfe6f72f762726715148a09322bd5eb01", + "f236ab0ccb778d2cb2f3b1c94ed6e2aca5c2dee17a0fbb5bd560cc463e4fc8602e60c1dba5efab13f452a6b205cc231cf65bd015183855ea00d457a5fa0bd34201", + "d0114bad79c8173035bbbb330ce157fc1c1cee17de0801ac594d2b86931f42c54cb01efe70cc49bbcbffd85f363821efda30357e819d9a71e64f092b53f18cf500", + "6830f56c0c6db89cebe1672b1ad58ab4691e72c8e7ab44430cea79f1df58924504154d1f6109526f57d53f89186c4c631755123274d53365de0fc8c74ea2ff1e00", + "c580993fc7bf98f4d75d64119ae5e3472d2108add0a3ac427470b253433d9f8d36ab1e2e2e60cda7b7701ba0a78387df04ee3679a5fe0011306d8ee29ebd102100", + "a90ad4f18a5292bbf30e6b6a9e8143573524823d3e6b0a066ed78b3e9f30be6c0285e6554e6e9a1c24a01809dc7e0d439fdb57ac054259ec10895a52a5c2873400" + ] + }, + { + "address": "fVskJWYkJekapAcR3QQvBsegn63BkRCsE", + "secret": "115c197195ed609ebb91e4d81a5fa57f0819ce9e08774a330db4fa52d97417da", + "public": "024a4807e5f3c20b777705cee1a58905355232210e84b72c74e25cffd9fcb110ed", + "signatures": [ + "f210a289f3cf7dea3476400432a8a64e7b2c62a3b12e8f3fd9c8c22d4928e5c607894263fcbd23e0538dae2deb979b555d11539034b8ff31f99fc7f51d69a30100", + "f463eb2677fa97af9666a103e110010484197271ef4e710dd792b8fe0964c9b8307c9c40fdf5633d278f3ad3fc1f00b10c42310d11135158851b6b19edbccab901", + "14e222fff75aa114b3145022a34eadc6abb64e69e7f1b905430c38b7e4e4af294c720a884a9c16f44c8386cb91cd53b2af334da27177fb4f1d282ebfeeb80aa401", + "9df1ad76f388829b069d4474c4ecf0d8bf7de01a31e287b10fcc883c4fa714441490fb088d0586402cfdda4202e4f648ef9257be506daadb9803ddb84545eed200", + "9c83abbf506869f684bdec893a5d5d1291929c6b66e9fd35ebe655e1528f2b0d63563a380785345aab85e375132b7257b6b26a066b6a20c9c8ec58adea33122001", + "80b6477e48dbb5ea75eab67eb887fce8229ba9352fdf1175f6e502301be5ff0e370504d8ccf447dc76e58ebf0a8effcd3604b5f3935fefb78e6230fb1aa3df9a00", + "2bb168b7613b165187391ea14889863d43a8d967e63edee1fae608d2cfb7a7ff4939a76a1571e67481065c4e56a72d2bdd55877c474fd62dfaffcc6926a360bb00", + "eff83a7caddce6009dd76d07a5a9a09478e3300dacb39c4aca637d653ec4cdfb380bf7e83aa27fdc632467b4a64834055012601d05306ef3aa7cecc86f50ddd000", + "6f87163870bd241190f9bca7d3df36901d8139892f21a6db2575cc5b7f1cc55a21d85e68bc73fac1e2d29fe01d51fbd55741e7a727ced4947c8d6712f64dcf5801", + "7ecaa15895a85a13a2f8faeaca642e4439187f1899fadc7f954624764b29b64e0e617808ff959e0a584284f65931807817d3ae23255ee8cce74a8b65412507bb00" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0006.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0006.golden new file mode 100755 index 0000000..ead3267 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0006.golden @@ -0,0 +1,175 @@ +{ + "seed": "5MnQdu6vWeP9NddFiehxsGwspc8aff/Fuzs5W3c6L1I=", + "keys": [ + { + "address": "rLjV76Fayt9WU5rk19FnzWeZEbF8nWqGHH", + "secret": "953b69e03457e239449ef051aee7a5fd9ad4f832bc60e8915e0f07b52598206b", + "public": "0296d12f5627840862172af9aa4a22574c427e60bfccdeef22e675b137b439b92b", + "signatures": [ + "4c9836174cf0204d88ec36d6cebf72aaabd1c5085ebba250e12e5fa21e629a9e78d71b3a0faced4cfdf037110b452acca16e2efae3a16efaa84c5132951139f600", + "e27307fdd00c852a4d209fa94502e580d7aa33c64cdf811c743c394430f1b2d361a1108937a57fe35ceba04b96498421f8210fe32cfe1223601565b918e70e9c01", + "d29f5c767b865f6311218d23cccf4dbc728a4cb4a148c7863a4475e4aae268af27e38557216a8290ba01fe1047b7400c6743388f75d999af176e3bbc1957ac2000", + "30d45245cc67ae3ca1bc840d90e3535ede9ce5008796a2c90250f7de86500da86f17b19a343ef2051d3526fd33a5894927b09234b86f58f469a3f1d018094dc401", + "826d791c834ed696f9f961f0a7f971716c66efe58a6ccce16e4b3cf834fc49d95051cc8bea2cf183a1d05b04ba9ed407648329f51224781a27bc01fc1fe75d2101", + "b0fbf1f4e21d32b4f3a6398da88e8d4dec7f20eddc4938d7fc493997254245fe257ab78edf9412fe3cc1d773e3c28b41669504baed686320abdd0edf21f2259d01", + "7515f2946fc8e43199818bb95926934d6a5be0722782ad44fbc67489019564094f378b3c57d1b11bcfe14bf2c0eae08aa9b9186f7b1c072a03ecc03ba416f33801", + "870ce446e34720816170da99f49a843537ff6cf299d7562af82fd9025deafb0b315529625a47049408d081da2b3429f555c74d7657917b8f7ba8fe0fefe0cd0f01", + "94fe3ce87ddc7f386fa597df17d53d9aa33d01a8aa2ab37a18a40128541af8874e1e05cbb6429f40710d945ae493aa033387696884788dd9ef9322030f1c246300", + "1700b3a08d9733e486dbbd26f67b48add3b43d72a952930c786ab44e5f31866f14d20319a6b1a72bdbb091d89ef7bd55ce9078c8c86aa2f0bc30e75f13b8142201" + ] + }, + { + "address": "2d94nXraZtkPD2GiSCfzugewm9cRbCVDNnm", + "secret": "4f8db9121a8fb6bdbc8de701593e953b6022431d9045b914e58c0fbf109cf1cb", + "public": "029cc260c200b5893e55faa5f23baf6268e0f20e77ee1b524b37f6e1e6ca9a1814", + "signatures": [ + "96cc1e166e56335bc6f859557ef73c2b7a96e3cbca0f32d901052fa55023a88732b40ce4e45ee236ffc07e0c4d2db6c294cc7f1d3a2f39d5e6e0f11da3c2259b00", + "7478758d8006ecb8103311c394931722a03f3bcdddeada8afd37b9d93b39d67033833444097d3d979bd9913526300f6491107be0d31acad6c28591d8529e24cc01", + "db8a4f5dd1d5cd811cd08f4ac1c4effb55ee93498f7d5f4d1531c315f047ffba605861a92e5d5358a87e7763ac223c6edc2489c9a08ebdbd3d37e7728ade58f300", + "7dd0865d18a574266d0dd3b173e03c2e8cf92ae77af99a8f68b9c7db2837326c769c69968837647d5b763a13f1caa9cef07804cbd814140d66607b0d151014c900", + "7f97f9fa0d45f1eda3e985b3e64b4656ef38480644c355b644e01dd772aa7c374db2e37f819d008d2da57d564fce1c0544e17206f3200dd12161777428c383c401", + "7a1aa12c91e34842ab1b8cdfc3e4d46d2f1a8af0267ff74aeb24a942d78fcd544438341e30c91c161689491514bb1d19e6881758007b25f0e6a87be044ea8c3d00", + "b823e93c1fa6e3391910ca4e461c58e51118e76470dc88506f183f6661f8ff0f03e4e4f1c58c06ff40446dccc0b9a9bb65b7793589e8402860f0d60f368659ca00", + "36751c77d88427b43ef8b68f15a2cdb48225a98e506d40fbb09f442cd513621615fb62d138933d7b88812f054be3c21ce1a626162abcc705bd45d4299c5ed15800", + "0932a2f7eedb5f7b9fc67602c1379254682892da2af0b5b8ac06d417b5136b756b96c281c4ab3735b9e3f8195747128b4cb46a704702b42d54c99e2b79ea98db00", + "9a7b5f8c7a78eaae1fc9c6ec63372297748a3e977a3b06919ececd3859e0ff5973c2fe2effedc1b01888f87d1ebfeb7b96dfb5dd6a9c96f804dfe56e9504c0dd01" + ] + }, + { + "address": "gVpAMGVd271pzHcNZiMzU7FDNqUiP78BwT", + "secret": "1a59b0065001a05a93d72d5939fddb148c5cfb775a0e2a27a99c6d54372939ca", + "public": "036de1827a8524f166854bc7b85510d17ebe0369fe828d8f8c40e930569dce118d", + "signatures": [ + "0dd770f09abc025ea1f3bc25b8910f85ddc5bd2adbfde66d247607a069405bb10cc60ee15cf03524dd5c15365214401b0d911110ac2ec6d530850c097bd543cd00", + "69b432114a086fb15dc22d85340d605bb73e81dcc48b2d3ac776fc84686e19304850f09c69d54dae0b30704a7693a33956303c5118cde508295927599e13cc6501", + "0f43fcde4a728d8c8a354aaaf12bf7585f52cbef863d99c63c9a0308ea53a5a32af018116c1669667ac5a62acadc0ef198dbac3d72821ea300b5459de615b91e00", + "af29eb64035e6e7282927df51f1506e5b0d12db63fdd567a23bd386e086d1559770b918ae23d51a73cf6059c8475f611c786b81c6b15233a2b707cdffa71af6600", + "7ee7e341312c1c2fbc6179f325a58cb592b740353431679e178213cdfd0cc0726247a34b9379559fa091eaf45e5b4e39e7687eb83729f409c6cdba842bba197601", + "18aa13d884feab6eb0d57fc85500cc714a49b45ca1529f4cc6eb5c6521e0126c027679f19d06d629789480342209ffcec217e0620d632cfb82afdae61c53c14500", + "3256f3bae51169f46403562616cf71988324e86bfdb7e7c24f431fbd4451ed29302dd9762a2a296f9cbb58dc757c2d0757fce4601977547c6a54a30dfe56c9f000", + "3214ce760c0f3dfc8463c85b4c5bf1c81759c3d45e85d8d061af54bae927ebb3297b7e30e9a24341b1a620d81a8cdc7e5bcaca4bae94e910a8dd4111bac8956601", + "bbbac8d56a6c385825c5549fe5efd900331864550d4c56f9930c3eae8e1f34ef7d6fb9c51f731aa4d501b224f37ce6ac73141f2bbfdcb881379d4d019761c59b01", + "f3fb7ea9622f83cba22743363780060afd9c6e5a46971636edccb41c90332caf6340aaf635bea94085b8cefe0533536bcc0076ab305bf0ca30dedf9e8d9ba35e01" + ] + }, + { + "address": "2TpmTjZqMDwwnmMum5CqDZjyjekoQxctUaZ", + "secret": "df84bb1a455c464ebb1da23257ce7e2998d6a2f92e2864a9e9adddd3f017d784", + "public": "03a9aa938ee9aec021db0717c0737973e68a39b4d0a2b0c168135a98a1a7c64dbe", + "signatures": [ + "2c64c71319bb1650d862f7d7d981947866d3249dd88f18e7955cec62343e6b5d68fa07470cf84d29731989f2c7b5132de1197cc54af7c13b0ac93b09c3779f0801", + "0023899b5ec712d998eed46bdba397be815fe1d0bf17dd1fed798a7d6cebd90e15ef600c2ef755cbfaea7705cf8f9c151b59c652775dcb8a1bf193a0f157844100", + "f291b5461df348d6b63e956b8ceff056c85dc80062fb4109f8ad4b7c92e64b5a3be753846525a0929e10223e6b50d6ab3705f259d515a4e861172171ab40bc4e00", + "3338f44cfaa47203cc6b7f40608a4a7391e3116244e7e3c2926d895bbd42d6841954685b36f65007fd768dd99b54f398de79d57355e5fd1d70f88ad83e27153000", + "a6fa07fdf20f918b7e834c258c759b8c8c701d990e879cbf3031935afc21ef882ef1e5802e4a6203a4e8be329f629185031948f46362ab8b9798990f10ded16c00", + "147ad65314e28af6c3153d74e278777184d4da1daf328f90da98f1f2049254a843d780f7ff795bc5e64960555355ea600897dcc6aeff4ad9e20b98d37702386800", + "8b6a680ec0484a272a0bfe3a22e3d2e764b78e71f0f616ca678d350b46aa8ff90d8d4c1281dea8ed555f90ca721da4960268e3376d752c772c2bf1114fb9b80900", + "a978234a0f34f7acda0716902b32a13738532ffe1f80b7f2194f5f595cc5f0f4083163aa767d6d84d40a0ec8f2ba9cd7a29e7778aadc15387201b6d3418d391500", + "5e4a552f73c260759372db4b6ab76dceab031ee738aae499b0495b214e7664a50fc03a74d2fe5c04e77edba12149b37beff9d4b247d3cacefc09696f7f67e2a801", + "838b75641e209dc77a8b72e7ae3ff0cd00df644abf5889949ccbabce2bccb3e563525b3bfed5ef54785432b87206342ead57e1b404235bc96b32980a570b25e100" + ] + }, + { + "address": "2fznUrLmmNj3vrq6kqhYTPdEcxsPF3gd2Bc", + "secret": "49db3eb8a8973862917e151d92ad0d159a5a11de20ca3fe299f2fc4ec71a9161", + "public": "03b0f175d8daf4d0b353cd28a6d454a39cedfe58d4d9447b47bf19cdcdc985b2c8", + "signatures": [ + "ca098ae575f90a7cb8a33024977b5511b54be8207ee45e607d0a1b2b01df75053eb358c3d1afc7cd6a14d127f37217def7d617fae164ed865fbb6edcd519bd1d00", + "3a57e71e97f360e0760586b567d9a9cd54aa578348c5ccc5b8105aab532ba4396ff942cfee75b255b39a60bdf8dfdd86218301a233b113da1110de51502f8a1500", + "67b95edd21d74b9348e2f1a9b04459edb63a1f6025f967f3e9bf237b01bc1dff426287145206d285984881a76d353416b0a09092f020389a26dc6ed2083a479101", + "929c014bbc57f925525698c7d382d98b7997a46bd8ef5d6cb195fea87a7c45575c55a8e9d9578f0847fad452b39a32e25968d546cd90bc9ce4adb0d9f9d82fa200", + "763f05ac9198194298c92246ac056bf1b9f92c808260aca82fa976b803d11c8d1e2afaa965baa5ecf38d656e3ca3c2035ba18518765a7aac0bb6d9106fef6fbb00", + "3abe07f94713ca02e09662cc1127822cb7c8a2fd68ecfe859777dc818c67e94331366941b9e3131d3f8173a504982f043d985e00de6291bc48fd2e7a362f9ee601", + "5f2062b454a14402f952b1f82e275c9e94d5a803302b7d960aa8fe739157b7dc6ebc1f8b284e2a1f7b94b7622a1cbd6928a8596cd843f93cb829b919f9d1e50600", + "61803922611692eb0f4776862841583e6e31844c71f12af2e6eb1316350017f731a6be87b0dee2ed0e32ad98f72e1e86ad50a481a2b153226b532e3473020ec201", + "c08e615dc8e024d42e22553de77971c3eb19de95e178528be685c2c9fe3f64aa59541a40158a3ced9a4aa974b0fad13e57d9bc6fe182c78b5a3a9f37dbcace5a01", + "fdef54961fc0756322e658a993f3cc4e982b770483ee763fc40bfff7b37943c771e7a4f44b4bd48dee2c0a722f184f0c8faa22173c3b2f1da0a3d3ac2965f3f901" + ] + }, + { + "address": "2gQbpB4v3yXRyF6oorigjnUUQaNzM8KuQtD", + "secret": "60961b0cb2ff7ec60965404fed8b5dbf29edbec06bb8325b03957ea5cc191970", + "public": "02c4534d31801b121ff729abc6873ac9ce3fca7f8f87f4b4aa001a9990845bed33", + "signatures": [ + "8502a96792de276b98893482baea1d2d1b1cfd7aa6e028662400f3f59212b034270f86e8f98a38a8b3bc0452afe3c51730fe321833d97a6f2af0a75f239a565901", + "f80fbe0a4126504ea331b1eda8c0ba9c33ae9bbe43b80a109a7d4e2dc102a5be7aed8abf4ea85dfc6378f7a090317df37a2bcad54ca4982871aeb0fce5b497a001", + "e8e4ce06507f1aa72def1b965fe4a2eecbf5f3cc9533138be8db41e78768ac8445db94f136d8b373a21f5991679091914c849736fdf842d35e4ce9b66d38ce9e00", + "9d1a1454348343036699d8be3be97912e4b29428e3642344557e24f0ce7be7537e150b9895636e28947b4ee1a42ca037c392fbb9fcc419ce5f250718684d71cb01", + "60fd7de5912ab8b581be9d6c396c838ecdb497c706c38f45a6a2b730b8d1e5ac2562ece612d9debf93f453ae45136d131d08a53e6a1d393914571d1c551b1f2e01", + "ef9f454083f9a2550115585dcf1d45e3c3cafa1460b0730ceb1dae89ad07d07e67499e3ea50ab5798c16923325b7d33b70456425d124d0a7be86ed2efbd4133b00", + "6f8231bf2769af9d12d011798307d7faf9580135df840576dc57addb0d66eec33c343646d92bb2297a8d1085d953be6f96697c88e2f978f4033b7bf4ddafe73400", + "8667448f5154ef26d1e65a6d29f04c2a510fb97d7de90949b3f47a3aede8694d1fbabc3c16f64b698d1fdc2d986bd5e8df0ebe09ecab5399cfbab39a8ac80b9e01", + "4f964bb6101b0126e44e1e71abdb414e937b7668ee97074a69b628c15ac78d524fd45f39a1be141ead32df77a8ad0a62cfb6c05d5eafdf69d6c80932219c856a01", + "660763690925139272e41c09c27885b1c5d8aae87bbe2c02fd83d57f9db9c57a69aa933da8a4a37cb56dcaea20c0f742cfb00294dec4a6c66ce7dddb5669d9f101" + ] + }, + { + "address": "2FmtRamAEN3Eiw2eqroJt3nhHzgo9VxTvPK", + "secret": "5127d7f0c06d335e1584ddcbf4534c8a5be109ec2e28a2f40aa5491427b7452c", + "public": "03103745843f93a49c945f4fbc0bf4ff479101c22a3ece11220cafa109280b494f", + "signatures": [ + "6f9e4d1d02cca690bf0e2ed204e32b11357588a77f8605280bcb92f148cb4003166a5aef470d4e3170e68f6be369e4444b8b04290ed5a0d564e6e5f86cda0b8701", + "7e5649e2e83de29a9058fa138d253133c7bb8d0594c3cb546ade2a026796050013926bfd1a8a7bc7f92875e2275224037932568b60dfc7bc2ae2ebc6a1b0f82501", + "b5d0be26eff1bcc5ae0d03a115baa82d52cb33c13833351362cfa2bf4c2db3075f7035d08b3ae0f850c63b87358e1bfe557678bbcc7226097c9e45310f9a5e6b00", + "74352b57c8344b32c37420f636892e592842c5e1794d2bf0369d4f4dbb005406152b7725f68726df8274246e7923b2aac6e43314569cd54863158d0f9ffdcd2500", + "366cefeba68f76d1ef460ac310d0654ba8434ea30e79b445cd7481b1356482d107a7148c2495b0d143d800024cde9364aecea0d1457a8fed1a2c1de326c2777701", + "2d0a2fa37cc5e3cb4a882d0632fe2204cc26c4340a13376e7b0805264a77a32313ae46ced96592e9a25a7773b7cdb38ed0a6ed4db445c079b5cadee8202d29b900", + "ec35429af03b64053d09c0e7e1413331e261ec2652c9a5ab268fc48c8a7449d13b4f707aaa5edc48fd78feb5018fb000f53521ed9167841b618a9a27a153567500", + "d8f999ae5e660966147c9faa1acb503ad6750ba1f5fbc14fd1806eaf6667bc3636cb000d5e02f68963b7e6af546d21d0c0f4c97eb13411a03da3870c73a685d801", + "f49df2eb22d660fad6d4f529b0c645023d4c9b37822bc728bb80a28ce5cb2898618f080208f48643efd045c130025f9f3223c568a5a2505a8b2747880af730b201", + "17d9223864ee1764545b1bd74330f3d692052f42b73ae530712ce7b3a02e0336316736ae1e054e80da778e173f9cc6e93bd865e208b41ddd6bb7b8231d0af4e700" + ] + }, + { + "address": "k46MSCkDYk6ZaHcj2ytwZamLRr5w4QUEwe", + "secret": "2b1ba25cdecc2b0c4b7938c220615929abca0d1df1d673604f8b370f145467fe", + "public": "02771a319f31f4d999adb58b1df0042a525e539d6cb4bc3721efd7ab2cfcd0a3e2", + "signatures": [ + "59851f4aa542003febf2d39ebadbd07ddd12cd41a665a8fc052ba01b1c484a6d407bdc61b449cdbeadf73f6ba5866685651b7d0249527a82f965d5a2b314c4af00", + "40f631b61815f54e0a12eaac988684f4808462f19f7b76deed56ce3f3dd2bf2827104ee2ab71c3a96773de3bef7a41df960fb98329852a42be09227a1c9ed89b00", + "f539e928d4c68938eb6eddd169a09edb46c056771185968d548b7886f5c1eb9b7895cff1df13be0d70c51bffd0c98f8fee9dafb68d5d8d3bc1b2f6a5e700c9cf00", + "d1b9277ce64f26956d65b15bac44a3ec80bd2024e098be69bfb6ec36a4718aa75fb6e8b353008a20bd4dc994ae9e7bd928c6efacfbca7d2e07861e3fcd74f51301", + "bf919b227af4075ca7864fceca4dad5a21ca9c1f124fce3b8f66f8406322fb021c85aee03128fb1b43fe0ea91ea825932b4dbd468c15ffbc8e5d36f69906f45200", + "36a6c965fbaf282058fb5fefc466d9f4df508598be400eb1f9415533554c59ac18f04007eefce37f5c8e9ef7901e65deb2a2219e2aa7ab638e4370bee9c98d5d01", + "30ea0d7dc2735767bd60d85cbfb39c19d0b4a2d7aa81157a2d647c548c7eb9082b991300b5608d13eb2bae260c4eea723f92a0c1fa82a267fa34498fcec117d000", + "91ac4a1889132a827df3d7dbee5aa95a4c9b111283cc1209c0a7ff77dbe782cf31c8f32320bb3344e06a3c114e18fa0da245f4749b11a27ab918c521637d6c8700", + "8c59fa54d45f81390b67c23659c831786376bd7d730a9af1e936f09dfb0cf11321200469f6ce4c2ebd53f7ef09069c314d9742ac540c3ae90bd4dcd805ea6e3f01", + "1055cbb78a97a410fc3663dfad3bfe21865da1854cf196d1f532ae42d9161783284210305c1abd09f77f0c36131458506d3e84dc19e87a3255e1fe220018169c01" + ] + }, + { + "address": "2GAWkAhh6ddxLGT38b2XHCuhdbRx9Jvf4pk", + "secret": "e0c84b3bd790f03c58548657cad0a83cc302d1b75d7b6b3d8edfc21d8c2289cd", + "public": "028209201b8152ea8fd7f7711eeb82354f67cf1cf1b4082160f9f04eca421bea2e", + "signatures": [ + "2b390a37a9cb797fb637ba4ef700637108629067a6666d5e1ee23bf448fd171e0f7218eeb61ab445ebd7c14ed3998f3dcf0a3aa22b66e7d5a545a31a6829e5f501", + "871b75956dceef0b0edfe032290de7cc86347154cfdda5f589298e6aee850bbc2668a09c61d71f92ca98347c39e33d52193f61cdf125db85d463bd24b3805a4500", + "dcdc972a97aa2c3784a9d48a886d344a1db80a26e0015c54590621ac2fdc9c6e40149a4966a80b4b96a3f92cb40fb48043c359f44e58134c0addedba9257506b00", + "de090ac5cdfdb9082e682534f1486f426343c9aad870ad45291a8343524ddd67379f76bb35f75191ccd45c5286b48e4cf5049b975d07548b97fdb31d86c1fa5100", + "7bf2158c903b09045bedaceaff8f15603c762543d6854e60037529a20f401f766979df98a63a9432f6154b010deed9772ad21a15bc3a162b49bd5f11bd4d96ea01", + "ae300255bfb6443a65ede797bce0944bf7a503d38c4b161935f44ed2f7738e347040bb8309017d5d6c14161aaa0075f301d957c8a761b33284d6d535547bff9100", + "e61371336baabb089fe52ff52751e5e41f34820c4875f0a2cedb2e20cd8c1c2b638f3b0b04b199dcb2699428fbdd1e55ffcee0744d46c503ee125ea533d567d701", + "e22f88a49370f37b078fed65668cbdee44567ef3254693a9fc0aa181739acf2f3ced7c4ff5fc8204304122c3072c2e1dd8a44989cf6bd77ab4709d6fd1e3952400", + "76d6cb79f1529b03762fd3323fd381174568a05f7c799faed8be6a0080d89d9b3c607d378178b6e941e2fdbeaab235f2cdfd37fbfb9922170193d6508081148c01", + "1cc5722eb5e17c21114daba7c19ae25649ee79482ef8b681015f8d708aae2aca4b3abc6b345410f94193d4e9e8de50cda2f5a5e52befdfc9e7c81a42757eec3d01" + ] + }, + { + "address": "EzfiGbJmK9AtLocAbUUgKt5FbvkptAfLqC", + "secret": "4da01bf2216bb743f5412fcb843d79ed3bc22a03ff7ca0b314255fd622d90874", + "public": "0342b3d108f4f046af97cd92244b841b6ada34f52548d944d3e22344a952e3d173", + "signatures": [ + "d320e4335cad33aee05f4149326c9975464d2b8b0f24fb0ecd68d57c19f6df3f3dd0df782322bfab34be399762e3c43c91e8e61fb2d52d9d41b63663ced9e71c01", + "ac536af52e3f49f392a5612bb227c25c3ab58c60b6d2646ca43b465d409620230a52304d22c942f28d5a6f7d2e69093e828027dd6dd5ba4af5e91a6fa423cb1000", + "922a0df5d51a5a7f64b42a2a3491842350cb37f3d3331e14cc2458e449f384f158b9d6814017cf2b8dbba0962315808163af33dc85f73339aea0db2f1249e4c901", + "19ab17f648411a76c8011199a3f648bf4678ec8086ee97bdfd09a6abac3703190d75dd1444404a97505401e5c5465cff9c73f8281ab300ea2bb473647265cf3301", + "df43f4d301309340903b862f6002d8746b622c7f8aebbbe6a3b9fac0d17e8e933a32313dc3faec39590c414d5d9dac92705e72c45be95a1e53c9476c96b35f8400", + "91af75028b21573abc40d3b7a652850202898b2692e5fc77223ea7c8bcac75f002d42a0968e9bd12cddd0f5dfe8372f441dec2108650d8892ec133428099951601", + "4ea9d6a9cd5a4298b9649a83837a1492339c53fc2db3e120003f5e3f33e13984739b7f2fdebc10ba7b465e000c2167e8b215f250379d7c864f98d16e6d9e130901", + "61ba9794787249f40c9d49e451f7605d7e7df411db3e6833f3ec6b436139583615644f11da4e650dd170c501e6f4011691c9dd1eb8371f7e06b5de59cb4767b800", + "8e3ce6420e9e3ffb84d87f4b62738114f93afc76650c184445e5e625b7470fd01f1052b3c85f629053fad8bc8e2b356885f1cb82e647254d4e5f79d86cc94f4d01", + "2966a1e0262bb90144cbcbce45fbe477f9ff135ec4aa59f8fed4225ad88c8acb4eb639cf1dfffd7f702b7c9695b427dd91274904394597bb83209f00b7403a8900" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0007.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0007.golden new file mode 100755 index 0000000..a62353f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0007.golden @@ -0,0 +1,175 @@ +{ + "seed": "cGlsbCBnZW5yZSBwYW50aGVyIGZhY3VsdHkgZ3JhY2UgZ29zcGVsIHJpYiBpY2UgcmVmbGVjdCBzbGFiIHRoZXkgamF6eg==", + "keys": [ + { + "address": "mPSsNuUTsMdvc6afNScJGAYWLTK6zjpaXr", + "secret": "b4635dce2ea621928c61bbfb2132090c674e99b9ca6017a6c7ab33dfdbefdee8", + "public": "028e6507a815ed048711b7bc74214addda37b5197d3128419fe2cf1f46aa6f4da6", + "signatures": [ + "8669aca771dc0437ff8e12b65ad4458b4e38c1bcb1b1ff29f8182780057942b82f5877933306f93753d76c5e74d0915bbc8ab62c6a641b2bd7ccea69797f5ac700", + "97ea4fdd2fec0593c93c8d37f2e938057fb570f023e73b8b441d5eeabfc2a72764a3f851f7da5c5f3af3d969d87f86fa905cc9f1bf6472e2a749f60d6891b2d901", + "4ef65b166932549734074a92f77266c70696f2ec5d64aee324f6cc68cc6dc20b0fbdfac4d871c47bfe97f11070ef74900f9da818bd5a0f44bab01b35cd47fb7501", + "da6383da7ae60f724056a120280e8fa24abcf08c0ee32024165090edc7e472b14c81d41c9d52b637efc1c7114ab65f53890251caede1dfed2ad2beda0bb57b6c00", + "ca7d081115500cb95a9b8e4990429f2d1df284ee6088503721c100d8132c54ac1298e9b79b1546a09877e658735192292283d8396734607a90905c98c7f5b1d301", + "50906532962f9b50c8db4a9836669fd0d62f7a33d3d58b33e95cdad4ddc99f207c9f75fb0fedcda2f87ced5fc9d48e2eaef274a7395d68f31749282ca96f729100", + "e316c729311f1cb873bb245e128775948f4782f9e36e9112bea1d4c1ac8644ce2b3c4c914b1ac36c102fcef8e99391ecdd5bcfae3bafcbb002c5b0f6eba25b5c01", + "af312200f509edd20bec70328b8f88ba71a57b299b46799d15d9a8afbc7ff2a173d7f67a70b7a527e7bdca3ca0d0980cf84efbee41d2eebcea8d81d79da6843c00", + "04c2cd593c4cba96a0fe54fc119b3fd00efb82bb20bd71aed1fbbaca05a588a239f4975d39351bc085a2b8c0043a08ee09351e3594554a23b357fb5223f7769801", + "792267a2445428980b35e0d59f3f656bd4c71f0e6c4b8fd1f89930060d90ad8b26dfe4e4aeae7df72b42e7d4b5a5781c402cbeed51a23302f65c321a2d847d6801" + ] + }, + { + "address": "2Necqw9k3NCEtj9FY28Kx7NV5nSCGQ1joHi", + "secret": "7655913737a47a580d2c388440d9236a0283050aadc7b167f2584e9878b066b2", + "public": "02bd478e24155889b48977d6ac97fc7bdedd146fb2c983960e28d63a20a1adb6c5", + "signatures": [ + "aee5eee74330efeb184999e59b5b26516a124f6c320d9df6167cad45ff297c4f43525905e5fdf73f07f6925cb4084fca43fbfeffaff5eee81d52f53ca08d2c3e00", + "d97bdbc541dd80006dcc5e4c6001f044e20ebfae2f6410a2af7e44acb9ff4c0f68e0debc89784258f6f8d04e0d58e4342ddf0ea52dfbfcd693dfd00b6cae60a401", + "726eb4a9402228f925da2aa936b635bf1d3b587e7566620f0d5e359a0596c35d62a786f1d604d5109420e3449232622c3ea440341715119821c8392908e0db3601", + "b591beb1c89636c14a82694323df81508bfd6f209ffa768d0f2f74b27b2572aa65719c48732ea457e628ffd68fe3125801336f147968da55f8165ec020f480bc01", + "9f5ea12b545d1ca7f4ede6515e4f88e92aeb075e470d69a4a5df5b8516eafcdf762be8995c70fc788f886a7440781c95c384f7a8a4cd5e9a7e228366374ece3b01", + "f8e7277a042429076ceddc5b896f6ed69864776dc904572cb499be4672b16d0613e046fc3626a953343046c60e86114f59a24e46ef96f5b7032b8b204d18f4ad01", + "2c4b74070467fc30c8f902cffd43cfb21e7d5dce587fd1ebb07ad4374df020e240c0191cd5e68f4913d1b99a87f9c68cb59bb877296aa6a531e6bad860c0ab5300", + "00a0d16272360c4f47de24be8962cd3f3cdc13fbc8ea64aa57f138f12b9de5082ce3ee1e50906b74552dd5f99cb10d517e4aeffd308b43f680443a223363b9cd00", + "3aa6aa35b15eda95eee58a82e8a2e54780b77248e6020149407e3981a721129401319fe05da2a9e768baf195547c5180c52bd2b862af445b5b0ad50f8557aaf900", + "863ad24a59dcfd63da8c41af9334137277cbfedaed35c0c85d1424751c3cd871191ae55d8227dafbbf9596966a759c77fea4da7a2eaabf126aa47e9608cc000400" + ] + }, + { + "address": "ajzwXmj91ZKMnHeJ8LasEEzjd43fGJo2P9", + "secret": "b1410fe8b4705b209bdbce08b800017e52d34ebb5cbf62f84bfba61c146312c6", + "public": "033c8dcfced958c25c2e522a854c102da4901ab2985474183e3563b5540b4c7b00", + "signatures": [ + "24643acd511ef7d7310f30d42c6e627cd7fe33681b5a6e3752f3a29176b44c7a547dd22d421019223d0575478cd20ce96931afd3ce50bab7ec7814b07f5690a701", + "20300a8466aa41d9ca854c4cd18291d6aafb8be050db7553573493387ea56808494e4bfe7bd40670813ead46f6dceb0bc147faa7804eed7738de4588466f800300", + "8d47354f77889b8b6e5c91af0771b6c6a1f8cdc704184a635fe06ed839f054ae264189d96c05444c3412a352e5141e08adfdb9f71a6694f98b029d43dd47251101", + "a13d77d2f566e73cdf93b915f24ca8408716400261ae15997dd6ce6a7ea0372e03def52420d5951645211c59057f911215ef25f8534867da690ff90fd9f7247f00", + "0980bb01721d53f0498801b77ac4d916a89f17c243f8e6323fa0988245dfd6c74d2919c4dccf3732567349349fe83be40c0dd068e9b49517cf15d0700ab1811501", + "d8f02afe36134fa6b42a649fc5c779a2c22edf4ab828da68c5f891d99823a3a72345a4e0a0770404f890fb385bd306a4d25e92a6dd5e6d1fdaebac427c10c3c600", + "706d0784c82536a5f2b79622a8c6c73bcccf8384dd22c4b0d2a8bee0918e1492240ff03af79937797292475464e04cd0976bf3a9ce3602405f6808c9af98bfd800", + "cc27141a61bcafeb90ff4a55c25b2f80f5a4a8bf1d9b23dc56990b06ea523a91650b356d9a24b9624fe74541a117542d2f20992bf047114680c8d2169dd6404b01", + "052427033c268b9b576a93fa05513f07f5fe090aa1040d94ed116db202e064af58e2f05f9ebee6f405448ec70e41173ad39e29f8462e6a4a82c6e76e2790b94700", + "215d08a564e5fef911b8fa1b7dfb84d9d7013501efc3ab92a7ea2bce8282dd8c31db5c2bbfb44df63b8b93e6bd2099cab367ed1d9584b432c85018f816b7302a01" + ] + }, + { + "address": "KAcJer4yML3KndgxtHGs2SoGLmRTxJCynf", + "secret": "4a5e44f0036c42fde00ec8dc633969474fabda864e45f5035b18f4d15c8321aa", + "public": "03f7d1f72c91c5e6878c76cd1e5b84996a0c0a8ef36efb550d01f7af459606b48b", + "signatures": [ + "3a5ff4fe01d7cb3739f2976746d396eb18f1f181bd5948395d4c41e7326ade1215da758964d42ba65158bf7e03ff8c7eb7c0dfbc914eb365e1fc0ea6c02b24eb01", + "3c391bba2682abef47fdff47022a590859abb9e95fb7dbe7317f6094901189160b114cdf44b240851c939f22e1540ff3086f91340b3c3b842fea5fffcadeab6100", + "c2be33d40825d186a950a653b61cad1b16ec0429689867a82b0f44f1a6cd633d03a6e6272e0cb886f1bff6a014516cf181a2cf6e12658d6ff32d6b32d69eedc300", + "4cce6a1330e0e838aae3747ca45f35b9df835f8744fc4ea10aecc7aa0f14946c3a780554f6fb2de15ba38c067b5e13d7d88c31c9e77bf622339cdbbc3be985fe01", + "7513352f17bf50544d3b808f9be00b9263f4328ce98db10f3f8e6e601145673c0bb2ac0dbe4784a370434d45f209dbd6afe1c4c26e0e7f8eb2427b94293f91c500", + "3f3bc0a9d2979a813bc0e1d9f6f755fa0f542796c3a2db18c04c39aeeb1822842c4d1373bd524c45aa8b537b71e5848ffefc65871b3b91e753e54ea1dc66acb501", + "1ebfd245fb5b3654ccd95be0e7f4a644896c5e5ba758778d77de878f860e4d8a3a4c33f7407db1fc5734672fb046a5c02776e13c0d56eb8ff8105ba68d52cda901", + "49e5a8fbad3e381488d6ef1ff2a8d58167cd1d17edb597c8e88a24b6e5e17e8c442d4eaca8e1bc7050bbfd439a86e857a9cdf1b704d5aa2addb016eb5af77a1e00", + "36a9f46810244e5eb23e823965a83224cf2783c140f6042fb35568ce9abb33242616c0ef0b619d9034205f01b4b7155a8237c9745fe905078dc4bd2c8fb8599001", + "e016afc5f089018881eb7516cbd07e37e044565aa826d7e37c9aea005be336f158eda455c30e03eb7cfd56bb79c5895dab15ae575b18d4b1b2de8a8645529a5601" + ] + }, + { + "address": "X8yAtMRCVageKAgRixGESP5vRJoe1evT9w", + "secret": "e2107eba690b1df6e0d3a08373921d0a19ac491bb10380e40dc6717ed11bdd16", + "public": "036a17b121be33dce4f868d591c82268cc86d765db3b86a447ea50b7d1915db8be", + "signatures": [ + "90fdd824c80b4d683ad26e8950aaa9c9459891374e6d519154e16833d9c6ee801c5d7d202c204e85530ae4ee0a38e9b115528bb3446364c945d529f9dd1d185601", + "b51a66267ef5c3373cd2d19e569d65349acbd3e1bf2e4422f5ef9fefbfbefc4c18fbd07ab1d008c887cb52c179dd15c7ad1f6a348a5bac45071b62ad4f9690a900", + "629bdb73080d5a2148d3a6d68e46c29509285edca81d9ec602a6eae1ee1fc31b4cc421a925e5c1a55f77ececbe201146afcc93ebb1376bcdc8a0950f61a3010c00", + "e392a4bde506161eac5473a3f646d3a153efb718405bc3ca96ae4d6d302c25964ac38e211ecb52564f459098f865f3b7000e58f30afc444a6b9fd6837a61b90500", + "7ac54bbdaa5a2b800904fc79cee2b55a6a2953b31292824bdfe2796228b2c97c06a0d1032adf26570c139ca5ceb7ea17d677be5e32f3d73edb61b49dd21e312a00", + "7f4e56604ebece2f589ba9cc8bdd3ceed3cae3bc7c737946c69637613a497b0a22d7bf916b70cd40fa7532cf91bff9d48c9cedc0e8fcc24c2a1d5a70ecbc51f200", + "74b00a4928e33bc6121e6eb622707487fad27282c736620892c0015b7b7db96a1e94f3a19f0da4096c8034456185107911c25a01248afdfd4a49f98f38bce89001", + "8a880ee824069f49a1f4e7d5cd76d70b44990cb8902379ae64713921bd8c0ebb4e6f63f4c3849e3fcce331f77c080120cf2409aded25bf48000c64a2515cd28401", + "4121056c8a3696b6158d8e3301e23c514a5863ecc1926db3c6ca313583098fc409d61ec72f9d3bcd0c215defe6cd5a07c4b2aa062e55c9c4e631ac3db237443e01", + "264e63e3df6bf4495d12d1df6db295b61ce99b9e477c1a3e6ac9fa413a11410455f173038160aaea178bcc71a3da7deefb70fac5f1f7fdc9dcfcf8d5d2f74ce901" + ] + }, + { + "address": "2XKCgWpkUHdPxBhzgN6RNFDQSFDpbfjTM97", + "secret": "bd04dd38b12d99d5d99da868871ce4c8ec3005e615043e7f6ef766bbfa041d88", + "public": "02037e40467e07e07528f1076e64429ce8efc955ac73b741f2775df7ab7c83e9dc", + "signatures": [ + "25a7ebaeaa0eba12d350cd2e022fffa3ee7d73b60bcfb1b7dc6ea3a930ab16e065a23d7caf1f79bdb390e3de2b1c09371ff22369a1b51a0ebfbee5a11d20883a01", + "d3d06e33fd3597af973851f1ef82278083f8a8a6bd58c6d33ce59264cbcd26a13daf8906cf2699c3846e64a2fd7e7dfbb092f2e4e3925157cfaea7788b8efd0900", + "e97b9b1349bd9b38912270f20c664b1f52c1ccf2dc6122c089fb6bba1c9a1864430ba63af58748de4f3c2d97172577a0b7bc659a31be9e492af81a612d3ca66601", + "5b69a9fef8e54fc5e262b62a5de331a9a7f16dcbe41f61799d367c0a4d965e8b1bbef4bce114397dba8d01b8a86a87f1ebb03ed8f3b3250d95c72963acbb7f8400", + "c34181e4a138f719197db757f12063cf844e5ce384594122b7ea668063a2dea318b00fd391471fa4a6b951f9d3cfac173ff2f4204e912f4a762f6f3eed2ee30c01", + "585ed7c1228fd22d7d481cb6e3c484c8749572050aad297aa9e406b948ec42d67430f39a4a7c46b65e876eecd8d4383aa89ce4eaff4268802cf1369663be9c4000", + "a3ba44c0e700bb0cf95efc6b0c215af840d929522d6f46efd6bd2f4b3d03bbd822139ae82e476b0d8419db6b106418286800d420fa6017ad460980e499ff547600", + "23d1eb4d7379ebdb764e6c99949a8ddd76306f351559db3e6b20aa44b5cd2b201ae1656f92dff367ef9b1608e98206fa97a61291ac28b1894d06a8267751dce000", + "9b61d09bdfca7e6c22fc89e1e60a85b94641fb2496d9259d9a277a48403551351505f6c412a67cfa2870fd43cffadb11d83c46b3abc9e2d7e335db819d775a8201", + "8da42dbeb2e06fc69ecafeb7bf9cb06f1f7c18ff16fcd0e1a3260dfe9302293e68d0408cdb6d2264a979a1eb855d503af18248beadb95ad14ced7fd4b65c516500" + ] + }, + { + "address": "WmcZyCWxhWWBXhcW1KuBf9ft1j8wzTw9EU", + "secret": "47cdecfb4697492b71ea68c871fbffcd3d7ab6df36f5cb744c7530c88a775703", + "public": "0393d74aaf73d8bda3199efcc619d7bb3f26cfc95800e3a0ab5ea029182669a0e6", + "signatures": [ + "0cd5e03900cb1f6b9217a68b5456595a5e8693e247d06b59ff1df287b4c8d3bf7a39ae9e794c3ccca84fed36b447b6256df5b6886b73d1f15a47efab6ed7abd101", + "1ee6a768810935fb72d74ca1fb946786c944cb335b1cd95c33d10e1a5ac16e0e18f6a0e4102e99ddb6cfcda7faf4ab49e1a93e1133d488aa6c23ce1a5fe251f201", + "001e7e58de32386c7e5d3b64a967ab804fb147cea16b184c2644a8685922fada0f648c9223baadbde6e637be0ce26bf477d1b2922decd993e1d97bf968b7972100", + "2bc7c3a115f6fe9fabe9a0ac3729d665621e0a1ef5026c41fb65f328914b84a6228cc3491dc07a5cd5f0b6c6a9373b1aa6f4a51f1bd370b74a2827f1773fe31501", + "bd114507fae6943f5adc330ce600b1bb8f67f72bb57f2975348f91e85a5e333440bb6cfbe0b692f63e6aa1e14ddbf62078adf5f6a620dad5b88659ac89485c5600", + "4a147ee3c96cb3563c1b06b251eb947f18ebd45c13d5121745cb0c2676a1dac47e41569699501664495527228cb5d5227e77262a6fee592c2e39d4d076ba736600", + "869de9726a35885a2e1542d059e38637f07a1f7a748f85e248b10a21321fb7a90c895931eedb897d99608115cb3e95e5f3464402099b451b14ccda964585abec00", + "e04d0d2574924c2e42c0402a8586463c68f0c9817c2eab2b0ae12d7614602e5f51a1e3ca41dbed052456c8efe96101c6176af9ef79b785351623b53c8028b2e401", + "d8b3678390136043eb595c3440e891d217024abbe8bcbf8fe359bef38282298b7b3250ca4fd74036386a480529d24bd23facf4b109bc565c61c47ad3515c3d5901", + "77e465dcfb285aee33e2c07ffd22e0cbe66123fdb6d83139f26b2eb5a151e6cc3df0614f9a4687207877f573c9a776bbe8e8582ec76264e68cba2e23db6f866300" + ] + }, + { + "address": "sQsVTtmRVSBQvXB66Li2HmZFqxjJNt174d", + "secret": "dda8c4aed2d9dd515df72e4a31c3fd05815f7ed3b2f2b2e203d12f7fc48f90ef", + "public": "020dedd0243219fec27920385309b31ea68d3418df5cba597bbba0dc794fff11f8", + "signatures": [ + "9e6b99596d5fa55c07c9daaa893ff65cd713aeb723337996c51e3a42b13bf76e04090eaa3365a5d6297065e229e21315b60e14411ad660d8a74a4c1e2ff4dc9901", + "320954de1ac17b54446863320f55e18ecbf4dd65bab9288d18f25ec163762b42132ff562af17f2b8f2c759f96b2dbe0f4642376c8e8b64164f3ee323dc26bcaf00", + "00e678398b522707f33435ad16714372447cc0dfb0857f744d86fe3cdae1f375235dd78bf6d07eb559b844971754f8199999105b76b0994501fa34c96333c4a400", + "8b8d6c37c63458744011eb7f181e9221029081910565fdb34e4e4ee70ae992df04f005ef1da8920bb820b124571093ae59b2b75e87c6de069c109c308d61314b00", + "45acf679d22c6727f187a2e2516599d1597e8ba0ec268918e2b0ccada99c85136cdecba2d94cf31137b612e87819fa2fd0efcca7aa85771c9ac9f13b00c74afa01", + "1f3b2ae803fb5605cc4d698c1787777d448eefe2deb2571975886c62bf1f83881543913b7182358d7457842be6937a3fbf142ae776180ee2a0488e568898240a00", + "19902fc27e1b56e81e2f98fb4f89b8f15a716c96dca83407917ed615674b77bf0cbf8f7de42fb19da7d40d7de49e8eed4d24d0e260c3421184688b1bdc07cca200", + "c40fb53834a3198829961133e3543d786ba2719b89a059022affd7f3820a38727523fa0dccbf645b492780af141c0ddbdb421fff18f8f97a15e2d7d18114d66c01", + "5c65768f4ccbce98584a050c845264a6a19233260e7d711c48ace814d0820c43681f2d175722518df44cd135c759f54082c9eb866c967892df43875156a9420701", + "5c91737f504558b000539d368aba1c5ea62d4b5346ecac64ffcd2b5ef820b01675a58703e39a55889d1128f678f0ee13ba0170b11fdd6a02eeab87f5485eb79901" + ] + }, + { + "address": "HAZJiBg33BdkdW3RLqg6CmUe9rTyjobvfM", + "secret": "2d046d99674e756338789b24c04cbbd0c022c06482f7592a19dab3d8da473135", + "public": "03c5784476d10e4110236c60af26f085d3f7bebcfae0a2cc06ddc95e8dfe01da4c", + "signatures": [ + "7ac208a7d530b1b5777b6416ca89d52e3fd4047d488cfc043dbf655cdbf535c55ae6234531e652376dc034ed3620b64fc7182a4e712569d07f4bfffda421cdff01", + "c8c0f9e69ff25a3a79fcd78efacdba7255fe22e69907fbb23164c6dacf74f0da013213ab8b072dcb11429e4de0d8a5080063b09a613fdd5ecad1028374c3a0e100", + "519ec555c35fd5669e00aab7c8a6d244361f11934b154e026194485d456c019e69eba81ccd983a62ca529ca3203e3a1e8d98e09c5b38044f1e47628f8e6deed000", + "ee211016b58172b2b28cbf34e501484126ac1f49ee1b89d8c2d4f03bdce628382e07f7f7f1fce3ea0b24e413452660a061377f8df4161fba404c48c07f96529a01", + "333d5e802b0b72c72c6bd615521cb3b557cd4ee15a58134e18c7305bb9f909223c4ef26dc3fc26c63a064f88cd1ed77c2a7bcf9a9f530fe7080ce102032b680d00", + "c251824690e71e8766f8896aa79b37054be3e0c981836a664066adde3cee3e482c240364fdcd5cb1398c7af02671f4a999a6ae5313db94f7c13a97b3b4a1b72100", + "2e674b3e7a2988f2d1cd6ea8440a13f78bc9a0dd948c1cb6b2ebc89b766af4531b31de154016462426d7b3594ac2283214d6f5f7cffdeab426fb83ac9f91882f01", + "0d923ce2a834ec22daa222c5997d439406be1e41b1ce8e10110568fceea3b64a2f8b4ca395d2b7be1d1eea8c47845e683ad9c5d26e1f58fb639c07ed8476e60600", + "ced0ca11d628b4f1eeda80ae34c312aa5140c65b781cb7848952bebf3a66c926424f8fa8b605c1542261a088290ca4e2854567be62620fc6920fea5b3d8a1d2501", + "0a83eccbd0c8df9b0f8ad166d892b84d85b2861d945539b124f657400d52c8261db09b5eea6d03e181d38af344c49e3f6356444bc7bb2a93c7662666daf0c2ff01" + ] + }, + { + "address": "KAU6CLysbrc41MdFKHNioXsJNcFQTLZSWV", + "secret": "fd2de4b3e1284eee8ec5884d92ae5841bef651fa324b001bbf99b7a96a4ee232", + "public": "032548366a5a732e4b389f8fa5d8c0e5debe5be166de2b557fd58dc78d1693de2d", + "signatures": [ + "fd3b22598a78353042190783d3410bf0bccab1331a4e167a2f60057a5511a4425953fe8b7d7099b96f711eec98078ab44c14c4638a8055f750f79384cd5c9e2b00", + "7b6157888227e72af6d22f2964ae61a8d3dc12fc72396b5302e65d2bdfa0e54e13128e531490afe48a7b75e31461587f67f741fd78cb6b15b4da8d8b12fd44e000", + "41b4944313bbb5414956049204dc8cccb782c664cc990e31447904ee317ae75655df2780d60aee06d80a99d6cde3731024d364238cf48ece1129b9f6d9e5e6cd01", + "aa892a1e3becba91b7d2ae3aeb04309e6be4221bc972100fce3f275e6982b8b2124e21016d5edcf8d533b5dc25ccab9656927fa03d6428c4ae8c8fc01be830ef01", + "b7757db90ae36a75c0730786e121567715dfef02f0fde002c56fce4282fae3f1386007b9d6889550e26d756cdf9b22e29614e9ca8325f285e9d19737a8fd768601", + "12a0c556c743f4e10cf60d8e25cf19520b2c83ff10aa508000f9153c38c7b00f4a13bc9c453d6037ad048e3cd4484fbba37ed072698dce7dbdf8a6a153bd1b7801", + "7eba52f7fa4a007f022cefde6a293ba46166420552b06855b34419392a8e906b10005884da94e87f677183f622c0de3066a5e73e1e512107892c967fc71094de00", + "602b4fdd642fbe5630e36c80409db56bf49c672080dfacca681933d086cac6184fec501ffec1e53a0695e06fda2781e33c44f601b2047c2c9392a16f195ff3c701", + "4f09c6bfb9a839e67c39ea1b44ddb21fb4c25808b9d72e8eb2a0667c9b79464d4f2b74908d3c0307eac43bc648467cc5ff3efbb3b500d5f2d110dbac977a18b601", + "f7635143e6d3dc5ffc4918944a4dbd783c7fffced7b8db8c243677af745750b72101ba863d037c27c862a02acabcd897850f34f3b4e7c649de784c937391332c01" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0008.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0008.golden new file mode 100755 index 0000000..0feb035 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0008.golden @@ -0,0 +1,175 @@ +{ + "seed": "c2xpY2UgZGVtYW5kIGR1dHkgZm9sZCBob25leSByb3lhbCBvcHRpb24gZnVlbCBmb2FtIGdob3N0IHRvb2wgd2VsY29tZQ==", + "keys": [ + { + "address": "2hBixkyUneVyeWK8HXr9S5wTuHPPjLQfVNk", + "secret": "a4196da38de61394985555f95c8cb063b055f11a654806d1bc9000ca65fd48b8", + "public": "026a7c59d51fd0412c7964e85d428e8e7f462596bf55b6e92fb42dda47523fda13", + "signatures": [ + "2d324fb86d84dce6babbab85615e3fa8fcf40db5265eb12c7d2177463d414f4074f46bfea5af54d9a1e4718d6a3854ad3dd0c07218f7b337b0451677ea1f553a00", + "6eb90b199fb3777ea55a938d99eb0aa5660000bc12945cd7500bc3e465e00fee5eb0779fe7f83d04858928376bbe74faef7b10477fdb78247f5e5f45318d5d4000", + "32e36ef19c712fdd1080090d5231e8c1a756161b26da3d55c8fd86994d66d8c07ce4f774fd2e05d75ffcf9ba6a38396ea58774e6db1d8858232cb1be6a394d8901", + "9cd97b11b5fefde1a0418d6b52436c6cac206e79ebe124053bf365e5d9ed9db042a9b0fe513c3cfaf790af1bc5711b45ccc5ed0724c44e33eec62ab3bc460e4800", + "00b53304db9b47062c92c91a392e104e51cb91ece9426434f32fff31ea1fbddb5324cd9906564c603c8a36ae54f19748a281474ecc8ec788677dc15f3c5ddc1b01", + "41d8e48ebc1a724a242024ef1a2121077cff8f2bd78f27893ebbc14442854f3036094b99ab8f8c7c662005cb32b3bad03858a9d47a8d8eec0c0829d06f37d31b00", + "eaa1f2b114c70d7a04c9eda7892c615ff33b4f0f05e2e9b8b28bc0f5672c04d95f84f284912bf8222b80ce237294c163ee2ee928f0400b1602979de890b8330d01", + "3b4586cc527ab41c6c65383dee57a12000a2f3df181cfbad65511a6203666640681286b23cf890e72405023ed282d67c060433b93a0601e2c0014e7deaa1b92100", + "05ddb5df8ad91c32b933a1fe8c0ae217287f51494635f5dc46f3b8c0c58ed8e54b0f1a522ebef697d41bb7a776702fd7f81710db217346f372acf2140a0a0b7200", + "9fa9c7e922a89fe3f9beb528fc030b9ef53284144e92b95a13cfd19bce14dd9f19d5407a8c4273b6c17fd61c73178b7af32c8c217f00a131f3625cd145c08acf00" + ] + }, + { + "address": "2X1uf2u1LK2S8CC8e3VWGVLjiVhHGkPyB51", + "secret": "46d449a4e9edcfd54dc0d21d75797421a3f0aaf6363b4fa489e3889a8dcb34d5", + "public": "03c164e6e935c29b4a93ba87cbcdabc49b8639bdc69f1e89dcffc026dfac7393c8", + "signatures": [ + "2bb7fae7a294a511468194fcbe2000cc7d4e3da84dba19226f89f446c9cd67853a1d6b9519354c9de307f10d9a375aa4f2af3601de56312b087a15317f40938001", + "b84ecbc6f15a0e377bc74efa502029ac87b55bc3d3ffc79867c41c909d34b7112ea1353b9da4024eb3f083bbbc04214f5332cb2d4d25bfb4b47ae0f95515ef9c01", + "1c9a32563e107c5d225dad141db80175d92997dd44ac7b1d0f6c2b0c5fba018373276221bf930f508ffe429ab0efd1a88cf54449d26992cb392983f0f7785dd800", + "df150b6b76ce86e688e3817fc10d16aac4da2e5723ce75181254269175e491a613e7d69f892d718d10fd5a8abc54fc266c731b33f77599c0a30b9186d6cf8dbd00", + "e869020afcdbcc8c07ee6dd356f83daa1aa5522aa3c2d9a0627c76e4745f0d0f4e3593a69a6a22ad3e5ddf7759b6d9ffa36f0c081f5462cb1cc76765da12e50600", + "3ab42e19889ca8527bc75dd3a320ffc7602371ae754c28cc61d2ad986268ab62790a940a0f9a9e7a9c1b32c0f98fd2c52c55171fb7de8f5b4f339997df46e76800", + "20a89d2aa6ebc277ad374e1ba8a8cb54bba5da83f4b0b786d71f7118c87bc73e680641af294c70a4bd5c6d837a8ae373a272e56e1ef6879ef2868c0d40f67a3e01", + "7a12400e7ba39600a1b2dfd9da749b34eff25246c83ecdea065cdf5f1df5046937cfeeab9c9096c678ad27b96ceaeca81e6cd20c00d23b7aabcaa13143649fdf00", + "389b8fab74bd3c02c51029543663f8930e3b37aba3ae08264761ec8cd77fbcbc24fa5bf47482ff4db62ece7ce5c9f8554b685379256228e208f7d65a8e33c37c00", + "351ff96e4913784381de11fda7b52abb87d4b786add98e534d215236100f44922435e0f8e8a264d720a8b49b88307be2a098c0614610a216dbe8862f5e51d4cb01" + ] + }, + { + "address": "nTsFenEp3j6vda1f5uRe4d8H7ZEXQkHEZ3", + "secret": "c7bee90a73f6cffb9abcb920ee497fe7522fff3ec46b35cae5f07bf3fb0490a2", + "public": "037d3dfc78dfa302b464ef903a085fddf94251587290d965754d8530be02322743", + "signatures": [ + "8869ee2ff57bb97475d007f70279f9e3b81193259e64e2bed77957e8f6cdfcbb4ab2501d617c5ca2d1dc89233817a0b91f5a8a2d23aae07354d5ebbe97a3dd9c00", + "10af988a9c826232bafc857dbdde32c76cd6532d0213f101d4afa3994da15a261210b9ae7b69273b538fb6c3deb17cd53113f3b1cb01ac9e8604d209cc78cab900", + "6e858a10f3ddf96b2fd8d49806dca2dcb0745979e288c8a4a913e7bf6c722a531d285d2f081164d414af64bfa8ef6c8c9928ed7d25cce9bb28a698582802fa0d00", + "3b1ae90d38869d522cc70e6d4a51063bab5eceaef100cba3190c15dd63681067700cf336565409075b825e4031112e1eb0bcd209a7a0f5a99eae804b9599104601", + "4bd286c40792b96bf0d1588be470b96d2fd2e4ad7ec3d48e81fc129a95274b9b5ac15138902cab4112730ab83767dbd9845fb3157dfc89131a5e4f36fa63fc0f01", + "1270a0b3f00f41e1f10eb53fdcb5de369585bd95a0900231c7e7f03c2b0cec942adae9e17a043774bec2e40d36fa15e4c9adfb9133cb8ede06d07f840137c57601", + "8a12e03ae27a954c4f8e865fa6428ef4806c40391015962d9ed151a9cfe3a87274a3b1095b76e47aa72e01512bf5d412caca5e336c198f82db668bea7abc452f01", + "1ee1f0fcac14db2ce6203065e58f80fd7e518a56904dba875928baac48abf454513225dd572c9d3c28c11580a7b480dd8c34c24baa2a895ee5b61b0613ba507300", + "d0bd8fbb858f52de5f38029c5251941a0a2cfdf3cfaf8da684db747b4470f6943fe545e9c31a8666546d5d1b67399fa013394418f638de3fdb54d93d68347d2c00", + "cc8842288635cecfcf885db9863a870674d37285a795a326ea11ce93aff2aef0372e06054831dd776cf0d986e7e01a05070a2572bb7926635fe153a464e64e3400" + ] + }, + { + "address": "2Zj9ehnjn7c2P9AcoxbvQPBiX72yjHEJaPb", + "secret": "8727e233f4165d2cf3805052e9df916b81a19d2e859c48e15576fba347d4123b", + "public": "03ec84a0cebc8c690f106fde7df91b86f7b7dd2bd6bbc15d19b6813d11bf523113", + "signatures": [ + "d878d051562f5872f20cf27067b54b677a7ed2ab44e4b88791933369e632993244d88b54060d3253e60afaffc30d8f89b6de5fedba6c90dad01ab9680ad2796a00", + "fb2f87e024946cbdeb11fca226d0efcbdb7d5c27e24b260bb1f6184bdb6446881917d5ab8e0f780fffa13b9459c6e751de391b3d7f1c61938736f8df5550534401", + "3d6b8527fb2b455a6d8565bef090728d3e0ba88b5f1a0599d296d21f268763120ab02a9f3521a96c4e93ad369080db860f6c00da586e91664e5cc410d9b6e99b00", + "baf8d8164e225bcef8a8ded4d54980af405fb6ff28281a16f64586f78a1a0d82670cdf6195f9ae7bc2a7ae9d9f5e32f81e5e6623e239005f4db8cf84ba85c10200", + "90f5ed24882e6e7dfd4eea059e3ac3d2414fb9d1cf7f58156be9e194c1d35e1b44b063a7c81c595d7e818ac6b28aa4aabfc9d8dab2d9c34310d6432dbbc5907101", + "cac8341488306402682b33e723ace25e45f599520753b65f0744cdaa64b14069255126d9d7ad18e219794165f6b723c500e72195ac535a554092444b0c9ebe6000", + "e8e3a8a6937abe48b730de30c5f486f9dc583f7054315c8c96c51e54be8a76772b476fea0543d6f825aa02fb8fb6b7b4c9350bb33889b16eb968fcfc3a64678500", + "cfd8a7cda65e598602bb91d522bb328a3a273b803b6e0e209019987487b1de7a52a87fbce1a87df47756a94ce97e3c51d6f4e66703f2c4893ab11304c407e56001", + "206e31703569b50ac2b2fe0d7d128dc53200a7f84ae74c0cd5153271e9d9d4367a9ad4d7c6b19236b836394ac40a1723468f96a35f4e813d4dc499f50feec2d300", + "7235cdbf150eaf66951644d4fc07226997c313c33eeb171f0bffc5548223317a2c6d933f970656babddba290e044a03d880eb5cb2d77d3036c3f925dd9b7a46201" + ] + }, + { + "address": "4DueLL7QCMVrwsbR5ydfJ9pnR8vahYytBz", + "secret": "ae81bed68945bf50c190e743deb49273168569001e452be70725e1d4844594b4", + "public": "0295546a4287fb64ae8077ac4b8ea13768122654901492f3920541d76bd2b7acc4", + "signatures": [ + "bdbb583965e1281daa47dc4010c30251dfd30473e44348dd9111d517117f5d4b56c6ed8d137e0eb0e68634e196266c0c8de51d5250549a760c46d1198ca7795a00", + "be84724248bfbe549ec32ba7c06ab7d40f0671248b349e9b4587a248a2459cc31f0fcceb2da8a5d5715dbcd9ac92082029bec9ebef4c00a59f18a5fbecd81ab000", + "c215694fddc95dbf210c4e6291ffec12c2dc431583159efbb0ea0edec08549cd27ba5a682b07fb1cc97e6ad92cc8c41fb6755ec2fda6edae10c575f93a0b761901", + "b23e9e76c81ee93e6a27e984bff91cd9546282cc55c8c8bc06502715484fe0610692f71015579110c1f96609550e7d4b0c30ea8fe291c80c73e65915b97644ea01", + "d0e910ee5328f38fb8283e87e7e64c38a99b2cf0e3ec5da096b032d77ec7be814a110c66b1e13632ff373b56c5a307d013d636aaceefa92f9683f71ce4c7478901", + "021a0670aabb167b9e7f184501247b031cc34492e2f22565b3173aa7091ac49f64c8f2535cfa4855ebf8e4ee1e522cfc6242ee87cb75cca29623269a954f465701", + "aa9c6f5a2ade42fe2f520115508c9182fa9652880511027190d26ee56ef088134d7689ceb3dd7a1c6350b8a49817759ec15b9d3ab7f0514ad51446902b41fc2e00", + "14182c66e730a7a8c22746abbb683d2f65a4492ed644e835aa376d81d848edcb229b813c89ce41bed07b4114b7d8b558a7b53132065bdd9769c228d195a204fd00", + "4036bd33c3b8e0aeded4275d0d5928c71e808350ef1c6926987c5377cc48395870169fb2987db63a5641080a2037e9fe5881b8e38e493063727d31327d04952d00", + "8434cec2a8c8ec3daa591a4b2cfe87426b4b71d0ae5397225ff39ad01c5fe15e209ca7e4de4056a64f043b73b622ccf4d2b3d27f362cf7d7fe932c5f110d986a01" + ] + }, + { + "address": "2XUMdVGXbHaBmFBiYcfwssY5vXnQTav3BP5", + "secret": "312483999efe5e2a416a5300c9ada328cd422b8eb81d348aef76b1ab254ffa31", + "public": "028992d0ba3ec0cd066223a35fc6221c89433e373836e42ab820909dae2a7649c1", + "signatures": [ + "da51c05e697d2eca9f130713c958e0517d17a8ff829f6e6e7df581c74954b1b75d475bcbe3e96fa64048fd89cd4f5abb418efdc780ae1fd44553f9980ded225800", + "d77d1bb5711b9f08dfcf7f5cc69aa3883c34b5a38dfe428aa705ee2190c2ef6c4a1572e07348616f57f1a6133161136278c39a16a421039c1ccf6de16a02431500", + "6cef8f2474eb973aedcd8e86fbf82de5245db429408e8161343d681440c08a0730fb6f80fd42ba3f10a74a784b18e3cf7c36a2cf89bae3446f0348904527d55400", + "296ca1df8fa846a321f4ca49b76e06e2b8712bd4a7276f0651c38ef1aab9af265c411d0a76dc499073e7be7b60033db5cf2dd85858311c17dd9fb7582a954a7f01", + "3528f0101c5dc155c9d68580ab804e424a6bf81ea85bdd3864ae6eb347960aab33b20a3d4ac2763a2bb50de1b5cf11362086a5659e5859c7d6aa2d64d6a489e501", + "3c18a53e7f1a1d627435f685d3dfd4b7ae2c40ab4b43de1c559b5f8dea6c44a358fa73f0fe004fc42c1f660b711215e477a3752dcebad0af01a4d86b7b3cc91800", + "7a5d1227d136933f935dcac3198ffd462d00fa9e91d76d071d69331cdeaa98a33ca61def907610fc121daaa9d552f872090adb31d25f60023c9dba8d422c335c00", + "a3738eec0537aba0fcbc71627f588452b7401e5892939aba2119e1b063902da55fd912777e1d2bcc61944f77236efd2d7a84f3817b1a996a320f71fbbc7dc0c000", + "3afed1e7749b9bd23a97a55bf9e6aa9f9533151ffb731afa52455a00ec9f1aa9575369c0ce426d64830a6bfa708218ebd337728b914297002db298f10cba9b3e00", + "b0886b57153458794497fff860c70955b7ea80146ef30e413300527f547798e3775bd769893bec65c7cea503d4fd8703e08b6aef736027ba2feb06315f9b2b4000" + ] + }, + { + "address": "2f1gvQUSUucGZ1xtNcqDb2QqT8mR2YtJF2r", + "secret": "435d065f46be884edaf18ef9371ae6b9723e0931a45551447826368b3b1472be", + "public": "03dc267f778651a06be4b14f2a47063aacca922a218a1f984f224a8ec55f6b8da9", + "signatures": [ + "2c7ab60525daea6fd2bd2a2944d3f7ac62443f2c5f3ca4dea2252a7bc6d7a7520cf8e0e0e29167cdca142e1c6106b0f723d9caeaf181bb7ba7be3d3dd049053000", + "49dee8cb5efabb28ab2bd248482d913a7de2bce830637728e6926ca6f9607a8436eecb06aadbec7eb8fc49064a73d48de1215d2541e196f450a870565dd8562100", + "1ababc8f886af10ae76d167a93c6a6d5049c7d2b72257c6d51fb0242fb2d13a027b92c76463e3981489e665b7bff2707c577d960cadd5b392aad117f13e1218500", + "8461a17909adf7e7ba21ba08f9a351e3f059cce7b81458121e432a1b07c2353e46c874dce95d02adfa1cbdd723785eecabe93c3a65ac732e497a6a0adfc0350c00", + "3e458d37cd58a426d176f2e3acf123880f44607db8805f5cefd4c438c4eb1ed779eb69fd65dbba39d91cbefc9f54eebe9322aff7c8989f506cd1bd74a05fd66700", + "6658d5242d1fb860d4de1d54cbb6290893990a84bb139a9b79c50c20fa8f5add37af3552601645ac8fe35ad5790ebfd8fcf8b371b9f862e67e48b929bbba3f1800", + "71b2930f5e1b703e90d328f65164673a26558a3126ead81d61807354d59cf91e622d19725c201ec16fbc621feb5679957bf710fb5d54935673e8cadc4e25be1001", + "cc4c1e0fdd2301539ec0ace1eff47807af38c26c20c0b7304abfa75346472ccb38dedab61733895911e37591b35eae5be7daa554f22e75baec3f5b9b158d758900", + "5cac030ff5bb66bb091a86693a2d972540cfb61bd79869a866124dffb515f50907f7c90e99e09c04c3bdf18b7aeb5a82d5d9d983e2993c01a75571a335c8852101", + "9758a5917b51e9989f476eb9fa051a32d2ecf19ad6ddbc2aefb81ba95c16e52d3dc528db27b34ea150344458490d58868e5ca493b8ad4cf21dc356e776d0d54c01" + ] + }, + { + "address": "2QnMSr9PedSgf84NreugQJaxnaGJLHY9axQ", + "secret": "9e3b1370323a9aeb7ef6872489f3e33a0349235854464d656ce4b0dc00ea56be", + "public": "0255538dfa3b6c02635b667704512bfc4c3d33c48dc878d8576076e530382f34e8", + "signatures": [ + "9e40e30eb9ad0d99b592a148ba1066542651e04e90bfc30bdd98c258754ef77d500d11f51ec5eefa4a1be570d12cfc580bc55793fe430e75e31676f9b2c1bef901", + "0f19610905349de8673a6c9ed78158a899f6fd25a37efd22b9657af5b51026246669112914c6d203364456d8c1ae06d5767bc12ee51e91608bbf8b54ebf2ae2300", + "14dd6d4ebad35dff18c60df85ceefa17a03a9e0c5e2c004cc0ecd29ca8096e716333d8e24a32d0ab3cd74ac7fe917e4ebad00828c27093b6dd26eea20f0def4801", + "ca337390ff73808c302904675b4f954b6d4be500ed1cbbe1536693f3ed185edc5973e64764773763408d366d7dc80c209fb3cb323300bed542c359686548046a01", + "5bd597d9019853d5d13f89d55fdffe6a12e1f1969e786ce52aef28df44da1b04595b497136dda48e5eeca2b19741d3851c08d51b18a994f55e1c45bbadfe9d8a01", + "90d711499247f36f3280b09bb6fb9d1a9e89ac3b055bb59bead4c08945d2f9de59f0d6840314ca4641d39a80d9ebdcfc6cabc603db53cef6fd12240c576c7f0400", + "9f742e202407c4fc7462278dc4b8382ed34161faca80f3015861b8cc9cf9b1256d7017777e2fc68eeaf913725dfea2af2cdcdac76f88415dbcd2f6e65b9ef98001", + "20fd3fb2c83a63f69a7fc021d8cad22bbf9516f4b1f4053d4e032d5089d644c638eab2fdd8cbd9a7e5e2d797cfcfe6426aee8bb570c6799eef48a84fb333e24a01", + "0f4135937cde24fb32c92be875d39022920e04d76f0a99e60328556570b2250b69df184f9ea803c9cb720d441139d3369e29a4ce53252d7b71b015303d6cf22b00", + "2cea41e7728facd686876fc173ec9f3b82e243db23d284394b46ac929c254e564a58772ffc1cd1ff1940d0dc5ad7969f134471ab408acea0116c1bf2346befcc01" + ] + }, + { + "address": "Zi6vjiuB86UidJSxPnRnLuoQKNqbhKDTQX", + "secret": "a7d72f9c41978b79e61dcb6de20d05d31850bbbd5defe2e594262157292eba49", + "public": "02f947801d035fb531c1859be4045d3d6f54d4df41927277a42040c25ace724972", + "signatures": [ + "34e7d96043aaedc7b18d19a44934e9a59695bf5cb2b8ce04e845b6d5547103f046150acb03a3d08dceee0648a96d0877b7747d07d609b5bc2738eed78406571101", + "9eec6edabe7cc6c38a3c8f731aa310683f5b1b5b7f18ff597ce1cc85b69316226bdb6a853054bd0e0b07f7b6e95a14c1b331ceb47c42c7de0f64978e23c3f89401", + "024c006a48beefc070dbda72b0335726bc875143330cd5a5063b5d36bf81bfa971cf8b5bd8b0a097f9ce85b5e1e32d3516b9dc7fc18b2d07f967d2a0a85404e800", + "fae32316c3926889b4a6c351e32865c5f619e84678db65eeb9a8b97b2aa60859246e416af3844a9a8d036fc95cd583ff6d194424fdaab1a75d6302bec4d5fe2101", + "c8e1782059a35a98d0dc23ddc45a29e6ee37855e7ffc3a2db02ba548be82943d4c01190bcb22d8bde6a18545428022a5cae17efe9b1b59bcb054190016be55f800", + "67437425c618bc99fc2b111ac534a8337db17b07f05c2dc0c8699809de0c69ac5201bd0ce83d4af61df6597f0aa819c66c859b3fdf07e12739494e942dcac83901", + "7df6c5bda9dcef9a81ea470d1cf0a6c465220ff8cdc9a549021e02fa1dfbf2aa16f2434d181db5ac44ef949b0447bb56ce0ab2cf43e0ee6c7f4835267c12d48401", + "a55b5663ec5c53f034f45c199ca720198e272d25012444d6ed1e2c8dc312223a084126d0b7b0cb0dd9753fc68d3a1c3daf625203756c6c92a924aeed718680e600", + "c3a346976e04f54d750dd830fdea864495e3ae80e1a3995e5b7852db907cac1f454d95532fb7c536daf11003987065fc835414b1a19cfdd9d08f4332ae1e691901", + "53022befceb0a4f6de14ee1a6f287e75413614f4df77b0ce4c1a1e8d85f8947e7ecc9ede42ba82ee06f06b4a6dc70a25cc12fe9ecc6f1c4e31350980140144f701" + ] + }, + { + "address": "2EVQ1xmJ6A4iHeZXRtD7DawoBoxX1vRmBxq", + "secret": "04ccdc4fb9e5d77140a5ab7710b4993f9accbca372d142e358301f1bf096e05c", + "public": "03fc5a8249345fbf2b876f4d0234efec9e88b6a9b3a6ea3fdaede839f0520cd2bf", + "signatures": [ + "a47efd9e820c974dd9107bbed207f6324c042a21ff0d41e323f799974ea963282fe800b1f1067d8c7753b3e666dfff01f2bb6516121fd1cc3afdb5ed2d45ffa701", + "39b2a9098ed07c55e1492ac28673dfde7a9fb683bbc5c9ce62079c7abae343764dfe618112bbcd5805226e9a45a98f8efac840d38ae4db420fdc13e6dc9f05a800", + "a7934bb9e039f1ebda681cc87c833c7158666a9cabcfde5ed95aad53f1fb529733daa506e7f65845e4a5c7891ae059d62a52885010a4113d844df2d03acd17ed01", + "d8dd518bbf0d921954a840ca9326f9eef5b17eb00e4c158c03b298426f682a55077685305337e06a1d5b0ed3d48be76e6a404eda1bbf4a0f58bd84ea0920a28b01", + "3787c025ec0a21ef202b340770fb21d9c5204d969feceaa7639316b0875f0a6875db7554b4cf67c476f32292d7415ff07eaf73d9922e2639890d15dac3fd2e0200", + "89dd0b2bef097e4a7da14f90bca131005084ed954434627ba3c9e904515120d309a0fe9ae64c5191eb483d07a294ac37be0d53153d511dcfe8a339b79db1572b00", + "b559569007407a5cca128d0a3153a8572d8e8d1c765913b23ea27036955962470abf538464d519fcfaa4caadf9322c3f0a1a432ca5d3f45bd993c6965f4e63d000", + "15ebb160d7813b01269fd09e07d62b27b1665d243ee1c1be913595bccc6fe3377b46e2f1ce0fe485a810bb98c988d70b9dcf3a377d99ebe664b88a2239ceeef800", + "1ec59aa97c2e40a0766bc470b0a2079c58f337a6c8eca1372696785446f77b1b42704bec74c429eb2a084a00e676d084b175323dd43022f99fe513c17625d0db00", + "ed37c8d62f87802a0cc8e2feaa56c9ce46681d07f31da88c958317e5616b1278043e6abb646407909ab2d7f8ea880a7d89e696052a9b01da573a967fb91f141301" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0009.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0009.golden new file mode 100755 index 0000000..f619411 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0009.golden @@ -0,0 +1,175 @@ +{ + "seed": "vWqzW+tavumliuNymgNb1scvd3DxS3kEU9EznZRyjys=", + "keys": [ + { + "address": "dxJmhYz5CYqbxaurBDKndour8bKsX2BCg2", + "secret": "103bc41600c537a83751efc3b3375224ab5e50f062d5f679ba39a69676ddf4af", + "public": "028628228b9fa099df41f59a84685964e7b5b9aa2c2517027bc97163932d3f44e1", + "signatures": [ + "673112ab3fc33c8611b71baf4f5859b11f15775c619435285c076c77406ddd5b355ec1dc1091481ecea3ec23b05857fa5756842b19433cbd16edb98b276b4f3300", + "b884b685184fd7b18465d266e5c0aa3f715ef1ebdd2c510fd1d93985ed73700e07cd8967fb4bb41baac5dfb1b5acd43542368843571a8c2328c04ecd99480fc700", + "74ab28ea8eaa8abc10a60900da86209415f9c2da7c40c4dcae9c24f4a7577607264c1fa8abc18afbdf618726c5fa4088d074b22281419fa72042204da4d101f700", + "42e5c576f3c946efdf7433f68bf8bb08bdb9a4cd96b1df6ae21c1f977452565b144a0a3431d1fd01964c016a545f70581508ada70ed2d2e2471f61adb9fae9e200", + "d94e96c42e8206c754363103c1dab199ba324ca4a84382800cf95be2bb2fec4a641352aac50919a636cf60e21f6124b0898096b2537737e132b3a591a73631de01", + "462dcbfca20d8db7933e5ce611bbeaf3445be562df729e7110fb262651efb8512186b6b19902894c2ee0dd2749612c839976b6ba56b42d091357b9f63f40400800", + "1a7f718160e4ebc415679c176b4266582cdb59d0d3cc6d5844375604313513356663f148e0813fe02a6b4e657c76cb2fd5095a78048c639e431def9a0ea1f36e01", + "0c94e5e5dfe0ce864cfbf722ebe2e567f7b3b0303eae438f1a8fae2c232b8f95344ff2b43c1c5473942eda7e2c292b11c99bba70281964ff03105a1b916155f601", + "ee890cc57362d5adfb7e664671a4073c5d126b5da52835089916e45f5ee71cb227bae34bfa070ad0920bd9106fd0bad517bd7346cd85d7042a2ba88c029eef2e00", + "0199f28e2f9497c17c59e31c863984d7d4848720c9c151b6334e2c56dee15fcf2d642e073bfb728498342d9f19ea1dc6f9a4e8af31056e850405a5009be6f6c701" + ] + }, + { + "address": "wWfAkC5DRKmBesD3ycyZPLA9WUC5hKBY8J", + "secret": "ec68100218702342e62a0138e49fecf0281e97214f224f3ab2591be5094764e9", + "public": "020c1e5d0e449141cd10910c9ae064d878537bcf7a617e6f694a9f377a6528b96b", + "signatures": [ + "74dd33ff9586150eb0a6566e31da608be6cd9519c0a373a10794a3f2b0415ffa2f0b4304e895b4d9c7a6a1bbcbd0e4557800732ecf39239c193e27738f432fdf01", + "d23c6e62b777c96c1e21091fea380733c223bd68811c7bad12fcbf9a159b84992c7b011e4152d0339bbdc4ead5de4aa1a288997ef3a5ad0bdaaf79653077df7900", + "237df8d524e32e90b2e2e009b0defe40769fb341147191b2ba45aa277aadf81068fe8f206ef713e674ebaea775385b053c85be37dc2490c0c4f736a7a1feaa8301", + "83157989273570d30d0221ccff0497c8e9837d728fee2adf2b3142e8f04cef2943410fff868ec9c7e68602e083420b29706d3926c2d397e1e1587c31a60c9a3501", + "34212857e85e5dd71748f02f77941550164b4702dc55cfc835a22cb99e30ece054c53f43a3bddf4ce800bb2aecb2ecc87137acd3ca8a269af9763bc3abfed62e00", + "5348dd18e2bbc319860ddbe3b5ef9627447718252a189ea5957982acf54f0c3d4d6bc9d191cc6cf454281cb74fbdc9e05971b712119bd39332d94a4d03340d2d00", + "14f7d8da4fd890f6bdeb978a389a65d954a82037f1a59a3c22a952d1a6071a5601c460f31a6cdd5b9749412d44b8399068c9605b18c9677ab89ee3d92fb74a1200", + "4cbbb3a086dbae9049670ee8b55e31ab36fc012ab22674b4f036091bb511011a5ab11e3500a47f09b0187a407cbbbcaa3b8addd885b6b0639278903bd2d64a7b01", + "c8db912171497d49570aa43ccb6a5984f25fef8f44dcfe6edf4fae6e737082ec03d531e0f77057b47dbc5e50af5b67b74fb8915fa802f21e63c1db9125ce579300", + "d13cfe83aa0faffd130cede0acd5c6066c333474e7f2a059be3e3c27c081620d6f5fb985f4f595377332abdad3de0e27db9ccff7dbb24211b7375682c46f3d4601" + ] + }, + { + "address": "2NpdyMGSis7pKksyJdw2Lw9CkLxRXQ4mXfQ", + "secret": "e08ae8786cf4f17a7b6024143f7e99261b0f30f240b4a4eef241051f4b051c57", + "public": "03185a63e2d55ae868e815e5ccec398ad955f5ddf8f7f5878843810d22a95d8749", + "signatures": [ + "5d97d0bb03d8eff8cd742665a59e6cc7bee75c809f46396b607613e5e6bca6a84aa089f7cd8f53b18d6bc3068493ac1077da6f818bd65e18457d5b457549b9a501", + "66db0f30c1e6ede54bb6f70fff659935ac180bf41d62b2f3a649d8821d90e9f9452393d0ef245a4b9070a3e7a93b05fe3933ec5bfd3042ea3a644e77816e57a900", + "4dcd8b7df6aa6fddb60c9ae6781426d09f43b3f72bbc8c6e2f80e2f052bb29fb68d0541edf0bd7fc58b468850110fb3209742c3a1e4cbd0fa385adc55d76bf2301", + "b64aa7147d42e3e67617f21b5f49d0ce03dd5ff677efe922a57d783f438facb43d35df5d3f5bc6bf4418b12189bda65e791e837fab789f5765c58a4f3362758701", + "a61449bbae701565ec8b9101ffcb1e5cf8ccaf0148cc074649322d2ab07df14329b60562740b410dd042996d17f9fcf9bcf48eef01cf14439cfb7679ce49ace200", + "9ec3b65bd966d8d29037a74ecb0da1425a8bff15b82fb5aaa5ce85dfdc26a0c869d43b8073dc98d9871907908b13ed80997a11bf61724646d94525d0ca33185401", + "5764aa6b439d5eaa4ea629cc0bcd0d0bdfae933da8a4aa1beaf7ed8d6c751446784fbc57f0182c6f7bb13c33641dacfad3ca0065c1bad8c49690ba42abaf00ab01", + "1a48518590d1ad8fd92863486c10078b3c1703037cbea02e81ab17c41f52e8120b394db294c7ea4a4d8c9e5e735bd30c3a1574125e8005b80b2d429c4baa764b00", + "12e8b5c303a9d348bfbbfc7ccf5a74e9c1701482f95d818f51aefeff982e18ad0e25b86221553e6282be68cfe384ef7729cd716b3b66e48863fdebee137d2d8801", + "d9abcdf0970a1b8fd7721fd8bb7a6f2712cf331d04e300b7cb0a12caef919d2b335bef5436cb624cba1aa669df168840eb80e0f9f40c6ed180ac58fad922a4d601" + ] + }, + { + "address": "2YsC7EayfSJEMpH5tkFABZ7NxksBxUcRKFM", + "secret": "d609d3e43e182e23c9414e10427b1c8437d5de881836ae882819b4ccfd39ea03", + "public": "028158909c3c9e59135b6019738c31acba380d2d42cd07b3bc0e302fbfae9c3ed0", + "signatures": [ + "5de888e7d8889d800935e92430ef045b4b61896ff9b400edea6a9f184e56be5954ba6dd40388a43332cb2515553e227e936c3f39a40ae7fa254a37dfd478a89a00", + "9534f206b47c69377a9134a5a372817e68893181d5489f411a90ab47748e7fb621b840c0d2a857b7555f266611960c47814d3c9460c6f0ee33b688a7a95e0d8d01", + "fdb21218173ee37a35a864e6ee685b66ca3b3a62275499b5050ba9563203634f7f4ea6988aef0cd05b504e0a4f090a341d3cade4fc72876171a41d4a8e7900a001", + "c444d5d828e5d9551e6c85a0744655d75fdb35c90174557c442f6866130489a07f8d3e72ab8f1c4937b5b56174e83f1f0099fe8a90a2034a30ff33a58cd95b0a01", + "7b105ce2133aa4f330c7bcef90473b0433ffb8f15eff07533f31083d816a05c86e18e972ba8200db9c173eaccd57658d29e541805c467642b7c71fa3dcfa9e6d00", + "6c83b4cfaad9fe84e9fb6221c96f3e3f7a8a570d912df042c17f01877fcbc5755b52aacf432a0655461446c25ebb6668828f2c93930dc0c25cd0625204fc6f7401", + "a524aef799f60bda7106f53f7be4f6dfa23c650f0183fb6c8c7945f7a1091db10b569cf203541516404853c6f84b0c903015bc1ea4b84689f76503af90819fc801", + "64e06be4685c5f44276114ee82eadd0ac0fd2dc32e06695aea6b9bb1c4f539bf13a1dbcef6083d764d8fa1246ce72888fb242e5e2e2fd40708a1101f078f568400", + "0405169edaf9044e0730ebfadf22bdba6d29433227626eb1183b4e1fad384bee129c911097fd5b5996a045a39b75fae33f20d6610f3c160ba6c9f7fa61afddad01", + "3a4d6eac4ae0c420a2b07539deea5b9703816b8f1c63ee015e9300a89192035e4a6bfdc1c0764268b36f545ba40dc69b0de024fb89b367f74f0582c49991f1bc00" + ] + }, + { + "address": "VWBgiD8Bm82C5scBT7ouJXUdCt5WYBmwid", + "secret": "cd6cac0f13566084bff6d1415a6cf5b481d1180dff8041f4b0cbbc3ad9c45575", + "public": "02db0ddcb741d0ea2e05d2e299a09d063456dc3370cb8ba32adbcbd5f2de195d55", + "signatures": [ + "01b8d8773c41c67426921f5668f6327f3a678119f207fbbb3ea88031fbc3928a3b516ef61495997234e59ed5548b5ed94f59f988e3de4d12f57bbfdecf2ba00000", + "1832e3ef1aa54595cfce5706271449f00f634ddf07a124673027e65bedfa3751377dc647490148c8a753c8458824edeeb7a6a1dce149a49cd57f04d26cf775bd01", + "a32e7217378671d22ee640ad993cefe1cd7d35dcb8ec8c4946a202246b8ddc837e0933dc6246bf061115e7adf77b1ea7cee2e570da6afd263c4bee68061c7a2601", + "ea42d95fdb6dab4c5df0cbb87fa8f893724d26b1784b7e19eb799f1f8a5facc34eef7b929acb300c953864ff36dfebab0e4c069174217c8ef3cfef6587f5644600", + "a281a7e62930e0ac659ef9c372ad192cf86db5f35d71c656b72b03b9b439fc8d551bbcd58b8904f8653dc4fb3698774cebca153ea664040ce0184be627d31ab001", + "83c70b8c70db7fcb8da6887a6c0d575383ceae53c28f904a31ee69ce6106317a23e6c764a23b55118cc8d52bb621ee3f9782165580d98bf4b74f10ccdac5f2a700", + "42ded223b124824f156a96ec2a3b39a98daa76eb845e365c1238a38f7b49e663286b94e55dc245221d85345497f223d1dd81aecbdec5613efe4c4ca901a3c9ee01", + "c07eed52f2b0a550e57cba0175ec37fcb71aca4ed0fc37c4528a01117c6a52665196310f3b56b8439a156c33ee67a6108cca46b7b6081c5fad30be432f2f0e8701", + "04faaea1a63d8c3fb7174d21785afdae0e8520a4bfa9e5a82f4915be48cd4180158490d079fa2b7633d4082c8f1ab2a25a9ce4e99690b08cfe95ee60a92eff8d00", + "12826d3405affe5552bbe42b5e9f1ffcbdbfe3b88b537ca1c6d52a53fce068f5482f9c9026b8e72858506d9b8d1bec3b1cda36878ce979916382e880af7715e901" + ] + }, + { + "address": "6d9MoeBRrPUSW7C88QFe8T83GKxKfd2CY2", + "secret": "e7cba671232e76a905770b9dcfc280a0f47db8e37fd2e5cd32cf67d3d7e44c4f", + "public": "02ab3080b4ea8a74789ca7ba75577609de2961e01e583d8432f50e112ae1c6a7dc", + "signatures": [ + "0f15c8684f255ae234760053b193e2e3e799e0972f11aa7cd6ab62e29a4fba093d66356b08a0fc544a6c62c37b419e65982dacac87c445570a76cdfb3e981e2101", + "84e597668750e6c582ac72925d5f51c1ac43913f15472a13f45470d8e35ea6da6134b2d0fb356a6386a0d7bc95b4d35deeb8381d61e73ad852975e0c188364ec00", + "f2be4f437fb1a7f8e6ae876833d02a1b2407e29c393565f43cf28a6416cdc839593188c29d402479321d4cbfe92f0c70664bf19f550eba0c72c2e064727b93fc01", + "e8ea5937f15a16c93b56b60e527f14b343453a689b2fbbf98141775e7419f030190a32e8a831c4148f703f1861da656e93365cf6bb59aee628270bde6b6310a701", + "122ebc51724839413d8760e5b7e6317e7348e3c06690083baa2b5dda38cb103d3d6fbd0b924cbcdb4803a7c13de1b3a3794b464a6e2cf7ad9cc33305cb3e704401", + "e68851a6bbde68b5645eac304e0be24f3e8b51c763b0a5b3cc3b7d58b9ce1b4a3ff54a30199ad276a41015781f951f058eb20e513dbbe0097da5840821afa8eb01", + "23555eb3dcfcb3757f0ab11f822822da366baa4148448e76f4123ce944f0b4c80e1998aaf3e00b38e8efd33d8cecfab46901cce7655f37958d67d92b280e687401", + "46e956e8a6c12707ed890079afdecae1c94c5e39d3d04c312bd5477e6770e3274fb763ca342857e80358a2101e628e7d1a653f227307337cb292a005ce2f03db00", + "d3c7b3ebebd0fc24f378f1ac9a2f60bf9c96d9d88d64369f33fdb97893585b303d6cf556dbc12e991c336ac7df9e48cda650f4e5219696108f295af769cea5f601", + "9f8ba0642998c5da0c4691eae7a51a64120ab74ebce32d58fe8f0c11683ad06f232dd3f3b0b9aec0b1c53687298be5584b259bc7738ef54b247c6e436929e01200" + ] + }, + { + "address": "UBGqCZrRCWLNVUTejLUTmWs3ZjcdnanAEa", + "secret": "cefc013f3eef428213011a542db07a220e85b2ea978caec5c47170e2fbc52a61", + "public": "0316f70fba8d65a0f9f3e49b1cbbc3fd3ce83b62725a59ed85bc1693c98e9c0f24", + "signatures": [ + "e15da877661402d0c6c8440d05c3780591c61c5f46094258363b5ced7a3c23e565468cd9cda0a34be02efd37e49239d3b9d6f3fe64f53f359dd1dc52275f6c6900", + "b5dd04df253eab7c671b4414e1dc706f703016f9f545e4d765160fa8511e4e553ce7ffae05b9a527b84ffeca7ea531a7f8bd51add548305d3bff5273b3db6b3601", + "c3135db42f34ab5443ba8ce3e6833c24ca84100d3247fcbb71b8615dc958ee917edb1deb12bc9eb3c259d43958ee10a53e22e966ffeff4116a04714a88ee285c01", + "9183ca8eb77e2bed8c9a788fb13c0f2c834619edc7013f58ae7c7444016012ff033bfbb32494cef26f0e308aa69d4c10cc92b0a8dc3da23d883319808496dff301", + "7ccf91f8222c834c99d28f79d7f858c028150bd0f234fafbaf55a39bc1d9f1c30c39672373d94b2c66658c91f770a280882909717eb4e6020650cac801c7aa5401", + "6f7bd016f7130ce5f33f46da12046b1bc9a8fc03e5fed7165ed16b1eb96012b12ce6166c43af598e24d8eaa8e08c60923de15e55088148993cab843f7fac758001", + "1b62fdbcd1b0eeb42a2ea162ac8332607007d3e94c40d3f329fc5f06abcab57b493cbd3f4b490c5635390500c66d45f51bbd340899922aff54204a2cbbb1ac9d00", + "bba47fe6febf896cc1f9f02a34d77710a050adaa8fbbd9ef2b51bbffca08cb9a22146c0eb84099cf48b499715675417a486abe4de28f99a24a75e9bccc1e91c301", + "ec16b3721e1f05d368969b88a9cb476e8aa7c0177691bc080d5f698decf5969f5d7910d95360cd49700f191cf0f7745d01c09468a1061d28630f8b4f923fad1800", + "76a0ca994efc4714a3d1bf10c7ad81825500a2492ab5df87682acd145bfc6c1e234c1e6238254bc451ae957353531bf2bdfa7899e99c3f7eeedfcc0d3d35a9bc01" + ] + }, + { + "address": "28mhRTjG2P2fah7AJuUrBygpxhmheYy4qwi", + "secret": "a5bf25ae3ac443489d23aa9fa45810a36deb19fc56fb67d09ca920868ee81933", + "public": "02e2a845979adc6147886e594728f975b3121fbeae3bb5e026a2b2738c104175cf", + "signatures": [ + "459509346729140b8534d06867f7c3885a59b38ca9264ae6243e83fd71ff023631aa62a9926ebc21b164717e227813c0a84b222cf7881038d7692c208f1911d300", + "36dd71d7c43b438be226dc6bb3d1695162da774d4aa9d73621ce40f17e71d59c47129046201b7f7ff42128af0df2b8b1075d3c96135fef755cd50d78f443965800", + "e3dbb279b2df949cccd238fd7c9682024a7e86ef4be62c46c21d1a5add6d5bd75ece28373bf65ef0ef01e35873510e1bd6d632390c1d0043af57ee6fcb8e423100", + "21bb5e11f34214dd7472ddccf0e156ae8c2a3b2519022246ba77f2ba804593ee21fe5b20dde87ac0e60948400187cbef45b70ac20f44add46cfd045d87b839ba00", + "f8ae837a61c9a083e366417f0e4be2d43d490add9d34ff4c513d6222194c16232a01b51b9205946f4cd66a5ba69f1ccb6dd4ba3906ec17711547378545d1be7e01", + "0393357ff49e2de374492fdea60319320c37ccbc03e7e6b9ac42ee3422303cfe0648c75c57d3062b5c33634ab0916baa88a998505281287e99ebbb000cd2e42301", + "2900df4afc8b3a123c0ebca53ed6f6398e5172f5f9676b76efd6dd2d5c4fda68568b72fe2cfeefdeed89fa2604d7bd6b3bc9ec9cddb307832a2d4368d863bafa00", + "f10ed20af67fd8a37f4100885e08195460728c89dd5651047e658cc679237c445377114888c7f4402140f2886492038be603087cc921d1baa2ce5ba62e9e40ad00", + "8e00142a82c8259adbb209104373e52d7b3986fda2a29af86e4915706675a35b3af0b4a31002d263355d47e6072a7959d4eacacafdffc5279f6e90bab4e6a84e01", + "87f22431354dcb7f1484d18a1207365d69b69341bcbdd49dbb76ad9ce53cdd3f7c806f14e71b3f05fc1b43726b3be409cb4b06f2738553c61e2ee7713898157300" + ] + }, + { + "address": "o8KcCaEq7rUzk9jU3ej9NXz8ySGoAsM9wq", + "secret": "a774d84ad42813d48f293e77fd9d872d4bc5dcf94a968fbac437811a37e0273f", + "public": "028084b66fe7cd20247fe319bbd62116732e22219ce6ac0c38b10ee7df6a5e84ef", + "signatures": [ + "1f173b3cbdf6157b181cb88ba8fde5490288b1c994eb3d15dd64109207aa330a1eb99b8061555b30addf7e5a1410b22c1791ec979e9f1e359fe67bdf1bc331b000", + "e44ee5d90f91ac62a4b08ca7adabb3f4fbf242fda2c60db76730788a1746012517b7e656078c36e6d2aed28bfb65cded94d4f776c7f3e339829668e2d24fbb8701", + "684052ce6947cf8ef9c661c317136f087f8ccdfaf8b9e9b309c6e61ea43ae09808fd5a912a45e6ac71e4833d7089e1b610dfa1a67e2e3826722a145efe7ced6501", + "673ce36127a13f491044262e8d238aaaf5dc806bed61d7999a262ab215aff64747c2440e532d8bdc6b04b889aa856e0e53f2fd1bb2bc514854e46cda7fac379f00", + "2ac98375228432233fb3d2d3e3e985bef2e46b65a906300f759f6c5588f30d21656385d9a48412387199a44eb21ec2a9da4434e981c5b6e1dc2740565a381eb601", + "acba6f64c54168e9d0a3dfc01b52326a2c2f18d3af10ca6ebbac6bfca02064147887a6cec9613dcbbcb909de55dd5870561c4d6a98683cd1bd34db16c93f6b4a01", + "9b0b680d306e8f196fb882c8ad3fe3591486b19487c5ff7c5ede4a9c86809da6586d28e62bcdafe4bf6d1f48b0714e8f876fdc9bee9c5a946db34d095fb66a3501", + "5c1a56d3fcd09a8d749ff6e69eab86c3a850d9ac4cd4aad1e650c7cf83545cf22192288535eed8d67b1bcd49ca0c4d3ec950b1eac2d1ebf52d052ad46323f76401", + "4ff012ec8b1e136eda5d7638e407985ec6ac20932a60cc9f6387cfbd07e5eb8c6b9e991876f1230008e76b9881425a10f74f731bd67b95c44fecb7239cc215df01", + "15f1b3110921e7113a3e2c0153699c4932189a9f11e08e5e780b171eb6b3dfff5ef5c2b283ef0883ce128c32323efe8ae4aa240d70113ca0103870842e65482701" + ] + }, + { + "address": "F5b64tWsytrtoTB7Gka3Y8gL8bcozi9ZwC", + "secret": "c9da0f4e53c8299fc289eea70a8204053f8e2d357496bf37673b7a2a09606239", + "public": "0249ea059bbf219d4e5fa61b68009dcf568a4c3b8838281066098c9c70e6302e14", + "signatures": [ + "2b6a68e36f23bb4e70e325b74df03af03507c617e1a3f2f3d9ae9de51684e69502a1d4b9d4576a58851c3c30dda5098fb5e483c387a6791d220ae360fa46db1101", + "9bf76435655fd5517083d56112a85d6390f2cdb29ef0083b72f05fc80513553d3855fd859c062c615197f85fa6ea2f64df0a08c05f6fde543aae1e5b06fb070001", + "b4b3d577b3f634171ff462e6ea1a5d7847095c9be3afe56e1ffb5910bdaf5993776a79fb0a11d31af5b8ad03fb82dd60852da5db60812fcb66c430b76e6590c900", + "aea6e04924a561febd89188d0735fccbc342d23afa7d4874a3fb7deec80e38902c85c386e2319bf165b28e07f8f2e5bc65d53124a2e18f3664f14f3156916cf000", + "de5a68867d648b90fb090b366800a458eae988401778295d6737161bc2cb403b7a6c65054ab8a63de5da6b78017dba1fb5225c6d49fa02b0a884c8139e00b6c601", + "b00a6f1b743f2ad3efd370c33bd763924615e06d9640d7473183822f8aa6be792dfca685286084a2d88027079a4eb510c49192da0355217685900c644c37a29300", + "e2c318045aefc3099a25545c35bad5c8b34a9566b5a5e3813a3ca0b9c82698e27209aa93d369b788d8567a9f77c47796060895a566c961652b606f40e73735ca01", + "707e73c79f3212dd48e2d14a807f59a4ce2cbab2d60f9bfd213f3253b4b37c962f66e7b22e16633bae7c6fd4cd25489f731b99f6a68062532f509214ca7593ef00", + "acaf82b616b71700291f97934baf5693a018f685594af570ff51e6b19bb93238174b5d5bd4fb70e7ca1c7a247b795817269e4a93c399d2e55065f9851e0c6d2501", + "7a6afd718dd5126b7a238933f0ab66a93f68bd83b0e233698706662eed4d61486eeb68af6bc69c63f30a6107584a302dd2f3d404feb35868f155b83939541e0800" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0010.golden b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0010.golden new file mode 100755 index 0000000..136b7f2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testdata/seed-0010.golden @@ -0,0 +1,175 @@ +{ + "seed": "58OY1/IoLeJIrfYkiwmSc3IbtSF/XwYHExUdRFPL0G4=", + "keys": [ + { + "address": "2SrJiwmXj5RmsN9DzCVzNFuQDA2ps8FToiE", + "secret": "646ffabadff7a510e36d37a6559b98c24956a62275bc6ac80fb2597985c1557f", + "public": "022b32f9b0f70ed57f356a49faa999f5bfc25f6f1863db2ee5fd2aa1cac0592877", + "signatures": [ + "6ca2305b555ad4757be898041a936b5ba013a0213c24b37abe5dd6586c1dd3e3718f1e38c72481c39d4733994ef2db85528d4307162923427b2cd3fdf67103de00", + "c33f4665e035ca0534798d866857da38b37fc7aa24ce2828d9639bd0cb88ee6e14fe150b016e1cd842a6056d2093629eb272b13b86afb71771dd8064f65a8bb800", + "fc2377a4be18e2c53fd277b136117468b7c8fd12d3abbe6561c210d6c29c56ae3afb4508d5e74ae75c697d51d578458e7b7310a6bebe4c97fbd51e9ab84f7fe000", + "40637de52a5d28d87db456c85b3854a4b73865fa3dacead32bf5d3d24349aef0680735f2083b1c4c0dc10d2f5ff8b84189ecf3c196ebe09d479587334a56145601", + "1265e4ecaea5ba5e80f7125e28fcd6a228e0899e53fce3fe5fc1087a1c931f28710662c01c1986775761f0ed677c5dd663c43b8a3db4e7c34414ccb61fc9daa801", + "02e14ddc2c85600f466297b5938bea2fce271dee37cc4e54c812c4040364e7bd3a57b5ce9839877b7742695c55c85de569aef2faeeac234cfda4246a0d21c0a801", + "614aee033e979afe8cccfbb568dc4f3b1fdb368e249f913ac12a3cd26d4746a52e87252b156dd3c572e1eec02bde554c0d5afb0ee37648aef342d8a401f3332901", + "79e3de5d0b0996e66cb2edc8a683a7ac8aff4a79ec4afab42fa4ccb4bbb0df4439c9e0ec9acc390c9b0c639f6be1d61b7ab9942113f9adeb1642724515cebe0b01", + "8c6ab61c14112eb77e0e3dc0550aa47a14c88bf51b9f3b7bdf40ee666330ab313787b54300c2f405bcca00f7f8a157426cb8b87984e091ba30c095704fdc27e700", + "c30dc8967b5c2fd418e7cebb7dc5cbacc2694da4b80e3fec197b8a8b54a9c517383a2cea7a07bbbc166f53e171d58e3a971e618c62e43a86bd8c529fea53376d00" + ] + }, + { + "address": "28EpfFX9Syr1E1DTtufp4rt6KHDKWJLUCzw", + "secret": "8597cc7736e6a039267fa3ccba8eb73360ab492282026ab8b73328da061d3256", + "public": "0276f2290c48973bd92552fbad3a9ac4ff433a8da13e13beaeaab95f164edb8ef8", + "signatures": [ + "403e2bf565bd10642a72ac10ecb868dd54f22413f1983c5dd8352ea3f5af2e3f660f790c200fc38d135f61c97169c7a6a51d77d00975e95598d47c19b7eab0c001", + "4d9011b95d86cdfcb867ee695d40417b96a1030afef22682874879a9a55b6cb108afb8963d5f89344e396b60e17ef758813a6ec4c669786184031e814c417e0801", + "7505f810db7cf603f5f370f0442cfb15211395fbcaa1876eab3015aa96e11c3d52b681d3b8758b878cd577c984bff55492ffdefd8979d28e355950fa7aa4aa3300", + "9b969732d7672397c3b85b9279a8c7e633f3d59446824ba3c77360c0a1f2d6f315d548aa2576b61285388d6fb1d6f33815cd746b85ab4baec28d3aee3ef06e6c00", + "57c1c7d20cabbf967a68356f806115a1e900211159a2a40dc6fa3420432523977443cb3bdca94911c04f9a15dbe87cae661a085aec6044e9c561df654449f36f01", + "54189224c9c02dc272dfb4474a802083e1ac372350ded7539db03bf60ab918187a2b63a8041e79e0b8bbfd2af09417f71f553972c914df8f956cab8cc4eed2a801", + "a5987f6d62982652f06f5cebfe4a83fe8918566100f9b28b65478a5100164ecc2b366f92ed006321e1300931dca8fa5661a906145fb769ea6351dee3b5215d2900", + "ead667dc0d71e3e6877da08dfa17720e80e372bddf067a6783ff723a37f004ac675d15229369aac75bdcf1875cd548b7b068a41d04b50cfd8bc5b07ddbb13d9e00", + "3dc279ce62d0ea023e13007c737635f752787ca6f5268d12e6347331eb0edb274d702d485599954ec99cea8556aca04d538c87695c2c1c9c1551288b047486f500", + "d5c31767dea1490d951cadc4bf1472ec341b83b3edcb397eb3281af60b48ad4d68ec1d3a192d05af7883a19eb955e2ce4c30db6a7387a708bb41f33d9300ac5f01" + ] + }, + { + "address": "2j5u9ieaqLQjoEru9V9sMqLPL4cncKJfpoU", + "secret": "720a01fccd31cc08832df230316cb89e619113d951475c97b9dc350122036cd8", + "public": "03ad8eec89298721e6f6da1ad420fe178e4e37ba6c5fbeb707375380454eda84b6", + "signatures": [ + "89272a6545cd40117f89c7e18594e5794a72445fb45752d64f9a1d606f7e69604992268952b136b192c0dafab15b9bb322401b967f18536f0f5b78c7ff75f38800", + "06b3fcef37e36255613a3805d31ca5753c1e11ed1c554d6c8c4676c78fd9c53b2a1b0d19ef37b7e8062a65d5e982fec61fd5097d49fb5198c376e914571623dd00", + "82359df3355f1823d03c0aefa5fe9f04f208cd7105f9ea310c615bc6a857f2c153f68e8b1e2ea4fc952c1dbeed02ca31a5f425aa23234ef31a1b052ab177ea1301", + "72ed2078e5bec03162cf64aca6eae363aaae0b402324dd74e7ff630f0d48c67d6e781d0f2612fae060577d827fd7987e4a0d6b6254babc3744c08a98ad85ee9c01", + "fd6d6acb517bf4b27cf1e6b03bb1f2b4213e883c4174c56b14c2ff429aace102214df6bee50df0b5707cb59e215eef0a2138fdf3d94ae01537b03ad4f20d279d00", + "491360c4d4937e2a1e9523051909639a8262bbdbc77becfdf82dedff9fb9c7710b7ac8b9b97aee6267fde5635d247e1c16a1a26a82c9727778c6eaa5b7e3d50e01", + "dc6468ceb3dd16c717549a68ce0d03cc3394891e9118663aabe2de125fea621c16de79f0864fd44b5e23c2058ed8f8e65156abd27e89bea63627afb4487e7af501", + "22ecb0f1e4b39838cb386ff2c705c22b35ee0a84d95ee5cf739a97d3a6bf51be245ae7392a89d05def89a5075b3590d2ebccbc1458371e5cf5a4aae932904d8201", + "806050af0d6b5d2b806f06927438981c648ec6ee3469fae4cfd4d64a31fdfbc57ea6347828cc15ad8092cefb59a738a61bdda7e823282472a688ec288da08e4c01", + "c7e31a146353e1273a1c0f5ba4205e743ed67da7515f1cc052d2c0c24e86445905ada83acf5ddf68b9124c8edb149cf96851f01d41b8a8515d22f0ffb8a86a9101" + ] + }, + { + "address": "2KoZQBUD99gg5jKrZLLycqJvjMvKFf2APLA", + "secret": "5a04368aefae7f463f31da6955d7c08249460e3c90da76936b641f25f7c6ea91", + "public": "03ee8074e5474b0712267b0f66ffc17f42d130523ff4c3f78217532540c89f4609", + "signatures": [ + "aef0feb04a3a4e4318282c0b8d2bcc1f658470be785aa4a3639117035f7b5f357562f1167230ca14aee019f8c32e9c072299a8918f5a76fed3c3f54a40661f1501", + "ffea567262851e00794d58ff9bff182a19fd97862a4e0dba414ae8681ac8f03d5396550c2a867def5be17f5e38296c40c8b6a994870604ccccc2326c5709062d01", + "3d88280db03a3ba9b15929f0f9d6339c835218e60e82780b9a1becfdf674550852149d4e068f2527ae425d280bbdf70bd37ef98ce2dde4d5d3feddcd87497c7a00", + "d53f2a4c346b8c007530beb4c1a28904b0cfa876325cf9790489959f82d4ad74035d957cbbf335177912ea7278f45bf86fa8d47ed9929d78d43da6a9637bd1ea00", + "b02fc80ec2869131159c562df839971b3285ea9dbf3b1279835ade6ec0fc2110228eb443d743bfd1bca24f20308d6034f1a5654f2dc81df537f761aef1234a7701", + "bba9e94d716a041fccdd03498047d9ffaf55a28b1ba905915464255af0b883d03a109c7afde2fbcca2ec9bc2f9bccaab9e07898017d40882fd6be9d12423825b00", + "9b557e95d53b22903526cca3e17468ab029bcb478708ad88c3581f0aff4fbaf4328bb3839134933f3a252432f01573e3f8111f0bbac6c61528de302abf286ff600", + "fec6d86d9efaf625b18c0f48ac7856f1825dfe82495c167a0f44511e9cb52b5c1ac4bd6a5015feb5cabfd39a62f48da6d267da23e5a49d6a1d66c34cd9588ad201", + "1a3ad7d2f56ed736cfe7db24673bfd917bc582b3a63132828372da1def7ae91f5cf322f8d35aba104eb71004658ded222f6411e36079a17a1c7d99473bf2a8b001", + "e3faf295d743fe5e38c1517b1437bea083c4908004dacec1177e410dce94278a4477cbdc751cfb1497a5cfc9c6707ee47bd1e34fc35e0bd27411c3fe69e8186f00" + ] + }, + { + "address": "2YUgePgEgTrbACq7vrna1NXVGUzrBERj4dw", + "secret": "5674c557050ac9dd67cebf9629b9af676024f126e3a52e856fead1ff51521c06", + "public": "025358627a6f01a52f446cc7b643b813482ae3077cd3760385b6700d83def6cf39", + "signatures": [ + "d807b670e83a1dd3424f916a7226d44bf3c9c8cea11f6fb37fe8e96b031f95d52fe48d0a3649e7777cb003a03890c127020bb698dea5e4eba0dd4c3beaf289fd00", + "0437e62986f35dc27782a1697e282da1a7ed39032ae01bf66ed61fdca42e87821a8939036ee91a16ab7bc917d2aa74fb059a6961d8265f98fbcf209e73c3f4db00", + "54d9401e1d6e12f7ce81223ab450134e1a39c7a2077de5ce121156fd56f345f3240cf8b9803df2bf7f105d1db73d8aa1e275dc5926e9340d9c4398f9b8af929800", + "8f052c5c4b6093a88bd24c80d1bc783945ad34b71b00ddc3f5bd6c948419308954e20d8ad22636c082ea536a431c96473531899f2566b57de9d038749e71fd9f01", + "8ecf28f58913914851d5fe5a1181ae665a7d536acd8e3cffd55e1e37e1bc1b8946b1dfbd091b0945dfe944123ba3df27d596dd7866169f4878614cca58b0f4eb01", + "b2c4e3e9bd832da27a0766914652b48a3b93e66cdf558343a4fac554844b99da27d9091693cc8fc5c89f769b870f29cf56b855f29a2f7ee1130b1f51a4d11f4b00", + "2bb5c25e4cd8ad7353d64f5e3ad8c23aa213c71c60c14a207805dc03562b8b1928a1f285fba00eecaf2fe00825574c7cee09cc3eb06a510a87fe3327a2ed808100", + "b00bd2eb6cdc38d9de63fb3ac5f249cc1b65d0aaea101a096d3434563a930a837aa7bf3cc91d7a28c4fe2a0cbacb20e9cf16ddd0e2fd305053c69d0962ad434200", + "1443132e898aef931e53552c74e87a0226227a443dea6d656d02e41e2d03a27749c6f2dc39e0f1de5441d2a828f66b60c598c197bc6a32e0e670143e57802cf200", + "ee030515f8444a3f9abd4cf883fe0d56ac35e44e4a17f3a91619bcd9892649f31ecf607475aaea87b69bfb25fdc6f785aeba8c3f64eb20624ddb18020fcb8d1f00" + ] + }, + { + "address": "dVMg6FSsHo191yyMzvKAu8jNempZbKnkRS", + "secret": "d5c59918edbc439fdc9237ea652127f3f83722895e07b82e5a5094fb628d21fd", + "public": "02697d387c359d57c492f24403a10e2ee47e54866ee381cdacbb5b7cf8ab6e1b80", + "signatures": [ + "a7e7bc206006583d3c9fcf9380c3cc9d3c405eacca2f65f8fdf1ebded73695824cb75bd9cbcd7446c19a45e907e3c3ce2bfc84d4dbe890280d9a41640a1fde7100", + "0e68259177452e77fe363f86c8dfa8f4eda29cb75400f05d1353cc5d7cfc64a36aa54a266635ba55110141a66a63c19429650d72a17f57ad18ccdfded25a264400", + "331e14a445fb114fe7960de531de1612aca3d6701dabcafddc155065e1f9322247a19bf3ff1e9804d4169e6f295215bf41642ac095a6e540e4161b44d660ea1b01", + "69bc7a31bda0c4600e66c7ac02dcfd49bf8ea99cd6f8aec851882204076b2eaa1457b47038230bbd6dca6ae72c404b73e3e2ed4fbe642b5ac9a22c214788363900", + "951cb4a095b98c49470fd3ad7befda82093ce231623ff346947e6eb078f3114020fa56918d334fc29ff724b794a7fe3698eb473efa95c053cc43b1a75c069a9201", + "48fad2b7d86a9b8b7ed87c506d7957bc32c1df1a56af9f2f2f44a382f182a6277766c39ef39fdb580a488393b90937ee0217708c3266f680b62cc980575957c701", + "40ba88d401efc157039d9b305a0ba136d7aaddf9fa97e3e8b11012532eeb8c2f72b910e96029e6a40ae73f15949c692770f95bddbbaebcbae1df67d6002f5a2a01", + "9e5889ba9f34e0dbd4e9dfa354533bf005ead72f170c00b562bb08fe40c7f6e0323b94e84d55637e5dc9b6f007240fc4fbc3bea7c8632aef1b6d10fa9c68d32400", + "7acffdee6552639aa7a1960a0c80366e72f28e74826d17cc4eb2804d516c57f67d2c015df16f5ec84b46963925b53cb3b9e8538360c66a334adba487b4a065ea01", + "11131aa556119bce1540e2820bf21925e5ee2ad16057a6ed3aca1ccb600697ae449bdd0b266838edfc8b02c82b01158035b041c3c844fc7995cc86ff5372749701" + ] + }, + { + "address": "25NJpLNrTci5BtBtLGzGzeU2ABvT9Nw4d3f", + "secret": "0d3ac7f674c3177de5555a6a0e7d97eca63651f686942111ecedbd00c586d03c", + "public": "02c18d3e9b15c91247a2c71ce8c2e27e1b008de4d17ffa388d34b35fb27f3ba1a7", + "signatures": [ + "459d02374af7e0547df8d3ac93bbbf477d9b13add08cea4a2c4a9d55e04bb9501ea2f10c8fc68cde1ad2539df321032fd2f2fe56b010a8afac91f65d63c1ab0900", + "da1e742628e40682df13b888c7b166220638af152120a18fbc3e41cfbc4a2b8c0fffda7514e1c84c0f9211e0efff55ef7699560e64bba76adee30f341f5edd5301", + "da1893f530c4fe952d2da3a56d7b5f40e29e24368c00bea9c6d1317287f646fa08d251e69052b97f7c1d4033936b00ade787de33e6fa8ef939ea4412fe96bfdb01", + "0b782c5ad45598c6678b11254821637c3aaee8c4677dcb38285793337df838924160101e905f89502d30ad3761b4894dad68b7d2601f949301ed5ae4079cbcb400", + "3355727fd4fc2342737c86fc1c01bff49cf1afe258a927064edfc48c2445582d1415b3c74fea1ad22c5d9df4bcb0a65f6e633b729dfe088b29041a013e67db6c01", + "c493605d78ca352ae5758c7b56e9d6b338411e2c78e3cf244df3f5182d55f8de32c3a8464e00de450320d6f62cbbf00719d34d9bd6262cae586befc2bcc0601300", + "833b50000dd4564746e3dd0a90023f5fc74eb443795d2f986a568196fd849fc41751145da01b8a6753867184e02da5e023b12b1638a06bc5e2821afce12c6ee200", + "fb702b3cfb5c4225e14a9f9c56e9959d6f73ad6b8cd17b127187127665e9ca035718e5c139fb2c495425bea29c9c65b2be97f4c642b0da60a37bd10d717ac9f900", + "2dedc42424ffa658049e251c9d0a690a31637f5353e5d1a0d423c1efa3c361fa47c54f642f1876b5089f7c059796579f4a556821f3aa2810678face35c8fe22401", + "6ab859b8b4cf7e047e1e0f8134655aec58c04d0ed86b909d4290c8c335fc9816591fa8236258144b5c4b44c8ce746a11b4e1cfb1b5a259c2ff3e3beeafa26c0c00" + ] + }, + { + "address": "21ryRMcQ4jvpDLv947JhNYFGhkBdPfTa7Ft", + "secret": "cce2107186b602a42f83bdd37870457404daf2d327c83f02422a381628d2350b", + "public": "0240ae55709e29278c3c5df3eba50d14caf9ef73cce3329c05c56595384e801a81", + "signatures": [ + "f59f660e8a14a0ce2b5c866a077ba83529b466658293067c6d16bc3ca1bb512c1cb4923fd4011e23ab572714b7dae244cbbec5518570ca3978a04902adcc183f00", + "e4ac4e486160881d9ba88c70a3aec2c5b0df4e56b1dfaa8212be1e5ed52a2ac36495d35e71791418948689e551886704fd669b2981edb13a8b4b2f385ad301ed01", + "517f2f1532c4986176854141b4a1fd4da24f1a7824a534e1dfa7430d6c6bcff66808f8bd72223a4a8caaf636f4408744372bfe2bdab86eb7c86f862dca40a53200", + "9d597dac44c1dae6b8d940ff6fc61474f6109b07cd4cf036f1c04702c5de5c613b09c0610da9a80f386d2dab714d72b804b0f4404a59d03f8fa63dd9738ed1d301", + "67b3708f680fc77279d0c1e7e65ee6b009223f83d63be3cf3bd2f050110222ac7b069b8fa6fe51bcd18f8332e3696e89ed759eb6d3b01f6a47de09cf1f929a3801", + "c6ba13f4754a3378272eb6ef0bb8543c1c821cbac252cdb23ea3a5687e4672ab6e9f9ebba8f77c2d0805f4c72f81455ae5e91d5669c48cedef9ecc0eb7fce1fc00", + "9db0cf266b02ffc7715d53796c871f0b6cbd221d1d8e6da6dada54198348c4c446b8c2a77ae8f2734ef4209caba8173c86fbe7ea4393cc53021e1e0ff7b5940d01", + "2eaa229d2fddd9dcad651f375202e71168be4b350a1e897b1fe2f27f8660e60131129a497d90254832045c830971578e0f7c1c963b75ada05e7589679fa23c9901", + "36a806424d934f5200b94d16a531d8375bd75183e72b9fc060b3868610930b411e298110ce7d0fd6a3325d83b896cd224c9cb293054553b7a7b3035aaadc39c901", + "5d660629134419b57f48ffea9756105649061067178059caab7c4d285e6a4ba572565e9b7aa7fc8700536e25d7c0dc04ebbe6d50647af58c04e7347d9b3557c601" + ] + }, + { + "address": "2UpJ9CTUUzbSjSfByhiYG7TDuHpyuRCXmjN", + "secret": "01776da713f58690c4ba654afa403ee43527a3697b32c898164b1739b1a8307e", + "public": "03b8f7b20aa8cbdb7b40de6426fcb4a5eb2517dbfbc6e532ec1612341b51a234e8", + "signatures": [ + "7fc7d6a44b4368ee439be43108306c1b78c90f401b7bf5806dea4793ed5941fe67c3fc8700751e21841c16b37f1a22d7ef354b85b39e73dbd38dac6c1d76dd8a01", + "5e634789d9dd8748ce83b5a173ec580a2e2483170f10e391b37e71fa1a0513d7407089d0e3ff410d122518b7ccaad7f39d3e6d87fc731259ab162e2e65eb2e3e00", + "15ba0d2d44d9ba95ff5477275b646d6fd129454a364feccc96eadda27666c2a9419453e2e9fe6890037dbc14d347813ba3cac14bdf11b33dc388466eeacacaa801", + "de5a67850d94ad5183c032b75255de8d125acb9ab613c3a678aa4b0bef2205fb0067b51ba705b25038619a4d99be5f9b6144beb0e758a070e0a5781d1f3d793501", + "60f137a5017662523950c544b23334d98f4ddd044d9ed1d9ae529394431f00883bb79088b7fa127a679a2998dd1bbec57aaa1e9abcb803540e520414ce69760b01", + "273cad4820707e6af38d07e847a579f297200cb567fae62c69ca68cdc0d32c5d7b365b2e8c74d74d802874fa98ba3d1d342246989d56eed0d876e4373cd82a5900", + "7ccf9b45d6368690c145d62acb788b8e1d0c555e8a8e3e3d396ba7f3cdf9fe7b3bad3bdbbc3bf26f5f07a9d7cffedd5f54fff4d06f7354fe60baae6498f0325801", + "c38ea111a10d599bee668edef517315c5a3a960fd38258578033ff9b8a92b9c2443e5dab03a7fa5596280b5aa8fda6c6cc0feb5c921d8cba90ba897d0e61c3b800", + "1268fee5962b4b33fe144373ecbbcf5a4524adec330e46144de4d5de7d7f45f64f26531869aea55eff07b8ab76a6b4c27e7e0582bc5bf2d0e31cca5c82bd60f500", + "7bcf7fd288b4f734ff16fe8c49682997126350fbd5df9537c009995a0859f8ce30c4748c4965c144c415af1f8434e4e2ec1023ca00cc793c55505c7fb4e4f94800" + ] + }, + { + "address": "kwyudpCciG9nTC98vz8b3qrQM9DP2pn9wx", + "secret": "3bfecb42d2aa5f86043bf61ebb1ffcc52c3355e0cb5866cc6d4db80d467b5387", + "public": "021d7c5180dffb1d3e65a341525fe952d65627bb1e4d881777b278665b138419d1", + "signatures": [ + "d8fd20b09ef6f55bf0d668e9d70c42906c54551357122c363d1c8dfd427cb1fd157a47ba228f011e4654b94ac08239ffc955174c0b3123cd445c964ee81e3d3f01", + "40b439422c0be6b652784484e3f760dbe243d2e0639cc2d0b26405615142a3625c1bdd3b088e1444b6f350a01c3ea58439938d01dd0e5b7c840c81f47722b6c601", + "b79308cd0df36560badef6f66fc137a98d0ec27bd5be97b5b83ad94b7d26d94471c3b1d8814008c41524a204aadf208bef1deec1b4019720d2a751455b9d1eea01", + "5a286c751257180a33677d22ea8c66cb457436dd54babe3cdebdf932f6da769b24f99f6cbddfcdffb2d4b5a810431f412737d5bfb9f0de42808d926561b557f301", + "bd066317a372c59468c72f9aae202fe7a5f2f954058ced864b31523961068e0a1bc7e10fcee9ec16cf44580e4d3e7f6194b74dbd6bcf4cd1c5a35640b56293f601", + "cd6fef0e0329f7c11a1785c9b0788ba8be92a5d063486872ab8e85bedd9749995166dde4562ceab241e97f9441e9bb73c54eae7dc3eebea7cac286955ad9016300", + "a5656209f4e0d02c32c38322296de87bdd9688d560dd1d46025929f9a8adc3dc7cbd5127f06c58caf405c8e4c8add84e7e9319aef965e85f7c658173001b8c2f01", + "f3f53b4e7def065704eaf65ff500d33b0522524eb240ecd68d149902334d653a25ec6be35ff944478a852fbc74657d4c6e1c3caef0a525161dbc1b124920cd5000", + "14315ad0efe67c42a7c78da6b84709b22ed187d9417fd2639c88a8f5badf411b0c9ff5ff0420c05d63eb55ce98c743b8e74f73d100cf236cc30b4b397e25a13a01", + "8cd16c423b8ddb65d690651975404a6ead1c8bec450e24181e6c1f1ff914313f2744980e4a3f37977b91133c0c87430156073ef8f523a160e3f266eaa9d4e39100" + ] + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite.go b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite.go new file mode 100755 index 0000000..d4972fe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite.go @@ -0,0 +1,264 @@ +package testsuite + +import ( + "encoding/base64" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +// InputTestDataJSON contains hashes to be signed +type InputTestDataJSON struct { + Hashes []string `json:"hashes"` +} + +// KeysTestDataJSON contains address, public key, secret key and list of signatures +type KeysTestDataJSON struct { + Address string `json:"address"` + Secret string `json:"secret"` + Public string `json:"public"` + Signatures []string `json:"signatures,omitempty"` +} + +// SeedTestDataJSON contains data generated by Seed +type SeedTestDataJSON struct { + Seed string `json:"seed"` + Keys []KeysTestDataJSON `json:"keys"` +} + +// InputTestData contains hashes to be signed +type InputTestData struct { + Hashes []cipher.SHA256 +} + +// ToJSON converts InputTestData to InputTestDataJSON +func (d *InputTestData) ToJSON() *InputTestDataJSON { + hashes := make([]string, len(d.Hashes)) + for i, h := range d.Hashes { + hashes[i] = h.Hex() + } + + return &InputTestDataJSON{ + Hashes: hashes, + } +} + +// InputTestDataFromJSON converts InputTestDataJSON to InputTestData +func InputTestDataFromJSON(d *InputTestDataJSON) (*InputTestData, error) { + hashes := make([]cipher.SHA256, len(d.Hashes)) + for i, h := range d.Hashes { + var err error + hashes[i], err = cipher.SHA256FromHex(h) + if err != nil { + return nil, err + } + } + + return &InputTestData{ + Hashes: hashes, + }, nil +} + +// KeysTestData contains address, public key, secret key and list of signatures +type KeysTestData struct { + Address cipher.Address + Secret cipher.SecKey + Public cipher.PubKey + Signatures []cipher.Sig +} + +// ToJSON converts KeysTestData to KeysTestDataJSON +func (k *KeysTestData) ToJSON() *KeysTestDataJSON { + sigs := make([]string, len(k.Signatures)) + for i, s := range k.Signatures { + sigs[i] = s.Hex() + } + + return &KeysTestDataJSON{ + Address: k.Address.String(), + Secret: k.Secret.Hex(), + Public: k.Public.Hex(), + Signatures: sigs, + } +} + +// KeysTestDataFromJSON converts KeysTestDataJSON to KeysTestData +func KeysTestDataFromJSON(d *KeysTestDataJSON) (*KeysTestData, error) { + addr, err := cipher.DecodeBase58Address(d.Address) + if err != nil { + return nil, err + } + + s, err := cipher.SecKeyFromHex(d.Secret) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(d.Public) + if err != nil { + return nil, err + } + + var sigs []cipher.Sig + if d.Signatures != nil { + sigs = make([]cipher.Sig, len(d.Signatures)) + for i, s := range d.Signatures { + var err error + sigs[i], err = cipher.SigFromHex(s) + if err != nil { + return nil, err + } + } + } + + return &KeysTestData{ + Address: addr, + Secret: s, + Public: p, + Signatures: sigs, + }, nil +} + +// SeedTestData contains data generated by Seed +type SeedTestData struct { + Seed []byte + Keys []KeysTestData +} + +// ToJSON converts SeedTestData to SeedTestDataJSON +func (s *SeedTestData) ToJSON() *SeedTestDataJSON { + keys := make([]KeysTestDataJSON, len(s.Keys)) + for i, k := range s.Keys { + kj := k.ToJSON() + keys[i] = *kj + } + + return &SeedTestDataJSON{ + Seed: base64.StdEncoding.EncodeToString(s.Seed), + Keys: keys, + } +} + +// SeedTestDataFromJSON converts SeedTestDataJSON to SeedTestData +func SeedTestDataFromJSON(d *SeedTestDataJSON) (*SeedTestData, error) { + seed, err := base64.StdEncoding.DecodeString(d.Seed) + if err != nil { + return nil, err + } + + keys := make([]KeysTestData, len(d.Keys)) + for i, kj := range d.Keys { + k, err := KeysTestDataFromJSON(&kj) + if err != nil { + return nil, err + } + keys[i] = *k + } + + return &SeedTestData{ + Seed: seed, + Keys: keys, + }, nil +} + +// ValidateSeedData validates the provided SeedTestData against the current cipher library. +// inputData is required if SeedTestData contains signatures +func ValidateSeedData(seedData *SeedTestData, inputData *InputTestData) error { + keys := cipher.GenerateDeterministicKeyPairs(seedData.Seed, len(seedData.Keys)) + if len(seedData.Keys) != len(keys) { + return errors.New("cipher.GenerateDeterministicKeyPairs generated an unexpected number of keys") + } + + for i, s := range keys { + if s == (cipher.SecKey{}) { + return errors.New("secret key is null") + } + if seedData.Keys[i].Secret != s { + return errors.New("generated secret key does not match provided secret key") + } + + p := cipher.PubKeyFromSecKey(s) + if p == (cipher.PubKey{}) { + return errors.New("public key is null") + } + if seedData.Keys[i].Public != p { + return errors.New("derived public key does not match provided public key") + } + + addr1 := cipher.AddressFromPubKey(p) + if addr1 == (cipher.Address{}) { + return errors.New("address is null") + } + if seedData.Keys[i].Address != addr1 { + return errors.New("derived address does not match provided address") + } + + addr2 := cipher.AddressFromSecKey(s) + if addr1 != addr2 { + return errors.New("cipher.AddressFromPubKey and cipher.AddressFromSecKey generated different addresses") + } + + validSec := secp256k1.VerifySeckey(s[:]) + if validSec != 1 { + return errors.New("secp256k1.VerifySeckey failed") + } + + validPub := secp256k1.VerifyPubkey(p[:]) + if validPub != 1 { + return errors.New("secp256k1.VerifyPubkey failed") + } + + if inputData == nil && len(seedData.Keys[i].Signatures) != 0 { + return errors.New("seed data contains signatures but input data was not provided") + } + + if inputData != nil { + if len(seedData.Keys[i].Signatures) != len(inputData.Hashes) { + return errors.New("Number of signatures in seed data does not match number of hashes in input data") + } + + for j, h := range inputData.Hashes { + sig := seedData.Keys[i].Signatures[j] + if sig == (cipher.Sig{}) { + return errors.New("provided signature is null") + } + + err := cipher.VerifySignature(p, sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignature failed: %v", err) + } + + err = cipher.ChkSig(addr1, h, sig) + if err != nil { + return fmt.Errorf("cipher.ChkSig failed: %v", err) + } + + err = cipher.VerifySignedHash(sig, h) + if err != nil { + return fmt.Errorf("cipher.VerifySignedHash failed: %v", err) + } + + p2, err := cipher.PubKeyFromSig(sig, h) + if err != nil { + return fmt.Errorf("cipher.PubKeyFromSig failed: %v", err) + } + + if p != p2 { + return errors.New("public key derived from signature does not match public key derived from secret") + } + + sig2 := cipher.SignHash(h, s) + if sig2 == (cipher.Sig{}) { + return errors.New("created signature is null") + } + + // NOTE: signatures are not deterministic, they use a nonce, + // so we don't compare the generated sig to the provided sig + } + } + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite_test.go b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite_test.go new file mode 100755 index 0000000..7d28424 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cipher/testsuite/testsuite_test.go @@ -0,0 +1,76 @@ +package testsuite + +import ( + "os" + "path/filepath" + "regexp" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/file" +) + +const ( + testdataDir = "./testdata/" + manyAddressesFilename = "many-addresses.golden" + inputHashesFilename = "input-hashes.golden" + seedFileRegex = `seed-\d+.golden` +) + +func TestManyAddresses(t *testing.T) { + fn := filepath.Join(testdataDir, manyAddressesFilename) + + var dataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &dataJSON) + require.NoError(t, err) + + data, err := SeedTestDataFromJSON(&dataJSON) + require.NoError(t, err) + + err = ValidateSeedData(data, nil) + require.NoError(t, err) +} + +func TestSeedSignatures(t *testing.T) { + fn := filepath.Join(testdataDir, inputHashesFilename) + + var inputDataJSON InputTestDataJSON + err := file.LoadJSON(fn, &inputDataJSON) + require.NoError(t, err) + + inputData, err := InputTestDataFromJSON(&inputDataJSON) + require.NoError(t, err) + + seedFiles := traverseFiles(testdataDir, seedFileRegex) + + for _, fn := range seedFiles { + t.Run(fn, func(t *testing.T) { + fn = filepath.Join(testdataDir, fn) + + var seedDataJSON SeedTestDataJSON + err := file.LoadJSON(fn, &seedDataJSON) + require.NoError(t, err) + + seedData, err := SeedTestDataFromJSON(&seedDataJSON) + require.NoError(t, err) + + err = ValidateSeedData(seedData, inputData) + require.NoError(t, err) + }) + } +} + +func traverseFiles(dir string, filenameTemplate string) []string { // nolint: unparam + files := make([]string, 0) + filepath.Walk(dir, func(path string, f os.FileInfo, _ error) error { + if !f.IsDir() { + r, err := regexp.MatchString(filenameTemplate, f.Name()) + if err == nil && r { + files = append(files, f.Name()) + } + } + return nil + }) + return files +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go b/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go new file mode 100755 index 0000000..fb30eaf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/add_private_key.go @@ -0,0 +1,147 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +func addPrivateKeyCmd(cfg Config) gcli.Command { + name := "addPrivateKey" + return gcli.Command{ + Name: name, + Usage: "Add a private key to specific wallet", + ArgsUsage: "[private key]", + Description: fmt.Sprintf(`Add a private key to specific wallet, the default + wallet (%s) will be + used if the wallet file or path is not specified + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f", + Usage: "[wallet file or path] private key will be added to this wallet", + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] wallet password", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // get private key + skStr := c.Args().First() + if skStr == "" { + gcli.ShowSubcommandHelp(c) + return nil + } + // get wallet file path + w, err := resolveWalletPath(cfg, c.String("f")) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + + err = AddPrivateKeyToFile(w, skStr, pr) + + switch err.(type) { + case nil: + fmt.Println("success") + return nil + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + }, + } +} + +// AddPrivateKey adds a private key to a *wallet.Wallet. Caller should save the wallet afterwards +func AddPrivateKey(wlt *wallet.Wallet, key string) error { + sk, err := cipher.SecKeyFromHex(key) + if err != nil { + return fmt.Errorf("invalid private key: %s, must be a hex string of length 64", key) + } + + pk := cipher.PubKeyFromSecKey(sk) + addr := cipher.AddressFromPubKey(pk) + + entry := wallet.Entry{ + Address: addr, + Public: pk, + Secret: sk, + } + + return wlt.AddEntry(entry) +} + +// AddPrivateKeyToFile adds a private key to a wallet based on filename. Will save the wallet after modifying. +func AddPrivateKeyToFile(walletFile, key string, pr PasswordReader) error { + wlt, err := wallet.Load(walletFile) + if err != nil { + return WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return wallet.ErrMissingPassword + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return wallet.ErrWalletNotEncrypted + } + } + + addKey := func(w *wallet.Wallet, key string) error { + return AddPrivateKey(w, key) + } + + if wlt.IsEncrypted() { + addKey = func(w *wallet.Wallet, key string) error { + password, err := pr.Password() + if err != nil { + return err + } + + return w.GuardUpdate(password, func(wlt *wallet.Wallet) error { + return AddPrivateKey(wlt, key) + }) + } + } + + if err := addKey(wlt, key); err != nil { + return err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return err + } + + if err := wlt.Save(dir); err != nil { + return WalletSaveError{err} + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go b/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go new file mode 100755 index 0000000..9e9b4ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/address_gen.go @@ -0,0 +1,85 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + bip39 "github.com/skycoin/skycoin/src/cipher/go-bip39" + "github.com/skycoin/skycoin/src/wallet" +) + +func addressGenCmd() gcli.Command { + name := "addressGen" + return gcli.Command{ + Name: name, + Usage: "Generate skycoin or bitcoin addresses", + Description: "", + Flags: []gcli.Flag{ + gcli.IntFlag{ + Name: "count,c", + Value: 1, + Usage: "Number of addresses to generate", + }, + gcli.BoolFlag{ + Name: "hide-secret,s", + Usage: "Hide the secret key from the output", + }, + gcli.BoolFlag{ + Name: "bitcoin,b", + Usage: "Output the addresses as bitcoin addresses instead of skycoin addresses", + }, + gcli.BoolFlag{ + Name: "hex,x", + Usage: "Use hex(sha256sum(rand(1024))) (CSPRNG-generated) as the seed if not seed is not provided", + }, + gcli.BoolFlag{ + Name: "only-addr,oa", + Usage: "Only show generated address list, hide seed, secret key and public key", + }, + gcli.StringFlag{ + Name: "seed", + Usage: "Seed for deterministic key generation. Will use bip39 as the seed if not provided.", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + var coinType wallet.CoinType + if c.Bool("bitcoin") { + coinType = wallet.CoinTypeBitcoin + } else { + coinType = wallet.CoinTypeSkycoin + } + + seed := c.String("seed") + if seed == "" { + hex := c.Bool("hex") + if hex { + // generate a new seed, as hex string + seed = cipher.SumSHA256(cipher.RandByte(1024)).Hex() + } else { + var err error + seed, err = bip39.NewDefaultMnemonic() + if err != nil { + return err + } + } + } + + w, err := wallet.CreateAddresses(coinType, seed, c.Int("count"), c.Bool("hide-secret")) + if err != nil { + return err + } + + if !c.Bool("only-addr") { + return printJSON(w) + } + + for _, e := range w.Entries { + fmt.Println(e.Address) + } + return nil + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/blocks.go b/vendor/github.com/skycoin/skycoin/src/cli/blocks.go new file mode 100755 index 0000000..826deb7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/blocks.go @@ -0,0 +1,53 @@ +package cli + +import ( + "fmt" + "strconv" + + gcli "github.com/urfave/cli" +) + +func blocksCmd() gcli.Command { + name := "blocks" + return gcli.Command{ + Name: name, + Usage: "Lists the content of a single block or a range of blocks", + ArgsUsage: "[starting block or single block seq] [ending block seq]", + Action: getBlocks, + OnUsageError: onCommandUsageError(name), + } + // Commands = append(Commands, cmd) +} + +func getBlocks(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + + // get start + start := c.Args().Get(0) + end := c.Args().Get(1) + if end == "" { + end = start + } + + if start == "" { + gcli.ShowSubcommandHelp(c) + return nil + } + + s, err := strconv.ParseUint(start, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", start) + } + + e, err := strconv.ParseUint(end, 10, 64) + if err != nil { + return fmt.Errorf("invalid block seq: %v, must be unsigned integer", end) + } + + rlt, err := rpcClient.GetBlocks(s, e) + if err != nil { + return err + } + + return printJSON(rlt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go b/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go new file mode 100755 index 0000000..02473bd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/broadcast_rawtx.go @@ -0,0 +1,34 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" +) + +func broadcastTxCmd() gcli.Command { + name := "broadcastTransaction" + return gcli.Command{ + Name: name, + Usage: "Broadcast a raw transaction to the network", + ArgsUsage: "[raw transaction]", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + rawtx := c.Args().First() + if rawtx == "" { + gcli.ShowSubcommandHelp(c) + return nil + } + + rpcClient := RPCClientFromContext(c) + txid, err := rpcClient.InjectTransactionString(rawtx) + if err != nil { + return err + } + + fmt.Println(txid) + return nil + }, + } + // Commands = append(Commands, cmd) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go b/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go new file mode 100755 index 0000000..9e99a18 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/check_balance.go @@ -0,0 +1,277 @@ +package cli + +import ( + "fmt" + "strconv" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/wallet" +) + +// Balance represents an coin and hours balance +type Balance struct { + Coins string `json:"coins"` + Hours string `json:"hours"` +} + +// AddressBalance represents an address's balance +type AddressBalance struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Address string `json:"address"` +} + +// BalanceResult represents an set of addresses' balances +type BalanceResult struct { + Confirmed Balance `json:"confirmed"` + Spendable Balance `json:"spendable"` + Expected Balance `json:"expected"` + Addresses []AddressBalance `json:"addresses"` +} + +func walletBalanceCmd(cfg Config) gcli.Command { + name := "walletBalance" + return gcli.Command{ + Name: name, + Usage: "Check the balance of a wallet", + ArgsUsage: "[wallet]", + Description: fmt.Sprintf(`Check balance of specific wallet, the default + wallet (%s) will be + used if no wallet was specified, use ENV 'WALLET_NAME' + to update default wallet file name, and 'WALLET_DIR' to update + the default wallet directory`, cfg.FullWalletPath()), + OnUsageError: onCommandUsageError(name), + Action: checkWltBalance, + } +} + +func addressBalanceCmd() gcli.Command { + name := "addressBalance" + return gcli.Command{ + Name: name, + Usage: "Check the balance of specific addresses", + ArgsUsage: "[addresses]", + Description: `Check balance of specific addresses, join multiple addresses with space. + example: addressBalance "$addr1 $addr2 $addr3"`, + OnUsageError: onCommandUsageError(name), + Action: addrBalance, + } +} + +func checkWltBalance(c *gcli.Context) error { + cfg := ConfigFromContext(c) + rpcClient := RPCClientFromContext(c) + + var w string + if c.NArg() > 0 { + w = c.Args().First() + } + + var err error + w, err = resolveWalletPath(cfg, w) + if err != nil { + return err + } + + balRlt, err := CheckWalletBalance(rpcClient, w) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + default: + return err + } + + return printJSON(balRlt) +} + +func addrBalance(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + + addrs := make([]string, c.NArg()) + var err error + for i := 0; i < c.NArg(); i++ { + addrs[i] = c.Args().Get(i) + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + balRlt, err := GetBalanceOfAddresses(rpcClient, addrs) + if err != nil { + return err + } + + return printJSON(balRlt) +} + +// PUBLIC + +// CheckWalletBalance returns the total and individual balances of addresses in a wallet file +func CheckWalletBalance(c *webrpc.Client, walletFile string) (*BalanceResult, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + var addrs []string + addresses := wlt.GetAddresses() + for _, a := range addresses { + addrs = append(addrs, a.String()) + } + + return GetBalanceOfAddresses(c, addrs) +} + +// GetBalanceOfAddresses returns the total and individual balances of a set of addresses +func GetBalanceOfAddresses(c *webrpc.Client, addrs []string) (*BalanceResult, error) { + outs, err := c.GetUnspentOutputs(addrs) + if err != nil { + return nil, err + } + + return getBalanceOfAddresses(outs, addrs) +} + +func getBalanceOfAddresses(outs *webrpc.OutputsResult, addrs []string) (*BalanceResult, error) { + addrsMap := make(map[string]struct{}, len(addrs)) + for _, a := range addrs { + addrsMap[a] = struct{}{} + } + + addrBalances := make(map[string]struct { + confirmed, spendable, expected wallet.Balance + }, len(addrs)) + + // Count confirmed balances + for _, o := range outs.Outputs.HeadOutputs { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.confirmed.Coins += amt + b.confirmed.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count spendable balances + for _, o := range outs.Outputs.SpendableOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.spendable.Coins += amt + b.spendable.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + // Count predicted balances + for _, o := range outs.Outputs.ExpectedOutputs() { + if _, ok := addrsMap[o.Address]; !ok { + return nil, fmt.Errorf("Found address %s in GetUnspentOutputs result, but this address wasn't requested", o.Address) + } + + amt, err := droplet.FromString(o.Coins) + if err != nil { + return nil, fmt.Errorf("droplet.FromString failed: %v", err) + } + + b := addrBalances[o.Address] + b.expected.Coins += amt + b.expected.Hours += o.CalculatedHours + + addrBalances[o.Address] = b + } + + toBalance := func(b wallet.Balance) (Balance, error) { + coins, err := droplet.ToString(b.Coins) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: strconv.FormatUint(b.Hours, 10), + }, nil + } + + var totalConfirmed, totalSpendable, totalExpected wallet.Balance + balRlt := &BalanceResult{ + Addresses: make([]AddressBalance, len(addrs)), + } + + for i, a := range addrs { + b := addrBalances[a] + var err error + + balRlt.Addresses[i].Address = a + + totalConfirmed, err = totalConfirmed.Add(b.confirmed) + if err != nil { + return nil, err + } + + totalSpendable, err = totalSpendable.Add(b.spendable) + if err != nil { + return nil, err + } + + totalExpected, err = totalExpected.Add(b.expected) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Confirmed, err = toBalance(b.confirmed) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Spendable, err = toBalance(b.spendable) + if err != nil { + return nil, err + } + + balRlt.Addresses[i].Expected, err = toBalance(b.expected) + if err != nil { + return nil, err + } + } + + var err error + balRlt.Confirmed, err = toBalance(totalConfirmed) + if err != nil { + return nil, err + } + + balRlt.Spendable, err = toBalance(totalSpendable) + if err != nil { + return nil, err + } + + balRlt.Expected, err = toBalance(totalExpected) + if err != nil { + return nil, err + } + + return balRlt, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/check_balance_test.go b/vendor/github.com/skycoin/skycoin/src/cli/check_balance_test.go new file mode 100755 index 0000000..e662717 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/check_balance_test.go @@ -0,0 +1,266 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor" +) + +func TestGetBalanceOfAddresses(t *testing.T) { + addrs := []string{ + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + testutil.MakeAddress().String(), + } + + hashes := make([]string, 10) + for i := 0; i < len(hashes); i++ { + h := testutil.RandSHA256(t) + hashes[i] = h.Hex() + } + + cases := []struct { + name string + outs visor.ReadableOutputSet + addrs []string + result *BalanceResult + err error + }{ + { + name: "confirmed == spendable == expected", + outs: visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "99.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 120000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "23.111111", + CalculatedHours: 123, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Expected: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Addresses: []AddressBalance{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Expected: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Expected: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Address: addrs[2], + }, + }, + }, + }, + + { + name: "confirmed != spendable != expected", + outs: visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashes[0], + Address: addrs[0], + Coins: "89.900000", + CalculatedHours: 3000, + }, + { + Hash: hashes[1], + Address: addrs[0], + Coins: "0.100000", + CalculatedHours: 97000, + }, + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[2], + Address: addrs[2], + Coins: "1.000001", + CalculatedHours: 23, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + OutgoingOutputs: visor.ReadableOutputs{ + { + Hash: hashes[5], + Address: addrs[0], + Coins: "10.000000", + CalculatedHours: 23000, + }, + { + Hash: hashes[6], + Address: addrs[2], + Coins: "22.111110", + CalculatedHours: 100, + }, + }, + IncomingOutputs: visor.ReadableOutputs{ + { + Hash: hashes[3], + Address: addrs[1], + Coins: "1.000000", + CalculatedHours: 333, + }, + { + Hash: hashes[4], + Address: addrs[1], + Coins: "0.111111", + CalculatedHours: 0, + }, + { + Hash: hashes[7], + Address: addrs[2], + Coins: "44.999999", + CalculatedHours: 433, + }, + }, + }, + addrs: addrs, + result: &BalanceResult{ + Confirmed: Balance{ + Coins: "123.111111", + Hours: "123123", + }, + Spendable: Balance{ + Coins: "91.000001", + Hours: "100023", + }, + Expected: Balance{ + Coins: "137.111111", + Hours: "100789", + }, + Addresses: []AddressBalance{ + { + Confirmed: Balance{ + Coins: "100.000000", + Hours: "123000", + }, + Spendable: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Expected: Balance{ + Coins: "90.000000", + Hours: "100000", + }, + Address: addrs[0], + }, + { + Confirmed: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Spendable: Balance{ + Coins: "0.000000", + Hours: "0", + }, + Expected: Balance{ + Coins: "1.111111", + Hours: "333", + }, + Address: addrs[1], + }, + { + Confirmed: Balance{ + Coins: "23.111111", + Hours: "123", + }, + Spendable: Balance{ + Coins: "1.000001", + Hours: "23", + }, + Expected: Balance{ + Coins: "46.000000", + Hours: "456", + }, + Address: addrs[2], + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + outs := &webrpc.OutputsResult{ + Outputs: tc.outs, + } + result, err := getBalanceOfAddresses(outs, tc.addrs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go b/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go new file mode 100755 index 0000000..a43dbea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/checkdb.go @@ -0,0 +1,85 @@ +package cli + +import ( + "fmt" + "os" + "time" + + "github.com/boltdb/bolt" + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +const ( + blockchainPubkey = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +// wrapDB calls dbutil.WrapDB and disables all logging +func wrapDB(db *bolt.DB) *dbutil.DB { + wdb := dbutil.WrapDB(db) + wdb.ViewLog = false + wdb.ViewTrace = false + wdb.UpdateLog = false + wdb.UpdateTrace = false + wdb.DurationLog = false + return wdb +} + +func checkdbCmd() gcli.Command { + name := "checkdb" + return gcli.Command{ + Name: name, + Usage: "Verify the database", + ArgsUsage: "[db path]", + Description: "If no argument is specificed, the default data.db in $HOME/.$COIN/ will be checked.", + OnUsageError: onCommandUsageError(name), + Action: checkdb, + } +} + +func checkdb(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // get db path + dbpath, err := resolveDBPath(cfg, c.Args().First()) + if err != nil { + return err + } + + // check if this file is exist + if _, err := os.Stat(dbpath); os.IsNotExist(err) { + return fmt.Errorf("db file: %v does not exist", dbpath) + } + + db, err := bolt.Open(dbpath, 0600, &bolt.Options{ + Timeout: 5 * time.Second, + ReadOnly: true, + }) + + if err != nil { + return fmt.Errorf("open db failed: %v", err) + } + pubkey, err := cipher.PubKeyFromHex(blockchainPubkey) + if err != nil { + return fmt.Errorf("decode blockchain pubkey failed: %v", err) + } + + quit := QuitChanFromContext(c) + go func() { + apputil.CatchInterrupt(quit) + }() + + if err := visor.CheckDatabase(wrapDB(db), pubkey, quit); err != nil { + if err == visor.ErrVerifyStopped { + return nil + } + return fmt.Errorf("checkdb failed: %v", err) + } + + fmt.Println("check db success") + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/cli.go b/vendor/github.com/skycoin/skycoin/src/cli/cli.go new file mode 100755 index 0000000..15679d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/cli.go @@ -0,0 +1,409 @@ +/* +Package cli implements an interface for creating a CLI application. +Includes methods for manipulating wallets files and interacting with the +webrpc API to query a skycoin node's status. +*/ +package cli + +import ( + "encoding/json" + "errors" + "fmt" + "net/url" + "path/filepath" + "strconv" + "strings" + "syscall" + + "os" + + gcli "github.com/urfave/cli" + "golang.org/x/crypto/ssh/terminal" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/util/file" +) + +const ( + // Version is the CLI Version + Version = "0.24.1" + walletExt = ".wlt" + defaultCoin = "skycoin" + defaultWalletName = "$COIN_cli" + walletExt + defaultWalletDir = "$DATA_DIR/wallets" + defaultRPCAddress = "http://127.0.0.1:6420" + defaultDataDir = "$HOME/.$COIN/" +) + +var ( + envVarsHelp = fmt.Sprintf(`ENVIRONMENT VARIABLES: + RPC_ADDR: Address of RPC node. Must be in scheme://host format. Default "%s" + COIN: Name of the coin. Default "%s" + USE_CSRF: Set to 1 or true if the remote node has CSRF enabled. Default false (unset) + WALLET_DIR: Directory where wallets are stored. This value is overriden by any subcommand flag specifying a wallet filename, if that filename includes a path. Default "%s" + WALLET_NAME: Name of wallet file (without path). This value is overriden by any subcommand flag specifying a wallet filename. Default "%s" + DATA_DIR: Directory where everything is stored. Default "%s"`, defaultRPCAddress, defaultCoin, defaultWalletDir, defaultWalletName, defaultDataDir) + + commandHelpTemplate = fmt.Sprintf(`USAGE: + {{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .VisibleFlags}} + +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +%s +`, envVarsHelp) + + appHelpTemplate = fmt.Sprintf(`NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +%s +`, envVarsHelp) + + // ErrWalletName is returned if the wallet file name is invalid + ErrWalletName = fmt.Errorf("error wallet file name, must have %s extension", walletExt) + // ErrAddress is returned if an address is invalid + ErrAddress = errors.New("invalid address") + // ErrJSONMarshal is returned if JSON marshaling failed + ErrJSONMarshal = errors.New("json marshal failed") +) + +// App Wraps the app so that main package won't use the raw App directly, +// which will cause import issue +type App struct { + gcli.App +} + +// Config cli's configuration struct +type Config struct { + WalletDir string `json:"wallet_directory"` + WalletName string `json:"wallet_name"` + DataDir string `json:"data_directory"` + Coin string `json:"coin"` + RPCAddress string `json:"rpc_address"` + UseCSRF bool `json:"use_csrf"` +} + +// LoadConfig loads config from environment, prior to parsing CLI flags +func LoadConfig() (Config, error) { + // get coin name from env + coin := os.Getenv("COIN") + if coin == "" { + coin = defaultCoin + } + + // get rpc address from env + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = defaultRPCAddress + } + + if _, err := url.Parse(rpcAddr); err != nil { + return Config{}, errors.New("RPC_ADDR must be in scheme://host format") + } + + home := file.UserHome() + + // get data dir dir from env + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = filepath.Join(home, fmt.Sprintf(".%s", coin)) + } + + // get wallet dir from env + wltDir := os.Getenv("WALLET_DIR") + if wltDir == "" { + wltDir = filepath.Join(dataDir, "wallets") + } + + // get wallet name from env + wltName := os.Getenv("WALLET_NAME") + if wltName == "" { + wltName = fmt.Sprintf("%s_cli%s", coin, walletExt) + } + + if !strings.HasSuffix(wltName, walletExt) { + return Config{}, ErrWalletName + } + var useCSRF bool + useCSRFStr := os.Getenv("USE_CSRF") + if useCSRFStr != "" { + var err error + useCSRF, err = strconv.ParseBool(useCSRFStr) + if err != nil { + return Config{}, errors.New("Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") + } + } + + return Config{ + WalletDir: wltDir, + WalletName: wltName, + DataDir: dataDir, + Coin: coin, + RPCAddress: rpcAddr, + UseCSRF: useCSRF, + }, nil +} + +// FullWalletPath returns the joined wallet dir and wallet name path +func (c Config) FullWalletPath() string { + return filepath.Join(c.WalletDir, c.WalletName) +} + +// FullDBPath returns the joined data directory and db file name path +func (c Config) FullDBPath() string { + return filepath.Join(c.DataDir, "data.db") +} + +// Returns a full wallet path based on cfg and optional cli arg specifying wallet file +// FIXME: A CLI flag for the wallet filename is redundant with the envvar. Remove the flags or the envvar. +func resolveWalletPath(cfg Config, w string) (string, error) { + if w == "" { + w = cfg.FullWalletPath() + } + + if !strings.HasSuffix(w, walletExt) { + return "", ErrWalletName + } + + // If w is only the basename, use the default wallet directory + if filepath.Base(w) == w { + w = filepath.Join(cfg.WalletDir, w) + } + + absW, err := filepath.Abs(w) + if err != nil { + return "", fmt.Errorf("Invalid wallet path %s: %v", w, err) + } + + return absW, nil +} + +func resolveDBPath(cfg Config, db string) (string, error) { + if db == "" { + db = cfg.FullDBPath() + } + + // If db is only the basename, use the default data dir + if filepath.Base(db) == db { + db = filepath.Join(cfg.DataDir, db) + } + + absDB, err := filepath.Abs(db) + if err != nil { + return "", fmt.Errorf("Invalid data path %s: %v", db, err) + } + return absDB, nil +} + +// NewApp creates an app instance +func NewApp(cfg Config) (*App, error) { + gcli.AppHelpTemplate = appHelpTemplate + gcli.SubcommandHelpTemplate = commandHelpTemplate + gcli.CommandHelpTemplate = commandHelpTemplate + + gcliApp := gcli.NewApp() + app := &App{ + App: *gcliApp, + } + + commands := []gcli.Command{ + addPrivateKeyCmd(cfg), + addressBalanceCmd(), + addressGenCmd(), + addressOutputsCmd(), + blocksCmd(), + broadcastTxCmd(), + checkdbCmd(), + createRawTxCmd(cfg), + decodeRawTxCmd(), + generateAddrsCmd(cfg), + generateWalletCmd(cfg), + lastBlocksCmd(), + listAddressesCmd(), + listWalletsCmd(), + sendCmd(), + showConfigCmd(), + statusCmd(), + transactionCmd(), + verifyAddressCmd(), + versionCmd(), + walletBalanceCmd(cfg), + walletDirCmd(), + walletHisCmd(), + walletOutputsCmd(cfg), + encryptWalletCmd(cfg), + decryptWalletCmd(cfg), + showSeedCmd(cfg), + } + + app.Name = fmt.Sprintf("%s-cli", cfg.Coin) + app.Version = Version + app.Usage = fmt.Sprintf("the %s command line interface", cfg.Coin) + app.Commands = commands + app.EnableBashCompletion = true + app.OnUsageError = func(context *gcli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(context.App.Writer, "Error: %v\n\n", err) + gcli.ShowAppHelp(context) + return nil + } + app.CommandNotFound = func(ctx *gcli.Context, command string) { + tmp := fmt.Sprintf("{{.HelpName}}: '%s' is not a {{.HelpName}} command. See '{{.HelpName}} --help'.\n", command) + gcli.HelpPrinter(app.Writer, tmp, app) + gcli.OsExiter(1) + } + + rpcClient, err := webrpc.NewClient(cfg.RPCAddress) + if err != nil { + return nil, err + } + rpcClient.UseCSRF = cfg.UseCSRF + + app.Metadata = map[string]interface{}{ + "config": cfg, + "rpc": rpcClient, + "quitChan": make(chan struct{}), + } + + return app, nil +} + +// Run starts the app +func (app *App) Run(args []string) error { + return app.App.Run(args) +} + +// RPCClientFromContext returns a webrpc.Client from a urfave/cli Context +func RPCClientFromContext(c *gcli.Context) *webrpc.Client { + return c.App.Metadata["rpc"].(*webrpc.Client) +} + +// ConfigFromContext returns a Config from a urfave/cli Context +func ConfigFromContext(c *gcli.Context) Config { + return c.App.Metadata["config"].(Config) +} + +// QuitChanFromContext returns a chan struct{} from a urfave/cli Context +func QuitChanFromContext(c *gcli.Context) chan struct{} { + return c.App.Metadata["quitChan"].(chan struct{}) +} + +func onCommandUsageError(command string) gcli.OnUsageErrorFunc { + return func(c *gcli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(c.App.Writer, "Error: %v\n\n", err) + gcli.ShowCommandHelp(c, command) + return nil + } +} + +func errorWithHelp(c *gcli.Context, err error) { + fmt.Fprintf(c.App.Writer, "Error: %v. See '%s %s --help'\n\n", err, c.App.HelpName, c.Command.Name) +} + +func formatJSON(obj interface{}) ([]byte, error) { + d, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return nil, ErrJSONMarshal + } + return d, nil +} + +func printJSON(obj interface{}) error { + d, err := formatJSON(obj) + if err != nil { + return err + } + + fmt.Println(string(d)) + + return nil +} + +// readPasswordFromTerminal promotes user to enter password and read it. +func readPasswordFromTerminal() ([]byte, error) { + // Promotes to enter the wallet password + fmt.Fprint(os.Stdout, "enter password:") + bp, err := terminal.ReadPassword(int(syscall.Stdin)) + if err != nil { + return nil, err + } + fmt.Fprintln(os.Stdout, "") + return bp, nil +} + +// PUBLIC + +// WalletLoadError is returned if a wallet could not be loaded +type WalletLoadError struct { + error +} + +// WalletSaveError is returned if a wallet could not be saved +type WalletSaveError struct { + error +} + +// PasswordReader is an interface for getting password +type PasswordReader interface { + Password() ([]byte, error) +} + +// PasswordFromBytes represents an implementation of PasswordReader, +// which reads password from the bytes itself. +type PasswordFromBytes []byte + +// Password implements the PasswordReader's Password method +func (p PasswordFromBytes) Password() ([]byte, error) { + return []byte(p), nil +} + +// PasswordFromTerm reads password from terminal +type PasswordFromTerm struct{} + +// Password implements the PasswordReader's Password method +func (p PasswordFromTerm) Password() ([]byte, error) { + v, err := readPasswordFromTerminal() + if err != nil { + return nil, err + } + + return v, nil +} + +// NewPasswordReader creats a PasswordReader instance, +// reads password from the input bytes first, if it's empty, then read from terminal. +func NewPasswordReader(p []byte) PasswordReader { + if len(p) != 0 { + return PasswordFromBytes(p) + } + + return PasswordFromTerm{} +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/cli_test.go b/vendor/github.com/skycoin/skycoin/src/cli/cli_test.go new file mode 100755 index 0000000..7bc3939 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/cli_test.go @@ -0,0 +1,255 @@ +package cli + +import ( + "fmt" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/file" +) + +func Example() { + // In cmd/cli/cli.go: + cfg, err := LoadConfig() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + app, err := NewApp(cfg) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := app.Run(os.Args); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func TestLoadConfig(t *testing.T) { + t.Run("set COIN", func(t *testing.T) { + val := "foocoin" + os.Setenv("COIN", val) + defer os.Unsetenv("COIN") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.Coin, val) + }) + + t.Run("set RPC_ADDR", func(t *testing.T) { + val := "http://111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.RPCAddress, val) + }) + + t.Run("set RPC_ADDR invalid", func(t *testing.T) { + val := "111.22.33.44:5555" + os.Setenv("RPC_ADDR", val) + defer os.Unsetenv("RPC_ADDR") + + _, err := LoadConfig() + testutil.RequireError(t, err, "RPC_ADDR must be in scheme://host format") + }) + + t.Run("set WALLET_DIR", func(t *testing.T) { + val := "/home/foo/bar" + os.Setenv("WALLET_DIR", val) + defer os.Unsetenv("WALLET_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.WalletDir, val) + }) + + t.Run("set WALLET_NAME", func(t *testing.T) { + val := "bar.wlt" + os.Setenv("WALLET_NAME", val) + defer os.Unsetenv("WALLET_NAME") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.WalletName, val) + }) + + t.Run("set WALLET_NAME invalid", func(t *testing.T) { + val := "badwltext.foo" + os.Setenv("WALLET_NAME", val) + defer os.Unsetenv("WALLET_NAME") + + _, err := LoadConfig() + require.Error(t, err) + require.Equal(t, ErrWalletName, err) + }) + + t.Run("set DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + }) + + t.Run("set WALLET_DIR by DATA_DIR", func(t *testing.T) { + val := "/home/foo/" + os.Setenv("DATA_DIR", val) + defer os.Unsetenv("DATA_DIR") + valWallet := val + "wallets" + cfg, err := LoadConfig() + require.NoError(t, err) + require.Equal(t, cfg.DataDir, val) + require.Equal(t, cfg.WalletDir, valWallet) + }) + + t.Run("don't set USE_CSRF", func(t *testing.T) { + os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.False(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF false", func(t *testing.T) { + val := "0" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.False(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF true", func(t *testing.T) { + val := "1" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + c, err := LoadConfig() + require.NoError(t, err) + require.True(t, c.UseCSRF) + }) + + t.Run("set USE_CSRF invalid", func(t *testing.T) { + val := "not_boolean" + os.Setenv("USE_CSRF", val) + defer os.Unsetenv("USE_CSRF") + + _, err := LoadConfig() + testutil.RequireError(t, err, "Invalid USE_CSRF value, must be interpretable as a boolean e.g. 0, 1, true, false") + }) +} + +func TestResolveWalletPath(t *testing.T) { + mustLoadConfig := func() Config { + cfg, err := LoadConfig() + require.NoError(t, err) + return cfg + } + + defaultCfg := mustLoadConfig() + expectedFullPath := fmt.Sprintf("%[1]s/.%[2]s/wallets/%[2]s_cli%[3]s", file.UserHome(), defaultCoin, walletExt) + require.Equal(t, expectedFullPath, defaultCfg.FullWalletPath()) + + absPathInput := "./foo/bar.wlt" + absPathOutput, err := filepath.Abs(absPathInput) + require.NoError(t, err) + + tests := []struct { + Name string + WalletDir string + WalletName string + WalletArg string + Error error + Expected string + }{ + { + Name: "default config, empty cli arg", + Expected: defaultCfg.WalletDir + "/" + defaultCfg.WalletName, + }, + { + Name: "default config, nonempty cli arg, invalid extension", + WalletArg: "badwltext.foo", + Error: ErrWalletName, + }, + { + Name: "default config, nonempty cli arg, valid", + WalletArg: "foo.wlt", + Expected: defaultCfg.WalletDir + "/foo.wlt", + }, + { + Name: "nondefault config wallet name, empty cli arg", + WalletName: "bar.wlt", + Expected: defaultCfg.WalletDir + "/bar.wlt", + }, + { + Name: "nondefault config wallet name invalid, empty cli arg", + WalletName: "badwltext.foo", + Error: ErrWalletName, + }, + { + Name: "nondefault config wallet path, empty cli arg", + WalletDir: "/home/foo/somewhere", + Expected: "/home/foo/somewhere/" + defaultCfg.WalletName, + }, + { + Name: "nondefault config wallet path and name, empty cli arg", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + Expected: "/home/foo/somewhere/bar.wlt", + }, + { + Name: "nondefault config wallet path and name, cli arg, valid, name only", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + WalletArg: "foo.wlt", + Expected: "/home/foo/somewhere/foo.wlt", + }, + { + Name: "nondefault config wallet path and name, cli arg, valid, with path", + WalletDir: "/home/foo/somewhere", + WalletName: "bar.wlt", + WalletArg: "/usr/lib/foo.wlt", + Expected: "/usr/lib/foo.wlt", + }, + { + Name: "wallet arg relative path", + WalletArg: absPathInput, + Expected: absPathOutput, + }, + } + + for _, tc := range tests { + t.Run(tc.Name, func(t *testing.T) { + cfg := mustLoadConfig() + if tc.WalletDir != "" { + cfg.WalletDir = tc.WalletDir + } + if tc.WalletName != "" { + cfg.WalletName = tc.WalletName + } + + w, err := resolveWalletPath(cfg, tc.WalletArg) + + if tc.Error == nil { + require.NoError(t, err) + require.Equal(t, tc.Expected, w) + require.True(t, filepath.IsAbs(w)) + } else { + require.Error(t, err) + require.Equal(t, tc.Error, err) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go new file mode 100755 index 0000000..c1b118a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx.go @@ -0,0 +1,686 @@ +package cli + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "strings" + + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/fee" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +var ( + // ErrTemporaryInsufficientBalance is returned if a wallet does not have enough balance for a spend, but will have enough after unconfirmed transactions confirm + ErrTemporaryInsufficientBalance = errors.New("balance is not sufficient. Balance will be sufficient after unconfirmed transactions confirm") +) + +// SendAmount represents an amount to send to an address +type SendAmount struct { + Addr string + Coins uint64 +} + +type sendAmountJSON struct { + Addr string `json:"addr"` + Coins string `json:"coins"` +} + +func createRawTxCmd(cfg Config) gcli.Command { + name := "createRawTransaction" + return gcli.Command{ + Name: name, + Usage: "Create a raw transaction to be broadcast to the network later", + ArgsUsage: "[to address] [amount]", + Description: fmt.Sprintf(` + Note: The [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + The default wallet (%s) will be + used if no wallet and address was specified. + + + If you are sending from a wallet the coins will be taken iteratively + from all addresses within the wallet starting with the first address until + the amount of the transaction is met. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f", + Usage: "[wallet file or path], From wallet", + }, + gcli.StringFlag{ + Name: "a", + Usage: "[address] From address", + }, + gcli.StringFlag{ + Name: "c", + Usage: `[changeAddress] Specify different change address. + By default the from address or a wallets coinbase address will be used.`, + }, + gcli.StringFlag{ + Name: "m", + Usage: `[send to many] use JSON string to set multiple receive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`, + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + gcli.BoolFlag{ + Name: "json,j", + Usage: "Returns the results in JSON format.", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + tx, err := createRawTxCmdHandler(c) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + rawTx := hex.EncodeToString(tx.Serialize()) + + if c.Bool("json") { + return printJSON(struct { + RawTx string `json:"rawtx"` + }{ + RawTx: rawTx, + }) + } + + fmt.Println(rawTx) + return nil + }, + } +} + +type walletAddress struct { + Wallet string + Address string +} + +func fromWalletOrAddress(c *gcli.Context) (walletAddress, error) { + cfg := ConfigFromContext(c) + + wlt, err := resolveWalletPath(cfg, c.String("f")) + if err != nil { + return walletAddress{}, err + } + + wltAddr := walletAddress{ + Wallet: wlt, + } + + wltAddr.Address = c.String("a") + if wltAddr.Address == "" { + return wltAddr, nil + } + + if _, err := cipher.DecodeBase58Address(wltAddr.Address); err != nil { + return walletAddress{}, fmt.Errorf("invalid address: %s", wltAddr.Address) + } + + return wltAddr, nil +} + +func getChangeAddress(wltAddr walletAddress, chgAddr string) (string, error) { + if chgAddr == "" { + switch { + case wltAddr.Address != "": + // use the from address as change address + chgAddr = wltAddr.Address + case wltAddr.Wallet != "": + // get the default wallet's coin base address + wlt, err := wallet.Load(wltAddr.Wallet) + if err != nil { + return "", WalletLoadError{err} + } + + if len(wlt.Entries) > 0 { + chgAddr = wlt.Entries[0].Address.String() + } else { + return "", errors.New("no change address was found") + } + default: + return "", errors.New("both wallet file, from address and change address are empty") + } + } + + // validate the address + _, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return "", fmt.Errorf("invalid change address: %s", chgAddr) + } + + return chgAddr, nil +} + +func getToAddresses(c *gcli.Context) ([]SendAmount, error) { + m := c.String("m") + if m != "" { + sas := []sendAmountJSON{} + if err := json.NewDecoder(strings.NewReader(m)).Decode(&sas); err != nil { + return nil, fmt.Errorf("invalid -m flag string, err:%v", err) + } + sendAmts := make([]SendAmount, 0, len(sas)) + for _, sa := range sas { + amt, err := droplet.FromString(sa.Coins) + if err != nil { + return nil, fmt.Errorf("invalid coins value in -m flag string: %v", err) + } + + sendAmts = append(sendAmts, SendAmount{ + Addr: sa.Addr, + Coins: amt, + }) + } + return sendAmts, nil + } + + if c.NArg() < 2 { + return nil, errors.New("invalid argument") + } + + toAddr := c.Args().First() + // validate address + if _, err := cipher.DecodeBase58Address(toAddr); err != nil { + return nil, err + } + + amt, err := getAmount(c) + if err != nil { + return nil, err + } + return []SendAmount{{toAddr, amt}}, nil +} + +func getAmount(c *gcli.Context) (uint64, error) { + if c.NArg() < 2 { + return 0, errors.New("invalid argument") + } + + amount := c.Args().Get(1) + amt, err := droplet.FromString(amount) + if err != nil { + return 0, fmt.Errorf("invalid amount: %v", err) + } + + return amt, nil +} + +func createRawTxCmdHandler(c *gcli.Context) (*coin.Transaction, error) { + rpcClient := RPCClientFromContext(c) + + wltAddr, err := fromWalletOrAddress(c) + if err != nil { + return nil, err + } + + chgAddr, err := getChangeAddress(wltAddr, c.String("c")) + if err != nil { + return nil, err + } + + toAddrs, err := getToAddresses(c) + if err != nil { + return nil, err + } + + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + if wltAddr.Address == "" { + return CreateRawTxFromWallet(rpcClient, wltAddr.Wallet, chgAddr, toAddrs, pr) + } + + return CreateRawTxFromAddress(rpcClient, wltAddr.Address, wltAddr.Wallet, chgAddr, toAddrs, pr) +} + +func validateSendAmounts(toAddrs []SendAmount) error { + for _, arg := range toAddrs { + // validate to address + _, err := cipher.DecodeBase58Address(arg.Addr) + if err != nil { + return ErrAddress + } + + if arg.Coins == 0 { + return errors.New("Cannot send 0 coins") + } + } + + if len(toAddrs) == 0 { + return errors.New("No destination addresses") + } + + return nil +} + +// PUBLIC + +// CreateRawTxFromWallet creates a transaction from any address or combination of addresses in a wallet +func CreateRawTxFromWallet(c *webrpc.Client, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { + // check change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + // check if the change address is in wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + _, ok := wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + // get all address in the wallet + totalAddrs := wlt.GetAddresses() + addrStrArray := make([]string, len(totalAddrs)) + for i, a := range totalAddrs { + addrStrArray[i] = a.String() + } + + return CreateRawTx(c, wlt, addrStrArray, chgAddr, toAddrs, password) +} + +// CreateRawTxFromAddress creates a transaction from a specific address in a wallet +func CreateRawTxFromAddress(c *webrpc.Client, addr, walletFile, chgAddr string, toAddrs []SendAmount, pr PasswordReader) (*coin.Transaction, error) { + // check if the address is in the default wallet. + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + srcAddr, err := cipher.DecodeBase58Address(addr) + if err != nil { + return nil, ErrAddress + } + + _, ok := wlt.GetEntry(srcAddr) + if !ok { + return nil, fmt.Errorf("%v address is not in wallet", addr) + } + + // validate change address + cAddr, err := cipher.DecodeBase58Address(chgAddr) + if err != nil { + return nil, ErrAddress + } + + _, ok = wlt.GetEntry(cAddr) + if !ok { + return nil, fmt.Errorf("change address %v is not in wallet", chgAddr) + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + var password []byte + if wlt.IsEncrypted() { + var err error + password, err = pr.Password() + if err != nil { + return nil, err + } + } + + return CreateRawTx(c, wlt, []string{addr}, chgAddr, toAddrs, password) +} + +// CreateRawTx creates a transaction from a set of addresses contained in a loaded *wallet.Wallet +func CreateRawTx(c *webrpc.Client, wlt *wallet.Wallet, inAddrs []string, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + if err := validateSendAmounts(toAddrs); err != nil { + return nil, err + } + + // Get unspent outputs of those addresses + unspents, err := c.GetUnspentOutputs(inAddrs) + if err != nil { + return nil, err + } + + inUxs, err := unspents.Outputs.SpendableOutputs().ToUxArray() + if err != nil { + return nil, err + } + + txn, err := createRawTx(unspents.Outputs, wlt, chgAddr, toAddrs, password) + if err != nil { + return nil, err + } + + // filter out unspents which are not used in transaction + var inUxsFiltered coin.UxArray + for _, h := range txn.In { + for _, u := range inUxs { + if h == u.Hash() { + inUxsFiltered = append(inUxsFiltered, u) + } + } + } + + // TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints minus + // the parts that require block head data, which is not available from the RPC API (see below) + if err := verifyTransactionConstraints(txn, inUxsFiltered, visor.DefaultMaxBlockSize); err != nil { + return nil, err + } + + // TODO -- verify against soft and hard constraints + // Need to get the head block to do verification. + // The head block is not exposed over the JSON RPC, which webrpc.Client uses. + // Need to remove the JSON RPC API and have the client make requests to the HTTP API. + // Once the HTTP API is used, + // Need to request /blockchain/metadata to get the head block time + // This could lead to race conditions; /blockchain/metadata should return the full head, or have an API endpoint + // just for the head, and/or include the head block in the get_outputs response + // The head block is used for calculating inUxs's coin hours. + // if err := visor.VerifySingleTxnSoftConstraints(txn, inUxs, visor.DefaultMaxBlockSize); err != nil { + // return nil, err + // } + // if err := visor.VerifySingleTxnHardConstraints(txn, head, inUxs); err != nil { + // return nil, err + // } + + return txn, nil +} + +// TODO -- remove me -- reimplementation of visor.VerifySingleTxnSoftConstraints and HardConstraints +// minus the parts that require block head data, which is not available from the RPC API (see below) +func verifyTransactionConstraints(txn *coin.Transaction, uxIn coin.UxArray, maxSize int) error { // nolint: unparam + // SOFT constraints: + + if txn.Size() > maxSize { + return errors.New("Transaction size bigger than max block size") + } + + if visor.TransactionIsLocked(uxIn) { + return errors.New("Transaction has locked address inputs") + } + + // Ignore transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := visor.DropletPrecisionCheck(o.Coins); err != nil { + return err + } + } + + // HARD constraints: + + if err := txn.Verify(); err != nil { + return err + } + + // Checks whether ux inputs exist, + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInput(uxIn); err != nil { + return err + } + + // Verify CoinHours do not overflow + if _, err := txn.OutputHours(); err != nil { + return err + } + + // Check that no coins are created or destroyed + // TODO -- use the correct block head, once we have it from the API + // For now it doesn't matter, the block head is used to calculate the uxOut hours, + // but we're not validating the hours + uxOut := coin.CreateUnspents(coin.BlockHeader{ + BkSeq: 1, + }, *txn) + return coin.VerifyTransactionCoinsSpending(uxIn, uxOut) + + // TODO -- use coin.VerifyTransactionHoursSpending, once we have the head block + // return coin.VerifyTransactionHoursSpending(head.Time(), uxIn, uxOut) +} + +func createRawTx(uxouts visor.ReadableOutputSet, wlt *wallet.Wallet, chgAddr string, toAddrs []SendAmount, password []byte) (*coin.Transaction, error) { + // Calculate total required coins + var totalCoins uint64 + for _, arg := range toAddrs { + var err error + totalCoins, err = coin.AddUint64(totalCoins, arg.Coins) + if err != nil { + return nil, err + } + } + + spendOutputs, err := chooseSpends(uxouts, totalCoins) + if err != nil { + return nil, err + } + + txOuts, err := makeChangeOut(spendOutputs, chgAddr, toAddrs) + if err != nil { + return nil, err + } + + f := func(w *wallet.Wallet) (*coin.Transaction, error) { + keys, err := getKeys(w, spendOutputs) + if err != nil { + return nil, err + } + + return NewTransaction(spendOutputs, keys, txOuts), nil + } + + makeTx := func() (*coin.Transaction, error) { + return f(wlt) + } + + if wlt.IsEncrypted() { + makeTx = func() (*coin.Transaction, error) { + var tx *coin.Transaction + if err := wlt.GuardView(password, func(w *wallet.Wallet) error { + var err error + tx, err = f(w) + return err + }); err != nil { + return nil, err + } + + return tx, nil + } + } + + return makeTx() +} + +func chooseSpends(uxouts visor.ReadableOutputSet, coins uint64) ([]wallet.UxBalance, error) { + // Convert spendable unspent outputs to []wallet.UxBalance + spendableOutputs, err := visor.ReadableOutputsToUxBalances(uxouts.SpendableOutputs()) + if err != nil { + return nil, err + } + + // Choose which unspent outputs to spend + // Use the MinimizeUxOuts strategy, since this is most likely used by + // application that may need to send frequently. + // Using fewer UxOuts will leave more available for other transactions, + // instead of waiting for confirmation. + outs, err := wallet.ChooseSpendsMinimizeUxOuts(spendableOutputs, coins, 0) + if err != nil { + // If there is not enough balance in the spendable outputs, + // see if there is enough balance when including incoming outputs + if err == wallet.ErrInsufficientBalance { + expectedOutputs, otherErr := visor.ReadableOutputsToUxBalances(uxouts.ExpectedOutputs()) + if otherErr != nil { + return nil, otherErr + } + + if _, otherErr := wallet.ChooseSpendsMinimizeUxOuts(expectedOutputs, coins, 0); otherErr != nil { + return nil, err + } + + return nil, ErrTemporaryInsufficientBalance + } + + return nil, err + } + + return outs, nil +} + +func makeChangeOut(outs []wallet.UxBalance, chgAddr string, toAddrs []SendAmount) ([]coin.TransactionOutput, error) { + var totalInCoins, totalInHours, totalOutCoins uint64 + + for _, o := range outs { + totalInCoins += o.Coins + totalInHours += o.Hours + } + + if totalInHours == 0 { + return nil, fee.ErrTxnNoFee + } + + for _, to := range toAddrs { + totalOutCoins += to.Coins + } + + if totalInCoins < totalOutCoins { + return nil, wallet.ErrInsufficientBalance + } + + outAddrs := []coin.TransactionOutput{} + changeAmount := totalInCoins - totalOutCoins + + haveChange := changeAmount > 0 + nAddrs := uint64(len(toAddrs)) + changeHours, addrHours, totalOutHours := wallet.DistributeSpendHours(totalInHours, nAddrs, haveChange) + + if err := fee.VerifyTransactionFeeForHours(totalOutHours, totalInHours-totalOutHours); err != nil { + return nil, err + } + + for i, to := range toAddrs { + // check if changeHours > 0, we do not need to cap addrHours when changeHours is zero + // changeHours is zero when there is no change left or all the coinhours were used in fees + // 1) if there is no change then the remaining coinhours are evenly distributed among the destination addresses + // 2) if all the coinhours are burned in fees then all addrHours are zero by default + if changeHours > 0 { + // the coinhours are capped to a maximum of incoming coins for the address + // if incoming coins < 1 then the cap is set to 1 coinhour + + spendCoinsAmt := to.Coins / 1e6 + if spendCoinsAmt == 0 { + spendCoinsAmt = 1 + } + + // allow addrHours to be less than the incoming coins of the address but not more + if addrHours[i] > spendCoinsAmt { + // cap the addrHours, move the difference to changeHours + changeHours += addrHours[i] - spendCoinsAmt + addrHours[i] = spendCoinsAmt + } + } + + outAddrs = append(outAddrs, mustMakeUtxoOutput(to.Addr, to.Coins, addrHours[i])) + } + + if haveChange { + outAddrs = append(outAddrs, mustMakeUtxoOutput(chgAddr, changeAmount, changeHours)) + } + + return outAddrs, nil +} + +func mustMakeUtxoOutput(addr string, coins, hours uint64) coin.TransactionOutput { + uo := coin.TransactionOutput{} + uo.Address = cipher.MustDecodeBase58Address(addr) + uo.Coins = coins + uo.Hours = hours + return uo +} + +func getKeys(wlt *wallet.Wallet, outs []wallet.UxBalance) ([]cipher.SecKey, error) { + keys := make([]cipher.SecKey, len(outs)) + for i, o := range outs { + entry, ok := wlt.GetEntry(o.Address) + if !ok { + return nil, fmt.Errorf("%v is not in wallet", o.Address.String()) + } + + keys[i] = entry.Secret + } + return keys, nil +} + +// NewTransaction creates a transaction. The transaction should be validated against hard and soft constraints before transmission. +func NewTransaction(utxos []wallet.UxBalance, keys []cipher.SecKey, outs []coin.TransactionOutput) *coin.Transaction { + tx := coin.Transaction{} + for _, u := range utxos { + tx.PushInput(u.Hash) + } + + for _, o := range outs { + tx.PushOutput(o.Address, o.Coins, o.Hours) + } + + tx.SignInputs(keys) + + tx.UpdateHeader() + return &tx +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx_test.go b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx_test.go new file mode 100755 index 0000000..692b456 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/create_rawtx_test.go @@ -0,0 +1,531 @@ +package cli + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +func TestMakeChangeOut(t *testing.T) { + // single destination test + uxOuts := []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 1, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(1), chgOut.Hours) + require.Exactly(t, uint64(0), spendOut.Hours) + + // multiple destination test + uxOuts = []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 10e6, + Hours: 8, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 5e6, + Hours: 16, + }, + } + + spendAmt = []SendAmount{ + { + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 1e6, + }, + { + Addr: "2CgSQ4FbtfbP6fJqmy75WwkW2tNsKPL2zzp", + Coins: 2e6, + }} + + _, err = cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and two output to the destination in toAddrs + require.Len(t, txOuts, 3) + + chgOut = txOuts[2] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(12e6), chgOut.Coins) + + for i := range spendAmt { + require.Equal(t, spendAmt[i].Addr, txOuts[i].Address.String()) + require.Exactly(t, spendAmt[i].Coins, txOuts[i].Coins) + } + + require.Exactly(t, uint64(9), chgOut.Hours) + require.Exactly(t, uint64(1), txOuts[0].Hours) + require.Exactly(t, uint64(2), txOuts[1].Hours) +} + +func TestMakeChangeOutMinOneCoinHourSend(t *testing.T) { + uxOuts := []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 200, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 100, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 0.001e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(699.999e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(149), chgOut.Hours) + require.Exactly(t, uint64(1), spendOut.Hours) +} + +func TestMakeChangeOutCoinHourCap(t *testing.T) { + uxOuts := []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + BkSeq: 10, + Coins: 400e6, + Hours: 2000, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + BkSeq: 11, + Coins: 300e6, + Hours: 1000, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + + require.Exactly(t, uint64(900), chgOut.Hours) + require.Exactly(t, uint64(600), spendOut.Hours) +} + +func TestMakeChangeOutOneCoinHour(t *testing.T) { + // As long as there is at least one coin hour left, creating a transaction + // will still succeed + uxOuts := []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 1, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + txOuts, err := makeChangeOut(uxOuts, chgAddr, spendAmt) + require.NoError(t, err) + require.NotEmpty(t, txOuts) + + // Should have a change output and an output to the destination in toAddrs + require.Len(t, txOuts, 2) + + chgOut := txOuts[1] + t.Logf("chgOut:%+v\n", chgOut) + require.Equal(t, chgAddr, chgOut.Address.String()) + require.Exactly(t, uint64(100e6), chgOut.Coins) + require.Exactly(t, uint64(0), chgOut.Hours) + + spendOut := txOuts[0] + require.Equal(t, spendAmt[0].Addr, spendOut.Address.String()) + require.Exactly(t, spendAmt[0].Coins, spendOut.Coins) + require.Exactly(t, uint64(0), spendOut.Hours) +} + +func TestMakeChangeOutInsufficientCoinHours(t *testing.T) { + // If there are no coin hours in the inputs, creating the txn will fail + // because it will not be accepted by the network + uxOuts := []wallet.UxBalance{ + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 10, + Address: cipher.MustDecodeBase58Address("k3rmz3PGbTxd7KL8AL5CeHrWy35C1UcWND"), + Coins: 400e6, + Hours: 0, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 11, + Address: cipher.MustDecodeBase58Address("A2h4iWC1SDGmS6UPezatFzEUwirLJtjFUe"), + Coins: 300e6, + Hours: 0, + }, + } + + spendAmt := []SendAmount{{ + Addr: "2PBmUva7J8WFsyWg979cREZkU3z2pkYjNkE", + Coins: 600e6, + }} + + chgAddr := "2konv5no3DZvSMxf2GPVtAfZinfwqCGhfVQ" + _, err := cipher.DecodeBase58Address(chgAddr) + require.NoError(t, err) + + _, err = makeChangeOut(uxOuts, chgAddr, spendAmt) + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) +} + +func TestChooseSpends(t *testing.T) { + // Start with visor.ReadableOutputSet + // Spends should be minimized + + // Insufficient HeadOutputs + // Sufficient HeadOutputs, but insufficient after adjusting for OutgoingOutputs + // Insufficient HeadOutputs, but sufficient after adjusting for IncomingOutputs + // Sufficient HeadOutputs after adjusting for OutgoingOutputs + + var coins uint64 = 100e6 + + hashA := testutil.RandSHA256(t).Hex() + hashB := testutil.RandSHA256(t).Hex() + hashC := testutil.RandSHA256(t).Hex() + hashD := testutil.RandSHA256(t).Hex() + + addrA := testutil.MakeAddress().String() + addrB := testutil.MakeAddress().String() + addrC := testutil.MakeAddress().String() + addrD := testutil.MakeAddress().String() + + cases := []struct { + name string + err error + spendLen int + ros visor.ReadableOutputSet + }{ + { + "Insufficient HeadOutputs", + wallet.ErrInsufficientBalance, + 0, + visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "13.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs, but insufficient after subtracting OutgoingOutputs", + wallet.ErrInsufficientBalance, + 0, + visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "75.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: visor.ReadableOutputs{ + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "50.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Insufficient HeadOutputs, but sufficient after adding IncomingOutputs", + ErrTemporaryInsufficientBalance, + 0, + visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "20.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + IncomingOutputs: visor.ReadableOutputs{ + { + Hash: hashC, + Address: addrC, + BkSeq: 134, + Coins: "40.000000", + CalculatedHours: 200, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashD, + Address: addrD, + BkSeq: 29, + Coins: "11.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs", + nil, + 2, + visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "20.000000", + CalculatedHours: 1, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + + { + "Sufficient HeadOutputs and still sufficient after subtracting OutgoingOutputs but will have no coinhours", + fee.ErrTxnNoFee, + 0, + visor.ReadableOutputSet{ + HeadOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashB, + Address: addrB, + BkSeq: 19, + Coins: "90.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + { + Hash: hashC, + Address: addrC, + BkSeq: 19, + Coins: "30.000000", + CalculatedHours: 0, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + OutgoingOutputs: visor.ReadableOutputs{ + { + Hash: hashA, + Address: addrA, + BkSeq: 22, + Coins: "15.000000", + CalculatedHours: 100, + SourceTransaction: testutil.RandSHA256(t).Hex(), + }, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + spends, err := chooseSpends(tc.ros, coins) + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tc.spendLen, len(spends)) + + var totalCoins uint64 + for _, ux := range spends { + totalCoins += ux.Coins + } + + require.True(t, coins <= totalCoins) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/decryptWallet.go b/vendor/github.com/skycoin/skycoin/src/cli/decryptWallet.go new file mode 100755 index 0000000..3282692 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/decryptWallet.go @@ -0,0 +1,96 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func decryptWalletCmd(cfg Config) gcli.Command { + name := "decryptWallet" + return gcli.Command{ + Name: name, + Usage: "Decrypt wallet", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + + wlt, err := decryptWallet(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + printJSON(wallet.NewReadableWallet(wlt)) + return nil + }, + } +} + +func decryptWallet(walletFile string, pr PasswordReader) (*wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if !wlt.IsEncrypted() { + return nil, wallet.ErrWalletNotEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + unlockedWlt, err := wlt.Unlock(password) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := unlockedWlt.Save(dir); err != nil { + return nil, WalletLoadError{err} + } + + return unlockedWlt, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go b/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go new file mode 100755 index 0000000..321fa1f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/encrypt_wallet.go @@ -0,0 +1,107 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func encryptWalletCmd(cfg Config) gcli.Command { + name := "encryptWallet" + return gcli.Command{ + Name: name, + Usage: "Encrypt wallet", + ArgsUsage: " ", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + gcli.StringFlag{ + Name: "x,crypto-type", + Value: string(wallet.CryptoTypeScryptChacha20poly1305), + Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) + if err != nil { + errorWithHelp(c, err) + return nil + } + + pr := NewPasswordReader([]byte(c.String("p"))) + + wlt, err := encryptWallet(w, pr, cryptoType) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + printJSON(wallet.NewReadableWallet(wlt)) + return nil + }, + } +} + +func encryptWallet(walletFile string, pr PasswordReader, cryptoType wallet.CryptoType) (*wallet.Wallet, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + + if pr == nil { + return nil, wallet.ErrMissingPassword + } + + password, err := pr.Password() + if err != nil { + return nil, err + } + + if err := wlt.Lock(password, cryptoType); err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + // save the wallet + if err := wlt.Save(dir); err != nil { + return nil, WalletLoadError{err} + } + + return wlt, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go b/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go new file mode 100755 index 0000000..3ab8794 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/generate_addrs.go @@ -0,0 +1,192 @@ +package cli + +import ( + "errors" + "fmt" + "path/filepath" + "strings" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +func generateAddrsCmd(cfg Config) gcli.Command { + name := "generateAddresses" + return gcli.Command{ + Name: name, + Usage: "Generate additional addresses for a wallet", + ArgsUsage: " ", + Description: fmt.Sprintf(`The default wallet (%s) will + be used if no wallet was specified. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered from the + history log. If you do not include the "-p" option you will be prompted to + enter your password after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.UintFlag{ + Name: "n", + Value: 1, + Usage: `[numberOfAddresses] Number of addresses to generate`, + }, + gcli.StringFlag{ + Name: "f", + Value: cfg.FullWalletPath(), + Usage: `[wallet file or path] Generate addresses in the wallet`, + }, + gcli.StringFlag{ + Name: "p", + Usage: `[password] wallet password`, + }, + gcli.BoolFlag{ + Name: "json,j", + Usage: "Returns the results in JSON format", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: generateAddrs, + } +} + +func generateAddrs(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // get number of address that are need to be generated. + num := c.Uint64("n") + if num == 0 { + return errors.New("-n must > 0") + } + + jsonFmt := c.Bool("json") + + w, err := resolveWalletPath(cfg, c.String("f")) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + addrs, err := GenerateAddressesInFile(w, num, pr) + + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + case WalletSaveError: + return errors.New("save wallet failed") + default: + return err + } + + if jsonFmt { + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + fmt.Println(s) + } else { + fmt.Println(FormatAddressesAsJoinedArray(addrs)) + } + + return nil +} + +// GenerateAddressesInFile generates addresses in given wallet file +func GenerateAddressesInFile(walletFile string, num uint64, pr PasswordReader) ([]cipher.Address, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return nil, wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return nil, err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + } + + genAddrsInWallet := func(w *wallet.Wallet, n uint64) ([]cipher.Address, error) { + return w.GenerateAddresses(n) + } + + if wlt.IsEncrypted() { + genAddrsInWallet = func(w *wallet.Wallet, n uint64) ([]cipher.Address, error) { + password, err := pr.Password() + if err != nil { + return nil, err + } + + var addrs []cipher.Address + if err := w.GuardUpdate(password, func(wlt *wallet.Wallet) error { + var err error + addrs, err = wlt.GenerateAddresses(n) + return err + }); err != nil { + return nil, err + } + + return addrs, nil + } + } + + addrs, err := genAddrsInWallet(wlt, num) + if err != nil { + return nil, err + } + + dir, err := filepath.Abs(filepath.Dir(walletFile)) + if err != nil { + return nil, err + } + + if err := wlt.Save(dir); err != nil { + return nil, WalletSaveError{err} + } + + return addrs, nil +} + +// FormatAddressesAsJSON converts []cipher.Address to strings and formats the array into a standard JSON object wrapper +func FormatAddressesAsJSON(addrs []cipher.Address) (string, error) { + d, err := formatJSON(struct { + Addresses []string `json:"addresses"` + }{ + Addresses: AddressesToStrings(addrs), + }) + + if err != nil { + return "", err + } + + return string(d), nil +} + +// FormatAddressesAsJoinedArray converts []cipher.Address to strings and concatenates them with a comma +func FormatAddressesAsJoinedArray(addrs []cipher.Address) string { + return strings.Join(AddressesToStrings(addrs), ",") +} + +// AddressesToStrings converts []cipher.Address to []string +func AddressesToStrings(addrs []cipher.Address) []string { + if addrs == nil { + return nil + } + + addrsStr := make([]string, len(addrs)) + for i, a := range addrs { + addrsStr[i] = a.String() + } + + return addrsStr +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go b/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go new file mode 100755 index 0000000..d0a6ca4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/generate_wallet.go @@ -0,0 +1,252 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/go-bip39" + secp256k1 "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +const ( + // AlphaNumericSeedLength is the size of generated alphanumeric seeds, in bytes + AlphaNumericSeedLength = 64 +) + +func generateWalletCmd(cfg Config) gcli.Command { + name := "generateWallet" + return gcli.Command{ + Name: "generateWallet", + Usage: "Generate a new wallet", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Description: fmt.Sprintf(`The default wallet (%s) will + be created if no wallet and address was specified. + + Use caution when using the "-p" command. If you have command + history enabled your wallet encryption password can be recovered + from the history log. If you do not include the "-p" option you will + be prompted to enter your password after you enter your command. + + All results are returned in JSON format.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.BoolFlag{ + Name: "r", + Usage: "A random alpha numeric seed will be generated for you", + }, + gcli.BoolFlag{ + Name: "rd", + Usage: "A random seed consisting of 12 dictionary words will be generated for you", + }, + gcli.StringFlag{ + Name: "s", + Usage: "Your seed", + }, + gcli.UintFlag{ + Name: "n", + Value: 1, + Usage: `[numberOfAddresses] Number of addresses to generate + By default 1 address is generated.`, + }, + gcli.StringFlag{ + Name: "f", + Value: cfg.WalletName, + Usage: `[walletName] Name of wallet. The final format will be "yourName.wlt". + If no wallet name is specified a generic name will be selected.`, + }, + gcli.StringFlag{ + Name: "l", + Usage: "[label] Label used to idetify your wallet.", + }, + gcli.BoolFlag{ + Name: "e,encrypt", + Usage: `Whether creates wallet with encryption `, + }, + gcli.StringFlag{ + Name: "x,crypto-type", + Value: string(wallet.CryptoTypeScryptChacha20poly1305), + Usage: "[crypto type] The crypto type for wallet encryption, can be scrypt-chacha20poly1305 or sha256-xor", + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + }, + Action: generateWalletHandler, + } +} + +func generateWalletHandler(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // create wallet dir if not exist + if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { + if err := os.MkdirAll(cfg.WalletDir, 0755); err != nil { + return errors.New("create dir failed") + } + } + + // get wallet name + wltName := c.String("f") + + // check if the wallet name has wlt extension. + if !strings.HasSuffix(wltName, ".wlt") { + return ErrWalletName + } + + // wallet file should not be a path. + if filepath.Base(wltName) != wltName { + return fmt.Errorf("wallet file name must not contain path") + } + + // check if the wallet file does exist + if _, err := os.Stat(filepath.Join(cfg.WalletDir, wltName)); err == nil { + return fmt.Errorf("%v already exist", wltName) + } + + // check if the wallet dir does exist. + if _, err := os.Stat(cfg.WalletDir); os.IsNotExist(err) { + return err + } + + // get number of address that are need to be generated, if m is 0, set to 1. + num := c.Uint64("n") + if num == 0 { + return errors.New("-n must > 0") + } + + // get label + label := c.String("l") + + // get seed + s := c.String("s") + r := c.Bool("r") + rd := c.Bool("rd") + + encrypt := c.Bool("e") + + sd, err := makeSeed(s, r, rd) + if err != nil { + return err + } + + cryptoType, err := wallet.CryptoTypeFromString(c.String("x")) + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + switch pr.(type) { + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return err + } + + if !encrypt && len(p) != 0 { + return errors.New("password should not be set as we're not going to create a wallet with encryption") + } + } + + var password []byte + if encrypt { + var err error + password, err = pr.Password() + if err != nil { + return err + } + } + + opts := wallet.Options{ + Label: label, + Seed: sd, + Encrypt: encrypt, + CryptoType: cryptoType, + Password: []byte(password), + } + + wlt, err := GenerateWallet(wltName, opts, num) + if err != nil { + return err + } + + if err := wlt.Save(cfg.WalletDir); err != nil { + return err + } + + return printJSON(wallet.NewReadableWallet(wlt)) +} + +func makeSeed(s string, r, rd bool) (string, error) { + if s != "" { + // 111, 101, 110 + if r || rd { + return "", errors.New("seed already specified, must not use -r or -rd again") + } + // 100 + return s, nil + } + + // 011 + if r && rd { + return "", errors.New("for -r and -rd, only one option can be used") + } + + // 010 + if r { + return MakeAlphanumericSeed(), nil + } + + // 001, 000 + return bip39.NewDefaultMnemonic() +} + +// PUBLIC + +// GenerateWallet generates a new wallet with filename walletFile, label, seed and number of addresses. +// Caller should save the wallet file to its chosen directory +func GenerateWallet(walletFile string, opts wallet.Options, numAddrs uint64) (*wallet.Wallet, error) { + walletFile = filepath.Base(walletFile) + + wlt, err := wallet.NewWallet(walletFile, wallet.Options{ + Seed: opts.Seed, + Label: opts.Label, + }) + if err != nil { + return nil, err + } + + if numAddrs > 1 { + if _, err := wlt.GenerateAddresses(numAddrs - 1); err != nil { + return nil, err + } + } + + if !opts.Encrypt { + if len(opts.Password) != 0 { + return nil, wallet.ErrWalletNotEncrypted + } + + return wlt, nil + } + + if err := wlt.Lock(opts.Password, opts.CryptoType); err != nil { + return nil, err + } + + return wlt, nil +} + +// MakeAlphanumericSeed creates a random seed with AlphaNumericSeedLength bytes and hex encodes it +func MakeAlphanumericSeed() string { + seedRaw := cipher.SumSHA256(secp256k1.RandByte(AlphaNumericSeedLength)) + return hex.EncodeToString(seedRaw[:]) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/empty.go b/vendor/github.com/skycoin/skycoin/src/cli/integration/empty.go new file mode 100755 index 0000000..76ab1b7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/empty.go @@ -0,0 +1 @@ +package integration diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/integration_test.go b/vendor/github.com/skycoin/skycoin/src/cli/integration/integration_test.go new file mode 100755 index 0000000..05a92a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/integration_test.go @@ -0,0 +1,2692 @@ +// package integration_test implements CLI integration tests +package integration_test + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "math/rand" + "os" + "os/exec" + "path/filepath" + "reflect" + "strconv" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cli" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + binaryName = "skycoin-cli" + + testModeStable = "stable" + testModeLive = "live" + + // Number of random transactions of live transaction test. + randomLiveTransactionNum = 500 + + testFixturesDir = "testdata" + + stableWalletName = "integration-test.wlt" + stableEncryptWalletName = "integration-test-encrypted.wlt" +) + +var ( + binaryPath string + + update = flag.Bool("update", false, "update golden files") + liveTxFull = flag.Bool("live-tx-full", false, "run live transaction test against full blockchain") + testLiveWallet = flag.Bool("test-live-wallet", false, "run live wallet tests, requires wallet envvars set") + + cryptoTypes = []wallet.CryptoType{wallet.CryptoTypeScryptChacha20poly1305, wallet.CryptoTypeSha256Xor} +) + +type TestData struct { + actual interface{} + expected interface{} +} + +func init() { + rand.Seed(time.Now().Unix()) +} + +// Do setup and teardown here. +func TestMain(m *testing.M) { + abs, err := filepath.Abs(binaryName) + if err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("get binary name absolute path failed: %v\n", err)) + os.Exit(1) + } + + binaryPath = abs + + // Build cli binary file. + args := []string{"build", "-o", binaryPath, "../../../cmd/cli/cli.go"} + if err := exec.Command("go", args...).Run(); err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("Make %v binary failed: %v\n", binaryName, err)) + os.Exit(1) + } + + ret := m.Run() + + // Remove the generated cli binary file. + if err := os.Remove(binaryPath); err != nil { + fmt.Fprintf(os.Stderr, fmt.Sprintf("Delete %v failed: %v", binaryName, err)) + os.Exit(1) + } + + os.Exit(ret) +} + +func createUnencryptedWallet(t *testing.T) (string, func()) { + return createTempWallet(t, false) +} + +func createEncryptedWallet(t *testing.T) (string, func()) { // nolint: unparam + return createTempWallet(t, true) +} + +// createTempWallet creates a temporary dir, and if encrypt is true, copy +// the testdata/$stableEncryptedWalletName file to the dir. If it's false, then +// copy the testdata/$stableWalletName file to the dir +// returns the temporary wallet path, cleanup callback function, and error if any. +func createTempWallet(t *testing.T, encrypt bool) (string, func()) { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + + // Copy the testdata/$stableWalletName to the temporary dir. + var wltName string + if encrypt { + wltName = stableEncryptWalletName + } else { + wltName = stableWalletName + } + + walletPath := filepath.Join(dir, wltName) + f, err := os.Create(walletPath) + require.NoError(t, err) + + defer f.Close() + + rf, err := os.Open(filepath.Join(testFixturesDir, wltName)) + require.NoError(t, err) + + defer rf.Close() + io.Copy(f, rf) + + originalWalletDirEnv := os.Getenv("WALLET_DIR") + originalWalletNameEnv := os.Getenv("WALLET_NAME") + + os.Setenv("WALLET_DIR", dir) + os.Setenv("WALLET_NAME", wltName) + + fun := func() { + os.Setenv("WALLET_DIR", originalWalletDirEnv) + os.Setenv("WALLET_NAME", originalWalletNameEnv) + + // Delete the temporary dir + os.RemoveAll(dir) + } + + return walletPath, fun +} + +// createTempWalletDir creates a temporary wallet dir, +// sets the WALLET_DIR environment variable. +// Returns wallet dir path and callback function to clean up the dir. +func createTempWalletDir(t *testing.T) func() { + dir, err := ioutil.TempDir("", "wallet-data-dir") + require.NoError(t, err) + os.Setenv("WALLET_DIR", dir) + + return func() { + os.Setenv("WALLET_DIR", "") + os.RemoveAll(dir) + } +} + +func loadJSON(t *testing.T, filename string, obj interface{}) { + f, err := os.Open(filename) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(obj) + require.NoError(t, err) +} + +func loadGoldenFile(t *testing.T, filename string, testData TestData) { + require.NotEmpty(t, filename, "loadGoldenFile golden filename missing") + + goldenFile := filepath.Join(testFixturesDir, filename) + + if *update { + updateGoldenFile(t, goldenFile, testData.actual) + } + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + err = json.NewDecoder(f).Decode(testData.expected) + require.NoError(t, err, filename) +} + +func updateGoldenFile(t *testing.T, filename string, content interface{}) { + contentJSON, err := json.MarshalIndent(content, "", "\t") + require.NoError(t, err) + contentJSON = append(contentJSON, '\n') + err = ioutil.WriteFile(filename, contentJSON, 0644) + require.NoError(t, err) +} + +func checkGoldenFile(t *testing.T, goldenFile string, td TestData) { + loadGoldenFile(t, goldenFile, td) + require.Equal(t, reflect.Indirect(reflect.ValueOf(td.expected)).Interface(), td.actual) + checkGoldenFileObjectChanges(t, goldenFile, td) +} + +func checkGoldenFileObjectChanges(t *testing.T, goldenFile string, td TestData) { + // Serialize expected to JSON and compare to the goldenFile's contents + // This will detect field changes that could be missed otherwise + b, err := json.MarshalIndent(td.expected, "", "\t") + require.NoError(t, err) + + goldenFile = filepath.Join(testFixturesDir, goldenFile) + + f, err := os.Open(goldenFile) + require.NoError(t, err) + defer f.Close() + + c, err := ioutil.ReadAll(f) + require.NoError(t, err) + + require.Equal(t, string(c), string(b)+"\n", "json struct output differs from golden file, was a field added to the struct?") +} + +func mode(t *testing.T) string { + mode := os.Getenv("SKYCOIN_INTEGRATION_TEST_MODE") + switch mode { + case "": + mode = testModeStable + case testModeLive, testModeStable: + default: + t.Fatal("Invalid test mode, must be stable or live") + } + return mode +} + +func enabled() bool { + return os.Getenv("SKYCOIN_INTEGRATION_TESTS") == "1" +} + +func doStable(t *testing.T) bool { + if enabled() && mode(t) == testModeStable { + return true + } + + t.Skip("Stable tests disabled") + return false +} + +func doLive(t *testing.T) bool { + if enabled() && mode(t) == testModeLive { + return true + } + + t.Skip("Live tests disabled") + return false +} + +func doLiveWallet(t *testing.T) bool { + if *testLiveWallet { + return true + } + + t.Skip("Tests requiring wallet envvars are disabled") + return false +} + +// requireWalletDir checks if the WALLET_DIR environment value is set +func requireWalletDir(t *testing.T) { + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } +} + +// requireWalletEnv checks if the WALLET_DIR and WALLET_NAME environment value are set +func requireWalletEnv(t *testing.T) { + if !doLiveWallet(t) { + return + } + + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } +} + +// getWalletPathFromEnv gets wallet file path from environment variables +func getWalletPathFromEnv(t *testing.T) (string, string) { + walletDir := os.Getenv("WALLET_DIR") + if walletDir == "" { + t.Fatal("missing WALLET_DIR environment value") + } + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + t.Fatal("missing WALLET_NAME environment value") + } + + return walletDir, walletName +} + +func doLiveOrStable(t *testing.T) bool { + if enabled() { + switch mode(t) { + case testModeStable, testModeLive: + return true + } + } + + t.Skip("Live and stable tests disabled") + return false +} + +func rpcAddress() string { + rpcAddr := os.Getenv("RPC_ADDR") + if rpcAddr == "" { + rpcAddr = "http://127.0.0.1:6420" + } + + return rpcAddr +} + +func useCSRF(t *testing.T) bool { + x := os.Getenv("USE_CSRF") + if x == "" { + return false + } + + useCSRF, err := strconv.ParseBool(x) + require.NoError(t, err) + return useCSRF +} + +func TestGenerateAddresses(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + encrypted bool + args []string + isUsageErr bool + expectOutput []byte + goldenFile string + }{ + { + name: "generateAddresses", + encrypted: false, + args: []string{"generateAddresses"}, + expectOutput: []byte("7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\n"), + goldenFile: "generate-addresses.golden", + }, + { + name: "generateAddresses -n 2 -j", + encrypted: false, + args: []string{"generateAddresses", "-n", "2", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\",\n \"2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV\"\n ]\n}\n"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "generateAddresses -n -2 -j", + encrypted: false, + args: []string{"generateAddresses", "-n", "-2", "-j"}, + isUsageErr: true, + expectOutput: []byte("Error: invalid value \"-2\" for flag -n: strconv.ParseUint: parsing \"-2\": invalid syntax"), + goldenFile: "generate-addresses-2.golden", + }, + { + name: "generateAddresses in encrypted wallet", + encrypted: true, + args: []string{"generateAddresses", "-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"addresses\": [\n \"7g3M372kxwNwwQEAmrronu4anXTW8aD1XC\"\n ]\n}\n"), + goldenFile: "generate-addresses-encrypted.golden", + }, + { + name: "generateAddresses in encrypted wallet with invalid password", + encrypted: true, + args: []string{"generateAddresses", "-p", "invalid password", "-j"}, + expectOutput: []byte("invalid password\n"), + }, + { + name: "generateAddresses in unencrypted wallet with password", + encrypted: false, + args: []string{"generateAddresses", "-p", "pwd"}, + expectOutput: []byte("wallet is not encrypted\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + walletPath, clean := createTempWallet(t, tc.encrypted) + defer clean() + + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.isUsageErr { + require.True(t, bytes.Contains(output, tc.expectOutput)) + return + } + + require.Equal(t, tc.expectOutput, output) + + require.NoError(t, err) + + var w wallet.ReadableWallet + loadJSON(t, walletPath, &w) + + // Use loadJSON instead of loadGoldenFile because this golden file + // should not use the *update flag + goldenFile := filepath.Join(testFixturesDir, tc.goldenFile) + var expect wallet.ReadableWallet + loadJSON(t, goldenFile, &expect) + if tc.encrypted { + // wips secrets as it's not stable + expect.Meta["secrets"] = "" + w.Meta["secrets"] = "" + } + require.Equal(t, expect, w) + }) + } +} + +func TestVerifyAddress(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + addr string + err error + errMsg string + }{ + { + "valid skycoin address", + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + nil, + "", + }, + { + "invalid skycoin address", + "2KG9eRXUhx6hrDZvNGB99DKahtrPDQ1W9vn", + errors.New("exit status 1"), + "Invalid checksum", + }, + { + "invalid bitcoin address", + "1Dcb9gpaZpBKmjqjCsiBsP3sBW1md2kEM2", + errors.New("exit status 1"), + "Invalid checksum", + }, + } + + for _, tc := range tt { + output, err := exec.Command(binaryPath, "verifyAddress", tc.addr).CombinedOutput() + if err != nil { + require.Equal(t, tc.err.Error(), err.Error()) + require.Equal(t, tc.errMsg, strings.Trim(string(output), "\n")) + return + } + + require.Empty(t, output) + } +} + +func TestDecodeRawTransaction(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + rawTx string + goldenFile string + errMsg []byte + }{ + { + name: "success", + rawTx: "2601000000a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd401000000a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01010000004d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc0400000000bae12bbf671abeb1181fc85f1c01cdfee55deb97980c9c0a00000000543600000000000000373bb3675cbf3880bba3f3de7eb078925b8a72ad0095ba0a000000001c12000000000000008829025fe45b48f29795893a642bdaa89b2bb40e40d2df03000000001c12000000000000008001532c3a705e7e62bb0bb80630ecc21a87ec09c0fc9b01000000001b12000000000000", + goldenFile: "decode-raw-transaction.golden", + }, + { + name: "invalid raw transaction", + rawTx: "2601000000a1d", + errMsg: []byte("invalid raw transaction: encoding/hex: odd length hex string\nencoding/hex: odd length hex string\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "decodeRawTransaction", tc.rawTx).CombinedOutput() + if err != nil { + require.Error(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + if bytes.Contains(output, []byte("Error: ")) { + require.Equal(t, tc.errMsg, string(output)) + return + } + + var txn visor.TransactionJSON + err = json.NewDecoder(bytes.NewReader(output)).Decode(&txn) + require.NoError(t, err) + + var expect visor.TransactionJSON + checkGoldenFile(t, tc.goldenFile, TestData{txn, &expect}) + }) + } + +} + +func TestAddressGen(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + outputCheck func(t *testing.T, output []byte) + }{ + { + "addressGen", + []string{"addressGen"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + }, + }, + { + "addressGen --count 2", + []string{"addressGen", "--count", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + require.Len(t, w.Entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + addr := cipher.AddressFromSecKey(key) + require.Equal(t, addr.String(), w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, key.Hex(), w.Entries[i].Secret) + } + }, + }, + { + "addressGen -c 2", + []string{"addressGen", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms that the seed is consisted of 12 words + seed := w.Meta["seed"] + require.NotEmpty(t, seed) + ss := strings.Split(seed, " ") + require.Len(t, ss, 12) + + // Confirms that the wallet have 2 address + require.Len(t, w.Entries, 2) + + // Confirms the addresses are generated from the seed + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + addr := cipher.AddressFromSecKey(key) + require.Equal(t, addr.String(), w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, key.Hex(), w.Entries[i].Secret) + } + }, + }, + { + "addressGen --hide-secret -c 2", + []string{"addressGen", "--hide-secret", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.Entries, 2) + for _, e := range w.Entries { + require.Equal(t, e.Secret, "") + } + }, + }, + { + "addressGen -s -c 2", + []string{"addressGen", "-s", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "skycoin", w.Meta["coin"]) + + // Confirms the secrets in Entries are hidden + require.Len(t, w.Entries, 2) + for _, e := range w.Entries { + require.Equal(t, e.Secret, "") + } + }, + }, + { + "addressGen --bitcoin -c 2", + []string{"addressGen", "--bitcoin", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "bitcoin", w.Meta["coin"]) + + require.Len(t, w.Entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Meta["seed"] + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubkey(pk) + require.Equal(t, address, w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, sk, w.Entries[i].Secret) + } + }, + }, + { + "addressGen -b -c 2", + []string{"addressGen", "-b", "-c", "2"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the wallet type is skycoin + require.Equal(t, "bitcoin", w.Meta["coin"]) + + require.Len(t, w.Entries, 2) + + // Confirms the addresses are bitcoin addresses that generated from the seed + seed := w.Meta["seed"] + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 2) + for i, key := range keys { + pk := cipher.PubKeyFromSecKey(key) + sk := cipher.BitcoinWalletImportFormatFromSeckey(key) + address := cipher.BitcoinAddressFromPubkey(pk) + require.Equal(t, address, w.Entries[i].Address) + require.Equal(t, pk.Hex(), w.Entries[i].Public) + require.Equal(t, sk, w.Entries[i].Secret) + } + }, + }, + { + "addressGen --hex", + []string{"addressGen", "--hex"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + }, + }, + { + "addressGen -x", + []string{"addressGen", "-x"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + // Confirms the seed is a valid hex string + _, err = hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + }, + }, + { + "addressGen --only-addr", + []string{"addressGen", "--only-addr"}, + func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + "addressGen --oa", + []string{"addressGen", "--oa"}, + func(t *testing.T, v []byte) { + // Confirms that only addresses are returned + v = bytes.Trim(v, "\n") + _, err := cipher.DecodeBase58Address(string(v)) + require.NoError(t, err) + }, + }, + { + "addressGen --seed=123", + []string{"addressGen", "--seed", "123"}, + func(t *testing.T, v []byte) { + var w wallet.ReadableWallet + err := json.NewDecoder(bytes.NewReader(v)).Decode(&w) + require.NoError(t, err) + + pk, sk := cipher.GenerateDeterministicKeyPair([]byte("123")) + addr := cipher.AddressFromPubKey(pk) + require.Len(t, w.Entries, 1) + require.Equal(t, addr.String(), w.Entries[0].Address) + require.Equal(t, pk.Hex(), w.Entries[0].Public) + require.Equal(t, sk.Hex(), w.Entries[0].Secret) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + tc.outputCheck(t, output) + }) + } +} + +func TestStableListWallets(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() + require.NoError(t, err) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + + var expect struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + checkGoldenFile(t, "list-wallets.golden", TestData{wlts, &expect}) +} + +func TestLiveListWallets(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletDir(t) + + output, err := exec.Command(binaryPath, "listWallets").CombinedOutput() + require.NoError(t, err) + + var wlts struct { + Wallets []cli.WalletEntry `json:"wallets"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wlts) + require.NoError(t, err) + require.NotEmpty(t, wlts.Wallets) +} + +func TestStableListAddress(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + var expect struct { + Addresses []string `json:"addresses"` + } + checkGoldenFile(t, "list-addresses.golden", TestData{wltAddresses, &expect}) +} + +func TestLiveListAddresses(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "listAddresses").CombinedOutput() + require.NoError(t, err) + + var wltAddresses struct { + Addresses []string `json:"addresses"` + } + + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltAddresses) + require.NoError(t, err) + + require.NotEmpty(t, wltAddresses.Addresses) +} + +func TestStableAddressBalance(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "address-balance.golden", TestData{addrBalance, &expect}) +} + +func TestLiveAddressBalance(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "addressBalance", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) +} + +func TestStableWalletBalance(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + var expect cli.BalanceResult + checkGoldenFile(t, "wallet-balance.golden", TestData{wltBalance, &expect}) +} + +func TestLiveWalletBalance(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletBalance").CombinedOutput() + require.NoError(t, err) + + var wltBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltBalance) + require.NoError(t, err) + + require.NotEmpty(t, wltBalance.Confirmed.Coins) + require.NotEmpty(t, wltBalance.Addresses) +} + +func TestStableWalletOutputs(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + var expect webrpc.OutputsResult + checkGoldenFile(t, "wallet-outputs.golden", TestData{wltOutput, &expect}) +} + +func TestLiveWalletOutputs(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletOutputs").CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + require.NotEmpty(t, wltOutput.Outputs.HeadOutputs) +} + +func TestStableAddressOutputs(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + err error + errMsg string + }{ + { + name: "addressOutputs one address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt"}, + goldenFile: "address-outputs.golden", + }, + { + name: "addressOutputs two address", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm"}, + goldenFile: "two-addresses-outputs.golden", + }, + { + name: "addressOutputs two address one invalid", + args: []string{"addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", "badaddress"}, + err: errors.New("exit status 1"), + errMsg: "invalid address: badaddress, err: Invalid address length\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(output)) + return + } + + require.NoError(t, err) + + var addrOutputs webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) + + var expect webrpc.OutputsResult + checkGoldenFile(t, tc.goldenFile, TestData{addrOutputs, &expect}) + }) + } +} + +func TestLiveAddressOutputs(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "addressOutputs", "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt").CombinedOutput() + require.NoError(t, err) + + var addrOutputs webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrOutputs) + require.NoError(t, err) +} + +func TestStableShowConfig(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // WalletDir and DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.WalletDir) + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) + + ret.WalletDir = "IGNORED/.skycoin/wallets" + ret.DataDir = "IGNORED/.skycoin" + + goldenFile := "show-config.golden" + if useCSRF(t) { + goldenFile = "show-config-use-csrf.golden" + } + + var expect cli.Config + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) +} + +func TestLiveShowConfig(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "showConfig").CombinedOutput() + require.NoError(t, err) + + var ret cli.Config + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // WalletDir and DataDir can't be checked perfectly without essentially + // reimplementing cli.LoadConfig to compare values + require.NotEmpty(t, ret.WalletDir) + require.NotEmpty(t, ret.DataDir) + require.True(t, strings.HasSuffix(ret.WalletDir, ".skycoin/wallets")) + require.True(t, strings.HasSuffix(ret.DataDir, ".skycoin")) + require.True(t, strings.HasPrefix(ret.WalletDir, ret.DataDir)) + + walletName := os.Getenv("WALLET_NAME") + if walletName == "" { + walletName = "skycoin_cli.wlt" + } + require.Equal(t, walletName, ret.WalletName) + require.NotEmpty(t, ret.WalletName) + + coin := os.Getenv("COIN") + if coin == "" { + coin = "skycoin" + } + require.Equal(t, coin, ret.Coin) + + require.Equal(t, rpcAddress(), ret.RPCAddress) + + require.Equal(t, useCSRF(t), ret.UseCSRF) +} + +func TestStableStatus(t *testing.T) { + if !doStable(t) { + return + } + + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + + // TimeSinceLastBlock is not stable + ret.TimeSinceLastBlock = "" + + goldenFile := "status.golden" + if useCSRF(t) { + goldenFile = "status-use-csrf.golden" + } + + var expect cli.StatusResult + td := TestData{ret, &expect} + loadGoldenFile(t, goldenFile, td) + + // The RPC port is not always the same between runs of the stable integration tests, + // so use the RPC_ADDR envvar instead of the golden file value for comparison + goldenRPCAddress := expect.RPCAddress + expect.RPCAddress = rpcAddress() + + require.Equal(t, expect, ret) + + // Restore goldenfile's value before checking if JSON fields were added or removed + expect.RPCAddress = goldenRPCAddress + checkGoldenFileObjectChanges(t, goldenFile, TestData{ret, &expect}) + +} + +func TestLiveStatus(t *testing.T) { + if !doLive(t) { + return + } + + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + + var ret cli.StatusResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ret) + require.NoError(t, err) + require.True(t, ret.Running) + require.Equal(t, rpcAddress(), ret.RPCAddress) + require.Equal(t, useCSRF(t), ret.UseCSRF) +} + +func TestStableTransaction(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + err error + errMsg string + goldenFile string + }{ + { + name: "invalid txid", + args: []string{"abcd"}, + err: errors.New("exit status 1"), + errMsg: "invalid txid\n", + goldenFile: "", + }, + { + name: "not exist", + args: []string{"701d23fd513bad325938ba56869f9faba19384a8ec3dd41833aff147eac53947"}, + err: errors.New("exit status 1"), + errMsg: "transaction doesn't exist [code: -32600]\n", + goldenFile: "", + }, + { + name: "empty txid", + args: []string{""}, + err: errors.New("exit status 1"), + errMsg: "txid is empty\n", + goldenFile: "", + }, + { + name: "genesis transaction", + args: []string{"d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add"}, + err: nil, + errMsg: "", + goldenFile: "genesis-transaction-cli.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + args := append([]string{"transaction"}, tc.args...) + o, err := exec.Command(binaryPath, args...).CombinedOutput() + if tc.err != nil { + testutil.RequireError(t, err, tc.err.Error()) + require.Equal(t, tc.errMsg, string(o)) + return + } + + require.NoError(t, err) + + // Decode the output into visor.TransactionJSON + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect webrpc.TxnResult + checkGoldenFile(t, tc.goldenFile, TestData{tx, &expect}) + }) + } + + scanTransactions(t, true) +} + +func TestLiveTransaction(t *testing.T) { + if !doLive(t) { + return + } + + o, err := exec.Command(binaryPath, "transaction", "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add").CombinedOutput() + require.NoError(t, err) + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&tx) + require.NoError(t, err) + + var expect webrpc.TxnResult + + loadGoldenFile(t, "genesis-transaction.golden", TestData{tx, &expect}) + require.Equal(t, expect.Transaction.Transaction, tx.Transaction.Transaction) + + scanTransactions(t, *liveTxFull) + + // scan pending transactions + scanPendingTransactions(t) +} + +// cli doesn't have command to querying pending transactions yet. +func scanPendingTransactions(t *testing.T) { +} + +// scanTransactions scans transactions against blockchain. +// If fullTest is true, scan the whole blockchain, and test every transactions, +// otherwise just test random transactions. +func scanTransactions(t *testing.T, fullTest bool) { + // Gets blockchain height through "status" command + output, err := exec.Command(binaryPath, "status").CombinedOutput() + require.NoError(t, err) + var status struct { + webrpc.StatusResult + RPCAddress string `json:"webrpc_address"` + } + err = json.NewDecoder(bytes.NewReader(output)).Decode(&status) + require.NoError(t, err) + + txids := getTxids(t, status.BlockNum) + + l := len(txids) + if !fullTest && l > randomLiveTransactionNum { + txidMap := make(map[string]struct{}) + var ids []string + for len(txidMap) < randomLiveTransactionNum { + // get random txid + txid := txids[rand.Intn(l)] + if _, ok := txidMap[txid]; !ok { + ids = append(ids, txid) + txidMap[txid] = struct{}{} + } + } + + // reassign the txids + txids = ids + } + + checkTransactions(t, txids) +} + +func checkTransactions(t *testing.T, txids []string) { + // Start goroutines to check transactions + var wg sync.WaitGroup + txC := make(chan string, 500) + nReq := 4 + if useCSRF(t) { + nReq = 1 + } + for i := 0; i < nReq; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case txid, ok := <-txC: + if !ok { + return + } + + t.Run(fmt.Sprintf("%v", txid), func(t *testing.T) { + o, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() + require.NoError(t, err) + var txRlt webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(o)).Decode(&txRlt) + require.NoError(t, err) + require.Equal(t, txid, txRlt.Transaction.Transaction.Hash) + require.True(t, txRlt.Transaction.Status.Confirmed) + }) + } + } + }() + } + + for _, txid := range txids { + txC <- txid + } + close(txC) + + wg.Wait() +} + +func getTxids(t *testing.T, blockNum uint64) []string { + // p represents the number of blocks that each time we query, + // do not get all blocks in one query, which might run out of + // memory when blockchain becomes very huge. + p := 500 + n := int(blockNum / uint64(p)) + + // Collects all transactions' id + var txids []string + for i := 0; i < int(n); i++ { + txids = append(txids, getTxidsInBlocks(t, i*p+1, (i+1)*p)...) + } + + if (blockNum % uint64(p)) > 0 { + txids = append(txids, getTxidsInBlocks(t, n*p+1, int(blockNum)-1)...) + } + + return txids +} + +func getTxidsInBlocks(t *testing.T, start, end int) []string { + s := strconv.Itoa(start) + e := strconv.Itoa(end) + o, err := exec.Command(binaryPath, "blocks", s, e).CombinedOutput() + require.NoError(t, err) + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(o)).Decode(&blocks) + require.NoError(t, err) + require.Len(t, blocks.Blocks, end-start+1) + + var txids []string + for _, b := range blocks.Blocks { + for _, tx := range b.Body.Transactions { + txids = append(txids, tx.Hash) + } + } + return txids +} + +func TestStableBlocks(t *testing.T) { + if !doStable(t) { + return + } + + testKnownBlocks(t) + + // Tests blocks 180~181, should only return block 180. + output, err := exec.Command(binaryPath, "blocks", "180", "181").CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, "blocks180.golden", TestData{blocks, &expect}) +} + +func TestLiveBlocks(t *testing.T) { + if !doLive(t) { + return + } + + testKnownBlocks(t) + + // These blocks were affected by the coinhour overflow issue, make sure that they can be queried + blockSeqs := []int{11685, 11707, 11710, 11709, 11705, 11708, 11711, 11706, 11699} + + for _, seq := range blockSeqs { + output, err := exec.Command(binaryPath, "blocks", strconv.Itoa(seq)).CombinedOutput() + require.NoError(t, err) + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + } +} + +func testKnownBlocks(t *testing.T) { + tt := []struct { + name string + args []string + goldenFile string + }{ + { + "blocks 0", + []string{"blocks", "0"}, + "block0.golden", + }, + { + "blocks 0 5", + []string{"blocks", "0", "5"}, + "blocks0-5.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } + + scanBlocks(t, "0", "180") +} + +func scanBlocks(t *testing.T, start, end string) { // nolint: unparam + outputs, err := exec.Command(binaryPath, "blocks", start, end).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(outputs)).Decode(&blocks) + require.NoError(t, err) + + var preBlocks visor.ReadableBlock + preBlocks.Head.BlockHash = "0000000000000000000000000000000000000000000000000000000000000000" + for _, b := range blocks.Blocks { + require.Equal(t, b.Head.PreviousBlockHash, preBlocks.Head.BlockHash) + preBlocks = b + } +} + +func TestStableLastBlocks(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + goldenFile string + errMsg []byte + }{ + { + name: "lastBlocks 0", + args: []string{"lastBlocks", "0"}, + goldenFile: "last-blocks0.golden", + }, + { + name: "lastBlocks 1", + args: []string{"lastBlocks", "1"}, + goldenFile: "last-blocks1.golden", + }, + { + name: "lastBlocks 2", + args: []string{"lastBlocks", "2"}, + goldenFile: "last-blocks2.golden", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + + if bytes.Contains(output, []byte("Error: ")) { + fmt.Println(string(output)) + require.Equal(t, string(tc.errMsg), string(output)) + return + } + + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + + var expect visor.ReadableBlocks + checkGoldenFile(t, tc.goldenFile, TestData{blocks, &expect}) + }) + } +} + +func TestLiveLastBlocks(t *testing.T) { + if !doLive(t) { + return + } + + tt := []struct { + name string + args []string + }{ + { + "lastBlocks 0", + []string{"lastBlocks", "0"}, + }, + { + "lastBlocks 1", + []string{"lastBlocks", "1"}, + }, + { + "lastBlocks 2", + []string{"lastBlocks", "2"}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args...).CombinedOutput() + require.NoError(t, err) + + var blocks visor.ReadableBlocks + err = json.NewDecoder(bytes.NewReader(output)).Decode(&blocks) + require.NoError(t, err) + }) + } +} + +func TestStableWalletDir(t *testing.T) { + if !doStable(t) { + return + } + + walletPath, clean := createUnencryptedWallet(t) + defer clean() + + dir := filepath.Dir(walletPath) + output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() + require.NoError(t, err) + require.Equal(t, dir, strings.TrimRight(string(output), "\n")) +} + +func TestLiveWalletDir(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletDir(t) + + walletDir := os.Getenv("WALLET_DIR") + output, err := exec.Command(binaryPath, "walletDir").CombinedOutput() + require.NoError(t, err) + + require.Equal(t, walletDir, strings.Trim(string(output), "\n")) +} + +// TestLiveSend sends coin from specific wallet file, user should manually specify the +// wallet file by setting the enviroment variables: WALLET_DIR and WALLET_NAME. The WALLET_DIR +// points to the directory of the wallet, and WALLET_NAME represents the wallet file name. +// +// Note: +// 1. This test might modify the wallet file, in order to avoid losing coins, we don't send coins to +// addresses that are not belong to the wallet, when addresses in the wallet are not sufficient, we +// will automatically generate enough addresses as coin recipient. +// 2. The wallet must must have at least 2 coins and 16 coinhours. +func TestLiveSend(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 16 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 16) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"send", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"send", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 1) + // Confirms the third address receives 0.5 coin and 1 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[2].Address.String(), 5e5, 1) + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + { + // Send 0.001 coin from the third address to the second address. + // Set the second as change address, so the 0.499 change coin will also be sent to the second address. + // After sending, the second address should have 1 coin and 1 coin hour. + name: "send with -c(change address) -a(from address) options", + args: func() []string { + return []string{"send", "-c", w.Entries[1].Address.String(), + "-a", w.Entries[2].Address.String(), w.Entries[1].Address.String(), "0.001"} + }, + checkTx: func(t *testing.T, txid string) { + tx := getTransaction(t, txid) + // Confirms the second address receives 0.5 coin and 0 coinhour in this transaction + checkCoinsAndCoinhours(t, tx, w.Entries[1].Address.String(), 5e5, 0) + // Confirms the second address have 1 coin and 1 coin hour + coins, hours := getAddressBalance(t, w.Entries[1].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(1), hours) + }, + }, + { + // Send 1 coin from second to the the third address, this will spend three outputs(0.2, 0.3. 0.5 coin), + // and burn out the remaining 1 coin hour. + name: "send to burn all coin hour", + args: func() []string { + return []string{"send", "-a", w.Entries[1].Address.String(), + w.Entries[2].Address.String(), "1"} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms that the third address has 1 coin and 0 coin hour + coins, hours := getAddressBalance(t, w.Entries[2].Address.String()) + require.Equal(t, uint64(1e6), coins) + require.Equal(t, uint64(0), hours) + }, + }, + { + // Send with 0 coin hour, this test should fail. + name: "send 0 coin hour", + args: func() []string { + return []string{"send", "-a", w.Entries[2].Address.String(), + w.Entries[1].Address.String(), "1"} + }, + errMsg: []byte("Error: Transaction has zero coinhour fee. See 'skycoin-cli send --help'"), + checkTx: func(t *testing.T, txid string) {}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // output: "txid:$txid_string" + // split the output to get txid value + v := bytes.Split(output, []byte(":")) + require.Len(t, v, 2) + txid := string(v[1]) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } + + // Send with too small decimal value + // CLI send is a litte bit slow, almost 300ms each. so we only test 20 invalid decimal coin. + errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli send --help'") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "send", w.Entries[0].Address.String(), v).CombinedOutput() + require.NoError(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, output) + }) + } +} + +// TestLiveCreateAndBroadcastRawTransaction does almost the same procedure as TestLiveSend. +// Create raw transaction with command arguments the same as TestLiveSend, then broadcast the +// created raw transaction. After the transaction is confirmed, run the same transaction check +// function like in TestLiveSend. +func TestLiveCreateAndBroadcastRawTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast transaction + output, err = exec.Command(binaryPath, "broadcastTransaction", string(output)).CombinedOutput() + require.NoError(t, err) + + txid := string(bytes.TrimRight(output, "\n")) + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } + + // Send with too small decimal value + errMsg := []byte("Error: invalid amount, too many decimal places. See 'skycoin-cli createRawTransaction --help'") + for i := uint64(1); i < uint64(20); i++ { + v, err := droplet.ToString(i) + require.NoError(t, err) + name := fmt.Sprintf("send %v", v) + t.Run(name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "createRawTransaction", w.Entries[0].Address.String(), v).CombinedOutput() + require.NoError(t, err) + output = bytes.Trim(output, "\n") + require.Equal(t, errMsg, output) + }) + } +} + +func getTransaction(t *testing.T, txid string) *webrpc.TxnResult { + output, err := exec.Command(binaryPath, "transaction", txid).CombinedOutput() + if err != nil { + fmt.Println(string(output)) + return &webrpc.TxnResult{} + } + require.NoError(t, err) + + var tx webrpc.TxnResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&tx) + require.NoError(t, err) + + return &tx +} + +func isTxConfirmed(t *testing.T, txid string) bool { + tx := getTransaction(t, txid) + require.NotNil(t, tx) + return tx.Transaction.Status.Confirmed +} + +// checkCoinhours checks if the address coinhours in transaction are correct +func checkCoinsAndCoinhours(t *testing.T, tx *webrpc.TxnResult, addr string, coins, coinhours uint64) { // nolint: unparam + addrCoinhoursMap := make(map[string][]visor.ReadableTransactionOutput) + for _, o := range tx.Transaction.Transaction.Out { + addrCoinhoursMap[o.Address] = append(addrCoinhoursMap[o.Address], o) + } + + os, ok := addrCoinhoursMap[addr] + if !ok { + t.Fatalf("transaction doesn't have receiver of address: %v", addr) + } + + var totalCoins, totalHours uint64 + for _, o := range os { + c, err := droplet.FromString(o.Coins) + if err != nil { + t.Fatalf("%v", err) + } + totalCoins += c + totalHours += o.Hours + } + + require.Equal(t, coins, totalCoins) + require.Equal(t, coinhours, totalHours) +} + +// prepareAndCheckWallet prepares wallet for live testing. +// Returns *wallet.Wallet, total coin, total hours. +// Confirms that the wallet meets the minimal requirements of coins and coinhours. +func prepareAndCheckWallet(t *testing.T, miniCoins, miniCoinHours uint64) (*wallet.Wallet, uint64, uint64) { // nolint: unparam + walletDir, walletName := getWalletPathFromEnv(t) + walletPath := filepath.Join(walletDir, walletName) + // Checks if the wallet does exist + if _, err := os.Stat(walletPath); os.IsNotExist(err) { + t.Fatalf("Wallet file: %v does not exist", walletPath) + } + + // Loads the wallet + w, err := wallet.Load(walletPath) + if err != nil { + t.Fatalf("Load wallet failed: %v", err) + } + + if len(w.Entries) < 3 { + // Generates addresses + _, err = w.GenerateAddresses(uint64(3 - len(w.Entries))) + if err != nil { + t.Fatalf("Wallet generateAddress failed: %v", err) + } + } + + outputs := getWalletOutputs(t, walletPath) + // Confirms the wallet is not empty. + if len(outputs) == 0 { + t.Fatalf("Wallet %v has no coin", walletPath) + } + + var totalCoins uint64 + var totalCoinhours uint64 + for _, output := range outputs { + coins, err := droplet.FromString(output.Coins) + if err != nil { + t.Fatalf("%v", err) + } + + totalCoins += coins + totalCoinhours += output.CalculatedHours + } + + // Confirms the coins meet minimal coins requirement + if totalCoins < miniCoins { + t.Fatalf("Wallet must have at least %v coins", miniCoins) + } + + if totalCoinhours < miniCoinHours { + t.Fatalf("Wallet must have at least %v coinhours", miniCoinHours) + } + + if err := w.Save(walletDir); err != nil { + t.Fatalf("%v", err) + } + return w, totalCoins, totalCoinhours +} + +func getAddressBalance(t *testing.T, addr string) (uint64, uint64) { + output, err := exec.Command(binaryPath, "addressBalance", addr).CombinedOutput() + require.NoError(t, err) + + var addrBalance cli.BalanceResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&addrBalance) + require.NoError(t, err) + coins, err := droplet.FromString(addrBalance.Confirmed.Coins) + require.NoError(t, err) + + hours, err := strconv.ParseUint(addrBalance.Confirmed.Hours, 10, 64) + require.NoError(t, err) + return coins, hours +} + +func getWalletOutputs(t *testing.T, walletPath string) visor.ReadableOutputs { + output, err := exec.Command(binaryPath, "walletOutputs", walletPath).CombinedOutput() + require.NoError(t, err) + + var wltOutput webrpc.OutputsResult + err = json.NewDecoder(bytes.NewReader(output)).Decode(&wltOutput) + require.NoError(t, err) + + return wltOutput.Outputs.HeadOutputs +} + +func TestStableWalletHistory(t *testing.T) { + if !doStable(t) { + return + } + + _, clean := createUnencryptedWallet(t) + defer clean() + + output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() + require.NoError(t, err) + + var history []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&history) + require.NoError(t, err) + + var expect []cli.AddrHistory + checkGoldenFile(t, "wallet-history.golden", TestData{history, &expect}) +} + +func TestLiveWalletHistory(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + output, err := exec.Command(binaryPath, "walletHistory").CombinedOutput() + require.NoError(t, err) + var his []cli.AddrHistory + err = json.NewDecoder(bytes.NewReader(output)).Decode(&his) + require.NoError(t, err) +} + +func TestStableCheckDB(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + dbPath string + result string + errMsg string + }{ + { + name: "no signature", + dbPath: "../../visor/testdata/data.db.nosig", + errMsg: "checkdb failed: Signature not found for block seq=1000 hash=71852c1a8ab5e470bd14e5fce8e1116697151181a188d4262b545542fb3d526c\n", + }, + { + name: "invalid database", + dbPath: "../../visor/testdata/data.db.garbage", + errMsg: "open db failed: invalid database\n", + }, + { + name: "valid database", + dbPath: "../../api/integration/testdata/blockchain-180.db", + result: "check db success\n", + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + output, err := exec.Command(binaryPath, "checkdb", tc.dbPath).CombinedOutput() + if err != nil { + fmt.Println(string(output)) + require.Equal(t, tc.errMsg, string(output)) + return + } + require.NoError(t, err) + require.Equal(t, tc.result, string(output)) + }) + } +} + +func TestVersion(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + // Gets version in json format. + output, err := exec.Command(binaryPath, "version", "-j").CombinedOutput() + require.NoError(t, err) + + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{} + err = json.NewDecoder(bytes.NewReader(output)).Decode(&ver) + require.NoError(t, err) + require.True(t, ver.Skycoin != "") + require.True(t, ver.Cli != "") + require.True(t, ver.RPC != "") + require.True(t, ver.Wallet != "") + + // Gets version without json format. + output, err = exec.Command(binaryPath, "version").CombinedOutput() + require.NoError(t, err) + + // Confirms the result contains 4 version componments + output = bytes.TrimRight(output, "\n") + vers := bytes.Split(output, []byte("\n")) + require.Len(t, vers, 4) +} + +func TestStableGenerateWallet(t *testing.T) { + if !doStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "generate wallet with -r option", + args: []string{"-r"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + + // Confirms the seed is a valid hex string + _, err := hex.DecodeString(w.Meta["seed"]) + require.NoError(t, err) + + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with --rd option", + args: []string{"--rd"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + + // Confirms the seed is consisited of 12 words + seed := w.Meta["seed"] + words := strings.Split(seed, " ") + require.Len(t, words, 12) + + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with -s option", + args: []string{"-s", "great duck trophy inhale dad pluck include maze smart mechanic ring merge"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + + require.Equal(t, "great duck trophy inhale dad pluck include maze smart mechanic ring merge", w.Meta["seed"]) + require.Equal(t, "2amA8sxKJhNRp3wfWrE5JfTEUjr9S3C2BaU", w.Entries[0].Address.String()) + require.Equal(t, "02b4a4b63f2f8ba56f9508712815eca3c088693333715eaf7a73275d8928e1be5a", w.Entries[0].Public.Hex()) + require.Equal(t, "f4a281d094a6e9e95a84c23701a7d01a0e413c838758e94ad86a10b9b83e0434", w.Entries[0].Secret.Hex()) + }, + }, + { + name: "generate wallet with -n option", + args: []string{"-n", "5"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + // Confirms wallet has 5 address entries + require.Len(t, w.Entries, 5) + }, + }, + { + name: "generate wallet with -f option", + args: []string{"-f", "integration-cli.wlt"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "integration-cli.wlt", w.Filename()) + // Confirms the label is empty + require.Empty(t, w.Meta["label"]) + }, + }, + { + name: "generate wallet with -l option", + args: []string{"-l", "integration-cli"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + // Confirms the default wallet name is skycoin_cli.wlt + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + label, ok := w.Meta["label"] + require.True(t, ok) + require.Equal(t, "integration-cli", label) + }, + }, + { + name: "generate wallet with duplicate wallet name", + args: []string{}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + errMsg: []byte("integration-test.wlt already exist\n"), + }, + { + name: "encrypt=true", + args: []string{"-e", "-p", "pwd"}, + setup: createTempWalletDir, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.Equal(t, "skycoin_cli.wlt", w.Filename()) + // Confirms the wallet is encrypted + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Meta["seed"]) + require.Empty(t, w.Meta["lastSeed"]) + + // Confirms the secrets in address entries are empty + for _, e := range w.Entries { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "encrypt=false password=pwd", + args: []string{"-p", "pwd"}, + setup: createTempWalletDir, + errMsg: []byte("password should not be set as we're not going to create a wallet with encryption\n"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + + // Run command with arguments + args := append([]string{"generateWallet"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + require.NoError(t, err) + var rw wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rw) + require.NoError(t, err) + + // Converts to wallet.Wallet + w, err := rw.ToWallet() + require.NoError(t, err) + + // Validate the wallet + err = w.Validate() + require.NoError(t, err) + + if !w.IsEncrypted() { + // Confirms all entries and lastSeed are derived from seed. + checkWalletEntriesAndLastSeed(t, w) + } + + // Checks the wallet with provided checking method. + tc.checkWallet(t, w) + }) + } +} + +// checkWalletEntriesAndLastSeed confirms the wallet entries and lastSeed are derivied +// from the seed. +func checkWalletEntriesAndLastSeed(t *testing.T, w *wallet.Wallet) { + seed, ok := w.Meta["seed"] + require.True(t, ok) + newSeed, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), len(w.Entries)) + require.Len(t, seckeys, len(w.Entries)) + for i, sk := range seckeys { + require.Equal(t, w.Entries[i].Secret, sk) + pk := cipher.PubKeyFromSecKey(sk) + require.Equal(t, w.Entries[i].Public, pk) + } + lastSeed, ok := w.Meta["lastSeed"] + require.True(t, ok) + require.Equal(t, lastSeed, hex.EncodeToString(newSeed)) +} + +// TestLiveGUIInjectTransaction does almost the same procedure as TestCreateAndBroadcastRawTransaction. +// The only difference is we broadcast the raw transaction throught the gui /injectTransaction api. +func TestLiveGUIInjectTransaction(t *testing.T) { + if !doLive(t) { + return + } + + requireWalletEnv(t) + + c := api.NewClient(rpcAddress()) + // prepares wallet and confirms the wallet has at least 2 coins and 2 coin hours. + w, totalCoins, _ := prepareAndCheckWallet(t, 2e6, 2) + + if w.IsEncrypted() { + t.Skip("CLI wallet integration tests do not support encrypted wallets yet") + return + } + + tt := []struct { + name string + args func() []string + errMsg []byte + checkTx func(t *testing.T, txid string) + }{ + { + // Send all coins to the first address to one output. + name: "send all coins to the first address", + args: func() []string { + coins, err := droplet.ToString(totalCoins) + require.NoError(t, err) + return []string{"createRawTransaction", w.Entries[0].Address.String(), coins} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms all coins are in the first address in one output + tx := getTransaction(t, txid) + require.Len(t, tx.Transaction.Transaction.Out, 1) + c, err := droplet.FromString(tx.Transaction.Transaction.Out[0].Coins) + require.NoError(t, err) + require.Equal(t, totalCoins, c) + }, + }, + { + // Send 0.5 coin to the second address. + // Send 0.5 coin to the third address. + // After sending, the first address should have at least 1 coin left. + name: "send to multiple address with -m option", + args: func() []string { + addrCoins := []struct { + Addr string `json:"addr"` + Coins string `json:"coins"` + }{ + { + w.Entries[1].Address.String(), + "0.5", + }, + { + w.Entries[2].Address.String(), + "0.5", + }, + } + + v, err := json.Marshal(addrCoins) + require.NoError(t, err) + + return []string{"createRawTransaction", "-m", string(v)} + }, + checkTx: func(t *testing.T, txid string) { + // Confirms the first address has at least 1 coin left. + coins, _ := getAddressBalance(t, w.Entries[0].Address.String()) + require.True(t, coins >= 1e6) + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // Create raw transaction first + output, err := exec.Command(binaryPath, tc.args()...).CombinedOutput() + if err != nil { + t.Fatalf("err: %v, output: %v", err, string(output)) + return + } + require.NoError(t, err) + output = bytes.TrimRight(output, "\n") + if bytes.Contains(output, []byte("Error:")) { + require.Equal(t, tc.errMsg, output) + return + } + + // Broadcast raw transaction with gui /injectTransaction + txid, err := c.InjectTransaction(string(output)) + require.NoError(t, err) + + txid = strings.TrimRight(txid, "\n") + fmt.Println("txid:", txid) + _, err = cipher.SHA256FromHex(txid) + require.NoError(t, err) + + // Wait untill transaction is confirmed. + tk := time.NewTicker(time.Second) + loop: + for { + select { + case <-time.After(30 * time.Second): + t.Fatal("Wait tx confirmation timeout") + case <-tk.C: + if isTxConfirmed(t, txid) { + break loop + } + } + } + + tc.checkTx(t, txid) + }) + } +} + +func TestEncryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.True(t, w.IsEncrypted()) + require.Empty(t, w.Meta["seed"]) + require.Empty(t, w.Meta["lastSeed"]) + + // Confirms that secrets in address entries are empty + for _, e := range w.Entries { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + errMsg: []byte("wallet is encrypted\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + for _, ct := range cryptoTypes { + name := fmt.Sprintf("name=%v crypto type=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"encryptWallet", "-x", string(ct)}, tc.args[:]...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + + var rlt wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) + require.NoError(t, err) + w, err := rlt.ToWallet() + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } + } +} + +func TestDecryptWallet(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errMsg []byte + errWithHelp bool + checkWallet func(t *testing.T, w *wallet.Wallet) + }{ + { + name: "wallet is encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + checkWallet: func(t *testing.T, w *wallet.Wallet) { + require.False(t, w.IsEncrypted()) + require.Empty(t, w.Meta["cryptoType"]) + require.Empty(t, w.Meta["secrets"]) + require.NotEmpty(t, w.Meta["seed"]) + require.NotEmpty(t, w.Meta["lastSeed"]) + + for _, e := range w.Entries { + require.NotEqual(t, cipher.SecKey{}, e.Secret) + } + }, + }, + { + name: "wallet is not encrypted", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + errMsg: []byte("wallet is not encrypted\n"), + }, + { + name: "invalid password", + args: []string{"-p", "wrong password"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + errMsg: []byte("invalid password\n"), + }, + { + name: "wallet doesn't exist", + args: []string{"-p", "pwd"}, + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + errMsg: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"decryptWallet"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + require.Equal(t, tc.errMsg, output) + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + + var rlt wallet.ReadableWallet + err = json.NewDecoder(bytes.NewReader(output)).Decode(&rlt) + require.NoError(t, err) + + w, err := rlt.ToWallet() + require.NoError(t, err) + tc.checkWallet(t, w) + }) + } +} + +func TestShowSeed(t *testing.T) { + if !doLiveOrStable(t) { + return + } + + tt := []struct { + name string + args []string + setup func(t *testing.T) func() + errWithHelp bool + errMsg []byte + expectOutput []byte + }{ + { + name: "unencrypted wallet", + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "unencrypted wallet with -j option", + args: []string{"-j"}, + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + return clean + }, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "pwd"}, + expectOutput: []byte("exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\n"), + }, + { + name: "encrypted wallet with -j option", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "pwd", "-j"}, + expectOutput: []byte("{\n \"seed\": \"exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy\"\n}\n"), + }, + { + name: "encrypted wallet with invalid password", + setup: func(t *testing.T) func() { + _, clean := createEncryptedWallet(t) + return clean + }, + args: []string{"-p", "wrong password"}, + expectOutput: []byte("invalid password"), + }, + { + name: "wallet doesn't exist", + setup: func(t *testing.T) func() { + _, clean := createUnencryptedWallet(t) + os.Setenv("WALLET_NAME", "not-exist.wlt") + return clean + }, + errWithHelp: true, + expectOutput: []byte("not-exist.wlt doesn't exist."), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + clean := tc.setup(t) + defer clean() + args := append([]string{"showSeed"}, tc.args...) + output, err := exec.Command(binaryPath, args...).CombinedOutput() + if err != nil { + require.EqualError(t, err, "exit status 1") + return + } + + if tc.errWithHelp { + require.True(t, bytes.Contains(output, tc.errMsg), string(output)) + return + } + require.Equal(t, tc.expectOutput, output) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-balance.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-balance.golden new file mode 100755 index 0000000..3000ea6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "addresses": [ + { + "confirmed": { + "coins": "63083.000000", + "hours": "38823396" + }, + "spendable": { + "coins": "63083.000000", + "hours": "38823396" + }, + "expected": { + "coins": "63083.000000", + "hours": "38823396" + }, + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-outputs.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-outputs.golden new file mode 100755 index 0000000..06a6f74 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/address-outputs.golden @@ -0,0 +1,38 @@ +{ + "outputs": { + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/block0.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/block0.golden new file mode 100755 index 0000000..7003bda --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/block0.golden @@ -0,0 +1,36 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks0-5.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks0-5.golden new file mode 100755 index 0000000..dc378e6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks0-5.golden @@ -0,0 +1,830 @@ +{ + "blocks": [ + { + "header": { + "seq": 0, + "block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "previous_block_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "fee": 0, + "version": 0, + "tx_body_hash": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add" + }, + "body": { + "txns": [ + { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + ] + }, + "size": 86 + }, + { + "header": { + "seq": 1, + "block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "previous_block_hash": "0551a1e5af999fe8fff529f6f2ab341e1e33db95135eef1b2be44fe6981349f3", + "timestamp": 1427926392, + "fee": 99999999999900, + "version": 0, + "tx_body_hash": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe" + }, + "body": { + "txns": [ + { + "length": 3846, + "type": 0, + "txid": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "inner_hash": "0f7019627886818d2501af189bbac18e21b8e959891c5b2726f89e29355aa10a", + "sigs": [ + "be602113fe288f750001ab65f254ceedd8b05b1becc456a0a52a0bea10b8280e38d950933992ad3265e1f81d197036fa634b316f08b3b319ffce081aa43f3bb600" + ], + "inputs": [ + "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0" + ], + "outputs": [ + { + "uxid": "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "26f585cb96f35307f0af5b9aee004a29b7795695f4c5c836104e2fbbf429a3ce", + "dst": "2EYM4WFHe4Dgz6kjAdUkM6Etep7ruz2ia6h", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "18a43b8b69bbf12a9e49e6f9783ba258397e6567301aeed9e901a1e4fed9fef9", + "dst": "25aGyzypSA3T9K6rgPUv1ouR13efNPtWP5m", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5a69ef09b5de21b117cac62141a8de4eade7558c42f0ba8b50996f5ec7867c5d", + "dst": "ix44h3cojvN6nqGcdpy62X7Rw6Ahnr3Thk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "aef761a12e3d0fa9c4a8db62b8bab1015c32931b7e3a7fc9a77282cec218f79d", + "dst": "AYV8KEBEAPCg8a59cHgqHMqYHP9nVgQDyW", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "445a4082da251fa161e4705d115fe2018ca15a5f92e8a0950793405410e6be12", + "dst": "2Nu5Jv5Wp3RYGJU1EkjWFFHnebxMx1GjfkF", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5e35182bc9372d898df106bb2e7b3dfe33d28e59082f5d19d4a84ac0012d1291", + "dst": "2THDupTBEo7UqB6dsVizkYUvkKq82Qn4gjf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "368a609ee90ca15bbbd297af07dc6705131764476d54bef641017ffcd0885e65", + "dst": "tWZ11Nvor9parjg4FkwxNVcby59WVTw2iL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "13afe1586015c4d7312f89d123153279e4961eb0d53a4d036847d5d989ba90dc", + "dst": "m2joQiJRZnj3jN6NsoKNxaxzUTijkdRoSR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f625cf04412199c16e073dbb500e66c23cfe69043578b4a2d879a329aac563ec", + "dst": "8yf8PAQqU2cDj8Yzgz3LgBEyDqjvCh2xR7", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b2da50a08756c34d059a04812451cf3296f73ba87f8cca38473ac8f051ab6d1e", + "dst": "sgB3n11ZPUYHToju6TWMpUZTUcKvQnoFMJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "135c28698e80e3b2a737d59c16c79684c3fb3ec5cec59f466a39f4ac3c73968e", + "dst": "2UYPbDBnHUEc67e7qD4eXtQQ6zfU2cyvAvk", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "df63056cf3ae21efa86d241876ad0194387317585dc9e4fcd80954b47d59b57a", + "dst": "wybwGC9rhm8ZssBuzpy5goXrAdE31MPdsj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4628f4cfdbf1eb7cccc25d461c46cc29e90cffb5d6277e0de641f7701d60c308", + "dst": "JbM25o7kY7hqJZt3WGYu9pHZFCpA9TCR6t", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "47e4706dc4d80a70b20c889476fb0627ca6d5bdaa790f4ceba44a689d31b2dcc", + "dst": "2efrft5Lnwjtk7F1p9d7BnPd72zko2hQWNi", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b64bc50d370a06df117eb543ca051239c985cfc4b6aa527c51b700de32c7fc41", + "dst": "Syzmb3MiMoiNVpqFdQ38hWgffHg86D2J4e", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "390bc4c045fa9f289957b7eca529bfadac96a7dd074bcfbdd3b09e99413b8202", + "dst": "2g3GUmTQooLrNHaRDhKtLU8rWLz36Beow7F", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6aa162f7fc09598c4dc8f5fab7fb2383f28c3840937a001acd9f37136e1691b2", + "dst": "D3phtGr9iv6238b3zYXq6VgwrzwvfRzWZQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e440cf4c896735d3299a871f988c134f404fb2065d1f20c87c9c9bc5fa582e09", + "dst": "gpqsFSuMCZmsjPc6Rtgy1FmLx424tH86My", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "eea791e84a53e4d99485519c5d2c3146b0a2ad080cf92904ae7b28c2d9a6e3ca", + "dst": "2EUF3GPEUmfocnUc1w6YPtqXVCy3UZA4rAq", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "01048ad6a538256d9a8c6c9c6321ca1a01b31cbf08e74fd4ff0f141bf97eb8ce", + "dst": "TtAaxB3qGz5zEAhhiGkBY9VPV7cekhvRYS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc5f1f1ddc8cb23df3d42f1e5a1dda9d356846fe930ae4484bc1eeb1b3b2c95b", + "dst": "2fM5gVpi7XaiMPm4i29zddTNkmrKe6TzhVZ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f03087245a6b64bb69cd5866a1887ae595a9e1a86e196754984840eaf6d3eb9c", + "dst": "ix3NDKgxfYYANKAb5kbmwBYXPrkAsha7uG", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "239bdba27dabd52f7450f7d8521c9a7e5ac74093ae3f6f2348bf40ac9a6db7a5", + "dst": "2RkPshpFFrkuaP98GprLtgHFTGvPY5e6wCK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d60879e562b65f97d40bec7309d4490ba0a8c80e2349ecb2e3505aaa50ea1e47", + "dst": "Ak1qCDNudRxZVvcW6YDAdD9jpYNNStAVqm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "66e685901492c94942522c346759c711ee2e78a059ef274e77a6ab433409683c", + "dst": "2eZYSbzBKJ7QCL4kd5LSqV478rJQGb4UNkf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b497992663f99f9902deaaf487b00655820003015ea92091628f4a6e8aeb5854", + "dst": "KPfqM6S96WtRLMuSy4XLfVwymVqivdcDoM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "bc40377012004566712fa860e74db97305091cc163e95435e04556c70d32f9c5", + "dst": "5B98bU1nsedGJBdRD5wLtq7Z8t8ZXio8u5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "73304622e33994bc2d4ade2cab78d28e1b65185e60ad3c781ecfb5cbc8159136", + "dst": "2iZWk5tmBynWxj2PpAFyiZzEws9qSnG3a6n", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fed15e8506d0e0898510311850b8863ef6d9a499215ae8823a1e3fb9c8140ab2", + "dst": "XUGdPaVnMh7jtzPe3zkrf9FKh5nztFnQU5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "12034bc455d0821813d7eb9afed1ed1a8f19b6f29826ef4a057b4aa0b4228817", + "dst": "hSNgHgewJme8uaHrEuKubHYtYSDckD6hpf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fc444cdb2598f44209a41ea20afdc9065ebe51b7cd5f65bb1c0f7a7b427ce7b1", + "dst": "2DeK765jLgnMweYrMp1NaYHfzxumfR1PaQN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "618d242d95d33e2d7316612a164d89859b85f1287f0d5bed4dcb561cf478f706", + "dst": "orrAssY5V2HuQAbW9K6WktFrGieq2m23pr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "07f70fd4108ef4d2fde3b85411728c1f7bd3a135d2062c5a30a46cc885463780", + "dst": "4Ebf4PkG9QEnQTm4MVvaZvJV6Y9av3jhgb", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "af9bcf6ba63a08e699bc101aa362f135343aaf78a56e9f88d118fca0e1ce5c08", + "dst": "7Uf5xJ3GkiEKaLxC2WmJ1t6SeekJeBdJfu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6b3530bb930ed10bbc4c307663aba4377c08443498a0a2cf023b1be72f378ae1", + "dst": "oz4ytDKbCqpgjW3LPc52pW2CaK2gxCcWmL", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "fd6da5199e528958e68ee8dd003b727d4d840754ea7c1e0c05e4f0e504c9b2cd", + "dst": "2ex5Z7TufQ5Z8xv5mXe53fSQRfUr35SSo7Q", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "131f07f5b40f365fb537b863e4aa5ef0efcd77b7fa2ff321d90eeb743ac43678", + "dst": "WV2ap7ZubTxeDdmEZ1Xo7ufGMkekLWikJu", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ffbdfdbf3427d04f445c33e867845bec1ee64a9dfe0d0fa8284547c2226fdfa9", + "dst": "ckCTV4r1pNuz6j2VBRHhaJN9HsCLY7muLV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b53c7188ebf4d630790ff63275679ba48009e31af6e4fe15806619216caa750", + "dst": "MXJx96ZJVSjktgeYZpVK8vn1H3xWP8ooq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "b4c6639b49402c2753f83c7fb7d3ffa65da74e47fef2b781933ff55b14d09bcd", + "dst": "wyQVmno9aBJZmQ99nDSLoYWwp7YDJCWsrH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c956289db079c00d2f80c590d3c8ca26c37da534fe5f65e799b3982ceca493c", + "dst": "2cc9wKxCsFNRkoAQDAoHke3ZoyL1mSV14cj", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "550d2a8d3047cdae0c05a61cc3de43e758b123a6955fa067d3ac375f7d0dbadc", + "dst": "29k9g3F5AYfVaa1joE1PpZjBED6hQXes8Mm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78740d5bf49989936d315bf641949232aace582e03de57db8abff940f7d51bd1", + "dst": "2XPLzz4ZLf1A9ykyTCjW5gEmVjnWa8CuatH", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9f2c83c5165826de1077f428ad39d41473e32ed64cd83180d49e7d8e5db996d0", + "dst": "iH7DqqojTgUn2JxmY9hgFp165Nk7wKfan9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "883be4d7173c235933294ab8dcae8cc76609166eaa1c1f07e9b51d551c979709", + "dst": "RJzzwUs3c9C8Y7NFYzNfFoqiUKeBhBfPki", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6384ed19650d384c29db4c3a39a1ca855058fab758075be2dee759dd9e6faae1", + "dst": "2W2cGyiCRM4nwmmiGPgMuGaPGeBzEm7VZPn", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "25e22bb83c51f766571cf92ec7303071c9f25e3a34366f4679a22519e6ec368b", + "dst": "ALJVNKYL7WGxFBSriiZuwZKWD4b7fbV1od", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0c238e82f3a4beee1be7b5b464e8553404f6927d5ab93c3d649d362c01097782", + "dst": "tBaeg9zE2sgmw5ZQENaPPYd6jfwpVpGTzS", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dad4991bfa5c51eb176f28c1b3f86661e02579905e6e07c997df22004e06244a", + "dst": "2hdTw5Hk3rsgpZjvk8TyKcCZoRVXU5QVrUt", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4ba91512c168281f41d3934b927d0d86a3136a31cc345b635095928f8e5f013c", + "dst": "A1QU6jKq8YgTP79M8fwZNHUZc7hConFKmy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c416f5e604eeada9ae8e520a429d8f19d4230626769e7121007e01353730784f", + "dst": "q9RkXoty3X1fuaypDDRUi78rWgJWYJMmpJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7b8787fd4076c27d074d2a4761377a1aa26c843c432e3b7e6b0ebf1e29528188", + "dst": "2Xvm6is5cAPA85xnSYXDuAqiRyoXiky5RaD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "38f22b194f04d85a6b545b37df06195edeb8503798b229ddeaa946018150c05c", + "dst": "4CW2CPJEzxhn2PS4JoSLoWGL5QQ7dL2eji", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "246377a036ad5444bcd5f47ac9e55fec7c85fc40644df593038d360554a809f7", + "dst": "24EG6uTzL7DHNzcwsygYGRR1nfu5kco7AZ1", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c6d5e543ff5f2c2526728d588fb21753db5b7e05b8b275aa5e9b24d29350afb0", + "dst": "KghGnWw5fppTrqHSERXZf61yf7GkuQdCnV", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "98e223e6e2240fef83082d3daa86e46f10e0c71f3f74489ba95db0951a166f53", + "dst": "2WojewRA3LbpyXTP9ANy8CZqJMgmyNm3MDr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c8971ca91f8e21c556f647940073db003f7dd5582ae55d4ebca602d5e8e91a6e", + "dst": "2BsMfywmGV3M2CoDA112Rs7ZBkiMHfy9X11", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "dfa7822c05f54116c9fc3b2cde1ecb4667f47a2d8771fe886e832c223cdc4e82", + "dst": "kK1Q4gPyYfVVMzQtAPRzL8qXMqJ67Y7tKs", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6d37c0c4b6fcbac1e53a46c9c2dc5d3c3b36312c53f25b2baacc785ea77a11f7", + "dst": "28J4mx8xfUtM92DbQ6i2Jmqw5J7dNivfroN", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9ba5e31610f0545666f102465efa8caa48ad3fb5b8abd5ae802f4a71e3f7de3b", + "dst": "gQvgyG1djgtftoCVrSZmsRxr7okD4LheKw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "3ca365aace71e24b04d6f2ffbf7171468c5e71783858c710cae539c5e43e0c0e", + "dst": "3iFGBKapAWWzbiGFSr5ScbhrEPm6Esyvia", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c858f2db2a20ac562d32f8fb2a3a11039849a6e44d2bec30befb2e173532a9a3", + "dst": "NFW2akQH2vu7AqkQXxFz2P5vkXTWkSqrSm", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1550a76598693b950346397e0e825bbb2805edde38b0d0240e50050829b7b1dd", + "dst": "2MQJjLnWRp9eHh6MpCwpiUeshhtmri12mci", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "466340ab7733abb23ab24d877c673fe089c273f11808fbbd6f33a91da92ee96c", + "dst": "2QjRQUMyL6iodtHP9zKmxCNYZ7k3jxtk49C", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "401d4c0c1060ebbb4b9fb3859c2eb47789f94086f4deb01234bf46f7cdc81247", + "dst": "USdfKy7B6oFNoauHWMmoCA7ND9rHqYw2Mf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2c0e3aa084f5fec45f99b3f125ce7d50c6da526ef5165df5f22ba603147c3fc2", + "dst": "cA49et9WtptYHf6wA1F8qqVgH3kS5jJ9vK", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2e724d83e35235c23c0bb16ae9b708a5bba3c23b186b05d4b8c606f6bb4b311", + "dst": "qaJT9TjcMi46sTKcgwRQU8o5Lw2Ea1gC4N", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "4f30eae8c49eb268fe364eaf5ee0788da6e2f6adc2f83cd82e96a4bfe98496f5", + "dst": "22pyn5RyhqtTQu4obYjuWYRNNw4i54L8xVr", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8753d5775c22477a8ef74eeebf61d7de30be702e70118f552cc18ad963ffe950", + "dst": "22dkmukC6iH4FFLBmHne6modJZZQ3MC9BAT", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efa2007c561dcbf7c83a6bbdd2ef75e7cca76b05330a8b948ba0dd94dee949f7", + "dst": "z6CJZfYLvmd41GRVE8HASjRcy5hqbpHZvE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8b379d1b8ff0153c63ee69c40a7155b97fa42ab570f68ff847d457316c4d8ab9", + "dst": "GEBWJ2KpRQDBTCCtvnaAJV2cYurgXS8pta", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cc84f93adce16699d9e84ef32f55333402431b58dc50c17084bcb8b33f382f88", + "dst": "oS8fbEm82cprmAeineBeDkaKd7QownDZQh", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "f38f0760769c19075034f70b059abf4d1bfa6d01e1e8c369a99900ed1eaeca6d", + "dst": "rQpAs1LVQdphyj9ipEAuukAoj9kNpSP8cM", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8d55f76bb0b3dd222cf85a7193501c0f4071b446f56dbd1da355b1625993325a", + "dst": "6NSJKsPxmqipGAfFFhUKbkopjrvEESTX3j", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "efde499c7e4444bc602b7bf5ed50e95a18ce8ec9a06ba9d850a05bb7a25ecb3a", + "dst": "cuC68ycVXmD2EBzYFNYQ6akhKGrh3FGjSf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "2a4d631d5dc90e397d85f13410d1a6d877dcaf592a0e2be2e727443ac74b5bd5", + "dst": "bw4wtYU8toepomrhWP2p8UFYfHBbvEV425", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "e936299a21240744f6edbab493449323f920bbe15dcf294463e5a2ace10f27b0", + "dst": "HvgNmDz5jD39Gwmi9VfDY1iYMhZUpZ8GKz", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "44e17f4bd29411a1614457171c06183e364bf6ff80a201717b2dfc0748e9ebe3", + "dst": "SbApuZAYquWP3Q6iD51BcMBQjuApYEkRVf", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "1941e5cc5e38dd92427580af699b1f410be7b29ff17d3d0ff3d046bfba0aaabf", + "dst": "2Ugii5yxJgLzC59jV1vF8GK7UBZdvxwobeJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "ff6c0f27fcf92f3b4a3871b801c3116847fe47a7e3bafcadd4855d06012091ad", + "dst": "21N2iJ1qnQRiJWcEqNRxXwfNp8QcmiyhtPy", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cd6c4b785e60757fad0e6fd4874b729ea7703fe7ee9560e1283d2eb71fc75321", + "dst": "9TC4RGs6AtFUsbcVWnSoCdoCpSfM66ALAc", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "745eaff456a390c3868742a039e72c2a93ff8eee10417dbe848d533b89facc04", + "dst": "oQzn55UWG4iMcY9bTNb27aTnRdfiGHAwbD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "d2f3f050c9ef31bf5c3b14c1c71699c4f4b38aa18479531194d12e6277416516", + "dst": "2GCdwsRpQhcf8SQcynFrMVDM26Bbj6sgv9M", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0b95850edabed70762768ac1695c5d7f230cccaa8de06657cda42cafba36374f", + "dst": "2NRFe7REtSmaM2qAgZeG45hC8EtVGV2QjeB", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "7c767d3a06db1ac0e1809ebe29a7d9689143259f4651837de54423e287c20490", + "dst": "25RGnhN7VojHUTvQBJA9nBT5y1qTQGULMzR", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "78b07e8fe1366e173f2eeb75c35cd53baf0f6100de50ae12b4ffe7d0d7ba4298", + "dst": "26uCBDfF8E2PJU2Dzz2ysgKwv9m4BhodTz9", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "5010eb25f6e1ed725fb901ae1e945e545ae846d7be8a135333d2d41102c33328", + "dst": "Wkvima5cF7DDFdmJQqcdq8Syaq9DuAJJRD", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "178a33e64826cd2039b8538b74e6de513966acab45ab79d77dc9392018a65ffb", + "dst": "286hSoJYxvENFSHwG51ZbmKaochLJyq4ERQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "044dc539d063250dc654b2bf0986a9044b4eea05e1284c11a2b313acd8dc3498", + "dst": "FEGxF3HPoM2HCWHn82tyeh9o7vEQq5ySGE", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "9fd5ea38f383291566def44b6fb932414f97123952578fe0cfb9a30eb075a099", + "dst": "h38DxNxGhWGTq9p5tJnN5r4Fwnn85Krrb6", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "be5930e9cc35801433bcd21db84da7d4f1d8e744feca16a2c6fb00c81ce93e51", + "dst": "2c1UU8J6Y3kL4cmQh21Tj8wkzidCiZxwdwd", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "8cd999cd193d315e5f1c6f74c230c12e6abe6847924f6e89d988e09ca413f52e", + "dst": "2bJ32KuGmjmwKyAtzWdLFpXNM6t83CCPLq5", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "0cff53628eb0e984c134b68cbe4b1bb7721a05adaa32e93b9df489a9a7a176cf", + "dst": "2fi8oLC9zfVVGnzzQtu3Y3rffS65Hiz6QHo", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "a5ef046e84be9ff2485dde49afe6073811286761afac3bbd588b6e4130930479", + "dst": "TKD93RxFr2Am44TntLiJQus4qcEwTtvEEQ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "cdee5f84c4f08098ac740e3a260ced14c1e199e126aa5291ec079b281a7dc407", + "dst": "zMDywYdGEDtTSvWnCyc3qsYHWwj9ogws74", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "6a24135f8496e7a37dcf7164218bb3aa530319f3b2bf3c7a1a9cc1bd17831328", + "dst": "25NbotTka7TwtbXUpSCQD8RMgHKspyDubXJ", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "693c7f970b34ce5882e62430f4c9c28957159a257d27d4e21a61fd95c6b97464", + "dst": "2ayCELBERubQWH5QxUr3cTxrYpidvUAzsSw", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "c008a613cef129c180dbcc7213f2d41a14d245d06a3844d63d9beac963145385", + "dst": "RMTCwLiYDKEAiJu5ekHL1NQ8UKHi5ozCPg", + "coins": "1000000.000000", + "hours": 1 + }, + { + "uxid": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "dst": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1 + } + ] + } + ] + }, + "size": 3846 + }, + { + "header": { + "seq": 2, + "block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "previous_block_hash": "baf3b622f043bbe3ef480416251a6545d07f173e5969dde2b63c4a12956d38fd", + "timestamp": 1427927651, + "fee": 0, + "version": 0, + "tx_body_hash": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "312a269b8248e389c61571cc13f4ad13b7d53b64853d990ddc301a58e7071889", + "inner_hash": "4daff2831f5bc2877a98a49b0ef75f8ff01bcb35082fd4018c77707dfca31849", + "sigs": [ + "f4482e0781e0d94c8c4773940e1f811405681844a9dc3c1938243442e1cbd5463d5e251880abbf8ff1ed85b4b2659e83ee30f06cc4c5dc9913aa6a9630fbe3de01" + ], + "inputs": [ + "e3e72ee077c8b0c3f87da7cf50cad8876bd3f489f373d9fe82fc2e971df56f76" + ], + "outputs": [ + { + "uxid": "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999990.000000", + "hours": 1 + }, + { + "uxid": "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 3, + "block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "previous_block_hash": "01723bc4dc90f1cb857a94fe5e3bb50c02e6689fd998f8147c9cae07fbfa63af", + "timestamp": 1427927671, + "fee": 0, + "version": 0, + "tx_body_hash": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619" + }, + "body": { + "txns": [ + { + "length": 183, + "type": 0, + "txid": "a6a709e9388a4d67a47d262b11da5f804eddd9d67acc4a3e450f7a567bdc1619", + "inner_hash": "ea6adee3180c7f9d73d1e693822d5d1c2bba85067f89a873355bc771a078faa1", + "sigs": [ + "ce8fd47e2044ed17998f92621e90329f673a746c802d67f639ca083705dd199f6ee346781497b44132434922879244d819694b5903093f784570c55d293ab4af01" + ], + "inputs": [ + "af0b2c1cc882a56b6c0c06e99e7d2731413b988329a2c47a5c2aa8be589b707a" + ], + "outputs": [ + { + "uxid": "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 183 + }, + { + "header": { + "seq": 4, + "block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "previous_block_hash": "35c3ebbe6feaeeab27ac77c1712051787bdd4bbfb5cdcdebc81f8aac98a2f3f3", + "timestamp": 1428793611, + "fee": 1852, + "version": 0, + "tx_body_hash": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "c24b92898381fbebe59a457924184f4cce1e7166e140ca75aea5baf854c1ab75", + "inner_hash": "43dd65d5644ec5214a901ac94e530cbedb83d2174cf402c7b24697cfe55e1de7", + "sigs": [ + "434a7a0b624fda393c1caa57ac9787f69da3d8854d0ec6f69f0da1c96c9b683d787064b644e9ac3dd4dd8466c22c1547cff89c2552420f5efcfd1eacb1a2eac301" + ], + "inputs": [ + "0cd548e03bd13bca8647cd13f6baef0c65fd03081aeb6dc3695536e5bc6018ae" + ], + "outputs": [ + { + "uxid": "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999980.000000", + "hours": 3704 + }, + { + "uxid": "98b3e6e6d4ed36159b7dbf5f305174fc0c255d2d97528b35a67d50b9968e2b2f", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "10.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 5, + "block_hash": "114fe60587a158428a47e0f9571d764f495912c299aa4e67fc88004cf21b0c24", + "previous_block_hash": "415e47348a1e642cb2e31d00ee500747d3aed0336aabfff7d783ed21465251c7", + "timestamp": 1428798821, + "fee": 2036, + "version": 0, + "tx_body_hash": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69" + }, + "body": { + "txns": [ + { + "length": 317, + "type": 0, + "txid": "0579e7727627cd9815a8a8b5e1df86124f45a4132cc0dbd00d2f110e4f409b69", + "inner_hash": "fe123ca954a82bb1ce2cc9ef9c56d6b649a4cbaf5b17394b0ffda651ed32327e", + "sigs": [ + "056ed0f74367fb1370d7e98689953983d9cf34eb6669854f1645c8a16c93d85075661e7d4f6df0ce5ca8eb9852eff6a12fbac2caafee03bb8c616f847c61416800", + "8aaa7f320a7b01169d3217a600100cb27c55e4ce56cd3455814f56d8e4e65be746e0e20e776087af6f19361f0b898edc2123a5f9bd35d24ef8b8669ca85b142601" + ], + "inputs": [ + "9eb7954461ba0256c9054fe38c00c66e60428dccf900a62e74b9fe39310aea13", + "706f82c481906108880d79372ab5c126d32ecc98cf3f7c74cf33f5fda49dcf70" + ], + "outputs": [ + { + "uxid": "fa2b598d233fe434f907f858d5de812eacf50c7b3fd152c77cd6e246fe356a9e", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "999890.000000", + "hours": 4073 + }, + { + "uxid": "dc63c680f408c4e646037966189383a5d50eda34e666c2a0c75c0c6bf13b71a1", + "dst": "2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF", + "coins": "100.000000", + "hours": 0 + } + ] + } + ] + }, + "size": 317 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks180.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks180.golden new file mode 100755 index 0000000..ef9a824 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/blocks180.golden @@ -0,0 +1,46 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden new file mode 100755 index 0000000..9e8390f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/decode-raw-transaction.golden @@ -0,0 +1,40 @@ +{ + "hash": "a121fe93d0ddebc50e6916adebb524b5b4f087b7a35904b35586f908e3b6b09f", + "inner_hash": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "sigs": [ + "a2a10f07e0e06cf6ba3e793b3186388a126591ee230b3f387617f1ccb6376a3f18e094bd3f7719aa8191c00764f323872f5192da393852bd85dab70b13409d2b01" + ], + "in": [ + "4d78de698a33abcfff22391c043b57a56bb0efbdc4a5b975bf8e7889668896bc" + ], + "out": [ + { + "hash": "f087da7995cdde1c7ee49d0418f28fa441adab22e6d23990e7f92935be2aa154", + "src_tx": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "address": "2JCPnb1212XWQn8GUsQyv4HuB5VrgGHzb7N", + "coins": "177.999000", + "hours": 13908 + }, + { + "hash": "3a40b50a75b2afa06e009fbeacfbe372f346f9753f680a0de77cae8524d72d68", + "src_tx": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "address": "PE2qwUxTxe9RpdTnMcJtrP98riLW83nx5d", + "coins": "180.000000", + "hours": 4636 + }, + { + "hash": "dbe965543069910f403ce62be61310ef8f873abbfdf26d296ba8884b4b8291c9", + "src_tx": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "address": "wnhsTd3oXoKNRyLWj893pScqWXPMNg85RM", + "coins": "65.000000", + "hours": 4636 + }, + { + "hash": "b0c887a2e54d4946e70589c20d4dd48c525dc7bdc00daf085329ab73a8c423f2", + "src_tx": "a1d3345ac47f897f24084b1c6b9bd6e03fc92887050d0748bdab5e639c1fdcd4", + "address": "tWPDM36ex9zLjJw1aPMfYTVPbYgkL2Xp9V", + "coins": "27.000000", + "hours": 4635 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-2.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-2.golden new file mode 100755 index 0000000..25e3a86 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-2.golden @@ -0,0 +1,29 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "0ba2094a20d5fd2a8bed063fc4bbd3d7d2d8cedd07317086780043937310a1f3", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + }, + { + "address": "2EDapDfn1VC6P2hx4nTH2cRUkboGAE16evV", + "public_key": "0259a2d466c3d021d78eb09ffc8b2f4a84ce5c13264a25c9069c149f9be99c8eb0", + "secret_key": "356a6d77c5322cee36d12ad6c91a9135c403a25273ea64b30db264a5aa1f8314" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden new file mode 100755 index 0000000..4383c8b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses-encrypted.golden @@ -0,0 +1,27 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "", + "seed": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses.golden new file mode 100755 index 0000000..f12b147 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/generate-addresses.golden @@ -0,0 +1,24 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "f4ee62d76b32106664da3be08ffcab6944a8826bf82f4e8be6c9e790169b1a95", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + }, + { + "address": "7g3M372kxwNwwQEAmrronu4anXTW8aD1XC", + "public_key": "0319527fa74053b148d7efe973c0ee734e49f52a11417232e582b8c51e389d638a", + "secret_key": "f46d3e7661a1daef6229f83b641f9666bcfce4f9f2bd1a0161b35ac8d8ff8a8b" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden new file mode 100755 index 0000000..0083809 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction-cli.golden @@ -0,0 +1,29 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction.golden new file mode 100755 index 0000000..0083809 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/genesis-transaction.golden @@ -0,0 +1,29 @@ +{ + "transaction": { + "status": { + "confirmed": true, + "unconfirmed": false, + "height": 181, + "block_seq": 0, + "unknown": false + }, + "time": 1426562704, + "txn": { + "length": 0, + "type": 0, + "txid": "d556c1c7abf1e86138316b8c17183665512dc67633c04cf236a8b7f332cb4add", + "inner_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": 1426562704, + "sigs": [], + "inputs": [], + "outputs": [ + { + "uxid": "043836eb6f29aaeb8b9bfce847e07c159c72b25ae17d291f32125e7f1912e2a0", + "dst": "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + "coins": "100000000.000000", + "hours": 100000000000000 + } + ] + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt new file mode 100755 index 0000000..fc39e6d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "integration-test-encrypted.wlt", + "label": "integration-test", + "lastSeed": "", + "secrets": "dgB7Im4iOjEwNDg1NzYsInIiOjgsInAiOjEsImtleUxlbiI6MzIsInNhbHQiOiJidHVibVZ2eEhWNHVKc0szcHFwUE5xY3VoL1VvRjRYbjQ5N0IzLzhYUFhJPSIsIm5vbmNlIjoiSEZNd1VwYUNnYUk3eFo2SiJ9BceIdIv3aGRAsANPVAm6gvrgJd2jZxJLazBwd2yQhTTWXxYVReGEsL/fzYZyDbJNvJgGZpTJsQ0R2yVgjlRbr5Km6x4yiGk8riXWiQ1Tpcfjmst7vDzjq/lUrcci/lwuGwVNf+TsmhzyD/uvV/4yR8oPtZHgPDBoMIkB/NPawNkXkcP1D6lA5LAddWHkKt/SCRxF3YdKW64LjojqExUukYSLJenxFHkTbEB/QBLb/dfZXZolLYevIKbPH/Rt7qiwOj8bvfwPPlIRf101VCvqLW8q8fcfYzvidQyjz7CfW8wh6mqMmXW4Wp+I14BQIleuBlkd35Fz2etKMMiyyltYn5FaixbP2WHFHBBg+Yfm5OzYt5K7b0cG8kDfAN1PHyYc30o=", + "seed": "", + "tm": "1518271871", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test.wlt b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test.wlt new file mode 100755 index 0000000..7cd53c2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/integration-test.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "integration-test.wlt", + "label": "integration-test", + "lastSeed": "1c0ff9dd77fb5dd079078c3098e61a9d99965e8d55121cc3fb576af61d6d450a", + "seed": "exchange stage green marine palm tobacco decline shadow cereal chapter lamp copy", + "tm": "1518271871", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN", + "public_key": "03aefe8fc5952f67aca014ae4da6e7eba1321542be02d2d6f718c666750bf4c630", + "secret_key": "f1877ae49e2233db10460d3c971b2aaccc04d771629bc98ee7a1dafca9baed8e" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks0.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks0.golden new file mode 100755 index 0000000..b5b27b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks0.golden @@ -0,0 +1,3 @@ +{ + "blocks": [] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks1.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks1.golden new file mode 100755 index 0000000..ef9a824 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks1.golden @@ -0,0 +1,46 @@ +{ + "blocks": [ + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks2.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks2.golden new file mode 100755 index 0000000..39d08a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/last-blocks2.golden @@ -0,0 +1,88 @@ +{ + "blocks": [ + { + "header": { + "seq": 179, + "block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "previous_block_hash": "bb943b37f989326b057903ccc6eb1fa58a5d35e38706ae1ba81e0a6100bacf26", + "timestamp": 1431339429, + "fee": 33129894, + "version": 0, + "tx_body_hash": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "f58f664eea258100126636a4111838e489ef5aec848ca8498319c290fa2a0805", + "inner_hash": "db98f515ce6c3d99fd7c39a6ac59ab498b1a2cc8fc6a13377ac7d3d463898e7c", + "sigs": [ + "1ca18424c9a313e9c253aecaec3c532c35c60e454f026a3d2794c772bc74a19809d53f8862962e865dd822dd054cd7f32b89b810968d95c9db6a9a0c1095390601" + ], + "inputs": [ + "8e55f10a0615a0737e6906132e09ac08a206971ba4b656f004acc7f4b7889bc8" + ], + "outputs": [ + { + "uxid": "fe6762d753d626115c8dd3a053b5fb75d6d419a8d0fb1478c5fffc1fe41c5f20", + "dst": "R6aHqKWSQfvpdo2fGSrq4F1RYXkBWR9HHJ", + "coins": "615700.000000", + "hours": 5521648 + }, + { + "uxid": "01f9c1d6c83dbc1c993357436cdf7f214acd0bfa107ff7f1466d1b18ec03563e", + "dst": "sKr6GJwXTBcvG1P3qdrwnd4UgtrrgDa4jU", + "coins": "10050.000000", + "hours": 5521648 + } + ] + } + ] + }, + "size": 220 + }, + { + "header": { + "seq": 180, + "block_hash": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "previous_block_hash": "93fce3f520d9ec5b5c29226ad39fb61e3b9a92464fdec87d6805cf8e8e782959", + "timestamp": 1431574528, + "fee": 2265261, + "version": 0, + "tx_body_hash": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d" + }, + "body": { + "txns": [ + { + "length": 220, + "type": 0, + "txid": "0a610a34a8408effe8f2f70e4a85a3a8f4aca923f43e10a8a6e08cf410d7a35d", + "inner_hash": "d5b18a0c0c454e56fe1f7d0c64236d633f65717c04f08cd943f5669b4cc34667", + "sigs": [ + "2fac42571bb301783e46e804069c73c8226b637ae6385fec793e3a3860feaa6918058c55f461cef38341670c5c2da230d2241f267dbde6fc0528a6fb24362b3b00" + ], + "inputs": [ + "c39acd3494113650c1a6a7809287af7b12a78bbd97126d4585dd1715e2cb5a66" + ], + "outputs": [ + { + "uxid": "75692aeff988ce0da734c474dbef3a1ce19a5a6823bbcd36acb856c83262261e", + "dst": "qxmeHkwgAMfwXyaQrwv9jq3qt228xMuoT5", + "coins": "22100.000000", + "hours": 377543 + }, + { + "uxid": "a4b70476ea1e079ebd3503b52eee32d490515457fce6a5aa075770b598a9d14f", + "dst": "CDD8GoJUHEvBm1pD3BQ3hEC2KcJNhvUzpu", + "coins": "1000.000000", + "hours": 377543 + } + ] + } + ] + }, + "size": 220 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-addresses.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-addresses.golden new file mode 100755 index 0000000..3f99826 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-addresses.golden @@ -0,0 +1,5 @@ +{ + "addresses": [ + "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-wallets.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-wallets.golden new file mode 100755 index 0000000..13e0c7f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/list-wallets.golden @@ -0,0 +1,9 @@ +{ + "wallets": [ + { + "name": "integration-test.wlt", + "label": "integration-test", + "address_num": 1 + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config-use-csrf.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config-use-csrf.golden new file mode 100755 index 0000000..bd930f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config-use-csrf.golden @@ -0,0 +1,8 @@ +{ + "wallet_directory": "IGNORED/.skycoin/wallets", + "wallet_name": "skycoin_cli.wlt", + "data_directory": "IGNORED/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:46420", + "use_csrf": true +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config.golden new file mode 100755 index 0000000..217733d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/show-config.golden @@ -0,0 +1,8 @@ +{ + "wallet_directory": "IGNORED/.skycoin/wallets", + "wallet_name": "skycoin_cli.wlt", + "data_directory": "IGNORED/.skycoin", + "coin": "skycoin", + "rpc_address": "http://127.0.0.1:46420", + "use_csrf": false +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status-use-csrf.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status-use-csrf.golden new file mode 100755 index 0000000..16d034a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status-use-csrf.golden @@ -0,0 +1,8 @@ +{ + "running": true, + "num_of_blocks": 181, + "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "time_since_last_block": "", + "webrpc_address": "http://127.0.0.1:46420", + "use_csrf": true +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status.golden new file mode 100755 index 0000000..1cbd708 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/status.golden @@ -0,0 +1,8 @@ +{ + "running": true, + "num_of_blocks": 181, + "hash_of_last_block": "63614fdf08b67fcfc99d7b43d115fb9f57eb5c6833acdbdc712ee361f391f292", + "time_since_last_block": "", + "webrpc_address": "http://127.0.0.1:46420", + "use_csrf": false +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden new file mode 100755 index 0000000..b38d396 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/two-addresses-outputs.golden @@ -0,0 +1,48 @@ +{ + "outputs": { + "head_outputs": [ + { + "hash": "e5596ef0ba04ad9e0adbe0355a24c6bef249654906f917b68f8f0cf072508674", + "time": 1429382678, + "block_seq": 121, + "src_tx": "da82deafc15c36e7dc9cd95663e0dc910ae626ee543147ac7bd8682be00f7baf", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "62000.000000", + "hours": 378646, + "calculated_hours": 38127173 + }, + { + "hash": "3f9712cab0d3aeb217f1751fa19e53d75f814b4218866d4e70d63f32271d2023", + "time": 1429364452, + "block_seq": 120, + "src_tx": "d1569ca879f98450a920a2b427ab0e1d21342308fb6b4ea5031ee6e718217183", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "38.000000", + "hours": 480, + "calculated_hours": 23808 + }, + { + "hash": "3408638af298419b14a49e8e9dd69e97c9a06827d74edf9f410a870662360b31", + "time": 1429364072, + "block_seq": 118, + "src_tx": "a83e09e976b038d86491d8c029aec84a6313dc33e692da6ce50a2858e50c4666", + "address": "2kvLEyXwAYvHfJuFCkjnYNRTUfHPyWgVwKt", + "coins": "1045.000000", + "hours": 30769, + "calculated_hours": 672415 + }, + { + "hash": "439cdfd03972fb4bb5da54208cf8098ee78228c487ce9e84623f5f83e17a7d68", + "time": 1427926392, + "block_seq": 1, + "src_tx": "86564b421cd3d4fe6f5f2d7a3e5db9d6fc340892bddd3a150533dff7036d0efe", + "address": "ejJjiCwp86ykmFr5iTJ8LxQXJ2wJPTYmkm", + "coins": "1000000.000000", + "hours": 1, + "calculated_hours": 1013371112 + } + ], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-balance.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-balance.golden new file mode 100755 index 0000000..861022d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-balance.golden @@ -0,0 +1,31 @@ +{ + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "addresses": [ + { + "confirmed": { + "coins": "0.000000", + "hours": "0" + }, + "spendable": { + "coins": "0.000000", + "hours": "0" + }, + "expected": { + "coins": "0.000000", + "hours": "0" + }, + "address": "2Kg3eRXUhY6hrDZvNGB99DKahtrPDQ1W9vN" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-history.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-history.golden new file mode 100755 index 0000000..fe51488 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-history.golden @@ -0,0 +1 @@ +[] diff --git a/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-outputs.golden b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-outputs.golden new file mode 100755 index 0000000..ebfc9f4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/integration/testdata/wallet-outputs.golden @@ -0,0 +1,7 @@ +{ + "outputs": { + "head_outputs": [], + "outgoing_outputs": [], + "incoming_outputs": [] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go b/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go new file mode 100755 index 0000000..b96d27f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/last_blocks.go @@ -0,0 +1,43 @@ +package cli + +import ( + "fmt" + + "strconv" + + gcli "github.com/urfave/cli" +) + +func lastBlocksCmd() gcli.Command { + name := "lastBlocks" + return gcli.Command{ + Name: name, + Usage: "Displays the content of the most recently N generated blocks", + ArgsUsage: "[numberOfBlocks]", + OnUsageError: onCommandUsageError(name), + Action: getLastBlocks, + } + // Commands = append(Commands, cmd) +} + +func getLastBlocks(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + + num := c.Args().First() + if num == "" { + num = "1" + } + + n, err := strconv.ParseUint(num, 10, 64) + if err != nil { + return fmt.Errorf("invalid block number, %s", err) + } + + blocks, err := rpcClient.GetLastBlocks(n) + + if err != nil { + return err + } + + return printJSON(blocks) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go b/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go new file mode 100755 index 0000000..2021cd6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/list_addrs.go @@ -0,0 +1,47 @@ +package cli + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +func listAddressesCmd() gcli.Command { + name := "listAddresses" + return gcli.Command{ + Name: name, + Usage: "Lists all addresses in a given wallet", + ArgsUsage: "[walletName]", + OnUsageError: onCommandUsageError(name), + Action: listAddresses, + } + // Commands = append(Commands, cmd) +} + +func listAddresses(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + // get wallet name + w, err := resolveWalletPath(cfg, c.Args().First()) + if err != nil { + return err + } + + wlt, err := wallet.Load(w) + if err != nil { + return WalletLoadError{err} + } + + addrs := wlt.GetAddresses() + + s, err := FormatAddressesAsJSON(addrs) + if err != nil { + return err + } + + fmt.Println(s) + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go b/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go new file mode 100755 index 0000000..f0e7662 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/list_wallets.go @@ -0,0 +1,65 @@ +package cli + +import ( + "io/ioutil" + "path/filepath" + "strings" + + "github.com/skycoin/skycoin/src/wallet" + + gcli "github.com/urfave/cli" +) + +// WalletEntry represents an enty in a wallet file +type WalletEntry struct { + Name string `json:"name"` + Label string `json:"label"` + AddressNum int `json:"address_num"` +} + +func listWalletsCmd() gcli.Command { + name := "listWallets" + return gcli.Command{ + Name: name, + Usage: "Lists all wallets stored in the wallet directory", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Action: listWallets, + } + // Commands = append(Commands, cmd) +} + +func listWallets(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + var wlts struct { + Wallets []WalletEntry `json:"wallets"` + } + + entries, err := ioutil.ReadDir(cfg.WalletDir) + if err != nil { + return err + } + + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, walletExt) { + continue + } + + path := filepath.Join(cfg.WalletDir, name) + w, err := wallet.Load(path) + if err != nil { + return WalletLoadError{err} + } + wlts.Wallets = append(wlts.Wallets, WalletEntry{ + Name: name, + Label: w.Label(), + AddressNum: len(w.Entries), + }) + } + } + + return printJSON(wlts) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/outputs.go b/vendor/github.com/skycoin/skycoin/src/cli/outputs.go new file mode 100755 index 0000000..1687730 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/outputs.go @@ -0,0 +1,107 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/wallet" +) + +func walletOutputsCmd(cfg Config) gcli.Command { + name := "walletOutputs" + return gcli.Command{ + Name: name, + Usage: "Display outputs of specific wallet", + ArgsUsage: "[wallet file]", + Description: fmt.Sprintf(`Display outputs of specific wallet, the default + wallet (%s) will be + used if no wallet was specified, use ENV 'WALLET_NAME' + to update default wallet file name, and 'WALLET_DIR' to update + the default wallet directory`, cfg.FullWalletPath()), + OnUsageError: onCommandUsageError(name), + Action: getWalletOutputsCmd, + } +} + +func addressOutputsCmd() gcli.Command { + name := "addressOutputs" + return gcli.Command{ + Name: name, + Usage: "Display outputs of specific addresses", + ArgsUsage: "[address list]", + Description: `Display outputs of specific addresses, join multiple addresses with space, + example: addressOutputs $addr1 $addr2 $addr3`, + OnUsageError: onCommandUsageError(name), + Action: getAddressOutputsCmd, + } + +} + +func getWalletOutputsCmd(c *gcli.Context) error { + cfg := ConfigFromContext(c) + rpcClient := RPCClientFromContext(c) + + w := "" + if c.NArg() > 0 { + w = c.Args().First() + } + + var err error + w, err = resolveWalletPath(cfg, w) + if err != nil { + return err + } + + outputs, err := GetWalletOutputsFromFile(rpcClient, w) + if err != nil { + return err + } + + return printJSON(outputs) +} + +func getAddressOutputsCmd(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + + addrs := make([]string, c.NArg()) + var err error + for i := 0; i < c.NArg(); i++ { + addrs[i] = c.Args().Get(i) + if _, err = cipher.DecodeBase58Address(addrs[i]); err != nil { + return fmt.Errorf("invalid address: %v, err: %v", addrs[i], err) + } + } + + outputs, err := rpcClient.GetUnspentOutputs(addrs) + if err != nil { + return err + } + + return printJSON(outputs) +} + +// PUBLIC + +// GetWalletOutputsFromFile returns unspent outputs associated with all addresses in a wallet file +func GetWalletOutputsFromFile(c *webrpc.Client, walletFile string) (*webrpc.OutputsResult, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return nil, err + } + + return GetWalletOutputs(c, wlt) +} + +// GetWalletOutputs returns unspent outputs associated with all addresses in a wallet.Wallet +func GetWalletOutputs(c *webrpc.Client, wlt *wallet.Wallet) (*webrpc.OutputsResult, error) { + cipherAddrs := wlt.GetAddresses() + addrs := make([]string, len(cipherAddrs)) + for i := range cipherAddrs { + addrs[i] = cipherAddrs[i].String() + } + + return c.GetUnspentOutputs(addrs) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/send.go b/vendor/github.com/skycoin/skycoin/src/cli/send.go new file mode 100755 index 0000000..408d67e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/send.go @@ -0,0 +1,82 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" +) + +func sendCmd() gcli.Command { + name := "send" + return gcli.Command{ + Name: name, + Usage: "Send skycoin from a wallet or an address to a recipient address", + ArgsUsage: "[to address] [amount]", + Description: ` + Note: the [amount] argument is the coins you will spend, 1 coins = 1e6 droplets. + + If you are sending from a wallet the coins will be taken recursively from all + addresses within the wallet starting with the first address until the amount of + the transaction is met. + + Use caution when using the “-p” command. If you have command history enabled + your wallet encryption password can be recovered from the history log. + If you do not include the “-p” option you will be prompted to enter your password + after you enter your command.`, + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f", + Usage: "[wallet file or path] From wallet. If no path is specified your default wallet path will be used.", + }, + gcli.StringFlag{ + Name: "a", + Usage: "[address] From address", + }, + gcli.StringFlag{ + Name: "c", + Usage: `[changeAddress] Specify change address, by default the from address or + the wallet's coinbase address will be used`, + }, + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password", + }, + gcli.StringFlag{ + Name: "m", + Usage: `[send to many] use JSON string to set multiple recive addresses and coins, + example: -m '[{"addr":"$addr1", "coins": "10.2"}, {"addr":"$addr2", "coins": "20"}]'`, + }, + gcli.BoolFlag{ + Name: "json,j", + Usage: "Returns the results in JSON format.", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + + rawtx, err := createRawTxCmdHandler(c) + if err != nil { + errorWithHelp(c, err) + return nil + } + + txid, err := rpcClient.InjectTransaction(rawtx) + if err != nil { + return err + } + + jsonFmt := c.Bool("json") + if jsonFmt { + return printJSON(struct { + Txid string `json:"txid"` + }{ + Txid: txid, + }) + } + + fmt.Printf("txid:%s\n", txid) + return nil + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go b/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go new file mode 100755 index 0000000..480e285 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/show_seed.go @@ -0,0 +1,111 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/wallet" +) + +func showSeedCmd(cfg Config) gcli.Command { + name := "showSeed" + return gcli.Command{ + Name: name, + Usage: "Show wallet seed", + Description: fmt.Sprintf(` + The default wallet (%s) will be + used if no wallet was specified. + + Use caution when using the "-p" command. If you have command history enabled + your wallet encryption password can be recovered from the history log. If you + do not include the "-p" option you will be prompted to enter your password + after you enter your command.`, cfg.FullWalletPath()), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "p", + Usage: "[password] Wallet password, if encrypted", + }, + gcli.BoolFlag{ + Name: "j,json", + Usage: "Returns the results in JSON format", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + + w, err := resolveWalletPath(cfg, "") + if err != nil { + return err + } + + pr := NewPasswordReader([]byte(c.String("p"))) + seed, err := getSeed(w, pr) + switch err.(type) { + case nil: + case WalletLoadError: + errorWithHelp(c, err) + return nil + default: + return err + } + + if c.Bool("j") { + v := struct { + Seed string `json:"seed"` + }{ + Seed: seed, + } + + printJSON(v) + return nil + } + + fmt.Println(seed) + return nil + }, + } +} + +func getSeed(walletFile string, pr PasswordReader) (string, error) { + wlt, err := wallet.Load(walletFile) + if err != nil { + return "", WalletLoadError{err} + } + + switch pr.(type) { + case nil: + if wlt.IsEncrypted() { + return "", wallet.ErrWalletEncrypted + } + case PasswordFromBytes: + p, err := pr.Password() + if err != nil { + return "", err + } + + if !wlt.IsEncrypted() && len(p) != 0 { + return "", wallet.ErrWalletNotEncrypted + } + } + + if !wlt.IsEncrypted() { + return wlt.Meta["seed"], nil + } + + password, err := pr.Password() + if err != nil { + return "", err + } + + var seed string + if err := wlt.GuardView(password, func(w *wallet.Wallet) error { + seed = w.Meta["seed"] + return nil + }); err != nil { + return "", err + } + + return seed, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/status.go b/vendor/github.com/skycoin/skycoin/src/cli/status.go new file mode 100755 index 0000000..219fd02 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/status.go @@ -0,0 +1,53 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/api/webrpc" +) + +// StatusResult is printed by cli status command +type StatusResult struct { + webrpc.StatusResult + RPCAddress string `json:"webrpc_address"` + UseCSRF bool `json:"use_csrf"` +} + +func statusCmd() gcli.Command { + name := "status" + return gcli.Command{ + Name: name, + Usage: "Check the status of current skycoin node", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + rpcClient := RPCClientFromContext(c) + status, err := rpcClient.GetStatus() + if err != nil { + return err + } + + cfg := ConfigFromContext(c) + + return printJSON(StatusResult{ + StatusResult: *status, + RPCAddress: cfg.RPCAddress, + UseCSRF: cfg.UseCSRF, + }) + }, + } +} + +func showConfigCmd() gcli.Command { + name := "showConfig" + return gcli.Command{ + Name: name, + Usage: "Show cli configuration", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + return printJSON(cfg) + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/transaction.go b/vendor/github.com/skycoin/skycoin/src/cli/transaction.go new file mode 100755 index 0000000..d69ab06 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/transaction.go @@ -0,0 +1,82 @@ +package cli + +import ( + "encoding/hex" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor" + + gcli "github.com/urfave/cli" +) + +func transactionCmd() gcli.Command { + name := "transaction" + return gcli.Command{ + Name: name, + Usage: "Show detail info of specific transaction", + ArgsUsage: "[transaction id]", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + txid := c.Args().First() + if txid == "" { + return errors.New("txid is empty") + } + + // validate the txid + _, err := cipher.SHA256FromHex(txid) + if err != nil { + return errors.New("invalid txid") + } + + rpcClient := RPCClientFromContext(c) + + tx, err := rpcClient.GetTransactionByID(txid) + if err != nil { + return err + } + + return printJSON(tx) + }, + } +} + +func decodeRawTxCmd() gcli.Command { + name := "decodeRawTransaction" + return gcli.Command{ + Name: name, + Usage: "Decode raw transaction", + ArgsUsage: "[raw transaction]", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + rawTxStr := c.Args().First() + if rawTxStr == "" { + errorWithHelp(c, errors.New("missing raw transaction value")) + return nil + } + + b, err := hex.DecodeString(rawTxStr) + if err != nil { + fmt.Printf("invalid raw transaction: %v\n", err) + return err + } + + tx, err := coin.TransactionDeserialize(b) + if err != nil { + fmt.Printf("Unable to deserialize transaction bytes: %v\n", err) + return err + } + + txStr, err := visor.TransactionToJSON(tx) + if err != nil { + fmt.Println(err) + return err + } + + fmt.Println(txStr) + return nil + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go b/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go new file mode 100755 index 0000000..db03202 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/verify_address.go @@ -0,0 +1,22 @@ +package cli + +import ( + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/cipher" +) + +func verifyAddressCmd() gcli.Command { + name := "verifyAddress" + return gcli.Command{ + Name: name, + Usage: "Verify a skycoin address", + ArgsUsage: "[skycoin address]", + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + skyAddr := c.Args().First() + _, err := cipher.DecodeBase58Address(skyAddr) + return err + }, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/version.go b/vendor/github.com/skycoin/skycoin/src/cli/version.go new file mode 100755 index 0000000..6732277 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/version.go @@ -0,0 +1,51 @@ +package cli + +import ( + "fmt" + "reflect" + + gcli "github.com/urfave/cli" +) + +func versionCmd() gcli.Command { + name := "version" + return gcli.Command{ + Name: name, + ArgsUsage: "List the current version of Skycoin components", + Usage: " ", + Flags: []gcli.Flag{ + gcli.BoolFlag{ + Name: "json,j", + Usage: "Returns the results in JSON format", + }, + }, + OnUsageError: onCommandUsageError(name), + Action: func(c *gcli.Context) error { + var ver = struct { + Skycoin string `json:"skycoin"` + Cli string `json:"cli"` + RPC string `json:"rpc"` + Wallet string `json:"wallet"` + }{ + Version, + Version, + Version, + Version, + } + + jsonFmt := c.Bool("json") + if jsonFmt { + return printJSON(ver) + } + + v := reflect.ValueOf(ver) + t := reflect.TypeOf(ver) + for i := 0; i < v.NumField(); i++ { + fmt.Printf("%s:%v\n", t.Field(i).Tag.Get("json"), v.Field(i).Interface()) + } + + return nil + }, + } + // Commands = append(Commands, cmd) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/wallet_dir.go b/vendor/github.com/skycoin/skycoin/src/cli/wallet_dir.go new file mode 100755 index 0000000..38fba7c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/wallet_dir.go @@ -0,0 +1,38 @@ +package cli + +import ( + "fmt" + + gcli "github.com/urfave/cli" +) + +func walletDirCmd() gcli.Command { + name := "walletDir" + return gcli.Command{ + Name: name, + Usage: "Displays wallet folder address", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.BoolFlag{ + Name: "j,json", + Usage: "Returns the results in JSON format.", + }, + }, + Action: func(c *gcli.Context) error { + cfg := ConfigFromContext(c) + jsonFmt := c.Bool("json") + if jsonFmt { + return printJSON(struct { + WltDir string `json:"walletDir"` + }{ + WltDir: cfg.WalletDir, + }) + } + + fmt.Println(cfg.WalletDir) + return nil + }, + } + // Commands = append(Commands, cmd) +} diff --git a/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go b/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go new file mode 100755 index 0000000..5d002cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/cli/wallet_history.go @@ -0,0 +1,258 @@ +package cli + +import ( + "errors" + "fmt" + + "time" + + "sort" + + gcli "github.com/urfave/cli" + + "github.com/skycoin/skycoin/src/api/webrpc" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/wallet" +) + +// AddrHistory represents a transactional event for an address +type AddrHistory struct { + BlockSeq uint64 `json:"-"` + Txid string `json:"txid"` + Address string `json:"address"` + Amount string `json:"amount"` + Timestamp time.Time `json:"timestamp"` + Status int `json:"status"` + + coins uint64 +} + +type byTime []AddrHistory + +func (obt byTime) Less(i, j int) bool { + return obt[i].Timestamp.Unix() < obt[j].Timestamp.Unix() +} + +func (obt byTime) Swap(i, j int) { + obt[i], obt[j] = obt[j], obt[i] +} + +func (obt byTime) Len() int { + return len(obt) +} + +func walletHisCmd() gcli.Command { + name := "walletHistory" + return gcli.Command{ + Name: name, + Usage: "Display the transaction history of specific wallet. Requires skycoin node rpc.", + ArgsUsage: " ", + OnUsageError: onCommandUsageError(name), + Flags: []gcli.Flag{ + gcli.StringFlag{ + Name: "f", + Usage: "[wallet file or path] From wallet. If no path is specified your default wallet path will be used.", + }, + }, + Action: walletHistoryAction, + } +} + +func walletHistoryAction(c *gcli.Context) error { + cfg := ConfigFromContext(c) + rpcClient := RPCClientFromContext(c) + + if c.NArg() > 0 { + fmt.Printf("Error: invalid argument\n\n") + gcli.ShowSubcommandHelp(c) + return nil + } + + w, err := resolveWalletPath(cfg, c.String("f")) + if err != nil { + return err + } + + // get all addresses in the wallet. + addrs, err := getAddresses(w) + if err != nil { + return err + } + + if len(addrs) == 0 { + return errors.New("Wallet is empty") + } + + // get all the addresses affected uxouts + uxouts, err := rpcClient.GetAddressUxOuts(addrs) + if err != nil { + return err + } + + // transmute the uxout to addrHistory, and sort the items by time in ascend order. + totalAddrHis := []AddrHistory{} + for _, ux := range uxouts { + addrHis, err := makeAddrHisArray(rpcClient, ux) + if err != nil { + return err + } + totalAddrHis = append(totalAddrHis, addrHis...) + } + + sort.Sort(byTime(totalAddrHis)) + + // print the addr history + return printJSON(totalAddrHis) +} + +func makeAddrHisArray(c *webrpc.Client, ux webrpc.AddrUxoutResult) ([]AddrHistory, error) { + if len(ux.UxOuts) == 0 { + return nil, nil + } + + var addrHis, spentHis, realHis []AddrHistory + var spentBlkSeqMap = map[uint64]bool{} + + for _, u := range ux.UxOuts { + amount, err := droplet.ToString(u.Coins) + if err != nil { + return nil, err + } + + addrHis = append(addrHis, AddrHistory{ + BlockSeq: u.SrcBkSeq, + Txid: u.SrcTx, + Address: ux.Address, + Amount: amount, + Timestamp: time.Unix(int64(u.Time), 0).UTC(), + Status: 1, + coins: u.Coins, + }) + + // the SpentBlockSeq will be 0 if the uxout has not been spent yet. + if u.SpentBlockSeq != 0 { + spentBlkSeqMap[u.SpentBlockSeq] = true + spentHis = append(spentHis, AddrHistory{ + BlockSeq: u.SpentBlockSeq, + Address: ux.Address, + Txid: u.SpentTxID, + Amount: "-" + amount, + Status: 1, + coins: u.Coins, + }) + } + } + + if len(spentBlkSeqMap) > 0 { + spentBlkSeq := make([]uint64, 0, len(spentBlkSeqMap)) + for seq := range spentBlkSeqMap { + spentBlkSeq = append(spentBlkSeq, seq) + } + + getBlkTime, err := createBlkTimeFinder(c, spentBlkSeq) + if err != nil { + return nil, err + } + + for i, his := range spentHis { + spentHis[i].Timestamp = time.Unix(getBlkTime(his.BlockSeq), 0).UTC() + } + } + + type historyRecord struct { + received []AddrHistory + spent []AddrHistory + } + + // merge history in the same transaction. + hisMap := map[string]historyRecord{} + for _, his := range addrHis { + hr := hisMap[his.Txid] + hr.received = append(hr.received, his) + hisMap[his.Txid] = hr + } + for _, his := range spentHis { + hr := hisMap[his.Txid] + hr.spent = append(hr.spent, his) + hisMap[his.Txid] = hr + } + + for txid, hs := range hisMap { + var receivedCoins, spentCoins, coins uint64 + for _, h := range hs.received { + receivedCoins += h.coins + } + for _, h := range hs.spent { + spentCoins += h.coins + } + + isNegative := spentCoins > receivedCoins + + if spentCoins > receivedCoins { + coins = spentCoins - receivedCoins + } else { + coins = receivedCoins - spentCoins + } + + amount, err := droplet.ToString(coins) + if err != nil { + return nil, err + } + + if isNegative { + amount = "-" + amount + } + + var his AddrHistory + if len(hs.received) > 0 { + his = hs.received[0] + } else { + his = hs.spent[0] + } + + realHis = append(realHis, AddrHistory{ + BlockSeq: his.BlockSeq, + Txid: txid, + Address: ux.Address, + Amount: amount, + Timestamp: his.Timestamp, + Status: 1, + }) + } + + return realHis, nil +} + +func createBlkTimeFinder(c *webrpc.Client, ss []uint64) (func(uint64) int64, error) { + // get spent blocks + blks, err := c.GetBlocksBySeq(ss) + if err != nil { + return nil, err + } + + if len(blks.Blocks) == 0 { + return nil, fmt.Errorf("found no block") + } + + return func(seq uint64) int64 { + for _, b := range blks.Blocks { + if seq == b.Head.BkSeq { + return int64(b.Head.Time) + } + } + panic("block not found") + }, nil +} + +func getAddresses(f string) ([]string, error) { + wlt, err := wallet.Load(f) + if err != nil { + return nil, err + } + + addrs := make([]string, len(wlt.Entries)) + for i, entry := range wlt.Entries { + addrs[i] = entry.Address.String() + } + return addrs, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/block.go b/vendor/github.com/skycoin/skycoin/src/coin/block.go new file mode 100755 index 0000000..d40a5c7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/block.go @@ -0,0 +1,250 @@ +package coin + +import ( + "fmt" + "log" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// Block represents the block struct +type Block struct { + Head BlockHeader + Body BlockBody +} + +// HashPair including current block hash and previous block hash. +type HashPair struct { + Hash cipher.SHA256 + PreHash cipher.SHA256 +} + +// BlockHeader records the block header +type BlockHeader struct { + Version uint32 + + Time uint64 + BkSeq uint64 // Increment every block + Fee uint64 // Fee in block + + PrevHash cipher.SHA256 // Hash of header of previous block + BodyHash cipher.SHA256 // Hash of transaction block + + UxHash cipher.SHA256 // XOR of sha256 of elements in unspent output set +} + +// BlockBody represents the block body +type BlockBody struct { + Transactions Transactions +} + +// SignedBlock signed block +type SignedBlock struct { + Block + Sig cipher.Sig +} + +// VerifySignature verifies that the block is signed by pubkey +func (b SignedBlock) VerifySignature(pubkey cipher.PubKey) error { + return cipher.VerifySignature(pubkey, b.Sig, b.Block.HashHeader()) +} + +// NewBlock creates new block. +func NewBlock(prev Block, currentTime uint64, uxHash cipher.SHA256, txns Transactions, calc FeeCalculator) (*Block, error) { + if len(txns) == 0 { + return nil, fmt.Errorf("Refusing to create block with no transactions") + } + + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + return nil, fmt.Errorf("Invalid transaction fees: %v", err) + } + + body := BlockBody{txns} + return &Block{ + Head: NewBlockHeader(prev.Head, uxHash, currentTime, fee, body), + Body: body, + }, nil +} + +// NewGenesisBlock creates genesis block +func NewGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) (*Block, error) { + txn := Transaction{} + txn.PushOutput(genesisAddr, genesisCoins, genesisCoins) + body := BlockBody{Transactions: Transactions{txn}} + prevHash := cipher.SHA256{} + head := BlockHeader{ + Time: timestamp, + BodyHash: body.Hash(), + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := &Block{ + Head: head, + Body: body, + } + + return b, nil +} + +// HashHeader return hash of block head. +func (b Block) HashHeader() cipher.SHA256 { + return b.Head.Hash() +} + +// PreHashHeader return hash of prevous block. +func (b Block) PreHashHeader() cipher.SHA256 { + return b.Head.PrevHash +} + +// Time return the head time of the block. +func (b Block) Time() uint64 { + return b.Head.Time +} + +// Seq return the head seq of the block. +func (b Block) Seq() uint64 { + return b.Head.BkSeq +} + +// HashBody return hash of block body. +func (b Block) HashBody() cipher.SHA256 { + return b.Body.Hash() +} + +// Size returns the size of the Block's Transactions, in bytes +func (b Block) Size() int { + return b.Body.Size() +} + +// String return readable string of block. +func (b Block) String() string { + return b.Head.String() +} + +// GetTransaction looks up a Transaction by its Head.Hash. +// Returns the Transaction and whether it was found or not +// TODO -- build a private index on the block, or a global blockchain one +// mapping txns to their block + tx index +// TODO: Deprecate? Utility Function +func (b Block) GetTransaction(txHash cipher.SHA256) (Transaction, bool) { + txns := b.Body.Transactions + for i := range txns { + if txns[i].Hash() == txHash { + return txns[i], true + } + } + return Transaction{}, false +} + +// NewBlockHeader creates block header +func NewBlockHeader(prev BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body BlockBody) BlockHeader { + if currentTime <= prev.Time { + log.Panic("Time can only move forward") + } + prevHash := prev.Hash() + return BlockHeader{ + BodyHash: body.Hash(), + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} + +// Hash return hash of block header +func (bh BlockHeader) Hash() cipher.SHA256 { + b1 := encoder.Serialize(bh) + return cipher.SumSHA256(b1) +} + +// Bytes serialize the blockheader and return the byte value. +func (bh BlockHeader) Bytes() []byte { + return encoder.Serialize(bh) +} + +// String return readable string of block header. +func (bh BlockHeader) String() string { + return fmt.Sprintf("Version: %d\nTime: %d\nBkSeq: %d\nFee: %d\n"+ + "PrevHash: %s\nBodyHash: %s", bh.Version, bh.Time, bh.BkSeq, + bh.Fee, bh.PrevHash.Hex(), bh.BodyHash.Hex()) +} + +// Hash returns the merkle hash of contained transactions +func (bb BlockBody) Hash() cipher.SHA256 { + hashes := make([]cipher.SHA256, len(bb.Transactions)) + for i := range bb.Transactions { + hashes[i] = bb.Transactions[i].Hash() + } + // Merkle hash of transactions + return cipher.Merkle(hashes) +} + +// Size returns the size of Transactions, in bytes +func (bb BlockBody) Size() int { + // We can't use length of self.Bytes() because it has a length prefix + // Need only the sum of transaction sizes + return bb.Transactions.Size() +} + +// Bytes serialize block body, and return the byte value. +func (bb BlockBody) Bytes() []byte { + return encoder.Serialize(bb) +} + +// CreateUnspents creates the expected outputs for a transaction. +func CreateUnspents(bh BlockHeader, tx Transaction) UxArray { + var h cipher.SHA256 + if bh.BkSeq != 0 { + // not genesis block + h = tx.Hash() + } + uxo := make(UxArray, len(tx.Out)) + for i := range tx.Out { + uxo[i] = UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: tx.Out[i].Address, + Coins: tx.Out[i].Coins, + Hours: tx.Out[i].Hours, + }, + } + } + return uxo +} + +// CreateUnspent creates single unspent output +func CreateUnspent(bh BlockHeader, tx Transaction, outIndex int) (UxOut, error) { + if len(tx.Out) <= outIndex { + return UxOut{}, fmt.Errorf("Transaction out index is overflow") + } + + var h cipher.SHA256 + if bh.BkSeq != 0 { + h = tx.Hash() + } + + return UxOut{ + Head: UxHead{ + Time: bh.Time, + BkSeq: bh.BkSeq, + }, + Body: UxBody{ + SrcTransaction: h, + Address: tx.Out[outIndex].Address, + Coins: tx.Out[outIndex].Coins, + Hours: tx.Out[outIndex].Hours, + }, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/block_test.go b/vendor/github.com/skycoin/skycoin/src/coin/block_test.go new file mode 100755 index 0000000..c17aa97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/block_test.go @@ -0,0 +1,191 @@ +// build ignore + +package coin + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + + "github.com/stretchr/testify/assert" +) + +func badFeeCalc(t *Transaction) (uint64, error) { + return 0, errors.New("Bad") +} + +func makeNewBlock(uxHash cipher.SHA256) (*Block, error) { + body := BlockBody{ + Transactions: Transactions{Transaction{}}, + } + + prev := Block{ + Body: body, + Head: BlockHeader{ + Version: 0x02, + Time: 100, + BkSeq: 0, + Fee: 10, + PrevHash: cipher.SHA256{}, + BodyHash: body.Hash(), + }} + return NewBlock(prev, 100+20, uxHash, Transactions{Transaction{}}, _feeCalc) +} + +func addTransactionToBlock(t *testing.T, b *Block) Transaction { + tx := makeTransaction(t) + b.Body.Transactions = append(b.Body.Transactions, tx) + return tx +} + +func TestNewBlock(t *testing.T) { + // TODO -- update this test for newBlock changes + prev := Block{Head: BlockHeader{Version: 0x02, Time: 100, BkSeq: 98}} + uxHash := testutil.RandSHA256(t) + txns := Transactions{Transaction{}} + // invalid txn fees panics + _, err := NewBlock(prev, 133, uxHash, txns, badFeeCalc) + require.EqualError(t, err, fmt.Sprintf("Invalid transaction fees: Bad")) + + // no txns panics + _, err = NewBlock(prev, 133, uxHash, nil, _feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + _, err = NewBlock(prev, 133, uxHash, Transactions{}, _feeCalc) + require.EqualError(t, err, "Refusing to create block with no transactions") + + // valid block is fine + fee := uint64(121) + currentTime := uint64(133) + b, err := NewBlock(prev, currentTime, uxHash, txns, func(t *Transaction) (uint64, error) { + return fee, nil + }) + require.NoError(t, err) + assert.Equal(t, b.Body.Transactions, txns) + assert.Equal(t, b.Head.Fee, fee*uint64(len(txns))) + assert.Equal(t, b.Body, BlockBody{Transactions: txns}) + assert.Equal(t, b.Head.PrevHash, prev.HashHeader()) + assert.Equal(t, b.Head.Time, currentTime) + assert.Equal(t, b.Head.BkSeq, prev.Head.BkSeq+1) + assert.Equal(t, b.Head.UxHash, uxHash) +} + +func TestBlockHashHeader(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b, err := makeNewBlock(uxHash) + require.NoError(t, err) + assert.Equal(t, b.HashHeader(), b.Head.Hash()) + assert.NotEqual(t, b.HashHeader(), cipher.SHA256{}) +} + +func TestBlockHashBody(t *testing.T) { + uxHash := testutil.RandSHA256(t) + b, err := makeNewBlock(uxHash) + require.NoError(t, err) + assert.Equal(t, b.HashBody(), b.Body.Hash()) + hb := b.HashBody() + hashes := b.Body.Transactions.Hashes() + tx := addTransactionToBlock(t, b) + assert.NotEqual(t, b.HashBody(), hb) + hashes = append(hashes, tx.Hash()) + assert.Equal(t, b.HashBody(), cipher.Merkle(hashes)) + assert.Equal(t, b.HashBody(), b.Body.Hash()) +} + +func TestNewGenesisBlock(t *testing.T) { + gb, err := NewGenesisBlock(genAddress, _genCoins, _genTime) + require.NoError(t, err) + + require.Equal(t, cipher.SHA256{}, gb.Head.PrevHash) + require.Equal(t, _genTime, gb.Head.Time) + require.Equal(t, uint64(0), gb.Head.BkSeq) + require.Equal(t, uint32(0), gb.Head.Version) + require.Equal(t, uint64(0), gb.Head.Fee) + require.Equal(t, cipher.SHA256{}, gb.Head.UxHash) + + require.Equal(t, 1, len(gb.Body.Transactions)) + tx := gb.Body.Transactions[0] + require.Len(t, tx.In, 0) + require.Len(t, tx.Sigs, 0) + require.Len(t, tx.Out, 1) + + require.Equal(t, genAddress, tx.Out[0].Address) + require.Equal(t, _genCoins, tx.Out[0].Coins) + require.Equal(t, _genCoins, tx.Out[0].Hours) +} + +func TestCreateUnspent(t *testing.T) { + tx := Transaction{} + tx.PushOutput(genAddress, 11e6, 255) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + + tt := []struct { + name string + txIndex int + err error + }{ + { + "ok", + 0, + nil, + }, + { + "index overflow", + 10, + errors.New("Transaction out index is overflow"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + uxout, err := CreateUnspent(bh, tx, tc.txIndex) + require.Equal(t, tc.err, err) + if err != nil { + return + } + assertUnspent(t, bh, tx, tc.txIndex, uxout) + }) + } +} + +func TestCreateUnspents(t *testing.T) { + tx := Transaction{} + tx.PushOutput(genAddress, 11e6, 255) + bh := BlockHeader{ + Time: tNow(), + BkSeq: uint64(1), + } + uxouts := CreateUnspents(bh, tx) + assert.Equal(t, len(uxouts), 1) + assertValidUnspents(t, bh, tx, uxouts) +} + +func assertUnspent(t *testing.T, bh BlockHeader, tx Transaction, txIndex int, ux UxOut) { + assert.Equal(t, bh.Time, ux.Head.Time) + assert.Equal(t, bh.BkSeq, ux.Head.BkSeq) + assert.Equal(t, tx.Hash(), ux.Body.SrcTransaction) + assert.Equal(t, tx.Out[txIndex].Address, ux.Body.Address) + assert.Equal(t, tx.Out[txIndex].Coins, ux.Body.Coins) + assert.Equal(t, tx.Out[txIndex].Hours, ux.Body.Hours) +} + +func assertValidUnspents(t *testing.T, bh BlockHeader, tx Transaction, + uxo UxArray) { + assert.Equal(t, len(tx.Out), len(uxo)) + for i, ux := range uxo { + assert.Equal(t, bh.Time, ux.Head.Time) + assert.Equal(t, bh.BkSeq, ux.Head.BkSeq) + assert.Equal(t, tx.Hash(), ux.Body.SrcTransaction) + assert.Equal(t, tx.Out[i].Address, ux.Body.Address) + assert.Equal(t, tx.Out[i].Coins, ux.Body.Coins) + assert.Equal(t, tx.Out[i].Hours, ux.Body.Hours) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/coin_test.go b/vendor/github.com/skycoin/skycoin/src/coin/coin_test.go new file mode 100755 index 0000000..7d68430 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/coin_test.go @@ -0,0 +1,237 @@ +package coin + +import ( + "encoding/hex" + "testing" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/utc" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + _genTime uint64 = 1000 + _genCoins uint64 = 1000e6 + _genCoinHours uint64 = 1000 * 1000 +) + +func tNow() uint64 { + return uint64(utc.UnixNow()) +} + +func _feeCalc(t *Transaction) (uint64, error) { + return 0, nil +} + +func TestAddress1(t *testing.T) { + a := "02fa939957e9fc52140e180264e621c2576a1bfe781f88792fb315ca3d1786afb8" + b, err := hex.DecodeString(a) + if err != nil { + t.Fatal(err) + } + addr := cipher.AddressFromPubKey(cipher.NewPubKey(b)) + _ = addr + + ///func SignHash(hash cipher.SHA256, sec SecKey) (Sig, error) { + +} + +func TestAddress2(t *testing.T) { + a := "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d" + b, err := hex.DecodeString(a) + if err != nil { + t.Fail() + } + + if len(b) != 32 { + t.Fail() + } + + seckey := cipher.NewSecKey(b) + pubkey := cipher.PubKeyFromSecKey(seckey) + addr := cipher.AddressFromPubKey(pubkey) + _ = addr + + ///func SignHash(hash cipher.SHA256, sec SecKey) (Sig, error) { + +} + +//TODO: 100% coverage over cryptographic functions + +//Crypto Functions to Test +//func ChkSig(address Address, hash cipher.SHA256, sig Sig) error { +//func SignHash(hash cipher.SHA256, sec SecKey) (Sig, error) { +//func cipher.PubKeyFromSecKey(seckey SecKey) (PubKey) { +//func PubKeyFromSig(sig Sig, hash cipher.SHA256) (PubKey, error) { +//func VerifySignature(pubkey PubKey, sig Sig, hash cipher.SHA256) error { +//func GenerateKeyPair() (PubKey, SecKey) { +//func GenerateDeterministicKeyPair(seed []byte) (PubKey, SecKey) { +//func testSecKey(seckey SecKey) error { + +func TestCrypto1(t *testing.T) { + for i := 0; i < 10; i++ { + _, seckey := cipher.GenerateKeyPair() + if cipher.TestSecKey(seckey) != nil { + t.Fatal("CRYPTOGRAPHIC INTEGRITY CHECK FAILED") + } + } +} + +//test signatures +func TestCrypto2(t *testing.T) { + a := "5a42c0643bdb465d90bf673b99c14f5fa02db71513249d904573d2b8b63d353d" + b, err := hex.DecodeString(a) + if err != nil { + t.Fatal(err) + } + + if len(b) != 32 { + t.Fatal() + } + + seckey := cipher.NewSecKey(b) + pubkey := cipher.PubKeyFromSecKey(seckey) + + addr := cipher.AddressFromPubKey(pubkey) + _ = addr + + test := []byte("test message") + hash := cipher.SumSHA256(test) + err = cipher.TestSecKeyHash(seckey, hash) + if err != nil { + t.Fatal() + } + +} + +/* +TODO: check block header of new block +TODO: check that coins are not created or destroyed +TODO: +*/ + +//create 4096 addresses +//send addreses randomly between each other over 1024 blocks + +/* +func TestBlockchain1(t *testing.T) { + + var S []SecKey + for i := 0; i < 4096; i++ { + S = append(S, _gensec()) + } + + A := _gaddr_a1(S) + + var bc *Blockchain = NewBlockchain(A[0]) + + for i := 0; i < 1024; i++ { + b := bc.NewBlock() + + //unspent outputs + U := make([]UxOut, len(bc.Unspent)) + copy(U, bc.Unspent) + + //for _,Ux := range U { + // if Ux.Hours() < Ux.Body. + //} + //I := _gaddr_a2(S,U) + M := _gaddr_a3(S, U) + var num_in int = 1 + rand.Intn(len(U))%15 + var num_out int = 1 + rand.Int()%30 + + var t Transaction + + SigIdx := make([]int, num_in) + + var v1 uint64 = 0 + var v2 uint64 = 0 + for i := 0; i < num_in; i++ { + idx := rand.Intn(len(U)) + var Ux UxOut = U[idx] //unspent output to spend + U[idx], U = U[len(U)-1], U[:len(U)-1] //remove output idx + + v1 += Ux.Body.Coins + v2 += Ux.Body.Hours + + //index of signature that must sign input + SigIdx[i] = M[Ux.Body.Address] //signature index + + var ti TransactionInput + ti.SigIdx = uint16(i) + ti.UxOut = Ux.Hash() + t.TxIn = append(t.TxIn, ti) //append input to transaction + } + + //assign coins to output addresses in random manner + + //check that inputs/outputs sum + v1_ := v1 + v2_ := v2 + + vo1 := _rand_bins(v1, num_out) + vo2 := _rand_bins(v2, num_out) + + var v1_t uint64 + var v2_t uint64 + for i, _ := range vo1 { + v1_t += vo1[i] + v2_t += vo2[i] + } + + if v1_t != v1_ { + log.Panic() + } + if v2_t != v2_ { + log.Panic() + } + //log.Printf("%v %v, %v %v \n", v1_,v2_, v1_t, v2_t) + + for i := 0; i < num_out; i++ { + var to TransactionOutput + to.Address = A[rand.Intn(len(A))] + to.Coins = vo1[i] + to.Hours = vo2[i] + t.TxOut = append(t.TxOut, to) + } + + //transaction complete, now set signatures + for i := 0; i < num_in; i++ { + t.SetSig(uint16(i), S[SigIdx[i]]) + } + t.UpdateHeader() //sets hash + + err := bc.AppendTransaction(&b, t) + if err != nil { + log.Panic(err) + } + + fmt.Printf("Block %v \n", i) + err = bc.ExecuteBlock(b) + if err != nil { + log.Panic(err) + } + + } +} +*/ + +/* +func TestGetListenPort(t *testing.T) { + // No connectionMirror found + assert.Equal(t, getListenPort(addr), uint16(0)) + // No mirrorConnection map exists + ConnectionMirrors[addr] = uint32(4) + assert.Panics(t, func() { getListenPort(addr) }) + // Everything is good + m := make(map[string]uint16) + mirrorConnections[uint32(4)] = m + m[addrIP] = uint16(6667) + assert.Equal(t, getListenPort(addr), uint16(6667)) + + // cleanup + delete(mirrorConnections, uint32(4)) + delete(ConnectionMirrors, addr) +} +*/ diff --git a/vendor/github.com/skycoin/skycoin/src/coin/math.go b/vendor/github.com/skycoin/skycoin/src/coin/math.go new file mode 100755 index 0000000..0060dc1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/math.go @@ -0,0 +1,58 @@ +package coin + +import "errors" + +var ( + // ErrUint64MultOverflow is returned when multiplying uint64 values would overflow uint64 + ErrUint64MultOverflow = errors.New("uint64 multiplication overflow") + // ErrUint64AddOverflow is returned when adding uint64 values would overflow uint64 + ErrUint64AddOverflow = errors.New("uint64 addition overflow") + // ErrUint32AddOverflow is returned when adding uint32 values would overflow uint32 + ErrUint32AddOverflow = errors.New("uint32 addition overflow") + // ErrUint64OverflowsInt64 is returned when converting a uint64 to an int64 would overflow int64 + ErrUint64OverflowsInt64 = errors.New("uint64 overflows int64") + // ErrInt64UnderflowsUint64 is returned when converting an int64 to a uint64 would underflow uint64 + ErrInt64UnderflowsUint64 = errors.New("int64 underflows uint64") +) + +func multUint64(a, b uint64) (uint64, error) { + c := a * b + if a != 0 && c/a != b { + return 0, ErrUint64MultOverflow + } + return c, nil +} + +// AddUint64 adds a and b, returning an error if the values would overflow +func AddUint64(a, b uint64) (uint64, error) { + c := a + b + if c < a || c < b { + return 0, ErrUint64AddOverflow + } + return c, nil +} + +func addUint32(a, b uint32) (uint32, error) { //nolint: deadcode + c := a + b + if c < a || c < b { + return 0, ErrUint32AddOverflow + } + return c, nil +} + +// Uint64ToInt64 converts a uint64 to an int64, returning an error if the uint64 value overflows int64 +func Uint64ToInt64(a uint64) (int64, error) { + b := int64(a) + if b < 0 { + return 0, ErrUint64OverflowsInt64 + } + return b, nil +} + +// Int64ToUint64 converts an int64 to a uint64, returning an error if the int64 value underflows uint64 +func Int64ToUint64(a int64) (uint64, error) { + if a < 0 { + return 0, ErrInt64UnderflowsUint64 + } + return uint64(a), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/math_test.go b/vendor/github.com/skycoin/skycoin/src/coin/math_test.go new file mode 100755 index 0000000..c628b4a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/math_test.go @@ -0,0 +1,116 @@ +package coin + +import ( + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAddUint64(t *testing.T) { + n, err := AddUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(21), n) + + _, err = AddUint64(math.MaxUint64, 1) + require.Error(t, err) +} + +func TestAddUint32(t *testing.T) { + n, err := addUint32(10, 11) + require.NoError(t, err) + require.Equal(t, uint32(21), n) + + _, err = addUint32(math.MaxUint32, 1) + require.Error(t, err) +} + +func TestMultUint64(t *testing.T) { + n, err := multUint64(10, 11) + require.NoError(t, err) + require.Equal(t, uint64(110), n) + + _, err = multUint64(math.MaxUint64/2, 3) + require.Error(t, err) +} + +func TestUint64ToInt64(t *testing.T) { + cases := []struct { + a uint64 + b int64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: math.MaxUint64, + err: ErrUint64OverflowsInt64, + }, + { + a: math.MaxInt64 + 1, + err: ErrUint64OverflowsInt64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Uint64ToInt64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} + +func TestInt64ToUint64(t *testing.T) { + cases := []struct { + a int64 + b uint64 + err error + }{ + { + a: 0, + b: 0, + }, + { + a: 1, + b: 1, + }, + { + a: math.MaxInt64, + b: math.MaxInt64, + }, + { + a: -math.MaxInt64, + err: ErrInt64UnderflowsUint64, + }, + { + a: -1, + err: ErrInt64UnderflowsUint64, + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.a), func(t *testing.T) { + x, err := Int64ToUint64(tc.a) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.Equal(t, tc.b, x) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/outputs.go b/vendor/github.com/skycoin/skycoin/src/coin/outputs.go new file mode 100755 index 0000000..70340ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/outputs.go @@ -0,0 +1,312 @@ +package coin + +import ( + "bytes" + "errors" + "fmt" + "log" + "sort" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +/* + Unspent Outputs +*/ + +/* +- hash must only depend on factors known to sender +-- hash cannot depend on block executed +-- hash cannot depend on sequence number +-- hash may depend on nonce + +- hash must depend only on factors known to sender +-- needed to minimize divergence during block chain forks +- it should be difficult to create outputs with duplicate ids + +- Uxhash cannot depend on time or block it was created +- time is still needed for +*/ + +/* + For each transaction, keep track of + - order created + - order spent (for rollbacks) +*/ + +// UxOut represents uxout +type UxOut struct { + Head UxHead + Body UxBody //hashed part + //Meta UxMeta +} + +// UxHead metadata (not hashed) +type UxHead struct { + Time uint64 //time of block it was created in + BkSeq uint64 //block it was created in, used to calculate depth + // SpSeq uint64 //block it was spent in +} + +// UxBody uxbody +type UxBody struct { + SrcTransaction cipher.SHA256 // Inner Hash of Transaction + Address cipher.Address // Address of receiver + Coins uint64 // Number of coins + Hours uint64 // Coin hours +} + +// Hash returns the hash of UxBody +func (uo *UxOut) Hash() cipher.SHA256 { + return uo.Body.Hash() +} + +// SnapshotHash returns hash of UxBody + UxHead +func (uo *UxOut) SnapshotHash() cipher.SHA256 { + b1 := encoder.Serialize(uo.Body) //body + b2 := encoder.Serialize(uo.Head) //time, bkseq + b3 := append(b1, b2...) + return cipher.SumSHA256(b3) +} + +// Hash returns hash of uxbody +func (ub *UxBody) Hash() cipher.SHA256 { + return cipher.SumSHA256(encoder.Serialize(ub)) +} + +/* + Make independent of block rate? + Then need creation time of output + Creation time of transaction cant be hashed +*/ + +// ErrAddEarnedCoinHoursAdditionOverflow is returned by UxOut.CoinHours() if during the addition of base coin +// hours to additional earned coin hours, the value would overflow a uint64. +// Callers may choose to ignore this errors and use 0 as the coinhours value instead. +// This affects one existing spent output, spent in block 13277. +var ErrAddEarnedCoinHoursAdditionOverflow = errors.New("UxOut.CoinHours addition of earned coin hours overflow") + +// CoinHours Calculate coinhour balance of output. t is the current unix utc time. +func (uo *UxOut) CoinHours(t uint64) (uint64, error) { + if t < uo.Head.Time { + log.Printf("Calculating coin hours with t < head time") + return uo.Body.Hours, nil + } + + seconds := t - uo.Head.Time // number of seconds + + // Calculate whole coin seconds + wholeCoins := uo.Body.Coins / 1e6 + wholeCoinSeconds, err := multUint64(seconds, wholeCoins) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=%d coins=%d uxid=%s", seconds, wholeCoins, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Calculate remainder droplet seconds + remainderDroplets := uo.Body.Coins % 1e6 + dropletSeconds, err := multUint64(seconds, remainderDroplets) + if err != nil { + err := fmt.Errorf("UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=%d droplets=%d uxid=%s", seconds, remainderDroplets, uo.Hash().Hex()) + log.Printf("%v", err) + return 0, err + } + + // Add coinSeconds and seconds earned by droplets, rounded off + coinSeconds := wholeCoinSeconds + dropletSeconds/1e6 + + coinHours := coinSeconds / 3600 // coin hours + totalHours, err := AddUint64(uo.Body.Hours, coinHours) // starting+earned + if err != nil { + log.Printf("%v uxid=%s", ErrAddEarnedCoinHoursAdditionOverflow, uo.Hash().Hex()) + return 0, ErrAddEarnedCoinHoursAdditionOverflow + } + return totalHours, nil +} + +// UxHashSet set mapping from UxHash to a placeholder value +type UxHashSet map[cipher.SHA256]struct{} + +// UxArray Array of Outputs +// Used by unspent output pool, spent tests +type UxArray []UxOut + +// Hashes returns Array of hashes for the Ux in the UxArray +func (ua UxArray) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(ua)) + for i, ux := range ua { + hashes[i] = ux.Hash() + } + return hashes +} + +// HasDupes checks the UxArray for outputs which have the same hash +func (ua UxArray) HasDupes() bool { + m := make(UxHashSet, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; ok { + return true + } + m[h] = struct{}{} + } + return false +} + +// Set returns the UxArray as a hash to struct{} map to be used as a set. +// Should only be used for membership detection +func (ua UxArray) Set() UxHashSet { + m := make(UxHashSet, len(ua)) + for i := range ua { + m[ua[i].Hash()] = struct{}{} + } + return m +} + +// Sort sorts UxArray +func (ua UxArray) Sort() { + sort.Sort(ua) +} + +// Len returns length of UxArray +func (ua UxArray) Len() int { + return len(ua) +} + +// Less checks if UxArray[i] < UxArray[j] +func (ua UxArray) Less(i, j int) bool { + hash1 := ua[i].Hash() + hash2 := ua[j].Hash() + return bytes.Compare(hash1[:], hash2[:]) < 0 +} + +// Swap swaps value of UxArray[i] and UxArray[j] +func (ua UxArray) Swap(i, j int) { + ua[i], ua[j] = ua[j], ua[i] +} + +// Coins returns the total coins +func (ua UxArray) Coins() (uint64, error) { + var coins uint64 + for _, ux := range ua { + var err error + coins, err = AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, errors.New("UxArray.Coins addition overflow") + } + } + + return coins, nil +} + +// CoinHours returns the total coin hours +func (ua UxArray) CoinHours(headTime uint64) (uint64, error) { + var hours uint64 + for _, ux := range ua { + uxHours, err := ux.CoinHours(headTime) + if err != nil { + return 0, err + } + + hours, err = AddUint64(hours, uxHours) + if err != nil { + return 0, errors.New("UxArray.CoinHours addition overflow") + } + } + return hours, nil +} + +// AddressUxOuts maps address with uxarray +type AddressUxOuts map[cipher.Address]UxArray + +// NewAddressUxOuts creates address uxouts map +func NewAddressUxOuts(uxs UxArray) AddressUxOuts { + uxo := make(AddressUxOuts) + for _, ux := range uxs { + uxo[ux.Body.Address] = append(uxo[ux.Body.Address], ux) + } + return uxo +} + +// Keys returns the Address keys +func (auo AddressUxOuts) Keys() []cipher.Address { + addrs := make([]cipher.Address, len(auo)) + i := 0 + for k := range auo { + addrs[i] = k + i++ + } + return addrs +} + +// Flatten converts an AddressUxOuts map to a UxArray +func (auo AddressUxOuts) Flatten() UxArray { + oxs := make(UxArray, 0, len(auo)) + for _, uxs := range auo { + for i := range uxs { + oxs = append(oxs, uxs[i]) + } + } + return oxs +} + +// Sub returns a new set of unspents, with unspents found in other removed. +// No address's unspent set will be empty +// Depreciate this: only visor uses it +func (auo AddressUxOuts) Sub(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, uxs := range auo { + if suxs, ok := other[a]; ok { + ouxs := uxs.Sub(suxs) + if len(ouxs) > 0 { + ox[a] = ouxs + } + } else { + ox[a] = uxs + } + } + return ox +} + +// Add returns a new unspents, with merged unspents +func (auo AddressUxOuts) Add(other AddressUxOuts) AddressUxOuts { + ox := make(AddressUxOuts, len(auo)) + for a, o := range auo { + ox[a] = o + } + + for a, uxs := range other { + if suxs, ok := ox[a]; ok { + ox[a] = suxs.Add(uxs) + } else { + ox[a] = uxs + } + } + return ox +} + +// Sub returns a new UxArray with elements in other removed from self +// Deprecate +func (ua UxArray) Sub(other UxArray) UxArray { + uxa := make(UxArray, 0) + m := other.Set() + for i := range ua { + if _, ok := m[ua[i].Hash()]; !ok { + uxa = append(uxa, ua[i]) + } + } + return uxa +} + +// Add returns a new UxArray with merged elements +func (ua UxArray) Add(other UxArray) UxArray { + m := ua.Set() + for i := range other { + if _, ok := m[other[i].Hash()]; !ok { + ua = append(ua, other[i]) + } + } + return ua +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/outputs_test.go b/vendor/github.com/skycoin/skycoin/src/coin/outputs_test.go new file mode 100755 index 0000000..ff71940 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/outputs_test.go @@ -0,0 +1,577 @@ +package coin + +import ( + "bytes" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" +) + +func makeUxBody(t *testing.T) UxBody { + body, _ := makeUxBodyWithSecret(t) + return body +} + +func makeUxOut(t *testing.T) UxOut { + ux, _ := makeUxOutWithSecret(t) + return ux +} + +func makeUxBodyWithSecret(t *testing.T) (UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return UxOut{ + Head: UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} + +func TestUxBodyHash(t *testing.T) { + uxb := makeUxBody(t) + h := uxb.Hash() + assert.NotEqual(t, h, cipher.SHA256{}) +} + +func TestUxOutHash(t *testing.T) { + uxb := makeUxBody(t) + uxo := UxOut{Body: uxb} + assert.Equal(t, uxb.Hash(), uxo.Hash()) + // Head should not affect hash + uxo.Head = UxHead{0, 1} + assert.Equal(t, uxb.Hash(), uxo.Hash()) +} + +func TestUxOutSnapshotHash(t *testing.T) { + ux := makeUxOut(t) + h := ux.SnapshotHash() + // snapshot hash should be dependent on every field in body and head + ux2 := ux + ux2.Head.Time = 20 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Head.BkSeq = 4 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.SrcTransaction = testutil.RandSHA256(t) + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Address = makeAddress() + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Coins = ux.Body.Coins * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) + ux2 = ux + ux2.Body.Hours = ux.Body.Hours * 2 + assert.NotEqual(t, ux2.SnapshotHash(), h) +} + +func TestUxOutCoinHours(t *testing.T) { + uxo := makeUxOut(t) + + // Less than 1 hour passed + now := uint64(100) + uxo.Head.Time + hours, err := uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hours passed + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)) + + // 6 hours passed + now = uint64(3600*6) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(uxo.Body.Coins/1e6)*6) + + // Time is backwards (treated as no hours passed) + now = uxo.Head.Time / 2 + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // 1 hour has passed, output has 1.5 coins, should gain 1 coinhour + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 2 hours have passed, output has 1.5 coins, should gain 3 coin hours + uxo.Body.Coins = 1e6 + 5e5 + now = uint64(3600*2) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+3, hours, "%d != %d", uxo.Body.Hours+3, hours) + + // 1 second has passed, output has 3600 coins, should gain 1 coin hour + uxo.Body.Coins = 3600e6 + now = uint64(1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours minus 1 second have passed, output has 1 droplet, should gain 0 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600-1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours, hours) + + // 1000000 hours have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // 1000000 hours plus 1 second have passed, output has 1 droplet, should gain 1 coin hour + uxo.Body.Coins = 1 + now = uint64(1000000*3600+1) + uxo.Head.Time + hours, err = uxo.CoinHours(now) + require.NoError(t, err) + require.Equal(t, uxo.Body.Hours+1, hours) + + // No hours passed, using initial coin hours + uxo.Body.Coins = _genCoins + uxo.Body.Hours = _genCoinHours + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours) + + // One hour passed, using initial coin hours + hours, err = uxo.CoinHours(uxo.Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, hours, uxo.Body.Hours+(_genCoins/1e6)) + + // No hours passed and no hours to begin with + uxo.Body.Hours = 0 + hours, err = uxo.CoinHours(uxo.Head.Time) + require.NoError(t, err) + require.Equal(t, hours, uint64(0)) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the whole coin seconds + uxo.Body.Coins = 2e6 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551515 coins=2 uxid=")) + + // Centuries have passed, time-based calculation overflows uint64 + // when calculating the droplet seconds + uxo.Body.Coins = 1e6 + 1e5 + _, err = uxo.CoinHours(math.MaxUint64) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "UxOut.CoinHours: Calculating droplet seconds overflows uint64 seconds=18446744073709551515 droplets=100000 uxid=")) + + // Output would overflow if given more hours, has reached its limit + uxo.Body.Coins = 3600e6 + uxo.Body.Hours = math.MaxUint64 - 1 + _, err = uxo.CoinHours(uxo.Head.Time + 1000) + testutil.RequireError(t, err, ErrAddEarnedCoinHoursAdditionOverflow.Error()) +} + +func makeUxArray(t *testing.T, n int) UxArray { + uxa := make(UxArray, n) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + return uxa +} + +func TestUxArrayCoins(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.Coins() + require.NoError(t, err) + require.Equal(t, uint64(4e6), n) + + uxa[2].Body.Coins = math.MaxUint64 - 1e6 + _, err = uxa.Coins() + require.Equal(t, err, errors.New("UxArray.Coins addition overflow")) +} + +func TestUxArrayCoinHours(t *testing.T) { + uxa := makeUxArray(t, 4) + + n, err := uxa.CoinHours(uxa[0].Head.Time) + require.NoError(t, err) + require.Equal(t, uint64(400), n) + + // 1 hour later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 1.5 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 1800) + require.NoError(t, err) + require.Equal(t, uint64(404), n) + + // 2 hours later + n, err = uxa.CoinHours(uxa[0].Head.Time + 3600 + 4600) + require.NoError(t, err) + require.Equal(t, uint64(408), n) + + uxa[2].Body.Hours = math.MaxUint64 - 100 + _, err = uxa.CoinHours(uxa[0].Head.Time) + require.Equal(t, errors.New("UxArray.CoinHours addition overflow"), err) + + _, err = uxa.CoinHours(uxa[0].Head.Time * 1000000000000) + require.Equal(t, ErrAddEarnedCoinHoursAdditionOverflow, err) +} + +func TestUxArrayHashArray(t *testing.T) { + uxa := makeUxArray(t, 4) + hashes := uxa.Hashes() + assert.Equal(t, len(hashes), len(uxa)) + for i, h := range hashes { + assert.Equal(t, h, uxa[i].Hash()) + } +} + +func TestUxArrayHasDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) +} + +func TestUxArrayRemoveDupes(t *testing.T) { + uxa := makeUxArray(t, 4) + assert.False(t, uxa.HasDupes()) + assert.Equal(t, uxa, uxa.removeDupes()) + uxa[0] = uxa[1] + assert.True(t, uxa.HasDupes()) + uxb := uxa.removeDupes() + assert.False(t, uxb.HasDupes()) + assert.Equal(t, len(uxb), 3) + assert.Equal(t, uxb[0], uxa[0]) + assert.Equal(t, uxb[1], uxa[2]) + assert.Equal(t, uxb[2], uxa[3]) +} + +func TestUxArraySub(t *testing.T) { + uxa := makeUxArray(t, 4) + uxb := makeUxArray(t, 4) + uxc := append(uxa[:1], uxb...) + uxc = append(uxc, uxa[1:2]...) + + uxd := uxc.Sub(uxa) + assert.Equal(t, uxd, uxb) + + uxd = uxc.Sub(uxb) + assert.Equal(t, len(uxd), 2) + assert.Equal(t, uxd, uxa[:2]) + + // No intersection + uxd = uxa.Sub(uxb) + assert.Equal(t, uxa, uxd) + uxd = uxb.Sub(uxa) + assert.Equal(t, uxd, uxb) +} + +func manualUxArrayIsSorted(uxa UxArray) bool { + isSorted := true + for i := 0; i < len(uxa)-1; i++ { + hi := uxa[i].Hash() + hj := uxa[i+1].Hash() + if bytes.Compare(hi[:], hj[:]) > 0 { + isSorted = false + } + } + return isSorted +} + +func TestUxArraySorting(t *testing.T) { + uxa := make(UxArray, 4) + for i := 0; i < len(uxa); i++ { + uxa[i] = makeUxOut(t) + } + isSorted := manualUxArrayIsSorted(uxa) + assert.Equal(t, sort.IsSorted(uxa), isSorted) + // Make sure uxa is not sorted + if isSorted { + uxa[0], uxa[1] = uxa[1], uxa[0] + } + assert.False(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxa)) + uxb := make(UxArray, 4) + for i, ux := range uxa { + uxb[i] = ux + } + sort.Sort(uxa) + assert.True(t, sort.IsSorted(uxa)) + assert.True(t, manualUxArrayIsSorted(uxa)) + assert.False(t, sort.IsSorted(uxb)) + uxb.Sort() + assert.Equal(t, uxa, uxb) + assert.True(t, sort.IsSorted(uxb)) + assert.True(t, manualUxArrayIsSorted(uxb)) +} + +func TestUxArrayLen(t *testing.T) { + uxa := make(UxArray, 4) + assert.Equal(t, len(uxa), uxa.Len()) + assert.Equal(t, 4, uxa.Len()) +} + +func TestUxArrayLess(t *testing.T) { + uxa := make(UxArray, 2) + uxa[0] = makeUxOut(t) + uxa[1] = makeUxOut(t) + h := make([]cipher.SHA256, 2) + h[0] = uxa[0].Hash() + h[1] = uxa[1].Hash() + assert.Equal(t, uxa.Less(0, 1), bytes.Compare(h[0][:], h[1][:]) < 0) + assert.Equal(t, uxa.Less(1, 0), bytes.Compare(h[0][:], h[1][:]) > 0) +} + +func TestUxArraySwap(t *testing.T) { + uxa := make(UxArray, 2) + uxx := makeUxOut(t) + uxy := makeUxOut(t) + uxa[0] = uxx + uxa[1] = uxy + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxy) + assert.Equal(t, uxa[1], uxx) + uxa.Swap(0, 1) + assert.Equal(t, uxa[0], uxx) + assert.Equal(t, uxa[1], uxy) + uxa.Swap(1, 0) + assert.Equal(t, uxa[1], uxx) + assert.Equal(t, uxa[0], uxy) +} + +func TestAddressUxOutsKeys(t *testing.T) { + unspents := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents[ux3.Body.Address] = UxArray{ux3} + keys := unspents.Keys() + assert.Equal(t, len(keys), 3) + dupes := make(map[cipher.Address]byte, 3) + for _, k := range keys { + dupes[k] = byte(1) + assert.True(t, k == ux.Body.Address || k == ux2.Body.Address || k == ux3.Body.Address) + } + assert.Equal(t, len(keys), len(dupes)) +} + +func TestAddressUxOutsMerge(t *testing.T) { + unspents := make(AddressUxOuts) + unspents2 := make(AddressUxOuts) + ux := makeUxOut(t) + ux2 := makeUxOut(t) + ux3 := makeUxOut(t) + ux4 := makeUxOut(t) + ux3.Body.Address = ux.Body.Address + + unspents[ux.Body.Address] = UxArray{ux} + unspents[ux2.Body.Address] = UxArray{ux2} + unspents2[ux3.Body.Address] = UxArray{ux3} + unspents2[ux4.Body.Address] = UxArray{ux4} + + // Valid merge + keys := []cipher.Address{ux.Body.Address, ux2.Body.Address, ux4.Body.Address} + merged := unspents.Merge(unspents2, keys) + assert.Equal(t, len(unspents), 2) + assert.Equal(t, len(unspents2), 2) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Duplicates should not be merged + unspents[ux4.Body.Address] = UxArray{ux4} + unspents[ux.Body.Address] = UxArray{ux, ux3} + merged = unspents.Merge(unspents2, keys) + assert.Equal(t, len(merged), 3) + assert.Equal(t, merged[ux.Body.Address], UxArray{ux, ux3}) + assert.Equal(t, merged[ux2.Body.Address], UxArray{ux2}) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) + + // Missing keys should not be merged + merged = unspents.Merge(unspents2, []cipher.Address{}) + assert.Equal(t, len(merged), 0) + merged = unspents.Merge(unspents2, []cipher.Address{ux4.Body.Address}) + assert.Equal(t, len(merged), 1) + assert.Equal(t, merged[ux4.Body.Address], UxArray{ux4}) +} + +func TestAddressUxOutsSub(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0], uxs[1]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[0]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Sub(up2) + // One address should have been removed, because no elements + assert.Equal(t, len(up3), 2) + _, ok := up3[uxs[2].Body.Address] + assert.False(t, ok) + // Ux3 should be untouched + ux3 := up3[uxs[3].Body.Address] + assert.Equal(t, ux3, UxArray{uxs[3]}) + // Ux0,Ux1 should be missing Ux0 + ux1 := up3[uxs[0].Body.Address] + assert.Equal(t, ux1, UxArray{uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 2) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsAdd(t *testing.T) { + up := make(AddressUxOuts) + up2 := make(AddressUxOuts) + uxs := makeUxArray(t, 4) + + uxs[1].Body.Address = uxs[0].Body.Address + up[uxs[0].Body.Address] = UxArray{uxs[0]} + up[uxs[2].Body.Address] = UxArray{uxs[2]} + up[uxs[3].Body.Address] = UxArray{uxs[3]} + + up2[uxs[0].Body.Address] = UxArray{uxs[1]} + up2[uxs[2].Body.Address] = UxArray{uxs[2]} + + up3 := up.Add(up2) + require.Equal(t, 3, len(up3)) + require.Equal(t, len(up3[uxs[0].Body.Address]), 2) + require.Equal(t, up3[uxs[0].Body.Address], UxArray{uxs[0], uxs[1]}) + require.Equal(t, up3[uxs[2].Body.Address], UxArray{uxs[2]}) + require.Equal(t, up3[uxs[3].Body.Address], UxArray{uxs[3]}) + require.Equal(t, up3[uxs[1].Body.Address], UxArray{uxs[0], uxs[1]}) + + // Originals should be unmodified + assert.Equal(t, len(up), 3) + assert.Equal(t, len(up[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up[uxs[2].Body.Address]), 1) + assert.Equal(t, len(up[uxs[3].Body.Address]), 1) + assert.Equal(t, len(up2), 2) + assert.Equal(t, len(up2[uxs[0].Body.Address]), 1) + assert.Equal(t, len(up2[uxs[2].Body.Address]), 1) +} + +func TestAddressUxOutsFlatten(t *testing.T) { + up := make(AddressUxOuts) + uxs := makeUxArray(t, 3) + uxs[2].Body.Address = uxs[1].Body.Address + emptyAddr := makeAddress() + + // An empty array + up[emptyAddr] = UxArray{} + // 1 element array + up[uxs[0].Body.Address] = UxArray{uxs[0]} + // 2 element array + up[uxs[1].Body.Address] = UxArray{uxs[1], uxs[2]} + + flat := up.Flatten() + assert.Equal(t, len(flat), 3) + // emptyAddr should not be in the array + for _, ux := range flat { + assert.NotEqual(t, ux.Body.Address, emptyAddr) + } + if flat[0].Body.Address == uxs[0].Body.Address { + assert.Equal(t, flat[0], uxs[0]) + assert.Equal(t, flat[0].Body.Address, uxs[0].Body.Address) + assert.Equal(t, flat[0+1], uxs[1]) + assert.Equal(t, flat[1+1], uxs[2]) + assert.Equal(t, flat[0+1].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1+1].Body.Address, uxs[2].Body.Address) + } else { + assert.Equal(t, flat[0], uxs[1]) + assert.Equal(t, flat[1], uxs[2]) + assert.Equal(t, flat[0].Body.Address, uxs[1].Body.Address) + assert.Equal(t, flat[1].Body.Address, uxs[2].Body.Address) + assert.Equal(t, flat[2], uxs[0]) + assert.Equal(t, flat[2].Body.Address, uxs[0].Body.Address) + } +} + +func TestNewAddressUxOuts(t *testing.T) { + uxs := makeUxArray(t, 6) + uxs[1].Body.Address = uxs[0].Body.Address + uxs[3].Body.Address = uxs[2].Body.Address + uxs[4].Body.Address = uxs[2].Body.Address + uxo := NewAddressUxOuts(uxs) + assert.Equal(t, len(uxo), 3) + assert.Equal(t, uxo[uxs[0].Body.Address], UxArray{ + uxs[0], uxs[1], + }) + assert.Equal(t, uxo[uxs[3].Body.Address], UxArray{ + uxs[2], uxs[3], uxs[4], + }) + assert.Equal(t, uxo[uxs[5].Body.Address], UxArray{ + uxs[5], + }) +} + +/* + Utility Functions +*/ + +// Returns a copy of self with duplicates removed +// Is this needed? +func (ua UxArray) removeDupes() UxArray { + m := make(UxHashSet, len(ua)) + deduped := make(UxArray, 0, len(ua)) + for i := range ua { + h := ua[i].Hash() + if _, ok := m[h]; !ok { + deduped = append(deduped, ua[i]) + m[h] = struct{}{} + } + } + return deduped +} + +// Combines two AddressUxOuts where they overlap with keys +// Remove? +func (auo AddressUxOuts) Merge(other AddressUxOuts, + keys []cipher.Address) AddressUxOuts { + final := make(AddressUxOuts, len(keys)) + for _, a := range keys { + row := append(auo[a], other[a]...) + final[a] = row.removeDupes() + } + return final +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transactions.go b/vendor/github.com/skycoin/skycoin/src/coin/transactions.go new file mode 100755 index 0000000..d55e164 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transactions.go @@ -0,0 +1,519 @@ +package coin + +import ( + "bytes" + "errors" + "fmt" + "log" + "math" + "sort" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +var ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +/* +Transaction with N inputs, M ouputs is +- 32 bytes constant +- 32+65 bytes per input +- 21+8+8 bytes per output + +Skycoin Transactions are +- 97 bytes per input + 37 bytes per output + 37 bytes +Bitcoin Transactions are +- 180 bytes per input + 34 bytes per output + 10 bytes + +Sigs is the array of signatures +- the Nth signature is the authorization to spend the Nth output consumed in transaction +- the hash signed is SHA256sum of transaction inner hash and the hash of output being spent + +The inner hash is SHA256 hash of the serialization of Input and Output array +The outer hash is the hash of the whole transaction serialization +*/ + +// Transaction transaction struct +type Transaction struct { + Length uint32 //length prefix + Type uint8 //transaction type + InnerHash cipher.SHA256 //inner hash SHA256 of In[],Out[] + + Sigs []cipher.Sig //list of signatures, 64+1 bytes each + In []cipher.SHA256 //ouputs being spent + Out []TransactionOutput //ouputs being created +} + +// TransactionOutput hash output/name is function of Hash +type TransactionOutput struct { + Address cipher.Address //address to send to + Coins uint64 //amount to be sent in coins + Hours uint64 //amount to be sent in coin hours +} + +// Verify attempts to determine if the transaction is well formed +// Verify cannot check transaction signatures, it needs the address from unspents +// Verify cannot check if outputs being spent exist +// Verify cannot check if the transaction would create or destroy coins +// or if the inputs have the required coin base +func (txn *Transaction) Verify() error { + h := txn.HashInner() + if h != txn.InnerHash { + return errors.New("Invalid header hash") + } + + if len(txn.In) == 0 { + return errors.New("No inputs") + } + if len(txn.Out) == 0 { + return errors.New("No outputs") + } + + // Check signature index fields + if len(txn.Sigs) != len(txn.In) { + return errors.New("Invalid number of signatures") + } + if len(txn.Sigs) >= math.MaxUint16 { + return errors.New("Too many signatures and inputs") + } + + // Check duplicate inputs + uxOuts := make(map[cipher.SHA256]struct{}, len(txn.In)) + for i := range txn.In { + uxOuts[txn.In[i]] = struct{}{} + } + if len(uxOuts) != len(txn.In) { + return errors.New("Duplicate spend") + } + + if txn.Type != 0 { + return errors.New("transaction type invalid") + } + + if txn.Length != uint32(txn.Size()) { + return errors.New("transaction size prefix invalid") + } + + // Check for duplicate potential outputs + outputs := make(map[cipher.SHA256]struct{}, len(txn.Out)) + uxb := UxBody{ + SrcTransaction: txn.Hash(), + } + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + outputs[uxb.Hash()] = struct{}{} + } + if len(outputs) != len(txn.Out) { + return errors.New("Duplicate output in transaction") + } + + // Validate signature + for i, sig := range txn.Sigs { + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) + if err := cipher.VerifySignedHash(sig, hash); err != nil { + return err + } + } + + // Prevent zero coin outputs + // Artificial restriction to prevent spam + for _, txo := range txn.Out { + if txo.Coins == 0 { + return errors.New("Zero coin output") + } + } + + // Check output coin integer overflow + coins := uint64(0) + for _, to := range txn.Out { + var err error + coins, err = AddUint64(coins, to.Coins) + if err != nil { + return errors.New("Output coins overflow") + } + } + + return nil +} + +// VerifyInput verifies the input +func (txn Transaction) VerifyInput(uxIn UxArray) error { + if DebugLevel2 { + if len(txn.In) != len(uxIn) { + log.Panic("tx.In != uxIn") + } + if len(txn.In) != len(txn.Sigs) { + log.Panic("tx.In != tx.Sigs") + } + if txn.InnerHash != txn.HashInner() { + log.Panic("Invalid Tx Inner Hash") + } + for i := range txn.In { + if txn.In[i] != uxIn[i].Hash() { + log.Panic("Ux hash mismatch") + } + } + } + + // Check signatures against unspent address + for i := range txn.In { + hash := cipher.AddSHA256(txn.InnerHash, txn.In[i]) // use inner hash, not outer hash + err := cipher.ChkSig(uxIn[i].Body.Address, hash, txn.Sigs[i]) + if err != nil { + return errors.New("Signature not valid for output being spent") + } + } + + return nil +} + +// PushInput adds a UxArray to the Transaction given the hash of a UxOut. +// Returns the signature index for later signing +func (txn *Transaction) PushInput(uxOut cipher.SHA256) uint16 { + if len(txn.In) >= math.MaxUint16 { + log.Panic("Max transaction inputs reached") + } + txn.In = append(txn.In, uxOut) + return uint16(len(txn.In) - 1) +} + +// UxID compute transaction output id +func (txOut TransactionOutput) UxID(txID cipher.SHA256) cipher.SHA256 { + var x UxBody + x.Coins = txOut.Coins + x.Hours = txOut.Hours + x.Address = txOut.Address + x.SrcTransaction = txID + return x.Hash() +} + +// PushOutput Adds a TransactionOutput, sending coins & hours to an Address +func (txn *Transaction) PushOutput(dst cipher.Address, coins, hours uint64) { + to := TransactionOutput{ + Address: dst, + Coins: coins, + Hours: hours, + } + txn.Out = append(txn.Out, to) +} + +// SignInputs signs all inputs in the transaction +func (txn *Transaction) SignInputs(keys []cipher.SecKey) { + txn.InnerHash = txn.HashInner() // update hash + + if len(txn.Sigs) != 0 { + log.Panic("Transaction has been signed") + } + if len(keys) != len(txn.In) { + log.Panic("Invalid number of keys") + } + if len(keys) > math.MaxUint16 { + log.Panic("Too many keys") + } + if len(keys) == 0 { + log.Panic("No keys") + } + + sigs := make([]cipher.Sig, len(txn.In)) + innerHash := txn.HashInner() + for i, k := range keys { + h := cipher.AddSHA256(innerHash, txn.In[i]) // hash to sign + sigs[i] = cipher.SignHash(h, k) + } + txn.Sigs = sigs +} + +// Size returns the encoded byte size of the transaction +func (txn *Transaction) Size() int { + return len(txn.Serialize()) +} + +// Hash an entire Transaction struct, including the TransactionHeader +func (txn *Transaction) Hash() cipher.SHA256 { + b := txn.Serialize() + return cipher.SumSHA256(b) +} + +// SizeHash returns the encoded size and the hash of it (avoids duplicate encoding) +func (txn *Transaction) SizeHash() (int, cipher.SHA256) { + b := txn.Serialize() + return len(b), cipher.SumSHA256(b) +} + +// TxID returns transaction ID as byte string +func (txn *Transaction) TxID() []byte { + hash := txn.Hash() + return hash[0:32] +} + +// TxIDHex returns transaction ID as hex +func (txn *Transaction) TxIDHex() string { + return txn.Hash().Hex() +} + +// UpdateHeader saves the txn body hash to TransactionHeader.Hash +func (txn *Transaction) UpdateHeader() { + s := txn.Size() + txn.Length = uint32(s) + txn.Type = byte(0x00) + txn.InnerHash = txn.HashInner() +} + +// HashInner hashes only the Transaction Inputs & Outputs +// This is what is signed +// Client hashes the inner hash with hash of output being spent and signs it with private key +func (txn *Transaction) HashInner() cipher.SHA256 { + b1 := encoder.Serialize(txn.In) + b2 := encoder.Serialize(txn.Out) + b3 := append(b1, b2...) + return cipher.SumSHA256(b3) +} + +// Serialize serialize the transaction +func (txn *Transaction) Serialize() []byte { + return encoder.Serialize(*txn) +} + +// MustTransactionDeserialize deserialize transaction, panics on error +func MustTransactionDeserialize(b []byte) Transaction { + t, err := TransactionDeserialize(b) + if err != nil { + log.Panicf("Failed to deserialize transaction: %v", err) + } + return t +} + +// TransactionDeserialize deserialize transaction +func TransactionDeserialize(b []byte) (Transaction, error) { + t := Transaction{} + if err := encoder.DeserializeRaw(b, &t); err != nil { + return t, fmt.Errorf("Invalid transaction: %v", err) + } + return t, nil +} + +// OutputHours returns the coin hours sent as outputs. This does not include the fee. +func (txn *Transaction) OutputHours() (uint64, error) { + hours := uint64(0) + for i := range txn.Out { + var err error + hours, err = AddUint64(hours, txn.Out[i].Hours) + if err != nil { + return 0, errors.New("Transaction output hours overflow") + } + } + return hours, nil +} + +// Transactions transaction slice +type Transactions []Transaction + +// Fees calculates all the fees in Transactions +func (txns Transactions) Fees(calc FeeCalculator) (uint64, error) { + total := uint64(0) + for i := range txns { + fee, err := calc(&txns[i]) + if err != nil { + return 0, err + } + + total, err = AddUint64(total, fee) + if err != nil { + return 0, errors.New("Transactions fee totals overflow") + } + } + return total, nil +} + +// Hashes caculate transactions hashes +func (txns Transactions) Hashes() []cipher.SHA256 { + hashes := make([]cipher.SHA256, len(txns)) + for i := range txns { + hashes[i] = txns[i].Hash() + } + return hashes +} + +// Size returns the sum of contained Transactions' sizes. It is not the size if +// serialized, since that would have a length prefix. +func (txns Transactions) Size() int { + size := 0 + for i := range txns { + size += txns[i].Size() + } + return size +} + +// TruncateBytesTo returns the first n transactions whose total size is less than or equal to +// size. +func (txns Transactions) TruncateBytesTo(size int) Transactions { + total := 0 + for i := range txns { + pending := txns[i].Size() + + if pending+total > size { + return txns[:i] + } + + total += pending + } + return txns +} + +// SortableTransactions allows sorting transactions by fee & hash +type SortableTransactions struct { + Txns Transactions + Fees []uint64 + Hashes []cipher.SHA256 +} + +// FeeCalculator given a transaction, return its fee or an error if the fee cannot be +// calculated +type FeeCalculator func(*Transaction) (uint64, error) + +// SortTransactions returns transactions sorted by fee per kB, and sorted by lowest hash if +// tied. Transactions that fail in fee computation are excluded. +func SortTransactions(txns Transactions, feeCalc FeeCalculator) Transactions { + sorted := NewSortableTransactions(txns, feeCalc) + sorted.Sort() + return sorted.Txns +} + +// NewSortableTransactions returns an array of txns that can be sorted by fee. On creation, fees are +// calculated, and if any txns have invalid fee, there are removed from +// consideration +func NewSortableTransactions(txns Transactions, feeCalc FeeCalculator) SortableTransactions { + newTxns := make(Transactions, len(txns)) + fees := make([]uint64, len(txns)) + hashes := make([]cipher.SHA256, len(txns)) + j := 0 + for i := range txns { + fee, err := feeCalc(&txns[i]) + if err != nil { + continue + } + + size, hash := txns[i].SizeHash() + + // Calculate fee priority based on fee per kb + feeKB, err := multUint64(fee, 1024) + + // If the fee * 1024 would exceed math.MaxUint64, set it to math.MaxUint64 so that + // this transaction can still be processed + if err != nil { + feeKB = math.MaxUint64 + } + + newTxns[j] = txns[i] + hashes[j] = hash + fees[j] = feeKB / uint64(size) + j++ + } + return SortableTransactions{ + Txns: newTxns[:j], + Fees: fees[:j], + Hashes: hashes[:j], + } +} + +// Sort sorts by tx fee, and then by hash if fee equal +func (txns SortableTransactions) Sort() { + sort.Sort(txns) +} + +// Len returns length of transactions +func (txns SortableTransactions) Len() int { + return len(txns.Txns) +} + +// Less default sorting is fees descending, hash ascending if fees equal +func (txns SortableTransactions) Less(i, j int) bool { + if txns.Fees[i] == txns.Fees[j] { + // If fees match, hashes are sorted ascending + return bytes.Compare(txns.Hashes[i][:], txns.Hashes[j][:]) < 0 + } + // Fees are sorted descending + return txns.Fees[i] > txns.Fees[j] +} + +// Swap swaps txns +func (txns SortableTransactions) Swap(i, j int) { + txns.Txns[i], txns.Txns[j] = txns.Txns[j], txns.Txns[i] + txns.Fees[i], txns.Fees[j] = txns.Fees[j], txns.Fees[i] + txns.Hashes[i], txns.Hashes[j] = txns.Hashes[j], txns.Hashes[i] +} + +// VerifyTransactionCoinsSpending checks that coins are not destroyed or created by the transaction +func VerifyTransactionCoinsSpending(uxIn UxArray, uxOut UxArray) error { + coinsIn := uint64(0) + for i := range uxIn { + var err error + coinsIn, err = AddUint64(coinsIn, uxIn[i].Body.Coins) + if err != nil { + return errors.New("Transaction input coins overflow") + } + } + + coinsOut := uint64(0) + for i := range uxOut { + var err error + coinsOut, err = AddUint64(coinsOut, uxOut[i].Body.Coins) + if err != nil { + return errors.New("Transaction output coins overflow") + } + } + + if coinsIn < coinsOut { + return errors.New("Insufficient coins") + } + if coinsIn > coinsOut { + return errors.New("Transactions may not destroy coins") + } + + return nil +} + +// VerifyTransactionHoursSpending checks that hours are not created by the transaction +func VerifyTransactionHoursSpending(headTime uint64, uxIn UxArray, uxOut UxArray) error { + hoursIn := uint64(0) + for i := range uxIn { + uxHours, err := uxIn[i].CoinHours(headTime) + if err != nil { + // If the error was specifically an overflow when adding the + // earned coin hours to the base coin hours, treat the uxHours as 0. + // Block 13277 spends an input which overflows in this way, + // so the block will not sync if an error is returned. + if err == ErrAddEarnedCoinHoursAdditionOverflow { + uxHours = 0 + } else { + return err + } + } + + hoursIn, err = AddUint64(hoursIn, uxHours) + if err != nil { + return errors.New("Transaction input hours overflow") + } + } + + hoursOut := uint64(0) + for i := range uxOut { + // NOTE: addition of hours is not checked for overflow here because + // this would invalidate existing blocks which had overflowed hours. + // Hours overflow checks are handled as a "soft" constraint in the network + // until those blocks are repaired. + hoursOut += uxOut[i].Body.Hours + } + + if hoursIn < hoursOut { + return errors.New("Insufficient coin hours") + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/coin/transactions_test.go b/vendor/github.com/skycoin/skycoin/src/coin/transactions_test.go new file mode 100755 index 0000000..a63e1ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/coin/transactions_test.go @@ -0,0 +1,900 @@ +package coin + +import ( + "bytes" + "errors" + "math" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/testutil" + _require "github.com/skycoin/skycoin/src/testutil/require" +) + +func makeTransactionFromUxOut(ux UxOut, s cipher.SecKey) Transaction { + tx := Transaction{} + tx.PushInput(ux.Hash()) + tx.PushOutput(makeAddress(), 1e6, 50) + tx.PushOutput(makeAddress(), 5e6, 50) + tx.SignInputs([]cipher.SecKey{s}) + tx.UpdateHeader() + return tx +} + +func makeTransaction(t *testing.T) Transaction { + ux, s := makeUxOutWithSecret(t) + return makeTransactionFromUxOut(ux, s) +} + +func makeTransactions(t *testing.T, n int) Transactions { // nolint: unparam + txns := make(Transactions, n) + for i := range txns { + txns[i] = makeTransaction(t) + } + return txns +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func copyTransaction(tx Transaction) Transaction { + txo := Transaction{} + txo.Length = tx.Length + txo.Type = tx.Type + txo.InnerHash = tx.InnerHash + txo.Sigs = make([]cipher.Sig, len(tx.Sigs)) + copy(txo.Sigs, tx.Sigs) + txo.In = make([]cipher.SHA256, len(tx.In)) + copy(txo.In, tx.In) + txo.Out = make([]TransactionOutput, len(tx.Out)) + copy(txo.Out, tx.Out) + return txo +} + +func TestTransactionVerify(t *testing.T) { + // Mismatch header hash + tx := makeTransaction(t) + tx.InnerHash = cipher.SHA256{} + testutil.RequireError(t, tx.Verify(), "Invalid header hash") + + // No inputs + tx = makeTransaction(t) + tx.In = make([]cipher.SHA256, 0) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "No inputs") + + // No outputs + tx = makeTransaction(t) + tx.Out = make([]TransactionOutput, 0) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "No outputs") + + // Invalid number of sigs + tx = makeTransaction(t) + tx.Sigs = make([]cipher.Sig, 0) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Invalid number of signatures") + tx.Sigs = make([]cipher.Sig, 20) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Invalid number of signatures") + + // Too many sigs & inputs + tx = makeTransaction(t) + tx.Sigs = make([]cipher.Sig, math.MaxUint16) + tx.In = make([]cipher.SHA256, math.MaxUint16) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Too many signatures and inputs") + + // Duplicate inputs + ux, s := makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + tx.PushInput(tx.In[0]) + tx.Sigs = nil + tx.SignInputs([]cipher.SecKey{s, s}) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Duplicate spend") + + // Duplicate outputs + tx = makeTransaction(t) + to := tx.Out[0] + tx.PushOutput(to.Address, to.Coins, to.Hours) + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Duplicate output in transaction") + + // Invalid signature, empty + tx = makeTransaction(t) + tx.Sigs[0] = cipher.Sig{} + testutil.RequireError(t, tx.Verify(), "Failed to recover public key") + // We can't check here for other invalid signatures: + // - Signatures signed by someone else, spending coins they don't own + // - Signature is for wrong hash + // This must be done by blockchain tests, because we need the address + // from the unspent being spent + + // Output coins are 0 + tx = makeTransaction(t) + tx.Out[0].Coins = 0 + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Zero coin output") + + // Output coin overflow + tx = makeTransaction(t) + tx.Out[0].Coins = math.MaxUint64 - 3e6 + tx.UpdateHeader() + testutil.RequireError(t, tx.Verify(), "Output coins overflow") + + // Output coins are not multiples of 1e6 (valid, decimal restriction is not enforced here) + tx = makeTransaction(t) + tx.Out[0].Coins += 10 + tx.UpdateHeader() + tx.Sigs = nil + tx.SignInputs([]cipher.SecKey{genSecret}) + require.NotEqual(t, tx.Out[0].Coins%1e6, uint64(0)) + require.NoError(t, tx.Verify()) + + // Valid + tx = makeTransaction(t) + tx.Out[0].Coins = 10e6 + tx.Out[1].Coins = 1e6 + tx.UpdateHeader() + require.Nil(t, tx.Verify()) +} + +func TestTransactionVerifyInput(t *testing.T) { + // Invalid uxIn args + tx := makeTransaction(t) + _require.PanicsWithLogMessage(t, "tx.In != uxIn", func() { + tx.VerifyInput(nil) + }) + _require.PanicsWithLogMessage(t, "tx.In != uxIn", func() { + tx.VerifyInput(UxArray{}) + }) + _require.PanicsWithLogMessage(t, "tx.In != uxIn", func() { + tx.VerifyInput(make(UxArray, 3)) + }) + + // tx.In != tx.Sigs + ux, s := makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + tx.Sigs = []cipher.Sig{} + _require.PanicsWithLogMessage(t, "tx.In != tx.Sigs", func() { + tx.VerifyInput(UxArray{ux}) + }) + + ux, s = makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + tx.Sigs = append(tx.Sigs, cipher.Sig{}) + _require.PanicsWithLogMessage(t, "tx.In != tx.Sigs", func() { + tx.VerifyInput(UxArray{ux}) + }) + + // tx.InnerHash != tx.HashInner() + ux, s = makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + tx.InnerHash = cipher.SHA256{} + _require.PanicsWithLogMessage(t, "Invalid Tx Inner Hash", func() { + tx.VerifyInput(UxArray{ux}) + }) + + // tx.In does not match uxIn hashes + ux, s = makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + _require.PanicsWithLogMessage(t, "Ux hash mismatch", func() { + tx.VerifyInput(UxArray{UxOut{}}) + }) + + // Invalid signature + ux, s = makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + tx.Sigs[0] = cipher.Sig{} + err := tx.VerifyInput(UxArray{ux}) + testutil.RequireError(t, err, "Signature not valid for output being spent") + + // Valid + ux, s = makeUxOutWithSecret(t) + tx = makeTransactionFromUxOut(ux, s) + err = tx.VerifyInput(UxArray{ux}) + require.NoError(t, err) +} + +func TestTransactionPushInput(t *testing.T) { + tx := &Transaction{} + ux := makeUxOut(t) + require.Equal(t, tx.PushInput(ux.Hash()), uint16(0)) + require.Equal(t, len(tx.In), 1) + require.Equal(t, tx.In[0], ux.Hash()) + tx.In = append(tx.In, make([]cipher.SHA256, math.MaxUint16)...) + ux = makeUxOut(t) + require.Panics(t, func() { tx.PushInput(ux.Hash()) }) +} + +func TestTransactionPushOutput(t *testing.T) { + tx := &Transaction{} + a := makeAddress() + tx.PushOutput(a, 100, 150) + require.Equal(t, len(tx.Out), 1) + require.Equal(t, tx.Out[0], TransactionOutput{ + Address: a, + Coins: 100, + Hours: 150, + }) + for i := 1; i < 20; i++ { + a := makeAddress() + tx.PushOutput(a, uint64(i*100), uint64(i*50)) + require.Equal(t, len(tx.Out), i+1) + require.Equal(t, tx.Out[i], TransactionOutput{ + Address: a, + Coins: uint64(i * 100), + Hours: uint64(i * 50), + }) + } +} + +func TestTransactionSignInputs(t *testing.T) { + tx := &Transaction{} + // Panics if txns already signed + tx.Sigs = append(tx.Sigs, cipher.Sig{}) + require.Panics(t, func() { tx.SignInputs([]cipher.SecKey{}) }) + // Panics if not enough keys + tx = &Transaction{} + ux, s := makeUxOutWithSecret(t) + tx.PushInput(ux.Hash()) + ux2, s2 := makeUxOutWithSecret(t) + tx.PushInput(ux2.Hash()) + tx.PushOutput(makeAddress(), 40, 80) + require.Equal(t, len(tx.Sigs), 0) + require.Panics(t, func() { tx.SignInputs([]cipher.SecKey{s}) }) + require.Equal(t, len(tx.Sigs), 0) + // Valid signing + h := tx.HashInner() + require.NotPanics(t, func() { tx.SignInputs([]cipher.SecKey{s, s2}) }) + require.Equal(t, len(tx.Sigs), 2) + require.Equal(t, tx.HashInner(), h) + p := cipher.PubKeyFromSecKey(s) + a := cipher.AddressFromPubKey(p) + p = cipher.PubKeyFromSecKey(s2) + a2 := cipher.AddressFromPubKey(p) + require.Nil(t, cipher.ChkSig(a, cipher.AddSHA256(h, tx.In[0]), tx.Sigs[0])) + require.Nil(t, cipher.ChkSig(a2, cipher.AddSHA256(h, tx.In[1]), tx.Sigs[1])) + require.NotNil(t, cipher.ChkSig(a, h, tx.Sigs[1])) + require.NotNil(t, cipher.ChkSig(a2, h, tx.Sigs[0])) +} + +func TestTransactionHash(t *testing.T) { + tx := makeTransaction(t) + require.NotEqual(t, tx.Hash(), cipher.SHA256{}) + require.NotEqual(t, tx.HashInner(), tx.Hash()) +} + +func TestTransactionUpdateHeader(t *testing.T) { + tx := makeTransaction(t) + h := tx.InnerHash + tx.InnerHash = cipher.SHA256{} + tx.UpdateHeader() + require.NotEqual(t, tx.InnerHash, cipher.SHA256{}) + require.Equal(t, tx.InnerHash, h) + require.Equal(t, tx.InnerHash, tx.HashInner()) +} + +func TestTransactionHashInner(t *testing.T) { + tx := makeTransaction(t) + + h := tx.HashInner() + require.NotEqual(t, h, cipher.SHA256{}) + + // If tx.In is changed, hash should change + tx2 := copyTransaction(tx) + ux := makeUxOut(t) + tx2.In[0] = ux.Hash() + require.NotEqual(t, tx, tx2) + require.Equal(t, tx2.In[0], ux.Hash()) + require.NotEqual(t, tx.HashInner(), tx2.HashInner()) + + // If tx.Out is changed, hash should change + tx2 = copyTransaction(tx) + a := makeAddress() + tx2.Out[0].Address = a + require.NotEqual(t, tx, tx2) + require.Equal(t, tx2.Out[0].Address, a) + require.NotEqual(t, tx.HashInner(), tx2.HashInner()) + + // If tx.Head is changed, hash should not change + tx2 = copyTransaction(tx) + tx.Sigs = append(tx.Sigs, cipher.Sig{}) + require.Equal(t, tx.HashInner(), tx2.HashInner()) +} + +func TestTransactionSerialization(t *testing.T) { + tx := makeTransaction(t) + b := tx.Serialize() + tx2, err := TransactionDeserialize(b) + require.NoError(t, err) + require.Equal(t, tx, tx2) + // Invalid deserialization + require.Panics(t, func() { MustTransactionDeserialize([]byte{0x04}) }) +} + +func TestTransactionOutputHours(t *testing.T) { + tx := Transaction{} + tx.PushOutput(makeAddress(), 1e6, 100) + tx.PushOutput(makeAddress(), 1e6, 200) + tx.PushOutput(makeAddress(), 1e6, 500) + tx.PushOutput(makeAddress(), 1e6, 0) + hours, err := tx.OutputHours() + require.NoError(t, err) + require.Equal(t, hours, uint64(800)) + + tx.PushOutput(makeAddress(), 1e6, math.MaxUint64-700) + _, err = tx.OutputHours() + testutil.RequireError(t, err, "Transaction output hours overflow") +} + +func TestTransactionsSize(t *testing.T) { + txns := makeTransactions(t, 10) + size := 0 + for _, tx := range txns { + size += len(encoder.Serialize(&tx)) + } + require.NotEqual(t, size, 0) + require.Equal(t, txns.Size(), size) +} + +func TestTransactionsHashes(t *testing.T) { + txns := make(Transactions, 4) + for i := 0; i < len(txns); i++ { + txns[i] = makeTransaction(t) + } + hashes := txns.Hashes() + require.Equal(t, len(hashes), 4) + for i, h := range hashes { + require.Equal(t, h, txns[i].Hash()) + } +} + +func TestTransactionsTruncateBytesTo(t *testing.T) { + txns := makeTransactions(t, 10) + trunc := 0 + for i := 0; i < len(txns)/2; i++ { + trunc += txns[i].Size() + } + // Truncating halfway + txns2 := txns.TruncateBytesTo(trunc) + require.Equal(t, len(txns2), len(txns)/2) + require.Equal(t, txns2.Size(), trunc) + + // Stepping into next boundary has same cutoff, must exceed + trunc++ + txns2 = txns.TruncateBytesTo(trunc) + require.Equal(t, len(txns2), len(txns)/2) + require.Equal(t, txns2.Size(), trunc-1) + + // Moving to 1 before next level + trunc += txns[5].Size() - 2 + txns2 = txns.TruncateBytesTo(trunc) + require.Equal(t, len(txns2), len(txns)/2) + require.Equal(t, txns2.Size(), trunc-txns[5].Size()+1) + + // Moving to next level + trunc++ + txns2 = txns.TruncateBytesTo(trunc) + require.Equal(t, len(txns2), len(txns)/2+1) + require.Equal(t, txns2.Size(), trunc) + + // Truncating to full available amt + trunc = txns.Size() + txns2 = txns.TruncateBytesTo(trunc) + require.Equal(t, txns, txns2) + require.Equal(t, txns2.Size(), trunc) + + // Truncating over amount + trunc++ + txns2 = txns.TruncateBytesTo(trunc) + require.Equal(t, txns, txns2) + require.Equal(t, txns2.Size(), trunc-1) + + // Truncating to 0 + trunc = 0 + txns2 = txns.TruncateBytesTo(0) + require.Equal(t, len(txns2), 0) + require.Equal(t, txns2.Size(), trunc) +} + +func TestVerifyTransactionCoinsSpending(t *testing.T) { + // Input coins overflow + // Insufficient coins + // Destroy coins + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + err error + }{ + { + name: "Input coins overflow", + inUxs: []ux{ + { + coins: math.MaxUint64 - 1e6 + 1, + hours: 10, + }, + { + coins: 1e6, + hours: 0, + }, + }, + err: errors.New("Transaction input coins overflow"), + }, + + { + name: "Output coins overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: math.MaxUint64 - 10e6 + 1, + hours: 0, + }, + { + coins: 20e6, + hours: 1, + }, + }, + err: errors.New("Transaction output coins overflow"), + }, + + { + name: "Insufficient coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 20e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Insufficient coins"), + }, + + { + name: "Destroyed coins", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 5e6, + hours: 1, + }, + { + coins: 10e6, + hours: 1, + }, + }, + err: errors.New("Transactions may not destroy coins"), + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionCoinsSpending(uxIn, uxOut) + require.Equal(t, tc.err, err) + }) + } +} + +func TestVerifyTransactionHoursSpending(t *testing.T) { + // Input hours overflow + // Insufficient hours + // NOTE: does not check for hours overflow, that had to be moved to soft constraints + // NOTE: if uxIn.CoinHours() fails during the addition of earned hours to base hours, + // the error is ignored and treated as 0 hours + + type ux struct { + coins uint64 + hours uint64 + } + + cases := []struct { + name string + inUxs []ux + outUxs []ux + headTime uint64 + err string + }{ + { + name: "Input hours overflow", + inUxs: []ux{ + { + coins: 3e6, + hours: math.MaxUint64 - 1e6 + 1, + }, + { + coins: 1e6, + hours: 1e6, + }, + }, + err: "Transaction input hours overflow", + }, + + { + name: "Insufficient coin hours", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "coin hours time calculation overflow", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + headTime: math.MaxUint64, + err: "UxOut.CoinHours: Calculating whole coin seconds overflows uint64 seconds=18446744073709551615 coins=10 uxid=", + }, + + { + name: "Invalid (coin hours overflow when adding earned hours, which is treated as 0, and now enough coin hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 1, + }, + }, + err: "Insufficient coin hours", + }, + + { + name: "Valid (coin hours overflow when adding earned hours, which is treated as 0, but not sending any hours)", + headTime: 1e6, + inUxs: []ux{ + { + coins: 10e6, + hours: math.MaxUint64, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 0, + }, + }, + }, + + { + name: "Valid (base inputs have insufficient coin hours, but have sufficient after adjusting coinhours by headTime)", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 15e6, + hours: 10, + }, + { + coins: 10e6, + hours: 11, + }, + }, + headTime: 1492707255, + }, + + { + name: "valid", + inUxs: []ux{ + { + coins: 10e6, + hours: 10, + }, + { + coins: 15e6, + hours: 10, + }, + }, + outUxs: []ux{ + { + coins: 10e6, + hours: 11, + }, + { + coins: 10e6, + hours: 1, + }, + { + coins: 5e6, + hours: 0, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var uxIn, uxOut UxArray + + for _, ch := range tc.inUxs { + uxIn = append(uxIn, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + for _, ch := range tc.outUxs { + uxOut = append(uxOut, UxOut{ + Body: UxBody{ + Coins: ch.coins, + Hours: ch.hours, + }, + }) + } + + err := VerifyTransactionHoursSpending(tc.headTime, uxIn, uxOut) + if tc.err == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), tc.err)) + } + }) + } +} + +func TestTransactionsFees(t *testing.T) { + calc := func(tx *Transaction) (uint64, error) { + return 1, nil + } + + var txns Transactions + + // Nil txns + fee, err := txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(0), fee) + + txns = append(txns, Transaction{}) + txns = append(txns, Transaction{}) + + // 2 transactions, calc() always returns 1 + fee, err = txns.Fees(calc) + require.NoError(t, err) + require.Equal(t, uint64(2), fee) + + // calc error + failingCalc := func(tx *Transaction) (uint64, error) { + return 0, errors.New("bad calc") + } + _, err = txns.Fees(failingCalc) + testutil.RequireError(t, err, "bad calc") + + // summing of calculated fees overflows + overflowCalc := func(tx *Transaction) (uint64, error) { + return math.MaxUint64, nil + } + + _, err = txns.Fees(overflowCalc) + testutil.RequireError(t, err, "Transactions fee totals overflow") +} + +func TestSortTransactions(t *testing.T) { + n := 6 + var txns Transactions + for i := 0; i < n; i++ { + txn := Transaction{} + txn.PushOutput(makeAddress(), 1e6, uint64(i*1e3)) + txn.UpdateHeader() + txns = append(txns, txn) + } + + var hashSortedTxns Transactions + for _, txn := range txns { + hashSortedTxns = append(hashSortedTxns, txn) + } + + sort.Slice(hashSortedTxns, func(i, j int) bool { + ihash := hashSortedTxns[i].Hash() + jhash := hashSortedTxns[j].Hash() + return bytes.Compare(ihash[:], jhash[:]) < 0 + }) + + cases := []struct { + name string + feeCalc FeeCalculator + txns Transactions + sortedTxns Transactions + }{ + { + name: "already sorted", + txns: Transactions{txns[0], txns[1]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "reverse sorted", + txns: Transactions{txns[1], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "hash tiebreaker", + txns: Transactions{hashSortedTxns[1], hashSortedTxns[0]}, + sortedTxns: Transactions{hashSortedTxns[0], hashSortedTxns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + return 1e8, nil + }, + }, + + { + name: "invalid fee multiplication is capped", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[2], txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return math.MaxUint64 / 2, nil + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + + { + name: "failed fee calc is filtered", + txns: Transactions{txns[1], txns[2], txns[0]}, + sortedTxns: Transactions{txns[0], txns[1]}, + feeCalc: func(txn *Transaction) (uint64, error) { + if txn.Hash() == txns[2].Hash() { + return 0, errors.New("fee calc failed") + } + return 1e8 - txn.Out[0].Hours, nil + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + txns := SortTransactions(tc.txns, tc.feeCalc) + require.Equal(t, tc.sortedTxns, txns) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/blockstat.go b/vendor/github.com/skycoin/skycoin/src/consensus/blockstat.go new file mode 100755 index 0000000..19f71bf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/blockstat.go @@ -0,0 +1,627 @@ +// nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "bytes" + "container/heap" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +var all_zero_hash = cipher.SHA256{} +var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStat +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStat struct { + priority int // Mandatory item for an element of container/heap + index int // Mandatory item for an element of container/heap + + // [JSM:] For a given block sequence number (or 'seqno'), we + // want + // + // map: hash -> set + // + // The 'pubkey' is recovered from '(sig,hash)' pair. Also, we + // want the number of unique 'pubkey', which is the number of + // independent block-makers. It shows how reliable the averaging + // would be. + // + // [JSM:] We need to put an upper limit to the + // ConcensusParticipant's bandwidth requirement in order to + // prevent a certain kind of attack on the network. As an + // implementation of that requirement, we stop collecting (hence, + // stop propagating) the blocks with the same sequence number + // after we have observed a sufficient number of builders. + // + // [JSM:] The hash that has largest number of unique pubkeys is + // selected as the block for the given seqno. + + // [JSM:] This approach is to guard against what can be called an + // "amplification attack": A node/pubkey with many subscribers + // publishes a block that says "Earth is flat". The above pubkey + // is (and has been) trusted by many, but at the moment the pubkey + // has been compelled, say, under a threat of burning on a steak, + // to publish a clearly-wrong block. You, as a listening pubkey, + // have N1 nodes as publisher; + // each of them is connected, or have a route, to the + // above pubkey that is being coersed. Meanwhile, there are N2 + // pubkeys that published "Earth is round" block. If you neglect + // to check the origin of the block [i.e. who signed it], and if + // it happens that N1 >> N2 (e.g. 1000 >> 100), then you would + // conclude, quite incorrectly, that the network agrees that + // "Earth is flat". If, however, you take into account the origin + // of the block, you would see that all N1 blocks are merely + // duplicates sent out with the intention to manipulate network + // consensus, while all N2 messages came from unique + // signers. Therefore you conclude that you have only one block + // "Earth is flat" and many blocks "Earth is round", e.g. 1 << + // 100. So you chose "Earth is round" block. The idea of this + // approach (or a guard, if you will) can be expressesd as + // follows: "Q: Can one billion peasants be all wrong + // simultaneously? A: Yes, if they learn what they should think + // from the same wall-glued newspaper." + // + // (Side node: this approach has several useful side-effects + // that we shall not discuss here.) + + hash2info map[cipher.SHA256]HashCandidate + + // FOR NOW this is just a label and is used to + // set/read. Invariant: all Blocks stored/referenced here have + // same seqno. + seqno uint64 + + // After the class instance was used to select Block for + // consensus, we do not update the stats. + frozen bool + + // This is to limit traffic due to forwarding. A side-effect is + // limited statistics. See'Cfg_consensus_max_candidate_messages'. + // Explanation: every node in the network is allowed to make (and + // publish) blocks, but we do not wish to receive all of these + // messages. + accept_count int + + // + // BEG debugging/diagnostics + // + debug_pubkey2count map[cipher.PubKey]int + debug_count int + + // The number of events that would have qualified to be utilized, + // but were rejected due to 'frozen == true' + debug_reject_count int + + // Ignored due to limitations on how much we want to accept and forward + debug_neglect_count int + + debug_usage int + // + // END debugging/diagnostics + // +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) is_consistent() bool { + for _, info := range self.hash2info { + if !info.is_consistent() { + return false + } + } + // TODO 1: Need to extract pubkey from 'self.hash2info' and from + // 'self.debug_pubkey2count', and make sure they are the same. + + // TODO 2: make sure all debug counters are consistent. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Init() { + self.priority = 0 + self.index = -1 + + self.hash2info = make(map[cipher.SHA256]HashCandidate) + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + self.debug_pubkey2count = make(map[cipher.PubKey]int) + self.debug_count = 0 + self.debug_reject_count = 0 + self.debug_neglect_count = 0 + self.debug_usage = 0 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetSeqno() uint64 { + return self.seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Clear() { + + for i, info := range self.hash2info { + info.Clear() + delete(self.hash2info, i) + } + self.seqno = 0 + self.frozen = false + self.accept_count = 0 + // + for i, _ := range self.debug_pubkey2count { + delete(self.debug_pubkey2count, i) + } + self.debug_count = 0 + self.debug_reject_count = 0 + // NOTE: 'self.debug_usage' is kept as-is +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) try_add_hash_and_sig( + hash cipher.SHA256, + sig cipher.Sig) int { + + if self.frozen { + // To get a more accurate number of rejects, one would need to + // do as below, except insertion/updating. However, we do not + // want to incurr a calculation in order to get a more + // accurate debug numbers. So we simply: + self.debug_reject_count += 1 + return 3 + } + + // 2016090* ROBUSTNESS: We need to put a limit on the number of + // (signer_pubkey,hash) pairs that we process and forward. One + // reason is to prevent an attack in which the attacker launches a + // large number of nodes each of which make valid blocks, thus + // causing large traffic that can potentially degrade the network + // performance. Example: when we receive, say 63 + // (signer_pubkey,hash) pairs for a given seqno, we stop listening + // for the updates. Say, the breakdown is: hash H1 from 50 + // signers, hash H2 from 10, hash H3 from 2 and hash H4 from 1. + // We make a local decision to choose H1. + if self.accept_count >= Cfg_consensus_max_candidate_messages { + self.debug_neglect_count += 1 + return 1 // same as skip + } + + // 20160913 Remember that we move those BlockStat that are old + // enought (seqno difference is used as a measure of time + // difference) to BlockChain, so that the storage requerement for + // each node is now smaller. Yet we keep the limits to avoid + // excessive forwarding. + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var info HashCandidate + + if true { + var have bool + + info, have = self.hash2info[hash] + + if !have { + info = HashCandidate{} + info.Init() + action_insert = true + } else { + if _, saw := info.sig2none[sig]; saw { + action_skip = true + } else { + action_update = true + } + } + } + + if action_insert || action_update { + + if sig == all_zero_sig || hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // PERFORMANCE: This is an expensive call: + signer_pubkey, err := cipher.PubKeyFromSig(sig, hash) + if err != nil { + return 4 // <<<<<<<< + } + + // Now do the check that we could not do prior to + // obtaining 'signer_pubkey': + if _, have := info.pubkey2sig[signer_pubkey]; have { + // WARNING: ROBUSTNESS: The pubkey 'signer_pubkey' has + // already published data with the same hash and same + // seqno. This is not a duplicate data: the duplicates + // have been intercepted earlier bsaged in (hash,sig) + // pair; instead, the pubkey signed the block again and + // published the result. So this can be a bug/mistake or + // an attempt to artificially increase the traffic on our + // network. + self.debug_reject_count += 1 + + action_update = false + action_skip = true + action_insert = false + + fmt.Printf("WARNING: %p, Detected malicious publish from"+ + " pubkey=%s for hash=%s sig=%s\n", &info, + signer_pubkey.Hex()[:8], hash.Hex()[:8], sig.Hex()[:8]) + } + + // These bools could have change, see above: + if action_insert || action_update { + if false { + fmt.Printf("Calling %p->ObserveSigAndPubkey(sig=%s,"+ + " signer_pubkey=%s), hash=%s\n", &info, + sig.Hex()[:8], signer_pubkey.Hex()[:8], hash.Hex()[:8]) + } + info.ObserveSigAndPubkey(sig, signer_pubkey) + self.accept_count += 1 + } + } + + if action_insert { + self.hash2info[hash] = info + } + + self.debug_count += 1 + self.debug_usage += 1 + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent BlockStat::try_add_hash_and_sig()") + // return -1 + //} + + if action_update || action_insert { + return 0 + } + + if action_skip { + return 1 + } + + return -1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) GetBestHashPubkeySig() ( + cipher.SHA256, + cipher.PubKey, + cipher.Sig) { + + var best_n int = -1 + + var best_h cipher.SHA256 + + for hash, info := range self.hash2info { + n := len(info.pubkey2sig) + + if best_n < n { + best_n = n + best_h = hash + } else if best_n == n { + // Resolve ties by comparing hashes: + if bytes.Compare(best_h[:], hash[:]) < 0 { + // Updating 'best_n' is unnecessary, but keep it here + // to help avoiding cut-and-paste errors: + best_n = n + best_h = hash + } + } + } + + if best_n <= 0 { + return cipher.SHA256{}, cipher.PubKey{}, cipher.Sig{} // <<<<<<<< + } + + var best_p cipher.PubKey + var best_s cipher.Sig + + // Resolve ties (if any) by comparing signatures. Do not use + // pubkey for this purpose as we do not want, for example, to have + // same pubkey sign most of blocks. + + // NOTE 1: We want a deterministic algo here, so that each + // ConsensusParticipant across the network would choose same + // (hash,sig) to go to blockchain. + + // NOTE 2: A simplified version of consensus can be imagined, in + // which ConsensusParticipant rejects a hash if it saw it already; + // this results in local blockchains with same transactions [when + // consensus id reached] but *different* signers. Which is not + // good from general entropy considerations. + initialized := false + + for pubkey, sig := range self.hash2info[best_h].pubkey2sig { + if initialized { + if bytes.Compare(best_s[:], sig[:]) < 0 { + best_p = pubkey + best_s = sig + } + } else { + best_p = pubkey + best_s = sig + + initialized = true + } + } + + return best_h, best_p, best_s +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStat) Print() { + + hash, _, _ := self.GetBestHashPubkeySig() + fmt.Printf("BlockStat={count(hash)=%d,count(pubkey)=%d,count(event)=%d"+ + ",accept_count=%d,seqno=%d,debug_usage=%d,frozen=%t,"+ + "debug_reject_count=%d,debug_neglect_count=%d,best_hash=%s}", + len(self.hash2info), + len(self.debug_pubkey2count), + self.debug_count, + self.accept_count, + self.seqno, + self.debug_usage, + self.frozen, + self.debug_reject_count, + self.debug_neglect_count, + hash.Hex()[:8]) +} + +//////////////////////////////////////////////////////////////////////////////// +type PriorityQueue []*BlockStat // Contained in BlockStatQueue + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Len() int { + return len(pq) +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Less(i int, j int) bool { + return pq[i].priority < pq[j].priority +} + +// NOTE: a shallow copy (of the slice) is made here +func (pq PriorityQueue) Swap(i int, j int) { + pq[i], pq[j] = pq[j], pq[i] + pq[i].index = i + pq[j].index = j +} +func (pq *PriorityQueue) Push(x interface{}) { + n := len(*pq) + item := x.(*BlockStat) + item.index = n + *pq = append(*pq, item) +} +func (pq *PriorityQueue) Pop() interface{} { + old := *pq + n := len(old) + item := old[n-1] + item.index = -1 // for safety + *pq = old[0 : n-1] + return item +} + +// update modifies the priority and value of an Item in the queue. +func (pq *PriorityQueue) update_priority(item *BlockStat, priority int) { + item.priority = priority + heap.Fix(pq, item.index) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockStatQueue +// +//////////////////////////////////////////////////////////////////////////////// +type BlockStatQueue struct { + // BlockStatQueue is a wrapper around a priority queue; the latter + // is prioretized by Block seqno. The wrapper provides setters and + // getters. The setters trim queue size as appropriate. + queue PriorityQueue +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) is_consistent() bool { + // TODO: implement. + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Len() int { + return len(self.queue) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) Print() { + n := len(self.queue) + fmt.Printf("BlockStatQueue={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.queue[i].Print() + } + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockStatQueue) try_append_to_BlockStatQueue( + blockPtr *BlockBase) int { + + // Use a superficial, quick test here. A thorough check will be + // done later in this function. + if secp256k1.VerifySignatureValidity(blockPtr.Sig[:]) != 1 { + return 4 // Error + } + + if blockPtr.Sig == all_zero_sig || blockPtr.Hash == all_zero_hash { // Hack + return 4 // <<<<<<<< + } + + // At the end of the function, one of them must be 'true'. + action_update := false + action_skip := false + action_insert := false + + var update_index int = -1 + + n := len(self.queue) + if n > 0 { + f := self.queue[0] + l := self.queue[n-1] + // ROBUSTNESS Set a max to what 'f - l' can be. For example, + // if the limit is 100 and the queue has only one block with + // seqno 7, then do not accept blocks with seqno >= + // 107. This is to prevent Memory Overflow attack. + + if blockPtr.Seqno < f.seqno { + // TODO: Accept, unless 'f.seqno - 1' is already in the + // (consented) blockchain; otherwise reject/ignore. FOR + // NOW, accept unless queue length would be too large. + + // + // + // TODO: evaluae -------------------- URGENT !!!!! + // + // + already_in_blockchain := false + // + // + // + // + if already_in_blockchain { + fmt.Print("DEBUG Already in blockchain. Ignoring block.\n") + action_skip = true + } else if l.seqno-blockPtr.Seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " behind. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + + } else if blockPtr.Seqno > l.seqno { + // TODO: Accept, unless 'blockPtr.seqno > l.seqno' is + // large, e.g. the perceived block is way ahead of the + // last block in the queue. FOR NOW, accept unless queue + // length would be too large. + if blockPtr.Seqno-f.seqno > + Cfg_consensus_candidate_max_seqno_gap { + fmt.Printf("DEBUG proposed=%d, first=%d, last=%d. Too far"+ + " ahead. Ignoring block.\n", + blockPtr.Seqno, f.seqno, l.seqno) + action_skip = true + } else { + action_insert = true + } + } else { + // The 'blockPtr.seqno' is in between, so we need to insert + // a new or find the element with same seqno and update it. + + // PERFORMANCE TODO: Avoid linear search by using a + // lookup, or using other properties of Heap object. If + // n/a, use Binary Search. + S := blockPtr.Seqno + found := false + for i := range self.queue { + s := self.queue[i].seqno + if s < S { + // keep searching + } else if s == S { + found = true + action_update = true + update_index = i + break + } else if s > S { + break + } + } + if !found { + action_insert = true + } + } + } else { + // The queue is empty, so insert the block. + action_insert = true + } + n = -1 // guard + + //if !(action_update || action_skip || action_insert) { + // panic("Inconsistent") + // return -1 + //} + + var status_code int = 1 + + if !action_skip { + + // TAG Consensus: if we receive 100 copies of a Block (or + // Block's hash) that originated from the same block maker, + // then the statistical significance of them is not higher + // than that of only 1 copy. The significance is roughly + // proportional to sqrt of the number of different [ideally, + // independent-thinking] signers for a Block with the same + // hash and same seqno. + + should_forward_to_subscribers := false + + if action_update { + + res := self.queue[update_index]. + try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + if res == 0 { + should_forward_to_subscribers = true + } + + } else if action_insert { + + bs := BlockStat{} + bs.Init() + bs.seqno = blockPtr.Seqno + res := bs.try_add_hash_and_sig(blockPtr.Hash, blockPtr.Sig) + + if res == 0 { + // Keep these two together: + heap.Push(&self.queue, &bs) + self.queue.update_priority(&bs, int(blockPtr.Seqno)) + // TODO: Above, try to remove the cast. + + should_forward_to_subscribers = true + } + } + + if should_forward_to_subscribers { + status_code = 0 + } + + } + + return status_code +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/connection_manager.go b/vendor/github.com/skycoin/skycoin/src/consensus/connection_manager.go new file mode 100755 index 0000000..d69a506 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/connection_manager.go @@ -0,0 +1,25 @@ +// nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +//"github.com/skycoin/skycoin/src/cipher" + +//////////////////////////////////////////////////////////////////////////////// +type ConnectionManagerInterface interface { + SendBlockToAllMySubscriber(blockPtr *BlockBase) + + Print() // For debugging + + // IMPORTANT: When connection manager (i.e. an implementation of + // this interface) receives a message with 'BlockBase', the + // manager should call + // + // ConsensusParticipant.OnBlockHeaderArrived(blockPtr *BlockBase) + // + // function. This is not currently enforced, but is required for the + // consensus to work properly. +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/consensus.go b/vendor/github.com/skycoin/skycoin/src/consensus/consensus.go new file mode 100755 index 0000000..d4b4e01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/consensus.go @@ -0,0 +1,257 @@ +// nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +var Cfg_debug_block_duplicate bool = false +var Cfg_debug_block_out_of_sequence bool = true +var Cfg_debug_block_accepted bool = false +var Cfg_debug_HashCandidate bool = false + +// How many blocks we hold in memory. Older blocks are expected (not +// implemented yest as of 20160920) to be written to disk. +var Cfg_blockchain_tail_length int = 100 + +// To limit memory use and prevent some mild attacks: +var Cfg_consensus_candidate_max_seqno_gap uint64 = 10 + +// When to decide on selecting the best hash from BlockStat +// so that it can be moved to BlockChain: +var Cfg_consensus_waiting_time_as_seqno_diff uint64 = 7 + +// How many (hash,signer_pubkey) pairs to acquire for decision-making. +// This also limits forwarded traffic, because the messages in excess +// of this limit are discarded hence not forwarded: +//var Cfg_consensus_max_candidate_messages = 10 + +// +//////////////////////////////////////////////////////////////////////////////// +//var all_zero_hash = cipher.SHA256{} +//var all_zero_sig = cipher.Sig{} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockBase +// +//////////////////////////////////////////////////////////////////////////////// +type BlockBase struct { + Sig cipher.Sig + Hash cipher.SHA256 + Seqno uint64 +} + +//func (self *BlockBase) GetSig() cipher.Sig { return self.Sig } +//func (self *BlockBase) GetHash() cipher.SHA256 { return self.Hash } +//func (self *BlockBase) GetSeqno() uint64 { return self.Seqno } + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Init( + sig cipher.Sig, + hash cipher.SHA256, + seqno uint64) { + + self.Sig = sig + self.Hash = hash + self.Seqno = seqno +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) Print() { + fmt.Printf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockBase) String() string { + return fmt.Sprintf("BlockBase={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} + +//////////////////////////////////////////////////////////////////////////////// +// +// BlockchainTail is the most recent part of blockchain that is held in memory +// +//////////////////////////////////////////////////////////////////////////////// +type BlockchainTail struct { + // The tail of Blockchain that we keep. + // PERFORMANCE: TODO: Use a fixed-length double-ended queue + + blockPtr_slice []*BlockBase + // This is for a lookup of content + hash_to_blockPtr_map map[cipher.SHA256]*BlockBase +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Init() { + self.hash_to_blockPtr_map = make(map[cipher.SHA256]*BlockBase) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) is_consistent() bool { + // TODO Validate + // blockPtr_slice + // and + // hash_to_blockPtr_map + // against each other + return true +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) append_nocheck(blockPtr *BlockBase) { + n := len(self.blockPtr_slice) + if n+1 > Cfg_blockchain_tail_length { + // Trim the size: + b0p := self.blockPtr_slice[0] + delete(self.hash_to_blockPtr_map, b0p.Hash) // pop 1 of 2 + b0p = nil + self.blockPtr_slice[0] = nil + self.blockPtr_slice = self.blockPtr_slice[1:] // pop 2 of 2 + } + // Append + self.hash_to_blockPtr_map[blockPtr.Hash] = blockPtr // push 1 of 2 + self.blockPtr_slice = append(self.blockPtr_slice, blockPtr) // push 2 of 2 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) try_append_to_BlockchainTail(blockPtr *BlockBase) int { + n := len(self.blockPtr_slice) + if n > 0 { + // Step 1 of 2: check for presence: + _, have := self.hash_to_blockPtr_map[blockPtr.Hash] + if have { + if Cfg_debug_block_duplicate { + // Duplicate hash detected. Silently ignore it. We + // expect to have this condition often enough. + fmt.Printf("Block is duplicate so ignored.\n") + } + return 1 // Duplicate hash + } + // Step 2 of 2: check for sequence numbers: + curr := self.blockPtr_slice[n-1].Seqno // Most recent + next := curr + 1 + prop := blockPtr.Seqno + if prop < next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too low (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 2 // SeqNo too low + } else if prop > next { // uint cmp + if Cfg_debug_block_out_of_sequence { + fmt.Printf("Block's seqno is too high (%d vs %d), block"+ + " ignored.\n", prop, curr) + } + return 3 // SeqNo too high + } + } + self.append_nocheck(blockPtr) + if Cfg_debug_block_accepted { + fmt.Printf("Block is accepted, len(blockchain)=%d.\n", + len(self.blockPtr_slice)) + } + return 0 // Inserted +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) GetNextSeqNo() uint64 { + n := len(self.blockPtr_slice) + if n > 0 { + return 1 + self.blockPtr_slice[n-1].Seqno + } + return 1 +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *BlockchainTail) Print() { + n := len(self.blockPtr_slice) + fmt.Printf("BlockchainTail={n=%d", n) + + for i := 0; i < n; i++ { + fmt.Print(",") + self.blockPtr_slice[i].Print() + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// HashCandidate +// +//////////////////////////////////////////////////////////////////////////////// +type HashCandidate struct { + pubkey2sig map[cipher.PubKey]cipher.Sig // Primary data + sig2none map[cipher.Sig]byte // Lookup without (expensive) pubkey recovery +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Init() { + self.pubkey2sig = make(map[cipher.PubKey]cipher.Sig) + self.sig2none = make(map[cipher.Sig]byte) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) ObserveSigAndPubkey( + sig cipher.Sig, + pubkey cipher.PubKey) { + + if Cfg_debug_HashCandidate { + for k, v := range self.pubkey2sig { + fmt.Printf("HashCandidate %p pubkey2sig: pubkey=%s sig=%s\n", + self, k.Hex()[:8], v.Hex()[:8]) + } + for k, _ := range self.sig2none { + fmt.Printf("HashCandidate %p sig2none: sig=%s\n", self, k.Hex()[:8]) + } + } + + self.pubkey2sig[pubkey] = sig + self.sig2none[sig] = byte('1') + + n1 := len(self.pubkey2sig) + n2 := len(self.sig2none) + if n1 != n2 { + fmt.Printf("Inconsistent HashCandidate: n1=%d n2=%d\n", n1, n2) + panic("Oops") + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) Clear() { + for i, _ := range self.pubkey2sig { + delete(self.pubkey2sig, i) + } + for i, _ := range self.sig2none { + delete(self.sig2none, i) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *HashCandidate) is_consistent() bool { + // TODO: implement + // NOTE: sig <- (hash,pubkey) is not deterministic, + // so + // len(self.pubkey2sig) + // len(self.sig2none) + // are not necessarily the same, even if same 'hash' was signed. + // The code of class BlockStat prevents calling + // ObserveSigAndPubkey() using same 'pubkey' and different 'sig', so + // the two lengths should be the same. TODO: move this detection + // to this class. + + return true +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/consensus_test.go b/vendor/github.com/skycoin/skycoin/src/consensus/consensus_test.go new file mode 100755 index 0000000..a6a5bf7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/consensus_test.go @@ -0,0 +1,208 @@ +// nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "testing" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/secp256k1-go" +) + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_01(t *testing.T) { + bq := BlockchainTail{} + bq.Init() + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_02(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + // Use more than configured length to ensure some elements are + // removed: + n := Cfg_blockchain_tail_length * 2 + + for i := 0; i < n; i++ { + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + + b := BlockBase{Hash: h, Seqno: uint64(i)} // OK to leave '.sig' empty + + bq.append_nocheck(&b) + } + + if len(bq.blockPtr_slice) != Cfg_blockchain_tail_length { + t.Log("BlockchainTail::append_nocheck() incorrect append or remove.") + t.Fail() + } + + if !bq.is_consistent() { + t.Log("BlockchainTail::is_consistent()") + t.Fail() + } +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockchainTail_03(t *testing.T) { + + bq := BlockchainTail{} + bq.Init() + + h1 := cipher.SumSHA256(secp256k1.RandByte(888)) + b1 := BlockBase{Hash: h1, Seqno: 1} // OK to leave '.sig' empty + + r1 := bq.try_append_to_BlockchainTail(&b1) + if r1 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): initial insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b1.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + r1dup := bq.try_append_to_BlockchainTail(&b1) + if r1dup != 1 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): duplicate hash not detected.") + t.Fail() + } + + h2 := cipher.SumSHA256(secp256k1.RandByte(888)) + b2 := BlockBase{Hash: h2, Seqno: 2} // OK to leave '.sig' empty + + r2 := bq.try_append_to_BlockchainTail(&b2) + if r2 != 0 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): next insert failed.") + t.Fail() + } + if bq.GetNextSeqNo() != b2.Seqno+1 { + t.Log("BlockchainTail::GetNextSeqNo() failed.") + t.Fail() + } + + h3 := cipher.SumSHA256(secp256k1.RandByte(888)) + b3 := BlockBase{Hash: h3, Seqno: 0} // OK to leave '.sig' empty + + r3 := bq.try_append_to_BlockchainTail(&b3) + if r3 != 2 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): low seqno not detected. ret=", r3) + t.Fail() + } + + b3.Seqno = 4 + r4 := bq.try_append_to_BlockchainTail(&b3) + if r4 != 3 { + t.Log("BlockchainTail::try_append_to_BlockchainTail(): high seqno not detected.") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_01(t *testing.T) { + bs := BlockStat{} + bs.Init() + + _, seckey := cipher.GenerateKeyPair() + hash := cipher.SumSHA256(secp256k1.RandByte(888)) + sig := cipher.SignHash(hash, seckey) + + var r int = -1 + + r = bs.try_add_hash_and_sig(hash, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, sig) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + r = bs.try_add_hash_and_sig(cipher.SHA256{}, cipher.Sig{}) + if r != 4 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect invalid hash and signature.") + t.Fail() + } + + //signer_pubkey, err := cipher.PubKeyFromSig(cipher.Sig{}, cipher.SHA256{}) + //if err != nil { + //fmt.Printf("Got pubkey='%s' from all-zero sig and all-zero hash.\n", signer_pubkey.Hex()) + //} + + bs.frozen = true + r2 := bs.try_add_hash_and_sig(hash, sig) + if r2 != 3 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect frozen.") + t.Fail() + } + bs.frozen = false + + r3 := bs.try_add_hash_and_sig(hash, sig) + if r3 != 0 { + t.Log("BlockStat::try_add_hash_and_sig() failed to add.") + t.Fail() + } + + sig2 := cipher.SignHash(hash, seckey) // Redo signing. + r4 := bs.try_add_hash_and_sig(hash, sig2) + if r4 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,pubkey).") + t.Fail() + } + + r5 := bs.try_add_hash_and_sig(hash, sig) + if r5 != 1 { + t.Log("BlockStat::try_add_hash_and_sig() failed to detect duplicate (hash,sig).") + t.Fail() + } + +} + +//////////////////////////////////////////////////////////////////////////////// +func TestBlockStat_02(t *testing.T) { + bs := BlockStat{} + bs.Init() + + hash1 := cipher.SumSHA256(secp256k1.RandByte(888)) + n1 := 3 + + for i := 0; i < n1; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.SignHash(hash1, seckey) + bs.try_add_hash_and_sig(hash1, sig) + } + + hash2 := cipher.SumSHA256(secp256k1.RandByte(888)) + n2 := 2 + + for i := 0; i < n2; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.SignHash(hash2, seckey) + bs.try_add_hash_and_sig(hash2, sig) + } + + hash3 := cipher.SumSHA256(secp256k1.RandByte(888)) + n3 := 1 + + for i := 0; i < n3; i++ { + _, seckey := cipher.GenerateKeyPair() + sig := cipher.SignHash(hash3, seckey) + bs.try_add_hash_and_sig(hash3, sig) + } + + best_hash, _, _ := bs.GetBestHashPubkeySig() + if best_hash != hash1 { + t.Log("BlockStat::try_add_hash_and_sig() or BlockStat::GetBestHashPubkeySig() issue.") + t.Fail() + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/example/README.md b/vendor/github.com/skycoin/skycoin/src/consensus/example/README.md new file mode 100755 index 0000000..8b13789 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/example/README.md @@ -0,0 +1 @@ + diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/example/example.go b/vendor/github.com/skycoin/skycoin/src/consensus/example/example.go new file mode 100755 index 0000000..c3bdd78 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/example/example.go @@ -0,0 +1,767 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + mathrand "math/rand" + "os" + "sort" + // + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 100 +var Cfg_simu_num_blockmaker int = 10 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, + iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + for i, _ := range X { + cm := X[i] + for g := 0; g < Cfg_simu_fanout_per_node; g++ { + j := mathrand.Intn(Cfg_simu_num_node) + if i != j { + cm.RegisterPublisher(X[j]) + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + } + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if true { + if block_round < Cfg_simu_num_block_round { + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/example/example_gnet.go b/vendor/github.com/skycoin/skycoin/src/consensus/example/example_gnet.go new file mode 100755 index 0000000..b60fbc7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/example/example_gnet.go @@ -0,0 +1,1043 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +// +// WARNING: WARNING: WARNING: Do NOT use this code for obtaining any +// research results. This file is only an illustration. A realistic +// simulation would require to have (i) nonzero latencies for event +// propagation and (ii) an event queue inside the implementation of +// MeshNetworkInterface. +// + +import ( + "flag" + "fmt" + "log" + mathrand "math/rand" + "os" + "sort" + "time" + + "github.com/skycoin/skycoin/src/daemon/gnet" + // + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/consensus" +) + +var Cfg_print_config bool = true +var Cfg_debug_connect_request bool = false +var Cfg_debug_node_final_state bool = false +var Cfg_debug_node_summary bool = false +var Cfg_debug_show_block_maker bool = false + +var Cfg_simu_topology_is_random bool = true + +var Cfg_simu_num_node int = 10 +var Cfg_simu_num_blockmaker int = 2 +var Cfg_simu_prob_malicious float64 = 0.0 +var Cfg_simu_prob_duplicate float64 = 0.0 + +var Cfg_simu_num_block_round int = 10 +var Cfg_simu_fanout_per_node int = 3 + +// Will be reset later, based on values of other parameters: +var Cfg_simu_num_iter int = 0 + +var common_channel uint16 = 3 + +//////////////////////////////////////////////////////////////////////////////// +func pretty_print_flags(prefix string, detail bool) { + if detail { + + max1 := 0 + max2 := 0 + + flag.VisitAll(func(f *flag.Flag) { + len1 := len(f.Name) + len2 := len(fmt.Sprintf("%v", f.Value)) + if max1 < len1 { + max1 = len1 + } + if max2 < len2 { + max2 = len2 + } + }) + + format := fmt.Sprintf(" --%%-%ds %%%dv %%s\n", max1, max2) + format = "%s" + format + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf(format, prefix, f.Name, f.Value, f.Usage) + }) + + } else { + + flag.VisitAll(func(f *flag.Flag) { + fmt.Printf("%s--%s=%v\n", prefix, f.Name, f.Value) + }) + + } +} + +//////////////////////////////////////////////////////////////////////////////// +func cmd_line_args_process() { + + var ip *int = nil + var qp *uint64 = nil + var dp *float64 = nil + var bp *bool = nil + + // + // Simulation parameters + // + ip = &Cfg_simu_num_node + flag.IntVar(ip, "simu-num-nodes", *ip, "Number of nodes in the network.") + + ip = &Cfg_simu_num_blockmaker + flag.IntVar(ip, "simu-num-blockmaker", *ip, + "Number of nodes in the network that make blocks.") + + dp = &Cfg_simu_prob_malicious + flag.Float64Var(dp, "simu-prob-malicious", *dp, + "Probability that a node temporarily joins a malicious group that"+ + " publishes same block in order to cause a fork of the blockchain.") + + dp = &Cfg_simu_prob_duplicate + flag.Float64Var(dp, "simu-prob-duplicate", *dp, + "Probability that a node sends a duplicate message with same hash but"+ + " different signature. (Duplicate (hash,sig) pairs are easily"+ + " detected and discarded.)") + + ip = &Cfg_simu_num_block_round + flag.IntVar(ip, "simu-num-rounds", *ip, + "Number of block rounds. When all them are published and the"+ + " resulting messages propagate, the simulation ends.") + + ip = &Cfg_simu_fanout_per_node + flag.IntVar(ip, "simu-fanout-per-node", *ip, + "Number of incoming (and outgoing) connections to (and from) each"+ + " node.") + + bp = &Cfg_debug_connect_request + flag.BoolVar(bp, "debug-connect-request", *bp, "") + + bp = &Cfg_print_config + flag.BoolVar(bp, "print-config", *bp, "") + + bp = &Cfg_debug_node_final_state + flag.BoolVar(bp, "debug-node-final-state", *bp, "") + + bp = &Cfg_debug_node_summary + flag.BoolVar(bp, "debug-node-summary", *bp, "") + + bp = &Cfg_debug_show_block_maker + flag.BoolVar(bp, "debug-show-block-maker", *bp, "") + + bp = &Cfg_simu_topology_is_random + flag.BoolVar(bp, "simu-topology-is-random", *bp, + "Connect nodes randomly or place them in one circle.") + + // + // Consensus parameters + // + + bp = &consensus.Cfg_debug_block_duplicate + flag.BoolVar(bp, "debug-block-duplicate", *bp, "") + + bp = &consensus.Cfg_debug_block_out_of_sequence + flag.BoolVar(bp, "debug-block-out-of-sequence", *bp, "") + + bp = &consensus.Cfg_debug_block_accepted + flag.BoolVar(bp, "debug-block-accepted", *bp, "") + + bp = &consensus.Cfg_debug_HashCandidate + flag.BoolVar(bp, "debug-hash-candidate", *bp, "") + + ip = &consensus.Cfg_blockchain_tail_length + flag.IntVar(ip, "blockchain-tail-length", *ip, + "Blocks held in memory. This limits memory usage.") + + qp = &consensus.Cfg_consensus_candidate_max_seqno_gap + flag.Uint64Var(qp, "consensus-candidate-max-seqno-gap", *qp, + "Proposed blocks (or consensus candidates) are ignored if theie seqno"+ + " is too high or too low w.r.t. what is stored. This limits memory"+ + " use and helps prevents some mild attacks.") + + qp = &consensus.Cfg_consensus_waiting_time_as_seqno_diff + flag.Uint64Var(qp, "consensus-waiting-time-as-seqno-diff", *qp, + "When to decide on selecting the best hash from BlockStat"+ + " so that it can be moved to blockchain.") + + ip = &consensus.Cfg_consensus_max_candidate_messages + flag.IntVar(ip, "consensus-max-candidate-messages", *ip, + "How many (hash,signer_pubkey) pairs to acquire for decision-making."+ + " This also limits forwarded traffic, because the messages in excess"+ + " of this limit are discarded hence not forwarded.") + + // + // + // + show := flag.Bool("show", false, "Show current parameter values and exit.") + + // + // + flag.Parse() + // + // + + if Cfg_simu_num_node < Cfg_simu_num_blockmaker { + fmt.Printf("Invalid input: --simu-num-nodes=%d < --simu-num-blockmaker="+ + "%d. Exiting.\n", Cfg_simu_num_node, Cfg_simu_num_blockmaker) + os.Exit(1) + } + + if Cfg_simu_prob_malicious < 0. || 1 < Cfg_simu_prob_malicious { + fmt.Printf("Invalid input: --simu-prob-malicious=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + if Cfg_simu_prob_duplicate < 0. || 1 < Cfg_simu_prob_duplicate { + fmt.Printf("Invalid input: --simu-prob-duplicate=%g is outside"+ + " [0 .. 1] range. Exiting.\n", Cfg_simu_prob_malicious) + os.Exit(1) + } + + // + // Derived parameters + // + + // Most likely we do not need that many. However, we keep the + // number high so it would not interfere with message propagation + // by premature exit from the vent loop. Yet we keep it finite to + // prevent an infinite run that can be caused by a bug: + + Cfg_simu_num_iter = 10 * // '10' is a heuristic + Cfg_simu_num_node * Cfg_simu_num_blockmaker * + Cfg_simu_num_block_round * Cfg_simu_fanout_per_node + + if *show { + pretty_print_flags("", true) + os.Exit(1) + } else { + if Cfg_print_config { + pretty_print_flags("FILE_Config.txt|", false) + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// The body of this function lends itself to something like +// +// ConsensusParticipant::BuildAndPropagateNewBlock() +// +// Before doing so, ConsensusParticipant would need to accumulate +// transactions, possibly negotiate with others as to who makes blocks +// etc. FOR NOW, any node can make (and publish) blocks. +// +func propagate_hash_from_node( + h cipher.SHA256, + nodePtr *consensus.ConsensusParticipant, + external_use bool, + external_seqno uint64) { + + // + // WARNING: Do NOT use this code for obtaining any research + // results. This file is only an illustration. A realistic + // simulation require to have nonzero latencies for event + // propagation and to have an event queueu inside the + // implementation of MeshNetworkInterface. + // + + o := external_seqno // HACK for DEBUGGING + if !external_use { + o = nodePtr.GetNextBlockSeqNo() // So that blocks are ordered. + } + + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), // Signature of hash. + h, + o) + + nodePtr.OnBlockHeaderArrived(&b) +} + +//////////////////////////////////////////////////////////////////////////////// +// MESSAGE +type BlockBaseWrapper struct { + consensus.BlockBase +} + +func (self *BlockBaseWrapper) String() string { + return fmt.Sprintf("BlockBaseWrapper={Sig=%s,Hash=%s,Seqno=%d}", + self.Sig.Hex()[:8], self.Hash.Hex()[:8], self.Seqno) +} +func (self *BlockBaseWrapper) Handle(context *gnet.MessageContext, closure interface{}) error { + + if false { + fmt.Printf("@@@ consensus.BlockBase Handle: context={%v} closure={%v} data={%v}\n", context, closure, self) + } + + arg := closure.(*PoolOwner) + arg.DataCallback(context, self) + return nil +} + +//array of messages to register +var messageMap map[string](interface{}) = map[string](interface{}){ + "id01": BlockBaseWrapper{}, //message id, message type +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type PoolOwner struct { + pCMan *MinimalConnectionManager + + pDispatcherManager *gnet.DispatcherManager + pDispatcher *gnet.Dispatcher + pConnectionPool *gnet.ConnectionPool + // + isConnSolicited map[string]bool // Addr -> bool + // + key_list []string // To preserve the order. + key_map map[string]byte // To avoid duplicates. + // + debug_num_id int + debug_nickname string +} + +func (self *PoolOwner) Shutdown() { + self.pConnectionPool.Shutdown() +} + +func (self *PoolOwner) Init(pCMan *MinimalConnectionManager, listen_port uint16, num_id int, nickname string) { + + config := gnet.NewConfig() + config.Port = uint16(listen_port) + + cp := gnet.NewConnectionPool(config) + + dm := gnet.NewDispatcherManager() + + self.isConnSolicited = make(map[string]bool) + + cp.Config.MessageCallback = dm.OnMessage + cp.Config.ConnectCallback = self.OnConnect + cp.Config.DisconnectCallback = self.OnDisconnect + + d := dm.NewDispatcher(cp, common_channel, self) + d.RegisterMessages(messageMap) + + self.pCMan = pCMan + self.pDispatcherManager = dm + self.pDispatcher = d + self.key_map = make(map[string]byte) + self.pConnectionPool = cp + + self.debug_num_id = num_id + self.debug_nickname = nickname +} + +func (self *PoolOwner) Run() { + + cp := self.pConnectionPool // alias + + if cp.Config.Port != 0 { + if err := cp.StartListen(); err != nil { + log.Panic(err) + } + go cp.AcceptConnections() + } + + go func() { + for true { + // [JSM] 20161025 The 'Sleep' below is a workaround of + // unresolve concurrency issues in file gnet/pool.go + // class ConnectionPool. + time.Sleep(time.Millisecond * 1) + cp.HandleMessages() + } + }() + +} +func (self *PoolOwner) DataCallback(context *gnet.MessageContext, xxx *BlockBaseWrapper) { + + if self.isConnSolicited[context.Conn.Addr()] { + + var msg consensus.BlockBase + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.pCMan.GetNode().OnBlockHeaderArrived(&msg) + + } else { + // Ignoring + } +} +func (self *PoolOwner) OnConnect(c *gnet.Connection, is_solicited bool) { + self.isConnSolicited[c.Addr()] = is_solicited + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on connect, such as request + // initial values from solicited, authenticate the client + // from unsolicited one etc. + _ = channel + _ = pDispatcher + } + } +} +func (self *PoolOwner) OnDisconnect(c *gnet.Connection, reason gnet.DisconnectReason) { + + if false { + for channel, pDispatcher := range self.pDispatcherManager.Dispatchers { + // (BTW, pDispatcher.ReceivingObject is '&PoolOwner') + + // Each channel (or subscription subject) might require + // specific action to be taken on disconnect, such as + // reconnect, clean up etc. + _ = channel + _ = pDispatcher + } + } + + delete(self.isConnSolicited, c.Addr()) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RequestConnectionToKeys() { + for _, key := range self.key_list { + go func(arg string) { + _, err := self.BlockingConnectToUrl(arg) + if err != nil { + log.Panic(err) + } + }(key) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *PoolOwner) RegisterKey(key string) bool { + + if _, have := self.key_map[key]; have { + return false // Let caller handle his issues. + } + + self.key_list = append(self.key_list, key) + self.key_map[key] = byte('1') + + return true + +} +func (self *PoolOwner) GetListenPort() uint16 { + return self.pDispatcher.Pool.Config.Port +} +func (self *PoolOwner) BlockingConnectTo(IPAddress string, port uint16) (*gnet.Connection, error) { + url := fmt.Sprintf("%s:%d", IPAddress, port) + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BlockingConnectToUrl(url string) (*gnet.Connection, error) { + conn, err := self.pDispatcher.Pool.Connect(url) + return conn, err +} +func (self *PoolOwner) BroadcastMessage(msg gnet.Message) error { + return self.pDispatcher.BroadcastMessage(common_channel, msg) +} +func (self *PoolOwner) Print() { + detail := true + + fmt.Printf("PoolOwner={%d,%s,keys={n=%d", + self.debug_num_id, self.debug_nickname, len(self.key_list)) + + if detail { + for _, val := range self.key_list { + fmt.Printf(",%s", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +func print_stat(X []*MinimalConnectionManager, iter int) { + + n := 0 + for i, _ := range X { + n += X[i].GetNode().Incoming_block_count + } + + msg_per_node_per_round := + float64(n) / float64(Cfg_simu_num_node*Cfg_simu_num_block_round) + + msg_per_node_per_round_per_link := msg_per_node_per_round / + float64(Cfg_simu_fanout_per_node) + + msg_per_node_per_round_per_blockmaker := msg_per_node_per_round / + float64(Cfg_simu_num_blockmaker) + + // Print for viewing: + fmt.Printf( + "MSG_STAT iter %d\n"+ + "MSG_STAT msg_count_all %d\n"+ + "MSG_STAT num_node %d\n"+ + "MSG_STAT num_blockmaker %d\n"+ + "MSG_STAT num_block_round %d\n"+ + "MSG_STAT fanout_per_node %d\n"+ + "MSG_STAT max_candidate_messages %d (This limits the effect of"+ + " having large num_blockmaker)\n"+ + "MSG_STAT msg_per_node_per_round %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_link %.3f\n"+ + "MSG_STAT msg_per_node_per_round_per_blockmaker %.3f\n", + iter, n, Cfg_simu_num_node, Cfg_simu_num_blockmaker, + Cfg_simu_num_block_round, Cfg_simu_fanout_per_node, + consensus.Cfg_consensus_max_candidate_messages, + msg_per_node_per_round, + msg_per_node_per_round_per_link, + msg_per_node_per_round_per_blockmaker) + +} + +//////////////////////////////////////////////////////////////////////////////// +func Simulate_compare_node_StateQueue( + X []*MinimalConnectionManager, + global_seqno2h map[uint64]cipher.SHA256, + global_seqno2h_alt map[uint64]cipher.SHA256, +) { + // + // Step 1 of 3: for each observed seqno, find the histogram of + // 'best' hash. The historgam is formed by summing over nodes. + // + type QQQ map[uint64]map[cipher.SHA256]int + xxx := make(QQQ) // Access: [seqno][hash]=count + type ZZZ []QQQ // Access: [node][seqno][hash]=count + + ni := len(X) + + zzz := make(ZZZ, ni) + + for i := 0; i < ni; i++ { // Nodes + nj := X[i].GetNode().Get_block_stat_queue_Len() + + zzz[i] = make(map[uint64]map[cipher.SHA256]int) + + for j := 0; j < nj; j++ { // Elements in node's BlockStatQueue + + // 'bs' a pointer: + bs := X[i].GetNode().Get_block_stat_queue_element_at(j) + seqno := bs.GetSeqno() + hash, _, _ := bs.GetBestHashPubkeySig() + + if _, have := xxx[seqno]; !have { + xxx[seqno] = make(map[cipher.SHA256]int) + } + xxx[seqno][hash]++ + + if _, have := zzz[i][seqno]; !have { + zzz[i][seqno] = make(map[cipher.SHA256]int) + } + zzz[i][seqno][hash]++ + } + } + // + // Step 2 of 3. For each seqno, find the most-frequently observed + // hash. Also, find the ratio of blocks accepted to blocks + // published. + // + yyy := make(map[uint64]cipher.SHA256) // Access: [seqno]=hash + + var accept_count int = 0 + var total_count int = 0 + + for seqno, hash2count := range xxx { + var best_count int = 0 + var sum_count int = 0 + var best_hash cipher.SHA256 // undef + + initialized := false + + for hash, count := range hash2count { + if initialized { + if best_count < count { + best_count = count + best_hash = hash + } + } else { + initialized = true + + best_count = count + best_hash = hash + } + sum_count += count + } + + if initialized { + yyy[seqno] = best_hash + + // Here all 'seqno' contribute equally: + accept_count += best_count + total_count += sum_count + } + } + + if true { + keys := []int{} + for seqno, _ := range yyy { + keys = append(keys, int(seqno)) + } + + sort.Ints(keys) + + for _, key := range keys { + seqno := uint64(key) + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + + prescribed := best_hash == global_seqno2h[seqno] + malicious := best_hash == global_seqno2h_alt[seqno] + + fmt.Printf("CONSENSUS: seqno=%d best_hash=%s prescribed=%t"+ + " malicious=%t\n", seqno, best_hash.Hex()[:8], prescribed, + malicious) + } + + } + fmt.Printf("CONSENSUS: total_count=%d accept_count=%d, accept_ratio=%f\n", + total_count, accept_count, float32(accept_count)/float32(total_count)) + + for i, zzz_i := range zzz { + join_count := 0 // How many have selected the most popular hash. + other_count := 0 // How many have selected NOT the most popular. + prescribed_count := 0 // How many have selected the intended hash. + malicious_count := 0 // How many have selected the malicious hash. + + for seqno, hash2count := range zzz_i { + + // Most-frequently accepted (across nodes) for the given seqno: + best_hash := yyy[seqno] + prescribed := global_seqno2h[seqno] + malicious := global_seqno2h_alt[seqno] + + for hash, count := range hash2count { + if hash == best_hash { + join_count += count + } else { + other_count += count + } + + if hash == prescribed { + prescribed_count += count + } + if hash == malicious { + malicious_count += count + } + } + } + + fmt.Printf("NODE i=%d join_count=%d other_count=%d prescribed_count="+ + "%d malicious_count=%d\n", + i, join_count, other_count, prescribed_count, malicious_count) + } +} + +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + + // MinimalConnectionManager solicit a conn to them; receive data + // from them but do not send anything + publishers PoolOwner + + // MinimalConnectionManager accept + // connections. MinimalConnectionManager send data to them; does + // not receive anything; ignores all incoming data + subscribers PoolOwner +} + +func (self *MinimalConnectionManager) Init(listen_port uint16, num_id int, nickname string) { + self.publishers.Init(self, 0, num_id, nickname+";recv_from_pub") + self.subscribers.Init(self, listen_port, num_id, nickname+";send_to_sub") +} +func (self *MinimalConnectionManager) Run() { + self.publishers.Run() + self.subscribers.Run() +} +func (self *MinimalConnectionManager) ShutdownPublishing() { + self.subscribers.Shutdown() +} +func (self *MinimalConnectionManager) ShutdownSubscribing() { + self.publishers.Shutdown() +} +func (self *MinimalConnectionManager) GetListenPort() uint16 { + return self.subscribers.pDispatcher.Pool.Config.Port +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key string) bool { + return self.publishers.RegisterKey(key) +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(xxx *consensus.BlockBase) { + var msg BlockBaseWrapper + msg.Sig = xxx.Sig + msg.Hash = xxx.Hash + msg.Seqno = xxx.Seqno + + self.subscribers.pDispatcher.BroadcastMessage(common_channel, &msg) +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + self.publishers.RequestConnectionToKeys() + + // NOTE: The node does not request connection to subscriber; + // instead, the subscriber request connection to Node. +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(key string) { + fmt.Printf(">>>>>>>>>>>>>>>> GOT HERE. Please cooment this line out >>>>>>>>>>>>>>>>>>>>>>>>>\n") + + // FOR NOW accept all connection request. TODO: check for black + // list, latency table etc. + var acceptable = true + if acceptable { + self.subscribers.RegisterKey(key) + } +} +func (self *MinimalConnectionManager) Print() { + fmt.Printf("ConnectionManager={Pub={") + self.publishers.Print() + fmt.Printf("},Sub={") + self.subscribers.Print() + fmt.Printf("}}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +func get_random_index_subset(N int, S int) []int { + // N - population size + // S - subset size + + if N < 0 { + N = 0 + } + if S < 0 { + S = 0 + } + if S > N { + S = N + } + + index_map := make(map[int]int, S) + if 2*S < N { + // Include at random + for i := 0; i < 3*S; i++ { // '3' is a heuristic + if len(index_map) >= S { + break + } + index_map[mathrand.Intn(N)] = 1 + } + } else { + // Fill up + for i := 0; i < N; i++ { + index_map[i] = 1 + } + n := N - S + // Exclude at random + for i := 0; i < 3*n; i++ { // '3' is a heuristic + if len(index_map) <= S { + break + } + delete(index_map, mathrand.Intn(N)) + } + } + + keys := []int{} + + for k, _ := range index_map { + keys = append(keys, k) + } + + return keys +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + cmd_line_args_process() + + // PERFORMANCE: + cipher.DebugLevel1 = false + cipher.DebugLevel2 = false + + var X []*MinimalConnectionManager + + var hack_global_seqno uint64 = 0 + + seed := "hdhdhdkjashfy7273" + _, SecKeyArray := + cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), Cfg_simu_num_node) + + for i := 0; i < Cfg_simu_num_node; i++ { + var cm MinimalConnectionManager + cm.Init(6060+uint16(i), i, "fox") + + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + s := SecKeyArray[i] + nodePtr.SetPubkeySeckey(cipher.PubKeyFromSecKey(s), s) + + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + if false { + fmt.Printf("Got %d nodes\n", len(X)) + } + + if Cfg_simu_topology_is_random { + + fmt.Printf("CONFIG Topology: connecting %d nodes randomly with approx"+ + " %d nearest-neighbors in and approx %d nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + indices := + get_random_index_subset(Cfg_simu_num_node, Cfg_simu_fanout_per_node) + for _, j := range indices { + if i != j { + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + fmt.Printf("TOPOLOGY: port %d solicits conn to port %d\n", cm.GetListenPort(), X[j].GetListenPort()) + + } + } + } + } else { + + fmt.Printf("CONFIG Topology: connecting %d nodes via one (thick)"+ + " circle with approx %d nearest-neighbors in and approx %d "+ + "nearest-neighbors out.\n", + Cfg_simu_num_node, Cfg_simu_fanout_per_node, + Cfg_simu_fanout_per_node) + + n := len(X) + + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(fmt.Sprintf("127.0.0.1:%d", X[j].GetListenPort())) + } + } + } + + // Start GoRoutines related to connectivity + for i, _ := range X { + X[i].Run() + } + + fmt.Printf("Waiting for start ...\n") + time.Sleep(time.Millisecond * 10) + + // Connect. PROD: This should request connections. The + // connections can be accepted, rejected or never answered. Such + // replies are asynchronous. SIMU: we connect synchronously. + for i, _ := range X { + X[i].RequestConnectionToAllMyPublisher() + } + + fmt.Printf("Waiting for connections ...\n") + time.Sleep(time.Second * 1) + + global_seqno2h := make(map[uint64]cipher.SHA256) + global_seqno2h_alt := make(map[uint64]cipher.SHA256) + + iter := 0 + block_round := 0 + done_processing_messages := false + for ; iter < Cfg_simu_num_iter; iter++ { + + if false { + fmt.Printf("Iteration %d\n", iter) + } + + //fmt.Printf("Waiting for messages to propagate ...\n") + time.Sleep(time.Millisecond * 100) + + if true { + if block_round < Cfg_simu_num_block_round { + + if true { + t := time.Now() + fmt.Printf("wall_time=%02d:%02d:%02d"+ + " block_round=%d\n", t.Hour(), t.Minute(), t.Second(), + block_round) + } + + // NOTE: Propagating blocks from here is a + // simplification/HACK: it implies that we have + // knowledge of when messaging due to previous + // activity (blocks and connections) has + // stopped. Again, we make blocks from here for + // debugging and testing only. + + //x := secp256k1.RandByte(888) // Random data in SIMU. + x := make([]byte, 888) + mathrand.Read(x) + + h := cipher.SumSHA256(x) // Its hash. + + //x_alt := secp256k1.RandByte(888) // Random data in SIMU. + x_alt := make([]byte, 888) + mathrand.Read(x) + h_alt := cipher.SumSHA256(x_alt) // Its hash. + + global_seqno2h[hack_global_seqno] = h + global_seqno2h_alt[hack_global_seqno] = h_alt + + indices := get_random_index_subset(Cfg_simu_num_node, + Cfg_simu_num_blockmaker) + + if Cfg_debug_show_block_maker { + fmt.Printf("block_round=%d, Random indices of block-"+ + "makers: %v\n", block_round, indices) + } + + n_forkers := int(Cfg_simu_prob_malicious * float64(len(indices))) + + for i := 0; i < len(indices); i++ { + // TODO: Have many nodes send same block, and a few nodes + // send a different block. Research the conditions under + // which the block published by the majority would + // dominate the other one. + index := indices[i] + nodePtr := X[index].GetNode() + + malicious := (i < n_forkers) + duplicate := (mathrand.Float64() < Cfg_simu_prob_duplicate) + + ph := &h + if malicious { + ph = &h_alt + } + + rep := 1 + if duplicate { + rep = 2 + } + + // + // WARNING: In a reslistic simulation, one would + // need to remove the assumption of knowing global + // properties such as 'hack_global_seqno' + // + if malicious { + fmt.Printf(">>>>>> NODE (index,pubkey)=(%d,%s) is"+ + " publishing ALTERNATIVE block\n", index, + nodePtr.Pubkey.Hex()[:8]) + } + + for j := 0; j < rep; j++ { + // Signing same hash multiple times produces different + // signatures (for a good reason). We do it + // here to test if malicious re-publishing is + // detected properly. + propagate_hash_from_node(*ph, nodePtr, true, + hack_global_seqno) + } + } + + hack_global_seqno += 1 + block_round += 1 + } else { + done_processing_messages = true + break // <<<<<<<< + } + } + } + + fmt.Printf("Waiting to finish ...\n") + time.Sleep(time.Millisecond * 500) + + zzz := "done" + if !done_processing_messages { + zzz = "***NOT done***" + } + + if false { + // [JSM] Do not call these FOR NOW: ConnectionPool does not + // implement shutdown correctly. + for i, _ := range X { + X[i].ShutdownPublishing() + } + for i, _ := range X { + X[i].ShutdownSubscribing() + } + } + + fmt.Printf("Done (i) making Blocks, %s (ii) processing responses."+ + " See stats on the next few lines. Used iterations=%d, unused"+ + " iterations=%d. Exiting the event loop now.\n", + zzz, iter, Cfg_simu_num_iter-iter) + + print_stat(X, iter) + + if Cfg_debug_node_final_state { + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + } + + if Cfg_debug_node_summary { + Simulate_compare_node_StateQueue(X, global_seqno2h, global_seqno2h_alt) + } +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/example/example_minimal.go b/vendor/github.com/skycoin/skycoin/src/consensus/example/example_minimal.go new file mode 100755 index 0000000..7b22446 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/example/example_minimal.go @@ -0,0 +1,165 @@ +// +build ignore + +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package main + +import ( + "fmt" + mathrand "math/rand" + // + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/secp256k1-go" + "github.com/skycoin/skycoin/src/consensus" +) + +var Cfg_simu_num_node int = 5 +var Cfg_simu_fanout_per_node int = 2 + +//////////////////////////////////////////////////////////////////////////////// +// +// +// +//////////////////////////////////////////////////////////////////////////////// +type MinimalConnectionManager struct { + theNodePtr *consensus.ConsensusParticipant + // + publisher_key_list []*MinimalConnectionManager + subscriber_key_list []*MinimalConnectionManager +} + +func (self *MinimalConnectionManager) GetNode() *consensus.ConsensusParticipant { + return self.theNodePtr +} +func (self *MinimalConnectionManager) RegisterPublisher(key *MinimalConnectionManager) bool { + + self.publisher_key_list = append(self.publisher_key_list, key) + return true +} +func (self *MinimalConnectionManager) SendBlockToAllMySubscriber(blockPtr *consensus.BlockBase) { + for _, p := range self.subscriber_key_list { + p.GetNode().OnBlockHeaderArrived(blockPtr) + } +} +func (self *MinimalConnectionManager) RequestConnectionToAllMyPublisher() { + for _, p := range self.publisher_key_list { + p.OnSubscriberConnectionRequest(self) + } +} +func (self *MinimalConnectionManager) OnSubscriberConnectionRequest(other *MinimalConnectionManager) { + self.subscriber_key_list = append(self.subscriber_key_list, other) +} +func (self *MinimalConnectionManager) Print() { + detail := false + + fmt.Printf("ConnectionManager={publisher={n=%d", + len(self.publisher_key_list)) + + if detail { + for _, val := range self.publisher_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") + + fmt.Printf(",subscriber={n=%d", len(self.subscriber_key_list)) + if detail { + for _, val := range self.subscriber_key_list { + fmt.Printf(",%v", val) + } + } else { + fmt.Printf(",...") + } + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +// +// main +// +//////////////////////////////////////////////////////////////////////////////// +func main() { + + var X []*MinimalConnectionManager + + // Create nodes + for i := 0; i < Cfg_simu_num_node; i++ { + cm := MinimalConnectionManager{} + // Reason for mutual registration: (1) when conn man receives + // messages, it needs to notify the node; (2) when node has + // processed a mesage, it might need to use conn man to send + // some data out. + nodePtr := consensus.NewConsensusParticipantPtr(&cm) + cm.theNodePtr = nodePtr + + X = append(X, &cm) + } + + // Contemplate connecting nodes into a thick circle: + n := len(X) + for i := 0; i < n; i++ { + + cm := X[i] + + c_left := int(Cfg_simu_fanout_per_node / 2) + c_right := Cfg_simu_fanout_per_node - c_left + + for c := 0; c < c_left; c++ { + j := (i - 1 - c + n) % n + cm.RegisterPublisher(X[j]) + } + + for c := 0; c < c_right; c++ { + j := (i + 1 + c) % n + cm.RegisterPublisher(X[j]) + } + } + + // + // Request connections + // + for i := 0; i < n; i++ { + X[i].RequestConnectionToAllMyPublisher() + } + + { + // + // Choose a node to be a block-maker + // + index := mathrand.Intn(Cfg_simu_num_node) + nodePtr := X[index].GetNode() + + // + // Make a block (actually, only a header) + // + x := secp256k1.RandByte(888) // Random data. + h := cipher.SumSHA256(x) // Its hash. + b := consensus.BlockBase{} + b.Init( + nodePtr.SignatureOf(h), + h, + 0) + + // + // Send it to subscribers. The subscribers are also publishers; + // they send (forward, to be exact) the header to thire respective + // listeners etc. + // + nodePtr.OnBlockHeaderArrived(&b) + } + + // + // Print the state of each node for a review or debugging. + // + for i, _ := range X { + fmt.Printf("FILE_FinalState.txt|NODE i=%d ", i) + X[i].GetNode().Print() + fmt.Printf("\n") + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/participant.go b/vendor/github.com/skycoin/skycoin/src/consensus/participant.go new file mode 100755 index 0000000..f48a01f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/participant.go @@ -0,0 +1,180 @@ +// nolint +// 20160901 - Initial version by user johnstuartmill, +// public key 02fb4acf944c84d48341e3c1cb14d707034a68b7f931d6be6d732bec03597d6ff6 +// 20161025 - Code revision by user johnstuartmill. +package consensus + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" +) + +//////////////////////////////////////////////////////////////////////////////// +// +// Struct ConsensusParticipant is inteneded to extend (or be contained in) +// github.com/skycoin/skycoin/src/mesh*/node struct Node, so that +// Node can participate in consensus. +// +//////////////////////////////////////////////////////////////////////////////// +type ConsensusParticipant struct { + Pubkey cipher.PubKey // Who we are + Seckey cipher.SecKey // For signing + + pConnectionManager ConnectionManagerInterface + + // The tail of Blockchain that I keep. + block_queue BlockchainTail + + // Candidates Blocks. + block_stat_queue BlockStatQueue + + Incoming_block_count int +} + +func (self *ConsensusParticipant) GetConnectionManager() ConnectionManagerInterface { + return self.pConnectionManager +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) GetNextBlockSeqNo() uint64 { + return self.block_queue.GetNextSeqNo() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) SetPubkeySeckey( + pubkey cipher.PubKey, + seckey cipher.SecKey) { + + self.Pubkey, self.Seckey = pubkey, seckey + //self.pConnectionManager.SetPubkey(pubkey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Print() { + fmt.Printf("ConsensusParticipant={pubkey=%s,block_msg_count=%d,", + self.Pubkey.Hex()[:8], self.Incoming_block_count) + + self.pConnectionManager.Print() + + fmt.Printf(",block_queue={") + self.block_queue.Print() + fmt.Printf("}") + + fmt.Printf(",block_stat_queue={") + self.block_stat_queue.Print() + fmt.Printf("}") + + fmt.Printf("}") +} + +//////////////////////////////////////////////////////////////////////////////// +func NewConsensusParticipantPtr(pMan ConnectionManagerInterface) *ConsensusParticipant { + + node := ConsensusParticipant{ + pConnectionManager: pMan, + block_queue: BlockchainTail{}, + Incoming_block_count: 0, + } + node.block_queue.Init() + //node.block_stat_queue.Init() + + // In PROD: each reads/loads the keys. In case the class does not + // expect to sign anything, SecKey should not be stored. + + // In SIMU: generate random keys. + node.SetPubkeySeckey(cipher.GenerateKeyPair()) + + return &node +} + +//////////////////////////////////////////////////////////////////////////////// +// Reasons for this function: 1st, we want to minimize exposure of +// SecKey, even in same process space. 2nd, functions Sign and +// SignHash already exist, so want keep search/browse/jump-to-tag +// unambiguous. +func (self *ConsensusParticipant) SignatureOf(hash cipher.SHA256) cipher.Sig { + + // PERFORMANCE: This is expensive when cipher.DebugLevel2 or + // cipher.DebugLevel1 are true: + return cipher.SignHash(hash, self.Seckey) +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_Len() int { + return self.block_stat_queue.Len() +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) Get_block_stat_queue_element_at( + j int) *BlockStat { + + return self.block_stat_queue.queue[j] // A pointer, BTW +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) OnBlockHeaderArrived(blockPtr *BlockBase) { + + self.Incoming_block_count += 1 // TODO: move this to try_add_hash_and_sig + + res1 := self.block_stat_queue.try_append_to_BlockStatQueue(blockPtr) + if res1 == 0 { + self.harvest_ripe_BlockStat() + self.pConnectionManager.SendBlockToAllMySubscriber(blockPtr) + } +} + +//////////////////////////////////////////////////////////////////////////////// +func (self *ConsensusParticipant) harvest_ripe_BlockStat() { + + // POLICY: The BlockStat entries that have much smaller seqno + // than the most recent one, 'blockPtr.seqno', are converted + // to Blocks and appended to blockchain. + n := len(self.block_stat_queue.queue) + if n == 0 { + return + } + + top_seqno := self.block_stat_queue.queue[n-1].seqno + + for i := 0; i < n; i++ { + statPtr := self.block_stat_queue.queue[i] + if statPtr.seqno+ + Cfg_consensus_waiting_time_as_seqno_diff <= top_seqno { + + if !statPtr.frozen { + // + // BEG updating local blockchain + // + + hash, _, sig := statPtr.GetBestHashPubkeySig() + + blockPtr := &BlockBase{ + Sig: sig, + Hash: hash, + Seqno: statPtr.seqno, + } + res := self.block_queue.try_append_to_BlockchainTail(blockPtr) + if res == 0 { + // TODO: 'frozen' items should be removed and the 'best' + // moved to BlockchainTail. + statPtr.frozen = true + } else { + // Appending did not work. Need to examine 'res' + // and log the reason why. + blockPtr = nil + } + // + // END updating local blockchain + // + + } + + } else { + break // The rest are not ripe yet + } + } + +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/vendor/github.com/skycoin/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go b/vendor/github.com/skycoin/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go new file mode 100755 index 0000000..decead2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/consensus/public_broadcast_channel/public_broadcast_channel.go @@ -0,0 +1,2 @@ +// nolint +package public_broadcast_channel diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go b/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go new file mode 100755 index 0000000..b67191d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/announced_txns.go @@ -0,0 +1,44 @@ +package daemon + +import ( + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/utc" +) + +type announcedTxnsCache struct { + sync.Mutex + cache map[cipher.SHA256]int64 +} + +func newAnnouncedTxnsCache() *announcedTxnsCache { + return &announcedTxnsCache{ + cache: make(map[cipher.SHA256]int64), + } +} + +func (c *announcedTxnsCache) add(txns []cipher.SHA256) { + c.Lock() + defer c.Unlock() + + t := utc.Now().UnixNano() + for _, txn := range txns { + c.cache[txn] = t + } +} + +func (c *announcedTxnsCache) flush() map[cipher.SHA256]int64 { + c.Lock() + defer c.Unlock() + + if len(c.cache) == 0 { + return nil + } + + cache := c.cache + + c.cache = make(map[cipher.SHA256]int64) + + return cache +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go b/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go new file mode 100755 index 0000000..7e78539 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/daemon.go @@ -0,0 +1,1415 @@ +package daemon + +import ( + "bytes" + "errors" + "reflect" + "sync" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" + + "github.com/skycoin/skycoin/src/util/elapse" + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/utc" +) + +/* +Todo +- verify that minimum/maximum connections are working +- keep max connections +- maintain minimum number of outgoing connections per server? + + +*/ +var ( + // ErrDisconnectReasons invalid version + ErrDisconnectInvalidVersion gnet.DisconnectReason = errors.New("Invalid version") + // ErrDisconnectIntroductionTimeout timeout + ErrDisconnectIntroductionTimeout gnet.DisconnectReason = errors.New("Version timeout") + // ErrDisconnectVersionSendFailed version send failed + ErrDisconnectVersionSendFailed gnet.DisconnectReason = errors.New("Version send failed") + // ErrDisconnectIsBlacklisted is blacklisted + ErrDisconnectIsBlacklisted gnet.DisconnectReason = errors.New("Blacklisted") + // ErrDisconnectSelf self connnect + ErrDisconnectSelf gnet.DisconnectReason = errors.New("Self connect") + // ErrDisconnectConnectedTwice connect twice + ErrDisconnectConnectedTwice gnet.DisconnectReason = errors.New("Already connected") + // ErrDisconnectIdle idle + ErrDisconnectIdle gnet.DisconnectReason = errors.New("Idle") + // ErrDisconnectNoIntroduction no introduction + ErrDisconnectNoIntroduction gnet.DisconnectReason = errors.New("First message was not an Introduction") + // ErrDisconnectIPLimitReached ip limit reached + ErrDisconnectIPLimitReached gnet.DisconnectReason = errors.New("Maximum number of connections for this IP was reached") + // ErrDisconnectOtherError this is returned when a seemingly impossible error is encountered + // e.g. net.Conn.Addr() returns an invalid ip:port + ErrDisconnectOtherError gnet.DisconnectReason = errors.New("Incomprehensible error") + ErrDisconnectMaxDefaultConnectionReached = errors.New("Maximum number of default connections was reached") + // ErrDisconnectMaxOutgoingConnectionsReached is returned when connection pool size is greater than the maximum allowed + ErrDisconnectMaxOutgoingConnectionsReached gnet.DisconnectReason = errors.New("Maximum outgoing connections was reached") + // ErrDisconnectBlockchainPubkeyNotMatched is returned when the blockchain pubkey in introduction does not match + ErrDisconnectBlockchainPubkeyNotMatched gnet.DisconnectReason = errors.New("Blockchain pubkey in Introduction message is not matched ") + // ErrDisconnectInvalidExtraData is returned when extra field can't be parsed as specific data type. + // e.g. ExtraData length in IntroductionMessage is not the same as cipher.PubKey + ErrDisconnectInvalidExtraData gnet.DisconnectReason = errors.New("Invalid extra data") + + logger = logging.MustGetLogger("daemon") +) + +const ( + daemonRunDurationThreshold = time.Millisecond * 200 +) + +// Config subsystem configurations +type Config struct { + Daemon DaemonConfig + Messages MessagesConfig + Pool PoolConfig + Pex pex.Config + Gateway GatewayConfig + Visor visor.Config +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Daemon: NewDaemonConfig(), + Pool: NewPoolConfig(), + Pex: pex.NewConfig(), + Gateway: NewGatewayConfig(), + Messages: NewMessagesConfig(), + Visor: visor.NewVisorConfig(), + } +} + +// preprocess preprocess for config +func (cfg *Config) preprocess() Config { + config := *cfg + if config.Daemon.LocalhostOnly { + if config.Daemon.Address == "" { + local, err := iputil.LocalhostIP() + if err != nil { + logger.Panicf("Failed to obtain localhost IP: %v", err) + } + config.Daemon.Address = local + } else { + if !iputil.IsLocalhost(config.Daemon.Address) { + logger.Panicf("Invalid address for localhost-only: %s", config.Daemon.Address) + } + } + config.Pex.AllowLocalhost = true + } + config.Pool.port = config.Daemon.Port + config.Pool.address = config.Daemon.Address + + if config.Daemon.DisableNetworking { + logger.Info("Networking is disabled") + config.Pex.Disabled = true + config.Daemon.DisableIncomingConnections = true + config.Daemon.DisableOutgoingConnections = true + } else { + if config.Daemon.DisableIncomingConnections { + logger.Info("Incoming connections are disabled.") + } + if config.Daemon.DisableOutgoingConnections { + logger.Info("Outgoing connections are disabled.") + } + } + + return config +} + +// DaemonConfig configuration for the Daemon +type DaemonConfig struct { // nolint: golint + // Protocol version. TODO -- manage version better + Version int32 + // IP Address to serve on. Leave empty for automatic assignment + Address string + // BlockchainPubkey blockchain pubkey string + BlockchainPubkey cipher.PubKey + // TCP/UDP port for connections + Port int + // Directory where application data is stored + DataDirectory string + // How often to check and initiate an outgoing connection if needed + OutgoingRate time.Duration + // How often to re-attempt to fill any missing private (aka required) + // connections + PrivateRate time.Duration + // Number of outgoing connections to maintain + OutgoingMax int + // Maximum number of connections to try at once + PendingMax int + // How long to wait for a version packet + IntroductionWait time.Duration + // How often to check for peers that have decided to stop communicating + CullInvalidRate time.Duration + // How often to update the database with transaction announcement timestamps + FlushAnnouncedTxnsRate time.Duration + // How many connections are allowed from the same base IP + IPCountsMax int + // Disable all networking activity + DisableNetworking bool + // Don't make outgoing connections + DisableOutgoingConnections bool + // Don't allow incoming connections + DisableIncomingConnections bool + // Run on localhost and only connect to localhost peers + LocalhostOnly bool + // Log ping and pong messages + LogPings bool + // How often to request blocks from peers + BlocksRequestRate time.Duration + // How often to announce our blocks to peers + BlocksAnnounceRate time.Duration + // How many blocks to respond with to a GetBlocksMessage + BlocksResponseCount uint64 + // Max announce txns hash number + MaxTxnAnnounceNum int + // How often new blocks are created by the signing node, in seconds + BlockCreationInterval uint64 + // How often to check the unconfirmed pool for transactions that become valid + UnconfirmedRefreshRate time.Duration + // How often to remove transactions that become permanently invalid from the unconfirmed pool + UnconfirmedRemoveInvalidRate time.Duration +} + +// NewDaemonConfig creates daemon config +func NewDaemonConfig() DaemonConfig { + return DaemonConfig{ + Version: 2, + Address: "", + Port: 6677, + OutgoingRate: time.Second * 5, + PrivateRate: time.Second * 5, + OutgoingMax: 8, + PendingMax: 8, + IntroductionWait: time.Second * 30, + CullInvalidRate: time.Second * 3, + FlushAnnouncedTxnsRate: time.Second * 3, + IPCountsMax: 3, + DisableNetworking: false, + DisableOutgoingConnections: false, + DisableIncomingConnections: false, + LocalhostOnly: false, + LogPings: true, + BlocksRequestRate: time.Second * 60, + BlocksAnnounceRate: time.Second * 60, + BlocksResponseCount: 20, + MaxTxnAnnounceNum: 16, + BlockCreationInterval: 10, + UnconfirmedRefreshRate: time.Minute, + UnconfirmedRemoveInvalidRate: time.Minute, + } +} + +//go:generate go install +//go:generate goautomock -template=testify Daemoner + +// Daemoner Daemon interface +type Daemoner interface { + SendMessage(addr string, msg gnet.Message) error + BroadcastMessage(msg gnet.Message) error + Disconnect(addr string, r gnet.DisconnectReason) error + IsDefaultConnection(addr string) bool + IsMaxDefaultConnectionsReached() (bool, error) + PexConfig() pex.Config + RandomExchangeable(n int) pex.Peers + AddPeer(addr string) error + AddPeers(addrs []string) int + SetHasIncomingPort(addr string) error + IncreaseRetryTimes(addr string) + ResetRetryTimes(addr string) + RecordPeerHeight(addr string, height uint64) + GetSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) + HeadBkSeq() (uint64, bool, error) + ExecuteSignedBlock(b coin.SignedBlock) error + GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) + GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) + InjectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) + Mirror() uint32 + DaemonConfig() DaemonConfig + BlockchainPubkey() cipher.PubKey + RecordMessageEvent(m AsyncMessage, c *gnet.MessageContext) error + RecordConnectionMirror(addr string, mirror uint32) error + GetMirrorPort(addr string, mirror uint32) (uint16, bool) + RemoveFromExpectingIntroductions(addr string) + RequestBlocksFromAddr(addr string) error + AnnounceAllTxns() error +} + +// Daemon stateful properties of the daemon +type Daemon struct { + // Daemon configuration + Config DaemonConfig + + // Components + Messages *Messages + pool *Pool + pex *pex.Pex + Gateway *Gateway + visor *visor.Visor + + DefaultConnections []string + + // Cache of announced transactions that are flushed to the database periodically + announcedTxns *announcedTxnsCache + // Cache of reported peer blockchain heights + Heights *peerBlockchainHeights + + // Separate index of outgoing connections. The pool aggregates all + // connections. + outgoingConnections *OutgoingConnections + // Number of connections waiting to be formed or timeout + pendingConnections *PendingConnections + // Keep track of unsolicited clients who should notify us of their version + expectingIntroductions *ExpectIntroductions + // Keep track of a connection's mirror value, to avoid double + // connections (one to their listener, and one to our listener) + // Maps from addr to mirror value + connectionMirrors *ConnectionMirrors + // Maps from mirror value to a map of ip (no port) + // We use a map of ip as value because multiple peers can have the same + // mirror (to avoid attacks enabled by our use of mirrors), + // but only one per base ip + mirrorConnections *MirrorConnections + // Client connection callbacks + onConnectEvent chan ConnectEvent + // Client disconnection callbacks + onDisconnectEvent chan DisconnectEvent + // Connection failure events + connectionErrors chan ConnectionError + // Tracking connections from the same base IP. Multiple connections + // from the same base IP are allowed but limited. + ipCounts *IPCount + // Message handling queue + messageEvents chan MessageEvent + // quit channel + quit chan struct{} + // done channel + done chan struct{} + // log buffer + LogBuff bytes.Buffer +} + +// NewDaemon returns a Daemon with primitives allocated +func NewDaemon(config Config, db *dbutil.DB, defaultConns []string) (*Daemon, error) { + config = config.preprocess() + vs, err := visor.NewVisor(config.Visor, db) + if err != nil { + return nil, err + } + + pex, err := pex.New(config.Pex, defaultConns) + if err != nil { + return nil, err + } + + d := &Daemon{ + Config: config.Daemon, + Messages: NewMessages(config.Messages), + pex: pex, + visor: vs, + + DefaultConnections: defaultConns, + + announcedTxns: newAnnouncedTxnsCache(), + Heights: newPeerBlockchainHeights(), + + expectingIntroductions: NewExpectIntroductions(), + connectionMirrors: NewConnectionMirrors(), + mirrorConnections: NewMirrorConnections(), + ipCounts: NewIPCount(), + // TODO -- if there are performance problems from blocking chans, + // Its because we are connecting to more things than OutgoingMax + // if we have private peers + onConnectEvent: make(chan ConnectEvent, config.Pool.MaxConnections*2), + onDisconnectEvent: make(chan DisconnectEvent, config.Pool.MaxConnections*2), + connectionErrors: make(chan ConnectionError, config.Pool.MaxConnections*2), + outgoingConnections: NewOutgoingConnections(config.Daemon.OutgoingMax), + pendingConnections: NewPendingConnections(config.Daemon.PendingMax), + messageEvents: make(chan MessageEvent, config.Pool.EventChannelSize), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + d.Gateway = NewGateway(config.Gateway, d) + d.Messages.Config.Register() + d.pool = NewPool(config.Pool, d) + + return d, nil +} + +// ConnectEvent generated when a client connects +type ConnectEvent struct { + Addr string + Solicited bool +} + +// DisconnectEvent generated when a connection terminated +type DisconnectEvent struct { + Addr string + Reason gnet.DisconnectReason +} + +// ConnectionError represent a failure to connect/dial a connection, with context +type ConnectionError struct { + Addr string + Error error +} + +// MessageEvent encapsulates a deserialized message from the network +type MessageEvent struct { + Message AsyncMessage + Context *gnet.MessageContext +} + +// Shutdown Terminates all subsystems safely. To stop the Daemon run loop, send a value +// over the quit channel provided to Init. The Daemon run loop must be stopped +// before calling this function. +func (dm *Daemon) Shutdown() { + defer logger.Info("Daemon shutdown complete") + + // close daemon run loop first to avoid creating new connection after + // the connection pool is shutdown. + logger.Info("Stopping the daemon run loop") + close(dm.quit) + + logger.Info("Shutting down Pool") + dm.pool.Shutdown() + + logger.Info("Shutting down Gateway") + dm.Gateway.Shutdown() + + logger.Info("Shutting down Pex") + dm.pex.Shutdown() + + <-dm.done +} + +// Run main loop for peer/connection management. +// Send anything to the quit channel to shut it down. +func (dm *Daemon) Run() error { + defer logger.Info("Daemon closed") + defer close(dm.done) + + if err := dm.visor.Init(); err != nil { + logger.WithError(err).Error("visor.Visor.Init failed") + return err + } + + errC := make(chan error, 5) + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + if err := dm.pex.Run(); err != nil { + logger.WithError(err).Error("daemon.Pex.Run failed") + errC <- err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if dm.Config.DisableIncomingConnections { + if err := dm.pool.RunOffline(); err != nil { + logger.WithError(err).Error("daemon.Pool.RunOffline failed") + errC <- err + } + } else { + if err := dm.pool.Run(); err != nil { + logger.WithError(err).Error("daemon.Pool.Run failed") + errC <- err + } + } + }() + + blockInterval := time.Duration(dm.Config.BlockCreationInterval) + blockCreationTicker := time.NewTicker(time.Second * blockInterval) + if !dm.visor.Config.IsMaster { + blockCreationTicker.Stop() + } + + unconfirmedRefreshTicker := time.Tick(dm.Config.UnconfirmedRefreshRate) + unconfirmedRemoveInvalidTicker := time.Tick(dm.Config.UnconfirmedRemoveInvalidRate) + blocksRequestTicker := time.Tick(dm.Config.BlocksRequestRate) + blocksAnnounceTicker := time.Tick(dm.Config.BlocksAnnounceRate) + + privateConnectionsTicker := time.Tick(dm.Config.PrivateRate) + cullInvalidTicker := time.Tick(dm.Config.CullInvalidRate) + outgoingConnectionsTicker := time.Tick(dm.Config.OutgoingRate) + requestPeersTicker := time.Tick(dm.pex.Config.RequestRate) + clearStaleConnectionsTicker := time.Tick(dm.pool.Config.ClearStaleRate) + idleCheckTicker := time.Tick(dm.pool.Config.IdleCheckRate) + + flushAnnouncedTxnsTicker := time.Tick(dm.Config.FlushAnnouncedTxnsRate) + + // Connect to trusted peers + if !dm.Config.DisableOutgoingConnections { + wg.Add(1) + go func() { + defer wg.Done() + dm.connectToTrustPeer() + }() + } + + var err error + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + + // Process SendResults in a separate goroutine, otherwise SendResults + // will fill up much faster than can be processed by the daemon run loop + // dm.handleMessageSendResult must take care not to perform any operation + // that would violate thread safety, since it is not serialized by the daemon run loop + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(daemonRunDurationThreshold, logger) + loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case r := <-dm.pool.Pool.SendResults: + // Process message sending results + elapser.Register("dm.Pool.Pool.SendResults") + if dm.Config.DisableNetworking { + logger.Error("There should be nothing in SendResults") + return + } + dm.handleMessageSendResult(r) + } + } + }() + +loop: + for { + elapser.CheckForDone() + select { + case <-dm.quit: + break loop + + case <-cullInvalidTicker: + // Remove connections that failed to complete the handshake + elapser.Register("cullInvalidTicker") + if !dm.Config.DisableNetworking { + dm.cullInvalidConnections() + } + + case <-requestPeersTicker: + // Request peers via PEX + elapser.Register("requestPeersTicker") + if dm.pex.Config.Disabled { + continue + } + + if dm.pex.IsFull() { + continue + } + + m := NewGetPeersMessage() + if err := dm.pool.Pool.BroadcastMessage(m); err != nil { + logger.Error(err) + } + + case <-clearStaleConnectionsTicker: + // Remove connections that haven't said anything in a while + elapser.Register("clearStaleConnectionsTicker") + if !dm.Config.DisableNetworking { + dm.pool.clearStaleConnections() + } + + case <-idleCheckTicker: + // Sends pings as needed + elapser.Register("idleCheckTicker") + if !dm.Config.DisableNetworking { + dm.pool.sendPings() + } + + case <-outgoingConnectionsTicker: + // Fill up our outgoing connections + elapser.Register("outgoingConnectionsTicker") + trustPeerNum := len(dm.pex.Trusted()) + if !dm.Config.DisableOutgoingConnections && + dm.outgoingConnections.Len() < (dm.Config.OutgoingMax+trustPeerNum) && + dm.pendingConnections.Len() < dm.Config.PendingMax { + dm.connectToRandomPeer() + } + + case <-privateConnectionsTicker: + // Always try to stay connected to our private peers + // TODO (also, connect to all of them on start) + elapser.Register("privateConnectionsTicker") + if !dm.Config.DisableOutgoingConnections { + dm.makePrivateConnections() + } + + case r := <-dm.onConnectEvent: + // Process callbacks for when a client connects. No disconnect chan + // is needed because the callback is triggered by HandleDisconnectEvent + // which is already select{}ed here + elapser.Register("dm.onConnectEvent") + if dm.Config.DisableNetworking { + logger.Error("There should be no connect events") + return nil + } + dm.onConnect(r) + + case de := <-dm.onDisconnectEvent: + elapser.Register("dm.onDisconnectEvent") + if dm.Config.DisableNetworking { + logger.Error("There should be no disconnect events") + return nil + } + dm.onDisconnect(de) + + case r := <-dm.connectionErrors: + // Handle connection errors + elapser.Register("dm.connectionErrors") + if dm.Config.DisableNetworking { + logger.Error("There should be no connection errors") + return nil + } + dm.handleConnectionError(r) + + case <-flushAnnouncedTxnsTicker: + elapser.Register("flushAnnouncedTxnsTicker") + txns := dm.announcedTxns.flush() + + if err := dm.visor.SetTxnsAnnounced(txns); err != nil { + logger.WithError(err).Error("Failed to set unconfirmed txn announce time") + return err + } + + case m := <-dm.messageEvents: + // Message handlers + elapser.Register("dm.messageEvents") + if dm.Config.DisableNetworking { + logger.Error("There should be no message events") + return nil + } + dm.processMessageEvent(m) + + case req := <-dm.Gateway.requests: + // Process any pending RPC requests + elapser.Register("dm.Gateway.requests") + req.Func() + + case <-blockCreationTicker.C: + // Create blocks, if master chain + elapser.Register("blockCreationTicker.C") + if dm.visor.Config.IsMaster { + sb, err := dm.CreateAndPublishBlock() + if err != nil { + logger.Errorf("Failed to create and publish block: %v", err) + continue + } + + // Not a critical error, but we want it visible in logs + head := sb.Block.Head + logger.Critical().Infof("Created and published a new block, version=%d seq=%d time=%d", head.Version, head.BkSeq, head.Time) + } + + case <-unconfirmedRefreshTicker: + elapser.Register("unconfirmedRefreshTicker") + // Get the transactions that turn to valid + validTxns, err := dm.visor.RefreshUnconfirmed() + if err != nil { + logger.Errorf("dm.Visor.RefreshUnconfirmed failed: %v", err) + continue + } + // Announce these transactions + dm.AnnounceTxns(validTxns) + + case <-unconfirmedRemoveInvalidTicker: + elapser.Register("unconfirmedRemoveInvalidTicker") + // Remove transactions that become invalid (violating hard constraints) + removedTxns, err := dm.visor.RemoveInvalidUnconfirmed() + if err != nil { + logger.Errorf("dm.Visor.RemoveInvalidUnconfirmed failed: %v", err) + continue + } + if len(removedTxns) > 0 { + logger.Infof("Remove %d txns from pool that began violating hard constraints", len(removedTxns)) + } + + case <-blocksRequestTicker: + elapser.Register("blocksRequestTicker") + dm.RequestBlocks() + + case <-blocksAnnounceTicker: + elapser.Register("blocksAnnounceTicker") + dm.AnnounceBlocks() + + case err = <-errC: + break loop + } + } + + wg.Wait() + + return err +} + +// GetListenPort returns the ListenPort for a given address. +// If no port is found, 0 is returned. +func (dm *Daemon) GetListenPort(addr string) uint16 { + m, ok := dm.connectionMirrors.Get(addr) + if !ok { + return 0 + } + + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Errorf("GetListenPort received invalid addr: %v", err) + return 0 + } + + p, ok := dm.mirrorConnections.Get(m, ip) + if !ok { + return 0 + } + return p +} + +// Connects to a given peer. Returns an error if no connection attempt was +// made. If the connection attempt itself fails, the error is sent to +// the connectionErrors channel. +func (dm *Daemon) connectToPeer(p pex.Peer) error { + if dm.Config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + a, _, err := iputil.SplitAddr(p.Addr) + if err != nil { + logger.Warningf("PEX gave us an invalid peer: %v", err) + return errors.New("Invalid peer") + } + if dm.Config.LocalhostOnly && !iputil.IsLocalhost(a) { + return errors.New("Not localhost") + } + + conned, err := dm.pool.Pool.IsConnExist(p.Addr) + if err != nil { + return err + } + + if conned { + return errors.New("Already connected") + } + + if _, ok := dm.pendingConnections.Get(p.Addr); ok { + return errors.New("Connection is pending") + } + cnt, ok := dm.ipCounts.Get(a) + if !dm.Config.LocalhostOnly && ok && cnt != 0 { + return errors.New("Already connected to a peer with this base IP") + } + + logger.Debugf("Trying to connect to %s", p.Addr) + dm.pendingConnections.Add(p.Addr, p) + go func() { + if err := dm.pool.Pool.Connect(p.Addr); err != nil { + dm.connectionErrors <- ConnectionError{p.Addr, err} + } + }() + return nil +} + +// Connects to all private peers +func (dm *Daemon) makePrivateConnections() { + if dm.Config.DisableOutgoingConnections { + return + } + + peers := dm.pex.Private() + for _, p := range peers { + logger.Infof("Private peer attempt: %s", p.Addr) + if err := dm.connectToPeer(p); err != nil { + logger.Debugf("Did not connect to private peer: %v", err) + } + } +} + +func (dm *Daemon) connectToTrustPeer() { + if dm.Config.DisableIncomingConnections { + return + } + + logger.Info("Connect to trusted peers") + // Make connections to all trusted peers + peers := dm.pex.TrustedPublic() + for _, p := range peers { + dm.connectToPeer(p) + } +} + +// Attempts to connect to a random peer. If it fails, the peer is removed. +func (dm *Daemon) connectToRandomPeer() { + if dm.Config.DisableOutgoingConnections { + return + } + + // Make a connection to a random (public) peer + peers := dm.pex.RandomPublic(dm.Config.OutgoingMax) + for _, p := range peers { + // Check if the peer has public port + if p.HasIncomingPort { + // Try to connect the peer if it's ip:mirror does not exist + if _, exist := dm.GetMirrorPort(p.Addr, dm.Messages.Mirror); !exist { + dm.connectToPeer(p) + continue + } + } else { + // Try to connect to the peer if we don't know whether the peer have public port + dm.connectToPeer(p) + } + } + + if len(peers) == 0 { + // Reset the retry times of all peers, + dm.pex.ResetAllRetryTimes() + } +} + +// We remove a peer from the Pex if we failed to connect +// TODO - On failure to connect, use exponential backoff, not peer list +func (dm *Daemon) handleConnectionError(c ConnectionError) { + logger.Debugf("Failed to connect to %s with error: %v", c.Addr, c.Error) + dm.pendingConnections.Remove(c.Addr) + + dm.pex.IncreaseRetryTimes(c.Addr) +} + +// Removes unsolicited connections who haven't sent a version +func (dm *Daemon) cullInvalidConnections() { + // This method only handles the erroneous people from the DHT, but not + // malicious nodes + now := utc.Now() + addrs, err := dm.expectingIntroductions.CullInvalidConns( + func(addr string, t time.Time) (bool, error) { + conned, err := dm.pool.Pool.IsConnExist(addr) + if err != nil { + return false, err + } + + // Do not remove trusted peers + if dm.isTrustedPeer(addr) { + return false, nil + } + + if !conned { + return true, nil + } + + if t.Add(dm.Config.IntroductionWait).Before(now) { + return true, nil + } + return false, nil + }) + + if err != nil { + logger.Errorf("expectingIntroduction cull invalid connections failed: %v", err) + return + } + + for _, a := range addrs { + exist, err := dm.pool.Pool.IsConnExist(a) + if err != nil { + logger.Error(err) + return + } + + if exist { + logger.Infof("Removing %s for not sending a version", a) + if err := dm.pool.Pool.Disconnect(a, ErrDisconnectIntroductionTimeout); err != nil { + logger.Error(err) + return + } + dm.pex.RemovePeer(a) + } + } +} + +func (dm *Daemon) isTrustedPeer(addr string) bool { + peer, ok := dm.pex.GetPeerByAddr(addr) + if !ok { + return false + } + + return peer.Trusted +} + +// RecordMessageEvent records an AsyncMessage to the messageEvent chan. Do not access +// messageEvent directly. +func (dm *Daemon) RecordMessageEvent(m AsyncMessage, c *gnet.MessageContext) error { + dm.messageEvents <- MessageEvent{m, c} + return nil +} + +// check if the connection needs introduction message +func (dm *Daemon) needsIntro(addr string) bool { + _, exist := dm.expectingIntroductions.Get(addr) + return exist +} + +// Processes a queued AsyncMessage. +func (dm *Daemon) processMessageEvent(e MessageEvent) { + // The first message received must be an Introduction + // We have to check at process time and not record time because + // Introduction message does not update ExpectingIntroductions until its + // Process() is called + // _, needsIntro := self.expectingIntroductions[e.Context.Addr] + // if needsIntro { + if dm.needsIntro(e.Context.Addr) { + _, isIntro := e.Message.(*IntroductionMessage) + if !isIntro { + dm.pool.Pool.Disconnect(e.Context.Addr, ErrDisconnectNoIntroduction) + } + } + e.Message.Process(dm) +} + +// Called when a ConnectEvent is processed off the onConnectEvent channel +func (dm *Daemon) onConnect(e ConnectEvent) { + a := e.Addr + + if e.Solicited { + logger.Infof("Connected to peer: %s (outgoing)", a) + } else { + logger.Infof("Connected to peer: %s (incoming)", a) + } + + dm.pendingConnections.Remove(a) + + exist, err := dm.pool.Pool.IsConnExist(a) + if err != nil { + logger.Error(err) + return + } + + if !exist { + logger.Warning("While processing an onConnect event, no pool connection was found") + return + } + + if dm.ipCountMaxed(a) { + logger.Infof("Max connections for %s reached, disconnecting", a) + dm.pool.Pool.Disconnect(a, ErrDisconnectIPLimitReached) + return + } + + dm.recordIPCount(a) + + if e.Solicited { + // Disconnect if the max outgoing connections is reached + n, err := dm.pool.Pool.OutgoingConnectionsNum() + if err != nil { + logger.WithError(err).Error("get outgoing connections number failed") + return + } + + if n > dm.Config.OutgoingMax { + logger.Warningf("max outgoing connections is reached, disconnecting %v", a) + dm.pool.Pool.Disconnect(a, ErrDisconnectMaxOutgoingConnectionsReached) + return + } + + dm.outgoingConnections.Add(a) + } + + dm.expectingIntroductions.Add(a, utc.Now()) + logger.Debugf("Sending introduction message to %s, mirror:%d", a, dm.Messages.Mirror) + // TODO: replace the last paramenter of nil with dm.Config.BlockchainPubkey in v25 + m := NewIntroductionMessage(dm.Messages.Mirror, dm.Config.Version, dm.pool.Pool.Config.Port, nil) + if err := dm.pool.Pool.SendMessage(a, m); err != nil { + logger.Errorf("Send IntroductionMessage to %s failed: %v", a, err) + } +} + +func (dm *Daemon) onDisconnect(e DisconnectEvent) { + logger.Infof("%s disconnected because: %v", e.Addr, e.Reason) + + dm.outgoingConnections.Remove(e.Addr) + dm.expectingIntroductions.Remove(e.Addr) + dm.Heights.Remove(e.Addr) + dm.removeIPCount(e.Addr) + dm.removeConnectionMirror(e.Addr) +} + +// Triggered when an gnet.Connection terminates +func (dm *Daemon) onGnetDisconnect(addr string, reason gnet.DisconnectReason) { + e := DisconnectEvent{ + Addr: addr, + Reason: reason, + } + select { + case dm.onDisconnectEvent <- e: + default: + logger.Warning("onDisconnectEvent channel is full") + } +} + +// Triggered when an gnet.Connection is connected +func (dm *Daemon) onGnetConnect(addr string, solicited bool) { + dm.onConnectEvent <- ConnectEvent{Addr: addr, Solicited: solicited} +} + +// Returns whether the ipCount maximum has been reached +func (dm *Daemon) ipCountMaxed(addr string) bool { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("ipCountMaxed called with invalid addr: %v", err) + return true + } + + if cnt, ok := dm.ipCounts.Get(ip); ok { + return cnt >= dm.Config.IPCountsMax + } + return false +} + +// Adds base IP to ipCount or returns error if max is reached +func (dm *Daemon) recordIPCount(addr string) { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("recordIPCount called with invalid addr: %v", err) + return + } + dm.ipCounts.Increase(ip) +} + +// Removes base IP from ipCount +func (dm *Daemon) removeIPCount(addr string) { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("removeIPCount called with invalid addr: %v", err) + return + } + dm.ipCounts.Decrease(ip) +} + +// RecordConnectionMirror adds addr + mirror to the connectionMirror mappings +func (dm *Daemon) RecordConnectionMirror(addr string, mirror uint32) error { + ip, port, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("RecordConnectionMirror called with invalid addr: %v", err) + return err + } + dm.connectionMirrors.Add(addr, mirror) + dm.mirrorConnections.Add(mirror, ip, port) + return nil +} + +// Removes an addr from the connectionMirror mappings +func (dm *Daemon) removeConnectionMirror(addr string) { + mirror, ok := dm.connectionMirrors.Get(addr) + if !ok { + return + } + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("removeConnectionMirror called with invalid addr: %v", err) + return + } + + // remove ip from specific mirror + dm.mirrorConnections.Remove(mirror, ip) + + dm.connectionMirrors.Remove(addr) +} + +// GetMirrorPort returns whether an addr+mirror's port and whether the port exists +func (dm *Daemon) GetMirrorPort(addr string, mirror uint32) (uint16, bool) { + ip, _, err := iputil.SplitAddr(addr) + if err != nil { + logger.Warningf("getMirrorPort called with invalid addr: %v", err) + return 0, false + } + return dm.mirrorConnections.Get(mirror, ip) +} + +// When an async message send finishes, its result is handled by this. +// This method must take care to perform only thread-safe actions, since it is called +// outside of the daemon run loop +func (dm *Daemon) handleMessageSendResult(r gnet.SendResult) { + if r.Error != nil { + logger.Warningf("Failed to send %s to %s: %v", reflect.TypeOf(r.Message), r.Addr, r.Error) + return + } + switch r.Message.(type) { + case SendingTxnsMessage: + dm.announcedTxns.add(r.Message.(SendingTxnsMessage).GetTxns()) + default: + } +} + +// RequestBlocks Sends a GetBlocksMessage to all connections +func (dm *Daemon) RequestBlocks() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.Config.BlocksResponseCount) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast GetBlocksMessage failed: %v", err) + } + + return err +} + +// AnnounceBlocks sends an AnnounceBlocksMessage to all connections +func (dm *Daemon) AnnounceBlocks() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot announce blocks, there is no head block") + } + + m := NewAnnounceBlocksMessage(headSeq) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast AnnounceBlocksMessage failed: %v", err) + } + + return err +} + +// AnnounceAllTxns announces local unconfirmed transactions +func (dm *Daemon) AnnounceAllTxns() error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + // Get local unconfirmed transaction hashes. + hashes, err := dm.visor.GetAllValidUnconfirmedTxHashes() + if err != nil { + return err + } + + // Divide hashes into multiple sets of max size + hashesSet := divideHashes(hashes, dm.Config.MaxTxnAnnounceNum) + + for _, hs := range hashesSet { + m := NewAnnounceTxnsMessage(hs) + if err = dm.pool.Pool.BroadcastMessage(m); err != nil { + break + } + } + + if err != nil { + logger.Debugf("Broadcast AnnounceTxnsMessage failed, err: %v", err) + } + + return err +} + +func divideHashes(hashes []cipher.SHA256, n int) [][]cipher.SHA256 { + if len(hashes) == 0 { + return [][]cipher.SHA256{} + } + + var j int + var hashesArray [][]cipher.SHA256 + + if len(hashes) > n { + for i := range hashes { + if len(hashes[j:i]) == n { + hs := make([]cipher.SHA256, n) + copy(hs, hashes[j:i]) + hashesArray = append(hashesArray, hs) + j = i + } + } + } + + hs := make([]cipher.SHA256, len(hashes)-j) + copy(hs, hashes[j:]) + hashesArray = append(hashesArray, hs) + return hashesArray +} + +// AnnounceTxns announces given transaction hashes. +func (dm *Daemon) AnnounceTxns(txns []cipher.SHA256) error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + if len(txns) == 0 { + return nil + } + + m := NewAnnounceTxnsMessage(txns) + + err := dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Debugf("Broadcast AnnounceTxnsMessage failed: %v", err) + } + + return err +} + +// RequestBlocksFromAddr sends a GetBlocksMessage to one connected address +func (dm *Daemon) RequestBlocksFromAddr(addr string) error { + if dm.Config.DisableOutgoingConnections { + return errors.New("Outgoing connections disabled") + } + + headSeq, ok, err := dm.visor.HeadBkSeq() + if err != nil { + return err + } + if !ok { + return errors.New("Cannot request blocks from addr, there is no head block") + } + + m := NewGetBlocksMessage(headSeq, dm.Config.BlocksResponseCount) + + return dm.pool.Pool.SendMessage(addr, m) +} + +// InjectBroadcastTransaction injects transaction to the unconfirmed pool and broadcasts it. +// If the transaction violates either hard or soft constraints, it is not broadcast. +// This method is to be used by user-initiated transaction injections. +// For transactions received over the network, use InjectTransaction and check the result to +// decide on repropagation. +func (dm *Daemon) InjectBroadcastTransaction(txn coin.Transaction) error { + if _, err := dm.visor.InjectTransactionStrict(txn); err != nil { + return err + } + + return dm.broadcastTransaction(txn) +} + +// ResendUnconfirmedTxns resends all unconfirmed transactions and returns the hashes that were successfully rebroadcast +func (dm *Daemon) ResendUnconfirmedTxns() ([]cipher.SHA256, error) { + if dm.Config.DisableOutgoingConnections { + return nil, nil + } + + txns, err := dm.visor.GetAllUnconfirmedTxns() + if err != nil { + return nil, err + } + + var txids []cipher.SHA256 + for i := range txns { + logger.Debugf("Rebroadcast tx %s", txns[i].Hash().Hex()) + if err := dm.broadcastTransaction(txns[i].Txn); err == nil { + txids = append(txids, txns[i].Txn.Hash()) + } + } + + return txids, nil +} + +// broadcastTransaction broadcasts a single transaction to all peers. +func (dm *Daemon) broadcastTransaction(t coin.Transaction) error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + m := NewGiveTxnsMessage(coin.Transactions{t}) + l, err := dm.pool.Pool.Size() + if err != nil { + return err + } + + logger.Debugf("Broadcasting GiveTxnsMessage to %d conns", l) + + err = dm.pool.Pool.BroadcastMessage(m) + if err != nil { + logger.Errorf("Broadcast GivenTxnsMessage failed: %v", err) + } + + return err +} + +// CreateAndPublishBlock creates a block from unconfirmed transactions and sends it to the network. +// Will panic if not running as a master chain. +// Will not create a block if outgoing connections are disabled. +// If the block was created but the broadcast failed, the error will be non-nil but the +// SignedBlock value will not be empty. +// TODO -- refactor this method -- it should either always create a block and maybe broadcast it, +// or use a database transaction to rollback block publishing if broadcast failed (however, this will cause a slow DB write) +func (dm *Daemon) CreateAndPublishBlock() (*coin.SignedBlock, error) { + if dm.Config.DisableOutgoingConnections { + return nil, errors.New("Outgoing connections disabled") + } + + sb, err := dm.visor.CreateAndExecuteBlock() + if err != nil { + return nil, err + } + + err = dm.broadcastBlock(sb) + + return &sb, err +} + +// Sends a signed block to all connections. +func (dm *Daemon) broadcastBlock(sb coin.SignedBlock) error { + if dm.Config.DisableOutgoingConnections { + return nil + } + + m := NewGiveBlocksMessage([]coin.SignedBlock{sb}) + return dm.pool.Pool.BroadcastMessage(m) +} + +// Mirror returns the message mirror +func (dm *Daemon) Mirror() uint32 { + return dm.Messages.Mirror +} + +// DaemonConfig returns the daemon config +func (dm *Daemon) DaemonConfig() DaemonConfig { + return dm.Config +} + +// BlockchainPubkey returns the blockchain pubkey +func (dm *Daemon) BlockchainPubkey() cipher.PubKey { + return dm.Config.BlockchainPubkey +} + +// RemoveFromExpectingIntroductions removes the peer from expect introduction pool +func (dm *Daemon) RemoveFromExpectingIntroductions(addr string) { + dm.expectingIntroductions.Remove(addr) +} + +// Implements pooler interface + +// SendMessage sends a Message to a Connection and pushes the result onto the +// SendResults channel. +func (dm *Daemon) SendMessage(addr string, msg gnet.Message) error { + return dm.pool.Pool.SendMessage(addr, msg) +} + +// BroadcastMessage sends a Message to all connections in the Pool. +func (dm *Daemon) BroadcastMessage(msg gnet.Message) error { + return dm.pool.Pool.BroadcastMessage(msg) +} + +// Disconnect removes a connection from the pool by address, and passes a Disconnection to +// the DisconnectCallback +func (dm *Daemon) Disconnect(addr string, r gnet.DisconnectReason) error { + return dm.pool.Pool.Disconnect(addr, r) +} + +// IsDefaultConnection returns if the addr is a default connection +func (dm *Daemon) IsDefaultConnection(addr string) bool { + return dm.pool.Pool.IsDefaultConnection(addr) +} + +// IsMaxDefaultConnectionsReached returns whether the max default connection number was reached. +func (dm *Daemon) IsMaxDefaultConnectionsReached() (bool, error) { + return dm.pool.Pool.IsMaxDefaultConnReached() +} + +// Implements pexer interface + +// RandomExchangeable returns N random exchangeable peers +func (dm *Daemon) RandomExchangeable(n int) pex.Peers { + return dm.pex.RandomExchangeable(n) +} + +// PexConfig returns the pex config +func (dm *Daemon) PexConfig() pex.Config { + return dm.pex.Config +} + +// AddPeer adds peer to the pex +func (dm *Daemon) AddPeer(addr string) error { + return dm.pex.AddPeer(addr) +} + +// AddPeers adds peers to the pex +func (dm *Daemon) AddPeers(addrs []string) int { + return dm.pex.AddPeers(addrs) +} + +// SetHasIncomingPort sets the peer public peer +func (dm *Daemon) SetHasIncomingPort(addr string) error { + return dm.pex.SetHasIncomingPort(addr, true) +} + +// IncreaseRetryTimes increases the retry times of given peer +func (dm *Daemon) IncreaseRetryTimes(addr string) { + dm.pex.IncreaseRetryTimes(addr) +} + +// ResetRetryTimes reset the retry times of given peer +func (dm *Daemon) ResetRetryTimes(addr string) { + dm.pex.ResetRetryTimes(addr) +} + +// Implements chain height store + +// Record(addr string, height uint64) + +// RecordPeerHeight records the height of specific peer +func (dm *Daemon) RecordPeerHeight(addr string, height uint64) { + dm.Heights.Record(addr, height) +} + +// Implements visorer interface + +// GetSignedBlocksSince returns N signed blocks since given seq +func (dm *Daemon) GetSignedBlocksSince(seq, count uint64) ([]coin.SignedBlock, error) { + return dm.visor.GetSignedBlocksSince(seq, count) +} + +// HeadBkSeq returns the head block sequence +func (dm *Daemon) HeadBkSeq() (uint64, bool, error) { + return dm.visor.HeadBkSeq() +} + +// ExecuteSignedBlock executes the signed block +func (dm *Daemon) ExecuteSignedBlock(b coin.SignedBlock) error { + return dm.visor.ExecuteSignedBlock(b) +} + +// GetUnconfirmedUnknown returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) { + return dm.visor.GetUnconfirmedUnknown(txns) +} + +// GetUnconfirmedKnown returns unconfirmed txn hashes with known ones removed +func (dm *Daemon) GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) { + return dm.visor.GetUnconfirmedKnown(txns) +} + +// InjectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (dm *Daemon) InjectTransaction(txn coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + return dm.visor.InjectTransaction(txn) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/daemon_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/daemon_test.go new file mode 100755 index 0000000..d308ef8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/daemon_test.go @@ -0,0 +1,105 @@ +package daemon + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" +) + +func TestDivideHashes(t *testing.T) { + hashes := make([]cipher.SHA256, 10) + for i := 0; i < 10; i++ { + hashes[i] = cipher.SumSHA256(cipher.RandByte(512)) + } + + testCases := []struct { + name string + init []cipher.SHA256 + n int + array [][]cipher.SHA256 + }{ + { + "has one odd", + hashes[:], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + hashes[8], + }, + []cipher.SHA256{ + hashes[9], + }, + }, + }, + { + "only one value", + hashes[:1], + 1, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + }, + }, + }, + { + "empty value", + hashes[:0], + 0, + [][]cipher.SHA256{}, + }, + { + "with 3 value", + hashes[:3], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + }, + }, + { + "with 8 value", + hashes[:8], + 3, + [][]cipher.SHA256{ + []cipher.SHA256{ + hashes[0], + hashes[1], + hashes[2], + }, + []cipher.SHA256{ + hashes[3], + hashes[4], + hashes[5], + }, + []cipher.SHA256{ + hashes[6], + hashes[7], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + rlt := divideHashes(tc.init, tc.n) + require.Equal(t, tc.array, rlt) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/daemoner_mock_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/daemoner_mock_test.go new file mode 100755 index 0000000..756c7b5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/daemoner_mock_test.go @@ -0,0 +1,568 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package daemon + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + gnet "github.com/skycoin/skycoin/src/daemon/gnet" + pex "github.com/skycoin/skycoin/src/daemon/pex" + visor "github.com/skycoin/skycoin/src/visor" +) + +// DaemonerMock mock +type DaemonerMock struct { + mock.Mock +} + +func NewDaemonerMock() *DaemonerMock { + return &DaemonerMock{} +} + +// AddPeer mocked method +func (m *DaemonerMock) AddPeer(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// AddPeers mocked method +func (m *DaemonerMock) AddPeers(p0 []string) int { + + ret := m.Called(p0) + + var r0 int + switch res := ret.Get(0).(type) { + case nil: + case int: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// AnnounceAllTxns mocked method +func (m *DaemonerMock) AnnounceAllTxns() error { + + ret := m.Called() + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// BlockchainPubkey mocked method +func (m *DaemonerMock) BlockchainPubkey() cipher.PubKey { + + ret := m.Called() + + var r0 cipher.PubKey + switch res := ret.Get(0).(type) { + case nil: + case cipher.PubKey: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// BroadcastMessage mocked method +func (m *DaemonerMock) BroadcastMessage(p0 gnet.Message) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// DaemonConfig mocked method +func (m *DaemonerMock) DaemonConfig() DaemonConfig { + + ret := m.Called() + + var r0 DaemonConfig + switch res := ret.Get(0).(type) { + case nil: + case DaemonConfig: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// Disconnect mocked method +func (m *DaemonerMock) Disconnect(p0 string, p1 gnet.DisconnectReason) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ExecuteSignedBlock mocked method +func (m *DaemonerMock) ExecuteSignedBlock(p0 coin.SignedBlock) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetMirrorPort mocked method +func (m *DaemonerMock) GetMirrorPort(p0 string, p1 uint32) (uint16, bool) { + + ret := m.Called(p0, p1) + + var r0 uint16 + switch res := ret.Get(0).(type) { + case nil: + case uint16: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlocksSince mocked method +func (m *DaemonerMock) GetSignedBlocksSince(p0 uint64, p1 uint64) ([]coin.SignedBlock, error) { + + ret := m.Called(p0, p1) + + var r0 []coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case []coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnconfirmedKnown mocked method +func (m *DaemonerMock) GetUnconfirmedKnown(p0 []cipher.SHA256) (coin.Transactions, error) { + + ret := m.Called(p0) + + var r0 coin.Transactions + switch res := ret.Get(0).(type) { + case nil: + case coin.Transactions: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnconfirmedUnknown mocked method +func (m *DaemonerMock) GetUnconfirmedUnknown(p0 []cipher.SHA256) ([]cipher.SHA256, error) { + + ret := m.Called(p0) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// HeadBkSeq mocked method +func (m *DaemonerMock) HeadBkSeq() (uint64, bool, error) { + + ret := m.Called() + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// IncreaseRetryTimes mocked method +func (m *DaemonerMock) IncreaseRetryTimes(p0 string) { + + m.Called(p0) + +} + +// InjectTransaction mocked method +func (m *DaemonerMock) InjectTransaction(p0 coin.Transaction) (bool, *visor.ErrTxnViolatesSoftConstraint, error) { + + ret := m.Called(p0) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 *visor.ErrTxnViolatesSoftConstraint + switch res := ret.Get(1).(type) { + case nil: + case *visor.ErrTxnViolatesSoftConstraint: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// IsDefaultConnection mocked method +func (m *DaemonerMock) IsDefaultConnection(p0 string) bool { + + ret := m.Called(p0) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// IsMaxDefaultConnectionsReached mocked method +func (m *DaemonerMock) IsMaxDefaultConnectionsReached() (bool, error) { + + ret := m.Called() + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Mirror mocked method +func (m *DaemonerMock) Mirror() uint32 { + + ret := m.Called() + + var r0 uint32 + switch res := ret.Get(0).(type) { + case nil: + case uint32: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// PexConfig mocked method +func (m *DaemonerMock) PexConfig() pex.Config { + + ret := m.Called() + + var r0 pex.Config + switch res := ret.Get(0).(type) { + case nil: + case pex.Config: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RandomExchangeable mocked method +func (m *DaemonerMock) RandomExchangeable(p0 int) pex.Peers { + + ret := m.Called(p0) + + var r0 pex.Peers + switch res := ret.Get(0).(type) { + case nil: + case pex.Peers: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordConnectionMirror mocked method +func (m *DaemonerMock) RecordConnectionMirror(p0 string, p1 uint32) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordMessageEvent mocked method +func (m *DaemonerMock) RecordMessageEvent(p0 AsyncMessage, p1 *gnet.MessageContext) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// RecordPeerHeight mocked method +func (m *DaemonerMock) RecordPeerHeight(p0 string, p1 uint64) { + + m.Called(p0, p1) + +} + +// RemoveFromExpectingIntroductions mocked method +func (m *DaemonerMock) RemoveFromExpectingIntroductions(p0 string) { + + m.Called(p0) + +} + +// RequestBlocksFromAddr mocked method +func (m *DaemonerMock) RequestBlocksFromAddr(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ResetRetryTimes mocked method +func (m *DaemonerMock) ResetRetryTimes(p0 string) { + + m.Called(p0) + +} + +// SendMessage mocked method +func (m *DaemonerMock) SendMessage(p0 string, p1 gnet.Message) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// SetHasIncomingPort mocked method +func (m *DaemonerMock) SetHasIncomingPort(p0 string) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gateway.go b/vendor/github.com/skycoin/skycoin/src/daemon/gateway.go new file mode 100755 index 0000000..880c486 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gateway.go @@ -0,0 +1,1188 @@ +package daemon + +import ( + "sort" + "strings" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/strand" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" + + "fmt" + + "github.com/skycoin/skycoin/src/visor/historydb" +) + +// GatewayConfig configuration set of gateway. +type GatewayConfig struct { + BufferSize int + EnableWalletAPI bool + EnableGUI bool + DisableCSP bool +} + +// NewGatewayConfig create and init an GatewayConfig +func NewGatewayConfig() GatewayConfig { + return GatewayConfig{ + BufferSize: 32, + EnableWalletAPI: false, + EnableGUI: false, + DisableCSP: false, + } +} + +// Gateway RPC interface wrapper for daemon state +type Gateway struct { + Config GatewayConfig + + // Backref to Daemon + d *Daemon + // Backref to Visor + v *visor.Visor + // Requests are queued on this channel + requests chan strand.Request + quit chan struct{} +} + +// NewGateway create and init an Gateway instance. +func NewGateway(c GatewayConfig, d *Daemon) *Gateway { + return &Gateway{ + Config: c, + d: d, + v: d.visor, + requests: make(chan strand.Request, c.BufferSize), + quit: make(chan struct{}), + } +} + +// Shutdown closes the Gateway +func (gw *Gateway) Shutdown() { + close(gw.quit) + // wait for strand to complete + gw.strand("wait-shutdown", func() {}) +} + +func (gw *Gateway) strand(name string, f func()) { + name = fmt.Sprintf("daemon.Gateway.%s", name) + strand.Strand(logger, gw.requests, name, func() error { + f() + return nil + }, gw.quit, nil) +} + +// Connection a connection's state within the daemon +type Connection struct { + ID int `json:"id"` + Addr string `json:"address"` + LastSent int64 `json:"last_sent"` + LastReceived int64 `json:"last_received"` + // Whether the connection is from us to them (true, outgoing), + // or from them to us (false, incoming) + Outgoing bool `json:"outgoing"` + // Whether the client has identified their version, mirror etc + Introduced bool `json:"introduced"` + Mirror uint32 `json:"mirror"` + ListenPort uint16 `json:"listen_port"` +} + +// Connections an array of connections +// Arrays must be wrapped in structs to avoid certain javascript exploits +type Connections struct { + Connections []*Connection `json:"connections"` +} + +// GetConnections returns a *Connections +func (gw *Gateway) GetConnections() *Connections { + var conns *Connections + gw.strand("GetConnections", func() { + conns = gw.getConnections() + }) + return conns +} + +func (gw *Gateway) getConnections() *Connections { + if gw.d.pool.Pool == nil { + return nil + } + + n, err := gw.d.pool.Pool.Size() + if err != nil { + logger.Error(err) + return nil + } + + conns := make([]*Connection, 0, n) + cs, err := gw.d.pool.Pool.GetConnections() + if err != nil { + logger.Error(err) + return nil + } + + for _, c := range cs { + if c.Solicited { + conn := gw.getConnection(c.Addr()) + if conn != nil { + conns = append(conns, conn) + } + } + } + + // Sort connnections by IP address + sort.Slice(conns, func(i, j int) bool { + return strings.Compare(conns[i].Addr, conns[j].Addr) < 0 + }) + + return &Connections{Connections: conns} + +} + +// GetDefaultConnections returns default connections +func (gw *Gateway) GetDefaultConnections() []string { + var conns []string + gw.strand("GetDefaultConnections", func() { + conns = make([]string, len(gw.d.DefaultConnections)) + copy(conns[:], gw.d.DefaultConnections[:]) + }) + return conns +} + +// GetConnection returns a *Connection of specific address +func (gw *Gateway) GetConnection(addr string) *Connection { + var conn *Connection + gw.strand("GetConnection", func() { + conn = gw.getConnection(addr) + }) + return conn +} + +func (gw *Gateway) getConnection(addr string) *Connection { + if gw.d.pool.Pool == nil { + return nil + } + + c, err := gw.d.pool.Pool.GetConnection(addr) + if err != nil { + logger.Error(err) + return nil + } + + if c == nil { + return nil + } + + mirror, exist := gw.d.connectionMirrors.Get(addr) + if !exist { + return nil + } + + return &Connection{ + ID: c.ID, + Addr: addr, + LastSent: c.LastSent.Unix(), + LastReceived: c.LastReceived.Unix(), + Outgoing: gw.d.outgoingConnections.Get(addr), + Introduced: !gw.d.needsIntro(addr), + Mirror: mirror, + ListenPort: gw.d.GetListenPort(addr), + } +} + +// GetTrustConnections returns all trusted connections, +// including private and public +func (gw *Gateway) GetTrustConnections() []string { + var conn []string + gw.strand("GetTrustConnections", func() { + conn = gw.d.pex.Trusted().ToAddrs() + }) + return conn +} + +// GetExchgConnection returns all exchangeable connections, +// including private and public +func (gw *Gateway) GetExchgConnection() []string { + var conn []string + gw.strand("GetExchgConnection", func() { + conn = gw.d.pex.RandomExchangeable(0).ToAddrs() + }) + return conn +} + +/* Blockchain & Transaction status */ + +// BlockchainProgress current sync blockchain status +type BlockchainProgress struct { + // Our current blockchain length + Current uint64 `json:"current"` + // Our best guess at true blockchain length + Highest uint64 `json:"highest"` + Peers []PeerBlockchainHeight `json:"peers"` +} + +// GetBlockchainProgress returns a *BlockchainProgress +func (gw *Gateway) GetBlockchainProgress() (*BlockchainProgress, error) { + var bcp *BlockchainProgress + var err error + gw.strand("GetBlockchainProgress", func() { + var headSeq uint64 + headSeq, _, err = gw.d.visor.HeadBkSeq() + if err != nil { + return + } + + bcp = &BlockchainProgress{ + Current: headSeq, + Highest: gw.d.Heights.Estimate(headSeq), + Peers: gw.d.Heights.All(), + } + }) + + if err != nil { + return nil, err + } + + return bcp, nil +} + +// ResendResult rebroadcast tx result +type ResendResult struct { + Txids []string `json:"txids"` // transaction id +} + +// ResendUnconfirmedTxns resents all unconfirmed transactions +func (gw *Gateway) ResendUnconfirmedTxns() (*ResendResult, error) { + var hashes []cipher.SHA256 + var err error + gw.strand("ResendUnconfirmedTxns", func() { + hashes, err = gw.d.ResendUnconfirmedTxns() + }) + + if err != nil { + return nil, err + } + + var rlt ResendResult + for _, txid := range hashes { + rlt.Txids = append(rlt.Txids, txid.Hex()) + } + return &rlt, nil +} + +// GetBlockchainMetadata returns a *visor.BlockchainMetadata +func (gw *Gateway) GetBlockchainMetadata() (*visor.BlockchainMetadata, error) { + var bcm *visor.BlockchainMetadata + var err error + gw.strand("GetBlockchainMetadata", func() { + bcm, err = gw.v.GetBlockchainMetadata() + }) + return bcm, err +} + +// GetSignedBlockByHash returns the block by hash +func (gw *Gateway) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + var err error + gw.strand("GetSignedBlockByHash", func() { + b, err = gw.v.GetSignedBlockByHash(hash) + }) + return b, err +} + +// GetSignedBlockBySeq returns block by seq +func (gw *Gateway) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + var err error + gw.strand("GetSignedBlockBySeq", func() { + b, err = gw.v.GetSignedBlockBySeq(seq) + }) + return b, err +} + +// GetBlocks returns a *visor.ReadableBlocks +func (gw *Gateway) GetBlocks(start, end uint64) (*visor.ReadableBlocks, error) { + var blocks []coin.SignedBlock + var err error + + gw.strand("GetBlocks", func() { + blocks, err = gw.v.GetBlocks(start, end) + }) + if err != nil { + return nil, err + } + + return visor.NewReadableBlocks(blocks) +} + +// GetBlocksInDepth returns blocks in different depth +func (gw *Gateway) GetBlocksInDepth(vs []uint64) (*visor.ReadableBlocks, error) { + blocks := []coin.SignedBlock{} + var err error + + gw.strand("GetBlocksInDepth", func() { + for _, n := range vs { + var b *coin.SignedBlock + b, err = gw.v.GetSignedBlockBySeq(n) + if err != nil { + err = fmt.Errorf("get block %v failed: %v", n, err) + return + } + + if b == nil { + return + } + + blocks = append(blocks, *b) + } + }) + + if err != nil { + return nil, err + } + + return visor.NewReadableBlocks(blocks) +} + +// GetLastBlocks get last N blocks +func (gw *Gateway) GetLastBlocks(num uint64) (*visor.ReadableBlocks, error) { + var blocks []coin.SignedBlock + var err error + gw.strand("GetLastBlocks", func() { + blocks, err = gw.v.GetLastBlocks(num) + }) + if err != nil { + return nil, err + } + + return visor.NewReadableBlocks(blocks) +} + +// OutputsFilter used as optional arguments in GetUnspentOutputs method +type OutputsFilter func(outputs coin.UxArray) coin.UxArray + +// GetUnspentOutputs gets unspent outputs and returns the filtered results, +// Note: all filters will be executed as the pending sequence in 'AND' mode. +func (gw *Gateway) GetUnspentOutputs(filters ...OutputsFilter) (*visor.ReadableOutputSet, error) { + // unspent outputs + var unspentOutputs []coin.UxOut + // unconfirmed spending outputs + var uncfmSpendingOutputs coin.UxArray + // unconfirmed incoming outputs + var uncfmIncomingOutputs coin.UxArray + var head *coin.SignedBlock + var err error + gw.strand("GetUnspentOutputs", func() { + head, err = gw.v.GetHeadBlock() + if err != nil { + err = fmt.Errorf("v.GetHeadBlock failed: %v", err) + return + } + + unspentOutputs, err = gw.v.GetAllUnspentOutputs() + if err != nil { + err = fmt.Errorf("v.GetAllUnspentOutputs failed: %v", err) + return + } + + uncfmSpendingOutputs, err = gw.v.UnconfirmedSpendingOutputs() + if err != nil { + err = fmt.Errorf("v.UnconfirmedSpendingOutputs failed: %v", err) + return + } + + uncfmIncomingOutputs, err = gw.v.UnconfirmedIncomingOutputs() + if err != nil { + err = fmt.Errorf("v.UnconfirmedIncomingOutputs failed: %v", err) + return + } + }) + + if err != nil { + return nil, err + } + + for _, flt := range filters { + unspentOutputs = flt(unspentOutputs) + uncfmSpendingOutputs = flt(uncfmSpendingOutputs) + uncfmIncomingOutputs = flt(uncfmIncomingOutputs) + } + + outputSet := visor.ReadableOutputSet{} + outputSet.HeadOutputs, err = visor.NewReadableOutputs(head.Time(), unspentOutputs) + if err != nil { + return nil, err + } + + outputSet.OutgoingOutputs, err = visor.NewReadableOutputs(head.Time(), uncfmSpendingOutputs) + if err != nil { + return nil, err + } + + outputSet.IncomingOutputs, err = visor.NewReadableOutputs(head.Time(), uncfmIncomingOutputs) + if err != nil { + return nil, err + } + + return &outputSet, nil +} + +// FbyAddressesNotIncluded filters the unspent outputs that are not owned by the addresses +func FbyAddressesNotIncluded(addrs []string) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := MakeSearchMap(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address.String()]; !ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyAddresses filters the unspent outputs that owned by the addresses +func FbyAddresses(addrs []string) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + addrMatch := coin.UxArray{} + addrMap := MakeSearchMap(addrs) + + for _, u := range outputs { + if _, ok := addrMap[u.Body.Address.String()]; ok { + addrMatch = append(addrMatch, u) + } + } + return addrMatch + } +} + +// FbyHashes filters the unspent outputs that have hashes matched. +func FbyHashes(hashes []string) OutputsFilter { + return func(outputs coin.UxArray) coin.UxArray { + hsMatch := coin.UxArray{} + hsMap := MakeSearchMap(hashes) + + for _, u := range outputs { + if _, ok := hsMap[u.Hash().Hex()]; ok { + hsMatch = append(hsMatch, u) + } + } + return hsMatch + } +} + +// MakeSearchMap returns a search indexed map for use in filters +func MakeSearchMap(addrs []string) map[string]struct{} { + addrMap := make(map[string]struct{}) + for _, addr := range addrs { + addrMap[addr] = struct{}{} + } + + return addrMap +} + +// GetTransaction returns transaction by txid +func (gw *Gateway) GetTransaction(txid cipher.SHA256) (tx *visor.Transaction, err error) { + gw.strand("GetTransaction", func() { + tx, err = gw.v.GetTransaction(txid) + }) + return +} + +// TransactionResult represents transaction result +type TransactionResult struct { + Status visor.TransactionStatus `json:"status"` + Time uint64 `json:"time"` + Transaction visor.ReadableTransaction `json:"txn"` +} + +// NewTransactionResult converts Transaction to TransactionResult +func NewTransactionResult(tx *visor.Transaction) (*TransactionResult, error) { + if tx == nil { + return nil, nil + } + + rbTx, err := visor.NewReadableTransaction(tx) + if err != nil { + return nil, err + } + + return &TransactionResult{ + Transaction: *rbTx, + Status: tx.Status, + Time: tx.Time, + }, nil +} + +// TransactionResults array of transaction results +type TransactionResults struct { + Txns []TransactionResult `json:"txns"` +} + +// NewTransactionResults converts []Transaction to []TransactionResults +func NewTransactionResults(txs []visor.Transaction) (*TransactionResults, error) { + txRlts := make([]TransactionResult, 0, len(txs)) + for _, tx := range txs { + rbTx, err := visor.NewReadableTransaction(&tx) + if err != nil { + return nil, err + } + + txRlts = append(txRlts, TransactionResult{ + Transaction: *rbTx, + Status: tx.Status, + Time: tx.Time, + }) + } + + return &TransactionResults{ + Txns: txRlts, + }, nil +} + +// GetTransactionResult gets transaction result by txid. +func (gw *Gateway) GetTransactionResult(txid cipher.SHA256) (*TransactionResult, error) { + var tx *visor.Transaction + var err error + gw.strand("GetTransactionResult", func() { + tx, err = gw.v.GetTransaction(txid) + }) + + if err != nil { + return nil, err + } + + return NewTransactionResult(tx) +} + +// InjectBroadcastTransaction injects and broadcasts a transaction +func (gw *Gateway) InjectBroadcastTransaction(txn coin.Transaction) error { + var err error + gw.strand("InjectBroadcastTransaction", func() { + err = gw.d.InjectBroadcastTransaction(txn) + }) + return err +} + +// ReadableTransaction has readable transaction data. It differs from visor.ReadableTransaction +// in that it includes metadata for transaction inputs +type ReadableTransaction struct { + Status visor.TransactionStatus `json:"status"` + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Timestamp uint64 `json:"timestamp,omitempty"` + Fee uint64 `json:"fee"` + + Sigs []string `json:"sigs"` + In []visor.ReadableTransactionInput `json:"inputs"` + Out []visor.ReadableTransactionOutput `json:"outputs"` +} + +// NewReadableTransaction creates ReadableTransaction +func NewReadableTransaction(t visor.Transaction, inputs []visor.ReadableTransactionInput) (ReadableTransaction, error) { + // Genesis transaction use empty SHA256 as txid + txID := cipher.SHA256{} + if t.Status.BlockSeq != 0 { + txID = t.Txn.Hash() + } + + sigs := make([]string, len(t.Txn.Sigs)) + for i, s := range t.Txn.Sigs { + sigs[i] = s.Hex() + } + + out := make([]visor.ReadableTransactionOutput, len(t.Txn.Out)) + for i := range t.Txn.Out { + o, err := visor.NewReadableTransactionOutput(&t.Txn.Out[i], txID) + if err != nil { + return ReadableTransaction{}, err + } + + out[i] = *o + } + + var hoursIn uint64 + for _, i := range inputs { + if _, err := coin.AddUint64(hoursIn, i.CalculatedHours); err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransaction summing txn %s input hours error: %v", txID.Hex(), err) + } + hoursIn += i.CalculatedHours + } + + var hoursOut uint64 + for _, o := range t.Txn.Out { + if _, err := coin.AddUint64(hoursOut, o.Hours); err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransaction summing txn %s outputs hours error: %v", txID.Hex(), err) + } + + hoursOut += o.Hours + } + + if hoursIn < hoursOut { + err := fmt.Errorf("NewReadableTransaction input hours is less than output hours, txid=%s", txID.Hex()) + return ReadableTransaction{}, err + } + + fee := hoursIn - hoursOut + + return ReadableTransaction{ + Status: t.Status, + Length: t.Txn.Length, + Type: t.Txn.Type, + Hash: t.Txn.Hash().Hex(), + InnerHash: t.Txn.InnerHash.Hex(), + Timestamp: t.Time, + Fee: fee, + + Sigs: sigs, + In: inputs, + Out: out, + }, nil +} + +// GetTransactionsForAddress returns []ReadableTransaction for a given address. +// These transactions include confirmed and unconfirmed transactions +// TODO -- move into visor (visor.ReadableTransaction can't be changed to daemon.ReadableTransaction without breaking the API) +func (gw *Gateway) GetTransactionsForAddress(a cipher.Address) ([]ReadableTransaction, error) { + var err error + var resTxns []ReadableTransaction + + gw.strand("GetTransactionsForAddress", func() { + var txns []visor.Transaction + txns, err = gw.v.GetAddressTxns(a) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetAddressTxns failed: %v", err) + return + } + + var head *coin.SignedBlock + head, err = gw.v.GetHeadBlock() + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetHeadBlock failed: %v", err) + return + } + + resTxns = make([]ReadableTransaction, len(txns)) + + for i, txn := range txns { + inputs := make([]visor.ReadableTransactionInput, len(txn.Txn.In)) + for j, inputID := range txn.Txn.In { + var input *historydb.UxOut + input, err = gw.v.GetUxOutByID(inputID) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: gw.v.GetUxOutByID failed: %v", err) + return + } + if input == nil { + err = fmt.Errorf("uxout of %v does not exist in history db", inputID.Hex()) + return + } + + // If the txn is confirmed, + // use the time of the transaction when it was executed, + // else use the head time + t := txn.Time + if !txn.Status.Confirmed { + t = head.Time() + } + + var readableInput *visor.ReadableTransactionInput + readableInput, err = visor.NewReadableTransactionInput(input.Out, t) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: visor.NewReadableTransactionInput failed: %v", err) + return + } + + inputs[j] = *readableInput + } + + var rTxn ReadableTransaction + rTxn, err = NewReadableTransaction(txn, inputs) + if err != nil { + logger.Errorf("Gateway.GetTransactionsForAddress: NewReadableTransaction failed: %v", err) + return + } + + resTxns[i] = rTxn + } + + }) + + if err != nil { + return nil, err + } + + return resTxns, nil +} + +// GetTransactions returns transactions filtered by zero or more visor.TxFilter +func (gw *Gateway) GetTransactions(flts ...visor.TxFilter) ([]visor.Transaction, error) { + var txns []visor.Transaction + var err error + gw.strand("GetTransactions", func() { + txns, err = gw.v.GetTransactions(flts...) + }) + return txns, err +} + +// GetUxOutByID gets UxOut by hash id. +func (gw *Gateway) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + var uxout *historydb.UxOut + var err error + gw.strand("GetUxOutByID", func() { + uxout, err = gw.v.GetUxOutByID(id) + }) + return uxout, err +} + +// GetAddrUxOuts gets all the address affected UxOuts. +func (gw *Gateway) GetAddrUxOuts(addresses []cipher.Address) ([]*historydb.UxOut, error) { + var uxOuts []*historydb.UxOut + var err error + + gw.strand("GetAddrUxOuts", func() { + for _, addr := range addresses { + var result []*historydb.UxOut + result, err = gw.v.GetAddrUxOuts(addr) + if err != nil { + return + } + + uxOuts = append(uxOuts, result...) + } + }) + + if err != nil { + return nil, err + } + + return uxOuts, nil +} + +// GetTimeNow returns the current Unix time +func (gw *Gateway) GetTimeNow() uint64 { + return uint64(utc.UnixNow()) +} + +// GetAllUnconfirmedTxns returns all unconfirmed transactions +func (gw *Gateway) GetAllUnconfirmedTxns() ([]visor.UnconfirmedTxn, error) { + var txns []visor.UnconfirmedTxn + var err error + gw.strand("GetAllUnconfirmedTxns", func() { + txns, err = gw.v.GetAllUnconfirmedTxns() + }) + return txns, err +} + +// GetUnconfirmedTxns returns addresses related unconfirmed transactions +func (gw *Gateway) GetUnconfirmedTxns(addrs []cipher.Address) ([]visor.UnconfirmedTxn, error) { + var txns []visor.UnconfirmedTxn + var err error + gw.strand("GetUnconfirmedTxns", func() { + txns, err = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) + }) + return txns, err +} + +// Spend spends coins from given wallet and broadcast it, +// set password as nil if wallet is not encrypted, otherwise the password must be provied. +// return transaction or error. +func (gw *Gateway) Spend(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var txn *coin.Transaction + var err error + gw.strand("Spend", func() { + txn, err = gw.v.CreateTransactionDeprecated(wltID, password, coins, dest) + if err != nil { + return + } + + // Inject transaction + err = gw.d.InjectBroadcastTransaction(*txn) + if err != nil { + logger.Errorf("Inject transaction failed: %v", err) + return + } + }) + + if err != nil { + return nil, err + } + + return txn, nil +} + +// CreateTransaction creates a transaction based upon parameters in wallet.CreateTransactionParams +func (gw *Gateway) CreateTransaction(params wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { + if !gw.Config.EnableWalletAPI { + return nil, nil, wallet.ErrWalletAPIDisabled + } + + var txn *coin.Transaction + var inputs []wallet.UxBalance + var err error + + gw.strand("CreateTransaction", func() { + txn, inputs, err = gw.v.CreateTransaction(params) + }) + + if err != nil { + return nil, nil, err + } + + return txn, inputs, err +} + +// CreateWallet creates wallet +func (gw *Gateway) CreateWallet(wltName string, options wallet.Options) (*wallet.Wallet, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var wlt *wallet.Wallet + var err error + gw.strand("CreateWallet", func() { + wlt, err = gw.v.Wallets.CreateWallet(wltName, options, gw.v) + }) + return wlt, err +} + +// EncryptWallet encrypts the wallet +func (gw *Gateway) EncryptWallet(wltName string, password []byte) (*wallet.Wallet, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var err error + var w *wallet.Wallet + gw.strand("EncryptWallet", func() { + w, err = gw.v.Wallets.EncryptWallet(wltName, password) + }) + return w, err +} + +// DecryptWallet decrypts wallet +func (gw *Gateway) DecryptWallet(wltID string, password []byte) (*wallet.Wallet, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var err error + var w *wallet.Wallet + gw.strand("DecryptWallet", func() { + w, err = gw.v.Wallets.DecryptWallet(wltID, password) + }) + return w, err +} + +// GetWalletBalance returns balance pairs of specific wallet +func (gw *Gateway) GetWalletBalance(wltID string) (wallet.BalancePair, wallet.AddressBalance, error) { + var addressBalances wallet.AddressBalance + var walletBalance wallet.BalancePair + if !gw.Config.EnableWalletAPI { + return walletBalance, addressBalances, wallet.ErrWalletAPIDisabled + } + + var err error + gw.strand("GetWalletBalance", func() { + var addrs []cipher.Address + addrs, err = gw.v.Wallets.GetAddresses(wltID) + if err != nil { + return + } + + // get list of address balances + addrsBalanceList, err := gw.v.GetBalanceOfAddrs(addrs) + if err != nil { + return + } + + // create map of address to balance + addressBalances = make(wallet.AddressBalance, len(addrs)) + for idx, addr := range addrs { + addressBalances[addr.String()] = addrsBalanceList[idx] + } + + // compute the sum of all addresses + for _, addrBalance := range addressBalances { + // compute confirmed balance + walletBalance.Confirmed.Coins, err = coin.AddUint64(walletBalance.Confirmed.Coins, addrBalance.Confirmed.Coins) + if err != nil { + return + } + walletBalance.Confirmed.Hours, err = coin.AddUint64(walletBalance.Confirmed.Hours, addrBalance.Confirmed.Hours) + if err != nil { + return + } + + // compute predicted balance + walletBalance.Predicted.Coins, err = coin.AddUint64(walletBalance.Predicted.Coins, addrBalance.Predicted.Coins) + if err != nil { + return + } + walletBalance.Predicted.Hours, err = coin.AddUint64(walletBalance.Predicted.Hours, addrBalance.Predicted.Hours) + if err != nil { + return + } + } + }) + + return walletBalance, addressBalances, err +} + +// GetBalanceOfAddrs gets balance of given addresses +func (gw *Gateway) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) { + var balance []wallet.BalancePair + var err error + + gw.strand("GetBalanceOfAddrs", func() { + balance, err = gw.v.GetBalanceOfAddrs(addrs) + }) + + if err != nil { + return nil, err + } + + return balance, nil +} + +// GetWalletDir returns path for storing wallet files +func (gw *Gateway) GetWalletDir() (string, error) { + if !gw.Config.EnableWalletAPI { + return "", wallet.ErrWalletAPIDisabled + } + return gw.v.Config.WalletDirectory, nil +} + +// NewAddresses generate addresses in given wallet +func (gw *Gateway) NewAddresses(wltID string, password []byte, n uint64) ([]cipher.Address, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var addrs []cipher.Address + var err error + gw.strand("NewAddresses", func() { + addrs, err = gw.v.Wallets.NewAddresses(wltID, password, n) + }) + return addrs, err +} + +// UpdateWalletLabel updates the label of wallet +func (gw *Gateway) UpdateWalletLabel(wltID, label string) error { + if !gw.Config.EnableWalletAPI { + return wallet.ErrWalletAPIDisabled + } + + var err error + gw.strand("UpdateWalletLabel", func() { + err = gw.v.Wallets.UpdateWalletLabel(wltID, label) + }) + return err +} + +// GetWallet returns wallet by id +func (gw *Gateway) GetWallet(wltID string) (*wallet.Wallet, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var w *wallet.Wallet + var err error + gw.strand("GetWallet", func() { + w, err = gw.v.Wallets.GetWallet(wltID) + }) + return w, err +} + +// GetWallets returns wallets +func (gw *Gateway) GetWallets() (wallet.Wallets, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var w wallet.Wallets + var err error + gw.strand("GetWallets", func() { + w, err = gw.v.Wallets.GetWallets() + }) + return w, err +} + +// GetWalletUnconfirmedTxns returns all unconfirmed transactions in given wallet +func (gw *Gateway) GetWalletUnconfirmedTxns(wltID string) ([]visor.UnconfirmedTxn, error) { + if !gw.Config.EnableWalletAPI { + return nil, wallet.ErrWalletAPIDisabled + } + + var txns []visor.UnconfirmedTxn + var err error + gw.strand("GetWalletUnconfirmedTxns", func() { + var addrs []cipher.Address + addrs, err = gw.v.Wallets.GetAddresses(wltID) + if err != nil { + return + } + + txns, err = gw.v.GetUnconfirmedTxns(visor.ToAddresses(addrs)) + }) + + return txns, err +} + +// ReloadWallets reloads all wallets +func (gw *Gateway) ReloadWallets() error { + if !gw.Config.EnableWalletAPI { + return wallet.ErrWalletAPIDisabled + } + + var err error + gw.strand("ReloadWallets", func() { + err = gw.v.Wallets.ReloadWallets() + }) + return err +} + +// UnloadWallet removes wallet of given id from memory. +func (gw *Gateway) UnloadWallet(id string) error { + if !gw.Config.EnableWalletAPI { + return wallet.ErrWalletAPIDisabled + } + + gw.strand("UnloadWallet", func() { + gw.v.Wallets.Remove(id) + }) + + return nil +} + +// GetWalletSeed returns seed of wallet of given id, +// returns wallet.ErrWalletNotEncrypted if the wallet is not encrypted. +func (gw *Gateway) GetWalletSeed(id string, password []byte) (string, error) { + if !gw.Config.EnableWalletAPI { + return "", wallet.ErrWalletAPIDisabled + } + + var seed string + var err error + gw.strand("GetWalletSeed", func() { + seed, err = gw.v.Wallets.GetWalletSeed(id, password) + }) + return seed, err +} + +// IsWalletAPIEnabled returns if all wallet related apis are disabled +func (gw *Gateway) IsWalletAPIEnabled() bool { + return gw.Config.EnableWalletAPI +} + +// GetBuildInfo returns node build info. +func (gw *Gateway) GetBuildInfo() visor.BuildInfo { + var bi visor.BuildInfo + gw.strand("GetBuildInfo", func() { + bi = gw.v.Config.BuildInfo + }) + return bi +} + +// GetRichlist returns rich list as desc order. +func (gw *Gateway) GetRichlist(includeDistribution bool) (visor.Richlist, error) { + rbOuts, err := gw.GetUnspentOutputs() + if err != nil { + return nil, err + } + + allAccounts, err := rbOuts.AggregateUnspentOutputs() + if err != nil { + return nil, err + } + + lockedAddrs := visor.GetLockedDistributionAddresses() + addrsMap := make(map[string]struct{}, len(lockedAddrs)) + for _, a := range lockedAddrs { + addrsMap[a] = struct{}{} + } + + richlist, err := visor.NewRichlist(allAccounts, addrsMap) + if err != nil { + return nil, err + } + + if !includeDistribution { + unlockedAddrs := visor.GetUnlockedDistributionAddresses() + for _, a := range unlockedAddrs { + addrsMap[a] = struct{}{} + } + richlist = richlist.FilterAddresses(addrsMap) + } + + return richlist, nil +} + +// GetAddressCount returns count number of unique address with uxouts > 0. +func (gw *Gateway) GetAddressCount() (uint64, error) { + var count uint64 + var err error + + gw.strand("GetAddressCount", func() { + count, err = gw.v.AddressCount() + }) + + return count, err +} + +// Health is returned by the /health endpoint +type Health struct { + BlockchainMetadata *visor.BlockchainMetadata + Version visor.BuildInfo + OpenConnections int + Uptime time.Duration +} + +// GetHealth returns statistics about the running node +func (gw *Gateway) GetHealth() (*Health, error) { + var health *Health + var err error + gw.strand("GetHealth", func() { + var metadata *visor.BlockchainMetadata + metadata, err = gw.v.GetBlockchainMetadata() + if err != nil { + return + } + + conns := gw.getConnections() + + health = &Health{ + BlockchainMetadata: metadata, + Version: gw.v.Config.BuildInfo, + OpenConnections: len(conns.Connections), + Uptime: time.Since(gw.v.StartedAt), + } + }) + + return health, err +} + +// VerifyTxnVerbose verifies an isolated transaction and returns []wallet.UxBalance of +// transaction inputs, whether the transaction is confirmed and error if any +func (gw *Gateway) VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) { + var uxs []wallet.UxBalance + var isTxnConfirmed bool + var err error + gw.strand("VerifyTxnVerbose", func() { + uxs, isTxnConfirmed, err = gw.v.VerifyTxnVerbose(txn) + }) + return uxs, isTxnConfirmed, err +} + +// IsCSPEnabled returns if the csp is enabled +func (gw *Gateway) IsCSPEnabled() bool { + return !gw.Config.DisableCSP +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gateway_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/gateway_test.go new file mode 100755 index 0000000..b4c46e1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gateway_test.go @@ -0,0 +1,449 @@ +package daemon + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/visor" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" +) + +func TestFbyAddresses(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + addrs []string + outputs []coin.UxOut + want []coin.UxOut + }{ + // TODO: Add test cases. + { + "filter with one address", + []string{addrs[0].String()}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple addresses", + []string{addrs[0].String(), addrs[1].String()}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + // fmt.Printf("want:%+v\n", tt.want) + outs := FbyAddresses(tt.addrs)(tt.outputs) + require.Equal(t, outs, coin.UxArray(tt.want)) + } +} + +func TestFbyHashes(t *testing.T) { + uxs := make(coin.UxArray, 5) + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = testutil.MakeAddress() + uxs[i] = coin.UxOut{ + Body: coin.UxBody{ + Address: addrs[i], + }, + } + } + + tests := []struct { + name string + hashes []string + outputs coin.UxArray + want coin.UxArray + }{ + // TODO: Add test cases. + { + "filter with one hash", + []string{uxs[0].Hash().Hex()}, + uxs[:2], + uxs[:1], + }, + { + "filter with multiple hash", + []string{uxs[0].Hash().Hex(), uxs[1].Hash().Hex()}, + uxs[:3], + uxs[:2], + }, + } + for _, tt := range tests { + outs := FbyHashes(tt.hashes)(tt.outputs) + require.Equal(t, outs, coin.UxArray(tt.want)) + } +} + +func TestGateway_GetWalletDir(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + result string + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.GetWalletDir() + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_NewAddresses(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + n uint64 + result []cipher.Address + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.NewAddresses(tc.walletID, nil, tc.n) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_UpdateWalletLabel(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + label string + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + err := gw.UpdateWalletLabel(tc.walletID, tc.label) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + }) + } +} + +func TestGateway_GetWallet(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + result wallet.Wallet + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.GetWallet(tc.walletID) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_GetWallets(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + wallets wallet.Wallets + getWalletError error + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + w, err := gw.GetWallets() + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.wallets, w) + }) + } +} + +func TestGateway_GetWalletUnconfirmedTxns(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + result []visor.UnconfirmedTxn + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.GetWalletUnconfirmedTxns(tc.walletID) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_ReloadWallets(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + err := gw.ReloadWallets() + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + }) + } +} + +func TestGateway_Spend(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + coins uint64 + dest cipher.Address + result *coin.Transaction + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.Spend(tc.walletID, nil, tc.coins, tc.dest) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_CreateWallet(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + wltName string + options wallet.Options + result wallet.Wallet + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, err := gw.CreateWallet(tc.wltName, tc.options) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_GetWalletBalance(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + walletID string + result wallet.BalancePair + err error + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + walletID: "foo.wlt", + err: wallet.ErrWalletAPIDisabled, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + res, _, err := gw.GetWalletBalance(tc.walletID) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + require.Equal(t, tc.result, res) + }) + } +} + +func TestGateway_CreateTransaction(t *testing.T) { + tests := []struct { + name string + enableWalletAPI bool + err error + txn *coin.Transaction + inputs []wallet.UxBalance + params wallet.CreateTransactionParams + }{ + { + name: "wallet api disabled", + enableWalletAPI: false, + err: wallet.ErrWalletAPIDisabled, + params: wallet.CreateTransactionParams{}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + gw := &Gateway{ + Config: GatewayConfig{ + EnableWalletAPI: tc.enableWalletAPI, + }, + } + + txn, inputs, err := gw.CreateTransaction(tc.params) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.txn, txn) + require.Equal(t, tc.inputs, inputs) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md new file mode 100755 index 0000000..df43774 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/README.md @@ -0,0 +1,7 @@ +gnet +==== + +[![GoDoc](http://godoc.org/github.com//skycoin/gnet?status.png)](http://godoc.org/github.com/skycoin/gnet) + +[Godoc generated documentation](https://godoc.org/github.com/skycoin/gnet) + diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go new file mode 100755 index 0000000..e6fbd12 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher.go @@ -0,0 +1,126 @@ +package gnet + +import ( + "errors" + "fmt" + "net" + "reflect" + "time" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// SendResult result of a single message send +type SendResult struct { + Addr string + Message Message + Error error +} + +func newSendResult(addr string, m Message, err error) SendResult { + return SendResult{ + Addr: addr, + Message: m, + Error: err, + } +} + +// Serializes a Message over a net.Conn +func sendMessage(conn net.Conn, msg Message, timeout time.Duration) error { + m := EncodeMessage(msg) + return sendByteMessage(conn, m, timeout) +} + +// Event handler that is called after a Connection sends a complete message +func convertToMessage(id int, msg []byte, debugPrint bool) (Message, error) { + msgID := [4]byte{} + if len(msg) < len(msgID) { + return nil, errors.New("Not enough data to read msg id") + } + copy(msgID[:], msg[:len(msgID)]) + msg = msg[len(msgID):] + t, succ := MessageIDReverseMap[msgID] + if !succ { + return nil, fmt.Errorf("Unknown message %s received", string(msgID[:])) + } + + if debugPrint { + logger.Debugf("convertToMessage for connection %d, message type %v", id, t) + } + + var m Message + v := reflect.New(t) + //logger.Debugf("Giving %d bytes to the decoder", len(msg)) + used, err := deserializeMessage(msg, v) + if err != nil { + return nil, err + } + + if used != len(msg) { + return nil, errors.New("Data buffer was not completely decoded") + } + + m, succ = (v.Interface()).(Message) + if !succ { + // This occurs only when the user registers an interface that does + // match the Message interface. They should have known about this + // earlier via a call to VerifyMessages + logger.Panic("Message obtained from map does not match Message interface") + return nil, errors.New("MessageIdMaps contain non-Message") + } + return m, nil +} + +// Wraps encoder.DeserializeRawToValue and traps panics as an error +func deserializeMessage(msg []byte, v reflect.Value) (n int, e error) { + defer func() { + if r := recover(); r != nil { + logger.Debugf("Recovering from deserializer panic: %v", r) + switch x := r.(type) { + case string: + e = errors.New(x) + case error: + e = x + default: + e = errors.New("Message deserialization failed") + } + } + }() + n, e = encoder.DeserializeRawToValue(msg, v) + return +} + +// EncodeMessage packs a Message into []byte containing length, id and data +func EncodeMessage(msg Message) []byte { + t := reflect.ValueOf(msg).Elem().Type() + msgID, succ := MessageIDMap[t] + if !succ { + txt := "Attempted to serialize message struct not in MessageIdMap: %v" + logger.Panicf(txt, msg) + } + bMsg := encoder.Serialize(msg) + + // message length + bLen := encoder.SerializeAtomic(uint32(len(bMsg) + len(msgID))) + m := make([]byte, 0) + m = append(m, bLen...) // length prefix + m = append(m, msgID[:]...) // message id + m = append(m, bMsg...) // message bytes + return m +} + +// Sends []byte over a net.Conn +var sendByteMessage = func(conn net.Conn, msg []byte, + timeout time.Duration) error { + deadline := time.Time{} + if timeout != 0 { + deadline = time.Now().Add(timeout) + } + if err := conn.SetWriteDeadline(deadline); err != nil { + return err + } + if _, err := conn.Write(msg); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher_test.go new file mode 100755 index 0000000..8c28db7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/dispatcher_test.go @@ -0,0 +1,216 @@ +package gnet + +import ( + "bytes" + "errors" + "net" + "reflect" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +var ( + _sendByteMessage = sendByteMessage +) + +func resetHandler() { + sendByteMessage = _sendByteMessage +} + +func TestConvertToMessage(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + assert.Nil(t, err) + assert.NotNil(t, m) + if m == nil { + t.Fatalf("ConvertToMessage failed") + } + bm := m.(*ByteMessage) + assert.Equal(t, bm.X, byte(7)) +} + +func TestConvertToMessageNoMessageId(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := []byte{} + m, err := convertToMessage(c.ID, b, testing.Verbose()) + assert.Nil(t, m) + assert.NotNil(t, err) + assert.Equal(t, err.Error(), "Not enough data to read msg id") +} + +func TestConvertToMessageUnknownMessage(t *testing.T) { + EraseMessages() + resetHandler() + c := &Connection{} + b := MessagePrefix{'C', 'C', 'C', 'C'} + m, err := convertToMessage(c.ID, b[:], testing.Verbose()) + assert.NotNil(t, err) + assert.Equal(t, err.Error(), "Unknown message CCCC received") + assert.Nil(t, m) +} + +func TestConvertToMessageBadDeserialize(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + c := &Connection{} + // Test with too many bytes + b := append(DummyPrefix[:], []byte{0, 1, 1, 1}...) + m, err := convertToMessage(c.ID, b, testing.Verbose()) + assert.NotNil(t, err) + assert.Nil(t, m) + + // Test with not enough bytes + b = append([]byte{}, BytePrefix[:]...) + m, err = convertToMessage(c.ID, b, testing.Verbose()) + assert.NotNil(t, err) + assert.Equal(t, err.Error(), "Deserialization failed") + assert.Nil(t, m) +} + +func TestConvertToMessageNotMessage(t *testing.T) { + EraseMessages() + resetHandler() + RegisterMessage(NothingPrefix, Nothing{}) + // don't verify messages + c := &Connection{} + assert.Panics(t, func() { + convertToMessage(c.ID, NothingPrefix[:], testing.Verbose()) + }) +} + +func TestDeserializeMessageTrapsPanic(t *testing.T) { + resetHandler() + EraseMessages() + p := 7 + m := PointerMessage{Ptr: &p} + b := []byte{4, 4, 4, 4, 4, 4, 4, 4} + _, err := deserializeMessage(b, reflect.ValueOf(m)) + assert.NotNil(t, err) + assert.Equal(t, err.Error(), + "Decode error: kind invalid not handled") +} + +func TestEncodeMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + b := EncodeMessage(m) + assert.True(t, bytes.Equal(b, []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7})) +} + +func TestEncodeMessageUnknownMessage(t *testing.T) { + resetHandler() + EraseMessages() + assert.Panics(t, func() { EncodeMessage(&DummyMessage{}) }) +} + +func TestSendByteMessage(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, 0) + assert.Nil(t, err) + assert.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + assert.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWithTimeout(t *testing.T) { + resetHandler() + b := []byte{1} + c := NewCaptureConn() + err := sendByteMessage(c, b, time.Minute) + assert.Nil(t, err) + assert.True(t, bytes.Equal(c.(*CaptureConn).Wrote, b)) + assert.True(t, c.(*CaptureConn).WriteDeadlineSet) +} + +func TestSendByteMessageWriteFailed(t *testing.T) { + resetHandler() + c := &FailingWriteConn{} + err := sendByteMessage(c, nil, 0) + assert.NotNil(t, err) +} + +func TestSendByteMessageWriteDeadlineFailed(t *testing.T) { + resetHandler() + c := &FailingWriteDeadlineConn{} + err := sendByteMessage(c, nil, 0) + assert.NotNil(t, err) +} + +func TestSendMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + m := NewByteMessage(7) + sendByteMessage = func(conn net.Conn, msg []byte, tm time.Duration) error { + expect := []byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E', 7} + assert.True(t, bytes.Equal(msg, expect)) + return nil + } + err := sendMessage(nil, m, 0) + assert.Nil(t, err) +} + +/* Helpers */ + +func failingSendByteMessage(conn net.Conn, m []byte, tm time.Duration) error { + return errors.New("send byte message failed") +} + +type CaptureConn struct { + Wrote []byte + WriteDeadlineSet bool + net.Conn +} + +func NewCaptureConn() net.Conn { + return &CaptureConn{Wrote: nil, WriteDeadlineSet: false} +} + +func (cc *CaptureConn) Write(b []byte) (int, error) { + cc.Wrote = b + return len(b), nil +} + +func (cc *CaptureConn) SetWriteDeadline(t time.Time) error { + cc.WriteDeadlineSet = true + return nil +} + +type FailingWriteDeadlineConn struct { + net.Conn +} + +func (c *FailingWriteDeadlineConn) SetWriteDeadline(t time.Time) error { + return errors.New("failed") +} + +type FailingWriteConn struct { + net.Conn +} + +func (c *FailingWriteConn) Write(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (c *FailingWriteConn) SetWriteDeadline(t time.Time) error { + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go new file mode 100755 index 0000000..fd144b1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message.go @@ -0,0 +1,166 @@ +package gnet + +import ( + "reflect" +) + +const messagePrefixLength = 4 + +// MessagePrefix message prefix identifies a message +type MessagePrefix [messagePrefixLength]byte + +// MessagePrefixFromString creates MessagePrefix from string +func MessagePrefixFromString(prefix string) MessagePrefix { + if len(prefix) == 0 || len(prefix) > 4 { + logger.Panicf("Invalid prefix %s", prefix) + } + p := MessagePrefix{} + for i, c := range prefix { + p[i] = byte(c) + } + for i := len(prefix); i < 4; i++ { + p[i] = 0x00 + } + return p +} + +/* + Need to use bytes type + - need to get rid of interface message type + - need to store abstract function pointer + - need to invoke the abstract message pointer + +Operations +- store a function signature (variable?) +- store a function +- + +*/ + +/* +Message Type needs to embody multiple types of struct data +- each type must have a response function +- the second parameter of each response function is different for each type +*/ + +/* +func Call(m map[string]interface{}, name string, params ... interface{}) (result []reflect.Value, err error) { +    f = reflect.ValueOf(m[name]) +    if len(params) != f.Type().NumIn() { +        err = errors.New("The number of params is not adapted.") +        return +    } +    in := make([]reflect.Value, len(params)) +    for k, param := range params { +        in[k] = reflect.ValueOf(param) +    } +    result = f[name].Call(in) +    return +} +Call(funcs, "foo") +Call(funcs, "bar", 1, 2, 3) + +func foobar() { + // bla...bla...bla... +} +funcs := map[string]func() {"foobar":foobar} +funcs["foobar"]() + +*/ + +// Message message interface +type Message interface { + // State is user-defined application state that is attached to the + // Dispatcher. + // Return a non-nil error from handle only if you've disconnected the + // client. You don't have to return the DisconnectReason but that may + // be the most convenient. If error is not nil, event buffer processing + // is aborted. + Handle(context *MessageContext, state interface{}) error +} + +// MessageContext message context +type MessageContext struct { + // Conn *Connection // connection message was received from + ConnID int // connection message was received from + Addr string +} + +// NewMessageContext creates MessageContext +func NewMessageContext(conn *Connection) *MessageContext { + if conn.Conn != nil { + return &MessageContext{ConnID: conn.ID, Addr: conn.Addr()} + } + return &MessageContext{ConnID: conn.ID} +} + +// MessageIDMap maps message types to their ids +var MessageIDMap = make(map[reflect.Type]MessagePrefix) + +// MessageIDReverseMap maps message ids to their types +var MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) + +// RegisterMessage registers a message struct for recognition by the message handlers. +func RegisterMessage(prefix MessagePrefix, msg interface{}) { + t := reflect.TypeOf(msg) + id := MessagePrefix{} + copy(id[:], prefix[:]) + _, exists := MessageIDReverseMap[id] + if exists { + logger.Panicf("Attempted to register message prefix %s twice", + string(id[:])) + } + _, exists = MessageIDMap[t] + if exists { + logger.Panicf("Attempts to register message type %v twice", t) + } + MessageIDMap[t] = id + MessageIDReverseMap[id] = t +} + +// VerifyMessages calls logger.Panic if message registration violates sanity checks +func VerifyMessages() { + for t, k := range MessageIDMap { + // No empty prefixes allowed + if k[0] == 0x00 { + logger.Panic("No empty message prefixes allowed") + } + // No non-null bytes allowed after a nul byte + hasEmpty := false + for _, b := range k { + if b == 0x00 { + hasEmpty = true + } else if hasEmpty { + logger.Panic("No non-null bytes allowed after a nul byte") + } + } + // All characters must be non-whitespace printable ascii chars/digits + // No punctation + for _, b := range k { + if !((b >= '0' && b <= '9') || (b >= 'A' && b <= 'Z') || + (b >= 'a' && b <= 'z') || b == 0x00) { + logger.Panicf("Invalid prefix byte %v", b) + } + } + + // Confirm that all registered messages support the Message interface + // This should only be untrue if the user modified the message map + // directly + mptr := reflect.PtrTo(t) + if !mptr.Implements(reflect.TypeOf((*Message)(nil)).Elem()) { + m := "Message must implement the gnet.Message interface" + logger.Panicf("Invalid message at id %d: %s", k, m) + } + } + if len(MessageIDMap) != len(MessageIDReverseMap) { + logger.Panic("MessageIdMap mismatch") + } + // No empty prefixes + // All prefixes must be 0 padded +} + +// EraseMessages wipes all recorded message types +func EraseMessages() { + MessageIDMap = make(map[reflect.Type]MessagePrefix) + MessageIDReverseMap = make(map[MessagePrefix]reflect.Type) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message_test.go new file mode 100755 index 0000000..071de3a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/message_test.go @@ -0,0 +1,183 @@ +package gnet + +import ( + "errors" + "reflect" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewMessageContext(t *testing.T) { + c := &Connection{} + mc := NewMessageContext(c) + assert.Equal(t, mc.ConnID, c.ID) +} + +func TestRegisterMessage(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + assert.Equal(t, len(MessageIDMap), 1) + assert.Equal(t, len(MessageIDReverseMap), 1) + assert.NotNil(t, MessageIDReverseMap[DummyPrefix]) + + RegisterMessage(ErrorPrefix, ErrorMessage{}) + assert.Equal(t, len(MessageIDMap), 2) + assert.Equal(t, len(MessageIDReverseMap), 2) + assert.NotNil(t, MessageIDReverseMap[ErrorPrefix]) +} + +func TestEraseMessages(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + assert.Equal(t, len(MessageIDMap), 1) + assert.Equal(t, len(MessageIDReverseMap), 1) + EraseMessages() + assert.Equal(t, len(MessageIDMap), 0) + assert.Equal(t, len(MessageIDReverseMap), 0) +} + +func TestVerifyMessages(t *testing.T) { + // VerifyMessages either no-ops or panics. Make sure it doesnt panic + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + assert.NotPanics(t, VerifyMessages) +} + +func TestVerifyMessagesDuplicateRegistered(t *testing.T) { + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + assert.Panics(t, func() { RegisterMessage(DummyPrefix, DummyMessage{}) }) + assert.Panics(t, func() { RegisterMessage(BytePrefix, DummyMessage{}) }) +} + +func TestVerifyMessagesNotAMessage(t *testing.T) { + EraseMessages() + RegisterMessage(NothingPrefix, Nothing{}) + assert.Panics(t, VerifyMessages) +} + +func TestVerifyMessagesBadPrefix(t *testing.T) { + EraseMessages() + // Can't be all null + RegisterMessage(MessagePrefix{0x00, 0x00, 0x00, 0x00}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + // Can't start with nul + RegisterMessage(MessagePrefix{0x00, 'A', 'A', 'A'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + // Can't have non nul after nul + RegisterMessage(MessagePrefix{'A', 0x00, 'A', 'A'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + // Can't have invalid ascii bytes + RegisterMessage(MessagePrefix{'A', 'A', 'A', '\n'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '@'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ' '}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '{'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '`'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '['}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', '/'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + RegisterMessage(MessagePrefix{'A', 'A', 'A', ':'}, DummyMessage{}) + assert.Panics(t, VerifyMessages) + EraseMessages() + // Some valid messages + RegisterMessage(MessagePrefix{'1', '9', 'A', 'z'}, DummyMessage{}) + assert.NotPanics(t, VerifyMessages) + EraseMessages() +} + +func TestVerifyMessagesCorruptMap(t *testing.T) { + // MessageIdMap circumvented + EraseMessages() + mtype := reflect.TypeOf(DummyMessage{}) + MessageIDMap[mtype] = DummyPrefix + assert.Panics(t, VerifyMessages) + delete(MessageIDMap, mtype) + // MessageIdReverseMap circumvented + EraseMessages() + MessageIDReverseMap[DummyPrefix] = mtype + assert.Panics(t, VerifyMessages) + delete(MessageIDReverseMap, DummyPrefix) +} + +func TestMessagePrefixFromString(t *testing.T) { + EraseMessages() + assert.Panics(t, func() { MessagePrefixFromString("") }) + assert.Panics(t, func() { MessagePrefixFromString("xxxxx") }) + assert.Equal(t, MessagePrefixFromString("abcd"), + MessagePrefix{'a', 'b', 'c', 'd'}) + assert.Equal(t, MessagePrefixFromString("abc"), + MessagePrefix{'a', 'b', 'c', 0x00}) + assert.Equal(t, MessagePrefixFromString("ab"), + MessagePrefix{'a', 'b', 0x00, 0x00}) + assert.Equal(t, MessagePrefixFromString("a"), + MessagePrefix{'a', 0x00, 0x00, 0x00}) +} + +/* Helpers */ + +type Nothing struct{} + +var NothingPrefix = MessagePrefix{'N', 'O', 'T', 'H'} + +type DummyMessage struct{} + +var DummyPrefix = MessagePrefix{'D', 'U', 'M', 'Y'} + +func (dm *DummyMessage) Handle(context *MessageContext, x interface{}) error { + return nil +} + +func NewDummyMessage() Message { + return &DummyMessage{} +} + +type ErrorMessage struct{} + +var ( + ErrorPrefix = MessagePrefix{'E', 'R', 'R', 0x00} + ErrErrorMessageHandler = errors.New("Bad") +) + +func (em *ErrorMessage) Handle(context *MessageContext, x interface{}) error { + return ErrErrorMessageHandler +} + +func NewErrorMessage() Message { + return &ErrorMessage{} +} + +type ByteMessage struct { + X byte +} + +var BytePrefix = MessagePrefix{'B', 'Y', 'T', 'E'} + +func (bm *ByteMessage) Handle(c *MessageContext, x interface{}) error { + return nil +} + +func NewByteMessage(x byte) Message { + return &ByteMessage{X: x} +} + +type PointerMessage struct { + Ptr *int +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go new file mode 100755 index 0000000..816c551 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool.go @@ -0,0 +1,945 @@ +package gnet + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "net" + "reflect" + "sync" + "time" + + "io" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/daemon/strand" + + "github.com/skycoin/skycoin/src/util/elapse" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/utc" +) + +// DisconnectReason is passed to ConnectionPool's DisconnectCallback +type DisconnectReason error + +const ( + receiveMessageDurationThreshold = 500 * time.Millisecond + readLoopDurationThreshold = 10 * time.Second + sendInMsgChanDurationThreshold = 5 * time.Second + sendLoopDurationThreshold = 500 * time.Millisecond + defaultMaxDefaultConnNum = 1 +) + +var ( + // ErrDisconnectReadFailed also includes a remote closed socket + ErrDisconnectReadFailed DisconnectReason = errors.New("Read failed") + // ErrDisconnectWriteFailed write faile + ErrDisconnectWriteFailed DisconnectReason = errors.New("Write failed") + // ErrDisconnectSetReadDeadlineFailed set read deadline failed + ErrDisconnectSetReadDeadlineFailed = errors.New("SetReadDeadline failed") + // ErrDisconnectInvalidMessageLength invalid message length + ErrDisconnectInvalidMessageLength DisconnectReason = errors.New("Invalid message length") + // ErrDisconnectMalformedMessage malformed message + ErrDisconnectMalformedMessage DisconnectReason = errors.New("Malformed message body") + // ErrDisconnectUnknownMessage unknow message + ErrDisconnectUnknownMessage DisconnectReason = errors.New("Unknown message ID") + // ErrDisconnectUnexpectedError unexpected error + ErrDisconnectUnexpectedError DisconnectReason = errors.New("Unexpected error encountered") + // ErrConnectionPoolClosed error message indicates the connection pool is closed + ErrConnectionPoolClosed = errors.New("Connection pool is closed") + // ErrWriteQueueFull write queue is full + ErrWriteQueueFull = errors.New("Write queue full") + // ErrNoReachableConnections when broadcasting a message, no connections were available to send a message to + ErrNoReachableConnections = errors.New("All pool connections are unreachable at this time") + // ErrMaxDefaultConnectionsReached returns when maximum number of default connections is reached + ErrMaxDefaultConnectionsReached = errors.New("maximum number of default outgoing connections was reached") + // Logger + logger = logging.MustGetLogger("gnet") +) + +// Config gnet config +type Config struct { + // Address to listen on. Leave empty for arbitrary assignment + Address string + // Port to listen on. Set to 0 for arbitrary assignment + Port uint16 + // Connection limits + MaxConnections int + // Messages greater than length are rejected and the sender disconnected + MaxMessageLength int + // Maximum allowed default outgoing connection number + MaxDefaultPeerOutgoingConnections int + // Timeout is the timeout for dialing new connections. Use a + // timeout of 0 to ignore timeout. + DialTimeout time.Duration + // Timeout for reading from a connection. Set to 0 to default to the + // system's timeout + ReadTimeout time.Duration + // Timeout for writing to a connection. Set to 0 to default to the + // system's timeout + WriteTimeout time.Duration + // Message sent event buffers + SendResultsSize int + // Individual connections' send queue size. This should be increased + // if send volume per connection is high, so as not to block + ConnectionWriteQueueSize int + // Triggered on client disconnect + DisconnectCallback DisconnectCallback + // Triggered on client connect + ConnectCallback ConnectCallback + // Print debug logs + DebugPrint bool + // Default connections map + DefaultPeerConnections map[string]struct{} +} + +// NewConfig returns a Config with defaults set +func NewConfig() Config { + return Config{ + Address: "", + Port: 0, + MaxConnections: 128, + MaxMessageLength: 256 * 1024, + MaxDefaultPeerOutgoingConnections: defaultMaxDefaultConnNum, + DialTimeout: time.Second * 30, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 30, + SendResultsSize: 2048, + ConnectionWriteQueueSize: 128, + DisconnectCallback: nil, + ConnectCallback: nil, + DebugPrint: false, + DefaultPeerConnections: make(map[string]struct{}), + } +} + +const ( + // Byte size of the length prefix in message, sizeof(int32) + messageLengthSize = 4 +) + +// Connection is stored by the ConnectionPool +type Connection struct { + // Key in ConnectionPool.Pool + ID int + // TCP connection + Conn net.Conn + // Message buffer + Buffer *bytes.Buffer + // Reference back to ConnectionPool container + ConnectionPool *ConnectionPool + // Last time a message was fully parsed and handled + LastReceived time.Time + // Last time a message was sent to the connection + LastSent time.Time + // Message send queue. + WriteQueue chan Message + Solicited bool +} + +// NewConnection creates a new Connection tied to a ConnectionPool +func NewConnection(pool *ConnectionPool, id int, conn net.Conn, writeQueueSize int, solicited bool) *Connection { + return &Connection{ + ID: id, + Conn: conn, + Buffer: &bytes.Buffer{}, + ConnectionPool: pool, + LastReceived: Now(), + LastSent: Now(), + WriteQueue: make(chan Message, writeQueueSize), + Solicited: solicited, + } +} + +// Addr returns remote address +func (conn *Connection) Addr() string { + return conn.Conn.RemoteAddr().String() +} + +// String returns connection address +func (conn *Connection) String() string { + return conn.Addr() +} + +// Close close the connection and write queue +func (conn *Connection) Close() error { + err := conn.Conn.Close() + close(conn.WriteQueue) + conn.Buffer = &bytes.Buffer{} + return err +} + +// DisconnectCallback triggered on client disconnect +type DisconnectCallback func(addr string, reason DisconnectReason) + +// ConnectCallback triggered on client connect +type ConnectCallback func(addr string, solicited bool) + +// ConnectionPool connection pool +type ConnectionPool struct { + // Configuration parameters + Config Config + // Channel for async message sending + SendResults chan SendResult + // All connections, indexed by ConnId + pool map[int]*Connection + // All connections, indexed by address + addresses map[string]*Connection + // connected default peer connections + defaultPeerConnections map[string]struct{} + // User-defined state to be passed into message handlers + messageState interface{} + // Connection ID counter + connID int + // Listening connection + listener net.Listener + // operations channel + reqC chan strand.Request + // quit channel + quit chan struct{} + done chan struct{} + strandDone chan struct{} + wg sync.WaitGroup +} + +// NewConnectionPool creates a new ConnectionPool that will listen on +// Config.Port upon StartListen. State is an application defined object that +// will be passed to a Message's Handle(). +func NewConnectionPool(c Config, state interface{}) *ConnectionPool { + pool := &ConnectionPool{ + Config: c, + pool: make(map[int]*Connection), + addresses: make(map[string]*Connection), + defaultPeerConnections: make(map[string]struct{}), + SendResults: make(chan SendResult, c.SendResultsSize), + messageState: state, + quit: make(chan struct{}), + done: make(chan struct{}), + strandDone: make(chan struct{}), + reqC: make(chan strand.Request), + } + + return pool +} + +// Run starts the connection pool +func (pool *ConnectionPool) Run() error { + defer close(pool.done) + defer logger.Info("Connection pool closed") + + // start the connection accept loop + addr := fmt.Sprintf("%s:%v", pool.Config.Address, pool.Config.Port) + logger.Infof("Listening for connections on %s...", addr) + + ln, err := net.Listen("tcp", addr) + if err != nil { + return err + } + + pool.listener = ln + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + pool.processStrand() + }() + +loop: + for { + conn, err := ln.Accept() + if err != nil { + // When Accept() returns with a non-nil error, we check the quit + // channel to see if we should continue or quit + select { + case <-pool.quit: + break loop + default: + // without the default case the select will block. + logger.Error(err) + continue + } + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, false); err != nil { + logger.Errorf("pool.handleConnection error: %v", err) + } + }() + } + pool.wg.Wait() + return nil +} + +// RunOffline runs the pool in offline mode. No connections will be accepted, +// but strand requests are processed. +func (pool *ConnectionPool) RunOffline() error { + defer close(pool.done) + pool.processStrand() + return nil +} + +func (pool *ConnectionPool) processStrand() { + defer close(pool.strandDone) + for { + select { + case <-pool.quit: + return + case req := <-pool.reqC: + if err := req.Func(); err != nil { + logger.Errorf("req.Func %s failed: %v", req.Name, err) + } + } + } +} + +// Shutdown gracefully shutdown the connection pool +func (pool *ConnectionPool) Shutdown() { + close(pool.quit) + + // Wait for all strand() calls to finish + <-pool.strandDone + + // Close to listener to prevent new connections + if pool.listener != nil { + pool.listener.Close() + } + + pool.listener = nil + + // In readData, reader.Read() sometimes blocks instead of returning an error when the + // listener is closed. + // Directly close all connections before closing the listener. + // TODO -- could conn.Close() block too? + pool.disconnectAll() + + if len(pool.pool) != 0 { + logger.Critical().Warning("pool.pool is not empty after calling pool.disconnectAll()") + } + if len(pool.addresses) != 0 { + logger.Critical().Warning("pool.addresses is not empty after calling pool.disconnectAll()") + } + + <-pool.done +} + +// strand ensures all read and write action of pool's member variable are in one thread. +func (pool *ConnectionPool) strand(name string, f func() error) error { + name = fmt.Sprintf("daemon.gnet.ConnectionPool.%s", name) + return strand.Strand(logger, pool.reqC, name, f, pool.quit, ErrConnectionPoolClosed) +} + +// NewConnection creates a new Connection around a net.Conn. Trying to make a connection +// to an address that is already connected will failed. +func (pool *ConnectionPool) NewConnection(conn net.Conn, solicited bool) (*Connection, error) { + a := conn.RemoteAddr().String() + var nc *Connection + if err := pool.strand("NewConnection", func() error { + if _, ok := pool.addresses[a]; ok { + return fmt.Errorf("Already connected to %s", a) + } + + if _, ok := pool.Config.DefaultPeerConnections[a]; ok { + if len(pool.defaultPeerConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections && solicited { + return ErrMaxDefaultConnectionsReached + } + + pool.defaultPeerConnections[a] = struct{}{} + } + + pool.connID++ + nc = NewConnection(pool, pool.connID, conn, pool.Config.ConnectionWriteQueueSize, solicited) + + pool.pool[nc.ID] = nc + pool.addresses[a] = nc + return nil + }); err != nil { + return nil, err + } + + return nc, nil +} + +// ListeningAddress returns address, on which the ConnectionPool +// listening on. It returns nil, and error if the ConnectionPool +// is not listening +func (pool *ConnectionPool) ListeningAddress() (net.Addr, error) { + if pool.listener == nil { + return nil, errors.New("Not listening, call StartListen first") + } + return pool.listener.Addr(), nil +} + +// Creates a Connection and begins its read and write loop +func (pool *ConnectionPool) handleConnection(conn net.Conn, solicited bool) error { + defer logger.Debugf("Connection %s closed", conn.RemoteAddr()) + addr := conn.RemoteAddr().String() + + c, err := func() (c *Connection, err error) { + defer func() { + if err != nil { + if closeErr := conn.Close(); closeErr != nil { + logger.Errorf("conn.Close() %s error: %v", addr, closeErr) + } + } + }() + + exist, err := pool.IsConnExist(addr) + if err != nil { + return + } + if exist { + err = fmt.Errorf("Connection %s already exists", addr) + return + } + + c, err = pool.NewConnection(conn, solicited) + if err != nil { + err = fmt.Errorf("Create connection to %s failed: %v", addr, err) + return + } + + return c, err + }() + + if err != nil { + return err + } + + if pool.Config.ConnectCallback != nil { + pool.Config.ConnectCallback(c.Addr(), solicited) + } + + msgC := make(chan []byte, 32) + errC := make(chan error, 3) + + var wg sync.WaitGroup + wg.Add(1) + qc := make(chan struct{}) + go func() { + defer wg.Done() + if err := pool.readLoop(c, msgC, qc); err != nil { + errC <- err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + if err := pool.sendLoop(c, pool.Config.WriteTimeout, qc); err != nil { + errC <- err + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + elapser := elapse.NewElapser(receiveMessageDurationThreshold, logger) + defer elapser.CheckForDone() + + for { + select { + case msg, ok := <-msgC: + if !ok { + return + } + elapser.Register(fmt.Sprintf("pool.receiveMessage address=%s", addr)) + if err := pool.receiveMessage(c, msg); err != nil { + errC <- err + return + } + elapser.CheckForDone() + } + } + }() + + select { + case <-pool.quit: + if err := conn.Close(); err != nil { + logger.Errorf("conn.Close() %s error: %v", addr, err) + } + case err = <-errC: + if err := pool.Disconnect(c.Addr(), err); err != nil { + logger.Errorf("Disconnect %s failed: %v", addr, err) + } else { + logger.Debugf("Disconnected from %s", addr) + } + } + close(qc) + + wg.Wait() + + return err +} + +func (pool *ConnectionPool) readLoop(conn *Connection, msgChan chan []byte, qc chan struct{}) error { + defer close(msgChan) + // read data from connection + reader := bufio.NewReader(conn.Conn) + buf := make([]byte, 1024) + + elapser := elapse.NewElapser(readLoopDurationThreshold, logger) + sendInMsgChanElapser := elapse.NewElapser(sendInMsgChanDurationThreshold, logger) + + defer elapser.CheckForDone() + defer sendInMsgChanElapser.CheckForDone() + + for { + elapser.Register(fmt.Sprintf("readLoop address=%s", conn.Addr())) + deadline := time.Time{} + if pool.Config.ReadTimeout != 0 { + deadline = time.Now().Add(pool.Config.ReadTimeout) + } + if err := conn.Conn.SetReadDeadline(deadline); err != nil { + return ErrDisconnectSetReadDeadlineFailed + } + data, err := readData(reader, buf) + if err != nil { + return err + } + + if data == nil { + continue + } + + // write data to buffer + if _, err := conn.Buffer.Write(data); err != nil { + return err + } + // decode data + datas, err := decodeData(conn.Buffer, pool.Config.MaxMessageLength) + if err != nil { + return err + } + for _, d := range datas { + // use select to avoid the goroutine leak, + // because if msgChan has no receiver this goroutine will leak + select { + case <-qc: + return nil + case <-pool.quit: + return nil + case msgChan <- d: + default: + return errors.New("readLoop msgChan is closed or full") + } + } + sendInMsgChanElapser.CheckForDone() + } +} + +func (pool *ConnectionPool) sendLoop(conn *Connection, timeout time.Duration, qc chan struct{}) error { + elapser := elapse.NewElapser(sendLoopDurationThreshold, logger) + defer elapser.CheckForDone() + + for { + elapser.CheckForDone() + select { + case <-pool.quit: + return nil + case <-qc: + return nil + case m := <-conn.WriteQueue: + elapser.Register(fmt.Sprintf("conn.WriteQueue address=%s", conn.Addr())) + if m == nil { + continue + } + + err := sendMessage(conn.Conn, m, timeout) + + // Update last sent before writing to SendResult, + // this allows a write to SendResult to be used as a sync marker, + // since no further action in this block will happen after the write. + if err == nil { + if err := pool.updateLastSent(conn.Addr(), Now()); err != nil { + logger.Warningf("updateLastSent(%s) failed", conn.Addr()) + } + } + + sr := newSendResult(conn.Addr(), m, err) + select { + case <-qc: + return nil + case pool.SendResults <- sr: + default: + logger.Warningf("SendResults queue full address=%s", conn.Addr()) + } + + if err != nil { + return err + } + } + } +} + +func readData(reader io.Reader, buf []byte) ([]byte, error) { + c, err := reader.Read(buf) + if err != nil { + return nil, fmt.Errorf("read data failed: %v", err) + } + if c == 0 { + return nil, nil + } + data := make([]byte, c) + n := copy(data, buf) + if n != c { + // I don't believe this can ever occur + return nil, errors.New("Failed to copy all the bytes") + } + return data, nil +} + +// decode data from buffer. +func decodeData(buf *bytes.Buffer, maxMsgLength int) ([][]byte, error) { + dataArray := [][]byte{} + for buf.Len() > messageLengthSize { + //logger.Debug("There is data in the buffer, extracting") + prefix := buf.Bytes()[:messageLengthSize] + // decode message length + tmpLength := uint32(0) + encoder.DeserializeAtomic(prefix, &tmpLength) + length := int(tmpLength) + // logger.Debugf("Length is %d", length) + // Disconnect if we received an invalid length. + if length < messagePrefixLength || length > maxMsgLength { + return [][]byte{}, ErrDisconnectInvalidMessageLength + } + + if buf.Len()-messageLengthSize < length { + // logger.Debug("Skipping, not enough data to read this") + return [][]byte{}, nil + } + + buf.Next(messageLengthSize) // strip the length prefix + data := make([]byte, length) + _, err := buf.Read(data) + if err != nil { + return [][]byte{}, err + } + + dataArray = append(dataArray, data) + } + return dataArray, nil +} + +// IsConnExist check if the connection of address does exist +func (pool *ConnectionPool) IsConnExist(addr string) (bool, error) { + var exist bool + if err := pool.strand("IsConnExist", func() error { + if _, ok := pool.addresses[addr]; ok { + exist = true + } + return nil + }); err != nil { + return false, fmt.Errorf("Check connection existence failed: %v ", err) + } + + return exist, nil +} + +// IsDefaultConnection returns if the addr is a default connection +func (pool *ConnectionPool) IsDefaultConnection(addr string) bool { + _, ok := pool.Config.DefaultPeerConnections[addr] + return ok +} + +// IsMaxDefaultConnReached returns whether the max default connection number was reached. +func (pool *ConnectionPool) IsMaxDefaultConnReached() (bool, error) { + var reached bool + if err := pool.strand("IsDefaultMaxConnReached", func() error { + l := len(pool.defaultPeerConnections) + logger.Debugf("%d/%d default connections in use", l, pool.Config.MaxDefaultPeerOutgoingConnections) + reached = l > pool.Config.MaxDefaultPeerOutgoingConnections + return nil + }); err != nil { + return false, err + } + + return reached, nil +} + +func (pool *ConnectionPool) updateLastSent(addr string, t time.Time) error { + return pool.strand("updateLastSent", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastSent = t + } + return nil + }) +} + +func (pool *ConnectionPool) updateLastRecv(addr string, t time.Time) error { + return pool.strand("updateLastRecv", func() error { + if conn, ok := pool.addresses[addr]; ok { + conn.LastReceived = t + } + return nil + }) +} + +// GetConnection returns a connection copy if exist +func (pool *ConnectionPool) GetConnection(addr string) (*Connection, error) { + var conn *Connection + if err := pool.strand("GetConnection", func() error { + if c, ok := pool.addresses[addr]; ok { + // copy connection + cc := *c + conn = &cc + } + return nil + }); err != nil { + return nil, err + } + + return conn, nil +} + +// Connect to an address +func (pool *ConnectionPool) Connect(address string) error { + exist, err := pool.IsConnExist(address) + if err != nil { + return err + } + + if exist { + return nil + } + + var hitMaxDefaultConnNum bool + // Checks if it's one of the default connection + if err := pool.strand("Check default connection", func() error { + if _, ok := pool.Config.DefaultPeerConnections[address]; ok { + hitMaxDefaultConnNum = len(pool.defaultPeerConnections) >= pool.Config.MaxDefaultPeerOutgoingConnections + } + + return nil + }); err != nil { + return err + } + + if hitMaxDefaultConnNum { + logger.Critical().Infof("ConnectionPool.Connect: %v", ErrMaxDefaultConnectionsReached) + return nil + } + + logger.Debugf("Making TCP Connection to %s", address) + conn, err := net.DialTimeout("tcp", address, pool.Config.DialTimeout) + if err != nil { + return err + } + + pool.wg.Add(1) + go func() { + defer pool.wg.Done() + if err := pool.handleConnection(conn, true); err != nil { + logger.Errorf("pool.handleConnection error: %v", err) + } + }() + return nil +} + +// Disconnect removes a connection from the pool by address, and passes a Disconnection to +// the DisconnectCallback +func (pool *ConnectionPool) Disconnect(addr string, r DisconnectReason) error { + if err := pool.strand("Disconnect", func() error { + exist := pool.disconnect(addr) + + if pool.Config.DisconnectCallback != nil && exist { + pool.Config.DisconnectCallback(addr, r) + } + + return nil + }); err != nil { + return err + } + + return nil +} + +func (pool *ConnectionPool) disconnect(addr string) bool { + conn, ok := pool.addresses[addr] + if !ok { + return false + } + + delete(pool.pool, conn.ID) + delete(pool.addresses, addr) + delete(pool.defaultPeerConnections, addr) + if err := conn.Close(); err != nil { + logger.Errorf("conn.Close() error address=%s: %v", addr, err) + } else { + logger.Debugf("Disconnected from %s", addr) + } + + return true +} + +// disconnectAll disconnects all connections. Only safe to call in Shutdown() +func (pool *ConnectionPool) disconnectAll() { + for _, conn := range pool.pool { + addr := conn.Addr() + pool.disconnect(addr) + } +} + +// GetConnections returns an copy of pool connections +func (pool *ConnectionPool) GetConnections() ([]Connection, error) { + conns := []Connection{} + if err := pool.strand("GetConnections", func() error { + for _, conn := range pool.pool { + conns = append(conns, *conn) + } + return nil + }); err != nil { + return nil, err + } + return conns, nil +} + +// Size returns the pool size +func (pool *ConnectionPool) Size() (l int, err error) { + err = pool.strand("Size", func() error { + l = len(pool.pool) + return nil + }) + return +} + +// OutgoingConnectionsNum returns the number of outgoing connections +func (pool *ConnectionPool) OutgoingConnectionsNum() (int, error) { + var n int + if err := pool.strand("OutgoingSize", func() error { + for _, p := range pool.pool { + if p.Solicited { + n++ + } + } + return nil + }); err != nil { + return 0, err + } + + return n, nil +} + +// SendMessage sends a Message to a Connection and pushes the result onto the +// SendResults channel. +func (pool *ConnectionPool) SendMessage(addr string, msg Message) error { + if pool.Config.DebugPrint { + logger.Debugf("Send, Msg Type: %s", reflect.TypeOf(msg)) + } + + return pool.strand("SendMessage", func() error { + if conn, ok := pool.addresses[addr]; ok { + select { + case conn.WriteQueue <- msg: + default: + logger.Critical().Infof("Write queue full for address %s", addr) + return ErrWriteQueueFull + } + } else { + return fmt.Errorf("Tried to send %T to %s, but we are not connected", msg, addr) + } + return nil + }) +} + +// BroadcastMessage sends a Message to all connections in the Pool. +func (pool *ConnectionPool) BroadcastMessage(msg Message) error { + if pool.Config.DebugPrint { + logger.Debugf("Broadcast, Msg Type: %s", reflect.TypeOf(msg)) + } + + fullWriteQueue := []string{} + if err := pool.strand("BroadcastMessage", func() error { + if len(pool.pool) == 0 { + return errors.New("Connection pool is empty") + } + + for _, conn := range pool.pool { + select { + case conn.WriteQueue <- msg: + default: + logger.Critical().Infof("Write queue full for address %s", conn.Addr()) + fullWriteQueue = append(fullWriteQueue, conn.Addr()) + } + } + + if len(fullWriteQueue) == len(pool.pool) { + return ErrNoReachableConnections + } + + return nil + }); err != nil { + return err + } + + return nil +} + +// Unpacks incoming bytes to a Message and calls the message handler. If +// the bytes cannot be converted to a Message, the error is returned as the +// first return value. Otherwise, error will be nil and DisconnectReason will +// be the value returned from the message handler. +func (pool *ConnectionPool) receiveMessage(c *Connection, msg []byte) error { + + m, err := convertToMessage(c.ID, msg, pool.Config.DebugPrint) + if err != nil { + return err + } + if err := pool.updateLastRecv(c.Addr(), Now()); err != nil { + return err + } + return m.Handle(NewMessageContext(c), pool.messageState) +} + +// SendPings sends a ping if our last message sent was over pingRate ago +func (pool *ConnectionPool) SendPings(rate time.Duration, msg Message) error { + now := utc.Now() + var addrs []string + if err := pool.strand("SendPings", func() error { + for _, conn := range pool.pool { + if conn.LastSent.Add(rate).Before(now) { + addrs = append(addrs, conn.Addr()) + } + } + return nil + }); err != nil { + return err + } + + for _, a := range addrs { + if err := pool.SendMessage(a, msg); err != nil { + return err + } + } + + return nil +} + +// ClearStaleConnections removes connections that have not sent a message in too long +func (pool *ConnectionPool) ClearStaleConnections(idleLimit time.Duration, reason DisconnectReason) error { + now := Now() + idleConns := []string{} + if err := pool.strand("ClearStaleConnections", func() error { + for _, conn := range pool.pool { + if conn.LastReceived.Add(idleLimit).Before(now) { + idleConns = append(idleConns, conn.Addr()) + } + } + return nil + }); err != nil { + return err + } + + for _, a := range idleConns { + pool.Disconnect(a, reason) + } + return nil +} + +// Now returns the current UTC time +func Now() time.Time { + return utc.Now() +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool_test.go new file mode 100755 index 0000000..c93d4a4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/gnet/pool_test.go @@ -0,0 +1,1295 @@ +// build ignore + +package gnet + +import ( + "bytes" + "errors" + "fmt" + "net" + "strings" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + addr = "127.0.0.1:50823" + port = 50823 + address = "127.0.0.1" + silenceLogger = false +) + +func init() { + if silenceLogger { + logging.Disable() + } +} + +func newTestConfig() Config { + cfg := NewConfig() + cfg.Port = uint16(port) + cfg.Address = address + return cfg +} + +func TestNewConnectionPool(t *testing.T) { + cfg := newTestConfig() + cfg.MaxConnections = 108 + cfg.DialTimeout = time.Duration(777) + + p := NewConnectionPool(cfg, nil) + require.Equal(t, p.Config, cfg) + require.Equal(t, p.Config.Port, uint16(cfg.Port)) + require.Equal(t, p.Config.Address, cfg.Address) + require.NotNil(t, p.pool) + require.Equal(t, len(p.pool), 0) + require.NotNil(t, p.addresses) + require.Equal(t, len(p.addresses), 0) + require.Equal(t, p.connID, 0) +} + +func TestNewConnection(t *testing.T) { + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 101 + p := NewConnectionPool(cfg, nil) + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + c := p.addresses[conn.LocalAddr().String()] + require.Equal(t, p.pool[p.connID], c) + require.Equal(t, p.connID, 1) + require.Equal(t, c.Addr(), conn.LocalAddr().String()) + require.Equal(t, cap(c.WriteQueue), cfg.ConnectionWriteQueueSize) + require.NotNil(t, c.Buffer) + require.Equal(t, c.Buffer.Len(), 0) + require.Equal(t, c.ConnectionPool, p) + require.False(t, c.LastSent.IsZero()) + require.False(t, c.LastReceived.IsZero()) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestNewConnectionAlreadyConnected(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + ac := p.addresses[conn.LocalAddr().String()] + require.NotNil(t, ac) + require.Equal(t, c.ID, ac.ID) + + _, err = p.NewConnection(c.Conn, true) + require.Error(t, err) + require.True(t, strings.HasPrefix(err.Error(), "Already connected to")) + + p.Shutdown() + <-q +} + +func TestAcceptConnections(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(addr string, solicited bool) { + wasSolicited = &solicited + require.False(t, solicited) + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + require.Len(t, p.addresses, 1) + require.Len(t, p.pool, 1) + + require.Equal(t, conn.RemoteAddr().String(), c.Conn.LocalAddr().String()) + require.Equal(t, conn.LocalAddr().String(), c.Conn.RemoteAddr().String()) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + p.Shutdown() + <-q +} + +func TestStartListenFailed(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + pp := NewConnectionPool(cfg, nil) + err := pp.Run() + require.Error(t, err) + + p.Shutdown() + <-q +} + +func TestStopListen(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + _, err := net.Dial("tcp", addr) + require.NoError(t, err) + wait() + + err = p.strand("", func() error { + require.Equal(t, len(p.pool), 1) + return nil + }) + require.NoError(t, err) + + p.Shutdown() + <-q + + require.Nil(t, p.listener) +} + +func TestHandleConnection(t *testing.T) { + cfg := newTestConfig() + + p := NewConnectionPool(cfg, nil) + + // Unsolicited + cc := make(chan *Connection, 1) + var wasSolicited *bool + p.Config.ConnectCallback = func(address string, solicited bool) { + wasSolicited = &solicited + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + exist, err := p.IsConnExist(conn.LocalAddr().String()) + require.NoError(t, err) + require.True(t, exist) + + delete(p.addresses, conn.LocalAddr().String()) + delete(p.pool, 1) + + require.NotNil(t, wasSolicited) + require.False(t, *wasSolicited) + + // Solicited + p.Config.ConnectCallback = func(address string, s bool) { + wasSolicited = &s + cc <- p.pool[2] + } + + done := make(chan struct{}) + go func() { + defer close(done) + p.handleConnection(conn, true) + }() + + c = <-cc + require.NotNil(t, c) + require.Equal(t, addr, c.Addr()) + + require.NotNil(t, wasSolicited) + require.True(t, *wasSolicited) + + exist, err = p.IsConnExist(conn.RemoteAddr().String()) + require.NoError(t, err) + require.True(t, exist) + + require.Equal(t, len(p.addresses), 1) + require.Equal(t, len(p.pool), 1) + + p.Shutdown() + + <-done + + <-q +} + +func TestConnect(t *testing.T) { + cfg := newTestConfig() + // cfg.Port + p := NewConnectionPool(cfg, nil) + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + err := p.Connect(addr) + require.NoError(t, err) + wait() + + // If already connected, should return same connection + err = p.Connect(addr) + require.NoError(t, err) + wait() + + delete(p.addresses, addr) + + p.Shutdown() + <-q + + // Pool is shutdown, connect should fail + wc := make(chan struct{}) + var connectErr error + go func() { + defer close(wc) + connectErr = p.Connect(addr) + }() + + <-wc + + require.Error(t, connectErr) +} + +func TestConnectNoTimeout(t *testing.T) { + cfg := newTestConfig() + cfg.DialTimeout = 0 + cfg.Port++ + + p := NewConnectionPool(cfg, nil) + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + p.Shutdown() + <-q + + err := p.Connect(addr) + wait() + + require.Error(t, err) +} + +func TestDisconnect(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + _, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + var cAddr string + err = p.strand("", func() error { + cAddr = c.Addr() + return nil + }) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, cAddr, addr) + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect(c.Addr(), ErrDisconnectMalformedMessage) + require.NoError(t, err) + + err = p.strand("", func() error { + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + t.Fatal("disconnect unknown connection should not see this") + } + return nil + }) + require.NoError(t, err) + + err = p.Disconnect("", nil) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestConnectionClose(t *testing.T) { + c := &Connection{ + Conn: NewDummyConn(addr), + Buffer: &bytes.Buffer{}, + WriteQueue: make(chan Message), + } + + c.Buffer.WriteByte(7) + require.Equal(t, c.Buffer.Len(), 1) + c.Close() + + select { + case <-c.WriteQueue: + case <-time.After(time.Millisecond): + t.Fatalf("WriteQueue should be closed") + } + + require.Equal(t, c.Buffer.Len(), 0) +} + +type fakeConn struct { + net.Conn + addr string +} + +func (f fakeConn) RemoteAddr() net.Addr { + return fakeAddr{ + addr: f.addr, + } +} + +type fakeAddr struct { + net.Addr + addr string +} + +func (f fakeAddr) String() string { + return f.addr +} + +func TestGetConnections(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + c := &Connection{ + ID: 1, + Conn: fakeConn{addr: "1.2.3.4"}, + } + d := &Connection{ + ID: 2, + Conn: fakeConn{addr: "2.3.4.5"}, + } + e := &Connection{ + ID: 3, + Conn: fakeConn{addr: "3.4.5.6"}, + } + + p.pool[c.ID] = c + p.pool[d.ID] = d + p.pool[e.ID] = e + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conns, err := p.GetConnections() + require.NoError(t, err) + require.Equal(t, len(conns), 3) + + m := make(map[int]*Connection, 3) + for i, c := range conns { + m[c.ID] = &conns[i] + } + + require.Equal(t, len(m), 3) + for i := 1; i <= 3; i++ { + require.Equal(t, m[i], p.pool[i]) + } + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopReadError(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + readDataErr := errors.New("read data failed: failed") + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, readDataErr, reason) + close(disconnectCalled) + } + + // 1: + // Use a mock net.Conn that captures SetReadDeadline + // and throws an error on Read + reconn := NewReadErrorConn() + go func() { + err := p.handleConnection(reconn, false) + require.Equal(t, readDataErr, err) + }() + + <-cc + + wait() + + require.True(t, reconn.(*ReadErrorConn).GetReadDeadlineSet() != time.Time{}) + reconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopSetReadDeadlineFailed(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + // 2: + // Use a mock net.Conn that fails on SetReadDeadline + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, reason) + close(disconnectCalled) + } + + rdfconn := &ReadDeadlineFailedConn{} + go func() { + err := p.handleConnection(rdfconn, false) + require.Equal(t, ErrDisconnectSetReadDeadlineFailed, err) + }() + + <-cc + + rdfconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestConnectionReadLoopInvalidMessageLength(t *testing.T) { + cfg := newTestConfig() + cfg.MaxMessageLength = 1 + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + // 3: + // Use a mock net.Conn that returns some bytes on Read + // Look for these bytes copied into the eventChannel + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, ErrDisconnectInvalidMessageLength, reason) + close(disconnectCalled) + } + + raconn := newReadAlwaysConn() + go func() { + err := p.handleConnection(raconn, false) + require.Equal(t, ErrDisconnectInvalidMessageLength, err) + }() + + <-cc + + wait() + raconn.stop() + wait() + raconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q + +} + +func TestConnectionReadLoopTerminates(t *testing.T) { + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + readDataErr := errors.New("read data failed: done") + + // 4: Use a mock net.Conn that successfully returns 0 bytes when read + rnconn := newReadNothingConn() + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, readDataErr, reason) + close(disconnectCalled) + } + go func() { + err := p.handleConnection(rnconn, false) + require.Equal(t, readDataErr, err) + }() + + <-cc + + wait() + rnconn.stop() + wait() + rnconn.Close() + + <-disconnectCalled + + p.Shutdown() + <-q +} + +func TestProcessConnectionBuffers(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(DummyPrefix, DummyMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.addresses[addr] + } + + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + t.Fatalf("Unexpected disconnect address=%s reason=%v", addr, reason) + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + // Write DummyMessage + _, err = conn.Write([]byte{4, 0, 0, 0}) + require.NoError(t, err) + _, err = conn.Write([]byte{'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + err = p.strand("", func() error { + require.NotEqual(t, c.LastReceived, time.Time{}) + return nil + }) + require.NoError(t, err) + + // Push multiple messages, the first causing an error, and confirm that + // the remaining messages were unprocessed. + t.Logf("Pushing multiple messages, first one causing an error") + + disconnectCalled := make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, reason, ErrErrorMessageHandler) + close(disconnectCalled) + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'E', 'R', 'R', 0x00}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + fmt.Println(reason) + t.Fatal("should not see this") + } + + _, err = conn.Write([]byte{4, 0, 0, 0, 'D', 'U', 'M', 'Y'}) + require.NoError(t, err) + + wait() + + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + require.Equal(t, c.Addr(), addr) + require.Equal(t, reason, ErrDisconnectInvalidMessageLength) + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + close(disconnectCalled) + } + + // Sending a length of < messagePrefixLength should cause a disconnect + t.Logf("Pushing message with too small length") + + _, err = conn.Write([]byte{messagePrefixLength - 1, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + select { + case <-disconnectCalled: + case <-time.After(time.Second * 2): + t.Fatal("disconnect did not happen, would block") + } + + // Sending a length > MaxMessageLength should cause a disconnect + conn, err = net.Dial("tcp", addr) + require.NoError(t, err) + + c = <-cc + require.NotNil(t, c) + + t.Logf("Pushing message with too large length") + p.Config.MaxMessageLength = 4 + disconnectCalled = make(chan struct{}) + p.Config.DisconnectCallback = func(addr string, r DisconnectReason) { + require.Equal(t, ErrDisconnectInvalidMessageLength, r) + close(disconnectCalled) + } + + _, err = conn.Write([]byte{5, 0, 0, 0, 'B', 'Y', 'T', 'E'}) + require.NoError(t, err) + + <-disconnectCalled + + err = p.strand("", func() error { + require.Nil(t, p.pool[1]) + require.Nil(t, p.pool[2]) + require.Nil(t, p.pool[3]) + return nil + }) + + p.Shutdown() + <-q +} + +func TestConnectionWriteLoop(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.pool[1] + } + + disconnectErr := make(chan DisconnectReason, 1) + p.Config.DisconnectCallback = func(addr string, reason DisconnectReason) { + fmt.Printf("DisconnectCallback called, address=%s reason=%v\n", addr, reason) + disconnectErr <- reason + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + + wait() + + conn, err := net.Dial("tcp", addr) + require.NoError(t, err) + + wait() + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn.Write([]byte{0}) + require.NoError(t, err) + + c := <-cc + require.NotNil(t, c) + + m := NewByteMessage(88) + // Send a successful message to b + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + var sr SendResult + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + + require.Len(t, p.SendResults, 0) + + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.Nil(t, sr.Error) + + err = p.strand("", func() error { + c = p.pool[c.ID] + return nil + }) + require.NoError(t, err) + require.NotNil(t, c) + + lastSent := c.LastSent + require.False(t, lastSent.IsZero()) + + // Send a failed message to c + sendByteMessage = failingSendByteMessage + + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + select { + case sr = <-p.SendResults: + case <-time.After(time.Second * 2): + t.Fatal("No send results, would block") + } + require.Equal(t, sr.Message, m) + require.Equal(t, sr.Addr, c.Addr()) + require.NotNil(t, sr.Error) + + reason := <-disconnectErr + require.NotNil(t, reason) + require.Equal(t, errors.New("send byte message failed"), reason) + + // c.LastSent should not have changed + require.Equal(t, lastSent, c.LastSent) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageOK(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 8 + p := NewConnectionPool(cfg, nil) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + _, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + m := NewByteMessage(88) + err = p.SendMessage(c.Addr(), m) + require.NoError(t, err) + + p.Shutdown() + <-q +} + +func TestPoolSendMessageWriteQueueFull(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.WriteTimeout = time.Second + cfg.SendResultsSize = 1 + cfg.ConnectionWriteQueueSize = 0 + p := NewConnectionPool(cfg, nil) + + // Setup a callback to capture the connection pointer so we can get the address + cc := make(chan *Connection, 1) + p.Config.ConnectCallback = func(addr string, solicited bool) { + cc <- p.pool[1] + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + _, err := net.Dial("tcp", addr) + require.NoError(t, err) + + c := <-cc + + // Send messages faster than can be processed to trigger ErrWriteQueueFull + attempts := 100 + gotErr := false + var once sync.Once + m := NewByteMessage(88) + addr := c.Addr() + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + err := p.SendMessage(addr, m) + if err == ErrWriteQueueFull { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolBroadcastMessage(t *testing.T) { + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + VerifyMessages() + + cfg := newTestConfig() + cfg.ConnectionWriteQueueSize = 1 + p := NewConnectionPool(cfg, nil) + + ready := make(chan struct{}) + var i int + var counterLock sync.Mutex + p.Config.ConnectCallback = func(addr string, solicited bool) { + counterLock.Lock() + defer counterLock.Unlock() + i++ + if i == 2 { + close(ready) + } + } + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + conn1, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn1.Write([]byte{0}) + require.NoError(t, err) + + conn2, err := net.Dial("tcp", addr) + require.NoError(t, err) + + // Go's internals seem to be blocking on network read, write something to + // the connection to hopefully avoid this + _, err = conn2.Write([]byte{0}) + require.NoError(t, err) + + <-ready + + m := NewByteMessage(88) + err = p.BroadcastMessage(m) + require.NoError(t, err) + + attempts := 100 + gotErr := false + var once sync.Once + var wg sync.WaitGroup + wg.Add(attempts) + for i := 0; i < attempts; i++ { + go func() { + defer wg.Done() + err := p.BroadcastMessage(m) + if err == ErrNoReachableConnections { + once.Do(func() { + gotErr = true + }) + } + }() + } + + wg.Wait() + + require.True(t, gotErr) + + p.Shutdown() + <-q +} + +func TestPoolReceiveMessage(t *testing.T) { + wait() + resetHandler() + EraseMessages() + RegisterMessage(BytePrefix, ByteMessage{}) + RegisterMessage(ErrorPrefix, ErrorMessage{}) + VerifyMessages() + + cfg := newTestConfig() + p := NewConnectionPool(cfg, nil) + + q := make(chan struct{}) + go func() { + defer close(q) + p.Run() + }() + wait() + + c := NewConnection(p, 1, NewDummyConn(addr), 10, true) + + // Valid message received + b := make([]byte, 0) + b = append(b, BytePrefix[:]...) + b = append(b, byte(7)) + err := p.receiveMessage(c, b) + require.NoError(t, err) + require.False(t, c.LastReceived.IsZero()) + + // Invalid byte message received + b = []byte{1} + err = p.receiveMessage(c, b) + require.Error(t, err) + + // Valid message, but handler returns a DisconnectReason + b = make([]byte, 0) + b = append(b, ErrorPrefix[:]...) + err = p.receiveMessage(c, b) + require.Equal(t, err, ErrErrorMessageHandler) + + p.Shutdown() + <-q +} + +// Helpers + +func wait() { + time.Sleep(time.Millisecond * 100) +} + +type DummyAddr struct { + addr string +} + +func NewDummyAddr(addr string) *DummyAddr { + return &DummyAddr{ + addr: addr, + } +} + +func (da *DummyAddr) Network() string { + return da.addr +} + +func (da *DummyAddr) String() string { + return da.Network() +} + +type DummyConn struct { + net.Conn + addr string +} + +func NewDummyConn(addr string) net.Conn { + return &DummyConn{addr: addr} +} + +func (dc *DummyConn) RemoteAddr() net.Addr { + return NewDummyAddr(dc.addr) +} + +func (dc *DummyConn) LocalAddr() net.Addr { + return dc.RemoteAddr() +} + +func (dc *DummyConn) Close() error { + return nil +} + +func (dc *DummyConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (dc *DummyConn) SetWriteDeadline(t time.Time) error { + return nil +} + +func (dc *DummyConn) Write(b []byte) (int, error) { + return len(b), nil +} + +type ReadErrorConn struct { + net.Conn + ReadDeadlineSet time.Time + sync.Mutex +} + +func NewReadErrorConn() net.Conn { + return &ReadErrorConn{} +} + +func (rec *ReadErrorConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (rec *ReadErrorConn) SetReadDeadline(t time.Time) error { + rec.Lock() + defer rec.Unlock() + rec.ReadDeadlineSet = t + return nil +} + +func (rec *ReadErrorConn) GetReadDeadlineSet() time.Time { + rec.Lock() + defer rec.Unlock() + return rec.ReadDeadlineSet +} + +func (rec *ReadErrorConn) Read(b []byte) (int, error) { + return 0, errors.New("failed") +} + +func (rec *ReadErrorConn) Close() error { + return nil +} + +type ReadDeadlineFailedConn struct { + net.Conn +} + +func (c *ReadDeadlineFailedConn) Read(b []byte) (int, error) { + return 0, nil +} + +func (c *ReadDeadlineFailedConn) SetReadDeadline(t time.Time) error { + return errors.New("Failed") +} + +func (c *ReadDeadlineFailedConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *ReadDeadlineFailedConn) Close() error { + return nil +} + +type readAlwaysConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadAlwaysConn() *readAlwaysConn { + return &readAlwaysConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readAlwaysConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readAlwaysConn) Close() error { + return nil +} + +func (c *readAlwaysConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + if len(b) == 0 { + return 0, nil + } + + b[0] = byte(88) + + return 1, nil +} + +func (c *readAlwaysConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readAlwaysConn) stop() { + close(c.stopReading) +} + +type readNothingConn struct { + net.Conn + stopReading chan struct{} +} + +func newReadNothingConn() *readNothingConn { + return &readNothingConn{ + stopReading: make(chan struct{}), + } +} + +func (c *readNothingConn) Read(b []byte) (int, error) { + select { + case <-c.stopReading: + return 0, errors.New("done") + default: + } + + time.Sleep(time.Millisecond * 2) + return 0, nil +} + +func (c *readNothingConn) SetReadDeadline(t time.Time) error { + return nil +} + +func (c *readNothingConn) RemoteAddr() net.Addr { + return NewDummyAddr(addr) +} + +func (c *readNothingConn) Close() error { + return nil +} + +func (c *readNothingConn) stop() { + close(c.stopReading) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/heights.go b/vendor/github.com/skycoin/skycoin/src/daemon/heights.go new file mode 100755 index 0000000..57288b8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/heights.go @@ -0,0 +1,84 @@ +package daemon + +import ( + "sort" + "strings" + "sync" +) + +// PeerBlockchainHeight is a peer's IP address with their reported blockchain height +type PeerBlockchainHeight struct { + Address string `json:"address"` + Height uint64 `json:"height"` +} + +// peerBlockchainHeights tracks reported blockchain heights of peers +type peerBlockchainHeights struct { + // Peer-reported blockchain height. Use to estimate download progress + heights map[string]uint64 + sync.Mutex +} + +// newPeerBlockchainHeights creates a peerBlockchainHeights +func newPeerBlockchainHeights() *peerBlockchainHeights { + return &peerBlockchainHeights{ + heights: make(map[string]uint64), + } +} + +// Remove removes a connection from the records +func (p *peerBlockchainHeights) Remove(addr string) { + p.Lock() + defer p.Unlock() + + delete(p.heights, addr) +} + +// Record saves a peer-reported blockchain height +func (p *peerBlockchainHeights) Record(addr string, height uint64) { + p.Lock() + defer p.Unlock() + + p.heights[addr] = height +} + +// Estimate returns the blockchain length estimated from peer reports. +// The highest height reported amongst all peers, and including the node itself, +// is returned. +func (p *peerBlockchainHeights) Estimate(headSeq uint64) uint64 { + p.Lock() + defer p.Unlock() + + for _, seq := range p.heights { + if headSeq < seq { + headSeq = seq + } + } + + return headSeq +} + +// All returns recorded peers' blockchain heights as an array. +// The array is sorted by address as strings. +func (p *peerBlockchainHeights) All() []PeerBlockchainHeight { + p.Lock() + defer p.Unlock() + + if len(p.heights) == 0 { + return nil + } + + peerHeights := make([]PeerBlockchainHeight, 0, len(p.heights)) + for addr, height := range p.heights { + peerHeights = append(peerHeights, PeerBlockchainHeight{ + Address: addr, + Height: height, + }) + } + + sort.Slice(peerHeights, func(i, j int) bool { + return strings.Compare(peerHeights[i].Address, peerHeights[j].Address) < 0 + }) + + return peerHeights +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/heights_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/heights_test.go new file mode 100755 index 0000000..f3acd1d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/heights_test.go @@ -0,0 +1,82 @@ +package daemon + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPeerBlockchainHeights(t *testing.T) { + p := newPeerBlockchainHeights() + + addr1 := "127.0.0.1:1234" + addr2 := "127.0.0.1:5678" + addr3 := "127.0.0.1:9999" + + require.Empty(t, p.heights) + p.Remove(addr1) + require.Empty(t, p.heights) + + e := p.Estimate(1) + require.Equal(t, uint64(1), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr1, 10) + require.Len(t, p.heights, 1) + + records := p.All() + require.Len(t, records, 1) + require.Equal(t, PeerBlockchainHeight{ + Address: addr1, + Height: 10, + }, records[0]) + + p.Record(addr1, 11) + require.Len(t, p.heights, 1) + + records = p.All() + require.Len(t, records, 1) + require.Equal(t, PeerBlockchainHeight{ + Address: addr1, + Height: 11, + }, records[0]) + + e = p.Estimate(1) + require.Equal(t, uint64(11), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr2, 12) + p.Record(addr3, 12) + require.Len(t, p.heights, 3) + + records = p.All() + require.Len(t, records, 3) + require.Equal(t, []PeerBlockchainHeight{ + { + Address: addr1, + Height: 11, + }, + { + Address: addr2, + Height: 12, + }, + { + Address: addr3, + Height: 12, + }, + }, records) + + e = p.Estimate(1) + require.Equal(t, uint64(12), e) + + e = p.Estimate(13) + require.Equal(t, uint64(13), e) + + p.Record(addr3, 24) + e = p.Estimate(13) + require.Equal(t, uint64(24), e) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/messages.go b/vendor/github.com/skycoin/skycoin/src/daemon/messages.go new file mode 100755 index 0000000..1ed7eab --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/messages.go @@ -0,0 +1,756 @@ +package daemon + +import ( + "encoding/binary" + "errors" + "fmt" + "math/rand" + "net" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/utc" +) + +// Message represent a packet to be serialized over the network by +// the gnet encoder. +// They must implement the gnet.Message interface +// All concurrent daemon write operations are synchronized by the daemon's +// DaemonLoop(). +// Message do this by caching the gnet.MessageContext received in Handle() +// and placing itself on the messageEvent channel. +// When the message is retrieved from the messageEvent channel, its Process() +// method is called. + +// MessageConfig config contains a gnet.Message's 4byte prefix and a +// reference interface +type MessageConfig struct { + Prefix gnet.MessagePrefix + Message interface{} +} + +// NewMessageConfig creates message config +func NewMessageConfig(prefix string, m interface{}) MessageConfig { + return MessageConfig{ + Message: m, + Prefix: gnet.MessagePrefixFromString(prefix), + } +} + +// Creates and populates the message configs +func getMessageConfigs() []MessageConfig { + return []MessageConfig{ + NewMessageConfig("INTR", IntroductionMessage{}), + NewMessageConfig("GETP", GetPeersMessage{}), + NewMessageConfig("GIVP", GivePeersMessage{}), + NewMessageConfig("PING", PingMessage{}), + NewMessageConfig("PONG", PongMessage{}), + NewMessageConfig("GETB", GetBlocksMessage{}), + NewMessageConfig("GIVB", GiveBlocksMessage{}), + NewMessageConfig("ANNB", AnnounceBlocksMessage{}), + NewMessageConfig("GETT", GetTxnsMessage{}), + NewMessageConfig("GIVT", GiveTxnsMessage{}), + NewMessageConfig("ANNT", AnnounceTxnsMessage{}), + } +} + +// MessagesConfig slice of MessageConfig +type MessagesConfig struct { + // Message ID prefices + Messages []MessageConfig +} + +// NewMessagesConfig creates messages config +func NewMessagesConfig() MessagesConfig { + return MessagesConfig{ + Messages: getMessageConfigs(), + } +} + +// Register registers our Messages with gnet +func (msc *MessagesConfig) Register() { + for _, mc := range msc.Messages { + gnet.RegisterMessage(mc.Prefix, mc.Message) + } + gnet.VerifyMessages() +} + +// Messages messages struct +type Messages struct { + Config MessagesConfig + // Magic value for detecting self-connection + Mirror uint32 +} + +// NewMessages creates Messages +func NewMessages(c MessagesConfig) *Messages { + return &Messages{ + Config: c, + Mirror: rand.New(rand.NewSource(utc.Now().UnixNano())).Uint32(), + } +} + +// IPAddr compact representation of IP:Port +type IPAddr struct { + IP uint32 + Port uint16 +} + +// NewIPAddr returns an IPAddr from an ip:port string. +func NewIPAddr(addr string) (ipaddr IPAddr, err error) { + ips, port, err := iputil.SplitAddr(addr) + if err != nil { + return + } + + // TODO -- support ipv6 + ipb := net.ParseIP(ips).To4() + if ipb == nil { + err = errors.New("Ignoring IPv6 address") + return + } + + ip := binary.BigEndian.Uint32(ipb) + ipaddr.IP = ip + ipaddr.Port = uint16(port) + return +} + +// String returns IPAddr as "ip:port" +func (ipa IPAddr) String() string { + ipb := make([]byte, 4) + binary.BigEndian.PutUint32(ipb, ipa.IP) + return fmt.Sprintf("%s:%d", net.IP(ipb).String(), ipa.Port) +} + +// AsyncMessage messages that perform an action when received must implement this interface. +// Process() is called after the message is pulled off of messageEvent channel. +// Messages should place themselves on the messageEvent channel in their +// Handle() method required by gnet. +type AsyncMessage interface { + Process(d Daemoner) +} + +// GetPeersMessage sent to request peers +type GetPeersMessage struct { + // c *gnet.MessageContext `enc:"-"` + // connID int `enc:"-"` + addr string `enc:"-"` +} + +// NewGetPeersMessage creates GetPeersMessage +func NewGetPeersMessage() *GetPeersMessage { + return &GetPeersMessage{} +} + +// Handle handles message +func (gpm *GetPeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // self.connID = mc.ConnID + gpm.addr = mc.Addr + return daemon.(Daemoner).RecordMessageEvent(gpm, mc) +} + +// Process Notifies the Pex instance that peers were requested +func (gpm *GetPeersMessage) Process(d Daemoner) { + if d.PexConfig().Disabled { + return + } + + peers := d.RandomExchangeable(d.PexConfig().ReplyCount) + if len(peers) == 0 { + logger.Debug("We have no peers to send in reply") + return + } + + m := NewGivePeersMessage(peers) + if err := d.SendMessage(gpm.addr, m); err != nil { + logger.Errorf("Send GivePeersMessage to %s failed: %v", gpm.addr, err) + } +} + +// GivePeersMessage sent in response to GetPeersMessage +type GivePeersMessage struct { + Peers []IPAddr + c *gnet.MessageContext `enc:"-"` +} + +// NewGivePeersMessage []*pex.Peer is converted to []IPAddr for binary transmission +func NewGivePeersMessage(peers []pex.Peer) *GivePeersMessage { + ipaddrs := make([]IPAddr, 0, len(peers)) + for _, ps := range peers { + ipaddr, err := NewIPAddr(ps.Addr) + if err != nil { + logger.Warningf("GivePeersMessage skipping address %s", ps.Addr) + logger.Warning(err.Error()) + continue + } + ipaddrs = append(ipaddrs, ipaddr) + } + return &GivePeersMessage{Peers: ipaddrs} +} + +// GetPeers is required by the pex.GivePeersMessage interface. +// It returns the peers contained in the message as an array of "ip:port" +// strings. +func (gpm *GivePeersMessage) GetPeers() []string { + peers := make([]string, len(gpm.Peers)) + for i, ipaddr := range gpm.Peers { + peers[i] = ipaddr.String() + } + return peers +} + +// Handle handle message +func (gpm *GivePeersMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gpm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gpm, mc) +} + +// Process Notifies the Pex instance that peers were received +func (gpm *GivePeersMessage) Process(d Daemoner) { + if d.PexConfig().Disabled { + return + } + peers := gpm.GetPeers() + logger.Debugf("Got these peers via PEX: %s", strings.Join(peers, ", ")) + + d.AddPeers(peers) +} + +// IntroductionMessage jan IntroductionMessage is sent on first connect by both parties +type IntroductionMessage struct { + // Mirror is a random value generated on client startup that is used + // to identify self-connections + Mirror uint32 + // Port is the port that this client is listening on + Port uint16 + // Our client version + Version int32 + c *gnet.MessageContext `enc:"-"` + // We validate the message in Handle() and cache the result for Process() + valid bool `enc:"-"` // skip it during encoding + // Extra would be parsed as blockchain pubkey if it's not empty + Extra []byte `enc:",omitempty"` +} + +// NewIntroductionMessage creates introduction message +func NewIntroductionMessage(mirror uint32, version int32, port uint16, extra []byte) *IntroductionMessage { + return &IntroductionMessage{ + Mirror: mirror, + Version: version, + Port: port, + Extra: extra, + } +} + +// Handle Responds to an gnet.Pool event. We implement Handle() here because we +// need to control the DisconnectReason sent back to gnet. We still implement +// Process(), where we do modifications that are not threadsafe +func (intro *IntroductionMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + d := daemon.(Daemoner) + + err := func() error { + // Disconnect if this is a self connection (we have the same mirror value) + if intro.Mirror == d.Mirror() { + logger.Infof("Remote mirror value %v matches ours", intro.Mirror) + d.Disconnect(mc.Addr, ErrDisconnectSelf) + return ErrDisconnectSelf + + } + + // Disconnect if not running the same version + if intro.Version != d.DaemonConfig().Version { + logger.Infof("%s has different version %d. Disconnecting.", + mc.Addr, intro.Version) + d.Disconnect(mc.Addr, ErrDisconnectInvalidVersion) + return ErrDisconnectInvalidVersion + } + + logger.Infof("%s verified for version %d", mc.Addr, intro.Version) + + // Checks the genesis hash if not empty + if len(intro.Extra) > 0 { + var bcPubKey cipher.PubKey + if len(intro.Extra) < len(bcPubKey) { + logger.Infof("Extra data length does not meet the minimum requirement") + d.Disconnect(mc.Addr, ErrDisconnectInvalidExtraData) + return ErrDisconnectInvalidExtraData + } + copy(bcPubKey[:], intro.Extra[:len(bcPubKey)]) + + if d.BlockchainPubkey() != bcPubKey { + logger.Infof("Blockchain pubkey does not match, local: %s, remote: %s", d.BlockchainPubkey().Hex(), bcPubKey.Hex()) + d.Disconnect(mc.Addr, ErrDisconnectBlockchainPubkeyNotMatched) + return ErrDisconnectBlockchainPubkeyNotMatched + } + } + + // only solicited connection can be added to exchange peer list, cause accepted + // connection may not have incomming port. + ip, port, err := iputil.SplitAddr(mc.Addr) + if err != nil { + // This should never happen, but the program should still work if it + // does. + logger.Errorf("Invalid Addr() for connection: %s", mc.Addr) + d.Disconnect(mc.Addr, ErrDisconnectOtherError) + return ErrDisconnectOtherError + } + + // Checks if the introduction message is from outgoing connection. + // It's outgoing connection if port == intro.Port, as the incoming + // connection's port is a random port, it's different from the port + // in introduction message. + if port == intro.Port { + if d.IsDefaultConnection(mc.Addr) { + reached, err := d.IsMaxDefaultConnectionsReached() + if err != nil { + logger.Errorf("Check IsMaxDefaultConnReached failed: %v", err) + return err + } + + if reached { + d.Disconnect(mc.Addr, ErrDisconnectMaxDefaultConnectionReached) + return ErrDisconnectMaxDefaultConnectionReached + } + } + + if err := d.SetHasIncomingPort(mc.Addr); err != nil { + logger.Errorf("Failed to set peer has incoming port status, %v", err) + } + } else { + if err := d.AddPeer(fmt.Sprintf("%s:%d", ip, intro.Port)); err != nil { + logger.Errorf("Failed to add peer: %v", err) + } + } + + // Disconnect if connected twice to the same peer (judging by ip:mirror) + knownPort, exists := d.GetMirrorPort(mc.Addr, intro.Mirror) + if exists { + logger.Infof("%s is already connected on port %d", mc.Addr, knownPort) + d.Disconnect(mc.Addr, ErrDisconnectConnectedTwice) + return ErrDisconnectConnectedTwice + } + return nil + }() + + intro.valid = (err == nil) + intro.c = mc + + if err != nil { + d.IncreaseRetryTimes(mc.Addr) + d.RemoveFromExpectingIntroductions(mc.Addr) + return err + } + + err = d.RecordMessageEvent(intro, mc) + d.ResetRetryTimes(mc.Addr) + return err +} + +// Process an event queued by Handle() +func (intro *IntroductionMessage) Process(d Daemoner) { + d.RemoveFromExpectingIntroductions(intro.c.Addr) + if !intro.valid { + return + } + // Add the remote peer with their chosen listening port + a := intro.c.Addr + + // Record their listener, to avoid double connections + err := d.RecordConnectionMirror(a, intro.Mirror) + if err != nil { + // This should never happen, but the program should not allow itself + // to be corrupted in case it does + logger.Errorf("Invalid port for connection %s", a) + d.Disconnect(intro.c.Addr, ErrDisconnectOtherError) + return + } + + // Request blocks immediately after they're confirmed + err = d.RequestBlocksFromAddr(intro.c.Addr) + if err == nil { + logger.Debugf("Successfully requested blocks from %s", intro.c.Addr) + } else { + logger.Warning(err) + } + + // Anounce unconfirmed know txns + d.AnnounceAllTxns() +} + +// PingMessage Sent to keep a connection alive. A PongMessage is sent in reply. +type PingMessage struct { + c *gnet.MessageContext `enc:"-"` +} + +// Handle implements the Messager interface +func (ping *PingMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + ping.c = mc + return daemon.(Daemoner).RecordMessageEvent(ping, mc) +} + +// Process Sends a PongMessage to the sender of PingMessage +func (ping *PingMessage) Process(d Daemoner) { + if d.DaemonConfig().LogPings { + logger.Debugf("Reply to ping from %s", ping.c.Addr) + } + if err := d.SendMessage(ping.c.Addr, &PongMessage{}); err != nil { + logger.Errorf("Send PongMessage to %s failed: %v", ping.c.Addr, err) + } +} + +// PongMessage Sent in reply to a PingMessage. No action is taken when this is received. +type PongMessage struct { +} + +// Handle handles message +func (pong *PongMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // There is nothing to do; gnet updates Connection.LastMessage internally + // when this is received + if daemon.(*Daemon).Config.LogPings { + logger.Debugf("Received pong from %s", mc.Addr) + } + return nil +} + +// GetBlocksMessage sent to request blocks since LastBlock +type GetBlocksMessage struct { + LastBlock uint64 + RequestedBlocks uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetBlocksMessage creates GetBlocksMessage +func NewGetBlocksMessage(lastBlock uint64, requestedBlocks uint64) *GetBlocksMessage { + return &GetBlocksMessage{ + LastBlock: lastBlock, + RequestedBlocks: requestedBlocks, // count of blocks requested + } +} + +// Handle handles message +func (gbm *GetBlocksMessage) Handle(mc *gnet.MessageContext, + daemon interface{}) error { + gbm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gbm, mc) +} + +// Process should send number to be requested, with request +func (gbm *GetBlocksMessage) Process(d Daemoner) { + // TODO -- we need the sig to be sent with the block, but only the master + // can sign blocks. Thus the sig needs to be stored with the block. + if d.DaemonConfig().DisableNetworking { + return + } + // Record this as this peer's highest block + d.RecordPeerHeight(gbm.c.Addr, gbm.LastBlock) + // Fetch and return signed blocks since LastBlock + blocks, err := d.GetSignedBlocksSince(gbm.LastBlock, gbm.RequestedBlocks) + if err != nil { + logger.Infof("Get signed blocks failed: %v", err) + return + } + + if len(blocks) == 0 { + return + } + + logger.Debugf("Got %d blocks since %d", len(blocks), gbm.LastBlock) + + m := NewGiveBlocksMessage(blocks) + if err := d.SendMessage(gbm.c.Addr, m); err != nil { + logger.Errorf("Send GiveBlocksMessage to %s failed: %v", gbm.c.Addr, err) + } +} + +// GiveBlocksMessage sent in response to GetBlocksMessage, or unsolicited +type GiveBlocksMessage struct { + Blocks []coin.SignedBlock + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveBlocksMessage creates GiveBlocksMessage +func NewGiveBlocksMessage(blocks []coin.SignedBlock) *GiveBlocksMessage { + return &GiveBlocksMessage{ + Blocks: blocks, + } +} + +// Handle handle message +func (gbm *GiveBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gbm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gbm, mc) +} + +// Process process message +func (gbm *GiveBlocksMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + logger.Critical().Info("Visor disabled, ignoring GiveBlocksMessage") + return + } + + // These DB queries are not performed in a transaction for performance reasons. + // It is not necessary that the blocks be executed together in a single transaction. + + processed := 0 + maxSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found, cannot execute blocks") + return + } + + for _, b := range gbm.Blocks { + // To minimize waste when receiving multiple responses from peers + // we only break out of the loop if the block itself is invalid. + // E.g. if we request 20 blocks since 0 from 2 peers, and one peer + // replies with 15 and the other 20, if we did not do this check and + // the reply with 15 was received first, we would toss the one with 20 + // even though we could process it at the time. + if b.Seq() <= maxSeq { + continue + } + + err := d.ExecuteSignedBlock(b) + if err == nil { + logger.Critical().Infof("Added new block %d", b.Block.Head.BkSeq) + processed++ + } else { + logger.Critical().Errorf("Failed to execute received block %d: %v", b.Block.Head.BkSeq, err) + // Blocks must be received in order, so if one fails its assumed + // the rest are failing + break + } + } + if processed == 0 { + return + } + + headBkSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("No HeadBkSeq found after executing blocks, will not announce blocks") + return + } + + if headBkSeq < maxSeq { + logger.Critical().Warning("HeadBkSeq decreased after executing blocks") + } else if headBkSeq-maxSeq != uint64(processed) { + logger.Critical().Warning("HeadBkSeq increased by %d but we processed %s blocks", headBkSeq-maxSeq, processed) + } + + // Announce our new blocks to peers + m1 := NewAnnounceBlocksMessage(headBkSeq) + d.BroadcastMessage(m1) + //request more blocks. + m2 := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().BlocksResponseCount) + d.BroadcastMessage(m2) +} + +// AnnounceBlocksMessage tells a peer our highest known BkSeq. The receiving peer can choose +// to send GetBlocksMessage in response +type AnnounceBlocksMessage struct { + MaxBkSeq uint64 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceBlocksMessage creates message +func NewAnnounceBlocksMessage(seq uint64) *AnnounceBlocksMessage { + return &AnnounceBlocksMessage{ + MaxBkSeq: seq, + } +} + +// Handle handles message +func (abm *AnnounceBlocksMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + abm.c = mc + return daemon.(Daemoner).RecordMessageEvent(abm, mc) +} + +// Process process message +func (abm *AnnounceBlocksMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + headBkSeq, ok, err := d.HeadBkSeq() + if err != nil { + logger.WithError(err).Error("AnnounceBlocksMessage Visor.HeadBkSeq failed") + return + } + if !ok { + logger.Error("AnnounceBlocksMessage no head block, cannot process AnnounceBlocksMessage") + return + } + + if headBkSeq >= abm.MaxBkSeq { + return + } + + // TODO: Should this be block get request for current sequence? + // If client is not caught up, won't attempt to get block + m := NewGetBlocksMessage(headBkSeq, d.DaemonConfig().BlocksResponseCount) + if err := d.SendMessage(abm.c.Addr, m); err != nil { + logger.Errorf("Send GetBlocksMessage to %s failed: %v", abm.c.Addr, err) + } +} + +// SendingTxnsMessage send transaction message interface +type SendingTxnsMessage interface { + GetTxns() []cipher.SHA256 +} + +// AnnounceTxnsMessage tells a peer that we have these transactions +type AnnounceTxnsMessage struct { + Txns []cipher.SHA256 + c *gnet.MessageContext `enc:"-"` +} + +// NewAnnounceTxnsMessage creates announce txns message +func NewAnnounceTxnsMessage(txns []cipher.SHA256) *AnnounceTxnsMessage { + return &AnnounceTxnsMessage{ + Txns: txns, + } +} + +// GetTxns returns txns +func (atm *AnnounceTxnsMessage) GetTxns() []cipher.SHA256 { + return atm.Txns +} + +// Handle handle message +func (atm *AnnounceTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + atm.c = mc + return daemon.(Daemoner).RecordMessageEvent(atm, mc) +} + +// Process process message +func (atm *AnnounceTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + unknown, err := d.GetUnconfirmedUnknown(atm.Txns) + if err != nil { + logger.WithError(err).Error("AnnounceTxnsMessage Visor.GetUnconfirmedUnknown failed") + return + } + + if len(unknown) == 0 { + return + } + + m := NewGetTxnsMessage(unknown) + if err := d.SendMessage(atm.c.Addr, m); err != nil { + logger.Errorf("Send GetTxnsMessage to %s failed: %v", atm.c.Addr, err) + } +} + +// GetTxnsMessage request transactions of given hash +type GetTxnsMessage struct { + Txns []cipher.SHA256 + c *gnet.MessageContext `enc:"-"` +} + +// NewGetTxnsMessage creates GetTxnsMessage +func NewGetTxnsMessage(txns []cipher.SHA256) *GetTxnsMessage { + return &GetTxnsMessage{ + Txns: txns, + } +} + +// Handle handle message +func (gtm *GetTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gtm, mc) +} + +// Process process message +func (gtm *GetTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + // Locate all txns from the unconfirmed pool + known, err := d.GetUnconfirmedKnown(gtm.Txns) + if err != nil { + logger.WithError(err).Error("GetTxnsMessage Visor.GetUnconfirmedKnown failed") + return + } + if len(known) == 0 { + return + } + + // Reply to sender with GiveTxnsMessage + m := NewGiveTxnsMessage(known) + if err := d.SendMessage(gtm.c.Addr, m); err != nil { + logger.Errorf("Send GiveTxnsMessage to %s failed: %v", gtm.c.Addr, err) + } +} + +// GiveTxnsMessage tells the transaction of given hashes +type GiveTxnsMessage struct { + Txns coin.Transactions + c *gnet.MessageContext `enc:"-"` +} + +// NewGiveTxnsMessage creates GiveTxnsMessage +func NewGiveTxnsMessage(txns coin.Transactions) *GiveTxnsMessage { + return &GiveTxnsMessage{ + Txns: txns, + } +} + +// GetTxns returns transactions hashes +func (gtm *GiveTxnsMessage) GetTxns() []cipher.SHA256 { + return gtm.Txns.Hashes() +} + +// Handle handle message +func (gtm *GiveTxnsMessage) Handle(mc *gnet.MessageContext, daemon interface{}) error { + gtm.c = mc + return daemon.(Daemoner).RecordMessageEvent(gtm, mc) +} + +// Process process message +func (gtm *GiveTxnsMessage) Process(d Daemoner) { + if d.DaemonConfig().DisableNetworking { + return + } + + hashes := make([]cipher.SHA256, 0, len(gtm.Txns)) + // Update unconfirmed pool with these transactions + for _, txn := range gtm.Txns { + // Only announce transactions that are new to us, so that peers can't spam relays + known, softErr, err := d.InjectTransaction(txn) + if err != nil { + logger.Warningf("Failed to record transaction %s: %v", txn.Hash().Hex(), err) + continue + } else if softErr != nil { + logger.Warningf("Transaction soft violation: %v", err) + continue + } else if known { + logger.Warningf("Duplicate Transaction: %s", txn.Hash().Hex()) + continue + } + + hashes = append(hashes, txn.Hash()) + } + + // Announce these transactions to peers + if len(hashes) != 0 { + logger.Debugf("Announce %d transactions", len(hashes)) + m := NewAnnounceTxnsMessage(hashes) + d.BroadcastMessage(m) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/messages_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/messages_test.go new file mode 100755 index 0000000..bd8dc0e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/messages_test.go @@ -0,0 +1,832 @@ +package daemon + +import ( + "bufio" + "fmt" + "os" + "reflect" + "strconv" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon/gnet" + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/util" +) + +func setupMsgEncoding() { + gnet.EraseMessages() + var messagesConfig = NewMessagesConfig() + messagesConfig.Register() +} + +/************************************** + * + * Test helpers + * + *************************************/ + +// MessagesAnnotationsIterator : Implementation of IAnnotationsIterator for type gnet.Message +type MessagesAnnotationsIterator struct { + Message gnet.Message + LengthCalled bool + PrefixCalled bool + CurrentField int + MaxField int + CurrentIndex int +} + +// NewMessagesAnnotationsIterator : Initializes struct MessagesAnnotationsIterator +func NewMessagesAnnotationsIterator(message gnet.Message) MessagesAnnotationsIterator { + var mai = MessagesAnnotationsIterator{} + mai.Message = message + mai.LengthCalled = false + mai.PrefixCalled = false + mai.CurrentField = 0 + mai.CurrentIndex = -1 + + mai.MaxField = reflect.Indirect(reflect.ValueOf(mai.Message)).NumField() + + return mai +} + +// Next : Yields next element of MessagesAnnotationsIterator +func (mai *MessagesAnnotationsIterator) Next() (util.Annotation, bool) { + if !mai.LengthCalled { + mai.LengthCalled = true + return util.Annotation{Size: 4, Name: "Length"}, true + } + if !mai.PrefixCalled { + mai.PrefixCalled = true + return util.Annotation{Size: 4, Name: "Prefix"}, true + + } + if mai.CurrentField >= mai.MaxField { + return util.Annotation{}, false + } + + var i = mai.CurrentField + var j = mai.CurrentIndex + + var v = reflect.Indirect(reflect.ValueOf(mai.Message)) + t := v.Type() + vF := v.Field(i) + f := t.Field(i) + for f.PkgPath != "" && i < mai.MaxField { + i++ + mai.CurrentField++ + mai.CurrentIndex = -1 + j = -1 + if i < mai.MaxField { + f = t.Field(i) + if f.Type.Kind() == reflect.Slice { + if _, omitempty := encoder.ParseTag(f.Tag.Get("enc")); omitempty { + if i == mai.MaxField-1 { + vF = v.Field(i) + if vF.Len() == 0 { + // Last field is empty slice. Nothing further tokens + return util.Annotation{}, false + } + } else { + panic(encoder.ErrInvalidOmitEmpty) + } + } + } + } else { + return util.Annotation{}, false + } + } + if f.Tag.Get("enc") != "-" { + if vF.CanSet() || f.Name != "_" { + if v.Field(i).Kind() == reflect.Slice { + if mai.CurrentIndex == -1 { + mai.CurrentIndex = 0 + return util.Annotation{Size: 4, Name: f.Name + " length"}, true + } + sliceLen := v.Field(i).Len() + mai.CurrentIndex++ + if mai.CurrentIndex < sliceLen { + // Emit annotation for slice item + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Slice(j, j+1).Interface())[4:]), Name: f.Name + "[" + strconv.Itoa(j) + "]"}, true + } + // No more annotation tokens for current slice field + mai.CurrentIndex = -1 + mai.CurrentField++ + if sliceLen > 0 { + // Emit annotation for last item + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Slice(j, j+1).Interface())[4:]), Name: f.Name + "[" + strconv.Itoa(j) + "]"}, true + } + // Zero length slice. Start over + return mai.Next() + } + + mai.CurrentField++ + return util.Annotation{Size: len(encoder.Serialize(v.Field(i).Interface())), Name: f.Name}, true + + } + } + + return util.Annotation{}, false +} + +/************************************** + * + * Test cases + * + *************************************/ + +var hashes = []cipher.SHA256{ + GetSHAFromHex("123"), + GetSHAFromHex("456"), + GetSHAFromHex("789"), + GetSHAFromHex("abc"), + GetSHAFromHex("def"), + GetSHAFromHex("101"), + GetSHAFromHex("111"), + GetSHAFromHex("121"), + GetSHAFromHex("314"), + GetSHAFromHex("151"), +} + +var secKey1 = (cipher.NewSecKey([]byte{1, 2, 3, 4, 5, 6, 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})) +var secKey2 = cipher.NewSecKey([]byte{33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64}) +var secKey3 = cipher.NewSecKey([]byte{65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}) +var secKey4 = cipher.NewSecKey([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96}) + +var addresses = []cipher.Address{ + cipher.AddressFromSecKey(secKey1), + cipher.AddressFromSecKey(secKey2), + cipher.AddressFromSecKey(secKey3), + cipher.AddressFromSecKey(secKey4), +} + +func GetSHAFromHex(hex string) cipher.SHA256 { + var sha, _ = cipher.SHA256FromHex(hex) + return sha +} + +type EmptySliceStruct struct { + A uint8 + e int16 + B string + C int32 + D []byte + f rune +} + +func (m *EmptySliceStruct) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // Do nothing + return nil +} + +func ExampleEmptySliceStruct() { + defer gnet.EraseMessages() + setupMsgEncoding() + gnet.RegisterMessage(gnet.MessagePrefixFromString("TEST"), EmptySliceStruct{}) + gnet.VerifyMessages() + var message = EmptySliceStruct{ + 0x01, + 0x2345, + "", + 0x6789ABCD, + nil, + 'a', + } + var mai = NewMessagesAnnotationsIterator(&message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(&message), &mai, w) + // Output: + // 0x0000 | 11 00 00 00 ....................................... Length + // 0x0004 | 54 45 53 54 ....................................... Prefix + // 0x0008 | 01 ................................................ A + // 0x0009 | 00 00 00 00 ....................................... B + // 0x000d | cd ab 89 67 ....................................... C + // 0x0011 | 00 00 00 00 ....................................... D length + // 0x0015 | +} + +type OmitEmptySliceTestStruct struct { + A uint8 + B []byte + c rune + D []byte `enc:",omitempty"` +} + +func (m *OmitEmptySliceTestStruct) Handle(mc *gnet.MessageContext, daemon interface{}) error { + // Do nothing + return nil +} + +func ExampleOmitEmptySliceTestStruct() { + defer gnet.EraseMessages() + setupMsgEncoding() + gnet.RegisterMessage(gnet.MessagePrefixFromString("TEST"), OmitEmptySliceTestStruct{}) + gnet.VerifyMessages() + var message = OmitEmptySliceTestStruct{ + 0x01, + nil, + 'a', + nil, + } + var mai = NewMessagesAnnotationsIterator(&message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(&message), &mai, w) + // Output: + // 0x0000 | 09 00 00 00 ....................................... Length + // 0x0004 | 54 45 53 54 ....................................... Prefix + // 0x0008 | 01 ................................................ A + // 0x0009 | 00 00 00 00 ....................................... B length + // 0x000d | +} + +func ExampleIntroductionMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewIntroductionMessage(1234, 5, 7890, nil) + fmt.Println("IntroductionMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // IntroductionMessage: + // 0x0000 | 0e 00 00 00 ....................................... Length + // 0x0004 | 49 4e 54 52 ....................................... Prefix + // 0x0008 | d2 04 00 00 ....................................... Mirror + // 0x000c | d2 1e ............................................. Port + // 0x000e | 05 00 00 00 ....................................... Version + // 0x0012 | +} + +func ExampleGetPeersMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewGetPeersMessage() + fmt.Println("GetPeersMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetPeersMessage: + // 0x0000 | 04 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 50 ....................................... Prefix + // 0x0008 | +} + +func ExampleGivePeersMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var peers = make([]pex.Peer, 3) + var peer0 = *pex.NewPeer("118.178.135.93:6000") + var peer1 = *pex.NewPeer("47.88.33.156:6000") + var peer2 = *pex.NewPeer("121.41.103.148:6000") + peers = append(peers, peer0, peer1, peer2) + var message = NewGivePeersMessage(peers) + fmt.Println("GivePeersMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GivePeersMessage: + // 0x0000 | 1a 00 00 00 ....................................... Length + // 0x0004 | 47 49 56 50 ....................................... Prefix + // 0x0008 | 03 00 00 00 ....................................... Peers length + // 0x000c | 5d 87 b2 76 70 17 ................................. Peers[0] + // 0x0012 | 9c 21 58 2f 70 17 ................................. Peers[1] + // 0x0018 | 94 67 29 79 70 17 ................................. Peers[2] + // 0x001e | +} + +func ExampleGetBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewGetBlocksMessage(1234, 5678) + fmt.Println("GetBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetBlocksMessage: + // 0x0000 | 14 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 42 ....................................... Prefix + // 0x0008 | d2 04 00 00 00 00 00 00 ........................... LastBlock + // 0x0010 | 2e 16 00 00 00 00 00 00 ........................... RequestedBlocks + // 0x0018 | +} + +func ExampleGiveBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var blocks = make([]coin.SignedBlock, 1) + var body1 = coin.BlockBody{ + Transactions: make([]coin.Transaction, 0), + } + var block1 = coin.Block{ + Body: body1, + Head: coin.BlockHeader{ + Version: 0x02, + Time: 100, + BkSeq: 0, + Fee: 10, + PrevHash: hashes[0], + BodyHash: body1.Hash(), + }} + var sig, _ = cipher.SigFromHex("123") + var signedBlock = coin.SignedBlock{ + Sig: sig, + Block: block1, + } + blocks = append(blocks, signedBlock) + var message = NewGiveBlocksMessage(blocks) + fmt.Println("GiveBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GiveBlocksMessage: + // 0x0000 | 8a 01 00 00 ....................................... Length + // 0x0004 | 47 49 56 42 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Blocks length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x004c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x005c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x006c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x007c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x008c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x009c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ac | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00bc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00cc | 00 ................................................ Blocks[0] + // 0x00cd | 02 00 00 00 64 00 00 00 00 00 00 00 00 00 00 00 + // 0x00dd | 00 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ed | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00fd | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x010d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x011d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x012d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x013d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x014d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x015d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x016d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x017d | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x018d | 00 ................................................ Blocks[1] + // 0x018e | +} + +func ExampleAnnounceBlocksMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewAnnounceBlocksMessage(123456) + fmt.Println("AnnounceBlocksMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // AnnounceBlocksMessage: + // 0x0000 | 0c 00 00 00 ....................................... Length + // 0x0004 | 41 4e 4e 42 ....................................... Prefix + // 0x0008 | 40 e2 01 00 00 00 00 00 ........................... MaxBkSeq + // 0x0010 | +} + +func ExampleGetTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var shas = make([]cipher.SHA256, 0) + + shas = append(shas, hashes[1], hashes[2]) + var message = NewGetTxnsMessage(shas) + fmt.Println("GetTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GetTxnsMessage: + // 0x0000 | 48 00 00 00 ....................................... Length + // 0x0004 | 47 45 54 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[0] + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[1] + // 0x004c | +} + +func ExampleGiveTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var transactions coin.Transactions = make([]coin.Transaction, 0) + var transactionOutputs0 = make([]coin.TransactionOutput, 0) + var transactionOutputs1 = make([]coin.TransactionOutput, 0) + var txOutput0 = coin.TransactionOutput{ + Address: addresses[0], + Coins: 12, + Hours: 34, + } + var txOutput1 = coin.TransactionOutput{ + Address: addresses[1], + Coins: 56, + Hours: 78, + } + var txOutput2 = coin.TransactionOutput{ + Address: addresses[3], + Coins: 9, + Hours: 12, + } + var txOutput3 = coin.TransactionOutput{ + Address: addresses[2], + Coins: 34, + Hours: 56, + } + transactionOutputs0 = append(transactionOutputs0, txOutput0, txOutput1) + transactionOutputs1 = append(transactionOutputs1, txOutput2, txOutput3) + + var sig0, sig1, sig2, sig3 cipher.Sig + sig0, _ = cipher.SigFromHex("sig0") + sig1, _ = cipher.SigFromHex("sig1") + sig2, _ = cipher.SigFromHex("sig2") + sig3, _ = cipher.SigFromHex("sig3") + var transaction0 = coin.Transaction{ + Type: 123, + In: []cipher.SHA256{hashes[3], hashes[4]}, + InnerHash: hashes[5], + Length: 5000, + Out: transactionOutputs0, + Sigs: []cipher.Sig{sig0, sig1}, + } + var transaction1 = coin.Transaction{ + Type: 123, + In: []cipher.SHA256{hashes[5], hashes[6]}, + InnerHash: hashes[6], + Length: 5000, + Out: transactionOutputs1, + Sigs: []cipher.Sig{sig2, sig3}, + } + transactions = append(transactions, transaction0, transaction1) + var message = NewGiveTxnsMessage(transactions) + fmt.Println("GiveTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // GiveTxnsMessage: + // 0x0000 | 82 02 00 00 ....................................... Length + // 0x0004 | 47 49 56 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 88 13 00 00 7b 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x002c | 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x004c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x005c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x006c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x007c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x008c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x009c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ac | 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 + // 0x00bc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00cc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00dc | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x00ec | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 + // 0x00fc | 00 00 00 00 07 6d ca 32 de 03 4e 48 67 fa 7a 2a + // 0x010c | a9 ee fe 91 f2 0b a0 74 0c 00 00 00 00 00 00 00 + // 0x011c | 22 00 00 00 00 00 00 00 00 e9 cb 47 35 e3 95 cf + // 0x012c | 36 b0 d1 a6 f2 21 bb 23 b3 f7 bf b1 f9 38 00 00 + // 0x013c | 00 00 00 00 00 4e 00 00 00 00 00 00 00 ............ Txns[0] + // 0x0149 | 88 13 00 00 7b 00 00 00 00 00 00 00 00 00 00 00 + // 0x0159 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0169 | 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 + // 0x0179 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0189 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0199 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01a9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01b9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01c9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01d9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x01e9 | 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 + // 0x01f9 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0209 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0219 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x0229 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 + // 0x0239 | 00 00 00 00 7e f9 b1 b9 40 6f 8d b3 99 b2 5f d0 + // 0x0249 | e9 f4 f0 88 7b 08 4b 43 09 00 00 00 00 00 00 00 + // 0x0259 | 0c 00 00 00 00 00 00 00 00 83 f1 96 59 16 14 99 + // 0x0269 | 2f a6 03 13 38 6f 72 88 ac 40 14 c8 bc 22 00 00 + // 0x0279 | 00 00 00 00 00 38 00 00 00 00 00 00 00 ............ Txns[1] + // 0x0286 | +} + +func ExampleAnnounceTxnsMessage() { + defer gnet.EraseMessages() + setupMsgEncoding() + var message = NewAnnounceTxnsMessage([]cipher.SHA256{hashes[7], hashes[8]}) + fmt.Println("AnnounceTxnsMessage:") + var mai = NewMessagesAnnotationsIterator(message) + w := bufio.NewWriter(os.Stdout) + util.HexDumpFromIterator(gnet.EncodeMessage(message), &mai, w) + // Output: + // AnnounceTxnsMessage: + // 0x0000 | 48 00 00 00 ....................................... Length + // 0x0004 | 41 4e 4e 54 ....................................... Prefix + // 0x0008 | 02 00 00 00 ....................................... Txns length + // 0x000c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x001c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[0] + // 0x002c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + // 0x003c | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... Txns[1] + // 0x004c | +} + +func TestIntroductionMessage(t *testing.T) { + defer gnet.EraseMessages() + setupMsgEncoding() + + pubkey, _ := cipher.GenerateKeyPair() + pubkey2, _ := cipher.GenerateKeyPair() + + type mirrorPortResult struct { + port uint16 + exist bool + } + + type daemonMockValue struct { + version uint32 + mirror uint32 + isDefaultConnection bool + isMaxConnectionsReached bool + isMaxConnectionsReachedErr error + setHasIncomingPortErr error + getMirrorPortResult mirrorPortResult + recordMessageEventErr error + pubkey cipher.PubKey + disconnectReason gnet.DisconnectReason + disconnectErr error + addPeerArg string + addPeerErr error + } + + tt := []struct { + name string + addr string + mockValue daemonMockValue + intro *IntroductionMessage + err error + }{ + { + name: "INTR message without extra bytes", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + }, + err: nil, + }, + { + name: "INTR message with pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey[:], + }, + err: nil, + }, + { + name: "INTR message with pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey[:], + }, + err: nil, + }, + { + name: "INTR message with pubkey and additional data", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: append(pubkey[:], []byte("additional data")...), + }, + err: nil, + }, + { + name: "INTR message with different pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + disconnectReason: ErrDisconnectBlockchainPubkeyNotMatched, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: pubkey2[:], + }, + err: ErrDisconnectBlockchainPubkeyNotMatched, + }, + { + name: "INTR message with invalid pubkey", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + disconnectReason: ErrDisconnectInvalidExtraData, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Port: 6000, + Version: 1, + valid: true, + Extra: []byte("invalid extra data"), + }, + err: ErrDisconnectInvalidExtraData, + }, + { + name: "Disconnect self connection", + mockValue: daemonMockValue{ + mirror: 10000, + disconnectReason: ErrDisconnectSelf, + }, + intro: &IntroductionMessage{ + Mirror: 10000, + }, + err: ErrDisconnectSelf, + }, + { + name: "Invalid version", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectInvalidVersion, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 0, + }, + err: ErrDisconnectInvalidVersion, + }, + { + name: "Invalid address", + addr: "121.121.121.121", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectOtherError, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectOtherError, + }, + { + name: "Max default connections reached", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + disconnectReason: ErrDisconnectMaxDefaultConnectionReached, + isDefaultConnection: true, + isMaxConnectionsReached: true, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectMaxDefaultConnectionReached, + }, + { + name: "incomming connection", + addr: "121.121.121.121:12345", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + isDefaultConnection: true, + isMaxConnectionsReached: true, + getMirrorPortResult: mirrorPortResult{ + exist: false, + }, + pubkey: pubkey, + addPeerArg: "121.121.121.121:6000", + addPeerErr: nil, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + valid: true, + }, + }, + { + name: "Connect twice", + addr: "121.121.121.121:6000", + mockValue: daemonMockValue{ + mirror: 10000, + version: 1, + isDefaultConnection: true, + getMirrorPortResult: mirrorPortResult{ + exist: true, + }, + pubkey: pubkey, + addPeerArg: "121.121.121.121:6000", + addPeerErr: nil, + disconnectReason: ErrDisconnectConnectedTwice, + }, + intro: &IntroductionMessage{ + Mirror: 10001, + Version: 1, + Port: 6000, + }, + err: ErrDisconnectConnectedTwice, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + mc := &gnet.MessageContext{Addr: tc.addr} + tc.intro.c = mc + + d := NewDaemonerMock() + d.On("DaemonConfig").Return(DaemonConfig{Version: int32(tc.mockValue.version)}) + d.On("Mirror").Return(tc.mockValue.mirror) + d.On("IsDefaultConnection", tc.addr).Return(tc.mockValue.isDefaultConnection) + d.On("SetHasIncomingPort", tc.addr).Return(tc.mockValue.setHasIncomingPortErr) + d.On("GetMirrorPort", tc.addr, tc.intro.Mirror).Return(tc.mockValue.getMirrorPortResult.port, tc.mockValue.getMirrorPortResult.exist) + d.On("RecordMessageEvent", tc.intro, mc).Return(tc.mockValue.recordMessageEventErr) + d.On("ResetRetryTimes", tc.addr) + d.On("BlockchainPubkey").Return(tc.mockValue.pubkey) + d.On("Disconnect", tc.addr, tc.mockValue.disconnectReason).Return(tc.mockValue.disconnectErr) + d.On("IncreaseRetryTimes", tc.addr) + d.On("RemoveFromExpectingIntroductions", tc.addr) + d.On("IsMaxDefaultConnectionsReached").Return(tc.mockValue.isMaxConnectionsReached, tc.mockValue.isMaxConnectionsReachedErr) + d.On("AddPeer", tc.mockValue.addPeerArg).Return(tc.mockValue.addPeerErr) + + err := tc.intro.Handle(mc, d) + require.Equal(t, tc.err, err) + }) + } + +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md b/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md new file mode 100755 index 0000000..ffaf675 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/README.md @@ -0,0 +1,8 @@ +pex +=== + +Tools for implementing peer exchange (PEX) with Go + +[![GoDoc](http://godoc.org/github.com//skycoin/pex?status.png)](http://godoc.org/github.com/skycoin/skycoin/src/daemon/pex) + +[Godoc generated documentation](http://godoc.org/github.com/skycoin/skycoin/src/daemon/pex) diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go new file mode 100755 index 0000000..f99a116 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist.go @@ -0,0 +1,359 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io" + "math/rand" + "os" + "time" + + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/utc" +) + +// Peers peer list +type Peers []Peer + +// ToAddrs returns the address list +func (ps Peers) ToAddrs() []string { + addrs := make([]string, 0, len(ps)) + for _, p := range ps { + addrs = append(addrs, p.Addr) + } + return addrs +} + +// peerlist is a map of addresses to *PeerStates +type peerlist struct { + peers map[string]*Peer +} + +func newPeerlist() peerlist { + return peerlist{ + peers: make(map[string]*Peer), + } +} + +// Filter peers filter +type Filter func(peer Peer) bool + +// loadFromFile loads if the peer.txt file does exist +// return nil if the file doesn't exist +func loadPeersFromFile(path string) (map[string]*Peer, error) { + // check if the file does exist + + if _, err := os.Stat(path); os.IsNotExist(err) { + return nil, nil + } + + peersJSON := make(map[string]PeerJSON) + err := file.LoadJSON(path, &peersJSON) + + if err == io.EOF { + logger.WithField("path", path).Error("corrupt or empty file, rewriting file") + return nil, nil + } else if err != nil { + return nil, err + } + peers := make(map[string]*Peer, len(peersJSON)) + for addr, peerJSON := range peersJSON { + a, err := validateAddress(addr, true) + + if err != nil { + logger.Errorf("Invalid address in peers JSON file %s: %v", addr, err) + continue + } + + peer, err := newPeerFromJSON(peerJSON) + if err != nil { + logger.Errorf("newPeerFromJSON failed: %v", err) + continue + } + + if a != peer.Addr { + logger.Errorf("address key %s does not match Peer.Addr %s", a, peer.Addr) + continue + } + + peers[a] = peer + } + + return peers, nil +} + +func (pl *peerlist) setPeers(peers []Peer) { + for _, p := range peers { + np := p + pl.peers[p.Addr] = &np + } +} + +func (pl *peerlist) addPeer(addr string) { + if p, ok := pl.peers[addr]; ok && p != nil { + p.Seen() + return + } + + peer := NewPeer(addr) + pl.peers[addr] = peer + return +} + +func (pl *peerlist) addPeers(addrs []string) { + for _, addr := range addrs { + pl.addPeer(addr) + } +} + +// getCanTryPeers returns all peers that are triable(retried times blew exponential backoff times) +// and are able to pass the filters. +func (pl *peerlist) getCanTryPeers(flts ...Filter) Peers { + var ps Peers + flts = append([]Filter{canTry}, flts...) +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// getPeers returns all peers that can pass the filters. +func (pl *peerlist) getPeers(flts ...Filter) Peers { + var ps Peers +loop: + for _, p := range pl.peers { + for i := range flts { + if !flts[i](*p) { + continue loop + } + } + + ps = append(ps, *p) + } + + return ps +} + +// filters +func isPrivate(p Peer) bool { + return p.Private +} + +func isPublic(p Peer) bool { + return !p.Private +} + +func isTrusted(p Peer) bool { + return p.Trusted +} + +func hasIncomingPort(p Peer) bool { + return p.HasIncomingPort +} + +func canTry(p Peer) bool { + return p.CanTry() +} + +func zeroRetryTimes(p Peer) bool { + return p.RetryTimes == 0 +} + +// isExchangeable filters exchangeable peers +var isExchangeable = []Filter{hasIncomingPort, isPublic, zeroRetryTimes} + +// removePeer removes peer +func (pl *peerlist) removePeer(addr string) { + delete(pl.peers, addr) +} + +// SetPrivate sets specific peer as private +func (pl *peerlist) setPrivate(addr string, private bool) error { + if p, ok := pl.peers[addr]; ok { + p.Private = private + return nil + } + + return fmt.Errorf("set peer.Private failed: %v does not exist in peer list", addr) +} + +// SetTrusted sets peer as trusted peer +func (pl *peerlist) setTrusted(addr string, trusted bool) error { + if p, ok := pl.peers[addr]; ok { + p.Trusted = trusted + return nil + } + + return fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", addr) +} + +// setHasIncomingPort updates whether the peer is valid and has public incoming port +func (pl *peerlist) setHasIncomingPort(addr string, hasIncomingPort bool) error { + if p, ok := pl.peers[addr]; ok { + p.HasIncomingPort = hasIncomingPort + p.Seen() + return nil + } + + return fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", addr) +} + +// len returns number of peers +func (pl *peerlist) len() int { + return len(pl.peers) +} + +// getPeerByAddr returns peer of given address +func (pl *peerlist) getPeerByAddr(addr string) (Peer, bool) { + p, ok := pl.peers[addr] + if ok { + return *p, true + } + return Peer{}, false +} + +// ClearOld removes public peers that haven't been seen in timeAgo seconds +func (pl *peerlist) clearOld(timeAgo time.Duration) { + t := utc.Now() + for addr, peer := range pl.peers { + lastSeen := time.Unix(peer.LastSeen, 0) + if !peer.Private && t.Sub(lastSeen) > timeAgo { + delete(pl.peers, addr) + } + } +} + +// Returns n random peers, or all of the peers, whichever is lower. +// If count is 0, all of the peers are returned, shuffled. +func (pl *peerlist) random(count int, flts ...Filter) Peers { + keys := pl.getCanTryPeers(flts...).ToAddrs() + if len(keys) == 0 { + return Peers{} + } + max := count + if count == 0 || count > len(keys) { + max = len(keys) + } + var ps Peers + perm := rand.Perm(len(keys)) + for _, i := range perm[:max] { + ps = append(ps, *pl.peers[keys[i]]) + } + return ps +} + +// save saves known peers to disk as a newline delimited list of addresses to +// +func (pl *peerlist) save(fn string) error { + // filter the peers that has retrytime > MaxPeerRetryTimes + peers := make(map[string]PeerJSON) + for k, p := range pl.peers { + if p.RetryTimes <= MaxPeerRetryTimes { + peers[k] = newPeerJSON(*p) + } + } + + if err := file.SaveJSON(fn, peers, 0600); err != nil { + return fmt.Errorf("save peer list failed: %s", err) + } + return nil +} + +// increaseRetryTimes increases retry times +func (pl *peerlist) increaseRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.IncreaseRetryTimes() + p.Seen() + } +} + +// resetRetryTimes reset retry times +func (pl *peerlist) resetRetryTimes(addr string) { + if p, ok := pl.peers[addr]; ok { + p.ResetRetryTimes() + p.Seen() + } +} + +// resetAllRetryTimes reset all peers' retry times +func (pl *peerlist) resetAllRetryTimes() { + logger.Info("Reset all peer's retry times") + for _, p := range pl.peers { + p.ResetRetryTimes() + } +} + +// PeerJSON is for saving and loading peers to disk. Some fields are strange, +// to be backwards compatible due to variable name changes +type PeerJSON struct { + Addr string // An address of the form ip:port + // Unix timestamp when this peer was last seen. + // This could be a time.Time string or an int64 timestamp + LastSeen interface{} + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomePort *bool `json:"HasIncomePort,omitempty"` // Whether this peer has incoming port [DEPRECATED] + HasIncomingPort *bool // Whether this peer has incoming port +} + +// newPeerJSON returns a PeerJSON from a Peer +func newPeerJSON(p Peer) PeerJSON { + return PeerJSON{ + Addr: p.Addr, + LastSeen: p.LastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: &p.HasIncomingPort, + } +} + +// newPeerFromJSON converts a PeerJSON to a Peer +func newPeerFromJSON(p PeerJSON) (*Peer, error) { + hasIncomingPort := false + if p.HasIncomingPort != nil { + hasIncomingPort = *p.HasIncomingPort + } else if p.HasIncomePort != nil { + hasIncomingPort = *p.HasIncomePort + } + + // LastSeen could be a RFC3339Nano timestamp or an int64 unix timestamp + var lastSeen int64 + switch p.LastSeen.(type) { + case string: + lastSeenTime, err := time.Parse(time.RFC3339Nano, p.LastSeen.(string)) + if err != nil { + return nil, err + } + lastSeen = lastSeenTime.Unix() + case json.Number: + lastSeenNum := p.LastSeen.(json.Number) + var err error + lastSeen, err = lastSeenNum.Int64() + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("Invalid type %T for LastSeen field", p.LastSeen) + } + + addr, err := validateAddress(p.Addr, true) + if err != nil { + return nil, err + } + + return &Peer{ + Addr: addr, + LastSeen: lastSeen, + Private: p.Private, + Trusted: p.Trusted, + HasIncomingPort: hasIncomingPort, + }, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist_test.go new file mode 100755 index 0000000..2fc4aac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/peerlist_test.go @@ -0,0 +1,547 @@ +package pex + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/utc" +) + +var testPeers = []string{ + "112.32.32.14:7200", + "112.32.32.15:7200", + "112.32.32.16:7200", + "112.32.32.17:7200", +} + +var wrongPortPeer = "112.32.32.14:1" + +/* Peer tests */ + +func TestNewPeer(t *testing.T) { + p := NewPeer(testPeers[0]) + require.NotEqual(t, p.LastSeen, 0) + require.Equal(t, p.Addr, testPeers[0]) + require.False(t, p.Private) +} + +func TestPeerSeen(t *testing.T) { + p := NewPeer(testPeers[0]) + x := p.LastSeen + time.Sleep(time.Second) + p.Seen() + require.NotEqual(t, x, p.LastSeen) + if p.LastSeen < x { + t.Fail() + } +} + +func TestPeerString(t *testing.T) { + p := NewPeer(testPeers[0]) + require.Equal(t, testPeers[0], p.String()) +} + +func TestLoadPeersFromFile(t *testing.T) { + tt := []struct { + name string + noFile bool + emptyFile bool + ps []string + expectPeers map[string]*Peer + err error + }{ + { + "no file", + true, + false, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + { + "one addr", + false, + false, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + nil, + }, + { + "two addr", + false, + false, + testPeers[:2], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + nil, + }, + { + "empty peer list file", + false, + true, + testPeers[0:0], + map[string]*Peer{}, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + f, removeFile := preparePeerlistFile(t) + if !tc.emptyFile { + persistPeers(t, f, tc.ps) + } + + if tc.noFile { + // remove file immediately + removeFile() + } else { + defer removeFile() + } + + peers, err := loadPeersFromFile(f) + require.Equal(t, tc.err, err) + require.Equal(t, len(tc.expectPeers), len(peers)) + for k, v := range tc.expectPeers { + p, ok := peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistSetPeers(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "empty peers", + []Peer{}, + map[string]Peer{}, + }, + { + "one peer", + []Peer{*NewPeer(testPeers[0])}, + map[string]Peer{ + testPeers[0]: *NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + require.Equal(t, len(tc.expect), len(pl.peers)) + for k, v := range tc.expect { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerlistAddPeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeer string + dup bool + expectPeers map[string]*Peer + }{ + { + "add peer to empty peer list", + []Peer{}, + testPeers[0], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add peer to none empty peer list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1], + false, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + { + "add dup peer", + []Peer{{Addr: testPeers[0]}}, + testPeers[0], + true, + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init the peers + pl.setPeers(tc.initPeers) + + if tc.dup { + // sleep a second so that LastSeen is diff + time.Sleep(time.Second) + } + + // add peer + pl.addPeer(tc.addPeer) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + if tc.dup { + require.True(t, p.LastSeen > v.LastSeen) + continue + } + + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerlistAddPeers(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addPeers []string + expectPeers map[string]*Peer + }{ + { + "add one peer to empty list", + []Peer{}, + testPeers[:1], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + }, + }, + { + "add two peer to none empty list", + []Peer{*NewPeer(testPeers[0])}, + testPeers[1:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + { + "add dup peers", + []Peer{*NewPeer(testPeers[0])}, + testPeers[:3], + map[string]*Peer{ + testPeers[0]: NewPeer(testPeers[0]), + testPeers[1]: NewPeer(testPeers[1]), + testPeers[2]: NewPeer(testPeers[2]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + // init peers + pl.setPeers(tc.initPeers) + + // add peers + pl.addPeers(tc.addPeers) + + require.Equal(t, len(tc.expectPeers), len(pl.peers)) + for k, v := range tc.expectPeers { + p, ok := pl.peers[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, *p) + } + }) + } +} + +func TestPeerListSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + trust bool + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set trust false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + + // init peer + pl.setPeers(tc.initPeers) + + err := pl.setTrusted(tc.peer, tc.trust) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pl.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.trust, p.Trusted) + }) + } +} + +func TestPeerlistClearOld(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + timeAgo time.Duration + expectPeers map[string]Peer + }{ + { + "no old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + }, + 110 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + }, + }, + { + "clear one old peer", + []Peer{ + {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + {Addr: testPeers[1], LastSeen: utc.UnixNow() - 110}, + {Addr: testPeers[2], LastSeen: utc.UnixNow() - 120}, + }, + 111 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + testPeers[1]: {Addr: testPeers[1], LastSeen: utc.UnixNow() - 110}, + }, + }, + { + "clear two old peers", + []Peer{ + {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + {Addr: testPeers[1], LastSeen: utc.UnixNow() - 110}, + {Addr: testPeers[2], LastSeen: utc.UnixNow() - 120}, + }, + 101 * time.Second, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0], LastSeen: utc.UnixNow() - 100}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.initPeers) + + pl.clearOld(tc.timeAgo) + require.Equal(t, len(pl.peers), len(tc.expectPeers)) + for _, p := range tc.expectPeers { + v, ok := pl.peers[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, *v, p) + } + }) + } +} + +func TestPeerlistSave(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect map[string]Peer + }{ + { + "save all", + []Peer{ + {Addr: testPeers[0]}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[0]: {Addr: testPeers[0]}, + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + { + "save one peer", + []Peer{ + {Addr: testPeers[0], RetryTimes: MaxPeerRetryTimes + 1}, + {Addr: testPeers[1]}, + }, + map[string]Peer{ + testPeers[1]: {Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pl := newPeerlist() + pl.setPeers(tc.peers) + + f, removeFile := preparePeerlistFile(t) + defer removeFile() + require.NoError(t, pl.save(f)) + + psMap, err := loadPeersFromFile(f) + require.NoError(t, err) + for k, v := range tc.expect { + p, ok := psMap[k] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, v, *p) + } + }) + } +} + +func TestPeerCanTry(t *testing.T) { + testData := []struct { + LastSeen int64 + RetryTimes int + CanTry bool + }{ + { + utc.Now().Add(time.Duration(100) * time.Second * -1).Unix(), + 1, + true, + }, + } + + for _, d := range testData { + p := Peer{ + LastSeen: d.LastSeen, + RetryTimes: d.RetryTimes, + } + require.Equal(t, d.CanTry, p.CanTry()) + } +} + +func TestPeerJSONParsing(t *testing.T) { + // The serialized peer json format changed, + // this tests that the old format can still parse. + oldFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": "2017-09-24T06:42:18.999999999Z", + "Private": true, + "Trusted": true, + "HasIncomePort": true + }` + + newFormat := `{ + "Addr": "11.22.33.44:6000", + "LastSeen": 1506235338, + "Private": true, + "Trusted": true, + "HasIncomingPort": true + }` + + check := func(p *Peer) { + require.Equal(t, "11.22.33.44:6000", p.Addr) + require.True(t, p.Private) + require.True(t, p.Trusted) + require.True(t, p.HasIncomingPort) + require.Equal(t, int64(1506235338), p.LastSeen) + } + + load := func(s string) PeerJSON { + var pj PeerJSON + dec := json.NewDecoder(strings.NewReader(s)) + dec.UseNumber() + err := dec.Decode(&pj) + require.NoError(t, err) + return pj + } + + pj := load(oldFormat) + p, err := newPeerFromJSON(pj) + require.NoError(t, err) + check(p) + + pj = load(newFormat) + p, err = newPeerFromJSON(pj) + require.NoError(t, err) + check(p) +} + +func peersEqualWithSeenAllowedDiff(t *testing.T, expected Peer, actual Peer) { + require.WithinDuration(t, time.Unix(expected.LastSeen, 0), time.Unix(actual.LastSeen, 0), 1*time.Second) + expected.LastSeen = actual.LastSeen + require.Equal(t, expected, actual) +} + +// preparePeerlistFile makes peers.txt in temporary dir, +func preparePeerlistFile(t *testing.T) (string, func()) { + f, err := ioutil.TempFile("", "peers.txt") + require.NoError(t, err) + + return f.Name(), func() { + os.Remove(f.Name()) + } +} + +func preparePeerlistDir(t *testing.T) (string, func()) { + f, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + + return f, func() { + os.Remove(f) + } +} + +func persistPeers(t *testing.T, fn string, peers []string) { + t.Helper() + peersMap := make(map[string]*Peer, len(peers)) + for _, p := range peers { + peersMap[p] = NewPeer(p) + } + + if err := file.SaveJSON(fn, peersMap, 0600); err != nil { + panic(fmt.Sprintf("save peer list failed: %v", err)) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go new file mode 100755 index 0000000..afe0d3d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex.go @@ -0,0 +1,596 @@ +// Package pex is a toolkit for implementing a peer exchange system +package pex + +import ( + "errors" + "io/ioutil" + "math" + "math/rand" + "net" + "net/http" + "path/filepath" + "regexp" + "strconv" + "strings" + "sync" + "time" + + "github.com/cenkalti/backoff" + + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/utc" +) + +//TODO: +// - keep track of last time the peer was connected to +// - last time peer was connected to is more important than "seen" +// - peer "seen" means something else than use here +// - save last time connected to, use 0 for never +// - only transmit peers that have active or recent connections + +const ( + // DefaultPeerListURL is the default URL to download remote peers list from, if enabled + DefaultPeerListURL = "https://downloads.skycoin.net/blockchain/peers.txt" + // PeerDatabaseFilename filename for disk-cached peers + PeerDatabaseFilename = "peers.txt" + // MaxPeerRetryTimes is the maximum number of times to retry a peer + MaxPeerRetryTimes = 10 +) + +var ( + // ErrPeerlistFull is returned when the Pex is at a maximum + ErrPeerlistFull = errors.New("Peer list full") + // ErrInvalidAddress is returned when an address appears malformed + ErrInvalidAddress = errors.New("Invalid address") + // ErrNoLocalhost is returned if a localhost addresses are not allowed + ErrNoLocalhost = errors.New("Localhost address is not allowed") + // ErrNotExternalIP is returned if an IP address is not a global unicast address + ErrNotExternalIP = errors.New("IP is not a valid external IP") + // ErrPortTooLow is returned if a port is less than 1024 + ErrPortTooLow = errors.New("Port must be >= 1024") + // ErrBlacklistedAddress returned when attempting to add a blacklisted peer + ErrBlacklistedAddress = errors.New("Blacklisted address") + + // Logging. See http://godoc.org/github.com/op/go-logging for + // instructions on how to include this log's output + logger = logging.MustGetLogger("pex") + // Default rng + rnum = rand.New(rand.NewSource(time.Now().Unix())) + // For removing inadvertent whitespace from addresses + whitespaceFilter = regexp.MustCompile(`\s`) +) + +// validateAddress returns a sanitized address if valid, otherwise an error +func validateAddress(ipPort string, allowLocalhost bool) (string, error) { + ipPort = whitespaceFilter.ReplaceAllString(ipPort, "") + pts := strings.Split(ipPort, ":") + if len(pts) != 2 { + return "", ErrInvalidAddress + } + + ip := net.ParseIP(pts[0]) + if ip == nil { + return "", ErrInvalidAddress + } else if ip.IsLoopback() { + if !allowLocalhost { + return "", ErrNoLocalhost + } + } else if !ip.IsGlobalUnicast() { + return "", ErrNotExternalIP + } + + port, err := strconv.ParseUint(pts[1], 10, 16) + if err != nil { + return "", ErrInvalidAddress + } + + if port < 1024 { + return "", ErrPortTooLow + } + + return ipPort, nil +} + +// Peer represents a known peer +type Peer struct { + Addr string // An address of the form ip:port + LastSeen int64 // Unix timestamp when this peer was last seen + Private bool // Whether it should omitted from public requests + Trusted bool // Whether this peer is trusted + HasIncomingPort bool // Whether this peer has accessable public port + RetryTimes int `json:"-"` // records the retry times +} + +// NewPeer returns a *Peer initialised by an address string of the form ip:port +func NewPeer(address string) *Peer { + p := &Peer{ + Addr: address, + Private: false, + Trusted: false, + } + p.Seen() + return p +} + +// Seen marks the peer as seen +func (peer *Peer) Seen() { + peer.LastSeen = utc.UnixNow() +} + +// IncreaseRetryTimes adds the retry times +func (peer *Peer) IncreaseRetryTimes() { + peer.RetryTimes++ + logger.Debugf("Increase retry times of %v: %v", peer.Addr, peer.RetryTimes) +} + +// ResetRetryTimes resets the retry time +func (peer *Peer) ResetRetryTimes() { + peer.RetryTimes = 0 + logger.Debugf("Reset retry times of %v", peer.Addr) +} + +// CanTry returns whether this peer is tryable base on the exponential backoff algorithm +func (peer *Peer) CanTry() bool { + // Exponential backoff + mod := (math.Exp2(float64(peer.RetryTimes)) - 1) * 5 + if mod == 0 { + return true + } + + // Random time elapsed + now := utc.UnixNow() + t := rnum.Int63n(int64(mod)) + return now-peer.LastSeen > t +} + +// String returns the peer address +func (peer *Peer) String() string { + return peer.Addr +} + +// Config pex config +type Config struct { + // Folder where peers database should be saved + DataDirectory string + // Maximum number of peers to keep account of in the PeerList + Max int + // Cull peers after they havent been seen in this much time + Expiration time.Duration + // Cull expired peers on this interval + CullRate time.Duration + // clear old peers on this interval + ClearOldRate time.Duration + // How often to clear expired blacklist entries + UpdateBlacklistRate time.Duration + // How often to request peers via PEX + RequestRate time.Duration + // How many peers to send back in response to a peers request + ReplyCount int + // Localhost peers are allowed in the peerlist + AllowLocalhost bool + // Disable exchanging of peers. Peers are still loaded from disk + Disabled bool + // Whether the network is disabled + NetworkDisabled bool + // Download peers list from remote host + DownloadPeerList bool + // Download peers list from this URL + PeerListURL string +} + +// NewConfig creates default pex config. +func NewConfig() Config { + return Config{ + DataDirectory: "./", + Max: 1000, + Expiration: time.Hour * 24 * 7, + CullRate: time.Minute * 10, + ClearOldRate: time.Minute * 10, + UpdateBlacklistRate: time.Minute, + RequestRate: time.Minute, + ReplyCount: 30, + AllowLocalhost: false, + Disabled: false, + NetworkDisabled: false, + DownloadPeerList: false, + PeerListURL: DefaultPeerListURL, + } +} + +// Pex manages a set of known peers and controls peer acquisition +type Pex struct { + sync.RWMutex + // All known peers + peerlist peerlist + Config Config + quit chan struct{} + done chan struct{} +} + +// New creates pex +func New(cfg Config, defaultConns []string) (*Pex, error) { + pex := &Pex{ + Config: cfg, + peerlist: newPeerlist(), + quit: make(chan struct{}), + done: make(chan struct{}), + } + + // Load peers from disk + if err := pex.load(); err != nil { + return nil, err + } + + // Load default hardcoded peers + for _, addr := range defaultConns { + // Default peers will mark as trusted peers. + if err := pex.AddPeer(addr); err != nil { + logger.Critical().Errorf("add peer failed:%v", err) + continue + } + if err := pex.SetTrusted(addr); err != nil { + logger.Critical().Errorf("pex.SetTrust failed: %v", err) + } + } + + // Save peers to disk + if err := pex.save(); err != nil { + return nil, err + } + + // Download peers from remote peers list + if pex.Config.DownloadPeerList { + go func() { + if err := pex.downloadPeers(); err != nil { + logger.Errorf("Failed to download peers list: %v", err) + } + }() + } + + return pex, nil +} + +// Run starts the pex service +func (px *Pex) Run() error { + logger.Info("Pex.Run started") + defer logger.Info("Pex.Run stopped") + defer close(px.done) + + defer func() { + // Save the peerlist + logger.Info("Save peerlist") + if err := px.save(); err != nil { + logger.Errorf("Save peers failed: %v", err) + } + }() + + clearOldTicker := time.NewTicker(px.Config.ClearOldRate) + + for { + select { + case <-clearOldTicker.C: + // Remove peers we haven't seen in a while + if !px.Config.Disabled && !px.Config.NetworkDisabled { + px.Lock() + px.peerlist.clearOld(px.Config.Expiration) + px.Unlock() + } + case <-px.quit: + return nil + } + } +} + +// Shutdown notifies the pex service to exist +func (px *Pex) Shutdown() { + logger.Info("Shutting down pex") + defer logger.Info("Pex shutdown") + close(px.quit) + <-px.done +} + +func (px *Pex) downloadPeers() error { + body, err := backoffDownloadText(px.Config.PeerListURL) + if err != nil { + logger.Errorf("Failed to download peers from %s. err: %s", px.Config.PeerListURL, err.Error()) + return err + } + + peers := parseRemotePeerList(body) + logger.Infof("Downloaded peers list from %s, got %d peers", px.Config.PeerListURL, len(peers)) + + n := px.AddPeers(peers) + logger.Infof("Added %d/%d peers from downloaded peers list", n, len(peers)) + + return nil +} + +func (px *Pex) load() error { + px.Lock() + defer px.Unlock() + + fp := filepath.Join(px.Config.DataDirectory, PeerDatabaseFilename) + peers, err := loadPeersFromFile(fp) + if err != nil { + return err + } + + // file does not exist + if peers == nil { + return nil + } + + // remove invalid peers and limit the max number of peers to pex.Config.Max + var validPeers []Peer + for addr, p := range peers { + if _, err := validateAddress(addr, px.Config.AllowLocalhost); err != nil { + logger.Errorf("Invalid peer address: %v", err) + continue + } + + validPeers = append(validPeers, *p) + if px.Config.Max > 0 && len(validPeers) >= px.Config.Max { + break + } + } + + px.peerlist.setPeers(validPeers) + return nil +} + +// SavePeers persists the peerlist +func (px *Pex) save() error { + px.Lock() + defer px.Unlock() + + fn := filepath.Join(px.Config.DataDirectory, PeerDatabaseFilename) + return px.peerlist.save(fn) +} + +// AddPeer adds a peer to the peer list, given an address. If the peer list is +// full, PeerlistFullError is returned */ +func (px *Pex) AddPeer(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.Errorf("Invalid address %s: %v", addr, err) + return ErrInvalidAddress + } + + if px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max { + return ErrPeerlistFull + } + + px.peerlist.addPeer(cleanAddr) + return nil +} + +// AddPeers add multiple peers at once. Any errors will be logged, but not returned +// Returns the number of peers that were added without error. Note that +// adding a duplicate peer will not cause an error. +func (px *Pex) AddPeers(addrs []string) int { + px.Lock() + defer px.Unlock() + + if px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max { + logger.Warning("Add peers failed, peer list is full") + return 0 + } + + // validate the addresses + var validAddrs []string + for _, addr := range addrs { + a, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.Infof("Add peers sees an invalid address %s: %v", addr, err) + continue + } + validAddrs = append(validAddrs, a) + } + addrs = validAddrs + + // Shuffle the addresses before capping them + rand.Shuffle(len(addrs), func(i, j int) { + addrs[i], addrs[j] = addrs[j], addrs[i] + }) + + if px.Config.Max > 0 { + rcap := px.Config.Max - px.peerlist.len() + if len(addrs) > rcap { + addrs = addrs[:rcap] + } + } + + px.peerlist.addPeers(addrs) + return len(addrs) +} + +// SetPrivate updates peer's private value +func (px *Pex) SetPrivate(addr string, private bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.Errorf("Invalid address %s: %v", addr, err) + return ErrInvalidAddress + } + + return px.peerlist.setPrivate(cleanAddr, private) +} + +// SetTrusted updates peer's trusted value +func (px *Pex) SetTrusted(addr string) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.Errorf("Invalid address %s: %v", addr, err) + return ErrInvalidAddress + } + + return px.peerlist.setTrusted(cleanAddr, true) +} + +// SetHasIncomingPort sets if the peer has public port +func (px *Pex) SetHasIncomingPort(addr string, hasPublicPort bool) error { + px.Lock() + defer px.Unlock() + + cleanAddr, err := validateAddress(addr, px.Config.AllowLocalhost) + if err != nil { + logger.Errorf("Invalid address %s: %v", addr, err) + return ErrInvalidAddress + } + + return px.peerlist.setHasIncomingPort(cleanAddr, hasPublicPort) +} + +// RemovePeer removes peer +func (px *Pex) RemovePeer(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.removePeer(addr) +} + +// GetPeerByAddr returns peer of given address +func (px *Pex) GetPeerByAddr(addr string) (Peer, bool) { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeerByAddr(addr) +} + +// Trusted returns trusted peers +func (px *Pex) Trusted() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getPeers(isTrusted) +} + +// Private returns private peers +func (px *Pex) Private() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers(isPrivate) +} + +// TrustedPublic returns trusted public peers +func (px *Pex) TrustedPublic() Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.getCanTryPeers(isPublic, isTrusted) +} + +// RandomPublic returns N random public peers +func (px *Pex) RandomPublic(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, isPublic) +} + +// RandomExchangeable returns N random exchangeable peers +func (px *Pex) RandomExchangeable(n int) Peers { + px.RLock() + defer px.RUnlock() + return px.peerlist.random(n, isExchangeable...) +} + +// IncreaseRetryTimes increases retry times +func (px *Pex) IncreaseRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.increaseRetryTimes(addr) +} + +// ResetRetryTimes reset retry times +func (px *Pex) ResetRetryTimes(addr string) { + px.Lock() + defer px.Unlock() + px.peerlist.resetRetryTimes(addr) +} + +// ResetAllRetryTimes reset all peers' retry times +func (px *Pex) ResetAllRetryTimes() { + px.Lock() + defer px.Unlock() + px.peerlist.resetAllRetryTimes() +} + +// IsFull returns whether the peer list is full +func (px *Pex) IsFull() bool { + px.RLock() + defer px.RUnlock() + return px.Config.Max > 0 && px.peerlist.len() >= px.Config.Max +} + +// downloadText downloads a text format file from url. +// Returns the raw response body as a string. +// TODO -- move to util, add backoff options +func downloadText(url string) (string, error) { + resp, err := http.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return string(body), nil +} + +func backoffDownloadText(url string) (string, error) { + var body string + + b := backoff.NewExponentialBackOff() + + notify := func(err error, wait time.Duration) { + logger.Errorf("waiting %v to retry downloadText, error: %v", wait, err) + } + + operation := func() error { + logger.Infof("Trying to download peers list from %s", url) + var err error + body, err = downloadText(url) + return err + } + + if err := backoff.RetryNotify(operation, b, notify); err != nil { + logger.Infof("Gave up dowloading peers list from %s: %v", url, err) + return "", err + } + + logger.Infof("Peers list downloaded from %s", url) + + return body, nil +} + +// parseRemotePeerList parses a remote peers.txt file +// The peers list format is newline separated ip:port +// Any lines that don't parse to an ip:port are skipped +// Localhost ip:port addresses are ignored +func parseRemotePeerList(body string) []string { + var peers []string + for _, addr := range strings.Split(string(body), "\n") { + addr = whitespaceFilter.ReplaceAllString(addr, "") + if addr == "" { + continue + } + + // Never allow localhost addresses from the remote peers list + a, err := validateAddress(addr, false) + if err != nil { + logger.Errorf("Remote peers list has invalid address %s: %v", addr, err) + continue + } + + peers = append(peers, a) + } + + return peers +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex_test.go new file mode 100755 index 0000000..4b1203b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pex/pex_test.go @@ -0,0 +1,1358 @@ +package pex + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/util/utc" +) + +func TestValidateAddress(t *testing.T) { + cases := []struct { + addr string + allowLocalhost bool + err error + cleanAddr string + }{ + { + addr: "", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:100112.32.32.14:101", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14000", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:66666", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "0.0.0.0:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: ":8888", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "224.1.1.1:8888", + allowLocalhost: false, + err: ErrNotExternalIP, + }, + { + addr: "112.32.32.14:0", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:10", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:100", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1000", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:1023", + allowLocalhost: false, + err: ErrPortTooLow, + }, + { + addr: "112.32.32.14:65536", + allowLocalhost: false, + err: ErrInvalidAddress, + }, + { + addr: "112.32.32.14:1024", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:10000", + allowLocalhost: false, + }, + { + addr: "112.32.32.14:65535", + allowLocalhost: false, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: true, + }, + { + addr: "127.0.0.1:8888", + allowLocalhost: false, + err: ErrNoLocalhost, + }, + { + addr: "11.22.33.44:8080", + allowLocalhost: false, + }, + { + addr: " 11.22.33.44:8080\n", + allowLocalhost: false, + cleanAddr: "11.22.33.44:8080", + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("%+v", tc) + t.Run(name, func(t *testing.T) { + cleanAddr, err := validateAddress(tc.addr, tc.allowLocalhost) + require.Equal(t, tc.err, err) + + if err == nil { + if tc.cleanAddr == "" { + require.Equal(t, tc.addr, cleanAddr) + } else { + require.Equal(t, tc.cleanAddr, cleanAddr) + } + } + }) + } + + // // empty string + // require.False(t, validateAddress("", false)) + // // doubled ip:port + // require.False(t, validateAddress("112.32.32.14:100112.32.32.14:101", false)) + // // requires port + // require.False(t, validateAddress("112.32.32.14", false)) + // // not ip + // require.False(t, validateAddress("112", false)) + // require.False(t, validateAddress("112.32", false)) + // require.False(t, validateAddress("112.32.32", false)) + // // bad part + // require.False(t, validateAddress("112.32.32.14000", false)) + // // large port + // require.False(t, validateAddress("112.32.32.14:66666", false)) + // // unspecified + // require.False(t, validateAddress("0.0.0.0:8888", false)) + // // no ip + // require.False(t, validateAddress(":8888", false)) + // // multicast + // require.False(t, validateAddress("224.1.1.1:8888", false)) + // // invalid ports + // require.False(t, validateAddress("112.32.32.14:0", false)) + // require.False(t, validateAddress("112.32.32.14:1", false)) + // require.False(t, validateAddress("112.32.32.14:10", false)) + // require.False(t, validateAddress("112.32.32.14:100", false)) + // require.False(t, validateAddress("112.32.32.14:1000", false)) + // require.False(t, validateAddress("112.32.32.14:1023", false)) + // require.False(t, validateAddress("112.32.32.14:65536", false)) + // // valid ones + // require.True(t, validateAddress("112.32.32.14:1024", false)) + // require.True(t, validateAddress("112.32.32.14:10000", false)) + // require.True(t, validateAddress("112.32.32.14:65535", false)) + // // localhost is allowed + // require.True(t, validateAddress("127.0.0.1:8888", true)) + // // localhost is not allowed + // require.False(t, validateAddress("127.0.0.1:8888", false)) +} + +func TestNewPex(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + // defer removeFile() + config := NewConfig() + config.DataDirectory = dir + + _, err = New(config, testPeers[:]) + require.NoError(t, err) + + // check if peers are saved to disk + peers, err := loadPeersFromFile(filepath.Join(dir, PeerDatabaseFilename)) + require.NoError(t, err) + + for _, p := range testPeers { + v, ok := peers[p] + require.True(t, ok) + require.True(t, v.Trusted) + } +} + +func TestPexLoadPeers(t *testing.T) { + tt := []struct { + name string + peers []Peer + max int + expectN int + expectIN []Peer + }{ + { + "load all", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + { + "reach max", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + { + "including invalid addr", + []Peer{ + Peer{Addr: wrongPortPeer}, + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[1]}, + Peer{Addr: testPeers[2]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir, err := ioutil.TempDir("", "peerlist") + require.NoError(t, err) + defer os.Remove(dir) + + // write peers to file + fn := filepath.Join(dir, PeerDatabaseFilename) + + peersMap := make(map[string]Peer) + for _, p := range tc.peers { + peersMap[p.Addr] = p + } + + err = file.SaveJSON(fn, peersMap, 0600) + require.NoError(t, err) + + cfg := NewConfig() + cfg.DataDirectory = dir + cfg.Max = tc.max + + px := Pex{ + peerlist: newPeerlist(), + Config: cfg, + } + + err = px.load() + require.NoError(t, err) + + require.Len(t, px.peerlist.peers, tc.expectN) + + psm := make(map[string]Peer) + for _, p := range tc.expectIN { + psm[p.Addr] = p + } + + for _, p := range px.peerlist.peers { + v, ok := psm[p.Addr] + require.True(t, ok) + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexAddPeer(t *testing.T) { + tt := []struct { + name string + peers []string + max int + peer string + err error + }{ + { + "ok", + testPeers[:1], + 2, + testPeers[1], + nil, + }, + { + "invalid peer", + testPeers[:1], + 2, + wrongPortPeer, + ErrInvalidAddress, + }, + { + "reach max", + testPeers[:2], + 2, + testPeers[3], + ErrPeerlistFull, + }, + { + "no max", + testPeers[:2], + 0, + testPeers[3], + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + + // create px instance and load peers + px, err := New(cfg, tc.peers) + require.NoError(t, err) + + err = px.AddPeer(tc.peer) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + // check if the peer is in the peer list + _, ok := px.peerlist.peers[tc.peer] + require.True(t, ok) + }) + } +} + +func TestPexAddPeers(t *testing.T) { + tt := []struct { + name string + peers []string + max int + addPeers []string + addN int + expectPeers []string + }{ + { + "ok", + testPeers[:1], + 5, + testPeers[1:3], + 2, + testPeers[1:3], + }, + { + "almost full", + testPeers[:1], + 2, + testPeers[1:3], + 1, + testPeers[1:2], + }, + { + "already full", + testPeers[:2], + 2, + testPeers[2:3], + 0, + testPeers[0:0], + }, + { + "including invalid address", + testPeers[:1], + 2, + []string{testPeers[1], wrongPortPeer}, + 1, + testPeers[1:2], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create temp peer list file + dir, removeDir := preparePeerlistDir(t) + defer removeDir() + + // create px config + cfg := NewConfig() + cfg.Max = tc.max + cfg.DataDirectory = dir + + // create px instance and load peers + px, err := New(cfg, tc.peers) + require.NoError(t, err) + + n := px.AddPeers(tc.addPeers) + require.Equal(t, tc.addN, n) + + for _, p := range tc.expectPeers { + _, ok := px.peerlist.peers[p] + require.True(t, ok) + } + }) + } +} + +func TestPexTrustedPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "none peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{}, + }, + { + + "one trusted public peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true, Private: false}, + Peer{Addr: testPeers[1], Trusted: true, Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get trusted public peers + peers := pex.TrustedPublic() + + require.Equal(t, len(tc.expect), len(peers)) + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexRandomExchangeable(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectIN []Peer + }{ + { + "n=0 exchangeable=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 0, + 0, + []Peer{}, + }, + { + "n=0 exchangeable=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 0, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + "n=0 exchangeable=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 0, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + { + "n=1 exchangeable=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: true, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 1, + 0, + []Peer{}, + }, + { + "n=1 exchangeable=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: false}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 1, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + { + "n=1 exchangeable=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 1, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true}, + }, + }, + { + "n=2 exchangeable=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + Peer{Addr: testPeers[1], Private: false, HasIncomingPort: true, RetryTimes: 1}, + Peer{Addr: testPeers[2], Private: true, HasIncomingPort: true}, + }, + 2, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false, HasIncomingPort: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomExchangeable(tc.n) + require.Len(t, peers, tc.expectN) + + // map expectIN peers + psm := make(map[string]Peer) + for _, p := range tc.expectIN { + psm[p.Addr] = p + } + + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPeerRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + }{ + { + "0 peer", + []Peer{}, + 1, + 0, + }, + { + "1 peer", + []Peer{ + Peer{Addr: testPeers[0]}, + }, + 1, + 1, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.RandomPublic(tc.n) + require.Len(t, peers, tc.expectN) + }) + } +} + +func TestPexRandomPublic(t *testing.T) { + tt := []struct { + name string + peers []Peer + n int + expectN int + expectIN []Peer + }{ + { + "n=0 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 0, + []Peer{}, + }, + { + "n=0 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 0, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=1 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 0, + []Peer{}, + }, + { + "n=1 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 1, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + { + "n=2 public=0", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 0, + []Peer{}, + }, + { + "n=2 public=1", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: true}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 1, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + }, + }, + { + "n=2 public=2", + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + Peer{Addr: testPeers[2], Private: true}, + }, + 2, + 2, + []Peer{ + Peer{Addr: testPeers[0], Private: false}, + Peer{Addr: testPeers[1], Private: false}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + // get N random public + peers := pex.RandomPublic(tc.n) + + require.Len(t, peers, tc.expectN) + + // map the peers + psm := make(map[string]Peer) + for _, p := range tc.expectIN { + psm[p.Addr] = p + } + + // check if the returned peers are in the expectIN + for _, p := range peers { + v, ok := psm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexTrusted(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no trust peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Trusted: true}, + Peer{Addr: testPeers[1], Trusted: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Trusted() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexPrivate(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + + "no private peer", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + []Peer{}, + }, + { + + "one private peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1]}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + }, + }, + { + + "all trust peer", + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + []Peer{ + Peer{Addr: testPeers[0], Private: true}, + Peer{Addr: testPeers[1], Private: true}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + peers := pex.Private() + require.Equal(t, len(tc.expect), len(peers)) + + pm := make(map[string]Peer) + for _, p := range peers { + pm[p.Addr] = p + } + + for _, p := range tc.expect { + v, ok := pm[p.Addr] + require.True(t, ok) + peersEqualWithSeenAllowedDiff(t, p, v) + } + }) + } +} + +func TestPexResetAllRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + expect []Peer + }{ + { + "all", + []Peer{ + Peer{Addr: testPeers[0], RetryTimes: 1}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetAllRetryTimes() + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexIncreaseRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect map[string]Peer + }{ + { + "addr not exist", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[2], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0]}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + { + "ok", + []Peer{ + Peer{Addr: testPeers[0]}, + Peer{Addr: testPeers[1]}, + }, + testPeers[0], + map[string]Peer{ + testPeers[0]: Peer{Addr: testPeers[0], LastSeen: utc.UnixNow(), RetryTimes: 1}, + testPeers[1]: Peer{Addr: testPeers[1]}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.IncreaseRetryTimes(tc.addr) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + if p.LastSeen != 0 { + require.InDelta(t, v.LastSeen, p.LastSeen, 2) + p.LastSeen = 0 + v.LastSeen = 0 + } + require.Equal(t, v, *p) + } + }) + } +} + +func TestPexResetRetryTimes(t *testing.T) { + tt := []struct { + name string + peers []Peer + addr string + expect []Peer + }{ + { + "no peer need reset", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[2], + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + }, + { + "reset one", + []Peer{ + Peer{Addr: testPeers[0], LastSeen: utc.UnixNow(), RetryTimes: 10}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + testPeers[0], + []Peer{ + Peer{Addr: testPeers[0], LastSeen: utc.UnixNow()}, + Peer{Addr: testPeers[1], RetryTimes: 2}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.peers) + + pex.ResetRetryTimes(tc.addr) + + for _, p := range tc.expect { + v, ok := pex.peerlist.peers[p.Addr] + require.True(t, ok) + require.Equal(t, p, *v) + } + }) + } +} + +func TestPexRemovePeer(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + removePeer string + expect map[string]*Peer + }{ + { + "remove from empty peer list", + []Peer{}, + testPeers[0], + map[string]*Peer{}, + }, + { + "remove one", + []Peer{*NewPeer(testPeers[0]), *NewPeer(testPeers[1])}, + testPeers[0], + map[string]*Peer{ + testPeers[1]: NewPeer(testPeers[1]), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + pex.RemovePeer(tc.removePeer) + + require.Equal(t, len(tc.expect), len(pex.peerlist.peers)) + for k, v := range tc.expect { + p, ok := pex.peerlist.peers[k] + require.True(t, ok) + require.Equal(t, *v, *p) + } + }) + } +} + +func TestPexSetPrivate(t *testing.T) { + tt := []struct { + name string + initPeer []Peer + peer string + private bool + err error + }{ + { + "set private true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set private false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.Private failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeer) + + err := pex.SetPrivate(tc.peer, tc.private) + require.Equal(t, tc.err, err) + if err != nil { + return + } + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + + require.Equal(t, tc.private, p.Private) + }) + } +} + +func TestPexSetTrusted(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + err error + }{ + { + "set trust true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + fmt.Errorf("set peer.Trusted failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + // init peer + pex.peerlist.setPeers(tc.initPeers) + + err := pex.SetTrusted(tc.peer) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.True(t, p.Trusted) + }) + } +} + +func TestPexSetHasIncomingPort(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + peer string + hasIncomingPort bool + err error + }{ + { + "set has incoming port true", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + true, + nil, + }, + { + "set has incoming port false", + []Peer{*NewPeer(testPeers[0])}, + testPeers[0], + false, + nil, + }, + { + "set failed", + []Peer{*NewPeer(testPeers[1])}, + testPeers[0], + false, + fmt.Errorf("set peer.HasIncomingPort failed: %v does not exist in peer list", testPeers[0]), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + err := pex.SetHasIncomingPort(tc.peer, tc.hasIncomingPort) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + p, ok := pex.peerlist.peers[tc.peer] + require.True(t, ok) + require.Equal(t, tc.hasIncomingPort, p.HasIncomingPort) + }) + } +} + +func TestPexGetPeerByAddr(t *testing.T) { + tt := []struct { + name string + initPeers []Peer + addr string + find bool + peer Peer + }{ + { + "ok", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[0], + true, + *NewPeer(testPeers[0]), + }, + { + "not exist", + []Peer{ + *NewPeer(testPeers[0]), + *NewPeer(testPeers[1]), + }, + testPeers[2], + false, + Peer{}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + } + + pex.peerlist.setPeers(tc.initPeers) + + p, ok := pex.GetPeerByAddr(tc.addr) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.peer, p) + } + }) + } +} + +func TestPexIsFull(t *testing.T) { + pex := &Pex{ + peerlist: newPeerlist(), + Config: Config{Max: 0}, + } + + require.False(t, pex.IsFull()) + + err := pex.AddPeer("11.22.33.44:5555") + require.NoError(t, err) + require.False(t, pex.IsFull()) + + pex.Config.Max = 2 + require.False(t, pex.IsFull()) + err = pex.AddPeer("33.44.55.66:5555") + require.NoError(t, err) + require.True(t, pex.IsFull()) + + pex.Config.Max = 1 + require.True(t, pex.IsFull()) +} + +func TestParseRemotePeerList(t *testing.T) { + body := `11.22.33.44:5555 +66.55.44.33:2020 +# comment + +127.0.0.1:8080 + 54.54.32.32:7899 +11.33.11.33 +22.44.22.44:99 +` + + peers := parseRemotePeerList(body) + require.Len(t, peers, 3) + require.Equal(t, []string{ + "11.22.33.44:5555", + "66.55.44.33:2020", + "54.54.32.32:7899", + }, peers) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/pool.go b/vendor/github.com/skycoin/skycoin/src/daemon/pool.go new file mode 100755 index 0000000..4ac51dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/pool.go @@ -0,0 +1,104 @@ +package daemon + +import ( + "time" + + "github.com/skycoin/skycoin/src/daemon/gnet" +) + +// PoolConfig pool config +type PoolConfig struct { + // Timeout when trying to connect to new peers through the pool + DialTimeout time.Duration + // How often to process message buffers and generate events + MessageHandlingRate time.Duration + // How long to wait before sending another ping + PingRate time.Duration + // How long a connection can idle before considered stale + IdleLimit time.Duration + // How often to check for needed pings + IdleCheckRate time.Duration + // How often to check for stale connections + ClearStaleRate time.Duration + // Buffer size for gnet.ConnectionPool's network Read events + EventChannelSize int + // Maximum number of connections to maintain + MaxConnections int + MaxDefaultPeerOutgoingConnections int + DefaultPeerConnections map[string]struct{} + // These should be assigned by the controlling daemon + address string + port int +} + +// NewPoolConfig creates pool config +func NewPoolConfig() PoolConfig { + //defIdleLimit := time.Minute + return PoolConfig{ + port: 6677, + address: "", + DialTimeout: time.Second * 30, + MessageHandlingRate: time.Millisecond * 50, + PingRate: 5 * time.Second, + IdleLimit: 60 * time.Second, + IdleCheckRate: 1 * time.Second, + ClearStaleRate: 1 * time.Second, + EventChannelSize: 4096, + MaxConnections: 128, + MaxDefaultPeerOutgoingConnections: 1, + DefaultPeerConnections: make(map[string]struct{}), + } +} + +// Pool maintains config and pool +type Pool struct { + Config PoolConfig + Pool *gnet.ConnectionPool +} + +// NewPool creates pool +func NewPool(cfg PoolConfig, d *Daemon) *Pool { + gnetCfg := gnet.NewConfig() + gnetCfg.DialTimeout = cfg.DialTimeout + gnetCfg.Port = uint16(cfg.port) + gnetCfg.Address = cfg.address + gnetCfg.ConnectCallback = d.onGnetConnect + gnetCfg.DisconnectCallback = d.onGnetDisconnect + gnetCfg.MaxConnections = cfg.MaxConnections + gnetCfg.MaxDefaultPeerOutgoingConnections = cfg.MaxDefaultPeerOutgoingConnections + gnetCfg.DefaultPeerConnections = cfg.DefaultPeerConnections + + return &Pool{ + Config: cfg, + Pool: gnet.NewConnectionPool(gnetCfg, d), + } +} + +// Shutdown closes all connections and stops listening +func (pool *Pool) Shutdown() { + if pool == nil { + return + } + pool.Pool.Shutdown() +} + +// Run starts listening on the configured Port +func (pool *Pool) Run() error { + logger.Infof("daemon.Pool listening on port %d", pool.Config.port) + return pool.Pool.Run() +} + +// RunOffline runs the pool without a listener. This is necessary to process strand requests. +func (pool *Pool) RunOffline() error { + return pool.Pool.RunOffline() +} + +// Send a ping if our last message sent was over pingRate ago +func (pool *Pool) sendPings() { + pool.Pool.SendPings(pool.Config.PingRate, &PingMessage{}) +} + +// Removes connections that have not sent a message in too long +func (pool *Pool) clearStaleConnections() { + pool.Pool.ClearStaleConnections(pool.Config.IdleLimit, ErrDisconnectIdle) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/storage.go b/vendor/github.com/skycoin/skycoin/src/daemon/storage.go new file mode 100755 index 0000000..00da623 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/storage.go @@ -0,0 +1,324 @@ +package daemon + +import ( + "sync" + "time" + + "github.com/skycoin/skycoin/src/daemon/pex" +) + +// base storage struct +type store struct { + value map[interface{}]interface{} + lk sync.Mutex +} + +type storeFunc func(*store) error + +func (s *store) setValue(k interface{}, v interface{}) { + s.lk.Lock() + s.value[k] = v + s.lk.Unlock() +} + +func (s *store) getValue(k interface{}) (interface{}, bool) { + s.lk.Lock() + defer s.lk.Unlock() + v, ok := s.value[k] + return v, ok +} + +func (s *store) do(sf storeFunc) error { + s.lk.Lock() + defer s.lk.Unlock() + return sf(s) +} + +func (s *store) remove(k interface{}) { + s.lk.Lock() + delete(s.value, k) + s.lk.Unlock() +} + +func (s *store) len() int { + s.lk.Lock() + defer s.lk.Unlock() + return len(s.value) +} + +// ExpectIntroductions records connections that are expecting introduction msg. +type ExpectIntroductions struct { + store +} + +// CullMatchFunc function for checking if the connection need to be culled +type CullMatchFunc func(addr string, t time.Time) (bool, error) + +// NewExpectIntroductions creates a ExpectIntroduction instance +func NewExpectIntroductions() *ExpectIntroductions { + return &ExpectIntroductions{ + store: store{ + value: make(map[interface{}]interface{}), + }, + } +} + +// Add adds expecting introduction connection +func (ei *ExpectIntroductions) Add(addr string, tm time.Time) { + ei.setValue(addr, tm) +} + +// Remove removes connection +func (ei *ExpectIntroductions) Remove(addr string) { + ei.remove(addr) +} + +// CullInvalidConns cull connections that match the matchFunc +func (ei *ExpectIntroductions) CullInvalidConns(f CullMatchFunc) ([]string, error) { + var addrs []string + if err := ei.do(func(s *store) error { + for k, v := range s.value { + addr := k.(string) + t := v.(time.Time) + ok, err := f(addr, t) + if err != nil { + return err + } + + if ok { + addrs = append(addrs, addr) + delete(s.value, k) + } + } + return nil + }); err != nil { + return nil, err + } + + return addrs, nil +} + +// Get returns the time of speicific address +func (ei *ExpectIntroductions) Get(addr string) (time.Time, bool) { + if v, ok := ei.getValue(addr); ok { + return v.(time.Time), ok + } + return time.Time{}, false +} + +// ConnectionMirrors records mirror for connection +type ConnectionMirrors struct { + store +} + +// NewConnectionMirrors create ConnectionMirrors instance. +func NewConnectionMirrors() *ConnectionMirrors { + return &ConnectionMirrors{ + store: store{ + value: make(map[interface{}]interface{}), + }, + } +} + +// Add adds connection mirror +func (cm *ConnectionMirrors) Add(addr string, mirror uint32) { + cm.setValue(addr, mirror) +} + +// Get returns the mirror of connection +func (cm *ConnectionMirrors) Get(addr string) (uint32, bool) { + v, ok := cm.getValue(addr) + if ok { + return v.(uint32), ok + } + return 0, false +} + +// Remove remove connection mirror +func (cm *ConnectionMirrors) Remove(addr string) { + cm.remove(addr) +} + +// OutgoingConnections records the outgoing connections +type OutgoingConnections struct { + store +} + +// NewOutgoingConnections create OutgoingConnection instance +func NewOutgoingConnections(max int) *OutgoingConnections { + return &OutgoingConnections{ + store: store{ + value: make(map[interface{}]interface{}, max), + }, + } +} + +// Add records connection +func (oc *OutgoingConnections) Add(addr string) { + oc.setValue(addr, true) +} + +// Remove remove connection +func (oc *OutgoingConnections) Remove(addr string) { + oc.remove(addr) +} + +// Get returns if connection is outgoing +func (oc *OutgoingConnections) Get(addr string) bool { + _, ok := oc.getValue(addr) + return ok +} + +// Len returns the outgoing connections count +func (oc *OutgoingConnections) Len() int { + return oc.len() +} + +// PendingConnections records pending connection peers +type PendingConnections struct { + store +} + +// NewPendingConnections creates new PendingConnections instance +func NewPendingConnections(maxConn int) *PendingConnections { + return &PendingConnections{ + store: store{ + value: make(map[interface{}]interface{}, maxConn), + }, + } +} + +// Add adds pending connection +func (pc *PendingConnections) Add(addr string, peer pex.Peer) { + pc.setValue(addr, peer) +} + +// Get returns pending connections +func (pc *PendingConnections) Get(addr string) (pex.Peer, bool) { + v, ok := pc.getValue(addr) + if ok { + return v.(pex.Peer), true + } + return pex.Peer{}, false +} + +// Remove removes pending connection +func (pc *PendingConnections) Remove(addr string) { + pc.remove(addr) +} + +// Len returns pending connection number +func (pc *PendingConnections) Len() int { + return pc.len() +} + +// MirrorConnections records mirror connections +type MirrorConnections struct { + store +} + +// NewMirrorConnections create mirror connection instance +func NewMirrorConnections() *MirrorConnections { + return &MirrorConnections{ + store: store{ + value: make(map[interface{}]interface{}), + }, + } +} + +// Add adds mirror connection +func (mc *MirrorConnections) Add(mirror uint32, ip string, port uint16) { + mc.do(func(s *store) error { + if m, ok := s.value[mirror]; ok { + m.(map[string]uint16)[ip] = port + return nil + } + + m := make(map[string]uint16) + m[ip] = port + s.value[mirror] = m + return nil + }) +} + +// Get returns ip port of specific mirror +func (mc *MirrorConnections) Get(mirror uint32, ip string) (uint16, bool) { + var port uint16 + var exist bool + mc.do(func(s *store) error { + if m, ok := s.value[mirror]; ok { + port, exist = m.(map[string]uint16)[ip] + } + return nil + }) + return port, exist +} + +// Remove removes port of ip for specific mirror +func (mc *MirrorConnections) Remove(mirror uint32, ip string) { + mc.do(func(s *store) error { + if m, ok := s.value[mirror]; ok { + delete(m.(map[string]uint16), ip) + } + return nil + }) +} + +// IPCount records connection number from the same base ip +type IPCount struct { + store +} + +// NewIPCount returns IPCount instance +func NewIPCount() *IPCount { + return &IPCount{ + store: store{ + value: make(map[interface{}]interface{}), + }, + } +} + +// Set sets ip count +// func (ic *IPCount) Set(ip string, n int) { +// ic.setValue(ip, n) +// } + +// Increase increases one for specific ip +func (ic *IPCount) Increase(ip string) { + ic.do(func(s *store) error { + if v, ok := s.value[ip]; ok { + c := v.(int) + c++ + s.value[ip] = c + return nil + } + + s.value[ip] = 1 + return nil + }) +} + +// Decrease decreases one for specific ip +func (ic *IPCount) Decrease(ip string) { + ic.do(func(s *store) error { + if v, ok := s.value[ip]; ok { + c := v.(int) + if c <= 1 { + delete(s.value, ip) + return nil + } + c-- + s.value[ip] = c + } + return nil + }) +} + +// Get return ip count +func (ic *IPCount) Get(ip string) (int, bool) { + v, ok := ic.getValue(ip) + if ok { + return v.(int), true + } + return 0, false +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/storage_test.go b/vendor/github.com/skycoin/skycoin/src/daemon/storage_test.go new file mode 100755 index 0000000..c1f9a58 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/storage_test.go @@ -0,0 +1,384 @@ +package daemon + +import ( + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/skycoin/skycoin/src/daemon/pex" + "github.com/skycoin/skycoin/src/util/utc" +) + +func TestStoreAdd(t *testing.T) { + testData := []struct { + expect int + values map[string]string + }{ + { + 1, + map[string]string{ + "a": "a_value", + }, + }, + { + 2, + map[string]string{ + "a": "a_value", + "b": "b_value", + }, + }, + { + 3, + map[string]string{ + "a": "a_value", + "b": "b_value", + "c": "c_value", + }, + }, + } + + for _, d := range testData { + s := store{value: make(map[interface{}]interface{})} + for k, v := range d.values { + s.setValue(k, v) + } + assert.Equal(t, d.expect, len(s.value)) + } +} + +func TestStoreRemove(t *testing.T) { + s := store{value: make(map[interface{}]interface{})} + s.setValue("a", "a_value") + s.setValue("b", "b_value") + + s.remove("a") + assert.Equal(t, 1, len(s.value)) + s.remove("b") + assert.Equal(t, 0, len(s.value)) +} + +func TestStoreGet(t *testing.T) { + s := store{value: make(map[interface{}]interface{})} + s.setValue("a", "a_value") + s.setValue("b", "b_value") + v, ok := s.getValue("a") + assert.True(t, ok) + assert.Equal(t, "a_value", v.(string)) +} + +func TestStoreLen(t *testing.T) { + s := store{value: make(map[interface{}]interface{})} + s.setValue("a", "a_value") + s.setValue("b", "b_value") + assert.Equal(t, s.len(), len(s.value)) +} + +func TestNewExpectIntroduction(t *testing.T) { + ei := NewExpectIntroductions() + assert.NotNil(t, ei) + assert.NotNil(t, ei.store.value) +} + +func TestExpectIntroAdd(t *testing.T) { + ei := NewExpectIntroductions() + now := utc.Now() + ei.Add("a", now) + assert.Equal(t, 1, len(ei.store.value)) +} + +func TestExpectIntroGet(t *testing.T) { + ei := NewExpectIntroductions() + now := utc.Now() + ei.Add("a", now) + tm, ok := ei.Get("a") + assert.True(t, ok) + assert.Equal(t, now, tm) +} + +func TestExpectIntroRemove(t *testing.T) { + ei := NewExpectIntroductions() + now := utc.Now() + ei.Add("a", now) + ei.Add("b", now.Add(1)) + ei.Add("c", now.Add(2)) + assert.Equal(t, 3, len(ei.store.value)) + ei.Remove("a") + assert.Equal(t, 2, len(ei.store.value)) + _, ok := ei.Get("a") + assert.False(t, ok) + bt, ok := ei.Get("b") + assert.True(t, ok) + assert.Equal(t, now.Add(1), bt) + ct, ok := ei.Get("c") + assert.True(t, ok) + assert.Equal(t, now.Add(2), ct) +} + +func TestCullInvalidConnections(t *testing.T) { + ei := NewExpectIntroductions() + now := utc.Now() + ei.Add("a", now) + ei.Add("b", now.Add(1)) + ei.Add("c", now.Add(2)) + wg := sync.WaitGroup{} + vc := make(chan string, 3) + wg.Add(2) + go func(w *sync.WaitGroup) { + as, err := ei.CullInvalidConns(func(addr string, tm time.Time) (bool, error) { + if addr == "a" || addr == "b" { + return true, nil + } + return false, nil + }) + assert.Nil(t, err) + + for _, s := range as { + vc <- s + } + w.Done() + }(&wg) + + go func(w *sync.WaitGroup) { + // w.Add(1) + as, err := ei.CullInvalidConns(func(addr string, tm time.Time) (bool, error) { + if addr == "c" { + return true, nil + } + return false, nil + }) + + assert.Nil(t, err) + + for _, s := range as { + vc <- s + } + w.Done() + }(&wg) + wg.Wait() + assert.Equal(t, 3, len(vc)) +} + +func TestNewConnectionMirrors(t *testing.T) { + cm := NewConnectionMirrors() + assert.NotNil(t, cm) + assert.NotNil(t, cm.value) +} + +func TestAddConnMirrors(t *testing.T) { + testData := []struct { + expectNum int + value map[string]uint32 + }{ + { + 1, + map[string]uint32{ + "a": 1, + }, + }, + { + 2, + map[string]uint32{ + "a": 1, + "b": 2, + }, + }, + { + 3, + map[string]uint32{ + "a": 1, + "b": 2, + "c": 3, + }, + }, + } + + for _, data := range testData { + cm := NewConnectionMirrors() + for a := range data.value { + cm.Add(a, data.value[a]) + } + assert.Equal(t, data.expectNum, len(cm.value)) + for a := range data.value { + v, ok := cm.Get(a) + assert.True(t, ok) + m := cm.value[a].(uint32) + assert.Equal(t, v, m) + } + } +} + +func TestConnMirrorsRemove(t *testing.T) { + cm := NewConnectionMirrors() + cm.Add("a", 1) + cm.Remove("a") + assert.Equal(t, 0, len(cm.value)) + + cm.Add("a", 1) + cm.Add("b", 2) + cm.Remove("a") + assert.Equal(t, 1, len(cm.value)) + _, ok := cm.Get("a") + assert.False(t, ok) + _, ok = cm.Get("b") + assert.True(t, ok) +} + +func TestNewOutgoingConnections(t *testing.T) { + oc := NewOutgoingConnections(3) + assert.NotNil(t, oc) + assert.NotNil(t, oc.value) + assert.Equal(t, 0, len(oc.value)) +} + +func TestOutgoingConnAdd(t *testing.T) { + oc := NewOutgoingConnections(3) + oc.Add("a") + assert.Equal(t, 1, len(oc.value)) + oc.Add("b") + assert.Equal(t, 2, len(oc.value)) +} + +func TestOutgoingConnGet(t *testing.T) { + oc := NewOutgoingConnections(3) + oc.Add("a") + oc.Add("b") + assert.True(t, oc.Get("a")) + assert.True(t, oc.Get("b")) + assert.False(t, oc.Get("c")) +} + +func TestOutgoingConnLen(t *testing.T) { + oc := NewOutgoingConnections(3) + oc.Add("a") + oc.Add("b") + assert.Equal(t, oc.Len(), 2) +} + +func TestNewPendingConns(t *testing.T) { + pc := NewPendingConnections(3) + assert.NotNil(t, pc) + assert.NotNil(t, pc.value) + assert.Equal(t, 0, len(pc.value)) +} + +func TestPendingConnAdd(t *testing.T) { + pc := NewPendingConnections(3) + pc.Add("a", pex.Peer{Addr: "a"}) + pc.Add("b", pex.Peer{Addr: "b"}) + assert.Equal(t, 2, len(pc.value)) + a := pc.value["a"].(pex.Peer) + b := pc.value["b"].(pex.Peer) + + assert.Equal(t, pex.Peer{Addr: "a"}, a) + assert.Equal(t, pex.Peer{Addr: "b"}, b) +} + +func TestPendingConnGet(t *testing.T) { + pc := NewPendingConnections(3) + pc.Add("a", pex.Peer{Addr: "a"}) + pc.Add("b", pex.Peer{Addr: "b"}) + v, ok := pc.Get("a") + assert.True(t, ok) + assert.Equal(t, "a", v.Addr) + + v, ok = pc.Get("b") + assert.True(t, ok) + assert.Equal(t, "b", v.Addr) + +} + +func TestPendingConnRemove(t *testing.T) { + pc := NewPendingConnections(3) + pc.Add("a", pex.Peer{Addr: "a"}) + pc.Add("b", pex.Peer{Addr: "b"}) + assert.Equal(t, 2, len(pc.value)) + pc.Remove("a") + assert.Equal(t, 1, len(pc.value)) + _, ok := pc.Get("a") + assert.False(t, ok) + _, ok = pc.Get("b") + assert.True(t, ok) +} + +func TestPendingConnLen(t *testing.T) { + pc := NewPendingConnections(3) + pc.Add("a", pex.Peer{Addr: "a"}) + pc.Add("b", pex.Peer{Addr: "b"}) + assert.Equal(t, 2, pc.Len()) +} + +func TestNewMirrorConnections(t *testing.T) { + mc := NewMirrorConnections() + assert.NotNil(t, mc) + assert.NotNil(t, mc.value) + assert.Equal(t, 0, len(mc.value)) +} + +func TestMirrorConnAdd(t *testing.T) { + mc := NewMirrorConnections() + mc.Add(1, "a", 1) + mc.Add(1, "b", 1) + assert.Equal(t, 1, len(mc.value)) + assert.Equal(t, 2, len(mc.value[uint32(1)].(map[string]uint16))) +} + +func TestMirrorConnGet(t *testing.T) { + mc := NewMirrorConnections() + mc.Add(1, "a", 1) + mc.Add(1, "b", 2) + p, ok := mc.Get(1, "a") + assert.True(t, ok) + assert.Equal(t, uint16(1), p) + p, ok = mc.Get(1, "b") + assert.True(t, ok) + assert.Equal(t, uint16(2), p) + p, ok = mc.Get(1, "c") + assert.False(t, ok) + p, ok = mc.Get(uint32(2), "a") + assert.False(t, ok) +} + +func TestMirrorConnRemove(t *testing.T) { + mc := NewMirrorConnections() + mc.Add(1, "a", 1) + mc.Add(1, "b", 2) + mc.Add(2, "c", 1) + mc.Remove(1, "a") + _, ok := mc.value[uint32(1)].(map[string]uint16)["a"] + assert.False(t, ok) + p, ok := mc.value[uint32(1)].(map[string]uint16)["b"] + assert.True(t, ok) + assert.Equal(t, uint16(2), p) +} + +func TestNewIPCount(t *testing.T) { + ic := NewIPCount() + assert.NotNil(t, ic) + assert.NotNil(t, ic.value) +} + +func TestIPCountIncrease(t *testing.T) { + ic := NewIPCount() + ic.Increase("a") + assert.Equal(t, 1, ic.value["a"].(int)) + ic.Increase("a") + assert.Equal(t, 2, ic.value["a"].(int)) +} + +func TestIPCountDecrease(t *testing.T) { + ic := NewIPCount() + ic.Increase("a") + assert.Equal(t, 1, ic.value["a"].(int)) + ic.Increase("a") + assert.Equal(t, 2, ic.value["a"].(int)) + ic.Increase("b") + assert.Equal(t, 1, ic.value["b"].(int)) + assert.Equal(t, 2, len(ic.value)) + + ic.Decrease("a") + assert.Equal(t, 1, ic.value["a"].(int)) + assert.Equal(t, 2, len(ic.value)) + assert.Equal(t, 1, ic.value["b"].(int)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go b/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go new file mode 100755 index 0000000..1df88ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/daemon/strand/strand.go @@ -0,0 +1,123 @@ +package strand + +import ( + "time" + + "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + // logDurationThreshold is how long to wait before reporting a function call's time + logDurationThreshold = time.Millisecond * 100 + // writeWait is how long to wait to write to a request channel before logging the delay + logQueueRequestWaitThreshold = time.Second * 1 +) + +var ( + // Debug enables debug logging + Debug = false +) + +// Request is sent to the channel provided to Strand +type Request struct { + Name string + Func func() error +} + +// Strand linearizes concurrent method calls through a single channel, +// to avoid concurrency issues when conflicting methods are called from +// multiple goroutines. +// Methods passed to Strand() will block until completed. +// Strand accepts a quit channel and will return quitErr if the quit +// channel closes. +func Strand(logger *logging.Logger, c chan Request, name string, f func() error, quit chan struct{}, quitErr error) error { + if Debug { + logger.Debugf("Strand precall %s", name) + } + + done := make(chan struct{}) + var err error + + req := Request{ + Name: name, + Func: func() error { + defer close(done) + + // TODO: record time statistics in a data structure and expose stats via an API + // logger.Debugf("%s begin", name) + + t := time.Now() + + // Log function duration at an exponential time interval, + // this will notify us of any long running functions to look at. + go func() { + threshold := logDurationThreshold + t := time.NewTimer(threshold) + defer t.Stop() + + for { + t0 := time.Now() + select { + case <-quit: + return + case <-done: + return + case <-t.C: + logger.Warningf("%s is taking longer than %s", name, threshold) + threshold *= 10 + t.Reset(threshold) + } + t1 := time.Now() + logger.Infof("ELAPSED: %s", t1.Sub(t0)) + } + }() + + if Debug { + logger.Debugf("Stranding %s", name) + } + + err = f() + + // Log the error here so that the Request channel consumer doesn't need to + if err != nil { + logger.Errorf("%s error: %v", name, err) + } + + // Notify us if the function call took too long + elapsed := time.Now().Sub(t) + if elapsed > logDurationThreshold { + logger.Warningf("%s took %s", name, elapsed) + } else { + //logger.Debugf("%s took %s", name, elapsed) + } + + return err + }, + } + + // Log a message if waiting too long to write due to a full queue + t := time.Now() +loop: + for { + select { + case <-quit: + return quitErr + case c <- req: + break loop + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while trying to write %s to the strand request channel", time.Now().Sub(t), req.Name) + } + } + + t = time.Now() + for { + select { + case <-quit: + return quitErr + case <-done: + return err + case <-time.After(logQueueRequestWaitThreshold): + logger.Warningf("Waited %s while waiting for %s to be done or quit", time.Now().Sub(t), req.Name) + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/.angular-cli.json b/vendor/github.com/skycoin/skycoin/src/gui/static/.angular-cli.json new file mode 100755 index 0000000..8fcfda2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/.angular-cli.json @@ -0,0 +1,65 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "desktopwallet" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets", + "favicon.ico", + "app/current-skycoin.json" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "../node_modules/font-awesome/css/font-awesome.css", + "assets/fonts/material-icons/material-icons.css", + "styles.scss" + ], + "scripts": [ + "assets/scripts/qrcode.min.js" + ], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "sass", + "component": {} + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/.editorconfig b/vendor/github.com/skycoin/skycoin/src/gui/static/.editorconfig new file mode 100755 index 0000000..6e87a00 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/.gitignore b/vendor/github.com/skycoin/skycoin/src/gui/static/.gitignore new file mode 100755 index 0000000..30c55b6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/.gitignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/README.md b/vendor/github.com/skycoin/skycoin/src/gui/static/README.md new file mode 100755 index 0000000..a1e8808 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/README.md @@ -0,0 +1,53 @@ +# Skycoin desktop client + +The Skycoin wallet ships with a web interface which can be ran from the browser and/or Electron. + +The project contains both the source (src) and target (dist) files of this web interface. + +## Prerequisites + +The Skycoin web interface requires Node 8.10.0 or higher, together with NPM 5.6 or higher. + +## Installation + +This project is generated using Angular CLI, therefore it is adviced to first run `npm install -g @angular/cli`. + +Dependencies are managed with NPM 5, to install these run `npm install`. + +You will only have to run this again, if any dependencies have been changed in the `package-lock.json` file. + +## Compiling new target files + +After pulling the latest code, you might first have to update your dependencies, in case someone else has updated them. +You should always do this when compiling new production files: + +``` +rm -rf node_modules +npm install +``` + +This will remove the current dependencies, and install them from the `package-lock.json`. + +To compile new target files, you will have to run: `npm run build`. + +## Development server + +Run `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +Please note that you will most likely receive CORS errors as there's a difference between the port number of the source and destination. + +As a work-around, the development server will create a proxy from `http://localhost:4200/api` to `http://127.0.0.1:6420/`. + +You can route all calls to this address by changing the url property on the ApiService class. + +## Purchase API (teller) + +Please note that at the moment the Purchase API (teller) is both offline and not supporting CORS headers. + +While event.skycoin.net is not working, we will have to run the purchase API locally. + +Similar as the solution for the above CORS issue, you can circumvent CORS issues by changing the url property to '/teller/' + +## Style guide + +As an Angular application, we try to follow the [Angular style guide](https://angular.io/guide/styleguide). diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.e4deea36eb603a33569a.chunk.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.e4deea36eb603a33569a.chunk.js new file mode 100755 index 0000000..1c2e2c3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/0.e4deea36eb603a33569a.chunk.js @@ -0,0 +1 @@ +webpackJsonp([0],{TKku:function(e,t){e.exports={common:{"coin-id":"SKY","coin-hours":"Coin Hours",loading:"Loading...",new:"New",load:"Load"},errors:{"fetch-version":"Unable to fetch latest release version from Github","incorrect-password":"Incorrect password","api-disabled":"API disabled","no-wallet":"Wallet does not exist","no-outputs":"No unspent outputs"},title:{wallets:"Wallets",send:"Send",history:"History","buy-coin":"Buy Skycoin",network:"Networking",blockchain:"Blockchain",outputs:"Outputs",transactions:"Transactions","pending-txs":"Pending Transactions",backup:"Backup Wallet",explorer:"Skycoin Explorer",seed:"Wallet Seed",qrcode:"QR Code"},header:{"syncing-blocks":"Syncing blocks",update1:"Wallet update",update2:"available.","pending-txs1":"There are some","pending-txs2":"pending transactions.","pending-txs3":"Data you see may not be updated.",errors:{"no-connections":"No connections active, your client is not connected to any other nodes!","no-backend1":"Cannot reach backend. Please restart the app and/or seek help on our","no-backend2":"Telegram.","no-backend3":"",csrf:"Security vulnerability: CSRF is not working, please exit immediately."}},password:{title:"Enter Password",label:"Password","confirm-label":"Confirm password",button:"Proceed"},buy:{"deposit-address":"Choose an address to generate a BTC deposit link for:","select-address":"Select address",generate:"Generate","deposit-location":"Deposit Location","deposit-location-desc":"Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.","make-choice":"Make a choice","wallets-desc":"Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.",send:"Send Bitcoin","send-desc":"Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.","fraction-warning":"Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!",receive:"Receive Sky","receive-desc":"After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.","status-button":"Status:","check-status-button":"Check Status","new-order-button":"New Order"},wizard:{"wallet-desc":'If you don\'t have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to "Load Wallet" and enter your seed.',"encrypt-desc":"Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.","finish-button":"Finish","back-button":"Back",confirm:{title:"Safeguard your seed!",desc:"We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!",checkbox:"It\u2019s safe, I swear.",button:"Continue"}},wallet:{"new-address":"New Address","show-empty":"Show Empty","hide-empty":"Hide Empty",encrypt:"Encrypt Wallet",decrypt:"Decrypt Wallet",edit:"Edit Wallet",add:"Add Wallet",load:"Load Wallet","encryption-enabled":"Encryption enabled","encryption-disabled":"Encryption disabled",wallet:"Wallet",new:{"create-title":"Create Wallet","load-title":"Load Wallet","encrypt-title":"Encrypt Wallet","name-label":"Name","seed-label":"Seed","confirm-seed-label":"Confirm seed","seed-warning":"Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!","create-button":"Create","load-button":"Load","cancel-button":"Cancel","12-words":"12 words","24-words":"24 words","generate-12-seed":"Generate 12 word seed","generate-24-seed":"Generate 24 word seed",encrypt:"Encrypt wallet","encrypt-warning":"We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet."},rename:{title:"Rename Wallet","name-label":"Name","cancel-button":"Cancel","rename-button":"Rename"},address:{copy:"Copy","copy-address":"Copy address",copied:"Copied!",outputs:"Unspent Outputs"}},send:{"from-label":"Send from","to-label":"Send to","amount-label":"Amount","notes-label":"Notes","wallet-label":"Wallet","addresses-label":"Addresses","addresses-help":"Wallet addresses to send from","change-address-label":"Custom change address","change-address-help":"Address to receive change. If it's not provided, it will be chosen automatically","destinations-label":"Destinations","destinations-help1":"Destination addresses and their coins","destinations-help2":"Destination addresses, their coins and coin hours","hours-allocation-label":"Automatic coin hours allocation","options-label":"Options","value-label":"Coin hours share factor","value-help":"The higher the value, the more coin hours will be sent to outputs","preview-button":"Preview","send-button":"Send","back-button":"Back",simple:"Simple",advanced:"Advanced"},tx:{transaction:"Transaction","confirm-transaction":"Confirm Transaction",from:"From",to:"To",date:"Date",status:"Status",coins:"Coins",hours:"Hours",id:"Tx ID","show-more":"Show more","hours-sent":"sent","hours-burned":"burned",inputs:"Inputs",outputs:"Outputs",confirmed:"Confirmed",pending:"Pending","current-rate":"Calculated at the current rate"},backup:{"wallet-directory":"Wallet Directory:","seed-warning":"BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.",desc:"Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.","close-button":"Close",wallet:"Wallet Label",filename:"Filename",seed:"Seed","show-seed":"Show seed","no-wallets":"No encrypted wallets"},blockchain:{blocks:"Number of blocks",time:"Timestamp of last block",hash:"Hash of last block","current-supply":"Current SKY supply","total-supply":"Total SKY supply","current-coinhour-supply":"Current Coin Hours supply","total-coinhour-supply":"Total Coin Hours supply"},network:{peer:"Peer",source:"Source","block-height":"Block height","last-seen":"Last seen","last-received":"Last received","last-sent":"Last sent",in:"Incoming",out:"Outgoing",sources:{default:"Default peer",exchange:"Peer exchange"}},"pending-txs":{timestamp:"Timestamp",txid:"Transaction ID",none:"No pending transactions",my:"Mine",all:"All"},history:{"tx-detail":"Transaction Detail",sending:"Sending",sent:"Sent",received:"Received",receiving:"Receiving",pending:"Pending","no-txs":"You have no transaction history"},teller:{done:"Completed","waiting-confirm":"Waiting for confirmation","waiting-deposit":"Waiting for Bitcoin deposit","waiting-send":"Waiting to send Skycoin",unknown:"Unknown"}}}}); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt new file mode 100755 index 0000000..785f597 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/3rdpartylicenses.txt @@ -0,0 +1,273 @@ +moment@2.21.0 +MIT +Copyright (c) JS Foundation and other contributors + +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. + +cache-loader@1.2.2 +MIT +Copyright JS Foundation and other contributors + +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. + +@angular-devkit/build-optimizer@0.3.2 +MIT +The MIT License + +Copyright (c) 2017 Google, 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. + +webpack@3.11.0 +MIT +Copyright JS Foundation and other contributors + +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. + +@angular/core@5.2.0 +MIT +MIT + +@ngx-translate/core@9.1.1 +MIT +MIT + +hammerjs@2.0.8 +MIT +The MIT License (MIT) + +Copyright (C) 2011-2014 by Jorik Tangelder (Eight Media) + +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. + +@angular/common@5.2.0 +MIT +MIT + +@angular/platform-browser@5.2.0 +MIT +MIT + +@angular/http@5.2.0 +MIT +MIT + +@angular/cdk@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +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. + +@angular/material@5.0.4 +MIT +The MIT License + +Copyright (c) 2017 Google LLC. + +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. + +@angular/animations@5.2.0 +MIT +MIT + +@angular/forms@5.2.0 +MIT +MIT + +@angular/router@5.2.0 +MIT +MIT + +@angular/platform-browser-dynamic@5.2.0 +MIT +MIT + +core-js@2.5.3 +MIT +Copyright (c) 2014-2017 Denis Pushkarev + +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. + +zone.js@0.8.20 +MIT +The MIT License + +Copyright (c) 2016 Google, 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. + +bootstrap@4.0.0-beta.3 +MIT +The MIT License (MIT) + +Copyright (c) 2011-2017 Twitter, Inc. +Copyright (c) 2011-2017 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff new file mode 100755 index 0000000..b648a3e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.012cf6a10129e2275d79.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 new file mode 100755 index 0000000..9fa2112 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.570eb83859dc23dd0eec.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf new file mode 100755 index 0000000..7015564 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot new file mode 100755 index 0000000..70508eb Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/MaterialIcons-Regular.e79bfd88537def476913.eot differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff new file mode 100755 index 0000000..780de6d Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.42363955889f2f20c527.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 new file mode 100755 index 0000000..72a32ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff new file mode 100755 index 0000000..20ec4ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.923dce74069362d168fe.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 new file mode 100755 index 0000000..642a2d4 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-BoldItalic.c414dad20c4e3020221c.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff new file mode 100755 index 0000000..a994609 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.4be01e4a68be8bf590da.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 new file mode 100755 index 0000000..b3238fa Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Light.770b27ec05c2f97a1a27.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff new file mode 100755 index 0000000..7cc63b7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 new file mode 100755 index 0000000..3f438f8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 new file mode 100755 index 0000000..46f89cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.21b4caaaedc00594e7bd.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff new file mode 100755 index 0000000..40c056e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-Regular.98d953e74f174cf013b4.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff new file mode 100755 index 0000000..ddc9c01 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9947360f79b09132fd21.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 new file mode 100755 index 0000000..08d7a51 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100755 index 0000000..70508eb Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100755 index 0000000..d9f1d25 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100755 index 0000000..a449327 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100755 index 0000000..7015564 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100755 index 0000000..b648a3e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100755 index 0000000..9fa2112 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css new file mode 100755 index 0000000..2270c09 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100755 index 0000000..780de6d Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100755 index 0000000..72a32ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100755 index 0000000..20ec4ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100755 index 0000000..642a2d4 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100755 index 0000000..a994609 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100755 index 0000000..b3238fa Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100755 index 0000000..7cc63b7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100755 index 0000000..3f438f8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100755 index 0000000..40c056e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100755 index 0000000..46f89cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100755 index 0000000..ddc9c01 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100755 index 0000000..08d7a51 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/src/gui/static/dist/header.e11f7c6852766b9319d6.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/header.png similarity index 100% rename from src/gui/static/dist/header.e11f7c6852766b9319d6.png rename to vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/header.png diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json new file mode 100755 index 0000000..74849ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/i18n/en.json @@ -0,0 +1,244 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs" + }, + + "title": { + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "wallet": "Wallet", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "address": { + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "outputs": "Unspent Outputs" + } + }, + + "send": { + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "addresses-help": "Wallet addresses to send from", + "change-address-label": "Custom change address", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-sent": "sent", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png new file mode 100755 index 0000000..d040458 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png new file mode 100755 index 0000000..2f0ec3b Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/close-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-blue.png new file mode 100755 index 0000000..de88a9a Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-blue.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png new file mode 100755 index 0000000..a5cf11e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/edit-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png new file mode 100755 index 0000000..d73c273 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/header.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png new file mode 100755 index 0000000..4d1cbf7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/load-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-gold.png new file mode 100755 index 0000000..fc53863 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png new file mode 100755 index 0000000..3f835e7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/lock-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/logo-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/logo-white.png new file mode 100755 index 0000000..8b714cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/logo-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-grey.png new file mode 100755 index 0000000..b81e568 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png new file mode 100755 index 0000000..6686a98 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/minus-red.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/money-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/money-gold.png new file mode 100755 index 0000000..649fc3b Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/money-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/otc-background.jpg b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/otc-background.jpg new file mode 100755 index 0000000..03a8401 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png new file mode 100755 index 0000000..854692e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png new file mode 100755 index 0000000..ab02079 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-green.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-grey.png new file mode 100755 index 0000000..35dbfff Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/plus-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/qr-code-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/qr-code-black.png new file mode 100755 index 0000000..f9a2fab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png new file mode 100755 index 0000000..9f27742 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png new file mode 100755 index 0000000..4226468 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-blue.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png new file mode 100755 index 0000000..59645e7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-white.png new file mode 100755 index 0000000..16261a2 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/send-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png new file mode 100755 index 0000000..413f223 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/transactions-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-gold.png new file mode 100755 index 0000000..3ecf4ae Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-grey.png new file mode 100755 index 0000000..61a3177 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png new file mode 100755 index 0000000..cdb2ec8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/img/wallet-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/logo-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/logo-white.png new file mode 100755 index 0000000..cd615cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/logo-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js new file mode 100755 index 0000000..993e88f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/favicon.ico b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/favicon.ico new file mode 100755 index 0000000..cc325fd Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/favicon.ico differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot new file mode 100755 index 0000000..e9f60ca Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.674f50d287a8c48dc19b.eot differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg new file mode 100755 index 0000000..855c845 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.912ec66d7572ff821749.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 new file mode 100755 index 0000000..4d13fc6 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.af7ae505a9eed503f8b8.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf new file mode 100755 index 0000000..35acda2 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.b06871f281fee6b241d6.ttf differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff new file mode 100755 index 0000000..400014a Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/fontawesome-webfont.fee66e712a8a08eef580.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png new file mode 100755 index 0000000..d73c273 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.03fb33b04c982a1a804d.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png new file mode 100755 index 0000000..be1002a Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/header.e11f7c6852766b9319d6.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/index.html b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/index.html new file mode 100755 index 0000000..f8a2174 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/index.html @@ -0,0 +1 @@ +Skycoin \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.8a33a93a4aa42df0b418.bundle.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.8a33a93a4aa42df0b418.bundle.js new file mode 100755 index 0000000..164e83d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/inline.8a33a93a4aa42df0b418.bundle.js @@ -0,0 +1 @@ +!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var u,i,f,l=0,s=[];l12?t:t+12:"sanje"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"rati":t<12?"sokalli":t<16?"donparam":t<20?"sanje":"rati"}})}(n("PJh5"))},"+3/4":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e){t.call(this),this.scheduler=e}return Object(r.__extends)(e,t),e.create=function(t){return new e(t)},e.dispatch=function(t){t.subscriber.complete()},e.prototype._subscribe=function(t){var n=this.scheduler;if(n)return n.schedule(e.dispatch,0,{subscriber:t});t.complete()},e}(n("YaPU").a)},"+7/x":function(t,e,n){!function(t){"use strict";var e={1:"\u0be7",2:"\u0be8",3:"\u0be9",4:"\u0bea",5:"\u0beb",6:"\u0bec",7:"\u0bed",8:"\u0bee",9:"\u0bef",0:"\u0be6"},n={"\u0be7":"1","\u0be8":"2","\u0be9":"3","\u0bea":"4","\u0beb":"5","\u0bec":"6","\u0bed":"7","\u0bee":"8","\u0bef":"9","\u0be6":"0"};t.defineLocale("ta",{months:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),monthsShort:"\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf_\u0baa\u0bbf\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf_\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd_\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd_\u0bae\u0bc7_\u0b9c\u0bc2\u0ba9\u0bcd_\u0b9c\u0bc2\u0bb2\u0bc8_\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd_\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bc6\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b85\u0b95\u0bcd\u0b9f\u0bc7\u0bbe\u0baa\u0bb0\u0bcd_\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd_\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcd".split("_"),weekdays:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0b9f\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8_\u0b9a\u0ba9\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb4\u0bae\u0bc8".split("_"),weekdaysShort:"\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1_\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd_\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd_\u0baa\u0bc1\u0ba4\u0ba9\u0bcd_\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd_\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf_\u0b9a\u0ba9\u0bbf".split("_"),weekdaysMin:"\u0b9e\u0bbe_\u0ba4\u0bbf_\u0b9a\u0bc6_\u0baa\u0bc1_\u0bb5\u0bbf_\u0bb5\u0bc6_\u0b9a".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, HH:mm",LLLL:"dddd, D MMMM YYYY, HH:mm"},calendar:{sameDay:"[\u0b87\u0ba9\u0bcd\u0bb1\u0bc1] LT",nextDay:"[\u0ba8\u0bbe\u0bb3\u0bc8] LT",nextWeek:"dddd, LT",lastDay:"[\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1] LT",lastWeek:"[\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0bb5\u0bbe\u0bb0\u0bae\u0bcd] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0b87\u0bb2\u0bcd",past:"%s \u0bae\u0bc1\u0ba9\u0bcd",s:"\u0b92\u0bb0\u0bc1 \u0b9a\u0bbf\u0bb2 \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",ss:"%d \u0bb5\u0bbf\u0ba8\u0bbe\u0b9f\u0bbf\u0b95\u0bb3\u0bcd",m:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0bae\u0bcd",mm:"%d \u0ba8\u0bbf\u0bae\u0bbf\u0b9f\u0b99\u0bcd\u0b95\u0bb3\u0bcd",h:"\u0b92\u0bb0\u0bc1 \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",hh:"%d \u0bae\u0ba3\u0bbf \u0ba8\u0bc7\u0bb0\u0bae\u0bcd",d:"\u0b92\u0bb0\u0bc1 \u0ba8\u0bbe\u0bb3\u0bcd",dd:"%d \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",M:"\u0b92\u0bb0\u0bc1 \u0bae\u0bbe\u0ba4\u0bae\u0bcd",MM:"%d \u0bae\u0bbe\u0ba4\u0b99\u0bcd\u0b95\u0bb3\u0bcd",y:"\u0b92\u0bb0\u0bc1 \u0bb5\u0bb0\u0bc1\u0b9f\u0bae\u0bcd",yy:"%d \u0b86\u0ba3\u0bcd\u0b9f\u0bc1\u0b95\u0bb3\u0bcd"},dayOfMonthOrdinalParse:/\d{1,2}\u0bb5\u0ba4\u0bc1/,ordinal:function(t){return t+"\u0bb5\u0ba4\u0bc1"},preparse:function(t){return t.replace(/[\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0be6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0baf\u0bbe\u0bae\u0bae\u0bcd|\u0bb5\u0bc8\u0b95\u0bb1\u0bc8|\u0b95\u0bbe\u0bb2\u0bc8|\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd|\u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1|\u0bae\u0bbe\u0bb2\u0bc8/,meridiem:function(t,e,n){return t<2?" \u0baf\u0bbe\u0bae\u0bae\u0bcd":t<6?" \u0bb5\u0bc8\u0b95\u0bb1\u0bc8":t<10?" \u0b95\u0bbe\u0bb2\u0bc8":t<14?" \u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd":t<18?" \u0b8e\u0bb1\u0bcd\u0baa\u0bbe\u0b9f\u0bc1":t<22?" \u0bae\u0bbe\u0bb2\u0bc8":" \u0baf\u0bbe\u0bae\u0bae\u0bcd"},meridiemHour:function(t,e){return 12===t&&(t=0),"\u0baf\u0bbe\u0bae\u0bae\u0bcd"===e?t<2?t:t+12:"\u0bb5\u0bc8\u0b95\u0bb1\u0bc8"===e||"\u0b95\u0bbe\u0bb2\u0bc8"===e?t:"\u0ba8\u0ba3\u0bcd\u0baa\u0b95\u0bb2\u0bcd"===e&&t>=10?t:t+12},week:{dow:0,doy:6}})}(n("PJh5"))},"+CnV":function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e,r=n("AMGY").a.Symbol;return"function"==typeof r?r.observable?e=r.observable:(e=r("observable"),r.observable=e):e="@@observable",e}()},"/4Bh":function(t,e,n){"use strict";var r=n("TToO"),i=n("OVmG");function o(t,e){var n=!1;return arguments.length>=2&&(n=!0),function(r){return r.lift(new s(t,e,n))}}var s=function(){function t(t,e,n){void 0===n&&(n=!1),this.accumulator=t,this.seed=e,this.hasSeed=n}return t.prototype.call=function(t,e){return e.subscribe(new l(t,this.accumulator,this.seed,this.hasSeed))},t}(),l=function(t){function e(e,n,r,i){t.call(this,e),this.accumulator=n,this._seed=r,this.hasSeed=i,this.index=0}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"seed",{get:function(){return this._seed},set:function(t){this.hasSeed=!0,this._seed=t},enumerable:!0,configurable:!0}),e.prototype._next=function(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)},e.prototype._tryNext=function(t){var e,n=this.index++;try{e=this.accumulator(this.seed,t,n)}catch(t){this.destination.error(t)}this.seed=e,this.destination.next(e)},e}(i.a),a=n("pU/0"),u=n("+3/4");function c(t){return function(e){return 0===t?new u.a:e.lift(new d(t))}}var d=function(){function t(t){if(this.total=t,this.total<0)throw new a.a}return t.prototype.call=function(t,e){return e.subscribe(new h(t,this.total))},t}(),h=function(t){function e(e,n){t.call(this,e),this.total=n,this.ring=new Array,this.count=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e=this.ring,n=this.total,r=this.count++;e.length0)for(var n=this.count>=this.total?this.total:this.count,r=this.ring,i=0;i=2?function(n){return Object(_.a)(o(t,e),c(1),(void 0===(r=e)&&(r=null),function(t){return t.lift(new p(r))}))(n);var r}:function(e){return Object(_.a)(o(function(e,n,r){return t(e,n,r+1)}),c(1))(e)}}},"/6P1":function(t,e,n){!function(t){"use strict";var e={ss:"sekund\u0117_sekund\u017ei\u0173_sekundes",m:"minut\u0117_minut\u0117s_minut\u0119",mm:"minut\u0117s_minu\u010di\u0173_minutes",h:"valanda_valandos_valand\u0105",hh:"valandos_valand\u0173_valandas",d:"diena_dienos_dien\u0105",dd:"dienos_dien\u0173_dienas",M:"m\u0117nuo_m\u0117nesio_m\u0117nes\u012f",MM:"m\u0117nesiai_m\u0117nesi\u0173_m\u0117nesius",y:"metai_met\u0173_metus",yy:"metai_met\u0173_metus"};function n(t,e,n,r){return e?i(n)[0]:r?i(n)[1]:i(n)[2]}function r(t){return t%10==0||t>10&&t<20}function i(t){return e[t].split("_")}function o(t,e,o,s){var l=t+" ";return 1===t?l+n(0,e,o[0],s):e?l+(r(t)?i(o)[1]:i(o)[0]):s?l+i(o)[1]:l+(r(t)?i(o)[1]:i(o)[2])}t.defineLocale("lt",{months:{format:"sausio_vasario_kovo_baland\u017eio_gegu\u017e\u0117s_bir\u017eelio_liepos_rugpj\u016b\u010dio_rugs\u0117jo_spalio_lapkri\u010dio_gruod\u017eio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegu\u017e\u0117_bir\u017eelis_liepa_rugpj\u016btis_rugs\u0117jis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadien\u012f_pirmadien\u012f_antradien\u012f_tre\u010diadien\u012f_ketvirtadien\u012f_penktadien\u012f_\u0161e\u0161tadien\u012f".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_tre\u010diadienis_ketvirtadienis_penktadienis_\u0161e\u0161tadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_\u0160e\u0161".split("_"),weekdaysMin:"S_P_A_T_K_Pn_\u0160".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[\u0160iandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Pra\u0117jus\u012f] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prie\u0161 %s",s:function(t,e,n,r){return e?"kelios sekund\u0117s":r?"keli\u0173 sekund\u017ei\u0173":"kelias sekundes"},ss:o,m:n,mm:o,h:n,hh:o,d:n,dd:o,M:n,MM:o,y:n,yy:o},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(t){return t+"-oji"},week:{dow:1,doy:4}})}(n("PJh5"))},"/bsm":function(t,e,n){!function(t){"use strict";t.defineLocale("uz-latn",{months:"Yanvar_Fevral_Mart_Aprel_May_Iyun_Iyul_Avgust_Sentabr_Oktabr_Noyabr_Dekabr".split("_"),monthsShort:"Yan_Fev_Mar_Apr_May_Iyun_Iyul_Avg_Sen_Okt_Noy_Dek".split("_"),weekdays:"Yakshanba_Dushanba_Seshanba_Chorshanba_Payshanba_Juma_Shanba".split("_"),weekdaysShort:"Yak_Dush_Sesh_Chor_Pay_Jum_Shan".split("_"),weekdaysMin:"Ya_Du_Se_Cho_Pa_Ju_Sha".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"D MMMM YYYY, dddd HH:mm"},calendar:{sameDay:"[Bugun soat] LT [da]",nextDay:"[Ertaga] LT [da]",nextWeek:"dddd [kuni soat] LT [da]",lastDay:"[Kecha soat] LT [da]",lastWeek:"[O'tgan] dddd [kuni soat] LT [da]",sameElse:"L"},relativeTime:{future:"Yaqin %s ichida",past:"Bir necha %s oldin",s:"soniya",ss:"%d soniya",m:"bir daqiqa",mm:"%d daqiqa",h:"bir soat",hh:"%d soat",d:"bir kun",dd:"%d kun",M:"bir oy",MM:"%d oy",y:"bir yil",yy:"%d yil"},week:{dow:1,doy:7}})}(n("PJh5"))},"/iUD":function(t,e,n){"use strict";e.a=function(t){return"function"==typeof t}},"/mhn":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("ne",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f\u0932_\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0937\u094d\u091f_\u0938\u0947\u092a\u094d\u091f\u0947\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u092d\u0947\u092e\u094d\u092c\u0930_\u0921\u093f\u0938\u0947\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u093f._\u092e\u0908_\u091c\u0941\u0928_\u091c\u0941\u0932\u093e\u0908._\u0905\u0917._\u0938\u0947\u092a\u094d\u091f._\u0905\u0915\u094d\u091f\u094b._\u0928\u094b\u092d\u0947._\u0921\u093f\u0938\u0947.".split("_"),monthsParseExact:!0,weekdays:"\u0906\u0907\u0924\u092c\u093e\u0930_\u0938\u094b\u092e\u092c\u093e\u0930_\u092e\u0919\u094d\u0917\u0932\u092c\u093e\u0930_\u092c\u0941\u0927\u092c\u093e\u0930_\u092c\u093f\u0939\u093f\u092c\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u092c\u093e\u0930_\u0936\u0928\u093f\u092c\u093e\u0930".split("_"),weekdaysShort:"\u0906\u0907\u0924._\u0938\u094b\u092e._\u092e\u0919\u094d\u0917\u0932._\u092c\u0941\u0927._\u092c\u093f\u0939\u093f._\u0936\u0941\u0915\u094d\u0930._\u0936\u0928\u093f.".split("_"),weekdaysMin:"\u0906._\u0938\u094b._\u092e\u0902._\u092c\u0941._\u092c\u093f._\u0936\u0941._\u0936.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"A\u0915\u094b h:mm \u092c\u091c\u0947",LTS:"A\u0915\u094b h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A\u0915\u094b h:mm \u092c\u091c\u0947"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u093f|\u092c\u093f\u0939\u093e\u0928|\u0926\u093f\u0909\u0901\u0938\u094b|\u0938\u093e\u0901\u091d/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u093f"===e?t<4?t:t+12:"\u092c\u093f\u0939\u093e\u0928"===e?t:"\u0926\u093f\u0909\u0901\u0938\u094b"===e?t>=10?t:t+12:"\u0938\u093e\u0901\u091d"===e?t+12:void 0},meridiem:function(t,e,n){return t<3?"\u0930\u093e\u0924\u093f":t<12?"\u092c\u093f\u0939\u093e\u0928":t<16?"\u0926\u093f\u0909\u0901\u0938\u094b":t<20?"\u0938\u093e\u0901\u091d":"\u0930\u093e\u0924\u093f"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u092d\u094b\u0932\u093f] LT",nextWeek:"[\u0906\u0909\u0901\u0926\u094b] dddd[,] LT",lastDay:"[\u0939\u093f\u091c\u094b] LT",lastWeek:"[\u0917\u090f\u0915\u094b] dddd[,] LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u093e",past:"%s \u0905\u0917\u093e\u0921\u093f",s:"\u0915\u0947\u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0947\u0923\u094d\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u0947\u091f",mm:"%d \u092e\u093f\u0928\u0947\u091f",h:"\u090f\u0915 \u0918\u0923\u094d\u091f\u093e",hh:"%d \u0918\u0923\u094d\u091f\u093e",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u093f\u0928\u093e",MM:"%d \u092e\u0939\u093f\u0928\u093e",y:"\u090f\u0915 \u092c\u0930\u094d\u0937",yy:"%d \u092c\u0930\u094d\u0937"},week:{dow:0,doy:6}})}(n("PJh5"))},"/nXB":function(t,e,n){"use strict";e.a=function(){for(var t=[],e=0;e1&&"number"==typeof t[t.length-1]&&(n=t.pop())):"number"==typeof a&&(n=t.pop()),null===l&&1===t.length&&t[0]instanceof r.a?t[0]:Object(s.a)(n)(new i.a(t,l))};var r=n("YaPU"),i=n("Veqx"),o=n("1Q68"),s=n("8D5t")},0:function(t,e,n){t.exports=n("x35b")},"0X8Q":function(t,e,n){!function(t){"use strict";t.defineLocale("vi",{months:"th\xe1ng 1_th\xe1ng 2_th\xe1ng 3_th\xe1ng 4_th\xe1ng 5_th\xe1ng 6_th\xe1ng 7_th\xe1ng 8_th\xe1ng 9_th\xe1ng 10_th\xe1ng 11_th\xe1ng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"ch\u1ee7 nh\u1eadt_th\u1ee9 hai_th\u1ee9 ba_th\u1ee9 t\u01b0_th\u1ee9 n\u0103m_th\u1ee9 s\xe1u_th\u1ee9 b\u1ea3y".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(t){return/^ch$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"sa":"SA":n?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [n\u0103m] YYYY",LLL:"D MMMM [n\u0103m] YYYY HH:mm",LLLL:"dddd, D MMMM [n\u0103m] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[H\xf4m nay l\xfac] LT",nextDay:"[Ng\xe0y mai l\xfac] LT",nextWeek:"dddd [tu\u1ea7n t\u1edbi l\xfac] LT",lastDay:"[H\xf4m qua l\xfac] LT",lastWeek:"dddd [tu\u1ea7n r\u1ed3i l\xfac] LT",sameElse:"L"},relativeTime:{future:"%s t\u1edbi",past:"%s tr\u01b0\u1edbc",s:"v\xe0i gi\xe2y",ss:"%d gi\xe2y",m:"m\u1ed9t ph\xfat",mm:"%d ph\xfat",h:"m\u1ed9t gi\u1edd",hh:"%d gi\u1edd",d:"m\u1ed9t ng\xe0y",dd:"%d ng\xe0y",M:"m\u1ed9t th\xe1ng",MM:"%d th\xe1ng",y:"m\u1ed9t n\u0103m",yy:"%d n\u0103m"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"1Bqh":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.subject=e,this.subscriber=n,this.closed=!1}return Object(r.__extends)(e,t),e.prototype.unsubscribe=function(){if(!this.closed){this.closed=!0;var t=this.subject,e=t.observers;if(this.subject=null,e&&0!==e.length&&!t.isStopped&&!t.closed){var n=e.indexOf(this.subscriber);-1!==n&&e.splice(n,1)}}},e}(n("VwZZ").a)},"1Q68":function(t,e,n){"use strict";e.a=function(t){return t&&"function"==typeof t.schedule}},"2pmY":function(t,e,n){!function(t){"use strict";var e={1:"\u06f1",2:"\u06f2",3:"\u06f3",4:"\u06f4",5:"\u06f5",6:"\u06f6",7:"\u06f7",8:"\u06f8",9:"\u06f9",0:"\u06f0"},n={"\u06f1":"1","\u06f2":"2","\u06f3":"3","\u06f4":"4","\u06f5":"5","\u06f6":"6","\u06f7":"7","\u06f8":"8","\u06f9":"9","\u06f0":"0"};t.defineLocale("fa",{months:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),monthsShort:"\u0698\u0627\u0646\u0648\u06cc\u0647_\u0641\u0648\u0631\u06cc\u0647_\u0645\u0627\u0631\u0633_\u0622\u0648\u0631\u06cc\u0644_\u0645\u0647_\u0698\u0648\u0626\u0646_\u0698\u0648\u0626\u06cc\u0647_\u0627\u0648\u062a_\u0633\u067e\u062a\u0627\u0645\u0628\u0631_\u0627\u06a9\u062a\u0628\u0631_\u0646\u0648\u0627\u0645\u0628\u0631_\u062f\u0633\u0627\u0645\u0628\u0631".split("_"),weekdays:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysShort:"\u06cc\u06a9\u200c\u0634\u0646\u0628\u0647_\u062f\u0648\u0634\u0646\u0628\u0647_\u0633\u0647\u200c\u0634\u0646\u0628\u0647_\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647_\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647_\u062c\u0645\u0639\u0647_\u0634\u0646\u0628\u0647".split("_"),weekdaysMin:"\u06cc_\u062f_\u0633_\u0686_\u067e_\u062c_\u0634".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631|\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/,isPM:function(t){return/\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631/.test(t)},meridiem:function(t,e,n){return t<12?"\u0642\u0628\u0644 \u0627\u0632 \u0638\u0647\u0631":"\u0628\u0639\u062f \u0627\u0632 \u0638\u0647\u0631"},calendar:{sameDay:"[\u0627\u0645\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",nextDay:"[\u0641\u0631\u062f\u0627 \u0633\u0627\u0639\u062a] LT",nextWeek:"dddd [\u0633\u0627\u0639\u062a] LT",lastDay:"[\u062f\u06cc\u0631\u0648\u0632 \u0633\u0627\u0639\u062a] LT",lastWeek:"dddd [\u067e\u06cc\u0634] [\u0633\u0627\u0639\u062a] LT",sameElse:"L"},relativeTime:{future:"\u062f\u0631 %s",past:"%s \u067e\u06cc\u0634",s:"\u0686\u0646\u062f \u062b\u0627\u0646\u06cc\u0647",ss:"\u062b\u0627\u0646\u06cc\u0647 d%",m:"\u06cc\u06a9 \u062f\u0642\u06cc\u0642\u0647",mm:"%d \u062f\u0642\u06cc\u0642\u0647",h:"\u06cc\u06a9 \u0633\u0627\u0639\u062a",hh:"%d \u0633\u0627\u0639\u062a",d:"\u06cc\u06a9 \u0631\u0648\u0632",dd:"%d \u0631\u0648\u0632",M:"\u06cc\u06a9 \u0645\u0627\u0647",MM:"%d \u0645\u0627\u0647",y:"\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/[\u06f0-\u06f9]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},dayOfMonthOrdinalParse:/\d{1,2}\u0645/,ordinal:"%d\u0645",week:{dow:6,doy:12}})}(n("PJh5"))},"2s1U":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i=t+" ";switch(n){case"s":return e||r?"nekaj sekund":"nekaj sekundami";case"ss":return i+(1===t?e?"sekundo":"sekundi":2===t?e||r?"sekundi":"sekundah":t<5?e||r?"sekunde":"sekundah":"sekund");case"m":return e?"ena minuta":"eno minuto";case"mm":return i+(1===t?e?"minuta":"minuto":2===t?e||r?"minuti":"minutama":t<5?e||r?"minute":"minutami":e||r?"minut":"minutami");case"h":return e?"ena ura":"eno uro";case"hh":return i+(1===t?e?"ura":"uro":2===t?e||r?"uri":"urama":t<5?e||r?"ure":"urami":e||r?"ur":"urami");case"d":return e||r?"en dan":"enim dnem";case"dd":return i+(1===t?e||r?"dan":"dnem":2===t?e||r?"dni":"dnevoma":e||r?"dni":"dnevi");case"M":return e||r?"en mesec":"enim mesecem";case"MM":return i+(1===t?e||r?"mesec":"mesecem":2===t?e||r?"meseca":"mesecema":t<5?e||r?"mesece":"meseci":e||r?"mesecev":"meseci");case"y":return e||r?"eno leto":"enim letom";case"yy":return i+(1===t?e||r?"leto":"letom":2===t?e||r?"leti":"letoma":t<5?e||r?"leta":"leti":e||r?"let":"leti")}}t.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_\u010detrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._\u010det._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_\u010de_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[v\u010deraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prej\u0161njo] [nedeljo] [ob] LT";case 3:return"[prej\u0161njo] [sredo] [ob] LT";case 6:return"[prej\u0161njo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prej\u0161nji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"\u010dez %s",past:"pred %s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},"3CJN":function(t,e,n){!function(t){"use strict";t.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(t){return/^nm$/i.test(t)},meridiem:function(t,e,n){return t<12?n?"vm":"VM":n?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[M\xf4re om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3IRH":function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},"3K28":function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},"3LKG":function(t,e,n){!function(t){"use strict";t.defineLocale("tl-ph",{months:"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),monthsShort:"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),weekdays:"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),weekdaysShort:"Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),weekdaysMin:"Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"MM/D/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY HH:mm",LLLL:"dddd, MMMM DD, YYYY HH:mm"},calendar:{sameDay:"LT [ngayong araw]",nextDay:"[Bukas ng] LT",nextWeek:"LT [sa susunod na] dddd",lastDay:"LT [kahapon]",lastWeek:"LT [noong nakaraang] dddd",sameElse:"L"},relativeTime:{future:"sa loob ng %s",past:"%s ang nakalipas",s:"ilang segundo",ss:"%d segundo",m:"isang minuto",mm:"%d minuto",h:"isang oras",hh:"%d oras",d:"isang araw",dd:"%d araw",M:"isang buwan",MM:"%d buwan",y:"isang taon",yy:"%d taon"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(t){return t},week:{dow:1,doy:4}})}(n("PJh5"))},"3MVc":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"},r=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},i={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},o=function(t){return function(e,n,o,s){var l=r(e),a=i[t][r(e)];return 2===l&&(a=a[n?0:1]),a.replace(/%d/i,e)}},s=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar",{months:s,monthsShort:s,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:o("s"),ss:o("s"),m:o("m"),mm:o("m"),h:o("h"),hh:o("h"),d:o("d"),dd:o("d"),M:o("M"),MM:o("M"),y:o("y"),yy:o("y")},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},"3a3m":function(t,e,n){"use strict";var r=n("TToO"),i=n("g5jc"),o=n("YaPU"),s=n("OVmG"),l=n("VwZZ");function a(){return function(t){return t.lift(new u(t))}}var u=function(){function t(t){this.connectable=t}return t.prototype.call=function(t,e){var n=this.connectable;n._refCount++;var r=new c(t,n),i=e.subscribe(r);return r.closed||(r.connection=n.connect()),i},t}(),c=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.__extends)(e,t),e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._refCount;if(e<=0)this.connection=null;else if(t._refCount=e-1,e>1)this.connection=null;else{var n=this.connection,r=t._connection;this.connection=null,!r||n&&r!==n||r.unsubscribe()}}else this.connection=null},e}(s.a),d=function(t){function e(e,n){t.call(this),this.source=e,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}return Object(r.__extends)(e,t),e.prototype._subscribe=function(t){return this.getSubject().subscribe(t)},e.prototype.getSubject=function(){var t=this._subject;return t&&!t.isStopped||(this._subject=this.subjectFactory()),this._subject},e.prototype.connect=function(){var t=this._connection;return t||(this._isComplete=!1,(t=this._connection=new l.a).add(this.source.subscribe(new p(this.getSubject(),this))),t.closed?(this._connection=null,t=l.a.EMPTY):this._connection=t),t},e.prototype.refCount=function(){return a()(this)},e}(o.a).prototype,h={operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:d._subscribe},_isComplete:{value:d._isComplete,writable:!0},getSubject:{value:d.getSubject},connect:{value:d.connect},refCount:{value:d.refCount}},p=function(t){function e(e,n){t.call(this,e),this.connectable=n}return Object(r.__extends)(e,t),e.prototype._error=function(e){this._unsubscribe(),t.prototype._error.call(this,e)},e.prototype._complete=function(){this.connectable._isComplete=!0,this._unsubscribe(),t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){var t=this.connectable;if(t){this.connectable=null;var e=t._connection;t._refCount=0,t._subject=null,t._connection=null,e&&e.unsubscribe()}},e}(i.b);function f(){return new i.a}e.a=function(){return function(t){return a()((e=f,function(t){var n;n="function"==typeof e?e:function(){return e};var r=Object.create(t,h);return r.source=t,r.subjectFactory=n,r})(t));var e}}},"3hfc":function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443":"h"===n?e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0456\u043b\u0456\u043d\u0430_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d":"\u0445\u0432\u0456\u043b\u0456\u043d\u0443_\u0445\u0432\u0456\u043b\u0456\u043d\u044b_\u0445\u0432\u0456\u043b\u0456\u043d",hh:e?"\u0433\u0430\u0434\u0437\u0456\u043d\u0430_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d":"\u0433\u0430\u0434\u0437\u0456\u043d\u0443_\u0433\u0430\u0434\u0437\u0456\u043d\u044b_\u0433\u0430\u0434\u0437\u0456\u043d",dd:"\u0434\u0437\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u0437\u0451\u043d",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u044b_\u043c\u0435\u0441\u044f\u0446\u0430\u045e",yy:"\u0433\u043e\u0434_\u0433\u0430\u0434\u044b_\u0433\u0430\u0434\u043e\u045e"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}t.defineLocale("be",{months:{format:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f_\u043b\u044e\u0442\u0430\u0433\u0430_\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430_\u0442\u0440\u0430\u045e\u043d\u044f_\u0447\u044d\u0440\u0432\u0435\u043d\u044f_\u043b\u0456\u043f\u0435\u043d\u044f_\u0436\u043d\u0456\u045e\u043d\u044f_\u0432\u0435\u0440\u0430\u0441\u043d\u044f_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434\u0430_\u0441\u043d\u0435\u0436\u043d\u044f".split("_"),standalone:"\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044c_\u043b\u044e\u0442\u044b_\u0441\u0430\u043a\u0430\u0432\u0456\u043a_\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u044d\u0440\u0432\u0435\u043d\u044c_\u043b\u0456\u043f\u0435\u043d\u044c_\u0436\u043d\u0456\u0432\u0435\u043d\u044c_\u0432\u0435\u0440\u0430\u0441\u0435\u043d\u044c_\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a_\u043b\u0456\u0441\u0442\u0430\u043f\u0430\u0434_\u0441\u043d\u0435\u0436\u0430\u043d\u044c".split("_")},monthsShort:"\u0441\u0442\u0443\u0434_\u043b\u044e\u0442_\u0441\u0430\u043a_\u043a\u0440\u0430\u0441_\u0442\u0440\u0430\u0432_\u0447\u044d\u0440\u0432_\u043b\u0456\u043f_\u0436\u043d\u0456\u0432_\u0432\u0435\u0440_\u043a\u0430\u0441\u0442_\u043b\u0456\u0441\u0442_\u0441\u043d\u0435\u0436".split("_"),weekdays:{format:"\u043d\u044f\u0434\u0437\u0435\u043b\u044e_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0443_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0443_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),standalone:"\u043d\u044f\u0434\u0437\u0435\u043b\u044f_\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a_\u0430\u045e\u0442\u043e\u0440\u0430\u043a_\u0441\u0435\u0440\u0430\u0434\u0430_\u0447\u0430\u0446\u0432\u0435\u0440_\u043f\u044f\u0442\u043d\u0456\u0446\u0430_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043c\u0456\u043d\u0443\u043b\u0443\u044e|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u0443\u044e)? ?\] ?dddd/},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0430\u0442_\u0441\u0440_\u0447\u0446_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., HH:mm",LLLL:"dddd, D MMMM YYYY \u0433., HH:mm"},calendar:{sameDay:"[\u0421\u0451\u043d\u043d\u044f \u045e] LT",nextDay:"[\u0417\u0430\u045e\u0442\u0440\u0430 \u045e] LT",lastDay:"[\u0423\u0447\u043e\u0440\u0430 \u045e] LT",nextWeek:function(){return"[\u0423] dddd [\u045e] LT"},lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u0443\u044e] dddd [\u045e] LT";case 1:case 2:case 4:return"[\u0423 \u043c\u0456\u043d\u0443\u043b\u044b] dddd [\u045e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u0440\u0430\u0437 %s",past:"%s \u0442\u0430\u043c\u0443",s:"\u043d\u0435\u043a\u0430\u043b\u044c\u043a\u0456 \u0441\u0435\u043a\u0443\u043d\u0434",m:e,mm:e,h:e,hh:e,d:"\u0434\u0437\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u044b|\u0440\u0430\u043d\u0456\u0446\u044b|\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0430\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u044b":t<12?"\u0440\u0430\u043d\u0456\u0446\u044b":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0430\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0456|\u044b|\u0433\u0430)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t%10!=2&&t%10!=3||t%100==12||t%100==13?t+"-\u044b":t+"-\u0456";case"D":return t+"-\u0433\u0430";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},"5Omq":function(t,e,n){!function(t){"use strict";t.defineLocale("se",{months:"o\u0111\u0111ajagem\xe1nnu_guovvam\xe1nnu_njuk\u010dam\xe1nnu_cuo\u014bom\xe1nnu_miessem\xe1nnu_geassem\xe1nnu_suoidnem\xe1nnu_borgem\xe1nnu_\u010dak\u010dam\xe1nnu_golggotm\xe1nnu_sk\xe1bmam\xe1nnu_juovlam\xe1nnu".split("_"),monthsShort:"o\u0111\u0111j_guov_njuk_cuo_mies_geas_suoi_borg_\u010dak\u010d_golg_sk\xe1b_juov".split("_"),weekdays:"sotnabeaivi_vuoss\xe1rga_ma\u014b\u014beb\xe1rga_gaskavahkku_duorastat_bearjadat_l\xe1vvardat".split("_"),weekdaysShort:"sotn_vuos_ma\u014b_gask_duor_bear_l\xe1v".split("_"),weekdaysMin:"s_v_m_g_d_b_L".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"MMMM D. [b.] YYYY",LLL:"MMMM D. [b.] YYYY [ti.] HH:mm",LLLL:"dddd, MMMM D. [b.] YYYY [ti.] HH:mm"},calendar:{sameDay:"[otne ti] LT",nextDay:"[ihttin ti] LT",nextWeek:"dddd [ti] LT",lastDay:"[ikte ti] LT",lastWeek:"[ovddit] dddd [ti] LT",sameElse:"L"},relativeTime:{future:"%s gea\u017ees",past:"ma\u014bit %s",s:"moadde sekunddat",ss:"%d sekunddat",m:"okta minuhta",mm:"%d minuhtat",h:"okta diimmu",hh:"%d diimmut",d:"okta beaivi",dd:"%d beaivvit",M:"okta m\xe1nnu",MM:"%d m\xe1nut",y:"okta jahki",yy:"%d jagit"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"5SNd":function(t,e,n){!function(t){"use strict";var e={0:"-\u0443\u043c",1:"-\u0443\u043c",2:"-\u044e\u043c",3:"-\u044e\u043c",4:"-\u0443\u043c",5:"-\u0443\u043c",6:"-\u0443\u043c",7:"-\u0443\u043c",8:"-\u0443\u043c",9:"-\u0443\u043c",10:"-\u0443\u043c",12:"-\u0443\u043c",13:"-\u0443\u043c",20:"-\u0443\u043c",30:"-\u044e\u043c",40:"-\u0443\u043c",50:"-\u0443\u043c",60:"-\u0443\u043c",70:"-\u0443\u043c",80:"-\u0443\u043c",90:"-\u0443\u043c",100:"-\u0443\u043c"};t.defineLocale("tg",{months:"\u044f\u043d\u0432\u0430\u0440_\u0444\u0435\u0432\u0440\u0430\u043b_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440_\u043e\u043a\u0442\u044f\u0431\u0440_\u043d\u043e\u044f\u0431\u0440_\u0434\u0435\u043a\u0430\u0431\u0440".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d_\u0438\u044e\u043b_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u044f\u043a\u0448\u0430\u043d\u0431\u0435_\u0434\u0443\u0448\u0430\u043d\u0431\u0435_\u0441\u0435\u0448\u0430\u043d\u0431\u0435_\u0447\u043e\u0440\u0448\u0430\u043d\u0431\u0435_\u043f\u0430\u043d\u04b7\u0448\u0430\u043d\u0431\u0435_\u04b7\u0443\u043c\u044a\u0430_\u0448\u0430\u043d\u0431\u0435".split("_"),weekdaysShort:"\u044f\u0448\u0431_\u0434\u0448\u0431_\u0441\u0448\u0431_\u0447\u0448\u0431_\u043f\u0448\u0431_\u04b7\u0443\u043c_\u0448\u043d\u0431".split("_"),weekdaysMin:"\u044f\u0448_\u0434\u0448_\u0441\u0448_\u0447\u0448_\u043f\u0448_\u04b7\u043c_\u0448\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0418\u043c\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextDay:"[\u041f\u0430\u0433\u043e\u04b3 \u0441\u043e\u0430\u0442\u0438] LT",lastDay:"[\u0414\u0438\u0440\u04ef\u0437 \u0441\u043e\u0430\u0442\u0438] LT",nextWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u043e\u044f\u043d\u0434\u0430 \u0441\u043e\u0430\u0442\u0438] LT",lastWeek:"dddd[\u0438] [\u04b3\u0430\u0444\u0442\u0430\u0438 \u0433\u0443\u0437\u0430\u0448\u0442\u0430 \u0441\u043e\u0430\u0442\u0438] LT",sameElse:"L"},relativeTime:{future:"\u0431\u0430\u044a\u0434\u0438 %s",past:"%s \u043f\u0435\u0448",s:"\u044f\u043a\u0447\u0430\u043d\u0434 \u0441\u043e\u043d\u0438\u044f",m:"\u044f\u043a \u0434\u0430\u049b\u0438\u049b\u0430",mm:"%d \u0434\u0430\u049b\u0438\u049b\u0430",h:"\u044f\u043a \u0441\u043e\u0430\u0442",hh:"%d \u0441\u043e\u0430\u0442",d:"\u044f\u043a \u0440\u04ef\u0437",dd:"%d \u0440\u04ef\u0437",M:"\u044f\u043a \u043c\u043e\u04b3",MM:"%d \u043c\u043e\u04b3",y:"\u044f\u043a \u0441\u043e\u043b",yy:"%d \u0441\u043e\u043b"},meridiemParse:/\u0448\u0430\u0431|\u0441\u0443\u0431\u04b3|\u0440\u04ef\u0437|\u0431\u0435\u0433\u043e\u04b3/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0448\u0430\u0431"===e?t<4?t:t+12:"\u0441\u0443\u0431\u04b3"===e?t:"\u0440\u04ef\u0437"===e?t>=11?t:t+12:"\u0431\u0435\u0433\u043e\u04b3"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0448\u0430\u0431":t<11?"\u0441\u0443\u0431\u04b3":t<16?"\u0440\u04ef\u0437":t<19?"\u0431\u0435\u0433\u043e\u04b3":"\u0448\u0430\u0431"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0443\u043c|\u044e\u043c)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"5X6E":function(t,e,n){"use strict";e.a=function(t,e){return function(n){return n.lift(new s(t,e))}};var r=n("TToO"),i=n("tZ2B"),o=n("PIsA"),s=function(){function t(t,e){this.project=t,this.resultSelector=e}return t.prototype.call=function(t,e){return e.subscribe(new l(t,this.project,this.resultSelector))},t}(),l=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.resultSelector=r,this.index=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e,n=this.index++;try{e=this.project(t,n)}catch(t){return void this.destination.error(t)}this._innerSub(e,t,n)},e.prototype._innerSub=function(t,e,n){var r=this.innerSubscription;r&&r.unsubscribe(),this.add(this.innerSubscription=Object(o.a)(this,t,e,n))},e.prototype._complete=function(){var e=this.innerSubscription;e&&!e.closed||t.prototype._complete.call(this)},e.prototype._unsubscribe=function(){this.innerSubscription=null},e.prototype.notifyComplete=function(e){this.remove(e),this.innerSubscription=null,this.isStopped&&t.prototype._complete.call(this)},e.prototype.notifyNext=function(t,e,n,r,i){this.resultSelector?this._tryNotifyNext(t,e,n,r):this.destination.next(e)},e.prototype._tryNotifyNext=function(t,e,n,r){var i;try{i=this.resultSelector(t,e,n,r)}catch(t){return void this.destination.error(t)}this.destination.next(i)},e}(i.a)},"5j66":function(t,e,n){!function(t){"use strict";t.defineLocale("km",{months:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),monthsShort:"\u1798\u1780\u179a\u17b6_\u1780\u17bb\u1798\u17d2\u1797\u17c8_\u1798\u17b8\u1793\u17b6_\u1798\u17c1\u179f\u17b6_\u17a7\u179f\u1797\u17b6_\u1798\u17b7\u1790\u17bb\u1793\u17b6_\u1780\u1780\u17d2\u1780\u178a\u17b6_\u179f\u17b8\u17a0\u17b6_\u1780\u1789\u17d2\u1789\u17b6_\u178f\u17bb\u179b\u17b6_\u179c\u17b7\u1785\u17d2\u1786\u17b7\u1780\u17b6_\u1792\u17d2\u1793\u17bc".split("_"),weekdays:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysShort:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),weekdaysMin:"\u17a2\u17b6\u1791\u17b7\u178f\u17d2\u1799_\u1785\u17d0\u1793\u17d2\u1791_\u17a2\u1784\u17d2\u1782\u17b6\u179a_\u1796\u17bb\u1792_\u1796\u17d2\u179a\u17a0\u179f\u17d2\u1794\u178f\u17b7\u17cd_\u179f\u17bb\u1780\u17d2\u179a_\u179f\u17c5\u179a\u17cd".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u1790\u17d2\u1784\u17c3\u1793\u17c1\u17c7 \u1798\u17c9\u17c4\u1784] LT",nextDay:"[\u179f\u17d2\u17a2\u17c2\u1780 \u1798\u17c9\u17c4\u1784] LT",nextWeek:"dddd [\u1798\u17c9\u17c4\u1784] LT",lastDay:"[\u1798\u17d2\u179f\u17b7\u179b\u1798\u17b7\u1789 \u1798\u17c9\u17c4\u1784] LT",lastWeek:"dddd [\u179f\u1794\u17d2\u178f\u17b6\u17a0\u17cd\u1798\u17bb\u1793] [\u1798\u17c9\u17c4\u1784] LT",sameElse:"L"},relativeTime:{future:"%s\u1791\u17c0\u178f",past:"%s\u1798\u17bb\u1793",s:"\u1794\u17c9\u17bb\u1793\u17d2\u1798\u17b6\u1793\u179c\u17b7\u1793\u17b6\u1791\u17b8",ss:"%d \u179c\u17b7\u1793\u17b6\u1791\u17b8",m:"\u1798\u17bd\u1799\u1793\u17b6\u1791\u17b8",mm:"%d \u1793\u17b6\u1791\u17b8",h:"\u1798\u17bd\u1799\u1798\u17c9\u17c4\u1784",hh:"%d \u1798\u17c9\u17c4\u1784",d:"\u1798\u17bd\u1799\u1790\u17d2\u1784\u17c3",dd:"%d \u1790\u17d2\u1784\u17c3",M:"\u1798\u17bd\u1799\u1781\u17c2",MM:"%d \u1781\u17c2",y:"\u1798\u17bd\u1799\u1786\u17d2\u1793\u17b6\u17c6",yy:"%d \u1786\u17d2\u1793\u17b6\u17c6"},week:{dow:1,doy:4}})}(n("PJh5"))},"5vPg":function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};function r(t,e,n,r){var i="";if(e)switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926";break;case"m":i="\u090f\u0915 \u092e\u093f\u0928\u093f\u091f";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u0947";break;case"h":i="\u090f\u0915 \u0924\u093e\u0938";break;case"hh":i="%d \u0924\u093e\u0938";break;case"d":i="\u090f\u0915 \u0926\u093f\u0935\u0938";break;case"dd":i="%d \u0926\u093f\u0935\u0938";break;case"M":i="\u090f\u0915 \u092e\u0939\u093f\u0928\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u0947";break;case"y":i="\u090f\u0915 \u0935\u0930\u094d\u0937";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u0947"}else switch(n){case"s":i="\u0915\u093e\u0939\u0940 \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"ss":i="%d \u0938\u0947\u0915\u0902\u0926\u093e\u0902";break;case"m":i="\u090f\u0915\u093e \u092e\u093f\u0928\u093f\u091f\u093e";break;case"mm":i="%d \u092e\u093f\u0928\u093f\u091f\u093e\u0902";break;case"h":i="\u090f\u0915\u093e \u0924\u093e\u0938\u093e";break;case"hh":i="%d \u0924\u093e\u0938\u093e\u0902";break;case"d":i="\u090f\u0915\u093e \u0926\u093f\u0935\u0938\u093e";break;case"dd":i="%d \u0926\u093f\u0935\u0938\u093e\u0902";break;case"M":i="\u090f\u0915\u093e \u092e\u0939\u093f\u0928\u094d\u092f\u093e";break;case"MM":i="%d \u092e\u0939\u093f\u0928\u094d\u092f\u093e\u0902";break;case"y":i="\u090f\u0915\u093e \u0935\u0930\u094d\u0937\u093e";break;case"yy":i="%d \u0935\u0930\u094d\u0937\u093e\u0902"}return i.replace(/%d/i,t)}t.defineLocale("mr",{months:"\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940_\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u090f\u092a\u094d\u0930\u093f\u0932_\u092e\u0947_\u091c\u0942\u0928_\u091c\u0941\u0932\u0948_\u0911\u0917\u0938\u094d\u091f_\u0938\u092a\u094d\u091f\u0947\u0902\u092c\u0930_\u0911\u0915\u094d\u091f\u094b\u092c\u0930_\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930_\u0921\u093f\u0938\u0947\u0902\u092c\u0930".split("_"),monthsShort:"\u091c\u093e\u0928\u0947._\u092b\u0947\u092c\u094d\u0930\u0941._\u092e\u093e\u0930\u094d\u091a._\u090f\u092a\u094d\u0930\u093f._\u092e\u0947._\u091c\u0942\u0928._\u091c\u0941\u0932\u0948._\u0911\u0917._\u0938\u092a\u094d\u091f\u0947\u0902._\u0911\u0915\u094d\u091f\u094b._\u0928\u094b\u0935\u094d\u0939\u0947\u0902._\u0921\u093f\u0938\u0947\u0902.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0933\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0933_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u0935\u093e\u091c\u0924\u093e",LTS:"A h:mm:ss \u0935\u093e\u091c\u0924\u093e",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e",LLLL:"dddd, D MMMM YYYY, A h:mm \u0935\u093e\u091c\u0924\u093e"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0909\u0926\u094d\u092f\u093e] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u093e\u0932] LT",lastWeek:"[\u092e\u093e\u0917\u0940\u0932] dddd, LT",sameElse:"L"},relativeTime:{future:"%s\u092e\u0927\u094d\u092f\u0947",past:"%s\u092a\u0942\u0930\u094d\u0935\u0940",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924\u094d\u0930\u0940|\u0938\u0915\u093e\u0933\u0940|\u0926\u0941\u092a\u093e\u0930\u0940|\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924\u094d\u0930\u0940"===e?t<4?t:t+12:"\u0938\u0915\u093e\u0933\u0940"===e?t:"\u0926\u0941\u092a\u093e\u0930\u0940"===e?t>=10?t:t+12:"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924\u094d\u0930\u0940":t<10?"\u0938\u0915\u093e\u0933\u0940":t<17?"\u0926\u0941\u092a\u093e\u0930\u0940":t<20?"\u0938\u093e\u092f\u0902\u0915\u093e\u0933\u0940":"\u0930\u093e\u0924\u094d\u0930\u0940"},week:{dow:0,doy:6}})}(n("PJh5"))},"6cf8":function(t,e,n){!function(t){"use strict";var e={0:"-\u0447\u04af",1:"-\u0447\u0438",2:"-\u0447\u0438",3:"-\u0447\u04af",4:"-\u0447\u04af",5:"-\u0447\u0438",6:"-\u0447\u044b",7:"-\u0447\u0438",8:"-\u0447\u0438",9:"-\u0447\u0443",10:"-\u0447\u0443",20:"-\u0447\u044b",30:"-\u0447\u0443",40:"-\u0447\u044b",50:"-\u0447\u04af",60:"-\u0447\u044b",70:"-\u0447\u0438",80:"-\u0447\u0438",90:"-\u0447\u0443",100:"-\u0447\u04af"};t.defineLocale("ky",{months:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_"),monthsShort:"\u044f\u043d\u0432_\u0444\u0435\u0432_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433_\u0441\u0435\u043d_\u043e\u043a\u0442_\u043d\u043e\u044f_\u0434\u0435\u043a".split("_"),weekdays:"\u0416\u0435\u043a\u0448\u0435\u043c\u0431\u0438_\u0414\u04af\u0439\u0448\u04e9\u043c\u0431\u04af_\u0428\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0428\u0430\u0440\u0448\u0435\u043c\u0431\u0438_\u0411\u0435\u0439\u0448\u0435\u043c\u0431\u0438_\u0416\u0443\u043c\u0430_\u0418\u0448\u0435\u043c\u0431\u0438".split("_"),weekdaysShort:"\u0416\u0435\u043a_\u0414\u04af\u0439_\u0428\u0435\u0439_\u0428\u0430\u0440_\u0411\u0435\u0439_\u0416\u0443\u043c_\u0418\u0448\u0435".split("_"),weekdaysMin:"\u0416\u043a_\u0414\u0439_\u0428\u0439_\u0428\u0440_\u0411\u0439_\u0416\u043c_\u0418\u0448".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u04af\u043d \u0441\u0430\u0430\u0442] LT",nextDay:"[\u042d\u0440\u0442\u0435\u04a3 \u0441\u0430\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0447\u0435 \u0441\u0430\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u043d] dddd [\u043a\u04af\u043d\u04af] [\u0441\u0430\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0438\u0447\u0438\u043d\u0434\u0435",past:"%s \u043c\u0443\u0440\u0443\u043d",s:"\u0431\u0438\u0440\u043d\u0435\u0447\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0438\u0440 \u043c\u04af\u043d\u04e9\u0442",mm:"%d \u043c\u04af\u043d\u04e9\u0442",h:"\u0431\u0438\u0440 \u0441\u0430\u0430\u0442",hh:"%d \u0441\u0430\u0430\u0442",d:"\u0431\u0438\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0438\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0438\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0447\u0438|\u0447\u044b|\u0447\u04af|\u0447\u0443)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},"7LV+":function(t,e,n){!function(t){"use strict";var e="stycze\u0144_luty_marzec_kwiecie\u0144_maj_czerwiec_lipiec_sierpie\u0144_wrzesie\u0144_pa\u017adziernik_listopad_grudzie\u0144".split("_"),n="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrze\u015bnia_pa\u017adziernika_listopada_grudnia".split("_");function r(t){return t%10<5&&t%10>1&&~~(t/10)%10!=1}function i(t,e,n){var i=t+" ";switch(n){case"ss":return i+(r(t)?"sekundy":"sekund");case"m":return e?"minuta":"minut\u0119";case"mm":return i+(r(t)?"minuty":"minut");case"h":return e?"godzina":"godzin\u0119";case"hh":return i+(r(t)?"godziny":"godzin");case"MM":return i+(r(t)?"miesi\u0105ce":"miesi\u0119cy");case"yy":return i+(r(t)?"lata":"lat")}}t.defineLocale("pl",{months:function(t,r){return t?""===r?"("+n[t.month()]+"|"+e[t.month()]+")":/D MMMM/.test(r)?n[t.month()]:e[t.month()]:e},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_pa\u017a_lis_gru".split("_"),weekdays:"niedziela_poniedzia\u0142ek_wtorek_\u015broda_czwartek_pi\u0105tek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_\u015br_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_\u015ar_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dzi\u015b o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedziel\u0119 o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W \u015brod\u0119 o] LT";case 6:return"[W sobot\u0119 o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zesz\u0142\u0105 niedziel\u0119 o] LT";case 3:return"[W zesz\u0142\u0105 \u015brod\u0119 o] LT";case 6:return"[W zesz\u0142\u0105 sobot\u0119 o] LT";default:return"[W zesz\u0142y] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:i,m:i,mm:i,h:i,hh:i,d:"1 dzie\u0144",dd:"%d dni",M:"miesi\u0105c",MM:i,y:"rok",yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"7MHZ":function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"7OnE":function(t,e,n){!function(t){"use strict";var e={1:"\u0661",2:"\u0662",3:"\u0663",4:"\u0664",5:"\u0665",6:"\u0666",7:"\u0667",8:"\u0668",9:"\u0669",0:"\u0660"},n={"\u0661":"1","\u0662":"2","\u0663":"3","\u0664":"4","\u0665":"5","\u0666":"6","\u0667":"7","\u0668":"8","\u0669":"9","\u0660":"0"};t.defineLocale("ar-sa",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a\u0648_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648_\u0623\u063a\u0633\u0637\u0633_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},preparse:function(t){return t.replace(/[\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0660]/g,function(t){return n[t]}).replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:0,doy:6}})}(n("PJh5"))},"7Q8x":function(t,e,n){!function(t){"use strict";t.defineLocale("ss",{months:"Bhimbidvwane_Indlovana_Indlov'lenkhulu_Mabasa_Inkhwekhweti_Inhlaba_Kholwane_Ingci_Inyoni_Imphala_Lweti_Ingongoni".split("_"),monthsShort:"Bhi_Ina_Inu_Mab_Ink_Inh_Kho_Igc_Iny_Imp_Lwe_Igo".split("_"),weekdays:"Lisontfo_Umsombuluko_Lesibili_Lesitsatfu_Lesine_Lesihlanu_Umgcibelo".split("_"),weekdaysShort:"Lis_Umb_Lsb_Les_Lsi_Lsh_Umg".split("_"),weekdaysMin:"Li_Us_Lb_Lt_Ls_Lh_Ug".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Namuhla nga] LT",nextDay:"[Kusasa nga] LT",nextWeek:"dddd [nga] LT",lastDay:"[Itolo nga] LT",lastWeek:"dddd [leliphelile] [nga] LT",sameElse:"L"},relativeTime:{future:"nga %s",past:"wenteka nga %s",s:"emizuzwana lomcane",ss:"%d mzuzwana",m:"umzuzu",mm:"%d emizuzu",h:"lihora",hh:"%d emahora",d:"lilanga",dd:"%d emalanga",M:"inyanga",MM:"%d tinyanga",y:"umnyaka",yy:"%d iminyaka"},meridiemParse:/ekuseni|emini|entsambama|ebusuku/,meridiem:function(t,e,n){return t<11?"ekuseni":t<15?"emini":t<19?"entsambama":"ebusuku"},meridiemHour:function(t,e){return 12===t&&(t=0),"ekuseni"===e?t:"emini"===e?t>=11?t:t+12:"entsambama"===e||"ebusuku"===e?0===t?0:t+12:void 0},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:"%d",week:{dow:1,doy:4}})}(n("PJh5"))},"8D5t":function(t,e,n){"use strict";var r=n("Qnch");function i(t){return t}e.a=function(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(r.a)(i,null,t)}},"8v14":function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-at",{months:"J\xe4nner_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"J\xe4n._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"9Ocp":function(t,e,n){"use strict";e.a=function(t){return function(e){return 0===t?new s.a:e.lift(new l(t))}};var r=n("TToO"),i=n("OVmG"),o=n("pU/0"),s=n("+3/4"),l=function(){function t(t){if(this.total=t,this.total<0)throw new o.a}return t.prototype.call=function(t,e){return e.subscribe(new a(t,this.total))},t}(),a=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e=this.total,n=++this.count;n<=e&&(this.destination.next(t),n===e&&(this.destination.complete(),this.unsubscribe()))},e}(i.a)},ALEw:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},AMGY:function(t,e,n){"use strict";(function(t){n.d(e,"a",function(){return o});var r="undefined"!=typeof window&&window,i="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,o=r||"undefined"!=typeof t&&t||i}).call(e,n("DuR2"))},Ab7C:function(t,e,n){!function(t){"use strict";t.defineLocale("mk",{months:"\u0458\u0430\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d\u0438_\u0458\u0443\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u0458\u0430\u043d_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a_\u043f\u0435\u0442\u043e\u043a_\u0441\u0430\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u0435_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u0430\u0431".split("_"),weekdaysMin:"\u043de_\u043fo_\u0432\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441a".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u0435\u043d\u0435\u0441 \u0432\u043e] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432\u043e] LT",nextWeek:"[\u0412\u043e] dddd [\u0432\u043e] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432\u043e] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0430\u0442\u0430] dddd [\u0432\u043e] LT";case 1:case 2:case 4:case 5:return"[\u0418\u0437\u043c\u0438\u043d\u0430\u0442\u0438\u043e\u0442] dddd [\u0432\u043e] LT"}},sameElse:"L"},relativeTime:{future:"\u043f\u043e\u0441\u043b\u0435 %s",past:"\u043f\u0440\u0435\u0434 %s",s:"\u043d\u0435\u043a\u043e\u043b\u043a\u0443 \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u0435\u043d\u0430",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0438",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},AoDM:function(t,e,n){!function(t){"use strict";t.defineLocale("pt-br",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [\xe0s] HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY [\xe0s] HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba"})}(n("PJh5"))},BEem:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-tn",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:1,doy:4}})}(n("PJh5"))},BX3T:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=Array.isArray||function(t){return t&&"number"==typeof t.length}},BbgG:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-tw",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},Bp2f:function(t,e,n){!function(t){"use strict";var e="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),n="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),r=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],i=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;t.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xe9\xe9n minuut",mm:"%d minuten",h:"\xe9\xe9n uur",hh:"%d uur",d:"\xe9\xe9n dag",dd:"%d dagen",M:"\xe9\xe9n maand",MM:"%d maanden",y:"\xe9\xe9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(t){return t+(1===t||8===t||t>=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},C7av:function(t,e,n){!function(t){"use strict";t.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_m\xe5ndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_m\xe5n_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_m\xe5_ty_on_to_fr_l\xf8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I g\xe5r klokka] LT",lastWeek:"[F\xf8reg\xe5ande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein m\xe5nad",MM:"%d m\xe5nader",y:"eit \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},CFqe:function(t,e,n){!function(t){"use strict";t.defineLocale("el",{monthsNominativeEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2_\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2_\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2_\u039c\u03ac\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2_\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2_\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2_\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2_\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2_\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2".split("_"),monthsGenitiveEl:"\u0399\u03b1\u03bd\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03b1\u03c1\u03af\u03bf\u03c5_\u039c\u03b1\u03c1\u03c4\u03af\u03bf\u03c5_\u0391\u03c0\u03c1\u03b9\u03bb\u03af\u03bf\u03c5_\u039c\u03b1\u0390\u03bf\u03c5_\u0399\u03bf\u03c5\u03bd\u03af\u03bf\u03c5_\u0399\u03bf\u03c5\u03bb\u03af\u03bf\u03c5_\u0391\u03c5\u03b3\u03bf\u03cd\u03c3\u03c4\u03bf\u03c5_\u03a3\u03b5\u03c0\u03c4\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u039f\u03ba\u03c4\u03c9\u03b2\u03c1\u03af\u03bf\u03c5_\u039d\u03bf\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5_\u0394\u03b5\u03ba\u03b5\u03bc\u03b2\u03c1\u03af\u03bf\u03c5".split("_"),months:function(t,e){return t?"string"==typeof e&&/D/.test(e.substring(0,e.indexOf("MMMM")))?this._monthsGenitiveEl[t.month()]:this._monthsNominativeEl[t.month()]:this._monthsNominativeEl},monthsShort:"\u0399\u03b1\u03bd_\u03a6\u03b5\u03b2_\u039c\u03b1\u03c1_\u0391\u03c0\u03c1_\u039c\u03b1\u03ca_\u0399\u03bf\u03c5\u03bd_\u0399\u03bf\u03c5\u03bb_\u0391\u03c5\u03b3_\u03a3\u03b5\u03c0_\u039f\u03ba\u03c4_\u039d\u03bf\u03b5_\u0394\u03b5\u03ba".split("_"),weekdays:"\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae_\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1_\u03a4\u03c1\u03af\u03c4\u03b7_\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7_\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7_\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae_\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf".split("_"),weekdaysShort:"\u039a\u03c5\u03c1_\u0394\u03b5\u03c5_\u03a4\u03c1\u03b9_\u03a4\u03b5\u03c4_\u03a0\u03b5\u03bc_\u03a0\u03b1\u03c1_\u03a3\u03b1\u03b2".split("_"),weekdaysMin:"\u039a\u03c5_\u0394\u03b5_\u03a4\u03c1_\u03a4\u03b5_\u03a0\u03b5_\u03a0\u03b1_\u03a3\u03b1".split("_"),meridiem:function(t,e,n){return t>11?n?"\u03bc\u03bc":"\u039c\u039c":n?"\u03c0\u03bc":"\u03a0\u039c"},isPM:function(t){return"\u03bc"===(t+"").toLowerCase()[0]},meridiemParse:/[\u03a0\u039c]\.?\u039c?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1 {}] LT",nextDay:"[\u0391\u03cd\u03c1\u03b9\u03bf {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[\u03a7\u03b8\u03b5\u03c2 {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[\u03c4\u03bf \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03bf] dddd [{}] LT";default:return"[\u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b7] dddd [{}] LT"}},sameElse:"L"},calendar:function(t,e){var n,r=this._calendarEl[t],i=e&&e.hours();return((n=r)instanceof Function||"[object Function]"===Object.prototype.toString.call(n))&&(r=r.apply(e)),r.replace("{}",i%12==1?"\u03c3\u03c4\u03b7":"\u03c3\u03c4\u03b9\u03c2")},relativeTime:{future:"\u03c3\u03b5 %s",past:"%s \u03c0\u03c1\u03b9\u03bd",s:"\u03bb\u03af\u03b3\u03b1 \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",ss:"%d \u03b4\u03b5\u03c5\u03c4\u03b5\u03c1\u03cc\u03bb\u03b5\u03c0\u03c4\u03b1",m:"\u03ad\u03bd\u03b1 \u03bb\u03b5\u03c0\u03c4\u03cc",mm:"%d \u03bb\u03b5\u03c0\u03c4\u03ac",h:"\u03bc\u03af\u03b1 \u03ce\u03c1\u03b1",hh:"%d \u03ce\u03c1\u03b5\u03c2",d:"\u03bc\u03af\u03b1 \u03bc\u03ad\u03c1\u03b1",dd:"%d \u03bc\u03ad\u03c1\u03b5\u03c2",M:"\u03ad\u03bd\u03b1\u03c2 \u03bc\u03ae\u03bd\u03b1\u03c2",MM:"%d \u03bc\u03ae\u03bd\u03b5\u03c2",y:"\u03ad\u03bd\u03b1\u03c2 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c2",yy:"%d \u03c7\u03c1\u03cc\u03bd\u03b9\u03b1"},dayOfMonthOrdinalParse:/\d{1,2}\u03b7/,ordinal:"%d\u03b7",week:{dow:1,doy:4}})}(n("PJh5"))},DDro:function(t,e,n){"use strict";e.a=function(){return Object(r.a)(i,[])};var r=n("/4Bh");function i(t,e,n){return t.push(e),t}},DOkx:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},DSXN:function(t,e,n){!function(t){"use strict";t.defineLocale("sw",{months:"Januari_Februari_Machi_Aprili_Mei_Juni_Julai_Agosti_Septemba_Oktoba_Novemba_Desemba".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ago_Sep_Okt_Nov_Des".split("_"),weekdays:"Jumapili_Jumatatu_Jumanne_Jumatano_Alhamisi_Ijumaa_Jumamosi".split("_"),weekdaysShort:"Jpl_Jtat_Jnne_Jtan_Alh_Ijm_Jmos".split("_"),weekdaysMin:"J2_J3_J4_J5_Al_Ij_J1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[leo saa] LT",nextDay:"[kesho saa] LT",nextWeek:"[wiki ijayo] dddd [saat] LT",lastDay:"[jana] LT",lastWeek:"[wiki iliyopita] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s baadaye",past:"tokea %s",s:"hivi punde",ss:"sekunde %d",m:"dakika moja",mm:"dakika %d",h:"saa limoja",hh:"masaa %d",d:"siku moja",dd:"masiku %d",M:"mwezi mmoja",MM:"miezi %d",y:"mwaka mmoja",yy:"miaka %d"},week:{dow:1,doy:7}})}(n("PJh5"))},DuR2:function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},ETHv:function(t,e,n){!function(t){"use strict";var e={1:"\u0967",2:"\u0968",3:"\u0969",4:"\u096a",5:"\u096b",6:"\u096c",7:"\u096d",8:"\u096e",9:"\u096f",0:"\u0966"},n={"\u0967":"1","\u0968":"2","\u0969":"3","\u096a":"4","\u096b":"5","\u096c":"6","\u096d":"7","\u096e":"8","\u096f":"9","\u0966":"0"};t.defineLocale("hi",{months:"\u091c\u0928\u0935\u0930\u0940_\u092b\u093c\u0930\u0935\u0930\u0940_\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948\u0932_\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932\u093e\u0908_\u0905\u0917\u0938\u094d\u0924_\u0938\u093f\u0924\u092e\u094d\u092c\u0930_\u0905\u0915\u094d\u091f\u0942\u092c\u0930_\u0928\u0935\u092e\u094d\u092c\u0930_\u0926\u093f\u0938\u092e\u094d\u092c\u0930".split("_"),monthsShort:"\u091c\u0928._\u092b\u093c\u0930._\u092e\u093e\u0930\u094d\u091a_\u0905\u092a\u094d\u0930\u0948._\u092e\u0908_\u091c\u0942\u0928_\u091c\u0941\u0932._\u0905\u0917._\u0938\u093f\u0924._\u0905\u0915\u094d\u091f\u0942._\u0928\u0935._\u0926\u093f\u0938.".split("_"),monthsParseExact:!0,weekdays:"\u0930\u0935\u093f\u0935\u093e\u0930_\u0938\u094b\u092e\u0935\u093e\u0930_\u092e\u0902\u0917\u0932\u0935\u093e\u0930_\u092c\u0941\u0927\u0935\u093e\u0930_\u0917\u0941\u0930\u0942\u0935\u093e\u0930_\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930_\u0936\u0928\u093f\u0935\u093e\u0930".split("_"),weekdaysShort:"\u0930\u0935\u093f_\u0938\u094b\u092e_\u092e\u0902\u0917\u0932_\u092c\u0941\u0927_\u0917\u0941\u0930\u0942_\u0936\u0941\u0915\u094d\u0930_\u0936\u0928\u093f".split("_"),weekdaysMin:"\u0930_\u0938\u094b_\u092e\u0902_\u092c\u0941_\u0917\u0941_\u0936\u0941_\u0936".split("_"),longDateFormat:{LT:"A h:mm \u092c\u091c\u0947",LTS:"A h:mm:ss \u092c\u091c\u0947",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u092c\u091c\u0947",LLLL:"dddd, D MMMM YYYY, A h:mm \u092c\u091c\u0947"},calendar:{sameDay:"[\u0906\u091c] LT",nextDay:"[\u0915\u0932] LT",nextWeek:"dddd, LT",lastDay:"[\u0915\u0932] LT",lastWeek:"[\u092a\u093f\u091b\u0932\u0947] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u092e\u0947\u0902",past:"%s \u092a\u0939\u0932\u0947",s:"\u0915\u0941\u091b \u0939\u0940 \u0915\u094d\u0937\u0923",ss:"%d \u0938\u0947\u0915\u0902\u0921",m:"\u090f\u0915 \u092e\u093f\u0928\u091f",mm:"%d \u092e\u093f\u0928\u091f",h:"\u090f\u0915 \u0918\u0902\u091f\u093e",hh:"%d \u0918\u0902\u091f\u0947",d:"\u090f\u0915 \u0926\u093f\u0928",dd:"%d \u0926\u093f\u0928",M:"\u090f\u0915 \u092e\u0939\u0940\u0928\u0947",MM:"%d \u092e\u0939\u0940\u0928\u0947",y:"\u090f\u0915 \u0935\u0930\u094d\u0937",yy:"%d \u0935\u0930\u094d\u0937"},preparse:function(t){return t.replace(/[\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u0966]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0930\u093e\u0924|\u0938\u0941\u092c\u0939|\u0926\u094b\u092a\u0939\u0930|\u0936\u093e\u092e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0930\u093e\u0924"===e?t<4?t:t+12:"\u0938\u0941\u092c\u0939"===e?t:"\u0926\u094b\u092a\u0939\u0930"===e?t>=10?t:t+12:"\u0936\u093e\u092e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0930\u093e\u0924":t<10?"\u0938\u0941\u092c\u0939":t<17?"\u0926\u094b\u092a\u0939\u0930":t<20?"\u0936\u093e\u092e":"\u0930\u093e\u0924"},week:{dow:0,doy:6}})}(n("PJh5"))},"F+2e":function(t,e,n){!function(t){"use strict";var e={1:"\u1041",2:"\u1042",3:"\u1043",4:"\u1044",5:"\u1045",6:"\u1046",7:"\u1047",8:"\u1048",9:"\u1049",0:"\u1040"},n={"\u1041":"1","\u1042":"2","\u1043":"3","\u1044":"4","\u1045":"5","\u1046":"6","\u1047":"7","\u1048":"8","\u1049":"9","\u1040":"0"};t.defineLocale("my",{months:"\u1007\u1014\u103a\u1014\u101d\u102b\u101b\u102e_\u1016\u1031\u1016\u1031\u102c\u103a\u101d\u102b\u101b\u102e_\u1019\u1010\u103a_\u1027\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u1007\u1030\u101c\u102d\u102f\u1004\u103a_\u101e\u103c\u1002\u102f\u1010\u103a_\u1005\u1000\u103a\u1010\u1004\u103a\u1018\u102c_\u1021\u1031\u102c\u1000\u103a\u1010\u102d\u102f\u1018\u102c_\u1014\u102d\u102f\u101d\u1004\u103a\u1018\u102c_\u1012\u102e\u1007\u1004\u103a\u1018\u102c".split("_"),monthsShort:"\u1007\u1014\u103a_\u1016\u1031_\u1019\u1010\u103a_\u1015\u103c\u102e_\u1019\u1031_\u1007\u103d\u1014\u103a_\u101c\u102d\u102f\u1004\u103a_\u101e\u103c_\u1005\u1000\u103a_\u1021\u1031\u102c\u1000\u103a_\u1014\u102d\u102f_\u1012\u102e".split("_"),weekdays:"\u1010\u1014\u1004\u103a\u1039\u1002\u1014\u103d\u1031_\u1010\u1014\u1004\u103a\u1039\u101c\u102c_\u1021\u1004\u103a\u1039\u1002\u102b_\u1017\u102f\u1012\u1039\u1013\u101f\u1030\u1038_\u1000\u103c\u102c\u101e\u1015\u1010\u1031\u1038_\u101e\u1031\u102c\u1000\u103c\u102c_\u1005\u1014\u1031".split("_"),weekdaysShort:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),weekdaysMin:"\u1014\u103d\u1031_\u101c\u102c_\u1002\u102b_\u101f\u1030\u1038_\u1000\u103c\u102c_\u101e\u1031\u102c_\u1014\u1031".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u101a\u1014\u1031.] LT [\u1019\u103e\u102c]",nextDay:"[\u1019\u1014\u1000\u103a\u1016\u103c\u1014\u103a] LT [\u1019\u103e\u102c]",nextWeek:"dddd LT [\u1019\u103e\u102c]",lastDay:"[\u1019\u1014\u1031.\u1000] LT [\u1019\u103e\u102c]",lastWeek:"[\u1015\u103c\u102e\u1038\u1001\u1032\u1037\u101e\u1031\u102c] dddd LT [\u1019\u103e\u102c]",sameElse:"L"},relativeTime:{future:"\u101c\u102c\u1019\u100a\u103a\u1037 %s \u1019\u103e\u102c",past:"\u101c\u103d\u1014\u103a\u1001\u1032\u1037\u101e\u1031\u102c %s \u1000",s:"\u1005\u1000\u1039\u1000\u1014\u103a.\u1021\u1014\u100a\u103a\u1038\u1004\u101a\u103a",ss:"%d \u1005\u1000\u1039\u1000\u1014\u1037\u103a",m:"\u1010\u1005\u103a\u1019\u102d\u1014\u1005\u103a",mm:"%d \u1019\u102d\u1014\u1005\u103a",h:"\u1010\u1005\u103a\u1014\u102c\u101b\u102e",hh:"%d \u1014\u102c\u101b\u102e",d:"\u1010\u1005\u103a\u101b\u1000\u103a",dd:"%d \u101b\u1000\u103a",M:"\u1010\u1005\u103a\u101c",MM:"%d \u101c",y:"\u1010\u1005\u103a\u1014\u103e\u1005\u103a",yy:"%d \u1014\u103e\u1005\u103a"},preparse:function(t){return t.replace(/[\u1041\u1042\u1043\u1044\u1045\u1046\u1047\u1048\u1049\u1040]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},week:{dow:1,doy:4}})}(n("PJh5"))},FKXc:function(t,e,n){!function(t){"use strict";t.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_luned\xec_marted\xec_mercoled\xec_gioved\xec_venerd\xec_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(t){return(/^[0-9].+$/.test(t)?"tra":"in")+" "+t},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},FRPF:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm",{months:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),monthsShort:"\u2d49\u2d4f\u2d4f\u2d30\u2d62\u2d54_\u2d31\u2d55\u2d30\u2d62\u2d55_\u2d4e\u2d30\u2d55\u2d5a_\u2d49\u2d31\u2d54\u2d49\u2d54_\u2d4e\u2d30\u2d62\u2d62\u2d53_\u2d62\u2d53\u2d4f\u2d62\u2d53_\u2d62\u2d53\u2d4d\u2d62\u2d53\u2d63_\u2d56\u2d53\u2d5b\u2d5c_\u2d5b\u2d53\u2d5c\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d3d\u2d5f\u2d53\u2d31\u2d55_\u2d4f\u2d53\u2d61\u2d30\u2d4f\u2d31\u2d49\u2d54_\u2d37\u2d53\u2d4a\u2d4f\u2d31\u2d49\u2d54".split("_"),weekdays:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysShort:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),weekdaysMin:"\u2d30\u2d59\u2d30\u2d4e\u2d30\u2d59_\u2d30\u2d62\u2d4f\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4f\u2d30\u2d59_\u2d30\u2d3d\u2d54\u2d30\u2d59_\u2d30\u2d3d\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d4e\u2d61\u2d30\u2d59_\u2d30\u2d59\u2d49\u2d39\u2d62\u2d30\u2d59".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u2d30\u2d59\u2d37\u2d45 \u2d34] LT",nextDay:"[\u2d30\u2d59\u2d3d\u2d30 \u2d34] LT",nextWeek:"dddd [\u2d34] LT",lastDay:"[\u2d30\u2d5a\u2d30\u2d4f\u2d5c \u2d34] LT",lastWeek:"dddd [\u2d34] LT",sameElse:"L"},relativeTime:{future:"\u2d37\u2d30\u2d37\u2d45 \u2d59 \u2d62\u2d30\u2d4f %s",past:"\u2d62\u2d30\u2d4f %s",s:"\u2d49\u2d4e\u2d49\u2d3d",ss:"%d \u2d49\u2d4e\u2d49\u2d3d",m:"\u2d4e\u2d49\u2d4f\u2d53\u2d3a",mm:"%d \u2d4e\u2d49\u2d4f\u2d53\u2d3a",h:"\u2d59\u2d30\u2d44\u2d30",hh:"%d \u2d5c\u2d30\u2d59\u2d59\u2d30\u2d44\u2d49\u2d4f",d:"\u2d30\u2d59\u2d59",dd:"%d o\u2d59\u2d59\u2d30\u2d4f",M:"\u2d30\u2d62o\u2d53\u2d54",MM:"%d \u2d49\u2d62\u2d62\u2d49\u2d54\u2d4f",y:"\u2d30\u2d59\u2d33\u2d30\u2d59",yy:"%d \u2d49\u2d59\u2d33\u2d30\u2d59\u2d4f"},week:{dow:6,doy:12}})}(n("PJh5"))},FlzV:function(t,e,n){!function(t){"use strict";t.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"s\xf8ndag_mandag_tirsdag_onsdag_torsdag_fredag_l\xf8rdag".split("_"),weekdaysShort:"s\xf8._ma._ti._on._to._fr._l\xf8.".split("_"),weekdaysMin:"s\xf8_ma_ti_on_to_fr_l\xf8".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i g\xe5r kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en m\xe5ned",MM:"%d m\xe5neder",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},Fpqq:function(t,e,n){!function(t){"use strict";t.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"s\xf6ndag_m\xe5ndag_tisdag_onsdag_torsdag_fredag_l\xf6rdag".split("_"),weekdaysShort:"s\xf6n_m\xe5n_tis_ons_tor_fre_l\xf6r".split("_"),weekdaysMin:"s\xf6_m\xe5_ti_on_to_fr_l\xf6".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Ig\xe5r] LT",nextWeek:"[P\xe5] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"f\xf6r %s sedan",s:"n\xe5gra sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en m\xe5nad",MM:"%d m\xe5nader",y:"ett \xe5r",yy:"%d \xe5r"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"e":1===e?"a":2===e?"a":"e")},week:{dow:1,doy:4}})}(n("PJh5"))},Frex:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}t.defineLocale("de-ch",{months:"Januar_Februar_M\xe4rz_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._M\xe4rz_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:e,mm:"%d Minuten",h:e,hh:"%d Stunden",d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},FuaP:function(t,e,n){!function(t){"use strict";t.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xu\xf1o_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xu\xf1._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_m\xe9rcores_xoves_venres_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._m\xe9r._xov._ven._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_m\xe9_xo_ve_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextDay:function(){return"[ma\xf1\xe1 "+(1!==this.hours()?"\xe1s":"\xe1")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"\xe1s":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"\xe1":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"\xe1s":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(t){return 0===t.indexOf("un")?"n"+t:"en "+t},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},"G++c":function(t,e,n){!function(t){"use strict";t.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},GK6M:function(t,e,n){"use strict";e.a=function(t){return r=t,o};var r,i=n("fKB6");function o(){try{return r.apply(this,arguments)}catch(t){return i.a.e=t,i.a}}},GrS7:function(t,e,n){!function(t){"use strict";t.defineLocale("hy-am",{months:{format:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580\u056b_\u0583\u0565\u057f\u0580\u057e\u0561\u0580\u056b_\u0574\u0561\u0580\u057f\u056b_\u0561\u057a\u0580\u056b\u056c\u056b_\u0574\u0561\u0575\u056b\u057d\u056b_\u0570\u0578\u0582\u0576\u056b\u057d\u056b_\u0570\u0578\u0582\u056c\u056b\u057d\u056b_\u0585\u0563\u0578\u057d\u057f\u0578\u057d\u056b_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580\u056b_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580\u056b".split("_"),standalone:"\u0570\u0578\u0582\u0576\u057e\u0561\u0580_\u0583\u0565\u057f\u0580\u057e\u0561\u0580_\u0574\u0561\u0580\u057f_\u0561\u057a\u0580\u056b\u056c_\u0574\u0561\u0575\u056b\u057d_\u0570\u0578\u0582\u0576\u056b\u057d_\u0570\u0578\u0582\u056c\u056b\u057d_\u0585\u0563\u0578\u057d\u057f\u0578\u057d_\u057d\u0565\u057a\u057f\u0565\u0574\u0562\u0565\u0580_\u0570\u0578\u056f\u057f\u0565\u0574\u0562\u0565\u0580_\u0576\u0578\u0575\u0565\u0574\u0562\u0565\u0580_\u0564\u0565\u056f\u057f\u0565\u0574\u0562\u0565\u0580".split("_")},monthsShort:"\u0570\u0576\u057e_\u0583\u057f\u0580_\u0574\u0580\u057f_\u0561\u057a\u0580_\u0574\u0575\u057d_\u0570\u0576\u057d_\u0570\u056c\u057d_\u0585\u0563\u057d_\u057d\u057a\u057f_\u0570\u056f\u057f_\u0576\u0574\u0562_\u0564\u056f\u057f".split("_"),weekdays:"\u056f\u056b\u0580\u0561\u056f\u056b_\u0565\u0580\u056f\u0578\u0582\u0577\u0561\u0562\u0569\u056b_\u0565\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0579\u0578\u0580\u0565\u0584\u0577\u0561\u0562\u0569\u056b_\u0570\u056b\u0576\u0563\u0577\u0561\u0562\u0569\u056b_\u0578\u0582\u0580\u0562\u0561\u0569_\u0577\u0561\u0562\u0561\u0569".split("_"),weekdaysShort:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),weekdaysMin:"\u056f\u0580\u056f_\u0565\u0580\u056f_\u0565\u0580\u0584_\u0579\u0580\u0584_\u0570\u0576\u0563_\u0578\u0582\u0580\u0562_\u0577\u0562\u0569".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0569.",LLL:"D MMMM YYYY \u0569., HH:mm",LLLL:"dddd, D MMMM YYYY \u0569., HH:mm"},calendar:{sameDay:"[\u0561\u0575\u057d\u0585\u0580] LT",nextDay:"[\u057e\u0561\u0572\u0568] LT",lastDay:"[\u0565\u0580\u0565\u056f] LT",nextWeek:function(){return"dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},lastWeek:function(){return"[\u0561\u0576\u0581\u0561\u056e] dddd [\u0585\u0580\u0568 \u056a\u0561\u0574\u0568] LT"},sameElse:"L"},relativeTime:{future:"%s \u0570\u0565\u057f\u0578",past:"%s \u0561\u057c\u0561\u057b",s:"\u0574\u056b \u0584\u0561\u0576\u056b \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",ss:"%d \u057e\u0561\u0575\u0580\u056f\u0575\u0561\u0576",m:"\u0580\u0578\u057a\u0565",mm:"%d \u0580\u0578\u057a\u0565",h:"\u056a\u0561\u0574",hh:"%d \u056a\u0561\u0574",d:"\u0585\u0580",dd:"%d \u0585\u0580",M:"\u0561\u0574\u056b\u057d",MM:"%d \u0561\u0574\u056b\u057d",y:"\u057f\u0561\u0580\u056b",yy:"%d \u057f\u0561\u0580\u056b"},meridiemParse:/\u0563\u056b\u0577\u0565\u0580\u057e\u0561|\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561|\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576/,isPM:function(t){return/^(\u0581\u0565\u0580\u0565\u056f\u057e\u0561|\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576)$/.test(t)},meridiem:function(t){return t<4?"\u0563\u056b\u0577\u0565\u0580\u057e\u0561":t<12?"\u0561\u057c\u0561\u057e\u0578\u057f\u057e\u0561":t<17?"\u0581\u0565\u0580\u0565\u056f\u057e\u0561":"\u0565\u0580\u0565\u056f\u0578\u0575\u0561\u0576"},dayOfMonthOrdinalParse:/\d{1,2}|\d{1,2}-(\u056b\u0576|\u0580\u0564)/,ordinal:function(t,e){switch(e){case"DDD":case"w":case"W":case"DDDo":return 1===t?t+"-\u056b\u0576":t+"-\u0580\u0564";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},HdCx:function(t,e,n){"use strict";e.a=function(t,e){return function(n){if("function"!=typeof t)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return n.lift(new o(t,e))}};var r=n("TToO"),i=n("OVmG"),o=function(){function t(t,e){this.project=t,this.thisArg=e}return t.prototype.call=function(t,e){return e.subscribe(new s(t,this.project,this.thisArg))},t}(),s=function(t){function e(e,n,r){t.call(this,e),this.project=n,this.count=0,this.thisArg=r||this}return Object(r.__extends)(e,t),e.prototype._next=function(t){var e;try{e=this.project.call(this.thisArg,t,this.count++)}catch(t){return void this.destination.error(t)}this.destination.next(e)},e}(i.a)},INcR:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");t.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsParseExact:!0,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:0,doy:6}})}(n("PJh5"))},Jnfr:function(t,e){function n(t){return Promise.resolve().then(function(){throw new Error("Cannot find module '"+t+"'.")})}n.keys=function(){return[]},n.resolve=n,t.exports=n,n.id="Jnfr"},JwiF:function(t,e,n){!function(t){"use strict";t.defineLocale("jv",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_Nopember_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nop_Des".split("_"),weekdays:"Minggu_Senen_Seloso_Rebu_Kemis_Jemuwah_Septu".split("_"),weekdaysShort:"Min_Sen_Sel_Reb_Kem_Jem_Sep".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sp".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/enjing|siyang|sonten|ndalu/,meridiemHour:function(t,e){return 12===t&&(t=0),"enjing"===e?t:"siyang"===e?t>=11?t:t+12:"sonten"===e||"ndalu"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"enjing":t<15?"siyang":t<19?"sonten":"ndalu"},calendar:{sameDay:"[Dinten puniko pukul] LT",nextDay:"[Mbenjang pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kala wingi pukul] LT",lastWeek:"dddd [kepengker pukul] LT",sameElse:"L"},relativeTime:{future:"wonten ing %s",past:"%s ingkang kepengker",s:"sawetawis detik",ss:"%d detik",m:"setunggal menit",mm:"%d menit",h:"setunggal jam",hh:"%d jam",d:"sedinten",dd:"%d dinten",M:"sewulan",MM:"%d wulan",y:"setaun",yy:"%d taun"},week:{dow:1,doy:7}})}(n("PJh5"))},LT9G:function(t,e,n){!function(t){"use strict";var e="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),n="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),r=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],i=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;t.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(t,r){return t?/-MMM-/.test(r)?n[t.month()]:e[t.month()]:e},monthsRegex:i,monthsShortRegex:i,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:r,longMonthsParse:r,shortMonthsParse:r,weekdays:"domingo_lunes_martes_mi\xe9rcoles_jueves_viernes_s\xe1bado".split("_"),weekdaysShort:"dom._lun._mar._mi\xe9._jue._vie._s\xe1b.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_s\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[ma\xf1ana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un d\xeda",dd:"%d d\xedas",M:"un mes",MM:"%d meses",y:"un a\xf1o",yy:"%d a\xf1os"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},Lgqo:function(t,e,n){!function(t){"use strict";t.defineLocale("si",{months:"\u0da2\u0db1\u0dc0\u0dcf\u0dbb\u0dd2_\u0db4\u0dd9\u0db6\u0dbb\u0dc0\u0dcf\u0dbb\u0dd2_\u0db8\u0dcf\u0dbb\u0dca\u0dad\u0dd4_\u0d85\u0db4\u0dca\u200d\u0dbb\u0dda\u0dbd\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd\u0dc3\u0dca\u0dad\u0dd4_\u0dc3\u0dd0\u0db4\u0dca\u0dad\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0d94\u0d9a\u0dca\u0dad\u0ddd\u0db6\u0dbb\u0dca_\u0db1\u0ddc\u0dc0\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca_\u0daf\u0dd9\u0dc3\u0dd0\u0db8\u0dca\u0db6\u0dbb\u0dca".split("_"),monthsShort:"\u0da2\u0db1_\u0db4\u0dd9\u0db6_\u0db8\u0dcf\u0dbb\u0dca_\u0d85\u0db4\u0dca_\u0db8\u0dd0\u0dba\u0dd2_\u0da2\u0dd6\u0db1\u0dd2_\u0da2\u0dd6\u0dbd\u0dd2_\u0d85\u0d9c\u0ddd_\u0dc3\u0dd0\u0db4\u0dca_\u0d94\u0d9a\u0dca_\u0db1\u0ddc\u0dc0\u0dd0_\u0daf\u0dd9\u0dc3\u0dd0".split("_"),weekdays:"\u0d89\u0dbb\u0dd2\u0daf\u0dcf_\u0dc3\u0db3\u0dd4\u0daf\u0dcf_\u0d85\u0d9f\u0dc4\u0dbb\u0dd4\u0dc0\u0dcf\u0daf\u0dcf_\u0db6\u0daf\u0dcf\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4\u0dc3\u0dca\u0db4\u0dad\u0dd2\u0db1\u0dca\u0daf\u0dcf_\u0dc3\u0dd2\u0d9a\u0dd4\u0dbb\u0dcf\u0daf\u0dcf_\u0dc3\u0dd9\u0db1\u0dc3\u0dd4\u0dbb\u0dcf\u0daf\u0dcf".split("_"),weekdaysShort:"\u0d89\u0dbb\u0dd2_\u0dc3\u0db3\u0dd4_\u0d85\u0d9f_\u0db6\u0daf\u0dcf_\u0db6\u0dca\u200d\u0dbb\u0dc4_\u0dc3\u0dd2\u0d9a\u0dd4_\u0dc3\u0dd9\u0db1".split("_"),weekdaysMin:"\u0d89_\u0dc3_\u0d85_\u0db6_\u0db6\u0dca\u200d\u0dbb_\u0dc3\u0dd2_\u0dc3\u0dd9".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"a h:mm",LTS:"a h:mm:ss",L:"YYYY/MM/DD",LL:"YYYY MMMM D",LLL:"YYYY MMMM D, a h:mm",LLLL:"YYYY MMMM D [\u0dc0\u0dd0\u0db1\u0dd2] dddd, a h:mm:ss"},calendar:{sameDay:"[\u0d85\u0daf] LT[\u0da7]",nextDay:"[\u0dc4\u0dd9\u0da7] LT[\u0da7]",nextWeek:"dddd LT[\u0da7]",lastDay:"[\u0d8a\u0dba\u0dda] LT[\u0da7]",lastWeek:"[\u0db4\u0dc3\u0dd4\u0d9c\u0dd2\u0dba] dddd LT[\u0da7]",sameElse:"L"},relativeTime:{future:"%s\u0d9a\u0dd2\u0db1\u0dca",past:"%s\u0d9a\u0da7 \u0db4\u0dd9\u0dbb",s:"\u0dad\u0dad\u0dca\u0db4\u0dbb \u0d9a\u0dd2\u0dc4\u0dd2\u0db4\u0dba",ss:"\u0dad\u0dad\u0dca\u0db4\u0dbb %d",m:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4\u0dc0",mm:"\u0db8\u0dd2\u0db1\u0dd2\u0dad\u0dca\u0dad\u0dd4 %d",h:"\u0db4\u0dd0\u0dba",hh:"\u0db4\u0dd0\u0dba %d",d:"\u0daf\u0dd2\u0db1\u0dba",dd:"\u0daf\u0dd2\u0db1 %d",M:"\u0db8\u0dcf\u0dc3\u0dba",MM:"\u0db8\u0dcf\u0dc3 %d",y:"\u0dc0\u0dc3\u0dbb",yy:"\u0dc0\u0dc3\u0dbb %d"},dayOfMonthOrdinalParse:/\d{1,2} \u0dc0\u0dd0\u0db1\u0dd2/,ordinal:function(t){return t+" \u0dc0\u0dd0\u0db1\u0dd2"},meridiemParse:/\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4|\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4|\u0db4\u0dd9.\u0dc0|\u0db4.\u0dc0./,isPM:function(t){return"\u0db4.\u0dc0."===t||"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4"===t},meridiem:function(t,e,n){return t>11?n?"\u0db4.\u0dc0.":"\u0db4\u0dc3\u0dca \u0dc0\u0dbb\u0dd4":n?"\u0db4\u0dd9.\u0dc0.":"\u0db4\u0dd9\u0dbb \u0dc0\u0dbb\u0dd4"}})}(n("PJh5"))},N3vo:function(t,e,n){!function(t){"use strict";t.defineLocale("cv",{months:"\u043a\u04d1\u0440\u043b\u0430\u0447_\u043d\u0430\u0440\u04d1\u0441_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440\u0442\u043c\u0435_\u0443\u0442\u04d1_\u04ab\u0443\u0440\u043b\u0430_\u0430\u0432\u04d1\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448\u0442\u0430\u0432".split("_"),monthsShort:"\u043a\u04d1\u0440_\u043d\u0430\u0440_\u043f\u0443\u0448_\u0430\u043a\u0430_\u043c\u0430\u0439_\u04ab\u04d7\u0440_\u0443\u0442\u04d1_\u04ab\u0443\u0440_\u0430\u0432\u043d_\u044e\u043f\u0430_\u0447\u04f3\u043a_\u0440\u0430\u0448".split("_"),weekdays:"\u0432\u044b\u0440\u0441\u0430\u0440\u043d\u0438\u043a\u0443\u043d_\u0442\u0443\u043d\u0442\u0438\u043a\u0443\u043d_\u044b\u0442\u043b\u0430\u0440\u0438\u043a\u0443\u043d_\u044e\u043d\u043a\u0443\u043d_\u043a\u04d7\u04ab\u043d\u0435\u0440\u043d\u0438\u043a\u0443\u043d_\u044d\u0440\u043d\u0435\u043a\u0443\u043d_\u0448\u04d1\u043c\u0430\u0442\u043a\u0443\u043d".split("_"),weekdaysShort:"\u0432\u044b\u0440_\u0442\u0443\u043d_\u044b\u0442\u043b_\u044e\u043d_\u043a\u04d7\u04ab_\u044d\u0440\u043d_\u0448\u04d1\u043c".split("_"),weekdaysMin:"\u0432\u0440_\u0442\u043d_\u044b\u0442_\u044e\u043d_\u043a\u04ab_\u044d\u0440_\u0448\u043c".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7]",LLL:"YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm",LLLL:"dddd, YYYY [\u04ab\u0443\u043b\u0445\u0438] MMMM [\u0443\u0439\u04d1\u0445\u04d7\u043d] D[-\u043c\u04d7\u0448\u04d7], HH:mm"},calendar:{sameDay:"[\u041f\u0430\u044f\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextDay:"[\u042b\u0440\u0430\u043d] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastDay:"[\u04d6\u043d\u0435\u0440] LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",nextWeek:"[\u04aa\u0438\u0442\u0435\u0441] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",lastWeek:"[\u0418\u0440\u0442\u043d\u04d7] dddd LT [\u0441\u0435\u0445\u0435\u0442\u0440\u0435]",sameElse:"L"},relativeTime:{future:function(t){return t+(/\u0441\u0435\u0445\u0435\u0442$/i.exec(t)?"\u0440\u0435\u043d":/\u04ab\u0443\u043b$/i.exec(t)?"\u0442\u0430\u043d":"\u0440\u0430\u043d")},past:"%s \u043a\u0430\u044f\u043b\u043b\u0430",s:"\u043f\u04d7\u0440-\u0438\u043a \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",ss:"%d \u04ab\u0435\u043a\u043a\u0443\u043d\u0442",m:"\u043f\u04d7\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u043f\u04d7\u0440 \u0441\u0435\u0445\u0435\u0442",hh:"%d \u0441\u0435\u0445\u0435\u0442",d:"\u043f\u04d7\u0440 \u043a\u0443\u043d",dd:"%d \u043a\u0443\u043d",M:"\u043f\u04d7\u0440 \u0443\u0439\u04d1\u0445",MM:"%d \u0443\u0439\u04d1\u0445",y:"\u043f\u04d7\u0440 \u04ab\u0443\u043b",yy:"%d \u04ab\u0443\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-\u043c\u04d7\u0448/,ordinal:"%d-\u043c\u04d7\u0448",week:{dow:1,doy:7}})}(n("PJh5"))},N4j0:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){return t&&"number"==typeof t.length}},Nd3h:function(t,e,n){!function(t){"use strict";t.defineLocale("eo",{months:"januaro_februaro_marto_aprilo_majo_junio_julio_a\u016dgusto_septembro_oktobro_novembro_decembro".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_a\u016dg_sep_okt_nov_dec".split("_"),weekdays:"diman\u0109o_lundo_mardo_merkredo_\u0135a\u016ddo_vendredo_sabato".split("_"),weekdaysShort:"dim_lun_mard_merk_\u0135a\u016d_ven_sab".split("_"),weekdaysMin:"di_lu_ma_me_\u0135a_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D[-a de] MMMM, YYYY",LLL:"D[-a de] MMMM, YYYY HH:mm",LLLL:"dddd, [la] D[-a de] MMMM, YYYY HH:mm"},meridiemParse:/[ap]\.t\.m/i,isPM:function(t){return"p"===t.charAt(0).toLowerCase()},meridiem:function(t,e,n){return t>11?n?"p.t.m.":"P.T.M.":n?"a.t.m.":"A.T.M."},calendar:{sameDay:"[Hodia\u016d je] LT",nextDay:"[Morga\u016d je] LT",nextWeek:"dddd [je] LT",lastDay:"[Hiera\u016d je] LT",lastWeek:"[pasinta] dddd [je] LT",sameElse:"L"},relativeTime:{future:"post %s",past:"anta\u016d %s",s:"sekundoj",ss:"%d sekundoj",m:"minuto",mm:"%d minutoj",h:"horo",hh:"%d horoj",d:"tago",dd:"%d tagoj",M:"monato",MM:"%d monatoj",y:"jaro",yy:"%d jaroj"},dayOfMonthOrdinalParse:/\d{1,2}a/,ordinal:"%da",week:{dow:1,doy:7}})}(n("PJh5"))},Nlnz:function(t,e,n){!function(t){"use strict";t.defineLocale("te",{months:"\u0c1c\u0c28\u0c35\u0c30\u0c3f_\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f_\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d_\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41_\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d_\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d_\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d_\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d".split("_"),monthsShort:"\u0c1c\u0c28._\u0c2b\u0c3f\u0c2c\u0c4d\u0c30._\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f_\u0c0f\u0c2a\u0c4d\u0c30\u0c3f._\u0c2e\u0c47_\u0c1c\u0c42\u0c28\u0c4d_\u0c1c\u0c42\u0c32\u0c46\u0c56_\u0c06\u0c17._\u0c38\u0c46\u0c2a\u0c4d._\u0c05\u0c15\u0c4d\u0c1f\u0c4b._\u0c28\u0c35._\u0c21\u0c3f\u0c38\u0c46.".split("_"),monthsParseExact:!0,weekdays:"\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02_\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02_\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02_\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02_\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02_\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02".split("_"),weekdaysShort:"\u0c06\u0c26\u0c3f_\u0c38\u0c4b\u0c2e_\u0c2e\u0c02\u0c17\u0c33_\u0c2c\u0c41\u0c27_\u0c17\u0c41\u0c30\u0c41_\u0c36\u0c41\u0c15\u0c4d\u0c30_\u0c36\u0c28\u0c3f".split("_"),weekdaysMin:"\u0c06_\u0c38\u0c4b_\u0c2e\u0c02_\u0c2c\u0c41_\u0c17\u0c41_\u0c36\u0c41_\u0c36".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c28\u0c47\u0c21\u0c41] LT",nextDay:"[\u0c30\u0c47\u0c2a\u0c41] LT",nextWeek:"dddd, LT",lastDay:"[\u0c28\u0c3f\u0c28\u0c4d\u0c28] LT",lastWeek:"[\u0c17\u0c24] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0c32\u0c4b",past:"%s \u0c15\u0c4d\u0c30\u0c3f\u0c24\u0c02",s:"\u0c15\u0c4a\u0c28\u0c4d\u0c28\u0c3f \u0c15\u0c4d\u0c37\u0c23\u0c3e\u0c32\u0c41",ss:"%d \u0c38\u0c46\u0c15\u0c28\u0c4d\u0c32\u0c41",m:"\u0c12\u0c15 \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c02",mm:"%d \u0c28\u0c3f\u0c2e\u0c3f\u0c37\u0c3e\u0c32\u0c41",h:"\u0c12\u0c15 \u0c17\u0c02\u0c1f",hh:"%d \u0c17\u0c02\u0c1f\u0c32\u0c41",d:"\u0c12\u0c15 \u0c30\u0c4b\u0c1c\u0c41",dd:"%d \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",M:"\u0c12\u0c15 \u0c28\u0c46\u0c32",MM:"%d \u0c28\u0c46\u0c32\u0c32\u0c41",y:"\u0c12\u0c15 \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c02",yy:"%d \u0c38\u0c02\u0c35\u0c24\u0c4d\u0c38\u0c30\u0c3e\u0c32\u0c41"},dayOfMonthOrdinalParse:/\d{1,2}\u0c35/,ordinal:"%d\u0c35",meridiemParse:/\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f|\u0c09\u0c26\u0c2f\u0c02|\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02|\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"===e?t<4?t:t+12:"\u0c09\u0c26\u0c2f\u0c02"===e?t:"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02"===e?t>=10?t:t+12:"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f":t<10?"\u0c09\u0c26\u0c2f\u0c02":t<17?"\u0c2e\u0c27\u0c4d\u0c2f\u0c3e\u0c39\u0c4d\u0c28\u0c02":t<20?"\u0c38\u0c3e\u0c2f\u0c02\u0c24\u0c4d\u0c30\u0c02":"\u0c30\u0c3e\u0c24\u0c4d\u0c30\u0c3f"},week:{dow:0,doy:6}})}(n("PJh5"))},Nzt2:function(t,e,n){!function(t){"use strict";t.defineLocale("he",{months:"\u05d9\u05e0\u05d5\u05d0\u05e8_\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05d9\u05dc_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8_\u05e1\u05e4\u05d8\u05de\u05d1\u05e8_\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8_\u05e0\u05d5\u05d1\u05de\u05d1\u05e8_\u05d3\u05e6\u05de\u05d1\u05e8".split("_"),monthsShort:"\u05d9\u05e0\u05d5\u05f3_\u05e4\u05d1\u05e8\u05f3_\u05de\u05e8\u05e5_\u05d0\u05e4\u05e8\u05f3_\u05de\u05d0\u05d9_\u05d9\u05d5\u05e0\u05d9_\u05d9\u05d5\u05dc\u05d9_\u05d0\u05d5\u05d2\u05f3_\u05e1\u05e4\u05d8\u05f3_\u05d0\u05d5\u05e7\u05f3_\u05e0\u05d5\u05d1\u05f3_\u05d3\u05e6\u05de\u05f3".split("_"),weekdays:"\u05e8\u05d0\u05e9\u05d5\u05df_\u05e9\u05e0\u05d9_\u05e9\u05dc\u05d9\u05e9\u05d9_\u05e8\u05d1\u05d9\u05e2\u05d9_\u05d7\u05de\u05d9\u05e9\u05d9_\u05e9\u05d9\u05e9\u05d9_\u05e9\u05d1\u05ea".split("_"),weekdaysShort:"\u05d0\u05f3_\u05d1\u05f3_\u05d2\u05f3_\u05d3\u05f3_\u05d4\u05f3_\u05d5\u05f3_\u05e9\u05f3".split("_"),weekdaysMin:"\u05d0_\u05d1_\u05d2_\u05d3_\u05d4_\u05d5_\u05e9".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [\u05d1]MMMM YYYY",LLL:"D [\u05d1]MMMM YYYY HH:mm",LLLL:"dddd, D [\u05d1]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[\u05d4\u05d9\u05d5\u05dd \u05d1\u05be]LT",nextDay:"[\u05de\u05d7\u05e8 \u05d1\u05be]LT",nextWeek:"dddd [\u05d1\u05e9\u05e2\u05d4] LT",lastDay:"[\u05d0\u05ea\u05de\u05d5\u05dc \u05d1\u05be]LT",lastWeek:"[\u05d1\u05d9\u05d5\u05dd] dddd [\u05d4\u05d0\u05d7\u05e8\u05d5\u05df \u05d1\u05e9\u05e2\u05d4] LT",sameElse:"L"},relativeTime:{future:"\u05d1\u05e2\u05d5\u05d3 %s",past:"\u05dc\u05e4\u05e0\u05d9 %s",s:"\u05de\u05e1\u05e4\u05e8 \u05e9\u05e0\u05d9\u05d5\u05ea",ss:"%d \u05e9\u05e0\u05d9\u05d5\u05ea",m:"\u05d3\u05e7\u05d4",mm:"%d \u05d3\u05e7\u05d5\u05ea",h:"\u05e9\u05e2\u05d4",hh:function(t){return 2===t?"\u05e9\u05e2\u05ea\u05d9\u05d9\u05dd":t+" \u05e9\u05e2\u05d5\u05ea"},d:"\u05d9\u05d5\u05dd",dd:function(t){return 2===t?"\u05d9\u05d5\u05de\u05d9\u05d9\u05dd":t+" \u05d9\u05de\u05d9\u05dd"},M:"\u05d7\u05d5\u05d3\u05e9",MM:function(t){return 2===t?"\u05d7\u05d5\u05d3\u05e9\u05d9\u05d9\u05dd":t+" \u05d7\u05d5\u05d3\u05e9\u05d9\u05dd"},y:"\u05e9\u05e0\u05d4",yy:function(t){return 2===t?"\u05e9\u05e0\u05ea\u05d9\u05d9\u05dd":t%10==0&&10!==t?t+" \u05e9\u05e0\u05d4":t+" \u05e9\u05e0\u05d9\u05dd"}},meridiemParse:/\u05d0\u05d7\u05d4"\u05e6|\u05dc\u05e4\u05e0\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8|\u05d1\u05d1\u05d5\u05e7\u05e8|\u05d1\u05e2\u05e8\u05d1/i,isPM:function(t){return/^(\u05d0\u05d7\u05d4"\u05e6|\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd|\u05d1\u05e2\u05e8\u05d1)$/.test(t)},meridiem:function(t,e,n){return t<5?"\u05dc\u05e4\u05e0\u05d5\u05ea \u05d1\u05d5\u05e7\u05e8":t<10?"\u05d1\u05d1\u05d5\u05e7\u05e8":t<12?n?'\u05dc\u05e4\u05e0\u05d4"\u05e6':"\u05dc\u05e4\u05e0\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":t<18?n?'\u05d0\u05d7\u05d4"\u05e6':"\u05d0\u05d7\u05e8\u05d9 \u05d4\u05e6\u05d4\u05e8\u05d9\u05d9\u05dd":"\u05d1\u05e2\u05e8\u05d1"}})}(n("PJh5"))},ORgI:function(t,e,n){!function(t){"use strict";t.defineLocale("ja",{months:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u65e5\u66dc\u65e5_\u6708\u66dc\u65e5_\u706b\u66dc\u65e5_\u6c34\u66dc\u65e5_\u6728\u66dc\u65e5_\u91d1\u66dc\u65e5_\u571f\u66dc\u65e5".split("_"),weekdaysShort:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),weekdaysMin:"\u65e5_\u6708_\u706b_\u6c34_\u6728_\u91d1_\u571f".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5 HH:mm dddd"},meridiemParse:/\u5348\u524d|\u5348\u5f8c/i,isPM:function(t){return"\u5348\u5f8c"===t},meridiem:function(t,e,n){return t<12?"\u5348\u524d":"\u5348\u5f8c"},calendar:{sameDay:"[\u4eca\u65e5] LT",nextDay:"[\u660e\u65e5] LT",nextWeek:"[\u6765\u9031]dddd LT",lastDay:"[\u6628\u65e5] LT",lastWeek:"[\u524d\u9031]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}\u65e5/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";default:return t}},relativeTime:{future:"%s\u5f8c",past:"%s\u524d",s:"\u6570\u79d2",ss:"%d\u79d2",m:"1\u5206",mm:"%d\u5206",h:"1\u6642\u9593",hh:"%d\u6642\u9593",d:"1\u65e5",dd:"%d\u65e5",M:"1\u30f6\u6708",MM:"%d\u30f6\u6708",y:"1\u5e74",yy:"%d\u5e74"}})}(n("PJh5"))},OSsP:function(t,e,n){!function(t){"use strict";function e(t,e,n){return t+" "+function(t,e){return 2===e?function(t){var e={m:"v",b:"v",d:"z"};return void 0===e[t.charAt(0)]?t:e[t.charAt(0)]+t.substring(1)}(t):t}({mm:"munutenn",MM:"miz",dd:"devezh"}[n],t)}t.defineLocale("br",{months:"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),monthsShort:"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),weekdays:"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),weekdaysShort:"Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),weekdaysMin:"Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h[e]mm A",LTS:"h[e]mm:ss A",L:"DD/MM/YYYY",LL:"D [a viz] MMMM YYYY",LLL:"D [a viz] MMMM YYYY h[e]mm A",LLLL:"dddd, D [a viz] MMMM YYYY h[e]mm A"},calendar:{sameDay:"[Hiziv da] LT",nextDay:"[Warc'hoazh da] LT",nextWeek:"dddd [da] LT",lastDay:"[Dec'h da] LT",lastWeek:"dddd [paset da] LT",sameElse:"L"},relativeTime:{future:"a-benn %s",past:"%s 'zo",s:"un nebeud segondenno\xf9",ss:"%d eilenn",m:"ur vunutenn",mm:e,h:"un eur",hh:"%d eur",d:"un devezh",dd:e,M:"ur miz",MM:e,y:"ur bloaz",yy:function(t){switch(function t(e){return e>9?t(e%10):e}(t)){case 1:case 3:case 4:case 5:case 9:return t+" bloaz";default:return t+" vloaz"}}},dayOfMonthOrdinalParse:/\d{1,2}(a\xf1|vet)/,ordinal:function(t){return t+(1===t?"a\xf1":"vet")},week:{dow:1,doy:4}})}(n("PJh5"))},OUMt:function(t,e,n){!function(t){"use strict";var e="janu\xe1r_febru\xe1r_marec_apr\xedl_m\xe1j_j\xfan_j\xfal_august_september_okt\xf3ber_november_december".split("_"),n="jan_feb_mar_apr_m\xe1j_j\xfan_j\xfal_aug_sep_okt_nov_dec".split("_");function r(t){return t>1&&t<5}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sek\xfand":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sek\xfand"):o+"sekundami";case"m":return e?"min\xfata":i?"min\xfatu":"min\xfatou";case"mm":return e||i?o+(r(t)?"min\xfaty":"min\xfat"):o+"min\xfatami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hod\xedn"):o+"hodinami";case"d":return e||i?"de\u0148":"d\u0148om";case"dd":return e||i?o+(r(t)?"dni":"dn\xed"):o+"d\u0148ami";case"M":return e||i?"mesiac":"mesiacom";case"MM":return e||i?o+(r(t)?"mesiace":"mesiacov"):o+"mesiacmi";case"y":return e||i?"rok":"rokom";case"yy":return e||i?o+(r(t)?"roky":"rokov"):o+"rokmi"}}t.defineLocale("sk",{months:e,monthsShort:n,weekdays:"nede\u013ea_pondelok_utorok_streda_\u0161tvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_\u0161t_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_\u0161t_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nede\u013eu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo \u0161tvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[v\u010dera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minul\xfa nede\u013eu o] LT";case 1:case 2:return"[minul\xfd] dddd [o] LT";case 3:return"[minul\xfa stredu o] LT";case 4:case 5:return"[minul\xfd] dddd [o] LT";case 6:return"[minul\xfa sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVPi:function(t,e,n){!function(t){"use strict";t.defineLocale("fo",{months:"januar_februar_mars_apr\xedl_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sunnudagur_m\xe1nadagur_t\xfdsdagur_mikudagur_h\xf3sdagur_fr\xedggjadagur_leygardagur".split("_"),weekdaysShort:"sun_m\xe1n_t\xfds_mik_h\xf3s_fr\xed_ley".split("_"),weekdaysMin:"su_m\xe1_t\xfd_mi_h\xf3_fr_le".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D. MMMM, YYYY HH:mm"},calendar:{sameDay:"[\xcd dag kl.] LT",nextDay:"[\xcd morgin kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xcd gj\xe1r kl.] LT",lastWeek:"[s\xed\xf0stu] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"um %s",past:"%s s\xed\xf0ani",s:"f\xe1 sekund",ss:"%d sekundir",m:"ein minutt",mm:"%d minuttir",h:"ein t\xedmi",hh:"%d t\xedmar",d:"ein dagur",dd:"%d dagar",M:"ein m\xe1na\xf0i",MM:"%d m\xe1na\xf0ir",y:"eitt \xe1r",yy:"%d \xe1r"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},OVmG:function(t,e,n){"use strict";n.d(e,"a",function(){return a});var r=n("TToO"),i=n("/iUD"),o=n("VwZZ"),s=n("t7NR"),l=n("tLDX"),a=function(t){function e(n,r,i){switch(t.call(this),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=s.a;break;case 1:if(!n){this.destination=s.a;break}if("object"==typeof n){n instanceof e?(this.syncErrorThrowable=n.syncErrorThrowable,this.destination=n,this.destination.add(this)):(this.syncErrorThrowable=!0,this.destination=new u(this,n));break}default:this.syncErrorThrowable=!0,this.destination=new u(this,n,r,i)}}return Object(r.__extends)(e,t),e.prototype[l.a]=function(){return this},e.create=function(t,n,r){var i=new e(t,n,r);return i.syncErrorThrowable=!1,i},e.prototype.next=function(t){this.isStopped||this._next(t)},e.prototype.error=function(t){this.isStopped||(this.isStopped=!0,this._error(t))},e.prototype.complete=function(){this.isStopped||(this.isStopped=!0,this._complete())},e.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,t.prototype.unsubscribe.call(this))},e.prototype._next=function(t){this.destination.next(t)},e.prototype._error=function(t){this.destination.error(t),this.unsubscribe()},e.prototype._complete=function(){this.destination.complete(),this.unsubscribe()},e.prototype._unsubscribeAndRecycle=function(){var t=this._parent,e=this._parents;return this._parent=null,this._parents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parent=t,this._parents=e,this},e}(o.a),u=function(t){function e(e,n,r,o){var l;t.call(this),this._parentSubscriber=e;var a=this;Object(i.a)(n)?l=n:n&&(l=n.next,r=n.error,o=n.complete,n!==s.a&&(a=Object.create(n),Object(i.a)(a.unsubscribe)&&this.add(a.unsubscribe.bind(a)),a.unsubscribe=this.unsubscribe.bind(this))),this._context=a,this._next=l,this._error=r,this._complete=o}return Object(r.__extends)(e,t),e.prototype.next=function(t){if(!this.isStopped&&this._next){var e=this._parentSubscriber;e.syncErrorThrowable?this.__tryOrSetError(e,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}},e.prototype.error=function(t){if(!this.isStopped){var e=this._parentSubscriber;if(this._error)e.syncErrorThrowable?(this.__tryOrSetError(e,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else{if(!e.syncErrorThrowable)throw this.unsubscribe(),t;e.syncErrorValue=t,e.syncErrorThrown=!0,this.unsubscribe()}}},e.prototype.complete=function(){var t=this;if(!this.isStopped){var e=this._parentSubscriber;if(this._complete){var n=function(){return t._complete.call(t._context)};e.syncErrorThrowable?(this.__tryOrSetError(e,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}},e.prototype.__tryOrUnsub=function(t,e){try{t.call(this._context,e)}catch(t){throw this.unsubscribe(),t}},e.prototype.__tryOrSetError=function(t,e,n){try{e.call(this._context,n)}catch(e){return t.syncErrorValue=e,t.syncErrorThrown=!0,!0}return!1},e.prototype._unsubscribe=function(){var t=this._parentSubscriber;this._context=null,this._parentSubscriber=null,t.unsubscribe()},e}(a)},PIsA:function(t,e,n){"use strict";var r=n("AMGY"),i=n("N4j0"),o=n("cQXm"),s=n("dgOU"),l=n("YaPU"),a=n("etqZ"),u=n("TToO"),c=function(t){function e(e,n,r){t.call(this),this.parent=e,this.outerValue=n,this.outerIndex=r,this.index=0}return Object(u.__extends)(e,t),e.prototype._next=function(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)},e.prototype._error=function(t){this.parent.notifyError(t,this),this.unsubscribe()},e.prototype._complete=function(){this.parent.notifyComplete(this),this.unsubscribe()},e}(n("OVmG").a),d=n("+CnV");e.a=function(t,e,n,u){var h=new c(t,n,u);if(h.closed)return null;if(e instanceof l.a)return e._isScalar?(h.next(e.value),h.complete(),null):(h.syncErrorThrowable=!0,e.subscribe(h));if(Object(i.a)(e)){for(var p=0,f=e.length;p>>0,r=0;r0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,e-r.length)).toString().substr(1)+r}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,V=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,B={},z={};function W(t,e,n,r){var i=r;"string"==typeof r&&(i=function(){return this[r]()}),t&&(z[t]=i),e&&(z[e[0]]=function(){return F(i.apply(this,arguments),e[1],e[2])}),n&&(z[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),t)})}function U(t,e){return t.isValid()?(e=G(e,t.localeData()),B[e]=B[e]||function(t){var e,n,r,i=t.match(N);for(e=0,n=i.length;e=0&&V.test(t);)t=t.replace(V,r),V.lastIndex=0,n-=1;return t}var J=/\d/,q=/\d\d/,Q=/\d{3}/,K=/\d{4}/,X=/[+-]?\d{6}/,Z=/\d\d?/,$=/\d\d\d\d?/,tt=/\d\d\d\d\d\d?/,et=/\d{1,3}/,nt=/\d{1,4}/,rt=/[+-]?\d{1,6}/,it=/\d+/,ot=/[+-]?\d+/,st=/Z|[+-]\d\d:?\d\d/gi,lt=/Z|[+-]\d\d(?::?\d\d)?/gi,at=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ut={};function ct(t,e,n){ut[t]=D(e)?e:function(t,r){return t&&n?n:e}}function dt(t,e){return d(ut,t)?ut[t](e._strict,e._locale):new RegExp(ht(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,r,i){return e||n||r||i})))}function ht(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var pt={};function ft(t,e){var n,r=e;for("string"==typeof t&&(t=[t]),a(e)&&(r=function(t,n){n[e]=k(t)}),n=0;n68?1900:2e3)};var Tt,Ot=Dt("FullYear",!0);function Dt(t,e){return function(n){return null!=n?(Pt(this,t,n),i.updateOffset(this,e),this):Yt(this,t)}}function Yt(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function Pt(t,e,n){t.isValid()&&!isNaN(n)&&("FullYear"===e&&St(t.year())&&1===t.month()&&29===t.date()?t._d["set"+(t._isUTC?"UTC":"")+e](n,t.month(),Et(n,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](n))}function Et(t,e){if(isNaN(t)||isNaN(e))return NaN;var n=(e%12+12)%12;return t+=(e-n)/12,1===n?St(t)?29:28:31-n%7%2}Tt=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function zt(t,e,n){var r=7+e-n;return-(7+Bt(t,0,r).getUTCDay()-e)%7+r-1}function Wt(t,e,n,r,i){var o,s,l=1+7*(e-1)+(7+n-r)%7+zt(t,r,i);return l<=0?s=Ct(o=t-1)+l:l>Ct(t)?(o=t+1,s=l-Ct(t)):(o=t,s=l),{year:o,dayOfYear:s}}function Ut(t,e,n){var r,i,o=zt(t.year(),e,n),s=Math.floor((t.dayOfYear()-o-1)/7)+1;return s<1?r=s+Gt(i=t.year()-1,e,n):s>Gt(t.year(),e,n)?(r=s-Gt(t.year(),e,n),i=t.year()+1):(i=t.year(),r=s),{week:r,year:i}}function Gt(t,e,n){var r=zt(t,e,n),i=zt(t+1,e,n);return(Ct(t)-r+i)/7}W("w",["ww",2],"wo","week"),W("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),H("week",5),H("isoWeek",5),ct("w",Z),ct("ww",Z,q),ct("W",Z),ct("WW",Z,q),_t(["w","ww","W","WW"],function(t,e,n,r){e[r.substr(0,1)]=k(t)}),W("d",0,"do","day"),W("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),W("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),W("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),W("e",0,0,"weekday"),W("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),H("day",11),H("weekday",11),H("isoWeekday",11),ct("d",Z),ct("e",Z),ct("E",Z),ct("dd",function(t,e){return e.weekdaysMinRegex(t)}),ct("ddd",function(t,e){return e.weekdaysShortRegex(t)}),ct("dddd",function(t,e){return e.weekdaysRegex(t)}),_t(["dd","ddd","dddd"],function(t,e,n,r){var i=n._locale.weekdaysParse(t,r,n._strict);null!=i?e.d=i:f(n).invalidWeekday=t}),_t(["d","e","E"],function(t,e,n,r){e[r]=k(t)});var Jt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Qt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Kt=at,Xt=at,Zt=at;function $t(){function t(t,e){return e.length-t.length}var e,n,r,i,o,s=[],l=[],a=[],u=[];for(e=0;e<7;e++)n=p([2e3,1]).day(e),r=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),o=this.weekdays(n,""),s.push(r),l.push(i),a.push(o),u.push(r),u.push(i),u.push(o);for(s.sort(t),l.sort(t),a.sort(t),u.sort(t),e=0;e<7;e++)l[e]=ht(l[e]),a[e]=ht(a[e]),u[e]=ht(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+s.join("|")+")","i")}function te(){return this.hours()%12||12}function ee(t,e){W(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function ne(t,e){return e._meridiemParse}W("H",["HH",2],0,"hour"),W("h",["hh",2],0,te),W("k",["kk",2],0,function(){return this.hours()||24}),W("hmm",0,0,function(){return""+te.apply(this)+F(this.minutes(),2)}),W("hmmss",0,0,function(){return""+te.apply(this)+F(this.minutes(),2)+F(this.seconds(),2)}),W("Hmm",0,0,function(){return""+this.hours()+F(this.minutes(),2)}),W("Hmmss",0,0,function(){return""+this.hours()+F(this.minutes(),2)+F(this.seconds(),2)}),ee("a",!0),ee("A",!1),A("hour","h"),H("hour",13),ct("a",ne),ct("A",ne),ct("H",Z),ct("h",Z),ct("k",Z),ct("HH",Z,q),ct("hh",Z,q),ct("kk",Z,q),ct("hmm",$),ct("hmmss",tt),ct("Hmm",$),ct("Hmmss",tt),ft(["H","HH"],bt),ft(["k","kk"],function(t,e,n){var r=k(t);e[bt]=24===r?0:r}),ft(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),ft(["h","hh"],function(t,e,n){e[bt]=k(t),f(n).bigHour=!0}),ft("hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r)),f(n).bigHour=!0}),ft("hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i)),f(n).bigHour=!0}),ft("Hmm",function(t,e,n){var r=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r))}),ft("Hmmss",function(t,e,n){var r=t.length-4,i=t.length-2;e[bt]=k(t.substr(0,r)),e[wt]=k(t.substr(r,2)),e[Mt]=k(t.substr(i))});var re,ie=Dt("Hours",!0),oe={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:jt,monthsShort:It,week:{dow:0,doy:6},weekdays:Jt,weekdaysMin:Qt,weekdaysShort:qt,meridiemParse:/[ap]\.?m?\.?/i},se={},le={};function ae(t){return t?t.toLowerCase().replace("_","-"):t}function ue(e){var r=null;if(!se[e]&&"undefined"!=typeof t&&t&&t.exports)try{r=re._abbr,n("uslO")("./"+e),ce(r)}catch(t){}return se[e]}function ce(t,e){var n;return t&&((n=l(e)?he(t):de(t,e))?re=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+t+" not found. Did you forget to load it?")),re._abbr}function de(t,e){if(null!==e){var n,r=oe;if(e.abbr=t,null!=se[t])O("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=se[t]._config;else if(null!=e.parentLocale)if(null!=se[e.parentLocale])r=se[e.parentLocale]._config;else{if(null==(n=ue(e.parentLocale)))return le[e.parentLocale]||(le[e.parentLocale]=[]),le[e.parentLocale].push({name:t,config:e}),null;r=n._config}return se[t]=new P(Y(r,e)),le[t]&&le[t].forEach(function(t){de(t.name,t.config)}),ce(t),se[t]}return delete se[t],null}function he(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return re;if(!o(t)){if(e=ue(t))return e;t=[t]}return function(t){for(var e,n,r,i,o=0;o0;){if(r=ue(i.slice(0,e).join("-")))return r;if(n&&n.length>=e&&x(i,n,!0)>=e-1)break;e--}o++}return re}(t)}function pe(t){var e,n=t._a;return n&&-2===f(t).overflow&&(e=n[yt]<0||n[yt]>11?yt:n[vt]<1||n[vt]>Et(n[gt],n[yt])?vt:n[bt]<0||n[bt]>24||24===n[bt]&&(0!==n[wt]||0!==n[Mt]||0!==n[kt])?bt:n[wt]<0||n[wt]>59?wt:n[Mt]<0||n[Mt]>59?Mt:n[kt]<0||n[kt]>999?kt:-1,f(t)._overflowDayOfYear&&(evt)&&(e=vt),f(t)._overflowWeeks&&-1===e&&(e=xt),f(t)._overflowWeekday&&-1===e&&(e=Lt),f(t).overflow=e),t}function fe(t,e,n){return null!=t?t:null!=e?e:n}function _e(t){var e,n,r,o,s,l=[];if(!t._d){for(r=function(t){var e=new Date(i.now());return t._useUTC?[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()]:[e.getFullYear(),e.getMonth(),e.getDate()]}(t),t._w&&null==t._a[vt]&&null==t._a[yt]&&function(t){var e,n,r,i,o,s,l,a;if(null!=(e=t._w).GG||null!=e.W||null!=e.E)o=1,s=4,n=fe(e.GG,t._a[gt],Ut(Oe(),1,4).year),r=fe(e.W,1),((i=fe(e.E,1))<1||i>7)&&(a=!0);else{o=t._locale._week.dow,s=t._locale._week.doy;var u=Ut(Oe(),o,s);n=fe(e.gg,t._a[gt],u.year),r=fe(e.w,u.week),null!=e.d?((i=e.d)<0||i>6)&&(a=!0):null!=e.e?(i=e.e+o,(e.e<0||e.e>6)&&(a=!0)):i=o}r<1||r>Gt(n,o,s)?f(t)._overflowWeeks=!0:null!=a?f(t)._overflowWeekday=!0:(l=Wt(n,r,i,o,s),t._a[gt]=l.year,t._dayOfYear=l.dayOfYear)}(t),null!=t._dayOfYear&&(s=fe(t._a[gt],r[gt]),(t._dayOfYear>Ct(s)||0===t._dayOfYear)&&(f(t)._overflowDayOfYear=!0),n=Bt(s,0,t._dayOfYear),t._a[yt]=n.getUTCMonth(),t._a[vt]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=l[e]=r[e];for(;e<7;e++)t._a[e]=l[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[bt]&&0===t._a[wt]&&0===t._a[Mt]&&0===t._a[kt]&&(t._nextDay=!0,t._a[bt]=0),t._d=(t._useUTC?Bt:function(t,e,n,r,i,o,s){var l=new Date(t,e,n,r,i,o,s);return t<100&&t>=0&&isFinite(l.getFullYear())&&l.setFullYear(t),l}).apply(null,l),o=t._useUTC?t._d.getUTCDay():t._d.getDay(),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[bt]=24),t._w&&"undefined"!=typeof t._w.d&&t._w.d!==o&&(f(t).weekdayMismatch=!0)}}var me=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ge=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,ye=/Z|[+-]\d\d(?::?\d\d)?/,ve=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],be=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],we=/^\/?Date\((\-?\d+)/i;function Me(t){var e,n,r,i,o,s,l=t._i,a=me.exec(l)||ge.exec(l);if(a){for(f(t).iso=!0,e=0,n=ve.length;e0&&f(t).unusedInput.push(s),l=l.slice(l.indexOf(n)+n.length),u+=n.length),z[o]?(n?f(t).empty=!1:f(t).unusedTokens.push(o),mt(o,n,t)):t._strict&&!n&&f(t).unusedTokens.push(o);f(t).charsLeftOver=a-u,l.length>0&&f(t).unusedInput.push(l),t._a[bt]<=12&&!0===f(t).bigHour&&t._a[bt]>0&&(f(t).bigHour=void 0),f(t).parsedDateParts=t._a.slice(0),f(t).meridiem=t._meridiem,t._a[bt]=(c=t._locale,d=t._a[bt],null==(h=t._meridiem)?d:null!=c.meridiemHour?c.meridiemHour(d,h):null!=c.isPM?((p=c.isPM(h))&&d<12&&(d+=12),p||12!==d||(d=0),d):d),_e(t),pe(t)}else Le(t);else Me(t);var c,d,h,p}function Se(t){var e=t._i,n=t._f;return t._locale=t._locale||he(t._l),null===e||void 0===n&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),w(e)?new b(pe(e)):(u(e)?t._d=e:o(n)?function(t){var e,n,r,i,o;if(0===t._f.length)return f(t).invalidFormat=!0,void(t._d=new Date(NaN));for(i=0;ithis?this:t:m()});function Pe(t,e){var n,r;if(1===e.length&&o(e[0])&&(e=e[0]),!e.length)return Oe();for(n=e[0],r=1;r(o=Gt(t,r,i))&&(e=o),(function(t,e,n,r,i){var o=Wt(t,e,n,r,i),s=Bt(o.year,0,o.dayOfYear);return this.year(s.getUTCFullYear()),this.month(s.getUTCMonth()),this.date(s.getUTCDate()),this}).call(this,t,e,n,r,i))}W(0,["gg",2],0,function(){return this.weekYear()%100}),W(0,["GG",2],0,function(){return this.isoWeekYear()%100}),nn("gggg","weekYear"),nn("ggggg","weekYear"),nn("GGGG","isoWeekYear"),nn("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),H("weekYear",1),H("isoWeekYear",1),ct("G",ot),ct("g",ot),ct("GG",Z,q),ct("gg",Z,q),ct("GGGG",nt,K),ct("gggg",nt,K),ct("GGGGG",rt,X),ct("ggggg",rt,X),_t(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,r){e[r.substr(0,2)]=k(t)}),_t(["gg","GG"],function(t,e,n,r){e[r]=i.parseTwoDigitYear(t)}),W("Q",0,"Qo","quarter"),A("quarter","Q"),H("quarter",7),ct("Q",J),ft("Q",function(t,e){e[yt]=3*(k(t)-1)}),W("D",["DD",2],"Do","date"),A("date","D"),H("date",9),ct("D",Z),ct("DD",Z,q),ct("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),ft(["D","DD"],vt),ft("Do",function(t,e){e[vt]=k(t.match(Z)[0])});var on=Dt("Date",!0);W("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),H("dayOfYear",4),ct("DDD",et),ct("DDDD",Q),ft(["DDD","DDDD"],function(t,e,n){n._dayOfYear=k(t)}),W("m",["mm",2],0,"minute"),A("minute","m"),H("minute",14),ct("m",Z),ct("mm",Z,q),ft(["m","mm"],wt);var sn=Dt("Minutes",!1);W("s",["ss",2],0,"second"),A("second","s"),H("second",15),ct("s",Z),ct("ss",Z,q),ft(["s","ss"],Mt);var ln,an=Dt("Seconds",!1);for(W("S",0,0,function(){return~~(this.millisecond()/100)}),W(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),W(0,["SSS",3],0,"millisecond"),W(0,["SSSS",4],0,function(){return 10*this.millisecond()}),W(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),W(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),W(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),W(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),W(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),H("millisecond",16),ct("S",et,J),ct("SS",et,q),ct("SSS",et,Q),ln="SSSS";ln.length<=9;ln+="S")ct(ln,it);function un(t,e){e[kt]=k(1e3*("0."+t))}for(ln="S";ln.length<=9;ln+="S")ft(ln,un);var cn=Dt("Milliseconds",!1);W("z",0,0,"zoneAbbr"),W("zz",0,0,"zoneName");var dn=b.prototype;function hn(t){return t}dn.add=Ke,dn.calendar=function(t,e){var n=t||Oe(),r=Ne(n,this).startOf("day"),o=i.calendarFormat(this,r)||"sameElse",s=e&&(D(e[o])?e[o].call(this,n):e[o]);return this.format(s||this.localeData().calendar(o,this,Oe(n)))},dn.clone=function(){return new b(this)},dn.diff=function(t,e,n){var r,i,o;if(!this.isValid())return NaN;if(!(r=Ne(t,this)).isValid())return NaN;switch(i=6e4*(r.utcOffset()-this.utcOffset()),e=j(e)){case"year":o=Ze(this,r)/12;break;case"month":o=Ze(this,r);break;case"quarter":o=Ze(this,r)/3;break;case"second":o=(this-r)/1e3;break;case"minute":o=(this-r)/6e4;break;case"hour":o=(this-r)/36e5;break;case"day":o=(this-r-i)/864e5;break;case"week":o=(this-r-i)/6048e5;break;default:o=this-r}return n?o:M(o)},dn.endOf=function(t){return void 0===(t=j(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))},dn.format=function(t){t||(t=this.isUtc()?i.defaultFormatUtc:i.defaultFormat);var e=U(this,t);return this.localeData().postformat(e)},dn.from=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Oe(t).isValid())?Ue({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.fromNow=function(t){return this.from(Oe(),t)},dn.to=function(t,e){return this.isValid()&&(w(t)&&t.isValid()||Oe(t).isValid())?Ue({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()},dn.toNow=function(t){return this.to(Oe(),t)},dn.get=function(t){return D(this[t=j(t)])?this[t]():this},dn.invalidAt=function(){return f(this).overflow},dn.isAfter=function(t,e){var n=w(t)?t:Oe(t);return!(!this.isValid()||!n.isValid())&&("millisecond"===(e=j(l(e)?"millisecond":e))?this.valueOf()>n.valueOf():n.valueOf()9999?U(n,e?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):D(Date.prototype.toISOString)?e?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",U(n,"Z")):U(n,e?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},dn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var n="["+t+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY";return this.format(n+r+"-MM-DD[T]HH:mm:ss.SSS"+e+'[")]')},dn.toJSON=function(){return this.isValid()?this.toISOString():null},dn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},dn.unix=function(){return Math.floor(this.valueOf()/1e3)},dn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},dn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},dn.year=Ot,dn.isLeapYear=function(){return St(this.year())},dn.weekYear=function(t){return rn.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},dn.isoWeekYear=function(t){return rn.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)},dn.quarter=dn.quarters=function(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)},dn.month=Ht,dn.daysInMonth=function(){return Et(this.year(),this.month())},dn.week=dn.weeks=function(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")},dn.isoWeek=dn.isoWeeks=function(t){var e=Ut(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")},dn.weeksInYear=function(){var t=this.localeData()._week;return Gt(this.year(),t.dow,t.doy)},dn.isoWeeksInYear=function(){return Gt(this.year(),1,4)},dn.date=on,dn.day=dn.days=function(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=function(t,e){return"string"!=typeof t?t:isNaN(t)?"number"==typeof(t=e.weekdaysParse(t))?t:null:parseInt(t,10)}(t,this.localeData()),this.add(t-e,"d")):e},dn.weekday=function(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")},dn.isoWeekday=function(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=function(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7},dn.dayOfYear=function(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")},dn.hour=dn.hours=ie,dn.minute=dn.minutes=sn,dn.second=dn.seconds=an,dn.millisecond=dn.milliseconds=cn,dn.utcOffset=function(t,e,n){var r,o=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Fe(lt,t)))return this}else Math.abs(t)<16&&!n&&(t*=60);return!this._isUTC&&e&&(r=Ve(this)),this._offset=t,this._isUTC=!0,null!=r&&this.add(r,"m"),o!==t&&(!e||this._changeInProgress?Qe(this,Ue(t-o,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,i.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?o:Ve(this)},dn.utc=function(t){return this.utcOffset(0,t)},dn.local=function(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Ve(this),"m")),this},dn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=Fe(st,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this},dn.hasAlignedHourOffset=function(t){return!!this.isValid()&&(t=t?Oe(t).utcOffset():0,(this.utcOffset()-t)%60==0)},dn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},dn.isLocal=function(){return!!this.isValid()&&!this._isUTC},dn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},dn.isUtc=Be,dn.isUTC=Be,dn.zoneAbbr=function(){return this._isUTC?"UTC":""},dn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},dn.dates=C("dates accessor is deprecated. Use date instead.",on),dn.months=C("months accessor is deprecated. Use month instead",Ht),dn.years=C("years accessor is deprecated. Use year instead",Ot),dn.zone=C("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}),dn.isDSTShifted=C("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var t={};if(y(t,this),(t=Se(t))._a){var e=t._isUTC?p(t._a):Oe(t._a);this._isDSTShifted=this.isValid()&&x(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var pn=P.prototype;function fn(t,e,n,r){var i=he(),o=p().set(r,e);return i[n](o,t)}function _n(t,e,n){if(a(t)&&(e=t,t=void 0),t=t||"",null!=e)return fn(t,e,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=fn(t,r,n,"month");return i}function mn(t,e,n,r){"boolean"==typeof t?(a(e)&&(n=e,e=void 0),e=e||""):(n=e=t,t=!1,a(e)&&(n=e,e=void 0),e=e||"");var i,o=he(),s=t?o._week.dow:0;if(null!=n)return fn(e,(n+s)%7,r,"day");var l=[];for(i=0;i<7;i++)l[i]=fn(e,(i+s)%7,r,"day");return l}pn.calendar=function(t,e,n){var r=this._calendar[t]||this._calendar.sameElse;return D(r)?r.call(e,n):r},pn.longDateFormat=function(t){var e=this._longDateFormat[t],n=this._longDateFormat[t.toUpperCase()];return e||!n?e:(this._longDateFormat[t]=n.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])},pn.invalidDate=function(){return this._invalidDate},pn.ordinal=function(t){return this._ordinal.replace("%d",t)},pn.preparse=hn,pn.postformat=hn,pn.relativeTime=function(t,e,n,r){var i=this._relativeTime[n];return D(i)?i(t,e,n,r):i.replace(/%d/i,t)},pn.pastFuture=function(t,e){var n=this._relativeTime[t>0?"future":"past"];return D(n)?n(e):n.replace(/%s/i,e)},pn.set=function(t){var e,n;for(n in t)D(e=t[n])?this[n]=e:this["_"+n]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},pn.months=function(t,e){return t?o(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||At).test(e)?"format":"standalone"][t.month()]:o(this._months)?this._months:this._months.standalone},pn.monthsShort=function(t,e){return t?o(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[At.test(e)?"format":"standalone"][t.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},pn.monthsParse=function(t,e,n){var r,i,o;if(this._monthsParseExact)return(function(t,e,n){var r,i,o,s=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],r=0;r<12;++r)o=p([2e3,r]),this._shortMonthsParse[r]=this.monthsShort(o,"").toLocaleLowerCase(),this._longMonthsParse[r]=this.months(o,"").toLocaleLowerCase();return n?"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,s))?i:null:-1!==(i=Tt.call(this._longMonthsParse,s))?i:null:"MMM"===e?-1!==(i=Tt.call(this._shortMonthsParse,s))?i:-1!==(i=Tt.call(this._longMonthsParse,s))?i:null:-1!==(i=Tt.call(this._longMonthsParse,s))?i:-1!==(i=Tt.call(this._shortMonthsParse,s))?i:null}).call(this,t,e,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),r=0;r<12;r++){if(i=p([2e3,r]),n&&!this._longMonthsParse[r]&&(this._longMonthsParse[r]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[r]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[r]||(o="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[r]=new RegExp(o.replace(".",""),"i")),n&&"MMMM"===e&&this._longMonthsParse[r].test(t))return r;if(n&&"MMM"===e&&this._shortMonthsParse[r].test(t))return r;if(!n&&this._monthsParse[r].test(t))return r}},pn.monthsRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Nt),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)},pn.monthsShortRegex=function(t){return this._monthsParseExact?(d(this,"_monthsRegex")||Vt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=Ft),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)},pn.week=function(t){return Ut(t,this._week.dow,this._week.doy).week},pn.firstDayOfYear=function(){return this._week.doy},pn.firstDayOfWeek=function(){return this._week.dow},pn.weekdays=function(t,e){return t?o(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},pn.weekdaysMin=function(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin},pn.weekdaysShort=function(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort},pn.weekdaysParse=function(t,e,n){var r,i,o;if(this._weekdaysParseExact)return(function(t,e,n){var r,i,o,s=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)o=p([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,s))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:"dddd"===e?-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:"ddd"===e?-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:null:-1!==(i=Tt.call(this._minWeekdaysParse,s))?i:-1!==(i=Tt.call(this._weekdaysParse,s))?i:-1!==(i=Tt.call(this._shortWeekdaysParse,s))?i:null}).call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=p([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[r]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[r].test(t))return r;if(n&&"ddd"===e&&this._shortWeekdaysParse[r].test(t))return r;if(n&&"dd"===e&&this._minWeekdaysParse[r].test(t))return r;if(!n&&this._weekdaysParse[r].test(t))return r}},pn.weekdaysRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=Kt),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)},pn.weekdaysShortRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Xt),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},pn.weekdaysMinRegex=function(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||$t.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Zt),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},pn.isPM=function(t){return"p"===(t+"").toLowerCase().charAt(0)},pn.meridiem=function(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"},ce("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===k(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),i.lang=C("moment.lang is deprecated. Use moment.locale instead.",ce),i.langData=C("moment.langData is deprecated. Use moment.localeData instead.",he);var gn=Math.abs;function yn(t,e,n,r){var i=Ue(e,n);return t._milliseconds+=r*i._milliseconds,t._days+=r*i._days,t._months+=r*i._months,t._bubble()}function vn(t){return t<0?Math.floor(t):Math.ceil(t)}function bn(t){return 4800*t/146097}function wn(t){return 146097*t/4800}function Mn(t){return function(){return this.as(t)}}var kn=Mn("ms"),xn=Mn("s"),Ln=Mn("m"),Cn=Mn("h"),Sn=Mn("d"),Tn=Mn("w"),On=Mn("M"),Dn=Mn("y");function Yn(t){return function(){return this.isValid()?this._data[t]:NaN}}var Pn=Yn("milliseconds"),En=Yn("seconds"),An=Yn("minutes"),jn=Yn("hours"),In=Yn("days"),Rn=Yn("months"),Hn=Yn("years"),Fn=Math.round,Nn={ss:44,s:45,m:45,h:22,d:26,M:11},Vn=Math.abs;function Bn(t){return(t>0)-(t<0)||+t}function zn(){if(!this.isValid())return this.localeData().invalidDate();var t,e,n=Vn(this._milliseconds)/1e3,r=Vn(this._days),i=Vn(this._months);e=M((t=M(n/60))/60),n%=60,t%=60;var o=M(i/12),s=i%=12,l=r,a=e,u=t,c=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var h=d<0?"-":"",p=Bn(this._months)!==Bn(d)?"-":"",f=Bn(this._days)!==Bn(d)?"-":"",_=Bn(this._milliseconds)!==Bn(d)?"-":"";return h+"P"+(o?p+o+"Y":"")+(s?p+s+"M":"")+(l?f+l+"D":"")+(a||u||c?"T":"")+(a?_+a+"H":"")+(u?_+u+"M":"")+(c?_+c+"S":"")}var Wn=Ae.prototype;return Wn.isValid=function(){return this._isValid},Wn.abs=function(){var t=this._data;return this._milliseconds=gn(this._milliseconds),this._days=gn(this._days),this._months=gn(this._months),t.milliseconds=gn(t.milliseconds),t.seconds=gn(t.seconds),t.minutes=gn(t.minutes),t.hours=gn(t.hours),t.months=gn(t.months),t.years=gn(t.years),this},Wn.add=function(t,e){return yn(this,t,e,1)},Wn.subtract=function(t,e){return yn(this,t,e,-1)},Wn.as=function(t){if(!this.isValid())return NaN;var e,n,r=this._milliseconds;if("month"===(t=j(t))||"year"===t)return n=this._months+bn(e=this._days+r/864e5),"month"===t?n:n/12;switch(e=this._days+Math.round(wn(this._months)),t){case"week":return e/7+r/6048e5;case"day":return e+r/864e5;case"hour":return 24*e+r/36e5;case"minute":return 1440*e+r/6e4;case"second":return 86400*e+r/1e3;case"millisecond":return Math.floor(864e5*e)+r;default:throw new Error("Unknown unit "+t)}},Wn.asMilliseconds=kn,Wn.asSeconds=xn,Wn.asMinutes=Ln,Wn.asHours=Cn,Wn.asDays=Sn,Wn.asWeeks=Tn,Wn.asMonths=On,Wn.asYears=Dn,Wn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},Wn._bubble=function(){var t,e,n,r,i,o=this._milliseconds,s=this._days,l=this._months,a=this._data;return o>=0&&s>=0&&l>=0||o<=0&&s<=0&&l<=0||(o+=864e5*vn(wn(l)+s),s=0,l=0),a.milliseconds=o%1e3,t=M(o/1e3),a.seconds=t%60,e=M(t/60),a.minutes=e%60,n=M(e/60),a.hours=n%24,l+=i=M(bn(s+=M(n/24))),s-=vn(wn(i)),r=M(l/12),l%=12,a.days=s,a.months=l,a.years=r,this},Wn.clone=function(){return Ue(this)},Wn.get=function(t){return t=j(t),this.isValid()?this[t+"s"]():NaN},Wn.milliseconds=Pn,Wn.seconds=En,Wn.minutes=An,Wn.hours=jn,Wn.days=In,Wn.weeks=function(){return M(this.days()/7)},Wn.months=Rn,Wn.years=Hn,Wn.humanize=function(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),n=function(t,e,n){var r=Ue(t).abs(),i=Fn(r.as("s")),o=Fn(r.as("m")),s=Fn(r.as("h")),l=Fn(r.as("d")),a=Fn(r.as("M")),u=Fn(r.as("y")),c=i<=Nn.ss&&["s",i]||i0,c[4]=n,(function(t,e,n,r,i){return i.relativeTime(e||1,!!n,t,r)}).apply(null,c)}(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)},Wn.toISOString=zn,Wn.toString=zn,Wn.toJSON=zn,Wn.locale=$e,Wn.localeData=en,Wn.toIsoString=C("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zn),Wn.lang=tn,W("X",0,0,"unix"),W("x",0,0,"valueOf"),ct("x",ot),ct("X",/[+-]?\d+(\.\d{1,3})?/),ft("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),ft("x",function(t,e,n){n._d=new Date(k(t))}),i.version="2.21.0",e=Oe,i.fn=dn,i.min=function(){return Pe("isBefore",[].slice.call(arguments,0))},i.max=function(){return Pe("isAfter",[].slice.call(arguments,0))},i.now=function(){return Date.now?Date.now():+new Date},i.utc=p,i.unix=function(t){return Oe(1e3*t)},i.months=function(t,e){return _n(t,e,"months")},i.isDate=u,i.locale=ce,i.invalid=m,i.duration=Ue,i.isMoment=w,i.weekdays=function(t,e,n){return mn(t,e,n,"weekdays")},i.parseZone=function(){return Oe.apply(null,arguments).parseZone()},i.localeData=he,i.isDuration=je,i.monthsShort=function(t,e){return _n(t,e,"monthsShort")},i.weekdaysMin=function(t,e,n){return mn(t,e,n,"weekdaysMin")},i.defineLocale=de,i.updateLocale=function(t,e){if(null!=e){var n,r,i=oe;null!=(r=ue(t))&&(i=r._config),(n=new P(e=Y(i,e))).parentLocale=se[t],se[t]=n,ce(t)}else null!=se[t]&&(null!=se[t].parentLocale?se[t]=se[t].parentLocale:null!=se[t]&&delete se[t]);return se[t]},i.locales=function(){return S(se)},i.weekdaysShort=function(t,e,n){return mn(t,e,n,"weekdaysShort")},i.normalizeUnits=j,i.relativeTimeRounding=function(t){return void 0===t?Fn:"function"==typeof t&&(Fn=t,!0)},i.relativeTimeThreshold=function(t,e){return void 0!==Nn[t]&&(void 0===e?Nn[t]:(Nn[t]=e,"s"===t&&(Nn.ss=e-1),!0))},i.calendarFormat=function(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},i.prototype=dn,i.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},i}()}).call(e,n("3IRH")(t))},QZk1:function(t,e,n){!function(t){"use strict";t.defineLocale("en-il",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},Qnch:function(t,e,n){"use strict";e.a=function(t,e,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof e&&(n=e,e=null),r.lift(new s(t,e,n))}};var r=n("TToO"),i=n("PIsA"),o=n("tZ2B"),s=function(){function t(t,e,n){void 0===n&&(n=Number.POSITIVE_INFINITY),this.project=t,this.resultSelector=e,this.concurrent=n}return t.prototype.call=function(t,e){return e.subscribe(new l(t,this.project,this.resultSelector,this.concurrent))},t}(),l=function(t){function e(e,n,r,i){void 0===i&&(i=Number.POSITIVE_INFINITY),t.call(this,e),this.project=n,this.resultSelector=r,this.concurrent=i,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}return Object(r.__extends)(e,t),e.prototype._next=function(t){this.active0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(o.a)},RMhj:function(t,e,n){var r={"./en.json":["TKku",0]};function i(t){var e=r[t];return e?n.e(e[1]).then(function(){return n(e[0])}):Promise.reject(new Error("Cannot find module '"+t+"'."))}i.keys=function(){return Object.keys(r)},i.id="RMhj",t.exports=i},Rf9G:function(t,e,n){"use strict";e.a=function(){return Object(r.a)()(this)};var r=n("3a3m")},RnJI:function(t,e,n){!function(t){"use strict";t.defineLocale("ka",{months:{standalone:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10d8_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10d8_\u10db\u10d0\u10e0\u10e2\u10d8_\u10d0\u10de\u10e0\u10d8\u10da\u10d8_\u10db\u10d0\u10d8\u10e1\u10d8_\u10d8\u10d5\u10dc\u10d8\u10e1\u10d8_\u10d8\u10d5\u10da\u10d8\u10e1\u10d8_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10dd_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10d8_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10d8_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10d8".split("_"),format:"\u10d8\u10d0\u10dc\u10d5\u10d0\u10e0\u10e1_\u10d7\u10d4\u10d1\u10d4\u10e0\u10d5\u10d0\u10da\u10e1_\u10db\u10d0\u10e0\u10e2\u10e1_\u10d0\u10de\u10e0\u10d8\u10da\u10d8\u10e1_\u10db\u10d0\u10d8\u10e1\u10e1_\u10d8\u10d5\u10dc\u10d8\u10e1\u10e1_\u10d8\u10d5\u10da\u10d8\u10e1\u10e1_\u10d0\u10d2\u10d5\u10d8\u10e1\u10e2\u10e1_\u10e1\u10d4\u10e5\u10e2\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10dd\u10e5\u10e2\u10dd\u10db\u10d1\u10d4\u10e0\u10e1_\u10dc\u10dd\u10d4\u10db\u10d1\u10d4\u10e0\u10e1_\u10d3\u10d4\u10d9\u10d4\u10db\u10d1\u10d4\u10e0\u10e1".split("_")},monthsShort:"\u10d8\u10d0\u10dc_\u10d7\u10d4\u10d1_\u10db\u10d0\u10e0_\u10d0\u10de\u10e0_\u10db\u10d0\u10d8_\u10d8\u10d5\u10dc_\u10d8\u10d5\u10da_\u10d0\u10d2\u10d5_\u10e1\u10d4\u10e5_\u10dd\u10e5\u10e2_\u10dc\u10dd\u10d4_\u10d3\u10d4\u10d9".split("_"),weekdays:{standalone:"\u10d9\u10d5\u10d8\u10e0\u10d0_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10d8_\u10e8\u10d0\u10d1\u10d0\u10d7\u10d8".split("_"),format:"\u10d9\u10d5\u10d8\u10e0\u10d0\u10e1_\u10dd\u10e0\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10e1\u10d0\u10db\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10dd\u10d7\u10ee\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10ee\u10e3\u10d7\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1_\u10de\u10d0\u10e0\u10d0\u10e1\u10d9\u10d4\u10d5\u10e1_\u10e8\u10d0\u10d1\u10d0\u10d7\u10e1".split("_"),isFormat:/(\u10ec\u10d8\u10dc\u10d0|\u10e8\u10d4\u10db\u10d3\u10d4\u10d2)/},weekdaysShort:"\u10d9\u10d5\u10d8_\u10dd\u10e0\u10e8_\u10e1\u10d0\u10db_\u10dd\u10d7\u10ee_\u10ee\u10e3\u10d7_\u10de\u10d0\u10e0_\u10e8\u10d0\u10d1".split("_"),weekdaysMin:"\u10d9\u10d5_\u10dd\u10e0_\u10e1\u10d0_\u10dd\u10d7_\u10ee\u10e3_\u10de\u10d0_\u10e8\u10d0".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[\u10d3\u10e6\u10d4\u10e1] LT[-\u10d6\u10d4]",nextDay:"[\u10ee\u10d5\u10d0\u10da] LT[-\u10d6\u10d4]",lastDay:"[\u10d2\u10e3\u10e8\u10d8\u10dc] LT[-\u10d6\u10d4]",nextWeek:"[\u10e8\u10d4\u10db\u10d3\u10d4\u10d2] dddd LT[-\u10d6\u10d4]",lastWeek:"[\u10ec\u10d8\u10dc\u10d0] dddd LT-\u10d6\u10d4",sameElse:"L"},relativeTime:{future:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10ec\u10d4\u10da\u10d8)/.test(t)?t.replace(/\u10d8$/,"\u10e8\u10d8"):t+"\u10e8\u10d8"},past:function(t){return/(\u10ec\u10d0\u10db\u10d8|\u10ec\u10e3\u10d7\u10d8|\u10e1\u10d0\u10d0\u10d7\u10d8|\u10d3\u10e6\u10d4|\u10d7\u10d5\u10d4)/.test(t)?t.replace(/(\u10d8|\u10d4)$/,"\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):/\u10ec\u10d4\u10da\u10d8/.test(t)?t.replace(/\u10ec\u10d4\u10da\u10d8$/,"\u10ec\u10da\u10d8\u10e1 \u10e3\u10d9\u10d0\u10dc"):void 0},s:"\u10e0\u10d0\u10db\u10d3\u10d4\u10dc\u10d8\u10db\u10d4 \u10ec\u10d0\u10db\u10d8",ss:"%d \u10ec\u10d0\u10db\u10d8",m:"\u10ec\u10e3\u10d7\u10d8",mm:"%d \u10ec\u10e3\u10d7\u10d8",h:"\u10e1\u10d0\u10d0\u10d7\u10d8",hh:"%d \u10e1\u10d0\u10d0\u10d7\u10d8",d:"\u10d3\u10e6\u10d4",dd:"%d \u10d3\u10e6\u10d4",M:"\u10d7\u10d5\u10d4",MM:"%d \u10d7\u10d5\u10d4",y:"\u10ec\u10d4\u10da\u10d8",yy:"%d \u10ec\u10d4\u10da\u10d8"},dayOfMonthOrdinalParse:/0|1-\u10da\u10d8|\u10db\u10d4-\d{1,2}|\d{1,2}-\u10d4/,ordinal:function(t){return 0===t?t:1===t?t+"-\u10da\u10d8":t<20||t<=100&&t%20==0||t%100==0?"\u10db\u10d4-"+t:t+"-\u10d4"},week:{dow:1,doy:7}})}(n("PJh5"))},Sjoy:function(t,e,n){!function(t){"use strict";t.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},TILf:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(e,n){t.call(this),this.value=e,this.scheduler=n,this._isScalar=!0,n&&(this._isScalar=!1)}return Object(r.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){var e=t.value,n=t.subscriber;t.done?n.complete():(n.next(e),n.closed||(t.done=!0,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.value,r=this.scheduler;if(r)return r.schedule(e.dispatch,0,{done:!1,value:n,subscriber:t});t.next(n),t.closed||t.complete()},e}(n("YaPU").a)},TToO:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.__extends=function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)},n.d(e,"__assign",function(){return i}),e.__rest=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(r=Object.getOwnPropertySymbols(t);i=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},e.__param=function(t,e){return function(n,r){e(n,r,t)}},e.__metadata=function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},e.__awaiter=function(t,e,n,r){return new(n||(n=Promise))(function(i,o){function s(t){try{a(r.next(t))}catch(t){o(t)}}function l(t){try{a(r.throw(t))}catch(t){o(t)}}function a(t){t.done?i(t.value):new n(function(e){e(t.value)}).then(s,l)}a((r=r.apply(t,e||[])).next())})},e.__generator=function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:l(0),throw:l(1),return:l(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function l(o){return function(l){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=r[2&o[0]?"return":o[0]?"throw":"next"])&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[0,i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=(i=s.trys).length>0&&i[i.length-1])&&(6===o[0]||2===o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]1||a(t,e)})})}function a(t,e){try{(n=i[t](e)).value instanceof l?Promise.resolve(n.value.v).then(u,c):d(o[0][2],n)}catch(t){d(o[0][3],t)}var n}function u(t){a("next",t)}function c(t){a("throw",t)}function d(t,e){t(e),o.shift(),o.length&&a(o[0][0],o[0][1])}},e.__asyncDelegator=function(t){var e,n;return e={},r("next"),r("throw",function(t){throw t}),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,i){t[r]&&(e[r]=function(e){return(n=!n)?{value:l(t[r](e)),done:"return"===r}:i?i(e):e})}},e.__asyncValues=function(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=t[Symbol.asyncIterator];return e?e.call(t):"function"==typeof o?o(t):t[Symbol.iterator]()},e.__makeTemplateObject=function(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t};var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])},i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}}}function s(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,i,o=n.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(r=o.next()).done;)s.push(r.value)}catch(t){i={error:t}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return s}function l(t){return this instanceof l?(this.v=t,this):new l(t)}},To0v:function(t,e,n){!function(t){"use strict";t.defineLocale("ug-cn",{months:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),monthsShort:"\u064a\u0627\u0646\u06cb\u0627\u0631_\u0641\u06d0\u06cb\u0631\u0627\u0644_\u0645\u0627\u0631\u062a_\u0626\u0627\u067e\u0631\u06d0\u0644_\u0645\u0627\u064a_\u0626\u0649\u064a\u06c7\u0646_\u0626\u0649\u064a\u06c7\u0644_\u0626\u0627\u06cb\u063a\u06c7\u0633\u062a_\u0633\u06d0\u0646\u062a\u06d5\u0628\u0649\u0631_\u0626\u06c6\u0643\u062a\u06d5\u0628\u0649\u0631_\u0646\u0648\u064a\u0627\u0628\u0649\u0631_\u062f\u06d0\u0643\u0627\u0628\u0649\u0631".split("_"),weekdays:"\u064a\u06d5\u0643\u0634\u06d5\u0646\u0628\u06d5_\u062f\u06c8\u0634\u06d5\u0646\u0628\u06d5_\u0633\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u0686\u0627\u0631\u0634\u06d5\u0646\u0628\u06d5_\u067e\u06d5\u064a\u0634\u06d5\u0646\u0628\u06d5_\u062c\u06c8\u0645\u06d5_\u0634\u06d5\u0646\u0628\u06d5".split("_"),weekdaysShort:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),weekdaysMin:"\u064a\u06d5_\u062f\u06c8_\u0633\u06d5_\u0686\u0627_\u067e\u06d5_\u062c\u06c8_\u0634\u06d5".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649",LLL:"YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm",LLLL:"dddd\u060c YYYY-\u064a\u0649\u0644\u0649M-\u0626\u0627\u064a\u0646\u0649\u06adD-\u0643\u06c8\u0646\u0649\u060c HH:mm"},meridiemParse:/\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5|\u0633\u06d5\u06be\u06d5\u0631|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646|\u0686\u06c8\u0634|\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646|\u0643\u06d5\u0686/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5"===e||"\u0633\u06d5\u06be\u06d5\u0631"===e||"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646"===e?t:"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646"===e||"\u0643\u06d5\u0686"===e?t+12:t>=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u064a\u06d0\u0631\u0649\u0645 \u0643\u06d0\u0686\u06d5":r<900?"\u0633\u06d5\u06be\u06d5\u0631":r<1130?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0628\u06c7\u0631\u06c7\u0646":r<1230?"\u0686\u06c8\u0634":r<1800?"\u0686\u06c8\u0634\u062a\u0649\u0646 \u0643\u06d0\u064a\u0649\u0646":"\u0643\u06d5\u0686"},calendar:{sameDay:"[\u0628\u06c8\u06af\u06c8\u0646 \u0633\u0627\u0626\u06d5\u062a] LT",nextDay:"[\u0626\u06d5\u062a\u06d5 \u0633\u0627\u0626\u06d5\u062a] LT",nextWeek:"[\u0643\u06d0\u0644\u06d5\u0631\u0643\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",lastDay:"[\u062a\u06c6\u0646\u06c8\u06af\u06c8\u0646] LT",lastWeek:"[\u0626\u0627\u0644\u062f\u0649\u0646\u0642\u0649] dddd [\u0633\u0627\u0626\u06d5\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0643\u06d0\u064a\u0649\u0646",past:"%s \u0628\u06c7\u0631\u06c7\u0646",s:"\u0646\u06d5\u0686\u0686\u06d5 \u0633\u06d0\u0643\u0648\u0646\u062a",ss:"%d \u0633\u06d0\u0643\u0648\u0646\u062a",m:"\u0628\u0649\u0631 \u0645\u0649\u0646\u06c7\u062a",mm:"%d \u0645\u0649\u0646\u06c7\u062a",h:"\u0628\u0649\u0631 \u0633\u0627\u0626\u06d5\u062a",hh:"%d \u0633\u0627\u0626\u06d5\u062a",d:"\u0628\u0649\u0631 \u0643\u06c8\u0646",dd:"%d \u0643\u06c8\u0646",M:"\u0628\u0649\u0631 \u0626\u0627\u064a",MM:"%d \u0626\u0627\u064a",y:"\u0628\u0649\u0631 \u064a\u0649\u0644",yy:"%d \u064a\u0649\u0644"},dayOfMonthOrdinalParse:/\d{1,2}(-\u0643\u06c8\u0646\u0649|-\u0626\u0627\u064a|-\u06be\u06d5\u067e\u062a\u06d5)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"-\u0643\u06c8\u0646\u0649";case"w":case"W":return t+"-\u06be\u06d5\u067e\u062a\u06d5";default:return t}},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:7}})}(n("PJh5"))},Tqun:function(t,e,n){!function(t){"use strict";t.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}})}(n("PJh5"))},V0td:function(t,e,n){!function(t){"use strict";t.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_N\xebntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_N\xebn_Dhj".split("_"),weekdays:"E Diel_E H\xebn\xeb_E Mart\xeb_E M\xebrkur\xeb_E Enjte_E Premte_E Shtun\xeb".split("_"),weekdaysShort:"Die_H\xebn_Mar_M\xebr_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_M\xeb_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(t){return"M"===t.charAt(0)},meridiem:function(t,e,n){return t<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot n\xeb] LT",nextDay:"[Nes\xebr n\xeb] LT",nextWeek:"dddd [n\xeb] LT",lastDay:"[Dje n\xeb] LT",lastWeek:"dddd [e kaluar n\xeb] LT",sameElse:"L"},relativeTime:{future:"n\xeb %s",past:"%s m\xeb par\xeb",s:"disa sekonda",ss:"%d sekonda",m:"nj\xeb minut\xeb",mm:"%d minuta",h:"nj\xeb or\xeb",hh:"%d or\xeb",d:"nj\xeb dit\xeb",dd:"%d dit\xeb",M:"nj\xeb muaj",MM:"%d muaj",y:"nj\xeb vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},V4qH:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("hr",{months:{format:"sije\u010dnja_velja\u010de_o\u017eujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"sije\u010danj_velja\u010da_o\u017eujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._o\u017eu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},VK9h:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ch",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},Veqx:function(t,e,n){"use strict";n.d(e,"a",function(){return a});var r=n("TToO"),i=n("YaPU"),o=n("TILf"),s=n("+3/4"),l=n("1Q68"),a=function(t){function e(e,n){t.call(this),this.array=e,this.scheduler=n,n||1!==e.length||(this._isScalar=!0,this.value=e[0])}return Object(r.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.of=function(){for(var t=[],n=0;n1?new e(t,r):1===i?new o.a(t[0],r):new s.a(r)},e.dispatch=function(t){var e=t.array,n=t.index,r=t.subscriber;n>=t.count?r.complete():(r.next(e[n]),r.closed||(t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(e.dispatch,0,{array:n,index:0,count:r,subscriber:t});for(var o=0;o=11?t:t+12},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u5468)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u5468";default:return t}},relativeTime:{future:"%s\u5185",past:"%s\u524d",s:"\u51e0\u79d2",ss:"%d \u79d2",m:"1 \u5206\u949f",mm:"%d \u5206\u949f",h:"1 \u5c0f\u65f6",hh:"%d \u5c0f\u65f6",d:"1 \u5929",dd:"%d \u5929",M:"1 \u4e2a\u6708",MM:"%d \u4e2a\u6708",y:"1 \u5e74",yy:"%d \u5e74"},week:{dow:1,doy:4}})}(n("PJh5"))},WT6e:function(t,e,n){"use strict";(function(t){n.d(e,"g",function(){return oe}),n.d(e,"V",function(){return Zt}),n.d(e,"Y",function(){return $t}),n.d(e,"U",function(){return ee}),n.d(e,"A",function(){return te}),n.d(e,"c",function(){return dt}),n.d(e,"E",function(){return ft}),n.d(e,"D",function(){return _t}),n.d(e,"b",function(){return mt}),n.d(e,"d",function(){return ut}),n.d(e,"e",function(){return ct}),n.d(e,"X",function(){return Ce}),n.d(e,"P",function(){return Wt}),n.d(e,"_0",function(){return Gt}),n.d(e,"w",function(){return Qe}),n.d(e,"f",function(){return $e}),n.d(e,"o",function(){return It}),n.d(e,"n",function(){return st}),n.d(e,"J",function(){return en}),n.d(e,"K",function(){return tn}),n.d(e,"a",function(){return _}),n.d(e,"k",function(){return m}),n.d(e,"t",function(){return y}),n.d(e,"F",function(){return g}),n.d(e,"S",function(){return v}),n.d(e,"Q",function(){return b}),n.d(e,"W",function(){return j}),n.d(e,"s",function(){return N}),n.d(e,"r",function(){return a}),n.d(e,"p",function(){return M}),n.d(e,"C",function(){return k}),n.d(e,"q",function(){return x}),n.d(e,"L",function(){return C}),n.d(e,"B",function(){return Rt}),n.d(e,"G",function(){return ue}),n.d(e,"H",function(){return le}),n.d(e,"I",function(){return ae}),n.d(e,"i",function(){return vt}),n.d(e,"j",function(){return St}),n.d(e,"l",function(){return ce}),n.d(e,"x",function(){return Yt}),n.d(e,"z",function(){return Dt}),n.d(e,"y",function(){return de}),n.d(e,"M",function(){return _e}),n.d(e,"N",function(){return pe}),n.d(e,"O",function(){return ge}),n.d(e,"R",function(){return ye}),n.d(e,"m",function(){return be}),n.d(e,"h",function(){return ve}),n.d(e,"u",function(){return ze}),n.d(e,"v",function(){return We}),n.d(e,"T",function(){return Oe}),n.d(e,"Z",function(){return qe}),n.d(e,"_13",function(){return Ye}),n.d(e,"_2",function(){return gt}),n.d(e,"_1",function(){return Tt}),n.d(e,"_10",function(){return O}),n.d(e,"_16",function(){return E}),n.d(e,"_30",function(){return A}),n.d(e,"_14",function(){return at}),n.d(e,"_15",function(){return lt}),n.d(e,"_3",function(){return Qn}),n.d(e,"_4",function(){return Kn}),n.d(e,"_5",function(){return _r}),n.d(e,"_6",function(){return Mo}),n.d(e,"_7",function(){return bn}),n.d(e,"_8",function(){return Hr}),n.d(e,"_9",function(){return Xn}),n.d(e,"_12",function(){return Jn}),n.d(e,"_18",function(){return sr}),n.d(e,"_19",function(){return or}),n.d(e,"_21",function(){return si}),n.d(e,"_22",function(){return Cr}),n.d(e,"_25",function(){return Fr}),n.d(e,"_28",function(){return Nr}),n.d(e,"_24",function(){return ui}),n.d(e,"_26",function(){return ci}),n.d(e,"_27",function(){return ai}),n.d(e,"_29",function(){return ei}),n.d(e,"_31",function(){return hi}),n.d(e,"_32",function(){return gn}),n.d(e,"_33",function(){return _i}),n.d(e,"_17",function(){return Ke}),n.d(e,"_20",function(){return Xe}),n.d(e,"_23",function(){return Ze}),n.d(e,"_11",function(){return ht});var r=n("TToO"),i=n("YaPU"),o=n("/nXB"),s=n("Rf9G"),l=n("g5jc"),a=function(){function t(t){this._desc=t,this.ngMetadataName="InjectionToken"}return t.prototype.toString=function(){return"InjectionToken "+this._desc},t}(),u="__annotations__",c="__paramaters__",d="__prop__metadata__";function h(t,e,n,r){var i=p(e);function o(t){if(this instanceof o)return i.call(this,t),this;var e=new o(t),n=function(t){return(t.hasOwnProperty(u)?t[u]:Object.defineProperty(t,u,{value:[]})[u]).push(e),t};return r&&r(n),n}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=t,o.annotationCls=o,o}function p(t){return function(){for(var e=[],n=0;n ");else if("object"==typeof e){var i=[];for(var o in e)if(e.hasOwnProperty(o)){var s=e[o];i.push(o+":"+("string"==typeof s?JSON.stringify(s):A(s)))}r="{"+i.join(", ")+"}"}return"StaticInjectorError"+(n?"("+n+")":"")+"["+r+"]: "+t.replace(q,"\n ")}function $(t,e){return new Error(Z(t,e))}var tt="ngDebugContext",et="ngOriginalError",nt="ngErrorLogger";function rt(t){return t[tt]}function it(t){return t[et]}function ot(t){for(var e=[],n=1;n0)t._bootstrapComponents.forEach(function(t){return e.bootstrap(t)});else{if(!t.instance.ngDoBootstrap)throw new Error("The module "+A(t.instance.constructor)+' was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.');t.instance.ngDoBootstrap(e)}this._modules.push(t)},t.prototype.onDestroy=function(t){this._destroyListeners.push(t)},Object.defineProperty(t.prototype,"injector",{get:function(){return this._injector},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){if(this._destroyed)throw new Error("The platform has already been destroyed!");this._modules.slice().forEach(function(t){return t.destroy()}),this._destroyListeners.forEach(function(t){return t()}),this._destroyed=!0},Object.defineProperty(t.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!0,configurable:!0}),t}();function ie(t,e){return Array.isArray(e)?e.reduce(ie,t):Object(r.__assign)({},t,e)}var oe=function(){function t(t,e,n,r,l,a){var u=this;this._zone=t,this._console=e,this._injector=n,this._exceptionHandler=r,this._componentFactoryResolver=l,this._initStatus=a,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._enforceNoNewChanges=!1,this._stable=!0,this.componentTypes=[],this.components=[],this._enforceNoNewChanges=$t(),this._zone.onMicrotaskEmpty.subscribe({next:function(){u._zone.run(function(){u.tick()})}});var c=new i.a(function(t){u._stable=u._zone.isStable&&!u._zone.hasPendingMacrotasks&&!u._zone.hasPendingMicrotasks,u._zone.runOutsideAngular(function(){t.next(u._stable),t.complete()})}),d=new i.a(function(t){var e;u._zone.runOutsideAngular(function(){e=u._zone.onStable.subscribe(function(){Rt.assertNotInAngularZone(),P(function(){u._stable||u._zone.hasPendingMacrotasks||u._zone.hasPendingMicrotasks||(u._stable=!0,t.next(!0))})})});var n=u._zone.onUnstable.subscribe(function(){Rt.assertInAngularZone(),u._stable&&(u._stable=!1,u._zone.runOutsideAngular(function(){t.next(!1)}))});return function(){e.unsubscribe(),n.unsubscribe()}});this.isStable=Object(o.a)(c,s.a.call(d))}return t.prototype.bootstrap=function(t,e){var n,r=this;if(!this._initStatus.done)throw new Error("Cannot bootstrap as there are still asynchronous initializers running. Bootstrap components in the `ngDoBootstrap` method of the root module.");n=t instanceof wt?t:this._componentFactoryResolver.resolveComponentFactory(t),this.componentTypes.push(n.componentType);var i=n instanceof Ot?null:this._injector.get(Dt),o=n.create(N.NULL,[],e||n.selector,i);o.onDestroy(function(){r._unloadComponent(o)});var s=o.injector.get(Wt,null);return s&&o.injector.get(Ut).registerApplication(o.location.nativeElement,s),this._loadComponent(o),$t()&&this._console.log("Angular is running in the development mode. Call enableProdMode() to enable the production mode."),o},t.prototype.tick=function(){var e=this;if(this._runningTick)throw new Error("ApplicationRef.tick is called recursively");var n=t._tickScope();try{this._runningTick=!0,this._views.forEach(function(t){return t.detectChanges()}),this._enforceNoNewChanges&&this._views.forEach(function(t){return t.checkNoChanges()})}catch(t){this._zone.runOutsideAngular(function(){return e._exceptionHandler.handleError(t)})}finally{this._runningTick=!1,jt(n)}},t.prototype.attachView=function(t){var e=t;this._views.push(e),e.attachToAppRef(this)},t.prototype.detachView=function(t){var e=t;se(this._views,e),e.detachFromAppRef()},t.prototype._loadComponent=function(t){this.attachView(t.hostView),this.tick(),this.components.push(t),this._injector.get(mt,[]).concat(this._bootstrapListeners).forEach(function(e){return e(t)})},t.prototype._unloadComponent=function(t){this.detachView(t.hostView),se(this.components,t)},t.prototype.ngOnDestroy=function(){this._views.slice().forEach(function(t){return t.destroy()})},Object.defineProperty(t.prototype,"viewCount",{get:function(){return this._views.length},enumerable:!0,configurable:!0}),t._tickScope=At("ApplicationRef#tick()"),t}();function se(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var le=function(){},ae=function(){var t={Important:1,DashCase:2};return t[t.Important]="Important",t[t.DashCase]="DashCase",t}(),ue=function(){},ce=function(t){this.nativeElement=t},de=function(){},he=function(){function t(){this.dirty=!0,this._results=[],this.changes=new It}return t.prototype.map=function(t){return this._results.map(t)},t.prototype.filter=function(t){return this._results.filter(t)},t.prototype.find=function(t){return this._results.find(t)},t.prototype.reduce=function(t,e){return this._results.reduce(t,e)},t.prototype.forEach=function(t){this._results.forEach(t)},t.prototype.some=function(t){return this._results.some(t)},t.prototype.toArray=function(){return this._results.slice()},t.prototype[Y()]=function(){return this._results[Y()]()},t.prototype.toString=function(){return this._results.toString()},t.prototype.reset=function(t){this._results=function t(e){return e.reduce(function(e,n){var r=Array.isArray(n)?t(n):n;return e.concat(r)},[])}(t),this.dirty=!1,this.length=this._results.length,this.last=this._results[this.length-1],this.first=this._results[0]},t.prototype.notifyOnChanges=function(){this.changes.emit(this)},t.prototype.setDirty=function(){this.dirty=!0},t.prototype.destroy=function(){this.changes.complete(),this.changes.unsubscribe()},t}(),pe=function(){},fe={factoryPathPrefix:"",factoryPathSuffix:".ngfactory"},_e=function(){function t(t,e){this._compiler=t,this._config=e||fe}return t.prototype.load=function(t){return this._compiler instanceof vt?this.loadFactory(t):this.loadAndCompile(t)},t.prototype.loadAndCompile=function(t){var e=this,r=t.split("#"),i=r[0],o=r[1];return void 0===o&&(o="default"),n("Jnfr")(i).then(function(t){return t[o]}).then(function(t){return me(t,i,o)}).then(function(t){return e._compiler.compileModuleAsync(t)})},t.prototype.loadFactory=function(t){var e=t.split("#"),r=e[0],i=e[1],o="NgFactory";return void 0===i&&(i="default",o=""),n("Jnfr")(this._config.factoryPathPrefix+r+this._config.factoryPathSuffix).then(function(t){return t[i+o]}).then(function(t){return me(t,r,i)})},t}();function me(t,e,n){if(!t)throw new Error("Cannot find '"+n+"' in '"+e+"'");return t}var ge=function(){},ye=function(){},ve=function(){},be=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.__extends)(e,t),e}(function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(r.__extends)(e,t),e}(ve)),we=function(){function t(t,e,n){this._debugContext=n,this.nativeNode=t,e&&e instanceof Me?e.addChild(this):this.parent=null,this.listeners=[]}return Object.defineProperty(t.prototype,"injector",{get:function(){return this._debugContext.injector},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"componentInstance",{get:function(){return this._debugContext.component},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._debugContext.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"references",{get:function(){return this._debugContext.references},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"providerTokens",{get:function(){return this._debugContext.providerTokens},enumerable:!0,configurable:!0}),t}(),Me=function(t){function e(e,n,r){var i=t.call(this,e,n,r)||this;return i.properties={},i.attributes={},i.classes={},i.styles={},i.childNodes=[],i.nativeElement=e,i}return Object(r.__extends)(e,t),e.prototype.addChild=function(t){t&&(this.childNodes.push(t),t.parent=this)},e.prototype.removeChild=function(t){var e=this.childNodes.indexOf(t);-1!==e&&(t.parent=null,this.childNodes.splice(e,1))},e.prototype.insertChildrenAfter=function(t,e){var n,r=this,i=this.childNodes.indexOf(t);-1!==i&&((n=this.childNodes).splice.apply(n,[i+1,0].concat(e)),e.forEach(function(t){t.parent&&t.parent.removeChild(t),t.parent=r}))},e.prototype.insertBefore=function(t,e){var n=this.childNodes.indexOf(t);-1===n?this.addChild(e):(e.parent&&e.parent.removeChild(e),e.parent=this,this.childNodes.splice(n,0,e))},e.prototype.query=function(t){return this.queryAll(t)[0]||null},e.prototype.queryAll=function(t){var e=[];return ke(this,t,e),e},e.prototype.queryAllNodes=function(t){var e=[];return xe(this,t,e),e},Object.defineProperty(e.prototype,"children",{get:function(){return this.childNodes.filter(function(t){return t instanceof e})},enumerable:!0,configurable:!0}),e.prototype.triggerEventHandler=function(t,e){this.listeners.forEach(function(n){n.name==t&&n.callback(e)})},e}(we);function ke(t,e,n){t.childNodes.forEach(function(t){t instanceof Me&&(e(t)&&n.push(t),ke(t,e,n))})}function xe(t,e,n){t instanceof Me&&t.childNodes.forEach(function(t){e(t)&&n.push(t),t instanceof Me&&xe(t,e,n)})}var Le=new Map;function Ce(t){return Le.get(t)||null}function Se(t){Le.set(t.nativeNode,t)}function Te(t,e){var n=Ye(t),r=Ye(e);return n&&r?function(t,e,n){for(var r=t[Y()](),i=e[Y()]();;){var o=r.next(),s=i.next();if(o.done&&s.done)return!0;if(o.done||s.done)return!1;if(!n(o.value,s.value))return!1}}(t,e,Te):!(n||!t||"object"!=typeof t&&"function"!=typeof t||r||!e||"object"!=typeof e&&"function"!=typeof e)||E(t,e)}var Oe=function(){function t(t){this.wrapped=t}return t.wrap=function(e){return new t(e)},t}(),De=function(){function t(t,e,n){this.previousValue=t,this.currentValue=e,this.firstChange=n}return t.prototype.isFirstChange=function(){return this.firstChange},t}();function Ye(t){return!!Pe(t)&&(Array.isArray(t)||!(t instanceof Map)&&Y()in t)}function Pe(t){return null!==t&&("function"==typeof t||"object"==typeof t)}var Ee=function(){function t(){}return t.prototype.supports=function(t){return Ye(t)},t.prototype.create=function(t){return new je(t)},t}(),Ae=function(t,e){return e},je=function(){function t(t){this.length=0,this._linkedRecords=null,this._unlinkedRecords=null,this._previousItHead=null,this._itHead=null,this._itTail=null,this._additionsHead=null,this._additionsTail=null,this._movesHead=null,this._movesTail=null,this._removalsHead=null,this._removalsTail=null,this._identityChangesHead=null,this._identityChangesTail=null,this._trackByFn=t||Ae}return t.prototype.forEachItem=function(t){var e;for(e=this._itHead;null!==e;e=e._next)t(e)},t.prototype.forEachOperation=function(t){for(var e=this._itHead,n=this._removalsHead,r=0,i=null;e||n;){var o=!n||e&&e.currentIndex=n.length)&&(e=n.length-1),e<0)return null;var r=n[e];return r.viewContainerParent=null,pr(n,e),cn.dirtyParentQueries(r),dr(r),r}function cr(t,e,n){var r=e?Dn(e,e.def.lastRenderRootNode):t.renderElement;Fn(n,2,n.renderer.parentNode(r),n.renderer.nextSibling(r),void 0)}function dr(t){Fn(t,3,null,null,void 0)}function hr(t,e,n){e>=t.length?t.push(n):t.splice(e,0,n)}function pr(t,e){e>=t.length-1?t.pop():t.splice(e,1)}var fr=new Object;function _r(t,e,n,r,i,o){return new mr(t,e,n,r,i,o)}var mr=function(t){function e(e,n,r,i,o,s){var l=t.call(this)||this;return l.selector=e,l.componentType=n,l._inputs=i,l._outputs=o,l.ngContentSelectors=s,l.viewDefFactory=r,l}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"inputs",{get:function(){var t=[],e=this._inputs;for(var n in e)t.push({propName:n,templateName:e[n]});return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"outputs",{get:function(){var t=[];for(var e in this._outputs)t.push({propName:e,templateName:this._outputs[e]});return t},enumerable:!0,configurable:!0}),e.prototype.create=function(t,e,n,r){if(!r)throw new Error("ngModule should be provided");var i=Hn(this.viewDefFactory),o=i.nodes[0].element.componentProvider.nodeIndex,s=cn.createRootView(t,e||[],n,i,r,fr),l=ln(s,o).instance;return n&&s.renderer.setAttribute(sn(s,0).renderElement,"ng-version",w.full),new gr(s,new wr(s),l)},e}(wt),gr=function(t){function e(e,n,r){var i=t.call(this)||this;return i._view=e,i._viewRef=n,i._component=r,i._elDef=i._view.def.nodes[0],i.hostView=n,i.changeDetectorRef=n,i.instance=r,i}return Object(r.__extends)(e,t),Object.defineProperty(e.prototype,"location",{get:function(){return new ce(sn(this._view,this._elDef.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"injector",{get:function(){return new Lr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"componentType",{get:function(){return this._component.constructor},enumerable:!0,configurable:!0}),e.prototype.destroy=function(){this._viewRef.destroy()},e.prototype.onDestroy=function(t){this._viewRef.onDestroy(t)},e}(function(){});function yr(t,e,n){return new vr(t,e,n)}var vr=function(){function t(t,e,n){this._view=t,this._elDef=e,this._data=n,this._embeddedViews=[]}return Object.defineProperty(t.prototype,"element",{get:function(){return new ce(this._data.renderElement)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"injector",{get:function(){return new Lr(this._view,this._elDef)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parentInjector",{get:function(){for(var t=this._view,e=this._elDef.parent;!e&&t;)e=On(t),t=t.parent;return t?new Lr(t,e):new Lr(this._view,null)},enumerable:!0,configurable:!0}),t.prototype.clear=function(){for(var t=this._embeddedViews.length-1;t>=0;t--){var e=ur(this._data,t);cn.destroyView(e)}},t.prototype.get=function(t){var e=this._embeddedViews[t];if(e){var n=new wr(e);return n.attachToViewContainerRef(this),n}return null},Object.defineProperty(t.prototype,"length",{get:function(){return this._embeddedViews.length},enumerable:!0,configurable:!0}),t.prototype.createEmbeddedView=function(t,e,n){var r=t.createEmbeddedView(e||{});return this.insert(r,n),r},t.prototype.createComponent=function(t,e,n,r,i){var o=n||this.parentInjector;i||t instanceof Ot||(i=o.get(Dt));var s=t.create(o,r,void 0,i);return this.insert(s.hostView,e),s},t.prototype.insert=function(t,e){if(t.destroyed)throw new Error("Cannot insert a destroyed View in a ViewContainer!");var n,r,i,o,s=t;return i=s._view,o=(n=this._data).viewContainer._embeddedViews,null!==(r=e)&&void 0!==r||(r=o.length),i.viewContainerParent=this._view,hr(o,r,i),function(t,e){var n=Tn(e);if(n&&n!==t&&!(16&e.state)){e.state|=16;var r=n.template._projectedViews;r||(r=n.template._projectedViews=[]),r.push(e),function(t,n){if(!(4&n.flags)){e.parent.def.nodeFlags|=4,n.flags|=4;for(var r=n.parent;r;)r.childFlags|=4,r=r.parent}}(0,e.parentNodeDef)}}(n,i),cn.dirtyParentQueries(i),cr(n,r>0?o[r-1]:null,i),s.attachToViewContainerRef(this),t},t.prototype.move=function(t,e){if(t.destroyed)throw new Error("Cannot move a destroyed View in a ViewContainer!");var n,r,i,o,s,l=this._embeddedViews.indexOf(t._view);return i=e,s=(o=(n=this._data).viewContainer._embeddedViews)[r=l],pr(o,r),null==i&&(i=o.length),hr(o,i,s),cn.dirtyParentQueries(s),dr(s),cr(n,i>0?o[i-1]:null,s),t},t.prototype.indexOf=function(t){return this._embeddedViews.indexOf(t._view)},t.prototype.remove=function(t){var e=ur(this._data,t);e&&cn.destroyView(e)},t.prototype.detach=function(t){var e=ur(this._data,t);return e?new wr(e):null},t}();function br(t){return new wr(t)}var wr=function(){function t(t){this._view=t,this._viewContainerRef=null,this._appRef=null}return Object.defineProperty(t.prototype,"rootNodes",{get:function(){return Fn(this._view,0,void 0,void 0,t=[]),t;var t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"context",{get:function(){return this._view.context},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"destroyed",{get:function(){return 0!=(128&this._view.state)},enumerable:!0,configurable:!0}),t.prototype.markForCheck=function(){Ln(this._view)},t.prototype.detach=function(){this._view.state&=-5},t.prototype.detectChanges=function(){var t=this._view.root.rendererFactory;t.begin&&t.begin();try{cn.checkAndUpdateView(this._view)}finally{t.end&&t.end()}},t.prototype.checkNoChanges=function(){cn.checkNoChangesView(this._view)},t.prototype.reattach=function(){this._view.state|=4},t.prototype.onDestroy=function(t){this._view.disposables||(this._view.disposables=[]),this._view.disposables.push(t)},t.prototype.destroy=function(){this._appRef?this._appRef.detachView(this):this._viewContainerRef&&this._viewContainerRef.detach(this._viewContainerRef.indexOf(this)),cn.destroyView(this._view)},t.prototype.detachFromAppRef=function(){this._appRef=null,dr(this._view),cn.dirtyParentQueries(this._view)},t.prototype.attachToAppRef=function(t){if(this._viewContainerRef)throw new Error("This view is already attached to a ViewContainer!");this._appRef=t},t.prototype.attachToViewContainerRef=function(t){if(this._appRef)throw new Error("This view is already attached directly to the ApplicationRef!");this._viewContainerRef=t},t}();function Mr(t,e){return new kr(t,e)}var kr=function(t){function e(e,n){var r=t.call(this)||this;return r._parentView=e,r._def=n,r}return Object(r.__extends)(e,t),e.prototype.createEmbeddedView=function(t){return new wr(cn.createEmbeddedView(this._parentView,this._def,this._def.element.template,t))},Object.defineProperty(e.prototype,"elementRef",{get:function(){return new ce(sn(this._parentView,this._def.nodeIndex).renderElement)},enumerable:!0,configurable:!0}),e}(ge);function xr(t,e){return new Lr(t,e)}var Lr=function(){function t(t,e){this.view=t,this.elDef=e}return t.prototype.get=function(t,e){return void 0===e&&(e=N.THROW_IF_NOT_FOUND),cn.resolveDep(this.view,this.elDef,!!this.elDef&&0!=(33554432&this.elDef.flags),{flags:0,token:t,tokenKey:mn(t)},e)},t}();function Cr(t,e){var n=t.def.nodes[e];if(1&n.flags){var r=sn(t,n.nodeIndex);return n.element.template?r.template:r.renderElement}if(2&n.flags)return on(t,n.nodeIndex).renderText;if(20240&n.flags)return ln(t,n.nodeIndex).instance;throw new Error("Illegal state: read nodeValue for node index "+e)}function Sr(t){return new Tr(t.renderer)}var Tr=function(){function t(t){this.delegate=t}return t.prototype.selectRootElement=function(t){return this.delegate.selectRootElement(t)},t.prototype.createElement=function(t,e){var n=Un(e),r=this.delegate.createElement(n[1],n[0]);return t&&this.delegate.appendChild(t,r),r},t.prototype.createViewRoot=function(t){return t},t.prototype.createTemplateAnchor=function(t){var e=this.delegate.createComment("");return t&&this.delegate.appendChild(t,e),e},t.prototype.createText=function(t,e){var n=this.delegate.createText(e);return t&&this.delegate.appendChild(t,n),n},t.prototype.projectNodes=function(t,e){for(var n=0;n0,e.provider.value,e.provider.deps);if(e.outputs.length)for(var r=0;r0,r=e.provider;switch(201347067&e.flags){case 512:return Jr(t,e.parent,n,r.value,r.deps);case 1024:return function(t,e,n,r,i){var o=i.length;switch(o){case 0:return r();case 1:return r(Qr(t,e,n,i[0]));case 2:return r(Qr(t,e,n,i[0]),Qr(t,e,n,i[1]));case 3:return r(Qr(t,e,n,i[0]),Qr(t,e,n,i[1]),Qr(t,e,n,i[2]));default:for(var s=Array(o),l=0;l0)u=_,mi(_)||(c=_);else for(;u&&f===u.nodeIndex+u.childCount;){var y=u.parent;y&&(y.childFlags|=u.childFlags,y.childMatchedQueries|=u.childMatchedQueries),c=(u=y)&&mi(u)?u.renderParent:u}}return{factory:null,nodeFlags:s,rootNodeFlags:l,nodeMatchedQueries:a,flags:t,nodes:e,updateDirectives:n||fn,updateRenderer:r||fn,handleEvent:function(t,n,r,i){return e[n].element.handleEvent(t,r,i)},bindingCount:i,outputCount:o,lastRenderRootNode:p}}function mi(t){return 0!=(1&t.flags)&&null===t.element.name}function gi(t,e,n){var r=e.element&&e.element.template;if(r){if(!r.lastRenderRootNode)throw new Error("Illegal State: Embedded templates without nodes are not allowed!");if(r.lastRenderRootNode&&16777216&r.lastRenderRootNode.flags)throw new Error("Illegal State: Last root node of a template can't have embedded views, at index "+e.nodeIndex+"!")}if(20224&e.flags&&0==(1&(t?t.flags:0)))throw new Error("Illegal State: StaticProvider/Directive nodes need to be children of elements or anchors, at index "+e.nodeIndex+"!");if(e.query){if(67108864&e.flags&&(!t||0==(16384&t.flags)))throw new Error("Illegal State: Content Query nodes need to be children of directives, at index "+e.nodeIndex+"!");if(134217728&e.flags&&t)throw new Error("Illegal State: View Query nodes have to be top level nodes, at index "+e.nodeIndex+"!")}if(e.childCount){var i=t?t.nodeIndex+t.childCount:n-1;if(e.nodeIndex<=i&&e.nodeIndex+e.childCount>i)throw new Error("Illegal State: childCount of node leads outside of parent, at index "+e.nodeIndex+"!")}}function yi(t,e,n,r){var i=wi(t.root,t.renderer,t,e,n);return Mi(i,t.component,r),ki(i),i}function vi(t,e,n){var r=wi(t,t.renderer,null,null,e);return Mi(r,n,n),ki(r),r}function bi(t,e,n,r){var i,o=e.element.componentRendererType;return i=o?t.root.rendererFactory.createRenderer(r,o):t.root.renderer,wi(t.root,i,t,e.element.componentProvider,n)}function wi(t,e,n,r,i){var o=new Array(i.nodes.length),s=i.outputCount?new Array(i.outputCount):null;return{def:i,parent:n,viewContainerParent:null,parentNodeDef:r,context:null,component:null,nodes:o,state:13,root:t,renderer:e,oldValues:new Array(i.bindingCount),disposables:s,initIndex:-1}}function Mi(t,e,n){t.component=e,t.context=n}function ki(t){var e;Yn(t)&&(e=sn(t.parent,t.parentNodeDef.parent.nodeIndex).renderElement);for(var n=t.def,r=t.nodes,i=0;i0&&er(t,e,0,n)&&(p=!0),h>1&&er(t,e,1,r)&&(p=!0),h>2&&er(t,e,2,i)&&(p=!0),h>3&&er(t,e,3,o)&&(p=!0),h>4&&er(t,e,4,s)&&(p=!0),h>5&&er(t,e,5,l)&&(p=!0),h>6&&er(t,e,6,a)&&(p=!0),h>7&&er(t,e,7,u)&&(p=!0),h>8&&er(t,e,8,c)&&(p=!0),h>9&&er(t,e,9,d)&&(p=!0),p}(t,e,n,r,i,o,s,l,a,u,c,d);case 2:return function(t,e,n,r,i,o,s,l,a,u,c,d){var h=!1,p=e.bindings,f=p.length;if(f>0&&kn(t,e,0,n)&&(h=!0),f>1&&kn(t,e,1,r)&&(h=!0),f>2&&kn(t,e,2,i)&&(h=!0),f>3&&kn(t,e,3,o)&&(h=!0),f>4&&kn(t,e,4,s)&&(h=!0),f>5&&kn(t,e,5,l)&&(h=!0),f>6&&kn(t,e,6,a)&&(h=!0),f>7&&kn(t,e,7,u)&&(h=!0),f>8&&kn(t,e,8,c)&&(h=!0),f>9&&kn(t,e,9,d)&&(h=!0),h){var _=e.text.prefix;f>0&&(_+=fi(n,p[0])),f>1&&(_+=fi(r,p[1])),f>2&&(_+=fi(i,p[2])),f>3&&(_+=fi(o,p[3])),f>4&&(_+=fi(s,p[4])),f>5&&(_+=fi(l,p[5])),f>6&&(_+=fi(a,p[6])),f>7&&(_+=fi(u,p[7])),f>8&&(_+=fi(c,p[8])),f>9&&(_+=fi(d,p[9]));var m=on(t,e.nodeIndex).renderText;t.renderer.setValue(m,_)}return h}(t,e,n,r,i,o,s,l,a,u,c,d);case 16384:return function(t,e,n,r,i,o,s,l,a,u,c,d){var h=ln(t,e.nodeIndex),p=h.instance,f=!1,_=void 0,m=e.bindings.length;return m>0&&Mn(t,e,0,n)&&(f=!0,_=Xr(t,h,e,0,n,_)),m>1&&Mn(t,e,1,r)&&(f=!0,_=Xr(t,h,e,1,r,_)),m>2&&Mn(t,e,2,i)&&(f=!0,_=Xr(t,h,e,2,i,_)),m>3&&Mn(t,e,3,o)&&(f=!0,_=Xr(t,h,e,3,o,_)),m>4&&Mn(t,e,4,s)&&(f=!0,_=Xr(t,h,e,4,s,_)),m>5&&Mn(t,e,5,l)&&(f=!0,_=Xr(t,h,e,5,l,_)),m>6&&Mn(t,e,6,a)&&(f=!0,_=Xr(t,h,e,6,a,_)),m>7&&Mn(t,e,7,u)&&(f=!0,_=Xr(t,h,e,7,u,_)),m>8&&Mn(t,e,8,c)&&(f=!0,_=Xr(t,h,e,8,c,_)),m>9&&Mn(t,e,9,d)&&(f=!0,_=Xr(t,h,e,9,d,_)),_&&p.ngOnChanges(_),65536&e.flags&&rn(t,256,e.nodeIndex)&&p.ngOnInit(),262144&e.flags&&p.ngDoCheck(),f}(t,e,n,r,i,o,s,l,a,u,c,d);case 32:case 64:case 128:return function(t,e,n,r,i,o,s,l,a,u,c,d){var h=e.bindings,p=!1,f=h.length;if(f>0&&kn(t,e,0,n)&&(p=!0),f>1&&kn(t,e,1,r)&&(p=!0),f>2&&kn(t,e,2,i)&&(p=!0),f>3&&kn(t,e,3,o)&&(p=!0),f>4&&kn(t,e,4,s)&&(p=!0),f>5&&kn(t,e,5,l)&&(p=!0),f>6&&kn(t,e,6,a)&&(p=!0),f>7&&kn(t,e,7,u)&&(p=!0),f>8&&kn(t,e,8,c)&&(p=!0),f>9&&kn(t,e,9,d)&&(p=!0),p){var _=an(t,e.nodeIndex),m=void 0;switch(201347067&e.flags){case 32:m=new Array(h.length),f>0&&(m[0]=n),f>1&&(m[1]=r),f>2&&(m[2]=i),f>3&&(m[3]=o),f>4&&(m[4]=s),f>5&&(m[5]=l),f>6&&(m[6]=a),f>7&&(m[7]=u),f>8&&(m[8]=c),f>9&&(m[9]=d);break;case 64:m={},f>0&&(m[h[0].name]=n),f>1&&(m[h[1].name]=r),f>2&&(m[h[2].name]=i),f>3&&(m[h[3].name]=o),f>4&&(m[h[4].name]=s),f>5&&(m[h[5].name]=l),f>6&&(m[h[6].name]=a),f>7&&(m[h[7].name]=u),f>8&&(m[h[8].name]=c),f>9&&(m[h[9].name]=d);break;case 128:var g=n;switch(f){case 1:m=g.transform(n);break;case 2:m=g.transform(r);break;case 3:m=g.transform(r,i);break;case 4:m=g.transform(r,i,o);break;case 5:m=g.transform(r,i,o,s);break;case 6:m=g.transform(r,i,o,s,l);break;case 7:m=g.transform(r,i,o,s,l,a);break;case 8:m=g.transform(r,i,o,s,l,a,u);break;case 9:m=g.transform(r,i,o,s,l,a,u,c);break;case 10:m=g.transform(r,i,o,s,l,a,u,c,d)}}_.value=m}return p}(t,e,n,r,i,o,s,l,a,u,c,d);default:throw"unreachable"}}(t,e,r,i,o,s,l,a,u,c,d,h):function(t,e,n){switch(201347067&e.flags){case 1:return function(t,e,n){for(var r=!1,i=0;i0&&xn(t,e,0,n),h>1&&xn(t,e,1,r),h>2&&xn(t,e,2,i),h>3&&xn(t,e,3,o),h>4&&xn(t,e,4,s),h>5&&xn(t,e,5,l),h>6&&xn(t,e,6,a),h>7&&xn(t,e,7,u),h>8&&xn(t,e,8,c),h>9&&xn(t,e,9,d)}(t,e,r,i,o,s,l,a,u,c,d,h):function(t,e,n){for(var r=0;r=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},f=function(){},_=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return h(e,t),e.prototype.getTranslation=function(t){return Object(i.a)({})},e}(f);_=p([Object(r.q)()],_);var m=function(t){return t&&"function"==typeof t.schedule},g="undefined"!=typeof window?window:"undefined"!=typeof t?t:"undefined"!=typeof self?self:{};function y(t,e){return t(e={exports:{}},e.exports),e.exports}var v="undefined"!=typeof window&&window,b="undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&self,w=v||"undefined"!=typeof g&&g||b,M=w;!function(){if(!w)throw new Error("RxJS could not find any global context (window, self, global)")}();var k,x={root:M},L={isFunction:function(t){return"function"==typeof t}},C={isArray:Array.isArray||function(t){return t&&"number"==typeof t.length}},S=function(t){return null!=t&&"object"==typeof t},T={errorObject:{e:{}}};function O(){try{return k.apply(this,arguments)}catch(t){return T.errorObject.e=t,T.errorObject}}var D=function(t){return k=t,O},Y=g&&g.__extends||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);function r(){this.constructor=t}t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)},P={UnsubscriptionError:function(t){function e(e){t.call(this),this.errors=e;var n=Error.call(this,e?e.length+" errors occurred during unsubscription:\n "+e.map(function(t,e){return e+1+") "+t.toString()}).join("\n "):"");this.name=n.name="UnsubscriptionError",this.stack=n.stack,this.message=n.message}return Y(e,t),e}(Error)};function E(t){return t.reduce(function(t,e){return t.concat(e instanceof P.UnsubscriptionError?e.errors:e)},[])}var A={Subscription:function(){function t(t){this.closed=!1,this._parent=null,this._parents=null,this._subscriptions=null,t&&(this._unsubscribe=t)}var e;return t.prototype.unsubscribe=function(){var t,e=!1;if(!this.closed){var n=this._parent,r=this._parents,i=this._unsubscribe,o=this._subscriptions;this.closed=!0,this._parent=null,this._parents=null,this._subscriptions=null;for(var s=-1,l=r?r.length:0;n;)n.remove(this),n=++s1?new e(t,r):1===i?new q.ScalarObservable(t[0],r):new K.EmptyObservable(r)},e.dispatch=function(t){var e=t.array,n=t.index,r=t.subscriber;n>=t.count?r.complete():(r.next(e[n]),r.closed||(t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.array,r=n.length,i=this.scheduler;if(i)return i.schedule(e.dispatch,0,{array:n,index:0,count:r,subscriber:t});for(var o=0;oct?ct:i:i}()),this.arr=t,this.idx=e,this.len=n}return t.prototype[ot.iterator]=function(){return this},t.prototype.next=function(){return this.idx=t.length?r.complete():(r.next(e[n]),t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(e.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:t});for(var o=0;o0?this._next(e.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()},e}(Ct.OuterSubscriber),Dt=function(t){return t},Yt=function(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),function(t,e,n){return void 0===n&&(n=Number.POSITIVE_INFINITY),function(r){return"number"==typeof e&&(n=e,e=null),r.lift(new Tt(t,e,n))}}(Dt,null,t)},Pt={concat:function(){for(var t=[],e=0;e=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},At=function(){},jt=function(){function t(){}return t.prototype.handle=function(t){return t.key},t}();jt=Et([Object(r.q)()],jt);var It=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=o<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var l=t.length-1;l>=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},Rt=function(){},Ht=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return h(e,t),e.prototype.compile=function(t,e){return t},e.prototype.compileTranslations=function(t,e){return t},e}(Rt);function Ft(t,e){if(t===e)return!0;if(null===t||null===e)return!1;if(t!=t&&e!=e)return!0;var n,r,i,o=typeof t;if(o==typeof e&&"object"==o){if(!Array.isArray(t)){if(Array.isArray(e))return!1;for(r in i=Object.create(null),t){if(!Ft(t[r],e[r]))return!1;i[r]=!0}for(r in e)if(!(r in i)&&"undefined"!=typeof e[r])return!1;return!0}if(!Array.isArray(e))return!1;if((n=t.length)==e.length){for(r=0;r=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},zt=function(){},Wt=function(t){function e(){var e=t.apply(this,arguments)||this;return e.templateMatcher=/{{\s?([^{}\s]*)\s?}}/g,e}return h(e,t),e.prototype.interpolate=function(t,e){return"string"==typeof t?this.interpolateString(t,e):"function"==typeof t?this.interpolateFunction(t,e):t},e.prototype.getValue=function(t,e){var n=e.split(".");e="";do{e+=n.shift(),!Nt(t)||!Nt(t[e])||"object"!=typeof t[e]&&n.length?n.length?e+=".":t=void 0:(t=t[e],e="")}while(n.length);return t},e.prototype.interpolateFunction=function(t,e){return t(e)},e.prototype.interpolateString=function(t,e){var n=this;return e?t.replace(this.templateMatcher,function(t,r){var i=n.getValue(e,r);return Nt(i)?i:t}):t},e}(zt);Wt=Bt([Object(r.q)()],Wt);var Ut=function(){return function(){this.currentLang=this.defaultLang,this.translations={},this.langs=[],this.onTranslationChange=new r.o,this.onLangChange=new r.o,this.onDefaultLangChange=new r.o}}(),Gt=this&&this.__decorate||function(t,e,n,r){var i,o=arguments.length,s=o<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(t,e,n,r);else for(var l=t.length-1;l>=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},Jt=n("TToO").__metadata,qt=n("TToO").__param,Qt=new r.r("USE_STORE"),Kt=new r.r("USE_DEFAULT_LANG"),Xt=function(){function t(t,e,n,i,o,s,l){void 0===s&&(s=!0),void 0===l&&(l=!1),this.store=t,this.currentLoader=e,this.compiler=n,this.parser=i,this.missingTranslationHandler=o,this.useDefaultLang=s,this.isolate=l,this.pending=!1,this._onTranslationChange=new r.o,this._onLangChange=new r.o,this._onDefaultLangChange=new r.o,this._langs=[],this._translations={},this._translationRequests={}}return Object.defineProperty(t.prototype,"onTranslationChange",{get:function(){return this.isolate?this._onTranslationChange:this.store.onTranslationChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onLangChange",{get:function(){return this.isolate?this._onLangChange:this.store.onLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onDefaultLangChange",{get:function(){return this.isolate?this._onDefaultLangChange:this.store.onDefaultLangChange},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"defaultLang",{get:function(){return this.isolate?this._defaultLang:this.store.defaultLang},set:function(t){this.isolate?this._defaultLang=t:this.store.defaultLang=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentLang",{get:function(){return this.isolate?this._currentLang:this.store.currentLang},set:function(t){this.isolate?this._currentLang=t:this.store.currentLang=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"langs",{get:function(){return this.isolate?this._langs:this.store.langs},set:function(t){this.isolate?this._langs=t:this.store.langs=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"translations",{get:function(){return this.isolate?this._translations:this.store.translations},set:function(t){this.isolate?this._translations=t:this.store.translations=t},enumerable:!0,configurable:!0}),t.prototype.setDefaultLang=function(t){var e=this;if(t!==this.defaultLang){var n=this.retrieveTranslations(t);"undefined"!=typeof n?(this.defaultLang||(this.defaultLang=t),n.pipe(Object(d.a)(1)).subscribe(function(n){e.changeDefaultLang(t)})):this.changeDefaultLang(t)}},t.prototype.getDefaultLang=function(){return this.defaultLang},t.prototype.use=function(t){var e=this;if(t===this.currentLang)return Object(i.a)(this.translations[t]);var n=this.retrieveTranslations(t);return"undefined"!=typeof n?(this.currentLang||(this.currentLang=t),n.pipe(Object(d.a)(1)).subscribe(function(n){e.changeLang(t)}),n):(this.changeLang(t),Object(i.a)(this.translations[t]))},t.prototype.retrieveTranslations=function(t){var e;return"undefined"==typeof this.translations[t]&&(this._translationRequests[t]=this._translationRequests[t]||this.getTranslation(t),e=this._translationRequests[t]),e},t.prototype.getTranslation=function(t){var e=this;return this.pending=!0,this.loadingTranslations=this.currentLoader.getTranslation(t).pipe(Object(s.a)()),this.loadingTranslations.pipe(Object(d.a)(1)).subscribe(function(n){e.translations[t]=e.compiler.compileTranslations(n,t),e.updateLangs(),e.pending=!1},function(t){e.pending=!1}),this.loadingTranslations},t.prototype.setTranslation=function(t,e,n){void 0===n&&(n=!1),e=this.compiler.compileTranslations(e,t),this.translations[t]=n&&this.translations[t]?function t(e,n){var r=Object.assign({},e);return Vt(e)&&Vt(n)&&Object.keys(n).forEach(function(i){var o,s;Vt(n[i])?i in e?r[i]=t(e[i],n[i]):Object.assign(r,((o={})[i]=n[i],o)):Object.assign(r,((s={})[i]=n[i],s))}),r}(this.translations[t],e):e,this.updateLangs(),this.onTranslationChange.emit({lang:t,translations:this.translations[t]})},t.prototype.getLangs=function(){return this.langs},t.prototype.addLangs=function(t){var e=this;t.forEach(function(t){-1===e.langs.indexOf(t)&&e.langs.push(t)})},t.prototype.updateLangs=function(){this.addLangs(Object.keys(this.translations))},t.prototype.getParsedResult=function(t,e,n){var r;if(e instanceof Array){for(var o={},s=!1,u=0,d=e;u=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},$t=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},te=function(){function t(t,e,n){var r=this;this.translateService=t,this.element=e,this._ref=n,this.onTranslationChangeSub||(this.onTranslationChangeSub=this.translateService.onTranslationChange.subscribe(function(t){t.lang===r.translateService.currentLang&&r.checkNodes(!0,t.translations)})),this.onLangChangeSub||(this.onLangChangeSub=this.translateService.onLangChange.subscribe(function(t){r.checkNodes(!0,t.translations)})),this.onDefaultLangChangeSub||(this.onDefaultLangChangeSub=this.translateService.onDefaultLangChange.subscribe(function(t){r.checkNodes(!0)}))}return Object.defineProperty(t.prototype,"translate",{set:function(t){t&&(this.key=t,this.checkNodes())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"translateParams",{set:function(t){Ft(this.currentParams,t)||(this.currentParams=t,this.checkNodes(!0))},enumerable:!0,configurable:!0}),t.prototype.ngAfterViewChecked=function(){this.checkNodes()},t.prototype.checkNodes=function(t,e){void 0===t&&(t=!1);var n=this.element.nativeElement.childNodes;n.length||(this.setContent(this.element.nativeElement,this.key),n=this.element.nativeElement.childNodes);for(var r=0;r=0;l--)(i=t[l])&&(s=(o<3?i(s):o>3?i(e,n,s):i(e,n))||s);return o>3&&s&&Object.defineProperty(e,n,s),s},ne=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},re=function(){function t(t,e){this.translate=t,this._ref=e,this.value=""}return t.prototype.updateValue=function(t,e,n){var r=this,i=function(e){r.value=void 0!==e?e:t,r.lastKey=t,r._ref.markForCheck()};if(n){var o=this.translate.getParsedResult(n,t,e);"function"==typeof o.subscribe?o.subscribe(i):i(o)}this.translate.get(t,e).subscribe(i)},t.prototype.transform=function(t){for(var e,n=this,r=[],i=1;i20?e=40===t||50===t||60===t||80===t||100===t?"fed":"ain":t>0&&(e=["","af","il","ydd","ydd","ed","ed","ed","fed","fed","fed","eg","fed","eg","eg","fed","eg","eg","fed","eg","fed"][t]),t+e},week:{dow:1,doy:4}})}(n("PJh5"))},ZUyn:function(t,e,n){!function(t){"use strict";t.defineLocale("zh-hk",{months:"\u4e00\u6708_\u4e8c\u6708_\u4e09\u6708_\u56db\u6708_\u4e94\u6708_\u516d\u6708_\u4e03\u6708_\u516b\u6708_\u4e5d\u6708_\u5341\u6708_\u5341\u4e00\u6708_\u5341\u4e8c\u6708".split("_"),monthsShort:"1\u6708_2\u6708_3\u6708_4\u6708_5\u6708_6\u6708_7\u6708_8\u6708_9\u6708_10\u6708_11\u6708_12\u6708".split("_"),weekdays:"\u661f\u671f\u65e5_\u661f\u671f\u4e00_\u661f\u671f\u4e8c_\u661f\u671f\u4e09_\u661f\u671f\u56db_\u661f\u671f\u4e94_\u661f\u671f\u516d".split("_"),weekdaysShort:"\u9031\u65e5_\u9031\u4e00_\u9031\u4e8c_\u9031\u4e09_\u9031\u56db_\u9031\u4e94_\u9031\u516d".split("_"),weekdaysMin:"\u65e5_\u4e00_\u4e8c_\u4e09_\u56db_\u4e94_\u516d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY\u5e74M\u6708D\u65e5",LLL:"YYYY\u5e74M\u6708D\u65e5 HH:mm",LLLL:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm",l:"YYYY/M/D",ll:"YYYY\u5e74M\u6708D\u65e5",lll:"YYYY\u5e74M\u6708D\u65e5 HH:mm",llll:"YYYY\u5e74M\u6708D\u65e5dddd HH:mm"},meridiemParse:/\u51cc\u6668|\u65e9\u4e0a|\u4e0a\u5348|\u4e2d\u5348|\u4e0b\u5348|\u665a\u4e0a/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u51cc\u6668"===e||"\u65e9\u4e0a"===e||"\u4e0a\u5348"===e?t:"\u4e2d\u5348"===e?t>=11?t:t+12:"\u4e0b\u5348"===e||"\u665a\u4e0a"===e?t+12:void 0},meridiem:function(t,e,n){var r=100*t+e;return r<600?"\u51cc\u6668":r<900?"\u65e9\u4e0a":r<1130?"\u4e0a\u5348":r<1230?"\u4e2d\u5348":r<1800?"\u4e0b\u5348":"\u665a\u4e0a"},calendar:{sameDay:"[\u4eca\u5929]LT",nextDay:"[\u660e\u5929]LT",nextWeek:"[\u4e0b]ddddLT",lastDay:"[\u6628\u5929]LT",lastWeek:"[\u4e0a]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(\u65e5|\u6708|\u9031)/,ordinal:function(t,e){switch(e){case"d":case"D":case"DDD":return t+"\u65e5";case"M":return t+"\u6708";case"w":case"W":return t+"\u9031";default:return t}},relativeTime:{future:"%s\u5167",past:"%s\u524d",s:"\u5e7e\u79d2",ss:"%d \u79d2",m:"1 \u5206\u9418",mm:"%d \u5206\u9418",h:"1 \u5c0f\u6642",hh:"%d \u5c0f\u6642",d:"1 \u5929",dd:"%d \u5929",M:"1 \u500b\u6708",MM:"%d \u500b\u6708",y:"1 \u5e74",yy:"%d \u5e74"}})}(n("PJh5"))},ZoSI:function(t,e,n){!function(t){"use strict";t.defineLocale("pt",{months:"janeiro_fevereiro_mar\xe7o_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Ter\xe7a-feira_Quarta-feira_Quinta-feira_Sexta-feira_S\xe1bado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_S\xe1b".split("_"),weekdaysMin:"Do_2\xaa_3\xaa_4\xaa_5\xaa_6\xaa_S\xe1".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje \xe0s] LT",nextDay:"[Amanh\xe3 \xe0s] LT",nextWeek:"dddd [\xe0s] LT",lastDay:"[Ontem \xe0s] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[\xdaltimo] dddd [\xe0s] LT":"[\xdaltima] dddd [\xe0s] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"h\xe1 %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um m\xeas",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},aM0x:function(t,e,n){!function(t){"use strict";var e={1:"\u09e7",2:"\u09e8",3:"\u09e9",4:"\u09ea",5:"\u09eb",6:"\u09ec",7:"\u09ed",8:"\u09ee",9:"\u09ef",0:"\u09e6"},n={"\u09e7":"1","\u09e8":"2","\u09e9":"3","\u09ea":"4","\u09eb":"5","\u09ec":"6","\u09ed":"7","\u09ee":"8","\u09ef":"9","\u09e6":"0"};t.defineLocale("bn",{months:"\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0_\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09bf_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0\u09bf\u09b2_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2\u09be\u0987_\u0986\u0997\u09b8\u09cd\u099f_\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0_\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0_\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0_\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0".split("_"),monthsShort:"\u099c\u09be\u09a8\u09c1_\u09ab\u09c7\u09ac_\u09ae\u09be\u09b0\u09cd\u099a_\u098f\u09aa\u09cd\u09b0_\u09ae\u09c7_\u099c\u09c1\u09a8_\u099c\u09c1\u09b2_\u0986\u0997_\u09b8\u09c7\u09aa\u09cd\u099f_\u0985\u0995\u09cd\u099f\u09cb_\u09a8\u09ad\u09c7_\u09a1\u09bf\u09b8\u09c7".split("_"),weekdays:"\u09b0\u09ac\u09bf\u09ac\u09be\u09b0_\u09b8\u09cb\u09ae\u09ac\u09be\u09b0_\u09ae\u0999\u09cd\u0997\u09b2\u09ac\u09be\u09b0_\u09ac\u09c1\u09a7\u09ac\u09be\u09b0_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0_\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0_\u09b6\u09a8\u09bf\u09ac\u09be\u09b0".split("_"),weekdaysShort:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997\u09b2_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),weekdaysMin:"\u09b0\u09ac\u09bf_\u09b8\u09cb\u09ae_\u09ae\u0999\u09cd\u0997_\u09ac\u09c1\u09a7_\u09ac\u09c3\u09b9\u0983_\u09b6\u09c1\u0995\u09cd\u09b0_\u09b6\u09a8\u09bf".split("_"),longDateFormat:{LT:"A h:mm \u09b8\u09ae\u09df",LTS:"A h:mm:ss \u09b8\u09ae\u09df",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u09b8\u09ae\u09df",LLLL:"dddd, D MMMM YYYY, A h:mm \u09b8\u09ae\u09df"},calendar:{sameDay:"[\u0986\u099c] LT",nextDay:"[\u0986\u0997\u09be\u09ae\u09c0\u0995\u09be\u09b2] LT",nextWeek:"dddd, LT",lastDay:"[\u0997\u09a4\u0995\u09be\u09b2] LT",lastWeek:"[\u0997\u09a4] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u09aa\u09b0\u09c7",past:"%s \u0986\u0997\u09c7",s:"\u0995\u09df\u09c7\u0995 \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",ss:"%d \u09b8\u09c7\u0995\u09c7\u09a8\u09cd\u09a1",m:"\u098f\u0995 \u09ae\u09bf\u09a8\u09bf\u099f",mm:"%d \u09ae\u09bf\u09a8\u09bf\u099f",h:"\u098f\u0995 \u0998\u09a8\u09cd\u099f\u09be",hh:"%d \u0998\u09a8\u09cd\u099f\u09be",d:"\u098f\u0995 \u09a6\u09bf\u09a8",dd:"%d \u09a6\u09bf\u09a8",M:"\u098f\u0995 \u09ae\u09be\u09b8",MM:"%d \u09ae\u09be\u09b8",y:"\u098f\u0995 \u09ac\u099b\u09b0",yy:"%d \u09ac\u099b\u09b0"},preparse:function(t){return t.replace(/[\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u09e6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u09b0\u09be\u09a4|\u09b8\u0995\u09be\u09b2|\u09a6\u09c1\u09aa\u09c1\u09b0|\u09ac\u09bf\u0995\u09be\u09b2|\u09b0\u09be\u09a4/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u09b0\u09be\u09a4"===e&&t>=4||"\u09a6\u09c1\u09aa\u09c1\u09b0"===e&&t<5||"\u09ac\u09bf\u0995\u09be\u09b2"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u09b0\u09be\u09a4":t<10?"\u09b8\u0995\u09be\u09b2":t<17?"\u09a6\u09c1\u09aa\u09c1\u09b0":t<20?"\u09ac\u09bf\u0995\u09be\u09b2":"\u09b0\u09be\u09a4"},week:{dow:0,doy:6}})}(n("PJh5"))},aqvp:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=t+" ";switch(n){case"ss":return r+(1===t?"sekunda":2===t||3===t||4===t?"sekunde":"sekundi");case"m":return e?"jedna minuta":"jedne minute";case"mm":return r+(1===t?"minuta":2===t||3===t||4===t?"minute":"minuta");case"h":return e?"jedan sat":"jednog sata";case"hh":return r+(1===t?"sat":2===t||3===t||4===t?"sata":"sati");case"dd":return r+(1===t?"dan":"dana");case"MM":return r+(1===t?"mjesec":2===t||3===t||4===t?"mjeseca":"mjeseci");case"yy":return r+(1===t?"godina":2===t||3===t||4===t?"godine":"godina")}}t.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010der u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[pro\u0161lu] dddd [u] LT";case 6:return"[pro\u0161le] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[pro\u0161li] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:e,m:e,mm:e,h:e,hh:e,d:"dan",dd:e,M:"mjesec",MM:e,y:"godinu",yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},bXQP:function(t,e,n){!function(t){"use strict";t.defineLocale("fr-ca",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(t,e){switch(e){default:case"M":case"Q":case"D":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}}})}(n("PJh5"))},c1x4:function(t,e,n){!function(t){"use strict";var e={words:{ss:["\u0441\u0435\u043a\u0443\u043d\u0434\u0430","\u0441\u0435\u043a\u0443\u043d\u0434\u0435","\u0441\u0435\u043a\u0443\u043d\u0434\u0438"],m:["\u0458\u0435\u0434\u0430\u043d \u043c\u0438\u043d\u0443\u0442","\u0458\u0435\u0434\u043d\u0435 \u043c\u0438\u043d\u0443\u0442\u0435"],mm:["\u043c\u0438\u043d\u0443\u0442","\u043c\u0438\u043d\u0443\u0442\u0435","\u043c\u0438\u043d\u0443\u0442\u0430"],h:["\u0458\u0435\u0434\u0430\u043d \u0441\u0430\u0442","\u0458\u0435\u0434\u043d\u043e\u0433 \u0441\u0430\u0442\u0430"],hh:["\u0441\u0430\u0442","\u0441\u0430\u0442\u0430","\u0441\u0430\u0442\u0438"],dd:["\u0434\u0430\u043d","\u0434\u0430\u043d\u0430","\u0434\u0430\u043d\u0430"],MM:["\u043c\u0435\u0441\u0435\u0446","\u043c\u0435\u0441\u0435\u0446\u0430","\u043c\u0435\u0441\u0435\u0446\u0438"],yy:["\u0433\u043e\u0434\u0438\u043d\u0430","\u0433\u043e\u0434\u0438\u043d\u0435","\u0433\u043e\u0434\u0438\u043d\u0430"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr-cyrl",{months:"\u0458\u0430\u043d\u0443\u0430\u0440_\u0444\u0435\u0431\u0440\u0443\u0430\u0440_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440_\u043e\u043a\u0442\u043e\u0431\u0430\u0440_\u043d\u043e\u0432\u0435\u043c\u0431\u0430\u0440_\u0434\u0435\u0446\u0435\u043c\u0431\u0430\u0440".split("_"),monthsShort:"\u0458\u0430\u043d._\u0444\u0435\u0431._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u0458_\u0458\u0443\u043d_\u0458\u0443\u043b_\u0430\u0432\u0433._\u0441\u0435\u043f._\u043e\u043a\u0442._\u043d\u043e\u0432._\u0434\u0435\u0446.".split("_"),monthsParseExact:!0,weekdays:"\u043d\u0435\u0434\u0435\u0459\u0430_\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a_\u0443\u0442\u043e\u0440\u0430\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0440\u0442\u0430\u043a_\u043f\u0435\u0442\u0430\u043a_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434._\u043f\u043e\u043d._\u0443\u0442\u043e._\u0441\u0440\u0435._\u0447\u0435\u0442._\u043f\u0435\u0442._\u0441\u0443\u0431.".split("_"),weekdaysMin:"\u043d\u0435_\u043f\u043e_\u0443\u0442_\u0441\u0440_\u0447\u0435_\u043f\u0435_\u0441\u0443".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[\u0434\u0430\u043d\u0430\u0441 \u0443] LT",nextDay:"[\u0441\u0443\u0442\u0440\u0430 \u0443] LT",nextWeek:function(){switch(this.day()){case 0:return"[\u0443] [\u043d\u0435\u0434\u0435\u0459\u0443] [\u0443] LT";case 3:return"[\u0443] [\u0441\u0440\u0435\u0434\u0443] [\u0443] LT";case 6:return"[\u0443] [\u0441\u0443\u0431\u043e\u0442\u0443] [\u0443] LT";case 1:case 2:case 4:case 5:return"[\u0443] dddd [\u0443] LT"}},lastDay:"[\u0458\u0443\u0447\u0435 \u0443] LT",lastWeek:function(){return["[\u043f\u0440\u043e\u0448\u043b\u0435] [\u043d\u0435\u0434\u0435\u0459\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u043e\u043d\u0435\u0434\u0435\u0459\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0443\u0442\u043e\u0440\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0440\u0435\u0434\u0435] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u0447\u0435\u0442\u0432\u0440\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u043e\u0433] [\u043f\u0435\u0442\u043a\u0430] [\u0443] LT","[\u043f\u0440\u043e\u0448\u043b\u0435] [\u0441\u0443\u0431\u043e\u0442\u0435] [\u0443] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"\u043f\u0440\u0435 %s",s:"\u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"\u0434\u0430\u043d",dd:e.translate,M:"\u043c\u0435\u0441\u0435\u0446",MM:e.translate,y:"\u0433\u043e\u0434\u0438\u043d\u0443",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},cQXm:function(t,e,n){"use strict";e.a=function(t){return t&&"function"!=typeof t.subscribe&&"function"==typeof t.then}},"ce/b":function(t,e,n){"use strict";e.a=function(){for(var t=[],e=0;e=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},etqZ:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r=function(t){var e=t.Symbol;if("function"==typeof e)return e.iterator||(e.iterator=e("iterator polyfill")),e.iterator;var n=t.Set;if(n&&"function"==typeof(new n)["@@iterator"])return"@@iterator";var r=t.Map;if(r)for(var i=Object.getOwnPropertyNames(r.prototype),o=0;o=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedelje] [u] LT","[pro\u0161log] [ponedeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},f9aG:function(t,e,n){"use strict";function r(){}function i(t){return t?1===t.length?t[0]:function(e){return t.reduce(function(t,e){return e(t)},e)}:r}e.a=function(){for(var t=[],e=0;e=20?"ste":"de")},week:{dow:1,doy:4}})}(n("PJh5"))},gEQe:function(t,e,n){!function(t){"use strict";var e={1:"\u0ce7",2:"\u0ce8",3:"\u0ce9",4:"\u0cea",5:"\u0ceb",6:"\u0cec",7:"\u0ced",8:"\u0cee",9:"\u0cef",0:"\u0ce6"},n={"\u0ce7":"1","\u0ce8":"2","\u0ce9":"3","\u0cea":"4","\u0ceb":"5","\u0cec":"6","\u0ced":"7","\u0cee":"8","\u0cef":"9","\u0ce6":"0"};t.defineLocale("kn",{months:"\u0c9c\u0ca8\u0cb5\u0cb0\u0cbf_\u0cab\u0cc6\u0cac\u0ccd\u0cb0\u0cb5\u0cb0\u0cbf_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5\u0cac\u0cb0\u0ccd_\u0ca8\u0cb5\u0cc6\u0c82\u0cac\u0cb0\u0ccd_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82\u0cac\u0cb0\u0ccd".split("_"),monthsShort:"\u0c9c\u0ca8_\u0cab\u0cc6\u0cac\u0ccd\u0cb0_\u0cae\u0cbe\u0cb0\u0ccd\u0c9a\u0ccd_\u0c8f\u0caa\u0ccd\u0cb0\u0cbf\u0cb2\u0ccd_\u0cae\u0cc6\u0cd5_\u0c9c\u0cc2\u0ca8\u0ccd_\u0c9c\u0cc1\u0cb2\u0cc6\u0cd6_\u0c86\u0c97\u0cb8\u0ccd\u0c9f\u0ccd_\u0cb8\u0cc6\u0caa\u0ccd\u0c9f\u0cc6\u0c82_\u0c85\u0c95\u0ccd\u0c9f\u0cc6\u0cc2\u0cd5_\u0ca8\u0cb5\u0cc6\u0c82_\u0ca1\u0cbf\u0cb8\u0cc6\u0c82".split("_"),monthsParseExact:!0,weekdays:"\u0cad\u0cbe\u0ca8\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae\u0cb5\u0cbe\u0cb0_\u0cae\u0c82\u0c97\u0cb3\u0cb5\u0cbe\u0cb0_\u0cac\u0cc1\u0ca7\u0cb5\u0cbe\u0cb0_\u0c97\u0cc1\u0cb0\u0cc1\u0cb5\u0cbe\u0cb0_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0\u0cb5\u0cbe\u0cb0_\u0cb6\u0ca8\u0cbf\u0cb5\u0cbe\u0cb0".split("_"),weekdaysShort:"\u0cad\u0cbe\u0ca8\u0cc1_\u0cb8\u0cc6\u0cc2\u0cd5\u0cae_\u0cae\u0c82\u0c97\u0cb3_\u0cac\u0cc1\u0ca7_\u0c97\u0cc1\u0cb0\u0cc1_\u0cb6\u0cc1\u0c95\u0ccd\u0cb0_\u0cb6\u0ca8\u0cbf".split("_"),weekdaysMin:"\u0cad\u0cbe_\u0cb8\u0cc6\u0cc2\u0cd5_\u0cae\u0c82_\u0cac\u0cc1_\u0c97\u0cc1_\u0cb6\u0cc1_\u0cb6".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0c87\u0c82\u0ca6\u0cc1] LT",nextDay:"[\u0ca8\u0cbe\u0cb3\u0cc6] LT",nextWeek:"dddd, LT",lastDay:"[\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6] LT",lastWeek:"[\u0c95\u0cc6\u0cc2\u0ca8\u0cc6\u0caf] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0ca8\u0c82\u0ca4\u0cb0",past:"%s \u0cb9\u0cbf\u0c82\u0ca6\u0cc6",s:"\u0c95\u0cc6\u0cb2\u0cb5\u0cc1 \u0c95\u0ccd\u0cb7\u0ca3\u0c97\u0cb3\u0cc1",ss:"%d \u0cb8\u0cc6\u0c95\u0cc6\u0c82\u0ca1\u0cc1\u0c97\u0cb3\u0cc1",m:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",mm:"%d \u0ca8\u0cbf\u0cae\u0cbf\u0cb7",h:"\u0c92\u0c82\u0ca6\u0cc1 \u0c97\u0c82\u0c9f\u0cc6",hh:"%d \u0c97\u0c82\u0c9f\u0cc6",d:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca6\u0cbf\u0ca8",dd:"%d \u0ca6\u0cbf\u0ca8",M:"\u0c92\u0c82\u0ca6\u0cc1 \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",MM:"%d \u0ca4\u0cbf\u0c82\u0c97\u0cb3\u0cc1",y:"\u0c92\u0c82\u0ca6\u0cc1 \u0cb5\u0cb0\u0ccd\u0cb7",yy:"%d \u0cb5\u0cb0\u0ccd\u0cb7"},preparse:function(t){return t.replace(/[\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u0ce6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf|\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6|\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8|\u0cb8\u0c82\u0c9c\u0cc6/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"===e?t<4?t:t+12:"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6"===e?t:"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8"===e?t>=10?t:t+12:"\u0cb8\u0c82\u0c9c\u0cc6"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf":t<10?"\u0cac\u0cc6\u0cb3\u0cbf\u0c97\u0ccd\u0c97\u0cc6":t<17?"\u0cae\u0ca7\u0ccd\u0caf\u0cbe\u0cb9\u0ccd\u0ca8":t<20?"\u0cb8\u0c82\u0c9c\u0cc6":"\u0cb0\u0cbe\u0ca4\u0ccd\u0cb0\u0cbf"},dayOfMonthOrdinalParse:/\d{1,2}(\u0ca8\u0cc6\u0cd5)/,ordinal:function(t){return t+"\u0ca8\u0cc6\u0cd5"},week:{dow:0,doy:6}})}(n("PJh5"))},gEU3:function(t,e,n){!function(t){"use strict";t.defineLocale("mi",{months:"Kohi-t\u0101te_Hui-tanguru_Pout\u016b-te-rangi_Paenga-wh\u0101wh\u0101_Haratua_Pipiri_H\u014dngoingoi_Here-turi-k\u014dk\u0101_Mahuru_Whiringa-\u0101-nuku_Whiringa-\u0101-rangi_Hakihea".split("_"),monthsShort:"Kohi_Hui_Pou_Pae_Hara_Pipi_H\u014dngoi_Here_Mahu_Whi-nu_Whi-ra_Haki".split("_"),monthsRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,3}/i,monthsShortStrictRegex:/(?:['a-z\u0101\u014D\u016B]+\-?){1,2}/i,weekdays:"R\u0101tapu_Mane_T\u016brei_Wenerei_T\u0101ite_Paraire_H\u0101tarei".split("_"),weekdaysShort:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),weekdaysMin:"Ta_Ma_T\u016b_We_T\u0101i_Pa_H\u0101".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [i] HH:mm",LLLL:"dddd, D MMMM YYYY [i] HH:mm"},calendar:{sameDay:"[i teie mahana, i] LT",nextDay:"[apopo i] LT",nextWeek:"dddd [i] LT",lastDay:"[inanahi i] LT",lastWeek:"dddd [whakamutunga i] LT",sameElse:"L"},relativeTime:{future:"i roto i %s",past:"%s i mua",s:"te h\u0113kona ruarua",ss:"%d h\u0113kona",m:"he meneti",mm:"%d meneti",h:"te haora",hh:"%d haora",d:"he ra",dd:"%d ra",M:"he marama",MM:"%d marama",y:"he tau",yy:"%d tau"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},gUgh:function(t,e,n){!function(t){"use strict";t.defineLocale("tet",{months:"Janeiru_Fevereiru_Marsu_Abril_Maiu_Ju\xf1u_Jullu_Agustu_Setembru_Outubru_Novembru_Dezembru".split("_"),monthsShort:"Jan_Fev_Mar_Abr_Mai_Jun_Jul_Ago_Set_Out_Nov_Dez".split("_"),weekdays:"Domingu_Segunda_Tersa_Kuarta_Kinta_Sesta_Sabadu".split("_"),weekdaysShort:"Dom_Seg_Ters_Kua_Kint_Sest_Sab".split("_"),weekdaysMin:"Do_Seg_Te_Ku_Ki_Ses_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Ohin iha] LT",nextDay:"[Aban iha] LT",nextWeek:"dddd [iha] LT",lastDay:"[Horiseik iha] LT",lastWeek:"dddd [semana kotuk] [iha] LT",sameElse:"L"},relativeTime:{future:"iha %s",past:"%s liuba",s:"minutu balun",ss:"minutu %d",m:"minutu ida",mm:"minutu %d",h:"oras ida",hh:"oras %d",d:"loron ida",dd:"loron %d",M:"fulan ida",MM:"fulan %d",y:"tinan ida",yy:"tinan %d"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hPuz:function(t,e,n){!function(t){"use strict";t.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(t){var e=t%10;return t+(1==~~(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")},week:{dow:1,doy:4}})}(n("PJh5"))},hng5:function(t,e,n){!function(t){"use strict";t.defineLocale("bm",{months:"Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_M\u025bkalo_Zuw\u025bnkalo_Zuluyekalo_Utikalo_S\u025btanburukalo_\u0254kut\u0254burukalo_Nowanburukalo_Desanburukalo".split("_"),monthsShort:"Zan_Few_Mar_Awi_M\u025b_Zuw_Zul_Uti_S\u025bt_\u0254ku_Now_Des".split("_"),weekdays:"Kari_Nt\u025bn\u025bn_Tarata_Araba_Alamisa_Juma_Sibiri".split("_"),weekdaysShort:"Kar_Nt\u025b_Tar_Ara_Ala_Jum_Sib".split("_"),weekdaysMin:"Ka_Nt_Ta_Ar_Al_Ju_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"MMMM [tile] D [san] YYYY",LLL:"MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm",LLLL:"dddd MMMM [tile] D [san] YYYY [l\u025br\u025b] HH:mm"},calendar:{sameDay:"[Bi l\u025br\u025b] LT",nextDay:"[Sini l\u025br\u025b] LT",nextWeek:"dddd [don l\u025br\u025b] LT",lastDay:"[Kunu l\u025br\u025b] LT",lastWeek:"dddd [t\u025bm\u025bnen l\u025br\u025b] LT",sameElse:"L"},relativeTime:{future:"%s k\u0254n\u0254",past:"a b\u025b %s b\u0254",s:"sanga dama dama",ss:"sekondi %d",m:"miniti kelen",mm:"miniti %d",h:"l\u025br\u025b kelen",hh:"l\u025br\u025b %d",d:"tile kelen",dd:"tile %d",M:"kalo kelen",MM:"kalo %d",y:"san kelen",yy:"san %d"},week:{dow:1,doy:4}})}(n("PJh5"))},iNtv:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={s:["viensas secunds","'iensas secunds"],ss:[t+" secunds",t+" secunds"],m:["'n m\xedut","'iens m\xedut"],mm:[t+" m\xeduts",t+" m\xeduts"],h:["'n \xfeora","'iensa \xfeora"],hh:[t+" \xfeoras",t+" \xfeoras"],d:["'n ziua","'iensa ziua"],dd:[t+" ziuas",t+" ziuas"],M:["'n mes","'iens mes"],MM:[t+" mesen",t+" mesen"],y:["'n ar","'iens ar"],yy:[t+" ars",t+" ars"]};return r?i[n][0]:e?i[n][0]:i[n][1]}t.defineLocale("tzl",{months:"Januar_Fevraglh_Mar\xe7_Avr\xefu_Mai_G\xfcn_Julia_Guscht_Setemvar_Listop\xe4ts_Noemvar_Zecemvar".split("_"),monthsShort:"Jan_Fev_Mar_Avr_Mai_G\xfcn_Jul_Gus_Set_Lis_Noe_Zec".split("_"),weekdays:"S\xfaladi_L\xfane\xe7i_Maitzi_M\xe1rcuri_Xh\xfaadi_Vi\xe9ner\xe7i_S\xe1turi".split("_"),weekdaysShort:"S\xfal_L\xfan_Mai_M\xe1r_Xh\xfa_Vi\xe9_S\xe1t".split("_"),weekdaysMin:"S\xfa_L\xfa_Ma_M\xe1_Xh_Vi_S\xe1".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"D. MMMM [dallas] YYYY",LLL:"D. MMMM [dallas] YYYY HH.mm",LLLL:"dddd, [li] D. MMMM [dallas] YYYY HH.mm"},meridiemParse:/d\'o|d\'a/i,isPM:function(t){return"d'o"===t.toLowerCase()},meridiem:function(t,e,n){return t>11?n?"d'o":"D'O":n?"d'a":"D'A"},calendar:{sameDay:"[oxhi \xe0] LT",nextDay:"[dem\xe0 \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[ieiri \xe0] LT",lastWeek:"[s\xfcr el] dddd [lasteu \xe0] LT",sameElse:"L"},relativeTime:{future:"osprei %s",past:"ja%s",s:e,ss:e,m:e,mm:e,h:e,hh:e,d:e,dd:e,M:e,MM:e,y:e,yy:e},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"j+vx":function(t,e,n){!function(t){"use strict";var e={0:"-\u0448\u0456",1:"-\u0448\u0456",2:"-\u0448\u0456",3:"-\u0448\u0456",4:"-\u0448\u0456",5:"-\u0448\u0456",6:"-\u0448\u044b",7:"-\u0448\u0456",8:"-\u0448\u0456",9:"-\u0448\u044b",10:"-\u0448\u044b",20:"-\u0448\u044b",30:"-\u0448\u044b",40:"-\u0448\u044b",50:"-\u0448\u0456",60:"-\u0448\u044b",70:"-\u0448\u0456",80:"-\u0448\u0456",90:"-\u0448\u044b",100:"-\u0448\u0456"};t.defineLocale("kk",{months:"\u049b\u0430\u04a3\u0442\u0430\u0440_\u0430\u049b\u043f\u0430\u043d_\u043d\u0430\u0443\u0440\u044b\u0437_\u0441\u04d9\u0443\u0456\u0440_\u043c\u0430\u043c\u044b\u0440_\u043c\u0430\u0443\u0441\u044b\u043c_\u0448\u0456\u043b\u0434\u0435_\u0442\u0430\u043c\u044b\u0437_\u049b\u044b\u0440\u043a\u04af\u0439\u0435\u043a_\u049b\u0430\u0437\u0430\u043d_\u049b\u0430\u0440\u0430\u0448\u0430_\u0436\u0435\u043b\u0442\u043e\u049b\u0441\u0430\u043d".split("_"),monthsShort:"\u049b\u0430\u04a3_\u0430\u049b\u043f_\u043d\u0430\u0443_\u0441\u04d9\u0443_\u043c\u0430\u043c_\u043c\u0430\u0443_\u0448\u0456\u043b_\u0442\u0430\u043c_\u049b\u044b\u0440_\u049b\u0430\u0437_\u049b\u0430\u0440_\u0436\u0435\u043b".split("_"),weekdays:"\u0436\u0435\u043a\u0441\u0435\u043d\u0431\u0456_\u0434\u04af\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0441\u04d9\u0440\u0441\u0435\u043d\u0431\u0456_\u0431\u0435\u0439\u0441\u0435\u043d\u0431\u0456_\u0436\u04b1\u043c\u0430_\u0441\u0435\u043d\u0431\u0456".split("_"),weekdaysShort:"\u0436\u0435\u043a_\u0434\u04af\u0439_\u0441\u0435\u0439_\u0441\u04d9\u0440_\u0431\u0435\u0439_\u0436\u04b1\u043c_\u0441\u0435\u043d".split("_"),weekdaysMin:"\u0436\u043a_\u0434\u0439_\u0441\u0439_\u0441\u0440_\u0431\u0439_\u0436\u043c_\u0441\u043d".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0411\u04af\u0433\u0456\u043d \u0441\u0430\u0493\u0430\u0442] LT",nextDay:"[\u0415\u0440\u0442\u0435\u04a3 \u0441\u0430\u0493\u0430\u0442] LT",nextWeek:"dddd [\u0441\u0430\u0493\u0430\u0442] LT",lastDay:"[\u041a\u0435\u0448\u0435 \u0441\u0430\u0493\u0430\u0442] LT",lastWeek:"[\u04e8\u0442\u043a\u0435\u043d \u0430\u043f\u0442\u0430\u043d\u044b\u04a3] dddd [\u0441\u0430\u0493\u0430\u0442] LT",sameElse:"L"},relativeTime:{future:"%s \u0456\u0448\u0456\u043d\u0434\u0435",past:"%s \u0431\u04b1\u0440\u044b\u043d",s:"\u0431\u0456\u0440\u043d\u0435\u0448\u0435 \u0441\u0435\u043a\u0443\u043d\u0434",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434",m:"\u0431\u0456\u0440 \u043c\u0438\u043d\u0443\u0442",mm:"%d \u043c\u0438\u043d\u0443\u0442",h:"\u0431\u0456\u0440 \u0441\u0430\u0493\u0430\u0442",hh:"%d \u0441\u0430\u0493\u0430\u0442",d:"\u0431\u0456\u0440 \u043a\u04af\u043d",dd:"%d \u043a\u04af\u043d",M:"\u0431\u0456\u0440 \u0430\u0439",MM:"%d \u0430\u0439",y:"\u0431\u0456\u0440 \u0436\u044b\u043b",yy:"%d \u0436\u044b\u043b"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0448\u0456|\u0448\u044b)/,ordinal:function(t){return t+(e[t]||e[t%10]||e[t>=100?100:null])},week:{dow:1,doy:7}})}(n("PJh5"))},j8cJ:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-kw",{months:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),monthsShort:"\u064a\u0646\u0627\u064a\u0631_\u0641\u0628\u0631\u0627\u064a\u0631_\u0645\u0627\u0631\u0633_\u0623\u0628\u0631\u064a\u0644_\u0645\u0627\u064a_\u064a\u0648\u0646\u064a\u0648_\u064a\u0648\u0644\u064a\u0648\u0632_\u063a\u0634\u062a_\u0634\u062a\u0646\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0646\u0628\u0631_\u062f\u062c\u0646\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062a\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062a\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:12}})}(n("PJh5"))},jxEH:function(t,e,n){!function(t){"use strict";var e={ss:"sekundes_sekund\u0113m_sekunde_sekundes".split("_"),m:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),mm:"min\u016btes_min\u016bt\u0113m_min\u016bte_min\u016btes".split("_"),h:"stundas_stund\u0101m_stunda_stundas".split("_"),hh:"stundas_stund\u0101m_stunda_stundas".split("_"),d:"dienas_dien\u0101m_diena_dienas".split("_"),dd:"dienas_dien\u0101m_diena_dienas".split("_"),M:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),MM:"m\u0113ne\u0161a_m\u0113ne\u0161iem_m\u0113nesis_m\u0113ne\u0161i".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};function n(t,e,n){return n?e%10==1&&e%100!=11?t[2]:t[3]:e%10==1&&e%100!=11?t[0]:t[1]}function r(t,r,i){return t+" "+n(e[i],t,r)}function i(t,r,i){return n(e[i],t,r)}t.defineLocale("lv",{months:"janv\u0101ris_febru\u0101ris_marts_apr\u012blis_maijs_j\u016bnijs_j\u016blijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_j\u016bn_j\u016bl_aug_sep_okt_nov_dec".split("_"),weekdays:"sv\u0113tdiena_pirmdiena_otrdiena_tre\u0161diena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[\u0160odien pulksten] LT",nextDay:"[R\u012bt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pag\u0101ju\u0161\u0101] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"p\u0113c %s",past:"pirms %s",s:function(t,e){return e?"da\u017eas sekundes":"da\u017e\u0101m sekund\u0113m"},ss:r,m:i,mm:r,h:i,hh:r,d:i,dd:r,M:i,MM:r,y:i,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},"k+5o":function(t,e,n){!function(t){"use strict";var e={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'\xfcnc\xfc",4:"'\xfcnc\xfc",100:"'\xfcnc\xfc",6:"'nc\u0131",9:"'uncu",10:"'uncu",30:"'uncu",60:"'\u0131nc\u0131",90:"'\u0131nc\u0131"};t.defineLocale("tr",{months:"Ocak_\u015eubat_Mart_Nisan_May\u0131s_Haziran_Temmuz_A\u011fustos_Eyl\xfcl_Ekim_Kas\u0131m_Aral\u0131k".split("_"),monthsShort:"Oca_\u015eub_Mar_Nis_May_Haz_Tem_A\u011fu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Sal\u0131_\xc7ar\u015famba_Per\u015fembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_\xc7ar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_\xc7a_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bug\xfcn saat] LT",nextDay:"[yar\u0131n saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[d\xfcn] LT",lastWeek:"[ge\xe7en] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s \xf6nce",s:"birka\xe7 saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir g\xfcn",dd:"%d g\xfcn",M:"bir ay",MM:"%d ay",y:"bir y\u0131l",yy:"%d y\u0131l"},ordinal:function(t,n){switch(n){case"d":case"D":case"Do":case"DD":return t;default:if(0===t)return t+"'\u0131nc\u0131";var r=t%10;return t+(e[r]||e[t%100-r]||e[t>=100?100:null])}},week:{dow:1,doy:7}})}(n("PJh5"))},krPU:function(t,e,n){!function(t){"use strict";t.defineLocale("tzm-latn",{months:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),monthsShort:"innayr_br\u02e4ayr\u02e4_mar\u02e4s\u02e4_ibrir_mayyw_ywnyw_ywlywz_\u0263w\u0161t_\u0161wtanbir_kt\u02e4wbr\u02e4_nwwanbir_dwjnbir".split("_"),weekdays:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysShort:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),weekdaysMin:"asamas_aynas_asinas_akras_akwas_asimwas_asi\u1e0dyas".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[asdkh g] LT",nextDay:"[aska g] LT",nextWeek:"dddd [g] LT",lastDay:"[assant g] LT",lastWeek:"dddd [g] LT",sameElse:"L"},relativeTime:{future:"dadkh s yan %s",past:"yan %s",s:"imik",ss:"%d imik",m:"minu\u1e0d",mm:"%d minu\u1e0d",h:"sa\u025ba",hh:"%d tassa\u025bin",d:"ass",dd:"%d ossan",M:"ayowr",MM:"%d iyyirn",y:"asgas",yy:"%d isgasn"},week:{dow:6,doy:12}})}(n("PJh5"))},lOED:function(t,e,n){!function(t){"use strict";t.defineLocale("bg",{months:"\u044f\u043d\u0443\u0430\u0440\u0438_\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0438\u043b_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438_\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438_\u043d\u043e\u0435\u043c\u0432\u0440\u0438_\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438".split("_"),monthsShort:"\u044f\u043d\u0440_\u0444\u0435\u0432_\u043c\u0430\u0440_\u0430\u043f\u0440_\u043c\u0430\u0439_\u044e\u043d\u0438_\u044e\u043b\u0438_\u0430\u0432\u0433_\u0441\u0435\u043f_\u043e\u043a\u0442_\u043d\u043e\u0435_\u0434\u0435\u043a".split("_"),weekdays:"\u043d\u0435\u0434\u0435\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u044f\u0434\u0430_\u0447\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a_\u043f\u0435\u0442\u044a\u043a_\u0441\u044a\u0431\u043e\u0442\u0430".split("_"),weekdaysShort:"\u043d\u0435\u0434_\u043f\u043e\u043d_\u0432\u0442\u043e_\u0441\u0440\u044f_\u0447\u0435\u0442_\u043f\u0435\u0442_\u0441\u044a\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[\u0414\u043d\u0435\u0441 \u0432] LT",nextDay:"[\u0423\u0442\u0440\u0435 \u0432] LT",nextWeek:"dddd [\u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0430\u0442\u0430] dddd [\u0432] LT";case 1:case 2:case 4:case 5:return"[\u0412 \u0438\u0437\u043c\u0438\u043d\u0430\u043b\u0438\u044f] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0441\u043b\u0435\u0434 %s",past:"\u043f\u0440\u0435\u0434\u0438 %s",s:"\u043d\u044f\u043a\u043e\u043b\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434\u0438",ss:"%d \u0441\u0435\u043a\u0443\u043d\u0434\u0438",m:"\u043c\u0438\u043d\u0443\u0442\u0430",mm:"%d \u043c\u0438\u043d\u0443\u0442\u0438",h:"\u0447\u0430\u0441",hh:"%d \u0447\u0430\u0441\u0430",d:"\u0434\u0435\u043d",dd:"%d \u0434\u043d\u0438",M:"\u043c\u0435\u0441\u0435\u0446",MM:"%d \u043c\u0435\u0441\u0435\u0446\u0430",y:"\u0433\u043e\u0434\u0438\u043d\u0430",yy:"%d \u0433\u043e\u0434\u0438\u043d\u0438"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0435\u0432|\u0435\u043d|\u0442\u0438|\u0432\u0438|\u0440\u0438|\u043c\u0438)/,ordinal:function(t){var e=t%10,n=t%100;return 0===t?t+"-\u0435\u0432":0===n?t+"-\u0435\u043d":n>10&&n<20?t+"-\u0442\u0438":1===e?t+"-\u0432\u0438":2===e?t+"-\u0440\u0438":7===e||8===e?t+"-\u043c\u0438":t+"-\u0442\u0438"},week:{dow:1,doy:7}})}(n("PJh5"))},m7yE:function(t,e,n){!function(t){"use strict";var e="pagh_wa\u2019_cha\u2019_wej_loS_vagh_jav_Soch_chorgh_Hut".split("_");function n(t,n,r,i){var o=function(t){var n=Math.floor(t%1e3/100),r=Math.floor(t%100/10),i=t%10,o="";return n>0&&(o+=e[n]+"vatlh"),r>0&&(o+=(""!==o?" ":"")+e[r]+"maH"),i>0&&(o+=(""!==o?" ":"")+e[i]),""===o?"pagh":o}(t);switch(r){case"ss":return o+" lup";case"mm":return o+" tup";case"hh":return o+" rep";case"dd":return o+" jaj";case"MM":return o+" jar";case"yy":return o+" DIS"}}t.defineLocale("tlh",{months:"tera\u2019 jar wa\u2019_tera\u2019 jar cha\u2019_tera\u2019 jar wej_tera\u2019 jar loS_tera\u2019 jar vagh_tera\u2019 jar jav_tera\u2019 jar Soch_tera\u2019 jar chorgh_tera\u2019 jar Hut_tera\u2019 jar wa\u2019maH_tera\u2019 jar wa\u2019maH wa\u2019_tera\u2019 jar wa\u2019maH cha\u2019".split("_"),monthsShort:"jar wa\u2019_jar cha\u2019_jar wej_jar loS_jar vagh_jar jav_jar Soch_jar chorgh_jar Hut_jar wa\u2019maH_jar wa\u2019maH wa\u2019_jar wa\u2019maH cha\u2019".split("_"),monthsParseExact:!0,weekdays:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysShort:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),weekdaysMin:"lojmItjaj_DaSjaj_povjaj_ghItlhjaj_loghjaj_buqjaj_ghInjaj".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[DaHjaj] LT",nextDay:"[wa\u2019leS] LT",nextWeek:"LLL",lastDay:"[wa\u2019Hu\u2019] LT",lastWeek:"LLL",sameElse:"L"},relativeTime:{future:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"leS":-1!==t.indexOf("jar")?e.slice(0,-3)+"waQ":-1!==t.indexOf("DIS")?e.slice(0,-3)+"nem":e+" pIq"},past:function(t){var e=t;return-1!==t.indexOf("jaj")?e.slice(0,-3)+"Hu\u2019":-1!==t.indexOf("jar")?e.slice(0,-3)+"wen":-1!==t.indexOf("DIS")?e.slice(0,-3)+"ben":e+" ret"},s:"puS lup",ss:n,m:"wa\u2019 tup",mm:n,h:"wa\u2019 rep",hh:n,d:"wa\u2019 jaj",dd:n,M:"wa\u2019 jar",MM:n,y:"wa\u2019 DIS",yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},nE8X:function(t,e,n){!function(t){"use strict";t.defineLocale("lo",{months:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),monthsShort:"\u0ea1\u0eb1\u0e87\u0e81\u0ead\u0e99_\u0e81\u0eb8\u0ea1\u0e9e\u0eb2_\u0ea1\u0eb5\u0e99\u0eb2_\u0ec0\u0ea1\u0eaa\u0eb2_\u0e9e\u0eb6\u0e94\u0eaa\u0eb0\u0e9e\u0eb2_\u0ea1\u0eb4\u0e96\u0eb8\u0e99\u0eb2_\u0e81\u0ecd\u0ea5\u0eb0\u0e81\u0ebb\u0e94_\u0eaa\u0eb4\u0e87\u0eab\u0eb2_\u0e81\u0eb1\u0e99\u0e8d\u0eb2_\u0e95\u0eb8\u0ea5\u0eb2_\u0e9e\u0eb0\u0e88\u0eb4\u0e81_\u0e97\u0eb1\u0e99\u0ea7\u0eb2".split("_"),weekdays:"\u0ead\u0eb2\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysShort:"\u0e97\u0eb4\u0e94_\u0e88\u0eb1\u0e99_\u0ead\u0eb1\u0e87\u0e84\u0eb2\u0e99_\u0e9e\u0eb8\u0e94_\u0e9e\u0eb0\u0eab\u0eb1\u0e94_\u0eaa\u0eb8\u0e81_\u0ec0\u0eaa\u0ebb\u0eb2".split("_"),weekdaysMin:"\u0e97_\u0e88_\u0ead\u0e84_\u0e9e_\u0e9e\u0eab_\u0eaa\u0e81_\u0eaa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"\u0ea7\u0eb1\u0e99dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2|\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87/,isPM:function(t){return"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"===t},meridiem:function(t,e,n){return t<12?"\u0e95\u0ead\u0e99\u0ec0\u0e8a\u0ebb\u0ec9\u0eb2":"\u0e95\u0ead\u0e99\u0ec1\u0ea5\u0e87"},calendar:{sameDay:"[\u0ea1\u0eb7\u0ec9\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextDay:"[\u0ea1\u0eb7\u0ec9\u0ead\u0eb7\u0ec8\u0e99\u0ec0\u0ea7\u0ea5\u0eb2] LT",nextWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0edc\u0ec9\u0eb2\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastDay:"[\u0ea1\u0eb7\u0ec9\u0ea7\u0eb2\u0e99\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",lastWeek:"[\u0ea7\u0eb1\u0e99]dddd[\u0ec1\u0ea5\u0ec9\u0ea7\u0e99\u0eb5\u0ec9\u0ec0\u0ea7\u0ea5\u0eb2] LT",sameElse:"L"},relativeTime:{future:"\u0ead\u0eb5\u0e81 %s",past:"%s\u0e9c\u0ec8\u0eb2\u0e99\u0ea1\u0eb2",s:"\u0e9a\u0ecd\u0ec8\u0ec0\u0e97\u0ebb\u0ec8\u0eb2\u0ec3\u0e94\u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",ss:"%d \u0ea7\u0eb4\u0e99\u0eb2\u0e97\u0eb5",m:"1 \u0e99\u0eb2\u0e97\u0eb5",mm:"%d \u0e99\u0eb2\u0e97\u0eb5",h:"1 \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",hh:"%d \u0e8a\u0ebb\u0ec8\u0ea7\u0ec2\u0ea1\u0e87",d:"1 \u0ea1\u0eb7\u0ec9",dd:"%d \u0ea1\u0eb7\u0ec9",M:"1 \u0ec0\u0e94\u0eb7\u0ead\u0e99",MM:"%d \u0ec0\u0e94\u0eb7\u0ead\u0e99",y:"1 \u0e9b\u0eb5",yy:"%d \u0e9b\u0eb5"},dayOfMonthOrdinalParse:/(\u0e97\u0eb5\u0ec8)\d{1,2}/,ordinal:function(t){return"\u0e97\u0eb5\u0ec8"+t}})}(n("PJh5"))},nLOz:function(t,e,n){!function(t){"use strict";t.defineLocale("gd",{months:["Am Faoilleach","An Gearran","Am M\xe0rt","An Giblean","An C\xe8itean","An t-\xd2gmhios","An t-Iuchar","An L\xf9nastal","An t-Sultain","An D\xe0mhair","An t-Samhain","An D\xf9bhlachd"],monthsShort:["Faoi","Gear","M\xe0rt","Gibl","C\xe8it","\xd2gmh","Iuch","L\xf9n","Sult","D\xe0mh","Samh","D\xf9bh"],monthsParseExact:!0,weekdays:["Did\xf2mhnaich","Diluain","Dim\xe0irt","Diciadain","Diardaoin","Dihaoine","Disathairne"],weekdaysShort:["Did","Dil","Dim","Dic","Dia","Dih","Dis"],weekdaysMin:["D\xf2","Lu","M\xe0","Ci","Ar","Ha","Sa"],longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[An-diugh aig] LT",nextDay:"[A-m\xe0ireach aig] LT",nextWeek:"dddd [aig] LT",lastDay:"[An-d\xe8 aig] LT",lastWeek:"dddd [seo chaidh] [aig] LT",sameElse:"L"},relativeTime:{future:"ann an %s",past:"bho chionn %s",s:"beagan diogan",ss:"%d diogan",m:"mionaid",mm:"%d mionaidean",h:"uair",hh:"%d uairean",d:"latha",dd:"%d latha",M:"m\xecos",MM:"%d m\xecosan",y:"bliadhna",yy:"%d bliadhna"},dayOfMonthOrdinalParse:/\d{1,2}(d|na|mh)/,ordinal:function(t){return t+(1===t?"d":t%10==2?"na":"mh")},week:{dow:1,doy:4}})}(n("PJh5"))},nS2h:function(t,e,n){!function(t){"use strict";var e="nolla yksi kaksi kolme nelj\xe4 viisi kuusi seitsem\xe4n kahdeksan yhdeks\xe4n".split(" "),n=["nolla","yhden","kahden","kolmen","nelj\xe4n","viiden","kuuden",e[7],e[8],e[9]];function r(t,r,i,o){var s="";switch(i){case"s":return o?"muutaman sekunnin":"muutama sekunti";case"ss":return o?"sekunnin":"sekuntia";case"m":return o?"minuutin":"minuutti";case"mm":s=o?"minuutin":"minuuttia";break;case"h":return o?"tunnin":"tunti";case"hh":s=o?"tunnin":"tuntia";break;case"d":return o?"p\xe4iv\xe4n":"p\xe4iv\xe4";case"dd":s=o?"p\xe4iv\xe4n":"p\xe4iv\xe4\xe4";break;case"M":return o?"kuukauden":"kuukausi";case"MM":s=o?"kuukauden":"kuukautta";break;case"y":return o?"vuoden":"vuosi";case"yy":s=o?"vuoden":"vuotta"}return function(t,r){return t<10?r?n[t]:e[t]:t}(t,o)+" "+s}t.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kes\xe4kuu_hein\xe4kuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kes\xe4_hein\xe4_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[t\xe4n\xe4\xe4n] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s p\xe4\xe4st\xe4",past:"%s sitten",s:r,ss:r,m:r,mm:r,h:r,hh:r,d:r,dd:r,M:r,MM:r,y:r,yy:r},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},ntHu:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443":"h"===n?e?"\u0433\u043e\u0434\u0438\u043d\u0430":"\u0433\u043e\u0434\u0438\u043d\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u0438_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u0445\u0432\u0438\u043b\u0438\u043d\u0430_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d":"\u0445\u0432\u0438\u043b\u0438\u043d\u0443_\u0445\u0432\u0438\u043b\u0438\u043d\u0438_\u0445\u0432\u0438\u043b\u0438\u043d",hh:e?"\u0433\u043e\u0434\u0438\u043d\u0430_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d":"\u0433\u043e\u0434\u0438\u043d\u0443_\u0433\u043e\u0434\u0438\u043d\u0438_\u0433\u043e\u0434\u0438\u043d",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u0456_\u0434\u043d\u0456\u0432",MM:"\u043c\u0456\u0441\u044f\u0446\u044c_\u043c\u0456\u0441\u044f\u0446\u0456_\u043c\u0456\u0441\u044f\u0446\u0456\u0432",yy:"\u0440\u0456\u043a_\u0440\u043e\u043a\u0438_\u0440\u043e\u043a\u0456\u0432"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}function n(t){return function(){return t+"\u043e"+(11===this.hours()?"\u0431":"")+"] LT"}}t.defineLocale("uk",{months:{format:"\u0441\u0456\u0447\u043d\u044f_\u043b\u044e\u0442\u043e\u0433\u043e_\u0431\u0435\u0440\u0435\u0437\u043d\u044f_\u043a\u0432\u0456\u0442\u043d\u044f_\u0442\u0440\u0430\u0432\u043d\u044f_\u0447\u0435\u0440\u0432\u043d\u044f_\u043b\u0438\u043f\u043d\u044f_\u0441\u0435\u0440\u043f\u043d\u044f_\u0432\u0435\u0440\u0435\u0441\u043d\u044f_\u0436\u043e\u0432\u0442\u043d\u044f_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430_\u0433\u0440\u0443\u0434\u043d\u044f".split("_"),standalone:"\u0441\u0456\u0447\u0435\u043d\u044c_\u043b\u044e\u0442\u0438\u0439_\u0431\u0435\u0440\u0435\u0437\u0435\u043d\u044c_\u043a\u0432\u0456\u0442\u0435\u043d\u044c_\u0442\u0440\u0430\u0432\u0435\u043d\u044c_\u0447\u0435\u0440\u0432\u0435\u043d\u044c_\u043b\u0438\u043f\u0435\u043d\u044c_\u0441\u0435\u0440\u043f\u0435\u043d\u044c_\u0432\u0435\u0440\u0435\u0441\u0435\u043d\u044c_\u0436\u043e\u0432\u0442\u0435\u043d\u044c_\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434_\u0433\u0440\u0443\u0434\u0435\u043d\u044c".split("_")},monthsShort:"\u0441\u0456\u0447_\u043b\u044e\u0442_\u0431\u0435\u0440_\u043a\u0432\u0456\u0442_\u0442\u0440\u0430\u0432_\u0447\u0435\u0440\u0432_\u043b\u0438\u043f_\u0441\u0435\u0440\u043f_\u0432\u0435\u0440_\u0436\u043e\u0432\u0442_\u043b\u0438\u0441\u0442_\u0433\u0440\u0443\u0434".split("_"),weekdays:function(t,e){var n={nominative:"\u043d\u0435\u0434\u0456\u043b\u044f_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044f_\u0441\u0443\u0431\u043e\u0442\u0430".split("_"),accusative:"\u043d\u0435\u0434\u0456\u043b\u044e_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a_\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a_\u0441\u0435\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u044e_\u0441\u0443\u0431\u043e\u0442\u0443".split("_"),genitive:"\u043d\u0435\u0434\u0456\u043b\u0456_\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043a\u0430_\u0432\u0456\u0432\u0442\u043e\u0440\u043a\u0430_\u0441\u0435\u0440\u0435\u0434\u0438_\u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430_\u043f\u2019\u044f\u0442\u043d\u0438\u0446\u0456_\u0441\u0443\u0431\u043e\u0442\u0438".split("_")};return t?n[/(\[[\u0412\u0432\u0423\u0443]\]) ?dddd/.test(e)?"accusative":/\[?(?:\u043c\u0438\u043d\u0443\u043b\u043e\u0457|\u043d\u0430\u0441\u0442\u0443\u043f\u043d\u043e\u0457)? ?\] ?dddd/.test(e)?"genitive":"nominative"][t.day()]:n.nominative},weekdaysShort:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u043d\u0434_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0440.",LLL:"D MMMM YYYY \u0440., HH:mm",LLLL:"dddd, D MMMM YYYY \u0440., HH:mm"},calendar:{sameDay:n("[\u0421\u044c\u043e\u0433\u043e\u0434\u043d\u0456 "),nextDay:n("[\u0417\u0430\u0432\u0442\u0440\u0430 "),lastDay:n("[\u0412\u0447\u043e\u0440\u0430 "),nextWeek:n("[\u0423] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0457] dddd [").call(this);case 1:case 2:case 4:return n("[\u041c\u0438\u043d\u0443\u043b\u043e\u0433\u043e] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"\u0437\u0430 %s",past:"%s \u0442\u043e\u043c\u0443",s:"\u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0433\u043e\u0434\u0438\u043d\u0443",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0456\u0441\u044f\u0446\u044c",MM:e,y:"\u0440\u0456\u043a",yy:e},meridiemParse:/\u043d\u043e\u0447\u0456|\u0440\u0430\u043d\u043a\u0443|\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430/,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u043e\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0456":t<12?"\u0440\u0430\u043d\u043a\u0443":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u043e\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":case"w":case"W":return t+"-\u0439";case"D":return t+"-\u0433\u043e";default:return t}},week:{dow:1,doy:7}})}(n("PJh5"))},oCzW:function(t,e,n){!function(t){"use strict";t.defineLocale("mt",{months:"Jannar_Frar_Marzu_April_Mejju_\u0120unju_Lulju_Awwissu_Settembru_Ottubru_Novembru_Di\u010bembru".split("_"),monthsShort:"Jan_Fra_Mar_Apr_Mej_\u0120un_Lul_Aww_Set_Ott_Nov_Di\u010b".split("_"),weekdays:"Il-\u0126add_It-Tnejn_It-Tlieta_L-Erbg\u0127a_Il-\u0126amis_Il-\u0120img\u0127a_Is-Sibt".split("_"),weekdaysShort:"\u0126ad_Tne_Tli_Erb_\u0126am_\u0120im_Sib".split("_"),weekdaysMin:"\u0126a_Tn_Tl_Er_\u0126a_\u0120i_Si".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Illum fil-]LT",nextDay:"[G\u0127ada fil-]LT",nextWeek:"dddd [fil-]LT",lastDay:"[Il-biera\u0127 fil-]LT",lastWeek:"dddd [li g\u0127adda] [fil-]LT",sameElse:"L"},relativeTime:{future:"f\u2019 %s",past:"%s ilu",s:"ftit sekondi",ss:"%d sekondi",m:"minuta",mm:"%d minuti",h:"sieg\u0127a",hh:"%d sieg\u0127at",d:"\u0121urnata",dd:"%d \u0121ranet",M:"xahar",MM:"%d xhur",y:"sena",yy:"%d sni"},dayOfMonthOrdinalParse:/\d{1,2}\xba/,ordinal:"%d\xba",week:{dow:1,doy:4}})}(n("PJh5"))},oo1B:function(t,e,n){!function(t){"use strict";t.defineLocale("ml",{months:"\u0d1c\u0d28\u0d41\u0d35\u0d30\u0d3f_\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41\u0d35\u0d30\u0d3f_\u0d2e\u0d3e\u0d7c\u0d1a\u0d4d\u0d1a\u0d4d_\u0d0f\u0d2a\u0d4d\u0d30\u0d3f\u0d7d_\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48_\u0d13\u0d17\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4d_\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d02\u0d2c\u0d7c_\u0d12\u0d15\u0d4d\u0d1f\u0d4b\u0d2c\u0d7c_\u0d28\u0d35\u0d02\u0d2c\u0d7c_\u0d21\u0d3f\u0d38\u0d02\u0d2c\u0d7c".split("_"),monthsShort:"\u0d1c\u0d28\u0d41._\u0d2b\u0d46\u0d2c\u0d4d\u0d30\u0d41._\u0d2e\u0d3e\u0d7c._\u0d0f\u0d2a\u0d4d\u0d30\u0d3f._\u0d2e\u0d47\u0d2f\u0d4d_\u0d1c\u0d42\u0d7a_\u0d1c\u0d42\u0d32\u0d48._\u0d13\u0d17._\u0d38\u0d46\u0d2a\u0d4d\u0d31\u0d4d\u0d31._\u0d12\u0d15\u0d4d\u0d1f\u0d4b._\u0d28\u0d35\u0d02._\u0d21\u0d3f\u0d38\u0d02.".split("_"),monthsParseExact:!0,weekdays:"\u0d1e\u0d3e\u0d2f\u0d31\u0d3e\u0d34\u0d4d\u0d1a_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d33\u0d3e\u0d34\u0d4d\u0d1a_\u0d1a\u0d4a\u0d35\u0d4d\u0d35\u0d3e\u0d34\u0d4d\u0d1a_\u0d2c\u0d41\u0d27\u0d28\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d3e\u0d34\u0d4d\u0d1a_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a_\u0d36\u0d28\u0d3f\u0d2f\u0d3e\u0d34\u0d4d\u0d1a".split("_"),weekdaysShort:"\u0d1e\u0d3e\u0d2f\u0d7c_\u0d24\u0d3f\u0d19\u0d4d\u0d15\u0d7e_\u0d1a\u0d4a\u0d35\u0d4d\u0d35_\u0d2c\u0d41\u0d27\u0d7b_\u0d35\u0d4d\u0d2f\u0d3e\u0d34\u0d02_\u0d35\u0d46\u0d33\u0d4d\u0d33\u0d3f_\u0d36\u0d28\u0d3f".split("_"),weekdaysMin:"\u0d1e\u0d3e_\u0d24\u0d3f_\u0d1a\u0d4a_\u0d2c\u0d41_\u0d35\u0d4d\u0d2f\u0d3e_\u0d35\u0d46_\u0d36".split("_"),longDateFormat:{LT:"A h:mm -\u0d28\u0d41",LTS:"A h:mm:ss -\u0d28\u0d41",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm -\u0d28\u0d41",LLLL:"dddd, D MMMM YYYY, A h:mm -\u0d28\u0d41"},calendar:{sameDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d4d] LT",nextDay:"[\u0d28\u0d3e\u0d33\u0d46] LT",nextWeek:"dddd, LT",lastDay:"[\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46] LT",lastWeek:"[\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d",past:"%s \u0d2e\u0d41\u0d7b\u0d2a\u0d4d",s:"\u0d05\u0d7d\u0d2a \u0d28\u0d3f\u0d2e\u0d3f\u0d37\u0d19\u0d4d\u0d19\u0d7e",ss:"%d \u0d38\u0d46\u0d15\u0d4d\u0d15\u0d7b\u0d21\u0d4d",m:"\u0d12\u0d30\u0d41 \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",mm:"%d \u0d2e\u0d3f\u0d28\u0d3f\u0d31\u0d4d\u0d31\u0d4d",h:"\u0d12\u0d30\u0d41 \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",hh:"%d \u0d2e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d42\u0d7c",d:"\u0d12\u0d30\u0d41 \u0d26\u0d3f\u0d35\u0d38\u0d02",dd:"%d \u0d26\u0d3f\u0d35\u0d38\u0d02",M:"\u0d12\u0d30\u0d41 \u0d2e\u0d3e\u0d38\u0d02",MM:"%d \u0d2e\u0d3e\u0d38\u0d02",y:"\u0d12\u0d30\u0d41 \u0d35\u0d7c\u0d37\u0d02",yy:"%d \u0d35\u0d7c\u0d37\u0d02"},meridiemParse:/\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f|\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46|\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d|\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02|\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f/i,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"===e&&t>=4||"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d"===e||"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f":t<12?"\u0d30\u0d3e\u0d35\u0d3f\u0d32\u0d46":t<17?"\u0d09\u0d1a\u0d4d\u0d1a \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d4d":t<20?"\u0d35\u0d48\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d47\u0d30\u0d02":"\u0d30\u0d3e\u0d24\u0d4d\u0d30\u0d3f"}})}(n("PJh5"))},ooba:function(t,e,n){!function(t){"use strict";t.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(t,e){return 12===t&&(t=0),"pagi"===e?t:"tengahari"===e?t>=11?t:t+12:"petang"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"tengahari":t<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},"pU/0":function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(){var e=t.call(this,"argument out of range");this.name=e.name="ArgumentOutOfRangeError",this.stack=e.stack,this.message=e.message}return Object(r.__extends)(e,t),e}(Error)},pfs9:function(t,e,n){!function(t){"use strict";var e={1:"\u0a67",2:"\u0a68",3:"\u0a69",4:"\u0a6a",5:"\u0a6b",6:"\u0a6c",7:"\u0a6d",8:"\u0a6e",9:"\u0a6f",0:"\u0a66"},n={"\u0a67":"1","\u0a68":"2","\u0a69":"3","\u0a6a":"4","\u0a6b":"5","\u0a6c":"6","\u0a6d":"7","\u0a6e":"8","\u0a6f":"9","\u0a66":"0"};t.defineLocale("pa-in",{months:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),monthsShort:"\u0a1c\u0a28\u0a35\u0a30\u0a40_\u0a2b\u0a3c\u0a30\u0a35\u0a30\u0a40_\u0a2e\u0a3e\u0a30\u0a1a_\u0a05\u0a2a\u0a4d\u0a30\u0a48\u0a32_\u0a2e\u0a08_\u0a1c\u0a42\u0a28_\u0a1c\u0a41\u0a32\u0a3e\u0a08_\u0a05\u0a17\u0a38\u0a24_\u0a38\u0a24\u0a70\u0a2c\u0a30_\u0a05\u0a15\u0a24\u0a42\u0a2c\u0a30_\u0a28\u0a35\u0a70\u0a2c\u0a30_\u0a26\u0a38\u0a70\u0a2c\u0a30".split("_"),weekdays:"\u0a10\u0a24\u0a35\u0a3e\u0a30_\u0a38\u0a4b\u0a2e\u0a35\u0a3e\u0a30_\u0a2e\u0a70\u0a17\u0a32\u0a35\u0a3e\u0a30_\u0a2c\u0a41\u0a27\u0a35\u0a3e\u0a30_\u0a35\u0a40\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a41\u0a71\u0a15\u0a30\u0a35\u0a3e\u0a30_\u0a38\u0a3c\u0a28\u0a40\u0a1a\u0a30\u0a35\u0a3e\u0a30".split("_"),weekdaysShort:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),weekdaysMin:"\u0a10\u0a24_\u0a38\u0a4b\u0a2e_\u0a2e\u0a70\u0a17\u0a32_\u0a2c\u0a41\u0a27_\u0a35\u0a40\u0a30_\u0a38\u0a3c\u0a41\u0a15\u0a30_\u0a38\u0a3c\u0a28\u0a40".split("_"),longDateFormat:{LT:"A h:mm \u0a35\u0a1c\u0a47",LTS:"A h:mm:ss \u0a35\u0a1c\u0a47",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47",LLLL:"dddd, D MMMM YYYY, A h:mm \u0a35\u0a1c\u0a47"},calendar:{sameDay:"[\u0a05\u0a1c] LT",nextDay:"[\u0a15\u0a32] LT",nextWeek:"dddd, LT",lastDay:"[\u0a15\u0a32] LT",lastWeek:"[\u0a2a\u0a3f\u0a1b\u0a32\u0a47] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0a35\u0a3f\u0a71\u0a1a",past:"%s \u0a2a\u0a3f\u0a1b\u0a32\u0a47",s:"\u0a15\u0a41\u0a1d \u0a38\u0a15\u0a3f\u0a70\u0a1f",ss:"%d \u0a38\u0a15\u0a3f\u0a70\u0a1f",m:"\u0a07\u0a15 \u0a2e\u0a3f\u0a70\u0a1f",mm:"%d \u0a2e\u0a3f\u0a70\u0a1f",h:"\u0a07\u0a71\u0a15 \u0a18\u0a70\u0a1f\u0a3e",hh:"%d \u0a18\u0a70\u0a1f\u0a47",d:"\u0a07\u0a71\u0a15 \u0a26\u0a3f\u0a28",dd:"%d \u0a26\u0a3f\u0a28",M:"\u0a07\u0a71\u0a15 \u0a2e\u0a39\u0a40\u0a28\u0a3e",MM:"%d \u0a2e\u0a39\u0a40\u0a28\u0a47",y:"\u0a07\u0a71\u0a15 \u0a38\u0a3e\u0a32",yy:"%d \u0a38\u0a3e\u0a32"},preparse:function(t){return t.replace(/[\u0a67\u0a68\u0a69\u0a6a\u0a6b\u0a6c\u0a6d\u0a6e\u0a6f\u0a66]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0a30\u0a3e\u0a24|\u0a38\u0a35\u0a47\u0a30|\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30|\u0a38\u0a3c\u0a3e\u0a2e/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0a30\u0a3e\u0a24"===e?t<4?t:t+12:"\u0a38\u0a35\u0a47\u0a30"===e?t:"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30"===e?t>=10?t:t+12:"\u0a38\u0a3c\u0a3e\u0a2e"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0a30\u0a3e\u0a24":t<10?"\u0a38\u0a35\u0a47\u0a30":t<17?"\u0a26\u0a41\u0a2a\u0a39\u0a3f\u0a30":t<20?"\u0a38\u0a3c\u0a3e\u0a2e":"\u0a30\u0a3e\u0a24"},week:{dow:0,doy:6}})}(n("PJh5"))},rIuo:function(t,e,n){!function(t){"use strict";var e=["\u0796\u07ac\u0782\u07aa\u0787\u07a6\u0783\u07a9","\u078a\u07ac\u0784\u07b0\u0783\u07aa\u0787\u07a6\u0783\u07a9","\u0789\u07a7\u0783\u07a8\u0797\u07aa","\u0787\u07ad\u0795\u07b0\u0783\u07a9\u078d\u07aa","\u0789\u07ad","\u0796\u07ab\u0782\u07b0","\u0796\u07aa\u078d\u07a6\u0787\u07a8","\u0787\u07af\u078e\u07a6\u0790\u07b0\u0793\u07aa","\u0790\u07ac\u0795\u07b0\u0793\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0787\u07ae\u0786\u07b0\u0793\u07af\u0784\u07a6\u0783\u07aa","\u0782\u07ae\u0788\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa","\u0791\u07a8\u0790\u07ac\u0789\u07b0\u0784\u07a6\u0783\u07aa"],n=["\u0787\u07a7\u078b\u07a8\u0787\u07b0\u078c\u07a6","\u0780\u07af\u0789\u07a6","\u0787\u07a6\u0782\u07b0\u078e\u07a7\u0783\u07a6","\u0784\u07aa\u078b\u07a6","\u0784\u07aa\u0783\u07a7\u0790\u07b0\u078a\u07a6\u078c\u07a8","\u0780\u07aa\u0786\u07aa\u0783\u07aa","\u0780\u07ae\u0782\u07a8\u0780\u07a8\u0783\u07aa"];t.defineLocale("dv",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:"\u0787\u07a7\u078b\u07a8_\u0780\u07af\u0789\u07a6_\u0787\u07a6\u0782\u07b0_\u0784\u07aa\u078b\u07a6_\u0784\u07aa\u0783\u07a7_\u0780\u07aa\u0786\u07aa_\u0780\u07ae\u0782\u07a8".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/M/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0789\u0786|\u0789\u078a/,isPM:function(t){return"\u0789\u078a"===t},meridiem:function(t,e,n){return t<12?"\u0789\u0786":"\u0789\u078a"},calendar:{sameDay:"[\u0789\u07a8\u0787\u07a6\u078b\u07aa] LT",nextDay:"[\u0789\u07a7\u078b\u07a6\u0789\u07a7] LT",nextWeek:"dddd LT",lastDay:"[\u0787\u07a8\u0787\u07b0\u0794\u07ac] LT",lastWeek:"[\u078a\u07a7\u0787\u07a8\u078c\u07aa\u0788\u07a8] dddd LT",sameElse:"L"},relativeTime:{future:"\u078c\u07ac\u0783\u07ad\u078e\u07a6\u0787\u07a8 %s",past:"\u0786\u07aa\u0783\u07a8\u0782\u07b0 %s",s:"\u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa\u0786\u07ae\u0785\u07ac\u0787\u07b0",ss:"d% \u0790\u07a8\u0786\u07aa\u0782\u07b0\u078c\u07aa",m:"\u0789\u07a8\u0782\u07a8\u0793\u07ac\u0787\u07b0",mm:"\u0789\u07a8\u0782\u07a8\u0793\u07aa %d",h:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07ac\u0787\u07b0",hh:"\u078e\u07a6\u0791\u07a8\u0787\u07a8\u0783\u07aa %d",d:"\u078b\u07aa\u0788\u07a6\u0780\u07ac\u0787\u07b0",dd:"\u078b\u07aa\u0788\u07a6\u0790\u07b0 %d",M:"\u0789\u07a6\u0780\u07ac\u0787\u07b0",MM:"\u0789\u07a6\u0790\u07b0 %d",y:"\u0787\u07a6\u0780\u07a6\u0783\u07ac\u0787\u07b0",yy:"\u0787\u07a6\u0780\u07a6\u0783\u07aa %d"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:7,doy:12}})}(n("PJh5"))},rtsW:function(t,e,n){!function(t){"use strict";var e={1:"\u0ae7",2:"\u0ae8",3:"\u0ae9",4:"\u0aea",5:"\u0aeb",6:"\u0aec",7:"\u0aed",8:"\u0aee",9:"\u0aef",0:"\u0ae6"},n={"\u0ae7":"1","\u0ae8":"2","\u0ae9":"3","\u0aea":"4","\u0aeb":"5","\u0aec":"6","\u0aed":"7","\u0aee":"8","\u0aef":"9","\u0ae6":"0"};t.defineLocale("gu",{months:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1\u0a86\u0ab0\u0ac0_\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1\u0a86\u0ab0\u0ac0_\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf\u0ab2_\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe\u0a88_\u0a91\u0a97\u0ab8\u0acd\u0a9f_\u0ab8\u0aaa\u0acd\u0a9f\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0a91\u0a95\u0acd\u0a9f\u0acd\u0aac\u0ab0_\u0aa8\u0ab5\u0ac7\u0aae\u0acd\u0aac\u0ab0_\u0aa1\u0abf\u0ab8\u0ac7\u0aae\u0acd\u0aac\u0ab0".split("_"),monthsShort:"\u0a9c\u0abe\u0aa8\u0acd\u0aaf\u0ac1._\u0aab\u0ac7\u0aac\u0acd\u0ab0\u0ac1._\u0aae\u0abe\u0ab0\u0acd\u0a9a_\u0a8f\u0aaa\u0acd\u0ab0\u0abf._\u0aae\u0ac7_\u0a9c\u0ac2\u0aa8_\u0a9c\u0ac1\u0ab2\u0abe._\u0a91\u0a97._\u0ab8\u0aaa\u0acd\u0a9f\u0ac7._\u0a91\u0a95\u0acd\u0a9f\u0acd._\u0aa8\u0ab5\u0ac7._\u0aa1\u0abf\u0ab8\u0ac7.".split("_"),monthsParseExact:!0,weekdays:"\u0ab0\u0ab5\u0abf\u0ab5\u0abe\u0ab0_\u0ab8\u0acb\u0aae\u0ab5\u0abe\u0ab0_\u0aae\u0a82\u0a97\u0ab3\u0ab5\u0abe\u0ab0_\u0aac\u0ac1\u0aa7\u0acd\u0ab5\u0abe\u0ab0_\u0a97\u0ac1\u0ab0\u0ac1\u0ab5\u0abe\u0ab0_\u0ab6\u0ac1\u0a95\u0acd\u0ab0\u0ab5\u0abe\u0ab0_\u0ab6\u0aa8\u0abf\u0ab5\u0abe\u0ab0".split("_"),weekdaysShort:"\u0ab0\u0ab5\u0abf_\u0ab8\u0acb\u0aae_\u0aae\u0a82\u0a97\u0ab3_\u0aac\u0ac1\u0aa7\u0acd_\u0a97\u0ac1\u0ab0\u0ac1_\u0ab6\u0ac1\u0a95\u0acd\u0ab0_\u0ab6\u0aa8\u0abf".split("_"),weekdaysMin:"\u0ab0_\u0ab8\u0acb_\u0aae\u0a82_\u0aac\u0ac1_\u0a97\u0ac1_\u0ab6\u0ac1_\u0ab6".split("_"),longDateFormat:{LT:"A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LTS:"A h:mm:ss \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7",LLLL:"dddd, D MMMM YYYY, A h:mm \u0ab5\u0abe\u0a97\u0acd\u0aaf\u0ac7"},calendar:{sameDay:"[\u0a86\u0a9c] LT",nextDay:"[\u0a95\u0abe\u0ab2\u0ac7] LT",nextWeek:"dddd, LT",lastDay:"[\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7] LT",lastWeek:"[\u0aaa\u0abe\u0a9b\u0ab2\u0abe] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0aae\u0abe",past:"%s \u0aaa\u0ac7\u0ab9\u0ab2\u0abe",s:"\u0a85\u0aae\u0ac1\u0a95 \u0aaa\u0ab3\u0acb",ss:"%d \u0ab8\u0ac7\u0a95\u0a82\u0aa1",m:"\u0a8f\u0a95 \u0aae\u0abf\u0aa8\u0abf\u0a9f",mm:"%d \u0aae\u0abf\u0aa8\u0abf\u0a9f",h:"\u0a8f\u0a95 \u0a95\u0ab2\u0abe\u0a95",hh:"%d \u0a95\u0ab2\u0abe\u0a95",d:"\u0a8f\u0a95 \u0aa6\u0abf\u0ab5\u0ab8",dd:"%d \u0aa6\u0abf\u0ab5\u0ab8",M:"\u0a8f\u0a95 \u0aae\u0ab9\u0abf\u0aa8\u0acb",MM:"%d \u0aae\u0ab9\u0abf\u0aa8\u0acb",y:"\u0a8f\u0a95 \u0ab5\u0ab0\u0acd\u0ab7",yy:"%d \u0ab5\u0ab0\u0acd\u0ab7"},preparse:function(t){return t.replace(/[\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u0ae6]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0ab0\u0abe\u0aa4|\u0aac\u0aaa\u0acb\u0ab0|\u0ab8\u0ab5\u0abe\u0ab0|\u0ab8\u0abe\u0a82\u0a9c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0ab0\u0abe\u0aa4"===e?t<4?t:t+12:"\u0ab8\u0ab5\u0abe\u0ab0"===e?t:"\u0aac\u0aaa\u0acb\u0ab0"===e?t>=10?t:t+12:"\u0ab8\u0abe\u0a82\u0a9c"===e?t+12:void 0},meridiem:function(t,e,n){return t<4?"\u0ab0\u0abe\u0aa4":t<10?"\u0ab8\u0ab5\u0abe\u0ab0":t<17?"\u0aac\u0aaa\u0acb\u0ab0":t<20?"\u0ab8\u0abe\u0a82\u0a9c":"\u0ab0\u0abe\u0aa4"},week:{dow:0,doy:6}})}(n("PJh5"))},rxKx:function(t,e,n){var r;!function(i,o,s,l){"use strict";var a,u=["","webkit","Moz","MS","ms","o"],c=o.createElement("div"),d="function",h=Math.round,p=Math.abs,f=Date.now;function _(t,e,n){return setTimeout(M(t,n),e)}function m(t,e,n){return!!Array.isArray(t)&&(g(t,n[e],n),!0)}function g(t,e,n){var r;if(t)if(t.forEach)t.forEach(e,n);else if(t.length!==l)for(r=0;r\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",o=i.console&&(i.console.warn||i.console.log);return o&&o.call(i.console,r,n),t.apply(this,arguments)}}a="function"!=typeof Object.assign?function(t){if(t===l||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),n=1;n-1}function O(t){return t.trim().split(/\s+/g)}function D(t,e,n){if(t.indexOf&&!n)return t.indexOf(e);for(var r=0;rn[e]}):r.sort()),r}function E(t,e){for(var n,r,i=e[0].toUpperCase()+e.slice(1),o=0;o1&&!n.firstMultiple?n.firstMultiple=et(e):1===i&&(n.firstMultiple=!1);var o=n.firstInput,s=n.firstMultiple,a=s?s.center:o.center,u=e.center=nt(r);e.timeStamp=f(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=st(a,u),e.distance=ot(a,u),function(t,e){var n=e.center,r=t.offsetDelta||{},i=t.prevDelta||{},o=t.prevInput||{};e.eventType!==N&&o.eventType!==V||(i=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},r=t.offsetDelta={x:n.x,y:n.y}),e.deltaX=i.x+(n.x-r.x),e.deltaY=i.y+(n.y-r.y)}(n,e),e.offsetDirection=it(e.deltaX,e.deltaY);var c,d,h=rt(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=h.x,e.overallVelocityY=h.y,e.overallVelocity=p(h.x)>p(h.y)?h.x:h.y,e.scale=s?(c=s.pointers,ot((d=r)[0],d[1],Z)/ot(c[0],c[1],Z)):1,e.rotation=s?function(t,e){return st(r[1],r[0],Z)+st(t[1],t[0],Z)}(s.pointers):0,e.maxPointers=n.prevInput?e.pointers.length>n.prevInput.maxPointers?e.pointers.length:n.prevInput.maxPointers:e.pointers.length,function(t,e){var n,r,i,o,s=t.lastInterval||e,a=e.timeStamp-s.timeStamp;if(e.eventType!=B&&(a>F||s.velocity===l)){var u=e.deltaX-s.deltaX,c=e.deltaY-s.deltaY,d=rt(a,u,c);r=d.x,i=d.y,n=p(d.x)>p(d.y)?d.x:d.y,o=it(u,c),t.lastInterval=e}else n=s.velocity,r=s.velocityX,i=s.velocityY,o=s.direction;e.velocity=n,e.velocityX=r,e.velocityY=i,e.direction=o}(n,e);var _=t.element;S(e.srcEvent.target,_)&&(_=e.srcEvent.target),e.target=_}(t,n),t.emit("hammer.input",n),t.recognize(n),t.session.prevInput=n}function et(t){for(var e=[],n=0;n=p(e)?t<0?W:U:e<0?G:J}function ot(t,e,n){n||(n=X);var r=e[n[0]]-t[n[0]],i=e[n[1]]-t[n[1]];return Math.sqrt(r*r+i*i)}function st(t,e,n){return n||(n=X),180*Math.atan2(e[n[1]]-t[n[1]],e[n[0]]-t[n[0]])/Math.PI}$.prototype={handler:function(){},init:function(){this.evEl&&L(this.element,this.evEl,this.domHandler),this.evTarget&&L(this.target,this.evTarget,this.domHandler),this.evWin&&L(j(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&C(this.element,this.evEl,this.domHandler),this.evTarget&&C(this.target,this.evTarget,this.domHandler),this.evWin&&C(j(this.element),this.evWin,this.domHandler)}};var lt={mousedown:N,mousemove:2,mouseup:V},at="mousedown",ut="mousemove mouseup";function ct(){this.evEl=at,this.evWin=ut,this.pressed=!1,$.apply(this,arguments)}w(ct,$,{handler:function(t){var e=lt[t.type];e&N&&0===t.button&&(this.pressed=!0),2&e&&1!==t.which&&(e=V),this.pressed&&(e&V&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var dt={pointerdown:N,pointermove:2,pointerup:V,pointercancel:B,pointerout:B},ht={2:"touch",3:"pen",4:"mouse",5:"kinect"},pt="pointerdown",ft="pointermove pointerup pointercancel";function _t(){this.evEl=pt,this.evWin=ft,$.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}i.MSPointerEvent&&!i.PointerEvent&&(pt="MSPointerDown",ft="MSPointerMove MSPointerUp MSPointerCancel"),w(_t,$,{handler:function(t){var e=this.store,n=!1,r=t.type.toLowerCase().replace("ms",""),i=dt[r],o=ht[t.pointerType]||t.pointerType,s="touch"==o,l=D(e,t.pointerId,"pointerId");i&N&&(0===t.button||s)?l<0&&(e.push(t),l=e.length-1):i&(V|B)&&(n=!0),l<0||(e[l]=t,this.callback(this.manager,i,{pointers:e,changedPointers:[t],pointerType:o,srcEvent:t}),n&&e.splice(l,1))}});var mt={touchstart:N,touchmove:2,touchend:V,touchcancel:B},gt="touchstart",yt="touchstart touchmove touchend touchcancel";function vt(){this.evTarget=gt,this.evWin=yt,this.started=!1,$.apply(this,arguments)}w(vt,$,{handler:function(t){var e=mt[t.type];if(e===N&&(this.started=!0),this.started){var n=(function(t,e){var n=Y(t.touches),r=Y(t.changedTouches);return e&(V|B)&&(n=P(n.concat(r),"identifier",!0)),[n,r]}).call(this,t,e);e&(V|B)&&n[0].length-n[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:n[0],changedPointers:n[1],pointerType:"touch",srcEvent:t})}}});var bt={touchstart:N,touchmove:2,touchend:V,touchcancel:B},wt="touchstart touchmove touchend touchcancel";function Mt(){this.evTarget=wt,this.targetIds={},$.apply(this,arguments)}w(Mt,$,{handler:function(t){var e=bt[t.type],n=(function(t,e){var n=Y(t.touches),r=this.targetIds;if(e&(2|N)&&1===n.length)return r[n[0].identifier]=!0,[n,n];var i,o,s=Y(t.changedTouches),l=[],a=this.target;if(o=n.filter(function(t){return S(t.target,a)}),e===N)for(i=0;i-1&&r.splice(t,1)},kt)}}w(xt,$,{handler:function(t,e,n){var r="mouse"==n.pointerType;if(!(r&&n.sourceCapabilities&&n.sourceCapabilities.firesTouchEvents)){if("touch"==n.pointerType)(function(t,e){t&N?(this.primaryTouch=e.changedPointers[0].identifier,Lt.call(this,e)):t&(V|B)&&Lt.call(this,e)}).call(this,e,n);else if(r&&(function(t){for(var e=t.srcEvent.clientX,n=t.srcEvent.clientY,r=0;r-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){var e=this,n=this.state;function r(n){e.manager.emit(n,t)}n=Et&&r(e.options.event+Rt(n))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;te.threshold&&i&e.direction},attrTest:function(t){return Nt.prototype.attrTest.call(this,t)&&(this.state&Yt||!(this.state&Yt)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=Ht(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),w(Bt,Nt,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&Yt)},emit:function(t){1!==t.scale&&(t.additionalEvent=this.options.event+(t.scale<1?"in":"out")),this._super.emit.call(this,t)}}),w(zt,It,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return["auto"]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distancee.time;if(this._input=t,!r||!n||t.eventType&(V|B)&&!i)this.reset();else if(t.eventType&N)this.reset(),this._timer=_(function(){this.state=At,this.tryEmit()},e.time,this);else if(t.eventType&V)return At;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===At&&(t&&t.eventType&V?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=f(),this.manager.emit(this.options.event,this._input)))}}),w(Wt,Nt,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return["none"]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&Yt)}}),w(Ut,Nt,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:q|Q,pointers:1},getTouchAction:function(){return Vt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,n=this.options.direction;return n&(q|Q)?e=t.overallVelocity:n&q?e=t.overallVelocityX:n&Q&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&n&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&p(e)>this.options.velocity&&t.eventType&V},emit:function(t){var e=Ht(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),w(Gt,It,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return["manipulation"]},process:function(t){var e=this.options,n=t.pointers.length===e.pointers,r=t.distance1&&t<5&&1!=~~(t/10)}function i(t,e,n,i){var o=t+" ";switch(n){case"s":return e||i?"p\xe1r sekund":"p\xe1r sekundami";case"ss":return e||i?o+(r(t)?"sekundy":"sekund"):o+"sekundami";case"m":return e?"minuta":i?"minutu":"minutou";case"mm":return e||i?o+(r(t)?"minuty":"minut"):o+"minutami";case"h":return e?"hodina":i?"hodinu":"hodinou";case"hh":return e||i?o+(r(t)?"hodiny":"hodin"):o+"hodinami";case"d":return e||i?"den":"dnem";case"dd":return e||i?o+(r(t)?"dny":"dn\xed"):o+"dny";case"M":return e||i?"m\u011bs\xedc":"m\u011bs\xedcem";case"MM":return e||i?o+(r(t)?"m\u011bs\xedce":"m\u011bs\xedc\u016f"):o+"m\u011bs\xedci";case"y":return e||i?"rok":"rokem";case"yy":return e||i?o+(r(t)?"roky":"let"):o+"lety"}}t.defineLocale("cs",{months:e,monthsShort:n,monthsParse:function(t,e){var n,r=[];for(n=0;n<12;n++)r[n]=new RegExp("^"+t[n]+"$|^"+e[n]+"$","i");return r}(e,n),shortMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(n),longMonthsParse:function(t){var e,n=[];for(e=0;e<12;e++)n[e]=new RegExp("^"+t[e]+"$","i");return n}(e),weekdays:"ned\u011ble_pond\u011bl\xed_\xfater\xfd_st\u0159eda_\u010dtvrtek_p\xe1tek_sobota".split("_"),weekdaysShort:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),weekdaysMin:"ne_po_\xfat_st_\u010dt_p\xe1_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[z\xedtra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v ned\u011bli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve st\u0159edu v] LT";case 4:return"[ve \u010dtvrtek v] LT";case 5:return"[v p\xe1tek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[v\u010dera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou ned\u011bli v] LT";case 1:case 2:return"[minul\xe9] dddd [v] LT";case 3:return"[minulou st\u0159edu v] LT";case 4:case 5:return"[minul\xfd] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"p\u0159ed %s",s:i,ss:i,m:i,mm:i,h:i,hh:i,d:i,dd:i,M:i,MM:i,y:i,yy:i},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},svD2:function(t,e,n){!function(t){"use strict";var e={words:{ss:["sekund","sekunda","sekundi"],m:["jedan minut","jednog minuta"],mm:["minut","minuta","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mjesec","mjeseca","mjeseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(t,e){return 1===t?e[0]:t>=2&&t<=4?e[1]:e[2]},translate:function(t,n,r){var i=e.words[r];return 1===r.length?n?i[0]:i[1]:t+" "+e.correctGrammaticalCase(t,i)}};t.defineLocale("me",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_\u010detvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._\u010det._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_\u010de_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sjutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[ju\u010de u] LT",lastWeek:function(){return["[pro\u0161le] [nedjelje] [u] LT","[pro\u0161log] [ponedjeljka] [u] LT","[pro\u0161log] [utorka] [u] LT","[pro\u0161le] [srijede] [u] LT","[pro\u0161log] [\u010detvrtka] [u] LT","[pro\u0161log] [petka] [u] LT","[pro\u0161le] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"nekoliko sekundi",ss:e.translate,m:e.translate,mm:e.translate,h:e.translate,hh:e.translate,d:"dan",dd:e.translate,M:"mjesec",MM:e.translate,y:"godinu",yy:e.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})}(n("PJh5"))},t7NR:function(t,e,n){"use strict";n.d(e,"a",function(){return r});var r={closed:!0,next:function(t){},error:function(t){throw t},complete:function(){}}},tLDX:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("AMGY").a.Symbol,i="function"==typeof r&&"function"==typeof r.for?r.for("rxSubscriber"):"@@rxSubscriber"},tZ2B:function(t,e,n){"use strict";n.d(e,"a",function(){return i});var r=n("TToO"),i=function(t){function e(){t.apply(this,arguments)}return Object(r.__extends)(e,t),e.prototype.notifyNext=function(t,e,n,r,i){this.destination.next(e)},e.prototype.notifyError=function(t,e){this.destination.error(t)},e.prototype.notifyComplete=function(t){this.destination.complete()},e}(n("OVmG").a)},tkWw:function(t,e,n){!function(t){"use strict";t.defineLocale("ar-dz",{months:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),monthsShort:"\u062c\u0627\u0646\u0641\u064a_\u0641\u064a\u0641\u0631\u064a_\u0645\u0627\u0631\u0633_\u0623\u0641\u0631\u064a\u0644_\u0645\u0627\u064a_\u062c\u0648\u0627\u0646_\u062c\u0648\u064a\u0644\u064a\u0629_\u0623\u0648\u062a_\u0633\u0628\u062a\u0645\u0628\u0631_\u0623\u0643\u062a\u0648\u0628\u0631_\u0646\u0648\u0641\u0645\u0628\u0631_\u062f\u064a\u0633\u0645\u0628\u0631".split("_"),weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0627\u062d\u062f_\u0627\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u0623\u062d_\u0625\u062b_\u062b\u0644\u0627_\u0623\u0631_\u062e\u0645_\u062c\u0645_\u0633\u0628".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0644\u0649 \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0641\u064a %s",past:"\u0645\u0646\u0630 %s",s:"\u062b\u0648\u0627\u0646",ss:"%d \u062b\u0627\u0646\u064a\u0629",m:"\u062f\u0642\u064a\u0642\u0629",mm:"%d \u062f\u0642\u0627\u0626\u0642",h:"\u0633\u0627\u0639\u0629",hh:"%d \u0633\u0627\u0639\u0627\u062a",d:"\u064a\u0648\u0645",dd:"%d \u0623\u064a\u0627\u0645",M:"\u0634\u0647\u0631",MM:"%d \u0623\u0634\u0647\u0631",y:"\u0633\u0646\u0629",yy:"%d \u0633\u0646\u0648\u0627\u062a"},week:{dow:0,doy:4}})}(n("PJh5"))},tzHd:function(t,e,n){!function(t){"use strict";t.defineLocale("fr",{months:"janvier_f\xe9vrier_mars_avril_mai_juin_juillet_ao\xfbt_septembre_octobre_novembre_d\xe9cembre".split("_"),monthsShort:"janv._f\xe9vr._mars_avr._mai_juin_juil._ao\xfbt_sept._oct._nov._d\xe9c.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd\u2019hui \xe0] LT",nextDay:"[Demain \xe0] LT",nextWeek:"dddd [\xe0] LT",lastDay:"[Hier \xe0] LT",lastWeek:"dddd [dernier \xe0] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(t,e){switch(e){case"D":return t+(1===t?"er":"");default:case"M":case"Q":case"DDD":case"d":return t+(1===t?"er":"e");case"w":case"W":return t+(1===t?"re":"e")}},week:{dow:1,doy:4}})}(n("PJh5"))},uSe8:function(t,e,n){!function(t){"use strict";var e=["\u062c\u0646\u0648\u0631\u06cc","\u0641\u0631\u0648\u0631\u06cc","\u0645\u0627\u0631\u0686","\u0627\u067e\u0631\u06cc\u0644","\u0645\u0626\u06cc","\u062c\u0648\u0646","\u062c\u0648\u0644\u0627\u0626\u06cc","\u0627\u06af\u0633\u062a","\u0633\u062a\u0645\u0628\u0631","\u0627\u06a9\u062a\u0648\u0628\u0631","\u0646\u0648\u0645\u0628\u0631","\u062f\u0633\u0645\u0628\u0631"],n=["\u0627\u062a\u0648\u0627\u0631","\u067e\u06cc\u0631","\u0645\u0646\u06af\u0644","\u0628\u062f\u06be","\u062c\u0645\u0639\u0631\u0627\u062a","\u062c\u0645\u0639\u06c1","\u06c1\u0641\u062a\u06c1"];t.defineLocale("ur",{months:e,monthsShort:e,weekdays:n,weekdaysShort:n,weekdaysMin:n,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd\u060c D MMMM YYYY HH:mm"},meridiemParse:/\u0635\u0628\u062d|\u0634\u0627\u0645/,isPM:function(t){return"\u0634\u0627\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635\u0628\u062d":"\u0634\u0627\u0645"},calendar:{sameDay:"[\u0622\u062c \u0628\u0648\u0642\u062a] LT",nextDay:"[\u06a9\u0644 \u0628\u0648\u0642\u062a] LT",nextWeek:"dddd [\u0628\u0648\u0642\u062a] LT",lastDay:"[\u06af\u0630\u0634\u062a\u06c1 \u0631\u0648\u0632 \u0628\u0648\u0642\u062a] LT",lastWeek:"[\u06af\u0630\u0634\u062a\u06c1] dddd [\u0628\u0648\u0642\u062a] LT",sameElse:"L"},relativeTime:{future:"%s \u0628\u0639\u062f",past:"%s \u0642\u0628\u0644",s:"\u0686\u0646\u062f \u0633\u06cc\u06a9\u0646\u0688",ss:"%d \u0633\u06cc\u06a9\u0646\u0688",m:"\u0627\u06cc\u06a9 \u0645\u0646\u0679",mm:"%d \u0645\u0646\u0679",h:"\u0627\u06cc\u06a9 \u06af\u06be\u0646\u0679\u06c1",hh:"%d \u06af\u06be\u0646\u0679\u06d2",d:"\u0627\u06cc\u06a9 \u062f\u0646",dd:"%d \u062f\u0646",M:"\u0627\u06cc\u06a9 \u0645\u0627\u06c1",MM:"%d \u0645\u0627\u06c1",y:"\u0627\u06cc\u06a9 \u0633\u0627\u0644",yy:"%d \u0633\u0627\u0644"},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/,/g,"\u060c")},week:{dow:1,doy:4}})}(n("PJh5"))},ulq9:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r,i;return"m"===n?e?"\u043c\u0438\u043d\u0443\u0442\u0430":"\u043c\u0438\u043d\u0443\u0442\u0443":t+" "+(r=+t,i={ss:e?"\u0441\u0435\u043a\u0443\u043d\u0434\u0430_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434":"\u0441\u0435\u043a\u0443\u043d\u0434\u0443_\u0441\u0435\u043a\u0443\u043d\u0434\u044b_\u0441\u0435\u043a\u0443\u043d\u0434",mm:e?"\u043c\u0438\u043d\u0443\u0442\u0430_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442":"\u043c\u0438\u043d\u0443\u0442\u0443_\u043c\u0438\u043d\u0443\u0442\u044b_\u043c\u0438\u043d\u0443\u0442",hh:"\u0447\u0430\u0441_\u0447\u0430\u0441\u0430_\u0447\u0430\u0441\u043e\u0432",dd:"\u0434\u0435\u043d\u044c_\u0434\u043d\u044f_\u0434\u043d\u0435\u0439",MM:"\u043c\u0435\u0441\u044f\u0446_\u043c\u0435\u0441\u044f\u0446\u0430_\u043c\u0435\u0441\u044f\u0446\u0435\u0432",yy:"\u0433\u043e\u0434_\u0433\u043e\u0434\u0430_\u043b\u0435\u0442"}[n].split("_"),r%10==1&&r%100!=11?i[0]:r%10>=2&&r%10<=4&&(r%100<10||r%100>=20)?i[1]:i[2])}var n=[/^\u044f\u043d\u0432/i,/^\u0444\u0435\u0432/i,/^\u043c\u0430\u0440/i,/^\u0430\u043f\u0440/i,/^\u043c\u0430[\u0439\u044f]/i,/^\u0438\u044e\u043d/i,/^\u0438\u044e\u043b/i,/^\u0430\u0432\u0433/i,/^\u0441\u0435\u043d/i,/^\u043e\u043a\u0442/i,/^\u043d\u043e\u044f/i,/^\u0434\u0435\u043a/i];t.defineLocale("ru",{months:{format:"\u044f\u043d\u0432\u0430\u0440\u044f_\u0444\u0435\u0432\u0440\u0430\u043b\u044f_\u043c\u0430\u0440\u0442\u0430_\u0430\u043f\u0440\u0435\u043b\u044f_\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433\u0443\u0441\u0442\u0430_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f_\u043e\u043a\u0442\u044f\u0431\u0440\u044f_\u043d\u043e\u044f\u0431\u0440\u044f_\u0434\u0435\u043a\u0430\u0431\u0440\u044f".split("_"),standalone:"\u044f\u043d\u0432\u0430\u0440\u044c_\u0444\u0435\u0432\u0440\u0430\u043b\u044c_\u043c\u0430\u0440\u0442_\u0430\u043f\u0440\u0435\u043b\u044c_\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433\u0443\u0441\u0442_\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c_\u043e\u043a\u0442\u044f\u0431\u0440\u044c_\u043d\u043e\u044f\u0431\u0440\u044c_\u0434\u0435\u043a\u0430\u0431\u0440\u044c".split("_")},monthsShort:{format:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440._\u0430\u043f\u0440._\u043c\u0430\u044f_\u0438\u044e\u043d\u044f_\u0438\u044e\u043b\u044f_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_"),standalone:"\u044f\u043d\u0432._\u0444\u0435\u0432\u0440._\u043c\u0430\u0440\u0442_\u0430\u043f\u0440._\u043c\u0430\u0439_\u0438\u044e\u043d\u044c_\u0438\u044e\u043b\u044c_\u0430\u0432\u0433._\u0441\u0435\u043d\u0442._\u043e\u043a\u0442._\u043d\u043e\u044f\u0431._\u0434\u0435\u043a.".split("_")},weekdays:{standalone:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0430_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0430_\u0441\u0443\u0431\u0431\u043e\u0442\u0430".split("_"),format:"\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435_\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a_\u0432\u0442\u043e\u0440\u043d\u0438\u043a_\u0441\u0440\u0435\u0434\u0443_\u0447\u0435\u0442\u0432\u0435\u0440\u0433_\u043f\u044f\u0442\u043d\u0438\u0446\u0443_\u0441\u0443\u0431\u0431\u043e\u0442\u0443".split("_"),isFormat:/\[ ?[\u0412\u0432] ?(?:\u043f\u0440\u043e\u0448\u043b\u0443\u044e|\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e|\u044d\u0442\u0443)? ?\] ?dddd/},weekdaysShort:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),weekdaysMin:"\u0432\u0441_\u043f\u043d_\u0432\u0442_\u0441\u0440_\u0447\u0442_\u043f\u0442_\u0441\u0431".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsShortRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044c\u044f]|\u044f\u043d\u0432\.?|\u0444\u0435\u0432\u0440\u0430\u043b[\u044c\u044f]|\u0444\u0435\u0432\u0440?\.?|\u043c\u0430\u0440\u0442\u0430?|\u043c\u0430\u0440\.?|\u0430\u043f\u0440\u0435\u043b[\u044c\u044f]|\u0430\u043f\u0440\.?|\u043c\u0430[\u0439\u044f]|\u0438\u044e\u043d[\u044c\u044f]|\u0438\u044e\u043d\.?|\u0438\u044e\u043b[\u044c\u044f]|\u0438\u044e\u043b\.?|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0430\u0432\u0433\.?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044c\u044f]|\u0441\u0435\u043d\u0442?\.?|\u043e\u043a\u0442\u044f\u0431\u0440[\u044c\u044f]|\u043e\u043a\u0442\.?|\u043d\u043e\u044f\u0431\u0440[\u044c\u044f]|\u043d\u043e\u044f\u0431?\.?|\u0434\u0435\u043a\u0430\u0431\u0440[\u044c\u044f]|\u0434\u0435\u043a\.?)/i,monthsStrictRegex:/^(\u044f\u043d\u0432\u0430\u0440[\u044f\u044c]|\u0444\u0435\u0432\u0440\u0430\u043b[\u044f\u044c]|\u043c\u0430\u0440\u0442\u0430?|\u0430\u043f\u0440\u0435\u043b[\u044f\u044c]|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044f\u044c]|\u0438\u044e\u043b[\u044f\u044c]|\u0430\u0432\u0433\u0443\u0441\u0442\u0430?|\u0441\u0435\u043d\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043e\u043a\u0442\u044f\u0431\u0440[\u044f\u044c]|\u043d\u043e\u044f\u0431\u0440[\u044f\u044c]|\u0434\u0435\u043a\u0430\u0431\u0440[\u044f\u044c])/i,monthsShortStrictRegex:/^(\u044f\u043d\u0432\.|\u0444\u0435\u0432\u0440?\.|\u043c\u0430\u0440[\u0442.]|\u0430\u043f\u0440\.|\u043c\u0430[\u044f\u0439]|\u0438\u044e\u043d[\u044c\u044f.]|\u0438\u044e\u043b[\u044c\u044f.]|\u0430\u0432\u0433\.|\u0441\u0435\u043d\u0442?\.|\u043e\u043a\u0442\.|\u043d\u043e\u044f\u0431?\.|\u0434\u0435\u043a\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY \u0433.",LLL:"D MMMM YYYY \u0433., H:mm",LLLL:"dddd, D MMMM YYYY \u0433., H:mm"},calendar:{sameDay:"[\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0432] LT",nextDay:"[\u0417\u0430\u0432\u0442\u0440\u0430 \u0432] LT",lastDay:"[\u0412\u0447\u0435\u0440\u0430 \u0432] LT",nextWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e] dddd [\u0432] LT"}},lastWeek:function(t){if(t.week()===this.week())return 2===this.day()?"[\u0412\u043e] dddd [\u0432] LT":"[\u0412] dddd [\u0432] LT";switch(this.day()){case 0:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0435] dddd [\u0432] LT";case 1:case 2:case 4:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0439] dddd [\u0432] LT";case 3:case 5:case 6:return"[\u0412 \u043f\u0440\u043e\u0448\u043b\u0443\u044e] dddd [\u0432] LT"}},sameElse:"L"},relativeTime:{future:"\u0447\u0435\u0440\u0435\u0437 %s",past:"%s \u043d\u0430\u0437\u0430\u0434",s:"\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434",ss:e,m:e,mm:e,h:"\u0447\u0430\u0441",hh:e,d:"\u0434\u0435\u043d\u044c",dd:e,M:"\u043c\u0435\u0441\u044f\u0446",MM:e,y:"\u0433\u043e\u0434",yy:e},meridiemParse:/\u043d\u043e\u0447\u0438|\u0443\u0442\u0440\u0430|\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430/i,isPM:function(t){return/^(\u0434\u043d\u044f|\u0432\u0435\u0447\u0435\u0440\u0430)$/.test(t)},meridiem:function(t,e,n){return t<4?"\u043d\u043e\u0447\u0438":t<12?"\u0443\u0442\u0440\u0430":t<17?"\u0434\u043d\u044f":"\u0432\u0435\u0447\u0435\u0440\u0430"},dayOfMonthOrdinalParse:/\d{1,2}-(\u0439|\u0433\u043e|\u044f)/,ordinal:function(t,e){switch(e){case"M":case"d":case"DDD":return t+"-\u0439";case"D":return t+"-\u0433\u043e";case"w":case"W":return t+"-\u044f";default:return t}},week:{dow:1,doy:4}})}(n("PJh5"))},upln:function(t,e,n){!function(t){"use strict";function e(t){return t%100==11||t%10!=1}function n(t,n,r,i){var o=t+" ";switch(r){case"s":return n||i?"nokkrar sek\xfandur":"nokkrum sek\xfandum";case"ss":return e(t)?o+(n||i?"sek\xfandur":"sek\xfandum"):o+"sek\xfanda";case"m":return n?"m\xedn\xfata":"m\xedn\xfatu";case"mm":return e(t)?o+(n||i?"m\xedn\xfatur":"m\xedn\xfatum"):n?o+"m\xedn\xfata":o+"m\xedn\xfatu";case"hh":return e(t)?o+(n||i?"klukkustundir":"klukkustundum"):o+"klukkustund";case"d":return n?"dagur":i?"dag":"degi";case"dd":return e(t)?n?o+"dagar":o+(i?"daga":"d\xf6gum"):n?o+"dagur":o+(i?"dag":"degi");case"M":return n?"m\xe1nu\xf0ur":i?"m\xe1nu\xf0":"m\xe1nu\xf0i";case"MM":return e(t)?n?o+"m\xe1nu\xf0ir":o+(i?"m\xe1nu\xf0i":"m\xe1nu\xf0um"):n?o+"m\xe1nu\xf0ur":o+(i?"m\xe1nu\xf0":"m\xe1nu\xf0i");case"y":return n||i?"\xe1r":"\xe1ri";case"yy":return e(t)?o+(n||i?"\xe1r":"\xe1rum"):o+(n||i?"\xe1r":"\xe1ri")}}t.defineLocale("is",{months:"jan\xfaar_febr\xfaar_mars_apr\xedl_ma\xed_j\xfan\xed_j\xfal\xed_\xe1g\xfast_september_okt\xf3ber_n\xf3vember_desember".split("_"),monthsShort:"jan_feb_mar_apr_ma\xed_j\xfan_j\xfal_\xe1g\xfa_sep_okt_n\xf3v_des".split("_"),weekdays:"sunnudagur_m\xe1nudagur_\xferi\xf0judagur_mi\xf0vikudagur_fimmtudagur_f\xf6studagur_laugardagur".split("_"),weekdaysShort:"sun_m\xe1n_\xferi_mi\xf0_fim_f\xf6s_lau".split("_"),weekdaysMin:"Su_M\xe1_\xder_Mi_Fi_F\xf6_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[\xed dag kl.] LT",nextDay:"[\xe1 morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[\xed g\xe6r kl.] LT",lastWeek:"[s\xed\xf0asta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s s\xed\xf0an",s:n,ss:n,m:n,mm:n,h:"klukkustund",hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))},uslO:function(t,e,n){var r={"./af":"3CJN","./af.js":"3CJN","./ar":"3MVc","./ar-dz":"tkWw","./ar-dz.js":"tkWw","./ar-kw":"j8cJ","./ar-kw.js":"j8cJ","./ar-ly":"wPpW","./ar-ly.js":"wPpW","./ar-ma":"dURR","./ar-ma.js":"dURR","./ar-sa":"7OnE","./ar-sa.js":"7OnE","./ar-tn":"BEem","./ar-tn.js":"BEem","./ar.js":"3MVc","./az":"eHwN","./az.js":"eHwN","./be":"3hfc","./be.js":"3hfc","./bg":"lOED","./bg.js":"lOED","./bm":"hng5","./bm.js":"hng5","./bn":"aM0x","./bn.js":"aM0x","./bo":"w2Hs","./bo.js":"w2Hs","./br":"OSsP","./br.js":"OSsP","./bs":"aqvp","./bs.js":"aqvp","./ca":"wIgY","./ca.js":"wIgY","./cs":"ssxj","./cs.js":"ssxj","./cv":"N3vo","./cv.js":"N3vo","./cy":"ZFGz","./cy.js":"ZFGz","./da":"YBA/","./da.js":"YBA/","./de":"DOkx","./de-at":"8v14","./de-at.js":"8v14","./de-ch":"Frex","./de-ch.js":"Frex","./de.js":"DOkx","./dv":"rIuo","./dv.js":"rIuo","./el":"CFqe","./el.js":"CFqe","./en-au":"Sjoy","./en-au.js":"Sjoy","./en-ca":"Tqun","./en-ca.js":"Tqun","./en-gb":"hPuz","./en-gb.js":"hPuz","./en-ie":"ALEw","./en-ie.js":"ALEw","./en-il":"QZk1","./en-il.js":"QZk1","./en-nz":"dyB6","./en-nz.js":"dyB6","./eo":"Nd3h","./eo.js":"Nd3h","./es":"LT9G","./es-do":"7MHZ","./es-do.js":"7MHZ","./es-us":"INcR","./es-us.js":"INcR","./es.js":"LT9G","./et":"XlWM","./et.js":"XlWM","./eu":"sqLM","./eu.js":"sqLM","./fa":"2pmY","./fa.js":"2pmY","./fi":"nS2h","./fi.js":"nS2h","./fo":"OVPi","./fo.js":"OVPi","./fr":"tzHd","./fr-ca":"bXQP","./fr-ca.js":"bXQP","./fr-ch":"VK9h","./fr-ch.js":"VK9h","./fr.js":"tzHd","./fy":"g7KF","./fy.js":"g7KF","./gd":"nLOz","./gd.js":"nLOz","./gl":"FuaP","./gl.js":"FuaP","./gom-latn":"+27R","./gom-latn.js":"+27R","./gu":"rtsW","./gu.js":"rtsW","./he":"Nzt2","./he.js":"Nzt2","./hi":"ETHv","./hi.js":"ETHv","./hr":"V4qH","./hr.js":"V4qH","./hu":"xne+","./hu.js":"xne+","./hy-am":"GrS7","./hy-am.js":"GrS7","./id":"yRTJ","./id.js":"yRTJ","./is":"upln","./is.js":"upln","./it":"FKXc","./it.js":"FKXc","./ja":"ORgI","./ja.js":"ORgI","./jv":"JwiF","./jv.js":"JwiF","./ka":"RnJI","./ka.js":"RnJI","./kk":"j+vx","./kk.js":"j+vx","./km":"5j66","./km.js":"5j66","./kn":"gEQe","./kn.js":"gEQe","./ko":"eBB/","./ko.js":"eBB/","./ky":"6cf8","./ky.js":"6cf8","./lb":"z3hR","./lb.js":"z3hR","./lo":"nE8X","./lo.js":"nE8X","./lt":"/6P1","./lt.js":"/6P1","./lv":"jxEH","./lv.js":"jxEH","./me":"svD2","./me.js":"svD2","./mi":"gEU3","./mi.js":"gEU3","./mk":"Ab7C","./mk.js":"Ab7C","./ml":"oo1B","./ml.js":"oo1B","./mr":"5vPg","./mr.js":"5vPg","./ms":"ooba","./ms-my":"G++c","./ms-my.js":"G++c","./ms.js":"ooba","./mt":"oCzW","./mt.js":"oCzW","./my":"F+2e","./my.js":"F+2e","./nb":"FlzV","./nb.js":"FlzV","./ne":"/mhn","./ne.js":"/mhn","./nl":"3K28","./nl-be":"Bp2f","./nl-be.js":"Bp2f","./nl.js":"3K28","./nn":"C7av","./nn.js":"C7av","./pa-in":"pfs9","./pa-in.js":"pfs9","./pl":"7LV+","./pl.js":"7LV+","./pt":"ZoSI","./pt-br":"AoDM","./pt-br.js":"AoDM","./pt.js":"ZoSI","./ro":"wT5f","./ro.js":"wT5f","./ru":"ulq9","./ru.js":"ulq9","./sd":"fW1y","./sd.js":"fW1y","./se":"5Omq","./se.js":"5Omq","./si":"Lgqo","./si.js":"Lgqo","./sk":"OUMt","./sk.js":"OUMt","./sl":"2s1U","./sl.js":"2s1U","./sq":"V0td","./sq.js":"V0td","./sr":"f4W3","./sr-cyrl":"c1x4","./sr-cyrl.js":"c1x4","./sr.js":"f4W3","./ss":"7Q8x","./ss.js":"7Q8x","./sv":"Fpqq","./sv.js":"Fpqq","./sw":"DSXN","./sw.js":"DSXN","./ta":"+7/x","./ta.js":"+7/x","./te":"Nlnz","./te.js":"Nlnz","./tet":"gUgh","./tet.js":"gUgh","./tg":"5SNd","./tg.js":"5SNd","./th":"XzD+","./th.js":"XzD+","./tl-ph":"3LKG","./tl-ph.js":"3LKG","./tlh":"m7yE","./tlh.js":"m7yE","./tr":"k+5o","./tr.js":"k+5o","./tzl":"iNtv","./tzl.js":"iNtv","./tzm":"FRPF","./tzm-latn":"krPU","./tzm-latn.js":"krPU","./tzm.js":"FRPF","./ug-cn":"To0v","./ug-cn.js":"To0v","./uk":"ntHu","./uk.js":"ntHu","./ur":"uSe8","./ur.js":"uSe8","./uz":"XU1s","./uz-latn":"/bsm","./uz-latn.js":"/bsm","./uz.js":"XU1s","./vi":"0X8Q","./vi.js":"0X8Q","./x-pseudo":"e/KL","./x-pseudo.js":"e/KL","./yo":"YXlc","./yo.js":"YXlc","./zh-cn":"Vz2w","./zh-cn.js":"Vz2w","./zh-hk":"ZUyn","./zh-hk.js":"ZUyn","./zh-tw":"BbgG","./zh-tw.js":"BbgG"};function i(t){return n(o(t))}function o(t){var e=r[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id="uslO"},w2Hs:function(t,e,n){!function(t){"use strict";var e={1:"\u0f21",2:"\u0f22",3:"\u0f23",4:"\u0f24",5:"\u0f25",6:"\u0f26",7:"\u0f27",8:"\u0f28",9:"\u0f29",0:"\u0f20"},n={"\u0f21":"1","\u0f22":"2","\u0f23":"3","\u0f24":"4","\u0f25":"5","\u0f26":"6","\u0f27":"7","\u0f28":"8","\u0f29":"9","\u0f20":"0"};t.defineLocale("bo",{months:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),monthsShort:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f44\u0f0b\u0f54\u0f7c_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f66\u0f74\u0f58\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f5e\u0f72\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f63\u0f94\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0fb2\u0f74\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f62\u0f92\u0fb1\u0f51\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f51\u0f42\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f45\u0f72\u0f42\u0f0b\u0f54_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f56\u0f45\u0f74\u0f0b\u0f42\u0f49\u0f72\u0f66\u0f0b\u0f54".split("_"),weekdays:"\u0f42\u0f5f\u0f60\u0f0b\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f42\u0f5f\u0f60\u0f0b\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f42\u0f5f\u0f60\u0f0b\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysShort:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),weekdaysMin:"\u0f49\u0f72\u0f0b\u0f58\u0f0b_\u0f5f\u0fb3\u0f0b\u0f56\u0f0b_\u0f58\u0f72\u0f42\u0f0b\u0f51\u0f58\u0f62\u0f0b_\u0f63\u0fb7\u0f42\u0f0b\u0f54\u0f0b_\u0f55\u0f74\u0f62\u0f0b\u0f56\u0f74_\u0f54\u0f0b\u0f66\u0f44\u0f66\u0f0b_\u0f66\u0fa4\u0f7a\u0f53\u0f0b\u0f54\u0f0b".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm",LLLL:"dddd, D MMMM YYYY, A h:mm"},calendar:{sameDay:"[\u0f51\u0f72\u0f0b\u0f62\u0f72\u0f44] LT",nextDay:"[\u0f66\u0f44\u0f0b\u0f49\u0f72\u0f53] LT",nextWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f62\u0f97\u0f7a\u0f66\u0f0b\u0f58], LT",lastDay:"[\u0f41\u0f0b\u0f66\u0f44] LT",lastWeek:"[\u0f56\u0f51\u0f74\u0f53\u0f0b\u0f55\u0fb2\u0f42\u0f0b\u0f58\u0f50\u0f60\u0f0b\u0f58] dddd, LT",sameElse:"L"},relativeTime:{future:"%s \u0f63\u0f0b",past:"%s \u0f66\u0f94\u0f53\u0f0b\u0f63",s:"\u0f63\u0f58\u0f0b\u0f66\u0f44",ss:"%d \u0f66\u0f90\u0f62\u0f0b\u0f46\u0f0d",m:"\u0f66\u0f90\u0f62\u0f0b\u0f58\u0f0b\u0f42\u0f45\u0f72\u0f42",mm:"%d \u0f66\u0f90\u0f62\u0f0b\u0f58",h:"\u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51\u0f0b\u0f42\u0f45\u0f72\u0f42",hh:"%d \u0f46\u0f74\u0f0b\u0f5a\u0f7c\u0f51",d:"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f45\u0f72\u0f42",dd:"%d \u0f49\u0f72\u0f53\u0f0b",M:"\u0f5f\u0fb3\u0f0b\u0f56\u0f0b\u0f42\u0f45\u0f72\u0f42",MM:"%d \u0f5f\u0fb3\u0f0b\u0f56",y:"\u0f63\u0f7c\u0f0b\u0f42\u0f45\u0f72\u0f42",yy:"%d \u0f63\u0f7c"},preparse:function(t){return t.replace(/[\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f27\u0f28\u0f29\u0f20]/g,function(t){return n[t]})},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]})},meridiemParse:/\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c|\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66|\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44|\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42|\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c/,meridiemHour:function(t,e){return 12===t&&(t=0),"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"===e&&t>=4||"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44"===e&&t<5||"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42"===e?t+12:t},meridiem:function(t,e,n){return t<4?"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c":t<10?"\u0f5e\u0f7c\u0f42\u0f66\u0f0b\u0f40\u0f66":t<17?"\u0f49\u0f72\u0f53\u0f0b\u0f42\u0f74\u0f44":t<20?"\u0f51\u0f42\u0f7c\u0f44\u0f0b\u0f51\u0f42":"\u0f58\u0f5a\u0f53\u0f0b\u0f58\u0f7c"},week:{dow:0,doy:6}})}(n("PJh5"))},wIgY:function(t,e,n){!function(t){"use strict";t.defineLocale("ca",{months:{standalone:"gener_febrer_mar\xe7_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de mar\xe7_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._mar\xe7_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[dem\xe0 a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aqu\xed %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|\xe8|a)/,ordinal:function(t,e){var n=1===t?"r":2===t?"n":3===t?"r":4===t?"t":"\xe8";return"w"!==e&&"W"!==e||(n="a"),t+n},week:{dow:1,doy:4}})}(n("PJh5"))},wPpW:function(t,e,n){!function(t){"use strict";var e={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},n=function(t){return 0===t?0:1===t?1:2===t?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5},r={s:["\u0623\u0642\u0644 \u0645\u0646 \u062b\u0627\u0646\u064a\u0629","\u062b\u0627\u0646\u064a\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062b\u0627\u0646\u064a\u062a\u0627\u0646","\u062b\u0627\u0646\u064a\u062a\u064a\u0646"],"%d \u062b\u0648\u0627\u0646","%d \u062b\u0627\u0646\u064a\u0629","%d \u062b\u0627\u0646\u064a\u0629"],m:["\u0623\u0642\u0644 \u0645\u0646 \u062f\u0642\u064a\u0642\u0629","\u062f\u0642\u064a\u0642\u0629 \u0648\u0627\u062d\u062f\u0629",["\u062f\u0642\u064a\u0642\u062a\u0627\u0646","\u062f\u0642\u064a\u0642\u062a\u064a\u0646"],"%d \u062f\u0642\u0627\u0626\u0642","%d \u062f\u0642\u064a\u0642\u0629","%d \u062f\u0642\u064a\u0642\u0629"],h:["\u0623\u0642\u0644 \u0645\u0646 \u0633\u0627\u0639\u0629","\u0633\u0627\u0639\u0629 \u0648\u0627\u062d\u062f\u0629",["\u0633\u0627\u0639\u062a\u0627\u0646","\u0633\u0627\u0639\u062a\u064a\u0646"],"%d \u0633\u0627\u0639\u0627\u062a","%d \u0633\u0627\u0639\u0629","%d \u0633\u0627\u0639\u0629"],d:["\u0623\u0642\u0644 \u0645\u0646 \u064a\u0648\u0645","\u064a\u0648\u0645 \u0648\u0627\u062d\u062f",["\u064a\u0648\u0645\u0627\u0646","\u064a\u0648\u0645\u064a\u0646"],"%d \u0623\u064a\u0627\u0645","%d \u064a\u0648\u0645\u064b\u0627","%d \u064a\u0648\u0645"],M:["\u0623\u0642\u0644 \u0645\u0646 \u0634\u0647\u0631","\u0634\u0647\u0631 \u0648\u0627\u062d\u062f",["\u0634\u0647\u0631\u0627\u0646","\u0634\u0647\u0631\u064a\u0646"],"%d \u0623\u0634\u0647\u0631","%d \u0634\u0647\u0631\u0627","%d \u0634\u0647\u0631"],y:["\u0623\u0642\u0644 \u0645\u0646 \u0639\u0627\u0645","\u0639\u0627\u0645 \u0648\u0627\u062d\u062f",["\u0639\u0627\u0645\u0627\u0646","\u0639\u0627\u0645\u064a\u0646"],"%d \u0623\u0639\u0648\u0627\u0645","%d \u0639\u0627\u0645\u064b\u0627","%d \u0639\u0627\u0645"]},i=function(t){return function(e,i,o,s){var l=n(e),a=r[t][n(e)];return 2===l&&(a=a[i?0:1]),a.replace(/%d/i,e)}},o=["\u064a\u0646\u0627\u064a\u0631","\u0641\u0628\u0631\u0627\u064a\u0631","\u0645\u0627\u0631\u0633","\u0623\u0628\u0631\u064a\u0644","\u0645\u0627\u064a\u0648","\u064a\u0648\u0646\u064a\u0648","\u064a\u0648\u0644\u064a\u0648","\u0623\u063a\u0633\u0637\u0633","\u0633\u0628\u062a\u0645\u0628\u0631","\u0623\u0643\u062a\u0648\u0628\u0631","\u0646\u0648\u0641\u0645\u0628\u0631","\u062f\u064a\u0633\u0645\u0628\u0631"];t.defineLocale("ar-ly",{months:o,monthsShort:o,weekdays:"\u0627\u0644\u0623\u062d\u062f_\u0627\u0644\u0625\u062b\u0646\u064a\u0646_\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621_\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621_\u0627\u0644\u062e\u0645\u064a\u0633_\u0627\u0644\u062c\u0645\u0639\u0629_\u0627\u0644\u0633\u0628\u062a".split("_"),weekdaysShort:"\u0623\u062d\u062f_\u0625\u062b\u0646\u064a\u0646_\u062b\u0644\u0627\u062b\u0627\u0621_\u0623\u0631\u0628\u0639\u0627\u0621_\u062e\u0645\u064a\u0633_\u062c\u0645\u0639\u0629_\u0633\u0628\u062a".split("_"),weekdaysMin:"\u062d_\u0646_\u062b_\u0631_\u062e_\u062c_\u0633".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/\u200fM/\u200fYYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/\u0635|\u0645/,isPM:function(t){return"\u0645"===t},meridiem:function(t,e,n){return t<12?"\u0635":"\u0645"},calendar:{sameDay:"[\u0627\u0644\u064a\u0648\u0645 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextDay:"[\u063a\u062f\u064b\u0627 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",nextWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastDay:"[\u0623\u0645\u0633 \u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",lastWeek:"dddd [\u0639\u0646\u062f \u0627\u0644\u0633\u0627\u0639\u0629] LT",sameElse:"L"},relativeTime:{future:"\u0628\u0639\u062f %s",past:"\u0645\u0646\u0630 %s",s:i("s"),ss:i("s"),m:i("m"),mm:i("m"),h:i("h"),hh:i("h"),d:i("d"),dd:i("d"),M:i("M"),MM:i("M"),y:i("y"),yy:i("y")},preparse:function(t){return t.replace(/\u060c/g,",")},postformat:function(t){return t.replace(/\d/g,function(t){return e[t]}).replace(/,/g,"\u060c")},week:{dow:6,doy:12}})}(n("PJh5"))},wT5f:function(t,e,n){!function(t){"use strict";function e(t,e,n){var r=" ";return(t%100>=20||t>=100&&t%100==0)&&(r=" de "),t+r+{ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"}[n]}t.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminic\u0103_luni_mar\u021bi_miercuri_joi_vineri_s\xe2mb\u0103t\u0103".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_S\xe2m".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_S\xe2".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[m\xe2ine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s \xeen urm\u0103",s:"c\xe2teva secunde",ss:e,m:"un minut",mm:e,h:"o or\u0103",hh:e,d:"o zi",dd:e,M:"o lun\u0103",MM:e,y:"un an",yy:e},week:{dow:1,doy:7}})}(n("PJh5"))},x35b:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("WT6e"),i={nodeUrl:"/api/v1/",production:!0,tellerUrl:"https://event.skycoin.net/api/"},o=(n("rxKx"),n("TToO")),s=n("YaPU"),l=function(){},a=new r.r("Location Initialized"),u=function(){},c=new r.r("appBaseHref"),d=function(){function t(e){var n=this;this._subject=new r.o,this._platformStrategy=e;var i=this._platformStrategy.getBaseHref();this._baseHref=t.stripTrailingSlash(h(i)),this._platformStrategy.onPopState(function(t){n._subject.emit({url:n.path(!0),pop:!0,type:t.type})})}return t.prototype.path=function(t){return void 0===t&&(t=!1),this.normalize(this._platformStrategy.path(t))},t.prototype.isCurrentPathEqualTo=function(e,n){return void 0===n&&(n=""),this.path()==this.normalize(e+t.normalizeQueryParams(n))},t.prototype.normalize=function(e){return t.stripTrailingSlash(function(t,e){return t&&e.startsWith(t)?e.substring(t.length):e}(this._baseHref,h(e)))},t.prototype.prepareExternalUrl=function(t){return t&&"/"!==t[0]&&(t="/"+t),this._platformStrategy.prepareExternalUrl(t)},t.prototype.go=function(t,e){void 0===e&&(e=""),this._platformStrategy.pushState(null,"",t,e)},t.prototype.replaceState=function(t,e){void 0===e&&(e=""),this._platformStrategy.replaceState(null,"",t,e)},t.prototype.forward=function(){this._platformStrategy.forward()},t.prototype.back=function(){this._platformStrategy.back()},t.prototype.subscribe=function(t,e,n){return this._subject.subscribe({next:t,error:e,complete:n})},t.normalizeQueryParams=function(t){return t&&"?"!==t[0]?"?"+t:t},t.joinWithSlash=function(t,e){if(0==t.length)return e;if(0==e.length)return t;var n=0;return t.endsWith("/")&&n++,e.startsWith("/")&&n++,2==n?t+e.substring(1):1==n?t+e:t+"/"+e},t.stripTrailingSlash=function(t){var e=t.match(/#|\?|$/),n=e&&e.index||t.length;return t.slice(0,n-("/"===t[n-1]?1:0))+t.slice(n)},t}();function h(t){return t.replace(/\/index.html$/,"")}var p=function(t){function e(e,n){var r=t.call(this)||this;return r._platformLocation=e,r._baseHref="",null!=n&&(r._baseHref=n),r}return Object(o.__extends)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.hash;return null==e&&(e="#"),e.length>0?e.substring(1):e},e.prototype.prepareExternalUrl=function(t){var e=d.joinWithSlash(this._baseHref,t);return e.length>0?"#"+e:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));0==i.length&&(i=this._platformLocation.pathname),this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),f=function(t){function e(e,n){var r=t.call(this)||this;if(r._platformLocation=e,null==n&&(n=r._platformLocation.getBaseHrefFromDOM()),null==n)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");return r._baseHref=n,r}return Object(o.__extends)(e,t),e.prototype.onPopState=function(t){this._platformLocation.onPopState(t),this._platformLocation.onHashChange(t)},e.prototype.getBaseHref=function(){return this._baseHref},e.prototype.prepareExternalUrl=function(t){return d.joinWithSlash(this._baseHref,t)},e.prototype.path=function(t){void 0===t&&(t=!1);var e=this._platformLocation.pathname+d.normalizeQueryParams(this._platformLocation.search),n=this._platformLocation.hash;return n&&t?""+e+n:e},e.prototype.pushState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.pushState(t,e,i)},e.prototype.replaceState=function(t,e,n,r){var i=this.prepareExternalUrl(n+d.normalizeQueryParams(r));this._platformLocation.replaceState(t,e,i)},e.prototype.forward=function(){this._platformLocation.forward()},e.prototype.back=function(){this._platformLocation.back()},e}(u),_={AOA:[,"Kz"],ARS:[,"$"],AUD:["A$","$"],BAM:[,"KM"],BBD:[,"$"],BDT:[,"\u09f3"],BMD:[,"$"],BND:[,"$"],BOB:[,"Bs"],BRL:["R$"],BSD:[,"$"],BWP:[,"P"],BYN:[,"\u0440."],BZD:[,"$"],CAD:["CA$","$"],CLP:[,"$"],CNY:["CN\xa5","\xa5"],COP:[,"$"],CRC:[,"\u20a1"],CUC:[,"$"],CUP:[,"$"],CZK:[,"K\u010d"],DKK:[,"kr"],DOP:[,"$"],EGP:[,"E\xa3"],ESP:[,"\u20a7"],EUR:["\u20ac"],FJD:[,"$"],FKP:[,"\xa3"],GBP:["\xa3"],GEL:[,"\u20be"],GIP:[,"\xa3"],GNF:[,"FG"],GTQ:[,"Q"],GYD:[,"$"],HKD:["HK$","$"],HNL:[,"L"],HRK:[,"kn"],HUF:[,"Ft"],IDR:[,"Rp"],ILS:["\u20aa"],INR:["\u20b9"],ISK:[,"kr"],JMD:[,"$"],JPY:["\xa5"],KHR:[,"\u17db"],KMF:[,"CF"],KPW:[,"\u20a9"],KRW:["\u20a9"],KYD:[,"$"],KZT:[,"\u20b8"],LAK:[,"\u20ad"],LBP:[,"L\xa3"],LKR:[,"Rs"],LRD:[,"$"],LTL:[,"Lt"],LVL:[,"Ls"],MGA:[,"Ar"],MMK:[,"K"],MNT:[,"\u20ae"],MUR:[,"Rs"],MXN:["MX$","$"],MYR:[,"RM"],NAD:[,"$"],NGN:[,"\u20a6"],NIO:[,"C$"],NOK:[,"kr"],NPR:[,"Rs"],NZD:["NZ$","$"],PHP:[,"\u20b1"],PKR:[,"Rs"],PLN:[,"z\u0142"],PYG:[,"\u20b2"],RON:[,"lei"],RUB:[,"\u20bd"],RUR:[,"\u0440."],RWF:[,"RF"],SBD:[,"$"],SEK:[,"kr"],SGD:[,"$"],SHP:[,"\xa3"],SRD:[,"$"],SSP:[,"\xa3"],STD:[,"Db"],SYP:[,"\xa3"],THB:[,"\u0e3f"],TOP:[,"T$"],TRY:[,"\u20ba"],TTD:[,"$"],TWD:["NT$","$"],UAH:[,"\u20b4"],USD:["$"],UYU:[,"$"],VEF:[,"Bs"],VND:["\u20ab"],XAF:["FCFA"],XCD:["EC$","$"],XOF:["CFA"],XPF:["CFPF"],ZAR:[,"R"],ZMW:[,"ZK"]},m=["en",[["a","p"],["AM","PM"]],[["AM","PM"],,],[["S","M","T","W","T","F","S"],["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],["Su","Mo","Tu","We","Th","Fr","Sa"]],,[["J","F","M","A","M","J","J","A","S","O","N","D"],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],["January","February","March","April","May","June","July","August","September","October","November","December"]],,[["B","A"],["BC","AD"],["Before Christ","Anno Domini"]],0,[6,0],["M/d/yy","MMM d, y","MMMM d, y","EEEE, MMMM d, y"],["h:mm a","h:mm:ss a","h:mm:ss a z","h:mm:ss a zzzz"],["{1}, {0}",,"{1} 'at' {0}"],[".",",",";","%","+","-","E","\xd7","\u2030","\u221e","NaN",":"],["#,##0.###","#,##0%","\xa4#,##0.00","#E0"],"$","US Dollar",function(t){var e=Math.floor(Math.abs(t)),n=t.toString().replace(/^[^.]*\.?/,"").length;return 1===e&&0===n?1:5}],g={},y=function(){var t={Decimal:0,Percent:1,Currency:2,Scientific:3};return t[t.Decimal]="Decimal",t[t.Percent]="Percent",t[t.Currency]="Currency",t[t.Scientific]="Scientific",t}(),v=function(){var t={Zero:0,One:1,Two:2,Few:3,Many:4,Other:5};return t[t.Zero]="Zero",t[t.One]="One",t[t.Two]="Two",t[t.Few]="Few",t[t.Many]="Many",t[t.Other]="Other",t}(),b=function(){var t={Format:0,Standalone:1};return t[t.Format]="Format",t[t.Standalone]="Standalone",t}(),w=function(){var t={Narrow:0,Abbreviated:1,Wide:2,Short:3};return t[t.Narrow]="Narrow",t[t.Abbreviated]="Abbreviated",t[t.Wide]="Wide",t[t.Short]="Short",t}(),M=function(){var t={Short:0,Medium:1,Long:2,Full:3};return t[t.Short]="Short",t[t.Medium]="Medium",t[t.Long]="Long",t[t.Full]="Full",t}(),k=function(){var t={Decimal:0,Group:1,List:2,PercentSign:3,PlusSign:4,MinusSign:5,Exponential:6,SuperscriptingExponent:7,PerMille:8,Infinity:9,NaN:10,TimeSeparator:11,CurrencyDecimal:12,CurrencyGroup:13};return t[t.Decimal]="Decimal",t[t.Group]="Group",t[t.List]="List",t[t.PercentSign]="PercentSign",t[t.PlusSign]="PlusSign",t[t.MinusSign]="MinusSign",t[t.Exponential]="Exponential",t[t.SuperscriptingExponent]="SuperscriptingExponent",t[t.PerMille]="PerMille",t[t.Infinity]="Infinity",t[t.NaN]="NaN",t[t.TimeSeparator]="TimeSeparator",t[t.CurrencyDecimal]="CurrencyDecimal",t[t.CurrencyGroup]="CurrencyGroup",t}();function x(t,e){return Y(t)[10][e]}function L(t,e){return Y(t)[11][e]}function C(t,e){return O(Y(t)[12],e)}function S(t,e){var n=Y(t),r=n[13][e];if("undefined"==typeof r){if(e===k.CurrencyDecimal)return n[13][k.Decimal];if(e===k.CurrencyGroup)return n[13][k.Group]}return r}function T(t){if(!t[18])throw new Error('Missing extra locale data for the locale "'+t[0]+'". Use "registerLocaleData" to load new data. See the "I18n guide" on angular.io to know more.')}function O(t,e){for(var n=e;n>-1;n--)if("undefined"!=typeof t[n])return t[n];throw new Error("Locale data API: locale data undefined")}function D(t){var e=t.split(":");return{hours:+e[0],minutes:+e[1]}}function Y(t){var e=t.toLowerCase().replace(/_/g,"-"),n=g[e];if(n)return n;var r=e.split("-")[0];if(n=g[r])return n;if("en"===r)return m;throw new Error('Missing locale data for the locale "'+t+'".')}var P=new r.r("UseV4Plurals"),E=function(){},A=function(t){function e(e,n){var r=t.call(this)||this;return r.locale=e,r.deprecatedPluralFn=n,r}return Object(o.__extends)(e,t),e.prototype.getPluralCategory=function(t,e){switch(this.deprecatedPluralFn?this.deprecatedPluralFn(e||this.locale,t):function(t){return Y(t)[17]}(e||this.locale)(t)){case v.Zero:return"zero";case v.One:return"one";case v.Two:return"two";case v.Few:return"few";case v.Many:return"many";default:return"other"}},e}(E);function j(t,e){e=encodeURIComponent(e);for(var n=0,r=t.split(";");n0||l>-n)&&(l+=n),t===K.Hours&&0===l&&-12===n&&(l=12),$(l,e,S(s,k.MinusSign),r,i)}}function et(t,e,n,r){return void 0===n&&(n=b.Format),void 0===r&&(r=!1),function(i,o){return function(t,e,n,r,i,o){switch(n){case X.Months:return function(t,e,n){var r=Y(t);return O(O([r[5],r[6]],e),n)}(e,i,r)[t.getMonth()];case X.Days:return function(t,e,n){var r=Y(t);return O(O([r[3],r[4]],e),n)}(e,i,r)[t.getDay()];case X.DayPeriods:var s=t.getHours(),l=t.getMinutes();if(o){var a,u=function(t){var e=Y(t);return T(e),(e[18][2]||[]).map(function(t){return"string"==typeof t?D(t):[D(t[0]),D(t[1])]})}(e),c=function(t,e,n){var r=Y(t);return T(r),O(O([r[18][0],r[18][1]],e)||[],n)||[]}(e,i,r);if(u.forEach(function(t,e){if(Array.isArray(t)){var n=t[0],r=t[1],i=r.hours;s>=n.hours&&l>=n.minutes&&(s0?Math.floor(i/60):Math.ceil(i/60);switch(t){case Q.Short:return(i>=0?"+":"")+$(s,2,o)+$(Math.abs(i%60),2,o);case Q.ShortGMT:return"GMT"+(i>=0?"+":"")+$(s,1,o);case Q.Long:return"GMT"+(i>=0?"+":"")+$(s,2,o)+":"+$(Math.abs(i%60),2,o);case Q.Extended:return 0===r?"Z":(i>=0?"+":"")+$(s,2,o)+":"+$(Math.abs(i%60),2,o);default:throw new Error('Unknown zone width "'+t+'"')}}}var rt=0,it=4;function ot(t,e){return void 0===e&&(e=!1),function(n,r){var i,o,s,l;if(e){var a=new Date(n.getFullYear(),n.getMonth(),1).getDay()-1,u=n.getDate();i=1+Math.floor((u+a)/7)}else{var c=(s=n.getFullYear(),l=new Date(s,rt,1).getDay(),new Date(s,0,1+(l<=it?it:it+7)-l)),d=(o=n,new Date(o.getFullYear(),o.getMonth(),o.getDate()+(it-o.getDay()))).getTime()-c.getTime();i=1+Math.round(d/6048e5)}return $(i,t,S(r,k.MinusSign))}}var st={};function lt(t,e){t=t.replace(/:/g,"");var n=Date.parse("Jan 01, 1970 00:00:00 "+t)/6e4;return isNaN(n)?e:n}function at(t,e){return Error("InvalidPipeArgument: '"+e+"' for pipe '"+Object(r._30)(t)+"'")}var ut=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/,ct=function(){function t(t){this.locale=t}return t.prototype.transform=function(e,n,r,i){if(void 0===n&&(n="mediumDate"),null==e||""===e||e!=e)return null;var o;if("string"==typeof e&&(e=e.trim()),dt(e))o=e;else if(isNaN(e-parseFloat(e)))if("string"==typeof e&&/^(\d{4}-\d{1,2}-\d{1,2})$/.test(e)){var s=e.split("-").map(function(t){return+t});o=new Date(s[0],s[1]-1,s[2])}else o=new Date(e);else o=new Date(parseFloat(e));if(!dt(o)){var l=void 0;if("string"!=typeof e||!(l=e.match(ut)))throw at(t,e);o=function(t){var e=new Date(0),n=0,r=0,i=t[8]?e.setUTCHours:e.setHours;t[9]&&(n=+(t[9]+t[10]),r=+(t[9]+t[11])),(t[8]?e.setUTCFullYear:e.setFullYear).call(e,+t[1],+t[2]-1,+t[3]);var o=+(t[4]||"0")-n,s=+(t[5]||"0")-r,l=+(t[6]||"0"),a=Math.round(1e3*parseFloat("0."+(t[7]||0)));return i.call(e,o,s,l,a),e}(l)}return function(t,e,n,r){e=function t(e,n){var r=function(t){return Y(t)[0]}(e);if(J[r]=J[r]||{},J[r][n])return J[r][n];var i="";switch(n){case"shortDate":i=x(e,M.Short);break;case"mediumDate":i=x(e,M.Medium);break;case"longDate":i=x(e,M.Long);break;case"fullDate":i=x(e,M.Full);break;case"shortTime":i=L(e,M.Short);break;case"mediumTime":i=L(e,M.Medium);break;case"longTime":i=L(e,M.Long);break;case"fullTime":i=L(e,M.Full);break;case"short":var o=t(e,"shortTime"),s=t(e,"shortDate");i=Z(C(e,M.Short),[o,s]);break;case"medium":var l=t(e,"mediumTime"),a=t(e,"mediumDate");i=Z(C(e,M.Medium),[l,a]);break;case"long":var u=t(e,"longTime"),c=t(e,"longDate");i=Z(C(e,M.Long),[u,c]);break;case"full":var d=t(e,"fullTime"),h=t(e,"fullDate");i=Z(C(e,M.Full),[d,h])}return i&&(J[r][n]=i),i}(n,e)||e;for(var i,o=[];e;){if(!(i=q.exec(e))){o.push(e);break}var s=(o=o.concat(i.slice(1))).pop();if(!s)break;e=s}var l=t.getTimezoneOffset();r&&(l=lt(r,l),t=function(t,e,n){var r=t.getTimezoneOffset();return function(t,e){return(t=new Date(t.getTime())).setMinutes(t.getMinutes()+e),t}(t,-1*(lt(e,r)-r))}(t,r));var a="";return o.forEach(function(e){var r=function(t){if(st[t])return st[t];var e;switch(t){case"G":case"GG":case"GGG":e=et(X.Eras,w.Abbreviated);break;case"GGGG":e=et(X.Eras,w.Wide);break;case"GGGGG":e=et(X.Eras,w.Narrow);break;case"y":e=tt(K.FullYear,1,0,!1,!0);break;case"yy":e=tt(K.FullYear,2,0,!0,!0);break;case"yyy":e=tt(K.FullYear,3,0,!1,!0);break;case"yyyy":e=tt(K.FullYear,4,0,!1,!0);break;case"M":case"L":e=tt(K.Month,1,1);break;case"MM":case"LL":e=tt(K.Month,2,1);break;case"MMM":e=et(X.Months,w.Abbreviated);break;case"MMMM":e=et(X.Months,w.Wide);break;case"MMMMM":e=et(X.Months,w.Narrow);break;case"LLL":e=et(X.Months,w.Abbreviated,b.Standalone);break;case"LLLL":e=et(X.Months,w.Wide,b.Standalone);break;case"LLLLL":e=et(X.Months,w.Narrow,b.Standalone);break;case"w":e=ot(1);break;case"ww":e=ot(2);break;case"W":e=ot(1,!0);break;case"d":e=tt(K.Date,1);break;case"dd":e=tt(K.Date,2);break;case"E":case"EE":case"EEE":e=et(X.Days,w.Abbreviated);break;case"EEEE":e=et(X.Days,w.Wide);break;case"EEEEE":e=et(X.Days,w.Narrow);break;case"EEEEEE":e=et(X.Days,w.Short);break;case"a":case"aa":case"aaa":e=et(X.DayPeriods,w.Abbreviated);break;case"aaaa":e=et(X.DayPeriods,w.Wide);break;case"aaaaa":e=et(X.DayPeriods,w.Narrow);break;case"b":case"bb":case"bbb":e=et(X.DayPeriods,w.Abbreviated,b.Standalone,!0);break;case"bbbb":e=et(X.DayPeriods,w.Wide,b.Standalone,!0);break;case"bbbbb":e=et(X.DayPeriods,w.Narrow,b.Standalone,!0);break;case"B":case"BB":case"BBB":e=et(X.DayPeriods,w.Abbreviated,b.Format,!0);break;case"BBBB":e=et(X.DayPeriods,w.Wide,b.Format,!0);break;case"BBBBB":e=et(X.DayPeriods,w.Narrow,b.Format,!0);break;case"h":e=tt(K.Hours,1,-12);break;case"hh":e=tt(K.Hours,2,-12);break;case"H":e=tt(K.Hours,1);break;case"HH":e=tt(K.Hours,2);break;case"m":e=tt(K.Minutes,1);break;case"mm":e=tt(K.Minutes,2);break;case"s":e=tt(K.Seconds,1);break;case"ss":e=tt(K.Seconds,2);break;case"S":e=tt(K.Milliseconds,1);break;case"SS":e=tt(K.Milliseconds,2);break;case"SSS":e=tt(K.Milliseconds,3);break;case"Z":case"ZZ":case"ZZZ":e=nt(Q.Short);break;case"ZZZZZ":e=nt(Q.Extended);break;case"O":case"OO":case"OOO":case"z":case"zz":case"zzz":e=nt(Q.ShortGMT);break;case"OOOO":case"ZZZZ":case"zzzz":e=nt(Q.Long);break;default:return null}return st[t]=e,e}(e);a+=r?r(t,n,l):"''"===e?"'":e.replace(/(^'|'$)/g,"").replace(/''/g,"'")}),a}(o,n,i||this.locale,r)},t}();function dt(t){return t instanceof Date&&!isNaN(t.valueOf())}var ht=/^(\d+)?\.((\d+)(-(\d+))?)?$/,pt=22,ft=".",_t="0",mt=";",gt=",",yt="#",vt="\xa4",bt="%";function wt(t,e,n,r,i){void 0===i&&(i=null);var o,s={str:null},l=function(t,e){return Y(t)[14][e]}(e,n);if("string"!=typeof t||isNaN(+t-parseFloat(t))){if("number"!=typeof t)return s.error=t+" is not a number",s;o=t}else o=+t;var a=function(t,e){void 0===e&&(e="-");var n={minInt:1,minFrac:0,maxFrac:0,posPre:"",posSuf:"",negPre:"",negSuf:"",gSize:0,lgSize:0},r=t.split(mt),i=r[0],o=r[1],s=-1!==i.indexOf(ft)?i.split(ft):[i.substring(0,i.lastIndexOf(_t)+1),i.substring(i.lastIndexOf(_t)+1)],l=s[0],a=s[1]||"";n.posPre=l.substr(0,l.indexOf(yt));for(var u=0;u-1&&(s=s.replace(ft,"")),(r=s.search(/e/i))>0?(n<0&&(n=r),n+=+s.slice(r+1),s=s.substring(0,r)):n<0&&(n=s.length),r=0;s.charAt(r)===_t;r++);if(r===(o=s.length))e=[0],n=1;else{for(o--;s.charAt(o)===_t;)o--;for(n-=r,e=[],i=0;r<=o;r++,i++)e[i]=+s.charAt(r)}return n>pt&&(e=e.splice(0,pt-1),l=n-1,n=1),{digits:e,exponent:l,integerLen:n}}(o);n===y.Percent&&(d=function(t){if(0===t.digits[0])return t;var e=t.digits.length-t.integerLen;return t.exponent?t.exponent+=2:(0===e?t.digits.push(0,0):1===e&&t.digits.push(0),t.integerLen+=2),t}(d));var h=a.minInt,p=a.minFrac,f=a.maxFrac;if(r){var _=r.match(ht);if(null===_)return s.error=r+" is not a valid digit info",s;var m=_[1],g=_[3],v=_[5];null!=m&&(h=Mt(m)),null!=g&&(p=Mt(g)),null!=v?f=Mt(v):null!=g&&p>f&&(f=p)}!function(t,e,n){if(e>n)throw new Error("The minimum number of digits after fraction ("+e+") is higher than the maximum ("+n+").");var r=t.digits,i=r.length-t.integerLen,o=Math.min(Math.max(e,i),n),s=o+t.integerLen,l=r[s];if(s>0){r.splice(Math.max(t.integerLen,s));for(var a=s;a=5)if(s-1<0){for(var c=0;c>s;c--)r.unshift(0),t.integerLen++;r.unshift(1),t.integerLen++}else r[s-1]++;for(;i=h?r.pop():d=!1),e>=10?1:0},0);p&&(r.unshift(p),t.integerLen++)}(d,p,f);var b=d.digits,w=d.integerLen,M=d.exponent,x=[];for(c=b.every(function(t){return!t});w0?x=b.splice(w,b.length):(x=b,b=[0]);var L=[];for(b.length>=a.lgSize&&L.unshift(b.splice(-a.lgSize,b.length).join(""));b.length>a.gSize;)L.unshift(b.splice(-a.gSize,b.length).join(""));b.length&&L.unshift(b.join("")),u=L.join(S(e,i?k.CurrencyGroup:k.Group)),x.length&&(u+=S(e,i?k.CurrencyDecimal:k.Decimal)+x.join("")),M&&(u+=S(e,k.Exponential)+"+"+M)}else u=S(e,k.Infinity);return u=o<0&&!c?a.negPre+u+a.negSuf:a.posPre+u+a.posSuf,n===y.Currency&&null!==i?(s.str=u.replace(vt,i).replace(vt,""),s):n===y.Percent?(s.str=u.replace(new RegExp(bt,"g"),S(e,k.PercentSign)),s):(s.str=u,s)}function Mt(t){var e=parseInt(t);if(isNaN(e))throw new Error("Invalid integer literal when parsing "+t);return e}var kt=function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.subscribe({next:e,error:function(t){throw t}})},t.prototype.dispose=function(t){t.unsubscribe()},t.prototype.onDestroy=function(t){t.unsubscribe()},t}(),xt=new(function(){function t(){}return t.prototype.createSubscription=function(t,e){return t.then(e,function(t){throw t})},t.prototype.dispose=function(t){},t.prototype.onDestroy=function(t){},t}()),Lt=new kt,Ct=function(){function t(t){this._ref=t,this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null,this._strategy=null}return t.prototype.ngOnDestroy=function(){this._subscription&&this._dispose()},t.prototype.transform=function(t){return this._obj?t!==this._obj?(this._dispose(),this.transform(t)):this._latestValue===this._latestReturnedValue?this._latestReturnedValue:(this._latestReturnedValue=this._latestValue,r.T.wrap(this._latestValue)):(t&&this._subscribe(t),this._latestReturnedValue=this._latestValue,this._latestValue)},t.prototype._subscribe=function(t){var e=this;this._obj=t,this._strategy=this._selectStrategy(t),this._subscription=this._strategy.createSubscription(t,function(n){return e._updateLatestValue(t,n)})},t.prototype._selectStrategy=function(e){if(Object(r._15)(e))return xt;if(Object(r._14)(e))return Lt;throw at(t,e)},t.prototype._dispose=function(){this._strategy.dispose(this._subscription),this._latestValue=null,this._latestReturnedValue=null,this._subscription=null,this._obj=null},t.prototype._updateLatestValue=function(t,e){t===this._obj&&(this._latestValue=e,this._ref.markForCheck())},t}(),St=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Dt(e))return null;var i=wt(e,r=r||this._locale,y.Decimal,n),o=i.str,s=i.error;if(s)throw at(t,s);return o},t}(),Tt=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r){if(Dt(e))return null;var i=wt(e,r=r||this._locale,y.Percent,n),o=i.str,s=i.error;if(s)throw at(t,s);return o},t}(),Ot=function(){function t(t){this._locale=t}return t.prototype.transform=function(e,n,r,i,o){if(void 0===r&&(r="symbol"),Dt(e))return null;o=o||this._locale,"boolean"==typeof r&&(console&&console.warn&&console.warn('Warning: the currency pipe has been changed in Angular v5. The symbolDisplay option (third parameter) is now a string instead of a boolean. The accepted values are "code", "symbol" or "symbol-narrow".'),r=r?"symbol":"code");var s=n||"USD";"code"!==r&&(s=function(t,e){var n=_[t]||[],i=n[1];return"narrow"==("symbol"===r?"wide":"narrow")&&"string"==typeof i?i:n[0]||t}(s));var l=wt(e,o,y.Currency,i,s),a=l.str,u=l.error;if(u)throw at(t,u);return a},t}();function Dt(t){return null==t||""===t||t!=t}var Yt=function(){},Pt=new r.r("DocumentToken"),Et=null;function At(){return Et}var jt,It={class:"className",innerHtml:"innerHTML",readonly:"readOnly",tabindex:"tabIndex"},Rt={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},Ht={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"};r._10.Node&&(jt=r._10.Node.prototype.contains||function(t){return!!(16&this.compareDocumentPosition(t))});var Ft,Nt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.parse=function(t){throw new Error("parse not implemented")},e.makeCurrent=function(){var t;t=new e,Et||(Et=t)},e.prototype.hasProperty=function(t,e){return e in t},e.prototype.setProperty=function(t,e,n){t[e]=n},e.prototype.getProperty=function(t,e){return t[e]},e.prototype.invoke=function(t,e,n){var r;(r=t)[e].apply(r,n)},e.prototype.logError=function(t){window.console&&(console.error?console.error(t):console.log(t))},e.prototype.log=function(t){window.console&&window.console.log&&window.console.log(t)},e.prototype.logGroup=function(t){window.console&&window.console.group&&window.console.group(t)},e.prototype.logGroupEnd=function(){window.console&&window.console.groupEnd&&window.console.groupEnd()},Object.defineProperty(e.prototype,"attrToPropMap",{get:function(){return It},enumerable:!0,configurable:!0}),e.prototype.contains=function(t,e){return jt.call(t,e)},e.prototype.querySelector=function(t,e){return t.querySelector(e)},e.prototype.querySelectorAll=function(t,e){return t.querySelectorAll(e)},e.prototype.on=function(t,e,n){t.addEventListener(e,n,!1)},e.prototype.onAndCancel=function(t,e,n){return t.addEventListener(e,n,!1),function(){t.removeEventListener(e,n,!1)}},e.prototype.dispatchEvent=function(t,e){t.dispatchEvent(e)},e.prototype.createMouseEvent=function(t){var e=this.getDefaultDocument().createEvent("MouseEvent");return e.initEvent(t,!0,!0),e},e.prototype.createEvent=function(t){var e=this.getDefaultDocument().createEvent("Event");return e.initEvent(t,!0,!0),e},e.prototype.preventDefault=function(t){t.preventDefault(),t.returnValue=!1},e.prototype.isPrevented=function(t){return t.defaultPrevented||null!=t.returnValue&&!t.returnValue},e.prototype.getInnerHTML=function(t){return t.innerHTML},e.prototype.getTemplateContent=function(t){return"content"in t&&this.isTemplateElement(t)?t.content:null},e.prototype.getOuterHTML=function(t){return t.outerHTML},e.prototype.nodeName=function(t){return t.nodeName},e.prototype.nodeValue=function(t){return t.nodeValue},e.prototype.type=function(t){return t.type},e.prototype.content=function(t){return this.hasProperty(t,"content")?t.content:t},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.nextSibling=function(t){return t.nextSibling},e.prototype.parentElement=function(t){return t.parentNode},e.prototype.childNodes=function(t){return t.childNodes},e.prototype.childNodesAsList=function(t){for(var e=t.childNodes,n=new Array(e.length),r=0;r0},e.prototype.tagName=function(t){return t.tagName},e.prototype.attributeMap=function(t){for(var e=new Map,n=t.attributes,r=0;r0;l||(l=t[s]=[]);var u=Me(e)?Zone.root:Zone.current;if(0===l.length)l.push({zone:u,handler:o});else{for(var c=!1,d=0;d-1},e}(ee),Oe=["alt","control","meta","shift"],De={alt:function(t){return t.altKey},control:function(t){return t.ctrlKey},meta:function(t){return t.metaKey},shift:function(t){return t.shiftKey}},Ye=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e.prototype.supports=function(t){return null!=e.parseEventName(t)},e.prototype.addEventListener=function(t,n,r){var i=e.parseEventName(n),o=e.eventCallback(i.fullKey,r,this.manager.getZone());return this.manager.getZone().runOutsideAngular(function(){return At().onAndCancel(t,i.domEventName,o)})},e.parseEventName=function(t){var n=t.toLowerCase().split("."),r=n.shift();if(0===n.length||"keydown"!==r&&"keyup"!==r)return null;var i=e._normalizeKey(n.pop()),o="";if(Oe.forEach(function(t){var e=n.indexOf(t);e>-1&&(n.splice(e,1),o+=t+".")}),o+=i,0!=n.length||0===i.length)return null;var s={};return s.domEventName=r,s.fullKey=o,s},e.getEventFullKey=function(t){var e="",n=At().getEventKey(t);return" "===(n=n.toLowerCase())?n="space":"."===n&&(n="dot"),Oe.forEach(function(r){r!=n&&(0,De[r])(t)&&(e+=r+".")}),e+=n},e.eventCallback=function(t,n,r){return function(i){e.getEventFullKey(i)===t&&r.runGuarded(function(){return n(i)})}},e._normalizeKey=function(t){switch(t){case"esc":return"escape";default:return t}},e}(ee),Pe=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,Ee=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+\/]+=*$/i;function Ae(t){return(t=String(t)).match(Pe)||t.match(Ee)?t:(Object(r.Y)()&&At().log("WARNING: sanitizing unsafe URL value "+t+" (see http://g.co/ng/security#xss)"),"unsafe:"+t)}var je=null,Ie=null;function Re(t){for(var e={},n=0,r=t.split(",");n")):this.sanitizedSomething=!0},t.prototype.endElement=function(t){var e=Ie.nodeName(t).toLowerCase();ze.hasOwnProperty(e)&&!Fe.hasOwnProperty(e)&&(this.buf.push(""))},t.prototype.chars=function(t){this.buf.push(Xe(t))},t}();function qe(t,e){if(e&&Ie.contains(t,e))throw new Error("Failed to sanitize html because the element is clobbered: "+Ie.getOuterHTML(t));return e}var Qe=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ke=/([^\#-~ |!])/g;function Xe(t){return t.replace(/&/g,"&").replace(Qe,function(t){return"&#"+(1024*(t.charCodeAt(0)-55296)+(t.charCodeAt(1)-56320)+65536)+";"}).replace(Ke,function(t){return"&#"+t.charCodeAt(0)+";"}).replace(//g,">")}function Ze(t){Ie.attributeMap(t).forEach(function(e,n){"xmlns:ns1"!==n&&0!==n.indexOf("ns1:")||Ie.removeAttribute(t,n)});for(var e=0,n=Ie.childNodesAsList(t);e0){var r=t.slice(0,e),i=t.slice(e+1).trim();n.set(r,i)}}),n},t.prototype.append=function(t,e){var n=this.getAll(t);null===n?this.set(t,e):n.push(e)},t.prototype.delete=function(t){var e=t.toLowerCase();this._normalizedNames.delete(e),this._headers.delete(e)},t.prototype.forEach=function(t){var e=this;this._headers.forEach(function(n,r){return t(n,e._normalizedNames.get(r),e._headers)})},t.prototype.get=function(t){var e=this.getAll(t);return null===e?null:e.length>0?e[0]:null},t.prototype.has=function(t){return this._headers.has(t.toLowerCase())},t.prototype.keys=function(){return Array.from(this._normalizedNames.values())},t.prototype.set=function(t,e){Array.isArray(e)?e.length&&this._headers.set(t.toLowerCase(),[e.join(",")]):this._headers.set(t.toLowerCase(),[e]),this.mayBeSetNormalizedName(t)},t.prototype.values=function(){return Array.from(this._headers.values())},t.prototype.toJSON=function(){var t=this,e={};return this._headers.forEach(function(n,r){var i=[];n.forEach(function(t){return i.push.apply(i,t.split(","))}),e[t._normalizedNames.get(r)]=i}),e},t.prototype.getAll=function(t){return this.has(t)&&this._headers.get(t.toLowerCase())||null},t.prototype.entries=function(){throw new Error('"entries" method is not implemented on Headers class')},t.prototype.mayBeSetNormalizedName=function(t){var e=t.toLowerCase();this._normalizedNames.has(e)||this._normalizedNames.set(e,t)},t}(),bn=function(){function t(t){void 0===t&&(t={});var e=t.body,n=t.status,r=t.headers,i=t.statusText,o=t.type,s=t.url;this.body=null!=e?e:null,this.status=null!=n?n:null,this.headers=null!=r?r:null,this.statusText=null!=i?i:null,this.type=null!=o?o:null,this.url=null!=s?s:null}return t.prototype.merge=function(e){return new t({body:e&&null!=e.body?e.body:this.body,status:e&&null!=e.status?e.status:this.status,headers:e&&null!=e.headers?e.headers:this.headers,statusText:e&&null!=e.statusText?e.statusText:this.statusText,type:e&&null!=e.type?e.type:this.type,url:e&&null!=e.url?e.url:this.url})},t}(),wn=function(t){function e(){return t.call(this,{status:200,statusText:"Ok",type:mn.Default,headers:new vn})||this}return Object(o.__extends)(e,t),e}(bn),Mn=function(){};function kn(t){if("string"!=typeof t)return t;switch(t.toUpperCase()){case"GET":return _n.Get;case"POST":return _n.Post;case"PUT":return _n.Put;case"DELETE":return _n.Delete;case"OPTIONS":return _n.Options;case"HEAD":return _n.Head;case"PATCH":return _n.Patch}throw new Error('Invalid request method. The method "'+t+'" is not supported.')}var xn=function(t){return t>=200&&t<300},Ln=function(){function t(){}return t.prototype.encodeKey=function(t){return Cn(t)},t.prototype.encodeValue=function(t){return Cn(t)},t}();function Cn(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Sn=function(){function t(t,e){void 0===t&&(t=""),void 0===e&&(e=new Ln),this.rawParams=t,this.queryEncoder=e,this.paramsMap=function(t){void 0===t&&(t="");var e=new Map;return t.length>0&&t.split("&").forEach(function(t){var n=t.indexOf("="),r=-1==n?[t,""]:[t.slice(0,n),t.slice(n+1)],i=r[0],o=r[1],s=e.get(i)||[];s.push(o),e.set(i,s)}),e}(t)}return t.prototype.clone=function(){var e=new t("",this.queryEncoder);return e.appendAll(this),e},t.prototype.has=function(t){return this.paramsMap.has(t)},t.prototype.get=function(t){var e=this.paramsMap.get(t);return Array.isArray(e)?e[0]:null},t.prototype.getAll=function(t){return this.paramsMap.get(t)||[]},t.prototype.set=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.length=0,n.push(e),this.paramsMap.set(t,n)}else this.delete(t)},t.prototype.setAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){var r=e.paramsMap.get(n)||[];r.length=0,r.push(t[0]),e.paramsMap.set(n,r)})},t.prototype.append=function(t,e){if(void 0!==e&&null!==e){var n=this.paramsMap.get(t)||[];n.push(e),this.paramsMap.set(t,n)}},t.prototype.appendAll=function(t){var e=this;t.paramsMap.forEach(function(t,n){for(var r=e.paramsMap.get(n)||[],i=0;i=200&&n.status<=299,n.statusText=e.statusText,n.headers=e.headers,n.type=e.type,n.url=e.url,n}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"Response with status: "+this.status+" "+this.statusText+" for URL: "+this.url},e}(Tn),Dn=/^\)\]\}',?\n/,Yn=function(){function t(t,e,n){var r=this;this.request=t,this.response=new s.a(function(i){var o=e.build();o.open(_n[t.method].toUpperCase(),t.url),null!=t.withCredentials&&(o.withCredentials=t.withCredentials);var s=function(){var e=1223===o.status?204:o.status,r=null;204!==e&&"string"==typeof(r="undefined"==typeof o.response?o.responseText:o.response)&&(r=r.replace(Dn,"")),0===e&&(e=r?200:0);var s,l=vn.fromResponseHeaderString(o.getAllResponseHeaders()),a=("responseURL"in(s=o)?s.responseURL:/^X-Request-URL:/m.test(s.getAllResponseHeaders())?s.getResponseHeader("X-Request-URL"):null)||t.url,u=new bn({body:r,status:e,headers:l,statusText:o.statusText||"OK",url:a});null!=n&&(u=n.merge(u));var c=new On(u);if(c.ok=xn(e),c.ok)return i.next(c),void i.complete();i.error(c)},l=function(t){var e=new bn({body:t,type:mn.Error,status:o.status,statusText:o.statusText});null!=n&&(e=n.merge(e)),i.error(new On(e))};if(r.setDetectedContentType(t,o),null==t.headers&&(t.headers=new vn),t.headers.has("Accept")||t.headers.append("Accept","application/json, text/plain, */*"),t.headers.forEach(function(t,e){return o.setRequestHeader(e,t.join(","))}),null!=t.responseType&&null!=o.responseType)switch(t.responseType){case yn.ArrayBuffer:o.responseType="arraybuffer";break;case yn.Json:o.responseType="json";break;case yn.Text:o.responseType="text";break;case yn.Blob:o.responseType="blob";break;default:throw new Error("The selected responseType is not supported")}return o.addEventListener("load",s),o.addEventListener("error",l),o.send(r.request.getBody()),function(){o.removeEventListener("load",s),o.removeEventListener("error",l),o.abort()}})}return t.prototype.setDetectedContentType=function(t,e){if(null==t.headers||null==t.headers.get("Content-Type"))switch(t.contentType){case gn.NONE:break;case gn.JSON:e.setRequestHeader("content-type","application/json");break;case gn.FORM:e.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");break;case gn.TEXT:e.setRequestHeader("content-type","text/plain");break;case gn.BLOB:var n=t.blob();n.type&&e.setRequestHeader("content-type",n.type)}},t}(),Pn=function(){function t(t,e){void 0===t&&(t="XSRF-TOKEN"),void 0===e&&(e="X-XSRF-TOKEN"),this._cookieName=t,this._headerName=e}return t.prototype.configureRequest=function(t){var e=At().getCookie(this._cookieName);e&&t.headers.set(this._headerName,e)},t}(),En=function(){function t(t,e,n){this._browserXHR=t,this._baseResponseOptions=e,this._xsrfStrategy=n}return t.prototype.createConnection=function(t){return this._xsrfStrategy.configureRequest(t),new Yn(t,this._browserXHR,this._baseResponseOptions)},t}(),An=function(){function t(t){void 0===t&&(t={});var e=t.method,n=t.headers,r=t.body,i=t.url,o=t.search,s=t.params,l=t.withCredentials,a=t.responseType;this.method=null!=e?kn(e):null,this.headers=null!=n?n:null,this.body=null!=r?r:null,this.url=null!=i?i:null,this.params=this._mergeSearchParams(s||o),this.withCredentials=null!=l?l:null,this.responseType=null!=a?a:null}return Object.defineProperty(t.prototype,"search",{get:function(){return this.params},set:function(t){this.params=t},enumerable:!0,configurable:!0}),t.prototype.merge=function(e){return new t({method:e&&null!=e.method?e.method:this.method,headers:e&&null!=e.headers?e.headers:new vn(this.headers),body:e&&null!=e.body?e.body:this.body,url:e&&null!=e.url?e.url:this.url,params:e&&this._mergeSearchParams(e.params||e.search),withCredentials:e&&null!=e.withCredentials?e.withCredentials:this.withCredentials,responseType:e&&null!=e.responseType?e.responseType:this.responseType})},t.prototype._mergeSearchParams=function(t){return t?t instanceof Sn?t.clone():"string"==typeof t?new Sn(t):this._parseParams(t):this.params},t.prototype._parseParams=function(t){var e=this;void 0===t&&(t={});var n=new Sn;return Object.keys(t).forEach(function(r){var i=t[r];Array.isArray(i)?i.forEach(function(t){return e._appendParam(r,t,n)}):e._appendParam(r,i,n)}),n},t.prototype._appendParam=function(t,e,n){"string"!=typeof e&&(e=JSON.stringify(e)),n.append(t,e)},t}(),jn=function(t){function e(){return t.call(this,{method:_n.Get,headers:new vn})||this}return Object(o.__extends)(e,t),e}(An),In=function(t){function e(e){var n=t.call(this)||this,r=e.url;n.url=e.url;var i,o=e.params||e.search;if(o&&(i="object"!=typeof o||o instanceof Sn?o.toString():function(t){var e=new Sn;return Object.keys(t).forEach(function(n){var r=t[n];r&&Array.isArray(r)?r.forEach(function(t){return e.append(n,t.toString())}):e.append(n,r.toString())}),e}(o).toString()).length>0){var s="?";-1!=n.url.indexOf("?")&&(s="&"==n.url[n.url.length-1]?"":"&"),n.url=r+s+i}return n._body=e.body,n.method=kn(e.method),n.headers=new vn(e.headers),n.contentType=n.detectContentType(),n.withCredentials=e.withCredentials,n.responseType=e.responseType,n}return Object(o.__extends)(e,t),e.prototype.detectContentType=function(){switch(this.headers.get("content-type")){case"application/json":return gn.JSON;case"application/x-www-form-urlencoded":return gn.FORM;case"multipart/form-data":return gn.FORM_DATA;case"text/plain":case"text/html":return gn.TEXT;case"application/octet-stream":return this._body instanceof Vn?gn.ARRAY_BUFFER:gn.BLOB;default:return this.detectContentTypeFromBody()}},e.prototype.detectContentTypeFromBody=function(){return null==this._body?gn.NONE:this._body instanceof Sn?gn.FORM:this._body instanceof Fn?gn.FORM_DATA:this._body instanceof Nn?gn.BLOB:this._body instanceof Vn?gn.ARRAY_BUFFER:this._body&&"object"==typeof this._body?gn.JSON:gn.TEXT},e.prototype.getBody=function(){switch(this.contentType){case gn.JSON:case gn.FORM:return this.text();case gn.FORM_DATA:return this._body;case gn.TEXT:return this.text();case gn.BLOB:return this.blob();case gn.ARRAY_BUFFER:return this.arrayBuffer();default:return null}},e}(Tn),Rn=function(){},Hn="object"==typeof window?window:Rn,Fn=Hn.FormData||Rn,Nn=Hn.Blob||Rn,Vn=Hn.ArrayBuffer||Rn;function Bn(t,e){return t.createConnection(e).response}function zn(t,e,n,r){return t.merge(new An(e?{method:e.method||n,url:e.url||r,search:e.search,params:e.params,headers:e.headers,body:e.body,withCredentials:e.withCredentials,responseType:e.responseType}:{method:n,url:r}))}var Wn=function(){function t(t,e){this._backend=t,this._defaultOptions=e}return t.prototype.request=function(t,e){var n;if("string"==typeof t)n=Bn(this._backend,new In(zn(this._defaultOptions,e,_n.Get,t)));else{if(!(t instanceof In))throw new Error("First argument must be a url string or Request instance.");n=Bn(this._backend,t)}return n},t.prototype.get=function(t,e){return this.request(new In(zn(this._defaultOptions,e,_n.Get,t)))},t.prototype.post=function(t,e,n){return this.request(new In(zn(this._defaultOptions.merge(new An({body:e})),n,_n.Post,t)))},t.prototype.put=function(t,e,n){return this.request(new In(zn(this._defaultOptions.merge(new An({body:e})),n,_n.Put,t)))},t.prototype.delete=function(t,e){return this.request(new In(zn(this._defaultOptions,e,_n.Delete,t)))},t.prototype.patch=function(t,e,n){return this.request(new In(zn(this._defaultOptions.merge(new An({body:e})),n,_n.Patch,t)))},t.prototype.head=function(t,e){return this.request(new In(zn(this._defaultOptions,e,_n.Head,t)))},t.prototype.options=function(t,e){return this.request(new In(zn(this._defaultOptions,e,_n.Options,t)))},t}();function Un(){return new Pn}function Gn(t,e){return new Wn(t,e)}var Jn=function(){},qn=function(t){function e(e,n){t.call(this),this.error=e,this.scheduler=n}return Object(o.__extends)(e,t),e.create=function(t,n){return new e(t,n)},e.dispatch=function(t){t.subscriber.error(t.error)},e.prototype._subscribe=function(t){var n=this.error,r=this.scheduler;if(t.syncErrorThrowable=!0,r)return r.schedule(e.dispatch,0,{error:n,subscriber:t});t.error(n)},e}(s.a).create;s.a.throw=qn;var Qn=n("tZ2B"),Kn=n("PIsA");function Xn(t){return function(e){var n=new Zn(t),r=e.lift(n);return n.caught=r}}var Zn=function(){function t(t){this.selector=t}return t.prototype.call=function(t,e){return e.subscribe(new $n(t,this.selector,this.caught))},t}(),$n=function(t){function e(e,n,r){t.call(this,e),this.selector=n,this.caught=r}return Object(o.__extends)(e,t),e.prototype.error=function(e){if(!this.isStopped){var n=void 0;try{n=this.selector(e,this.caught)}catch(e){return void t.prototype.error.call(this,e)}this._unsubscribeAndRecycle(),this.add(Object(Kn.a)(this,n))}},e}(Qn.a);function tr(t){return Xn(t)(this)}s.a.prototype.catch=tr,s.a.prototype._catch=tr;var er=n("HdCx");function nr(t,e){return Object(er.a)(t,e)(this)}s.a.prototype.map=nr;var rr=function(){function t(t){this.http=t,this.url=i.nodeUrl}return t.prototype.getExplorerAddress=function(t){return this.get("explorer/address",{address:t.address}).map(function(t){return t.map(function(t){return{addresses:[],balance:0,block:t.status.block_seq,confirmed:t.status.confirmed,timestamp:t.timestamp,txid:t.txid,inputs:t.inputs,outputs:t.outputs}})})},t.prototype.getVersion=function(){return this.get("version")},t.prototype.generateSeed=function(t){return void 0===t&&(t=128),this.get("wallet/newSeed",{entropy:t}).map(function(t){return t.seed})},t.prototype.getWallets=function(){return this.get("wallets").map(function(t){var e=[];return t.forEach(function(t){e.push({label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted})}),e})},t.prototype.getWalletSeed=function(t,e){return this.post("wallet/seed",{id:t.filename,password:e}).map(function(t){return t.seed})},t.prototype.postWalletCreate=function(t,e,n,r){var i={label:t,seed:e,scan:n};return r&&(i.password=r,i.encrypt=!0),this.post("wallet/create",i).map(function(t){return{label:t.meta.label,filename:t.meta.filename,coins:null,hours:null,addresses:t.entries.map(function(t){return{address:t.address,coins:null,hours:null}}),encrypted:t.meta.encrypted}})},t.prototype.postWalletNewAddress=function(t,e){return this.post("wallet/newAddress",{id:t.filename,password:e}).map(function(t){return{address:t.addresses[0],coins:null,hours:null}})},t.prototype.postWalletToggleEncryption=function(t,e){return this.post("wallet/"+(t.encrypted?"decrypt":"encrypt"),{id:t.filename,password:e})},t.prototype.get=function(t,e,n){return void 0===e&&(e=null),void 0===n&&(n={}),this.http.get(this.getUrl(t,e),this.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return s.a.throw(t||"Server error")})},t.prototype.getCsrf=function(){return this.get("csrf").map(function(t){return t.csrf_token})},t.prototype.post=function(t,e,n){var r=this;return void 0===e&&(e={}),void 0===n&&(n={}),this.getCsrf().first().flatMap(function(i){return n.csrf=i,r.http.post(r.getUrl(t),n.json?JSON.stringify(e):r.getQueryString(e),r.returnRequestOptions(n)).map(function(t){return t.json()}).catch(function(t){return s.a.throw(t||"Server error")})})},t.prototype.returnRequestOptions=function(t){var e=new An;return e.headers=this.getHeaders(t),t.csrf&&e.headers.append("X-CSRF-Token",t.csrf),e},t.prototype.getHeaders=function(t){var e=new vn;return e.append("Content-Type",t.json?"application/json":"application/x-www-form-urlencoded"),e},t.prototype.getQueryString=function(t){return void 0===t&&(t=null),t?Object.keys(t).reduce(function(e,n){return e.push(n+"="+encodeURIComponent(t[n])),e},[]).join("&"):""},t.prototype.getUrl=function(t,e){return void 0===e&&(e=null),this.url+t+"?"+this.getQueryString(e)},t}(),ir=n("+3/4"),or=n("BX3T"),sr=function(t){function e(e,n){t.call(this),this.sources=e,this.resultSelector=n}return Object(o.__extends)(e,t),e.create=function(){for(var t=[],n=0;n=0}s.a.prototype.mergeMap=xr,s.a.prototype.flatMap=xr;var Cr=n("AMGY"),Sr=n("VwZZ"),Tr=function(t){function e(e,n){t.call(this,e,n),this.scheduler=e,this.work=n,this.pending=!1}return Object(o.__extends)(e,t),e.prototype.schedule=function(t,e){if(void 0===e&&(e=0),this.closed)return this;this.state=t,this.pending=!0;var n=this.id,r=this.scheduler;return null!=n&&(this.id=this.recycleAsyncId(r,n,e)),this.delay=e,this.id=this.id||this.requestAsyncId(r,this.id,e),this},e.prototype.requestAsyncId=function(t,e,n){return void 0===n&&(n=0),Cr.a.setInterval(t.flush.bind(t,this),n)},e.prototype.recycleAsyncId=function(t,e,n){if(void 0===n&&(n=0),null!==n&&this.delay===n&&!1===this.pending)return e;Cr.a.clearInterval(e)},e.prototype.execute=function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(t,e);if(n)return n;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},e.prototype._execute=function(t,e){var n=!1,r=void 0;try{this.work(t)}catch(t){n=!0,r=!!t&&t||new Error(t)}if(n)return this.unsubscribe(),r},e.prototype._unsubscribe=function(){var t=this.id,e=this.scheduler,n=e.actions,r=n.indexOf(this);this.work=null,this.state=null,this.pending=!1,this.scheduler=null,-1!==r&&n.splice(r,1),null!=t&&(this.id=this.recycleAsyncId(e,t,null)),this.delay=null},e}(function(t){function e(e,n){t.call(this)}return Object(o.__extends)(e,t),e.prototype.schedule=function(t,e){return void 0===e&&(e=0),this},e}(Sr.a)),Or=function(t){function e(){t.apply(this,arguments),this.actions=[],this.active=!1,this.scheduled=void 0}return Object(o.__extends)(e,t),e.prototype.flush=function(t){var e=this.actions;if(this.active)e.push(t);else{var n;this.active=!0;do{if(n=t.execute(t.state,t.delay))break}while(t=e.shift());if(this.active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}}},e}(function(){function t(e,n){void 0===n&&(n=t.now),this.SchedulerAction=e,this.now=n}return t.prototype.schedule=function(t,e,n){return void 0===e&&(e=0),new this.SchedulerAction(this,t).schedule(n,e)},t.now=Date.now?Date.now:function(){return+new Date},t}()),Dr=new Or(Tr),Yr=n("1Q68");function Pr(t){return t instanceof Date&&!isNaN(+t)}var Er=function(t){function e(e,n,r){void 0===e&&(e=0),t.call(this),this.period=-1,this.dueTime=0,Lr(n)?this.period=Number(n)<1?1:Number(n):Object(Yr.a)(n)&&(r=n),Object(Yr.a)(r)||(r=Dr),this.scheduler=r,this.dueTime=Pr(e)?+e-this.scheduler.now():e}return Object(o.__extends)(e,t),e.create=function(t,n,r){return void 0===t&&(t=0),new e(t,n,r)},e.dispatch=function(t){var e=t.index,n=t.period,r=t.subscriber;if(r.next(e),!r.closed){if(-1===n)return r.complete();t.index=e+1,this.schedule(t,n)}},e.prototype._subscribe=function(t){return this.scheduler.schedule(e.dispatch,this.dueTime,{index:0,period:this.period,subscriber:t})},e}(s.a).create;s.a.timer=Er;var Ar=n("Veqx"),jr=n("etqZ"),Ir=function(){function t(t){this.project=t}return t.prototype.call=function(t,e){return e.subscribe(new Rr(t,this.project))},t}(),Rr=function(t){function e(e,n,r){void 0===r&&(r=Object.create(null)),t.call(this,e),this.iterators=[],this.active=0,this.project="function"==typeof n?n:null,this.values=r}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e=this.iterators;Object(or.a)(t)?e.push(new Fr(t)):e.push("function"==typeof t[jr.a]?new Hr(t[jr.a]()):new Nr(this.destination,this,t))},e.prototype._complete=function(){var t=this.iterators,e=t.length;if(0!==e){this.active=e;for(var n=0;nthis.index},t.prototype.hasCompleted=function(){return this.array.length===this.index},t}(),Nr=function(t){function e(e,n,r){t.call(this,e),this.parent=n,this.observable=r,this.stillUnsubscribed=!0,this.buffer=[],this.isComplete=!1}return Object(o.__extends)(e,t),e.prototype[jr.a]=function(){return this},e.prototype.next=function(){var t=this.buffer;return 0===t.length&&this.isComplete?{value:null,done:!0}:{value:t.shift(),done:!1}},e.prototype.hasValue=function(){return this.buffer.length>0},e.prototype.hasCompleted=function(){return 0===this.buffer.length&&this.isComplete},e.prototype.notifyComplete=function(){this.buffer.length>0?(this.isComplete=!0,this.parent.notifyInactive()):this.destination.complete()},e.prototype.notifyNext=function(t,e,n,r,i){this.buffer.push(e),this.parent.checkIterators()},e.prototype.subscribe=function(t,e){return Object(Kn.a)(this,this.observable,this,e)},e}(Qn.a);s.a.zip=function(){for(var t=[],e=0;e0?t.prototype.schedule.call(this,e,n):(this.delay=n,this.state=e,this.scheduler.flush(this),this)},e.prototype.execute=function(e,n){return n>0||this.closed?t.prototype.execute.call(this,e,n):this._execute(e,n)},e.prototype.requestAsyncId=function(e,n,r){return void 0===r&&(r=0),null!==r&&r>0||null===r&&this.delay>0?t.prototype.requestAsyncId.call(this,e,n,r):e.flush(this)},e}(Tr),Wr=new(function(t){function e(){t.apply(this,arguments)}return Object(o.__extends)(e,t),e}(Or))(zr),Ur=function(){function t(t,e,n){this.kind=t,this.value=e,this.error=n,this.hasValue="N"===t}return t.prototype.observe=function(t){switch(this.kind){case"N":return t.next&&t.next(this.value);case"E":return t.error&&t.error(this.error);case"C":return t.complete&&t.complete()}},t.prototype.do=function(t,e,n){switch(this.kind){case"N":return t&&t(this.value);case"E":return e&&e(this.error);case"C":return n&&n()}},t.prototype.accept=function(t,e,n){return t&&"function"==typeof t.next?this.observe(t):this.do(t,e,n)},t.prototype.toObservable=function(){switch(this.kind){case"N":return s.a.of(this.value);case"E":return s.a.throw(this.error);case"C":return s.a.empty()}throw new Error("unexpected notification kind value")},t.createNext=function(e){return"undefined"!=typeof e?new t("N",e):t.undefinedValueNotification},t.createError=function(e){return new t("E",void 0,e)},t.createComplete=function(){return t.completeNotification},t.completeNotification=new t("C"),t.undefinedValueNotification=new t("N",void 0),t}(),Gr=function(t){function e(e,n,r){void 0===r&&(r=0),t.call(this,e),this.scheduler=n,this.delay=r}return Object(o.__extends)(e,t),e.dispatch=function(t){t.notification.observe(t.destination),this.unsubscribe()},e.prototype.scheduleMessage=function(t){this.add(this.scheduler.schedule(e.dispatch,this.delay,new Jr(t,this.destination)))},e.prototype._next=function(t){this.scheduleMessage(Ur.createNext(t))},e.prototype._error=function(t){this.scheduleMessage(Ur.createError(t))},e.prototype._complete=function(){this.scheduleMessage(Ur.createComplete())},e}(cr.a),Jr=function(t,e){this.notification=t,this.destination=e},qr=n("x6VL"),Qr=n("1Bqh"),Kr=function(t){function e(e,n,r){void 0===e&&(e=Number.POSITIVE_INFINITY),void 0===n&&(n=Number.POSITIVE_INFINITY),t.call(this),this.scheduler=r,this._events=[],this._bufferSize=e<1?1:e,this._windowTime=n<1?1:n}return Object(o.__extends)(e,t),e.prototype.next=function(e){var n=this._getNow();this._events.push(new Xr(n,e)),this._trimBufferThenGetEvents(),t.prototype.next.call(this,e)},e.prototype._subscribe=function(t){var e,n=this._trimBufferThenGetEvents(),r=this.scheduler;if(this.closed)throw new qr.a;this.hasError?e=Sr.a.EMPTY:this.isStopped?e=Sr.a.EMPTY:(this.observers.push(t),e=new Qr.a(this,t)),r&&t.add(t=new Gr(t,r));for(var i=n.length,o=0;oe&&(o=Math.max(o,i-e)),o>0&&r.splice(0,o),r},e}(Br.a),Xr=function(t,e){this.time=t,this.value=e},Zr=this&&this.__assign||Object.assign||function(t){for(var e,n=1,r=arguments.length;n0}).map(function(t){return t.transactions})).reduce(function(t,e){return t.find(function(t){return t.transaction.txid===e.transaction.txid})||t.push(e),t},[]))})})},t}(),ti="undefined"!=typeof Intl&&Intl.v8BreakIterator,ei=function(){return function(){this.isBrowser="object"==typeof document&&!!document,this.EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent),this.TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent),this.BLINK=this.isBrowser&&!(!window.chrome&&!ti)&&!!CSS&&!this.EDGE&&!this.TRIDENT,this.WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT,this.IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,this.FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent),this.ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT,this.SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT}}();function ni(){if(null==Vr&&"undefined"!=typeof window)try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return Vr=!0}}))}finally{Vr=Vr||!1}return Vr}var ri=function(){},ii=n("GK6M"),oi=n("/iUD"),si=n("fKB6"),li=Object.prototype.toString,ai=function(t){function e(e,n,r,i){t.call(this),this.sourceObj=e,this.eventName=n,this.selector=r,this.options=i}return Object(o.__extends)(e,t),e.create=function(t,n,r,i){return Object(oi.a)(r)&&(i=r,r=void 0),new e(t,n,i,r)},e.setupSubscription=function(t,n,r,i,o){var s;if(function(t){return!!t&&"[object NodeList]"===li.call(t)}(t)||function(t){return!!t&&"[object HTMLCollection]"===li.call(t)}(t))for(var l=0,a=t.length;l0?e._scrolled.pipe(di(t)).subscribe(n):e._scrolled.subscribe(n);return e._scrolledCount++,function(){r.unsubscribe(),e._scrolledCount--,e._globalSubscription&&!e._scrolledCount&&(e._globalSubscription.unsubscribe(),e._globalSubscription=null)}}):Object(ur.a)()},t.prototype.ancestorScrolled=function(t,e){var n=this.getAncestorScrollContainers(t);return this.scrolled(e).pipe(_r(function(t){return!t||n.indexOf(t)>-1}))},t.prototype.getAncestorScrollContainers=function(t){var e=this,n=[];return this.scrollContainers.forEach(function(r,i){e._scrollableContainsElement(i,t)&&n.push(i)}),n},t.prototype._scrollableContainsElement=function(t,e){var n=e.nativeElement,r=t.getElementRef().nativeElement;do{if(n==r)return!0}while(n=n.parentElement);return!1},t.prototype._addGlobalListener=function(){var t=this;this._globalSubscription=this._ngZone.runOutsideAngular(function(){return ai(window.document,"scroll").subscribe(function(){return t._scrolled.next()})})},t}();function fi(t,e,n){return t||new pi(e,n)}var _i=function(){function t(t,e){var n=this;this._change=t.isBrowser?e.runOutsideAngular(function(){return Object(hi.a)(ai(window,"resize"),ai(window,"orientationchange"))}):Object(ur.a)(),this._invalidateCache=this.change().subscribe(function(){return n._updateViewportSize()})}return t.prototype.ngOnDestroy=function(){this._invalidateCache.unsubscribe()},t.prototype.getViewportSize=function(){return this._viewportSize||this._updateViewportSize(),{width:this._viewportSize.width,height:this._viewportSize.height}},t.prototype.getViewportRect=function(){var t=this.getViewportScrollPosition(),e=this.getViewportSize(),n=e.width,r=e.height;return{top:t.top,left:t.left,bottom:t.top+r,right:t.left+n,height:r,width:n}},t.prototype.getViewportScrollPosition=function(){var t=document.documentElement.getBoundingClientRect();return{top:-t.top||document.body.scrollTop||window.scrollY||document.documentElement.scrollTop||0,left:-t.left||document.body.scrollLeft||window.scrollX||document.documentElement.scrollLeft||0}},t.prototype.change=function(t){return void 0===t&&(t=20),t>0?this._change.pipe(di(t)):this._change},t.prototype._updateViewportSize=function(){this._viewportSize={width:window.innerWidth,height:window.innerHeight}},t}();function mi(t,e,n){return t||new _i(e,n)}var gi=function(){},yi=new r.r("cdk-dir-doc"),vi=function(){return function(t){this.value="ltr",this.change=new r.o,t&&(this.value=(t.body?t.body.dir:null)||(t.documentElement?t.documentElement.dir:null)||"ltr")}}(),bi=function(){};function wi(){throw Error("Host already has a portal attached")}var Mi=function(){function t(){}return t.prototype.attach=function(t){return null==t&&function(){throw Error("Attempting to attach a portal to a null PortalOutlet")}(),t.hasAttached()&&wi(),this._attachedHost=t,t.attach(this)},t.prototype.detach=function(){var t=this._attachedHost;null==t?function(){throw Error("Attempting to detach a portal that is not attached to a host")}():(this._attachedHost=null,t.detach())},Object.defineProperty(t.prototype,"isAttached",{get:function(){return null!=this._attachedHost},enumerable:!0,configurable:!0}),t.prototype.setAttachedHost=function(t){this._attachedHost=t},t}(),ki=function(t){function e(e,n,r){var i=t.call(this)||this;return i.component=e,i.viewContainerRef=n,i.injector=r,i}return Object(o.__extends)(e,t),e}(Mi),xi=function(t){function e(e,n,r){var i=t.call(this)||this;return i.templateRef=e,i.viewContainerRef=n,r&&(i.context=r),i}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"origin",{get:function(){return this.templateRef.elementRef},enumerable:!0,configurable:!0}),e.prototype.attach=function(e,n){return void 0===n&&(n=this.context),this.context=n,t.prototype.attach.call(this,e)},e.prototype.detach=function(){return this.context=void 0,t.prototype.detach.call(this)},e}(Mi),Li=function(){function t(){this._isDisposed=!1}return t.prototype.hasAttached=function(){return!!this._attachedPortal},t.prototype.attach=function(t){return t||function(){throw Error("Must provide a portal to attach")}(),this.hasAttached()&&wi(),this._isDisposed&&function(){throw Error("This PortalOutlet has already been disposed")}(),t instanceof ki?(this._attachedPortal=t,this.attachComponentPortal(t)):t instanceof xi?(this._attachedPortal=t,this.attachTemplatePortal(t)):void function(){throw Error("Attempting to attach an unknown Portal type. BasePortalOutlet accepts either a ComponentPortal or a TemplatePortal.")}()},t.prototype.detach=function(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()},t.prototype.dispose=function(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0},t.prototype.setDisposeFn=function(t){this._disposeFn=t},t.prototype._invokeDisposeFn=function(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)},t}(),Ci=function(t){function e(e,n,r,i){var o=t.call(this)||this;return o._hostDomElement=e,o._componentFactoryResolver=n,o._appRef=r,o._defaultInjector=i,o}return Object(o.__extends)(e,t),e.prototype.attachComponentPortal=function(t){var e,n=this,r=this._componentFactoryResolver.resolveComponentFactory(t.component);return t.viewContainerRef?(e=t.viewContainerRef.createComponent(r,t.viewContainerRef.length,t.injector||t.viewContainerRef.parentInjector),this.setDisposeFn(function(){return e.destroy()})):(e=r.create(t.injector||this._defaultInjector),this._appRef.attachView(e.hostView),this.setDisposeFn(function(){n._appRef.detachView(e.hostView),e.destroy()})),this._hostDomElement.appendChild(this._getComponentRootNode(e)),e},e.prototype.attachTemplatePortal=function(t){var e=this,n=t.viewContainerRef,r=n.createEmbeddedView(t.templateRef,t.context);return r.detectChanges(),r.rootNodes.forEach(function(t){return e._hostDomElement.appendChild(t)}),this.setDisposeFn(function(){var t=n.indexOf(r);-1!==t&&n.remove(t)}),r},e.prototype.dispose=function(){t.prototype.dispose.call(this),null!=this._hostDomElement.parentNode&&this._hostDomElement.parentNode.removeChild(this._hostDomElement)},e.prototype._getComponentRootNode=function(t){return t.hostView.rootNodes[0]},e}(Li),Si=function(t){function e(e,n){var r=t.call(this)||this;return r._componentFactoryResolver=e,r._viewContainerRef=n,r._isInitialized=!1,r}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"_deprecatedPortal",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_deprecatedPortalHost",{get:function(){return this.portal},set:function(t){this.portal=t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"portal",{get:function(){return this._attachedPortal},set:function(e){(!this.hasAttached()||e||this._isInitialized)&&(this.hasAttached()&&t.prototype.detach.call(this),e&&t.prototype.attach.call(this,e),this._attachedPortal=e)},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._isInitialized=!0},e.prototype.ngOnDestroy=function(){t.prototype.dispose.call(this),this._attachedPortal=null},e.prototype.attachComponentPortal=function(e){e.setAttachedHost(this);var n=null!=e.viewContainerRef?e.viewContainerRef:this._viewContainerRef,r=this._componentFactoryResolver.resolveComponentFactory(e.component),i=n.createComponent(r,n.length,e.injector||n.parentInjector);return t.prototype.setDisposeFn.call(this,function(){return i.destroy()}),this._attachedPortal=e,i},e.prototype.attachTemplatePortal=function(e){var n=this;e.setAttachedHost(this);var r=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context);return t.prototype.setDisposeFn.call(this,function(){return n._viewContainerRef.clear()}),this._attachedPortal=e,r},e}(Li),Ti=function(){},Oi=function(){function t(t,e){this._parentInjector=t,this._customTokens=e}return t.prototype.get=function(t,e){var n=this._customTokens.get(t);return"undefined"!=typeof n?n:this._parentInjector.get(t,e)},t}(),Di=n("9Ocp");function Yi(t){return null!=t&&""+t!="false"}function Pi(t,e){return void 0===e&&(e=0),isNaN(parseFloat(t))||isNaN(Number(t))?e:Number(t)}function Ei(t){return Array.isArray(t)?t:[t]}var Ai=function(){function t(){}return t.prototype.enable=function(){},t.prototype.disable=function(){},t.prototype.attach=function(){},t}(),ji=function(){return function(t){var e=this;this.scrollStrategy=new Ai,this.panelClass="",this.hasBackdrop=!1,this.backdropClass="cdk-overlay-dark-backdrop",this.direction="ltr",t&&Object.keys(t).forEach(function(n){return e[n]=t[n]})}}(),Ii=function(t,e,n,r){this.offsetX=n,this.offsetY=r,this.originX=t.originX,this.originY=t.originY,this.overlayX=e.overlayX,this.overlayY=e.overlayY};function Ri(){return Error("Scroll strategy has already been attached.")}var Hi=function(){function t(t,e){this._scrollDispatcher=t,this._ngZone=e,this._scrollSubscription=null}return t.prototype.attach=function(t){if(this._overlayRef)throw Ri();this._overlayRef=t},t.prototype.enable=function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(0).subscribe(function(){t._ngZone.run(function(){t.disable(),t._overlayRef.hasAttached()&&t._overlayRef.detach()})}))},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),Fi=function(){function t(t){this._viewportRuler=t,this._previousHTMLStyles={top:"",left:""},this._isEnabled=!1}return t.prototype.attach=function(){},t.prototype.enable=function(){if(this._canBeEnabled()){var t=document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=t.style.left||"",this._previousHTMLStyles.top=t.style.top||"",t.style.left=-this._previousScrollPosition.left+"px",t.style.top=-this._previousScrollPosition.top+"px",t.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}},t.prototype.disable=function(){if(this._isEnabled){var t=document.documentElement,e=document.body,n=t.style.scrollBehavior||"",r=e.style.scrollBehavior||"";this._isEnabled=!1,t.style.left=this._previousHTMLStyles.left,t.style.top=this._previousHTMLStyles.top,t.classList.remove("cdk-global-scrollblock"),t.style.scrollBehavior=e.style.scrollBehavior="auto",window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),t.style.scrollBehavior=n,e.style.scrollBehavior=r}},t.prototype._canBeEnabled=function(){if(document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;var t=document.body,e=this._viewportRuler.getViewportSize();return t.scrollHeight>e.height||t.scrollWidth>e.width},t}();function Ni(t,e){return e.some(function(e){return t.bottome.bottom||t.righte.right})}function Vi(t,e){return e.some(function(e){return t.tope.bottom||t.lefte.right})}var Bi=function(){function t(t,e,n,r){this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this._config=r,this._scrollSubscription=null}return t.prototype.attach=function(t){if(this._overlayRef)throw Ri();this._overlayRef=t},t.prototype.enable=function(){var t=this;this._scrollSubscription||(this._scrollSubscription=this._scrollDispatcher.scrolled(this._config?this._config.scrollThrottle:0).subscribe(function(){if(t._overlayRef.updatePosition(),t._config&&t._config.autoClose){var e=t._overlayRef.overlayElement.getBoundingClientRect(),n=t._viewportRuler.getViewportSize(),r=n.width,i=n.height;Ni(e,[{width:r,height:i,bottom:i,right:r,top:0,left:0}])&&(t.disable(),t._ngZone.run(function(){return t._overlayRef.detach()}))}}))},t.prototype.disable=function(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)},t}(),zi=function(){return function(t,e,n){var r=this;this._scrollDispatcher=t,this._viewportRuler=e,this._ngZone=n,this.noop=function(){return new Ai},this.close=function(){return new Hi(r._scrollDispatcher,r._ngZone)},this.block=function(){return new Fi(r._viewportRuler)},this.reposition=function(t){return new Bi(r._scrollDispatcher,r._viewportRuler,r._ngZone,t)}}}(),Wi=function(){function t(t,e,n,r,i){this._portalOutlet=t,this._pane=e,this._config=n,this._ngZone=r,this._keyboardDispatcher=i,this._backdropElement=null,this._backdropClick=new Br.a,this._attachments=new Br.a,this._detachments=new Br.a,this._keydownEvents=new Br.a,n.scrollStrategy&&n.scrollStrategy.attach(this)}return Object.defineProperty(t.prototype,"overlayElement",{get:function(){return this._pane},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this,n=this._portalOutlet.attach(t);return this._config.positionStrategy&&this._config.positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._config.scrollStrategy&&this._config.scrollStrategy.enable(),this._ngZone.onStable.asObservable().pipe(Object(Di.a)(1)).subscribe(function(){e.updatePosition()}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&(Array.isArray(this._config.panelClass)?this._config.panelClass.forEach(function(t){return e._pane.classList.add(t)}):this._pane.classList.add(this._config.panelClass)),this._attachments.next(),this._keyboardDispatcher.add(this),n},t.prototype.detach=function(){if(this.hasAttached()){this.detachBackdrop(),this._togglePointerEvents(!1),this._config.positionStrategy&&this._config.positionStrategy.detach&&this._config.positionStrategy.detach(),this._config.scrollStrategy&&this._config.scrollStrategy.disable();var t=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),t}},t.prototype.dispose=function(){var t=this.hasAttached();this._config.positionStrategy&&this._config.positionStrategy.dispose(),this._config.scrollStrategy&&this._config.scrollStrategy.disable(),this.detachBackdrop(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),t&&this._detachments.next(),this._detachments.complete()},t.prototype.hasAttached=function(){return this._portalOutlet.hasAttached()},t.prototype.backdropClick=function(){return this._backdropClick.asObservable()},t.prototype.attachments=function(){return this._attachments.asObservable()},t.prototype.detachments=function(){return this._detachments.asObservable()},t.prototype.keydownEvents=function(){return this._keydownEvents.asObservable()},t.prototype.getConfig=function(){return this._config},t.prototype.updatePosition=function(){this._config.positionStrategy&&this._config.positionStrategy.apply()},t.prototype.updateSize=function(t){this._config=Object(o.__assign)({},this._config,t),this._updateElementSize()},t.prototype.setDirection=function(t){this._config=Object(o.__assign)({},this._config,{direction:t}),this._updateElementDirection()},t.prototype._updateElementDirection=function(){this._pane.setAttribute("dir",this._config.direction)},t.prototype._updateElementSize=function(){(this._config.width||0===this._config.width)&&(this._pane.style.width=Ui(this._config.width)),(this._config.height||0===this._config.height)&&(this._pane.style.height=Ui(this._config.height)),(this._config.minWidth||0===this._config.minWidth)&&(this._pane.style.minWidth=Ui(this._config.minWidth)),(this._config.minHeight||0===this._config.minHeight)&&(this._pane.style.minHeight=Ui(this._config.minHeight)),(this._config.maxWidth||0===this._config.maxWidth)&&(this._pane.style.maxWidth=Ui(this._config.maxWidth)),(this._config.maxHeight||0===this._config.maxHeight)&&(this._pane.style.maxHeight=Ui(this._config.maxHeight))},t.prototype._togglePointerEvents=function(t){this._pane.style.pointerEvents=t?"auto":"none"},t.prototype._attachBackdrop=function(){var t=this;this._backdropElement=document.createElement("div"),this._backdropElement.classList.add("cdk-overlay-backdrop"),this._config.backdropClass&&this._backdropElement.classList.add(this._config.backdropClass),this._pane.parentElement.insertBefore(this._backdropElement,this._pane),this._backdropElement.addEventListener("click",function(){return t._backdropClick.next(null)}),this._ngZone.runOutsideAngular(function(){requestAnimationFrame(function(){t._backdropElement&&t._backdropElement.classList.add("cdk-overlay-backdrop-showing")})})},t.prototype._updateStackingOrder=function(){this._pane.nextSibling&&this._pane.parentNode.appendChild(this._pane)},t.prototype.detachBackdrop=function(){var t=this,e=this._backdropElement;if(e){var n=function(){e&&e.parentNode&&e.parentNode.removeChild(e),t._backdropElement==e&&(t._backdropElement=null)};e.classList.remove("cdk-overlay-backdrop-showing"),this._config.backdropClass&&e.classList.remove(this._config.backdropClass),e.addEventListener("transitionend",n),e.style.pointerEvents="none",this._ngZone.runOutsideAngular(function(){setTimeout(n,500)})}},t}();function Ui(t){return"string"==typeof t?t:t+"px"}var Gi=function(){function t(t,e,n,r,i){this._connectedTo=n,this._viewportRuler=r,this._document=i,this._dir="ltr",this._offsetX=0,this._offsetY=0,this.scrollables=[],this._resizeSubscription=Sr.a.EMPTY,this._preferredPositions=[],this._applied=!1,this._positionLocked=!1,this._onPositionChange=new Br.a,this._origin=this._connectedTo.nativeElement,this.withFallbackPosition(t,e)}return Object.defineProperty(t.prototype,"_isRtl",{get:function(){return"rtl"===this._dir},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"onPositionChange",{get:function(){return this._onPositionChange.asObservable()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"positions",{get:function(){return this._preferredPositions},enumerable:!0,configurable:!0}),t.prototype.attach=function(t){var e=this;this._overlayRef=t,this._pane=t.overlayElement,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(function(){return e.apply()})},t.prototype.dispose=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},t.prototype.detach=function(){this._applied=!1,this._resizeSubscription.unsubscribe()},t.prototype.apply=function(){if(this._applied&&this._positionLocked&&this._lastConnectedPosition)this.recalculateLastPosition();else{this._applied=!0;for(var t,e,n=this._pane,r=this._origin.getBoundingClientRect(),i=n.getBoundingClientRect(),o=this._viewportRuler.getViewportSize(),s=0,l=this._preferredPositions;s-1&&this._attachedOverlays.splice(e,1),0===this._attachedOverlays.length&&this._unsubscribeFromKeydownEvents()},t.prototype._subscribeToKeydownEvents=function(){var t=this,e=ai(this._document.body,"keydown");this._keydownEventSubscription=e.pipe(_r(function(){return!!t._attachedOverlays.length})).subscribe(function(e){t._selectOverlayFromEvent(e)._keydownEvents.next(e)})},t.prototype._unsubscribeFromKeydownEvents=function(){this._keydownEventSubscription&&(this._keydownEventSubscription.unsubscribe(),this._keydownEventSubscription=null)},t.prototype._selectOverlayFromEvent=function(t){return this._attachedOverlays.find(function(e){return e.overlayElement===t.target||e.overlayElement.contains(t.target)})||this._attachedOverlays[this._attachedOverlays.length-1]},t}();function Ki(t,e){return t||new Qi(e)}var Xi=function(){function t(t){this._document=t}return t.prototype.ngOnDestroy=function(){this._containerElement&&this._containerElement.parentNode&&this._containerElement.parentNode.removeChild(this._containerElement)},t.prototype.getContainerElement=function(){return this._containerElement||this._createContainer(),this._containerElement},t.prototype._createContainer=function(){var t=this._document.createElement("div");t.classList.add("cdk-overlay-container"),this._document.body.appendChild(t),this._containerElement=t},t}();function Zi(t,e){return t||new Xi(e)}var $i=0,to=new ji,eo=function(){function t(t,e,n,r,i,o,s,l,a){this.scrollStrategies=t,this._overlayContainer=e,this._componentFactoryResolver=n,this._positionBuilder=r,this._keyboardDispatcher=i,this._appRef=o,this._injector=s,this._ngZone=l,this._document=a}return t.prototype.create=function(t){void 0===t&&(t=to);var e=this._createPaneElement(),n=this._createPortalOutlet(e);return new Wi(n,e,t,this._ngZone,this._keyboardDispatcher)},t.prototype.position=function(){return this._positionBuilder},t.prototype._createPaneElement=function(){var t=this._document.createElement("div");return t.id="cdk-overlay-"+$i++,t.classList.add("cdk-overlay-pane"),this._overlayContainer.getContainerElement().appendChild(t),t},t.prototype._createPortalOutlet=function(t){return new Ci(t,this._componentFactoryResolver,this._appRef,this._injector)},t}(),no=[new Ii({originX:"start",originY:"bottom"},{overlayX:"start",overlayY:"top"}),new Ii({originX:"start",originY:"top"},{overlayX:"start",overlayY:"bottom"}),new Ii({originX:"end",originY:"top"},{overlayX:"end",overlayY:"bottom"}),new Ii({originX:"end",originY:"bottom"},{overlayX:"end",overlayY:"top"})],ro=new r.r("cdk-connected-overlay-scroll-strategy");function io(t){return function(){return t.scrollStrategies.reposition()}}var oo=function(t){this.elementRef=t},so=function(){function t(t,e,n,i,o){this._overlay=t,this._scrollStrategy=i,this._dir=o,this._hasBackdrop=!1,this._backdropSubscription=Sr.a.EMPTY,this._positionSubscription=Sr.a.EMPTY,this._offsetX=0,this._offsetY=0,this.scrollStrategy=this._scrollStrategy(),this.open=!1,this.backdropClick=new r.o,this.positionChange=new r.o,this.attach=new r.o,this.detach=new r.o,this._templatePortal=new xi(e,n)}return Object.defineProperty(t.prototype,"offsetX",{get:function(){return this._offsetX},set:function(t){this._offsetX=t,this._position&&this._position.withOffsetX(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"offsetY",{get:function(){return this._offsetY},set:function(t){this._offsetY=t,this._position&&this._position.withOffsetY(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hasBackdrop",{get:function(){return this._hasBackdrop},set:function(t){this._hasBackdrop=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOrigin",{get:function(){return this.origin},set:function(t){this.origin=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedPositions",{get:function(){return this.positions},set:function(t){this.positions=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetX",{get:function(){return this.offsetX},set:function(t){this.offsetX=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOffsetY",{get:function(){return this.offsetY},set:function(t){this.offsetY=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedWidth",{get:function(){return this.width},set:function(t){this.width=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHeight",{get:function(){return this.height},set:function(t){this.height=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinWidth",{get:function(){return this.minWidth},set:function(t){this.minWidth=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedMinHeight",{get:function(){return this.minHeight},set:function(t){this.minHeight=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedBackdropClass",{get:function(){return this.backdropClass},set:function(t){this.backdropClass=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedScrollStrategy",{get:function(){return this.scrollStrategy},set:function(t){this.scrollStrategy=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedOpen",{get:function(){return this.open},set:function(t){this.open=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_deprecatedHasBackdrop",{get:function(){return this.hasBackdrop},set:function(t){this.hasBackdrop=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlayRef",{get:function(){return this._overlayRef},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir?this._dir.value:"ltr"},enumerable:!0,configurable:!0}),t.prototype.ngOnDestroy=function(){this._destroyOverlay()},t.prototype.ngOnChanges=function(t){(t.open||t._deprecatedOpen)&&(this.open?this._attachOverlay():this._detachOverlay())},t.prototype._createOverlay=function(){this.positions&&this.positions.length||(this.positions=no),this._overlayRef=this._overlay.create(this._buildConfig())},t.prototype._buildConfig=function(){var t=this._position=this._createPositionStrategy(),e=new ji({positionStrategy:t,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop});return(this.width||0===this.width)&&(e.width=this.width),(this.height||0===this.height)&&(e.height=this.height),(this.minWidth||0===this.minWidth)&&(e.minWidth=this.minWidth),(this.minHeight||0===this.minHeight)&&(e.minHeight=this.minHeight),this.backdropClass&&(e.backdropClass=this.backdropClass),e},t.prototype._createPositionStrategy=function(){var t=this.positions[0],e={originX:t.originX,originY:t.originY},n={overlayX:t.overlayX,overlayY:t.overlayY},r=this._overlay.position().connectedTo(this.origin.elementRef,e,n).withOffsetX(this.offsetX).withOffsetY(this.offsetY);return this._handlePositionChanges(r),r},t.prototype._handlePositionChanges=function(t){for(var e=this,n=1;n=0},t.prototype.isFocusable=function(t){return function(t){return!function(t){return function(t){return"input"==t.nodeName.toLowerCase()}(t)&&"hidden"==t.type}(t)&&(function(t){var e=t.nodeName.toLowerCase();return"input"===e||"select"===e||"button"===e||"textarea"===e}(t)||function(t){return function(t){return"a"==t.nodeName.toLowerCase()}(t)&&t.hasAttribute("href")}(t)||t.hasAttribute("contenteditable")||fo(t))}(t)&&!this.isDisabled(t)&&this.isVisible(t)},t}();function fo(t){if(!t.hasAttribute("tabindex")||void 0===t.tabIndex)return!1;var e=t.getAttribute("tabindex");return"-32768"!=e&&!(!e||isNaN(parseInt(e,10)))}function _o(t){if(!fo(t))return null;var e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}var mo=function(){function t(t,e,n,r,i){void 0===i&&(i=!1),this._element=t,this._checker=e,this._ngZone=n,this._document=r,this._enabled=!0,i||this.attachAnchors()}return Object.defineProperty(t.prototype,"enabled",{get:function(){return this._enabled},set:function(t){this._enabled=t,this._startAnchor&&this._endAnchor&&(this._startAnchor.tabIndex=this._endAnchor.tabIndex=this._enabled?0:-1)},enumerable:!0,configurable:!0}),t.prototype.destroy=function(){this._startAnchor&&this._startAnchor.parentNode&&this._startAnchor.parentNode.removeChild(this._startAnchor),this._endAnchor&&this._endAnchor.parentNode&&this._endAnchor.parentNode.removeChild(this._endAnchor),this._startAnchor=this._endAnchor=null},t.prototype.attachAnchors=function(){var t=this;this._startAnchor||(this._startAnchor=this._createAnchor()),this._endAnchor||(this._endAnchor=this._createAnchor()),this._ngZone.runOutsideAngular(function(){t._startAnchor.addEventListener("focus",function(){t.focusLastTabbableElement()}),t._endAnchor.addEventListener("focus",function(){t.focusFirstTabbableElement()}),t._element.parentNode&&(t._element.parentNode.insertBefore(t._startAnchor,t._element),t._element.parentNode.insertBefore(t._endAnchor,t._element.nextSibling))})},t.prototype.focusInitialElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusInitialElement())})})},t.prototype.focusFirstTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusFirstTabbableElement())})})},t.prototype.focusLastTabbableElementWhenReady=function(){var t=this;return new Promise(function(e){t._executeOnStable(function(){return e(t.focusLastTabbableElement())})})},t.prototype._getRegionBoundary=function(t){for(var e=this._element.querySelectorAll("[cdk-focus-region-"+t+"], [cdkFocusRegion"+t+"], [cdk-focus-"+t+"]"),n=0;n=0;n--){var r=1===e[n].nodeType?this._getLastTabbableElement(e[n]):null;if(r)return r}return null},t.prototype._createAnchor=function(){var t=this._document.createElement("div");return t.tabIndex=this._enabled?0:-1,t.classList.add("cdk-visually-hidden"),t.classList.add("cdk-focus-trap-anchor"),t},t.prototype._executeOnStable=function(t){this._ngZone.isStable?t():this._ngZone.onStable.asObservable().pipe(Object(Di.a)(1)).subscribe(t)},t}(),go=function(){function t(t,e,n){this._checker=t,this._ngZone=e,this._document=n}return t.prototype.create=function(t,e){return void 0===e&&(e=!1),new mo(t,this._checker,this._ngZone,this._document,e)},t}(),yo=function(){function t(t){this._items=t,this._activeItemIndex=-1,this._wrap=!1,this._letterKeyStream=new Br.a,this._typeaheadSubscription=Sr.a.EMPTY,this._pressedLetters=[],this.tabOut=new Br.a,this.change=new Br.a}return t.prototype.withWrap=function(){return this._wrap=!0,this},t.prototype.withTypeAhead=function(t){var e=this;if(void 0===t&&(t=200),this._items.length&&this._items.some(function(t){return"function"!=typeof t.getLabel}))throw Error("ListKeyManager items in typeahead mode must implement the `getLabel` method.");return this._typeaheadSubscription.unsubscribe(),this._typeaheadSubscription=this._letterKeyStream.pipe(dr(function(t){return e._pressedLetters.push(t)}),ao(t),_r(function(){return e._pressedLetters.length>0}),Object(er.a)(function(){return e._pressedLetters.join("")})).subscribe(function(t){for(var n=e._items.toArray(),r=1;r=65&&e<=90||e>=48&&e<=91)&&this._letterKeyStream.next(String.fromCharCode(e)))}this._pressedLetters=[],t.preventDefault()},Object.defineProperty(t.prototype,"activeItemIndex",{get:function(){return this._activeItemIndex},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeItem",{get:function(){return this._activeItem},enumerable:!0,configurable:!0}),t.prototype.setFirstItemActive=function(){this._setActiveItemByIndex(0,1)},t.prototype.setLastItemActive=function(){this._setActiveItemByIndex(this._items.length-1,-1)},t.prototype.setNextItemActive=function(){this._activeItemIndex<0?this.setFirstItemActive():this._setActiveItemByDelta(1)},t.prototype.setPreviousItemActive=function(){this._activeItemIndex<0&&this._wrap?this.setLastItemActive():this._setActiveItemByDelta(-1)},t.prototype.updateActiveItemIndex=function(t){this._activeItemIndex=t},t.prototype._setActiveItemByDelta=function(t,e){void 0===e&&(e=this._items.toArray()),this._wrap?this._setActiveInWrapMode(t,e):this._setActiveInDefaultMode(t,e)},t.prototype._setActiveInWrapMode=function(t,e){this._activeItemIndex=(this._activeItemIndex+t+e.length)%e.length,e[this._activeItemIndex].disabled?this._setActiveInWrapMode(t,e):this.setActiveItem(this._activeItemIndex)},t.prototype._setActiveInDefaultMode=function(t,e){this._setActiveItemByIndex(this._activeItemIndex+t,t,e)},t.prototype._setActiveItemByIndex=function(t,e,n){if(void 0===n&&(n=this._items.toArray()),n[t]){for(;n[t].disabled;)if(!n[t+=e])return;this.setActiveItem(t)}},t}(),vo=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.setActiveItem=function(e){this.activeItem&&this.activeItem.setInactiveStyles(),t.prototype.setActiveItem.call(this,e),this.activeItem&&this.activeItem.setActiveStyles()},e}(yo);function bo(t,e){return(t.getAttribute(e)||"").match(/\S+/g)||[]}var wo=0,Mo=new Map,ko=null,xo=function(){function t(t){this._document=t}return t.prototype.describe=function(t,e){e.trim()&&(Mo.has(e)||this._createMessageElement(e),this._isElementDescribedByMessage(t,e)||this._addMessageReference(t,e))},t.prototype.removeDescription=function(t,e){if(e.trim()){this._isElementDescribedByMessage(t,e)&&this._removeMessageReference(t,e);var n=Mo.get(e);n&&0===n.referenceCount&&this._deleteMessageElement(e),ko&&0===ko.childNodes.length&&this._deleteMessagesContainer()}},t.prototype.ngOnDestroy=function(){for(var t=this._document.querySelectorAll("[cdk-describedby-host]"),e=0;egs?gs:i:i}()),this.arr=t,this.idx=e,this.len=n}return t.prototype[jr.a]=function(){return this},t.prototype.next=function(){return this.idx=t.length?r.complete():(r.next(e[n]),t.index=n+1,this.schedule(t)))},e.prototype._subscribe=function(t){var n=this.arrayLike,r=this.scheduler,i=n.length;if(r)return r.schedule(e.dispatch,0,{arrayLike:n,index:0,length:i,subscriber:t});for(var o=0;o1?new Ar.a(t,n):new ir.a(n),e)}}var xs=function(){},Ls="*";function Cs(t,e){return void 0===e&&(e=null),{type:2,steps:t,options:e}}function Ss(t){return{type:6,styles:t,offset:null}}function Ts(t){Promise.resolve(null).then(t)}var Os=function(){function t(){this._onDoneFns=[],this._onStartFns=[],this._onDestroyFns=[],this._started=!1,this._destroyed=!1,this._finished=!1,this.parentPlayer=null,this.totalTime=0}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.init=function(){},t.prototype.play=function(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0},t.prototype.triggerMicrotask=function(){var t=this;Ts(function(){return t._onFinish()})},t.prototype._onStart=function(){this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[]},t.prototype.pause=function(){},t.prototype.restart=function(){},t.prototype.finish=function(){this._onFinish()},t.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){},t.prototype.setPosition=function(t){},t.prototype.getPosition=function(){return 0},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Ds=function(){function t(t){var e=this;this._onDoneFns=[],this._onStartFns=[],this._finished=!1,this._started=!1,this._destroyed=!1,this._onDestroyFns=[],this.parentPlayer=null,this.totalTime=0,this.players=t;var n=0,r=0,i=0,o=this.players.length;0==o?Ts(function(){return e._onFinish()}):this.players.forEach(function(t){t.onDone(function(){++n==o&&e._onFinish()}),t.onDestroy(function(){++r==o&&e._onDestroy()}),t.onStart(function(){++i==o&&e._onStart()})}),this.totalTime=this.players.reduce(function(t,e){return Math.max(t,e.totalTime)},0)}return t.prototype._onFinish=function(){this._finished||(this._finished=!0,this._onDoneFns.forEach(function(t){return t()}),this._onDoneFns=[])},t.prototype.init=function(){this.players.forEach(function(t){return t.init()})},t.prototype.onStart=function(t){this._onStartFns.push(t)},t.prototype._onStart=function(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(function(t){return t()}),this._onStartFns=[])},t.prototype.onDone=function(t){this._onDoneFns.push(t)},t.prototype.onDestroy=function(t){this._onDestroyFns.push(t)},t.prototype.hasStarted=function(){return this._started},t.prototype.play=function(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(function(t){return t.play()})},t.prototype.pause=function(){this.players.forEach(function(t){return t.pause()})},t.prototype.restart=function(){this.players.forEach(function(t){return t.restart()})},t.prototype.finish=function(){this._onFinish(),this.players.forEach(function(t){return t.finish()})},t.prototype.destroy=function(){this._onDestroy()},t.prototype._onDestroy=function(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(function(t){return t.destroy()}),this._onDestroyFns.forEach(function(t){return t()}),this._onDestroyFns=[])},t.prototype.reset=function(){this.players.forEach(function(t){return t.reset()}),this._destroyed=!1,this._finished=!1,this._started=!1},t.prototype.setPosition=function(t){var e=t*this.totalTime;this.players.forEach(function(t){var n=t.totalTime?Math.min(1,e/t.totalTime):1;t.setPosition(n)})},t.prototype.getPosition=function(){var t=0;return this.players.forEach(function(e){var n=e.getPosition();t=Math.min(n,t)}),t},t.prototype.beforeDestroy=function(){this.players.forEach(function(t){t.beforeDestroy&&t.beforeDestroy()})},t.prototype.triggerCallback=function(t){var e="start"==t?this._onStartFns:this._onDoneFns;e.forEach(function(t){return t()}),e.length=0},t}(),Ys="!",Ps=function(){this.role="dialog",this.panelClass="",this.hasBackdrop=!0,this.backdropClass="",this.disableClose=!1,this.width="",this.height="",this.maxWidth="80vw",this.data=null,this.direction="ltr",this.ariaDescribedBy=null,this.ariaLabel=null,this.autoFocus=!0};function Es(){throw Error("Attempting to attach dialog content after content is already attached")}var As=function(t){function e(e,n,i,o){var s=t.call(this)||this;return s._elementRef=e,s._focusTrapFactory=n,s._changeDetectorRef=i,s._document=o,s._elementFocusedBeforeDialogWasOpened=null,s._state="enter",s._animationStateChanged=new r.o,s._ariaLabelledBy=null,s}return Object(o.__extends)(e,t),e.prototype.attachComponentPortal=function(t){return this._portalOutlet.hasAttached()&&Es(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachComponentPortal(t)},e.prototype.attachTemplatePortal=function(t){return this._portalOutlet.hasAttached()&&Es(),this._savePreviouslyFocusedElement(),this._portalOutlet.attachTemplatePortal(t)},e.prototype._trapFocus=function(){this._focusTrap||(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement)),this._config.autoFocus&&this._focusTrap.focusInitialElementWhenReady()},e.prototype._restoreFocus=function(){var t=this._elementFocusedBeforeDialogWasOpened;t&&"function"==typeof t.focus&&t.focus(),this._focusTrap&&this._focusTrap.destroy()},e.prototype._savePreviouslyFocusedElement=function(){var t=this;this._document&&(this._elementFocusedBeforeDialogWasOpened=this._document.activeElement,Promise.resolve().then(function(){return t._elementRef.nativeElement.focus()}))},e.prototype._onAnimationDone=function(t){"enter"===t.toState?this._trapFocus():"exit"===t.toState&&this._restoreFocus(),this._animationStateChanged.emit(t)},e.prototype._onAnimationStart=function(t){this._animationStateChanged.emit(t)},e.prototype._startExitAnimation=function(){this._state="exit",this._changeDetectorRef.markForCheck()},e}(Li),js=0,Is=function(){function t(t,e,n){void 0===n&&(n="mat-dialog-"+js++);var r=this;this._overlayRef=t,this._containerInstance=e,this.id=n,this.disableClose=this._containerInstance._config.disableClose,this._afterOpen=new Br.a,this._afterClosed=new Br.a,this._beforeClose=new Br.a,e._animationStateChanged.pipe(_r(function(t){return"done"===t.phaseName&&"enter"===t.toState}),Object(Di.a)(1)).subscribe(function(){r._afterOpen.next(),r._afterOpen.complete()}),e._animationStateChanged.pipe(_r(function(t){return"done"===t.phaseName&&"exit"===t.toState}),Object(Di.a)(1)).subscribe(function(){r._overlayRef.dispose(),r._afterClosed.next(r._result),r._afterClosed.complete(),r.componentInstance=null})}return t.prototype.close=function(t){var e=this;this._result=t,this._containerInstance._animationStateChanged.pipe(_r(function(t){return"start"===t.phaseName}),Object(Di.a)(1)).subscribe(function(){e._beforeClose.next(t),e._beforeClose.complete(),e._overlayRef.detachBackdrop()}),this._containerInstance._startExitAnimation()},t.prototype.afterOpen=function(){return this._afterOpen.asObservable()},t.prototype.afterClosed=function(){return this._afterClosed.asObservable()},t.prototype.beforeClose=function(){return this._beforeClose.asObservable()},t.prototype.backdropClick=function(){return this._overlayRef.backdropClick()},t.prototype.keydownEvents=function(){return this._overlayRef.keydownEvents()},t.prototype.updatePosition=function(t){var e=this._getPositionStrategy();return t&&(t.left||t.right)?t.left?e.left(t.left):e.right(t.right):e.centerHorizontally(),t&&(t.top||t.bottom)?t.top?e.top(t.top):e.bottom(t.bottom):e.centerVertically(),this._overlayRef.updatePosition(),this},t.prototype.updateSize=function(t,e){return void 0===t&&(t="auto"),void 0===e&&(e="auto"),this._getPositionStrategy().width(t).height(e),this._overlayRef.updatePosition(),this},t.prototype._getPositionStrategy=function(){return this._overlayRef.getConfig().positionStrategy},t}(),Rs=new r.r("MatDialogData"),Hs=new r.r("mat-dialog-scroll-strategy");function Fs(t){return function(){return t.scrollStrategies.block()}}var Ns=function(){function t(t,e,n,r,i,o){var s=this;this._overlay=t,this._injector=e,this._scrollStrategy=r,this._parentDialog=i,this._overlayContainer=o,this._openDialogsAtThisLevel=[],this._afterAllClosedAtThisLevel=new Br.a,this._afterOpenAtThisLevel=new Br.a,this._ariaHiddenElements=new Map,this.afterAllClosed=ss(function(){return s.openDialogs.length?s._afterAllClosed:s._afterAllClosed.pipe(ks(void 0))}),!i&&n&&n.subscribe(function(){return s.closeAll()})}return Object.defineProperty(t.prototype,"openDialogs",{get:function(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"afterOpen",{get:function(){return this._parentDialog?this._parentDialog.afterOpen:this._afterOpenAtThisLevel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_afterAllClosed",{get:function(){var t=this._parentDialog;return t?t._afterAllClosed:this._afterAllClosedAtThisLevel},enumerable:!0,configurable:!0}),t.prototype.open=function(t,e){var n=this;if((e=function(t){return Object(o.__assign)({},new Ps,t)}(e)).id&&this.getDialogById(e.id))throw Error('Dialog with id "'+e.id+'" exists already. The dialog id must be unique.');var r=this._createOverlay(e),i=this._attachDialogContainer(r,e),s=this._attachDialogContent(t,i,r,e);return this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(s),s.afterClosed().subscribe(function(){return n._removeOpenDialog(s)}),this.afterOpen.next(s),s},t.prototype.closeAll=function(){for(var t=this.openDialogs.length;t--;)this.openDialogs[t].close()},t.prototype.getDialogById=function(t){return this.openDialogs.find(function(e){return e.id===t})},t.prototype._createOverlay=function(t){var e=this._getOverlayConfig(t);return this._overlay.create(e)},t.prototype._getOverlayConfig=function(t){var e=new ji({positionStrategy:this._overlay.position().global(),scrollStrategy:this._scrollStrategy(),panelClass:t.panelClass,hasBackdrop:t.hasBackdrop,direction:t.direction,minWidth:t.minWidth,minHeight:t.minHeight,maxWidth:t.maxWidth,maxHeight:t.maxHeight});return t.backdropClass&&(e.backdropClass=t.backdropClass),e},t.prototype._attachDialogContainer=function(t,e){var n=new ki(As,e.viewContainerRef),r=t.attach(n);return r.instance._config=e,r.instance},t.prototype._attachDialogContent=function(t,e,n,i){var o=new Is(n,e,i.id);if(i.hasBackdrop&&n.backdropClick().subscribe(function(){o.disableClose||o.close()}),n.keydownEvents().pipe(_r(function(t){return 27===t.keyCode&&!o.disableClose})).subscribe(function(){return o.close()}),t instanceof r.O)e.attachTemplatePortal(new xi(t,null,{$implicit:i.data,dialogRef:o}));else{var s=this._createInjector(i,o,e),l=e.attachComponentPortal(new ki(t,void 0,s));o.componentInstance=l.instance}return o.updateSize(i.width,i.height).updatePosition(i.position),o},t.prototype._createInjector=function(t,e,n){var r=t&&t.viewContainerRef&&t.viewContainerRef.injector,i=new WeakMap;return i.set(Is,e),i.set(As,n),i.set(Rs,t.data),i.set(vi,{value:t.direction,change:Object(ur.a)()}),new Oi(r||this._injector,i)},t.prototype._removeOpenDialog=function(t){var e=this.openDialogs.indexOf(t);e>-1&&(this.openDialogs.splice(e,1),this.openDialogs.length||(this._ariaHiddenElements.forEach(function(t,e){t?e.setAttribute("aria-hidden",t):e.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),this._afterAllClosed.next()))},t.prototype._hideNonDialogContentFromAssistiveTechnology=function(){var t=this._overlayContainer.getContainerElement();if(t.parentElement)for(var e=t.parentElement.children,n=e.length-1;n>-1;n--){var r=e[n];r===t||"SCRIPT"===r.nodeName||"STYLE"===r.nodeName||r.hasAttribute("aria-live")||(this._ariaHiddenElements.set(r,r.getAttribute("aria-hidden")),r.setAttribute("aria-hidden","true"))}},t}(),Vs=function(){},Bs=function(){},zs=cs.create,Ws=function(){function t(){}return Object.defineProperty(t.prototype,"value",{get:function(){return this.control?this.control.value:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return this.control?this.control.valid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return this.control?this.control.invalid:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return this.control?this.control.pending:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return this.control?this.control.disabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return this.control?this.control.enabled:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"errors",{get:function(){return this.control?this.control.errors:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pristine",{get:function(){return this.control?this.control.pristine:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return this.control?this.control.dirty:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"touched",{get:function(){return this.control?this.control.touched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"status",{get:function(){return this.control?this.control.status:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return this.control?this.control.untouched:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"statusChanges",{get:function(){return this.control?this.control.statusChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valueChanges",{get:function(){return this.control?this.control.valueChanges:null},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),t.prototype.reset=function(t){void 0===t&&(t=void 0),this.control&&this.control.reset(t)},t.prototype.hasError=function(t,e){return!!this.control&&this.control.hasError(t,e)},t.prototype.getError=function(t,e){return this.control?this.control.getError(t,e):null},t}(),Us=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"formDirective",{get:function(){return null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return null},enumerable:!0,configurable:!0}),e}(Ws);function Gs(t){return null==t||0===t.length}var Js=new r.r("NgValidators"),qs=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Qs=function(){function t(){}return t.min=function(t){return function(e){if(Gs(e.value)||Gs(t))return null;var n=parseFloat(e.value);return!isNaN(n)&&nt?{max:{max:t,actual:e.value}}:null}},t.required=function(t){return Gs(t.value)?{required:!0}:null},t.requiredTrue=function(t){return!0===t.value?null:{required:!0}},t.email=function(t){return qs.test(t.value)?null:{email:!0}},t.minLength=function(t){return function(e){if(Gs(e.value))return null;var n=e.value?e.value.length:0;return nt?{maxlength:{requiredLength:t,actualLength:n}}:null}},t.pattern=function(e){return e?("string"==typeof e?(r="^"+e+"$",n=new RegExp(r)):(r=e.toString(),n=e),function(t){if(Gs(t.value))return null;var e=t.value;return n.test(e)?null:{pattern:{requiredPattern:r,actualValue:e}}}):t.nullValidator;var n,r},t.nullValidator=function(t){return null},t.compose=function(t){if(!t)return null;var e=t.filter(Ks);return 0==e.length?null:function(t){return Zs(function(t,n){return e.map(function(e){return e(t)})}(t))}},t.composeAsync=function(t){if(!t)return null;var e=t.filter(Ks);return 0==e.length?null:function(t){var n=function(t,n){return e.map(function(e){return e(t)})}(t).map(Xs);return nr.call(ar(n),Zs)}},t}();function Ks(t){return null!=t}function Xs(t){var e=Object(r._15)(t)?zs(t):t;if(!Object(r._14)(e))throw new Error("Expected validator to return Promise or Observable.");return e}function Zs(t){var e=t.reduce(function(t,e){return null!=e?Object(o.__assign)({},t,e):t},{});return 0===Object.keys(e).length?null:e}var $s=new r.r("NgValueAccessor"),tl=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"checked",t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}(),el=new r.r("CompositionEventMode"),nl=function(){function t(t,e,n){var r;this._renderer=t,this._elementRef=e,this._compositionMode=n,this.onChange=function(t){},this.onTouched=function(){},this._composing=!1,null==this._compositionMode&&(this._compositionMode=(r=At()?At().getUserAgent():"",!/android (\d+)/.test(r.toLowerCase())))}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=t},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._handleInput=function(t){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(t)},t.prototype._compositionStart=function(){this._composing=!0},t.prototype._compositionEnd=function(t){this._composing=!1,this._compositionMode&&this.onChange(t)},t}();function rl(t){return t.validate?function(e){return t.validate(e)}:t}function il(t){return t.validate?function(e){return t.validate(e)}:t}var ol=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",null==t?"":t)},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function sl(){throw new Error("unimplemented")}var ll=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._parent=null,e.name=null,e.valueAccessor=null,e._rawValidators=[],e._rawAsyncValidators=[],e}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"validator",{get:function(){return sl()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return sl()},enumerable:!0,configurable:!0}),e}(Ws),al=function(){function t(){this._accessors=[]}return t.prototype.add=function(t,e){this._accessors.push([t,e])},t.prototype.remove=function(t){for(var e=this._accessors.length-1;e>=0;--e)if(this._accessors[e][1]===t)return void this._accessors.splice(e,1)},t.prototype.select=function(t){var e=this;this._accessors.forEach(function(n){e._isSameGroup(n,t)&&n[1]!==t&&n[1].fireUncheck(t.value)})},t.prototype._isSameGroup=function(t,e){return!!t[0].control&&t[0]._parent===e._control._parent&&t[1].name===e.name},t}(),ul=function(){function t(t,e,n,r){this._renderer=t,this._elementRef=e,this._registry=n,this._injector=r,this.onChange=function(){},this.onTouched=function(){}}return t.prototype.ngOnInit=function(){this._control=this._injector.get(ll),this._checkName(),this._registry.add(this._control,this)},t.prototype.ngOnDestroy=function(){this._registry.remove(this)},t.prototype.writeValue=function(t){this._state=t===this.value,this._renderer.setProperty(this._elementRef.nativeElement,"checked",this._state)},t.prototype.registerOnChange=function(t){var e=this;this._fn=t,this.onChange=function(){t(e.value),e._registry.select(e)}},t.prototype.fireUncheck=function(t){this.writeValue(t)},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._checkName=function(){this.name&&this.formControlName&&this.name!==this.formControlName&&this._throwNameError(),!this.name&&this.formControlName&&(this.name=this.formControlName)},t.prototype._throwNameError=function(){throw new Error('\n If you define both a name and a formControlName attribute on your radio button, their values\n must match. Ex: \n ')},t}(),cl=function(){function t(t,e){this._renderer=t,this._elementRef=e,this.onChange=function(t){},this.onTouched=function(){}}return t.prototype.writeValue=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"value",parseFloat(t))},t.prototype.registerOnChange=function(t){this.onChange=function(e){t(""==e?null:parseFloat(e))}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t}();function dl(t,e){return null==t?""+e:(e&&"object"==typeof e&&(e="Object"),(t+": "+e).slice(0,50))}var hl=function(){function t(t,e){this._renderer=t,this._elementRef=e,this._optionMap=new Map,this._idCounter=0,this.onChange=function(t){},this.onTouched=function(){},this._compareWith=r._16}return Object.defineProperty(t.prototype,"compareWith",{set:function(t){if("function"!=typeof t)throw new Error("compareWith must be a function, but received "+JSON.stringify(t));this._compareWith=t},enumerable:!0,configurable:!0}),t.prototype.writeValue=function(t){this.value=t;var e=this._getOptionId(t);null==e&&this._renderer.setProperty(this._elementRef.nativeElement,"selectedIndex",-1);var n=dl(e,t);this._renderer.setProperty(this._elementRef.nativeElement,"value",n)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){e.value=e._getOptionValue(n),t(e.value)}},t.prototype.registerOnTouched=function(t){this.onTouched=t},t.prototype.setDisabledState=function(t){this._renderer.setProperty(this._elementRef.nativeElement,"disabled",t)},t.prototype._registerOption=function(){return(this._idCounter++).toString()},t.prototype._getOptionId=function(t){for(var e=0,n=Array.from(this._optionMap.keys());e-1)}}else e=function(t,e){t._setSelected(!1)};this._optionMap.forEach(e)},t.prototype.registerOnChange=function(t){var e=this;this.onChange=function(n){var r=[];if(n.hasOwnProperty("selectedOptions"))for(var i=n.selectedOptions,o=0;o1?"path: '"+t.path.join(" -> ")+"'":t.path[0]?"name: '"+t.path+"'":"unspecified name attribute",new Error(e+" "+n)}function kl(t){return null!=t?Qs.compose(t.map(rl)):null}function xl(t){return null!=t?Qs.composeAsync(t.map(il)):null}var Ll=[tl,cl,ol,hl,_l,ul];function Cl(t,e){t._syncPendingControls(),e.forEach(function(t){var e=t.control;"submit"===e.updateOn&&e._pendingChange&&(t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1)})}function Sl(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}var Tl=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormGroup(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormGroup(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormGroup(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return gl(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return kl(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return xl(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){},e}(Us),Ol=function(){function t(t){this._cd=t}return Object.defineProperty(t.prototype,"ngClassUntouched",{get:function(){return!!this._cd.control&&this._cd.control.untouched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassTouched",{get:function(){return!!this._cd.control&&this._cd.control.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPristine",{get:function(){return!!this._cd.control&&this._cd.control.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassDirty",{get:function(){return!!this._cd.control&&this._cd.control.dirty},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassValid",{get:function(){return!!this._cd.control&&this._cd.control.valid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassInvalid",{get:function(){return!!this._cd.control&&this._cd.control.invalid},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"ngClassPending",{get:function(){return!!this._cd.control&&this._cd.control.pending},enumerable:!0,configurable:!0}),t}(),Dl=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e}(Ol),Yl=function(t){function e(e){return t.call(this,e)||this}return Object(o.__extends)(e,t),e}(Ol);function Pl(t){var e=Al(t)?t.validators:t;return Array.isArray(e)?kl(e):e||null}function El(t,e){var n=Al(e)?e.asyncValidators:t;return Array.isArray(n)?xl(n):n||null}function Al(t){return null!=t&&!Array.isArray(t)&&"object"==typeof t}var jl=function(){function t(t,e){this.validator=t,this.asyncValidator=e,this._onCollectionChange=function(){},this.pristine=!0,this.touched=!1,this._onDisabledChange=[]}return Object.defineProperty(t.prototype,"parent",{get:function(){return this._parent},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"valid",{get:function(){return"VALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"invalid",{get:function(){return"INVALID"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pending",{get:function(){return"PENDING"==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"disabled",{get:function(){return"DISABLED"===this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"enabled",{get:function(){return"DISABLED"!==this.status},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dirty",{get:function(){return!this.pristine},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"untouched",{get:function(){return!this.touched},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"updateOn",{get:function(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"},enumerable:!0,configurable:!0}),t.prototype.setValidators=function(t){this.validator=Pl(t)},t.prototype.setAsyncValidators=function(t){this.asyncValidator=El(t)},t.prototype.clearValidators=function(){this.validator=null},t.prototype.clearAsyncValidators=function(){this.asyncValidator=null},t.prototype.markAsTouched=function(t){void 0===t&&(t={}),this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)},t.prototype.markAsUntouched=function(t){void 0===t&&(t={}),this.touched=!1,this._pendingTouched=!1,this._forEachChild(function(t){t.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype.markAsDirty=function(t){void 0===t&&(t={}),this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)},t.prototype.markAsPristine=function(t){void 0===t&&(t={}),this.pristine=!0,this._pendingDirty=!1,this._forEachChild(function(t){t.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype.markAsPending=function(t){void 0===t&&(t={}),this.status="PENDING",this._parent&&!t.onlySelf&&this._parent.markAsPending(t)},t.prototype.disable=function(t){void 0===t&&(t={}),this.status="DISABLED",this.errors=null,this._forEachChild(function(t){t.disable({onlySelf:!0})}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(!!t.onlySelf),this._onDisabledChange.forEach(function(t){return t(!0)})},t.prototype.enable=function(t){void 0===t&&(t={}),this.status="VALID",this._forEachChild(function(t){t.enable({onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors(!!t.onlySelf),this._onDisabledChange.forEach(function(t){return t(!1)})},t.prototype._updateAncestors=function(t){this._parent&&!t&&(this._parent.updateValueAndValidity(),this._parent._updatePristine(),this._parent._updateTouched())},t.prototype.setParent=function(t){this._parent=t},t.prototype.updateValueAndValidity=function(t){void 0===t&&(t={}),this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),"VALID"!==this.status&&"PENDING"!==this.status||this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)},t.prototype._updateTreeValidity=function(t){void 0===t&&(t={emitEvent:!0}),this._forEachChild(function(e){return e._updateTreeValidity(t)}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})},t.prototype._setInitialStatus=function(){this.status=this._allControlsDisabled()?"DISABLED":"VALID"},t.prototype._runValidator=function(){return this.validator?this.validator(this):null},t.prototype._runAsyncValidator=function(t){var e=this;if(this.asyncValidator){this.status="PENDING";var n=Xs(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(function(n){return e.setErrors(n,{emitEvent:t})})}},t.prototype._cancelExistingSubscription=function(){this._asyncValidationSubscription&&this._asyncValidationSubscription.unsubscribe()},t.prototype.setErrors=function(t,e){void 0===e&&(e={}),this.errors=t,this._updateControlsErrors(!1!==e.emitEvent)},t.prototype.get=function(t){return function(t,e,n){return null==e?null:(e instanceof Array||(e=e.split(".")),e instanceof Array&&0===e.length?null:e.reduce(function(t,e){return t instanceof Rl?t.controls[e]||null:t instanceof Hl&&t.at(e)||null},t))}(this,t)},t.prototype.getError=function(t,e){var n=e?this.get(e):this;return n&&n.errors?n.errors[t]:null},t.prototype.hasError=function(t,e){return!!this.getError(t,e)},Object.defineProperty(t.prototype,"root",{get:function(){for(var t=this;t._parent;)t=t._parent;return t},enumerable:!0,configurable:!0}),t.prototype._updateControlsErrors=function(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)},t.prototype._initObservables=function(){this.valueChanges=new r.o,this.statusChanges=new r.o},t.prototype._calculateStatus=function(){return this._allControlsDisabled()?"DISABLED":this.errors?"INVALID":this._anyControlsHaveStatus("PENDING")?"PENDING":this._anyControlsHaveStatus("INVALID")?"INVALID":"VALID"},t.prototype._anyControlsHaveStatus=function(t){return this._anyControls(function(e){return e.status===t})},t.prototype._anyControlsDirty=function(){return this._anyControls(function(t){return t.dirty})},t.prototype._anyControlsTouched=function(){return this._anyControls(function(t){return t.touched})},t.prototype._updatePristine=function(t){void 0===t&&(t={}),this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)},t.prototype._updateTouched=function(t){void 0===t&&(t={}),this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)},t.prototype._isBoxedValue=function(t){return"object"==typeof t&&null!==t&&2===Object.keys(t).length&&"value"in t&&"disabled"in t},t.prototype._registerOnCollectionChange=function(t){this._onCollectionChange=t},t.prototype._setUpdateStrategy=function(t){Al(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)},t}(),Il=function(t){function e(e,n,r){void 0===e&&(e=null);var i=t.call(this,Pl(n),El(r,n))||this;return i._onChange=[],i._applyFormState(e),i._setUpdateStrategy(n),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i._initObservables(),i}return Object(o.__extends)(e,t),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this.value=this._pendingValue=t,this._onChange.length&&!1!==e.emitModelToViewChange&&this._onChange.forEach(function(t){return t(n.value,!1!==e.emitViewToModelChange)}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){void 0===e&&(e={}),this.setValue(t,e)},e.prototype.reset=function(t,e){void 0===t&&(t=null),void 0===e&&(e={}),this._applyFormState(t),this.markAsPristine(e),this.markAsUntouched(e),this.setValue(this.value,e),this._pendingChange=!1},e.prototype._updateValue=function(){},e.prototype._anyControls=function(t){return!1},e.prototype._allControlsDisabled=function(){return this.disabled},e.prototype.registerOnChange=function(t){this._onChange.push(t)},e.prototype._clearChangeFns=function(){this._onChange=[],this._onDisabledChange=[],this._onCollectionChange=function(){}},e.prototype.registerOnDisabledChange=function(t){this._onDisabledChange.push(t)},e.prototype._forEachChild=function(t){},e.prototype._syncPendingControls=function(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))},e.prototype._applyFormState=function(t){this._isBoxedValue(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t},e}(jl),Rl=function(t){function e(e,n,r){var i=t.call(this,Pl(n),El(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.__extends)(e,t),e.prototype.registerControl=function(t,e){return this.controls[t]?this.controls[t]:(this.controls[t]=e,e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange),e)},e.prototype.addControl=function(t,e){this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.removeControl=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),delete this.controls[t],e&&this.registerControl(t,e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.contains=function(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled},e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),Object.keys(t).forEach(function(r){n._throwIfControlMissing(r),n.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),Object.keys(t).forEach(function(r){n.controls[r]&&n.controls[r].patchValue(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t={}),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this._reduceChildren({},function(t,e,n){return t[n]=e instanceof Il?e.value:e.getRawValue(),t})},e.prototype._syncPendingControls=function(){var t=this._reduceChildren(!1,function(t,e){return!!e._syncPendingControls()||t});return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!Object.keys(this.controls).length)throw new Error("\n There are no form controls registered with this group yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.controls[t])throw new Error("Cannot find form control with name: "+t+".")},e.prototype._forEachChild=function(t){var e=this;Object.keys(this.controls).forEach(function(n){return t(e.controls[n],n)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){e.setParent(t),e._registerOnCollectionChange(t._onCollectionChange)})},e.prototype._updateValue=function(){this.value=this._reduceValue()},e.prototype._anyControls=function(t){var e=this,n=!1;return this._forEachChild(function(r,i){n=n||e.contains(i)&&t(r)}),n},e.prototype._reduceValue=function(){var t=this;return this._reduceChildren({},function(e,n,r){return(n.enabled||t.disabled)&&(e[r]=n.value),e})},e.prototype._reduceChildren=function(t,e){var n=t;return this._forEachChild(function(t,r){n=e(n,t,r)}),n},e.prototype._allControlsDisabled=function(){for(var t=0,e=Object.keys(this.controls);t0||this.disabled},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control with name: '"+n+"'.")})},e}(jl),Hl=function(t){function e(e,n,r){var i=t.call(this,Pl(n),El(r,n))||this;return i.controls=e,i._initObservables(),i._setUpdateStrategy(n),i._setUpControls(),i.updateValueAndValidity({onlySelf:!0,emitEvent:!1}),i}return Object(o.__extends)(e,t),e.prototype.at=function(t){return this.controls[t]},e.prototype.push=function(t){this.controls.push(t),this._registerControl(t),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.insert=function(t,e){this.controls.splice(t,0,e),this._registerControl(e),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.removeAt=function(t){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),this.updateValueAndValidity(),this._onCollectionChange()},e.prototype.setControl=function(t,e){this.controls[t]&&this.controls[t]._registerOnCollectionChange(function(){}),this.controls.splice(t,1),e&&(this.controls.splice(t,0,e),this._registerControl(e)),this.updateValueAndValidity(),this._onCollectionChange()},Object.defineProperty(e.prototype,"length",{get:function(){return this.controls.length},enumerable:!0,configurable:!0}),e.prototype.setValue=function(t,e){var n=this;void 0===e&&(e={}),this._checkAllValuesPresent(t),t.forEach(function(t,r){n._throwIfControlMissing(r),n.at(r).setValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.patchValue=function(t,e){var n=this;void 0===e&&(e={}),t.forEach(function(t,r){n.at(r)&&n.at(r).patchValue(t,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)},e.prototype.reset=function(t,e){void 0===t&&(t=[]),void 0===e&&(e={}),this._forEachChild(function(n,r){n.reset(t[r],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e),this._updatePristine(e),this._updateTouched(e)},e.prototype.getRawValue=function(){return this.controls.map(function(t){return t instanceof Il?t.value:t.getRawValue()})},e.prototype._syncPendingControls=function(){var t=this.controls.reduce(function(t,e){return!!e._syncPendingControls()||t},!1);return t&&this.updateValueAndValidity({onlySelf:!0}),t},e.prototype._throwIfControlMissing=function(t){if(!this.controls.length)throw new Error("\n There are no form controls registered with this array yet. If you're using ngModel,\n you may want to check next tick (e.g. use setTimeout).\n ");if(!this.at(t))throw new Error("Cannot find form control at index "+t)},e.prototype._forEachChild=function(t){this.controls.forEach(function(e,n){t(e,n)})},e.prototype._updateValue=function(){var t=this;this.value=this.controls.filter(function(e){return e.enabled||t.disabled}).map(function(t){return t.value})},e.prototype._anyControls=function(t){return this.controls.some(function(e){return e.enabled&&t(e)})},e.prototype._setUpControls=function(){var t=this;this._forEachChild(function(e){return t._registerControl(e)})},e.prototype._checkAllValuesPresent=function(t){this._forEachChild(function(e,n){if(void 0===t[n])throw new Error("Must supply a value for form control at index: "+n+".")})},e.prototype._allControlsDisabled=function(){for(var t=0,e=this.controls;t0||this.disabled},e.prototype._registerControl=function(t){t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)},e}(jl),Fl=Promise.resolve(null),Nl=function(t){function e(e,n){var i=t.call(this)||this;return i.submitted=!1,i._directives=[],i.ngSubmit=new r.o,i.form=new Rl({},kl(e),xl(n)),i}return Object(o.__extends)(e,t),e.prototype.ngAfterViewInit=function(){this._setUpdateStrategy()},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"controls",{get:function(){return this.form.controls},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this;Fl.then(function(){var n=e._findContainer(t.path);t.control=n.registerControl(t.name,t.control),yl(t.control,t),t.control.updateValueAndValidity({emitEvent:!1}),e._directives.push(t)})},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){var e=this;Fl.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name),Sl(e._directives,t)})},e.prototype.addFormGroup=function(t){var e=this;Fl.then(function(){var n=e._findContainer(t.path),r=new Rl({});bl(r,t),n.registerControl(t.name,r),r.updateValueAndValidity({emitEvent:!1})})},e.prototype.removeFormGroup=function(t){var e=this;Fl.then(function(){var n=e._findContainer(t.path);n&&n.removeControl(t.name)})},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){var n=this;Fl.then(function(){n.form.get(t.path).setValue(e)})},e.prototype.setValue=function(t){this.control.setValue(t)},e.prototype.onSubmit=function(t){return this.submitted=!0,Cl(this.form,this._directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._setUpdateStrategy=function(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)},e.prototype._findContainer=function(t){return t.pop(),t.length?this.form.get(t):this.form},e}(Us),Vl='\n
\n \n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n firstName: new FormControl()\n });',Bl='\n
\n
\n \n
\n
\n\n In your class:\n\n this.myGroup = new FormGroup({\n person: new FormGroup({ firstName: new FormControl() })\n });',zl=function(){function t(){}return t.controlParentException=function(){throw new Error("formControlName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Vl)},t.ngModelGroupException=function(){throw new Error('formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents\n that also have a "form" prefix: formGroupName, formArrayName, or formGroup.\n\n Option 1: Update the parent to be formGroupName (reactive form strategy)\n\n '+Bl+'\n\n Option 2: Use ngModel instead of formControlName (template-driven strategy)\n\n \n \n
\n \n
\n ')},t.missingFormException=function(){throw new Error("formGroup expects a FormGroup instance. Please pass one in.\n\n Example:\n\n "+Vl)},t.groupParentException=function(){throw new Error("formGroupName must be used with a parent formGroup directive. You'll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n "+Bl)},t.arrayParentException=function(){throw new Error('formArrayName must be used with a parent formGroup directive. You\'ll want to add a formGroup\n directive and pass it an existing FormGroup instance (you can create one in your class).\n\n Example:\n\n \n
\n
\n
\n \n
\n
\n
\n\n In your class:\n\n this.cityArray = new FormArray([new FormControl(\'SF\')]);\n this.myGroup = new FormGroup({\n cities: this.cityArray\n });')},t.disabledAttrWarning=function(){console.warn("\n It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true\n when you set up this control in your component class, the disabled attribute will actually be set in the DOM for\n you. We recommend using this approach to avoid 'changed after checked' errors.\n \n Example: \n form = new FormGroup({\n first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),\n last: new FormControl('Drew', Validators.required)\n });\n ")},t}(),Wl=function(t){function e(e,n){var i=t.call(this)||this;return i._validators=e,i._asyncValidators=n,i.submitted=!1,i.directives=[],i.form=null,i.ngSubmit=new r.o,i}return Object(o.__extends)(e,t),e.prototype.ngOnChanges=function(t){this._checkFormPresent(),t.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations())},Object.defineProperty(e.prototype,"formDirective",{get:function(){return this},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"control",{get:function(){return this.form},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return[]},enumerable:!0,configurable:!0}),e.prototype.addControl=function(t){var e=this.form.get(t.path);return yl(e,t),e.updateValueAndValidity({emitEvent:!1}),this.directives.push(t),e},e.prototype.getControl=function(t){return this.form.get(t.path)},e.prototype.removeControl=function(t){Sl(this.directives,t)},e.prototype.addFormGroup=function(t){var e=this.form.get(t.path);bl(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormGroup=function(t){},e.prototype.getFormGroup=function(t){return this.form.get(t.path)},e.prototype.addFormArray=function(t){var e=this.form.get(t.path);bl(e,t),e.updateValueAndValidity({emitEvent:!1})},e.prototype.removeFormArray=function(t){},e.prototype.getFormArray=function(t){return this.form.get(t.path)},e.prototype.updateModel=function(t,e){this.form.get(t.path).setValue(e)},e.prototype.onSubmit=function(t){return this.submitted=!0,Cl(this.form,this.directives),this.ngSubmit.emit(t),!1},e.prototype.onReset=function(){this.resetForm()},e.prototype.resetForm=function(t){void 0===t&&(t=void 0),this.form.reset(t),this.submitted=!1},e.prototype._updateDomValue=function(){var t=this;this.directives.forEach(function(e){var n=t.form.get(e.path);e.control!==n&&(function(t,e){e.valueAccessor.registerOnChange(function(){return wl(e)}),e.valueAccessor.registerOnTouched(function(){return wl(e)}),e._rawValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),e._rawAsyncValidators.forEach(function(t){t.registerOnValidatorChange&&t.registerOnValidatorChange(null)}),t&&t._clearChangeFns()}(e.control,e),n&&yl(n,e),e.control=n)}),this.form._updateTreeValidity({emitEvent:!1})},e.prototype._updateRegistrations=function(){var t=this;this.form._registerOnCollectionChange(function(){return t._updateDomValue()}),this._oldForm&&this._oldForm._registerOnCollectionChange(function(){}),this._oldForm=this.form},e.prototype._updateValidators=function(){var t=kl(this._validators);this.form.validator=Qs.compose([this.form.validator,t]);var e=xl(this._asyncValidators);this.form.asyncValidator=Qs.composeAsync([this.form.asyncValidator,e])},e.prototype._checkFormPresent=function(){this.form||zl.missingFormException()},e}(Us),Ul=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.__extends)(e,t),e.prototype._checkParentType=function(){Jl(this._parent)&&zl.groupParentException()},e}(Tl),Gl=function(t){function e(e,n,r){var i=t.call(this)||this;return i._parent=e,i._validators=n,i._asyncValidators=r,i}return Object(o.__extends)(e,t),e.prototype.ngOnInit=function(){this._checkParentType(),this.formDirective.addFormArray(this)},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeFormArray(this)},Object.defineProperty(e.prototype,"control",{get:function(){return this.formDirective.getFormArray(this)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"path",{get:function(){return gl(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return kl(this._validators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return xl(this._asyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){Jl(this._parent)&&zl.arrayParentException()},e}(Us);function Jl(t){return!(t instanceof Ul||t instanceof Wl||t instanceof Gl)}var ql=function(t){function e(e,n,i,o){var s=t.call(this)||this;return s._added=!1,s.update=new r.o,s._parent=e,s._rawValidators=n||[],s._rawAsyncValidators=i||[],s.valueAccessor=function(t,e){if(!e)return null;var n=void 0,r=void 0,i=void 0;return e.forEach(function(e){var o;e.constructor===nl?n=e:(o=e,Ll.some(function(t){return o.constructor===t})?(r&&Ml(t,"More than one built-in value accessor matches form control with"),r=e):(i&&Ml(t,"More than one custom value accessor matches form control with"),i=e))}),i||r||n||(Ml(t,"No valid value accessor for form control with"),null)}(s,o),s}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"isDisabled",{set:function(t){zl.disabledAttrWarning()},enumerable:!0,configurable:!0}),e.prototype.ngOnChanges=function(t){this._added||this._setUpControl(),function(t,e){if(!t.hasOwnProperty("model"))return!1;var n=t.model;return!!n.isFirstChange()||!Object(r._16)(e,n.currentValue)}(t,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))},e.prototype.ngOnDestroy=function(){this.formDirective&&this.formDirective.removeControl(this)},e.prototype.viewToModelUpdate=function(t){this.viewModel=t,this.update.emit(t)},Object.defineProperty(e.prototype,"path",{get:function(){return gl(this.name,this._parent)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"formDirective",{get:function(){return this._parent?this._parent.formDirective:null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"validator",{get:function(){return kl(this._rawValidators)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"asyncValidator",{get:function(){return xl(this._rawAsyncValidators)},enumerable:!0,configurable:!0}),e.prototype._checkParentType=function(){!(this._parent instanceof Ul)&&this._parent instanceof Tl?zl.ngModelGroupException():this._parent instanceof Ul||this._parent instanceof Wl||this._parent instanceof Gl||zl.controlParentException()},e.prototype._setUpControl=function(){this._checkParentType(),this.control=this.formDirective.addControl(this),this.control.disabled&&this.valueAccessor.setDisabledState&&this.valueAccessor.setDisabledState(!0),this._added=!0},e}(ll),Ql=function(){function t(){}return Object.defineProperty(t.prototype,"required",{get:function(){return this._required},set:function(t){this._required=null!=t&&!1!==t&&""+t!="false",this._onChange&&this._onChange()},enumerable:!0,configurable:!0}),t.prototype.validate=function(t){return this.required?Qs.required(t):null},t.prototype.registerOnValidatorChange=function(t){this._onChange=t},t}(),Kl=function(){function t(){}return t.prototype.group=function(t,e){void 0===e&&(e=null);var n=this._reduceControls(t);return new Rl(n,null!=e?e.validator:null,null!=e?e.asyncValidator:null)},t.prototype.control=function(t,e,n){return new Il(t,e,n)},t.prototype.array=function(t,e,n){var r=this,i=t.map(function(t){return r._createControl(t)});return new Hl(i,e,n)},t.prototype._reduceControls=function(t){var e=this,n={};return Object.keys(t).forEach(function(r){n[r]=e._createControl(t[r])}),n},t.prototype._createControl=function(t){return t instanceof Il||t instanceof Rl||t instanceof Hl?t:Array.isArray(t)?this.control(t[0],t.length>1?t[1]:null,t.length>2?t[2]:null):this.control(t)},t}(),Xl=function(){},Zl=function(){},$l=function(){},ta=n("5X6E"),ea=function(){function t(t,e){this.delay=t,this.scheduler=e}return t.prototype.call=function(t,e){return e.subscribe(new na(t,this.delay,this.scheduler))},t}(),na=function(t){function e(e,n,r){t.call(this,e),this.delay=n,this.scheduler=r,this.queue=[],this.active=!1,this.errored=!1}return Object(o.__extends)(e,t),e.dispatch=function(t){for(var e=t.source,n=e.queue,r=t.scheduler,i=t.destination;n.length>0&&n[0].time-r.now()<=0;)n.shift().notification.observe(i);if(n.length>0){var o=Math.max(0,n[0].time-r.now());this.schedule(t,o)}else e.active=!1},e.prototype._schedule=function(t){this.active=!0,this.add(t.schedule(e.dispatch,this.delay,{source:this,destination:this.destination,scheduler:t}))},e.prototype.scheduleNotification=function(t){if(!0!==this.errored){var e=this.scheduler,n=new ra(e.now()+this.delay,t);this.queue.push(n),!1===this.active&&this._schedule(e)}},e.prototype._next=function(t){this.scheduleNotification(Ur.createNext(t))},e.prototype._error=function(t){this.errored=!0,this.queue=[],this.destination.error(t)},e.prototype._complete=function(){this.scheduleNotification(Ur.createComplete())},e}(cr.a),ra=function(t,e){this.time=t,this.notification=e},ia=function(){};function oa(t){return Error("A hint was already declared for 'align=\""+t+"\"'.")}var sa=0,la=function(){function t(t,e,n){this._elementRef=t,this._changeDetectorRef=e,this.color="primary",this._showAlwaysAnimate=!1,this._subscriptAnimationState="",this._hintLabel="",this._hintLabelId="mat-hint-"+sa++,this._labelOptions=n||{},this.floatLabel=this._labelOptions.float||"auto"}return Object.defineProperty(t.prototype,"dividerColor",{get:function(){return this.color},set:function(t){this.color=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hideRequiredMarker",{get:function(){return this._hideRequiredMarker},set:function(t){this._hideRequiredMarker=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_shouldAlwaysFloat",{get:function(){return"always"===this._floatLabel&&!this._showAlwaysAnimate},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"_canLabelFloat",{get:function(){return"never"!==this._floatLabel},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hintLabel",{get:function(){return this._hintLabel},set:function(t){this._hintLabel=t,this._processHints()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"floatPlaceholder",{get:function(){return this._floatLabel},set:function(t){this.floatLabel=t},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"floatLabel",{get:function(){return this._floatLabel},set:function(t){t!==this._floatLabel&&(this._floatLabel=t||this._labelOptions.float||"auto",this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._validateControlChild(),this._control.controlType&&this._elementRef.nativeElement.classList.add("mat-form-field-type-"+this._control.controlType),this._control.stateChanges.pipe(ks(null)).subscribe(function(){t._validatePlaceholders(),t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()});var e=this._control.ngControl;e&&e.valueChanges&&e.valueChanges.subscribe(function(){t._changeDetectorRef.markForCheck()}),this._hintChildren.changes.pipe(ks(null)).subscribe(function(){t._processHints(),t._changeDetectorRef.markForCheck()}),this._errorChildren.changes.pipe(ks(null)).subscribe(function(){t._syncDescribedByIds(),t._changeDetectorRef.markForCheck()})},t.prototype.ngAfterContentChecked=function(){this._validateControlChild()},t.prototype.ngAfterViewInit=function(){this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()},t.prototype._shouldForward=function(t){var e=this._control?this._control.ngControl:null;return e&&e[t]},t.prototype._hasPlaceholder=function(){return!(!this._control.placeholder&&!this._placeholderChild)},t.prototype._hasLabel=function(){return!!this._labelChild},t.prototype._shouldLabelFloat=function(){return this._canLabelFloat&&(this._control.shouldLabelFloat||this._control.shouldPlaceholderFloat||this._shouldAlwaysFloat)},t.prototype._hideControlPlaceholder=function(){return!this._hasLabel()||!this._shouldLabelFloat()},t.prototype._hasFloatingLabel=function(){return this._hasLabel()||this._hasPlaceholder()},t.prototype._getDisplayedMessages=function(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"},t.prototype._animateAndLockLabel=function(){var t=this;this._hasFloatingLabel()&&this._canLabelFloat&&(this._showAlwaysAnimate=!0,this._floatLabel="always",ai(this._label.nativeElement,"transitionend").pipe(Object(Di.a)(1)).subscribe(function(){t._showAlwaysAnimate=!1}),this._changeDetectorRef.markForCheck())},t.prototype._validatePlaceholders=function(){if(this._control.placeholder&&this._placeholderChild)throw Error("Placeholder attribute and child element were both specified.")},t.prototype._processHints=function(){this._validateHints(),this._syncDescribedByIds()},t.prototype._validateHints=function(){var t,e,n=this;this._hintChildren&&this._hintChildren.forEach(function(r){if("start"==r.align){if(t||n.hintLabel)throw oa("start");t=r}else if("end"==r.align){if(e)throw oa("end");e=r}})},t.prototype._syncDescribedByIds=function(){if(this._control){var t=[];if("hint"===this._getDisplayedMessages()){var e=this._hintChildren?this._hintChildren.find(function(t){return"start"===t.align}):null,n=this._hintChildren?this._hintChildren.find(function(t){return"end"===t.align}):null;e?t.push(e.id):this._hintLabel&&t.push(this._hintLabelId),n&&t.push(n.id)}else this._errorChildren&&(t=this._errorChildren.map(function(t){return t.id}));this._control.setDescribedByIds(t)}},t.prototype._validateControlChild=function(){if(!this._control)throw Error("mat-form-field must contain a MatFormFieldControl.")},t}(),aa=function(){},ua=function(){},ca=function(){},da=function(){},ha=function(t){function e(e,n,r){var i=t.call(this,e)||this;return i._platform=n,i._focusMonitor=r,i._isRoundButton=i._hasHostAttributes("mat-fab","mat-mini-fab"),i._isIconButton=i._hasHostAttributes("mat-icon-button"),i._focusMonitor.monitor(i._elementRef.nativeElement,!0),i}return Object(o.__extends)(e,t),e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._elementRef.nativeElement)},e.prototype.focus=function(){this._getHostElement().focus()},e.prototype._getHostElement=function(){return this._elementRef.nativeElement},e.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},e.prototype._hasHostAttributes=function(){for(var t=this,e=[],n=0;n1&&!this._isMulti)throw Error("Cannot pass multiple values into SelectionModel with single-value mode.")},t}(),ma=function(t,e){this.added=t,this.removed=e},ga=function(){function t(){this._listeners=[]}return t.prototype.notify=function(t,e){for(var n=0,r=this._listeners;n0?this._ngZone.runOutsideAngular(function(){t._debouncer.pipe(ao(t.debounce)).subscribe(function(e){return t.event.emit(e)})}):this._debouncer.subscribe(function(e){return t.event.emit(e)}),this._observer=this._ngZone.runOutsideAngular(function(){return t._mutationObserverFactory.create(function(e){t._debouncer.next(e)})}),this._observer&&this._observer.observe(this._elementRef.nativeElement,{characterData:!0,childList:!0,subtree:!0})},t.prototype.ngOnDestroy=function(){this._observer&&this._observer.disconnect(),this._debouncer.complete()},t}(),Ma=function(){},ka=new r.r("mat-checkbox-click-action"),xa=0,La=function(){var t={Init:0,Checked:1,Unchecked:2,Indeterminate:3};return t[t.Init]="Init",t[t.Checked]="Checked",t[t.Unchecked]="Unchecked",t[t.Indeterminate]="Indeterminate",t}(),Ca=function(t){function e(e,n,i,o,s){var l=t.call(this,e)||this;return l._changeDetectorRef=n,l._focusMonitor=i,l._clickAction=s,l.ariaLabel="",l.ariaLabelledby=null,l._uniqueId="mat-checkbox-"+ ++xa,l.id=l._uniqueId,l.labelPosition="after",l.name=null,l.change=new r.o,l.indeterminateChange=new r.o,l._rippleConfig={centered:!0,radius:25,speedFactor:1.5},l.onTouched=function(){},l._currentAnimationClass="",l._currentCheckState=La.Init,l._checked=!1,l._indeterminate=!1,l._controlValueAccessorChangeFn=function(){},l.tabIndex=parseInt(o)||0,l}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"inputId",{get:function(){return(this.id||this._uniqueId)+"-input"},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"align",{get:function(){return"after"==this.labelPosition?"start":"end"},set:function(t){this.labelPosition="start"==t?"after":"before"},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this;this._focusMonitor.monitor(this._inputElement.nativeElement,!1).subscribe(function(e){return t._onInputFocusChange(e)})},e.prototype.ngOnDestroy=function(){this._focusMonitor.stopMonitoring(this._inputElement.nativeElement)},Object.defineProperty(e.prototype,"checked",{get:function(){return this._checked},set:function(t){t!=this.checked&&(this._checked=t,this._changeDetectorRef.markForCheck())},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"indeterminate",{get:function(){return this._indeterminate},set:function(t){var e=t!=this._indeterminate;this._indeterminate=t,e&&(this._transitionCheckState(this._indeterminate?La.Indeterminate:this.checked?La.Checked:La.Unchecked),this.indeterminateChange.emit(this._indeterminate))},enumerable:!0,configurable:!0}),e.prototype._isRippleDisabled=function(){return this.disableRipple||this.disabled},e.prototype._onLabelTextChange=function(){this._changeDetectorRef.markForCheck()},e.prototype.writeValue=function(t){this.checked=!!t},e.prototype.registerOnChange=function(t){this._controlValueAccessorChangeFn=t},e.prototype.registerOnTouched=function(t){this.onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck()},e.prototype._getAriaChecked=function(){return this.checked?"true":this.indeterminate?"mixed":"false"},e.prototype._transitionCheckState=function(t){var e=this._currentCheckState,n=this._elementRef.nativeElement;e!==t&&(this._currentAnimationClass.length>0&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(e,t),this._currentCheckState=t,this._currentAnimationClass.length>0&&n.classList.add(this._currentAnimationClass))},e.prototype._emitChangeEvent=function(){var t=new function(){};t.source=this,t.checked=this.checked,this._controlValueAccessorChangeFn(this.checked),this.change.emit(t)},e.prototype._onInputFocusChange=function(t){this._focusRipple||"keyboard"!==t?t||(this._removeFocusRipple(),this.onTouched()):this._focusRipple=this._ripple.launch(0,0,Object(o.__assign)({persistent:!0},this._rippleConfig))},e.prototype.toggle=function(){this.checked=!this.checked},e.prototype._onInputClick=function(t){var e=this;t.stopPropagation(),this.disabled||"noop"===this._clickAction?this.disabled||"noop"!==this._clickAction||(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate):(this.indeterminate&&"check"!==this._clickAction&&Promise.resolve().then(function(){e._indeterminate=!1,e.indeterminateChange.emit(e._indeterminate)}),this.toggle(),this._transitionCheckState(this._checked?La.Checked:La.Unchecked),this._emitChangeEvent())},e.prototype.focus=function(){this._focusMonitor.focusVia(this._inputElement.nativeElement,"keyboard")},e.prototype._onInteractionEvent=function(t){t.stopPropagation()},e.prototype._getAnimationClassForCheckStateTransition=function(t,e){var n="";switch(t){case La.Init:if(e===La.Checked)n="unchecked-checked";else{if(e!=La.Indeterminate)return"";n="unchecked-indeterminate"}break;case La.Unchecked:n=e===La.Checked?"unchecked-checked":"unchecked-indeterminate";break;case La.Checked:n=e===La.Unchecked?"checked-unchecked":"checked-indeterminate";break;case La.Indeterminate:n=e===La.Checked?"indeterminate-checked":"indeterminate-unchecked"}return"mat-checkbox-anim-"+n},e.prototype._removeFocusRipple=function(){this._focusRipple&&(this._focusRipple.fadeOut(),this._focusRipple=null)},e}(Ho(Io(Ro(jo(function(t){this._elementRef=t})),"accent"))),Sa=function(){},Ta=function(){function t(t){this.callback=t}return t.prototype.call=function(t,e){return e.subscribe(new Oa(t,this.callback))},t}(),Oa=function(t){function e(e,n){t.call(this,e),this.add(new Sr.a(n))}return Object(o.__extends)(e,t),e}(cr.a),Da=n("3a3m");function Ya(t,e){return function(t,e){return Object(kr.a)(t,e,1)}(t,e)(this)}var Pa=function(){},Ea=function(){},Aa=function(){function t(t){var e=this;this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?function(){e.headers=new Map,t.split("\n").forEach(function(t){var n=t.indexOf(":");if(n>0){var r=t.slice(0,n),i=r.toLowerCase(),o=t.slice(n+1).trim();e.maybeSetNormalizedName(r,i),e.headers.has(i)?e.headers.get(i).push(o):e.headers.set(i,[o])}})}:function(){e.headers=new Map,Object.keys(t).forEach(function(n){var r=t[n],i=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(e.headers.set(i,r),e.maybeSetNormalizedName(n,i))})}:this.headers=new Map}return t.prototype.has=function(t){return this.init(),this.headers.has(t.toLowerCase())},t.prototype.get=function(t){this.init();var e=this.headers.get(t.toLowerCase());return e&&e.length>0?e[0]:null},t.prototype.keys=function(){return this.init(),Array.from(this.normalizedNames.values())},t.prototype.getAll=function(t){return this.init(),this.headers.get(t.toLowerCase())||null},t.prototype.append=function(t,e){return this.clone({name:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({name:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({name:t,value:e,op:"d"})},t.prototype.maybeSetNormalizedName=function(t,e){this.normalizedNames.has(e)||this.normalizedNames.set(e,t)},t.prototype.init=function(){var e=this;this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(function(t){return e.applyUpdate(t)}),this.lazyUpdate=null))},t.prototype.copyFrom=function(t){var e=this;t.init(),Array.from(t.headers.keys()).forEach(function(n){e.headers.set(n,t.headers.get(n)),e.normalizedNames.set(n,t.normalizedNames.get(n))})},t.prototype.clone=function(e){var n=new t;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([e]),n},t.prototype.applyUpdate=function(t){var e=t.name.toLowerCase();switch(t.op){case"a":case"s":var n=t.value;if("string"==typeof n&&(n=[n]),0===n.length)return;this.maybeSetNormalizedName(t.name,e);var r=("a"===t.op?this.headers.get(e):void 0)||[];r.push.apply(r,n),this.headers.set(e,r);break;case"d":var i=t.value;if(i){var o=this.headers.get(e);if(!o)return;0===(o=o.filter(function(t){return-1===i.indexOf(t)})).length?(this.headers.delete(e),this.normalizedNames.delete(e)):this.headers.set(e,o)}else this.headers.delete(e),this.normalizedNames.delete(e)}},t.prototype.forEach=function(t){var e=this;this.init(),Array.from(this.normalizedNames.keys()).forEach(function(n){return t(e.normalizedNames.get(n),e.headers.get(n))})},t}(),ja=function(){function t(){}return t.prototype.encodeKey=function(t){return Ia(t)},t.prototype.encodeValue=function(t){return Ia(t)},t.prototype.decodeKey=function(t){return decodeURIComponent(t)},t.prototype.decodeValue=function(t){return decodeURIComponent(t)},t}();function Ia(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/gi,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%2B/gi,"+").replace(/%3D/gi,"=").replace(/%3F/gi,"?").replace(/%2F/gi,"/")}var Ra=function(){function t(t){void 0===t&&(t={});var e,n,r,i=this;if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new ja,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=(e=t.fromString,n=this.encoder,r=new Map,e.length>0&&e.split("&").forEach(function(t){var e=t.indexOf("="),i=-1==e?[n.decodeKey(t),""]:[n.decodeKey(t.slice(0,e)),n.decodeValue(t.slice(e+1))],o=i[0],s=i[1],l=r.get(o)||[];l.push(s),r.set(o,l)}),r)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(function(e){var n=t.fromObject[e];i.map.set(e,Array.isArray(n)?n:[n])})):this.map=null}return t.prototype.has=function(t){return this.init(),this.map.has(t)},t.prototype.get=function(t){this.init();var e=this.map.get(t);return e?e[0]:null},t.prototype.getAll=function(t){return this.init(),this.map.get(t)||null},t.prototype.keys=function(){return this.init(),Array.from(this.map.keys())},t.prototype.append=function(t,e){return this.clone({param:t,value:e,op:"a"})},t.prototype.set=function(t,e){return this.clone({param:t,value:e,op:"s"})},t.prototype.delete=function(t,e){return this.clone({param:t,value:e,op:"d"})},t.prototype.toString=function(){var t=this;return this.init(),this.keys().map(function(e){var n=t.encoder.encodeKey(e);return t.map.get(e).map(function(e){return n+"="+t.encoder.encodeValue(e)}).join("&")}).join("&")},t.prototype.clone=function(e){var n=new t({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat([e]),n},t.prototype.init=function(){var t=this;null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(function(e){return t.map.set(e,t.cloneFrom.map.get(e))}),this.updates.forEach(function(e){switch(e.op){case"a":case"s":var n=("a"===e.op?t.map.get(e.param):void 0)||[];n.push(e.value),t.map.set(e.param,n);break;case"d":if(void 0===e.value){t.map.delete(e.param);break}var r=t.map.get(e.param)||[],i=r.indexOf(e.value);-1!==i&&r.splice(i,1),r.length>0?t.map.set(e.param,r):t.map.delete(e.param)}}),this.cloneFrom=null)},t}();function Ha(t){return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer}function Fa(t){return"undefined"!=typeof Blob&&t instanceof Blob}function Na(t){return"undefined"!=typeof FormData&&t instanceof FormData}var Va=function(){function t(t,e,n,r){var i;if(this.url=e,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||r?(this.body=void 0!==n?n:null,i=r):i=n,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.params&&(this.params=i.params)),this.headers||(this.headers=new Aa),this.params){var o=this.params.toString();if(0===o.length)this.urlWithParams=e;else{var s=e.indexOf("?");this.urlWithParams=e+(-1===s?"?":s=200&&this.status<300}}(),Wa=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=Ba.ResponseHeader,n}return Object(o.__extends)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(za),Ua=function(t){function e(e){void 0===e&&(e={});var n=t.call(this,e)||this;return n.type=Ba.Response,n.body=void 0!==e.body?e.body:null,n}return Object(o.__extends)(e,t),e.prototype.clone=function(t){return void 0===t&&(t={}),new e({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})},e}(za),Ga=function(t){function e(e){var n=t.call(this,e,0,"Unknown Error")||this;return n.name="HttpErrorResponse",n.ok=!1,n.message=n.status>=200&&n.status<300?"Http failure during parsing for "+(e.url||"(unknown url)"):"Http failure response for "+(e.url||"(unknown url)")+": "+e.status+" "+e.statusText,n.error=e.error||null,n}return Object(o.__extends)(e,t),e}(za);function Ja(t,e){return{body:e,headers:t.headers,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials}}var qa=function(){function t(t){this.handler=t}return t.prototype.request=function(t,e,n){var r,i=this;if(void 0===n&&(n={}),t instanceof Va)r=t;else{var o;o=n.headers instanceof Aa?n.headers:new Aa(n.headers);var s=void 0;n.params&&(s=n.params instanceof Ra?n.params:new Ra({fromObject:n.params})),r=new Va(t,e,void 0!==n.body?n.body:null,{headers:o,params:s,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials})}var l=Ya.call(Object(ur.a)(r),function(t){return i.handler.handle(t)});if(t instanceof Va||"events"===n.observe)return l;var a=yr.call(l,function(t){return t instanceof Ua});switch(n.observe||"body"){case"body":switch(r.responseType){case"arraybuffer":return nr.call(a,function(t){if(null!==t.body&&!(t.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return t.body});case"blob":return nr.call(a,function(t){if(null!==t.body&&!(t.body instanceof Blob))throw new Error("Response is not a Blob.");return t.body});case"text":return nr.call(a,function(t){if(null!==t.body&&"string"!=typeof t.body)throw new Error("Response is not a string.");return t.body});case"json":default:return nr.call(a,function(t){return t.body})}case"response":return a;default:throw new Error("Unreachable: unhandled observe type "+n.observe+"}")}},t.prototype.delete=function(t,e){return void 0===e&&(e={}),this.request("DELETE",t,e)},t.prototype.get=function(t,e){return void 0===e&&(e={}),this.request("GET",t,e)},t.prototype.head=function(t,e){return void 0===e&&(e={}),this.request("HEAD",t,e)},t.prototype.jsonp=function(t,e){return this.request("JSONP",t,{params:(new Ra).append(e,"JSONP_CALLBACK"),observe:"body",responseType:"json"})},t.prototype.options=function(t,e){return void 0===e&&(e={}),this.request("OPTIONS",t,e)},t.prototype.patch=function(t,e,n){return void 0===n&&(n={}),this.request("PATCH",t,Ja(n,e))},t.prototype.post=function(t,e,n){return void 0===n&&(n={}),this.request("POST",t,Ja(n,e))},t.prototype.put=function(t,e,n){return void 0===n&&(n={}),this.request("PUT",t,Ja(n,e))},t}(),Qa=function(){function t(t,e){this.next=t,this.interceptor=e}return t.prototype.handle=function(t){return this.interceptor.intercept(t,this.next)},t}(),Ka=new r.r("HTTP_INTERCEPTORS"),Xa=function(){function t(){}return t.prototype.intercept=function(t,e){return e.handle(t)},t}(),Za=/^\)\]\}',?\n/,$a=function(){},tu=function(){function t(){}return t.prototype.build=function(){return new XMLHttpRequest},t}(),eu=function(){function t(t){this.xhrFactory=t}return t.prototype.handle=function(t){var e=this;if("JSONP"===t.method)throw new Error("Attempted to construct Jsonp request without JsonpClientModule installed.");return new s.a(function(n){var r=e.xhrFactory.build();if(r.open(t.method,t.urlWithParams),t.withCredentials&&(r.withCredentials=!0),t.headers.forEach(function(t,e){return r.setRequestHeader(t,e.join(","))}),t.headers.has("Accept")||r.setRequestHeader("Accept","application/json, text/plain, */*"),!t.headers.has("Content-Type")){var i=t.detectContentTypeHeader();null!==i&&r.setRequestHeader("Content-Type",i)}if(t.responseType){var o=t.responseType.toLowerCase();r.responseType="json"!==o?o:"text"}var s=t.serializeBody(),l=null,a=function(){if(null!==l)return l;var e=1223===r.status?204:r.status,n=r.statusText||"OK",i=new Aa(r.getAllResponseHeaders()),o=function(t){return"responseURL"in t&&t.responseURL?t.responseURL:/^X-Request-URL:/m.test(t.getAllResponseHeaders())?t.getResponseHeader("X-Request-URL"):null}(r)||t.url;return l=new Wa({headers:i,status:e,statusText:n,url:o})},u=function(){var e=a(),i=e.headers,o=e.status,s=e.statusText,l=e.url,u=null;204!==o&&(u="undefined"==typeof r.response?r.responseText:r.response),0===o&&(o=u?200:0);var c=o>=200&&o<300;if("json"===t.responseType&&"string"==typeof u){var d=u;u=u.replace(Za,"");try{u=""!==u?JSON.parse(u):null}catch(t){u=d,c&&(c=!1,u={error:t,text:u})}}c?(n.next(new Ua({body:u,headers:i,status:o,statusText:s,url:l||void 0})),n.complete()):n.error(new Ga({error:u,headers:i,status:o,statusText:s,url:l||void 0}))},c=function(t){var e=new Ga({error:t,status:r.status||0,statusText:r.statusText||"Unknown Error"});n.error(e)},d=!1,h=function(e){d||(n.next(a()),d=!0);var i={type:Ba.DownloadProgress,loaded:e.loaded};e.lengthComputable&&(i.total=e.total),"text"===t.responseType&&r.responseText&&(i.partialText=r.responseText),n.next(i)},p=function(t){var e={type:Ba.UploadProgress,loaded:t.loaded};t.lengthComputable&&(e.total=t.total),n.next(e)};return r.addEventListener("load",u),r.addEventListener("error",c),t.reportProgress&&(r.addEventListener("progress",h),null!==s&&r.upload&&r.upload.addEventListener("progress",p)),r.send(s),n.next({type:Ba.Sent}),function(){r.removeEventListener("error",c),r.removeEventListener("load",u),t.reportProgress&&(r.removeEventListener("progress",h),null!==s&&r.upload&&r.upload.removeEventListener("progress",p)),r.abort()}})},t}(),nu=new r.r("XSRF_COOKIE_NAME"),ru=new r.r("XSRF_HEADER_NAME"),iu=function(){},ou=function(){function t(t,e,n){this.doc=t,this.platform=e,this.cookieName=n,this.lastCookieString="",this.lastToken=null,this.parseCount=0}return t.prototype.getToken=function(){if("server"===this.platform)return null;var t=this.doc.cookie||"";return t!==this.lastCookieString&&(this.parseCount++,this.lastToken=j(t,this.cookieName),this.lastCookieString=t),this.lastToken},t}(),su=function(){function t(t,e){this.tokenService=t,this.headerName=e}return t.prototype.intercept=function(t,e){var n=t.url.toLowerCase();if("GET"===t.method||"HEAD"===t.method||n.startsWith("http://")||n.startsWith("https://"))return e.handle(t);var r=this.tokenService.getToken();return null===r||t.headers.has(this.headerName)||(t=t.clone({headers:t.headers.set(this.headerName,r)})),e.handle(t)},t}();function lu(t,e){return void 0===e&&(e=[]),e?e.reduceRight(function(t,e){return new Qa(t,e)},t):t}var au=function(){function t(){}return t.disable=function(){return{ngModule:t,providers:[{provide:su,useClass:Xa}]}},t.withOptions=function(e){return void 0===e&&(e={}),{ngModule:t,providers:[e.cookieName?{provide:nu,useValue:e.cookieName}:[],e.headerName?{provide:ru,useValue:e.headerName}:[]]}},t}(),uu=function(){};function cu(t){return Error('Unable to find icon with the name "'+t+'"')}function du(t){return Error("The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was \""+t+'".')}var hu=function(t){this.url=t,this.svgElement=null},pu=function(){function t(t,e,n){this._httpClient=t,this._sanitizer=e,this._document=n,this._svgIconConfigs=new Map,this._iconSetConfigs=new Map,this._cachedIconsByUrl=new Map,this._inProgressUrlFetches=new Map,this._fontCssClassesByAlias=new Map,this._defaultFontSetClass="material-icons"}return t.prototype.addSvgIcon=function(t,e){return this.addSvgIconInNamespace("",t,e)},t.prototype.addSvgIconInNamespace=function(t,e,n){var r=mu(t,e);return this._svgIconConfigs.set(r,new hu(n)),this},t.prototype.addSvgIconSet=function(t){return this.addSvgIconSetInNamespace("",t)},t.prototype.addSvgIconSetInNamespace=function(t,e){var n=new hu(e),r=this._iconSetConfigs.get(t);return r?r.push(n):this._iconSetConfigs.set(t,[n]),this},t.prototype.registerFontClassAlias=function(t,e){return void 0===e&&(e=t),this._fontCssClassesByAlias.set(t,e),this},t.prototype.classNameForFontAlias=function(t){return this._fontCssClassesByAlias.get(t)||t},t.prototype.setDefaultFontSetClass=function(t){return this._defaultFontSetClass=t,this},t.prototype.getDefaultFontSetClass=function(){return this._defaultFontSetClass},t.prototype.getSvgIconFromUrl=function(t){var e=this,n=this._sanitizer.sanitize(r.K.RESOURCE_URL,t);if(!n)throw du(t);var i=this._cachedIconsByUrl.get(n);return i?Object(ur.a)(_u(i)):this._loadSvgIconFromConfig(new hu(t)).pipe(dr(function(t){return e._cachedIconsByUrl.set(n,t)}),Object(er.a)(function(t){return _u(t)}))},t.prototype.getNamedSvgIcon=function(t,e){void 0===e&&(e="");var n=mu(e,t),r=this._svgIconConfigs.get(n);if(r)return this._getSvgFromConfig(r);var i=this._iconSetConfigs.get(e);return i?this._getSvgFromIconSetConfigs(t,i):qn(cu(n))},t.prototype._getSvgFromConfig=function(t){return t.svgElement?Object(ur.a)(_u(t.svgElement)):this._loadSvgIconFromConfig(t).pipe(dr(function(e){return t.svgElement=e}),Object(er.a)(function(t){return _u(t)}))},t.prototype._getSvgFromIconSetConfigs=function(t,e){var n=this,i=this._extractIconWithNameFromAnySet(t,e);if(i)return Object(ur.a)(i);var o=e.filter(function(t){return!t.svgElement}).map(function(t){return n._loadSvgIconSetFromConfig(t).pipe(Xn(function(e){var i=n._sanitizer.sanitize(r.K.RESOURCE_URL,t.url);return console.log("Loading icon set URL: "+i+" failed: "+e),Object(ur.a)(null)}),dr(function(e){e&&(t.svgElement=e)}))});return ar(o).pipe(Object(er.a)(function(){var r=n._extractIconWithNameFromAnySet(t,e);if(!r)throw cu(t);return r}))},t.prototype._extractIconWithNameFromAnySet=function(t,e){for(var n=e.length-1;n>=0;n--){var r=e[n];if(r.svgElement){var i=this._extractSvgIconFromSet(r.svgElement,t);if(i)return i}}return null},t.prototype._loadSvgIconFromConfig=function(t){var e=this;return this._fetchUrl(t.url).pipe(Object(er.a)(function(t){return e._createSvgElementForSingleIcon(t)}))},t.prototype._loadSvgIconSetFromConfig=function(t){var e=this;return this._fetchUrl(t.url).pipe(Object(er.a)(function(t){return e._svgElementFromString(t)}))},t.prototype._createSvgElementForSingleIcon=function(t){var e=this._svgElementFromString(t);return this._setSvgAttributes(e),e},t.prototype._extractSvgIconFromSet=function(t,e){var n=t.querySelector("#"+e);if(!n)return null;var r=n.cloneNode(!0);if(r.id="","svg"===r.nodeName.toLowerCase())return this._setSvgAttributes(r);if("symbol"===r.nodeName.toLowerCase())return this._setSvgAttributes(this._toSvgElement(r));var i=this._svgElementFromString("");return i.appendChild(r),this._setSvgAttributes(i)},t.prototype._svgElementFromString=function(t){if(this._document||"undefined"!=typeof document){var e=(this._document||document).createElement("DIV");e.innerHTML=t;var n=e.querySelector("svg");if(!n)throw Error(" tag not found");return n}throw new Error("MatIconRegistry could not resolve document.")},t.prototype._toSvgElement=function(t){for(var e=this._svgElementFromString(""),n=0;n')}(),this._xPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"yPosition",{get:function(){return this._yPosition},set:function(t){"above"!==t&&"below"!==t&&function(){throw Error('y-position value must be either \'above\' or below\'.\n Example: ')}(),this._yPosition=t,this.setPositionClasses()},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"overlapTrigger",{get:function(){return this._overlapTrigger},set:function(t){this._overlapTrigger=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"panelClass",{set:function(t){t&&t.length&&(this._classList=t.split(" ").reduce(function(t,e){return t[e]=!0,t},{}),this._elementRef.nativeElement.className="",this.setPositionClasses())},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"classList",{get:function(){return this.panelClass},set:function(t){this.panelClass=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._keyManager=new Co(this.items).withWrap().withTypeAhead(),this._tabSubscription=this._keyManager.tabOut.subscribe(function(){return t.close.emit("keydown")})},t.prototype.ngOnDestroy=function(){this._tabSubscription.unsubscribe(),this.closed.complete()},t.prototype._hovered=function(){var t=this;return this.items?this.items.changes.pipe(ks(this.items),Object(ta.a)(function(t){return hi.a.apply(void 0,t.map(function(t){return t._hovered}))})):this._ngZone.onStable.asObservable().pipe(Object(Di.a)(1),Object(ta.a)(function(){return t._hovered()}))},t.prototype._handleKeydown=function(t){switch(t.keyCode){case 27:this.closed.emit("keydown"),t.stopPropagation();break;case 37:this.parentMenu&&"ltr"===this.direction&&this.closed.emit("keydown");break;case 39:this.parentMenu&&"rtl"===this.direction&&this.closed.emit("keydown");break;default:this._keyManager.onKeydown(t)}},t.prototype.focusFirstItem=function(){this._keyManager.setFirstItemActive()},t.prototype.resetActiveItem=function(){this._keyManager.setActiveItem(-1)},t.prototype.setPositionClasses=function(t,e){void 0===t&&(t=this.xPosition),void 0===e&&(e=this.yPosition),this._classList["mat-menu-before"]="before"===t,this._classList["mat-menu-after"]="after"===t,this._classList["mat-menu-above"]="above"===e,this._classList["mat-menu-below"]="below"===e},t.prototype.setElevation=function(t){var e="mat-elevation-z"+(2+t),n=Object.keys(this._classList).find(function(t){return t.startsWith("mat-elevation-z")});n&&n!==this._previousElevation||(this._previousElevation&&(this._classList[this._previousElevation]=!1),this._classList[e]=!0,this._previousElevation=e)},t.prototype._startAnimation=function(){this._panelAnimationState="enter-start"},t.prototype._resetAnimation=function(){this._panelAnimationState="void"},t.prototype._onAnimationDone=function(t){"enter-start"===t.toState&&(this._panelAnimationState="enter")},t}(),Du=new r.r("mat-menu-scroll-strategy");function Yu(t){return function(){return t.scrollStrategies.reposition()}}var Pu=function(){function t(t,e,n,i,o,s,l){this._overlay=t,this._element=e,this._viewContainerRef=n,this._scrollStrategy=i,this._parentMenu=o,this._menuItemInstance=s,this._dir=l,this._overlayRef=null,this._menuOpen=!1,this._closeSubscription=Sr.a.EMPTY,this._positionSubscription=Sr.a.EMPTY,this._hoverSubscription=Sr.a.EMPTY,this._openedByMouse=!1,this.menuOpened=new r.o,this.onMenuOpen=this.menuOpened,this.menuClosed=new r.o,this.onMenuClose=this.menuClosed,s&&(s._triggersSubmenu=this.triggersSubmenu())}return Object.defineProperty(t.prototype,"_deprecatedMatMenuTriggerFor",{get:function(){return this.menu},set:function(t){this.menu=t},enumerable:!0,configurable:!0}),t.prototype.ngAfterContentInit=function(){var t=this;this._checkMenu(),this.menu.close.subscribe(function(e){t._destroyMenu(),"click"===e&&t._parentMenu&&t._parentMenu.closed.emit(e)}),this.triggersSubmenu()&&(this._hoverSubscription=this._parentMenu._hovered().pipe(_r(function(e){return e===t._menuItemInstance})).subscribe(function(){t._openedByMouse=!0,t.openMenu()}))},t.prototype.ngOnDestroy=function(){this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null),this._cleanUpSubscriptions()},Object.defineProperty(t.prototype,"menuOpen",{get:function(){return this._menuOpen},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"dir",{get:function(){return this._dir&&"rtl"===this._dir.value?"rtl":"ltr"},enumerable:!0,configurable:!0}),t.prototype.triggersSubmenu=function(){return!(!this._menuItemInstance||!this._parentMenu)},t.prototype.toggleMenu=function(){return this._menuOpen?this.closeMenu():this.openMenu()},t.prototype.openMenu=function(){var t=this;this._menuOpen||(this._createOverlay().attach(this._portal),this._closeSubscription=this._menuClosingActions().subscribe(function(){return t.closeMenu()}),this._initMenu(),this.menu instanceof Ou&&this.menu._startAnimation())},t.prototype.closeMenu=function(){this.menu.close.emit()},t.prototype.focus=function(){this._element.nativeElement.focus()},t.prototype._destroyMenu=function(){this._overlayRef&&this.menuOpen&&(this._resetMenu(),this._closeSubscription.unsubscribe(),this._overlayRef.detach(),this.menu instanceof Ou&&this.menu._resetAnimation())},t.prototype._initMenu=function(){if(this.menu.parentMenu=this.triggersSubmenu()?this._parentMenu:void 0,this.menu.direction=this.dir,this._setMenuElevation(),this._setIsMenuOpen(!0),this._openedByMouse){var t=this._overlayRef.overlayElement.firstElementChild;t&&(this.menu.resetActiveItem(),t.focus())}else this.menu.focusFirstItem()},t.prototype._setMenuElevation=function(){if(this.menu.setElevation){for(var t=0,e=this.menu.parentMenu;e;)t++,e=e.parentMenu;this.menu.setElevation(t)}},t.prototype._resetMenu=function(){this._setIsMenuOpen(!1),this._openedByMouse&&this.triggersSubmenu()||this.focus(),this._openedByMouse=!1},t.prototype._setIsMenuOpen=function(t){this._menuOpen=t,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&(this._menuItemInstance._highlighted=t)},t.prototype._checkMenu=function(){this.menu||function(){throw Error('mat-menu-trigger: must pass in an mat-menu instance.\n\n Example:\n \n ')}()},t.prototype._createOverlay=function(){if(!this._overlayRef){this._portal=new xi(this.menu.templateRef,this._viewContainerRef);var t=this._getOverlayConfig();this._subscribeToPositions(t.positionStrategy),this._overlayRef=this._overlay.create(t)}return this._overlayRef},t.prototype._getOverlayConfig=function(){return new ji({positionStrategy:this._getPosition(),hasBackdrop:!this.triggersSubmenu(),backdropClass:"cdk-overlay-transparent-backdrop",direction:this.dir,scrollStrategy:this._scrollStrategy()})},t.prototype._subscribeToPositions=function(t){var e=this;this._positionSubscription=t.onPositionChange.subscribe(function(t){e.menu.setPositionClasses("start"===t.connectionPair.overlayX?"after":"before","top"===t.connectionPair.overlayY?"below":"above")})},t.prototype._getPosition=function(){var t="before"===this.menu.xPosition?["end","start"]:["start","end"],e=t[0],n=t[1],r="above"===this.menu.yPosition?["bottom","top"]:["top","bottom"],i=r[0],o=r[1],s=[i,o],l=s[0],a=s[1],u=[e,n],c=u[0],d=u[1],h=0;return this.triggersSubmenu()?(d=e="before"===this.menu.xPosition?"start":"end",n=c="end"===e?"start":"end",h="bottom"===i?8:-8):this.menu.overlapTrigger||(l="top"===i?"bottom":"top",a="top"===o?"bottom":"top"),this._overlay.position().connectedTo(this._element,{originX:e,originY:l},{overlayX:c,overlayY:i}).withDirection(this.dir).withOffsetY(h).withFallbackPosition({originX:n,originY:l},{overlayX:d,overlayY:i}).withFallbackPosition({originX:e,originY:a},{overlayX:c,overlayY:o},void 0,-h).withFallbackPosition({originX:n,originY:a},{overlayX:d,overlayY:o},void 0,-h)},t.prototype._cleanUpSubscriptions=function(){this._closeSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._hoverSubscription.unsubscribe()},t.prototype._menuClosingActions=function(){var t=this,e=this._overlayRef.backdropClick(),n=this._overlayRef.detachments(),r=this._parentMenu?this._parentMenu.close:Object(ur.a)(),i=this._parentMenu?this._parentMenu._hovered().pipe(_r(function(e){return e!==t._menuItemInstance}),_r(function(){return t._menuOpen})):Object(ur.a)();return Object(hi.a)(e,r,i,n)},t.prototype._handleMousedown=function(t){(function(t){return 0===t.buttons})(t)||(this._openedByMouse=!0,this.triggersSubmenu()&&t.preventDefault())},t.prototype._handleKeydown=function(t){var e=t.keyCode;this.triggersSubmenu()&&(39===e&&"ltr"===this.dir||37===e&&"rtl"===this.dir)&&this.openMenu()},t.prototype._handleClick=function(t){this.triggersSubmenu()?(t.stopPropagation(),this.openMenu()):this.toggleMenu()},t}(),Eu=function(){},Au=0,ju=new r.r("mat-select-scroll-strategy");function Iu(t){return function(){return t.scrollStrategies.reposition()}}var Ru=function(){},Hu=function(t){function e(e,n,i,o,s,l,a,u,c,d,h,p){var f=t.call(this,s,o,a,u,d)||this;return f._viewportRuler=e,f._changeDetectorRef=n,f._ngZone=i,f._dir=l,f._parentFormField=c,f.ngControl=d,f._scrollStrategyFactory=p,f._panelOpen=!1,f._required=!1,f._scrollTop=0,f._multiple=!1,f._compareWith=function(t,e){return t===e},f._uid="mat-select-"+Au++,f._destroy=new Br.a,f._triggerFontSize=0,f._onChange=function(){},f._onTouched=function(){},f._optionIds="",f._transformOrigin="top",f._panelDoneAnimating=!1,f._scrollStrategy=f._scrollStrategyFactory(),f._offsetY=0,f._positions=[{originX:"start",originY:"top",overlayX:"start",overlayY:"top"},{originX:"start",originY:"bottom",overlayX:"start",overlayY:"bottom"}],f.focused=!1,f.controlType="mat-select",f.ariaLabel="",f.optionSelectionChanges=ss(function(){return f.options?hi.a.apply(void 0,f.options.map(function(t){return t.onSelectionChange})):f._ngZone.onStable.asObservable().pipe(Object(Di.a)(1),Object(ta.a)(function(){return f.optionSelectionChanges}))}),f.openedChange=new r.o,f.onOpen=f._openedStream,f.onClose=f._closedStream,f.selectionChange=new r.o,f.change=f.selectionChange,f.valueChange=new r.o,f.ngControl&&(f.ngControl.valueAccessor=f),f.tabIndex=parseInt(h)||0,f.id=f.id,f}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"placeholder",{get:function(){return this._placeholder},set:function(t){this._placeholder=t,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"required",{get:function(){return this._required},set:function(t){this._required=Yi(t),this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"multiple",{get:function(){return this._multiple},set:function(t){if(this._selectionModel)throw Error("Cannot change `multiple` mode of select after initialization.");this._multiple=Yi(t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"compareWith",{get:function(){return this._compareWith},set:function(t){if("function"!=typeof t)throw Error("`compareWith` must be a function.");this._compareWith=t,this._selectionModel&&this._initializeSelection()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"value",{get:function(){return this._value},set:function(t){t!==this._value&&(this.writeValue(t),this._value=t)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},set:function(t){this._id=t||this._uid,this.stateChanges.next()},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_openedStream",{get:function(){return this.openedChange.pipe(_r(function(t){return t}),Object(er.a)(function(){}))},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"_closedStream",{get:function(){return this.openedChange.pipe(_r(function(t){return!t}),Object(er.a)(function(){}))},enumerable:!0,configurable:!0}),e.prototype.ngOnInit=function(){this._selectionModel=new _a(this.multiple,void 0,!1),this.stateChanges.next()},e.prototype.ngAfterContentInit=function(){var t=this;this._initKeyManager(),this.options.changes.pipe(ks(null),vu(this._destroy)).subscribe(function(){t._resetOptions(),t._initializeSelection()})},e.prototype.ngDoCheck=function(){this.ngControl&&this.updateErrorState()},e.prototype.ngOnChanges=function(t){t.disabled&&this.stateChanges.next()},e.prototype.ngOnDestroy=function(){this._destroy.next(),this._destroy.complete(),this.stateChanges.complete()},e.prototype.toggle=function(){this.panelOpen?this.close():this.open()},e.prototype.open=function(){var t=this;!this.disabled&&this.options&&this.options.length&&(this._triggerRect=this.trigger.nativeElement.getBoundingClientRect(),this._triggerFontSize=parseInt(getComputedStyle(this.trigger.nativeElement)["font-size"]),this._panelOpen=!0,this._calculateOverlayPosition(),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this._ngZone.onStable.asObservable().pipe(Object(Di.a)(1)).subscribe(function(){t._triggerFontSize&&t.overlayDir.overlayRef&&t.overlayDir.overlayRef.overlayElement&&(t.overlayDir.overlayRef.overlayElement.style.fontSize=t._triggerFontSize+"px")}))},e.prototype.close=function(){this._panelOpen&&(this._panelOpen=!1,this._changeDetectorRef.markForCheck(),this._onTouched(),this.focus())},e.prototype.writeValue=function(t){this.options&&this._setSelectionByValue(t)},e.prototype.registerOnChange=function(t){this._onChange=t},e.prototype.registerOnTouched=function(t){this._onTouched=t},e.prototype.setDisabledState=function(t){this.disabled=t,this._changeDetectorRef.markForCheck(),this.stateChanges.next()},Object.defineProperty(e.prototype,"panelOpen",{get:function(){return this._panelOpen},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"selected",{get:function(){return this.multiple?this._selectionModel.selected:this._selectionModel.selected[0]},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"triggerValue",{get:function(){if(this.empty)return"";if(this._multiple){var t=this._selectionModel.selected.map(function(t){return t.viewValue});return this._isRtl()&&t.reverse(),t.join(", ")}return this._selectionModel.selected[0].viewValue},enumerable:!0,configurable:!0}),e.prototype._isRtl=function(){return!!this._dir&&"rtl"===this._dir.value},e.prototype._handleKeydown=function(t){this.disabled||(this.panelOpen?this._handleOpenKeydown(t):this._handleClosedKeydown(t))},e.prototype._handleClosedKeydown=function(t){var e=t.keyCode;13===e||32===e||(this.multiple||t.altKey)&&(40===e||38===e)?(t.preventDefault(),this.open()):this.multiple||this._keyManager.onKeydown(t)},e.prototype._handleOpenKeydown=function(t){var e=t.keyCode;if(36===e||35===e)t.preventDefault(),36===e?this._keyManager.setFirstItemActive():this._keyManager.setLastItemActive();else if(13!==e&&32!==e||!this._keyManager.activeItem){var n=40===e||38===e,r=this._keyManager.activeItemIndex;this._keyManager.onKeydown(t),this._multiple&&n&&t.shiftKey&&this._keyManager.activeItem&&this._keyManager.activeItemIndex!==r&&this._keyManager.activeItem._selectViaInteraction()}else t.preventDefault(),this._keyManager.activeItem._selectViaInteraction()},e.prototype._onPanelDone=function(){this.panelOpen?(this._scrollTop=0,this.openedChange.emit(!0)):(this.openedChange.emit(!1),this._panelDoneAnimating=!1,this.overlayDir.offsetX=0,this._changeDetectorRef.markForCheck())},e.prototype._onFadeInDone=function(){this._panelDoneAnimating=this.panelOpen,this._changeDetectorRef.markForCheck()},e.prototype._onFocus=function(){this.disabled||(this.focused=!0,this.stateChanges.next())},e.prototype._onBlur=function(){this.disabled||this.panelOpen||(this.focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())},e.prototype._onAttached=function(){var t=this;this.overlayDir.positionChange.pipe(Object(Di.a)(1)).subscribe(function(){t._changeDetectorRef.detectChanges(),t._calculateOverlayOffsetX(),t.panel.nativeElement.scrollTop=t._scrollTop})},e.prototype._getPanelTheme=function(){return this._parentFormField?"mat-"+this._parentFormField.color:""},Object.defineProperty(e.prototype,"empty",{get:function(){return!this._selectionModel||this._selectionModel.isEmpty()},enumerable:!0,configurable:!0}),e.prototype._initializeSelection=function(){var t=this;Promise.resolve().then(function(){t._setSelectionByValue(t.ngControl?t.ngControl.value:t._value)})},e.prototype._setSelectionByValue=function(t,e){var n=this;if(void 0===e&&(e=!1),this.multiple&&t){if(!Array.isArray(t))throw Error("Value must be an array in multiple-selection mode.");this._clearSelection(),t.forEach(function(t){return n._selectValue(t,e)}),this._sortValues()}else{this._clearSelection();var r=this._selectValue(t,e);r&&this._keyManager.setActiveItem(this.options.toArray().indexOf(r))}this._changeDetectorRef.markForCheck()},e.prototype._selectValue=function(t,e){var n=this;void 0===e&&(e=!1);var i=this.options.find(function(e){try{return null!=e.value&&n._compareWith(e.value,t)}catch(t){return Object(r.Y)()&&console.warn(t),!1}});return i&&(e?i._selectViaInteraction():i.select(),this._selectionModel.select(i),this.stateChanges.next()),i},e.prototype._clearSelection=function(t){this._selectionModel.clear(),this.options.forEach(function(e){e!==t&&e.deselect()}),this.stateChanges.next()},e.prototype._initKeyManager=function(){var t=this;this._keyManager=new vo(this.options).withTypeAhead(),this._keyManager.tabOut.pipe(vu(this._destroy)).subscribe(function(){return t.close()}),this._keyManager.change.pipe(vu(this._destroy)).subscribe(function(){t._panelOpen&&t.panel?t._scrollActiveOptionIntoView():t._panelOpen||t.multiple||!t._keyManager.activeItem||t._keyManager.activeItem._selectViaInteraction()})},e.prototype._resetOptions=function(){var t=this;this.optionSelectionChanges.pipe(vu(Object(hi.a)(this._destroy,this.options.changes)),_r(function(t){return t.isUserInput})).subscribe(function(e){t._onSelect(e.source),t.multiple||t.close()}),this._setOptionIds()},e.prototype._onSelect=function(t){var e=this._selectionModel.isSelected(t);this.multiple?(this._selectionModel.toggle(t),this.stateChanges.next(),e?t.deselect():t.select(),this._keyManager.setActiveItem(this._getOptionIndex(t)),this._sortValues()):(this._clearSelection(null==t.value?void 0:t),null==t.value?this._propagateChanges(t.value):(this._selectionModel.select(t),this.stateChanges.next())),e!==this._selectionModel.isSelected(t)&&this._propagateChanges()},e.prototype._sortValues=function(){var t=this;this._multiple&&(this._selectionModel.clear(),this.options.forEach(function(e){e.selected&&t._selectionModel.select(e)}),this.stateChanges.next())},e.prototype._propagateChanges=function(t){var e;e=this.multiple?this.selected.map(function(t){return t.value}):this.selected?this.selected.value:t,this._value=e,this.valueChange.emit(e),this._onChange(e),this.selectionChange.emit(new function(t,e){this.source=t,this.value=e}(this,e)),this._changeDetectorRef.markForCheck()},e.prototype._setOptionIds=function(){this._optionIds=this.options.map(function(t){return t.id}).join(" ")},e.prototype._highlightCorrectOption=function(){this._keyManager&&(this.empty?this._keyManager.setFirstItemActive():this._keyManager.setActiveItem(this._getOptionIndex(this._selectionModel.selected[0])))},e.prototype._scrollActiveOptionIntoView=function(){var t=this._getItemHeight(),e=this._keyManager.activeItemIndex||0,n=(e+ns.countGroupLabelsBeforeOption(e,this.options,this.optionGroups))*t,r=this.panel.nativeElement.scrollTop;nr+256&&(this.panel.nativeElement.scrollTop=Math.max(0,n-256+t))},e.prototype.focus=function(){this._elementRef.nativeElement.focus()},e.prototype._getOptionIndex=function(t){return this.options.reduce(function(e,n,r){return void 0===e?t===n?r:void 0:e},void 0)},e.prototype._calculateOverlayPosition=function(){var t=this._getItemHeight(),e=this._getItemCount(),n=Math.min(e*t,256),r=e*t-n,i=this.empty?0:this._getOptionIndex(this._selectionModel.selected[0]);i+=ns.countGroupLabelsBeforeOption(i,this.options,this.optionGroups);var o=n/2;this._scrollTop=this._calculateOverlayScroll(i,o,r),this._offsetY=this._calculateOverlayOffsetY(i,o,r),this._checkOverlayWithinViewport(r)},e.prototype._calculateOverlayScroll=function(t,e,n){var r=this._getItemHeight();return Math.min(Math.max(0,r*t-e+r/2),n)},Object.defineProperty(e.prototype,"_ariaLabel",{get:function(){return this.ariaLabelledby?null:this.ariaLabel||this.placeholder},enumerable:!0,configurable:!0}),e.prototype._getAriaActiveDescendant=function(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null},e.prototype._calculateOverlayOffsetX=function(){var t,e=this.overlayDir.overlayRef.overlayElement.getBoundingClientRect(),n=this._viewportRuler.getViewportSize(),r=this._isRtl(),i=this.multiple?60:32;if(this.multiple)t=44;else{var o=this._selectionModel.selected[0]||this.options.first;t=o&&o.group?32:16}r||(t*=-1);var s=0-(e.left+t-(r?i:0)),l=e.right+t-n.width+(r?0:i);s>0?t+=s+8:l>0&&(t-=l+8),this.overlayDir.offsetX=t,this.overlayDir.overlayRef.updatePosition()},e.prototype._calculateOverlayOffsetY=function(t,e,n){var r=this._getItemHeight(),i=(r-this._triggerRect.height)/2,o=Math.floor(256/r);return-1*(0===this._scrollTop?t*r:this._scrollTop===n?(t-(this._getItemCount()-o))*r+(r-(this._getItemCount()*r-256)%r):e-r/2)-i},e.prototype._checkOverlayWithinViewport=function(t){var e=this._getItemHeight(),n=this._viewportRuler.getViewportSize(),r=this._triggerRect.top-8,i=n.height-this._triggerRect.bottom-8,o=Math.abs(this._offsetY),s=Math.min(this._getItemCount()*e,256)-o-this._triggerRect.height;s>i?this._adjustPanelUp(s,i):o>r?this._adjustPanelDown(o,r,t):this._transformOrigin=this._getOriginBasedOnOption()},e.prototype._adjustPanelUp=function(t,e){var n=Math.round(t-e);this._scrollTop-=n,this._offsetY-=n,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop<=0&&(this._scrollTop=0,this._offsetY=0,this._transformOrigin="50% bottom 0px")},e.prototype._adjustPanelDown=function(t,e,n){var r=Math.round(t-e);if(this._scrollTop+=r,this._offsetY+=r,this._transformOrigin=this._getOriginBasedOnOption(),this._scrollTop>=n)return this._scrollTop=n,this._offsetY=0,void(this._transformOrigin="50% top 0px")},e.prototype._getOriginBasedOnOption=function(){var t=this._getItemHeight(),e=(t-this._triggerRect.height)/2;return"50% "+(Math.abs(this._offsetY)-e+t/2)+"px 0px"},e.prototype._getItemCount=function(){return this.options.length+this.optionGroups.length},e.prototype._getItemHeight=function(){return 3*this._triggerFontSize},e.prototype.setDescribedByIds=function(t){this._ariaDescribedby=t.join(" ")},e.prototype.onContainerClick=function(){this.focus(),this.open()},Object.defineProperty(e.prototype,"shouldLabelFloat",{get:function(){return this._panelOpen||!this.empty},enumerable:!0,configurable:!0}),e}(Ro(Ho(jo(function(t){return function(t){function e(){for(var e=[],n=0;n0&&i.afterOpened().subscribe(function(){return i._dismissAfter(r.duration)}),r.announcementMessage&&this._live.announce(r.announcementMessage,r.politeness),this._openedSnackBarRef=i,this._openedSnackBarRef},t.prototype.open=function(t,e,n){void 0===e&&(e="");var r=mc(n);return r.data={message:t,action:e},r.announcementMessage=t,this.openFromComponent(pc,r)},t.prototype.dismiss=function(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()},t.prototype._attachSnackBarContainer=function(t,e){var n=new ki(fc,e.viewContainerRef),r=t.attach(n);return r.instance.snackBarConfig=e,r.instance},t.prototype._attach=function(t,e){var n=this._createOverlay(e),r=this._attachSnackBarContainer(n,e),i=new cc(r,n),o=this._createInjector(e,i),s=new ki(t,void 0,o),l=r.attachComponentPortal(s);return i.instance=l.instance,this._breakpointObserver.observe("(max-width: 599px) and (orientation: portrait), (max-width: 959px) and (orientation: landscape)").pipe(vu(n.detachments().pipe(Object(Di.a)(1)))).subscribe(function(t){t.matches?n.overlayElement.classList.add("mat-snack-bar-handset"):n.overlayElement.classList.remove("mat-snack-bar-handset")}),i},t.prototype._createOverlay=function(t){var e=new ji;e.direction=t.direction;var n=this._overlay.position().global(),r="rtl"===t.direction,i="left"===t.horizontalPosition||"start"===t.horizontalPosition&&!r||"end"===t.horizontalPosition&&r,o=!i&&"center"!==t.horizontalPosition;return i?n.left("0"):o?n.right("0"):n.centerHorizontally(),"top"===t.verticalPosition?n.top("0"):n.bottom("0"),e.positionStrategy=n,this._overlay.create(e)},t.prototype._createInjector=function(t,e){var n=t&&t.viewContainerRef&&t.viewContainerRef.injector,r=new WeakMap;return r.set(cc,e),r.set(dc,t.data),new Oi(n||this._injector,r)},t}();function mc(t){return Object(o.__assign)({},new hc,t)}var gc=function(){},yc=function(t){function e(e){t.call(this),this._value=e}return Object(o.__extends)(e,t),Object.defineProperty(e.prototype,"value",{get:function(){return this.getValue()},enumerable:!0,configurable:!0}),e.prototype._subscribe=function(e){var n=t.prototype._subscribe.call(this,e);return n&&!n.closed&&e.next(this._value),n},e.prototype.getValue=function(){if(this.hasError)throw this.thrownError;if(this.closed)throw new qr.a;return this._value},e.prototype.next=function(e){t.prototype.next.call(this,this._value=e)},e}(Br.a),vc=function(){},bc=function(t){function e(e,n){var r=t.call(this,e)||this;return r._platform=n,r}return Object(o.__extends)(e,t),e.prototype.ngAfterViewInit=function(){var t=this;Object(r.Y)()&&this._platform.isBrowser&&(this._checkToolbarMixedModes(),this._toolbarRows.changes.subscribe(function(){return t._checkToolbarMixedModes()}))},e.prototype._checkToolbarMixedModes=function(){this._toolbarRows.length&&[].slice.call(this._elementRef.nativeElement.childNodes).filter(function(t){return!(t.classList&&t.classList.contains("mat-toolbar-row"))}).filter(function(t){return t.nodeType!==Node.COMMENT_NODE}).some(function(t){return t.textContent.trim()})&&function(){throw Error("MatToolbar: Attempting to combine different toolbar modes. Either specify multiple `` elements explicitly or just place content inside of a `` for a single row.")}()},e}(Io(function(t){this._elementRef=t})),wc=function(){};function Mc(t){if("object"==typeof t&&(t=t._body),t.startsWith("400")||t.startsWith("403")){var e=t.split(" - ",2);return 2===e.length?e[1].charAt(0).toUpperCase()+e[1].slice(1):t}return t}function kc(t,e,n){void 0===n&&(n=3e5);var r=new hc;r.duration=n,t.open(Mc(e),null,r)}var xc=function(){function t(){this.forceEmitEvents=!1,this.action=new r.o,this.mouseOver=!1}return t.prototype.onClick=function(){this.disabled&&!this.forceEmitEvents||(this.error="",this.action.emit())},t.prototype.setLoading=function(){this.state=0},t.prototype.setSuccess=function(){var t=this;this.state=1,setTimeout(function(){return t.state=null},3e3)},t.prototype.setError=function(t){var e=this;this.error="string"==typeof t?t:Mc(t._body),this.state=2,this.mouseOver&&setTimeout(function(){return e.tooltip.show()},50)},t.prototype.setDisabled=function(){this.disabled=!0},t.prototype.setEnabled=function(){this.disabled=!1},t.prototype.isLoading=function(){return 0===this.state},t.prototype.resetState=function(){return this.state=null,this.error="",this},t}(),Lc=function(){function t(t,e,n,r){this.data=t,this.dialogRef=e,this.walletService=n,this.apiService=r,this.encrypt=!0,this.disableDismiss=!1}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.createWallet=function(){var t=this;this.form.valid&&!this.createButton.isLoading()&&(this.createButton.resetState(),this.createButton.setLoading(),this.cancelButton.setDisabled(),this.disableDismiss=!0,this.walletService.create(this.form.value.label,this.form.value.seed,this.scan,this.encrypt?this.form.value.password:null).subscribe(function(){return t.dialogRef.close()},function(e){t.createButton.setError(e),t.cancelButton.disabled=!1,t.disableDismiss=!1}))},t.prototype.generateSeed=function(t){var e=this;this.apiService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},t.prototype.setEncrypt=function(t){this.encrypt=t.checked,this.form.updateValueAndValidity()},t.prototype.initForm=function(){this.form=new Rl({},[this.validatePasswords.bind(this),this.validateSeeds.bind(this)]),this.form.addControl("label",new Il("",[Qs.required])),this.form.addControl("seed",new Il("",[Qs.required])),this.form.addControl("confirm_seed",new Il),this.form.addControl("password",new Il),this.form.addControl("confirm_password",new Il),this.data.create&&this.generateSeed(128),this.scan=100},t.prototype.validateSeeds=function(){return this.data.create&&this.form&&this.form.get("seed")&&this.form.get("confirm_seed")&&this.form.get("seed").value!==this.form.get("confirm_seed").value?{NotEqual:!0}:null},t.prototype.validatePasswords=function(){if(this.encrypt&&this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(!this.form.get("password").value)return{Required:!0};if(this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t}(),Cc=function(){function t(t,e){this.walletService=t,this.dialog=e}return t.prototype.addWallet=function(t){var e=new Ps;e.width="566px",e.data={create:t},this.dialog.open(Lc,e)},t.prototype.toggleWallet=function(t){t.opened=!t.opened},t}(),Sc=function(){function t(){this.switchVisible=!1,this.activeComponent=new yc(1)}return t.prototype.setActiveComponent=function(t){this.activeComponent.next(t)},t.prototype.showSwitch=function(t,e){this.switchVisible=!0,this.leftText=t,this.rightText=e},t.prototype.hideSwitch=function(){this.switchVisible=!1},t}(),Tc=function(t){return t[t.RightButton=0]="RightButton",t[t.LeftButton=1]="LeftButton",t}({}),Oc=function(){function t(){this.className="",this.onStateChange=new r.o,this.ButtonState=Tc}return t.prototype.onRightClick=function(){this.activeButton===Tc.LeftButton&&(this.activeButton=Tc.RightButton,this.onStateChange.emit(Tc.RightButton))},t.prototype.onLeftClick=function(){this.activeButton===Tc.RightButton&&(this.activeButton=Tc.LeftButton,this.onStateChange.emit(Tc.LeftButton))},t}(),Dc=function(){function t(t){var e=this;this.navbarService=t,this.showForm=!0,this.activeForms=Tc,this.subscription=t.activeComponent.subscribe(function(t){e.activeForm=t,e.formData=null})}return t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.onFormSubmitted=function(t){this.formData=t,this.showForm=!1},t.prototype.onBack=function(t){t&&(this.formData=null),this.showForm=!0},Object.defineProperty(t.prototype,"transaction",{get:function(){var t=this.formData.transaction;return t.from=this.formData.form.wallet.label,t.to=this.formData.to,t.balance=this.formData.amount,t},enumerable:!0,configurable:!0}),t}(),Yc=n("PJh5"),Pc=function(){function t(t,e){var n=this;this.walletService=t,this.navbarService=e,this.transactions=null,this.navbarSubscription=this.navbarService.activeComponent.subscribe(function(t){n.loadTransactions(t)})}return t.prototype.ngOnInit=function(){this.navbarService.showSwitch("pending-txs.my","pending-txs.all")},t.prototype.ngOnDestroy=function(){this.transactionsSubscription.unsubscribe(),this.navbarSubscription.unsubscribe(),this.navbarService.hideSwitch()},t.prototype.loadTransactions=function(t){var e=this,n=t===Tc.LeftButton?"pendingTransactions":"allPendingTransactions";this.transactions=null,this.transactionsSubscription&&this.transactionsSubscription.unsubscribe(),"pendingTransactions"===n&&this.walletService.startDataRefreshSubscription(),this.transactionsSubscription=this.walletService[n]().subscribe(function(t){e.transactions=e.mapTransactions(t)})},t.prototype.mapTransactions=function(t){return t.map(function(t){return t.transaction.timestamp=Yc(t.received).unix(),t.transaction}).map(function(t){return t.amount=t.outputs.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+parseFloat(e)},0),t})},t}();function Ec(){return Ms()(this)}var Ac=function(){function t(t,e,n){this.predicate=t,this.thisArg=e,this.source=n}return t.prototype.call=function(t,e){return e.subscribe(new jc(t,this.predicate,this.thisArg,this.source))},t}(),jc=function(t){function e(e,n,r,i){t.call(this,e),this.predicate=n,this.thisArg=r,this.source=i,this.index=0,this.thisArg=r||this}return Object(o.__extends)(e,t),e.prototype.notifyComplete=function(t){this.destination.next(t),this.destination.complete()},e.prototype._next=function(t){var e=!1;try{e=this.predicate.call(this.thisArg,t,this.index++,this.source)}catch(t){return void this.destination.error(t)}e||this.notifyComplete(!1)},e.prototype._complete=function(){this.notifyComplete(!0)},e}(cr.a);function Ic(t,e){return function(t,e){return function(n){return n.lift(new Ac(t,e,n))}}(t,e)(this)}var Rc=function(){function t(t,e,n,r){this.predicate=t,this.resultSelector=e,this.defaultValue=n,this.source=r}return t.prototype.call=function(t,e){return e.subscribe(new Hc(t,this.predicate,this.resultSelector,this.defaultValue,this.source))},t}(),Hc=function(t){function e(e,n,r,i,o){t.call(this,e),this.predicate=n,this.resultSelector=r,this.defaultValue=i,this.source=o,this.hasValue=!1,this.index=0,"undefined"!=typeof i&&(this.lastValue=i,this.hasValue=!0)}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e=this.index++;if(this.predicate)this._tryPredicate(t,e);else{if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryPredicate=function(t,e){var n;try{n=this.predicate(t,e,this.source)}catch(t){return void this.destination.error(t)}if(n){if(this.resultSelector)return void this._tryResultSelector(t,e);this.lastValue=t,this.hasValue=!0}},e.prototype._tryResultSelector=function(t,e){var n;try{n=this.resultSelector(t,e)}catch(t){return void this.destination.error(t)}this.lastValue=n,this.hasValue=!0},e.prototype._complete=function(){var t=this.destination;this.hasValue?(t.next(this.lastValue),t.complete()):t.error(new vr)},e}(cr.a);function Fc(t,e,n){return function(t,e,n){return function(r){return r.lift(new Rc(t,e,n,r))}}(t,e,n)(this)}function Nc(t){return void 0===t&&(t=Number.POSITIVE_INFINITY),Object(ws.a)(t)(this)}var Vc=n("/4Bh"),Bc=function(t,e){this.id=t,this.url=e},zc=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationStart(id: "+this.id+", url: '"+this.url+"')"},e}(Bc),Wc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.urlAfterRedirects=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"')"},e}(Bc),Uc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.reason=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationCancel(id: "+this.id+", url: '"+this.url+"')"},e}(Bc),Gc=function(t){function e(e,n,r){var i=t.call(this,e,n)||this;return i.error=r,i}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"NavigationError(id: "+this.id+", url: '"+this.url+"', error: "+this.error+")"},e}(Bc),Jc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"RoutesRecognized(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Bc),qc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"GuardsCheckStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Bc),Qc=function(t){function e(e,n,r,i,o){var s=t.call(this,e,n)||this;return s.urlAfterRedirects=r,s.state=i,s.shouldActivate=o,s}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"GuardsCheckEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+", shouldActivate: "+this.shouldActivate+")"},e}(Bc),Kc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"ResolveStart(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Bc),Xc=function(t){function e(e,n,r,i){var o=t.call(this,e,n)||this;return o.urlAfterRedirects=r,o.state=i,o}return Object(o.__extends)(e,t),e.prototype.toString=function(){return"ResolveEnd(id: "+this.id+", url: '"+this.url+"', urlAfterRedirects: '"+this.urlAfterRedirects+"', state: "+this.state+")"},e}(Bc),Zc=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadStart(path: "+this.route.path+")"},t}(),$c=function(){function t(t){this.route=t}return t.prototype.toString=function(){return"RouteConfigLoadEnd(path: "+this.route.path+")"},t}(),td=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),ed=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ChildActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),nd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationStart(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),rd=function(){function t(t){this.snapshot=t}return t.prototype.toString=function(){return"ActivationEnd(path: '"+(this.snapshot.routeConfig&&this.snapshot.routeConfig.path||"")+"')"},t}(),id="primary",od=function(){function t(t){this.params=t||{}}return t.prototype.has=function(t){return this.params.hasOwnProperty(t)},t.prototype.get=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e[0]:e}return null},t.prototype.getAll=function(t){if(this.has(t)){var e=this.params[t];return Array.isArray(e)?e:[e]}return[]},Object.defineProperty(t.prototype,"keys",{get:function(){return Object.keys(this.params)},enumerable:!0,configurable:!0}),t}();function sd(t){return new od(t)}function ld(t,e,n){var r=n.path.split("/");if(r.length>t.length)return null;if("full"===n.pathMatch&&(e.hasChildren()||r.length0?t[t.length-1]:null}function _d(t,e){for(var n in t)t.hasOwnProperty(n)&&e(t[n],n)}function md(t){var e=Nc.call(t);return Ic.call(e,function(t){return!0===t})}function gd(t){return Object(r._14)(t)?t:Object(r._15)(t)?zs(Promise.resolve(t)):Object(ur.a)(t)}function yd(t,e,n){return n?function(t,e){return hd(t,e)}(t.queryParams,e.queryParams)&&function t(e,n){if(!Md(e.segments,n.segments))return!1;if(e.numberOfChildren!==n.numberOfChildren)return!1;for(var r in n.children){if(!e.children[r])return!1;if(!t(e.children[r],n.children[r]))return!1}return!0}(t.root,e.root):function(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(function(n){return e[n]===t[n]})}(t.queryParams,e.queryParams)&&function t(e,n){return function e(n,r,i){if(n.segments.length>i.length)return!!Md(s=n.segments.slice(0,i.length),i)&&!r.hasChildren();if(n.segments.length===i.length){if(!Md(n.segments,i))return!1;for(var o in r.children){if(!n.children[o])return!1;if(!t(n.children[o],r.children[o]))return!1}return!0}var s=i.slice(0,n.segments.length),l=i.slice(n.segments.length);return!!Md(n.segments,s)&&!!n.children[id]&&e(n.children[id],r,l)}(e,n,n.segments)}(t.root,e.root)}var vd=function(){function t(t,e,n){this.root=t,this.queryParams=e,this.fragment=n}return Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=sd(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Cd.serialize(this)},t}(),bd=function(){function t(t,e){var n=this;this.segments=t,this.children=e,this.parent=null,_d(e,function(t,e){return t.parent=n})}return t.prototype.hasChildren=function(){return this.numberOfChildren>0},Object.defineProperty(t.prototype,"numberOfChildren",{get:function(){return Object.keys(this.children).length},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Sd(this)},t}(),wd=function(){function t(t,e){this.path=t,this.parameters=e}return Object.defineProperty(t.prototype,"parameterMap",{get:function(){return this._parameterMap||(this._parameterMap=sd(this.parameters)),this._parameterMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return Dd(this)},t}();function Md(t,e){return t.length===e.length&&t.every(function(t,n){return t.path===e[n].path})}function kd(t,e){var n=[];return _d(t.children,function(t,r){r===id&&(n=n.concat(e(t,r)))}),_d(t.children,function(t,r){r!==id&&(n=n.concat(e(t,r)))}),n}var xd=function(){},Ld=function(){function t(){}return t.prototype.parse=function(t){var e=new jd(t);return new vd(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())},t.prototype.serialize=function(t){var e,n;return"/"+function t(e,n){if(!e.hasChildren())return Sd(e);if(n){var r=e.children[id]?t(e.children[id],!1):"",i=[];return _d(e.children,function(e,n){n!==id&&i.push(n+":"+t(e,!1))}),i.length>0?r+"("+i.join("//")+")":r}var o=kd(e,function(n,r){return r===id?[t(e.children[id],!1)]:[r+":"+t(n,!1)]});return Sd(e)+"/("+o.join("//")+")"}(t.root,!0)+(e=t.queryParams,(n=Object.keys(e).map(function(t){var n=e[t];return Array.isArray(n)?n.map(function(e){return Td(t)+"="+Td(e)}).join("&"):Td(t)+"="+Td(n)})).length?"?"+n.join("&"):"")+("string"==typeof t.fragment?"#"+encodeURI(t.fragment):"")},t}(),Cd=new Ld;function Sd(t){return t.segments.map(function(t){return Dd(t)}).join("/")}function Td(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";")}function Od(t){return decodeURIComponent(t)}function Dd(t){return""+Td(t.path)+(e=t.parameters,Object.keys(e).map(function(t){return";"+Td(t)+"="+Td(e[t])}).join(""));var e}var Yd=/^[^\/()?;=&#]+/;function Pd(t){var e=t.match(Yd);return e?e[0]:""}var Ed=/^[^=?&#]+/,Ad=/^[^?&#]+/,jd=function(){function t(t){this.url=t,this.remaining=t}return t.prototype.parseRootSegment=function(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new bd([],{}):new bd([],this.parseChildren())},t.prototype.parseQueryParams=function(){var t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t},t.prototype.parseFragment=function(){return this.consumeOptional("#")?decodeURI(this.remaining):null},t.prototype.parseChildren=function(){if(""===this.remaining)return{};this.consumeOptional("/");var t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());var e={};this.peekStartsWith("/(")&&(this.capture("/"),e=this.parseParens(!0));var n={};return this.peekStartsWith("(")&&(n=this.parseParens(!1)),(t.length>0||Object.keys(e).length>0)&&(n[id]=new bd(t,e)),n},t.prototype.parseSegment=function(){var t=Pd(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error("Empty path url segment cannot have parameters: '"+this.remaining+"'.");return this.capture(t),new wd(Od(t),this.parseMatrixParams())},t.prototype.parseMatrixParams=function(){for(var t={};this.consumeOptional(";");)this.parseParam(t);return t},t.prototype.parseParam=function(t){var e=Pd(this.remaining);if(e){this.capture(e);var n="";if(this.consumeOptional("=")){var r=Pd(this.remaining);r&&this.capture(n=r)}t[Od(e)]=Od(n)}},t.prototype.parseQueryParam=function(t){var e,n=(e=this.remaining.match(Ed))?e[0]:"";if(n){this.capture(n);var r="";if(this.consumeOptional("=")){var i=function(t){var e=t.match(Ad);return e?e[0]:""}(this.remaining);i&&this.capture(r=i)}var o=Od(n),s=Od(r);if(t.hasOwnProperty(o)){var l=t[o];Array.isArray(l)||(t[o]=l=[l]),l.push(s)}else t[o]=s}},t.prototype.parseParens=function(t){var e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){var n=Pd(this.remaining),r=this.remaining[n.length];if("/"!==r&&")"!==r&&";"!==r)throw new Error("Cannot parse url '"+this.url+"'");var i=void 0;n.indexOf(":")>-1?(i=n.substr(0,n.indexOf(":")),this.capture(i),this.capture(":")):t&&(i=id);var o=this.parseChildren();e[i]=1===Object.keys(o).length?o[id]:new bd([],o),this.consumeOptional("//")}return e},t.prototype.peekStartsWith=function(t){return this.remaining.startsWith(t)},t.prototype.consumeOptional=function(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)},t.prototype.capture=function(t){if(!this.consumeOptional(t))throw new Error('Expected "'+t+'".')},t}(),Id=function(t){this.segmentGroup=t||null},Rd=function(t){this.urlTree=t};function Hd(t){return new s.a(function(e){return e.error(new Id(t))})}function Fd(t){return new s.a(function(e){return e.error(new Rd(t))})}function Nd(t){return new s.a(function(e){return e.error(new Error("Only absolute redirects can have named outlets. redirectTo: '"+t+"'"))})}var Vd=function(){function t(t,e,n,i,o){this.configLoader=e,this.urlSerializer=n,this.urlTree=i,this.config=o,this.allowRedirects=!0,this.ngModule=t.get(r.z)}return t.prototype.apply=function(){var t=this,e=this.expandSegmentGroup(this.ngModule,this.config,this.urlTree.root,id),n=nr.call(e,function(e){return t.createUrlTree(e,t.urlTree.queryParams,t.urlTree.fragment)});return tr.call(n,function(e){if(e instanceof Rd)return t.allowRedirects=!1,t.match(e.urlTree);if(e instanceof Id)throw t.noMatchError(e);throw e})},t.prototype.match=function(t){var e=this,n=this.expandSegmentGroup(this.ngModule,this.config,t.root,id),r=nr.call(n,function(n){return e.createUrlTree(n,t.queryParams,t.fragment)});return tr.call(r,function(t){if(t instanceof Id)throw e.noMatchError(t);throw t})},t.prototype.noMatchError=function(t){return new Error("Cannot match any routes. URL Segment: '"+t.segmentGroup+"'")},t.prototype.createUrlTree=function(t,e,n){var r,i=t.segments.length>0?new bd([],((r={})[id]=t,r)):t;return new vd(i,e,n)},t.prototype.expandSegmentGroup=function(t,e,n,r){return 0===n.segments.length&&n.hasChildren()?nr.call(this.expandChildren(t,e,n),function(t){return new bd([],t)}):this.expandSegment(t,n,e,n.segments,r,!0)},t.prototype.expandChildren=function(t,e,n){var r=this;return function(n,i){if(0===Object.keys(n).length)return Object(ur.a)({});var o=[],s=[],l={};_d(n,function(n,i){var a=nr.call(r.expandSegmentGroup(t,e,n,i),function(t){return l[i]=t});i===id?o.push(a):s.push(a)});var a=Ec.call(ur.a.apply(void 0,o.concat(s))),u=Fc.call(a);return nr.call(u,function(){return l})}(n.children)},t.prototype.expandSegment=function(t,e,n,r,i,o){var s=this,l=ur.a.apply(void 0,n),a=nr.call(l,function(l){var a=s.expandSegmentAgainstRoute(t,e,n,l,r,i,o);return tr.call(a,function(t){if(t instanceof Id)return Object(ur.a)(null);throw t})}),u=Ec.call(a),c=Mr.call(u,function(t){return!!t});return tr.call(c,function(t,n){if(t instanceof vr||"EmptyError"===t.name){if(s.noLeftoversInUrl(e,r,i))return Object(ur.a)(new bd([],{}));throw new Id(e)}throw t})},t.prototype.noLeftoversInUrl=function(t,e,n){return 0===e.length&&!t.children[n]},t.prototype.expandSegmentAgainstRoute=function(t,e,n,r,i,o,s){return Ud(r)!==o?Hd(e):void 0===r.redirectTo?this.matchSegmentAgainstRoute(t,e,r,i):s&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o):Hd(e)},t.prototype.expandSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){return"**"===r.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,r,o):this.expandRegularSegmentAgainstRouteUsingRedirect(t,e,n,r,i,o)},t.prototype.expandWildCardWithParamsAgainstRouteUsingRedirect=function(t,e,n,r){var i=this,o=this.applyRedirectCommands([],n.redirectTo,{});return n.redirectTo.startsWith("/")?Fd(o):xr.call(this.lineralizeSegments(n,o),function(n){var o=new bd(n,{});return i.expandSegment(t,o,e,n,r,!1)})},t.prototype.expandRegularSegmentAgainstRouteUsingRedirect=function(t,e,n,r,i,o){var s=this,l=Bd(e,r,i),a=l.consumedSegments,u=l.lastChild,c=l.positionalParamSegments;if(!l.matched)return Hd(e);var d=this.applyRedirectCommands(a,r.redirectTo,c);return r.redirectTo.startsWith("/")?Fd(d):xr.call(this.lineralizeSegments(r,d),function(r){return s.expandSegment(t,e,n,r.concat(i.slice(u)),o,!1)})},t.prototype.matchSegmentAgainstRoute=function(t,e,n,r){var i=this;if("**"===n.path)return n.loadChildren?nr.call(this.configLoader.load(t.injector,n),function(t){return n._loadedConfig=t,new bd(r,{})}):Object(ur.a)(new bd(r,{}));var s=Bd(e,n,r),l=s.consumedSegments,a=s.lastChild;if(!s.matched)return Hd(e);var u=r.slice(a),c=this.getChildConfig(t,n);return xr.call(c,function(t){var n=t.module,r=t.routes,s=function(t,e,n,r){return n.length>0&&function(t,e,n){return r.some(function(n){return Wd(t,e,n)&&Ud(n)!==id})}(t,n)?{segmentGroup:zd(new bd(e,function(t,e){var n={};n[id]=e;for(var r=0,i=t;r1||!r.children[id])return Nd(t.redirectTo);r=r.children[id]}},t.prototype.applyRedirectCommands=function(t,e,n){return this.applyRedirectCreatreUrlTree(e,this.urlSerializer.parse(e),t,n)},t.prototype.applyRedirectCreatreUrlTree=function(t,e,n,r){var i=this.createSegmentGroup(t,e.root,n,r);return new vd(i,this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)},t.prototype.createQueryParams=function(t,e){var n={};return _d(t,function(t,r){if("string"==typeof t&&t.startsWith(":")){var i=t.substring(1);n[r]=e[i]}else n[r]=t}),n},t.prototype.createSegmentGroup=function(t,e,n,r){var i=this,o=this.createSegments(t,e.segments,n,r),s={};return _d(e.children,function(e,o){s[o]=i.createSegmentGroup(t,e,n,r)}),new bd(o,s)},t.prototype.createSegments=function(t,e,n,r){var i=this;return e.map(function(e){return e.path.startsWith(":")?i.findPosParam(t,e,r):i.findOrReturn(e,n)})},t.prototype.findPosParam=function(t,e,n){var r=n[e.path.substring(1)];if(!r)throw new Error("Cannot redirect to '"+t+"'. Cannot find '"+e.path+"'.");return r},t.prototype.findOrReturn=function(t,e){for(var n=0,r=0,i=e;r0)?{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}:{matched:!0,consumedSegments:[],lastChild:0,positionalParamSegments:{}};var r=(e.matcher||ld)(n,t,e);return r?{matched:!0,consumedSegments:r.consumed,lastChild:r.consumed.length,positionalParamSegments:r.posParams}:{matched:!1,consumedSegments:[],lastChild:0,positionalParamSegments:{}}}function zd(t){if(1===t.numberOfChildren&&t.children[id]){var e=t.children[id];return new bd(t.segments.concat(e.segments),e.children)}return t}function Wd(t,e,n){return(!(t.hasChildren()||e.length>0)||"full"!==n.pathMatch)&&""===n.path&&void 0!==n.redirectTo}function Ud(t){return t.outlet||id}var Gd=function(){function t(t){this._root=t}return Object.defineProperty(t.prototype,"root",{get:function(){return this._root.value},enumerable:!0,configurable:!0}),t.prototype.parent=function(t){var e=this.pathFromRoot(t);return e.length>1?e[e.length-2]:null},t.prototype.children=function(t){var e=Jd(t,this._root);return e?e.children.map(function(t){return t.value}):[]},t.prototype.firstChild=function(t){var e=Jd(t,this._root);return e&&e.children.length>0?e.children[0].value:null},t.prototype.siblings=function(t){var e=qd(t,this._root);return e.length<2?[]:e[e.length-2].children.map(function(t){return t.value}).filter(function(e){return e!==t})},t.prototype.pathFromRoot=function(t){return qd(t,this._root).map(function(t){return t.value})},t}();function Jd(t,e){if(t===e.value)return e;for(var n=0,r=e.children;n=1;){var i=n[r],s=n[r-1];if(i.routeConfig&&""===i.routeConfig.path)r--;else{if(s.component)break;r--}}return function(t){return t.reduce(function(t,e){return{params:Object(o.__assign)({},t.params,e.params),data:Object(o.__assign)({},t.data,e.data),resolve:Object(o.__assign)({},t.resolve,e._resolvedData)}},{params:{},data:{},resolve:{}})}(n.slice(r))}var eh=function(){function t(t,e,n,r,i,o,s,l,a,u,c){this.url=t,this.params=e,this.queryParams=n,this.fragment=r,this.data=i,this.outlet=o,this.component=s,this.routeConfig=l,this._urlSegment=a,this._lastPathIndex=u,this._resolve=c}return Object.defineProperty(t.prototype,"root",{get:function(){return this._routerState.root},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"parent",{get:function(){return this._routerState.parent(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"firstChild",{get:function(){return this._routerState.firstChild(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"children",{get:function(){return this._routerState.children(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"pathFromRoot",{get:function(){return this._routerState.pathFromRoot(this)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"paramMap",{get:function(){return this._paramMap||(this._paramMap=sd(this.params)),this._paramMap},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"queryParamMap",{get:function(){return this._queryParamMap||(this._queryParamMap=sd(this.queryParams)),this._queryParamMap},enumerable:!0,configurable:!0}),t.prototype.toString=function(){return"Route(url:'"+this.url.map(function(t){return t.toString()}).join("/")+"', path:'"+(this.routeConfig?this.routeConfig.path:"")+"')"},t}(),nh=function(t){function e(e,n){var r=t.call(this,n)||this;return r.url=e,rh(r,n),r}return Object(o.__extends)(e,t),e.prototype.toString=function(){return ih(this._root)},e}(Gd);function rh(t,e){e.value._routerState=t,e.children.forEach(function(e){return rh(t,e)})}function ih(t){var e=t.children.length>0?" { "+t.children.map(ih).join(", ")+" } ":"";return""+t.value+e}function oh(t){if(t.snapshot){var e=t.snapshot,n=t._futureSnapshot;t.snapshot=n,hd(e.queryParams,n.queryParams)||t.queryParams.next(n.queryParams),e.fragment!==n.fragment&&t.fragment.next(n.fragment),hd(e.params,n.params)||t.params.next(n.params),function(t,e){if(t.length!==e.length)return!1;for(var n=0;n0&&lh(n[0]))throw new Error("Root segment cannot have matrix parameters");var r=n.find(function(t){return"object"==typeof t&&null!=t&&t.outlets});if(r&&r!==fd(n))throw new Error("{outlets:{}} has to be the last command")}return t.prototype.toRoot=function(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]},t}(),ch=function(t,e,n){this.segmentGroup=t,this.processChildren=e,this.index=n};function dh(t){return"object"==typeof t&&null!=t&&t.outlets?t.outlets[id]:""+t}function hh(t,e,n){if(t||(t=new bd([],{})),0===t.segments.length&&t.hasChildren())return ph(t,e,n);var r=function(t,e,n){for(var r=0,i=e,o={match:!1,pathIndex:0,commandIndex:0};i=n.length)return o;var s=t.segments[i],l=dh(n[r]),a=r0&&void 0===l)break;if(l&&a&&"object"==typeof a&&void 0===a.outlets){if(!gh(l,a,s))return o;r+=2}else{if(!gh(l,{},s))return o;r++}i++}return{match:!0,pathIndex:i,commandIndex:r}}(t,e,n),i=n.slice(r.commandIndex);if(r.match&&r.pathIndex=2?Object(Vc.a)(t,e)(this):Object(Vc.a)(t)(this)}).call(r,function(t,e){return t})},t.prototype.isDeactivating=function(){return 0!==this.canDeactivateChecks.length},t.prototype.isActivating=function(){return 0!==this.canActivateChecks.length},t.prototype.setupChildRouteGuards=function(t,e,n,r){var i=this,o=Kd(e);t.children.forEach(function(t){i.setupRouteGuards(t,o[t.value.outlet],n,r.concat([t.value])),delete o[t.value.outlet]}),_d(o,function(t,e){return i.deactivateRouteAndItsChildren(t,n.getContext(e))})},t.prototype.setupRouteGuards=function(t,e,n,r){var i=t.value,o=e?e.value:null,s=n?n.getContext(t.value.outlet):null;if(o&&i.routeConfig===o.routeConfig){var l=this.shouldRunGuardsAndResolvers(o,i,i.routeConfig.runGuardsAndResolvers);l?this.canActivateChecks.push(new yh(r)):(i.data=o.data,i._resolvedData=o._resolvedData),this.setupChildRouteGuards(t,e,i.component?s?s.children:null:n,r),l&&this.canDeactivateChecks.push(new vh(s.outlet.component,o))}else o&&this.deactivateRouteAndItsChildren(e,s),this.canActivateChecks.push(new yh(r)),this.setupChildRouteGuards(t,null,i.component?s?s.children:null:n,r)},t.prototype.shouldRunGuardsAndResolvers=function(t,e,n){switch(n){case"always":return!0;case"paramsOrQueryParamsChange":return!sh(t,e)||!hd(t.queryParams,e.queryParams);case"paramsChange":default:return!sh(t,e)}},t.prototype.deactivateRouteAndItsChildren=function(t,e){var n=this,r=Kd(t),i=t.value;_d(r,function(t,r){n.deactivateRouteAndItsChildren(t,i.component?e?e.children.getContext(r):null:e)}),this.canDeactivateChecks.push(new vh(i.component&&e&&e.outlet&&e.outlet.isActivated?e.outlet.component:null,i))},t.prototype.runCanDeactivateChecks=function(){var t=this,e=bs(this.canDeactivateChecks),n=xr.call(e,function(e){return t.runCanDeactivate(e.component,e.route)});return Ic.call(n,function(t){return!0===t})},t.prototype.runCanActivateChecks=function(){var t=this,e=bs(this.canActivateChecks),n=Ya.call(e,function(e){return md(bs([t.fireChildActivationStart(e.route.parent),t.fireActivationStart(e.route),t.runCanActivateChild(e.path),t.runCanActivate(e.route)]))});return Ic.call(n,function(t){return!0===t})},t.prototype.fireActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new nd(t)),Object(ur.a)(!0)},t.prototype.fireChildActivationStart=function(t){return null!==t&&this.forwardEvent&&this.forwardEvent(new td(t)),Object(ur.a)(!0)},t.prototype.runCanActivate=function(t){var e=this,n=t.routeConfig?t.routeConfig.canActivate:null;return n&&0!==n.length?md(nr.call(bs(n),function(n){var r,i=e.getToken(n,t);return r=gd(i.canActivate?i.canActivate(t,e.future):i(t,e.future)),Mr.call(r)})):Object(ur.a)(!0)},t.prototype.runCanActivateChild=function(t){var e=this,n=t[t.length-1],r=t.slice(0,t.length-1).reverse().map(function(t){return e.extractCanActivateChild(t)}).filter(function(t){return null!==t});return md(nr.call(bs(r),function(t){return md(nr.call(bs(t.guards),function(r){var i,o=e.getToken(r,t.node);return i=gd(o.canActivateChild?o.canActivateChild(n,e.future):o(n,e.future)),Mr.call(i)}))}))},t.prototype.extractCanActivateChild=function(t){var e=t.routeConfig?t.routeConfig.canActivateChild:null;return e&&0!==e.length?{node:t,guards:e}:null},t.prototype.runCanDeactivate=function(t,e){var n=this,r=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!r||0===r.length)return Object(ur.a)(!0);var i=xr.call(bs(r),function(r){var i,o=n.getToken(r,e);return i=gd(o.canDeactivate?o.canDeactivate(t,e,n.curr,n.future):o(t,e,n.curr,n.future)),Mr.call(i)});return Ic.call(i,function(t){return!0===t})},t.prototype.runResolve=function(t,e){return nr.call(this.resolveNode(t._resolve,t),function(n){return t._resolvedData=n,t.data=Object(o.__assign)({},t.data,th(t,e).resolve),null})},t.prototype.resolveNode=function(t,e){var n=this,r=Object.keys(t);if(0===r.length)return Object(ur.a)({});if(1===r.length){var i=r[0];return nr.call(this.getResolver(t[i],e),function(t){return(e={})[i]=t,e;var e})}var o={},s=xr.call(bs(r),function(r){return nr.call(n.getResolver(t[r],e),function(t){return o[r]=t,t})});return nr.call(Fc.call(s),function(){return o})},t.prototype.getResolver=function(t,e){var n=this.getToken(t,e);return gd(n.resolve?n.resolve(e,this.future):n(e,this.future))},t.prototype.getToken=function(t,e){var n=function(t){if(!t)return null;for(var e=t.parent;e;e=e.parent){var n=e.routeConfig;if(n&&n._loadedConfig)return n._loadedConfig}return null}(e);return(n?n.module.injector:this.moduleInjector).get(t)},t}(),wh=function(){},Mh=function(){function t(t,e,n,r,i){this.rootComponentType=t,this.config=e,this.urlTree=n,this.url=r,this.paramsInheritanceStrategy=i}return t.prototype.recognize=function(){try{var t=Lh(this.urlTree.root,[],[],this.config).segmentGroup,e=this.processSegmentGroup(this.config,t,id),n=new eh([],Object.freeze({}),Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,{},id,this.rootComponentType,null,this.urlTree.root,-1,{}),r=new Qd(n,e),i=new nh(this.url,r);return this.inheritParamsAndData(i._root),Object(ur.a)(i)}catch(t){return new s.a(function(e){return e.error(t)})}},t.prototype.inheritParamsAndData=function(t){var e=this,n=t.value,r=th(n,this.paramsInheritanceStrategy);n.params=Object.freeze(r.params),n.data=Object.freeze(r.data),t.children.forEach(function(t){return e.inheritParamsAndData(t)})},t.prototype.processSegmentGroup=function(t,e,n){return 0===e.segments.length&&e.hasChildren()?this.processChildren(t,e):this.processSegment(t,e,e.segments,n)},t.prototype.processChildren=function(t,e){var n,r=this,i=kd(e,function(e,n){return r.processSegmentGroup(t,e,n)});return n={},i.forEach(function(t){var e=n[t.value.outlet];if(e){var r=e.url.map(function(t){return t.toString()}).join("/"),i=t.value.url.map(function(t){return t.toString()}).join("/");throw new Error("Two segments cannot have the same outlet name: '"+r+"' and '"+i+"'.")}n[t.value.outlet]=t.value}),i.sort(function(t,e){return t.value.outlet===id?-1:e.value.outlet===id?1:t.value.outlet.localeCompare(e.value.outlet)}),i},t.prototype.processSegment=function(t,e,n,r){for(var i=0,o=t;i0?fd(n).parameters:{};i=new eh(n,a,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,Th(t),r,t.component,t,kh(e),xh(e)+n.length,Oh(t))}else{var u=function(t,e,n){if(""===e.path){if("full"===e.pathMatch&&(t.hasChildren()||n.length>0))throw new wh;return{consumedSegments:[],lastChild:0,parameters:{}}}var r=(e.matcher||ld)(n,t,e);if(!r)throw new wh;var i={};_d(r.posParams,function(t,e){i[e]=t.path});var s=r.consumed.length>0?Object(o.__assign)({},i,r.consumed[r.consumed.length-1].parameters):i;return{consumedSegments:r.consumed,lastChild:r.consumed.length,parameters:s}}(e,t,n);s=u.consumedSegments,l=n.slice(u.lastChild),i=new eh(s,u.parameters,Object.freeze(this.urlTree.queryParams),this.urlTree.fragment,Th(t),r,t.component,t,kh(e),xh(e)+s.length,Oh(t))}var c=function(t){return t.children?t.children:t.loadChildren?t._loadedConfig.routes:[]}(t),d=Lh(e,s,l,c),h=d.segmentGroup,p=d.slicedSegments;if(0===p.length&&h.hasChildren()){var f=this.processChildren(c,h);return[new Qd(i,f)]}if(0===c.length&&0===p.length)return[new Qd(i,[])];var _=this.processSegment(c,h,p,id);return[new Qd(i,_)]},t}();function kh(t){for(var e=t;e._sourceSegment;)e=e._sourceSegment;return e}function xh(t){for(var e=t,n=e._segmentIndexShift?e._segmentIndexShift:0;e._sourceSegment;)n+=(e=e._sourceSegment)._segmentIndexShift?e._segmentIndexShift:0;return n-1}function Lh(t,e,n,r){if(n.length>0&&function(t,e,n){return r.some(function(n){return Ch(t,e,n)&&Sh(n)!==id})}(t,n)){var i=new bd(e,function(t,e,n,r){var i={};i[id]=r,r._sourceSegment=t,r._segmentIndexShift=e.length;for(var o=0,s=n;o0)||"full"!==n.pathMatch)&&""===n.path&&void 0===n.redirectTo}function Sh(t){return t.outlet||id}function Th(t){return t.data||{}}function Oh(t){return t.resolve||{}}var Dh=function(){},Yh=function(){function t(){}return t.prototype.shouldDetach=function(t){return!1},t.prototype.store=function(t,e){},t.prototype.shouldAttach=function(t){return!1},t.prototype.retrieve=function(t){return null},t.prototype.shouldReuseRoute=function(t,e){return t.routeConfig===e.routeConfig},t}(),Ph=new r.r("ROUTES"),Eh=function(){function t(t,e,n,r){this.loader=t,this.compiler=e,this.onLoadStartListener=n,this.onLoadEndListener=r}return t.prototype.load=function(t,e){var n=this;this.onLoadStartListener&&this.onLoadStartListener(e);var r=this.loadModuleFactory(e.loadChildren);return nr.call(r,function(r){n.onLoadEndListener&&n.onLoadEndListener(e);var i=r.create(t);return new ad(pd(i.injector.get(Ph)),i)})},t.prototype.loadModuleFactory=function(t){var e=this;return"string"==typeof t?zs(this.loader.load(t)):xr.call(gd(t()),function(t){return t instanceof r.x?Object(ur.a)(t):zs(e.compiler.compileModuleAsync(t))})},t}(),Ah=function(){},jh=function(){function t(){}return t.prototype.shouldProcessUrl=function(t){return!0},t.prototype.extract=function(t){return t},t.prototype.merge=function(t,e){return t},t}();function Ih(t){throw t}function Rh(t){return Object(ur.a)(null)}var Hh=function(){function t(t,e,n,i,o,s,l,a){var u=this;this.rootComponentType=t,this.urlSerializer=e,this.rootContexts=n,this.location=i,this.config=a,this.navigations=new yc(null),this.navigationId=0,this.events=new Br.a,this.errorHandler=Ih,this.navigated=!1,this.hooks={beforePreactivation:Rh,afterPreactivation:Rh},this.urlHandlingStrategy=new jh,this.routeReuseStrategy=new Yh,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.ngModule=o.get(r.z),this.resetConfig(a),this.currentUrlTree=new vd(new bd([],{}),{},null),this.rawUrlTree=this.currentUrlTree,this.configLoader=new Eh(s,l,function(t){return u.triggerEvent(new Zc(t))},function(t){return u.triggerEvent(new $c(t))}),this.routerState=Zd(this.currentUrlTree,this.rootComponentType),this.processNavigations()}return t.prototype.resetRootComponentType=function(t){this.rootComponentType=t,this.routerState.root.component=this.rootComponentType},t.prototype.initialNavigation=function(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})},t.prototype.setUpLocationChangeListener=function(){var t=this;this.locationSubscription||(this.locationSubscription=this.location.subscribe(Zone.current.wrap(function(e){var n=t.urlSerializer.parse(e.url),r="popstate"===e.type?"popstate":"hashchange";setTimeout(function(){t.scheduleNavigation(n,r,{replaceUrl:!0})},0)})))},Object.defineProperty(t.prototype,"url",{get:function(){return this.serializeUrl(this.currentUrlTree)},enumerable:!0,configurable:!0}),t.prototype.triggerEvent=function(t){this.events.next(t)},t.prototype.resetConfig=function(t){ud(t),this.config=t,this.navigated=!1},t.prototype.ngOnDestroy=function(){this.dispose()},t.prototype.dispose=function(){this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=null)},t.prototype.createUrlTree=function(t,e){void 0===e&&(e={});var n=e.relativeTo,i=e.queryParams,s=e.fragment,l=e.preserveQueryParams,a=e.queryParamsHandling,u=e.preserveFragment;Object(r.Y)()&&l&&console&&console.warn&&console.warn("preserveQueryParams is deprecated, use queryParamsHandling instead.");var c=n||this.routerState.root,d=u?this.currentUrlTree.fragment:s,h=null;if(a)switch(a){case"merge":h=Object(o.__assign)({},this.currentUrlTree.queryParams,i);break;case"preserve":h=this.currentUrlTree.queryParams;break;default:h=i||null}else h=l?this.currentUrlTree.queryParams:i||null;return null!==h&&(h=this.removeEmptyProps(h)),function(t,e,n,r,i){if(0===n.length)return ah(e.root,e.root,e,r,i);var o=function(t){if("string"==typeof t[0]&&1===t.length&&"/"===t[0])return new uh(!0,0,t);var e=0,n=!1,r=t.reduce(function(t,r,i){if("object"==typeof r&&null!=r){if(r.outlets){var o={};return _d(r.outlets,function(t,e){o[e]="string"==typeof t?t.split("/"):t}),t.concat([{outlets:o}])}if(r.segmentPath)return t.concat([r.segmentPath])}return"string"!=typeof r?t.concat([r]):0===i?(r.split("/").forEach(function(r,i){0==i&&"."===r||(0==i&&""===r?n=!0:".."===r?e++:""!=r&&t.push(r))}),t):t.concat([r])},[]);return new uh(n,e,r)}(n);if(o.toRoot())return ah(e.root,new bd([],{}),e,r,i);var s=function(t,n,r){if(t.isAbsolute)return new ch(e.root,!0,0);if(-1===r.snapshot._lastPathIndex)return new ch(r.snapshot._urlSegment,!0,0);var i=lh(t.commands[0])?0:1;return function(e,n,o){for(var s=r.snapshot._urlSegment,l=r.snapshot._lastPathIndex+i,a=t.numberOfDoubleDots;a>l;){if(a-=l,!(s=s.parent))throw new Error("Invalid number of '../'");l=s.segments.length}return new ch(s,!1,l-a)}()}(o,0,t),l=s.processChildren?ph(s.segmentGroup,s.index,o.commands):hh(s.segmentGroup,s.index,o.commands);return ah(s.segmentGroup,l,e,r,i)}(c,this.currentUrlTree,t,h,d)},t.prototype.navigateByUrl=function(t,e){void 0===e&&(e={skipLocationChange:!1});var n=t instanceof vd?t:this.parseUrl(t),r=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(r,"imperative",e)},t.prototype.navigate=function(t,e){return void 0===e&&(e={skipLocationChange:!1}),function(t){for(var e=0;e0)return!n||t.address===n}),t}).filter(function(t){return t.addresses.length>0})})},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ps;n.data={address:e},this.dialog.open(pp,n)},t}(),_p=function(){function t(t,e,n){var r=this;this.apiService=t,this.walletService=e,this.ngZone=n,this.progressSubject=new yc(null),this.refreshedBalance=!1,this.ngZone.runOutsideAngular(function(){s.a.timer(0,2e3).flatMap(function(){return r.getBlockchainProgress()}).takeWhile(function(t){return!t.current||t.current!==t.highest}).subscribe(function(t){return r.ngZone.run(function(){r.progressSubject.next(t),r.refreshedBalance||(r.walletService.refreshBalances(),r.refreshedBalance=!0)})},function(t){return console.log(t)},function(){return r.ngZone.run(function(){return r.completeLoading()})})})}return Object.defineProperty(t.prototype,"progress",{get:function(){return this.progressSubject.asObservable()},enumerable:!0,configurable:!0}),t.prototype.block=function(t){var e=this;return this.apiService.get("blocks",{start:t,end:t}).map(function(t){return t.blocks[0]}).flatMap(function(t){return s.a.forkJoin(t.body.txns.map(function(t){return t.inputs&&!t.inputs.length?s.a.of(t):s.a.forkJoin(t.inputs.map(function(t){return e.retrieveInputAddress(t).map(function(t){return t.owner_address})})).map(function(e){return t.inputs=e,t})})).map(function(e){return t.body.txns=e,t})})},t.prototype.blocks=function(t){return void 0===t&&(t=5100),this.apiService.get("last_blocks",{num:t}).map(function(t){return t.blocks.reverse()})},t.prototype.lastBlock=function(){return this.blocks(1).map(function(t){return t[0]})},t.prototype.getBlockchainProgress=function(){return this.apiService.get("blockchain/progress")},t.prototype.coinSupply=function(){return this.apiService.get("coinSupply")},t.prototype.completeLoading=function(){this.progressSubject.next({current:999999999999,highest:999999999999}),this.walletService.refreshBalances()},t.prototype.retrieveInputAddress=function(t){return this.apiService.get("uxout",{uxid:t})},t}(),mp=function(){function t(t){this.blockchainService=t}return t.prototype.ngOnInit=function(){var t=this;this.blockchainService.lastBlock().subscribe(function(e){return t.block=e}),this.blockchainService.coinSupply().subscribe(function(e){return t.coinSupply=e})},t}(),gp=function(){function t(t,e){this.data=t,this.dialogRef=e}return t.prototype.ngOnDestroy=function(){this.data.seed=null},t}(),yp=n("YKDW"),vp=function(){function t(t,e,n,r){var i=this;this.data=t,this.dialogRef=e,this.snackbar=n,this.translateService=r,this.passwordSubmit=new Br.a,this.disableDismiss=!1,this.subscriptions=[],this.data=Object.assign({confirm:!1,description:null,title:null},t||{}),this.translateService.get(["errors.incorrect-password","errors.api-disabled","errors.no-wallet"]).subscribe(function(t){i.errors=t})}return t.prototype.ngOnInit=function(){var t=this;this.form=new Rl({},this.validateForm.bind(this)),this.form.addControl("password",new Il("")),this.form.addControl("confirm_password",new Il("")),["password","confirm_password"].forEach(function(e){t.subscriptions.push(t.form.get(e).valueChanges.subscribe(function(){2===t.button.state&&t.button.resetState()}))}),this.data.confirm?this.form.get("confirm_password").enable():this.form.get("confirm_password").disable(),this.data.description&&this.dialogRef.updateSize("400px")},t.prototype.ngOnDestroy=function(){this.form.get("password").setValue(""),this.form.get("confirm_password").setValue(""),this.passwordSubmit.complete(),this.subscriptions.forEach(function(t){return t.unsubscribe()})},t.prototype.proceed=function(){this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.disableDismiss=!0,this.passwordSubmit.next({password:this.form.get("password").value,close:this.close.bind(this),error:this.error.bind(this)}))},t.prototype.validateForm=function(){if(this.form&&this.form.get("password")&&this.form.get("confirm_password")){if(0===this.form.get("password").value.length)return{Required:!0};if(this.data.confirm&&this.form.get("password").value!==this.form.get("confirm_password").value)return{NotEqual:!0}}return null},t.prototype.close=function(){this.dialogRef.close()},t.prototype.error=function(t){if("object"==typeof t)switch(t.status){case 400:t=Mc(t._body);break;case 401:t=this.errors["errors.incorrect-password"];break;case 403:t=this.errors["errors.api-disabled"];break;case 404:t=this.errors["errors.no-wallet"];break;default:kc(this.snackbar,t,5e3)}this.button.setError(t||this.errors["errors.incorrect-password"]),this.disableDismiss=!1},t}(),bp=function(){function t(t,e){this.walletService=t,this.dialog=e,this.wallets=[]}return t.prototype.ngOnInit=function(){var t=this;this.walletService.folder().subscribe(function(e){return t.folder=e}),this.walletSubscription=this.walletService.all().subscribe(function(e){t.wallets=e})},t.prototype.ngOnDestroy=function(){this.walletSubscription.unsubscribe()},Object.defineProperty(t.prototype,"onlyEncrypted",{get:function(){return this.wallets.filter(function(t){return t.encrypted})},enumerable:!0,configurable:!0}),t.prototype.showSeed=function(t){var e=this;this.dialog.open(vp).componentInstance.passwordSubmit.subscribe(function(n){e.walletService.getWalletSeed(t,n.password).subscribe(function(t){n.close();var r=new Ps;r.width="566px",r.data={seed:t},e.dialog.open(gp,r)},function(t){return n.error(t)})})},t}(),wp=function(t){function e(e,n){void 0===e&&(e=0),void 0===n&&(n=Dr),t.call(this),this.period=e,this.scheduler=n,(!Lr(e)||e<0)&&(this.period=0),n&&"function"==typeof n.schedule||(this.scheduler=Dr)}return Object(o.__extends)(e,t),e.create=function(t,n){return void 0===t&&(t=0),void 0===n&&(n=Dr),new e(t,n)},e.dispatch=function(t){var e=t.subscriber,n=t.period;e.next(t.index),e.closed||(t.index+=1,this.schedule(t,n))},e.prototype._subscribe=function(t){var n=this.period;t.add(this.scheduler.schedule(e.dispatch,n,{index:0,subscriber:t,period:n}))},e}(s.a),Mp=function(){function t(t){this.apiService=t,this.automaticPeers=new yc([]),this.loadData()}return t.prototype.automatic=function(){return this.automaticPeers.asObservable()},t.prototype.retrieveDefaultConnections=function(){return this.apiService.get("network/defaultConnections").map(function(t){return t.map(function(t,e){return{id:e+1,address:t,listen_port:6e3}})})},t.prototype.loadData=function(){var t=this;this.retrieveConnections().subscribe(function(e){return t.automaticPeers.next(e)}),wp.create(5e3).flatMap(function(){return t.retrieveConnections()}).subscribe(function(e){return t.automaticPeers.next(e)})},t.prototype.retrieveConnections=function(){return this.apiService.get("network/connections").map(function(t){return t.connections.sort(function(t,e){return t.id-e.id})})},t}(),kp=function(){function t(t){this.networkService=t}return t.prototype.ngOnInit=function(){var t=this;this.networkService.retrieveDefaultConnections().subscribe(function(e){t.subscription=t.networkService.automatic().first().subscribe(function(n){t.peers=n.map(function(t){return t.source=e.find(function(e){return e.address===t.address})?"default":"exchange",t}).sort(function(t,e){return t.address.localeCompare(e.address)})})})},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t}(),xp=function(){function t(t,e){this.httpClient=t,this.walletService=e,this.configSubject=new yc(null),this.purchaseOrders=new yc([]),this.purchaseUrl=i.tellerUrl,this.getConfig()}return t.prototype.all=function(){return this.purchaseOrders.asObservable()},t.prototype.config=function(){return this.configSubject.asObservable()},t.prototype.getConfig=function(){var t=this;return this.get("config").map(function(t){return{enabled:!0,sky_btc_exchange_rate:parseFloat(t.sky_btc_exchange_rate)}}).subscribe(function(e){return t.configSubject.next(e)})},t.prototype.generate=function(t){var e=this;return this.walletService.addAddress(t).flatMap(function(n){return e.post("bind",{skyaddr:n.address,coin_type:"BTC"}).map(function(e){return{coin_type:e.coin_type,deposit_address:e.deposit_address,filename:t.filename,recipient_address:n.address,status:"waiting_deposit"}})})},t.prototype.scan=function(t){return this.get("status?skyaddr="+t).map(function(t){if(!t.statuses||t.statuses.length>1)throw new Error("too many purchase orders found");return t.statuses[0]})},t.prototype.get=function(t){return this.httpClient.get(this.purchaseUrl+t)},t.prototype.post=function(t,e){return void 0===e&&(e={}),this.httpClient.post(this.purchaseUrl+t,e)},t}(),Lp=function(){function t(t,e,n,r){this.formBuilder=t,this.purchaseService=e,this.snackBar=n,this.walletService=r}return t.prototype.ngOnInit=function(){this.initForm(),this.loadData()},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.checkStatus=function(){var t=this;this.button.setLoading(),this.purchaseService.scan(this.order.recipient_address).subscribe(function(e){t.button.setSuccess(),t.order.status=e.status},function(e){return t.button.setError(e)})},t.prototype.removeOrder=function(){window.localStorage.removeItem("purchaseOrder"),this.order=null},t.prototype.initForm=function(){var t=this;this.form=this.formBuilder.group({wallet:["",Qs.required]}),this.subscription=this.form.get("wallet").valueChanges.subscribe(function(e){var n=t.wallets.find(function(t){return t.filename===e});console.log("changing wallet value",e),t.purchaseService.generate(n).subscribe(function(e){return t.saveData(e)},function(e){return t.snackBar.open(e.toString())})})},t.prototype.loadConfig=function(){var t=this;this.purchaseService.config().filter(function(t){return!!t&&!!t.sky_btc_exchange_rate}).first().subscribe(function(e){return t.config=e})},t.prototype.loadData=function(){var t=this;this.loadConfig(),this.loadOrder(),this.subscription.add(this.walletService.all().subscribe(function(e){t.wallets=e,t.order&&t.form.get("wallet").setValue(t.order.filename,{emitEvent:!1})}))},t.prototype.loadOrder=function(){var t=JSON.parse(window.localStorage.getItem("purchaseOrder"));t&&(this.order=t,this.updateOrder())},t.prototype.saveData=function(t){this.order=t,window.localStorage.setItem("purchaseOrder",JSON.stringify(t))},t.prototype.updateOrder=function(){var t=this;this.purchaseService.scan(this.order.recipient_address).first().subscribe(function(e){return t.order.status=e.status},function(t){return console.log(t)})},t}(),Cp=function(){return function(t,e){var n=this;this.http=t,this.ngZone=e,this.CMC_TICKER_ID=1619,this.price=new yc(null),this.ngZone.runOutsideAngular(function(){s.a.timer(0,6e5).subscribe(function(){n.http.get("https://api.coinmarketcap.com/v2/ticker/"+n.CMC_TICKER_ID+"/").map(function(t){return t.json()}).subscribe(function(t){return n.ngZone.run(function(){n.price.next(t.data.quotes.USD.price)})})})})}}(),Sp=function(){function t(t,e){this.transaction=t,this.dialogRef=e}return t.prototype.closePopup=function(){this.dialogRef.close()},t}(),Tp=function(){function t(t,e,n){this.dialog=t,this.priceService=e,this.walletService=n}return t.prototype.ngOnInit=function(){var t=this;this.priceSubscription=this.priceService.price.subscribe(function(e){return t.price=e}),this.walletService.transactions().first().subscribe(function(e){return t.transactions=e})},t.prototype.ngOnDestroy=function(){this.priceSubscription.unsubscribe()},t.prototype.showTransaction=function(t){var e=new Ps;e.width="800px",e.data=t,this.dialog.open(Sp,e)},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ps;n.data={address:e},this.dialog.open(pp,n)},t}(),Op=function(){function t(t,e){this.walletService=t,this.router=e}return t.prototype.canActivate=function(t,e){var n=this;return new Promise(function(t){n.walletService.all().first().subscribe(function(e){return 0===e.length?(n.router.navigate(["/wizard"]),t(!1)):t(!0)})})},t}(),Dp=function(){function t(t,e){this.router=t,this.walletService=e,this.step=1}return t.prototype.onLabelAndSeedCreated=function(t){this.label=t[0],this.seed=t[1],this.create=t[2],this.step=2},t.prototype.onPasswordCreated=function(t){this.password=t,this.createWallet()},t.prototype.onBack=function(){this.step=1},Object.defineProperty(t.prototype,"fill",{get:function(){return this.label?{label:this.label,seed:this.seed,create:this.create}:null},enumerable:!0,configurable:!0}),t.prototype.createWallet=function(){var t=this;this.walletService.create(this.label,this.seed,100,this.password).subscribe(function(){t.router.navigate(["/wallets"])})},t}(),Yp=function(){},Pp=function(){function t(t){this.predicate=t}return t.prototype.call=function(t,e){return e.subscribe(new Ep(t,this.predicate))},t}(),Ep=function(t){function e(e,n){t.call(this,e),this.predicate=n,this.index=0}return Object(o.__extends)(e,t),e.prototype._next=function(t){var e,n=this.destination;try{e=this.predicate(t,this.index++)}catch(t){return void n.error(t)}this.nextOrComplete(t,e)},e.prototype.nextOrComplete=function(t,e){var n=this.destination;Boolean(e)?n.next(t):n.complete()},e}(cr.a);s.a.prototype.takeWhile=function(t){return function(t){return function(e){return e.lift(new Pp(t))}}(t)(this)};var Ap=function(){function t(t,e){this.apiService=t,this.ngZone=e,this.monitorConnections()}return t.prototype.testBackend=function(){var t=this;this.apiService.getVersion().first().subscribe(function(e){t.version=e,t.apiService.getCsrf().subscribe(null,function(){return t.error=3})},function(){return t.error=2})},t.prototype.monitorConnections=function(){var t=this;this.retrieveConnections().subscribe(function(e){return t.setConnectionError(e)}),this.ngZone.runOutsideAngular(function(){wp.create(1500).flatMap(function(){return t.retrieveConnections()}).subscribe(function(e){return t.ngZone.run(function(){t.setConnectionError(e)})})})},t.prototype.retrieveConnections=function(){return this.apiService.get("network/connections")},t.prototype.setConnectionError=function(t){null!==t.connections&&0!==t.connections.length||(this.error=1),null!==t.connections&&t.connections.length>0&&1===this.error&&(this.error=null)},t}(),jp=function(){function t(t,e){this.appService=t,this.translateService=e,e.setDefaultLang("en"),e.use("en")}return t.prototype.ngOnInit=function(){this.appService.testBackend()},t}(),Ip=r._7({encapsulation:2,styles:[".mat-dialog-container{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);display:block;padding:24px;border-radius:2px;box-sizing:border-box;overflow:auto;outline:0;width:100%;height:100%}@media screen and (-ms-high-contrast:active){.mat-dialog-container{outline:solid 1px}}.mat-dialog-content{display:block;margin:0 -24px;padding:0 24px;max-height:65vh;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-dialog-title{margin:0 0 20px;display:block}.mat-dialog-actions{padding:12px 0;display:flex;flex-wrap:wrap}.mat-dialog-actions:last-child{margin-bottom:-24px}.mat-dialog-actions[align=end]{justify-content:flex-end}.mat-dialog-actions[align=center]{justify-content:center}.mat-dialog-actions .mat-button+.mat-button,.mat-dialog-actions .mat-button+.mat-raised-button,.mat-dialog-actions .mat-raised-button+.mat-button,.mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:8px}[dir=rtl] .mat-dialog-actions .mat-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-button+.mat-raised-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-button,[dir=rtl] .mat-dialog-actions .mat-raised-button+.mat-raised-button{margin-left:0;margin-right:8px}"],data:{animation:[{type:7,name:"slideDialog",definitions:[{type:0,name:"enter",styles:{type:6,styles:{transform:"none",opacity:1},offset:null},options:void 0},{type:0,name:"void",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0) scale(0.9)",opacity:0},offset:null},options:void 0},{type:0,name:"exit",styles:{type:6,styles:{transform:"translate3d(0, 25%, 0)",opacity:0},offset:null},options:void 0},{type:1,expr:"* => *",animation:{type:4,styles:null,timings:"400ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null}],options:{}}]}});function Rp(t){return r._33(0,[(t()(),r._4(0,null,null,0))],null,null)}function Hp(t){return r._33(0,[r._29(402653184,1,{_portalOutlet:0}),(t()(),r._4(16777216,null,null,1,null,Rp)),r._8(2,212992,[[1,4]],0,Si,[r.j,r.R],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var Fp=r._5("mat-dialog-container",As,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-dialog-container",[["class","mat-dialog-container"],["tabindex","-1"]],[[1,"role",0],[1,"aria-labelledby",0],[1,"aria-label",0],[1,"aria-describedby",0],[40,"@slideDialog",0]],[["component","@slideDialog.start"],["component","@slideDialog.done"]],function(t,e,n){var i=!0;return"component:@slideDialog.start"===e&&(i=!1!==r._22(t,1)._onAnimationStart(n)&&i),"component:@slideDialog.done"===e&&(i=!1!==r._22(t,1)._onAnimationDone(n)&&i),i},Hp,Ip)),r._8(1,49152,null,0,As,[r.l,go,r.h,[2,Pt]],null,null)],null,function(t,e){t(e,0,0,null==r._22(e,1)._config?null:r._22(e,1)._config.role,null!=r._22(e,1)._config&&r._22(e,1)._config.ariaLabel?null:r._22(e,1)._ariaLabelledBy,null==r._22(e,1)._config?null:r._22(e,1)._config.ariaLabel,(null==r._22(e,1)._config?null:r._22(e,1)._config.ariaDescribedBy)||null,r._22(e,1)._state)})},{},{},[]),Np=r._7({encapsulation:2,styles:[".mat-snack-bar-container{border-radius:2px;box-sizing:border-box;display:block;margin:24px;max-width:568px;min-width:288px;padding:14px 24px;transform:translateY(100%) translateY(24px)}.mat-snack-bar-container.mat-snack-bar-center{margin:0;transform:translateY(100%)}.mat-snack-bar-container.mat-snack-bar-top{transform:translateY(-100%) translateY(-24px)}.mat-snack-bar-container.mat-snack-bar-top.mat-snack-bar-center{transform:translateY(-100%)}@media screen and (-ms-high-contrast:active){.mat-snack-bar-container{border:solid 1px}}.mat-snack-bar-handset{width:100%}.mat-snack-bar-handset .mat-snack-bar-container{margin:0;max-width:inherit;width:100%}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"visible-top, visible-bottom",styles:{type:6,styles:{transform:"translateY(0%)"},offset:null},options:void 0},{type:1,expr:"visible-top => hidden-top, visible-bottom => hidden-bottom",animation:{type:4,styles:null,timings:"195ms cubic-bezier(0.4,0.0,1,1)"},options:null},{type:1,expr:"void => visible-top, void => visible-bottom",animation:{type:4,styles:null,timings:"225ms cubic-bezier(0.0,0.0,0.2,1)"},options:null}],options:{}}]}});function Vp(t){return r._33(0,[(t()(),r._4(0,null,null,0))],null,null)}function Bp(t){return r._33(2,[r._29(402653184,1,{_portalOutlet:0}),(t()(),r._4(16777216,null,null,1,null,Vp)),r._8(2,212992,[[1,4]],0,Si,[r.j,r.R],{portal:[0,"portal"]},null)],function(t,e){t(e,2,0,"")},null)}var zp=r._5("snack-bar-container",fc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"snack-bar-container",[["class","mat-snack-bar-container"],["role","alert"]],[[40,"@state",0]],[["component","@state.done"]],function(t,e,n){var i=!0;return"component:@state.done"===e&&(i=!1!==r._22(t,1).onAnimationEnd(n)&&i),i},Bp,Np)),r._8(1,180224,null,0,fc,[r.B,r.l,r.h],null,null)],null,function(t,e){t(e,0,0,r._22(e,1)._animationState)})},{},{},[]),Wp=r._7({encapsulation:2,styles:[".mat-simple-snackbar{display:flex;justify-content:space-between;line-height:20px;opacity:1}.mat-simple-snackbar-action{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;background:0 0;flex-shrink:0;margin-left:48px}[dir=rtl] .mat-simple-snackbar-action{margin-right:48px;margin-left:0}"],data:{animation:[{type:7,name:"contentFade",definitions:[{type:1,expr:":enter",animation:[{type:6,styles:{opacity:"0"},offset:null},{type:4,styles:null,timings:"375ms cubic-bezier(0.4,0.0,0.2,1)"}],options:null}],options:{}}]}});function Up(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"button",[["class","mat-simple-snackbar-action"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.action()&&r),r},null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.action)})}function Gp(t){return r._33(2,[(t()(),r._31(0,null,[""," "])),(t()(),r._4(16777216,null,null,1,null,Up)),r._8(2,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null)],function(t,e){t(e,2,0,e.component.hasAction)},function(t,e){t(e,0,0,e.component.data.message)})}var Jp=r._5("simple-snack-bar",pc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"simple-snack-bar",[["class","mat-simple-snackbar"]],[[40,"@contentFade",0]],null,null,Gp,Wp)),r._8(1,49152,null,0,pc,[cc,dc],null,null)],null,function(t,e){t(e,0,0,void 0)})},{},{},[]),qp=r._7({encapsulation:2,styles:[".mat-tooltip-panel{pointer-events:none!important}.mat-tooltip{color:#fff;border-radius:2px;margin:14px;max-width:250px;padding-left:8px;padding-right:8px}@media screen and (-ms-high-contrast:active){.mat-tooltip{outline:solid 1px}}"],data:{animation:[{type:7,name:"state",definitions:[{type:0,name:"initial, void, hidden",styles:{type:6,styles:{transform:"scale(0)"},offset:null},options:void 0},{type:0,name:"visible",styles:{type:6,styles:{transform:"scale(1)"},offset:null},options:void 0},{type:1,expr:"* => visible",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.0, 0.0, 0.2, 1)"},options:null},{type:1,expr:"* => hidden",animation:{type:4,styles:null,timings:"150ms cubic-bezier(0.4, 0.0, 1, 1)"},options:null}],options:{}}]}});function Qp(t){return r._33(2,[(t()(),r._9(0,0,null,null,2,"div",[["class","mat-tooltip"]],[[4,"transform-origin",null],[24,"@state",0]],[[null,"@state.start"],[null,"@state.done"]],function(t,e,n){var r=!0,i=t.component;return"@state.start"===e&&(r=!1!==i._animationStart()&&r),"@state.done"===e&&(r=!1!==i._animationDone(n)&&r),r},null,null)),r._8(1,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._31(2,null,["",""]))],function(t,e){t(e,1,0,"mat-tooltip",e.component.tooltipClass)},function(t,e){var n=e.component;t(e,0,0,n._transformOrigin,n._visibility),t(e,2,0,n.message)})}var Kp=r._5("mat-tooltip-component",Uu,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-tooltip-component",[["aria-hidden","true"]],[[4,"zoom",null]],[["body","click"]],function(t,e,n){var i=!0;return"body:click"===e&&(i=!1!==r._22(t,1)._handleBodyInteraction()&&i),i},Qp,qp)),r._8(1,49152,null,0,Uu,[r.h],null,null)],null,function(t,e){t(e,0,0,"visible"===r._22(e,1)._visibility?1:null)})},{},{},[]),Xp=r._7({encapsulation:2,styles:[".mat-icon{background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px}"],data:{}});function Zp(t){return r._33(2,[r._21(null,0)],null,null)}var $p=r._7({encapsulation:2,styles:[".mat-menu-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;max-height:calc(100vh - 48px);border-radius:2px;outline:0}.mat-menu-panel:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:left top}.mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:right top}.mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-below{transform-origin:right top}[dir=rtl] .mat-menu-panel.mat-menu-after.mat-menu-above{transform-origin:right bottom}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-below{transform-origin:left top}[dir=rtl] .mat-menu-panel.mat-menu-before.mat-menu-above{transform-origin:left bottom}.mat-menu-panel.ng-animating{pointer-events:none}@media screen and (-ms-high-contrast:active){.mat-menu-panel{outline:solid 1px}}.mat-menu-content{padding-top:8px;padding-bottom:8px}.mat-menu-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative}.mat-menu-item[disabled]{cursor:default}[dir=rtl] .mat-menu-item{text-align:right}.mat-menu-item .mat-icon{margin-right:16px}[dir=rtl] .mat-menu-item .mat-icon{margin-left:16px;margin-right:0}.mat-menu-item .mat-icon{vertical-align:middle}.mat-menu-item-submenu-trigger{padding-right:32px}.mat-menu-item-submenu-trigger::after{width:0;height:0;border-style:solid;border-width:5px 0 5px 5px;border-color:transparent transparent transparent currentColor;content:'';display:inline-block;position:absolute;top:50%;right:16px;transform:translateY(-50%)}[dir=rtl] .mat-menu-item-submenu-trigger{padding-right:8px;padding-left:32px}[dir=rtl] .mat-menu-item-submenu-trigger::after{right:auto;left:16px;transform:rotateY(180deg) translateY(-50%)}button.mat-menu-item{width:100%}.mat-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}"],data:{animation:[{type:7,name:"transformMenu",definitions:[{type:0,name:"void",styles:{type:6,styles:{opacity:0,transform:"scale(0.01, 0.01)"},offset:null},options:void 0},{type:0,name:"enter-start",styles:{type:6,styles:{opacity:1,transform:"scale(1, 0.5)"},offset:null},options:void 0},{type:0,name:"enter",styles:{type:6,styles:{transform:"scale(1, 1)"},offset:null},options:void 0},{type:1,expr:"void => enter-start",animation:{type:4,styles:null,timings:"100ms linear"},options:null},{type:1,expr:"enter-start => enter",animation:{type:4,styles:null,timings:"300ms cubic-bezier(0.25, 0.8, 0.25, 1)"},options:null},{type:1,expr:"* => void",animation:{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"150ms 50ms linear"},options:null}],options:{}},{type:7,name:"fadeInItems",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function tf(t){return r._33(0,[(t()(),r._9(0,0,null,null,3,"div",[["class","mat-menu-panel"],["role","menu"],["tabindex","-1"]],[[24,"@transformMenu",0]],[[null,"keydown"],[null,"click"],[null,"@transformMenu.done"]],function(t,e,n){var r=!0,i=t.component;return"keydown"===e&&(r=!1!==i._handleKeydown(n)&&r),"click"===e&&(r=!1!==i.closed.emit("click")&&r),"@transformMenu.done"===e&&(r=!1!==i._onAnimationDone(n)&&r),r},null,null)),r._8(1,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-menu-content"]],[[24,"@fadeInItems",0]],null,null,null,null)),r._21(null,0)],function(t,e){t(e,1,0,"mat-menu-panel",e.component._classList)},function(t,e){t(e,0,0,e.component._panelAnimationState),t(e,2,0,"showing")})}function ef(t){return r._33(2,[r._29(402653184,1,{templateRef:0}),(t()(),r._4(0,[[1,2]],null,0,null,tf))],null,null)}var nf=r._7({encapsulation:2,styles:[],data:{}});function rf(t){return r._33(2,[r._21(null,0),(t()(),r._9(1,0,null,null,1,"div",[["class","mat-menu-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(2,212992,null,0,qo,[r.l,r.B,ei,[2,Jo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,2,0,n.disableRipple||n.disabled,n._getHostElement())},function(t,e){t(e,1,0,r._22(e,2).unbounded)})}var of=function(){function t(t,e,n,r){this.dialogRef=t,this.data=e,this.formBuilder=n,this.walletService=r}return t.prototype.ngOnInit=function(){this.form=this.formBuilder.group({label:[this.data.label,Qs.required]})},t.prototype.closePopup=function(){this.dialogRef.close()},t.prototype.rename=function(){var t=this;this.form.valid&&!this.button.isLoading()&&(this.button.setLoading(),this.walletService.renameWallet(this.data,this.form.value.label).subscribe(function(){return t.dialogRef.close(t.form.value.label)}))},t}(),sf=function(){function t(t,e,n,r){this.dialog=t,this.walletService=e,this.snackbar=n,this.translateService=r}return t.prototype.ngOnInit=function(){var t=this;this.translateService.get("wallet.new.encrypt-warning").subscribe(function(e){t.encryptionWarning=e})},t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.editWallet=function(){var t=new Ps;t.width="566px",t.data=this.wallet,this.dialog.open(of,t)},t.prototype.newAddress=function(){var t=this;this.snackbar.dismiss(),this.wallet.encrypted?this.dialog.open(vp).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.addAddress(t.wallet,e.password).subscribe(function(){return e.close()},function(){return e.error()})}):this.walletService.addAddress(this.wallet).subscribe(null,function(e){return kc(t.snackbar,e)})},t.prototype.toggleEmpty=function(){this.wallet.hideEmpty=!this.wallet.hideEmpty},t.prototype.toggleEncryption=function(){var t=this,e=new Ps;e.data={confirm:!this.wallet.encrypted,title:this.wallet.encrypted?"wallet.decrypt":"wallet.encrypt"},this.wallet.encrypted||(e.data.description=this.encryptionWarning),this.dialog.open(vp,e).componentInstance.passwordSubmit.subscribe(function(e){t.walletService.toggleEncryption(t.wallet,e.password).subscribe(function(){e.close()},function(t){return e.error(t)})})},t.prototype.copyAddress=function(t,e,n){if(void 0===n&&(n=500),t.stopPropagation(),!e.copying){var r=document.createElement("textarea");r.style.position="fixed",r.style.left="0",r.style.top="0",r.style.opacity="0",r.value=e.address,document.body.appendChild(r),r.focus(),r.select(),document.execCommand("copy"),document.body.removeChild(r),e.copying=!0,setTimeout(function(){e.copying=!1},n)}},t.prototype.showQrCode=function(t,e){t.stopPropagation();var n=new Ps;n.data={address:e},this.dialog.open(pp,n)},t}(),lf=r._7({encapsulation:0,styles:[[".-row.-detail[_ngcontent-%COMP%]{background-color:#f5f5f5}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%]{padding-left:0!important}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-address[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{display:inline-block;line-height:60px;cursor:pointer}.-address[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:hover .copy-label[_ngcontent-%COMP%]{opacity:1}.-text-right[_ngcontent-%COMP%]{text-align:right}.-options[_ngcontent-%COMP%]{text-align:center}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:rgba(97,109,125,.5);cursor:pointer;vertical-align:middle}.-options[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{color:#0072ff}.-actions[_ngcontent-%COMP%]{background-color:#fefefe;border-bottom:1px solid #eff0f0;display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,.03)!important;box-shadow:0 4px 10px rgba(0,0,0,.03)!important;border-top-left-radius:0!important;border-top-right-radius:0!important;z-index:100;position:relative}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{padding-right:20px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]:first-child{padding-left:5px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#cecfd0;font-size:12px;height:60px;margin:0 5px;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-img[_ngcontent-%COMP%]::before{content:'';display:inline-block;height:32px;width:32px;margin-right:5px;background-repeat:no-repeat;background-size:32px 32px}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-new-address[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-hide-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANISURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdIKmE8TewJkg6QStJ6j72p6PzgTlBvUAsVhAohqK1jm2CPkuF3x3uphyDJIgCIAggCAIgiAIgiAIgiAIzw0FB8IYM8Q/Z9jliQMY4eccn6H/eoWPxcEs8fs5QDHTWq/gAPSuAJx4XhRwqTJ1Dg8TfhQc2C2Am6AiLPRIbwqoVjy7cuAuIQEFaooWMenLInpRAK26A/UDKjPnALeHe9+HNWTAzC9jRlsmv0KLmKxxMjihl6/0SNGDn1/QO1e4a/wf2/K7UqEkG5hhtYAtK29xgp/eaj3fUc4Fyrlqk8NtCWwKoD2PgzYQDRpX/BrNbLzvHiZ56DzH6Dw/R1+REjSXTzgCNjJcMZeHb8jcX2s9hg74CV4ujFmpyhpq8qov+AIMsFiAN/0/4TtaeZx8UgSoWSzMNLYE8iEcW4HFCToH4+iVJbMHJrKslGXDd5RbAAPJFuD3/t+mUHWh9fFXYOS3MaeDysHWrLwVJPkCDgs4i9qWe/KEjyDhZIfr9Ubfe5OsADT/00a7cDPoCZ8n/GcwUCeQSLoFKHUcNosMvkNPoOx52PaHqiQ4wmAeCVyGbWPuzjEiYD6/+0HIg/FejcPthLKt29J3Fzh8QGNisVPCyY9h/8kTuVdcKNvClr67wH4WaCFlkL3XBDgU0BgkJUVhuwBHGZuFDnLxt5NI9nBb313g8AEWAmd0X+1LW7ffaH0LZXGDhVFL30mkW4Bzdw2BRTMscoLZXyPuq8jhdiFZAXiYnzfam6c3NlD2h+jNHBLh8AEU9xsZGqWtwAzVCGAj7BXJSVeyAijsYYbWSH0xZ79pcVid8eeN8EhcFk05agIsYRBPa9PoVe7P7ExkLdWhZoToLBkYoAQlztOpGoxZYLISSEZcWaZaA1dZrPeSWNey9payOmtJ7GBF0Tivf0TOKcq5gadUFK2h0vURqG/QflChrTLLqhPjsl5Fnz3ik534FW9zoPYe3Md3WifH/hC5GIEeoIHSPo0dYxfI4fk9b6EHDnI5WhZNVXk5uitlbkHh9clejsbU1+NlCa2qIuXQcj2ON0g/B5hdHup6XBAEQRAEQRAEQRCE58c/90hmWzuzaIoAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-show-empty[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAANpSURBVHgB7ZndcdswDIBBOQO4G6gTxOzfa9IJmk6QdoK6E8TeIJkg6QRtJqj72l4qZ4JyBA8QiwUk2qVoWbJFyNdc8N3pbFIS+AcCIAQgCIIgCIIgCIIgCMJTQ8GByLJsiD9n2OSJBRjh/xSvobu9wMtgZ+Z4fwaQ32qtF3AAep8AHHia5zBWiTqHfwNuBTt2A2CnOBEGeqS3CShXPLmwYMcQgQJ1iRox7UsjepkAWnUL6juUas4Bbg/7tg9tSICZn1k2ahj8AjViusTB4ICev9AjRRf+f0Z1NrdX+Iypea+YUJINzLBqQMPKGxzgx9daz3aU8wHlXNTJ4dYEtgmgPY+dziDoNK74FarZZN89TPLQeE7QeH4KbtEkaC6bcARsJLhiNvVrSN1faj2BDrgBju+ybKFKbViRlm3BZ2CARQOc6v/x62jlcfDj7e/cn+MzaOGBBogacvxl27N3d9llqAlkQzi2AosRtBYmQZUhtW98Byzdp7ggdROxlSQpZBm/jmILYCB6Agp/r4ogZ025oq17NPX+NwZIJIuMaKUNDKxcdBkFhwacBWXTpM5dcR7En9ThcrnR9t5ETwCq/2mlnNtb6AkXJ6wZDNQJRBKvAUod+8U8gW/QEyh75pfdoSoKDjeYBgLnftmz9o379Xc2t0GVCb0Dyja2oe0ucNiAysBC4+dZ+33Z8A41bu+/MIJtxHSy95wAxwRUOklBkV/OwVLEZqCDXHx3GsgeNrXdBQ4bYMAzRg/lvjSr8iutb6BIblQJ9zydCqGdUU3bUcRrgLX3FYF51S1ygtFfxe+rwOB2IXoC8DA/q5Q3T29soOx3Qc0MIuGwAeT3KxHaryw7BWYoRwAbbi+PDrqiJ4DcHkZoldB3AOp6hzjdnzTT9KDLNfhH4iJpypETYHGDeFoLT3OpO7NvxfMOG9a+poWa7FDbO7vBlhGqP7MXkVxURzGSvHDB1Jq2XMM+9J4S65rWbkirs6bEDpYUbcv6BHJOUc41PKak6ApKXR+B+gr1BxVDx+WkPDHOV6vooke8khO34nUG1DyAff9G62jf7yMfRqAHqKO0T8MERhfI4Lk9b6AHDvJxtEiaBnnDForYgtzro/04GrL6PF6k0MosUgo1n8cx+fljgNHloT6PC4IgCIIgCIIgCILw9PgL6Ap8qFzYW2UAAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-enable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKbSURBVHgB7ZnRbdswEIZ/MhkgI7gTxKzdhz41mSAdIZ2gyQS1J0g8QdIJ6kzQvMcu1QmiEfzYAonYO1stZNaIDfdOcOH7AMMSIRK644n87wgYhmEYhmEYhmEY+4dDi8QYj6oK5967d3TbTUCnfomC/sqqSne9XrhFi7TmgEmM7z3cDV0erXm0TFUatuUIjxaI8fsVGf8F641nOs67G+rzCS2gHgFsSEIaYAsc3HUIx5dQRDUCpjGerzB+Rm3DZ6TT16Hr+PeEFID0Oe9Pz13wpwNFVCPgWyweUS90NeVPMvxtCOWq52mR7CS4r1mfmUN6FUKYQQG1CODZx7IheMl4howsydhTumwaO985oISaA7xzZ817CrXbl4z/DTuBdoHRUl+HEyihtwYkdLOGETak8rhfanDuGEqoOSBl4U8zW2za900I91lTB0q0ogN2mb13wCFagrbEhB1EXAdwwkOBxervAoKwKqTlcSitB0QdwMbXQqYLHQrWCZJOEF4DPCcwWsZjMbYXTZLEIqCWsY9Zc0ma/wMtNMU2s1an0FfItkHOI1ZslVshFwHO5TPDsjbwi24bsv0Qxm6eKKFstvsKYgmSmANSpvyq53Qp8a3yGBxFzTaqF5xBCMk1YMkB/X4YQ4jDRcmsSQdC/BdCSCsVZkwKY88xB2DPMQdAiUVStPuIOcBlau1JMCeYTP4qjW9cXVqHmAP4XK95fwA+3fn3KOAx/ME8H/iD20kHeOTKj5OjuGL2NoINf3iIJzwGMuX3gw5WIIRoPWA6jdek0z9CESq0jHohiBVbRBdB7zGAYHiuoKAXHkAQUQewZueKTX6wIQHPvHQ1iFE7G1wUSHi25oca2+4IJRl+VwFjqQKIYRiGYRiGYRiGYRjGL/wq6dJf5iBxAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-disable-encryption[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAN+SURBVHgB7dlvT9pAGADw566tgAhUFJ0ijgSXidnM5t5s2YtlcS/2BfyUfoglvt5csmwMXFjYhij/W0H+lPZurQmmEKeId2SG+727o1T79Gm55zkAQRAEQRAEYTohmKS9PWn54HBhJoACQBUfAuq5+Cew3CK0Y5C2rB0fp6swQRMLQDz+TO3BeVyyXXccoWDQLhQmFQgJJiC6sbGGEIlh203HIgQSlkFVgxHQ9UoTOOMegIfJ5Aqy8ArcFoaA3xeSG436GXDENQDR6OaCfUdj7jmLEBMpUGxjODn5kcnp9crJrFfRFezFFMOs+1isSP750Fpb0047wAnXAIQiixtOSvfHFFA36JUy2XRaa1WrRn++2Wz2NK2iRVeWql0LVPvFJPc/Q3I3pO3uliGVosDBjc/kuJy7jxHMuOcCHnSUSqWMf33H+cw5xrL15wiRpMTh4QJwwi0A2CerA2MLqtddfJ9zjOyTi+45A9k/m5xwCwAl5sDzbJrN4qjfPSekOXgueRY44ZcBQ+mfz+fbI34VKplM47pzscQtAPeFDP+p39n0J5iAqc8AEQCYclMfAG7l8Hpi8wXckdMn6PbM9uksLsAIi6hxsK8F7KZH1DCiGPAc3BUlimQXSCGLLl9Uhu/fnbOuCdgGwL749c/fHmOKVGDMqQzVYi2o776pswwC0wBc3HkOF3/Jzgj/z2PMskfA7h2wtTWz3iVP3VNO+duWya+329ut/f19C25JjcfVgORb6/cO+1o6PapUBpfL42KWAQ/8CzHJ1dBwLv7lzpPvHw8OOqkxU7ajaZ2zeqUaDEfm3T0C7POYjVqRSRYw+xlE1PK5xw2rnR/nrl/BcrJo4G8RYx4YYRYARZYGSlYtl9OAEbs6bLnHLKvD+7IQYpFJVxJLYZhyIgAw5UQAgBe7LoB7gFkAnF1d93jxwxdmrWxnSewe90yrBYwwCwDFZt099gZRnEkW2OeYw96B/UUPkkZusd+EWZp6IhGqEHS5heXsCQYKpXA4tGaMtblpX/hiyZoL10qPhld+fh/OlstlJosjph2h1UQiJoOyBByZIJcK2a9/gBGmL8FCNltg+XwOc1pkr3eSBWCI9ZuaNvVa3R8OYQySHxhy7vyr58kcowrzErem6JbdIGm1yGrXLpOHK8VROT2FGZB0Xe5pw/uFgiAIgiAIgiAIgiAI4/oLaQBI2smc1O8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span.-edit-wallet[_ngcontent-%COMP%]::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMiSURBVHgB7ZnbcdNAFIbPSvYzpgJEBfaSgdeYDkwFhA5CBXFKoIIkHdABziszILkCnArwc8bSco4jT1aypGgvkjzD+R680lq3/9fZsxcBMAzDMAzDMAzzPyLghIjjeILFAh/rXAFEVIflNgDxHSC7l1JuwDMnYwCKXygQN7g5qTtGgFhKOb0Gj5yEAXG8vlKglm2OxYi4PZOzL+CJwQ0wEX/ApwmDGlAjfot131BkQu1/BMEU9y8hzwkHfJkwmAF14negPn6QMikeG0eYH35AByYMYoCJ+OdzujEhgJ6pa/OY4S/rxBPUBQo0CDc3xfPg4lec3IAlvUbACwmvMQKer1EdCSme+17KFRjSWwQ0hL3EQL7D7ckIhf2M41nTdeoiIQRxBRb0EgFt2vzvOL7Fx/kMZpHwR69DY96ajhY7j4C2Ce+dlBemkYDFSq8Lw3AKhnRqgGm2NzUBlHrQdx8f09dgSGcG2HR1hJEJQrzRd1VYzAtt6MQAW/EH2phAOQCLuV43ghMwwFX8gSYTtK5QZ2UzXfbaC1RlZrAQr1PuHcb7ucLxOIC6U5t7eI0ApWBZqnIST5QjoXo4rK5t7+G3CYj9m9LZ0hsDR3QToEL8mZRLsMSbARj+84rqfVvNE5bLtSNaJivXu4onvBmQZVDM1Erd4y+FpZMJ9bNAd/GEzyYQ6TuYD1b5mN3ahK7FE94MEIEoDEPH4zDGbmlra0If4gmfEVBoAmmarqm0MaEv8YQXA/JBir6cvdUHJSYm9Cme8GJAkBYfFp6EFmhjQt/iCS8GCFEMf5WpddVxTSYMIZ7wkwNKCRAT4nn+meuIGhPmQ4gn/EQAHDWBWS6syYRP8DR7i4YSTzhPhkgkCvhb83eSv21ijn7j/F2hOftpbFR3zb7EEyNwp2nVZlY0R8FL9CmecG4CR0Nge+iT2Nc+xRPOEVDuAQzZ0DfAAMQKrbzDWZ/zzNEUZwOUEK9aJBIShuv5lPlFsoNsjTdO5ACCy7gbgPN0/Ky10KowlHG5OlMPKoAktFyq6gsvS2I0iNlhVj+Vt8owDMMwDMMwDMMwDNPEPw5aH3llqGexAAAAAElFTkSuQmCC)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover{color:rgba(30,34,39,.5)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-new-address::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-hide-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI5QTAxQTVDNzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI5QTAxQTVENzBERTExRTg4MkJCOEU1MUQyMjM4MDJGIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjlBMDFBNUE3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjlBMDFBNUI3MERFMTFFODgyQkI4RTUxRDIyMzgwMkYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5A1duRAAACq0lEQVR42uyb3W3CMBCATdUBzAZhAmACYIKm75WgE0AHqAjqAJQJmkp9L0xQOgF0ArJBPUAlakuHhKwzzo+tGOVOugcMcXyfz5e7i2gdj0fWZLlhDRcCQAAIAAEgAASAABAAAkAACAABIABNlNuqE/w9f+T9KZcaSx1I7UmNYEyJkJpJ3UvdSt3AmN2Al4d6AeQQZehM6vjMYAxOD3QCY6nUBYC5yiOgjFpKPUidXjDeJBO4dlni2toBqF3fwc5XlRnMFV0LAOXGX4YFC3DrkdSO1BZoG8ZWBpePYM5e6ADUQj8R4zMwUBmaQKDLNDBb2G0F5hEBYZo7GADcsPNqV/tgYF5J4ZqVwRN4iADmiPEL2FVRYj4B1y4QCPPQAERIwFuBu1eVBPGEmauj4ApAgpz5xKF3JUhMmIUCgEOSoy9YOAQgIDCey9hFLHABIEZ2/93D43WrQeXIvWsBMNQ+bzxml3osGIQAoKt9XnsEsEWSrtoB6NF4j5zVX6nHgnpAYktmuXdtQVAPWHpA5CXBvloABBEEiwIqGv29igsAwuKWTyVreoFkgdw1IBcAbOcy1Sq/vNqGay8FvSwEAD+Wx6JLiS0BtxYA+qNp6hHAneXetQBYIxmaDy+YIMdrEwIAgaS+b8xtH48jJXAaShBkyPPaac1+odcQTDmcGWr2uSPjsV5DFhIAU82uxsq2tU9tda+9BpcA1HkcGRoXOySvt1WYWFs9g3uIEAGcFnhvSI5SKHBewUCufT8Ed1eFE9ZcNc1dSXy8GtvDLmFGRJAnTEuAHTEPr8l8FUNqoVhbu2wTpM88vSP0WQ2e2todVrxFJsDwDivfVq/tCGDeMAFDYjjrXWZ+Pf6NZJfepEX/F2i4EAACQAAIAAEgAASAABAAAkAACAABaKL8CzAAuPuelr6IAx8AAAAASUVORK5CYII=)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-show-empty::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAM+SURBVHgB7ZnRbdswEIZ/OxnAnSAyMkDTCZpM0HSCJBMkncAU0AGSCepO0HSCJhMkfW4LMS999msBV+5RlGuLlGTJPBoBch9Aw6JESjwe745HQBAEQRAEQRAEQRCEl8YAuyJTI/zFKfbwlq6OqCRURuXdGRVN5ZGeuadnbjFWM+yA+ALIVEK/l1TOsRpwF6ZUUhKERkTiCcDMODChcoUwrkkIHxCJOAKws/4NVs050FROYmjDENxkyqzvpsGbdZ3CDAYY04AGRQFeFXU5bmAH65IUfdq+WeHVgOaZ11QuaLB36EKmzmGXT1LTD6sm8GmAXfP+4O2svuk8eMNYTYs2tu06Cawm9DGmreyDD3/GclL3Q6WwDdYNXtFgZ2XfS5LymsUw8iwBq/pZpc7M3qFq9gBP6RnyxTWMXRgOFA4mnxuf/aWuSVcvndoxx1LgWgIT51pTz6q1Rb4w940qJ6UgmrF96Wr7YPdadh2KXY/nTm3aIZJL1v63r2nb10WlbogzDlsQLgAT3lbRpRHjxRrRdaGOat7dm3AB2Nh+RY6viMdN67u3gMMGHDk93iIed2h79xZwuMHEuX6sXK2sfft6zdTCqdE13kFveHdvODSgOjDX+K2sfV987+C7vWdgBDcT8pHRcwIcAqh+5O+PB859E7FpbNdvWqnx3V6wgDhsgMa6MfozH9Pv0/9r6xKnXit3zdtd4SaOat4dRLgGLPC9cp3jGLHIPb//iEDCBZA7rsmP2fkY4p1Tc49AOAIh4/erEVqmjsHNzyJHkDi1wTFHuACM28vh7uQ+dYjT14WmW580fe15G64pR+aYxw0O4e7mEvg7RJeld/CtvU9ddmhTm07wpcRq9+wUyY0nYR/6lE7KYGrFplxDD/gEYFX+Af5MGe1Ie6trc1pdw6bYWIIkvkjQfpDJ9mrnjhnAQ2nEuvGjMKIPqB/8CeepEf+5gE1df0H9RkXDWO45bZn3yYcvB2JSanN6fn9A29uFGfSooe17ahPs+9eRgxHEwH5oXVq7P6u0ukYEdnM4uqCk5oByeN2xscWwOBfUiEh8ASyxVv2UhHFMb32NpuNxG97u7HhcEARBEARBEARBEISXxz+STv7SiHuLFAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-enable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKESURBVHgB7ZnRbdswEIb/o+33jKAiddG3Ogsk1gTpBk0nqDtBnQkaT5B0groTKG0HqB6LukE0Qt6d6ELSChIqhm0IR8GB7wMEmLR00h2P1P0UoCiKoiiKoiiKouwehBbhLNmD6X0A0RDMA9uVVH/ltq8AY0pH/76hRVoLAGf772HMuf25t+bUwj7WuK1AGLQA/+p/tc5/x3rnHYm94oJ/v/mCFoieAd6RksdoAuGMDmefEZGoGcBZ/2SJ8ze279QeKR3NyB0ocWCP5ynPGPmpE5GoGcA/+9d4XOgcBcp5SmlRLD0/e5vA3GW1a2zA5q/sNTeIQLQM8KMfOoJVzjso/WsD1EnhnH7ErhvdE0Qi3hTo8HHQZlyscv6BRRB4EvaaISIRLwBMg7CNCTbnMmgZfodIxFwEk6cNSmc5NoTS/5erbEnSSh2wzex8ALpoCftKZGwh4hngBI8vfaXtWpteTAkjWghVas8VMgPEIa9qCbGiSDYDOj0nYGI5D297cQ8xxDKgKmOva92uqPkI3OZNRq2S0G46JcEfTkc8f1U2Qi4DzN241uPq/gP3oE1TltKrqbPhbQWwmEASnAK1ao3KkcRc9TZ8Fj3BmGMIIRiAsPSlw6sfEOO2XkUmEOJFFEKxpLBDS2HsOBoA7DgaAEQihnCJgWQAirDZFdMES7bGN95dWodcAMoyLHwMnUtkwUJhmlBe8zYGADStdVhx1PvT9MOG31fIXg+dDdQrP56fQgjh/YD9MztanxCTspxYkTSCEMKLoFeEYum5hLy6hxiiAVgot3nqRgnSOJvCu0GOaN8G/QaJGy2yMpmo2RuB7ZuF3eJKU6kNEEVRFEVRFEVRFEVRlHvYheXBAEeGBAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-disable-encryption::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAKZSURBVHgB7ZlRbtpAEIb/NfCeI1ClVH0ruUATnyA9QnqCNidIOEHCCUhP0OQETtsDlMdKtApHyDuxpzNrV8EGAXJnLSLPJ1liF1h7/p3dnRkDhmEYhmEYRjtxaBBK+gdA9wyd6BhEQ+7qF19N4dwcKd25eHaDBmlMAEoOPyCKJvzxYMtP58gwakqICA1A3wdXbPxXbDde6PNTTejHmws0QHAP8IZkdIk6OFy797NzBCSoB1AyOFtj/CP3jfiK3fHMycUuf8TXl9UB8NkvnYAE9QD6NnjA80Yn8PpexC6ez9f+PnnL7p8mlf+wYItX/J9HBCCYB/jZLxuCTcYLLv7FAnViiNHP5CdHIMItgQ6dltqEm03G/yMXgcbl3ugEgQgnALlhuY0xdue+1IroHQIRchPsLzf4XJ9iR1z8+37TWJo0EgfsM13sKf54bIDWe4AJgJbTegGCbTQcBhP+H64T8JUuRrsEUXVQF8AXPTq9C0lkoAlnhoUQqjmBqgDe+KgnycwQYZgW+YSaCLp7gMx8OOPhx87voYaaBxSp7EOlWxKbj8DTtM6sFWW0K6xklVxLWA2Xa6HnAZ20OjOS+x/Jg9Z1WRf/uZUx/FglSK1IoicAVVw/y8411qofw3vRElF0CiU094CSAH721HiqZpJ9KPEiAqFQ5TDBQmG0HBMALccEQCDyN8H7j6YA83Kzq5YTrHk9tnOFeRt6AmTZXXlkN9HwgjzD9PnAUuc+CgBXjfw4Oer9rPtyUwyn5PWJjIFq5EeLEZRQrgccXvNsfUJIsmzMYbZasUV5E0wvobg+1zAt7qGGqgB55raIZZagjYypXA0SwhVFpUAis+X4xaZz9U4E4pOFZHN1t1oFEMMwDMMwDMMwDMMwjL+78e87Hb4jwAAAAABJRU5ErkJggg==)}.-actions[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:hover.-edit-wallet::before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMSSURBVHgB7ZrRcdpAEIb/w/BOB1EHIY8Z4gQ6oIM4FWRSgU0HSQXGJaQCMCTPIRUEVxA9Z4DLrrBmJCFpdNLqxIz3mzE6nWWs/7+93TsBoCiKoiiKoijKS8TgkljaIa4wQw8fYBE894bU/o4DVpiaHYS5HAPWdkZ3c0+tYclVd7g2cwhyGQZs7C1YXBUMFnhnPkGI7g1wER8jaEK3BuSJtzTnDb7RcUtHnv8j6v1M7SB1nZAJ3RlQJP6AKSW7bap/aQNKjss2TOjGABfxMS2Z0INviuf8l0LxDJdANshil+q3uMEPe4+a+I2A8oQX0nBMMS4xgSmKBLKISuQKjviLgKKw3+MNHR/A9f9Iwn7aUen7FEUCcIsa+ImAKnN+bRd0Nx/hEgl9/En19SgqxuYJDrQfAVUT3ntz4xwJoOVxkgNFkyPtGuCa7V1NsMiO9hCOtGdAnVLHuJhg8CpzvoMj7RhQV3xMFRM4BwCTVN/+EgxoKj6mzAQWP6C+NLW2y7JVIC8z1xGfJFsd/tGRxdvMOqBHCXDs/j/6kGRAtdgmzpuKZzgS1haRCRwJg2iDFGSumtcRz8hOAV6Wpt89BKKfZiSnQ574a3OHmsgZsLGTsz6+WQ7XU8KqD/89PyY7p5F4Rs6A7MhYPNLrtrEJccITHvkYSQNGmfMVlaUpmpjQsnhGzoAeXqfODQmfmrC2CR7EM5JJMB0BB5yych0TPIlnZAxYRouU5Do8TC1KXEzwKJ6RMeDq7GbPa3IVEzyLZ2QMyCbAI37nXldmQgfiGRkDsgmQazZ/zJVHngm8huhAPCOzF9jYX8gmQRa4j5bB+SvB4hGPaV0809wAHuk+/hb8dvs82pwnJvQaRNFypLYpFM54Ec803wz1UfbUZnRmDm+Wym33Jp5pbgAnQImJZKPt7pw+5PgKjzQ3gEPaoh78aNtEyfCRFk4L2vU13zk6IhEBwwrXhNHzOhbLJdJEuWFbmCA9ImHAAwmaJc5Z7IpaT9EnvANqv5X/ZocUMmXw9CgsuJRRVRRFURRFURRFURRFKeM/oxaTpik5gaYAAAAASUVORK5CYII=)}@-webkit-keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}@keyframes floatup{50%{opacity:1}100%{-webkit-transform:translateY(-20px);transform:translateY(-20px);opacity:0}}.copy-label[_ngcontent-%COMP%]{color:#0072ff;opacity:0;font-size:12px;position:relative;padding-left:10px}.copy-label[_ngcontent-%COMP%]::after{content:attr(data-label);position:absolute;top:0;left:4px;opacity:0;line-height:1}.copying[_ngcontent-%COMP%] .copy-label[_ngcontent-%COMP%]::after{-webkit-animation:.5s ease-in-out floatup;animation:.5s ease-in-out floatup}"]],data:{}});function af(t){return r._33(0,[(t()(),r._9(0,0,null,null,52,"div",[["class","-row -detail"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-width-70 -grey"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,13,"div",[["class","-flex-fill -address -grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.parent.context.$implicit.address)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,8,"span",[],null,[[null,"click"],[null,"mouseleave"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.copyAddress(n,t.parent.context.$implicit)&&r),"mouseleave"===e&&(r=0!=(t.parent.context.$implicit.copying=!1)&&r),r},null,null)),r._8(10,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(11,{copying:0}),(t()(),r._31(12,null,["\n ","\n "])),(t()(),r._9(13,0,null,null,3,"span",[["class","copy-label"]],[[1,"data-label",0]],null,null,null,null)),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(15,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(21,null,["",""])),r._27(22,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(t()(),r._31(25,null,["",""])),r._27(26,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(28,0,null,null,23,"div",[["class","-width-70 -options"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,16777216,null,null,3,"mat-icon",[["aria-haspopup","true"],["class","mat-icon"],["role","img"]],null,[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,32)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,32)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,32)._handleClick(n)&&i),i},Zp,Xp)),r._8(31,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(32,1196032,null,0,Pu,[eo,r.l,r.R,Du,[2,Ou],[8,null],[2,vi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["more_vert"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,15,"mat-menu",[["class","compact"]],null,null,null,ef,$p)),r._8(36,1228800,[["optionsMenu",4]],1,Ou,[r.l,r.B,Tu],{overlapTrigger:[0,"overlapTrigger"],panelClass:[1,"panelClass"]},null),r._29(603979776,1,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(39,0,null,0,3,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0,o=t.component;return"click"===e&&(i=!1!==r._22(t,40)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,40)._emitHoverEvent()&&i),"click"===e&&(i=!1!==o.copyAddress(n,t.parent.context.$implicit,1e3)&&i),i},rf,nf)),r._8(40,180224,[[1,4]],0,Su,[r.l],null,null),(t()(),r._31(41,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(44,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"],["routerLink","/settings/outputs"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,45)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,45)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,46).onClick()&&i),i},rf,nf)),r._8(45,180224,[[1,4]],0,Su,[r.l],null,null),r._8(46,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{queryParams:[0,"queryParams"],routerLink:[1,"routerLink"]},null),r._26(47,{addr:0}),(t()(),r._31(48,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,10,0,t(e,11,0,e.parent.context.$implicit.copying)),t(e,31,0),t(e,32,0,r._22(e,36)),t(e,36,0,!1,"compact"),t(e,46,0,t(e,47,0,e.parent.context.$implicit.address),"/settings/outputs")},function(t,e){t(e,3,0,e.parent.context.index+1),t(e,12,0,e.parent.context.$implicit.address),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("wallet.address.copied"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wallet.address.copy"))),t(e,21,0,r._32(e,21,0,t(e,22,0,r._22(e.parent.parent,0),e.parent.context.$implicit.coins?e.parent.context.$implicit.coins:0,"1.0-6"))),t(e,25,0,r._32(e,25,0,t(e,26,0,r._22(e.parent.parent,0),e.parent.context.$implicit.hours?e.parent.context.$implicit.hours:0,"1.0-6"))),t(e,39,0,r._22(e,40)._highlighted,r._22(e,40)._triggersSubmenu,r._22(e,40)._getTabIndex(),r._22(e,40).disabled.toString(),r._22(e,40).disabled||null),t(e,41,0,r._32(e,41,0,r._22(e,42).transform("wallet.address."+(e.parent.context.$implicit.copying?"copied":"copy-address")))),t(e,44,0,r._22(e,45)._highlighted,r._22(e,45)._triggersSubmenu,r._22(e,45)._getTabIndex(),r._22(e,45).disabled.toString(),r._22(e,45).disabled||null),t(e,48,0,r._32(e,48,0,r._22(e,49).transform("wallet.address.outputs")))})}function uf(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,af)),r._8(3,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.wallet.hideEmpty||e.context.$implicit.coins)},null)}function cf(t){return r._33(0,[r._25(0,St,[r.w]),(t()(),r._9(1,0,null,null,35,"div",[["class","-row -actions"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,5,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.newAddress()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"span",[["class","-img -new-address"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEmpty()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,4,"span",[],null,null,null,null,null)),r._8(13,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(14,{"-img":0,"-show-empty":1,"-hide-empty":2}),(t()(),r._31(15,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,7,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleEncryption()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,4,"span",[],null,null,null,null,null)),r._8(24,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(25,{"-img":0,"-enable-encryption":1,"-disable-encryption":2}),(t()(),r._31(26,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,5,"div",[["class","-button"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.editWallet()&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"span",[["class","-img -edit-wallet"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._4(16777216,null,null,1,null,uf)),r._8(39,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,13,0,t(e,14,0,!0,n.wallet.hideEmpty,!n.wallet.hideEmpty)),t(e,24,0,t(e,25,0,!0,!n.wallet.encrypted,n.wallet.encrypted)),t(e,39,0,n.wallet?n.wallet.addresses:r._3)},function(t,e){var n=e.component;t(e,6,0,r._32(e,6,0,r._22(e,7).transform("wallet.new-address"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wallet."+(n.wallet.hideEmpty?"show":"hide")+"-empty"))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("wallet."+(n.wallet.encrypted?"decrypt":"encrypt")))),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("wallet.edit")))})}var df=r._7({encapsulation:2,styles:[".mat-progress-bar{display:block;height:5px;overflow:hidden;position:relative;transition:opacity 250ms linear;width:100%}.mat-progress-bar .mat-progress-bar-element,.mat-progress-bar .mat-progress-bar-fill::after{height:100%;position:absolute;width:100%}.mat-progress-bar .mat-progress-bar-background{background-repeat:repeat-x;background-size:10px 4px;display:none}.mat-progress-bar .mat-progress-bar-buffer{transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-secondary{display:none}.mat-progress-bar .mat-progress-bar-fill{animation:none;transform-origin:top left;transition:transform 250ms ease}.mat-progress-bar .mat-progress-bar-fill::after{animation:none;content:'';display:inline-block;left:0}.mat-progress-bar[dir=rtl],[dir=rtl] .mat-progress-bar{transform:rotateY(180deg)}.mat-progress-bar[mode=query]{transform:rotateZ(180deg)}.mat-progress-bar[mode=query][dir=rtl],[dir=rtl] .mat-progress-bar[mode=query]{transform:rotateZ(180deg) rotateY(180deg)}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-fill,.mat-progress-bar[mode=query] .mat-progress-bar-fill{transition:none}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary,.mat-progress-bar[mode=query] .mat-progress-bar-primary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-translate 2s infinite linear;left:-145.166611%}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-primary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-primary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-primary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary,.mat-progress-bar[mode=query] .mat-progress-bar-secondary{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-translate 2s infinite linear;left:-54.888891%;display:block}.mat-progress-bar[mode=indeterminate] .mat-progress-bar-secondary.mat-progress-bar-fill::after,.mat-progress-bar[mode=query] .mat-progress-bar-secondary.mat-progress-bar-fill::after{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-secondary-indeterminate-scale 2s infinite linear}.mat-progress-bar[mode=buffer] .mat-progress-bar-background{-webkit-backface-visibility:hidden;backface-visibility:hidden;animation:mat-progress-bar-background-scroll 250ms infinite linear;display:block}@keyframes mat-progress-bar-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(.5,0,.70173,.49582);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(.30244,.38135,.55,.95635);transform:translateX(83.67142%)}100%{transform:translateX(200.61106%)}}@keyframes mat-progress-bar-primary-indeterminate-scale{0%{transform:scaleX(.08)}36.65%{animation-timing-function:cubic-bezier(.33473,.12482,.78584,1);transform:scaleX(.08)}69.15%{animation-timing-function:cubic-bezier(.06,.11,.6,1);transform:scaleX(.66148)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:translateX(37.65191%)}48.35%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:translateX(84.38617%)}100%{transform:translateX(160.27778%)}}@keyframes mat-progress-bar-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(.15,0,.51506,.40969);transform:scaleX(.08)}19.15%{animation-timing-function:cubic-bezier(.31033,.28406,.8,.73371);transform:scaleX(.4571)}44.15%{animation-timing-function:cubic-bezier(.4,.62704,.6,.90203);transform:scaleX(.72796)}100%{transform:scaleX(.08)}}@keyframes mat-progress-bar-background-scroll{to{transform:translateX(-10px)}}"],data:{}});function hf(t){return r._33(2,[(t()(),r._9(0,0,null,null,0,"div",[["class","mat-progress-bar-background mat-progress-bar-element"]],null,null,null,null,null)),(t()(),r._9(1,0,null,null,1,"div",[["class","mat-progress-bar-buffer mat-progress-bar-element"]],null,null,null,null,null)),r._8(2,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(3,0,null,null,1,"div",[["class","mat-progress-bar-primary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null)),r._8(4,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(5,0,null,null,0,"div",[["class","mat-progress-bar-secondary mat-progress-bar-fill mat-progress-bar-element"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,2,0,n._bufferTransform()),t(e,4,0,n._primaryTransform())},null)}var pf=r._7({encapsulation:2,styles:[".mat-toolbar-row,.mat-toolbar-single-row{display:flex;box-sizing:border-box;padding:0 16px;width:100%;flex-direction:row;align-items:center;white-space:nowrap}.mat-toolbar-multiple-rows{display:flex;box-sizing:border-box;flex-direction:column;width:100%}.mat-toolbar-multiple-rows{min-height:64px}.mat-toolbar-row,.mat-toolbar-single-row{height:64px}@media (max-width:600px){.mat-toolbar-multiple-rows{min-height:56px}.mat-toolbar-row,.mat-toolbar-single-row{height:56px}}"],data:{}});function ff(t){return r._33(2,[r._21(null,0),r._21(null,1)],null,null)}var _f=r._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function mf(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(3,212992,null,0,qo,[r.l,r.B,ei,[2,Jo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,3,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,2,0,n._isRoundButton||n._isIconButton,r._22(e,3).unbounded)})}var gf=r._7({encapsulation:2,styles:[".mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{box-sizing:border-box;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;outline:0;border:none;-webkit-tap-highlight-color:transparent;display:inline-block;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;margin:0;min-width:88px;line-height:36px;padding:0 16px;border-radius:2px}[disabled].mat-button,[disabled].mat-fab,[disabled].mat-icon-button,[disabled].mat-mini-fab,[disabled].mat-raised-button{cursor:default}.cdk-keyboard-focused.mat-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-icon-button .mat-button-focus-overlay,.cdk-keyboard-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-keyboard-focused.mat-raised-button .mat-button-focus-overlay,.cdk-program-focused.mat-button .mat-button-focus-overlay,.cdk-program-focused.mat-fab .mat-button-focus-overlay,.cdk-program-focused.mat-icon-button .mat-button-focus-overlay,.cdk-program-focused.mat-mini-fab .mat-button-focus-overlay,.cdk-program-focused.mat-raised-button .mat-button-focus-overlay{opacity:1}.mat-button::-moz-focus-inner,.mat-fab::-moz-focus-inner,.mat-icon-button::-moz-focus-inner,.mat-mini-fab::-moz-focus-inner,.mat-raised-button::-moz-focus-inner{border:0}.mat-fab,.mat-mini-fab,.mat-raised-button{transform:translate3d(0,0,0);transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1)}.mat-fab:not([class*=mat-elevation-z]),.mat-mini-fab:not([class*=mat-elevation-z]),.mat-raised-button:not([class*=mat-elevation-z]){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]),.mat-raised-button:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}[disabled].mat-fab,[disabled].mat-mini-fab,[disabled].mat-raised-button{box-shadow:none}.mat-button .mat-button-focus-overlay,.mat-icon-button .mat-button-focus-overlay{transition:none;opacity:0}.mat-button:hover .mat-button-focus-overlay{opacity:1}.mat-fab{min-width:0;border-radius:50%;width:56px;height:56px;padding:0;flex-shrink:0}.mat-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-fab .mat-button-wrapper{padding:16px 0;display:inline-block;line-height:24px}.mat-mini-fab{min-width:0;border-radius:50%;width:40px;height:40px;padding:0;flex-shrink:0}.mat-mini-fab:not([class*=mat-elevation-z]){box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-mini-fab:not([disabled]):active:not([class*=mat-elevation-z]){box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-mini-fab .mat-button-wrapper{padding:8px 0;display:inline-block;line-height:24px}.mat-icon-button{padding:0;min-width:0;width:40px;height:40px;flex-shrink:0;line-height:40px;border-radius:50%}.mat-icon-button .mat-icon,.mat-icon-button i{line-height:24px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{color:currentColor}.mat-button .mat-button-wrapper>*,.mat-fab .mat-button-wrapper>*,.mat-icon-button .mat-button-wrapper>*,.mat-mini-fab .mat-button-wrapper>*,.mat-raised-button .mat-button-wrapper>*{vertical-align:middle}.mat-button-focus-overlay,.mat-button-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-focus-overlay{background-color:rgba(0,0,0,.12);border-radius:inherit;opacity:0;transition:opacity .2s cubic-bezier(.35,0,.25,1),background-color .2s cubic-bezier(.35,0,.25,1)}@media screen and (-ms-high-contrast:active){.mat-button-focus-overlay{background-color:rgba(255,255,255,.5)}}.mat-button-ripple-round{border-radius:50%;z-index:1}@media screen and (-ms-high-contrast:active){.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{outline:solid 1px}}"],data:{}});function yf(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-button-wrapper"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-button-ripple mat-ripple"],["matRipple",""]],[[2,"mat-button-ripple-round",null],[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(3,212992,null,0,qo,[r.l,r.B,ei,[2,Jo]],{centered:[0,"centered"],disabled:[1,"disabled"],trigger:[2,"trigger"]},null),(t()(),r._9(4,0,null,null,0,"div",[["class","mat-button-focus-overlay"]],null,null,null,null,null))],function(t,e){var n=e.component;t(e,3,0,n._isIconButton,n._isRippleDisabled(),n._getHostElement())},function(t,e){var n=e.component;t(e,2,0,n._isRoundButton||n._isIconButton,r._22(e,3).unbounded)})}var vf=function(t){this.appService=t},bf=r._7({encapsulation:0,styles:[["[_nghost-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;color:#fafafa;width:100%}.buttons-left[_ngcontent-%COMP%]{display:inline-block;padding:0 10px;width:120px}.title[_ngcontent-%COMP%]{font-size:13px;font-weight:700;display:inline;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;letter-spacing:1px;line-height:50px;text-align:center}.buttons-right[_ngcontent-%COMP%]{display:inline-block;text-align:right;width:120px}.buttons-right[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{height:50px;width:50px}.color-primary[_ngcontent-%COMP%]{color:#0072ff}"]],data:{}});function wf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,1)._emitHoverEvent()&&i),i},rf,nf)),r._8(1,180224,[[1,4]],0,Su,[r.l],{disabled:[0,"disabled"]},null),(t()(),r._31(2,0,[" v"," "]))],function(t,e){t(e,1,0,!0)},function(t,e){var n=e.component;t(e,0,0,r._22(e,1)._highlighted,r._22(e,1)._triggersSubmenu,r._22(e,1)._getTabIndex(),r._22(e,1).disabled.toString(),r._22(e,1).disabled||null),t(e,2,0,n.appService.version.version)})}function Mf(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"div",[["class","buttons-left"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(2,0,null,null,1,"div",[["class","title"]],null,null,null,null,null)),(t()(),r._31(3,null,["\n ","\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(5,0,null,null,74,"div",[["class","buttons-right"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,34,"mat-menu",[],null,null,null,ef,$p)),r._8(8,1228800,[["settingsMenu",4]],1,Ou,[r.l,r.B,Tu],{overlapTrigger:[0,"overlapTrigger"]},null),r._29(603979776,1,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(11,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,12)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,12)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,13).onClick()&&i),i},rf,nf)),r._8(12,180224,[[1,4]],0,Su,[r.l],null,null),r._8(13,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(14,1),(t()(),r._31(15,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(18,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,19)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,19)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,20).onClick()&&i),i},rf,nf)),r._8(19,180224,[[1,4]],0,Su,[r.l],null,null),r._8(20,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(21,1),(t()(),r._31(22,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(25,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,26)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,26)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,27).onClick()&&i),i},rf,nf)),r._8(26,180224,[[1,4]],0,Su,[r.l],null,null),r._8(27,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(28,1),(t()(),r._31(29,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(32,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,33)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,33)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,34).onClick()&&i),i},rf,nf)),r._8(33,180224,[[1,4]],0,Su,[r.l],null,null),r._8(34,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(35,1),(t()(),r._31(36,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,wf)),r._8(40,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(43,0,null,null,15,"mat-menu",[],null,null,null,ef,$p)),r._8(44,1228800,[["menuMenu",4]],1,Ou,[r.l,r.B,Tu],{overlapTrigger:[0,"overlapTrigger"]},null),r._29(603979776,2,{items:1}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(47,0,null,0,5,"button",[["class","mat-menu-item"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,48)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,48)._emitHoverEvent()&&i),"click"===e&&(i=!1!==r._22(t,49).onClick()&&i),i},rf,nf)),r._8(48,180224,[[2,4]],0,Su,[r.l],null,null),r._8(49,16384,null,0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._24(50,1),(t()(),r._31(51,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(54,0,null,0,3,"a",[["class","color-primary mat-menu-item"],["href","https://explorer.skycoin.net"],["mat-menu-item",""],["role","menuitem"]],[[2,"mat-menu-item-highlighted",null],[2,"mat-menu-item-submenu-trigger",null],[1,"tabindex",0],[1,"aria-disabled",0],[1,"disabled",0]],[[null,"click"],[null,"mouseenter"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,55)._checkDisabled(n)&&i),"mouseenter"===e&&(i=!1!==r._22(t,55)._emitHoverEvent()&&i),i},rf,nf)),r._8(55,180224,[[2,4]],0,Su,[r.l],null,null),(t()(),r._31(56,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(60,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,63)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,63)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,63)._handleClick(n)&&i),i},mf,_f)),r._8(61,180224,null,0,ha,[r.l,ei,Do],null,null),r._8(62,16384,null,0,da,[],null,null),r._8(63,1196032,null,0,Pu,[eo,r.l,r.R,Du,[2,Ou],[8,null],[2,vi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(65,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(66,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["settings"])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(70,16777216,null,null,8,"button",[["aria-haspopup","true"],["class","mat-icon-button"],["mat-icon-button",""]],[[8,"disabled",0]],[[null,"mousedown"],[null,"keydown"],[null,"click"]],function(t,e,n){var i=!0;return"mousedown"===e&&(i=!1!==r._22(t,73)._handleMousedown(n)&&i),"keydown"===e&&(i=!1!==r._22(t,73)._handleKeydown(n)&&i),"click"===e&&(i=!1!==r._22(t,73)._handleClick(n)&&i),i},mf,_f)),r._8(71,180224,null,0,ha,[r.l,ei,Do],null,null),r._8(72,16384,null,0,da,[],null,null),r._8(73,1196032,null,0,Pu,[eo,r.l,r.R,Du,[2,Ou],[8,null],[2,vi]],{menu:[0,"menu"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(75,0,null,0,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(76,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["menu"])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,8,0,!1),t(e,13,0,t(e,14,0,"/settings/network")),t(e,20,0,t(e,21,0,"/settings/blockchain")),t(e,27,0,t(e,28,0,"/settings/outputs")),t(e,34,0,t(e,35,0,"/settings/pending-transactions")),t(e,40,0,n.appService.version),t(e,44,0,!1),t(e,49,0,t(e,50,0,"/settings/backup")),t(e,63,0,r._22(e,8)),t(e,66,0),t(e,73,0,r._22(e,44)),t(e,76,0)},function(t,e){t(e,3,0,e.component.headline),t(e,11,0,r._22(e,12)._highlighted,r._22(e,12)._triggersSubmenu,r._22(e,12)._getTabIndex(),r._22(e,12).disabled.toString(),r._22(e,12).disabled||null),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("title.network"))),t(e,18,0,r._22(e,19)._highlighted,r._22(e,19)._triggersSubmenu,r._22(e,19)._getTabIndex(),r._22(e,19).disabled.toString(),r._22(e,19).disabled||null),t(e,22,0,r._32(e,22,0,r._22(e,23).transform("title.blockchain"))),t(e,25,0,r._22(e,26)._highlighted,r._22(e,26)._triggersSubmenu,r._22(e,26)._getTabIndex(),r._22(e,26).disabled.toString(),r._22(e,26).disabled||null),t(e,29,0,r._32(e,29,0,r._22(e,30).transform("title.outputs"))),t(e,32,0,r._22(e,33)._highlighted,r._22(e,33)._triggersSubmenu,r._22(e,33)._getTabIndex(),r._22(e,33).disabled.toString(),r._22(e,33).disabled||null),t(e,36,0,r._32(e,36,0,r._22(e,37).transform("title.pending-txs"))),t(e,47,0,r._22(e,48)._highlighted,r._22(e,48)._triggersSubmenu,r._22(e,48)._getTabIndex(),r._22(e,48).disabled.toString(),r._22(e,48).disabled||null),t(e,51,0,r._32(e,51,0,r._22(e,52).transform("title.backup"))),t(e,54,0,r._22(e,55)._highlighted,r._22(e,55)._triggersSubmenu,r._22(e,55)._getTabIndex(),r._22(e,55).disabled.toString(),r._22(e,55).disabled||null),t(e,56,0,r._32(e,56,0,r._22(e,57).transform("title.explorer"))),t(e,60,0,r._22(e,61).disabled||null),t(e,70,0,r._22(e,71).disabled||null)})}var kf=r._7({encapsulation:2,styles:[".mat-progress-spinner{display:block;position:relative}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate]{animation:mat-progress-spinner-linear-rotate 2s linear infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition-property:stroke;animation-duration:4s;animation-timing-function:cubic-bezier(.35,0,.25,1);animation-iteration-count:infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate]{animation:mat-progress-spinner-stroke-rotate-fallback 10s cubic-bezier(.87,.03,.33,1) infinite}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.60617px;transform:rotate(0)}12.5%{stroke-dashoffset:56.54867px;transform:rotate(0)}12.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(72.5deg)}25.1%{stroke-dashoffset:268.60617px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.54867px;transform:rotate(270deg)}37.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(161.5deg)}50.01%{stroke-dashoffset:268.60617px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.54867px;transform:rotate(180deg)}62.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(251.5deg)}75.01%{stroke-dashoffset:268.60617px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.54867px;transform:rotate(90deg)}87.51%{stroke-dashoffset:56.54867px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.60617px;transform:rotateX(180deg) rotate(341.5deg)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}"],data:{}});function xf(t){return r._33(2,[(t()(),r._9(0,0,null,null,1,":svg:svg",[["focusable","false"],["preserveAspectRatio","xMidYMid meet"]],[[4,"width","px"],[4,"height","px"],[1,"viewBox",0]],null,null,null,null)),(t()(),r._9(1,0,null,null,0,":svg:circle",[["cx","50%"],["cy","50%"]],[[1,"r",0],[4,"animation-name",null],[4,"stroke-dashoffset","px"],[4,"stroke-dasharray","px"],[4,"stroke-width","%"]],null,null,null,null))],null,function(t,e){var n=e.component;t(e,0,0,n._elementSize,n._elementSize,n._viewBox),t(e,1,0,n._circleRadius,"mat-progress-spinner-stroke-rotate-"+n.diameter,n._strokeDashOffset,n._strokeCircumference,n._circleStrokeWidth)})}var Lf=r._7({encapsulation:0,styles:[[".button-container[_ngcontent-%COMP%]{display:inline-block}button[_ngcontent-%COMP%]{border-radius:25px;height:50px;margin:20px 10px 0;width:160px;overflow:hidden}button.enabled[_ngcontent-%COMP%]{background-color:rgba(30,34,39,.05);-webkit-box-shadow:none;box-shadow:none;color:#1e2227}mat-icon[_ngcontent-%COMP%]{margin-left:10px;opacity:.3;line-height:20px}mat-spinner[_ngcontent-%COMP%]{display:inline-block;height:24px!important;width:24px!important;margin-left:10px;position:relative;top:-2px}"]],data:{}});function Cf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(1,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["done"]))],function(t,e){t(e,1,0)},null)}function Sf(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(1,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["error"]))],function(t,e){t(e,1,0)},null)}function Tf(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-spinner",[["class","in-button mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,xf,kf)),r._8(1,573440,null,0,Xu,[r.l,ei,[2,Pt]],null,null)],null,function(t,e){t(e,0,0,r._22(e,1)._elementSize,r._22(e,1)._elementSize)})}function Of(t){return r._33(0,[r._29(402653184,1,{tooltip:0}),(t()(),r._9(1,0,null,null,21,"div",[["class","button-container"]],null,[[null,"mouseenter"],[null,"mouseleave"]],function(t,e,n){var r=!0,i=t.component;return"mouseenter"===e&&(r=0!=(i.mouseOver=!0)&&r),"mouseleave"===e&&(r=0!=(i.mouseOver=!1)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,16777216,null,null,18,"button",[["class","mat-button mat-raised-button"],["color","primary"],["mat-button",""],["mat-raised-button",""],["type","submit"]],[[8,"disabled",0]],[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,9).show()&&i),"keydown"===e&&(i=!1!==r._22(t,9)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,9).hide(1500)&&i),"click"===e&&(i=!1!==(0!==o.state?o.onClick():null)&&i),i},mf,_f)),r._8(4,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(5,{enabled:0}),r._8(6,180224,null,0,ha,[r.l,ei,Do],{disabled:[0,"disabled"],color:[1,"color"]},null),r._8(7,16384,null,0,ua,[],null,null),r._8(8,16384,null,0,ca,[],null,null),r._8(9,147456,[[1,4],["tooltip",4]],0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),(t()(),r._31(-1,0,["\n "])),r._21(0,0),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Cf)),r._8(14,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Sf)),r._8(17,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,Tf)),r._8(20,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,t(e,5,0,!n.disabled)),t(e,6,0,n.disabled&&!n.forceEmitEvents,"primary"),t(e,9,0,n.error?n.error:null),t(e,14,0,1===n.state),t(e,17,0,2===n.state),t(e,20,0,0===n.state)},function(t,e){t(e,3,0,r._22(e,6).disabled||null)})}var Df=r._7({encapsulation:0,styles:[[".-small-button[_ngcontent-%COMP%] button{width:unset;height:unset;padding:0 10px;min-width:100px;margin:unset;font-size:13px}.-toggle[_ngcontent-%COMP%] button{-webkit-box-shadow:unset;box-shadow:unset;background-color:transparent!important;line-height:unset!important;min-height:26px}.-toggle[_ngcontent-%COMP%] button span{color:#171a1d;line-height:unset!important}.-toggle[_ngcontent-%COMP%] button.enabled{background-color:#171a1d!important}.-toggle[_ngcontent-%COMP%] button.enabled span{color:#fafafa}.-buttons-container[_ngcontent-%COMP%]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;padding:5px;background:rgba(255,255,255,.1);border-radius:100px;margin:0 auto;text-align:center}.light.-buttons-container[_ngcontent-%COMP%]{background:#f7f7f7}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled{background-color:#fff!important}.light[_ngcontent-%COMP%] .-toggle[_ngcontent-%COMP%] button.enabled span{color:#1e2227}"]],data:{}});function Yf(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[],[[8,"className",0]],null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onLeftClick()&&r),r},Of,Lf)),r._8(3,49152,null,0,xc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._31(4,0,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"app-button",[["class","-toggle dark -small-button"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.onRightClick()&&r),r},Of,Lf)),r._8(7,49152,null,0,xc,[],{disabled:[0,"disabled"],forceEmitEvents:[1,"forceEmitEvents"]},{action:"action"}),(t()(),r._31(8,0,["",""])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.activeButton!==n.ButtonState.LeftButton,!0),t(e,7,0,n.activeButton!==n.ButtonState.RightButton,!0)},function(t,e){var n=e.component;t(e,0,0,r._12(1,"-buttons-container ",n.className,"")),t(e,4,0,n.leftButtonText),t(e,8,0,n.rightButtonText)})}var Pf={otcEnabled:!1},Ef=function(){function t(t){this.navbarService=t,this.otcEnabled=Pf.otcEnabled}return t.prototype.changeActiveComponent=function(t){this.navbarService.setActiveComponent(t)},t}(),Af=r._7({encapsulation:0,styles:[["[_nghost-%COMP%]{background-color:#fbfbfb;min-height:66px}.-buttons[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%]{cursor:pointer;padding:0 20px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;float:left;height:66px;padding:17px 0;width:32px}.-buttons[_ngcontent-%COMP%] .-button[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{display:inline-block;font-size:14px;height:66px;line-height:66px;margin:0 5px}.-buttons[_ngcontent-%COMP%] .-low-opacity[_ngcontent-%COMP%]{opacity:.2}.-buttons[_ngcontent-%COMP%] .-switch[_ngcontent-%COMP%]{-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;padding:0 20px}"]],data:{}});function jf(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"div",[["class","-button"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,0,"img",[["src","../../../../../assets/img/money-gold.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[["class","secondary-color"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.buy-coin")))})}function If(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"app-double-button",[["class","-switch"],["className","light"]],null,[[null,"onStateChange"]],function(t,e,n){var r=!0;return"onStateChange"===e&&(r=!1!==t.component.changeActiveComponent(n)&&r),r},Yf,Df)),r._8(1,49152,null,0,Oc,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"],className:[3,"className"]},{onStateChange:"onStateChange"}),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,Ct,[r.h])],function(t,e){var n=e.component;t(e,1,0,r._32(e,1,0,r._22(e,2).transform(n.navbarService.rightText)),r._32(e,1,1,r._22(e,3).transform(n.navbarService.leftText)),r._32(e,1,2,r._22(e,4).transform(n.navbarService.activeComponent)),"light")},null)}function Rf(t){return r._33(0,[(t()(),r._9(0,0,null,null,51,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,48,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/wallets"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,5).onClick()&&i),i},null,null)),r._8(5,16384,[[1,4]],0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(6,1720320,null,2,Wh,[Hh,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,1,{links:1}),r._29(603979776,2,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,0,"img",[["src","../../../../../assets/img/wallet-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/send"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,18).onClick()&&i),i},null,null)),r._8(18,16384,[[3,4]],0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(19,1720320,null,2,Wh,[Hh,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,3,{links:1}),r._29(603979776,4,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,0,"img",[["src","../../../../../assets/img/send-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(26,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,11,"div",[["class","-button -low-opacity"],["routerLink","/transactions"],["routerLinkActive","no-opacity"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,31).onClick()&&i),i},null,null)),r._8(31,16384,[[5,4]],0,Vh,[Hh,$d,[8,null],r.G,r.l],{routerLink:[0,"routerLink"]},null),r._8(32,1720320,null,2,Wh,[Hh,r.l,r.G,r.h],{routerLinkActive:[0,"routerLinkActive"]},null),r._29(603979776,5,{links:1}),r._29(603979776,6,{linksWithHrefs:1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,0,"img",[["src","../../../../../assets/img/transactions-black.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(38,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(39,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,0,"div",[["class","flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,jf)),r._8(46,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,If)),r._8(49,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,"/wallets"),t(e,6,0,"no-opacity"),t(e,18,0,"/send"),t(e,19,0,"no-opacity"),t(e,31,0,"/transactions"),t(e,32,0,"no-opacity"),t(e,46,0,n.otcEnabled),t(e,49,0,n.navbarService.switchVisible)},function(t,e){t(e,13,0,r._32(e,13,0,r._22(e,14).transform("title.wallets"))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("title.send"))),t(e,39,0,r._32(e,39,0,r._22(e,40).transform("title.history")))})}var Hf=function(){function t(t){this.total=t}return t.prototype.call=function(t,e){return e.subscribe(new Ff(t,this.total))},t}(),Ff=function(t){function e(e,n){t.call(this,e),this.total=n,this.count=0}return Object(o.__extends)(e,t),e.prototype._next=function(t){++this.count>this.total&&this.destination.next(t)},e}(cr.a);s.a.prototype.skip=function(t){return function(t){return function(e){return e.lift(new Hf(t))}}(t)(this)},s.a.prototype.take=function(t){return Object(Di.a)(t)(this)};var Nf=function(){function t(t,e,n,r,i,o,s){var l=this;this.appService=t,this.apiService=e,this.blockchainService=n,this.priceService=r,this.walletService=i,this.http=o,this.translateService=s,this.addresses=[],this.querying=!0,this.translateService.get("errors.fetch-version").subscribe(function(t){l.fetchVersionError=t})}return Object.defineProperty(t.prototype,"loading",{get:function(){return!this.current||!this.highest||this.current!==this.highest},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"coins",{get:function(){return this.addresses.map(function(t){return t.coins>=0?t.coins:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hours",{get:function(){return this.addresses.map(function(t){return t.hours>=0?t.hours:0}).reduce(function(t,e){return t+e},0)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.subscription=this.blockchainService.progress.filter(function(t){return!!t}).subscribe(function(e){t.querying=!1,t.highest=e.highest,t.current=e.current,t.percentage=t.current&&t.highest?t.current/t.highest:0}),this.setVersion(),this.subscription.add(this.priceService.price.subscribe(function(e){return t.price=e})),this.subscription.add(this.walletService.allAddresses().subscribe(function(e){t.addresses=e.reduce(function(t,e){return t.find(function(t){return t.address===e.address})||t.push(e),t},[])})),this.subscription.add(this.walletService.pendingTransactions().subscribe(function(e){t.hasPendingTxs=e.length>0}))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.setVersion=function(){var t=this;setTimeout(function(){t.apiService.getVersion().first().subscribe(function(e){t.version=e.version,t.retrieveReleaseVersion()})},1e3)},t.prototype.retrieveReleaseVersion=function(){var t=this;this.http.get("https://api.github.com/repos/skycoin/skycoin/tags").map(function(t){return t.json()}).catch(function(e){return s.a.throw(e||t.fetchVersionError)}).subscribe(function(e){t.releaseVersion=e.find(function(t){return-1===t.name.indexOf("rc")}).name.substr(1),t.updateAvailable=function(e,n){for(var r=t.releaseVersion.split("."),i=e.split("-"),o=i[0].split("."),s=0;s<3;s++){var l=Number(r[s]),a=Number(o[s]);if(l>a)return!0;if(l6?{Invalid:!0}:null},t.prototype.resetForm=function(){this.form.get("wallet").setValue(""),this.form.get("address").setValue(""),this.form.get("amount").setValue("")},t}(),p_=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function f_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"option",[],[[8,"disabled",0]],null,null,null,null)),r._8(1,147456,null,0,pl,[r.l,r.G,[2,hl]],{ngValue:[0,"ngValue"]},null),r._8(2,147456,null,0,ml,[r.l,r.G,[8,null]],{ngValue:[0,"ngValue"]},null),(t()(),r._31(3,null,["\n "," - "," ","\n "])),r._27(4,2),r._25(131072,yp.i,[yp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit),t(e,2,0,e.context.$implicit)},function(t,e){t(e,0,0,e.context.$implicit.coins<=0),t(e,3,0,e.context.$implicit.label,r._32(e,3,1,t(e,4,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,3,2,r._22(e,5).transform("common.coin-id")))})}function __(t){return r._33(0,[r._25(0,St,[r.w]),r._29(402653184,1,{previewButton:0}),r._29(402653184,2,{sendButton:0}),(t()(),r._9(3,0,null,null,67,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,4).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,4).onReset()&&i),i},null,null)),r._8(4,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(6,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"label",[["for","wallet"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,10,"select",[["formControlName","wallet"],["id","wallet"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,17).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),i},null,null)),r._8(17,16384,null,0,hl,[r.G,r.l],null,null),r._28(1024,null,$s,function(t){return[t]},[hl]),r._8(19,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(21,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,2,null,f_)),r._8(24,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Ct,[r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"label",[["for","address"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,5,"input",[["formControlName","address"],["id","address"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,37)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,37).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,37)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,37)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(37,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(39,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(41,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(46,0,null,null,2,"label",[["for","amount"]],null,null,null,null,null)),(t()(),r._31(47,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,5,"input",[["formControlName","amount"],["id","amount"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,51)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,51).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,51)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,51)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.preview()&&i),i},null,null)),r._8(51,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(53,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(55,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(58,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(60,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.preview()&&r),r},Of,Lf)),r._8(61,49152,[[1,4],["previewButton",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(62,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Of,Lf)),r._8(66,49152,[[2,4],["sendButton",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(67,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,n.form),t(e,19,0,"wallet"),t(e,24,0,r._32(e,24,0,r._22(e,25).transform(n.walletService.all()))),t(e,39,0,"address"),t(e,53,0,"amount"),t(e,61,0,!n.form.valid),t(e,66,0,!n.form.valid)},function(t,e){t(e,3,0,r._22(e,6).ngClassUntouched,r._22(e,6).ngClassTouched,r._22(e,6).ngClassPristine,r._22(e,6).ngClassDirty,r._22(e,6).ngClassValid,r._22(e,6).ngClassInvalid,r._22(e,6).ngClassPending),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("send.from-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("send.to-label"))),t(e,36,0,r._22(e,41).ngClassUntouched,r._22(e,41).ngClassTouched,r._22(e,41).ngClassPristine,r._22(e,41).ngClassDirty,r._22(e,41).ngClassValid,r._22(e,41).ngClassInvalid,r._22(e,41).ngClassPending),t(e,47,0,r._32(e,47,0,r._22(e,48).transform("send.amount-label"))),t(e,50,0,r._22(e,55).ngClassUntouched,r._22(e,55).ngClassTouched,r._22(e,55).ngClassPristine,r._22(e,55).ngClassDirty,r._22(e,55).ngClassValid,r._22(e,55).ngClassInvalid,r._22(e,55).ngClassPending),t(e,62,0,r._32(e,62,0,r._22(e,63).transform("send.preview-button"))),t(e,67,0,r._32(e,67,0,r._22(e,68).transform("send.send-button")))})}var m_=r._7({encapsulation:2,styles:[],data:{}});function g_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"mat-pseudo-checkbox",[["class","mat-option-pseudo-checkbox mat-pseudo-checkbox"]],[[2,"mat-pseudo-checkbox-indeterminate",null],[2,"mat-pseudo-checkbox-checked",null],[2,"mat-pseudo-checkbox-disabled",null]],null,null,b_,v_)),r._8(1,49152,null,0,Ko,[],{state:[0,"state"],disabled:[1,"disabled"]},null)],function(t,e){var n=e.component;t(e,1,0,n.selected?"checked":"",n.disabled)},function(t,e){t(e,0,0,"indeterminate"===r._22(e,1).state,"checked"===r._22(e,1).state,r._22(e,1).disabled)})}function y_(t){return r._33(2,[(t()(),r._4(16777216,null,null,1,null,g_)),r._8(1,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._9(2,0,null,null,1,"span",[["class","mat-option-text"]],null,null,null,null,null)),r._21(null,0),(t()(),r._9(4,0,null,null,1,"div",[["class","mat-option-ripple mat-ripple"],["mat-ripple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(5,212992,null,0,qo,[r.l,r.B,ei,[2,Jo]],{disabled:[0,"disabled"],trigger:[1,"trigger"]},null)],function(t,e){var n=e.component;t(e,1,0,n.multiple),t(e,5,0,n.disabled||n.disableRipple,n._getHostElement())},function(t,e){t(e,4,0,r._22(e,5).unbounded)})}var v_=r._7({encapsulation:2,styles:[".mat-pseudo-checkbox{width:20px;height:20px;border:2px solid;border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0,0,.2,.1),background-color 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:'';border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-pseudo-checkbox.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox.mat-pseudo-checkbox-indeterminate{border:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{top:9px;left:2px;width:16px;opacity:1}.mat-pseudo-checkbox-checked::after{top:5px;left:3px;width:12px;height:5px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1}"],data:{}});function b_(t){return r._33(2,[],null,null)}var w_=r._7({encapsulation:2,styles:[".mat-select{display:inline-block;width:100%;outline:0}.mat-select-trigger{display:inline-table;cursor:pointer;position:relative;box-sizing:border-box}.mat-select-disabled .mat-select-trigger{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-select-value{display:table-cell;max-width:0;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-select-arrow-wrapper{display:table-cell;vertical-align:middle}.mat-select-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px}.mat-select-panel{min-width:112px;max-width:280px;overflow:auto;-webkit-overflow-scrolling:touch;padding-top:0;padding-bottom:0;max-height:256px;min-width:100%}.mat-select-panel:not([class*=mat-elevation-z]){box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}@media screen and (-ms-high-contrast:active){.mat-select-panel{outline:solid 1px}}.mat-select-panel .mat-optgroup-label,.mat-select-panel .mat-option{font-size:inherit;line-height:3em;height:3em}.mat-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-form-field-flex{cursor:pointer}.mat-form-field-type-mat-select .mat-form-field-label{width:calc(100% - 18px)}.mat-select-placeholder{transition:color .4s .133s cubic-bezier(.25,.8,.25,1)}.mat-form-field-hide-placeholder .mat-select-placeholder{color:transparent;transition:none}"],data:{animation:[{type:7,name:"transformPanel",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 32px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:0,name:"showing-multiple",styles:{type:6,styles:{opacity:1,minWidth:"calc(100% + 64px)",transform:"scaleY(1)"},offset:null},options:void 0},{type:1,expr:"void => *",animation:[{type:6,styles:{opacity:0,minWidth:"100%",transform:"scaleY(0)"},offset:null},{type:4,styles:null,timings:"150ms cubic-bezier(0.25, 0.8, 0.25, 1)"}],options:null},{type:1,expr:"* => void",animation:[{type:4,styles:{type:6,styles:{opacity:0},offset:null},timings:"250ms 100ms linear"}],options:null}],options:{}},{type:7,name:"fadeInContent",definitions:[{type:0,name:"showing",styles:{type:6,styles:{opacity:1},offset:null},options:void 0},{type:1,expr:"void => showing",animation:[{type:6,styles:{opacity:0},offset:null},{type:4,styles:null,timings:"150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)"}],options:null}],options:{}}]}});function M_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"span",[["class","mat-select-placeholder"]],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.placeholder||"\xa0")})}function k_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.triggerValue)})}function x_(t){return r._33(0,[r._21(null,0),(t()(),r._4(0,null,null,0))],null,null)}function L_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"span",[["class","mat-select-value-text"]],null,null,null,null,null)),r._8(1,16384,null,0,z,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._4(16777216,null,null,1,null,k_)),r._8(3,16384,null,0,U,[r.R,r.O,z],null,null),(t()(),r._4(16777216,null,null,1,null,x_)),r._8(5,278528,null,0,W,[r.R,r.O,z],{ngSwitchCase:[0,"ngSwitchCase"]},null)],function(t,e){t(e,1,0,!!e.component.customTrigger),t(e,5,0,!0)},null)}function C_(t){return r._33(0,[(t()(),r._9(0,0,[[2,0],["panel",1]],null,3,"div",[],[[24,"@transformPanel",0],[4,"transformOrigin",null],[2,"mat-select-panel-done-animating",null],[4,"font-size","px"]],[[null,"@transformPanel.done"]],function(t,e,n){var r=!0;return"@transformPanel.done"===e&&(r=!1!==t.component._onPanelDone()&&r),r},null,null)),r._8(1,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),(t()(),r._9(2,0,null,null,1,"div",[["class","mat-select-content"]],[[24,"@fadeInContent",0]],[[null,"@fadeInContent.done"]],function(t,e,n){var r=!0;return"@fadeInContent.done"===e&&(r=!1!==t.component._onFadeInDone()&&r),r},null,null)),r._21(null,1)],function(t,e){var n=e.component;t(e,1,0,r._12(1,"mat-select-panel ",n._getPanelTheme(),""),n.panelClass)},function(t,e){var n=e.component;t(e,0,0,n.multiple?"showing-multiple":"showing",n._transformOrigin,n._panelDoneAnimating,n._triggerFontSize),t(e,2,0,"showing")})}function S_(t){return r._33(2,[r._29(402653184,1,{trigger:0}),r._29(671088640,2,{panel:0}),r._29(402653184,3,{overlayDir:0}),(t()(),r._9(3,0,[[1,0],["trigger",1]],null,9,"div",[["aria-hidden","true"],["cdk-overlay-origin",""],["class","mat-select-trigger"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggle()&&r),r},null,null)),r._8(4,16384,[["origin",4]],0,oo,[r.l],null,null),(t()(),r._9(5,0,null,null,5,"div",[["class","mat-select-value"]],null,null,null,null,null)),r._8(6,16384,null,0,z,[],{ngSwitch:[0,"ngSwitch"]},null),(t()(),r._4(16777216,null,null,1,null,M_)),r._8(8,278528,null,0,W,[r.R,r.O,z],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._4(16777216,null,null,1,null,L_)),r._8(10,278528,null,0,W,[r.R,r.O,z],{ngSwitchCase:[0,"ngSwitchCase"]},null),(t()(),r._9(11,0,null,null,1,"div",[["class","mat-select-arrow-wrapper"]],null,null,null,null,null)),(t()(),r._9(12,0,null,null,0,"div",[["class","mat-select-arrow"]],null,null,null,null,null)),(t()(),r._4(16777216,null,null,1,function(t,e,n){var r=!0,i=t.component;return"backdropClick"===e&&(r=!1!==i.close()&&r),"attach"===e&&(r=!1!==i._onAttached()&&r),"detach"===e&&(r=!1!==i.close()&&r),r},C_)),r._8(14,671744,[[3,4]],0,so,[eo,r.O,r.R,ro,[2,vi]],{_deprecatedOrigin:[0,"_deprecatedOrigin"],_deprecatedPositions:[1,"_deprecatedPositions"],_deprecatedOffsetY:[2,"_deprecatedOffsetY"],_deprecatedMinWidth:[3,"_deprecatedMinWidth"],_deprecatedBackdropClass:[4,"_deprecatedBackdropClass"],_deprecatedScrollStrategy:[5,"_deprecatedScrollStrategy"],_deprecatedOpen:[6,"_deprecatedOpen"],_deprecatedHasBackdrop:[7,"_deprecatedHasBackdrop"]},{backdropClick:"backdropClick",attach:"attach",detach:"detach"})],function(t,e){var n=e.component;t(e,6,0,n.empty),t(e,8,0,!0),t(e,10,0,!1),t(e,14,0,r._22(e,4),n._positions,n._offsetY,null==n._triggerRect?null:n._triggerRect.width,"cdk-overlay-transparent-backdrop",n._scrollStrategy,n.panelOpen,"")},null)}var T_=r._7({encapsulation:2,styles:["@keyframes mat-checkbox-fade-in-background{0%{opacity:0}50%{opacity:1}}@keyframes mat-checkbox-fade-out-background{0%,50%{opacity:1}100%{opacity:0}}@keyframes mat-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:22.91026}50%{animation-timing-function:cubic-bezier(0,0,.2,.1)}100%{stroke-dashoffset:0}}@keyframes mat-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0,0,0,1)}100%{transform:scaleX(1)}}@keyframes mat-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(.4,0,1,1);stroke-dashoffset:0}to{stroke-dashoffset:-22.91026}}@keyframes mat-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(45deg)}}@keyframes mat-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:0;transform:rotate(45deg)}to{opacity:1;transform:rotate(360deg)}}@keyframes mat-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0,0,.2,.1);opacity:0;transform:rotate(-45deg)}to{opacity:1;transform:rotate(0)}}@keyframes mat-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(.14,0,0,1);opacity:1;transform:rotate(0)}to{opacity:0;transform:rotate(315deg)}}@keyframes mat-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;opacity:1;transform:scaleX(1)}100%,32.8%{opacity:0;transform:scaleX(0)}}.mat-checkbox-checkmark,.mat-checkbox-mixedmark{width:calc(100% - 4px)}.mat-checkbox-background,.mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:2px;box-sizing:border-box;pointer-events:none}.mat-checkbox{transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow 280ms cubic-bezier(.4,0,.2,1);cursor:pointer}.mat-checkbox-layout{cursor:inherit;align-items:baseline;vertical-align:middle;display:inline-flex;white-space:nowrap}.mat-checkbox-inner-container{display:inline-block;height:20px;line-height:0;margin:auto;margin-right:8px;order:0;position:relative;vertical-align:middle;white-space:nowrap;width:20px;flex-shrink:0}[dir=rtl] .mat-checkbox-inner-container{margin-left:8px;margin-right:auto}.mat-checkbox-inner-container-no-side-margin{margin-left:0;margin-right:0}.mat-checkbox-frame{background-color:transparent;transition:border-color 90ms cubic-bezier(0,0,.2,.1);border-width:2px;border-style:solid}.mat-checkbox-background{align-items:center;display:inline-flex;justify-content:center;transition:background-color 90ms cubic-bezier(0,0,.2,.1),opacity 90ms cubic-bezier(0,0,.2,.1)}.mat-checkbox-checkmark{top:0;left:0;right:0;bottom:0;position:absolute;width:100%}.mat-checkbox-checkmark-path{stroke-dashoffset:22.91026;stroke-dasharray:22.91026;stroke-width:2.66667px}.mat-checkbox-mixedmark{height:2px;opacity:0;transform:scaleX(0) rotate(0)}.mat-checkbox-label-before .mat-checkbox-inner-container{order:1;margin-left:8px;margin-right:auto}[dir=rtl] .mat-checkbox-label-before .mat-checkbox-inner-container{margin-left:auto;margin-right:8px}.mat-checkbox-checked .mat-checkbox-checkmark{opacity:1}.mat-checkbox-checked .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-checked .mat-checkbox-mixedmark{transform:scaleX(1) rotate(-45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark{opacity:0;transform:rotate(45deg)}.mat-checkbox-indeterminate .mat-checkbox-checkmark-path{stroke-dashoffset:0}.mat-checkbox-indeterminate .mat-checkbox-mixedmark{opacity:1;transform:scaleX(1) rotate(0)}.mat-checkbox-unchecked .mat-checkbox-background{background-color:transparent}.mat-checkbox-disabled{cursor:default}.mat-checkbox-anim-unchecked-checked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-checked .mat-checkbox-checkmark-path{animation:180ms linear 0s mat-checkbox-unchecked-checked-checkmark-path}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-in-background}.mat-checkbox-anim-unchecked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-unchecked-indeterminate-mixedmark}.mat-checkbox-anim-checked-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-checked-unchecked .mat-checkbox-checkmark-path{animation:90ms linear 0s mat-checkbox-checked-unchecked-checkmark-path}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-checkmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-checkmark}.mat-checkbox-anim-checked-indeterminate .mat-checkbox-mixedmark{animation:90ms linear 0s mat-checkbox-checked-indeterminate-mixedmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-checkmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-checkmark}.mat-checkbox-anim-indeterminate-checked .mat-checkbox-mixedmark{animation:.5s linear 0s mat-checkbox-indeterminate-checked-mixedmark}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-background{animation:180ms linear 0s mat-checkbox-fade-out-background}.mat-checkbox-anim-indeterminate-unchecked .mat-checkbox-mixedmark{animation:.3s linear 0s mat-checkbox-indeterminate-unchecked-mixedmark}.mat-checkbox-input{bottom:0;left:50%}.mat-checkbox-ripple{position:absolute;left:-15px;top:-15px;height:50px;width:50px;z-index:1;pointer-events:none}"],data:{}});function O_(t){return r._33(2,[r._29(402653184,1,{_inputElement:0}),r._29(402653184,2,{_ripple:0}),(t()(),r._9(2,0,[["label",1]],null,14,"label",[["class","mat-checkbox-layout"]],[[1,"for",0]],null,null,null,null)),(t()(),r._9(3,0,null,null,8,"div",[["class","mat-checkbox-inner-container"]],[[2,"mat-checkbox-inner-container-no-side-margin",null]],null,null,null,null)),(t()(),r._9(4,0,[[1,0],["input",1]],null,0,"input",[["class","mat-checkbox-input cdk-visually-hidden"],["type","checkbox"]],[[8,"id",0],[8,"required",0],[8,"checked",0],[1,"value",0],[8,"disabled",0],[1,"name",0],[8,"tabIndex",0],[8,"indeterminate",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-checked",0]],[[null,"change"],[null,"click"]],function(t,e,n){var r=!0,i=t.component;return"change"===e&&(r=!1!==i._onInteractionEvent(n)&&r),"click"===e&&(r=!1!==i._onInputClick(n)&&r),r},null,null)),(t()(),r._9(5,0,null,null,1,"div",[["class","mat-checkbox-ripple mat-ripple"],["matRipple",""]],[[2,"mat-ripple-unbounded",null]],null,null,null,null)),r._8(6,212992,[[2,4]],0,qo,[r.l,r.B,ei,[2,Jo]],{centered:[0,"centered"],radius:[1,"radius"],speedFactor:[2,"speedFactor"],disabled:[3,"disabled"],trigger:[4,"trigger"]},null),(t()(),r._9(7,0,null,null,0,"div",[["class","mat-checkbox-frame"]],null,null,null,null,null)),(t()(),r._9(8,0,null,null,3,"div",[["class","mat-checkbox-background"]],null,null,null,null,null)),(t()(),r._9(9,0,null,null,1,":svg:svg",[[":xml:space","preserve"],["class","mat-checkbox-checkmark"],["focusable","false"],["version","1.1"],["viewBox","0 0 24 24"]],null,null,null,null,null)),(t()(),r._9(10,0,null,null,0,":svg:path",[["class","mat-checkbox-checkmark-path"],["d","M4.1,12.7 9,17.6 20.3,6.3"],["fill","none"],["stroke","white"]],null,null,null,null,null)),(t()(),r._9(11,0,null,null,0,"div",[["class","mat-checkbox-mixedmark"]],null,null,null,null,null)),(t()(),r._9(12,0,[["checkboxLabel",1]],null,4,"span",[["class","mat-checkbox-label"]],null,[[null,"cdkObserveContent"]],function(t,e,n){var r=!0;return"cdkObserveContent"===e&&(r=!1!==t.component._onLabelTextChange()&&r),r},null,null)),r._8(13,1196032,null,0,wa,[ba,r.l,r.B],null,{event:"cdkObserveContent"}),(t()(),r._9(14,0,null,null,1,"span",[["style","display:none"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\xa0"])),r._21(null,0)],function(t,e){var n=e.component;t(e,6,0,n._rippleConfig.centered,n._rippleConfig.radius,n._rippleConfig.speedFactor,n._isRippleDisabled(),r._22(e,2))},function(t,e){var n=e.component;t(e,2,0,n.inputId),t(e,3,0,!r._22(e,12).textContent||!r._22(e,12).textContent.trim()),t(e,4,1,[n.inputId,n.required,n.checked,n.value,n.disabled,n.name,n.tabIndex,n.indeterminate,n.ariaLabel,n.ariaLabelledby,n._getAriaChecked()]),t(e,5,0,r._22(e,6).unbounded)})}var D_=r._7({encapsulation:2,styles:[".mat-slider{display:inline-block;position:relative;box-sizing:border-box;padding:8px;outline:0;vertical-align:middle}.mat-slider-wrapper{position:absolute}.mat-slider-track-wrapper{position:absolute;top:0;left:0;overflow:hidden}.mat-slider-track-fill{position:absolute;transform-origin:0 0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-track-background{position:absolute;transform-origin:100% 100%;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-ticks-container{position:absolute;left:0;top:0;overflow:hidden}.mat-slider-ticks{background-repeat:repeat;background-clip:content-box;box-sizing:border-box;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-container{position:absolute;z-index:1;transition:transform .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-focus-ring{position:absolute;width:30px;height:30px;border-radius:50%;transform:scale(0);opacity:0;transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),opacity .4s cubic-bezier(.25,.8,.25,1)}.cdk-keyboard-focused .mat-slider-focus-ring,.cdk-program-focused .mat-slider-focus-ring{transform:scale(1);opacity:1}.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label{cursor:-webkit-grab;cursor:grab}.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb,.mat-slider-sliding:not(.mat-slider-disabled) .mat-slider-thumb-label,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb-label:active,.mat-slider:not(.mat-slider-disabled) .mat-slider-thumb:active{cursor:-webkit-grabbing;cursor:grabbing}.mat-slider-thumb{position:absolute;right:-10px;bottom:-10px;box-sizing:border-box;width:20px;height:20px;border:3px solid transparent;border-radius:50%;transform:scale(.7);transition:transform .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1),border-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label{display:none;align-items:center;justify-content:center;position:absolute;width:28px;height:28px;border-radius:50%;transition:transform .4s cubic-bezier(.25,.8,.25,1),border-radius .4s cubic-bezier(.25,.8,.25,1),background-color .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-thumb-label-text{z-index:1;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-sliding .mat-slider-thumb-container,.mat-slider-sliding .mat-slider-track-background,.mat-slider-sliding .mat-slider-track-fill{transition-duration:0s}.mat-slider-has-ticks .mat-slider-wrapper::after{content:'';position:absolute;border-width:0;border-style:solid;opacity:0;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after,.mat-slider-has-ticks:hover:not(.mat-slider-hide-last-tick) .mat-slider-wrapper::after{opacity:1}.mat-slider-has-ticks.cdk-focused:not(.mat-slider-disabled) .mat-slider-ticks,.mat-slider-has-ticks:hover:not(.mat-slider-disabled) .mat-slider-ticks{opacity:1}.mat-slider-thumb-label-showing .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-thumb-label-showing .mat-slider-thumb-label{display:flex}.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:100% 100%}.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:0 0}.mat-slider:not(.mat-slider-disabled).cdk-focused.mat-slider-thumb-label-showing .mat-slider-thumb{transform:scale(0)}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label{border-radius:50% 50% 0}.mat-slider:not(.mat-slider-disabled).cdk-focused .mat-slider-thumb-label-text{opacity:1}.mat-slider:not(.mat-slider-disabled).cdk-mouse-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-program-focused .mat-slider-thumb,.mat-slider:not(.mat-slider-disabled).cdk-touch-focused .mat-slider-thumb{border-width:2px;transform:scale(1)}.mat-slider-disabled .mat-slider-focus-ring{transform:scale(0);opacity:0}.mat-slider-disabled .mat-slider-thumb{border-width:4px;transform:scale(.5)}.mat-slider-disabled .mat-slider-thumb-label{display:none}.mat-slider-horizontal{height:48px;min-width:128px}.mat-slider-horizontal .mat-slider-wrapper{height:2px;top:23px;left:8px;right:8px}.mat-slider-horizontal .mat-slider-wrapper::after{height:2px;border-left-width:2px;right:0;top:0}.mat-slider-horizontal .mat-slider-track-wrapper{height:2px;width:100%}.mat-slider-horizontal .mat-slider-track-fill{height:2px;width:100%;transform:scaleX(0)}.mat-slider-horizontal .mat-slider-track-background{height:2px;width:100%;transform:scaleX(1)}.mat-slider-horizontal .mat-slider-ticks-container{height:2px;width:100%}.mat-slider-horizontal .mat-slider-ticks{height:2px;width:100%}.mat-slider-horizontal .mat-slider-thumb-container{width:100%;height:0;top:50%}.mat-slider-horizontal .mat-slider-focus-ring{top:-15px;right:-15px}.mat-slider-horizontal .mat-slider-thumb-label{right:-14px;top:-40px;transform:translateY(26px) scale(.01) rotate(45deg)}.mat-slider-horizontal .mat-slider-thumb-label-text{transform:rotate(-45deg)}.mat-slider-horizontal.cdk-focused .mat-slider-thumb-label{transform:rotate(45deg)}.mat-slider-vertical{width:48px;min-height:128px}.mat-slider-vertical .mat-slider-wrapper{width:2px;top:8px;bottom:8px;left:23px}.mat-slider-vertical .mat-slider-wrapper::after{width:2px;border-top-width:2px;bottom:0;left:0}.mat-slider-vertical .mat-slider-track-wrapper{height:100%;width:2px}.mat-slider-vertical .mat-slider-track-fill{height:100%;width:2px;transform:scaleY(0)}.mat-slider-vertical .mat-slider-track-background{height:100%;width:2px;transform:scaleY(1)}.mat-slider-vertical .mat-slider-ticks-container{width:2px;height:100%}.mat-slider-vertical .mat-slider-focus-ring{bottom:-15px;left:-15px}.mat-slider-vertical .mat-slider-ticks{width:2px;height:100%}.mat-slider-vertical .mat-slider-thumb-container{height:100%;width:0;left:50%}.mat-slider-vertical .mat-slider-thumb{-webkit-backface-visibility:hidden;backface-visibility:hidden}.mat-slider-vertical .mat-slider-thumb-label{bottom:-14px;left:-40px;transform:translateX(26px) scale(.01) rotate(-45deg)}.mat-slider-vertical .mat-slider-thumb-label-text{transform:rotate(45deg)}.mat-slider-vertical.cdk-focused .mat-slider-thumb-label{transform:rotate(-45deg)}[dir=rtl] .mat-slider-wrapper::after{left:0;right:auto}[dir=rtl] .mat-slider-horizontal .mat-slider-track-fill{transform-origin:100% 100%}[dir=rtl] .mat-slider-horizontal .mat-slider-track-background{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-fill{transform-origin:0 0}[dir=rtl] .mat-slider-horizontal.mat-slider-axis-inverted .mat-slider-track-background{transform-origin:100% 100%}"],data:{}});function Y_(t){return r._33(2,[r._29(402653184,1,{_sliderWrapper:0}),(t()(),r._9(1,0,[[1,0],["sliderWrapper",1]],null,16,"div",[["class","mat-slider-wrapper"]],null,null,null,null,null)),(t()(),r._9(2,0,null,null,4,"div",[["class","mat-slider-track-wrapper"]],null,null,null,null,null)),(t()(),r._9(3,0,null,null,1,"div",[["class","mat-slider-track-background"]],null,null,null,null,null)),r._8(4,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(5,0,null,null,1,"div",[["class","mat-slider-track-fill"]],null,null,null,null,null)),r._8(6,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(7,0,null,null,3,"div",[["class","mat-slider-ticks-container"]],null,null,null,null,null)),r._8(8,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(9,0,null,null,1,"div",[["class","mat-slider-ticks"]],null,null,null,null,null)),r._8(10,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(11,0,null,null,6,"div",[["class","mat-slider-thumb-container"]],null,null,null,null,null)),r._8(12,278528,null,0,G,[r.v,r.l,r.G],{ngStyle:[0,"ngStyle"]},null),(t()(),r._9(13,0,null,null,0,"div",[["class","mat-slider-focus-ring"]],null,null,null,null,null)),(t()(),r._9(14,0,null,null,0,"div",[["class","mat-slider-thumb"]],null,null,null,null,null)),(t()(),r._9(15,0,null,null,2,"div",[["class","mat-slider-thumb-label"]],null,null,null,null,null)),(t()(),r._9(16,0,null,null,1,"span",[["class","mat-slider-thumb-label-text"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""]))],function(t,e){var n=e.component;t(e,4,0,n._trackBackgroundStyles),t(e,6,0,n._trackFillStyles),t(e,8,0,n._ticksContainerStyles),t(e,10,0,n._ticksStyles),t(e,12,0,n._thumbContainerStyles)},function(t,e){t(e,17,0,e.component.displayValue)})}var P_=function(){function t(t,e,n,i,o){this.walletService=t,this.formBuilder=e,this.dialog=n,this.snackbar=i,this.navbarService=o,this.onFormSubmitted=new r.o,this.addresses=[],this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5"}return t.prototype.ngOnInit=function(){var t=this;this.navbarService.showSwitch("send.simple","send.advanced"),this.form=this.formBuilder.group({wallet:["",Qs.required],addresses:["",Qs.required],changeAddress:[""],destinations:this.formBuilder.array([this.createDestinationFormGroup()],this.validateDestinations.bind(this))}),this.subscriptions=this.form.get("wallet").valueChanges.subscribe(function(e){t.addresses=e.addresses.filter(function(t){return t.coins>0}),t.form.get("addresses").setValue([]),t.form.get("destinations").updateValueAndValidity()}),this.subscriptions.add(this.form.get("addresses").valueChanges.subscribe(function(){t.form.get("destinations").updateValueAndValidity()})),this.formData&&this.fillForm()},t.prototype.ngOnDestroy=function(){this.subscriptions.unsubscribe(),this.navbarService.hideSwitch(),this.snackbar.dismiss()},t.prototype.preview=function(){this.previewTx=!0,this.unlockAndSend()},t.prototype.send=function(){this.previewTx=!1,this.unlockAndSend()},t.prototype.unlockAndSend=function(){var t=this;!this.form.valid||this.previewButton.isLoading()||this.sendButton.isLoading()||(this.snackbar.dismiss(),this.previewButton.resetState(),this.sendButton.resetState(),this.form.get("wallet").value.encrypted?this.dialog.open(vp).componentInstance.passwordSubmit.subscribe(function(e){t.createTransaction(e)}):this.createTransaction())},t.prototype.addDestination=function(){this.form.get("destinations").push(this.createDestinationFormGroup())},t.prototype.removeDestination=function(t){this.form.get("destinations").removeAt(t)},t.prototype.setShareValue=function(t){this.autoShareValue=parseFloat(t.value).toFixed(2)},t.prototype.toggleOptions=function(t){t.stopPropagation(),t.preventDefault(),this.autoOptions=!this.autoOptions},t.prototype.setAutoHours=function(t){this.autoHours=t.checked,this.form.get("destinations").updateValueAndValidity(),this.autoHours||(this.autoOptions=!1)},t.prototype.fillForm=function(){var t=this;this.addresses=this.formData.form.wallet.addresses,["wallet","addresses","changeAddress"].forEach(function(e){t.form.get(e).setValue(t.formData.form[e])});for(var e=0;e6)return!0}else if("hours"===t&&(n<1||parseInt(n,10)!==parseFloat(n)))return!0;return!1}).find(function(t){return!0===t})}))return{Invalid:!0};var e=this.form.get("addresses").value.reduce(function(t,e){return t+e.coins},0),n=this.form.get("addresses").value.reduce(function(t,e){return t+e.hours},0),r=this.destControls.reduce(function(t,e){return t+parseFloat(e.value.coins)},0),i=this.destControls.reduce(function(t,e){return t+parseInt(e.value.hours,10)},0);return r>e||i>n?{Invalid:!0}:null},t.prototype.createDestinationFormGroup=function(){return this.formBuilder.group({address:"",coins:"",hours:""})},t.prototype.createTransaction=function(t){var e=this;t&&t.close(),this.previewTx?(this.previewButton.setLoading(),this.sendButton.setDisabled()):(this.sendButton.setLoading(),this.previewButton.setDisabled()),this.walletService.createTransaction(this.form.get("wallet").value,this.form.get("addresses").value.map(function(t){return t.address}),this.destinations,this.hoursSelection,this.form.get("changeAddress").value?this.form.get("changeAddress").value:null,t?t.password:null).toPromise().then(function(t){if(!e.previewTx)return e.walletService.injectTransaction(t.encoded).toPromise();e.onFormSubmitted.emit({form:{wallet:e.form.get("wallet").value,addresses:e.form.get("addresses").value,changeAddress:e.form.get("changeAddress").value,destinations:e.destinations,hoursSelection:e.hoursSelection,autoOptions:e.autoOptions},amount:e.destinations.reduce(function(t,e){return t+parseFloat(e.coins)},0),to:e.destinations.map(function(t){return t.address}),transaction:t})}).then(function(){e.sendButton.setSuccess(),e.resetForm(),setTimeout(function(){e.sendButton.resetState()},3e3)}).catch(function(t){kc(e.snackbar,t),e.previewButton.resetState().setEnabled(),e.sendButton.resetState().setEnabled()})},t.prototype.resetForm=function(){for(this.form.get("wallet").setValue("",{emitEvent:!1}),this.form.get("addresses").setValue([]),this.form.get("changeAddress").setValue("");this.destControls.length>0;)this.form.get("destinations").removeAt(0);this.addDestination(),this.autoHours=!0,this.autoOptions=!1,this.autoShareValue="0.5"},Object.defineProperty(t.prototype,"destinations",{get:function(){var t=this;return this.destControls.map(function(e){var n={address:e.get("address").value,coins:e.get("coins").value};return t.autoHours||(n.hours=e.get("hours").value),n})},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"hoursSelection",{get:function(){var t={type:"manual"};return this.autoHours&&(t={type:"auto",mode:"share",share_factor:this.autoShareValue}),t},enumerable:!0,configurable:!0}),t}(),E_=r._7({encapsulation:0,styles:[[".-input-addon[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}.-input-addon[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{border-top-right-radius:0;border-bottom-right-radius:0}.-input-addon[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border:2px;border-radius:0 6px 6px 0;background:#f1f1f1;padding:0 10px;line-height:44px;color:rgba(30,34,39,.5);font-size:14px;-ms-flex-negative:0;flex-shrink:0}.-destination[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%]{text-align:right;padding-top:5px}.-destination[_ngcontent-%COMP%] .-icons[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px;cursor:pointer}mat-checkbox[_ngcontent-%COMP%]{font-size:12px}mat-select[_ngcontent-%COMP%]{background:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px}mat-select[_ngcontent-%COMP%] .mat-select-trigger{padding:10px 30px 10px 10px;display:block;font-size:11px;height:100%;line-height:20px}mat-select[_ngcontent-%COMP%] .mat-select-arrow{border:none}mat-option[_ngcontent-%COMP%] .mat-pseudo-checkbox-checked{background:#0072ff}.-autohours[_ngcontent-%COMP%]{margin:40px 0 20px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{stroke:#0072ff!important}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-background, .-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-frame{width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-label{line-height:20px;font-size:13px;color:#1e2227;-webkit-box-flex:1;-ms-flex:1;flex:1}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .-options{color:#0072ff;cursor:pointer}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .-options mat-icon{display:inline;vertical-align:middle;font-size:13px}.-autohours[_ngcontent-%COMP%] .-check[_ngcontent-%COMP%] .mat-checkbox-layout{display:-webkit-box;display:-ms-flexbox;display:flex}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%]{margin-top:20px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%]{width:100%;padding:0;height:40px;border:2px solid rgba(0,0,0,.05);border-radius:6px;background:#fff}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb-label{background-color:#0072ff!important;-webkit-transform:scale(1)!important;transform:scale(1)!important;border-width:0!important}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-thumb{right:-6px;width:12px;height:32px;border-radius:3px}.-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-background, .-autohours[_ngcontent-%COMP%] .-options-wrapper[_ngcontent-%COMP%] mat-slider[_ngcontent-%COMP%] .mat-slider-track-fill{background-color:#fff!important}.-buttons[_ngcontent-%COMP%]{text-align:center}.-hidden[_ngcontent-%COMP%]{display:none}.-space-between[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}label[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;font-size:14px;color:rgba(121,135,152,.5);vertical-align:text-bottom;padding-left:5px}"]],data:{}});function A_(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"option",[],[[8,"disabled",0]],null,null,null,null)),r._8(1,147456,null,0,pl,[r.l,r.G,[2,hl]],{ngValue:[0,"ngValue"]},null),r._8(2,147456,null,0,ml,[r.l,r.G,[8,null]],{ngValue:[0,"ngValue"]},null),(t()(),r._31(3,null,["\n "," - "," ","\n ("," ",")\n "])),r._27(4,2),r._25(131072,yp.i,[yp.j,r.h]),r._27(6,2),r._25(131072,yp.i,[yp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit),t(e,2,0,e.context.$implicit)},function(t,e){t(e,0,0,e.context.$implicit.coins<=0),t(e,3,0,e.context.$implicit.label,r._32(e,3,1,t(e,4,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,3,2,r._22(e,5).transform("common.coin-id")),r._32(e,3,3,t(e,6,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,3,4,r._22(e,7).transform("common.coin-hours")))})}function j_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._selectViaInteraction()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),i},y_,m_)),r._8(1,49152,[[3,4]],0,ns,[r.l,r.h,[2,es],[2,$o]],{value:[0,"value"]},null),(t()(),r._31(2,0,["\n "," - "," ","\n ("," ",")\n "])),r._27(3,2),r._25(131072,yp.i,[yp.j,r.h]),r._27(5,2),r._25(131072,yp.i,[yp.j,r.h])],function(t,e){t(e,1,0,e.context.$implicit)},function(t,e){t(e,0,0,r._22(e,1)._getTabIndex(),r._22(e,1).selected,r._22(e,1).multiple,r._22(e,1).active,r._22(e,1).id,r._22(e,1).selected.toString(),r._22(e,1).disabled.toString(),r._22(e,1).disabled),t(e,2,0,e.context.$implicit.address,r._32(e,2,1,t(e,3,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,2,2,r._22(e,4).transform("common.coin-id")),r._32(e,2,3,t(e,5,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,2,4,r._22(e,6).transform("common.coin-hours")))})}function I_(t){return r._33(0,[(t()(),r._9(0,0,null,null,5,"div",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," - "," ","\n ("," ",")\n "])),r._27(2,2),r._25(131072,yp.i,[yp.j,r.h]),r._27(4,2),r._25(131072,yp.i,[yp.j,r.h])],null,function(t,e){t(e,1,0,e.context.$implicit.address,r._32(e,1,1,t(e,2,0,r._22(e.parent,0),e.context.$implicit.coins,"1.0-6")),r._32(e,1,2,r._22(e,3).transform("common.coin-id")),r._32(e,1,3,t(e,4,0,r._22(e.parent,0),e.context.$implicit.hours,"1.0-6")),r._32(e,1,4,r._22(e,5).transform("common.coin-hours")))})}function R_(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["alt","plus"],["src","../../../../../assets/img/plus-green.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.addDestination()&&r),r},null,null))],null,null)}function H_(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["alt","minus"],["src","../../../../../assets/img/minus-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.removeDestination(t.parent.context.index)&&r),r},null,null))],null,null)}function F_(t){return r._33(0,[(t()(),r._9(0,0,null,null,65,"div",[["class","-destination"],["formArrayName","destinations"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),r._8(1,212992,null,0,Gl,[[3,Us],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,Us,null,[Gl]),r._8(3,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,59,"div",[["class","row"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],null,null,null,null)),r._8(6,212992,null,0,Ul,[[3,Us],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,Us,null,[Ul]),r._8(8,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,8,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,5,"input",[["formControlName","address"]],[[8,"id",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,13)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,13).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,13)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,13)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(13,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(15,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(17,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,15,"div",[["class","col-md-3"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,12,"div",[["class","-input-addon"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,5,"input",[["formControlName","coins"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,25)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,25).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,25)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,25)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(25,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(27,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(29,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(31,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(32,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,17,"div",[["class","col-md-3"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(39,0,null,null,14,"div",[],null,null,null,null,null)),r._8(40,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(41,{"-input-addon":0,"-hidden":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,5,"input",[["formControlName","hours"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,44)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,44).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,44)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,44)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(44,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(46,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(48,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(51,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(56,0,null,null,7,"div",[["class","col-md-1 -icons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,R_)),r._8(59,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,H_)),r._8(62,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,1,0,"destinations"),t(e,6,0,e.context.index),t(e,15,0,"address"),t(e,27,0,"coins"),t(e,40,0,t(e,41,0,!0,n.autoHours)),t(e,46,0,"hours"),t(e,59,0,0===e.context.index),t(e,62,0,0!==e.context.index)},function(t,e){t(e,0,0,r._22(e,3).ngClassUntouched,r._22(e,3).ngClassTouched,r._22(e,3).ngClassPristine,r._22(e,3).ngClassDirty,r._22(e,3).ngClassValid,r._22(e,3).ngClassInvalid,r._22(e,3).ngClassPending),t(e,5,0,r._22(e,8).ngClassUntouched,r._22(e,8).ngClassTouched,r._22(e,8).ngClassPristine,r._22(e,8).ngClassDirty,r._22(e,8).ngClassValid,r._22(e,8).ngClassInvalid,r._22(e,8).ngClassPending),t(e,12,0,0===e.context.index?"destination":"",r._22(e,17).ngClassUntouched,r._22(e,17).ngClassTouched,r._22(e,17).ngClassPristine,r._22(e,17).ngClassDirty,r._22(e,17).ngClassValid,r._22(e,17).ngClassInvalid,r._22(e,17).ngClassPending),t(e,24,0,r._22(e,29).ngClassUntouched,r._22(e,29).ngClassTouched,r._22(e,29).ngClassPristine,r._22(e,29).ngClassDirty,r._22(e,29).ngClassValid,r._22(e,29).ngClassInvalid,r._22(e,29).ngClassPending),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("common.coin-id"))),t(e,43,0,r._22(e,48).ngClassUntouched,r._22(e,48).ngClassTouched,r._22(e,48).ngClassPristine,r._22(e,48).ngClassDirty,r._22(e,48).ngClassValid,r._22(e,48).ngClassInvalid,r._22(e,48).ngClassPending),t(e,51,0,r._32(e,51,0,r._22(e,52).transform("common.coin-hours")))})}function N_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"span",[["class","-options"]],null,[[null,"mousedown"],[null,"click"]],function(t,e,n){var r=!0,i=t.component;return"mousedown"===e&&(r=!1!==n.stopPropagation()&&r),"click"===e&&(r=!1!==i.toggleOptions(n)&&r),r},null,null)),(t()(),r._31(1,null,["\n "," "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(3,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(4,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,4,0)},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("send.options-label")))})}function V_(t){return r._33(0,[r._25(0,St,[r.w]),r._29(402653184,1,{previewButton:0}),r._29(402653184,2,{sendButton:0}),(t()(),r._9(3,0,null,null,156,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,4).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,4).onReset()&&i),i},null,null)),r._8(4,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(6,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,20,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"label",[["for","wallets"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,10,"select",[["formControlName","wallet"],["id","wallets"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,17).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),i},null,null)),r._8(17,16384,null,0,hl,[r.G,r.l],null,null),r._28(1024,null,$s,function(t){return[t]},[hl]),r._8(19,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(21,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,2,null,A_)),r._8(24,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Ct,[r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(30,0,null,null,36,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,8,"label",[["for","addresses"]],null,[[null,"click"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,49).open()&&i),i},null,null)),(t()(),r._31(33,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(35,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,37).show()&&i),"keydown"===e&&(i=!1!==r._22(t,37)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,37).hide(1500)&&i),i},Zp,Xp)),r._8(36,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(37,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(42,0,null,null,23,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,20,"mat-select",[["class","mat-select"],["formControlName","addresses"],["id","addresses"],["multiple",""],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(t,e,n){var i=!0;return"keydown"===e&&(i=!1!==r._22(t,49)._handleKeydown(n)&&i),"focus"===e&&(i=!1!==r._22(t,49)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,49)._onBlur()&&i),i},S_,w_)),r._28(6144,null,es,null,[Hu]),r._28(6144,null,ia,null,[Hu]),r._8(47,671744,null,0,ql,[[3,Us],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(49,2080768,[["selectAddresses",4]],3,Hu,[_i,r.h,r.B,Fo,r.l,[2,vi],[2,Nl],[2,Wl],[2,la],[2,ll],[8,null],ju],{multiple:[0,"multiple"],compareWith:[1,"compareWith"],id:[2,"id"]},null),r._29(603979776,3,{options:1}),r._29(603979776,4,{optionGroups:1}),r._29(335544320,5,{customTrigger:0}),r._8(53,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,1,["\n "])),(t()(),r._4(16777216,null,1,1,null,j_)),r._8(56,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,1,["\n "])),(t()(),r._9(58,0,null,0,5,"mat-select-trigger",[],null,null,null,null,null)),r._8(59,16384,[[5,4]],0,Ru,[],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,I_)),r._8(62,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,1,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(68,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(70,0,null,null,8,"label",[["for","destination"]],null,null,null,null,null)),(t()(),r._31(71,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(73,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,75).show()&&i),"keydown"===e&&(i=!1!==r._22(t,75)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,75).hide(1500)&&i),i},Zp,Xp)),r._8(74,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(75,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,F_)),r._8(81,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(84,0,null,null,18,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(86,0,null,null,8,"label",[["for","change-address"]],null,null,null,null,null)),(t()(),r._31(87,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(89,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,91).show()&&i),"keydown"===e&&(i=!1!==r._22(t,91)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,91).hide(1500)&&i),i},Zp,Xp)),r._8(90,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(91,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(96,0,null,null,5,"input",[["formControlName","changeAddress"],["id","change-address"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,97)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,97).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,97)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,97)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.preview()&&i),i},null,null)),r._8(97,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(99,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(101,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(104,0,null,null,54,"div",[["class","-autohours"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(106,0,null,null,19,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(108,0,null,null,16,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(110,0,null,null,13,"mat-checkbox",[["class","-check mat-checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setAutoHours(n)&&r),r},O_,T_)),r._28(5120,null,$s,function(t){return[t]},[Ca]),r._8(112,4374528,null,0,Ca,[r.l,r.h,Do,[8,null],[2,ka]],{checked:[0,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(114,0,null,0,8,"div",[["class","-space-between"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(116,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(117,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,N_)),r._8(121,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(127,0,null,null,30,"div",[],null,null,null,null,null)),r._8(128,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(129,{"row -options-wrapper":0,"-hidden":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(131,0,null,null,25,"div",[["class","col-md-5"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(133,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(135,0,null,null,15,"label",[["class","-space-between"],["for","value"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(137,0,null,null,8,"span",[],null,null,null,null,null)),(t()(),r._31(138,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(140,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,142).show()&&i),"keydown"===e&&(i=!1!==r._22(t,142)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,142).hide(1500)&&i),i},Zp,Xp)),r._8(141,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(142,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["help"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(147,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(148,null,["",""])),r._27(149,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(152,0,null,null,2,"mat-slider",[["class","-slider mat-slider"],["id","value"],["max","1"],["min","0.1"],["role","slider"],["step","0.01"]],[[8,"tabIndex",0],[1,"aria-disabled",0],[1,"aria-valuemax",0],[1,"aria-valuemin",0],[1,"aria-valuenow",0],[1,"aria-orientation",0],[2,"mat-slider-disabled",null],[2,"mat-slider-has-ticks",null],[2,"mat-slider-horizontal",null],[2,"mat-slider-axis-inverted",null],[2,"mat-slider-sliding",null],[2,"mat-slider-thumb-label-showing",null],[2,"mat-slider-vertical",null],[2,"mat-slider-min-value",null],[2,"mat-slider-hide-last-tick",null]],[[null,"input"],[null,"focus"],[null,"blur"],[null,"click"],[null,"keydown"],[null,"keyup"],[null,"mouseenter"],[null,"slide"],[null,"slideend"],[null,"slidestart"]],function(t,e,n){var i=!0,o=t.component;return"focus"===e&&(i=!1!==r._22(t,154)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,154)._onBlur()&&i),"click"===e&&(i=!1!==r._22(t,154)._onClick(n)&&i),"keydown"===e&&(i=!1!==r._22(t,154)._onKeydown(n)&&i),"keyup"===e&&(i=!1!==r._22(t,154)._onKeyup()&&i),"mouseenter"===e&&(i=!1!==r._22(t,154)._onMouseenter()&&i),"slide"===e&&(i=!1!==r._22(t,154)._onSlide(n)&&i),"slideend"===e&&(i=!1!==r._22(t,154)._onSlideEnd()&&i),"slidestart"===e&&(i=!1!==r._22(t,154)._onSlideStart(n)&&i),"input"===e&&(i=!1!==o.setShareValue(n)&&i),i},Y_,D_)),r._28(5120,null,$s,function(t){return[t]},[$u]),r._8(154,245760,null,0,$u,[r.l,Do,r.h,[2,vi],[8,null]],{max:[0,"max"],min:[1,"min"],step:[2,"step"],value:[3,"value"]},{input:"input"}),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._9(161,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(163,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.preview()&&r),r},Of,Lf)),r._8(164,49152,[[1,4],["previewButton",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(165,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(168,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Of,Lf)),r._8(169,49152,[[2,4],["sendButton",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(170,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,n.form),t(e,19,0,"wallet"),t(e,24,0,r._32(e,24,0,r._22(e,25).transform(n.walletService.all()))),t(e,36,0),t(e,37,0,r._32(e,37,0,r._22(e,38).transform("send.addresses-help"))),t(e,47,0,"addresses"),t(e,49,0,"",n.addressCompare,"addresses"),t(e,56,0,n.addresses),t(e,62,0,n.form.get("addresses").value),t(e,74,0),t(e,75,0,r._32(e,75,0,r._22(e,76).transform("send.destinations-help"+(n.autoHours?"1":"2")))),t(e,81,0,n.destControls),t(e,90,0),t(e,91,0,r._32(e,91,0,r._22(e,92).transform("send.change-address-help"))),t(e,99,0,"changeAddress"),t(e,112,0,n.autoHours),t(e,121,0,n.autoHours),t(e,128,0,t(e,129,0,!0,!n.autoOptions)),t(e,141,0),t(e,142,0,r._32(e,142,0,r._22(e,143).transform("send.value-help"))),t(e,154,0,"1","0.1","0.01",n.autoShareValue),t(e,164,0,!n.form.valid),t(e,169,0,!n.form.valid)},function(t,e){var n=e.component;t(e,3,0,r._22(e,6).ngClassUntouched,r._22(e,6).ngClassTouched,r._22(e,6).ngClassPristine,r._22(e,6).ngClassDirty,r._22(e,6).ngClassValid,r._22(e,6).ngClassInvalid,r._22(e,6).ngClassPending),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("send.wallet-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("send.addresses-label"))),t(e,44,1,[r._22(e,49).id,r._22(e,49).tabIndex,r._22(e,49)._ariaLabel,r._22(e,49).ariaLabelledby,r._22(e,49).required.toString(),r._22(e,49).disabled.toString(),r._22(e,49).errorState,r._22(e,49).panelOpen?r._22(e,49)._optionIds:null,r._22(e,49).multiple,r._22(e,49)._ariaDescribedby||null,r._22(e,49)._getAriaActiveDescendant(),r._22(e,49).disabled,r._22(e,49).errorState,r._22(e,49).required,r._22(e,53).ngClassUntouched,r._22(e,53).ngClassTouched,r._22(e,53).ngClassPristine,r._22(e,53).ngClassDirty,r._22(e,53).ngClassValid,r._22(e,53).ngClassInvalid,r._22(e,53).ngClassPending]),t(e,71,0,r._32(e,71,0,r._22(e,72).transform("send.destinations-label"))),t(e,87,0,r._32(e,87,0,r._22(e,88).transform("send.change-address-label"))),t(e,96,0,r._22(e,101).ngClassUntouched,r._22(e,101).ngClassTouched,r._22(e,101).ngClassPristine,r._22(e,101).ngClassDirty,r._22(e,101).ngClassValid,r._22(e,101).ngClassInvalid,r._22(e,101).ngClassPending),t(e,110,0,r._22(e,112).id,r._22(e,112).indeterminate,r._22(e,112).checked,r._22(e,112).disabled,"before"==r._22(e,112).labelPosition),t(e,117,0,r._32(e,117,0,r._22(e,118).transform("send.hours-allocation-label"))),t(e,138,0,r._32(e,138,0,r._22(e,139).transform("send.value-label"))),t(e,148,0,r._32(e,148,0,t(e,149,0,r._22(e,0),n.autoShareValue,"1.0-2"))),t(e,152,1,[r._22(e,154).tabIndex,r._22(e,154).disabled,r._22(e,154).max,r._22(e,154).min,r._22(e,154).value,r._22(e,154).vertical?"vertical":"horizontal",r._22(e,154).disabled,r._22(e,154).tickInterval,!r._22(e,154).vertical,r._22(e,154)._invertAxis,r._22(e,154)._isSliding,r._22(e,154).thumbLabel,r._22(e,154).vertical,r._22(e,154)._isMinValue,r._22(e,154).disabled||r._22(e,154)._isMinValue&&r._22(e,154)._thumbGap&&r._22(e,154)._invertAxis]),t(e,165,0,r._32(e,165,0,r._22(e,166).transform("send.preview-button"))),t(e,170,0,r._32(e,170,0,r._22(e,171).transform("send.send-button")))})}var B_=function(){function t(t){var e=this;this.priceService=t,this.showInputsOutputs=!1,this.subscription=this.priceService.price.subscribe(function(t){return e.price=t})}return t.prototype.ngOnInit=function(){var t=this;this.isPreview&&(this.transaction.hoursSent=this.transaction.outputs.filter(function(e){return t.transaction.to.find(function(t){return t===e.address})}).map(function(t){return parseInt(t.hours,10)}).reduce(function(t,e){return t+e},0))},t.prototype.ngOnDestroy=function(){this.subscription.unsubscribe()},t.prototype.toggleInputsOutputs=function(t){t.preventDefault(),this.showInputsOutputs=!this.showInputsOutputs},t}(),z_=r._7({encapsulation:0,styles:[["h4[_ngcontent-%COMP%]{font-size:14px;margin:0 0 30px}.-item[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-item[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{padding:10px;background:#f7f7f7;-ms-flex-item-align:start;align-self:flex-start;border-radius:10px}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin-left:10px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.-item[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{padding:10px 0;margin-bottom:5px}.-data[_ngcontent-%COMP%]{font-size:12px}.-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-data[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:first-child{color:rgba(30,34,39,.5);display:inline-block;width:60px}.-data.-more[_ngcontent-%COMP%]{margin-bottom:0!important}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{width:auto!important;margin-top:30px;color:#0072ff;cursor:pointer}.-data.-more[_ngcontent-%COMP%] span[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{display:inline;vertical-align:middle;font-size:13px}.-tx-meta[_ngcontent-%COMP%] .-data[_ngcontent-%COMP%]:not(:last-child){margin-bottom:10px}.-tx-price[_ngcontent-%COMP%]{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.-tx-price[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.-tx-price[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:30px}.-tx-price[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:10px 0 5px}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);font-size:12px;margin:0}.-tx-price[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}.-margin-top[_ngcontent-%COMP%]{margin-top:30px}"]],data:{}});function W_(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,yp.i,[yp.j,r.h])],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("tx.confirm-transaction")))})}function U_(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,yp.i,[yp.j,r.h])],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("tx.transaction")))})}function G_(t){return r._33(0,[(t()(),r._9(0,0,null,null,15,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(7,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(12,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(14,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.from"))),t(e,7,0,n.transaction.from),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("tx.to"))),t(e,14,0,n.transaction.to.join(", "))})}function J_(t){return r._33(0,[(t()(),r._9(0,0,null,null,17,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(7,null,[" ","\n "])),r._27(8,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.date"))),t(e,7,0,r._32(e,7,0,t(e,8,0,r._22(e.parent,0),1e3*n.transaction.timestamp,"short"))),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.status"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform(n.transaction.confirmed?"tx.confirmed":"tx.pending")))})}function q_(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(5,null,["\n "," ","\n |\n "," ","\n "])),r._27(6,2),r._25(131072,yp.i,[yp.j,r.h]),r._27(8,2),r._25(131072,yp.i,[yp.j,r.h])],null,function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent,1),n.transaction.hoursSent,"1.0-6")),r._32(e,5,1,r._22(e,7).transform("tx.hours-sent")),r._32(e,5,2,t(e,8,0,r._22(e.parent,1),n.transaction.hoursBurned,"1.0-6")),r._32(e,5,3,r._22(e,9).transform("tx.hours-burned")))})}function Q_(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(-1,null,["*"]))],null,null)}function K_(t){return r._33(0,[(t()(),r._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,1).show()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,1).hide(1500)&&i),i},null,null)),r._8(1,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(3,null,["\n ",""])),r._27(4,4),(t()(),r._4(16777216,null,null,1,null,Q_)),r._8(6,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(0,null,null,0))],function(t,e){var n=e.component;t(e,1,0,n.isPreview?"":r._32(e,1,0,r._22(e,2).transform("tx.current-rate"))),t(e,6,0,!n.isPreview)},function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,t(e,4,0,r._22(e.parent,2),n.transaction.balance*n.price,"USD","symbol","1.2-2")))})}function X_(t){return r._33(0,[(t()(),r._9(0,0,null,null,9,"div",[["class","-data -more"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"span",[],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.toggleInputsOutputs(n)&&r),r},null,null)),(t()(),r._31(3,null,["\n "," "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(5,0,null,null,2,"mat-icon",[["class","mat-icon"],["role","img"]],null,null,null,Zp,Xp)),r._8(6,638976,null,0,gu,[r.l,pu,[8,null]],null,null),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,6,0)},function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.show-more")))})}function Z_(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(5,null,[" ","\n "])),r._27(6,2)],null,function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.calculated_hours,"1.0-6")))})}function $_(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._27(16,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Z_)),r._8(19,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.component.isPreview)},function(t,e){var n=e.component;t(e,3,0,e.context.index+1),t(e,8,0,n.isPreview?e.context.$implicit.address:e.context.$implicit.owner),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.coins"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent.parent,1),e.context.$implicit.coins,"1.0-6")))})}function tm(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(3,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(5,null,[" ","\n "])),r._27(6,2)],null,function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("tx.hours"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.hours,"1.0-6")))})}function em(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,1,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,6,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(13,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(15,null,[" ","\n "])),r._27(16,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,tm)),r._8(19,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.component.isPreview)},function(t,e){var n=e.component;t(e,3,0,e.context.index+1),t(e,8,0,n.isPreview?e.context.$implicit.address:e.context.$implicit.dst),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("tx.coins"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent.parent,1),e.context.$implicit.coins,"1.0-6")))})}function nm(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,$_)),r._8(9,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,8,"div",[["class","col-md-6 -margin-top"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"h4",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,em)),r._8(19,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,9,0,n.transaction.inputs),t(e,19,0,n.transaction.outputs)},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("tx.inputs"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("tx.outputs")))})}function rm(t){return r._33(0,[r._25(0,ct,[r.w]),r._25(0,St,[r.w]),r._25(0,Ot,[r.w]),(t()(),r._9(3,0,null,null,53,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,23,"div",[["class","col-md-9 -tx-meta"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,W_)),r._8(8,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,U_)),r._8(11,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,G_)),r._8(14,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,J_)),r._8(17,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,q_)),r._8(20,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,5,"div",[["class","-data"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(25,null,["",":"])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(27,null,[" ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,16,"div",[["class","col-md-3 -tx-price"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._8(33,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(34,{"-incoming":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(39,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._31(40,null,[""," ",""])),r._27(41,2),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,K_)),r._8(45,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(48,0,null,null,4,"div",[["class","col-md-12"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,X_)),r._8(51,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,nm)),r._8(55,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,8,0,n.isPreview),t(e,11,0,!n.isPreview),t(e,14,0,n.isPreview),t(e,17,0,!n.isPreview),t(e,20,0,n.isPreview),t(e,33,0,"-icon",t(e,34,0,!n.isPreview&&n.transaction.balance>0)),t(e,45,0,n.price),t(e,51,0,!n.showInputsOutputs),t(e,55,0,n.showInputsOutputs)},function(t,e){var n=e.component;t(e,25,0,r._32(e,25,0,r._22(e,26).transform("tx.id"))),t(e,27,0,n.transaction.txid),t(e,40,0,r._32(e,40,0,t(e,41,0,r._22(e,1),n.transaction.balance,"1.0-6")),r._32(e,40,1,r._22(e,42).transform("common.coin-id")))})}var im=function(){function t(t,e){this.walletService=t,this.snackbar=e,this.onBack=new r.o}return t.prototype.ngOnDestroy=function(){this.snackbar.dismiss()},t.prototype.send=function(){var t=this;this.sendButton.isLoading()||(this.snackbar.dismiss(),this.sendButton.resetState(),this.sendButton.setLoading(),this.backButton.setDisabled(),this.walletService.injectTransaction(this.transaction.encoded).subscribe(function(){t.sendButton.setSuccess(),t.sendButton.setDisabled(),t.walletService.startDataRefreshSubscription(),setTimeout(function(){t.onBack.emit(!0)},3e3)},function(e){kc(t.snackbar,e),t.sendButton.setError(e),t.backButton.setEnabled()}))},t.prototype.back=function(){this.onBack.emit(!1)},t}(),om=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{margin-top:10px;text-align:center}"]],data:{}});function sm(t){return r._33(0,[r._29(402653184,1,{sendButton:0}),r._29(402653184,2,{backButton:0}),(t()(),r._9(2,0,null,null,1,"app-transaction-info",[],null,null,null,rm,z_)),r._8(3,245760,null,0,B_,[Cp],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._9(5,0,null,null,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.back()&&r),r},Of,Lf)),r._8(8,49152,[[2,4],["backButton",4]],0,xc,[],null,{action:"action"}),(t()(),r._31(9,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.send()&&r),r},Of,Lf)),r._8(13,49152,[[1,4],["sendButton",4]],0,xc,[],null,{action:"action"}),(t()(),r._31(14,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,e.component.transaction,!0)},function(t,e){t(e,9,0,r._32(e,9,0,r._22(e,10).transform("send.back-button"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("send.send-button")))})}var lm=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;margin:30px}"]],data:{}});function am(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-form",[],null,[[null,"onFormSubmitted"]],function(t,e,n){var r=!0;return"onFormSubmitted"===e&&(r=!1!==t.component.onFormSubmitted(n)&&r),r},__,p_)),r._8(1,245760,null,0,h_,[Kl,$r,Ns,_c,Sc],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(t,e){t(e,1,0,e.component.formData)},null)}function um(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-form-advanced",[],null,[[null,"onFormSubmitted"]],function(t,e,n){var r=!0;return"onFormSubmitted"===e&&(r=!1!==t.component.onFormSubmitted(n)&&r),r},V_,E_)),r._8(1,245760,null,0,P_,[$r,Kl,Ns,_c,Sc],{formData:[0,"formData"]},{onFormSubmitted:"onFormSubmitted"})],function(t,e){t(e,1,0,e.component.formData)},null)}function cm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-preview",[],null,[[null,"onBack"]],function(t,e,n){var r=!0;return"onBack"===e&&(r=!1!==t.component.onBack(n)&&r),r},sm,om)),r._8(1,180224,null,0,im,[$r,_c],{transaction:[0,"transaction"]},{onBack:"onBack"})],function(t,e){t(e,1,0,e.component.transaction)},null)}function dm(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(1,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(4,0,null,null,13,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,10,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,am)),r._8(9,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,um)),r._8(12,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,cm)),r._8(15,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,r._32(e,1,0,r._22(e,2).transform("title.wallets"))),t(e,9,0,n.showForm&&n.activeForm===n.activeForms.LeftButton),t(e,12,0,n.showForm&&n.activeForm===n.activeForms.RightButton),t(e,15,0,!n.showForm)},null)}var hm=r._5("app-send-skycoin",Dc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-send-skycoin",[],null,null,null,dm,lm)),r._8(1,180224,null,0,Dc,[Sc],null,null)],null,null)},{},{},[]),pm=function(){this.isLoading=!0},fm=r._7({encapsulation:0,styles:[[".-content[_ngcontent-%COMP%]{text-align:center;margin:50px 0;color:rgba(30,34,39,.5);font-size:13px}.-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-top:15px}.-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:rgba(30,34,39,.2);font-size:40px}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.-content[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%] circle{stroke:rgba(30,34,39,.2)}"]],data:{}});function _m(t){return r._33(0,[(t()(),r._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"mat-spinner",[["class","mat-spinner mat-progress-spinner"],["mode","indeterminate"],["role","progressbar"]],[[4,"width","px"],[4,"height","px"]],null,null,xf,kf)),r._8(3,573440,null,0,Xu,[r.l,ei,[2,Pt]],{diameter:[0,"diameter"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,40)},function(t,e){t(e,2,0,r._22(e,3)._elementSize,r._22(e,3)._elementSize),t(e,6,0,r._32(e,6,0,r._22(e,7).transform("common.loading")))})}function mm(t){return r._33(0,[(t()(),r._9(0,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"i",[["class","material-icons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["announcement"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,6,0,r._32(e,6,0,r._22(e,7).transform(n.noDataText)))})}function gm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"div",[["class","-content"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,_m)),r._8(3,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,mm)),r._8(6,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.isLoading),t(e,6,0,!n.isLoading)},null)}var ym=r._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:30px}.-transaction[_ngcontent-%COMP%]{background-color:#fafafa;border-bottom:1px solid #eff0f0;cursor:pointer;display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px 12px}.-transaction[_ngcontent-%COMP%]:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-transaction[_ngcontent-%COMP%]:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-transaction[_ngcontent-%COMP%] > div[_ngcontent-%COMP%]{padding:0 8px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%]{margin-top:5px}.-transaction[_ngcontent-%COMP%] .-icon[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-transaction[_ngcontent-%COMP%] .-icon.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1);-webkit-filter:FlipH;filter:FlipH;-ms-filter:FlipH}.-transaction[_ngcontent-%COMP%] .-icon.-pending[_ngcontent-%COMP%]{opacity:.5}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1;flex:1}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:10px;line-height:12px;padding-left:5px;font-weight:300}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-pending[_ngcontent-%COMP%]{color:#fdb51e}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] h4[_ngcontent-%COMP%] .-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:5px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{display:inline-block;height:17px;vertical-align:middle;width:17px;margin-right:4px}.-transaction[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%] .-item[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%]{width:200px;text-align:right}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#1e2227;font-size:13px;font-weight:700;line-height:15px;margin:0 0 8px}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);display:inline-block;font-size:13px;line-height:15px;margin:0}.-transaction[_ngcontent-%COMP%] .-balance[_ngcontent-%COMP%] p[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:rgba(121,135,152,.5)}"]],data:{}});function vm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","history.no-txs"]],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.transactions,"history.no-txs")},null)}function bm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._27(6,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.sent")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function wm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.sending")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,r._22(e,6).transform("history.pending")))})}function Mm(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-timestamp"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._27(6,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.received")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,t(e,6,0,r._22(e.parent.parent.parent.parent,0),1e3*e.parent.parent.context.$implicit.timestamp,"short")))})}function km(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"h4",[],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(4,0,null,null,2,"span",[["class","-pending"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.receiving")),r._32(e,1,1,r._22(e,3).transform("common.coin-id"))),t(e,5,0,r._32(e,5,0,r._22(e,6).transform("history.pending")))})}function xm(t){return r._33(0,[(t()(),r._9(0,0,null,null,6,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.context.$implicit)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,5,0,e.context.$implicit)})}function Lm(t){return r._33(0,[(t()(),r._9(0,16777216,null,null,7,"p",[],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,1).show()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,1).hide(1500)&&i),i},null,null)),r._8(1,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(3,null,["\n ",""])),r._27(4,4),(t()(),r._9(5,0,null,null,1,"span",[],null,null,null,null,null)),(t()(),r._31(-1,null,["*"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(0,null,null,0))],function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("tx.current-rate")))},function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,t(e,4,0,r._22(e.parent.parent.parent.parent,2),e.parent.parent.context.$implicit.balance*n.price,"USD","symbol","1.2-2")))})}function Cm(t){return r._33(0,[(t()(),r._9(0,0,null,null,37,"div",[["class","-transaction"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showTransaction(t.parent.context.$implicit)&&r),r},null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,5,"div",[["class","-icon"]],null,null,null,null,null)),r._8(3,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(4,{"-incoming":0,"-pending":1}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"img",[["src","/assets/img/send-blue.png"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,16,"div",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,bm)),r._8(12,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,wm)),r._8(15,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Mm)),r._8(18,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,km)),r._8(21,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,xm)),r._8(24,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,9,"div",[["class","-balance"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,3,"h4",[],null,null,null,null,null)),(t()(),r._31(30,null,[""," ",""])),r._27(31,2),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Lm)),r._8(35,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,3,0,"-icon",t(e,4,0,e.parent.context.$implicit.balance>0,!e.parent.context.$implicit.confirmed)),t(e,12,0,e.parent.context.$implicit.balance<0&&e.parent.context.$implicit.confirmed),t(e,15,0,e.parent.context.$implicit.balance<0&&!e.parent.context.$implicit.confirmed),t(e,18,0,e.parent.context.$implicit.balance>0&&e.parent.context.$implicit.confirmed),t(e,21,0,e.parent.context.$implicit.balance>0&&!e.parent.context.$implicit.confirmed),t(e,24,0,e.parent.context.$implicit.addresses),t(e,35,0,n.price)},function(t,e){t(e,30,0,r._32(e,30,0,t(e,31,0,r._22(e.parent.parent.parent,1),e.parent.context.$implicit.balance,"1.0-6")),r._32(e,30,1,r._22(e,32).transform("common.coin-id")))})}function Sm(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Cm)),r._8(3,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,0!==e.context.$implicit.balance)},null)}function Tm(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Sm)),r._8(3,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.transactions)},null)}function Om(t){return r._33(0,[r._25(0,ct,[r.w]),r._25(0,St,[r.w]),r._25(0,Ot,[r.w]),(t()(),r._9(3,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(4,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(7,0,null,null,7,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,vm)),r._8(10,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Tm)),r._8(13,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,r._32(e,4,0,r._22(e,5).transform("title.transactions"))),t(e,10,0,!n.transactions||0===n.transactions.length),t(e,13,0,n.transactions&&n.transactions.length>0)},null)}var Dm=r._5("app-transaction-list",Tp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-transaction-list",[],null,null,null,Om,ym)),r._8(1,245760,null,0,Tp,[Ns,Cp,$r],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Ym=function(){function t(){this.statuses=["done","waiting_confirm","waiting_deposit","waiting_send"]}return t.prototype.transform=function(t){return this.statuses.find(function(e){return e===t})?"teller."+t.replace("_","-"):"teller.unknown"},t}(),Pm=r._7({encapsulation:0,styles:[[".-background-container[_ngcontent-%COMP%]{background-color:#fbfbfb;padding-top:30px;max-width:100%;min-height:calc(100% - 190px);overflow:hidden;position:relative}.-background-image[_ngcontent-%COMP%]{display:none}@media (min-width:768px){.-background-image[_ngcontent-%COMP%]{display:block;left:50%;width:80%;position:absolute;top:0}}@media (min-width:992px){.-background-image[_ngcontent-%COMP%]{left:40%;width:90%;max-width:850px}}@media (min-width:1200px){.-background-image[_ngcontent-%COMP%]{left:40%;width:80%;max-width:850px}}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:10px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:30px;position:relative;margin-top:30px;max-width:540px;z-index:5}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:30px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%]{width:60px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-number[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{border-radius:50%;color:#fff;display:inline-block;font-size:16px;font-weight:700;height:40px;line-height:46px;text-align:center;width:40px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1;flex:1 1}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] button{margin-left:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#1e2227;font-size:16px;font-weight:700;margin:0;line-height:46px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px;font-weight:300;line-height:20px;margin-top:0}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-address[_ngcontent-%COMP%], .-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-status[_ngcontent-%COMP%]{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;color:rgba(30,34,39,.8);display:block;font-size:14px;line-height:20px;margin-bottom:15px;padding:10px;width:100%}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-coins[_ngcontent-%COMP%]{color:#0072ff}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .form-field[_ngcontent-%COMP%]{margin-bottom:15px}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-subtitle[_ngcontent-%COMP%]{color:#8c8e90;font-size:12px;line-height:18px;font-weight:300;opacity:.8}.-paper[_ngcontent-%COMP%] .-step[_ngcontent-%COMP%] .-instructions[_ngcontent-%COMP%] .-wallet[_ngcontent-%COMP%]{color:rgba(30,34,39,.8);font-size:14px}"]],data:{}});function Em(t){return r._33(0,[(t()(),r._9(0,0,null,null,7,"option",[],null,null,null,null,null)),r._8(1,147456,null,0,pl,[r.l,r.G,[2,hl]],{value:[0,"value"]},null),r._8(2,147456,null,0,ml,[r.l,r.G,[8,null]],{value:[0,"value"]},null),(t()(),r._31(3,null,["\n "," - "])),(t()(),r._9(4,0,null,null,2,"span",[["class","-coins"]],null,null,null,null,null)),(t()(),r._31(5,null,[""," ",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,1,0,e.context.$implicit.filename),t(e,2,0,e.context.$implicit.filename)},function(t,e){t(e,3,0,e.context.$implicit.label),t(e,5,0,e.context.$implicit.coins,r._32(e,5,1,r._22(e,6).transform("common.coin-id")))})}function Am(t){return r._33(0,[(t()(),r._9(0,0,null,null,26,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["2"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,17,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,3,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._26(16,{rate:0}),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,1,"span",[["class","-address"]],null,null,null,null,null)),(t()(),r._31(20,null,["\n ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._31(23,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("buy.send"))),t(e,15,0,r._32(e,15,0,r._22(e,17).transform("buy.send-desc",t(e,16,0,n.config.sky_btc_exchange_rate)))),t(e,20,0,n.order.deposit_address),t(e,23,0,r._32(e,23,0,r._22(e,24).transform("buy.fraction-warning")))})}function jm(t){return r._33(0,[(t()(),r._9(0,0,null,null,34,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["3"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,25,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(18,0,null,null,4,"span",[["class","-status"]],null,null,null,null,null)),(t()(),r._31(19,null,["\n "," ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),r._27(21,1),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.checkStatus()&&r),r},Of,Lf)),r._8(25,49152,[[1,4],["button",4]],0,xc,[],null,{action:"action"}),(t()(),r._31(26,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.removeOrder()&&r),r},Of,Lf)),r._8(30,49152,[[1,4],["button",4]],0,xc,[],null,{action:"action"}),(t()(),r._31(31,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("buy.receive"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("buy.receive-desc"))),t(e,19,0,r._32(e,19,0,r._22(e,20).transform("buy.status-button")),r._32(e,19,1,r._22(e,22).transform(r._32(e,19,1,t(e,21,0,r._22(e.parent.parent,0),n.order.status))))),t(e,26,0,r._32(e,26,0,r._22(e,27).transform("buy.check-status-button"))),t(e,31,0,r._32(e,31,0,r._22(e,32).transform("buy.new-order-button")))})}function Im(t){return r._33(0,[(t()(),r._9(0,0,null,null,59,"div",[["class","-paper"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,1).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,1).onReset()&&i),i},null,null)),r._8(1,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(3,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,47,"div",[["class","-step"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,4,"div",[["class","-number"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,1,"span",[["class","primary-gradient-background"]],null,null,null,null,null)),(t()(),r._31(-1,null,["1"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,38,"div",[["class","-instructions flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,2,"h3",[],null,null,null,null,null)),(t()(),r._31(16,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(20,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,23,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,20,"div",[["class","-select"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,17,"select",[["class","-wallet"],["formControlName","wallet"],["id","wallet"],["required",""]],[[1,"required",0],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"change"],[null,"blur"]],function(t,e,n){var i=!0;return"change"===e&&(i=!1!==r._22(t,28).onChange(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,28).onTouched()&&i),i},null,null)),r._8(28,16384,null,0,hl,[r.G,r.l],null,null),r._8(29,16384,null,0,Ql,[],{required:[0,"required"]},null),r._28(1024,null,Js,function(t){return[t]},[Ql]),r._28(1024,null,$s,function(t){return[t]},[hl]),r._8(32,671744,null,0,ql,[[3,Us],[2,Js],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(34,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,4,"option",[["disabled",""],["selected",""]],null,null,null,null,null)),r._8(37,147456,null,0,pl,[r.l,r.G,[2,hl]],null,null),r._8(38,147456,null,0,ml,[r.l,r.G,[8,null]],null,null),(t()(),r._31(39,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Em)),r._8(43,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(48,0,null,null,2,"span",[["class","-subtitle"]],null,null,null,null,null)),(t()(),r._31(49,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Am)),r._8(55,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,jm)),r._8(58,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){var n=e.component;t(e,1,0,n.form),t(e,29,0,""),t(e,32,0,"wallet"),t(e,43,0,n.wallets),t(e,55,0,n.order),t(e,58,0,n.order)},function(t,e){t(e,0,0,r._22(e,3).ngClassUntouched,r._22(e,3).ngClassTouched,r._22(e,3).ngClassPristine,r._22(e,3).ngClassDirty,r._22(e,3).ngClassValid,r._22(e,3).ngClassInvalid,r._22(e,3).ngClassPending),t(e,16,0,r._32(e,16,0,r._22(e,17).transform("buy.deposit-location"))),t(e,20,0,r._32(e,20,0,r._22(e,21).transform("buy.deposit-location-desc"))),t(e,27,0,r._22(e,29).required?"":null,r._22(e,34).ngClassUntouched,r._22(e,34).ngClassTouched,r._22(e,34).ngClassPristine,r._22(e,34).ngClassDirty,r._22(e,34).ngClassValid,r._22(e,34).ngClassInvalid,r._22(e,34).ngClassPending),t(e,39,0,r._32(e,39,0,r._22(e,40).transform("buy.make-choice"))),t(e,49,0,r._32(e,49,0,r._22(e,50).transform("buy.wallets-desc")))})}function Rm(t){return r._33(0,[r._25(0,Ym,[]),r._29(671088640,1,{button:0}),(t()(),r._9(2,0,null,null,1,"app-header",[],null,null,null,i_,Vf)),r._8(3,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],null,null),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(5,0,null,null,9,"div",[["class","-background-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,6,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Im)),r._8(10,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,0,"img",[["class","-background-image"],["src","../../../../assets/img/otc-background.jpg"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0),t(e,10,0,n.config)},null)}var Hm=r._5("app-buy",Lp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-buy",[],null,null,null,Rm,Pm)),r._8(1,245760,null,0,Lp,[Kl,xp,_c,$r],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Fm=r._7({encapsulation:0,styles:[[".-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px;margin:30px 30px 0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:first-child{margin-top:0}.-paper[_ngcontent-%COMP%] p[_ngcontent-%COMP%]:last-child{margin-bottom:0}.-text-muted[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-text-right[_ngcontent-%COMP%]{text-align:right}.-link[_ngcontent-%COMP%]{color:#0072ff;cursor:pointer}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function Nm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","backup.no-wallets"]],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!1,"backup.no-wallets")},null)}function Vm(t){return r._33(0,[(t()(),r._9(0,0,null,null,14,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-width-250 -label"]],[[1,"title",0]],null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,1,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,5,"div",[["class","-flex-fill -text-right"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"span",[["class","-link"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showSeed(t.context.$implicit)&&r),r},null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,2,0,e.context.$implicit.label),t(e,3,0,e.context.$implicit.label),t(e,6,0,e.context.$implicit.filename),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("backup.show-seed")))})}function Bm(t){return r._33(0,[(t()(),r._9(0,0,null,null,20,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,11,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"div",[["class","-width-250"]],null,null,null,null,null)),(t()(),r._31(5,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,0,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Vm)),r._8(18,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,18,0,e.component.onlyEncrypted)},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("backup.wallet"))),t(e,9,0,r._32(e,9,0,r._22(e,10).transform("backup.filename")))})}function zm(t){return r._33(0,[(t()(),r._9(0,0,null,null,31,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(3,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._9(6,0,null,null,24,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,15,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(11,null,[""," ",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(18,0,null,null,4,"p",[["class","-text-muted"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,1,"small",[],[[8,"innerHTML",1]],null,null,null,null)),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Nm)),r._8(26,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Bm)),r._8(29,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,r._32(e,3,0,r._22(e,4).transform("title.backup"))),t(e,26,0,0===n.onlyEncrypted.length),t(e,29,0,n.onlyEncrypted.length>0)},function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("backup.wallet-directory")),n.folder),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("backup.seed-warning"))),t(e,20,0,r._32(e,20,0,r._22(e,21).transform("backup.desc")))})}var Wm=r._5("app-backup",bp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-backup",[],null,null,null,zm,Fm)),r._8(1,245760,null,0,bp,[$r,Ns],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Um=function(){function t(){}return t.prototype.transform=function(t){return Yc.unix(t).format("YYYY-MM-DD HH:mm")},t}(),Gm=r._7({encapsulation:0,styles:[[".-wrapper[_ngcontent-%COMP%]{margin:30px}.-paper[_ngcontent-%COMP%]{background-color:#fbfbfb;border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);padding:20px;font-size:13px}.-item[_ngcontent-%COMP%]:not(:last-child){margin-bottom:20px}.-item[_ngcontent-%COMP%] .-key[_ngcontent-%COMP%]{color:rgba(30,34,39,.5);margin-bottom:5px}.-item[_ngcontent-%COMP%] .-value[_ngcontent-%COMP%]{word-break:break-all}"]],data:{}});function Jm(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],null,null)],null,null)}function qm(t){return r._33(0,[(t()(),r._9(0,0,null,null,101,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,98,"div",[["class","row -wrapper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,36,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,33,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._27(16,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(22,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(26,null,["",""])),r._27(27,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(30,0,null,null,8,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(33,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,1,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(37,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(42,0,null,null,57,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,54,"div",[["class","-paper"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(46,0,null,null,51,"div",[["class","row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(48,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(50,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(52,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(53,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(56,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(57,null,["",""])),r._27(58,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(61,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(63,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(64,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(67,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(68,null,["",""])),r._27(69,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(73,0,null,null,23,"div",[["class","col-md-6"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(75,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(77,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(78,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(81,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(82,null,["",""])),r._27(83,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(86,0,null,null,9,"div",[["class","-item"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(88,0,null,null,2,"div",[["class","-key"]],null,null,null,null,null)),(t()(),r._31(89,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(92,0,null,null,2,"div",[["class","-value"]],null,null,null,null,null)),(t()(),r._31(93,null,["",""])),r._27(94,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){var n=e.component;t(e,11,0,r._32(e,11,0,r._22(e,12).transform("blockchain.blocks"))),t(e,15,0,r._32(e,15,0,t(e,16,0,r._22(e.parent,0),n.block.header.seq))),t(e,22,0,r._32(e,22,0,r._22(e,23).transform("blockchain.time"))),t(e,26,0,r._32(e,26,0,t(e,27,0,r._22(e.parent,1),n.block.header.timestamp))),t(e,33,0,r._32(e,33,0,r._22(e,34).transform("blockchain.hash"))),t(e,37,0,n.block.header.block_hash),t(e,53,0,r._32(e,53,0,r._22(e,54).transform("blockchain.current-supply"))),t(e,57,0,r._32(e,57,0,t(e,58,0,r._22(e.parent,0),n.coinSupply.current_supply))),t(e,64,0,r._32(e,64,0,r._22(e,65).transform("blockchain.total-supply"))),t(e,68,0,r._32(e,68,0,t(e,69,0,r._22(e.parent,0),n.coinSupply.total_supply))),t(e,78,0,r._32(e,78,0,r._22(e,79).transform("blockchain.current-coinhour-supply"))),t(e,82,0,r._32(e,82,0,t(e,83,0,r._22(e.parent,0),n.coinSupply.current_coinhour_supply))),t(e,89,0,r._32(e,89,0,r._22(e,90).transform("blockchain.total-coinhour-supply"))),t(e,93,0,r._32(e,93,0,t(e,94,0,r._22(e.parent,0),n.coinSupply.total_coinhour_supply)))})}function Qm(t){return r._33(0,[r._25(0,St,[r.w]),r._25(0,Um,[]),(t()(),r._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(5,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,Jm)),r._8(9,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,qm)),r._8(12,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.blockchain"))),t(e,9,0,!(n.block&&n.block.header&&n.coinSupply)),t(e,12,0,n.block&&n.block.header&&n.coinSupply)},null)}var Km=r._5("app-blockchain",mp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-blockchain",[],null,null,null,Qm,Gm)),r._8(1,114688,null,0,mp,[_p],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Xm=function(){function t(){}return t.prototype.transform=function(t){return Yc.unix(t).fromNow()},t}(),Zm=r._7({encapsulation:0,styles:[[".-last-seen[_ngcontent-%COMP%], .-port[_ngcontent-%COMP%], .-source[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-direction[_ngcontent-%COMP%]{width:72px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.-direction[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:32px}.-direction[_ngcontent-%COMP%] img.-incoming[_ngcontent-%COMP%]{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.-last-seen[_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;font-size:12px;line-height:1;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.-last-seen[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:12px;display:inline;vertical-align:middle;padding-right:5px}.-trusted[_ngcontent-%COMP%]{display:inline;color:#0072ff;font-size:13px;vertical-align:middle}.-text-right[_ngcontent-%COMP%]{text-align:right}.-pl-0[_ngcontent-%COMP%]{padding-left:0!important}"]],data:{}});function $m(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],null,null)],null,null)}function tg(t){return r._33(0,[(t()(),r._9(0,0,null,null,46,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,7,"div",[["class","-direction"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,16777216,null,null,4,"img",[["src","/assets/img/send-blue.png"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,7).show()&&i),"keydown"===e&&(i=!1!==r._22(t,7)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,7).hide(1500)&&i),i},null,null)),r._8(5,278528,null,0,I,[r.u,r.v,r.l,r.G],{ngClass:[0,"ngClass"]},null),r._26(6,{"-incoming":0}),r._8(7,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,4,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(t()(),r._31(12,null,["\n ",""])),(t()(),r._9(13,0,null,null,1,"span",[["class","-port"]],null,null,null,null,null)),(t()(),r._31(14,null,[":",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,2,"div",[["class","-flex-fill -source"]],null,null,null,null,null)),(t()(),r._31(18,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(21,0,null,null,1,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(22,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,21,"div",[["class","-width-200 -last-seen"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(26,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(28,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,30).show()&&i),"keydown"===e&&(i=!1!==r._22(t,30)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,30).hide(1500)&&i),i},Zp,Xp)),r._8(29,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(30,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["keyboard_arrow_up"])),(t()(),r._31(33,null,["\n ","\n "])),r._27(34,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(36,0,null,null,8,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(38,16777216,null,null,4,"mat-icon",[["class","mat-icon"],["role","img"]],null,[[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0;return"longpress"===e&&(i=!1!==r._22(t,40).show()&&i),"keydown"===e&&(i=!1!==r._22(t,40)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,40).hide(1500)&&i),i},Zp,Xp)),r._8(39,638976,null,0,gu,[r.l,pu,[8,null]],null,null),r._8(40,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["keyboard_arrow_down"])),(t()(),r._31(43,null,["\n ","\n "])),r._27(44,1),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,5,0,t(e,6,0,!e.context.$implicit.outgoing)),t(e,7,0,r._32(e,7,0,r._22(e,8).transform(e.context.$implicit.outgoing?"network.out":"network.in"))),t(e,29,0),t(e,30,0,r._32(e,30,0,r._22(e,31).transform("network.last-sent"))),t(e,39,0),t(e,40,0,r._32(e,40,0,r._22(e,41).transform("network.last-received")))},function(t,e){t(e,12,0,e.context.$implicit.address.split(":")[0]),t(e,14,0,e.context.$implicit.listen_port),t(e,18,0,r._32(e,18,0,r._22(e,19).transform("network.sources."+e.context.$implicit.source))),t(e,22,0,e.context.$implicit.height),t(e,33,0,r._32(e,33,0,t(e,34,0,r._22(e.parent.parent,0),e.context.$implicit.last_sent))),t(e,43,0,r._32(e,43,0,t(e,44,0,r._22(e.parent.parent,0),e.context.$implicit.last_received)))})}function eg(t){return r._33(0,[(t()(),r._9(0,0,null,null,31,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,28,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,19,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"div",[["class","-direction"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"div",[["class","-width-200 -pl-0"]],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,2,"div",[["class","-width-200"]],null,null,null,null,null)),(t()(),r._31(21,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,tg)),r._8(28,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,28,0,e.component.peers)},function(t,e){t(e,9,0,r._32(e,9,0,r._22(e,10).transform("network.peer"))),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("network.source"))),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("network.block-height"))),t(e,21,0,r._32(e,21,0,r._22(e,22).transform("network.last-seen")))})}function ng(t){return r._33(0,[r._25(0,Xm,[]),(t()(),r._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(4,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,$m)),r._8(8,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,eg)),r._8(11,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,r._32(e,4,0,r._22(e,5).transform("title.network"))),t(e,8,0,!n.peers),t(e,11,0,n.peers)},null)}var rg=r._5("app-network",kp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-network",[],null,null,null,ng,Zm)),r._8(1,245760,null,0,kp,[Mp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),ig=r._7({encapsulation:0,styles:[[".-text-right[_ngcontent-%COMP%]{text-align:right}.-grey[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-row.-small[_ngcontent-%COMP%]{height:40px;line-height:40px}.-hash[_ngcontent-%COMP%]{margin-left:27px}.-address[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}.-address[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{width:17px;vertical-align:middle;margin-right:10px}.-label[_ngcontent-%COMP%]{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}"]],data:{}});function og(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","errors.no-outputs"]],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.wallets,"errors.no-outputs")},null)}function sg(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,"div",[["class","-row -small"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-flex-fill -hash"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._27(7,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"div",[["class","-width-150 -text-right -grey"]],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._27(11,2),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,3,0,e.context.$implicit.hash),t(e,6,0,r._32(e,6,0,t(e,7,0,r._22(e.parent.parent.parent.parent,0),e.context.$implicit.coins,"1.0-6"))),t(e,10,0,r._32(e,10,0,t(e,11,0,r._22(e.parent.parent.parent.parent,0),e.context.$implicit.calculated_hours,"1.0-6")))})}function lg(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,null,null,null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,6,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,3,"div",[["class","-flex-fill -address"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,0,"img",[["class","qr-code-button"],["src","../../../../../assets/img/qr-code-black.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.showQrCode(n,t.context.$implicit.address)&&r),r},null,null)),(t()(),r._31(7,null,["\n ","\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,sg)),r._8(11,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,11,0,e.context.$implicit.outputs)},function(t,e){t(e,7,0,e.context.$implicit.address)})}function ag(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,12,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,1,"div",[["class","-flex-fill -label"]],[[1,"title",0]],null,null,null,null)),(t()(),r._31(5,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,2,"div",[["class","-width-150 -text-right"]],null,null,null,null,null)),(t()(),r._31(12,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,lg)),r._8(19,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,19,0,e.context.$implicit.addresses)},function(t,e){t(e,4,0,e.context.$implicit.label),t(e,5,0,e.context.$implicit.label),t(e,8,0,r._32(e,8,0,r._22(e,9).transform("common.coin-id"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("common.coin-hours")))})}function ug(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,ag)),r._8(3,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,e.component.wallets)},null)}function cg(t){return r._33(0,[r._25(0,St,[r.w]),(t()(),r._9(1,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(4,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,og)),r._8(8,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,ug)),r._8(11,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,4,0,r._32(e,4,0,r._22(e,5).transform("title.outputs"))),t(e,8,0,!n.wallets||0===n.wallets.length||0===n.wallets[0].addresses[0].outputs.length),t(e,11,0,n.wallets&&n.wallets.length>0)},null)}var dg=r._5("app-outputs",fp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-outputs",[],null,null,null,cg,ig)),r._8(1,180224,null,0,fp,[$r,$d,Ns],null,null)],null,null)},{},{},[]),hg=r._7({encapsulation:0,styles:[[".-timestamp[_ngcontent-%COMP%]{color:rgba(30,34,39,.5)}"]],data:{}});function pg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-loading-content",[["noDataText","pending-txs.none"]],null,null,null,gm,fm)),r._8(1,49152,null,0,pm,[],{isLoading:[0,"isLoading"],noDataText:[1,"noDataText"]},null)],function(t,e){t(e,1,0,!e.component.transactions,"pending-txs.none")},null)}function fg(t){return r._33(0,[(t()(),r._9(0,0,null,null,12,"div",[["class","-row"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,1,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(6,null,["",""])),r._27(7,2),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"div",[["class","-width-150 -timestamp"]],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._27(11,1),(t()(),r._31(-1,null,["\n "]))],null,function(t,e){t(e,3,0,e.context.$implicit.txid),t(e,6,0,r._32(e,6,0,t(e,7,0,r._22(e.parent.parent,0),e.context.$implicit.amount,"1.0-6"))),t(e,10,0,r._32(e,10,0,t(e,11,0,r._22(e.parent.parent,1),e.context.$implicit.timestamp)))})}function _g(t){return r._33(0,[(t()(),r._9(0,0,null,null,25,"div",[["class","container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,22,"div",[["class","-table"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,13,"div",[["class","-headers"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"div",[["class","-flex-fill"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,2,"div",[["class","-width-150"]],null,null,null,null,null)),(t()(),r._31(15,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(19,0,null,null,4,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,fg)),r._8(22,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,22,0,e.component.transactions)},function(t,e){t(e,7,0,r._32(e,7,0,r._22(e,8).transform("pending-txs.txid"))),t(e,11,0,r._32(e,11,0,r._22(e,12).transform("common.coin-id"))),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("pending-txs.timestamp")))})}function mg(t){return r._33(0,[r._25(0,St,[r.w]),r._25(0,Um,[]),(t()(),r._9(2,0,null,null,11,"div",[["class","sky-container sky-container-grey"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,2,"app-header",[],null,null,null,i_,Vf)),r._8(5,245760,null,0,Nf,[Ap,rr,_p,Cp,$r,Wn,yp.j],{headline:[0,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,pg)),r._8(9,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n "])),(t()(),r._4(16777216,null,null,1,null,_g)),r._8(12,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,r._32(e,5,0,r._22(e,6).transform("title.pending-txs"))),t(e,9,0,!n.transactions||0===n.transactions.length),t(e,12,0,n.transactions&&n.transactions.length>0)},null)}var gg=r._5("app-pending-transactions",Pc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-pending-transactions",[],null,null,null,mg,hg)),r._8(1,245760,null,0,Pc,[$r,Sc],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),yg=function(){function t(t){this.dialogRef=t,this.acceptSafe=!1}return t.prototype.closePopup=function(){this.dialogRef.close(this.acceptSafe)},t.prototype.setAccept=function(t){this.acceptSafe=t.checked},t}(),vg=function(){function t(t,e,n){this.dialog=t,this.apiService=e,this.formBuilder=n,this.fill=null,this.onLabelAndSeedCreated=new r.o,this.doubleButtonActive=Tc.LeftButton}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.initForm=function(){this.form=this.formBuilder.group({label:new Il("",[Qs.required]),seed:new Il("",[Qs.required]),confirm_seed:new Il},{validator:this.showCreateForm?this.seedMatchValidator.bind(this):null}),this.fill?(this.form.get("label").setValue(this.fill.label),this.form.get("seed").setValue(this.fill.seed),this.form.get("confirm_seed").setValue(this.fill.seed),this.doubleButtonActive=this.fill.create?Tc.LeftButton:Tc.RightButton):this.showCreateForm&&this.generateSeed(128)},t.prototype.changeForm=function(t){this.doubleButtonActive=t,this.fill=null,this.initForm()},t.prototype.createWallet=function(){var t=this;this.showSafe().afterClosed().subscribe(function(e){e&&t.emitCreatedData()})},t.prototype.loadWallet=function(){this.emitCreatedData()},t.prototype.generateSeed=function(t){var e=this;this.apiService.generateSeed(t).subscribe(function(t){return e.form.get("seed").setValue(t)})},Object.defineProperty(t.prototype,"showCreateForm",{get:function(){return this.doubleButtonActive===Tc.LeftButton},enumerable:!0,configurable:!0}),t.prototype.emitCreatedData=function(){this.onLabelAndSeedCreated.emit([this.form.get("label").value,this.form.get("seed").value,this.doubleButtonActive===Tc.LeftButton])},t.prototype.seedMatchValidator=function(t){return t.get("seed").value===t.get("confirm_seed").value?null:{NotEqual:!0}},t.prototype.showSafe=function(){var t=new Ps;return t.width="450px",this.dialog.open(yg,t)},t}(),bg=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-toggle-container[_ngcontent-%COMP%]{margin:10px auto}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px}"]],data:{}});function wg(t){return r._33(0,[(t()(),r._9(0,0,null,null,16,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,3).show()&&i),"keydown"===e&&(i=!1!==r._22(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,3).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._8(3,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(5,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._31(-1,null,["|"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,12).show()&&i),"keydown"===e&&(i=!1!==r._22(t,12)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,12).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._8(12,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(14,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("wallet.new.generate-12-seed"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("wallet.new.generate-24-seed")))},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("wallet.new.12-words"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.24-words")))})}function Mg(t){return r._33(0,[(t()(),r._9(0,0,null,null,101,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(4,0,null,null,15,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(9,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(15,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(16,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,9,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(24,0,null,null,6,"div",[["class","col-sm-4 -toggle-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(26,0,null,null,3,"app-double-button",[],null,[[null,"onStateChange"]],function(t,e,n){var r=!0;return"onStateChange"===e&&(r=!1!==t.component.changeForm(n)&&r),r},Yf,Df)),r._8(27,49152,null,0,Oc,[],{rightButtonText:[0,"rightButtonText"],leftButtonText:[1,"leftButtonText"],activeButton:[2,"activeButton"]},{onStateChange:"onStateChange"}),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(33,0,null,null,59,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,56,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,53,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,39).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,39).onReset()&&i),i},null,null)),r._8(38,16384,null,0,Xl,[],null,null),r._8(39,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(41,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(43,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(45,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(46,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,50)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,50).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,50)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,50)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(50,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(52,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(54,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(57,0,null,null,18,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(59,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(61,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(62,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,wg)),r._8(66,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(69,0,null,null,5,"textarea",[["class","form-control"],["formControlName","seed"],["id","seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,70)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,70).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,70)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,70)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(70,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(72,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(74,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(77,0,null,null,12,"div",[["class","form-field"]],[[4,"visibility",null]],null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(79,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._31(80,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(83,0,null,null,5,"textarea",[["class","form-control"],["formControlName","confirm_seed"],["id","confirm_seed"],["rows","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,84)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,84).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,84)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,84)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(84,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(86,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(88,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(94,0,null,null,6,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(96,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0,i=t.component;return"action"===e&&(r=!1!==(i.showCreateForm?i.createWallet():i.loadWallet())&&r),r},Of,Lf)),r._8(97,49152,null,0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(98,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,27,0,r._32(e,27,0,r._22(e,28).transform("common.load")),r._32(e,27,1,r._22(e,29).transform("common.new")),n.doubleButtonActive),t(e,39,0,n.form),t(e,52,0,"label"),t(e,66,0,n.showCreateForm),t(e,72,0,"seed"),t(e,86,0,"confirm_seed"),t(e,97,0,!n.form.valid)},function(t,e){var n=e.component;t(e,9,0,r._32(e,9,0,r._22(e,10).transform("wallet.new.create-title"))),t(e,16,0,r._32(e,16,0,r._22(e,17).transform("wizard.wallet-desc"))),t(e,37,0,r._22(e,41).ngClassUntouched,r._22(e,41).ngClassTouched,r._22(e,41).ngClassPristine,r._22(e,41).ngClassDirty,r._22(e,41).ngClassValid,r._22(e,41).ngClassInvalid,r._22(e,41).ngClassPending),t(e,46,0,r._32(e,46,0,r._22(e,47).transform("wallet.new.name-label"))),t(e,49,0,r._22(e,54).ngClassUntouched,r._22(e,54).ngClassTouched,r._22(e,54).ngClassPristine,r._22(e,54).ngClassDirty,r._22(e,54).ngClassValid,r._22(e,54).ngClassInvalid,r._22(e,54).ngClassPending),t(e,62,0,r._32(e,62,0,r._22(e,63).transform("wallet.new.seed-label"))),t(e,69,0,r._22(e,74).ngClassUntouched,r._22(e,74).ngClassTouched,r._22(e,74).ngClassPristine,r._22(e,74).ngClassDirty,r._22(e,74).ngClassValid,r._22(e,74).ngClassInvalid,r._22(e,74).ngClassPending),t(e,77,0,n.showCreateForm?"visible":"hidden"),t(e,80,0,r._32(e,80,0,r._22(e,81).transform("wallet.new.confirm-seed-label"))),t(e,83,0,r._22(e,88).ngClassUntouched,r._22(e,88).ngClassTouched,r._22(e,88).ngClassPristine,r._22(e,88).ngClassDirty,r._22(e,88).ngClassValid,r._22(e,88).ngClassInvalid,r._22(e,88).ngClassPending),t(e,98,0,r._32(e,98,0,r._22(e,99).transform("wallet.new.create-button")))})}var kg=function(){function t(t){this.formBuilder=t,this.onPasswordCreated=new r.o,this.onBack=new r.o}return t.prototype.ngOnInit=function(){this.initEncryptForm()},t.prototype.initEncryptForm=function(){this.form=this.formBuilder.group({password:new Il("",Qs.compose([Qs.required,Qs.minLength(2)])),confirm:new Il("",Qs.compose([Qs.required,Qs.minLength(2)]))},{validator:this.passwordMatchValidator.bind(this)})},t.prototype.setEncrypt=function(t){t.checked?this.form.enable():this.form.disable()},t.prototype.emitCreatedPassword=function(){this.form.enabled&&!this.form.valid||this.button.isLoading()||(this.button.setLoading(),this.onPasswordCreated.emit(this.form.enabled?this.form.get("password").value:null))},t.prototype.emitBack=function(){this.onBack.emit()},Object.defineProperty(t.prototype,"isWorking",{get:function(){return this.button.isLoading()},enumerable:!0,configurable:!0}),t.prototype.passwordMatchValidator=function(t){return t.get("password").value===t.get("confirm").value?null:{mismatch:!0}},t}(),xg=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{color:#fafafa;position:relative;margin-top:20px;margin-bottom:10px;line-height:30px;font-size:20px;text-align:center}.-description[_ngcontent-%COMP%]{line-height:25px;font-size:14px;text-align:center;color:#fafafa;mix-blend-mode:normal;opacity:.5}.-buttons-footer[_ngcontent-%COMP%]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column;margin-bottom:20px}.-check-container[_ngcontent-%COMP%]{margin:10px auto;text-align:center}[_nghost-%COMP%] .-buttons-footer button{margin:2px 10px!important}.-text-align-center[_ngcontent-%COMP%]{text-align:center}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#fafafa!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#fbfbfb}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}.-input.disable[_ngcontent-%COMP%]{background:rgba(255,255,255,.1)}.-hidden[_ngcontent-%COMP%]{display:none}"]],data:{}});function Lg(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,95,"div",[["class","onboarding-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(3,0,null,null,18,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(5,0,null,null,15,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(7,0,null,null,5,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(10,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,5,"div",[["class","-description"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(23,0,null,null,12,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,9,"div",[["class","col-sm-4 -check-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},O_,T_)),r._28(5120,null,$s,function(t){return[t]},[Ca]),r._8(29,4374528,null,0,Ca,[r.l,r.h,Do,[8,null],[2,ka]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(31,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._31(32,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,43,"div",[["class","row justify-content-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(39,0,null,null,40,"div",[["class","col-sm-4"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(41,0,null,null,37,"form",[["novalidate",""]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,43).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,43).onReset()&&i),i},null,null)),r._8(42,16384,null,0,Xl,[],null,null),r._8(43,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(45,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(47,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(50,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(53,0,null,null,7,"input",[["class","-input"],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,56)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,56).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,56)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,56)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(54,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(55,{disable:0}),r._8(56,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(58,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(60,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(63,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,2,"label",[["for","confirm"]],null,null,null,null,null)),(t()(),r._31(66,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(69,0,null,null,7,"input",[["class","-input"],["formControlName","confirm"],["id","confirm"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,72)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,72).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,72)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,72)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.emitCreatedPassword()&&i),i},null,null)),r._8(70,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(71,{disable:0}),r._8(72,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(74,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(76,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(82,0,null,null,13,"div",[["class","row -buttons-footer"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(84,0,null,null,3,"app-button",[["class","dark -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitCreatedPassword()&&r),r},Of,Lf)),r._8(85,49152,[[1,4],["button",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(86,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(89,0,null,null,5,"app-button",[["class","ghost -button-min-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.emitBack()&&r),r},Of,Lf)),r._8(90,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(91,{"-hidden":0}),r._8(92,49152,null,0,xc,[],null,{action:"action"}),(t()(),r._31(93,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,29,0,"encrypt",!0),t(e,43,0,n.form),t(e,54,0,"-input",t(e,55,0,n.form.disabled)),t(e,58,0,"password"),t(e,70,0,"-input",t(e,71,0,n.form.disabled)),t(e,74,0,"confirm"),t(e,85,0,n.form.enabled&&!n.form.valid),t(e,90,0,"ghost -button-min-margin",t(e,91,0,n.isWorking))},function(t,e){t(e,10,0,r._32(e,10,0,r._22(e,11).transform("wallet.new.encrypt-title"))),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("wizard.encrypt-desc"))),t(e,27,0,r._22(e,29).id,r._22(e,29).indeterminate,r._22(e,29).checked,r._22(e,29).disabled,"before"==r._22(e,29).labelPosition),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("wallet.new.encrypt"))),t(e,41,0,r._22(e,45).ngClassUntouched,r._22(e,45).ngClassTouched,r._22(e,45).ngClassPristine,r._22(e,45).ngClassDirty,r._22(e,45).ngClassValid,r._22(e,45).ngClassInvalid,r._22(e,45).ngClassPending),t(e,50,0,r._32(e,50,0,r._22(e,51).transform("password.label"))),t(e,53,0,r._22(e,60).ngClassUntouched,r._22(e,60).ngClassTouched,r._22(e,60).ngClassPristine,r._22(e,60).ngClassDirty,r._22(e,60).ngClassValid,r._22(e,60).ngClassInvalid,r._22(e,60).ngClassPending),t(e,66,0,r._32(e,66,0,r._22(e,67).transform("password.confirm-label"))),t(e,69,0,r._22(e,76).ngClassUntouched,r._22(e,76).ngClassTouched,r._22(e,76).ngClassPristine,r._22(e,76).ngClassDirty,r._22(e,76).ngClassValid,r._22(e,76).ngClassInvalid,r._22(e,76).ngClassPending),t(e,86,0,r._32(e,86,0,r._22(e,87).transform("wizard.finish-button"))),t(e,93,0,r._32(e,93,0,r._22(e,94).transform("wizard.back-button")))})}var Cg=r._7({encapsulation:0,styles:[[""]],data:{}});function Sg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-create-wallet",[],null,[[null,"onLabelAndSeedCreated"]],function(t,e,n){var r=!0;return"onLabelAndSeedCreated"===e&&(r=!1!==t.component.onLabelAndSeedCreated(n)&&r),r},Mg,bg)),r._8(1,114688,null,0,vg,[Ns,rr,Kl],{fill:[0,"fill"]},{onLabelAndSeedCreated:"onLabelAndSeedCreated"})],function(t,e){t(e,1,0,e.component.fill)},null)}function Tg(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-encrypt-wallet",[],null,[[null,"onPasswordCreated"],[null,"onBack"]],function(t,e,n){var r=!0,i=t.component;return"onPasswordCreated"===e&&(r=!1!==i.onPasswordCreated(n)&&r),"onBack"===e&&(r=!1!==i.onBack()&&r),r},Lg,xg)),r._8(1,114688,null,0,kg,[Kl],null,{onPasswordCreated:"onPasswordCreated",onBack:"onBack"})],function(t,e){t(e,1,0)},null)}function Og(t){return r._33(0,[(t()(),r._4(16777216,null,null,1,null,Sg)),r._8(1,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n\n"])),(t()(),r._4(16777216,null,null,1,null,Tg)),r._8(4,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,1===n.step),t(e,4,0,2===n.step)},null)}var Dg=r._5("app-onboarding",Dp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding",[],null,null,null,Og,Cg)),r._8(1,49152,null,0,Dp,[Hh,$r],null,null)],null,null)},{},{},[]),Yg=function(){function t(t,e,n,r){this.walletService=t,this.dialogRef=e,this.formBuilder=n,this.purchaseService=r}return t.prototype.ngOnInit=function(){this.initForm()},t.prototype.generate=function(){var t=this;this.purchaseService.generate(this.form.value.address).subscribe(function(){return t.dialogRef.close()})},t.prototype.initForm=function(){this.form=this.formBuilder.group({address:["",Qs.required]})},t}(),Pg=r._7({encapsulation:0,styles:[["mat-select[_ngcontent-%COMP%]{width:100%;padding:40px 0 20px}"]],data:{}});function Eg(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"mat-option",[["class","mat-option"],["role","option"]],[[1,"tabindex",0],[2,"mat-selected",null],[2,"mat-option-multiple",null],[2,"mat-active",null],[8,"id",0],[1,"aria-selected",0],[1,"aria-disabled",0],[2,"mat-option-disabled",null]],[[null,"click"],[null,"keydown"]],function(t,e,n){var i=!0;return"click"===e&&(i=!1!==r._22(t,1)._selectViaInteraction()&&i),"keydown"===e&&(i=!1!==r._22(t,1)._handleKeydown(n)&&i),i},y_,m_)),r._8(1,49152,[[1,4]],0,ns,[r.l,r.h,[2,es],[2,$o]],{value:[0,"value"]},null),(t()(),r._31(2,0,["\n ","\n "]))],function(t,e){t(e,1,0,e.context.$implicit.address)},function(t,e){t(e,0,0,r._22(e,1)._getTabIndex(),r._22(e,1).selected,r._22(e,1).multiple,r._22(e,1).active,r._22(e,1).id,r._22(e,1).selected.toString(),r._22(e,1).disabled.toString(),r._22(e,1).disabled),t(e,2,0,e.context.$implicit.address)})}function Ag(t){return r._33(0,[(t()(),r._9(0,0,null,null,2,"p",[],null,null,null,null,null)),(t()(),r._31(1,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(4,0,null,null,21,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,5).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,5).onReset()&&i),i},null,null)),r._8(5,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(7,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(9,0,null,null,15,"mat-select",[["class","input-field mat-select"],["formControlName","address"],["role","listbox"]],[[1,"id",0],[1,"tabindex",0],[1,"aria-label",0],[1,"aria-labelledby",0],[1,"aria-required",0],[1,"aria-disabled",0],[1,"aria-invalid",0],[1,"aria-owns",0],[1,"aria-multiselectable",0],[1,"aria-describedby",0],[1,"aria-activedescendant",0],[2,"mat-select-disabled",null],[2,"mat-select-invalid",null],[2,"mat-select-required",null],[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown"],[null,"focus"],[null,"blur"]],function(t,e,n){var i=!0;return"keydown"===e&&(i=!1!==r._22(t,14)._handleKeydown(n)&&i),"focus"===e&&(i=!1!==r._22(t,14)._onFocus()&&i),"blur"===e&&(i=!1!==r._22(t,14)._onBlur()&&i),i},S_,w_)),r._28(6144,null,es,null,[Hu]),r._28(6144,null,ia,null,[Hu]),r._8(12,671744,null,0,ql,[[3,Us],[8,null],[8,null],[8,null]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(14,2080768,null,3,Hu,[_i,r.h,r.B,Fo,r.l,[2,vi],[2,Nl],[2,Wl],[2,la],[2,ll],[8,null],ju],{placeholder:[0,"placeholder"]},null),r._29(603979776,1,{options:1}),r._29(603979776,2,{optionGroups:1}),r._29(335544320,3,{customTrigger:0}),r._25(131072,yp.i,[yp.j,r.h]),r._8(19,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,1,["\n "])),(t()(),r._4(16777216,null,1,2,null,Eg)),r._8(22,802816,null,0,H,[r.R,r.O,r.u],{ngForOf:[0,"ngForOf"]},null),r._25(131072,Ct,[r.h]),(t()(),r._31(-1,1,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(27,0,null,null,7,"div",[["class","button-line"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,4,"a",[["class","mat-raised-button"],["mat-raised-button",""]],[[1,"tabindex",0],[1,"disabled",0],[1,"aria-disabled",0]],[[null,"click"]],function(t,e,n){var i=!0,o=t.component;return"click"===e&&(i=!1!==r._22(t,30)._haltDisabledEvents(n)&&i),"click"===e&&(i=!1!==o.generate()&&i),i},yf,gf)),r._8(30,180224,null,0,pa,[ei,Do,r.l],null,null),r._8(31,16384,null,0,ca,[],null,null),(t()(),r._31(32,0,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,5,0,n.form),t(e,12,0,"address"),t(e,14,0,r._32(e,14,0,r._22(e,18).transform("buy.select-address"))),t(e,22,0,r._32(e,22,0,r._22(e,23).transform(n.walletService.allAddresses())))},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("buy.deposit-address"))),t(e,4,0,r._22(e,7).ngClassUntouched,r._22(e,7).ngClassTouched,r._22(e,7).ngClassPristine,r._22(e,7).ngClassDirty,r._22(e,7).ngClassValid,r._22(e,7).ngClassInvalid,r._22(e,7).ngClassPending),t(e,9,1,[r._22(e,14).id,r._22(e,14).tabIndex,r._22(e,14)._ariaLabel,r._22(e,14).ariaLabelledby,r._22(e,14).required.toString(),r._22(e,14).disabled.toString(),r._22(e,14).errorState,r._22(e,14).panelOpen?r._22(e,14)._optionIds:null,r._22(e,14).multiple,r._22(e,14)._ariaDescribedby||null,r._22(e,14)._getAriaActiveDescendant(),r._22(e,14).disabled,r._22(e,14).errorState,r._22(e,14).required,r._22(e,19).ngClassUntouched,r._22(e,19).ngClassTouched,r._22(e,19).ngClassPristine,r._22(e,19).ngClassDirty,r._22(e,19).ngClassValid,r._22(e,19).ngClassInvalid,r._22(e,19).ngClassPending]),t(e,29,0,r._22(e,30).disabled?-1:0,r._22(e,30).disabled||null,r._22(e,30).disabled.toString()),t(e,32,0,r._32(e,32,0,r._22(e,33).transform("buy.generate")))})}var jg=r._5("app-add-deposit-address",Yg,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-add-deposit-address",[],null,null,null,Ag,Pg)),r._8(1,114688,null,0,Yg,[$r,Is,Kl,xp],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Ig=function(){function t(){}return t.prototype.closePopup=function(){this.disableDismiss||this.dialog.close()},t.prototype.ngOnChanges=function(t){t.disableDismiss&&(this.dialog.disableClose=t.disableDismiss.currentValue)},t}(),Rg=r._7({encapsulation:0,styles:[[".-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}.-body[_ngcontent-%COMP%]{background-color:#fbfbfb;padding:30px}"]],data:{}});function Hg(t){return r._33(0,[(t()(),r._9(0,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null))],null,null)}function Fg(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(1,null,["\n ","\n "])),(t()(),r._4(16777216,null,null,1,null,Hg)),r._8(3,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(6,0,null,null,3,"div",[["class","-body"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),r._21(null,0),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,3,0,!e.component.disableDismiss)},function(t,e){t(e,1,0,e.component.headline)})}var Ng=function(){function t(t){this.el=t,t.nativeElement.autocomplete="new-password",t.nativeElement.readOnly=!0}return t.prototype.onFocus=function(){this.el.nativeElement.readOnly=!1},t}(),Vg=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}label[for=seed][_ngcontent-%COMP%]{display:-webkit-box;display:-ms-flexbox;display:flex}label[for=seed][_ngcontent-%COMP%] > span[_ngcontent-%COMP%]:last-child{-webkit-box-flex:1;-ms-flex:1;flex:1}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%]{text-align:right}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{cursor:pointer;color:rgba(0,114,255,.7)}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{width:13px;height:10px;font-size:13px;position:relative;top:2px}label[for=seed][_ngcontent-%COMP%] .generators[_ngcontent-%COMP%] .divider[_ngcontent-%COMP%]{padding:0 5px;color:#1e2227}.-disabled[_ngcontent-%COMP%]{display:none}.-warning[_ngcontent-%COMP%]{color:#ff004e;font-size:12px;padding:0 10px;line-height:1.5}.-passwords[_ngcontent-%COMP%]{margin-left:24px}.-passwords[_ngcontent-%COMP%] .-info[_ngcontent-%COMP%]{margin:5px 0 15px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}.-passwords[_ngcontent-%COMP%] .-hidden[_ngcontent-%COMP%]{visibility:hidden}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-check[_ngcontent-%COMP%] span{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] span img{width:38px;height:38px;vertical-align:middle}"]],data:{}});function Bg(t){return r._33(0,[(t()(),r._9(0,0,null,null,16,"span",[["class","generators"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,3).show()&&i),"keydown"===e&&(i=!1!==r._22(t,3)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,3).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(128)&&i),i},null,null)),r._8(3,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(5,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,1,"span",[["class","divider"]],null,null,null,null,null)),(t()(),r._31(-1,null,["|"])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,16777216,null,null,4,"span",[],null,[[null,"click"],[null,"longpress"],[null,"keydown"],[null,"touchend"]],function(t,e,n){var i=!0,o=t.component;return"longpress"===e&&(i=!1!==r._22(t,12).show()&&i),"keydown"===e&&(i=!1!==r._22(t,12)._handleKeydown(n)&&i),"touchend"===e&&(i=!1!==r._22(t,12).hide(1500)&&i),"click"===e&&(i=!1!==o.generateSeed(256)&&i),i},null,null)),r._8(12,147456,null,0,Wu,[eo,r.l,pi,r.R,r.B,ei,xo,Do,Bu,[2,vi]],{message:[0,"message"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(14,null,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("wallet.new.generate-12-seed"))),t(e,12,0,r._32(e,12,0,r._22(e,13).transform("wallet.new.generate-24-seed")))},function(t,e){t(e,5,0,r._32(e,5,0,r._22(e,6).transform("wallet.new.12-words"))),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.24-words")))})}function zg(t){return r._33(0,[r._29(402653184,1,{createButton:0}),r._29(402653184,2,{cancelButton:0}),(t()(),r._9(2,0,null,null,137,"app-modal",[],null,null,null,Fg,Rg)),r._8(3,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(6,0,null,0,119,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,7).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,7).onReset()&&i),i},null,null)),r._8(7,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(9,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(13,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(14,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(17,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,18)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,18).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,18)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,18)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(18,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(20,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(22,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(25,0,null,null,22,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,8,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(29,0,null,null,2,"span",[],null,null,null,null,null)),(t()(),r._31(30,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,Bg)),r._8(34,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(37,0,null,null,5,"textarea",[["formControlName","seed"],["id","seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,38)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,38).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,38)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,38)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(38,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(40,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(42,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(44,0,null,null,2,"p",[["class","-warning"]],null,null,null,null,null)),(t()(),r._31(45,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(49,0,null,null,14,"div",[["class","form-field"]],null,null,null,null,null)),r._8(50,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(51,{"-disabled":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(53,0,null,null,2,"label",[["for","confirm_seed"]],null,null,null,null,null)),(t()(),r._31(54,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(57,0,null,null,5,"textarea",[["formControlName","confirm_seed"],["id","confirm_seed"],["row","2"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,58)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,58).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,58)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,58)._compositionEnd(n.target.value)&&i),i},null,null)),r._8(58,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(60,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(62,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(65,0,null,null,9,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(67,0,null,null,6,"mat-checkbox",[["class","-check mat-checkbox"],["id","encrypt"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setEncrypt(n)&&r),r},O_,T_)),r._28(5120,null,$s,function(t){return[t]},[Ca]),r._8(69,4374528,null,0,Ca,[r.l,r.h,Do,[8,null],[2,ka]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(71,0,null,0,0,"img",[["src","../../../../../assets/img/lock-gold.png"]],null,null,null,null,null)),(t()(),r._31(72,0,[" ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(76,0,null,null,48,"div",[["class","row -passwords"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(78,0,null,null,5,"div",[["class","col-md-12"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(80,0,null,null,2,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(81,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(85,0,null,null,18,"div",[["class","col-md-6"]],null,null,null,null,null)),r._8(86,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(87,{"-hidden":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(89,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(91,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(92,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(95,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0;return"input"===e&&(i=!1!==r._22(t,96)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,96).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,96)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,96)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,101).onFocus()&&i),i},null,null)),r._8(96,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(98,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(100,16384,null,0,Dl,[ll],null,null),r._8(101,16384,null,0,Ng,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(105,0,null,null,18,"div",[["class","col-md-6"]],null,null,null,null,null)),r._8(106,278528,null,0,I,[r.u,r.v,r.l,r.G],{klass:[0,"klass"],ngClass:[1,"ngClass"]},null),r._26(107,{"-hidden":0}),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(109,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(111,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._31(112,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(115,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,116)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,116).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,116)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,116)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,121).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.createWallet()&&i),i},null,null)),r._8(116,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(118,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(120,16384,null,0,Dl,[ll],null,null),r._8(121,16384,null,0,Ng,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(127,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(129,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Of,Lf)),r._8(130,49152,[[2,4],["cancelButton",4]],0,xc,[],null,{action:"action"}),(t()(),r._31(131,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(134,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.createWallet()&&r),r},Of,Lf)),r._8(135,49152,[[1,4],["createButton",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(136,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,3,0,n.dialogRef,r._32(e,3,1,r._22(e,4).transform("wallet.new."+(n.data.create?"create":"load")+"-title")),n.disableDismiss),t(e,7,0,n.form),t(e,20,0,"label"),t(e,34,0,n.data.create),t(e,40,0,"seed"),t(e,50,0,"form-field",t(e,51,0,!n.data.create)),t(e,60,0,"confirm_seed"),t(e,69,0,"encrypt",!0),t(e,86,0,"col-md-6",t(e,87,0,!n.encrypt)),t(e,98,0,"password"),t(e,106,0,"col-md-6",t(e,107,0,!n.encrypt)),t(e,118,0,"confirm_password"),t(e,135,0,!n.form.valid)},function(t,e){var n=e.component;t(e,6,0,r._22(e,9).ngClassUntouched,r._22(e,9).ngClassTouched,r._22(e,9).ngClassPristine,r._22(e,9).ngClassDirty,r._22(e,9).ngClassValid,r._22(e,9).ngClassInvalid,r._22(e,9).ngClassPending),t(e,14,0,r._32(e,14,0,r._22(e,15).transform("wallet.new.name-label"))),t(e,17,0,r._22(e,22).ngClassUntouched,r._22(e,22).ngClassTouched,r._22(e,22).ngClassPristine,r._22(e,22).ngClassDirty,r._22(e,22).ngClassValid,r._22(e,22).ngClassInvalid,r._22(e,22).ngClassPending),t(e,30,0,r._32(e,30,0,r._22(e,31).transform("wallet.new.seed-label"))),t(e,37,0,r._22(e,42).ngClassUntouched,r._22(e,42).ngClassTouched,r._22(e,42).ngClassPristine,r._22(e,42).ngClassDirty,r._22(e,42).ngClassValid,r._22(e,42).ngClassInvalid,r._22(e,42).ngClassPending),t(e,45,0,r._32(e,45,0,r._22(e,46).transform("wallet.new.seed-warning"))),t(e,54,0,r._32(e,54,0,r._22(e,55).transform("wallet.new.confirm-seed-label"))),t(e,57,0,r._22(e,62).ngClassUntouched,r._22(e,62).ngClassTouched,r._22(e,62).ngClassPristine,r._22(e,62).ngClassDirty,r._22(e,62).ngClassValid,r._22(e,62).ngClassInvalid,r._22(e,62).ngClassPending),t(e,67,0,r._22(e,69).id,r._22(e,69).indeterminate,r._22(e,69).checked,r._22(e,69).disabled,"before"==r._22(e,69).labelPosition),t(e,72,0,r._32(e,72,0,r._22(e,73).transform("wallet.new.encrypt"))),t(e,81,0,r._32(e,81,0,r._22(e,82).transform("wallet.new.encrypt-warning"))),t(e,92,0,r._32(e,92,0,r._22(e,93).transform("password.label"))),t(e,95,0,r._22(e,100).ngClassUntouched,r._22(e,100).ngClassTouched,r._22(e,100).ngClassPristine,r._22(e,100).ngClassDirty,r._22(e,100).ngClassValid,r._22(e,100).ngClassInvalid,r._22(e,100).ngClassPending),t(e,112,0,r._32(e,112,0,r._22(e,113).transform("password.confirm-label"))),t(e,115,0,r._22(e,120).ngClassUntouched,r._22(e,120).ngClassTouched,r._22(e,120).ngClassPristine,r._22(e,120).ngClassDirty,r._22(e,120).ngClassValid,r._22(e,120).ngClassInvalid,r._22(e,120).ngClassPending),t(e,131,0,r._32(e,131,0,r._22(e,132).transform("wallet.new.cancel-button"))),t(e,136,0,r._32(e,136,0,r._22(e,137).transform("wallet.new."+(n.data.create?"create":"load")+"-button")))})}var Wg=r._5("app-create-wallet",Lc,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-create-wallet",[],null,null,null,zg,Vg)),r._8(1,114688,null,0,Lc,[Rs,Is,$r,rr],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Ug=r._7({encapsulation:0,styles:[["mat-input-container[_ngcontent-%COMP%]{width:100%}.-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function Gg(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,36,"app-modal",[],null,null,null,Fg,Rg)),r._8(2,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(5,0,null,0,18,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,6).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,6).onReset()&&i),i},null,null)),r._8(6,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(8,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,12,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,2,"label",[["for","label"]],null,null,null,null,null)),(t()(),r._31(13,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,5,"input",[["formControlName","label"],["id","label"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,17)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,17).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,17)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,17)._compositionEnd(n.target.value)&&i),"keydown.enter"===e&&(i=!1!==o.rename()&&i),i},null,null)),r._8(17,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(19,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(21,16384,null,0,Dl,[ll],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(25,0,null,0,11,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(27,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Of,Lf)),r._8(28,49152,null,0,xc,[],null,{action:"action"}),(t()(),r._31(29,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(32,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.rename()&&r),r},Of,Lf)),r._8(33,49152,[[1,4],["button",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(34,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,r._32(e,2,1,r._22(e,3).transform("wallet.rename.title"))),t(e,6,0,n.form),t(e,19,0,"label"),t(e,33,0,!n.form.valid)},function(t,e){t(e,5,0,r._22(e,8).ngClassUntouched,r._22(e,8).ngClassTouched,r._22(e,8).ngClassPristine,r._22(e,8).ngClassDirty,r._22(e,8).ngClassValid,r._22(e,8).ngClassInvalid,r._22(e,8).ngClassPending),t(e,13,0,r._32(e,13,0,r._22(e,14).transform("wallet.rename.name-label"))),t(e,16,0,r._22(e,21).ngClassUntouched,r._22(e,21).ngClassTouched,r._22(e,21).ngClassPristine,r._22(e,21).ngClassDirty,r._22(e,21).ngClassValid,r._22(e,21).ngClassInvalid,r._22(e,21).ngClassPending),t(e,29,0,r._32(e,29,0,r._22(e,30).transform("wallet.rename.cancel-button"))),t(e,34,0,r._32(e,34,0,r._22(e,35).transform("wallet.rename.rename-button")))})}var Jg=r._5("app-change-name",of,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-change-name",[],null,null,null,Gg,Ug)),r._8(1,114688,null,0,of,[Is,Rs,Kl,$r],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),qg=r._7({encapsulation:0,styles:[["#qr[_ngcontent-%COMP%]{height:300px}.address[_ngcontent-%COMP%]{font-size:80%;text-align:center;margin-top:30px}"]],data:{}});function Qg(t){return r._33(0,[r._29(402653184,1,{qr:0}),(t()(),r._9(1,0,null,null,8,"app-modal",[],null,null,null,Fg,Rg)),r._8(2,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(5,0,[[1,0],["qr",1]],0,0,"div",[["id","qr"]],null,null,null,null,null)),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(7,0,null,0,1,"div",[["class","address"]],null,null,null,null,null)),(t()(),r._31(8,null,["",""])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,2,0,e.component.dialogRef,r._32(e,2,1,r._22(e,3).transform("title.qrcode")))},function(t,e){t(e,8,0,e.component.data.address)})}var Kg=r._5("app-qr-code",pp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-qr-code",[],null,null,null,Qg,qg)),r._8(1,114688,null,0,pp,[Rs,Is],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),Xg=r._7({encapsulation:0,styles:[[".-container[_ngcontent-%COMP%]{padding:24px;background-color:#fbfbfb}.-header[_ngcontent-%COMP%]{background-color:#f7f7f7;border-top-left-radius:5px;border-top-right-radius:5px;line-height:50px;position:relative;text-align:center}.-header[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{cursor:pointer;height:32px;position:absolute;right:9px;top:9px}"]],data:{}});function Zg(t){return r._33(0,[(t()(),r._9(0,0,null,null,4,"div",[["class","-header"]],null,null,null,null,null)),(t()(),r._31(1,null,["\n "," "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._9(3,0,null,null,0,"img",[["src","../../../../../assets/img/close-grey.png"]],null,[[null,"click"]],function(t,e,n){var r=!0;return"click"===e&&(r=!1!==t.component.closePopup()&&r),r},null,null)),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"])),(t()(),r._9(6,0,null,null,8,"div",[["class","-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(8,0,null,null,5,"mat-dialog-content",[["class","mat-dialog-content"]],null,null,null,null,null)),r._8(9,16384,null,0,Vs,[],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(11,0,null,null,1,"app-transaction-info",[],null,null,null,rm,z_)),r._8(12,245760,null,0,B_,[Cp],{transaction:[0,"transaction"],isPreview:[1,"isPreview"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,12,0,e.component.transaction,!1)},function(t,e){t(e,1,0,r._32(e,1,0,r._22(e,2).transform("history.tx-detail")))})}var $g=r._5("app-transaction-detail",Sp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-transaction-detail",[],null,null,null,Zg,Xg)),r._8(1,49152,null,0,Sp,[Rs,Is],null,null)],null,null)},{},{},[]),ty=r._7({encapsulation:0,styles:[[".-safe-description[_ngcontent-%COMP%]{font-family:Skycoin;line-height:20px;font-size:12px;color:#1e2227;mix-blend-mode:normal;opacity:.8}.-check-container[_ngcontent-%COMP%]{text-align:center;margin-top:50px}.-safe-check-text[_ngcontent-%COMP%]{font-family:Skycoin;line-height:normal;font-size:14px;color:#1e2227}.-check[_ngcontent-%COMP%] .mat-checkbox-checkmark-path{position:absolute;width:18px;height:8px;left:4.59px;top:9px;stroke:#0072ff!important}.-check[_ngcontent-%COMP%] .mat-checkbox-background, .-check[_ngcontent-%COMP%] .mat-checkbox-frame{top:0;left:0;right:0;bottom:0;position:absolute;-webkit-box-sizing:border-box;box-sizing:border-box;pointer-events:none;width:20px;height:20px;background:rgba(30,34,39,.05);border-radius:6px;border-color:transparent}.-text-center[_ngcontent-%COMP%]{text-align:center}.-no-bottom-margin[_ngcontent-%COMP%] button{margin:28px 10px 0!important}.-title[_ngcontent-%COMP%]{font-family:Skycoin;line-height:30px;font-size:14px;text-align:center;letter-spacing:.0769231em;color:#ff004e}"]],data:{}});function ey(t){return r._33(0,[(t()(),r._9(0,0,null,null,27,"app-modal",[["class","-title"]],null,null,null,Fg,Rg)),r._8(1,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(4,0,null,0,14,"div",[],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"span",[["class","-safe-description"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,7,"div",[["class","-check-container"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(12,0,null,null,4,"mat-checkbox",[["class","-safe-check-text -check mat-checkbox"],["id","terms"],["type","checkbox"]],[[8,"id",0],[2,"mat-checkbox-indeterminate",null],[2,"mat-checkbox-checked",null],[2,"mat-checkbox-disabled",null],[2,"mat-checkbox-label-before",null]],[[null,"change"]],function(t,e,n){var r=!0;return"change"===e&&(r=!1!==t.component.setAccept(n)&&r),r},O_,T_)),r._28(5120,null,$s,function(t){return[t]},[Ca]),r._8(14,4374528,null,0,Ca,[r.l,r.h,Do,[8,null],[2,ka]],{id:[0,"id"],checked:[1,"checked"]},{change:"change"}),(t()(),r._31(15,0,["","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(20,0,null,0,6,"div",[["class","-text-center"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(22,0,null,null,3,"app-button",[["class","primary -no-bottom-margin"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.closePopup()&&r),r},Of,Lf)),r._8(23,49152,null,0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(24,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,1,0,n.dialogRef,r._32(e,1,1,r._22(e,2).transform("wizard.confirm.title"))),t(e,14,0,"terms",n.acceptSafe),t(e,23,0,!n.acceptSafe)},function(t,e){t(e,7,0,r._32(e,7,0,r._22(e,8).transform("wizard.confirm.desc"))),t(e,12,0,r._22(e,14).id,r._22(e,14).indeterminate,r._22(e,14).checked,r._22(e,14).disabled,"before"==r._22(e,14).labelPosition),t(e,15,0,r._32(e,15,0,r._22(e,16).transform("wizard.confirm.checkbox"))),t(e,24,0,r._32(e,24,0,r._22(e,25).transform("wizard.confirm.button")))})}var ny=r._5("app-onboarding-safeguard",yg,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-onboarding-safeguard",[],null,null,null,ey,ty)),r._8(1,49152,null,0,yg,[Is],null,null)],null,null)},{},{},[]),ry=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}.-info[_ngcontent-%COMP%]{margin:5px 0 25px;color:rgba(30,34,39,.5);font-size:12px;line-height:1.5}"]],data:{}});function iy(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"p",[["class","-info"]],null,null,null,null,null)),(t()(),r._31(1,null,["",""]))],null,function(t,e){t(e,1,0,e.component.data.description)})}function oy(t){return r._33(0,[(t()(),r._9(0,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(2,0,null,null,2,"label",[["for","confirm_password"]],null,null,null,null,null)),(t()(),r._31(3,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","confirm_password"],["id","confirm_password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,7)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,7).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,7)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,7)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,12).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._8(7,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(9,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(11,16384,null,0,Dl,[ll],null,null),r._8(12,16384,null,0,Ng,[r.l],null,null),(t()(),r._31(-1,null,["\n "]))],function(t,e){t(e,9,0,"confirm_password")},function(t,e){t(e,3,0,r._32(e,3,0,r._22(e,4).transform("password.confirm-label"))),t(e,6,0,r._22(e,11).ngClassUntouched,r._22(e,11).ngClassTouched,r._22(e,11).ngClassPristine,r._22(e,11).ngClassDirty,r._22(e,11).ngClassValid,r._22(e,11).ngClassInvalid,r._22(e,11).ngClassPending)})}function sy(t){return r._33(0,[r._29(402653184,1,{button:0}),(t()(),r._9(1,0,null,null,39,"app-modal",[],null,null,null,Fg,Rg)),r._8(2,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"],disableDismiss:[2,"disableDismiss"]},null),r._25(131072,yp.i,[yp.j,r.h]),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._4(16777216,null,0,1,null,iy)),r._8(7,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(9,0,null,0,22,"div",[],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"submit"],[null,"reset"]],function(t,e,n){var i=!0;return"submit"===e&&(i=!1!==r._22(t,10).onSubmit(n)&&i),"reset"===e&&(i=!1!==r._22(t,10).onReset()&&i),i},null,null)),r._8(10,540672,null,0,Wl,[[8,null],[8,null]],{form:[0,"form"]},null),r._28(2048,null,Us,null,[Wl]),r._8(12,16384,null,0,Yl,[Us],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(14,0,null,null,13,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,2,"label",[["for","password"]],null,null,null,null,null)),(t()(),r._31(17,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(20,0,null,null,6,"input",[["appDontSavePassword",""],["formControlName","password"],["id","password"],["type","password"]],[[2,"ng-untouched",null],[2,"ng-touched",null],[2,"ng-pristine",null],[2,"ng-dirty",null],[2,"ng-valid",null],[2,"ng-invalid",null],[2,"ng-pending",null]],[[null,"keydown.enter"],[null,"input"],[null,"blur"],[null,"compositionstart"],[null,"compositionend"],[null,"focus"]],function(t,e,n){var i=!0,o=t.component;return"input"===e&&(i=!1!==r._22(t,21)._handleInput(n.target.value)&&i),"blur"===e&&(i=!1!==r._22(t,21).onTouched()&&i),"compositionstart"===e&&(i=!1!==r._22(t,21)._compositionStart()&&i),"compositionend"===e&&(i=!1!==r._22(t,21)._compositionEnd(n.target.value)&&i),"focus"===e&&(i=!1!==r._22(t,26).onFocus()&&i),"keydown.enter"===e&&(i=!1!==o.proceed()&&i),i},null,null)),r._8(21,16384,null,0,nl,[r.G,r.l,[2,el]],null,null),r._28(1024,null,$s,function(t){return[t]},[nl]),r._8(23,671744,null,0,ql,[[3,Us],[8,null],[8,null],[2,$s]],{name:[0,"name"]},null),r._28(2048,null,ll,null,[ql]),r._8(25,16384,null,0,Dl,[ll],null,null),r._8(26,16384,null,0,Ng,[r.l],null,null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,null,["\n "])),(t()(),r._4(16777216,null,null,1,null,oy)),r._8(30,16384,null,0,N,[r.R,r.O],{ngIf:[0,"ngIf"]},null),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(33,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(35,0,null,null,3,"app-button",[["class","primary"]],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.proceed()&&r),r},Of,Lf)),r._8(36,49152,[[1,4],["button",4]],0,xc,[],{disabled:[0,"disabled"]},{action:"action"}),(t()(),r._31(37,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){var n=e.component;t(e,2,0,n.dialogRef,r._32(e,2,1,n.data.title?r._22(e,3).transform(n.data.title):r._22(e,4).transform("password.title")),n.disableDismiss),t(e,7,0,n.data.description),t(e,10,0,n.form),t(e,23,0,"password"),t(e,30,0,n.data.confirm),t(e,36,0,!n.form.valid)},function(t,e){t(e,9,0,r._22(e,12).ngClassUntouched,r._22(e,12).ngClassTouched,r._22(e,12).ngClassPristine,r._22(e,12).ngClassDirty,r._22(e,12).ngClassValid,r._22(e,12).ngClassInvalid,r._22(e,12).ngClassPending),t(e,17,0,r._32(e,17,0,r._22(e,18).transform("password.label"))),t(e,20,0,r._22(e,25).ngClassUntouched,r._22(e,25).ngClassTouched,r._22(e,25).ngClassPristine,r._22(e,25).ngClassDirty,r._22(e,25).ngClassValid,r._22(e,25).ngClassInvalid,r._22(e,25).ngClassPending),t(e,37,0,r._32(e,37,0,r._22(e,38).transform("password.button")))})}var ly=r._5("app-password-dialog",vp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-password-dialog",[],null,null,null,sy,ry)),r._8(1,245760,null,0,vp,[Rs,Is,_c,yp.j],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]),ay=r._7({encapsulation:0,styles:[[".-buttons[_ngcontent-%COMP%]{text-align:center}"]],data:{}});function uy(t){return r._33(0,[(t()(),r._9(0,0,null,null,21,"app-modal",[],null,null,null,Fg,Rg)),r._8(1,573440,null,0,Ig,[],{dialog:[0,"dialog"],headline:[1,"headline"]},null),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(4,0,null,0,8,"div",[["class","form-field"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(6,0,null,null,2,"label",[["for","seed"]],null,null,null,null,null)),(t()(),r._31(7,null,["",""])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(10,0,null,null,1,"textarea",[["id","seed"],["readonly",""]],null,null,null,null,null)),(t()(),r._31(11,null,["",""])),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n "])),(t()(),r._9(14,0,null,0,6,"div",[["class","-buttons"]],null,null,null,null,null)),(t()(),r._31(-1,null,["\n "])),(t()(),r._9(16,0,null,null,3,"app-button",[],null,[[null,"action"]],function(t,e,n){var r=!0;return"action"===e&&(r=!1!==t.component.dialogRef.close()&&r),r},Of,Lf)),r._8(17,49152,null,0,xc,[],null,{action:"action"}),(t()(),r._31(18,0,["\n ","\n "])),r._25(131072,yp.i,[yp.j,r.h]),(t()(),r._31(-1,null,["\n "])),(t()(),r._31(-1,0,["\n"])),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,1,0,e.component.dialogRef,r._32(e,1,1,r._22(e,2).transform("title.seed")))},function(t,e){var n=e.component;t(e,7,0,r._32(e,7,0,r._22(e,8).transform("backup.seed"))),t(e,11,0,n.data.seed),t(e,18,0,r._32(e,18,0,r._22(e,19).transform("backup.close-button")))})}var cy=r._5("app-seed-modal",gp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-seed-modal",[],null,null,null,uy,ay)),r._8(1,180224,null,0,gp,[Rs,Is],null,null)],null,null)},{},{},[]),dy=r._7({encapsulation:0,styles:[["mat-card[_ngcontent-%COMP%]{max-width:1000px;margin-top:80px;margin-right:auto;margin-left:auto}.logo[_ngcontent-%COMP%]{max-height:100%}.fill-remaining-space[_ngcontent-%COMP%]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.sky-container[_ngcontent-%COMP%]{max-width:1000px;margin-top:20px;margin-right:auto;margin-left:auto}mat-toolbar[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{margin:0 20px}.search-field[_ngcontent-%COMP%]{border-radius:8px;border:none;background-color:#fff;padding:8px}.syncing[_ngcontent-%COMP%]{font-size:14px}.main-menu[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-right:20px}#top-menu[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{color:#fbfbfb}#top-menu[_ngcontent-%COMP%] span#version[_ngcontent-%COMP%]{padding-top:12px}"]],data:{}});function hy(t){return r._33(0,[(t()(),r._9(0,16777216,null,null,1,"router-outlet",[],null,null,null,null,null)),r._8(1,212992,null,0,Jh,[Gh,r.R,r.j,[8,null],r.h],null,null),(t()(),r._31(-1,null,["\n"]))],function(t,e){t(e,1,0)},null)}var py=r._5("app-root",jp,function(t){return r._33(0,[(t()(),r._9(0,0,null,null,1,"app-root",[],null,null,null,hy,dy)),r._8(1,114688,null,0,jp,[Ap,yp.j],null,null)],function(t,e){t(e,1,0)},null)},{},{},[]);function fy(t){switch(t.length){case 0:return new Os;case 1:return t[0];default:return new Ds(t)}}function _y(t,e,n,r,i,o){void 0===i&&(i={}),void 0===o&&(o={});var s=[],l=[],a=-1,u=null;if(r.forEach(function(t){var n=t.offset,r=n==a,c=r&&u||{};Object.keys(t).forEach(function(n){var r=n,l=t[n];if("offset"!==n)switch(r=e.normalizePropertyName(r,s),l){case Ys:l=i[n];break;case Ls:l=o[n];break;default:l=e.normalizeStyleValue(n,r,l,s)}c[r]=l}),r||l.push(c),u=c,a=n}),s.length)throw new Error("Unable to animate due to the following errors:\n - "+s.join("\n - "));return l}function my(t,e,n,r){switch(e){case"start":t.onStart(function(){return r(n&&gy(n,"start",t.totalTime))});break;case"done":t.onDone(function(){return r(n&&gy(n,"done",t.totalTime))});break;case"destroy":t.onDestroy(function(){return r(n&&gy(n,"destroy",t.totalTime))})}}function gy(t,e,n){var r=yy(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,void 0==n?t.totalTime:n),i=t._data;return null!=i&&(r._data=i),r}function yy(t,e,n,r,i,o){return void 0===i&&(i=""),void 0===o&&(o=0),{element:t,triggerName:e,fromState:n,toState:r,phaseName:i,totalTime:o}}function vy(t,e,n){var r;return t instanceof Map?(r=t.get(e))||t.set(e,r=n):(r=t[e])||(r=t[e]=n),r}function by(t){var e=t.indexOf(":");return[t.substring(1,e),t.substr(e+1)]}var wy=function(t,e){return!1},My=function(t,e){return!1},ky=function(t,e,n){return[]};if("undefined"!=typeof Element){if(wy=function(t,e){return t.contains(e)},Element.prototype.matches)My=function(t,e){return t.matches(e)};else{var xy=Element.prototype,Ly=xy.matchesSelector||xy.mozMatchesSelector||xy.msMatchesSelector||xy.oMatchesSelector||xy.webkitMatchesSelector;Ly&&(My=function(t,e){return Ly.apply(t,[e])})}ky=function(t,e,n){var r=[];if(n)r.push.apply(r,t.querySelectorAll(e));else{var i=t.querySelector(e);i&&r.push(i)}return r}}var Cy=null,Sy=!1;function Ty(){return"undefined"!=typeof document?document.body:null}var Oy=My,Dy=wy,Yy=ky,Py=function(){function t(){}return t.prototype.validateStyleProperty=function(t){return function(t){Cy||(Cy=Ty()||{},Sy=!!Cy.style&&"WebkitAppearance"in Cy.style);var e=!0;return Cy.style&&!function(t){return"ebkit"==t.substring(1,6)}(t)&&!(e=t in Cy.style)&&Sy&&(e="Webkit"+t.charAt(0).toUpperCase()+t.substr(1)in Cy.style),e}(t)},t.prototype.matchesElement=function(t,e){return Oy(t,e)},t.prototype.containsElement=function(t,e){return Dy(t,e)},t.prototype.query=function(t,e,n){return Yy(t,e,n)},t.prototype.computeStyle=function(t,e,n){return n||""},t.prototype.animate=function(t,e,n,r,i,o){return void 0===o&&(o=[]),new Os},t}(),Ey=function(){function t(){}return t.NOOP=new Py,t}(),Ay=1e3;function jy(t){if("number"==typeof t)return t;var e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:Iy(parseFloat(e[1]),e[2])}function Iy(t,e){switch(e){case"s":return t*Ay;default:return t}}function Ry(t,e,n){return t.hasOwnProperty("duration")?t:function(t,e,n){var r,i=0,o="";if("string"==typeof t){var s=t.match(/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i);if(null===s)return e.push('The provided timing value "'+t+'" is invalid.'),{duration:0,delay:0,easing:""};r=Iy(parseFloat(s[1]),s[2]);var l=s[3];null!=l&&(i=Iy(Math.floor(parseFloat(l)),s[4]));var a=s[5];a&&(o=a)}else r=t;if(!n){var u=!1,c=e.length;r<0&&(e.push("Duration values below 0 are not allowed for this animation step."),u=!0),i<0&&(e.push("Delay values below 0 are not allowed for this animation step."),u=!0),u&&e.splice(c,0,'The provided timing value "'+t+'" is invalid.')}return{duration:r,delay:i,easing:o}}(t,e,n)}function Hy(t,e){return void 0===e&&(e={}),Object.keys(t).forEach(function(n){e[n]=t[n]}),e}function Fy(t,e,n){if(void 0===n&&(n={}),e)for(var r in t)n[r]=t[r];else Hy(t,n);return n}function Ny(t,e){t.style&&Object.keys(e).forEach(function(n){var r=qy(n);t.style[r]=e[n]})}function Vy(t,e){t.style&&Object.keys(e).forEach(function(e){var n=qy(e);t.style[n]=""})}function By(t){return Array.isArray(t)?1==t.length?t[0]:Cs(t):t}var zy=new RegExp("{{\\s*(.+?)\\s*}}","g");function Wy(t){var e=[];if("string"==typeof t){for(var n=t.toString(),r=void 0;r=zy.exec(n);)e.push(r[1]);zy.lastIndex=0}return e}function Uy(t,e,n){var r=t.toString(),i=r.replace(zy,function(t,r){var i=e[r];return e.hasOwnProperty(r)||(n.push("Please provide a value for the animation param "+r),i=""),i.toString()});return i==r?t:i}function Gy(t){for(var e=[],n=t.next();!n.done;)e.push(n.value),n=t.next();return e}var Jy=/-+([a-z0-9])/g;function qy(t){return t.replace(Jy,function(){for(var t=[],e=0;e *";case":leave":return"* => void";case":increment":return function(t,e){return parseFloat(e)>parseFloat(t)};case":decrement":return function(t,e){return parseFloat(e) *"}}(t,n);if("function"==typeof r)return void e.push(r);t=r}var i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(null==i||i.length<4)return n.push('The provided transition expression "'+t+'" is not supported'),e;var o=i[1],s=i[2],l=i[3];e.push($y(o,l)),"<"!=s[0]||o==Ky&&l==Ky||e.push($y(l,o))}(t,i,r)}):i.push(n),i),animation:o,queryCount:e.queryCount,depCount:e.depCount,options:ov(t.options)}},t.prototype.visitSequence=function(t,e){var n=this;return{type:2,steps:t.steps.map(function(t){return Qy(n,t,e)}),options:ov(t.options)}},t.prototype.visitGroup=function(t,e){var n=this,r=e.currentTime,i=0,o=t.steps.map(function(t){e.currentTime=r;var o=Qy(n,t,e);return i=Math.max(i,e.currentTime),o});return e.currentTime=i,{type:3,steps:o,options:ov(t.options)}},t.prototype.visitAnimate=function(t,e){var n,r=function(t,e){var n=null;if(t.hasOwnProperty("duration"))n=t;else if("number"==typeof t)return sv(Ry(t,e).duration,0,"");var r=t;if(r.split(/\s+/).some(function(t){return"{"==t.charAt(0)&&"{"==t.charAt(1)})){var i=sv(0,0,"");return i.dynamic=!0,i.strValue=r,i}return sv((n=n||Ry(r,e)).duration,n.delay,n.easing)}(t.timings,e.errors);e.currentAnimateTimings=r;var i=t.styles?t.styles:Ss({});if(5==i.type)n=this.visitKeyframes(i,e);else{var o=t.styles,s=!1;if(!o){s=!0;var l={};r.easing&&(l.easing=r.easing),o=Ss(l)}e.currentTime+=r.duration+r.delay;var a=this.visitStyle(o,e);a.isEmptyStep=s,n=a}return e.currentAnimateTimings=null,{type:4,timings:r,style:n,options:null}},t.prototype.visitStyle=function(t,e){var n=this._makeStyleAst(t,e);return this._validateStyleAst(n,e),n},t.prototype._makeStyleAst=function(t,e){var n=[];Array.isArray(t.styles)?t.styles.forEach(function(t){"string"==typeof t?t==Ls?n.push(t):e.errors.push("The provided style string value "+t+" is not allowed."):n.push(t)}):n.push(t.styles);var r=!1,i=null;return n.forEach(function(t){if(iv(t)){var e=t,n=e.easing;if(n&&(i=n,delete e.easing),!r)for(var o in e)if(e[o].toString().indexOf("{{")>=0){r=!0;break}}}),{type:6,styles:n,easing:i,offset:t.offset,containsDynamicStyles:r,options:null}},t.prototype._validateStyleAst=function(t,e){var n=this,r=e.currentAnimateTimings,i=e.currentTime,o=e.currentTime;r&&o>0&&(o-=r.duration+r.delay),t.styles.forEach(function(t){"string"!=typeof t&&Object.keys(t).forEach(function(r){if(n._driver.validateStyleProperty(r)){var s,l,a,u=e.collectedStyles[e.currentQuerySelector],c=u[r],d=!0;c&&(o!=i&&o>=c.startTime&&i<=c.endTime&&(e.errors.push('The CSS property "'+r+'" that exists between the times of "'+c.startTime+'ms" and "'+c.endTime+'ms" is also being animated in a parallel animation between the times of "'+o+'ms" and "'+i+'ms"'),d=!1),o=c.startTime),d&&(u[r]={startTime:o,endTime:i}),e.options&&(s=e.errors,l=e.options.params||{},(a=Wy(t[r])).length&&a.forEach(function(t){l.hasOwnProperty(t)||s.push("Unable to resolve the local animation param "+t+" in the given list of values")}))}else e.errors.push('The provided animation property "'+r+'" is not a supported CSS property for animations')})})},t.prototype.visitKeyframes=function(t,e){var n=this,r={type:5,styles:[],options:null};if(!e.currentAnimateTimings)return e.errors.push("keyframes() must be placed inside of a call to animate()"),r;var i=0,o=[],s=!1,l=!1,a=0,u=t.steps.map(function(t){var r=n._makeStyleAst(t,e),u=null!=r.offset?r.offset:function(t){if("string"==typeof t)return null;var e=null;if(Array.isArray(t))t.forEach(function(t){if(iv(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}});else if(iv(t)&&t.hasOwnProperty("offset")){var n=t;e=parseFloat(n.offset),delete n.offset}return e}(r.styles),c=0;return null!=u&&(i++,c=r.offset=u),l=l||c<0||c>1,s=s||c0&&i0?i==h?1:d*i:o[i],l=s*_;e.currentTime=p+f.delay+l,f.duration=l,n._validateStyleAst(t,e),t.offset=s,r.styles.push(t)}),r},t.prototype.visitReference=function(t,e){return{type:8,animation:Qy(this,By(t.animation),e),options:ov(t.options)}},t.prototype.visitAnimateChild=function(t,e){return e.depCount++,{type:9,options:ov(t.options)}},t.prototype.visitAnimateRef=function(t,e){return{type:10,animation:this.visitReference(t.animation,e),options:ov(t.options)}},t.prototype.visitQuery=function(t,e){var n=e.currentQuerySelector,r=t.options||{};e.queryCount++,e.currentQuery=t;var i=function(t){var e=!!t.split(/\s*,\s*/).find(function(t){return":self"==t});return e&&(t=t.replace(tv,"")),[t=t.replace(/@\*/g,".ng-trigger").replace(/@\w+/g,function(t){return".ng-trigger-"+t.substr(1)}).replace(/:animating/g,".ng-animating"),e]}(t.selector),o=i[0],s=i[1];e.currentQuerySelector=n.length?n+" "+o:o,vy(e.collectedStyles,e.currentQuerySelector,{});var l=Qy(this,By(t.animation),e);return e.currentQuery=null,e.currentQuerySelector=n,{type:11,selector:o,limit:r.limit||0,optional:!!r.optional,includeSelf:s,animation:l,originalSelector:t.selector,options:ov(t.options)}},t.prototype.visitStagger=function(t,e){e.currentQuery||e.errors.push("stagger() can only be used inside of query()");var n="full"===t.timings?{duration:0,delay:0,easing:"full"}:Ry(t.timings,e.errors,!0);return{type:12,animation:Qy(this,By(t.animation),e),timings:n,options:null}},t}(),rv=function(t){this.errors=t,this.queryCount=0,this.depCount=0,this.currentTransition=null,this.currentQuery=null,this.currentQuerySelector=null,this.currentAnimateTimings=null,this.currentTime=0,this.collectedStyles={},this.options=null};function iv(t){return!Array.isArray(t)&&"object"==typeof t}function ov(t){var e;return t?(t=Hy(t)).params&&(t.params=(e=t.params)?Hy(e):null):t={},t}function sv(t,e,n){return{duration:t,delay:e,easing:n}}function lv(t,e,n,r,i,o,s,l){return void 0===s&&(s=null),void 0===l&&(l=!1),{type:1,element:t,keyframes:e,preStyleProps:n,postStyleProps:r,duration:i,delay:o,totalTime:i+o,easing:s,subTimeline:l}}var av=function(){function t(){this._map=new Map}return t.prototype.consume=function(t){var e=this._map.get(t);return e?this._map.delete(t):e=[],e},t.prototype.append=function(t,e){var n=this._map.get(t);n||this._map.set(t,n=[]),n.push.apply(n,e)},t.prototype.has=function(t){return this._map.has(t)},t.prototype.clear=function(){this._map.clear()},t}(),uv=new RegExp(":enter","g"),cv=new RegExp(":leave","g");function dv(t,e,n,r,i,o,s,l,a,u){return void 0===o&&(o={}),void 0===s&&(s={}),void 0===u&&(u=[]),(new hv).buildKeyframes(t,e,n,r,i,o,s,l,a,u)}var hv=function(){function t(){}return t.prototype.buildKeyframes=function(t,e,n,r,i,o,s,l,a,u){void 0===u&&(u=[]),a=a||new av;var c=new fv(t,e,a,r,i,u,[]);c.options=l,c.currentTimeline.setStyles([o],null,c.errors,l),Qy(this,n,c);var d=c.timelines.filter(function(t){return t.containsAnimation()});if(d.length&&Object.keys(s).length){var h=d[d.length-1];h.allowOnlyTimelineStyles()||h.setStyles([s],null,c.errors,l)}return d.length?d.map(function(t){return t.buildKeyframes()}):[lv(e,[],[],[],0,0,"",!1)]},t.prototype.visitTrigger=function(t,e){},t.prototype.visitState=function(t,e){},t.prototype.visitTransition=function(t,e){},t.prototype.visitAnimateChild=function(t,e){var n=e.subInstructions.consume(e.element);if(n){var r=e.createSubContext(t.options),i=e.currentTimeline.currentTime,o=this._visitSubInstructions(n,r,r.options);i!=o&&e.transformIntoNewTimeline(o)}e.previousNode=t},t.prototype.visitAnimateRef=function(t,e){var n=e.createSubContext(t.options);n.transformIntoNewTimeline(),this.visitReference(t.animation,n),e.transformIntoNewTimeline(n.currentTimeline.currentTime),e.previousNode=t},t.prototype._visitSubInstructions=function(t,e,n){var r=e.currentTimeline.currentTime,i=null!=n.duration?jy(n.duration):null,o=null!=n.delay?jy(n.delay):null;return 0!==i&&t.forEach(function(t){var n=e.appendInstructionToTimeline(t,i,o);r=Math.max(r,n.duration+n.delay)}),r},t.prototype.visitReference=function(t,e){e.updateOptions(t.options,!0),Qy(this,t.animation,e),e.previousNode=t},t.prototype.visitSequence=function(t,e){var n=this,r=e.subContextCount,i=e,o=t.options;if(o&&(o.params||o.delay)&&((i=e.createSubContext(o)).transformIntoNewTimeline(),null!=o.delay)){6==i.previousNode.type&&(i.currentTimeline.snapshotCurrentStyles(),i.previousNode=pv);var s=jy(o.delay);i.delayNextStep(s)}t.steps.length&&(t.steps.forEach(function(t){return Qy(n,t,i)}),i.currentTimeline.applyStylesToKeyframe(),i.subContextCount>r&&i.transformIntoNewTimeline()),e.previousNode=t},t.prototype.visitGroup=function(t,e){var n=this,r=[],i=e.currentTimeline.currentTime,o=t.options&&t.options.delay?jy(t.options.delay):0;t.steps.forEach(function(s){var l=e.createSubContext(t.options);o&&l.delayNextStep(o),Qy(n,s,l),i=Math.max(i,l.currentTimeline.currentTime),r.push(l.currentTimeline)}),r.forEach(function(t){return e.currentTimeline.mergeTimelineCollectedStyles(t)}),e.transformIntoNewTimeline(i),e.previousNode=t},t.prototype._visitTiming=function(t,e){if(t.dynamic){var n=t.strValue;return Ry(e.params?Uy(n,e.params,e.errors):n,e.errors)}return{duration:t.duration,delay:t.delay,easing:t.easing}},t.prototype.visitAnimate=function(t,e){var n=e.currentAnimateTimings=this._visitTiming(t.timings,e),r=e.currentTimeline;n.delay&&(e.incrementTime(n.delay),r.snapshotCurrentStyles());var i=t.style;5==i.type?this.visitKeyframes(i,e):(e.incrementTime(n.duration),this.visitStyle(i,e),r.applyStylesToKeyframe()),e.currentAnimateTimings=null,e.previousNode=t},t.prototype.visitStyle=function(t,e){var n=e.currentTimeline,r=e.currentAnimateTimings;!r&&n.getCurrentStyleProperties().length&&n.forwardFrame();var i=r&&r.easing||t.easing;t.isEmptyStep?n.applyEmptyStep(i):n.setStyles(t.styles,i,e.errors,e.options),e.previousNode=t},t.prototype.visitKeyframes=function(t,e){var n=e.currentAnimateTimings,r=e.currentTimeline.duration,i=n.duration,o=e.createSubContext().currentTimeline;o.easing=n.easing,t.styles.forEach(function(t){o.forwardTime((t.offset||0)*i),o.setStyles(t.styles,t.easing,e.errors,e.options),o.applyStylesToKeyframe()}),e.currentTimeline.mergeTimelineCollectedStyles(o),e.transformIntoNewTimeline(r+i),e.previousNode=t},t.prototype.visitQuery=function(t,e){var n=this,r=e.currentTimeline.currentTime,i=t.options||{},o=i.delay?jy(i.delay):0;o&&(6===e.previousNode.type||0==r&&e.currentTimeline.getCurrentStyleProperties().length)&&(e.currentTimeline.snapshotCurrentStyles(),e.previousNode=pv);var s=r,l=e.invokeQuery(t.selector,t.originalSelector,t.limit,t.includeSelf,!!i.optional,e.errors);e.currentQueryTotal=l.length;var a=null;l.forEach(function(r,i){e.currentQueryIndex=i;var l=e.createSubContext(t.options,r);o&&l.delayNextStep(o),r===e.element&&(a=l.currentTimeline),Qy(n,t.animation,l),l.currentTimeline.applyStylesToKeyframe(),s=Math.max(s,l.currentTimeline.currentTime)}),e.currentQueryIndex=0,e.currentQueryTotal=0,e.transformIntoNewTimeline(s),a&&(e.currentTimeline.mergeTimelineCollectedStyles(a),e.currentTimeline.snapshotCurrentStyles()),e.previousNode=t},t.prototype.visitStagger=function(t,e){var n=e.parentContext,r=e.currentTimeline,i=t.timings,o=Math.abs(i.duration),s=o*(e.currentQueryTotal-1),l=o*e.currentQueryIndex;switch(i.duration<0?"reverse":i.easing){case"reverse":l=s-l;break;case"full":l=n.currentStaggerTime}var a=e.currentTimeline;l&&a.delayNextStep(l);var u=a.currentTime;Qy(this,t.animation,e),e.previousNode=t,n.currentStaggerTime=r.currentTime-u+(r.startTime-n.currentTimeline.startTime)},t}(),pv={},fv=function(){function t(t,e,n,r,i,o,s,l){this._driver=t,this.element=e,this.subInstructions=n,this._enterClassName=r,this._leaveClassName=i,this.errors=o,this.timelines=s,this.parentContext=null,this.currentAnimateTimings=null,this.previousNode=pv,this.subContextCount=0,this.options={},this.currentQueryIndex=0,this.currentQueryTotal=0,this.currentStaggerTime=0,this.currentTimeline=l||new _v(this._driver,e,0),s.push(this.currentTimeline)}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.updateOptions=function(t,e){var n=this;if(t){var r=t,i=this.options;null!=r.duration&&(i.duration=jy(r.duration)),null!=r.delay&&(i.delay=jy(r.delay));var o=r.params;if(o){var s=i.params;s||(s=this.options.params={}),Object.keys(o).forEach(function(t){e&&s.hasOwnProperty(t)||(s[t]=Uy(o[t],s,n.errors))})}}},t.prototype._copyOptions=function(){var t={};if(this.options){var e=this.options.params;if(e){var n=t.params={};Object.keys(e).forEach(function(t){n[t]=e[t]})}}return t},t.prototype.createSubContext=function(e,n,r){void 0===e&&(e=null);var i=n||this.element,o=new t(this._driver,i,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(i,r||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o},t.prototype.transformIntoNewTimeline=function(t){return this.previousNode=pv,this.currentTimeline=this.currentTimeline.fork(this.element,t),this.timelines.push(this.currentTimeline),this.currentTimeline},t.prototype.appendInstructionToTimeline=function(t,e,n){var r={duration:null!=e?e:t.duration,delay:this.currentTimeline.currentTime+(null!=n?n:0)+t.delay,easing:""},i=new mv(this._driver,t.element,t.keyframes,t.preStyleProps,t.postStyleProps,r,t.stretchStartingKeyframe);return this.timelines.push(i),r},t.prototype.incrementTime=function(t){this.currentTimeline.forwardTime(this.currentTimeline.duration+t)},t.prototype.delayNextStep=function(t){t>0&&this.currentTimeline.delayNextStep(t)},t.prototype.invokeQuery=function(t,e,n,r,i,o){var s=[];if(r&&s.push(this.element),t.length>0){t=(t=t.replace(uv,"."+this._enterClassName)).replace(cv,"."+this._leaveClassName);var l=this._driver.query(this.element,t,1!=n);0!==n&&(l=n<0?l.slice(l.length+n,l.length):l.slice(0,n)),s.push.apply(s,l)}return i||0!=s.length||o.push('`query("'+e+'")` returned zero elements. (Use `query("'+e+'", { optional: true })` if you wish to allow this.)'),s},t}(),_v=function(){function t(t,e,n,r){this._driver=t,this.element=e,this.startTime=n,this._elementTimelineStylesLookup=r,this.duration=0,this._previousKeyframe={},this._currentKeyframe={},this._keyframes=new Map,this._styleSummary={},this._pendingStyles={},this._backFill={},this._currentEmptyStepKeyframe=null,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._localTimelineStyles=Object.create(this._backFill,{}),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(e),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(e,this._localTimelineStyles)),this._loadKeyframe()}return t.prototype.containsAnimation=function(){switch(this._keyframes.size){case 0:return!1;case 1:return this.getCurrentStyleProperties().length>0;default:return!0}},t.prototype.getCurrentStyleProperties=function(){return Object.keys(this._currentKeyframe)},Object.defineProperty(t.prototype,"currentTime",{get:function(){return this.startTime+this.duration},enumerable:!0,configurable:!0}),t.prototype.delayNextStep=function(t){var e=1==this._keyframes.size&&Object.keys(this._pendingStyles).length;this.duration||e?(this.forwardTime(this.currentTime+t),e&&this.snapshotCurrentStyles()):this.startTime+=t},t.prototype.fork=function(e,n){return this.applyStylesToKeyframe(),new t(this._driver,e,n||this.currentTime,this._elementTimelineStylesLookup)},t.prototype._loadKeyframe=function(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=Object.create(this._backFill,{}),this._keyframes.set(this.duration,this._currentKeyframe))},t.prototype.forwardFrame=function(){this.duration+=1,this._loadKeyframe()},t.prototype.forwardTime=function(t){this.applyStylesToKeyframe(),this.duration=t,this._loadKeyframe()},t.prototype._updateStyle=function(t,e){this._localTimelineStyles[t]=e,this._globalTimelineStyles[t]=e,this._styleSummary[t]={time:this.currentTime,value:e}},t.prototype.allowOnlyTimelineStyles=function(){return this._currentEmptyStepKeyframe!==this._currentKeyframe},t.prototype.applyEmptyStep=function(t){var e=this;t&&(this._previousKeyframe.easing=t),Object.keys(this._globalTimelineStyles).forEach(function(t){e._backFill[t]=e._globalTimelineStyles[t]||Ls,e._currentKeyframe[t]=Ls}),this._currentEmptyStepKeyframe=this._currentKeyframe},t.prototype.setStyles=function(t,e,n,r){var i=this;e&&(this._previousKeyframe.easing=e);var o=r&&r.params||{},s=function(t,e){var n,r={};return t.forEach(function(t){"*"===t?(n=n||Object.keys(e)).forEach(function(t){r[t]=Ls}):Fy(t,!1,r)}),r}(t,this._globalTimelineStyles);Object.keys(s).forEach(function(t){var e=Uy(s[t],o,n);i._pendingStyles[t]=e,i._localTimelineStyles.hasOwnProperty(t)||(i._backFill[t]=i._globalTimelineStyles.hasOwnProperty(t)?i._globalTimelineStyles[t]:Ls),i._updateStyle(t,e)})},t.prototype.applyStylesToKeyframe=function(){var t=this,e=this._pendingStyles,n=Object.keys(e);0!=n.length&&(this._pendingStyles={},n.forEach(function(n){t._currentKeyframe[n]=e[n]}),Object.keys(this._localTimelineStyles).forEach(function(e){t._currentKeyframe.hasOwnProperty(e)||(t._currentKeyframe[e]=t._localTimelineStyles[e])}))},t.prototype.snapshotCurrentStyles=function(){var t=this;Object.keys(this._localTimelineStyles).forEach(function(e){var n=t._localTimelineStyles[e];t._pendingStyles[e]=n,t._updateStyle(e,n)})},t.prototype.getFinalKeyframe=function(){return this._keyframes.get(this.duration)},Object.defineProperty(t.prototype,"properties",{get:function(){var t=[];for(var e in this._currentKeyframe)t.push(e);return t},enumerable:!0,configurable:!0}),t.prototype.mergeTimelineCollectedStyles=function(t){var e=this;Object.keys(t._styleSummary).forEach(function(n){var r=e._styleSummary[n],i=t._styleSummary[n];(!r||i.time>r.time)&&e._updateStyle(n,i.value)})},t.prototype.buildKeyframes=function(){var t=this;this.applyStylesToKeyframe();var e=new Set,n=new Set,r=1===this._keyframes.size&&0===this.duration,i=[];this._keyframes.forEach(function(o,s){var l=Fy(o,!0);Object.keys(l).forEach(function(t){var r=l[t];r==Ys?e.add(t):r==Ls&&n.add(t)}),r||(l.offset=s/t.duration),i.push(l)});var o=e.size?Gy(e.values()):[],s=n.size?Gy(n.values()):[];if(r){var l=i[0],a=Hy(l);l.offset=0,a.offset=1,i=[l,a]}return lv(this.element,i,o,s,this.duration,this.startTime,this.easing,!1)},t}(),mv=function(t){function e(e,n,r,i,o,s,l){void 0===l&&(l=!1);var a=t.call(this,e,n,s.delay)||this;return a.element=n,a.keyframes=r,a.preStyleProps=i,a.postStyleProps=o,a._stretchStartingKeyframe=l,a.timings={duration:s.duration,delay:s.delay,easing:s.easing},a}return Object(o.__extends)(e,t),e.prototype.containsAnimation=function(){return this.keyframes.length>1},e.prototype.buildKeyframes=function(){var t=this.keyframes,e=this.timings,n=e.delay,r=e.duration,i=e.easing;if(this._stretchStartingKeyframe&&n){var o=[],s=r+n,l=n/s,a=Fy(t[0],!1);a.offset=0,o.push(a);var u=Fy(t[0],!1);u.offset=gv(l),o.push(u);for(var c=t.length-1,d=1;d<=c;d++){var h=Fy(t[d],!1);h.offset=gv((n+h.offset*r)/s),o.push(h)}r=s,n=0,i="",t=o}return lv(this.element,t,this.preStyleProps,this.postStyleProps,r,n,i,!0)},e}(_v);function gv(t,e){void 0===e&&(e=3);var n=Math.pow(10,e-1);return Math.round(t*n)/n}var yv=function(){},vv=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Object(o.__extends)(e,t),e.prototype.normalizePropertyName=function(t,e){return qy(t)},e.prototype.normalizeStyleValue=function(t,e,n,r){var i="",o=n.toString().trim();if(bv[e]&&0!==n&&"0"!==n)if("number"==typeof n)i="px";else{var s=n.match(/^[+-]?[\d\.]+([a-z]*)$/);s&&0==s[1].length&&r.push("Please provide a CSS unit value for "+t+":"+n)}return o+i},e}(yv),bv=function(t){var e={};return"width,height,minWidth,minHeight,maxWidth,maxHeight,left,top,bottom,right,fontSize,outlineWidth,outlineOffset,paddingTop,paddingLeft,paddingBottom,paddingRight,marginTop,marginLeft,marginBottom,marginRight,borderRadius,borderWidth,borderTopWidth,borderLeftWidth,borderRightWidth,borderBottomWidth,textIndent,perspective".split(",").forEach(function(t){return e[t]=!0}),e}();function wv(t,e,n,r,i,o,s,l,a,u,c,d){return{type:0,element:t,triggerName:e,isRemovalTransition:i,fromState:n,fromStyles:o,toState:r,toStyles:s,timelines:l,queriedElements:a,preStyleProps:u,postStyleProps:c,errors:d}}var Mv={},kv=function(){function t(t,e,n){this._triggerName=t,this.ast=e,this._stateStyles=n}return t.prototype.match=function(t,e){return function(t,e,n){return t.some(function(t){return t(e,n)})}(this.ast.matchers,t,e)},t.prototype.buildStyles=function(t,e,n){var r=this._stateStyles["*"],i=this._stateStyles[t],o=r?r.buildStyles(e,n):{};return i?i.buildStyles(e,n):o},t.prototype.build=function(t,e,n,r,i,s,l,a,u){var c=[],d=this.ast.options&&this.ast.options.params||Mv,h=this.buildStyles(n,l&&l.params||Mv,c),p=a&&a.params||Mv,f=this.buildStyles(r,p,c),_=new Set,m=new Map,g=new Map,y="void"===r,v={params:Object(o.__assign)({},d,p)},b=dv(t,e,this.ast.animation,i,s,h,f,v,u,c);if(c.length)return wv(e,this._triggerName,n,r,y,h,f,[],[],m,g,c);b.forEach(function(t){var n=t.element,r=vy(m,n,{});t.preStyleProps.forEach(function(t){return r[t]=!0});var i=vy(g,n,{});t.postStyleProps.forEach(function(t){return i[t]=!0}),n!==e&&_.add(n)});var w=Gy(_.values());return wv(e,this._triggerName,n,r,y,h,f,b,w,m,g)},t}(),xv=function(){function t(t,e){this.styles=t,this.defaultParams=e}return t.prototype.buildStyles=function(t,e){var n={},r=Hy(this.defaultParams);return Object.keys(t).forEach(function(e){var n=t[e];null!=n&&(r[e]=n)}),this.styles.styles.forEach(function(t){if("string"!=typeof t){var i=t;Object.keys(i).forEach(function(t){var o=i[t];o.length>1&&(o=Uy(o,r,e)),n[t]=o})}}),n},t}(),Lv=function(){function t(t,e){var n=this;this.name=t,this.ast=e,this.transitionFactories=[],this.states={},e.states.forEach(function(t){n.states[t.name]=new xv(t.style,t.options&&t.options.params||{})}),Cv(this.states,"true","1"),Cv(this.states,"false","0"),e.transitions.forEach(function(e){n.transitionFactories.push(new kv(t,e,n.states))}),this.fallbackTransition=new kv(t,{type:1,animation:{type:2,steps:[],options:null},matchers:[function(t,e){return!0}],options:null,queryCount:0,depCount:0},this.states)}return Object.defineProperty(t.prototype,"containsQueries",{get:function(){return this.ast.queryCount>0},enumerable:!0,configurable:!0}),t.prototype.matchTransition=function(t,e){return this.transitionFactories.find(function(n){return n.match(t,e)})||null},t.prototype.matchStyles=function(t,e,n){return this.fallbackTransition.buildStyles(t,e,n)},t}();function Cv(t,e,n){t.hasOwnProperty(e)?t.hasOwnProperty(n)||(t[n]=t[e]):t.hasOwnProperty(n)&&(t[e]=t[n])}var Sv=new av,Tv=function(){function t(t,e){this._driver=t,this._normalizer=e,this._animations={},this._playersById={},this.players=[]}return t.prototype.register=function(t,e){var n=[],r=ev(this._driver,e,n);if(n.length)throw new Error("Unable to build the animation due to the following errors: "+n.join("\n"));this._animations[t]=r},t.prototype._buildPlayer=function(t,e,n){var r=t.element,i=_y(0,this._normalizer,0,t.keyframes,e,n);return this._driver.animate(r,i,t.duration,t.delay,t.easing,[])},t.prototype.create=function(t,e,n){var r=this;void 0===n&&(n={});var i,o=[],s=this._animations[t],l=new Map;if(s?(i=dv(this._driver,e,s,"ng-enter","ng-leave",{},{},n,Sv,o)).forEach(function(t){var e=vy(l,t.element,{});t.postStyleProps.forEach(function(t){return e[t]=null})}):(o.push("The requested animation doesn't exist or has already been destroyed"),i=[]),o.length)throw new Error("Unable to create the animation due to the following errors: "+o.join("\n"));l.forEach(function(t,e){Object.keys(t).forEach(function(n){t[n]=r._driver.computeStyle(e,n,Ls)})});var a=fy(i.map(function(t){var e=l.get(t.element);return r._buildPlayer(t,{},e)}));return this._playersById[t]=a,a.onDestroy(function(){return r.destroy(t)}),this.players.push(a),a},t.prototype.destroy=function(t){var e=this._getPlayer(t);e.destroy(),delete this._playersById[t];var n=this.players.indexOf(e);n>=0&&this.players.splice(n,1)},t.prototype._getPlayer=function(t){var e=this._playersById[t];if(!e)throw new Error("Unable to find the timeline player referenced by "+t);return e},t.prototype.listen=function(t,e,n,r){var i=yy(e,"","","");return my(this._getPlayer(t),n,i,r),function(){}},t.prototype.command=function(t,e,n,r){if("register"!=n)if("create"!=n){var i=this._getPlayer(t);switch(n){case"play":i.play();break;case"pause":i.pause();break;case"reset":i.reset();break;case"restart":i.restart();break;case"finish":i.finish();break;case"init":i.init();break;case"setPosition":i.setPosition(parseFloat(r[0]));break;case"destroy":this.destroy(t)}}else this.create(t,e,r[0]||{});else this.register(t,r[0])},t}(),Ov=[],Dv={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!1},Yv={namespaceId:"",setForRemoval:null,hasAnimation:!1,removedBeforeQueried:!0},Pv="__ng_removed",Ev=function(){function t(t,e){void 0===e&&(e=""),this.namespaceId=e;var n=t&&t.hasOwnProperty("value");if(this.value=function(t){return null!=t?t:null}(n?t.value:t),n){var r=Hy(t);delete r.value,this.options=r}else this.options={};this.options.params||(this.options.params={})}return Object.defineProperty(t.prototype,"params",{get:function(){return this.options.params},enumerable:!0,configurable:!0}),t.prototype.absorbOptions=function(t){var e=t.params;if(e){var n=this.options.params;Object.keys(e).forEach(function(t){null==n[t]&&(n[t]=e[t])})}},t}(),Av=new Ev("void"),jv=new Ev("DELETED"),Iv=function(){function t(t,e,n){this.id=t,this.hostElement=e,this._engine=n,this.players=[],this._triggers={},this._queue=[],this._elementListeners=new Map,this._hostClassName="ng-tns-"+t,Wv(e,this._hostClassName)}return t.prototype.listen=function(t,e,n,r){var i,o=this;if(!this._triggers.hasOwnProperty(e))throw new Error('Unable to listen on the animation trigger event "'+n+'" because the animation trigger "'+e+"\" doesn't exist!");if(null==n||0==n.length)throw new Error('Unable to listen on the animation trigger "'+e+'" because the provided event is undefined!');if("start"!=(i=n)&&"done"!=i)throw new Error('The provided animation trigger event "'+n+'" for the animation trigger "'+e+'" is not supported!');var s=vy(this._elementListeners,t,[]),l={name:e,phase:n,callback:r};s.push(l);var a=vy(this._engine.statesByElement,t,{});return a.hasOwnProperty(e)||(Wv(t,"ng-trigger"),Wv(t,"ng-trigger-"+e),a[e]=Av),function(){o._engine.afterFlush(function(){var t=s.indexOf(l);t>=0&&s.splice(t,1),o._triggers[e]||delete a[e]})}},t.prototype.register=function(t,e){return!this._triggers[t]&&(this._triggers[t]=e,!0)},t.prototype._getTrigger=function(t){var e=this._triggers[t];if(!e)throw new Error('The provided animation trigger "'+t+'" has not been registered!');return e},t.prototype.trigger=function(t,e,n,r){var i=this;void 0===r&&(r=!0);var o=this._getTrigger(e),s=new Hv(this.id,e,t),l=this._engine.statesByElement.get(t);l||(Wv(t,"ng-trigger"),Wv(t,"ng-trigger-"+e),this._engine.statesByElement.set(t,l={}));var a=l[e],u=new Ev(n,this.id);if(!(n&&n.hasOwnProperty("value"))&&a&&u.absorbOptions(a.options),l[e]=u,a){if(a===jv)return s}else a=Av;if("void"===u.value||a.value!==u.value){var c=vy(this._engine.playersByElement,t,[]);c.forEach(function(t){t.namespaceId==i.id&&t.triggerName==e&&t.queued&&t.destroy()});var d=o.matchTransition(a.value,u.value),h=!1;if(!d){if(!r)return;d=o.fallbackTransition,h=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:t,triggerName:e,transition:d,fromState:a,toState:u,player:s,isFallbackTransition:h}),h||(Wv(t,"ng-animate-queued"),s.onStart(function(){Uv(t,"ng-animate-queued")})),s.onDone(function(){var e=i.players.indexOf(s);e>=0&&i.players.splice(e,1);var n=i._engine.playersByElement.get(t);if(n){var r=n.indexOf(s);r>=0&&n.splice(r,1)}}),this.players.push(s),c.push(s),s}if(!function(t,e){var n=Object.keys(t),r=Object.keys(e);if(n.length!=r.length)return!1;for(var i=0;i=0){for(var r=!1,i=n;i>=0;i--)if(this.driver.containsElement(this._namespaceList[i].hostElement,e)){this._namespaceList.splice(i+1,0,t),r=!0;break}r||this._namespaceList.splice(0,0,t)}else this._namespaceList.push(t);return this.namespacesByHostElement.set(e,t),t},t.prototype.register=function(t,e){var n=this._namespaceLookup[t];return n||(n=this.createNamespace(t,e)),n},t.prototype.registerTrigger=function(t,e,n){var r=this._namespaceLookup[t];r&&r.register(e,n)&&this.totalAnimations++},t.prototype.destroy=function(t,e){var n=this;if(t){var r=this._fetchNamespace(t);this.afterFlush(function(){n.namespacesByHostElement.delete(r.hostElement),delete n._namespaceLookup[t];var e=n._namespaceList.indexOf(r);e>=0&&n._namespaceList.splice(e,1)}),this.afterFlushAnimationsDone(function(){return r.destroy(e)})}},t.prototype._fetchNamespace=function(t){return this._namespaceLookup[t]},t.prototype.fetchNamespacesByElement=function(t){var e=new Set,n=this.statesByElement.get(t);if(n)for(var r=Object.keys(n),i=0;i=0;L--)this._namespaceList[L].drainQueuedTransitions(e).forEach(function(t){var e=t.player;k.push(e);var o=t.element;if(h&&n.driver.containsElement(h,o)){var s=w.get(o),d=_.get(o),p=n._buildInstruction(t,r,d,s);if(p.errors&&p.errors.length)x.push(p);else{if(t.isFallbackTransition)return e.onStart(function(){return Vy(o,p.fromStyles)}),e.onDestroy(function(){return Ny(o,p.toStyles)}),void i.push(e);p.timelines.forEach(function(t){return t.stretchStartingKeyframe=!0}),r.append(o,p.timelines),l.push({instruction:p,player:e,element:o}),p.queriedElements.forEach(function(t){return vy(a,t,[]).push(e)}),p.preStyleProps.forEach(function(t,e){var n=Object.keys(t);if(n.length){var r=u.get(e);r||u.set(e,r=new Set),n.forEach(function(t){return r.add(t)})}}),p.postStyleProps.forEach(function(t,e){var n=Object.keys(t),r=c.get(e);r||c.set(e,r=new Set),n.forEach(function(t){return r.add(t)})})}}else e.destroy()});if(x.length){var C=[];x.forEach(function(t){C.push("@"+t.triggerName+" has failed due to:\n"),t.errors.forEach(function(t){return C.push("- "+t+"\n")})}),k.forEach(function(t){return t.destroy()}),this.reportError(C)}var S=new Map,T=new Map;l.forEach(function(t){var e=t.element;r.has(e)&&(T.set(e,e),n._beforeAnimationBuild(t.player.namespaceId,t.instruction,S))}),i.forEach(function(t){var e=t.element;n._getPreviousPlayers(e,!1,t.namespaceId,t.triggerName,null).forEach(function(t){vy(S,e,[]).push(t),t.destroy()})});var O=g.filter(function(t){return Jv(t,u,c)}),D=new Map;Vv(D,this.driver,v,c,Ls).forEach(function(t){Jv(t,u,c)&&O.push(t)});var Y=new Map;f.forEach(function(t,e){Vv(Y,n.driver,new Set(t),u,Ys)}),O.forEach(function(t){var e=D.get(t),n=Y.get(t);D.set(t,Object(o.__assign)({},e,n))});var P=[],E=[],A={};l.forEach(function(t){var e=t.element,o=t.player,l=t.instruction;if(r.has(e)){if(d.has(e))return o.onDestroy(function(){return Ny(e,l.toStyles)}),void i.push(o);var a=A;if(T.size>1){for(var u=e,c=[];u=u.parentNode;){var h=T.get(u);if(h){a=h;break}c.push(u)}c.forEach(function(t){return T.set(t,a)})}var p=n._buildAnimation(o.namespaceId,l,S,s,Y,D);if(o.setRealPlayer(p),a===A)P.push(o);else{var f=n.playersByElement.get(a);f&&f.length&&(o.parentPlayer=fy(f)),i.push(o)}}else Vy(e,l.fromStyles),o.onDestroy(function(){return Ny(e,l.toStyles)}),E.push(o),d.has(e)&&i.push(o)}),E.forEach(function(t){var e=s.get(t.element);if(e&&e.length){var n=fy(e);t.setRealPlayer(n)}}),i.forEach(function(t){t.parentPlayer?t.syncPlayerEvents(t.parentPlayer):t.destroy()});for(var j=0;j0?this.driver.animate(t.element,e,t.duration,t.delay,t.easing,n):new Os},t}(),Hv=function(){function t(t,e,n){this.namespaceId=t,this.triggerName=e,this.element=n,this._player=new Os,this._containsRealPlayer=!1,this._queuedCallbacks={},this.destroyed=!1,this.markedForDestroy=!1,this.queued=!0}return t.prototype.setRealPlayer=function(t){var e=this;this._containsRealPlayer||(this._player=t,Object.keys(this._queuedCallbacks).forEach(function(n){e._queuedCallbacks[n].forEach(function(e){return my(t,n,void 0,e)})}),this._queuedCallbacks={},this._containsRealPlayer=!0,this.queued=!1)},t.prototype.getRealPlayer=function(){return this._player},t.prototype.syncPlayerEvents=function(t){var e=this,n=this._player;n.triggerCallback&&t.onStart(function(){return n.triggerCallback("start")}),t.onDone(function(){return e.finish()}),t.onDestroy(function(){return e.destroy()})},t.prototype._queueEvent=function(t,e){vy(this._queuedCallbacks,t,[]).push(e)},t.prototype.onDone=function(t){this.queued&&this._queueEvent("done",t),this._player.onDone(t)},t.prototype.onStart=function(t){this.queued&&this._queueEvent("start",t),this._player.onStart(t)},t.prototype.onDestroy=function(t){this.queued&&this._queueEvent("destroy",t),this._player.onDestroy(t)},t.prototype.init=function(){this._player.init()},t.prototype.hasStarted=function(){return!this.queued&&this._player.hasStarted()},t.prototype.play=function(){!this.queued&&this._player.play()},t.prototype.pause=function(){!this.queued&&this._player.pause()},t.prototype.restart=function(){!this.queued&&this._player.restart()},t.prototype.finish=function(){this._player.finish()},t.prototype.destroy=function(){this.destroyed=!0,this._player.destroy()},t.prototype.reset=function(){!this.queued&&this._player.reset()},t.prototype.setPosition=function(t){this.queued||this._player.setPosition(t)},t.prototype.getPosition=function(){return this.queued?0:this._player.getPosition()},Object.defineProperty(t.prototype,"totalTime",{get:function(){return this._player.totalTime},enumerable:!0,configurable:!0}),t.prototype.triggerCallback=function(t){var e=this._player;e.triggerCallback&&e.triggerCallback(t)},t}();function Fv(t){return t&&1===t.nodeType}function Nv(t,e){var n=t.style.display;return t.style.display=null!=e?e:"none",n}function Vv(t,e,n,r,i){var o=[];n.forEach(function(t){return o.push(Nv(t))});var s=[];r.forEach(function(n,r){var o={};n.forEach(function(t){var n=o[t]=e.computeStyle(r,t,i);n&&0!=n.length||(r[Pv]=Yv,s.push(r))}),t.set(r,o)});var l=0;return n.forEach(function(t){return Nv(t,o[l++])}),s}function Bv(t,e){var n=new Map;if(t.forEach(function(t){return n.set(t,[])}),0==e.length)return n;var r=new Set(e),i=new Map;return e.forEach(function(t){var e=function t(e){if(!e)return 1;var o=i.get(e);if(o)return o;var s=e.parentNode;return o=n.has(s)?s:r.has(s)?1:t(s),i.set(e,o),o}(t);1!==e&&n.get(e).push(t)}),n}var zv="$$classes";function Wv(t,e){if(t.classList)t.classList.add(e);else{var n=t[zv];n||(n=t[zv]={}),n[e]=!0}}function Uv(t,e){if(t.classList)t.classList.remove(e);else{var n=t[zv];n&&delete n[e]}}function Gv(t,e,n){fy(n).onDone(function(){return t.processLeaveNode(e)})}function Jv(t,e,n){var r=n.get(t);if(!r)return!1;var i=e.get(t);return i?r.forEach(function(t){return i.add(t)}):e.set(t,r),n.delete(t),!0}var qv=function(){function t(t,e){var n=this;this._driver=t,this._triggerCache={},this.onRemovalComplete=function(t,e){},this._transitionEngine=new Rv(t,e),this._timelineEngine=new Tv(t,e),this._transitionEngine.onRemovalComplete=function(t,e){return n.onRemovalComplete(t,e)}}return t.prototype.registerTrigger=function(t,e,n,r,i){var o=t+"-"+r,s=this._triggerCache[o];if(!s){var l=[],a=ev(this._driver,i,l);if(l.length)throw new Error('The animation trigger "'+r+'" has failed to build due to the following errors:\n - '+l.join("\n - "));s=function(t,e){return new Lv(t,e)}(r,a),this._triggerCache[o]=s}this._transitionEngine.registerTrigger(e,r,s)},t.prototype.register=function(t,e){this._transitionEngine.register(t,e)},t.prototype.destroy=function(t,e){this._transitionEngine.destroy(t,e)},t.prototype.onInsert=function(t,e,n,r){this._transitionEngine.insertNode(t,e,n,r)},t.prototype.onRemove=function(t,e,n){this._transitionEngine.removeNode(t,e,n)},t.prototype.disableAnimations=function(t,e){this._transitionEngine.markElementAsDisabled(t,e)},t.prototype.process=function(t,e,n,r){if("@"==n.charAt(0)){var i=by(n);this._timelineEngine.command(i[0],e,i[1],r)}else this._transitionEngine.trigger(t,e,n,r)},t.prototype.listen=function(t,e,n,r,i){if("@"==n.charAt(0)){var o=by(n);return this._timelineEngine.listen(o[0],e,o[1],i)}return this._transitionEngine.listen(t,e,n,r,i)},t.prototype.flush=function(t){void 0===t&&(t=-1),this._transitionEngine.flush(t)},Object.defineProperty(t.prototype,"players",{get:function(){return this._transitionEngine.players.concat(this._timelineEngine.players)},enumerable:!0,configurable:!0}),t.prototype.whenRenderingDone=function(){return this._transitionEngine.whenRenderingDone()},t}(),Qv=function(t){function e(e,n){var i=t.call(this)||this;return i._nextAnimationId=0,i._renderer=e.createRenderer(n.body,{id:"0",encapsulation:r.S.None,styles:[],data:{animation:[]}}),i}return Object(o.__extends)(e,t),e.prototype.build=function(t){var e=this._nextAnimationId.toString();this._nextAnimationId++;var n=Array.isArray(t)?Cs(t):t;return Zv(this._renderer,null,e,"register",[n]),new Kv(e,this._renderer)},e}(xs),Kv=function(t){function e(e,n){var r=t.call(this)||this;return r._id=e,r._renderer=n,r}return Object(o.__extends)(e,t),e.prototype.create=function(t,e){return new Xv(this._id,t,e||{},this._renderer)},e}(function(){}),Xv=function(){function t(t,e,n,r){this.id=t,this.element=e,this._renderer=r,this.parentPlayer=null,this._started=!1,this.totalTime=0,this._command("create",n)}return t.prototype._listen=function(t,e){return this._renderer.listen(this.element,"@@"+this.id+":"+t,e)},t.prototype._command=function(t){for(var e=[],n=1;n=0&&t=11?t:t+12:"sore"===e||"malam"===e?t+12:void 0},meridiem:function(t,e,n){return t<11?"pagi":t<15?"siang":t<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})}(n("PJh5"))},z3hR:function(t,e,n){!function(t){"use strict";function e(t,e,n,r){var i={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return e?i[n][0]:i[n][1]}function n(t){if(t=parseInt(t,10),isNaN(t))return!1;if(t<0)return!0;if(t<10)return 4<=t&&t<=7;if(t<100){var e=t%10;return n(0===e?t/10:e)}if(t<1e4){for(;t>=10;)t/=10;return n(t)}return n(t/=1e3)}t.defineLocale("lb",{months:"Januar_Februar_M\xe4erz_Abr\xebll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_M\xe9indeg_D\xebnschdeg_M\xebttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._M\xe9._D\xeb._M\xeb._Do._Fr._Sa.".split("_"),weekdaysMin:"So_M\xe9_D\xeb_M\xeb_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[G\xebschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:function(t){return n(t.substr(0,t.indexOf(" ")))?"a "+t:"an "+t},past:function(t){return n(t.substr(0,t.indexOf(" ")))?"viru "+t:"virun "+t},s:"e puer Sekonnen",ss:"%d Sekonnen",m:e,mm:"%d Minutten",h:e,hh:"%d Stonnen",d:e,dd:"%d Deeg",M:e,MM:"%d M\xe9int",y:e,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})}(n("PJh5"))}},[0]); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.f43c2ec828cc11243da0.bundle.js b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.f43c2ec828cc11243da0.bundle.js new file mode 100755 index 0000000..4c1e2c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/polyfills.f43c2ec828cc11243da0.bundle.js @@ -0,0 +1 @@ +webpackJsonp([2],{"/whu":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"0Rih":function(t,e,n){"use strict";var r=n("OzIq"),o=n("Ds5P"),i=n("R3AP"),a=n("A16L"),c=n("1aA0"),u=n("vmSO"),s=n("9GpA"),f=n("UKM+"),l=n("zgIt"),p=n("qkyc"),h=n("yYvK"),v=n("kic5");t.exports=function(t,e,n,d,y,g){var _=r[t],k=_,m=y?"set":"add",b=k&&k.prototype,w={},T=function(t){var e=b[t];i(b,t,"delete"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"has"==t?function(t){return!(g&&!f(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!f(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof k&&(g||b.forEach&&!l(function(){(new k).entries().next()}))){var O=new k,D=O[m](g?{}:-0,1)!=O,E=l(function(){O.has(1)}),S=p(function(t){new k(t)}),P=!g&&l(function(){for(var t=new k,e=5;e--;)t[m](e,e);return!t.has(-0)});S||((k=e(function(e,n){s(e,k,t);var r=v(new _,e,k);return void 0!=n&&u(n,y,r[m],r),r})).prototype=b,b.constructor=k),(E||P)&&(T("delete"),T("has"),y&&T("get")),(P||D)&&T(m),g&&b.clear&&delete b.clear}else k=d.getConstructor(e,t,y,m),a(k.prototype,n),c.NEED=!0;return h(k,t),w[t]=k,o(o.G+o.W+o.F*(k!=_),w),g||d.setStrong(k,t,y),k}},1:function(t,e,n){t.exports=n("XS25")},"1aA0":function(t,e,n){var r=n("ulTY")("meta"),o=n("UKM+"),i=n("WBcL"),a=n("lDLk").f,c=0,u=Object.isExtensible||function(){return!0},s=!n("zgIt")(function(){return u(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!u(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!u(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&u(t)&&!i(t,r)&&f(t),t}}},"2p1q":function(t,e,n){var r=n("lDLk"),o=n("fU25");t.exports=n("bUqO")?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},"2tFN":function(t,e,n){n("CVR+"),n("vmSu"),n("4ZU1"),n("yx1U"),n("X7aK"),n("SPtU"),n("A52B"),n("PuTd"),n("dm+7"),n("JG34"),n("Rw4K"),n("9mGU"),n("bUY0"),n("mTp7"),t.exports=n("7gX0").Reflect},"3q4u":function(t,e,n){var r=n("wCso"),o=n("DIVP"),i=r.key,a=r.map,c=r.store;r.exp({deleteMetadata:function(t,e){var n=arguments.length<3?void 0:i(arguments[2]),r=a(o(e),n,!1);if(void 0===r||!r.delete(t))return!1;if(r.size)return!0;var u=c.get(e);return u.delete(n),!!u.size||c.delete(e)}})},"4ZU1":function(t,e,n){var r=n("lDLk"),o=n("Ds5P"),i=n("DIVP"),a=n("s4j0");o(o.S+o.F*n("zgIt")(function(){Reflect.defineProperty(r.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,e,n){i(t),e=a(e,!0),i(n);try{return r.f(t,e,n),!0}catch(t){return!1}}})},"7gX0":function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},"7ylX":function(t,e,n){var r=n("DIVP"),o=n("twxM"),i=n("QKXm"),a=n("mZON")("IE_PROTO"),c=function(){},u=function(){var t,e=n("jhxf")("iframe"),r=i.length;for(e.style.display="none",n("d075").appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("'],s=0;o>s;s++){a.push("");for(var h=0;o>h;h++)a.push('');a.push("")}a.push("
"),r.innerHTML=a.join("");var u=r.childNodes[0],l=(e.width-u.offsetWidth)/2,f=(e.height-u.offsetHeight)/2;l>0&&f>0&&(u.style.margin=f+"px "+l+"px")},t.prototype.clear=function(){this._el.innerHTML=""},t}();(QRCode=function(t,e){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:s.H},"string"==typeof e&&(e={text:e}),e)for(var r in e)this._htOption[r]=e[r];"string"==typeof t&&(t=document.getElementById(t)),this._android=n(),this._el=t,this._oQRCode=null,this._oDrawing=new c(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)}).prototype.makeCode=function(t){this._oQRCode=new e(function(t,e){for(var r=1,o=function(t){var e=encodeURI(t).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return e.length+(e.length!=t?3:0)}(t),i=0,n=g.length;n>=i;i++){var a=0;switch(e){case s.L:a=g[i][0];break;case s.M:a=g[i][1];break;case s.Q:a=g[i][2];break;case s.H:a=g[i][3]}if(a>=o)break;r++}if(r>g.length)throw new Error("Too long data");return r}(t,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(t),this._oQRCode.make(),this._el.title=t,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=s}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.f58b58865ca78ccb80f3.bundle.css b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.f58b58865ca78ccb80f3.bundle.css new file mode 100755 index 0000000..e7cdb2b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/dist/styles.f58b58865ca78ccb80f3.bundle.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?v=4.7.0);src:url(fontawesome-webfont.674f50d287a8c48dc19b.eot?#iefix&v=4.7.0) format('embedded-opentype'),url(fontawesome-webfont.af7ae505a9eed503f8b8.woff2?v=4.7.0) format('woff2'),url(fontawesome-webfont.fee66e712a8a08eef580.woff?v=4.7.0) format('woff'),url(fontawesome-webfont.b06871f281fee6b241d6.ttf?v=4.7.0) format('truetype'),url(fontawesome-webfont.912ec66d7572ff821749.svg?v=4.7.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{display:inline-block;font:14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:2s linear infinite fa-spin;animation:2s linear infinite fa-spin}.fa-pulse{-webkit-animation:1s steps(8) infinite fa-spin;animation:1s steps(8) infinite fa-spin}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:"\f2a3"}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-address-card:before,.fa-vcard:before{content:"\f2bb"}.fa-address-card-o:before,.fa-vcard-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(MaterialIcons-Regular.e79bfd88537def476913.eot);src:local('Material Icons'),local('MaterialIcons-Regular'),url(MaterialIcons-Regular.570eb83859dc23dd0eec.woff2) format('woff2'),url(MaterialIcons-Regular.012cf6a10129e2275d79.woff) format('woff'),url(MaterialIcons-Regular.a37b0c01c0baf1888ca8.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;-webkit-font-feature-settings:'liga';font-feature-settings:'liga'}.-table:last-of-type{margin-bottom:30px}.-table .-headers{color:rgba(30,34,39,.2);display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;font-weight:700;height:50px;line-height:50px;margin:0 30px}.-table .-headers>div{padding:0 20px}.-table .-body{border-radius:15px;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);box-shadow:0 0 2px 2px rgba(0,0,0,.01),1px 1px 2px 2px rgba(0,0,0,.01);margin:0 30px}.-table .-body .-row{font-size:13px;line-height:60px;height:60px;background:#fafafa;display:-webkit-box;display:-ms-flexbox;display:flex}.-table .-body .-row:not(:last-child){border-bottom:1px solid #eff0f0}.-table .-body .-row:first-child{border-top-left-radius:15px;border-top-right-radius:15px}.-table .-body .-row:last-child{border-bottom-left-radius:15px;border-bottom-right-radius:15px}.-table .-body .-row>div{padding:0 20px}.-table .-width-70{width:70px}.-table .-width-150{width:150px}.-table .-width-200{width:200px}.-table .-width-250{width:250px}/*! + * Bootstrap Grid v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors + * Copyright 2011-2017 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar;height:100%}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.mat-elevation-z0{-webkit-box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12);box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.mat-elevation-z1{-webkit-box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12)}.mat-elevation-z2{-webkit-box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.mat-elevation-z3{-webkit-box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12);box-shadow:0 3px 3px -2px rgba(0,0,0,.2),0 3px 4px 0 rgba(0,0,0,.14),0 1px 8px 0 rgba(0,0,0,.12)}.mat-elevation-z4{-webkit-box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.mat-elevation-z5{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px 0 rgba(0,0,0,.14),0 1px 14px 0 rgba(0,0,0,.12)}.mat-elevation-z6{-webkit-box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12);box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.mat-elevation-z7{-webkit-box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12);box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.mat-elevation-z8{-webkit-box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.mat-elevation-z9{-webkit-box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12);box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.mat-elevation-z10{-webkit-box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12);box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.mat-elevation-z11{-webkit-box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12);box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.mat-elevation-z12{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.mat-elevation-z13{-webkit-box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12);box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.mat-elevation-z14{-webkit-box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12);box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.mat-elevation-z15{-webkit-box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12);box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.mat-elevation-z16{-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.mat-elevation-z17{-webkit-box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12);box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.mat-elevation-z18{-webkit-box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12);box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.mat-elevation-z19{-webkit-box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12);box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.mat-elevation-z20{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.mat-elevation-z21{-webkit-box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12);box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.mat-elevation-z22{-webkit-box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12);box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.mat-elevation-z23{-webkit-box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12);box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.mat-elevation-z24{-webkit-box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.mat-h1,.mat-headline,.mat-typography h1{font:400 24px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h2,.mat-title,.mat-typography h2{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h3,.mat-subheading-2,.mat-typography h3{font:400 16px/28px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h4,.mat-subheading-1,.mat-typography h4{font:400 15px/24px Roboto,"Helvetica Neue",sans-serif;margin:0 0 16px}.mat-h5,.mat-typography h5{font-size:11.62px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-h6,.mat-typography h6{font-size:9.38px;font-weight:400;font-family:Roboto,"Helvetica Neue",sans-serif;line-height:20px;margin:0 0 12px}.mat-body-2,.mat-body-strong{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-body,.mat-body-1,.mat-typography{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-body p,.mat-body-1 p,.mat-typography p{margin:0 0 12px}.mat-caption,.mat-small{font:400 12px/20px Roboto,"Helvetica Neue",sans-serif}.mat-display-4,.mat-typography .mat-display-4{font:300 112px/112px Roboto,"Helvetica Neue",sans-serif;margin:0 0 56px;letter-spacing:-.05em}.mat-display-3,.mat-typography .mat-display-3{font:400 56px/56px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.02em}.mat-display-2,.mat-typography .mat-display-2{font:400 45px/48px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px;letter-spacing:-.005em}.mat-display-1,.mat-typography .mat-display-1{font:400 34px/40px Roboto,"Helvetica Neue",sans-serif;margin:0 0 64px}.mat-button,.mat-fab,.mat-icon-button,.mat-mini-fab,.mat-raised-button{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-button-toggle,.mat-card{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-card-title{font-size:24px;font-weight:400}.mat-card-content,.mat-card-header .mat-card-title,.mat-card-subtitle{font-size:14px}.mat-checkbox{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-checkbox-layout .mat-checkbox-label{line-height:24px}.mat-chip{font-size:13px;line-height:18px}.mat-chip .mat-chip-remove.mat-icon{font-size:18px}.mat-table{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-header-cell{font-size:12px;font-weight:500}.mat-cell{font-size:14px}.mat-calendar{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-calendar-body{font-size:13px}.mat-calendar-body-label,.mat-calendar-period-button{font-size:14px;font-weight:500}.mat-calendar-table-header th{font-size:11px;font-weight:400}.mat-dialog-title{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif}.mat-expansion-panel-header{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:15px;font-weight:400}.mat-expansion-panel-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-form-field{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:inherit;font-weight:400;line-height:1.125}.mat-form-field-wrapper{padding-bottom:1.25em}.mat-form-field-prefix .mat-icon,.mat-form-field-suffix .mat-icon{font-size:150%;line-height:1.125}.mat-form-field-prefix .mat-icon-button,.mat-form-field-suffix .mat-icon-button{height:1.5em;width:1.5em}.mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field-suffix .mat-icon-button .mat-icon{height:1.125em;line-height:1.125}.mat-form-field-infix{padding:.4375em 0;border-top:.84375em solid transparent}.mat-form-field-can-float .mat-input-server:focus+.mat-form-field-label-wrapper .mat-form-field-label,.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.001px);-ms-transform:translateY(-1.28125em) scale(.75);width:133.33333333%}.mat-form-field-can-float .mat-form-field-autofill-control:-webkit-autofill+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00101px);-ms-transform:translateY(-1.28124em) scale(.75);width:133.33334333%}.mat-form-field-can-float .mat-input-server[label]:not(:label-shown)+.mat-form-field-label-wrapper .mat-form-field-label{-webkit-transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);transform:translateY(-1.28125em) scale(.75) perspective(100px) translateZ(.00102px);-ms-transform:translateY(-1.28123em) scale(.75);width:133.33335333%}.mat-form-field-label-wrapper{top:-.84375em;padding-top:.84375em}.mat-form-field-label{top:1.28125em}.mat-form-field-underline{bottom:1.25em}.mat-form-field-subscript-wrapper{font-size:75%;margin-top:.54166667em;top:calc(100% - 1.66666667em)}.mat-grid-tile-footer,.mat-grid-tile-header{font-size:14px}.mat-grid-tile-footer .mat-line,.mat-grid-tile-header .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-grid-tile-footer .mat-line:nth-child(n+2),.mat-grid-tile-header .mat-line:nth-child(n+2){font-size:12px}input.mat-input-element{margin-top:-.0625em}.mat-menu-item{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px;font-weight:400}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px}.mat-radio-button,.mat-select{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-select-trigger{height:1.125em}.mat-slide-toggle-content{font:400 14px/20px Roboto,"Helvetica Neue",sans-serif}.mat-slider-thumb-label-text{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-stepper-horizontal,.mat-stepper-vertical{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-step-label{font-size:14px;font-weight:400}.mat-step-label-selected{font-size:14px;font-weight:500}.mat-tab-group{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-tab-label,.mat-tab-link{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500}.mat-toolbar,.mat-toolbar h1,.mat-toolbar h2,.mat-toolbar h3,.mat-toolbar h4,.mat-toolbar h5,.mat-toolbar h6{font:500 20px/32px Roboto,"Helvetica Neue",sans-serif;margin:0}.mat-tooltip{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:10px;padding-top:6px;padding-bottom:6px}.mat-list-item,.mat-list-option{font-family:Roboto,"Helvetica Neue",sans-serif}.mat-list .mat-list-item,.mat-nav-list .mat-list-item,.mat-selection-list .mat-list-item{font-size:16px}.mat-list .mat-list-item .mat-line,.mat-nav-list .mat-list-item .mat-line,.mat-selection-list .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list .mat-list-item .mat-line:nth-child(n+2){font-size:14px}.mat-list .mat-list-option,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-option{font-size:16px}.mat-list .mat-list-option .mat-line,.mat-nav-list .mat-list-option .mat-line,.mat-selection-list .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list .mat-list-option .mat-line:nth-child(n+2){font-size:14px}.mat-list[dense] .mat-list-item,.mat-nav-list[dense] .mat-list-item,.mat-selection-list[dense] .mat-list-item{font-size:12px}.mat-list[dense] .mat-list-item .mat-line,.mat-nav-list[dense] .mat-list-item .mat-line,.mat-selection-list[dense] .mat-list-item .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-list[dense] .mat-list-option,.mat-nav-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option,.mat-selection-list[dense] .mat-list-item .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option{font-size:12px}.mat-list[dense] .mat-list-option .mat-line,.mat-nav-list[dense] .mat-list-option .mat-line,.mat-selection-list[dense] .mat-list-option .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.mat-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-nav-list[dense] .mat-list-option .mat-line:nth-child(n+2),.mat-selection-list[dense] .mat-list-option .mat-line:nth-child(n+2){font-size:12px}.mat-list[dense] .mat-subheader,.mat-nav-list[dense] .mat-subheader,.mat-selection-list[dense] .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:12px;font-weight:500}.mat-option{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:16px}.mat-optgroup-label{font:500 14px/24px Roboto,"Helvetica Neue",sans-serif}.mat-simple-snackbar{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px}.mat-simple-snackbar-action{line-height:1;font-family:inherit;font-size:inherit;font-weight:500}.mat-ripple{overflow:hidden}@media screen and (-ms-high-contrast:active){.mat-ripple{display:none}.mat-option-ripple{opacity:.5}}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;-webkit-transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,-webkit-transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1);transition:opacity,transform 0s cubic-bezier(0,0,.2,1),-webkit-transform 0s cubic-bezier(0,0,.2,1);-webkit-transform:scale(0);transform:scale(0)}.mat-option{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;position:relative;cursor:pointer;outline:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:rgba(0,0,0,.87)}.mat-option[disabled]{cursor:default}[dir=rtl] .mat-option{text-align:right}.mat-option .mat-icon{margin-right:16px}[dir=rtl] .mat-option .mat-icon{margin-left:16px;margin-right:0}.mat-option[aria-disabled=true]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:32px}[dir=rtl] .mat-optgroup .mat-option:not(.mat-option-multiple){padding-left:16px;padding-right:32px}.mat-option-text{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;overflow:hidden;text-overflow:ellipsis}.mat-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-option-pseudo-checkbox{margin-right:8px}[dir=rtl] .mat-option-pseudo-checkbox{margin-left:8px;margin-right:0}.mat-optgroup-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;line-height:48px;height:48px;padding:0 16px;text-align:left;text-decoration:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default;color:rgba(0,0,0,.54)}.mat-optgroup-label[disabled]{cursor:default}[dir=rtl] .mat-optgroup-label{text-align:right}.mat-optgroup-label .mat-icon{margin-right:16px}[dir=rtl] .mat-optgroup-label .mat-icon{margin-left:16px;margin-right:0}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.cdk-global-overlay-wrapper,.cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-global-overlay-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1000}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;-webkit-transition:opacity .4s cubic-bezier(.25,.8,.25,1);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.48}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.6)}.cdk-overlay-transparent-backdrop{background:0 0}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}.mat-ripple-element{background-color:rgba(0,0,0,.1)}.mat-option:focus:not(.mat-option-disabled),.mat-option:hover:not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-primary .mat-option.mat-selected:not(.mat-option-disabled){color:#0072ff}.mat-accent .mat-option.mat-selected:not(.mat-option-disabled){color:#ffc125}.mat-warn .mat-option.mat-selected:not(.mat-option-disabled){color:#f44336}.mat-option.mat-selected:not(.mat-option-multiple):not(.mat-option-disabled){background:rgba(0,0,0,.04)}.mat-option.mat-active{background:rgba(0,0,0,.04);color:rgba(0,0,0,.87)}.mat-option.mat-option-disabled{color:rgba(0,0,0,.38)}.mat-optgroup-disabled .mat-optgroup-label{color:rgba(0,0,0,.38)}.mat-pseudo-checkbox{color:rgba(0,0,0,.54)}.mat-pseudo-checkbox::after{color:#fafafa}.mat-accent .mat-pseudo-checkbox-checked,.mat-accent .mat-pseudo-checkbox-indeterminate,.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-indeterminate{background:#ffc125}.mat-primary .mat-pseudo-checkbox-checked,.mat-primary .mat-pseudo-checkbox-indeterminate{background:#0072ff}.mat-warn .mat-pseudo-checkbox-checked,.mat-warn .mat-pseudo-checkbox-indeterminate{background:#f44336}.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background:#b0b0b0}.mat-app-background{background-color:#fafafa}.mat-theme-loaded-marker{display:none}.mat-autocomplete-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover){background:#fff}.mat-autocomplete-panel .mat-option.mat-selected:not(.mat-active):not(:hover):not(.mat-option-disabled){color:rgba(0,0,0,.87)}.mat-button,.mat-icon-button{background:0 0}.mat-button.mat-primary .mat-button-focus-overlay,.mat-icon-button.mat-primary .mat-button-focus-overlay{background-color:rgba(0,114,255,.12)}.mat-button.mat-accent .mat-button-focus-overlay,.mat-icon-button.mat-accent .mat-button-focus-overlay{background-color:rgba(255,193,37,.12)}.mat-button.mat-warn .mat-button-focus-overlay,.mat-icon-button.mat-warn .mat-button-focus-overlay{background-color:rgba(244,67,54,.12)}.mat-button[disabled] .mat-button-focus-overlay,.mat-icon-button[disabled] .mat-button-focus-overlay{background-color:transparent}.mat-button.mat-primary,.mat-icon-button.mat-primary{color:#0072ff}.mat-button.mat-accent,.mat-icon-button.mat-accent{color:#ffc125}.mat-button.mat-warn,.mat-icon-button.mat-warn{color:#f44336}.mat-button.mat-accent[disabled],.mat-button.mat-primary[disabled],.mat-button.mat-warn[disabled],.mat-button[disabled][disabled],.mat-icon-button.mat-accent[disabled],.mat-icon-button.mat-primary[disabled],.mat-icon-button.mat-warn[disabled],.mat-icon-button[disabled][disabled]{color:rgba(0,0,0,.38)}.mat-fab,.mat-mini-fab,.mat-raised-button{color:rgba(0,0,0,.87);background-color:#fff}.mat-fab.mat-accent,.mat-fab.mat-primary,.mat-fab.mat-warn,.mat-mini-fab.mat-accent,.mat-mini-fab.mat-primary,.mat-mini-fab.mat-warn,.mat-raised-button.mat-accent,.mat-raised-button.mat-primary,.mat-raised-button.mat-warn{color:#fff}.mat-fab.mat-accent[disabled],.mat-fab.mat-primary[disabled],.mat-fab.mat-warn[disabled],.mat-fab[disabled][disabled],.mat-mini-fab.mat-accent[disabled],.mat-mini-fab.mat-primary[disabled],.mat-mini-fab.mat-warn[disabled],.mat-mini-fab[disabled][disabled],.mat-raised-button.mat-accent[disabled],.mat-raised-button.mat-primary[disabled],.mat-raised-button.mat-warn[disabled],.mat-raised-button[disabled][disabled]{color:rgba(0,0,0,.38);background-color:rgba(0,0,0,.12)}.mat-fab.mat-primary,.mat-mini-fab.mat-primary,.mat-raised-button.mat-primary{background-color:#0072ff}.mat-fab.mat-accent,.mat-mini-fab.mat-accent,.mat-raised-button.mat-accent{background-color:#ffc125}.mat-fab.mat-warn,.mat-mini-fab.mat-warn,.mat-raised-button.mat-warn{background-color:#f44336}.mat-fab.mat-accent .mat-ripple-element,.mat-fab.mat-primary .mat-ripple-element,.mat-fab.mat-warn .mat-ripple-element,.mat-mini-fab.mat-accent .mat-ripple-element,.mat-mini-fab.mat-primary .mat-ripple-element,.mat-mini-fab.mat-warn .mat-ripple-element,.mat-raised-button.mat-accent .mat-ripple-element,.mat-raised-button.mat-primary .mat-ripple-element,.mat-raised-button.mat-warn .mat-ripple-element{background-color:rgba(255,255,255,.2)}.mat-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.1)}.mat-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.1)}.mat-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.1)}.mat-icon-button.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.2)}.mat-icon-button.mat-accent .mat-ripple-element{background-color:rgba(255,193,37,.2)}.mat-icon-button.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.2)}.mat-button-toggle{color:rgba(0,0,0,.38)}.mat-button-toggle.cdk-focused .mat-button-toggle-focus-overlay{background-color:rgba(0,0,0,.06)}.mat-button-toggle-checked{background-color:#e0e0e0;color:rgba(0,0,0,.54)}.mat-button-toggle-disabled{background-color:#eee;color:rgba(0,0,0,.38)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:#bdbdbd}.mat-card{background:#fff;color:rgba(0,0,0,.87)}.mat-card-subtitle{color:rgba(0,0,0,.54)}.mat-checkbox-frame{border-color:rgba(0,0,0,.54)}.mat-checkbox-checkmark{fill:#fafafa}.mat-checkbox-checkmark-path{stroke:#fafafa!important}.mat-checkbox-mixedmark{background-color:#fafafa}.mat-checkbox-checked.mat-primary .mat-checkbox-background,.mat-checkbox-indeterminate.mat-primary .mat-checkbox-background{background-color:#0072ff}.mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#ffc125}.mat-checkbox-checked.mat-warn .mat-checkbox-background,.mat-checkbox-indeterminate.mat-warn .mat-checkbox-background{background-color:#f44336}.mat-checkbox-disabled.mat-checkbox-checked .mat-checkbox-background,.mat-checkbox-disabled.mat-checkbox-indeterminate .mat-checkbox-background{background-color:#b0b0b0}.mat-checkbox-disabled:not(.mat-checkbox-checked) .mat-checkbox-frame{border-color:#b0b0b0}.mat-checkbox-disabled .mat-checkbox-label{color:#b0b0b0}.mat-checkbox:not(.mat-checkbox-disabled).mat-primary .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-accent .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-checkbox:not(.mat-checkbox-disabled).mat-warn .mat-checkbox-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-chip:not(.mat-basic-chip){background-color:#e0e0e0;color:rgba(0,0,0,.87)}.mat-chip:not(.mat-basic-chip) .mat-chip-remove{color:rgba(0,0,0,.87);opacity:.4}.mat-chip:not(.mat-basic-chip) .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-primary{background-color:#0072ff;color:#fff}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-primary .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-warn{background-color:#f44336;color:#fff}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-warn .mat-chip-remove:hover{opacity:.54}.mat-chip.mat-chip-selected.mat-accent{background-color:#ffc125;color:#fff}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove{color:#fff;opacity:.4}.mat-chip.mat-chip-selected.mat-accent .mat-chip-remove:hover{opacity:.54}.mat-table{background:#fff}.mat-header-row,.mat-row{border-bottom-color:rgba(0,0,0,.12)}.mat-header-cell{color:rgba(0,0,0,.54)}.mat-cell{color:rgba(0,0,0,.87)}.mat-datepicker-content{background-color:#fff;color:rgba(0,0,0,.87)}.mat-calendar-arrow{border-top-color:rgba(0,0,0,.54)}.mat-calendar-next-button,.mat-calendar-previous-button{color:rgba(0,0,0,.54)}.mat-calendar-table-header{color:rgba(0,0,0,.38)}.mat-calendar-table-header-divider::after{background:rgba(0,0,0,.12)}.mat-calendar-body-label{color:rgba(0,0,0,.54)}.mat-calendar-body-cell-content{color:rgba(0,0,0,.87);border-color:transparent}.mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:rgba(0,0,0,.38)}.cdk-keyboard-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),.cdk-program-focused .mat-calendar-body-active>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected),:not(.mat-calendar-body-disabled):hover>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background-color:rgba(0,0,0,.04)}.mat-calendar-body-selected{background-color:#0072ff;color:#fff}.mat-calendar-body-disabled>.mat-calendar-body-selected{background-color:rgba(0,114,255,.4)}.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.38)}.mat-calendar-body-today.mat-calendar-body-selected{-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.mat-calendar-body-disabled>.mat-calendar-body-today:not(.mat-calendar-body-selected){border-color:rgba(0,0,0,.18)}.mat-dialog-container,.mat-expansion-panel{background:#fff;color:rgba(0,0,0,.87)}.mat-action-row{border-top-color:rgba(0,0,0,.12)}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.mat-expansion-panel-header-title{color:rgba(0,0,0,.87)}.mat-expansion-indicator::after,.mat-expansion-panel-header-description{color:rgba(0,0,0,.54)}.mat-expansion-panel-header[aria-disabled=true]{color:rgba(0,0,0,.38)}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title{color:inherit}.mat-form-field-label,.mat-hint{color:rgba(0,0,0,.54)}.mat-focused .mat-form-field-label{color:#0072ff}.mat-focused .mat-form-field-label.mat-accent{color:#ffc125}.mat-focused .mat-form-field-label.mat-warn{color:#f44336}.mat-focused .mat-form-field-required-marker{color:#ffc125}.mat-form-field-underline{background-color:rgba(0,0,0,.42)}.mat-form-field-disabled .mat-form-field-underline{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.42)),color-stop(33%,rgba(0,0,0,.42)),color-stop(0,transparent));background-image:linear-gradient(to right,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 1px;background-repeat:repeat-x}.mat-form-field-ripple{background-color:#0072ff}.mat-form-field-ripple.mat-accent{background-color:#ffc125}.mat-form-field-ripple.mat-warn{background-color:#f44336}.mat-form-field-invalid .mat-form-field-label,.mat-form-field-invalid .mat-form-field-label .mat-form-field-required-marker,.mat-form-field-invalid .mat-form-field-label.mat-accent{color:#f44336}.mat-form-field-invalid .mat-form-field-ripple{background-color:#f44336}.mat-error{color:#f44336}.mat-icon.mat-primary{color:#0072ff}.mat-icon.mat-accent{color:#ffc125}.mat-icon.mat-warn{color:#f44336}.mat-input-element:disabled{color:rgba(0,0,0,.38)}.mat-input-element{caret-color:#0072ff}.mat-input-element::-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-moz-placeholder{color:rgba(0,0,0,.42)}.mat-input-element::-webkit-input-placeholder{color:rgba(0,0,0,.42)}.mat-input-element:-ms-input-placeholder{color:rgba(0,0,0,.42)}.mat-accent .mat-input-element{caret-color:#ffc125}.mat-form-field-invalid .mat-input-element,.mat-warn .mat-input-element{caret-color:#f44336}.mat-list .mat-list-item,.mat-list .mat-list-option,.mat-nav-list .mat-list-item,.mat-nav-list .mat-list-option,.mat-selection-list .mat-list-item,.mat-selection-list .mat-list-option{color:rgba(0,0,0,.87)}.mat-list .mat-subheader,.mat-nav-list .mat-subheader,.mat-selection-list .mat-subheader{font-family:Roboto,"Helvetica Neue",sans-serif;font-size:14px;font-weight:500;color:rgba(0,0,0,.54)}.mat-list-item-disabled{background-color:#eee}.mat-divider{border-top-color:rgba(0,0,0,.12)}.mat-nav-list .mat-list-item{outline:0}.mat-nav-list .mat-list-item.mat-list-item-focus,.mat-nav-list .mat-list-item:hover{background:rgba(0,0,0,.04)}.mat-list-option{outline:0}.mat-list-option.mat-list-item-focus,.mat-list-option:hover{background:rgba(0,0,0,.04)}.mat-menu-panel{background:#fff}.mat-menu-item{background:0 0;color:rgba(0,0,0,.87)}.mat-menu-item[disabled]{color:rgba(0,0,0,.38)}.mat-menu-item .mat-icon:not([color]),.mat-menu-item-submenu-trigger::after{color:rgba(0,0,0,.54)}.mat-menu-item-highlighted:not([disabled]),.mat-menu-item:focus:not([disabled]),.mat-menu-item:hover:not([disabled]){background:rgba(0,0,0,.04)}.mat-paginator{background:#fff}.mat-paginator,.mat-paginator-page-size .mat-select-trigger{color:rgba(0,0,0,.54)}.mat-paginator-decrement,.mat-paginator-increment{border-top:2px solid rgba(0,0,0,.54);border-right:2px solid rgba(0,0,0,.54)}.mat-icon-button[disabled] .mat-paginator-decrement,.mat-icon-button[disabled] .mat-paginator-increment{border-color:rgba(0,0,0,.38)}.mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%2300c3ff%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar-buffer{background-color:#00c3ff}.mat-progress-bar-fill::after{background-color:#0072ff}.mat-progress-bar.mat-accent .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffc125%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-accent .mat-progress-bar-buffer,.mat-progress-bar.mat-accent .mat-progress-bar-fill::after{background-color:#ffc125}.mat-progress-bar.mat-warn .mat-progress-bar-background{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20version%3D%271.1%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20xmlns%3Axlink%3D%27http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%27%20x%3D%270px%27%20y%3D%270px%27%20enable-background%3D%27new%200%200%205%202%27%20xml%3Aspace%3D%27preserve%27%20viewBox%3D%270%200%205%202%27%20preserveAspectRatio%3D%27none%20slice%27%3E%3Ccircle%20cx%3D%271%27%20cy%3D%271%27%20r%3D%271%27%20fill%3D%27%23ffcdd2%27%2F%3E%3C%2Fsvg%3E")}.mat-progress-bar.mat-warn .mat-progress-bar-buffer{background-color:#ffcdd2}.mat-progress-bar.mat-warn .mat-progress-bar-fill::after{background-color:#f44336}.mat-progress-spinner circle,.mat-spinner circle{stroke:#0072ff}.mat-progress-spinner.mat-accent circle,.mat-spinner.mat-accent circle{stroke:#ffc125}.mat-progress-spinner.mat-warn circle,.mat-spinner.mat-warn circle{stroke:#f44336}.mat-radio-outer-circle{border-color:rgba(0,0,0,.54)}.mat-radio-disabled .mat-radio-outer-circle{border-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-inner-circle,.mat-radio-disabled .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,0,0,.38)}.mat-radio-disabled .mat-radio-label-content{color:rgba(0,0,0,.38)}.mat-radio-button.mat-primary.mat-radio-checked .mat-radio-outer-circle{border-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-inner-circle{background-color:#0072ff}.mat-radio-button.mat-primary .mat-radio-ripple .mat-ripple-element{background-color:rgba(0,114,255,.26)}.mat-radio-button.mat-accent.mat-radio-checked .mat-radio-outer-circle{border-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-inner-circle{background-color:#ffc125}.mat-radio-button.mat-accent .mat-radio-ripple .mat-ripple-element{background-color:rgba(255,193,37,.26)}.mat-radio-button.mat-warn.mat-radio-checked .mat-radio-outer-circle{border-color:#f44336}.mat-radio-button.mat-warn .mat-radio-inner-circle{background-color:#f44336}.mat-radio-button.mat-warn .mat-radio-ripple .mat-ripple-element{background-color:rgba(244,67,54,.26)}.mat-select-content,.mat-select-panel-done-animating{background:#fff}.mat-select-value{color:rgba(0,0,0,.87)}.mat-select-placeholder{color:rgba(0,0,0,.42)}.mat-select-disabled .mat-select-value{color:rgba(0,0,0,.38)}.mat-select-arrow{color:rgba(0,0,0,.54)}.mat-select-panel .mat-option.mat-selected:not(.mat-option-multiple){background:rgba(0,0,0,.12)}.mat-form-field.mat-focused.mat-primary .mat-select-arrow{color:#0072ff}.mat-form-field.mat-focused.mat-accent .mat-select-arrow{color:#ffc125}.mat-form-field .mat-select.mat-select-invalid .mat-select-arrow,.mat-form-field.mat-focused.mat-warn .mat-select-arrow{color:#f44336}.mat-form-field .mat-select.mat-select-disabled .mat-select-arrow{color:rgba(0,0,0,.38)}.mat-drawer-container{background-color:#fafafa;color:rgba(0,0,0,.87)}.mat-drawer{background-color:#fff;color:rgba(0,0,0,.87)}.mat-drawer.mat-drawer-push{background-color:#fff}.mat-drawer-backdrop.mat-drawer-shown{background-color:rgba(0,0,0,.6)}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#ffc125}.mat-slide-toggle.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(255,193,37,.5)}.mat-slide-toggle:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle .mat-ripple-element{background-color:rgba(255,193,37,.12)}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#0072ff}.mat-slide-toggle.mat-primary.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(0,114,255,.5)}.mat-slide-toggle.mat-primary:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-primary .mat-ripple-element{background-color:rgba(0,114,255,.12)}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-thumb{background-color:#f44336}.mat-slide-toggle.mat-warn.mat-checked:not(.mat-disabled) .mat-slide-toggle-bar{background-color:rgba(244,67,54,.5)}.mat-slide-toggle.mat-warn:not(.mat-checked) .mat-ripple-element{background-color:rgba(0,0,0,.06)}.mat-slide-toggle.mat-warn .mat-ripple-element{background-color:rgba(244,67,54,.12)}.mat-disabled .mat-slide-toggle-thumb{background-color:#bdbdbd}.mat-disabled .mat-slide-toggle-bar{background-color:rgba(0,0,0,.1)}.mat-slide-toggle-thumb{background-color:#fafafa}.mat-slide-toggle-bar{background-color:rgba(0,0,0,.38)}.mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-primary .mat-slider-thumb,.mat-primary .mat-slider-thumb-label,.mat-primary .mat-slider-track-fill{background-color:#0072ff}.mat-primary .mat-slider-thumb-label-text{color:#fff}.mat-accent .mat-slider-thumb,.mat-accent .mat-slider-thumb-label,.mat-accent .mat-slider-track-fill{background-color:#ffc125}.mat-accent .mat-slider-thumb-label-text{color:#fff}.mat-warn .mat-slider-thumb,.mat-warn .mat-slider-thumb-label,.mat-warn .mat-slider-track-fill{background-color:#f44336}.mat-warn .mat-slider-thumb-label-text{color:#fff}.mat-slider-focus-ring{background-color:rgba(255,193,37,.2)}.cdk-focused .mat-slider-track-background,.mat-slider:hover .mat-slider-track-background{background-color:rgba(0,0,0,.38)}.mat-slider-disabled .mat-slider-thumb,.mat-slider-disabled .mat-slider-track-background,.mat-slider-disabled .mat-slider-track-fill,.mat-slider-disabled:hover .mat-slider-track-background{background-color:rgba(0,0,0,.26)}.mat-slider-min-value .mat-slider-focus-ring{background-color:rgba(0,0,0,.12)}.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing .mat-slider-thumb-label{background-color:rgba(0,0,0,.87)}.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb,.mat-slider-min-value.mat-slider-thumb-label-showing.cdk-focused .mat-slider-thumb-label{background-color:rgba(0,0,0,.26)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing) .mat-slider-thumb{border-color:rgba(0,0,0,.26);background-color:transparent}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover .mat-slider-thumb{border-color:rgba(0,0,0,.38)}.mat-slider-min-value:not(.mat-slider-thumb-label-showing).cdk-focused.mat-slider-disabled .mat-slider-thumb,.mat-slider-min-value:not(.mat-slider-thumb-label-showing):hover.mat-slider-disabled .mat-slider-thumb{border-color:rgba(0,0,0,.26)}.mat-slider-has-ticks .mat-slider-wrapper::after{border-color:rgba(0,0,0,.7)}.mat-slider-horizontal .mat-slider-ticks{background-image:repeating-linear-gradient(to right,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent);background-image:-moz-repeating-linear-gradient(.0001deg,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-slider-vertical .mat-slider-ticks{background-image:repeating-linear-gradient(to bottom,rgba(0,0,0,.7),rgba(0,0,0,.7) 2px,transparent 0,transparent)}.mat-step-header.cdk-keyboard-focused,.mat-step-header.cdk-program-focused,.mat-step-header:hover{background-color:rgba(0,0,0,.04)}.mat-step-header .mat-step-label,.mat-step-header .mat-step-optional{color:rgba(0,0,0,.38)}.mat-step-header .mat-step-icon{background-color:#0072ff;color:#fff}.mat-step-header .mat-step-icon-not-touched{background-color:rgba(0,0,0,.38);color:#fff}.mat-step-header .mat-step-label.mat-step-label-active{color:rgba(0,0,0,.87)}.mat-stepper-horizontal,.mat-stepper-vertical{background-color:#fff}.mat-stepper-vertical-line::before{border-left-color:rgba(0,0,0,.12)}.mat-stepper-horizontal-line{border-top-color:rgba(0,0,0,.12)}.mat-tab-header,.mat-tab-nav-bar{border-bottom:1px solid rgba(0,0,0,.12)}.mat-tab-group-inverted-header .mat-tab-header,.mat-tab-group-inverted-header .mat-tab-nav-bar{border-top:1px solid rgba(0,0,0,.12);border-bottom:none}.mat-tab-label,.mat-tab-link{color:rgba(0,0,0,.87)}.mat-tab-label.mat-tab-disabled,.mat-tab-link.mat-tab-disabled{color:rgba(0,0,0,.38)}.mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.87)}.mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(0,0,0,.38)}.mat-tab-group[class*=mat-background-] .mat-tab-header,.mat-tab-nav-bar[class*=mat-background-]{border-bottom:none;border-top:none}.mat-tab-group.mat-primary .mat-tab-label:focus,.mat-tab-group.mat-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary .mat-ink-bar{background-color:#0072ff}.mat-tab-group.mat-primary.mat-background-primary .mat-ink-bar,.mat-tab-nav-bar.mat-primary.mat-background-primary .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-accent .mat-tab-label:focus,.mat-tab-group.mat-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent .mat-ink-bar{background-color:#ffc125}.mat-tab-group.mat-accent.mat-background-accent .mat-ink-bar,.mat-tab-nav-bar.mat-accent.mat-background-accent .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-warn .mat-tab-label:focus,.mat-tab-group.mat-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn .mat-ink-bar{background-color:#f44336}.mat-tab-group.mat-warn.mat-background-warn .mat-ink-bar,.mat-tab-nav-bar.mat-warn.mat-background-warn .mat-ink-bar{background-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label:focus,.mat-tab-group.mat-background-primary .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-primary .mat-tab-link:focus{background-color:rgba(0,195,255,.3)}.mat-tab-group.mat-background-primary .mat-tab-header,.mat-tab-group.mat-background-primary .mat-tab-links,.mat-tab-nav-bar.mat-background-primary .mat-tab-header,.mat-tab-nav-bar.mat-background-primary .mat-tab-links{background-color:#0072ff}.mat-tab-group.mat-background-primary .mat-tab-label,.mat-tab-group.mat-background-primary .mat-tab-link,.mat-tab-nav-bar.mat-background-primary .mat-tab-label,.mat-tab-nav-bar.mat-background-primary .mat-tab-link{color:#fff}.mat-tab-group.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-primary .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-primary .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-primary .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-primary .mat-ripple-element,.mat-tab-nav-bar.mat-background-primary .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-accent .mat-tab-label:focus,.mat-tab-group.mat-background-accent .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-accent .mat-tab-link:focus{background-color:rgba(255,193,37,.3)}.mat-tab-group.mat-background-accent .mat-tab-header,.mat-tab-group.mat-background-accent .mat-tab-links,.mat-tab-nav-bar.mat-background-accent .mat-tab-header,.mat-tab-nav-bar.mat-background-accent .mat-tab-links{background-color:#ffc125}.mat-tab-group.mat-background-accent .mat-tab-label,.mat-tab-group.mat-background-accent .mat-tab-link,.mat-tab-nav-bar.mat-background-accent .mat-tab-label,.mat-tab-nav-bar.mat-background-accent .mat-tab-link{color:#fff}.mat-tab-group.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-accent .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-accent .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-accent .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-accent .mat-ripple-element,.mat-tab-nav-bar.mat-background-accent .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-tab-group.mat-background-warn .mat-tab-label:focus,.mat-tab-group.mat-background-warn .mat-tab-link:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-label:focus,.mat-tab-nav-bar.mat-background-warn .mat-tab-link:focus{background-color:rgba(255,205,210,.3)}.mat-tab-group.mat-background-warn .mat-tab-header,.mat-tab-group.mat-background-warn .mat-tab-links,.mat-tab-nav-bar.mat-background-warn .mat-tab-header,.mat-tab-nav-bar.mat-background-warn .mat-tab-links{background-color:#f44336}.mat-tab-group.mat-background-warn .mat-tab-label,.mat-tab-group.mat-background-warn .mat-tab-link,.mat-tab-nav-bar.mat-background-warn .mat-tab-label,.mat-tab-nav-bar.mat-background-warn .mat-tab-link{color:#fff}.mat-tab-group.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-group.mat-background-warn .mat-tab-link.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-label.mat-tab-disabled,.mat-tab-nav-bar.mat-background-warn .mat-tab-link.mat-tab-disabled{color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-chevron{border-color:#fff}.mat-tab-group.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron,.mat-tab-nav-bar.mat-background-warn .mat-tab-header-pagination-disabled .mat-tab-header-pagination-chevron{border-color:rgba(255,255,255,.4)}.mat-tab-group.mat-background-warn .mat-ripple-element,.mat-tab-nav-bar.mat-background-warn .mat-ripple-element{background-color:rgba(255,255,255,.12)}.mat-toolbar{background:#f5f5f5;color:rgba(0,0,0,.87)}.mat-toolbar.mat-primary{background:#0072ff;color:#fff}.mat-toolbar.mat-accent{background:#ffc125;color:#fff}.mat-toolbar.mat-warn{background:#f44336;color:#fff}.mat-tooltip{background:rgba(97,97,97,.9)}.mat-snack-bar-container{background:#323232;color:#fff}.mat-simple-snackbar-action{color:#ffc125}@font-face{font-family:Skycoin;font-style:normal;font-weight:300;src:url(Skycoin-Light.770b27ec05c2f97a1a27.woff2) format("woff2"),url(Skycoin-Light.4be01e4a68be8bf590da.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:300;src:url(Skycoin-LightItalic.d10a437db5d8e2a52b4a.woff2) format("woff2"),url(Skycoin-LightItalic.39e68da05bf8b4a77aa2.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:400;src:url(Skycoin-Regular.21b4caaaedc00594e7bd.woff2) format("woff2"),url(Skycoin-Regular.98d953e74f174cf013b4.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:400;src:url(Skycoin-RegularItalic.9eabbc2e01a7e17bb57d.woff2) format("woff2"),url(Skycoin-RegularItalic.9947360f79b09132fd21.woff) format("woff")}@font-face{font-family:Skycoin;font-style:normal;font-weight:700;src:url(Skycoin-Bold.6ccafc6fabc0cc8a971a.woff2) format("woff2"),url(Skycoin-Bold.42363955889f2f20c527.woff) format("woff")}@font-face{font-family:Skycoin;font-style:italic;font-weight:700;src:url(Skycoin-BoldItalic.c414dad20c4e3020221c.woff2) format("woff2"),url(Skycoin-BoldItalic.923dce74069362d168fe.woff) format("woff")}a,body,button,div,h1,h2,h3,h4,h5,h6,mat-option.mat-option,mat-panel-description,mat-panel-title,option,p,select,span{font-family:Skycoin,sans-serif}body{background-color:#f7f7f7;margin:0;padding:0;height:100%}header{background:url(header.e11f7c6852766b9319d6.png) center center/cover,linear-gradient(-155deg,#686e96 0,#373b5c 100%);width:100%;height:300px}mat-dialog-container{border-radius:5px!important}.mat-dialog-container{padding:0!important}.header-container{max-width:848px;text-align:center;padding-top:40px;margin-right:auto;margin-left:auto}.header-container h1{font-size:3em;color:#fff}.button-line{margin-top:40px;text-align:right}.datatable-row-group{cursor:pointer}button.active{background-color:rgba(0,0,0,.12)}mat-spinner.in-button .mat-spinner path{stroke:#000;opacity:.3}snack-bar-container{background-color:rgba(255,0,0,.8)!important}mat-panel-title{width:60%;display:block;-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.sky-container{min-width:100%;min-height:100%}.sky-container.sky-container-grey{background-color:#f7f7f7}.-flex-fill,.flex-fill{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.form-field{margin-bottom:20px}.form-field label{color:#1e2227;display:block;font-size:13px;line-height:20px;margin-bottom:2px}.form-field input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.form-field select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-field textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.primary button.enabled,.primary-gradient-background{background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.primary button.enabled span,.primary-gradient-background span{color:#fff}.primary-color{color:#0072ff}.secondary-color{color:#ffc125}.no-opacity{opacity:1!important}.light-opacity{opacity:.2}.rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}mat-spinner.in-button svg{height:24px!important;width:24px!important}.empty-row{padding:0 1.2rem!important;line-height:50px!important}.onboarding-container{width:100%;height:100%;overflow-x:hidden;background:#0072ff;background:-webkit-gradient(linear,left top,right bottom,from(#0072ff),to(#00c3ff));background:linear-gradient(to bottom right,#0072ff,#00c3ff)}.onboarding-container label{color:#fff}.onboarding-container input{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.onboarding-container select{background-color:#fff;border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%;-webkit-appearance:none}.onboarding-container textarea{border:2px solid rgba(0,0,0,.05);border-radius:6px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;line-height:20px;padding:10px;width:100%}.dark button.enabled{background-color:#171a1d!important}.dark button.enabled span{color:#fff}.ghost button.enabled{background-color:transparent!important}.ghost button.enabled span{color:#000}.-select{position:relative}.-select::after{content:'';display:block;position:absolute;top:0;right:0;background:url(/assets/img/chevron-right-grey.png) 0 0/32px 32px no-repeat;width:32px;height:32px;margin:6px;pointer-events:none;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.mat-menu-panel{border-radius:5px!important;background-color:#fefefe}.mat-menu-panel .mat-menu-item{font-family:Skycoin;line-height:50px}.mat-menu-panel.compact .mat-menu-item{font-size:13px;height:35px;line-height:35px}.qr-code-button{opacity:.6;cursor:pointer}.qr-code-button:hover{opacity:1} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e-proxy.config.js b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e-proxy.config.js new file mode 100755 index 0000000..2c7ad44 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e-proxy.config.js @@ -0,0 +1,14 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:46420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:46420'; + req.headers["referer"] = 'http://127.0.0.1:46420'; + req.headers["origin"] = 'http://127.0.0.1:46420'; + } + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts new file mode 100755 index 0000000..672aaae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.e2e-spec.ts @@ -0,0 +1,44 @@ +import { OnboardingCreatePage } from './onboarding.po'; + +describe('Onboarding', () => { + const page = new OnboardingCreatePage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Create Wallet'); + }); + + it('should load wallet', () => { + expect(page.loadWallet()).toEqual(true); + }); + + it('should create wallet', () => { + expect(page.createWallet()).toEqual(true); + }); + + it('should show safeguard', () => { + expect(page.getSafeguardIsShown()).toEqual(true); + }); + + it('should hide accepted safeguard', () => { + expect(page.acceptSafeguard()).toEqual(false); + }); + + it('should be able to go back from wallet encryption', () => { + expect(page.goBack()).toEqual('Create Wallet'); + page.createWallet(); + page.acceptSafeguard(); + }); + + it('should encrypt wallet by default', () => { + expect(page.getEncryptWalletCheckbox().isSelected()).toBeTruthy(); + }); + + it('should be able to continue without encryption', () => { + expect(page.canContinueWithoutEncryption()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.encryptWallet()).toEqual(true); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.po.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.po.ts new file mode 100755 index 0000000..dadf6cc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/onboarding.po.ts @@ -0,0 +1,93 @@ +import { browser, by, element } from 'protractor'; + +export class OnboardingCreatePage { + navigateTo() { + return browser.get('/#/wizard'); + } + + getHeaderText() { + return element(by.css('.-header span')).getText(); + } + + getSafeguardIsShown() { + return element(by.css('app-onboarding-safeguard')).isPresent(); + } + + acceptSafeguard() { + return element.all(by.css('.mat-checkbox-label')).first().click().then(() => { + return element(by.buttonText('Continue')).click().then(() => { + return this.getSafeguardIsShown(); + }); + }); + } + + createWallet() { + element(by.buttonText('New')).click(); + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const confirm = element(by.css('[formcontrolname="confirm_seed"]')); + const btnCreate = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test onboarding wallet'); + seed.clear(); + seed.sendKeys('test test'); + confirm.clear(); + confirm.sendKeys('test test'); + + return btnCreate.isEnabled().then(status => { + if (status) { + btnCreate.click(); + } + + return status; + }); + } + + loadWallet() { + element(by.buttonText('Load')).click(); + + const label = element(by.css('[formcontrolname="label"]')); + const seed = element(by.css('[formcontrolname="seed"]')); + const btnLoad = element(by.buttonText('Create')); + + label.clear(); + label.sendKeys('Test wallet'); + seed.clear(); + seed.sendKeys('test test'); + + return btnLoad.isEnabled(); + } + + goBack() { + return element(by.buttonText('Back')).click().then(() => { + return this.getHeaderText(); + }); + } + + getEncryptWalletCheckbox() { + return element(by.css('.mat-checkbox-input')); + } + + canContinueWithoutEncryption() { + return element(by.css('.mat-checkbox-label')).click().then(() => { + return element(by.buttonText('Finish')).isEnabled(); + }); + } + + encryptWallet() { + const password = element(by.css('[formcontrolname="password"]')); + const confirm = element(by.css('[formcontrolname="confirm"]')); + const button = element(by.buttonText('Finish')); + + return element(by.css('.mat-checkbox-label')).click().then(() => { + password.clear(); + password.sendKeys('password'); + confirm.clear(); + confirm.sendKeys('password'); + + return button.isEnabled(); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.e2e-spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.e2e-spec.ts new file mode 100755 index 0000000..63f7028 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.e2e-spec.ts @@ -0,0 +1,38 @@ +import { SendPage } from './send.po'; + +describe('Send', () => { + const page = new SendPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should have wallets', () => { + expect(page.getWalletsCount()).toBeGreaterThan(0); + }); + + it('should have coins in wallets', () => { + expect(page.getWalletsWithCoins().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should have wallets enabled', () => { + expect(page.getValidWallets().then(w => w.length)).toBeGreaterThan(0); + }); + + it('should select valid wallet', () => { + expect(page.selectValidWallet()).toBeTruthy(); + }); + + it('should not be able to send with wrong amount', () => { + expect(page.fillFormWithCoins('615701')).toBeFalsy(); + expect(page.fillFormWithCoins('0')).toBeFalsy(); + expect(page.fillFormWithCoins('-1')).toBeFalsy(); + expect(page.fillFormWithCoins('a')).toBeFalsy(); + }); + + it('should be able to send with correct amount', () => { + expect(page.fillFormWithCoins('615700')).toBeTruthy(); + expect(page.fillFormWithCoins('1')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.po.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.po.ts new file mode 100755 index 0000000..e1b136d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/send.po.ts @@ -0,0 +1,68 @@ +import { browser, by, element } from 'protractor'; + +export class SendPage { + navigateTo() { + return browser.get('/#/send'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getWalletsCount() { + return element.all(by.css('#wallet option')).count(); + } + + getWalletsWithCoins() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return this.getCoinsFromOptionString(v) > 0; + }); + }); + } + + getValidWallets() { + return element.all(by.tagName('#wallet option')) + .filter((opt) => { + return opt.getText().then((v) => { + return opt.getAttribute('disabled').then(status => { + return status === null && this.getCoinsFromOptionString(v) > 0; + }); + }); + }); + } + + selectValidWallet() { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return true; + }); + }); + } + + fillFormWithCoins(coins: string) { + const dest = element(by.css('[formcontrolname="address"]')); + const amount = element(by.css('[formcontrolname="amount"]')); + const btnSend = element(by.buttonText('Send')); + + dest.clear(); + amount.clear(); + + return dest.sendKeys('2e1erPpaxNVC37PkEv3n8PESNw2DNr5aJNy').then(() => { + return this.getValidWallets().then(wallets => { + return wallets[0].click().then(() => { + return amount.sendKeys(coins).then(() => { + return btnSend.isEnabled(); + }); + }); + }); + }); + } + + private getCoinsFromOptionString(option: string) { + const value = option.slice(option.indexOf('-') + 1, option.indexOf(' SKY')); + + return parseFloat(value); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts new file mode 100755 index 0000000..0d14695 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.e2e-spec.ts @@ -0,0 +1,22 @@ +import { TransactionsPage } from './transactions.po'; + +describe('Transactions', () => { + const page = new TransactionsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Transactions'); + }); + + it('should contain transactions', () => { + expect(page.getTransactionsCount()).toBeGreaterThan(0); + }); + + it('should show transaction detail modal', () => { + expect(page.showTransactionsModal()).toBeTruthy(); + }); + + it('should hide transaction detail modal', () => { + expect(page.hideTransactionModal()).toBeFalsy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.po.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.po.ts new file mode 100755 index 0000000..c0faa27 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/transactions.po.ts @@ -0,0 +1,37 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class TransactionsPage { + navigateTo() { + return browser.get('/#/transactions'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + getTransactions() { + return element.all(by.css('.-transaction')); + } + + getTransactionsCount() { + return this.getTransactions().count(); + } + + getTransactionDetailIsShow() { + return element(by.css('app-transaction-detail')).isPresent(); + } + + showTransactionsModal() { + return this.getTransactions().first().click().then(() => { + return this.getTransactionDetailIsShow(); + }); + } + + hideTransactionModal() { + const el = element(by.css('app-transaction-detail .-header img')); + + return browser.wait(protractor.ExpectedConditions.visibilityOf(el), 5000).then(() => el.click().then(() => { + return this.getTransactionDetailIsShow(); + })); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/tsconfig.e2e.json b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/tsconfig.e2e.json new file mode 100755 index 0000000..1d9e5ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts new file mode 100755 index 0000000..82384d5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.e2e-spec.ts @@ -0,0 +1,90 @@ +import { WalletsPage } from './wallets.po'; + +describe('Wallets', () => { + const page = new WalletsPage(); + + it('should display title', () => { + page.navigateTo(); + expect(page.getHeaderText()).toEqual('Wallets'); + }); + + it('should show create wallet', () => { + expect(page.showAddWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Create Wallet'); + }); + + it('should validate create wallet, seed mismatch', () => { + expect(page.fillWalletForm('Test', 'seed', 'seed2')).toEqual(false); + }); + + it('should validate create wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', 'seed')).toEqual(false); + }); + + it('should create wallet', () => { + expect(page.fillWalletForm('Test create wallet', 'test create wallet', 'test create wallet')).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should show load wallet', () => { + expect(page.showLoadWallet()).toEqual(true); + expect(page.getWalletModalTitle()).toEqual('Load Wallet'); + }); + + it('should validate load wallet, seed', () => { + expect(page.fillWalletForm('Test', '', null)).toEqual(false); + }); + + it('should validate load wallet, empty label', () => { + expect(page.fillWalletForm('', 'seed', null)).toEqual(false); + }); + + it('should load wallet', () => { + expect(page.fillWalletForm('Test load wallet', 'test load wallet', null)).toEqual(true); + page.waitForWalletToBeCreated(); + }); + + it('should expand wallet', () => { + expect(page.expandWallet()).toEqual(true); + }); + + it('should show wallet QR modal', () => { + expect(page.showQrDialog()).toEqual(true); + }); + + it('should hide wallet QR modal', () => { + expect(page.hideQrDialog()).toEqual(false); + }); + + it('should add address to wallet', () => { + expect(page.addAddress()).toEqual(true); + }); + + it('should hide empty address', () => { + expect(page.getCountOfEmptyAddresses('.-hide-empty')).toEqual(0); + }); + + it('should show empty address', () => { + expect(page.getCountOfEmptyAddresses('.-show-empty')).toBeGreaterThan(0); + }); + + it('should show change wallet name modal', () => { + expect(page.showChangeWalletName()).toEqual(true); + }); + + it('should change wallet name', () => { + expect(page.changeWalletName()).toEqual(true); + }); + + it('should encrypt wallet', () => { + expect(page.canEncrypt()).toEqual(true); + }); + + it('should decrypt wallet', () => { + expect(page.canDecrypt()).toEqual(true); + }); + + it('should display price information', () => { + expect(page.showPriceInformation()).toEqual(true); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.po.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.po.ts new file mode 100755 index 0000000..969b8b2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/e2e/wallets.po.ts @@ -0,0 +1,186 @@ +import { browser, by, element, protractor } from 'protractor'; + +export class WalletsPage { + navigateTo() { + return browser.get('/#/wallets'); + } + + getHeaderText() { + return element(by.css('.title')).getText(); + } + + showAddWallet() { + const btnAdd = element(by.buttonText('Add Wallet')); + + return btnAdd.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + showLoadWallet() { + const btnLoad = element(by.buttonText('Load Wallet')); + + return btnLoad.click().then(() => { + return element(by.css('app-create-wallet')).isPresent(); + }); + } + + getWalletModalTitle() { + return element(by.css('app-create-wallet .-header')).getText(); + } + + fillWalletForm(label: string, seed: string, confirm: string|null) { + const labelEl = element(by.css('[formcontrolname="label"]')); + const seedEl = element(by.css('[formcontrolname="seed"]')); + const btn = element(by.buttonText(confirm ? 'Create' : 'Load')); + const encrypt = element(by.css('.mat-checkbox-label')); + + encrypt.click(); + labelEl.clear(); + seedEl.clear(); + labelEl.sendKeys(label); + seedEl.sendKeys(seed); + + if (confirm) { + const confirmEl = element(by.css('[formcontrolname="confirm_seed"]')); + confirmEl.clear(); + confirmEl.sendKeys(confirm); + } + + return btn.isEnabled().then(status => { + if (status) { + btn.click(); + } + + return status; + }); + } + + expandWallet() { + return this.getWalletWithName('Test create wallet').click().then(() => { + return element(by.css('app-wallet-detail')).isPresent(); + }); + } + + showQrDialog() { + return browser.sleep(1000).then(() => element(by.css('.qr-code-button')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + hideQrDialog() { + return browser.sleep(1000).then(() => element(by.css('app-modal .-header img')).click().then(() => { + return element(by.css('app-qr-code')).isPresent(); + })); + } + + addAddress() { + return element.all(by.css('.-detail')).count().then(originalCount => { + return element(by.css('.-new-address')).click().then(() => { + return browser.sleep(2000).then(() => { + return element.all(by.css('.-detail')).count().then(newCount => { + return newCount > originalCount; + }); + }); + }); + }); + } + + getCountOfEmptyAddresses(clickSelector: string) { + return element(by.css(clickSelector)).click().then(() => { + return element.all(by.css('.-detail > div:nth-child(3)')).filter((address) => { + return address.getText().then(value => { + return value === '0'; + }); + }).count(); + }); + } + + showChangeWalletName() { + return element(by.css('.-edit-wallet')).click().then(() => { + return element(by.css('app-change-name')).isPresent(); + }); + } + + changeWalletName() { + const label = element(by.css('[formcontrolname="label"]')); + const btn = element(by.buttonText('Rename')); + + return label.clear().then(() => { + return label.sendKeys('New Wallet Name').then(() => { + return btn.click().then(() => { + return browser.sleep(1000).then(() => { + return this.getWalletWithName('New Wallet Name').isPresent(); + }); + }); + }); + }); + } + + canEncrypt() { + return element(by.css('.-enable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const p2 = element(by.css('[formcontrolname="confirm_password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.sendKeys('password'); + p2.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not encrypt wallet', + ).then(() => { + return element(by.css('.-disable-encryption')).isPresent(); + }); + }); + }); + } + + canDecrypt() { + return element(by.css('.-disable-encryption')).click().then(() => { + const p1 = element(by.css('[formcontrolname="password"]')); + const btn = element(by.buttonText('Proceed')); + + p1.clear(); + p1.sendKeys('password'); + + return btn.click().then(() => { + return browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-password-dialog'))), + 30000, + 'Can not decrypt wallet', + ).then(() => { + return element(by.css('.-enable-encryption')).isPresent(); + }); + }); + }); + } + + showPriceInformation() { + return element(by.css('.balance p.dollars')).getText().then(text => { + return this.checkHeaderPriceFormat(text); + }); + } + + waitForWalletToBeCreated() { + browser.wait( + protractor.ExpectedConditions.stalenessOf(element(by.css('app-create-wallet'))), + 10000, + 'Wallet was not created', + ); + } + + private getWalletWithName(name: string) { + return element.all(by.css('.-table.ng-star-inserted')) + .filter(wallet => wallet.element(by.css('.-label')).getText().then(text => text === name)) + .first(); + } + + private checkHeaderPriceFormat(price: string) { + const reg = /^\$[0-9,]+.[0-9]{2}\s\(\$[0-9,]+.[0-9]{2}\)$/; + + return !!price.match(reg); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/karma.conf.js b/vendor/github.com/skycoin/skycoin/src/gui/static/karma.conf.js new file mode 100755 index 0000000..4d9ab9d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/package-lock.json b/vendor/github.com/skycoin/skycoin/src/gui/static/package-lock.json new file mode 100755 index 0000000..b7953b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/package-lock.json @@ -0,0 +1,11225 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/build-optimizer": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.3.2.tgz", + "integrity": "sha512-U0BCZtThq5rUfY08shHXpxe8ZhSsiYB/cJjUvAWRTs/ORrs8pbngS6xwseQws8d/vHoVrtqGD9GU9h8AmFRERQ==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.7", + "typescript": "2.6.2", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.3.2.tgz", + "integrity": "sha512-zABk/iP7YX5SVbmK4e+IX7j2d0D37MQJQiKgWdV3JzfvVJhNJzddiirtT980pIafoq+KyvTgVwXtc+vnux0oeQ==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "chokidar": "1.7.0", + "rxjs": "5.5.6", + "source-map": "0.5.7" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "@angular-devkit/schematics": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.3.2.tgz", + "integrity": "sha512-B6zZoqvHaTJy+vVdA6EtlxnCdGMa5elCa4j9lQLC3JI8DLvMXUWkCIPVbPzJ/GSRR9nsKWpvYMYaJyfBDUqfhw==", + "dev": true, + "requires": { + "@ngtools/json-schema": "1.2.0", + "rxjs": "5.5.6" + } + }, + "@angular/animations": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.0.tgz", + "integrity": "sha512-JLR42YHiJppO4ruAkFxgbzghUDtHkXHkKPM8udd2qyt16T7e1OX7EEOrrmldUu59CC56tZnJ/32p4SrYmxyBSA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/cdk": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.4.tgz", + "integrity": "sha512-6IKDOhDrfKdywTZNTWZbM1O8Q3cTi7uIOAyFC9sXitg0JUy2SHms0UY9FdW32BABIsZp692ofMCMdMPjHDjwwA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/cli": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.7.3.tgz", + "integrity": "sha512-19sh0SbjneG7/R/FvZBfHsHqfIqyj4LQuXdddJKMCDM97UoHQTjfgrpRvBf3a3lR79wdLXchWJBD9Yc6ifosEA==", + "dev": true, + "requires": { + "@angular-devkit/build-optimizer": "0.3.2", + "@angular-devkit/core": "0.3.2", + "@angular-devkit/schematics": "0.3.2", + "@ngtools/json-schema": "1.2.0", + "@ngtools/webpack": "1.10.2", + "@schematics/angular": "0.3.2", + "@schematics/package-update": "0.3.2", + "ajv": "6.2.1", + "autoprefixer": "7.2.6", + "cache-loader": "1.2.2", + "chalk": "2.2.2", + "circular-dependency-plugin": "4.4.0", + "clean-css": "4.1.11", + "common-tags": "1.7.2", + "copy-webpack-plugin": "4.4.3", + "core-object": "3.1.5", + "denodeify": "1.2.1", + "ember-cli-string-utils": "1.1.0", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.11", + "fs-extra": "4.0.3", + "glob": "7.1.2", + "html-webpack-plugin": "2.30.1", + "istanbul-instrumenter-loader": "3.0.0", + "karma-source-map-support": "1.2.0", + "less": "2.7.3", + "less-loader": "4.0.6", + "license-webpack-plugin": "1.2.3", + "loader-utils": "1.1.0", + "lodash": "4.17.4", + "memory-fs": "0.4.1", + "minimatch": "3.0.4", + "node-modules-path": "1.0.1", + "node-sass": "4.7.2", + "nopt": "4.0.1", + "opn": "5.1.0", + "portfinder": "1.0.13", + "postcss": "6.0.19", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.1", + "postcss-url": "7.3.1", + "raw-loader": "0.5.1", + "resolve": "1.5.0", + "rxjs": "5.5.6", + "sass-loader": "6.0.7", + "semver": "5.4.1", + "silent-error": "1.1.0", + "source-map-support": "0.4.18", + "style-loader": "0.19.1", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "uglifyjs-webpack-plugin": "1.2.2", + "url-loader": "0.6.2", + "webpack": "3.11.0", + "webpack-dev-middleware": "1.12.2", + "webpack-dev-server": "2.11.2", + "webpack-merge": "4.1.2", + "webpack-sources": "1.1.0", + "webpack-subresource-integrity": "1.0.4" + } + }, + "@angular/common": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.0.tgz", + "integrity": "sha512-yMFn2isC7/XOs56/2Kzzbb1AASHiwipAPOVFtKe7TdZQClO8fJXwCnk326rzr615+CG0eSBNQWeiFGyWN2riBA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/compiler": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.0.tgz", + "integrity": "sha512-RfYa4ESgjGX0T0ob/Xz00IF7nd2xZkoyRy6oKgL82q42uzB3xZUDMrFNgeGxAUs3H22IkL46/5SSPOMOTMZ0NA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/compiler-cli": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.0.tgz", + "integrity": "sha512-+Kef4NjuHwLj2hRPdVo4yAtPmv+kn0Nu/ShmKfaEK4mt9aaQMFxKNt6beUuDK5iUPMB5nuTCZ4bqEFpqd+EtxQ==", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "minimist": "1.2.0", + "reflect-metadata": "0.1.10", + "tsickle": "0.26.0" + } + }, + "@angular/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.0.tgz", + "integrity": "sha512-s2ne45DguNUubhC1YgybGECC4Tyx3G4EZCntUiRMDWWkmKXSK+6dgHMesyDo8R5Oat8VfN4Anf8l3JHS1He8kg==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/forms": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.0.tgz", + "integrity": "sha512-g1/SF9lY0ZwzJ0w4NXbFsTGGEuUdgtaZny8DmkaqtmA7idby3FW398X0tv25KQfVYKtL+p9Jp1Y8EI0CvrIsvw==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/http": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.0.tgz", + "integrity": "sha512-V5Cl24dP3rCXTTQvDc0TIKoWqBRAa0DWAQbtr7iuDAt5a1vPGdKz5K1sEiiV6ziwX6gzjiwHjUvL+B+WbIUrQA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/language-service": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.0.tgz", + "integrity": "sha512-Yj/y5XrBBXbtwnZ6HJOBl/0XS/JBvVlHb1UWw5MIrsc81k7/eFiRAIKzmGpAba+Sw0G0dO22ABZ4yJjAMsML6A==", + "dev": true + }, + "@angular/material": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.4.tgz", + "integrity": "sha512-xrGYPHOlNXpPkventLAvZyTjfCo2A8ZfdyJEHNR4LhFWIjw3ilwb1ihNv4dy/qG56g8L4AwQ2cONxQ0YyZfcWg==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/platform-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.0.tgz", + "integrity": "sha512-c6cR15MfopPwGZ097HdRuAi9+R9BhA3bRRFpP2HmrSSB/BW4ZNovUYwB2QUMSYbd9s0lYTtnavqGm6DKcyF2QA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.0.tgz", + "integrity": "sha512-xG1eNoi8sm4Jcly2y98r5mqYVe3XV8sUJCtOhvGBYtvt4dKEQ5tOns6fWQ0nUbl6Vv3Y0xgGUS1JCtfut3DuaQ==", + "requires": { + "tslib": "1.8.1" + } + }, + "@angular/router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.0.tgz", + "integrity": "sha512-VXDXtp2A1GQEUEhXg0ZzqHdTUERLgDSo3/Mmpzt+dgLMKlXDSCykcm4gINwE5VQLGD1zQvDFCCRv3seGRNfrqA==", + "requires": { + "tslib": "1.8.1" + } + }, + "@ngtools/json-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/json-schema/-/json-schema-1.2.0.tgz", + "integrity": "sha512-pMh+HDc6mOjUO3agRfB1tInimo7hf67u+0Cska2bfXFe6oU7rSMnr5PLVtiZVgwMoBHpx/6XjBymvcnWPo2Uzg==", + "dev": true + }, + "@ngtools/webpack": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.2.tgz", + "integrity": "sha512-3u2zg2rarG3qNLSukBClGADWuq/iNn5SQtlSeAbfKzwBeyLGbF0gN1z1tVx1Bcr8YwFzR6NdRePQmJGcoqq1fg==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "magic-string": "0.22.4", + "semver": "5.4.1", + "source-map": "0.5.7", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + } + }, + "@ngx-translate/core": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.1.1.tgz", + "integrity": "sha1-rhA5KINrip4Gn9Li52+iGYzH5ig=" + }, + "@schematics/angular": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.3.2.tgz", + "integrity": "sha512-Elrk0BA951s0ScFZU0AWrpUeJBYVR52DZ1QTIO5R0AhwEd1PW4olI8szPLGQlVW5Sd6H0FA/fyFLIvn2r9v6Rw==", + "dev": true, + "requires": { + "typescript": "2.6.2" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@schematics/package-update": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@schematics/package-update/-/package-update-0.3.2.tgz", + "integrity": "sha512-7aVP4994Hu8vRdTTohXkfGWEwLhrdNP3EZnWyBootm5zshWqlQojUGweZe5zwewsKcixeVOiy2YtW+aI4aGSLA==", + "dev": true, + "requires": { + "rxjs": "5.5.6", + "semver": "5.4.1", + "semver-intersect": "1.3.1" + } + }, + "@types/jasmine": { + "version": "2.5.54", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", + "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "dev": true, + "requires": { + "@types/jasmine": "2.5.54" + } + }, + "@types/node": { + "version": "6.0.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.96.tgz", + "integrity": "sha512-fsOOY6tMQ3jCB2wD51XFDmmpgm4wVKkJECdcVRqapbJEa7awJDcr+SaH8toz+4r4KW8YQ3M7ybXMoSDo1QGewA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + } + } + }, + "acorn": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.1.tgz", + "integrity": "sha512-D/KGiCpM/VOtTMDS+wfjywEth926WUrArrzYov4N4SI7t+3y8747dPpCmmAvrm/Z3ygqMHnyPxvYYO0yTdn/nQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ajv": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", + "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", + "dev": true, + "requires": { + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0" + } + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "2.11.3", + "caniuse-lite": "1.0.30000813", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.19", + "postcss-value-parser": "3.3.0" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "blocking-proxy": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", + "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "bootstrap": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.0.0-beta.3.tgz", + "integrity": "sha512-/Qe1Q2d1muLEZRX2iCteMQHZBBAm6ZIjJ9FcBYK/xLr05+HvDtBOVBN+Cz7mCNZuy0zr+y5artZHM05W7mIz6g==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000813", + "electron-to-chromium": "1.3.36" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.3", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.2.4", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mkdirp": "0.5.1", + "neo-async": "2.5.0", + "schema-utils": "0.4.5" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30000813", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000813.tgz", + "integrity": "sha512-A8ITSmH5SFdMFdC704ggjg+x2z5PzQmVlG8tavwnfvbC33Q1UYrj0+G+Xm0SNAnd4He36fwUE/KEWytOEchw+A==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + } + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "circular-dependency-plugin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.4.0.tgz", + "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "6.0.2", + "shallow-clone": "1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codelyzer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", + "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", + "dev": true, + "requires": { + "app-root-path": "2.0.1", + "css-selector-tokenizer": "0.7.0", + "cssauron": "1.4.0", + "semver-dsl": "1.0.1", + "source-map": "0.5.7", + "sprintf-js": "1.0.3" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "common-tags": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.7.2.tgz", + "integrity": "sha512-joj9ZlUOjCrwdbmiLqafeUSgkUM74NqhLsZtSqDmhKudaIY197zTrb8JMl31fMnCUuxwFT23eC/oWvrZzDLRJQ==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": "1.33.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + } + } + }, + "compression": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.13", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "connect": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", + "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.0.6", + "parseurl": "1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.4.3.tgz", + "integrity": "sha512-v4THQ24Tks2NkyOvZuFDgZVfDD9YaA9rwYLZTrWg2GHIA8lrH5DboEyeoorh5Skki+PUbgSmnsCwhMWqYrQZrA==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.0", + "loader-utils": "1.1.0", + "minimatch": "3.0.4", + "p-limit": "1.2.0", + "serialize-javascript": "1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-object": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", + "dev": true, + "requires": { + "chalk": "2.2.2" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.7.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.10" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.39" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "duplexify": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", + "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.36.tgz", + "integrity": "sha1-Dqv3Gp6+qQE/scw1o5DgaGJPJ+g=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE=", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.39", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.39.tgz", + "integrity": "sha512-AlaXZhPHl0po/uxMx1tyrlt1O86M6D5iVaDH8UgLfgek4kXTX6vzsRfJQWC2Ku+aG8pkw1XWzh9eTkwfVrsD5g==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.39" + } + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "2.6.0", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.2.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "optional": true, + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "minimatch": "3.0.4" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "wbuf": "1.7.2" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.10.tgz", + "integrity": "sha512-5c8iAyeIGAiuFhVjJ0qy1lgvyQxxuZgjeOuMnoK/wjEyy8DF3xKUnE9pO+6H7VMir976K6SGlZV8ZEmIOea/Zg==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.14.1", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.13" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.10", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", + "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "dev": true, + "requires": { + "http-proxy": "1.16.2", + "is-glob": "3.1.0", + "lodash": "4.17.4", + "micromatch": "2.3.11" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true, + "optional": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true, + "optional": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.2.1.tgz", + "integrity": "sha512-oFCwXvd65amgaPCzqrR+a2XjanS1MvpXN6l/MlMUTv6uiA1NOgGX+I0uyq8Lg3GDxsxPsaP1049krz3hIJ5+KA==", + "dev": true, + "requires": { + "async": "2.6.0", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.9.1", + "istanbul-lib-report": "1.1.2", + "istanbul-lib-source-maps": "1.2.2", + "istanbul-reports": "1.1.3", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.0.tgz", + "integrity": "sha512-alLSEFX06ApU75sm5oWcaVNaiss/bgMRiWTct3g0P0ZZTKjR+6QiCcuVOKDI1kWJgwHEnIXsv/dWm783kPpmtw==", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.9.1", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz", + "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz", + "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz", + "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.3.tgz", + "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2", + "jasmine-core": "2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", + "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", + "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "dev": true, + "optional": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.5", + "core-js": "2.5.3", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.1.5", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.2.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", + "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.3.tgz", + "integrity": "sha512-MFkB6bh11J8nKygUdqyHb9sMz17XoBRYR4tiNxnSpi/UtDk0wk8eRGa0jRSJaILgCl4xyq1TL6Jidww1OWly/Q==", + "dev": true, + "requires": { + "istanbul-api": "1.2.1", + "minimatch": "3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.1.tgz", + "integrity": "sha1-b+hA51oRYAydkehLM8RY4cRqNSk=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "1.1.1" + } + }, + "karma-source-map-support": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", + "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "dev": true, + "requires": { + "source-map-support": "0.4.18" + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "0.1.7", + "graceful-fs": "4.1.11", + "image-size": "0.5.5", + "mime": "1.6.0", + "mkdirp": "0.5.1", + "promise": "7.3.1", + "request": "2.81.0", + "source-map": "0.5.7" + } + }, + "less-loader": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.0.6.tgz", + "integrity": "sha512-WPFY3NMJGJna8kIxtgSu6AVG7K6uRPdfE2J7vpQqFWMN/RkOosV09rOVUt3wghNClWH2Pg7YumD1dHiv1Thfug==", + "dev": true, + "requires": { + "clone": "2.1.1", + "loader-utils": "1.1.0", + "pify": "3.0.0" + } + }, + "license-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-+sie46vNe5L48N94LEzEvreJqAdi+N3x3mXUx+iujuAmftWdJUh68RSDPgWK3DRJuu50dwiyH7MdVAx95zfKQA==", + "dev": true, + "requires": { + "ejs": "2.5.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true, + "optional": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.2.tgz", + "integrity": "sha512-l9ra35l5VWLF24y75Tg8XgfGLX0ueRhph118WKM6H5denx4bB5QF59+4UAm9oJ2qsPQZas/CQUDdtDdfvYHBdQ==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.3" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.1", + "duplexify": "3.5.4", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.4.0", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", + "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", + "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-forge": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", + "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "dev": true + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.8.0", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.6", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-modules-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.1.tgz", + "integrity": "sha1-QAlrCM560OoUaAhjr0ScfHWl0cg=", + "dev": true + }, + "node-sass": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", + "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.8.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.12.2", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.2.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "obuf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", + "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", + "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + }, + "dependencies": { + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.19.tgz", + "integrity": "sha512-f13HRz0HtVwVaEuW6J6cOUCBLFtymhgyLPV7t4QEk2UD3twRI9IluDcQNdzQdBpiixkXj2OmzejhhTbSbDxNTg==", + "dev": true, + "requires": { + "chalk": "2.3.2", + "source-map": "0.6.1", + "supports-color": "5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "6.0.19", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.5.0" + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.1.tgz", + "integrity": "sha512-f0J/DWE/hyO9/LH0WHpXkny/ZZ238sSaG3p1SRBtVZnFWUtD7GXIEgHoBg8cnAeRbmEvUxHQptY46zWfwNYj/w==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "postcss": "6.0.19", + "postcss-load-config": "1.2.0", + "schema-utils": "0.4.5" + } + }, + "postcss-url": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.1.tgz", + "integrity": "sha512-Ya5KIjGptgz0OtrVYfi2UbLxVAZ6Emc4Of+Grx4Sf1deWlRpFwLr8FrtkUxfqh+XiZIVkXbjQrddE10ESpNmdA==", + "dev": true, + "requires": { + "mime": "1.6.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "postcss": "6.0.19", + "xxhashjs": "0.2.2" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.1", + "utila": "0.4.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "protractor": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", + "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", + "dev": true, + "requires": { + "@types/node": "6.0.96", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "2.53.43", + "blocking-proxy": "0.0.5", + "chalk": "1.1.3", + "glob": "7.1.2", + "jasmine": "2.8.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", + "q": "1.4.1", + "saucelabs": "1.3.0", + "selenium-webdriver": "3.0.1", + "source-map-support": "0.4.18", + "webdriver-js-extender": "1.0.0", + "webdriver-manager": "12.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", + "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "dev": true, + "requires": { + "adm-zip": "0.4.7", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "q": "1.4.1", + "request": "2.81.0", + "rimraf": "2.6.2", + "semver": "5.4.1", + "xml2js": "0.4.19" + } + } + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.6" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "dev": true, + "requires": { + "duplexify": "3.5.4", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qjobs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "dev": true + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.4", + "scss-tokenizer": "0.2.3", + "yargs": "7.1.0" + } + }, + "sass-loader": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.7.tgz", + "integrity": "sha512-JoiyD00Yo1o61OJsoP2s2kb19L1/Y2p3QFcCdWdF6oomBGKVYuZyqHWemRBfQ2uGYsk+CH3eCguXNfpjzlcpaA==", + "dev": true, + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "neo-async": "2.5.0", + "pify": "3.0.0" + } + }, + "saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", + "dev": true, + "requires": { + "https-proxy-agent": "1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.2.1", + "ajv-keywords": "3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": true, + "requires": { + "js-base64": "2.4.3", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", + "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", + "dev": true, + "requires": { + "adm-zip": "0.4.7", + "rimraf": "2.6.2", + "tmp": "0.0.30", + "xml2js": "0.4.19" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, + "selfsigned": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", + "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "dev": true, + "requires": { + "node-forge": "0.7.1" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "5.4.1" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.2", + "mime-types": "2.1.17", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.2.0" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.2.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.1", + "select-hose": "2.0.0", + "spdy-transport": "2.0.20" + } + }, + "spdy-transport": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", + "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.1", + "readable-stream": "2.3.3", + "safe-buffer": "5.1.1", + "wbuf": "1.7.2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "ssri": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", + "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.0", + "debug": "2.6.9", + "glob": "7.0.6", + "mkdirp": "0.5.1", + "sax": "0.5.8", + "source-map": "0.1.43" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "lodash.clonedeep": "4.5.0", + "when": "3.6.4" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "optional": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "ts-node": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", + "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.2.2", + "diff": "3.4.0", + "make-error": "1.3.2", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18", + "tsconfig": "6.0.0", + "v8flags": "3.0.1", + "yn": "2.0.0" + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz", + "integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==", + "dev": true, + "requires": { + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map": "0.5.7", + "source-map-support": "0.4.18" + } + }, + "tslib": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.1.tgz", + "integrity": "sha1-aUavLR1lGnsYY7Ux1uWvpBqkTqw=" + }, + "tslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", + "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "colors": "1.1.2", + "commander": "2.12.2", + "diff": "3.4.0", + "glob": "7.1.2", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.4.1", + "tslib": "1.8.1", + "tsutils": "2.18.0" + } + }, + "tsutils": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.18.0.tgz", + "integrity": "sha512-y0CUDPPb0ygkUkmK8kAeLibag7OEAO0dxbtqAhzP+5w/VY5JdGnPiafhYxzRzWzkAGQGPJV99xrxngJYVLtrMg==", + "dev": true, + "requires": { + "tslib": "1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "dev": true + }, + "uglify-js": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.13.tgz", + "integrity": "sha512-7rdn/bDOG1ElSTPdh7AI5TCjLv63ZD4k8BBadN3ssIkhlaQL2c0yRxmXCyOYhZK0wZTgGgUSnYQ4CGu+Jos5cA==", + "dev": true, + "requires": { + "commander": "2.14.1", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.5", + "serialize-javascript": "1.4.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.5.4" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + } + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "1.6.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + }, + "dependencies": { + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + } + } + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.4", + "tmp": "0.0.31" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.0.tgz", + "integrity": "sha512-qC0vMFX6q6ee8JaoTF2Om1uL8KAV1ATUjVaHRxLiPJkIsp8JZl6ZjG0MIB+twZFLbi1vXj30rqj4zlqYiOS9xg==", + "dev": true + }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "dev": true, + "requires": { + "chokidar": "2.0.2", + "graceful-fs": "4.1.11", + "neo-async": "2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.9", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + } + } + } + }, + "wbuf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", + "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.0" + } + }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "2.53.43", + "selenium-webdriver": "2.53.3" + }, + "dependencies": { + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "2.6.2", + "tmp": "0.0.24", + "ws": "1.1.2", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true, + "requires": { + "sax": "0.6.1", + "xmlbuilder": "9.0.4" + } + } + } + }, + "webpack": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "dev": true, + "requires": { + "acorn": "5.5.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "6.2.1", + "ajv-keywords": "3.1.0", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.5.0", + "webpack-sources": "1.1.0", + "yargs": "8.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } + }, + "webpack-dev-server": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz", + "integrity": "sha512-zrPoX97bx47vZiAXfDrkw8pe9QjJ+lunQl3dypojyWwWr1M5I2h0VSrMPfTjopHQPRNn+NqfjcMmhoLcUJe2gA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "2.0.2", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.2", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.17.4", + "import-local": "1.0.0", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.1.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.2", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "5.3.0", + "webpack-dev-middleware": "1.12.2", + "yargs": "6.6.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.9", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.1", + "fsevents": "1.1.3", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.0.4" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.2" + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + } + } + } + }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + }, + "dependencies": { + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.4.tgz", + "integrity": "sha1-j6yKfo61n8ahZ2ioXJ2U7n+dDts=", + "dev": true, + "requires": { + "webpack-core": "0.6.9" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.10", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.4.tgz", + "integrity": "sha512-ITyClEvcfv0ozqJl1vmWFWhvI+OIrkbInYqkEPE50wFPXj8J9Gd3FYf8+CkZJXJJsQBYe+2DvmoK9Zhx5w8W+w==", + "dev": true, + "requires": { + "errno": "0.1.7", + "xtend": "4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.4" + } + }, + "xmlbuilder": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", + "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "0.2.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true, + "optional": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "optional": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==" + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/package.json b/vendor/github.com/skycoin/skycoin/src/gui/static/package.json new file mode 100755 index 0000000..77b3a4c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/package.json @@ -0,0 +1,58 @@ +{ + "name": "desktopwallet", + "version": "0.0.0", + "license": "MIT", + "scripts": { + "ng": "ng", + "start": "ng serve --proxy-config proxy.config.js --delete-output-path false", + "build": "ng build --prod", + "build-travis": "ng build --prod --output-path=$BUILD_UI_TRAVIS_DIR", + "test": "ng test --watch=false", + "lint": "ng lint", + "e2e": "ng e2e --proxy-config e2e-proxy.config.js --delete-output-path false", + "e2e-choose-config": "ng e2e --proxy-config $E2E_PROXY_CONFIG --delete-output-path false" + }, + "private": true, + "dependencies": { + "@angular/animations": "^5.0.0", + "@angular/cdk": "^5.0.0", + "@angular/common": "^5.0.0", + "@angular/compiler": "^5.0.0", + "@angular/core": "^5.0.0", + "@angular/forms": "^5.0.0", + "@angular/http": "^5.0.0", + "@angular/material": "^5.0.0", + "@angular/platform-browser": "^5.0.0", + "@angular/platform-browser-dynamic": "^5.0.0", + "@angular/router": "^5.0.0", + "@ngx-translate/core": "^9.1.1", + "bootstrap": "^4.0.0-beta.2", + "core-js": "^2.4.1", + "font-awesome": "^4.7.0", + "hammerjs": "^2.0.8", + "moment": "^2.21.0", + "rxjs": "^5.5.2", + "zone.js": "^0.8.14" + }, + "devDependencies": { + "@angular/cli": "^1.7.3", + "@angular/compiler-cli": "^5.0.0", + "@angular/language-service": "^5.0.0", + "@types/jasmine": "~2.5.53", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~6.0.60", + "codelyzer": "~4.0.1", + "jasmine-core": "~2.6.2", + "jasmine-spec-reporter": "~4.1.0", + "karma": "~1.7.0", + "karma-chrome-launcher": "~2.1.1", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "~5.1.2", + "ts-node": "~3.2.0", + "tslint": "~5.7.0", + "typescript": "~2.4.2" + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/protractor.conf.js b/vendor/github.com/skycoin/skycoin/src/gui/static/protractor.conf.js new file mode 100755 index 0000000..98b7152 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/protractor.conf.js @@ -0,0 +1,31 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 60000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome', + chromeOptions: { + args: ['--no-sandbox', '--headless', '--disable-gpu', 'window-size=1920,1080'] + } + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 60000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/proxy.config.js b/vendor/github.com/skycoin/skycoin/src/gui/static/proxy.config.js new file mode 100755 index 0000000..5728e82 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/proxy.config.js @@ -0,0 +1,22 @@ +const PROXY_CONFIG = { + "/api/*": { + "target": "http://127.0.0.1:6420", + "secure": false, + "logLevel": "debug", + "bypass": function (req) { + req.headers["host"] = '127.0.0.1:6420'; + req.headers["referer"] = 'http://127.0.0.1:6420'; + req.headers["origin"] = 'http://127.0.0.1:6420'; + } +}, + "/teller/*": { + "target": "http://127.0.0.1:7071", + "pathRewrite": { + "^/teller" : "api/" + }, + "secure": true, + "logLevel": "debug" + } +}; + +module.exports = PROXY_CONFIG; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.html new file mode 100755 index 0000000..0680b43 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.scss new file mode 100755 index 0000000..dbe2cae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.scss @@ -0,0 +1,52 @@ +$white: #FBFBFB; + +mat-card { + max-width: 1000px; + margin-top: 80px; + margin-right: auto; + margin-left: auto; +} + +.logo { + max-height: 100%; +} + +.fill-remaining-space { + flex: 1 1 auto; +} + +.sky-container { + max-width: 1000px; + margin-top: 20px; + margin-right: auto; + margin-left: auto; +} + +mat-toolbar span { + margin: 0 20px; +} + +.search-field { + border-radius: 8px; + border: none; + background-color: #fff; + padding: 8px; +} + +.syncing { + font-size: 14px; +} + +.main-menu button { + margin-right: 20px; +} + +#top-menu { + span { + color: $white; + + &#version { + padding-top: 12px; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.spec.ts new file mode 100755 index 0000000..cd85da1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.spec.ts @@ -0,0 +1,32 @@ +import { TestBed, async } from '@angular/core/testing'; + +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent, + ], + }).compileComponents(); + })); + + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + + it(`should have as title 'app'`, async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app'); + })); + + it('should render title in a h1 tag', async(() => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('Welcome to app!'); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.ts new file mode 100755 index 0000000..3903547 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.component.ts @@ -0,0 +1,23 @@ +import { Component, OnInit } from '@angular/core'; +import 'rxjs/add/operator/takeWhile'; +import { AppService } from './services/app.service'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], +}) +export class AppComponent implements OnInit { + constructor( + private appService: AppService, + private translateService: TranslateService, + ) { + translateService.setDefaultLang('en'); + translateService.use('en'); + } + + ngOnInit() { + this.appService.testBackend(); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.config.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.config.ts new file mode 100755 index 0000000..722fae9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.config.ts @@ -0,0 +1,3 @@ +export const AppConfig = { + otcEnabled: false, +}; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.datatypes.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.datatypes.ts new file mode 100755 index 0000000..db607e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.datatypes.ts @@ -0,0 +1,95 @@ +/** + * Internal Objects + */ + +export class Address { + address: string; + coins: number; + hours: number; + copying?: boolean; // Optional parameter indicating whether the address is being copied to clipboard + outputs?: any; +} + +export class PurchaseOrder { + coin_type: string; + filename: string; + deposit_address: string; + recipient_address: string; + status?: string; +} + +export class TellerConfig { + enabled: boolean; + sky_btc_exchange_rate: number; +} + +export class Transaction { + balance: number; + inputs: any[]; + outputs: any[]; + txid: string; + hoursSent?: number; + hoursBurned?: number; +} + +export class PreviewTransaction extends Transaction { + from: string; + to: string[]; + encoded: string; +} + +export class NormalTransaction extends Transaction { + addresses: string[]; + timestamp: number; + block: number; + confirmed: boolean; +} + +export class Version { + version: string; +} + +export class Wallet { + label: string; + filename: string; + coins: number; + hours: number; + addresses: Address[]; + encrypted: boolean; + hideEmpty?: boolean; + opened?: boolean; +} + +export class Connection { + id: number; + address: string; + listen_port: number; + source?: string; +} + +/** + * Response Objects + */ + +export class GetWalletsResponseWallet { + meta: GetWalletsResponseMeta; + entries: GetWalletsResponseEntry[]; +} + +export class PostWalletNewAddressResponse { + addresses: string[]; +} + +/** + * Response Embedded Objects + */ + +export class GetWalletsResponseMeta { + label: string; + filename: string; + encrypted: boolean; +} + +export class GetWalletsResponseEntry { + address: string; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.module.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.module.ts new file mode 100755 index 0000000..5a2021c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.module.ts @@ -0,0 +1,230 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { AppComponent } from './app.component'; +import { HttpModule } from '@angular/http'; +import { ApiService } from './services/api.service'; +import { WalletService } from './services/wallet.service'; +import { WalletsComponent } from './components/pages/wallets/wallets.component'; +import { CreateWalletComponent } from './components/pages/wallets/create-wallet/create-wallet.component'; +import { ReactiveFormsModule } from '@angular/forms'; +import { SendSkycoinComponent } from './components/pages/send-skycoin/send-skycoin.component'; +import { DateFromNowPipe } from './pipes/date-from-now.pipe'; +import { RouterModule } from '@angular/router'; +import { BlockchainService } from './services/blockchain.service'; +import { DateTimePipe } from './pipes/date-time.pipe'; +import { PendingTransactionsComponent } from './components/pages/settings/pending-transactions/pending-transactions.component'; +import { OutputsComponent } from './components/pages/settings/outputs/outputs.component'; +import { BlockchainComponent } from './components/pages/settings/blockchain/blockchain.component'; +import { BackupComponent } from './components/pages/settings/backup/backup.component'; +import { NetworkComponent } from './components/pages/settings/network/network.component'; +import { NetworkService } from './services/network.service'; +import { ChangeNameComponent } from './components/pages/wallets/change-name/change-name.component'; +import { ButtonComponent } from './components/layout/button/button.component'; +import { QrCodeComponent } from './components/layout/qr-code/qr-code.component'; +import { BuyComponent } from './components/pages/buy/buy.component'; +import { AddDepositAddressComponent } from './components/pages/buy/add-deposit-address/add-deposit-address.component'; +import { PurchaseService } from './services/purchase.service'; +import { TellerStatusPipe } from './pipes/teller-status.pipe'; +import { HeaderComponent } from './components/layout/header/header.component'; +import { TopBarComponent } from './components/layout/header/top-bar/top-bar.component'; +import { PriceService } from './services/price.service'; +import { TransactionListComponent } from './components/pages/transaction-list/transaction-list.component'; +import { TransactionDetailComponent } from './components/pages/transaction-list/transaction-detail/transaction-detail.component'; +import { NavBarComponent } from './components/layout/header/nav-bar/nav-bar.component'; +import { WalletDetailComponent } from './components/pages/wallets/wallet-detail/wallet-detail.component'; +import { ModalComponent } from './components/layout/modal/modal.component'; +import { PasswordDialogComponent } from './components/layout/password-dialog/password-dialog.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatSliderModule } from '@angular/material'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { HttpClientModule } from '@angular/common/http'; +import { AppService } from './services/app.service'; +import { WizardGuardService } from './services/wizard-guard.service'; +import { OnboardingCreateWalletComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component'; +import { OnboardingEncryptWalletComponent } from './components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component'; +import { OnboardingSafeguardComponent } from './components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component'; +import { DoubleButtonComponent } from './components/layout/double-button/double-button.component'; +import { SeedModalComponent } from './components/pages/settings/backup/seed-modal/seed-modal.component'; +import { OnboardingComponent } from './components/pages/onboarding/onboarding.component'; +import { DontsavepasswordDirective } from './directives/dontsavepassword.directive'; +import { SendFormComponent } from './components/pages/send-skycoin/send-form/send-form.component'; +import { SendVerifyComponent } from './components/pages/send-skycoin/send-preview/send-preview.component'; +import { TransactionInfoComponent } from './components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component'; +import { SendFormAdvancedComponent } from './components/pages/send-skycoin/send-form-advanced/send-form-advanced.component'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { AppTranslateLoader } from './app.translate-loader'; +import { NavBarService } from './services/nav-bar.service'; +import { LoadingContentComponent } from './components/layout/loading-content/loading-content.component'; + + +const ROUTES = [ + { + path: '', + redirectTo: 'wallets', + pathMatch: 'full', + }, + { + path: 'wallets', + component: WalletsComponent, + canActivate: [WizardGuardService], + }, + { + path: 'send', + component: SendSkycoinComponent, + canActivate: [WizardGuardService], + }, + { + path: 'transactions', + component: TransactionListComponent, + canActivate: [WizardGuardService], + }, + { + path: 'buy', + component: BuyComponent, + canActivate: [WizardGuardService], + }, + { + path: 'settings', + children: [ + { + path: 'backup', + component: BackupComponent, + }, + { + path: 'blockchain', + component: BlockchainComponent, + }, + { + path: 'network', + component: NetworkComponent, + }, + { + path: 'outputs', + component: OutputsComponent, + }, + { + path: 'pending-transactions', + component: PendingTransactionsComponent, + }, + ], + canActivate: [WizardGuardService], + }, + { + path: 'wizard', + component: OnboardingComponent, + }, +]; + +@NgModule({ + declarations: [ + AddDepositAddressComponent, + AppComponent, + BackupComponent, + BlockchainComponent, + BuyComponent, + ButtonComponent, + ChangeNameComponent, + CreateWalletComponent, + DateFromNowPipe, + DateTimePipe, + HeaderComponent, + NetworkComponent, + OutputsComponent, + PendingTransactionsComponent, + QrCodeComponent, + SendSkycoinComponent, + TellerStatusPipe, + TopBarComponent, + TransactionDetailComponent, + TransactionListComponent, + WalletsComponent, + NavBarComponent, + WalletDetailComponent, + ModalComponent, + OnboardingCreateWalletComponent, + OnboardingEncryptWalletComponent, + OnboardingSafeguardComponent, + DoubleButtonComponent, + PasswordDialogComponent, + SeedModalComponent, + OnboardingComponent, + DontsavepasswordDirective, + SendFormComponent, + SendVerifyComponent, + TransactionInfoComponent, + SendFormAdvancedComponent, + LoadingContentComponent, + ], + entryComponents: [ + AddDepositAddressComponent, + CreateWalletComponent, + ChangeNameComponent, + QrCodeComponent, + SendSkycoinComponent, + TransactionDetailComponent, + OnboardingSafeguardComponent, + PasswordDialogComponent, + SeedModalComponent, + ], + imports: [ + BrowserModule, + HttpModule, + HttpClientModule, + MatButtonModule, + MatCardModule, + MatDialogModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatSelectModule, + MatSnackBarModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatCheckboxModule, + MatSliderModule, + NoopAnimationsModule, + ReactiveFormsModule, + RouterModule.forRoot(ROUTES, { useHash: true }), + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: AppTranslateLoader, + }, + }), + ], + providers: [ + ApiService, + AppService, + BlockchainService, + NavBarService, + NetworkService, + PriceService, + PurchaseService, + WalletService, + WizardGuardService, + ], + bootstrap: [AppComponent], +}) +export class AppModule { } diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.theme.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.theme.scss new file mode 100755 index 0000000..1e71e75 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.theme.scss @@ -0,0 +1,41 @@ +@import '~@angular/material/theming'; +// Plus imports for other components in your app. + +// Include the common styles for Angular Material. We include this here so that you only +// have to load a single css file for Angular Material in your app. +// Be sure that you only ever include this mixin once! +@include mat-core(); + +// Define the palettes for your theme using the Material Design palettes available in palette.scss +// (imported above). For each palette, you can optionally specify a default, lighter, and darker +// hue. + +$mat-skycoin-primary: ( + 100: #00C3FF, + 500: #0072FF, + contrast: ( + 100: white, + 500: white, + ) +); + +$mat-skycoin-accent: ( + 500: #FFC125, + contrast: ( + 500: white + ) +); + +$candy-app-primary: mat-palette($mat-skycoin-primary, 500, 100, 500); +$candy-app-accent: mat-palette($mat-skycoin-accent, 500, 500, 500); + +// The warn palette is optional (defaults to red). +$candy-app-warn: mat-palette($mat-red); + +// Create the theme object (a Sass map containing all of the palettes). +$candy-app-theme: mat-light-theme($candy-app-primary, $candy-app-accent, $candy-app-warn); + +// Include theme styles for core and each component used in your app. +// Alternatively, you can import and @include the theme mixins for each component +// that you are using. +@include angular-material-theme($candy-app-theme); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.translate-loader.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.translate-loader.ts new file mode 100755 index 0000000..ac8cc67 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/app.translate-loader.ts @@ -0,0 +1,9 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/fromPromise'; + +export class AppTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { + return Observable.fromPromise(System.import(`../assets/i18n/${lang}.json`)); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.html new file mode 100755 index 0000000..34669aa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.html @@ -0,0 +1,21 @@ +
+ +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss new file mode 100755 index 0000000..c5a6c82 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.scss @@ -0,0 +1,34 @@ +@import '../../../../theme/variables'; + +.button-container { + display: inline-block; +} + +button { + border-radius: 25px; + height: 50px; + margin: 20px 10px 0; + width: 160px; + overflow: hidden; +} + +button.enabled { + background-color: rgba(30, 34, 39, 0.05); + box-shadow: none; + color: #1e2227; +} + +mat-icon { + margin-left: 10px; + opacity: 0.3; + line-height: 20px; +} + +mat-spinner { + display: inline-block; + height: 24px !important; + width: 24px !important; + margin-left: 10px; + position: relative; + top: -2px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts new file mode 100755 index 0000000..061a0d2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ButtonComponent } from './button.component'; + +describe('ButtonComponent', () => { + let component: ButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts new file mode 100755 index 0000000..f81a739 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/button/button.component.ts @@ -0,0 +1,63 @@ +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { parseResponseMessage } from '../../../utils/errors'; +import { MatTooltip } from '@angular/material'; + +@Component({ + selector: 'app-button', + templateUrl: 'button.component.html', + styleUrls: ['button.component.scss'], +}) +export class ButtonComponent { + @Input() disabled: any; + @Input() forceEmitEvents = false; + @Output() action = new EventEmitter(); + @ViewChild('tooltip') tooltip: MatTooltip; + + error: string; + state: number; + mouseOver = false; + + onClick() { + if (!this.disabled || this.forceEmitEvents) { + this.error = ''; + this.action.emit(); + } + } + + setLoading() { + this.state = 0; + } + + setSuccess() { + this.state = 1; + setTimeout(() => this.state = null, 3000); + } + + setError(error: any) { + this.error = typeof error === 'string' ? error : parseResponseMessage(error['_body']); + this.state = 2; + + if (this.mouseOver) { + setTimeout(() => this.tooltip.show(), 50); + } + } + + setDisabled() { + this.disabled = true; + } + + setEnabled() { + this.disabled = false; + } + + isLoading() { + return this.state === 0; + } + + resetState() { + this.state = null; + this.error = ''; + + return this; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html new file mode 100755 index 0000000..6a4591a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.html @@ -0,0 +1,14 @@ +
+ {{ leftButtonText }} + {{ rightButtonText }} +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss new file mode 100755 index 0000000..8715ac9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.scss @@ -0,0 +1,51 @@ +@import '../../../../theme/variables'; + +.-small-button ::ng-deep button { + width: unset; + height: unset; + padding: 0 10px 0 10px; + min-width: 100px; + margin: unset; + font-size: 13px; +} + +.-toggle ::ng-deep button { + box-shadow: unset; + background-color: $transparent !important; + line-height: unset !important; + min-height: 26px; + span { + color: $black; + line-height: unset !important; + } +} + +.-toggle ::ng-deep button.enabled { + background-color: $black !important; + span { + color: $white; + } +} + +.-buttons-container { + width: fit-content; + padding: 5px; + background: rgba(255, 255, 255, 0.1); + border-radius: 100px; + margin: 0px auto; + text-align: center; +} + +.light { + &.-buttons-container { + background: #f7f7f7; + } + + .-toggle ::ng-deep button.enabled { + background-color: #fff !important; + + span { + color: $grey-dark; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts new file mode 100755 index 0000000..7718bbc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DoubleButtonComponent } from './double-button.component'; + +describe('DoubleButtonComponent', () => { + let component: DoubleButtonComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DoubleButtonComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DoubleButtonComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts new file mode 100755 index 0000000..1f9cffe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/double-button/double-button.component.ts @@ -0,0 +1,32 @@ +import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; + +export enum DoubleButtonActive { RightButton, LeftButton } + +@Component({ + selector: 'app-double-button', + templateUrl: './double-button.component.html', + styleUrls: ['./double-button.component.scss'], + encapsulation: ViewEncapsulation.Emulated, +}) +export class DoubleButtonComponent { + @Input() rightButtonText: any; + @Input() leftButtonText: any; + @Input() activeButton: DoubleButtonActive; + @Input() className = ''; + @Output() onStateChange = new EventEmitter(); + ButtonState = DoubleButtonActive; + + onRightClick() { + if (this.activeButton === DoubleButtonActive.LeftButton) { + this.activeButton = DoubleButtonActive.RightButton; + this.onStateChange.emit(DoubleButtonActive.RightButton); + } + } + + onLeftClick() { + if (this.activeButton === DoubleButtonActive.RightButton) { + this.activeButton = DoubleButtonActive.LeftButton; + this.onStateChange.emit(DoubleButtonActive.LeftButton); + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.html new file mode 100755 index 0000000..a12a73f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.html @@ -0,0 +1,57 @@ +
+
+ +
+
+

{{ percentage | percent:'1.2-2' }}

+

{{ coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

+

 

+

+ + {{ (coins * price) | currency:'USD':'symbol':'1.2-2' }} + - + ({{ price | currency:'USD':'symbol':'1.2-2' }}) + + {{ 'common.loading' | translate }} +

+
+
+
+

+ {{ 'header.syncing-blocks' | translate }} + {{ current && highest ? '(' + current + '/' + highest + ')' : '..' }} +

+

{{ hours | number }} {{ 'common.coin-hours' | translate }}

+
+
+ + + +
+ {{ 'header.update1' | translate }} + v{{ releaseVersion }} + {{ 'header.update2' | translate }} +
+
+ +
{{ 'header.errors.no-connections' | translate }}
+
+ {{ 'header.errors.no-backend1' | translate }} + {{ 'header.errors.no-backend2' | translate }} + {{ 'header.errors.no-backend3' | translate }} +
+
{{ 'header.errors.csrf' | translate }}
+
+ +
+ {{ 'header.pending-txs1' | translate }} + {{ 'header.pending-txs2' | translate }} + {{ 'header.pending-txs3' | translate }} +
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss new file mode 100755 index 0000000..a07d3d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.scss @@ -0,0 +1,73 @@ +@import '../../../../theme/variables'; + +.-container { + background-color: #fbfbfb; + border-bottom: 2px solid rgba(30, 34, 39, 0.05); +} + +.large-header { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark-transparent, $gradient-blue-light-transparent), url('../../../../assets/img/header.png') center center no-repeat; /* Standard syntax */ + background-size: 100% auto; + display: flex; + flex-flow: column; + align-items: stretch; + min-height: 190px; +} + +.balance-container { + align-items: center; + color: $white; + display: flex; + flex: 1 1 auto; + font-size: 12px; + justify-content: center; + text-align: center; + + .balance { + .coins { + line-height: 1; + margin: 0 0 0.5em; + + span { + font-size: 4em; + } + } + } + + .dollars { + margin: 0; + } +} + +.hour-balance { + text-align: center; + + p { + background-color: rgba(255, 255, 255, 0.3); + border-radius: 15px; + color: $black; + display: inline-block; + font-size: 12px; + line-height: 22px; + margin: 1em 0 2em; + padding: 0 30px; + } +} + +.notification-bar { + background-color: #F44A4D; + color:#FBFBFB; + + div { + margin: auto; + + a { + text-decoration: none; + color: #FFEBEE; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts new file mode 100755 index 0000000..89380b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ HeaderComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts new file mode 100755 index 0000000..a3a31a2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/header.component.ts @@ -0,0 +1,116 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PriceService } from '../../../services/price.service'; +import { Subscription } from 'rxjs/Subscription'; +import { WalletService } from '../../../services/wallet.service'; +import { BlockchainService } from '../../../services/blockchain.service'; +import { Observable } from 'rxjs/Observable'; +import { ApiService } from '../../../services/api.service'; +import { Http } from '@angular/http'; +import { AppService } from '../../../services/app.service'; +import 'rxjs/add/operator/skip'; +import 'rxjs/add/operator/take'; +import { shouldUpgradeVersion } from '../../../utils/semver'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent implements OnInit, OnDestroy { + @Input() headline: string; + + addresses = []; + current: number; + highest: number; + percentage: number; + querying = true; + version: string; + releaseVersion: string; + updateAvailable: boolean; + hasPendingTxs: boolean; + price: number; + + private subscription: Subscription; + private fetchVersionError: string; + + get loading() { + return !this.current || !this.highest || this.current !== this.highest; + } + + get coins() { + return this.addresses.map(addr => addr.coins >= 0 ? addr.coins : 0).reduce((a, b) => a + b, 0); + } + + get hours() { + return this.addresses.map(addr => addr.hours >= 0 ? addr.hours : 0).reduce((a, b) => a + b, 0); + } + + constructor( + public appService: AppService, + private apiService: ApiService, + private blockchainService: BlockchainService, + private priceService: PriceService, + private walletService: WalletService, + private http: Http, + private translateService: TranslateService, + ) { + this.translateService.get('errors.fetch-version').subscribe(msg => { + this.fetchVersionError = msg; + }); + } + + ngOnInit() { + this.subscription = this.blockchainService.progress + .filter(response => !!response) + .subscribe(response => { + this.querying = false; + this.highest = response.highest; + this.current = response.current; + this.percentage = this.current && this.highest ? (this.current / this.highest) : 0; + }); + + this.setVersion(); + + this.subscription.add(this.priceService.price.subscribe(price => this.price = price)); + + this.subscription.add(this.walletService.allAddresses().subscribe(addresses => { + this.addresses = addresses.reduce((array, item) => { + if (!array.find(addr => addr.address === item.address)) { + array.push(item); + } + + return array; + }, []); + })); + + this.subscription.add(this.walletService.pendingTransactions().subscribe(txs => { + this.hasPendingTxs = txs.length > 0; + })); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + setVersion() { + // Set build version + setTimeout(() => { + this.apiService.getVersion().first() + .subscribe(output => { + this.version = output.version; + this.retrieveReleaseVersion(); + }); + }, 1000); + } + + private retrieveReleaseVersion() { + this.http.get('https://api.github.com/repos/skycoin/skycoin/tags') + .map((res: any) => res.json()) + .catch((error: any) => Observable.throw(error || this.fetchVersionError)) + .subscribe(response => { + this.releaseVersion = response.find(element => element['name'].indexOf('rc') === -1)['name'].substr(1); + this.updateAvailable = shouldUpgradeVersion(this.version, this.releaseVersion); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html new file mode 100755 index 0000000..d9b3978 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.html @@ -0,0 +1,30 @@ +
+
+
+ + {{ 'title.wallets' | translate }} +
+
+ + {{ 'title.send' | translate }} +
+
+ + {{ 'title.history' | translate }} +
+
+
+ + {{ 'title.buy-coin' | translate }} +
+ +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss new file mode 100755 index 0000000..ebd1b58 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.scss @@ -0,0 +1,41 @@ +@import '../../../../../theme/variables'; + +:host { + background-color: #fbfbfb; + min-height: 66px; +} + +.-buttons { + display: flex; + width: 100%; + + .-button { + cursor: pointer; + padding: 0 20px; + + img { + display: inline-block; + float: left; + height: 66px; + padding: 17px 0; + width: 32px; + } + + span { + display: inline-block; + font-size: 14px; + height: 66px; + line-height: 66px; + margin: 0 5px; + } + } + + .-low-opacity { + opacity: 0.2; + } + + .-switch { + align-self: center; + padding: 0 20px; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts new file mode 100755 index 0000000..98bcd49 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NavBarComponent } from './nav-bar.component'; + +describe('NavBarComponent', () => { + let component: NavBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NavBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NavBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts new file mode 100755 index 0000000..4b7bd36 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/nav-bar/nav-bar.component.ts @@ -0,0 +1,20 @@ +import { Component } from '@angular/core'; +import { AppConfig } from '../../../../app.config'; +import { NavBarService } from '../../../../services/nav-bar.service'; + +@Component({ + selector: 'app-nav-bar', + templateUrl: './nav-bar.component.html', + styleUrls: ['./nav-bar.component.scss'], +}) +export class NavBarComponent { + otcEnabled = AppConfig.otcEnabled; + + constructor( + public navbarService: NavBarService, + ) { } + + changeActiveComponent(value) { + this.navbarService.setActiveComponent(value); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html new file mode 100755 index 0000000..c3f6e9e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.html @@ -0,0 +1,25 @@ +
+
+ {{ headline }} +
+
+ + + + + + + + + + + {{ 'title.explorer' | translate }} + + + + +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss new file mode 100755 index 0000000..4712677 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.scss @@ -0,0 +1,42 @@ +@import '../../../../../theme/variables'; + +:host { + display: flex; + color: $white; + width: 100%; +} + +.buttons-left { + display: inline-block; + padding: 0 10px; + width: 120px; +} + +.title { + font-size: $font-size-standard; + font-weight: 700; + display: inline; + flex: 1 1 auto; + letter-spacing: $letter-spacing-wide; + line-height: 50px; + text-align: center; +} + +.buttons-right { + display: inline-block; + text-align: right; + width: 120px; + + button { + display: inline-block; + } +} + +button { + height: 50px; + width: 50px; +} + +.color-primary { + color: #0072FF; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts new file mode 100755 index 0000000..2028774 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TopBarComponent } from './top-bar.component'; + +describe('TopBarComponent', () => { + let component: TopBarComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TopBarComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TopBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts new file mode 100755 index 0000000..0bc88d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/header/top-bar/top-bar.component.ts @@ -0,0 +1,15 @@ +import { Component, Input } from '@angular/core'; +import { AppService } from '../../../../services/app.service'; + +@Component({ + selector: 'app-top-bar', + templateUrl: './top-bar.component.html', + styleUrls: ['./top-bar.component.scss'], +}) +export class TopBarComponent { + @Input() headline: string; + + constructor( + public appService: AppService, + ) {} +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html new file mode 100755 index 0000000..0c17084 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.html @@ -0,0 +1,10 @@ +
+
+ +

{{ 'common.loading' | translate }}

+
+
+ announcement +

{{ noDataText | translate }}

+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss new file mode 100755 index 0000000..796f89a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.scss @@ -0,0 +1,25 @@ +@import '../../../../theme/variables'; + +.-content { + text-align: center; + margin: 50px 0; + color: $grey; + font-size: 13px; + + p { + margin-top: 15px; + } + + i { + color: $grey-light; + font-size: 40px; + } + + mat-spinner { + display: inline-block; + + ::ng-deep circle { + stroke: $grey-light; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts new file mode 100755 index 0000000..b845f36 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoadingContentComponent } from './loading-content.component'; + +describe('LoadingContentComponent', () => { + let component: LoadingContentComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ LoadingContentComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoadingContentComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts new file mode 100755 index 0000000..7416bb9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/loading-content/loading-content.component.ts @@ -0,0 +1,11 @@ +import { Component, Input } from '@angular/core'; + +@Component({ + selector: 'app-loading-content', + templateUrl: './loading-content.component.html', + styleUrls: ['./loading-content.component.scss'], +}) +export class LoadingContentComponent { + @Input() isLoading = true; + @Input() noDataText: string; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html new file mode 100755 index 0000000..cf64043 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.html @@ -0,0 +1,7 @@ +
+ {{ headline }} + +
+
+ +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss new file mode 100755 index 0000000..2a272e8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.scss @@ -0,0 +1,21 @@ +.-header { + background-color: #f7f7f7; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + line-height: 50px; + position: relative; + text-align: center; + + img { + cursor: pointer; + height: 32px; + position: absolute; + right: 9px; + top: 9px; + } +} + +.-body { + background-color: #fbfbfb; + padding: 30px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts new file mode 100755 index 0000000..e572454 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ModalComponent } from './modal.component'; + +describe('ModalComponent', () => { + let component: ModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts new file mode 100755 index 0000000..e5f2b4c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/modal/modal.component.ts @@ -0,0 +1,25 @@ +import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-modal', + templateUrl: './modal.component.html', + styleUrls: ['./modal.component.scss'], +}) +export class ModalComponent implements OnChanges { + @Input() dialog: MatDialogRef; + @Input() headline: string; + @Input() disableDismiss: boolean; + + closePopup() { + if (!this.disableDismiss) { + this.dialog.close(); + } + } + + ngOnChanges(changes: SimpleChanges) { + if (changes.disableDismiss) { + this.dialog.disableClose = changes.disableDismiss.currentValue; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html new file mode 100755 index 0000000..3b793b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.html @@ -0,0 +1,18 @@ + +

{{ data.description }}

+
+
+ + +
+
+ + +
+
+
+ + {{ 'password.button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss new file mode 100755 index 0000000..54573c0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.scss @@ -0,0 +1,12 @@ +@import '../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +.-info { + margin: 5px 0 25px; + color: $grey; + font-size: 12px; + line-height: 1.5; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts new file mode 100755 index 0000000..a8d40a1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PasswordDialogComponent } from './password-dialog.component'; + +describe('PasswordDialogComponent', () => { + let component: PasswordDialogComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PasswordDialogComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PasswordDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts new file mode 100755 index 0000000..d200b35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/password-dialog/password-dialog.component.ts @@ -0,0 +1,131 @@ +import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef, MatSnackBar } from '@angular/material'; +import { FormControl, FormGroup } from '@angular/forms'; +import { ButtonComponent } from '../button/button.component'; +import { parseResponseMessage, showSnackbarError } from '../../../utils/errors'; +import { Subject } from 'rxjs/Subject'; +import { ISubscription } from 'rxjs/Subscription'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-password-dialog', + templateUrl: './password-dialog.component.html', + styleUrls: ['./password-dialog.component.scss'], +}) +export class PasswordDialogComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + passwordSubmit = new Subject(); + disableDismiss = false; + + private subscriptions: ISubscription[] = []; + private errors: any; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + private snackbar: MatSnackBar, + private translateService: TranslateService, + ) { + this.data = Object.assign({ + confirm: false, + description: null, + title: null, + }, data || {}); + + this.translateService.get(['errors.incorrect-password', 'errors.api-disabled', 'errors.no-wallet']).subscribe(res => { + this.errors = res; + }); + } + + ngOnInit() { + this.form = new FormGroup({}, this.validateForm.bind(this)); + this.form.addControl('password', new FormControl('')); + this.form.addControl('confirm_password', new FormControl('')); + + ['password', 'confirm_password'].forEach(control => { + this.subscriptions.push(this.form.get(control).valueChanges.subscribe(() => { + if (this.button.state === 2) { + this.button.resetState(); + } + })); + }); + + if (this.data.confirm) { + this.form.get('confirm_password').enable(); + } else { + this.form.get('confirm_password').disable(); + } + + if (this.data.description) { + this.dialogRef.updateSize('400px'); + } + } + + ngOnDestroy() { + this.form.get('password').setValue(''); + this.form.get('confirm_password').setValue(''); + + this.passwordSubmit.complete(); + + this.subscriptions.forEach(sub => sub.unsubscribe()); + } + + proceed() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.button.setLoading(); + this.disableDismiss = true; + + this.passwordSubmit.next({ + password: this.form.get('password').value, + close: this.close.bind(this), + error: this.error.bind(this), + }); + } + + private validateForm() { + if (this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value.length === 0) { + return { Required: true }; + } + + if (this.data.confirm && this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } + + return null; + } + + private close() { + this.dialogRef.close(); + } + + private error(error: any) { + if (typeof error === 'object') { + switch (error.status) { + case 400: + error = parseResponseMessage(error['_body']); + break; + case 401: + error = this.errors['errors.incorrect-password']; + break; + case 403: + error = this.errors['errors.api-disabled']; + break; + case 404: + error = this.errors['errors.no-wallet']; + break; + default: + showSnackbarError(this.snackbar, error, 5000); + } + } + + this.button.setError(error ? error : this.errors['errors.incorrect-password']); + this.disableDismiss = false; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.css b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.css new file mode 100755 index 0000000..e900d51 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.css @@ -0,0 +1,9 @@ +#qr { + height: 300px; +} + +.address { + font-size: 80%; + text-align: center; + margin-top: 30px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html new file mode 100755 index 0000000..1295958 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.html @@ -0,0 +1,4 @@ + +
+
{{ data.address }}
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts new file mode 100755 index 0000000..2943ac0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { QrCodeComponent } from './qr-code.component'; + +describe('QrCodeComponent', () => { + let component: QrCodeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ QrCodeComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(QrCodeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts new file mode 100755 index 0000000..ac33fab --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/layout/qr-code/qr-code.component.ts @@ -0,0 +1,37 @@ +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatDialogRef } from '@angular/material'; + +declare const QRCode: any; + +@Component({ + selector: 'app-qr-code', + templateUrl: './qr-code.component.html', + styleUrls: ['./qr-code.component.css'], +}) +export class QrCodeComponent implements OnInit { + @ViewChild('qr') qr: any; + + size = 300; + level = 'M'; + colordark = '#000000'; + colorlight = '#ffffff'; + usesvg = false; + + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + ) { } + + ngOnInit() { + const qrcode = new QRCode(this.qr.nativeElement, { + text: `skycoin:${this.data.address}`, + width: this.size, + height: this.size, + colorDark: this.colordark, + colorLight: this.colorlight, + useSVG: this.usesvg, + correctLevel: QRCode.CorrectLevel[this.level.toString()], + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css new file mode 100755 index 0000000..91222aa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.css @@ -0,0 +1,4 @@ +mat-select { + width: 100%; + padding: 40px 0 20px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html new file mode 100755 index 0000000..11ad098 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.html @@ -0,0 +1,11 @@ +

{{ 'buy.deposit-address' | translate }}

+
+ + + {{ address.address }} + + +
+ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts new file mode 100755 index 0000000..be225b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AddDepositAddressComponent } from './add-deposit-address.component'; + +describe('AddDepositAddressComponent', () => { + let component: AddDepositAddressComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AddDepositAddressComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AddDepositAddressComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts new file mode 100755 index 0000000..8283d40 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/add-deposit-address/add-deposit-address.component.ts @@ -0,0 +1,36 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../../services/wallet.service'; +import { PurchaseService } from '../../../../services/purchase.service'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-add-deposit-address', + templateUrl: './add-deposit-address.component.html', + styleUrls: ['./add-deposit-address.component.css'], +}) +export class AddDepositAddressComponent implements OnInit { + + form: FormGroup; + + constructor( + public walletService: WalletService, + private dialogRef: MatDialogRef, + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + ) {} + + ngOnInit() { + this.initForm(); + } + + generate() { + this.purchaseService.generate(this.form.value.address).subscribe(() => this.dialogRef.close()); + } + + private initForm() { + this.form = this.formBuilder.group({ + address: ['', Validators.required], + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html new file mode 100755 index 0000000..82ee9d7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.html @@ -0,0 +1,59 @@ + +
+
+
+
+
+ 1 +
+
+

{{ 'buy.deposit-location' | translate }}

+

{{ 'buy.deposit-location-desc' | translate }}

+
+
+ +
+
+ {{ 'buy.wallets-desc' | translate }} +
+
+
+
+ 2 +
+
+

{{ 'buy.send' | translate }}

+

{{ 'buy.send-desc' | translate:{rate: config.sky_btc_exchange_rate} }}

+ + {{ order.deposit_address }} + + {{ 'buy.fraction-warning' | translate }} +
+
+
+
+ 3 +
+
+

{{ 'buy.receive' | translate }}

+

{{ 'buy.receive-desc' | translate }}

+ + {{ 'buy.status-button' | translate }} {{ order.status | tellerStatus | translate }} + + + {{ 'buy.check-status-button' | translate }} + + + {{ 'buy.new-order-button' | translate }} + +
+
+
+ +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss new file mode 100755 index 0000000..8202072 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.scss @@ -0,0 +1,129 @@ +.-background-container { + background-color: #fbfbfb; + padding-top: 30px; + max-width: 100%; + min-height: calc(100% - 190px); + overflow: hidden; + position: relative; +} + +.-background-image { + display: none; +} + +@media (min-width: 768px) { + .-background-image { + display: block; + left: 50%; + width: 80%; + position: absolute; + top: 0; + } +} + +@media (min-width: 992px) { + .-background-image { + left: 40%; + width: 90%; + max-width: 850px; + } +} + +@media (min-width: 1200px) { + .-background-image { + left: 40%; + width: 80%; + max-width: 850px; + } +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + position: relative; + margin-top: 30px; + max-width: 540px; + z-index: 5; + + .-step { + display: flex; + margin-bottom: 30px; + + .-number { + width: 60px; + + span { + border-radius: 50%; + color: white; + display: inline-block; + font-size: 16px; + font-weight: 700; + height: 40px; + line-height: 46px; + text-align: center; + width: 40px; + } + } + + .-instructions { + flex: 1 1; + + ::ng-deep button { + margin-left: 0; + } + + h3 { + color: #1E2227; + font-size: 16px; + font-weight: 700; + margin: 0; + line-height: 46px; + } + + p { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + font-weight: 300; + line-height: 20px; + margin-top: 0; + } + + .-address, .-status { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + color: rgba(30, 34, 39, 0.8); + display: block; + font-size: 14px; + line-height: 20px; + margin-bottom: 15px; + padding: 10px 10px; + width: 100%; + } + + .-coins { + color: #0072FF; + } + + .form-field { + margin-bottom: 15px; + } + + .-subtitle { + color: #8C8E90; + font-size: 12px; + line-height: 18px; + font-weight: 300; + opacity: 0.8; + } + + .-wallet { + color: rgba(30, 34, 39, 0.8); + font-size: 14px; + } + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts new file mode 100755 index 0000000..1d0cca4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BuyComponent } from './buy.component'; + +describe('BuyComponent', () => { + let component: BuyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BuyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BuyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts new file mode 100755 index 0000000..785d8b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/buy/buy.component.ts @@ -0,0 +1,112 @@ +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { PurchaseService } from '../../../services/purchase.service'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../services/wallet.service'; +import { Address, PurchaseOrder, Wallet } from '../../../app.datatypes'; +import { MatSnackBar } from '@angular/material/snack-bar'; +import { ButtonComponent } from '../../layout/button/button.component'; +import { Subscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-buy', + templateUrl: './buy.component.html', + styleUrls: ['./buy.component.scss'], +}) +export class BuyComponent implements OnInit, OnDestroy { + @ViewChild('button') button: ButtonComponent; + + address: Address; + config: any; + form: FormGroup; + order: PurchaseOrder; + wallets: Wallet[]; + + private subscription: Subscription; + + constructor( + private formBuilder: FormBuilder, + private purchaseService: PurchaseService, + private snackBar: MatSnackBar, + private walletService: WalletService, + ) {} + + ngOnInit() { + this.initForm(); + this.loadData(); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + checkStatus() { + this.button.setLoading(); + this.purchaseService.scan(this.order.recipient_address).subscribe( + response => { + this.button.setSuccess(); + this.order.status = response.status; + }, + error => this.button.setError(error), + ); + } + + removeOrder() { + window.localStorage.removeItem('purchaseOrder'); + this.order = null; + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + }); + + this.subscription = this.form.get('wallet').valueChanges.subscribe(filename => { + const wallet = this.wallets.find(wlt => wlt.filename === filename); + console.log('changing wallet value', filename); + this.purchaseService.generate(wallet).subscribe( + order => this.saveData(order), + error => this.snackBar.open(error.toString()), + ); + }); + } + + private loadConfig() { + this.purchaseService.config() + .filter(config => !!config && !!config.sky_btc_exchange_rate) + .first() + .subscribe(config => this.config = config); + } + + private loadData() { + this.loadConfig(); + this.loadOrder(); + + this.subscription.add(this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + + if (this.order) { + this.form.get('wallet').setValue(this.order.filename, { emitEvent: false }); + } + })); + } + + private loadOrder() { + const order: PurchaseOrder = JSON.parse(window.localStorage.getItem('purchaseOrder')); + if (order) { + this.order = order; + this.updateOrder(); + } + } + + private saveData(order: PurchaseOrder) { + this.order = order; + window.localStorage.setItem('purchaseOrder', JSON.stringify(order)); + } + + private updateOrder() { + this.purchaseService.scan(this.order.recipient_address).first().subscribe( + response => this.order.status = response.status, + error => console.log(error), + ); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html new file mode 100755 index 0000000..2e00da3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.html @@ -0,0 +1,57 @@ +
+
+
+
+ {{ 'wallet.new.create-title' | translate }} +
+
+

{{ 'wizard.wallet-desc' | translate }}

+
+
+
+
+
+ +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss new file mode 100755 index 0000000..410aaf9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.scss @@ -0,0 +1,67 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-toggle-container{ + margin: 10px auto; +} + +:host ::ng-deep .-buttons-footer button{ + margin: 2px 10px !important; +} + +.-text-align-center{ + text-align: center; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts new file mode 100755 index 0000000..e93dc61 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingCreateWalletComponent } from './onboarding-create-wallet.component'; + +describe('OnboardingCreateWalletComponent', () => { + let component: OnboardingCreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingCreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingCreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts new file mode 100755 index 0000000..e69e4af --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-create-wallet.component.ts @@ -0,0 +1,96 @@ +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; +import { OnboardingSafeguardComponent } from './onboarding-safeguard/onboarding-safeguard.component'; +import { MatDialogRef } from '@angular/material'; +import { ApiService } from '../../../../services/api.service'; + +@Component({ + selector: 'app-onboarding-create-wallet', + templateUrl: './onboarding-create-wallet.component.html', + styleUrls: ['./onboarding-create-wallet.component.scss'], +}) +export class OnboardingCreateWalletComponent implements OnInit { + @Input() fill = null; + @Output() onLabelAndSeedCreated = new EventEmitter<[string, string]>(); + form: FormGroup; + doubleButtonActive = DoubleButtonActive.LeftButton; + + constructor( + private dialog: MatDialog, + private apiService: ApiService, + private formBuilder: FormBuilder, + ) { } + + ngOnInit() { + this.initForm(); + } + + initForm() { + this.form = this.formBuilder.group( + { + label: new FormControl('', [Validators.required]), + seed: new FormControl('', [Validators.required]), + confirm_seed: new FormControl(), + }, + { + validator: this.showCreateForm ? this.seedMatchValidator.bind(this) : null, + }, + ); + + if (this.fill) { + this.form.get('label').setValue(this.fill['label']); + this.form.get('seed').setValue(this.fill['seed']); + this.form.get('confirm_seed').setValue(this.fill['seed']); + this.doubleButtonActive = this.fill['create'] ? DoubleButtonActive.LeftButton : DoubleButtonActive.RightButton; + } else if (this.showCreateForm) { + this.generateSeed(128); + } + } + + changeForm(newState) { + this.doubleButtonActive = newState; + this.fill = null; + this.initForm(); + } + + createWallet() { + this.showSafe().afterClosed().subscribe(result => { + if (result) { + this.emitCreatedData(); + } + }); + } + + loadWallet() { + this.emitCreatedData(); + } + + generateSeed(entropy: number) { + this.apiService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); + } + + get showCreateForm() { + return this.doubleButtonActive === DoubleButtonActive.LeftButton; + } + + private emitCreatedData() { + this.onLabelAndSeedCreated.emit([ + this.form.get('label').value, + this.form.get('seed').value, + this.doubleButtonActive === DoubleButtonActive.LeftButton, + ]); + } + + private seedMatchValidator(g: FormGroup) { + return g.get('seed').value === g.get('confirm_seed').value ? null : { NotEqual: true }; + } + + private showSafe(): MatDialogRef { + const config = new MatDialogConfig(); + config.width = '450px'; + + return this.dialog.open(OnboardingSafeguardComponent, config); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html new file mode 100755 index 0000000..980e908 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.html @@ -0,0 +1,15 @@ + +
+ {{ 'wizard.confirm.desc' | translate }} +
+ {{ 'wizard.confirm.checkbox' | translate }} + +
+
+
+ + {{ 'wizard.confirm.button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss new file mode 100755 index 0000000..555a015 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.scss @@ -0,0 +1,65 @@ +.-safe-description { + font-family: Skycoin; + line-height: 20px; + font-size: 12px; + + color: #1E2227; + mix-blend-mode: normal; + opacity: 0.8; +} + +.-check-container { + text-align: center; + margin-top: 50px; +} + +.-safe-check-text { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #1E2227; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: #0072FF !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } +} + +.-text-center { + text-align: center; +} + +.-no-bottom-margin ::ng-deep button { + margin: 28px 10px 0 10px !important; +} + +.-title { + font-family: Skycoin; + line-height: 30px; + font-size: 14px; + text-align: center; + letter-spacing: 0.0769231em; + color: #FF004E; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts new file mode 100755 index 0000000..39e1097 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingSafeguardComponent } from './onboarding-safeguard.component'; + +describe('OnboardingSafeguardComponent', () => { + let component: OnboardingSafeguardComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingSafeguardComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingSafeguardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts new file mode 100755 index 0000000..d4c7049 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-create-wallet/onboarding-safeguard/onboarding-safeguard.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { MatDialogRef } from '@angular/material/dialog'; + +@Component({ + selector: 'app-onboarding-safeguard', + templateUrl: './onboarding-safeguard.component.html', + styleUrls: ['./onboarding-safeguard.component.scss'], +}) +export class OnboardingSafeguardComponent { + public acceptSafe = false; + + constructor( + public dialogRef: MatDialogRef, + ) { } + + closePopup() { + this.dialogRef.close(this.acceptSafe); + } + + setAccept(event) { + this.acceptSafe = event.checked; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html new file mode 100755 index 0000000..714d665 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.html @@ -0,0 +1,43 @@ +
+
+
+
+ {{ 'wallet.new.encrypt-title' | translate }} +
+
+

{{ 'wizard.encrypt-desc' | translate }}

+
+
+
+
+
+ + + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+ +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss new file mode 100755 index 0000000..1536dcf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.scss @@ -0,0 +1,87 @@ +@import '../../../../../theme/variables'; + +.-header { + color: $white; + position: relative; + margin-top: 20px; + margin-bottom: 10px; + line-height: 30px; + font-size: 20px; + text-align: center; +} + +.-description { + line-height: 25px; + font-size: 14px; + text-align: center; + + color: $white; + mix-blend-mode: normal; + opacity: 0.5; +} + +.-buttons-footer { + align-items: center; + flex-flow: column; + margin-bottom: 20px; +} + +.-check-container { + margin: 10px auto; + text-align: center; +} + +:host ::ng-deep .-buttons-footer button { + margin: 2px 10px !important; +} + +.-text-align-center { + text-align: center; +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $white !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: #FBFBFB; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} + +.-input.disable{ + background: rgba(255, 255, 255, 0.1); +} + +.-hidden { + display: none; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts new file mode 100755 index 0000000..ae851bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingEncryptWalletComponent } from './onboarding-encrypt-wallet.component'; + +describe('OnboardingEncryptWalletComponent', () => { + let component: OnboardingEncryptWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingEncryptWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingEncryptWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts new file mode 100755 index 0000000..bdc9740 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding-encrypt-wallet/onboarding-encrypt-wallet.component.ts @@ -0,0 +1,65 @@ +import { Component, EventEmitter, OnInit, Output, ViewChild } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import { ButtonComponent } from '../../../layout/button/button.component'; + +@Component({ + selector: 'app-onboarding-encrypt-wallet', + templateUrl: './onboarding-encrypt-wallet.component.html', + styleUrls: ['./onboarding-encrypt-wallet.component.scss'], +}) +export class OnboardingEncryptWalletComponent implements OnInit { + @ViewChild('button') button: ButtonComponent; + @Output() onPasswordCreated = new EventEmitter(); + @Output() onBack = new EventEmitter(); + form: FormGroup; + + constructor( + private formBuilder: FormBuilder, + ) { } + + ngOnInit() { + this.initEncryptForm(); + } + + initEncryptForm() { + this.form = this.formBuilder.group({ + password: new FormControl('', Validators.compose([Validators.required, Validators.minLength(2)])), + confirm: new FormControl('', + Validators.compose([ + Validators.required, + Validators.minLength(2), + ]), + ), + }, + { + validator: this.passwordMatchValidator.bind(this), + }); + } + + setEncrypt(event) { + event.checked ? this.form.enable() : this.form.disable(); + } + + emitCreatedPassword() { + if ((this.form.enabled && !this.form.valid) || this.button.isLoading()) { + return; + } + + this.button.setLoading(); + + this.onPasswordCreated.emit(this.form.enabled ? this.form.get('password').value : null); + } + + emitBack() { + this.onBack.emit(); + } + + get isWorking() { + return this.button.isLoading(); + } + + private passwordMatchValidator(g: FormGroup) { + return g.get('password').value === g.get('confirm').value + ? null : { mismatch: true }; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html new file mode 100755 index 0000000..6254a17 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.html @@ -0,0 +1,11 @@ + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.scss new file mode 100755 index 0000000..e69de29 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts new file mode 100755 index 0000000..b41b460 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OnboardingComponent } from './onboarding.component'; + +describe('OnboardingComponent', () => { + let component: OnboardingComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OnboardingComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OnboardingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts new file mode 100755 index 0000000..23492bf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/onboarding/onboarding.component.ts @@ -0,0 +1,49 @@ +import { Component } from '@angular/core'; +import { Router } from '@angular/router'; +import { WalletService } from '../../../services/wallet.service'; + +@Component({ + selector: 'app-onboarding', + templateUrl: './onboarding.component.html', + styleUrls: ['./onboarding.component.scss'], +}) +export class OnboardingComponent { + step = 1; + label: string; + seed: string; + create: boolean; + password: string|null; + + constructor( + private router: Router, + private walletService: WalletService, + ) { } + + onLabelAndSeedCreated(data: [string, string, boolean]) { + this.label = data[0]; + this.seed = data[1]; + this.create = data[2]; + + this.step = 2; + } + + onPasswordCreated(password: string|null) { + this.password = password; + + this.createWallet(); + } + + onBack() { + this.step = 1; + } + + get fill() { + return this.label ? { label: this.label, seed: this.seed, create: this.create } : null; + } + + private createWallet() { + this.walletService.create(this.label, this.seed, 100, this.password).subscribe(() => { + this.router.navigate(['/wallets']); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html new file mode 100755 index 0000000..4294ae8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.html @@ -0,0 +1,114 @@ +
+
+ +
+ +
+
+ +
+ +
+ + + {{ addr.address }} - {{ addr.coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }} + ({{ addr.hours | number:'1.0-6' }} {{ 'common.coin-hours' | translate }}) + + +
+ {{ address.address }} - {{ address.coins | number:'1.0-6' }} {{ 'common.coin-id' | translate }} + ({{ address.hours | number:'1.0-6' }} {{ 'common.coin-hours' | translate }}) +
+
+
+
+
+ +
+ + +
+
+
+ +
+
+
+ + {{ 'common.coin-id' | translate }} +
+
+
+
+ + {{ 'common.coin-hours' | translate }} +
+
+
+ plus + minus +
+
+
+
+ +
+ + +
+ +
+
+
+ +
+ {{ 'send.hours-allocation-label' | translate }} + + {{ 'send.options-label' | translate }} keyboard_arrow_down + +
+
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss new file mode 100755 index 0000000..b20c963 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.scss @@ -0,0 +1,156 @@ +@import '../../../../../theme/variables'; + +.-input-addon { + display: flex; + + input { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + span { + border: 2px; + border-radius: 0 6px 6px 0; + background: #f1f1f1; + padding: 0 10px; + line-height: 44px; + color: $grey; + font-size: 14px; + flex-shrink: 0; + } +} + +.-destination { + &:not(:last-child) { + margin-bottom: 5px; + } + + .-icons { + text-align: right; + padding-top: 5px; + + img { + width: 32px; + cursor: pointer; + } + } +} + +mat-checkbox { + font-size: 12px; +} + +mat-select { + background: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + + ::ng-deep .mat-select-trigger { + padding: 10px 30px 10px 10px; + display: block; + font-size: 11px; + height: 100%; + line-height: 20px; + } + + ::ng-deep .mat-select-arrow { + border: none; + } +} + +mat-option ::ng-deep .mat-pseudo-checkbox-checked { + background: $gradient-blue-dark; +} + +.-autohours { + margin: 40px 0 20px; + + .-check ::ng-deep { + .mat-checkbox-checkmark-path { + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + + .mat-checkbox-label { + line-height: 20px; + font-size: 13px; + color: $grey-dark; + flex: 1; + } + + .-options { + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + + .mat-checkbox-layout { + display: flex; + } + } + + .-options-wrapper { + margin-top: 20px; + + mat-slider { + width: 100%; + padding: 0; + height: 40px; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + background: white; + + ::ng-deep { + .mat-slider-thumb, .mat-slider-thumb-label { + background-color: $gradient-blue-dark !important; + transform: scale(1) !important; + border-width: 0 !important; + } + + .mat-slider-thumb { + right: -6px; + width: 12px; + height: 32px; + border-radius: 3px; + } + + .mat-slider-track-fill, .mat-slider-track-background { + background-color: white !important; + } + } + } + } +} + +.-buttons { + text-align: center; +} + +.-hidden { + display: none; +} + +.-space-between { + display: flex; + justify-content: space-between; +} + +label mat-icon { + display: inline; + font-size: 14px; + color: lighten($grey, 40%); + vertical-align: text-bottom; + padding-left: 5px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts new file mode 100755 index 0000000..057bc47 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormAdvancedComponent } from './send-form-advanced.component'; + +describe('SendFormAdvancedComponent', () => { + let component: SendFormAdvancedComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormAdvancedComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormAdvancedComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts new file mode 100755 index 0000000..abb7590 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form-advanced/send-form-advanced.component.ts @@ -0,0 +1,335 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { MatDialog, MatSnackBar } from '@angular/material'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { showSnackbarError } from '../../../../utils/errors'; +import { Subscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; + +@Component({ + selector: 'app-send-form-advanced', + templateUrl: './send-form-advanced.component.html', + styleUrls: ['./send-form-advanced.component.scss'], +}) +export class SendFormAdvancedComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + form: FormGroup; + addresses = []; + autoHours = true; + autoOptions = false; + autoShareValue = '0.5'; + previewTx: boolean; + + private subscriptions: Subscription; + + constructor( + public walletService: WalletService, + private formBuilder: FormBuilder, + private dialog: MatDialog, + private snackbar: MatSnackBar, + private navbarService: NavBarService, + ) { } + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + addresses: ['', Validators.required], + changeAddress: [''], + destinations: this.formBuilder.array( + [this.createDestinationFormGroup()], + this.validateDestinations.bind(this), + ), + }); + + this.subscriptions = this.form.get('wallet').valueChanges.subscribe(wallet => { + this.addresses = wallet.addresses.filter(addr => addr.coins > 0); + this.form.get('addresses').setValue([]); + this.form.get('destinations').updateValueAndValidity(); + }); + + this.subscriptions.add(this.form.get('addresses').valueChanges.subscribe(() => { + this.form.get('destinations').updateValueAndValidity(); + })); + + if (this.formData) { + this.fillForm(); + } + } + + ngOnDestroy() { + this.subscriptions.unsubscribe(); + this.navbarService.hideSwitch(); + this.snackbar.dismiss(); + } + + preview() { + this.previewTx = true; + this.unlockAndSend(); + } + + send() { + this.previewTx = false; + this.unlockAndSend(); + } + + unlockAndSend() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.get('wallet').value.encrypted) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + this.createTransaction(); + } + } + + addDestination() { + const destinations = this.form.get('destinations') as FormArray; + destinations.push(this.createDestinationFormGroup()); + } + + removeDestination(index) { + const destinations = this.form.get('destinations') as FormArray; + destinations.removeAt(index); + } + + setShareValue(event) { + this.autoShareValue = parseFloat(event.value).toFixed(2); + } + + toggleOptions(event) { + event.stopPropagation(); + event.preventDefault(); + + this.autoOptions = !this.autoOptions; + } + + setAutoHours(event) { + this.autoHours = event.checked; + this.form.get('destinations').updateValueAndValidity(); + + if (!this.autoHours) { + this.autoOptions = false; + } + } + + private fillForm() { + this.addresses = this.formData.form.wallet.addresses; + + ['wallet', 'addresses', 'changeAddress'].forEach(name => { + this.form.get(name).setValue(this.formData.form[name]); + }); + + for (let i = 0; i < this.formData.form.destinations.length - 1; i++) { + this.addDestination(); + } + + this.destControls.forEach((destControl, i) => { + ['address', 'coins', 'hours'].forEach(name => { + destControl.get(name).setValue(this.formData.form.destinations[i][name]); + }); + }); + + if (this.formData.form.hoursSelection.type === 'auto') { + this.autoShareValue = this.formData.form.hoursSelection.share_factor; + this.autoHours = true; + } else { + this.autoHours = false; + } + + this.autoOptions = this.formData.form.autoOptions; + } + + addressCompare(a, b) { + return a.address === b.address; + } + + get destControls() { + return (this.form.get('destinations') as FormArray).controls; + } + + private validateDestinations() { + if (!this.form || !Array.isArray(this.form.get('addresses').value)) { + return { Required: true }; + } + + const invalidInput = this.destControls.find(control => { + const checkControls = ['coins']; + + if (!this.autoHours) { + checkControls.push('hours'); + } + + return checkControls.map(name => { + const value = control.get(name).value !== undefined + ? control.get(name).value.replace(' ', '=') + : ''; + + if (isNaN(value) || value.trim() === '') { + return true; + } + + if (parseFloat(value) <= 0) { + return true; + } + + if (name === 'coins') { + const parts = value.split('.'); + + if (parts.length === 2 && parts[1].length > 6) { + return true; + } + } else if (name === 'hours') { + if (value < 1 || parseInt(value, 10) !== parseFloat(value)) { + return true; + } + } + + return false; + }).find(e => e === true); + }); + + if (invalidInput) { + return { Invalid: true }; + } + + const coins = this.form.get('addresses').value.reduce((a, b) => a + b.coins, 0); + const hours = this.form.get('addresses').value.reduce((a, b) => a + b.hours, 0); + const destinationsCoins = this.destControls.reduce((a, b) => a + parseFloat(b.value.coins), 0); + const destinationsHours = this.destControls.reduce((a, b) => a + parseInt(b.value.hours, 10), 0); + + if (destinationsCoins > coins || destinationsHours > hours) { + return { Invalid: true }; + } + + return null; + } + + private createDestinationFormGroup() { + return this.formBuilder.group({ + address: '', + coins: '', + hours: '', + }); + } + + private createTransaction(passwordDialog?: any) { + if (passwordDialog) { + passwordDialog.close(); + } + + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + + this.walletService.createTransaction( + this.form.get('wallet').value, + this.form.get('addresses').value.map(addr => addr.address), + this.destinations, + this.hoursSelection, + this.form.get('changeAddress').value ? this.form.get('changeAddress').value : null, + passwordDialog ? passwordDialog.password : null, + ) + .toPromise() + .then(transaction => { + if (!this.previewTx) { + return this.walletService.injectTransaction(transaction.encoded).toPromise(); + } + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.get('wallet').value, + addresses: this.form.get('addresses').value, + changeAddress: this.form.get('changeAddress').value, + destinations: this.destinations, + hoursSelection: this.hoursSelection, + autoOptions: this.autoOptions, + }, + amount: this.destinations.reduce((a, b) => a + parseFloat(b.coins), 0), + to: this.destinations.map(d => d.address), + transaction, + }); + }) + .then(() => { + this.sendButton.setSuccess(); + this.resetForm(); + + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + }) + .catch(error => { + showSnackbarError(this.snackbar, error); + + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + }); + } + + private resetForm() { + this.form.get('wallet').setValue('', { emitEvent: false }); + this.form.get('addresses').setValue([]); + this.form.get('changeAddress').setValue(''); + + while (this.destControls.length > 0) { + (this.form.get('destinations') as FormArray).removeAt(0); + } + + this.addDestination(); + + this.autoHours = true; + this.autoOptions = false; + this.autoShareValue = '0.5'; + } + + private get destinations() { + return this.destControls.map(destControl => { + const destination = { + address: destControl.get('address').value, + coins: destControl.get('coins').value, + }; + + if (!this.autoHours) { + destination['hours'] = destControl.get('hours').value; + } + + return destination; + }); + } + + private get hoursSelection() { + let hoursSelection = { + type: 'manual', + }; + + if (this.autoHours) { + hoursSelection = { + type: 'auto', + mode: 'share', + share_factor: this.autoShareValue, + }; + } + + return hoursSelection; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html new file mode 100755 index 0000000..ea489c8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.html @@ -0,0 +1,28 @@ +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ + {{ 'send.preview-button' | translate }} + + + {{ 'send.send-button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss new file mode 100755 index 0000000..079dcb6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.scss @@ -0,0 +1,3 @@ +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts new file mode 100755 index 0000000..40e927e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendFormComponent } from './send-form.component'; + +describe('SendFormComponent', () => { + let component: SendFormComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendFormComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendFormComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts new file mode 100755 index 0000000..1901079 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-form/send-form.component.ts @@ -0,0 +1,188 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; +import 'rxjs/add/operator/delay'; +import 'rxjs/add/operator/filter'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { MatDialog, MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; + +@Component({ + selector: 'app-send-form', + templateUrl: './send-form.component.html', + styleUrls: ['./send-form.component.scss'], +}) +export class SendFormComponent implements OnInit, OnDestroy { + @ViewChild('previewButton') previewButton: ButtonComponent; + @ViewChild('sendButton') sendButton: ButtonComponent; + @Input() formData: any; + @Output() onFormSubmitted = new EventEmitter(); + + form: FormGroup; + transactions = []; + previewTx: boolean; + + private subscription: ISubscription; + + constructor( + public formBuilder: FormBuilder, + public walletService: WalletService, + private dialog: MatDialog, + private snackbar: MatSnackBar, + private navbarService: NavBarService, + ) {} + + ngOnInit() { + this.navbarService.showSwitch('send.simple', 'send.advanced'); + this.initForm(); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + this.navbarService.hideSwitch(); + this.snackbar.dismiss(); + } + + preview() { + this.previewTx = true; + this.unlockAndSend(); + } + + send() { + this.previewTx = false; + this.unlockAndSend(); + } + + private unlockAndSend() { + if (!this.form.valid || this.previewButton.isLoading() || this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.previewButton.resetState(); + this.sendButton.resetState(); + + if (this.form.value.wallet.encrypted) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.createTransaction(passwordDialog); + }); + } else { + this.createTransaction(); + } + } + + private createTransaction(passwordDialog?: any) { + if (passwordDialog) { + passwordDialog.close(); + } + + if (this.previewTx) { + this.previewButton.setLoading(); + this.sendButton.setDisabled(); + } else { + this.sendButton.setLoading(); + this.previewButton.setDisabled(); + } + + this.walletService.createTransaction( + this.form.value.wallet, + null, + [{ + address: this.form.value.address, + coins: this.form.value.amount, + }], + { + type: 'auto', + mode: 'share', + share_factor: '0.5', + }, + null, + passwordDialog ? passwordDialog.password : null, + ) + .toPromise() + .then(transaction => { + if (!this.previewTx) { + return this.walletService.injectTransaction(transaction.encoded).toPromise(); + } + + this.onFormSubmitted.emit({ + form: { + wallet: this.form.value.wallet, + address: this.form.value.address, + amount: this.form.value.amount, + }, + amount: this.form.value.amount, + to: [this.form.value.address], + transaction, + }); + }) + .then(() => { + this.sendButton.setSuccess(); + this.resetForm(); + + setTimeout(() => { + this.sendButton.resetState(); + }, 3000); + }) + .catch(error => { + showSnackbarError(this.snackbar, error); + + this.previewButton.resetState().setEnabled(); + this.sendButton.resetState().setEnabled(); + }); + } + + private initForm() { + this.form = this.formBuilder.group({ + wallet: ['', Validators.required], + address: ['', Validators.required], + amount: ['', Validators.required], + }); + + this.subscription = this.form.get('wallet').valueChanges.subscribe(value => { + const balance = value && value.coins ? value.coins : 0; + + this.form.get('amount').setValidators([ + Validators.required, + Validators.max(balance), + this.validateAmount, + ]); + + this.form.get('amount').updateValueAndValidity(); + }); + + if (this.formData) { + Object.keys(this.form.controls).forEach(control => { + this.form.get(control).setValue(this.formData.form[control]); + }); + } + } + + private validateAmount(amountControl: FormControl) { + if (isNaN(amountControl.value.replace(' ', '='))) { + return { Invalid: true }; + } + + if (parseFloat(amountControl.value) <= 0) { + return { Invalid: true }; + } + + const parts = amountControl.value.split('.'); + + if (parts.length === 2 && parts[1].length > 6) { + return { Invalid: true }; + } + + return null; + } + + private resetForm() { + this.form.get('wallet').setValue(''); + this.form.get('address').setValue(''); + this.form.get('amount').setValue(''); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html new file mode 100755 index 0000000..0ba12a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.html @@ -0,0 +1,9 @@ + + +
+ {{ 'send.back-button' | translate }} + {{ 'send.send-button' | translate }} +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss new file mode 100755 index 0000000..4bf1cca --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.scss @@ -0,0 +1,4 @@ +.-buttons { + margin-top: 10px; + text-align: center; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts new file mode 100755 index 0000000..63db508 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendVerifyComponent } from './send-preview.component'; + +describe('SendVerifyComponent', () => { + let component: SendVerifyComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendVerifyComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendVerifyComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts new file mode 100755 index 0000000..a87f64a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/send-preview.component.ts @@ -0,0 +1,58 @@ +import { Component, EventEmitter, Input, OnDestroy, Output, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { PreviewTransaction } from '../../../../app.datatypes'; + +@Component({ + selector: 'app-send-preview', + templateUrl: './send-preview.component.html', + styleUrls: ['./send-preview.component.scss'], +}) +export class SendVerifyComponent implements OnDestroy { + @ViewChild('sendButton') sendButton: ButtonComponent; + @ViewChild('backButton') backButton: ButtonComponent; + @Input() transaction: PreviewTransaction; + @Output() onBack = new EventEmitter(); + + constructor( + private walletService: WalletService, + private snackbar: MatSnackBar, + ) {} + + ngOnDestroy() { + this.snackbar.dismiss(); + } + + send() { + if (this.sendButton.isLoading()) { + return; + } + + this.snackbar.dismiss(); + this.sendButton.resetState(); + this.sendButton.setLoading(); + this.backButton.setDisabled(); + + this.walletService.injectTransaction(this.transaction.encoded).subscribe(() => { + this.sendButton.setSuccess(); + this.sendButton.setDisabled(); + + this.walletService.startDataRefreshSubscription(); + + setTimeout(() => { + this.onBack.emit(true); + }, 3000); + }, error => { + showSnackbarError(this.snackbar, error); + + this.sendButton.setError(error); + this.backButton.setEnabled(); + }); + } + + back() { + this.onBack.emit(false); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html new file mode 100755 index 0000000..bd5d440 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.html @@ -0,0 +1,82 @@ +
+
+

{{ 'tx.confirm-transaction' | translate }}

+

{{ 'tx.transaction' | translate }}

+ + +
+ {{ 'tx.from' | translate }}: {{ transaction.from }} +
+
+ {{ 'tx.to' | translate }}: {{ transaction.to.join(', ') }} +
+
+ +
+ {{ 'tx.date' | translate }}: {{ transaction.timestamp * 1000 | date:'short' }} +
+
+ {{ 'tx.status' | translate }}: {{ (transaction.confirmed ? 'tx.confirmed' : 'tx.pending') | translate }} +
+
+
+ {{ 'tx.hours' | translate }}: + {{ transaction.hoursSent | number:'1.0-6' }} {{ 'tx.hours-sent' | translate }} + | + {{ transaction.hoursBurned | number:'1.0-6' }} {{ 'tx.hours-burned' | translate }} +
+
+ {{ 'tx.id' | translate }}: {{ transaction.txid }} +
+
+
+
+ +
+

{{ transaction.balance | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+ + {{ 'tx.show-more' | translate }} keyboard_arrow_down + +
+
+ +
+

{{ 'tx.inputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? input.address : input.owner }}
+
+ {{ 'tx.coins' | translate }}: {{ input.coins | number:'1.0-6' }} +
+
+ {{ 'tx.hours' | translate }}: {{ input.calculated_hours | number:'1.0-6' }} +
+
+
+
+
+

{{ 'tx.outputs' | translate }}

+ +
+
{{ i + 1 }}
+
+
{{ isPreview ? output.address : output.dst }}
+
+ {{ 'tx.coins' | translate }}: {{ output.coins | number:'1.0-6' }} +
+
+ {{ 'tx.hours' | translate }}: {{ output.hours | number:'1.0-6' }} +
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss new file mode 100755 index 0000000..87aa5d3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.scss @@ -0,0 +1,108 @@ +@import '../../../../../../theme/variables'; + +h4 { + font-size: 14px; + margin: 0 0 30px; +} + +.-item { + display: flex; + font-size: 13px; + + &:not(:last-child) { + margin-bottom: 10px; + } + + .-number { + padding: 10px; + background: $grey-lightest; + align-self: flex-start; + border-radius: 10px; + } + + .-info { + margin-left: 10px; + display: flex; + flex-direction: column; + + .-address { + padding: 10px 0; + margin-bottom: 5px; + } + } +} + +.-data { + font-size: 12px; + + &:not(:last-child) { + margin-bottom: 5px; + } + + span:first-child { + color: $grey; + display: inline-block; + width: 60px; + } + + &.-more { + margin-bottom: 0 !important; + + span { + width: auto !important; + margin-top: 30px; + color: $gradient-blue-dark; + cursor: pointer; + + mat-icon { + display: inline; + vertical-align: middle; + font-size: 13px; + } + } + } +} + +.-tx-meta { + .-data:not(:last-child) { + margin-bottom: 10px; + } +} + +.-tx-price { + text-align: center; + display: flex; + flex-direction: column; + justify-content: flex-end; + + .-icon { + &.-incoming { + transform: rotate(180deg); + } + + img { + width: 30px; + } + } + + h4 { + color: $grey-dark; + font-size: 16px; + font-weight: 700; + margin: 10px 0 5px; + } + + p { + color: $grey; + font-size: 12px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } +} + +.-margin-top { + margin-top: 30px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts new file mode 100755 index 0000000..1637b8c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionInfoComponent } from './transaction-info.component'; + +describe('TransactionInfoComponent', () => { + let component: TransactionInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionInfoComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionInfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts new file mode 100755 index 0000000..1f7b7fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-preview/transaction-info/transaction-info.component.ts @@ -0,0 +1,41 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { PreviewTransaction, Transaction } from '../../../../../app.datatypes'; +import { PriceService } from '../../../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-transaction-info', + templateUrl: './transaction-info.component.html', + styleUrls: ['./transaction-info.component.scss'], +}) +export class TransactionInfoComponent implements OnInit, OnDestroy { + @Input() transaction: Transaction; + @Input() isPreview: boolean; + price: number; + showInputsOutputs = false; + + private subscription: ISubscription; + + constructor(private priceService: PriceService) { + this.subscription = this.priceService.price.subscribe(price => this.price = price); + } + + ngOnInit() { + if (this.isPreview) { + this.transaction.hoursSent = this.transaction.outputs + .filter(o => ( this.transaction).to.find(addr => addr === o.address)) + .map(o => parseInt(o.hours, 10)) + .reduce((a, b) => a + b, 0); + } + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + toggleInputsOutputs(event) { + event.preventDefault(); + + this.showInputsOutputs = !this.showInputsOutputs; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html new file mode 100755 index 0000000..1acadd8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.html @@ -0,0 +1,20 @@ + +
+
+ + + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss new file mode 100755 index 0000000..c253bbf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.scss @@ -0,0 +1,11 @@ +.-buttons { + text-align: center; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 30px; + margin: 30px; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts new file mode 100755 index 0000000..97248ad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SendSkycoinComponent } from './send-skycoin.component'; + +describe('SendSkycoinComponent', () => { + let component: SendSkycoinComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SendSkycoinComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SendSkycoinComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts new file mode 100755 index 0000000..daec923 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/send-skycoin/send-skycoin.component.ts @@ -0,0 +1,54 @@ +import { Component, OnDestroy } from '@angular/core'; +import { NavBarService } from '../../../services/nav-bar.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { DoubleButtonActive } from '../../layout/double-button/double-button.component'; + +@Component({ + selector: 'app-send-skycoin', + templateUrl: './send-skycoin.component.html', + styleUrls: ['./send-skycoin.component.scss'], +}) +export class SendSkycoinComponent implements OnDestroy { + showForm = true; + formData: any; + activeForm: DoubleButtonActive; + activeForms = DoubleButtonActive; + + private subscription: ISubscription; + + constructor( + private navbarService: NavBarService, + ) { + this.subscription = navbarService.activeComponent.subscribe(value => { + this.activeForm = value; + this.formData = null; + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } + + onFormSubmitted(data) { + this.formData = data; + this.showForm = false; + } + + onBack(deleteFormData) { + if (deleteFormData) { + this.formData = null; + } + + this.showForm = true; + } + + get transaction() { + const transaction = this.formData.transaction; + + transaction.from = this.formData.form.wallet.label; + transaction.to = this.formData.to; + transaction.balance = this.formData.amount; + + return transaction; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html new file mode 100755 index 0000000..2af4b72 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.html @@ -0,0 +1,36 @@ +
+ + +
+
+

{{ 'backup.wallet-directory' | translate }} {{ folder }}

+

{{ 'backup.seed-warning' | translate }}

+

+ +

+
+ + + +
+
+
{{ 'backup.wallet' | translate }}
+
{{ 'backup.filename' | translate }}
+
+
+
+
+
{{ wallet.label }}
+
{{ wallet.filename }}
+
+ {{ 'backup.show-seed' | translate }} +
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss new file mode 100755 index 0000000..99c14b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.scss @@ -0,0 +1,39 @@ +@import '../../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; + margin: 30px 30px 0; + + p { + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } +} + +.-text-muted { + color: $grey; +} + +.-text-right { + text-align: right; +} + +.-link { + color: $blue; + cursor: pointer; +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts new file mode 100755 index 0000000..e7e4b77 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BackupComponent } from './backup.component'; + +describe('BackupComponent', () => { + let component: BackupComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BackupComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BackupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts new file mode 100755 index 0000000..88bf75f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/backup.component.ts @@ -0,0 +1,53 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { Wallet } from '../../../../app.datatypes'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { SeedModalComponent } from './seed-modal/seed-modal.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; + +@Component({ + selector: 'app-backup', + templateUrl: './backup.component.html', + styleUrls: ['./backup.component.scss'], +}) +export class BackupComponent implements OnInit, OnDestroy { + folder: string; + wallets: Wallet[] = []; + + private walletSubscription; + + constructor( + public walletService: WalletService, + private dialog: MatDialog, + ) {} + + ngOnInit() { + this.walletService.folder().subscribe(folder => this.folder = folder); + + this.walletSubscription = this.walletService.all().subscribe(wallets => { + this.wallets = wallets; + }); + } + + ngOnDestroy() { + this.walletSubscription.unsubscribe(); + } + + get onlyEncrypted() { + return this.wallets.filter(wallet => wallet.encrypted); + } + + showSeed(wallet: Wallet) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.getWalletSeed(wallet, passwordDialog.password).subscribe(seed => { + passwordDialog.close(); + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { seed }; + + this.dialog.open(SeedModalComponent, config); + }, err => passwordDialog.error(err)); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css new file mode 100755 index 0000000..079dcb6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.css @@ -0,0 +1,3 @@ +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html new file mode 100755 index 0000000..12e4121 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.html @@ -0,0 +1,11 @@ + +
+ + +
+
+ + {{ 'backup.close-button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts new file mode 100755 index 0000000..e269ec5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SeedModalComponent } from './seed-modal.component'; + +describe('SeedModalComponent', () => { + let component: SeedModalComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ SeedModalComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(SeedModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts new file mode 100755 index 0000000..749726e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/backup/seed-modal/seed-modal.component.ts @@ -0,0 +1,18 @@ +import { Component, Inject, OnDestroy } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'app-seed-modal', + templateUrl: './seed-modal.component.html', + styleUrls: ['./seed-modal.component.css'], +}) +export class SeedModalComponent implements OnDestroy { + constructor( + @Inject(MAT_DIALOG_DATA) public data: any, + public dialogRef: MatDialogRef, + ) {} + + ngOnDestroy() { + this.data.seed = null; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html new file mode 100755 index 0000000..53a4ed9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.html @@ -0,0 +1,52 @@ +
+ + + + +
+
+
+
+
+
{{ 'blockchain.blocks' | translate }}
+
{{ block.header.seq | number }}
+
+
+
{{ 'blockchain.time' | translate }}
+
{{ block.header.timestamp | dateTime }}
+
+
+
{{ 'blockchain.hash' | translate }}
+
{{ block.header.block_hash }}
+
+
+
+
+
+
+
+
+
{{ 'blockchain.current-supply' | translate }}
+
{{ coinSupply.current_supply | number }}
+
+
+
{{ 'blockchain.total-supply' | translate }}
+
{{ coinSupply.total_supply | number }}
+
+
+
+
+
{{ 'blockchain.current-coinhour-supply' | translate }}
+
{{ coinSupply.current_coinhour_supply | number }}
+
+
+
{{ 'blockchain.total-coinhour-supply' | translate }}
+
{{ coinSupply.total_coinhour_supply | number }}
+
+
+
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss new file mode 100755 index 0000000..eeb3316 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.scss @@ -0,0 +1,28 @@ +@import '../../../../../theme/variables'; + +.-wrapper { + margin: 30px; +} + +.-paper { + background-color: #fbfbfb; + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + padding: 20px; + font-size: $font-size-standard; +} + +.-item { + &:not(:last-child) { + margin-bottom: 20px; + } + + .-key { + color: $grey; + margin-bottom: 5px; + } + + .-value { + word-break: break-all; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts new file mode 100755 index 0000000..e868709 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { BlockchainComponent } from './blockchain.component'; + +describe('BlockchainComponent', () => { + let component: BlockchainComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ BlockchainComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(BlockchainComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts new file mode 100755 index 0000000..38643fc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/blockchain/blockchain.component.ts @@ -0,0 +1,21 @@ +import { Component, OnInit } from '@angular/core'; +import { BlockchainService } from '../../../../services/blockchain.service'; + +@Component({ + selector: 'app-blockchain', + templateUrl: './blockchain.component.html', + styleUrls: ['./blockchain.component.scss'], +}) +export class BlockchainComponent implements OnInit { + block: any; + coinSupply: any; + + constructor( + private blockchainService: BlockchainService, + ) { } + + ngOnInit() { + this.blockchainService.lastBlock().subscribe(block => this.block = block); + this.blockchainService.coinSupply().subscribe(coinSupply => this.coinSupply = coinSupply); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html new file mode 100755 index 0000000..424b602 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.html @@ -0,0 +1,40 @@ +
+ + + + +
+
+
+
+
{{ 'network.peer' | translate }}
+
{{ 'network.source' | translate }}
+
{{ 'network.block-height' | translate }}
+
{{ 'network.last-seen' | translate }}
+
+
+
+
+ +
+
+ {{ peer.address.split(':')[0] }}:{{ peer.listen_port }} +
+
{{ ('network.sources.' + peer.source) | translate }}
+
{{ peer.height }}
+
+
+ keyboard_arrow_up + {{ peer.last_sent | dateFromNow }} +
+
+ keyboard_arrow_down + {{ peer.last_received | dateFromNow }} +
+
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss new file mode 100755 index 0000000..8ee46bf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.scss @@ -0,0 +1,50 @@ +@import '../../../../../theme/variables'; + +.-port, .-last-seen, .-source { + color: $grey; +} + +.-direction { + width: 72px; + display: flex; + justify-content: center; + align-items: center; + + img { + width: 32px; + + &.-incoming { + transform: scaleX(-1); + } + } +} + +.-last-seen { + display: flex; + flex-direction: column; + font-size: 12px; + line-height: 1; + justify-content: center; + + mat-icon { + font-size: 12px; + display: inline; + vertical-align: middle; + padding-right: 5px; + } +} + +.-trusted { + display: inline; + color: $blue; + font-size: 13px; + vertical-align: middle; +} + +.-text-right { + text-align: right; +} + +.-pl-0 { + padding-left: 0 !important; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts new file mode 100755 index 0000000..c1175d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NetworkComponent } from './network.component'; + +describe('NetworkComponent', () => { + let component: NetworkComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ NetworkComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(NetworkComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts new file mode 100755 index 0000000..b2e5a47 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/network/network.component.ts @@ -0,0 +1,34 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { NetworkService } from '../../../../services/network.service'; +import { ISubscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'app-network', + templateUrl: './network.component.html', + styleUrls: ['./network.component.scss'], +}) +export class NetworkComponent implements OnInit, OnDestroy { + peers: any; + + private subscription: ISubscription; + + constructor( + public networkService: NetworkService, + ) { } + + ngOnInit() { + this.networkService.retrieveDefaultConnections().subscribe(trusted => { + this.subscription = this.networkService.automatic().first().subscribe(peers => { + this.peers = peers.map(peer => { + peer.source = trusted.find(p => p.address === peer.address) ? 'default' : 'exchange'; + + return peer; + }).sort((a, b) => a.address.localeCompare(b.address)); + }); + }); + } + + ngOnDestroy() { + this.subscription.unsubscribe(); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html new file mode 100755 index 0000000..3cb07b9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.html @@ -0,0 +1,34 @@ +
+ + + + +
+
+
+
{{ wallet.label }}
+
{{ 'common.coin-id' | translate }}
+
{{ 'common.coin-hours' | translate }}
+
+
+ +
+
+ + {{ address.address }} +
+
+
+
{{ output.hash }}
+
{{ output.coins | number:'1.0-6' }}
+
{{ output.calculated_hours | number:'1.0-6' }}
+
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss new file mode 100755 index 0000000..b58dced --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.scss @@ -0,0 +1,34 @@ +@import '../../../../../theme/variables'; + +.-text-right { + text-align: right; +} + +.-grey { + color: $grey; +} + +.-row.-small { + height: $row-height / 1.5; + line-height: $row-height / 1.5; +} + +.-hash { + margin-left: 27px; +} + +.-address { + color: $grey; + + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; + } +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts new file mode 100755 index 0000000..6f43161 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { OutputsComponent } from './outputs.component'; + +describe('OutputsComponent', () => { + let component: OutputsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ OutputsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(OutputsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts new file mode 100755 index 0000000..1d59cf9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/outputs/outputs.component.ts @@ -0,0 +1,57 @@ +import { Component, OnDestroy } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { ActivatedRoute } from '@angular/router'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material'; +import { QrCodeComponent } from '../../../layout/qr-code/qr-code.component'; + +@Component({ + selector: 'app-outputs', + templateUrl: './outputs.component.html', + styleUrls: ['./outputs.component.scss'], +}) +export class OutputsComponent implements OnDestroy { + wallets: any[]|null; + + private outputsSubscription: ISubscription; + + constructor( + public walletService: WalletService, + private route: ActivatedRoute, + private dialog: MatDialog, + ) { + route.queryParams.subscribe(params => this.loadData(params)); + } + + ngOnDestroy() { + this.outputsSubscription.unsubscribe(); + } + + loadData(params) { + const addr = params['addr']; + + this.wallets = null; + this.outputsSubscription = this.walletService.outputsWithWallets().subscribe(wallets => { + this.wallets = wallets + .map(wallet => Object.assign({}, wallet)) + .map(wallet => { + wallet.addresses = wallet.addresses.filter(address => { + if (address.outputs.length > 0) { + return addr ? address.address === addr : true; + } + }); + + return wallet; + }) + .filter(wallet => wallet.addresses.length > 0); + }); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config = new MatDialogConfig(); + config.data = { address }; + this.dialog.open(QrCodeComponent, config); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html new file mode 100755 index 0000000..ef9f5b5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.html @@ -0,0 +1,26 @@ +
+ + + + +
+
+
+
{{ 'pending-txs.txid' | translate }}
+
{{ 'common.coin-id' | translate }}
+
{{ 'pending-txs.timestamp' | translate }}
+
+
+
+
{{ tx.txid }}
+
{{ tx.amount | number:'1.0-6' }}
+
{{ tx.timestamp | dateTime }}
+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss new file mode 100755 index 0000000..1e655ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.scss @@ -0,0 +1,5 @@ +@import '../../../../../theme/variables'; + +.-timestamp { + color: $grey; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts new file mode 100755 index 0000000..9b19aaa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PendingTransactionsComponent } from './pending-transactions.component'; + +describe('PendingTransactionsComponent', () => { + let component: PendingTransactionsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PendingTransactionsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PendingTransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts new file mode 100755 index 0000000..2103323 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/settings/pending-transactions/pending-transactions.component.ts @@ -0,0 +1,70 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import * as moment from 'moment'; +import { ISubscription } from 'rxjs/Subscription'; +import { NavBarService } from '../../../../services/nav-bar.service'; +import { DoubleButtonActive } from '../../../layout/double-button/double-button.component'; + +@Component({ + selector: 'app-pending-transactions', + templateUrl: './pending-transactions.component.html', + styleUrls: ['./pending-transactions.component.scss'], +}) +export class PendingTransactionsComponent implements OnInit, OnDestroy { + transactions = null; + + private transactionsSubscription: ISubscription; + private navbarSubscription: ISubscription; + + constructor( + public walletService: WalletService, + private navbarService: NavBarService, + ) { + this.navbarSubscription = this.navbarService.activeComponent.subscribe(value => { + this.loadTransactions(value); + }); + } + + ngOnInit() { + this.navbarService.showSwitch('pending-txs.my', 'pending-txs.all'); + } + + ngOnDestroy() { + this.transactionsSubscription.unsubscribe(); + this.navbarSubscription.unsubscribe(); + this.navbarService.hideSwitch(); + } + + private loadTransactions(value) { + const method = value === DoubleButtonActive.LeftButton ? 'pendingTransactions' : 'allPendingTransactions'; + + this.transactions = null; + + if (this.transactionsSubscription) { + this.transactionsSubscription.unsubscribe(); + } + + if (method === 'pendingTransactions') { + this.walletService.startDataRefreshSubscription(); + } + + this.transactionsSubscription = this.walletService[method]().subscribe(transactions => { + this.transactions = this.mapTransactions(transactions); + }); + } + + private mapTransactions(transactions) { + return transactions.map(transaction => { + transaction.transaction.timestamp = moment(transaction.received).unix(); + + return transaction.transaction; + }) + .map(transaction => { + transaction.amount = transaction.outputs + .map(output => output.coins >= 0 ? output.coins : 0) + .reduce((a , b) => a + parseFloat(b), 0); + + return transaction; + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html new file mode 100755 index 0000000..c5b10af --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.html @@ -0,0 +1,11 @@ +
+ {{ 'history.tx-detail' | translate }} +
+
+ + + +
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss new file mode 100755 index 0000000..b007799 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.scss @@ -0,0 +1,21 @@ +.-container { + padding: 24px; + background-color: #fbfbfb; +} + +.-header { + background-color: #f7f7f7; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + line-height: 50px; + position: relative; + text-align: center; + + img { + cursor: pointer; + height: 32px; + position: absolute; + right: 9px; + top: 9px; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts new file mode 100755 index 0000000..45138c8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionDetailComponent } from './transaction-detail.component'; + +describe('TransactionDetailComponent', () => { + let component: TransactionDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts new file mode 100755 index 0000000..60591d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-detail/transaction-detail.component.ts @@ -0,0 +1,19 @@ +import { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { NormalTransaction } from '../../../../app.datatypes'; + +@Component({ + selector: 'app-transaction-detail', + templateUrl: './transaction-detail.component.html', + styleUrls: ['./transaction-detail.component.scss'], +}) +export class TransactionDetailComponent { + constructor( + @Inject(MAT_DIALOG_DATA) public transaction: NormalTransaction, + public dialogRef: MatDialogRef, + ) {} + + closePopup() { + this.dialogRef.close(); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html new file mode 100755 index 0000000..67f5ab1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.html @@ -0,0 +1,46 @@ + +
+ + +
+ +
+
+ +
+
+

+ {{ 'history.sent' | translate }} {{ 'common.coin-id' | translate }} + {{ transaction.timestamp * 1000 | date:'short' }} +

+

+ {{ 'history.sending' | translate }} {{ 'common.coin-id' | translate }} + {{ 'history.pending' | translate }} +

+

+ {{ 'history.received' | translate }} {{ 'common.coin-id' | translate }} + {{ transaction.timestamp * 1000 | date:'short' }} +

+

+ {{ 'history.receiving' | translate }} {{ 'common.coin-id' | translate }} + {{ 'history.pending' | translate }} +

+
+ + {{ address }} +
+
+
+

{{ transaction.balance | number:'1.0-6' }} {{ 'common.coin-id' | translate }}

+

+ {{ transaction.balance * price | currency:'USD':'symbol':'1.2-2' }}* +

+
+
+
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss new file mode 100755 index 0000000..e00d378 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.scss @@ -0,0 +1,125 @@ +@import '../../../../theme/variables'; + +.-paper { + background-color: #fbfbfb; + border-radius: 10px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 30px; +} + +.-transaction { + background-color: $white; + border-bottom: 1px solid #eff0f0; + cursor: pointer; + display: flex; + padding: 20px 12px; + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 8px; + } + + .-icon { + margin-top: 5px; + + img { + width: 32px; + } + + &.-incoming { + -moz-transform: scaleX(-1); + -o-transform: scaleX(-1); + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; + } + + &.-pending { + opacity: 0.5; + } + } + + .-address { + flex: 1; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + + span { + font-size: 10px; + line-height: 12px; + padding-left: 5px; + font-weight: 300; + } + + .-pending { + color: #FDB51E; + } + + .-timestamp { + color: $grey; + } + } + + .-item { + &:not(:last-child) { + margin-bottom: 5px; + } + + img { + display: inline-block; + height: 17px; + vertical-align: middle; + width: 17px; + margin-right: 4px; + } + + span { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + } + } + } + + .-balance { + width: 200px; + text-align: right; + + h4 { + color: #1e2227; + font-size: 13px; + font-weight: 700; + line-height: 15px; + margin: 0 0 8px 0; + } + + p { + color: rgba(30, 34, 39, 0.5); + display: inline-block; + font-size: 13px; + line-height: 15px; + margin: 0; + + span { + color: lighten($grey, 40%); + } + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts new file mode 100755 index 0000000..2b4a9a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TransactionListComponent } from './transaction-list.component'; + +describe('TransactionListComponent', () => { + let component: TransactionListComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TransactionListComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TransactionListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts new file mode 100755 index 0000000..a5ec02a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/transaction-list/transaction-list.component.ts @@ -0,0 +1,50 @@ +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { PriceService } from '../../../services/price.service'; +import { ISubscription } from 'rxjs/Subscription'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { TransactionDetailComponent } from './transaction-detail/transaction-detail.component'; +import { NormalTransaction } from '../../../app.datatypes'; +import { QrCodeComponent } from '../../layout/qr-code/qr-code.component'; + +@Component({ + selector: 'app-transaction-list', + templateUrl: './transaction-list.component.html', + styleUrls: ['./transaction-list.component.scss'], +}) +export class TransactionListComponent implements OnInit, OnDestroy { + transactions: NormalTransaction[]; + + private price: number; + private priceSubscription: ISubscription; + + constructor( + private dialog: MatDialog, + private priceService: PriceService, + private walletService: WalletService, + ) { } + + ngOnInit() { + this.priceSubscription = this.priceService.price.subscribe(price => this.price = price); + this.walletService.transactions().first().subscribe(transactions => this.transactions = transactions); + } + + ngOnDestroy() { + this.priceSubscription.unsubscribe(); + } + + showTransaction(transaction: NormalTransaction) { + const config = new MatDialogConfig(); + config.width = '800px'; + config.data = transaction; + this.dialog.open(TransactionDetailComponent, config); + } + + showQrCode(event: any, address: string) { + event.stopPropagation(); + + const config = new MatDialogConfig(); + config.data = { address }; + this.dialog.open(QrCodeComponent, config); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.css b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.css new file mode 100755 index 0000000..6be7dae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.css @@ -0,0 +1,7 @@ +mat-input-container { + width: 100%; +} + +.-buttons { + text-align: center; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html new file mode 100755 index 0000000..9953cce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.html @@ -0,0 +1,16 @@ + +
+
+ + +
+
+
+ + {{ 'wallet.rename.cancel-button' | translate }} + + + {{ 'wallet.rename.rename-button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts new file mode 100755 index 0000000..fae378f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ChangeNameComponent } from './change-name.component'; + +describe('ChangeNameComponent', () => { + let component: ChangeNameComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ ChangeNameComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ChangeNameComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts new file mode 100755 index 0000000..a13ff12 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/change-name/change-name.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit, Inject, ViewChild } from '@angular/core'; +import { WalletService } from '../../../../services/wallet.service'; +import { FormBuilder, Validators, FormGroup } from '@angular/forms'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { Wallet } from '../../../../app.datatypes'; +import { ButtonComponent } from '../../../layout/button/button.component'; + +@Component({ + selector: 'app-change-name', + templateUrl: './change-name.component.html', + styleUrls: ['./change-name.component.css'], +}) +export class ChangeNameComponent implements OnInit { + @ViewChild('button') button: ButtonComponent; + form: FormGroup; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private data: Wallet, + private formBuilder: FormBuilder, + private walletService: WalletService, + ) {} + + ngOnInit() { + this.form = this.formBuilder.group({ + label: [this.data.label, Validators.required], + }); + } + + closePopup() { + this.dialogRef.close(); + } + + rename() { + if (!this.form.valid || this.button.isLoading()) { + return; + } + + this.button.setLoading(); + + this.walletService.renameWallet(this.data, this.form.value.label) + .subscribe(() => this.dialogRef.close(this.form.value.label)); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html new file mode 100755 index 0000000..b195bc4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.html @@ -0,0 +1,58 @@ + +
+
+ + +
+
+ + +

{{ 'wallet.new.seed-warning' | translate }}

+
+
+ + +
+
+ + {{ 'wallet.new.encrypt' | translate }} + +
+
+
+

{{ 'wallet.new.encrypt-warning' | translate }}

+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + {{ 'wallet.new.cancel-button' | translate }} + + + {{ 'wallet.new.' + (data.create ? 'create' : 'load') + '-button' | translate }} + +
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss new file mode 100755 index 0000000..550e5d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.scss @@ -0,0 +1,100 @@ +@import '../../../../../theme/variables'; + +.-buttons { + text-align: center; +} + +label[for=seed] { + display: flex; + + > span:last-child { + flex: 1; + } + + .generators { + text-align: right; + + span { + cursor: pointer; + color: $gradient-blue-dark-transparent; + } + + mat-icon { + width: 13px; + height: 10px; + font-size: 13px; + position: relative; + top: 2px; + } + + .divider { + padding: 0 5px; + color: $grey-dark; + } + } +} + +.-disabled { + display: none; +} + +.-warning { + color: $red; + font-size: 12px; + padding: 0 10px; + line-height: 1.5; +} + +.-passwords { + margin-left: 24px; + + .-info { + margin: 5px 0 15px; + color: $grey; + font-size: 12px; + line-height: 1.5; + } + + .-hidden { + visibility: hidden; + } +} + +.-check ::ng-deep { + .mat-checkbox-checkmark-path { + position: absolute; + width: 18px; + height: 8px; + left: 4.59px; + top: 9px; + stroke: $gradient-blue-dark !important; + } + + .mat-checkbox-background, .mat-checkbox-frame { + top: 0; + left: 0; + right: 0; + bottom: 0; + position: absolute; + box-sizing: border-box; + pointer-events: none; + width: 20px; + height: 20px; + background: rgba(30, 34, 39, 0.05); + border-radius: 6px; + border-color: transparent; + } + span { + font-family: Skycoin; + line-height: normal; + font-size: 14px; + + color: $grey-dark; + + img { + width: 38px; + height: 38px; + vertical-align: middle; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts new file mode 100755 index 0000000..4ccb5db --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateWalletComponent } from './create-wallet.component'; + +describe('CreateWalletComponent', () => { + let component: CreateWalletComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateWalletComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateWalletComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts new file mode 100755 index 0000000..66897c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/create-wallet/create-wallet.component.ts @@ -0,0 +1,104 @@ +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { FormControl, FormGroup, Validators } from '@angular/forms'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialogRef } from '@angular/material/dialog'; +import { ButtonComponent } from '../../../layout/button/button.component'; +import { MAT_DIALOG_DATA } from '@angular/material'; +import { ApiService } from '../../../../services/api.service'; + +@Component({ + selector: 'app-create-wallet', + templateUrl: './create-wallet.component.html', + styleUrls: ['./create-wallet.component.scss'], +}) +export class CreateWalletComponent implements OnInit { + @ViewChild('createButton') createButton: ButtonComponent; + @ViewChild('cancelButton') cancelButton: ButtonComponent; + form: FormGroup; + seed: string; + scan: Number; + encrypt = true; + disableDismiss = false; + + constructor( + @Inject(MAT_DIALOG_DATA) public data, + public dialogRef: MatDialogRef, + private walletService: WalletService, + private apiService: ApiService, + ) {} + + ngOnInit() { + this.initForm(); + } + + closePopup() { + this.dialogRef.close(); + } + + createWallet() { + if (!this.form.valid || this.createButton.isLoading()) { + return; + } + + this.createButton.resetState(); + this.createButton.setLoading(); + this.cancelButton.setDisabled(); + this.disableDismiss = true; + + const password = this.encrypt ? this.form.value.password : null; + this.walletService.create(this.form.value.label, this.form.value.seed, this.scan, password) + .subscribe(() => this.dialogRef.close(), e => { + this.createButton.setError(e); + this.cancelButton.disabled = false; + this.disableDismiss = false; + }); + } + + generateSeed(entropy: number) { + this.apiService.generateSeed(entropy).subscribe(seed => this.form.get('seed').setValue(seed)); + } + + setEncrypt(event) { + this.encrypt = event.checked; + this.form.updateValueAndValidity(); + } + + private initForm() { + this.form = new FormGroup({}, [this.validatePasswords.bind(this), this.validateSeeds.bind(this)]); + this.form.addControl('label', new FormControl('', [Validators.required])); + this.form.addControl('seed', new FormControl('', [Validators.required])); + this.form.addControl('confirm_seed', new FormControl()); + this.form.addControl('password', new FormControl()); + this.form.addControl('confirm_password', new FormControl()); + + if (this.data.create) { + this.generateSeed(128); + } + + this.scan = 100; + } + + private validateSeeds() { + if (this.data.create && this.form && this.form.get('seed') && this.form.get('confirm_seed')) { + if (this.form.get('seed').value !== this.form.get('confirm_seed').value) { + return { NotEqual: true }; + } + } + + return null; + } + + private validatePasswords() { + if (this.encrypt && this.form && this.form.get('password') && this.form.get('confirm_password')) { + if (this.form.get('password').value) { + if (this.form.get('password').value !== this.form.get('confirm_password').value) { + return { NotEqual: true }; + } + } else { + return { Required: true }; + } + } + + return null; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html new file mode 100755 index 0000000..b7b608d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.html @@ -0,0 +1,47 @@ +
+
+ {{ 'wallet.new-address' | translate }} +
+
+ + {{ 'wallet.' + (wallet.hideEmpty ? 'show' : 'hide') + '-empty' | translate }} + +
+
+
+ + {{ 'wallet.' + (wallet.encrypted ? 'decrypt' : 'encrypt') | translate }} + +
+
+ {{ 'wallet.edit' | translate }} +
+
+ + +
+
{{ i + 1 }}
+
+ + + {{ address.address }} + + {{ 'wallet.address.copy' | translate }} + + +
+
{{ (address.coins ? address.coins : 0) | number:'1.0-6' }}
+
{{ (address.hours ? address.hours : 0) | number:'1.0-6' }}
+
+ more_vert + + + + +
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss new file mode 100755 index 0000000..5700043 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.scss @@ -0,0 +1,171 @@ +@import '../../../../../theme/variables'; + +.-row.-detail { + background-color: darken($white, 2%); +} + +.-grey { + color: $grey; +} + +.-address { + padding-left: 0 !important; + + img { + width: 17px; + vertical-align: middle; + margin-right: 10px; + } + + > span { + display: inline-block; + line-height: $row-height; + cursor: pointer; + + &:hover .copy-label { + opacity: 1; + } + } +} + +.-text-right { + text-align: right; +} + +.-options { + text-align: center; + + mat-icon { + color: lighten($grey, 30%); + cursor: pointer; + vertical-align: middle; + + &:hover { + color: $blue; + } + } +} + +.-actions { + background-color: #fefefe; + border-bottom: 1px solid #eff0f0; + display: flex; + width: 100%; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.03) !important; + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + z-index: 100; + position: relative; + + .-button { + padding-right: 20px; + + &:first-child { + padding-left: 5px; + } + + span { + color: #CECFD0; + font-size: 12px; + height: 60px; + margin: 0 5px; + cursor: pointer; + display: flex; + align-items: center; + + &.-img::before { + content: ''; + display: inline-block; + height: 32px; + width: 32px; + margin-right: 5px; + background-repeat: no-repeat; + background-size: 32px 32px; + } + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-grey.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-grey.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-grey.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-grey.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-grey.png); + } + + &:hover { + color: $grey; + + &.-new-address::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-hide-empty::before { + background-image: url(../../../../../assets/img/minus-red.png); + } + + &.-show-empty::before { + background-image: url(../../../../../assets/img/plus-green.png); + } + + &.-enable-encryption::before { + background-image: url(../../../../../assets/img/lock-gold.png); + } + + &.-disable-encryption::before { + background-image: url(../../../../../assets/img/unlock-gold.png); + } + + &.-edit-wallet::before { + background-image: url(../../../../../assets/img/edit-blue.png); + } + } + } + } +} + +@keyframes floatup { + 50% { + opacity: 1; + } + + 100% { + transform: translateY(-20px); + opacity: 0; + } +} + +.copy-label { + color: $blue; + opacity: 0; + font-size: 12px; + position: relative; + padding-left: 10px; + + &::after { + content: attr(data-label); + position: absolute; + top: 0; + left: 4px; + opacity: 0; + line-height: 1; + } +} + +.copying .copy-label::after { + animation: floatup .5s ease-in-out; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts new file mode 100755 index 0000000..32c805e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletDetailComponent } from './wallet-detail.component'; + +describe('WalletDetailComponent', () => { + let component: WalletDetailComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletDetailComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletDetailComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts new file mode 100755 index 0000000..2864b2a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallet-detail/wallet-detail.component.ts @@ -0,0 +1,119 @@ +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { Wallet } from '../../../../app.datatypes'; +import { WalletService } from '../../../../services/wallet.service'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { ChangeNameComponent } from '../change-name/change-name.component'; +import { QrCodeComponent } from '../../../layout/qr-code/qr-code.component'; +import { PasswordDialogComponent } from '../../../layout/password-dialog/password-dialog.component'; +import { MatSnackBar } from '@angular/material'; +import { showSnackbarError } from '../../../../utils/errors'; +import { TranslateService } from '@ngx-translate/core'; + +@Component({ + selector: 'app-wallet-detail', + templateUrl: './wallet-detail.component.html', + styleUrls: ['./wallet-detail.component.scss'], +}) +export class WalletDetailComponent implements OnInit, OnDestroy { + @Input() wallet: Wallet; + + private encryptionWarning: string; + + constructor( + private dialog: MatDialog, + private walletService: WalletService, + private snackbar: MatSnackBar, + private translateService: TranslateService, + ) { } + + ngOnInit() { + this.translateService.get('wallet.new.encrypt-warning').subscribe(msg => { + this.encryptionWarning = msg; + }); + } + + ngOnDestroy() { + this.snackbar.dismiss(); + } + + editWallet() { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = this.wallet; + this.dialog.open(ChangeNameComponent, config); + } + + newAddress() { + this.snackbar.dismiss(); + + if (this.wallet.encrypted) { + this.dialog.open(PasswordDialogComponent).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.addAddress(this.wallet, passwordDialog.password) + .subscribe(() => passwordDialog.close(), () => passwordDialog.error()); + }); + } else { + this.walletService.addAddress(this.wallet).subscribe(null, err => showSnackbarError(this.snackbar, err)); + } + } + + toggleEmpty() { + this.wallet.hideEmpty = !this.wallet.hideEmpty; + } + + toggleEncryption() { + const config = new MatDialogConfig(); + config.data = { + confirm: !this.wallet.encrypted, + title: this.wallet.encrypted ? 'wallet.decrypt' : 'wallet.encrypt', + }; + + if (!this.wallet.encrypted) { + config.data['description'] = this.encryptionWarning; + } + + this.dialog.open(PasswordDialogComponent, config).componentInstance.passwordSubmit + .subscribe(passwordDialog => { + this.walletService.toggleEncryption(this.wallet, passwordDialog.password).subscribe(() => { + passwordDialog.close(); + }, e => passwordDialog.error(e)); + }); + } + + copyAddress(event, address, duration = 500) { + event.stopPropagation(); + + if (address.copying) { + return; + } + + const selBox = document.createElement('textarea'); + + selBox.style.position = 'fixed'; + selBox.style.left = '0'; + selBox.style.top = '0'; + selBox.style.opacity = '0'; + selBox.value = address.address; + + document.body.appendChild(selBox); + selBox.focus(); + selBox.select(); + + document.execCommand('copy'); + document.body.removeChild(selBox); + + address.copying = true; + + setTimeout(function() { + address.copying = false; + }, duration); + } + + showQrCode(event, address: string) { + event.stopPropagation(); + + const config = new MatDialogConfig(); + config.data = { address }; + this.dialog.open(QrCodeComponent, config); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html new file mode 100755 index 0000000..b25b49e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.html @@ -0,0 +1,47 @@ +
+ + +
+
+
+
{{ 'wallet.wallet' | translate }}
+
+
{{ 'common.coin-id' | translate }}
+
{{ 'common.coin-hours' | translate }}
+
+
+
+ +
+
+
+
{{ wallet.label }}
+
+ + +
+
{{ (wallet.coins ? wallet.coins : 0) | number:'1.0-6' }}
+
{{ (wallet.hours ? wallet.hours : 0) | number:'1.0-6' }}
+
+ +
+
+ +
+
+ +
+ + +
+
+
diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss new file mode 100755 index 0000000..46277f4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.scss @@ -0,0 +1,65 @@ +@import '../../../../theme/variables'; + +.-table { + margin-bottom: 10px; + + &:first-child { + margin-bottom: 0; + } + + .-row { + border-color: #f6f6f6; + } +} + +.-pointer { + cursor: pointer; +} + +.-text-right { + text-align: right; +} + +.-grey { + color: $grey; +} + +.-expand img { + width: 30px; + vertical-align: middle; +} + +.-encryption img { + border-radius: 50%; + background-color: #f7f7f7; + width: 30px; + vertical-align: middle; +} + +.-label { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.action-buttons { + margin-bottom: 74px; + padding: 40px 0 40px; + text-align: center; + + button { + background-color: $grey-lightest; + border: none; + box-shadow: none; + color: $grey; + font-size: 13px; + margin: 0 5px; + min-width: 140px; + + img { + height: 28px; + margin-left: -4px; + width: 28px; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts new file mode 100755 index 0000000..07abc90 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { WalletsComponent } from './wallets.component'; + +describe('WalletsComponent', () => { + let component: WalletsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ WalletsComponent ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(WalletsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should be created', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts new file mode 100755 index 0000000..544a68e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/components/pages/wallets/wallets.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; +import { WalletService } from '../../../services/wallet.service'; +import { MatDialog, MatDialogConfig } from '@angular/material/dialog'; +import { CreateWalletComponent } from './create-wallet/create-wallet.component'; +import { Wallet } from '../../../app.datatypes'; + +@Component({ + selector: 'app-wallets', + templateUrl: './wallets.component.html', + styleUrls: ['./wallets.component.scss'], +}) +export class WalletsComponent { + constructor( + public walletService: WalletService, + private dialog: MatDialog, + ) {} + + addWallet(create) { + const config = new MatDialogConfig(); + config.width = '566px'; + config.data = { create }; + this.dialog.open(CreateWalletComponent, config); + } + + toggleWallet(wallet: Wallet) { + wallet.opened = !wallet.opened; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts new file mode 100755 index 0000000..e79cd8a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.spec.ts @@ -0,0 +1,8 @@ +import { DontsavepasswordDirective } from './dontsavepassword.directive'; + +describe('DontsavepasswordDirective', () => { + it('should create an instance', () => { + const directive = new DontsavepasswordDirective(null); + expect(directive).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts new file mode 100755 index 0000000..3fc5880 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/directives/dontsavepassword.directive.ts @@ -0,0 +1,17 @@ +import { Directive, ElementRef, HostListener } from '@angular/core'; + +@Directive({ + selector: '[appDontSavePassword]', +}) +export class DontsavepasswordDirective { + constructor( + private el: ElementRef, + ) { + el.nativeElement.autocomplete = 'new-password'; + el.nativeElement.readOnly = true; + } + + @HostListener('focus') onFocus() { + this.el.nativeElement.readOnly = false; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts new file mode 100755 index 0000000..8ecf995 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateFromNowPipe } from './date-from-now.pipe'; + +describe('DateFromNowPipe', () => { + it('create an instance', () => { + const pipe = new DateFromNowPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts new file mode 100755 index 0000000..40b93a7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-from-now.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; + +@Pipe({ + name: 'dateFromNow', +}) +export class DateFromNowPipe implements PipeTransform { + transform(value: any) { + return moment.unix(value).fromNow(); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts new file mode 100755 index 0000000..f43d9e8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.spec.ts @@ -0,0 +1,8 @@ +import { DateTimePipe } from './date-time.pipe'; + +describe('DateTimePipe', () => { + it('create an instance', () => { + const pipe = new DateTimePipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts new file mode 100755 index 0000000..2c2b355 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/date-time.pipe.ts @@ -0,0 +1,11 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import * as moment from 'moment'; + +@Pipe({ + name: 'dateTime', +}) +export class DateTimePipe implements PipeTransform { + transform(value: any) { + return moment.unix(value).format('YYYY-MM-DD HH:mm'); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts new file mode 100755 index 0000000..081e158 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.spec.ts @@ -0,0 +1,8 @@ +import { TellerStatusPipe } from './teller-status.pipe'; + +describe('TellerStatusPipe', () => { + it('create an instance', () => { + const pipe = new TellerStatusPipe(); + expect(pipe).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts new file mode 100755 index 0000000..27bcfdb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/pipes/teller-status.pipe.ts @@ -0,0 +1,14 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'tellerStatus', +}) +export class TellerStatusPipe implements PipeTransform { + private statuses = ['done', 'waiting_confirm', 'waiting_deposit', 'waiting_send']; + + transform(value: any): any { + return this.statuses.find(status => status === value) + ? 'teller.' + value.replace('_', '-') + : 'teller.unknown'; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.spec.ts new file mode 100755 index 0000000..9d17c0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { ApiService } from './api.service'; + +describe('ApiService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ApiService], + }); + }); + + it('should be created', inject([ApiService], (service: ApiService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.ts new file mode 100755 index 0000000..4e833fc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/api.service.ts @@ -0,0 +1,159 @@ +import { Injectable } from '@angular/core'; +import { Http, RequestOptions, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { environment } from '../../environments/environment'; +import 'rxjs/add/observable/throw'; +import 'rxjs/add/operator/catch'; +import 'rxjs/add/operator/map'; +import { + Address, GetWalletsResponseEntry, GetWalletsResponseWallet, NormalTransaction, + PostWalletNewAddressResponse, Version, Wallet, +} from '../app.datatypes'; + +@Injectable() +export class ApiService { + private url = environment.nodeUrl; + + constructor( + private http: Http, + ) { } + + getExplorerAddress(address: Address): Observable { + return this.get('explorer/address', {address: address.address}) + .map(transactions => transactions.map(transaction => ({ + addresses: [], + balance: 0, + block: transaction.status.block_seq, + confirmed: transaction.status.confirmed, + timestamp: transaction.timestamp, + txid: transaction.txid, + inputs: transaction.inputs, + outputs: transaction.outputs, + }))); + } + + getVersion(): Observable { + return this.get('version'); + } + + generateSeed(entropy: number = 128): Observable { + return this.get('wallet/newSeed', { entropy }).map(response => response.seed); + } + + getWallets(): Observable { + return this.get('wallets') + .map((response: GetWalletsResponseWallet[]) => { + const wallets: Wallet[] = []; + response.forEach(wallet => { + wallets.push( { + label: wallet.meta.label, + filename: wallet.meta.filename, + coins: null, + hours: null, + addresses: wallet.entries.map((entry: GetWalletsResponseEntry) => { + return { + address: entry.address, + coins: null, + hours: null, + }; + }), + encrypted: wallet.meta.encrypted, + }); + }); + + return wallets; + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.post('wallet/seed', { id: wallet.filename, password }) + .map(response => response.seed); + } + + postWalletCreate(label: string, seed: string, scan: number, password: string): Observable { + const params = { label, seed, scan }; + + if (password) { + params['password'] = password; + params['encrypt'] = true; + } + + return this.post('wallet/create', params) + .map(response => ({ + label: response.meta.label, + filename: response.meta.filename, + coins: null, + hours: null, + addresses: response.entries.map(entry => ({ address: entry.address, coins: null, hours: null })), + encrypted: response.meta.encrypted, + })); + } + + postWalletNewAddress(wallet: Wallet, password?: string): Observable
{ + return this.post('wallet/newAddress', { id: wallet.filename, password }) + .map((response: PostWalletNewAddressResponse) => ({ address: response.addresses[0], coins: null, hours: null })); + } + + postWalletToggleEncryption(wallet: Wallet, password: string) { + return this.post('wallet/' + (wallet.encrypted ? 'decrypt' : 'encrypt'), { id: wallet.filename, password }); + } + + get(url, params = null, options = {}) { + return this.http.get(this.getUrl(url, params), this.returnRequestOptions(options)) + .map((res: any) => res.json()) + .catch((error: any) => Observable.throw(error || 'Server error')); + } + + getCsrf() { + return this.get('csrf').map(response => response.csrf_token); + } + + post(url, params = {}, options: any = {}) { + return this.getCsrf().first().flatMap(csrf => { + options.csrf = csrf; + + return this.http.post( + this.getUrl(url), + options.json ? JSON.stringify(params) : this.getQueryString(params), + this.returnRequestOptions(options), + ) + .map((res: any) => res.json()) + .catch((error: any) => Observable.throw(error || 'Server error')); + }); + } + + returnRequestOptions(additionalOptions) { + const options = new RequestOptions(); + + options.headers = this.getHeaders(additionalOptions); + + if (additionalOptions.csrf) { + options.headers.append('X-CSRF-Token', additionalOptions.csrf); + } + + return options; + } + + private getHeaders(options) { + const headers = new Headers(); + headers.append('Content-Type', options.json ? 'application/json' : 'application/x-www-form-urlencoded'); + + return headers; + } + + private getQueryString(parameters = null) { + if (!parameters) { + return ''; + } + + return Object.keys(parameters).reduce((array, key) => { + array.push(key + '=' + encodeURIComponent(parameters[key])); + + return array; + }, []).join('&'); + } + + private getUrl(url, options = null) { + return this.url + url + '?' + this.getQueryString(options); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.spec.ts new file mode 100755 index 0000000..dad1f42 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { AppService } from './app.service'; + +describe('AppService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AppService], + }); + }); + + it('should be created', inject([AppService], (service: AppService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.ts new file mode 100755 index 0000000..d97a667 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/app.service.ts @@ -0,0 +1,53 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Observable } from 'rxjs/Observable'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import { Connection, Version } from '../app.datatypes'; + +@Injectable() +export class AppService { + error: number; + version: Version; + + constructor( + private apiService: ApiService, + private ngZone: NgZone, + ) { + this.monitorConnections(); + } + + testBackend() { + this.apiService.getVersion().first().subscribe( + version => { + this.version = version; + this.apiService.getCsrf().subscribe(null, () => this.error = 3); + }, () => this.error = 2, + ); + } + + private monitorConnections() { + this.retrieveConnections().subscribe(connections => this.setConnectionError(connections)); + + this.ngZone.runOutsideAngular(() => { + IntervalObservable + .create(1500) + .flatMap(() => this.retrieveConnections()) + .subscribe(connections => this.ngZone.run(() => { + this.setConnectionError(connections); + })); + }); + } + + private retrieveConnections(): Observable { + return this.apiService.get('network/connections'); + } + + private setConnectionError(response: any) { + if (response.connections === null || response.connections.length === 0) { + this.error = 1; + } + if (response.connections !== null && response.connections.length > 0 && this.error === 1) { + this.error = null; + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts new file mode 100755 index 0000000..12065ef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { BlockchainService } from './blockchain.service'; + +describe('BlockchainService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BlockchainService], + }); + }); + + it('should be created', inject([BlockchainService], (service: BlockchainService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.ts new file mode 100755 index 0000000..64a239a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/blockchain.service.ts @@ -0,0 +1,88 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Observable } from 'rxjs/Observable'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { WalletService } from './wallet.service'; +import 'rxjs/add/observable/timer'; + +@Injectable() +export class BlockchainService { + private progressSubject: Subject = new BehaviorSubject(null); + private refreshedBalance = false; + + get progress() { + return this.progressSubject.asObservable(); + } + + constructor( + private apiService: ApiService, + private walletService: WalletService, + private ngZone: NgZone, + ) { + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 2000) + .flatMap(() => this.getBlockchainProgress()) + .takeWhile((response: any) => !response.current || response.current !== response.highest) + .subscribe( + response => this.ngZone.run(() => { + this.progressSubject.next(response); + + if (!this.refreshedBalance) { + this.walletService.refreshBalances(); + this.refreshedBalance = true; + } + }), + error => console.log(error), + () => this.ngZone.run(() => this.completeLoading()), + ); + }); + } + + block(id): Observable { + return this.apiService.get('blocks', { start: id, end: id }).map(response => response.blocks[0]).flatMap(block => { + return Observable.forkJoin(block.body.txns.map(transaction => { + if (transaction.inputs && !transaction.inputs.length) { + return Observable.of(transaction); + } + + return Observable.forkJoin(transaction.inputs.map(input => this.retrieveInputAddress(input).map(response => { + return response.owner_address; + }))).map(inputs => { + transaction.inputs = inputs; + + return transaction; + }); + })).map(transactions => { + block.body.txns = transactions; + + return block; + }); + }); + } + + blocks(num: number = 5100) { + return this.apiService.get('last_blocks', { num: num }).map(response => response.blocks.reverse()); + } + + lastBlock() { + return this.blocks(1).map(blocks => blocks[0]); + } + + getBlockchainProgress() { + return this.apiService.get('blockchain/progress'); + } + + coinSupply() { + return this.apiService.get('coinSupply'); + } + + private completeLoading() { + this.progressSubject.next({ current: 999999999999, highest: 999999999999 }); + this.walletService.refreshBalances(); + } + + private retrieveInputAddress(input: string) { + return this.apiService.get('uxout', {uxid: input}); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts new file mode 100755 index 0000000..f7c5861 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NavBarService } from './nav-bar.service'; + +describe('NavBarService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NavBarService], + }); + }); + + it('should be created', inject([NavBarService], (service: NavBarService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.ts new file mode 100755 index 0000000..2f17fe9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/nav-bar.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; + +@Injectable() +export class NavBarService { + switchVisible = false; + activeComponent = new BehaviorSubject(1); + leftText: string; + rightText: string; + + setActiveComponent(value) { + this.activeComponent.next(value); + } + + showSwitch(leftText, rightText) { + this.switchVisible = true; + this.leftText = leftText; + this.rightText = rightText; + } + + hideSwitch() { + this.switchVisible = false; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.spec.ts new file mode 100755 index 0000000..dc00e8a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { NetworkService } from './network.service'; + +describe('NetworkService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [NetworkService], + }); + }); + + it('should be created', inject([NetworkService], (service: NetworkService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.ts new file mode 100755 index 0000000..0176a31 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/network.service.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; +import { IntervalObservable } from 'rxjs/observable/IntervalObservable'; +import 'rxjs/add/operator/mergeMap'; +import { Connection } from '../app.datatypes'; + +@Injectable() +export class NetworkService { + private automaticPeers: Subject = new BehaviorSubject([]); + + constructor( + private apiService: ApiService, + ) { + this.loadData(); + } + + automatic(): Observable { + return this.automaticPeers.asObservable(); + } + + retrieveDefaultConnections(): Observable { + return this.apiService.get('network/defaultConnections') + .map(output => output.map((address, index) => ({ + id: index + 1, + address: address, + listen_port: 6000, + }))); + } + + private loadData(): void { + this.retrieveConnections().subscribe(connections => this.automaticPeers.next(connections)); + IntervalObservable + .create(5000) + .flatMap(() => this.retrieveConnections()) + .subscribe(connections => this.automaticPeers.next(connections)); + } + + private retrieveConnections(): Observable { + return this.apiService.get('network/connections') + .map(response => response.connections.sort((a, b) => a.id - b.id)); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.spec.ts new file mode 100755 index 0000000..8810350 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PriceService } from './price.service'; + +describe('PriceService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PriceService], + }); + }); + + it('should be created', inject([PriceService], (service: PriceService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.ts new file mode 100755 index 0000000..61e36b4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/price.service.ts @@ -0,0 +1,27 @@ +import { Injectable, NgZone } from '@angular/core'; +import { Http } from '@angular/http'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class PriceService { + readonly CMC_TICKER_ID = 1619; + + price: Subject = new BehaviorSubject(null); + + constructor( + private http: Http, + private ngZone: NgZone, + ) { + this.ngZone.runOutsideAngular(() => { + Observable.timer(0, 10 * 60 * 1000).subscribe(() => { + this.http.get(`https://api.coinmarketcap.com/v2/ticker/${this.CMC_TICKER_ID}/`) + .map(response => response.json()) + .subscribe(response => this.ngZone.run(() => { + this.price.next(response.data.quotes.USD.price); + })); + }); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts new file mode 100755 index 0000000..b69d48a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { PurchaseService } from './purchase.service'; + +describe('PurchaseService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PurchaseService], + }); + }); + + it('should be created', inject([PurchaseService], (service: PurchaseService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.ts new file mode 100755 index 0000000..17420f3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/purchase.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@angular/core'; +import { Subject } from 'rxjs/Subject'; +import { BehaviorSubject } from 'rxjs/BehaviorSubject'; +import { PurchaseOrder, TellerConfig, Wallet } from '../app.datatypes'; +import { WalletService } from './wallet.service'; +import { HttpClient } from '@angular/common/http'; +import { environment } from '../../environments/environment'; +import { Observable } from 'rxjs/Observable'; + +@Injectable() +export class PurchaseService { + private configSubject: Subject = new BehaviorSubject(null); + private purchaseOrders: Subject = new BehaviorSubject([]); + private purchaseUrl = environment.tellerUrl; + + constructor( + private httpClient: HttpClient, + private walletService: WalletService, + ) { + this.getConfig(); + } + + all() { + return this.purchaseOrders.asObservable(); + } + + config(): Observable { + return this.configSubject.asObservable(); + } + + getConfig() { + return this.get('config') + .map((response: any) => ({ + enabled: true, + sky_btc_exchange_rate: parseFloat(response.sky_btc_exchange_rate), + })) + .subscribe(response => this.configSubject.next(response)); + } + + generate(wallet: Wallet): Observable { + return this.walletService.addAddress(wallet).flatMap(address => { + return this.post('bind', { skyaddr: address.address, coin_type: 'BTC' }) + .map(response => ({ + coin_type: response.coin_type, + deposit_address: response.deposit_address, + filename: wallet.filename, + recipient_address: address.address, + status: 'waiting_deposit', + })); + }); + } + + scan(address: string) { + return this.get('status?skyaddr=' + address) + .map((response: any) => { + if (!response.statuses || response.statuses.length > 1) { + throw new Error('too many purchase orders found'); + } + + return response.statuses[0]; + }); + } + + private get(url): any { + return this.httpClient.get(this.purchaseUrl + url); + } + + private post(url, parameters = {}): any { + return this.httpClient.post(this.purchaseUrl + url, parameters); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts new file mode 100755 index 0000000..d111e25 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WalletService } from './wallet.service'; + +describe('WalletService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WalletService], + }); + }); + + it('should be created', inject([WalletService], (service: WalletService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.ts new file mode 100755 index 0000000..23c83dd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wallet.service.ts @@ -0,0 +1,291 @@ +import { Injectable, NgZone } from '@angular/core'; +import { ApiService } from './api.service'; +import { Subject } from 'rxjs/Subject'; +import { Observable } from 'rxjs/Observable'; +import 'rxjs/add/observable/forkJoin'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/filter'; +import 'rxjs/add/operator/first'; +import 'rxjs/add/operator/mergeMap'; +import 'rxjs/add/observable/timer'; +import 'rxjs/add/observable/zip'; +import { Address, NormalTransaction, PreviewTransaction, Wallet } from '../app.datatypes'; +import { ReplaySubject } from 'rxjs/ReplaySubject'; +import { Subscription } from 'rxjs/Subscription'; + +@Injectable() +export class WalletService { + addresses: Address[]; + wallets: Subject = new ReplaySubject(); + pendingTxs: Subject = new ReplaySubject(); + dataRefreshSubscription: Subscription; + + constructor( + private apiService: ApiService, + private ngZone: NgZone, + ) { + this.loadData(); + this.startDataRefreshSubscription(); + } + + addressesAsString(): Observable { + return this.allAddresses().map(addrs => addrs.map(addr => addr.address)).map(addrs => addrs.join(',')); + } + + addAddress(wallet: Wallet, password?: string) { + return this.apiService.postWalletNewAddress(wallet, password) + .do(address => { + wallet.addresses.push(address); + this.refreshBalances(); + }); + } + + all(): Observable { + return this.wallets.asObservable(); + } + + allAddresses(): Observable { + return this.all().map(wallets => wallets.reduce((array, wallet) => array.concat(wallet.addresses), [])); + } + + create(label, seed, scan, password) { + seed = seed.replace(/(\n|\r\n)$/, ''); + + return this.apiService.postWalletCreate(label ? label : 'undefined', seed, scan ? scan : 100, password) + .do(wallet => { + console.log(wallet); + this.wallets.first().subscribe(wallets => { + wallets.push(wallet); + this.wallets.next(wallets); + this.refreshBalances(); + }); + }); + } + + folder(): Observable { + return this.apiService.get('wallets/folderName').map(response => response.address); + } + + outputs(): Observable { + return this.addressesAsString() + .first() + .filter(addresses => !!addresses) + .flatMap(addresses => this.apiService.get('outputs', {addrs: addresses})); + } + + outputsWithWallets(): Observable { + return Observable.zip(this.all(), this.outputs(), (wallets, outputs) => { + return wallets.map(wallet => { + wallet.addresses = wallet.addresses.map(address => { + address.outputs = outputs.head_outputs.filter(output => output.address === address.address); + + return address; + }); + + return wallet; + }); + }); + } + + allPendingTransactions(): Observable { + return Observable.timer(0, 10000).flatMap(() => this.apiService.get('pendingTxs')); + } + + pendingTransactions(): Observable { + return this.pendingTxs.asObservable(); + } + + refreshBalances() { + this.wallets.first().subscribe(wallets => { + Observable.forkJoin(wallets.map(wallet => this.retrieveWalletBalance(wallet).map(response => { + wallet.coins = response.coins; + wallet.hours = response.hours; + wallet.addresses = wallet.addresses.map(address => { + return response.addresses.find(addr => addr.address === address.address); + }); + + return wallet; + }))) + .subscribe(newWallets => this.wallets.next(newWallets)); + }); + } + + renameWallet(wallet: Wallet, label: string): Observable { + return this.apiService.post('wallet/update', { id: wallet.filename, label: label }) + .do(() => { + wallet.label = label; + this.updateWallet(wallet); + }); + } + + toggleEncryption(wallet: Wallet, password: string): Observable { + return this.apiService.postWalletToggleEncryption(wallet, password) + .do(w => { + wallet.encrypted = w.meta.encrypted; + this.updateWallet(w); + }); + } + + getWalletSeed(wallet: Wallet, password: string): Observable { + return this.apiService.getWalletSeed(wallet, password); + } + + createTransaction(wallet: Wallet, addresses: string[]|null, destinations: any[], hoursSelection: any, changeAddress: string|null, password: string|null): Observable { + return this.apiService.post( + 'wallet/transaction', + { + hours_selection: hoursSelection, + wallet: { + id: wallet.filename, + password, + addresses, + }, + to: destinations, + change_address: changeAddress, + }, + { + json: true, + }, + ).map(response => { + return { + ...response.transaction, + hoursBurned: response.transaction.fee, + encoded: response.encoded_transaction, + }; + }); + } + + injectTransaction(encodedTx: string) { + return this.apiService.post('injectTransaction', { rawtx: encodedTx }, { json: true }); + } + + transaction(txid: string): Observable { + return this.apiService.get('transaction', {txid: txid}).flatMap(transaction => { + if (transaction.txn.inputs && !transaction.txn.inputs.length) { + return Observable.of(transaction); + } + + return Observable.forkJoin(transaction.txn.inputs.map(input => this.retrieveInputAddress(input).map(response => { + return response.owner_address; + }))).map(inputs => { + transaction.txn.inputs = inputs; + + return transaction; + }); + }); + } + + transactions(): Observable { + return this.allAddresses().first().flatMap(addresses => { + this.addresses = addresses; + + return Observable.forkJoin(addresses.map(address => this.apiService.getExplorerAddress(address))); + }).map(transactions => { + return [] + .concat.apply([], transactions) + .reduce((array, item) => { + if (!array.find(trans => trans.txid === item.txid)) { + array.push(item); + } + + return array; + }, []) + .sort((a, b) => b.timestamp - a.timestamp) + .map(transaction => { + const outgoing = this.addresses.some(address => { + return transaction.inputs.some(input => input.owner === address.address); + }); + + const relevantOutputs = transaction.outputs.reduce((array, output) => { + const isMyOutput = this.addresses.some(address => address.address === output.dst); + + if ((outgoing && !isMyOutput) || (!outgoing && isMyOutput)) { + array.push(output); + } + + return array; + }, []); + + const calculatedOutputs = (outgoing && relevantOutputs.length === 0) + || (!outgoing && relevantOutputs.length === transaction.outputs.length) + ? transaction.outputs + : relevantOutputs; + + transaction.addresses.push( + ...calculatedOutputs + .map(output => output.dst) + .filter((dst, i, self) => self.indexOf(dst) === i), + ); + + transaction.balance += calculatedOutputs.reduce((a, b) => a + parseFloat(b.coins), 0) * (outgoing ? -1 : 1); + + return transaction; + }); + }); + } + + startDataRefreshSubscription() { + if (this.dataRefreshSubscription) { + this.dataRefreshSubscription.unsubscribe(); + } + + this.ngZone.runOutsideAngular(() => { + this.dataRefreshSubscription = Observable.timer(0, 10000) + .subscribe(() => this.ngZone.run(() => { + this.refreshBalances(); + this.refreshPendingTransactions(); + })); + }); + } + + private loadData(): void { + this.apiService.getWallets().first().subscribe(wallets => this.wallets.next(wallets)); + } + + private retrieveInputAddress(input: string) { + return this.apiService.get('uxout', {uxid: input}); + } + + private retrieveWalletBalance(wallet: Wallet): Observable { + return this.apiService.get('wallet/balance', { id: wallet.filename }).map(balance => { + return { + coins: balance.confirmed.coins / 1000000, + hours: balance.confirmed.hours, + addresses: Object.keys(balance.addresses).map(address => ({ + address, + coins: balance.addresses[address].confirmed.coins / 1000000, + hours: balance.addresses[address].confirmed.hours, + })), + }; + }); + } + + private updateWallet(wallet: Wallet) { + this.wallets.first().subscribe(wallets => { + const index = wallets.findIndex(w => w.filename === wallet.filename); + wallets[index] = wallet; + this.wallets.next(wallets); + }); + } + + private refreshPendingTransactions() { + this.wallets.first().subscribe(wallets => { + Observable.forkJoin(wallets.map(wallet => this.apiService.get('wallet/transactions', { id: wallet.filename }))) + .subscribe(pending => { + this.pendingTxs.next([].concat.apply( + [], + pending + .filter(response => response.transactions.length > 0) + .map(response => response.transactions), + ).reduce((txs, tx) => { + if (!txs.find(t => t.transaction.txid === tx.transaction.txid)) { + txs.push(tx); + } + + return txs; + }, [])); + }); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts new file mode 100755 index 0000000..ce4788b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WizardGuardService } from './wizard-guard.service'; + +describe('WizardGuardService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WizardGuardService], + }); + }); + + it('should be created', inject([WizardGuardService], (service: WizardGuardService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts new file mode 100755 index 0000000..dafdcb6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/services/wizard-guard.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { WalletService } from './wallet.service'; + +@Injectable() +export class WizardGuardService implements CanActivate { + constructor( + private walletService: WalletService, + private router: Router, + ) { } + + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { + return new Promise(resolve => { + this.walletService.all().first().subscribe(wallets => { + if (wallets.length === 0) { + this.router.navigate(['/wizard']); + + return resolve(false); + } + + return resolve(true); + }); + }); + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.spec.ts new file mode 100755 index 0000000..ec0f214 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.spec.ts @@ -0,0 +1,16 @@ +import { parseResponseMessage } from './errors'; + +fdescribe('errors', () => { + const message1 = '400 Bad Request - error description'; + const message2 = '403 Forbidden - error description'; + const message3 = '500 Internal Server Error - error description'; + + it('parses message from 400 and 403 responses', () => { + expect(parseResponseMessage(message1)).toEqual('Error description'); + expect(parseResponseMessage(message2)).toEqual('Error description'); + }); + + it('does not parse message from other responses', () => { + expect(parseResponseMessage(message3)).toEqual(message3); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.ts new file mode 100755 index 0000000..a489a57 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/errors.ts @@ -0,0 +1,24 @@ +import { MatSnackBar, MatSnackBarConfig } from '@angular/material'; + +export function parseResponseMessage(body: string): string { + if (typeof body === 'object') { + body = body['_body']; + } + + if (body.startsWith('400') || body.startsWith('403')) { + const parts = body.split(' - ', 2); + + return parts.length === 2 + ? parts[1].charAt(0).toUpperCase() + parts[1].slice(1) + : body; + } + + return body; +} + +export function showSnackbarError(snackbar: MatSnackBar, body: string, duration = 300000) { + const config = new MatSnackBarConfig(); + config.duration = duration; + + snackbar.open(parseResponseMessage(body), null, config); +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.spec.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.spec.ts new file mode 100755 index 0000000..df9974e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.spec.ts @@ -0,0 +1,17 @@ +import { shouldUpgradeVersion } from './semver'; + +fdescribe('semver', () => { + it('correctly compares versions', () => { + expect(shouldUpgradeVersion('0.23.0', '0.22.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.0', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1', '0.24.0')).toBeTruthy(); + expect(shouldUpgradeVersion('0.24.0', '1.0.0')).toBeTruthy(); + }); + + it('correctly handles rc versions', () => { + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.0')).toBeFalsy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.1')).toBeTruthy(); + expect(shouldUpgradeVersion('0.23.1-rc.1', '0.23.2')).toBeTruthy(); + }); +}); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.ts new file mode 100755 index 0000000..4c13ea1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/app/utils/semver.ts @@ -0,0 +1,28 @@ +/** + * Compares two SemVer versions, returns true if 'from' is smaller than 'to'. + * Special cases with 'rc' suffix are described in spec file. + * + * @returns {boolean} + * @param from + * @param to + */ +export function shouldUpgradeVersion(from: string, to: string): boolean { + const toParts = to.split('.'); + const fromSplit = from.split('-'); + const fromParts = fromSplit[0].split('.'); + + for (let i = 0; i < 3; i++) { + const toNumber = Number(toParts[i]); + const fromNumber = Number(fromParts[i]); + + if (toNumber > fromNumber) { + return true; + } + + if (toNumber < fromNumber) { + return false; + } + } + + return fromSplit.length === 2 && fromSplit[1].indexOf('rc') !== -1; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/.gitkeep b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot new file mode 100755 index 0000000..70508eb Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.eot differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap new file mode 100755 index 0000000..d9f1d25 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ijmap @@ -0,0 +1 @@ +{"icons":{"e84d":{"name":"3d Rotation"},"eb3b":{"name":"Ac Unit"},"e190":{"name":"Access Alarm"},"e191":{"name":"Access Alarms"},"e192":{"name":"Access Time"},"e84e":{"name":"Accessibility"},"e914":{"name":"Accessible"},"e84f":{"name":"Account Balance"},"e850":{"name":"Account Balance Wallet"},"e851":{"name":"Account Box"},"e853":{"name":"Account Circle"},"e60e":{"name":"Adb"},"e145":{"name":"Add"},"e439":{"name":"Add A Photo"},"e193":{"name":"Add Alarm"},"e003":{"name":"Add Alert"},"e146":{"name":"Add Box"},"e147":{"name":"Add Circle"},"e148":{"name":"Add Circle Outline"},"e567":{"name":"Add Location"},"e854":{"name":"Add Shopping Cart"},"e39d":{"name":"Add To Photos"},"e05c":{"name":"Add To Queue"},"e39e":{"name":"Adjust"},"e630":{"name":"Airline Seat Flat"},"e631":{"name":"Airline Seat Flat Angled"},"e632":{"name":"Airline Seat Individual Suite"},"e633":{"name":"Airline Seat Legroom Extra"},"e634":{"name":"Airline Seat Legroom Normal"},"e635":{"name":"Airline Seat Legroom Reduced"},"e636":{"name":"Airline Seat Recline Extra"},"e637":{"name":"Airline Seat Recline Normal"},"e195":{"name":"Airplanemode Active"},"e194":{"name":"Airplanemode Inactive"},"e055":{"name":"Airplay"},"eb3c":{"name":"Airport Shuttle"},"e855":{"name":"Alarm"},"e856":{"name":"Alarm Add"},"e857":{"name":"Alarm Off"},"e858":{"name":"Alarm On"},"e019":{"name":"Album"},"eb3d":{"name":"All Inclusive"},"e90b":{"name":"All Out"},"e859":{"name":"Android"},"e85a":{"name":"Announcement"},"e5c3":{"name":"Apps"},"e149":{"name":"Archive"},"e5c4":{"name":"Arrow Back"},"e5db":{"name":"Arrow Downward"},"e5c5":{"name":"Arrow Drop Down"},"e5c6":{"name":"Arrow Drop Down Circle"},"e5c7":{"name":"Arrow Drop Up"},"e5c8":{"name":"Arrow Forward"},"e5d8":{"name":"Arrow Upward"},"e060":{"name":"Art Track"},"e85b":{"name":"Aspect Ratio"},"e85c":{"name":"Assessment"},"e85d":{"name":"Assignment"},"e85e":{"name":"Assignment Ind"},"e85f":{"name":"Assignment Late"},"e860":{"name":"Assignment Return"},"e861":{"name":"Assignment Returned"},"e862":{"name":"Assignment Turned In"},"e39f":{"name":"Assistant"},"e3a0":{"name":"Assistant Photo"},"e226":{"name":"Attach File"},"e227":{"name":"Attach Money"},"e2bc":{"name":"Attachment"},"e3a1":{"name":"Audiotrack"},"e863":{"name":"Autorenew"},"e01b":{"name":"Av Timer"},"e14a":{"name":"Backspace"},"e864":{"name":"Backup"},"e19c":{"name":"Battery Alert"},"e1a3":{"name":"Battery Charging Full"},"e1a4":{"name":"Battery Full"},"e1a5":{"name":"Battery Std"},"e1a6":{"name":"Battery Unknown"},"eb3e":{"name":"Beach Access"},"e52d":{"name":"Beenhere"},"e14b":{"name":"Block"},"e1a7":{"name":"Bluetooth"},"e60f":{"name":"Bluetooth Audio"},"e1a8":{"name":"Bluetooth Connected"},"e1a9":{"name":"Bluetooth Disabled"},"e1aa":{"name":"Bluetooth Searching"},"e3a2":{"name":"Blur Circular"},"e3a3":{"name":"Blur Linear"},"e3a4":{"name":"Blur Off"},"e3a5":{"name":"Blur On"},"e865":{"name":"Book"},"e866":{"name":"Bookmark"},"e867":{"name":"Bookmark Border"},"e228":{"name":"Border All"},"e229":{"name":"Border Bottom"},"e22a":{"name":"Border Clear"},"e22b":{"name":"Border Color"},"e22c":{"name":"Border Horizontal"},"e22d":{"name":"Border Inner"},"e22e":{"name":"Border Left"},"e22f":{"name":"Border Outer"},"e230":{"name":"Border Right"},"e231":{"name":"Border Style"},"e232":{"name":"Border Top"},"e233":{"name":"Border Vertical"},"e06b":{"name":"Branding Watermark"},"e3a6":{"name":"Brightness 1"},"e3a7":{"name":"Brightness 2"},"e3a8":{"name":"Brightness 3"},"e3a9":{"name":"Brightness 4"},"e3aa":{"name":"Brightness 5"},"e3ab":{"name":"Brightness 6"},"e3ac":{"name":"Brightness 7"},"e1ab":{"name":"Brightness Auto"},"e1ac":{"name":"Brightness High"},"e1ad":{"name":"Brightness Low"},"e1ae":{"name":"Brightness Medium"},"e3ad":{"name":"Broken Image"},"e3ae":{"name":"Brush"},"e6dd":{"name":"Bubble Chart"},"e868":{"name":"Bug Report"},"e869":{"name":"Build"},"e43c":{"name":"Burst Mode"},"e0af":{"name":"Business"},"eb3f":{"name":"Business Center"},"e86a":{"name":"Cached"},"e7e9":{"name":"Cake"},"e0b0":{"name":"Call"},"e0b1":{"name":"Call End"},"e0b2":{"name":"Call Made"},"e0b3":{"name":"Call Merge"},"e0b4":{"name":"Call Missed"},"e0e4":{"name":"Call Missed Outgoing"},"e0b5":{"name":"Call Received"},"e0b6":{"name":"Call Split"},"e06c":{"name":"Call To Action"},"e3af":{"name":"Camera"},"e3b0":{"name":"Camera Alt"},"e8fc":{"name":"Camera Enhance"},"e3b1":{"name":"Camera Front"},"e3b2":{"name":"Camera Rear"},"e3b3":{"name":"Camera Roll"},"e5c9":{"name":"Cancel"},"e8f6":{"name":"Card Giftcard"},"e8f7":{"name":"Card Membership"},"e8f8":{"name":"Card Travel"},"eb40":{"name":"Casino"},"e307":{"name":"Cast"},"e308":{"name":"Cast Connected"},"e3b4":{"name":"Center Focus Strong"},"e3b5":{"name":"Center Focus Weak"},"e86b":{"name":"Change History"},"e0b7":{"name":"Chat"},"e0ca":{"name":"Chat Bubble"},"e0cb":{"name":"Chat Bubble Outline"},"e5ca":{"name":"Check"},"e834":{"name":"Check Box"},"e835":{"name":"Check Box Outline Blank"},"e86c":{"name":"Check Circle"},"e5cb":{"name":"Chevron Left"},"e5cc":{"name":"Chevron Right"},"eb41":{"name":"Child Care"},"eb42":{"name":"Child Friendly"},"e86d":{"name":"Chrome Reader Mode"},"e86e":{"name":"Class"},"e14c":{"name":"Clear"},"e0b8":{"name":"Clear All"},"e5cd":{"name":"Close"},"e01c":{"name":"Closed Caption"},"e2bd":{"name":"Cloud"},"e2be":{"name":"Cloud Circle"},"e2bf":{"name":"Cloud Done"},"e2c0":{"name":"Cloud Download"},"e2c1":{"name":"Cloud Off"},"e2c2":{"name":"Cloud Queue"},"e2c3":{"name":"Cloud Upload"},"e86f":{"name":"Code"},"e3b6":{"name":"Collections"},"e431":{"name":"Collections Bookmark"},"e3b7":{"name":"Color Lens"},"e3b8":{"name":"Colorize"},"e0b9":{"name":"Comment"},"e3b9":{"name":"Compare"},"e915":{"name":"Compare Arrows"},"e30a":{"name":"Computer"},"e638":{"name":"Confirmation Number"},"e0d0":{"name":"Contact Mail"},"e0cf":{"name":"Contact Phone"},"e0ba":{"name":"Contacts"},"e14d":{"name":"Content Copy"},"e14e":{"name":"Content Cut"},"e14f":{"name":"Content Paste"},"e3ba":{"name":"Control Point"},"e3bb":{"name":"Control Point Duplicate"},"e90c":{"name":"Copyright"},"e150":{"name":"Create"},"e2cc":{"name":"Create New Folder"},"e870":{"name":"Credit Card"},"e3be":{"name":"Crop"},"e3bc":{"name":"Crop 16 9"},"e3bd":{"name":"Crop 3 2"},"e3bf":{"name":"Crop 5 4"},"e3c0":{"name":"Crop 7 5"},"e3c1":{"name":"Crop Din"},"e3c2":{"name":"Crop Free"},"e3c3":{"name":"Crop Landscape"},"e3c4":{"name":"Crop Original"},"e3c5":{"name":"Crop Portrait"},"e437":{"name":"Crop Rotate"},"e3c6":{"name":"Crop Square"},"e871":{"name":"Dashboard"},"e1af":{"name":"Data Usage"},"e916":{"name":"Date Range"},"e3c7":{"name":"Dehaze"},"e872":{"name":"Delete"},"e92b":{"name":"Delete Forever"},"e16c":{"name":"Delete Sweep"},"e873":{"name":"Description"},"e30b":{"name":"Desktop Mac"},"e30c":{"name":"Desktop Windows"},"e3c8":{"name":"Details"},"e30d":{"name":"Developer Board"},"e1b0":{"name":"Developer Mode"},"e335":{"name":"Device Hub"},"e1b1":{"name":"Devices"},"e337":{"name":"Devices Other"},"e0bb":{"name":"Dialer Sip"},"e0bc":{"name":"Dialpad"},"e52e":{"name":"Directions"},"e52f":{"name":"Directions Bike"},"e532":{"name":"Directions Boat"},"e530":{"name":"Directions Bus"},"e531":{"name":"Directions Car"},"e534":{"name":"Directions Railway"},"e566":{"name":"Directions Run"},"e533":{"name":"Directions Subway"},"e535":{"name":"Directions Transit"},"e536":{"name":"Directions Walk"},"e610":{"name":"Disc Full"},"e875":{"name":"Dns"},"e612":{"name":"Do Not Disturb"},"e611":{"name":"Do Not Disturb Alt"},"e643":{"name":"Do Not Disturb Off"},"e644":{"name":"Do Not Disturb On"},"e30e":{"name":"Dock"},"e7ee":{"name":"Domain"},"e876":{"name":"Done"},"e877":{"name":"Done All"},"e917":{"name":"Donut Large"},"e918":{"name":"Donut Small"},"e151":{"name":"Drafts"},"e25d":{"name":"Drag Handle"},"e613":{"name":"Drive Eta"},"e1b2":{"name":"Dvr"},"e3c9":{"name":"Edit"},"e568":{"name":"Edit Location"},"e8fb":{"name":"Eject"},"e0be":{"name":"Email"},"e63f":{"name":"Enhanced Encryption"},"e01d":{"name":"Equalizer"},"e000":{"name":"Error"},"e001":{"name":"Error Outline"},"e926":{"name":"Euro Symbol"},"e56d":{"name":"Ev Station"},"e878":{"name":"Event"},"e614":{"name":"Event Available"},"e615":{"name":"Event Busy"},"e616":{"name":"Event Note"},"e903":{"name":"Event Seat"},"e879":{"name":"Exit To App"},"e5ce":{"name":"Expand Less"},"e5cf":{"name":"Expand More"},"e01e":{"name":"Explicit"},"e87a":{"name":"Explore"},"e3ca":{"name":"Exposure"},"e3cb":{"name":"Exposure Neg 1"},"e3cc":{"name":"Exposure Neg 2"},"e3cd":{"name":"Exposure Plus 1"},"e3ce":{"name":"Exposure Plus 2"},"e3cf":{"name":"Exposure Zero"},"e87b":{"name":"Extension"},"e87c":{"name":"Face"},"e01f":{"name":"Fast Forward"},"e020":{"name":"Fast Rewind"},"e87d":{"name":"Favorite"},"e87e":{"name":"Favorite Border"},"e06d":{"name":"Featured Play List"},"e06e":{"name":"Featured Video"},"e87f":{"name":"Feedback"},"e05d":{"name":"Fiber Dvr"},"e061":{"name":"Fiber Manual Record"},"e05e":{"name":"Fiber New"},"e06a":{"name":"Fiber Pin"},"e062":{"name":"Fiber Smart Record"},"e2c4":{"name":"File Download"},"e2c6":{"name":"File Upload"},"e3d3":{"name":"Filter"},"e3d0":{"name":"Filter 1"},"e3d1":{"name":"Filter 2"},"e3d2":{"name":"Filter 3"},"e3d4":{"name":"Filter 4"},"e3d5":{"name":"Filter 5"},"e3d6":{"name":"Filter 6"},"e3d7":{"name":"Filter 7"},"e3d8":{"name":"Filter 8"},"e3d9":{"name":"Filter 9"},"e3da":{"name":"Filter 9 Plus"},"e3db":{"name":"Filter B And W"},"e3dc":{"name":"Filter Center Focus"},"e3dd":{"name":"Filter Drama"},"e3de":{"name":"Filter Frames"},"e3df":{"name":"Filter Hdr"},"e152":{"name":"Filter List"},"e3e0":{"name":"Filter None"},"e3e2":{"name":"Filter Tilt Shift"},"e3e3":{"name":"Filter Vintage"},"e880":{"name":"Find In Page"},"e881":{"name":"Find Replace"},"e90d":{"name":"Fingerprint"},"e5dc":{"name":"First Page"},"eb43":{"name":"Fitness Center"},"e153":{"name":"Flag"},"e3e4":{"name":"Flare"},"e3e5":{"name":"Flash Auto"},"e3e6":{"name":"Flash Off"},"e3e7":{"name":"Flash On"},"e539":{"name":"Flight"},"e904":{"name":"Flight Land"},"e905":{"name":"Flight Takeoff"},"e3e8":{"name":"Flip"},"e882":{"name":"Flip To Back"},"e883":{"name":"Flip To Front"},"e2c7":{"name":"Folder"},"e2c8":{"name":"Folder Open"},"e2c9":{"name":"Folder Shared"},"e617":{"name":"Folder Special"},"e167":{"name":"Font Download"},"e234":{"name":"Format Align Center"},"e235":{"name":"Format Align Justify"},"e236":{"name":"Format Align Left"},"e237":{"name":"Format Align Right"},"e238":{"name":"Format Bold"},"e239":{"name":"Format Clear"},"e23a":{"name":"Format Color Fill"},"e23b":{"name":"Format Color Reset"},"e23c":{"name":"Format Color Text"},"e23d":{"name":"Format Indent Decrease"},"e23e":{"name":"Format Indent Increase"},"e23f":{"name":"Format Italic"},"e240":{"name":"Format Line Spacing"},"e241":{"name":"Format List Bulleted"},"e242":{"name":"Format List Numbered"},"e243":{"name":"Format Paint"},"e244":{"name":"Format Quote"},"e25e":{"name":"Format Shapes"},"e245":{"name":"Format Size"},"e246":{"name":"Format Strikethrough"},"e247":{"name":"Format Textdirection L To R"},"e248":{"name":"Format Textdirection R To L"},"e249":{"name":"Format Underlined"},"e0bf":{"name":"Forum"},"e154":{"name":"Forward"},"e056":{"name":"Forward 10"},"e057":{"name":"Forward 30"},"e058":{"name":"Forward 5"},"eb44":{"name":"Free Breakfast"},"e5d0":{"name":"Fullscreen"},"e5d1":{"name":"Fullscreen Exit"},"e24a":{"name":"Functions"},"e927":{"name":"G Translate"},"e30f":{"name":"Gamepad"},"e021":{"name":"Games"},"e90e":{"name":"Gavel"},"e155":{"name":"Gesture"},"e884":{"name":"Get App"},"e908":{"name":"Gif"},"eb45":{"name":"Golf Course"},"e1b3":{"name":"Gps Fixed"},"e1b4":{"name":"Gps Not Fixed"},"e1b5":{"name":"Gps Off"},"e885":{"name":"Grade"},"e3e9":{"name":"Gradient"},"e3ea":{"name":"Grain"},"e1b8":{"name":"Graphic Eq"},"e3eb":{"name":"Grid Off"},"e3ec":{"name":"Grid On"},"e7ef":{"name":"Group"},"e7f0":{"name":"Group Add"},"e886":{"name":"Group Work"},"e052":{"name":"Hd"},"e3ed":{"name":"Hdr Off"},"e3ee":{"name":"Hdr On"},"e3f1":{"name":"Hdr Strong"},"e3f2":{"name":"Hdr Weak"},"e310":{"name":"Headset"},"e311":{"name":"Headset Mic"},"e3f3":{"name":"Healing"},"e023":{"name":"Hearing"},"e887":{"name":"Help"},"e8fd":{"name":"Help Outline"},"e024":{"name":"High Quality"},"e25f":{"name":"Highlight"},"e888":{"name":"Highlight Off"},"e889":{"name":"History"},"e88a":{"name":"Home"},"eb46":{"name":"Hot Tub"},"e53a":{"name":"Hotel"},"e88b":{"name":"Hourglass Empty"},"e88c":{"name":"Hourglass Full"},"e902":{"name":"Http"},"e88d":{"name":"Https"},"e3f4":{"name":"Image"},"e3f5":{"name":"Image Aspect Ratio"},"e0e0":{"name":"Import Contacts"},"e0c3":{"name":"Import Export"},"e912":{"name":"Important Devices"},"e156":{"name":"Inbox"},"e909":{"name":"Indeterminate Check Box"},"e88e":{"name":"Info"},"e88f":{"name":"Info Outline"},"e890":{"name":"Input"},"e24b":{"name":"Insert Chart"},"e24c":{"name":"Insert Comment"},"e24d":{"name":"Insert Drive File"},"e24e":{"name":"Insert Emoticon"},"e24f":{"name":"Insert Invitation"},"e250":{"name":"Insert Link"},"e251":{"name":"Insert Photo"},"e891":{"name":"Invert Colors"},"e0c4":{"name":"Invert Colors Off"},"e3f6":{"name":"Iso"},"e312":{"name":"Keyboard"},"e313":{"name":"Keyboard Arrow Down"},"e314":{"name":"Keyboard Arrow Left"},"e315":{"name":"Keyboard Arrow Right"},"e316":{"name":"Keyboard Arrow Up"},"e317":{"name":"Keyboard Backspace"},"e318":{"name":"Keyboard Capslock"},"e31a":{"name":"Keyboard Hide"},"e31b":{"name":"Keyboard Return"},"e31c":{"name":"Keyboard Tab"},"e31d":{"name":"Keyboard Voice"},"eb47":{"name":"Kitchen"},"e892":{"name":"Label"},"e893":{"name":"Label Outline"},"e3f7":{"name":"Landscape"},"e894":{"name":"Language"},"e31e":{"name":"Laptop"},"e31f":{"name":"Laptop Chromebook"},"e320":{"name":"Laptop Mac"},"e321":{"name":"Laptop Windows"},"e5dd":{"name":"Last Page"},"e895":{"name":"Launch"},"e53b":{"name":"Layers"},"e53c":{"name":"Layers Clear"},"e3f8":{"name":"Leak Add"},"e3f9":{"name":"Leak Remove"},"e3fa":{"name":"Lens"},"e02e":{"name":"Library Add"},"e02f":{"name":"Library Books"},"e030":{"name":"Library Music"},"e90f":{"name":"Lightbulb Outline"},"e919":{"name":"Line Style"},"e91a":{"name":"Line Weight"},"e260":{"name":"Linear Scale"},"e157":{"name":"Link"},"e438":{"name":"Linked Camera"},"e896":{"name":"List"},"e0c6":{"name":"Live Help"},"e639":{"name":"Live Tv"},"e53f":{"name":"Local Activity"},"e53d":{"name":"Local Airport"},"e53e":{"name":"Local Atm"},"e540":{"name":"Local Bar"},"e541":{"name":"Local Cafe"},"e542":{"name":"Local Car Wash"},"e543":{"name":"Local Convenience Store"},"e556":{"name":"Local Dining"},"e544":{"name":"Local Drink"},"e545":{"name":"Local Florist"},"e546":{"name":"Local Gas Station"},"e547":{"name":"Local Grocery Store"},"e548":{"name":"Local Hospital"},"e549":{"name":"Local Hotel"},"e54a":{"name":"Local Laundry Service"},"e54b":{"name":"Local Library"},"e54c":{"name":"Local Mall"},"e54d":{"name":"Local Movies"},"e54e":{"name":"Local Offer"},"e54f":{"name":"Local Parking"},"e550":{"name":"Local Pharmacy"},"e551":{"name":"Local Phone"},"e552":{"name":"Local Pizza"},"e553":{"name":"Local Play"},"e554":{"name":"Local Post Office"},"e555":{"name":"Local Printshop"},"e557":{"name":"Local See"},"e558":{"name":"Local Shipping"},"e559":{"name":"Local Taxi"},"e7f1":{"name":"Location City"},"e1b6":{"name":"Location Disabled"},"e0c7":{"name":"Location Off"},"e0c8":{"name":"Location On"},"e1b7":{"name":"Location Searching"},"e897":{"name":"Lock"},"e898":{"name":"Lock Open"},"e899":{"name":"Lock Outline"},"e3fc":{"name":"Looks"},"e3fb":{"name":"Looks 3"},"e3fd":{"name":"Looks 4"},"e3fe":{"name":"Looks 5"},"e3ff":{"name":"Looks 6"},"e400":{"name":"Looks One"},"e401":{"name":"Looks Two"},"e028":{"name":"Loop"},"e402":{"name":"Loupe"},"e16d":{"name":"Low Priority"},"e89a":{"name":"Loyalty"},"e158":{"name":"Mail"},"e0e1":{"name":"Mail Outline"},"e55b":{"name":"Map"},"e159":{"name":"Markunread"},"e89b":{"name":"Markunread Mailbox"},"e322":{"name":"Memory"},"e5d2":{"name":"Menu"},"e252":{"name":"Merge Type"},"e0c9":{"name":"Message"},"e029":{"name":"Mic"},"e02a":{"name":"Mic None"},"e02b":{"name":"Mic Off"},"e618":{"name":"Mms"},"e253":{"name":"Mode Comment"},"e254":{"name":"Mode Edit"},"e263":{"name":"Monetization On"},"e25c":{"name":"Money Off"},"e403":{"name":"Monochrome Photos"},"e7f2":{"name":"Mood"},"e7f3":{"name":"Mood Bad"},"e619":{"name":"More"},"e5d3":{"name":"More Horiz"},"e5d4":{"name":"More Vert"},"e91b":{"name":"Motorcycle"},"e323":{"name":"Mouse"},"e168":{"name":"Move To Inbox"},"e02c":{"name":"Movie"},"e404":{"name":"Movie Creation"},"e43a":{"name":"Movie Filter"},"e6df":{"name":"Multiline Chart"},"e405":{"name":"Music Note"},"e063":{"name":"Music Video"},"e55c":{"name":"My Location"},"e406":{"name":"Nature"},"e407":{"name":"Nature People"},"e408":{"name":"Navigate Before"},"e409":{"name":"Navigate Next"},"e55d":{"name":"Navigation"},"e569":{"name":"Near Me"},"e1b9":{"name":"Network Cell"},"e640":{"name":"Network Check"},"e61a":{"name":"Network Locked"},"e1ba":{"name":"Network Wifi"},"e031":{"name":"New Releases"},"e16a":{"name":"Next Week"},"e1bb":{"name":"Nfc"},"e641":{"name":"No Encryption"},"e0cc":{"name":"No Sim"},"e033":{"name":"Not Interested"},"e06f":{"name":"Note"},"e89c":{"name":"Note Add"},"e7f4":{"name":"Notifications"},"e7f7":{"name":"Notifications Active"},"e7f5":{"name":"Notifications None"},"e7f6":{"name":"Notifications Off"},"e7f8":{"name":"Notifications Paused"},"e90a":{"name":"Offline Pin"},"e63a":{"name":"Ondemand Video"},"e91c":{"name":"Opacity"},"e89d":{"name":"Open In Browser"},"e89e":{"name":"Open In New"},"e89f":{"name":"Open With"},"e7f9":{"name":"Pages"},"e8a0":{"name":"Pageview"},"e40a":{"name":"Palette"},"e925":{"name":"Pan Tool"},"e40b":{"name":"Panorama"},"e40c":{"name":"Panorama Fish Eye"},"e40d":{"name":"Panorama Horizontal"},"e40e":{"name":"Panorama Vertical"},"e40f":{"name":"Panorama Wide Angle"},"e7fa":{"name":"Party Mode"},"e034":{"name":"Pause"},"e035":{"name":"Pause Circle Filled"},"e036":{"name":"Pause Circle Outline"},"e8a1":{"name":"Payment"},"e7fb":{"name":"People"},"e7fc":{"name":"People Outline"},"e8a2":{"name":"Perm Camera Mic"},"e8a3":{"name":"Perm Contact Calendar"},"e8a4":{"name":"Perm Data Setting"},"e8a5":{"name":"Perm Device Information"},"e8a6":{"name":"Perm Identity"},"e8a7":{"name":"Perm Media"},"e8a8":{"name":"Perm Phone Msg"},"e8a9":{"name":"Perm Scan Wifi"},"e7fd":{"name":"Person"},"e7fe":{"name":"Person Add"},"e7ff":{"name":"Person Outline"},"e55a":{"name":"Person Pin"},"e56a":{"name":"Person Pin Circle"},"e63b":{"name":"Personal Video"},"e91d":{"name":"Pets"},"e0cd":{"name":"Phone"},"e324":{"name":"Phone Android"},"e61b":{"name":"Phone Bluetooth Speaker"},"e61c":{"name":"Phone Forwarded"},"e61d":{"name":"Phone In Talk"},"e325":{"name":"Phone Iphone"},"e61e":{"name":"Phone Locked"},"e61f":{"name":"Phone Missed"},"e620":{"name":"Phone Paused"},"e326":{"name":"Phonelink"},"e0db":{"name":"Phonelink Erase"},"e0dc":{"name":"Phonelink Lock"},"e327":{"name":"Phonelink Off"},"e0dd":{"name":"Phonelink Ring"},"e0de":{"name":"Phonelink Setup"},"e410":{"name":"Photo"},"e411":{"name":"Photo Album"},"e412":{"name":"Photo Camera"},"e43b":{"name":"Photo Filter"},"e413":{"name":"Photo Library"},"e432":{"name":"Photo Size Select Actual"},"e433":{"name":"Photo Size Select Large"},"e434":{"name":"Photo Size Select Small"},"e415":{"name":"Picture As Pdf"},"e8aa":{"name":"Picture In Picture"},"e911":{"name":"Picture In Picture Alt"},"e6c4":{"name":"Pie Chart"},"e6c5":{"name":"Pie Chart Outlined"},"e55e":{"name":"Pin Drop"},"e55f":{"name":"Place"},"e037":{"name":"Play Arrow"},"e038":{"name":"Play Circle Filled"},"e039":{"name":"Play Circle Outline"},"e906":{"name":"Play For Work"},"e03b":{"name":"Playlist Add"},"e065":{"name":"Playlist Add Check"},"e05f":{"name":"Playlist Play"},"e800":{"name":"Plus One"},"e801":{"name":"Poll"},"e8ab":{"name":"Polymer"},"eb48":{"name":"Pool"},"e0ce":{"name":"Portable Wifi Off"},"e416":{"name":"Portrait"},"e63c":{"name":"Power"},"e336":{"name":"Power Input"},"e8ac":{"name":"Power Settings New"},"e91e":{"name":"Pregnant Woman"},"e0df":{"name":"Present To All"},"e8ad":{"name":"Print"},"e645":{"name":"Priority High"},"e80b":{"name":"Public"},"e255":{"name":"Publish"},"e8ae":{"name":"Query Builder"},"e8af":{"name":"Question Answer"},"e03c":{"name":"Queue"},"e03d":{"name":"Queue Music"},"e066":{"name":"Queue Play Next"},"e03e":{"name":"Radio"},"e837":{"name":"Radio Button Checked"},"e836":{"name":"Radio Button Unchecked"},"e560":{"name":"Rate Review"},"e8b0":{"name":"Receipt"},"e03f":{"name":"Recent Actors"},"e91f":{"name":"Record Voice Over"},"e8b1":{"name":"Redeem"},"e15a":{"name":"Redo"},"e5d5":{"name":"Refresh"},"e15b":{"name":"Remove"},"e15c":{"name":"Remove Circle"},"e15d":{"name":"Remove Circle Outline"},"e067":{"name":"Remove From Queue"},"e417":{"name":"Remove Red Eye"},"e928":{"name":"Remove Shopping Cart"},"e8fe":{"name":"Reorder"},"e040":{"name":"Repeat"},"e041":{"name":"Repeat One"},"e042":{"name":"Replay"},"e059":{"name":"Replay 10"},"e05a":{"name":"Replay 30"},"e05b":{"name":"Replay 5"},"e15e":{"name":"Reply"},"e15f":{"name":"Reply All"},"e160":{"name":"Report"},"e8b2":{"name":"Report Problem"},"e56c":{"name":"Restaurant"},"e561":{"name":"Restaurant Menu"},"e8b3":{"name":"Restore"},"e929":{"name":"Restore Page"},"e0d1":{"name":"Ring Volume"},"e8b4":{"name":"Room"},"eb49":{"name":"Room Service"},"e418":{"name":"Rotate 90 Degrees Ccw"},"e419":{"name":"Rotate Left"},"e41a":{"name":"Rotate Right"},"e920":{"name":"Rounded Corner"},"e328":{"name":"Router"},"e921":{"name":"Rowing"},"e0e5":{"name":"Rss Feed"},"e642":{"name":"Rv Hookup"},"e562":{"name":"Satellite"},"e161":{"name":"Save"},"e329":{"name":"Scanner"},"e8b5":{"name":"Schedule"},"e80c":{"name":"School"},"e1be":{"name":"Screen Lock Landscape"},"e1bf":{"name":"Screen Lock Portrait"},"e1c0":{"name":"Screen Lock Rotation"},"e1c1":{"name":"Screen Rotation"},"e0e2":{"name":"Screen Share"},"e623":{"name":"Sd Card"},"e1c2":{"name":"Sd Storage"},"e8b6":{"name":"Search"},"e32a":{"name":"Security"},"e162":{"name":"Select All"},"e163":{"name":"Send"},"e811":{"name":"Sentiment Dissatisfied"},"e812":{"name":"Sentiment Neutral"},"e813":{"name":"Sentiment Satisfied"},"e814":{"name":"Sentiment Very Dissatisfied"},"e815":{"name":"Sentiment Very Satisfied"},"e8b8":{"name":"Settings"},"e8b9":{"name":"Settings Applications"},"e8ba":{"name":"Settings Backup Restore"},"e8bb":{"name":"Settings Bluetooth"},"e8bd":{"name":"Settings Brightness"},"e8bc":{"name":"Settings Cell"},"e8be":{"name":"Settings Ethernet"},"e8bf":{"name":"Settings Input Antenna"},"e8c0":{"name":"Settings Input Component"},"e8c1":{"name":"Settings Input Composite"},"e8c2":{"name":"Settings Input Hdmi"},"e8c3":{"name":"Settings Input Svideo"},"e8c4":{"name":"Settings Overscan"},"e8c5":{"name":"Settings Phone"},"e8c6":{"name":"Settings Power"},"e8c7":{"name":"Settings Remote"},"e1c3":{"name":"Settings System Daydream"},"e8c8":{"name":"Settings Voice"},"e80d":{"name":"Share"},"e8c9":{"name":"Shop"},"e8ca":{"name":"Shop Two"},"e8cb":{"name":"Shopping Basket"},"e8cc":{"name":"Shopping Cart"},"e261":{"name":"Short Text"},"e6e1":{"name":"Show Chart"},"e043":{"name":"Shuffle"},"e1c8":{"name":"Signal Cellular 4 Bar"},"e1cd":{"name":"Signal Cellular Connected No Internet 4 Bar"},"e1ce":{"name":"Signal Cellular No Sim"},"e1cf":{"name":"Signal Cellular Null"},"e1d0":{"name":"Signal Cellular Off"},"e1d8":{"name":"Signal Wifi 4 Bar"},"e1d9":{"name":"Signal Wifi 4 Bar Lock"},"e1da":{"name":"Signal Wifi Off"},"e32b":{"name":"Sim Card"},"e624":{"name":"Sim Card Alert"},"e044":{"name":"Skip Next"},"e045":{"name":"Skip Previous"},"e41b":{"name":"Slideshow"},"e068":{"name":"Slow Motion Video"},"e32c":{"name":"Smartphone"},"eb4a":{"name":"Smoke Free"},"eb4b":{"name":"Smoking Rooms"},"e625":{"name":"Sms"},"e626":{"name":"Sms Failed"},"e046":{"name":"Snooze"},"e164":{"name":"Sort"},"e053":{"name":"Sort By Alpha"},"eb4c":{"name":"Spa"},"e256":{"name":"Space Bar"},"e32d":{"name":"Speaker"},"e32e":{"name":"Speaker Group"},"e8cd":{"name":"Speaker Notes"},"e92a":{"name":"Speaker Notes Off"},"e0d2":{"name":"Speaker Phone"},"e8ce":{"name":"Spellcheck"},"e838":{"name":"Star"},"e83a":{"name":"Star Border"},"e839":{"name":"Star Half"},"e8d0":{"name":"Stars"},"e0d3":{"name":"Stay Current Landscape"},"e0d4":{"name":"Stay Current Portrait"},"e0d5":{"name":"Stay Primary Landscape"},"e0d6":{"name":"Stay Primary Portrait"},"e047":{"name":"Stop"},"e0e3":{"name":"Stop Screen Share"},"e1db":{"name":"Storage"},"e8d1":{"name":"Store"},"e563":{"name":"Store Mall Directory"},"e41c":{"name":"Straighten"},"e56e":{"name":"Streetview"},"e257":{"name":"Strikethrough S"},"e41d":{"name":"Style"},"e5d9":{"name":"Subdirectory Arrow Left"},"e5da":{"name":"Subdirectory Arrow Right"},"e8d2":{"name":"Subject"},"e064":{"name":"Subscriptions"},"e048":{"name":"Subtitles"},"e56f":{"name":"Subway"},"e8d3":{"name":"Supervisor Account"},"e049":{"name":"Surround Sound"},"e0d7":{"name":"Swap Calls"},"e8d4":{"name":"Swap Horiz"},"e8d5":{"name":"Swap Vert"},"e8d6":{"name":"Swap Vertical Circle"},"e41e":{"name":"Switch Camera"},"e41f":{"name":"Switch Video"},"e627":{"name":"Sync"},"e628":{"name":"Sync Disabled"},"e629":{"name":"Sync Problem"},"e62a":{"name":"System Update"},"e8d7":{"name":"System Update Alt"},"e8d8":{"name":"Tab"},"e8d9":{"name":"Tab Unselected"},"e32f":{"name":"Tablet"},"e330":{"name":"Tablet Android"},"e331":{"name":"Tablet Mac"},"e420":{"name":"Tag Faces"},"e62b":{"name":"Tap And Play"},"e564":{"name":"Terrain"},"e262":{"name":"Text Fields"},"e165":{"name":"Text Format"},"e0d8":{"name":"Textsms"},"e421":{"name":"Texture"},"e8da":{"name":"Theaters"},"e8db":{"name":"Thumb Down"},"e8dc":{"name":"Thumb Up"},"e8dd":{"name":"Thumbs Up Down"},"e62c":{"name":"Time To Leave"},"e422":{"name":"Timelapse"},"e922":{"name":"Timeline"},"e425":{"name":"Timer"},"e423":{"name":"Timer 10"},"e424":{"name":"Timer 3"},"e426":{"name":"Timer Off"},"e264":{"name":"Title"},"e8de":{"name":"Toc"},"e8df":{"name":"Today"},"e8e0":{"name":"Toll"},"e427":{"name":"Tonality"},"e913":{"name":"Touch App"},"e332":{"name":"Toys"},"e8e1":{"name":"Track Changes"},"e565":{"name":"Traffic"},"e570":{"name":"Train"},"e571":{"name":"Tram"},"e572":{"name":"Transfer Within A Station"},"e428":{"name":"Transform"},"e8e2":{"name":"Translate"},"e8e3":{"name":"Trending Down"},"e8e4":{"name":"Trending Flat"},"e8e5":{"name":"Trending Up"},"e429":{"name":"Tune"},"e8e6":{"name":"Turned In"},"e8e7":{"name":"Turned In Not"},"e333":{"name":"Tv"},"e169":{"name":"Unarchive"},"e166":{"name":"Undo"},"e5d6":{"name":"Unfold Less"},"e5d7":{"name":"Unfold More"},"e923":{"name":"Update"},"e1e0":{"name":"Usb"},"e8e8":{"name":"Verified User"},"e258":{"name":"Vertical Align Bottom"},"e259":{"name":"Vertical Align Center"},"e25a":{"name":"Vertical Align Top"},"e62d":{"name":"Vibration"},"e070":{"name":"Video Call"},"e071":{"name":"Video Label"},"e04a":{"name":"Video Library"},"e04b":{"name":"Videocam"},"e04c":{"name":"Videocam Off"},"e338":{"name":"Videogame Asset"},"e8e9":{"name":"View Agenda"},"e8ea":{"name":"View Array"},"e8eb":{"name":"View Carousel"},"e8ec":{"name":"View Column"},"e42a":{"name":"View Comfy"},"e42b":{"name":"View Compact"},"e8ed":{"name":"View Day"},"e8ee":{"name":"View Headline"},"e8ef":{"name":"View List"},"e8f0":{"name":"View Module"},"e8f1":{"name":"View Quilt"},"e8f2":{"name":"View Stream"},"e8f3":{"name":"View Week"},"e435":{"name":"Vignette"},"e8f4":{"name":"Visibility"},"e8f5":{"name":"Visibility Off"},"e62e":{"name":"Voice Chat"},"e0d9":{"name":"Voicemail"},"e04d":{"name":"Volume Down"},"e04e":{"name":"Volume Mute"},"e04f":{"name":"Volume Off"},"e050":{"name":"Volume Up"},"e0da":{"name":"Vpn Key"},"e62f":{"name":"Vpn Lock"},"e1bc":{"name":"Wallpaper"},"e002":{"name":"Warning"},"e334":{"name":"Watch"},"e924":{"name":"Watch Later"},"e42c":{"name":"Wb Auto"},"e42d":{"name":"Wb Cloudy"},"e42e":{"name":"Wb Incandescent"},"e436":{"name":"Wb Iridescent"},"e430":{"name":"Wb Sunny"},"e63d":{"name":"Wc"},"e051":{"name":"Web"},"e069":{"name":"Web Asset"},"e16b":{"name":"Weekend"},"e80e":{"name":"Whatshot"},"e1bd":{"name":"Widgets"},"e63e":{"name":"Wifi"},"e1e1":{"name":"Wifi Lock"},"e1e2":{"name":"Wifi Tethering"},"e8f9":{"name":"Work"},"e25b":{"name":"Wrap Text"},"e8fa":{"name":"Youtube Searched For"},"e8ff":{"name":"Zoom In"},"e900":{"name":"Zoom Out"},"e56b":{"name":"Zoom Out Map"}}} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg new file mode 100755 index 0000000..a449327 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.svg @@ -0,0 +1,2373 @@ + + + + + +Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016 + By shyndman +Copyright 2015 Google, Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf new file mode 100755 index 0000000..7015564 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff new file mode 100755 index 0000000..b648a3e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 new file mode 100755 index 0000000..9fa2112 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css new file mode 100755 index 0000000..2270c09 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/material-icons/material-icons.css @@ -0,0 +1,36 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(MaterialIcons-Regular.eot); /* For IE6-8 */ + src: local('Material Icons'), + local('MaterialIcons-Regular'), + url(MaterialIcons-Regular.woff2) format('woff2'), + url(MaterialIcons-Regular.woff) format('woff'), + url(MaterialIcons-Regular.ttf) format('truetype'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; /* Preferred icon size */ + display: inline-block; + line-height: 1; + text-transform: none; + letter-spacing: normal; + word-wrap: normal; + white-space: nowrap; + direction: ltr; + + /* Support for all WebKit browsers. */ + -webkit-font-smoothing: antialiased; + /* Support for Safari and Chrome. */ + text-rendering: optimizeLegibility; + + /* Support for Firefox. */ + -moz-osx-font-smoothing: grayscale; + + /* Support for IE. */ + font-feature-settings: 'liga'; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff new file mode 100755 index 0000000..780de6d Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 new file mode 100755 index 0000000..72a32ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Bold.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff new file mode 100755 index 0000000..20ec4ab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 new file mode 100755 index 0000000..642a2d4 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-BoldItalic.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff new file mode 100755 index 0000000..a994609 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 new file mode 100755 index 0000000..b3238fa Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Light.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff new file mode 100755 index 0000000..7cc63b7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 new file mode 100755 index 0000000..3f438f8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-LightItalic.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff new file mode 100755 index 0000000..40c056e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 new file mode 100755 index 0000000..46f89cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-Regular.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff new file mode 100755 index 0000000..ddc9c01 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 new file mode 100755 index 0000000..08d7a51 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/fonts/skycoin/Skycoin-RegularItalic.woff2 differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/header.png new file mode 100755 index 0000000..be1002a Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/header.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/i18n/en.json b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/i18n/en.json new file mode 100755 index 0000000..74849ce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/i18n/en.json @@ -0,0 +1,244 @@ +{ + "common": { + "coin-id": "SKY", + "coin-hours": "Coin Hours", + "loading": "Loading...", + "new": "New", + "load": "Load" + }, + + "errors": { + "fetch-version": "Unable to fetch latest release version from Github", + "incorrect-password": "Incorrect password", + "api-disabled": "API disabled", + "no-wallet": "Wallet does not exist", + "no-outputs": "No unspent outputs" + }, + + "title": { + "wallets": "Wallets", + "send": "Send", + "history": "History", + "buy-coin": "Buy Skycoin", + "network": "Networking", + "blockchain": "Blockchain", + "outputs": "Outputs", + "transactions": "Transactions", + "pending-txs": "Pending Transactions", + "backup": "Backup Wallet", + "explorer": "Skycoin Explorer", + "seed": "Wallet Seed", + "qrcode": "QR Code" + }, + + "header": { + "syncing-blocks": "Syncing blocks", + "update1": "Wallet update", + "update2": "available.", + "pending-txs1": "There are some", + "pending-txs2": "pending transactions.", + "pending-txs3": "Data you see may not be updated.", + + "errors": { + "no-connections": "No connections active, your client is not connected to any other nodes!", + "no-backend1": "Cannot reach backend. Please restart the app and/or seek help on our", + "no-backend2": "Telegram.", + "no-backend3": "", + "csrf": "Security vulnerability: CSRF is not working, please exit immediately." + } + }, + + "password": { + "title": "Enter Password", + "label": "Password", + "confirm-label": "Confirm password", + "button": "Proceed" + }, + + "buy": { + "deposit-address": "Choose an address to generate a BTC deposit link for:", + "select-address": "Select address", + "generate": "Generate", + "deposit-location": "Deposit Location", + "deposit-location-desc": "Choose a wallet where you'd like us to deposit your Skycoin after we receive your Bitcoin.", + "make-choice": "Make a choice", + "wallets-desc": "Each time a new wallet and address are selected, a new BTC address is generated. A single Skycoin address can have up to 5 BTC addresses assigned to it.", + "send": "Send Bitcoin", + "send-desc": "Send Bitcoin to the address below. Once received, we will deposit the Skycoin to a new address in the wallet selected above at the current rate of {{ rate }} SKY/BTC.", + "fraction-warning": "Only send multiple of the SKY/BTC rate! Skycoin is sent in whole number; fractional SKY is not sent!", + "receive": "Receive Sky", + "receive-desc": "After receiving your Bitcoin, we'll send you your Skycoin. It may take anywhere between 20 minutes and an hour to receive your SKY.", + "status-button": "Status:", + "check-status-button": "Check Status", + "new-order-button": "New Order" + }, + + "wizard": { + "wallet-desc": "If you don't have a Skycoin wallet, use the generated seed to create a new one. If you already have a wallet, toggle over to \"Load Wallet\" and enter your seed.", + "encrypt-desc": "Increase security of your wallet by encrypting it. By entering a password below, your wallet will be encrypted. Only those with the password will be able access the wallet and remove funds.", + "finish-button": "Finish", + "back-button": "Back", + + "confirm": { + "title": "Safeguard your seed!", + "desc": "We want to make sure that you wrote down your seed and stored it in a safe place. If you forget your seed, you WILL NOT be able to recover your Skycoin wallet!", + "checkbox": "It’s safe, I swear.", + "button": "Continue" + } + }, + + "wallet": { + "new-address": "New Address", + "show-empty": "Show Empty", + "hide-empty": "Hide Empty", + "encrypt": "Encrypt Wallet", + "decrypt": "Decrypt Wallet", + "edit": "Edit Wallet", + "add": "Add Wallet", + "load": "Load Wallet", + "encryption-enabled": "Encryption enabled", + "encryption-disabled": "Encryption disabled", + "wallet": "Wallet", + + "new": { + "create-title": "Create Wallet", + "load-title": "Load Wallet", + "encrypt-title": "Encrypt Wallet", + "name-label": "Name", + "seed-label": "Seed", + "confirm-seed-label": "Confirm seed", + "seed-warning": "Remember this seed! Keep it in a safe place. If you forget your seed, you will not be able to recover your wallet!", + "create-button": "Create", + "load-button": "Load", + "cancel-button": "Cancel", + "12-words": "12 words", + "24-words": "24 words", + "generate-12-seed": "Generate 12 word seed", + "generate-24-seed": "Generate 24 word seed", + "encrypt": "Encrypt wallet", + "encrypt-warning": "We suggest that you encrypt each one of your wallets with a password. If you forget your password, you can reset it with your seed. Make sure you have your seed saved somewhere safe before encrypting your wallet." + }, + + "rename": { + "title": "Rename Wallet", + "name-label": "Name", + "cancel-button": "Cancel", + "rename-button": "Rename" + }, + + "address": { + "copy": "Copy", + "copy-address": "Copy address", + "copied": "Copied!", + "outputs": "Unspent Outputs" + } + }, + + "send": { + "from-label": "Send from", + "to-label": "Send to", + "amount-label": "Amount", + "notes-label": "Notes", + "wallet-label": "Wallet", + "addresses-label": "Addresses", + "addresses-help": "Wallet addresses to send from", + "change-address-label": "Custom change address", + "change-address-help": "Address to receive change. If it's not provided, it will be chosen automatically", + "destinations-label": "Destinations", + "destinations-help1": "Destination addresses and their coins", + "destinations-help2": "Destination addresses, their coins and coin hours", + "hours-allocation-label": "Automatic coin hours allocation", + "options-label": "Options", + "value-label": "Coin hours share factor", + "value-help": "The higher the value, the more coin hours will be sent to outputs", + "preview-button": "Preview", + "send-button": "Send", + "back-button": "Back", + "simple": "Simple", + "advanced": "Advanced" + }, + + "tx": { + "transaction": "Transaction", + "confirm-transaction": "Confirm Transaction", + "from": "From", + "to": "To", + "date": "Date", + "status": "Status", + "coins": "Coins", + "hours": "Hours", + "id": "Tx ID", + "show-more": "Show more", + "hours-sent": "sent", + "hours-burned": "burned", + "inputs": "Inputs", + "outputs": "Outputs", + "confirmed": "Confirmed", + "pending": "Pending", + "current-rate": "Calculated at the current rate" + }, + + "backup": { + "wallet-directory": "Wallet Directory:", + "seed-warning": "BACKUP YOUR SEED. ON PAPER. IN A SAFE PLACE. As long as you have your seed, you can recover your coins.", + "desc": "Use the table below to get seeds from your encrypted wallets.
To get seeds from unencrypted wallets, open the folder above, open the .wlt files in a text editor and recover the seeds.", + "close-button": "Close", + "wallet": "Wallet Label", + "filename": "Filename", + "seed": "Seed", + "show-seed": "Show seed", + "no-wallets": "No encrypted wallets" + }, + + "blockchain": { + "blocks": "Number of blocks", + "time": "Timestamp of last block", + "hash": "Hash of last block", + "current-supply": "Current SKY supply", + "total-supply": "Total SKY supply", + "current-coinhour-supply": "Current Coin Hours supply", + "total-coinhour-supply": "Total Coin Hours supply" + }, + + "network": { + "peer": "Peer", + "source": "Source", + "block-height": "Block height", + "last-seen": "Last seen", + "last-received": "Last received", + "last-sent": "Last sent", + "in": "Incoming", + "out": "Outgoing", + + "sources": { + "default": "Default peer", + "exchange": "Peer exchange" + } + }, + + "pending-txs": { + "timestamp": "Timestamp", + "txid": "Transaction ID", + "none": "No pending transactions", + "my": "Mine", + "all": "All" + }, + + "history": { + "tx-detail": "Transaction Detail", + "sending": "Sending", + "sent": "Sent", + "received": "Received", + "receiving": "Receiving", + "pending": "Pending", + "no-txs": "You have no transaction history" + }, + + "teller": { + "done": "Completed", + "waiting-confirm": "Waiting for confirmation", + "waiting-deposit": "Waiting for Bitcoin deposit", + "waiting-send": "Waiting to send Skycoin", + "unknown": "Unknown" + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png new file mode 100755 index 0000000..d040458 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/chevron-right-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/close-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/close-grey.png new file mode 100755 index 0000000..2f0ec3b Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/close-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-blue.png new file mode 100755 index 0000000..de88a9a Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-blue.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-grey.png new file mode 100755 index 0000000..a5cf11e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/edit-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/header.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/header.png new file mode 100755 index 0000000..d73c273 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/header.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/load-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/load-gold.png new file mode 100755 index 0000000..4d1cbf7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/load-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-gold.png new file mode 100755 index 0000000..fc53863 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-grey.png new file mode 100755 index 0000000..3f835e7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/lock-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/logo-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/logo-white.png new file mode 100755 index 0000000..8b714cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/logo-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-grey.png new file mode 100755 index 0000000..b81e568 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-red.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-red.png new file mode 100755 index 0000000..6686a98 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/minus-red.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/money-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/money-gold.png new file mode 100755 index 0000000..649fc3b Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/money-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/otc-background.jpg b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/otc-background.jpg new file mode 100755 index 0000000..03a8401 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/otc-background.jpg differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-gold.png new file mode 100755 index 0000000..854692e Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-green.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-green.png new file mode 100755 index 0000000..ab02079 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-green.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-grey.png new file mode 100755 index 0000000..35dbfff Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/plus-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/qr-code-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/qr-code-black.png new file mode 100755 index 0000000..f9a2fab Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/qr-code-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-black.png new file mode 100755 index 0000000..9f27742 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-blue.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-blue.png new file mode 100755 index 0000000..4226468 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-blue.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-gold.png new file mode 100755 index 0000000..59645e7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-white.png new file mode 100755 index 0000000..16261a2 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/send-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/transactions-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/transactions-black.png new file mode 100755 index 0000000..413f223 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/transactions-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-gold.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-gold.png new file mode 100755 index 0000000..3ecf4ae Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-gold.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-grey.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-grey.png new file mode 100755 index 0000000..61a3177 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/unlock-grey.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/wallet-black.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/wallet-black.png new file mode 100755 index 0000000..cdb2ec8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/img/wallet-black.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/logo-white.png b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/logo-white.png new file mode 100755 index 0000000..cd615cf Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/logo-white.png differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js new file mode 100755 index 0000000..993e88f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/assets/scripts/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/current-skycoin.json b/vendor/github.com/skycoin/skycoin/src/gui/static/src/current-skycoin.json new file mode 100755 index 0000000..381e17e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/current-skycoin.json @@ -0,0 +1 @@ +versionData='{ "version": "0.24.1" }'; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.prod.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.prod.ts new file mode 100755 index 0000000..af32bad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.prod.ts @@ -0,0 +1,5 @@ +export const environment = { + nodeUrl: '/api/v1/', + production: true, + tellerUrl: 'https://event.skycoin.net/api/', +}; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.ts new file mode 100755 index 0000000..db510b3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/environments/environment.ts @@ -0,0 +1,10 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + nodeUrl: '/api/v1/', + production: false, + tellerUrl: '/teller/', +}; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/favicon.ico b/vendor/github.com/skycoin/skycoin/src/gui/static/src/favicon.ico new file mode 100755 index 0000000..cc325fd Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/gui/static/src/favicon.ico differ diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/index.html b/vendor/github.com/skycoin/skycoin/src/gui/static/src/index.html new file mode 100755 index 0000000..f80c021 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/index.html @@ -0,0 +1,13 @@ + + + + + Skycoin + + + + + + + + diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/main.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/main.ts new file mode 100755 index 0000000..6b163a1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/main.ts @@ -0,0 +1,13 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +import 'hammerjs'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/polyfills.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/polyfills.ts new file mode 100755 index 0000000..7831e97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/polyfills.ts @@ -0,0 +1,72 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. **/ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** Evergreen browsers require these. **/ +import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; + + +/** + * Required to support Web Animations `@angular/animation`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/styles.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/styles.scss new file mode 100755 index 0000000..63a158e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/styles.scss @@ -0,0 +1,350 @@ +@import 'theme/variables'; +@import 'theme/tables'; +@import '~bootstrap/scss/bootstrap-grid.scss'; + +/* You can add global styles to this file, and also import other style files */ +//@import '~@angular/material/prebuilt-themes/indigo-pink.css'; +@import 'app/app.theme.scss'; + +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-Light.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Light.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 300; + src: url('assets/fonts/skycoin/Skycoin-LightItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-LightItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-Regular.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Regular.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 400; + src: url('assets/fonts/skycoin/Skycoin-RegularItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-RegularItalic.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: normal; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-Bold.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-Bold.woff') format('woff'); +} +@font-face { + font-family: 'Skycoin'; + font-style: italic; + font-weight: 700; + src: url('assets/fonts/skycoin/Skycoin-BoldItalic.woff2') format('woff2'), + url('assets/fonts/skycoin/Skycoin-BoldItalic.woff') format('woff'); +} + +$mat-font-family: Skycoin, sans-serif; +$white: #FBFBFB; + +$primary-color: #0072ff; +$secondary-color: #ffc125; + +body, div, h1, h2, h3, h4, h5, h6, p, span, a, button, option, select, +mat-panel-description, mat-panel-title, mat-option.mat-option { + font-family: $mat-font-family; +} + +html { + height: 100%; +} + +body { + background-color: #f7f7f7; + margin: 0; + padding: 0; + height: 100%; +} + +header { + background: url("assets/header.png") center center / cover, linear-gradient(-155deg, #686e96 0%, #373b5c 100%); + width: 100%; + height: 300px; +} + +mat-dialog-container { + border-radius: 5px !important; +} + +.mat-dialog-container { + padding: 0 !important; +} + +.header-container { + max-width: 848px; + text-align: center; + padding-top: 40px; + margin-right: auto; + margin-left: auto; +} + +.header-container h1 { + font-size: 3em; + color: white; +} + +.button-line { + margin-top: 40px; + text-align: right; +} + +.datatable-row-group { + cursor: pointer; +} + +button.active { + background-color: rgba(0,0,0,.12); +} + +mat-spinner.in-button .mat-spinner path { + stroke: #000; + opacity: 0.3; +} + +snack-bar-container { + background-color: rgba(255, 0, 0, 0.8) !important; +} + +mat-panel-title { + width: 60%; + display: block; + flex-grow: 0 !important; +} + +.sky-container { + min-width: 100%; + min-height: 100%; + + &.sky-container-grey { + background-color: $grey-lightest; + } +} + +.flex-fill, .-flex-fill { + flex: 1 1 auto; +} + +.form-field { + margin-bottom: 20px; + + label { + color: #1e2227; + display: block; + font-size: 13px; + line-height: 20px; + margin-bottom: 2px; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + appearance: none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.primary button.enabled, .primary-gradient-background { + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + span { + color: white; + } +} + +/** +General Helpers + */ + +.primary-color { + color: $primary-color; +} + +.secondary-color { + color: $secondary-color; +} + +.no-opacity { + opacity: 1 !important; +} + +.light-opacity { + opacity: 0.2 +} + +.rotate-90 { + transform: rotate(90deg); +} + +.rotate-180 { + transform: rotate(180deg); +} + +.rotate-270 { + transform: rotate(270deg); +} + +mat-spinner.in-button svg { + height: 24px !important; + width: 24px !important; +} + +.empty-row { + padding: 0 1.2rem !important; + line-height: 50px !important; +} + +/** +On-boarding components + */ + +.onboarding-container { + width: 100%; + height: 100%; + overflow-x: hidden; + background: $gradient-blue-dark; /* For browsers that do not support gradients */ + background: -webkit-linear-gradient(left top, $gradient-blue-dark, $gradient-blue-light); /* For Safari 5.1 to 6.0 */ + background: -o-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Opera 11.1 to 12.0 */ + background: -moz-linear-gradient(bottom right, $gradient-blue-dark, $gradient-blue-light); /* For Firefox 3.6 to 15 */ + background: linear-gradient(to bottom right, $gradient-blue-dark, $gradient-blue-light); /* Standard syntax */ + + label { + color: white; + } + + input { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } + + select { + background-color: white; + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + -webkit-appearance:none; + } + + textarea { + border: 2px solid rgba(0, 0, 0, 0.05); + border-radius: 6px; + box-sizing: border-box; + display: block; + line-height: 20px; + padding: 10px 10px; + width: 100%; + } +} + +.dark button.enabled { + background-color: $black !important; + span { + color: white; + } +} + +.ghost button.enabled { + background-color: $transparent !important; + span { + color: black; + } +} + + +.-select { + position: relative; + + &::after { + content: ''; + display: block; + position: absolute; + top: 0; + right: 0; + background: url('/assets/img/chevron-right-grey.png') no-repeat; + background-size: 32px 32px; + width: 32px; + height: 32px; + margin: 6px; + pointer-events: none; + transform: rotate(90deg); + } +} + +.mat-menu-panel { + border-radius: 5px !important; + background-color: #fefefe; + + .mat-menu-item { + font-family: Skycoin; + line-height: 50px; + } + + &.compact { + .mat-menu-item { + font-size: 13px; + height: 35px; + line-height: 35px; + } + } +} + +.qr-code-button { + opacity: 0.6; + cursor: pointer; + + &:hover { + opacity: 1; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/test.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/test.ts new file mode 100755 index 0000000..0c45c2e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/test.ts @@ -0,0 +1,32 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; +declare const require: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function() {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_tables.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_tables.scss new file mode 100755 index 0000000..29971a8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_tables.scss @@ -0,0 +1,69 @@ +@import 'variables'; + +.-table { + &:last-of-type { + margin-bottom: 30px; + } + + .-headers { + color: $grey-light; + display: flex; + font-size: 12px; + font-weight: 700; + height: 50px; + line-height: 50px; + margin: 0 30px; + + > div { + padding: 0 20px; + } + } + + .-body { + border-radius: 15px; + box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.01), 1px 1px 2px 2px rgba(0, 0, 0, 0.01); + margin: 0 30px; + + .-row { + font-size: $font-size-standard; + line-height: $row-height; + height: $row-height; + background: $white; + display: flex; + + &:not(:last-child) { + border-bottom: 1px solid #eff0f0; + } + + &:first-child { + border-top-left-radius: 15px; + border-top-right-radius: 15px; + } + + &:last-child { + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + } + + > div { + padding: 0 20px; + } + } + } + + .-width-70 { + width: 70px; + } + + .-width-150 { + width: 150px; + } + + .-width-200 { + width: 200px; + } + + .-width-250 { + width: 250px; + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_variables.scss b/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_variables.scss new file mode 100755 index 0000000..c627bcd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/theme/_variables.scss @@ -0,0 +1,27 @@ +// Backgrounds +$gradient-blue-dark: #0072ff; +$gradient-blue-dark-transparent: rgba(0, 114, 255, 0.7); +$gradient-blue-light: #00C3ff; +$gradient-blue-light-transparent: rgba(0, 195, 255, 0.7); + +// Colors +$black: #171a1d; + +$grey-lightest: #f7f7f7; +$grey-light: rgba(30, 34, 39, 0.2); +$grey: rgba(30, 34, 39, 0.5); +$grey-dark: #1e2227; + +$white: #fafafa; +$transparent: rgba(0,0,0,0); + +$red: #ff004e; +$blue: #0072ff; + +// Grid +$row-height: 60px; +$row-detail-size: 32px; + +// Texts +$font-size-standard: 13px; +$letter-spacing-wide: 1px; diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.app.json b/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.app.json new file mode 100755 index 0000000..39ba8db --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.app.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "es2015", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts" + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.spec.json b/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.spec.json new file mode 100755 index 0000000..63d89ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/src/typings.d.ts b/vendor/github.com/skycoin/skycoin/src/gui/static/src/typings.d.ts new file mode 100755 index 0000000..bcc7cff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/src/typings.d.ts @@ -0,0 +1,10 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} + +declare var System: System; +interface System { + import(request: string): Promise; +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/tsconfig.json b/vendor/github.com/skycoin/skycoin/src/gui/static/tsconfig.json new file mode 100755 index 0000000..1f9b558 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2016", + "dom" + ] + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/gui/static/tslint.json b/vendor/github.com/skycoin/skycoin/src/gui/static/tslint.json new file mode 100755 index 0000000..cd6c2c0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/gui/static/tslint.json @@ -0,0 +1,159 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 200 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + }, + { + "call-signature": "onespace", + "index-signature": "onespace", + "parameter": "onespace", + "property-declaration": "onespace", + "variable-declaration": "onespace" + } + ], + "typeof-compare": true, + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-module", + "check-separator", + "check-type", + "check-typecast", + "check-preblock" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true, + "trailing-comma": [ + true, + { + "multiline": "always", + "esSpecCompliant": true + } + ], + "newline-before-return": true, + "space-before-function-paren": [true, "never"], + "prefer-method-signature": true + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/config.go b/vendor/github.com/skycoin/skycoin/src/skycoin/config.go new file mode 100755 index 0000000..1867c66 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/config.go @@ -0,0 +1,410 @@ +package skycoin + +import ( + "flag" + "path/filepath" + "runtime" + "strings" + "time" + + "log" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/file" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/wallet" +) + +var ( + help = false +) + +// Config records skycoin node and build config +type Config struct { + Node NodeConfig + Build visor.BuildInfo +} + +// NodeConfig records the node's configuration +type NodeConfig struct { + // Disable peer exchange + DisablePEX bool + // Download peer list + DownloadPeerList bool + // Download the peers list from this URL + PeerListURL string + // Don't make any outgoing connections + DisableOutgoingConnections bool + // Don't allowing incoming connections + DisableIncomingConnections bool + // Disables networking altogether + DisableNetworking bool + // Enable wallet API + EnableWalletAPI bool + // Enable GUI + EnableGUI bool + // Disable CSRF check in the wallet API + DisableCSRF bool + // Enable /api/v1/wallet/seed API endpoint + EnableSeedAPI bool + // Enable unversioned API endpoints (without the /api/v1 prefix) + EnableUnversionedAPI bool + // Disable CSP disable content-security-policy in http response + DisableCSP bool + + // Only run on localhost and only connect to others on localhost + LocalhostOnly bool + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address string + // gnet uses this for TCP incoming and outgoing + Port int + // Maximum outgoing connections to maintain + MaxOutgoingConnections int + // Maximum default outgoing connections + MaxDefaultPeerOutgoingConnections int + // How often to make outgoing connections + OutgoingConnectionsRate time.Duration + // PeerlistSize represents the maximum number of peers that the pex would maintain + PeerlistSize int + // Wallet Address Version + //AddressVersion string + // Remote web interface + WebInterface bool + WebInterfacePort int + WebInterfaceAddr string + WebInterfaceCert string + WebInterfaceKey string + WebInterfaceHTTPS bool + + RPCInterface bool + + // Launch System Default Browser after client startup + LaunchBrowser bool + + // If true, print the configured client web interface address and exit + PrintWebInterfaceAddress bool + + // Data directory holds app data -- defaults to ~/.skycoin + DataDirectory string + // GUI directory contains assets for the HTML interface + GUIDirectory string + + ReadTimeout time.Duration + WriteTimeout time.Duration + IdleTimeout time.Duration + + // Logging + ColorLog bool + // This is the value registered with flag, it is converted to LogLevel after parsing + LogLevel string + // Disable "Reply to ping", "Received pong" log messages + DisablePingPong bool + + // Verify the database integrity after loading + VerifyDB bool + // Reset the database if integrity checks fail, and continue running + ResetCorruptDB bool + + // Wallets + // Defaults to ${DataDirectory}/wallets/ + WalletDirectory string + // Wallet crypto type + WalletCryptoType string + + RunMaster bool + + /* Developer options */ + + // Enable cpu profiling + ProfileCPU bool + // Where the file is written to + ProfileCPUFile string + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf bool + + DBPath string + DBReadOnly bool + Arbitrating bool + LogToFile bool + Version bool // show node version + + GenesisSignatureStr string + GenesisAddressStr string + BlockchainPubkeyStr string + BlockchainSeckeyStr string + GenesisTimestamp uint64 + GenesisCoinVolume uint64 + DefaultConnections []string + + genesisSignature cipher.Sig + genesisAddress cipher.Address + + blockchainPubkey cipher.PubKey + blockchainSeckey cipher.SecKey +} + +// NewNodeConfig returns a new node config instance +func NewNodeConfig(mode string, node NodeParameters) *NodeConfig { + nodeConfig := &NodeConfig{ + GenesisSignatureStr: node.GenesisSignatureStr, + GenesisAddressStr: node.GenesisAddressStr, + GenesisCoinVolume: node.GenesisCoinVolume, + GenesisTimestamp: node.GenesisTimestamp, + BlockchainPubkeyStr: node.BlockchainPubkeyStr, + BlockchainSeckeyStr: node.BlockchainSeckeyStr, + DefaultConnections: node.DefaultConnections, + // Disable peer exchange + DisablePEX: true, + // Don't make any outgoing connections + DisableOutgoingConnections: false, + // Don't allowing incoming connections + DisableIncomingConnections: false, + // Disables networking altogether + DisableNetworking: false, + // Enable wallet API + EnableWalletAPI: true, + // Enable GUI + EnableGUI: true, + // Enable unversioned API + EnableUnversionedAPI: false, + // Enable seed API + EnableSeedAPI: false, + // Disable CSRF check in the wallet API + DisableCSRF: true, + // DisableCSP disable content-security-policy in http reponse + DisableCSP: true, + // Only run on localhost and only connect to others on localhost + LocalhostOnly: false, + // Which address to serve on. Leave blank to automatically assign to a + // public interface + Address: "", + //gnet uses this for TCP incoming and outgoing + Port: node.Port, + // MaxOutgoingConnections is the maximum outgoing connections allowed. + MaxOutgoingConnections: 8, + // MaxDefaultOutgoingConnections is the maximum default outgoing connections allowed. + MaxDefaultPeerOutgoingConnections: 8, + DownloadPeerList: true, + PeerListURL: node.PeerListURL, + // How often to make outgoing connections, in seconds + OutgoingConnectionsRate: time.Second * 5, + PeerlistSize: 65535, + // Wallet Address Version + //AddressVersion: "test", + // Remote web interface + WebInterface: true, + WebInterfacePort: node.WebInterfacePort, + WebInterfaceAddr: "127.0.0.1", + WebInterfaceCert: "", + WebInterfaceKey: "", + WebInterfaceHTTPS: false, + + RPCInterface: true, + + LaunchBrowser: false, + // Data directory holds app data + DataDirectory: node.DataDirectory, + // Web GUI static resources + GUIDirectory: "./src/gui/static/", + // Logging + ColorLog: true, + LogLevel: "INFO", + LogToFile: false, + DisablePingPong: false, + + VerifyDB: true, + ResetCorruptDB: false, + + // Wallets + WalletDirectory: "", + WalletCryptoType: string(wallet.CryptoTypeScryptChacha20poly1305), + + // Timeout settings for http.Server + // https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ + ReadTimeout: time.Second * 10, + WriteTimeout: time.Second * 60, + IdleTimeout: time.Second * 120, + + // Centralized network configuration + RunMaster: false, + /* Developer options */ + + // Enable cpu profiling + ProfileCPU: false, + // Where the file is written to + ProfileCPUFile: node.ProfileCPUFile, + // HTTP profiling interface (see http://golang.org/pkg/net/http/pprof/) + HTTPProf: false, + } + + nodeConfig.applyConfigMode(mode) + + return nodeConfig +} + +func (c *Config) postProcess() { + var err error + if c.Node.GenesisSignatureStr != "" { + c.Node.genesisSignature, err = cipher.SigFromHex(c.Node.GenesisSignatureStr) + panicIfError(err, "Invalid Signature") + } + + if c.Node.GenesisAddressStr != "" { + c.Node.genesisAddress, err = cipher.DecodeBase58Address(c.Node.GenesisAddressStr) + panicIfError(err, "Invalid Address") + } + if c.Node.BlockchainPubkeyStr != "" { + c.Node.blockchainPubkey, err = cipher.PubKeyFromHex(c.Node.BlockchainPubkeyStr) + panicIfError(err, "Invalid Pubkey") + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey, err = cipher.SecKeyFromHex(c.Node.BlockchainSeckeyStr) + panicIfError(err, "Invalid Seckey") + c.Node.BlockchainSeckeyStr = "" + } + if c.Node.BlockchainSeckeyStr != "" { + c.Node.blockchainSeckey = cipher.SecKey{} + } + + home := file.UserHome() + c.Node.DataDirectory, err = file.InitDataDir(replaceHome(c.Node.DataDirectory, home)) + panicIfError(err, "Invalid DataDirectory") + + if c.Node.WebInterfaceCert == "" { + c.Node.WebInterfaceCert = filepath.Join(c.Node.DataDirectory, "cert.pem") + } else { + c.Node.WebInterfaceCert = replaceHome(c.Node.WebInterfaceCert, home) + } + + if c.Node.WebInterfaceKey == "" { + c.Node.WebInterfaceKey = filepath.Join(c.Node.DataDirectory, "key.pem") + } else { + c.Node.WebInterfaceKey = replaceHome(c.Node.WebInterfaceKey, home) + } + + if c.Node.WalletDirectory == "" { + c.Node.WalletDirectory = filepath.Join(c.Node.DataDirectory, "wallets") + } else { + c.Node.WalletDirectory = replaceHome(c.Node.WalletDirectory, home) + } + + if c.Node.DBPath == "" { + c.Node.DBPath = filepath.Join(c.Node.DataDirectory, "data.db") + } else { + c.Node.DBPath = replaceHome(c.Node.DBPath, home) + } + + if c.Node.RunMaster { + // Run in arbitrating mode if the node is master + c.Node.Arbitrating = true + } + + // Don't open browser to load wallets if wallet apis are disabled. + if !c.Node.EnableWalletAPI { + c.Node.EnableGUI = false + c.Node.LaunchBrowser = false + } + + if c.Node.EnableGUI { + c.Node.GUIDirectory = file.ResolveResourceDirectory(c.Node.GUIDirectory) + } +} + +func (c *Config) register() { + flag.BoolVar(&help, "help", false, "Show help") + flag.BoolVar(&c.Node.DisablePEX, "disable-pex", c.Node.DisablePEX, "disable PEX peer discovery") + flag.BoolVar(&c.Node.DownloadPeerList, "download-peerlist", c.Node.DownloadPeerList, "download a peers.txt from -peerlist-url") + flag.StringVar(&c.Node.PeerListURL, "peerlist-url", c.Node.PeerListURL, "with -download-peerlist=true, download a peers.txt file from this url") + flag.BoolVar(&c.Node.DisableOutgoingConnections, "disable-outgoing", c.Node.DisableOutgoingConnections, "Don't make outgoing connections") + flag.BoolVar(&c.Node.DisableIncomingConnections, "disable-incoming", c.Node.DisableIncomingConnections, "Don't make incoming connections") + flag.BoolVar(&c.Node.DisableNetworking, "disable-networking", c.Node.DisableNetworking, "Disable all network activity") + flag.BoolVar(&c.Node.EnableWalletAPI, "enable-wallet-api", c.Node.EnableWalletAPI, "Enable the wallet API") + flag.BoolVar(&c.Node.EnableGUI, "enable-gui", c.Node.EnableGUI, "Enable GUI") + flag.BoolVar(&c.Node.EnableUnversionedAPI, "enable-unversioned-api", c.Node.EnableUnversionedAPI, "Enable the deprecated unversioned API endpoints without /api/v1 prefix") + flag.BoolVar(&c.Node.DisableCSRF, "disable-csrf", c.Node.DisableCSRF, "disable CSRF check") + flag.BoolVar(&c.Node.EnableSeedAPI, "enable-seed-api", c.Node.EnableSeedAPI, "enable /api/v1/wallet/seed api") + flag.BoolVar(&c.Node.DisableCSP, "disable-csp", c.Node.DisableCSP, "disable content-security-policy in http response") + flag.StringVar(&c.Node.Address, "address", c.Node.Address, "IP Address to run application on. Leave empty to default to a public interface") + flag.IntVar(&c.Node.Port, "port", c.Node.Port, "Port to run application on") + + flag.BoolVar(&c.Node.WebInterface, "web-interface", c.Node.WebInterface, "enable the web interface") + flag.IntVar(&c.Node.WebInterfacePort, "web-interface-port", c.Node.WebInterfacePort, "port to serve web interface on") + flag.StringVar(&c.Node.WebInterfaceAddr, "web-interface-addr", c.Node.WebInterfaceAddr, "addr to serve web interface on") + flag.StringVar(&c.Node.WebInterfaceCert, "web-interface-cert", c.Node.WebInterfaceCert, "cert.pem file for web interface HTTPS. If not provided, will use cert.pem in -data-directory") + flag.StringVar(&c.Node.WebInterfaceKey, "web-interface-key", c.Node.WebInterfaceKey, "key.pem file for web interface HTTPS. If not provided, will use key.pem in -data-directory") + flag.BoolVar(&c.Node.WebInterfaceHTTPS, "web-interface-https", c.Node.WebInterfaceHTTPS, "enable HTTPS for web interface") + + flag.BoolVar(&c.Node.RPCInterface, "rpc-interface", c.Node.RPCInterface, "enable the rpc interface") + + flag.BoolVar(&c.Node.LaunchBrowser, "launch-browser", c.Node.LaunchBrowser, "launch system default webbrowser at client startup") + flag.BoolVar(&c.Node.PrintWebInterfaceAddress, "print-web-interface-address", c.Node.PrintWebInterfaceAddress, "print configured web interface address and exit") + flag.StringVar(&c.Node.DataDirectory, "data-dir", c.Node.DataDirectory, "directory to store app data (defaults to ~/.skycoin)") + flag.StringVar(&c.Node.DBPath, "db-path", c.Node.DBPath, "path of database file (defaults to ~/.skycoin/data.db)") + flag.BoolVar(&c.Node.DBReadOnly, "db-read-only", c.Node.DBReadOnly, "open bolt db read-only") + flag.BoolVar(&c.Node.ProfileCPU, "profile-cpu", c.Node.ProfileCPU, "enable cpu profiling") + flag.StringVar(&c.Node.ProfileCPUFile, "profile-cpu-file", c.Node.ProfileCPUFile, "where to write the cpu profile file") + flag.BoolVar(&c.Node.HTTPProf, "http-prof", c.Node.HTTPProf, "Run the http profiling interface") + flag.StringVar(&c.Node.LogLevel, "log-level", c.Node.LogLevel, "Choices are: debug, info, warn, error, fatal, panic") + flag.BoolVar(&c.Node.ColorLog, "color-log", c.Node.ColorLog, "Add terminal colors to log output") + flag.BoolVar(&c.Node.DisablePingPong, "no-ping-log", c.Node.DisablePingPong, `disable "reply to ping" and "received pong" debug log messages`) + flag.BoolVar(&c.Node.LogToFile, "logtofile", c.Node.LogToFile, "log to file") + flag.StringVar(&c.Node.GUIDirectory, "gui-dir", c.Node.GUIDirectory, "static content directory for the HTML interface") + + flag.BoolVar(&c.Node.VerifyDB, "verify-db", c.Node.VerifyDB, "check the database for corruption") + flag.BoolVar(&c.Node.ResetCorruptDB, "reset-corrupt-db", c.Node.ResetCorruptDB, "reset the database if corrupted, and continue running instead of exiting") + + // Key Configuration Data + flag.BoolVar(&c.Node.RunMaster, "master", c.Node.RunMaster, "run the daemon as blockchain master server") + + flag.StringVar(&c.Node.BlockchainPubkeyStr, "master-public-key", c.Node.BlockchainPubkeyStr, "public key of the master chain") + flag.StringVar(&c.Node.BlockchainSeckeyStr, "master-secret-key", c.Node.BlockchainSeckeyStr, "secret key, set for master") + + flag.StringVar(&c.Node.GenesisAddressStr, "genesis-address", c.Node.GenesisAddressStr, "genesis address") + flag.StringVar(&c.Node.GenesisSignatureStr, "genesis-signature", c.Node.GenesisSignatureStr, "genesis block signature") + flag.Uint64Var(&c.Node.GenesisTimestamp, "genesis-timestamp", c.Node.GenesisTimestamp, "genesis block timestamp") + + flag.StringVar(&c.Node.WalletDirectory, "wallet-dir", c.Node.WalletDirectory, "location of the wallet files. Defaults to ~/.skycoin/wallet/") + flag.IntVar(&c.Node.MaxOutgoingConnections, "max-outgoing-connections", c.Node.MaxOutgoingConnections, "The maximum outgoing connections allowed") + flag.IntVar(&c.Node.MaxDefaultPeerOutgoingConnections, "max-default-peer-outgoing-connections", c.Node.MaxDefaultPeerOutgoingConnections, "The maximum default peer outgoing connections allowed") + flag.IntVar(&c.Node.PeerlistSize, "peerlist-size", c.Node.PeerlistSize, "The peer list size") + flag.DurationVar(&c.Node.OutgoingConnectionsRate, "connection-rate", c.Node.OutgoingConnectionsRate, "How often to make an outgoing connection") + flag.BoolVar(&c.Node.LocalhostOnly, "localhost-only", c.Node.LocalhostOnly, "Run on localhost and only connect to localhost peers") + flag.BoolVar(&c.Node.Arbitrating, "arbitrating", c.Node.Arbitrating, "Run node in arbitrating mode") + flag.StringVar(&c.Node.WalletCryptoType, "wallet-crypto-type", c.Node.WalletCryptoType, "wallet crypto type. Can be sha256-xor or scrypt-chacha20poly1305") + flag.BoolVar(&c.Node.Version, "version", false, "show node version") +} + +func (n *NodeConfig) applyConfigMode(configMode string) { + if runtime.GOOS == "windows" { + n.ColorLog = false + } + switch configMode { + case "": + case "STANDALONE_CLIENT": + n.EnableWalletAPI = true + n.EnableGUI = true + n.EnableSeedAPI = true + n.LaunchBrowser = true + n.DisableCSRF = false + n.DisableCSP = false + n.DownloadPeerList = true + n.RPCInterface = false + n.WebInterface = true + n.LogToFile = false + n.ResetCorruptDB = true + n.WebInterfacePort = 0 // randomize web interface port + default: + panic("Invalid ConfigMode") + } +} + +func panicIfError(err error, msg string, args ...interface{}) { // nolint: unparam + if err != nil { + log.Panicf(msg+": %v", append(args, err)...) + } +} + +func replaceHome(path, home string) string { + return strings.Replace(path, "$HOME", home, 1) +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/parameters.go b/vendor/github.com/skycoin/skycoin/src/skycoin/parameters.go new file mode 100755 index 0000000..f060424 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/parameters.go @@ -0,0 +1,127 @@ +package skycoin + +import ( + "fmt" + "strings" + + "github.com/spf13/viper" +) + +// Parameters records fiber coin parameters +type Parameters struct { + Node NodeParameters `mapstructure:"node"` + Build BuildParameters `mapstructure:"build"` + Visor VisorParameters `mapstructure:"visor"` +} + +// NodeParameters records the node's configurable parameters +type NodeParameters struct { + PeerListURL string `mapstructure:"peer_list_url"` + Port int `mapstructure:"port"` + WebInterfacePort int `mapstructure:"web_interface_port"` + GenesisSignatureStr string `mapstructure:"genesis_signature_str"` + GenesisAddressStr string `mapstructure:"genesis_address_str"` + BlockchainPubkeyStr string `mapstructure:"blockchain_pubkey_str"` + BlockchainSeckeyStr string `mapstructure:"blockchain_seckey_str"` + GenesisTimestamp uint64 `mapstructure:"genesis_timestamp"` + GenesisCoinVolume uint64 `mapstructure:"genesis_coin_volume"` + DefaultConnections []string `mapstructure:"default_connections"` + + DataDirectory string + ProfileCPUFile string +} + +// VisorParameters are the parameters used to generate parameters.go in visor +type VisorParameters struct { + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 `mapstructure:"max_coin_supply"` + + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 `mapstructure:"distribution_addresses_total"` + + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 + + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 `mapstructure:"initial_unlocked_count"` + + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 `mapstructure:"unlock_address_rate"` + + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 `mapstructure:"unlock_time_interval"` + + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 `mapstructure:"max_droplet_precision"` + + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int `mapstructure:"default_max_block_size"` + + DistributionAddresses []string `mapstructure:"distribution_addresses"` +} + +// BuildParameters records build info +type BuildParameters struct { + Version string `mapstructure:"version"` // node version + Commit string `mapstructure:"commit"` // git commit id + Branch string `mapstructure:"branch"` // git branch name +} + +// NewParameters loads blockchain config parameters from a config file +// default file is: fiber.toml in the project root +// JSON, toml or yaml file can be used (toml preferred). +func NewParameters(configName, appDir string) (Parameters, error) { + // set viper parameters + // check that file is of supported type + confNameSplit := strings.Split(configName, ".") + fileType := confNameSplit[len(confNameSplit)-1] + switch fileType { + case "toml", "json", "yaml", "yml": + viper.SetConfigType(confNameSplit[len(confNameSplit)-1]) + default: + return Parameters{}, fmt.Errorf("invalid blockchain config file type: %s", fileType) + } + + configName = configName[:len(configName)-(len(fileType)+1)] + viper.SetConfigName(configName) + + viper.AddConfigPath(appDir) + viper.AddConfigPath(".") + + // set defaults + setDefaults() + + params := Parameters{} + + if err := viper.ReadInConfig(); err != nil { + return params, err + } + + if err := viper.Unmarshal(¶ms); err != nil { + return params, err + } + + return params, nil +} + +func setDefaults() { + // node defaults + viper.SetDefault("node.genesis_coin_volume", 300e12) + viper.SetDefault("node.port", 30000) + viper.SetDefault("node.web_interface_port", 7220) + + // build defaults + viper.SetDefault("build.commit", "") + viper.SetDefault("build.branch", "") + + // visor parameter defaults + viper.SetDefault("visor.max_coin_supply", 3e8) + viper.SetDefault("visor.distribution_addresses_total", 100) + viper.SetDefault("visor.initial_unlocked_count", 100) + viper.SetDefault("visor.unlock_address_rate", 0) + viper.SetDefault("visor.unlock_time_interval", 60*60*24*365) + viper.SetDefault("visor.max_droplet_precision", 3) + viper.SetDefault("visor.default_max_block_size", 32*1024) +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/parameters_test.go b/vendor/github.com/skycoin/skycoin/src/skycoin/parameters_test.go new file mode 100755 index 0000000..5a7e706 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/parameters_test.go @@ -0,0 +1,50 @@ +package skycoin + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// TODO(therealssj): write better tests +func TestNewParameters(t *testing.T) { + coinConfig, err := NewParameters("test.fiber.toml", "./testdata") + require.NoError(t, err) + require.Equal(t, Parameters{ + Node: NodeParameters{ + GenesisSignatureStr: "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700", + GenesisAddressStr: "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6", + BlockchainPubkeyStr: "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a", + BlockchainSeckeyStr: "", + GenesisTimestamp: 1426562704, + GenesisCoinVolume: 100e12, + DefaultConnections: []string{ + "118.178.135.93:6000", + "47.88.33.156:6000", + "121.41.103.148:6000", + "120.77.69.188:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", + }, + Port: 6000, + PeerListURL: "https://downloads.skycoin.net/blockchain/peers.txt", + WebInterfacePort: 6420, + }, + Build: BuildParameters{ + Version: "0.23.1-rc2", + Commit: "0aab9bf7730827d6fd11beb0d02096b40cea1872", + Branch: "test-branch", + }, + Visor: VisorParameters{ + MaxCoinSupply: 1e8, + DistributionAddressesTotal: 100, + InitialUnlockedCount: 25, + UnlockAddressRate: 5, + UnlockTimeInterval: 60 * 60 * 24 * 365, + MaxDropletPrecision: 3, + DefaultMaxBlockSize: 32 * 1024, + }, + }, coinConfig) +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go b/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go new file mode 100755 index 0000000..3acc223 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/skycoin.go @@ -0,0 +1,427 @@ +package skycoin + +import ( + "flag" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "runtime/debug" + "runtime/pprof" + "sync" + "time" + + "github.com/skycoin/skycoin/src/api" + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/daemon" + "github.com/skycoin/skycoin/src/util/apputil" + "github.com/skycoin/skycoin/src/util/browser" + "github.com/skycoin/skycoin/src/util/cert" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/wallet" +) + +// Coin represents a fiber coin instance +type Coin struct { + config Config + logger *logging.Logger +} + +// Run starts the node +func (c *Coin) Run() { + defer func() { + // try catch panic in main thread + if r := recover(); r != nil { + c.logger.Errorf("recover: %v\nstack:%v", r, string(debug.Stack())) + } + }() + var db *dbutil.DB + var d *daemon.Daemon + var webInterface *api.Server + errC := make(chan error, 10) + + if c.config.Node.Version { + fmt.Println(c.config.Build.Version) + return + } + + logLevel, err := logging.LevelFromString(c.config.Node.LogLevel) + if err != nil { + c.logger.Error("Invalid -log-level:", err) + return + } + + logging.SetLevel(logLevel) + + if c.config.Node.ColorLog { + logging.EnableColors() + } else { + logging.DisableColors() + } + + var logFile *os.File + if c.config.Node.LogToFile { + var err error + logFile, err = c.initLogFile() + if err != nil { + c.logger.Error(err) + return + } + } + + var fullAddress string + scheme := "http" + if c.config.Node.WebInterfaceHTTPS { + scheme = "https" + } + host := fmt.Sprintf("%s:%d", c.config.Node.WebInterfaceAddr, c.config.Node.WebInterfacePort) + + c.initProfiling() + + var wg sync.WaitGroup + + quit := make(chan struct{}) + + // Catch SIGINT (CTRL-C) (closes the quit channel) + go apputil.CatchInterrupt(quit) + + // Catch SIGUSR1 (prints runtime stack to stdout) + go apputil.CatchDebug() + + // creates blockchain instance + dconf := c.ConfigureDaemon() + + c.logger.Infof("Opening database %s", dconf.Visor.DBPath) + db, err = visor.OpenDB(dconf.Visor.DBPath, c.config.Node.DBReadOnly) + if err != nil { + c.logger.Errorf("Database failed to open: %v. Is another skycoin instance running?", err) + return + } + + if c.config.Node.ResetCorruptDB { + // Check the database integrity and recreate it if necessary + c.logger.Info("Checking database and resetting if corrupted") + if newDB, err := visor.RepairCorruptDB(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.Errorf("visor.ResetCorruptDB failed: %v", err) + } + goto earlyShutdown + } else { + db = newDB + } + } else if c.config.Node.VerifyDB { + c.logger.Info("Checking database") + if err := visor.CheckDatabase(db, c.config.Node.blockchainPubkey, quit); err != nil { + if err != visor.ErrVerifyStopped { + c.logger.Errorf("visor.CheckDatabase failed: %v", err) + } + goto earlyShutdown + } + } + + d, err = daemon.NewDaemon(dconf, db, c.config.Node.DefaultConnections) + if err != nil { + c.logger.Error(err) + goto earlyShutdown + } + + if c.config.Node.WebInterface { + webInterface, err = c.createGUI(d, host) + if err != nil { + c.logger.Error(err) + goto earlyShutdown + } + } + + fullAddress = fmt.Sprintf("%s://%s", scheme, webInterface.Addr()) + c.logger.Critical().Infof("Full address: %s", fullAddress) + if c.config.Node.PrintWebInterfaceAddress { + fmt.Println(fullAddress) + } + + wg.Add(1) + go func() { + defer wg.Done() + + if err := d.Run(); err != nil { + c.logger.Error(err) + errC <- err + } + }() + + if c.config.Node.WebInterface { + cancelLaunchBrowser := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + + if err := webInterface.Serve(); err != nil { + close(cancelLaunchBrowser) + c.logger.Error(err) + errC <- err + } + }() + + if c.config.Node.LaunchBrowser { + go func() { + select { + case <-cancelLaunchBrowser: + c.logger.Warning("Browser launching cancelled") + + // Wait a moment just to make sure the http interface is up + case <-time.After(time.Millisecond * 100): + c.logger.Infof("Launching System Browser with %s", fullAddress) + if err := browser.Open(fullAddress); err != nil { + c.logger.Error(err) + } + } + }() + } + } + + select { + case <-quit: + case err := <-errC: + c.logger.Error(err) + } + + c.logger.Info("Shutting down...") + + if webInterface != nil { + c.logger.Info("Closing web interface") + webInterface.Shutdown() + } + + c.logger.Info("Closing daemon") + d.Shutdown() + + c.logger.Info("Waiting for goroutines to finish") + wg.Wait() + +earlyShutdown: + if db != nil { + c.logger.Info("Closing database") + if err := db.Close(); err != nil { + c.logger.WithError(err).Error("Failed to close DB") + } + } + + c.logger.Info("Goodbye") + + if logFile != nil { + if err := logFile.Close(); err != nil { + fmt.Println("Failed to close log file") + } + } +} + +// NewCoin returns a new fiber coin instance +func NewCoin(config Config, logger *logging.Logger) *Coin { + return &Coin{ + config: config, + logger: logger, + } +} + +func (c *Coin) initLogFile() (*os.File, error) { + logDir := filepath.Join(c.config.Node.DataDirectory, "logs") + if err := createDirIfNotExist(logDir); err != nil { + c.logger.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + return nil, fmt.Errorf("createDirIfNotExist(%s) failed: %v", logDir, err) + } + + // open log file + tf := "2006-01-02-030405" + logfile := filepath.Join(logDir, fmt.Sprintf("%s-v%s.log", time.Now().Format(tf), c.config.Build.Version)) + + f, err := os.OpenFile(logfile, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + c.logger.Errorf("os.OpenFile(%s) failed: %v", logfile, err) + return nil, err + } + + hook := logging.NewWriteHook(f) + logging.AddHook(hook) + + return f, nil +} + +func (c *Coin) initProfiling() { + if c.config.Node.ProfileCPU { + f, err := os.Create(c.config.Node.ProfileCPUFile) + if err != nil { + log.Fatal(err) + } + pprof.StartCPUProfile(f) + defer pprof.StopCPUProfile() + } + if c.config.Node.HTTPProf { + go func() { + log.Println(http.ListenAndServe("localhost:6060", nil)) + }() + } +} + +// ConfigureDaemon sets the daemon config values +func (c *Coin) ConfigureDaemon() daemon.Config { + //cipher.SetAddressVersion(c.AddressVersion) + dc := daemon.NewConfig() + + for _, c := range c.config.Node.DefaultConnections { + dc.Pool.DefaultPeerConnections[c] = struct{}{} + } + + dc.Pool.MaxDefaultPeerOutgoingConnections = c.config.Node.MaxDefaultPeerOutgoingConnections + + dc.Pex.DataDirectory = c.config.Node.DataDirectory + dc.Pex.Disabled = c.config.Node.DisablePEX + dc.Pex.Max = c.config.Node.PeerlistSize + dc.Pex.DownloadPeerList = c.config.Node.DownloadPeerList + dc.Pex.PeerListURL = c.config.Node.PeerListURL + dc.Daemon.DisableOutgoingConnections = c.config.Node.DisableOutgoingConnections + dc.Daemon.DisableIncomingConnections = c.config.Node.DisableIncomingConnections + dc.Daemon.DisableNetworking = c.config.Node.DisableNetworking + dc.Daemon.Port = c.config.Node.Port + dc.Daemon.Address = c.config.Node.Address + dc.Daemon.LocalhostOnly = c.config.Node.LocalhostOnly + dc.Daemon.OutgoingMax = c.config.Node.MaxOutgoingConnections + dc.Daemon.DataDirectory = c.config.Node.DataDirectory + dc.Daemon.LogPings = !c.config.Node.DisablePingPong + dc.Daemon.BlockchainPubkey = c.config.Node.blockchainPubkey + + if c.config.Node.OutgoingConnectionsRate == 0 { + c.config.Node.OutgoingConnectionsRate = time.Millisecond + } + dc.Daemon.OutgoingRate = c.config.Node.OutgoingConnectionsRate + dc.Visor.IsMaster = c.config.Node.RunMaster + + dc.Visor.BlockchainPubkey = c.config.Node.blockchainPubkey + dc.Visor.BlockchainSeckey = c.config.Node.blockchainSeckey + + dc.Visor.GenesisAddress = c.config.Node.genesisAddress + dc.Visor.GenesisSignature = c.config.Node.genesisSignature + dc.Visor.GenesisTimestamp = c.config.Node.GenesisTimestamp + dc.Visor.GenesisCoinVolume = c.config.Node.GenesisCoinVolume + dc.Visor.DBPath = c.config.Node.DBPath + dc.Visor.Arbitrating = c.config.Node.Arbitrating + dc.Visor.EnableWalletAPI = c.config.Node.EnableWalletAPI + dc.Visor.WalletDirectory = c.config.Node.WalletDirectory + dc.Visor.BuildInfo = visor.BuildInfo{ + Version: c.config.Build.Version, + Commit: c.config.Build.Commit, + Branch: c.config.Build.Branch, + } + dc.Visor.EnableSeedAPI = c.config.Node.EnableSeedAPI + + dc.Gateway.EnableWalletAPI = c.config.Node.EnableWalletAPI + dc.Gateway.DisableCSP = c.config.Node.DisableCSP + + // Initialize wallet default crypto type + cryptoType, err := wallet.CryptoTypeFromString(c.config.Node.WalletCryptoType) + if err != nil { + log.Panic(err) + } + + dc.Visor.WalletCryptoType = cryptoType + + return dc +} + +func (c *Coin) createGUI(d *daemon.Daemon, host string) (*api.Server, error) { + var s *api.Server + var err error + + config := api.Config{ + StaticDir: c.config.Node.GUIDirectory, + DisableCSRF: c.config.Node.DisableCSRF, + EnableWalletAPI: c.config.Node.EnableWalletAPI, + EnableJSON20RPC: c.config.Node.RPCInterface, + EnableGUI: c.config.Node.EnableGUI, + EnableUnversionedAPI: c.config.Node.EnableUnversionedAPI, + ReadTimeout: c.config.Node.ReadTimeout, + WriteTimeout: c.config.Node.WriteTimeout, + IdleTimeout: c.config.Node.IdleTimeout, + } + + if c.config.Node.WebInterfaceHTTPS { + // Verify cert/key parameters, and if neither exist, create them + if err := cert.CreateCertIfNotExists(host, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey, "Skycoind"); err != nil { + c.logger.Errorf("cert.CreateCertIfNotExists failure: %v", err) + return nil, err + } + + s, err = api.CreateHTTPS(host, config, d.Gateway, c.config.Node.WebInterfaceCert, c.config.Node.WebInterfaceKey) + } else { + s, err = api.Create(host, config, d.Gateway) + } + if err != nil { + c.logger.Errorf("Failed to start web GUI: %v", err) + return nil, err + } + + return s, nil +} + +// ParseConfig prepare the config +func (c *Coin) ParseConfig() { + c.config.register() + flag.Parse() + if help { + flag.Usage() + os.Exit(0) + } + c.config.postProcess() +} + +// InitTransaction creates the initialize transaction +func InitTransaction(UxID string, genesisSecKey cipher.SecKey) coin.Transaction { + var tx coin.Transaction + + output := cipher.MustSHA256FromHex(UxID) + tx.PushInput(output) + + addrs := visor.GetDistributionAddresses() + + if len(addrs) != 100 { + log.Panic("Should have 100 distribution addresses") + } + + // 1 million per address, measured in droplets + if visor.DistributionAddressInitialBalance != 1e6 { + log.Panic("visor.DistributionAddressInitialBalance expected to be 1e6*1e6") + } + + for i := range addrs { + addr := cipher.MustDecodeBase58Address(addrs[i]) + tx.PushOutput(addr, visor.DistributionAddressInitialBalance*1e6, 1) + } + + seckeys := make([]cipher.SecKey, 1) + seckey := genesisSecKey.Hex() + seckeys[0] = cipher.MustSecKeyFromHex(seckey) + tx.SignInputs(seckeys) + + tx.UpdateHeader() + + err := tx.Verify() + + if err != nil { + log.Panic(err) + } + + log.Printf("signature= %s", tx.Sigs[0].Hex()) + return tx +} + +func createDirIfNotExist(dir string) error { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + return nil + } + + return os.Mkdir(dir, 0777) +} diff --git a/vendor/github.com/skycoin/skycoin/src/skycoin/testdata/test.fiber.toml b/vendor/github.com/skycoin/skycoin/src/skycoin/testdata/test.fiber.toml new file mode 100755 index 0000000..509e2a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/skycoin/testdata/test.fiber.toml @@ -0,0 +1,27 @@ +# fiber configuration +# Defaults are shown, commented out +# Some values have no defaults and must be filled in +[node] +genesis_signature_str = "eb10468d10054d15f2b6f8946cd46797779aa20a7617ceb4be884189f219bc9a164e56a5b9f7bec392a804ff3740210348d73db77a37adb542a8e08d429ac92700" +genesis_address_str = "2jBbGxZRGoQG1mqhPBnXnLTxK6oxsTf8os6" +blockchain_pubkey_str = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +blockchain_seckey_str = "" +genesis_timestamp = 1426562704 +default_connections = [ + "118.178.135.93:6000", + "47.88.33.156:6000", + "121.41.103.148:6000", + "120.77.69.188:6000", + "104.237.142.206:6000", + "176.58.126.224:6000", + "172.104.85.6:6000", + "139.162.7.132:6000", +] +launch_browser = true +peer_list_url = "https://downloads.skycoin.net/blockchain/peers.txt" + +[build] +version = "0.23.1-rc2" +commit = "0aab9bf7730827d6fd11beb0d02096b40cea1872" +branch = "test-branch" + diff --git a/vendor/github.com/skycoin/skycoin/src/testutil/assert/assertions.go b/vendor/github.com/skycoin/skycoin/src/testutil/assert/assertions.go new file mode 100755 index 0000000..53bcc85 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/testutil/assert/assertions.go @@ -0,0 +1,73 @@ +package testutil + +import ( + "fmt" + + logrus "github.com/sirupsen/logrus" + assert "github.com/stretchr/testify/assert" +) + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f assert.PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message +} + +// TestValuePredicate checks that a value meets certain condition +// This function type may be seen as a continuation of a test scenario. +// Assertions executed inside of it may be recorded to the calling context +// by accessing free-vars in function closure. +type TestValuePredicate func(value interface{}) (success bool) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t assert.TestingT, condition TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return assert.Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + return condition(panicValue) +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t assert.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithCondition(t, func(logValue interface{}) bool { + gotMessage, gotIt := "", false + if entry, isEntry := logValue.(*logrus.Entry); isEntry { + gotMessage, gotIt = entry.Message, true + } else { + if msg, isString := logValue.(string); isString { + gotMessage, gotIt = msg, true + } + } + if gotIt { + return assert.Contains(t, gotMessage, expectedMessage) + } + return assert.Fail(t, "expected string or log entry but got %T", logValue) + }, f, msgAndArgs) +} diff --git a/vendor/github.com/skycoin/skycoin/src/testutil/require/require.go b/vendor/github.com/skycoin/skycoin/src/testutil/require/require.go new file mode 100755 index 0000000..652e4eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/testutil/require/require.go @@ -0,0 +1,32 @@ +package require + +import ( + assert "github.com/stretchr/testify/assert" + require "github.com/stretchr/testify/require" + + _assert "github.com/skycoin/skycoin/src/testutil/assert" +) + +// PanicsWithCondition asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value meets a given condition. +// +// assert.PanicsWithCondition(t, func(value){ return assert.True(t, isCrazy(value)) }, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithCondition(t require.TestingT, condition _assert.TestValuePredicate, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithCondition(t, condition, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithLogMessage asserts that the code inside the specified PanicTestFunc panics, and that +// an expected string is included in log message. +// +// assert.PanicsWithLogMessage(t, "Log msg", func(){ log.Panic("Log msg for X") }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithLogMessage(t require.TestingT, expectedMessage string, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !_assert.PanicsWithLogMessage(t, expectedMessage, f, msgAndArgs) { + t.FailNow() + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/testutil/testutil.go b/vendor/github.com/skycoin/skycoin/src/testutil/testutil.go new file mode 100755 index 0000000..1c4f442 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/testutil/testutil.go @@ -0,0 +1,75 @@ +package testutil + +import ( + "io/ioutil" + "math/rand" + "os" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +// PrepareDB creates and opens a temporary test DB and returns it with a cleanup callback +func PrepareDB(t *testing.T) (*dbutil.DB, func()) { + f, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + db, err := bolt.Open(f.Name(), 0700, nil) + require.NoError(t, err) + + return dbutil.WrapDB(db), func() { + db.Close() + f.Close() + os.Remove(f.Name()) + } +} + +// RequireError requires that an error is not nil and that its message matches +func RequireError(t *testing.T, err error, msg string) { + t.Helper() + require.Error(t, err) + require.Equal(t, msg, err.Error()) +} + +// MakeAddress creates a cipher.Address +func MakeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +// RandBytes returns n random bytes +func RandBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + _, err := rand.Read(b) + require.NoError(t, err) + return b +} + +// RandSHA256 returns a random SHA256 hash +func RandSHA256(t *testing.T) cipher.SHA256 { + return cipher.SumSHA256(RandBytes(t, 128)) +} + +// SHA256FromHex converts an SHA256 hex string to a cipher.SHA256 +func SHA256FromHex(t *testing.T, hex string) cipher.SHA256 { + sha, err := cipher.SHA256FromHex(hex) + require.NoError(t, err) + return sha +} + +// RandSig returns a random cipher.Sig +func RandSig(t *testing.T) cipher.Sig { + return cipher.NewSig(RandBytes(t, 65)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go b/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go new file mode 100755 index 0000000..2587adf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/apputil/apputil.go @@ -0,0 +1,56 @@ +package apputil + +import ( + "fmt" + "os" + "os/signal" + "runtime/pprof" + "syscall" +) + +// CatchInterrupt catches CTRL-C and closes the quit channel if it occurs. +// If CTRL-C is called again, the program stack is dumped and the process panics, +// so that shutdown hangs can be diagnosed. +func CatchInterrupt(quit chan<- struct{}) { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + close(quit) + + // If ctrl-c is called again, panic so that the program state can be examined. + // Ctrl-c would be called again if program shutdown was stuck. + go CatchInterruptPanic() +} + +// CatchInterruptPanic catches os.Interrupt and panics +func CatchInterruptPanic() { + sigchan := make(chan os.Signal, 1) + signal.Notify(sigchan, os.Interrupt) + <-sigchan + signal.Stop(sigchan) + PrintProgramStatus() + panic("SIGINT") +} + +// CatchDebug catches SIGUSR1 and prints internal program state +func CatchDebug() { + sigchan := make(chan os.Signal, 1) + //signal.Notify(sigchan, syscall.SIGUSR1) + signal.Notify(sigchan, syscall.Signal(0xa)) // SIGUSR1 = Signal(0xa) + for { + select { + case <-sigchan: + PrintProgramStatus() + } + } +} + +// PrintProgramStatus prints all goroutine data to stdout +func PrintProgramStatus() { + p := pprof.Lookup("goroutine") + if err := p.WriteTo(os.Stdout, 2); err != nil { + fmt.Println("ERROR:", err) + return + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/browser/browser.go b/vendor/github.com/skycoin/skycoin/src/util/browser/browser.go new file mode 100755 index 0000000..b57acde --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/browser/browser.go @@ -0,0 +1,10 @@ +package browser + +import ( + "github.com/toqueteos/webbrowser" +) + +// Open opens browser +func Open(url string) error { + return webbrowser.Open(url) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/cert/cert.go b/vendor/github.com/skycoin/skycoin/src/util/cert/cert.go new file mode 100755 index 0000000..0e9db2c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/cert/cert.go @@ -0,0 +1,147 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Modifications Copyright 2014 Skycoin authors. + +package cert + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/pem" + "fmt" + "math/big" + "net" + "os" + "strings" + "time" + + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/util/utc" +) + +var logger = logging.MustGetLogger("util") + +// GenerateCert generates a self-signed X.509 certificate for a TLS server. Outputs to +// certFile and keyFile and will overwrite existing files. +func GenerateCert(certFile, keyFile, host, organization string, rsaBits int, + isCA bool, validFrom time.Time, validFor time.Duration) error { + priv, err := rsa.GenerateKey(rand.Reader, rsaBits) + if err != nil { + return fmt.Errorf("Failed to generate private key: %v", err) + } + + notBefore := validFrom + notAfter := notBefore.Add(validFor) + + // end of ASN.1 time + endOfTime := time.Date(2049, 12, 31, 23, 59, 59, 0, time.UTC) + if notAfter.After(endOfTime) { + notAfter = endOfTime + } + + template := x509.Certificate{ + SerialNumber: new(big.Int).SetInt64(0), + Subject: pkix.Name{ + Organization: []string{organization}, + }, + NotBefore: notBefore, + NotAfter: notAfter, + + KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, + ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, + + BasicConstraintsValid: true, + } + + hosts := strings.Split(host, ",") + for _, h := range hosts { + if ip := net.ParseIP(h); ip != nil { + template.IPAddresses = append(template.IPAddresses, ip) + } else { + template.DNSNames = append(template.DNSNames, h) + } + } + + if isCA { + template.IsCA = true + template.KeyUsage |= x509.KeyUsageCertSign + } + + derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) + if err != nil { + return fmt.Errorf("Failed to create certificate: %v", err) + } + + certOut, err := os.Create(certFile) + if err != nil { + return fmt.Errorf("Failed to open %s for writing: %v", certFile, err) + } + defer certOut.Close() + pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + + keyOut, err := os.OpenFile(keyFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + if err != nil { + return fmt.Errorf("Failed to open %s for writing:%v", keyFile, err) + } + defer keyOut.Close() + pem.Encode(keyOut, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}) + + return nil +} + +func certKeyXor(certFile, keyFile string) (bool, error) { + certInfo, err := os.Stat(certFile) + certExists := !os.IsNotExist(err) + certIsFile := certExists && certInfo.Mode().IsRegular() + + keyInfo, err := os.Stat(keyFile) + keyExists := !os.IsNotExist(err) + keyIsFile := keyExists && keyInfo.Mode().IsRegular() + + switch { + case certExists && certIsFile && keyExists && keyIsFile: + return true, nil + case !certExists && !keyExists: + return false, nil + case !certExists: + return false, fmt.Errorf("Cert %s does not exist", certFile) + case !certIsFile: + return false, fmt.Errorf("Cert %s is not a file", certFile) + case !keyExists: + return false, fmt.Errorf("Key %s does not exist", keyFile) + case !keyIsFile: + return false, fmt.Errorf("Key %s is not a file", keyFile) + default: + panic("unreachable code") + } +} + +// CreateCertIfNotExists verifies that certFile and keyFile exist and are files, and +// if neither certFile nor keyFile exist, they are automatically created for host +func CreateCertIfNotExists(host, certFile, keyFile string, appName string) error { + // check that cert/key both exist, or dont + exist, err := certKeyXor(certFile, keyFile) + if err != nil { + return err + } + + if exist { + return nil + } + + // Automatically create a new cert if neither files exist + logger.Infof("Creating certificate %s", certFile) + logger.Infof("Creating key %s", keyFile) + lifetime := time.Hour * 365 * 24 // 1 year + if err := GenerateCert(certFile, keyFile, host, appName, 2048, false, utc.Now(), lifetime); err != nil { + return err + } + + logger.Infof("Created certificate %s for host %s", certFile, host) + logger.Infof("Created key %s for host %s", keyFile, host) + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/cert/cert_test.go b/vendor/github.com/skycoin/skycoin/src/util/cert/cert_test.go new file mode 100755 index 0000000..4ed5942 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/cert/cert_test.go @@ -0,0 +1,22 @@ +package cert + +import ( + "crypto/tls" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/skycoin/skycoin/src/util/utc" +) + +func TestGenerateCert(t *testing.T) { + defer os.Remove("certtest.pem") + defer os.Remove("keytest.pem") + err := GenerateCert("certtest.pem", "keytest.pem", "127.0.0.1", "org", + 2048, false, utc.Now(), time.Hour*24) + assert.Nil(t, err) + _, err = tls.LoadX509KeyPair("certtest.pem", "keytest.pem") + assert.Nil(t, err) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go new file mode 100755 index 0000000..c5e1e3e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet.go @@ -0,0 +1,90 @@ +package droplet + +import ( + "errors" + "math" + + "github.com/shopspring/decimal" + + logging "github.com/skycoin/skycoin/src/util/logging" +) + +const ( + // Exponent is the number of decimal places held by droplets + Exponent = 6 + // Multiplier is how much to multiply coins by to get droplets + Multiplier = 1e6 +) + +var ( + // ErrNegativeValue is returned if a balance string is a negative number + ErrNegativeValue = errors.New("Droplet string conversion failed: Negative balance") + // ErrTooManyDecimals is returned if a balance string has more than 6 decimal places + ErrTooManyDecimals = errors.New("Droplet string conversion failed: Too many decimal places") + // ErrTooLarge is returned if a balance string is greater than math.MaxInt64 + ErrTooLarge = errors.New("Droplet string conversion failed: Value is too large") + + logger = logging.MustGetLogger("convert") + maxDecimal decimal.Decimal +) + +func init() { + maxInt64 := "9223372036854775807" + max, err := decimal.NewFromString(maxInt64) + if err != nil { + panic(err) + } + + maxDecimal = max +} + +// FromString converts a skycoin balance string with decimal places to uint64 droplets. +// For example, "123.000456" becomes 123000456 +func FromString(b string) (uint64, error) { + d, err := decimal.NewFromString(b) + if err != nil { + return 0, err + } + + // Values must be zero or positive + if d.Sign() == -1 { + return 0, ErrNegativeValue + } + + // Skycoins have a maximum of 6 decimal places + if d.Exponent() < -Exponent { + return 0, ErrTooManyDecimals + } + + // Multiply the coin balance by 1e6 to obtain droplets amount + e := d.Mul(decimal.New(1, Exponent)) + + // Check that there are no decimal places remaining. This error should not + // occur, because of the earlier check of Exponent() + if e.Exponent() < 0 { + logger.Critical().Errorf("Balance still has decimals after converting to droplets: %s", b) + return 0, ErrTooManyDecimals + } + + // Values greater than math.MaxInt64 will overflow after conversion to int64 + // using decimal.IntPart() + if e.GreaterThan(maxDecimal) { + return 0, ErrTooLarge + } + + return uint64(e.IntPart()), nil +} + +// ToString converts droplets to a skycoin balance fixed-point decimal string. +// String will always have a decimal precision of droplet.Exponent (6). +// For example, 123000456 becomes "123.000456" and +// 123000000 becomes "123.000000". +func ToString(n uint64) (string, error) { + if n > math.MaxInt64 { + return "", ErrTooLarge + } + + d := decimal.New(int64(n), -Exponent) + + return d.StringFixed(Exponent), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet_test.go b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet_test.go new file mode 100755 index 0000000..0f6f50a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/droplet/droplet_test.go @@ -0,0 +1,222 @@ +package droplet + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestFromString(t *testing.T) { + t.Parallel() + + cases := []struct { + s string + n uint64 + e error + }{ + { + s: "0", + n: 0, + }, + { + s: "0.", + n: 0, + }, + { + s: "0.0", + n: 0, + }, + { + s: "0.000000", + n: 0, + }, + { + s: "0.0000000", + n: 0, + }, + { + s: "0.0000001", + e: ErrTooManyDecimals, + }, + { + s: "0.000001", + n: 1, + }, + { + s: "0.0000010", + n: 1, + }, + { + s: "1", + n: 1e6, + }, + { + s: "1.000001", + n: 1e6 + 1, + }, + { + s: "-1", + e: ErrNegativeValue, + }, + { + s: "10000", + n: 1e4 * 1e6, + }, + { + s: "123456789.123456", + n: 123456789123456, + }, + { + s: "123.000456", + n: 123000456, + }, + { + s: "100SKY", + e: errors.New("can't convert 100SKY to decimal"), + }, + { + s: "", + e: errors.New("can't convert to decimal"), + }, + { + s: "999999999999999999999999999999999999999999", + e: ErrTooLarge, + }, + { + s: "9223372036854.775807", + n: 9223372036854775807, + }, + { + s: "-9223372036854.775807", + e: ErrNegativeValue, + }, + { + s: "9223372036854775808", + e: ErrTooLarge, + }, + { + s: "9223372036854775807.000001", + e: ErrTooLarge, + }, + { + s: "9223372036854775807", + e: ErrTooLarge, + }, + { + s: "9223372036854775806.000001", + e: ErrTooLarge, + }, + { + s: "1.1", + n: 1e6 + 1e5, + }, + { + s: "1.01", + n: 1e6 + 1e4, + }, + { + s: "1.001", + n: 1e6 + 1e3, + }, + { + s: "1.0001", + n: 1e6 + 1e2, + }, + { + s: "1.00001", + n: 1e6 + 1e1, + }, + { + s: "1.000001", + n: 1e6 + 1e0, + }, + { + s: "1.0000001", + e: ErrTooManyDecimals, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + n, err := FromString(tc.s) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.n, n, "result: %d", n) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, uint64(0), n, "result: %d", n) + } + }) + } +} + +func TestToString(t *testing.T) { + t.Parallel() + + cases := []struct { + n uint64 + s string + e error + }{ + { + n: 0, + s: "0.000000", + }, + { + n: 1, + s: "0.000001", + }, + { + n: 1e6, + s: "1.000000", + }, + { + n: 100100, + s: "0.100100", + }, + { + n: 1001000, + s: "1.001000", + }, + { + n: 999, + s: "0.000999", + }, + { + n: 999000000, + s: "999.000000", + }, + { + n: 123000456, + s: "123.000456", + }, + { + n: 9223372036854775808, + e: ErrTooLarge, + }, + } + + for _, tcc := range cases { + tc := tcc + t.Run(tc.s, func(t *testing.T) { + t.Parallel() + + s, err := ToString(tc.n) + + if tc.e == nil { + require.NoError(t, err) + require.Equal(t, tc.s, s) + } else { + require.Error(t, err) + require.Equal(t, tc.e, err) + require.Equal(t, "", s) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go b/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go new file mode 100755 index 0000000..8b54857 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/elapse/elapser.go @@ -0,0 +1,69 @@ +package elapse + +import ( + "time" + + "github.com/skycoin/skycoin/src/util/logging" +) + +// Elapser measures time elapsed for an operation. It is not thread-safe, use a different elapser per thread. +type Elapser struct { + name *string + startTime time.Time + elapsedThreshold time.Duration + Done chan bool + logger *logging.Logger +} + +// NewElapser creates an Elapser +func NewElapser(elapsedThreshold time.Duration, logger *logging.Logger) *Elapser { + elapser := &Elapser{ + elapsedThreshold: elapsedThreshold, + Done: make(chan bool, 100), + logger: logger, + } + return elapser +} + +// CheckForDone checks if the elapser has triggered and records the elapsed time +func (e *Elapser) CheckForDone() { + select { + case <-e.Done: + e.Elapsed() + default: + } +} + +// Register begins an operation to measure +func (e *Elapser) Register(name string) { + e.CheckForDone() + e.name = &name + e.startTime = time.Now() + e.Done <- true +} + +// ShowCurrentTime logs the elapsed time so far +func (e *Elapser) ShowCurrentTime(step string) { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.ShowCurrentTime calling") + return + } + elapsed := stopTime.Sub(e.startTime) + e.logger.Infof("%s[%s] elapsed %s", *e.name, step, elapsed) + +} + +// Elapsed stops measuring an operation and logs the elapsed time if it exceeds the configured threshold +func (e *Elapser) Elapsed() { + stopTime := time.Now() + if e.name == nil { + e.logger.Warning("no registered events for elapsing, but found Elapser.Elapsed calling") + return + } + elapsed := stopTime.Sub(e.startTime) + if elapsed >= e.elapsedThreshold { + e.logger.Warningf("%s elapsed %s", *e.name, elapsed) + } + e.name = nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go b/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go new file mode 100755 index 0000000..bb1ff9b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/fee/fee.go @@ -0,0 +1,100 @@ +package fee + +import ( + "errors" + + "github.com/skycoin/skycoin/src/coin" +) + +const ( + // BurnFactor inverse fraction of coinhours that must be burned + BurnFactor uint64 = 2 +) + +var ( + // ErrTxnNoFee is returned if a transaction has no coinhour fee + ErrTxnNoFee = errors.New("Transaction has zero coinhour fee") + + // ErrTxnInsufficientFee is returned if a transaction's coinhour burn fee is not enough + ErrTxnInsufficientFee = errors.New("Transaction coinhour fee minimum not met") + + // ErrTxnInsufficientCoinHours is returned if a transaction has more coinhours in its outputs than its inputs + ErrTxnInsufficientCoinHours = errors.New("Insufficient coinhours for transaction outputs") +) + +// VerifyTransactionFee performs additional transaction verification at the unconfirmed pool level. +// This checks tunable parameters that should prevent the transaction from +// entering the blockchain, but cannot be done at the blockchain level because +// they may be changed. +func VerifyTransactionFee(t *coin.Transaction, fee uint64) error { + hours, err := t.OutputHours() + if err != nil { + return err + } + return VerifyTransactionFeeForHours(hours, fee) +} + +// VerifyTransactionFeeForHours verifies the fee given fee and hours, +// where hours is the number of hours in a transaction's outputs, +// and hours+fee is the number of hours in a transaction's inputs +func VerifyTransactionFeeForHours(hours, fee uint64) error { + // Require non-zero coinhour fee + if fee == 0 { + return ErrTxnNoFee + } + + // Calculate total number of coinhours + total, err := coin.AddUint64(hours, fee) + if err != nil { + return errors.New("Hours and fee overflow") + } + + // Calculate the required fee + requiredFee := RequiredFee(total) + + // Ensure that the required fee is met + if fee < requiredFee { + return ErrTxnInsufficientFee + } + + return nil +} + +// RequiredFee returns the coinhours fee required for an amount of hours +// The required fee is calculated as hours/BurnFactor, rounded up. +func RequiredFee(hours uint64) uint64 { + feeHours := hours / BurnFactor + if hours%BurnFactor != 0 { + feeHours++ + } + + return feeHours +} + +// RemainingHours returns the amount of coinhours leftover after paying the fee for the input. +func RemainingHours(hours uint64) uint64 { + fee := RequiredFee(hours) + return hours - fee +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction. +// Returns ErrTxnInsufficientCoinHours if input hours is less than output hours. +func TransactionFee(tx *coin.Transaction, headTime uint64, inUxs coin.UxArray) (uint64, error) { + // Compute input hours + inHours, err := inUxs.CoinHours(headTime) + if err != nil { + return 0, err + } + + // Compute output hours + outHours, err := tx.OutputHours() + if err != nil { + return 0, err + } + + if inHours < outHours { + return 0, ErrTxnInsufficientCoinHours + } + + return inHours - outHours, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/fee/fee_test.go b/vendor/github.com/skycoin/skycoin/src/util/fee/fee_test.go new file mode 100755 index 0000000..c6c9882 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/fee/fee_test.go @@ -0,0 +1,312 @@ +package fee + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" +) + +type verifyTxFeeTestCase struct { + inputHours uint64 + outputHours uint64 + err error +} + +var burnFactor2verifyTxFeeTestCase = []verifyTxFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, ErrTxnInsufficientFee}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, +} + +var burnFactor3verifyTxFeeTestCase = []verifyTxFeeTestCase{ + {0, 0, ErrTxnNoFee}, + {1, 0, nil}, + {1, 1, ErrTxnNoFee}, + {2, 0, nil}, + {2, 1, nil}, + {2, 2, ErrTxnNoFee}, + {3, 0, nil}, + {3, 1, nil}, + {3, 2, nil}, + {3, 3, ErrTxnNoFee}, + {4, 0, nil}, + {4, 1, nil}, + {4, 2, nil}, + {4, 3, ErrTxnInsufficientFee}, + {4, 4, ErrTxnNoFee}, + {5, 0, nil}, + {5, 1, nil}, + {5, 2, nil}, + {5, 3, nil}, + {5, 4, ErrTxnInsufficientFee}, + {5, 5, ErrTxnNoFee}, +} + +func TestVerifyTransactionFee(t *testing.T) { + emptyTxn := &coin.Transaction{} + hours, err := emptyTxn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(0), hours) + + // A txn with no outputs hours and no coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 0) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + // A txn with no outputs hours but with a coinhours burn fee is valid + err = VerifyTransactionFee(emptyTxn, 100) + require.NoError(t, err) + + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 1e6, + }) + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: 3e6, + }) + + hours, err = txn.OutputHours() + require.NoError(t, err) + require.Equal(t, uint64(4e6), hours) + + // A txn with insufficient net coinhours burn fee is invalid + err = VerifyTransactionFee(txn, 0) + testutil.RequireError(t, err, ErrTxnNoFee.Error()) + + err = VerifyTransactionFee(txn, 1) + testutil.RequireError(t, err, ErrTxnInsufficientFee.Error()) + + // A txn with sufficient net coinhours burn fee is valid + hours, err = txn.OutputHours() + require.NoError(t, err) + err = VerifyTransactionFee(txn, hours) + require.NoError(t, err) + hours, err = txn.OutputHours() + err = VerifyTransactionFee(txn, hours*10) + require.NoError(t, err) + + // fee + hours overflows + err = VerifyTransactionFee(txn, math.MaxUint64-3e6) + testutil.RequireError(t, err, "Hours and fee overflow") + + // txn has overflowing output hours + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: math.MaxUint64 - 1e6 - 3e6 + 1, + }) + err = VerifyTransactionFee(txn, 10) + testutil.RequireError(t, err, "Transaction output hours overflow") + + var cases []verifyTxFeeTestCase + switch BurnFactor { + case 2: + cases = burnFactor2verifyTxFeeTestCase + case 3: + cases = burnFactor3verifyTxFeeTestCase + default: + t.Fatalf("No test cases for BurnFactor=%d", BurnFactor) + } + + for _, tc := range cases { + name := fmt.Sprintf("input=%d output=%d", tc.inputHours, tc.outputHours) + t.Run(name, func(t *testing.T) { + txn := &coin.Transaction{} + txn.Out = append(txn.Out, coin.TransactionOutput{ + Hours: tc.outputHours, + }) + + require.True(t, tc.inputHours >= tc.outputHours) + err := VerifyTransactionFee(txn, tc.inputHours-tc.outputHours) + require.Equal(t, tc.err, err) + }) + } +} + +type requiredFeeTestCase struct { + hours uint64 + fee uint64 +} + +var burnFactor2RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 2}, + {4, 2}, + {5, 3}, + {6, 3}, + {7, 4}, + {998, 499}, + {999, 500}, + {1000, 500}, + {1001, 501}, +} + +var burnFactor3RequiredFeeTestCases = []requiredFeeTestCase{ + {0, 0}, + {1, 1}, + {2, 1}, + {3, 1}, + {4, 2}, + {5, 2}, + {6, 2}, + {7, 3}, + {999, 333}, + {1000, 334}, + {1001, 334}, + {1002, 334}, + {1003, 335}, +} + +func TestRequiredFee(t *testing.T) { + var cases []requiredFeeTestCase + switch BurnFactor { + case 2: + cases = burnFactor2RequiredFeeTestCases + case 3: + cases = burnFactor3RequiredFeeTestCases + default: + t.Fatalf("No test cases for BurnFactor=%d", BurnFactor) + } + + for _, tc := range cases { + name := fmt.Sprintf("hours=%d fee=%d", tc.hours, tc.fee) + t.Run(name, func(t *testing.T) { + fee := RequiredFee(tc.hours) + require.Equal(t, tc.fee, fee) + + remainingHours := RemainingHours(tc.hours) + require.Equal(t, tc.hours-fee, remainingHours) + }) + } +} + +func TestTransactionFee(t *testing.T) { + var headTime uint64 = 1000 + nextTime := headTime + 3600 // 1 hour later + + type uxInput struct { + time uint64 + coins uint64 + hours uint64 + } + + cases := []struct { + name string + out []uint64 + in []uxInput + headTime uint64 + fee uint64 + err error + }{ + // Test case with one output, one input + { + fee: 5, + out: []uint64{5}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs + { + fee: 0, + out: []uint64{5, 7, 3}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with multiple outputs, multiple inputs, and some inputs have more CoinHours once adjusted for HeadTime + { + fee: 8, + out: []uint64{5, 10}, + in: []uxInput{ + {time: nextTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: nextTime, + }, + + // Test case with insufficient coin hours + { + err: ErrTxnInsufficientCoinHours, + out: []uint64{5, 10, 1}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 8e6, hours: 5}, + }, + headTime: headTime, + }, + + // Test case with overflowing input hours + { + err: errors.New("UxArray.CoinHours addition overflow"), + out: []uint64{0}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: math.MaxUint64 - 9}, + }, + headTime: headTime, + }, + + // Test case with overflowing output hours + { + err: errors.New("Transaction output hours overflow"), + out: []uint64{0, 10, math.MaxUint64 - 9}, + in: []uxInput{ + {time: headTime, coins: 10e6, hours: 10}, + {time: headTime, coins: 10e6, hours: 100}, + }, + headTime: headTime, + }, + } + + for _, tc := range cases { + name := fmt.Sprintf("fee=%d headTime=%d", tc.fee, tc.headTime) + t.Run(name, func(t *testing.T) { + tx := &coin.Transaction{} + for _, h := range tc.out { + tx.Out = append(tx.Out, coin.TransactionOutput{ + Hours: h, + }) + } + + inUxs := make(coin.UxArray, len(tc.in)) + for i, b := range tc.in { + inUxs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: b.time, + }, + Body: coin.UxBody{ + Coins: b.coins, + Hours: b.hours, + }, + } + } + + fee, err := TransactionFee(tx, tc.headTime, inUxs) + require.Equal(t, tc.err, err) + require.Equal(t, tc.fee, fee) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/file/file.go b/vendor/github.com/skycoin/skycoin/src/util/file/file.go new file mode 100755 index 0000000..67ed658 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/file/file.go @@ -0,0 +1,284 @@ +// Package file Filesystem related utilities +package file + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + // ErrEmptyDirectoryName is returned by constructing the full path + // of data directory if the passed argument is empty + ErrEmptyDirectoryName = errors.New("data directory must not be empty") + // ErrDotDirectoryName is returned by constructing the full path of + // data directory if the passed argument is "." + ErrDotDirectoryName = errors.New("data directory must not be equal to \".\"") + + logger = logging.MustGetLogger("file") +) + +// InitDataDir Joins dir with the user's $HOME directory. +// If $HOME cannot be determined, uses the current working directory. +// dir must not be the empty string +func InitDataDir(dir string) (string, error) { + dir, err := buildDataDir(dir) + if err != nil { + return "", err + } + + // check if dir already exist + st, err := os.Stat(dir) + if !os.IsNotExist(err) { + if !st.IsDir() { + return "", fmt.Errorf("%s is not a directory", dir) + } + // dir already exist + return dir, nil + } + + if err := os.MkdirAll(dir, os.FileMode(0700)); err != nil { + logger.Errorf("Failed to create directory %s: %v", dir, err) + return "", err + } + + logger.Infof("Created data directory %s", dir) + return dir, nil +} + +// Construct the full data directory by adding to $HOME or ./ +func buildDataDir(dir string) (string, error) { + if dir == "" { + logger.Error("data directory is empty") + return "", ErrEmptyDirectoryName + } + + home := filepath.Clean(UserHome()) + wd, err := os.Getwd() + if err != nil { + return "", err + } + wd = filepath.Clean(wd) + + fullDir, err := filepath.Abs(dir) + + if err != nil { + return "", err + } + + // The joined directory must not be equal to $HOME or a parent path of $HOME + // The joined directory must not be equal to `pwd` or a parent path of `pwd` + if strings.HasPrefix(home, fullDir) || strings.HasPrefix(wd, fullDir) { + logger.Errorf("join(%[1]s, %[2]s) == %[1]s", home, dir) + return "", ErrDotDirectoryName + } + + return fullDir, nil +} + +// UserHome returns the current user home path +func UserHome() string { + // os/user relies on cgo which is disabled when cross compiling + // use fallbacks for various OSes instead + // usr, err := user.Current() + // if err == nil { + // return usr.HomeDir + // } + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + + return os.Getenv("HOME") +} + +// LoadJSON load json file +func LoadJSON(filename string, thing interface{}) error { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + dec := json.NewDecoder(file) + dec.UseNumber() + return dec.Decode(thing) +} + +// SaveJSON write value into json file +func SaveJSON(filename string, thing interface{}, mode os.FileMode) error { + data, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + return SaveBinary(filename, data, mode) +} + +// SaveJSONSafe saves json to disk, but refuses if file already exists +func SaveJSONSafe(filename string, thing interface{}, mode os.FileMode) error { + b, err := json.MarshalIndent(thing, "", " ") + if err != nil { + return err + } + flags := os.O_WRONLY | os.O_CREATE | os.O_EXCL + f, err := os.OpenFile(filename, flags, mode) + if err != nil { + return err + } + defer f.Close() + n, err := f.Write(b) + if n != len(b) && err != nil { + err = errors.New("Failed to save complete file") + } + if err != nil { + os.Remove(filename) + } + return err +} + +// SaveBinary persists data into given file in binary, +// backup the previous file, if there was one +func SaveBinary(filename string, data []byte, mode os.FileMode) error { + // Write the new file to a temporary + tmpname := filename + ".tmp" + if err := ioutil.WriteFile(tmpname, data, mode); err != nil { + return err + } + + // Write the new file to the target wallet file + if err := ioutil.WriteFile(filename, data, mode); err != nil { + return err + } + + // Remove the tmp file + return os.Remove(tmpname) +} + +//TODO: require file named after application and then hashcode, in static directory + +// ResolveResourceDirectory searches locations for a research directory and returns absolute path +func ResolveResourceDirectory(path string) string { + workDir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + logger.Panic(err) + } + + _, rtFilename, _, _ := runtime.Caller(1) + rtDirectory := filepath.Dir(rtFilename) + + pathAbs, err := filepath.Abs(path) + if err != nil { + logger.Panic(err) + } + fmt.Println("abs path:", pathAbs) + + fmt.Printf("runtime.Caller= %s \n", rtFilename) + //fmt.Printf("Filepath Raw= %s \n") + fmt.Printf("Filepath Directory= %s \n", filepath.Dir(path)) + fmt.Printf("Filepath Absolute Directory= %s \n", pathAbs) + + fmt.Printf("Working Directory= %s \n", workDir) + fmt.Printf("Runtime Filename= %s \n", rtFilename) + fmt.Printf("Runtime Directory= %s \n", rtDirectory) + + //dir1 := filepath.Join(workDir, filepath.Dir(path)) + //fmt.Printf("Dir1= %s \n", dir1) + + dirs := []string{ + pathAbs, //try direct path first + filepath.Join(workDir, filepath.Dir(path)), //default + //filepath.Join(rt_directory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "./", filepath.Dir(path)), + filepath.Join(rtDirectory, "../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../", filepath.Dir(path)), + filepath.Join(rtDirectory, "../../../", filepath.Dir(path)), + } + + //for i, dir := range dirs { + // fmt.Printf("Dir[%d]= %s \n", i, dir) + //} + + //must be an absolute path + //error and problem and crash if not absolute path + for i := range dirs { + absPath, _ := filepath.Abs(dirs[i]) + dirs[i] = absPath + } + + for _, dir := range dirs { + if _, err := os.Stat(dir); !os.IsNotExist(err) { + fmt.Printf("ResolveResourceDirectory: static resource dir= %s \n", dir) + return dir + } + } + logger.Panic("GUI directory not found") + return "" +} + +// DetermineResourcePath DEPRECATE +func DetermineResourcePath(staticDir string, resourceDir string, devDir string) (string, error) { + //check "dev" directory first + appLoc := filepath.Join(staticDir, devDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + //check dist directory + appLoc = filepath.Join(staticDir, resourceDir) + // if !strings.HasPrefix(appLoc, "/") { + // // Prepend the binary's directory path if appLoc is relative + // dir, err := filepath.Abs(filepath.Dir(os.Args[0])) + // if err != nil { + // return "", err + // } + + // appLoc = filepath.Join(dir, appLoc) + // } + + if _, err := os.Stat(appLoc); os.IsNotExist(err) { + return "", err + } + } + + return appLoc, nil +} + +// CopyFile copy file +func CopyFile(dst string, src io.Reader) (n int64, err error) { + // check the existence of dst file. + if _, err := os.Stat(dst); err == nil { + return 0, nil + } + err = nil + + out, err := os.Create(dst) + if err != nil { + return 0, err + } + defer func() { + cerr := out.Close() + if err == nil { + err = cerr + } + }() + + n, err = io.Copy(out, src) + return +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/file/file_test.go b/vendor/github.com/skycoin/skycoin/src/util/file/file_test.go new file mode 100755 index 0000000..7809229 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/file/file_test.go @@ -0,0 +1,216 @@ +package file + +import ( + "bytes" + "crypto/rand" + "os" + "path/filepath" + "strings" + "testing" + + "encoding/json" + + "github.com/stretchr/testify/require" +) + +func requireFileMode(t *testing.T, filename string, mode os.FileMode) { + stat, err := os.Stat(filename) + require.NoError(t, err) + require.Equal(t, stat.Mode(), mode) +} + +func requireFileContentsBinary(t *testing.T, filename string, contents []byte) { + f, err := os.Open(filename) + defer f.Close() + require.NoError(t, err) + b := make([]byte, len(contents)*16) + n, err := f.Read(b) + require.NoError(t, err) + + require.Equal(t, n, len(contents)) + require.True(t, bytes.Equal(b[:n], contents)) +} + +func requireFileContents(t *testing.T, filename, contents string) { // nolint: unparam + requireFileContentsBinary(t, filename, []byte(contents)) +} + +func requireFileExists(t *testing.T, filename string) { + stat, err := os.Stat(filename) + require.NoError(t, err) + require.True(t, stat.Mode().IsRegular()) +} + +func requireFileNotExists(t *testing.T, filename string) { + _, err := os.Stat(filename) + require.Error(t, err) + require.True(t, os.IsNotExist(err)) +} + +func cleanup(fn string) { + os.Remove(fn) + os.Remove(fn + ".tmp") + os.Remove(fn + ".bak") +} + +func TestBuildDataDirDotOk(t *testing.T) { + dir := "./.test-skycoin/test" + builtDir, err := buildDataDir(dir) + require.NoError(t, err) + + cleanDir := filepath.Clean(dir) + require.True(t, strings.HasSuffix(builtDir, cleanDir)) + + gopath := os.Getenv("GOPATH") + // by default go uses GOPATH=$HOME/go if it is not set + if gopath == "" { + home := filepath.Clean(UserHome()) + gopath = filepath.Join(home, "go") + } + + require.True(t, strings.HasPrefix(builtDir, gopath)) + require.NotEqual(t, builtDir, filepath.Clean(gopath)) +} + +func TestBuildDataDirEmptyError(t *testing.T) { + dir, err := buildDataDir("") + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrEmptyDirectoryName, err) +} + +func TestBuildDataDirDotError(t *testing.T) { + bad := []string{".", "./", "./.", "././", "./../"} + for _, b := range bad { + dir, err := buildDataDir(b) + require.Empty(t, dir) + require.Error(t, err) + require.Equal(t, ErrDotDirectoryName, err) + } +} + +func TestUserHome(t *testing.T) { + home := UserHome() + require.NotEqual(t, home, "") +} + +func TestBuildDataDirDefault(t *testing.T) { + home := UserHome() + defaultDir := filepath.Join(home, ".skycoin") + dir, err := buildDataDir(defaultDir) + require.NoError(t, err) + expectedPath := filepath.Join(home, ".skycoin") + require.Equal(t, dir, expectedPath) +} + +func TestBuildDataDirAbsolute(t *testing.T) { + abspath := "/opt/.skycoin" + dir, err := buildDataDir(abspath) + require.NoError(t, err) + require.Equal(t, abspath, dir) +} + +func TestLoadJSON(t *testing.T) { + obj := struct{ Key string }{} + fn := "test.json" + defer cleanup(fn) + + // Loading nonexistant file + requireFileNotExists(t, fn) + err := LoadJSON(fn, &obj) + require.Error(t, err) + require.True(t, os.IsNotExist(err)) + + f, err := os.Create(fn) + require.NoError(t, err) + _, err = f.WriteString("{\"key\":\"value\"}") + require.NoError(t, err) + f.Close() + + err = LoadJSON(fn, &obj) + require.NoError(t, err) + require.Equal(t, obj.Key, "value") +} + +func TestSaveJSON(t *testing.T) { + fn := "test.json" + defer cleanup(fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + + requireFileExists(t, fn) + requireFileNotExists(t, fn+".bak") + requireFileMode(t, fn, 0644) + requireFileContents(t, fn, string(b)) + + // Saving again should result in a .bak file same as original + obj.Key = "value2" + err = SaveJSON(fn, obj, 0644) + require.NoError(t, err) + b2, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireFileMode(t, fn, 0644) + requireFileExists(t, fn) + requireFileContents(t, fn, string(b2)) + requireFileNotExists(t, fn+".tmp") +} + +func TestSaveJSONSafe(t *testing.T) { + fn := "test.json" + defer cleanup(fn) + obj := struct { + Key string `json:"key"` + }{Key: "value"} + err := SaveJSONSafe(fn, obj, 0600) + require.NoError(t, err) + b, err := json.MarshalIndent(obj, "", " ") + require.NoError(t, err) + + requireFileExists(t, fn) + requireFileMode(t, fn, 0600) + requireFileContents(t, fn, string(b)) + + // Saving again should result in error, and original file not changed + obj.Key = "value2" + err = SaveJSONSafe(fn, obj, 0600) + require.Error(t, err) + + requireFileExists(t, fn) + requireFileContents(t, fn, string(b)) + requireFileNotExists(t, fn+".bak") + requireFileNotExists(t, fn+".tmp") +} + +func TestSaveBinary(t *testing.T) { + fn := "test.bin" + defer cleanup(fn) + b := make([]byte, 128) + rand.Read(b) + err := SaveBinary(fn, b, 0644) + require.NoError(t, err) + requireFileNotExists(t, fn+".tmp") + requireFileNotExists(t, fn+".bak") + requireFileExists(t, fn) + requireFileContentsBinary(t, fn, b) + requireFileMode(t, fn, 0644) + + b2 := make([]byte, 128) + rand.Read(b2) + require.False(t, bytes.Equal(b, b2)) + + err = SaveBinary(fn, b2, 0644) + requireFileExists(t, fn) + requireFileNotExists(t, fn+".tmp") + requireFileContentsBinary(t, fn, b2) + // requireFileContentsBinary(t, fn+".bak", b) + requireFileMode(t, fn, 0644) + // requireFileMode(t, fn+".bak", 0644) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/hexdump.go b/vendor/github.com/skycoin/skycoin/src/util/hexdump.go new file mode 100755 index 0000000..44ba337 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/hexdump.go @@ -0,0 +1,142 @@ +package util + +import ( + "bufio" + "io" + "strconv" + "strings" + + "github.com/skycoin/skycoin/src/cipher/encoder" +) + +// Annotation : Denotes a chunk of data to be dumped +type Annotation struct { + Name string + Size int +} + +// IAnnotationsGenerator : Interface to implement by types to use HexDump +type IAnnotationsGenerator interface { + GenerateAnnotations() []Annotation +} + +// IAnnotationsIterator : Interface to implement by types to use HexDumpFromIterator +type IAnnotationsIterator interface { + Next() (Annotation, bool) +} + +func writeHexdumpMember(offset int, size int, writer io.Writer, buffer []byte, name string) { + var hexBuff = make([]string, size) + var j = 0 + if offset+size > len(buffer) { + panic(encoder.ErrBufferUnderflow) + } + for i := offset; i < offset+size; i++ { + hexBuff[j] = strconv.FormatInt(int64(buffer[i]), 16) + j++ + } + for i := 0; i < len(hexBuff); i++ { + if len(hexBuff[i]) == 1 { + hexBuff[i] = "0" + hexBuff[i] + } + } + + var sliceContents = getSliceContentsString(hexBuff, offset) + var serialized = encoder.Serialize(sliceContents + " " + name + "\n") + + f := bufio.NewWriter(writer) + defer f.Flush() + f.Write(serialized[4:]) + +} + +func getSliceContentsString(sl []string, offset int) string { + var res = "" + var counter = 0 + var currentOff = offset + if offset != -1 { + var hex = strconv.FormatInt(int64(offset), 16) + var l = len(hex) + for i := 0; i < 4-l; i++ { + hex = "0" + hex + } + hex = "0x" + hex + res += hex + " | " + } + for i := 0; i < len(sl); i++ { + counter++ + res += sl[i] + " " + if counter == 16 { + if i != len(sl)-1 { + res = strings.TrimRight(res, " ") + res += "\n" + currentOff += 16 + if offset != -1 { + //res += " " //9 spaces + var hex = strconv.FormatInt(int64(currentOff), 16) + var l = len(hex) + for i := 0; i < 4-l; i++ { + hex = "0" + hex + } + hex = "0x" + hex + res += hex + " | " + } + counter = 0 + } else { + res += "..." + return res + } + } + } + for i := 0; i < (16 - counter); i++ { + res += "..." + } + res += "..." + return res +} + +func printFinalHex(i int, writer io.Writer) { + var finalHex = strconv.FormatInt(int64(i), 16) + var l = len(finalHex) + for i := 0; i < 4-l; i++ { + finalHex = "0" + finalHex + } + finalHex = "0x" + finalHex + finalHex = finalHex + " | " + + var serialized = encoder.Serialize(finalHex) + + f := bufio.NewWriter(writer) + defer f.Flush() + f.Write(serialized[4:]) +} + +// HexDump : Returns hexdump of buffer according to annotations, via writer +func HexDump(buffer []byte, annotations []Annotation, writer io.Writer) { + var currentOffset = 0 + + for _, element := range annotations { + writeHexdumpMember(currentOffset, element.Size, writer, buffer, element.Name) + currentOffset += element.Size + } + + printFinalHex(currentOffset, writer) +} + +// HexDumpFromIterator : Returns hexdump of buffer according to annotationsIterator, via writer +func HexDumpFromIterator(buffer []byte, annotationsIterator IAnnotationsIterator, writer io.Writer) { + var currentOffset = 0 + + var current, valid = annotationsIterator.Next() + + for { + if !valid { + break + } + writeHexdumpMember(currentOffset, current.Size, writer, buffer, current.Name) + currentOffset += current.Size + current, valid = annotationsIterator.Next() + } + + printFinalHex(currentOffset, writer) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/error.go b/vendor/github.com/skycoin/skycoin/src/util/http/error.go new file mode 100755 index 0000000..14e23d4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/error.go @@ -0,0 +1,107 @@ +// Package httphelper HTTP Error Response Helpers +package httphelper + +import ( + "encoding/json" + "fmt" + "net/http" + + "github.com/skycoin/skycoin/src/util/logging" +) + +// HTTPError wraps http.Error +func HTTPError(w http.ResponseWriter, status int, httpMsg string) { + msg := fmt.Sprintf("%d %s", status, httpMsg) + http.Error(w, msg, status) +} + +func httpError(w http.ResponseWriter, status int) { + HTTPError(w, status, http.StatusText(status)) +} + +func errorXXXMsg(w http.ResponseWriter, status int, msg string) { + httpMsg := http.StatusText(status) + if msg != "" { + httpMsg = fmt.Sprintf("%s - %s", httpMsg, msg) + } + HTTPError(w, status, httpMsg) +} + +func errorXXXJSONOr500(log *logging.Logger, w http.ResponseWriter, status int, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + w.WriteHeader(status) + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http write failed") + } +} + +// Error400 respond with a 400 error and include a message +func Error400(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusBadRequest, msg) +} + +// Error400JSONOr500 returns a 400 error with an object as JSON, writting a 500 error if it fails +func Error400JSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + errorXXXJSONOr500(log, w, http.StatusBadRequest, m) +} + +// Error401 respond with a 401 error +func Error401(w http.ResponseWriter, auth, msg string) { + w.Header().Set("WWW-Authenticate", auth) + httpMsg := http.StatusText(http.StatusUnauthorized) + if msg != "" { + httpMsg = fmt.Sprintf("%s - %s", httpMsg, msg) + } + HTTPError(w, http.StatusUnauthorized, httpMsg) +} + +// Error403 respond with a 403 error and include a message +func Error403(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusForbidden, msg) +} + +// Error404 respond with a 404 error and include a message +func Error404(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusNotFound, msg) +} + +// Error405 respond with a 405 error +func Error405(w http.ResponseWriter) { + httpError(w, http.StatusMethodNotAllowed) +} + +// Error415 respond with a 415 error +func Error415(w http.ResponseWriter) { + httpError(w, http.StatusUnsupportedMediaType) +} + +// Error422 response with a 422 error and include a message +func Error422(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusUnprocessableEntity, msg) +} + +// Error422JSONOr500 returns a 422 error with an object as JSON, writting a 500 error if it fails +func Error422JSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + errorXXXJSONOr500(log, w, http.StatusUnprocessableEntity, m) +} + +// Error501 respond with a 501 error +func Error501(w http.ResponseWriter) { + httpError(w, http.StatusNotImplemented) +} + +// Error500 respond with a 500 error and include a message +func Error500(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusInternalServerError, msg) +} + +// Error503 respond with a 503 error and include a message +func Error503(w http.ResponseWriter, msg string) { + errorXXXMsg(w, http.StatusServiceUnavailable, msg) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/handler.go b/vendor/github.com/skycoin/skycoin/src/util/http/handler.go new file mode 100755 index 0000000..222d47b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/handler.go @@ -0,0 +1,60 @@ +package httphelper + +import ( + "fmt" + "net/http" + "strings" + + "github.com/skycoin/skycoin/src/util/iputil" + "github.com/skycoin/skycoin/src/util/logging" +) + +// ContentSecurityPolicy represents the value of content-security-policy +// header in http response +const ContentSecurityPolicy = "script-src 'self' 127.0.0.1" + +// HostCheck checks that the request's Host header is 127.0.0.1:$port or localhost:$port +// if the HTTP interface host is also a localhost address. +// This prevents DNS rebinding attacks, where an attacker uses a DNS rebinding service +// to bypass CORS checks. +// If the HTTP interface host is not a localhost address, +// the Host header is not checked. This is considered a public interface. +// If the Host header is not set, it is not checked. +// All major browsers send the Host header as required by the HTTP spec. +// TODO: move this back into gui/ library after webrpc interface is removed +func HostCheck(logger *logging.Logger, host string, handler http.Handler) http.Handler { + addr := host + var port uint16 + if strings.Contains(host, ":") { + var err error + addr, port, err = iputil.SplitAddr(host) + if err != nil { + logger.Panic(err) + } + } + + isLocalhost := iputil.IsLocalhost(addr) + + if isLocalhost && port == 0 { + logger.Panic("localhost with no port specified is unsupported") + } + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // NOTE: The "Host" header is not in http.Request.Header, it's put in the http.Request.Host field + if r.Host != "" && isLocalhost && r.Host != fmt.Sprintf("127.0.0.1:%d", port) && r.Host != fmt.Sprintf("localhost:%d", port) { + logger.Critical().Errorf("Detected DNS rebind attempt - configured-host=%s header-host=%s", host, r.Host) + Error403(w, "") + return + } + + handler.ServeHTTP(w, r) + }) +} + +// CSPHandler enables CSP +func CSPHandler(handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Security-Policy", ContentSecurityPolicy) + handler.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/json.go b/vendor/github.com/skycoin/skycoin/src/util/http/json.go new file mode 100755 index 0000000..6ddedfd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/json.go @@ -0,0 +1,190 @@ +package httphelper + +// Utilities for sending JSON + +import ( + "encoding/json" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/logging" +) + +// SendJSONOr500 writes an object as JSON, writing a 500 error if it fails +func SendJSONOr500(log *logging.Logger, w http.ResponseWriter, m interface{}) { + out, err := json.MarshalIndent(m, "", " ") + if err != nil { + Error500(w, "json.MarshalIndent failed") + return + } + + w.Header().Add("Content-Type", "application/json") + + if _, err := w.Write(out); err != nil { + log.WithError(err).Error("http Write failed") + } +} + +// Duration JSON type copied from https://github.com/vrischmann/jsonutil, MIT License + +// Duration is a wrapper around time.Duration which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the duration as a string in the format accepted by time.ParseDuration and returned by time.Duration.String. +type Duration struct { + time.Duration +} + +// FromDuration is a convenience factory to create a Duration instance from the +// given time.Duration value. +func FromDuration(d time.Duration) Duration { + return Duration{d} +} + +// MarshalJSON implements the json.Marshaler interface. The duration is a quoted-string in the format accepted by time.ParseDuration and returned by time.Duration.String. +func (d Duration) MarshalJSON() ([]byte, error) { + return []byte(`"` + d.String() + `"`), nil +} + +// UnmarshalJSON implements the json.Unmarshaler interface. The duration is expected to be a quoted-string of a duration in the format accepted by time.ParseDuration. +func (d *Duration) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + + tmp, err := time.ParseDuration(s) + if err != nil { + return err + } + + d.Duration = tmp + + return nil +} + +// Address is a wrapper around cipher.Address which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type Address struct { + cipher.Address +} + +// UnmarshalJSON unmarshals a string address to a cipher.Address +func (a *Address) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.DecodeBase58Address(s) + if err != nil { + return fmt.Errorf("invalid address: %v", err) + } + + a.Address = tmp + + return nil +} + +// MarshalJSON marshals a cipher.Address in its string representation +func (a Address) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.Address.String() + `"`), nil +} + +// SHA256 is a wrapper around cipher.SHA256 which implements json.Unmarshaler and json.Marshaler. +// It marshals and unmarshals the address as a string +type SHA256 struct { + cipher.SHA256 +} + +// UnmarshalJSON unmarshals a string address to a cipher.SHA256 +func (a *SHA256) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := cipher.SHA256FromHex(s) + if err != nil { + return fmt.Errorf("invalid SHA256 hash: %v", err) + } + + a.SHA256 = tmp + + return nil +} + +// MarshalJSON marshals a cipher.SHA256 in its string representation +func (a SHA256) MarshalJSON() ([]byte, error) { + return []byte(`"` + a.SHA256.Hex() + `"`), nil +} + +// Coins is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Coins uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (c *Coins) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := droplet.FromString(s) + if err != nil { + return err + } + + *c = Coins(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (c Coins) MarshalJSON() ([]byte, error) { + s, err := droplet.ToString(uint64(c)) + if err != nil { + return nil, err + } + + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (c Coins) Value() uint64 { + return uint64(c) +} + +// Hours is a wrapper around uint64 which implements json.Unmarshaler and json.Marshaler. +// It unmarshals a fixed-point decimal string to droplets and vice versa +type Hours uint64 + +// UnmarshalJSON unmarshals a fixed-point decimal string to droplets +func (h *Hours) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + tmp, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return fmt.Errorf("invalid hours value: %v", err) + } + + *h = Hours(tmp) + + return nil +} + +// MarshalJSON marshals droplets to a fixed-point decimal string +func (h Hours) MarshalJSON() ([]byte, error) { + s := fmt.Sprint(h) + return []byte(`"` + s + `"`), nil +} + +// Value returns the underlying uint64 value +func (h Hours) Value() uint64 { + return uint64(h) +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/json_test.go b/vendor/github.com/skycoin/skycoin/src/util/http/json_test.go new file mode 100755 index 0000000..b4d28c8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/json_test.go @@ -0,0 +1,319 @@ +package httphelper + +import ( + "errors" + "fmt" + "math" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" +) + +func TestFromDuration(t *testing.T) { + dur := 10 * time.Second + require.Equal(t, FromDuration(dur).Duration, dur) +} + +func TestDurationMarshalJSON(t *testing.T) { + d := Duration{time.Second * 10} + data, err := d.MarshalJSON() + + require.NoError(t, err) + require.Equal(t, `"10s"`, string(data)) +} + +func TestDurationUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + s string + expected time.Duration + err string + }{ + { + name: "valid duration", + s: "1m", + expected: time.Minute, + }, + { + name: "invalid duration", + s: "foo", + err: "time: invalid duration foo", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var d Duration + err := d.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.s))) + + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, d.Duration) + } + + }) + } + + var d Duration + err := d.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestAddressMarshalJSON(t *testing.T) { + addrStr := "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy" + addrInner, err := cipher.DecodeBase58Address(addrStr) + require.NoError(t, err) + + addr := Address{addrInner} + + data, err := addr.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy"`, string(data)) +} + +func TestAddressUnmarshalJSON(t *testing.T) { + cases := []struct { + name string + addr string + err string + }{ + { + name: "empty address", + addr: "", + err: "invalid address: Invalid base58 string", + }, + { + name: "short address", + addr: "xxx", + err: "invalid address: Invalid address length", + }, + { + name: "invalid base58 address", + addr: "2blYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + err: "invalid address: Invalid base58 character", + }, + { + name: "valid address", + addr: "2bfYafFtdkCRNcCyuDvsATV66GvBR9xfvjy", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + var a Address + err := a.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.addr))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + addr, err := cipher.DecodeBase58Address(tc.addr) + require.NoError(t, err) + + require.Equal(t, addr, a.Address) + } + }) + } + + var a Address + err := a.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestCoinsMarshalJSON(t *testing.T) { + c := Coins(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"0.000111"`, string(data)) + + c = Coins(math.MaxUint64) + _, err = c.MarshalJSON() + testutil.RequireError(t, err, "Droplet string conversion failed: Value is too large") +} + +func TestCoinsUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "Droplet string conversion failed: Negative balance", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1234567", + err: "Droplet string conversion failed: Too many decimal places", + }, + { + c: "1.001", + expected: 1001e3, + }, + { + c: "1.234567", + expected: 1234567, + }, + { + c: "9", + expected: 9e6, + }, + { + c: ".", + err: "can't convert . to decimal", + }, + { + c: "inf", + err: "can't convert inf to decimal", + }, + { + c: "9223372036854.775807", + expected: uint64(math.MaxInt64), + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Coins + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Coins + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestHoursMarshalJSON(t *testing.T) { + c := Hours(111) + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"111"`, string(data)) +} + +func TestHoursUnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected uint64 + err string + }{ + { + c: "-1", + err: "invalid hours value: strconv.ParseUint: parsing \"-1\": invalid syntax", + }, + { + c: "0", + expected: 0, + }, + { + c: "0.1", + err: "invalid hours value: strconv.ParseUint: parsing \"0.1\": invalid syntax", + }, + { + c: "9", + expected: 9, + }, + { + c: ".", + err: "invalid hours value: strconv.ParseUint: parsing \".\": invalid syntax", + }, + { + c: "inf", + err: "invalid hours value: strconv.ParseUint: parsing \"inf\": invalid syntax", + }, + } + + for _, tc := range cases { + t.Run(fmt.Sprint(tc.c), func(t *testing.T) { + var c Hours + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.Value()) + } + }) + } + + var c Hours + err := c.UnmarshalJSON([]byte("invalidjson")) + testutil.RequireError(t, err, "invalid character 'i' looking for beginning of value") +} + +func TestSHA256MarshalJSON(t *testing.T) { + hash := "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d" + + c := SHA256{cipher.MustSHA256FromHex(hash)} + + data, err := c.MarshalJSON() + require.NoError(t, err) + require.Equal(t, `"97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"`, string(data)) +} + +func TestSHA256UnmarshalJSON(t *testing.T) { + cases := []struct { + c string + expected cipher.SHA256 + err string + }{ + { + c: "", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "foo", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+006F 'o'", + }, + + { + c: "97dd0628", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d97", + err: "invalid SHA256 hash: Invalid hex length", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11Q", + err: "invalid SHA256 hash: encoding/hex: invalid byte: U+0051 'Q'", + }, + + { + c: "97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d", + expected: cipher.MustSHA256FromHex("97dd062820314c46da0fc18c8c6c10bfab1d5da80c30adc79bbe72e90bfab11d"), + }, + } + + for _, tc := range cases { + t.Run(tc.c, func(t *testing.T) { + var c SHA256 + err := c.UnmarshalJSON([]byte(fmt.Sprintf(`"%s"`, tc.c))) + if tc.err != "" { + require.Equal(t, errors.New(tc.err), err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, c.SHA256) + } + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/http/log.go b/vendor/github.com/skycoin/skycoin/src/util/http/log.go new file mode 100755 index 0000000..d077d0c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/http/log.go @@ -0,0 +1,49 @@ +package httphelper + +import ( + "bytes" + "net/http" + "strings" + "time" + + "github.com/sirupsen/logrus" +) + +// ElapsedHandler records and logs an HTTP request with the elapsed time and status code +func ElapsedHandler(logger logrus.FieldLogger, handler http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + lrw := newWrappedResponseWriter(w) + start := time.Now() + handler.ServeHTTP(lrw, r) + logMethod := logger.Infof + if lrw.statusCode >= 400 { + logMethod = logger.WithFields(logrus.Fields{ + "body": strings.TrimSpace(lrw.response.String()), + }).Errorf + } + logMethod("%d %s %s %s", lrw.statusCode, r.Method, r.URL.Path, time.Since(start)) + }) +} + +type wrappedResponseWriter struct { + http.ResponseWriter + statusCode int + response bytes.Buffer +} + +func newWrappedResponseWriter(w http.ResponseWriter) *wrappedResponseWriter { + return &wrappedResponseWriter{w, http.StatusOK, bytes.Buffer{}} +} + +func (lrw *wrappedResponseWriter) WriteHeader(code int) { + lrw.statusCode = code + lrw.ResponseWriter.WriteHeader(code) +} + +func (lrw *wrappedResponseWriter) Write(buff []byte) (int, error) { + retVal, err := lrw.ResponseWriter.Write(buff) + if lrw.statusCode >= 400 { + lrw.response.Write(buff) + } + return retVal, err +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go new file mode 100755 index 0000000..f367445 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil.go @@ -0,0 +1,55 @@ +package iputil + +import ( + "errors" + "fmt" + "net" + "strconv" +) + +// LocalhostIP returns the address for localhost on the machine +func LocalhostIP() (string, error) { + tt, err := net.Interfaces() + if err != nil { + return "", err + } + for _, t := range tt { + aa, err := t.Addrs() + if err != nil { + return "", err + } + for _, a := range aa { + if ipnet, ok := a.(*net.IPNet); ok && ipnet.IP.IsLoopback() { + return ipnet.IP.String(), nil + } + } + } + return "", errors.New("No local IP found") +} + +// IsLocalhost returns true if addr is a localhost address +// Works for both ipv4 and ipv6 addresses. +func IsLocalhost(addr string) bool { + return net.ParseIP(addr).IsLoopback() || addr == "localhost" +} + +// SplitAddr splits an ip:port string to ip, port. +// Works for both ipv4 and ipv6 addresses. +// If the IP is not specified, returns an error. +func SplitAddr(addr string) (string, uint16, error) { + ip, port, err := net.SplitHostPort(addr) + if err != nil { + return "", 0, err + } + + if ip == "" { + return "", 0, fmt.Errorf("IP missing from %s", addr) + } + + port64, err := strconv.ParseUint(port, 10, 16) + if err != nil { + return "", 0, fmt.Errorf("Invalid port in %s", addr) + } + + return ip, uint16(port64), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil_test.go b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil_test.go new file mode 100755 index 0000000..bc2280e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/iputil/iputil_test.go @@ -0,0 +1,124 @@ +package iputil + +import ( + "fmt" + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsLocalhost(t *testing.T) { + testData := []struct { + host string + expected bool + }{ + { + host: "0:0:0:0:0:0:0:1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "127.0.0.1", + expected: true, + }, + { + host: "localhost", + expected: true, + }, + { + host: "85.56.12.34", + expected: false, + }, + { + host: "::1", + expected: true, + }, + { + host: "::", + expected: false, + }, + { + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + expected: false, + }, + { + host: "", + expected: false, + }, + } + + for _, tc := range testData { + t.Run(tc.host, func(t *testing.T) { + actual := IsLocalhost(tc.host) + require.Equal(t, tc.expected, actual) + }) + } +} + +func TestSplitAddr(t *testing.T) { + testData := []struct { + input string + host string + port uint16 + err error + }{ + { + input: "0.0.0.0:8888", + host: "0.0.0.0", + port: 8888, + }, + { + input: "0.0.0.0:", + err: fmt.Errorf("Invalid port in %s", "0.0.0.0:"), + }, + { + input: "0.0.0.0:x", + err: fmt.Errorf("Invalid port in %s", "0.0.0.0:x"), + }, + { + input: ":9999", + err: fmt.Errorf("IP missing from %s", ":9999"), + }, + { + input: "127.0.0.1", + err: &net.AddrError{ + Err: "missing port in address", + Addr: "127.0.0.1", + }, + }, + { + input: "[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:1234", + host: "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + port: 1234, + }, + { + input: "[::]:1234", + host: "::", + port: 1234, + }, + { + input: "[::]:x", + err: fmt.Errorf("Invalid port in %s", "[::]:x"), + }, + } + + for _, tc := range testData { + t.Run(tc.input, func(t *testing.T) { + addr, port, err := SplitAddr(tc.input) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.host, addr) + require.Equal(t, tc.port, port) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go b/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go new file mode 100755 index 0000000..6fb9f73 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/formatter.go @@ -0,0 +1,441 @@ +package logging + +import ( + "bytes" + "fmt" + "io" + "os" + "sort" + "strings" + "sync" + "time" + + "github.com/mgutz/ansi" + "github.com/sirupsen/logrus" + "golang.org/x/crypto/ssh/terminal" +) + +const defaultTimestampFormat = time.RFC3339 + +var ( + baseTimestamp = time.Now() + defaultColorScheme = &ColorScheme{ + InfoLevelStyle: "green", + WarnLevelStyle: "yellow", + ErrorLevelStyle: "red", + FatalLevelStyle: "red", + PanicLevelStyle: "red", + DebugLevelStyle: "blue", + PrefixStyle: "cyan", + TimestampStyle: "black+h", + CallContextStyle: "black+h", + CriticalStyle: "magenta+h", + } + noColorsColorScheme = &compiledColorScheme{ + InfoLevelColor: ansi.ColorFunc(""), + WarnLevelColor: ansi.ColorFunc(""), + ErrorLevelColor: ansi.ColorFunc(""), + FatalLevelColor: ansi.ColorFunc(""), + PanicLevelColor: ansi.ColorFunc(""), + DebugLevelColor: ansi.ColorFunc(""), + PrefixColor: ansi.ColorFunc(""), + TimestampColor: ansi.ColorFunc(""), + CallContextColor: ansi.ColorFunc(""), + CriticalColor: ansi.ColorFunc(""), + } + defaultCompiledColorScheme = compileColorScheme(defaultColorScheme) +) + +func miniTS() int { + return int(time.Since(baseTimestamp) / time.Second) +} + +// ColorScheme configures the logging output colors +type ColorScheme struct { + InfoLevelStyle string + WarnLevelStyle string + ErrorLevelStyle string + FatalLevelStyle string + PanicLevelStyle string + DebugLevelStyle string + PrefixStyle string + TimestampStyle string + CallContextStyle string + CriticalStyle string +} + +type compiledColorScheme struct { + InfoLevelColor func(string) string + WarnLevelColor func(string) string + ErrorLevelColor func(string) string + FatalLevelColor func(string) string + PanicLevelColor func(string) string + DebugLevelColor func(string) string + PrefixColor func(string) string + TimestampColor func(string) string + CallContextColor func(string) string + CriticalColor func(string) string +} + +// TextFormatter formats log output +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. For a TTY colors are enabled by default. + DisableColors bool + + // Force formatted layout, even for non-TTY output. + ForceFormatting bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Disable the conversion of the log levels to uppercase + DisableUppercase bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // Timestamp format to use for display when a full timestamp is printed. + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // Wrap empty fields in quotes if true. + QuoteEmptyFields bool + + // Can be set to the override the default quoting character " + // with something else. For example: ', or `. + QuoteCharacter string + + // Pad msg field with spaces on the right for display. + // The value for this parameter will be the size of padding. + // Its default value is zero, which means no padding will be applied for msg. + SpacePadding int + + // Always use quotes for string values (except for empty fields) + AlwaysQuoteStrings bool + + // Color scheme to use. + colorScheme *compiledColorScheme + + // Whether the logger's out is to a terminal. + isTerminal bool + + sync.Once +} + +func getCompiledColor(main string, fallback string) func(string) string { + var style string + if main != "" { + style = main + } else { + style = fallback + } + return ansi.ColorFunc(style) +} + +func compileColorScheme(s *ColorScheme) *compiledColorScheme { + return &compiledColorScheme{ + InfoLevelColor: getCompiledColor(s.InfoLevelStyle, defaultColorScheme.InfoLevelStyle), + WarnLevelColor: getCompiledColor(s.WarnLevelStyle, defaultColorScheme.WarnLevelStyle), + ErrorLevelColor: getCompiledColor(s.ErrorLevelStyle, defaultColorScheme.ErrorLevelStyle), + FatalLevelColor: getCompiledColor(s.FatalLevelStyle, defaultColorScheme.FatalLevelStyle), + PanicLevelColor: getCompiledColor(s.PanicLevelStyle, defaultColorScheme.PanicLevelStyle), + DebugLevelColor: getCompiledColor(s.DebugLevelStyle, defaultColorScheme.DebugLevelStyle), + PrefixColor: getCompiledColor(s.PrefixStyle, defaultColorScheme.PrefixStyle), + TimestampColor: getCompiledColor(s.TimestampStyle, defaultColorScheme.TimestampStyle), + CallContextColor: getCompiledColor(s.CallContextStyle, defaultColorScheme.CallContextStyle), + CriticalColor: getCompiledColor(s.CriticalStyle, defaultColorScheme.CriticalStyle), + } +} + +func (f *TextFormatter) init(entry *logrus.Entry) { + if len(f.QuoteCharacter) == 0 { + f.QuoteCharacter = "\"" + } + if entry.Logger != nil { + f.isTerminal = f.checkIfTerminal(entry.Logger.Out) + } +} + +func (f *TextFormatter) checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} + +// SetColorScheme sets the TextFormatter's color scheme configuration +func (f *TextFormatter) SetColorScheme(colorScheme *ColorScheme) { + f.colorScheme = compileColorScheme(colorScheme) +} + +// Format formats a logrus.Entry +func (f *TextFormatter) Format(entry *logrus.Entry) ([]byte, error) { + var b *bytes.Buffer + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + lastKeyIdx := len(keys) - 1 + + if !f.DisableSorting { + sort.Strings(keys) + } + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.Do(func() { f.init(entry) }) + + isFormatted := f.ForceFormatting || f.isTerminal + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if isFormatted { + isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + var colorScheme *compiledColorScheme + if isColored { + if f.colorScheme == nil { + colorScheme = defaultCompiledColorScheme + } else { + colorScheme = f.colorScheme + } + } else { + colorScheme = noColorsColorScheme + } + f.printColored(b, entry, keys, timestampFormat, colorScheme) + } else { + if !f.DisableTimestamp { + f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat), true) + } + f.appendKeyValue(b, "level", entry.Level.String(), true) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message, lastKeyIdx >= 0) + } + for i, key := range keys { + f.appendKeyValue(b, key, entry.Data[key], lastKeyIdx != i) + } + } + + b.WriteByte('\n') + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys []string, timestampFormat string, colorScheme *compiledColorScheme) { + var levelColor func(string) string + var levelText string + switch entry.Level { + case logrus.InfoLevel: + levelColor = colorScheme.InfoLevelColor + case logrus.WarnLevel: + levelColor = colorScheme.WarnLevelColor + case logrus.ErrorLevel: + levelColor = colorScheme.ErrorLevelColor + case logrus.FatalLevel: + levelColor = colorScheme.FatalLevelColor + case logrus.PanicLevel: + levelColor = colorScheme.PanicLevelColor + default: + levelColor = colorScheme.DebugLevelColor + } + + priority, ok := entry.Data[logPriorityKey] + hasPriority := ok && priority == logPriorityCritical + + if entry.Level != logrus.WarnLevel { + levelText = entry.Level.String() + } else { + levelText = "warn" + } + + if !f.DisableUppercase { + levelText = strings.ToUpper(levelText) + } + + level := levelColor(levelText) + message := entry.Message + prefix := "" + + prefixText := extractPrefix(entry) + if prefixText != "" { + prefixText = " " + prefixText + ":" + prefix = colorScheme.PrefixColor(prefixText) + } + + messageFormat := "%s" + if f.SpacePadding != 0 { + messageFormat = fmt.Sprintf("%%-%ds", f.SpacePadding) + } + if message != "" { + messageFormat = " " + messageFormat + } + + callContextParts := []string{} + if ifile, ok := entry.Data["file"]; ok { + if sfile, ok := ifile.(string); ok && sfile != "" { + callContextParts = append(callContextParts, sfile) + } + } + if ifunc, ok := entry.Data["func"]; ok { + if sfunc, ok := ifunc.(string); ok && sfunc != "" { + callContextParts = append(callContextParts, sfunc) + } + } + if iline, ok := entry.Data["line"]; ok { + sline := "" + switch iline := iline.(type) { + case string: + sline = iline + case int, uint, int32, int64, uint32, uint64: + sline = fmt.Sprint(iline) + } + if sline != "" { + callContextParts = append(callContextParts, fmt.Sprint(sline)) + } + } + callContextText := strings.Join(callContextParts, ":") + callContext := colorScheme.CallContextColor(callContextText) + if callContext != "" { + callContext = " " + callContext + } + + if f.DisableTimestamp { + if hasPriority { + str := fmt.Sprintf("%s%s%s"+messageFormat, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s%s%s"+messageFormat, level, callContext, prefix, message) + } + } else { + var timestamp string + if !f.FullTimestamp { + timestamp = fmt.Sprintf("[%04d]", miniTS()) + } else { + timestamp = fmt.Sprintf("[%s]", entry.Time.Format(timestampFormat)) + } + + coloredTimestamp := colorScheme.TimestampColor(timestamp) + + if hasPriority { + str := fmt.Sprintf("%s %s%s%s"+messageFormat, timestamp, levelText, callContextText, prefixText, message) + fmt.Fprint(b, colorScheme.CriticalColor(str)) + } else { + fmt.Fprintf(b, "%s %s%s%s"+messageFormat, coloredTimestamp, level, callContext, prefix, message) + } + } + + for _, k := range keys { + if k != "prefix" && k != "file" && k != "func" && k != "line" && k != logPriorityKey && k != logModuleKey { + v := entry.Data[k] + fmt.Fprintf(b, " %s", f.formatKeyValue(levelColor(k), v)) + } + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if len(text) == 0 { + return f.QuoteEmptyFields + } + + if f.AlwaysQuoteStrings { + return true + } + + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.') { + return true + } + } + + return false +} + +func extractPrefix(e *logrus.Entry) string { + var module string + if iModule, ok := e.Data[logModuleKey]; ok { + module, _ = iModule.(string) + } + + var priority string + if iPriority, ok := e.Data[logPriorityKey]; ok { + priority, _ = iPriority.(string) + } + + switch { + case priority == "": + return fmt.Sprintf("[%s]", module) + case module == "": + return fmt.Sprintf("[%s]", priority) + default: + return fmt.Sprintf("[%s:%s]", module, priority) + } +} + +func (f *TextFormatter) formatKeyValue(key string, value interface{}) string { + return fmt.Sprintf("%s=%s", key, f.formatValue(value)) +} + +func (f *TextFormatter) formatValue(value interface{}) string { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } + return value + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + return fmt.Sprintf("%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } + return errmsg + default: + return fmt.Sprintf("%+v", value) + } +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}, appendSpace bool) { + b.WriteString(key) + b.WriteByte('=') + f.appendValue(b, value) + + if appendSpace { + b.WriteByte(' ') + } +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + switch value := value.(type) { + case string: + if f.needsQuoting(value) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, value, f.QuoteCharacter) + } else { + b.WriteString(value) + } + case error: + errmsg := value.Error() + if f.needsQuoting(errmsg) { + fmt.Fprintf(b, "%s%+v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter) + } else { + b.WriteString(errmsg) + } + default: + fmt.Fprint(b, value) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go b/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go new file mode 100755 index 0000000..d8d0cc6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/hooks.go @@ -0,0 +1,44 @@ +package logging + +import ( + "io" + + "github.com/sirupsen/logrus" +) + +// WriteHook is a logrus.Hook that logs to an io.Writer +type WriteHook struct { + w io.Writer + formatter logrus.Formatter +} + +// NewWriteHook returns a new WriteHook +func NewWriteHook(w io.Writer) *WriteHook { + return &WriteHook{ + w: w, + formatter: &TextFormatter{ + DisableColors: true, + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + }, + } +} + +// Levels returns Levels accepted by the WriteHook. +// All logrus.Levels are returned. +func (f *WriteHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire writes a logrus.Entry to the file +func (f *WriteHook) Fire(e *logrus.Entry) error { + b, err := f.formatter.Format(e) + if err != nil { + return err + } + + _, err = f.w.Write(b) + return err +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go b/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go new file mode 100755 index 0000000..2f3b4f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/logger.go @@ -0,0 +1,71 @@ +package logging + +import ( + "os" + + "github.com/sirupsen/logrus" +) + +// Logger wraps logrus.FieldLogger +type Logger struct { + logrus.FieldLogger +} + +// Critical adds special critical-level fields for specially highlighted logging, +// since logrus lacks a distinct critical field and does not have configurable log levels +func (logger *Logger) Critical() logrus.FieldLogger { + return logger.WithField(logPriorityKey, logPriorityCritical) +} + +// MasterLogger wraps logrus.Logger and is able to create new package-aware loggers +type MasterLogger struct { + *logrus.Logger +} + +// NewMasterLogger creates a new package-aware logger with formatting string +func NewMasterLogger() *MasterLogger { + hooks := make(logrus.LevelHooks) + + return &MasterLogger{ + Logger: &logrus.Logger{ + Out: os.Stdout, + Formatter: &TextFormatter{ + FullTimestamp: true, + AlwaysQuoteStrings: true, + QuoteEmptyFields: true, + ForceFormatting: true, + DisableColors: false, + ForceColors: false, + }, + Hooks: hooks, + Level: logrus.DebugLevel, + }, + } +} + +// PackageLogger instantiates a package-aware logger +func (logger *MasterLogger) PackageLogger(moduleName string) *Logger { + return &Logger{ + FieldLogger: logger.WithField(logModuleKey, moduleName), + } +} + +// AddHook adds a logrus.Hook to the logger and its module loggers +func (logger *MasterLogger) AddHook(hook logrus.Hook) { + logger.Hooks.Add(hook) +} + +// SetLevel sets the log level for the logger and its module loggers +func (logger *MasterLogger) SetLevel(level logrus.Level) { + logger.Level = level +} + +// EnableColors enables colored logging +func (logger *MasterLogger) EnableColors() { + logger.Formatter.(*TextFormatter).DisableColors = false +} + +// DisableColors disables colored logging +func (logger *MasterLogger) DisableColors() { + logger.Formatter.(*TextFormatter).DisableColors = true +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go b/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go new file mode 100755 index 0000000..9ade95a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/logging/logging.go @@ -0,0 +1,76 @@ +package logging + +import ( + "errors" + "io" + "io/ioutil" + "strings" + + "github.com/sirupsen/logrus" +) + +var log = NewMasterLogger() + +const ( + // logModuleKey is the key used for the module name data entry + logModuleKey = "_module" + // logPriorityKey is the log entry key for priority log statements + logPriorityKey = "_priority" + // logPriorityCritical is the log entry value for priority log statements + logPriorityCritical = "CRITICAL" +) + +// LevelFromString returns a logrus.Level from a string identifier +func LevelFromString(s string) (logrus.Level, error) { + switch strings.ToLower(s) { + case "debug": + return logrus.DebugLevel, nil + case "info", "notice": + return logrus.InfoLevel, nil + case "warn", "warning": + return logrus.WarnLevel, nil + case "error": + return logrus.ErrorLevel, nil + case "fatal", "critical": + return logrus.FatalLevel, nil + case "panic": + return logrus.PanicLevel, nil + default: + return logrus.DebugLevel, errors.New("could not convert string to log level") + } +} + +// MustGetLogger returns a package-aware logger from the master logger +func MustGetLogger(module string) *Logger { + return log.PackageLogger(module) +} + +// AddHook adds a hook to the global logger +func AddHook(hook logrus.Hook) { + log.AddHook(hook) +} + +// EnableColors enables colored logging +func EnableColors() { + log.EnableColors() +} + +// DisableColors disables colored logging +func DisableColors() { + log.DisableColors() +} + +// SetLevel sets the logger's minimum log level +func SetLevel(level logrus.Level) { + log.SetLevel(level) +} + +// SetOutputTo sets the logger's output to an io.Writer +func SetOutputTo(w io.Writer) { + log.Out = w +} + +// Disable disables the logger completely +func Disable() { + log.Out = ioutil.Discard +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/utc/utc.go b/vendor/github.com/skycoin/skycoin/src/util/utc/utc.go new file mode 100755 index 0000000..2d6da93 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/utc/utc.go @@ -0,0 +1,16 @@ +// Package utc provides helper function to get UTC time +package utc + +import ( + "time" +) + +// Now returns the current UTC time +func Now() time.Time { + return time.Now().UTC() +} + +// UnixNow returns the current UTC time as unix timestamp +func UnixNow() int64 { + return Now().Unix() +} diff --git a/vendor/github.com/skycoin/skycoin/src/util/utc/utc_test.go b/vendor/github.com/skycoin/skycoin/src/util/utc/utc_test.go new file mode 100755 index 0000000..55bf45b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/util/utc/utc_test.go @@ -0,0 +1,22 @@ +package utc + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNow(t *testing.T) { + now := Now() + require.False(t, now.IsZero()) + time.Sleep(time.Millisecond * 10) + now2 := Now() + require.True(t, now2.After(now)) +} + +func TestUnixNow(t *testing.T) { + now := Now() + unow := UnixNow() + require.True(t, now.Unix() == unow || now.Unix() == unow-1) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go b/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go new file mode 100755 index 0000000..a01e332 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockchain.go @@ -0,0 +1,799 @@ +package visor + +import ( + "bytes" + "errors" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +const ( + // DebugLevel1 checks for extremely unlikely conditions (10e-40) + DebugLevel1 = true + // DebugLevel2 enable checks for impossible conditions + DebugLevel2 = true +) + +var ( + // ErrVerifyStopped is returned when database verification is interrupted + ErrVerifyStopped = errors.New("database verification stopped") +) + +//Warning: 10e6 is 10 million, 1e6 is 1 million + +// Note: DebugLevel1 adds additional checks for hash collisions that +// are unlikely to occur. DebugLevel2 adds checks for conditions that +// can only occur through programmer error and malice. + +// Note: a droplet is the base coin unit. Each Skycoin is one million droplets + +//Termonology: +// UXTO - unspent transaction outputs +// UX - outputs10 +// TX - transactions + +//Notes: +// transactions (TX) consume outputs (UX) and produce new outputs (UX) +// Tx.Uxi() - set of outputs consumed by transaction +// Tx.Uxo() - set of outputs created by transaction + +// chainStore +type chainStore interface { + Head(*dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(*dbutil.Tx) (uint64, bool, error) + Len(*dbutil.Tx) (uint64, error) + AddBlock(*dbutil.Tx, *coin.SignedBlock) error + GetBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetSignedBlockByHash(*dbutil.Tx, cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(*dbutil.Tx, uint64) (*coin.SignedBlock, error) + UnspentPool() blockdb.UnspentPooler + GetGenesisBlock(*dbutil.Tx) (*coin.SignedBlock, error) + GetBlockSignature(*dbutil.Tx, *coin.Block) (cipher.Sig, bool, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// DefaultWalker default blockchain walker +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + if len(hps) == 0 { + return cipher.SHA256{}, false + } + return hps[0].Hash, true +} + +// CreateBuckets creates the buckets used by the blockdb +func CreateBuckets(db *dbutil.DB) error { + return db.Update("CreateBuckets", func(tx *dbutil.Tx) error { + if err := historydb.CreateBuckets(tx); err != nil { + return err + } + + if err := blockdb.CreateBuckets(tx); err != nil { + return err + } + + return dbutil.CreateBuckets(tx, [][]byte{ + UnconfirmedTxnsBkt, + UnconfirmedUnspentsBkt, + }) + }) +} + +// BlockchainConfig configures Blockchain options +type BlockchainConfig struct { + // Arbitrating mode: if in arbitrating mode, when master node execute blocks, + // the invalid transaction will be skipped and continue the next; otherwise, + // node will throw the error and return. + Arbitrating bool + Pubkey cipher.PubKey +} + +// Blockchain maintains blockchain and provides apis for accessing the chain. +type Blockchain struct { + db *dbutil.DB + cfg BlockchainConfig + store chainStore +} + +// NewBlockchain creates a Blockchain +func NewBlockchain(db *dbutil.DB, cfg BlockchainConfig) (*Blockchain, error) { + chainstore, err := blockdb.NewBlockchain(db, DefaultWalker) + if err != nil { + return nil, err + } + + return &Blockchain{ + cfg: cfg, + db: db, + store: chainstore, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.GetGenesisBlock(tx) +} + +// GetSignedBlockByHash returns block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockByHash(tx, hash) +} + +// GetSignedBlockBySeq returns block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + return bc.store.GetSignedBlockBySeq(tx, seq) +} + +// Head returns the most recent confirmed block +func (bc Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.store.Head(tx) +} + +// Unspent returns the unspent outputs pool +func (bc *Blockchain) Unspent() blockdb.UnspentPooler { + return bc.store.UnspentPool() +} + +// Len returns the length of current blockchain. +func (bc Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + return bc.store.Len(tx) +} + +// HeadSeq returns the sequence of head block +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.store.HeadSeq(tx) +} + +// Time returns time of last block +// used as system clock indepedent clock for coin hour calculations +// TODO: Deprecate +func (bc *Blockchain) Time(tx *dbutil.Tx) (uint64, error) { + b, err := bc.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, nil + } + return 0, err + } + + return b.Time(), nil +} + +// NewBlock creates a Block given an array of Transactions. +// Only hard constraints are applied to transactions in the block. +// The caller of this function should apply any additional soft constraints, +// and choose which transactions to place into the block. +func (bc Blockchain) NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) { + if len(txns) == 0 { + return nil, errors.New("No transactions") + } + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + if currentTime <= head.Time() { + return nil, errors.New("Time can only move forward") + } + + txns, err = bc.processTransactions(tx, txns) + if err != nil { + return nil, err + } + + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return nil, err + } + + feeCalc := bc.TransactionFee(tx, head.Time()) + + b, err := coin.NewBlock(head.Block, currentTime, uxHash, txns, feeCalc) + if err != nil { + return nil, err + } + + // make sure block is valid + if DebugLevel2 == true { + if err := bc.verifyBlockHeader(tx, *b); err != nil { + return nil, err + } + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + logger.Panicf("bc.processTransactions second verification call failed: %v", err) + } + b.Body.Transactions = txns + } + return b, nil +} + +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b coin.SignedBlock) (coin.SignedBlock, error) { + length, err := bc.Len(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if length > 0 { + if isGenesis, err := bc.isGenesisBlock(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } else if isGenesis { + err := errors.New("Attempted to process genesis block after blockchain has genesis block") + logger.Warning(err.Error()) + return coin.SignedBlock{}, err + } else { + if err := bc.verifyBlockHeader(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + txns, err := bc.processTransactions(tx, b.Body.Transactions) + if err != nil { + return coin.SignedBlock{}, err + } + + b.Body.Transactions = txns + + if err := bc.verifyUxHash(tx, b.Block); err != nil { + return coin.SignedBlock{}, err + } + + } + } + + return b, nil +} + +// ExecuteBlock attempts to append block to blockchain with *dbutil.Tx +func (bc *Blockchain) ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + length, err := bc.Len(tx) + if err != nil { + return err + } + + if length > 0 { + head, err := bc.Head(tx) + if err != nil { + return err + } + + // TODO -- why do we modify the block here? + sb.Head.PrevHash = head.HashHeader() + } + + nb, err := bc.processBlock(tx, *sb) + if err != nil { + return err + } + + if err := bc.store.AddBlock(tx, &nb); err != nil { + return err + } + + return nil +} + +// isGenesisBlock checks if the block is genesis block +func (bc Blockchain) isGenesisBlock(tx *dbutil.Tx, b coin.Block) (bool, error) { + gb, err := bc.store.GetGenesisBlock(tx) + if err != nil { + return false, err + } + if gb == nil { + return false, nil + } + + return gb.HashHeader() == b.HashHeader(), nil +} + +// Compares the state of the current UxHash hash to state of unspent +// output pool. +func (bc Blockchain) verifyUxHash(tx *dbutil.Tx, b coin.Block) error { + uxHash, err := bc.Unspent().GetUxHash(tx) + if err != nil { + return err + } + + if !bytes.Equal(b.Head.UxHash[:], uxHash[:]) { + return errors.New("UxHash does not match") + } + + return nil +} + +// VerifyBlockTxnConstraints checks that the transaction does not violate hard constraints, +// for transactions that are already included in a block. +func (bc Blockchain) VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifyBlockTxnHardConstraints(tx, txn, head, uxIn) +} + +func (bc Blockchain) verifyBlockTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifyBlockTxnConstraints(txn, head, uxIn); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifyBlockTxnConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOut := coin.CreateUnspents(head.Head, txn) + for i := range uxOut { + if contains, err := bc.Unspent().Contains(tx, uxOut[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// VerifySingleTxnHardConstraints checks that the transaction does not violate hard constraints. +// for transactions that are not included in a block. +func (bc Blockchain) VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + switch err.(type) { + case blockdb.ErrUnspentNotExist: + return NewErrTxnViolatesHardConstraint(err) + default: + return err + } + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + return bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn) +} + +// VerifySingleTxnSoftHardConstraints checks that the transaction does not violate hard or soft constraints, +// for transactions that are not included in a block. +// Hard constraints are checked before soft constraints. +func (bc Blockchain) VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, maxSize int) error { + // NOTE: Unspent().GetArray() returns an error if not all txn.In can be found + // This prevents double spends + uxIn, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + head, err := bc.Head(tx) + if err != nil { + return err + } + + // Hard constraints must be checked before soft constraints + if err := bc.verifySingleTxnHardConstraints(tx, txn, head, uxIn); err != nil { + return err + } + + return VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, maxSize) +} + +func (bc Blockchain) verifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := VerifySingleTxnHardConstraints(txn, head, uxIn); err != nil { + return err + } + + if DebugLevel1 { + // Check that new unspents don't collide with existing. + // This should not occur but is a sanity check. + // NOTE: this is not in the top-level VerifySingleTxnHardConstraints + // because it relies on the unspent pool to check for existence. + // For remote callers such as the CLI, they'd need to download the whole + // unspent pool or make a separate API call to check for duplicate unspents. + uxOut := coin.CreateUnspents(head.Head, txn) + for i := range uxOut { + if contains, err := bc.Unspent().Contains(tx, uxOut[i].Hash()); err != nil { + return err + } else if contains { + err := errors.New("New unspent collides with existing unspent") + return NewErrTxnViolatesHardConstraint(err) + } + } + } + + return nil +} + +// GetBlocks return blocks whose seq are in the range of start and end. +func (bc Blockchain) GetBlocks(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) { + if start > end { + return nil, nil + } + + var blocks []coin.SignedBlock + for i := start; i <= end; i++ { + b, err := bc.store.GetSignedBlockBySeq(tx, i) + if err != nil { + logger.WithError(err).Error("bc.store.GetBlockBySeq failed") + return nil, err + } + + if b == nil { + break + } + + blocks = append(blocks, *b) + } + + return blocks, nil +} + +// GetLastBlocks return the latest N blocks. +func (bc Blockchain) GetLastBlocks(tx *dbutil.Tx, num uint64) ([]coin.SignedBlock, error) { + if num == 0 { + return nil, nil + } + + end, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + + start := int(end-num) + 1 + if start < 0 { + start = 0 + } + + return bc.GetBlocks(tx, uint64(start), end) +} + +/* Private */ + +// Validates a set of Transactions, individually, against each other and +// against the Blockchain. If firstFail is true, it will return an error +// as soon as it encounters one. Else, it will return an array of +// Transactions that are valid as a whole. It may return an error if +// firstFalse is false, if there is no way to filter the txns into a valid +// array, i.e. processTransactions(processTransactions(txn, false), true) +// should not result in an error, unless all txns are invalid. +// TODO: +// - move arbitration to visor +// - blockchain should have strict checking +func (bc Blockchain) processTransactions(tx *dbutil.Tx, txs coin.Transactions) (coin.Transactions, error) { + // copy txs so that the following code won't modify the original txns + txns := make(coin.Transactions, len(txs)) + copy(txns, txs) + + head, err := bc.store.Head(tx) + if err != nil { + return nil, err + } + + // Transactions need to be sorted by fee and hash before arbitrating + if bc.cfg.Arbitrating { + txns = coin.SortTransactions(txns, bc.TransactionFee(tx, head.Time())) + } + + //TODO: audit + if len(txns) == 0 { + if bc.cfg.Arbitrating { + return txns, nil + } + + // If there are no transactions, a block should not be made + return nil, errors.New("No transactions") + } + + skip := make(map[int]struct{}) + uxHashes := make(coin.UxHashSet, len(txns)) + for i, txn := range txns { + // Check the transaction against itself. This covers the hash, + // signature indices and duplicate spends within itself + if err := bc.VerifyBlockTxnConstraints(tx, txn); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } + } + + return nil, err + } + + // Check that each pending unspent will be unique + uxb := coin.UxBody{ + SrcTransaction: txn.Hash(), + } + + for _, to := range txn.Out { + uxb.Coins = to.Coins + uxb.Hours = to.Hours + uxb.Address = to.Address + + h := uxb.Hash() + _, exists := uxHashes[h] + if exists { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Duplicate unspent output across transactions") + } + } + + if DebugLevel1 { + // Check that the expected unspent is not already in the pool. + // This should never happen because its a hash collision + if contains, err := bc.Unspent().Contains(tx, h); err != nil { + return nil, err + } else if contains { + if bc.cfg.Arbitrating { + skip[i] = struct{}{} + continue + } else { + return nil, errors.New("Output hash is in the UnspentPool") + } + } + } + + uxHashes[h] = struct{}{} + } + } + + // Filter invalid transactions before arbitrating between colliding ones + if len(skip) > 0 { + newtxns := make(coin.Transactions, len(txns)-len(skip)) + j := 0 + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns[j] = txns[i] + j++ + } + } + txns = newtxns + skip = make(map[int]struct{}) + } + + // Check to ensure that there are no duplicate spends in the entire block, + // and that we aren't creating duplicate outputs. Duplicate outputs + // within a single Transaction are already checked by VerifyBlockTxnConstraints + hashes := txns.Hashes() + for i := 0; i < len(txns)-1; i++ { + s := txns[i] + for j := i + 1; j < len(txns); j++ { + t := txns[j] + if DebugLevel1 { + if hashes[i] == hashes[j] { + // This is a non-recoverable error for filtering, and + // should never occur. It indicates a hash collision + // amongst different txns. Duplicate transactions are + // caught earlier, when duplicate expected outputs are + // checked for, and will not trigger this. + return nil, errors.New("Duplicate transaction") + } + } + for a := range s.In { + for b := range t.In { + if s.In[a] == t.In[b] { + if bc.cfg.Arbitrating { + // The txn with the highest fee and lowest hash + // is chosen when attempting a double spend. + // Since the txns are sorted, we skip the 2nd + // iterable + skip[j] = struct{}{} + } else { + return nil, errors.New("Cannot spend output twice in the same block") + } + } + } + } + } + } + + // Filter the final results, if necessary + if len(skip) > 0 { + newtxns := make(coin.Transactions, 0, len(txns)-len(skip)) + for i := range txns { + if _, shouldSkip := skip[i]; !shouldSkip { + newtxns = append(newtxns, txns[i]) + } + } + return newtxns, nil + } + + return txns, nil +} + +// TransactionFee calculates the current transaction fee in coinhours of a Transaction +func (bc Blockchain) TransactionFee(tx *dbutil.Tx, headTime uint64) coin.FeeCalculator { + return func(txn *coin.Transaction) (uint64, error) { + inUxs, err := bc.Unspent().GetArray(tx, txn.In) + if err != nil { + return 0, err + } + + return fee.TransactionFee(txn, headTime, inUxs) + } +} + +// VerifySignature checks that BlockSigs state correspond with coin.Blockchain state +// and that all signatures are valid. +func (bc *Blockchain) VerifySignature(block *coin.SignedBlock) error { + err := cipher.VerifySignature(bc.cfg.Pubkey, block.Sig, block.HashHeader()) + if err != nil { + logger.Errorf("Signature verification failed: %v", err) + } + return err +} + +// WalkChain walk through the blockchain concurrently +// The quit channel is optional and if closed, this method still stop. +func (bc *Blockchain) WalkChain(workers int, f func(*dbutil.Tx, *coin.SignedBlock) error, quit chan struct{}) error { + if quit == nil { + quit = make(chan struct{}) + } + + signedBlockC := make(chan *coin.SignedBlock, 100) + errC := make(chan error, 100) + interrupt := make(chan struct{}) + verifyDone := make(chan struct{}) + + // Verify block signatures in a worker pool + var workerWg sync.WaitGroup + workerWg.Add(workers) + for i := 0; i < workers; i++ { + go func() { + defer workerWg.Done() + bc.db.View("WalkChain verify blocks", func(tx *dbutil.Tx) error { + for { + select { + case b, ok := <-signedBlockC: + if !ok { + return nil + } + + if err := f(tx, b); err != nil { + // if err := cipher.VerifySignature(bc.cfg.Pubkey, sh.sig, sh.hash); err != nil { + // logger.Errorf("Signature verification failed: %v", err) + select { + case errC <- err: + default: + } + } + } + } + }) + }() + } + + // Wait for verification worker goroutines to finish + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + workerWg.Wait() + close(verifyDone) + }() + + // Iterate all blocks stored in the "blocks" bucket + // * Detect if a corresponding signature is missing from the signatures bucket + // * Verify the signature for the block + wg.Add(1) + go func() { + bc.db.View("WalkChain get blocks", func(tx *dbutil.Tx) error { + if length, err := bc.Len(tx); err != nil { + return err + } else if length == 0 { + return nil + } + defer wg.Done() + defer close(signedBlockC) + + errInterrupted := errors.New("goroutine was stopped") + + if err := bc.store.ForEachBlock(tx, func(block *coin.Block) error { + sig, ok, err := bc.store.GetBlockSignature(tx, block) + if err != nil { + return err + } + if !ok { + return blockdb.NewErrMissingSignature(block) + } + + signedBlock := &coin.SignedBlock{ + Sig: sig, + Block: *block, + } + + select { + case signedBlockC <- signedBlock: + return nil + case <-quit: + return errInterrupted + case <-interrupt: + return errInterrupted + } + }); err != nil && err != errInterrupted { + switch err.(type) { + case blockdb.ErrMissingSignature: + default: + logger.Errorf("bc.store.ForEachBlock failed: %v", err) + } + select { + case errC <- err: + default: + } + } + return nil + }) + }() + + var err error + select { + case err = <-errC: + if err != nil { + break + } + case <-quit: + err = ErrVerifyStopped + break + case <-verifyDone: + break + } + + close(interrupt) + wg.Wait() + return err +} + +// VerifyBlockHeader Returns error if the BlockHeader is not valid +func (bc Blockchain) verifyBlockHeader(tx *dbutil.Tx, b coin.Block) error { + head, err := bc.Head(tx) + if err != nil { + return err + } + + //check BkSeq + if b.Head.BkSeq != head.Head.BkSeq+1 { + return errors.New("BkSeq invalid") + } + //check Time, only requirement is that its monotonely increasing + if b.Head.Time <= head.Head.Time { + return errors.New("Block time must be > head time") + } + // Check block hash against previous head + if b.Head.PrevHash != head.HashHeader() { + return errors.New("PrevHash does not match current head") + } + if b.HashBody() != b.Head.BodyHash { + return errors.New("Computed body hash does not match") + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockchain_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockchain_test.go new file mode 100755 index 0000000..ad70683 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockchain_test.go @@ -0,0 +1,860 @@ +package visor + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +func addGenesisBlockToBlockchain(t *testing.T, bc *Blockchain) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.SignHash(gb.HashHeader(), genSecret) + + // add genesis block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + }) + }) + require.NoError(t, err) + + return &coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } +} + +func makeSpendTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + + hours := totalHours / 4 + + spendTx.PushOutput(toAddr, coins, hours) + if totalCoins-coins != 0 { + spendTx.PushOutput(uxs[0].Body.Address, totalCoins-coins, totalHours/4) + } + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + return spendTx +} + +/* Helpers */ +type fakeChainStore struct { + blocks []coin.SignedBlock +} + +func (fcs *fakeChainStore) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if l == 0 { + return nil, blockdb.ErrNoHeadBlock + } + + return &fcs.blocks[l-1], nil +} + +func (fcs *fakeChainStore) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + h, err := fcs.Head(tx) + if err != nil { + if err == blockdb.ErrNoHeadBlock { + return 0, false, nil + } + return 0, false, err + } + return h.Seq(), true, nil +} + +func (fcs *fakeChainStore) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fcs.blocks)), nil +} + +func (fcs *fakeChainStore) AddBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + return nil +} + +func (fcs *fakeChainStore) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return cipher.Sig{}, false, nil +} + +func (fcs *fakeChainStore) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + return nil, nil +} + +func (fcs *fakeChainStore) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + l := len(fcs.blocks) + if seq >= uint64(l) { + return nil, nil + } + + return &fcs.blocks[seq], nil +} + +func (fcs *fakeChainStore) UnspentPool() blockdb.UnspentPooler { + return nil +} + +func (fcs *fakeChainStore) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + if len(fcs.blocks) > 0 { + return &fcs.blocks[0], nil + } + return nil, nil +} + +func (fcs *fakeChainStore) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +func makeBlock(t *testing.T, preBlock coin.Block, tm uint64) *coin.Block { + uxHash := testutil.RandSHA256(t) + tx := coin.Transaction{} + b, err := coin.NewBlock(preBlock, tm, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + return b +} + +func makeBlocks(t *testing.T, n int) []coin.SignedBlock { + var bs []coin.SignedBlock + preBlock, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + bs = append(bs, coin.SignedBlock{Block: *preBlock}) + + now := genTime + 100 + for i := 1; i < n; i++ { + b := makeBlock(t, *preBlock, now+uint64(i)*100) + sb := coin.SignedBlock{ + Block: *b, + } + bs = append(bs, sb) + preBlock = b + } + + return bs +} + +func TestBlockchainTime(t *testing.T) { + bs := makeBlocks(t, 1) + tt := []struct { + name string + store chainStore + time uint64 + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:], + }, + bs[0].Time(), + }, + { + "no head", + &fakeChainStore{}, + uint64(0), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + tm, err := bc.Time(tx) + require.NoError(t, err) + require.Equal(t, tc.time, tm) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestIsGenesisBlock(t *testing.T) { + bs := makeBlocks(t, 2) + tt := []struct { + name string + store chainStore + b *coin.Block + isGenesis bool + }{ + { + "genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[0].Block, + true, + }, + { + "not genesis block", + &fakeChainStore{ + blocks: bs[:1], + }, + &bs[1].Block, + false, + }, + { + "empty chain", + &fakeChainStore{}, + &bs[0].Block, + false, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + bc := Blockchain{ + store: tc.store, + } + + isGenesis, err := bc.isGenesisBlock(nil, *tc.b) + require.NoError(t, err) + require.Equal(t, tc.isGenesis, isGenesis) + }) + } +} + +func TestVerifyBlockHeader(t *testing.T) { + bs := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + b coin.Block + err error + }{ + { + "ok", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[1].Block, + nil, + }, + { + "invalid block seq", + &fakeChainStore{ + blocks: bs[:1], + }, + bs[2].Block, + errors.New("BkSeq invalid"), + }, + { + "invalid time", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 0, + }, + }, + + errors.New("Block time must be > head time"), + }, + { + "invalid prehash", + &fakeChainStore{ + blocks: bs[:1], + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: bs[1].Time(), + }, + }, + + errors.New("PrevHash does not match current head"), + }, + { + "empty blockchain", + &fakeChainStore{}, + coin.Block{}, + blockdb.ErrNoHeadBlock, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := &Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + err := bc.verifyBlockHeader(tx, tc.b) + require.Equal(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + req struct { + st uint64 + ed uint64 + } + expect []coin.SignedBlock + }{ + { + "ok", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 1, + }, + blocks[:2], + }, + { + "start > end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 1, + 0, + }, + nil, + }, + { + "start overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 6, + 7, + }, + nil, + }, + { + "start == end", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 0, + }, + blocks[:1], + }, + { + "end overflow", + &fakeChainStore{ + blocks: blocks[:], + }, + struct { + st uint64 + ed uint64 + }{ + 0, + 8, + }, + blocks[:], + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetBlocks(tx, tc.req.st, tc.req.ed) + require.NoError(t, err) + require.Equal(t, len(tc.expect), len(bs)) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestGetLastBlocks(t *testing.T) { + blocks := makeBlocks(t, 5) + tt := []struct { + name string + store chainStore + n uint64 + expect []coin.SignedBlock + }{ + { + "get last block", + &fakeChainStore{ + blocks: blocks[:], + }, + 1, + blocks[4:5], + }, + { + "get last two block", + &fakeChainStore{ + blocks: blocks[:], + }, + 2, + blocks[3:5], + }, + { + "get all block", + &fakeChainStore{ + blocks: blocks[:], + }, + 5, + blocks[0:5], + }, + { + "get block from empty chain", + &fakeChainStore{}, + 1, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc := Blockchain{ + db: db, + store: tc.store, + } + + err := db.View("", func(tx *dbutil.Tx) error { + bs, err := bc.GetLastBlocks(tx, tc.n) + require.NoError(t, err) + require.Equal(t, tc.expect, bs) + return nil + }) + require.NoError(t, err) + }) + } + +} + +// newBlock calls bc.NewBlock in a dbutil.Tx +func newBlock(t *testing.T, bc *Blockchain, txn coin.Transaction, timestamp uint64) *coin.Block { + var b *coin.Block + err := bc.db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, timestamp) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + return b +} + +type spending struct { + TxIndex int + UxIndex int + Keys []cipher.SecKey + ToAddr cipher.Address + Coins uint64 +} + +func TestProcessTransactions(t *testing.T) { + toAddrs := make([]cipher.Address, 10) + keys := make([]cipher.SecKey, 10) + for i := 0; i < 10; i++ { + p, s := cipher.GenerateKeyPair() + toAddrs[i] = cipher.AddressFromPubKey(p) + keys[i] = s + } + + tt := []struct { + name string + arbitrating bool + initChain []spending + spends []spending + err error + }{ + { + "ok", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "no transactions", + false, + []spending{}, + []spending{}, + errors.New("No transactions"), + }, + { + "invalid signature", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + NewErrTxnViolatesHardConstraint(errors.New("Signature not valid for output being spent")), + }, + { + "dup spending", + false, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + errors.New("Cannot spend output twice in the same block"), + }, + { + "arbitrating no transactions", + true, + []spending{}, + []spending{}, + nil, + }, + { + "invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + { + "including invalid signature", + true, + []spending{}, + []spending{ + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{keys[0]}, + ToAddr: toAddrs[0], + Coins: 10e6, + }, + }, + nil, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + // create test db + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + // create chain store + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + // create Blockchain + bc := &Blockchain{ + cfg: BlockchainConfig{ + Arbitrating: tc.arbitrating, + }, + db: db, + store: store, + } + + // init chain + head := addGenesisBlockToBlockchain(t, bc) + tm := head.Time() + for i, spend := range tc.initChain { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + tx := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + + b := newBlock(t, bc, tx, tm+uint64(i*100)) + + sb := &coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + } + err = db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, sb) + }) + require.NoError(t, err) + head = sb + } + + // create spending transactions + txs := make([]coin.Transaction, len(tc.spends)) + for i, spend := range tc.spends { + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[spend.TxIndex]) + tx := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + txs[i] = tx + } + + err = db.View("", func(tx *dbutil.Tx) error { + _, err := bc.processTransactions(tx, txs) + require.EqualValues(t, tc.err, err) + return nil + }) + require.NoError(t, err) + }) + } + +} + +func getUxHash(t *testing.T, db *dbutil.DB, bc *Blockchain) cipher.SHA256 { + var uxHash cipher.SHA256 + err := db.View("", func(tx *dbutil.Tx) error { + var err error + uxHash, err = bc.Unspent().GetUxHash(tx) + return err + }) + require.NoError(t, err) + return uxHash +} + +func TestVerifyUxHash(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + uxHash := getUxHash(t, db, bc) + txn := coin.Transaction{} + b, err := coin.NewBlock(gb.Block, genTime+100, uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + b2, err := coin.NewBlock(gb.Block, genTime+10, testutil.RandSHA256(t), coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + err = bc.verifyUxHash(tx, *b2) + require.Equal(t, errors.New("UxHash does not match"), err) + return nil + }) + require.NoError(t, err) +} + +func TestProcessBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.SignHash(gb.HashHeader(), genSecret), + } + + // Test with empty blockchain + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Add genesis block to chain store + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.store.AddBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Create new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := bc.processBlock(tx, coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} + +func TestExecuteBlock(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + + sb := coin.SignedBlock{ + Block: *gb, + Sig: cipher.SignHash(gb.HashHeader(), genSecret), + } + + // test with empty chain + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // new block + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + toAddr := testutil.MakeAddress() + tx := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, 10e6) + uxHash := getUxHash(t, db, bc) + b, err := coin.NewBlock(*gb, genTime+100, uxHash, coin.Transactions{tx}, feeCalc) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + }) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockchain_verify_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockchain_verify_test.go new file mode 100755 index 0000000..280c585 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockchain_verify_test.go @@ -0,0 +1,560 @@ +package visor + +import ( + "errors" + "fmt" + "math" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +const ( + // GenesisTime is the time of the genesis block created in MakeBlockchain + GenesisTime uint64 = 1000 + // GenesisCoins is the amount of coins in the genesis block created in MakeBlockchain + GenesisCoins uint64 = 1000e6 + // GenesisCoinHours is the amount of coin hours in the genesis block created in MakeBlockchain + GenesisCoinHours uint64 = 1000 * 1000 + // TimeIncrement is the default time increment used when creating a block with CreateGenesisSpendTransaction + TimeIncrement uint64 = 3600 * 1000 +) + +var ( + // GenesisPublic is the public key used in the genesis block created in MakeBlockchain + GenesisPublic cipher.PubKey + // GenesisSecret is the secret key used in the genesis block created in MakeBlockchain + GenesisSecret cipher.SecKey + // GenesisAddress is the address used in the genesis block created in MakeBlockchain + GenesisAddress cipher.Address +) + +func init() { + GenesisPublic, GenesisSecret = cipher.GenerateKeyPair() + GenesisAddress = cipher.AddressFromPubKey(GenesisPublic) +} + +// MakeBlockchain creates a new blockchain with a genesis block +func MakeBlockchain(t *testing.T, db *dbutil.DB, seckey cipher.SecKey) *Blockchain { + pubkey := cipher.PubKeyFromSecKey(seckey) + b, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + gb, err := coin.NewGenesisBlock(GenesisAddress, GenesisCoins, GenesisTime) + if err != nil { + panic(fmt.Errorf("create genesis block failed: %v", err)) + } + + sig := cipher.SignHash(gb.HashHeader(), seckey) + db.Update("", func(tx *dbutil.Tx) error { + return b.ExecuteBlock(tx, &coin.SignedBlock{ + Block: *gb, + Sig: sig, + }) + }) + return b +} + +// CreateGenesisSpendTransaction creates the initial post-genesis transaction that moves genesis coins to another address +func CreateGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, toAddr cipher.Address, coins, hours, fee uint64) coin.Transaction { + var txn coin.Transaction + err := db.View("", func(tx *dbutil.Tx) error { + uxOuts, err := bc.Unspent().GetAll(tx) + require.NoError(t, err) + require.Len(t, uxOuts, 1) + + txn = makeTransactionForChain(t, tx, bc, uxOuts[0], GenesisSecret, toAddr, coins, hours, fee) + require.Equal(t, txn.Out[0].Address.String(), toAddr.String()) + + if coins == GenesisCoins { + // No change output + require.Len(t, txn.Out, 1) + } else { + require.Len(t, txn.Out, 2) + require.Equal(t, txn.Out[1].Address.String(), GenesisAddress.String()) + } + + return nil + }) + require.NoError(t, err) + return txn +} + +// ExecuteGenesisSpendTransaction executes a genesis block created with CreateGenesisSpendTransaction against a blockchain +// created with MakeBlockchain +func ExecuteGenesisSpendTransaction(t *testing.T, db *dbutil.DB, bc *Blockchain, txn coin.Transaction) coin.UxOut { + var block *coin.Block + err := db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.NewBlock(tx, coin.Transactions{txn}, GenesisTime+TimeIncrement) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, block) + + sig := cipher.SignHash(block.HashHeader(), GenesisSecret) + sb := coin.SignedBlock{ + Block: *block, + Sig: sig, + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err = bc.ExecuteBlock(tx, &sb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxOut, err := coin.CreateUnspent(block.Head, txn, 0) + require.NoError(t, err) + + return uxOut +} + +func makeTransactionForChain(t *testing.T, tx *dbutil.Tx, bc *Blockchain, ux coin.UxOut, sec cipher.SecKey, toAddr cipher.Address, amt, hours, fee uint64) coin.Transaction { + tim, err := bc.Time(tx) + require.NoError(t, err) + + chrs, err := ux.CoinHours(tim) + require.NoError(t, err) + + require.Equal(t, cipher.AddressFromPubKey(cipher.PubKeyFromSecKey(sec)), ux.Body.Address) + + knownUx, err := bc.Unspent().Get(tx, ux.Hash()) + require.NoError(t, err) + require.NotNil(t, knownUx) + require.Equal(t, knownUx, &ux) + + txn := coin.Transaction{} + txn.PushInput(ux.Hash()) + + txn.PushOutput(toAddr, amt, hours) + + // Change output + coinsOut := ux.Body.Coins - amt + if coinsOut > 0 { + txn.PushOutput(GenesisAddress, coinsOut, chrs-hours-fee) + } + + txn.SignInputs([]cipher.SecKey{sec}) + + require.Equal(t, len(txn.Sigs), 1) + + err = cipher.ChkSig(ux.Body.Address, cipher.AddSHA256(txn.HashInner(), txn.In[0]), txn.Sigs[0]) + require.NoError(t, err) + + txn.UpdateHeader() + + err = txn.Verify() + require.NoError(t, err) + + err = bc.VerifySingleTxnHardConstraints(tx, txn) + require.NoError(t, err) + + return txn +} + +func makeLostCoinTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { // nolint: unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + txn.PushInput(ux.Hash()) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + txn.PushOutput(toAddr, coins, totalHours/4) + changeCoins := totalCoins - coins + if changeCoins > 0 { + txn.PushOutput(uxs[0].Body.Address, changeCoins-1, totalHours/4) + } + + txn.SignInputs(keys) + txn.UpdateHeader() + return txn +} + +func makeDuplicateUxOutTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins uint64) coin.Transaction { // nolint: unparam + txn := coin.Transaction{} + var totalCoins uint64 + var totalHours uint64 + + for _, ux := range uxs { + txn.PushInput(ux.Hash()) + totalCoins += ux.Body.Coins + totalHours += ux.Body.Hours + } + + txn.PushOutput(toAddr, coins, totalHours/8) + txn.PushOutput(toAddr, coins, totalHours/8) + changeCoins := totalCoins - coins + if changeCoins > 0 { + txn.PushOutput(uxs[0].Body.Address, changeCoins, totalHours/4) + } + + txn.SignInputs(keys) + txn.UpdateHeader() + return txn +} + +// makeUnspentsTx creates a transaction that has a configurable number of outputs sent to the same address. +// The genesis block has only one unspent output, so only one transaction can be made from it. +// This is useful for when multiple test transactions need to be made from the same block. +// Coins and hours are distributed equally amongst all new outputs. +func makeUnspentsTx(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, nUnspents int, maxDivisor uint64) coin.Transaction { // nolint: unparam + // Add inputs to the transaction + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + var err error + totalHours, err = coin.AddUint64(totalHours, ux.Body.Hours) + require.NoError(t, err) + + totalCoins, err = coin.AddUint64(totalCoins, ux.Body.Coins) + require.NoError(t, err) + } + + // Distribute coins and hours equally to all of the new outputs + coins := totalCoins / uint64(nUnspents) + coins = (coins / maxDivisor) * maxDivisor + t.Logf("Assigning %d coins to each of %d outputs", coins, nUnspents) + changeCoins := totalCoins - (coins * uint64(nUnspents)) + t.Logf("Change coins: %d", changeCoins) + + hours := (totalHours / 2) / uint64(nUnspents) + changeHours := (totalHours / 2) - (hours * uint64(nUnspents)) + + // Create the new outputs + require.True(t, uint64(nUnspents) < hours) + for i := 0; i < nUnspents; i++ { + // Subtract index from hours so that the outputs are not all the same, + // otherwise the output hashes will be duplicated and the transaction + // will be invalid + spendHours := hours - uint64(i) + spendTx.PushOutput(toAddr, coins, spendHours) + } + + // Add change output, if necessary + if changeCoins != 0 { + spendTx.PushOutput(uxs[0].Body.Address, changeCoins, changeHours) + } + + // Sign the transaction + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + + return spendTx +} + +// makeSpendTxWithFee creates a txn specified with the extra number of hours to burn in addition to the minimum required burn +func makeSpendTxWithFee(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, fee uint64) coin.Transaction { + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, fee <= totalHours/2, "Fee must be <= half of total hours") + + spendHours := totalHours/2 - fee + + spendTx.PushOutput(toAddr, coins, spendHours) + if totalCoins != coins { + spendTx.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + } + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + return spendTx +} + +// makeSpendTxWithHoursBurned creates a txn specified with the total number of hours to burn +func makeSpendTxWithHoursBurned(t *testing.T, uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address, coins, hoursBurned uint64) coin.Transaction { // nolint: unparam + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + require.True(t, coins <= totalCoins) + require.True(t, hoursBurned <= totalHours, "hoursBurned must be <= totalHours") + + spendHours := totalHours - hoursBurned + + spendTx.PushOutput(toAddr, coins, spendHours) + if totalCoins != coins { + spendTx.PushOutput(uxs[0].Body.Address, totalCoins-coins, 0) + } + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + return spendTx +} + +func requireSoftViolation(t *testing.T, msg string, err error) { + require.Equal(t, NewErrTxnViolatesSoftConstraint(errors.New(msg)), err) +} + +func requireHardViolation(t *testing.T, msg string, err error) { + require.Equal(t, NewErrTxnViolatesHardConstraint(errors.New(msg)), err) +} + +func TestVerifyTransactionSoftHardConstraints(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + verifySingleTxnSoftHardConstraints := func(txn coin.Transaction, maxBlockSize int) error { + return db.View("", func(tx *dbutil.Tx) error { + return bc.VerifySingleTxnSoftHardConstraints(tx, txn, maxBlockSize) + }) + } + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + require.NoError(t, err) + + // Transaction size exceeds maxSize + err = verifySingleTxnSoftHardConstraints(txn, txn.Size()-1) + requireSoftViolation(t, "Transaction size bigger than max block size", err) + + // Invalid transaction fee + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + hours := uint64(0) + for _, ux := range uxs { + hours += ux.Body.Hours + } + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 0) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + requireSoftViolation(t, "Transaction has zero coinhour fee", err) + + // Invalid transaction fee, part 2 + txn = makeSpendTxWithHoursBurned(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins, 1) + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + requireSoftViolation(t, "Transaction coinhour fee minimum not met", err) + + // Transaction locking is tested by TestVerifyTransactionIsLocked + + // Test invalid header hash + originInnerHash := txn.InnerHash + txn.InnerHash = cipher.SHA256{} + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + requireHardViolation(t, "Invalid header hash", err) + + // Set back the originInnerHash + txn.InnerHash = originInnerHash + + // Create new block to spend the coins + var b *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + b, err = bc.NewBlock(tx, coin.Transactions{txn}, genTime+100) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + require.NotNil(t, b) + + // Add the block to blockchain + err = bc.db.Update("", func(tx *dbutil.Tx) error { + return bc.store.AddBlock(tx, &coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + }) + }) + require.NoError(t, err) + + // A UxOut does not exist, it was already spent + err = verifySingleTxnSoftHardConstraints(txn, DefaultMaxBlockSize) + expectedErr := NewErrTxnViolatesHardConstraint(blockdb.NewErrUnspentNotExist(txn.In[0].Hex())) + require.Equal(t, expectedErr, err) + + // Check invalid sig + uxs = coin.CreateUnspents(b.Head, txn) + _, key := cipher.GenerateKeyPair() + toAddr2 := testutil.MakeAddress() + tx2 := makeSpendTx(t, uxs, []cipher.SecKey{key, key}, toAddr2, 5e6) + err = verifySingleTxnSoftHardConstraints(tx2, DefaultMaxBlockSize) + requireHardViolation(t, "Signature not valid for output being spent", err) + + // Create lost coin transaction + uxs2 := coin.CreateUnspents(b.Head, txn) + toAddr3 := testutil.MakeAddress() + lostCoinTx := makeLostCoinTx(coin.UxArray{uxs2[1]}, []cipher.SecKey{genSecret}, toAddr3, 10e5) + err = verifySingleTxnSoftHardConstraints(lostCoinTx, DefaultMaxBlockSize) + requireHardViolation(t, "Transactions may not destroy coins", err) + + // Create transaction with duplicate UxOuts + uxs = coin.CreateUnspents(b.Head, txn) + toAddr4 := testutil.MakeAddress() + dupUxOutTx := makeDuplicateUxOutTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr4, 1e6) + err = verifySingleTxnSoftHardConstraints(dupUxOutTx, DefaultMaxBlockSize) + requireHardViolation(t, "Duplicate output in transaction", err) +} + +func TestVerifyTxnFeeCoinHoursAdditionFails(t *testing.T) { + // Test that VerifySingleTxnSoftConstraints fails if a uxIn.CoinHours() call fails. + // This is a separate test on its own, because it's not possible to reach the line + // that is being tested through the blockchain verify API wrappers + db, closeDB := prepareDB(t) + defer closeDB() + + err := CreateBuckets(db) + require.NoError(t, err) + + store, err := blockdb.NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc := &Blockchain{ + db: db, + store: store, + } + + gb := addGenesisBlockToBlockchain(t, bc) + + toAddr := testutil.MakeAddress() + coins := uint64(10e6) + + // create normal spending txn + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // Set the uxIn's hours high, so that uxIn.CoinHours() returns an error + uxIn[0].Body.Hours = math.MaxUint64 + _, coinHoursErr := uxIn[0].CoinHours(head.Time() + 1e6) + testutil.RequireError(t, coinHoursErr, "UxOut.CoinHours addition of earned coin hours overflow") + + // VerifySingleTxnSoftConstraints should fail on this, when trying to calculate the TransactionFee + err = VerifySingleTxnSoftConstraints(txn, head.Time()+1e6, uxIn, DefaultMaxBlockSize) + testutil.RequireError(t, err, NewErrTxnViolatesSoftConstraint(coinHoursErr).Error()) + + // VerifySingleTxnHardConstraints should fail on this, when performing the extra check of + // uxIn.CoinHours() errors, which is ignored by VerifyTransactionHoursSpending if the error + // is because of the earned hours addition overflow + head.Block.Head.Time += 1e6 + err = VerifySingleTxnHardConstraints(txn, head, uxIn) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(coinHoursErr).Error()) +} + +func TestVerifyTransactionIsLocked(t *testing.T) { + for _, addr := range GetLockedDistributionAddresses() { + t.Run(fmt.Sprintf("IsLocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, errors.New("Transaction has locked address inputs")) + }) + } +} + +func TestVerifyTransactionIsUnlocked(t *testing.T) { + for _, addr := range GetUnlockedDistributionAddresses() { + t.Run(fmt.Sprintf("IsUnlocked: %s", addr), func(t *testing.T) { + testVerifyTransactionAddressLocking(t, addr, nil) + }) + } +} + +func testVerifyTransactionAddressLocking(t *testing.T, toAddr string, expectedErr error) { + addr, err := cipher.DecodeBase58Address(toAddr) + require.NoError(t, err) + + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address + var coins = GenesisCoins + var hours uint64 = 1e6 + var fee uint64 = 5e8 + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + uxOut := ExecuteGenesisSpendTransaction(t, db, bc, txn) + + // Create a transaction that spends from the locked address + // The secret key for the locked address is obviously unavailable here, + // instead, forge an invalid transaction. + // Transaction.Verify() is called after TransactionIsLocked(), + // so for this test it doesn't matter if transaction signature is wrong + randomAddress := testutil.MakeAddress() + txn = coin.Transaction{ + In: []cipher.SHA256{uxOut.Hash()}, + Out: []coin.TransactionOutput{ + { + Address: randomAddress, + Coins: uxOut.Body.Coins, + Hours: uxOut.Body.Hours / 2, + }, + }, + } + + var uxIn coin.UxArray + var head *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + uxIn, err = bc.Unspent().GetArray(tx, txn.In) + require.NoError(t, err) + require.NotEmpty(t, uxIn) + + head, err = bc.Head(tx) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = VerifySingleTxnSoftConstraints(txn, head.Time(), uxIn, DefaultMaxBlockSize) + if expectedErr == nil { + require.NoError(t, err) + } else { + requireSoftViolation(t, expectedErr.Error(), err) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockchainer_mock_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockchainer_mock_test.go new file mode 100755 index 0000000..52e445c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockchainer_mock_test.go @@ -0,0 +1,413 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package visor + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + blockdb "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// BlockchainerMock mock +type BlockchainerMock struct { + mock.Mock +} + +func NewBlockchainerMock() *BlockchainerMock { + return &BlockchainerMock{} +} + +// ExecuteBlock mocked method +func (m *BlockchainerMock) ExecuteBlock(p0 *dbutil.Tx, p1 *coin.SignedBlock) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetBlocks mocked method +func (m *BlockchainerMock) GetBlocks(p0 *dbutil.Tx, p1 uint64, p2 uint64) ([]coin.SignedBlock, error) { + + ret := m.Called(p0, p1, p2) + + var r0 []coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case []coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetGenesisBlock mocked method +func (m *BlockchainerMock) GetGenesisBlock(p0 *dbutil.Tx) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetLastBlocks mocked method +func (m *BlockchainerMock) GetLastBlocks(p0 *dbutil.Tx, p1 uint64) ([]coin.SignedBlock, error) { + + ret := m.Called(p0, p1) + + var r0 []coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case []coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockByHash mocked method +func (m *BlockchainerMock) GetSignedBlockByHash(p0 *dbutil.Tx, p1 cipher.SHA256) (*coin.SignedBlock, error) { + + ret := m.Called(p0, p1) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetSignedBlockBySeq mocked method +func (m *BlockchainerMock) GetSignedBlockBySeq(p0 *dbutil.Tx, p1 uint64) (*coin.SignedBlock, error) { + + ret := m.Called(p0, p1) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Head mocked method +func (m *BlockchainerMock) Head(p0 *dbutil.Tx) (*coin.SignedBlock, error) { + + ret := m.Called(p0) + + var r0 *coin.SignedBlock + switch res := ret.Get(0).(type) { + case nil: + case *coin.SignedBlock: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// HeadSeq mocked method +func (m *BlockchainerMock) HeadSeq(p0 *dbutil.Tx) (uint64, bool, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// Len mocked method +func (m *BlockchainerMock) Len(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// NewBlock mocked method +func (m *BlockchainerMock) NewBlock(p0 *dbutil.Tx, p1 coin.Transactions, p2 uint64) (*coin.Block, error) { + + ret := m.Called(p0, p1, p2) + + var r0 *coin.Block + switch res := ret.Get(0).(type) { + case nil: + case *coin.Block: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Time mocked method +func (m *BlockchainerMock) Time(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// TransactionFee mocked method +func (m *BlockchainerMock) TransactionFee(p0 *dbutil.Tx, p1 uint64) coin.FeeCalculator { + + ret := m.Called(p0, p1) + + var r0 coin.FeeCalculator + switch res := ret.Get(0).(type) { + case nil: + case coin.FeeCalculator: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// Unspent mocked method +func (m *BlockchainerMock) Unspent() blockdb.UnspentPooler { + + ret := m.Called() + + var r0 blockdb.UnspentPooler + switch res := ret.Get(0).(type) { + case nil: + case blockdb.UnspentPooler: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// VerifyBlockTxnConstraints mocked method +func (m *BlockchainerMock) VerifyBlockTxnConstraints(p0 *dbutil.Tx, p1 coin.Transaction) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// VerifySingleTxnSoftHardConstraints mocked method +func (m *BlockchainerMock) VerifySingleTxnSoftHardConstraints(p0 *dbutil.Tx, p1 coin.Transaction, p2 int) error { + + ret := m.Called(p0, p1, p2) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// VerifySingleTxnHardConstraints mocked method +func (m *BlockchainerMock) VerifySingleTxnHardConstraints(p0 *dbutil.Tx, p1 coin.Transaction) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go new file mode 100755 index 0000000..6397126 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree.go @@ -0,0 +1,243 @@ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + emptyHash cipher.SHA256 + errBlockExist = errors.New("block already exists") + errNoParent = errors.New("block is not genesis and has no parent") + errWrongParent = errors.New("wrong parent") + errHasChild = errors.New("remove block failed, it has children") + + // BlocksBkt holds coin.Blocks + BlocksBkt = []byte("blocks") + // TreeBkt maps block height to a (prev, hash) pair for a block + TreeBkt = []byte("block_tree") +) + +// Walker function for go through blockchain +type Walker func(*dbutil.Tx, []coin.HashPair) (cipher.SHA256, bool) + +// blockTree use the blockdb store all blocks and maintains the block tree struct. +type blockTree struct{} + +// AddBlock adds block with *dbutil.Tx +func (bt *blockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + // can't store block if it's not genesis block and has no parent. + if b.Seq() > 0 && b.PreHashHeader() == emptyHash { + return errNoParent + } + + // check if the block already exist. + hash := b.HashHeader() + if ok, err := dbutil.BucketHasKey(tx, BlocksBkt, hash[:]); err != nil { + return err + } else if ok { + return errBlockExist + } + + // write block into blocks bucket. + if err := dbutil.PutBucketValue(tx, BlocksBkt, hash[:], encoder.Serialize(b)); err != nil { + return err + } + + // the pre hash must be in depth - 1. + if b.Seq() > 0 { + preHash := b.PreHashHeader() + parentHashPair, err := getHashPairInDepth(tx, b.Seq()-1, func(hp coin.HashPair) bool { + return hp.Hash == preHash + }) + if err != nil { + return err + } + if len(parentHashPair) == 0 { + return errWrongParent + } + } + + hp := coin.HashPair{ + Hash: hash, + PreHash: b.Head.PrevHash, + } + + // get block pairs in the depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + if len(hashPairs) == 0 { + // no hash pair exist in the depth. + // write the hash pair into tree. + return setHashPairInDepth(tx, b.Seq(), []coin.HashPair{hp}) + } + + // check dup block + if containHash(hashPairs, hp) { + return errBlockExist + } + + hashPairs = append(hashPairs, hp) + return setHashPairInDepth(tx, b.Seq(), hashPairs) +} + +// RemoveBlock remove block from blocks bucket and tree bucket. +// can't remove block if it has children. +func (bt *blockTree) RemoveBlock(tx *dbutil.Tx, b *coin.Block) error { + // delete block in blocks bucket. + hash := b.HashHeader() + if err := dbutil.Delete(tx, BlocksBkt, hash[:]); err != nil { + return err + } + + // check if this block has children + if has, err := hasChild(tx, *b); err != nil { + return err + } else if has { + return errHasChild + } + + // get block hash pairs in depth + hashPairs, err := getHashPairInDepth(tx, b.Seq(), allPairs) + if err != nil { + return err + } + + // remove block hash pair in tree. + ps := removePairs(hashPairs, coin.HashPair{ + Hash: hash, + PreHash: b.PreHashHeader(), + }) + + if len(ps) == 0 { + return dbutil.Delete(tx, TreeBkt, dbutil.Itob(b.Seq())) + } + + // update the hash pairs in tree. + return setHashPairInDepth(tx, b.Seq(), ps) +} + +// GetBlock get block by hash, return nil on not found +func (bt *blockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + var b coin.Block + + if ok, err := dbutil.GetBucketObjectDecoded(tx, BlocksBkt, hash[:], &b); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + if hash != b.HashHeader() { + return nil, fmt.Errorf("DB key %s does not match block hash header %s", hash, b.HashHeader()) + } + + return &b, nil +} + +// GetBlockInDepth get block in depth, return nil on not found, +// the filter is used to choose the appropriate block. +func (bt *blockTree) GetBlockInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (*coin.Block, error) { + hash, ok, err := bt.getHashInDepth(tx, depth, filter) + if err != nil { + return nil, fmt.Errorf("BlockTree.getHashInDepth failed: %v", err) + } else if !ok { + return nil, nil + } + + return bt.GetBlock(tx, hash) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bt *blockTree) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return dbutil.ForEach(tx, BlocksBkt, func(_, v []byte) error { + var b coin.Block + if err := encoder.DeserializeRaw(v, &b); err != nil { + return err + } + + return f(&b) + }) +} + +func (bt *blockTree) getHashInDepth(tx *dbutil.Tx, depth uint64, filter Walker) (cipher.SHA256, bool, error) { + var pairs []coin.HashPair + if ok, err := dbutil.GetBucketObjectDecoded(tx, TreeBkt, dbutil.Itob(depth), &pairs); err != nil { + return cipher.SHA256{}, false, err + } else if !ok { + return cipher.SHA256{}, false, nil + } + + hash, ok := filter(tx, pairs) + if !ok { + return cipher.SHA256{}, false, errors.New("No hash found in depth") + } + + return hash, true, nil +} + +func containHash(hashPairs []coin.HashPair, pair coin.HashPair) bool { + for _, p := range hashPairs { + if p.Hash == pair.Hash { + return true + } + } + return false +} + +func removePairs(hps []coin.HashPair, pair coin.HashPair) []coin.HashPair { + pairs := []coin.HashPair{} + for _, p := range hps { + if p.Hash == pair.Hash && p.PreHash == pair.PreHash { + continue + } + pairs = append(pairs, p) + } + return pairs +} + +func getHashPairInDepth(tx *dbutil.Tx, dep uint64, fn func(hp coin.HashPair) bool) ([]coin.HashPair, error) { + var hps []coin.HashPair + if ok, err := dbutil.GetBucketObjectDecoded(tx, TreeBkt, dbutil.Itob(dep), &hps); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + var pairs []coin.HashPair + for _, ps := range hps { + if fn(ps) { + pairs = append(pairs, ps) + } + } + return pairs, nil +} + +// check if this block has children +func hasChild(tx *dbutil.Tx, b coin.Block) (bool, error) { + // get the child block hash pair, whose pre hash point to current block. + childHashPair, err := getHashPairInDepth(tx, b.Head.BkSeq+1, func(hp coin.HashPair) bool { + return hp.PreHash == b.HashHeader() + }) + + if err != nil { + return false, err + } + + return len(childHashPair) > 0, nil +} + +func setHashPairInDepth(tx *dbutil.Tx, dep uint64, hps []coin.HashPair) error { + return dbutil.PutBucketValue(tx, TreeBkt, dbutil.Itob(dep), encoder.Serialize(hps)) +} + +func allPairs(hp coin.HashPair) bool { + return true +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree_test.go new file mode 100755 index 0000000..8e93227 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/block_tree_test.go @@ -0,0 +1,228 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +type blockInfo struct { + Seq uint64 + Time uint64 + Fee uint64 + Pre int +} + +type blockCase struct { + BInfo blockInfo + Err error + Action string +} + +func testCase(t *testing.T, cases []blockCase) { + db, close := prepareDB(t) + defer close() + + btree := &blockTree{} + blocks := make([]coin.Block, len(cases)) + for i, d := range cases { + var preHash cipher.SHA256 + if d.BInfo.Pre != -1 { + preHash = blocks[d.BInfo.Pre].HashHeader() + } + + b := coin.Block{ + Head: coin.BlockHeader{ + BkSeq: d.BInfo.Seq, + Time: d.BInfo.Time, + Fee: d.BInfo.Fee, + PrevHash: preHash, + }, + } + blocks[i] = b + + err := db.Update("", func(tx *dbutil.Tx) error { + switch d.Action { + case "add": + err := btree.AddBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Equal(t, b, *b1) + } + case "remove": + err := btree.RemoveBlock(tx, &b) + require.Equal(t, d.Err, err, "expect err:%v, but get err:%v", d.Err, err) + if err == nil { + b1, err := btree.GetBlock(tx, b.HashHeader()) + require.NoError(t, err) + require.Nil(t, b1) + } + } + + return nil + }) + + require.NoError(t, err) + } +} + +func TestAddBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 0, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 1}, + Err: errBlockExist, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 2, Time: 2, Fee: 0, Pre: 0}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 4, Time: 2, Fee: 0, Pre: 3}, + Err: errWrongParent, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 3, Time: 2, Fee: 0, Pre: -1}, + Err: errNoParent, + Action: "add", + }, + } + + testCase(t, testData) +} + +func TestRemoveBlock(t *testing.T) { + testData := []blockCase{ + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "add", + }, + // remove block normally. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 2, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + // remove genesis block, which has children. + blockCase{ + BInfo: blockInfo{Seq: 0, Time: 0, Fee: 0, Pre: -1}, + Err: errHasChild, + Action: "remove", + }, + // remove the last block in depth 1. + blockCase{ + BInfo: blockInfo{Seq: 1, Time: 1, Fee: 0, Pre: 0}, + Err: nil, + Action: "remove", + }, + } + + testCase(t, testData) +} + +func TestGetBlockInDepth(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := &blockTree{} + blocks := []coin.Block{ + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 0, + Time: 0, + Fee: 0, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 1, + }, + }, + coin.Block{ + Head: coin.BlockHeader{ + BkSeq: 1, + Time: 2, + }, + }, + } + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &blocks[0]) + require.NoError(t, err) + + blocks[1].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[1]) + require.NoError(t, err) + + blocks[2].Head.PrevHash = blocks[0].HashHeader() + err = bc.AddBlock(tx, &blocks[2]) + require.NoError(t, err) + + return nil + }) + + require.NoError(t, err) + + var block *coin.Block + err = db.View("", func(tx *dbutil.Tx) error { + var err error + block, err = bc.GetBlockInDepth(tx, 1, func(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + for _, hp := range hps { + b, err := bc.GetBlock(tx, hp.Hash) + require.NoError(t, err) + if b.Time() == 2 { + return b.HashHeader(), true + } + } + return cipher.SHA256{}, false + }) + require.NoError(t, err) + return err + }) + + require.NoError(t, err) + + require.NotNil(t, block) + require.Equal(t, blocks[2], *block) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go new file mode 100755 index 0000000..13f6a72 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain.go @@ -0,0 +1,258 @@ +package blockdb + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + logger = logging.MustGetLogger("blockdb") + + // ErrNoHeadBlock is returned when calling Blockchain.Head() when no head block exists + ErrNoHeadBlock = fmt.Errorf("found no head block") +) + +// ErrMissingSignature is returned if a block in the db does not have a corresponding signature in the db +type ErrMissingSignature struct { + b *coin.Block +} + +// NewErrMissingSignature creates ErrMissingSignature from *coin.Block +func NewErrMissingSignature(b *coin.Block) error { + return ErrMissingSignature{ + b: b, + } +} + +func (e ErrMissingSignature) Error() string { + return fmt.Sprintf("Signature not found for block seq=%d hash=%s", e.b.Head.BkSeq, e.b.HashHeader().Hex()) +} + +// CreateBuckets creates bolt.DB buckets used by the blockdb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + BlockSigsBkt, + BlocksBkt, + TreeBkt, + BlockchainMetaBkt, + UnspentPoolBkt, + UnspentPoolAddrIndexBkt, + UnspentMetaBkt, + }) +} + +// BlockTree block storage +type BlockTree interface { + AddBlock(*dbutil.Tx, *coin.Block) error + GetBlock(*dbutil.Tx, cipher.SHA256) (*coin.Block, error) + GetBlockInDepth(*dbutil.Tx, uint64, Walker) (*coin.Block, error) + ForEachBlock(*dbutil.Tx, func(*coin.Block) error) error +} + +// BlockSigs block signature storage +type BlockSigs interface { + Add(*dbutil.Tx, cipher.SHA256, cipher.Sig) error + Get(*dbutil.Tx, cipher.SHA256) (cipher.Sig, bool, error) + ForEach(*dbutil.Tx, func(cipher.SHA256, cipher.Sig) error) error +} + +// UnspentPooler unspent outputs pool +type UnspentPooler interface { + MaybeBuildIndexes(*dbutil.Tx, uint64) error + Len(*dbutil.Tx) (uint64, error) + Contains(*dbutil.Tx, cipher.SHA256) (bool, error) + Get(*dbutil.Tx, cipher.SHA256) (*coin.UxOut, error) + GetAll(*dbutil.Tx) (coin.UxArray, error) + GetArray(*dbutil.Tx, []cipher.SHA256) (coin.UxArray, error) + GetUxHash(*dbutil.Tx) (cipher.SHA256, error) + GetUnspentsOfAddrs(*dbutil.Tx, []cipher.Address) (coin.AddressUxOuts, error) + ProcessBlock(*dbutil.Tx, *coin.SignedBlock) error + AddressCount(*dbutil.Tx) (uint64, error) +} + +// ChainMeta blockchain metadata +type ChainMeta interface { + GetHeadSeq(*dbutil.Tx) (uint64, bool, error) + SetHeadSeq(*dbutil.Tx, uint64) error +} + +// Blockchain maintain the buckets for blockchain +type Blockchain struct { + db *dbutil.DB + meta ChainMeta + unspent UnspentPooler + tree BlockTree + sigs BlockSigs + walker Walker +} + +// NewBlockchain creates a new blockchain instance +func NewBlockchain(db *dbutil.DB, walker Walker) (*Blockchain, error) { + if db == nil { + return nil, errors.New("db is nil") + } + + if walker == nil { + return nil, errors.New("blockchain walker is nil") + } + + return &Blockchain{ + db: db, + unspent: NewUnspentPool(), + meta: &chainMeta{}, + tree: &blockTree{}, + sigs: &blockSigs{}, + walker: walker, + }, nil +} + +// UnspentPool returns the unspent pool +func (bc *Blockchain) UnspentPool() UnspentPooler { + return bc.unspent +} + +// AddBlock adds signed block +func (bc *Blockchain) AddBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error { + if err := bc.sigs.Add(tx, sb.HashHeader(), sb.Sig); err != nil { + return fmt.Errorf("save signature failed: %v", err) + } + + if err := bc.tree.AddBlock(tx, &sb.Block); err != nil { + return fmt.Errorf("save block failed: %v", err) + } + + // update block head seq and unspent pool + if err := bc.processBlock(tx, sb); err != nil { + return err + } + + return nil +} + +// processBlock processes a block and updates the db +func (bc *Blockchain) processBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if err := bc.unspent.ProcessBlock(tx, b); err != nil { + return err + } + + return bc.meta.SetHeadSeq(tx, b.Seq()) +} + +// Head returns head block, returns error if no head block exists +func (bc *Blockchain) Head(tx *dbutil.Tx) (*coin.SignedBlock, error) { + seq, ok, err := bc.HeadSeq(tx) + if err != nil { + return nil, err + } else if !ok { + return nil, ErrNoHeadBlock + } + + b, err := bc.GetSignedBlockBySeq(tx, seq) + if err != nil { + return nil, err + } + + if b == nil { + return nil, ErrNoHeadBlock + } + + return b, nil +} + +// HeadSeq returns the head block sequence +func (bc *Blockchain) HeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + return bc.meta.GetHeadSeq(tx) +} + +// Len returns blockchain length +func (bc *Blockchain) Len(tx *dbutil.Tx) (uint64, error) { + seq, ok, err := bc.meta.GetHeadSeq(tx) + if err != nil { + return 0, err + } else if !ok { + return 0, nil + } + + return seq + 1, nil +} + +// GetBlockSignature returns the signature of a block +func (bc *Blockchain) GetBlockSignature(tx *dbutil.Tx, b *coin.Block) (cipher.Sig, bool, error) { + return bc.sigs.Get(tx, b.HashHeader()) +} + +// GetBlockByHash returns block of given hash +func (bc *Blockchain) GetBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + + return b, nil +} + +// GetSignedBlockByHash returns signed block of given hash +func (bc *Blockchain) GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlock(tx, hash) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + // get signature + sig, ok, err := bc.sigs.Get(tx, hash) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", hash.Hex(), err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetSignedBlockBySeq returns signed block of given seq +func (bc *Blockchain) GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) { + b, err := bc.tree.GetBlockInDepth(tx, seq, bc.walker) + if err != nil { + return nil, fmt.Errorf("bc.tree.GetBlockInDepth failed: %v", err) + } + if b == nil { + return nil, nil + } + + sig, ok, err := bc.sigs.Get(tx, b.HashHeader()) + if err != nil { + return nil, fmt.Errorf("find signature of block: %v failed: %v", seq, err) + } + + if !ok { + return nil, NewErrMissingSignature(b) + } + + return &coin.SignedBlock{ + Block: *b, + Sig: sig, + }, nil +} + +// GetGenesisBlock returns genesis block +func (bc *Blockchain) GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) { + return bc.GetSignedBlockBySeq(tx, 0) +} + +// ForEachBlock iterates all blocks and calls f on them +func (bc *Blockchain) ForEachBlock(tx *dbutil.Tx, f func(b *coin.Block) error) error { + return bc.tree.ForEachBlock(tx, f) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain_test.go new file mode 100755 index 0000000..d115a35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blockchain_test.go @@ -0,0 +1,602 @@ +package blockdb + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) + + genTime uint64 = 1000 + genCoinHours uint64 = 1000 * 1000 +) + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +type fakeStorage struct { + tree *fakeBlockTree + sigs *fakeSignatureStore + unspent *fakeUnspentPool + chainMeta *fakeChainMeta +} + +func newFakeStorage() *fakeStorage { + var failedWhenSaved bool + return &fakeStorage{ + tree: newFakeBlockTree(&failedWhenSaved), + sigs: newFakeSigStore(&failedWhenSaved), + unspent: newFakeUnspentPool(&failedWhenSaved), + chainMeta: newFakeChainMeta(), + } +} + +type fakeBlockTree struct { + blocks map[string]*coin.Block + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeBlockTree(failedWhenSaved *bool) *fakeBlockTree { + return &fakeBlockTree{ + blocks: make(map[string]*coin.Block), + failedWhenSaved: failedWhenSaved, + } +} + +func (bt *fakeBlockTree) AddBlock(tx *dbutil.Tx, b *coin.Block) error { + if bt.saveFailed { + if bt.failedWhenSaved != nil { + *bt.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + bt.blocks[b.HashHeader().Hex()] = b + return nil +} + +func (bt *fakeBlockTree) GetBlock(tx *dbutil.Tx, hash cipher.SHA256) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + return bt.blocks[hash.Hex()], nil +} + +func (bt *fakeBlockTree) GetBlockInDepth(tx *dbutil.Tx, dep uint64, filter Walker) (*coin.Block, error) { + if bt.failedWhenSaved != nil && *bt.failedWhenSaved { + return nil, nil + } + + for _, b := range bt.blocks { + if b.Head.BkSeq == dep { + return b, nil + } + } + + return nil, nil +} + +func (bt *fakeBlockTree) ForEachBlock(tx *dbutil.Tx, f func(*coin.Block) error) error { + return nil +} + +type fakeSignatureStore struct { + sigs map[string]cipher.Sig + saveFailed bool + getSigErr error + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeSigStore(failedWhenSaved *bool) *fakeSignatureStore { + return &fakeSignatureStore{ + sigs: make(map[string]cipher.Sig), + failedWhenSaved: failedWhenSaved, + } +} + +func (ss *fakeSignatureStore) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + if ss.saveFailed { + if ss.failedWhenSaved != nil { + *ss.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + + ss.sigs[hash.Hex()] = sig + return nil +} + +func (ss *fakeSignatureStore) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + if ss.failedWhenSaved != nil && *ss.failedWhenSaved { + return cipher.Sig{}, false, nil + } + + if ss.getSigErr != nil { + return cipher.Sig{}, false, ss.getSigErr + } + + sig, ok := ss.sigs[hash.Hex()] + return sig, ok, nil +} + +func (ss *fakeSignatureStore) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return nil +} + +type fakeUnspentPool struct { + outs map[cipher.SHA256]coin.UxOut + uxHash cipher.SHA256 + saveFailed bool + + // state tracking: do not configure directly + // set to true if saveFailed was true and certain operations were performed + failedWhenSaved *bool +} + +func newFakeUnspentPool(failedWhenSaved *bool) *fakeUnspentPool { + return &fakeUnspentPool{ + outs: make(map[cipher.SHA256]coin.UxOut), + failedWhenSaved: failedWhenSaved, + } +} + +func (fup *fakeUnspentPool) MaybeBuildIndexes(tx *dbutil.Tx, height uint64) error { + return nil +} + +func (fup *fakeUnspentPool) Len(tx *dbutil.Tx) (uint64, error) { + return uint64(len(fup.outs)), nil +} + +func (fup *fakeUnspentPool) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + out, ok := fup.outs[h] + if !ok { + return nil, nil + } + return &out, nil +} + +func (fup *fakeUnspentPool) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(fup.outs)) + for _, out := range fup.outs { + outs = append(outs, out) + } + + return outs, nil +} + +func (fup *fakeUnspentPool) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + outs := make(coin.UxArray, 0, len(hashes)) + for _, h := range hashes { + ux, ok := fup.outs[h] + if !ok { + return nil, fmt.Errorf("unspent output of %s does not exist", h.Hex()) + } + + outs = append(outs, ux) + } + return outs, nil +} + +func (fup *fakeUnspentPool) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return fup.uxHash, nil +} + +func (fup *fakeUnspentPool) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, a := range addrs { + addrm[a] = struct{}{} + } + + addrOutMap := make(coin.AddressUxOuts) + for _, out := range fup.outs { + addr := out.Body.Address + addrOutMap[addr] = append(addrOutMap[addr], out) + } + + return addrOutMap, nil +} + +func (fup *fakeUnspentPool) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + if fup.saveFailed { + if fup.failedWhenSaved != nil { + *fup.failedWhenSaved = true + } + return errors.New("intentionally failed") + } + return nil +} + +func (fup *fakeUnspentPool) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + _, ok := fup.outs[h] + return ok, nil +} + +func (fup *fakeUnspentPool) AddressCount(tx *dbutil.Tx) (uint64, error) { + addrs := make(map[cipher.Address]struct{}) + for _, out := range fup.outs { + addrs[out.Body.Address] = struct{}{} + } + + return uint64(len(addrs)), nil +} + +type fakeChainMeta struct { + headSeq uint64 + didSetSeq bool +} + +func newFakeChainMeta() *fakeChainMeta { + return &fakeChainMeta{} +} + +func (fcm *fakeChainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + if !fcm.didSetSeq { + return 0, false, nil + } + + return fcm.headSeq, true, nil +} + +func (fcm *fakeChainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + fcm.headSeq = seq + fcm.didSetSeq = true + return nil +} + +func DefaultWalker(tx *dbutil.Tx, hps []coin.HashPair) (cipher.SHA256, bool) { + return hps[0].Hash, true +} + +func makeGenesisBlock(t *testing.T) coin.SignedBlock { + gb, err := coin.NewGenesisBlock(genAddress, genCoinHours, genTime) + require.NoError(t, err) + + sig := cipher.SignHash(gb.HashHeader(), genSecret) + return coin.SignedBlock{ + Block: *gb, + Sig: sig, + } +} + +func TestBlockchainAddBlockWithTx(t *testing.T) { + type expect struct { + err error + sigSaved bool + blockSaved bool + headSeq uint64 + } + + type failedSaves struct { + tree bool + sigs bool + unspent bool + } + + tt := []struct { + name string + fakeStorage *fakeStorage + failedSaves failedSaves + expect expect + }{ + { + "ok", + newFakeStorage(), + failedSaves{}, + expect{ + nil, + true, + true, + uint64(0), + }, + }, + { + "save sig failed", + newFakeStorage(), + failedSaves{ + sigs: true, + }, + expect{ + errors.New("save signature failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "save block failed", + newFakeStorage(), + failedSaves{ + tree: true, + }, + expect{ + errors.New("save block failed: intentionally failed"), + false, + false, + uint64(0), + }, + }, + { + "unspent process block failed", + newFakeStorage(), + failedSaves{ + unspent: true, + }, + expect{ + errors.New("intentionally failed"), + false, + false, + uint64(0), + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + tc.fakeStorage.tree.saveFailed = tc.failedSaves.tree + tc.fakeStorage.sigs.saveFailed = tc.failedSaves.sigs + tc.fakeStorage.unspent.saveFailed = tc.failedSaves.unspent + + bc := &Blockchain{ + db: db, + unspent: tc.fakeStorage.unspent, + meta: tc.fakeStorage.chainMeta, + tree: tc.fakeStorage.tree, + sigs: tc.fakeStorage.sigs, + walker: DefaultWalker, + } + + gb := makeGenesisBlock(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.Equal(t, tc.expect.err, err) + return nil + }) + require.NoError(t, err) + + // check sig + err = db.View("", func(tx *dbutil.Tx) error { + _, ok, err := tc.fakeStorage.sigs.Get(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.sigSaved, ok) + + // check block in tree + b, err := tc.fakeStorage.tree.GetBlock(tx, gb.HashHeader()) + require.NoError(t, err) + require.Equal(t, tc.expect.blockSaved, b != nil) + + // check head seq + headSeq, ok, err := bc.HeadSeq(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.True(t, ok) + require.Equal(t, tc.expect.headSeq, headSeq) + } else { + require.False(t, ok) + } + + // check len + length, err := bc.Len(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.Equal(t, uint64(1), length) + } else { + require.Equal(t, uint64(0), length) + } + + // check genesis block + genesisBlock, err := bc.GetGenesisBlock(tx) + require.NoError(t, err) + + if tc.expect.err == nil { + require.NotNil(t, genesisBlock) + require.Equal(t, gb, *genesisBlock) + } else { + require.Nil(t, genesisBlock) + } + + return nil + }) + require.NoError(t, err) + }) + } + +} + +func TestBlockchainHead(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = bc.Head(tx) + require.Equal(t, err, ErrNoHeadBlock) + + gb := makeGenesisBlock(t) + + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + + b, err := bc.Head(tx) + require.NoError(t, err) + require.Equal(t, gb.HashHeader().Hex(), b.HashHeader().Hex()) + + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainLen(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + gb := makeGenesisBlock(t) + err = db.Update("", func(tx *dbutil.Tx) error { + err := bc.AddBlock(tx, &gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) +} + +func TestBlockchainGetBlockByHash(t *testing.T) { + gb := makeGenesisBlock(t) + + type expect struct { + err error + b *coin.SignedBlock + } + + tt := []struct { + name string + tree BlockTree + sigs BlockSigs + hash cipher.SHA256 + expect expect + }{ + { + "ok", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{ + gb.HashHeader().Hex(): gb.Sig, + }, + }, + gb.HashHeader(), + expect{ + nil, + &gb, + }, + }, + { + "block not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{}, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + nil, + nil, + }, + }, + { + "signature not exist", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + NewErrMissingSignature(&gb.Block), + nil, + }, + }, + { + "get signature error", + &fakeBlockTree{ + blocks: map[string]*coin.Block{ + gb.HashHeader().Hex(): &gb.Block, + }, + }, + &fakeSignatureStore{ + getSigErr: errors.New("intentional error"), + sigs: map[string]cipher.Sig{}, + }, + gb.HashHeader(), + expect{ + fmt.Errorf("find signature of block: %v failed: intentional error", gb.HashHeader().Hex()), + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + bc, err := NewBlockchain(db, DefaultWalker) + require.NoError(t, err) + + bc.tree = tc.tree + bc.sigs = tc.sigs + + err = db.View("", func(tx *dbutil.Tx) error { + b, err := bc.GetSignedBlockByHash(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.b, b) + return nil + }) + require.NoError(t, err) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go new file mode 100755 index 0000000..502d9e1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs.go @@ -0,0 +1,59 @@ +package blockdb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockSigsBkt holds block signatures + BlockSigsBkt = []byte("block_sigs") +) + +// blockSigs manages known blockSigs as received. +// TODO -- support out of order blocks. This requires a change to the +// message protocol to support ranges similar to bitcoin's locator hashes. +// We also need to keep track of whether a block has been executed so that +// as continuity is established we can execute chains of blocks. +// TODO -- Since we will need to hold blocks that cannot be verified +// immediately against the blockchain, we need to be able to hold multiple +// blockSigs per BkSeq, or use hashes as keys. For now, this is not a +// problem assuming the signed blocks created from master are valid blocks, +// because we can check the signature independently of the blockchain. +type blockSigs struct{} + +// Get returns the signature of a specific block +func (bs blockSigs) Get(tx *dbutil.Tx, hash cipher.SHA256) (cipher.Sig, bool, error) { + var sig cipher.Sig + + if ok, err := dbutil.GetBucketObjectDecoded(tx, BlockSigsBkt, hash[:], &sig); err != nil { + return cipher.Sig{}, false, err + } else if !ok { + return cipher.Sig{}, false, nil + } + + return sig, true, nil +} + +// Add adds a signed block to the db +func (bs *blockSigs) Add(tx *dbutil.Tx, hash cipher.SHA256, sig cipher.Sig) error { + return dbutil.PutBucketValue(tx, BlockSigsBkt, hash[:], encoder.Serialize(sig)) +} + +// ForEach iterates all signatures and calls f on them +func (bs *blockSigs) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, cipher.Sig) error) error { + return dbutil.ForEach(tx, BlockSigsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var sig cipher.Sig + if err := encoder.DeserializeRaw(v, &sig); err != nil { + return err + } + + return f(hash, sig) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs_test.go new file mode 100755 index 0000000..09f7112 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/blocksigs_test.go @@ -0,0 +1,127 @@ +package blockdb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func TestBlockSigsGet(t *testing.T) { + type hashSig struct { + hash cipher.SHA256 + sig cipher.Sig + } + + type expect struct { + exist bool + sig cipher.Sig + err error + } + + hashSigs := []hashSig{} + for i := 0; i < 5; i++ { + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + + sig := cipher.SignHash(h, s) + hashSigs = append(hashSigs, hashSig{ + hash: h, + sig: sig, + }) + } + + tt := []struct { + name string + init []hashSig + hash cipher.SHA256 + expect expect + }{ + { + "ok", + hashSigs[:], + hashSigs[0].hash, + expect{ + true, + hashSigs[0].sig, + nil, + }, + }, + { + "not exist", + hashSigs[1:], + hashSigs[0].hash, + expect{ + false, + cipher.Sig{}, + nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + // init db + err := db.Update("", func(tx *dbutil.Tx) error { + bkt, err := tx.CreateBucketIfNotExists(BlockSigsBkt) + require.NoError(t, err) + for _, hs := range tc.init { + err = bkt.Put(hs.hash[:], encoder.Serialize(hs.sig)) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + sigs := &blockSigs{} + + err = db.View("", func(tx *dbutil.Tx) error { + sg, ok, err := sigs.Get(tx, tc.hash) + require.Equal(t, tc.expect.err, err) + require.Equal(t, tc.expect.exist, ok) + if ok { + require.Equal(t, tc.expect.sig, sg) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestBlockSigsAddWithTx(t *testing.T) { + db, closeDB := prepareDB(t) + defer closeDB() + + _, s := cipher.GenerateKeyPair() + h := testutil.RandSHA256(t) + sig := cipher.SignHash(h, s) + + sigs := &blockSigs{} + + err := db.Update("", func(tx *dbutil.Tx) error { + return sigs.Add(tx, h, sig) + }) + require.NoError(t, err) + + // check the db + err = db.View("", func(tx *dbutil.Tx) error { + bkt := tx.Bucket(BlockSigsBkt) + v := bkt.Get(h[:]) + require.NotNil(t, v) + var s cipher.Sig + err := encoder.DeserializeRaw(v, &s) + require.NoError(t, err) + require.Equal(t, sig, s) + return nil + }) + require.NoError(t, err) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go new file mode 100755 index 0000000..fdfaf33 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/chain_meta.go @@ -0,0 +1,29 @@ +package blockdb + +import ( + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // BlockchainMetaBkt holds blockchain metadata + BlockchainMetaBkt = []byte("blockchain_meta") + // blockchain head sequence number + headSeqKey = []byte("head_seq") +) + +type chainMeta struct{} + +func (m chainMeta) SetHeadSeq(tx *dbutil.Tx, seq uint64) error { + return dbutil.PutBucketValue(tx, BlockchainMetaBkt, headSeqKey, dbutil.Itob(seq)) +} + +func (m chainMeta) GetHeadSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, BlockchainMetaBkt, headSeqKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db new file mode 100755 index 0000000..dcd9ede Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/testdata/blockchain-180.no-unspent-addr-index.db differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go new file mode 100755 index 0000000..a3a316d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent.go @@ -0,0 +1,484 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + xorhashKey = []byte("xorhash") + addrIndexHeightKey = []byte("addr_index_height") + + // UnspentPoolBkt holds unspent outputs, indexed by unspent output hash + UnspentPoolBkt = []byte("unspent_pool") + // UnspentPoolAddrIndexBkt maps addresses to their unspent outputs + UnspentPoolAddrIndexBkt = []byte("unspent_pool_addr_index") + // UnspentMetaBkt holds unspent output metadata + UnspentMetaBkt = []byte("unspent_meta") +) + +// ErrUnspentNotExist is returned if an unspent is not found in the pool +type ErrUnspentNotExist struct { + UxID string +} + +// NewErrUnspentNotExist creates ErrUnspentNotExist from a UxID +func NewErrUnspentNotExist(uxID string) error { + return ErrUnspentNotExist{ + UxID: uxID, + } +} + +func (e ErrUnspentNotExist) Error() string { + return fmt.Sprintf("unspent output of %s does not exist", e.UxID) +} + +type unspentMeta struct{} + +func (m unspentMeta) getXorHash(tx *dbutil.Tx) (cipher.SHA256, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, xorhashKey) + if err != nil { + return cipher.SHA256{}, err + } else if v == nil { + return cipher.SHA256{}, nil + } + + return cipher.SHA256FromBytes(v) +} + +func (m *unspentMeta) setXorHash(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, xorhashKey, hash[:]) +} + +func (m *unspentMeta) getAddrIndexHeight(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +func (m *unspentMeta) setAddrIndexHeight(tx *dbutil.Tx, height uint64) error { + return dbutil.PutBucketValue(tx, UnspentMetaBkt, addrIndexHeightKey, dbutil.Itob(height)) +} + +type pool struct{} + +func (pl pool) get(tx *dbutil.Tx, hash cipher.SHA256) (*coin.UxOut, error) { + var out coin.UxOut + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnspentPoolBkt, hash[:], &out); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return &out, nil +} + +func (pl pool) getAll(tx *dbutil.Tx) (coin.UxArray, error) { + var uxa coin.UxArray + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(_, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRaw(v, &ux); err != nil { + return err + } + + uxa = append(uxa, ux) + return nil + }); err != nil { + return nil, err + } + + return uxa, nil +} + +func (pl pool) set(tx *dbutil.Tx, hash cipher.SHA256, ux coin.UxOut) error { + return dbutil.PutBucketValue(tx, UnspentPoolBkt, hash[:], encoder.Serialize(ux)) +} + +func (pl *pool) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnspentPoolBkt, hash[:]) +} + +type poolAddrIndex struct{} + +func (p poolAddrIndex) get(tx *dbutil.Tx, addr cipher.Address) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), &hashes); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return hashes, nil +} + +func (p poolAddrIndex) set(tx *dbutil.Tx, addr cipher.Address, hashes []cipher.SHA256) error { + if len(hashes) == 0 { + return errors.New("poolAddrIndex.set cannot set to empty hash array") + } + + hashesMap := make(map[cipher.SHA256]struct{}, len(hashes)) + for _, h := range hashes { + if _, ok := hashesMap[h]; ok { + return errors.New("poolAddrIndex.set: hashes array contains duplicate") + } + + hashesMap[h] = struct{}{} + } + + encodedHashes := encoder.Serialize(hashes) + return dbutil.PutBucketValue(tx, UnspentPoolAddrIndexBkt, addr.Bytes(), encodedHashes) +} + +// adjust adds and removes hashes from an address -> hashes index +// TODO -- if necessary, this can be optimized further to accept multiple addresses at once, +// so that all get queries can be performed before the set +func (p poolAddrIndex) adjust(tx *dbutil.Tx, addr cipher.Address, addHashes, rmHashes []cipher.SHA256) error { + if len(addHashes) == 0 && len(rmHashes) == 0 { + return nil + } + + existingHashes, err := p.get(tx, addr) + if err != nil { + return err + } + + rmHashesMap := make(map[cipher.SHA256]struct{}, len(rmHashes)) + for _, h := range rmHashes { + rmHashesMap[h] = struct{}{} + } + + if len(rmHashesMap) != len(rmHashes) { + return errors.New("poolAddrIndex.adjust: rmHashes contains duplicates") + } + + newHashesSize := len(existingHashes) - len(rmHashes) + if newHashesSize < 0 { + return errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes") + } + + newHashes := make([]cipher.SHA256, 0, newHashesSize) + newHashesMap := make(map[cipher.SHA256]struct{}, newHashesSize) + + rmHashesCount := 0 + for _, h := range existingHashes { + if _, ok := rmHashesMap[h]; ok { + rmHashesCount++ + } else { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } + } + + if rmHashesCount != len(rmHashes) { + return fmt.Errorf("poolAddrIndex.adjust: rmHashes contains %d hashes not indexed for address %s", len(rmHashes)-rmHashesCount, addr.String()) + } + + for _, h := range addHashes { + if _, ok := rmHashesMap[h]; ok { + return errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes") + } + + if _, ok := newHashesMap[h]; !ok { + newHashes = append(newHashes, h) + newHashesMap[h] = struct{}{} + } else { + return fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", h.Hex(), addr.String()) + } + } + + // Delete the row if hashes is empty, so that the length of the bucket can + // be used to determine the number of addresses with unspents + if len(newHashes) == 0 { + return dbutil.Delete(tx, UnspentPoolAddrIndexBkt, addr.Bytes()) + } + + return p.set(tx, addr, newHashes) +} + +// Unspents unspent outputs pool +type Unspents struct { + pool *pool + poolAddrIndex *poolAddrIndex + meta *unspentMeta +} + +// NewUnspentPool creates new unspent pool instance +func NewUnspentPool() *Unspents { + return &Unspents{ + pool: &pool{}, + poolAddrIndex: &poolAddrIndex{}, + meta: &unspentMeta{}, + } +} + +// MaybeBuildIndexes builds indexes if necessary +func (up *Unspents) MaybeBuildIndexes(tx *dbutil.Tx, headSeq uint64) error { + logger.Info("Unspents.MaybeBuildIndexes") + + // Compare the addrIndexHeight to the head block, + // if not equal, rebuild the address index + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if ok && addrIndexHeight == headSeq { + return nil + } + + if addrIndexHeight > headSeq { + logger.Critical().Warningf("addrIndexHeight > headSeq (%d > %d)", addrIndexHeight, headSeq) + } + + logger.Infof("Rebuilding unspent_pool_addr_index (addrHeightIndexExists=%v, addrIndexHeight=%d, headSeq=%d)", ok, addrIndexHeight, headSeq) + + return up.buildAddrIndex(tx) +} + +func (up *Unspents) buildAddrIndex(tx *dbutil.Tx) error { + logger.Info("Building unspent address index") + + if err := dbutil.Reset(tx, UnspentPoolAddrIndexBkt); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + var maxBlockSeq uint64 + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRaw(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > maxBlockSeq { + maxBlockSeq = ux.Head.BkSeq + } + + h := ux.Hash() + + if bytes.Compare(k[:], h[:]) != 0 { + return errors.New("Unspent pool uxout.Hash() does not match its key") + } + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + if len(addrHashes) == 0 { + logger.Infof("No unspents to index") + return nil + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.set(tx, addr, hashes); err != nil { + return err + } + } + + if err := up.meta.setAddrIndexHeight(tx, maxBlockSeq); err != nil { + return err + } + + logger.Infof("Indexed unspents for %d addresses", len(addrHashes)) + + return nil +} + +// ProcessBlock adds unspents from a block to the unspent pool +func (up *Unspents) ProcessBlock(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Gather all transaction inputs + var inputs []cipher.SHA256 + var txnUxs coin.UxArray + for _, txn := range b.Body.Transactions { + inputs = append(inputs, txn.In...) + txnUxs = append(txnUxs, coin.CreateUnspents(b.Head, txn)...) + } + + uxs, err := up.GetArray(tx, inputs) + if err != nil { + return err + } + + xorHash, err := up.meta.getXorHash(tx) + if err != nil { + return err + } + + // Remove spent outputs + rmAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, ux := range uxs { + xorHash = xorHash.Xor(ux.SnapshotHash()) + + h := ux.Hash() + + if err := up.pool.delete(tx, h); err != nil { + return err + } + + rmAddrHashes[ux.Body.Address] = append(rmAddrHashes[ux.Body.Address], h) + } + + // Create new outputs + txnUxHashes := make([]cipher.SHA256, len(txnUxs)) + addAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for i, ux := range txnUxs { + h := ux.Hash() + txnUxHashes[i] = h + addAddrHashes[ux.Body.Address] = append(addAddrHashes[ux.Body.Address], h) + } + + // Check that the uxout exists in the pool already, otherwise xorHash will be calculated wrong + for _, h := range txnUxHashes { + if hasKey, err := up.Contains(tx, h); err != nil { + return err + } else if hasKey { + return fmt.Errorf("attempted to insert uxout:%v twice into the unspent pool", h.Hex()) + } + } + + for i, ux := range txnUxs { + // Add new outputs + if err := up.pool.set(tx, txnUxHashes[i], ux); err != nil { + return err + } + + // Recalculate xorHash + xorHash = xorHash.Xor(ux.SnapshotHash()) + } + + // Set xorHash + if err := up.meta.setXorHash(tx, xorHash); err != nil { + return err + } + + // Update indexes + for addr, rmHashes := range rmAddrHashes { + addHashes := addAddrHashes[addr] + + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, rmHashes); err != nil { + return err + } + + delete(addAddrHashes, addr) + } + + for addr, addHashes := range addAddrHashes { + if err := up.poolAddrIndex.adjust(tx, addr, addHashes, nil); err != nil { + return err + } + } + + // Check that the addrIndexHeight is incremental + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + if err != nil { + return err + } + + if b.Block.Head.BkSeq == 0 { + if ok { + err := errors.New("addrIndexHeight is set but no block has been indexed yet") + logger.Critical().Error(err.Error()) + return err + } + } else if b.Block.Head.BkSeq != addrIndexHeight+1 { + err := errors.New("unspent pool processing blocks out of order") + logger.Critical().Error(err.Error()) + return err + } + + // Update the addrIndexHeight + return up.meta.setAddrIndexHeight(tx, b.Block.Head.BkSeq) +} + +// GetArray returns UxOut for a set of hashes, will return error if any of the hashes do not exist in the pool. +func (up *Unspents) GetArray(tx *dbutil.Tx, hashes []cipher.SHA256) (coin.UxArray, error) { + var uxa coin.UxArray + + for _, h := range hashes { + ux, err := up.pool.get(tx, h) + if err != nil { + return nil, err + } else if ux == nil { + return nil, NewErrUnspentNotExist(h.Hex()) + } + + uxa = append(uxa, *ux) + } + + return uxa, nil +} + +// Get returns the uxout value of given hash +func (up *Unspents) Get(tx *dbutil.Tx, h cipher.SHA256) (*coin.UxOut, error) { + return up.pool.get(tx, h) +} + +// GetAll returns Pool as an array. Note: they are not in any particular order. +func (up *Unspents) GetAll(tx *dbutil.Tx) (coin.UxArray, error) { + return up.pool.getAll(tx) +} + +// Len returns the unspent outputs num +func (up *Unspents) Len(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolBkt) +} + +// Contains check if the hash of uxout does exist in the pool +func (up *Unspents) Contains(tx *dbutil.Tx, h cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnspentPoolBkt, h[:]) +} + +// GetUnspentsOfAddrs returns a map of addresses to their unspent outputs +func (up *Unspents) GetUnspentsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrUxs := make(coin.AddressUxOuts, len(addrs)) + + for _, addr := range addrs { + hashes, err := up.poolAddrIndex.get(tx, addr) + if err != nil { + return nil, err + } + + uxa, err := up.GetArray(tx, hashes) + if err != nil { + switch e := err.(type) { + case ErrUnspentNotExist: + logger.Critical().Errorf("Unspent hash %s indexed under address %s does not exist in unspent pool", e.UxID, addr.String()) + } + return nil, err + } + + addrUxs[addr] = uxa + } + + return addrUxs, nil +} + +// GetUxHash returns unspent output checksum for the Block. +// Must be called after Block is fully initialized, +// and before its outputs are added to the unspent pool +func (up *Unspents) GetUxHash(tx *dbutil.Tx) (cipher.SHA256, error) { + return up.meta.getXorHash(tx) +} + +// AddressCount returns the total number of addresses with unspents +func (up *Unspents) AddressCount(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnspentPoolAddrIndexBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent_test.go b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent_test.go new file mode 100755 index 0000000..368b758 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/blockdb/unspent_test.go @@ -0,0 +1,1117 @@ +package blockdb + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "sort" + "testing" + "time" + + "github.com/boltdb/bolt" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func makeUxBody(t *testing.T) coin.UxBody { + p, _ := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + } +} + +func makeUxOut(t *testing.T) coin.UxOut { + body := makeUxBody(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + } +} + +func TestNewUnspentPool(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + h, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, cipher.SHA256{}, h) + return nil + + }) + require.NoError(t, err) +} + +func addUxOut(db *dbutil.DB, up *Unspents, ux coin.UxOut) error { + return db.Update("", func(tx *dbutil.Tx) error { + if err := up.pool.set(tx, ux.Hash(), ux); err != nil { + return err + } + + return up.poolAddrIndex.adjust(tx, ux.Body.Address, []cipher.SHA256{ux.Hash()}, nil) + }) +} + +func TestUnspentPoolGet(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + hash cipher.SHA256 + ux *coin.UxOut + }{ + { + "not exist", + uxs[:2], + uxs[2].Hash(), + nil, + }, + { + "find one", + uxs[:2], + uxs[1].Hash(), + &uxs[1], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + ux, err := up.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.ux, ux) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolLen(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + length, err := up.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(5), length) + return nil + }) + require.NoError(t, err) +} + +func TestUnspentPoolGetUxHash(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range uxs { + err := addUxOut(db, up, ux) + require.NoError(t, err) + err = db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + xorHash, err := up.meta.getXorHash(tx) + require.NoError(t, err) + require.Equal(t, xorHash.Hex(), uxHash.Hex()) + return nil + }) + require.NoError(t, err) + } +} + +func TestUnspentPoolGetArray(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + err := addUxOut(db, up, ux) + require.NoError(t, err) + uxs = append(uxs, ux) + } + + outsideUx := makeUxOut(t) + + testCases := []struct { + name string + hashes []cipher.SHA256 + err error + unspents coin.UxArray + }{ + { + "get first", + []cipher.SHA256{uxs[0].Hash()}, + nil, + uxs[:1], + }, + { + "get second", + []cipher.SHA256{uxs[1].Hash()}, + nil, + uxs[1:2], + }, + { + "get two", + []cipher.SHA256{uxs[0].Hash(), uxs[1].Hash()}, + nil, + uxs[0:2], + }, + { + "get not exist", + []cipher.SHA256{outsideUx.Hash()}, + NewErrUnspentNotExist(outsideUx.Hash().Hex()), + coin.UxArray{}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := db.View("", func(tx *dbutil.Tx) error { + uxs, err := up.GetArray(tx, tc.hashes) + require.Equal(t, tc.err, err) + if err == nil { + require.Equal(t, tc.unspents, uxs) + } + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolGetAll(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + testCases := []struct { + name string + unspents coin.UxArray + expect coin.UxArray + }{ + { + "empty", + coin.UxArray{}, + coin.UxArray{}, + }, + { + "one unspent", + uxs[:1], + uxs[:1], + }, + { + "two unspent", + uxs[:2], + uxs[:2], + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + err := db.View("", func(tx *dbutil.Tx) error { + unspents, err := up.GetAll(tx) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}) + for _, ux := range unspents { + uxm[ux.Hash()] = struct{}{} + } + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + + return nil + }) + require.NoError(t, err) + }) + } +} + +func BenchmarkUnspentPoolGetAll(b *testing.B) { + var t testing.T + db, teardown := prepareDB(&t) + defer teardown() + + up := NewUnspentPool() + + for i := 0; i < 1000; i++ { + ux := makeUxOut(&t) + if err := addUxOut(db, up, ux); err != nil { + b.Fatal(err) + } + } + + start := time.Now() + for i := 0; i < b.N; i++ { + err := db.View("", func(tx *dbutil.Tx) error { + _, err := up.GetAll(tx) + return err + }) + if err != nil { + b.Fatal(err) + } + } + fmt.Println(time.Since(start)) +} + +func TestGetUnspentOfAddrs(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + uxs[4].Body.Address = uxs[0].Body.Address + + testCases := []struct { + name string + unspents coin.UxArray + addrs []cipher.Address + expect coin.UxArray + }{ + { + name: "one one addr one unspent", + unspents: uxs[:], + addrs: []cipher.Address{uxs[1].Body.Address}, + expect: uxs[1:2], + }, + { + name: "one addr two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[4], + }, + }, + { + name: "two addrs three unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[0].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[0], + uxs[1], + uxs[4], + }, + }, + { + name: "two addrs two unspents", + unspents: uxs[:], + addrs: []cipher.Address{uxs[2].Body.Address, uxs[1].Body.Address}, + expect: []coin.UxOut{ + uxs[1], + uxs[2], + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + up := NewUnspentPool() + for _, ux := range tc.unspents { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + var unspents coin.AddressUxOuts + err := db.View("", func(tx *dbutil.Tx) error { + var err error + unspents, err = up.GetUnspentsOfAddrs(tx, tc.addrs) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + uxm := make(map[cipher.SHA256]struct{}, len(unspents)) + for _, uxs := range unspents { + for _, ux := range uxs { + uxm[ux.Hash()] = struct{}{} + } + } + + require.Equal(t, len(uxm), len(tc.expect)) + + for _, ux := range tc.expect { + _, ok := uxm[ux.Hash()] + require.True(t, ok) + } + }) + } +} + +func TestUnspentProcessBlock(t *testing.T) { + var uxs coin.UxArray + for i := 0; i < 5; i++ { + ux := makeUxOut(t) + uxs = append(uxs, ux) + } + + type testOutputs struct { + addr cipher.Address + coins uint64 + hours uint64 + } + + addr := testutil.MakeAddress() + + tt := []struct { + name string + init coin.UxArray + inputs coin.UxArray + outputs []testOutputs + nIndexedAddrs uint64 + }{ + { + name: "spend one create one", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6, + hours: uxs[0].Body.Hours / 2, + }, + }, + nIndexedAddrs: 5, + }, + + { + name: "spend one create two", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + { + addr: testutil.MakeAddress(), + coins: 1e6 / 2, + hours: uxs[0].Body.Hours / 4, + }, + }, + nIndexedAddrs: 6, + }, + + { + name: "spend one create three - two to the same new address and one to the spending address ", + init: uxs, + inputs: uxs[:1], + outputs: []testOutputs{ + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 16, + }, + { + addr: addr, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + { + addr: uxs[0].Body.Address, + coins: 1e6 / 4, + hours: uxs[0].Body.Hours / 8, + }, + }, + nIndexedAddrs: 6, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, closedb := prepareDB(t) + defer closedb() + + up := NewUnspentPool() + + for _, ux := range tc.init { + err := addUxOut(db, up, ux) + require.NoError(t, err) + } + + txn := coin.Transaction{} + for _, in := range tc.inputs { + txn.PushInput(in.Hash()) + } + + for _, o := range tc.outputs { + txn.PushOutput(o.addr, o.coins, o.hours) + } + + var block *coin.Block + var oldUxHash cipher.SHA256 + + err := db.Update("", func(tx *dbutil.Tx) error { + uxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + + block, err = coin.NewBlock(coin.Block{}, uint64(time.Now().Unix()), uxHash, coin.Transactions{txn}, feeCalc) + require.NoError(t, err) + + oldUxHash, err = up.GetUxHash(tx) + require.NoError(t, err) + + err = up.ProcessBlock(tx, &coin.SignedBlock{ + Block: *block, + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + + txOuts := coin.CreateUnspents(block.Head, txn) + + err = db.View("", func(tx *dbutil.Tx) error { + // check that the inputs should already been deleted from unspent pool + for _, in := range tc.inputs { + v, err := up.Get(tx, in.Hash()) + require.NoError(t, err) + require.Nil(t, v) + } + + // check the new generate unspent + hasKey, err := up.Contains(tx, txOuts[0].Hash()) + require.NoError(t, err) + require.True(t, hasKey) + + // check uxHash + for _, in := range tc.inputs { + oldUxHash = oldUxHash.Xor(in.SnapshotHash()) + } + + uxHash := oldUxHash.Xor(txOuts[0].SnapshotHash()) + for _, o := range txOuts[1:] { + uxHash = uxHash.Xor(o.SnapshotHash()) + } + + newUxHash, err := up.GetUxHash(tx) + require.NoError(t, err) + require.Equal(t, uxHash.Hex(), newUxHash.Hex()) + + // addr index height should equal the number of blocks added + addrIndexHeight, ok, err := up.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(1), addrIndexHeight) + + // addr index should have 5 rows (5 initial addrs, 1 removed as input, 1 added as output) + addrIndexLength, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, tc.nIndexedAddrs, addrIndexLength) + + // new outputs should be added to addr index cache + expectedAddrHashes := make(map[cipher.Address][]cipher.SHA256) + for _, o := range txOuts { + expectedAddrHashes[o.Body.Address] = append(expectedAddrHashes[o.Body.Address], o.Hash()) + } + + for addr, hashes := range expectedAddrHashes { + addrUxHashes, err := up.poolAddrIndex.get(tx, addr) + require.NoError(t, err) + + require.Equal(t, len(hashes), len(addrUxHashes)) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + sort.Slice(addrUxHashes, func(i, j int) bool { + return bytes.Compare(addrUxHashes[i][:], addrUxHashes[j][:]) < 1 + }) + + require.Equal(t, hashes, addrUxHashes) + } + + // used up inputs should be removed from addr index cache + for _, o := range tc.inputs { + // input addresses that appear in outputs should not be removed + if _, ok := expectedAddrHashes[o.Body.Address]; ok { + continue + } + + addrUxHashes, err := up.poolAddrIndex.get(tx, o.Body.Address) + require.NoError(t, err) + require.Nil(t, addrUxHashes) + } + + // none of the rows in the addr index should have empty arrays of hashes + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + _, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var uxHashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &uxHashes) + require.NoError(t, err) + require.NotEmpty(t, uxHashes) + + return nil + }) + require.NoError(t, err) + + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestUnspentPoolAddrIndex(t *testing.T) { + addrs := make([]cipher.Address, 10) + for i := range addrs { + addrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 30) + hashesMap := make(map[cipher.SHA256]struct{}) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + _, ok := hashesMap[hashes[i]] + require.False(t, ok) + hashesMap[hashes[i]] = struct{}{} + } + + type addrHashMap map[cipher.Address][]cipher.SHA256 + + copyHashMap := func(hm addrHashMap) addrHashMap { + out := make(addrHashMap, len(hm)) + + for addr, hashes := range hm { + copiedHashes := make([]cipher.SHA256, len(hashes)) + copy(copiedHashes[:], hashes[:]) + out[addr] = copiedHashes + } + + return out + } + + dup := func(h []cipher.SHA256) []cipher.SHA256 { + i := make([]cipher.SHA256, len(h)) + copy(i[:], h[:]) + return i + } + + cases := []struct { + name string + init addrHashMap + add addrHashMap + remove addrHashMap + expect addrHashMap + setErr error + adjustErr error + }{ + { + name: "no initial, add only", + add: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + expect: addrHashMap{ + addrs[0]: dup(hashes[0:3]), + addrs[1]: dup(hashes[3:6]), + }, + }, + + { + name: "initial, add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:3]), // add one to here + addrs[1]: dup(hashes[3:6]), // remove one from here + addrs[2]: dup(hashes[6:9]), // add and remove one from here + addrs[3]: dup(hashes[9:12]), // remove all from here + addrs[4]: dup(hashes[12:15]), // remove all from here and add one + }, + add: addrHashMap{ + addrs[0]: dup(hashes[16:17]), + addrs[2]: dup(hashes[17:18]), + addrs[4]: dup(hashes[18:19]), + }, + remove: addrHashMap{ + addrs[1]: dup(hashes[4:5]), + addrs[2]: dup(hashes[6:7]), + addrs[3]: dup(hashes[9:12]), + addrs[4]: dup(hashes[12:15]), + }, + expect: addrHashMap{ + addrs[0]: append(dup(hashes[0:3]), dup(hashes[16:17])...), + addrs[1]: append(dup(hashes[3:4]), dup(hashes[5:6])...), + addrs[2]: append(dup(hashes[7:9]), dup(hashes[17:18])...), + addrs[4]: dup(hashes[18:19]), + }, + }, + + { + name: "set error duplicate", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + setErr: errors.New("poolAddrIndex.set: hashes array contains duplicate"), + }, + + { + name: "set error empty array", + init: addrHashMap{ + addrs[0]: []cipher.SHA256{}, + }, + setErr: errors.New("poolAddrIndex.set cannot set to empty hash array"), + }, + + { + name: "adjust error removes have duplicates", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[0]}, + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes contains duplicates"), + }, + + { + name: "adjust error removing more than exists", + init: addrHashMap{ + addrs[0]: dup(hashes[0:1]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: rmHashes is longer than existingHashes"), + }, + + { + name: "adjust error removing hash that does not exist", + init: addrHashMap{ + addrs[0]: dup(hashes[0:2]), + }, + remove: addrHashMap{ + addrs[0]: []cipher.SHA256{hashes[0], hashes[11]}, + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: rmHashes contains 1 hashes not indexed for address %s", addrs[0].String()), + }, + + { + name: "adjust error hash in both add and remove", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + remove: addrHashMap{ + addrs[0]: dup(hashes[1:5]), + }, + adjustErr: errors.New("poolAddrIndex.adjust: hash appears in both addHashes and rmHashes"), + }, + + { + name: "adjust error adding hash already indexed", + init: addrHashMap{ + addrs[0]: dup(hashes[0:10]), + }, + add: addrHashMap{ + addrs[0]: dup(hashes[4:5]), + }, + adjustErr: fmt.Errorf("poolAddrIndex.adjust: uxout hash %s is already indexed for address %s", hashes[4].Hex(), addrs[0].String()), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + tc.init = copyHashMap(tc.init) + tc.add = copyHashMap(tc.add) + tc.remove = copyHashMap(tc.remove) + tc.expect = copyHashMap(tc.expect) + + p := &poolAddrIndex{} + m := &unspentMeta{} + + // Initialize the data, test that set() works + err := db.Update("", func(tx *dbutil.Tx) error { + for addr, hashes := range tc.init { + if err := p.set(tx, addr, hashes); err != nil { + return err + } + } + + return m.setAddrIndexHeight(tx, uint64(len(tc.init))) + }) + + if tc.setErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.setErr, err) + return + } + + // Check the initialized data, test that get() works + err = db.View("", func(tx *dbutil.Tx) error { + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(len(tc.init)), length) + + height, ok, err := m.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, length, height) + + for addr, expectHashes := range tc.init { + hashes, err := p.get(tx, addr) + require.NoError(t, err) + require.Equal(t, expectHashes, hashes) + } + return nil + }) + require.NoError(t, err) + + // Adjust the data, test that adjust() works + err = db.Update("", func(tx *dbutil.Tx) error { + for addr, addHashes := range tc.add { + rmHashes := tc.remove[addr] + delete(tc.remove, addr) + + err := p.adjust(tx, addr, addHashes, rmHashes) + if err != nil { + return err + } + } + + for addr, rmHashes := range tc.remove { + err := p.adjust(tx, addr, nil, rmHashes) + if err != nil { + return err + } + } + + return nil + }) + + if tc.adjustErr == nil { + require.NoError(t, err) + } else { + require.Equal(t, tc.adjustErr, err) + return + } + + addrHashes := make(addrHashMap) + err = db.View("", func(tx *dbutil.Tx) error { + return dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &hashes) + require.NoError(t, err) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + addrHashes[addr] = hashes + + return nil + }) + }) + require.NoError(t, err) + + for addr, hashes := range tc.expect { + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + tc.expect[addr] = hashes + } + + require.Equal(t, len(tc.expect), len(addrHashes)) + require.Equal(t, tc.expect, addrHashes) + }) + } +} + +func TestUnspentMaybeBuildIndexesNoIndexNoHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 0, nil) +} + +func TestUnspentMaybeBuildIndexesNoIndexHaveHead(t *testing.T) { + // Test with a database that has no unspent addr index + testUnspentMaybeBuildIndexes(t, 10, nil) +} + +func TestUnspentMaybeBuildIndexesPartialIndex(t *testing.T) { + // Test with a database that has an unspent addr index but the height is wrong + headHeight := uint64(3) + testUnspentMaybeBuildIndexes(t, headHeight+1, func(db *dbutil.DB) { + up := NewUnspentPool() + + // Index the first few blocks + err := db.Update("", func(tx *dbutil.Tx) error { + if err := dbutil.CreateBuckets(tx, [][]byte{UnspentPoolAddrIndexBkt}); err != nil { + return err + } + + addrHashes := make(map[cipher.Address][]cipher.SHA256) + + if err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + var ux coin.UxOut + if err := encoder.DeserializeRaw(v, &ux); err != nil { + return err + } + + if ux.Head.BkSeq > headHeight { + return nil + } + + h := ux.Hash() + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], h) + + return nil + }); err != nil { + return err + } + + for addr, hashes := range addrHashes { + if err := up.poolAddrIndex.set(tx, addr, hashes); err != nil { + return err + } + } + + return up.meta.setAddrIndexHeight(tx, headHeight) + }) + require.NoError(t, err) + }) +} + +func testUnspentMaybeBuildIndexes(t *testing.T, headIndex uint64, setupDB func(*dbutil.DB)) { + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + if setupDB != nil { + setupDB(db) + } + + u := NewUnspentPool() + + // Create the indexes + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.MaybeBuildIndexes(tx, headIndex) + }) + require.NoError(t, err) + + // Check the address->hashes index + addrHashes := make(map[cipher.Address][]cipher.SHA256) + err = db.View("", func(tx *dbutil.Tx) error { + // Perform the unspent lookup the slow way, to confirm it matches the hashed data + err := dbutil.ForEach(tx, UnspentPoolBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + require.NoError(t, err) + + var ux coin.UxOut + err = encoder.DeserializeRaw(v, &ux) + require.NoError(t, err) + + require.Equal(t, hash, ux.Hash()) + + addrHashes[ux.Body.Address] = append(addrHashes[ux.Body.Address], hash) + + return nil + }) + require.NoError(t, err) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + + require.Equal(t, uint64(len(addrHashes)), length) + + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(180), height) + + err = dbutil.ForEach(tx, UnspentPoolAddrIndexBkt, func(k, v []byte) error { + addr, err := cipher.AddressFromBytes(k) + require.NoError(t, err) + + var hashes []cipher.SHA256 + err = encoder.DeserializeRaw(v, &hashes) + require.NoError(t, err) + + expectedHashes, ok := addrHashes[addr] + require.True(t, ok) + + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 1 + }) + + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 1 + }) + + require.Equal(t, expectedHashes, hashes) + + delete(addrHashes, addr) + + return nil + }) + require.NoError(t, err) + + require.Empty(t, addrHashes) + + return nil + }) + require.NoError(t, err) +} + +func TestUnspentMaybeBuildIndexesNoRebuild(t *testing.T) { + // Set addrIndexHeight to head block height, but don't populate the addr index + // Check that the addr index was not populated, so we know that the index did not get rebuilt if the height matches + db, shutdown := setupNoUnspentAddrIndexDB(t) + defer shutdown() + + u := NewUnspentPool() + + // Create the bucket and artifically set the indexed height, without indexing + headSeq := uint64(180) + err := db.Update("", func(tx *dbutil.Tx) error { + if _, err := tx.CreateBucketIfNotExists(UnspentPoolAddrIndexBkt); err != nil { + return err + } + + return u.meta.setAddrIndexHeight(tx, headSeq) + }) + require.NoError(t, err) + + // Attempt to build index based upon the headSeq that we set + err = db.Update("", func(tx *dbutil.Tx) error { + return u.MaybeBuildIndexes(tx, headSeq) + }) + require.NoError(t, err) + + // Check that the addr index is still empty, because the height was the same + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := u.meta.getAddrIndexHeight(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, headSeq, height) + + length, err := dbutil.Len(tx, UnspentPoolAddrIndexBkt) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func setupNoUnspentAddrIndexDB(t *testing.T) (*dbutil.DB, func()) { + // Open a test database file that lacks UnspentPoolAddrIndexBkt, + // copy it to a temp file and open a database around the temp file + dbFilename := "./testdata/blockchain-180.no-unspent-addr-index.db" + dbFile, err := os.Open(dbFilename) + require.NoError(t, err) + + tmpFile, err := ioutil.TempFile("", "testdb") + require.NoError(t, err) + + _, err = io.Copy(tmpFile, dbFile) + require.NoError(t, err) + + err = dbFile.Close() + require.NoError(t, err) + + err = tmpFile.Sync() + require.NoError(t, err) + + boltDB, err := bolt.Open(tmpFile.Name(), 0700, nil) + require.NoError(t, err) + + db := dbutil.WrapDB(boltDB) + + return db, func() { + db.Close() + tmpFile.Close() + os.Remove(tmpFile.Name()) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/daemon_visor_test.go b/vendor/github.com/skycoin/skycoin/src/visor/daemon_visor_test.go new file mode 100755 index 0000000..1e148fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/daemon_visor_test.go @@ -0,0 +1,168 @@ +package visor + +/* +These are tests that used to be in daemon/visor_test.go, +but belong in package visor instead. + +They have been moved here without checking if they duplicate any +existing test in visor_test.go. + +It is assumed that these tests may provide coverage not present in visor_test.go + +They could be merged into visor_test.go, but for simplicity they were only moved here +*/ + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func setupSimpleVisor(t *testing.T, db *dbutil.DB, bc *Blockchain) *Visor { + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + + pool, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + return &Visor{ + Config: cfg, + Unconfirmed: pool, + Blockchain: bc, + DB: db, + } +} + +func TestVerifyTransactionInvalidFee(t *testing.T) { + // Test that a soft constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) +} + +func TestVerifyTransactionInvalidSignature(t *testing.T) { + // Test that a hard constraint is enforced + // Full verification tests are in visor/blockchain_verify_test.go + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Invalidate signatures + txn.Sigs = nil + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + _, softErr, err := v.InjectTransaction(txn) + require.Nil(t, softErr) + testutil.RequireError(t, err, NewErrTxnViolatesHardConstraint(errors.New("Invalid number of signatures")).Error()) +} + +func TestInjectValidTransaction(t *testing.T) { + db, close := prepareDB(t) + defer close() + + _, s := cipher.GenerateKeyPair() + // Setup blockchain + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours uint64 + var fee uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, fee) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectTransaction(txn) + require.Nil(t, softErr) + require.NoError(t, err) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 1) + require.Equal(t, txns[0].Txn, txn) +} + +func TestInjectTransactionSoftViolationNoFee(t *testing.T) { + db, close := prepareDB(t) + defer close() + + // Setup blockchain + _, s := cipher.GenerateKeyPair() + bc := MakeBlockchain(t, db, s) + + // Send coins to the initial address, with invalid fee + var coins = GenesisCoins + var hours = GenesisCoinHours * 1e3 + var f uint64 + addr := testutil.MakeAddress() + + txn := CreateGenesisSpendTransaction(t, db, bc, addr, coins, hours, f) + + // Setup a minimal visor + v := setupSimpleVisor(t, db, bc) + + // The unconfirmed pool should be empty + txns, err := v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 0) + + // Call injectTransaction + _, softErr, err := v.InjectTransaction(txn) + require.NoError(t, err) + require.NotNil(t, softErr) + require.Equal(t, NewErrTxnViolatesSoftConstraint(fee.ErrTxnNoFee), *softErr) + + // The transaction should appear in the unconfirmed pool + txns, err = v.GetAllUnconfirmedTxns() + require.NoError(t, err) + require.Len(t, txns, 1) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/db.go b/vendor/github.com/skycoin/skycoin/src/visor/db.go new file mode 100755 index 0000000..e4ad510 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/db.go @@ -0,0 +1,296 @@ +package visor + +import ( + "crypto/sha1" + "encoding/base64" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" +) + +var ( + // BlockchainVerifyTheadNum number of goroutines to use for signature and historydb verification + BlockchainVerifyTheadNum = 4 +) + +// ErrCorruptDB is returned if the database is corrupted +// The original corruption error is embedded +type ErrCorruptDB struct { + error +} + +// CheckDatabase checks the database for corruption, rebuild history if corrupted +func CheckDatabase(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) error { + var blocksBktExist bool + db.View("CheckDatabase", func(tx *dbutil.Tx) error { + blocksBktExist = dbutil.Exists(tx, blockdb.BlocksBkt) + return nil + }) + + // Don't verify the db if the blocks bucket does not exist + if !blocksBktExist { + return nil + } + + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return err + } + + history := historydb.New() + indexesMap := historydb.NewIndexesMap() + + var historyVerifyErr error + var lock sync.Mutex + verifyFunc := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + // Verify signature + if err := bc.VerifySignature(b); err != nil { + return err + } + + // Verify historydb, we don't return the error of history.Verify here, + // as we have to check all signature, if we return error early here, the + // potential bad signature won't be detected. + lock.Lock() + defer lock.Unlock() + if historyVerifyErr == nil { + historyVerifyErr = history.Verify(tx, b, indexesMap) + } + return nil + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, verifyFunc, quit) + switch err.(type) { + case nil: + lock.Lock() + err = historyVerifyErr + lock.Unlock() + return err + default: + return err + } +} + +// backup the corrypted db first, then rebuild the history DB. +func rebuildHistoryDB(db *dbutil.DB, history *historydb.HistoryDB, bc *Blockchain, quit chan struct{}) (*dbutil.DB, error) { + db, err := backupDB(db) + if err != nil { + return nil, err + } + + if err := db.Update("Rebuild history db", func(tx *dbutil.Tx) error { + if err := history.Erase(tx); err != nil { + return err + } + + headSeq, ok, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if !ok { + return errors.New("head block does not exist") + } + + for i := uint64(0); i <= headSeq; i++ { + select { + case <-quit: + return nil + default: + b, err := bc.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + + if i%1000 == 0 { + logger.Critical().Infof("Parse block: %d", i) + } + } + } + return nil + }); err != nil { + return nil, err + } + return db, nil +} + +// backupDB makes a backup copy of the DB +func backupDB(db *dbutil.DB) (*dbutil.DB, error) { + // backup the corrupted database + dbReadOnly := db.IsReadOnly() + + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := copyCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Copy corrupted db to %s", corruptDBPath) + + // Open the database again + return OpenDB(dbPath, dbReadOnly) +} + +// RepairCorruptDB checks the database for corruption and if corrupted and +// is ErrMissingSignature, then then it erases the db and starts over. +// If it's ErrHistoryDBCorrupted, then rebuild historydb from scratch. +// A copy of the corrupted database is saved. +func RepairCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + err := CheckDatabase(db, pubkey, quit) + switch err.(type) { + case nil: + return db, nil + case blockdb.ErrMissingSignature: + logger.Critical().Errorf("Database is corrupted, recreating db: %v", err) + return resetCorruptDB(db) + case historydb.ErrHistoryDBCorrupted: + logger.Critical().Errorf("Database is corrupted, rebuilding db: %v", err) + return rebuildCorruptDB(db, pubkey, quit) + default: + return nil, err + } +} + +func rebuildCorruptDB(db *dbutil.DB, pubkey cipher.PubKey, quit chan struct{}) (*dbutil.DB, error) { + history := historydb.New() + bc, err := NewBlockchain(db, BlockchainConfig{Pubkey: pubkey}) + if err != nil { + return nil, err + } + + return rebuildHistoryDB(db, history, bc, quit) +} + +// resetCorruptDB recreates the DB, making a backup copy marked as corrupted +func resetCorruptDB(db *dbutil.DB) (*dbutil.DB, error) { + dbReadOnly := db.IsReadOnly() + dbPath := db.Path() + + if err := db.Close(); err != nil { + return nil, fmt.Errorf("Failed to close db: %v", err) + } + + corruptDBPath, err := moveCorruptDB(dbPath) + if err != nil { + return nil, fmt.Errorf("Failed to copy corrupted db: %v", err) + } + + logger.Critical().Infof("Moved corrupted db to %s", corruptDBPath) + + return OpenDB(dbPath, dbReadOnly) +} + +// OpenDB opens the blockdb +func OpenDB(dbFile string, readOnly bool) (*dbutil.DB, error) { + db, err := bolt.Open(dbFile, 0600, &bolt.Options{ + Timeout: 5000 * time.Millisecond, + ReadOnly: readOnly, + }) + if err != nil { + return nil, fmt.Errorf("Open boltdb failed, %v", err) + } + + return dbutil.WrapDB(db), nil +} + +// moveCorruptDB moves a file to makeCorruptDBPath(dbPath) +func moveCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + if err := os.Rename(dbPath, newDBPath); err != nil { + logger.Errorf("os.Rename(%s, %s) failed: %v", dbPath, newDBPath, err) + return "", err + } + + return newDBPath, nil +} + +// copyCorruptDB copy a file to makeCorruptDBPath(dbPath) +func copyCorruptDB(dbPath string) (string, error) { + newDBPath, err := makeCorruptDBPath(dbPath) + if err != nil { + return "", err + } + + in, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer in.Close() + + out, err := os.Create(newDBPath) + if err != nil { + return "", err + } + defer out.Close() + logger.Critical().Info(out.Name()) + + _, err = io.Copy(in, out) + if err != nil { + return "", err + } + + if err := out.Close(); err != nil { + return "", err + } + + return newDBPath, nil +} + +// makeCorruptDBPath creates a $FILE.corrupt.$HASH string based on dbPath, +// where $HASH is truncated SHA1 of $FILE. +func makeCorruptDBPath(dbPath string) (string, error) { + dbFileHash, err := shaFileID(dbPath) + if err != nil { + return "", err + } + + dbDir, dbFile := filepath.Split(dbPath) + newDBFile := fmt.Sprintf("%s.corrupt.%s", dbFile, dbFileHash) + newDBPath := filepath.Join(dbDir, newDBFile) + + return newDBPath, nil +} + +// shaFileID return the first 8 bytes of the SHA1 hash of the file, +// hex-encoded +func shaFileID(dbPath string) (string, error) { + fi, err := os.Open(dbPath) + if err != nil { + return "", err + } + defer fi.Close() + + h := sha1.New() + if _, err := io.Copy(h, fi); err != nil { + return "", err + } + + sum := h.Sum(nil) + encodedSum := base64.RawURLEncoding.EncodeToString(sum[:8]) + return encodedSum, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go b/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go new file mode 100755 index 0000000..dbd7782 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/dbutil/dbutil.go @@ -0,0 +1,355 @@ +package dbutil + +import ( + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "runtime/debug" + "sync" + "time" + + "github.com/boltdb/bolt" + + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("dbutil") + txViewLog = false + txViewTrace = false + txUpdateLog = false + txUpdateTrace = false + txDurationLog = true + txDurationReportingThreshold = time.Millisecond * 100 +) + +// Tx wraps a Tx +type Tx struct { + *bolt.Tx +} + +// String is implemented to prevent a panic when mocking methods with *Tx arguments. +// The mock library forces arguments to be printed with %s which causes Tx to panic. +// See https://github.com/stretchr/testify/pull/596 +func (tx *Tx) String() string { + return fmt.Sprintf("%v", tx.Tx) +} + +// DB wraps a bolt.DB to add logging +type DB struct { + ViewLog bool + ViewTrace bool + UpdateLog bool + UpdateTrace bool + DurationLog bool + DurationReportingThreshold time.Duration + + *bolt.DB + + // shutdownLock is added to prevent closing the database while a View transaction is in progress + // bolt.DB will block for Update transactions but not for View transactions, and if + // the database is closed while in a View transaction, it will panic + // This will be fixed in coreos's bbolt after this PR is merged: + // https://github.com/coreos/bbolt/pull/91 + // When coreos has this feature, we can switch to coreos's bbolt and remove this lock + shutdownLock sync.RWMutex +} + +// WrapDB returns WrapDB +func WrapDB(db *bolt.DB) *DB { + return &DB{ + ViewLog: txViewLog, + UpdateLog: txUpdateLog, + ViewTrace: txViewTrace, + UpdateTrace: txUpdateTrace, + DurationLog: txDurationLog, + DurationReportingThreshold: txDurationReportingThreshold, + DB: db, + } +} + +// View wraps *bolt.DB.View to add logging +func (db *DB) View(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.ViewLog { + logger.Debug("db.View [%s] starting", name) + defer logger.Debug("db.View [%s] done", name) + } + if db.ViewTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.View(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.View [%s] elapsed %s", name, delta) + } + + return err +} + +// Update wraps *bolt.DB.Update to add logging +func (db *DB) Update(name string, f func(*Tx) error) error { + db.shutdownLock.RLock() + defer db.shutdownLock.RUnlock() + + if db.UpdateLog { + logger.Debug("db.Update [%s] starting", name) + defer logger.Debug("db.Update [%s] done", name) + } + if db.UpdateTrace { + debug.PrintStack() + } + + t0 := time.Now() + + err := db.DB.Update(func(tx *bolt.Tx) error { + return f(&Tx{tx}) + }) + + t1 := time.Now() + delta := t1.Sub(t0) + if db.DurationLog && delta > db.DurationReportingThreshold { + logger.Debugf("db.Update [%s] elapsed %s", name, delta) + } + + return err +} + +// Close closes the underlying *bolt.DB +func (db *DB) Close() error { + db.shutdownLock.Lock() + defer db.shutdownLock.Unlock() + + return db.DB.Close() +} + +// ErrCreateBucketFailed is returned if creating a bolt.DB bucket fails +type ErrCreateBucketFailed struct { + Bucket string + Err error +} + +func (e ErrCreateBucketFailed) Error() string { + return fmt.Sprintf("Create bucket \"%s\" failed: %v", e.Bucket, e.Err) +} + +// NewErrCreateBucketFailed returns an ErrCreateBucketFailed +func NewErrCreateBucketFailed(bucket []byte, err error) error { + return ErrCreateBucketFailed{ + Bucket: string(bucket), + Err: err, + } +} + +// ErrBucketNotExist is returned if a bolt.DB bucket does not exist +type ErrBucketNotExist struct { + Bucket string +} + +func (e ErrBucketNotExist) Error() string { + return fmt.Sprintf("Bucket \"%s\" doesn't exist", e.Bucket) +} + +// NewErrBucketNotExist returns an ErrBucketNotExist +func NewErrBucketNotExist(bucket []byte) error { + return ErrBucketNotExist{ + Bucket: string(bucket), + } +} + +// CreateBuckets creates multiple buckets +func CreateBuckets(tx *Tx, buckets [][]byte) error { + for _, b := range buckets { + if _, err := tx.CreateBucketIfNotExists(b); err != nil { + return NewErrCreateBucketFailed(b, err) + } + } + + return nil +} + +// GetBucketObjectDecoded returns an encoder-serialized value from a bucket, decoded to an object +func GetBucketObjectDecoded(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := encoder.DeserializeRaw(v, obj); err != nil { + return false, fmt.Errorf("encoder.DeserializeRaw failed: %v", err) + } + + return true, nil +} + +// GetBucketObjectJSON returns a JSON value from a bucket, unmarshaled to an object +func GetBucketObjectJSON(tx *Tx, bktName, key []byte, obj interface{}) (bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return false, err + } else if v == nil { + return false, nil + } + + if err := json.Unmarshal(v, obj); err != nil { + return false, fmt.Errorf("json.Unmarshal failed: %v", err) + } + + return true, nil +} + +// GetBucketString returns a string value from a bucket +func GetBucketString(tx *Tx, bktName, key []byte) (string, bool, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return "", false, err + } else if v == nil { + return "", false, nil + } + + return string(v), true, nil +} + +// GetBucketValue returns a []byte value from a bucket +func GetBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + v, err := getBucketValue(tx, bktName, key) + if err != nil { + return nil, err + } else if v == nil { + return nil, nil + } + + // Bytes returned from boltdb are not valid outside of the transaction + // they are called in, make a copy + w := make([]byte, len(v)) + copy(w[:], v[:]) + + return w, nil +} + +// getBucketValue returns a value from a bucket. If the value does not exist, +// it returns an error of type ErrBucketNotExist +func getBucketValue(tx *Tx, bktName, key []byte) ([]byte, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return nil, NewErrBucketNotExist(bktName) + } + + return bkt.Get(key), nil +} + +// PutBucketValue puts a value into a bucket under key. +func PutBucketValue(tx *Tx, bktName, key, val []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Put(key, val) +} + +// BucketHasKey returns true if a bucket has a non-nil value for a key +func BucketHasKey(tx *Tx, bktName, key []byte) (bool, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return false, NewErrBucketNotExist(bktName) + } + + v := bkt.Get(key) + return v != nil, nil +} + +// NextSequence returns the NextSequence() from the bucket +func NextSequence(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + return bkt.NextSequence() +} + +// ForEach calls ForEach on the bucket +func ForEach(tx *Tx, bktName []byte, f func(k, v []byte) error) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.ForEach(f) +} + +// Delete deletes from a bucket +func Delete(tx *Tx, bktName, key []byte) error { + bkt := tx.Bucket(bktName) + if bkt == nil { + return NewErrBucketNotExist(bktName) + } + + return bkt.Delete(key) +} + +// Len returns the number of keys in a bucket +func Len(tx *Tx, bktName []byte) (uint64, error) { + bkt := tx.Bucket(bktName) + if bkt == nil { + return 0, NewErrBucketNotExist(bktName) + } + + bstats := bkt.Stats() + + if bstats.KeyN < 0 { + return 0, errors.New("Negative length queried from db stats") + } + + return uint64(bstats.KeyN), nil +} + +// IsEmpty returns true if the bucket is empty +func IsEmpty(tx *Tx, bktName []byte) (bool, error) { + length, err := Len(tx, bktName) + if err != nil { + return false, err + } + return length == 0, nil +} + +// Exists returns true if the bucket exists +func Exists(tx *Tx, bktName []byte) bool { + return tx.Bucket(bktName) != nil +} + +// Reset resets the bucket +func Reset(tx *Tx, bktName []byte) error { + if err := tx.DeleteBucket(bktName); err != nil { + return err + } + + _, err := tx.CreateBucket(bktName) + return err +} + +// Itob converts uint64 to bytes +func Itob(v uint64) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, uint64(v)) + return b +} + +// Btoi converts bytes to uint64 +func Btoi(v []byte) uint64 { + return binary.BigEndian.Uint64(v) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/distribution.go b/vendor/github.com/skycoin/skycoin/src/visor/distribution.go new file mode 100755 index 0000000..f94c340 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/distribution.go @@ -0,0 +1,74 @@ +package visor + +import ( + "github.com/skycoin/skycoin/src/coin" +) + +// Note: parameters.go contains many constants used in this file +// they are the ones generated from the fiber config file. + +func init() { + if MaxCoinSupply%DistributionAddressesTotal != 0 { + panic("MaxCoinSupply should be perfectly divisible by DistributionAddressesTotal") + } +} + +// GetDistributionAddresses returns a copy of the hardcoded distribution addresses array. +// Each address has 1,000,000 coins. There are 100 addresses. +func GetDistributionAddresses() []string { + addrs := make([]string, len(distributionAddresses)) + for i := range distributionAddresses { + addrs[i] = distributionAddresses[i] + } + return addrs +} + +// GetUnlockedDistributionAddresses returns distribution addresses that are unlocked, i.e. they have spendable outputs +func GetUnlockedDistributionAddresses() []string { + // The first InitialUnlockedCount (25) addresses are unlocked by default. + // Subsequent addresses will be unlocked at a rate of UnlockAddressRate (5) per year, + // after the InitialUnlockedCount (25) addresses have no remaining balance. + // The unlock timer will be enabled manually once the + // InitialUnlockedCount (25) addresses are distributed. + + // NOTE: To have automatic unlocking, transaction verification would have + // to be handled in visor rather than in coin.Transactions.Visor(), because + // the coin package is agnostic to the state of the blockchain and cannot reference it. + // Instead of automatic unlocking, we can hardcode the timestamp at which the first 30% + // is distributed, then compute the unlocked addresses easily here. + + addrs := make([]string, InitialUnlockedCount) + for i := range distributionAddresses[:InitialUnlockedCount] { + addrs[i] = distributionAddresses[i] + } + return addrs +} + +// GetLockedDistributionAddresses returns distribution addresses that are locked, i.e. they have unspendable outputs +func GetLockedDistributionAddresses() []string { + // TODO -- once we reach 30% distribution, we can hardcode the + // initial timestamp for releasing more coins + addrs := make([]string, DistributionAddressesTotal-InitialUnlockedCount) + for i := range distributionAddresses[InitialUnlockedCount:] { + addrs[i] = distributionAddresses[InitialUnlockedCount+uint64(i)] + } + return addrs +} + +// TransactionIsLocked returns true if the transaction spends locked outputs +func TransactionIsLocked(inUxs coin.UxArray) bool { + lockedAddrs := GetLockedDistributionAddresses() + lockedAddrsMap := make(map[string]struct{}) + for _, a := range lockedAddrs { + lockedAddrsMap[a] = struct{}{} + } + + for _, o := range inUxs { + uxAddr := o.Body.Address.String() + if _, ok := lockedAddrsMap[uxAddr]; ok { + return true + } + } + + return false +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/distribution_test.go b/vendor/github.com/skycoin/skycoin/src/visor/distribution_test.go new file mode 100755 index 0000000..28b111d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/distribution_test.go @@ -0,0 +1,89 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" +) + +func TestDistributionAddressArrays(t *testing.T) { + require.Len(t, GetDistributionAddresses(), 100) + + // At the time of this writing, there should be 25 addresses in the + // unlocked pool and 75 in the locked pool. + require.Len(t, GetUnlockedDistributionAddresses(), 25) + require.Len(t, GetLockedDistributionAddresses(), 75) + + all := GetDistributionAddresses() + allMap := make(map[string]struct{}) + for _, a := range all { + // Check no duplicate address in distribution addresses + _, ok := allMap[a] + require.False(t, ok) + allMap[a] = struct{}{} + } + + unlocked := GetUnlockedDistributionAddresses() + unlockedMap := make(map[string]struct{}) + for _, a := range unlocked { + // Check no duplicate address in unlocked addresses + _, ok := unlockedMap[a] + require.False(t, ok) + + // Check unlocked address in set of all addresses + _, ok = allMap[a] + require.True(t, ok) + + unlockedMap[a] = struct{}{} + } + + locked := GetLockedDistributionAddresses() + lockedMap := make(map[string]struct{}) + for _, a := range locked { + // Check no duplicate address in locked addresses + _, ok := lockedMap[a] + require.False(t, ok) + + // Check locked address in set of all addresses + _, ok = allMap[a] + require.True(t, ok) + + // Check locked address not in unlocked addresses + _, ok = unlockedMap[a] + require.False(t, ok) + + lockedMap[a] = struct{}{} + } +} + +func TestTransactionIsLocked(t *testing.T) { + test := func(addrStr string, expectedIsLocked bool) { + addr := cipher.MustDecodeBase58Address(addrStr) + + uxOut := coin.UxOut{ + Body: coin.UxBody{ + Address: addr, + }, + } + uxArray := coin.UxArray{uxOut} + + isLocked := TransactionIsLocked(uxArray) + require.Equal(t, expectedIsLocked, isLocked) + } + + for _, a := range GetLockedDistributionAddresses() { + test(a, true) + } + + for _, a := range GetUnlockedDistributionAddresses() { + test(a, false) + } + + // A random address should not be locked + pubKey, _ := cipher.GenerateKeyPair() + addr := cipher.AddressFromPubKey(pubKey) + test(addr.String(), false) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go new file mode 100755 index 0000000..28f3161 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn.go @@ -0,0 +1,54 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// AddressTxnsBkt maps addresses to transaction hashes +var AddressTxnsBkt = []byte("address_txns") + +// addressTxn buckets for storing address related transactions +// address as key, transaction id slice as value +type addressTxns struct{} + +// Get returns the transaction hashes of given address +func (atx *addressTxns) Get(tx *dbutil.Tx, address cipher.Address) ([]cipher.SHA256, error) { + var txHashes []cipher.SHA256 + if ok, err := dbutil.GetBucketObjectDecoded(tx, AddressTxnsBkt, address.Bytes(), &txHashes); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return txHashes, nil +} + +// Add adds a hash to an address's hash list +func (atx *addressTxns) Add(tx *dbutil.Tx, addr cipher.Address, hash cipher.SHA256) error { + hashes, err := atx.Get(tx, addr) + if err != nil { + return err + } + + // check for duplicates + for _, u := range hashes { + if u == hash { + return nil + } + } + + hashes = append(hashes, hash) + return dbutil.PutBucketValue(tx, AddressTxnsBkt, addr.Bytes(), encoder.Serialize(hashes)) +} + +// IsEmpty checks if address transactions bucket is empty +func (atx *addressTxns) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressTxnsBkt) +} + +// Reset resets the bucket +func (atx *addressTxns) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressTxnsBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn_test.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn_test.go new file mode 100755 index 0000000..6488d67 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_txn_test.go @@ -0,0 +1,254 @@ +package historydb + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func TestAddAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.Add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + for _, e := range tc.expect { + err := db.View("", func(tx *dbutil.Tx) error { + hashes, err := addrTxns.Get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + return nil + }) + require.NoError(t, err) + } + + }) + } +} + +func TestGetAddressTxns(t *testing.T) { + var preAddrs []cipher.Address + var preTxHashes []cipher.SHA256 + + type pair struct { + addr cipher.Address + txHash cipher.SHA256 + } + + type expectPair struct { + addr cipher.Address + txs []cipher.SHA256 + } + + for i := 0; i < 3; i++ { + preAddrs = append(preAddrs, makeAddress()) + preTxHashes = append(preTxHashes, cipher.SumSHA256([]byte(fmt.Sprintf("tx%d", i)))) + } + + var testCases = []struct { + name string + addPairs []pair + expect []expectPair + }{ + { + "address with single tx", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[1], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + { + preAddrs[1], + preTxHashes[1:2], + }, + }, + }, + { + "address with multiple transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[1], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:2], + }, + }, + }, + { + "add address with multiple same transactions", + []pair{ + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + { + addr: preAddrs[0], + txHash: preTxHashes[0], + }, + }, + []expectPair{ + { + preAddrs[0], + preTxHashes[:1], + }, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + addrTxns := &addressTxns{} + + err := db.Update("", func(tx *dbutil.Tx) error { + for _, pr := range tc.addPairs { + err := addrTxns.Add(tx, pr.addr, pr.txHash) + require.NoError(t, err) + } + + return nil + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + for _, e := range tc.expect { + hashes, err := addrTxns.Get(tx, e.addr) + require.NoError(t, err) + require.Equal(t, e.txs, hashes) + } + return nil + }) + require.NoError(t, err) + + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go new file mode 100755 index 0000000..044d00d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/address_uxout.go @@ -0,0 +1,54 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// AddressUxBkt maps addresses to unspent outputs +var AddressUxBkt = []byte("address_in") + +// bucket for storing address with UxOut, key as address, value as UxOut. +type addressUx struct{} + +// Get return nil on not found. +func (au *addressUx) Get(tx *dbutil.Tx, address cipher.Address) ([]cipher.SHA256, error) { + var uxHashes []cipher.SHA256 + + if ok, err := dbutil.GetBucketObjectDecoded(tx, AddressUxBkt, address.Bytes(), &uxHashes); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return uxHashes, nil +} + +// Add adds a hash to an address's hash list +func (au *addressUx) Add(tx *dbutil.Tx, address cipher.Address, uxHash cipher.SHA256) error { + hashes, err := au.Get(tx, address) + if err != nil { + return err + } + + // check for duplicate hashes + for _, u := range hashes { + if u == uxHash { + return nil + } + } + + hashes = append(hashes, uxHash) + return dbutil.PutBucketValue(tx, AddressUxBkt, address.Bytes(), encoder.Serialize(hashes)) +} + +// IsEmpty checks if the addressUx bucket is empty +func (au *addressUx) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, AddressUxBkt) +} + +// Reset resets the bucket +func (au *addressUx) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, AddressUxBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go new file mode 100755 index 0000000..e6e3b39 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta.go @@ -0,0 +1,41 @@ +package historydb + +import ( + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // HistoryMetaBkt holds history metadata + HistoryMetaBkt = []byte("history_meta") + parsedHeightKey = []byte("parsed_height") +) + +// historyMeta bucket for storing block history meta info +type historyMeta struct{} + +// Height returns history parsed block seq +func (hm *historyMeta) ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) { + v, err := dbutil.GetBucketValue(tx, HistoryMetaBkt, parsedHeightKey) + if err != nil { + return 0, false, err + } else if v == nil { + return 0, false, nil + } + + return dbutil.Btoi(v), true, nil +} + +// SetParsedHeight updates history parsed block seq +func (hm *historyMeta) SetParsedBlockSeq(tx *dbutil.Tx, h uint64) error { + return dbutil.PutBucketValue(tx, HistoryMetaBkt, parsedHeightKey, dbutil.Itob(h)) +} + +// IsEmpty checks if history meta bucket is empty +func (hm *historyMeta) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, HistoryMetaBkt) +} + +// Reset resets the bucket +func (hm *historyMeta) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, HistoryMetaBkt) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta_test.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta_test.go new file mode 100755 index 0000000..3f42c85 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/history_meta_test.go @@ -0,0 +1,58 @@ +package historydb + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func TestHistoryMetaGetSetParsedHeight(t *testing.T) { + db, td := prepareDB(t) + defer td() + + hm := &historyMeta{} + + err := db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.False(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.SetParsedBlockSeq(tx, 10) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(10), height) + return err + }) + require.NoError(t, err) + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hm.SetParsedBlockSeq(tx, 0) + require.NoError(t, err) + return err + }) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + height, ok, err := hm.ParsedBlockSeq(tx) + require.NoError(t, err) + require.True(t, ok) + require.Equal(t, uint64(0), height) + return err + }) + require.NoError(t, err) + +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go new file mode 100755 index 0000000..c3061c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb.go @@ -0,0 +1,377 @@ +// Package historydb is in charge of parsing the consuses blokchain, and providing +// apis for blockchain explorer. +package historydb + +import ( + "errors" + "fmt" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var logger = logging.MustGetLogger("historydb") + +// CreateBuckets creates bolt.DB buckets used by the historydb +func CreateBuckets(tx *dbutil.Tx) error { + return dbutil.CreateBuckets(tx, [][]byte{ + AddressTxnsBkt, + AddressUxBkt, + HistoryMetaBkt, + UxOutsBkt, + TransactionsBkt, + }) +} + +// HistoryDB provides APIs for blockchain explorer +type HistoryDB struct { + txns *transactions // transactions bucket + outputs *UxOuts // outputs bucket + addrUx *addressUx // bucket which stores all UxOuts that address received + addrTxns *addressTxns // address related transaction bucket + *historyMeta // stores history meta info +} + +// New create HistoryDB instance +func New() *HistoryDB { + return &HistoryDB{ + outputs: &UxOuts{}, + txns: &transactions{}, + addrUx: &addressUx{}, + addrTxns: &addressTxns{}, + } +} + +// NeedsReset checks if need to reset the parsed block history, +// If we have a new added bucket, we need to reset to parse +// blockchain again to get the new bucket filled. +func (hd *HistoryDB) NeedsReset(tx *dbutil.Tx) (bool, error) { + _, ok, err := hd.historyMeta.ParsedBlockSeq(tx) + if err != nil { + return false, err + } else if !ok { + return true, nil + } + + // if any of the following buckets are empty, need to reset + addrTxnsEmpty, err := hd.addrTxns.IsEmpty(tx) + if err != nil { + return false, err + } + + addrUxEmpty, err := hd.addrUx.IsEmpty(tx) + if err != nil { + return false, err + } + + txnsEmpty, err := hd.txns.IsEmpty(tx) + if err != nil { + return false, err + } + + outputsEmpty, err := hd.outputs.IsEmpty(tx) + if err != nil { + return false, err + } + + if addrTxnsEmpty || addrUxEmpty || txnsEmpty || outputsEmpty { + return true, nil + } + + return false, nil +} + +// Erase erases the entire HistoryDB +func (hd *HistoryDB) Erase(tx *dbutil.Tx) error { + logger.Debug("HistoryDB.reset") + if err := hd.addrTxns.Reset(tx); err != nil { + return err + } + + if err := hd.addrUx.Reset(tx); err != nil { + return err + } + + if err := hd.outputs.Reset(tx); err != nil { + return err + } + + if err := hd.historyMeta.Reset(tx); err != nil { + return err + } + + return hd.txns.Reset(tx) +} + +// GetUxOuts get UxOut of specific uxIDs. +func (hd *HistoryDB) GetUxOuts(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]*UxOut, error) { + return hd.outputs.GetArray(tx, uxIDs) +} + +// ParseBlock builds indexes out of the block data +func (hd *HistoryDB) ParseBlock(tx *dbutil.Tx, b coin.Block) error { + for _, t := range b.Body.Transactions { + txn := Transaction{ + Tx: t, + BlockSeq: b.Seq(), + } + + if err := hd.txns.Add(tx, &txn); err != nil { + return err + } + + for _, in := range t.In { + o, err := hd.outputs.Get(tx, in) + if err != nil { + return err + } + + if o == nil { + return errors.New("HistoryDB.ParseBlock: transaction input not found in outputs bucket") + } + + // update the output's spent block seq and txid + o.SpentBlockSeq = b.Seq() + o.SpentTxID = t.Hash() + if err := hd.outputs.Set(tx, *o); err != nil { + return err + } + + // store the IN address with txid + if err := hd.addrTxns.Add(tx, o.Out.Body.Address, t.Hash()); err != nil { + return err + } + } + + // handle the tx out + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + if err := hd.outputs.Set(tx, UxOut{ + Out: ux, + }); err != nil { + return err + } + + if err := hd.addrUx.Add(tx, ux.Body.Address, ux.Hash()); err != nil { + return err + } + + if err := hd.addrTxns.Add(tx, ux.Body.Address, t.Hash()); err != nil { + return err + } + } + } + + return hd.SetParsedBlockSeq(tx, b.Seq()) +} + +// GetTransaction get transaction by hash. +func (hd HistoryDB) GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + return hd.txns.Get(tx, hash) +} + +// GetAddrUxOuts get all uxout that the address affected. +func (hd HistoryDB) GetAddrUxOuts(tx *dbutil.Tx, address cipher.Address) ([]*UxOut, error) { + hashes, err := hd.addrUx.Get(tx, address) + if err != nil { + return nil, err + } + + return hd.outputs.GetArray(tx, hashes) +} + +// GetAddressTxns returns all the address related transactions +func (hd HistoryDB) GetAddressTxns(tx *dbutil.Tx, address cipher.Address) ([]Transaction, error) { + hashes, err := hd.addrTxns.Get(tx, address) + if err != nil { + return nil, err + } + + return hd.txns.GetSlice(tx, hashes) +} + +// ForEachTxn traverses the transactions bucket +func (hd HistoryDB) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return hd.txns.ForEach(tx, f) +} + +// IndexesMap is a goroutine safe address indexes map +type IndexesMap struct { + value map[cipher.Address]AddressIndexes + lock sync.RWMutex +} + +// NewIndexesMap creates a IndexesMap instance +func NewIndexesMap() *IndexesMap { + return &IndexesMap{ + value: make(map[cipher.Address]AddressIndexes), + } +} + +// Load returns value of given key +func (im *IndexesMap) Load(address cipher.Address) (AddressIndexes, bool) { + im.lock.RLock() + v, ok := im.value[address] + im.lock.RUnlock() + return v, ok +} + +// Store saves address with indexes +func (im *IndexesMap) Store(address cipher.Address, indexes AddressIndexes) { + im.lock.Lock() + im.value[address] = indexes + im.lock.Unlock() +} + +// AddressIndexes represents the address indexes struct +type AddressIndexes struct { + TxnHashes map[cipher.SHA256]struct{} + UxHashes map[cipher.SHA256]struct{} +} + +// Verify checks if the historydb is corrupted +func (hd HistoryDB) Verify(tx *dbutil.Tx, b *coin.SignedBlock, indexesMap *IndexesMap) error { + for _, t := range b.Body.Transactions { + txnHash := t.Hash() + txn, err := hd.txns.Get(tx, txnHash) + if err != nil { + return err + } + + if txn == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction %v does not exist in historydb", txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + for _, in := range t.In { + // Checks the existence of transaction input + o, err := hd.outputs.Get(tx, in) + if err != nil { + return err + } + + if o == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction input %v does not exist in historydb", in.Hex()) + return ErrHistoryDBCorrupted{err} + } + + // Checks the output's spend block seq + if o.SpentBlockSeq != b.Seq() { + err := fmt.Errorf("HistoryDB.Verify: spend block seq of transaction input %v is wrong, should be: %v, but is %v", + in.Hex(), b.Seq(), o.SpentBlockSeq) + return ErrHistoryDBCorrupted{err} + } + + addr := o.Out.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + + // Checks if the address indexes already loaded into memory + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + if _, ok := uxHashesMap[in]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address uxout [%s:%s] does not exist in historydb", + addr, in.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + + // Checks the transaction outs + uxArray := coin.CreateUnspents(b.Head, t) + for _, ux := range uxArray { + uxHash := ux.Hash() + out, err := hd.outputs.Get(tx, uxHash) + if err != nil { + return err + } + + if out == nil { + err := fmt.Errorf("HistoryDB.Verify: transaction output %s does not exist in historydb", uxHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + + addr := ux.Body.Address + txnHashesMap := map[cipher.SHA256]struct{}{} + uxHashesMap := map[cipher.SHA256]struct{}{} + indexes, ok := indexesMap.Load(addr) + if ok { + txnHashesMap = indexes.TxnHashes + uxHashesMap = indexes.UxHashes + } else { + txnHashes, err := hd.addrTxns.Get(tx, addr) + if err != nil { + return err + } + for _, hash := range txnHashes { + txnHashesMap[hash] = struct{}{} + } + + uxHashes, err := hd.addrUx.Get(tx, addr) + if err != nil { + return err + } + + for _, hash := range uxHashes { + uxHashesMap[hash] = struct{}{} + } + + indexesMap.Store(addr, AddressIndexes{ + TxnHashes: txnHashesMap, + UxHashes: uxHashesMap, + }) + } + + if _, ok := txnHashesMap[txnHash]; !ok { + err := fmt.Errorf("HistoryDB.Verify: index of address transaction [%s:%s] does not exist in historydb", + addr, txnHash.Hex()) + return ErrHistoryDBCorrupted{err} + } + } + } + return nil +} + +// ErrHistoryDBCorrupted is returned when found the historydb is corrupted +type ErrHistoryDBCorrupted struct { + error +} + +// NewErrHistoryDBCorrupted is for user to be able to create ErrHistoryDBCorrupted instance +// outside of the package +func NewErrHistoryDBCorrupted(err error) ErrHistoryDBCorrupted { + return ErrHistoryDBCorrupted{err} +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb_test.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb_test.go new file mode 100755 index 0000000..29940e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/historydb_test.go @@ -0,0 +1,459 @@ +package historydb + +import ( + "errors" + "fmt" + "log" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := db.Update("", func(tx *dbutil.Tx) error { + return CreateBuckets(tx) + }) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +var ( + genPublic, genSecret = cipher.GenerateKeyPair() + genAddress = cipher.AddressFromPubKey(genPublic) +) + +var genTime uint64 = 1000 +var incTime uint64 = 3600 * 1000 +var genCoins uint64 = 1000e6 + +func feeCalc(t *coin.Transaction) (uint64, error) { + return 0, nil +} + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +// Blockchainer interface for isolating the detail of blockchain. +type Blockchainer interface { + Head() *coin.Block + GetBlockInDepth(dep uint64) *coin.Block + ExecuteBlock(b *coin.Block) (coin.UxArray, error) + CreateGenesisBlock(genAddress cipher.Address, genCoins, timestamp uint64) coin.Block + VerifyTransaction(tx coin.Transaction) error + GetBlock(hash cipher.SHA256) *coin.Block +} + +type fakeBlockchain struct { + blocks []coin.Block + unspent map[string]coin.UxOut + uxhash cipher.SHA256 +} + +func newBlockchain() *fakeBlockchain { + return &fakeBlockchain{ + unspent: make(map[string]coin.UxOut), + } +} + +func (fbc fakeBlockchain) GetBlockInDepth(dep uint64) *coin.Block { + if dep >= uint64(len(fbc.blocks)) { + panic(fmt.Sprintf("block depth: %d overflow", dep)) + } + + return &fbc.blocks[dep] +} + +func (fbc fakeBlockchain) Head() *coin.Block { + l := len(fbc.blocks) + if l == 0 { + return nil + } + + return &fbc.blocks[l-1] +} + +func (fbc *fakeBlockchain) deleteUxOut(uxids []cipher.SHA256) { + for _, id := range uxids { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + } +} + +func (fbc *fakeBlockchain) addUxOut(ux coin.UxOut) { + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + fbc.unspent[ux.Hash().Hex()] = ux +} + +func (fbc *fakeBlockchain) ExecuteBlock(b *coin.Block) (coin.UxArray, error) { + var uxs coin.UxArray + txns := b.Body.Transactions + for _, tx := range txns { + // Remove spent outputs + for _, id := range tx.In { + ux := fbc.unspent[id.Hex()] + fbc.uxhash = fbc.uxhash.Xor(ux.SnapshotHash()) + delete(fbc.unspent, id.Hex()) + + } + fbc.deleteUxOut(tx.In) + // Create new outputs + txUxs := coin.CreateUnspents(b.Head, tx) + for i := range txUxs { + fbc.addUxOut(txUxs[i]) + } + uxs = append(uxs, txUxs...) + } + + b.Head.PrevHash = fbc.Head().HashHeader() + fbc.blocks = append(fbc.blocks, *b) + + return uxs, nil +} + +func (fbc *fakeBlockchain) CreateGenesisBlock(genesisAddr cipher.Address, genesisCoins, timestamp uint64) coin.Block { + txn := coin.Transaction{} + txn.PushOutput(genesisAddr, genesisCoins, genesisCoins) + body := coin.BlockBody{Transactions: coin.Transactions{txn}} + prevHash := cipher.SHA256{} + head := coin.BlockHeader{ + Time: timestamp, + BodyHash: body.Hash(), + PrevHash: prevHash, + BkSeq: 0, + Version: 0, + Fee: 0, + UxHash: cipher.SHA256{}, + } + b := coin.Block{ + Head: head, + Body: body, + } + // b.Body.Transactions[0].UpdateHeader() + fbc.blocks = append(fbc.blocks, b) + ux := coin.UxOut{ + Head: coin.UxHead{ + Time: timestamp, + BkSeq: 0, + }, + Body: coin.UxBody{ + SrcTransaction: txn.InnerHash, //user inner hash + Address: genesisAddr, + Coins: genesisCoins, + Hours: genesisCoins, // Allocate 1 coin hour per coin + }, + } + fbc.addUxOut(ux) + return b +} + +func (fbc fakeBlockchain) VerifyTransaction(tx coin.Transaction) error { + return nil +} + +func (fbc fakeBlockchain) GetBlock(hash cipher.SHA256) *coin.Block { + for _, b := range fbc.blocks { + if b.HashHeader() == hash { + return &b + } + } + return nil +} + +func TestProcessGenesisBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check transactions bucket. + var tx Transaction + txHash := gb.Body.Transactions[0].Hash() + mustGetBucketValue(t, db, TransactionsBkt, txHash[:], &tx) + require.Equal(t, tx.Tx, gb.Body.Transactions[0]) + + // check address in + outID := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, genAddress.Bytes(), &outID) + + ux, ok := bc.unspent[outID[0].Hex()] + require.True(t, ok) + require.Equal(t, outID[0], ux.Hash()) + + // check outputs + output := UxOut{} + mustGetBucketValue(t, db, UxOutsBkt, outID[0][:], &output) + + require.Equal(t, output.Out, ux) +} + +type testData struct { + PreBlockHash cipher.SHA256 + Vin txIn + Vouts []txOut + AddrInNum map[string]int + AddrOutNum map[string]int +} + +type txIn struct { + SigKey string + Addr string + TxID cipher.SHA256 + BlockSeq uint64 +} + +type txOut struct { + ToAddr string + Coins uint64 + Hours uint64 +} + +func getUx(bc Blockchainer, seq uint64, txID cipher.SHA256, addr string) (*coin.UxOut, error) { + b := bc.GetBlockInDepth(seq) + if b == nil { + return nil, fmt.Errorf("no block in depth:%v", seq) + } + + tx, ok := b.GetTransaction(txID) + if !ok { + return nil, errors.New("found transaction failed") + } + + uxs := coin.CreateUnspents(b.Head, tx) + for _, u := range uxs { + if u.Body.Address.String() == addr { + return &u, nil + } + } + return nil, nil +} + +func TestProcessBlock(t *testing.T) { + db, teardown := prepareDB(t) + defer teardown() + bc := newBlockchain() + gb := bc.CreateGenesisBlock(genAddress, genCoins, genTime) + + // create + hisDB := New() + + err := db.Update("", func(tx *dbutil.Tx) error { + err := hisDB.ParseBlock(tx, gb) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + /* + + |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + genesisAddr ==>| |-2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm ==>| + |-222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm + */ + testData := []testData{ + { + PreBlockHash: gb.HashHeader(), + Vin: txIn{ + SigKey: genSecret.Hex(), + Addr: genAddress.String(), + TxID: gb.Body.Transactions[0].Hash(), + BlockSeq: 0, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: genCoins - 10e6, + Hours: 400, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 1, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + AddrOutNum: map[string]int{ + genAddress.String(): 1, + }, + }, + { + Vin: txIn{ + Addr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + SigKey: "62f4d675d991c41a2819d908a4fcf4ba44ff0c31564039e80508c9d68197f90c", + BlockSeq: 1, + }, + Vouts: []txOut{ + { + ToAddr: "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS", + Coins: 10e6, + Hours: 100, + }, + { + ToAddr: "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm", + Coins: 1000e6 - 20e6, + Hours: 100, + }, + }, + AddrInNum: map[string]int{ + "2RxP5N26GhDqHrP6SK45ZzEMSmSpeUeWxsS": 2, + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 2, + }, + AddrOutNum: map[string]int{ + "222uMeCeL1PbkJGZJDgAz5sib2uisv9hYUm": 1, + }, + }, + } + + testEngine(t, testData, bc, hisDB, db) +} + +func testEngine(t *testing.T, tds []testData, bc *fakeBlockchain, hdb *HistoryDB, db *dbutil.DB) { + for i, td := range tds { + b, tx, err := addBlock(bc, td, incTime*(uint64(i)+1)) + require.NoError(t, err) + + // update the next block test data. + if i+1 < len(tds) { + // update UxOut of next test data. + tds[i+1].Vin.TxID = tx.Hash() + tds[i+1].PreBlockHash = b.HashHeader() + } + + err = db.Update("", func(tx *dbutil.Tx) error { + err := hdb.ParseBlock(tx, *b) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + // check tx + txInBkt := Transaction{} + k := tx.Hash() + mustGetBucketValue(t, db, TransactionsBkt, k[:], &txInBkt) + require.Equal(t, &txInBkt.Tx, tx) + + // check outputs + for _, o := range td.Vouts { + ux, err := getUx(bc, uint64(i+1), tx.Hash(), o.ToAddr) + require.NoError(t, err) + + uxInDB := UxOut{} + uxKey := ux.Hash() + mustGetBucketValue(t, db, UxOutsBkt, uxKey[:], &uxInDB) + require.Equal(t, &uxInDB.Out, ux) + } + + // check addr in + for _, o := range td.Vouts { + addr := cipher.MustDecodeBase58Address(o.ToAddr) + uxHashes := []cipher.SHA256{} + mustGetBucketValue(t, db, AddressUxBkt, addr.Bytes(), &uxHashes) + require.Equal(t, len(uxHashes), td.AddrInNum[o.ToAddr]) + } + } +} + +func addBlock(bc *fakeBlockchain, td testData, tm uint64) (*coin.Block, *coin.Transaction, error) { + txn := coin.Transaction{} + // get unspent output + ux, err := getUx(bc, td.Vin.BlockSeq, td.Vin.TxID, td.Vin.Addr) + if err != nil { + return nil, nil, err + } + if ux == nil { + return nil, nil, errors.New("no unspent output") + } + + txn.PushInput(ux.Hash()) + for _, o := range td.Vouts { + addr, err := cipher.DecodeBase58Address(o.ToAddr) + if err != nil { + return nil, nil, err + } + txn.PushOutput(addr, o.Coins, o.Hours) + } + + sigKey := cipher.MustSecKeyFromHex(td.Vin.SigKey) + txn.SignInputs([]cipher.SecKey{sigKey}) + txn.UpdateHeader() + if err := bc.VerifyTransaction(txn); err != nil { + return nil, nil, err + } + preBlock := bc.GetBlock(td.PreBlockHash) + b := newBlock(*preBlock, tm, bc.uxhash, coin.Transactions{txn}, feeCalc) + + // uxs, err := bc.ExecuteBlock(&b) + _, err = bc.ExecuteBlock(&b) + if err != nil { + return nil, nil, err + } + return &b, &txn, nil +} + +func mustGetBucketValue(t *testing.T, db *dbutil.DB, name []byte, key []byte, value interface{}) { + err := db.View("", func(tx *dbutil.Tx) error { + ok, err := dbutil.GetBucketObjectDecoded(tx, name, key, value) + require.NoError(t, err) + require.True(t, ok) + return err + }) + require.NoError(t, err) +} + +func newBlock(prev coin.Block, currentTime uint64, uxHash cipher.SHA256, txns coin.Transactions, calc coin.FeeCalculator) coin.Block { + if len(txns) == 0 { + log.Panic("Refusing to create block with no transactions") + } + fee, err := txns.Fees(calc) + if err != nil { + // This should have been caught earlier + log.Panicf("Invalid transaction fees: %v", err) + } + body := coin.BlockBody{Transactions: txns} + return coin.Block{ + Head: newBlockHeader(prev.Head, uxHash, currentTime, fee, body), + Body: body, + } +} + +func newBlockHeader(prev coin.BlockHeader, uxHash cipher.SHA256, currentTime, fee uint64, body coin.BlockBody) coin.BlockHeader { + prevHash := prev.Hash() + return coin.BlockHeader{ + BodyHash: body.Hash(), + Version: prev.Version, + PrevHash: prevHash, + Time: currentTime, + BkSeq: prev.BkSeq + 1, + Fee: fee, + UxHash: uxHash, + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go new file mode 100755 index 0000000..225bd41 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/output.go @@ -0,0 +1,120 @@ +package historydb + +import ( + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// UxOutsBkt holds unspent outputs +var UxOutsBkt = []byte("uxouts") + +// UxOut expend coin.UxOut struct +type UxOut struct { + Out coin.UxOut + SpentTxID cipher.SHA256 // id of tx which spent this output. + SpentBlockSeq uint64 // block seq that spent the output. +} + +// UxOutJSON UxOut's json format +type UxOutJSON struct { + Uxid string `json:"uxid"` + Time uint64 `json:"time"` + SrcBkSeq uint64 `json:"src_block_seq"` + SrcTx string `json:"src_tx"` + OwnerAddress string `json:"owner_address"` + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` + SpentBlockSeq uint64 `json:"spent_block_seq"` // block seq that spent the output. + SpentTxID string `json:"spent_tx"` // id of tx which spent this output. +} + +// NewUxOutJSON generates UxOutJSON from UxOut +func NewUxOutJSON(out *UxOut) *UxOutJSON { + if out == nil { + return nil + } + + return &UxOutJSON{ + Uxid: out.Hash().Hex(), + Time: out.Out.Head.Time, + SrcBkSeq: out.Out.Head.BkSeq, + SrcTx: out.Out.Body.SrcTransaction.Hex(), + OwnerAddress: out.Out.Body.Address.String(), + Coins: out.Out.Body.Coins, + Hours: out.Out.Body.Hours, + SpentBlockSeq: out.SpentBlockSeq, + SpentTxID: out.SpentTxID.Hex(), + } +} + +// Hash returns outhash +func (o UxOut) Hash() cipher.SHA256 { + return o.Out.Hash() +} + +// UxOuts bucket stores outputs, UxOut hash as key and Output as value. +type UxOuts struct{} + +// Set sets out value +func (ux *UxOuts) Set(tx *dbutil.Tx, out UxOut) error { + hash := out.Hash() + return dbutil.PutBucketValue(tx, UxOutsBkt, hash[:], encoder.Serialize(out)) +} + +// Get gets UxOut of given id +func (ux *UxOuts) Get(tx *dbutil.Tx, uxID cipher.SHA256) (*UxOut, error) { + var out UxOut + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UxOutsBkt, uxID[:], &out); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return &out, nil +} + +// GetArray returns UxOuts for a set of uxids, will return error if any of the uxids do not exist +func (ux *UxOuts) GetArray(tx *dbutil.Tx, uxIDs []cipher.SHA256) ([]*UxOut, error) { + var outs []*UxOut + for _, uxID := range uxIDs { + out, err := ux.Get(tx, uxID) + if err != nil { + return nil, err + } else if out == nil { + return nil, NewErrUxOutNotExist(uxID.Hex()) + } + + outs = append(outs, out) + } + + return outs, nil +} + +// IsEmpty checks if the uxout bucekt is empty +func (ux *UxOuts) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, UxOutsBkt) +} + +// Reset resets the bucket +func (ux *UxOuts) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, UxOutsBkt) +} + +// ErrUxOutNotExist is returned if an uxout is not found in historydb +type ErrUxOutNotExist struct { + UxID string +} + +// NewErrUxOutNotExist creates ErrUxOutNotExist from a UxID +func NewErrUxOutNotExist(uxID string) error { + return ErrUxOutNotExist{UxID: uxID} +} + +func (e ErrUxOutNotExist) Error() string { + return fmt.Sprintf("uxout of %s does not exist", e.UxID) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go new file mode 100755 index 0000000..addca18 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction.go @@ -0,0 +1,99 @@ +package historydb + +// transaction.go mainly provides transaction corresponding buckets and apis, +// The transactions bucket, tx hash as key, and tx as value, it's the main bucket that stores the +// transaction value. All other buckets that index different field of transaction will only records the +// transaction hash, and get the tx value from transactions bucket. + +import ( + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// TransactionsBkt holds Transactions +var TransactionsBkt = []byte("transactions") + +// Transactions transaction bucket instance. +type transactions struct{} + +// Transaction contains transaction info and the seq of block which executed this block. +type Transaction struct { + Tx coin.Transaction + BlockSeq uint64 +} + +// Hash return the Tx hash. +func (tx *Transaction) Hash() cipher.SHA256 { + return tx.Tx.Hash() +} + +// New create a transaction db instance. +func newTransactions() *transactions { + return &transactions{} +} + +// Add transaction to the db. +func (txs *transactions) Add(tx *dbutil.Tx, txn *Transaction) error { + hash := txn.Hash() + return dbutil.PutBucketValue(tx, TransactionsBkt, hash[:], encoder.Serialize(txn)) +} + +// Get gets transaction by tx hash, return nil on not found. +func (txs *transactions) Get(tx *dbutil.Tx, hash cipher.SHA256) (*Transaction, error) { + var txn Transaction + + if ok, err := dbutil.GetBucketObjectDecoded(tx, TransactionsBkt, hash[:], &txn); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return &txn, nil +} + +// GetSlice returns transactions slice of given hashes +func (txs *transactions) GetSlice(tx *dbutil.Tx, hashes []cipher.SHA256) ([]Transaction, error) { + var txns []Transaction + for _, h := range hashes { + var txn Transaction + + if ok, err := dbutil.GetBucketObjectDecoded(tx, TransactionsBkt, h[:], &txn); err != nil { + return nil, err + } else if !ok { + continue + } + + txns = append(txns, txn) + } + + return txns, nil +} + +// IsEmpty checks if transaction bucket is empty +func (txs *transactions) IsEmpty(tx *dbutil.Tx) (bool, error) { + return dbutil.IsEmpty(tx, TransactionsBkt) +} + +// Reset resets the bucket +func (txs *transactions) Reset(tx *dbutil.Tx) error { + return dbutil.Reset(tx, TransactionsBkt) +} + +// ForEach traverses the transactions in db +func (txs *transactions) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, *Transaction) error) error { + return dbutil.ForEach(tx, TransactionsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromBytes(k) + if err != nil { + return err + } + + var txn Transaction + if err := encoder.DeserializeRaw(v, &txn); err != nil { + return err + } + + return f(hash, &txn) + }) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_test.go b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_test.go new file mode 100755 index 0000000..dc234d6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historydb/transaction_test.go @@ -0,0 +1,187 @@ +package historydb + +import ( + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +func TestTransactionGet(t *testing.T) { + txns := make([]Transaction, 0, 3) + for i := 0; i < 3; i++ { + txns = append(txns, makeTransaction(t)) + } + + testCases := []struct { + name string + hash cipher.SHA256 + expect *Transaction + }{ + { + "get first", + txns[0].Hash(), + &txns[0], + }, + { + "get second", + txns[1].Hash(), + &txns[1], + }, + { + "not exist", + txns[2].Hash(), + nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + + txsBkt := newTransactions() + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:2] { + err := txsBkt.Add(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.Get(tx, tc.hash) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func TestTransactionGetSlice(t *testing.T) { + txns := make([]Transaction, 0, 4) + for i := 0; i < 4; i++ { + txns = append(txns, makeTransaction(t)) + } + + testCases := []struct { + name string + hashes []cipher.SHA256 + expect []Transaction + }{ + { + "get one", + []cipher.SHA256{ + txns[0].Hash(), + }, + txns[:1], + }, + { + "get two", + []cipher.SHA256{ + txns[0].Hash(), + txns[1].Hash(), + }, + txns[:2], + }, + { + "get all", + []cipher.SHA256{ + txns[0].Hash(), + txns[1].Hash(), + txns[2].Hash(), + }, + txns[:3], + }, + { + "not exist", + []cipher.SHA256{ + txns[3].Hash(), + }, + nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + db, td := prepareDB(t) + defer td() + txsBkt := newTransactions() + + // init the bkt + err := db.Update("", func(tx *dbutil.Tx) error { + for _, txn := range txns[:3] { + err := txsBkt.Add(tx, &txn) + require.NoError(t, err) + } + return nil + }) + require.NoError(t, err) + + // get slice + err = db.View("", func(tx *dbutil.Tx) error { + ts, err := txsBkt.GetSlice(tx, tc.hashes) + require.NoError(t, err) + require.Equal(t, tc.expect, ts) + return nil + }) + require.NoError(t, err) + }) + } +} + +func makeTransaction(t *testing.T) Transaction { + tx := Transaction{} + ux, s := makeUxOutWithSecret(t) + tx.Tx.PushInput(ux.Hash()) + tx.Tx.SignInputs([]cipher.SecKey{s}) + tx.Tx.PushOutput(makeAddress(), 1e6, 50) + tx.Tx.PushOutput(makeAddress(), 5e6, 50) + tx.Tx.UpdateHeader() + return tx +} + +func makeAddress() cipher.Address { + p, _ := cipher.GenerateKeyPair() + return cipher.AddressFromPubKey(p) +} + +func makeUxBodyWithSecret(t *testing.T) (coin.UxBody, cipher.SecKey) { + p, s := cipher.GenerateKeyPair() + return coin.UxBody{ + SrcTransaction: testutil.RandSHA256(t), + Address: cipher.AddressFromPubKey(p), + Coins: 1e6, + Hours: 100, + }, s +} + +func makeUxOutWithSecret(t *testing.T) (coin.UxOut, cipher.SecKey) { + body, sec := makeUxBodyWithSecret(t) + return coin.UxOut{ + Head: coin.UxHead{ + Time: 100, + BkSeq: 2, + }, + Body: body, + }, sec +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/historyer_mock_test.go b/vendor/github.com/skycoin/skycoin/src/visor/historyer_mock_test.go new file mode 100755 index 0000000..6ecfaa8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/historyer_mock_test.go @@ -0,0 +1,251 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package visor + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + dbutil "github.com/skycoin/skycoin/src/visor/dbutil" + historydb "github.com/skycoin/skycoin/src/visor/historydb" +) + +// HistoryerMock mock +type HistoryerMock struct { + mock.Mock +} + +func NewHistoryerMock() *HistoryerMock { + return &HistoryerMock{} +} + +// Erase mocked method +func (m *HistoryerMock) Erase(p0 *dbutil.Tx) error { + + ret := m.Called(p0) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ForEachTxn mocked method +func (m *HistoryerMock) ForEachTxn(p0 *dbutil.Tx, p1 func(cipher.SHA256, *historydb.Transaction) error) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// GetAddrUxOuts mocked method +func (m *HistoryerMock) GetAddrUxOuts(p0 *dbutil.Tx, p1 cipher.Address) ([]*historydb.UxOut, error) { + + ret := m.Called(p0, p1) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAddressTxns mocked method +func (m *HistoryerMock) GetAddressTxns(p0 *dbutil.Tx, p1 cipher.Address) ([]historydb.Transaction, error) { + + ret := m.Called(p0, p1) + + var r0 []historydb.Transaction + switch res := ret.Get(0).(type) { + case nil: + case []historydb.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTransaction mocked method +func (m *HistoryerMock) GetTransaction(p0 *dbutil.Tx, p1 cipher.SHA256) (*historydb.Transaction, error) { + + ret := m.Called(p0, p1) + + var r0 *historydb.Transaction + switch res := ret.Get(0).(type) { + case nil: + case *historydb.Transaction: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUxOuts mocked method +func (m *HistoryerMock) GetUxOuts(p0 *dbutil.Tx, p1 []cipher.SHA256) ([]*historydb.UxOut, error) { + + ret := m.Called(p0, p1) + + var r0 []*historydb.UxOut + switch res := ret.Get(0).(type) { + case nil: + case []*historydb.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// NeedsReset mocked method +func (m *HistoryerMock) NeedsReset(p0 *dbutil.Tx) (bool, error) { + + ret := m.Called(p0) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// ParseBlock mocked method +func (m *HistoryerMock) ParseBlock(p0 *dbutil.Tx, p1 coin.Block) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ParsedBlockSeq mocked method +func (m *HistoryerMock) ParsedBlockSeq(p0 *dbutil.Tx) (uint64, bool, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 bool + switch res := ret.Get(1).(type) { + case nil: + case bool: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/parameters.go b/vendor/github.com/skycoin/skycoin/src/visor/parameters.go new file mode 100755 index 0000000..3b589e9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/parameters.go @@ -0,0 +1,130 @@ +package visor + +/* +* CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +* AVOID EDITING THIS MANUALLY + */ + +const ( + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 = 300000000 + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 = 100 + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 = MaxCoinSupply / DistributionAddressesTotal + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 = 100 + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 = 0 + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 = 31536000 // in seconds + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 = 3 + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int = 32768 // in bytes +) + +var distributionAddresses = [DistributionAddressesTotal]string{ + "4EmJ5dfx3wsHwWKsMTfQ31p5uYJfJdkohh", +"QuoFvFwtkekMEYRhXyX6FLdZgYaepwHLrR", +"pUCFtuV98KHrTucKPRgjCGZge5ADGNWJKZ", +"vZjW1xFWefDdkjZjBirsBbLx4ShmqMLPXc", +"29kPNEyTUXbAQsfDBRYwvjxv7AUsEfkHF2W", +"2KFTykHNkeT2ab2rXR4trNgqbsnyGihXR5i", +"qMkYYXpHYxnQF82dGSU1NPZC5rnrcMKLuq", +"22upsW6afi8XeHbKGA6LXQRLuMQJxrbZNSC", +"2KfCbr4u41Kwwd9p2qFAYi8q846vuBhEdf7", +"2LUkM89FH73aDLNLYHeSAXznpMkfZYZworz", +"CeYwWAnzzHq2AKVjraYQHke1koewCaAtYi", +"HV3a26bJydKEyFo9KshRNKM93YXYZSnLeL", +"UwukfXR39CimFfDkBCyh2uE2j7DW45PNv5", +"2SkYKxbWU9PeWaXczT3wMNZAUuFt6hm97yp", +"2UKw1dPW8ih2ECSwhSbsvW2VS6KNGpktiw4", +"2KE3JCVhWpuKesiC1W8kzHXEMi3crwAVPVJ", +"2UzqsvDfesa4TEWpmEiDHVNDNXzrxEXhwGp", +"Ut6UTqYbcu8QVYB9qnh6Sgrq5ztKRKjXy7", +"2R7ukNJG2ELVUsX2GJwNvoy7FgQQE3yMVpv", +"DrxrNGUWUujcA5etb9fi2KtimkDmidBDry", +"2iYrEDYjMizGZxFgqb4msocd6yDYYzUH8UC", +"dS67qDfqTod2viEScxm57oCnGogD5sk1Wp", +"gr6RVkPzR8gB8w1a2fJ4f6Uv3hwa8WHKZm", +"aeHM9sEPzJ8nW5g9msXEb1DHoRgg7HD2Uo", +"kTxV9FvMXqRtSMRxA8BVnYbPnC1GGcGEwZ", +"jZ8365eMAMtjVTcvxATYh1Z13iSwE4DM1w", +"2NJGW1RbbRFh6Bqjf33cs4f1QHtBEZHSkK2", +"2EULQ7JMpfut1fCCieLa1QG3Emh1R3emJYV", +"wXnFqaJ5t4YKuYtts1vjNmn22yHrMDwHdL", +"yjczN2BwDA8DSjs1aDJ72vPm6mBp6YzwNB", +"gz6J6eaf7v5wWrBH6uA8rEwCeEtE6m4uTZ", +"2L3UoEFAkjSvw1xp2HX7EfLR7MmtmuKEF4K", +"2bUjBYtansT9j9qBGjoXf5NM818rs465L69", +"TQwgQFP5rhSfnDLXZvX2BvN76PbUw6TPw", +"2FR126USk7RHzTZFfneEsnXtfi2fA7rBrJg", +"pvo9qDEMgxJ8sVp823UGECvxyHepsYmGy5", +"dWqXe4cWjP8dpypTdo1WgBQWgkRge83RYx", +"2frwoqsfxnaEZUTQMSyt8zPRisk37AudWHZ", +"dU9ZF6ymfAzaX8JUwAPwysxf3e63t6aJvB", +"5XuNJ735yoM8pMptV8Xb86XeQTqDeLNhad", +"GCoLLGVccM55uqAydu2sEuTKTboPYcjLSq", +"gVqLaT3m25XSuCkTKL81oa6GQZtHEUghCv", +"2FL8aRBu6PkJtbUtrP2FrjA6RfMMuMGrogb", +"RNKy29dcpByB1vNzwS3MBSAVmLeNEL5r1u", +"FAtwXixRrwCof2Q8d1G9oRRL21Pu97QzYE", +"2jnFU4WhTspT5xF9xBmEGCyjBzGrpwV9KmU", +"2LPpaLNr1SGRANSjtrBNdyQ3CsLiuJrJ9vG", +"29CWC1Q5mwuvGkcUzNsUeKYpDGTYQwKHUz5", +"2VzVTqprsaxX83Ty3RDB8qxxj8okCsX1uZV", +"Pi5PEQWLzM6VAx3teH5njsfS3aRe8uM33d", +"2hkYymVJnTkFRNNaizTvTtCfZjnXUJdB4Vd", +"Bd8NgUn7M2AZ5DhJcptMSt18ktawytraRm", +"N1crujfwpmE5GYxiCyNNhNawr3WR5o8DEN", +"Qrmf84dw5qhWAFsCRE8jGwZNkdjtuD2tVs", +"CRofzyPh9trHsmE9Me5BZtDYFrZHbWeeiR", +"joMkrn1dDQ6HXijZ4N2c6w18B87mStsrYk", +"4hhUdCSnA8Am15GsuMxZH5UDcuTr224JEf", +"zFPE7UnL4D61XhocQTdd7aWU61qDcP1axo", +"6UEW22dRvEdXegvE9RvP86cjHQjfYMaBF3", +"2Ukg5PK8ur3ufhV728zh2w1giBTuhrudy7u", +"h3MmQzJyXRkkZQtcsqexp1fZEs1M2uPFAD", +"2MeTkW453oaHXZpQz1RXm9fT85VBxKxEVy6", +"29nCVWPwzGqJqyzbmiHmmmipm7vb7H3hv1m", +"2VLfYZauxkN3AiVxdCmRD2KTbrLCQyHQin4", +"YjmWMwGwkyMg1wFNRKWDwCwHf3Pb116PxC", +"yxocxuh2U7SdwfNGXD6ntsQVsQTpyLS56i", +"s4obnTHe4Kuokn3MdxW7o9whzeMycv7hr2", +"At5XWpAgdFBoYKadcVTfTqaZfHu57ozFHu", +"ySUjssfqfHW2dcV6MKj4K6gqWAc1BDZsGw", +"AY96pFVKHAK2WzjhP9UDkv4pG2j5bqBVmi", +"gnVeepuUGh31tcyWTK3Tz2FQJ14euVdKK8", +"pAJTiVpQzX14LEKMB8Bz1ExGaJ3jDY1VGf", +"BVDEFRqgEyVvFsFx6fgBHCE5Y5RWgfBA1n", +"29qvewmoSV6NHifFLA76pYbSM6QawE2adKC", +"2hTQQCkfzp55LvysLeFzps5yY8WBboEjZ9e", +"WS57hc5SpncSrFkFpfa72PcJdyCyeKh1P1", +"2K1MQ58KbvyC1BWh9ptwHkBN5PnPhdsizJH", +"22DFsFEDcEKzLC5wN9qGAJP39myGB7pNLf2", +"2QxWANHhQDEKX3KVFiJADFGWHLeptXmH6Bb", +"2aTnyKGwZTqVkfmf1wfSGDAmyatdY2meaS3", +"2G1dQFH7rwyDpgLkgxWqUnVJhEP5nRsqkgS", +"23gkEujwMYDq1NZMpyQ6rNmiAYpZNCroTSd", +"6HdUiFNTKZStZecVkC4VahcQ7wZ4MJattr", +"25RAFrzh85QEQBP54HN4gtpE6dUdNFKLH87", +"CFr84AHkbdL8CzFdHbbMGZLT5CFAiLSKaG", +"21fU9ALUcFrQNQ1CQZv7n3JJitZYUsnbPZR", +"hs6me1EvzJPSMnGZJVG3Ucn5x8xviJUgig", +"RV4TvVCbyvLfcuPPoXJjpGNNwBy7Nm5Pau", +"28wAXi74mQdfUKBVVS6TcdZ8qFJSnPhP5cz", +"zT7hSSsYf5erHMQRAENauNox3AfJ6dguKE", +"c3xiX4PyKiAJf9Kug4iuSD4iTKWfDpDdG", +"xFJocvPFCYP3EP2r2Nv1PjNuCwFeGRhKDp", +"kmoacFgosG6KJMHe9KDiR2tzRwWmgPmfsB", +"2DZrmXmMPUe43ZHnef35NZg9ktk35c7r3Ep", +"mHoGgj8ahJanEFMDpoxey2KKupqS81bucM", +"2iY6RrqftgfS4o66eg93yehmSWTvuzHTrF2", +"KBuWGafcLr4ht1BT8ykbgiCpQNj4Bore1g", +"F94opeQNavbkh7eZKsk4EJ3Lx38p3AYvCE", +"RA9VsokcqMgnRow5osuUV8zwQdrHntMxaZ", +"uN7JuRyBtbMvRfP26Ui3pnexch8WgoGfdf", +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/readable.go b/vendor/github.com/skycoin/skycoin/src/visor/readable.go new file mode 100755 index 0000000..9a7c0dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/readable.go @@ -0,0 +1,642 @@ +package visor + +import ( + "encoding/json" + "errors" + "fmt" + "sort" + "strings" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/wallet" +) + +// BlockchainMetadata encapsulates useful information from the coin.Blockchain +type BlockchainMetadata struct { + // Most recent block's header + Head ReadableBlockHeader `json:"head"` + // Number of unspent outputs in the coin.Blockchain + Unspents uint64 `json:"unspents"` + // Number of known unconfirmed txns + Unconfirmed uint64 `json:"unconfirmed"` +} + +// NewBlockchainMetadata creates blockchain meta data +func NewBlockchainMetadata(head *coin.SignedBlock, unconfirmedLen, unspentsLen uint64) (*BlockchainMetadata, error) { + return &BlockchainMetadata{ + Head: NewReadableBlockHeader(&head.Head), + Unspents: unspentsLen, + Unconfirmed: unconfirmedLen, + }, nil +} + +// Transaction wraps around coin.Transaction, tagged with its status. This allows us +// to include unconfirmed txns +type Transaction struct { + Txn coin.Transaction //`json:"txn"` + Status TransactionStatus //`json:"status"` + Time uint64 //`json:"time"` +} + +// TransactionStatus represents the transaction status +type TransactionStatus struct { + Confirmed bool `json:"confirmed"` + // This txn is in the unconfirmed pool + Unconfirmed bool `json:"unconfirmed"` + // If confirmed, how many blocks deep in the chain it is. Will be at least + // 1 if confirmed. + Height uint64 `json:"height"` + // Execute block seq + BlockSeq uint64 `json:"block_seq"` + // We can't find anything about this txn. Be aware that the txn may be + // in someone else's unconfirmed pool, and if valid, it may become a + // confirmed txn in the future + Unknown bool `json:"unknown"` +} + +// NewUnconfirmedTransactionStatus creates unconfirmed transaction status +func NewUnconfirmedTransactionStatus() TransactionStatus { + return TransactionStatus{ + Unconfirmed: true, + Unknown: false, + Confirmed: false, + Height: 0, + } +} + +// NewUnknownTransactionStatus creates unknow transaction status +func NewUnknownTransactionStatus() TransactionStatus { + return TransactionStatus{ + Unconfirmed: false, + Unknown: true, + Confirmed: false, + Height: 0, + BlockSeq: 0, + } +} + +// NewConfirmedTransactionStatus creates confirmed transaction status +func NewConfirmedTransactionStatus(height uint64, blockSeq uint64) TransactionStatus { + if height == 0 { + logger.Panic("Invalid confirmed transaction height") + } + return TransactionStatus{ + Unconfirmed: false, + Unknown: false, + Confirmed: true, + Height: height, + BlockSeq: blockSeq, + } +} + +// ReadableTransactionOutput readable transaction output +type ReadableTransactionOutput struct { + Hash string `json:"uxid"` + Address string `json:"dst"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` +} + +// ReadableTransactionInput readable transaction input +type ReadableTransactionInput struct { + Hash string `json:"uxid"` + Address string `json:"owner"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// NewReadableTransactionOutput creates ReadableTransactionOutput +func NewReadableTransactionOutput(t *coin.TransactionOutput, txid cipher.SHA256) (*ReadableTransactionOutput, error) { + coinStr, err := droplet.ToString(t.Coins) + if err != nil { + return nil, err + } + + return &ReadableTransactionOutput{ + Hash: t.UxID(txid).Hex(), + Address: t.Address.String(), + Coins: coinStr, + Hours: t.Hours, + }, nil +} + +// NewReadableTransactionInput creates ReadableTransactionInput +func NewReadableTransactionInput(ux coin.UxOut, calculateHoursTime uint64) (*ReadableTransactionInput, error) { + coinVal, err := droplet.ToString(ux.Body.Coins) + if err != nil { + logger.Errorf("Failed to convert coins to string: %v", err) + return nil, err + } + + // The overflow bug causes this to fail for some transactions, allow it to pass + calculatedHours, err := ux.CoinHours(calculateHoursTime) + if err != nil { + logger.Critical().Warningf("Ignoring NewReadableTransactionInput ux.CoinHours failed: %v", err) + calculatedHours = 0 + } + + return &ReadableTransactionInput{ + Hash: ux.Hash().Hex(), + Address: ux.Body.Address.String(), + Coins: coinVal, + Hours: ux.Body.Hours, + CalculatedHours: calculatedHours, + }, nil +} + +// ReadableOutput represents readable output +type ReadableOutput struct { + Hash string `json:"hash"` + Time uint64 `json:"time"` + BkSeq uint64 `json:"block_seq"` + SourceTransaction string `json:"src_tx"` + Address string `json:"address"` + Coins string `json:"coins"` + Hours uint64 `json:"hours"` + CalculatedHours uint64 `json:"calculated_hours"` +} + +// ReadableOutputSet records unspent outputs in different status. +type ReadableOutputSet struct { + // HeadOutputs are unspent outputs confirmed in the blockchain + HeadOutputs ReadableOutputs `json:"head_outputs"` + // IncomingOutputs are unspent outputs being spent in unconfirmed transactions + OutgoingOutputs ReadableOutputs `json:"outgoing_outputs"` + // IncomingOutputs are unspent outputs being created by unconfirmed transactions + IncomingOutputs ReadableOutputs `json:"incoming_outputs"` +} + +// ReadableOutputs slice of ReadableOutput +// provids method to calculate balance +type ReadableOutputs []ReadableOutput + +// Balance returns the balance in droplets +func (ros ReadableOutputs) Balance() (wallet.Balance, error) { + var bal wallet.Balance + for _, out := range ros { + coins, err := droplet.FromString(out.Coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Coins, err = coin.AddUint64(bal.Coins, coins) + if err != nil { + return wallet.Balance{}, err + } + + bal.Hours, err = coin.AddUint64(bal.Hours, out.CalculatedHours) + if err != nil { + return wallet.Balance{}, err + } + } + + return bal, nil +} + +// ToUxArray converts ReadableOutputs to coin.UxArray +func (ros ReadableOutputs) ToUxArray() (coin.UxArray, error) { + var uxs coin.UxArray + for _, o := range ros { + coins, err := droplet.FromString(o.Coins) + if err != nil { + return nil, err + } + + addr, err := cipher.DecodeBase58Address(o.Address) + if err != nil { + return nil, err + } + + srcTx, err := cipher.SHA256FromHex(o.SourceTransaction) + if err != nil { + return nil, err + } + + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: o.Time, + BkSeq: o.BkSeq, + }, + Body: coin.UxBody{ + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: o.Hours, + }, + }) + } + + return uxs, nil +} + +// SpendableOutputs subtracts OutgoingOutputs from HeadOutputs +func (os ReadableOutputSet) SpendableOutputs() ReadableOutputs { + if len(os.OutgoingOutputs) == 0 { + return os.HeadOutputs + } + + spending := make(map[string]struct{}, len(os.OutgoingOutputs)) + for _, u := range os.OutgoingOutputs { + spending[u.Hash] = struct{}{} + } + + var outs ReadableOutputs + for i := range os.HeadOutputs { + if _, ok := spending[os.HeadOutputs[i].Hash]; !ok { + outs = append(outs, os.HeadOutputs[i]) + } + } + return outs +} + +// ExpectedOutputs adds IncomingOutputs to SpendableOutputs +func (os ReadableOutputSet) ExpectedOutputs() ReadableOutputs { + return append(os.SpendableOutputs(), os.IncomingOutputs...) +} + +// AggregateUnspentOutputs builds a map from address to coins +func (os ReadableOutputSet) AggregateUnspentOutputs() (map[string]uint64, error) { + allAccounts := map[string]uint64{} + for _, out := range os.HeadOutputs { + amt, err := droplet.FromString(out.Coins) + if err != nil { + return nil, err + } + if _, ok := allAccounts[out.Address]; ok { + allAccounts[out.Address], err = coin.AddUint64(allAccounts[out.Address], amt) + if err != nil { + return nil, err + } + } else { + allAccounts[out.Address] = amt + } + } + + return allAccounts, nil +} + +// NewReadableOutput creates readable output +func NewReadableOutput(headTime uint64, t coin.UxOut) (ReadableOutput, error) { + coinStr, err := droplet.ToString(t.Body.Coins) + if err != nil { + return ReadableOutput{}, err + } + + calculatedHours, err := t.CoinHours(headTime) + + // Treat overflowing coin hours calculations as a non-error and force hours to 0 + // This affects one bad spent output which had overflowed hours, spent in block 13277. + switch err { + case nil: + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + calculatedHours = 0 + err = nil + default: + return ReadableOutput{}, err + } + + return ReadableOutput{ + Hash: t.Hash().Hex(), + Time: t.Head.Time, + BkSeq: t.Head.BkSeq, + SourceTransaction: t.Body.SrcTransaction.Hex(), + Address: t.Body.Address.String(), + Coins: coinStr, + Hours: t.Body.Hours, + CalculatedHours: calculatedHours, + }, nil +} + +// NewReadableOutputs converts unspent outputs to readable output +func NewReadableOutputs(headTime uint64, uxs coin.UxArray) (ReadableOutputs, error) { + rxReadables := make(ReadableOutputs, len(uxs)) + for i, ux := range uxs { + out, err := NewReadableOutput(headTime, ux) + if err != nil { + return ReadableOutputs{}, err + } + + rxReadables[i] = out + } + + // Sort ReadableOutputs newest to oldest, using hash to break ties + sort.Slice(rxReadables, func(i, j int) bool { + if rxReadables[i].Time == rxReadables[j].Time { + return strings.Compare(rxReadables[i].Hash, rxReadables[j].Hash) < 0 + } + return rxReadables[i].Time > rxReadables[j].Time + }) + + return rxReadables, nil +} + +// ReadableOutputsToUxBalances converts ReadableOutputs to []wallet.UxBalance +func ReadableOutputsToUxBalances(ros ReadableOutputs) ([]wallet.UxBalance, error) { + uxb := make([]wallet.UxBalance, len(ros)) + for i, ro := range ros { + if ro.Hash == "" { + return nil, errors.New("ReadableOutput missing hash") + } + + hash, err := cipher.SHA256FromHex(ro.Hash) + if err != nil { + return nil, fmt.Errorf("ReadableOutput hash is invalid: %v", err) + } + + coins, err := droplet.FromString(ro.Coins) + if err != nil { + return nil, fmt.Errorf("ReadableOutput coins is invalid: %v", err) + } + + addr, err := cipher.DecodeBase58Address(ro.Address) + if err != nil { + return nil, fmt.Errorf("ReadableOutput address is invalid: %v", err) + } + + srcTx, err := cipher.SHA256FromHex(ro.SourceTransaction) + if err != nil { + return nil, fmt.Errorf("ReadableOutput src_tx is invalid: %v", err) + } + + b := wallet.UxBalance{ + Hash: hash, + Time: ro.Time, + BkSeq: ro.BkSeq, + SrcTransaction: srcTx, + Address: addr, + Coins: coins, + Hours: ro.CalculatedHours, + InitialHours: ro.Hours, + } + + uxb[i] = b + } + + return uxb, nil +} + +// ReadableTransaction represents readable transaction +type ReadableTransaction struct { + Length uint32 `json:"length"` + Type uint8 `json:"type"` + Hash string `json:"txid"` + InnerHash string `json:"inner_hash"` + Timestamp uint64 `json:"timestamp,omitempty"` + + Sigs []string `json:"sigs"` + In []string `json:"inputs"` + Out []ReadableTransactionOutput `json:"outputs"` +} + +// ReadableUnconfirmedTxn represents readable unconfirmed transaction +type ReadableUnconfirmedTxn struct { + Txn ReadableTransaction `json:"transaction"` + Received time.Time `json:"received"` + Checked time.Time `json:"checked"` + Announced time.Time `json:"announced"` + IsValid bool `json:"is_valid"` +} + +// NewReadableUnconfirmedTxn creates readable unconfirmed transaction +func NewReadableUnconfirmedTxn(unconfirmed *UnconfirmedTxn) (*ReadableUnconfirmedTxn, error) { + tx, err := NewReadableTransaction(&Transaction{Txn: unconfirmed.Txn}) + if err != nil { + return nil, err + } + return &ReadableUnconfirmedTxn{ + Txn: *tx, + Received: nanoToTime(unconfirmed.Received), + Checked: nanoToTime(unconfirmed.Checked), + Announced: nanoToTime(unconfirmed.Announced), + IsValid: unconfirmed.IsValid == 1, + }, nil +} + +// NewReadableUnconfirmedTxns converts []UnconfirmedTxn to []ReadableUnconfirmedTxn +func NewReadableUnconfirmedTxns(txs []UnconfirmedTxn) ([]ReadableUnconfirmedTxn, error) { + rut := make([]ReadableUnconfirmedTxn, len(txs)) + for i := range txs { + tx, err := NewReadableUnconfirmedTxn(&txs[i]) + if err != nil { + return []ReadableUnconfirmedTxn{}, err + } + rut[i] = *tx + } + return rut, nil +} + +// NewReadableTransaction creates readable transaction +func NewReadableTransaction(t *Transaction) (*ReadableTransaction, error) { + // Genesis transaction use empty SHA256 as txid + txid := cipher.SHA256{} + if t.Status.BlockSeq != 0 { + txid = t.Txn.Hash() + } + + sigs := make([]string, len(t.Txn.Sigs)) + for i := range t.Txn.Sigs { + sigs[i] = t.Txn.Sigs[i].Hex() + } + + in := make([]string, len(t.Txn.In)) + for i := range t.Txn.In { + in[i] = t.Txn.In[i].Hex() + } + + out := make([]ReadableTransactionOutput, len(t.Txn.Out)) + for i := range t.Txn.Out { + o, err := NewReadableTransactionOutput(&t.Txn.Out[i], txid) + if err != nil { + return nil, err + } + + out[i] = *o + } + + return &ReadableTransaction{ + Length: t.Txn.Length, + Type: t.Txn.Type, + Hash: t.Txn.TxIDHex(), + InnerHash: t.Txn.InnerHash.Hex(), + Timestamp: t.Time, + + Sigs: sigs, + In: in, + Out: out, + }, nil +} + +// ReadableBlockHeader represents the readable block header +type ReadableBlockHeader struct { + BkSeq uint64 `json:"seq"` + BlockHash string `json:"block_hash"` + PreviousBlockHash string `json:"previous_block_hash"` + Time uint64 `json:"timestamp"` + Fee uint64 `json:"fee"` + Version uint32 `json:"version"` + BodyHash string `json:"tx_body_hash"` +} + +// NewReadableBlockHeader creates readable block header +func NewReadableBlockHeader(b *coin.BlockHeader) ReadableBlockHeader { + return ReadableBlockHeader{ + BkSeq: b.BkSeq, + BlockHash: b.Hash().Hex(), + PreviousBlockHash: b.PrevHash.Hex(), + Time: b.Time, + Fee: b.Fee, + Version: b.Version, + BodyHash: b.BodyHash.Hex(), + } +} + +// ReadableBlockBody represents readable block body +type ReadableBlockBody struct { + Transactions []ReadableTransaction `json:"txns"` +} + +// NewReadableBlockBody creates readable block body +func NewReadableBlockBody(b *coin.Block) (*ReadableBlockBody, error) { + txns := make([]ReadableTransaction, len(b.Body.Transactions)) + for i := range b.Body.Transactions { + t := Transaction{ + Txn: b.Body.Transactions[i], + Status: TransactionStatus{BlockSeq: b.Seq()}, + } + + tx, err := NewReadableTransaction(&t) + if err != nil { + return nil, err + } + txns[i] = *tx + } + return &ReadableBlockBody{ + Transactions: txns, + }, nil +} + +// ReadableBlock represents readable block +type ReadableBlock struct { + Head ReadableBlockHeader `json:"header"` + Body ReadableBlockBody `json:"body"` + Size int `json:"size"` +} + +// NewReadableBlock creates readable block +func NewReadableBlock(b *coin.Block) (*ReadableBlock, error) { + body, err := NewReadableBlockBody(b) + if err != nil { + return nil, err + } + return &ReadableBlock{ + Head: NewReadableBlockHeader(&b.Head), + Body: *body, + Size: b.Size(), + }, nil +} + +// ReadableBlocks an array of readable blocks. +type ReadableBlocks struct { + Blocks []ReadableBlock `json:"blocks"` +} + +// NewReadableBlocks converts []coin.SignedBlock to readable blocks +func NewReadableBlocks(blocks []coin.SignedBlock) (*ReadableBlocks, error) { + rbs := make([]ReadableBlock, 0, len(blocks)) + for _, b := range blocks { + rb, err := NewReadableBlock(&b.Block) + if err != nil { + return nil, err + } + rbs = append(rbs, *rb) + } + return &ReadableBlocks{ + Blocks: rbs, + }, nil +} + +/* + Transactions to and from JSON +*/ + +// TransactionOutputJSON represents the transaction output json +type TransactionOutputJSON struct { + Hash string `json:"hash"` + SourceTransaction string `json:"src_tx"` + Address string `json:"address"` // Address of receiver + Coins string `json:"coins"` // Number of coins + Hours uint64 `json:"hours"` // Coin hours +} + +// NewTxOutputJSON creates transaction output json +func NewTxOutputJSON(ux coin.TransactionOutput, srcTx cipher.SHA256) (*TransactionOutputJSON, error) { + tmp := coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTx, + Address: ux.Address, + Coins: ux.Coins, + Hours: ux.Hours, + }, + } + + var o TransactionOutputJSON + o.Hash = tmp.Hash().Hex() + o.SourceTransaction = srcTx.Hex() + + o.Address = ux.Address.String() + coin, err := droplet.ToString(ux.Coins) + if err != nil { + return nil, err + } + o.Coins = coin + o.Hours = ux.Hours + return &o, nil +} + +// TransactionJSON represents transaction in json +type TransactionJSON struct { + Hash string `json:"hash"` + InnerHash string `json:"inner_hash"` + + Sigs []string `json:"sigs"` + In []string `json:"in"` + Out []TransactionOutputJSON `json:"out"` +} + +// TransactionToJSON convert transaction to json string +// TODO -- remove in favor of ReadableTransaction? +func TransactionToJSON(tx coin.Transaction) (string, error) { + var o TransactionJSON + + o.Hash = tx.Hash().Hex() + o.InnerHash = tx.InnerHash.Hex() + + o.Sigs = make([]string, len(tx.Sigs)) + o.In = make([]string, len(tx.In)) + o.Out = make([]TransactionOutputJSON, len(tx.Out)) + + for i, sig := range tx.Sigs { + o.Sigs[i] = sig.Hex() + } + for i, x := range tx.In { + o.In[i] = x.Hex() // hash to hex + } + for i, y := range tx.Out { + out, err := NewTxOutputJSON(y, tx.InnerHash) + if err != nil { + return "", err + } + o.Out[i] = *out + } + + b, err := json.MarshalIndent(o, "", " ") + if err != nil { + return "", fmt.Errorf("serialize TransactionJSON failed: %v", err) + } + + return string(b), nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/readable_test.go b/vendor/github.com/skycoin/skycoin/src/visor/readable_test.go new file mode 100755 index 0000000..eddef11 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/readable_test.go @@ -0,0 +1,260 @@ +package visor + +import ( + "encoding/json" + "io/ioutil" + "reflect" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/visor/dbutil" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" +) + +func prepareWltDir(t *testing.T) string { + dir, err := ioutil.TempDir("", "wallets") + require.NoError(t, err) + return dir +} + +// Returns an appropriate VisorConfig and a master visor +func setupVisorConfig(t *testing.T) Config { + wltDir := prepareWltDir(t) + c := NewVisorConfig() + c.WalletDirectory = wltDir + c.BlockchainSeckey = genSecret + c.BlockchainPubkey = genPublic + c.GenesisAddress = genAddress + return c +} + +func setupVisor(t *testing.T) (*Visor, func()) { + db, shutdown := prepareDB(t) + vc := setupVisorConfig(t) + v, err := NewVisor(vc, db) + require.NoError(t, err) + return v, shutdown +} + +func transferCoins(t *testing.T, v *Visor) { + head := addGenesisBlockToVisor(t, v) + toAddrs := make([]cipher.Address, 10) + keys := make([]cipher.SecKey, 10) + for i := 0; i < 10; i++ { + p, s := cipher.GenerateKeyPair() + toAddrs[i] = cipher.AddressFromPubKey(p) + keys[i] = s + } + + var spend = spending{ + TxIndex: 0, + UxIndex: 0, + Keys: []cipher.SecKey{genSecret}, + ToAddr: toAddrs[0], + Coins: 10e6, + } + // create normal spending tx + uxs := coin.CreateUnspents(head.Head, head.Body.Transactions[0]) + txn := makeSpendTx(t, coin.UxArray{uxs[spend.UxIndex]}, spend.Keys, spend.ToAddr, spend.Coins) + + var b *coin.Block + err := v.DB.View("", func(tx *dbutil.Tx) error { + var err error + b, err = v.Blockchain.NewBlock(tx, coin.Transactions{txn}, head.Time()+uint64(100)) + require.NoError(t, err) + return nil + }) + require.NoError(t, err) + + sb := &coin.SignedBlock{ + Block: *b, + Sig: cipher.SignHash(b.HashHeader(), genSecret), + } + v.DB.Update("", func(tx *dbutil.Tx) error { + bcc, ok := v.Blockchain.(*Blockchain) + require.True(t, ok) + return bcc.store.AddBlock(tx, sb) + }) + head = sb + +} + +func assertJSONSerializability(t *testing.T, thing interface{}) { + b, err := json.Marshal(thing) + require.NoError(t, err) + rt := reflect.TypeOf(reflect.Indirect(reflect.ValueOf(thing)).Interface()) + newThing := reflect.New(rt).Interface() + err = json.Unmarshal(b, newThing) + require.NoError(t, err) + require.True(t, reflect.DeepEqual(thing, newThing)) +} + +func TestNewBlockchainMetadata(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + + bcm, err := v.GetBlockchainMetadata() + require.NoError(t, err) + require.Equal(t, uint64(2), bcm.Unspents) + require.Equal(t, uint64(0), bcm.Unconfirmed) + b, err := v.GetHeadBlock() + require.NoError(t, err) + assertReadableBlockHeader(t, bcm.Head, b.Block.Head) + assertJSONSerializability(t, &bcm) +} + +func TestNewTransactionStatus(t *testing.T) { + ts := NewUnconfirmedTransactionStatus() + require.True(t, ts.Unconfirmed) + require.False(t, ts.Unknown) + require.False(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(0)) + assertJSONSerializability(t, &ts) + + ts = NewUnknownTransactionStatus() + require.False(t, ts.Unconfirmed) + require.True(t, ts.Unknown) + require.False(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(0)) + assertJSONSerializability(t, &ts) + + ts = NewConfirmedTransactionStatus(uint64(7), uint64(7)) + require.False(t, ts.Unconfirmed) + require.False(t, ts.Unknown) + require.True(t, ts.Confirmed) + require.Equal(t, ts.Height, uint64(7)) + assertJSONSerializability(t, &ts) + + require.Panics(t, func() { + NewConfirmedTransactionStatus(uint64(0), uint64(0)) + }) +} + +func assertReadableTransactionOutput(t *testing.T, + rto ReadableTransactionOutput, to coin.TransactionOutput) { + require.NotPanics(t, func() { + require.Equal(t, cipher.MustDecodeBase58Address(rto.Address), to.Address) + }) + coins, err := droplet.ToString(to.Coins) + require.NoError(t, err) + require.Equal(t, rto.Coins, coins) + require.Equal(t, rto.Hours, to.Hours) + assertJSONSerializability(t, &rto) +} + +func TestReadableTransactionOutput(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() + require.NoError(t, err) + to := b.Body.Transactions[0].Out[0] + + rto, err := NewReadableTransactionOutput(&to, testutil.RandSHA256(t)) + assertReadableTransactionOutput(t, *rto, to) +} + +func assertReadableTransactionInput(t *testing.T, rti string, ti cipher.SHA256) { + require.NotPanics(t, func() { + require.Equal(t, cipher.MustSHA256FromHex(rti), ti) + }) + assertJSONSerializability(t, &rti) +} + +func TestReadableTransactionInput(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() + require.NoError(t, err) + ti := b.Body.Transactions[0].In[0] + rti := ti.Hex() + assertReadableTransactionInput(t, rti, ti) +} + +func assertReadableTransaction(t *testing.T, rtx ReadableTransaction, tx coin.Transaction) { + require.Equal(t, len(tx.In), len(rtx.In)) + require.Equal(t, len(tx.Out), len(rtx.Out)) + for i, ti := range rtx.In { + assertReadableTransactionInput(t, ti, tx.In[i]) + } + for i, to := range rtx.Out { + assertReadableTransactionOutput(t, to, tx.Out[i]) + } + assertJSONSerializability(t, &rtx) +} + +func TestReadableTransaction(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + b, err := v.GetHeadBlock() + require.NoError(t, err) + tx := b.Body.Transactions[0] + + rtx, err := NewReadableTransaction(&Transaction{ + Txn: tx, + }) + assertReadableTransaction(t, *rtx, tx) +} + +func assertReadableBlockHeader(t *testing.T, rb ReadableBlockHeader, bh coin.BlockHeader) { + require.Equal(t, rb.Version, bh.Version) + require.Equal(t, rb.Time, bh.Time) + require.Equal(t, rb.BkSeq, bh.BkSeq) + require.Equal(t, rb.Fee, bh.Fee) + require.NotPanics(t, func() { + require.Equal(t, cipher.MustSHA256FromHex(rb.PreviousBlockHash), bh.PrevHash) + require.Equal(t, cipher.MustSHA256FromHex(rb.BodyHash), bh.BodyHash) + }) + assertJSONSerializability(t, &rb) +} + +func TestNewReadableBlockHeader(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + + bh, err := v.GetHeadBlock() + require.NoError(t, err) + require.Equal(t, bh.Head.BkSeq, uint64(1)) + rb := NewReadableBlockHeader(&bh.Head) + assertReadableBlockHeader(t, rb, bh.Head) +} + +func assertReadableBlockBody(t *testing.T, rbb ReadableBlockBody, bb coin.BlockBody) { + require.Equal(t, len(rbb.Transactions), len(bb.Transactions)) + for i, rt := range rbb.Transactions { + assertReadableTransaction(t, rt, bb.Transactions[i]) + } + assertJSONSerializability(t, &rbb) +} + +func assertReadableBlock(t *testing.T, rb ReadableBlock, b coin.Block) { + assertReadableBlockHeader(t, rb.Head, b.Head) + assertReadableBlockBody(t, rb.Body, b.Body) + assertJSONSerializability(t, &rb) +} + +func TestNewReadableBlock(t *testing.T) { + v, shutdown := setupVisor(t) + defer shutdown() + + transferCoins(t, v) + sb, err := v.GetHeadBlock() + require.NoError(t, err) + require.Equal(t, sb.Head.BkSeq, uint64(1)) + rb, err := NewReadableBlock(&sb.Block) + assertReadableBlock(t, *rb, sb.Block) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/richlist.go b/vendor/github.com/skycoin/skycoin/src/visor/richlist.go new file mode 100755 index 0000000..227ffeb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/richlist.go @@ -0,0 +1,71 @@ +package visor + +import ( + "sort" + "strings" + + "github.com/skycoin/skycoin/src/util/droplet" +) + +// RichlistBalance holds info an address balance holder +type RichlistBalance struct { + Address string `json:"address"` + Coins string `json:"coins"` + Locked bool `json:"locked"` + coins uint64 +} + +// Richlist contains RichlistBalances +type Richlist []RichlistBalance + +// NewRichlist create Richlist via unspent outputs map +func NewRichlist(allAccounts map[string]uint64, lockedAddrs map[string]struct{}) (Richlist, error) { + richlist := make(Richlist, 0, len(allAccounts)) + + for addr, coins := range allAccounts { + var islocked bool + if _, ok := lockedAddrs[addr]; ok { + islocked = true + } + + coinsStr, err := droplet.ToString(coins) + if err != nil { + return nil, err + } + + richlist = append(richlist, RichlistBalance{ + Address: addr, + Coins: coinsStr, + coins: coins, + Locked: islocked, + }) + } + + // Sort order: + // Higher coins + // Locked > unlocked + // Address alphabetical + sort.Slice(richlist, func(i, j int) bool { + if richlist[i].coins == richlist[j].coins { + if richlist[i].Locked == richlist[j].Locked { + return strings.Compare(richlist[i].Address, richlist[j].Address) < 0 + } + return richlist[i].Locked + } + + return richlist[i].coins > richlist[j].coins + }) + + return richlist, nil +} + +// FilterAddresses returns the richlist without addresses from the map +func (r Richlist) FilterAddresses(addrs map[string]struct{}) Richlist { + var s Richlist + for _, b := range r { + if _, ok := addrs[b.Address]; !ok { + s = append(s, b) + } + } + return s +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/richlist_test.go b/vendor/github.com/skycoin/skycoin/src/visor/richlist_test.go new file mode 100755 index 0000000..210b375 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/richlist_test.go @@ -0,0 +1,98 @@ +package visor + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func getLockedMap() map[string]struct{} { + distributionAddresses := []string{"a1", "b1", "c1", "d1"} + dmap := map[string]struct{}{} + for _, addr := range distributionAddresses { + dmap[addr] = struct{}{} + } + return dmap +} + +func getAllAccounts() map[string]uint64 { + accMap := map[string]uint64{} + accMap["a1"] = 1000000 + accMap["b1"] = 1000000 + accMap["c1"] = 2123456 + accMap["d1"] = 1000000 + accMap["a2"] = 3010000 + accMap["b2"] = 2010000 + accMap["c2"] = 4010000 + accMap["d2"] = 1000000 + + return accMap +} + +func TestRichlist(t *testing.T) { + expectedRichlist := Richlist{ + RichlistBalance{Address: "c2", Coins: "4.010000", Locked: false, coins: 4010000}, + RichlistBalance{Address: "a2", Coins: "3.010000", Locked: false, coins: 3010000}, + RichlistBalance{Address: "c1", Coins: "2.123456", Locked: true, coins: 2123456}, + RichlistBalance{Address: "b2", Coins: "2.010000", Locked: false, coins: 2010000}, + RichlistBalance{Address: "a1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "b1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "d1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "d2", Coins: "1.000000", Locked: false, coins: 1000000}, + } + + accMap := getAllAccounts() + distributionMap := getLockedMap() + + richlist, err := NewRichlist(map[string]uint64{}, map[string]struct{}{}) + assert.NoError(t, err) + assert.Equal(t, Richlist{}, richlist) + + richlist, err = NewRichlist(accMap, distributionMap) + assert.NoError(t, err) + assert.Equal(t, expectedRichlist, richlist) + cases := []struct { + name string + filterMap map[string]struct{} + richerCount int + result Richlist + }{ + { + name: "filterRichlist", + filterMap: map[string]struct{}{"a2": struct{}{}, "b2": struct{}{}, "d2": struct{}{}}, + richerCount: 5, + result: Richlist{ + RichlistBalance{Address: "c2", Coins: "4.010000", Locked: false, coins: 4010000}, + RichlistBalance{Address: "c1", Coins: "2.123456", Locked: true, coins: 2123456}, + RichlistBalance{Address: "a1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "b1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "d1", Coins: "1.000000", Locked: true, coins: 1000000}, + }, + }, + + { + name: "allRichlist", + filterMap: map[string]struct{}{}, + richerCount: 8, + result: expectedRichlist, + }, + { + name: "lockedRichlist", + filterMap: map[string]struct{}{"c2": struct{}{}, "a2": struct{}{}, "b2": struct{}{}, "d2": struct{}{}}, + richerCount: 4, + result: Richlist{ + RichlistBalance{Address: "c1", Coins: "2.123456", Locked: true, coins: 2123456}, + RichlistBalance{Address: "a1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "b1", Coins: "1.000000", Locked: true, coins: 1000000}, + RichlistBalance{Address: "d1", Coins: "1.000000", Locked: true, coins: 1000000}, + }, + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + result := richlist.FilterAddresses(tc.filterMap) + assert.Equal(t, tc.richerCount, len(result), "%d != %d", tc.richerCount, len(result)) + assert.Equal(t, tc.result, result) + }) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.garbage b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.garbage new file mode 100755 index 0000000..e1e9666 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.garbage @@ -0,0 +1 @@ +....garbage file to cause bolt DB error.... diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-txn-index b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-txn-index new file mode 100755 index 0000000..11f547d Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-txn-index differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-uxout-index b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-uxout-index new file mode 100755 index 0000000..bf4ef82 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.no-addr-uxout-index differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nosig b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nosig new file mode 100755 index 0000000..40c5b25 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nosig differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.notxn b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.notxn new file mode 100755 index 0000000..86fa646 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.notxn differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nouxout b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nouxout new file mode 100755 index 0000000..21ebfa7 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.nouxout differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.ok b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.ok new file mode 100755 index 0000000..47780f8 Binary files /dev/null and b/vendor/github.com/skycoin/skycoin/src/visor/testdata/data.db.ok differ diff --git a/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go new file mode 100755 index 0000000..6bb9169 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed.go @@ -0,0 +1,618 @@ +package visor + +import ( + "errors" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encoder" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +var ( + // UnconfirmedTxnsBkt holds unconfirmed transactions + UnconfirmedTxnsBkt = []byte("unconfirmed_txns") + // UnconfirmedUnspentsBkt holds unconfirmed unspent outputs + UnconfirmedUnspentsBkt = []byte("unconfirmed_unspents") + + errUpdateObjectDoesNotExist = errors.New("object does not exist in bucket") +) + +// TxnUnspents maps from coin.Transaction hash to its expected unspents. The unspents' +// Head can be different at execution time, but the Unspent's hash is fixed. +type TxnUnspents map[cipher.SHA256]coin.UxArray + +// AllForAddress returns all Unspents for a single address +func (tus TxnUnspents) AllForAddress(a cipher.Address) coin.UxArray { + uxo := make(coin.UxArray, 0) + for _, uxa := range tus { + for i := range uxa { + if uxa[i].Body.Address == a { + uxo = append(uxo, uxa[i]) + } + } + } + return uxo +} + +// UnconfirmedTxn unconfirmed transaction +type UnconfirmedTxn struct { + Txn coin.Transaction + // Time the txn was last received + Received int64 + // Time the txn was last checked against the blockchain + Checked int64 + // Last time we announced this txn + Announced int64 + // If this txn is valid + IsValid int8 +} + +// Hash returns the coin.Transaction's hash +func (ut *UnconfirmedTxn) Hash() cipher.SHA256 { + return ut.Txn.Hash() +} + +// unconfirmed transactions bucket +type unconfirmedTxns struct{} + +func (utb *unconfirmedTxns) get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) { + var txn UnconfirmedTxn + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnconfirmedTxnsBkt, []byte(hash.Hex()), &txn); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return &txn, nil +} + +func (utb *unconfirmedTxns) put(tx *dbutil.Tx, v *UnconfirmedTxn) error { + return dbutil.PutBucketValue(tx, UnconfirmedTxnsBkt, []byte(v.Hash().Hex()), encoder.Serialize(v)) +} + +func (utb *unconfirmedTxns) update(tx *dbutil.Tx, hash cipher.SHA256, f func(v *UnconfirmedTxn) error) error { + txn, err := utb.get(tx, hash) + if err != nil { + return err + } + + if txn == nil { + return errUpdateObjectDoesNotExist + } + + if err := f(txn); err != nil { + return err + } + + return utb.put(tx, txn) +} + +func (utb *unconfirmedTxns) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) getAll(tx *dbutil.Tx) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(_, v []byte) error { + var txn UnconfirmedTxn + if err := encoder.DeserializeRaw(v, &txn); err != nil { + return err + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + return txns, nil +} + +func (utb *unconfirmedTxns) hasKey(tx *dbutil.Tx, hash cipher.SHA256) (bool, error) { + return dbutil.BucketHasKey(tx, UnconfirmedTxnsBkt, []byte(hash.Hex())) +} + +func (utb *unconfirmedTxns) forEach(tx *dbutil.Tx, f func(hash cipher.SHA256, tx UnconfirmedTxn) error) error { + return dbutil.ForEach(tx, UnconfirmedTxnsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) + if err != nil { + return err + } + + var txn UnconfirmedTxn + if err := encoder.DeserializeRaw(v, &txn); err != nil { + return err + } + + return f(hash, txn) + }) +} + +func (utb *unconfirmedTxns) length(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedTxnsBkt) +} + +type txUnspents struct{} + +func (txus *txUnspents) put(tx *dbutil.Tx, hash cipher.SHA256, uxs coin.UxArray) error { + return dbutil.PutBucketValue(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), encoder.Serialize(uxs)) +} + +func (txus *txUnspents) get(tx *dbutil.Tx, hash cipher.SHA256) (coin.UxArray, error) { + var uxs coin.UxArray + + if ok, err := dbutil.GetBucketObjectDecoded(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex()), &uxs); err != nil { + return nil, err + } else if !ok { + return nil, nil + } + + return uxs, nil +} + +func (txus *txUnspents) length(tx *dbutil.Tx) (uint64, error) { + return dbutil.Len(tx, UnconfirmedUnspentsBkt) +} + +func (txus *txUnspents) delete(tx *dbutil.Tx, hash cipher.SHA256) error { + return dbutil.Delete(tx, UnconfirmedUnspentsBkt, []byte(hash.Hex())) +} + +func (txus *txUnspents) getByAddr(tx *dbutil.Tx, a cipher.Address) (coin.UxArray, error) { + var uxo coin.UxArray + + if err := dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(_, v []byte) error { + var uxa coin.UxArray + if err := encoder.DeserializeRaw(v, &uxa); err != nil { + return err + } + + for i := range uxa { + if uxa[i].Body.Address == a { + uxo = append(uxo, uxa[i]) + } + } + + return nil + }); err != nil { + return nil, err + } + + return uxo, nil +} + +func (txus *txUnspents) forEach(tx *dbutil.Tx, f func(cipher.SHA256, coin.UxArray) error) error { + return dbutil.ForEach(tx, UnconfirmedUnspentsBkt, func(k, v []byte) error { + hash, err := cipher.SHA256FromHex(string(k)) + if err != nil { + return err + } + + var uxa coin.UxArray + if err := encoder.DeserializeRaw(v, &uxa); err != nil { + return err + } + + return f(hash, uxa) + }) +} + +// UnconfirmedTxnPool manages unconfirmed transactions +type UnconfirmedTxnPool struct { + db *dbutil.DB + txns *unconfirmedTxns + // Predicted unspents, assuming txns are valid. Needed to predict + // our future balance and avoid double spending our own coins + // Maps from Transaction.Hash() to UxArray. + unspent *txUnspents +} + +// NewUnconfirmedTxnPool creates an UnconfirmedTxnPool instance +func NewUnconfirmedTxnPool(db *dbutil.DB) (*UnconfirmedTxnPool, error) { + if err := db.View("Check unconfirmed txn pool size", func(tx *dbutil.Tx) error { + n, err := dbutil.Len(tx, UnconfirmedTxnsBkt) + if err != nil { + return err + } + + logger.Infof("Unconfirmed transaction pool size: %d", n) + return nil + }); err != nil { + return nil, err + } + + return &UnconfirmedTxnPool{ + db: db, + txns: &unconfirmedTxns{}, + unspent: &txUnspents{}, + }, nil +} + +// SetTxnsAnnounced updates announced time of specific tx +func (utp *UnconfirmedTxnPool) SetTxnsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error { + var txns []*UnconfirmedTxn + for h, t := range hashes { + txn, err := utp.txns.get(tx, h) + if err != nil { + return err + } + + if txn == nil { + logger.Warningf("UnconfirmedTxnPool.SetTxnsAnnounced: UnconfirmedTxn %s not found in DB", h.Hex()) + continue + } + + if t > txn.Announced { + txn.Announced = t + txns = append(txns, txn) + } + } + + for _, txn := range txns { + if err := utp.txns.put(tx, txn); err != nil { + return err + } + } + + return nil +} + +func createUnconfirmedTxn(txn coin.Transaction) UnconfirmedTxn { + now := utc.Now() + return UnconfirmedTxn{ + Txn: txn, + Received: now.UnixNano(), + Checked: now.UnixNano(), + Announced: time.Time{}.UnixNano(), + } +} + +// InjectTransaction adds a coin.Transaction to the pool, or updates an existing one's timestamps +// Returns an error if txn is invalid, and whether the transaction already +// existed in the pool. +// If the transaction violates hard constraints, it is rejected. +// Soft constraints violations mark a txn as invalid, but the txn is inserted. The soft violation is returned. +func (utp *UnconfirmedTxnPool) InjectTransaction(tx *dbutil.Tx, bc Blockchainer, txn coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) { + var isValid int8 = 1 + var softErr *ErrTxnViolatesSoftConstraint + if err := bc.VerifySingleTxnSoftHardConstraints(tx, txn, maxSize); err != nil { + logger.Warningf("bc.VerifySingleTxnSoftHardConstraints failed for txn %s: %v", txn.TxIDHex(), err) + switch err.(type) { + case ErrTxnViolatesSoftConstraint: + e := err.(ErrTxnViolatesSoftConstraint) + softErr = &e + isValid = 0 + case ErrTxnViolatesHardConstraint: + return false, nil, err + default: + return false, nil, err + } + } + + hash := txn.Hash() + + known, err := utp.txns.hasKey(tx, hash) + if err != nil { + logger.Errorf("InjectTransaction check txn exists failed: %v", err) + return false, nil, err + } + + // Update if we already have this txn + if known { + if err := utp.txns.update(tx, hash, func(utxn *UnconfirmedTxn) error { + now := utc.Now().UnixNano() + utxn.Received = now + utxn.Checked = now + utxn.IsValid = isValid + return nil + }); err != nil { + logger.Errorf("InjectTransaction update known txn failed: %v", err) + return false, nil, err + } + + return true, softErr, nil + } + + utx := createUnconfirmedTxn(txn) + utx.IsValid = isValid + + // add txn to index + if err := utp.txns.put(tx, &utx); err != nil { + logger.Errorf("InjectTransaction put new unconfirmed txn failed: %v", err) + return false, nil, err + } + + head, err := bc.Head(tx) + if err != nil { + logger.Errorf("InjectTransaction bc.Head() failed: %v", err) + return false, nil, err + } + + // update unconfirmed unspent + if err := utp.unspent.put(tx, hash, coin.CreateUnspents(head.Head, txn)); err != nil { + logger.Errorf("InjectTransaction put new unspent outputs: %v", err) + return false, nil, err + } + + return false, softErr, nil +} + +// RawTxns returns underlying coin.Transactions +func (utp *UnconfirmedTxnPool) RawTxns(tx *dbutil.Tx) (coin.Transactions, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + txns := make(coin.Transactions, len(utxns)) + for i := range utxns { + txns[i] = utxns[i].Txn + } + return txns, nil +} + +// Remove a single txn by hash +func (utp *UnconfirmedTxnPool) removeTxn(tx *dbutil.Tx, txHash cipher.SHA256) error { + if err := utp.txns.delete(tx, txHash); err != nil { + return err + } + + return utp.unspent.delete(tx, txHash) +} + +// RemoveTransactions remove transactions with dbutil.Tx +func (utp *UnconfirmedTxnPool) RemoveTransactions(tx *dbutil.Tx, txHashes []cipher.SHA256) error { + for i := range txHashes { + if err := utp.removeTxn(tx, txHashes[i]); err != nil { + return err + } + } + + return nil +} + +// Refresh checks all unconfirmed txns against the blockchain. +// If the transaction becomes invalid it is marked invalid. +// If the transaction becomes valid it is marked valid and is returned to the caller. +func (utp *UnconfirmedTxnPool) Refresh(tx *dbutil.Tx, bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) { + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + now := utc.Now() + var nowValid []cipher.SHA256 + + for _, utxn := range utxns { + utxn.Checked = now.UnixNano() + + err := bc.VerifySingleTxnSoftHardConstraints(tx, utxn.Txn, maxBlockSize) + + switch err.(type) { + case ErrTxnViolatesSoftConstraint, ErrTxnViolatesHardConstraint: + utxn.IsValid = 0 + case nil: + if utxn.IsValid == 0 { + nowValid = append(nowValid, utxn.Hash()) + } + utxn.IsValid = 1 + default: + return nil, err + } + + if err := utp.txns.put(tx, &utxn); err != nil { + return nil, err + } + } + + return nowValid, nil +} + +// RemoveInvalid checks all unconfirmed txns against the blockchain. +// If a transaction violates hard constraints it is removed from the pool. +// The transactions that were removed are returned. +func (utp *UnconfirmedTxnPool) RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) { + var removeUtxns []cipher.SHA256 + + utxns, err := utp.txns.getAll(tx) + if err != nil { + return nil, err + } + + for _, utxn := range utxns { + err := bc.VerifySingleTxnHardConstraints(tx, utxn.Txn) + if err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint: + removeUtxns = append(removeUtxns, utxn.Hash()) + default: + return nil, err + } + } + } + + if err := utp.RemoveTransactions(tx, removeUtxns); err != nil { + return nil, err + } + + return removeUtxns, nil +} + +// GetUnknown returns txn hashes with known ones removed +func (utp *UnconfirmedTxnPool) GetUnknown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) { + var unknown []cipher.SHA256 + + for _, h := range txns { + if hasKey, err := utp.txns.hasKey(tx, h); err != nil { + return nil, err + } else if !hasKey { + unknown = append(unknown, h) + } + } + + return unknown, nil +} + +// GetKnown returns all known coin.Transactions from the pool, given hashes to select +func (utp *UnconfirmedTxnPool) GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) { + var known coin.Transactions + + for _, h := range txns { + if tx, err := utp.txns.get(tx, h); err != nil { + return nil, err + } else if tx != nil { + known = append(known, tx.Txn) + } + } + + return known, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (utp *UnconfirmedTxnPool) RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) { + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + for i, o := range txn.Txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn.Txn, i) + if err != nil { + return err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + return nil + }); err != nil { + return nil, err + } + + return auxs, nil +} + +// txnOutputsForAddrs returns unspent outputs assigned to addresses in addrs, created by a set of transactions +func txnOutputsForAddrs(bh coin.BlockHeader, addrs []cipher.Address, txns []coin.Transaction) (coin.AddressUxOuts, error) { + if len(txns) == 0 || len(addrs) == 0 { + return nil, nil + } + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + + for _, txn := range txns { + for i, o := range txn.Out { + if _, ok := addrm[o.Address]; ok { + uxout, err := coin.CreateUnspent(bh, txn, i) + if err != nil { + return nil, err + } + + auxs[o.Address] = append(auxs[o.Address], uxout) + } + } + } + + return auxs, nil +} + +// GetIncomingOutputs returns all predicted incoming outputs. +func (utp *UnconfirmedTxnPool) GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) { + var outs coin.UxArray + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + uxOuts := coin.CreateUnspents(bh, txn.Txn) + outs = append(outs, uxOuts...) + return nil + }); err != nil { + return nil, err + } + + return outs, nil +} + +// Get returns the unconfirmed transaction of given tx hash. +func (utp *UnconfirmedTxnPool) Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) { + return utp.txns.get(tx, hash) +} + +// GetTxns returns all transactions that can pass the filter +func (utp *UnconfirmedTxnPool) GetTxns(tx *dbutil.Tx, filter func(UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := utp.txns.forEach(tx, func(_ cipher.SHA256, txn UnconfirmedTxn) error { + if filter(txn) { + txns = append(txns, txn) + } + return nil + }); err != nil { + logger.Errorf("GetTxns error: %v", err) + return nil, err + } + + return txns, nil +} + +// GetTxHashes returns transaction hashes that can pass the filter +func (utp *UnconfirmedTxnPool) GetTxHashes(tx *dbutil.Tx, filter func(UnconfirmedTxn) bool) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := utp.txns.forEach(tx, func(hash cipher.SHA256, txn UnconfirmedTxn) error { + if filter(txn) { + hashes = append(hashes, hash) + } + return nil + }); err != nil { + logger.Errorf("GetTxHashes error: %v", err) + return nil, err + } + + return hashes, nil +} + +// ForEach iterate the pool with given callback function +func (utp *UnconfirmedTxnPool) ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTxn) error) error { + return utp.txns.forEach(tx, f) +} + +// GetUnspentsOfAddr returns unspent outputs of given address in unspent tx pool +func (utp *UnconfirmedTxnPool) GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) { + return utp.unspent.getByAddr(tx, addr) +} + +// IsValid can be used as filter function +func IsValid(tx UnconfirmedTxn) bool { + return tx.IsValid == 1 +} + +// All use as return all filter +func All(tx UnconfirmedTxn) bool { + return true +} + +// Len returns the number of unconfirmed transactions +func (utp *UnconfirmedTxnPool) Len(tx *dbutil.Tx) (uint64, error) { + return utp.txns.length(tx) +} + +func nanoToTime(n int64) time.Time { + zeroTime := time.Time{} + if n == zeroTime.UnixNano() { + // maximum time + return zeroTime + } + return time.Unix(n/int64(time.Second), n%int64(time.Second)) +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_txn_pooler_mock_test.go b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_txn_pooler_mock_test.go new file mode 100755 index 0000000..ac7daed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/unconfirmed_txn_pooler_mock_test.go @@ -0,0 +1,439 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package visor + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// UnconfirmedTxnPoolerMock mock +type UnconfirmedTxnPoolerMock struct { + mock.Mock +} + +func NewUnconfirmedTxnPoolerMock() *UnconfirmedTxnPoolerMock { + return &UnconfirmedTxnPoolerMock{} +} + +// ForEach mocked method +func (m *UnconfirmedTxnPoolerMock) ForEach(p0 *dbutil.Tx, p1 func(cipher.SHA256, UnconfirmedTxn) error) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// Get mocked method +func (m *UnconfirmedTxnPoolerMock) Get(p0 *dbutil.Tx, p1 cipher.SHA256) (*UnconfirmedTxn, error) { + + ret := m.Called(p0, p1) + + var r0 *UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case *UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetIncomingOutputs mocked method +func (m *UnconfirmedTxnPoolerMock) GetIncomingOutputs(p0 *dbutil.Tx, p1 coin.BlockHeader) (coin.UxArray, error) { + + ret := m.Called(p0, p1) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetKnown mocked method +func (m *UnconfirmedTxnPoolerMock) GetKnown(p0 *dbutil.Tx, p1 []cipher.SHA256) (coin.Transactions, error) { + + ret := m.Called(p0, p1) + + var r0 coin.Transactions + switch res := ret.Get(0).(type) { + case nil: + case coin.Transactions: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTxHashes mocked method +func (m *UnconfirmedTxnPoolerMock) GetTxHashes(p0 *dbutil.Tx, p1 func(tx UnconfirmedTxn) bool) ([]cipher.SHA256, error) { + + ret := m.Called(p0, p1) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetTxns mocked method +func (m *UnconfirmedTxnPoolerMock) GetTxns(p0 *dbutil.Tx, p1 func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + + ret := m.Called(p0, p1) + + var r0 []UnconfirmedTxn + switch res := ret.Get(0).(type) { + case nil: + case []UnconfirmedTxn: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnknown mocked method +func (m *UnconfirmedTxnPoolerMock) GetUnknown(p0 *dbutil.Tx, p1 []cipher.SHA256) ([]cipher.SHA256, error) { + + ret := m.Called(p0, p1) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnspentsOfAddr mocked method +func (m *UnconfirmedTxnPoolerMock) GetUnspentsOfAddr(p0 *dbutil.Tx, p1 cipher.Address) (coin.UxArray, error) { + + ret := m.Called(p0, p1) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// InjectTransaction mocked method +func (m *UnconfirmedTxnPoolerMock) InjectTransaction(p0 *dbutil.Tx, p1 Blockchainer, p2 coin.Transaction, p3 int) (bool, *ErrTxnViolatesSoftConstraint, error) { + + ret := m.Called(p0, p1, p2, p3) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 *ErrTxnViolatesSoftConstraint + switch res := ret.Get(1).(type) { + case nil: + case *ErrTxnViolatesSoftConstraint: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r2 error + switch res := ret.Get(2).(type) { + case nil: + case error: + r2 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1, r2 + +} + +// Len mocked method +func (m *UnconfirmedTxnPoolerMock) Len(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// RawTxns mocked method +func (m *UnconfirmedTxnPoolerMock) RawTxns(p0 *dbutil.Tx) (coin.Transactions, error) { + + ret := m.Called(p0) + + var r0 coin.Transactions + switch res := ret.Get(0).(type) { + case nil: + case coin.Transactions: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// RecvOfAddresses mocked method +func (m *UnconfirmedTxnPoolerMock) RecvOfAddresses(p0 *dbutil.Tx, p1 coin.BlockHeader, p2 []cipher.Address) (coin.AddressUxOuts, error) { + + ret := m.Called(p0, p1, p2) + + var r0 coin.AddressUxOuts + switch res := ret.Get(0).(type) { + case nil: + case coin.AddressUxOuts: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Refresh mocked method +func (m *UnconfirmedTxnPoolerMock) Refresh(p0 *dbutil.Tx, p1 Blockchainer, p2 int) ([]cipher.SHA256, error) { + + ret := m.Called(p0, p1, p2) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// RemoveInvalid mocked method +func (m *UnconfirmedTxnPoolerMock) RemoveInvalid(p0 *dbutil.Tx, p1 Blockchainer) ([]cipher.SHA256, error) { + + ret := m.Called(p0, p1) + + var r0 []cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case []cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// RemoveTransactions mocked method +func (m *UnconfirmedTxnPoolerMock) RemoveTransactions(p0 *dbutil.Tx, p1 []cipher.SHA256) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// SetTxnsAnnounced mocked method +func (m *UnconfirmedTxnPoolerMock) SetTxnsAnnounced(p0 *dbutil.Tx, p1 map[cipher.SHA256]int64) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/unspent_pooler_mock_test.go b/vendor/github.com/skycoin/skycoin/src/visor/unspent_pooler_mock_test.go new file mode 100755 index 0000000..0061373 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/unspent_pooler_mock_test.go @@ -0,0 +1,277 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/ernesto-jimenez/goautomock +* THIS FILE MUST NEVER BE EDITED MANUALLY + */ + +package visor + +import ( + "fmt" + + mock "github.com/stretchr/testify/mock" + + cipher "github.com/skycoin/skycoin/src/cipher" + coin "github.com/skycoin/skycoin/src/coin" + dbutil "github.com/skycoin/skycoin/src/visor/dbutil" +) + +// UnspentPoolerMock mock +type UnspentPoolerMock struct { + mock.Mock +} + +func NewUnspentPoolerMock() *UnspentPoolerMock { + return &UnspentPoolerMock{} +} + +// AddressCount mocked method +func (m *UnspentPoolerMock) AddressCount(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Contains mocked method +func (m *UnspentPoolerMock) Contains(p0 *dbutil.Tx, p1 cipher.SHA256) (bool, error) { + + ret := m.Called(p0, p1) + + var r0 bool + switch res := ret.Get(0).(type) { + case nil: + case bool: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Get mocked method +func (m *UnspentPoolerMock) Get(p0 *dbutil.Tx, p1 cipher.SHA256) (*coin.UxOut, error) { + + ret := m.Called(p0, p1) + + var r0 *coin.UxOut + switch res := ret.Get(0).(type) { + case nil: + case *coin.UxOut: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetAll mocked method +func (m *UnspentPoolerMock) GetAll(p0 *dbutil.Tx) (coin.UxArray, error) { + + ret := m.Called(p0) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetArray mocked method +func (m *UnspentPoolerMock) GetArray(p0 *dbutil.Tx, p1 []cipher.SHA256) (coin.UxArray, error) { + + ret := m.Called(p0, p1) + + var r0 coin.UxArray + switch res := ret.Get(0).(type) { + case nil: + case coin.UxArray: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUnspentsOfAddrs mocked method +func (m *UnspentPoolerMock) GetUnspentsOfAddrs(p0 *dbutil.Tx, p1 []cipher.Address) (coin.AddressUxOuts, error) { + + ret := m.Called(p0, p1) + + var r0 coin.AddressUxOuts + switch res := ret.Get(0).(type) { + case nil: + case coin.AddressUxOuts: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// GetUxHash mocked method +func (m *UnspentPoolerMock) GetUxHash(p0 *dbutil.Tx) (cipher.SHA256, error) { + + ret := m.Called(p0) + + var r0 cipher.SHA256 + switch res := ret.Get(0).(type) { + case nil: + case cipher.SHA256: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// Len mocked method +func (m *UnspentPoolerMock) Len(p0 *dbutil.Tx) (uint64, error) { + + ret := m.Called(p0) + + var r0 uint64 + switch res := ret.Get(0).(type) { + case nil: + case uint64: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + var r1 error + switch res := ret.Get(1).(type) { + case nil: + case error: + r1 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0, r1 + +} + +// MaybeBuildIndexes mocked method +func (m *UnspentPoolerMock) MaybeBuildIndexes(p0 *dbutil.Tx, p1 uint64) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} + +// ProcessBlock mocked method +func (m *UnspentPoolerMock) ProcessBlock(p0 *dbutil.Tx, p1 *coin.SignedBlock) error { + + ret := m.Called(p0, p1) + + var r0 error + switch res := ret.Get(0).(type) { + case nil: + case error: + r0 = res + default: + panic(fmt.Sprintf("unexpected type: %v", res)) + } + + return r0 + +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/verify.go b/vendor/github.com/skycoin/skycoin/src/visor/verify.go new file mode 100755 index 0000000..ddda6a9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/verify.go @@ -0,0 +1,305 @@ +package visor + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/fee" +) + +/* + +verify.go: Methods for handling transaction verification + +There are two levels of transaction constraint: HARD and SOFT +There are two situations in which transactions are verified: + * When included in a block + * When not in a block + +For transactions in a block, use VerifyBlockTxnConstraints. +For transactions outside of a block, use VerifySingleTxnHardConstraints and VerifySingleTxnSoftConstraints. + +VerifyBlockTxnConstraints only checks hard constraints. Soft constraints do not apply for transactions inside of a block. + +Soft and hard constraints have special handling for single transactions. + +When the transaction is received over the network, a transaction is not injected to the pool if it violates the HARD constraints. +If it violates soft constraints, it is still injected to the pool (TODO: with expiration) but is not rebroadcast to peers. +If it does not violate any constraints it is injected and rebroadcast to peers. + +When the transaction is created by the user (with create_rawtx or /spend), SOFT and HARD constraints apply, to prevent +the user from injecting a transaction to their local pool that cannot be confirmed. + +When creating a new block from transactions, SOFT and HARD constraints apply. + +Transactions in the unconfirmed pool are periodically checked for validity. (TODO: audit/implement this feature) +The transaction pool state transfer phases are as follows: + valid -> hard_invalid: remove + valid -> soft_invalid: mark as invalid + soft_invalid -> valid: mark as valid, broadcast + soft_invalid -> hard_invalid: remove + soft_invalid -> expired: remove + +HARD constraints can NEVER be violated. These include: + - Malformed transaction + - Double spends + - NOTE: Double spend verification must be done against the unspent output set, + the methods here do not operate on the unspent output set. + They accept a `uxIn coin.UxArray` argument, which are the unspents associated + with the transaction's inputs. The unspents must be queried from the unspent + output set first, thus if any unspent is not found for the input, it cannot be spent. + +SOFT constraints are based upon mutable parameters. These include: + - Max block size (transaction must not be larger than this value) + - Insufficient coin hour burn fee + - Timelocked distribution addresses + - Decimal place restrictions + +NOTE: Due to a bug which allowed overflowing output coin hours to be included in a block, + overflowing output coin hours are not checked when adding a signed block, so that the existing blocks can be processed. + When creating or receiving a single transaction from the network, it is treated as a HARD constraint. + +These methods should be called via the Blockchain object when possible, +using Blockchain.VerifyBlockTxnConstraints, Blockchain.VerifySingleTxnHardConstraints and Blockchain.VerifySingleTxnSoftHardConstraints +since data from the blockchain and unspent output set are required to fully validate a transaction. + +*/ + +var ( + errTxnExceedsMaxBlockSize = errors.New("Transaction size bigger than max block size") + errTxnIsLocked = errors.New("Transaction has locked address inputs") +) + +// ErrTxnViolatesHardConstraint is returned when a transaction violates hard constraints +type ErrTxnViolatesHardConstraint struct { + Err error +} + +// NewErrTxnViolatesHardConstraint creates ErrTxnViolatesHardConstraint +func NewErrTxnViolatesHardConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesHardConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesHardConstraint) Error() string { + return fmt.Sprintf("Transaction violates hard constraint: %v", e.Err) +} + +// ErrTxnViolatesSoftConstraint is returned when a transaction violates soft constraints +type ErrTxnViolatesSoftConstraint struct { + Err error +} + +// NewErrTxnViolatesSoftConstraint creates ErrTxnViolatesSoftConstraint +func NewErrTxnViolatesSoftConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesSoftConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesSoftConstraint) Error() string { + return fmt.Sprintf("Transaction violates soft constraint: %v", e.Err) +} + +// ErrTxnViolatesUserConstraint is returned when a transaction violates user constraints +type ErrTxnViolatesUserConstraint struct { + Err error +} + +// NewErrTxnViolatesUserConstraint creates ErrTxnViolatesUserConstraint +func NewErrTxnViolatesUserConstraint(err error) error { + if err == nil { + return nil + } + return ErrTxnViolatesUserConstraint{ + Err: err, + } +} + +func (e ErrTxnViolatesUserConstraint) Error() string { + return fmt.Sprintf("Transaction violates user constraint: %v", e.Err) +} + +// VerifySingleTxnSoftConstraints returns an error if any "soft" constraint are violated. +// "soft" constaints are enforced at the network and block publication level, +// but are not enforced at the blockchain level. +// Clients will not accept blocks that violate hard constraints, but will +// accept blocks that violate soft constraints. +// Checks: +// * That the transaction size is not greater than the max block total transaction size +// * That the transaction burn enough coin hours (the fee) +// * That if that transaction does not spend from a locked distribution address +// * That the transaction does not create outputs with a higher decimal precision than is allowed +func VerifySingleTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, maxSize int) error { + if err := verifyTxnSoftConstraints(txn, headTime, uxIn, maxSize); err != nil { + return NewErrTxnViolatesSoftConstraint(err) + } + + return nil +} + +func verifyTxnSoftConstraints(txn coin.Transaction, headTime uint64, uxIn coin.UxArray, maxSize int) error { + if txn.Size() > maxSize { + return errTxnExceedsMaxBlockSize + } + + f, err := fee.TransactionFee(&txn, headTime, uxIn) + if err != nil { + return err + } + + if err := fee.VerifyTransactionFee(&txn, f); err != nil { + return err + } + + if TransactionIsLocked(uxIn) { + return errTxnIsLocked + } + + // Reject transactions that do not conform to decimal restrictions + for _, o := range txn.Out { + if err := DropletPrecisionCheck(o.Coins); err != nil { + return err + } + } + + return nil +} + +// VerifySingleTxnHardConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input and output hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +func VerifySingleTxnHardConstraints(txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + // Check for output hours overflow + // When verifying a single transaction, this is considered a hard constraint. + // For transactions inside of a block, it is a soft constraint. + // This is due to a bug which allowed some blocks to be published with overflowing hours, + // otherwise this would always be a hard constraint. + if _, err := txn.OutputHours(); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + // Check for input CoinHours calculation overflow, since it is ignored by + // VerifyTransactionHoursSpending + for _, ux := range uxIn { + if _, err := ux.CoinHours(head.Time()); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + } + + if err := verifyTxnHardConstraints(txn, head, uxIn); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +// VerifyBlockTxnConstraints returns an error if any "hard" constraints are violated. +// "hard" constraints are always enforced and if violated the transaction +// should not be included in any block and any block that includes such a transaction +// should be rejected. +// Checks: +// * That the inputs to the transaction exist +// * That the transaction does not create or destroy coins +// * That the signatures on the transaction are valid +// * That there are no duplicate ux inputs +// * That there are no duplicate outputs +// * That the transaction input and output coins do not overflow uint64 +// * That the transaction input hours do not overflow uint64 +// NOTE: Double spends are checked against the unspent output pool when querying for uxIn +// NOTE: output hours overflow is treated as a soft constraint for transactions inside of a block, due to a bug +// which allowed some blocks to be published with overflowing output hours. +func VerifyBlockTxnConstraints(txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + if err := verifyTxnHardConstraints(txn, head, uxIn); err != nil { + return NewErrTxnViolatesHardConstraint(err) + } + + return nil +} + +func verifyTxnHardConstraints(txn coin.Transaction, head *coin.SignedBlock, uxIn coin.UxArray) error { + //CHECKLIST: DONE: check for duplicate ux inputs/double spending + // NOTE: Double spends are checked against the unspent output pool when querying for uxIn + + //CHECKLIST: DONE: check that inputs of transaction have not been spent + //CHECKLIST: DONE: check there are no duplicate outputs + + // Q: why are coin hours based on last block time and not + // current time? + // A: no two computers will agree on system time. Need system clock + // indepedent timing that everyone agrees on. fee values would depend on + // local clock + + // Check transaction type and length + // Check for duplicate outputs + // Check for duplicate inputs + // Check for invalid hash + // Check for no inputs + // Check for no outputs + // Check for zero coin outputs + // Check valid looking signatures + + if err := txn.Verify(); err != nil { + return err + } + + // Checks whether ux inputs exist, + // Check that signatures are allowed to spend inputs + if err := txn.VerifyInput(uxIn); err != nil { + return err + } + + uxOut := coin.CreateUnspents(head.Head, txn) + + // Check that there are any duplicates within this set + // NOTE: This should already be checked by txn.Verify() + if uxOut.HasDupes() { + return errors.New("Duplicate output in transaction") + } + + // Check that no coins are created or destroyed + if err := coin.VerifyTransactionCoinsSpending(uxIn, uxOut); err != nil { + return err + } + + // Check that no hours are created + // NOTE: this check doesn't catch overflow errors in the addition of hours + // Some blocks had their hours overflow, and if this rule was checked here, + // existing blocks would invalidate. + // The hours overflow check is handled as an extra step in the SingleTxnHard constraints, + // to allow existing blocks which violate the overflow rules to pass. + return coin.VerifyTransactionHoursSpending(head.Time(), uxIn, uxOut) +} + +// VerifySingleTxnUserConstraints applies additional verification for a +// transaction created by the user. +// This is distinct from transactions created by other users (i.e. received over the network), +// and from transactions included in blocks. +func VerifySingleTxnUserConstraints(txn coin.Transaction) error { + for _, o := range txn.Out { + if o.Address.Null() { + err := errors.New("Transaction output is sent to the null address") + return NewErrTxnViolatesUserConstraint(err) + } + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/visor.go b/vendor/github.com/skycoin/skycoin/src/visor/visor.go new file mode 100755 index 0000000..423a5d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/visor.go @@ -0,0 +1,2105 @@ +package visor + +import ( + "errors" + "fmt" + "sort" + + "time" + + "github.com/sirupsen/logrus" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/util/droplet" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" + + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + logger = logging.MustGetLogger("visor") + + // errInvalidDecimals is returned by DropletPrecisionCheck if a coin amount has an invalid number of decimal places + errInvalidDecimals = errors.New("invalid amount, too many decimal places") + + // maxDropletDivisor represents the modulus divisor when checking droplet precision rules. + // It is computed from MaxDropletPrecision in init() + maxDropletDivisor uint64 +) + +// MaxDropletDivisor represents the modulus divisor when checking droplet precision rules. +func MaxDropletDivisor() uint64 { + // The value is wrapped in a getter to make it immutable to external packages + return maxDropletDivisor +} + +func init() { + sanityCheck() + // Compute maxDropletDivisor from precision + maxDropletDivisor = calculateDivisor(MaxDropletPrecision) +} + +func sanityCheck() { + if InitialUnlockedCount > DistributionAddressesTotal { + logger.Panic("unlocked addresses > total distribution addresses") + } + + if uint64(len(distributionAddresses)) != DistributionAddressesTotal { + logger.Panic("available distribution addresses > total allowed distribution addresses") + } + + if DistributionAddressInitialBalance*DistributionAddressesTotal > MaxCoinSupply { + logger.Panic("total balance in distribution addresses > max coin supply") + } +} + +func calculateDivisor(precision uint64) uint64 { + if precision > droplet.Exponent { + logger.Panic("precision must be <= droplet.Exponent") + } + + n := droplet.Exponent - precision + var i uint64 = 1 + for k := uint64(0); k < n; k++ { + i = i * 10 + } + return i +} + +// DropletPrecisionCheck checks if an amount of coins is valid given decimal place restrictions +func DropletPrecisionCheck(amount uint64) error { + if amount%maxDropletDivisor != 0 { + return errInvalidDecimals + } + return nil +} + +// BuildInfo represents the build info +type BuildInfo struct { + Version string `json:"version"` // version number + Commit string `json:"commit"` // git commit id + Branch string `json:"branch"` // git branch name +} + +// Config configuration parameters for the Visor +type Config struct { + // Is this the master blockchain + IsMaster bool + + //Public key of blockchain authority + BlockchainPubkey cipher.PubKey + + //Secret key of blockchain authority (if master) + BlockchainSeckey cipher.SecKey + + // Maximum size of a block, in bytes. + MaxBlockSize int + + // Where the blockchain is saved + BlockchainFile string + // Where the block signatures are saved + BlockSigsFile string + + //address for genesis + GenesisAddress cipher.Address + // Genesis block sig + GenesisSignature cipher.Sig + // Genesis block timestamp + GenesisTimestamp uint64 + // Number of coins in genesis block + GenesisCoinVolume uint64 + // bolt db file path + DBPath string + // enable arbitrating mode + Arbitrating bool + // wallet directory + WalletDirectory string + // build info, including version, build time etc. + BuildInfo BuildInfo + // enables wallet API + EnableWalletAPI bool + // enables seed API + EnableSeedAPI bool + // wallet crypto type + WalletCryptoType wallet.CryptoType +} + +// NewVisorConfig put cap on block size, not on transactions/block +//Skycoin transactions are smaller than Bitcoin transactions so skycoin has +//a higher transactions per second for the same block size +func NewVisorConfig() Config { + c := Config{ + IsMaster: false, + + BlockchainPubkey: cipher.PubKey{}, + BlockchainSeckey: cipher.SecKey{}, + + MaxBlockSize: DefaultMaxBlockSize, + + GenesisAddress: cipher.Address{}, + GenesisSignature: cipher.Sig{}, + GenesisTimestamp: 0, + GenesisCoinVolume: 0, //100e12, 100e6 * 10e6 + } + + return c +} + +// Verify verifies the configuration +func (c Config) Verify() error { + if c.IsMaster { + if c.BlockchainPubkey != cipher.PubKeyFromSecKey(c.BlockchainSeckey) { + return errors.New("Cannot run in master: invalid seckey for pubkey") + } + } + + return nil +} + +//go:generate go install +//go:generate goautomock -template=testify Historyer + +// Historyer is the interface that provides methods for accessing history data that are parsed from blockchain. +type Historyer interface { + GetUxOuts(tx *dbutil.Tx, uxids []cipher.SHA256) ([]*historydb.UxOut, error) + ParseBlock(tx *dbutil.Tx, b coin.Block) error + GetTransaction(tx *dbutil.Tx, hash cipher.SHA256) (*historydb.Transaction, error) + GetAddrUxOuts(tx *dbutil.Tx, address cipher.Address) ([]*historydb.UxOut, error) + GetAddressTxns(tx *dbutil.Tx, address cipher.Address) ([]historydb.Transaction, error) + NeedsReset(tx *dbutil.Tx) (bool, error) + Erase(tx *dbutil.Tx) error + ParsedBlockSeq(tx *dbutil.Tx) (uint64, bool, error) + ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error +} + +// Blockchainer is the interface that provides methods for accessing the blockchain data +type Blockchainer interface { + GetGenesisBlock(tx *dbutil.Tx) (*coin.SignedBlock, error) + GetBlocks(tx *dbutil.Tx, start, end uint64) ([]coin.SignedBlock, error) + GetLastBlocks(tx *dbutil.Tx, n uint64) ([]coin.SignedBlock, error) + GetSignedBlockByHash(tx *dbutil.Tx, hash cipher.SHA256) (*coin.SignedBlock, error) + GetSignedBlockBySeq(tx *dbutil.Tx, seq uint64) (*coin.SignedBlock, error) + Unspent() blockdb.UnspentPooler + Len(tx *dbutil.Tx) (uint64, error) + Head(tx *dbutil.Tx) (*coin.SignedBlock, error) + HeadSeq(tx *dbutil.Tx) (uint64, bool, error) + Time(tx *dbutil.Tx) (uint64, error) + NewBlock(tx *dbutil.Tx, txns coin.Transactions, currentTime uint64) (*coin.Block, error) + ExecuteBlock(tx *dbutil.Tx, sb *coin.SignedBlock) error + VerifyBlockTxnConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnHardConstraints(tx *dbutil.Tx, txn coin.Transaction) error + VerifySingleTxnSoftHardConstraints(tx *dbutil.Tx, txn coin.Transaction, maxSize int) error + TransactionFee(tx *dbutil.Tx, hours uint64) coin.FeeCalculator +} + +// UnconfirmedTxnPooler is the interface that provides methods for +// accessing the unconfirmed transaction pool +type UnconfirmedTxnPooler interface { + SetTxnsAnnounced(tx *dbutil.Tx, hashes map[cipher.SHA256]int64) error + InjectTransaction(tx *dbutil.Tx, bc Blockchainer, t coin.Transaction, maxSize int) (bool, *ErrTxnViolatesSoftConstraint, error) + RawTxns(tx *dbutil.Tx) (coin.Transactions, error) + RemoveTransactions(tx *dbutil.Tx, txns []cipher.SHA256) error + Refresh(tx *dbutil.Tx, bc Blockchainer, maxBlockSize int) ([]cipher.SHA256, error) + RemoveInvalid(tx *dbutil.Tx, bc Blockchainer) ([]cipher.SHA256, error) + GetUnknown(tx *dbutil.Tx, txns []cipher.SHA256) ([]cipher.SHA256, error) + GetKnown(tx *dbutil.Tx, txns []cipher.SHA256) (coin.Transactions, error) + RecvOfAddresses(tx *dbutil.Tx, bh coin.BlockHeader, addrs []cipher.Address) (coin.AddressUxOuts, error) + GetIncomingOutputs(tx *dbutil.Tx, bh coin.BlockHeader) (coin.UxArray, error) + Get(tx *dbutil.Tx, hash cipher.SHA256) (*UnconfirmedTxn, error) + GetTxns(tx *dbutil.Tx, filter func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) + GetTxHashes(tx *dbutil.Tx, filter func(tx UnconfirmedTxn) bool) ([]cipher.SHA256, error) + ForEach(tx *dbutil.Tx, f func(cipher.SHA256, UnconfirmedTxn) error) error + GetUnspentsOfAddr(tx *dbutil.Tx, addr cipher.Address) (coin.UxArray, error) + Len(tx *dbutil.Tx) (uint64, error) +} + +// Visor manages the Blockchain as both a Master and a Normal +type Visor struct { + Config Config + DB *dbutil.DB + // Unconfirmed transactions, held for relay until we get block confirmation + Unconfirmed UnconfirmedTxnPooler + Blockchain Blockchainer + Wallets *wallet.Service + StartedAt time.Time + + history Historyer +} + +// NewVisor creates a Visor for managing the blockchain database +func NewVisor(c Config, db *dbutil.DB) (*Visor, error) { + logger.Info("Creating new visor") + if c.IsMaster { + logger.Info("Visor is master") + } + + if err := c.Verify(); err != nil { + return nil, err + } + + // Loads wallet + wltServConfig := wallet.Config{ + WalletDir: c.WalletDirectory, + CryptoType: c.WalletCryptoType, + EnableWalletAPI: c.EnableWalletAPI, + EnableSeedAPI: c.EnableSeedAPI, + } + + wltServ, err := wallet.NewService(wltServConfig) + if err != nil { + return nil, err + } + + if !db.IsReadOnly() { + if err := CreateBuckets(db); err != nil { + logger.WithError(err).Error("CreateBuckets failed") + return nil, err + } + } + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: c.BlockchainPubkey, + Arbitrating: c.Arbitrating, + }) + if err != nil { + return nil, err + } + + history := historydb.New() + + if !db.IsReadOnly() { + if err := db.Update("build unspent indexes and init history", func(tx *dbutil.Tx) error { + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := bc.Unspent().MaybeBuildIndexes(tx, headSeq); err != nil { + return err + } + + return initHistory(tx, bc, history) + }); err != nil { + return nil, err + } + } + + utp, err := NewUnconfirmedTxnPool(db) + if err != nil { + return nil, err + } + + v := &Visor{ + Config: c, + DB: db, + Blockchain: bc, + Unconfirmed: utp, + history: history, + Wallets: wltServ, + StartedAt: time.Now(), + } + + return v, nil +} + +// Init initializes starts the visor +func (vs *Visor) Init() error { + logger.Info("Visor init") + + if vs.DB.IsReadOnly() { + return nil + } + + return vs.DB.Update("visor init", func(tx *dbutil.Tx) error { + if err := vs.maybeCreateGenesisBlock(tx); err != nil { + return err + } + + removed, err := vs.Unconfirmed.RemoveInvalid(tx, vs.Blockchain) + if err != nil { + return err + } + logger.Infof("Removed %d invalid txns from pool", len(removed)) + + return nil + }) +} + +func initHistory(tx *dbutil.Tx, bc *Blockchain, history *historydb.HistoryDB) error { + logger.Info("Visor initHistory") + + shouldReset, err := history.NeedsReset(tx) + if err != nil { + return err + } + + if !shouldReset { + return nil + } + + logger.Info("Resetting historyDB") + + if err := history.Erase(tx); err != nil { + return err + } + + // Reparse the history up to the blockchain head + headSeq, _, err := bc.HeadSeq(tx) + if err != nil { + return err + } + + if err := parseHistoryTo(tx, history, bc, headSeq); err != nil { + logger.WithError(err).Error("parseHistoryTo failed") + return err + } + + return nil +} + +func parseHistoryTo(tx *dbutil.Tx, history *historydb.HistoryDB, bc *Blockchain, height uint64) error { + logger.Info("Visor parseHistoryTo") + + parsedBlockSeq, _, err := history.ParsedBlockSeq(tx) + if err != nil { + return err + } + + for i := uint64(0); i < height-parsedBlockSeq; i++ { + b, err := bc.GetSignedBlockBySeq(tx, parsedBlockSeq+i+1) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("no block exists in depth: %d", parsedBlockSeq+i+1) + } + + if err := history.ParseBlock(tx, b.Block); err != nil { + return err + } + } + + return nil +} + +// maybeCreateGenesisBlock creates a genesis block if necessary +func (vs *Visor) maybeCreateGenesisBlock(tx *dbutil.Tx) error { + logger.Info("Visor maybeCreateGenesisBlock") + gb, err := vs.Blockchain.GetGenesisBlock(tx) + if err != nil { + return err + } + if gb != nil { + return nil + } + + logger.Info("Create genesis block") + vs.GenesisPreconditions() + b, err := coin.NewGenesisBlock(vs.Config.GenesisAddress, vs.Config.GenesisCoinVolume, vs.Config.GenesisTimestamp) + if err != nil { + return err + } + + var sb coin.SignedBlock + // record the signature of genesis block + if vs.Config.IsMaster { + sb = vs.signBlock(*b) + logger.Infof("Genesis block signature=%s", sb.Sig.Hex()) + } else { + sb = coin.SignedBlock{ + Block: *b, + Sig: vs.Config.GenesisSignature, + } + } + + return vs.executeSignedBlock(tx, sb) +} + +// GenesisPreconditions panics if conditions for genesis block are not met +func (vs *Visor) GenesisPreconditions() { + if vs.Config.BlockchainSeckey != (cipher.SecKey{}) { + if vs.Config.BlockchainPubkey != cipher.PubKeyFromSecKey(vs.Config.BlockchainSeckey) { + logger.Panic("Cannot create genesis block. Invalid secret key for pubkey") + } + } +} + +// RefreshUnconfirmed checks unconfirmed txns against the blockchain and returns +// all transaction that turn to valid. +func (vs *Visor) RefreshUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.DB.Update("RefreshUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.Refresh(tx, vs.Blockchain, vs.Config.MaxBlockSize) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// RemoveInvalidUnconfirmed removes transactions that become permanently invalid +// (by violating hard constraints) from the pool. +// Returns the transaction hashes that were removed. +func (vs *Visor) RemoveInvalidUnconfirmed() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + if err := vs.DB.Update("RemoveInvalidUnconfirmed", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.RemoveInvalid(tx, vs.Blockchain) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// CreateBlock creates a SignedBlock from pending transactions +func (vs *Visor) createBlock(tx *dbutil.Tx, when uint64) (coin.SignedBlock, error) { + if !vs.Config.IsMaster { + logger.Panic("Only master chain can create blocks") + } + + // Gather all unconfirmed transactions + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + if len(txns) == 0 { + return coin.SignedBlock{}, errors.New("No transactions") + } + + logger.Infof("Unconfirmed pool has %d transactions pending", len(txns)) + + // Filter transactions that violate all constraints + var filteredTxns coin.Transactions + for _, txn := range txns { + if err := vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.MaxBlockSize); err != nil { + switch err.(type) { + case ErrTxnViolatesHardConstraint, ErrTxnViolatesSoftConstraint: + logger.Warningf("Transaction %s violates constraints: %v", txn.TxIDHex(), err) + default: + return coin.SignedBlock{}, err + } + } else { + filteredTxns = append(filteredTxns, txn) + } + } + + nRemoved := len(txns) - len(filteredTxns) + if nRemoved > 0 { + logger.Infof("CreateBlock ignored %d transactions violating constraints", nRemoved) + } + + txns = filteredTxns + + if len(txns) == 0 { + logger.Info("No transactions after filtering for constraint violations") + return coin.SignedBlock{}, errors.New("No transactions after filtering for constraint violations") + } + + head, err := vs.Blockchain.Head(tx) + if err != nil { + return coin.SignedBlock{}, err + } + + // Sort them by highest fee per kilobyte + txns = coin.SortTransactions(txns, vs.Blockchain.TransactionFee(tx, head.Time())) + + // Apply block size transaction limit + txns = txns.TruncateBytesTo(vs.Config.MaxBlockSize) + + if len(txns) == 0 { + logger.Panic("TruncateBytesTo removed all transactions") + } + + logger.Infof("Creating new block with %d transactions, head time %d", len(txns), when) + + b, err := vs.Blockchain.NewBlock(tx, txns, when) + if err != nil { + logger.Warningf("Blockchain.NewBlock failed: %v", err) + return coin.SignedBlock{}, err + } + + return vs.signBlock(*b), nil +} + +// CreateAndExecuteBlock creates a SignedBlock from pending transactions and executes it +func (vs *Visor) CreateAndExecuteBlock() (coin.SignedBlock, error) { + var sb coin.SignedBlock + + err := vs.DB.Update("CreateAndExecuteBlock", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.createBlock(tx, uint64(utc.UnixNow())) + if err != nil { + return err + } + + return vs.executeSignedBlock(tx, sb) + }) + + return sb, err +} + +// ExecuteSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by the master server +func (vs *Visor) ExecuteSignedBlock(b coin.SignedBlock) error { + return vs.DB.Update("ExecuteSignedBlock", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, b) + }) +} + +// executeSignedBlock adds a block to the blockchain, or returns error. +// Blocks must be executed in sequence, and be signed by the master server +func (vs *Visor) executeSignedBlock(tx *dbutil.Tx, b coin.SignedBlock) error { + if err := b.VerifySignature(vs.Config.BlockchainPubkey); err != nil { + return err + } + + if err := vs.Blockchain.ExecuteBlock(tx, &b); err != nil { + return err + } + + // Remove the transactions in the Block from the unconfirmed pool + txHashes := make([]cipher.SHA256, 0, len(b.Block.Body.Transactions)) + for _, tx := range b.Block.Body.Transactions { + txHashes = append(txHashes, tx.Hash()) + } + + if err := vs.Unconfirmed.RemoveTransactions(tx, txHashes); err != nil { + return err + } + + // Update the HistoryDB + return vs.history.ParseBlock(tx, b.Block) +} + +// signBlock signs a block for master. Will panic if anything is invalid +func (vs *Visor) signBlock(b coin.Block) coin.SignedBlock { + if !vs.Config.IsMaster { + logger.Panic("Only master chain can sign blocks") + } + + sig := cipher.SignHash(b.HashHeader(), vs.Config.BlockchainSeckey) + + return coin.SignedBlock{ + Block: b, + Sig: sig, + } +} + +/* + Return Data +*/ + +// GetAllUnspentOutputs returns all unspent outputs +func (vs *Visor) GetAllUnspentOutputs() (coin.UxArray, error) { + var ux []coin.UxOut + if err := vs.DB.View("GetAllUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + ux, err = vs.Blockchain.Unspent().GetAll(tx) + return err + }); err != nil { + return nil, err + } + + return ux, nil +} + +// GetUnspentOutputs returns unspent outputs from the pool, queried by hashes. +// If any do not exist, ErrUnspentNotExist is returned +func (vs *Visor) GetUnspentOutputs(hashes []cipher.SHA256) (coin.UxArray, error) { + var outputs coin.UxArray + if err := vs.DB.View("GetUnspentOutputs", func(tx *dbutil.Tx) error { + var err error + outputs, err = vs.Blockchain.Unspent().GetArray(tx, hashes) + return err + }); err != nil { + return nil, err + } + + return outputs, nil +} + +// UnconfirmedSpendingOutputs returns all spending outputs in unconfirmed tx pool +func (vs *Visor) UnconfirmedSpendingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.DB.View("UnconfirmedSpendingOutputs", func(tx *dbutil.Tx) error { + var inputs []cipher.SHA256 + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return err + } + + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err = vs.Blockchain.Unspent().GetArray(tx, inputs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// UnconfirmedIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) UnconfirmedIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.DB.View("UnconfirmedIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.Unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// GetSignedBlocksSince returns N signed blocks more recent than Seq. Does not return nil. +func (vs *Visor) GetSignedBlocksSince(seq, ct uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.DB.View("GetSignedBlocksSince", func(tx *dbutil.Tx) error { + avail := uint64(0) + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + headSeq := head.Seq() + if headSeq > seq { + avail = headSeq - seq + } + if avail < ct { + ct = avail + } + if ct == 0 { + return nil + } + + blocks = make([]coin.SignedBlock, 0, ct) + for j := uint64(0); j < ct; j++ { + i := seq + 1 + j + b, err := vs.Blockchain.GetSignedBlockBySeq(tx, i) + if err != nil { + return err + } + + blocks = append(blocks, *b) + } + + return nil + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// HeadBkSeq returns the highest BkSeq we know, returns false in the 2nd return value +// if the blockchain is empty +func (vs *Visor) HeadBkSeq() (uint64, bool, error) { + var headSeq uint64 + var ok bool + + if err := vs.DB.View("HeadBkSeq", func(tx *dbutil.Tx) error { + var err error + headSeq, ok, err = vs.Blockchain.HeadSeq(tx) + return err + }); err != nil { + return 0, false, err + } + + return headSeq, ok, nil +} + +// GetBlockchainMetadata returns descriptive Blockchain information +func (vs *Visor) GetBlockchainMetadata() (*BlockchainMetadata, error) { + var head *coin.SignedBlock + var unconfirmedLen, unspentsLen uint64 + + if err := vs.DB.View("GetBlockchainMetadata", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + unconfirmedLen, err = vs.Unconfirmed.Len(tx) + if err != nil { + return err + } + + unspentsLen, err = vs.Blockchain.Unspent().Len(tx) + return err + }); err != nil { + return nil, err + } + + return NewBlockchainMetadata(head, unconfirmedLen, unspentsLen) +} + +// GetBlock returns a copy of the block at seq. Returns error if seq out of range +func (vs *Visor) GetBlock(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.DB.View("GetBlock", func(tx *dbutil.Tx) error { + headSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } + + if !ok || seq > headSeq { + return errors.New("Block seq out of range") + } + + b, err = vs.Blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetBlocks returns multiple blocks between start and end (not including end). Returns +// empty slice if unable to fulfill request, it does not return nil. +func (vs *Visor) GetBlocks(start, end uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.DB.View("GetBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.Blockchain.GetBlocks(tx, start, end) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// InjectTransaction records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard constraints, it is rejected, and error will not be nil. +// If the transaction only violates soft constraints, it is still injected, and the soft constraint violation is returned. +func (vs *Visor) InjectTransaction(txn coin.Transaction) (bool, *ErrTxnViolatesSoftConstraint, error) { + var known bool + var softErr *ErrTxnViolatesSoftConstraint + + if err := vs.DB.Update("InjectTransaction", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = vs.Unconfirmed.InjectTransaction(tx, vs.Blockchain, txn, vs.Config.MaxBlockSize) + return err + }); err != nil { + return false, nil, err + } + + return known, softErr, nil +} + +// InjectTransactionStrict records a coin.Transaction to the UnconfirmedTxnPool if the txn is not +// already in the blockchain. +// The bool return value is whether or not the transaction was already in the pool. +// If the transaction violates hard or soft constraints, it is rejected, and error will not be nil. +func (vs *Visor) InjectTransactionStrict(txn coin.Transaction) (bool, error) { + if err := VerifySingleTxnUserConstraints(txn); err != nil { + return false, err + } + + var known bool + + if err := vs.DB.Update("InjectTransactionStrict", func(tx *dbutil.Tx) error { + err := vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, txn, vs.Config.MaxBlockSize) + if err != nil { + return err + } + + known, _, err = vs.Unconfirmed.InjectTransaction(tx, vs.Blockchain, txn, vs.Config.MaxBlockSize) + return err + }); err != nil { + return false, err + } + + return known, nil +} + +// GetAddressTxns returns the Transactions whose unspents give coins to a cipher.Address. +// This includes unconfirmed txns' predicted unspents. +func (vs *Visor) GetAddressTxns(a cipher.Address) ([]Transaction, error) { + var txns []Transaction + + if err := vs.DB.View("GetAddressTxns", func(tx *dbutil.Tx) error { + txs, err := vs.history.GetAddressTxns(tx, a) + if err != nil { + return err + } + + mxSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } else if !ok { + if len(txns) > 0 { + return fmt.Errorf("Found %d txns for addresses but block head seq is missing", len(txns)) + } + return nil + } + + for _, txn := range txs { + if mxSeq < txn.BlockSeq { + return fmt.Errorf("Blockchain head seq %d is earlier than history txn seq %d", mxSeq, txn.BlockSeq) + } + h := mxSeq - txn.BlockSeq + 1 + + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) + if err != nil { + return err + } + + if bk == nil { + return fmt.Errorf("No block exists in depth: %d", txn.BlockSeq) + } + + txns = append(txns, Transaction{ + Txn: txn.Tx, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), + Time: bk.Time(), + }) + } + + // Look in the unconfirmed pool + uxs, err := vs.Unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return err + } + + for _, ux := range uxs { + utxn, err := vs.Unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return err + } + + if utxn == nil { + logger.Critical().Error("Unconfirmed unspent missing unconfirmed txn") + continue + } + + txns = append(txns, Transaction{ + Txn: utxn.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(utxn.Received).Unix()), + }) + } + + return nil + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetTransaction returns a Transaction by hash. +func (vs *Visor) GetTransaction(txHash cipher.SHA256) (*Transaction, error) { + var txn *Transaction + + if err := vs.DB.View("GetTransaction", func(tx *dbutil.Tx) error { + // Look in the unconfirmed pool + utxn, err := vs.Unconfirmed.Get(tx, txHash) + if err != nil { + return err + } + + if utxn != nil { + txn = &Transaction{ + Txn: utxn.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(utxn.Received).Unix()), + } + return nil + } + + htxn, err := vs.history.GetTransaction(tx, txHash) + if err != nil { + return err + } + + if htxn == nil { + return nil + } + + headSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return err + } else if !ok { + return errors.New("Blockchain is empty but history has transactions") + } + + b, err := vs.Blockchain.GetSignedBlockBySeq(tx, htxn.BlockSeq) + if err != nil { + return err + } + + if b == nil { + return fmt.Errorf("found no block in seq %v", htxn.BlockSeq) + } + + if headSeq < htxn.BlockSeq { + return fmt.Errorf("Blockchain head seq %d is earlier than history txn seq %d", headSeq, htxn.BlockSeq) + } + + confirms := headSeq - htxn.BlockSeq + 1 + txn = &Transaction{ + Txn: htxn.Tx, + Status: NewConfirmedTransactionStatus(confirms, htxn.BlockSeq), + Time: b.Time(), + } + + return nil + }); err != nil { + return nil, err + } + + return txn, nil +} + +// TxFilter transaction filter type +type TxFilter interface { + // Returns whether the transaction is matched + Match(*Transaction) bool +} + +// baseFilter is a helper struct for generating TxFilter. +type baseFilter struct { + f func(tx *Transaction) bool +} + +func (f baseFilter) Match(tx *Transaction) bool { + return f.f(tx) +} + +// AddrsFilter collects all addresses related transactions. +func AddrsFilter(addrs []cipher.Address) TxFilter { + return addrsFilter{Addrs: addrs} +} + +// addrsFilter +type addrsFilter struct { + Addrs []cipher.Address +} + +// Match implements the TxFilter interface, this actually won't be used, only the 'Addrs' member is used. +func (af addrsFilter) Match(tx *Transaction) bool { return true } + +// ConfirmedTxFilter collects the transaction whose 'Confirmed' status matchs the parameter passed in. +func ConfirmedTxFilter(isConfirmed bool) TxFilter { + return baseFilter{func(tx *Transaction) bool { + return tx.Status.Confirmed == isConfirmed + }} +} + +// GetTransactions returns transactions that can pass the filters. +// If any 'AddrsFilter' exist, call vs.getTransactionsOfAddrs, cause +// there's an address index of transactions in db which, having address as key and transaction hashes as value. +// If no filters is provided, returns all transactions. +func (vs *Visor) GetTransactions(flts ...TxFilter) ([]Transaction, error) { + var addrFlts []addrsFilter + var otherFlts []TxFilter + // Splits the filters into AddrsFilter and other filters + for _, f := range flts { + switch v := f.(type) { + case addrsFilter: + addrFlts = append(addrFlts, v) + default: + otherFlts = append(otherFlts, f) + } + } + + // Accumulates all addresses in address filters + addrs := accumulateAddressInFilter(addrFlts) + + // Traverses all transactions to do collection if there's no address filter. + if len(addrs) == 0 { + var txns []Transaction + if err := vs.DB.View("GetTransactions traverseTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.traverseTxns(tx, otherFlts...) + return err + }); err != nil { + return nil, err + } + return txns, nil + } + + // Gets addresses related transactions + var addrTxns map[cipher.Address][]Transaction + if err := vs.DB.View("GetTransactions getTransactionsOfAddrs", func(tx *dbutil.Tx) error { + var err error + addrTxns, err = vs.getTransactionsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + // Converts address transactions map into []Transaction, + // and remove duplicate txns + txnMap := make(map[cipher.SHA256]struct{}, 0) + var txns []Transaction + for _, txs := range addrTxns { + for _, tx := range txs { + if _, exist := txnMap[tx.Txn.Hash()]; exist { + continue + } + txnMap[tx.Txn.Hash()] = struct{}{} + txns = append(txns, tx) + } + } + + // Checks other filters + var retTxns []Transaction + f := func(tx *Transaction, flts ...TxFilter) bool { + for _, flt := range otherFlts { + if !flt.Match(tx) { + return false + } + } + + return true + } + + for _, tx := range txns { + if f(&tx, otherFlts...) { + retTxns = append(retTxns, tx) + } + } + + return retTxns, nil +} + +func accumulateAddressInFilter(afs []addrsFilter) []cipher.Address { + // Accumulate all addresses in address filters + addrMap := make(map[cipher.Address]struct{}, 0) + var addrs []cipher.Address + for _, af := range afs { + for _, a := range af.Addrs { + if _, exist := addrMap[a]; exist { + continue + } + addrMap[a] = struct{}{} + addrs = append(addrs, a) + } + } + return addrs +} + +// getTransactionsOfAddrs returns all addresses related transactions. +// Including both confirmed and unconfirmed transactions. +func (vs *Visor) getTransactionsOfAddrs(tx *dbutil.Tx, addrs []cipher.Address) (map[cipher.Address][]Transaction, error) { + // Initialize the address transactions map + addrTxs := make(map[cipher.Address][]Transaction) + + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.Blockchain.HeadSeq(tx) + + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + for _, a := range addrs { + var txns []Transaction + addrTxns, err := vs.history.GetAddressTxns(tx, a) + if err != nil { + return nil, err + } + + for _, txn := range addrTxns { + if headBkSeq < txn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": txn.BlockSeq, + }).Error() + return nil, err + } + h := headBkSeq - txn.BlockSeq + 1 + + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, txn.BlockSeq) + if err != nil { + return nil, err + } + + if bk == nil { + return nil, fmt.Errorf("block of seq: %d doesn't exist", txn.BlockSeq) + } + + txns = append(txns, Transaction{ + Txn: txn.Tx, + Status: NewConfirmedTransactionStatus(h, txn.BlockSeq), + Time: bk.Time(), + }) + } + + // Look in the unconfirmed pool + uxs, err := vs.Unconfirmed.GetUnspentsOfAddr(tx, a) + if err != nil { + return nil, err + } + + for _, ux := range uxs { + txn, err := vs.Unconfirmed.Get(tx, ux.Body.SrcTransaction) + if err != nil { + return nil, err + } + + if txn == nil { + logger.Critical().Error("Unconfirmed unspent missing unconfirmed txn") + continue + } + + txns = append(txns, Transaction{ + Txn: txn.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(txn.Received).Unix()), + }) + } + + addrTxs[a] = txns + } + + return addrTxs, nil +} + +// traverseTxns traverses transactions in historydb and unconfirmed tx pool in db, +// returns transactions that can pass the filters. +func (vs *Visor) traverseTxns(tx *dbutil.Tx, flts ...TxFilter) ([]Transaction, error) { + // Get the head block seq, for calculating the tx status + headBkSeq, ok, err := vs.Blockchain.HeadSeq(tx) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("No head block seq") + } + + var txns []Transaction + + if err := vs.history.ForEachTxn(tx, func(_ cipher.SHA256, hTxn *historydb.Transaction) error { + if headBkSeq < hTxn.BlockSeq { + err := errors.New("Transaction block sequence is less than the head block sequence") + logger.Critical().WithError(err).WithFields(logrus.Fields{ + "headBkSeq": headBkSeq, + "txBlockSeq": hTxn.BlockSeq, + }).Error() + return err + } + + h := headBkSeq - hTxn.BlockSeq + 1 + + bk, err := vs.Blockchain.GetSignedBlockBySeq(tx, hTxn.BlockSeq) + if err != nil { + return fmt.Errorf("get block of seq: %v failed: %v", hTxn.BlockSeq, err) + } + + if bk == nil { + return fmt.Errorf("block of seq: %d doesn't exist", hTxn.BlockSeq) + } + + txn := Transaction{ + Txn: hTxn.Tx, + Status: NewConfirmedTransactionStatus(h, hTxn.BlockSeq), + Time: bk.Time(), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + return nil + } + } + + txns = append(txns, txn) + return nil + }); err != nil { + return nil, err + } + + txns = sortTxns(txns) + + // Gets all unconfirmed transactions + unconfirmedTxns, err := vs.Unconfirmed.GetTxns(tx, func(txn UnconfirmedTxn) bool { + return true + }) + if err != nil { + return nil, err + } + + for _, ux := range unconfirmedTxns { + txn := Transaction{ + Txn: ux.Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(ux.Received).Unix()), + } + + // Checks filters + for _, f := range flts { + if !f.Match(&txn) { + continue + } + txns = append(txns, txn) + } + } + return txns, nil +} + +// Sort transactions by block seq, if equal then compare hash +func sortTxns(txns []Transaction) []Transaction { + sort.Slice(txns, func(i, j int) bool { + if txns[i].Status.BlockSeq < txns[j].Status.BlockSeq { + return true + } + + if txns[i].Status.BlockSeq > txns[j].Status.BlockSeq { + return false + } + + // If transactions in the same block, compare the hash string + return txns[i].Txn.Hash().Hex() < txns[j].Txn.Hash().Hex() + }) + return txns +} + +// AddressBalance computes the total balance for cipher.Addresses and their coin.UxOuts +func (vs *Visor) AddressBalance(head *coin.SignedBlock, auxs coin.AddressUxOuts) (uint64, uint64, error) { + prevTime := head.Time() + var coins uint64 + var hours uint64 + for _, uxs := range auxs { + for _, ux := range uxs { + uxHours, err := ux.CoinHours(prevTime) + if err != nil { + return 0, 0, err + } + + coins, err = coin.AddUint64(coins, ux.Body.Coins) + if err != nil { + return 0, 0, err + } + + hours, err = coin.AddUint64(hours, uxHours) + if err != nil { + return 0, 0, err + } + } + } + return coins, hours, nil +} + +// GetUnconfirmedTxns gets all confirmed transactions of specific addresses +func (vs *Visor) GetUnconfirmedTxns(filter func(UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := vs.DB.View("GetUnconfirmedTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.Unconfirmed.GetTxns(tx, filter) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// ToAddresses represents a filter that check if tx has output to the given addresses +func ToAddresses(addresses []cipher.Address) func(UnconfirmedTxn) bool { + return func(tx UnconfirmedTxn) (isRelated bool) { + for _, out := range tx.Txn.Out { + for _, address := range addresses { + if out.Address == address { + isRelated = true + return + } + } + } + return + } +} + +// GetAllUnconfirmedTxns returns all unconfirmed transactions +func (vs *Visor) GetAllUnconfirmedTxns() ([]UnconfirmedTxn, error) { + var txns []UnconfirmedTxn + + if err := vs.DB.View("GetAllUnconfirmedTxns", func(tx *dbutil.Tx) error { + var err error + txns, err = vs.Unconfirmed.GetTxns(tx, All) + return err + }); err != nil { + return nil, err + } + + return txns, nil +} + +// GetAllValidUnconfirmedTxHashes returns all valid unconfirmed transaction hashes +func (vs *Visor) GetAllValidUnconfirmedTxHashes() ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.DB.View("GetAllValidUnconfirmedTxHashes", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetTxHashes(tx, IsValid) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetSignedBlockByHash get block of specific hash header, return nil on not found. +func (vs *Visor) GetSignedBlockByHash(hash cipher.SHA256) (*coin.SignedBlock, error) { + var sb *coin.SignedBlock + + if err := vs.DB.View("GetSignedBlockByHash", func(tx *dbutil.Tx) error { + var err error + sb, err = vs.Blockchain.GetSignedBlockByHash(tx, hash) + return err + }); err != nil { + return nil, err + } + + return sb, nil +} + +// GetSignedBlockBySeq get block of specific seq, return nil on not found. +func (vs *Visor) GetSignedBlockBySeq(seq uint64) (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.DB.View("GetSignedBlockBySeq", func(tx *dbutil.Tx) error { + var err error + b, err = vs.Blockchain.GetSignedBlockBySeq(tx, seq) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetLastBlocks returns last N blocks +func (vs *Visor) GetLastBlocks(num uint64) ([]coin.SignedBlock, error) { + var blocks []coin.SignedBlock + + if err := vs.DB.View("GetLastBlocks", func(tx *dbutil.Tx) error { + var err error + blocks, err = vs.Blockchain.GetLastBlocks(tx, num) + return err + }); err != nil { + return nil, err + } + + return blocks, nil +} + +// GetHeadBlock gets head block. +func (vs Visor) GetHeadBlock() (*coin.SignedBlock, error) { + var b *coin.SignedBlock + + if err := vs.DB.View("GetHeadBlock", func(tx *dbutil.Tx) error { + var err error + b, err = vs.Blockchain.Head(tx) + return err + }); err != nil { + return nil, err + } + + return b, nil +} + +// GetHeadBlockTime returns the time of the head block. +func (vs Visor) GetHeadBlockTime() (uint64, error) { + var t uint64 + + if err := vs.DB.View("GetHeadBlockTime", func(tx *dbutil.Tx) error { + var err error + t, err = vs.Blockchain.Time(tx) + return err + }); err != nil { + return 0, err + } + + return t, nil +} + +// GetUxOutByID gets UxOut by hash id. +func (vs Visor) GetUxOutByID(id cipher.SHA256) (*historydb.UxOut, error) { + var outs []*historydb.UxOut + + if err := vs.DB.View("GetUxOutByID", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.history.GetUxOuts(tx, []cipher.SHA256{id}) + return err + }); err != nil { + return nil, err + } + + if len(outs) == 0 { + return nil, nil + } + + return outs[0], nil +} + +// GetAddrUxOuts gets all the address affected UxOuts. +func (vs Visor) GetAddrUxOuts(address cipher.Address) ([]*historydb.UxOut, error) { + var out []*historydb.UxOut + + if err := vs.DB.View("GetAddrUxOuts", func(tx *dbutil.Tx) error { + var err error + out, err = vs.history.GetAddrUxOuts(tx, address) + return err + }); err != nil { + return nil, err + } + + return out, nil +} + +// RecvOfAddresses returns unconfirmed receiving uxouts of addresses +func (vs *Visor) RecvOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxouts coin.AddressUxOuts + + if err := vs.DB.View("RecvOfAddresses", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxouts, err = vs.Unconfirmed.RecvOfAddresses(tx, head.Head, addrs) + return err + }); err != nil { + return nil, err + } + + return uxouts, nil +} + +// GetIncomingOutputs returns all predicted outputs that are in pending tx pool +func (vs *Visor) GetIncomingOutputs() (coin.UxArray, error) { + var uxa coin.UxArray + + if err := vs.DB.View("GetIncomingOutputs", func(tx *dbutil.Tx) error { + head, err := vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.Unconfirmed.GetIncomingOutputs(tx, head.Head) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// GetUnconfirmedTxn gets an unconfirmed transaction from the DB +func (vs *Visor) GetUnconfirmedTxn(hash cipher.SHA256) (*UnconfirmedTxn, error) { + var txn *UnconfirmedTxn + + if err := vs.DB.View("GetUnconfirmedTxn", func(tx *dbutil.Tx) error { + var err error + txn, err = vs.Unconfirmed.Get(tx, hash) + return err + }); err != nil { + return nil, err + } + + return txn, nil +} + +// GetUnconfirmedUnknown returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetUnconfirmedUnknown(txns []cipher.SHA256) ([]cipher.SHA256, error) { + var hashes []cipher.SHA256 + + if err := vs.DB.View("GetUnconfirmedUnknown", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetUnknown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// GetUnconfirmedKnown returns unconfirmed txn hashes with known ones removed +func (vs *Visor) GetUnconfirmedKnown(txns []cipher.SHA256) (coin.Transactions, error) { + var hashes coin.Transactions + + if err := vs.DB.View("GetUnconfirmedKnown", func(tx *dbutil.Tx) error { + var err error + hashes, err = vs.Unconfirmed.GetKnown(tx, txns) + return err + }); err != nil { + return nil, err + } + + return hashes, nil +} + +// UnconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) UnconfirmedSpendsOfAddresses(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var outs coin.AddressUxOuts + + if err := vs.DB.View("UnconfirmedSpendsOfAddresses", func(tx *dbutil.Tx) error { + var err error + outs, err = vs.unconfirmedSpendsOfAddresses(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return outs, nil +} + +// unconfirmedSpendsOfAddresses returns all unconfirmed coin.UxOut spends of addresses +func (vs *Visor) unconfirmedSpendsOfAddresses(tx *dbutil.Tx, addrs []cipher.Address) (coin.AddressUxOuts, error) { + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return nil, err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + uxa, err := vs.Blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return nil, err + } + + outs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + outs[ux.Body.Address] = append(outs[ux.Body.Address], ux) + } + } + + return outs, nil +} + +// SetTxnsAnnounced updates announced time of specific tx +func (vs *Visor) SetTxnsAnnounced(hashes map[cipher.SHA256]int64) error { + if len(hashes) == 0 { + return nil + } + + return vs.DB.Update("SetTxnsAnnounced", func(tx *dbutil.Tx) error { + return vs.Unconfirmed.SetTxnsAnnounced(tx, hashes) + }) +} + +// GetBalanceOfAddrs returns balance pairs of given addreses +func (vs Visor) GetBalanceOfAddrs(addrs []cipher.Address) ([]wallet.BalancePair, error) { + if len(addrs) == 0 { + return nil, nil + } + + auxs := make(coin.AddressUxOuts, len(addrs)) + recvUxs := make(coin.AddressUxOuts, len(addrs)) + var uxa coin.UxArray + var head *coin.SignedBlock + + if err := vs.DB.View("GetBalanceOfAddrs", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + // Get all transactions from the unconfirmed pool + txns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return err + } + + // Create predicted unspent outputs from the unconfirmed transactions + recvUxs, err = txnOutputsForAddrs(head.Head, addrs, txns) + if err != nil { + return err + } + + var inputs []cipher.SHA256 + for _, txn := range txns { + inputs = append(inputs, txn.In...) + } + + // Get unspents for the inputs being spent + uxa, err = vs.Blockchain.Unspent().GetArray(tx, inputs) + if err != nil { + return fmt.Errorf("GetArray failed when checking addresses balance: %v", err) + } + + // Get unspents owned by the addresses + auxs, err = vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + return fmt.Errorf("GetUnspentsOfAddrs failed when checking addresses balance: %v", err) + } + + return nil + }); err != nil { + return nil, err + } + + // Build all unconfirmed transaction inputs that are associated with the addresses + spendUxs := make(coin.AddressUxOuts, len(addrs)) + + addrm := make(map[cipher.Address]struct{}, len(addrs)) + for _, addr := range addrs { + addrm[addr] = struct{}{} + } + + for _, ux := range uxa { + if _, ok := addrm[ux.Body.Address]; ok { + spendUxs[ux.Body.Address] = append(spendUxs[ux.Body.Address], ux) + } + } + + var bps []wallet.BalancePair + + headTime := head.Time() + for _, addr := range addrs { + uxs, ok := auxs[addr] + if !ok { + bps = append(bps, wallet.BalancePair{}) + continue + } + + outUxs := spendUxs[addr] + inUxs := recvUxs[addr] + predictedUxs := uxs.Sub(outUxs).Add(inUxs) + + coins, err := uxs.Coins() + if err != nil { + return nil, fmt.Errorf("uxs.Coins failed: %v", err) + } + + coinHours, err := uxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + err = nil + default: + return nil, fmt.Errorf("uxs.CoinHours failed: %v", err) + } + } + + pcoins, err := predictedUxs.Coins() + if err != nil { + return nil, fmt.Errorf("predictedUxs.Coins failed: %v", err) + } + + pcoinHours, err := predictedUxs.CoinHours(headTime) + if err != nil { + switch err { + case coin.ErrAddEarnedCoinHoursAdditionOverflow: + coinHours = 0 + err = nil + default: + return nil, fmt.Errorf("predictedUxs.CoinHours failed: %v", err) + } + } + + bp := wallet.BalancePair{ + Confirmed: wallet.Balance{ + Coins: coins, + Hours: coinHours, + }, + Predicted: wallet.Balance{ + Coins: pcoins, + Hours: pcoinHours, + }, + } + + bps = append(bps, bp) + } + + return bps, nil +} + +// GetUnspentsOfAddrs returns unspent outputs of multiple addresses +func (vs *Visor) GetUnspentsOfAddrs(addrs []cipher.Address) (coin.AddressUxOuts, error) { + var uxa coin.AddressUxOuts + + if err := vs.DB.View("GetUnspentsOfAddrs", func(tx *dbutil.Tx) error { + var err error + uxa, err = vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + return err + }); err != nil { + return nil, err + } + + return uxa, nil +} + +// VerifyTxnVerbose verifies a transaction, it returns transaction's input uxouts, whether the +// transaction is confirmed, and error if any +func (vs *Visor) VerifyTxnVerbose(txn *coin.Transaction) ([]wallet.UxBalance, bool, error) { + var uxa coin.UxArray + var head *coin.SignedBlock + var isTxnConfirmed bool + err := vs.DB.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + return err + } + + uxa, err = vs.Blockchain.Unspent().GetArray(tx, txn.In) + switch err.(type) { + case nil: + case blockdb.ErrUnspentNotExist: + uxid := err.(blockdb.ErrUnspentNotExist).UxID + // Gets uxouts of txn.In from historydb + outs, err := vs.history.GetUxOuts(tx, txn.In) + if err != nil { + return err + } + + if len(outs) == 0 { + err = fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", uxid) + return NewErrTxnViolatesHardConstraint(err) + } + + uxa = coin.UxArray{} + for _, out := range outs { + uxa = append(uxa, out.Out) + } + + // Checks if the transaction is confirmed + txnHash := txn.Hash() + historyTxn, err := vs.history.GetTransaction(tx, txnHash) + if err != nil { + return fmt.Errorf("get transaction of %v from historydb failed: %v", txnHash, err) + } + + if historyTxn != nil { + // Transaction is confirmed + isTxnConfirmed = true + } + + return nil + default: + return err + } + + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + return err + } + + if err := VerifySingleTxnSoftConstraints(*txn, head.Time(), uxa, vs.Config.MaxBlockSize); err != nil { + return err + } + + return VerifySingleTxnHardConstraints(*txn, head, uxa) + }) + + // If we were able to query the inputs, return the verbose inputs to the caller + // even if the transaction failed validation + var uxs []wallet.UxBalance + if len(uxa) != 0 { + var otherErr error + uxs, otherErr = wallet.NewUxBalances(head.Time(), uxa) + if otherErr != nil { + return nil, isTxnConfirmed, otherErr + } + } + + return uxs, isTxnConfirmed, err +} + +// AddressCount returns the total number of addresses with unspents +func (vs *Visor) AddressCount() (uint64, error) { + var count uint64 + if err := vs.DB.View("AddressCount", func(tx *dbutil.Tx) error { + var err error + count, err = vs.Blockchain.Unspent().AddressCount(tx) + return err + }); err != nil { + return 0, err + } + + return count, nil +} + +// CreateTransactionDeprecated creates a transaction using an entire wallet, +// specifying only coins and one destination +func (vs *Visor) CreateTransactionDeprecated(wltID string, password []byte, coins uint64, dest cipher.Address) (*coin.Transaction, error) { + w, err := vs.Wallets.GetWallet(wltID) + if err != nil { + logger.WithError(err).Error("Wallets.GetWallet failed") + return nil, err + } + + // Get all addresses from the wallet for checking params against + addrs := w.GetAddresses() + + var auxs coin.AddressUxOuts + var head *coin.SignedBlock + + if err := vs.DB.View("CreateTransactionDeprecated", func(tx *dbutil.Tx) error { + head, err = vs.Blockchain.Head(tx) + if err != nil { + logger.Errorf("Blockchain.Head failed: %v", err) + return err + } + + // Get unspent outputs, while checking that there are no unconfirmed outputs + auxs, err = vs.getUnspentsForSpending(tx, addrs, false) + if err != nil { + if err != wallet.ErrSpendingUnconfirmed { + logger.WithError(err).Error("getUnspentsForSpending failed") + } + return err + } + + return nil + }); err != nil { + return nil, err + } + + // Create and sign transaction + var txn *coin.Transaction + if err := vs.Wallets.ViewWallet(w, password, func(w *wallet.Wallet) error { + var err error + txn, err = w.CreateAndSignTransaction(auxs, head.Time(), coins, dest) + return err + }); err != nil { + logger.WithError(err).Error("CreateAndSignTransaction failed") + return nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // NOTE: this isn't inside the database transaction, but it's safe, + // if a racing database write caused this transaction to be invalid, it would be caught here + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, err + } + if err := vs.DB.View("VerifySingleTxnSoftHardConstraints", func(tx *dbutil.Tx) error { + return vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.MaxBlockSize) + }); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, err + } + + return txn, nil +} + +// CreateTransaction creates a transaction based upon the parameters in wallet.CreateTransactionParams +func (vs *Visor) CreateTransaction(params wallet.CreateTransactionParams) (*coin.Transaction, []wallet.UxBalance, error) { + if err := params.Validate(); err != nil { + return nil, nil, err + } + + w, err := vs.Wallets.GetWallet(params.Wallet.ID) + if err != nil { + logger.WithError(err).Error("Wallets.GetWallet failed") + return nil, nil, err + } + + // Get all addresses from the wallet for checking params against + allAddrs := w.GetAddresses() + + var auxs coin.AddressUxOuts + var head *coin.SignedBlock + + if err := vs.DB.View("CreateTransaction", func(tx *dbutil.Tx) error { + var err error + head, err = vs.Blockchain.Head(tx) + if err != nil { + logger.WithError(err).Error("Blockchain.Head failed") + return err + } + + auxs, err = vs.getCreateTransactionAuxs(tx, params, allAddrs) + return err + }); err != nil { + return nil, nil, err + } + + // Create and sign transaction + var txn *coin.Transaction + var inputs []wallet.UxBalance + if err := vs.Wallets.ViewWallet(w, params.Wallet.Password, func(w *wallet.Wallet) error { + var err error + txn, inputs, err = w.CreateAndSignTransactionAdvanced(params, auxs, head.Time()) + return err + }); err != nil { + logger.WithError(err).Error("CreateAndSignTransactionAdvanced failed") + return nil, nil, err + } + + // The wallet can create transactions that would not pass all validation, such as the decimal restriction, + // because the wallet is not aware of visor-level constraints. + // Check that the transaction is valid before returning it to the caller. + // NOTE: this isn't inside the database transaction, but it's safe, + // if a racing database write caused this transaction to be invalid, it would be caught here + if err := VerifySingleTxnUserConstraints(*txn); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, nil, err + } + if err := vs.DB.View("VerifySingleTxnSoftHardConstraints", func(tx *dbutil.Tx) error { + return vs.Blockchain.VerifySingleTxnSoftHardConstraints(tx, *txn, vs.Config.MaxBlockSize) + }); err != nil { + logger.WithError(err).Error("Created transaction violates transaction constraints") + return nil, nil, err + } + + return txn, inputs, nil +} + +func (vs *Visor) getCreateTransactionAuxs(tx *dbutil.Tx, params wallet.CreateTransactionParams, allAddrs []cipher.Address) (coin.AddressUxOuts, error) { + allAddrsMap := make(map[cipher.Address]struct{}, len(allAddrs)) + for _, a := range allAddrs { + allAddrsMap[a] = struct{}{} + } + + var auxs coin.AddressUxOuts + if len(params.Wallet.UxOuts) != 0 { + // Check if any of the outputs are in an unconfirmed spend + hashesMap := make(map[cipher.SHA256]struct{}, len(params.Wallet.UxOuts)) + for _, h := range params.Wallet.UxOuts { + hashesMap[h] = struct{}{} + } + + // Get all unconfirmed spending uxouts + unconfirmedTxns, err := vs.Unconfirmed.RawTxns(tx) + if err != nil { + return nil, err + } + + var unconfirmedSpends []cipher.SHA256 + for _, txn := range unconfirmedTxns { + unconfirmedSpends = append(unconfirmedSpends, txn.In...) + } + + if params.IgnoreUnconfirmed { + // Filter unconfirmed spends + prevLen := len(hashesMap) + for _, h := range unconfirmedSpends { + delete(hashesMap, h) + } + + if prevLen != len(hashesMap) { + params.Wallet.UxOuts = make([]cipher.SHA256, 0, len(hashesMap)) + for h := range hashesMap { + params.Wallet.UxOuts = append(params.Wallet.UxOuts, h) + } + } + } else { + for _, h := range unconfirmedSpends { + if _, ok := hashesMap[h]; ok { + return nil, wallet.ErrSpendingUnconfirmed + } + } + } + + // Retrieve the uxouts from the pool. + // An error is returned if any do not exist + uxouts, err := vs.Blockchain.Unspent().GetArray(tx, params.Wallet.UxOuts) + if err != nil { + return nil, err + } + + // Build coin.AddressUxOuts map, and check that the address is in the wallets + auxs = make(coin.AddressUxOuts) + for _, o := range uxouts { + if _, ok := allAddrsMap[o.Body.Address]; !ok { + return nil, wallet.ErrUnknownUxOut + } + auxs[o.Body.Address] = append(auxs[o.Body.Address], o) + } + + } else { + addrs := params.Wallet.Addresses + if len(addrs) == 0 { + addrs = allAddrs + } else { + // Check that requested addresses are in the wallet + for _, a := range addrs { + if _, ok := allAddrsMap[a]; !ok { + return nil, wallet.ErrUnknownAddress + } + } + } + + // Get unspent outputs, while checking that there are no unconfirmed outputs + var err error + auxs, err = vs.getUnspentsForSpending(tx, addrs, params.IgnoreUnconfirmed) + if err != nil { + return nil, err + } + } + + return auxs, nil +} + +// getUnspentsForSpending returns the unspent outputs for a set of addresses, +// but returns an error if any of the unspents are in the unconfirmed outputs pool +func (vs *Visor) getUnspentsForSpending(tx *dbutil.Tx, addrs []cipher.Address, ignoredUnconfirmed bool) (coin.AddressUxOuts, error) { + unconfirmedAuxs, err := vs.unconfirmedSpendsOfAddresses(tx, addrs) + if err != nil { + err = fmt.Errorf("UnconfirmedSpendsOfAddresses failed: %v", err) + return nil, err + } + + if !ignoredUnconfirmed { + // Check that this is not trying to spend unconfirmed outputs + if len(unconfirmedAuxs) > 0 { + return nil, wallet.ErrSpendingUnconfirmed + } + } + + auxs, err := vs.Blockchain.Unspent().GetUnspentsOfAddrs(tx, addrs) + if err != nil { + err = fmt.Errorf("GetUnspentsOfAddrs failed: %v", err) + return nil, err + } + + // Filter unconfirmed + if ignoredUnconfirmed && len(unconfirmedAuxs) > 0 { + auxs = auxs.Sub(unconfirmedAuxs) + } + + return auxs, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/visor/visor_test.go b/vendor/github.com/skycoin/skycoin/src/visor/visor_test.go new file mode 100755 index 0000000..5035316 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/visor/visor_test.go @@ -0,0 +1,3055 @@ +package visor + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "os" + "path/filepath" + "sort" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + _require "github.com/skycoin/skycoin/src/testutil/require" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/utc" + "github.com/skycoin/skycoin/src/visor/blockdb" + "github.com/skycoin/skycoin/src/visor/dbutil" + "github.com/skycoin/skycoin/src/visor/historydb" + "github.com/skycoin/skycoin/src/wallet" +) + +const ( + blockchainPubkeyStr = "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" +) + +func prepareDB(t *testing.T) (*dbutil.DB, func()) { + db, shutdown := testutil.PrepareDB(t) + + err := CreateBuckets(db) + if err != nil { + shutdown() + t.Fatalf("CreateBuckets failed: %v", err) + } + + return db, shutdown +} + +func readAll(t *testing.T, f string) []byte { + fi, err := os.Open(f) + require.NoError(t, err) + defer fi.Close() + + b, err := ioutil.ReadAll(fi) + require.NoError(t, err) + + return b +} + +func mustParsePubkey(t *testing.T) cipher.PubKey { + // Parse the blockchain pubkey associated with this corrupted test db + t.Helper() + pubkey, err := cipher.PubKeyFromHex(blockchainPubkeyStr) + require.NoError(t, err) + return pubkey +} + +func writeDBFile(t *testing.T, badDBFile string, badDBData []byte) { + t.Logf("Writing the original bad db file back to %s", badDBFile) + fi, err := os.OpenFile(badDBFile, os.O_WRONLY, 0600) + require.NoError(t, err) + defer fi.Close() + + _, err = io.Copy(fi, bytes.NewBuffer(badDBData)) + require.NoError(t, err) +} + +func findCorruptDBFiles(t *testing.T, badDBFile string) []string { + corruptFiles, err := filepath.Glob(badDBFile + ".corrupt.*") + require.NoError(t, err) + return corruptFiles +} + +func removeCorruptDBFiles(t *testing.T, badDBFile string) { + corruptFiles := findCorruptDBFiles(t, badDBFile) + for _, m := range corruptFiles { + err := os.Remove(m) + require.NoError(t, err) + } +} + +func addGenesisBlockToVisor(t *testing.T, vs *Visor) *coin.SignedBlock { + // create genesis block + gb, err := coin.NewGenesisBlock(genAddress, genCoins, genTime) + require.NoError(t, err) + gbSig := cipher.SignHash(gb.HashHeader(), genSecret) + vs.Config.GenesisSignature = gbSig + + sb := coin.SignedBlock{ + Block: *gb, + Sig: gbSig, + } + + // add genesis block to blockchain + err = vs.DB.Update("", func(tx *dbutil.Tx) error { + return vs.executeSignedBlock(tx, sb) + }) + require.NoError(t, err) + + return &sb +} + +func TestErrMissingSignatureRecreateDB(t *testing.T) { + badDBFile := "./testdata/data.db.nosig" // about 8MB size + badDBData := readAll(t, badDBFile) + + pubkey := mustParsePubkey(t) + + // Remove any existing corrupt db files from testdata + removeCorruptDBFiles(t, badDBFile) + corruptFiles := findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 0) + + // Cleanup + defer func() { + // Write the bad db data back to badDBFile + writeDBFile(t, badDBFile, badDBData) + // Remove leftover corrupt db copies + removeCorruptDBFiles(t, badDBFile) + }() + + // Make sure that the database file causes ErrMissingSignature error + t.Logf("Checking that %s is a corrupted database", badDBFile) + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + + // err = db.View("", func(tx *dbutil.Tx) error { + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return bc.VerifySignature(b) + } + + err = bc.WalkChain(BlockchainVerifyTheadNum, f, nil) + + require.Error(t, err) + require.IsType(t, blockdb.ErrMissingSignature{}, err) + }() + + // Loading this invalid db should cause ResetCorruptDB() to recreate the db + t.Logf("Loading the corrupted db from %s", badDBFile) + badDB, err := OpenDB(badDBFile, false) + require.NoError(t, err) + require.NotNil(t, badDB) + require.NotEmpty(t, badDB.Path()) + t.Logf("badDB.Path() == %s", badDB.Path()) + + db, err := RepairCorruptDB(badDB, pubkey, nil) + require.NoError(t, err) + + err = db.Close() + require.NoError(t, err) + + require.NotNil(t, db) + + // A corrupted database file should exist + corruptFiles = findCorruptDBFiles(t, badDBFile) + require.Len(t, corruptFiles, 1) + + // A new db should be written in place of the old bad db, and not be corrupted + t.Logf("Checking that the new db file is valid") + func() { + db, err := OpenDB(badDBFile, false) + require.NoError(t, err) + defer func() { + err := db.Close() + assert.NoError(t, err) + }() + + // The new db is not corrupted and loads without error + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + Arbitrating: false, + }) + require.NoError(t, err) + require.NotNil(t, bc) + }() +} + +func TestHistorydbVerifier(t *testing.T) { + tt := []struct { + name string + dbPath string + expectErr error + }{ + { + name: "db is ok", + dbPath: "./testdata/data.db.ok", + }, + { + name: "missing transaction", + dbPath: "./testdata/data.db.notxn", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction 98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb does not exist in historydb")), + }, + { + name: "missing uxout", + dbPath: "./testdata/data.db.nouxout", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New("HistoryDB.Verify: transaction (input|output) 2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0 does not exist in historydb")), + }, + { + name: "missing addr transaction index", + dbPath: "./testdata/data.db.no-addr-txn-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address transaction \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:98db7eb30e13853d3dd93d5d8b4061596d5d288b6f8b92c4d43c46c6599f67fb\] does not exist in historydb`)), + }, + { + name: "missing addr uxout index", + dbPath: "./testdata/data.db.no-addr-uxout-index", + expectErr: historydb.NewErrHistoryDBCorrupted(errors.New(`HistoryDB.Verify: index of address uxout \[2fGC7kwAM9yZyEF1QqBqp8uo9RUsF6ENGJF:2f87d77c2a7d00b547db1af50e0ba04bafc5b05711e4939e9ec2640a21127dc0\] does not exist in historydb`)), + }, + } + + pubKeyStr := "0328c576d3f420e7682058a981173a4b374c7cc5ff55bf394d3cf57059bbe6456a" + pubkey := cipher.MustPubKeyFromHex(pubKeyStr) + history := historydb.New() + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + db, err := OpenDB(tc.dbPath, true) + require.NoError(t, err) + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: pubkey, + }) + require.NoError(t, err) + + indexesMap := historydb.NewIndexesMap() + f := func(tx *dbutil.Tx, b *coin.SignedBlock) error { + return history.Verify(tx, b, indexesMap) + } + + err = bc.WalkChain(2, f, nil) + if tc.expectErr == nil { + require.Nil(t, err) + return + } + + // Confirms that the error type is matched + require.IsType(t, tc.expectErr, err) + // Confirms the error message is matched + require.Regexp(t, tc.expectErr.Error(), err.Error()) + }) + } + +} + +func TestVisorCreateBlock(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + + unconfirmed, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + cfg.IsMaster = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + history: his, + } + + // CreateBlock panics if called when not master + _require.PanicsWithLogMessage(t, "Only master chain can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsMaster = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err = v.createBlock(tx, when) + testutil.RequireError(t, err, "No transactions") + return nil + }) + require.NoError(t, err) + + // Create enough unspent outputs to create all of these transactions + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + nUnspents := 100 + txn := makeUnspentsTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, nUnspents, maxDropletDivisor) + + var known bool + var softErr *ErrTxnViolatesSoftConstraint + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, softErr, err = unconfirmed.InjectTransaction(tx, bc, txn, v.Config.MaxBlockSize) + return err + }) + require.NoError(t, err) + require.False(t, known) + require.Nil(t, softErr) + + v.Config.MaxBlockSize = txn.Size() + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + + var length uint64 + err = db.View("", func(tx *dbutil.Tx) error { + var err error + length, err = unconfirmed.Len(tx) + return err + }) + require.NoError(t, err) + + require.Equal(t, uint64(0), length) + v.Config.MaxBlockSize = 1024 * 4 + + // Create various transactions and add them to unconfirmed pool + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + var coins uint64 = 9e6 + var f uint64 = 10 + toAddr := testutil.MakeAddress() + + // Add more transactions than is allowed in a block, to verify truncation + var txns coin.Transactions + var i int + for len(txns) == len(txns.TruncateBytesTo(v.Config.MaxBlockSize)) { + tx := makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f) + txns = append(txns, tx) + i++ + } + require.NotEqual(t, 0, len(txns)) + + // Use different f sizes to verify f ordering + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*5)) + i++ + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins, f*10)) + i++ + + // Use invalid decimal places to verify decimal place filtering. + // The fs are set higher to ensure that they are not filtered due to truncating with a low f + // Spending 9.1 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e5, f*20)) + i++ + // Spending 9.01 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e4, f*30)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e3, f*40)) + i++ + // Spending 9.0001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e2, f*50)) + i++ + // Spending 9.00001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1e1, f*60)) + i++ + // Spending 9.000001 SKY + txns = append(txns, makeSpendTxWithFee(t, coin.UxArray{uxs[i]}, []cipher.SecKey{genSecret}, toAddr, coins+1, f*70)) + i++ + + // Confirm that at least one transaction has an invalid decimal output + foundInvalidCoins := false + for _, txn := range txns { + for _, o := range txn.Out { + if err := DropletPrecisionCheck(o.Coins); err != nil { + foundInvalidCoins = true + break + } + } + } + require.True(t, foundInvalidCoins) + + // Inject transactions into the unconfirmed pool + for _, txn := range txns { + var known bool + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + known, _, err = unconfirmed.InjectTransaction(tx, bc, txn, v.Config.MaxBlockSize) + return err + }) + require.False(t, known) + require.NoError(t, err) + } + + err = db.Update("", func(tx *dbutil.Tx) error { + var err error + sb, err = v.createBlock(tx, when+100) + return err + }) + require.NoError(t, err) + require.Equal(t, when+100, sb.Block.Head.Time) + + blockTxns := sb.Block.Body.Transactions + require.NotEqual(t, len(txns), len(blockTxns), "Txns should be truncated") + require.Equal(t, 18, len(blockTxns)) + + // Check fee ordering + err = db.View("", func(tx *dbutil.Tx) error { + inUxs, err := v.Blockchain.Unspent().GetArray(tx, blockTxns[0].In) + require.NoError(t, err) + prevFee, err := fee.TransactionFee(&blockTxns[0], sb.Head.Time, inUxs) + require.NoError(t, err) + + for i := 1; i < len(blockTxns); i++ { + inUxs, err := v.Blockchain.Unspent().GetArray(tx, blockTxns[i].In) + require.NoError(t, err) + f, err := fee.TransactionFee(&blockTxns[i], sb.Head.Time, inUxs) + require.NoError(t, err) + require.True(t, f <= prevFee) + prevFee = f + } + + return nil + }) + + require.NoError(t, err) + + // Check that decimal rules are enforced + for i, txn := range blockTxns { + for j, o := range txn.Out { + err := DropletPrecisionCheck(o.Coins) + require.NoError(t, err, "txout %d.%d coins=%d", i, j, o.Coins) + } + } +} + +func TestVisorInjectTransaction(t *testing.T) { + when := uint64(time.Now().UTC().Unix()) + + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + cfg.IsMaster = false + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + history: his, + } + + // CreateBlock panics if called when not master + _require.PanicsWithLogMessage(t, "Only master chain can create blocks", func() { + err := db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + require.NoError(t, err) + }) + + v.Config.IsMaster = true + v.Config.BlockchainSeckey = genSecret + + addGenesisBlockToVisor(t, v) + + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + // If no transactions in the unconfirmed pool, return an error + err = db.Update("", func(tx *dbutil.Tx) error { + _, err := v.createBlock(tx, when) + return err + }) + testutil.RequireError(t, err, "No transactions") + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a transaction with valid decimal places + txn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectTransaction(txn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + // Execute a block to clear this transaction from the pool + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + uxs = coin.CreateUnspents(sb.Head, sb.Body.Transactions[0]) + + // Check transactions with overflowing output coins fail + txn = makeOverflowCoinsSpendTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectTransaction(txn) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Output coins overflow") + require.Nil(t, softErr) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Check transactions with overflowing output hours fail + // It should not be injected; when injecting a txn, the overflowing output hours is treated + // as a hard constraint. It is only a soft constraint when the txn is included in a signed block. + txn = makeOverflowHoursSpendTx(coin.UxArray{uxs[0]}, []cipher.SecKey{genSecret}, toAddr) + _, softErr, err = v.InjectTransaction(txn) + require.Nil(t, softErr) + require.IsType(t, ErrTxnViolatesHardConstraint{}, err) + testutil.RequireError(t, err.(ErrTxnViolatesHardConstraint).Err, "Transaction output hours overflow") + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + invalidCoins := coins + (maxDropletDivisor / 10) + txn = makeSpendTx(t, uxs, []cipher.SecKey{genSecret, genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectTransaction(txn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, errInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with null address output + uxs = coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + txn = makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + txn.Out[0].Address = cipher.Address{} + known, err = v.InjectTransactionStrict(txn) + require.False(t, known) + require.IsType(t, ErrTxnViolatesUserConstraint{}, err) + testutil.RequireError(t, err, "Transaction violates user constraint: Transaction output is sent to the null address") +} + +func makeOverflowCoinsSpendTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' coins added up will overflow + spendTx.PushOutput(toAddr, 18446744073709551000, hours) + spendTx.PushOutput(toAddr, totalCoins, hours) + + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + return spendTx +} + +func makeOverflowHoursSpendTx(uxs coin.UxArray, keys []cipher.SecKey, toAddr cipher.Address) coin.Transaction { + spendTx := coin.Transaction{} + var totalHours uint64 + var totalCoins uint64 + for _, ux := range uxs { + spendTx.PushInput(ux.Hash()) + totalHours += ux.Body.Hours + totalCoins += ux.Body.Coins + } + + hours := totalHours / 12 + + // These two outputs' hours added up will overflow + spendTx.PushOutput(toAddr, totalCoins/2, 18446744073709551615) + spendTx.PushOutput(toAddr, totalCoins-totalCoins/2, hours) + + spendTx.SignInputs(keys) + spendTx.UpdateHeader() + return spendTx +} + +func TestVisorCalculatePrecision(t *testing.T) { + cases := []struct { + precision uint64 + divisor uint64 + }{ + {0, 1e6}, + {1, 1e5}, + {2, 1e4}, + {3, 1e3}, + {4, 1e2}, + {5, 1e1}, + {6, 1}, + } + + for _, tc := range cases { + name := fmt.Sprintf("calculateDivisor(%d)=%d", tc.precision, tc.divisor) + t.Run(name, func(t *testing.T) { + divisor := calculateDivisor(tc.precision) + require.Equal(t, tc.divisor, divisor, "%d != %d", tc.divisor, divisor) + }) + } + + _require.PanicsWithLogMessage(t, "precision must be <= droplet.Exponent", func() { + calculateDivisor(7) + }) +} + +func makeTestData(t *testing.T, n int) ([]historydb.Transaction, []coin.SignedBlock, []UnconfirmedTxn, uint64) { // nolint: unparam + var txs []historydb.Transaction + var blocks []coin.SignedBlock + var uncfmTxs []UnconfirmedTxn + for i := uint64(0); i < uint64(n); i++ { + tm := utc.UnixNow() + int64(i)*int64(time.Second) + txs = append(txs, historydb.Transaction{ + BlockSeq: i, + Tx: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + }) + + blocks = append(blocks, coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + BkSeq: i, + Time: uint64(tm), + }, + }, + }) + + uncfmTxs = append(uncfmTxs, UnconfirmedTxn{ + Txn: coin.Transaction{ + InnerHash: testutil.RandSHA256(t), + }, + Received: utc.UnixNow() + int64(n)*int64(time.Second), + }) + } + + return txs, blocks, uncfmTxs, uint64(n) +} + +func makeUncfmUxs(txs []UnconfirmedTxn) coin.UxArray { + var uxs coin.UxArray + for i := range txs { + uxs = append(uxs, coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(txs[i].Received), + }, + Body: coin.UxBody{ + SrcTransaction: txs[i].Hash(), + }, + }) + } + return uxs +} + +type txsAndUncfmTxs struct { + Txs []historydb.Transaction + UncfmTxs []UnconfirmedTxn +} +type expectTxResult struct { + txs []Transaction + uncfmTxs []Transaction + err error +} + +func TestGetTransactions(t *testing.T) { + // Generates test data + txs, blocks, uncfmTxs, headSeq := makeTestData(t, 10) + // Generates []Transaction + var ltxs []Transaction + for i := range txs { + height := headSeq - txs[i].BlockSeq + 1 + ltxs = append(ltxs, Transaction{ + Txn: txs[i].Tx, + Status: NewConfirmedTransactionStatus(height, txs[i].BlockSeq), + Time: blocks[i].Time(), + }) + } + + // Generate unconfirmed []Transaction + var luncfmTxs []Transaction + for i, tx := range uncfmTxs { + luncfmTxs = append(luncfmTxs, Transaction{ + Txn: uncfmTxs[i].Txn, + Status: NewUnconfirmedTransactionStatus(), + Time: uint64(nanoToTime(tx.Received).Unix()), + }) + } + + // Generates addresses + var addrs []cipher.Address + for i := 0; i < 10; i++ { + addrs = append(addrs, testutil.MakeAddress()) + } + + tt := []struct { + name string + addrTxns map[cipher.Address]txsAndUncfmTxs + blocks []coin.SignedBlock + bcHeadSeq uint64 + filters []TxFilter + expect expectTxResult + }{ + { + "addrFilter=1 addr=1 txs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=0 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=0 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=2 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=1 txs=2 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=0 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=0 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=1 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=2 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: nil, + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=2 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=2 unconfirmedTxs=3", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: luncfmTxs[:3], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=3 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: nil, + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:3], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=3 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:3], + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=3 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:3], + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 addr=2 txs=3 unconfirmedTxs=3", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: uncfmTxs[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + }, + expectTxResult{ + txs: ltxs[:3], + uncfmTxs: luncfmTxs[:3], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false txs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=false confirmedTxs=2 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "confirmedTxFilter=1 confirmed=true confirmedTxs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmedTxFilter=1 confirmed=false addr=1 txs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{}, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=1 txs=1 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:1], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txs=2 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2 txs=2 unconfirmedTxs=3", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/1 txs=2 unconfirmedTxs=3", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[:2], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=false addr=2/2 txs=2 unconfirmedTxs=3", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: uncfmTxs[2:3], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[1:2]), + ConfirmedTxFilter(false), + }, + expectTxResult{ + txs: nil, + uncfmTxs: luncfmTxs[2:3], + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txs=0 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: nil, + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: nil, + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txs=1 unconfirmedTxs=0", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: nil, + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txs=1 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:1], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:1], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txs=2 unconfirmedTxs=1", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=1 txs=2 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/1 txs=3 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: uncfmTxs[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:1]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:2], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2/2 txs=3 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: uncfmTxs[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[1:2]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[2:3], + uncfmTxs: nil, + err: nil, + }, + }, + { + "addrFilter=1 confirmed=true addr=2 txs=3 unconfirmedTxs=2", + map[cipher.Address]txsAndUncfmTxs{ + addrs[0]: txsAndUncfmTxs{ + Txs: txs[:2], + UncfmTxs: uncfmTxs[:1], + }, + addrs[1]: txsAndUncfmTxs{ + Txs: txs[2:3], + UncfmTxs: uncfmTxs[1:2], + }, + }, + blocks[:], + headSeq, + []TxFilter{ + AddrsFilter(addrs[:2]), + ConfirmedTxFilter(true), + }, + expectTxResult{ + txs: ltxs[:3], + uncfmTxs: nil, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + his := newHistoryerMock2() + uncfmTxPool := NewUnconfirmedTxnPoolerMock2() + for addr, txs := range tc.addrTxns { + his.On("GetAddressTxns", matchTx, addr).Return(txs.Txs, nil) + his.txs = append(his.txs, txs.Txs...) + + uncfmTxPool.On("GetUnspentsOfAddr", matchTx, addr).Return(makeUncfmUxs(txs.UncfmTxs), nil) + for i, uncfmTx := range txs.UncfmTxs { + uncfmTxPool.On("Get", matchTx, uncfmTx.Hash()).Return(&txs.UncfmTxs[i], nil) + } + uncfmTxPool.txs = append(uncfmTxPool.txs, txs.UncfmTxs...) + } + + bc := NewBlockchainerMock() + for i, b := range tc.blocks { + bc.On("GetSignedBlockBySeq", matchTx, b.Seq()).Return(&tc.blocks[i], nil) + } + + bc.On("HeadSeq", matchTx).Return(tc.bcHeadSeq, true, nil) + + db, shutdown := prepareDB(t) + defer shutdown() + + v := &Visor{ + DB: db, + history: his, + Unconfirmed: uncfmTxPool, + Blockchain: bc, + } + + retTxs, err := v.GetTransactions(tc.filters...) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Len(t, retTxs, len(tc.expect.txs)+len(tc.expect.uncfmTxs)) + + // Splits confirmed and unconfirmed txs in returned transactions + uncfmTxMap := make(map[cipher.SHA256]Transaction) + txMap := make(map[cipher.SHA256]Transaction) + for i, tx := range retTxs { + if retTxs[i].Status.Confirmed { + txMap[tx.Txn.Hash()] = retTxs[i] + } else { + uncfmTxMap[tx.Txn.Hash()] = retTxs[i] + } + } + + // Confirms that all expected confirmed transactions must be in the txMap + for _, tx := range tc.expect.txs { + retTx, ok := txMap[tx.Txn.Hash()] + require.True(t, ok) + require.Equal(t, tx, retTx) + } + + // Confirms that all expected unconfirmed transactions must be in the uncfmTxMap + for _, tx := range tc.expect.uncfmTxs { + retTx, ok := uncfmTxMap[tx.Txn.Hash()] + require.True(t, ok) + require.Equal(t, tx, retTx) + } + }) + } +} + +func TestRefreshUnconfirmed(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + cfg.IsMaster = true + cfg.BlockchainSeckey = genSecret + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + + v := &Visor{ + Config: cfg, + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + toAddr := testutil.MakeAddress() + var coins uint64 = 10e6 + + // Create a valid transaction that will remain valid + validTxn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectTransaction(validTxn) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction with invalid decimal places + // It's still injected, because this is considered a soft error + // This transaction will stay invalid on refresh + invalidCoins := coins + (maxDropletDivisor / 10) + alwaysInvalidTxn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, invalidCoins) + _, softErr, err = v.InjectTransaction(alwaysInvalidTxn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, errInvalidDecimals.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Create a transaction that exceeds MaxBlockSize + // It's still injected, because this is considered a soft error + // This transaction will become valid on refresh (by increasing MaxBlockSize) + v.Config.MaxBlockSize = 1 + sometimesInvalidTxn := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, toAddr, coins) + _, softErr, err = v.InjectTransaction(sometimesInvalidTxn) + require.NoError(t, err) + testutil.RequireError(t, softErr.Err, errTxnExceedsMaxBlockSize.Error()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(3), length) + return nil + }) + require.NoError(t, err) + + // The first txn remains valid, + // the second txn remains invalid, + // the third txn becomes valid + v.Config.MaxBlockSize = DefaultMaxBlockSize + hashes, err := v.RefreshUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{sometimesInvalidTxn.Hash()}, hashes) + + // Reduce the max block size to affirm that the valid transaction becomes invalid + // The first txn becomes invalid, + // the second txn remains invalid, + // the third txn becomes invalid again + v.Config.MaxBlockSize = 1 + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + require.Nil(t, hashes) + + // Restore the max block size to affirm the expected transaction validity shifts + // The first txn was valid, became invalid, and is now valid again + // The second txn was always invalid + // The third txn was invalid, became valid, became invalid, and is now valid again + v.Config.MaxBlockSize = DefaultMaxBlockSize + hashes, err = v.RefreshUnconfirmed() + require.NoError(t, err) + + // Sort hashes for deterministic comparison + expectedHashes := []cipher.SHA256{validTxn.Hash(), sometimesInvalidTxn.Hash()} + sort.Slice(expectedHashes, func(i, j int) bool { + return bytes.Compare(expectedHashes[i][:], expectedHashes[j][:]) < 0 + }) + sort.Slice(hashes, func(i, j int) bool { + return bytes.Compare(hashes[i][:], hashes[j][:]) < 0 + }) + require.Equal(t, expectedHashes, hashes) +} + +func TestRemoveInvalidUnconfirmedDoubleSpendArbitrating(t *testing.T) { + db, shutdown := prepareDB(t) + defer shutdown() + + bc, err := NewBlockchain(db, BlockchainConfig{ + Pubkey: genPublic, + Arbitrating: true, + }) + require.NoError(t, err) + + unconfirmed, err := NewUnconfirmedTxnPool(db) + require.NoError(t, err) + + his := historydb.New() + + cfg := NewVisorConfig() + cfg.DBPath = db.Path() + cfg.IsMaster = true + cfg.Arbitrating = true + cfg.BlockchainPubkey = genPublic + cfg.GenesisAddress = genAddress + cfg.BlockchainSeckey = genSecret + + v := &Visor{ + Config: cfg, + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + history: his, + } + + addGenesisBlockToVisor(t, v) + var gb *coin.SignedBlock + err = db.View("", func(tx *dbutil.Tx) error { + var err error + gb, err = v.Blockchain.GetGenesisBlock(tx) + return err + }) + require.NoError(t, err) + require.NotNil(t, gb) + + uxs := coin.CreateUnspents(gb.Head, gb.Body.Transactions[0]) + + // Create two valid transactions, both spending the same inputs, one with a higher fee + // Then, create a block from these transactions. + // The one with the higher fee should be included in the block, and the other should be ignored. + // A call to RemoveInvalidUnconfirmed will remove the other txn, because it would now be a double spend. + + var coins uint64 = 10e6 + txn1 := makeSpendTx(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins) + known, softErr, err := v.InjectTransaction(txn1) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + return nil + }) + require.NoError(t, err) + + var fee uint64 = 1 + txn2 := makeSpendTxWithFee(t, uxs, []cipher.SecKey{genSecret}, genAddress, coins, fee) + known, softErr, err = v.InjectTransaction(txn2) + require.False(t, known) + require.Nil(t, softErr) + require.NoError(t, err) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + return nil + }) + require.NoError(t, err) + + // Execute a block, txn2 should be included because it has a higher fee + sb, err := v.CreateAndExecuteBlock() + require.NoError(t, err) + require.Equal(t, 1, len(sb.Body.Transactions)) + require.Equal(t, 2, len(sb.Body.Transactions[0].Out)) + require.Equal(t, txn2.TxIDHex(), sb.Body.Transactions[0].TxIDHex()) + + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(1), length) + + length, err = bc.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(2), length) + + return nil + }) + require.NoError(t, err) + + // Call RemoveInvalidUnconfirmed, the first txn will be removed because it is now a double-spend txn + removed, err := v.RemoveInvalidUnconfirmed() + require.NoError(t, err) + require.Equal(t, []cipher.SHA256{txn1.Hash()}, removed) + err = db.View("", func(tx *dbutil.Tx) error { + length, err := unconfirmed.Len(tx) + require.NoError(t, err) + require.Equal(t, uint64(0), length) + return nil + }) + require.NoError(t, err) +} + +func TestGetCreateTransactionAuxs(t *testing.T) { + allAddrs := make([]cipher.Address, 10) + for i := range allAddrs { + allAddrs[i] = testutil.MakeAddress() + } + + hashes := make([]cipher.SHA256, 20) + for i := range hashes { + hashes[i] = testutil.RandSHA256(t) + } + + srcTxns := make([]cipher.SHA256, 20) + for i := range srcTxns { + srcTxns[i] = testutil.RandSHA256(t) + } + + cases := []struct { + name string + params wallet.CreateTransactionParams + addrs []cipher.Address + expectedAuxs coin.AddressUxOuts + err error + + rawTxnsRet coin.Transactions + getArrayInputs []cipher.SHA256 + getArrayRet coin.UxArray + getUnspentsOfAddrsRet coin.AddressUxOuts + }{ + { + name: "all addresses, ok", + addrs: allAddrs, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "all addresses, unconfirmed spends", + addrs: allAddrs, + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: allAddrs[3], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + + { + name: "some addresses, ok", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:4], + }, + }, + addrs: allAddrs[0:4], + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "some addresses, unconfirmed spends", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:4], + }, + }, + addrs: allAddrs[0:4], + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[0:4], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[0], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: allAddrs[3], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + + { + name: "some addresses, unconfirmed spends ignored", + params: wallet.CreateTransactionParams{ + IgnoreUnconfirmed: true, + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: allAddrs[0:5], + }, + }, + addrs: allAddrs[0:5], + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + }, + getArrayInputs: hashes[0:2], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[7], + Address: allAddrs[4], + }, + }, + }, + getUnspentsOfAddrsRet: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + allAddrs[4]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[7], + Address: allAddrs[4], + }, + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "some addresses, unknown address", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + Addresses: []cipher.Address{testutil.MakeAddress()}, + }, + }, + addrs: allAddrs, + err: wallet.ErrUnknownAddress, + }, + + { + name: "uxouts specified, ok", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + allAddrs[3]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[6], + Address: allAddrs[3], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[0:4], + }, + }, + err: wallet.ErrSpendingUnconfirmed, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[6:10], + }, + coin.Transaction{ + In: hashes[3:6], + }, + }, + }, + + { + name: "uxouts specified, unconfirmed spend ignored", + params: wallet.CreateTransactionParams{ + IgnoreUnconfirmed: true, + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + coin.Transaction{ + In: hashes[8:10], + }, + }, + getArrayInputs: hashes[5:8], // the 8th & 9th hash are filtered because it is an unconfirmed spend + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + expectedAuxs: coin.AddressUxOuts{ + allAddrs[1]: []coin.UxOut{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[5], + Address: allAddrs[1], + }, + }, + }, + }, + }, + + { + name: "uxouts specified, unknown uxout", + params: wallet.CreateTransactionParams{ + Wallet: wallet.CreateTransactionWalletParams{ + UxOuts: hashes[5:10], + }, + }, + err: wallet.ErrUnknownUxOut, + rawTxnsRet: coin.Transactions{ + coin.Transaction{ + In: hashes[0:2], + }, + coin.Transaction{ + In: hashes[2:4], + }, + }, + getArrayInputs: hashes[5:10], + getArrayRet: coin.UxArray{ + coin.UxOut{ + Body: coin.UxBody{ + SrcTransaction: srcTxns[4], + Address: testutil.MakeAddress(), + }, + }, + }, + }, + } + + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + unconfirmed := NewUnconfirmedTxnPoolerMock() + bc := NewBlockchainerMock() + unspent := NewUnspentPoolerMock() + require.Implements(t, (*blockdb.UnspentPooler)(nil), unspent) + + v := &Visor{ + Unconfirmed: unconfirmed, + Blockchain: bc, + DB: db, + } + + unconfirmed.On("RawTxns", matchTx).Return(tc.rawTxnsRet, nil) + unspent.On("GetArray", matchTx, mock.MatchedBy(func(args []cipher.SHA256) bool { + // Compares two []coin.UxOuts for equality, ignoring the order of elements in the slice + if len(args) != len(tc.getArrayInputs) { + return false + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(tc.getArrayInputs)) + for _, h := range tc.getArrayInputs { + _, ok := inputsMap[h] + require.False(t, ok) + inputsMap[h] = struct{}{} + } + + for _, h := range args { + _, ok := inputsMap[h] + if !ok { + return false + } + } + + return true + })).Return(tc.getArrayRet, nil) + if tc.getUnspentsOfAddrsRet != nil { + unspent.On("GetUnspentsOfAddrs", matchTx, tc.addrs).Return(tc.getUnspentsOfAddrsRet, nil) + } + bc.On("Unspent").Return(unspent) + + var auxs coin.AddressUxOuts + err := v.DB.View("", func(tx *dbutil.Tx) error { + var err error + auxs, err = v.getCreateTransactionAuxs(tx, tc.params, allAddrs) + return err + }) + + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + require.Equal(t, tc.expectedAuxs, auxs) + }) + } +} + +func makeTxn(t *testing.T, headTime uint64, in, out []coin.UxOut, keys []cipher.SecKey) (coin.Transaction, []wallet.UxBalance) { + inputs := make([]cipher.SHA256, len(in)) + for i, input := range in { + inputs[i] = input.Hash() + } + + outputs := make([]coin.TransactionOutput, len(out)) + for i, output := range out { + outputs[i] = coin.TransactionOutput{ + Address: output.Body.Address, + Coins: output.Body.Coins, + Hours: output.Body.Hours, + } + } + + txn := coin.Transaction{ + In: inputs, + Out: outputs, + } + + txn.SignInputs(keys) + txn.UpdateHeader() + + inbalances, err := wallet.NewUxBalances(headTime, in) + require.NoError(t, err) + return txn, inbalances +} + +func TestVerifyTxnVerbose(t *testing.T) { + head := coin.SignedBlock{ + Block: coin.Block{ + Head: coin.BlockHeader{ + Time: uint64(utc.UnixNow()), + }, + }, + } + + hashes := make([]cipher.SHA256, 20) + for i := 0; i < 20; i++ { + hashes[i] = testutil.RandSHA256(t) + } + + keys := make([]cipher.SecKey, 5) + for i := 0; i < 5; i++ { + _, keys[i] = cipher.GenerateKeyPair() + } + + addrs := make([]cipher.Address, 5) + for i := 0; i < 5; i++ { + addrs[i] = cipher.AddressFromSecKey(keys[i]) + } + + srcTxnHashes := make([]cipher.SHA256, 5) + inputs := make([]coin.UxOut, 5) + historyOutputs := make([]*historydb.UxOut, 5) + // intputHashes := make([]cipher.SHA256, 5) + for i := 0; i < 5; i++ { + srcTxnHashes[i] = testutil.RandSHA256(t) + inputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + SrcTransaction: srcTxnHashes[i], + Address: addrs[i], + Coins: 10e6, + Hours: 1000, + }, + } + + historyOutputs[i] = &historydb.UxOut{ + Out: inputs[i], + } + } + + outputs := make([]coin.UxOut, 5) + for i := 0; i < 5; i++ { + outputs[i] = coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: 400 + uint64(i)*200, + }, + } + } + + // add uxout with math.MaxUint64 hours + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 10e6, + Hours: math.MaxUint64, + }, + }) + + // add output which has 11e6 coins + outputs = append(outputs, coin.UxOut{ + Head: coin.UxHead{ + Time: head.Time(), + }, + Body: coin.UxBody{ + Address: testutil.MakeAddress(), + Coins: 11e6, + Hours: 500, + }, + }) + + // create a transaction + txn, spentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + + // create a transaction which sends coin to null address + toNullAddrTxn, toNullAddrSpentUxBalances := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[:1]) + toNullAddrTxn.Out[0].Address = cipher.Address{} + + // create a transaction with insufficient coin hours + inSufficientCoinHoursTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:5], keys[:1]) + + // create a transaction with zero fee + zeroFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[3:4], keys[:1]) + + // create a transaction with output coin hours overflow + coinHourOverflowTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[4:], keys[:1]) + + // create a transaction with insufficient fee + insufficientFeeTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[2:3], keys[:1]) + + // create a transaction with insufficient coins + insufficientCoinsTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[6:], keys[:1]) + + // create a transaction with invalid signature + badSigTxn, _ := makeTxn(t, head.Time(), inputs[:1], outputs[:1], keys[1:2]) + + cases := []struct { + name string + txn coin.Transaction + isConfirmed bool + balances []wallet.UxBalance + err error + + maxBlockSize int + + getArrayRet coin.UxArray + getArrayErr error + + getHistoryTxnRet *historydb.Transaction + getHistoryTxnErr error + + getHistoryUxOutsRet []*historydb.UxOut + getHistoryUxOutsErr error + }{ + { + name: "transaction has been spent", + txn: txn, + isConfirmed: true, + balances: spentUxBalances[:], + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + getHistoryTxnRet: &historydb.Transaction{Tx: txn}, + getHistoryUxOutsRet: historyOutputs[:1], + }, + { + name: "transaction does not exist in either unspents or historydb", + txn: txn, + isConfirmed: false, + err: ErrTxnViolatesHardConstraint{fmt.Errorf("transaction input of %s does not exist in either unspent pool or historydb", inputs[0].Hash().Hex())}, + + getArrayErr: blockdb.ErrUnspentNotExist{UxID: inputs[0].Hash().Hex()}, + }, + { + name: "transaction violate user constratins, send to null address", + txn: toNullAddrTxn, + isConfirmed: false, + err: ErrTxnViolatesUserConstraint{errors.New("Transaction output is sent to the null address")}, + balances: toNullAddrSpentUxBalances[:], + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, transaction size bigger than max block size", + maxBlockSize: 1, + txn: txn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction size bigger than max block size")}, + + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, Insufficient coinhours for transaction outputs", + txn: inSufficientCoinHoursTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientCoinHours}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, zero fee", + txn: zeroFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnNoFee}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, coin hour overflow", + txn: coinHourOverflowTxn, + err: ErrTxnViolatesSoftConstraint{errors.New("Transaction output hours overflow")}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate soft constraints, insufficient fee", + txn: insufficientFeeTxn, + err: ErrTxnViolatesSoftConstraint{fee.ErrTxnInsufficientFee}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, insufficient coin", + txn: insufficientCoinsTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Insufficient coins")}, + getArrayRet: inputs[:1], + }, + { + name: "transaction violate hard constraints, bad signature", + txn: badSigTxn, + err: ErrTxnViolatesHardConstraint{errors.New("Signature not valid for output being spent")}, + getArrayRet: inputs[:1], + }, + { + name: "ok", + txn: txn, + balances: spentUxBalances, + getArrayRet: inputs[:1], + }, + } + + matchTx := mock.MatchedBy(func(tx *dbutil.Tx) bool { + return true + }) + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + db, shutdown := testutil.PrepareDB(t) + defer shutdown() + + history := NewHistoryerMock() + bc := NewBlockchainerMock() + unspent := NewUnspentPoolerMock() + + bc.On("Unspent").Return(unspent) + bc.On("Head", matchTx).Return(&head, nil) + + unspent.On("GetArray", matchTx, tc.txn.In).Return(tc.getArrayRet, tc.getArrayErr) + + history.On("GetTransaction", matchTx, tc.txn.Hash()).Return(tc.getHistoryTxnRet, tc.getHistoryTxnErr) + history.On("GetUxOuts", matchTx, tc.txn.In).Return(tc.getHistoryUxOutsRet, tc.getHistoryUxOutsErr) + + v := &Visor{ + Blockchain: bc, + DB: db, + history: history, + Config: Config{ + MaxBlockSize: tc.maxBlockSize, + }, + } + + if v.Config.MaxBlockSize == 0 { + v.Config.MaxBlockSize = DefaultMaxBlockSize + } + + var isConfirmed bool + var balances []wallet.UxBalance + err := v.DB.View("VerifyTxnVerbose", func(tx *dbutil.Tx) error { + var err error + balances, isConfirmed, err = v.VerifyTxnVerbose(&tc.txn) + return err + }) + + require.Equal(t, tc.err, err) + if tc.err != nil { + return + } + + require.NoError(t, err) + require.Equal(t, tc.isConfirmed, isConfirmed) + require.Equal(t, tc.balances, balances) + }) + } +} + +// historyerMock2 embeds historyerMock, and rewrite the ForEach method +type historyerMock2 struct { + HistoryerMock + txs []historydb.Transaction +} + +func newHistoryerMock2() *historyerMock2 { + return &historyerMock2{} +} + +func (h *historyerMock2) ForEachTxn(tx *dbutil.Tx, f func(cipher.SHA256, *historydb.Transaction) error) error { + for i := range h.txs { + if err := f(h.txs[i].Hash(), &h.txs[i]); err != nil { + return err + } + } + return nil +} + +// UnconfirmedTxnPoolerMock2 embeds UnconfirmedTxnPoolerMock, and rewrite the GetTxns method +type UnconfirmedTxnPoolerMock2 struct { + UnconfirmedTxnPoolerMock + txs []UnconfirmedTxn +} + +func NewUnconfirmedTxnPoolerMock2() *UnconfirmedTxnPoolerMock2 { + return &UnconfirmedTxnPoolerMock2{} +} + +func (m *UnconfirmedTxnPoolerMock2) GetTxns(tx *dbutil.Tx, f func(tx UnconfirmedTxn) bool) ([]UnconfirmedTxn, error) { + var txs []UnconfirmedTxn + for i := range m.txs { + if f(m.txs[i]) { + txs = append(txs, m.txs[i]) + } + } + return txs, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/addresses.go b/vendor/github.com/skycoin/skycoin/src/wallet/addresses.go new file mode 100755 index 0000000..1208e37 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/addresses.go @@ -0,0 +1,69 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher" +) + +// CreateAddresses genCount addresses deterministically from seed. coinType is either CoinTypeBitcoin or CoinTypeSkycoin. +// hideSecretKey will hide the secret key from the output. +func CreateAddresses(coinType CoinType, seed string, genCount int, hideSecretKey bool) (*ReadableWallet, error) { + if genCount < 1 { + return nil, errors.New("genCount must be > 0") + } + + if seed == "" { + return nil, errors.New("seed must not be the empty string") + } + + wallet := &ReadableWallet{ + Meta: map[string]string{ + "coin": string(coinType), + "seed": seed, + }, + } + + seckeys := cipher.GenerateDeterministicKeyPairs([]byte(seed), genCount) + + for _, sec := range seckeys { + pub := cipher.PubKeyFromSecKey(sec) + + var entry ReadableEntry + switch coinType { + case CoinTypeBitcoin: + entry = GetBitcoinWalletEntry(pub, sec) + case CoinTypeSkycoin: + entry = GetSkycoinWalletEntry(pub, sec) + default: + return nil, fmt.Errorf(`unknown coinType "%s"`, coinType) + } + + if hideSecretKey { + entry.Secret = "" + } + + wallet.Entries = append(wallet.Entries, entry) + } + + return wallet, nil +} + +// GetSkycoinWalletEntry returns a ReadableEntry in Skycoin format +func GetSkycoinWalletEntry(pub cipher.PubKey, sec cipher.SecKey) ReadableEntry { + return ReadableEntry{ + Address: cipher.AddressFromPubKey(pub).String(), + Public: pub.Hex(), + Secret: sec.Hex(), + } +} + +// GetBitcoinWalletEntry returns a ReadableEntry in Bitcoin format +func GetBitcoinWalletEntry(pub cipher.PubKey, sec cipher.SecKey) ReadableEntry { + return ReadableEntry{ + Address: cipher.BitcoinAddressFromPubkey(pub), + Public: pub.Hex(), + Secret: cipher.BitcoinWalletImportFormatFromSeckey(sec), + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/balance.go b/vendor/github.com/skycoin/skycoin/src/wallet/balance.go new file mode 100755 index 0000000..397631f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/balance.go @@ -0,0 +1,86 @@ +package wallet + +import ( + "github.com/skycoin/skycoin/src/coin" +) + +/* +Do not show balances or outputs that have not cleared yet +- should only allow spends against outputs that are on head +*/ + +// BalancePair records the confirmed and predicted balance +type BalancePair struct { + Confirmed Balance `json:"confirmed"` + Predicted Balance `json:"predicted"` //do "pending" +} + +// AddressBalance represents a map of address balances +type AddressBalance map[string]BalancePair + +// Balance is consisted of Coins and Hours +type Balance struct { + Coins uint64 `json:"coins"` + Hours uint64 `json:"hours"` +} + +// NewBalance creates balance +func NewBalance(coins, hours uint64) Balance { + return Balance{ + Coins: coins, + Hours: hours, + } +} + +// NewBalanceFromUxOut creates Balance from UxOut +func NewBalanceFromUxOut(headTime uint64, ux *coin.UxOut) (Balance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: ux.Body.Coins, + Hours: hours, + }, nil +} + +// Add adds two Balances +func (bal Balance) Add(other Balance) (Balance, error) { + coins, err := coin.AddUint64(bal.Coins, other.Coins) + if err != nil { + return Balance{}, err + } + + hours, err := coin.AddUint64(bal.Hours, other.Hours) + if err != nil { + return Balance{}, err + } + + return Balance{ + Coins: coins, + Hours: hours, + }, nil +} + +// Sub subtracts other from self and returns the new Balance. Will panic if +// other is greater than balance, because Coins and Hours are unsigned. +func (bal Balance) Sub(other Balance) Balance { + if other.Coins > bal.Coins || other.Hours > bal.Hours { + logger.Panic("Cannot subtract balances, second balance is too large") + } + return Balance{ + Coins: bal.Coins - other.Coins, + Hours: bal.Hours - other.Hours, + } +} + +// Equals compares two Balances +func (bal Balance) Equals(other Balance) bool { + return bal.Coins == other.Coins && bal.Hours == other.Hours +} + +// IsZero returns true if the Balance is empty (both coins and hours) +func (bal Balance) IsZero() bool { + return bal.Coins == 0 && bal.Hours == 0 +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/crypto.go b/vendor/github.com/skycoin/skycoin/src/wallet/crypto.go new file mode 100755 index 0000000..43c213b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/crypto.go @@ -0,0 +1,51 @@ +package wallet + +import ( + "errors" + "fmt" + + "github.com/skycoin/skycoin/src/cipher/encrypt" +) + +type cryptor interface { + Encrypt(data, password []byte) ([]byte, error) + Decrypt(data, password []byte) ([]byte, error) +} + +// CryptoType represents the type of crypto name +type CryptoType string + +// CryptoTypeFromString converts string to CryptoType +func CryptoTypeFromString(s string) (CryptoType, error) { + switch CryptoType(s) { + case CryptoTypeSha256Xor: + return CryptoTypeSha256Xor, nil + case CryptoTypeScryptChacha20poly1305: + return CryptoTypeScryptChacha20poly1305, nil + default: + return "", errors.New("unknown crypto type") + } +} + +// Crypto types +const ( + CryptoTypeSha256Xor = CryptoType("sha256-xor") + CryptoTypeScryptChacha20poly1305 = CryptoType("scrypt-chacha20poly1305") +) + +// cryptoTable records all supported wallet crypto methods +// If want to support new crypto methods, register here. +var cryptoTable = map[CryptoType]cryptor{ + CryptoTypeSha256Xor: encrypt.DefaultSha256Xor, + CryptoTypeScryptChacha20poly1305: encrypt.DefaultScryptChacha20poly1305, +} + +// getCrypto gets crypto of given type +func getCrypto(cryptoType CryptoType) (cryptor, error) { + c, ok := cryptoTable[cryptoType] + if !ok { + return nil, fmt.Errorf("can not find crypto %v in crypto table", cryptoType) + } + + return c, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/crypto_test.go b/vendor/github.com/skycoin/skycoin/src/wallet/crypto_test.go new file mode 100755 index 0000000..0ecb664 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/crypto_test.go @@ -0,0 +1,29 @@ +package wallet + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestSecrets(t *testing.T) { + s := make(secrets) + s.set("k1", "v1") + + v, ok := s.get("k1") + require.True(t, ok) + require.Equal(t, "v1", v) + + _, ok = s.get("k2") + require.False(t, ok) + + s.set("k2", "v2") + + b, err := s.serialize() + require.NoError(t, err) + + s1 := make(secrets) + err = s1.deserialize(b) + require.NoError(t, err) + require.Equal(t, s, s1) +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/entry.go b/vendor/github.com/skycoin/skycoin/src/wallet/entry.go new file mode 100755 index 0000000..de2d2a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/entry.go @@ -0,0 +1,31 @@ +package wallet + +import ( + "errors" + + "github.com/skycoin/skycoin/src/cipher" +) + +// Entry represents the wallet entry +type Entry struct { + Address cipher.Address + Public cipher.PubKey + Secret cipher.SecKey +} + +// Verify checks that the public key is derivable from the secret key, +// and that the public key is associated with the address +func (we *Entry) Verify() error { + if cipher.PubKeyFromSecKey(we.Secret) != we.Public { + return errors.New("invalid public key for secret key") + } + return we.VerifyPublic() +} + +// VerifyPublic checks that the public key is associated with the address +func (we *Entry) VerifyPublic() error { + if err := we.Public.Verify(); err != nil { + return err + } + return we.Address.Verify(we.Public) +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/notes.go b/vendor/github.com/skycoin/skycoin/src/wallet/notes.go new file mode 100755 index 0000000..8315b92 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/notes.go @@ -0,0 +1,202 @@ +package wallet + +import ( + "encoding/hex" + "fmt" + "io/ioutil" + "path/filepath" + "strings" + "time" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/file" +) + +// NotesExtension file extension of notes +const NotesExtension = "nts" + +// Notes array of notes +type Notes []Note + +// Note note struct +type Note struct { + TxID string + Value string +} + +// ReadableNotes readable notes +type ReadableNotes []ReadableNote + +// ReadableNote readable note struct +type ReadableNote struct { + TransactionID string `json:"transaction_id"` + ActualNote string `json:"note_val"` +} + +// NewNotesFilename check for collisions and retry if failure +func NewNotesFilename() string { + timestamp := time.Now().Format(WalletTimestampFormat) + //should read in wallet files and make sure does not exist + padding := hex.EncodeToString((cipher.RandByte(2))) + return fmt.Sprintf("%s_%s.%s", timestamp, padding, NotesExtension) +} + +// LoadNotes loads notes from given dir +func LoadNotes(dir string) (Notes, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + + //have := make(map[WalletID]Wallet, len(entries)) + wallets := make(Notes, 0) + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, NotesExtension) { + continue + } + fullpath := filepath.Join(dir, name) + rw, err := LoadReadableNotes(fullpath) + if err != nil { + return nil, err + } + w, err := rw.ToNotes() + if err != nil { + return nil, err + } + return w, nil + } + } + return wallets, nil +} + +// LoadReadableNotes loads readable notes from given file +func LoadReadableNotes(filename string) (*ReadableNotes, error) { + w := &ReadableNotes{} + err := w.Load(filename) + return w, err +} + +// Load loads readable notes from given file +func (rns *ReadableNotes) Load(filename string) error { + return file.LoadJSON(filename, rns) +} + +// ToNotes converts from readable notes to Notes +func (rns ReadableNotes) ToNotes() ([]Note, error) { + notes := make([]Note, len(rns)) + for i, e := range rns { + notes[i] = Note{ + TxID: e.TransactionID, + Value: e.ActualNote, + } + } + return notes, nil +} + +// Save persists readable notes to disk +func (rns *ReadableNotes) Save(filename string) error { + return file.SaveJSON(filename, rns, 0600) +} + +// NewReadableNote creates readable note +func NewReadableNote(note Note) ReadableNote { + return ReadableNote{ + TransactionID: note.TxID, + ActualNote: note.Value, + } +} + +// NewReadableNotesFromNotes creates readable notes from notes +func NewReadableNotesFromNotes(w Notes) ReadableNotes { + readable := make(ReadableNotes, len(w)) + i := 0 + for _, e := range w { + readable[i] = NewReadableNote(e) + i++ + } + return readable +} + +// Save persists notes to disk +func (notes *Notes) Save(dir string, fileName string) error { + r := notes.ToReadable() + return r.Save(filepath.Join(dir, fileName)) +} + +// SaveNote save new note +func (notes *Notes) SaveNote(dir string, note Note) error { + newNotes := make([]Note, len(*notes)+1) + for i, e := range *notes { + newNotes[i] = e + i++ + } + newNotes[len(*notes)] = note + + *notes = newNotes + + readableNotesToBeSaved := NewReadableNotesFromNotes(newNotes) + fileName, error := getNoteFileName(dir) + if error != nil { + return error + } + readableNotesToBeSaved.Save(fileName) + return nil +} + +func getNoteFileName(dir string) (string, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + return "", err + } + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, NotesExtension) { + continue + } + fullPath := filepath.Join(dir, name) + return fullPath, nil + } + } + return "", nil +} + +// ToReadable converts Notes to readable notes +func (notes Notes) ToReadable() ReadableNotes { + return NewReadableNotesFromNotes(notes) +} + +// NotesFileExist checks if there're notes exist +func NotesFileExist(dir string) (bool, error) { + entries, err := ioutil.ReadDir(dir) + if err != nil { + return false, err + } + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, NotesExtension) { + continue + } + return true, nil + } + } + return false, nil +} + +// CreateNoteFileIfNotExist creates note file if not exist +func CreateNoteFileIfNotExist(dir string) { + exist, err := NotesFileExist(dir) + if err != nil { + return + } + if exist == false { + noteFileName := NewNotesFilename() + dummyNotes := ReadableNotes{} + fullpath := filepath.Join(dir, noteFileName) + dummyNotes.Save(fullpath) + } + +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/readable.go b/vendor/github.com/skycoin/skycoin/src/wallet/readable.go new file mode 100755 index 0000000..fd39582 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/readable.go @@ -0,0 +1,200 @@ +package wallet + +import ( + + //"fmt" + + "fmt" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/file" +) + +var ( + emptyAddress = cipher.Address{} + emptyPubkey = cipher.PubKey{} + emptySeckey = cipher.SecKey{} +) + +// ReadableEntry wallet entry with json tags +type ReadableEntry struct { + Address string `json:"address"` + Public string `json:"public_key"` + Secret string `json:"secret_key"` +} + +// NewReadableEntry creates readable wallet entry +func NewReadableEntry(w Entry) ReadableEntry { + re := ReadableEntry{} + if w.Address != emptyAddress { + re.Address = w.Address.String() + } + + if w.Public != emptyPubkey { + re.Public = w.Public.Hex() + } + + if w.Secret != emptySeckey { + re.Secret = w.Secret.Hex() + } + + return re +} + +// LoadReadableEntry load readable wallet entry from given file +func LoadReadableEntry(filename string) (ReadableEntry, error) { + w := ReadableEntry{} + err := file.LoadJSON(filename, &w) + return w, err +} + +// NewReadableEntryFromPubkey creates a ReadableWalletEntry given a pubkey hex string. +// The Secret field is left empty. +func NewReadableEntryFromPubkey(pub string) ReadableEntry { + pubkey := cipher.MustPubKeyFromHex(pub) + addr := cipher.AddressFromPubKey(pubkey) + return ReadableEntry{ + Address: addr.String(), + Public: pub, + } +} + +// Save persists to disk +func (re *ReadableEntry) Save(filename string) error { + return file.SaveJSONSafe(filename, re, 0600) +} + +// ReadableEntries array of ReadableEntry +type ReadableEntries []ReadableEntry + +// ToWalletEntries convert readable entries to entries +// converts base on the wallet version. +func (res ReadableEntries) toWalletEntries(isEncrypted bool) ([]Entry, error) { + entries := make([]Entry, len(res)) + for i, re := range res { + e, err := newEntryFromReadable(&re) + if err != nil { + return []Entry{}, err + } + + // Verify the wallet if it's not encrypted + if !isEncrypted && re.Secret != "" { + if err := e.Verify(); err != nil { + return nil, err + } + } + + entries[i] = *e + } + return entries, nil +} + +// newEntryFromReadable creates WalletEntry base one ReadableWalletEntry +func newEntryFromReadable(w *ReadableEntry) (*Entry, error) { + a, err := cipher.DecodeBase58Address(w.Address) + if err != nil { + return nil, err + } + + p, err := cipher.PubKeyFromHex(w.Public) + if err != nil { + return nil, err + } + + // Decodes the secret hex string if any + var secret cipher.SecKey + if w.Secret != "" { + var err error + secret, err = cipher.SecKeyFromHex(w.Secret) + if err != nil { + return nil, err + } + } + + return &Entry{ + Address: a, + Public: p, + Secret: secret, + }, nil +} + +// ReadableWallet used for [de]serialization of a Wallet +type ReadableWallet struct { + Meta map[string]string `json:"meta"` + Entries ReadableEntries `json:"entries"` +} + +// NewReadableWallet creates readable wallet +func NewReadableWallet(w *Wallet) *ReadableWallet { + readable := make(ReadableEntries, len(w.Entries)) + for i, e := range w.Entries { + readable[i] = NewReadableEntry(e) + } + + meta := make(map[string]string, len(w.Meta)) + for k, v := range w.Meta { + meta[k] = v + } + + return &ReadableWallet{ + Meta: meta, + Entries: readable, + } +} + +// LoadReadableWallet loads a ReadableWallet from disk +func LoadReadableWallet(filename string) (*ReadableWallet, error) { + w := &ReadableWallet{} + if err := w.Load(filename); err != nil { + return nil, fmt.Errorf("load wallet %s failed: %v", filename, err) + } + return w, nil +} + +// ToWallet convert readable wallet to Wallet +func (rw *ReadableWallet) ToWallet() (*Wallet, error) { + w := &Wallet{ + Meta: rw.Meta, + } + + if err := w.Validate(); err != nil { + return nil, fmt.Errorf("invalid wallet %s: %v", w.Filename(), err) + } + + ets, err := rw.Entries.toWalletEntries(w.IsEncrypted()) + if err != nil { + return nil, err + } + + w.Entries = ets + + return w, nil +} + +// Save saves to filename +func (rw *ReadableWallet) Save(filename string) error { + return file.SaveJSON(filename, rw, 0600) +} + +// Load loads from filename +func (rw *ReadableWallet) Load(filename string) error { + return file.LoadJSON(filename, rw) +} + +func (rw *ReadableWallet) version() string { + return rw.Meta[metaVersion] +} + +func (rw *ReadableWallet) time() string { + return rw.Meta[metaTm] +} + +// Erase remove sensitive data +func (rw *ReadableWallet) Erase() { + delete(rw.Meta, metaSeed) + delete(rw.Meta, metaLastSeed) + delete(rw.Meta, metaSecrets) + for i := range rw.Entries { + rw.Entries[i].Secret = "" + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go b/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go new file mode 100755 index 0000000..7e1ba51 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/secrets.go @@ -0,0 +1,35 @@ +package wallet + +import "encoding/json" + +// secrets key name +const ( + secretSeed = "seed" + secretLastSeed = "lastSeed" +) + +type secrets map[string]string + +func (s secrets) get(key string) (string, bool) { + v, ok := s[key] + return v, ok +} + +func (s secrets) set(key, v string) { + s[key] = v +} + +func (s secrets) serialize() ([]byte, error) { + return json.Marshal(s) +} + +func (s secrets) deserialize(data []byte) error { + return json.Unmarshal(data, &s) +} + +func (s secrets) erase() { + for k := range s { + s[k] = "" + delete(s, k) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/service.go b/vendor/github.com/skycoin/skycoin/src/wallet/service.go new file mode 100755 index 0000000..fc4d22e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/service.go @@ -0,0 +1,506 @@ +package wallet + +import ( + "fmt" + "os" + "sync" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" +) + +// BalanceGetter interface for getting the balance of given addresses +type BalanceGetter interface { + GetBalanceOfAddrs(addrs []cipher.Address) ([]BalancePair, error) +} + +// Service wallet service struct +type Service struct { + sync.RWMutex + wallets Wallets + firstAddrIDMap map[string]string // Key: first address in wallet; Value: wallet id + walletDirectory string + cryptoType CryptoType + enableWalletAPI bool + enableSeedAPI bool +} + +// Config wallet service config +type Config struct { + WalletDir string + CryptoType CryptoType + EnableWalletAPI bool + EnableSeedAPI bool +} + +// NewService new wallet service +func NewService(c Config) (*Service, error) { + serv := &Service{ + firstAddrIDMap: make(map[string]string), + cryptoType: c.CryptoType, + enableWalletAPI: c.EnableWalletAPI, + enableSeedAPI: c.EnableSeedAPI, + } + + if !serv.enableWalletAPI { + return serv, nil + } + + if err := os.MkdirAll(c.WalletDir, os.FileMode(0700)); err != nil { + return nil, fmt.Errorf("failed to create wallet directory %s: %v", c.WalletDir, err) + } + + serv.walletDirectory = c.WalletDir + + // Removes .wlt.bak files before loading wallets + if err := removeBackupFiles(serv.walletDirectory); err != nil { + return nil, fmt.Errorf("remove .wlt.bak files in %v failed: %v", serv.walletDirectory, err) + } + + // Loads wallets + w, err := LoadWallets(serv.walletDirectory) + if err != nil { + return nil, fmt.Errorf("failed to load all wallets: %v", err) + } + + serv.wallets = serv.removeDup(w) + + return serv, nil +} + +// CreateWallet creates a wallet with the given wallet file name and options. +// A address will be automatically generated by default. +func (serv *Service) CreateWallet(wltName string, options Options, bg BalanceGetter) (*Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + if wltName == "" { + wltName = serv.generateUniqueWalletFilename() + } + + return serv.loadWallet(wltName, options, bg) +} + +// loadWallet loads wallet from seed and scan the first N addresses +func (serv *Service) loadWallet(wltName string, options Options, bg BalanceGetter) (*Wallet, error) { + // service decides what crypto type the wallet should use. + if options.Encrypt { + options.CryptoType = serv.cryptoType + } + + w, err := NewWalletScanAhead(wltName, options, bg) + if err != nil { + return nil, err + } + + // Check for duplicate wallets by initial seed + if _, ok := serv.firstAddrIDMap[w.Entries[0].Address.String()]; ok { + return nil, ErrSeedUsed + } + + if err := serv.wallets.add(w); err != nil { + return nil, err + } + + if err := w.Save(serv.walletDirectory); err != nil { + // If save fails, remove the added wallet + serv.wallets.remove(w.Filename()) + return nil, err + } + + serv.firstAddrIDMap[w.Entries[0].Address.String()] = w.Filename() + + return w.clone(), nil +} + +func (serv *Service) generateUniqueWalletFilename() string { + wltName := newWalletFilename() + for { + if _, ok := serv.wallets.get(wltName); !ok { + break + } + wltName = newWalletFilename() + } + + return wltName +} + +// EncryptWallet encrypts wallet with password +func (serv *Service) EncryptWallet(wltID string, password []byte) (*Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + if err := w.Lock(password, serv.cryptoType); err != nil { + return nil, err + } + + // Save to disk first + if err := w.Save(serv.walletDirectory); err != nil { + return nil, err + } + + // Sets the encrypted wallet + serv.wallets.set(w) + return w, nil +} + +// DecryptWallet decrypts wallet with password +func (serv *Service) DecryptWallet(wltID string, password []byte) (*Wallet, error) { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + // Returns error if wallet is not encrypted + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + // Unlocks the wallet + unlockWlt, err := w.Unlock(password) + if err != nil { + return nil, err + } + + // Updates the wallet file + if err := unlockWlt.Save(serv.walletDirectory); err != nil { + return nil, err + } + + // Sets the decrypted wallet in memory + serv.wallets.set(unlockWlt) + return unlockWlt, nil +} + +// NewAddresses generate address entries in given wallet, +// return nil if wallet does not exist. +// Set password as nil if the wallet is not encrypted, otherwise the password must be provided. +func (serv *Service) NewAddresses(wltID string, password []byte, num uint64) ([]cipher.Address, error) { + serv.Lock() + defer serv.Unlock() + + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var addrs []cipher.Address + f := func(wlt *Wallet) error { + var err error + addrs, err = wlt.GenerateAddresses(num) + return err + } + + if w.IsEncrypted() { + if err := w.GuardUpdate(password, f); err != nil { + return nil, err + } + } else { + if err := f(w); err != nil { + return nil, err + } + } + + // Set the updated wallet back + serv.wallets.set(w) + + if err := w.Save(serv.walletDirectory); err != nil { + return []cipher.Address{}, err + } + + return addrs, nil +} + +// GetAddresses returns all addresses in given wallet +func (serv *Service) GetAddresses(wltID string) ([]cipher.Address, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + return w.GetAddresses(), nil +} + +// GetWallet returns wallet by id +func (serv *Service) GetWallet(wltID string) (*Wallet, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + return serv.getWallet(wltID) +} + +// returns the clone of the wallet of given id +func (serv *Service) getWallet(wltID string) (*Wallet, error) { + w, ok := serv.wallets.get(wltID) + if !ok { + return nil, ErrWalletNotExist + } + return w.clone(), nil +} + +// GetWallets returns all wallet clones +func (serv *Service) GetWallets() (Wallets, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + wlts := make(Wallets, len(serv.wallets)) + for k, w := range serv.wallets { + wlts[k] = w.clone() + } + return wlts, nil +} + +// ReloadWallets reload wallets +func (serv *Service) ReloadWallets() error { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return ErrWalletAPIDisabled + } + wallets, err := LoadWallets(serv.walletDirectory) + if err != nil { + return err + } + + serv.firstAddrIDMap = make(map[string]string) + serv.wallets = serv.removeDup(wallets) + return nil +} + +// ViewWallet will unlock a wallet for viewing if necessary, and call f +func (serv *Service) ViewWallet(w *Wallet, password []byte, f func(w *Wallet) error) error { + // NOTE: Does not need to use the mutex, because we are not accessing the wallets storage + + if w.IsEncrypted() { + return w.GuardView(password, f) + } + + if len(password) != 0 { + return ErrWalletNotEncrypted + } + + return f(w) +} + +// CreateAndSignTransaction creates and signs a transaction from wallet. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided +func (serv *Service) CreateAndSignTransaction(wltID string, password []byte, auxs coin.AddressUxOuts, headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.enableWalletAPI { + return nil, ErrWalletAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return nil, err + } + + var tx *coin.Transaction + f := func(wlt *Wallet) error { + var err error + tx, err = wlt.CreateAndSignTransaction(auxs, headTime, coins, dest) + return err + } + + if w.IsEncrypted() { + if err := w.GuardView(password, f); err != nil { + return nil, err + } + } else { + if err := f(w); err != nil { + return nil, err + } + } + return tx, nil +} + +// CreateAndSignTransactionAdvanced creates and signs a transaction based upon CreateTransactionParams. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided +func (serv *Service) CreateAndSignTransactionAdvanced(params CreateTransactionParams, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { + serv.RLock() + defer serv.RUnlock() + + if !serv.enableWalletAPI { + return nil, nil, ErrWalletAPIDisabled + } + + if err := params.Validate(); err != nil { + return nil, nil, err + } + + w, err := serv.getWallet(params.Wallet.ID) + if err != nil { + return nil, nil, err + } + + // Check if the wallet needs a password + if w.IsEncrypted() { + if len(params.Wallet.Password) == 0 { + return nil, nil, ErrMissingPassword + } + } else { + if len(params.Wallet.Password) != 0 { + return nil, nil, ErrWalletNotEncrypted + } + } + + var tx *coin.Transaction + var inputs []UxBalance + if w.IsEncrypted() { + err = w.GuardView(params.Wallet.Password, func(wlt *Wallet) error { + var err error + tx, inputs, err = wlt.CreateAndSignTransactionAdvanced(params, auxs, headTime) + return err + }) + } else { + tx, inputs, err = w.CreateAndSignTransactionAdvanced(params, auxs, headTime) + } + if err != nil { + return nil, nil, err + } + + return tx, inputs, nil +} + +// UpdateWalletLabel updates the wallet label +func (serv *Service) UpdateWalletLabel(wltID, label string) error { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return ErrWalletAPIDisabled + } + + var wlt *Wallet + if err := serv.wallets.update(wltID, func(w *Wallet) error { + w.setLabel(label) + wlt = w + return nil + }); err != nil { + return err + } + + return wlt.Save(serv.walletDirectory) +} + +// Remove removes wallet of given wallet id from the service +func (serv *Service) Remove(wltID string) error { + serv.Lock() + defer serv.Unlock() + if !serv.enableWalletAPI { + return ErrWalletAPIDisabled + } + + serv.wallets.remove(wltID) + return nil +} + +func (serv *Service) removeDup(wlts Wallets) Wallets { + var rmWltIDS []string + // remove dup wallets + for wltID, wlt := range wlts { + if len(wlt.Entries) == 0 { + // empty wallet + rmWltIDS = append(rmWltIDS, wltID) + continue + } + + addr := wlt.Entries[0].Address.String() + id, ok := serv.firstAddrIDMap[addr] + + if ok { + // check whose entries number is bigger + pw, _ := wlts.get(id) + + if len(pw.Entries) >= len(wlt.Entries) { + rmWltIDS = append(rmWltIDS, wltID) + continue + } + + // replace the old wallet with the new one + // records the wallet id that need to remove + rmWltIDS = append(rmWltIDS, id) + // update wallet id + serv.firstAddrIDMap[addr] = wltID + continue + } + + serv.firstAddrIDMap[addr] = wltID + } + + // remove the duplicate and empty wallet + for _, id := range rmWltIDS { + wlts.remove(id) + } + + return wlts +} + +// GetWalletSeed returns seed of encrypted wallet of given wallet id +// Returns ErrWalletNotEncrypted if it's not encrypted +func (serv *Service) GetWalletSeed(wltID string, password []byte) (string, error) { + serv.RLock() + defer serv.RUnlock() + if !serv.enableWalletAPI { + return "", ErrWalletAPIDisabled + } + + if !serv.enableSeedAPI { + return "", ErrSeedAPIDisabled + } + + w, err := serv.getWallet(wltID) + if err != nil { + return "", err + } + + if !w.IsEncrypted() { + return "", ErrWalletNotEncrypted + } + + var seed string + if err := w.GuardView(password, func(wlt *Wallet) error { + seed = wlt.seed() + return nil + }); err != nil { + return "", err + } + + return seed, nil +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/service_test.go b/vendor/github.com/skycoin/skycoin/src/wallet/service_test.go new file mode 100755 index 0000000..576a19d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/service_test.go @@ -0,0 +1,2588 @@ +package wallet + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "io/ioutil" + "math" + "math/rand" + "os" + "path/filepath" + "sort" + "testing" + "time" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/fee" +) + +func prepareWltDir() string { + dir, err := ioutil.TempDir("", "wallets") + if err != nil { + panic(err) + } + + return dir +} + +func dirIsEmpty(t *testing.T, dir string) { + f, err := os.Open(dir) + require.NoError(t, err) + names, err := f.Readdirnames(1) + require.Equal(t, io.EOF, err) + require.Empty(t, names) +} + +func TestNewService(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + // check if the wallet dir is created + _, err = os.Stat(dir) + require.NoError(t, err) + + require.Equal(t, dir, s.walletDirectory) + + require.Equal(t, 0, len(s.wallets)) + + // test load wallets + s, err = NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + // check if the dup wallet is loaded + _, ok1 := s.wallets["test3.1.wlt"] + _, ok2 := s.wallets["test3.wlt"] + if ok1 && ok2 { + t.Fatal("load dup wallet") + } + + require.Equal(t, 4, len(s.wallets)) + + }) + } +} + +func TestServiceCreateWallet(t *testing.T) { + tt := []struct { + name string + encrypt bool + password []byte + enableWalletAPI bool + err error + }{ + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: true, + }, + { + name: "encrypt=true password=pwd", + encrypt: true, + password: []byte("pwd"), + enableWalletAPI: false, + err: ErrWalletAPIDisabled, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: true, + }, + { + name: "encrypt=false", + encrypt: false, + enableWalletAPI: false, + err: ErrWalletAPIDisabled, + }, + } + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("%v crypto=%v", tc.name, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: tc.enableWalletAPI, + }) + require.NoError(t, err) + + wltName := "t1.wlt" + seed := "seed1" + w, err := s.CreateWallet(wltName, Options{ + Seed: seed, + Encrypt: tc.encrypt, + Password: tc.password, + }, nil) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.NoError(t, err) + require.Equal(t, w.IsEncrypted(), tc.encrypt) + if tc.encrypt { + require.NotEmpty(t, w.secrets()) + checkNoSensitiveData(t, w) + + // Checks the wallet file doesn't contain sensitive data + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } else { + require.NoError(t, w.Validate()) + } + + // create wallet with dup wallet name + _, err = s.CreateWallet(wltName, Options{Seed: "seed2"}, nil) + require.Equal(t, err, ErrWalletNameConflict) + + // create wallet with dup seed + dupWlt := "dup_wallet.wlt" + _, err = s.CreateWallet(dupWlt, Options{ + Seed: seed, + }, nil) + require.Equal(t, err, ErrSeedUsed) + + // check if the dup wallet is created + _, ok := s.wallets[dupWlt] + require.False(t, ok) + + _, err = os.Stat(filepath.Join(dir, dupWlt)) + require.True(t, os.IsNotExist(err)) + }) + } + } +} + +func TestServiceLoadWallet(t *testing.T) { + // Prepare addresss + seed := "seed" + _, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(seed), 10) + var addrs []cipher.Address + for _, s := range seckeys { + addrs = append(addrs, cipher.AddressFromSecKey(s)) + } + + tt := []struct { + name string + opts Options + bg BalanceGetter + err error + expectAddrNum int + expectAddrs []cipher.Address + }{ + { + "raw wallet address=1", + Options{ + Seed: "seed", + Label: "wallet", + ScanN: 5, + }, + mockBalanceGetter{ + addrs[0]: BalancePair{Confirmed: Balance{Coins: 1e6, Hours: 100}}, + }, + nil, + 1, + addrs[:1], + }, + { + "raw wallet address=2", + Options{ + Seed: "seed", + Label: "wallet", + ScanN: 5, + }, + mockBalanceGetter{ + addrs[1]: BalancePair{Confirmed: Balance{Coins: 1e6, Hours: 100}}, + }, + nil, + 2, + addrs[:2], + }, + { + "encrypted wallet address=1", + Options{ + Seed: "seed", + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + mockBalanceGetter{ + addrs[0]: BalancePair{Confirmed: Balance{Coins: 1e6, Hours: 100}}, + }, + nil, + 1, + addrs[:1], + }, + { + "encrypted wallet address=2", + Options{ + Seed: "seed", + Label: "wallet", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + mockBalanceGetter{ + addrs[1]: BalancePair{Confirmed: Balance{Coins: 1e6, Hours: 100}}, + }, + nil, + 2, + addrs[:2], + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + wltName := newWalletFilename() + + w, err := s.loadWallet(wltName, tc.opts, tc.bg) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.Len(t, w.Entries, tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.Entries[i].Address) + } + + require.Equal(t, w.IsEncrypted(), tc.opts.Encrypt) + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + // Checks the wallet file doesn't contain sensitive data + wltPath := filepath.Join(dir, w.Filename()) + lw, err := Load(wltPath) + require.NoError(t, err) + checkNoSensitiveData(t, lw) + } + }) + } + } + +} + +func TestServiceNewAddress(t *testing.T) { + seed := []byte("seed") + // Generate adddresses from the seed + var addrs []cipher.Address + _, seckeys := cipher.GenerateDeterministicKeyPairsSeed(seed, 10) + for _, s := range seckeys { + addrs = append(addrs, cipher.AddressFromSecKey(s)) + } + + tt := []struct { + name string + opts Options + n uint64 + pwd []byte + walletAPIDisabled bool + expectAddrNum int + expectAddrs []cipher.Address + expectErr error + }{ + { + name: "encrypted=false addresses=0", + opts: Options{ + Label: "label", + Seed: string(seed), + }, + n: 0, + expectAddrNum: 0, + }, + { + name: "encrypted=false addresses=1", + opts: Options{ + Label: "label", + Seed: string(seed), + }, + n: 2, + expectAddrNum: 2, + expectAddrs: addrs[1:3], // CreateWallet will generate a default address, so check from new address + }, + { + name: "encrypted=false addresses=2", + opts: Options{ + Label: "label", + Seed: string(seed), + }, + n: 2, + expectAddrNum: 2, + expectAddrs: addrs[1:3], // CreateWallet will generate a default address, so check from new address + }, + { + name: "encrypted=true addresses=1", + opts: Options{ + Label: "label", + Seed: string(seed), + Encrypt: true, + Password: []byte("pwd"), + }, + n: 1, + pwd: []byte("pwd"), + expectAddrNum: 1, + expectAddrs: addrs[1:2], // CreateWallet will generate a default address, so check from new address + }, + { + name: "encrypted=true addresses=2", + opts: Options{ + Label: "label", + Seed: string(seed), + Encrypt: true, + Password: []byte("pwd"), + }, + n: 2, + pwd: []byte("pwd"), + expectAddrNum: 2, + expectAddrs: addrs[1:3], // CreateWallet will generate a default address, so check from new address + }, + { + name: "encrypted=true wrong password", + opts: Options{ + Label: "label", + Seed: string(seed), + Encrypt: true, + Password: []byte("pwd"), + }, + n: 1, + pwd: []byte("wrong password"), + expectAddrNum: 1, + expectErr: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + opts: Options{ + Seed: "seed", + Label: "label", + }, + walletAPIDisabled: true, + expectErr: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.walletAPIDisabled, + }) + require.NoError(t, err) + + wltName := newWalletFilename() + + w, err := s.CreateWallet(wltName, tc.opts, nil) + if err != nil { + require.Equal(t, tc.expectErr, err) + return + } + + if w.IsEncrypted() { + checkNoSensitiveData(t, w) + } + + naddrs, err := s.NewAddresses(w.Filename(), tc.pwd, tc.n) + require.Equal(t, tc.expectErr, err) + if err != nil { + return + } + + require.Len(t, naddrs, tc.expectAddrNum) + for i, a := range tc.expectAddrs { + require.Equal(t, a, naddrs[i]) + } + + // Check the wallet again + w, ok := s.wallets[wltName] + require.True(t, ok) + require.Len(t, w.Entries, int(tc.n+1)) + + // Wallet has a default address, so need to start from the second address + for i, a := range tc.expectAddrs { + require.Equal(t, a, w.Entries[i+1].Address) + } + + // Load wallet from file and check + _, err = os.Stat(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + + lw, err := Load(filepath.Join(dir, w.Filename())) + require.NoError(t, err) + require.Equal(t, lw, w) + if w.IsEncrypted() { + checkNoSensitiveData(t, lw) + } + + // Wallet doesn't exist + _, err = s.NewAddresses("wallet_not_exist.wlt", tc.pwd, 1) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } +} + +func TestServiceGetAddress(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: "./testdata", + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + addrs, err := s.GetAddresses("") + require.Equal(t, ErrWalletAPIDisabled, err) + require.Equal(t, 0, len(addrs)) + return + } + + addrs, err := s.GetAddresses("test1.wlt") + require.NoError(t, err) + require.Equal(t, 1, len(addrs)) + + // test none exist wallet + notExistID := "not_exist_id.wlt" + _, err = s.GetAddresses(notExistID) + require.Equal(t, ErrWalletNotExist, err) + }) + } + + } +} + +func TestServiceGetWallet(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet api=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallet("") + require.Equal(t, ErrWalletAPIDisabled, err) + var emptyW *Wallet + require.Equal(t, w, emptyW) + return + } + + // Create a wallet + w, err := s.CreateWallet("t.wlt", Options{ + Label: "label", + Seed: "seed", + }, nil) + require.NoError(t, err) + + w1, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + + // Check if change original wallet would change the returned wallet + w.setLabel("new_label") + + require.NotEqual(t, "new_label", w1.Label()) + + // Get wallet doesn't exist + wltName := "does_not_exist.wlt" + _, err = s.GetWallet(wltName) + require.Equal(t, ErrWalletNotExist, err) + }) + } + } +} + +func TestServiceGetWallets(t *testing.T) { + for _, enableWalletAPI := range []bool{true, false} { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("enable wallet=%v crypto=%v", enableWalletAPI, ct), func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: enableWalletAPI, + }) + require.NoError(t, err) + + if !enableWalletAPI { + dirIsEmpty(t, dir) + + require.Empty(t, s.wallets) + w, err := s.GetWallets() + require.Equal(t, ErrWalletAPIDisabled, err) + var emptyW Wallets + require.Equal(t, w, emptyW) + return + } + + // Creates a wallet + w, err := s.CreateWallet("t.wlt", Options{ + Label: "label", + Seed: "seed", + }, nil) + require.NoError(t, err) + + var wallets []*Wallet + // Get the default wallet + wallets = append(wallets, w) + + // Create a new wallet + wltName := newWalletFilename() + w1, err := s.CreateWallet(wltName, Options{ + Label: "label1", + Seed: "seed1", + }, nil) + require.NoError(t, err) + wallets = append(wallets, w1) + + ws, err := s.GetWallets() + for _, w := range wallets { + ww, ok := ws[w.Filename()] + require.True(t, ok) + require.Equal(t, w, ww) + } + }) + } + } +} + +func TestServiceReloadWalletsDisabledWalletAPI(t *testing.T) { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v", ct) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: false, + }) + require.NoError(t, err) + dirIsEmpty(t, dir) + + err = s.ReloadWallets() + require.Equal(t, ErrWalletAPIDisabled, err) + }) + } +} + +func TestServiceReloadWallets(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + dir := prepareWltDir() + + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + // Creates a wallet + w, err := s.CreateWallet("t.wlt", Options{ + Label: "label", + Seed: "seed", + }, nil) + require.NoError(t, err) + + wltName := "t1.wlt" + w1, err := s.CreateWallet(wltName, Options{Seed: "seed1"}, nil) + require.NoError(t, err) + + err = s.ReloadWallets() + require.NoError(t, err) + + // check if create dup wallet will return error + _, ok := s.wallets[w.Filename()] + require.True(t, ok) + + _, ok = s.wallets["t1.wlt"] + require.True(t, ok) + + // check if the first address of each wallet is reloaded + _, ok = s.firstAddrIDMap[w.Entries[0].Address.String()] + require.True(t, ok) + + _, ok = s.firstAddrIDMap[w1.Entries[0].Address.String()] + require.True(t, ok) + + }) + } +} + +func TestServiceCreateAndSignTransaction(t *testing.T) { + headTime := time.Now().UTC().Unix() + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.GenerateDeterministicKeyPairsSeed(seed, 1) + secKey := secKeys[0] + addr := cipher.AddressFromSecKey(secKey) + + // Create unspent outptus + var uxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 100) + uxouts = append(uxouts, uxout) + + p, _ := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + addrs = append(addrs, a) + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + addrsNoHours := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = uint64(headTime) + uxoutsNoHours = append(uxoutsNoHours, uxout) + + p, _ := cipher.GenerateKeyPair() + a := cipher.AddressFromPubKey(p) + addrsNoHours = append(addrsNoHours, a) + } + + tt := []struct { + name string + opts Options + pwd []byte + unspents []coin.UxOut + coins uint64 + dest cipher.Address + disableWalletAPI bool + err error + }{ + { + name: "encrypted=false has change=no", + opts: Options{ + Seed: string(seed), + }, + unspents: uxouts[:], + coins: 2e6, + dest: addrs[0], + }, + { + name: "encrypted=true has change=no", + opts: Options{ + Seed: string(seed), + Encrypt: true, + Password: []byte("pwd"), + }, + pwd: []byte("pwd"), + unspents: uxouts[:], + coins: 2e6, + dest: addrs[0], + }, + { + name: "encrypted=false has change=yes", + opts: Options{ + Seed: string(seed), + }, + unspents: uxouts[:], + coins: 1e6, + dest: addrs[0], + }, + { + name: "encrypted=false spend zero", + opts: Options{ + Seed: string(seed), + }, + unspents: uxouts[:], + dest: addrs[0], + err: ErrZeroSpend, + }, + { + name: "encrypted=false spend fractional coins", + opts: Options{ + Seed: string(seed), + }, + unspents: uxouts[:], + coins: 1e3, + dest: addrs[0], + }, + { + name: "encrypted=false not enough confirmed coins", + opts: Options{ + Seed: string(seed), + }, + unspents: uxouts[:], + coins: 100e6, + dest: addrs[0], + err: ErrInsufficientBalance, + }, + { + name: "encrypted=false no coin hours in inputs", + opts: Options{ + Seed: string(seed), + }, + unspents: uxoutsNoHours[:], + coins: 1e6, + dest: addrsNoHours[0], + err: fee.ErrTxnNoFee, + }, + { + name: "disable wallet api=true", + opts: Options{ + Seed: string(seed), + Label: "label", + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.CreateAndSignTransaction("", tc.pwd, addrUxOuts, uint64(headTime), tc.coins, tc.dest) + require.Equal(t, tc.err, err) + return + } + + wltName := newWalletFilename() + + w, err := s.CreateWallet(wltName, tc.opts, nil) + require.NoError(t, err) + + tx, err := s.CreateAndSignTransaction(w.Filename(), tc.pwd, addrUxOuts, uint64(headTime), tc.coins, tc.dest) + + if tc.err != nil { + require.Error(t, err) + require.Equal(t, tc.err, err, err.Error()) + return + } + + require.NoError(t, err) + + // check the IN of tx + for _, inUxid := range tx.In { + _, ok := unspents[inUxid] + require.True(t, ok) + } + + err = tx.Verify() + require.NoError(t, err) + }) + } + } +} + +func TestServiceCreateAndSignTransactionAdvanced(t *testing.T) { + headTime := uint64(time.Now().UTC().Unix()) + seed := []byte("seed") + + // Generate first keys + _, secKeys := cipher.GenerateDeterministicKeyPairsSeed(seed, 11) + secKey := secKeys[0] + addr := cipher.AddressFromSecKey(secKey) + + var extraWalletAddrs []cipher.Address + for _, s := range secKeys[1:] { + extraWalletAddrs = append(extraWalletAddrs, cipher.AddressFromSecKey(s)) + } + + // Create unspent outputs + var uxouts []coin.UxOut + var originalUxouts []coin.UxOut + addrs := []cipher.Address{} + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + originalUxouts = append(originalUxouts, uxout) + + a := testutil.MakeAddress() + addrs = append(addrs, a) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxouts), func(i, j int) { + uxouts[i], uxouts[j] = uxouts[j], uxouts[i] + }) + + // Create extra unspent outputs. These have the same value as uxouts, but are spendable by + // keys held in extraWalletAddrs + extraUxouts := make([][]coin.UxOut, len(extraWalletAddrs)) + for j := range extraWalletAddrs { + s := secKeys[j+1] + + var uxouts []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, s, 2e6, uint64(100+i)) + uxout.Head.Time = headTime + uxouts = append(uxouts, uxout) + } + + extraUxouts[j] = uxouts + } + + // Create unspent outputs with no hours + var uxoutsNoHours []coin.UxOut + for i := 0; i < 10; i++ { + uxout := makeUxOut(t, secKey, 2e6, 0) + uxout.Head.Time = headTime + uxoutsNoHours = append(uxoutsNoHours, uxout) + } + + // shuffle the uxouts to test that the uxout sorting during spend selection is working + rand.Shuffle(len(uxoutsNoHours), func(i, j int) { + uxoutsNoHours[i], uxoutsNoHours[j] = uxoutsNoHours[j], uxoutsNoHours[i] + }) + + changeAddress := testutil.MakeAddress() + + validParams := CreateTransactionParams{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + } + + validParamsWithPassword := validParams + validParamsWithPassword.Wallet.Password = []byte("password") + + newShareFactor := func(a string) *decimal.Decimal { + d, err := decimal.NewFromString(a) + require.NoError(t, err) + return &d + } + + firstAddress := func(uxa coin.UxArray) cipher.Address { + require.NotEmpty(t, uxa) + + addresses := make([]cipher.Address, len(uxa)) + for i, a := range uxa { + addresses[i] = a.Body.Address + } + + sort.Slice(addresses, func(i, j int) bool { + x := addresses[i].Bytes() + y := addresses[j].Bytes() + return bytes.Compare(x, y) < 0 + }) + + return addresses[0] + } + + cases := []struct { + name string + err error + txn *coin.Transaction + params CreateTransactionParams + opts Options + vld Validator + unspents []coin.UxOut + addressUnspents coin.AddressUxOuts + chosenUnspents []coin.UxOut + headTime uint64 + disableWalletAPI bool + pwd []byte + walletNotExist bool + changeOutput *coin.TransactionOutput + toExpectedHours []uint64 + }{ + { + name: "wallet api disabled", + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + + { + name: "params invalid", + params: CreateTransactionParams{}, + err: NewError(errors.New("To is required")), + }, + + { + name: "wallet doesn't exist", + params: validParams, + walletNotExist: true, + err: ErrWalletNotExist, + }, + + { + name: "wallet encrypted and password not provided", + params: validParams, + opts: Options{ + Encrypt: true, + }, + err: ErrMissingPassword, + }, + + { + name: "wallet not encrypted and password provided", + params: validParamsWithPassword, + opts: Options{ + Encrypt: false, + }, + err: ErrWalletNotEncrypted, + }, + + { + name: "overflowing coin hours in params", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: math.MaxUint64, + Coins: 1e6, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1e6, + }, + }, + }, + err: NewError(errors.New("total output hours error: uint64 addition overflow")), + }, + + { + name: "overflowing coins in params", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: math.MaxUint64, + }, + { + Address: addrs[1], + Hours: 1, + Coins: 1, + }, + }, + }, + err: NewError(errors.New("total output coins error: uint64 addition overflow")), + }, + + { + name: "no unspents", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: ErrNoUnspents, + }, + + { + name: "insufficient coins", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 100e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientBalance, + }, + + { + name: "insufficient hours", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 100e6, + Coins: 1e6, + }, + }, + }, + unspents: uxouts[:1], + err: ErrInsufficientHours, + }, + + { + name: "insufficient coins for specified uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 1, + Coins: 3e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + }, + err: ErrInsufficientBalance, + }, + + { + name: "insufficient hours for specified uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 200, + Coins: 1e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + }, + err: ErrInsufficientHours, + }, + + { + name: "manual, 1 output, no change", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0]}, + }, + + { + name: "manual, 1 output, no change, unknown address in auxs", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{}, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + testutil.MakeAddress(): []coin.UxOut{extraUxouts[0][0]}, + }, + err: ErrUnknownAddress, + }, + + { + name: "manual, 1 output, change", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 50, + Coins: 2e6 - 1, + }, + }, + + { + name: "manual, 1 output, change, unspecified change address", + params: CreateTransactionParams{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 2e6 + 1, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: &coin.TransactionOutput{ + Address: firstAddress([]coin.UxOut{originalUxouts[0], originalUxouts[1]}), + Hours: 50, + Coins: 2e6 - 1, + }, + }, + + { + // there are leftover coin hours and an additional input is added + // to force change to save the leftover coin hours + name: "manual, 1 output, forced change", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 0, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 151, + Coins: 2e6, + }, + }, + + { + // there are leftover coin hours and no coins change, + // but there are no more unspents to use to force a change output + name: "manual, 1 output, forced change rejected no more unspents", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 80, + Coins: 2e6 * 2, + }, + }, + }, + unspents: originalUxouts[:2], + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + // there are leftover coin hours and no coins change, + // but the hours cost of saving them with an additional input is less than is leftover + name: "manual, 1 output, forced change rejected", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 80, + Coins: 2e6 * 2, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1]}, + changeOutput: nil, + }, + + { + name: "manual, multiple outputs", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2], originalUxouts[3]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 33, + Coins: 4e6 - 1, + }, + }, + + { + name: "manual, multiple outputs, varied addressUnspents", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{}, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0]}, + extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, + extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, + }, + chosenUnspents: []coin.UxOut{extraUxouts[0][0], extraUxouts[3][1], extraUxouts[3][2], extraUxouts[5][6]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 34, + Coins: 4e6 - 1, + }, + }, + + { + name: "manual, multiple uxouts, varied addressUnspents, wallet outputs specified", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + Wallet: CreateTransactionWalletParams{ + UxOuts: []cipher.SHA256{ + extraUxouts[0][0].Hash(), + extraUxouts[3][1].Hash(), + extraUxouts[3][2].Hash(), + extraUxouts[5][6].Hash(), + + // this extra output is not necessary to satisfy the spend, + // it is included to test that when UxOuts are specified, + // only a subset is used + extraUxouts[0][8].Hash(), + }, + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 50, + Coins: 1e6, + }, + { + Address: addrs[0], + Hours: 50, + Coins: 1e6 + 1, + }, + { + Address: addrs[1], + Hours: 70, + Coins: 2e6, + }, + }, + }, + addressUnspents: coin.AddressUxOuts{ + extraWalletAddrs[0]: []coin.UxOut{extraUxouts[0][0], extraUxouts[0][8]}, + extraWalletAddrs[3]: []coin.UxOut{extraUxouts[3][1], extraUxouts[3][2]}, + extraWalletAddrs[5]: []coin.UxOut{extraUxouts[5][6]}, + }, + chosenUnspents: []coin.UxOut{ + extraUxouts[0][0], + extraUxouts[3][1], + extraUxouts[3][2], + extraUxouts[5][6], + }, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 34, + Coins: 4e6 - 1, + }, + }, + + { + name: "auto, multiple outputs, share factor 0.5", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 76, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{15, 30, 29, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0.5, switch to 1.0 because no change could be made", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e6 - 1e3, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + toExpectedHours: []uint64{25, 50, 50, 25, 1}, + }, + + { + name: "encrypted, auto, multiple outputs, share factor 0.5", + opts: Options{ + Encrypt: true, + Password: []byte("password"), + }, + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0.5"), + }, + Wallet: CreateTransactionWalletParams{ + Password: []byte("password"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 76, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{15, 30, 29, 1}, + }, + + { + name: "auto, multiple outputs, share factor 0", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("0"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 151, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{0, 0, 0, 0}, + }, + + { + name: "auto, multiple outputs, share factor 1", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: newShareFactor("1"), + }, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Coins: 1e6, + }, + { + Address: addrs[0], + Coins: 2e6, + }, + { + Address: addrs[1], + Coins: 2e6, + }, + { + Address: addrs[4], + Coins: 1e3, + }, + }, + }, + unspents: uxouts, + chosenUnspents: []coin.UxOut{originalUxouts[0], originalUxouts[1], originalUxouts[2]}, + changeOutput: &coin.TransactionOutput{ + Address: changeAddress, + Hours: 0, + Coins: 2e6 - (1e6 + 1e3), + }, + toExpectedHours: []uint64{30, 60, 60, 1}, + }, + + { + name: "no coin hours in inputs", + unspents: uxoutsNoHours[:], + params: CreateTransactionParams{ + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: addrs[0], + Hours: 10, + Coins: 1e6, + }, + }, + }, + err: fee.ErrTxnNoFee, + }, + } + + var cryptoTypes []CryptoType + for ct := range cryptoTable { + cryptoTypes = append(cryptoTypes, ct) + } + + for _, tc := range cases { + cts := cryptoTypes + if !tc.opts.Encrypt { + cts = cts[:1] + } + + for _, ct := range cts { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + fmt.Println(name) + t.Run(name, func(t *testing.T) { + if tc.headTime == 0 { + tc.headTime = headTime + } + + addrUxOuts := coin.AddressUxOuts{ + addr: tc.unspents, + } + + if tc.addressUnspents != nil { + addrUxOuts = tc.addressUnspents + } + + unspents := make(map[cipher.SHA256]coin.UxOut) + for _, uxs := range addrUxOuts { + for _, ux := range uxs { + unspents[ux.Hash()] = ux + } + } + + if tc.opts.Seed == "" { + tc.opts.Seed = string(seed) + } + + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: true, + }) + require.NoError(t, err) + + if tc.walletNotExist { + tc.params.Wallet.ID = "foo.wlt" + } else { + wltName := newWalletFilename() + opts := tc.opts + if opts.Encrypt && len(opts.Password) == 0 { + opts.Password = []byte("password") + } + w, err := s.CreateWallet(wltName, opts, nil) + require.NoError(t, err) + + if !w.IsEncrypted() { + _, err := s.NewAddresses(w.Filename(), nil, 10) + require.NoError(t, err) + + w, err = s.GetWallet(wltName) + require.NoError(t, err) + + require.Equal(t, 11, len(w.Entries)) + require.Equal(t, w.Entries[0].Address, addr) + for i, e := range w.Entries[1:] { + require.Equal(t, e.Address, extraWalletAddrs[i]) + } + } + + tc.params.Wallet.ID = wltName + } + + s.enableWalletAPI = !tc.disableWalletAPI + + txn, inputs, err := s.CreateAndSignTransactionAdvanced(tc.params, addrUxOuts, tc.headTime) + if tc.err != nil { + require.Equal(t, tc.err, err) + return + } + + require.NoError(t, err) + + err = txn.Verify() + require.NoError(t, err) + + require.Equal(t, len(inputs), len(txn.In)) + + // Checks duplicate inputs in array + inputsMap := make(map[cipher.SHA256]struct{}) + for _, i := range inputs { + _, ok := inputsMap[i.Hash] + require.False(t, ok) + inputsMap[i.Hash] = struct{}{} + } + + for i, inUxid := range txn.In { + _, ok := unspents[inUxid] + require.True(t, ok) + + require.Equal(t, inUxid, inputs[i].Hash) + } + + // Compare the transaction inputs + chosenUnspents := make([]coin.UxOut, len(tc.chosenUnspents)) + chosenUnspentHashes := make([]cipher.SHA256, len(tc.chosenUnspents)) + for i, u := range tc.chosenUnspents { + chosenUnspents[i] = u + chosenUnspentHashes[i] = u.Hash() + } + sort.Slice(chosenUnspentHashes, func(i, j int) bool { + return bytes.Compare(chosenUnspentHashes[i][:], chosenUnspentHashes[j][:]) < 0 + }) + sort.Slice(chosenUnspents, func(i, j int) bool { + h1 := chosenUnspents[i].Hash() + h2 := chosenUnspents[j].Hash() + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + sortedTxnIn := make([]cipher.SHA256, len(txn.In)) + for i, x := range txn.In { + sortedTxnIn[i] = x + } + + sort.Slice(sortedTxnIn, func(i, j int) bool { + return bytes.Compare(sortedTxnIn[i][:], sortedTxnIn[j][:]) < 0 + }) + + require.Equal(t, chosenUnspentHashes, sortedTxnIn) + + sort.Slice(inputs, func(i, j int) bool { + h1 := inputs[i].Hash + h2 := inputs[j].Hash + return bytes.Compare(h1[:], h2[:]) < 0 + }) + + chosenUnspentsUxBalances := make([]UxBalance, len(chosenUnspents)) + for i, o := range chosenUnspents { + b, err := NewUxBalance(tc.headTime, o) + require.NoError(t, err) + chosenUnspentsUxBalances[i] = b + } + + require.Equal(t, chosenUnspentsUxBalances, inputs) + + // Assign expected hours for comparison + var to []coin.TransactionOutput + for _, x := range tc.params.To { + to = append(to, x) + } + + if len(tc.toExpectedHours) != 0 { + require.Equal(t, len(tc.toExpectedHours), len(to)) + for i, h := range tc.toExpectedHours { + to[i].Hours = h + } + } + + // Add the change output if specified + if tc.changeOutput != nil { + to = append(to, *tc.changeOutput) + } + + // Compare transaction outputs + require.Equal(t, to, txn.Out) + }) + } + } +} + +func TestServiceUpdateWalletLabel(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + updateWltName string + label string + disableWalletAPI bool + err error + }{ + { + name: "ok", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + }, + updateWltName: "t.wlt", + label: "new-label", + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + }, + updateWltName: "t1.wlt", + label: "new-label", + err: ErrWalletNotExist, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + }, + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + // Create the wallet service + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + err = s.UpdateWalletLabel("", "new label") + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + err = s.UpdateWalletLabel(tc.updateWltName, tc.label) + require.Equal(t, tc.err, err) + + if err != nil { + return + } + + nw, err := s.GetWallet(w.Filename()) + require.NoError(t, err) + require.NotEqual(t, w.Label(), nw.Label()) + + require.Equal(t, tc.label, nw.Label()) + }) + } + } +} + +func TestServiceEncryptWallet(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + encWltName string + pwd []byte + disableWalletAPI bool + err error + }{ + { + name: "ok", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet doesn't exist", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + }, + encWltName: "t2.wlt", + err: ErrWalletNotExist, + }, + { + name: "wallet already encrypted", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + err: ErrWalletEncrypted, + }, + { + name: "wallet api disabled", + wltName: "t.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + encWltName: "t.wlt", + pwd: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + // Create the wallet service + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.EncryptWallet("", tc.pwd) + require.Equal(t, tc.err, err) + return + } + + // Create a new wallet + w, err := s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + // Encrypt the wallet + encWlt, err := s.EncryptWallet(tc.encWltName, tc.pwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + encWlt1, err := s.getWallet(tc.encWltName) + require.NoError(t, err) + require.Equal(t, encWlt, encWlt1) + + // Check the encrypted wallet + require.True(t, encWlt.IsEncrypted()) + require.Equal(t, cipher.SecKey{}, encWlt.Entries[0].Secret) + require.Empty(t, encWlt.seed()) + require.Empty(t, encWlt.lastSeed()) + + // Check the decrypted seeds + decWlt, err := encWlt.Unlock(tc.pwd) + require.NoError(t, err) + require.Equal(t, w.seed(), decWlt.seed()) + require.Equal(t, w.lastSeed(), decWlt.lastSeed()) + + // Check if the wallet file does exist + path := filepath.Join(dir, w.Filename()) + _, err = os.Stat(path) + require.True(t, !os.IsNotExist(err)) + + // Check if the backup wallet file, which should not exist + bakPath := path + ".bak" + _, err = os.Stat(bakPath) + require.True(t, os.IsNotExist(err)) + }) + } + } +} + +func TestServiceDecryptWallet(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + decryptWltName string + password []byte + disableWalletAPI bool + err error + }{ + { + name: "ok", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + }, + { + name: "wallet not exist", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "t.wlt", + password: []byte("pwd"), + err: ErrWalletNotExist, + }, + { + name: "wallet not encrypted", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + err: ErrWalletNotEncrypted, + }, + { + name: "invalid password", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "test.wlt", + password: []byte("wrong password"), + err: ErrInvalidPassword, + }, + { + name: "wallet api disabled", + wltName: "test.wlt", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + decryptWltName: "test.wlt", + password: []byte("pwd"), + disableWalletAPI: true, + err: ErrWalletAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + return + } + + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + _, err = s.DecryptWallet(tc.decryptWltName, tc.password) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + verifyDecryptedWlt := func(wlt *Wallet) { + // Checks the "encrypted" meta info + require.False(t, wlt.IsEncrypted()) + // Checks the seed + require.Equal(t, tc.opts.Seed, wlt.seed()) + // Checks the last seed + entryNum := len(wlt.Entries) + lsd, seckeys := cipher.GenerateDeterministicKeyPairsSeed([]byte(wlt.seed()), entryNum) + require.NoError(t, err) + require.Equal(t, hex.EncodeToString(lsd), wlt.lastSeed()) + + // Checks the entries + for i := range seckeys { + a := cipher.AddressFromSecKey(seckeys[i]) + require.Equal(t, a, wlt.Entries[i].Address) + require.Equal(t, seckeys[i], wlt.Entries[i].Secret) + } + + require.Empty(t, wlt.secrets()) + require.Empty(t, wlt.cryptoType()) + } + + // Checks the decrypted wallet in service + w, err := s.getWallet(tc.wltName) + require.NoError(t, err) + verifyDecryptedWlt(w) + + // Checks the existence of the wallet file + fn := filepath.Join(dir, tc.wltName) + _, err = os.Stat(fn) + require.True(t, !os.IsNotExist(err)) + + // Loads wallet from the file and check if it's decrypted + w1, err := Load(fn) + require.NoError(t, err) + verifyDecryptedWlt(w1) + }) + } + } +} + +func TestServiceCreateWalletWithScan(t *testing.T) { + bg := make(mockBalanceGetter, len(addrsOfSeed1)) + addrs := fromAddrString(t, addrsOfSeed1) + for _, a := range addrs { + bg[a] = BalancePair{} + } + + type exp struct { + err error + seed string + lastSeed string + entryNum int + confirmedBalance uint64 + predictedBalance uint64 + } + + tt := []struct { + name string + opts Options + balGetter BalanceGetter + disableWalletAPI bool + expect exp + }{ + { + name: "no coins and scan 0, unencrypted", + opts: Options{ + Seed: "seed1", + }, + balGetter: bg, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[0], + entryNum: 1, + confirmedBalance: 0, + predictedBalance: 0, + }, + }, + { + name: "no coins and scan 0, encrypted", + opts: Options{ + Seed: "seed1", + Encrypt: true, + Password: []byte("pwd"), + }, + balGetter: bg, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[0], + entryNum: 1, + confirmedBalance: 0, + predictedBalance: 0, + }, + }, + { + name: "no coins and scan 1, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 1, + }, + balGetter: bg, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[0], + entryNum: 1, + confirmedBalance: 0, + predictedBalance: 0, + }, + }, + { + name: "no coins and scan 1, encrypted", + opts: Options{ + Seed: "seed1", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 1, + }, + balGetter: bg, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[0], + entryNum: 1, + confirmedBalance: 0, + predictedBalance: 0, + }, + }, + { + name: "no coins and scan 10, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 10, + }, + balGetter: bg, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[0], + entryNum: 1, + confirmedBalance: 0, + predictedBalance: 0, + }, + }, + { + name: "scan 5 get 5, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[4]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[5], + entryNum: 5, + confirmedBalance: 10, + predictedBalance: 0, + }, + }, + { + name: "scan 5 get 5, encrypted", + opts: Options{ + Seed: "seed1", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[4]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[5], + entryNum: 5, + confirmedBalance: 10, + predictedBalance: 0, + }, + }, + { + name: "scan 5 get 4, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[2]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[3]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[4], + entryNum: 4, + confirmedBalance: 20, + predictedBalance: 0, + }, + }, + { + name: "scan 5 get 4, encrypted", + opts: Options{ + Seed: "seed1", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[2]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[3]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[4], + entryNum: 4, + confirmedBalance: 20, + predictedBalance: 0, + }, + }, + { + name: "scan 5 get 4 have 6, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[2]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[3]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[6]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[4], + entryNum: 4, + confirmedBalance: 20, + predictedBalance: 0, + }, + }, + { + name: "confirmed and predicted, unencrypted", + opts: Options{ + Seed: "seed1", + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[2]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[3]: BalancePair{Predicted: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[4], + entryNum: 4, + confirmedBalance: 20, + predictedBalance: 0, + }, + }, + { + name: "confirmed and predicted, encrypted", + opts: Options{ + Seed: "seed1", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + balGetter: mockBalanceGetter{ + addrs[2]: BalancePair{Confirmed: Balance{Coins: 10, Hours: 100}}, + addrs[3]: BalancePair{Predicted: Balance{Coins: 10, Hours: 100}}, + }, + expect: exp{ + err: nil, + seed: "seed1", + lastSeed: childSeedsOfSeed1[4], + entryNum: 4, + confirmedBalance: 20, + predictedBalance: 0, + }, + }, + { + name: "wallet api disabled", + opts: Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + ScanN: 5, + }, + balGetter: mockBalanceGetter{}, + disableWalletAPI: true, + expect: exp{ + err: ErrWalletAPIDisabled, + }, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + t.Run(name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + }) + require.NoError(t, err) + + wltName := newWalletFilename() + w, err := s.CreateWallet(wltName, tc.opts, tc.balGetter) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.NoError(t, w.Validate()) + require.Len(t, w.Entries, tc.expect.entryNum) + for i := range w.Entries { + require.Equal(t, addrsOfSeed1[i], w.Entries[i].Address.String()) + } + }) + } + } +} + +func TestGetWalletSeed(t *testing.T) { + tt := []struct { + name string + wltName string + opts Options + id string + pwd []byte + disableWalletAPI bool + enableSeedAPI bool + expectErr error + }{ + { + name: "wallet is not encrypted", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + }, + id: "wallet.wlt", + enableSeedAPI: true, + expectErr: ErrWalletNotEncrypted, + }, + { + name: "wallet api disabled", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + }, + id: "wallet.wlt", + enableSeedAPI: true, + disableWalletAPI: true, + expectErr: ErrWalletAPIDisabled, + }, + { + name: "ok", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + }, + enableSeedAPI: true, + id: "wallet.wlt", + pwd: []byte("pwd"), + }, + { + name: "wallet does not exist", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + }, + enableSeedAPI: true, + pwd: []byte("pwd"), + id: "none-exist.wlt", + expectErr: ErrWalletNotExist, + }, + { + name: "disable seed api", + wltName: "wallet.wlt", + opts: Options{ + Seed: "seed", + Label: "label", + Encrypt: true, + Password: []byte("pwd"), + }, + pwd: []byte("pwd"), + id: "wallet.wlt", + enableSeedAPI: false, + expectErr: ErrSeedAPIDisabled, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + s, err := NewService(Config{ + WalletDir: dir, + CryptoType: ct, + EnableWalletAPI: !tc.disableWalletAPI, + EnableSeedAPI: tc.enableSeedAPI, + }) + require.NoError(t, err) + + if tc.disableWalletAPI { + _, err = s.GetWalletSeed("", tc.pwd) + require.Equal(t, tc.expectErr, err) + return + } + + // Create a wallet + _, err = s.CreateWallet(tc.wltName, tc.opts, nil) + require.NoError(t, err) + + seed, err := s.GetWalletSeed(tc.id, tc.pwd) + require.Equal(t, tc.expectErr, err) + if err != nil { + return + } + + require.Equal(t, tc.opts.Seed, seed) + }) + } + } +} + +func makeUxOut(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxOut { // nolint: unparam + body := makeUxBody(t, s, coins, hours) + tm := rand.Int31n(1000) + seq := rand.Int31n(100) + return coin.UxOut{ + Head: coin.UxHead{ + Time: uint64(tm), + BkSeq: uint64(seq), + }, + Body: body, + } +} + +func makeUxBody(t *testing.T, s cipher.SecKey, coins, hours uint64) coin.UxBody { + p := cipher.PubKeyFromSecKey(s) + return coin.UxBody{ + SrcTransaction: cipher.SumSHA256(testutil.RandBytes(t, 128)), + Address: cipher.AddressFromPubKey(p), + Coins: coins, + Hours: hours, + } +} + +func checkNoSensitiveData(t *testing.T, w *Wallet) { + require.Empty(t, w.seed()) + require.Empty(t, w.lastSeed()) + var empty cipher.SecKey + for _, e := range w.Entries { + require.Equal(t, empty, e.Secret) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt new file mode 100755 index 0000000..9f62934 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/err_type.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "invalid_type", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt new file mode 100755 index 0000000..aa22c31 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_coin.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt new file mode 100755 index 0000000..e6e26ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_seed.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt new file mode 100755 index 0000000..1376dbd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/invalid_wallets/no_type.wlt @@ -0,0 +1,18 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt new file mode 100755 index 0000000..b9a083b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/scrypt-chacha20poly1305-encrypted.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "secrets": "dAB7Im4iOjMyNzY4LCJyIjo4LCJwIjoxLCJrZXlMZW4iOjMyLCJzYWx0IjoiYnhTWThENGVaOXJOUHo4N1d2dnQ3OVpNREUxRXZtNlJHek5TcStpbEt2QT0iLCJub25jZSI6IlJhWXNkVDB5eUV4WXdsS08ifXrCLvWsRX4upugXCpH7SN9CGDIFxuDUbYfE9X7uXeMhChRSq5c+9Mk8cebBN6Nx8qkfIz5munHGd6lUrXpzPDl+dGH7BVrSy0RCKr2/QvWAJtTiNeGb9PRTjYONiwPpXo9EgcrAwqWKakKtYKqNrt2hXEXnP2L3M4jNOe8jnymb8KATxP4Ih8LnsE1/3qDrt0ZtyeE51zKzOELU2pijEXhl/fjMGMyWCR4+V3xKBL5Q4dhPRgMe8+lALcLC9Xici1qoQNLFqe85mLXG0jS2aYiuVR23zKo=", + "seed": "", + "tm": "1517478842", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM", + "public_key": "02e5be89fa161bf6b0bc64ec9ec7fe27311fbb78949c3ef9739d4c73a84920d6e1", + "secret_key": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt new file mode 100755 index 0000000..49a5a47 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/sha256xor-encrypted.wlt @@ -0,0 +1,16 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "secrets": "kVjPC2vDmQyAuTNpYpKdc/k2FVUIauVOPU8yfCsLobKt12IKwFK6gQBDWkgBVEiejQeLYirRNPa4s3vX4MRl9PoAvcfHVUvoFwfkTPUaIorAXc96irhVvCM7oVMXNgQmuVoaYiFa9wo21z+6j1y6AVP1mbY3TQVdQguR+PGw33tQQ6ekShQFlcsX3yAwGAca345Qn5uS0QGg1G2rmammoQ==", + "seed": "", + "tm": "1517478842", + "type": "deterministic", + "version": "0.2" + }, + "entries": [] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test1.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test1.wlt new file mode 100755 index 0000000..d2283fc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "skycoin", + "filename": "2017_08_23_3d3b.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + "public_key": "028ef95b281f1bd6483f0c5c1ed1144b77c360b92a4eb48f681a6dff67a7c2dab1", + "secret_key": "1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e" + } + ] +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test2.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test2.wlt new file mode 100755 index 0000000..fa7020a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test2.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_46d6.wlt", + "label": "test1", + "lastSeed": "67de80ac3ae025c8742bec541da7018d08fa351983557d2bc753e90e24337d13", + "seed": "sample assume enjoy museum behind horror mad reward forward reform valley planet", + "tm": "1503458877", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + "public_key": "03595cffa8e5906b08be0c6bf907c9b6ad70f422b7c875b1a0da2c11114145c71f", + "secret_key": "7154a28fc9939a759cd00067130507e118e8e068ed0df595d488c2562ce8c9f0" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.1.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.1.wlt new file mode 100755 index 0000000..bf15c60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.1.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.wlt new file mode 100755 index 0000000..bf15c60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/test3.wlt @@ -0,0 +1,19 @@ +{ + "meta": { + "coin": "sky", + "filename": "2017_08_23_5e7d.wlt", + "label": "test2", + "lastSeed": "f3a7942899ed2723999288ea83f4f20908bf9deabc05bc8216339da4d3e02c0b", + "seed": "acoustic test story tank thrive wine able frequent marriage use swim develop", + "tm": "1503458890", + "type": "deterministic", + "version": "0.1" + }, + "entries": [ + { + "address": "2M755W9o7933roLASK9PZTmqRsjQUsVen9y", + "public_key": "03a179e412d9d27e14ba647177648a871a7311f15a5312064c7abac1d72764081c", + "secret_key": "7889f1d107dade4369bbb1ab6a55cf74a31d0524601398f03a57c5b0b1f5444b" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/testdata/v2_no_encrypt.wlt b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/v2_no_encrypt.wlt new file mode 100755 index 0000000..eaa2acb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/testdata/v2_no_encrypt.wlt @@ -0,0 +1,22 @@ +{ + "meta": { + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "tm": "1516497816", + "type": "deterministic", + "version": "0.2" + }, + "entries": [ + { + "address": "2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM", + "public_key": "02e5be89fa161bf6b0bc64ec9ec7fe27311fbb78949c3ef9739d4c73a84920d6e1", + "secret_key": "001aa9e416aff5f3a3c7f9ae0811757cf54f393d50df861f5c33747954341aa7" + } + ] +} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go b/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go new file mode 100755 index 0000000..7d944ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/wallet.go @@ -0,0 +1,1826 @@ +package wallet + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "math/big" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "time" + + "encoding/hex" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/coin" + + "github.com/shopspring/decimal" + + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/logging" +) + +// Error wraps wallet related errors +type Error struct { + error +} + +// NewError creates an Error +func NewError(err error) error { + if err == nil { + return nil + } + return Error{err} +} + +var ( + // Version represents the current wallet version + Version = "0.2" + + logger = logging.MustGetLogger("wallet") + + // ErrInsufficientBalance is returned if a wallet does not have enough balance for a spend + ErrInsufficientBalance = NewError(errors.New("balance is not sufficient")) + // ErrInsufficientHours is returned if a wallet does not have enough hours for a spend with requested hours + ErrInsufficientHours = NewError(errors.New("hours are not sufficient")) + // ErrZeroSpend is returned if a transaction is trying to spend 0 coins + ErrZeroSpend = NewError(errors.New("zero spend amount")) + // ErrSpendingUnconfirmed is returned if caller attempts to spend unconfirmed outputs + ErrSpendingUnconfirmed = NewError(errors.New("please spend after your pending transaction is confirmed")) + // ErrInvalidEncryptedField is returned if a wallet's Meta.encrypted value is invalid. + ErrInvalidEncryptedField = NewError(errors.New(`encrypted field value is not valid, must be "true", "false" or ""`)) + // ErrWalletEncrypted is returned when trying to generate addresses or sign tx in encrypted wallet + ErrWalletEncrypted = NewError(errors.New("wallet is encrypted")) + // ErrWalletNotEncrypted is returned when trying to decrypt unencrypted wallet + ErrWalletNotEncrypted = NewError(errors.New("wallet is not encrypted")) + // ErrMissingPassword is returned when trying to create wallet with encryption, but password is not provided. + ErrMissingPassword = NewError(errors.New("missing password")) + // ErrMissingEncrypt is returned when trying to create wallet with password, but options.Encrypt is not set. + ErrMissingEncrypt = NewError(errors.New("missing encrypt")) + // ErrInvalidPassword is returned if decrypts secrets failed + ErrInvalidPassword = NewError(errors.New("invalid password")) + // ErrMissingSeed is returned when trying to create wallet without a seed + ErrMissingSeed = NewError(errors.New("missing seed")) + // ErrMissingAuthenticated is returned if try to decrypt a scrypt chacha20poly1305 encrypted wallet, and find no authenticated metadata. + ErrMissingAuthenticated = NewError(errors.New("missing authenticated metadata")) + // ErrWrongCryptoType is returned when decrypting wallet with wrong crypto method + ErrWrongCryptoType = NewError(errors.New("wrong crypto type")) + // ErrWalletNotExist is returned if a wallet does not exist + ErrWalletNotExist = NewError(errors.New("wallet doesn't exist")) + // ErrSeedUsed is returned if a wallet already exists with the same seed + ErrSeedUsed = NewError(errors.New("a wallet already exists with this seed")) + // ErrWalletAPIDisabled is returned when trying to do wallet actions while the EnableWalletAPI option is false + ErrWalletAPIDisabled = NewError(errors.New("wallet api is disabled")) + // ErrSeedAPIDisabled is returned when trying to get seed of wallet while the EnableWalletAPI or EnableSeedAPI is false + ErrSeedAPIDisabled = NewError(errors.New("wallet seed api is disabled")) + // ErrWalletNameConflict represents the wallet name conflict error + ErrWalletNameConflict = NewError(errors.New("wallet name would conflict with existing wallet, renaming")) + // ErrInvalidHoursSelectionMode for invalid HoursSelection mode values + ErrInvalidHoursSelectionMode = NewError(errors.New("invalid hours selection mode")) + // ErrInvalidHoursSelectionType for invalid HoursSelection type values + ErrInvalidHoursSelectionType = NewError(errors.New("invalid hours selection type")) + // ErrUnknownAddress is returned if an address is not found in a wallet + ErrUnknownAddress = NewError(errors.New("address not found in wallet")) + // ErrUnknownUxOut is returned if a uxout is not owned by any address in a wallet + ErrUnknownUxOut = NewError(errors.New("uxout is not owned by any address in the wallet")) + // ErrNoUnspents is returned if a wallet has no unspents to spend + ErrNoUnspents = NewError(errors.New("no unspents to spend")) +) + +const ( + // WalletExt wallet file extension + WalletExt = "wlt" + + // WalletTimestampFormat wallet timestamp layout + WalletTimestampFormat = "2006_01_02" + + // CoinTypeSkycoin skycoin type + CoinTypeSkycoin CoinType = "skycoin" + // CoinTypeBitcoin bitcoin type + CoinTypeBitcoin CoinType = "bitcoin" +) + +// wallet meta fields +const ( + metaVersion = "version" // wallet version + metaFilename = "filename" // wallet file name + metaLabel = "label" // wallet label + metaTm = "tm" // the timestamp when creating the wallet + metaType = "type" // wallet type + metaCoin = "coin" // coin type + metaEncrypted = "encrypted" // whether the wallet is encrypted + metaCryptoType = "cryptoType" // encrytion/decryption type + metaSeed = "seed" // wallet seed + metaLastSeed = "lastSeed" // seed for generating next address + metaSecrets = "secrets" // secrets which records the encrypted seeds and secrets of address entries +) + +// CoinType represents the wallet coin type +type CoinType string + +// Options options that could be used when creating a wallet +type Options struct { + Coin CoinType // coin type, skycoin, bitcoin, etc. + Label string // wallet label. + Seed string // wallet seed. + Encrypt bool // whether the wallet need to be encrypted. + Password []byte // password that would be used for encryption, and would only be used when 'Encrypt' is true. + CryptoType CryptoType // wallet encryption type, scrypt-chacha20poly1305 or sha256-xor. + ScanN uint64 // number of addresses that're going to be scanned +} + +const ( + // HoursSelectionTypeManual is used to specify manual hours selection in advanced spend + HoursSelectionTypeManual = "manual" + // HoursSelectionTypeAuto is used to specify automatic hours selection in advanced spend + HoursSelectionTypeAuto = "auto" + + // HoursSelectionModeShare will distribute coin hours equally amongst destinations + HoursSelectionModeShare = "share" +) + +// HoursSelection defines options for hours distribution +type HoursSelection struct { + Type string + Mode string + ShareFactor *decimal.Decimal +} + +// CreateTransactionWalletParams defines a wallet to spend from and optionally which addresses in the wallet +type CreateTransactionWalletParams struct { + ID string + UxOuts []cipher.SHA256 + Addresses []cipher.Address + Password []byte +} + +// CreateTransactionParams defines control parameters for transaction construction +type CreateTransactionParams struct { + IgnoreUnconfirmed bool + HoursSelection HoursSelection + Wallet CreateTransactionWalletParams + ChangeAddress *cipher.Address + To []coin.TransactionOutput +} + +// Validate validates CreateTransactionParams +func (c CreateTransactionParams) Validate() error { + if c.ChangeAddress != nil && c.ChangeAddress.Null() { + return NewError(errors.New("ChangeAddress must not be the null address")) + } + + if len(c.To) == 0 { + return NewError(errors.New("To is required")) + } + + for _, to := range c.To { + if to.Coins == 0 { + return NewError(errors.New("To.Coins must not be zero")) + } + + if to.Address.Null() { + return NewError(errors.New("To.Address must not be the null address")) + } + } + + // Check for duplicate outputs, a transaction can't have outputs with + // the same (address, coins, hours) + // Auto mode would distribute hours to the outputs and could hypothetically + // avoid assigning duplicate hours in many cases, but the complexity for doing + // so is very high, so also reject duplicate (address, coins) for auto mode. + outputs := make(map[coin.TransactionOutput]struct{}, len(c.To)) + for _, to := range c.To { + outputs[to] = struct{}{} + } + + if len(outputs) != len(c.To) { + return NewError(errors.New("To contains duplicate values")) + } + + if c.Wallet.ID == "" { + return NewError(errors.New("Wallet.ID is required")) + } + + addressMap := make(map[cipher.Address]struct{}, len(c.Wallet.Addresses)) + for _, a := range c.Wallet.Addresses { + if a.Null() { + return NewError(errors.New("Wallet.Addresses must not contain the null address")) + } + + addressMap[a] = struct{}{} + } + + if len(addressMap) != len(c.Wallet.Addresses) { + return NewError(errors.New("Wallet.Addresses contains duplicate values")) + } + + switch c.HoursSelection.Type { + case HoursSelectionTypeAuto: + for _, to := range c.To { + if to.Hours != 0 { + return NewError(errors.New("To.Hours must be zero for auto type hours selection")) + } + } + + switch c.HoursSelection.Mode { + case HoursSelectionModeShare: + case "": + return NewError(errors.New("HoursSelection.Mode is required for auto type hours selection")) + default: + return NewError(errors.New("Invalid HoursSelection.Mode")) + } + + case HoursSelectionTypeManual: + if c.HoursSelection.Mode != "" { + return NewError(errors.New("HoursSelection.Mode cannot be used for manual type hours selection")) + } + + default: + return NewError(errors.New("Invalid HoursSelection.Type")) + } + + if c.HoursSelection.ShareFactor == nil { + if c.HoursSelection.Mode == HoursSelectionModeShare { + return NewError(errors.New("HoursSelection.ShareFactor must be set for share mode")) + } + } else { + if c.HoursSelection.Mode != HoursSelectionModeShare { + return NewError(errors.New("HoursSelection.ShareFactor can only be used for share mode")) + } + + zero := decimal.New(0, 0) + one := decimal.New(1, 0) + if c.HoursSelection.ShareFactor.LessThan(zero) || c.HoursSelection.ShareFactor.GreaterThan(one) { + return NewError(errors.New("HoursSelection.ShareFactor must be >= 0 and <= 1")) + } + } + + if len(c.Wallet.UxOuts) != 0 && len(c.Wallet.Addresses) != 0 { + return NewError(errors.New("Wallet.UxOuts and Wallet.Addresses cannot be combined")) + } + + // Check for duplicate spending uxouts + uxouts := make(map[cipher.SHA256]struct{}, len(c.Wallet.UxOuts)) + for _, o := range c.Wallet.UxOuts { + uxouts[o] = struct{}{} + } + + if len(uxouts) != len(c.Wallet.UxOuts) { + return NewError(errors.New("Wallet.UxOuts contains duplicate values")) + } + + return nil +} + +// newWalletFilename check for collisions and retry if failure +func newWalletFilename() string { + timestamp := time.Now().Format(WalletTimestampFormat) + // should read in wallet files and make sure does not exist + padding := hex.EncodeToString((cipher.RandByte(2))) + return fmt.Sprintf("%s_%s.%s", timestamp, padding, WalletExt) +} + +// Wallet is consisted of meta and entries. +// Meta field records items that are not deterministic, like +// filename, lable, wallet type, secrets, etc. +// Entries field stores the address entries that are deterministically generated +// from seed. +// For wallet encryption +type Wallet struct { + Meta map[string]string + Entries []Entry +} + +// newWallet creates a wallet instance with given name and options. +func newWallet(wltName string, opts Options, bg BalanceGetter) (*Wallet, error) { + if opts.Seed == "" { + return nil, ErrMissingSeed + } + + coin := opts.Coin + if coin == "" { + coin = CoinTypeSkycoin + } + + w := &Wallet{ + Meta: map[string]string{ + metaFilename: wltName, + metaVersion: Version, + metaLabel: opts.Label, + metaSeed: opts.Seed, + metaLastSeed: opts.Seed, + metaTm: fmt.Sprintf("%v", time.Now().Unix()), + metaType: "deterministic", + metaCoin: string(coin), + metaEncrypted: "false", + metaCryptoType: "", + metaSecrets: "", + }, + } + + // Create a default wallet + _, err := w.GenerateAddresses(1) + if err != nil { + return nil, err + } + + if opts.ScanN > 0 { + // Scan for addresses with balances + if bg != nil { + if err := w.ScanAddresses(opts.ScanN-1, bg); err != nil { + return nil, err + } + } + } + + // Checks if the wallet need to encrypt + if !opts.Encrypt { + if len(opts.Password) != 0 { + return nil, ErrMissingEncrypt + } + return w, nil + } + + // Checks if the password is provided + if len(opts.Password) == 0 { + return nil, ErrMissingPassword + } + + // Checks crypto type + if _, err := getCrypto(opts.CryptoType); err != nil { + return nil, err + } + + // Encrypt the wallet + if err := w.Lock(opts.Password, opts.CryptoType); err != nil { + return nil, err + } + + // Validate the wallet + if err := w.Validate(); err != nil { + return nil, err + } + + return w, nil +} + +// NewWallet creates wallet without scanning addresses +func NewWallet(wltName string, opts Options) (*Wallet, error) { + if opts.ScanN != 0 { + return nil, errors.New("scan number must be 0") + } + return newWallet(wltName, opts, nil) +} + +// NewWalletScanAhead creates wallet and scan ahead N addresses +func NewWalletScanAhead(wltName string, opts Options, bg BalanceGetter) (*Wallet, error) { + return newWallet(wltName, opts, bg) +} + +// Lock encrypts the wallet with the given password and specific crypto type +func (w *Wallet) Lock(password []byte, cryptoType CryptoType) error { + if len(password) == 0 { + return ErrMissingPassword + } + + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + wlt := w.clone() + + // Records seeds in secrets + ss := make(secrets) + defer func() { + // Wipes all unencrypted sensitive data + ss.erase() + wlt.erase() + }() + + ss.set(secretSeed, wlt.seed()) + ss.set(secretLastSeed, wlt.lastSeed()) + + // Saves address's secret keys in secrets + for _, e := range wlt.Entries { + ss.set(e.Address.String(), e.Secret.Hex()) + } + + sb, err := ss.serialize() + if err != nil { + return err + } + + crypto, err := getCrypto(cryptoType) + if err != nil { + return err + } + + // Encrypts the secrets + encSecret, err := crypto.Encrypt(sb, password) + if err != nil { + return err + } + + // Sets the crypto type + wlt.setCryptoType(cryptoType) + + // Updates the secrets data in wallet + wlt.setSecrets(string(encSecret)) + + // Sets wallet as encrypted + wlt.setEncrypted(true) + + // Sets the wallet version + wlt.setVersion(Version) + + // Wipes unencrypted sensitive data + wlt.erase() + + // Wipes the secret fields in w + w.erase() + + // Replace the original wallet with new encrypted wallet + w.copyFrom(wlt) + return nil +} + +// Unlock decrypts the wallet into a temporary decrypted copy of the wallet +// Returns error if the decryption fails +// The temporary decrypted wallet should be erased from memory when done. +func (w *Wallet) Unlock(password []byte) (*Wallet, error) { + if !w.IsEncrypted() { + return nil, ErrWalletNotEncrypted + } + + if len(password) == 0 { + return nil, ErrMissingPassword + } + + wlt := w.clone() + + // Gets the secrets string + sstr := wlt.secrets() + if sstr == "" { + return nil, errors.New("secrets doesn't exsit") + } + + ct := w.cryptoType() + if ct == "" { + return nil, errors.New("missing crypto type") + } + + // Gets the crypto + crypto, err := getCrypto(ct) + if err != nil { + return nil, err + } + + // Decrypts the secrets + sb, err := crypto.Decrypt([]byte(sstr), password) + if err != nil { + return nil, ErrInvalidPassword + } + + // Deserialize into secrets + ss := make(secrets) + defer ss.erase() + if err := ss.deserialize(sb); err != nil { + return nil, err + } + + seed, ok := ss.get(secretSeed) + if !ok { + return nil, errors.New("seed doesn't exist in secrets") + } + wlt.setSeed(seed) + + lastSeed, ok := ss.get(secretLastSeed) + if !ok { + return nil, errors.New("lastSeed doesn't exist in secrets") + } + wlt.setLastSeed(lastSeed) + + // Gets addresses related secrets + for i, e := range wlt.Entries { + sstr, ok := ss.get(e.Address.String()) + if !ok { + return nil, fmt.Errorf("secret of address %s doesn't exist in secrets", e.Address) + } + s, err := hex.DecodeString(sstr) + if err != nil { + return nil, fmt.Errorf("decode secret hex string failed: %v", err) + } + + copy(wlt.Entries[i].Secret[:], s[:]) + } + + wlt.setEncrypted(false) + wlt.setSecrets("") + wlt.setCryptoType("") + return wlt, nil +} + +// copyFrom copies the src wallet to w +func (w *Wallet) copyFrom(src *Wallet) { + // Clear the original info first + w.Meta = make(map[string]string) + w.Entries = w.Entries[:0] + + // Copies the meta + for k, v := range src.Meta { + w.Meta[k] = v + } + + // Copies the address entries + for _, e := range src.Entries { + w.Entries = append(w.Entries, e) + } +} + +// erase wipes secret fields in wallet +func (w *Wallet) erase() { + // Wipes the seed and last seed + w.setSeed("") + w.setLastSeed("") + + // Wipes private keys in entries + for i := range w.Entries { + for j := range w.Entries[i].Secret { + w.Entries[i].Secret[j] = 0 + } + + w.Entries[i].Secret = cipher.SecKey{} + } +} + +// GuardUpdate executes a function within the context of a read-wirte managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func (w *Wallet) GuardUpdate(password []byte, fn func(w *Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + cryptoType := w.cryptoType() + wlt, err := w.Unlock(password) + if err != nil { + return err + } + + defer wlt.erase() + + if err := fn(wlt); err != nil { + return err + } + + if err := wlt.Lock(password, cryptoType); err != nil { + return err + } + + *w = *wlt + // Wipes all sensitive data + w.erase() + return nil +} + +// GuardView executes a function within the context of a read-only managed decrypted wallet. +// Returns ErrWalletNotEncrypted if wallet is not encrypted. +func (w *Wallet) GuardView(password []byte, f func(w *Wallet) error) error { + if !w.IsEncrypted() { + return ErrWalletNotEncrypted + } + + if len(password) == 0 { + return ErrMissingPassword + } + + wlt, err := w.Unlock(password) + if err != nil { + return err + } + + defer wlt.erase() + + return f(wlt) +} + +// Load loads wallet from a given file +func Load(wltFile string) (*Wallet, error) { + if _, err := os.Stat(wltFile); os.IsNotExist(err) { + return nil, fmt.Errorf("load wallet file failed, wallet %s doesn't exist", wltFile) + } + + r := &ReadableWallet{} + if err := r.Load(wltFile); err != nil { + return nil, err + } + + // update filename meta info with the real filename + r.Meta["filename"] = filepath.Base(wltFile) + return r.ToWallet() +} + +// Save saves the wallet to given dir +func (w *Wallet) Save(dir string) error { + r := NewReadableWallet(w) + return r.Save(filepath.Join(dir, w.Filename())) +} + +// removeBackupFiles removes any *.wlt.bak files whom have version 0.1 and *.wlt matched in the given directory +func removeBackupFiles(dir string) error { + fs, err := filterDir(dir, ".wlt") + if err != nil { + return err + } + + // Creates the .wlt file map + fm := make(map[string]struct{}) + for _, f := range fs { + fm[f] = struct{}{} + } + + // Filters all .wlt.bak files in the directory + bakFs, err := filterDir(dir, ".wlt.bak") + if err != nil { + return err + } + + // Removes the .wlt.bak file that has .wlt matched. + for _, bf := range bakFs { + f := strings.TrimRight(bf, ".bak") + if _, ok := fm[f]; ok { + // Load and check the wallet version + w, err := Load(f) + if err != nil { + return err + } + + if w.Version() == "0.1" { + if err := os.Remove(bf); err != nil { + return err + } + } + } + } + + return nil +} + +func filterDir(dir string, suffix string) ([]string, error) { + files, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + res := []string{} + for _, f := range files { + if !f.IsDir() && strings.HasSuffix(f.Name(), suffix) { + res = append(res, filepath.Join(dir, f.Name())) + } + } + return res, nil +} + +// reset resets the wallet entries and move the lastSeed to origin +func (w *Wallet) reset() { + w.Entries = []Entry{} + w.setLastSeed(w.seed()) +} + +// Validate validates the wallet +func (w *Wallet) Validate() error { + if _, ok := w.Meta[metaFilename]; !ok { + return errors.New("filename not set") + } + if _, ok := w.Meta[metaSeed]; !ok { + return errors.New("seed field not set") + } + + walletType, ok := w.Meta[metaType] + if !ok { + return errors.New("type field not set") + } + if walletType != "deterministic" { + return errors.New("wallet type invalid") + } + + if _, ok := w.Meta[metaCoin]; !ok { + return errors.New("coin field not set") + } + + if encStr, ok := w.Meta[metaEncrypted]; ok { + // validate the encrypted value + isEncrypted, err := strconv.ParseBool(encStr) + if err != nil { + return fmt.Errorf("invalid encrypted value: %v", err) + } + + // checks if the secrets field is empty + if isEncrypted { + if _, ok := w.Meta[metaCryptoType]; !ok { + return errors.New("crypto type field not set") + } + + if _, ok := w.Meta[metaSecrets]; !ok { + return errors.New("wallet is encrypted, but secrets field not set") + } + } + } + + return nil +} + +// Type gets the wallet type +func (w *Wallet) Type() string { + return w.Meta[metaType] +} + +// Version gets the wallet version +func (w *Wallet) Version() string { + return w.Meta[metaVersion] +} + +func (w *Wallet) setVersion(v string) { + w.Meta[metaVersion] = v +} + +// Filename gets the wallet filename +func (w *Wallet) Filename() string { + return w.Meta[metaFilename] +} + +// setFilename sets the wallet filename +func (w *Wallet) setFilename(fn string) { + w.Meta[metaFilename] = fn +} + +// Label gets the wallet label +func (w *Wallet) Label() string { + return w.Meta[metaLabel] +} + +// setLabel sets the wallet label +func (w *Wallet) setLabel(label string) { + w.Meta[metaLabel] = label +} + +// lastSeed returns the last seed +func (w *Wallet) lastSeed() string { + return w.Meta[metaLastSeed] +} + +func (w *Wallet) setLastSeed(lseed string) { + w.Meta[metaLastSeed] = lseed +} + +func (w *Wallet) seed() string { + return w.Meta[metaSeed] +} + +func (w *Wallet) setSeed(seed string) { + w.Meta[metaSeed] = seed +} + +func (w *Wallet) setEncrypted(encrypt bool) { + w.Meta[metaEncrypted] = strconv.FormatBool(encrypt) +} + +// IsEncrypted checks whether the wallet is encrypted. +func (w *Wallet) IsEncrypted() bool { + encStr, ok := w.Meta[metaEncrypted] + if !ok { + return false + } + + b, err := strconv.ParseBool(encStr) + if err != nil { + // This can not happen, the meta.encrypted value is either set by + // setEncrypted() method or converted in ReadableWallet.toWallet(). + // toWallet() method will throw error if the meta.encrypted string is invalid. + logger.Warning("parse wallet.meta.encrypted string failed: %v", err) + return false + } + return b +} + +func (w *Wallet) setCryptoType(tp CryptoType) { + w.Meta[metaCryptoType] = string(tp) +} + +func (w *Wallet) cryptoType() CryptoType { + return CryptoType(w.Meta[metaCryptoType]) +} + +func (w *Wallet) secrets() string { + return w.Meta[metaSecrets] +} + +func (w *Wallet) setSecrets(s string) { + w.Meta[metaSecrets] = s +} + +// GenerateAddresses generates addresses +func (w *Wallet) GenerateAddresses(num uint64) ([]cipher.Address, error) { + if num == 0 { + return nil, nil + } + + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + var seckeys []cipher.SecKey + var seed []byte + if len(w.Entries) == 0 { + seed, seckeys = cipher.GenerateDeterministicKeyPairsSeed([]byte(w.seed()), int(num)) + } else { + sd, err := hex.DecodeString(w.lastSeed()) + if err != nil { + return nil, fmt.Errorf("decode hex seed failed: %v", err) + } + seed, seckeys = cipher.GenerateDeterministicKeyPairsSeed(sd, int(num)) + } + + w.setLastSeed(hex.EncodeToString(seed)) + + addrs := make([]cipher.Address, len(seckeys)) + for i, s := range seckeys { + p := cipher.PubKeyFromSecKey(s) + a := cipher.AddressFromPubKey(p) + addrs[i] = a + w.Entries = append(w.Entries, Entry{ + Address: a, + Secret: s, + Public: p, + }) + } + return addrs, nil +} + +// ScanAddresses scans ahead N addresses to find one with none-zero coins. +func (w *Wallet) ScanAddresses(scanN uint64, bg BalanceGetter) error { + if w.IsEncrypted() { + return ErrWalletEncrypted + } + + if scanN <= 0 { + return nil + } + + nExistingAddrs := uint64(len(w.Entries)) + + // Generate the addresses to scan + addrs, err := w.GenerateAddresses(scanN) + if err != nil { + return err + } + + // Get these addresses' balances + bals, err := bg.GetBalanceOfAddrs(addrs) + if err != nil { + return err + } + + // Check balance from the last one until we find the address that has coins + var keepNum uint64 + for i := len(bals) - 1; i >= 0; i-- { + if bals[i].Confirmed.Coins > 0 || bals[i].Predicted.Coins > 0 { + keepNum = uint64(i + 1) + break + } + } + + // Regenerate addresses up to keepNum. + // This is necessary to keep the lastSeed updated. + if keepNum != uint64(len(bals)) { + w.reset() + w.GenerateAddresses(nExistingAddrs + keepNum) + } + + return nil +} + +// GetAddresses returns all addresses in wallet +func (w *Wallet) GetAddresses() []cipher.Address { + addrs := make([]cipher.Address, len(w.Entries)) + for i, e := range w.Entries { + addrs[i] = e.Address + } + return addrs +} + +// GetEntry returns entry of given address +func (w *Wallet) GetEntry(a cipher.Address) (Entry, bool) { + for _, e := range w.Entries { + if e.Address == a { + return e, true + } + } + return Entry{}, false +} + +// AddEntry adds new entry +func (w *Wallet) AddEntry(entry Entry) error { + // dup check + for _, e := range w.Entries { + if e.Address == entry.Address { + return errors.New("duplicate address entry") + } + } + + w.Entries = append(w.Entries, entry) + return nil +} + +// clone returns the clone of self +func (w *Wallet) clone() *Wallet { + wlt := Wallet{Meta: make(map[string]string)} + for k, v := range w.Meta { + wlt.Meta[k] = v + } + + for _, e := range w.Entries { + wlt.Entries = append(wlt.Entries, e) + } + + return &wlt +} + +// Validator validate if the wallet be able to create spending transaction +type Validator interface { + // checks if any of the given addresses has unconfirmed spending transactions + HasUnconfirmedSpendTx(addr []cipher.Address) (bool, error) +} + +// CreateAndSignTransaction Creates a Transaction +// spending coins and hours from wallet +func (w *Wallet) CreateAndSignTransaction(auxs coin.AddressUxOuts, headTime, coins uint64, dest cipher.Address) (*coin.Transaction, error) { + if w.IsEncrypted() { + return nil, ErrWalletEncrypted + } + + entriesMap := make(map[cipher.Address]Entry) + for a := range auxs { + e, ok := w.GetEntry(a) + // Check that auxs does not contain addresses that are not known to this wallet + if !ok { + return nil, ErrUnknownAddress + } + entriesMap[e.Address] = e + } + + // Determine which unspents to spend. + // Use the MaximizeUxOuts strategy, this will keep the uxout pool smaller + uxa := auxs.Flatten() + uxb, err := NewUxBalances(headTime, uxa) + if err != nil { + return nil, err + } + + spends, err := ChooseSpendsMaximizeUxOuts(uxb, coins, 0) + if err != nil { + return nil, err + } + + // Add these unspents as tx inputs + var txn coin.Transaction + toSign := make([]cipher.SecKey, len(spends)) + spending := Balance{Coins: 0, Hours: 0} + for i, au := range spends { + entry, ok := entriesMap[au.Address] + if !ok { + return nil, NewError(fmt.Errorf("address %v does not exist in wallet %v", au.Address, w.Filename())) + } + + txn.PushInput(au.Hash) + + toSign[i] = entry.Secret + + spending.Coins += au.Coins + spending.Hours += au.Hours + } + + if spending.Hours == 0 { + return nil, fee.ErrTxnNoFee + } + + // Calculate coin hour allocation + changeCoins := spending.Coins - coins + haveChange := changeCoins > 0 + changeHours, addrHours, outputHours := DistributeSpendHours(spending.Hours, 1, haveChange) + + logger.Infof("wallet.CreateAndSignTransaction: spending.Hours=%d, fee.VerifyTransactionFeeForHours(%d, %d)", spending.Hours, outputHours, spending.Hours-outputHours) + if err := fee.VerifyTransactionFeeForHours(outputHours, spending.Hours-outputHours); err != nil { + logger.Warningf("wallet.CreateAndSignTransaction: fee.VerifyTransactionFeeForHours failed: %v", err) + return nil, err + } + + if haveChange { + changeAddr := spends[0].Address + txn.PushOutput(changeAddr, changeCoins, changeHours) + } + + txn.PushOutput(dest, coins, addrHours[0]) + + txn.SignInputs(toSign) + txn.UpdateHeader() + + return &txn, nil +} + +// CreateAndSignTransactionAdvanced creates and signs a transaction based upon CreateTransactionParams. +// Set the password as nil if the wallet is not encrypted, otherwise the password must be provided. +// NOTE: Caller must ensure that auxs correspond to params.Wallet.Addresses and params.Wallet.UxOuts options +func (w *Wallet) CreateAndSignTransactionAdvanced(params CreateTransactionParams, auxs coin.AddressUxOuts, headTime uint64) (*coin.Transaction, []UxBalance, error) { + if err := params.Validate(); err != nil { + return nil, nil, err + } + + if params.Wallet.ID != w.Filename() { + return nil, nil, NewError(errors.New("params.Wallet.ID does not match wallet")) + } + + if w.IsEncrypted() { + return nil, nil, ErrWalletEncrypted + } + + entriesMap := make(map[cipher.Address]Entry) + for a := range auxs { + // Check that auxs does not contain addresses that are not known to this wallet + e, ok := w.GetEntry(a) + if !ok { + return nil, nil, ErrUnknownAddress + } + entriesMap[e.Address] = e + } + + txn := &coin.Transaction{} + + // Determine which unspents to spend + uxa := auxs.Flatten() + + uxb, err := NewUxBalances(headTime, uxa) + if err != nil { + return nil, nil, err + } + + // Reverse lookup set to recover the inputs + uxbMap := make(map[cipher.SHA256]UxBalance, len(uxb)) + for _, u := range uxb { + if _, ok := uxbMap[u.Hash]; ok { + return nil, nil, errors.New("Duplicate UxBalance in array") + } + uxbMap[u.Hash] = u + } + + // calculate total coins and minimum hours to send + var totalOutCoins uint64 + var requestedHours uint64 + for _, to := range params.To { + totalOutCoins, err = coin.AddUint64(totalOutCoins, to.Coins) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output coins error: %v", err)) + } + + requestedHours, err = coin.AddUint64(requestedHours, to.Hours) + if err != nil { + return nil, nil, NewError(fmt.Errorf("total output hours error: %v", err)) + } + } + + // Use the MinimizeUxOuts strategy, to use least possible uxouts + // this will allow more frequent spending + // we don't need to check whether we have sufficient balance beforehand as ChooseSpends already checks that + spends, err := ChooseSpendsMinimizeUxOuts(uxb, totalOutCoins, requestedHours) + if err != nil { + return nil, nil, err + } + + // calculate total coins and hours in spends + var totalInputCoins uint64 + var totalInputHours uint64 + toSign := make([]cipher.SecKey, len(spends)) + for i, spend := range spends { + totalInputCoins, err = coin.AddUint64(totalInputCoins, spend.Coins) + if err != nil { + return nil, nil, err + } + + totalInputHours, err = coin.AddUint64(totalInputHours, spend.Hours) + if err != nil { + return nil, nil, err + } + + entry, ok := entriesMap[spend.Address] + if !ok { + return nil, nil, fmt.Errorf("spend address %s not found in entriesMap", spend.Address.String()) + } + + toSign[i] = entry.Secret + txn.PushInput(spend.Hash) + } + + feeHours := fee.RequiredFee(totalInputHours) + if feeHours == 0 { + return nil, nil, fee.ErrTxnNoFee + } + remainingHours := totalInputHours - feeHours + + switch params.HoursSelection.Type { + case HoursSelectionTypeManual: + for _, out := range params.To { + txn.Out = append(txn.Out, out) + } + + case HoursSelectionTypeAuto: + var addrHours []uint64 + + switch params.HoursSelection.Mode { + case HoursSelectionModeShare: + // multiply remaining hours after fee burn with share factor + hours, err := coin.Uint64ToInt64(remainingHours) + if err != nil { + return nil, nil, err + } + + allocatedHoursInt := params.HoursSelection.ShareFactor.Mul(decimal.New(hours, 0)).IntPart() + allocatedHours, err := coin.Int64ToUint64(allocatedHoursInt) + if err != nil { + return nil, nil, err + } + + toCoins := make([]uint64, len(params.To)) + for i, to := range params.To { + toCoins[i] = to.Coins + } + + addrHours, err = DistributeCoinHoursProportional(toCoins, allocatedHours) + if err != nil { + return nil, nil, err + } + default: + return nil, nil, ErrInvalidHoursSelectionType + } + + for i, out := range params.To { + out.Hours = addrHours[i] + txn.Out = append(txn.Out, out) + } + + default: + return nil, nil, ErrInvalidHoursSelectionMode + } + + totalOutHours, err := txn.OutputHours() + if err != nil { + return nil, nil, err + } + + // Make sure we have enough coins and coin hours + // If we don't, and we called ChooseSpends, then ChooseSpends has a bug, as it should have returned this error already + if totalOutCoins > totalInputCoins { + logger.WithError(ErrInsufficientBalance).Error("Insufficient coins after choosing spends, this should not occur") + return nil, nil, ErrInsufficientBalance + } + + if totalOutHours > remainingHours { + logger.WithError(fee.ErrTxnInsufficientCoinHours).Error("Insufficient hours after choosing spends or distributing hours, this should not occur") + return nil, nil, fee.ErrTxnInsufficientCoinHours + } + + // create change output + changeCoins := totalInputCoins - totalOutCoins + changeHours := remainingHours - totalOutHours + + // If there are no change coins but there are change hours, try to add another + // input to save the change hours. + // This chooses an available input with the least number of coin hours; + // if the extra coin hour fee incurred by this additional input is less than + // the remaining coin hours, the input is added. + if changeCoins == 0 && changeHours > 0 { + // Find the output with the least coin hours + // If size of the fee for this output is less than the changeHours, add it + // Update changeCoins and changeHours + z := uxBalancesSub(uxb, spends) + sortSpendsHoursLowToHigh(z) + if len(z) > 0 { + extra := z[0] + + // Calculate the new hours being spent + newTotalHours, err := coin.AddUint64(totalInputHours, extra.Hours) + if err != nil { + return nil, nil, err + } + + // Calculate the new fee for this new amount of hours + newFee := fee.RequiredFee(newTotalHours) + if newFee < feeHours { + err := errors.New("updated fee after adding extra input for change is unexpectedly less than it was initially") + logger.WithError(err).Error() + return nil, nil, err + } + + // If the cost of adding this extra input is less than the amount of change hours we + // can save, use the input + additionalFee := newFee - feeHours + if additionalFee < changeHours { + changeCoins = extra.Coins + + if extra.Hours < additionalFee { + err := errors.New("calculated additional fee is unexpectedly higher than the extra input's hours") + logger.WithError(err).Error() + return nil, nil, err + } + + additionalHours := extra.Hours - additionalFee + changeHours, err = coin.AddUint64(changeHours, additionalHours) + if err != nil { + return nil, nil, err + } + + entry, ok := entriesMap[extra.Address] + if !ok { + return nil, nil, fmt.Errorf("extra spend address %s not found in entriesMap", extra.Address.String()) + } + + toSign = append(toSign, entry.Secret) + txn.PushInput(extra.Hash) + } + } + } + + // With auto share mode, if there are leftover hours and change couldn't be force-added, + // recalculate that share ratio at 100% + if changeCoins == 0 && changeHours > 0 && params.HoursSelection.Type == HoursSelectionTypeAuto && params.HoursSelection.Mode == HoursSelectionModeShare { + oneDecimal := decimal.New(1, 0) + if params.HoursSelection.ShareFactor.Equal(oneDecimal) { + return nil, nil, errors.New("share factor is 1.0 but changeHours > 0 unexpectedly") + } + params.HoursSelection.ShareFactor = &oneDecimal + return w.CreateAndSignTransactionAdvanced(params, auxs, headTime) + } + + if changeCoins > 0 { + var changeAddress cipher.Address + if params.ChangeAddress != nil { + changeAddress = *params.ChangeAddress + } else { + // Choose a change address from the unspent outputs + // Sort spends by address, comparing bytes, and use the first + // This provides deterministic change address selection from a set of unspent outputs + if len(spends) == 0 { + return nil, nil, errors.New("spends is unexpectedly empty when choosing an automatic change address") + } + + addressBytes := make([][]byte, len(spends)) + for i, s := range spends { + addressBytes[i] = s.Address.Bytes() + } + + sort.Slice(addressBytes, func(i, j int) bool { + return bytes.Compare(addressBytes[i], addressBytes[j]) < 0 + }) + + var err error + changeAddress, err = cipher.AddressFromBytes(addressBytes[0]) + if err != nil { + logger.Critical().Errorf("cipher.AddressFromBytes failed for change address converted to bytes: %v", err) + return nil, nil, err + } + } + + txn.PushOutput(changeAddress, changeCoins, changeHours) + } + + txn.SignInputs(toSign) + txn.UpdateHeader() + + inputs := make([]UxBalance, len(txn.In)) + for i, h := range txn.In { + uxBalance, ok := uxbMap[h] + if !ok { + return nil, nil, errors.New("Created transaction's input is not in the UxBalanceSet, this should not occur") + } + inputs[i] = uxBalance + } + + if err := verifyCreatedTransactionInvariants(params, txn, inputs); err != nil { + logger.Critical().Errorf("CreateAndSignTransactionAdvanced created transaction that violates invariants, aborting: %v", err) + return nil, nil, fmt.Errorf("Created transaction that violates invariants, this is a bug: %v", err) + } + + return txn, inputs, nil +} + +// verifyCreatedTransactionInvariants checks that the transaction that was created matches expectations. +// Does not call visor verification methods because that causes import cycle. +// daemon.Gateway checks that the transaction passes additional visor verification methods. +func verifyCreatedTransactionInvariants(params CreateTransactionParams, txn *coin.Transaction, inputs []UxBalance) error { + for _, o := range txn.Out { + // No outputs should be sent to the null address + if o.Address.Null() { + return errors.New("Output address is null") + } + + if o.Coins == 0 { + return errors.New("Output coins is 0") + } + } + + if len(txn.Out) != len(params.To) && len(txn.Out) != len(params.To)+1 { + return errors.New("Transaction has unexpected number of outputs") + } + + for i, o := range txn.Out[:len(params.To)] { + if o.Address != params.To[i].Address { + return errors.New("Output address does not match requested address") + } + + if o.Coins != params.To[i].Coins { + return errors.New("Output coins does not match requested coins") + } + + if params.To[i].Hours != 0 && o.Hours != params.To[i].Hours { + return errors.New("Output hours does not match requested hours") + } + } + + if len(txn.Sigs) != len(txn.In) { + return errors.New("Number of signatures does not match number of inputs") + } + + if len(txn.In) != len(inputs) { + return errors.New("Number of UxOut inputs does not match number of transaction inputs") + } + + for i, h := range txn.In { + if inputs[i].Hash != h { + return errors.New("Transaction input hash does not match UxOut inputs hash") + } + } + + inputsMap := make(map[cipher.SHA256]struct{}, len(inputs)) + + for _, i := range inputs { + if i.Hours < i.InitialHours { + return errors.New("Calculated input hours are unexpectedly less than the initial hours") + } + + if i.SrcTransaction.Null() { + return errors.New("Input's source transaction is a null hash") + } + + if i.Hash.Null() { + return errors.New("Input's hash is a null hash") + } + + if _, ok := inputsMap[i.Hash]; ok { + return errors.New("Duplicate input in array") + } + + inputsMap[i.Hash] = struct{}{} + } + + var inputHours uint64 + for _, i := range inputs { + var err error + inputHours, err = coin.AddUint64(inputHours, i.Hours) + if err != nil { + return err + } + } + + var outputHours uint64 + for _, i := range txn.Out { + var err error + outputHours, err = coin.AddUint64(outputHours, i.Hours) + if err != nil { + return err + } + } + + if inputHours < outputHours { + return errors.New("Total input hours is less than the output hours") + } + + if inputHours-outputHours < fee.RequiredFee(inputHours) { + return errors.New("Transaction will not satisy required fee") + } + + return nil +} + +// DistributeSpendHours calculates how many coin hours to transfer to the change address and how +// many to transfer to each of the other destination addresses. +// Input hours are split by BurnFactor (rounded down) to meet the fee requirement. +// The remaining hours are split in half, one half goes to the change address +// and the other half goes to the destination addresses. +// If the remaining hours are an odd number, the change address gets the extra hour. +// If the amount assigned to the destination addresses is not perfectly divisible by the +// number of destination addresses, the extra hours are distributed to some of these addresses. +// Returns the number of hours to send to the change address, +// an array of length nAddrs with the hours to give to each destination address, +// and a sum of these values. +func DistributeSpendHours(inputHours, nAddrs uint64, haveChange bool) (uint64, []uint64, uint64) { + feeHours := fee.RequiredFee(inputHours) + remainingHours := inputHours - feeHours + + var changeHours uint64 + if haveChange { + // Split the remaining hours between the change output and the other outputs + changeHours = remainingHours / 2 + + // If remainingHours is an odd number, give the extra hour to the change output + if remainingHours%2 == 1 { + changeHours++ + } + } + + // Distribute the remaining hours equally amongst the destination outputs + remainingAddrHours := remainingHours - changeHours + addrHoursShare := remainingAddrHours / nAddrs + + // Due to integer division, extra coin hours might remain after dividing by len(toAddrs) + // Allocate these extra hours to the toAddrs + addrHours := make([]uint64, nAddrs) + for i := range addrHours { + addrHours[i] = addrHoursShare + } + + extraHours := remainingAddrHours - (addrHoursShare * nAddrs) + i := 0 + for extraHours > 0 { + addrHours[i] = addrHours[i] + 1 + i++ + extraHours-- + } + + // Assert that the hour calculation is correct + var spendHours uint64 + for _, h := range addrHours { + spendHours += h + } + spendHours += changeHours + if spendHours != remainingHours { + logger.Panicf("spendHours != remainingHours (%d != %d), calculation error", spendHours, remainingHours) + } + + return changeHours, addrHours, spendHours +} + +// DistributeCoinHoursProportional distributes hours amongst coins proportional to the coins amount +func DistributeCoinHoursProportional(coins []uint64, hours uint64) ([]uint64, error) { + if len(coins) == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array must not be empty") + } + + coinsInt := make([]*big.Int, len(coins)) + + var total uint64 + for i, c := range coins { + if c == 0 { + return nil, errors.New("DistributeCoinHoursProportional coins array has a zero value") + } + + var err error + total, err = coin.AddUint64(total, c) + if err != nil { + return nil, err + } + + cInt64, err := coin.Uint64ToInt64(c) + if err != nil { + return nil, err + } + + coinsInt[i] = big.NewInt(cInt64) + } + + totalInt64, err := coin.Uint64ToInt64(total) + if err != nil { + return nil, err + } + totalInt := big.NewInt(totalInt64) + + hoursInt64, err := coin.Uint64ToInt64(hours) + if err != nil { + return nil, err + } + hoursInt := big.NewInt(hoursInt64) + + var assignedHours uint64 + addrHours := make([]uint64, len(coins)) + for i, c := range coinsInt { + // Scale the ratio of coins to total coins proportionally by calculating + // (coins * totalHours) / totalCoins + // The remainder is truncated, remaining hours are appended after this + num := &big.Int{} + num.Mul(c, hoursInt) + + fracInt := big.Int{} + fracInt.Div(num, totalInt) + + if !fracInt.IsUint64() { + return nil, errors.New("DistributeCoinHoursProportional calculated fractional hours is not representable as a uint64") + } + + fracHours := fracInt.Uint64() + + addrHours[i] = fracHours + assignedHours, err = coin.AddUint64(assignedHours, fracHours) + if err != nil { + return nil, err + } + } + + if hours < assignedHours { + return nil, errors.New("DistributeCoinHoursProportional assigned hours exceeding input hours, this is a bug") + } + + remainingHours := hours - assignedHours + + if remainingHours > uint64(len(coins)) { + return nil, errors.New("DistributeCoinHoursProportional remaining hours exceed len(coins), this is a bug") + } + + // For remaining hours lost due to fractional cutoff when scaling, + // first provide at least 1 coin hour to coins that were assigned 0. + i := 0 + for remainingHours > 0 && i < len(coins) { + if addrHours[i] == 0 { + addrHours[i] = 1 + remainingHours-- + } + i++ + } + + // Then, assign the extra coin hours + i = 0 + for remainingHours > 0 { + addrHours[i] = addrHours[i] + 1 + remainingHours-- + i++ + } + + return addrHours, nil +} + +// UxBalance is an intermediate representation of a UxOut for sorting and spend choosing +type UxBalance struct { + Hash cipher.SHA256 + BkSeq uint64 + Time uint64 + Address cipher.Address + Coins uint64 + InitialHours uint64 + Hours uint64 + SrcTransaction cipher.SHA256 +} + +// NewUxBalances converts coin.UxArray to []UxBalance. headTime is required to calculate coin hours. +func NewUxBalances(headTime uint64, uxa coin.UxArray) ([]UxBalance, error) { + uxb := make([]UxBalance, len(uxa)) + for i, ux := range uxa { + b, err := NewUxBalance(headTime, ux) + if err != nil { + return nil, err + } + uxb[i] = b + } + + return uxb, nil +} + +// NewUxBalance converts coin.UxOut to UxBalance. headTime is required to calculate coin hours. +func NewUxBalance(headTime uint64, ux coin.UxOut) (UxBalance, error) { + hours, err := ux.CoinHours(headTime) + if err != nil { + return UxBalance{}, err + } + + return UxBalance{ + Hash: ux.Hash(), + BkSeq: ux.Head.BkSeq, + Time: ux.Head.Time, + Address: ux.Body.Address, + Coins: ux.Body.Coins, + InitialHours: ux.Body.Hours, + Hours: hours, + SrcTransaction: ux.Body.SrcTransaction, + }, nil +} + +func uxBalancesSub(a, b []UxBalance) []UxBalance { + var x []UxBalance + + bMap := make(map[cipher.SHA256]struct{}, len(b)) + for _, i := range b { + bMap[i.Hash] = struct{}{} + } + + for _, i := range a { + if _, ok := bMap[i.Hash]; !ok { + x = append(x, i) + } + } + + return x +} + +// ChooseSpendsMinimizeUxOuts chooses uxout spends to satisfy an amount, using the least number of uxouts +// -- PRO: Allows more frequent spending, less waiting for confirmations, useful for exchanges. +// -- PRO: When transaction is volume is higher, transactions are prioritized by fee/size. Minimizing uxouts minimizes size. +// -- CON: Would make the unconfirmed pool grow larger. +// Users with high transaction frequency will want to use this so that they will not need to wait as frequently +// for unconfirmed spends to complete before sending more. +// Alternatively, or in addition to this, they should batch sends into single transactions. +func ChooseSpendsMinimizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsHighToLow) +} + +// sortSpendsCoinsHighToLow sorts uxout spends with highest balance to lowest +func sortSpendsCoinsHighToLow(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a > b + })) +} + +// ChooseSpendsMaximizeUxOuts chooses uxout spends to satisfy an amount, using the most number of uxouts +// See the pros and cons of ChooseSpendsMinimizeUxOuts. +// This should be the default mode, because this keeps the unconfirmed pool smaller which will allow +// the network to scale better. +func ChooseSpendsMaximizeUxOuts(uxa []UxBalance, coins, hours uint64) ([]UxBalance, error) { + return ChooseSpends(uxa, coins, hours, sortSpendsCoinsLowToHigh) +} + +// sortSpendsCoinsLowToHigh sorts uxout spends with lowest balance to highest +func sortSpendsCoinsLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByCoins(uxa, func(a, b uint64) bool { + return a < b + })) +} + +// sortSpendsHoursLowToHigh sorts uxout spends with lowest hours to highest +func sortSpendsHoursLowToHigh(uxa []UxBalance) { + sort.Slice(uxa, makeCmpUxOutByHours(uxa, func(a, b uint64) bool { + return a < b + })) +} + +func makeCmpUxOutByCoins(uxa []UxBalance, coinsCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // coins highest or lowest depending on coinsCmp + // hours lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Coins == b.Coins { + if a.Hours == b.Hours { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Hours < b.Hours + } + return coinsCmp(a.Coins, b.Coins) + } +} + +func makeCmpUxOutByHours(uxa []UxBalance, hoursCmp func(a, b uint64) bool) func(i, j int) bool { + // Sort by: + // hours highest or lowest depending on hoursCmp + // coins lowest + // oldest first + // tie break with hash comparison + return func(i, j int) bool { + a := uxa[i] + b := uxa[j] + + if a.Hours == b.Hours { + if a.Coins == b.Coins { + if a.BkSeq == b.BkSeq { + return cmpUxBalanceByUxID(a, b) + } + return a.BkSeq < b.BkSeq + } + return a.Coins < b.Coins + } + return hoursCmp(a.Hours, b.Hours) + } +} + +func cmpUxBalanceByUxID(a, b UxBalance) bool { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + if cmp == 0 { + logger.Panic("Duplicate UxOut when sorting") + } + return cmp < 0 +} + +// ChooseSpends chooses uxouts from a list of uxouts. +// It first chooses the uxout with the most number of coins that has nonzero coinhours. +// It then chooses uxouts with zero coinhours, ordered by sortStrategy +// It then chooses remaining uxouts with nonzero coinhours, ordered by sortStrategy +func ChooseSpends(uxa []UxBalance, coins, hours uint64, sortStrategy func([]UxBalance)) ([]UxBalance, error) { + if coins == 0 { + return nil, ErrZeroSpend + } + + if len(uxa) == 0 { + return nil, ErrNoUnspents + } + + for _, ux := range uxa { + if ux.Coins == 0 { + logger.Panic("UxOut coins are 0, can't spend") + return nil, errors.New("UxOut coins are 0, can't spend") + } + } + + // Split UxBalances into those with and without hours + var nonzero, zero []UxBalance + for _, ux := range uxa { + if ux.Hours == 0 { + zero = append(zero, ux) + } else { + nonzero = append(nonzero, ux) + } + } + + // Abort if there are no uxouts with non-zero coinhours, they can't be spent yet + if len(nonzero) == 0 { + return nil, fee.ErrTxnNoFee + } + + // Sort uxouts with hours lowest to highest and coins highest to lowest + sortSpendsCoinsHighToLow(nonzero) + + var have Balance + var spending []UxBalance + + // Use the first nonzero output. This output will have the least hours possible + firstNonzero := nonzero[0] + if firstNonzero.Hours == 0 { + logger.Panic("balance has zero hours unexpectedly") + return nil, errors.New("balance has zero hours unexpectedly") + } + + nonzero = nonzero[1:] + + spending = append(spending, firstNonzero) + + have.Coins += firstNonzero.Coins + have.Hours += firstNonzero.Hours + + if have.Coins >= coins && fee.RemainingHours(have.Hours) >= hours { + return spending, nil + } + + // Sort uxouts without hours according to the sorting strategy + sortStrategy(zero) + + for _, ux := range zero { + spending = append(spending, ux) + + have.Coins += ux.Coins + have.Hours += ux.Hours + + if have.Coins >= coins { + break + } + } + + if have.Coins >= coins && fee.RemainingHours(have.Hours) >= hours { + return spending, nil + } + + // Sort remaining uxouts with hours according to the sorting strategy + sortStrategy(nonzero) + + for _, ux := range nonzero { + spending = append(spending, ux) + + have.Coins += ux.Coins + have.Hours += ux.Hours + + if have.Coins >= coins && fee.RemainingHours(have.Hours) >= hours { + return spending, nil + } + } + + if have.Coins < coins { + return nil, ErrInsufficientBalance + } + + return nil, ErrInsufficientHours +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/wallet_test.go b/vendor/github.com/skycoin/skycoin/src/wallet/wallet_test.go new file mode 100755 index 0000000..065b833 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/wallet_test.go @@ -0,0 +1,2465 @@ +package wallet + +import ( + "bytes" + "encoding/hex" + "errors" + "flag" + "fmt" + "io/ioutil" + "math" + "math/rand" + "testing" + "time" + + "github.com/shopspring/decimal" + "github.com/stretchr/testify/require" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/cipher/encrypt" + "github.com/skycoin/skycoin/src/coin" + "github.com/skycoin/skycoin/src/testutil" + "github.com/skycoin/skycoin/src/util/fee" + "github.com/skycoin/skycoin/src/util/logging" +) + +var ( + log = logging.MustGetLogger("wallet_test") +) + +// set rand seed. +var _ = func() int64 { + t := time.Now().Unix() + rand.Seed(t) + return t +}() + +var u = flag.Bool("u", false, "update test wallet file in ./testdata") + +func init() { + // Change the scrypt N value in cryptoTable to make test faster, otherwise + // it would take more than 200 seconds to finish. + cryptoTable[CryptoTypeScryptChacha20poly1305] = encrypt.ScryptChacha20poly1305{ + N: 1 << 15, + R: encrypt.ScryptR, + P: encrypt.ScryptP, + KeyLen: encrypt.ScryptKeyLen, + } + + // When -u flag is specified, update the following wallet files: + // - ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - ./testdata/sha256xor-encrypted.wlt + if *u { + // Update ./testdata/scrypt-chacha20poly1305-encrypted.wlt + // - Create an unencrypted wallet + // - Generate an address + // - Lock the wallet with scrypt-chacha20poly1305 crypto type and password of "pwd". + w, err := NewWallet("scrypt-chacha20poly1305-encrypted.wlt", Options{ + Seed: "seed", + Label: "scrypt-chacha20poly1305", + }) + if err != nil { + log.Panic(err) + } + + if _, err := w.GenerateAddresses(1); err != nil { + log.Panic(err) + } + + if err := w.Lock([]byte("pwd"), CryptoTypeScryptChacha20poly1305); err != nil { + log.Panic(err) + } + + if err := w.Save("./testdata"); err != nil { + log.Panic(err) + } + + // Update ./testdata/sha256xor-encrypted.wlt + // - Create an sha256xor encrypted wallet with password: "pwd". + w1, err := NewWallet("sha256xor-encrypted.wlt", Options{ + Seed: "seed", + Label: "sha256xor", + Encrypt: true, + Password: []byte("pwd"), + CryptoType: CryptoTypeSha256Xor, + }) + if err != nil { + log.Panic(err) + } + + if err := w1.Save("./testdata"); err != nil { + log.Panic(err) + } + } +} + +type mockBalanceGetter map[cipher.Address]BalancePair + +func (mb mockBalanceGetter) GetBalanceOfAddrs(addrs []cipher.Address) ([]BalancePair, error) { + var bals []BalancePair + for _, addr := range addrs { + bal := mb[addr] + bals = append(bals, bal) + } + return bals, nil +} + +// 10 addresses of seed1 +var addrsOfSeed1 = []string{ + "2GBifzJEehbDX7Mkk63Prfa4MQQQyRzBLfe", + "q2kU13X8XsAg8cS8BuSeSVzjPF9AT9ghAa", + "2WXvTagXtrc1Qq71yjNXw86TC6SRgfVRH1B", + "2NUNw748b9mT2FHRxgJL5KjBHasLfdP32Sh", + "2V1CnVzWoXDaCX6wHU4tLJkWaFmLcQBb2q4", + "wBkMr936thcr57wxyrH6ffvA99JN2Q1MN1", + "2f92Wht7VQefAyoJUz3SEnfwT6wTdeAcq3L", + "27UM5jPFYVuve3ceEHAYGaJSmkynQYmwPcH", + "xjWbVN7ihReasVFwXJSSYYWF7rgQa22auC", + "2LyanokLYFeBfBsNkRYHp2qtN8naGFJqeUw", +} + +var childSeedsOfSeed1 = []string{ + "22b826c586039f8078433be26618ca1024e883d97de2267313bb78068f634c5a", + "68efbbdf8aa06368cfc55e252d1e782bbd7651e590ee59e94ab579d2e44c20ad", + "8894c818732375680284be4509d153272726f42296b85ecac1fb66b9dc7484b9", + "6603375ee19c1e9fffe369e3f62e9deaa6931c1183d7da7f24ecbbd591061502", + "91a63f939149d423ea39701d8ed16cfb16a3554c184d214d2289018ddb9e73de", + "f0f4f008aa3e7cd32ee953507856fb46e37b734fd289dc01449133d7e37a1f07", + "6b194da58a5ba5660cf2b00076cf6a2962fe8fe0523abca5647c87df3352866a", + "b47a2678f7e797d3ada86e7e36855f572a18ab78dcbe54ed0613bba69fd76f8d", + "fe064533108dadbef13be3a95f547ba03423aa6a701c40aaaed775cb783b12b3", + "d554da211321a437e4d08f2a57e3ef255cffa89dd182e0fd52a4fd5bdfcab1ae", +} + +func fromAddrString(t *testing.T, addrStrs []string) []cipher.Address { + addrs := make([]cipher.Address, 0, len(addrStrs)) + for _, addr := range addrStrs { + a, err := cipher.DecodeBase58Address(addr) + require.NoError(t, err) + addrs = append(addrs, a) + } + return addrs +} + +func TestNewWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + wltName string + ops Options + expect expect + }{ + { + "ok with seed set", + "test.wlt", + Options{ + Seed: "testseed123", + }, + expect{ + meta: map[string]string{ + "label": "", + "filename": "test.wlt", + "coin": "skycoin", + "type": "deterministic", + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + "ok with label and seed set", + "test.wlt", + Options{ + Label: "wallet1", + Seed: "testseed123", + }, + expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": "skycoin", + "type": "deterministic", + "seed": "testseed123", + "version": Version, + }, + err: nil, + }, + }, + { + "ok with label, seed and coin set", + "test.wlt", + Options{ + Label: "wallet1", + Coin: CoinTypeBitcoin, + Seed: "testseed123", + }, + expect{ + meta: map[string]string{ + "label": "wallet1", + "filename": "test.wlt", + "coin": string(CoinTypeBitcoin), + "type": "deterministic", + "seed": "testseed123", + }, + err: nil, + }, + }, + { + "ok default crypto type", + "test.wlt", + Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + Password: []byte("pwd"), + }, + expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": "deterministic", + "encrypted": "true", + }, + err: nil, + }, + }, + { + "encrypt without password", + "test.wlt", + Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Seed: "testseed123", + Encrypt: true, + }, + expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": "deterministic", + "encrypted": "true", + }, + err: ErrMissingPassword, + }, + }, + { + "create with no seed", + "test.wlt", + Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: true, + Password: []byte("pwd"), + }, + expect{ + meta: map[string]string{ + "label": "wallet1", + "coin": string(CoinTypeSkycoin), + "type": "deterministic", + "encrypted": "true", + }, + err: ErrMissingSeed, + }, + }, + { + "password=pwd encrypt=false", + "test.wlt", + Options{ + Label: "wallet1", + Coin: CoinTypeSkycoin, + Encrypt: false, + Seed: "seed", + Password: []byte("pwd"), + }, + expect{ + err: ErrMissingEncrypt, + }, + }, + } + + for _, tc := range tt { + // test all supported crypto types + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.ops.Encrypt { + tc.ops.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w, err := NewWallet(tc.wltName, tc.ops) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + require.Equal(t, tc.ops.Encrypt, w.IsEncrypted()) + + if w.IsEncrypted() { + // Confirms the seeds and entry secrets are all empty + require.Equal(t, "", w.seed()) + require.Equal(t, "", w.lastSeed()) + + for _, e := range w.Entries { + require.Equal(t, emptySeckey, e.Secret) + } + + // Confirms that secrets field is not empty + require.NotEmpty(t, w.secrets()) + } + }) + } + } +} + +func TestWalletLock(t *testing.T) { + tt := []struct { + name string + opts Options + lockPwd []byte + err error + }{ + { + "ok", + Options{ + Seed: "seed", + }, + []byte("pwd"), + nil, + }, + { + "password is nil", + Options{ + Seed: "seed", + }, + nil, + ErrMissingPassword, + }, + { + "wallet already encrypted", + Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + []byte("pwd"), + ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + wltName := newWalletFilename() + w, err := NewWallet(wltName, tc.opts) + require.NoError(t, err) + + if !w.IsEncrypted() { + // Generates 2 addresses + _, err = w.GenerateAddresses(2) + require.NoError(t, err) + } + + err = w.Lock(tc.lockPwd, ct) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.True(t, w.IsEncrypted()) + + // Checks if the seeds are wiped + require.Empty(t, w.seed()) + require.Empty(t, w.lastSeed()) + + // Checks if the entries are encrypted + for i := range w.Entries { + require.Equal(t, cipher.SecKey{}, w.Entries[i].Secret) + } + }) + + } + } + +} + +func TestWalletUnlock(t *testing.T) { + tt := []struct { + name string + opts Options + unlockPwd []byte + err error + }{ + { + "ok", + Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + []byte("pwd"), + nil, + }, + { + "unlock with nil password", + Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + nil, + ErrMissingPassword, + }, + { + "unlock undecrypted wallet", + Options{ + Seed: "seed", + Encrypt: false, + }, + []byte("pwd"), + ErrWalletNotEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("%v crypto=%v", tc.name, ct) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + t.Run(name, func(t *testing.T) { + w := makeWallet(t, tc.opts, 1) + // Tests the unlock method + wlt, err := w.Unlock(tc.unlockPwd) + require.Equal(t, tc.err, err) + if err != nil { + return + } + + require.False(t, wlt.IsEncrypted()) + + // Checks the seeds + require.Equal(t, tc.opts.Seed, wlt.seed()) + + // Checks the generated addresses + sd, sks := cipher.GenerateDeterministicKeyPairsSeed([]byte(wlt.seed()), 1) + require.Equal(t, uint64(1), uint64(len(wlt.Entries))) + + // Checks the last seed + require.Equal(t, hex.EncodeToString(sd), wlt.lastSeed()) + + for i := range wlt.Entries { + addr := cipher.AddressFromSecKey(sks[i]) + require.Equal(t, addr, wlt.Entries[i].Address) + } + + // Checks the original seeds + require.NotEqual(t, tc.opts.Seed, w.seed()) + + // Checks if the seckeys in entries of original wallet are empty + for i := range w.Entries { + require.Equal(t, cipher.SecKey{}, w.Entries[i].Secret) + } + + // Checks if the seed and lastSeed in original wallet are sitll empty + require.Empty(t, w.seed()) + require.Empty(t, w.lastSeed()) + }) + } + } +} + +func TestLockAndUnLock(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + w, err := NewWallet("wallet", Options{ + Label: "wallet", + Seed: "seed", + }) + require.NoError(t, err) + _, err = w.GenerateAddresses(9) + require.NoError(t, err) + require.Len(t, w.Entries, 10) + + // clone the wallet + cw := w.clone() + require.Equal(t, w, cw) + + // lock the cloned wallet + err = cw.Lock([]byte("pwd"), ct) + require.NoError(t, err) + + // unlock the cloned wallet + ucw, err := cw.Unlock([]byte("pwd")) + require.NoError(t, err) + + require.Equal(t, w, ucw) + }) + } +} + +func makeWallet(t *testing.T, opts Options, addrNum uint64) *Wallet { // nolint: unparam + // Create an unlocked wallet, then generate addresses, lock if the options.Encrypt is true. + preOpts := opts + opts.Encrypt = false + opts.Password = nil + w, err := NewWallet("t.wlt", opts) + require.NoError(t, err) + + if addrNum > 1 { + _, err = w.GenerateAddresses(addrNum - 1) + require.NoError(t, err) + } + if preOpts.Encrypt { + err = w.Lock(preOpts.Password, preOpts.CryptoType) + require.NoError(t, err) + } + return w +} + +func TestLoadWallet(t *testing.T) { + type expect struct { + meta map[string]string + err error + } + + tt := []struct { + name string + file string + expect expect + }{ + { + "ok", + "./testdata/test1.wlt", + expect{ + meta: map[string]string{ + "coin": string(CoinTypeSkycoin), + "filename": "test1.wlt", + "label": "test3", + "lastSeed": "9182b02c0004217ba9a55593f8cf0abecc30d041e094b266dbb5103e1919adaf", + "seed": "buddy fossil side modify turtle door label grunt baby worth brush master", + "tm": "1503458909", + "type": "deterministic", + "version": "0.1", + }, + err: nil, + }, + }, + { + "wallet file doesn't exist", + "not_exist_file.wlt", + expect{ + meta: map[string]string{}, + err: fmt.Errorf("load wallet file failed, wallet not_exist_file.wlt doesn't exist"), + }, + }, + { + "invalid wallet: no type", + "./testdata/invalid_wallets/no_type.wlt", + expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet no_type.wlt: type field not set"), + }, + }, + { + "invalid wallet: invalid type", + "./testdata/invalid_wallets/err_type.wlt", + expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet err_type.wlt: wallet type invalid"), + }, + }, + { + "invalid wallet: no coin", + "./testdata/invalid_wallets/no_coin.wlt", + expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet no_coin.wlt: coin field not set"), + }, + }, + { + "invalid wallet: no seed", + "./testdata/invalid_wallets/no_seed.wlt", + expect{ + meta: map[string]string{}, + err: fmt.Errorf("invalid wallet no_seed.wlt: seed field not set"), + }, + }, + { + "version=0.2 encrypted=true crypto=scrypt-chacha20poly1305", + "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + expect{ + meta: map[string]string{ + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "true", + "filename": "scrypt-chacha20poly1305-encrypted.wlt", + "label": "scrypt-chacha20poly1305", + "lastSeed": "", + "seed": "", + "type": "deterministic", + "version": "0.2", + }, + err: nil, + }, + }, + { + "version=0.2 encrypted=true crypto=sha256xor", + "./testdata/sha256xor-encrypted.wlt", + expect{ + meta: map[string]string{ + "coin": "skycoin", + "cryptoType": "sha256-xor", + "encrypted": "true", + "filename": "sha256xor-encrypted.wlt", + "label": "sha256xor", + "lastSeed": "", + "seed": "", + "type": "deterministic", + "version": "0.2", + }, + err: nil, + }, + }, + { + "version=0.2 encrypted=flase", + "./testdata/v2_no_encrypt.wlt", + expect{ + meta: map[string]string{ + "coin": "skycoin", + "cryptoType": "scrypt-chacha20poly1305", + "encrypted": "false", + "filename": "v2_no_encrypt.wlt", + "label": "v2_no_encrypt", + "lastSeed": "c79454cf362b3f55e5effce09f664311650a44b9c189b3c8eed1ae9bd696cd9e", + "secrets": "", + "seed": "seed", + "type": "deterministic", + "version": "0.2", + }, + err: nil, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.file) + require.Equal(t, tc.expect.err, err) + if err != nil { + return + } + + for k, v := range tc.expect.meta { + vv := w.Meta[k] + require.Equal(t, v, vv) + } + + if w.IsEncrypted() { + require.NotEmpty(t, w.Meta[metaSecrets]) + } + }) + } +} + +func TestWalletGenerateAddress(t *testing.T) { + tt := []struct { + name string + opts Options + num uint64 + oneAddressEachTime bool + err error + }{ + { + "ok with one address", + Options{ + Seed: "seed", + }, + 1, + false, + nil, + }, + { + "ok with two address", + Options{ + Seed: "seed", + }, + 2, + false, + nil, + }, + { + "ok with three address and generate one address each time", + Options{ + Seed: "seed", + }, + 2, + true, + nil, + }, + { + "wallet is encrypted", + Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + }, + 2, + true, + ErrWalletEncrypted, + }, + } + + for _, tc := range tt { + for ct := range cryptoTable { + name := fmt.Sprintf("crypto=%v %v", ct, tc.name) + if tc.opts.Encrypt { + tc.opts.CryptoType = ct + } + + t.Run(name, func(t *testing.T) { + // create wallet + w, err := NewWallet("test.wlt", tc.opts) + require.NoError(t, err) + + // generate addresses + if tc.oneAddressEachTime { + _, err = w.GenerateAddresses(tc.num - 1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } else { + for i := uint64(0); i < tc.num-1; i++ { + _, err := w.GenerateAddresses(1) + require.Equal(t, tc.err, err) + if err != nil { + return + } + } + } + + // check the entry number + require.Equal(t, int(tc.num), len(w.Entries)) + + addrs := w.GetAddresses() + + _, keys := cipher.GenerateDeterministicKeyPairsSeed([]byte(tc.opts.Seed), int(tc.num)) + for i, k := range keys { + a := cipher.AddressFromSecKey(k) + require.Equal(t, a.String(), addrs[i].String()) + } + }) + } + } +} + +func TestWalletGetEntry(t *testing.T) { + tt := []struct { + name string + wltFile string + address string + find bool + }{ + { + "ok", + "./testdata/test1.wlt", + "JUdRuTiqD1mGcw358twMg3VPpXpzbkdRvJ", + true, + }, + { + "entry not exist", + "./testdata/test1.wlt", + "2ULfxDUuenUY5V4Pr8whmoAwFdUseXNyjXC", + false, + }, + { + "scrypt-chacha20poly1305 encrytped wallet", + "./testdata/scrypt-chacha20poly1305-encrypted.wlt", + "2EVNa4CK9SKosT4j1GEn8SuuUUEAXaHAMbM", + true, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + a, err := cipher.DecodeBase58Address(tc.address) + require.NoError(t, err) + e, ok := w.GetEntry(a) + require.Equal(t, tc.find, ok) + if ok { + require.Equal(t, tc.address, e.Address.String()) + } + }) + } +} + +func TestWalletAddEntry(t *testing.T) { + test1SecKey, err := cipher.SecKeyFromHex("1fc5396e91e60b9fc613d004ea5bd2ccea17053a12127301b3857ead76fdb93e") + require.NoError(t, err) + + _, s := cipher.GenerateKeyPair() + seckeys := []cipher.SecKey{ + test1SecKey, + s, + } + + tt := []struct { + name string + wltFile string + secKey cipher.SecKey + err error + }{ + { + "ok", + "./testdata/test1.wlt", + seckeys[1], + nil, + }, + { + "dup entry", + "./testdata/test1.wlt", + seckeys[0], + errors.New("duplicate address entry"), + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + w, err := Load(tc.wltFile) + require.NoError(t, err) + a := cipher.AddressFromSecKey(tc.secKey) + p := cipher.PubKeyFromSecKey(tc.secKey) + require.Equal(t, tc.err, w.AddEntry(Entry{ + Address: a, + Public: p, + Secret: s, + })) + }) + } +} + +func TestWalletGuard(t *testing.T) { + for ct := range cryptoTable { + t.Run(fmt.Sprintf("crypto=%v", ct), func(t *testing.T) { + validate := func(w *Wallet) { + require.Equal(t, "", w.seed()) + require.Equal(t, "", w.lastSeed()) + for _, e := range w.Entries { + require.Equal(t, cipher.SecKey{}, e.Secret) + } + } + + w, err := NewWallet("t.wlt", Options{ + Seed: "seed", + Encrypt: true, + Password: []byte("pwd"), + CryptoType: ct, + }) + require.NoError(t, err) + + require.NoError(t, w.GuardUpdate([]byte("pwd"), func(w *Wallet) error { + require.Equal(t, "seed", w.seed()) + w.setLabel("label") + return nil + })) + require.Equal(t, "label", w.Label()) + validate(w) + + w.GuardView([]byte("pwd"), func(w *Wallet) error { + require.Equal(t, "label", w.Label()) + w.setLabel("new label") + return nil + }) + + require.Equal(t, "label", w.Label()) + validate(w) + + }) + } +} + +type distributeSpendHoursTestCase struct { + name string + inputHours uint64 + nAddrs uint64 + haveChange bool + expectChangeHours uint64 + expectAddrHours []uint64 +} + +var burnFactor2TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, two addrs, no change", + inputHours: 3, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, two addr, change", + inputHours: 4, + nAddrs: 2, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "30 (divided by 2, odd number) input hours, two addr, change", + inputHours: 30, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 3}, + }, + { + name: "33 (odd number) input hours, two addr, change", + inputHours: 33, + nAddrs: 2, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{4, 4}, + }, + { + name: "33 (odd number) input hours, three addr, change", + inputHours: 33, + nAddrs: 3, + haveChange: true, + expectChangeHours: 8, + expectAddrHours: []uint64{3, 3, 2}, + }, +} + +var burnFactor3TestCases = []distributeSpendHoursTestCase{ + { + name: "no input hours, one addr, no change", + inputHours: 0, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "no input hours, two addrs, no change", + inputHours: 0, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{0, 0}, + }, + { + name: "no input hours, one addr, change", + inputHours: 0, + nAddrs: 1, + haveChange: true, + expectAddrHours: []uint64{0}, + }, + { + name: "one input hour, one addr, no change", + inputHours: 1, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{0}, + }, + { + name: "two input hours, one addr, no change", + inputHours: 2, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{1}, + }, + { + name: "three input hours, one addr, no change", + inputHours: 3, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "two input hours, one addr, change", + inputHours: 2, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{0}, + }, + { + name: "three input hours, one addr, change", + inputHours: 3, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, change", + inputHours: 4, + nAddrs: 1, + haveChange: true, + expectChangeHours: 1, + expectAddrHours: []uint64{1}, + }, + { + name: "four input hours, one addr, no change", + inputHours: 4, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{2}, + }, + { + name: "four input hours, two addrs, no change", + inputHours: 4, + nAddrs: 2, + haveChange: false, + expectAddrHours: []uint64{1, 1}, + }, + { + name: "five input hours, one addr, no change", + inputHours: 5, + nAddrs: 1, + haveChange: false, + expectAddrHours: []uint64{3}, + }, + { + name: "five input hours, one addr, change", + inputHours: 5, + nAddrs: 1, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1}, + }, + { + name: "five input hours, two addr, change", + inputHours: 5, + nAddrs: 2, + haveChange: true, + expectChangeHours: 2, + expectAddrHours: []uint64{1, 0}, + }, + { + name: "32 input hours, two addr, change", + inputHours: 32, + nAddrs: 2, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{5, 5}, + }, + { + name: "35 input hours, two addr, change", + inputHours: 35, + nAddrs: 2, + haveChange: true, + expectChangeHours: 12, + expectAddrHours: []uint64{6, 5}, + }, + { + name: "32 input hours, three addr, change", + inputHours: 32, + nAddrs: 3, + haveChange: true, + expectChangeHours: 11, + expectAddrHours: []uint64{4, 3, 3}, + }, +} + +func TestWalletDistributeSpendHours(t *testing.T) { + var cases []distributeSpendHoursTestCase + switch fee.BurnFactor { + case 2: + cases = burnFactor2TestCases + case 3: + cases = burnFactor3TestCases + default: + t.Fatalf("No test cases defined for fee.BurnFactor=%d", fee.BurnFactor) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + changeHours, addrHours, totalHours := DistributeSpendHours(tc.inputHours, tc.nAddrs, tc.haveChange) + require.Equal(t, tc.expectChangeHours, changeHours) + require.Equal(t, tc.expectAddrHours, addrHours) + require.Equal(t, tc.nAddrs, uint64(len(addrHours))) + + outputHours := changeHours + for _, h := range addrHours { + outputHours += h + } + require.True(t, tc.inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if tc.inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, tc.inputHours-outputHours) + require.NoError(t, err) + } + }) + } + + // Tests over range of values + for inputHours := uint64(0); inputHours <= 1e3; inputHours++ { + for nAddrs := uint64(1); nAddrs < 16; nAddrs++ { + for _, haveChange := range []bool{true, false} { + name := fmt.Sprintf("inputHours=%d nAddrs=%d haveChange=%v", inputHours, nAddrs, haveChange) + t.Run(name, func(t *testing.T) { + changeHours, addrHours, totalHours := DistributeSpendHours(inputHours, nAddrs, haveChange) + require.Equal(t, nAddrs, uint64(len(addrHours))) + + var sumAddrHours uint64 + for _, h := range addrHours { + sumAddrHours += h + } + + if haveChange { + remainingHours := (inputHours - fee.RequiredFee(inputHours)) + splitRemainingHours := remainingHours / 2 + require.True(t, changeHours == splitRemainingHours || changeHours == splitRemainingHours+1) + require.Equal(t, splitRemainingHours, sumAddrHours) + } else { + require.Equal(t, uint64(0), changeHours) + require.Equal(t, inputHours-fee.RequiredFee(inputHours), sumAddrHours) + } + + outputHours := sumAddrHours + changeHours + require.True(t, inputHours >= outputHours) + require.Equal(t, outputHours, totalHours) + + if inputHours != 0 { + err := fee.VerifyTransactionFeeForHours(outputHours, inputHours-outputHours) + require.NoError(t, err) + } + + // addrHours at the beginning and end of the array should not differ by more than one + max := addrHours[0] + min := addrHours[len(addrHours)-1] + require.True(t, max-min <= 1) + }) + } + } + } +} + +func uxBalancesEqual(a, b []UxBalance) bool { + if len(a) != len(b) { + return false + } + + for i, x := range a { + if x != b[i] { + return false + } + } + + return true +} + +func TestWalletSortSpendsLowToHigh(t *testing.T) { + // UxBalances are sorted with Coins lowest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 5, + Coins: 1, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + for i := range uxb { + j := rand.Intn(i + 1) + uxb[i], uxb[j] = uxb[j], uxb[i] + } + + // Sanity check that shuffling produces a new result + if !uxBalancesEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsLowToHigh(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsLowToHigh(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsHighToLow(uxb) + verifySortedCoinsHighToLow(t, uxb) + } +} + +func TestWalletSortSpendsHighToLow(t *testing.T) { + // UxBalances are sorted with Coins highest, then following other order rules + orderedUxb := []UxBalance{ + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 10000, + Hours: 0, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 10, + Coins: 1000, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 4, + Coins: 100, + Hours: 100, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 3, + Coins: 10, + Hours: 1, + }, + { + Hash: testutil.RandSHA256(t), + BkSeq: 1, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("bddf0aaf80f96c144f33ac8a27764a868d37e1c11e568063ebeb1367de859566"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + { + Hash: cipher.MustSHA256FromHex("f569461182b0efe9a5c666e9a35c6602b351021c1803cc740aca548cf6db4cb2"), + BkSeq: 2, + Coins: 10, + Hours: 10, + }, + } + + shuffleWorked := false + nShuffle := 20 + for i := 0; i < nShuffle; i++ { + // Shuffle the list + uxb := make([]UxBalance, len(orderedUxb)) + copy(uxb, orderedUxb) + + rand.Shuffle(len(uxb), func(i, j int) { + uxb[i], uxb[j] = uxb[j], uxb[i] + }) + + if !uxBalancesEqual(uxb, orderedUxb) { + shuffleWorked = true + } + + sortSpendsCoinsHighToLow(uxb) + + for i, ux := range uxb { + require.Equal(t, orderedUxb[i], ux, "index %d", i) + } + + verifySortedCoinsHighToLow(t, uxb) + } + + require.True(t, shuffleWorked) + + nRand := 1000 + for i := 0; i < nRand; i++ { + uxb := makeRandomUxBalances(t) + + sortSpendsCoinsHighToLow(uxb) + verifySortedCoinsHighToLow(t, uxb) + } +} + +func TestWalletChooseSpendsMaximizeUxOuts(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMaximizeUxOuts, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) + } +} + +func TestWalletChooseSpendsMinimizeUxOutsRandom(t *testing.T) { + nRand := 10000 + for i := 0; i < nRand; i++ { + coins := uint64((rand.Intn(3)+1)*10 + rand.Intn(3)) // 10,20,30 + 0,1,2 + uxb := makeRandomUxBalances(t) + + verifyChosenCoins(t, uxb, coins, ChooseSpendsMinimizeUxOuts, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) + } +} + +func TestRemoveBackupFiles(t *testing.T) { + type wltInfo struct { + wltName string + version string + } + + tt := []struct { + name string + initFiles []wltInfo + expectedRemainingFiles map[string]struct{} + }{ + { + "no file", + []wltInfo{}, + map[string]struct{}{}, + }, + { + "wlt v0.1=1 bak v0.1=1 delete 1 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + }, + }, + { + "wlt v0.1=2 bak v0.1=1 delete 1 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + }, + }, + { + "wlt v0.1=3 bak v0.1=1 delete 1 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + "wlt v0.1=3 bak v0.1=2 delete 2 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + "wlt v0.1=3 bak v0.1=3 delete 3 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t3.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + }, + }, + { + "wlt v0.1=3 bak v0.1=1 no delete", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t2.wlt", + "0.1", + }, + { + "t3.wlt", + "0.1", + }, + { + "t4.wlt.bak", + "0.1", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t4.wlt.bak": struct{}{}, + }, + }, + { + "wlt v0.2=3 bak v0.2=1 no delete", + []wltInfo{ + { + "t1.wlt", + "0.2", + }, + { + "t2.wlt", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + "wlt v0.1=1 bak v0.1=1 wlt v0.2=2 bak v0.2=2 delete 1 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.2", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + { + "wlt v0.1=1 bak v0.1=2 wlt v0.2=2 bak v0.2=1 delete 1 bak", + []wltInfo{ + { + "t1.wlt", + "0.1", + }, + { + "t1.wlt.bak", + "0.1", + }, + { + "t2.wlt", + "0.2", + }, + { + "t2.wlt.bak", + "0.1", + }, + { + "t3.wlt", + "0.2", + }, + { + "t3.wlt.bak", + "0.2", + }, + }, + map[string]struct{}{ + "t1.wlt": struct{}{}, + "t2.wlt": struct{}{}, + "t2.wlt.bak": struct{}{}, + "t3.wlt": struct{}{}, + "t3.wlt.bak": struct{}{}, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + dir := prepareWltDir() + // Initialize files + for _, f := range tc.initFiles { + w, err := NewWallet(f.wltName, Options{ + Seed: "s1", + }) + require.NoError(t, err) + w.setVersion(f.version) + + require.NoError(t, w.Save(dir)) + } + + require.NoError(t, removeBackupFiles(dir)) + + // Get all remaining files + fs, err := ioutil.ReadDir(dir) + require.NoError(t, err) + require.Len(t, fs, len(tc.expectedRemainingFiles)) + for _, f := range fs { + _, ok := tc.expectedRemainingFiles[f.Name()] + require.True(t, ok) + } + }) + } +} + +func makeRandomUxBalances(t *testing.T) []UxBalance { + // Generate random 0-100 UxBalances + // Coins 1-10 (must be >0) + // Hours 0-10 + // BkSeq 0-10 + // Hash random + // Small ranges are used for Coins, Hours, BkSeq to increase likelihood + // that they collide and test deeper sorting comparisons + + n := rand.Intn(101) + uxb := make([]UxBalance, n) + + // Use a random max range for the hours' rand range to ensure enough + // balances have zero hours + hasZeroHoursRange := rand.Intn(3) + 1 + + for i := 0; i < n; i++ { + ux := UxBalance{ + Coins: uint64(rand.Intn(10) + 1), // 1-10 + Hours: uint64(rand.Intn(hasZeroHoursRange)), + BkSeq: uint64(rand.Intn(11)), // 0-10 + Hash: testutil.RandSHA256(t), + } + + uxb[i] = ux + } + + return uxb +} + +func verifyChosenCoins(t *testing.T, uxb []UxBalance, coins uint64, chooseSpends func([]UxBalance, uint64, uint64) ([]UxBalance, error), cmpCoins func(i, j UxBalance) bool) { + var haveZero, haveNonzero int + for _, ux := range uxb { + if ux.Hours == 0 { + haveZero++ + } else { + haveNonzero++ + } + } + + var totalCoins, totalHours uint64 + for _, ux := range uxb { + totalCoins += ux.Coins + totalHours += ux.Hours + } + + chosen, err := chooseSpends(uxb, coins, 0) + + if coins == 0 { + testutil.RequireError(t, err, ErrZeroSpend.Error()) + return + } + + if len(uxb) == 0 { + testutil.RequireError(t, err, ErrNoUnspents.Error()) + return + } + + if totalHours == 0 { + testutil.RequireError(t, err, fee.ErrTxnNoFee.Error()) + return + } + + if coins > totalCoins { + testutil.RequireError(t, err, ErrInsufficientBalance.Error()) + return + } + + require.NoError(t, err) + require.NotEqual(t, 0, len(chosen)) + + // Check that there are no duplicated spends chosen + uxMap := make(map[UxBalance]struct{}, len(chosen)) + for _, ux := range chosen { + _, ok := uxMap[ux] + require.False(t, ok) + uxMap[ux] = struct{}{} + } + + // The first chosen spend should have non-zero coin hours + require.NotEqual(t, uint64(0), chosen[0].Hours) + + // Outputs with zero hours should come before any outputs with non-zero hours, + // except for the first output + for i := range chosen { + if i <= 1 { + continue + } + + a := chosen[i-1] + b := chosen[i] + + if b.Hours == 0 { + require.Equal(t, uint64(0), a.Hours) + } + } + + // The initial UxBalance with hours should have more or equal coins than any other UxBalance with hours + // If it has equal coins, it should have less hours + for _, ux := range chosen[1:] { + if ux.Hours != 0 { + require.True(t, chosen[0].Coins >= ux.Coins) + + if chosen[0].Coins == ux.Coins { + require.True(t, chosen[0].Hours <= ux.Hours) + } + } + } + + var zeroBalances, nonzeroBalances []UxBalance + for _, ux := range chosen[1:] { + if ux.Hours == 0 { + zeroBalances = append(zeroBalances, ux) + } else { + nonzeroBalances = append(nonzeroBalances, ux) + } + } + + // Amongst the UxBalances with zero hours, they should be sorted as specified + verifySortedCoins(t, zeroBalances, cmpCoins) + + // Amongst the UxBalances with non-zero hours, they should be sorted as specified + verifySortedCoins(t, nonzeroBalances, cmpCoins) + + // If there are any extra UxBalances with non-zero hours, all of the zeros should have been chosen + if len(nonzeroBalances) > 0 { + require.Equal(t, haveZero, len(zeroBalances)) + } + + // Excessive UxBalances to satisfy the amount requested should not be included + var haveCoins uint64 + for i, ux := range chosen { + haveCoins += ux.Coins + if haveCoins >= coins { + require.Equal(t, len(chosen)-1, i) + } + } +} + +func verifySortedCoins(t *testing.T, uxb []UxBalance, cmpCoins func(a, b UxBalance) bool) { + if len(uxb) <= 1 { + return + } + + for i := range uxb { + if i == 0 { + continue + } + + a := uxb[i-1] + b := uxb[i] + + require.True(t, cmpCoins(a, b)) + + if a.Coins == b.Coins { + require.True(t, a.Hours <= b.Hours) + + if a.Hours == b.Hours { + require.True(t, a.BkSeq <= b.BkSeq) + + if a.BkSeq == b.BkSeq { + cmp := bytes.Compare(a.Hash[:], b.Hash[:]) + require.True(t, cmp < 0) + } + } + } + } +} + +func verifySortedCoinsLowToHigh(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins <= b.Coins + }) +} + +func verifySortedCoinsHighToLow(t *testing.T, uxb []UxBalance) { + verifySortedCoins(t, uxb, func(a, b UxBalance) bool { + return a.Coins >= b.Coins + }) +} + +func TestCreateWalletParamsVerify(t *testing.T) { + changeAddress := testutil.MakeAddress() + + toManual := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + Hours: 1, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + Hours: 0, + }, + } + + toAuto := []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Coins: 1e6, + }, + { + Address: testutil.MakeAddress(), + Coins: 5e6, + }, + } + + one := decimal.New(1, 0) + negativeOne := decimal.New(-1, 0) + onePointOne := decimal.New(11, -1) + pointOneOne := decimal.New(11, -2) + + uxoutHash := testutil.RandSHA256(t) + + cases := []struct { + name string + params CreateTransactionParams + err string + }{ + { + name: "null change address", + params: CreateTransactionParams{ + ChangeAddress: &cipher.Address{}, + }, + err: "ChangeAddress must not be the null address", + }, + + { + name: "no to destinations", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + }, + err: "To is required", + }, + + { + name: "missing to coins", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Address: testutil.MakeAddress(), + Hours: 1, + }, + }, + }, + err: "To.Coins must not be zero", + }, + + { + name: "missing to address", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{ + { + Coins: 5, + Hours: 1, + }, + }, + }, + err: "To.Address must not be the null address", + }, + + { + name: "missing wallet id", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + }, + err: "Wallet.ID is required", + }, + + { + name: "wallet addresses contains empty value", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{cipher.Address{}}, + }, + }, + err: "Wallet.Addresses must not contain the null address", + }, + + { + name: "nonzero to hours for auto selection", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "To.Hours must be zero for auto type hours selection", + }, + + { + name: "mode missing for auto selection", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + }, + }, + err: "HoursSelection.Mode is required for auto type hours selection", + }, + + { + name: "mode set for manual selection", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.Mode cannot be used for manual type hours selection", + }, + + { + name: "missing hours selection type", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: "", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection type", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: "invalid", + }, + }, + err: "Invalid HoursSelection.Type", + }, + + { + name: "invalid hours selection mode", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: "invalid", + }, + }, + err: "Invalid HoursSelection.Mode", + }, + + { + name: "share factor not set for split even mode", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + }, + }, + err: "HoursSelection.ShareFactor must be set for share mode", + }, + + { + name: "share factor set but not split even mode", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + ShareFactor: &one, + }, + }, + err: "HoursSelection.ShareFactor can only be used for share mode", + }, + + { + name: "share factor less than 0", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &negativeOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "share factor greater than 1", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &onePointOne, + }, + }, + err: "HoursSelection.ShareFactor must be >= 0 and <= 1", + }, + + { + name: "duplicate output when manual", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toManual[0], toManual[0]}, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "duplicate output when auto", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: []coin.TransactionOutput{toAuto[0], toAuto[0]}, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + err: "To contains duplicate values", + }, + + { + name: "both uxouts and addresses specified", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{changeAddress}, + UxOuts: []cipher.SHA256{uxoutHash}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.UxOuts and Wallet.Addresses cannot be combined", + }, + + { + name: "duplicate uxouts", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + UxOuts: []cipher.SHA256{uxoutHash, uxoutHash}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.UxOuts contains duplicate values", + }, + + { + name: "duplicate addresses", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{changeAddress, changeAddress}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + err: "Wallet.Addresses contains duplicate values", + }, + + { + name: "valid auto split even share factor", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toAuto, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeAuto, + Mode: HoursSelectionModeShare, + ShareFactor: &pointOneOne, + }, + }, + }, + + { + name: "valid manual", + params: CreateTransactionParams{ + ChangeAddress: &changeAddress, + To: toManual, + Wallet: CreateTransactionWalletParams{ + ID: "foo.wlt", + Addresses: []cipher.Address{}, + }, + HoursSelection: HoursSelection{ + Type: HoursSelectionTypeManual, + }, + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + err := tc.params.Validate() + if tc.err != "" { + require.Equal(t, NewError(errors.New(tc.err)), err, err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestDistributeCoinHoursProportional(t *testing.T) { + cases := []struct { + name string + coins []uint64 + hours uint64 + output []uint64 + err error + }{ + { + name: "no coins", + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array must not be empty"), + }, + { + name: "coins have 0 in them", + coins: []uint64{1, 2, 0, 3}, + hours: 1, + err: errors.New("DistributeCoinHoursProportional coins array has a zero value"), + }, + { + name: "total coins too large while adding", + coins: []uint64{10, math.MaxUint64 - 9}, + hours: 1, + err: coin.ErrUint64AddOverflow, + }, + { + name: "total coins too large after adding", + coins: []uint64{10, math.MaxInt64}, + hours: 1, + err: coin.ErrUint64OverflowsInt64, + }, + { + name: "single coin too large", + coins: []uint64{10, math.MaxInt64 + 1}, + hours: 1, + err: coin.ErrUint64OverflowsInt64, + }, + { + name: "hours too large", + coins: []uint64{10}, + hours: math.MaxInt64 + 1, + err: coin.ErrUint64OverflowsInt64, + }, + + { + name: "valid, one input", + coins: []uint64{1}, + hours: 1, + output: []uint64{1}, + }, + + { + name: "zero hours", + coins: []uint64{1}, + hours: 0, + output: []uint64{0}, + }, + + { + name: "valid, multiple inputs, all equal", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins and hours", + coins: []uint64{2, 4, 8, 16}, + hours: 30, + output: []uint64{2, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, rational division in coins, irrational in hours", + coins: []uint64{2, 4, 8, 16}, + hours: 31, + output: []uint64{3, 4, 8, 16}, + }, + + { + name: "valid, multiple inputs, irrational division in coins, rational in hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 41, + output: []uint64{2, 3, 5, 7, 11, 13}, + }, + + { + name: "valid, multiple inputs, irrational division in coins and hours", + coins: []uint64{2, 3, 5, 7, 11, 13}, + hours: 50, + output: []uint64{3, 4, 7, 8, 13, 15}, + }, + + { + name: "valid, multiple inputs that would receive 0 hours but get compensated from remainder as priority", + coins: []uint64{16, 8, 4, 2, 1, 1}, + hours: 14, + output: []uint64{7, 3, 1, 1, 1, 1}, + }, + + { + name: "not enough hours for everyone", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 1, + output: []uint64{1, 0, 0, 0, 0}, + }, + + { + name: "not enough hours for everyone 2", + coins: []uint64{1, 1, 1, 1, 1}, + hours: 3, + output: []uint64{1, 1, 1, 0, 0}, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + hours, err := DistributeCoinHoursProportional(tc.coins, tc.hours) + if tc.err != nil { + require.Equal(t, tc.err, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.output, hours) + } + }) + } + + // Randomized tests + iterations := 10000 + maxCoinsLen := 300 + maxMaxCoins := 100000 + maxHours := 15000000 + coins := make([]uint64, maxCoinsLen) + for i := 0; i < iterations; i++ { + coinsLen := rand.Intn(maxCoinsLen) + 1 + + maxCoins := rand.Intn(maxMaxCoins) + 1 + + var totalCoins uint64 + for i := 0; i < coinsLen; i++ { + coins[i] = uint64(rand.Intn(maxCoins) + 1) + + var err error + totalCoins, err = coin.AddUint64(totalCoins, coins[i]) + require.NoError(t, err) + } + + hours := uint64(rand.Intn(maxHours)) + + output, err := DistributeCoinHoursProportional(coins[:coinsLen], hours) + require.NoError(t, err) + + require.Equal(t, coinsLen, len(output)) + + var totalHours uint64 + for _, h := range output { + if hours >= totalCoins { + require.NotEqual(t, uint64(0), h) + } + + var err error + totalHours, err = coin.AddUint64(totalHours, h) + require.NoError(t, err) + } + + require.Equal(t, hours, totalHours) + } +} diff --git a/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go b/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go new file mode 100755 index 0000000..1b28d60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/src/wallet/wallets.go @@ -0,0 +1,145 @@ +package wallet + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/skycoin/skycoin/src/cipher" + "github.com/skycoin/skycoin/src/util/file" +) + +// Wallets wallets map +type Wallets map[string]*Wallet + +// LoadWallets Loads all wallets contained in wallet dir. If any regular file in wallet +// dir fails to load, loading is aborted and error returned. Only files with +// extension WalletExt are considered. +func LoadWallets(dir string) (Wallets, error) { + // TODO -- don't load duplicate wallets. + // TODO -- save a last_modified value in wallets to decide which to load + entries, err := ioutil.ReadDir(dir) + if err != nil { + return nil, err + } + + wallets := Wallets{} + for _, e := range entries { + if e.Mode().IsRegular() { + name := e.Name() + if !strings.HasSuffix(name, WalletExt) { + continue + } + fullpath := filepath.Join(dir, name) + rw, err := LoadReadableWallet(fullpath) + if err != nil { + return nil, err + } + w, err := rw.ToWallet() + if err != nil { + return nil, err + } + logger.Infof("Loaded wallet from %s", fullpath) + w.setFilename(name) + wallets[name] = w + } + } + return wallets, nil +} + +func backupWltFile(src, dst string) error { //nolint: deadcode + if _, err := os.Stat(dst); err == nil { + return fmt.Errorf("%v file already exist", dst) + } + + b, err := ioutil.ReadFile(src) + if err != nil { + return err + } + + n, err := file.CopyFile(dst, bytes.NewBuffer(b)) + if err != nil { + return err + } + + // check if the content bytes are equal. + if n != int64(len(b)) { + return errors.New("copy file failed") + } + return nil +} + +// add add walet to current wallet +func (wlts Wallets) add(w *Wallet) error { + if _, dup := wlts[w.Filename()]; dup { + return ErrWalletNameConflict + } + + wlts[w.Filename()] = w + return nil +} + +// remove wallet of specific id +func (wlts Wallets) remove(id string) { + delete(wlts, id) +} + +// get returns wallet by wallet id +func (wlts Wallets) get(id string) (*Wallet, bool) { + if w, ok := wlts[id]; ok { + return w, true + } + return nil, false +} + +// set sets a wallet into the map +func (wlts Wallets) set(w *Wallet) { + wlts[w.Filename()] = w.clone() +} + +// NewAddresses creates num addresses in given wallet +func (wlts *Wallets) newAddresses(id string, num uint64) ([]cipher.Address, error) { + if w, ok := (*wlts)[id]; ok { + return w.GenerateAddresses(num) + } + return nil, fmt.Errorf("wallet: %v does not exist", id) +} + +// ToReadable converts Wallets to *ReadableWallet array +func (wlts Wallets) ToReadable() []*ReadableWallet { + var rw []*ReadableWallet + for _, w := range wlts { + rw = append(rw, NewReadableWallet(w)) + } + + sort.Slice(rw, func(i int, j int) bool { + return rw[i].time() < rw[j].time() + }) + return rw +} + +// Update updates the given wallet, return error if not exist +func (wlts Wallets) update(id string, updateFunc func(*Wallet) error) error { + w, ok := wlts[id] + if !ok { + return ErrWalletNotExist + } + + // Clone the wallet + cw := w.clone() + + // update the clone wallet, to avoid updateFunc interrupting the original wallet. + if err := updateFunc(cw); err != nil { + return err + } + + // Wipes secrets in old wallet + w.erase() + wlts[id] = cw + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/template/coin.template b/vendor/github.com/skycoin/skycoin/template/coin.template new file mode 100755 index 0000000..a21a9c9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/template/coin.template @@ -0,0 +1,82 @@ +package main + +import ( + _ "net/http/pprof" + "github.com/skycoin/skycoin/src/skycoin" + "github.com/skycoin/skycoin/src/util/logging" + "github.com/skycoin/skycoin/src/visor" +) + + +var ( + // Version of the node. Can be set by -ldflags + Version = "{{.Version}}" + // Commit ID. Can be set by -ldflags + Commit = "" + // Branch name. Can be set by -ldflags + Branch = "" + // ConfigMode (possible values are "", "STANDALONE_CLIENT"). + // This is used to change the default configuration. + // Can be set by -ldflags + ConfigMode = "" + + logger = logging.MustGetLogger("main") + + // GenesisSignatureStr hex string of genesis signature + GenesisSignatureStr = "{{.GenesisSignatureStr}}" + // GenesisAddressStr genesis address string + GenesisAddressStr = "{{.GenesisAddressStr}}" + // BlockchainPubkeyStr pubic key string + BlockchainPubkeyStr = "{{.BlockchainPubkeyStr}}" + // BlockchainSeckeyStr empty private key string + BlockchainSeckeyStr = "{{.BlockchainSeckeyStr}}" + + // GenesisTimestamp genesis block create unix time + GenesisTimestamp uint64 = {{.GenesisTimestamp}} + // GenesisCoinVolume represents the coin capacity + GenesisCoinVolume uint64 = {{.GenesisCoinVolume}} + + // DefaultConnections the default trust node addresses + DefaultConnections = []string{ + {{- range $index, $address := .DefaultConnections}} + "{{$address -}}", + {{- end}} + } +) + +func main() { + // get node config + nodeConfig := skycoin.NewNodeConfig(ConfigMode, skycoin.NodeParameters{ + GenesisSignatureStr: GenesisSignatureStr, + GenesisAddressStr: GenesisAddressStr, + GenesisCoinVolume: GenesisCoinVolume, + GenesisTimestamp: GenesisTimestamp, + BlockchainPubkeyStr: BlockchainPubkeyStr, + BlockchainSeckeyStr: BlockchainSeckeyStr, + DefaultConnections: DefaultConnections, + PeerListURL: "{{.PeerListURL}}", + Port: {{.Port}}, + WebInterfacePort: {{.WebInterfacePort}}, + DataDirectory: "{{.DataDirectory}}", + ProfileCPUFile: "{{.ProfileCPUFile}}", + }) + + // create a new fiber coin instance + coin := skycoin.NewCoin( + skycoin.Config{ + Node: *nodeConfig, + Build: visor.BuildInfo{ + Version: Version, + Commit: Commit, + Branch: Branch, + }, + }, + logger, + ) + + // parse config values + coin.ParseConfig() + + // run fiber coin node + coin.Run() +} diff --git a/vendor/github.com/skycoin/skycoin/template/visor.template b/vendor/github.com/skycoin/skycoin/template/visor.template new file mode 100755 index 0000000..6c9a2fe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/template/visor.template @@ -0,0 +1,33 @@ +package visor + +/* +* CODE GENERATED AUTOMATICALLY WITH FIBER COIN CREATOR +* AVOID EDITING THIS MANUALLY +*/ + +const ( + // MaxCoinSupply is the maximum supply of coins + MaxCoinSupply uint64 = {{.MaxCoinSupply}} + // DistributionAddressesTotal is the number of distribution addresses + DistributionAddressesTotal uint64 = {{.DistributionAddressesTotal}} + // DistributionAddressInitialBalance is the initial balance of each distribution address + DistributionAddressInitialBalance uint64 = MaxCoinSupply / DistributionAddressesTotal + // InitialUnlockedCount is the initial number of unlocked addresses + InitialUnlockedCount uint64 = {{.InitialUnlockedCount}} + // UnlockAddressRate is the number of addresses to unlock per unlock time interval + UnlockAddressRate uint64 = {{.UnlockAddressRate}} + // UnlockTimeInterval is the distribution address unlock time interval, measured in seconds + // Once the InitialUnlockedCount is exhausted, + // UnlockAddressRate addresses will be unlocked per UnlockTimeInterval + UnlockTimeInterval uint64 = {{.UnlockTimeInterval}} // in seconds + // MaxDropletPrecision represents the decimal precision of droplets + MaxDropletPrecision uint64 = {{.MaxDropletPrecision}} + //DefaultMaxBlockSize is max block size + DefaultMaxBlockSize int = {{.DefaultMaxBlockSize}} // in bytes +) + +var distributionAddresses = [DistributionAddressesTotal]string{ +{{- range $index, $address := .DistributionAddresses}} + "{{$address -}}", +{{- end}} +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.gitignore new file mode 100755 index 0000000..1377554 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.gitignore @@ -0,0 +1 @@ +*.swp diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml new file mode 100755 index 0000000..d2b67f6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/.travis.yml @@ -0,0 +1,6 @@ +language: go + +go: + - 1.7 + - 1.8 + - tip diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md new file mode 100755 index 0000000..cdbca19 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CODE_OF_CONDUCT.md @@ -0,0 +1,75 @@ +--- +layout: code-of-conduct +version: v1.0 +--- + +This code of conduct outlines our expectations for participants within the **NYTimes/gziphandler** community, as well as steps to reporting unacceptable behavior. We are committed to providing a welcoming and inspiring community for all and expect our code of conduct to be honored. Anyone who violates this code of conduct may be banned from the community. + +Our open source community strives to: + +* **Be friendly and patient.** +* **Be welcoming**: We strive to be a community that welcomes and supports people of all backgrounds and identities. This includes, but is not limited to members of any race, ethnicity, culture, national origin, colour, immigration status, social and economic class, educational level, sex, sexual orientation, gender identity and expression, age, size, family status, political belief, religion, and mental and physical ability. +* **Be considerate**: Your work will be used by other people, and you in turn will depend on the work of others. Any decision you take will affect users and colleagues, and you should take those consequences into account when making decisions. Remember that we're a world-wide community, so you might not be communicating in someone else's primary language. +* **Be respectful**: Not all of us will agree all the time, but disagreement is no excuse for poor behavior and poor manners. We might all experience some frustration now and then, but we cannot allow that frustration to turn into a personal attack. It’s important to remember that a community where people feel uncomfortable or threatened is not a productive one. +* **Be careful in the words that we choose**: we are a community of professionals, and we conduct ourselves professionally. Be kind to others. Do not insult or put down other participants. Harassment and other exclusionary behavior aren't acceptable. +* **Try to understand why we disagree**: Disagreements, both social and technical, happen all the time. It is important that we resolve disagreements and differing views constructively. Remember that we’re different. The strength of our community comes from its diversity, people from a wide range of backgrounds. Different people have different perspectives on issues. Being unable to understand why someone holds a viewpoint doesn’t mean that they’re wrong. Don’t forget that it is human to err and blaming each other doesn’t get us anywhere. Instead, focus on helping to resolve issues and learning from mistakes. + +## Definitions + +Harassment includes, but is not limited to: + +- Offensive comments related to gender, gender identity and expression, sexual orientation, disability, mental illness, neuro(a)typicality, physical appearance, body size, race, age, regional discrimination, political or religious affiliation +- Unwelcome comments regarding a person’s lifestyle choices and practices, including those related to food, health, parenting, drugs, and employment +- Deliberate misgendering. This includes deadnaming or persistently using a pronoun that does not correctly reflect a person's gender identity. You must address people by the name they give you when not addressing them by their username or handle +- Physical contact and simulated physical contact (eg, textual descriptions like “*hug*” or “*backrub*”) without consent or after a request to stop +- Threats of violence, both physical and psychological +- Incitement of violence towards any individual, including encouraging a person to commit suicide or to engage in self-harm +- Deliberate intimidation +- Stalking or following +- Harassing photography or recording, including logging online activity for harassment purposes +- Sustained disruption of discussion +- Unwelcome sexual attention, including gratuitous or off-topic sexual images or behaviour +- Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others +- Continued one-on-one communication after requests to cease +- Deliberate “outing” of any aspect of a person’s identity without their consent except as necessary to protect others from intentional abuse +- Publication of non-harassing private communication + +Our open source community prioritizes marginalized people’s safety over privileged people’s comfort. We will not act on complaints regarding: + +- ‘Reverse’ -isms, including ‘reverse racism,’ ‘reverse sexism,’ and ‘cisphobia’ +- Reasonable communication of boundaries, such as “leave me alone,” “go away,” or “I’m not discussing this with you” +- Refusal to explain or debate social justice concepts +- Communicating in a ‘tone’ you don’t find congenial +- Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions + + +### Diversity Statement + +We encourage everyone to participate and are committed to building a community for all. Although we will fail at times, we seek to treat everyone both as fairly and equally as possible. Whenever a participant has made a mistake, we expect them to take responsibility for it. If someone has been harmed or offended, it is our responsibility to listen carefully and respectfully, and do our best to right the wrong. + +Although this list cannot be exhaustive, we explicitly honor diversity in age, gender, gender identity or expression, culture, ethnicity, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected +characteristics above, including participants with disabilities. + +### Reporting Issues + +If you experience or witness unacceptable behavior—or have any other concerns—please report it by contacting us via **code@nytimes.com**. All reports will be handled with discretion. In your report please include: + +- Your contact information. +- Names (real, nicknames, or pseudonyms) of any individuals involved. If there are additional witnesses, please +include them as well. Your account of what occurred, and if you believe the incident is ongoing. If there is a publicly available record (e.g. a mailing list archive or a public IRC logger), please include a link. +- Any additional information that may be helpful. + +After filing a report, a representative will contact you personally, review the incident, follow up with any additional questions, and make a decision as to how to respond. If the person who is harassing you is part of the response team, they will recuse themselves from handling your incident. If the complaint originates from a member of the response team, it will be handled by a different member of the response team. We will respect confidentiality requests for the purpose of protecting victims of abuse. + +### Attribution & Acknowledgements + +We all stand on the shoulders of giants across many open source communities. We'd like to thank the communities and projects that established code of conducts and diversity statements as our inspiration: + +* [Django](https://www.djangoproject.com/conduct/reporting/) +* [Python](https://www.python.org/community/diversity/) +* [Ubuntu](http://www.ubuntu.com/about/about-ubuntu/conduct) +* [Contributor Covenant](http://contributor-covenant.org/) +* [Geek Feminism](http://geekfeminism.org/about/code-of-conduct/) +* [Citizen Code of Conduct](http://citizencodeofconduct.org/) + +This Code of Conduct was based on https://github.com/todogroup/opencodeofconduct diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md new file mode 100755 index 0000000..b89a9eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/CONTRIBUTING.md @@ -0,0 +1,30 @@ +# Contributing to NYTimes/gziphandler + +This is an open source project started by handful of developers at The New York Times and open to the entire Go community. + +We really appreciate your help! + +## Filing issues + +When filing an issue, make sure to answer these five questions: + +1. What version of Go are you using (`go version`)? +2. What operating system and processor architecture are you using? +3. What did you do? +4. What did you expect to see? +5. What did you see instead? + +## Contributing code + +Before submitting changes, please follow these guidelines: + +1. Check the open issues and pull requests for existing discussions. +2. Open an issue to discuss a new feature. +3. Write tests. +4. Make sure code follows the ['Go Code Review Comments'](https://github.com/golang/go/wiki/CodeReviewComments). +5. Make sure your changes pass `go test`. +6. Make sure the entire test suite passes locally and on Travis CI. +7. Open a Pull Request. +8. [Squash your commits](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html) after receiving feedback and add a [great commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). + +Unless otherwise noted, the gziphandler source files are distributed under the Apache 2.0-style license found in the LICENSE.md file. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/LICENSE new file mode 100755 index 0000000..df6192d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/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 2016-2017 The New York Times Company + + 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/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/README.md new file mode 100755 index 0000000..6d72460 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/README.md @@ -0,0 +1,52 @@ +Gzip Handler +============ + +This is a tiny Go package which wraps HTTP handlers to transparently gzip the +response body, for clients which support it. Although it's usually simpler to +leave that to a reverse proxy (like nginx or Varnish), this package is useful +when that's undesirable. + + +## Usage + +Call `GzipHandler` with any handler (an object which implements the +`http.Handler` interface), and it'll return a new handler which gzips the +response. For example: + +```go +package main + +import ( + "io" + "net/http" + "github.com/NYTimes/gziphandler" +) + +func main() { + withoutGz := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + io.WriteString(w, "Hello, World") + }) + + withGz := gziphandler.GzipHandler(withoutGz) + + http.Handle("/", withGz) + http.ListenAndServe("0.0.0.0:8000", nil) +} +``` + + +## Documentation + +The docs can be found at [godoc.org][docs], as usual. + + +## License + +[Apache 2.0][license]. + + + + +[docs]: https://godoc.org/github.com/nytimes/gziphandler +[license]: https://github.com/nytimes/gziphandler/blob/master/LICENSE.md diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go new file mode 100755 index 0000000..f91dcfa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip.go @@ -0,0 +1,429 @@ +package gziphandler + +import ( + "bufio" + "compress/gzip" + "fmt" + "io" + "net" + "net/http" + "strconv" + "strings" + "sync" +) + +const ( + vary = "Vary" + acceptEncoding = "Accept-Encoding" + contentEncoding = "Content-Encoding" + contentType = "Content-Type" + contentLength = "Content-Length" +) + +type codings map[string]float64 + +const ( + // DefaultQValue is the default qvalue to assign to an encoding if no explicit qvalue is set. + // This is actually kind of ambiguous in RFC 2616, so hopefully it's correct. + // The examples seem to indicate that it is. + DefaultQValue = 1.0 + + // 1500 bytes is the MTU size for the internet since that is the largest size allowed at the network layer. + // If you take a file that is 1300 bytes and compress it to 800 bytes, it’s still transmitted in that same 1500 byte packet regardless, so you’ve gained nothing. + // That being the case, you should restrict the gzip compression to files with a size greater than a single packet, 1400 bytes (1.4KB) is a safe value. + DefaultMinSize = 1400 +) + +// gzipWriterPools stores a sync.Pool for each compression level for reuse of +// gzip.Writers. Use poolIndex to covert a compression level to an index into +// gzipWriterPools. +var gzipWriterPools [gzip.BestCompression - gzip.BestSpeed + 2]*sync.Pool + +func init() { + for i := gzip.BestSpeed; i <= gzip.BestCompression; i++ { + addLevelPool(i) + } + addLevelPool(gzip.DefaultCompression) +} + +// poolIndex maps a compression level to its index into gzipWriterPools. It +// assumes that level is a valid gzip compression level. +func poolIndex(level int) int { + // gzip.DefaultCompression == -1, so we need to treat it special. + if level == gzip.DefaultCompression { + return gzip.BestCompression - gzip.BestSpeed + 1 + } + return level - gzip.BestSpeed +} + +func addLevelPool(level int) { + gzipWriterPools[poolIndex(level)] = &sync.Pool{ + New: func() interface{} { + // NewWriterLevel only returns error on a bad level, we are guaranteeing + // that this will be a valid level so it is okay to ignore the returned + // error. + w, _ := gzip.NewWriterLevel(nil, level) + return w + }, + } +} + +// GzipResponseWriter provides an http.ResponseWriter interface, which gzips +// bytes before writing them to the underlying response. This doesn't close the +// writers, so don't forget to do that. +// It can be configured to skip response smaller than minSize. +type GzipResponseWriter struct { + http.ResponseWriter + index int // Index for gzipWriterPools. + gw *gzip.Writer + + code int // Saves the WriteHeader value. + + minSize int // Specifed the minimum response size to gzip. If the response length is bigger than this value, it is compressed. + buf []byte // Holds the first part of the write before reaching the minSize or the end of the write. + + contentTypes []string // Only compress if the response is one of these content-types. All are accepted if empty. +} + +type GzipResponseWriterWithCloseNotify struct { + *GzipResponseWriter +} + +func (w GzipResponseWriterWithCloseNotify) CloseNotify() <-chan bool { + return w.ResponseWriter.(http.CloseNotifier).CloseNotify() +} + +// Write appends data to the gzip writer. +func (w *GzipResponseWriter) Write(b []byte) (int, error) { + // If content type is not set. + if _, ok := w.Header()[contentType]; !ok { + // It infer it from the uncompressed body. + w.Header().Set(contentType, http.DetectContentType(b)) + } + + // GZIP responseWriter is initialized. Use the GZIP responseWriter. + if w.gw != nil { + n, err := w.gw.Write(b) + return n, err + } + + // Save the write into a buffer for later use in GZIP responseWriter (if content is long enough) or at close with regular responseWriter. + // On the first write, w.buf changes from nil to a valid slice + w.buf = append(w.buf, b...) + + // If the global writes are bigger than the minSize and we're about to write + // a response containing a content type we want to handle, enable + // compression. + if len(w.buf) >= w.minSize && handleContentType(w.contentTypes, w) && w.Header().Get(contentEncoding) == "" { + err := w.startGzip() + if err != nil { + return 0, err + } + } + + return len(b), nil +} + +// startGzip initialize any GZIP specific informations. +func (w *GzipResponseWriter) startGzip() error { + + // Set the GZIP header. + w.Header().Set(contentEncoding, "gzip") + + // if the Content-Length is already set, then calls to Write on gzip + // will fail to set the Content-Length header since its already set + // See: https://github.com/golang/go/issues/14975. + w.Header().Del(contentLength) + + // Write the header to gzip response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + + // Initialize the GZIP response. + w.init() + + // Flush the buffer into the gzip response. + n, err := w.gw.Write(w.buf) + + // This should never happen (per io.Writer docs), but if the write didn't + // accept the entire buffer but returned no specific error, we have no clue + // what's going on, so abort just to be safe. + if err == nil && n < len(w.buf) { + return io.ErrShortWrite + } + + w.buf = nil + return err +} + +// WriteHeader just saves the response code until close or GZIP effective writes. +func (w *GzipResponseWriter) WriteHeader(code int) { + if w.code == 0 { + w.code = code + } +} + +// init graps a new gzip writer from the gzipWriterPool and writes the correct +// content encoding header. +func (w *GzipResponseWriter) init() { + // Bytes written during ServeHTTP are redirected to this gzip writer + // before being written to the underlying response. + gzw := gzipWriterPools[w.index].Get().(*gzip.Writer) + gzw.Reset(w.ResponseWriter) + w.gw = gzw +} + +// Close will close the gzip.Writer and will put it back in the gzipWriterPool. +func (w *GzipResponseWriter) Close() error { + if w.gw == nil { + // Gzip not trigged yet, write out regular response. + if w.code != 0 { + w.ResponseWriter.WriteHeader(w.code) + } + if w.buf != nil { + _, writeErr := w.ResponseWriter.Write(w.buf) + // Returns the error if any at write. + if writeErr != nil { + return fmt.Errorf("gziphandler: write to regular responseWriter at close gets error: %q", writeErr.Error()) + } + } + return nil + } + + err := w.gw.Close() + gzipWriterPools[w.index].Put(w.gw) + w.gw = nil + return err +} + +// Flush flushes the underlying *gzip.Writer and then the underlying +// http.ResponseWriter if it is an http.Flusher. This makes GzipResponseWriter +// an http.Flusher. +func (w *GzipResponseWriter) Flush() { + if w.gw == nil { + // Only flush once startGzip has been called. + // + // Flush is thus a no-op until the written body + // exceeds minSize. + return + } + + w.gw.Flush() + + if fw, ok := w.ResponseWriter.(http.Flusher); ok { + fw.Flush() + } +} + +// Hijack implements http.Hijacker. If the underlying ResponseWriter is a +// Hijacker, its Hijack method is returned. Otherwise an error is returned. +func (w *GzipResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := w.ResponseWriter.(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, fmt.Errorf("http.Hijacker interface is not supported") +} + +// verify Hijacker interface implementation +var _ http.Hijacker = &GzipResponseWriter{} + +// MustNewGzipLevelHandler behaves just like NewGzipLevelHandler except that in +// an error case it panics rather than returning an error. +func MustNewGzipLevelHandler(level int) func(http.Handler) http.Handler { + wrap, err := NewGzipLevelHandler(level) + if err != nil { + panic(err) + } + return wrap +} + +// NewGzipLevelHandler returns a wrapper function (often known as middleware) +// which can be used to wrap an HTTP handler to transparently gzip the response +// body if the client supports it (via the Accept-Encoding header). Responses will +// be encoded at the given gzip compression level. An error will be returned only +// if an invalid gzip compression level is given, so if one can ensure the level +// is valid, the returned error can be safely ignored. +func NewGzipLevelHandler(level int) (func(http.Handler) http.Handler, error) { + return NewGzipLevelAndMinSize(level, DefaultMinSize) +} + +// NewGzipLevelAndMinSize behave as NewGzipLevelHandler except it let the caller +// specify the minimum size before compression. +func NewGzipLevelAndMinSize(level, minSize int) (func(http.Handler) http.Handler, error) { + return GzipHandlerWithOpts(CompressionLevel(level), MinSize(minSize)) +} + +func GzipHandlerWithOpts(opts ...option) (func(http.Handler) http.Handler, error) { + c := &config{ + level: gzip.DefaultCompression, + minSize: DefaultMinSize, + } + + for _, o := range opts { + o(c) + } + + if err := c.validate(); err != nil { + return nil, err + } + + return func(h http.Handler) http.Handler { + index := poolIndex(c.level) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Add(vary, acceptEncoding) + if acceptsGzip(r) { + gw := &GzipResponseWriter{ + ResponseWriter: w, + index: index, + minSize: c.minSize, + contentTypes: c.contentTypes, + } + defer gw.Close() + + if _, ok := w.(http.CloseNotifier); ok { + gwcn := GzipResponseWriterWithCloseNotify{gw} + h.ServeHTTP(gwcn, r) + } else { + h.ServeHTTP(gw, r) + } + + } else { + h.ServeHTTP(w, r) + } + }) + }, nil +} + +// Used for functional configuration. +type config struct { + minSize int + level int + contentTypes []string +} + +func (c *config) validate() error { + if c.level != gzip.DefaultCompression && (c.level < gzip.BestSpeed || c.level > gzip.BestCompression) { + return fmt.Errorf("invalid compression level requested: %d", c.level) + } + + if c.minSize < 0 { + return fmt.Errorf("minimum size must be more than zero") + } + + return nil +} + +type option func(c *config) + +func MinSize(size int) option { + return func(c *config) { + c.minSize = size + } +} + +func CompressionLevel(level int) option { + return func(c *config) { + c.level = level + } +} + +func ContentTypes(types []string) option { + return func(c *config) { + c.contentTypes = []string{} + for _, v := range types { + c.contentTypes = append(c.contentTypes, strings.ToLower(v)) + } + } +} + +// GzipHandler wraps an HTTP handler, to transparently gzip the response body if +// the client supports it (via the Accept-Encoding header). This will compress at +// the default compression level. +func GzipHandler(h http.Handler) http.Handler { + wrapper, _ := NewGzipLevelHandler(gzip.DefaultCompression) + return wrapper(h) +} + +// acceptsGzip returns true if the given HTTP request indicates that it will +// accept a gzipped response. +func acceptsGzip(r *http.Request) bool { + acceptedEncodings, _ := parseEncodings(r.Header.Get(acceptEncoding)) + return acceptedEncodings["gzip"] > 0.0 +} + +// returns true if we've been configured to compress the specific content type. +func handleContentType(contentTypes []string, w http.ResponseWriter) bool { + // If contentTypes is empty we handle all content types. + if len(contentTypes) == 0 { + return true + } + + ct := strings.ToLower(w.Header().Get(contentType)) + for _, c := range contentTypes { + if c == ct { + return true + } + } + + return false +} + +// parseEncodings attempts to parse a list of codings, per RFC 2616, as might +// appear in an Accept-Encoding header. It returns a map of content-codings to +// quality values, and an error containing the errors encountered. It's probably +// safe to ignore those, because silently ignoring errors is how the internet +// works. +// +// See: http://tools.ietf.org/html/rfc2616#section-14.3. +func parseEncodings(s string) (codings, error) { + c := make(codings) + var e []string + + for _, ss := range strings.Split(s, ",") { + coding, qvalue, err := parseCoding(ss) + + if err != nil { + e = append(e, err.Error()) + } else { + c[coding] = qvalue + } + } + + // TODO (adammck): Use a proper multi-error struct, so the individual errors + // can be extracted if anyone cares. + if len(e) > 0 { + return c, fmt.Errorf("errors while parsing encodings: %s", strings.Join(e, ", ")) + } + + return c, nil +} + +// parseCoding parses a single conding (content-coding with an optional qvalue), +// as might appear in an Accept-Encoding header. It attempts to forgive minor +// formatting errors. +func parseCoding(s string) (coding string, qvalue float64, err error) { + for n, part := range strings.Split(s, ";") { + part = strings.TrimSpace(part) + qvalue = DefaultQValue + + if n == 0 { + coding = strings.ToLower(part) + } else if strings.HasPrefix(part, "q=") { + qvalue, err = strconv.ParseFloat(strings.TrimPrefix(part, "q="), 64) + + if qvalue < 0.0 { + qvalue = 0.0 + } else if qvalue > 1.0 { + qvalue = 1.0 + } + } + } + + if coding == "" { + err = fmt.Errorf("empty content-coding") + } + + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go new file mode 100755 index 0000000..fa9665b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/NYTimes/gziphandler/gzip_go18.go @@ -0,0 +1,43 @@ +// +build go1.8 + +package gziphandler + +import "net/http" + +// Push initiates an HTTP/2 server push. +// Push returns ErrNotSupported if the client has disabled push or if push +// is not supported on the underlying connection. +func (w *GzipResponseWriter) Push(target string, opts *http.PushOptions) error { + pusher, ok := w.ResponseWriter.(http.Pusher) + if ok && pusher != nil { + return pusher.Push(target, setAcceptEncodingForPushOptions(opts)) + } + return http.ErrNotSupported +} + +// setAcceptEncodingForPushOptions sets "Accept-Encoding" : "gzip" for PushOptions without overriding existing headers. +func setAcceptEncodingForPushOptions(opts *http.PushOptions) *http.PushOptions { + + if opts == nil { + opts = &http.PushOptions{ + Header: http.Header{ + acceptEncoding: []string{"gzip"}, + }, + } + return opts + } + + if opts.Header == nil { + opts.Header = http.Header{ + acceptEncoding: []string{"gzip"}, + } + return opts + } + + if encoding := opts.Header.Get(acceptEncoding); encoding == "" { + opts.Header.Add(acceptEncoding, "gzip") + return opts + } + + return opts +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/.gitignore new file mode 100755 index 0000000..c7bd2b7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/.gitignore @@ -0,0 +1,4 @@ +*.prof +*.test +*.swp +/bin/ diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/LICENSE new file mode 100755 index 0000000..004e77f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Ben 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/skycoin/skycoin/vendor/github.com/boltdb/bolt/Makefile b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/Makefile new file mode 100755 index 0000000..e035e63 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/Makefile @@ -0,0 +1,18 @@ +BRANCH=`git rev-parse --abbrev-ref HEAD` +COMMIT=`git rev-parse --short HEAD` +GOLDFLAGS="-X main.branch $(BRANCH) -X main.commit $(COMMIT)" + +default: build + +race: + @go test -v -race -test.run="TestSimulate_(100op|1000op)" + +# go get github.com/kisielk/errcheck +errcheck: + @errcheck -ignorepkg=bytes -ignore=os:Remove github.com/boltdb/bolt + +test: + @go test -v -cover . + @go test -v ./cmd/bolt + +.PHONY: fmt test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/README.md new file mode 100755 index 0000000..7d43a15 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/README.md @@ -0,0 +1,916 @@ +Bolt [![Coverage Status](https://coveralls.io/repos/boltdb/bolt/badge.svg?branch=master)](https://coveralls.io/r/boltdb/bolt?branch=master) [![GoDoc](https://godoc.org/github.com/boltdb/bolt?status.svg)](https://godoc.org/github.com/boltdb/bolt) ![Version](https://img.shields.io/badge/version-1.2.1-green.svg) +==== + +Bolt is a pure Go key/value store inspired by [Howard Chu's][hyc_symas] +[LMDB project][lmdb]. The goal of the project is to provide a simple, +fast, and reliable database for projects that don't require a full database +server such as Postgres or MySQL. + +Since Bolt is meant to be used as such a low-level piece of functionality, +simplicity is key. The API will be small and only focus on getting values +and setting values. That's it. + +[hyc_symas]: https://twitter.com/hyc_symas +[lmdb]: http://symas.com/mdb/ + +## Project Status + +Bolt is stable, the API is fixed, and the file format is fixed. Full unit +test coverage and randomized black box testing are used to ensure database +consistency and thread safety. Bolt is currently used in high-load production +environments serving databases as large as 1TB. Many companies such as +Shopify and Heroku use Bolt-backed services every day. + +## Table of Contents + +- [Getting Started](#getting-started) + - [Installing](#installing) + - [Opening a database](#opening-a-database) + - [Transactions](#transactions) + - [Read-write transactions](#read-write-transactions) + - [Read-only transactions](#read-only-transactions) + - [Batch read-write transactions](#batch-read-write-transactions) + - [Managing transactions manually](#managing-transactions-manually) + - [Using buckets](#using-buckets) + - [Using key/value pairs](#using-keyvalue-pairs) + - [Autoincrementing integer for the bucket](#autoincrementing-integer-for-the-bucket) + - [Iterating over keys](#iterating-over-keys) + - [Prefix scans](#prefix-scans) + - [Range scans](#range-scans) + - [ForEach()](#foreach) + - [Nested buckets](#nested-buckets) + - [Database backups](#database-backups) + - [Statistics](#statistics) + - [Read-Only Mode](#read-only-mode) + - [Mobile Use (iOS/Android)](#mobile-use-iosandroid) +- [Resources](#resources) +- [Comparison with other databases](#comparison-with-other-databases) + - [Postgres, MySQL, & other relational databases](#postgres-mysql--other-relational-databases) + - [LevelDB, RocksDB](#leveldb-rocksdb) + - [LMDB](#lmdb) +- [Caveats & Limitations](#caveats--limitations) +- [Reading the Source](#reading-the-source) +- [Other Projects Using Bolt](#other-projects-using-bolt) + +## Getting Started + +### Installing + +To start using Bolt, install Go and run `go get`: + +```sh +$ go get github.com/boltdb/bolt/... +``` + +This will retrieve the library and install the `bolt` command line utility into +your `$GOBIN` path. + + +### Opening a database + +The top-level object in Bolt is a `DB`. It is represented as a single file on +your disk and represents a consistent snapshot of your data. + +To open your database, simply use the `bolt.Open()` function: + +```go +package main + +import ( + "log" + + "github.com/boltdb/bolt" +) + +func main() { + // Open the my.db data file in your current directory. + // It will be created if it doesn't exist. + db, err := bolt.Open("my.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + ... +} +``` + +Please note that Bolt obtains a file lock on the data file so multiple processes +cannot open the same database at the same time. Opening an already open Bolt +database will cause it to hang until the other process closes it. To prevent +an indefinite wait you can pass a timeout option to the `Open()` function: + +```go +db, err := bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second}) +``` + + +### Transactions + +Bolt allows only one read-write transaction at a time but allows as many +read-only transactions as you want at a time. Each transaction has a consistent +view of the data as it existed when the transaction started. + +Individual transactions and all objects created from them (e.g. buckets, keys) +are not thread safe. To work with data in multiple goroutines you must start +a transaction for each one or use locking to ensure only one goroutine accesses +a transaction at a time. Creating transaction from the `DB` is thread safe. + +Read-only transactions and read-write transactions should not depend on one +another and generally shouldn't be opened simultaneously in the same goroutine. +This can cause a deadlock as the read-write transaction needs to periodically +re-map the data file but it cannot do so while a read-only transaction is open. + + +#### Read-write transactions + +To start a read-write transaction, you can use the `DB.Update()` function: + +```go +err := db.Update(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Inside the closure, you have a consistent view of the database. You commit the +transaction by returning `nil` at the end. You can also rollback the transaction +at any point by returning an error. All database operations are allowed inside +a read-write transaction. + +Always check the return error as it will report any disk failures that can cause +your transaction to not complete. If you return an error within your closure +it will be passed through. + + +#### Read-only transactions + +To start a read-only transaction, you can use the `DB.View()` function: + +```go +err := db.View(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +You also get a consistent view of the database within this closure, however, +no mutating operations are allowed within a read-only transaction. You can only +retrieve buckets, retrieve values, and copy the database within a read-only +transaction. + + +#### Batch read-write transactions + +Each `DB.Update()` waits for disk to commit the writes. This overhead +can be minimized by combining multiple updates with the `DB.Batch()` +function: + +```go +err := db.Batch(func(tx *bolt.Tx) error { + ... + return nil +}) +``` + +Concurrent Batch calls are opportunistically combined into larger +transactions. Batch is only useful when there are multiple goroutines +calling it. + +The trade-off is that `Batch` can call the given +function multiple times, if parts of the transaction fail. The +function must be idempotent and side effects must take effect only +after a successful return from `DB.Batch()`. + +For example: don't display messages from inside the function, instead +set variables in the enclosing scope: + +```go +var id uint64 +err := db.Batch(func(tx *bolt.Tx) error { + // Find last key in bucket, decode as bigendian uint64, increment + // by one, encode back to []byte, and add new key. + ... + id = newValue + return nil +}) +if err != nil { + return ... +} +fmt.Println("Allocated ID %d", id) +``` + + +#### Managing transactions manually + +The `DB.View()` and `DB.Update()` functions are wrappers around the `DB.Begin()` +function. These helper functions will start the transaction, execute a function, +and then safely close your transaction if an error is returned. This is the +recommended way to use Bolt transactions. + +However, sometimes you may want to manually start and end your transactions. +You can use the `DB.Begin()` function directly but **please** be sure to close +the transaction. + +```go +// Start a writable transaction. +tx, err := db.Begin(true) +if err != nil { + return err +} +defer tx.Rollback() + +// Use the transaction... +_, err := tx.CreateBucket([]byte("MyBucket")) +if err != nil { + return err +} + +// Commit the transaction and check for error. +if err := tx.Commit(); err != nil { + return err +} +``` + +The first argument to `DB.Begin()` is a boolean stating if the transaction +should be writable. + + +### Using buckets + +Buckets are collections of key/value pairs within the database. All keys in a +bucket must be unique. You can create a bucket using the `DB.CreateBucket()` +function: + +```go +db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucket([]byte("MyBucket")) + if err != nil { + return fmt.Errorf("create bucket: %s", err) + } + return nil +}) +``` + +You can also create a bucket only if it doesn't exist by using the +`Tx.CreateBucketIfNotExists()` function. It's a common pattern to call this +function for all your top-level buckets after you open your database so you can +guarantee that they exist for future transactions. + +To delete a bucket, simply call the `Tx.DeleteBucket()` function. + + +### Using key/value pairs + +To save a key/value pair to a bucket, use the `Bucket.Put()` function: + +```go +db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + err := b.Put([]byte("answer"), []byte("42")) + return err +}) +``` + +This will set the value of the `"answer"` key to `"42"` in the `MyBucket` +bucket. To retrieve this value, we can use the `Bucket.Get()` function: + +```go +db.View(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("MyBucket")) + v := b.Get([]byte("answer")) + fmt.Printf("The answer is: %s\n", v) + return nil +}) +``` + +The `Get()` function does not return an error because its operation is +guaranteed to work (unless there is some kind of system failure). If the key +exists then it will return its byte slice value. If it doesn't exist then it +will return `nil`. It's important to note that you can have a zero-length value +set to a key which is different than the key not existing. + +Use the `Bucket.Delete()` function to delete a key from the bucket. + +Please note that values returned from `Get()` are only valid while the +transaction is open. If you need to use a value outside of the transaction +then you must use `copy()` to copy it to another byte slice. + + +### Autoincrementing integer for the bucket +By using the `NextSequence()` function, you can let Bolt determine a sequence +which can be used as the unique identifier for your key/value pairs. See the +example below. + +```go +// CreateUser saves u to the store. The new user ID is set on u once the data is persisted. +func (s *Store) CreateUser(u *User) error { + return s.db.Update(func(tx *bolt.Tx) error { + // Retrieve the users bucket. + // This should be created when the DB is first opened. + b := tx.Bucket([]byte("users")) + + // Generate ID for the user. + // This returns an error only if the Tx is closed or not writeable. + // That can't happen in an Update() call so I ignore the error check. + id, _ := b.NextSequence() + u.ID = int(id) + + // Marshal user data into bytes. + buf, err := json.Marshal(u) + if err != nil { + return err + } + + // Persist bytes to users bucket. + return b.Put(itob(u.ID), buf) + }) +} + +// itob returns an 8-byte big endian representation of v. +func itob(v int) []byte { + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, uint64(v)) + return b +} + +type User struct { + ID int + ... +} +``` + +### Iterating over keys + +Bolt stores its keys in byte-sorted order within a bucket. This makes sequential +iteration over these keys extremely fast. To iterate over keys we'll use a +`Cursor`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + c := b.Cursor() + + for k, v := c.First(); k != nil; k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +The cursor allows you to move to a specific point in the list of keys and move +forward or backward through the keys one at a time. + +The following functions are available on the cursor: + +``` +First() Move to the first key. +Last() Move to the last key. +Seek() Move to a specific key. +Next() Move to the next key. +Prev() Move to the previous key. +``` + +Each of those functions has a return signature of `(key []byte, value []byte)`. +When you have iterated to the end of the cursor then `Next()` will return a +`nil` key. You must seek to a position using `First()`, `Last()`, or `Seek()` +before calling `Next()` or `Prev()`. If you do not seek to a position then +these functions will return a `nil` key. + +During iteration, if the key is non-`nil` but the value is `nil`, that means +the key refers to a bucket rather than a value. Use `Bucket.Bucket()` to +access the sub-bucket. + + +#### Prefix scans + +To iterate over a key prefix, you can combine `Seek()` and `bytes.HasPrefix()`: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + c := tx.Bucket([]byte("MyBucket")).Cursor() + + prefix := []byte("1234") + for k, v := c.Seek(prefix); k != nil && bytes.HasPrefix(k, prefix); k, v = c.Next() { + fmt.Printf("key=%s, value=%s\n", k, v) + } + + return nil +}) +``` + +#### Range scans + +Another common use case is scanning over a range such as a time range. If you +use a sortable time encoding such as RFC3339 then you can query a specific +date range like this: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume our events bucket exists and has RFC3339 encoded time keys. + c := tx.Bucket([]byte("Events")).Cursor() + + // Our time range spans the 90's decade. + min := []byte("1990-01-01T00:00:00Z") + max := []byte("2000-01-01T00:00:00Z") + + // Iterate over the 90's. + for k, v := c.Seek(min); k != nil && bytes.Compare(k, max) <= 0; k, v = c.Next() { + fmt.Printf("%s: %s\n", k, v) + } + + return nil +}) +``` + +Note that, while RFC3339 is sortable, the Golang implementation of RFC3339Nano does not use a fixed number of digits after the decimal point and is therefore not sortable. + + +#### ForEach() + +You can also use the function `ForEach()` if you know you'll be iterating over +all the keys in a bucket: + +```go +db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("MyBucket")) + + b.ForEach(func(k, v []byte) error { + fmt.Printf("key=%s, value=%s\n", k, v) + return nil + }) + return nil +}) +``` + +Please note that keys and values in `ForEach()` are only valid while +the transaction is open. If you need to use a key or value outside of +the transaction, you must use `copy()` to copy it to another byte +slice. + +### Nested buckets + +You can also store a bucket in a key to create nested buckets. The API is the +same as the bucket management API on the `DB` object: + +```go +func (*Bucket) CreateBucket(key []byte) (*Bucket, error) +func (*Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) +func (*Bucket) DeleteBucket(key []byte) error +``` + +Say you had a multi-tenant application where the root level bucket was the account bucket. Inside of this bucket was a sequence of accounts which themselves are buckets. And inside the sequence bucket you could have many buckets pertaining to the Account itself (Users, Notes, etc) isolating the information into logical groupings. + +```go + +// createUser creates a new user in the given account. +func createUser(accountID int, u *User) error { + // Start the transaction. + tx, err := db.Begin(true) + if err != nil { + return err + } + defer tx.Rollback() + + // Retrieve the root bucket for the account. + // Assume this has already been created when the account was set up. + root := tx.Bucket([]byte(strconv.FormatUint(accountID, 10))) + + // Setup the users bucket. + bkt, err := root.CreateBucketIfNotExists([]byte("USERS")) + if err != nil { + return err + } + + // Generate an ID for the new user. + userID, err := bkt.NextSequence() + if err != nil { + return err + } + u.ID = userID + + // Marshal and save the encoded user. + if buf, err := json.Marshal(u); err != nil { + return err + } else if err := bkt.Put([]byte(strconv.FormatUint(u.ID, 10)), buf); err != nil { + return err + } + + // Commit the transaction. + if err := tx.Commit(); err != nil { + return err + } + + return nil +} + +``` + + + + +### Database backups + +Bolt is a single file so it's easy to backup. You can use the `Tx.WriteTo()` +function to write a consistent view of the database to a writer. If you call +this from a read-only transaction, it will perform a hot backup and not block +your other database reads and writes. + +By default, it will use a regular file handle which will utilize the operating +system's page cache. See the [`Tx`](https://godoc.org/github.com/boltdb/bolt#Tx) +documentation for information about optimizing for larger-than-RAM datasets. + +One common use case is to backup over HTTP so you can use tools like `cURL` to +do database backups: + +```go +func BackupHandleFunc(w http.ResponseWriter, req *http.Request) { + err := db.View(func(tx *bolt.Tx) error { + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Disposition", `attachment; filename="my.db"`) + w.Header().Set("Content-Length", strconv.Itoa(int(tx.Size()))) + _, err := tx.WriteTo(w) + return err + }) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} +``` + +Then you can backup using this command: + +```sh +$ curl http://localhost/backup > my.db +``` + +Or you can open your browser to `http://localhost/backup` and it will download +automatically. + +If you want to backup to another file you can use the `Tx.CopyFile()` helper +function. + + +### Statistics + +The database keeps a running count of many of the internal operations it +performs so you can better understand what's going on. By grabbing a snapshot +of these stats at two points in time we can see what operations were performed +in that time range. + +For example, we could start a goroutine to log stats every 10 seconds: + +```go +go func() { + // Grab the initial stats. + prev := db.Stats() + + for { + // Wait for 10s. + time.Sleep(10 * time.Second) + + // Grab the current stats and diff them. + stats := db.Stats() + diff := stats.Sub(&prev) + + // Encode stats to JSON and print to STDERR. + json.NewEncoder(os.Stderr).Encode(diff) + + // Save stats for the next loop. + prev = stats + } +}() +``` + +It's also useful to pipe these stats to a service such as statsd for monitoring +or to provide an HTTP endpoint that will perform a fixed-length sample. + + +### Read-Only Mode + +Sometimes it is useful to create a shared, read-only Bolt database. To this, +set the `Options.ReadOnly` flag when opening your database. Read-only mode +uses a shared lock to allow multiple processes to read from the database but +it will block any processes from opening the database in read-write mode. + +```go +db, err := bolt.Open("my.db", 0666, &bolt.Options{ReadOnly: true}) +if err != nil { + log.Fatal(err) +} +``` + +### Mobile Use (iOS/Android) + +Bolt is able to run on mobile devices by leveraging the binding feature of the +[gomobile](https://github.com/golang/mobile) tool. Create a struct that will +contain your database logic and a reference to a `*bolt.DB` with a initializing +constructor that takes in a filepath where the database file will be stored. +Neither Android nor iOS require extra permissions or cleanup from using this method. + +```go +func NewBoltDB(filepath string) *BoltDB { + db, err := bolt.Open(filepath+"/demo.db", 0600, nil) + if err != nil { + log.Fatal(err) + } + + return &BoltDB{db} +} + +type BoltDB struct { + db *bolt.DB + ... +} + +func (b *BoltDB) Path() string { + return b.db.Path() +} + +func (b *BoltDB) Close() { + b.db.Close() +} +``` + +Database logic should be defined as methods on this wrapper struct. + +To initialize this struct from the native language (both platforms now sync +their local storage to the cloud. These snippets disable that functionality for the +database file): + +#### Android + +```java +String path; +if (android.os.Build.VERSION.SDK_INT >=android.os.Build.VERSION_CODES.LOLLIPOP){ + path = getNoBackupFilesDir().getAbsolutePath(); +} else{ + path = getFilesDir().getAbsolutePath(); +} +Boltmobiledemo.BoltDB boltDB = Boltmobiledemo.NewBoltDB(path) +``` + +#### iOS + +```objc +- (void)demo { + NSString* path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, + NSUserDomainMask, + YES) objectAtIndex:0]; + GoBoltmobiledemoBoltDB * demo = GoBoltmobiledemoNewBoltDB(path); + [self addSkipBackupAttributeToItemAtPath:demo.path]; + //Some DB Logic would go here + [demo close]; +} + +- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString +{ + NSURL* URL= [NSURL fileURLWithPath: filePathString]; + assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]); + + NSError *error = nil; + BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES] + forKey: NSURLIsExcludedFromBackupKey error: &error]; + if(!success){ + NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error); + } + return success; +} + +``` + +## Resources + +For more information on getting started with Bolt, check out the following articles: + +* [Intro to BoltDB: Painless Performant Persistence](http://npf.io/2014/07/intro-to-boltdb-painless-performant-persistence/) by [Nate Finch](https://github.com/natefinch). +* [Bolt -- an embedded key/value database for Go](https://www.progville.com/go/bolt-embedded-db-golang/) by Progville + + +## Comparison with other databases + +### Postgres, MySQL, & other relational databases + +Relational databases structure data into rows and are only accessible through +the use of SQL. This approach provides flexibility in how you store and query +your data but also incurs overhead in parsing and planning SQL statements. Bolt +accesses all data by a byte slice key. This makes Bolt fast to read and write +data by key but provides no built-in support for joining values together. + +Most relational databases (with the exception of SQLite) are standalone servers +that run separately from your application. This gives your systems +flexibility to connect multiple application servers to a single database +server but also adds overhead in serializing and transporting data over the +network. Bolt runs as a library included in your application so all data access +has to go through your application's process. This brings data closer to your +application but limits multi-process access to the data. + + +### LevelDB, RocksDB + +LevelDB and its derivatives (RocksDB, HyperLevelDB) are similar to Bolt in that +they are libraries bundled into the application, however, their underlying +structure is a log-structured merge-tree (LSM tree). An LSM tree optimizes +random writes by using a write ahead log and multi-tiered, sorted files called +SSTables. Bolt uses a B+tree internally and only a single file. Both approaches +have trade-offs. + +If you require a high random write throughput (>10,000 w/sec) or you need to use +spinning disks then LevelDB could be a good choice. If your application is +read-heavy or does a lot of range scans then Bolt could be a good choice. + +One other important consideration is that LevelDB does not have transactions. +It supports batch writing of key/values pairs and it supports read snapshots +but it will not give you the ability to do a compare-and-swap operation safely. +Bolt supports fully serializable ACID transactions. + + +### LMDB + +Bolt was originally a port of LMDB so it is architecturally similar. Both use +a B+tree, have ACID semantics with fully serializable transactions, and support +lock-free MVCC using a single writer and multiple readers. + +The two projects have somewhat diverged. LMDB heavily focuses on raw performance +while Bolt has focused on simplicity and ease of use. For example, LMDB allows +several unsafe actions such as direct writes for the sake of performance. Bolt +opts to disallow actions which can leave the database in a corrupted state. The +only exception to this in Bolt is `DB.NoSync`. + +There are also a few differences in API. LMDB requires a maximum mmap size when +opening an `mdb_env` whereas Bolt will handle incremental mmap resizing +automatically. LMDB overloads the getter and setter functions with multiple +flags whereas Bolt splits these specialized cases into their own functions. + + +## Caveats & Limitations + +It's important to pick the right tool for the job and Bolt is no exception. +Here are a few things to note when evaluating and using Bolt: + +* Bolt is good for read intensive workloads. Sequential write performance is + also fast but random writes can be slow. You can use `DB.Batch()` or add a + write-ahead log to help mitigate this issue. + +* Bolt uses a B+tree internally so there can be a lot of random page access. + SSDs provide a significant performance boost over spinning disks. + +* Try to avoid long running read transactions. Bolt uses copy-on-write so + old pages cannot be reclaimed while an old transaction is using them. + +* Byte slices returned from Bolt are only valid during a transaction. Once the + transaction has been committed or rolled back then the memory they point to + can be reused by a new page or can be unmapped from virtual memory and you'll + see an `unexpected fault address` panic when accessing it. + +* Bolt uses an exclusive write lock on the database file so it cannot be + shared by multiple processes. + +* Be careful when using `Bucket.FillPercent`. Setting a high fill percent for + buckets that have random inserts will cause your database to have very poor + page utilization. + +* Use larger buckets in general. Smaller buckets causes poor page utilization + once they become larger than the page size (typically 4KB). + +* Bulk loading a lot of random writes into a new bucket can be slow as the + page will not split until the transaction is committed. Randomly inserting + more than 100,000 key/value pairs into a single new bucket in a single + transaction is not advised. + +* Bolt uses a memory-mapped file so the underlying operating system handles the + caching of the data. Typically, the OS will cache as much of the file as it + can in memory and will release memory as needed to other processes. This means + that Bolt can show very high memory usage when working with large databases. + However, this is expected and the OS will release memory as needed. Bolt can + handle databases much larger than the available physical RAM, provided its + memory-map fits in the process virtual address space. It may be problematic + on 32-bits systems. + +* The data structures in the Bolt database are memory mapped so the data file + will be endian specific. This means that you cannot copy a Bolt file from a + little endian machine to a big endian machine and have it work. For most + users this is not a concern since most modern CPUs are little endian. + +* Because of the way pages are laid out on disk, Bolt cannot truncate data files + and return free pages back to the disk. Instead, Bolt maintains a free list + of unused pages within its data file. These free pages can be reused by later + transactions. This works well for many use cases as databases generally tend + to grow. However, it's important to note that deleting large chunks of data + will not allow you to reclaim that space on disk. + + For more information on page allocation, [see this comment][page-allocation]. + +[page-allocation]: https://github.com/boltdb/bolt/issues/308#issuecomment-74811638 + + +## Reading the Source + +Bolt is a relatively small code base (<3KLOC) for an embedded, serializable, +transactional key/value database so it can be a good starting point for people +interested in how databases work. + +The best places to start are the main entry points into Bolt: + +- `Open()` - Initializes the reference to the database. It's responsible for + creating the database if it doesn't exist, obtaining an exclusive lock on the + file, reading the meta pages, & memory-mapping the file. + +- `DB.Begin()` - Starts a read-only or read-write transaction depending on the + value of the `writable` argument. This requires briefly obtaining the "meta" + lock to keep track of open transactions. Only one read-write transaction can + exist at a time so the "rwlock" is acquired during the life of a read-write + transaction. + +- `Bucket.Put()` - Writes a key/value pair into a bucket. After validating the + arguments, a cursor is used to traverse the B+tree to the page and position + where they key & value will be written. Once the position is found, the bucket + materializes the underlying page and the page's parent pages into memory as + "nodes". These nodes are where mutations occur during read-write transactions. + These changes get flushed to disk during commit. + +- `Bucket.Get()` - Retrieves a key/value pair from a bucket. This uses a cursor + to move to the page & position of a key/value pair. During a read-only + transaction, the key and value data is returned as a direct reference to the + underlying mmap file so there's no allocation overhead. For read-write + transactions, this data may reference the mmap file or one of the in-memory + node values. + +- `Cursor` - This object is simply for traversing the B+tree of on-disk pages + or in-memory nodes. It can seek to a specific key, move to the first or last + value, or it can move forward or backward. The cursor handles the movement up + and down the B+tree transparently to the end user. + +- `Tx.Commit()` - Converts the in-memory dirty nodes and the list of free pages + into pages to be written to disk. Writing to disk then occurs in two phases. + First, the dirty pages are written to disk and an `fsync()` occurs. Second, a + new meta page with an incremented transaction ID is written and another + `fsync()` occurs. This two phase write ensures that partially written data + pages are ignored in the event of a crash since the meta page pointing to them + is never written. Partially written meta pages are invalidated because they + are written with a checksum. + +If you have additional notes that could be helpful for others, please submit +them via pull request. + + +## Other Projects Using Bolt + +Below is a list of public, open source projects that use Bolt: + +* [BoltDbWeb](https://github.com/evnix/boltdbweb) - A web based GUI for BoltDB files. +* [Operation Go: A Routine Mission](http://gocode.io) - An online programming game for Golang using Bolt for user accounts and a leaderboard. +* [Bazil](https://bazil.org/) - A file system that lets your data reside where it is most convenient for it to reside. +* [DVID](https://github.com/janelia-flyem/dvid) - Added Bolt as optional storage engine and testing it against Basho-tuned leveldb. +* [Skybox Analytics](https://github.com/skybox/skybox) - A standalone funnel analysis tool for web analytics. +* [Scuttlebutt](https://github.com/benbjohnson/scuttlebutt) - Uses Bolt to store and process all Twitter mentions of GitHub projects. +* [Wiki](https://github.com/peterhellberg/wiki) - A tiny wiki using Goji, BoltDB and Blackfriday. +* [ChainStore](https://github.com/pressly/chainstore) - Simple key-value interface to a variety of storage engines organized as a chain of operations. +* [MetricBase](https://github.com/msiebuhr/MetricBase) - Single-binary version of Graphite. +* [Gitchain](https://github.com/gitchain/gitchain) - Decentralized, peer-to-peer Git repositories aka "Git meets Bitcoin". +* [event-shuttle](https://github.com/sclasen/event-shuttle) - A Unix system service to collect and reliably deliver messages to Kafka. +* [ipxed](https://github.com/kelseyhightower/ipxed) - Web interface and api for ipxed. +* [BoltStore](https://github.com/yosssi/boltstore) - Session store using Bolt. +* [photosite/session](https://godoc.org/bitbucket.org/kardianos/photosite/session) - Sessions for a photo viewing site. +* [LedisDB](https://github.com/siddontang/ledisdb) - A high performance NoSQL, using Bolt as optional storage. +* [ipLocator](https://github.com/AndreasBriese/ipLocator) - A fast ip-geo-location-server using bolt with bloom filters. +* [cayley](https://github.com/google/cayley) - Cayley is an open-source graph database using Bolt as optional backend. +* [bleve](http://www.blevesearch.com/) - A pure Go search engine similar to ElasticSearch that uses Bolt as the default storage backend. +* [tentacool](https://github.com/optiflows/tentacool) - REST api server to manage system stuff (IP, DNS, Gateway...) on a linux server. +* [Seaweed File System](https://github.com/chrislusf/seaweedfs) - Highly scalable distributed key~file system with O(1) disk read. +* [InfluxDB](https://influxdata.com) - Scalable datastore for metrics, events, and real-time analytics. +* [Freehold](http://tshannon.bitbucket.org/freehold/) - An open, secure, and lightweight platform for your files and data. +* [Prometheus Annotation Server](https://github.com/oliver006/prom_annotation_server) - Annotation server for PromDash & Prometheus service monitoring system. +* [Consul](https://github.com/hashicorp/consul) - Consul is service discovery and configuration made easy. Distributed, highly available, and datacenter-aware. +* [Kala](https://github.com/ajvb/kala) - Kala is a modern job scheduler optimized to run on a single node. It is persistent, JSON over HTTP API, ISO 8601 duration notation, and dependent jobs. +* [drive](https://github.com/odeke-em/drive) - drive is an unofficial Google Drive command line client for \*NIX operating systems. +* [stow](https://github.com/djherbis/stow) - a persistence manager for objects + backed by boltdb. +* [buckets](https://github.com/joyrexus/buckets) - a bolt wrapper streamlining + simple tx and key scans. +* [mbuckets](https://github.com/abhigupta912/mbuckets) - A Bolt wrapper that allows easy operations on multi level (nested) buckets. +* [Request Baskets](https://github.com/darklynx/request-baskets) - A web service to collect arbitrary HTTP requests and inspect them via REST API or simple web UI, similar to [RequestBin](http://requestb.in/) service +* [Go Report Card](https://goreportcard.com/) - Go code quality report cards as a (free and open source) service. +* [Boltdb Boilerplate](https://github.com/bobintornado/boltdb-boilerplate) - Boilerplate wrapper around bolt aiming to make simple calls one-liners. +* [lru](https://github.com/crowdriff/lru) - Easy to use Bolt-backed Least-Recently-Used (LRU) read-through cache with chainable remote stores. +* [Storm](https://github.com/asdine/storm) - Simple and powerful ORM for BoltDB. +* [GoWebApp](https://github.com/josephspurrier/gowebapp) - A basic MVC web application in Go using BoltDB. +* [SimpleBolt](https://github.com/xyproto/simplebolt) - A simple way to use BoltDB. Deals mainly with strings. +* [Algernon](https://github.com/xyproto/algernon) - A HTTP/2 web server with built-in support for Lua. Uses BoltDB as the default database backend. +* [MuLiFS](https://github.com/dankomiocevic/mulifs) - Music Library Filesystem creates a filesystem to organise your music files. +* [GoShort](https://github.com/pankajkhairnar/goShort) - GoShort is a URL shortener written in Golang and BoltDB for persistent key/value storage and for routing it's using high performent HTTPRouter. +* [torrent](https://github.com/anacrolix/torrent) - Full-featured BitTorrent client package and utilities in Go. BoltDB is a storage backend in development. +* [gopherpit](https://github.com/gopherpit/gopherpit) - A web service to manage Go remote import paths with custom domains +* [bolter](https://github.com/hasit/bolter) - Command-line app for viewing BoltDB file in your terminal. +* [btcwallet](https://github.com/btcsuite/btcwallet) - A bitcoin wallet. +* [dcrwallet](https://github.com/decred/dcrwallet) - A wallet for the Decred cryptocurrency. +* [Ironsmith](https://github.com/timshannon/ironsmith) - A simple, script-driven continuous integration (build - > test -> release) tool, with no external dependencies +* [BoltHold](https://github.com/timshannon/bolthold) - An embeddable NoSQL store for Go types built on BoltDB +* [Ponzu CMS](https://ponzu-cms.org) - Headless CMS + automatic JSON API with auto-HTTPS, HTTP/2 Server Push, and flexible server framework. + +If you are using Bolt in a project please send a pull request to add it to the list. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/appveyor.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/appveyor.yml new file mode 100755 index 0000000..6e26e94 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/appveyor.yml @@ -0,0 +1,18 @@ +version: "{build}" + +os: Windows Server 2012 R2 + +clone_folder: c:\gopath\src\github.com\boltdb\bolt + +environment: + GOPATH: c:\gopath + +install: + - echo %PATH% + - echo %GOPATH% + - go version + - go env + - go get -v -t ./... + +build_script: + - go test -v ./... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go new file mode 100755 index 0000000..820d533 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_386.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go new file mode 100755 index 0000000..98fafdb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_amd64.go @@ -0,0 +1,10 @@ +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go new file mode 100755 index 0000000..7e5cb4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm.go @@ -0,0 +1,28 @@ +package bolt + +import "unsafe" + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned bool + +func init() { + // Simple check to see whether this arch handles unaligned load/stores + // correctly. + + // ARM9 and older devices require load/stores to be from/to aligned + // addresses. If not, the lower 2 bits are cleared and that address is + // read in a jumbled up order. + + // See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html + + raw := [6]byte{0xfe, 0xef, 0x11, 0x22, 0x22, 0x11} + val := *(*uint32)(unsafe.Pointer(uintptr(unsafe.Pointer(&raw)) + 2)) + + brokenUnaligned = val != 0x11222211 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go new file mode 100755 index 0000000..b26d84f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_arm64.go @@ -0,0 +1,12 @@ +// +build arm64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go new file mode 100755 index 0000000..2b67666 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_linux.go @@ -0,0 +1,10 @@ +package bolt + +import ( + "syscall" +) + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return syscall.Fdatasync(int(db.file.Fd())) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go new file mode 100755 index 0000000..7058c3d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_openbsd.go @@ -0,0 +1,27 @@ +package bolt + +import ( + "syscall" + "unsafe" +) + +const ( + msAsync = 1 << iota // perform asynchronous writes + msSync // perform synchronous writes + msInvalidate // invalidate cached data +) + +func msync(db *DB) error { + _, _, errno := syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(db.data)), uintptr(db.datasz), msInvalidate) + if errno != 0 { + return errno + } + return nil +} + +func fdatasync(db *DB) error { + if db.data != nil { + return msync(db) + } + return db.file.Sync() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go new file mode 100755 index 0000000..645ddc3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc.go @@ -0,0 +1,9 @@ +// +build ppc + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0x7FFFFFFF // 2GB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0xFFFFFFF diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go new file mode 100755 index 0000000..9331d97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64.go @@ -0,0 +1,12 @@ +// +build ppc64 + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go new file mode 100755 index 0000000..8c143bc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_ppc64le.go @@ -0,0 +1,12 @@ +// +build ppc64le + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go new file mode 100755 index 0000000..d7c39af --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_s390x.go @@ -0,0 +1,12 @@ +// +build s390x + +package bolt + +// maxMapSize represents the largest mmap size supported by Bolt. +const maxMapSize = 0xFFFFFFFFFFFF // 256TB + +// maxAllocSize is the size used when creating array pointers. +const maxAllocSize = 0x7FFFFFFF + +// Are unaligned load/stores broken on this arch? +var brokenUnaligned = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go new file mode 100755 index 0000000..cad62dd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix.go @@ -0,0 +1,89 @@ +// +build !windows,!plan9,!solaris + +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + flag := syscall.LOCK_SH + if exclusive { + flag = syscall.LOCK_EX + } + + // Otherwise attempt to obtain an exclusive lock. + err := syscall.Flock(int(db.file.Fd()), flag|syscall.LOCK_NB) + if err == nil { + return nil + } else if err != syscall.EWOULDBLOCK { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + return syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := syscall.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} + +// NOTE: This function is copied from stdlib because it is not available on darwin. +func madvise(b []byte, advice int) (err error) { + _, _, e1 := syscall.Syscall(syscall.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go new file mode 100755 index 0000000..307bf2b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_unix_solaris.go @@ -0,0 +1,90 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" + + "golang.org/x/sys/unix" +) + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Pid = 0 + lock.Whence = 0 + lock.Pid = 0 + if exclusive { + lock.Type = syscall.F_WRLCK + } else { + lock.Type = syscall.F_RDLCK + } + err := syscall.FcntlFlock(db.file.Fd(), syscall.F_SETLK, &lock) + if err == nil { + return nil + } else if err != syscall.EAGAIN { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + var lock syscall.Flock_t + lock.Start = 0 + lock.Len = 0 + lock.Type = syscall.F_UNLCK + lock.Whence = 0 + return syscall.FcntlFlock(uintptr(db.file.Fd()), syscall.F_SETLK, &lock) +} + +// mmap memory maps a DB's data file. +func mmap(db *DB, sz int) error { + // Map the data file to memory. + b, err := unix.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED|db.MmapFlags) + if err != nil { + return err + } + + // Advise the kernel that the mmap is accessed randomly. + if err := unix.Madvise(b, syscall.MADV_RANDOM); err != nil { + return fmt.Errorf("madvise: %s", err) + } + + // Save the original byte slice and convert to a byte array pointer. + db.dataref = b + db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0])) + db.datasz = sz + return nil +} + +// munmap unmaps a DB's data file from memory. +func munmap(db *DB) error { + // Ignore the unmap if we have no mapped data. + if db.dataref == nil { + return nil + } + + // Unmap using the original byte slice. + err := unix.Munmap(db.dataref) + db.dataref = nil + db.data = nil + db.datasz = 0 + return err +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go new file mode 100755 index 0000000..b00fb07 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bolt_windows.go @@ -0,0 +1,144 @@ +package bolt + +import ( + "fmt" + "os" + "syscall" + "time" + "unsafe" +) + +// LockFileEx code derived from golang build filemutex_windows.go @ v1.5.1 +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + procLockFileEx = modkernel32.NewProc("LockFileEx") + procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") +) + +const ( + lockExt = ".lock" + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx + flagLockExclusive = 2 + flagLockFailImmediately = 1 + + // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx + errLockViolation syscall.Errno = 0x21 +) + +func lockFileEx(h syscall.Handle, flags, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procLockFileEx.Call(uintptr(h), uintptr(flags), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol))) + if r == 0 { + return err + } + return nil +} + +func unlockFileEx(h syscall.Handle, reserved, locklow, lockhigh uint32, ol *syscall.Overlapped) (err error) { + r, _, err := procUnlockFileEx.Call(uintptr(h), uintptr(reserved), uintptr(locklow), uintptr(lockhigh), uintptr(unsafe.Pointer(ol)), 0) + if r == 0 { + return err + } + return nil +} + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(db *DB, mode os.FileMode, exclusive bool, timeout time.Duration) error { + // Create a separate lock file on windows because a process + // cannot share an exclusive lock on the same file. This is + // needed during Tx.WriteTo(). + f, err := os.OpenFile(db.path+lockExt, os.O_CREATE, mode) + if err != nil { + return err + } + db.lockfile = f + + var t time.Time + for { + // If we're beyond our timeout then return an error. + // This can only occur after we've attempted a flock once. + if t.IsZero() { + t = time.Now() + } else if timeout > 0 && time.Since(t) > timeout { + return ErrTimeout + } + + var flag uint32 = flagLockFailImmediately + if exclusive { + flag |= flagLockExclusive + } + + err := lockFileEx(syscall.Handle(db.lockfile.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}) + if err == nil { + return nil + } else if err != errLockViolation { + return err + } + + // Wait for a bit and try again. + time.Sleep(50 * time.Millisecond) + } +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(db *DB) error { + err := unlockFileEx(syscall.Handle(db.lockfile.Fd()), 0, 1, 0, &syscall.Overlapped{}) + db.lockfile.Close() + os.Remove(db.path + lockExt) + return err +} + +// mmap memory maps a DB's data file. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(db *DB, sz int) error { + if !db.readOnly { + // Truncate the database to the size of the mmap. + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("truncate: %s", err) + } + } + + // Open a file mapping handle. + sizelo := uint32(sz >> 32) + sizehi := uint32(sz) & 0xffffffff + h, errno := syscall.CreateFileMapping(syscall.Handle(db.file.Fd()), nil, syscall.PAGE_READONLY, sizelo, sizehi, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte array. + db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr))) + db.datasz = sz + + return nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(db *DB) error { + if db.data == nil { + return nil + } + + addr := (uintptr)(unsafe.Pointer(&db.data[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go new file mode 100755 index 0000000..f504425 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/boltsync_unix.go @@ -0,0 +1,8 @@ +// +build !windows,!plan9,!linux,!openbsd + +package bolt + +// fdatasync flushes written data to a file descriptor. +func fdatasync(db *DB) error { + return db.file.Sync() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bucket.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bucket.go new file mode 100755 index 0000000..0c5bf27 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/bucket.go @@ -0,0 +1,777 @@ +package bolt + +import ( + "bytes" + "fmt" + "unsafe" +) + +const ( + // MaxKeySize is the maximum length of a key, in bytes. + MaxKeySize = 32768 + + // MaxValueSize is the maximum length of a value, in bytes. + MaxValueSize = (1 << 31) - 2 +) + +const ( + maxUint = ^uint(0) + minUint = 0 + maxInt = int(^uint(0) >> 1) + minInt = -maxInt - 1 +) + +const bucketHeaderSize = int(unsafe.Sizeof(bucket{})) + +const ( + minFillPercent = 0.1 + maxFillPercent = 1.0 +) + +// DefaultFillPercent is the percentage that split pages are filled. +// This value can be changed by setting Bucket.FillPercent. +const DefaultFillPercent = 0.5 + +// Bucket represents a collection of key/value pairs inside the database. +type Bucket struct { + *bucket + tx *Tx // the associated transaction + buckets map[string]*Bucket // subbucket cache + page *page // inline page reference + rootNode *node // materialized node for the root page. + nodes map[pgid]*node // node cache + + // Sets the threshold for filling nodes when they split. By default, + // the bucket will fill to 50% but it can be useful to increase this + // amount if you know that your write workloads are mostly append-only. + // + // This is non-persisted across transactions so it must be set in every Tx. + FillPercent float64 +} + +// bucket represents the on-file representation of a bucket. +// This is stored as the "value" of a bucket key. If the bucket is small enough, +// then its root page can be stored inline in the "value", after the bucket +// header. In the case of inline buckets, the "root" will be 0. +type bucket struct { + root pgid // page id of the bucket's root-level page + sequence uint64 // monotonically incrementing, used by NextSequence() +} + +// newBucket returns a new bucket associated with a transaction. +func newBucket(tx *Tx) Bucket { + var b = Bucket{tx: tx, FillPercent: DefaultFillPercent} + if tx.writable { + b.buckets = make(map[string]*Bucket) + b.nodes = make(map[pgid]*node) + } + return b +} + +// Tx returns the tx of the bucket. +func (b *Bucket) Tx() *Tx { + return b.tx +} + +// Root returns the root of the bucket. +func (b *Bucket) Root() pgid { + return b.root +} + +// Writable returns whether the bucket is writable. +func (b *Bucket) Writable() bool { + return b.tx.writable +} + +// Cursor creates a cursor associated with the bucket. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (b *Bucket) Cursor() *Cursor { + // Update transaction statistics. + b.tx.stats.CursorCount++ + + // Allocate and return a cursor. + return &Cursor{ + bucket: b, + stack: make([]elemRef, 0), + } +} + +// Bucket retrieves a nested bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) Bucket(name []byte) *Bucket { + if b.buckets != nil { + if child := b.buckets[string(name)]; child != nil { + return child + } + } + + // Move cursor to key. + c := b.Cursor() + k, v, flags := c.seek(name) + + // Return nil if the key doesn't exist or it is not a bucket. + if !bytes.Equal(name, k) || (flags&bucketLeafFlag) == 0 { + return nil + } + + // Otherwise create a bucket and cache it. + var child = b.openBucket(v) + if b.buckets != nil { + b.buckets[string(name)] = child + } + + return child +} + +// Helper method that re-interprets a sub-bucket value +// from a parent into a Bucket +func (b *Bucket) openBucket(value []byte) *Bucket { + var child = newBucket(b.tx) + + // If unaligned load/stores are broken on this arch and value is + // unaligned simply clone to an aligned byte array. + unaligned := brokenUnaligned && uintptr(unsafe.Pointer(&value[0]))&3 != 0 + + if unaligned { + value = cloneBytes(value) + } + + // If this is a writable transaction then we need to copy the bucket entry. + // Read-only transactions can point directly at the mmap entry. + if b.tx.writable && !unaligned { + child.bucket = &bucket{} + *child.bucket = *(*bucket)(unsafe.Pointer(&value[0])) + } else { + child.bucket = (*bucket)(unsafe.Pointer(&value[0])) + } + + // Save a reference to the inline page if the bucket is inline. + if child.root == 0 { + child.page = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + } + + return &child +} + +// CreateBucket creates a new bucket at the given key and returns the new bucket. +// Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucket(key []byte) (*Bucket, error) { + if b.tx.db == nil { + return nil, ErrTxClosed + } else if !b.tx.writable { + return nil, ErrTxNotWritable + } else if len(key) == 0 { + return nil, ErrBucketNameRequired + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key. + if bytes.Equal(key, k) { + if (flags & bucketLeafFlag) != 0 { + return nil, ErrBucketExists + } + return nil, ErrIncompatibleValue + } + + // Create empty, inline bucket. + var bucket = Bucket{ + bucket: &bucket{}, + rootNode: &node{isLeaf: true}, + FillPercent: DefaultFillPercent, + } + var value = bucket.write() + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, bucketLeafFlag) + + // Since subbuckets are not allowed on inline buckets, we need to + // dereference the inline page, if it exists. This will cause the bucket + // to be treated as a regular, non-inline bucket for the rest of the tx. + b.page = nil + + return b.Bucket(key), nil +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (b *Bucket) CreateBucketIfNotExists(key []byte) (*Bucket, error) { + child, err := b.CreateBucket(key) + if err == ErrBucketExists { + return b.Bucket(key), nil + } else if err != nil { + return nil, err + } + return child, nil +} + +// DeleteBucket deletes a bucket at the given key. +// Returns an error if the bucket does not exists, or if the key represents a non-bucket value. +func (b *Bucket) DeleteBucket(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if bucket doesn't exist or is not a bucket. + if !bytes.Equal(key, k) { + return ErrBucketNotFound + } else if (flags & bucketLeafFlag) == 0 { + return ErrIncompatibleValue + } + + // Recursively delete all child buckets. + child := b.Bucket(key) + err := child.ForEach(func(k, v []byte) error { + if v == nil { + if err := child.DeleteBucket(k); err != nil { + return fmt.Errorf("delete bucket: %s", err) + } + } + return nil + }) + if err != nil { + return err + } + + // Remove cached copy. + delete(b.buckets, string(key)) + + // Release all bucket pages to freelist. + child.nodes = nil + child.rootNode = nil + child.free() + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Get retrieves the value for a key in the bucket. +// Returns a nil value if the key does not exist or if the key is a nested bucket. +// The returned value is only valid for the life of the transaction. +func (b *Bucket) Get(key []byte) []byte { + k, v, flags := b.Cursor().seek(key) + + // Return nil if this is a bucket. + if (flags & bucketLeafFlag) != 0 { + return nil + } + + // If our target node isn't the same key as what's passed in then return nil. + if !bytes.Equal(key, k) { + return nil + } + return v +} + +// Put sets the value for a key in the bucket. +// If the key exist then its previous value will be overwritten. +// Supplied value must remain valid for the life of the transaction. +// Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. +func (b *Bucket) Put(key []byte, value []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } else if len(key) == 0 { + return ErrKeyRequired + } else if len(key) > MaxKeySize { + return ErrKeyTooLarge + } else if int64(len(value)) > MaxValueSize { + return ErrValueTooLarge + } + + // Move cursor to correct position. + c := b.Cursor() + k, _, flags := c.seek(key) + + // Return an error if there is an existing key with a bucket value. + if bytes.Equal(key, k) && (flags&bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Insert into node. + key = cloneBytes(key) + c.node().put(key, key, value, 0, 0) + + return nil +} + +// Delete removes a key from the bucket. +// If the key does not exist then nothing is done and a nil error is returned. +// Returns an error if the bucket was created from a read-only transaction. +func (b *Bucket) Delete(key []byte) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Move cursor to correct position. + c := b.Cursor() + _, _, flags := c.seek(key) + + // Return an error if there is already existing bucket value. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + + // Delete the node if we have a matching key. + c.node().del(key) + + return nil +} + +// Sequence returns the current integer for the bucket without incrementing it. +func (b *Bucket) Sequence() uint64 { return b.bucket.sequence } + +// SetSequence updates the sequence number for the bucket. +func (b *Bucket) SetSequence(v uint64) error { + if b.tx.db == nil { + return ErrTxClosed + } else if !b.Writable() { + return ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence = v + return nil +} + +// NextSequence returns an autoincrementing integer for the bucket. +func (b *Bucket) NextSequence() (uint64, error) { + if b.tx.db == nil { + return 0, ErrTxClosed + } else if !b.Writable() { + return 0, ErrTxNotWritable + } + + // Materialize the root node if it hasn't been already so that the + // bucket will be saved during commit. + if b.rootNode == nil { + _ = b.node(b.root, nil) + } + + // Increment and return the sequence. + b.bucket.sequence++ + return b.bucket.sequence, nil +} + +// ForEach executes a function for each key/value pair in a bucket. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. The provided function must not modify +// the bucket; this will result in undefined behavior. +func (b *Bucket) ForEach(fn func(k, v []byte) error) error { + if b.tx.db == nil { + return ErrTxClosed + } + c := b.Cursor() + for k, v := c.First(); k != nil; k, v = c.Next() { + if err := fn(k, v); err != nil { + return err + } + } + return nil +} + +// Stat returns stats on a bucket. +func (b *Bucket) Stats() BucketStats { + var s, subStats BucketStats + pageSize := b.tx.db.pageSize + s.BucketN += 1 + if b.root == 0 { + s.InlineBucketN += 1 + } + b.forEachPage(func(p *page, depth int) { + if (p.flags & leafPageFlag) != 0 { + s.KeyN += int(p.count) + + // used totals the used bytes for the page + used := pageHeaderSize + + if p.count != 0 { + // If page has any elements, add all element headers. + used += leafPageElementSize * int(p.count-1) + + // Add all element key, value sizes. + // The computation takes advantage of the fact that the position + // of the last element's key/value equals to the total of the sizes + // of all previous elements' keys and values. + // It also includes the last element's header. + lastElement := p.leafPageElement(p.count - 1) + used += int(lastElement.pos + lastElement.ksize + lastElement.vsize) + } + + if b.root == 0 { + // For inlined bucket just update the inline stats + s.InlineBucketInuse += used + } else { + // For non-inlined bucket update all the leaf stats + s.LeafPageN++ + s.LeafInuse += used + s.LeafOverflowN += int(p.overflow) + + // Collect stats from sub-buckets. + // Do that by iterating over all element headers + // looking for the ones with the bucketLeafFlag. + for i := uint16(0); i < p.count; i++ { + e := p.leafPageElement(i) + if (e.flags & bucketLeafFlag) != 0 { + // For any bucket element, open the element value + // and recursively call Stats on the contained bucket. + subStats.Add(b.openBucket(e.value()).Stats()) + } + } + } + } else if (p.flags & branchPageFlag) != 0 { + s.BranchPageN++ + lastElement := p.branchPageElement(p.count - 1) + + // used totals the used bytes for the page + // Add header and all element headers. + used := pageHeaderSize + (branchPageElementSize * int(p.count-1)) + + // Add size of all keys and values. + // Again, use the fact that last element's position equals to + // the total of key, value sizes of all previous elements. + used += int(lastElement.pos + lastElement.ksize) + s.BranchInuse += used + s.BranchOverflowN += int(p.overflow) + } + + // Keep track of maximum page depth. + if depth+1 > s.Depth { + s.Depth = (depth + 1) + } + }) + + // Alloc stats can be computed from page counts and pageSize. + s.BranchAlloc = (s.BranchPageN + s.BranchOverflowN) * pageSize + s.LeafAlloc = (s.LeafPageN + s.LeafOverflowN) * pageSize + + // Add the max depth of sub-buckets to get total nested depth. + s.Depth += subStats.Depth + // Add the stats for all sub-buckets + s.Add(subStats) + return s +} + +// forEachPage iterates over every page in a bucket, including inline pages. +func (b *Bucket) forEachPage(fn func(*page, int)) { + // If we have an inline page then just use that. + if b.page != nil { + fn(b.page, 0) + return + } + + // Otherwise traverse the page hierarchy. + b.tx.forEachPage(b.root, 0, fn) +} + +// forEachPageNode iterates over every page (or node) in a bucket. +// This also includes inline pages. +func (b *Bucket) forEachPageNode(fn func(*page, *node, int)) { + // If we have an inline page or root node then just use that. + if b.page != nil { + fn(b.page, nil, 0) + return + } + b._forEachPageNode(b.root, 0, fn) +} + +func (b *Bucket) _forEachPageNode(pgid pgid, depth int, fn func(*page, *node, int)) { + var p, n = b.pageNode(pgid) + + // Execute function. + fn(p, n, depth) + + // Recursively loop over children. + if p != nil { + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + b._forEachPageNode(elem.pgid, depth+1, fn) + } + } + } else { + if !n.isLeaf { + for _, inode := range n.inodes { + b._forEachPageNode(inode.pgid, depth+1, fn) + } + } + } +} + +// spill writes all the nodes for this bucket to dirty pages. +func (b *Bucket) spill() error { + // Spill all child buckets first. + for name, child := range b.buckets { + // If the child bucket is small enough and it has no child buckets then + // write it inline into the parent bucket's page. Otherwise spill it + // like a normal bucket and make the parent value a pointer to the page. + var value []byte + if child.inlineable() { + child.free() + value = child.write() + } else { + if err := child.spill(); err != nil { + return err + } + + // Update the child bucket header in this bucket. + value = make([]byte, unsafe.Sizeof(bucket{})) + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *child.bucket + } + + // Skip writing the bucket if there are no materialized nodes. + if child.rootNode == nil { + continue + } + + // Update parent node. + var c = b.Cursor() + k, _, flags := c.seek([]byte(name)) + if !bytes.Equal([]byte(name), k) { + panic(fmt.Sprintf("misplaced bucket header: %x -> %x", []byte(name), k)) + } + if flags&bucketLeafFlag == 0 { + panic(fmt.Sprintf("unexpected bucket header flag: %x", flags)) + } + c.node().put([]byte(name), []byte(name), value, 0, bucketLeafFlag) + } + + // Ignore if there's not a materialized root node. + if b.rootNode == nil { + return nil + } + + // Spill nodes. + if err := b.rootNode.spill(); err != nil { + return err + } + b.rootNode = b.rootNode.root() + + // Update the root node for this bucket. + if b.rootNode.pgid >= b.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", b.rootNode.pgid, b.tx.meta.pgid)) + } + b.root = b.rootNode.pgid + + return nil +} + +// inlineable returns true if a bucket is small enough to be written inline +// and if it contains no subbuckets. Otherwise returns false. +func (b *Bucket) inlineable() bool { + var n = b.rootNode + + // Bucket must only contain a single leaf node. + if n == nil || !n.isLeaf { + return false + } + + // Bucket is not inlineable if it contains subbuckets or if it goes beyond + // our threshold for inline bucket size. + var size = pageHeaderSize + for _, inode := range n.inodes { + size += leafPageElementSize + len(inode.key) + len(inode.value) + + if inode.flags&bucketLeafFlag != 0 { + return false + } else if size > b.maxInlineBucketSize() { + return false + } + } + + return true +} + +// Returns the maximum total size of a bucket to make it a candidate for inlining. +func (b *Bucket) maxInlineBucketSize() int { + return b.tx.db.pageSize / 4 +} + +// write allocates and writes a bucket to a byte slice. +func (b *Bucket) write() []byte { + // Allocate the appropriate size. + var n = b.rootNode + var value = make([]byte, bucketHeaderSize+n.size()) + + // Write a bucket header. + var bucket = (*bucket)(unsafe.Pointer(&value[0])) + *bucket = *b.bucket + + // Convert byte slice to a fake page and write the root node. + var p = (*page)(unsafe.Pointer(&value[bucketHeaderSize])) + n.write(p) + + return value +} + +// rebalance attempts to balance all nodes. +func (b *Bucket) rebalance() { + for _, n := range b.nodes { + n.rebalance() + } + for _, child := range b.buckets { + child.rebalance() + } +} + +// node creates a node from a page and associates it with a given parent. +func (b *Bucket) node(pgid pgid, parent *node) *node { + _assert(b.nodes != nil, "nodes map expected") + + // Retrieve node if it's already been created. + if n := b.nodes[pgid]; n != nil { + return n + } + + // Otherwise create a node and cache it. + n := &node{bucket: b, parent: parent} + if parent == nil { + b.rootNode = n + } else { + parent.children = append(parent.children, n) + } + + // Use the inline page if this is an inline bucket. + var p = b.page + if p == nil { + p = b.tx.page(pgid) + } + + // Read the page into the node and cache it. + n.read(p) + b.nodes[pgid] = n + + // Update statistics. + b.tx.stats.NodeCount++ + + return n +} + +// free recursively frees all pages in the bucket. +func (b *Bucket) free() { + if b.root == 0 { + return + } + + var tx = b.tx + b.forEachPageNode(func(p *page, n *node, _ int) { + if p != nil { + tx.db.freelist.free(tx.meta.txid, p) + } else { + n.free() + } + }) + b.root = 0 +} + +// dereference removes all references to the old mmap. +func (b *Bucket) dereference() { + if b.rootNode != nil { + b.rootNode.root().dereference() + } + + for _, child := range b.buckets { + child.dereference() + } +} + +// pageNode returns the in-memory node, if it exists. +// Otherwise returns the underlying page. +func (b *Bucket) pageNode(id pgid) (*page, *node) { + // Inline buckets have a fake page embedded in their value so treat them + // differently. We'll return the rootNode (if available) or the fake page. + if b.root == 0 { + if id != 0 { + panic(fmt.Sprintf("inline bucket non-zero page access(2): %d != 0", id)) + } + if b.rootNode != nil { + return nil, b.rootNode + } + return b.page, nil + } + + // Check the node cache for non-inline buckets. + if b.nodes != nil { + if n := b.nodes[id]; n != nil { + return nil, n + } + } + + // Finally lookup the page from the transaction if no node is materialized. + return b.tx.page(id), nil +} + +// BucketStats records statistics about resources used by a bucket. +type BucketStats struct { + // Page count statistics. + BranchPageN int // number of logical branch pages + BranchOverflowN int // number of physical branch overflow pages + LeafPageN int // number of logical leaf pages + LeafOverflowN int // number of physical leaf overflow pages + + // Tree statistics. + KeyN int // number of keys/value pairs + Depth int // number of levels in B+tree + + // Page size utilization. + BranchAlloc int // bytes allocated for physical branch pages + BranchInuse int // bytes actually used for branch data + LeafAlloc int // bytes allocated for physical leaf pages + LeafInuse int // bytes actually used for leaf data + + // Bucket statistics + BucketN int // total number of buckets including the top bucket + InlineBucketN int // total number on inlined buckets + InlineBucketInuse int // bytes used for inlined buckets (also accounted for in LeafInuse) +} + +func (s *BucketStats) Add(other BucketStats) { + s.BranchPageN += other.BranchPageN + s.BranchOverflowN += other.BranchOverflowN + s.LeafPageN += other.LeafPageN + s.LeafOverflowN += other.LeafOverflowN + s.KeyN += other.KeyN + if s.Depth < other.Depth { + s.Depth = other.Depth + } + s.BranchAlloc += other.BranchAlloc + s.BranchInuse += other.BranchInuse + s.LeafAlloc += other.LeafAlloc + s.LeafInuse += other.LeafInuse + + s.BucketN += other.BucketN + s.InlineBucketN += other.InlineBucketN + s.InlineBucketInuse += other.InlineBucketInuse +} + +// cloneBytes returns a copy of a given slice. +func cloneBytes(v []byte) []byte { + var clone = make([]byte, len(v)) + copy(clone, v) + return clone +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/cursor.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/cursor.go new file mode 100755 index 0000000..1be9f35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/cursor.go @@ -0,0 +1,400 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" +) + +// Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order. +// Cursors see nested buckets with value == nil. +// Cursors can be obtained from a transaction and are valid as long as the transaction is open. +// +// Keys and values returned from the cursor are only valid for the life of the transaction. +// +// Changing data while traversing with a cursor may cause it to be invalidated +// and return unexpected keys and/or values. You must reposition your cursor +// after mutating data. +type Cursor struct { + bucket *Bucket + stack []elemRef +} + +// Bucket returns the bucket that this cursor was created from. +func (c *Cursor) Bucket() *Bucket { + return c.bucket +} + +// First moves the cursor to the first item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) First() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + c.first() + + // If we land on an empty page then move to the next value. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + c.next() + } + + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v + +} + +// Last moves the cursor to the last item in the bucket and returns its key and value. +// If the bucket is empty then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Last() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + c.stack = c.stack[:0] + p, n := c.bucket.pageNode(c.bucket.root) + ref := elemRef{page: p, node: n} + ref.index = ref.count() - 1 + c.stack = append(c.stack, ref) + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Next moves the cursor to the next item in the bucket and returns its key and value. +// If the cursor is at the end of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Next() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + k, v, flags := c.next() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Prev moves the cursor to the previous item in the bucket and returns its key and value. +// If the cursor is at the beginning of the bucket then a nil key and value are returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Prev() (key []byte, value []byte) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Attempt to move back one element until we're successful. + // Move up the stack as we hit the beginning of each page in our stack. + for i := len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index > 0 { + elem.index-- + break + } + c.stack = c.stack[:i] + } + + // If we've hit the end then return nil. + if len(c.stack) == 0 { + return nil, nil + } + + // Move down the stack to find the last element of the last leaf under this branch. + c.last() + k, v, flags := c.keyValue() + if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. If no keys +// follow, a nil key is returned. +// The returned key and value are only valid for the life of the transaction. +func (c *Cursor) Seek(seek []byte) (key []byte, value []byte) { + k, v, flags := c.seek(seek) + + // If we ended up after the last element of a page then move to the next one. + if ref := &c.stack[len(c.stack)-1]; ref.index >= ref.count() { + k, v, flags = c.next() + } + + if k == nil { + return nil, nil + } else if (flags & uint32(bucketLeafFlag)) != 0 { + return k, nil + } + return k, v +} + +// Delete removes the current key/value under the cursor from the bucket. +// Delete fails if current key/value is a bucket or if the transaction is not writable. +func (c *Cursor) Delete() error { + if c.bucket.tx.db == nil { + return ErrTxClosed + } else if !c.bucket.Writable() { + return ErrTxNotWritable + } + + key, _, flags := c.keyValue() + // Return an error if current value is a bucket. + if (flags & bucketLeafFlag) != 0 { + return ErrIncompatibleValue + } + c.node().del(key) + + return nil +} + +// seek moves the cursor to a given key and returns it. +// If the key does not exist then the next key is used. +func (c *Cursor) seek(seek []byte) (key []byte, value []byte, flags uint32) { + _assert(c.bucket.tx.db != nil, "tx closed") + + // Start from root page/node and traverse to correct page. + c.stack = c.stack[:0] + c.search(seek, c.bucket.root) + ref := &c.stack[len(c.stack)-1] + + // If the cursor is pointing to the end of page/node then return nil. + if ref.index >= ref.count() { + return nil, nil, 0 + } + + // If this is a bucket then return a nil value. + return c.keyValue() +} + +// first moves the cursor to the first leaf element under the last page in the stack. +func (c *Cursor) first() { + for { + // Exit when we hit a leaf page. + var ref = &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the first element to the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + c.stack = append(c.stack, elemRef{page: p, node: n, index: 0}) + } +} + +// last moves the cursor to the last leaf element under the last page in the stack. +func (c *Cursor) last() { + for { + // Exit when we hit a leaf page. + ref := &c.stack[len(c.stack)-1] + if ref.isLeaf() { + break + } + + // Keep adding pages pointing to the last element in the stack. + var pgid pgid + if ref.node != nil { + pgid = ref.node.inodes[ref.index].pgid + } else { + pgid = ref.page.branchPageElement(uint16(ref.index)).pgid + } + p, n := c.bucket.pageNode(pgid) + + var nextRef = elemRef{page: p, node: n} + nextRef.index = nextRef.count() - 1 + c.stack = append(c.stack, nextRef) + } +} + +// next moves to the next leaf element and returns the key and value. +// If the cursor is at the last leaf element then it stays there and returns nil. +func (c *Cursor) next() (key []byte, value []byte, flags uint32) { + for { + // Attempt to move over one element until we're successful. + // Move up the stack as we hit the end of each page in our stack. + var i int + for i = len(c.stack) - 1; i >= 0; i-- { + elem := &c.stack[i] + if elem.index < elem.count()-1 { + elem.index++ + break + } + } + + // If we've hit the root page then stop and return. This will leave the + // cursor on the last element of the last page. + if i == -1 { + return nil, nil, 0 + } + + // Otherwise start from where we left off in the stack and find the + // first element of the first leaf page. + c.stack = c.stack[:i+1] + c.first() + + // If this is an empty page then restart and move back up the stack. + // https://github.com/boltdb/bolt/issues/450 + if c.stack[len(c.stack)-1].count() == 0 { + continue + } + + return c.keyValue() + } +} + +// search recursively performs a binary search against a given page/node until it finds a given key. +func (c *Cursor) search(key []byte, pgid pgid) { + p, n := c.bucket.pageNode(pgid) + if p != nil && (p.flags&(branchPageFlag|leafPageFlag)) == 0 { + panic(fmt.Sprintf("invalid page type: %d: %x", p.id, p.flags)) + } + e := elemRef{page: p, node: n} + c.stack = append(c.stack, e) + + // If we're on a leaf page/node then find the specific node. + if e.isLeaf() { + c.nsearch(key) + return + } + + if n != nil { + c.searchNode(key, n) + return + } + c.searchPage(key, p) +} + +func (c *Cursor) searchNode(key []byte, n *node) { + var exact bool + index := sort.Search(len(n.inodes), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(n.inodes[i].key, key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, n.inodes[index].pgid) +} + +func (c *Cursor) searchPage(key []byte, p *page) { + // Binary search for the correct range. + inodes := p.branchPageElements() + + var exact bool + index := sort.Search(int(p.count), func(i int) bool { + // TODO(benbjohnson): Optimize this range search. It's a bit hacky right now. + // sort.Search() finds the lowest index where f() != -1 but we need the highest index. + ret := bytes.Compare(inodes[i].key(), key) + if ret == 0 { + exact = true + } + return ret != -1 + }) + if !exact && index > 0 { + index-- + } + c.stack[len(c.stack)-1].index = index + + // Recursively search to the next page. + c.search(key, inodes[index].pgid) +} + +// nsearch searches the leaf node on the top of the stack for a key. +func (c *Cursor) nsearch(key []byte) { + e := &c.stack[len(c.stack)-1] + p, n := e.page, e.node + + // If we have a node then search its inodes. + if n != nil { + index := sort.Search(len(n.inodes), func(i int) bool { + return bytes.Compare(n.inodes[i].key, key) != -1 + }) + e.index = index + return + } + + // If we have a page then search its leaf elements. + inodes := p.leafPageElements() + index := sort.Search(int(p.count), func(i int) bool { + return bytes.Compare(inodes[i].key(), key) != -1 + }) + e.index = index +} + +// keyValue returns the key and value of the current leaf element. +func (c *Cursor) keyValue() ([]byte, []byte, uint32) { + ref := &c.stack[len(c.stack)-1] + if ref.count() == 0 || ref.index >= ref.count() { + return nil, nil, 0 + } + + // Retrieve value from node. + if ref.node != nil { + inode := &ref.node.inodes[ref.index] + return inode.key, inode.value, inode.flags + } + + // Or retrieve value from page. + elem := ref.page.leafPageElement(uint16(ref.index)) + return elem.key(), elem.value(), elem.flags +} + +// node returns the node that the cursor is currently positioned on. +func (c *Cursor) node() *node { + _assert(len(c.stack) > 0, "accessing a node with a zero-length cursor stack") + + // If the top of the stack is a leaf node then just return it. + if ref := &c.stack[len(c.stack)-1]; ref.node != nil && ref.isLeaf() { + return ref.node + } + + // Start from root and traverse down the hierarchy. + var n = c.stack[0].node + if n == nil { + n = c.bucket.node(c.stack[0].page.id, nil) + } + for _, ref := range c.stack[:len(c.stack)-1] { + _assert(!n.isLeaf, "expected branch node") + n = n.childAt(int(ref.index)) + } + _assert(n.isLeaf, "expected leaf node") + return n +} + +// elemRef represents a reference to an element on a given page/node. +type elemRef struct { + page *page + node *node + index int +} + +// isLeaf returns whether the ref is pointing at a leaf page/node. +func (r *elemRef) isLeaf() bool { + if r.node != nil { + return r.node.isLeaf + } + return (r.page.flags & leafPageFlag) != 0 +} + +// count returns the number of inodes or page elements. +func (r *elemRef) count() int { + if r.node != nil { + return len(r.node.inodes) + } + return int(r.page.count) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/db.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/db.go new file mode 100755 index 0000000..f352ff1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/db.go @@ -0,0 +1,1039 @@ +package bolt + +import ( + "errors" + "fmt" + "hash/fnv" + "log" + "os" + "runtime" + "runtime/debug" + "strings" + "sync" + "time" + "unsafe" +) + +// The largest step that can be taken when remapping the mmap. +const maxMmapStep = 1 << 30 // 1GB + +// The data file format version. +const version = 2 + +// Represents a marker value to indicate that a file is a Bolt DB. +const magic uint32 = 0xED0CDAED + +// IgnoreNoSync specifies whether the NoSync field of a DB is ignored when +// syncing changes to a file. This is required as some operating systems, +// such as OpenBSD, do not have a unified buffer cache (UBC) and writes +// must be synchronized using the msync(2) syscall. +const IgnoreNoSync = runtime.GOOS == "openbsd" + +// Default values if not set in a DB instance. +const ( + DefaultMaxBatchSize int = 1000 + DefaultMaxBatchDelay = 10 * time.Millisecond + DefaultAllocSize = 16 * 1024 * 1024 +) + +// default page size for db is set to the OS page size. +var defaultPageSize = os.Getpagesize() + +// DB represents a collection of buckets persisted to a file on disk. +// All data access is performed through transactions which can be obtained through the DB. +// All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. +type DB struct { + // When enabled, the database will perform a Check() after every commit. + // A panic is issued if the database is in an inconsistent state. This + // flag has a large performance impact so it should only be used for + // debugging purposes. + StrictMode bool + + // Setting the NoSync flag will cause the database to skip fsync() + // calls after each commit. This can be useful when bulk loading data + // into a database and you can restart the bulk load in the event of + // a system failure or database corruption. Do not set this flag for + // normal use. + // + // If the package global IgnoreNoSync constant is true, this value is + // ignored. See the comment on that constant for more details. + // + // THIS IS UNSAFE. PLEASE USE WITH CAUTION. + NoSync bool + + // When true, skips the truncate call when growing the database. + // Setting this to true is only safe on non-ext3/ext4 systems. + // Skipping truncation avoids preallocation of hard drive space and + // bypasses a truncate() and fsync() syscall on remapping. + // + // https://github.com/boltdb/bolt/issues/284 + NoGrowSync bool + + // If you want to read the entire database fast, you can set MmapFlag to + // syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. + MmapFlags int + + // MaxBatchSize is the maximum size of a batch. Default value is + // copied from DefaultMaxBatchSize in Open. + // + // If <=0, disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchSize int + + // MaxBatchDelay is the maximum delay before a batch starts. + // Default value is copied from DefaultMaxBatchDelay in Open. + // + // If <=0, effectively disables batching. + // + // Do not change concurrently with calls to Batch. + MaxBatchDelay time.Duration + + // AllocSize is the amount of space allocated when the database + // needs to create new pages. This is done to amortize the cost + // of truncate() and fsync() when growing the data file. + AllocSize int + + path string + file *os.File + lockfile *os.File // windows only + dataref []byte // mmap'ed readonly, write throws SEGV + data *[maxMapSize]byte + datasz int + filesz int // current on disk file size + meta0 *meta + meta1 *meta + pageSize int + opened bool + rwtx *Tx + txs []*Tx + freelist *freelist + stats Stats + + pagePool sync.Pool + + batchMu sync.Mutex + batch *batch + + rwlock sync.Mutex // Allows only one writer at a time. + metalock sync.Mutex // Protects meta page access. + mmaplock sync.RWMutex // Protects mmap access during remapping. + statlock sync.RWMutex // Protects stats access. + + ops struct { + writeAt func(b []byte, off int64) (n int, err error) + } + + // Read only mode. + // When true, Update() and Begin(true) return ErrDatabaseReadOnly immediately. + readOnly bool +} + +// Path returns the path to currently open database file. +func (db *DB) Path() string { + return db.path +} + +// GoString returns the Go string representation of the database. +func (db *DB) GoString() string { + return fmt.Sprintf("bolt.DB{path:%q}", db.path) +} + +// String returns the string representation of the database. +func (db *DB) String() string { + return fmt.Sprintf("DB<%q>", db.path) +} + +// Open creates and opens a database at the given path. +// If the file does not exist then it will be created automatically. +// Passing in nil options will cause Bolt to open the database with the default options. +func Open(path string, mode os.FileMode, options *Options) (*DB, error) { + var db = &DB{opened: true} + + // Set default options if no options are provided. + if options == nil { + options = DefaultOptions + } + db.NoGrowSync = options.NoGrowSync + db.MmapFlags = options.MmapFlags + + // Set default values for later DB operations. + db.MaxBatchSize = DefaultMaxBatchSize + db.MaxBatchDelay = DefaultMaxBatchDelay + db.AllocSize = DefaultAllocSize + + flag := os.O_RDWR + if options.ReadOnly { + flag = os.O_RDONLY + db.readOnly = true + } + + // Open data file and separate sync handler for metadata writes. + db.path = path + var err error + if db.file, err = os.OpenFile(db.path, flag|os.O_CREATE, mode); err != nil { + _ = db.close() + return nil, err + } + + // Lock file so that other processes using Bolt in read-write mode cannot + // use the database at the same time. This would cause corruption since + // the two processes would write meta pages and free pages separately. + // The database file is locked exclusively (only one process can grab the lock) + // if !options.ReadOnly. + // The database file is locked using the shared lock (more than one process may + // hold a lock at the same time) otherwise (options.ReadOnly is set). + if err := flock(db, mode, !db.readOnly, options.Timeout); err != nil { + _ = db.close() + return nil, err + } + + // Default values for test hooks + db.ops.writeAt = db.file.WriteAt + + // Initialize the database if it doesn't exist. + if info, err := db.file.Stat(); err != nil { + return nil, err + } else if info.Size() == 0 { + // Initialize new files with meta pages. + if err := db.init(); err != nil { + return nil, err + } + } else { + // Read the first meta page to determine the page size. + var buf [0x1000]byte + if _, err := db.file.ReadAt(buf[:], 0); err == nil { + m := db.pageInBuffer(buf[:], 0).meta() + if err := m.validate(); err != nil { + // If we can't read the page size, we can assume it's the same + // as the OS -- since that's how the page size was chosen in the + // first place. + // + // If the first page is invalid and this OS uses a different + // page size than what the database was created with then we + // are out of luck and cannot access the database. + db.pageSize = os.Getpagesize() + } else { + db.pageSize = int(m.pageSize) + } + } + } + + // Initialize page pool. + db.pagePool = sync.Pool{ + New: func() interface{} { + return make([]byte, db.pageSize) + }, + } + + // Memory map the data file. + if err := db.mmap(options.InitialMmapSize); err != nil { + _ = db.close() + return nil, err + } + + // Read in the freelist. + db.freelist = newFreelist() + db.freelist.read(db.page(db.meta().freelist)) + + // Mark the database as opened and return. + return db, nil +} + +// mmap opens the underlying memory-mapped file and initializes the meta references. +// minsz is the minimum size that the new mmap can be. +func (db *DB) mmap(minsz int) error { + db.mmaplock.Lock() + defer db.mmaplock.Unlock() + + info, err := db.file.Stat() + if err != nil { + return fmt.Errorf("mmap stat error: %s", err) + } else if int(info.Size()) < db.pageSize*2 { + return fmt.Errorf("file size too small") + } + + // Ensure the size is at least the minimum size. + var size = int(info.Size()) + if size < minsz { + size = minsz + } + size, err = db.mmapSize(size) + if err != nil { + return err + } + + // Dereference all mmap references before unmapping. + if db.rwtx != nil { + db.rwtx.root.dereference() + } + + // Unmap existing data before continuing. + if err := db.munmap(); err != nil { + return err + } + + // Memory-map the data file as a byte slice. + if err := mmap(db, size); err != nil { + return err + } + + // Save references to the meta pages. + db.meta0 = db.page(0).meta() + db.meta1 = db.page(1).meta() + + // Validate the meta pages. We only return an error if both meta pages fail + // validation, since meta0 failing validation means that it wasn't saved + // properly -- but we can recover using meta1. And vice-versa. + err0 := db.meta0.validate() + err1 := db.meta1.validate() + if err0 != nil && err1 != nil { + return err0 + } + + return nil +} + +// munmap unmaps the data file from memory. +func (db *DB) munmap() error { + if err := munmap(db); err != nil { + return fmt.Errorf("unmap error: " + err.Error()) + } + return nil +} + +// mmapSize determines the appropriate size for the mmap given the current size +// of the database. The minimum size is 32KB and doubles until it reaches 1GB. +// Returns an error if the new mmap size is greater than the max allowed. +func (db *DB) mmapSize(size int) (int, error) { + // Double the size from 32KB until 1GB. + for i := uint(15); i <= 30; i++ { + if size <= 1< maxMapSize { + return 0, fmt.Errorf("mmap too large") + } + + // If larger than 1GB then grow by 1GB at a time. + sz := int64(size) + if remainder := sz % int64(maxMmapStep); remainder > 0 { + sz += int64(maxMmapStep) - remainder + } + + // Ensure that the mmap size is a multiple of the page size. + // This should always be true since we're incrementing in MBs. + pageSize := int64(db.pageSize) + if (sz % pageSize) != 0 { + sz = ((sz / pageSize) + 1) * pageSize + } + + // If we've exceeded the max size then only grow up to the max size. + if sz > maxMapSize { + sz = maxMapSize + } + + return int(sz), nil +} + +// init creates a new database file and initializes its meta pages. +func (db *DB) init() error { + // Set the page size to the OS page size. + db.pageSize = os.Getpagesize() + + // Create two meta pages on a buffer. + buf := make([]byte, db.pageSize*4) + for i := 0; i < 2; i++ { + p := db.pageInBuffer(buf[:], pgid(i)) + p.id = pgid(i) + p.flags = metaPageFlag + + // Initialize the meta page. + m := p.meta() + m.magic = magic + m.version = version + m.pageSize = uint32(db.pageSize) + m.freelist = 2 + m.root = bucket{root: 3} + m.pgid = 4 + m.txid = txid(i) + m.checksum = m.sum64() + } + + // Write an empty freelist at page 3. + p := db.pageInBuffer(buf[:], pgid(2)) + p.id = pgid(2) + p.flags = freelistPageFlag + p.count = 0 + + // Write an empty leaf page at page 4. + p = db.pageInBuffer(buf[:], pgid(3)) + p.id = pgid(3) + p.flags = leafPageFlag + p.count = 0 + + // Write the buffer to our data file. + if _, err := db.ops.writeAt(buf, 0); err != nil { + return err + } + if err := fdatasync(db); err != nil { + return err + } + + return nil +} + +// Close releases all database resources. +// All transactions must be closed before closing the database. +func (db *DB) Close() error { + db.rwlock.Lock() + defer db.rwlock.Unlock() + + db.metalock.Lock() + defer db.metalock.Unlock() + + db.mmaplock.RLock() + defer db.mmaplock.RUnlock() + + return db.close() +} + +func (db *DB) close() error { + if !db.opened { + return nil + } + + db.opened = false + + db.freelist = nil + + // Clear ops. + db.ops.writeAt = nil + + // Close the mmap. + if err := db.munmap(); err != nil { + return err + } + + // Close file handles. + if db.file != nil { + // No need to unlock read-only file. + if !db.readOnly { + // Unlock the file. + if err := funlock(db); err != nil { + log.Printf("bolt.Close(): funlock error: %s", err) + } + } + + // Close the file descriptor. + if err := db.file.Close(); err != nil { + return fmt.Errorf("db file close: %s", err) + } + db.file = nil + } + + db.path = "" + return nil +} + +// Begin starts a new transaction. +// Multiple read-only transactions can be used concurrently but only one +// write transaction can be used at a time. Starting multiple write transactions +// will cause the calls to block and be serialized until the current write +// transaction finishes. +// +// Transactions should not be dependent on one another. Opening a read +// transaction and a write transaction in the same goroutine can cause the +// writer to deadlock because the database periodically needs to re-mmap itself +// as it grows and it cannot do that while a read transaction is open. +// +// If a long running read transaction (for example, a snapshot transaction) is +// needed, you might want to set DB.InitialMmapSize to a large enough value +// to avoid potential blocking of write transaction. +// +// IMPORTANT: You must close read-only transactions after you are finished or +// else the database will not reclaim old pages. +func (db *DB) Begin(writable bool) (*Tx, error) { + if writable { + return db.beginRWTx() + } + return db.beginTx() +} + +func (db *DB) beginTx() (*Tx, error) { + // Lock the meta pages while we initialize the transaction. We obtain + // the meta lock before the mmap lock because that's the order that the + // write transaction will obtain them. + db.metalock.Lock() + + // Obtain a read-only lock on the mmap. When the mmap is remapped it will + // obtain a write lock so all transactions must finish before it can be + // remapped. + db.mmaplock.RLock() + + // Exit if the database is not open yet. + if !db.opened { + db.mmaplock.RUnlock() + db.metalock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{} + t.init(db) + + // Keep track of transaction until it closes. + db.txs = append(db.txs, t) + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Update the transaction stats. + db.statlock.Lock() + db.stats.TxN++ + db.stats.OpenTxN = n + db.statlock.Unlock() + + return t, nil +} + +func (db *DB) beginRWTx() (*Tx, error) { + // If the database was opened with Options.ReadOnly, return an error. + if db.readOnly { + return nil, ErrDatabaseReadOnly + } + + // Obtain writer lock. This is released by the transaction when it closes. + // This enforces only one writer transaction at a time. + db.rwlock.Lock() + + // Once we have the writer lock then we can lock the meta pages so that + // we can set up the transaction. + db.metalock.Lock() + defer db.metalock.Unlock() + + // Exit if the database is not open yet. + if !db.opened { + db.rwlock.Unlock() + return nil, ErrDatabaseNotOpen + } + + // Create a transaction associated with the database. + t := &Tx{writable: true} + t.init(db) + db.rwtx = t + + // Free any pages associated with closed read-only transactions. + var minid txid = 0xFFFFFFFFFFFFFFFF + for _, t := range db.txs { + if t.meta.txid < minid { + minid = t.meta.txid + } + } + if minid > 0 { + db.freelist.release(minid - 1) + } + + return t, nil +} + +// removeTx removes a transaction from the database. +func (db *DB) removeTx(tx *Tx) { + // Release the read lock on the mmap. + db.mmaplock.RUnlock() + + // Use the meta lock to restrict access to the DB object. + db.metalock.Lock() + + // Remove the transaction. + for i, t := range db.txs { + if t == tx { + last := len(db.txs) - 1 + db.txs[i] = db.txs[last] + db.txs[last] = nil + db.txs = db.txs[:last] + break + } + } + n := len(db.txs) + + // Unlock the meta pages. + db.metalock.Unlock() + + // Merge statistics. + db.statlock.Lock() + db.stats.OpenTxN = n + db.stats.TxStats.add(&tx.stats) + db.statlock.Unlock() +} + +// Update executes a function within the context of a read-write managed transaction. +// If no error is returned from the function then the transaction is committed. +// If an error is returned then the entire transaction is rolled back. +// Any error that is returned from the function or returned from the commit is +// returned from the Update() method. +// +// Attempting to manually commit or rollback within the function will cause a panic. +func (db *DB) Update(fn func(*Tx) error) error { + t, err := db.Begin(true) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually commit. + t.managed = true + + // If an error is returned from the function then rollback and return error. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + return t.Commit() +} + +// View executes a function within the context of a managed read-only transaction. +// Any error that is returned from the function is returned from the View() method. +// +// Attempting to manually rollback within the function will cause a panic. +func (db *DB) View(fn func(*Tx) error) error { + t, err := db.Begin(false) + if err != nil { + return err + } + + // Make sure the transaction rolls back in the event of a panic. + defer func() { + if t.db != nil { + t.rollback() + } + }() + + // Mark as a managed tx so that the inner function cannot manually rollback. + t.managed = true + + // If an error is returned from the function then pass it through. + err = fn(t) + t.managed = false + if err != nil { + _ = t.Rollback() + return err + } + + if err := t.Rollback(); err != nil { + return err + } + + return nil +} + +// Batch calls fn as part of a batch. It behaves similar to Update, +// except: +// +// 1. concurrent Batch calls can be combined into a single Bolt +// transaction. +// +// 2. the function passed to Batch may be called multiple times, +// regardless of whether it returns error or not. +// +// This means that Batch function side effects must be idempotent and +// take permanent effect only after a successful return is seen in +// caller. +// +// The maximum batch size and delay can be adjusted with DB.MaxBatchSize +// and DB.MaxBatchDelay, respectively. +// +// Batch is only useful when there are multiple goroutines calling it. +func (db *DB) Batch(fn func(*Tx) error) error { + errCh := make(chan error, 1) + + db.batchMu.Lock() + if (db.batch == nil) || (db.batch != nil && len(db.batch.calls) >= db.MaxBatchSize) { + // There is no existing batch, or the existing batch is full; start a new one. + db.batch = &batch{ + db: db, + } + db.batch.timer = time.AfterFunc(db.MaxBatchDelay, db.batch.trigger) + } + db.batch.calls = append(db.batch.calls, call{fn: fn, err: errCh}) + if len(db.batch.calls) >= db.MaxBatchSize { + // wake up batch, it's ready to run + go db.batch.trigger() + } + db.batchMu.Unlock() + + err := <-errCh + if err == trySolo { + err = db.Update(fn) + } + return err +} + +type call struct { + fn func(*Tx) error + err chan<- error +} + +type batch struct { + db *DB + timer *time.Timer + start sync.Once + calls []call +} + +// trigger runs the batch if it hasn't already been run. +func (b *batch) trigger() { + b.start.Do(b.run) +} + +// run performs the transactions in the batch and communicates results +// back to DB.Batch. +func (b *batch) run() { + b.db.batchMu.Lock() + b.timer.Stop() + // Make sure no new work is added to this batch, but don't break + // other batches. + if b.db.batch == b { + b.db.batch = nil + } + b.db.batchMu.Unlock() + +retry: + for len(b.calls) > 0 { + var failIdx = -1 + err := b.db.Update(func(tx *Tx) error { + for i, c := range b.calls { + if err := safelyCall(c.fn, tx); err != nil { + failIdx = i + return err + } + } + return nil + }) + + if failIdx >= 0 { + // take the failing transaction out of the batch. it's + // safe to shorten b.calls here because db.batch no longer + // points to us, and we hold the mutex anyway. + c := b.calls[failIdx] + b.calls[failIdx], b.calls = b.calls[len(b.calls)-1], b.calls[:len(b.calls)-1] + // tell the submitter re-run it solo, continue with the rest of the batch + c.err <- trySolo + continue retry + } + + // pass success, or bolt internal errors, to all callers + for _, c := range b.calls { + if c.err != nil { + c.err <- err + } + } + break retry + } +} + +// trySolo is a special sentinel error value used for signaling that a +// transaction function should be re-run. It should never be seen by +// callers. +var trySolo = errors.New("batch function returned an error and should be re-run solo") + +type panicked struct { + reason interface{} +} + +func (p panicked) Error() string { + if err, ok := p.reason.(error); ok { + return err.Error() + } + return fmt.Sprintf("panic: %v", p.reason) +} + +func safelyCall(fn func(*Tx) error, tx *Tx) (err error) { + defer func() { + if p := recover(); p != nil { + err = panicked{p} + } + }() + return fn(tx) +} + +// Sync executes fdatasync() against the database file handle. +// +// This is not necessary under normal operation, however, if you use NoSync +// then it allows you to force the database file to sync against the disk. +func (db *DB) Sync() error { return fdatasync(db) } + +// Stats retrieves ongoing performance stats for the database. +// This is only updated when a transaction closes. +func (db *DB) Stats() Stats { + db.statlock.RLock() + defer db.statlock.RUnlock() + return db.stats +} + +// This is for internal access to the raw data bytes from the C cursor, use +// carefully, or not at all. +func (db *DB) Info() *Info { + return &Info{uintptr(unsafe.Pointer(&db.data[0])), db.pageSize} +} + +// page retrieves a page reference from the mmap based on the current page size. +func (db *DB) page(id pgid) *page { + pos := id * pgid(db.pageSize) + return (*page)(unsafe.Pointer(&db.data[pos])) +} + +// pageInBuffer retrieves a page reference from a given byte array based on the current page size. +func (db *DB) pageInBuffer(b []byte, id pgid) *page { + return (*page)(unsafe.Pointer(&b[id*pgid(db.pageSize)])) +} + +// meta retrieves the current meta page reference. +func (db *DB) meta() *meta { + // We have to return the meta with the highest txid which doesn't fail + // validation. Otherwise, we can cause errors when in fact the database is + // in a consistent state. metaA is the one with the higher txid. + metaA := db.meta0 + metaB := db.meta1 + if db.meta1.txid > db.meta0.txid { + metaA = db.meta1 + metaB = db.meta0 + } + + // Use higher meta page if valid. Otherwise fallback to previous, if valid. + if err := metaA.validate(); err == nil { + return metaA + } else if err := metaB.validate(); err == nil { + return metaB + } + + // This should never be reached, because both meta1 and meta0 were validated + // on mmap() and we do fsync() on every write. + panic("bolt.DB.meta(): invalid meta pages") +} + +// allocate returns a contiguous block of memory starting at a given page. +func (db *DB) allocate(count int) (*page, error) { + // Allocate a temporary buffer for the page. + var buf []byte + if count == 1 { + buf = db.pagePool.Get().([]byte) + } else { + buf = make([]byte, count*db.pageSize) + } + p := (*page)(unsafe.Pointer(&buf[0])) + p.overflow = uint32(count - 1) + + // Use pages from the freelist if they are available. + if p.id = db.freelist.allocate(count); p.id != 0 { + return p, nil + } + + // Resize mmap() if we're at the end. + p.id = db.rwtx.meta.pgid + var minsz = int((p.id+pgid(count))+1) * db.pageSize + if minsz >= db.datasz { + if err := db.mmap(minsz); err != nil { + return nil, fmt.Errorf("mmap allocate error: %s", err) + } + } + + // Move the page id high water mark. + db.rwtx.meta.pgid += pgid(count) + + return p, nil +} + +// grow grows the size of the database to the given sz. +func (db *DB) grow(sz int) error { + // Ignore if the new size is less than available file size. + if sz <= db.filesz { + return nil + } + + // If the data is smaller than the alloc size then only allocate what's needed. + // Once it goes over the allocation size then allocate in chunks. + if db.datasz < db.AllocSize { + sz = db.datasz + } else { + sz += db.AllocSize + } + + // Truncate and fsync to ensure file size metadata is flushed. + // https://github.com/boltdb/bolt/issues/284 + if !db.NoGrowSync && !db.readOnly { + if runtime.GOOS != "windows" { + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("file resize error: %s", err) + } + } + if err := db.file.Sync(); err != nil { + return fmt.Errorf("file sync error: %s", err) + } + } + + db.filesz = sz + return nil +} + +func (db *DB) IsReadOnly() bool { + return db.readOnly +} + +// Options represents the options that can be set when opening a database. +type Options struct { + // Timeout is the amount of time to wait to obtain a file lock. + // When set to zero it will wait indefinitely. This option is only + // available on Darwin and Linux. + Timeout time.Duration + + // Sets the DB.NoGrowSync flag before memory mapping the file. + NoGrowSync bool + + // Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to + // grab a shared lock (UNIX). + ReadOnly bool + + // Sets the DB.MmapFlags flag before memory mapping the file. + MmapFlags int + + // InitialMmapSize is the initial mmap size of the database + // in bytes. Read transactions won't block write transaction + // if the InitialMmapSize is large enough to hold database mmap + // size. (See DB.Begin for more information) + // + // If <=0, the initial map size is 0. + // If initialMmapSize is smaller than the previous database size, + // it takes no effect. + InitialMmapSize int +} + +// DefaultOptions represent the options used if nil options are passed into Open(). +// No timeout is used which will cause Bolt to wait indefinitely for a lock. +var DefaultOptions = &Options{ + Timeout: 0, + NoGrowSync: false, +} + +// Stats represents statistics about the database. +type Stats struct { + // Freelist stats + FreePageN int // total number of free pages on the freelist + PendingPageN int // total number of pending pages on the freelist + FreeAlloc int // total bytes allocated in free pages + FreelistInuse int // total bytes used by the freelist + + // Transaction stats + TxN int // total number of started read transactions + OpenTxN int // number of currently open read transactions + + TxStats TxStats // global, ongoing stats. +} + +// Sub calculates and returns the difference between two sets of database stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *Stats) Sub(other *Stats) Stats { + if other == nil { + return *s + } + var diff Stats + diff.FreePageN = s.FreePageN + diff.PendingPageN = s.PendingPageN + diff.FreeAlloc = s.FreeAlloc + diff.FreelistInuse = s.FreelistInuse + diff.TxN = s.TxN - other.TxN + diff.TxStats = s.TxStats.Sub(&other.TxStats) + return diff +} + +func (s *Stats) add(other *Stats) { + s.TxStats.add(&other.TxStats) +} + +type Info struct { + Data uintptr + PageSize int +} + +type meta struct { + magic uint32 + version uint32 + pageSize uint32 + flags uint32 + root bucket + freelist pgid + pgid pgid + txid txid + checksum uint64 +} + +// validate checks the marker bytes and version of the meta page to ensure it matches this binary. +func (m *meta) validate() error { + if m.magic != magic { + return ErrInvalid + } else if m.version != version { + return ErrVersionMismatch + } else if m.checksum != 0 && m.checksum != m.sum64() { + return ErrChecksum + } + return nil +} + +// copy copies one meta object to another. +func (m *meta) copy(dest *meta) { + *dest = *m +} + +// write writes the meta onto a page. +func (m *meta) write(p *page) { + if m.root.root >= m.pgid { + panic(fmt.Sprintf("root bucket pgid (%d) above high water mark (%d)", m.root.root, m.pgid)) + } else if m.freelist >= m.pgid { + panic(fmt.Sprintf("freelist pgid (%d) above high water mark (%d)", m.freelist, m.pgid)) + } + + // Page id is either going to be 0 or 1 which we can determine by the transaction ID. + p.id = pgid(m.txid % 2) + p.flags |= metaPageFlag + + // Calculate the checksum. + m.checksum = m.sum64() + + m.copy(p.meta()) +} + +// generates the checksum for the meta. +func (m *meta) sum64() uint64 { + var h = fnv.New64a() + _, _ = h.Write((*[unsafe.Offsetof(meta{}.checksum)]byte)(unsafe.Pointer(m))[:]) + return h.Sum64() +} + +// _assert will panic with a given formatted message if the given condition is false. +func _assert(condition bool, msg string, v ...interface{}) { + if !condition { + panic(fmt.Sprintf("assertion failed: "+msg, v...)) + } +} + +func warn(v ...interface{}) { fmt.Fprintln(os.Stderr, v...) } +func warnf(msg string, v ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", v...) } + +func printstack() { + stack := strings.Join(strings.Split(string(debug.Stack()), "\n")[2:], "\n") + fmt.Fprintln(os.Stderr, stack) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/doc.go new file mode 100755 index 0000000..cc93784 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/doc.go @@ -0,0 +1,44 @@ +/* +Package bolt implements a low-level key/value store in pure Go. It supports +fully serializable transactions, ACID semantics, and lock-free MVCC with +multiple readers and a single writer. Bolt can be used for projects that +want a simple data store without the need to add large dependencies such as +Postgres or MySQL. + +Bolt is a single-level, zero-copy, B+tree data store. This means that Bolt is +optimized for fast read access and does not require recovery in the event of a +system crash. Transactions which have not finished committing will simply be +rolled back in the event of a crash. + +The design of Bolt is based on Howard Chu's LMDB database project. + +Bolt currently works on Windows, Mac OS X, and Linux. + + +Basics + +There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is +a collection of buckets and is represented by a single file on disk. A bucket is +a collection of unique keys that are associated with values. + +Transactions provide either read-only or read-write access to the database. +Read-only transactions can retrieve key/value pairs and can use Cursors to +iterate over the dataset sequentially. Read-write transactions can create and +delete buckets and can insert and remove keys. Only one read-write transaction +is allowed at a time. + + +Caveats + +The database uses a read-only, memory-mapped data file to ensure that +applications cannot corrupt the database, however, this means that keys and +values returned from Bolt cannot be changed. Writing to a read-only byte slice +will cause Go to panic. + +Keys and values retrieved from the database are only valid for the life of +the transaction. When used outside the transaction, these byte slices can +point to different data or can point to invalid memory which will cause a panic. + + +*/ +package bolt diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/errors.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/errors.go new file mode 100755 index 0000000..a3620a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/errors.go @@ -0,0 +1,71 @@ +package bolt + +import "errors" + +// These errors can be returned when opening or calling methods on a DB. +var ( + // ErrDatabaseNotOpen is returned when a DB instance is accessed before it + // is opened or after it is closed. + ErrDatabaseNotOpen = errors.New("database not open") + + // ErrDatabaseOpen is returned when opening a database that is + // already open. + ErrDatabaseOpen = errors.New("database already open") + + // ErrInvalid is returned when both meta pages on a database are invalid. + // This typically occurs when a file is not a bolt database. + ErrInvalid = errors.New("invalid database") + + // ErrVersionMismatch is returned when the data file was created with a + // different version of Bolt. + ErrVersionMismatch = errors.New("version mismatch") + + // ErrChecksum is returned when either meta page checksum does not match. + ErrChecksum = errors.New("checksum error") + + // ErrTimeout is returned when a database cannot obtain an exclusive lock + // on the data file after the timeout passed to Open(). + ErrTimeout = errors.New("timeout") +) + +// These errors can occur when beginning or committing a Tx. +var ( + // ErrTxNotWritable is returned when performing a write operation on a + // read-only transaction. + ErrTxNotWritable = errors.New("tx not writable") + + // ErrTxClosed is returned when committing or rolling back a transaction + // that has already been committed or rolled back. + ErrTxClosed = errors.New("tx closed") + + // ErrDatabaseReadOnly is returned when a mutating transaction is started on a + // read-only database. + ErrDatabaseReadOnly = errors.New("database is in read-only mode") +) + +// These errors can occur when putting or deleting a value or a bucket. +var ( + // ErrBucketNotFound is returned when trying to access a bucket that has + // not been created yet. + ErrBucketNotFound = errors.New("bucket not found") + + // ErrBucketExists is returned when creating a bucket that already exists. + ErrBucketExists = errors.New("bucket already exists") + + // ErrBucketNameRequired is returned when creating a bucket with a blank name. + ErrBucketNameRequired = errors.New("bucket name required") + + // ErrKeyRequired is returned when inserting a zero-length key. + ErrKeyRequired = errors.New("key required") + + // ErrKeyTooLarge is returned when inserting a key that is larger than MaxKeySize. + ErrKeyTooLarge = errors.New("key too large") + + // ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize. + ErrValueTooLarge = errors.New("value too large") + + // ErrIncompatibleValue is returned when trying create or delete a bucket + // on an existing non-bucket key or when trying to create or delete a + // non-bucket key on an existing bucket key. + ErrIncompatibleValue = errors.New("incompatible value") +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/freelist.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/freelist.go new file mode 100755 index 0000000..aba48f5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/freelist.go @@ -0,0 +1,252 @@ +package bolt + +import ( + "fmt" + "sort" + "unsafe" +) + +// freelist represents a list of all pages that are available for allocation. +// It also tracks pages that have been freed but are still in use by open transactions. +type freelist struct { + ids []pgid // all free and available free page ids. + pending map[txid][]pgid // mapping of soon-to-be free page ids by tx. + cache map[pgid]bool // fast lookup of all free and pending page ids. +} + +// newFreelist returns an empty, initialized freelist. +func newFreelist() *freelist { + return &freelist{ + pending: make(map[txid][]pgid), + cache: make(map[pgid]bool), + } +} + +// size returns the size of the page after serialization. +func (f *freelist) size() int { + n := f.count() + if n >= 0xFFFF { + // The first element will be used to store the count. See freelist.write. + n++ + } + return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * n) +} + +// count returns count of pages on the freelist +func (f *freelist) count() int { + return f.free_count() + f.pending_count() +} + +// free_count returns count of free pages +func (f *freelist) free_count() int { + return len(f.ids) +} + +// pending_count returns count of pending pages +func (f *freelist) pending_count() int { + var count int + for _, list := range f.pending { + count += len(list) + } + return count +} + +// copyall copies into dst a list of all free ids and all pending ids in one sorted list. +// f.count returns the minimum length required for dst. +func (f *freelist) copyall(dst []pgid) { + m := make(pgids, 0, f.pending_count()) + for _, list := range f.pending { + m = append(m, list...) + } + sort.Sort(m) + mergepgids(dst, f.ids, m) +} + +// allocate returns the starting page id of a contiguous list of pages of a given size. +// If a contiguous block cannot be found then 0 is returned. +func (f *freelist) allocate(n int) pgid { + if len(f.ids) == 0 { + return 0 + } + + var initial, previd pgid + for i, id := range f.ids { + if id <= 1 { + panic(fmt.Sprintf("invalid page allocation: %d", id)) + } + + // Reset initial page if this is not contiguous. + if previd == 0 || id-previd != 1 { + initial = id + } + + // If we found a contiguous block then remove it and return it. + if (id-initial)+1 == pgid(n) { + // If we're allocating off the beginning then take the fast path + // and just adjust the existing slice. This will use extra memory + // temporarily but the append() in free() will realloc the slice + // as is necessary. + if (i + 1) == n { + f.ids = f.ids[i+1:] + } else { + copy(f.ids[i-n+1:], f.ids[i+1:]) + f.ids = f.ids[:len(f.ids)-n] + } + + // Remove from the free cache. + for i := pgid(0); i < pgid(n); i++ { + delete(f.cache, initial+i) + } + + return initial + } + + previd = id + } + return 0 +} + +// free releases a page and its overflow for a given transaction id. +// If the page is already free then a panic will occur. +func (f *freelist) free(txid txid, p *page) { + if p.id <= 1 { + panic(fmt.Sprintf("cannot free page 0 or 1: %d", p.id)) + } + + // Free page and all its overflow pages. + var ids = f.pending[txid] + for id := p.id; id <= p.id+pgid(p.overflow); id++ { + // Verify that page is not already free. + if f.cache[id] { + panic(fmt.Sprintf("page %d already freed", id)) + } + + // Add to the freelist and cache. + ids = append(ids, id) + f.cache[id] = true + } + f.pending[txid] = ids +} + +// release moves all page ids for a transaction id (or older) to the freelist. +func (f *freelist) release(txid txid) { + m := make(pgids, 0) + for tid, ids := range f.pending { + if tid <= txid { + // Move transaction's pending pages to the available freelist. + // Don't remove from the cache since the page is still free. + m = append(m, ids...) + delete(f.pending, tid) + } + } + sort.Sort(m) + f.ids = pgids(f.ids).merge(m) +} + +// rollback removes the pages from a given pending tx. +func (f *freelist) rollback(txid txid) { + // Remove page ids from cache. + for _, id := range f.pending[txid] { + delete(f.cache, id) + } + + // Remove pages from pending list. + delete(f.pending, txid) +} + +// freed returns whether a given page is in the free list. +func (f *freelist) freed(pgid pgid) bool { + return f.cache[pgid] +} + +// read initializes the freelist from a freelist page. +func (f *freelist) read(p *page) { + // If the page.count is at the max uint16 value (64k) then it's considered + // an overflow and the size of the freelist is stored as the first element. + idx, count := 0, int(p.count) + if count == 0xFFFF { + idx = 1 + count = int(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0]) + } + + // Copy the list of page ids from the freelist. + if count == 0 { + f.ids = nil + } else { + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + f.ids = make([]pgid, len(ids)) + copy(f.ids, ids) + + // Make sure they're sorted. + sort.Sort(pgids(f.ids)) + } + + // Rebuild the page cache. + f.reindex() +} + +// write writes the page ids onto a freelist page. All free and pending ids are +// saved to disk since in the event of a program crash, all pending ids will +// become free. +func (f *freelist) write(p *page) error { + // Combine the old free pgids and pgids waiting on an open transaction. + + // Update the header flag. + p.flags |= freelistPageFlag + + // The page.count can only hold up to 64k elements so if we overflow that + // number then we handle it by putting the size in the first element. + lenids := f.count() + if lenids == 0 { + p.count = uint16(lenids) + } else if lenids < 0xFFFF { + p.count = uint16(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:]) + } else { + p.count = 0xFFFF + ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[0] = pgid(lenids) + f.copyall(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[1:]) + } + + return nil +} + +// reload reads the freelist from a page and filters out pending items. +func (f *freelist) reload(p *page) { + f.read(p) + + // Build a cache of only pending pages. + pcache := make(map[pgid]bool) + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + pcache[pendingID] = true + } + } + + // Check each page in the freelist and build a new available freelist + // with any pages not in the pending lists. + var a []pgid + for _, id := range f.ids { + if !pcache[id] { + a = append(a, id) + } + } + f.ids = a + + // Once the available list is rebuilt then rebuild the free cache so that + // it includes the available and pending free pages. + f.reindex() +} + +// reindex rebuilds the free cache based on available and pending free lists. +func (f *freelist) reindex() { + f.cache = make(map[pgid]bool, len(f.ids)) + for _, id := range f.ids { + f.cache[id] = true + } + for _, pendingIDs := range f.pending { + for _, pendingID := range pendingIDs { + f.cache[pendingID] = true + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/node.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/node.go new file mode 100755 index 0000000..159318b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/node.go @@ -0,0 +1,604 @@ +package bolt + +import ( + "bytes" + "fmt" + "sort" + "unsafe" +) + +// node represents an in-memory, deserialized page. +type node struct { + bucket *Bucket + isLeaf bool + unbalanced bool + spilled bool + key []byte + pgid pgid + parent *node + children nodes + inodes inodes +} + +// root returns the top-level node this node is attached to. +func (n *node) root() *node { + if n.parent == nil { + return n + } + return n.parent.root() +} + +// minKeys returns the minimum number of inodes this node should have. +func (n *node) minKeys() int { + if n.isLeaf { + return 1 + } + return 2 +} + +// size returns the size of the node after serialization. +func (n *node) size() int { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + } + return sz +} + +// sizeLessThan returns true if the node is less than a given size. +// This is an optimization to avoid calculating a large node when we only need +// to know if it fits inside a certain page size. +func (n *node) sizeLessThan(v int) bool { + sz, elsz := pageHeaderSize, n.pageElementSize() + for i := 0; i < len(n.inodes); i++ { + item := &n.inodes[i] + sz += elsz + len(item.key) + len(item.value) + if sz >= v { + return false + } + } + return true +} + +// pageElementSize returns the size of each page element based on the type of node. +func (n *node) pageElementSize() int { + if n.isLeaf { + return leafPageElementSize + } + return branchPageElementSize +} + +// childAt returns the child node at a given index. +func (n *node) childAt(index int) *node { + if n.isLeaf { + panic(fmt.Sprintf("invalid childAt(%d) on a leaf node", index)) + } + return n.bucket.node(n.inodes[index].pgid, n) +} + +// childIndex returns the index of a given child node. +func (n *node) childIndex(child *node) int { + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, child.key) != -1 }) + return index +} + +// numChildren returns the number of children. +func (n *node) numChildren() int { + return len(n.inodes) +} + +// nextSibling returns the next node with the same parent. +func (n *node) nextSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index >= n.parent.numChildren()-1 { + return nil + } + return n.parent.childAt(index + 1) +} + +// prevSibling returns the previous node with the same parent. +func (n *node) prevSibling() *node { + if n.parent == nil { + return nil + } + index := n.parent.childIndex(n) + if index == 0 { + return nil + } + return n.parent.childAt(index - 1) +} + +// put inserts a key/value. +func (n *node) put(oldKey, newKey, value []byte, pgid pgid, flags uint32) { + if pgid >= n.bucket.tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", pgid, n.bucket.tx.meta.pgid)) + } else if len(oldKey) <= 0 { + panic("put: zero-length old key") + } else if len(newKey) <= 0 { + panic("put: zero-length new key") + } + + // Find insertion index. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, oldKey) != -1 }) + + // Add capacity and shift nodes if we don't have an exact match and need to insert. + exact := (len(n.inodes) > 0 && index < len(n.inodes) && bytes.Equal(n.inodes[index].key, oldKey)) + if !exact { + n.inodes = append(n.inodes, inode{}) + copy(n.inodes[index+1:], n.inodes[index:]) + } + + inode := &n.inodes[index] + inode.flags = flags + inode.key = newKey + inode.value = value + inode.pgid = pgid + _assert(len(inode.key) > 0, "put: zero-length inode key") +} + +// del removes a key from the node. +func (n *node) del(key []byte) { + // Find index of key. + index := sort.Search(len(n.inodes), func(i int) bool { return bytes.Compare(n.inodes[i].key, key) != -1 }) + + // Exit if the key isn't found. + if index >= len(n.inodes) || !bytes.Equal(n.inodes[index].key, key) { + return + } + + // Delete inode from the node. + n.inodes = append(n.inodes[:index], n.inodes[index+1:]...) + + // Mark the node as needing rebalancing. + n.unbalanced = true +} + +// read initializes the node from a page. +func (n *node) read(p *page) { + n.pgid = p.id + n.isLeaf = ((p.flags & leafPageFlag) != 0) + n.inodes = make(inodes, int(p.count)) + + for i := 0; i < int(p.count); i++ { + inode := &n.inodes[i] + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + inode.flags = elem.flags + inode.key = elem.key() + inode.value = elem.value() + } else { + elem := p.branchPageElement(uint16(i)) + inode.pgid = elem.pgid + inode.key = elem.key() + } + _assert(len(inode.key) > 0, "read: zero-length inode key") + } + + // Save first key so we can find the node in the parent when we spill. + if len(n.inodes) > 0 { + n.key = n.inodes[0].key + _assert(len(n.key) > 0, "read: zero-length node key") + } else { + n.key = nil + } +} + +// write writes the items onto one or more pages. +func (n *node) write(p *page) { + // Initialize page. + if n.isLeaf { + p.flags |= leafPageFlag + } else { + p.flags |= branchPageFlag + } + + if len(n.inodes) >= 0xFFFF { + panic(fmt.Sprintf("inode overflow: %d (pgid=%d)", len(n.inodes), p.id)) + } + p.count = uint16(len(n.inodes)) + + // Stop here if there are no items to write. + if p.count == 0 { + return + } + + // Loop over each item and write it to the page. + b := (*[maxAllocSize]byte)(unsafe.Pointer(&p.ptr))[n.pageElementSize()*len(n.inodes):] + for i, item := range n.inodes { + _assert(len(item.key) > 0, "write: zero-length inode key") + + // Write the page element. + if n.isLeaf { + elem := p.leafPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.flags = item.flags + elem.ksize = uint32(len(item.key)) + elem.vsize = uint32(len(item.value)) + } else { + elem := p.branchPageElement(uint16(i)) + elem.pos = uint32(uintptr(unsafe.Pointer(&b[0])) - uintptr(unsafe.Pointer(elem))) + elem.ksize = uint32(len(item.key)) + elem.pgid = item.pgid + _assert(elem.pgid != p.id, "write: circular dependency occurred") + } + + // If the length of key+value is larger than the max allocation size + // then we need to reallocate the byte array pointer. + // + // See: https://github.com/boltdb/bolt/pull/335 + klen, vlen := len(item.key), len(item.value) + if len(b) < klen+vlen { + b = (*[maxAllocSize]byte)(unsafe.Pointer(&b[0]))[:] + } + + // Write data for the element to the end of the page. + copy(b[0:], item.key) + b = b[klen:] + copy(b[0:], item.value) + b = b[vlen:] + } + + // DEBUG ONLY: n.dump() +} + +// split breaks up a node into multiple smaller nodes, if appropriate. +// This should only be called from the spill() function. +func (n *node) split(pageSize int) []*node { + var nodes []*node + + node := n + for { + // Split node into two. + a, b := node.splitTwo(pageSize) + nodes = append(nodes, a) + + // If we can't split then exit the loop. + if b == nil { + break + } + + // Set node to b so it gets split on the next iteration. + node = b + } + + return nodes +} + +// splitTwo breaks up a node into two smaller nodes, if appropriate. +// This should only be called from the split() function. +func (n *node) splitTwo(pageSize int) (*node, *node) { + // Ignore the split if the page doesn't have at least enough nodes for + // two pages or if the nodes can fit in a single page. + if len(n.inodes) <= (minKeysPerPage*2) || n.sizeLessThan(pageSize) { + return n, nil + } + + // Determine the threshold before starting a new node. + var fillPercent = n.bucket.FillPercent + if fillPercent < minFillPercent { + fillPercent = minFillPercent + } else if fillPercent > maxFillPercent { + fillPercent = maxFillPercent + } + threshold := int(float64(pageSize) * fillPercent) + + // Determine split position and sizes of the two pages. + splitIndex, _ := n.splitIndex(threshold) + + // Split node into two separate nodes. + // If there's no parent then we'll need to create one. + if n.parent == nil { + n.parent = &node{bucket: n.bucket, children: []*node{n}} + } + + // Create a new node and add it to the parent. + next := &node{bucket: n.bucket, isLeaf: n.isLeaf, parent: n.parent} + n.parent.children = append(n.parent.children, next) + + // Split inodes across two nodes. + next.inodes = n.inodes[splitIndex:] + n.inodes = n.inodes[:splitIndex] + + // Update the statistics. + n.bucket.tx.stats.Split++ + + return n, next +} + +// splitIndex finds the position where a page will fill a given threshold. +// It returns the index as well as the size of the first page. +// This is only be called from split(). +func (n *node) splitIndex(threshold int) (index, sz int) { + sz = pageHeaderSize + + // Loop until we only have the minimum number of keys required for the second page. + for i := 0; i < len(n.inodes)-minKeysPerPage; i++ { + index = i + inode := n.inodes[i] + elsize := n.pageElementSize() + len(inode.key) + len(inode.value) + + // If we have at least the minimum number of keys and adding another + // node would put us over the threshold then exit and return. + if i >= minKeysPerPage && sz+elsize > threshold { + break + } + + // Add the element size to the total size. + sz += elsize + } + + return +} + +// spill writes the nodes to dirty pages and splits nodes as it goes. +// Returns an error if dirty pages cannot be allocated. +func (n *node) spill() error { + var tx = n.bucket.tx + if n.spilled { + return nil + } + + // Spill child nodes first. Child nodes can materialize sibling nodes in + // the case of split-merge so we cannot use a range loop. We have to check + // the children size on every loop iteration. + sort.Sort(n.children) + for i := 0; i < len(n.children); i++ { + if err := n.children[i].spill(); err != nil { + return err + } + } + + // We no longer need the child list because it's only used for spill tracking. + n.children = nil + + // Split nodes into appropriate sizes. The first node will always be n. + var nodes = n.split(tx.db.pageSize) + for _, node := range nodes { + // Add node's page to the freelist if it's not new. + if node.pgid > 0 { + tx.db.freelist.free(tx.meta.txid, tx.page(node.pgid)) + node.pgid = 0 + } + + // Allocate contiguous space for the node. + p, err := tx.allocate((node.size() / tx.db.pageSize) + 1) + if err != nil { + return err + } + + // Write the node. + if p.id >= tx.meta.pgid { + panic(fmt.Sprintf("pgid (%d) above high water mark (%d)", p.id, tx.meta.pgid)) + } + node.pgid = p.id + node.write(p) + node.spilled = true + + // Insert into parent inodes. + if node.parent != nil { + var key = node.key + if key == nil { + key = node.inodes[0].key + } + + node.parent.put(key, node.inodes[0].key, nil, node.pgid, 0) + node.key = node.inodes[0].key + _assert(len(node.key) > 0, "spill: zero-length node key") + } + + // Update the statistics. + tx.stats.Spill++ + } + + // If the root node split and created a new root then we need to spill that + // as well. We'll clear out the children to make sure it doesn't try to respill. + if n.parent != nil && n.parent.pgid == 0 { + n.children = nil + return n.parent.spill() + } + + return nil +} + +// rebalance attempts to combine the node with sibling nodes if the node fill +// size is below a threshold or if there are not enough keys. +func (n *node) rebalance() { + if !n.unbalanced { + return + } + n.unbalanced = false + + // Update statistics. + n.bucket.tx.stats.Rebalance++ + + // Ignore if node is above threshold (25%) and has enough keys. + var threshold = n.bucket.tx.db.pageSize / 4 + if n.size() > threshold && len(n.inodes) > n.minKeys() { + return + } + + // Root node has special handling. + if n.parent == nil { + // If root node is a branch and only has one node then collapse it. + if !n.isLeaf && len(n.inodes) == 1 { + // Move root's child up. + child := n.bucket.node(n.inodes[0].pgid, n) + n.isLeaf = child.isLeaf + n.inodes = child.inodes[:] + n.children = child.children + + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent = n + } + } + + // Remove old child. + child.parent = nil + delete(n.bucket.nodes, child.pgid) + child.free() + } + + return + } + + // If node has no keys then just remove it. + if n.numChildren() == 0 { + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + n.parent.rebalance() + return + } + + _assert(n.parent.numChildren() > 1, "parent must have at least 2 children") + + // Destination node is right sibling if idx == 0, otherwise left sibling. + var target *node + var useNextSibling = (n.parent.childIndex(n) == 0) + if useNextSibling { + target = n.nextSibling() + } else { + target = n.prevSibling() + } + + // If both this node and the target node are too small then merge them. + if useNextSibling { + // Reparent all child nodes being moved. + for _, inode := range target.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = n + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes from target and remove target. + n.inodes = append(n.inodes, target.inodes...) + n.parent.del(target.key) + n.parent.removeChild(target) + delete(n.bucket.nodes, target.pgid) + target.free() + } else { + // Reparent all child nodes being moved. + for _, inode := range n.inodes { + if child, ok := n.bucket.nodes[inode.pgid]; ok { + child.parent.removeChild(child) + child.parent = target + child.parent.children = append(child.parent.children, child) + } + } + + // Copy over inodes to target and remove node. + target.inodes = append(target.inodes, n.inodes...) + n.parent.del(n.key) + n.parent.removeChild(n) + delete(n.bucket.nodes, n.pgid) + n.free() + } + + // Either this node or the target node was deleted from the parent so rebalance it. + n.parent.rebalance() +} + +// removes a node from the list of in-memory children. +// This does not affect the inodes. +func (n *node) removeChild(target *node) { + for i, child := range n.children { + if child == target { + n.children = append(n.children[:i], n.children[i+1:]...) + return + } + } +} + +// dereference causes the node to copy all its inode key/value references to heap memory. +// This is required when the mmap is reallocated so inodes are not pointing to stale data. +func (n *node) dereference() { + if n.key != nil { + key := make([]byte, len(n.key)) + copy(key, n.key) + n.key = key + _assert(n.pgid == 0 || len(n.key) > 0, "dereference: zero-length node key on existing node") + } + + for i := range n.inodes { + inode := &n.inodes[i] + + key := make([]byte, len(inode.key)) + copy(key, inode.key) + inode.key = key + _assert(len(inode.key) > 0, "dereference: zero-length inode key") + + value := make([]byte, len(inode.value)) + copy(value, inode.value) + inode.value = value + } + + // Recursively dereference children. + for _, child := range n.children { + child.dereference() + } + + // Update statistics. + n.bucket.tx.stats.NodeDeref++ +} + +// free adds the node's underlying page to the freelist. +func (n *node) free() { + if n.pgid != 0 { + n.bucket.tx.db.freelist.free(n.bucket.tx.meta.txid, n.bucket.tx.page(n.pgid)) + n.pgid = 0 + } +} + +// dump writes the contents of the node to STDERR for debugging purposes. +/* +func (n *node) dump() { + // Write node header. + var typ = "branch" + if n.isLeaf { + typ = "leaf" + } + warnf("[NODE %d {type=%s count=%d}]", n.pgid, typ, len(n.inodes)) + + // Write out abbreviated version of each item. + for _, item := range n.inodes { + if n.isLeaf { + if item.flags&bucketLeafFlag != 0 { + bucket := (*bucket)(unsafe.Pointer(&item.value[0])) + warnf("+L %08x -> (bucket root=%d)", trunc(item.key, 4), bucket.root) + } else { + warnf("+L %08x -> %08x", trunc(item.key, 4), trunc(item.value, 4)) + } + } else { + warnf("+B %08x -> pgid=%d", trunc(item.key, 4), item.pgid) + } + } + warn("") +} +*/ + +type nodes []*node + +func (s nodes) Len() int { return len(s) } +func (s nodes) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s nodes) Less(i, j int) bool { return bytes.Compare(s[i].inodes[0].key, s[j].inodes[0].key) == -1 } + +// inode represents an internal node inside of a node. +// It can be used to point to elements in a page or point +// to an element which hasn't been added to a page yet. +type inode struct { + flags uint32 + pgid pgid + key []byte + value []byte +} + +type inodes []inode diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/page.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/page.go new file mode 100755 index 0000000..cde403a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/page.go @@ -0,0 +1,197 @@ +package bolt + +import ( + "fmt" + "os" + "sort" + "unsafe" +) + +const pageHeaderSize = int(unsafe.Offsetof(((*page)(nil)).ptr)) + +const minKeysPerPage = 2 + +const branchPageElementSize = int(unsafe.Sizeof(branchPageElement{})) +const leafPageElementSize = int(unsafe.Sizeof(leafPageElement{})) + +const ( + branchPageFlag = 0x01 + leafPageFlag = 0x02 + metaPageFlag = 0x04 + freelistPageFlag = 0x10 +) + +const ( + bucketLeafFlag = 0x01 +) + +type pgid uint64 + +type page struct { + id pgid + flags uint16 + count uint16 + overflow uint32 + ptr uintptr +} + +// typ returns a human readable page type string used for debugging. +func (p *page) typ() string { + if (p.flags & branchPageFlag) != 0 { + return "branch" + } else if (p.flags & leafPageFlag) != 0 { + return "leaf" + } else if (p.flags & metaPageFlag) != 0 { + return "meta" + } else if (p.flags & freelistPageFlag) != 0 { + return "freelist" + } + return fmt.Sprintf("unknown<%02x>", p.flags) +} + +// meta returns a pointer to the metadata section of the page. +func (p *page) meta() *meta { + return (*meta)(unsafe.Pointer(&p.ptr)) +} + +// leafPageElement retrieves the leaf node by index +func (p *page) leafPageElement(index uint16) *leafPageElement { + n := &((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[index] + return n +} + +// leafPageElements retrieves a list of leaf nodes. +func (p *page) leafPageElements() []leafPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]leafPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// branchPageElement retrieves the branch node by index +func (p *page) branchPageElement(index uint16) *branchPageElement { + return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] +} + +// branchPageElements retrieves a list of branch nodes. +func (p *page) branchPageElements() []branchPageElement { + if p.count == 0 { + return nil + } + return ((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[:] +} + +// dump writes n bytes of the page to STDERR as hex output. +func (p *page) hexdump(n int) { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:n] + fmt.Fprintf(os.Stderr, "%x\n", buf) +} + +type pages []*page + +func (s pages) Len() int { return len(s) } +func (s pages) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pages) Less(i, j int) bool { return s[i].id < s[j].id } + +// branchPageElement represents a node on a branch page. +type branchPageElement struct { + pos uint32 + ksize uint32 + pgid pgid +} + +// key returns a byte slice of the node key. +func (n *branchPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize] +} + +// leafPageElement represents a node on a leaf page. +type leafPageElement struct { + flags uint32 + pos uint32 + ksize uint32 + vsize uint32 +} + +// key returns a byte slice of the node key. +func (n *leafPageElement) key() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos]))[:n.ksize:n.ksize] +} + +// value returns a byte slice of the node value. +func (n *leafPageElement) value() []byte { + buf := (*[maxAllocSize]byte)(unsafe.Pointer(n)) + return (*[maxAllocSize]byte)(unsafe.Pointer(&buf[n.pos+n.ksize]))[:n.vsize:n.vsize] +} + +// PageInfo represents human readable information about a page. +type PageInfo struct { + ID int + Type string + Count int + OverflowCount int +} + +type pgids []pgid + +func (s pgids) Len() int { return len(s) } +func (s pgids) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s pgids) Less(i, j int) bool { return s[i] < s[j] } + +// merge returns the sorted union of a and b. +func (a pgids) merge(b pgids) pgids { + // Return the opposite slice if one is nil. + if len(a) == 0 { + return b + } + if len(b) == 0 { + return a + } + merged := make(pgids, len(a)+len(b)) + mergepgids(merged, a, b) + return merged +} + +// mergepgids copies the sorted union of a and b into dst. +// If dst is too small, it panics. +func mergepgids(dst, a, b pgids) { + if len(dst) < len(a)+len(b) { + panic(fmt.Errorf("mergepgids bad len %d < %d + %d", len(dst), len(a), len(b))) + } + // Copy in the opposite slice if one is nil. + if len(a) == 0 { + copy(dst, b) + return + } + if len(b) == 0 { + copy(dst, a) + return + } + + // Merged will hold all elements from both lists. + merged := dst[:0] + + // Assign lead to the slice with a lower starting value, follow to the higher value. + lead, follow := a, b + if b[0] < a[0] { + lead, follow = b, a + } + + // Continue while there are elements in the lead. + for len(lead) > 0 { + // Merge largest prefix of lead that is ahead of follow[0]. + n := sort.Search(len(lead), func(i int) bool { return lead[i] > follow[0] }) + merged = append(merged, lead[:n]...) + if n >= len(lead) { + break + } + + // Swap lead and follow. + lead, follow = follow, lead[n:] + } + + // Append what's left in follow. + _ = append(merged, follow...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/tx.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/tx.go new file mode 100755 index 0000000..6700308 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/boltdb/bolt/tx.go @@ -0,0 +1,684 @@ +package bolt + +import ( + "fmt" + "io" + "os" + "sort" + "strings" + "time" + "unsafe" +) + +// txid represents the internal transaction identifier. +type txid uint64 + +// Tx represents a read-only or read/write transaction on the database. +// Read-only transactions can be used for retrieving values for keys and creating cursors. +// Read/write transactions can create and remove buckets and create and remove keys. +// +// IMPORTANT: You must commit or rollback transactions when you are done with +// them. Pages can not be reclaimed by the writer until no more transactions +// are using them. A long running read transaction can cause the database to +// quickly grow. +type Tx struct { + writable bool + managed bool + db *DB + meta *meta + root Bucket + pages map[pgid]*page + stats TxStats + commitHandlers []func() + + // WriteFlag specifies the flag for write-related methods like WriteTo(). + // Tx opens the database file with the specified flag to copy the data. + // + // By default, the flag is unset, which works well for mostly in-memory + // workloads. For databases that are much larger than available RAM, + // set the flag to syscall.O_DIRECT to avoid trashing the page cache. + WriteFlag int +} + +// init initializes the transaction. +func (tx *Tx) init(db *DB) { + tx.db = db + tx.pages = nil + + // Copy the meta page since it can be changed by the writer. + tx.meta = &meta{} + db.meta().copy(tx.meta) + + // Copy over the root bucket. + tx.root = newBucket(tx) + tx.root.bucket = &bucket{} + *tx.root.bucket = tx.meta.root + + // Increment the transaction id and add a page cache for writable transactions. + if tx.writable { + tx.pages = make(map[pgid]*page) + tx.meta.txid += txid(1) + } +} + +// ID returns the transaction id. +func (tx *Tx) ID() int { + return int(tx.meta.txid) +} + +// DB returns a reference to the database that created the transaction. +func (tx *Tx) DB() *DB { + return tx.db +} + +// Size returns current database size in bytes as seen by this transaction. +func (tx *Tx) Size() int64 { + return int64(tx.meta.pgid) * int64(tx.db.pageSize) +} + +// Writable returns whether the transaction can perform write operations. +func (tx *Tx) Writable() bool { + return tx.writable +} + +// Cursor creates a cursor associated with the root bucket. +// All items in the cursor will return a nil value because all root bucket keys point to buckets. +// The cursor is only valid as long as the transaction is open. +// Do not use a cursor after the transaction is closed. +func (tx *Tx) Cursor() *Cursor { + return tx.root.Cursor() +} + +// Stats retrieves a copy of the current transaction statistics. +func (tx *Tx) Stats() TxStats { + return tx.stats +} + +// Bucket retrieves a bucket by name. +// Returns nil if the bucket does not exist. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) Bucket(name []byte) *Bucket { + return tx.root.Bucket(name) +} + +// CreateBucket creates a new bucket. +// Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucket(name []byte) (*Bucket, error) { + return tx.root.CreateBucket(name) +} + +// CreateBucketIfNotExists creates a new bucket if it doesn't already exist. +// Returns an error if the bucket name is blank, or if the bucket name is too long. +// The bucket instance is only valid for the lifetime of the transaction. +func (tx *Tx) CreateBucketIfNotExists(name []byte) (*Bucket, error) { + return tx.root.CreateBucketIfNotExists(name) +} + +// DeleteBucket deletes a bucket. +// Returns an error if the bucket cannot be found or if the key represents a non-bucket value. +func (tx *Tx) DeleteBucket(name []byte) error { + return tx.root.DeleteBucket(name) +} + +// ForEach executes a function for each bucket in the root. +// If the provided function returns an error then the iteration is stopped and +// the error is returned to the caller. +func (tx *Tx) ForEach(fn func(name []byte, b *Bucket) error) error { + return tx.root.ForEach(func(k, v []byte) error { + if err := fn(k, tx.root.Bucket(k)); err != nil { + return err + } + return nil + }) +} + +// OnCommit adds a handler function to be executed after the transaction successfully commits. +func (tx *Tx) OnCommit(fn func()) { + tx.commitHandlers = append(tx.commitHandlers, fn) +} + +// Commit writes all changes to disk and updates the meta page. +// Returns an error if a disk write error occurs, or if Commit is +// called on a read-only transaction. +func (tx *Tx) Commit() error { + _assert(!tx.managed, "managed tx commit not allowed") + if tx.db == nil { + return ErrTxClosed + } else if !tx.writable { + return ErrTxNotWritable + } + + // TODO(benbjohnson): Use vectorized I/O to write out dirty pages. + + // Rebalance nodes which have had deletions. + var startTime = time.Now() + tx.root.rebalance() + if tx.stats.Rebalance > 0 { + tx.stats.RebalanceTime += time.Since(startTime) + } + + // spill data onto dirty pages. + startTime = time.Now() + if err := tx.root.spill(); err != nil { + tx.rollback() + return err + } + tx.stats.SpillTime += time.Since(startTime) + + // Free the old root bucket. + tx.meta.root.root = tx.root.root + + opgid := tx.meta.pgid + + // Free the freelist and allocate new pages for it. This will overestimate + // the size of the freelist but not underestimate the size (which would be bad). + tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist)) + p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1) + if err != nil { + tx.rollback() + return err + } + if err := tx.db.freelist.write(p); err != nil { + tx.rollback() + return err + } + tx.meta.freelist = p.id + + // If the high water mark has moved up then attempt to grow the database. + if tx.meta.pgid > opgid { + if err := tx.db.grow(int(tx.meta.pgid+1) * tx.db.pageSize); err != nil { + tx.rollback() + return err + } + } + + // Write dirty pages to disk. + startTime = time.Now() + if err := tx.write(); err != nil { + tx.rollback() + return err + } + + // If strict mode is enabled then perform a consistency check. + // Only the first consistency error is reported in the panic. + if tx.db.StrictMode { + ch := tx.Check() + var errs []string + for { + err, ok := <-ch + if !ok { + break + } + errs = append(errs, err.Error()) + } + if len(errs) > 0 { + panic("check fail: " + strings.Join(errs, "\n")) + } + } + + // Write meta to disk. + if err := tx.writeMeta(); err != nil { + tx.rollback() + return err + } + tx.stats.WriteTime += time.Since(startTime) + + // Finalize the transaction. + tx.close() + + // Execute commit handlers now that the locks have been removed. + for _, fn := range tx.commitHandlers { + fn() + } + + return nil +} + +// Rollback closes the transaction and ignores all previous updates. Read-only +// transactions must be rolled back and not committed. +func (tx *Tx) Rollback() error { + _assert(!tx.managed, "managed tx rollback not allowed") + if tx.db == nil { + return ErrTxClosed + } + tx.rollback() + return nil +} + +func (tx *Tx) rollback() { + if tx.db == nil { + return + } + if tx.writable { + tx.db.freelist.rollback(tx.meta.txid) + tx.db.freelist.reload(tx.db.page(tx.db.meta().freelist)) + } + tx.close() +} + +func (tx *Tx) close() { + if tx.db == nil { + return + } + if tx.writable { + // Grab freelist stats. + var freelistFreeN = tx.db.freelist.free_count() + var freelistPendingN = tx.db.freelist.pending_count() + var freelistAlloc = tx.db.freelist.size() + + // Remove transaction ref & writer lock. + tx.db.rwtx = nil + tx.db.rwlock.Unlock() + + // Merge statistics. + tx.db.statlock.Lock() + tx.db.stats.FreePageN = freelistFreeN + tx.db.stats.PendingPageN = freelistPendingN + tx.db.stats.FreeAlloc = (freelistFreeN + freelistPendingN) * tx.db.pageSize + tx.db.stats.FreelistInuse = freelistAlloc + tx.db.stats.TxStats.add(&tx.stats) + tx.db.statlock.Unlock() + } else { + tx.db.removeTx(tx) + } + + // Clear all references. + tx.db = nil + tx.meta = nil + tx.root = Bucket{tx: tx} + tx.pages = nil +} + +// Copy writes the entire database to a writer. +// This function exists for backwards compatibility. Use WriteTo() instead. +func (tx *Tx) Copy(w io.Writer) error { + _, err := tx.WriteTo(w) + return err +} + +// WriteTo writes the entire database to a writer. +// If err == nil then exactly tx.Size() bytes will be written into the writer. +func (tx *Tx) WriteTo(w io.Writer) (n int64, err error) { + // Attempt to open reader with WriteFlag + f, err := os.OpenFile(tx.db.path, os.O_RDONLY|tx.WriteFlag, 0) + if err != nil { + return 0, err + } + defer func() { _ = f.Close() }() + + // Generate a meta page. We use the same page data for both meta pages. + buf := make([]byte, tx.db.pageSize) + page := (*page)(unsafe.Pointer(&buf[0])) + page.flags = metaPageFlag + *page.meta() = *tx.meta + + // Write meta 0. + page.id = 0 + page.meta().checksum = page.meta().sum64() + nn, err := w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 0 copy: %s", err) + } + + // Write meta 1 with a lower transaction id. + page.id = 1 + page.meta().txid -= 1 + page.meta().checksum = page.meta().sum64() + nn, err = w.Write(buf) + n += int64(nn) + if err != nil { + return n, fmt.Errorf("meta 1 copy: %s", err) + } + + // Move past the meta pages in the file. + if _, err := f.Seek(int64(tx.db.pageSize*2), os.SEEK_SET); err != nil { + return n, fmt.Errorf("seek: %s", err) + } + + // Copy data pages. + wn, err := io.CopyN(w, f, tx.Size()-int64(tx.db.pageSize*2)) + n += wn + if err != nil { + return n, err + } + + return n, f.Close() +} + +// CopyFile copies the entire database to file at the given path. +// A reader transaction is maintained during the copy so it is safe to continue +// using the database while a copy is in progress. +func (tx *Tx) CopyFile(path string, mode os.FileMode) error { + f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode) + if err != nil { + return err + } + + err = tx.Copy(f) + if err != nil { + _ = f.Close() + return err + } + return f.Close() +} + +// Check performs several consistency checks on the database for this transaction. +// An error is returned if any inconsistency is found. +// +// It can be safely run concurrently on a writable transaction. However, this +// incurs a high cost for large databases and databases with a lot of subbuckets +// because of caching. This overhead can be removed if running on a read-only +// transaction, however, it is not safe to execute other writer transactions at +// the same time. +func (tx *Tx) Check() <-chan error { + ch := make(chan error) + go tx.check(ch) + return ch +} + +func (tx *Tx) check(ch chan error) { + // Check if any pages are double freed. + freed := make(map[pgid]bool) + all := make([]pgid, tx.db.freelist.count()) + tx.db.freelist.copyall(all) + for _, id := range all { + if freed[id] { + ch <- fmt.Errorf("page %d: already freed", id) + } + freed[id] = true + } + + // Track every reachable page. + reachable := make(map[pgid]*page) + reachable[0] = tx.page(0) // meta0 + reachable[1] = tx.page(1) // meta1 + for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ { + reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist) + } + + // Recursively check buckets. + tx.checkBucket(&tx.root, reachable, freed, ch) + + // Ensure all pages below high water mark are either reachable or freed. + for i := pgid(0); i < tx.meta.pgid; i++ { + _, isReachable := reachable[i] + if !isReachable && !freed[i] { + ch <- fmt.Errorf("page %d: unreachable unfreed", int(i)) + } + } + + // Close the channel to signal completion. + close(ch) +} + +func (tx *Tx) checkBucket(b *Bucket, reachable map[pgid]*page, freed map[pgid]bool, ch chan error) { + // Ignore inline buckets. + if b.root == 0 { + return + } + + // Check every page used by this bucket. + b.tx.forEachPage(b.root, 0, func(p *page, _ int) { + if p.id > tx.meta.pgid { + ch <- fmt.Errorf("page %d: out of bounds: %d", int(p.id), int(b.tx.meta.pgid)) + } + + // Ensure each page is only referenced once. + for i := pgid(0); i <= pgid(p.overflow); i++ { + var id = p.id + i + if _, ok := reachable[id]; ok { + ch <- fmt.Errorf("page %d: multiple references", int(id)) + } + reachable[id] = p + } + + // We should only encounter un-freed leaf and branch pages. + if freed[p.id] { + ch <- fmt.Errorf("page %d: reachable freed", int(p.id)) + } else if (p.flags&branchPageFlag) == 0 && (p.flags&leafPageFlag) == 0 { + ch <- fmt.Errorf("page %d: invalid type: %s", int(p.id), p.typ()) + } + }) + + // Check each bucket within this bucket. + _ = b.ForEach(func(k, v []byte) error { + if child := b.Bucket(k); child != nil { + tx.checkBucket(child, reachable, freed, ch) + } + return nil + }) +} + +// allocate returns a contiguous block of memory starting at a given page. +func (tx *Tx) allocate(count int) (*page, error) { + p, err := tx.db.allocate(count) + if err != nil { + return nil, err + } + + // Save to our page cache. + tx.pages[p.id] = p + + // Update statistics. + tx.stats.PageCount++ + tx.stats.PageAlloc += count * tx.db.pageSize + + return p, nil +} + +// write writes any dirty pages to disk. +func (tx *Tx) write() error { + // Sort pages by id. + pages := make(pages, 0, len(tx.pages)) + for _, p := range tx.pages { + pages = append(pages, p) + } + // Clear out page cache early. + tx.pages = make(map[pgid]*page) + sort.Sort(pages) + + // Write pages to disk in order. + for _, p := range pages { + size := (int(p.overflow) + 1) * tx.db.pageSize + offset := int64(p.id) * int64(tx.db.pageSize) + + // Write out page in "max allocation" sized chunks. + ptr := (*[maxAllocSize]byte)(unsafe.Pointer(p)) + for { + // Limit our write to our max allocation size. + sz := size + if sz > maxAllocSize-1 { + sz = maxAllocSize - 1 + } + + // Write chunk to disk. + buf := ptr[:sz] + if _, err := tx.db.ops.writeAt(buf, offset); err != nil { + return err + } + + // Update statistics. + tx.stats.Write++ + + // Exit inner for loop if we've written all the chunks. + size -= sz + if size == 0 { + break + } + + // Otherwise move offset forward and move pointer to next chunk. + offset += int64(sz) + ptr = (*[maxAllocSize]byte)(unsafe.Pointer(&ptr[sz])) + } + } + + // Ignore file sync if flag is set on DB. + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Put small pages back to page pool. + for _, p := range pages { + // Ignore page sizes over 1 page. + // These are allocated using make() instead of the page pool. + if int(p.overflow) != 0 { + continue + } + + buf := (*[maxAllocSize]byte)(unsafe.Pointer(p))[:tx.db.pageSize] + + // See https://go.googlesource.com/go/+/f03c9202c43e0abb130669852082117ca50aa9b1 + for i := range buf { + buf[i] = 0 + } + tx.db.pagePool.Put(buf) + } + + return nil +} + +// writeMeta writes the meta to the disk. +func (tx *Tx) writeMeta() error { + // Create a temporary buffer for the meta page. + buf := make([]byte, tx.db.pageSize) + p := tx.db.pageInBuffer(buf, 0) + tx.meta.write(p) + + // Write the meta page to file. + if _, err := tx.db.ops.writeAt(buf, int64(p.id)*int64(tx.db.pageSize)); err != nil { + return err + } + if !tx.db.NoSync || IgnoreNoSync { + if err := fdatasync(tx.db); err != nil { + return err + } + } + + // Update statistics. + tx.stats.Write++ + + return nil +} + +// page returns a reference to the page with a given id. +// If page has been written to then a temporary buffered page is returned. +func (tx *Tx) page(id pgid) *page { + // Check the dirty pages first. + if tx.pages != nil { + if p, ok := tx.pages[id]; ok { + return p + } + } + + // Otherwise return directly from the mmap. + return tx.db.page(id) +} + +// forEachPage iterates over every page within a given page and executes a function. +func (tx *Tx) forEachPage(pgid pgid, depth int, fn func(*page, int)) { + p := tx.page(pgid) + + // Execute function. + fn(p, depth) + + // Recursively loop over children. + if (p.flags & branchPageFlag) != 0 { + for i := 0; i < int(p.count); i++ { + elem := p.branchPageElement(uint16(i)) + tx.forEachPage(elem.pgid, depth+1, fn) + } + } +} + +// Page returns page information for a given page number. +// This is only safe for concurrent use when used by a writable transaction. +func (tx *Tx) Page(id int) (*PageInfo, error) { + if tx.db == nil { + return nil, ErrTxClosed + } else if pgid(id) >= tx.meta.pgid { + return nil, nil + } + + // Build the page info. + p := tx.db.page(pgid(id)) + info := &PageInfo{ + ID: id, + Count: int(p.count), + OverflowCount: int(p.overflow), + } + + // Determine the type (or if it's free). + if tx.db.freelist.freed(pgid(id)) { + info.Type = "free" + } else { + info.Type = p.typ() + } + + return info, nil +} + +// TxStats represents statistics about the actions performed by the transaction. +type TxStats struct { + // Page statistics. + PageCount int // number of page allocations + PageAlloc int // total bytes allocated + + // Cursor statistics. + CursorCount int // number of cursors created + + // Node statistics + NodeCount int // number of node allocations + NodeDeref int // number of node dereferences + + // Rebalance statistics. + Rebalance int // number of node rebalances + RebalanceTime time.Duration // total time spent rebalancing + + // Split/Spill statistics. + Split int // number of nodes split + Spill int // number of nodes spilled + SpillTime time.Duration // total time spent spilling + + // Write statistics. + Write int // number of writes performed + WriteTime time.Duration // total time spent writing to disk +} + +func (s *TxStats) add(other *TxStats) { + s.PageCount += other.PageCount + s.PageAlloc += other.PageAlloc + s.CursorCount += other.CursorCount + s.NodeCount += other.NodeCount + s.NodeDeref += other.NodeDeref + s.Rebalance += other.Rebalance + s.RebalanceTime += other.RebalanceTime + s.Split += other.Split + s.Spill += other.Spill + s.SpillTime += other.SpillTime + s.Write += other.Write + s.WriteTime += other.WriteTime +} + +// Sub calculates and returns the difference between two sets of transaction stats. +// This is useful when obtaining stats at two different points and time and +// you need the performance counters that occurred within that time span. +func (s *TxStats) Sub(other *TxStats) TxStats { + var diff TxStats + diff.PageCount = s.PageCount - other.PageCount + diff.PageAlloc = s.PageAlloc - other.PageAlloc + diff.CursorCount = s.CursorCount - other.CursorCount + diff.NodeCount = s.NodeCount - other.NodeCount + diff.NodeDeref = s.NodeDeref - other.NodeDeref + diff.Rebalance = s.Rebalance - other.Rebalance + diff.RebalanceTime = s.RebalanceTime - other.RebalanceTime + diff.Split = s.Split - other.Split + diff.Spill = s.Spill - other.Spill + diff.SpillTime = s.SpillTime - other.SpillTime + diff.Write = s.Write - other.Write + diff.WriteTime = s.WriteTime - other.WriteTime + return diff +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.gitignore new file mode 100755 index 0000000..0026861 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.travis.yml new file mode 100755 index 0000000..1040404 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/.travis.yml @@ -0,0 +1,9 @@ +language: go +go: + - 1.3.3 + - tip +before_install: + - go get github.com/mattn/goveralls + - go get golang.org/x/tools/cmd/cover +script: + - $HOME/gopath/bin/goveralls -service=travis-ci diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/LICENSE new file mode 100755 index 0000000..89b8179 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Cenk Altı + +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/skycoin/skycoin/vendor/github.com/cenkalti/backoff/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/README.md new file mode 100755 index 0000000..13b347f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/README.md @@ -0,0 +1,30 @@ +# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls] + +This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client]. + +[Exponential backoff][exponential backoff wiki] +is an algorithm that uses feedback to multiplicatively decrease the rate of some process, +in order to gradually find an acceptable rate. +The retries exponentially increase and stop increasing when a certain threshold is met. + +## Usage + +See https://godoc.org/github.com/cenkalti/backoff#pkg-examples + +## Contributing + +* I would like to keep this library as small as possible. +* Please don't send a PR without opening an issue and discussing it first. +* If proposed change is not a common use case, I will probably not accept it. + +[godoc]: https://godoc.org/github.com/cenkalti/backoff +[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png +[travis]: https://travis-ci.org/cenkalti/backoff +[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master +[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master +[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master + +[google-http-java-client]: https://github.com/google/google-http-java-client +[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff + +[advanced example]: https://godoc.org/github.com/cenkalti/backoff#example_ diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/backoff.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/backoff.go new file mode 100755 index 0000000..2102c5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/backoff.go @@ -0,0 +1,66 @@ +// Package backoff implements backoff algorithms for retrying operations. +// +// Use Retry function for retrying operations that may fail. +// If Retry does not meet your needs, +// copy/paste the function into your project and modify as you wish. +// +// There is also Ticker type similar to time.Ticker. +// You can use it if you need to work with channels. +// +// See Examples section below for usage examples. +package backoff + +import "time" + +// BackOff is a backoff policy for retrying an operation. +type BackOff interface { + // NextBackOff returns the duration to wait before retrying the operation, + // or backoff.Stop to indicate that no more retries should be made. + // + // Example usage: + // + // duration := backoff.NextBackOff(); + // if (duration == backoff.Stop) { + // // Do not retry operation. + // } else { + // // Sleep for duration and retry operation. + // } + // + NextBackOff() time.Duration + + // Reset to initial state. + Reset() +} + +// Stop indicates that no more retries should be made for use in NextBackOff(). +const Stop time.Duration = -1 + +// ZeroBackOff is a fixed backoff policy whose backoff time is always zero, +// meaning that the operation is retried immediately without waiting, indefinitely. +type ZeroBackOff struct{} + +func (b *ZeroBackOff) Reset() {} + +func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 } + +// StopBackOff is a fixed backoff policy that always returns backoff.Stop for +// NextBackOff(), meaning that the operation should never be retried. +type StopBackOff struct{} + +func (b *StopBackOff) Reset() {} + +func (b *StopBackOff) NextBackOff() time.Duration { return Stop } + +// ConstantBackOff is a backoff policy that always returns the same backoff delay. +// This is in contrast to an exponential backoff policy, +// which returns a delay that grows longer as you call NextBackOff() over and over again. +type ConstantBackOff struct { + Interval time.Duration +} + +func (b *ConstantBackOff) Reset() {} +func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval } + +func NewConstantBackOff(d time.Duration) *ConstantBackOff { + return &ConstantBackOff{Interval: d} +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/context.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/context.go new file mode 100755 index 0000000..5d15709 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/context.go @@ -0,0 +1,60 @@ +package backoff + +import ( + "time" + + "golang.org/x/net/context" +) + +// BackOffContext is a backoff policy that stops retrying after the context +// is canceled. +type BackOffContext interface { + BackOff + Context() context.Context +} + +type backOffContext struct { + BackOff + ctx context.Context +} + +// WithContext returns a BackOffContext with context ctx +// +// ctx must not be nil +func WithContext(b BackOff, ctx context.Context) BackOffContext { + if ctx == nil { + panic("nil context") + } + + if b, ok := b.(*backOffContext); ok { + return &backOffContext{ + BackOff: b.BackOff, + ctx: ctx, + } + } + + return &backOffContext{ + BackOff: b, + ctx: ctx, + } +} + +func ensureContext(b BackOff) BackOffContext { + if cb, ok := b.(BackOffContext); ok { + return cb + } + return WithContext(b, context.Background()) +} + +func (b *backOffContext) Context() context.Context { + return b.ctx +} + +func (b *backOffContext) NextBackOff() time.Duration { + select { + case <-b.Context().Done(): + return Stop + default: + return b.BackOff.NextBackOff() + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/exponential.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/exponential.go new file mode 100755 index 0000000..9a6addf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/exponential.go @@ -0,0 +1,156 @@ +package backoff + +import ( + "math/rand" + "time" +) + +/* +ExponentialBackOff is a backoff implementation that increases the backoff +period for each retry attempt using a randomization function that grows exponentially. + +NextBackOff() is calculated using the following formula: + + randomized interval = + RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor]) + +In other words NextBackOff() will range between the randomization factor +percentage below and above the retry interval. + +For example, given the following parameters: + + RetryInterval = 2 + RandomizationFactor = 0.5 + Multiplier = 2 + +the actual backoff period used in the next retry attempt will range between 1 and 3 seconds, +multiplied by the exponential, that is, between 2 and 6 seconds. + +Note: MaxInterval caps the RetryInterval and not the randomized interval. + +If the time elapsed since an ExponentialBackOff instance is created goes past the +MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop. + +The elapsed time can be reset by calling Reset(). + +Example: Given the following default arguments, for 10 tries the sequence will be, +and assuming we go over the MaxElapsedTime on the 10th try: + + Request # RetryInterval (seconds) Randomized Interval (seconds) + + 1 0.5 [0.25, 0.75] + 2 0.75 [0.375, 1.125] + 3 1.125 [0.562, 1.687] + 4 1.687 [0.8435, 2.53] + 5 2.53 [1.265, 3.795] + 6 3.795 [1.897, 5.692] + 7 5.692 [2.846, 8.538] + 8 8.538 [4.269, 12.807] + 9 12.807 [6.403, 19.210] + 10 19.210 backoff.Stop + +Note: Implementation is not thread-safe. +*/ +type ExponentialBackOff struct { + InitialInterval time.Duration + RandomizationFactor float64 + Multiplier float64 + MaxInterval time.Duration + // After MaxElapsedTime the ExponentialBackOff stops. + // It never stops if MaxElapsedTime == 0. + MaxElapsedTime time.Duration + Clock Clock + + currentInterval time.Duration + startTime time.Time + random *rand.Rand +} + +// Clock is an interface that returns current time for BackOff. +type Clock interface { + Now() time.Time +} + +// Default values for ExponentialBackOff. +const ( + DefaultInitialInterval = 500 * time.Millisecond + DefaultRandomizationFactor = 0.5 + DefaultMultiplier = 1.5 + DefaultMaxInterval = 60 * time.Second + DefaultMaxElapsedTime = 15 * time.Minute +) + +// NewExponentialBackOff creates an instance of ExponentialBackOff using default values. +func NewExponentialBackOff() *ExponentialBackOff { + b := &ExponentialBackOff{ + InitialInterval: DefaultInitialInterval, + RandomizationFactor: DefaultRandomizationFactor, + Multiplier: DefaultMultiplier, + MaxInterval: DefaultMaxInterval, + MaxElapsedTime: DefaultMaxElapsedTime, + Clock: SystemClock, + random: rand.New(rand.NewSource(time.Now().UnixNano())), + } + b.Reset() + return b +} + +type systemClock struct{} + +func (t systemClock) Now() time.Time { + return time.Now() +} + +// SystemClock implements Clock interface that uses time.Now(). +var SystemClock = systemClock{} + +// Reset the interval back to the initial retry interval and restarts the timer. +func (b *ExponentialBackOff) Reset() { + b.currentInterval = b.InitialInterval + b.startTime = b.Clock.Now() +} + +// NextBackOff calculates the next backoff interval using the formula: +// Randomized interval = RetryInterval +/- (RandomizationFactor * RetryInterval) +func (b *ExponentialBackOff) NextBackOff() time.Duration { + // Make sure we have not gone over the maximum elapsed time. + if b.MaxElapsedTime != 0 && b.GetElapsedTime() > b.MaxElapsedTime { + return Stop + } + defer b.incrementCurrentInterval() + if b.random == nil { + b.random = rand.New(rand.NewSource(time.Now().UnixNano())) + } + return getRandomValueFromInterval(b.RandomizationFactor, b.random.Float64(), b.currentInterval) +} + +// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance +// is created and is reset when Reset() is called. +// +// The elapsed time is computed using time.Now().UnixNano(). +func (b *ExponentialBackOff) GetElapsedTime() time.Duration { + return b.Clock.Now().Sub(b.startTime) +} + +// Increments the current interval by multiplying it with the multiplier. +func (b *ExponentialBackOff) incrementCurrentInterval() { + // Check for overflow, if overflow is detected set the current interval to the max interval. + if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier { + b.currentInterval = b.MaxInterval + } else { + b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier) + } +} + +// Returns a random value from the following interval: +// [randomizationFactor * currentInterval, randomizationFactor * currentInterval]. +func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration { + var delta = randomizationFactor * float64(currentInterval) + var minInterval = float64(currentInterval) - delta + var maxInterval = float64(currentInterval) + delta + + // Get a random value from the range [minInterval, maxInterval]. + // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then + // we want a 33% chance for selecting either 1, 2 or 3. + return time.Duration(minInterval + (random * (maxInterval - minInterval + 1))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/retry.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/retry.go new file mode 100755 index 0000000..5dbd825 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/retry.go @@ -0,0 +1,78 @@ +package backoff + +import "time" + +// An Operation is executing by Retry() or RetryNotify(). +// The operation will be retried using a backoff policy if it returns an error. +type Operation func() error + +// Notify is a notify-on-error function. It receives an operation error and +// backoff delay if the operation failed (with an error). +// +// NOTE that if the backoff policy stated to stop retrying, +// the notify function isn't called. +type Notify func(error, time.Duration) + +// Retry the operation o until it does not return error or BackOff stops. +// o is guaranteed to be run at least once. +// It is the caller's responsibility to reset b after Retry returns. +// +// If o returns a *PermanentError, the operation is not retried, and the +// wrapped error is returned. +// +// Retry sleeps the goroutine for the duration returned by BackOff after a +// failed operation returns. +func Retry(o Operation, b BackOff) error { return RetryNotify(o, b, nil) } + +// RetryNotify calls notify function with the error and wait duration +// for each failed attempt before sleep. +func RetryNotify(operation Operation, b BackOff, notify Notify) error { + var err error + var next time.Duration + + cb := ensureContext(b) + + b.Reset() + for { + if err = operation(); err == nil { + return nil + } + + if permanent, ok := err.(*PermanentError); ok { + return permanent.Err + } + + if next = b.NextBackOff(); next == Stop { + return err + } + + if notify != nil { + notify(err, next) + } + + t := time.NewTimer(next) + + select { + case <-cb.Context().Done(): + t.Stop() + return err + case <-t.C: + } + } +} + +// PermanentError signals that the operation should not be retried. +type PermanentError struct { + Err error +} + +func (e *PermanentError) Error() string { + return e.Err.Error() +} + +// Permanent wraps the given err in a *PermanentError. +func Permanent(err error) *PermanentError { + return &PermanentError{ + Err: err, + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/ticker.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/ticker.go new file mode 100755 index 0000000..49a9971 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/ticker.go @@ -0,0 +1,81 @@ +package backoff + +import ( + "runtime" + "sync" + "time" +) + +// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff. +// +// Ticks will continue to arrive when the previous operation is still running, +// so operations that take a while to fail could run in quick succession. +type Ticker struct { + C <-chan time.Time + c chan time.Time + b BackOffContext + stop chan struct{} + stopOnce sync.Once +} + +// NewTicker returns a new Ticker containing a channel that will send the time at times +// specified by the BackOff argument. Ticker is guaranteed to tick at least once. +// The channel is closed when Stop method is called or BackOff stops. +func NewTicker(b BackOff) *Ticker { + c := make(chan time.Time) + t := &Ticker{ + C: c, + c: c, + b: ensureContext(b), + stop: make(chan struct{}), + } + go t.run() + runtime.SetFinalizer(t, (*Ticker).Stop) + return t +} + +// Stop turns off a ticker. After Stop, no more ticks will be sent. +func (t *Ticker) Stop() { + t.stopOnce.Do(func() { close(t.stop) }) +} + +func (t *Ticker) run() { + c := t.c + defer close(c) + t.b.Reset() + + // Ticker is guaranteed to tick at least once. + afterC := t.send(time.Now()) + + for { + if afterC == nil { + return + } + + select { + case tick := <-afterC: + afterC = t.send(tick) + case <-t.stop: + t.c = nil // Prevent future ticks from being sent to the channel. + return + case <-t.b.Context().Done(): + return + } + } +} + +func (t *Ticker) send(tick time.Time) <-chan time.Time { + select { + case t.c <- tick: + case <-t.stop: + return nil + } + + next := t.b.NextBackOff() + if next == Stop { + t.Stop() + return nil + } + + return time.After(next) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/tries.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/tries.go new file mode 100755 index 0000000..d2da730 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/cenkalti/backoff/tries.go @@ -0,0 +1,35 @@ +package backoff + +import "time" + +/* +WithMaxTries creates a wrapper around another BackOff, which will +return Stop if NextBackOff() has been called too many times since +the last time Reset() was called + +Note: Implementation is not thread-safe. +*/ +func WithMaxTries(b BackOff, max uint64) BackOff { + return &backOffTries{delegate: b, maxTries: max} +} + +type backOffTries struct { + delegate BackOff + maxTries uint64 + numTries uint64 +} + +func (b *backOffTries) NextBackOff() time.Duration { + if b.maxTries > 0 { + if b.maxTries <= b.numTries { + return Stop + } + b.numTries++ + } + return b.delegate.NextBackOff() +} + +func (b *backOffTries) Reset() { + b.numTries = 0 + b.delegate.Reset() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/LICENSE new file mode 100755 index 0000000..c836416 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2012-2016 Dave Collins + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go new file mode 100755 index 0000000..8a4a658 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -0,0 +1,152 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is not running on Google App Engine, compiled by GopherJS, and +// "-tags safe" is not added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build !js,!appengine,!safe,!disableunsafe + +package spew + +import ( + "reflect" + "unsafe" +) + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = false + + // ptrSize is the size of a pointer on the current arch. + ptrSize = unsafe.Sizeof((*byte)(nil)) +) + +var ( + // offsetPtr, offsetScalar, and offsetFlag are the offsets for the + // internal reflect.Value fields. These values are valid before golang + // commit ecccf07e7f9d which changed the format. The are also valid + // after commit 82f48826c6c7 which changed the format again to mirror + // the original format. Code in the init function updates these offsets + // as necessary. + offsetPtr = uintptr(ptrSize) + offsetScalar = uintptr(0) + offsetFlag = uintptr(ptrSize * 2) + + // flagKindWidth and flagKindShift indicate various bits that the + // reflect package uses internally to track kind information. + // + // flagRO indicates whether or not the value field of a reflect.Value is + // read-only. + // + // flagIndir indicates whether the value field of a reflect.Value is + // the actual data or a pointer to the data. + // + // These values are valid before golang commit 90a7c3c86944 which + // changed their positions. Code in the init function updates these + // flags as necessary. + flagKindWidth = uintptr(5) + flagKindShift = uintptr(flagKindWidth - 1) + flagRO = uintptr(1 << 0) + flagIndir = uintptr(1 << 1) +) + +func init() { + // Older versions of reflect.Value stored small integers directly in the + // ptr field (which is named val in the older versions). Versions + // between commits ecccf07e7f9d and 82f48826c6c7 added a new field named + // scalar for this purpose which unfortunately came before the flag + // field, so the offset of the flag field is different for those + // versions. + // + // This code constructs a new reflect.Value from a known small integer + // and checks if the size of the reflect.Value struct indicates it has + // the scalar field. When it does, the offsets are updated accordingly. + vv := reflect.ValueOf(0xf00) + if unsafe.Sizeof(vv) == (ptrSize * 4) { + offsetScalar = ptrSize * 2 + offsetFlag = ptrSize * 3 + } + + // Commit 90a7c3c86944 changed the flag positions such that the low + // order bits are the kind. This code extracts the kind from the flags + // field and ensures it's the correct type. When it's not, the flag + // order has been changed to the newer format, so the flags are updated + // accordingly. + upf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag) + upfv := *(*uintptr)(upf) + flagKindMask := uintptr((1<>flagKindShift != uintptr(reflect.Int) { + flagKindShift = 0 + flagRO = 1 << 5 + flagIndir = 1 << 6 + + // Commit adf9b30e5594 modified the flags to separate the + // flagRO flag into two bits which specifies whether or not the + // field is embedded. This causes flagIndir to move over a bit + // and means that flagRO is the combination of either of the + // original flagRO bit and the new bit. + // + // This code detects the change by extracting what used to be + // the indirect bit to ensure it's set. When it's not, the flag + // order has been changed to the newer format, so the flags are + // updated accordingly. + if upfv&flagIndir == 0 { + flagRO = 3 << 5 + flagIndir = 1 << 7 + } + } +} + +// unsafeReflectValue converts the passed reflect.Value into a one that bypasses +// the typical safety restrictions preventing access to unaddressable and +// unexported data. It works by digging the raw pointer to the underlying +// value out of the protected value and generating a new unprotected (unsafe) +// reflect.Value to it. +// +// This allows us to check for implementations of the Stringer and error +// interfaces to be used for pretty printing ordinarily unaddressable and +// inaccessible values such as unexported struct fields. +func unsafeReflectValue(v reflect.Value) (rv reflect.Value) { + indirects := 1 + vt := v.Type() + upv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr) + rvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag)) + if rvf&flagIndir != 0 { + vt = reflect.PtrTo(v.Type()) + indirects++ + } else if offsetScalar != 0 { + // The value is in the scalar field when it's not one of the + // reference types. + switch vt.Kind() { + case reflect.Uintptr: + case reflect.Chan: + case reflect.Func: + case reflect.Map: + case reflect.Ptr: + case reflect.UnsafePointer: + default: + upv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + + offsetScalar) + } + } + + pv := reflect.NewAt(vt, upv) + rv = pv + for i := 0; i < indirects; i++ { + rv = rv.Elem() + } + return rv +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go new file mode 100755 index 0000000..1fe3cf3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -0,0 +1,38 @@ +// Copyright (c) 2015-2016 Dave Collins +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// NOTE: Due to the following build constraints, this file will only be compiled +// when the code is running on Google App Engine, compiled by GopherJS, or +// "-tags safe" is added to the go build command line. The "disableunsafe" +// tag is deprecated and thus should not be used. +// +build js appengine safe disableunsafe + +package spew + +import "reflect" + +const ( + // UnsafeDisabled is a build-time constant which specifies whether or + // not access to the unsafe package is available. + UnsafeDisabled = true +) + +// unsafeReflectValue typically converts the passed reflect.Value into a one +// that bypasses the typical safety restrictions preventing access to +// unaddressable and unexported data. However, doing this relies on access to +// the unsafe package. This is a stub version which simply returns the passed +// reflect.Value when the unsafe package is not available. +func unsafeReflectValue(v reflect.Value) reflect.Value { + return v +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go new file mode 100755 index 0000000..7c519ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/common.go @@ -0,0 +1,341 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "reflect" + "sort" + "strconv" +) + +// Some constants in the form of bytes to avoid string overhead. This mirrors +// the technique used in the fmt package. +var ( + panicBytes = []byte("(PANIC=") + plusBytes = []byte("+") + iBytes = []byte("i") + trueBytes = []byte("true") + falseBytes = []byte("false") + interfaceBytes = []byte("(interface {})") + commaNewlineBytes = []byte(",\n") + newlineBytes = []byte("\n") + openBraceBytes = []byte("{") + openBraceNewlineBytes = []byte("{\n") + closeBraceBytes = []byte("}") + asteriskBytes = []byte("*") + colonBytes = []byte(":") + colonSpaceBytes = []byte(": ") + openParenBytes = []byte("(") + closeParenBytes = []byte(")") + spaceBytes = []byte(" ") + pointerChainBytes = []byte("->") + nilAngleBytes = []byte("") + maxNewlineBytes = []byte("\n") + maxShortBytes = []byte("") + circularBytes = []byte("") + circularShortBytes = []byte("") + invalidAngleBytes = []byte("") + openBracketBytes = []byte("[") + closeBracketBytes = []byte("]") + percentBytes = []byte("%") + precisionBytes = []byte(".") + openAngleBytes = []byte("<") + closeAngleBytes = []byte(">") + openMapBytes = []byte("map[") + closeMapBytes = []byte("]") + lenEqualsBytes = []byte("len=") + capEqualsBytes = []byte("cap=") +) + +// hexDigits is used to map a decimal value to a hex digit. +var hexDigits = "0123456789abcdef" + +// catchPanic handles any panics that might occur during the handleMethods +// calls. +func catchPanic(w io.Writer, v reflect.Value) { + if err := recover(); err != nil { + w.Write(panicBytes) + fmt.Fprintf(w, "%v", err) + w.Write(closeParenBytes) + } +} + +// handleMethods attempts to call the Error and String methods on the underlying +// type the passed reflect.Value represents and outputes the result to Writer w. +// +// It handles panics in any called methods by catching and displaying the error +// as the formatted value. +func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { + // We need an interface to check if the type implements the error or + // Stringer interface. However, the reflect package won't give us an + // interface on certain things like unexported struct fields in order + // to enforce visibility rules. We use unsafe, when it's available, + // to bypass these restrictions since this package does not mutate the + // values. + if !v.CanInterface() { + if UnsafeDisabled { + return false + } + + v = unsafeReflectValue(v) + } + + // Choose whether or not to do error and Stringer interface lookups against + // the base type or a pointer to the base type depending on settings. + // Technically calling one of these methods with a pointer receiver can + // mutate the value, however, types which choose to satisify an error or + // Stringer interface with a pointer receiver should not be mutating their + // state inside these interface methods. + if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { + v = unsafeReflectValue(v) + } + if v.CanAddr() { + v = v.Addr() + } + + // Is it an error or Stringer? + switch iface := v.Interface().(type) { + case error: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.Error())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + + w.Write([]byte(iface.Error())) + return true + + case fmt.Stringer: + defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(openParenBytes) + w.Write([]byte(iface.String())) + w.Write(closeParenBytes) + w.Write(spaceBytes) + return false + } + w.Write([]byte(iface.String())) + return true + } + return false +} + +// printBool outputs a boolean value as true or false to Writer w. +func printBool(w io.Writer, val bool) { + if val { + w.Write(trueBytes) + } else { + w.Write(falseBytes) + } +} + +// printInt outputs a signed integer value to Writer w. +func printInt(w io.Writer, val int64, base int) { + w.Write([]byte(strconv.FormatInt(val, base))) +} + +// printUint outputs an unsigned integer value to Writer w. +func printUint(w io.Writer, val uint64, base int) { + w.Write([]byte(strconv.FormatUint(val, base))) +} + +// printFloat outputs a floating point value using the specified precision, +// which is expected to be 32 or 64bit, to Writer w. +func printFloat(w io.Writer, val float64, precision int) { + w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) +} + +// printComplex outputs a complex value using the specified float precision +// for the real and imaginary parts to Writer w. +func printComplex(w io.Writer, c complex128, floatPrecision int) { + r := real(c) + w.Write(openParenBytes) + w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) + i := imag(c) + if i >= 0 { + w.Write(plusBytes) + } + w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) + w.Write(iBytes) + w.Write(closeParenBytes) +} + +// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' +// prefix to Writer w. +func printHexPtr(w io.Writer, p uintptr) { + // Null pointer. + num := uint64(p) + if num == 0 { + w.Write(nilAngleBytes) + return + } + + // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix + buf := make([]byte, 18) + + // It's simpler to construct the hex string right to left. + base := uint64(16) + i := len(buf) - 1 + for num >= base { + buf[i] = hexDigits[num%base] + num /= base + i-- + } + buf[i] = hexDigits[num] + + // Add '0x' prefix. + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + + // Strip unused leading bytes. + buf = buf[i:] + w.Write(buf) +} + +// valuesSorter implements sort.Interface to allow a slice of reflect.Value +// elements to be sorted. +type valuesSorter struct { + values []reflect.Value + strings []string // either nil or same len and values + cs *ConfigState +} + +// newValuesSorter initializes a valuesSorter instance, which holds a set of +// surrogate keys on which the data should be sorted. It uses flags in +// ConfigState to decide if and how to populate those surrogate keys. +func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { + vs := &valuesSorter{values: values, cs: cs} + if canSortSimply(vs.values[0].Kind()) { + return vs + } + if !cs.DisableMethods { + vs.strings = make([]string, len(values)) + for i := range vs.values { + b := bytes.Buffer{} + if !handleMethods(cs, &b, vs.values[i]) { + vs.strings = nil + break + } + vs.strings[i] = b.String() + } + } + if vs.strings == nil && cs.SpewKeys { + vs.strings = make([]string, len(values)) + for i := range vs.values { + vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) + } + } + return vs +} + +// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted +// directly, or whether it should be considered for sorting by surrogate keys +// (if the ConfigState allows it). +func canSortSimply(kind reflect.Kind) bool { + // This switch parallels valueSortLess, except for the default case. + switch kind { + case reflect.Bool: + return true + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return true + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Uintptr: + return true + case reflect.Array: + return true + } + return false +} + +// Len returns the number of values in the slice. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Len() int { + return len(s.values) +} + +// Swap swaps the values at the passed indices. It is part of the +// sort.Interface implementation. +func (s *valuesSorter) Swap(i, j int) { + s.values[i], s.values[j] = s.values[j], s.values[i] + if s.strings != nil { + s.strings[i], s.strings[j] = s.strings[j], s.strings[i] + } +} + +// valueSortLess returns whether the first value should sort before the second +// value. It is used by valueSorter.Less as part of the sort.Interface +// implementation. +func valueSortLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Bool: + return !a.Bool() && b.Bool() + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + return a.Int() < b.Int() + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + return a.Uint() < b.Uint() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.String: + return a.String() < b.String() + case reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Array: + // Compare the contents of both arrays. + l := a.Len() + for i := 0; i < l; i++ { + av := a.Index(i) + bv := b.Index(i) + if av.Interface() == bv.Interface() { + continue + } + return valueSortLess(av, bv) + } + } + return a.String() < b.String() +} + +// Less returns whether the value at index i should sort before the +// value at index j. It is part of the sort.Interface implementation. +func (s *valuesSorter) Less(i, j int) bool { + if s.strings == nil { + return valueSortLess(s.values[i], s.values[j]) + } + return s.strings[i] < s.strings[j] +} + +// sortValues is a sort function that handles both native types and any type that +// can be converted to error or Stringer. Other inputs are sorted according to +// their Value.String() value to ensure display stability. +func sortValues(values []reflect.Value, cs *ConfigState) { + if len(values) == 0 { + return + } + sort.Sort(newValuesSorter(values, cs)) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go new file mode 100755 index 0000000..2e3d22f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/config.go @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "io" + "os" +) + +// ConfigState houses the configuration options used by spew to format and +// display values. There is a global instance, Config, that is used to control +// all top-level Formatter and Dump functionality. Each ConfigState instance +// provides methods equivalent to the top-level functions. +// +// The zero value for ConfigState provides no indentation. You would typically +// want to set it to a space or a tab. +// +// Alternatively, you can use NewDefaultConfig to get a ConfigState instance +// with default settings. See the documentation of NewDefaultConfig for default +// values. +type ConfigState struct { + // Indent specifies the string to use for each indentation level. The + // global config instance that all top-level functions use set this to a + // single space by default. If you would like more indentation, you might + // set this to a tab with "\t" or perhaps two spaces with " ". + Indent string + + // MaxDepth controls the maximum number of levels to descend into nested + // data structures. The default, 0, means there is no limit. + // + // NOTE: Circular data structures are properly detected, so it is not + // necessary to set this value unless you specifically want to limit deeply + // nested data structures. + MaxDepth int + + // DisableMethods specifies whether or not error and Stringer interfaces are + // invoked for types that implement them. + DisableMethods bool + + // DisablePointerMethods specifies whether or not to check for and invoke + // error and Stringer interfaces on types which only accept a pointer + // receiver when the current type is not a pointer. + // + // NOTE: This might be an unsafe action since calling one of these methods + // with a pointer receiver could technically mutate the value, however, + // in practice, types which choose to satisify an error or Stringer + // interface with a pointer receiver should not be mutating their state + // inside these interface methods. As a result, this option relies on + // access to the unsafe package, so it will not have any effect when + // running in environments without access to the unsafe package such as + // Google App Engine or with the "safe" build tag specified. + DisablePointerMethods bool + + // DisablePointerAddresses specifies whether to disable the printing of + // pointer addresses. This is useful when diffing data structures in tests. + DisablePointerAddresses bool + + // DisableCapacities specifies whether to disable the printing of capacities + // for arrays, slices, maps and channels. This is useful when diffing + // data structures in tests. + DisableCapacities bool + + // ContinueOnMethod specifies whether or not recursion should continue once + // a custom error or Stringer interface is invoked. The default, false, + // means it will print the results of invoking the custom error or Stringer + // interface and return immediately instead of continuing to recurse into + // the internals of the data type. + // + // NOTE: This flag does not have any effect if method invocation is disabled + // via the DisableMethods or DisablePointerMethods options. + ContinueOnMethod bool + + // SortKeys specifies map keys should be sorted before being printed. Use + // this to have a more deterministic, diffable output. Note that only + // native types (bool, int, uint, floats, uintptr and string) and types + // that support the error or Stringer interfaces (if methods are + // enabled) are supported, with other types sorted according to the + // reflect.Value.String() output which guarantees display stability. + SortKeys bool + + // SpewKeys specifies that, as a last resort attempt, map keys should + // be spewed to strings and sorted by those strings. This is only + // considered if SortKeys is true. + SpewKeys bool +} + +// Config is the active configuration of the top-level functions. +// The configuration can be changed by modifying the contents of spew.Config. +var Config = ConfigState{Indent: " "} + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the formatted string as a value that satisfies error. See NewFormatter +// for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, c.convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, c.convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, c.convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a Formatter interface returned by c.NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, c.convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Print(a ...interface{}) (n int, err error) { + return fmt.Print(c.convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, c.convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Println(a ...interface{}) (n int, err error) { + return fmt.Println(c.convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprint(a ...interface{}) string { + return fmt.Sprint(c.convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a Formatter interface returned by c.NewFormatter. It returns +// the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, c.convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a Formatter interface returned by c.NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) +func (c *ConfigState) Sprintln(a ...interface{}) string { + return fmt.Sprintln(c.convertArgs(a)...) +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +c.Printf, c.Println, or c.Printf. +*/ +func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(c, v) +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { + fdump(c, w, a...) +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by modifying the public members +of c. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func (c *ConfigState) Dump(a ...interface{}) { + fdump(c, os.Stdout, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func (c *ConfigState) Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(c, &buf, a...) + return buf.String() +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a spew Formatter interface using +// the ConfigState associated with s. +func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = newFormatter(c, arg) + } + return formatters +} + +// NewDefaultConfig returns a ConfigState with the following default settings. +// +// Indent: " " +// MaxDepth: 0 +// DisableMethods: false +// DisablePointerMethods: false +// ContinueOnMethod: false +// SortKeys: false +func NewDefaultConfig() *ConfigState { + return &ConfigState{Indent: " "} +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go new file mode 100755 index 0000000..aacaac6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/doc.go @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* +Package spew implements a deep pretty printer for Go data structures to aid in +debugging. + +A quick overview of the additional features spew provides over the built-in +printing facilities for Go data types are as follows: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output (only when using + Dump style) + +There are two different approaches spew allows for dumping Go data structures: + + * Dump style which prints with newlines, customizable indentation, + and additional debug information such as types and all pointer addresses + used to indirect to the final value + * A custom Formatter interface that integrates cleanly with the standard fmt + package and replaces %v, %+v, %#v, and %#+v to provide inline printing + similar to the default %v while providing the additional functionality + outlined above and passing unsupported format verbs such as %x and %q + along to fmt + +Quick Start + +This section demonstrates how to quickly get started with spew. See the +sections below for further details on formatting and configuration options. + +To dump a variable with full newlines, indentation, type, and pointer +information use Dump, Fdump, or Sdump: + spew.Dump(myVar1, myVar2, ...) + spew.Fdump(someWriter, myVar1, myVar2, ...) + str := spew.Sdump(myVar1, myVar2, ...) + +Alternatively, if you would prefer to use format strings with a compacted inline +printing style, use the convenience wrappers Printf, Fprintf, etc with +%v (most compact), %+v (adds pointer addresses), %#v (adds types), or +%#+v (adds types and pointer addresses): + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +Configuration Options + +Configuration of spew is handled by fields in the ConfigState type. For +convenience, all of the top-level functions use a global state available +via the spew.Config global. + +It is also possible to create a ConfigState instance that provides methods +equivalent to the top-level functions. This allows concurrent configuration +options. See the ConfigState documentation for more details. + +The following configuration options are available: + * Indent + String to use for each indentation level for Dump functions. + It is a single space by default. A popular alternative is "\t". + + * MaxDepth + Maximum number of levels to descend into nested data structures. + There is no limit by default. + + * DisableMethods + Disables invocation of error and Stringer interface methods. + Method invocation is enabled by default. + + * DisablePointerMethods + Disables invocation of error and Stringer interface methods on types + which only accept pointer receivers from non-pointer variables. + Pointer method invocation is enabled by default. + + * DisablePointerAddresses + DisablePointerAddresses specifies whether to disable the printing of + pointer addresses. This is useful when diffing data structures in tests. + + * DisableCapacities + DisableCapacities specifies whether to disable the printing of + capacities for arrays, slices, maps and channels. This is useful when + diffing data structures in tests. + + * ContinueOnMethod + Enables recursion into types after invoking error and Stringer interface + methods. Recursion after method invocation is disabled by default. + + * SortKeys + Specifies map keys should be sorted before being printed. Use + this to have a more deterministic, diffable output. Note that + only native types (bool, int, uint, floats, uintptr and string) + and types which implement error or Stringer interfaces are + supported with other types sorted according to the + reflect.Value.String() output which guarantees display + stability. Natural map order is used by default. + + * SpewKeys + Specifies that, as a last resort attempt, map keys should be + spewed to strings and sorted by those strings. This is only + considered if SortKeys is true. + +Dump Usage + +Simply call spew.Dump with a list of variables you want to dump: + + spew.Dump(myVar1, myVar2, ...) + +You may also call spew.Fdump if you would prefer to output to an arbitrary +io.Writer. For example, to dump to standard error: + + spew.Fdump(os.Stderr, myVar1, myVar2, ...) + +A third option is to call spew.Sdump to get the formatted output as a string: + + str := spew.Sdump(myVar1, myVar2, ...) + +Sample Dump Output + +See the Dump example for details on the setup of the types and variables being +shown here. + + (main.Foo) { + unexportedField: (*main.Bar)(0xf84002e210)({ + flag: (main.Flag) flagTwo, + data: (uintptr) + }), + ExportedField: (map[interface {}]interface {}) (len=1) { + (string) (len=3) "one": (bool) true + } + } + +Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C +command as shown. + ([]uint8) (len=32 cap=32) { + 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | + 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| + 00000020 31 32 |12| + } + +Custom Formatter + +Spew provides a custom formatter that implements the fmt.Formatter interface +so that it integrates cleanly with standard fmt package printing functions. The +formatter is useful for inline printing of smaller data types similar to the +standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Custom Formatter Usage + +The simplest way to make use of the spew custom formatter is to call one of the +convenience functions such as spew.Printf, spew.Println, or spew.Printf. The +functions have syntax you are most likely already familiar with: + + spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + spew.Println(myVar, myVar2) + spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) + spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) + +See the Index for the full list convenience functions. + +Sample Formatter Output + +Double pointer to a uint8: + %v: <**>5 + %+v: <**>(0xf8400420d0->0xf8400420c8)5 + %#v: (**uint8)5 + %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 + +Pointer to circular struct with a uint8 field and a pointer to itself: + %v: <*>{1 <*>} + %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} + %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} + %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} + +See the Printf example for details on the setup of variables being shown +here. + +Errors + +Since it is possible for custom Stringer/error interfaces to panic, spew +detects them and handles them internally by printing the panic information +inline with the output. Since spew is intended to provide deep pretty printing +capabilities on structures, it intentionally does not return any errors. +*/ +package spew diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go new file mode 100755 index 0000000..df1d582 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -0,0 +1,509 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "os" + "reflect" + "regexp" + "strconv" + "strings" +) + +var ( + // uint8Type is a reflect.Type representing a uint8. It is used to + // convert cgo types to uint8 slices for hexdumping. + uint8Type = reflect.TypeOf(uint8(0)) + + // cCharRE is a regular expression that matches a cgo char. + // It is used to detect character arrays to hexdump them. + cCharRE = regexp.MustCompile("^.*\\._Ctype_char$") + + // cUnsignedCharRE is a regular expression that matches a cgo unsigned + // char. It is used to detect unsigned character arrays to hexdump + // them. + cUnsignedCharRE = regexp.MustCompile("^.*\\._Ctype_unsignedchar$") + + // cUint8tCharRE is a regular expression that matches a cgo uint8_t. + // It is used to detect uint8_t arrays to hexdump them. + cUint8tCharRE = regexp.MustCompile("^.*\\._Ctype_uint8_t$") +) + +// dumpState contains information about the state of a dump operation. +type dumpState struct { + w io.Writer + depth int + pointers map[uintptr]int + ignoreNextType bool + ignoreNextIndent bool + cs *ConfigState +} + +// indent performs indentation according to the depth level and cs.Indent +// option. +func (d *dumpState) indent() { + if d.ignoreNextIndent { + d.ignoreNextIndent = false + return + } + d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) +} + +// unpackValue returns values inside of non-nil interfaces when possible. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface && !v.IsNil() { + v = v.Elem() + } + return v +} + +// dumpPtr handles formatting of pointers by indirecting them as necessary. +func (d *dumpState) dumpPtr(v reflect.Value) { + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range d.pointers { + if depth >= d.depth { + delete(d.pointers, k) + } + } + + // Keep list of all dereferenced pointers to show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by dereferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := d.pointers[addr]; ok && pd < d.depth { + cycleFound = true + indirects-- + break + } + d.pointers[addr] = d.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type information. + d.w.Write(openParenBytes) + d.w.Write(bytes.Repeat(asteriskBytes, indirects)) + d.w.Write([]byte(ve.Type().String())) + d.w.Write(closeParenBytes) + + // Display pointer information. + if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { + d.w.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + d.w.Write(pointerChainBytes) + } + printHexPtr(d.w, addr) + } + d.w.Write(closeParenBytes) + } + + // Display dereferenced value. + d.w.Write(openParenBytes) + switch { + case nilFound == true: + d.w.Write(nilAngleBytes) + + case cycleFound == true: + d.w.Write(circularBytes) + + default: + d.ignoreNextType = true + d.dump(ve) + } + d.w.Write(closeParenBytes) +} + +// dumpSlice handles formatting of arrays and slices. Byte (uint8 under +// reflection) arrays and slices are dumped in hexdump -C fashion. +func (d *dumpState) dumpSlice(v reflect.Value) { + // Determine whether this type should be hex dumped or not. Also, + // for types which should be hexdumped, try to use the underlying data + // first, then fall back to trying to convert them to a uint8 slice. + var buf []uint8 + doConvert := false + doHexDump := false + numEntries := v.Len() + if numEntries > 0 { + vt := v.Index(0).Type() + vts := vt.String() + switch { + // C types that need to be converted. + case cCharRE.MatchString(vts): + fallthrough + case cUnsignedCharRE.MatchString(vts): + fallthrough + case cUint8tCharRE.MatchString(vts): + doConvert = true + + // Try to use existing uint8 slices and fall back to converting + // and copying if that fails. + case vt.Kind() == reflect.Uint8: + // We need an addressable interface to convert the type + // to a byte slice. However, the reflect package won't + // give us an interface on certain things like + // unexported struct fields in order to enforce + // visibility rules. We use unsafe, when available, to + // bypass these restrictions since this package does not + // mutate the values. + vs := v + if !vs.CanInterface() || !vs.CanAddr() { + vs = unsafeReflectValue(vs) + } + if !UnsafeDisabled { + vs = vs.Slice(0, numEntries) + + // Use the existing uint8 slice if it can be + // type asserted. + iface := vs.Interface() + if slice, ok := iface.([]uint8); ok { + buf = slice + doHexDump = true + break + } + } + + // The underlying data needs to be converted if it can't + // be type asserted to a uint8 slice. + doConvert = true + } + + // Copy and convert the underlying type if needed. + if doConvert && vt.ConvertibleTo(uint8Type) { + // Convert and copy each element into a uint8 byte + // slice. + buf = make([]uint8, numEntries) + for i := 0; i < numEntries; i++ { + vv := v.Index(i) + buf[i] = uint8(vv.Convert(uint8Type).Uint()) + } + doHexDump = true + } + } + + // Hexdump the entire slice as needed. + if doHexDump { + indent := strings.Repeat(d.cs.Indent, d.depth) + str := indent + hex.Dump(buf) + str = strings.Replace(str, "\n", "\n"+indent, -1) + str = strings.TrimRight(str, d.cs.Indent) + d.w.Write([]byte(str)) + return + } + + // Recursively call dump for each item. + for i := 0; i < numEntries; i++ { + d.dump(d.unpackValue(v.Index(i))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } +} + +// dump is the main workhorse for dumping a value. It uses the passed reflect +// value to figure out what kind of object we are dealing with and formats it +// appropriately. It is a recursive function, however circular data structures +// are detected and handled properly. +func (d *dumpState) dump(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + d.w.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + d.indent() + d.dumpPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !d.ignoreNextType { + d.indent() + d.w.Write(openParenBytes) + d.w.Write([]byte(v.Type().String())) + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + d.ignoreNextType = false + + // Display length and capacity if the built-in len and cap functions + // work with the value's kind and the len/cap itself is non-zero. + valueLen, valueCap := 0, 0 + switch v.Kind() { + case reflect.Array, reflect.Slice, reflect.Chan: + valueLen, valueCap = v.Len(), v.Cap() + case reflect.Map, reflect.String: + valueLen = v.Len() + } + if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { + d.w.Write(openParenBytes) + if valueLen != 0 { + d.w.Write(lenEqualsBytes) + printInt(d.w, int64(valueLen), 10) + } + if !d.cs.DisableCapacities && valueCap != 0 { + if valueLen != 0 { + d.w.Write(spaceBytes) + } + d.w.Write(capEqualsBytes) + printInt(d.w, int64(valueCap), 10) + } + d.w.Write(closeParenBytes) + d.w.Write(spaceBytes) + } + + // Call Stringer/error interfaces if they exist and the handle methods flag + // is enabled + if !d.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(d.cs, d.w, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(d.w, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(d.w, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(d.w, v.Uint(), 10) + + case reflect.Float32: + printFloat(d.w, v.Float(), 32) + + case reflect.Float64: + printFloat(d.w, v.Float(), 64) + + case reflect.Complex64: + printComplex(d.w, v.Complex(), 32) + + case reflect.Complex128: + printComplex(d.w, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + d.dumpSlice(v) + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.String: + d.w.Write([]byte(strconv.Quote(v.String()))) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + d.w.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + d.w.Write(nilAngleBytes) + break + } + + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + numEntries := v.Len() + keys := v.MapKeys() + if d.cs.SortKeys { + sortValues(keys, d.cs) + } + for i, key := range keys { + d.dump(d.unpackValue(key)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.MapIndex(key))) + if i < (numEntries - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Struct: + d.w.Write(openBraceNewlineBytes) + d.depth++ + if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { + d.indent() + d.w.Write(maxNewlineBytes) + } else { + vt := v.Type() + numFields := v.NumField() + for i := 0; i < numFields; i++ { + d.indent() + vtf := vt.Field(i) + d.w.Write([]byte(vtf.Name)) + d.w.Write(colonSpaceBytes) + d.ignoreNextIndent = true + d.dump(d.unpackValue(v.Field(i))) + if i < (numFields - 1) { + d.w.Write(commaNewlineBytes) + } else { + d.w.Write(newlineBytes) + } + } + } + d.depth-- + d.indent() + d.w.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(d.w, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(d.w, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it in case any new + // types are added. + default: + if v.CanInterface() { + fmt.Fprintf(d.w, "%v", v.Interface()) + } else { + fmt.Fprintf(d.w, "%v", v.String()) + } + } +} + +// fdump is a helper function to consolidate the logic from the various public +// methods which take varying writers and config states. +func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { + for _, arg := range a { + if arg == nil { + w.Write(interfaceBytes) + w.Write(spaceBytes) + w.Write(nilAngleBytes) + w.Write(newlineBytes) + continue + } + + d := dumpState{w: w, cs: cs} + d.pointers = make(map[uintptr]int) + d.dump(reflect.ValueOf(arg)) + d.w.Write(newlineBytes) + } +} + +// Fdump formats and displays the passed arguments to io.Writer w. It formats +// exactly the same as Dump. +func Fdump(w io.Writer, a ...interface{}) { + fdump(&Config, w, a...) +} + +// Sdump returns a string with the passed arguments formatted exactly the same +// as Dump. +func Sdump(a ...interface{}) string { + var buf bytes.Buffer + fdump(&Config, &buf, a...) + return buf.String() +} + +/* +Dump displays the passed parameters to standard out with newlines, customizable +indentation, and additional debug information such as complete types and all +pointer addresses used to indirect to the final value. It provides the +following features over the built-in printing facilities provided by the fmt +package: + + * Pointers are dereferenced and followed + * Circular data structures are detected and handled properly + * Custom Stringer/error interfaces are optionally invoked, including + on unexported types + * Custom types which only implement the Stringer/error interfaces via + a pointer receiver are optionally invoked when passing non-pointer + variables + * Byte arrays and slices are dumped like the hexdump -C command which + includes offsets, byte values in hex, and ASCII output + +The configuration options are controlled by an exported package global, +spew.Config. See ConfigState for options documentation. + +See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to +get the formatted result as a string. +*/ +func Dump(a ...interface{}) { + fdump(&Config, os.Stdout, a...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go new file mode 100755 index 0000000..c49875b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/format.go @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "bytes" + "fmt" + "reflect" + "strconv" + "strings" +) + +// supportedFlags is a list of all the character flags supported by fmt package. +const supportedFlags = "0-+# " + +// formatState implements the fmt.Formatter interface and contains information +// about the state of a formatting operation. The NewFormatter function can +// be used to get a new Formatter which can be used directly as arguments +// in standard fmt package printing calls. +type formatState struct { + value interface{} + fs fmt.State + depth int + pointers map[uintptr]int + ignoreNextType bool + cs *ConfigState +} + +// buildDefaultFormat recreates the original format string without precision +// and width information to pass in to fmt.Sprintf in the case of an +// unrecognized type. Unless new types are added to the language, this +// function won't ever be called. +func (f *formatState) buildDefaultFormat() (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + buf.WriteRune('v') + + format = buf.String() + return format +} + +// constructOrigFormat recreates the original format string including precision +// and width information to pass along to the standard fmt package. This allows +// automatic deferral of all format strings this package doesn't support. +func (f *formatState) constructOrigFormat(verb rune) (format string) { + buf := bytes.NewBuffer(percentBytes) + + for _, flag := range supportedFlags { + if f.fs.Flag(int(flag)) { + buf.WriteRune(flag) + } + } + + if width, ok := f.fs.Width(); ok { + buf.WriteString(strconv.Itoa(width)) + } + + if precision, ok := f.fs.Precision(); ok { + buf.Write(precisionBytes) + buf.WriteString(strconv.Itoa(precision)) + } + + buf.WriteRune(verb) + + format = buf.String() + return format +} + +// unpackValue returns values inside of non-nil interfaces when possible and +// ensures that types for values which have been unpacked from an interface +// are displayed when the show types flag is also set. +// This is useful for data types like structs, arrays, slices, and maps which +// can contain varying types packed inside an interface. +func (f *formatState) unpackValue(v reflect.Value) reflect.Value { + if v.Kind() == reflect.Interface { + f.ignoreNextType = false + if !v.IsNil() { + v = v.Elem() + } + } + return v +} + +// formatPtr handles formatting of pointers by indirecting them as necessary. +func (f *formatState) formatPtr(v reflect.Value) { + // Display nil if top level pointer is nil. + showTypes := f.fs.Flag('#') + if v.IsNil() && (!showTypes || f.ignoreNextType) { + f.fs.Write(nilAngleBytes) + return + } + + // Remove pointers at or below the current depth from map used to detect + // circular refs. + for k, depth := range f.pointers { + if depth >= f.depth { + delete(f.pointers, k) + } + } + + // Keep list of all dereferenced pointers to possibly show later. + pointerChain := make([]uintptr, 0) + + // Figure out how many levels of indirection there are by derferencing + // pointers and unpacking interfaces down the chain while detecting circular + // references. + nilFound := false + cycleFound := false + indirects := 0 + ve := v + for ve.Kind() == reflect.Ptr { + if ve.IsNil() { + nilFound = true + break + } + indirects++ + addr := ve.Pointer() + pointerChain = append(pointerChain, addr) + if pd, ok := f.pointers[addr]; ok && pd < f.depth { + cycleFound = true + indirects-- + break + } + f.pointers[addr] = f.depth + + ve = ve.Elem() + if ve.Kind() == reflect.Interface { + if ve.IsNil() { + nilFound = true + break + } + ve = ve.Elem() + } + } + + // Display type or indirection level depending on flags. + if showTypes && !f.ignoreNextType { + f.fs.Write(openParenBytes) + f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) + f.fs.Write([]byte(ve.Type().String())) + f.fs.Write(closeParenBytes) + } else { + if nilFound || cycleFound { + indirects += strings.Count(ve.Type().String(), "*") + } + f.fs.Write(openAngleBytes) + f.fs.Write([]byte(strings.Repeat("*", indirects))) + f.fs.Write(closeAngleBytes) + } + + // Display pointer information depending on flags. + if f.fs.Flag('+') && (len(pointerChain) > 0) { + f.fs.Write(openParenBytes) + for i, addr := range pointerChain { + if i > 0 { + f.fs.Write(pointerChainBytes) + } + printHexPtr(f.fs, addr) + } + f.fs.Write(closeParenBytes) + } + + // Display dereferenced value. + switch { + case nilFound == true: + f.fs.Write(nilAngleBytes) + + case cycleFound == true: + f.fs.Write(circularShortBytes) + + default: + f.ignoreNextType = true + f.format(ve) + } +} + +// format is the main workhorse for providing the Formatter interface. It +// uses the passed reflect value to figure out what kind of object we are +// dealing with and formats it appropriately. It is a recursive function, +// however circular data structures are detected and handled properly. +func (f *formatState) format(v reflect.Value) { + // Handle invalid reflect values immediately. + kind := v.Kind() + if kind == reflect.Invalid { + f.fs.Write(invalidAngleBytes) + return + } + + // Handle pointers specially. + if kind == reflect.Ptr { + f.formatPtr(v) + return + } + + // Print type information unless already handled elsewhere. + if !f.ignoreNextType && f.fs.Flag('#') { + f.fs.Write(openParenBytes) + f.fs.Write([]byte(v.Type().String())) + f.fs.Write(closeParenBytes) + } + f.ignoreNextType = false + + // Call Stringer/error interfaces if they exist and the handle methods + // flag is enabled. + if !f.cs.DisableMethods { + if (kind != reflect.Invalid) && (kind != reflect.Interface) { + if handled := handleMethods(f.cs, f.fs, v); handled { + return + } + } + } + + switch kind { + case reflect.Invalid: + // Do nothing. We should never get here since invalid has already + // been handled above. + + case reflect.Bool: + printBool(f.fs, v.Bool()) + + case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: + printInt(f.fs, v.Int(), 10) + + case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: + printUint(f.fs, v.Uint(), 10) + + case reflect.Float32: + printFloat(f.fs, v.Float(), 32) + + case reflect.Float64: + printFloat(f.fs, v.Float(), 64) + + case reflect.Complex64: + printComplex(f.fs, v.Complex(), 32) + + case reflect.Complex128: + printComplex(f.fs, v.Complex(), 64) + + case reflect.Slice: + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + fallthrough + + case reflect.Array: + f.fs.Write(openBracketBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + numEntries := v.Len() + for i := 0; i < numEntries; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(v.Index(i))) + } + } + f.depth-- + f.fs.Write(closeBracketBytes) + + case reflect.String: + f.fs.Write([]byte(v.String())) + + case reflect.Interface: + // The only time we should get here is for nil interfaces due to + // unpackValue calls. + if v.IsNil() { + f.fs.Write(nilAngleBytes) + } + + case reflect.Ptr: + // Do nothing. We should never get here since pointers have already + // been handled above. + + case reflect.Map: + // nil maps should be indicated as different than empty maps + if v.IsNil() { + f.fs.Write(nilAngleBytes) + break + } + + f.fs.Write(openMapBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + keys := v.MapKeys() + if f.cs.SortKeys { + sortValues(keys, f.cs) + } + for i, key := range keys { + if i > 0 { + f.fs.Write(spaceBytes) + } + f.ignoreNextType = true + f.format(f.unpackValue(key)) + f.fs.Write(colonBytes) + f.ignoreNextType = true + f.format(f.unpackValue(v.MapIndex(key))) + } + } + f.depth-- + f.fs.Write(closeMapBytes) + + case reflect.Struct: + numFields := v.NumField() + f.fs.Write(openBraceBytes) + f.depth++ + if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { + f.fs.Write(maxShortBytes) + } else { + vt := v.Type() + for i := 0; i < numFields; i++ { + if i > 0 { + f.fs.Write(spaceBytes) + } + vtf := vt.Field(i) + if f.fs.Flag('+') || f.fs.Flag('#') { + f.fs.Write([]byte(vtf.Name)) + f.fs.Write(colonBytes) + } + f.format(f.unpackValue(v.Field(i))) + } + } + f.depth-- + f.fs.Write(closeBraceBytes) + + case reflect.Uintptr: + printHexPtr(f.fs, uintptr(v.Uint())) + + case reflect.UnsafePointer, reflect.Chan, reflect.Func: + printHexPtr(f.fs, v.Pointer()) + + // There were not any other types at the time this code was written, but + // fall back to letting the default fmt package handle it if any get added. + default: + format := f.buildDefaultFormat() + if v.CanInterface() { + fmt.Fprintf(f.fs, format, v.Interface()) + } else { + fmt.Fprintf(f.fs, format, v.String()) + } + } +} + +// Format satisfies the fmt.Formatter interface. See NewFormatter for usage +// details. +func (f *formatState) Format(fs fmt.State, verb rune) { + f.fs = fs + + // Use standard formatting for verbs that are not v. + if verb != 'v' { + format := f.constructOrigFormat(verb) + fmt.Fprintf(fs, format, f.value) + return + } + + if f.value == nil { + if fs.Flag('#') { + fs.Write(interfaceBytes) + } + fs.Write(nilAngleBytes) + return + } + + f.format(reflect.ValueOf(f.value)) +} + +// newFormatter is a helper function to consolidate the logic from the various +// public methods which take varying config states. +func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { + fs := &formatState{value: v, cs: cs} + fs.pointers = make(map[uintptr]int) + return fs +} + +/* +NewFormatter returns a custom formatter that satisfies the fmt.Formatter +interface. As a result, it integrates cleanly with standard fmt package +printing functions. The formatter is useful for inline printing of smaller data +types similar to the standard %v format specifier. + +The custom formatter only responds to the %v (most compact), %+v (adds pointer +addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb +combinations. Any other verbs such as %x and %q will be sent to the the +standard fmt package for formatting. In addition, the custom formatter ignores +the width and precision arguments (however they will still work on the format +specifiers not handled by the custom formatter). + +Typically this function shouldn't be called directly. It is much easier to make +use of the custom formatter by calling one of the convenience functions such as +Printf, Println, or Fprintf. +*/ +func NewFormatter(v interface{}) fmt.Formatter { + return newFormatter(&Config, v) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go new file mode 100755 index 0000000..32c0e33 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/davecgh/go-spew/spew/spew.go @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2013-2016 Dave Collins + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +package spew + +import ( + "fmt" + "io" +) + +// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the formatted string as a value that satisfies error. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Errorf(format string, a ...interface{}) (err error) { + return fmt.Errorf(format, convertArgs(a)...) +} + +// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprint(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprint(w, convertArgs(a)...) +} + +// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(w, format, convertArgs(a)...) +} + +// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it +// passed with a default Formatter interface returned by NewFormatter. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) +func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { + return fmt.Fprintln(w, convertArgs(a)...) +} + +// Print is a wrapper for fmt.Print that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) +func Print(a ...interface{}) (n int, err error) { + return fmt.Print(convertArgs(a)...) +} + +// Printf is a wrapper for fmt.Printf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Printf(format, convertArgs(a)...) +} + +// Println is a wrapper for fmt.Println that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the number of bytes written and any write error encountered. See +// NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) +func Println(a ...interface{}) (n int, err error) { + return fmt.Println(convertArgs(a)...) +} + +// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprint(a ...interface{}) string { + return fmt.Sprint(convertArgs(a)...) +} + +// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were +// passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintf(format string, a ...interface{}) string { + return fmt.Sprintf(format, convertArgs(a)...) +} + +// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it +// were passed with a default Formatter interface returned by NewFormatter. It +// returns the resulting string. See NewFormatter for formatting details. +// +// This function is shorthand for the following syntax: +// +// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) +func Sprintln(a ...interface{}) string { + return fmt.Sprintln(convertArgs(a)...) +} + +// convertArgs accepts a slice of arguments and returns a slice of the same +// length with each argument converted to a default spew Formatter interface. +func convertArgs(args []interface{}) (formatters []interface{}) { + formatters = make([]interface{}, len(args)) + for index, arg := range args { + formatters[index] = NewFormatter(arg) + } + return formatters +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig new file mode 100755 index 0000000..ba49e3c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -0,0 +1,5 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore new file mode 100755 index 0000000..4cd0cba --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.gitignore @@ -0,0 +1,6 @@ +# Setup a Global .gitignore for OS and editor generated files: +# https://help.github.com/articles/ignoring-files +# git config --global core.excludesfile ~/.gitignore_global + +.vagrant +*.sublime-project diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml new file mode 100755 index 0000000..981d1bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/.travis.yml @@ -0,0 +1,30 @@ +sudo: false +language: go + +go: + - 1.8.x + - 1.9.x + - tip + +matrix: + allow_failures: + - go: tip + fast_finish: true + +before_script: + - go get -u github.com/golang/lint/golint + +script: + - go test -v --race ./... + +after_script: + - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" + - test -z "$(golint ./... | tee /dev/stderr)" + - go vet ./... + +os: + - linux + - osx + +notifications: + email: false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS new file mode 100755 index 0000000..5ab5d41 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/AUTHORS @@ -0,0 +1,52 @@ +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# You can update this list using the following command: +# +# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' + +# Please keep the list sorted. + +Aaron L +Adrien Bustany +Amit Krishnan +Anmol Sethi +Bjørn Erik Pedersen +Bruno Bigras +Caleb Spare +Case Nelson +Chris Howey +Christoffer Buchholz +Daniel Wagner-Hall +Dave Cheney +Evan Phoenix +Francisco Souza +Hari haran +John C Barstow +Kelvin Fo +Ken-ichirou MATSUZAWA +Matt Layher +Nathan Youngman +Nickolai Zeldovich +Patrick +Paul Hammond +Pawel Knap +Pieter Droogendijk +Pursuit92 +Riku Voipio +Rob Figueiredo +Rodrigo Chiossi +Slawek Ligus +Soge Zhang +Tiffany Jernigan +Tilak Sharma +Tom Payne +Travis Cline +Tudor Golubenco +Vahe Khachikyan +Yukang +bronze1man +debrando +henrikedwards +铁哥 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md new file mode 100755 index 0000000..be4d7ea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md @@ -0,0 +1,317 @@ +# Changelog + +## v1.4.7 / 2018-01-09 + +* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) +* Tests: Fix missing verb on format string (thanks @rchiossi) +* Linux: Fix deadlock in Remove (thanks @aarondl) +* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) +* Docs: Moved FAQ into the README (thanks @vahe) +* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) +* Docs: replace references to OS X with macOS + +## v1.4.2 / 2016-10-10 + +* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) + +## v1.4.1 / 2016-10-04 + +* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) + +## v1.4.0 / 2016-10-01 + +* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) + +## v1.3.1 / 2016-06-28 + +* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) + +## v1.3.0 / 2016-04-19 + +* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) + +## v1.2.10 / 2016-03-02 + +* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) + +## v1.2.9 / 2016-01-13 + +kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) + +## v1.2.8 / 2015-12-17 + +* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) +* inotify: fix race in test +* enable race detection for continuous integration (Linux, Mac, Windows) + +## v1.2.5 / 2015-10-17 + +* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) +* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) +* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) +* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) + +## v1.2.1 / 2015-10-14 + +* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) + +## v1.2.0 / 2015-02-08 + +* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) +* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) +* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) + +## v1.1.1 / 2015-02-05 + +* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) + +## v1.1.0 / 2014-12-12 + +* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) + * add low-level functions + * only need to store flags on directories + * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) + * done can be an unbuffered channel + * remove calls to os.NewSyscallError +* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) +* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v1.0.4 / 2014-09-07 + +* kqueue: add dragonfly to the build tags. +* Rename source code files, rearrange code so exported APIs are at the top. +* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) + +## v1.0.3 / 2014-08-19 + +* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) + +## v1.0.2 / 2014-08-17 + +* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) +* [Fix] Make ./path and path equivalent. (thanks @zhsso) + +## v1.0.0 / 2014-08-15 + +* [API] Remove AddWatch on Windows, use Add. +* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) +* Minor updates based on feedback from golint. + +## dev / 2014-07-09 + +* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). +* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) + +## dev / 2014-07-04 + +* kqueue: fix incorrect mutex used in Close() +* Update example to demonstrate usage of Op. + +## dev / 2014-06-28 + +* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) +* Fix for String() method on Event (thanks Alex Brainman) +* Don't build on Plan 9 or Solaris (thanks @4ad) + +## dev / 2014-06-21 + +* Events channel of type Event rather than *Event. +* [internal] use syscall constants directly for inotify and kqueue. +* [internal] kqueue: rename events to kevents and fileEvent to event. + +## dev / 2014-06-19 + +* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). +* [internal] remove cookie from Event struct (unused). +* [internal] Event struct has the same definition across every OS. +* [internal] remove internal watch and removeWatch methods. + +## dev / 2014-06-12 + +* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). +* [API] Pluralized channel names: Events and Errors. +* [API] Renamed FileEvent struct to Event. +* [API] Op constants replace methods like IsCreate(). + +## dev / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## dev / 2014-05-23 + +* [API] Remove current implementation of WatchFlags. + * current implementation doesn't take advantage of OS for efficiency + * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes + * no tests for the current implementation + * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) + +## v0.9.3 / 2014-12-31 + +* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) + +## v0.9.2 / 2014-08-17 + +* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) + +## v0.9.1 / 2014-06-12 + +* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) + +## v0.9.0 / 2014-01-17 + +* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) +* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) +* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. + +## v0.8.12 / 2013-11-13 + +* [API] Remove FD_SET and friends from Linux adapter + +## v0.8.11 / 2013-11-02 + +* [Doc] Add Changelog [#72][] (thanks @nathany) +* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) + +## v0.8.10 / 2013-10-19 + +* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) +* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) +* [Doc] specify OS-specific limits in README (thanks @debrando) + +## v0.8.9 / 2013-09-08 + +* [Doc] Contributing (thanks @nathany) +* [Doc] update package path in example code [#63][] (thanks @paulhammond) +* [Doc] GoCI badge in README (Linux only) [#60][] +* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) + +## v0.8.8 / 2013-06-17 + +* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) + +## v0.8.7 / 2013-06-03 + +* [API] Make syscall flags internal +* [Fix] inotify: ignore event changes +* [Fix] race in symlink test [#45][] (reported by @srid) +* [Fix] tests on Windows +* lower case error messages + +## v0.8.6 / 2013-05-23 + +* kqueue: Use EVT_ONLY flag on Darwin +* [Doc] Update README with full example + +## v0.8.5 / 2013-05-09 + +* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) + +## v0.8.4 / 2013-04-07 + +* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) + +## v0.8.3 / 2013-03-13 + +* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) +* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) + +## v0.8.2 / 2013-02-07 + +* [Doc] add Authors +* [Fix] fix data races for map access [#29][] (thanks @fsouza) + +## v0.8.1 / 2013-01-09 + +* [Fix] Windows path separators +* [Doc] BSD License + +## v0.8.0 / 2012-11-09 + +* kqueue: directory watching improvements (thanks @vmirage) +* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) +* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) + +## v0.7.4 / 2012-10-09 + +* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) +* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) +* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) +* [Fix] kqueue: modify after recreation of file + +## v0.7.3 / 2012-09-27 + +* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) +* [Fix] kqueue: no longer get duplicate CREATE events + +## v0.7.2 / 2012-09-01 + +* kqueue: events for created directories + +## v0.7.1 / 2012-07-14 + +* [Fix] for renaming files + +## v0.7.0 / 2012-07-02 + +* [Feature] FSNotify flags +* [Fix] inotify: Added file name back to event path + +## v0.6.0 / 2012-06-06 + +* kqueue: watch files after directory created (thanks @tmc) + +## v0.5.1 / 2012-05-22 + +* [Fix] inotify: remove all watches before Close() + +## v0.5.0 / 2012-05-03 + +* [API] kqueue: return errors during watch instead of sending over channel +* kqueue: match symlink behavior on Linux +* inotify: add `DELETE_SELF` (requested by @taralx) +* [Fix] kqueue: handle EINTR (reported by @robfig) +* [Doc] Godoc example [#1][] (thanks @davecheney) + +## v0.4.0 / 2012-03-30 + +* Go 1 released: build with go tool +* [Feature] Windows support using winfsnotify +* Windows does not have attribute change notifications +* Roll attribute notifications into IsModify + +## v0.3.0 / 2012-02-19 + +* kqueue: add files when watch directory + +## v0.2.0 / 2011-12-30 + +* update to latest Go weekly code + +## v0.1.0 / 2011-10-19 + +* kqueue: add watch on file creation to match inotify +* kqueue: create file event +* inotify: ignore `IN_IGNORED` events +* event String() +* linux: common FileEvent functions +* initial commit + +[#79]: https://github.com/howeyc/fsnotify/pull/79 +[#77]: https://github.com/howeyc/fsnotify/pull/77 +[#72]: https://github.com/howeyc/fsnotify/issues/72 +[#71]: https://github.com/howeyc/fsnotify/issues/71 +[#70]: https://github.com/howeyc/fsnotify/issues/70 +[#63]: https://github.com/howeyc/fsnotify/issues/63 +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#60]: https://github.com/howeyc/fsnotify/issues/60 +[#59]: https://github.com/howeyc/fsnotify/issues/59 +[#49]: https://github.com/howeyc/fsnotify/issues/49 +[#45]: https://github.com/howeyc/fsnotify/issues/45 +[#40]: https://github.com/howeyc/fsnotify/issues/40 +[#36]: https://github.com/howeyc/fsnotify/issues/36 +[#33]: https://github.com/howeyc/fsnotify/issues/33 +[#29]: https://github.com/howeyc/fsnotify/issues/29 +[#25]: https://github.com/howeyc/fsnotify/issues/25 +[#24]: https://github.com/howeyc/fsnotify/issues/24 +[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md new file mode 100755 index 0000000..828a60b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md @@ -0,0 +1,77 @@ +# Contributing + +## Issues + +* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). +* Please indicate the platform you are using fsnotify on. +* A code example to reproduce the problem is appreciated. + +## Pull Requests + +### Contributor License Agreement + +fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). + +Please indicate that you have signed the CLA in your pull request. + +### How fsnotify is Developed + +* Development is done on feature branches. +* Tests are run on BSD, Linux, macOS and Windows. +* Pull requests are reviewed and [applied to master][am] using [hub][]. + * Maintainers may modify or squash commits rather than asking contributors to. +* To issue a new release, the maintainers will: + * Update the CHANGELOG + * Tag a version, which will become available through gopkg.in. + +### How to Fork + +For smooth sailing, always use the original import path. Installing with `go get` makes this easy. + +1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Ensure everything works and the tests pass (see below) +4. Commit your changes (`git commit -am 'Add some feature'`) + +Contribute upstream: + +1. Fork fsnotify on GitHub +2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) +3. Push to the branch (`git push fork my-new-feature`) +4. Create a new Pull Request on GitHub + +This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). + +### Testing + +fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. + +Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. + +To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. + +* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) +* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. +* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) +* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. +* When you're done, you will want to halt or destroy the Vagrant boxes. + +Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. + +Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). + +### Maintainers + +Help maintaining fsnotify is welcome. To be a maintainer: + +* Submit a pull request and sign the CLA as above. +* You must be able to run the test suite on Mac, Windows, Linux and BSD. + +To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. + +All code changes should be internal pull requests. + +Releases are tagged using [Semantic Versioning](http://semver.org/). + +[hub]: https://github.com/github/hub +[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE new file mode 100755 index 0000000..f21e540 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2012 fsnotify 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/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/README.md new file mode 100755 index 0000000..3993207 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/README.md @@ -0,0 +1,79 @@ +# File system notifications for Go + +[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) + +fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: + +```console +go get -u golang.org/x/sys/... +``` + +Cross platform: Windows, Linux, BSD and macOS. + +|Adapter |OS |Status | +|----------|----------|----------| +|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| +|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| +|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| +|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| +|fanotify |Linux 2.6.37+ | | +|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| +|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| + +\* Android and iOS are untested. + +Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. + +## API stability + +fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). + +All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. + +Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. + +## Contributing + +Please refer to [CONTRIBUTING][] before opening an issue or pull request. + +## Example + +See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). + +## FAQ + +**When a file is moved to another directory is it still being watched?** + +No (it shouldn't be, unless you are watching where it was moved to). + +**When I watch a directory, are all subdirectories watched as well?** + +No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). + +**Do I have to watch the Error and Event channels in a separate goroutine?** + +As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) + +**Why am I receiving multiple events for the same file on OS X?** + +Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). + +**How many files can be watched at once?** + +There are OS-specific limits as to how many watches can be created: +* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. +* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. + +[#62]: https://github.com/howeyc/fsnotify/issues/62 +[#18]: https://github.com/fsnotify/fsnotify/issues/18 +[#11]: https://github.com/fsnotify/fsnotify/issues/11 +[#7]: https://github.com/howeyc/fsnotify/issues/7 + +[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md + +## Related Projects + +* [notify](https://github.com/rjeczalik/notify) +* [fsevents](https://github.com/fsnotify/fsevents) + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go new file mode 100755 index 0000000..ced39cb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fen.go @@ -0,0 +1,37 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package fsnotify + +import ( + "errors" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + return nil +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go new file mode 100755 index 0000000..190bf0d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -0,0 +1,66 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !plan9 + +// Package fsnotify provides a platform-independent interface for file system notifications. +package fsnotify + +import ( + "bytes" + "errors" + "fmt" +) + +// Event represents a single file system notification. +type Event struct { + Name string // Relative path to the file or directory. + Op Op // File operation that triggered the event. +} + +// Op describes a set of file operations. +type Op uint32 + +// These are the generalized file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + +func (op Op) String() string { + // Use a buffer for efficient string concatenation + var buffer bytes.Buffer + + if op&Create == Create { + buffer.WriteString("|CREATE") + } + if op&Remove == Remove { + buffer.WriteString("|REMOVE") + } + if op&Write == Write { + buffer.WriteString("|WRITE") + } + if op&Rename == Rename { + buffer.WriteString("|RENAME") + } + if op&Chmod == Chmod { + buffer.WriteString("|CHMOD") + } + if buffer.Len() == 0 { + return "" + } + return buffer.String()[1:] // Strip leading pipe +} + +// String returns a string representation of the event in the form +// "file: REMOVE|WRITE|..." +func (e Event) String() string { + return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) +} + +// Common errors that can be reported by a watcher +var ErrEventOverflow = errors.New("fsnotify queue overflow") diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go new file mode 100755 index 0000000..d9fd1b8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify.go @@ -0,0 +1,337 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + "unsafe" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + mu sync.Mutex // Map access + fd int + poller *fdPoller + watches map[string]*watch // Map of inotify watches (key: path) + paths map[int]string // Map of watched paths (key: watch descriptor) + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + doneResp chan struct{} // Channel to respond to Close +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + // Create inotify fd + fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) + if fd == -1 { + return nil, errno + } + // Create epoll + poller, err := newFdPoller(fd) + if err != nil { + unix.Close(fd) + return nil, err + } + w := &Watcher{ + fd: fd, + poller: poller, + watches: make(map[string]*watch), + paths: make(map[int]string), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + doneResp: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +func (w *Watcher) isClosed() bool { + select { + case <-w.done: + return true + default: + return false + } +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed() { + return nil + } + + // Send 'close' signal to goroutine, and set the Watcher to closed. + close(w.done) + + // Wake up goroutine + w.poller.wake() + + // Wait for goroutine to close + <-w.doneResp + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + name = filepath.Clean(name) + if w.isClosed() { + return errors.New("inotify instance already closed") + } + + const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | + unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | + unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF + + var flags uint32 = agnosticEvents + + w.mu.Lock() + defer w.mu.Unlock() + watchEntry := w.watches[name] + if watchEntry != nil { + flags |= watchEntry.flags | unix.IN_MASK_ADD + } + wd, errno := unix.InotifyAddWatch(w.fd, name, flags) + if wd == -1 { + return errno + } + + if watchEntry == nil { + w.watches[name] = &watch{wd: uint32(wd), flags: flags} + w.paths[wd] = name + } else { + watchEntry.wd = uint32(wd) + watchEntry.flags = flags + } + + return nil +} + +// Remove stops watching the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + + // Fetch the watch. + w.mu.Lock() + defer w.mu.Unlock() + watch, ok := w.watches[name] + + // Remove it from inotify. + if !ok { + return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) + } + + // We successfully removed the watch if InotifyRmWatch doesn't return an + // error, we need to clean up our internal state to ensure it matches + // inotify's kernel state. + delete(w.paths, int(watch.wd)) + delete(w.watches, name) + + // inotify_rm_watch will return EINVAL if the file has been deleted; + // the inotify will already have been removed. + // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously + // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE + // so that EINVAL means that the wd is being rm_watch()ed or its file removed + // by another thread and we have not received IN_IGNORE event. + success, errno := unix.InotifyRmWatch(w.fd, watch.wd) + if success == -1 { + // TODO: Perhaps it's not helpful to return an error here in every case. + // the only two possible errors are: + // EBADF, which happens when w.fd is not a valid file descriptor of any kind. + // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. + // Watch descriptors are invalidated when they are removed explicitly or implicitly; + // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. + return errno + } + + return nil +} + +type watch struct { + wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) + flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) +} + +// readEvents reads from the inotify file descriptor, converts the +// received events into Event objects and sends them via the Events channel +func (w *Watcher) readEvents() { + var ( + buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events + n int // Number of bytes read with read() + errno error // Syscall errno + ok bool // For poller.wait + ) + + defer close(w.doneResp) + defer close(w.Errors) + defer close(w.Events) + defer unix.Close(w.fd) + defer w.poller.close() + + for { + // See if we have been closed. + if w.isClosed() { + return + } + + ok, errno = w.poller.wait() + if errno != nil { + select { + case w.Errors <- errno: + case <-w.done: + return + } + continue + } + + if !ok { + continue + } + + n, errno = unix.Read(w.fd, buf[:]) + // If a signal interrupted execution, see if we've been asked to close, and try again. + // http://man7.org/linux/man-pages/man7/signal.7.html : + // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" + if errno == unix.EINTR { + continue + } + + // unix.Read might have been woken up by Close. If so, we're done. + if w.isClosed() { + return + } + + if n < unix.SizeofInotifyEvent { + var err error + if n == 0 { + // If EOF is received. This should really never happen. + err = io.EOF + } else if n < 0 { + // If an error occurred while reading. + err = errno + } else { + // Read was too short. + err = errors.New("notify: short read in readEvents()") + } + select { + case w.Errors <- err: + case <-w.done: + return + } + continue + } + + var offset uint32 + // We don't know how many events we just read into the buffer + // While the offset points to at least one whole event... + for offset <= uint32(n-unix.SizeofInotifyEvent) { + // Point "raw" to the event in the buffer + raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) + + mask := uint32(raw.Mask) + nameLen := uint32(raw.Len) + + if mask&unix.IN_Q_OVERFLOW != 0 { + select { + case w.Errors <- ErrEventOverflow: + case <-w.done: + return + } + } + + // If the event happened to the watched directory or the watched file, the kernel + // doesn't append the filename to the event, but we would like to always fill the + // the "Name" field with a valid filename. We retrieve the path of the watch from + // the "paths" map. + w.mu.Lock() + name, ok := w.paths[int(raw.Wd)] + // IN_DELETE_SELF occurs when the file/directory being watched is removed. + // This is a sign to clean up the maps, otherwise we are no longer in sync + // with the inotify kernel state which has already deleted the watch + // automatically. + if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { + delete(w.paths, int(raw.Wd)) + delete(w.watches, name) + } + w.mu.Unlock() + + if nameLen > 0 { + // Point "bytes" at the first byte of the filename + bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) + // The filename is padded with NULL bytes. TrimRight() gets rid of those. + name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") + } + + event := newEvent(name, mask) + + // Send the events that are not ignored on the events channel + if !event.ignoreLinux(mask) { + select { + case w.Events <- event: + case <-w.done: + return + } + } + + // Move to the next event in the buffer + offset += unix.SizeofInotifyEvent + nameLen + } + } +} + +// Certain types of events can be "ignored" and not sent over the Events +// channel. Such as events marked ignore by the kernel, or MODIFY events +// against files that do not exist. +func (e *Event) ignoreLinux(mask uint32) bool { + // Ignore anything the inotify API says to ignore + if mask&unix.IN_IGNORED == unix.IN_IGNORED { + return true + } + + // If the event is not a DELETE or RENAME, the file must exist. + // Otherwise the event is ignored. + // *Note*: this was put in place because it was seen that a MODIFY + // event was sent after the DELETE. This ignores that MODIFY and + // assumes a DELETE will come or has come if the file doesn't exist. + if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { + _, statErr := os.Lstat(e.Name) + return os.IsNotExist(statErr) + } + return false +} + +// newEvent returns an platform-independent Event based on an inotify mask. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { + e.Op |= Create + } + if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { + e.Op |= Remove + } + if mask&unix.IN_MODIFY == unix.IN_MODIFY { + e.Op |= Write + } + if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { + e.Op |= Rename + } + if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { + e.Op |= Chmod + } + return e +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go new file mode 100755 index 0000000..cc7db4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -0,0 +1,187 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux + +package fsnotify + +import ( + "errors" + + "golang.org/x/sys/unix" +) + +type fdPoller struct { + fd int // File descriptor (as returned by the inotify_init() syscall) + epfd int // Epoll file descriptor + pipe [2]int // Pipe for waking up +} + +func emptyPoller(fd int) *fdPoller { + poller := new(fdPoller) + poller.fd = fd + poller.epfd = -1 + poller.pipe[0] = -1 + poller.pipe[1] = -1 + return poller +} + +// Create a new inotify poller. +// This creates an inotify handler, and an epoll handler. +func newFdPoller(fd int) (*fdPoller, error) { + var errno error + poller := emptyPoller(fd) + defer func() { + if errno != nil { + poller.close() + } + }() + poller.fd = fd + + // Create epoll fd + poller.epfd, errno = unix.EpollCreate1(0) + if poller.epfd == -1 { + return nil, errno + } + // Create pipe; pipe[0] is the read end, pipe[1] the write end. + errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) + if errno != nil { + return nil, errno + } + + // Register inotify fd with epoll + event := unix.EpollEvent{ + Fd: int32(poller.fd), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) + if errno != nil { + return nil, errno + } + + // Register pipe fd with epoll + event = unix.EpollEvent{ + Fd: int32(poller.pipe[0]), + Events: unix.EPOLLIN, + } + errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) + if errno != nil { + return nil, errno + } + + return poller, nil +} + +// Wait using epoll. +// Returns true if something is ready to be read, +// false if there is not. +func (poller *fdPoller) wait() (bool, error) { + // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. + // I don't know whether epoll_wait returns the number of events returned, + // or the total number of events ready. + // I decided to catch both by making the buffer one larger than the maximum. + events := make([]unix.EpollEvent, 7) + for { + n, errno := unix.EpollWait(poller.epfd, events, -1) + if n == -1 { + if errno == unix.EINTR { + continue + } + return false, errno + } + if n == 0 { + // If there are no events, try again. + continue + } + if n > 6 { + // This should never happen. More events were returned than should be possible. + return false, errors.New("epoll_wait returned more events than I know what to do with") + } + ready := events[:n] + epollhup := false + epollerr := false + epollin := false + for _, event := range ready { + if event.Fd == int32(poller.fd) { + if event.Events&unix.EPOLLHUP != 0 { + // This should not happen, but if it does, treat it as a wakeup. + epollhup = true + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the file descriptor, we should pretend + // something is ready to read, and let unix.Read pick up the error. + epollerr = true + } + if event.Events&unix.EPOLLIN != 0 { + // There is data to read. + epollin = true + } + } + if event.Fd == int32(poller.pipe[0]) { + if event.Events&unix.EPOLLHUP != 0 { + // Write pipe descriptor was closed, by us. This means we're closing down the + // watcher, and we should wake up. + } + if event.Events&unix.EPOLLERR != 0 { + // If an error is waiting on the pipe file descriptor. + // This is an absolute mystery, and should never ever happen. + return false, errors.New("Error on the pipe descriptor.") + } + if event.Events&unix.EPOLLIN != 0 { + // This is a regular wakeup, so we have to clear the buffer. + err := poller.clearWake() + if err != nil { + return false, err + } + } + } + } + + if epollhup || epollerr || epollin { + return true, nil + } + return false, nil + } +} + +// Close the write end of the poller. +func (poller *fdPoller) wake() error { + buf := make([]byte, 1) + n, errno := unix.Write(poller.pipe[1], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is full, poller will wake. + return nil + } + return errno + } + return nil +} + +func (poller *fdPoller) clearWake() error { + // You have to be woken up a LOT in order to get to 100! + buf := make([]byte, 100) + n, errno := unix.Read(poller.pipe[0], buf) + if n == -1 { + if errno == unix.EAGAIN { + // Buffer is empty, someone else cleared our wake. + return nil + } + return errno + } + return nil +} + +// Close all poller file descriptors, but not the one passed to it. +func (poller *fdPoller) close() { + if poller.pipe[1] != -1 { + unix.Close(poller.pipe[1]) + } + if poller.pipe[0] != -1 { + unix.Close(poller.pipe[0]) + } + if poller.epfd != -1 { + unix.Close(poller.epfd) + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go new file mode 100755 index 0000000..86e76a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/kqueue.go @@ -0,0 +1,521 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly darwin + +package fsnotify + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "sync" + "time" + + "golang.org/x/sys/unix" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + done chan struct{} // Channel for sending a "quit message" to the reader goroutine + + kq int // File descriptor (as returned by the kqueue() syscall). + + mu sync.Mutex // Protects access to watcher data + watches map[string]int // Map of watched file descriptors (key: path). + externalWatches map[string]bool // Map of watches added by user of the library. + dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. + paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. + fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). + isClosed bool // Set to true when Close() is first called +} + +type pathInfo struct { + name string + isDir bool +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + kq, err := kqueue() + if err != nil { + return nil, err + } + + w := &Watcher{ + kq: kq, + watches: make(map[string]int), + dirFlags: make(map[string]uint32), + paths: make(map[int]pathInfo), + fileExists: make(map[string]bool), + externalWatches: make(map[string]bool), + Events: make(chan Event), + Errors: make(chan error), + done: make(chan struct{}), + } + + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return nil + } + w.isClosed = true + + // copy paths to remove while locked + var pathsToRemove = make([]string, 0, len(w.watches)) + for name := range w.watches { + pathsToRemove = append(pathsToRemove, name) + } + w.mu.Unlock() + // unlock before calling Remove, which also locks + + for _, name := range pathsToRemove { + w.Remove(name) + } + + // send a "quit" message to the reader goroutine + close(w.done) + + return nil +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + w.mu.Lock() + w.externalWatches[name] = true + w.mu.Unlock() + _, err := w.addWatch(name, noteAllEvents) + return err +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + name = filepath.Clean(name) + w.mu.Lock() + watchfd, ok := w.watches[name] + w.mu.Unlock() + if !ok { + return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) + } + + const registerRemove = unix.EV_DELETE + if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { + return err + } + + unix.Close(watchfd) + + w.mu.Lock() + isDir := w.paths[watchfd].isDir + delete(w.watches, name) + delete(w.paths, watchfd) + delete(w.dirFlags, name) + w.mu.Unlock() + + // Find all watched paths that are in this directory that are not external. + if isDir { + var pathsToRemove []string + w.mu.Lock() + for _, path := range w.paths { + wdir, _ := filepath.Split(path.name) + if filepath.Clean(wdir) == name { + if !w.externalWatches[path.name] { + pathsToRemove = append(pathsToRemove, path.name) + } + } + } + w.mu.Unlock() + for _, name := range pathsToRemove { + // Since these are internal, not much sense in propagating error + // to the user, as that will just confuse them with an error about + // a path they did not explicitly watch themselves. + w.Remove(name) + } + } + + return nil +} + +// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) +const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME + +// keventWaitTime to block on each read from kevent +var keventWaitTime = durationToTimespec(100 * time.Millisecond) + +// addWatch adds name to the watched file set. +// The flags are interpreted as described in kevent(2). +// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. +func (w *Watcher) addWatch(name string, flags uint32) (string, error) { + var isDir bool + // Make ./name and name equivalent + name = filepath.Clean(name) + + w.mu.Lock() + if w.isClosed { + w.mu.Unlock() + return "", errors.New("kevent instance already closed") + } + watchfd, alreadyWatching := w.watches[name] + // We already have a watch, but we can still override flags. + if alreadyWatching { + isDir = w.paths[watchfd].isDir + } + w.mu.Unlock() + + if !alreadyWatching { + fi, err := os.Lstat(name) + if err != nil { + return "", err + } + + // Don't watch sockets. + if fi.Mode()&os.ModeSocket == os.ModeSocket { + return "", nil + } + + // Don't watch named pipes. + if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { + return "", nil + } + + // Follow Symlinks + // Unfortunately, Linux can add bogus symlinks to watch list without + // issue, and Windows can't do symlinks period (AFAIK). To maintain + // consistency, we will act like everything is fine. There will simply + // be no file events for broken symlinks. + // Hence the returns of nil on errors. + if fi.Mode()&os.ModeSymlink == os.ModeSymlink { + name, err = filepath.EvalSymlinks(name) + if err != nil { + return "", nil + } + + w.mu.Lock() + _, alreadyWatching = w.watches[name] + w.mu.Unlock() + + if alreadyWatching { + return name, nil + } + + fi, err = os.Lstat(name) + if err != nil { + return "", nil + } + } + + watchfd, err = unix.Open(name, openMode, 0700) + if watchfd == -1 { + return "", err + } + + isDir = fi.IsDir() + } + + const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE + if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { + unix.Close(watchfd) + return "", err + } + + if !alreadyWatching { + w.mu.Lock() + w.watches[name] = watchfd + w.paths[watchfd] = pathInfo{name: name, isDir: isDir} + w.mu.Unlock() + } + + if isDir { + // Watch the directory if it has not been watched before, + // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) + w.mu.Lock() + + watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && + (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) + // Store flags so this watch can be updated later + w.dirFlags[name] = flags + w.mu.Unlock() + + if watchDir { + if err := w.watchDirectoryFiles(name); err != nil { + return "", err + } + } + } + return name, nil +} + +// readEvents reads from kqueue and converts the received kevents into +// Event values that it sends down the Events channel. +func (w *Watcher) readEvents() { + eventBuffer := make([]unix.Kevent_t, 10) + +loop: + for { + // See if there is a message on the "done" channel + select { + case <-w.done: + break loop + default: + } + + // Get new events + kevents, err := read(w.kq, eventBuffer, &keventWaitTime) + // EINTR is okay, the syscall was interrupted before timeout expired. + if err != nil && err != unix.EINTR { + select { + case w.Errors <- err: + case <-w.done: + break loop + } + continue + } + + // Flush the events we received to the Events channel + for len(kevents) > 0 { + kevent := &kevents[0] + watchfd := int(kevent.Ident) + mask := uint32(kevent.Fflags) + w.mu.Lock() + path := w.paths[watchfd] + w.mu.Unlock() + event := newEvent(path.name, mask) + + if path.isDir && !(event.Op&Remove == Remove) { + // Double check to make sure the directory exists. This can happen when + // we do a rm -fr on a recursively watched folders and we receive a + // modification event first but the folder has been deleted and later + // receive the delete event + if _, err := os.Lstat(event.Name); os.IsNotExist(err) { + // mark is as delete event + event.Op |= Remove + } + } + + if event.Op&Rename == Rename || event.Op&Remove == Remove { + w.Remove(event.Name) + w.mu.Lock() + delete(w.fileExists, event.Name) + w.mu.Unlock() + } + + if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { + w.sendDirectoryChangeEvents(event.Name) + } else { + // Send the event on the Events channel. + select { + case w.Events <- event: + case <-w.done: + break loop + } + } + + if event.Op&Remove == Remove { + // Look for a file that may have overwritten this. + // For example, mv f1 f2 will delete f2, then create f2. + if path.isDir { + fileDir := filepath.Clean(event.Name) + w.mu.Lock() + _, found := w.watches[fileDir] + w.mu.Unlock() + if found { + // make sure the directory exists before we watch for changes. When we + // do a recursive watch and perform rm -fr, the parent directory might + // have gone missing, ignore the missing directory and let the + // upcoming delete event remove the watch from the parent directory. + if _, err := os.Lstat(fileDir); err == nil { + w.sendDirectoryChangeEvents(fileDir) + } + } + } else { + filePath := filepath.Clean(event.Name) + if fileInfo, err := os.Lstat(filePath); err == nil { + w.sendFileCreatedEventIfNew(filePath, fileInfo) + } + } + } + + // Move to next event + kevents = kevents[1:] + } + } + + // cleanup + err := unix.Close(w.kq) + if err != nil { + // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. + select { + case w.Errors <- err: + default: + } + } + close(w.Events) + close(w.Errors) +} + +// newEvent returns an platform-independent Event based on kqueue Fflags. +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { + e.Op |= Remove + } + if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { + e.Op |= Write + } + if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { + e.Op |= Rename + } + if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { + e.Op |= Chmod + } + return e +} + +func newCreateEvent(name string) Event { + return Event{Name: name, Op: Create} +} + +// watchDirectoryFiles to mimic inotify when adding a watch on a directory +func (w *Watcher) watchDirectoryFiles(dirPath string) error { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + return err + } + + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + } + + return nil +} + +// sendDirectoryEvents searches the directory for newly created files +// and sends them over the event channel. This functionality is to have +// the BSD version of fsnotify match Linux inotify which provides a +// create event for files created in a watched directory. +func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { + // Get all files + files, err := ioutil.ReadDir(dirPath) + if err != nil { + select { + case w.Errors <- err: + case <-w.done: + return + } + } + + // Search for new files + for _, fileInfo := range files { + filePath := filepath.Join(dirPath, fileInfo.Name()) + err := w.sendFileCreatedEventIfNew(filePath, fileInfo) + + if err != nil { + return + } + } +} + +// sendFileCreatedEvent sends a create event if the file isn't already being tracked. +func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { + w.mu.Lock() + _, doesExist := w.fileExists[filePath] + w.mu.Unlock() + if !doesExist { + // Send create event + select { + case w.Events <- newCreateEvent(filePath): + case <-w.done: + return + } + } + + // like watchDirectoryFiles (but without doing another ReadDir) + filePath, err = w.internalWatch(filePath, fileInfo) + if err != nil { + return err + } + + w.mu.Lock() + w.fileExists[filePath] = true + w.mu.Unlock() + + return nil +} + +func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { + if fileInfo.IsDir() { + // mimic Linux providing delete events for subdirectories + // but preserve the flags used if currently watching subdirectory + w.mu.Lock() + flags := w.dirFlags[name] + w.mu.Unlock() + + flags |= unix.NOTE_DELETE | unix.NOTE_RENAME + return w.addWatch(name, flags) + } + + // watch file to mimic Linux inotify + return w.addWatch(name, noteAllEvents) +} + +// kqueue creates a new kernel event queue and returns a descriptor. +func kqueue() (kq int, err error) { + kq, err = unix.Kqueue() + if kq == -1 { + return kq, err + } + return kq, nil +} + +// register events with the queue +func register(kq int, fds []int, flags int, fflags uint32) error { + changes := make([]unix.Kevent_t, len(fds)) + + for i, fd := range fds { + // SetKevent converts int to the platform-specific types: + unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) + changes[i].Fflags = fflags + } + + // register the events + success, err := unix.Kevent(kq, changes, nil, nil) + if success == -1 { + return err + } + return nil +} + +// read retrieves pending events, or waits until an event occurs. +// A timeout of nil blocks indefinitely, while 0 polls the queue. +func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { + n, err := unix.Kevent(kq, nil, events, timeout) + if err != nil { + return nil, err + } + return events[0:n], nil +} + +// durationToTimespec prepares a timeout value +func durationToTimespec(d time.Duration) unix.Timespec { + return unix.NsecToTimespec(d.Nanoseconds()) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go new file mode 100755 index 0000000..7d8de14 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd openbsd netbsd dragonfly + +package fsnotify + +import "golang.org/x/sys/unix" + +const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go new file mode 100755 index 0000000..9139e17 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin + +package fsnotify + +import "golang.org/x/sys/unix" + +// note: this constant is not defined on BSD +const openMode = unix.O_EVTONLY diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go new file mode 100755 index 0000000..09436f3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/fsnotify/fsnotify/windows.go @@ -0,0 +1,561 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package fsnotify + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "syscall" + "unsafe" +) + +// Watcher watches a set of files, delivering events to a channel. +type Watcher struct { + Events chan Event + Errors chan error + isClosed bool // Set to true when Close() is first called + mu sync.Mutex // Map access + port syscall.Handle // Handle to completion port + watches watchMap // Map of watches (key: i-number) + input chan *input // Inputs to the reader are sent on this channel + quit chan chan<- error +} + +// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. +func NewWatcher() (*Watcher, error) { + port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) + if e != nil { + return nil, os.NewSyscallError("CreateIoCompletionPort", e) + } + w := &Watcher{ + port: port, + watches: make(watchMap), + input: make(chan *input, 1), + Events: make(chan Event, 50), + Errors: make(chan error), + quit: make(chan chan<- error, 1), + } + go w.readEvents() + return w, nil +} + +// Close removes all watches and closes the events channel. +func (w *Watcher) Close() error { + if w.isClosed { + return nil + } + w.isClosed = true + + // Send "quit" message to the reader goroutine + ch := make(chan error) + w.quit <- ch + if err := w.wakeupReader(); err != nil { + return err + } + return <-ch +} + +// Add starts watching the named file or directory (non-recursively). +func (w *Watcher) Add(name string) error { + if w.isClosed { + return errors.New("watcher already closed") + } + in := &input{ + op: opAddWatch, + path: filepath.Clean(name), + flags: sysFSALLEVENTS, + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +// Remove stops watching the the named file or directory (non-recursively). +func (w *Watcher) Remove(name string) error { + in := &input{ + op: opRemoveWatch, + path: filepath.Clean(name), + reply: make(chan error), + } + w.input <- in + if err := w.wakeupReader(); err != nil { + return err + } + return <-in.reply +} + +const ( + // Options for AddWatch + sysFSONESHOT = 0x80000000 + sysFSONLYDIR = 0x1000000 + + // Events + sysFSACCESS = 0x1 + sysFSALLEVENTS = 0xfff + sysFSATTRIB = 0x4 + sysFSCLOSE = 0x18 + sysFSCREATE = 0x100 + sysFSDELETE = 0x200 + sysFSDELETESELF = 0x400 + sysFSMODIFY = 0x2 + sysFSMOVE = 0xc0 + sysFSMOVEDFROM = 0x40 + sysFSMOVEDTO = 0x80 + sysFSMOVESELF = 0x800 + + // Special events + sysFSIGNORED = 0x8000 + sysFSQOVERFLOW = 0x4000 +) + +func newEvent(name string, mask uint32) Event { + e := Event{Name: name} + if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { + e.Op |= Create + } + if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { + e.Op |= Remove + } + if mask&sysFSMODIFY == sysFSMODIFY { + e.Op |= Write + } + if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { + e.Op |= Rename + } + if mask&sysFSATTRIB == sysFSATTRIB { + e.Op |= Chmod + } + return e +} + +const ( + opAddWatch = iota + opRemoveWatch +) + +const ( + provisional uint64 = 1 << (32 + iota) +) + +type input struct { + op int + path string + flags uint32 + reply chan error +} + +type inode struct { + handle syscall.Handle + volume uint32 + index uint64 +} + +type watch struct { + ov syscall.Overlapped + ino *inode // i-number + path string // Directory path + mask uint64 // Directory itself is being watched with these notify flags + names map[string]uint64 // Map of names being watched and their notify flags + rename string // Remembers the old name while renaming a file + buf [4096]byte +} + +type indexMap map[uint64]*watch +type watchMap map[uint32]indexMap + +func (w *Watcher) wakeupReader() error { + e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) + if e != nil { + return os.NewSyscallError("PostQueuedCompletionStatus", e) + } + return nil +} + +func getDir(pathname string) (dir string, err error) { + attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) + if e != nil { + return "", os.NewSyscallError("GetFileAttributes", e) + } + if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { + dir = pathname + } else { + dir, _ = filepath.Split(pathname) + dir = filepath.Clean(dir) + } + return +} + +func getIno(path string) (ino *inode, err error) { + h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), + syscall.FILE_LIST_DIRECTORY, + syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, + nil, syscall.OPEN_EXISTING, + syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) + if e != nil { + return nil, os.NewSyscallError("CreateFile", e) + } + var fi syscall.ByHandleFileInformation + if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { + syscall.CloseHandle(h) + return nil, os.NewSyscallError("GetFileInformationByHandle", e) + } + ino = &inode{ + handle: h, + volume: fi.VolumeSerialNumber, + index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), + } + return ino, nil +} + +// Must run within the I/O thread. +func (m watchMap) get(ino *inode) *watch { + if i := m[ino.volume]; i != nil { + return i[ino.index] + } + return nil +} + +// Must run within the I/O thread. +func (m watchMap) set(ino *inode, watch *watch) { + i := m[ino.volume] + if i == nil { + i = make(indexMap) + m[ino.volume] = i + } + i[ino.index] = watch +} + +// Must run within the I/O thread. +func (w *Watcher) addWatch(pathname string, flags uint64) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + if flags&sysFSONLYDIR != 0 && pathname != dir { + return nil + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watchEntry := w.watches.get(ino) + w.mu.Unlock() + if watchEntry == nil { + if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { + syscall.CloseHandle(ino.handle) + return os.NewSyscallError("CreateIoCompletionPort", e) + } + watchEntry = &watch{ + ino: ino, + path: dir, + names: make(map[string]uint64), + } + w.mu.Lock() + w.watches.set(ino, watchEntry) + w.mu.Unlock() + flags |= provisional + } else { + syscall.CloseHandle(ino.handle) + } + if pathname == dir { + watchEntry.mask |= flags + } else { + watchEntry.names[filepath.Base(pathname)] |= flags + } + if err = w.startRead(watchEntry); err != nil { + return err + } + if pathname == dir { + watchEntry.mask &= ^provisional + } else { + watchEntry.names[filepath.Base(pathname)] &= ^provisional + } + return nil +} + +// Must run within the I/O thread. +func (w *Watcher) remWatch(pathname string) error { + dir, err := getDir(pathname) + if err != nil { + return err + } + ino, err := getIno(dir) + if err != nil { + return err + } + w.mu.Lock() + watch := w.watches.get(ino) + w.mu.Unlock() + if watch == nil { + return fmt.Errorf("can't remove non-existent watch for: %s", pathname) + } + if pathname == dir { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + watch.mask = 0 + } else { + name := filepath.Base(pathname) + w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + return w.startRead(watch) +} + +// Must run within the I/O thread. +func (w *Watcher) deleteWatch(watch *watch) { + for name, mask := range watch.names { + if mask&provisional == 0 { + w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) + } + delete(watch.names, name) + } + if watch.mask != 0 { + if watch.mask&provisional == 0 { + w.sendEvent(watch.path, watch.mask&sysFSIGNORED) + } + watch.mask = 0 + } +} + +// Must run within the I/O thread. +func (w *Watcher) startRead(watch *watch) error { + if e := syscall.CancelIo(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CancelIo", e) + w.deleteWatch(watch) + } + mask := toWindowsFlags(watch.mask) + for _, m := range watch.names { + mask |= toWindowsFlags(m) + } + if mask == 0 { + if e := syscall.CloseHandle(watch.ino.handle); e != nil { + w.Errors <- os.NewSyscallError("CloseHandle", e) + } + w.mu.Lock() + delete(w.watches[watch.ino.volume], watch.ino.index) + w.mu.Unlock() + return nil + } + e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], + uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) + if e != nil { + err := os.NewSyscallError("ReadDirectoryChanges", e) + if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { + // Watched directory was probably removed + if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + err = nil + } + w.deleteWatch(watch) + w.startRead(watch) + return err + } + return nil +} + +// readEvents reads from the I/O completion port, converts the +// received events into Event objects and sends them via the Events channel. +// Entry point to the I/O thread. +func (w *Watcher) readEvents() { + var ( + n, key uint32 + ov *syscall.Overlapped + ) + runtime.LockOSThread() + + for { + e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) + watch := (*watch)(unsafe.Pointer(ov)) + + if watch == nil { + select { + case ch := <-w.quit: + w.mu.Lock() + var indexes []indexMap + for _, index := range w.watches { + indexes = append(indexes, index) + } + w.mu.Unlock() + for _, index := range indexes { + for _, watch := range index { + w.deleteWatch(watch) + w.startRead(watch) + } + } + var err error + if e := syscall.CloseHandle(w.port); e != nil { + err = os.NewSyscallError("CloseHandle", e) + } + close(w.Events) + close(w.Errors) + ch <- err + return + case in := <-w.input: + switch in.op { + case opAddWatch: + in.reply <- w.addWatch(in.path, uint64(in.flags)) + case opRemoveWatch: + in.reply <- w.remWatch(in.path) + } + default: + } + continue + } + + switch e { + case syscall.ERROR_MORE_DATA: + if watch == nil { + w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") + } else { + // The i/o succeeded but the buffer is full. + // In theory we should be building up a full packet. + // In practice we can get away with just carrying on. + n = uint32(unsafe.Sizeof(watch.buf)) + } + case syscall.ERROR_ACCESS_DENIED: + // Watched directory was probably removed + w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) + w.deleteWatch(watch) + w.startRead(watch) + continue + case syscall.ERROR_OPERATION_ABORTED: + // CancelIo was called on this handle + continue + default: + w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) + continue + case nil: + } + + var offset uint32 + for { + if n == 0 { + w.Events <- newEvent("", sysFSQOVERFLOW) + w.Errors <- errors.New("short read in readEvents()") + break + } + + // Point "raw" to the event in the buffer + raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) + buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) + name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) + fullname := filepath.Join(watch.path, name) + + var mask uint64 + switch raw.Action { + case syscall.FILE_ACTION_REMOVED: + mask = sysFSDELETESELF + case syscall.FILE_ACTION_MODIFIED: + mask = sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + watch.rename = name + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + if watch.names[watch.rename] != 0 { + watch.names[name] |= watch.names[watch.rename] + delete(watch.names, watch.rename) + mask = sysFSMOVESELF + } + } + + sendNameEvent := func() { + if w.sendEvent(fullname, watch.names[name]&mask) { + if watch.names[name]&sysFSONESHOT != 0 { + delete(watch.names, name) + } + } + } + if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { + sendNameEvent() + } + if raw.Action == syscall.FILE_ACTION_REMOVED { + w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) + delete(watch.names, name) + } + if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { + if watch.mask&sysFSONESHOT != 0 { + watch.mask = 0 + } + } + if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { + fullname = filepath.Join(watch.path, watch.rename) + sendNameEvent() + } + + // Move to the next event in the buffer + if raw.NextEntryOffset == 0 { + break + } + offset += raw.NextEntryOffset + + // Error! + if offset >= n { + w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") + break + } + } + + if err := w.startRead(watch); err != nil { + w.Errors <- err + } + } +} + +func (w *Watcher) sendEvent(name string, mask uint64) bool { + if mask == 0 { + return false + } + event := newEvent(name, uint32(mask)) + select { + case ch := <-w.quit: + w.quit <- ch + case w.Events <- event: + } + return true +} + +func toWindowsFlags(mask uint64) uint32 { + var m uint32 + if mask&sysFSACCESS != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS + } + if mask&sysFSMODIFY != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE + } + if mask&sysFSATTRIB != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES + } + if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { + m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME + } + return m +} + +func toFSnotifyFlags(action uint32) uint64 { + switch action { + case syscall.FILE_ACTION_ADDED: + return sysFSCREATE + case syscall.FILE_ACTION_REMOVED: + return sysFSDELETE + case syscall.FILE_ACTION_MODIFIED: + return sysFSMODIFY + case syscall.FILE_ACTION_RENAMED_OLD_NAME: + return sysFSMOVEDFROM + case syscall.FILE_ACTION_RENAMED_NEW_NAME: + return sysFSMOVEDTO + } + return 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.gitignore new file mode 100755 index 0000000..822fa09 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.gitignore @@ -0,0 +1,9 @@ +y.output + +# ignore intellij files +.idea +*.iml +*.ipr +*.iws + +*.test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml new file mode 100755 index 0000000..cb63a32 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/.travis.yml @@ -0,0 +1,13 @@ +sudo: false + +language: go + +go: + - 1.x + - tip + +branches: + only: + - master + +script: make test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/LICENSE new file mode 100755 index 0000000..c33dcc7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/LICENSE @@ -0,0 +1,354 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. “Contributor” + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. “Contributor Version” + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor’s Contribution. + +1.3. “Contribution” + + means Covered Software of a particular Contributor. + +1.4. “Covered Software” + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. “Incompatible With Secondary Licenses” + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of version + 1.1 or earlier of the License, but not also under the terms of a + Secondary License. + +1.6. “Executable Form” + + means any form of the work other than Source Code Form. + +1.7. “Larger Work” + + means a work that combines Covered Software with other material, in a separate + file or files, that is not Covered Software. + +1.8. “License” + + means this document. + +1.9. “Licensable” + + means having the right to grant, to the maximum extent possible, whether at the + time of the initial grant or subsequently, any and all of the rights conveyed by + this License. + +1.10. “Modifications” + + means any of the following: + + a. any file in Source Code Form that results from an addition to, deletion + from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. “Patent Claims” of a Contributor + + means any patent claim(s), including without limitation, method, process, + and apparatus claims, in any patent Licensable by such Contributor that + would be infringed, but for the grant of the License, by the making, + using, selling, offering for sale, having made, import, or transfer of + either its Contributions or its Contributor Version. + +1.12. “Secondary License” + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. “Source Code Form” + + means the form of the work preferred for making modifications. + +1.14. “You” (or “Your”) + + means an individual or a legal entity exercising rights under this + License. For legal entities, “You” includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, “control” means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or as + part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its Contributions + or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution become + effective for each Contribution on the date the Contributor first distributes + such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under this + License. No additional rights or licenses will be implied from the distribution + or licensing of Covered Software under this License. Notwithstanding Section + 2.1(b) above, no patent license is granted by a Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party’s + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of its + Contributions. + + This License does not grant any rights in the trademarks, service marks, or + logos of any Contributor (except as may be necessary to comply with the + notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this License + (see Section 10.2) or under the terms of a Secondary License (if permitted + under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its Contributions + are its original creation(s) or it has sufficient rights to grant the + rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under applicable + copyright doctrines of fair use, fair dealing, or other equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under the + terms of this License. You must inform recipients that the Source Code Form + of the Covered Software is governed by the terms of this License, and how + they can obtain a copy of this License. You may not attempt to alter or + restrict the recipients’ rights in the Source Code Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this License, + or sublicense it under different terms, provided that the license for + the Executable Form does not attempt to limit or alter the recipients’ + rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for the + Covered Software. If the Larger Work is a combination of Covered Software + with a work governed by one or more Secondary Licenses, and the Covered + Software is not Incompatible With Secondary Licenses, this License permits + You to additionally distribute such Covered Software under the terms of + such Secondary License(s), so that the recipient of the Larger Work may, at + their option, further distribute the Covered Software under the terms of + either this License or such Secondary License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices (including + copyright notices, patent notices, disclaimers of warranty, or limitations + of liability) contained within the Source Code Form of the Covered + Software, except that You may alter any license notices to the extent + required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on behalf + of any Contributor. You must make it absolutely clear that any such + warranty, support, indemnity, or liability obligation is offered by You + alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, judicial + order, or regulation then You must: (a) comply with the terms of this License + to the maximum extent possible; and (b) describe the limitations and the code + they affect. Such description must be placed in a text file included with all + distributions of the Covered Software under this License. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing basis, + if such Contributor fails to notify You of the non-compliance by some + reasonable means prior to 60 days after You have come back into compliance. + Moreover, Your grants from a particular Contributor are reinstated on an + ongoing basis if such Contributor notifies You of the non-compliance by + some reasonable means, this is the first time You have received notice of + non-compliance with this License from such Contributor, and You become + compliant prior to 30 days after Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, counter-claims, + and cross-claims) alleging that a Contributor Version directly or + indirectly infringes any patent, then the rights granted to You by any and + all Contributors for the Covered Software under Section 2.1 of this License + shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an “as is” basis, without + warranty of any kind, either expressed, implied, or statutory, including, + without limitation, warranties that the Covered Software is free of defects, + merchantable, fit for a particular purpose or non-infringing. The entire + risk as to the quality and performance of the Covered Software is with You. + Should any Covered Software prove defective in any respect, You (not any + Contributor) assume the cost of any necessary servicing, repair, or + correction. This disclaimer of warranty constitutes an essential part of this + License. No use of any Covered Software is authorized under this License + except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from such + party’s negligence to the extent applicable law prohibits such limitation. + Some jurisdictions do not allow the exclusion or limitation of incidental or + consequential damages, so this exclusion and limitation may not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts of + a jurisdiction where the defendant maintains its principal place of business + and such litigation shall be governed by laws of that jurisdiction, without + reference to its conflict-of-law provisions. Nothing in this Section shall + prevent a party’s ability to bring cross-claims or counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject matter + hereof. If any provision of this License is held to be unenforceable, such + provision shall be reformed only to the extent necessary to make it + enforceable. Any law or regulation which provides that the language of a + contract shall be construed against the drafter shall not be used to construe + this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version of + the License under which You originally received the Covered Software, or + under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a modified + version of this License if you rename the license and remove any + references to the name of the license steward (except to note that such + modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses + If You choose to distribute Source Code Form that is Incompatible With + Secondary Licenses under the terms of this version of the License, the + notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, then +You may include the notice in a location (such as a LICENSE file in a relevant +directory) where a recipient would be likely to look for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/Makefile new file mode 100755 index 0000000..9fafd50 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/Makefile @@ -0,0 +1,18 @@ +TEST?=./... + +default: test + +fmt: generate + go fmt ./... + +test: generate + go get -t ./... + go test $(TEST) $(TESTARGS) + +generate: + go generate ./... + +updatedeps: + go get -u golang.org/x/tools/cmd/stringer + +.PHONY: default generate test updatedeps diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/README.md new file mode 100755 index 0000000..c822332 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/README.md @@ -0,0 +1,125 @@ +# HCL + +[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) + +HCL (HashiCorp Configuration Language) is a configuration language built +by HashiCorp. The goal of HCL is to build a structured configuration language +that is both human and machine friendly for use with command-line tools, but +specifically targeted towards DevOps tools, servers, etc. + +HCL is also fully JSON compatible. That is, JSON can be used as completely +valid input to a system expecting HCL. This helps makes systems +interoperable with other systems. + +HCL is heavily inspired by +[libucl](https://github.com/vstakhov/libucl), +nginx configuration, and others similar. + +## Why? + +A common question when viewing HCL is to ask the question: why not +JSON, YAML, etc.? + +Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) +used a variety of configuration languages from full programming languages +such as Ruby to complete data structure languages such as JSON. What we +learned is that some people wanted human-friendly configuration languages +and some people wanted machine-friendly languages. + +JSON fits a nice balance in this, but is fairly verbose and most +importantly doesn't support comments. With YAML, we found that beginners +had a really hard time determining what the actual structure was, and +ended up guessing more often than not whether to use a hyphen, colon, etc. +in order to represent some configuration key. + +Full programming languages such as Ruby enable complex behavior +a configuration language shouldn't usually allow, and also forces +people to learn some set of Ruby. + +Because of this, we decided to create our own configuration language +that is JSON-compatible. Our configuration language (HCL) is designed +to be written and modified by humans. The API for HCL allows JSON +as an input so that it is also machine-friendly (machines can generate +JSON instead of trying to generate HCL). + +Our goal with HCL is not to alienate other configuration languages. +It is instead to provide HCL as a specialized language for our tools, +and JSON as the interoperability layer. + +## Syntax + +For a complete grammar, please see the parser itself. A high-level overview +of the syntax and grammar is listed here. + + * Single line comments start with `#` or `//` + + * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments + are not allowed. A multi-line comment (also known as a block comment) + terminates at the first `*/` found. + + * Values are assigned with the syntax `key = value` (whitespace doesn't + matter). The value can be any primitive: a string, number, boolean, + object, or list. + + * Strings are double-quoted and can contain any UTF-8 characters. + Example: `"Hello, World"` + + * Multi-line strings start with `<- + echo %Path% + + go version + + go env + + go get -t ./... + +build_script: +- cmd: go test -v ./... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/decoder.go new file mode 100755 index 0000000..bed9ebb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/decoder.go @@ -0,0 +1,729 @@ +package hcl + +import ( + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" + "github.com/hashicorp/hcl/hcl/token" +) + +// This is the tag to use with structures to have settings for HCL +const tagName = "hcl" + +var ( + // nodeType holds a reference to the type of ast.Node + nodeType reflect.Type = findNodeType() +) + +// Unmarshal accepts a byte slice as input and writes the +// data to the value pointed to by v. +func Unmarshal(bs []byte, v interface{}) error { + root, err := parse(bs) + if err != nil { + return err + } + + return DecodeObject(v, root) +} + +// Decode reads the given input and decodes it into the structure +// given by `out`. +func Decode(out interface{}, in string) error { + obj, err := Parse(in) + if err != nil { + return err + } + + return DecodeObject(out, obj) +} + +// DecodeObject is a lower-level version of Decode. It decodes a +// raw Object into the given output. +func DecodeObject(out interface{}, n ast.Node) error { + val := reflect.ValueOf(out) + if val.Kind() != reflect.Ptr { + return errors.New("result must be a pointer") + } + + // If we have the file, we really decode the root node + if f, ok := n.(*ast.File); ok { + n = f.Node + } + + var d decoder + return d.decode("root", n, val.Elem()) +} + +type decoder struct { + stack []reflect.Kind +} + +func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { + k := result + + // If we have an interface with a valid value, we use that + // for the check. + if result.Kind() == reflect.Interface { + elem := result.Elem() + if elem.IsValid() { + k = elem + } + } + + // Push current onto stack unless it is an interface. + if k.Kind() != reflect.Interface { + d.stack = append(d.stack, k.Kind()) + + // Schedule a pop + defer func() { + d.stack = d.stack[:len(d.stack)-1] + }() + } + + switch k.Kind() { + case reflect.Bool: + return d.decodeBool(name, node, result) + case reflect.Float32, reflect.Float64: + return d.decodeFloat(name, node, result) + case reflect.Int, reflect.Int32, reflect.Int64: + return d.decodeInt(name, node, result) + case reflect.Interface: + // When we see an interface, we make our own thing + return d.decodeInterface(name, node, result) + case reflect.Map: + return d.decodeMap(name, node, result) + case reflect.Ptr: + return d.decodePtr(name, node, result) + case reflect.Slice: + return d.decodeSlice(name, node, result) + case reflect.String: + return d.decodeString(name, node, result) + case reflect.Struct: + return d.decodeStruct(name, node, result) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), + } + } +} + +func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.BOOL { + v, err := strconv.ParseBool(n.Token.Text) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v)) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER { + v, err := strconv.ParseFloat(n.Token.Text, 64) + if err != nil { + return err + } + + result.Set(reflect.ValueOf(v).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + v, err := strconv.ParseInt(n.Token.Text, 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + case token.STRING: + v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) + if err != nil { + return err + } + + if result.Kind() == reflect.Interface { + result.Set(reflect.ValueOf(int(v))) + } else { + result.SetInt(v) + } + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type %T", name, node), + } +} + +func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { + // When we see an ast.Node, we retain the value to enable deferred decoding. + // Very useful in situations where we want to preserve ast.Node information + // like Pos + if result.Type() == nodeType && result.CanSet() { + result.Set(reflect.ValueOf(node)) + return nil + } + + var set reflect.Value + redecode := true + + // For testing types, ObjectType should just be treated as a list. We + // set this to a temporary var because we want to pass in the real node. + testNode := node + if ot, ok := node.(*ast.ObjectType); ok { + testNode = ot.List + } + + switch n := testNode.(type) { + case *ast.ObjectList: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) + set = result + } + case *ast.ObjectType: + // If we're at the root or we're directly within a slice, then we + // decode objects into map[string]interface{}, otherwise we decode + // them into lists. + if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { + var temp map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeMap( + reflect.MapOf( + reflect.TypeOf(""), + tempVal.Type().Elem())) + + set = result + } else { + var temp []map[string]interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 1) + set = result + } + case *ast.ListType: + var temp []interface{} + tempVal := reflect.ValueOf(temp) + result := reflect.MakeSlice( + reflect.SliceOf(tempVal.Type().Elem()), 0, 0) + set = result + case *ast.LiteralType: + switch n.Token.Type { + case token.BOOL: + var result bool + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.FLOAT: + var result float64 + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.NUMBER: + var result int + set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) + case token.STRING, token.HEREDOC: + set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), + } + } + default: + return fmt.Errorf( + "%s: cannot decode into interface: %T", + name, node) + } + + // Set the result to what its supposed to be, then reset + // result so we don't reflect into this method anymore. + result.Set(set) + + if redecode { + // Revisit the node so that we can use the newly instantiated + // thing and populate it. + if err := d.decode(name, node, result); err != nil { + return err + } + } + + return nil +} + +func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { + if item, ok := node.(*ast.ObjectItem); ok { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + n, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), + } + } + + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + + resultType := result.Type() + resultElemType := resultType.Elem() + resultKeyType := resultType.Key() + if resultKeyType.Kind() != reflect.String { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Make a map if it is nil + resultMap := result + if result.IsNil() { + resultMap = reflect.MakeMap( + reflect.MapOf(resultKeyType, resultElemType)) + } + + // Go through each element and decode it. + done := make(map[string]struct{}) + for _, item := range n.Items { + if item.Val == nil { + continue + } + + // github.com/hashicorp/terraform/issue/5740 + if len(item.Keys) == 0 { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: map must have string keys", name), + } + } + + // Get the key we're dealing with, which is the first item + keyStr := item.Keys[0].Token.Value().(string) + + // If we've already processed this key, then ignore it + if _, ok := done[keyStr]; ok { + continue + } + + // Determine the value. If we have more than one key, then we + // get the objectlist of only these keys. + itemVal := item.Val + if len(item.Keys) > 1 { + itemVal = n.Filter(keyStr) + done[keyStr] = struct{}{} + } + + // Make the field name + fieldName := fmt.Sprintf("%s.%s", name, keyStr) + + // Get the key/value as reflection values + key := reflect.ValueOf(keyStr) + val := reflect.Indirect(reflect.New(resultElemType)) + + // If we have a pre-existing value in the map, use that + oldVal := resultMap.MapIndex(key) + if oldVal.IsValid() { + val.Set(oldVal) + } + + // Decode! + if err := d.decode(fieldName, itemVal, val); err != nil { + return err + } + + // Set the value on the map + resultMap.SetMapIndex(key, val) + } + + // Set the final map if we can + set.Set(resultMap) + return nil +} + +func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + resultType := result.Type() + resultElemType := resultType.Elem() + val := reflect.New(resultElemType) + if err := d.decode(name, node, reflect.Indirect(val)); err != nil { + return err + } + + result.Set(val) + return nil +} + +func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { + // If we have an interface, then we can address the interface, + // but not the slice itself, so get the element but set the interface + set := result + if result.Kind() == reflect.Interface { + result = result.Elem() + } + // Create the slice if it isn't nil + resultType := result.Type() + resultElemType := resultType.Elem() + if result.IsNil() { + resultSliceType := reflect.SliceOf(resultElemType) + result = reflect.MakeSlice( + resultSliceType, 0, 0) + } + + // Figure out the items we'll be copying into the slice + var items []ast.Node + switch n := node.(type) { + case *ast.ObjectList: + items = make([]ast.Node, len(n.Items)) + for i, item := range n.Items { + items[i] = item + } + case *ast.ObjectType: + items = []ast.Node{n} + case *ast.ListType: + items = n.List + default: + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("unknown slice type: %T", node), + } + } + + for i, item := range items { + fieldName := fmt.Sprintf("%s[%d]", name, i) + + // Decode + val := reflect.Indirect(reflect.New(resultElemType)) + + // if item is an object that was decoded from ambiguous JSON and + // flattened, make sure it's expanded if it needs to decode into a + // defined structure. + item := expandObject(item, val) + + if err := d.decode(fieldName, item, val); err != nil { + return err + } + + // Append it onto the slice + result = reflect.Append(result, val) + } + + set.Set(result) + return nil +} + +// expandObject detects if an ambiguous JSON object was flattened to a List which +// should be decoded into a struct, and expands the ast to properly deocode. +func expandObject(node ast.Node, result reflect.Value) ast.Node { + item, ok := node.(*ast.ObjectItem) + if !ok { + return node + } + + elemType := result.Type() + + // our target type must be a struct + switch elemType.Kind() { + case reflect.Ptr: + switch elemType.Elem().Kind() { + case reflect.Struct: + //OK + default: + return node + } + case reflect.Struct: + //OK + default: + return node + } + + // A list value will have a key and field name. If it had more fields, + // it wouldn't have been flattened. + if len(item.Keys) != 2 { + return node + } + + keyToken := item.Keys[0].Token + item.Keys = item.Keys[1:] + + // we need to un-flatten the ast enough to decode + newNode := &ast.ObjectItem{ + Keys: []*ast.ObjectKey{ + &ast.ObjectKey{ + Token: keyToken, + }, + }, + Val: &ast.ObjectType{ + List: &ast.ObjectList{ + Items: []*ast.ObjectItem{item}, + }, + }, + } + + return newNode +} + +func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { + switch n := node.(type) { + case *ast.LiteralType: + switch n.Token.Type { + case token.NUMBER: + result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) + return nil + case token.STRING, token.HEREDOC: + result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) + return nil + } + } + + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unknown type for string %T", name, node), + } +} + +func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { + var item *ast.ObjectItem + if it, ok := node.(*ast.ObjectItem); ok { + item = it + node = it.Val + } + + if ot, ok := node.(*ast.ObjectType); ok { + node = ot.List + } + + // Handle the special case where the object itself is a literal. Previously + // the yacc parser would always ensure top-level elements were arrays. The new + // parser does not make the same guarantees, thus we need to convert any + // top-level literal elements into a list. + if _, ok := node.(*ast.LiteralType); ok && item != nil { + node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} + } + + list, ok := node.(*ast.ObjectList) + if !ok { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), + } + } + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = result + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") + + // Ignore fields with tag name "-" + if tagParts[0] == "-" { + continue + } + + if fieldType.Anonymous { + fieldKind := fieldType.Type.Kind() + if fieldKind != reflect.Struct { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: unsupported type to struct: %s", + fieldType.Name, fieldKind), + } + } + + // We have an embedded field. We "squash" the fields down + // if specified in the tag. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + structs = append( + structs, result.FieldByName(fieldType.Name)) + continue + } + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + usedKeys := make(map[string]struct{}) + decodedFields := make([]string, 0, len(fields)) + decodedFieldsVal := make([]reflect.Value, 0) + unusedKeysVal := make([]reflect.Value, 0) + for _, f := range fields { + field, fieldValue := f.field, f.val + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + fieldName := field.Name + + tagValue := field.Tag.Get(tagName) + tagParts := strings.SplitN(tagValue, ",", 2) + if len(tagParts) >= 2 { + switch tagParts[1] { + case "decodedFields": + decodedFieldsVal = append(decodedFieldsVal, fieldValue) + continue + case "key": + if item == nil { + return &parser.PosError{ + Pos: node.Pos(), + Err: fmt.Errorf("%s: %s asked for 'key', impossible", + name, fieldName), + } + } + + fieldValue.SetString(item.Keys[0].Token.Value().(string)) + continue + case "unusedKeys": + unusedKeysVal = append(unusedKeysVal, fieldValue) + continue + } + } + + if tagParts[0] != "" { + fieldName = tagParts[0] + } + + // Determine the element we'll use to decode. If it is a single + // match (only object with the field), then we decode it exactly. + // If it is a prefix match, then we decode the matches. + filter := list.Filter(fieldName) + + prefixMatches := filter.Children() + matches := filter.Elem() + if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { + continue + } + + // Track the used key + usedKeys[fieldName] = struct{}{} + + // Create the field name and decode. We range over the elements + // because we actually want the value. + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + if len(prefixMatches.Items) > 0 { + if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil { + return err + } + } + for _, match := range matches.Items { + var decodeNode ast.Node = match.Val + if ot, ok := decodeNode.(*ast.ObjectType); ok { + decodeNode = &ast.ObjectList{Items: ot.List.Items} + } + + if err := d.decode(fieldName, decodeNode, fieldValue); err != nil { + return err + } + } + + decodedFields = append(decodedFields, field.Name) + } + + if len(decodedFieldsVal) > 0 { + // Sort it so that it is deterministic + sort.Strings(decodedFields) + + for _, v := range decodedFieldsVal { + v.Set(reflect.ValueOf(decodedFields)) + } + } + + return nil +} + +// findNodeType returns the type of ast.Node +func findNodeType() reflect.Type { + var nodeContainer struct { + Node ast.Node + } + value := reflect.ValueOf(nodeContainer).FieldByName("Node") + return value.Type() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl.go new file mode 100755 index 0000000..575a20b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl.go @@ -0,0 +1,11 @@ +// Package hcl decodes HCL into usable Go structures. +// +// hcl input can come in either pure HCL format or JSON format. +// It can be parsed into an AST, and then decoded into a structure, +// or it can be decoded directly from a string into a structure. +// +// If you choose to parse HCL into a raw AST, the benefit is that you +// can write custom visitor implementations to implement custom +// semantic checks. By default, HCL does not perform any semantic +// checks. +package hcl diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go new file mode 100755 index 0000000..6e5ef65 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go @@ -0,0 +1,219 @@ +// Package ast declares the types used to represent syntax trees for HCL +// (HashiCorp Configuration Language) +package ast + +import ( + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/token" +) + +// Node is an element in the abstract syntax tree. +type Node interface { + node() + Pos() token.Pos +} + +func (File) node() {} +func (ObjectList) node() {} +func (ObjectKey) node() {} +func (ObjectItem) node() {} +func (Comment) node() {} +func (CommentGroup) node() {} +func (ObjectType) node() {} +func (LiteralType) node() {} +func (ListType) node() {} + +// File represents a single HCL file +type File struct { + Node Node // usually a *ObjectList + Comments []*CommentGroup // list of all comments in the source +} + +func (f *File) Pos() token.Pos { + return f.Node.Pos() +} + +// ObjectList represents a list of ObjectItems. An HCL file itself is an +// ObjectList. +type ObjectList struct { + Items []*ObjectItem +} + +func (o *ObjectList) Add(item *ObjectItem) { + o.Items = append(o.Items, item) +} + +// Filter filters out the objects with the given key list as a prefix. +// +// The returned list of objects contain ObjectItems where the keys have +// this prefix already stripped off. This might result in objects with +// zero-length key lists if they have no children. +// +// If no matches are found, an empty ObjectList (non-nil) is returned. +func (o *ObjectList) Filter(keys ...string) *ObjectList { + var result ObjectList + for _, item := range o.Items { + // If there aren't enough keys, then ignore this + if len(item.Keys) < len(keys) { + continue + } + + match := true + for i, key := range item.Keys[:len(keys)] { + key := key.Token.Value().(string) + if key != keys[i] && !strings.EqualFold(key, keys[i]) { + match = false + break + } + } + if !match { + continue + } + + // Strip off the prefix from the children + newItem := *item + newItem.Keys = newItem.Keys[len(keys):] + result.Add(&newItem) + } + + return &result +} + +// Children returns further nested objects (key length > 0) within this +// ObjectList. This should be used with Filter to get at child items. +func (o *ObjectList) Children() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) > 0 { + result.Add(item) + } + } + + return &result +} + +// Elem returns items in the list that are direct element assignments +// (key length == 0). This should be used with Filter to get at elements. +func (o *ObjectList) Elem() *ObjectList { + var result ObjectList + for _, item := range o.Items { + if len(item.Keys) == 0 { + result.Add(item) + } + } + + return &result +} + +func (o *ObjectList) Pos() token.Pos { + // always returns the uninitiliazed position + return o.Items[0].Pos() +} + +// ObjectItem represents a HCL Object Item. An item is represented with a key +// (or keys). It can be an assignment or an object (both normal and nested) +type ObjectItem struct { + // keys is only one length long if it's of type assignment. If it's a + // nested object it can be larger than one. In that case "assign" is + // invalid as there is no assignments for a nested object. + Keys []*ObjectKey + + // assign contains the position of "=", if any + Assign token.Pos + + // val is the item itself. It can be an object,list, number, bool or a + // string. If key length is larger than one, val can be only of type + // Object. + Val Node + + LeadComment *CommentGroup // associated lead comment + LineComment *CommentGroup // associated line comment +} + +func (o *ObjectItem) Pos() token.Pos { + // I'm not entirely sure what causes this, but removing this causes + // a test failure. We should investigate at some point. + if len(o.Keys) == 0 { + return token.Pos{} + } + + return o.Keys[0].Pos() +} + +// ObjectKeys are either an identifier or of type string. +type ObjectKey struct { + Token token.Token +} + +func (o *ObjectKey) Pos() token.Pos { + return o.Token.Pos +} + +// LiteralType represents a literal of basic type. Valid types are: +// token.NUMBER, token.FLOAT, token.BOOL and token.STRING +type LiteralType struct { + Token token.Token + + // comment types, only used when in a list + LeadComment *CommentGroup + LineComment *CommentGroup +} + +func (l *LiteralType) Pos() token.Pos { + return l.Token.Pos +} + +// ListStatement represents a HCL List type +type ListType struct { + Lbrack token.Pos // position of "[" + Rbrack token.Pos // position of "]" + List []Node // the elements in lexical order +} + +func (l *ListType) Pos() token.Pos { + return l.Lbrack +} + +func (l *ListType) Add(node Node) { + l.List = append(l.List, node) +} + +// ObjectType represents a HCL Object Type +type ObjectType struct { + Lbrace token.Pos // position of "{" + Rbrace token.Pos // position of "}" + List *ObjectList // the nodes in lexical order +} + +func (o *ObjectType) Pos() token.Pos { + return o.Lbrace +} + +// Comment node represents a single //, # style or /*- style commment +type Comment struct { + Start token.Pos // position of / or # + Text string +} + +func (c *Comment) Pos() token.Pos { + return c.Start +} + +// CommentGroup node represents a sequence of comments with no other tokens and +// no empty lines between. +type CommentGroup struct { + List []*Comment // len(List) > 0 +} + +func (c *CommentGroup) Pos() token.Pos { + return c.List[0].Pos() +} + +//------------------------------------------------------------------- +// GoStringer +//------------------------------------------------------------------- + +func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } +func (o *ObjectList) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go new file mode 100755 index 0000000..ba07ad4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go @@ -0,0 +1,52 @@ +package ast + +import "fmt" + +// WalkFunc describes a function to be called for each node during a Walk. The +// returned node can be used to rewrite the AST. Walking stops the returned +// bool is false. +type WalkFunc func(Node) (Node, bool) + +// Walk traverses an AST in depth-first order: It starts by calling fn(node); +// node must not be nil. If fn returns true, Walk invokes fn recursively for +// each of the non-nil children of node, followed by a call of fn(nil). The +// returned node of fn can be used to rewrite the passed node to fn. +func Walk(node Node, fn WalkFunc) Node { + rewritten, ok := fn(node) + if !ok { + return rewritten + } + + switch n := node.(type) { + case *File: + n.Node = Walk(n.Node, fn) + case *ObjectList: + for i, item := range n.Items { + n.Items[i] = Walk(item, fn).(*ObjectItem) + } + case *ObjectKey: + // nothing to do + case *ObjectItem: + for i, k := range n.Keys { + n.Keys[i] = Walk(k, fn).(*ObjectKey) + } + + if n.Val != nil { + n.Val = Walk(n.Val, fn) + } + case *LiteralType: + // nothing to do + case *ListType: + for i, l := range n.List { + n.List[i] = Walk(l, fn) + } + case *ObjectType: + n.List = Walk(n.List, fn).(*ObjectList) + default: + // should we panic here? + fmt.Printf("unknown type: %T\n", n) + } + + fn(nil) + return rewritten +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go new file mode 100755 index 0000000..5c99381 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/error.go @@ -0,0 +1,17 @@ +package parser + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/token" +) + +// PosError is a parse error that contains a position. +type PosError struct { + Pos token.Pos + Err error +} + +func (e *PosError) Error() string { + return fmt.Sprintf("At %s: %s", e.Pos, e.Err) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go new file mode 100755 index 0000000..64c83bc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go @@ -0,0 +1,532 @@ +// Package parser implements a parser for HCL (HashiCorp Configuration +// Language) +package parser + +import ( + "bytes" + "errors" + "fmt" + "strings" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/scanner" + "github.com/hashicorp/hcl/hcl/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + comments []*ast.CommentGroup + leadComment *ast.CommentGroup // last lead comment + lineComment *ast.CommentGroup // last line comment + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + // normalize all line endings + // since the scanner and output only work with "\n" line endings, we may + // end up with dangling "\r" characters in the parsed data. + src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1) + + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = &PosError{Pos: pos, Err: errors.New(msg)} + } + + f.Node, err = p.objectList(false) + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + f.Comments = p.comments + return f, nil +} + +// objectList parses a list of items within an object (generally k/v pairs). +// The parameter" obj" tells this whether to we are within an object (braces: +// '{', '}') or just at the top level. If we're within an object, we end +// at an RBRACE. +func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + if obj { + tok := p.scan() + p.unscan() + if tok.Type == token.RBRACE { + break + } + } + + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // object lists can be optionally comma-delimited e.g. when a list of maps + // is being expressed, so a comma is allowed here - it's simply consumed + tok := p.scan() + if tok.Type != token.COMMA { + p.unscan() + } + } + return node, nil +} + +func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { + endline = p.tok.Pos.Line + + // count the endline if it's multiline comment, ie starting with /* + if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { + // don't use range here - no need to decode Unicode code points + for i := 0; i < len(p.tok.Text); i++ { + if p.tok.Text[i] == '\n' { + endline++ + } + } + } + + comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} + p.tok = p.sc.Scan() + return +} + +func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { + var list []*ast.Comment + endline = p.tok.Pos.Line + + for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { + var comment *ast.Comment + comment, endline = p.consumeComment() + list = append(list, comment) + } + + // add comment group to the comments list + comments = &ast.CommentGroup{List: list} + p.comments = append(p.comments, comments) + + return +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if len(keys) > 0 && err == errEofToken { + // We ignore eof token here since it is an error if we didn't + // receive a value (but we did receive a key) for the item. + err = nil + } + if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { + // This is a strange boolean statement, but what it means is: + // We have keys with no value, and we're likely in an object + // (since RBrace ends an object). For this, we set err to nil so + // we continue and get the error below of having the wrong value + // type. + err = nil + + // Reset the token type so we don't think it completed fine. See + // objectType which uses p.tok.Type to check if we're done with + // the object. + p.tok.Type = token.EOF + } + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + if p.leadComment != nil { + o.LeadComment = p.leadComment + p.leadComment = nil + } + + switch p.tok.Type { + case token.ASSIGN: + o.Assign = p.tok.Pos + o.Val, err = p.object() + if err != nil { + return nil, err + } + case token.LBRACE: + o.Val, err = p.objectType() + if err != nil { + return nil, err + } + default: + keyStr := make([]string, 0, len(keys)) + for _, k := range keys { + keyStr = append(keyStr, k.Token.Text) + } + + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf( + "key '%s' expected start of object ('{') or assignment ('=')", + strings.Join(keyStr, " ")), + } + } + + // key=#comment + // val + if p.lineComment != nil { + o.LineComment, p.lineComment = p.lineComment, nil + } + + // do a look-ahead for line comment + p.scan() + if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { + o.LineComment = p.lineComment + p.lineComment = nil + } + p.unscan() + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + // It is very important to also return the keys here as well as + // the error. This is because we need to be able to tell if we + // did parse keys prior to finding the EOF, or if we just found + // a bare EOF. + return keys, errEofToken + case token.ASSIGN: + // assignment or object only, but not nested objects. this is not + // allowed: `foo bar = {}` + if keyCount > 1 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), + } + } + + if keyCount == 0 { + return nil, &PosError{ + Pos: p.tok.Pos, + Err: errors.New("no object keys found!"), + } + } + + return keys, nil + case token.LBRACE: + var err error + + // If we have no keys, then it is a syntax error. i.e. {{}} is not + // allowed. + if len(keys) == 0 { + err = &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING got: %s", p.tok.Type), + } + } + + // object + return keys, err + case token.IDENT, token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{Token: p.tok}) + case token.ILLEGAL: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("illegal character"), + } + default: + return keys, &PosError{ + Pos: p.tok.Pos, + Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), + } + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (ast.Node, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.COMMENT: + // implement comment + case token.EOF: + return nil, errEofToken + } + + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("Unknown token: %+v", tok), + } +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{ + Lbrace: p.tok.Pos, + } + + l, err := p.objectList(true) + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + // No error, scan and expect the ending to be a brace + if tok := p.scan(); tok.Type != token.RBRACE { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type), + } + } + + o.List = l + o.Rbrace = p.tok.Pos // advanced via parseObjectList + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{ + Lbrack: p.tok.Pos, + } + + needComma := false + for { + tok := p.scan() + if needComma { + switch tok.Type { + case token.COMMA, token.RBRACK: + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error parsing list, expected comma or list end, got: %s", + tok.Type), + } + } + } + switch tok.Type { + case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: + node, err := p.literalType() + if err != nil { + return nil, err + } + + // If there is a lead comment, apply it + if p.leadComment != nil { + node.LeadComment = p.leadComment + p.leadComment = nil + } + + l.Add(node) + needComma = true + case token.COMMA: + // get next list item or we are at the end + // do a look-ahead for line comment + p.scan() + if p.lineComment != nil && len(l.List) > 0 { + lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) + if ok { + lit.LineComment = p.lineComment + l.List[len(l.List)-1] = lit + p.lineComment = nil + } + } + p.unscan() + + needComma = false + continue + case token.LBRACE: + // Looks like a nested object, so parse it out + node, err := p.objectType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse object within list: %s", err), + } + } + l.Add(node) + needComma = true + case token.LBRACK: + node, err := p.listType() + if err != nil { + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf( + "error while trying to parse list within list: %s", err), + } + } + l.Add(node) + case token.RBRACK: + // finished + l.Rbrack = p.tok.Pos + return l, nil + default: + return nil, &PosError{ + Pos: tok.Pos, + Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), + } + } + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok, + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. In the process, it collects any +// comment groups encountered, and remembers the last lead and line comments. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + // Otherwise read the next token from the scanner and Save it to the buffer + // in case we unscan later. + prev := p.tok + p.tok = p.sc.Scan() + + if p.tok.Type == token.COMMENT { + var comment *ast.CommentGroup + var endline int + + // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", + // p.tok.Pos.Line, prev.Pos.Line, endline) + if p.tok.Pos.Line == prev.Pos.Line { + // The comment is on same line as the previous token; it + // cannot be a lead comment but may be a line comment. + comment, endline = p.consumeCommentGroup(0) + if p.tok.Pos.Line != endline { + // The next token is on a different line, thus + // the last comment group is a line comment. + p.lineComment = comment + } + } + + // consume successor comments, if any + endline = -1 + for p.tok.Type == token.COMMENT { + comment, endline = p.consumeCommentGroup(1) + } + + if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { + switch p.tok.Type { + case token.RBRACE, token.RBRACK: + // Do not count for these cases + default: + // The next token is following on the line immediately after the + // comment group, thus the last comment group is a lead comment. + p.leadComment = comment + } + } + + } + + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go new file mode 100755 index 0000000..7c038d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go @@ -0,0 +1,789 @@ +package printer + +import ( + "bytes" + "fmt" + "sort" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/token" +) + +const ( + blank = byte(' ') + newline = byte('\n') + tab = byte('\t') + infinity = 1 << 30 // offset or line +) + +var ( + unindent = []byte("\uE123") // in the private use space +) + +type printer struct { + cfg Config + prev token.Pos + + comments []*ast.CommentGroup // may be nil, contains all comments + standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) + + enableTrace bool + indentTrace int +} + +type ByPosition []*ast.CommentGroup + +func (b ByPosition) Len() int { return len(b) } +func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } + +// collectComments comments all standalone comments which are not lead or line +// comment +func (p *printer) collectComments(node ast.Node) { + // first collect all comments. This is already stored in + // ast.File.(comments) + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.File: + p.comments = t.Comments + return nn, false + } + return nn, true + }) + + standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) + for _, c := range p.comments { + standaloneComments[c.Pos()] = c + } + + // next remove all lead and line comments from the overall comment map. + // This will give us comments which are standalone, comments which are not + // assigned to any kind of node. + ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { + switch t := nn.(type) { + case *ast.LiteralType: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + case *ast.ObjectItem: + if t.LeadComment != nil { + for _, comment := range t.LeadComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + + if t.LineComment != nil { + for _, comment := range t.LineComment.List { + if _, ok := standaloneComments[comment.Pos()]; ok { + delete(standaloneComments, comment.Pos()) + } + } + } + } + + return nn, true + }) + + for _, c := range standaloneComments { + p.standaloneComments = append(p.standaloneComments, c) + } + + sort.Sort(ByPosition(p.standaloneComments)) +} + +// output prints creates b printable HCL output and returns it. +func (p *printer) output(n interface{}) []byte { + var buf bytes.Buffer + + switch t := n.(type) { + case *ast.File: + // File doesn't trace so we add the tracing here + defer un(trace(p, "File")) + return p.output(t.Node) + case *ast.ObjectList: + defer un(trace(p, "ObjectList")) + + var index int + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is at "infinity" + var nextItem token.Pos + if index != len(t.Items) { + nextItem = t.Items[index].Pos() + } else { + nextItem = token.Pos{Offset: infinity, Line: infinity} + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + // Go through all the comments in the group. The group + // should be printed together, not separated by double newlines. + printed := false + newlinePrinted := false + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // if we hit the end add newlines so we can print the comment + // we don't do this if prev is invalid which means the + // beginning of the file since the first comment should + // be at the first line. + if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { + buf.Write([]byte{newline, newline}) + newlinePrinted = true + } + + // Write the actual comment. + buf.WriteString(comment.Text) + buf.WriteByte(newline) + + // Set printed to true to note that we printed something + printed = true + } + } + + // If we're not at the last item, write a new line so + // that there is a newline separating this comment from + // the next object. + if printed && index != len(t.Items) { + buf.WriteByte(newline) + } + } + + if index == len(t.Items) { + break + } + + buf.Write(p.output(t.Items[index])) + if index != len(t.Items)-1 { + // Always write a newline to separate us from the next item + buf.WriteByte(newline) + + // Need to determine if we're going to separate the next item + // with a blank line. The logic here is simple, though there + // are a few conditions: + // + // 1. The next object is more than one line away anyways, + // so we need an empty line. + // + // 2. The next object is not a "single line" object, so + // we need an empty line. + // + // 3. This current object is not a single line object, + // so we need an empty line. + current := t.Items[index] + next := t.Items[index+1] + if next.Pos().Line != t.Items[index].Pos().Line+1 || + !p.isSingleLineObject(next) || + !p.isSingleLineObject(current) { + buf.WriteByte(newline) + } + } + index++ + } + case *ast.ObjectKey: + buf.WriteString(t.Token.Text) + case *ast.ObjectItem: + p.prev = t.Pos() + buf.Write(p.objectItem(t)) + case *ast.LiteralType: + buf.Write(p.literalType(t)) + case *ast.ListType: + buf.Write(p.list(t)) + case *ast.ObjectType: + buf.Write(p.objectType(t)) + default: + fmt.Printf(" unknown type: %T\n", n) + } + + return buf.Bytes() +} + +func (p *printer) literalType(lit *ast.LiteralType) []byte { + result := []byte(lit.Token.Text) + switch lit.Token.Type { + case token.HEREDOC: + // Clear the trailing newline from heredocs + if result[len(result)-1] == '\n' { + result = result[:len(result)-1] + } + + // Poison lines 2+ so that we don't indent them + result = p.heredocIndent(result) + case token.STRING: + // If this is a multiline string, poison lines 2+ so we don't + // indent them. + if bytes.IndexRune(result, '\n') >= 0 { + result = p.heredocIndent(result) + } + } + + return result +} + +// objectItem returns the printable HCL form of an object item. An object type +// starts with one/multiple keys and has a value. The value might be of any +// type. +func (p *printer) objectItem(o *ast.ObjectItem) []byte { + defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) + var buf bytes.Buffer + + if o.LeadComment != nil { + for _, comment := range o.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + // If key and val are on different lines, treat line comments like lead comments. + if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line { + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range o.Keys { + buf.WriteString(k.Token.Text) + buf.WriteByte(blank) + + // reach end of key + if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + buf.Write(p.output(o.Val)) + + if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line { + buf.WriteByte(blank) + for _, comment := range o.LineComment.List { + buf.WriteString(comment.Text) + } + } + + return buf.Bytes() +} + +// objectType returns the printable HCL form of an object type. An object type +// begins with a brace and ends with a brace. +func (p *printer) objectType(o *ast.ObjectType) []byte { + defer un(trace(p, "ObjectType")) + var buf bytes.Buffer + buf.WriteString("{") + + var index int + var nextItem token.Pos + var commented, newlinePrinted bool + for { + // Determine the location of the next actual non-comment + // item. If we're at the end, the next item is the closing brace + if index != len(o.List.Items) { + nextItem = o.List.Items[index].Pos() + } else { + nextItem = o.Rbrace + } + + // Go through the standalone comments in the file and print out + // the comments that we should be for this object item. + for _, c := range p.standaloneComments { + printed := false + var lastCommentPos token.Pos + for _, comment := range c.List { + // We only care about comments after the previous item + // we've printed so that comments are printed in the + // correct locations (between two objects for example). + // And before the next item. + if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { + // If there are standalone comments and the initial newline has not + // been printed yet, do it now. + if !newlinePrinted { + newlinePrinted = true + buf.WriteByte(newline) + } + + // add newline if it's between other printed nodes + if index > 0 { + commented = true + buf.WriteByte(newline) + } + + // Store this position + lastCommentPos = comment.Pos() + + // output the comment itself + buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) + + // Set printed to true to note that we printed something + printed = true + + /* + if index != len(o.List.Items) { + buf.WriteByte(newline) // do not print on the end + } + */ + } + } + + // Stuff to do if we had comments + if printed { + // Always write a newline + buf.WriteByte(newline) + + // If there is another item in the object and our comment + // didn't hug it directly, then make sure there is a blank + // line separating them. + if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { + buf.WriteByte(newline) + } + } + } + + if index == len(o.List.Items) { + p.prev = o.Rbrace + break + } + + // At this point we are sure that it's not a totally empty block: print + // the initial newline if it hasn't been printed yet by the previous + // block about standalone comments. + if !newlinePrinted { + buf.WriteByte(newline) + newlinePrinted = true + } + + // check if we have adjacent one liner items. If yes we'll going to align + // the comments. + var aligned []*ast.ObjectItem + for _, item := range o.List.Items[index:] { + // we don't group one line lists + if len(o.List.Items) == 1 { + break + } + + // one means a oneliner with out any lead comment + // two means a oneliner with lead comment + // anything else might be something else + cur := lines(string(p.objectItem(item))) + if cur > 2 { + break + } + + curPos := item.Pos() + + nextPos := token.Pos{} + if index != len(o.List.Items)-1 { + nextPos = o.List.Items[index+1].Pos() + } + + prevPos := token.Pos{} + if index != 0 { + prevPos = o.List.Items[index-1].Pos() + } + + // fmt.Println("DEBUG ----------------") + // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) + // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) + // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) + + if curPos.Line+1 == nextPos.Line { + aligned = append(aligned, item) + index++ + continue + } + + if curPos.Line-1 == prevPos.Line { + aligned = append(aligned, item) + index++ + + // finish if we have a new line or comment next. This happens + // if the next item is not adjacent + if curPos.Line+1 != nextPos.Line { + break + } + continue + } + + break + } + + // put newlines if the items are between other non aligned items. + // newlines are also added if there is a standalone comment already, so + // check it too + if !commented && index != len(aligned) { + buf.WriteByte(newline) + } + + if len(aligned) >= 1 { + p.prev = aligned[len(aligned)-1].Pos() + + items := p.alignedItems(aligned) + buf.Write(p.indent(items)) + } else { + p.prev = o.List.Items[index].Pos() + + buf.Write(p.indent(p.objectItem(o.List.Items[index]))) + index++ + } + + buf.WriteByte(newline) + } + + buf.WriteString("}") + return buf.Bytes() +} + +func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { + var buf bytes.Buffer + + // find the longest key and value length, needed for alignment + var longestKeyLen int // longest key length + var longestValLen int // longest value length + for _, item := range items { + key := len(item.Keys[0].Token.Text) + val := len(p.output(item.Val)) + + if key > longestKeyLen { + longestKeyLen = key + } + + if val > longestValLen { + longestValLen = val + } + } + + for i, item := range items { + if item.LeadComment != nil { + for _, comment := range item.LeadComment.List { + buf.WriteString(comment.Text) + buf.WriteByte(newline) + } + } + + for i, k := range item.Keys { + keyLen := len(k.Token.Text) + buf.WriteString(k.Token.Text) + for i := 0; i < longestKeyLen-keyLen+1; i++ { + buf.WriteByte(blank) + } + + // reach end of key + if i == len(item.Keys)-1 && len(item.Keys) == 1 { + buf.WriteString("=") + buf.WriteByte(blank) + } + } + + val := p.output(item.Val) + valLen := len(val) + buf.Write(val) + + if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { + for i := 0; i < longestValLen-valLen+1; i++ { + buf.WriteByte(blank) + } + + for _, comment := range item.LineComment.List { + buf.WriteString(comment.Text) + } + } + + // do not print for the last item + if i != len(items)-1 { + buf.WriteByte(newline) + } + } + + return buf.Bytes() +} + +// list returns the printable HCL form of an list type. +func (p *printer) list(l *ast.ListType) []byte { + if p.isSingleLineList(l) { + return p.singleLineList(l) + } + + var buf bytes.Buffer + buf.WriteString("[") + buf.WriteByte(newline) + + var longestLine int + for _, item := range l.List { + // for now we assume that the list only contains literal types + if lit, ok := item.(*ast.LiteralType); ok { + lineLen := len(lit.Token.Text) + if lineLen > longestLine { + longestLine = lineLen + } + } + } + + haveEmptyLine := false + for i, item := range l.List { + // If we have a lead comment, then we want to write that first + leadComment := false + if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { + leadComment = true + + // Ensure an empty line before every element with a + // lead comment (except the first item in a list). + if !haveEmptyLine && i != 0 { + buf.WriteByte(newline) + } + + for _, comment := range lit.LeadComment.List { + buf.Write(p.indent([]byte(comment.Text))) + buf.WriteByte(newline) + } + } + + // also indent each line + val := p.output(item) + curLen := len(val) + buf.Write(p.indent(val)) + + // if this item is a heredoc, then we output the comma on + // the next line. This is the only case this happens. + comma := []byte{','} + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + comma = p.indent(comma) + } + + buf.Write(comma) + + if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { + // if the next item doesn't have any comments, do not align + buf.WriteByte(blank) // align one space + for i := 0; i < longestLine-curLen; i++ { + buf.WriteByte(blank) + } + + for _, comment := range lit.LineComment.List { + buf.WriteString(comment.Text) + } + } + + buf.WriteByte(newline) + + // Ensure an empty line after every element with a + // lead comment (except the first item in a list). + haveEmptyLine = leadComment && i != len(l.List)-1 + if haveEmptyLine { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// isSingleLineList returns true if: +// * they were previously formatted entirely on one line +// * they consist entirely of literals +// * there are either no heredoc strings or the list has exactly one element +// * there are no line comments +func (printer) isSingleLineList(l *ast.ListType) bool { + for _, item := range l.List { + if item.Pos().Line != l.Lbrack.Line { + return false + } + + lit, ok := item.(*ast.LiteralType) + if !ok { + return false + } + + if lit.Token.Type == token.HEREDOC && len(l.List) != 1 { + return false + } + + if lit.LineComment != nil { + return false + } + } + + return true +} + +// singleLineList prints a simple single line list. +// For a definition of "simple", see isSingleLineList above. +func (p *printer) singleLineList(l *ast.ListType) []byte { + buf := &bytes.Buffer{} + + buf.WriteString("[") + for i, item := range l.List { + if i != 0 { + buf.WriteString(", ") + } + + // Output the item itself + buf.Write(p.output(item)) + + // The heredoc marker needs to be at the end of line. + if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { + buf.WriteByte(newline) + } + } + + buf.WriteString("]") + return buf.Bytes() +} + +// indent indents the lines of the given buffer for each non-empty line +func (p *printer) indent(buf []byte) []byte { + var prefix []byte + if p.cfg.SpacesWidth != 0 { + for i := 0; i < p.cfg.SpacesWidth; i++ { + prefix = append(prefix, blank) + } + } else { + prefix = []byte{tab} + } + + var res []byte + bol := true + for _, c := range buf { + if bol && c != '\n' { + res = append(res, prefix...) + } + + res = append(res, c) + bol = c == '\n' + } + return res +} + +// unindent removes all the indentation from the tombstoned lines +func (p *printer) unindent(buf []byte) []byte { + var res []byte + for i := 0; i < len(buf); i++ { + skip := len(buf)-i <= len(unindent) + if !skip { + skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) + } + if skip { + res = append(res, buf[i]) + continue + } + + // We have a marker. we have to backtrace here and clean out + // any whitespace ahead of our tombstone up to a \n + for j := len(res) - 1; j >= 0; j-- { + if res[j] == '\n' { + break + } + + res = res[:j] + } + + // Skip the entire unindent marker + i += len(unindent) - 1 + } + + return res +} + +// heredocIndent marks all the 2nd and further lines as unindentable +func (p *printer) heredocIndent(buf []byte) []byte { + var res []byte + bol := false + for _, c := range buf { + if bol && c != '\n' { + res = append(res, unindent...) + } + res = append(res, c) + bol = c == '\n' + } + return res +} + +// isSingleLineObject tells whether the given object item is a single +// line object such as "obj {}". +// +// A single line object: +// +// * has no lead comments (hence multi-line) +// * has no assignment +// * has no values in the stanza (within {}) +// +func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { + // If there is a lead comment, can't be one line + if val.LeadComment != nil { + return false + } + + // If there is assignment, we always break by line + if val.Assign.IsValid() { + return false + } + + // If it isn't an object type, then its not a single line object + ot, ok := val.Val.(*ast.ObjectType) + if !ok { + return false + } + + // If the object has no items, it is single line! + return len(ot.List.Items) == 0 +} + +func lines(txt string) int { + endline := 1 + for i := 0; i < len(txt); i++ { + if txt[i] == '\n' { + endline++ + } + } + return endline +} + +// ---------------------------------------------------------------------------- +// Tracing support + +func (p *printer) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + i := 2 * p.indentTrace + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *printer, msg string) *printer { + p.printTrace(msg, "(") + p.indentTrace++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *printer) { + p.indentTrace-- + p.printTrace(")") +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go new file mode 100755 index 0000000..6617ab8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go @@ -0,0 +1,66 @@ +// Package printer implements printing of AST nodes to HCL format. +package printer + +import ( + "bytes" + "io" + "text/tabwriter" + + "github.com/hashicorp/hcl/hcl/ast" + "github.com/hashicorp/hcl/hcl/parser" +) + +var DefaultConfig = Config{ + SpacesWidth: 2, +} + +// A Config node controls the output of Fprint. +type Config struct { + SpacesWidth int // if set, it will use spaces instead of tabs for alignment +} + +func (c *Config) Fprint(output io.Writer, node ast.Node) error { + p := &printer{ + cfg: *c, + comments: make([]*ast.CommentGroup, 0), + standaloneComments: make([]*ast.CommentGroup, 0), + // enableTrace: true, + } + + p.collectComments(node) + + if _, err := output.Write(p.unindent(p.output(node))); err != nil { + return err + } + + // flush tabwriter, if any + var err error + if tw, _ := output.(*tabwriter.Writer); tw != nil { + err = tw.Flush() + } + + return err +} + +// Fprint "pretty-prints" an HCL node to output +// It calls Config.Fprint with default settings. +func Fprint(output io.Writer, node ast.Node) error { + return DefaultConfig.Fprint(output, node) +} + +// Format formats src HCL and returns the result. +func Format(src []byte) ([]byte, error) { + node, err := parser.Parse(src) + if err != nil { + return nil, err + } + + var buf bytes.Buffer + if err := DefaultConfig.Fprint(&buf, node); err != nil { + return nil, err + } + + // Add trailing newline to result + buf.WriteString("\n") + return buf.Bytes(), nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go new file mode 100755 index 0000000..624a18f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go @@ -0,0 +1,652 @@ +// Package scanner implements a scanner for HCL (HashiCorp Configuration +// Language) source text. +package scanner + +import ( + "bytes" + "fmt" + "os" + "regexp" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/hcl/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == utf8.RuneError && size == 1 { + s.err("illegal UTF-8 encoding") + return ch + } + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + if ch == '\x00' { + s.err("unexpected null character (0x00)") + return eof + } + + if ch == '\uE123' { + s.err("unicode code point U+E123 reserved for internal use") + return utf8.RuneError + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + tok = token.IDENT + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '#', '/': + tok = token.COMMENT + s.scanComment(ch) + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '<': + tok = token.HEREDOC + s.scanHeredoc() + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case '=': + tok = token.ASSIGN + case '+': + tok = token.ADD + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + tok = token.SUB + } + default: + s.err("illegal char") + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +func (s *Scanner) scanComment(ch rune) { + // single line comments + if ch == '#' || (ch == '/' && s.peek() != '*') { + if ch == '/' && s.peek() != '/' { + s.err("expected '/' for comment") + return + } + + ch = s.next() + for ch != '\n' && ch >= 0 && ch != eof { + ch = s.next() + } + if ch != eof && ch >= 0 { + s.unread() + } + return + } + + // be sure we get the character after /* This allows us to find comment's + // that are not erminated + if ch == '/' { + s.next() + ch = s.next() // read character after "/*" + } + + // look for /* - style comments + for { + if ch < 0 || ch == eof { + s.err("comment not terminated") + break + } + + ch0 := ch + ch = s.next() + if ch0 == '*' && ch == '/' { + break + } + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + if ch == '0' { + // check for hexadecimal, octal or float + ch = s.next() + if ch == 'x' || ch == 'X' { + // hexadecimal + ch = s.next() + found := false + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + s.err("illegal hexadecimal number") + } + + if ch != eof { + s.unread() + } + + return token.NUMBER + } + + // now it's either something like: 0421(octal) or 0.1231(float) + illegalOctal := false + for isDecimal(ch) { + ch = s.next() + if ch == '8' || ch == '9' { + // this is just a possibility. For example 0159 is illegal, but + // 0159.23 is valid. So we mark a possible illegal octal. If + // the next character is not a period, we'll print the error. + illegalOctal = true + } + } + + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if illegalOctal { + s.err("illegal octal number") + } + + if ch != eof { + s.unread() + } + return token.NUMBER + } + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanHeredoc scans a heredoc string +func (s *Scanner) scanHeredoc() { + // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { + break + } + + // Not an anchor match, record the start of a new line + lineStart = s.srcPos.Offset + } + + if ch == eof { + s.err("heredoc not terminated") + return + } + } + + return +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if (ch == '\n' && braces == 0) || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' && braces == 0 { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + start := n + for n > 0 && digitVal(ch) < base { + ch = s.next() + if ch == eof { + // If we see an EOF, we halt any more scanning of digits + // immediately. + break + } + + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + if n != start && ch != eof { + // we scanned all digits, put the last non digit char back, + // only if we read anything at all + s.unread() + } + + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isDigit returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isDecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go new file mode 100755 index 0000000..5f981ea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go @@ -0,0 +1,241 @@ +package strconv + +import ( + "errors" + "unicode/utf8" +) + +// ErrSyntax indicates that a value does not have the right syntax for the target type. +var ErrSyntax = errors.New("invalid syntax") + +// Unquote interprets s as a single-quoted, double-quoted, +// or backquoted Go string literal, returning the string value +// that s quotes. (If s is single-quoted, it would be a Go +// character literal; Unquote returns the corresponding +// one-character string.) +func Unquote(s string) (t string, err error) { + n := len(s) + if n < 2 { + return "", ErrSyntax + } + quote := s[0] + if quote != s[n-1] { + return "", ErrSyntax + } + s = s[1 : n-1] + + if quote != '"' { + return "", ErrSyntax + } + if !contains(s, '$') && !contains(s, '{') && contains(s, '\n') { + return "", ErrSyntax + } + + // Is it trivial? Avoid allocation. + if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { + switch quote { + case '"': + return s, nil + case '\'': + r, size := utf8.DecodeRuneInString(s) + if size == len(s) && (r != utf8.RuneError || size != 1) { + return s, nil + } + } + } + + var runeTmp [utf8.UTFMax]byte + buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. + for len(s) > 0 { + // If we're starting a '${}' then let it through un-unquoted. + // Specifically: we don't unquote any characters within the `${}` + // section. + if s[0] == '$' && len(s) > 1 && s[1] == '{' { + buf = append(buf, '$', '{') + s = s[2:] + + // Continue reading until we find the closing brace, copying as-is + braces := 1 + for len(s) > 0 && braces > 0 { + r, size := utf8.DecodeRuneInString(s) + if r == utf8.RuneError { + return "", ErrSyntax + } + + s = s[size:] + + n := utf8.EncodeRune(runeTmp[:], r) + buf = append(buf, runeTmp[:n]...) + + switch r { + case '{': + braces++ + case '}': + braces-- + } + } + if braces != 0 { + return "", ErrSyntax + } + if len(s) == 0 { + // If there's no string left, we're done! + break + } else { + // If there's more left, we need to pop back up to the top of the loop + // in case there's another interpolation in this string. + continue + } + } + + if s[0] == '\n' { + return "", ErrSyntax + } + + c, multibyte, ss, err := unquoteChar(s, quote) + if err != nil { + return "", err + } + s = ss + if c < utf8.RuneSelf || !multibyte { + buf = append(buf, byte(c)) + } else { + n := utf8.EncodeRune(runeTmp[:], c) + buf = append(buf, runeTmp[:n]...) + } + if quote == '\'' && len(s) != 0 { + // single-quoted must be single character + return "", ErrSyntax + } + } + return string(buf), nil +} + +// contains reports whether the string contains the byte c. +func contains(s string, c byte) bool { + for i := 0; i < len(s); i++ { + if s[i] == c { + return true + } + } + return false +} + +func unhex(b byte) (v rune, ok bool) { + c := rune(b) + switch { + case '0' <= c && c <= '9': + return c - '0', true + case 'a' <= c && c <= 'f': + return c - 'a' + 10, true + case 'A' <= c && c <= 'F': + return c - 'A' + 10, true + } + return +} + +func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { + // easy cases + switch c := s[0]; { + case c == quote && (quote == '\'' || quote == '"'): + err = ErrSyntax + return + case c >= utf8.RuneSelf: + r, size := utf8.DecodeRuneInString(s) + return r, true, s[size:], nil + case c != '\\': + return rune(s[0]), false, s[1:], nil + } + + // hard case: c is backslash + if len(s) <= 1 { + err = ErrSyntax + return + } + c := s[1] + s = s[2:] + + switch c { + case 'a': + value = '\a' + case 'b': + value = '\b' + case 'f': + value = '\f' + case 'n': + value = '\n' + case 'r': + value = '\r' + case 't': + value = '\t' + case 'v': + value = '\v' + case 'x', 'u', 'U': + n := 0 + switch c { + case 'x': + n = 2 + case 'u': + n = 4 + case 'U': + n = 8 + } + var v rune + if len(s) < n { + err = ErrSyntax + return + } + for j := 0; j < n; j++ { + x, ok := unhex(s[j]) + if !ok { + err = ErrSyntax + return + } + v = v<<4 | x + } + s = s[n:] + if c == 'x' { + // single-byte string, possibly not UTF-8 + value = v + break + } + if v > utf8.MaxRune { + err = ErrSyntax + return + } + value = v + multibyte = true + case '0', '1', '2', '3', '4', '5', '6', '7': + v := rune(c) - '0' + if len(s) < 2 { + err = ErrSyntax + return + } + for j := 0; j < 2; j++ { // one digit already; two more + x := rune(s[j]) - '0' + if x < 0 || x > 7 { + err = ErrSyntax + return + } + v = (v << 3) | x + } + s = s[2:] + if v > 255 { + err = ErrSyntax + return + } + value = v + case '\\': + value = '\\' + case '\'', '"': + if c != quote { + err = ErrSyntax + return + } + value = rune(c) + default: + err = ErrSyntax + return + } + tail = s + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go new file mode 100755 index 0000000..59c1bb7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go new file mode 100755 index 0000000..e37c066 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/hcl/token/token.go @@ -0,0 +1,219 @@ +// Package token defines constants representing the lexical tokens for HCL +// (HashiCorp Configuration Language) +package token + +import ( + "fmt" + "strconv" + "strings" + + hclstrconv "github.com/hashicorp/hcl/hcl/strconv" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string + JSON bool +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + COMMENT + + identifier_beg + IDENT // literals + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + HEREDOC // < 0 { + // Pop the current item + n := len(frontier) + item := frontier[n-1] + frontier = frontier[:n-1] + + switch v := item.Val.(type) { + case *ast.ObjectType: + items, frontier = flattenObjectType(v, item, items, frontier) + case *ast.ListType: + items, frontier = flattenListType(v, item, items, frontier) + default: + items = append(items, item) + } + } + + // Reverse the list since the frontier model runs things backwards + for i := len(items)/2 - 1; i >= 0; i-- { + opp := len(items) - 1 - i + items[i], items[opp] = items[opp], items[i] + } + + // Done! Set the original items + list.Items = items + return n, true + }) +} + +func flattenListType( + ot *ast.ListType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list is empty, keep the original list + if len(ot.List) == 0 { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List { + if _, ok := subitem.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, elem := range ot.List { + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: item.Keys, + Assign: item.Assign, + Val: elem, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} + +func flattenObjectType( + ot *ast.ObjectType, + item *ast.ObjectItem, + items []*ast.ObjectItem, + frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { + // If the list has no items we do not have to flatten anything + if ot.List.Items == nil { + items = append(items, item) + return items, frontier + } + + // All the elements of this object must also be objects! + for _, subitem := range ot.List.Items { + if _, ok := subitem.Val.(*ast.ObjectType); !ok { + items = append(items, item) + return items, frontier + } + } + + // Great! We have a match go through all the items and flatten + for _, subitem := range ot.List.Items { + // Copy the new key + keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) + copy(keys, item.Keys) + copy(keys[len(item.Keys):], subitem.Keys) + + // Add it to the frontier so that we can recurse + frontier = append(frontier, &ast.ObjectItem{ + Keys: keys, + Assign: item.Assign, + Val: subitem.Val, + LeadComment: item.LeadComment, + LineComment: item.LineComment, + }) + } + + return items, frontier +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go new file mode 100755 index 0000000..125a5f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/parser/parser.go @@ -0,0 +1,313 @@ +package parser + +import ( + "errors" + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hcltoken "github.com/hashicorp/hcl/hcl/token" + "github.com/hashicorp/hcl/json/scanner" + "github.com/hashicorp/hcl/json/token" +) + +type Parser struct { + sc *scanner.Scanner + + // Last read token + tok token.Token + commaPrev token.Token + + enableTrace bool + indent int + n int // buffer size (max = 1) +} + +func newParser(src []byte) *Parser { + return &Parser{ + sc: scanner.New(src), + } +} + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func Parse(src []byte) (*ast.File, error) { + p := newParser(src) + return p.Parse() +} + +var errEofToken = errors.New("EOF token found") + +// Parse returns the fully parsed source and returns the abstract syntax tree. +func (p *Parser) Parse() (*ast.File, error) { + f := &ast.File{} + var err, scerr error + p.sc.Error = func(pos token.Pos, msg string) { + scerr = fmt.Errorf("%s: %s", pos, msg) + } + + // The root must be an object in JSON + object, err := p.object() + if scerr != nil { + return nil, scerr + } + if err != nil { + return nil, err + } + + // We make our final node an object list so it is more HCL compatible + f.Node = object.List + + // Flatten it, which finds patterns and turns them into more HCL-like + // AST trees. + flattenObjects(f.Node) + + return f, nil +} + +func (p *Parser) objectList() (*ast.ObjectList, error) { + defer un(trace(p, "ParseObjectList")) + node := &ast.ObjectList{} + + for { + n, err := p.objectItem() + if err == errEofToken { + break // we are finished + } + + // we don't return a nil node, because might want to use already + // collected items. + if err != nil { + return node, err + } + + node.Add(n) + + // Check for a followup comma. If it isn't a comma, then we're done + if tok := p.scan(); tok.Type != token.COMMA { + break + } + } + + return node, nil +} + +// objectItem parses a single object item +func (p *Parser) objectItem() (*ast.ObjectItem, error) { + defer un(trace(p, "ParseObjectItem")) + + keys, err := p.objectKey() + if err != nil { + return nil, err + } + + o := &ast.ObjectItem{ + Keys: keys, + } + + switch p.tok.Type { + case token.COLON: + pos := p.tok.Pos + o.Assign = hcltoken.Pos{ + Filename: pos.Filename, + Offset: pos.Offset, + Line: pos.Line, + Column: pos.Column, + } + + o.Val, err = p.objectValue() + if err != nil { + return nil, err + } + } + + return o, nil +} + +// objectKey parses an object key and returns a ObjectKey AST +func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { + keyCount := 0 + keys := make([]*ast.ObjectKey, 0) + + for { + tok := p.scan() + switch tok.Type { + case token.EOF: + return nil, errEofToken + case token.STRING: + keyCount++ + keys = append(keys, &ast.ObjectKey{ + Token: p.tok.HCLToken(), + }) + case token.COLON: + // If we have a zero keycount it means that we never got + // an object key, i.e. `{ :`. This is a syntax error. + if keyCount == 0 { + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + + // Done + return keys, nil + case token.ILLEGAL: + return nil, errors.New("illegal") + default: + return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) + } + } +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) objectValue() (ast.Node, error) { + defer un(trace(p, "ParseObjectValue")) + tok := p.scan() + + switch tok.Type { + case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: + return p.literalType() + case token.LBRACE: + return p.objectType() + case token.LBRACK: + return p.listType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) +} + +// object parses any type of object, such as number, bool, string, object or +// list. +func (p *Parser) object() (*ast.ObjectType, error) { + defer un(trace(p, "ParseType")) + tok := p.scan() + + switch tok.Type { + case token.LBRACE: + return p.objectType() + case token.EOF: + return nil, errEofToken + } + + return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) +} + +// objectType parses an object type and returns a ObjectType AST +func (p *Parser) objectType() (*ast.ObjectType, error) { + defer un(trace(p, "ParseObjectType")) + + // we assume that the currently scanned token is a LBRACE + o := &ast.ObjectType{} + + l, err := p.objectList() + + // if we hit RBRACE, we are good to go (means we parsed all Items), if it's + // not a RBRACE, it's an syntax error and we just return it. + if err != nil && p.tok.Type != token.RBRACE { + return nil, err + } + + o.List = l + return o, nil +} + +// listType parses a list type and returns a ListType AST +func (p *Parser) listType() (*ast.ListType, error) { + defer un(trace(p, "ParseListType")) + + // we assume that the currently scanned token is a LBRACK + l := &ast.ListType{} + + for { + tok := p.scan() + switch tok.Type { + case token.NUMBER, token.FLOAT, token.STRING: + node, err := p.literalType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.COMMA: + continue + case token.LBRACE: + node, err := p.objectType() + if err != nil { + return nil, err + } + + l.Add(node) + case token.BOOL: + // TODO(arslan) should we support? not supported by HCL yet + case token.LBRACK: + // TODO(arslan) should we support nested lists? Even though it's + // written in README of HCL, it's not a part of the grammar + // (not defined in parse.y) + case token.RBRACK: + // finished + return l, nil + default: + return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) + } + + } +} + +// literalType parses a literal type and returns a LiteralType AST +func (p *Parser) literalType() (*ast.LiteralType, error) { + defer un(trace(p, "ParseLiteral")) + + return &ast.LiteralType{ + Token: p.tok.HCLToken(), + }, nil +} + +// scan returns the next token from the underlying scanner. If a token has +// been unscanned then read that instead. +func (p *Parser) scan() token.Token { + // If we have a token on the buffer, then return it. + if p.n != 0 { + p.n = 0 + return p.tok + } + + p.tok = p.sc.Scan() + return p.tok +} + +// unscan pushes the previously read token back onto the buffer. +func (p *Parser) unscan() { + p.n = 1 +} + +// ---------------------------------------------------------------------------- +// Parsing support + +func (p *Parser) printTrace(a ...interface{}) { + if !p.enableTrace { + return + } + + const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " + const n = len(dots) + fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) + + i := 2 * p.indent + for i > n { + fmt.Print(dots) + i -= n + } + // i <= n + fmt.Print(dots[0:i]) + fmt.Println(a...) +} + +func trace(p *Parser, msg string) *Parser { + p.printTrace(msg, "(") + p.indent++ + return p +} + +// Usage pattern: defer un(trace(p, "...")) +func un(p *Parser) { + p.indent-- + p.printTrace(")") +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go new file mode 100755 index 0000000..fe3f0f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go @@ -0,0 +1,451 @@ +package scanner + +import ( + "bytes" + "fmt" + "os" + "unicode" + "unicode/utf8" + + "github.com/hashicorp/hcl/json/token" +) + +// eof represents a marker rune for the end of the reader. +const eof = rune(0) + +// Scanner defines a lexical scanner +type Scanner struct { + buf *bytes.Buffer // Source buffer for advancing and scanning + src []byte // Source buffer for immutable access + + // Source Position + srcPos token.Pos // current position + prevPos token.Pos // previous position, used for peek() method + + lastCharLen int // length of last character in bytes + lastLineLen int // length of last line in characters (for correct column reporting) + + tokStart int // token text start position + tokEnd int // token text end position + + // Error is called for each error encountered. If no Error + // function is set, the error is reported to os.Stderr. + Error func(pos token.Pos, msg string) + + // ErrorCount is incremented by one for each error encountered. + ErrorCount int + + // tokPos is the start position of most recently scanned token; set by + // Scan. The Filename field is always left untouched by the Scanner. If + // an error is reported (via Error) and Position is invalid, the scanner is + // not inside a token. + tokPos token.Pos +} + +// New creates and initializes a new instance of Scanner using src as +// its source content. +func New(src []byte) *Scanner { + // even though we accept a src, we read from a io.Reader compatible type + // (*bytes.Buffer). So in the future we might easily change it to streaming + // read. + b := bytes.NewBuffer(src) + s := &Scanner{ + buf: b, + src: src, + } + + // srcPosition always starts with 1 + s.srcPos.Line = 1 + return s +} + +// next reads the next rune from the bufferred reader. Returns the rune(0) if +// an error occurs (or io.EOF is returned). +func (s *Scanner) next() rune { + ch, size, err := s.buf.ReadRune() + if err != nil { + // advance for error reporting + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + return eof + } + + if ch == utf8.RuneError && size == 1 { + s.srcPos.Column++ + s.srcPos.Offset += size + s.lastCharLen = size + s.err("illegal UTF-8 encoding") + return ch + } + + // remember last position + s.prevPos = s.srcPos + + s.srcPos.Column++ + s.lastCharLen = size + s.srcPos.Offset += size + + if ch == '\n' { + s.srcPos.Line++ + s.lastLineLen = s.srcPos.Column + s.srcPos.Column = 0 + } + + // debug + // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) + return ch +} + +// unread unreads the previous read Rune and updates the source position +func (s *Scanner) unread() { + if err := s.buf.UnreadRune(); err != nil { + panic(err) // this is user fault, we should catch it + } + s.srcPos = s.prevPos // put back last position +} + +// peek returns the next rune without advancing the reader. +func (s *Scanner) peek() rune { + peek, _, err := s.buf.ReadRune() + if err != nil { + return eof + } + + s.buf.UnreadRune() + return peek +} + +// Scan scans the next token and returns the token. +func (s *Scanner) Scan() token.Token { + ch := s.next() + + // skip white space + for isWhitespace(ch) { + ch = s.next() + } + + var tok token.Type + + // token text markings + s.tokStart = s.srcPos.Offset - s.lastCharLen + + // token position, initial next() is moving the offset by one(size of rune + // actually), though we are interested with the starting point + s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen + if s.srcPos.Column > 0 { + // common case: last character was not a '\n' + s.tokPos.Line = s.srcPos.Line + s.tokPos.Column = s.srcPos.Column + } else { + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + s.tokPos.Line = s.srcPos.Line - 1 + s.tokPos.Column = s.lastLineLen + } + + switch { + case isLetter(ch): + lit := s.scanIdentifier() + if lit == "true" || lit == "false" { + tok = token.BOOL + } else if lit == "null" { + tok = token.NULL + } else { + s.err("illegal char") + } + case isDecimal(ch): + tok = s.scanNumber(ch) + default: + switch ch { + case eof: + tok = token.EOF + case '"': + tok = token.STRING + s.scanString() + case '.': + tok = token.PERIOD + ch = s.peek() + if isDecimal(ch) { + tok = token.FLOAT + ch = s.scanMantissa(ch) + ch = s.scanExponent(ch) + } + case '[': + tok = token.LBRACK + case ']': + tok = token.RBRACK + case '{': + tok = token.LBRACE + case '}': + tok = token.RBRACE + case ',': + tok = token.COMMA + case ':': + tok = token.COLON + case '-': + if isDecimal(s.peek()) { + ch := s.next() + tok = s.scanNumber(ch) + } else { + s.err("illegal char") + } + default: + s.err("illegal char: " + string(ch)) + } + } + + // finish token ending + s.tokEnd = s.srcPos.Offset + + // create token literal + var tokenText string + if s.tokStart >= 0 { + tokenText = string(s.src[s.tokStart:s.tokEnd]) + } + s.tokStart = s.tokEnd // ensure idempotency of tokenText() call + + return token.Token{ + Type: tok, + Pos: s.tokPos, + Text: tokenText, + } +} + +// scanNumber scans a HCL number definition starting with the given rune +func (s *Scanner) scanNumber(ch rune) token.Type { + zero := ch == '0' + pos := s.srcPos + + s.scanMantissa(ch) + ch = s.next() // seek forward + if ch == 'e' || ch == 'E' { + ch = s.scanExponent(ch) + return token.FLOAT + } + + if ch == '.' { + ch = s.scanFraction(ch) + if ch == 'e' || ch == 'E' { + ch = s.next() + ch = s.scanExponent(ch) + } + return token.FLOAT + } + + if ch != eof { + s.unread() + } + + // If we have a larger number and this is zero, error + if zero && pos != s.srcPos { + s.err("numbers cannot start with 0") + } + + return token.NUMBER +} + +// scanMantissa scans the mantissa beginning from the rune. It returns the next +// non decimal rune. It's used to determine wheter it's a fraction or exponent. +func (s *Scanner) scanMantissa(ch rune) rune { + scanned := false + for isDecimal(ch) { + ch = s.next() + scanned = true + } + + if scanned && ch != eof { + s.unread() + } + return ch +} + +// scanFraction scans the fraction after the '.' rune +func (s *Scanner) scanFraction(ch rune) rune { + if ch == '.' { + ch = s.peek() // we peek just to see if we can move forward + ch = s.scanMantissa(ch) + } + return ch +} + +// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' +// rune. +func (s *Scanner) scanExponent(ch rune) rune { + if ch == 'e' || ch == 'E' { + ch = s.next() + if ch == '-' || ch == '+' { + ch = s.next() + } + ch = s.scanMantissa(ch) + } + return ch +} + +// scanString scans a quoted string +func (s *Scanner) scanString() { + braces := 0 + for { + // '"' opening already consumed + // read character after quote + ch := s.next() + + if ch == '\n' || ch < 0 || ch == eof { + s.err("literal not terminated") + return + } + + if ch == '"' { + break + } + + // If we're going into a ${} then we can ignore quotes for awhile + if braces == 0 && ch == '$' && s.peek() == '{' { + braces++ + s.next() + } else if braces > 0 && ch == '{' { + braces++ + } + if braces > 0 && ch == '}' { + braces-- + } + + if ch == '\\' { + s.scanEscape() + } + } + + return +} + +// scanEscape scans an escape sequence +func (s *Scanner) scanEscape() rune { + // http://en.cppreference.com/w/cpp/language/escape + ch := s.next() // read character after '/' + switch ch { + case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': + // nothing to do + case '0', '1', '2', '3', '4', '5', '6', '7': + // octal notation + ch = s.scanDigits(ch, 8, 3) + case 'x': + // hexademical notation + ch = s.scanDigits(s.next(), 16, 2) + case 'u': + // universal character name + ch = s.scanDigits(s.next(), 16, 4) + case 'U': + // universal character name + ch = s.scanDigits(s.next(), 16, 8) + default: + s.err("illegal char escape") + } + return ch +} + +// scanDigits scans a rune with the given base for n times. For example an +// octal notation \184 would yield in scanDigits(ch, 8, 3) +func (s *Scanner) scanDigits(ch rune, base, n int) rune { + for n > 0 && digitVal(ch) < base { + ch = s.next() + n-- + } + if n > 0 { + s.err("illegal char escape") + } + + // we scanned all digits, put the last non digit char back + s.unread() + return ch +} + +// scanIdentifier scans an identifier and returns the literal string +func (s *Scanner) scanIdentifier() string { + offs := s.srcPos.Offset - s.lastCharLen + ch := s.next() + for isLetter(ch) || isDigit(ch) || ch == '-' { + ch = s.next() + } + + if ch != eof { + s.unread() // we got identifier, put back latest char + } + + return string(s.src[offs:s.srcPos.Offset]) +} + +// recentPosition returns the position of the character immediately after the +// character or token returned by the last call to Scan. +func (s *Scanner) recentPosition() (pos token.Pos) { + pos.Offset = s.srcPos.Offset - s.lastCharLen + switch { + case s.srcPos.Column > 0: + // common case: last character was not a '\n' + pos.Line = s.srcPos.Line + pos.Column = s.srcPos.Column + case s.lastLineLen > 0: + // last character was a '\n' + // (we cannot be at the beginning of the source + // since we have called next() at least once) + pos.Line = s.srcPos.Line - 1 + pos.Column = s.lastLineLen + default: + // at the beginning of the source + pos.Line = 1 + pos.Column = 1 + } + return +} + +// err prints the error of any scanning to s.Error function. If the function is +// not defined, by default it prints them to os.Stderr +func (s *Scanner) err(msg string) { + s.ErrorCount++ + pos := s.recentPosition() + + if s.Error != nil { + s.Error(pos, msg) + return + } + + fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) +} + +// isHexadecimal returns true if the given rune is a letter +func isLetter(ch rune) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) +} + +// isHexadecimal returns true if the given rune is a decimal digit +func isDigit(ch rune) bool { + return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) +} + +// isHexadecimal returns true if the given rune is a decimal number +func isDecimal(ch rune) bool { + return '0' <= ch && ch <= '9' +} + +// isHexadecimal returns true if the given rune is an hexadecimal number +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + +// isWhitespace returns true if the rune is a space, tab, newline or carriage return +func isWhitespace(ch rune) bool { + return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' +} + +// digitVal returns the integer value of a given octal,decimal or hexadecimal rune +func digitVal(ch rune) int { + switch { + case '0' <= ch && ch <= '9': + return int(ch - '0') + case 'a' <= ch && ch <= 'f': + return int(ch - 'a' + 10) + case 'A' <= ch && ch <= 'F': + return int(ch - 'A' + 10) + } + return 16 // larger than any legal digit val +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go new file mode 100755 index 0000000..59c1bb7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/position.go @@ -0,0 +1,46 @@ +package token + +import "fmt" + +// Pos describes an arbitrary source position +// including the file, line, and column location. +// A Position is valid if the line number is > 0. +type Pos struct { + Filename string // filename, if any + Offset int // offset, starting at 0 + Line int // line number, starting at 1 + Column int // column number, starting at 1 (character count) +} + +// IsValid returns true if the position is valid. +func (p *Pos) IsValid() bool { return p.Line > 0 } + +// String returns a string in one of several forms: +// +// file:line:column valid position with file name +// line:column valid position without file name +// file invalid position with file name +// - invalid position without file name +func (p Pos) String() string { + s := p.Filename + if p.IsValid() { + if s != "" { + s += ":" + } + s += fmt.Sprintf("%d:%d", p.Line, p.Column) + } + if s == "" { + s = "-" + } + return s +} + +// Before reports whether the position p is before u. +func (p Pos) Before(u Pos) bool { + return u.Offset > p.Offset || u.Line > p.Line +} + +// After reports whether the position p is after u. +func (p Pos) After(u Pos) bool { + return u.Offset < p.Offset || u.Line < p.Line +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go new file mode 100755 index 0000000..95a0c3e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/json/token/token.go @@ -0,0 +1,118 @@ +package token + +import ( + "fmt" + "strconv" + + hcltoken "github.com/hashicorp/hcl/hcl/token" +) + +// Token defines a single HCL token which can be obtained via the Scanner +type Token struct { + Type Type + Pos Pos + Text string +} + +// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) +type Type int + +const ( + // Special tokens + ILLEGAL Type = iota + EOF + + identifier_beg + literal_beg + NUMBER // 12345 + FLOAT // 123.45 + BOOL // true,false + STRING // "abc" + NULL // null + literal_end + identifier_end + + operator_beg + LBRACK // [ + LBRACE // { + COMMA // , + PERIOD // . + COLON // : + + RBRACK // ] + RBRACE // } + + operator_end +) + +var tokens = [...]string{ + ILLEGAL: "ILLEGAL", + + EOF: "EOF", + + NUMBER: "NUMBER", + FLOAT: "FLOAT", + BOOL: "BOOL", + STRING: "STRING", + NULL: "NULL", + + LBRACK: "LBRACK", + LBRACE: "LBRACE", + COMMA: "COMMA", + PERIOD: "PERIOD", + COLON: "COLON", + + RBRACK: "RBRACK", + RBRACE: "RBRACE", +} + +// String returns the string corresponding to the token tok. +func (t Type) String() string { + s := "" + if 0 <= t && t < Type(len(tokens)) { + s = tokens[t] + } + if s == "" { + s = "token(" + strconv.Itoa(int(t)) + ")" + } + return s +} + +// IsIdentifier returns true for tokens corresponding to identifiers and basic +// type literals; it returns false otherwise. +func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } + +// IsLiteral returns true for tokens corresponding to basic type literals; it +// returns false otherwise. +func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } + +// IsOperator returns true for tokens corresponding to operators and +// delimiters; it returns false otherwise. +func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } + +// String returns the token's literal text. Note that this is only +// applicable for certain token types, such as token.IDENT, +// token.STRING, etc.. +func (t Token) String() string { + return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) +} + +// HCLToken converts this token to an HCL token. +// +// The token type must be a literal type or this will panic. +func (t Token) HCLToken() hcltoken.Token { + switch t.Type { + case BOOL: + return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} + case FLOAT: + return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} + case NULL: + return hcltoken.Token{Type: hcltoken.STRING, Text: ""} + case NUMBER: + return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} + case STRING: + return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} + default: + panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/lex.go new file mode 100755 index 0000000..d9993c2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/lex.go @@ -0,0 +1,38 @@ +package hcl + +import ( + "unicode" + "unicode/utf8" +) + +type lexModeValue byte + +const ( + lexModeUnknown lexModeValue = iota + lexModeHcl + lexModeJson +) + +// lexMode returns whether we're going to be parsing in JSON +// mode or HCL mode. +func lexMode(v []byte) lexModeValue { + var ( + r rune + w int + offset int + ) + + for { + r, w = utf8.DecodeRune(v[offset:]) + offset += w + if unicode.IsSpace(r) { + continue + } + if r == '{' { + return lexModeJson + } + break + } + + return lexModeHcl +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/parse.go new file mode 100755 index 0000000..1fca53c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/hashicorp/hcl/parse.go @@ -0,0 +1,39 @@ +package hcl + +import ( + "fmt" + + "github.com/hashicorp/hcl/hcl/ast" + hclParser "github.com/hashicorp/hcl/hcl/parser" + jsonParser "github.com/hashicorp/hcl/json/parser" +) + +// ParseBytes accepts as input byte slice and returns ast tree. +// +// Input can be either JSON or HCL +func ParseBytes(in []byte) (*ast.File, error) { + return parse(in) +} + +// ParseString accepts input as a string and returns ast tree. +func ParseString(input string) (*ast.File, error) { + return parse([]byte(input)) +} + +func parse(in []byte) (*ast.File, error) { + switch lexMode(in) { + case lexModeHcl: + return hclParser.Parse(in) + case lexModeJson: + return jsonParser.Parse(in) + } + + return nil, fmt.Errorf("unknown config format") +} + +// Parse parses the given input and returns the root object. +// +// The input format can be either HCL or JSON. +func Parse(input string) (*ast.File, error) { + return parse([]byte(input)) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.gitignore new file mode 100755 index 0000000..e7081ff --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.gitignore @@ -0,0 +1,6 @@ +*.sublime-project +*.sublime-workspace +*.un~ +*.swp +.idea/ +*.iml diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.travis.yml new file mode 100755 index 0000000..3e7c3d2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.4.x + - 1.5.x + - 1.6.x + - 1.7.x + - 1.8.x + - 1.9.x + - "1.10.x" + - tip diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md new file mode 100755 index 0000000..f83adc2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/CHANGELOG.md @@ -0,0 +1,131 @@ +## Changelog + +### [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 + + This adds the option to disable property expansion during loading. + + Thanks to [@kmala](https://github.com/kmala) for the patch. + +### [1.7.6](https://github.com/magiconair/properties/tree/v1.7.6) - 14 Feb 2018 + + * [PR #29](https://github.com/magiconair/properties/pull/29): Reworked expansion logic to handle more complex cases. + + See PR for an example. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.5](https://github.com/magiconair/properties/tree/v1.7.5) - 13 Feb 2018 + + * [PR #28](https://github.com/magiconair/properties/pull/28): Support duplicate expansions in the same value + + Values which expand the same key multiple times (e.g. `key=${a} ${a}`) will no longer fail + with a `circular reference error`. + + Thanks to [@yobert](https://github.com/yobert) for the fix. + +### [1.7.4](https://github.com/magiconair/properties/tree/v1.7.4) - 31 Oct 2017 + + * [Issue #23](https://github.com/magiconair/properties/issues/23): Ignore blank lines with whitespaces + + * [PR #24](https://github.com/magiconair/properties/pull/24): Update keys when DisableExpansion is enabled + + Thanks to [@mgurov](https://github.com/mgurov) for the fix. + +### [1.7.3](https://github.com/magiconair/properties/tree/v1.7.3) - 10 Jul 2017 + + * [Issue #17](https://github.com/magiconair/properties/issues/17): Add [SetValue()](http://godoc.org/github.com/magiconair/properties#Properties.SetValue) method to set values generically + * [Issue #22](https://github.com/magiconair/properties/issues/22): Add [LoadMap()](http://godoc.org/github.com/magiconair/properties#LoadMap) function to load properties from a string map + +### [1.7.2](https://github.com/magiconair/properties/tree/v1.7.2) - 20 Mar 2017 + + * [Issue #15](https://github.com/magiconair/properties/issues/15): Drop gocheck dependency + * [PR #21](https://github.com/magiconair/properties/pull/21): Add [Map()](http://godoc.org/github.com/magiconair/properties#Properties.Map) and [FilterFunc()](http://godoc.org/github.com/magiconair/properties#Properties.FilterFunc) + +### [1.7.1](https://github.com/magiconair/properties/tree/v1.7.1) - 13 Jan 2017 + + * [Issue #14](https://github.com/magiconair/properties/issues/14): Decouple TestLoadExpandedFile from `$USER` + * [PR #12](https://github.com/magiconair/properties/pull/12): Load from files and URLs + * [PR #16](https://github.com/magiconair/properties/pull/16): Keep gofmt happy + * [PR #18](https://github.com/magiconair/properties/pull/18): Fix Delete() function + +### [1.7.0](https://github.com/magiconair/properties/tree/v1.7.0) - 20 Mar 2016 + + * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#LoadURL) method to load properties from a URL. + * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#LoadString) method to load properties from an UTF8 string. + * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe) + +### [1.6.0](https://github.com/magiconair/properties/tree/v1.6.0) - 11 Dec 2015 + + * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags. + +### [1.5.6](https://github.com/magiconair/properties/tree/v1.5.6) - 18 Oct 2015 + + * Vendored in gopkg.in/check.v1 + +### [1.5.5](https://github.com/magiconair/properties/tree/v1.5.5) - 31 Jul 2015 + + * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs) + +### [1.5.4](https://github.com/magiconair/properties/tree/v1.5.4) - 23 Jun 2015 + + * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references. + +### [1.5.3](https://github.com/magiconair/properties/tree/v1.5.3) - 02 Jun 2015 + + * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) + +### [1.5.2](https://github.com/magiconair/properties/tree/v1.5.2) - 10 Apr 2015 + + * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty + * Add clickable links to README + +### [1.5.1](https://github.com/magiconair/properties/tree/v1.5.1) - 08 Dec 2014 + + * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with + [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration). + +### [1.5.0](https://github.com/magiconair/properties/tree/v1.5.0) - 18 Nov 2014 + + * Added support for single and multi-line comments (reading, writing and updating) + * The order of keys is now preserved + * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry + * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method + * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1) + +### [1.4.2](https://github.com/magiconair/properties/tree/v1.4.2) - 15 Nov 2014 + + * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one + +### [1.4.1](https://github.com/magiconair/properties/tree/v1.4.1) - 13 Nov 2014 + + * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string + +### [1.4.0](https://github.com/magiconair/properties/tree/v1.4.0) - 23 Sep 2014 + + * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys + * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties + +### [1.3.0](https://github.com/magiconair/properties/tree/v1.3.0) - 18 Mar 2014 + +* Added support for time.Duration +* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tree/vior configurable (log.Fatal, panic) - custom) +* Changed default of MustXXX() failure from panic to log.Fatal + +### [1.2.0](https://github.com/magiconair/properties/tree/v1.2.0) - 05 Mar 2014 + +* Added MustGet... functions +* Added support for int and uint with range checks on 32 bit platforms + +### [1.1.0](https://github.com/magiconair/properties/tree/v1.1.0) - 20 Jan 2014 + +* Renamed from goproperties to properties +* Added support for expansion of environment vars in + filenames and value expressions +* Fixed bug where value expressions were not at the + start of the string + +### [1.0.0](https://github.com/magiconair/properties/tree/v1.0.0) - 7 Jan 2014 + +* Initial release diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/LICENSE new file mode 100755 index 0000000..b387087 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/LICENSE @@ -0,0 +1,25 @@ +goproperties - properties file decoder for Go + +Copyright (c) 2013-2018 - Frank Schroeder + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY 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/skycoin/skycoin/vendor/github.com/magiconair/properties/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/README.md new file mode 100755 index 0000000..2c05f29 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/README.md @@ -0,0 +1,129 @@ +[![](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") +[![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) + +# Overview + +#### Please run `git pull --tags` to update the tags. See [below](#updated-git-tags) why. + +properties is a Go library for reading and writing properties files. + +It supports reading from multiple files or URLs and Spring style recursive +property expansion of expressions like `${key}` to their corresponding value. +Value expressions can refer to other keys like in `${key}` or to environment +variables like in `${USER}`. Filenames can also contain environment variables +like in `/home/${USER}/myapp.properties`. + +Properties can be decoded into structs, maps, arrays and values through +struct tags. + +Comments and the order of keys are preserved. Comments can be modified +and can be written to the output. + +The properties library supports both ISO-8859-1 and UTF-8 encoded data. + +Starting from version 1.3.0 the behavior of the MustXXX() functions is +configurable by providing a custom `ErrorHandler` function. The default has +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) + +## Getting Started + +```go +import ( + "flag" + "github.com/magiconair/properties" +) + +func main() { + // init from a file + p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8) + + // or multiple files + p = properties.MustLoadFiles([]string{ + "${HOME}/config.properties", + "${HOME}/config-${USER}.properties", + }, properties.UTF8, true) + + // or from a map + p = properties.LoadMap(map[string]string{"key": "value", "abc": "def"}) + + // or from a string + p = properties.MustLoadString("key=value\nabc=def") + + // or from a URL + p = properties.MustLoadURL("http://host/path") + + // or from multiple URLs + p = properties.MustLoadURL([]string{ + "http://host/config", + "http://host/config-${USER}", + }, true) + + // or from flags + p.MustFlag(flag.CommandLine) + + // get values through getters + host := p.MustGetString("host") + port := p.GetInt("port", 8080) + + // or through Decode + type Config struct { + Host string `properties:"host"` + Port int `properties:"port,default=9000"` + Accept []string `properties:"accept,default=image/png;image;gif"` + Timeout time.Duration `properties:"timeout,default=5s"` + } + var cfg Config + if err := p.Decode(&cfg); err != nil { + log.Fatal(err) + } +} + +``` + +## Installation and Upgrade + +``` +$ go get -u github.com/magiconair/properties +``` + +## License + +2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details. + +## ToDo + +* Dump contents with passwords and secrets obscured + +## Updated Git tags + +#### 13 Feb 2018 + +I realized that all of the git tags I had pushed before v1.7.5 were lightweight tags +and I've only recently learned that this doesn't play well with `git describe` 😞 + +I have replaced all lightweight tags with signed tags using this script which should +retain the commit date, name and email address. Please run `git pull --tags` to update them. + +Worst case you have to reclone the repo. + +```shell +#!/bin/bash +tag=$1 +echo "Updating $tag" +date=$(git show ${tag}^0 --format=%aD | head -1) +email=$(git show ${tag}^0 --format=%aE | head -1) +name=$(git show ${tag}^0 --format=%aN | head -1) +GIT_COMMITTER_DATE="$date" GIT_COMMITTER_NAME="$name" GIT_COMMITTER_EMAIL="$email" git tag -s -f ${tag} ${tag}^0 -m ${tag} +``` + +I apologize for the inconvenience. + +Frank + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/decode.go new file mode 100755 index 0000000..3ebf804 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/decode.go @@ -0,0 +1,289 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "reflect" + "strconv" + "strings" + "time" +) + +// Decode assigns property values to exported fields of a struct. +// +// Decode traverses v recursively and returns an error if a value cannot be +// converted to the field type or a required value is missing for a field. +// +// The following type dependent decodings are used: +// +// String, boolean, numeric fields have the value of the property key assigned. +// The property key name is the name of the field. A different key and a default +// value can be set in the field's tag. Fields without default value are +// required. If the value cannot be converted to the field type an error is +// returned. +// +// time.Duration fields have the result of time.ParseDuration() assigned. +// +// time.Time fields have the vaule of time.Parse() assigned. The default layout +// is time.RFC3339 but can be set in the field's tag. +// +// Arrays and slices of string, boolean, numeric, time.Duration and time.Time +// fields have the value interpreted as a comma separated list of values. The +// individual values are trimmed of whitespace and empty values are ignored. A +// default value can be provided as a semicolon separated list in the field's +// tag. +// +// Struct fields are decoded recursively using the field name plus "." as +// prefix. The prefix (without dot) can be overridden in the field's tag. +// Default values are not supported in the field's tag. Specify them on the +// fields of the inner struct instead. +// +// Map fields must have a key of type string and are decoded recursively by +// using the field's name plus ".' as prefix and the next element of the key +// name as map key. The prefix (without dot) can be overridden in the field's +// tag. Default values are not supported. +// +// Examples: +// +// // Field is ignored. +// Field int `properties:"-"` +// +// // Field is assigned value of 'Field'. +// Field int +// +// // Field is assigned value of 'myName'. +// Field int `properties:"myName"` +// +// // Field is assigned value of key 'myName' and has a default +// // value 15 if the key does not exist. +// Field int `properties:"myName,default=15"` +// +// // Field is assigned value of key 'Field' and has a default +// // value 15 if the key does not exist. +// Field int `properties:",default=15"` +// +// // Field is assigned value of key 'date' and the date +// // is in format 2006-01-02 +// Field time.Time `properties:"date,layout=2006-01-02"` +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas. +// Field []string +// +// // Field is assigned the non-empty and whitespace trimmed +// // values of key 'Field' split by commas and has a default +// // value ["a", "b", "c"] if the key does not exist. +// Field []string `properties:",default=a;b;c"` +// +// // Field is decoded recursively with "Field." as key prefix. +// Field SomeStruct +// +// // Field is decoded recursively with "myName." as key prefix. +// Field SomeStruct `properties:"myName"` +// +// // Field is decoded recursively with "Field." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string +// +// // Field is decoded recursively with "myName." as key prefix +// // and the next dotted element of the key as map key. +// Field map[string]string `properties:"myName"` +func (p *Properties) Decode(x interface{}) error { + t, v := reflect.TypeOf(x), reflect.ValueOf(x) + if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct { + return fmt.Errorf("not a pointer to struct: %s", t) + } + if err := dec(p, "", nil, nil, v); err != nil { + return err + } + return nil +} + +func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error { + t := v.Type() + + // value returns the property value for key or the default if provided. + value := func() (string, error) { + if val, ok := p.Get(key); ok { + return val, nil + } + if def != nil { + return *def, nil + } + return "", fmt.Errorf("missing required key %s", key) + } + + // conv converts a string to a value of the given type. + conv := func(s string, t reflect.Type) (val reflect.Value, err error) { + var v interface{} + + switch { + case isDuration(t): + v, err = time.ParseDuration(s) + + case isTime(t): + layout := opts["layout"] + if layout == "" { + layout = time.RFC3339 + } + v, err = time.Parse(layout, s) + + case isBool(t): + v, err = boolVal(s), nil + + case isString(t): + v, err = s, nil + + case isFloat(t): + v, err = strconv.ParseFloat(s, 64) + + case isInt(t): + v, err = strconv.ParseInt(s, 10, 64) + + case isUint(t): + v, err = strconv.ParseUint(s, 10, 64) + + default: + return reflect.Zero(t), fmt.Errorf("unsupported type %s", t) + } + if err != nil { + return reflect.Zero(t), err + } + return reflect.ValueOf(v).Convert(t), nil + } + + // keydef returns the property key and the default value based on the + // name of the struct field and the options in the tag. + keydef := func(f reflect.StructField) (string, *string, map[string]string) { + _key, _opts := parseTag(f.Tag.Get("properties")) + + var _def *string + if d, ok := _opts["default"]; ok { + _def = &d + } + if _key != "" { + return _key, _def, _opts + } + return f.Name, _def, _opts + } + + switch { + case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t): + s, err := value() + if err != nil { + return err + } + val, err := conv(s, t) + if err != nil { + return err + } + v.Set(val) + + case isPtr(t): + return dec(p, key, def, opts, v.Elem()) + + case isStruct(t): + for i := 0; i < v.NumField(); i++ { + fv := v.Field(i) + fk, def, opts := keydef(t.Field(i)) + if !fv.CanSet() { + return fmt.Errorf("cannot set %s", t.Field(i).Name) + } + if fk == "-" { + continue + } + if key != "" { + fk = key + "." + fk + } + if err := dec(p, fk, def, opts, fv); err != nil { + return err + } + } + return nil + + case isArray(t): + val, err := value() + if err != nil { + return err + } + vals := split(val, ";") + a := reflect.MakeSlice(t, 0, len(vals)) + for _, s := range vals { + val, err := conv(s, t.Elem()) + if err != nil { + return err + } + a = reflect.Append(a, val) + } + v.Set(a) + + case isMap(t): + valT := t.Elem() + m := reflect.MakeMap(t) + for postfix := range p.FilterStripPrefix(key + ".").m { + pp := strings.SplitN(postfix, ".", 2) + mk, mv := pp[0], reflect.New(valT) + if err := dec(p, key+"."+mk, nil, nil, mv); err != nil { + return err + } + m.SetMapIndex(reflect.ValueOf(mk), mv.Elem()) + } + v.Set(m) + + default: + return fmt.Errorf("unsupported type %s", t) + } + return nil +} + +// split splits a string on sep, trims whitespace of elements +// and omits empty elements +func split(s string, sep string) []string { + var a []string + for _, v := range strings.Split(s, sep) { + if v = strings.TrimSpace(v); v != "" { + a = append(a, v) + } + } + return a +} + +// parseTag parses a "key,k=v,k=v,..." +func parseTag(tag string) (key string, opts map[string]string) { + opts = map[string]string{} + for i, s := range strings.Split(tag, ",") { + if i == 0 { + key = s + continue + } + + pp := strings.SplitN(s, "=", 2) + if len(pp) == 1 { + opts[pp[0]] = "" + } else { + opts[pp[0]] = pp[1] + } + } + return key, opts +} + +func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice } +func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool } +func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) } +func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map } +func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr } +func isString(t reflect.Type) bool { return t.Kind() == reflect.String } +func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct } +func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) } +func isFloat(t reflect.Type) bool { + return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64 +} +func isInt(t reflect.Type) bool { + return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64 +} +func isUint(t reflect.Type) bool { + return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/doc.go new file mode 100755 index 0000000..f8822da --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/doc.go @@ -0,0 +1,156 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package properties provides functions for reading and writing +// ISO-8859-1 and UTF-8 encoded .properties files and has +// support for recursive property expansion. +// +// Java properties files are ISO-8859-1 encoded and use Unicode +// literals for characters outside the ISO character set. Unicode +// literals can be used in UTF-8 encoded properties files but +// aren't necessary. +// +// To load a single properties file use MustLoadFile(): +// +// p := properties.MustLoadFile(filename, properties.UTF8) +// +// To load multiple properties files use MustLoadFiles() +// which loads the files in the given order and merges the +// result. Missing properties files can be ignored if the +// 'ignoreMissing' flag is set to true. +// +// Filenames can contain environment variables which are expanded +// before loading. +// +// f1 := "/etc/myapp/myapp.conf" +// f2 := "/home/${USER}/myapp.conf" +// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true) +// +// All of the different key/value delimiters ' ', ':' and '=' are +// supported as well as the comment characters '!' and '#' and +// multi-line values. +// +// ! this is a comment +// # and so is this +// +// # the following expressions are equal +// key value +// key=value +// key:value +// key = value +// key : value +// key = val\ +// ue +// +// Properties stores all comments preceding a key and provides +// GetComments() and SetComments() methods to retrieve and +// update them. The convenience functions GetComment() and +// SetComment() allow access to the last comment. The +// WriteComment() method writes properties files including +// the comments and with the keys in the original order. +// This can be used for sanitizing properties files. +// +// Property expansion is recursive and circular references +// and malformed expressions are not allowed and cause an +// error. Expansion of environment variables is supported. +// +// # standard property +// key = value +// +// # property expansion: key2 = value +// key2 = ${key} +// +// # recursive expansion: key3 = value +// key3 = ${key2} +// +// # circular reference (error) +// key = ${key} +// +// # malformed expression (error) +// key = ${ke +// +// # refers to the users' home dir +// home = ${HOME} +// +// # local key takes precedence over env var: u = foo +// USER = foo +// u = ${USER} +// +// The default property expansion format is ${key} but can be +// changed by setting different pre- and postfix values on the +// Properties object. +// +// p := properties.NewProperties() +// p.Prefix = "#[" +// p.Postfix = "]#" +// +// Properties provides convenience functions for getting typed +// values with default values if the key does not exist or the +// type conversion failed. +// +// # Returns true if the value is either "1", "on", "yes" or "true" +// # Returns false for every other value and the default value if +// # the key does not exist. +// v = p.GetBool("key", false) +// +// # Returns the value if the key exists and the format conversion +// # was successful. Otherwise, the default value is returned. +// v = p.GetInt64("key", 999) +// v = p.GetUint64("key", 999) +// v = p.GetFloat64("key", 123.0) +// v = p.GetString("key", "def") +// v = p.GetDuration("key", 999) +// +// As an alternative properties may be applied with the standard +// library's flag implementation at any time. +// +// # Standard configuration +// v = flag.Int("key", 999, "help message") +// flag.Parse() +// +// # Merge p into the flag set +// p.MustFlag(flag.CommandLine) +// +// Properties provides several MustXXX() convenience functions +// which will terminate the app if an error occurs. The behavior +// of the failure is configurable and the default is to call +// log.Fatal(err). To have the MustXXX() functions panic instead +// of logging the error set a different ErrorHandler before +// you use the Properties package. +// +// properties.ErrorHandler = properties.PanicHandler +// +// # Will panic instead of logging an error +// p := properties.MustLoadFile("config.properties") +// +// You can also provide your own ErrorHandler function. The only requirement +// is that the error handler function must exit after handling the error. +// +// properties.ErrorHandler = func(err error) { +// fmt.Println(err) +// os.Exit(1) +// } +// +// # Will write to stdout and then exit +// p := properties.MustLoadFile("config.properties") +// +// Properties can also be loaded into a struct via the `Decode` +// method, e.g. +// +// type S struct { +// A string `properties:"a,default=foo"` +// D time.Duration `properties:"timeout,default=5s"` +// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"` +// } +// +// See `Decode()` method for the full documentation. +// +// The following documents provide a description of the properties +// file format. +// +// http://en.wikipedia.org/wiki/.properties +// +// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29 +// +package properties diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/integrate.go new file mode 100755 index 0000000..74d38dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/integrate.go @@ -0,0 +1,34 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import "flag" + +// MustFlag sets flags that are skipped by dst.Parse when p contains +// the respective key for flag.Flag.Name. +// +// It's use is recommended with command line arguments as in: +// flag.Parse() +// p.MustFlag(flag.CommandLine) +func (p *Properties) MustFlag(dst *flag.FlagSet) { + m := make(map[string]*flag.Flag) + dst.VisitAll(func(f *flag.Flag) { + m[f.Name] = f + }) + dst.Visit(func(f *flag.Flag) { + delete(m, f.Name) // overridden + }) + + for name, f := range m { + v, ok := p.Get(name) + if !ok { + continue + } + + if err := f.Value.Set(v); err != nil { + ErrorHandler(err) + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/lex.go new file mode 100755 index 0000000..367166d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/lex.go @@ -0,0 +1,407 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// Parts of the lexer are from the template/text/parser package +// For these parts the following applies: +// +// 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 of the go 1.2 +// distribution. + +package properties + +import ( + "fmt" + "strconv" + "strings" + "unicode/utf8" +) + +// item represents a token or text string returned from the scanner. +type item struct { + typ itemType // The type of this item. + pos int // The starting position, in bytes, of this item in the input string. + val string // The value of this item. +} + +func (i item) String() string { + switch { + case i.typ == itemEOF: + return "EOF" + case i.typ == itemError: + return i.val + case len(i.val) > 10: + return fmt.Sprintf("%.10q...", i.val) + } + return fmt.Sprintf("%q", i.val) +} + +// itemType identifies the type of lex items. +type itemType int + +const ( + itemError itemType = iota // error occurred; value is text of error + itemEOF + itemKey // a key + itemValue // a value + itemComment // a comment +) + +// defines a constant for EOF +const eof = -1 + +// permitted whitespace characters space, FF and TAB +const whitespace = " \f\t" + +// stateFn represents the state of the scanner as a function that returns the next state. +type stateFn func(*lexer) stateFn + +// lexer holds the state of the scanner. +type lexer struct { + input string // the string being scanned + state stateFn // the next lexing function to enter + pos int // current position in the input + start int // start position of this item + width int // width of last rune read from input + lastPos int // position of most recent item returned by nextItem + runes []rune // scanned runes for this item + items chan item // channel of scanned items +} + +// next returns the next rune in the input. +func (l *lexer) next() rune { + if l.pos >= len(l.input) { + l.width = 0 + return eof + } + r, w := utf8.DecodeRuneInString(l.input[l.pos:]) + l.width = w + l.pos += l.width + return r +} + +// peek returns but does not consume the next rune in the input. +func (l *lexer) peek() rune { + r := l.next() + l.backup() + return r +} + +// backup steps back one rune. Can only be called once per call of next. +func (l *lexer) backup() { + l.pos -= l.width +} + +// emit passes an item back to the client. +func (l *lexer) emit(t itemType) { + i := item{t, l.start, string(l.runes)} + l.items <- i + l.start = l.pos + l.runes = l.runes[:0] +} + +// ignore skips over the pending input before this point. +func (l *lexer) ignore() { + l.start = l.pos +} + +// appends the rune to the current value +func (l *lexer) appendRune(r rune) { + l.runes = append(l.runes, r) +} + +// accept consumes the next rune if it's from the valid set. +func (l *lexer) accept(valid string) bool { + if strings.ContainsRune(valid, l.next()) { + return true + } + l.backup() + return false +} + +// acceptRun consumes a run of runes from the valid set. +func (l *lexer) acceptRun(valid string) { + for strings.ContainsRune(valid, l.next()) { + } + l.backup() +} + +// acceptRunUntil consumes a run of runes up to a terminator. +func (l *lexer) acceptRunUntil(term rune) { + for term != l.next() { + } + l.backup() +} + +// hasText returns true if the current parsed text is not empty. +func (l *lexer) isNotEmpty() bool { + return l.pos > l.start +} + +// lineNumber reports which line we're on, based on the position of +// the previous item returned by nextItem. Doing it this way +// means we don't have to worry about peek double counting. +func (l *lexer) lineNumber() int { + return 1 + strings.Count(l.input[:l.lastPos], "\n") +} + +// errorf returns an error token and terminates the scan by passing +// back a nil pointer that will be the next state, terminating l.nextItem. +func (l *lexer) errorf(format string, args ...interface{}) stateFn { + l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)} + return nil +} + +// nextItem returns the next item from the input. +func (l *lexer) nextItem() item { + i := <-l.items + l.lastPos = i.pos + return i +} + +// lex creates a new scanner for the input string. +func lex(input string) *lexer { + l := &lexer{ + input: input, + items: make(chan item), + runes: make([]rune, 0, 32), + } + go l.run() + return l +} + +// run runs the state machine for the lexer. +func (l *lexer) run() { + for l.state = lexBeforeKey(l); l.state != nil; { + l.state = l.state(l) + } +} + +// state functions + +// lexBeforeKey scans until a key begins. +func lexBeforeKey(l *lexer) stateFn { + switch r := l.next(); { + case isEOF(r): + l.emit(itemEOF) + return nil + + case isEOL(r): + l.ignore() + return lexBeforeKey + + case isComment(r): + return lexComment + + case isWhitespace(r): + l.ignore() + return lexBeforeKey + + default: + l.backup() + return lexKey + } +} + +// lexComment scans a comment line. The comment character has already been scanned. +func lexComment(l *lexer) stateFn { + l.acceptRun(whitespace) + l.ignore() + for { + switch r := l.next(); { + case isEOF(r): + l.ignore() + l.emit(itemEOF) + return nil + case isEOL(r): + l.emit(itemComment) + return lexBeforeKey + default: + l.appendRune(r) + } + } +} + +// lexKey scans the key up to a delimiter +func lexKey(l *lexer) stateFn { + var r rune + +Loop: + for { + switch r = l.next(); { + + case isEscape(r): + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + + case isEndOfKey(r): + l.backup() + break Loop + + case isEOF(r): + break Loop + + default: + l.appendRune(r) + } + } + + if len(l.runes) > 0 { + l.emit(itemKey) + } + + if isEOF(r) { + l.emit(itemEOF) + return nil + } + + return lexBeforeValue +} + +// lexBeforeValue scans the delimiter between key and value. +// Leading and trailing whitespace is ignored. +// We expect to be just after the key. +func lexBeforeValue(l *lexer) stateFn { + l.acceptRun(whitespace) + l.accept(":=") + l.acceptRun(whitespace) + l.ignore() + return lexValue +} + +// lexValue scans text until the end of the line. We expect to be just after the delimiter. +func lexValue(l *lexer) stateFn { + for { + switch r := l.next(); { + case isEscape(r): + if isEOL(l.peek()) { + l.next() + l.acceptRun(whitespace) + } else { + err := l.scanEscapeSequence() + if err != nil { + return l.errorf(err.Error()) + } + } + + case isEOL(r): + l.emit(itemValue) + l.ignore() + return lexBeforeKey + + case isEOF(r): + l.emit(itemValue) + l.emit(itemEOF) + return nil + + default: + l.appendRune(r) + } + } +} + +// scanEscapeSequence scans either one of the escaped characters +// or a unicode literal. We expect to be after the escape character. +func (l *lexer) scanEscapeSequence() error { + switch r := l.next(); { + + case isEscapedCharacter(r): + l.appendRune(decodeEscapedCharacter(r)) + return nil + + case atUnicodeLiteral(r): + return l.scanUnicodeLiteral() + + case isEOF(r): + return fmt.Errorf("premature EOF") + + // silently drop the escape character and append the rune as is + default: + l.appendRune(r) + return nil + } +} + +// scans a unicode literal in the form \uXXXX. We expect to be after the \u. +func (l *lexer) scanUnicodeLiteral() error { + // scan the digits + d := make([]rune, 4) + for i := 0; i < 4; i++ { + d[i] = l.next() + if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) { + return fmt.Errorf("invalid unicode literal") + } + } + + // decode the digits into a rune + r, err := strconv.ParseInt(string(d), 16, 0) + if err != nil { + return err + } + + l.appendRune(rune(r)) + return nil +} + +// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character. +func decodeEscapedCharacter(r rune) rune { + switch r { + case 'f': + return '\f' + case 'n': + return '\n' + case 'r': + return '\r' + case 't': + return '\t' + default: + return r + } +} + +// atUnicodeLiteral reports whether we are at a unicode literal. +// The escape character has already been consumed. +func atUnicodeLiteral(r rune) bool { + return r == 'u' +} + +// isComment reports whether we are at the start of a comment. +func isComment(r rune) bool { + return r == '#' || r == '!' +} + +// isEndOfKey reports whether the rune terminates the current key. +func isEndOfKey(r rune) bool { + return strings.ContainsRune(" \f\t\r\n:=", r) +} + +// isEOF reports whether we are at EOF. +func isEOF(r rune) bool { + return r == eof +} + +// isEOL reports whether we are at a new line character. +func isEOL(r rune) bool { + return r == '\n' || r == '\r' +} + +// isEscape reports whether the rune is the escape character which +// prefixes unicode literals and other escaped characters. +func isEscape(r rune) bool { + return r == '\\' +} + +// isEscapedCharacter reports whether we are at one of the characters that need escaping. +// The escape character has already been consumed. +func isEscapedCharacter(r rune) bool { + return strings.ContainsRune(" :=fnrt", r) +} + +// isWhitespace reports whether the rune is a whitespace character. +func isWhitespace(r rune) bool { + return strings.ContainsRune(whitespace, r) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/load.go new file mode 100755 index 0000000..c8e1b58 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/load.go @@ -0,0 +1,292 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "strings" +) + +// Encoding specifies encoding of the input data. +type Encoding uint + +const ( + // utf8Default is a private placeholder for the zero value of Encoding to + // ensure that it has the correct meaning. UTF8 is the default encoding but + // was assigned a non-zero value which cannot be changed without breaking + // existing code. Clients should continue to use the public constants. + utf8Default Encoding = iota + + // UTF8 interprets the input data as UTF-8. + UTF8 + + // ISO_8859_1 interprets the input data as ISO-8859-1. + ISO_8859_1 +) + +type Loader struct { + // Encoding determines how the data from files and byte buffers + // is interpreted. For URLs the Content-Type header is used + // to determine the encoding of the data. + Encoding Encoding + + // DisableExpansion configures the property expansion of the + // returned property object. When set to true, the property values + // will not be expanded and the Property object will not be checked + // for invalid expansion expressions. + DisableExpansion bool + + // IgnoreMissing configures whether missing files or URLs which return + // 404 are reported as errors. When set to true, missing files and 404 + // status codes are not reported as errors. + IgnoreMissing bool +} + +// Load reads a buffer into a Properties struct. +func (l *Loader) LoadBytes(buf []byte) (*Properties, error) { + return l.loadBytes(buf, l.Encoding) +} + +// LoadAll reads the content of multiple URLs or files in the given order into +// a Properties struct. If IgnoreMissing is true then a 404 status code or +// missing file will not be reported as error. Encoding sets the encoding for +// files. For the URLs see LoadURL for the Content-Type header and the +// encoding. +func (l *Loader) LoadAll(names []string) (*Properties, error) { + all := NewProperties() + for _, name := range names { + n, err := expandName(name) + if err != nil { + return nil, err + } + + var p *Properties + switch { + case strings.HasPrefix(n, "http://"): + p, err = l.LoadURL(n) + case strings.HasPrefix(n, "https://"): + p, err = l.LoadURL(n) + default: + p, err = l.LoadFile(n) + } + if err != nil { + return nil, err + } + all.Merge(p) + } + + all.DisableExpansion = l.DisableExpansion + if all.DisableExpansion { + return all, nil + } + return all, all.check() +} + +// LoadFile reads a file into a Properties struct. +// If IgnoreMissing is true then a missing file will not be +// reported as error. +func (l *Loader) LoadFile(filename string) (*Properties, error) { + data, err := ioutil.ReadFile(filename) + if err != nil { + if l.IgnoreMissing && os.IsNotExist(err) { + LogPrintf("properties: %s not found. skipping", filename) + return NewProperties(), nil + } + return nil, err + } + return l.loadBytes(data, l.Encoding) +} + +// LoadURL reads the content of the URL into a Properties struct. +// +// The encoding is determined via the Content-Type header which +// should be set to 'text/plain'. If the 'charset' parameter is +// missing, 'iso-8859-1' or 'latin1' the encoding is set to +// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the +// encoding is set to UTF-8. A missing content type header is +// interpreted as 'text/plain; charset=utf-8'. +func (l *Loader) LoadURL(url string) (*Properties, error) { + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("properties: error fetching %q. %s", url, err) + } + + if resp.StatusCode == 404 && l.IgnoreMissing { + LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode) + return NewProperties(), nil + } + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode) + } + + body, err := ioutil.ReadAll(resp.Body) + 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 + switch strings.ToLower(ct) { + case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1": + enc = ISO_8859_1 + case "", "text/plain; charset=utf-8": + enc = UTF8 + default: + return nil, fmt.Errorf("properties: invalid content type %s", ct) + } + + return l.loadBytes(body, enc) +} + +func (l *Loader) loadBytes(buf []byte, enc Encoding) (*Properties, error) { + p, err := parse(convert(buf, enc)) + if err != nil { + return nil, err + } + p.DisableExpansion = l.DisableExpansion + if p.DisableExpansion { + return p, nil + } + return p, p.check() +} + +// Load reads a buffer into a Properties struct. +func Load(buf []byte, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadBytes(buf) +} + +// LoadString reads an UTF8 string into a properties struct. +func LoadString(s string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadBytes([]byte(s)) +} + +// LoadMap creates a new Properties struct from a string map. +func LoadMap(m map[string]string) *Properties { + p := NewProperties() + for k, v := range m { + p.Set(k, v) + } + return p +} + +// LoadFile reads a file into a Properties struct. +func LoadFile(filename string, enc Encoding) (*Properties, error) { + l := &Loader{Encoding: enc} + return l.LoadAll([]string{filename}) +} + +// LoadFiles reads multiple files in the given order into +// a Properties struct. If 'ignoreMissing' is true then +// non-existent files will not be reported as error. +func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(filenames) +} + +// LoadURL reads the content of the URL into a Properties struct. +// See Loader#LoadURL for details. +func LoadURL(url string) (*Properties, error) { + l := &Loader{Encoding: UTF8} + return l.LoadAll([]string{url}) +} + +// LoadURLs reads the content of multiple URLs in the given order into a +// Properties struct. If IgnoreMissing is true then a 404 status code will +// not be reported as error. See Loader#LoadURL for the Content-Type header +// and the encoding. +func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: UTF8, IgnoreMissing: ignoreMissing} + return l.LoadAll(urls) +} + +// LoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. +func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) { + l := &Loader{Encoding: enc, IgnoreMissing: ignoreMissing} + return l.LoadAll(names) +} + +// MustLoadString reads an UTF8 string into a Properties struct and +// panics on error. +func MustLoadString(s string) *Properties { + return must(LoadString(s)) +} + +// MustLoadFile reads a file into a Properties struct and +// panics on error. +func MustLoadFile(filename string, enc Encoding) *Properties { + return must(LoadFile(filename, enc)) +} + +// MustLoadFiles reads multiple files in the given order into +// a Properties struct and panics on error. If 'ignoreMissing' +// is true then non-existent files will not be reported as error. +func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadFiles(filenames, enc, ignoreMissing)) +} + +// MustLoadURL reads the content of a URL into a Properties struct and +// panics on error. +func MustLoadURL(url string) *Properties { + return must(LoadURL(url)) +} + +// MustLoadURLs reads the content of multiple URLs in the given order into a +// Properties struct and panics on error. If 'ignoreMissing' is true then a 404 +// status code will not be reported as error. +func MustLoadURLs(urls []string, ignoreMissing bool) *Properties { + return must(LoadURLs(urls, ignoreMissing)) +} + +// MustLoadAll reads the content of multiple URLs or files in the given order into a +// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will +// not be reported as error. Encoding sets the encoding for files. For the URLs please see +// LoadURL for the Content-Type header and the encoding. It panics on error. +func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties { + return must(LoadAll(names, enc, ignoreMissing)) +} + +func must(p *Properties, err error) *Properties { + if err != nil { + ErrorHandler(err) + } + return p +} + +// expandName expands ${ENV_VAR} expressions in a name. +// If the environment variable does not exist then it will be replaced +// with an empty string. Malformed expressions like "${ENV_VAR" will +// be reported as error. +func expandName(name string) (string, error) { + return expand(name, []string{}, "${", "}", make(map[string]string)) +} + +// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string. +// For ISO-8859-1 we can convert each byte straight into a rune since the +// first 256 unicode code points cover ISO-8859-1. +func convert(buf []byte, enc Encoding) string { + switch enc { + case utf8Default, UTF8: + return string(buf) + case ISO_8859_1: + runes := make([]rune, len(buf)) + for i, b := range buf { + runes[i] = rune(b) + } + return string(runes) + default: + ErrorHandler(fmt.Errorf("unsupported encoding %v", enc)) + } + panic("ErrorHandler should exit") +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/parser.go new file mode 100755 index 0000000..cdc4a80 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/parser.go @@ -0,0 +1,95 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "runtime" +) + +type parser struct { + lex *lexer +} + +func parse(input string) (properties *Properties, err error) { + p := &parser{lex: lex(input)} + defer p.recover(&err) + + properties = NewProperties() + key := "" + comments := []string{} + + for { + token := p.expectOneOf(itemComment, itemKey, itemEOF) + switch token.typ { + case itemEOF: + goto done + case itemComment: + comments = append(comments, token.val) + continue + case itemKey: + key = token.val + if _, ok := properties.m[key]; !ok { + properties.k = append(properties.k, key) + } + } + + token = p.expectOneOf(itemValue, itemEOF) + if len(comments) > 0 { + properties.c[key] = comments + comments = []string{} + } + switch token.typ { + case itemEOF: + properties.m[key] = "" + goto done + case itemValue: + properties.m[key] = token.val + } + } + +done: + return properties, nil +} + +func (p *parser) errorf(format string, args ...interface{}) { + format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format) + panic(fmt.Errorf(format, args...)) +} + +func (p *parser) expect(expected itemType) (token item) { + token = p.lex.nextItem() + if token.typ != expected { + p.unexpected(token) + } + return token +} + +func (p *parser) expectOneOf(expected ...itemType) (token item) { + token = p.lex.nextItem() + for _, v := range expected { + if token.typ == v { + return token + } + } + p.unexpected(token) + panic("unexpected token") +} + +func (p *parser) unexpected(token item) { + p.errorf(token.String()) +} + +// recover is the handler that turns panics into returns from the top level of Parse. +func (p *parser) recover(errp *error) { + e := recover() + if e != nil { + if _, ok := e.(runtime.Error); ok { + panic(e) + } + *errp = e.(error) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/properties.go new file mode 100755 index 0000000..cb3d1a3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/properties.go @@ -0,0 +1,833 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer. +// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used. + +import ( + "fmt" + "io" + "log" + "os" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +const maxExpansionDepth = 64 + +// ErrorHandlerFunc defines the type of function which handles failures +// of the MustXXX() functions. An error handler function must exit +// the application after handling the error. +type ErrorHandlerFunc func(error) + +// ErrorHandler is the function which handles failures of the MustXXX() +// functions. The default is LogFatalHandler. +var ErrorHandler ErrorHandlerFunc = LogFatalHandler + +// LogHandlerFunc defines the function prototype for logging errors. +type LogHandlerFunc func(fmt string, args ...interface{}) + +// LogPrintf defines a log handler which uses log.Printf. +var LogPrintf LogHandlerFunc = log.Printf + +// LogFatalHandler handles the error by logging a fatal error and exiting. +func LogFatalHandler(err error) { + log.Fatal(err) +} + +// PanicHandler handles the error by panicking. +func PanicHandler(err error) { + panic(err) +} + +// ----------------------------------------------------------------------------- + +// A Properties contains the key/value pairs from the properties input. +// All values are stored in unexpanded form and are expanded at runtime +type Properties struct { + // Pre-/Postfix for property expansion. + Prefix string + Postfix string + + // DisableExpansion controls the expansion of properties on Get() + // and the check for circular references on Set(). When set to + // true Properties behaves like a simple key/value store and does + // not check for circular references on Get() or on Set(). + DisableExpansion bool + + // Stores the key/value pairs + m map[string]string + + // Stores the comments per key. + c map[string][]string + + // Stores the keys in order of appearance. + k []string +} + +// NewProperties creates a new Properties struct with the default +// configuration for "${key}" expressions. +func NewProperties() *Properties { + return &Properties{ + Prefix: "${", + Postfix: "}", + m: map[string]string{}, + c: map[string][]string{}, + k: []string{}, + } +} + +// Load reads a buffer into the given Properties struct. +func (p *Properties) Load(buf []byte, enc Encoding) error { + l := &Loader{Encoding: enc, DisableExpansion: p.DisableExpansion} + newProperties, err := l.LoadBytes(buf) + if err != nil { + return err + } + p.Merge(newProperties) + return nil +} + +// Get returns the expanded value for the given key if exists. +// Otherwise, ok is false. +func (p *Properties) Get(key string) (value string, ok bool) { + v, ok := p.m[key] + if p.DisableExpansion { + return v, ok + } + if !ok { + return "", false + } + + expanded, err := p.expand(key, v) + + // we guarantee that the expanded value is free of + // circular references and malformed expressions + // so we panic if we still get an error here. + if err != nil { + ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v)) + } + + return expanded, true +} + +// MustGet returns the expanded value for the given key if exists. +// Otherwise, it panics. +func (p *Properties) MustGet(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// ClearComments removes the comments for all keys. +func (p *Properties) ClearComments() { + p.c = map[string][]string{} +} + +// ---------------------------------------------------------------------------- + +// GetComment returns the last comment before the given key or an empty string. +func (p *Properties) GetComment(key string) string { + comments, ok := p.c[key] + if !ok || len(comments) == 0 { + return "" + } + return comments[len(comments)-1] +} + +// ---------------------------------------------------------------------------- + +// GetComments returns all comments that appeared before the given key or nil. +func (p *Properties) GetComments(key string) []string { + if comments, ok := p.c[key]; ok { + return comments + } + return nil +} + +// ---------------------------------------------------------------------------- + +// SetComment sets the comment for the key. +func (p *Properties) SetComment(key, comment string) { + p.c[key] = []string{comment} +} + +// ---------------------------------------------------------------------------- + +// SetComments sets the comments for the key. If the comments are nil then +// all comments for this key are deleted. +func (p *Properties) SetComments(key string, comments []string) { + if comments == nil { + delete(p.c, key) + return + } + p.c[key] = comments +} + +// ---------------------------------------------------------------------------- + +// GetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the default value is returned. +func (p *Properties) GetBool(key string, def bool) bool { + v, err := p.getBool(key) + if err != nil { + return def + } + return v +} + +// MustGetBool checks if the expanded value is one of '1', 'yes', +// 'true' or 'on' if the key exists. The comparison is case-insensitive. +// If the key does not exist the function panics. +func (p *Properties) MustGetBool(key string) bool { + v, err := p.getBool(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getBool(key string) (value bool, err error) { + if v, ok := p.Get(key); ok { + return boolVal(v), nil + } + return false, invalidKeyError(key) +} + +func boolVal(v string) bool { + v = strings.ToLower(v) + return v == "1" || v == "true" || v == "yes" || v == "on" +} + +// ---------------------------------------------------------------------------- + +// GetDuration parses the expanded value as an time.Duration (in ns) if the +// key exists. If key does not exist or the value cannot be parsed the default +// value is returned. In almost all cases you want to use GetParsedDuration(). +func (p *Properties) GetDuration(key string, def time.Duration) time.Duration { + v, err := p.getInt64(key) + if err != nil { + return def + } + return time.Duration(v) +} + +// MustGetDuration parses the expanded value as an time.Duration (in ns) if +// the key exists. If key does not exist or the value cannot be parsed the +// function panics. In almost all cases you want to use MustGetParsedDuration(). +func (p *Properties) MustGetDuration(key string) time.Duration { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return time.Duration(v) +} + +// ---------------------------------------------------------------------------- + +// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration { + s, ok := p.Get(key) + if !ok { + return def + } + v, err := time.ParseDuration(s) + if err != nil { + return def + } + return v +} + +// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetParsedDuration(key string) time.Duration { + s, ok := p.Get(key) + if !ok { + ErrorHandler(invalidKeyError(key)) + } + v, err := time.ParseDuration(s) + if err != nil { + ErrorHandler(err) + } + return v +} + +// ---------------------------------------------------------------------------- + +// GetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetFloat64(key string, def float64) float64 { + v, err := p.getFloat64(key) + if err != nil { + return def + } + return v +} + +// MustGetFloat64 parses the expanded value as a float64 if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetFloat64(key string) float64 { + v, err := p.getFloat64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getFloat64(key string) (value float64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseFloat(v, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetInt(key string, def int) int { + v, err := p.getInt64(key) + if err != nil { + return def + } + return intRangeCheck(key, v) +} + +// MustGetInt parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetInt(key string) int { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return intRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetInt64 parses the expanded value as an int64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetInt64(key string, def int64) int64 { + v, err := p.getInt64(key) + if err != nil { + return def + } + return v +} + +// MustGetInt64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetInt64(key string) int64 { + v, err := p.getInt64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getInt64(key string) (value int64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseInt(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetUint parses the expanded value as an uint if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. If the value does not fit into an int the +// function panics with an out of range error. +func (p *Properties) GetUint(key string, def uint) uint { + v, err := p.getUint64(key) + if err != nil { + return def + } + return uintRangeCheck(key, v) +} + +// MustGetUint parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +// If the value does not fit into an int the function panics with +// an out of range error. +func (p *Properties) MustGetUint(key string) uint { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return uintRangeCheck(key, v) +} + +// ---------------------------------------------------------------------------- + +// GetUint64 parses the expanded value as an uint64 if the key exists. +// If key does not exist or the value cannot be parsed the default +// value is returned. +func (p *Properties) GetUint64(key string, def uint64) uint64 { + v, err := p.getUint64(key) + if err != nil { + return def + } + return v +} + +// MustGetUint64 parses the expanded value as an int if the key exists. +// If key does not exist or the value cannot be parsed the function panics. +func (p *Properties) MustGetUint64(key string) uint64 { + v, err := p.getUint64(key) + if err != nil { + ErrorHandler(err) + } + return v +} + +func (p *Properties) getUint64(key string) (value uint64, err error) { + if v, ok := p.Get(key); ok { + value, err = strconv.ParseUint(v, 10, 64) + if err != nil { + return 0, err + } + return value, nil + } + return 0, invalidKeyError(key) +} + +// ---------------------------------------------------------------------------- + +// GetString returns the expanded value for the given key if exists or +// the default value otherwise. +func (p *Properties) GetString(key, def string) string { + if v, ok := p.Get(key); ok { + return v + } + return def +} + +// MustGetString returns the expanded value for the given key if exists or +// panics otherwise. +func (p *Properties) MustGetString(key string) string { + if v, ok := p.Get(key); ok { + return v + } + ErrorHandler(invalidKeyError(key)) + panic("ErrorHandler should exit") +} + +// ---------------------------------------------------------------------------- + +// Filter returns a new properties object which contains all properties +// for which the key matches the pattern. +func (p *Properties) Filter(pattern string) (*Properties, error) { + re, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + return p.FilterRegexp(re), nil +} + +// FilterRegexp returns a new properties object which contains all properties +// for which the key matches the regular expression. +func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties { + pp := NewProperties() + for _, k := range p.k { + if re.MatchString(k) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterPrefix returns a new properties object with a subset of all keys +// with the given prefix. +func (p *Properties) FilterPrefix(prefix string) *Properties { + pp := NewProperties() + for _, k := range p.k { + if strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed) + pp.Set(k, p.m[k]) + } + } + return pp +} + +// FilterStripPrefix returns a new properties object with a subset of all keys +// with the given prefix and the prefix removed from the keys. +func (p *Properties) FilterStripPrefix(prefix string) *Properties { + pp := NewProperties() + n := len(prefix) + for _, k := range p.k { + if len(k) > len(prefix) && strings.HasPrefix(k, prefix) { + // TODO(fs): we are ignoring the error which flags a circular reference. + // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference + // TODO(fs): this function should probably return an error but the signature is fixed + pp.Set(k[n:], p.m[k]) + } + } + return pp +} + +// Len returns the number of keys. +func (p *Properties) Len() int { + return len(p.m) +} + +// Keys returns all keys in the same order as in the input. +func (p *Properties) Keys() []string { + keys := make([]string, len(p.k)) + copy(keys, p.k) + return keys +} + +// Set sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. If the value contains a +// circular reference or a malformed expression then +// an error is returned. +// An empty key is silently ignored. +func (p *Properties) Set(key, value string) (prev string, ok bool, err error) { + if key == "" { + return "", false, nil + } + + // if expansion is disabled we allow circular references + if p.DisableExpansion { + prev, ok = p.Get(key) + p.m[key] = value + if !ok { + p.k = append(p.k, key) + } + return prev, ok, nil + } + + // to check for a circular reference we temporarily need + // to set the new value. If there is an error then revert + // to the previous state. Only if all tests are successful + // then we add the key to the p.k list. + prev, ok = p.Get(key) + p.m[key] = value + + // now check for a circular reference + _, err = p.expand(key, value) + if err != nil { + + // revert to the previous state + if ok { + p.m[key] = prev + } else { + delete(p.m, key) + } + + return "", false, err + } + + if !ok { + p.k = append(p.k, key) + } + + return prev, ok, nil +} + +// SetValue sets property key to the default string value +// as defined by fmt.Sprintf("%v"). +func (p *Properties) SetValue(key string, value interface{}) error { + _, _, err := p.Set(key, fmt.Sprintf("%v", value)) + return err +} + +// MustSet sets the property key to the corresponding value. +// If a value for key existed before then ok is true and prev +// contains the previous value. An empty key is silently ignored. +func (p *Properties) MustSet(key, value string) (prev string, ok bool) { + prev, ok, err := p.Set(key, value) + if err != nil { + ErrorHandler(err) + } + return prev, ok +} + +// String returns a string of all expanded 'key = value' pairs. +func (p *Properties) String() string { + var s string + for _, key := range p.k { + value, _ := p.Get(key) + s = fmt.Sprintf("%s%s = %s\n", s, key, value) + } + return s +} + +// Write writes all unexpanded 'key = value' pairs to the given writer. +// Write returns the number of bytes written and any write error encountered. +func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) { + return p.WriteComment(w, "", enc) +} + +// WriteComment writes all unexpanced 'key = value' pairs to the given writer. +// If prefix is not empty then comments are written with a blank line and the +// given prefix. The prefix should be either "# " or "! " to be compatible with +// the properties file format. Otherwise, the properties parser will not be +// able to read the file back in. It returns the number of bytes written and +// any write error encountered. +func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) { + var x int + + for _, key := range p.k { + value := p.m[key] + + if prefix != "" { + if comments, ok := p.c[key]; ok { + // don't print comments if they are all empty + allEmpty := true + for _, c := range comments { + if c != "" { + allEmpty = false + break + } + } + + if !allEmpty { + // add a blank line between entries but not at the top + if len(comments) > 0 && n > 0 { + x, err = fmt.Fprintln(w) + if err != nil { + return + } + n += x + } + + for _, c := range comments { + x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc)) + if err != nil { + return + } + n += x + } + } + } + } + + x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc)) + if err != nil { + return + } + n += x + } + return +} + +// Map returns a copy of the properties as a map. +func (p *Properties) Map() map[string]string { + m := make(map[string]string) + for k, v := range p.m { + m[k] = v + } + return m +} + +// FilterFunc returns a copy of the properties which includes the values which passed all filters. +func (p *Properties) FilterFunc(filters ...func(k, v string) bool) *Properties { + pp := NewProperties() +outer: + for k, v := range p.m { + for _, f := range filters { + if !f(k, v) { + continue outer + } + pp.Set(k, v) + } + } + return pp +} + +// ---------------------------------------------------------------------------- + +// Delete removes the key and its comments. +func (p *Properties) Delete(key string) { + delete(p.m, key) + delete(p.c, key) + newKeys := []string{} + for _, k := range p.k { + if k != key { + newKeys = append(newKeys, k) + } + } + p.k = newKeys +} + +// Merge merges properties, comments and keys from other *Properties into p +func (p *Properties) Merge(other *Properties) { + for k, v := range other.m { + p.m[k] = v + } + for k, v := range other.c { + p.c[k] = v + } + +outer: + for _, otherKey := range other.k { + for _, key := range p.k { + if otherKey == key { + continue outer + } + } + p.k = append(p.k, otherKey) + } +} + +// ---------------------------------------------------------------------------- + +// check expands all values and returns an error if a circular reference or +// a malformed expression was found. +func (p *Properties) check() error { + for key, value := range p.m { + if _, err := p.expand(key, value); err != nil { + return err + } + } + return nil +} + +func (p *Properties) expand(key, input string) (string, error) { + // no pre/postfix -> nothing to expand + if p.Prefix == "" && p.Postfix == "" { + return input, nil + } + + return expand(input, []string{key}, p.Prefix, p.Postfix, p.m) +} + +// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values. +// The function keeps track of the keys that were already expanded and stops if it +// detects a circular reference or a malformed expression of the form '(prefix)key'. +func expand(s string, keys []string, prefix, postfix string, values map[string]string) (string, error) { + if len(keys) > maxExpansionDepth { + return "", fmt.Errorf("expansion too deep") + } + + for { + start := strings.Index(s, prefix) + if start == -1 { + return s, nil + } + + keyStart := start + len(prefix) + keyLen := strings.Index(s[keyStart:], postfix) + if keyLen == -1 { + return "", fmt.Errorf("malformed expression") + } + + end := keyStart + keyLen + len(postfix) - 1 + key := s[keyStart : keyStart+keyLen] + + // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key) + + for _, k := range keys { + if key == k { + return "", fmt.Errorf("circular reference") + } + } + + val, ok := values[key] + if !ok { + val = os.Getenv(key) + } + new_val, err := expand(val, append(keys, key), prefix, postfix, values) + if err != nil { + return "", err + } + s = s[:start] + new_val + s[end+1:] + } + return s, nil +} + +// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters. +func encode(s string, special string, enc Encoding) string { + switch enc { + case UTF8: + return encodeUtf8(s, special) + case ISO_8859_1: + return encodeIso(s, special) + default: + panic(fmt.Sprintf("unsupported encoding %v", enc)) + } +} + +func encodeUtf8(s string, special string) string { + v := "" + for pos := 0; pos < len(s); { + r, w := utf8.DecodeRuneInString(s[pos:]) + pos += w + v += escape(r, special) + } + return v +} + +func encodeIso(s string, special string) string { + var r rune + var w int + var v string + for pos := 0; pos < len(s); { + switch r, w = utf8.DecodeRuneInString(s[pos:]); { + case r < 1<<8: // single byte rune -> escape special chars only + v += escape(r, special) + case r < 1<<16: // two byte rune -> unicode literal + v += fmt.Sprintf("\\u%04x", r) + default: // more than two bytes per rune -> can't encode + v += "?" + } + pos += w + } + return v +} + +func escape(r rune, special string) string { + switch r { + case '\f': + return "\\f" + case '\n': + return "\\n" + case '\r': + return "\\r" + case '\t': + return "\\t" + default: + if strings.ContainsRune(special, r) { + return "\\" + string(r) + } + return string(r) + } +} + +func invalidKeyError(key string) error { + return fmt.Errorf("unknown property: %s", key) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/rangecheck.go new file mode 100755 index 0000000..b013a2e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/magiconair/properties/rangecheck.go @@ -0,0 +1,31 @@ +// Copyright 2018 Frank Schroeder. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package properties + +import ( + "fmt" + "math" +) + +// make this a var to overwrite it in a test +var is32Bit = ^uint(0) == math.MaxUint32 + +// intRangeCheck checks if the value fits into the int type and +// panics if it does not. +func intRangeCheck(key string, v int64) int { + if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return int(v) +} + +// uintRangeCheck checks if the value fits into the uint type and +// panics if it does not. +func uintRangeCheck(key string, v uint64) uint { + if is32Bit && v > math.MaxUint32 { + panic(fmt.Sprintf("Value %d for key %s out of range", v, key)) + } + return uint(v) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/.travis.yml new file mode 100755 index 0000000..98db8f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/.travis.yml @@ -0,0 +1,9 @@ +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 xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/LICENSE new file mode 100755 index 0000000..91b5cef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/README.md new file mode 100755 index 0000000..56729a9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/README.md @@ -0,0 +1,48 @@ +# go-colorable + +[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) +[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) +[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) + +Colorable writer for windows. + +For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) +This package is possible to handle escape sequence for ansi color on windows. + +## Too Bad! + +![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) + + +## So Good! + +![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) + +## Usage + +```go +logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) +logrus.SetOutput(colorable.NewColorableStdout()) + +logrus.Info("succeeded") +logrus.Warn("not correct") +logrus.Error("something error") +logrus.Fatal("panic") +``` + +You can compile above code on non-windows OSs. + +## Installation + +``` +$ go get github.com/mattn/go-colorable +``` + +# License + +MIT + +# Author + +Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go new file mode 100755 index 0000000..1f28d77 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_appengine.go @@ -0,0 +1,29 @@ +// +build appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable return new instance of Writer which handle escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go new file mode 100755 index 0000000..887f203 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_others.go @@ -0,0 +1,30 @@ +// +build !windows +// +build !appengine + +package colorable + +import ( + "io" + "os" + + _ "github.com/mattn/go-isatty" +) + +// NewColorable return new instance of Writer which handle escape sequence. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return os.Stdout +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return os.Stderr +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go new file mode 100755 index 0000000..e17a547 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/colorable_windows.go @@ -0,0 +1,884 @@ +// +build windows +// +build !appengine + +package colorable + +import ( + "bytes" + "io" + "math" + "os" + "strconv" + "strings" + "syscall" + "unsafe" + + "github.com/mattn/go-isatty" +) + +const ( + foregroundBlue = 0x1 + foregroundGreen = 0x2 + foregroundRed = 0x4 + foregroundIntensity = 0x8 + foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) + backgroundBlue = 0x10 + backgroundGreen = 0x20 + backgroundRed = 0x40 + backgroundIntensity = 0x80 + backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) +) + +type wchar uint16 +type short int16 +type dword uint32 +type word uint16 + +type coord struct { + x short + y short +} + +type smallRect struct { + left short + top short + right short + bottom short +} + +type consoleScreenBufferInfo struct { + size coord + cursorPosition coord + attributes word + window smallRect + maximumWindowSize coord +} + +type consoleCursorInfo struct { + size dword + visible int32 +} + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") + procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") + procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") + procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") + procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") + procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") +) + +// Writer provide colorable Writer to the console +type Writer struct { + out io.Writer + handle syscall.Handle + oldattr word + oldpos coord +} + +// NewColorable return new instance of Writer which handle escape sequence from File. +func NewColorable(file *os.File) io.Writer { + if file == nil { + panic("nil passed instead of *os.File to NewColorable()") + } + + if isatty.IsTerminal(file.Fd()) { + var csbi consoleScreenBufferInfo + handle := syscall.Handle(file.Fd()) + procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) + return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} + } + return file +} + +// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. +func NewColorableStdout() io.Writer { + return NewColorable(os.Stdout) +} + +// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. +func NewColorableStderr() io.Writer { + return NewColorable(os.Stderr) +} + +var color256 = map[int]int{ + 0: 0x000000, + 1: 0x800000, + 2: 0x008000, + 3: 0x808000, + 4: 0x000080, + 5: 0x800080, + 6: 0x008080, + 7: 0xc0c0c0, + 8: 0x808080, + 9: 0xff0000, + 10: 0x00ff00, + 11: 0xffff00, + 12: 0x0000ff, + 13: 0xff00ff, + 14: 0x00ffff, + 15: 0xffffff, + 16: 0x000000, + 17: 0x00005f, + 18: 0x000087, + 19: 0x0000af, + 20: 0x0000d7, + 21: 0x0000ff, + 22: 0x005f00, + 23: 0x005f5f, + 24: 0x005f87, + 25: 0x005faf, + 26: 0x005fd7, + 27: 0x005fff, + 28: 0x008700, + 29: 0x00875f, + 30: 0x008787, + 31: 0x0087af, + 32: 0x0087d7, + 33: 0x0087ff, + 34: 0x00af00, + 35: 0x00af5f, + 36: 0x00af87, + 37: 0x00afaf, + 38: 0x00afd7, + 39: 0x00afff, + 40: 0x00d700, + 41: 0x00d75f, + 42: 0x00d787, + 43: 0x00d7af, + 44: 0x00d7d7, + 45: 0x00d7ff, + 46: 0x00ff00, + 47: 0x00ff5f, + 48: 0x00ff87, + 49: 0x00ffaf, + 50: 0x00ffd7, + 51: 0x00ffff, + 52: 0x5f0000, + 53: 0x5f005f, + 54: 0x5f0087, + 55: 0x5f00af, + 56: 0x5f00d7, + 57: 0x5f00ff, + 58: 0x5f5f00, + 59: 0x5f5f5f, + 60: 0x5f5f87, + 61: 0x5f5faf, + 62: 0x5f5fd7, + 63: 0x5f5fff, + 64: 0x5f8700, + 65: 0x5f875f, + 66: 0x5f8787, + 67: 0x5f87af, + 68: 0x5f87d7, + 69: 0x5f87ff, + 70: 0x5faf00, + 71: 0x5faf5f, + 72: 0x5faf87, + 73: 0x5fafaf, + 74: 0x5fafd7, + 75: 0x5fafff, + 76: 0x5fd700, + 77: 0x5fd75f, + 78: 0x5fd787, + 79: 0x5fd7af, + 80: 0x5fd7d7, + 81: 0x5fd7ff, + 82: 0x5fff00, + 83: 0x5fff5f, + 84: 0x5fff87, + 85: 0x5fffaf, + 86: 0x5fffd7, + 87: 0x5fffff, + 88: 0x870000, + 89: 0x87005f, + 90: 0x870087, + 91: 0x8700af, + 92: 0x8700d7, + 93: 0x8700ff, + 94: 0x875f00, + 95: 0x875f5f, + 96: 0x875f87, + 97: 0x875faf, + 98: 0x875fd7, + 99: 0x875fff, + 100: 0x878700, + 101: 0x87875f, + 102: 0x878787, + 103: 0x8787af, + 104: 0x8787d7, + 105: 0x8787ff, + 106: 0x87af00, + 107: 0x87af5f, + 108: 0x87af87, + 109: 0x87afaf, + 110: 0x87afd7, + 111: 0x87afff, + 112: 0x87d700, + 113: 0x87d75f, + 114: 0x87d787, + 115: 0x87d7af, + 116: 0x87d7d7, + 117: 0x87d7ff, + 118: 0x87ff00, + 119: 0x87ff5f, + 120: 0x87ff87, + 121: 0x87ffaf, + 122: 0x87ffd7, + 123: 0x87ffff, + 124: 0xaf0000, + 125: 0xaf005f, + 126: 0xaf0087, + 127: 0xaf00af, + 128: 0xaf00d7, + 129: 0xaf00ff, + 130: 0xaf5f00, + 131: 0xaf5f5f, + 132: 0xaf5f87, + 133: 0xaf5faf, + 134: 0xaf5fd7, + 135: 0xaf5fff, + 136: 0xaf8700, + 137: 0xaf875f, + 138: 0xaf8787, + 139: 0xaf87af, + 140: 0xaf87d7, + 141: 0xaf87ff, + 142: 0xafaf00, + 143: 0xafaf5f, + 144: 0xafaf87, + 145: 0xafafaf, + 146: 0xafafd7, + 147: 0xafafff, + 148: 0xafd700, + 149: 0xafd75f, + 150: 0xafd787, + 151: 0xafd7af, + 152: 0xafd7d7, + 153: 0xafd7ff, + 154: 0xafff00, + 155: 0xafff5f, + 156: 0xafff87, + 157: 0xafffaf, + 158: 0xafffd7, + 159: 0xafffff, + 160: 0xd70000, + 161: 0xd7005f, + 162: 0xd70087, + 163: 0xd700af, + 164: 0xd700d7, + 165: 0xd700ff, + 166: 0xd75f00, + 167: 0xd75f5f, + 168: 0xd75f87, + 169: 0xd75faf, + 170: 0xd75fd7, + 171: 0xd75fff, + 172: 0xd78700, + 173: 0xd7875f, + 174: 0xd78787, + 175: 0xd787af, + 176: 0xd787d7, + 177: 0xd787ff, + 178: 0xd7af00, + 179: 0xd7af5f, + 180: 0xd7af87, + 181: 0xd7afaf, + 182: 0xd7afd7, + 183: 0xd7afff, + 184: 0xd7d700, + 185: 0xd7d75f, + 186: 0xd7d787, + 187: 0xd7d7af, + 188: 0xd7d7d7, + 189: 0xd7d7ff, + 190: 0xd7ff00, + 191: 0xd7ff5f, + 192: 0xd7ff87, + 193: 0xd7ffaf, + 194: 0xd7ffd7, + 195: 0xd7ffff, + 196: 0xff0000, + 197: 0xff005f, + 198: 0xff0087, + 199: 0xff00af, + 200: 0xff00d7, + 201: 0xff00ff, + 202: 0xff5f00, + 203: 0xff5f5f, + 204: 0xff5f87, + 205: 0xff5faf, + 206: 0xff5fd7, + 207: 0xff5fff, + 208: 0xff8700, + 209: 0xff875f, + 210: 0xff8787, + 211: 0xff87af, + 212: 0xff87d7, + 213: 0xff87ff, + 214: 0xffaf00, + 215: 0xffaf5f, + 216: 0xffaf87, + 217: 0xffafaf, + 218: 0xffafd7, + 219: 0xffafff, + 220: 0xffd700, + 221: 0xffd75f, + 222: 0xffd787, + 223: 0xffd7af, + 224: 0xffd7d7, + 225: 0xffd7ff, + 226: 0xffff00, + 227: 0xffff5f, + 228: 0xffff87, + 229: 0xffffaf, + 230: 0xffffd7, + 231: 0xffffff, + 232: 0x080808, + 233: 0x121212, + 234: 0x1c1c1c, + 235: 0x262626, + 236: 0x303030, + 237: 0x3a3a3a, + 238: 0x444444, + 239: 0x4e4e4e, + 240: 0x585858, + 241: 0x626262, + 242: 0x6c6c6c, + 243: 0x767676, + 244: 0x808080, + 245: 0x8a8a8a, + 246: 0x949494, + 247: 0x9e9e9e, + 248: 0xa8a8a8, + 249: 0xb2b2b2, + 250: 0xbcbcbc, + 251: 0xc6c6c6, + 252: 0xd0d0d0, + 253: 0xdadada, + 254: 0xe4e4e4, + 255: 0xeeeeee, +} + +// `\033]0;TITLESTR\007` +func doTitleSequence(er *bytes.Reader) error { + var c byte + var err error + + c, err = er.ReadByte() + if err != nil { + return err + } + if c != '0' && c != '2' { + return nil + } + c, err = er.ReadByte() + if err != nil { + return err + } + if c != ';' { + return nil + } + title := make([]byte, 0, 80) + for { + c, err = er.ReadByte() + if err != nil { + return err + } + if c == 0x07 || c == '\n' { + break + } + title = append(title, c) + } + if len(title) > 0 { + title8, err := syscall.UTF16PtrFromString(string(title)) + if err == nil { + procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) + } + } + return nil +} + +// Write write data on console +func (w *Writer) Write(data []byte) (n int, err error) { + var csbi consoleScreenBufferInfo + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + + er := bytes.NewReader(data) + var bw [1]byte +loop: + for { + c1, err := er.ReadByte() + if err != nil { + break loop + } + if c1 != 0x1b { + bw[0] = c1 + w.out.Write(bw[:]) + continue + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + + if c2 == ']' { + if err := doTitleSequence(er); err != nil { + break loop + } + continue + } + if c2 != 0x5b { + continue + } + + var buf bytes.Buffer + var m byte + for { + c, err := er.ReadByte() + if err != nil { + break loop + } + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + m = c + break + } + buf.Write([]byte(string(c))) + } + + switch m { + case 'A': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'B': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'C': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'D': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'E': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y += short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'F': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = 0 + csbi.cursorPosition.y -= short(n) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'G': + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + csbi.cursorPosition.x = short(n - 1) + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'H', 'f': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + if buf.Len() > 0 { + token := strings.Split(buf.String(), ";") + switch len(token) { + case 1: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + csbi.cursorPosition.y = short(n1 - 1) + case 2: + n1, err := strconv.Atoi(token[0]) + if err != nil { + continue + } + n2, err := strconv.Atoi(token[1]) + if err != nil { + continue + } + csbi.cursorPosition.x = short(n2 - 1) + csbi.cursorPosition.y = short(n1 - 1) + } + } else { + csbi.cursorPosition.y = 0 + } + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) + case 'J': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + var count, written dword + var cursor coord + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.window.top} + count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'K': + n := 0 + if buf.Len() > 0 { + n, err = strconv.Atoi(buf.String()) + if err != nil { + continue + } + } + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + var cursor coord + var count, written dword + switch n { + case 0: + cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x - 1) + case 1: + cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + count = dword(csbi.size.x - csbi.cursorPosition.x) + case 2: + cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} + count = dword(csbi.size.x) + } + procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) + case 'm': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + attr := csbi.attributes + cs := buf.String() + if cs == "" { + procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr)) + continue + } + token := strings.Split(cs, ";") + for i := 0; i < len(token); i++ { + ns := token[i] + if n, err = strconv.Atoi(ns); err == nil { + switch { + case n == 0 || n == 100: + attr = w.oldattr + case 1 <= n && n <= 5: + attr |= foregroundIntensity + case n == 7: + attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case n == 22 || n == 25: + attr |= foregroundIntensity + case n == 27: + attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) + case 30 <= n && n <= 37: + attr &= backgroundMask + if (n-30)&1 != 0 { + attr |= foregroundRed + } + if (n-30)&2 != 0 { + attr |= foregroundGreen + } + if (n-30)&4 != 0 { + attr |= foregroundBlue + } + case n == 38: // set foreground color. + if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256foreAttr == nil { + n256setup() + } + attr &= backgroundMask + attr |= n256foreAttr[n256] + i += 2 + } + } else { + attr = attr & (w.oldattr & backgroundMask) + } + case n == 39: // reset foreground color. + attr &= backgroundMask + attr |= w.oldattr & foregroundMask + case 40 <= n && n <= 47: + attr &= foregroundMask + if (n-40)&1 != 0 { + attr |= backgroundRed + } + if (n-40)&2 != 0 { + attr |= backgroundGreen + } + if (n-40)&4 != 0 { + attr |= backgroundBlue + } + case n == 48: // set background color. + if i < len(token)-2 && token[i+1] == "5" { + if n256, err := strconv.Atoi(token[i+2]); err == nil { + if n256backAttr == nil { + n256setup() + } + attr &= foregroundMask + attr |= n256backAttr[n256] + i += 2 + } + } else { + attr = attr & (w.oldattr & foregroundMask) + } + case n == 49: // reset foreground color. + attr &= foregroundMask + attr |= w.oldattr & backgroundMask + case 90 <= n && n <= 97: + attr = (attr & backgroundMask) + attr |= foregroundIntensity + if (n-90)&1 != 0 { + attr |= foregroundRed + } + if (n-90)&2 != 0 { + attr |= foregroundGreen + } + if (n-90)&4 != 0 { + attr |= foregroundBlue + } + case 100 <= n && n <= 107: + attr = (attr & foregroundMask) + attr |= backgroundIntensity + if (n-100)&1 != 0 { + attr |= backgroundRed + } + if (n-100)&2 != 0 { + attr |= backgroundGreen + } + if (n-100)&4 != 0 { + attr |= backgroundBlue + } + } + procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr)) + } + } + case 'h': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } + case 'l': + var ci consoleCursorInfo + cs := buf.String() + if cs == "5>" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 1 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } else if cs == "?25" { + procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + ci.visible = 0 + procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) + } + case 's': + procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) + w.oldpos = csbi.cursorPosition + case 'u': + procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) + } + } + + return len(data), nil +} + +type consoleColor struct { + rgb int + red bool + green bool + blue bool + intensity bool +} + +func (c consoleColor) foregroundAttr() (attr word) { + if c.red { + attr |= foregroundRed + } + if c.green { + attr |= foregroundGreen + } + if c.blue { + attr |= foregroundBlue + } + if c.intensity { + attr |= foregroundIntensity + } + return +} + +func (c consoleColor) backgroundAttr() (attr word) { + if c.red { + attr |= backgroundRed + } + if c.green { + attr |= backgroundGreen + } + if c.blue { + attr |= backgroundBlue + } + if c.intensity { + attr |= backgroundIntensity + } + return +} + +var color16 = []consoleColor{ + {0x000000, false, false, false, false}, + {0x000080, false, false, true, false}, + {0x008000, false, true, false, false}, + {0x008080, false, true, true, false}, + {0x800000, true, false, false, false}, + {0x800080, true, false, true, false}, + {0x808000, true, true, false, false}, + {0xc0c0c0, true, true, true, false}, + {0x808080, false, false, false, true}, + {0x0000ff, false, false, true, true}, + {0x00ff00, false, true, false, true}, + {0x00ffff, false, true, true, true}, + {0xff0000, true, false, false, true}, + {0xff00ff, true, false, true, true}, + {0xffff00, true, true, false, true}, + {0xffffff, true, true, true, true}, +} + +type hsv struct { + h, s, v float32 +} + +func (a hsv) dist(b hsv) float32 { + dh := a.h - b.h + switch { + case dh > 0.5: + dh = 1 - dh + case dh < -0.5: + dh = -1 - dh + } + ds := a.s - b.s + dv := a.v - b.v + return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) +} + +func toHSV(rgb int) hsv { + r, g, b := float32((rgb&0xFF0000)>>16)/256.0, + float32((rgb&0x00FF00)>>8)/256.0, + float32(rgb&0x0000FF)/256.0 + min, max := minmax3f(r, g, b) + h := max - min + if h > 0 { + if max == r { + h = (g - b) / h + if h < 0 { + h += 6 + } + } else if max == g { + h = 2 + (b-r)/h + } else { + h = 4 + (r-g)/h + } + } + h /= 6.0 + s := max - min + if max != 0 { + s /= max + } + v := max + return hsv{h: h, s: s, v: v} +} + +type hsvTable []hsv + +func toHSVTable(rgbTable []consoleColor) hsvTable { + t := make(hsvTable, len(rgbTable)) + for i, c := range rgbTable { + t[i] = toHSV(c.rgb) + } + return t +} + +func (t hsvTable) find(rgb int) consoleColor { + hsv := toHSV(rgb) + n := 7 + l := float32(5.0) + for i, p := range t { + d := hsv.dist(p) + if d < l { + l, n = d, i + } + } + return color16[n] +} + +func minmax3f(a, b, c float32) (min, max float32) { + if a < b { + if b < c { + return a, c + } else if a < c { + return a, b + } else { + return c, b + } + } else { + if a < c { + return b, c + } else if b < c { + return b, a + } else { + return c, a + } + } +} + +var n256foreAttr []word +var n256backAttr []word + +func n256setup() { + n256foreAttr = make([]word, 256) + n256backAttr = make([]word, 256) + t := toHSVTable(color16) + for i, rgb := range color256 { + c := t.find(rgb) + n256foreAttr[i] = c.foregroundAttr() + n256backAttr[i] = c.backgroundAttr() + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go new file mode 100755 index 0000000..9721e16 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-colorable/noncolorable.go @@ -0,0 +1,55 @@ +package colorable + +import ( + "bytes" + "io" +) + +// NonColorable hold writer but remove escape sequence. +type NonColorable struct { + out io.Writer +} + +// NewNonColorable return new instance of Writer which remove escape sequence from Writer. +func NewNonColorable(w io.Writer) io.Writer { + return &NonColorable{out: w} +} + +// Write write data on console +func (w *NonColorable) Write(data []byte) (n int, err error) { + er := bytes.NewReader(data) + var bw [1]byte +loop: + for { + c1, err := er.ReadByte() + if err != nil { + break loop + } + if c1 != 0x1b { + bw[0] = c1 + w.out.Write(bw[:]) + continue + } + c2, err := er.ReadByte() + if err != nil { + break loop + } + if c2 != 0x5b { + continue + } + + var buf bytes.Buffer + for { + c, err := er.ReadByte() + if err != nil { + break loop + } + if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { + break + } + buf.Write([]byte(string(c))) + } + } + + return len(data), nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/.travis.yml new file mode 100755 index 0000000..b9f8b23 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/.travis.yml @@ -0,0 +1,9 @@ +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 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/LICENSE new file mode 100755 index 0000000..65dc692 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/LICENSE @@ -0,0 +1,9 @@ +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/README.md new file mode 100755 index 0000000..1e69004 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/README.md @@ -0,0 +1,50 @@ +# go-isatty + +[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) +[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) +[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) +[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) + +isatty for golang + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/mattn/go-isatty" + "os" +) + +func main() { + if isatty.IsTerminal(os.Stdout.Fd()) { + fmt.Println("Is Terminal") + } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { + fmt.Println("Is Cygwin/MSYS2 Terminal") + } else { + fmt.Println("Is Not Terminal") + } +} +``` + +## Installation + +``` +$ go get github.com/mattn/go-isatty +``` + +## License + +MIT + +## Author + +Yasuhiro Matsumoto (a.k.a mattn) + +## Thanks + +* k-takata: base idea for IsCygwinTerminal + + https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/doc.go new file mode 100755 index 0000000..17d4f90 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/doc.go @@ -0,0 +1,2 @@ +// Package isatty implements interface to isatty +package isatty diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go new file mode 100755 index 0000000..9584a98 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_appengine.go @@ -0,0 +1,15 @@ +// +build appengine + +package isatty + +// IsTerminal returns true if the file descriptor is terminal which +// is always false on on appengine classic which is a sandboxed PaaS. +func IsTerminal(fd uintptr) bool { + return false +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go new file mode 100755 index 0000000..42f2514 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_bsd.go @@ -0,0 +1,18 @@ +// +build darwin freebsd openbsd netbsd dragonfly +// +build !appengine + +package isatty + +import ( + "syscall" + "unsafe" +) + +const ioctlReadTermios = syscall.TIOCGETA + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go new file mode 100755 index 0000000..7384cf9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux.go @@ -0,0 +1,18 @@ +// +build linux +// +build !appengine,!ppc64,!ppc64le + +package isatty + +import ( + "syscall" + "unsafe" +) + +const ioctlReadTermios = syscall.TCGETS + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go new file mode 100755 index 0000000..44e5d21 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go @@ -0,0 +1,19 @@ +// +build linux +// +build ppc64 ppc64le + +package isatty + +import ( + "unsafe" + + syscall "golang.org/x/sys/unix" +) + +const ioctlReadTermios = syscall.TCGETS + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var termios syscall.Termios + _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) + return err == 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go new file mode 100755 index 0000000..ff4de3d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_others.go @@ -0,0 +1,10 @@ +// +build !windows +// +build !appengine + +package isatty + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. This is also always false on this environment. +func IsCygwinTerminal(fd uintptr) bool { + return false +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go new file mode 100755 index 0000000..1f0c6bf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_solaris.go @@ -0,0 +1,16 @@ +// +build solaris +// +build !appengine + +package isatty + +import ( + "golang.org/x/sys/unix" +) + +// IsTerminal returns true if the given file descriptor is a terminal. +// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c +func IsTerminal(fd uintptr) bool { + var termio unix.Termio + err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) + return err == nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go new file mode 100755 index 0000000..af51cbc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mattn/go-isatty/isatty_windows.go @@ -0,0 +1,94 @@ +// +build windows +// +build !appengine + +package isatty + +import ( + "strings" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + fileNameInfo uintptr = 2 + fileTypePipe = 3 +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procGetConsoleMode = kernel32.NewProc("GetConsoleMode") + procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") + procGetFileType = kernel32.NewProc("GetFileType") +) + +func init() { + // Check if GetFileInformationByHandleEx is available. + if procGetFileInformationByHandleEx.Find() != nil { + procGetFileInformationByHandleEx = nil + } +} + +// IsTerminal return true if the file descriptor is terminal. +func IsTerminal(fd uintptr) bool { + var st uint32 + r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) + return r != 0 && e == 0 +} + +// Check pipe name is used for cygwin/msys2 pty. +// Cygwin/MSYS2 PTY has a name like: +// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master +func isCygwinPipeName(name string) bool { + token := strings.Split(name, "-") + if len(token) < 5 { + return false + } + + if token[0] != `\msys` && token[0] != `\cygwin` { + return false + } + + if token[1] == "" { + return false + } + + if !strings.HasPrefix(token[2], "pty") { + return false + } + + if token[3] != `from` && token[3] != `to` { + return false + } + + if token[4] != "master" { + return false + } + + return true +} + +// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 +// terminal. +func IsCygwinTerminal(fd uintptr) bool { + if procGetFileInformationByHandleEx == nil { + return false + } + + // Cygwin/msys's pty is a pipe. + ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) + if ft != fileTypePipe || e != 0 { + return false + } + + var buf [2 + syscall.MAX_PATH]uint16 + r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), + 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), + uintptr(len(buf)*2), 0, 0) + if r == 0 || e != 0 { + return false + } + + l := *(*uint32)(unsafe.Pointer(&buf)) + return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/.gitignore new file mode 100755 index 0000000..9ed3b07 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/.gitignore @@ -0,0 +1 @@ +*.test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/LICENSE new file mode 100755 index 0000000..06ce0c3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) +Copyright (c) 2013 Mario L. Gutierrez + +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/skycoin/skycoin/vendor/github.com/mgutz/ansi/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/README.md new file mode 100755 index 0000000..8f8e20b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/README.md @@ -0,0 +1,121 @@ +# ansi + +Package ansi is a small, fast library to create ANSI colored strings and codes. + +## Install + +Get it + +```sh +go get -u github.com/mgutz/ansi +``` + +## Example + +```go +import "github.com/mgutz/ansi" + +// colorize a string, SLOW +msg := ansi.Color("foo", "red+b:white") + +// create a FAST closure function to avoid computation of ANSI code +phosphorize := ansi.ColorFunc("green+h:black") +msg = phosphorize("Bring back the 80s!") +msg2 := phospohorize("Look, I'm a CRT!") + +// cache escape codes and build strings manually +lime := ansi.ColorCode("green+h:black") +reset := ansi.ColorCode("reset") + +fmt.Println(lime, "Bring back the 80s!", reset) +``` + +Other examples + +```go +Color(s, "red") // red +Color(s, "red+b") // red bold +Color(s, "red+B") // red blinking +Color(s, "red+u") // red underline +Color(s, "red+bh") // red bold bright +Color(s, "red:white") // red on white +Color(s, "red+b:white+h") // red bold on white bright +Color(s, "red+B:white+h") // red blink on white bright +Color(s, "off") // turn off ansi codes +``` + +To view color combinations, from project directory in terminal. + +```sh +go test +``` + +## Style format + +```go +"foregroundColor+attributes:backgroundColor+attributes" +``` + +Colors + +* black +* red +* green +* yellow +* blue +* magenta +* cyan +* white +* 0...255 (256 colors) + +Foreground Attributes + +* B = Blink +* b = bold +* h = high intensity (bright) +* i = inverse +* s = strikethrough +* u = underline + +Background Attributes + +* h = high intensity (bright) + +## Constants + +* ansi.Reset +* ansi.DefaultBG +* ansi.DefaultFG +* ansi.Black +* ansi.Red +* ansi.Green +* ansi.Yellow +* ansi.Blue +* ansi.Magenta +* ansi.Cyan +* ansi.White +* ansi.LightBlack +* ansi.LightRed +* ansi.LightGreen +* ansi.LightYellow +* ansi.LightBlue +* ansi.LightMagenta +* ansi.LightCyan +* ansi.LightWhite + +## References + +Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) + +General [tips and formatting](http://misc.flogisoft.com/bash/tip_colors_and_formatting) + +What about support on Windows? Use [colorable by mattn](https://github.com/mattn/go-colorable). +Ansi and colorable are used by [logxi](https://github.com/mgutz/logxi) to support logging in +color on Windows. + +## MIT License + +Copyright (c) 2013 Mario Gutierrez mario@mgutz.com + +See the file LICENSE for copying permission. + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/ansi.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/ansi.go new file mode 100755 index 0000000..dc04136 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/ansi.go @@ -0,0 +1,285 @@ +package ansi + +import ( + "bytes" + "fmt" + "strconv" + "strings" +) + +const ( + black = iota + red + green + yellow + blue + magenta + cyan + white + defaultt = 9 + + normalIntensityFG = 30 + highIntensityFG = 90 + normalIntensityBG = 40 + highIntensityBG = 100 + + start = "\033[" + bold = "1;" + blink = "5;" + underline = "4;" + inverse = "7;" + strikethrough = "9;" + + // Reset is the ANSI reset escape sequence + Reset = "\033[0m" + // DefaultBG is the default background + DefaultBG = "\033[49m" + // DefaultFG is the default foreground + DefaultFG = "\033[39m" +) + +// Black FG +var Black string + +// Red FG +var Red string + +// Green FG +var Green string + +// Yellow FG +var Yellow string + +// Blue FG +var Blue string + +// Magenta FG +var Magenta string + +// Cyan FG +var Cyan string + +// White FG +var White string + +// LightBlack FG +var LightBlack string + +// LightRed FG +var LightRed string + +// LightGreen FG +var LightGreen string + +// LightYellow FG +var LightYellow string + +// LightBlue FG +var LightBlue string + +// LightMagenta FG +var LightMagenta string + +// LightCyan FG +var LightCyan string + +// LightWhite FG +var LightWhite string + +var ( + plain = false + // Colors maps common color names to their ANSI color code. + Colors = map[string]int{ + "black": black, + "red": red, + "green": green, + "yellow": yellow, + "blue": blue, + "magenta": magenta, + "cyan": cyan, + "white": white, + "default": defaultt, + } +) + +func init() { + for i := 0; i < 256; i++ { + Colors[strconv.Itoa(i)] = i + } + + Black = ColorCode("black") + Red = ColorCode("red") + Green = ColorCode("green") + Yellow = ColorCode("yellow") + Blue = ColorCode("blue") + Magenta = ColorCode("magenta") + Cyan = ColorCode("cyan") + White = ColorCode("white") + LightBlack = ColorCode("black+h") + LightRed = ColorCode("red+h") + LightGreen = ColorCode("green+h") + LightYellow = ColorCode("yellow+h") + LightBlue = ColorCode("blue+h") + LightMagenta = ColorCode("magenta+h") + LightCyan = ColorCode("cyan+h") + LightWhite = ColorCode("white+h") +} + +// ColorCode returns the ANSI color color code for style. +func ColorCode(style string) string { + return colorCode(style).String() +} + +// Gets the ANSI color code for a style. +func colorCode(style string) *bytes.Buffer { + buf := bytes.NewBufferString("") + if plain || style == "" { + return buf + } + if style == "reset" { + buf.WriteString(Reset) + return buf + } else if style == "off" { + return buf + } + + foregroundBackground := strings.Split(style, ":") + foreground := strings.Split(foregroundBackground[0], "+") + fgKey := foreground[0] + fg := Colors[fgKey] + fgStyle := "" + if len(foreground) > 1 { + fgStyle = foreground[1] + } + + bg, bgStyle := "", "" + + if len(foregroundBackground) > 1 { + background := strings.Split(foregroundBackground[1], "+") + bg = background[0] + if len(background) > 1 { + bgStyle = background[1] + } + } + + buf.WriteString(start) + base := normalIntensityFG + if len(fgStyle) > 0 { + if strings.Contains(fgStyle, "b") { + buf.WriteString(bold) + } + if strings.Contains(fgStyle, "B") { + buf.WriteString(blink) + } + if strings.Contains(fgStyle, "u") { + buf.WriteString(underline) + } + if strings.Contains(fgStyle, "i") { + buf.WriteString(inverse) + } + if strings.Contains(fgStyle, "s") { + buf.WriteString(strikethrough) + } + if strings.Contains(fgStyle, "h") { + base = highIntensityFG + } + } + + // if 256-color + n, err := strconv.Atoi(fgKey) + if err == nil { + fmt.Fprintf(buf, "38;5;%d;", n) + } else { + fmt.Fprintf(buf, "%d;", base+fg) + } + + base = normalIntensityBG + if len(bg) > 0 { + if strings.Contains(bgStyle, "h") { + base = highIntensityBG + } + // if 256-color + n, err := strconv.Atoi(bg) + if err == nil { + fmt.Fprintf(buf, "48;5;%d;", n) + } else { + fmt.Fprintf(buf, "%d;", base+Colors[bg]) + } + } + + // remove last ";" + buf.Truncate(buf.Len() - 1) + buf.WriteRune('m') + return buf +} + +// Color colors a string based on the ANSI color code for style. +func Color(s, style string) string { + if plain || len(style) < 1 { + return s + } + buf := colorCode(style) + buf.WriteString(s) + buf.WriteString(Reset) + return buf.String() +} + +// ColorFunc creates a closure to avoid computation ANSI color code. +func ColorFunc(style string) func(string) string { + if style == "" { + return func(s string) string { + return s + } + } + color := ColorCode(style) + return func(s string) string { + if plain || s == "" { + return s + } + buf := bytes.NewBufferString(color) + buf.WriteString(s) + buf.WriteString(Reset) + result := buf.String() + return result + } +} + +// DisableColors disables ANSI color codes. The default is false (colors are on). +func DisableColors(disable bool) { + plain = disable + if plain { + Black = "" + Red = "" + Green = "" + Yellow = "" + Blue = "" + Magenta = "" + Cyan = "" + White = "" + LightBlack = "" + LightRed = "" + LightGreen = "" + LightYellow = "" + LightBlue = "" + LightMagenta = "" + LightCyan = "" + LightWhite = "" + } else { + Black = ColorCode("black") + Red = ColorCode("red") + Green = ColorCode("green") + Yellow = ColorCode("yellow") + Blue = ColorCode("blue") + Magenta = ColorCode("magenta") + Cyan = ColorCode("cyan") + White = ColorCode("white") + LightBlack = ColorCode("black+h") + LightRed = ColorCode("red+h") + LightGreen = ColorCode("green+h") + LightYellow = ColorCode("yellow+h") + LightBlue = ColorCode("blue+h") + LightMagenta = ColorCode("magenta+h") + LightCyan = ColorCode("cyan+h") + LightWhite = ColorCode("white+h") + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/doc.go new file mode 100755 index 0000000..43c217e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/doc.go @@ -0,0 +1,65 @@ +/* +Package ansi is a small, fast library to create ANSI colored strings and codes. + +Installation + + # this installs the color viewer and the package + go get -u github.com/mgutz/ansi/cmd/ansi-mgutz + +Example + + // colorize a string, SLOW + msg := ansi.Color("foo", "red+b:white") + + // create a closure to avoid recalculating ANSI code compilation + phosphorize := ansi.ColorFunc("green+h:black") + msg = phosphorize("Bring back the 80s!") + msg2 := phospohorize("Look, I'm a CRT!") + + // cache escape codes and build strings manually + lime := ansi.ColorCode("green+h:black") + reset := ansi.ColorCode("reset") + + fmt.Println(lime, "Bring back the 80s!", reset) + +Other examples + + Color(s, "red") // red + Color(s, "red+b") // red bold + Color(s, "red+B") // red blinking + Color(s, "red+u") // red underline + Color(s, "red+bh") // red bold bright + Color(s, "red:white") // red on white + Color(s, "red+b:white+h") // red bold on white bright + Color(s, "red+B:white+h") // red blink on white bright + +To view color combinations, from terminal + + ansi-mgutz + +Style format + + "foregroundColor+attributes:backgroundColor+attributes" + +Colors + + black + red + green + yellow + blue + magenta + cyan + white + +Attributes + + b = bold foreground + B = Blink foreground + u = underline foreground + h = high intensity (bright) foreground, background + i = inverse + +Wikipedia ANSI escape codes [Colors](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) +*/ +package ansi diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/print.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/print.go new file mode 100755 index 0000000..806f436 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mgutz/ansi/print.go @@ -0,0 +1,57 @@ +package ansi + +import ( + "fmt" + "sort" + + colorable "github.com/mattn/go-colorable" +) + +// PrintStyles prints all style combinations to the terminal. +func PrintStyles() { + // for compatibility with Windows, not needed for *nix + stdout := colorable.NewColorableStdout() + + bgColors := []string{ + "", + ":black", + ":red", + ":green", + ":yellow", + ":blue", + ":magenta", + ":cyan", + ":white", + } + + keys := make([]string, 0, len(Colors)) + for k := range Colors { + keys = append(keys, k) + } + + sort.Sort(sort.StringSlice(keys)) + + for _, fg := range keys { + for _, bg := range bgColors { + fmt.Fprintln(stdout, padColor(fg, []string{"" + bg, "+b" + bg, "+bh" + bg, "+u" + bg})) + fmt.Fprintln(stdout, padColor(fg, []string{"+s" + bg, "+i" + bg})) + fmt.Fprintln(stdout, padColor(fg, []string{"+uh" + bg, "+B" + bg, "+Bb" + bg /* backgrounds */, "" + bg + "+h"})) + fmt.Fprintln(stdout, padColor(fg, []string{"+b" + bg + "+h", "+bh" + bg + "+h", "+u" + bg + "+h", "+uh" + bg + "+h"})) + } + } +} + +func pad(s string, length int) string { + for len(s) < length { + s += " " + } + return s +} + +func padColor(color string, styles []string) string { + buffer := "" + for _, style := range styles { + buffer += Color(pad(color+style, 20), color+style) + } + return buffer +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml new file mode 100755 index 0000000..d9deadb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -0,0 +1,8 @@ +language: go + +go: + - 1.9.x + - tip + +script: + - go test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE new file mode 100755 index 0000000..f9c841a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/README.md new file mode 100755 index 0000000..0018dc7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/README.md @@ -0,0 +1,46 @@ +# mapstructure [![Godoc](https://godoc.org/github.com/mitchellh/mapstructure?status.svg)](https://godoc.org/github.com/mitchellh/mapstructure) + +mapstructure is a Go library for decoding generic map values to structures +and vice versa, while providing helpful error handling. + +This library is most useful when decoding values from some data stream (JSON, +Gob, etc.) where you don't _quite_ know the structure of the underlying data +until you read a part of it. You can therefore read a `map[string]interface{}` +and use this library to decode it into the proper underlying native Go +structure. + +## Installation + +Standard `go get`: + +``` +$ go get github.com/mitchellh/mapstructure +``` + +## Usage & Example + +For usage and examples see the [Godoc](http://godoc.org/github.com/mitchellh/mapstructure). + +The `Decode` function has examples associated with it there. + +## But Why?! + +Go offers fantastic standard libraries for decoding formats such as JSON. +The standard method is to have a struct pre-created, and populate that struct +from the bytes of the encoded format. This is great, but the problem is if +you have configuration or an encoding that changes slightly depending on +specific fields. For example, consider this JSON: + +```json +{ + "type": "person", + "name": "Mitchell" +} +``` + +Perhaps we can't populate a specific structure without first reading +the "type" field from the JSON. We could always do two passes over the +decoding of the JSON (reading the "type" first, and the rest later). +However, it is much simpler to just decode this into a `map[string]interface{}` +structure, read the "type" key, then use something like this library +to decode it into the proper structure. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go new file mode 100755 index 0000000..2a72757 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -0,0 +1,171 @@ +package mapstructure + +import ( + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +// typedDecodeHook takes a raw DecodeHookFunc (an interface{}) and turns +// it into the proper DecodeHookFunc type, such as DecodeHookFuncType. +func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { + // Create variables here so we can reference them with the reflect pkg + var f1 DecodeHookFuncType + var f2 DecodeHookFuncKind + + // Fill in the variables into this interface and the rest is done + // automatically using the reflect package. + potential := []interface{}{f1, f2} + + v := reflect.ValueOf(h) + vt := v.Type() + for _, raw := range potential { + pt := reflect.ValueOf(raw).Type() + if vt.ConvertibleTo(pt) { + return v.Convert(pt).Interface() + } + } + + return nil +} + +// DecodeHookExec executes the given decode hook. This should be used +// since it'll naturally degrade to the older backwards compatible DecodeHookFunc +// that took reflect.Kind instead of reflect.Type. +func DecodeHookExec( + raw DecodeHookFunc, + from reflect.Type, to reflect.Type, + data interface{}) (interface{}, error) { + switch f := typedDecodeHook(raw).(type) { + case DecodeHookFuncType: + return f(from, to, data) + case DecodeHookFuncKind: + return f(from.Kind(), to.Kind(), data) + default: + return nil, errors.New("invalid decode hook signature") + } +} + +// ComposeDecodeHookFunc creates a single DecodeHookFunc that +// automatically composes multiple DecodeHookFuncs. +// +// The composed funcs are called in order, with the result of the +// previous transformation. +func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + var err error + for _, f1 := range fs { + data, err = DecodeHookExec(f1, f, t, data) + if err != nil { + return nil, err + } + + // Modify the from kind to be correct with the new data + f = nil + if val := reflect.ValueOf(data); val.IsValid() { + f = val.Type() + } + } + + return data, nil + } +} + +// StringToSliceHookFunc returns a DecodeHookFunc that converts +// string to []string by splitting on the given sep. +func StringToSliceHookFunc(sep string) DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + if f != reflect.String || t != reflect.Slice { + return data, nil + } + + raw := data.(string) + if raw == "" { + return []string{}, nil + } + + return strings.Split(raw, sep), nil + } +} + +// StringToTimeDurationHookFunc returns a DecodeHookFunc that converts +// strings to time.Duration. +func StringToTimeDurationHookFunc() DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Duration(5)) { + return data, nil + } + + // Convert it by parsing + return time.ParseDuration(data.(string)) + } +} + +// StringToTimeHookFunc returns a DecodeHookFunc that converts +// strings to time.Time. +func StringToTimeHookFunc(layout string) DecodeHookFunc { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + if t != reflect.TypeOf(time.Time{}) { + return data, nil + } + + // Convert it by parsing + return time.Parse(layout, data.(string)) + } +} + +// WeaklyTypedHook is a DecodeHookFunc which adds support for weak typing to +// the decoder. +// +// Note that this is significantly different from the WeaklyTypedInput option +// of the DecoderConfig. +func WeaklyTypedHook( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + dataVal := reflect.ValueOf(data) + switch t { + case reflect.String: + switch f { + case reflect.Bool: + if dataVal.Bool() { + return "1", nil + } + return "0", nil + case reflect.Float32: + return strconv.FormatFloat(dataVal.Float(), 'f', -1, 64), nil + case reflect.Int: + return strconv.FormatInt(dataVal.Int(), 10), nil + case reflect.Slice: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + if elemKind == reflect.Uint8 { + return string(dataVal.Interface().([]uint8)), nil + } + case reflect.Uint: + return strconv.FormatUint(dataVal.Uint(), 10), nil + } + } + + return data, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/error.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/error.go new file mode 100755 index 0000000..47a99e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/error.go @@ -0,0 +1,50 @@ +package mapstructure + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Error implements the error interface and can represents multiple +// errors that occur in the course of a single decode. +type Error struct { + Errors []string +} + +func (e *Error) Error() string { + points := make([]string, len(e.Errors)) + for i, err := range e.Errors { + points[i] = fmt.Sprintf("* %s", err) + } + + sort.Strings(points) + return fmt.Sprintf( + "%d error(s) decoding:\n\n%s", + len(e.Errors), strings.Join(points, "\n")) +} + +// WrappedErrors implements the errwrap.Wrapper interface to make this +// return value more useful with the errwrap and go-multierror libraries. +func (e *Error) WrappedErrors() []error { + if e == nil { + return nil + } + + result := make([]error, len(e.Errors)) + for i, e := range e.Errors { + result[i] = errors.New(e) + } + + return result +} + +func appendErrors(errors []string, err error) []string { + switch e := err.(type) { + case *Error: + return append(errors, e.Errors...) + default: + return append(errors, e.Error()) + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go new file mode 100755 index 0000000..13cc5e3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -0,0 +1,1061 @@ +// Package mapstructure exposes functionality to convert an arbitrary +// map[string]interface{} into a native Go structure. +// +// The Go structure can be arbitrarily complex, containing slices, +// other structs, etc. and the decoder will properly decode nested +// maps and so on into the proper structures in the native Go struct. +// See the examples to see what the decoder is capable of. +package mapstructure + +import ( + "encoding/json" + "errors" + "fmt" + "reflect" + "sort" + "strconv" + "strings" +) + +// DecodeHookFunc is the callback function that can be used for +// data transformations. See "DecodeHook" in the DecoderConfig +// struct. +// +// The type should be DecodeHookFuncType or DecodeHookFuncKind. +// Either is accepted. Types are a superset of Kinds (Types can return +// Kinds) and are generally a richer thing to use, but Kinds are simpler +// if you only need those. +// +// The reason DecodeHookFunc is multi-typed is for backwards compatibility: +// we started with Kinds and then realized Types were the better solution, +// but have a promise to not break backwards compat so we now support +// both. +type DecodeHookFunc interface{} + +// DecodeHookFuncType is a DecodeHookFunc which has complete information about +// the source and target types. +type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface{}, error) + +// DecodeHookFuncKind is a DecodeHookFunc which knows only the Kinds of the +// source and target types. +type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) + +// DecoderConfig is the configuration that is used to create a new decoder +// and allows customization of various aspects of decoding. +type DecoderConfig struct { + // DecodeHook, if set, will be called before any decoding and any + // type conversion (if WeaklyTypedInput is on). This lets you modify + // the values before they're set down onto the resulting struct. + // + // If an error is returned, the entire decode will fail with that + // error. + DecodeHook DecodeHookFunc + + // If ErrorUnused is true, then it is an error for there to exist + // keys in the original map that were unused in the decoding process + // (extra keys). + ErrorUnused bool + + // ZeroFields, if set to true, will zero fields before writing them. + // For example, a map will be emptied before decoded values are put in + // it. If this is false, a map will be merged. + ZeroFields bool + + // If WeaklyTypedInput is true, the decoder will make the following + // "weak" conversions: + // + // - bools to string (true = "1", false = "0") + // - numbers to string (base 10) + // - bools to int/uint (true = 1, false = 0) + // - strings to int/uint (base implied by prefix) + // - int to bool (true if value != 0) + // - string to bool (accepts: 1, t, T, TRUE, true, True, 0, f, F, + // FALSE, false, False. Anything else is an error) + // - empty array = empty map and vice versa + // - negative numbers to overflowed uint values (base 10) + // - slice of maps to a merged map + // - single values are converted to slices if required. Each + // element is weakly decoded. For example: "4" can become []int{4} + // if the target type is an int slice. + // + WeaklyTypedInput bool + + // Metadata is the struct that will contain extra metadata about + // the decoding. If this is nil, then no metadata will be tracked. + Metadata *Metadata + + // Result is a pointer to the struct that will contain the decoded + // value. + Result interface{} + + // The tag name that mapstructure reads for field names. This + // defaults to "mapstructure" + TagName string +} + +// A Decoder takes a raw interface value and turns it into structured +// data, keeping track of rich error information along the way in case +// anything goes wrong. Unlike the basic top-level Decode method, you can +// more finely control how the Decoder behaves using the DecoderConfig +// structure. The top-level Decode method is just a convenience that sets +// up the most basic Decoder. +type Decoder struct { + config *DecoderConfig +} + +// Metadata contains information about decoding a structure that +// is tedious or difficult to get otherwise. +type Metadata struct { + // Keys are the keys of the structure which were successfully decoded + Keys []string + + // Unused is a slice of keys that were found in the raw value but + // weren't decoded since there was no matching field in the result interface + Unused []string +} + +// Decode takes an input structure and uses reflection to translate it to +// the output structure. output must be a pointer to a map or struct. +func Decode(input interface{}, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecode is the same as Decode but is shorthand to enable +// WeaklyTypedInput. See DecoderConfig for more info. +func WeakDecode(input, output interface{}) error { + config := &DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// DecodeMetadata is the same as Decode, but is shorthand to +// enable metadata collection. See DecoderConfig for more info. +func DecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// WeakDecodeMetadata is the same as Decode, but is shorthand to +// enable both WeaklyTypedInput and metadata collection. See +// DecoderConfig for more info. +func WeakDecodeMetadata(input interface{}, output interface{}, metadata *Metadata) error { + config := &DecoderConfig{ + Metadata: metadata, + Result: output, + WeaklyTypedInput: true, + } + + decoder, err := NewDecoder(config) + if err != nil { + return err + } + + return decoder.Decode(input) +} + +// NewDecoder returns a new decoder for the given configuration. Once +// a decoder has been returned, the same configuration must not be used +// again. +func NewDecoder(config *DecoderConfig) (*Decoder, error) { + val := reflect.ValueOf(config.Result) + if val.Kind() != reflect.Ptr { + return nil, errors.New("result must be a pointer") + } + + val = val.Elem() + if !val.CanAddr() { + return nil, errors.New("result must be addressable (a pointer)") + } + + if config.Metadata != nil { + if config.Metadata.Keys == nil { + config.Metadata.Keys = make([]string, 0) + } + + if config.Metadata.Unused == nil { + config.Metadata.Unused = make([]string, 0) + } + } + + if config.TagName == "" { + config.TagName = "mapstructure" + } + + result := &Decoder{ + config: config, + } + + return result, nil +} + +// Decode decodes the given raw interface to the target pointer specified +// by the configuration. +func (d *Decoder) Decode(input interface{}) error { + return d.decode("", input, reflect.ValueOf(d.config.Result).Elem()) +} + +// Decodes an unknown data type into a specific reflection value. +func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) error { + if input == nil { + // If the data is nil, then we don't set anything, unless ZeroFields is set + // to true. + if d.config.ZeroFields { + outVal.Set(reflect.Zero(outVal.Type())) + + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + } + return nil + } + + inputVal := reflect.ValueOf(input) + if !inputVal.IsValid() { + // If the input value is invalid, then we just set the value + // to be the zero value. + outVal.Set(reflect.Zero(outVal.Type())) + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + return nil + } + + if d.config.DecodeHook != nil { + // We have a DecodeHook, so let's pre-process the input. + var err error + input, err = DecodeHookExec( + d.config.DecodeHook, + inputVal.Type(), outVal.Type(), input) + if err != nil { + return fmt.Errorf("error decoding '%s': %s", name, err) + } + } + + var err error + inputKind := getKind(outVal) + switch inputKind { + case reflect.Bool: + err = d.decodeBool(name, input, outVal) + case reflect.Interface: + err = d.decodeBasic(name, input, outVal) + case reflect.String: + err = d.decodeString(name, input, outVal) + case reflect.Int: + err = d.decodeInt(name, input, outVal) + case reflect.Uint: + err = d.decodeUint(name, input, outVal) + case reflect.Float32: + err = d.decodeFloat(name, input, outVal) + case reflect.Struct: + err = d.decodeStruct(name, input, outVal) + case reflect.Map: + err = d.decodeMap(name, input, outVal) + case reflect.Ptr: + err = d.decodePtr(name, input, outVal) + case reflect.Slice: + err = d.decodeSlice(name, input, outVal) + case reflect.Array: + err = d.decodeArray(name, input, outVal) + case reflect.Func: + err = d.decodeFunc(name, input, outVal) + default: + // If we reached this point then we weren't able to decode it + return fmt.Errorf("%s: unsupported type: %s", name, inputKind) + } + + // If we reached here, then we successfully decoded SOMETHING, so + // mark the key as used if we're tracking metainput. + if d.config.Metadata != nil && name != "" { + d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) + } + + return err +} + +// This decodes a basic type (bool, int, string, etc.) and sets the +// value to "data" of that type. +func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { + if val.IsValid() && val.Elem().IsValid() { + return d.decode(name, data, val.Elem()) + } + dataVal := reflect.ValueOf(data) + if !dataVal.IsValid() { + dataVal = reflect.Zero(val.Type()) + } + + dataValType := dataVal.Type() + if !dataValType.AssignableTo(val.Type()) { + return fmt.Errorf( + "'%s' expected type '%s', got '%s'", + name, val.Type(), dataValType) + } + + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + converted := true + switch { + case dataKind == reflect.String: + val.SetString(dataVal.String()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetString("1") + } else { + val.SetString("0") + } + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatInt(dataVal.Int(), 10)) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatUint(dataVal.Uint(), 10)) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetString(strconv.FormatFloat(dataVal.Float(), 'f', -1, 64)) + case dataKind == reflect.Slice && d.config.WeaklyTypedInput, + dataKind == reflect.Array && d.config.WeaklyTypedInput: + dataType := dataVal.Type() + elemKind := dataType.Elem().Kind() + switch elemKind { + case reflect.Uint8: + var uints []uint8 + if dataKind == reflect.Array { + uints = make([]uint8, dataVal.Len(), dataVal.Len()) + for i := range uints { + uints[i] = dataVal.Index(i).Interface().(uint8) + } + } else { + uints = dataVal.Interface().([]uint8) + } + val.SetString(string(uints)) + default: + converted = false + } + default: + converted = false + } + + if !converted { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetInt(dataVal.Int()) + case dataKind == reflect.Uint: + val.SetInt(int64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetInt(int64(dataVal.Float())) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetInt(1) + } else { + val.SetInt(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetInt(i) + } else { + return fmt.Errorf("cannot parse '%s' as int: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetInt(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Int: + i := dataVal.Int() + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) + case dataKind == reflect.Uint: + val.SetUint(dataVal.Uint()) + case dataKind == reflect.Float32: + f := dataVal.Float() + if f < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %f overflows uint", + name, f) + } + val.SetUint(uint64(f)) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetUint(1) + } else { + val.SetUint(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + if err == nil { + val.SetUint(i) + } else { + return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + + switch { + case dataKind == reflect.Bool: + val.SetBool(dataVal.Bool()) + case dataKind == reflect.Int && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Int() != 0) + case dataKind == reflect.Uint && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Uint() != 0) + case dataKind == reflect.Float32 && d.config.WeaklyTypedInput: + val.SetBool(dataVal.Float() != 0) + case dataKind == reflect.String && d.config.WeaklyTypedInput: + b, err := strconv.ParseBool(dataVal.String()) + if err == nil { + val.SetBool(b) + } else if dataVal.String() == "" { + val.SetBool(false) + } else { + return fmt.Errorf("cannot parse '%s' as bool: %s", name, err) + } + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.ValueOf(data) + dataKind := getKind(dataVal) + dataType := dataVal.Type() + + switch { + case dataKind == reflect.Int: + val.SetFloat(float64(dataVal.Int())) + case dataKind == reflect.Uint: + val.SetFloat(float64(dataVal.Uint())) + case dataKind == reflect.Float32: + val.SetFloat(dataVal.Float()) + case dataKind == reflect.Bool && d.config.WeaklyTypedInput: + if dataVal.Bool() { + val.SetFloat(1) + } else { + val.SetFloat(0) + } + case dataKind == reflect.String && d.config.WeaklyTypedInput: + f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + if err == nil { + val.SetFloat(f) + } else { + return fmt.Errorf("cannot parse '%s' as float: %s", name, err) + } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Float64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + val.SetFloat(i) + default: + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + + return nil +} + +func (d *Decoder) decodeMap(name string, data interface{}, val reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // By default we overwrite keys in the current map + valMap := val + + // If the map is nil or we're purposely zeroing fields, make a new map + if valMap.IsNil() || d.config.ZeroFields { + // Make a new map to hold our result + mapType := reflect.MapOf(valKeyType, valElemType) + valMap = reflect.MakeMap(mapType) + } + + // Check input type and based on the input type jump to the proper func + dataVal := reflect.Indirect(reflect.ValueOf(data)) + switch dataVal.Kind() { + case reflect.Map: + return d.decodeMapFromMap(name, dataVal, val, valMap) + + case reflect.Struct: + return d.decodeMapFromStruct(name, dataVal, val, valMap) + + case reflect.Array, reflect.Slice: + if d.config.WeaklyTypedInput { + return d.decodeMapFromSlice(name, dataVal, val, valMap) + } + + fallthrough + + default: + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataVal.Kind()) + } +} + +func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + // Special case for BC reasons (covered by tests) + if dataVal.Len() == 0 { + val.Set(valMap) + return nil + } + + for i := 0; i < dataVal.Len(); i++ { + err := d.decode( + fmt.Sprintf("%s[%d]", name, i), + dataVal.Index(i).Interface(), val) + if err != nil { + return err + } + } + + return nil +} + +func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + valType := val.Type() + valKeyType := valType.Key() + valElemType := valType.Elem() + + // Accumulate errors + errors := make([]string, 0) + + for _, k := range dataVal.MapKeys() { + fieldName := fmt.Sprintf("%s[%s]", name, k) + + // First decode the key into the proper type + currentKey := reflect.Indirect(reflect.New(valKeyType)) + if err := d.decode(fieldName, k.Interface(), currentKey); err != nil { + errors = appendErrors(errors, err) + continue + } + + // Next decode the data into the proper type + v := dataVal.MapIndex(k).Interface() + currentVal := reflect.Indirect(reflect.New(valElemType)) + if err := d.decode(fieldName, v, currentVal); err != nil { + errors = appendErrors(errors, err) + continue + } + + valMap.SetMapIndex(currentKey, currentVal) + } + + // Set the built up map to the value + val.Set(valMap) + + // If we had errors, return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val reflect.Value, valMap reflect.Value) error { + typ := dataVal.Type() + for i := 0; i < typ.NumField(); i++ { + // Get the StructField first since this is a cheap operation. If the + // field is unexported, then ignore it. + f := typ.Field(i) + if f.PkgPath != "" { + continue + } + + // Next get the actual value of this field and verify it is assignable + // to the map value. + v := dataVal.Field(i) + if !v.Type().AssignableTo(valMap.Type().Elem()) { + return fmt.Errorf("cannot assign type '%s' to map value field of type '%s'", v.Type(), valMap.Type().Elem()) + } + + tagValue := f.Tag.Get(d.config.TagName) + tagParts := strings.Split(tagValue, ",") + + // Determine the name of the key in the map + keyName := f.Name + if tagParts[0] != "" { + if tagParts[0] == "-" { + continue + } + keyName = tagParts[0] + } + + // If "squash" is specified in the tag, we squash the field down. + squash := false + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } + + switch v.Kind() { + // this is an embedded struct, so handle it differently + case reflect.Struct: + x := reflect.New(v.Type()) + x.Elem().Set(v) + + vType := valMap.Type() + vKeyType := vType.Key() + vElemType := vType.Elem() + mType := reflect.MapOf(vKeyType, vElemType) + vMap := reflect.MakeMap(mType) + + err := d.decode(keyName, x.Interface(), vMap) + if err != nil { + return err + } + + if squash { + for _, k := range vMap.MapKeys() { + valMap.SetMapIndex(k, vMap.MapIndex(k)) + } + } else { + valMap.SetMapIndex(reflect.ValueOf(keyName), vMap) + } + + default: + valMap.SetMapIndex(reflect.ValueOf(keyName), v) + } + } + + if val.CanAddr() { + val.Set(valMap) + } + + return nil +} + +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + valType := val.Type() + valElemType := valType.Elem() + + if val.CanSet() { + realVal := val + if realVal.IsNil() || d.config.ZeroFields { + realVal = reflect.New(valElemType) + } + + if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { + return err + } + + val.Set(realVal) + } else { + if err := d.decode(name, data, reflect.Indirect(val)); err != nil { + return err + } + } + return nil +} + +func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { + // Create an element of the concrete (non pointer) type and decode + // into that. Then set the value of the pointer to this type. + dataVal := reflect.Indirect(reflect.ValueOf(data)) + if val.Type() != dataVal.Type() { + return fmt.Errorf( + "'%s' expected type '%s', got unconvertible type '%s'", + name, val.Type(), dataVal.Type()) + } + val.Set(dataVal) + return nil +} + +func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + sliceType := reflect.SliceOf(valElemType) + + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty slices + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.MakeSlice(sliceType, 0, 0)) + return nil + } + case dataValKind == reflect.String && valElemType.Kind() == reflect.Uint8: + return d.decodeSlice(name, []byte(dataVal.String()), val) + // All other types we try to convert to the slice type + // and "lift" it into it. i.e. a string becomes a string slice. + default: + // Just re-try this function with data as a slice. + return d.decodeSlice(name, []interface{}{data}, val) + } + } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + + // Make a new slice to hold our result, same size as the original data. + valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + for valSlice.Len() <= i { + valSlice = reflect.Append(valSlice, reflect.Zero(valElemType)) + } + currentField := valSlice.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the slice we built up + val.Set(valSlice) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + dataValKind := dataVal.Kind() + valType := val.Type() + valElemType := valType.Elem() + arrayType := reflect.ArrayOf(valType.Len(), valElemType) + + valArray := val + + if valArray.Interface() == reflect.Zero(valArray.Type()).Interface() || d.config.ZeroFields { + // Check input type + if dataValKind != reflect.Array && dataValKind != reflect.Slice { + if d.config.WeaklyTypedInput { + switch { + // Empty maps turn into empty arrays + case dataValKind == reflect.Map: + if dataVal.Len() == 0 { + val.Set(reflect.Zero(arrayType)) + return nil + } + + // All other types we try to convert to the array type + // and "lift" it into it. i.e. a string becomes a string array. + default: + // Just re-try this function with data as a slice. + return d.decodeArray(name, []interface{}{data}, val) + } + } + + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + + } + if dataVal.Len() > arrayType.Len() { + return fmt.Errorf( + "'%s': expected source data to have length less or equal to %d, got %d", name, arrayType.Len(), dataVal.Len()) + + } + + // Make a new array to hold our result, same size as the original data. + valArray = reflect.New(arrayType).Elem() + } + + // Accumulate any errors + errors := make([]string, 0) + + for i := 0; i < dataVal.Len(); i++ { + currentData := dataVal.Index(i).Interface() + currentField := valArray.Index(i) + + fieldName := fmt.Sprintf("%s[%d]", name, i) + if err := d.decode(fieldName, currentData, currentField); err != nil { + errors = appendErrors(errors, err) + } + } + + // Finally, set the value to the array we built up + val.Set(valArray) + + // If there were errors, we return those + if len(errors) > 0 { + return &Error{errors} + } + + return nil +} + +func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) error { + dataVal := reflect.Indirect(reflect.ValueOf(data)) + + // If the type of the value to write to and the data match directly, + // then we just set it directly instead of recursing into the structure. + if dataVal.Type() == val.Type() { + val.Set(dataVal) + return nil + } + + dataValKind := dataVal.Kind() + if dataValKind != reflect.Map { + return fmt.Errorf("'%s' expected a map, got '%s'", name, dataValKind) + } + + dataValType := dataVal.Type() + if kind := dataValType.Key().Kind(); kind != reflect.String && kind != reflect.Interface { + return fmt.Errorf( + "'%s' needs a map with string keys, has '%s' keys", + name, dataValType.Key().Kind()) + } + + dataValKeys := make(map[reflect.Value]struct{}) + dataValKeysUnused := make(map[interface{}]struct{}) + for _, dataValKey := range dataVal.MapKeys() { + dataValKeys[dataValKey] = struct{}{} + dataValKeysUnused[dataValKey.Interface()] = struct{}{} + } + + errors := make([]string, 0) + + // This slice will keep track of all the structs we'll be decoding. + // There can be more than one struct if there are embedded structs + // that are squashed. + structs := make([]reflect.Value, 1, 5) + structs[0] = val + + // Compile the list of all the fields that we're going to be decoding + // from all the structs. + type field struct { + field reflect.StructField + val reflect.Value + } + fields := []field{} + for len(structs) > 0 { + structVal := structs[0] + structs = structs[1:] + + structType := structVal.Type() + + for i := 0; i < structType.NumField(); i++ { + fieldType := structType.Field(i) + fieldKind := fieldType.Type.Kind() + + // If "squash" is specified in the tag, we squash the field down. + squash := false + tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") + for _, tag := range tagParts[1:] { + if tag == "squash" { + squash = true + break + } + } + + if squash { + if fieldKind != reflect.Struct { + errors = appendErrors(errors, + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + } else { + structs = append(structs, structVal.FieldByName(fieldType.Name)) + } + continue + } + + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } + } + + // for fieldType, field := range fields { + for _, f := range fields { + field, fieldValue := f.field, f.val + fieldName := field.Name + + tagValue := field.Tag.Get(d.config.TagName) + tagValue = strings.SplitN(tagValue, ",", 2)[0] + if tagValue != "" { + fieldName = tagValue + } + + rawMapKey := reflect.ValueOf(fieldName) + rawMapVal := dataVal.MapIndex(rawMapKey) + if !rawMapVal.IsValid() { + // Do a slower search by iterating over each key and + // doing case-insensitive search. + for dataValKey := range dataValKeys { + mK, ok := dataValKey.Interface().(string) + if !ok { + // Not a string key + continue + } + + if strings.EqualFold(mK, fieldName) { + rawMapKey = dataValKey + rawMapVal = dataVal.MapIndex(dataValKey) + break + } + } + + if !rawMapVal.IsValid() { + // There was no matching key in the map for the value in + // the struct. Just ignore. + continue + } + } + + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + + if !fieldValue.IsValid() { + // This should never happen + panic("field is not valid") + } + + // If we can't set the field, then it is unexported or something, + // and we just continue onwards. + if !fieldValue.CanSet() { + continue + } + + // If the name is empty string, then we're at the root, and we + // don't dot-join the fields. + if name != "" { + fieldName = fmt.Sprintf("%s.%s", name, fieldName) + } + + if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { + errors = appendErrors(errors, err) + } + } + + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { + keys := make([]string, 0, len(dataValKeysUnused)) + for rawKey := range dataValKeysUnused { + keys = append(keys, rawKey.(string)) + } + sort.Strings(keys) + + err := fmt.Errorf("'%s' has invalid keys: %s", name, strings.Join(keys, ", ")) + errors = appendErrors(errors, err) + } + + if len(errors) > 0 { + return &Error{errors} + } + + // Add the unused keys to the list of unused keys if we're tracking metadata + if d.config.Metadata != nil { + for rawKey := range dataValKeysUnused { + key := rawKey.(string) + if name != "" { + key = fmt.Sprintf("%s.%s", name, key) + } + + d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) + } + } + + return nil +} + +func getKind(val reflect.Value) reflect.Kind { + kind := val.Kind() + + switch { + case kind >= reflect.Int && kind <= reflect.Int64: + return reflect.Int + case kind >= reflect.Uint && kind <= reflect.Uint64: + return reflect.Uint + case kind >= reflect.Float32 && kind <= reflect.Float64: + return reflect.Float32 + default: + return kind + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.gitignore new file mode 100755 index 0000000..99e38bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.gitignore @@ -0,0 +1,2 @@ +test_program/test_program_bin +fuzz/ diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml new file mode 100755 index 0000000..ab2775d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/.travis.yml @@ -0,0 +1,22 @@ +sudo: false +language: go +go: + - 1.8.5 + - 1.9.2 + - tip +matrix: + allow_failures: + - go: tip + fast_finish: true +script: + - if [ -n "$(go fmt ./...)" ]; then exit 1; fi + - ./test.sh + - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git +before_install: + - go get github.com/axw/gocov/gocov + - go get github.com/mattn/goveralls + - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi +branches: + only: [master] +after_success: + - $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/LICENSE new file mode 100755 index 0000000..583bdae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +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/skycoin/skycoin/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/README.md new file mode 100755 index 0000000..0d357ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/README.md @@ -0,0 +1,131 @@ +# go-toml + +Go library for the [TOML](https://github.com/mojombo/toml) format. + +This library supports TOML version +[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) + +[![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) +[![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) +[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) +[![Coverage Status](https://coveralls.io/repos/github/pelletier/go-toml/badge.svg?branch=master)](https://coveralls.io/github/pelletier/go-toml?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) + +## Features + +Go-toml provides the following features for using data parsed from TOML documents: + +* Load TOML documents from files and string data +* Easily navigate TOML structure using Tree +* Mashaling and unmarshaling to and from data structures +* Line & column position data for all parsed elements +* [Query support similar to JSON-Path](query/) +* Syntax errors contain line and column numbers + +## Import + +```go +import "github.com/pelletier/go-toml" +``` + +## Usage example + +Read a TOML document: + +```go +config, _ := toml.Load(` +[postgres] +user = "pelletier" +password = "mypassword"`) +// retrieve data directly +user := config.Get("postgres.user").(string) + +// or using an intermediate object +postgresConfig := config.Get("postgres").(*toml.Tree) +password := postgresConfig.Get("password").(string) +``` + +Or use Unmarshal: + +```go +type Postgres struct { + User string + Password string +} +type Config struct { + Postgres Postgres +} + +doc := []byte(` +[Postgres] +User = "pelletier" +Password = "mypassword"`) + +config := Config{} +toml.Unmarshal(doc, &config) +fmt.Println("user=", config.Postgres.User) +``` + +Or use a query: + +```go +// use a query to gather elements without walking the tree +q, _ := query.Compile("$..[user,password]") +results := q.Execute(config) +for ii, item := range results.Values() { + fmt.Println("Query result %d: %v", ii, item) +} +``` + +## Documentation + +The documentation and additional examples are available at +[godoc.org](http://godoc.org/github.com/pelletier/go-toml). + +## Tools + +Go-toml provides two handy command line tools: + +* `tomll`: Reads TOML files and lint them. + + ``` + go install github.com/pelletier/go-toml/cmd/tomll + tomll --help + ``` +* `tomljson`: Reads a TOML file and outputs its JSON representation. + + ``` + go install github.com/pelletier/go-toml/cmd/tomljson + tomljson --help + ``` + +## Contribute + +Feel free to report bugs and patches using GitHub's pull requests system on +[pelletier/go-toml](https://github.com/pelletier/go-toml). Any feedback would be +much appreciated! + +### Run tests + +You have to make sure two kind of tests run: + +1. The Go unit tests +2. The TOML examples base + +You can run both of them using `./test.sh`. + +### Fuzzing + +The script `./fuzz.sh` is available to +run [go-fuzz](https://github.com/dvyukov/go-fuzz) on go-toml. + +## Versioning + +Go-toml follows [Semantic Versioning](http://semver.org/). The supported version +of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of +this document. The last two major versions of Go are supported +(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)). + +## License + +The MIT License (MIT). Read [LICENSE](LICENSE). diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json new file mode 100755 index 0000000..86f99c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.json @@ -0,0 +1,164 @@ +{ + "array": { + "key1": [ + 1, + 2, + 3 + ], + "key2": [ + "red", + "yellow", + "green" + ], + "key3": [ + [ + 1, + 2 + ], + [ + 3, + 4, + 5 + ] + ], + "key4": [ + [ + 1, + 2 + ], + [ + "a", + "b", + "c" + ] + ], + "key5": [ + 1, + 2, + 3 + ], + "key6": [ + 1, + 2 + ] + }, + "boolean": { + "False": false, + "True": true + }, + "datetime": { + "key1": "1979-05-27T07:32:00Z", + "key2": "1979-05-27T00:32:00-07:00", + "key3": "1979-05-27T00:32:00.999999-07:00" + }, + "float": { + "both": { + "key": 6.626e-34 + }, + "exponent": { + "key1": 5e+22, + "key2": 1000000, + "key3": -0.02 + }, + "fractional": { + "key1": 1, + "key2": 3.1415, + "key3": -0.01 + }, + "underscores": { + "key1": 9224617.445991227, + "key2": 1e+100 + } + }, + "fruit": [{ + "name": "apple", + "physical": { + "color": "red", + "shape": "round" + }, + "variety": [{ + "name": "red delicious" + }, + { + "name": "granny smith" + } + ] + }, + { + "name": "banana", + "variety": [{ + "name": "plantain" + }] + } + ], + "integer": { + "key1": 99, + "key2": 42, + "key3": 0, + "key4": -17, + "underscores": { + "key1": 1000, + "key2": 5349221, + "key3": 12345 + } + }, + "products": [{ + "name": "Hammer", + "sku": 738594937 + }, + {}, + { + "color": "gray", + "name": "Nail", + "sku": 284758393 + } + ], + "string": { + "basic": { + "basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + }, + "literal": { + "multiline": { + "lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n", + "regex2": "I [dw]on't need \\d{2} apples" + }, + "quoted": "Tom \"Dubs\" Preston-Werner", + "regex": "\u003c\\i\\c*\\s*\u003e", + "winpath": "C:\\Users\\nodejs\\templates", + "winpath2": "\\\\ServerX\\admin$\\system32\\" + }, + "multiline": { + "continued": { + "key1": "The quick brown fox jumps over the lazy dog.", + "key2": "The quick brown fox jumps over the lazy dog.", + "key3": "The quick brown fox jumps over the lazy dog." + }, + "key1": "One\nTwo", + "key2": "One\nTwo", + "key3": "One\nTwo" + } + }, + "table": { + "inline": { + "name": { + "first": "Tom", + "last": "Preston-Werner" + }, + "point": { + "x": 1, + "y": 2 + } + }, + "key": "value", + "subtable": { + "key": "another value" + } + }, + "x": { + "y": { + "z": { + "w": {} + } + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh new file mode 100755 index 0000000..8b8bb52 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -e + +reference_ref=${1:-master} +reference_git=${2:-.} + +if ! `hash benchstat 2>/dev/null`; then + echo "Installing benchstat" + go get golang.org/x/perf/cmd/benchstat + go install golang.org/x/perf/cmd/benchstat +fi + +tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` +ref_tempdir="${tempdir}/ref" +ref_benchmark="${ref_tempdir}/benchmark-`echo -n ${reference_ref}|tr -s '/' '-'`.txt" +local_benchmark="`pwd`/benchmark-local.txt" + +echo "=== ${reference_ref} (${ref_tempdir})" +git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null +pushd ${ref_tempdir} >/dev/null +git checkout ${reference_ref} >/dev/null 2>/dev/null +go test -bench=. -benchmem | tee ${ref_benchmark} +popd >/dev/null + +echo "" +echo "=== local" +go test -bench=. -benchmem | tee ${local_benchmark} + +echo "" +echo "=== diff" +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml new file mode 100755 index 0000000..dfd77e0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.toml @@ -0,0 +1,244 @@ +################################################################################ +## Comment + +# Speak your mind with the hash symbol. They go from the symbol to the end of +# the line. + + +################################################################################ +## Table + +# Tables (also known as hash tables or dictionaries) are collections of +# key/value pairs. They appear in square brackets on a line by themselves. + +[table] + +key = "value" # Yeah, you can do this. + +# Nested tables are denoted by table names with dots in them. Name your tables +# whatever crap you please, just don't use #, ., [ or ]. + +[table.subtable] + +key = "another value" + +# You don't need to specify all the super-tables if you don't want to. TOML +# knows how to do it for you. + +# [x] you +# [x.y] don't +# [x.y.z] need these +[x.y.z.w] # for this to work + + +################################################################################ +## Inline Table + +# Inline tables provide a more compact syntax for expressing tables. They are +# especially useful for grouped data that can otherwise quickly become verbose. +# Inline tables are enclosed in curly braces `{` and `}`. No newlines are +# allowed between the curly braces unless they are valid within a value. + +[table.inline] + +name = { first = "Tom", last = "Preston-Werner" } +point = { x = 1, y = 2 } + + +################################################################################ +## String + +# There are four ways to express strings: basic, multi-line basic, literal, and +# multi-line literal. All strings must contain only valid UTF-8 characters. + +[string.basic] + +basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF." + +[string.multiline] + +# The following strings are byte-for-byte equivalent: +key1 = "One\nTwo" +key2 = """One\nTwo""" +key3 = """ +One +Two""" + +[string.multiline.continued] + +# The following strings are byte-for-byte equivalent: +key1 = "The quick brown fox jumps over the lazy dog." + +key2 = """ +The quick brown \ + + + fox jumps over \ + the lazy dog.""" + +key3 = """\ + The quick brown \ + fox jumps over \ + the lazy dog.\ + """ + +[string.literal] + +# What you see is what you get. +winpath = 'C:\Users\nodejs\templates' +winpath2 = '\\ServerX\admin$\system32\' +quoted = 'Tom "Dubs" Preston-Werner' +regex = '<\i\c*\s*>' + + +[string.literal.multiline] + +regex2 = '''I [dw]on't need \d{2} apples''' +lines = ''' +The first newline is +trimmed in raw strings. + All other whitespace + is preserved. +''' + + +################################################################################ +## Integer + +# Integers are whole numbers. Positive numbers may be prefixed with a plus sign. +# Negative numbers are prefixed with a minus sign. + +[integer] + +key1 = +99 +key2 = 42 +key3 = 0 +key4 = -17 + +[integer.underscores] + +# For large numbers, you may use underscores to enhance readability. Each +# underscore must be surrounded by at least one digit. +key1 = 1_000 +key2 = 5_349_221 +key3 = 1_2_3_4_5 # valid but inadvisable + + +################################################################################ +## Float + +# A float consists of an integer part (which may be prefixed with a plus or +# minus sign) followed by a fractional part and/or an exponent part. + +[float.fractional] + +key1 = +1.0 +key2 = 3.1415 +key3 = -0.01 + +[float.exponent] + +key1 = 5e+22 +key2 = 1e6 +key3 = -2E-2 + +[float.both] + +key = 6.626e-34 + +[float.underscores] + +key1 = 9_224_617.445_991_228_313 +key2 = 1e1_00 + + +################################################################################ +## Boolean + +# Booleans are just the tokens you're used to. Always lowercase. + +[boolean] + +True = true +False = false + + +################################################################################ +## Datetime + +# Datetimes are RFC 3339 dates. + +[datetime] + +key1 = 1979-05-27T07:32:00Z +key2 = 1979-05-27T00:32:00-07:00 +key3 = 1979-05-27T00:32:00.999999-07:00 + + +################################################################################ +## Array + +# Arrays are square brackets with other primitives inside. Whitespace is +# ignored. Elements are separated by commas. Data types may not be mixed. + +[array] + +key1 = [ 1, 2, 3 ] +key2 = [ "red", "yellow", "green" ] +key3 = [ [ 1, 2 ], [3, 4, 5] ] +#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok + +# Arrays can also be multiline. So in addition to ignoring whitespace, arrays +# also ignore newlines between the brackets. Terminating commas are ok before +# the closing bracket. + +key5 = [ + 1, 2, 3 +] +key6 = [ + 1, + 2, # this is ok +] + + +################################################################################ +## Array of Tables + +# These can be expressed by using a table name in double brackets. Each table +# with the same double bracketed name will be an element in the array. The +# tables are inserted in the order encountered. + +[[products]] + +name = "Hammer" +sku = 738594937 + +[[products]] + +[[products]] + +name = "Nail" +sku = 284758393 +color = "gray" + + +# You can create nested arrays of tables as well. + +[[fruit]] + name = "apple" + + [fruit.physical] + color = "red" + shape = "round" + + [[fruit.variety]] + name = "red delicious" + + [[fruit.variety]] + name = "granny smith" + +[[fruit]] + name = "banana" + + [[fruit.variety]] + name = "plantain" diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml new file mode 100755 index 0000000..0bd19f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/benchmark.yml @@ -0,0 +1,121 @@ +--- +array: + key1: + - 1 + - 2 + - 3 + key2: + - red + - yellow + - green + key3: + - - 1 + - 2 + - - 3 + - 4 + - 5 + key4: + - - 1 + - 2 + - - a + - b + - c + key5: + - 1 + - 2 + - 3 + key6: + - 1 + - 2 +boolean: + 'False': false + 'True': true +datetime: + key1: '1979-05-27T07:32:00Z' + key2: '1979-05-27T00:32:00-07:00' + key3: '1979-05-27T00:32:00.999999-07:00' +float: + both: + key: 6.626e-34 + exponent: + key1: 5.0e+22 + key2: 1000000 + key3: -0.02 + fractional: + key1: 1 + key2: 3.1415 + key3: -0.01 + underscores: + key1: 9224617.445991227 + key2: 1.0e+100 +fruit: +- name: apple + physical: + color: red + shape: round + variety: + - name: red delicious + - name: granny smith +- name: banana + variety: + - name: plantain +integer: + key1: 99 + key2: 42 + key3: 0 + key4: -17 + underscores: + key1: 1000 + key2: 5349221 + key3: 12345 +products: +- name: Hammer + sku: 738594937 +- {} +- color: gray + name: Nail + sku: 284758393 +string: + basic: + basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF." + literal: + multiline: + lines: | + The first newline is + trimmed in raw strings. + All other whitespace + is preserved. + regex2: I [dw]on't need \d{2} apples + quoted: Tom "Dubs" Preston-Werner + regex: "<\\i\\c*\\s*>" + winpath: C:\Users\nodejs\templates + winpath2: "\\\\ServerX\\admin$\\system32\\" + multiline: + continued: + key1: The quick brown fox jumps over the lazy dog. + key2: The quick brown fox jumps over the lazy dog. + key3: The quick brown fox jumps over the lazy dog. + key1: |- + One + Two + key2: |- + One + Two + key3: |- + One + Two +table: + inline: + name: + first: Tom + last: Preston-Werner + point: + x: 1 + y: 2 + key: value + subtable: + key: another value +x: + y: + z: + w: {} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/doc.go new file mode 100755 index 0000000..d5fd98c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/doc.go @@ -0,0 +1,23 @@ +// Package toml is a TOML parser and manipulation library. +// +// This version supports the specification as described in +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md +// +// Marshaling +// +// Go-toml can marshal and unmarshal TOML documents from and to data +// structures. +// +// TOML document as a tree +// +// Go-toml can operate on a TOML document as a tree. Use one of the Load* +// functions to parse TOML data and obtain a Tree instance, then one of its +// methods to manipulate the tree. +// +// JSONPath-like queries +// +// The package github.com/pelletier/go-toml/query implements a system +// similar to JSONPath to quickly retrieve elements of a TOML document using a +// single expression. See the package documentation for more information. +// +package toml diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml new file mode 100755 index 0000000..3d902f2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example.toml new file mode 100755 index 0000000..3d902f2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/example.toml @@ -0,0 +1,29 @@ +# This is a TOML document. Boom. + +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z # First class dates? Why not? + +[database] +server = "192.168.1.1" +ports = [ 8001, 8001, 8002 ] +connection_max = 5000 +enabled = true + +[servers] + + # You can indent as you please. Tabs or spaces. TOML don't care. + [servers.alpha] + ip = "10.0.0.1" + dc = "eqdc10" + + [servers.beta] + ip = "10.0.0.2" + dc = "eqdc10" + +[clients] +data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go new file mode 100755 index 0000000..14570c8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.go @@ -0,0 +1,31 @@ +// +build gofuzz + +package toml + +func Fuzz(data []byte) int { + tree, err := LoadBytes(data) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + str, err := tree.ToTomlString() + if err != nil { + if str != "" { + panic(`str must be "" if there is an error`) + } + panic(err) + } + + tree, err = Load(str) + if err != nil { + if tree != nil { + panic("tree must be nil if there is an error") + } + return 0 + } + + return 1 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh new file mode 100755 index 0000000..3204b4c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/fuzz.sh @@ -0,0 +1,15 @@ +#! /bin/sh +set -eu + +go get github.com/dvyukov/go-fuzz/go-fuzz +go get github.com/dvyukov/go-fuzz/go-fuzz-build + +if [ ! -e toml-fuzz.zip ]; then + go-fuzz-build github.com/pelletier/go-toml +fi + +rm -fr fuzz +mkdir -p fuzz/corpus +cp *.toml fuzz/corpus + +go-fuzz -bin=toml-fuzz.zip -workdir=fuzz diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go new file mode 100755 index 0000000..284db64 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -0,0 +1,85 @@ +// Parsing keys handling both bare and quoted keys. + +package toml + +import ( + "bytes" + "errors" + "fmt" + "unicode" +) + +// Convert the bare key group string to an array. +// The input supports double quotation to allow "." inside the key name, +// but escape sequences are not supported. Lexers must unescape them beforehand. +func parseKey(key string) ([]string, error) { + groups := []string{} + var buffer bytes.Buffer + inQuotes := false + wasInQuotes := false + ignoreSpace := true + expectDot := false + + for _, char := range key { + if ignoreSpace { + if char == ' ' { + continue + } + ignoreSpace = false + } + switch char { + case '"': + if inQuotes { + groups = append(groups, buffer.String()) + buffer.Reset() + wasInQuotes = true + } + inQuotes = !inQuotes + expectDot = false + case '.': + if inQuotes { + buffer.WriteRune(char) + } else { + if !wasInQuotes { + if buffer.Len() == 0 { + return nil, errors.New("empty table key") + } + groups = append(groups, buffer.String()) + buffer.Reset() + } + ignoreSpace = true + expectDot = false + wasInQuotes = false + } + case ' ': + if inQuotes { + buffer.WriteRune(char) + } else { + expectDot = true + } + default: + if !inQuotes && !isValidBareChar(char) { + return nil, fmt.Errorf("invalid bare character: %c", char) + } + if !inQuotes && expectDot { + return nil, errors.New("what?") + } + buffer.WriteRune(char) + expectDot = false + } + } + if inQuotes { + return nil, errors.New("mismatched quotes") + } + if buffer.Len() > 0 { + groups = append(groups, buffer.String()) + } + if len(groups) == 0 { + return nil, errors.New("empty key") + } + return groups, nil +} + +func isValidBareChar(r rune) bool { + return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/lexer.go new file mode 100755 index 0000000..d11de42 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/lexer.go @@ -0,0 +1,750 @@ +// TOML lexer. +// +// Written using the principles developed by Rob Pike in +// http://www.youtube.com/watch?v=HxaD_trXwRE + +package toml + +import ( + "bytes" + "errors" + "fmt" + "regexp" + "strconv" + "strings" +) + +var dateRegexp *regexp.Regexp + +// Define state functions +type tomlLexStateFn func() tomlLexStateFn + +// Define lexer +type tomlLexer struct { + inputIdx int + input []rune // Textual source + currentTokenStart int + currentTokenStop int + tokens []token + depth int + line int + col int + endbufferLine int + endbufferCol int +} + +// Basic read operations on input + +func (l *tomlLexer) read() rune { + r := l.peek() + if r == '\n' { + l.endbufferLine++ + l.endbufferCol = 1 + } else { + l.endbufferCol++ + } + l.inputIdx++ + return r +} + +func (l *tomlLexer) next() rune { + r := l.read() + + if r != eof { + l.currentTokenStop++ + } + return r +} + +func (l *tomlLexer) ignore() { + l.currentTokenStart = l.currentTokenStop + l.line = l.endbufferLine + l.col = l.endbufferCol +} + +func (l *tomlLexer) skip() { + l.next() + l.ignore() +} + +func (l *tomlLexer) fastForward(n int) { + for i := 0; i < n; i++ { + l.next() + } +} + +func (l *tomlLexer) emitWithValue(t tokenType, value string) { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: t, + val: value, + }) + l.ignore() +} + +func (l *tomlLexer) emit(t tokenType) { + l.emitWithValue(t, string(l.input[l.currentTokenStart:l.currentTokenStop])) +} + +func (l *tomlLexer) peek() rune { + if l.inputIdx >= len(l.input) { + return eof + } + return l.input[l.inputIdx] +} + +func (l *tomlLexer) peekString(size int) string { + maxIdx := len(l.input) + upperIdx := l.inputIdx + size // FIXME: potential overflow + if upperIdx > maxIdx { + upperIdx = maxIdx + } + return string(l.input[l.inputIdx:upperIdx]) +} + +func (l *tomlLexer) follow(next string) bool { + return next == l.peekString(len(next)) +} + +// Error management + +func (l *tomlLexer) errorf(format string, args ...interface{}) tomlLexStateFn { + l.tokens = append(l.tokens, token{ + Position: Position{l.line, l.col}, + typ: tokenError, + val: fmt.Sprintf(format, args...), + }) + return nil +} + +// State functions + +func (l *tomlLexer) lexVoid() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '[': + return l.lexTableKey + case '#': + return l.lexComment(l.lexVoid) + case '=': + return l.lexEqual + case '\r': + fallthrough + case '\n': + l.skip() + continue + } + + if isSpace(next) { + l.skip() + } + + if l.depth > 0 { + return l.lexRvalue + } + + if isKeyStartChar(next) { + return l.lexKey + } + + if next == eof { + l.next() + break + } + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexRvalue() tomlLexStateFn { + for { + next := l.peek() + switch next { + case '.': + return l.errorf("cannot start float with a dot") + case '=': + return l.lexEqual + case '[': + l.depth++ + return l.lexLeftBracket + case ']': + l.depth-- + return l.lexRightBracket + case '{': + return l.lexLeftCurlyBrace + case '}': + return l.lexRightCurlyBrace + case '#': + return l.lexComment(l.lexRvalue) + case '"': + return l.lexString + case '\'': + return l.lexLiteralString + case ',': + return l.lexComma + case '\r': + fallthrough + case '\n': + l.skip() + if l.depth == 0 { + return l.lexVoid + } + return l.lexRvalue + case '_': + return l.errorf("cannot start number with underscore") + } + + if l.follow("true") { + return l.lexTrue + } + + if l.follow("false") { + return l.lexFalse + } + + if l.follow("inf") { + return l.lexInf + } + + if l.follow("nan") { + return l.lexNan + } + + if isSpace(next) { + l.skip() + continue + } + + if next == eof { + l.next() + break + } + + possibleDate := l.peekString(35) + dateMatch := dateRegexp.FindString(possibleDate) + if dateMatch != "" { + l.fastForward(len(dateMatch)) + return l.lexDate + } + + if next == '+' || next == '-' || isDigit(next) { + return l.lexNumber + } + + if isAlphanumeric(next) { + return l.lexKey + } + + return l.errorf("no value can start with %c", next) + } + + l.emit(tokenEOF) + return nil +} + +func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenLeftCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { + l.next() + l.emit(tokenRightCurlyBrace) + return l.lexRvalue +} + +func (l *tomlLexer) lexDate() tomlLexStateFn { + l.emit(tokenDate) + return l.lexRvalue +} + +func (l *tomlLexer) lexTrue() tomlLexStateFn { + l.fastForward(4) + l.emit(tokenTrue) + return l.lexRvalue +} + +func (l *tomlLexer) lexFalse() tomlLexStateFn { + l.fastForward(5) + l.emit(tokenFalse) + return l.lexRvalue +} + +func (l *tomlLexer) lexInf() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenInf) + return l.lexRvalue +} + +func (l *tomlLexer) lexNan() tomlLexStateFn { + l.fastForward(3) + l.emit(tokenNan) + return l.lexRvalue +} + +func (l *tomlLexer) lexEqual() tomlLexStateFn { + l.next() + l.emit(tokenEqual) + return l.lexRvalue +} + +func (l *tomlLexer) lexComma() tomlLexStateFn { + l.next() + l.emit(tokenComma) + return l.lexRvalue +} + +// Parse the key and emits its value without escape sequences. +// bare keys, basic string keys and literal string keys are supported. +func (l *tomlLexer) lexKey() tomlLexStateFn { + growingString := "" + + for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() { + if r == '"' { + l.next() + str, err := l.lexStringAsString(`"`, false, true) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\'' { + l.next() + str, err := l.lexLiteralStringAsString(`'`, false) + if err != nil { + return l.errorf(err.Error()) + } + growingString += str + l.next() + continue + } else if r == '\n' { + return l.errorf("keys cannot contain new lines") + } else if isSpace(r) { + break + } else if !isValidBareChar(r) { + return l.errorf("keys cannot contain %c character", r) + } + growingString += string(r) + l.next() + } + l.emitWithValue(tokenKey, growingString) + return l.lexVoid +} + +func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { + return func() tomlLexStateFn { + for next := l.peek(); next != '\n' && next != eof; next = l.peek() { + if next == '\r' && l.follow("\r\n") { + break + } + l.next() + } + l.ignore() + return previousState + } +} + +func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { + l.next() + l.emit(tokenLeftBracket) + return l.lexRvalue +} + +func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + // find end of string + for { + if l.follow(terminator) { + return growingString, nil + } + + next := l.peek() + if next == eof { + break + } + growingString += string(l.next()) + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexLiteralString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := "'" + discardLeadingNewLine := false + if l.follow("''") { + l.skip() + l.skip() + terminator = "'''" + discardLeadingNewLine = true + } + + str, err := l.lexLiteralStringAsString(terminator, discardLeadingNewLine) + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +// Lex a string and return the results as a string. +// Terminator is the substring indicating the end of the token. +// The resulting string does not include the terminator. +func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) { + growingString := "" + + if discardLeadingNewLine { + if l.follow("\r\n") { + l.skip() + l.skip() + } else if l.peek() == '\n' { + l.skip() + } + } + + for { + if l.follow(terminator) { + return growingString, nil + } + + if l.follow("\\") { + l.next() + switch l.peek() { + case '\r': + fallthrough + case '\n': + fallthrough + case '\t': + fallthrough + case ' ': + // skip all whitespace chars following backslash + for strings.ContainsRune("\r\n\t ", l.peek()) { + l.next() + } + case '"': + growingString += "\"" + l.next() + case 'n': + growingString += "\n" + l.next() + case 'b': + growingString += "\b" + l.next() + case 'f': + growingString += "\f" + l.next() + case '/': + growingString += "/" + l.next() + case 't': + growingString += "\t" + l.next() + case 'r': + growingString += "\r" + l.next() + case '\\': + growingString += "\\" + l.next() + case 'u': + l.next() + code := "" + for i := 0; i < 4; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 32) + if err != nil { + return "", errors.New("invalid unicode escape: \\u" + code) + } + growingString += string(rune(intcode)) + case 'U': + l.next() + code := "" + for i := 0; i < 8; i++ { + c := l.peek() + if !isHexDigit(c) { + return "", errors.New("unfinished unicode escape") + } + l.next() + code = code + string(c) + } + intcode, err := strconv.ParseInt(code, 16, 64) + if err != nil { + return "", errors.New("invalid unicode escape: \\U" + code) + } + growingString += string(rune(intcode)) + default: + return "", errors.New("invalid escape sequence: \\" + string(l.peek())) + } + } else { + r := l.peek() + + if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + return "", fmt.Errorf("unescaped control character %U", r) + } + l.next() + growingString += string(r) + } + + if l.peek() == eof { + break + } + } + + return "", errors.New("unclosed string") +} + +func (l *tomlLexer) lexString() tomlLexStateFn { + l.skip() + + // handle special case for triple-quote + terminator := `"` + discardLeadingNewLine := false + acceptNewLines := false + if l.follow(`""`) { + l.skip() + l.skip() + terminator = `"""` + discardLeadingNewLine = true + acceptNewLines = true + } + + str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) + + if err != nil { + return l.errorf(err.Error()) + } + + l.emitWithValue(tokenString, str) + l.fastForward(len(terminator)) + l.ignore() + return l.lexRvalue +} + +func (l *tomlLexer) lexTableKey() tomlLexStateFn { + l.next() + + if l.peek() == '[' { + // token '[[' signifies an array of tables + l.next() + l.emit(tokenDoubleLeftBracket) + return l.lexInsideTableArrayKey + } + // vanilla table key + l.emit(tokenLeftBracket) + return l.lexInsideTableKey +} + +// Parse the key till "]]", but only bare keys are supported +func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroupArray) + } + l.next() + if l.peek() != ']' { + break + } + l.next() + l.emit(tokenDoubleRightBracket) + return l.lexVoid + case '[': + return l.errorf("table array key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table array key") +} + +// Parse the key till "]" but only bare keys are supported +func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { + for r := l.peek(); r != eof; r = l.peek() { + switch r { + case ']': + if l.currentTokenStop > l.currentTokenStart { + l.emit(tokenKeyGroup) + } + l.next() + l.emit(tokenRightBracket) + return l.lexVoid + case '[': + return l.errorf("table key cannot contain ']'") + default: + l.next() + } + } + return l.errorf("unclosed table key") +} + +func (l *tomlLexer) lexRightBracket() tomlLexStateFn { + l.next() + l.emit(tokenRightBracket) + return l.lexRvalue +} + +type validRuneFn func(r rune) bool + +func isValidHexRune(r rune) bool { + return r >= 'a' && r <= 'f' || + r >= 'A' && r <= 'F' || + r >= '0' && r <= '9' || + r == '_' +} + +func isValidOctalRune(r rune) bool { + return r >= '0' && r <= '7' || r == '_' +} + +func isValidBinaryRune(r rune) bool { + return r == '0' || r == '1' || r == '_' +} + +func (l *tomlLexer) lexNumber() tomlLexStateFn { + r := l.peek() + + if r == '0' { + follow := l.peekString(2) + if len(follow) == 2 { + var isValidRune validRuneFn + switch follow[1] { + case 'x': + isValidRune = isValidHexRune + case 'o': + isValidRune = isValidOctalRune + case 'b': + isValidRune = isValidBinaryRune + default: + if follow[1] >= 'a' && follow[1] <= 'z' || follow[1] >= 'A' && follow[1] <= 'Z' { + return l.errorf("unknown number base: %s. possible options are x (hex) o (octal) b (binary)", string(follow[1])) + } + } + + if isValidRune != nil { + l.next() + l.next() + digitSeen := false + for { + next := l.peek() + if !isValidRune(next) { + break + } + digitSeen = true + l.next() + } + + if !digitSeen { + return l.errorf("number needs at least one digit") + } + + l.emit(tokenInteger) + + return l.lexRvalue + } + } + } + + if r == '+' || r == '-' { + l.next() + if l.follow("inf") { + return l.lexInf + } + if l.follow("nan") { + return l.lexNan + } + } + + pointSeen := false + expSeen := false + digitSeen := false + for { + next := l.peek() + if next == '.' { + if pointSeen { + return l.errorf("cannot have two dots in one float") + } + l.next() + if !isDigit(l.peek()) { + return l.errorf("float cannot end with a dot") + } + pointSeen = true + } else if next == 'e' || next == 'E' { + expSeen = true + l.next() + r := l.peek() + if r == '+' || r == '-' { + l.next() + } + } else if isDigit(next) { + digitSeen = true + l.next() + } else if next == '_' { + l.next() + } else { + break + } + if pointSeen && !digitSeen { + return l.errorf("cannot start float with a dot") + } + } + + if !digitSeen { + return l.errorf("no digit in that number") + } + if pointSeen || expSeen { + l.emit(tokenFloat) + } else { + l.emit(tokenInteger) + } + return l.lexRvalue +} + +func (l *tomlLexer) run() { + for state := l.lexVoid; state != nil; { + state = state() + } +} + +func init() { + dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) +} + +// Entry point +func lexToml(inputBytes []byte) []token { + runes := bytes.Runes(inputBytes) + l := &tomlLexer{ + input: runes, + tokens: make([]token, 0, 256), + line: 1, + col: 1, + endbufferLine: 1, + endbufferCol: 1, + } + l.run() + return l.tokens +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal.go new file mode 100755 index 0000000..b5a2415 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal.go @@ -0,0 +1,600 @@ +package toml + +import ( + "bytes" + "errors" + "fmt" + "io" + "reflect" + "strconv" + "strings" + "time" +) + +type tomlOpts struct { + name string + comment string + commented bool + include bool + omitempty bool +} + +type encOpts struct { + quoteMapKeys bool + arraysOneElementPerLine bool +} + +var encOptsDefaults = encOpts{ + quoteMapKeys: false, +} + +var timeType = reflect.TypeOf(time.Time{}) +var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() + +// Check if the given marshall type maps to a Tree primitive +func isPrimitive(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isPrimitive(mtype.Elem()) + case reflect.Bool: + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return true + case reflect.Float32, reflect.Float64: + return true + case reflect.String: + return true + case reflect.Struct: + return mtype == timeType || isCustomMarshaler(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree slice +func isTreeSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Slice: + return !isOtherSlice(mtype) + default: + return false + } +} + +// Check if the given marshall type maps to a non-Tree slice +func isOtherSlice(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSlice(mtype.Elem()) + case reflect.Slice: + return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem()) + default: + return false + } +} + +// Check if the given marshall type maps to a Tree +func isTree(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Map: + return true + case reflect.Struct: + return !isPrimitive(mtype) + default: + return false + } +} + +func isCustomMarshaler(mtype reflect.Type) bool { + return mtype.Implements(marshalerType) +} + +func callCustomMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(Marshaler).MarshalTOML() +} + +// Marshaler is the interface implemented by types that +// can marshal themselves into valid TOML. +type Marshaler interface { + MarshalTOML() ([]byte, error) +} + +/* +Marshal returns the TOML encoding of v. Behavior is similar to the Go json +encoder, except that there is no concept of a Marshaler interface or MarshalTOML +function for sub-structs, and currently only definite types can be marshaled +(i.e. no `interface{}`). + +The following struct annotations are supported: + + toml:"Field" Overrides the field's name to output. + omitempty When set, empty values and groups are not emitted. + comment:"comment" Emits a # comment on the same line. This supports new lines. + commented:"true" Emits the value as commented. + +Note that pointers are automatically assigned the "omitempty" option, as TOML +explicitly does not handle null values (saying instead the label should be +dropped). + +Tree structural types and corresponding marshal types: + + *Tree (*)struct, (*)map[string]interface{} + []*Tree (*)[](*)struct, (*)[](*)map[string]interface{} + []interface{} (as interface{}) (*)[]primitive, (*)[]([]interface{}) + interface{} (*)primitive + +Tree primitive types and corresponding marshal types: + + uint64 uint, uint8-uint64, pointers to same + int64 int, int8-uint64, pointers to same + float64 float32, float64, pointers to same + string string, pointers to same + bool bool, pointers to same + time.Time time.Time{}, pointers to same +*/ +func Marshal(v interface{}) ([]byte, error) { + return NewEncoder(nil).marshal(v) +} + +// Encoder writes TOML values to an output stream. +type Encoder struct { + w io.Writer + encOpts +} + +// NewEncoder returns a new encoder that writes to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + w: w, + encOpts: encOptsDefaults, + } +} + +// Encode writes the TOML encoding of v to the stream. +// +// See the documentation for Marshal for details. +func (e *Encoder) Encode(v interface{}) error { + b, err := e.marshal(v) + if err != nil { + return err + } + if _, err := e.w.Write(b); err != nil { + return err + } + return nil +} + +// QuoteMapKeys sets up the encoder to encode +// maps with string type keys with quoted TOML keys. +// +// This relieves the character limitations on map keys. +func (e *Encoder) QuoteMapKeys(v bool) *Encoder { + e.quoteMapKeys = v + return e +} + +// ArraysWithOneElementPerLine sets up the encoder to encode arrays +// with more than one element on multiple lines instead of one. +// +// For example: +// +// A = [1,2,3] +// +// Becomes +// +// A = [ +// 1, +// 2, +// 3 +// ] +func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder { + e.arraysOneElementPerLine = v + return e +} + +func (e *Encoder) marshal(v interface{}) ([]byte, error) { + mtype := reflect.TypeOf(v) + if mtype.Kind() != reflect.Struct { + return []byte{}, errors.New("Only a struct can be marshaled to TOML") + } + sval := reflect.ValueOf(v) + if isCustomMarshaler(mtype) { + return callCustomMarshaler(sval) + } + t, err := e.valueToTree(mtype, sval) + if err != nil { + return []byte{}, err + } + + var buf bytes.Buffer + _, err = t.writeTo(&buf, "", "", 0, e.arraysOneElementPerLine) + + return buf.Bytes(), err +} + +// Convert given marshal struct or map value to toml tree +func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToTree(mtype.Elem(), mval.Elem()) + } + tval := newTree() + switch mtype.Kind() { + case reflect.Struct: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef) + if opts.include && (!opts.omitempty || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + tval.SetWithComment(opts.name, opts.comment, opts.commented, val) + } + } + case reflect.Map: + for _, key := range mval.MapKeys() { + mvalf := mval.MapIndex(key) + val, err := e.valueToToml(mtype.Elem(), mvalf) + if err != nil { + return nil, err + } + if e.quoteMapKeys { + keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + if err != nil { + return nil, err + } + tval.SetPath([]string{keyStr}, val) + } else { + tval.Set(key.String(), val) + } + } + } + return tval, nil +} + +// Convert given marshal slice to slice of Toml trees +func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*Tree, error) { + tval := make([]*Tree, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToTree(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal slice to slice of toml values +func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + tval := make([]interface{}, mval.Len(), mval.Len()) + for i := 0; i < mval.Len(); i++ { + val, err := e.valueToToml(mtype.Elem(), mval.Index(i)) + if err != nil { + return nil, err + } + tval[i] = val + } + return tval, nil +} + +// Convert given marshal value to toml value +func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { + if mtype.Kind() == reflect.Ptr { + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTree(mtype): + return e.valueToTree(mtype, mval) + case isTreeSlice(mtype): + return e.valueToTreeSlice(mtype, mval) + case isOtherSlice(mtype): + return e.valueToOtherSlice(mtype, mval) + default: + switch mtype.Kind() { + case reflect.Bool: + return mval.Bool(), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return mval.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return mval.Uint(), nil + case reflect.Float32, reflect.Float64: + return mval.Float(), nil + case reflect.String: + return mval.String(), nil + case reflect.Struct: + return mval.Interface().(time.Time), nil + default: + return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) + } + } +} + +// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. +// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for +// sub-structs, and only definite types can be unmarshaled. +func (t *Tree) Unmarshal(v interface{}) error { + d := Decoder{tval: t} + return d.unmarshal(v) +} + +// Marshal returns the TOML encoding of Tree. +// See Marshal() documentation for types mapping table. +func (t *Tree) Marshal() ([]byte, error) { + var buf bytes.Buffer + err := NewEncoder(&buf).Encode(t) + return buf.Bytes(), err +} + +// Unmarshal parses the TOML-encoded data and stores the result in the value +// pointed to by v. Behavior is similar to the Go json encoder, except that there +// is no concept of an Unmarshaler interface or UnmarshalTOML function for +// sub-structs, and currently only definite types can be unmarshaled to (i.e. no +// `interface{}`). +// +// The following struct annotations are supported: +// +// toml:"Field" Overrides the field's name to map to. +// +// See Marshal() documentation for types mapping table. +func Unmarshal(data []byte, v interface{}) error { + t, err := LoadReader(bytes.NewReader(data)) + if err != nil { + return err + } + return t.Unmarshal(v) +} + +// Decoder reads and decodes TOML values from an input stream. +type Decoder struct { + r io.Reader + tval *Tree + encOpts +} + +// NewDecoder returns a new decoder that reads from r. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + r: r, + encOpts: encOptsDefaults, + } +} + +// Decode reads a TOML-encoded value from it's input +// and unmarshals it in the value pointed at by v. +// +// See the documentation for Marshal for details. +func (d *Decoder) Decode(v interface{}) error { + var err error + d.tval, err = LoadReader(d.r) + if err != nil { + return err + } + return d.unmarshal(v) +} + +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") + } + + sval, err := d.valueFromTree(mtype.Elem(), d.tval) + if err != nil { + return err + } + reflect.ValueOf(v).Elem().Set(sval) + return nil +} + +// Convert toml tree to marshal struct or map, using marshal type +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + var mval reflect.Value + switch mtype.Kind() { + case reflect.Struct: + mval = reflect.New(mtype).Elem() + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + opts := tomlOptions(mtypef) + if opts.include { + baseKey := opts.name + keysToTry := []string{baseKey, strings.ToLower(baseKey), strings.ToTitle(baseKey)} + for _, key := range keysToTry { + exists := tval.Has(key) + if !exists { + continue + } + val := tval.Get(key) + mvalf, err := d.valueFromToml(mtypef.Type, val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.Field(i).Set(mvalf) + break + } + } + } + case reflect.Map: + mval = reflect.MakeMap(mtype) + for _, key := range tval.Keys() { + // TODO: path splits key + val := tval.GetPath([]string{key}) + mvalf, err := d.valueFromToml(mtype.Elem(), val) + if err != nil { + return mval, formatError(err, tval.GetPosition(key)) + } + mval.SetMapIndex(reflect.ValueOf(key), mvalf) + } + } + return mval, nil +} + +// Convert toml value to marshal struct/map slice, using marshal type +func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromTree(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { + mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + for i := 0; i < len(tval); i++ { + val, err := d.valueFromToml(mtype.Elem(), tval[i]) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + if mtype.Kind() == reflect.Ptr { + return d.unwrapPointer(mtype, tval) + } + + switch tval.(type) { + case *Tree: + if isTree(mtype) { + return d.valueFromTree(mtype, tval.(*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) + case []*Tree: + if isTreeSlice(mtype) { + return d.valueFromTreeSlice(mtype, tval.([]*Tree)) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) + case []interface{}: + if isOtherSlice(mtype) { + return d.valueFromOtherSlice(mtype, tval.([]interface{})) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) + default: + switch mtype.Kind() { + case reflect.Bool, reflect.Struct: + val := reflect.ValueOf(tval) + // if this passes for when mtype is reflect.Struct, tval is a time.Time + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.String: + val := reflect.ValueOf(tval) + // stupidly, int64 is convertible to string. So special case this. + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Int()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if val.Int() < 0 { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Int())) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + case reflect.Float32, reflect.Float64: + val := reflect.ValueOf(tval) + if !val.Type().ConvertibleTo(mtype) { + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) + } + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Float()) { + return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) + } + + return val.Convert(mtype), nil + default: + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) + } + } +} + +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val, err := d.valueFromToml(mtype.Elem(), tval) + if err != nil { + return reflect.ValueOf(nil), err + } + mval := reflect.New(mtype.Elem()) + mval.Elem().Set(val) + return mval, nil +} + +func tomlOptions(vf reflect.StructField) tomlOpts { + tag := vf.Tag.Get("toml") + parse := strings.Split(tag, ",") + var comment string + if c := vf.Tag.Get("comment"); c != "" { + comment = c + } + commented, _ := strconv.ParseBool(vf.Tag.Get("commented")) + result := tomlOpts{name: vf.Name, comment: comment, commented: commented, include: true, omitempty: false} + if parse[0] != "" { + if parse[0] == "-" && len(parse) == 1 { + result.include = false + } else { + result.name = strings.Trim(parse[0], " ") + } + } + if vf.PkgPath != "" { + result.include = false + } + if len(parse) > 1 && strings.Trim(parse[1], " ") == "omitempty" { + result.omitempty = true + } + if vf.Type.Kind() == reflect.Ptr { + result.omitempty = true + } + return result +} + +func isZero(val reflect.Value) bool { + switch val.Type().Kind() { + case reflect.Map: + fallthrough + case reflect.Array: + fallthrough + case reflect.Slice: + return val.Len() == 0 + default: + return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) + } +} + +func formatError(err error, pos Position) error { + if err.Error()[0] == '(' { // Error already contains position information + return err + } + return fmt.Errorf("%s: %s", pos, err) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml new file mode 100755 index 0000000..1c5f98e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -0,0 +1,38 @@ +title = "TOML Marshal Testing" + +[basic] + bool = true + date = 1979-05-27T07:32:00Z + float = 123.4 + int = 5000 + string = "Bite me" + uint = 5001 + +[basic_lists] + bools = [true,false,true] + dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z] + floats = [12.3,45.6,78.9] + ints = [8001,8001,8002] + strings = ["One","Two","Three"] + uints = [5002,5003] + +[basic_map] + one = "one" + two = "two" + +[subdoc] + + [subdoc.first] + name = "First" + + [subdoc.second] + name = "Second" + +[[subdoclist]] + name = "List.First" + +[[subdoclist]] + name = "List.Second" + +[[subdocptrs]] + name = "Second" diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/parser.go new file mode 100755 index 0000000..2d27599 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/parser.go @@ -0,0 +1,430 @@ +// TOML Parser. + +package toml + +import ( + "errors" + "fmt" + "math" + "reflect" + "regexp" + "strconv" + "strings" + "time" +) + +type tomlParser struct { + flowIdx int + flow []token + tree *Tree + currentTable []string + seenTableKeys []string +} + +type tomlParserStateFn func() tomlParserStateFn + +// Formats and panics an error message based on a token +func (p *tomlParser) raiseError(tok *token, msg string, args ...interface{}) { + panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...)) +} + +func (p *tomlParser) run() { + for state := p.parseStart; state != nil; { + state = state() + } +} + +func (p *tomlParser) peek() *token { + if p.flowIdx >= len(p.flow) { + return nil + } + return &p.flow[p.flowIdx] +} + +func (p *tomlParser) assume(typ tokenType) { + tok := p.getToken() + if tok == nil { + p.raiseError(tok, "was expecting token %s, but token stream is empty", tok) + } + if tok.typ != typ { + p.raiseError(tok, "was expecting token %s, but got %s instead", typ, tok) + } +} + +func (p *tomlParser) getToken() *token { + tok := p.peek() + if tok == nil { + return nil + } + p.flowIdx++ + return tok +} + +func (p *tomlParser) parseStart() tomlParserStateFn { + tok := p.peek() + + // end of stream, parsing is finished + if tok == nil { + return nil + } + + switch tok.typ { + case tokenDoubleLeftBracket: + return p.parseGroupArray + case tokenLeftBracket: + return p.parseGroup + case tokenKey: + return p.parseAssign + case tokenEOF: + return nil + default: + p.raiseError(tok, "unexpected token") + } + return nil +} + +func (p *tomlParser) parseGroupArray() tomlParserStateFn { + startToken := p.getToken() // discard the [[ + key := p.getToken() + if key.typ != tokenKeyGroupArray { + p.raiseError(key, "unexpected token %s, was expecting a table array key", key) + } + + // get or create table array element at the indicated part in the path + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + p.tree.createSubTree(keys[:len(keys)-1], startToken.Position) // create parent entries + destTree := p.tree.GetPath(keys) + var array []*Tree + if destTree == nil { + array = make([]*Tree, 0) + } else if target, ok := destTree.([]*Tree); ok && target != nil { + array = destTree.([]*Tree) + } else { + p.raiseError(key, "key %s is already assigned and not of type table array", key) + } + p.currentTable = keys + + // add a new tree to the end of the table array + newTree := newTree() + newTree.position = startToken.Position + array = append(array, newTree) + p.tree.SetPath(p.currentTable, array) + + // remove all keys that were children of this table array + prefix := key.val + "." + found := false + for ii := 0; ii < len(p.seenTableKeys); { + tableKey := p.seenTableKeys[ii] + if strings.HasPrefix(tableKey, prefix) { + p.seenTableKeys = append(p.seenTableKeys[:ii], p.seenTableKeys[ii+1:]...) + } else { + found = (tableKey == key.val) + ii++ + } + } + + // keep this key name from use by other kinds of assignments + if !found { + p.seenTableKeys = append(p.seenTableKeys, key.val) + } + + // move to next parser state + p.assume(tokenDoubleRightBracket) + return p.parseStart +} + +func (p *tomlParser) parseGroup() tomlParserStateFn { + startToken := p.getToken() // discard the [ + key := p.getToken() + if key.typ != tokenKeyGroup { + p.raiseError(key, "unexpected token %s, was expecting a table key", key) + } + for _, item := range p.seenTableKeys { + if item == key.val { + p.raiseError(key, "duplicated tables") + } + } + + p.seenTableKeys = append(p.seenTableKeys, key.val) + keys, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid table array key: %s", err) + } + if err := p.tree.createSubTree(keys, startToken.Position); err != nil { + p.raiseError(key, "%s", err) + } + p.assume(tokenRightBracket) + p.currentTable = keys + return p.parseStart +} + +func (p *tomlParser) parseAssign() tomlParserStateFn { + key := p.getToken() + p.assume(tokenEqual) + + value := p.parseRvalue() + var tableKey []string + if len(p.currentTable) > 0 { + tableKey = p.currentTable + } else { + tableKey = []string{} + } + + // find the table to assign, looking out for arrays of tables + var targetNode *Tree + switch node := p.tree.GetPath(tableKey).(type) { + case []*Tree: + targetNode = node[len(node)-1] + case *Tree: + targetNode = node + default: + p.raiseError(key, "Unknown table type for path: %s", + strings.Join(tableKey, ".")) + } + + // assign value to the found table + keyVals := []string{key.val} + if len(keyVals) != 1 { + p.raiseError(key, "Invalid key") + } + keyVal := keyVals[0] + localKey := []string{keyVal} + finalKey := append(tableKey, keyVal) + if targetNode.GetPath(localKey) != nil { + p.raiseError(key, "The following key was defined twice: %s", + strings.Join(finalKey, ".")) + } + var toInsert interface{} + + switch value.(type) { + case *Tree, []*Tree: + toInsert = value + default: + toInsert = &tomlValue{value: value, position: key.Position} + } + targetNode.values[keyVal] = toInsert + return p.parseStart +} + +var numberUnderscoreInvalidRegexp *regexp.Regexp +var hexNumberUnderscoreInvalidRegexp *regexp.Regexp + +func numberContainsInvalidUnderscore(value string) error { + if numberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in number") + } + return nil +} + +func hexNumberContainsInvalidUnderscore(value string) error { + if hexNumberUnderscoreInvalidRegexp.MatchString(value) { + return errors.New("invalid use of _ in hex number") + } + return nil +} + +func cleanupNumberToken(value string) string { + cleanedVal := strings.Replace(value, "_", "", -1) + return cleanedVal +} + +func (p *tomlParser) parseRvalue() interface{} { + tok := p.getToken() + if tok == nil || tok.typ == tokenEOF { + p.raiseError(tok, "expecting a value") + } + + switch tok.typ { + case tokenString: + return tok.val + case tokenTrue: + return true + case tokenFalse: + return false + case tokenInf: + if tok.val[0] == '-' { + return math.Inf(-1) + } + return math.Inf(1) + case tokenNan: + return math.NaN() + case tokenInteger: + cleanedVal := cleanupNumberToken(tok.val) + var err error + var val int64 + if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { + switch cleanedVal[1] { + case 'x': + err = hexNumberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 16, 64) + case 'o': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 8, 64) + case 'b': + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal[2:], 2, 64) + default: + panic("invalid base") // the lexer should catch this first + } + } else { + err = numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + val, err = strconv.ParseInt(cleanedVal, 10, 64) + } + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenFloat: + err := numberContainsInvalidUnderscore(tok.val) + if err != nil { + p.raiseError(tok, "%s", err) + } + cleanedVal := cleanupNumberToken(tok.val) + val, err := strconv.ParseFloat(cleanedVal, 64) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenDate: + val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLeftBracket: + return p.parseArray() + case tokenLeftCurlyBrace: + return p.parseInlineTable() + case tokenEqual: + p.raiseError(tok, "cannot have multiple equals for the same key") + case tokenError: + p.raiseError(tok, "%s", tok) + } + + p.raiseError(tok, "never reached") + + return nil +} + +func tokenIsComma(t *token) bool { + return t != nil && t.typ == tokenComma +} + +func (p *tomlParser) parseInlineTable() *Tree { + tree := newTree() + var previous *token +Loop: + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated inline table") + } + switch follow.typ { + case tokenRightCurlyBrace: + p.getToken() + break Loop + case tokenKey: + if !tokenIsComma(previous) && previous != nil { + p.raiseError(follow, "comma expected between fields in inline table") + } + key := p.getToken() + p.assume(tokenEqual) + value := p.parseRvalue() + tree.Set(key.val, value) + case tokenComma: + if previous == nil { + p.raiseError(follow, "inline table cannot start with a comma") + } + if tokenIsComma(previous) { + p.raiseError(follow, "need field between two commas in inline table") + } + p.getToken() + default: + p.raiseError(follow, "unexpected token type in inline table: %s", follow.String()) + } + previous = follow + } + if tokenIsComma(previous) { + p.raiseError(previous, "trailing comma at the end of inline table") + } + return tree +} + +func (p *tomlParser) parseArray() interface{} { + var array []interface{} + arrayType := reflect.TypeOf(nil) + for { + follow := p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ == tokenRightBracket { + p.getToken() + break + } + val := p.parseRvalue() + if arrayType == nil { + arrayType = reflect.TypeOf(val) + } + if reflect.TypeOf(val) != arrayType { + p.raiseError(follow, "mixed types in array") + } + array = append(array, val) + follow = p.peek() + if follow == nil || follow.typ == tokenEOF { + p.raiseError(follow, "unterminated array") + } + if follow.typ != tokenRightBracket && follow.typ != tokenComma { + p.raiseError(follow, "missing comma") + } + if follow.typ == tokenComma { + p.getToken() + } + } + // An array of Trees is actually an array of inline + // tables, which is a shorthand for a table array. If the + // array was not converted from []interface{} to []*Tree, + // the two notations would not be equivalent. + if arrayType == reflect.TypeOf(newTree()) { + tomlArray := make([]*Tree, len(array)) + for i, v := range array { + tomlArray[i] = v.(*Tree) + } + return tomlArray + } + return array +} + +func parseToml(flow []token) *Tree { + result := newTree() + result.position = Position{1, 1} + parser := &tomlParser{ + flowIdx: 0, + flow: flow, + tree: result, + currentTable: make([]string, 0), + seenTableKeys: make([]string, 0), + } + parser.run() + return result +} + +func init() { + numberUnderscoreInvalidRegexp = regexp.MustCompile(`([^\d]_|_[^\d])|_$|^_`) + hexNumberUnderscoreInvalidRegexp = regexp.MustCompile(`(^0x_)|([^\da-f]_|_[^\da-f])|_$|^_`) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/position.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/position.go new file mode 100755 index 0000000..c17bff8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/position.go @@ -0,0 +1,29 @@ +// Position support for go-toml + +package toml + +import ( + "fmt" +) + +// Position of a document element within a TOML document. +// +// Line and Col are both 1-indexed positions for the element's line number and +// column number, respectively. Values of zero or less will cause Invalid(), +// to return true. +type Position struct { + Line int // line within the document + Col int // column within the line +} + +// String representation of the position. +// Displays 1-indexed line and column numbers. +func (p Position) String() string { + return fmt.Sprintf("(%d, %d)", p.Line, p.Col) +} + +// Invalid returns whether or not the position is valid (i.e. with negative or +// null values) +func (p Position) Invalid() bool { + return p.Line <= 0 || p.Col <= 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/test.sh b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/test.sh new file mode 100755 index 0000000..a70a8b0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/test.sh @@ -0,0 +1,91 @@ +#!/bin/bash +# fail out of the script if anything here fails +set -e +set -o pipefail + +# set the path to the present working directory +export GOPATH=`pwd` + +function git_clone() { + path=$1 + branch=$2 + version=$3 + if [ ! -d "src/$path" ]; then + mkdir -p src/$path + git clone https://$path.git src/$path + fi + pushd src/$path + git checkout "$branch" + git reset --hard "$version" + popd +} + +# Remove potential previous runs +rm -rf src test_program_bin toml-test + +# Run go vet +go vet ./... + +go get github.com/pelletier/go-buffruneio +go get github.com/davecgh/go-spew/spew +go get gopkg.in/yaml.v2 +go get github.com/BurntSushi/toml + +# get code for BurntSushi TOML validation +# pinning all to 'HEAD' for version 0.3.x work (TODO: pin to commit hash when tests stabilize) +git_clone github.com/BurntSushi/toml master HEAD +git_clone github.com/BurntSushi/toml-test master HEAD #was: 0.2.0 HEAD + +# build the BurntSushi test application +go build -o toml-test github.com/BurntSushi/toml-test + +# vendorize the current lib for testing +# NOTE: this basically mocks an install without having to go back out to github for code +mkdir -p src/github.com/pelletier/go-toml/cmd +mkdir -p src/github.com/pelletier/go-toml/query +cp *.go *.toml src/github.com/pelletier/go-toml +cp -R cmd/* src/github.com/pelletier/go-toml/cmd +cp -R query/* src/github.com/pelletier/go-toml/query +go build -o test_program_bin src/github.com/pelletier/go-toml/cmd/test_program.go + +# Run basic unit tests +go test github.com/pelletier/go-toml -covermode=count -coverprofile=coverage.out +go test github.com/pelletier/go-toml/cmd/tomljson +go test github.com/pelletier/go-toml/query + +# run the entire BurntSushi test suite +if [[ $# -eq 0 ]] ; then + echo "Running all BurntSushi tests" + ./toml-test ./test_program_bin | tee test_out +else + # run a specific test + test=$1 + test_path='src/github.com/BurntSushi/toml-test/tests' + valid_test="$test_path/valid/$test" + invalid_test="$test_path/invalid/$test" + + if [ -e "$valid_test.toml" ]; then + echo "Valid Test TOML for $test:" + echo "====" + cat "$valid_test.toml" + + echo "Valid Test JSON for $test:" + echo "====" + cat "$valid_test.json" + + echo "Go-TOML Output for $test:" + echo "====" + cat "$valid_test.toml" | ./test_program_bin + fi + + if [ -e "$invalid_test.toml" ]; then + echo "Invalid Test TOML for $test:" + echo "====" + cat "$invalid_test.toml" + + echo "Go-TOML Output for $test:" + echo "====" + echo "go-toml Output:" + cat "$invalid_test.toml" | ./test_program_bin + fi +fi diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/token.go new file mode 100755 index 0000000..1a90813 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/token.go @@ -0,0 +1,144 @@ +package toml + +import ( + "fmt" + "strconv" + "unicode" +) + +// Define tokens +type tokenType int + +const ( + eof = -(iota + 1) +) + +const ( + tokenError tokenType = iota + tokenEOF + tokenComment + tokenKey + tokenString + tokenInteger + tokenTrue + tokenFalse + tokenFloat + tokenInf + tokenNan + tokenEqual + tokenLeftBracket + tokenRightBracket + tokenLeftCurlyBrace + tokenRightCurlyBrace + tokenLeftParen + tokenRightParen + tokenDoubleLeftBracket + tokenDoubleRightBracket + tokenDate + tokenKeyGroup + tokenKeyGroupArray + tokenComma + tokenColon + tokenDollar + tokenStar + tokenQuestion + tokenDot + tokenDotDot + tokenEOL +) + +var tokenTypeNames = []string{ + "Error", + "EOF", + "Comment", + "Key", + "String", + "Integer", + "True", + "False", + "Float", + "Inf", + "NaN", + "=", + "[", + "]", + "{", + "}", + "(", + ")", + "]]", + "[[", + "Date", + "KeyGroup", + "KeyGroupArray", + ",", + ":", + "$", + "*", + "?", + ".", + "..", + "EOL", +} + +type token struct { + Position + typ tokenType + val string +} + +func (tt tokenType) String() string { + idx := int(tt) + if idx < len(tokenTypeNames) { + return tokenTypeNames[idx] + } + return "Unknown" +} + +func (t token) Int() int { + if result, err := strconv.Atoi(t.val); err != nil { + panic(err) + } else { + return result + } +} + +func (t token) String() string { + switch t.typ { + case tokenEOF: + return "EOF" + case tokenError: + return t.val + } + + return fmt.Sprintf("%q", t.val) +} + +func isSpace(r rune) bool { + return r == ' ' || r == '\t' +} + +func isAlphanumeric(r rune) bool { + return unicode.IsLetter(r) || r == '_' +} + +func isKeyChar(r rune) bool { + // Keys start with the first character that isn't whitespace or [ and end + // with the last non-whitespace character before the equals sign. Keys + // cannot contain a # character." + return !(r == '\r' || r == '\n' || r == eof || r == '=') +} + +func isKeyStartChar(r rune) bool { + return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[') +} + +func isDigit(r rune) bool { + return unicode.IsNumber(r) +} + +func isHexDigit(r rune) bool { + return isDigit(r) || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/toml.go new file mode 100755 index 0000000..05493a4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/toml.go @@ -0,0 +1,309 @@ +package toml + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "runtime" + "strings" +) + +type tomlValue struct { + value interface{} // string, int64, uint64, float64, bool, time.Time, [] of any of this list + comment string + commented bool + position Position +} + +// Tree is the result of the parsing of a TOML file. +type Tree struct { + values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree + comment string + commented bool + position Position +} + +func newTree() *Tree { + return &Tree{ + values: make(map[string]interface{}), + position: Position{}, + } +} + +// TreeFromMap initializes a new Tree object using the given map. +func TreeFromMap(m map[string]interface{}) (*Tree, error) { + result, err := toTree(m) + if err != nil { + return nil, err + } + return result.(*Tree), nil +} + +// Position returns the position of the tree. +func (t *Tree) Position() Position { + return t.position +} + +// Has returns a boolean indicating if the given key exists. +func (t *Tree) Has(key string) bool { + if key == "" { + return false + } + return t.HasPath(strings.Split(key, ".")) +} + +// HasPath returns true if the given path of keys exists, false otherwise. +func (t *Tree) HasPath(keys []string) bool { + return t.GetPath(keys) != nil +} + +// Keys returns the keys of the toplevel tree (does not recurse). +func (t *Tree) Keys() []string { + keys := make([]string, len(t.values)) + i := 0 + for k := range t.values { + keys[i] = k + i++ + } + return keys +} + +// Get the value at key in the Tree. +// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings. +// If you need to retrieve non-bare keys, use GetPath. +// Returns nil if the path does not exist in the tree. +// If keys is of length zero, the current tree is returned. +func (t *Tree) Get(key string) interface{} { + if key == "" { + return t + } + return t.GetPath(strings.Split(key, ".")) +} + +// GetPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPath(keys []string) interface{} { + if len(keys) == 0 { + return t + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return nil + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return nil + } + subtree = node[len(node)-1] + default: + return nil // cannot navigate through other node types + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.value + default: + return node + } +} + +// GetPosition returns the position of the given key. +func (t *Tree) GetPosition(key string) Position { + if key == "" { + return t.position + } + return t.GetPositionPath(strings.Split(key, ".")) +} + +// GetPositionPath returns the element in the tree indicated by 'keys'. +// If keys is of length zero, the current tree is returned. +func (t *Tree) GetPositionPath(keys []string) Position { + if len(keys) == 0 { + return t.position + } + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] + if !exists { + return Position{0, 0} + } + switch node := value.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + subtree = node[len(node)-1] + default: + return Position{0, 0} + } + } + // branch based on final node type + switch node := subtree.values[keys[len(keys)-1]].(type) { + case *tomlValue: + return node.position + case *Tree: + return node.position + case []*Tree: + // go to most recent element + if len(node) == 0 { + return Position{0, 0} + } + return node[len(node)-1].position + default: + return Position{0, 0} + } +} + +// GetDefault works like Get but with a default value +func (t *Tree) GetDefault(key string, def interface{}) interface{} { + val := t.Get(key) + if val == nil { + return def + } + return val +} + +// Set an element in the tree. +// Key is a dot-separated path (e.g. a.b.c). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) Set(key string, value interface{}) { + t.SetWithComment(key, "", false, value) +} + +// SetWithComment is the same as Set, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetWithComment(key string, comment string, commented bool, value interface{}) { + t.SetPathWithComment(strings.Split(key, "."), comment, commented, value) +} + +// SetPath sets an element in the tree. +// Keys is an array of path elements (e.g. {"a","b","c"}). +// Creates all necessary intermediate trees, if needed. +func (t *Tree) SetPath(keys []string, value interface{}) { + t.SetPathWithComment(keys, "", false, value) +} + +// SetPathWithComment is the same as SetPath, but allows you to provide comment +// information to the key, that will be reused by Marshal(). +func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) { + subtree := t + for _, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + nextTree = newTree() + subtree.values[intermediateKey] = nextTree // add new element here + } + switch node := nextTree.(type) { + case *Tree: + subtree = node + case []*Tree: + // go to most recent element + if len(node) == 0 { + // create element if it does not exist + subtree.values[intermediateKey] = append(node, newTree()) + } + subtree = node[len(node)-1] + } + } + + var toInsert interface{} + + switch value.(type) { + case *Tree: + tt := value.(*Tree) + tt.comment = comment + toInsert = value + case []*Tree: + toInsert = value + case *tomlValue: + tt := value.(*tomlValue) + tt.comment = comment + toInsert = tt + default: + toInsert = &tomlValue{value: value, comment: comment, commented: commented} + } + + subtree.values[keys[len(keys)-1]] = toInsert +} + +// createSubTree takes a tree and a key and create the necessary intermediate +// subtrees to create a subtree at that point. In-place. +// +// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b] +// and tree[a][b][c] +// +// Returns nil on success, error object on failure +func (t *Tree) createSubTree(keys []string, pos Position) error { + subtree := t + for _, intermediateKey := range keys { + nextTree, exists := subtree.values[intermediateKey] + if !exists { + tree := newTree() + tree.position = pos + subtree.values[intermediateKey] = tree + nextTree = tree + } + + switch node := nextTree.(type) { + case []*Tree: + subtree = node[len(node)-1] + case *Tree: + subtree = node + default: + return fmt.Errorf("unknown type for path %s (%s): %T (%#v)", + strings.Join(keys, "."), intermediateKey, nextTree, nextTree) + } + } + return nil +} + +// LoadBytes creates a Tree from a []byte. +func LoadBytes(b []byte) (tree *Tree, err error) { + defer func() { + if r := recover(); r != nil { + if _, ok := r.(runtime.Error); ok { + panic(r) + } + err = errors.New(r.(string)) + } + }() + tree = parseToml(lexToml(b)) + return +} + +// LoadReader creates a Tree from any io.Reader. +func LoadReader(reader io.Reader) (tree *Tree, err error) { + inputBytes, err := ioutil.ReadAll(reader) + if err != nil { + return + } + tree, err = LoadBytes(inputBytes) + return +} + +// Load creates a Tree from a string. +func Load(content string) (tree *Tree, err error) { + return LoadBytes([]byte(content)) +} + +// LoadFile creates a Tree from a file. +func LoadFile(path string) (tree *Tree, err error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + return LoadReader(file) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go new file mode 100755 index 0000000..79610e9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_create.go @@ -0,0 +1,142 @@ +package toml + +import ( + "fmt" + "reflect" + "time" +) + +var kindToType = [reflect.String + 1]reflect.Type{ + reflect.Bool: reflect.TypeOf(true), + reflect.String: reflect.TypeOf(""), + reflect.Float32: reflect.TypeOf(float64(1)), + reflect.Float64: reflect.TypeOf(float64(1)), + reflect.Int: reflect.TypeOf(int64(1)), + reflect.Int8: reflect.TypeOf(int64(1)), + reflect.Int16: reflect.TypeOf(int64(1)), + reflect.Int32: reflect.TypeOf(int64(1)), + reflect.Int64: reflect.TypeOf(int64(1)), + reflect.Uint: reflect.TypeOf(uint64(1)), + reflect.Uint8: reflect.TypeOf(uint64(1)), + reflect.Uint16: reflect.TypeOf(uint64(1)), + reflect.Uint32: reflect.TypeOf(uint64(1)), + reflect.Uint64: reflect.TypeOf(uint64(1)), +} + +// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found. +// supported values: +// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32 +func typeFor(k reflect.Kind) reflect.Type { + if k > 0 && int(k) < len(kindToType) { + return kindToType[k] + } + return nil +} + +func simpleValueCoercion(object interface{}) (interface{}, error) { + switch original := object.(type) { + case string, bool, int64, uint64, float64, time.Time: + return original, nil + case int: + return int64(original), nil + case int8: + return int64(original), nil + case int16: + return int64(original), nil + case int32: + return int64(original), nil + case uint: + return uint64(original), nil + case uint8: + return uint64(original), nil + case uint16: + return uint64(original), nil + case uint32: + return uint64(original), nil + case float32: + return float64(original), nil + case fmt.Stringer: + return original.String(), nil + default: + return nil, fmt.Errorf("cannot convert type %T to Tree", object) + } +} + +func sliceToTree(object interface{}) (interface{}, error) { + // arrays are a bit tricky, since they can represent either a + // collection of simple values, which is represented by one + // *tomlValue, or an array of tables, which is represented by an + // array of *Tree. + + // holding the assumption that this function is called from toTree only when value.Kind() is Array or Slice + value := reflect.ValueOf(object) + insideType := value.Type().Elem() + length := value.Len() + if length > 0 { + insideType = reflect.ValueOf(value.Index(0).Interface()).Type() + } + if insideType.Kind() == reflect.Map { + // this is considered as an array of tables + tablesArray := make([]*Tree, 0, length) + for i := 0; i < length; i++ { + table := value.Index(i) + tree, err := toTree(table.Interface()) + if err != nil { + return nil, err + } + tablesArray = append(tablesArray, tree.(*Tree)) + } + return tablesArray, nil + } + + sliceType := typeFor(insideType.Kind()) + if sliceType == nil { + sliceType = insideType + } + + arrayValue := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, length) + + for i := 0; i < length; i++ { + val := value.Index(i).Interface() + simpleValue, err := simpleValueCoercion(val) + if err != nil { + return nil, err + } + arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue)) + } + return &tomlValue{value: arrayValue.Interface(), position: Position{}}, nil +} + +func toTree(object interface{}) (interface{}, error) { + value := reflect.ValueOf(object) + + if value.Kind() == reflect.Map { + values := map[string]interface{}{} + keys := value.MapKeys() + for _, key := range keys { + if key.Kind() != reflect.String { + if _, ok := key.Interface().(string); !ok { + return nil, fmt.Errorf("map key needs to be a string, not %T (%v)", key.Interface(), key.Kind()) + } + } + + v := value.MapIndex(key) + newValue, err := toTree(v.Interface()) + if err != nil { + return nil, err + } + values[key.String()] = newValue + } + return &Tree{values: values, position: Position{}}, nil + } + + if value.Kind() == reflect.Array || value.Kind() == reflect.Slice { + return sliceToTree(object) + } + + simpleValue, err := simpleValueCoercion(object) + if err != nil { + return nil, err + } + return &tomlValue{value: simpleValue, position: Position{}}, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go new file mode 100755 index 0000000..d322a97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -0,0 +1,289 @@ +package toml + +import ( + "bytes" + "fmt" + "io" + "math" + "reflect" + "sort" + "strconv" + "strings" + "time" +) + +// encodes a string to a TOML-compliant string value +func encodeTomlString(value string) string { + var b bytes.Buffer + + for _, rr := range value { + switch rr { + case '\b': + b.WriteString(`\b`) + case '\t': + b.WriteString(`\t`) + case '\n': + b.WriteString(`\n`) + case '\f': + b.WriteString(`\f`) + case '\r': + b.WriteString(`\r`) + case '"': + b.WriteString(`\"`) + case '\\': + b.WriteString(`\\`) + default: + intRr := uint16(rr) + if intRr < 0x001F { + b.WriteString(fmt.Sprintf("\\u%0.4X", intRr)) + } else { + b.WriteRune(rr) + } + } + } + return b.String() +} + +func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { + switch value := v.(type) { + case uint64: + return strconv.FormatUint(value, 10), nil + case int64: + return strconv.FormatInt(value, 10), nil + case float64: + // Ensure a round float does contain a decimal point. Otherwise feeding + // the output back to the parser would convert to an integer. + if math.Trunc(value) == value { + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + } + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + case string: + return "\"" + encodeTomlString(value) + "\"", nil + case []byte: + b, _ := v.([]byte) + return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + case bool: + if value { + return "true", nil + } + return "false", nil + case time.Time: + return value.Format(time.RFC3339), nil + case nil: + return "", nil + } + + rv := reflect.ValueOf(v) + + if rv.Kind() == reflect.Slice { + var values []string + for i := 0; i < rv.Len(); i++ { + item := rv.Index(i).Interface() + itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + if err != nil { + return "", err + } + values = append(values, itemRepr) + } + if arraysOneElementPerLine && len(values) > 1 { + stringBuffer := bytes.Buffer{} + valueIndent := indent + ` ` // TODO: move that to a shared encoder state + + stringBuffer.WriteString("[\n") + + for i, value := range values { + stringBuffer.WriteString(valueIndent) + stringBuffer.WriteString(value) + if i != len(values)-1 { + stringBuffer.WriteString(`,`) + } + stringBuffer.WriteString("\n") + } + + stringBuffer.WriteString(indent + "]") + + return stringBuffer.String(), nil + } + return "[" + strings.Join(values, ",") + "]", nil + } + return "", fmt.Errorf("unsupported value type %T: %v", v, v) +} + +func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { + simpleValuesKeys := make([]string, 0) + complexValuesKeys := make([]string, 0) + + for k := range t.values { + v := t.values[k] + switch v.(type) { + case *Tree, []*Tree: + complexValuesKeys = append(complexValuesKeys, k) + default: + simpleValuesKeys = append(simpleValuesKeys, k) + } + } + + sort.Strings(simpleValuesKeys) + sort.Strings(complexValuesKeys) + + for _, k := range simpleValuesKeys { + v, ok := t.values[k].(*tomlValue) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + + repr, err := tomlValueStringRepresentation(v.value, indent, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + + if v.comment != "" { + comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n") + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + + var commented string + if v.commented { + commented = "# " + } + writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + } + + for _, k := range complexValuesKeys { + v := t.values[k] + + combinedKey := k + if keyspace != "" { + combinedKey = keyspace + "." + combinedKey + } + var commented string + if t.commented { + commented = "# " + } + + switch node := v.(type) { + // node has to be of those two types given how keys are sorted above + case *Tree: + tv, ok := t.values[k].(*Tree) + if !ok { + return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) + } + if tv.comment != "" { + comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1) + start := "# " + if strings.HasPrefix(comment, "#") { + start = "" + } + writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment) + bytesCount += int64(writtenBytesCountComment) + if errc != nil { + return bytesCount, errc + } + } + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + bytesCount, err = node.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + case []*Tree: + for _, subTree := range node { + writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") + bytesCount += int64(writtenBytesCount) + if err != nil { + return bytesCount, err + } + + bytesCount, err = subTree.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine) + if err != nil { + return bytesCount, err + } + } + } + } + + return bytesCount, nil +} + +func writeStrings(w io.Writer, s ...string) (int, error) { + var n int + for i := range s { + b, err := io.WriteString(w, s[i]) + n += b + if err != nil { + return n, err + } + } + return n, nil +} + +// WriteTo encode the Tree as Toml and writes it to the writer w. +// Returns the number of bytes written in case of success, or an error if anything happened. +func (t *Tree) WriteTo(w io.Writer) (int64, error) { + return t.writeTo(w, "", "", 0, false) +} + +// ToTomlString generates a human-readable representation of the current tree. +// Output spans multiple lines, and is suitable for ingest by a TOML parser. +// If the conversion cannot be performed, ToString returns a non-nil error. +func (t *Tree) ToTomlString() (string, error) { + var buf bytes.Buffer + _, err := t.WriteTo(&buf) + if err != nil { + return "", err + } + return buf.String(), nil +} + +// String generates a human-readable representation of the current tree. +// Alias of ToString. Present to implement the fmt.Stringer interface. +func (t *Tree) String() string { + result, _ := t.ToTomlString() + return result +} + +// ToMap recursively generates a representation of the tree using Go built-in structures. +// The following types are used: +// +// * bool +// * float64 +// * int64 +// * string +// * uint64 +// * time.Time +// * map[string]interface{} (where interface{} is any of this list) +// * []interface{} (where interface{} is any of this list) +func (t *Tree) ToMap() map[string]interface{} { + result := map[string]interface{}{} + + for k, v := range t.values { + switch node := v.(type) { + case []*Tree: + var array []interface{} + for _, item := range node { + array = append(array, item.ToMap()) + } + result[k] = array + case *Tree: + result[k] = node.ToMap() + case *tomlValue: + result[k] = node.value + } + } + return result +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE new file mode 100755 index 0000000..c67dad6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, Patrick Mezard +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go new file mode 100755 index 0000000..003e99f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -0,0 +1,772 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "

" lines in HTML files). That may be +// because this is the only method of the 3 that has a *concept* of +// "junk" . +// +// Timing: Basic R-O is cubic time worst case and quadratic time expected +// case. SequenceMatcher is quadratic time for the worst case and has +// expected-case behavior dependent in a complicated way on how many +// elements the sequences have in common; best case time is linear. +type SequenceMatcher struct { + a []string + b []string + b2j map[string][]int + IsJunk func(string) bool + autoJunk bool + bJunk map[string]struct{} + matchingBlocks []Match + fullBCount map[string]int + bPopular map[string]struct{} + opCodes []OpCode +} + +func NewMatcher(a, b []string) *SequenceMatcher { + m := SequenceMatcher{autoJunk: true} + m.SetSeqs(a, b) + return &m +} + +func NewMatcherWithJunk(a, b []string, autoJunk bool, + isJunk func(string) bool) *SequenceMatcher { + + m := SequenceMatcher{IsJunk: isJunk, autoJunk: autoJunk} + m.SetSeqs(a, b) + return &m +} + +// Set two sequences to be compared. +func (m *SequenceMatcher) SetSeqs(a, b []string) { + m.SetSeq1(a) + m.SetSeq2(b) +} + +// Set the first sequence to be compared. The second sequence to be compared is +// not changed. +// +// SequenceMatcher computes and caches detailed information about the second +// sequence, so if you want to compare one sequence S against many sequences, +// use .SetSeq2(s) once and call .SetSeq1(x) repeatedly for each of the other +// sequences. +// +// See also SetSeqs() and SetSeq2(). +func (m *SequenceMatcher) SetSeq1(a []string) { + if &a == &m.a { + return + } + m.a = a + m.matchingBlocks = nil + m.opCodes = nil +} + +// Set the second sequence to be compared. The first sequence to be compared is +// not changed. +func (m *SequenceMatcher) SetSeq2(b []string) { + if &b == &m.b { + return + } + m.b = b + m.matchingBlocks = nil + m.opCodes = nil + m.fullBCount = nil + m.chainB() +} + +func (m *SequenceMatcher) chainB() { + // Populate line -> index mapping + b2j := map[string][]int{} + for i, s := range m.b { + indices := b2j[s] + indices = append(indices, i) + b2j[s] = indices + } + + // Purge junk elements + m.bJunk = map[string]struct{}{} + if m.IsJunk != nil { + junk := m.bJunk + for s, _ := range b2j { + if m.IsJunk(s) { + junk[s] = struct{}{} + } + } + for s, _ := range junk { + delete(b2j, s) + } + } + + // Purge remaining popular elements + popular := map[string]struct{}{} + n := len(m.b) + if m.autoJunk && n >= 200 { + ntest := n/100 + 1 + for s, indices := range b2j { + if len(indices) > ntest { + popular[s] = struct{}{} + } + } + for s, _ := range popular { + delete(b2j, s) + } + } + m.bPopular = popular + m.b2j = b2j +} + +func (m *SequenceMatcher) isBJunk(s string) bool { + _, ok := m.bJunk[s] + return ok +} + +// Find longest matching block in a[alo:ahi] and b[blo:bhi]. +// +// If IsJunk is not defined: +// +// Return (i,j,k) such that a[i:i+k] is equal to b[j:j+k], where +// alo <= i <= i+k <= ahi +// blo <= j <= j+k <= bhi +// and for all (i',j',k') meeting those conditions, +// k >= k' +// i <= i' +// and if i == i', j <= j' +// +// In other words, of all maximal matching blocks, return one that +// starts earliest in a, and of all those maximal matching blocks that +// start earliest in a, return the one that starts earliest in b. +// +// If IsJunk is defined, first the longest matching block is +// determined as above, but with the additional restriction that no +// junk element appears in the block. Then that block is extended as +// far as possible by matching (only) junk elements on both sides. So +// the resulting block never matches on junk except as identical junk +// happens to be adjacent to an "interesting" match. +// +// If no blocks match, return (alo, blo, 0). +func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Match { + // CAUTION: stripping common prefix or suffix would be incorrect. + // E.g., + // ab + // acab + // Longest matching block is "ab", but if common prefix is + // stripped, it's "a" (tied with "b"). UNIX(tm) diff does so + // strip, so ends up claiming that ab is changed to acab by + // inserting "ca" in the middle. That's minimal but unintuitive: + // "it's obvious" that someone inserted "ac" at the front. + // Windiff ends up at the same place as diff, but by pairing up + // the unique 'b's and then matching the first two 'a's. + besti, bestj, bestsize := alo, blo, 0 + + // find longest junk-free match + // during an iteration of the loop, j2len[j] = length of longest + // junk-free match ending with a[i-1] and b[j] + j2len := map[int]int{} + for i := alo; i != ahi; i++ { + // look at all instances of a[i] in b; note that because + // b2j has no junk keys, the loop is skipped if a[i] is junk + newj2len := map[int]int{} + for _, j := range m.b2j[m.a[i]] { + // a[i] matches b[j] + if j < blo { + continue + } + if j >= bhi { + break + } + k := j2len[j-1] + 1 + newj2len[j] = k + if k > bestsize { + besti, bestj, bestsize = i-k+1, j-k+1, k + } + } + j2len = newj2len + } + + // Extend the best by non-junk elements on each end. In particular, + // "popular" non-junk elements aren't in b2j, which greatly speeds + // the inner loop above, but also means "the best" match so far + // doesn't contain any junk *or* popular non-junk elements. + for besti > alo && bestj > blo && !m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + !m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + // Now that we have a wholly interesting match (albeit possibly + // empty!), we may as well suck up the matching junk on each + // side of it too. Can't think of a good reason not to, and it + // saves post-processing the (possibly considerable) expense of + // figuring out what to do with it. In the case of an empty + // interesting match, this is clearly the right thing to do, + // because no other kind of match is possible in the regions. + for besti > alo && bestj > blo && m.isBJunk(m.b[bestj-1]) && + m.a[besti-1] == m.b[bestj-1] { + besti, bestj, bestsize = besti-1, bestj-1, bestsize+1 + } + for besti+bestsize < ahi && bestj+bestsize < bhi && + m.isBJunk(m.b[bestj+bestsize]) && + m.a[besti+bestsize] == m.b[bestj+bestsize] { + bestsize += 1 + } + + return Match{A: besti, B: bestj, Size: bestsize} +} + +// Return list of triples describing matching subsequences. +// +// Each triple is of the form (i, j, n), and means that +// a[i:i+n] == b[j:j+n]. The triples are monotonically increasing in +// i and in j. It's also guaranteed that if (i, j, n) and (i', j', n') are +// adjacent triples in the list, and the second is not the last triple in the +// list, then i+n != i' or j+n != j'. IOW, adjacent triples never describe +// adjacent equal blocks. +// +// The last triple is a dummy, (len(a), len(b), 0), and is the only +// triple with n==0. +func (m *SequenceMatcher) GetMatchingBlocks() []Match { + if m.matchingBlocks != nil { + return m.matchingBlocks + } + + var matchBlocks func(alo, ahi, blo, bhi int, matched []Match) []Match + matchBlocks = func(alo, ahi, blo, bhi int, matched []Match) []Match { + match := m.findLongestMatch(alo, ahi, blo, bhi) + i, j, k := match.A, match.B, match.Size + if match.Size > 0 { + if alo < i && blo < j { + matched = matchBlocks(alo, i, blo, j, matched) + } + matched = append(matched, match) + if i+k < ahi && j+k < bhi { + matched = matchBlocks(i+k, ahi, j+k, bhi, matched) + } + } + return matched + } + matched := matchBlocks(0, len(m.a), 0, len(m.b), nil) + + // It's possible that we have adjacent equal blocks in the + // matching_blocks list now. + nonAdjacent := []Match{} + i1, j1, k1 := 0, 0, 0 + for _, b := range matched { + // Is this block adjacent to i1, j1, k1? + i2, j2, k2 := b.A, b.B, b.Size + if i1+k1 == i2 && j1+k1 == j2 { + // Yes, so collapse them -- this just increases the length of + // the first block by the length of the second, and the first + // block so lengthened remains the block to compare against. + k1 += k2 + } else { + // Not adjacent. Remember the first block (k1==0 means it's + // the dummy we started with), and make the second block the + // new block to compare against. + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + i1, j1, k1 = i2, j2, k2 + } + } + if k1 > 0 { + nonAdjacent = append(nonAdjacent, Match{i1, j1, k1}) + } + + nonAdjacent = append(nonAdjacent, Match{len(m.a), len(m.b), 0}) + m.matchingBlocks = nonAdjacent + return m.matchingBlocks +} + +// Return list of 5-tuples describing how to turn a into b. +// +// Each tuple is of the form (tag, i1, i2, j1, j2). The first tuple +// has i1 == j1 == 0, and remaining tuples have i1 == the i2 from the +// tuple preceding it, and likewise for j1 == the previous j2. +// +// The tags are characters, with these meanings: +// +// 'r' (replace): a[i1:i2] should be replaced by b[j1:j2] +// +// 'd' (delete): a[i1:i2] should be deleted, j1==j2 in this case. +// +// 'i' (insert): b[j1:j2] should be inserted at a[i1:i1], i1==i2 in this case. +// +// 'e' (equal): a[i1:i2] == b[j1:j2] +func (m *SequenceMatcher) GetOpCodes() []OpCode { + if m.opCodes != nil { + return m.opCodes + } + i, j := 0, 0 + matching := m.GetMatchingBlocks() + opCodes := make([]OpCode, 0, len(matching)) + for _, m := range matching { + // invariant: we've pumped out correct diffs to change + // a[:i] into b[:j], and the next matching block is + // a[ai:ai+size] == b[bj:bj+size]. So we need to pump + // out a diff to change a[i:ai] into b[j:bj], pump out + // the matching block, and move (i,j) beyond the match + ai, bj, size := m.A, m.B, m.Size + tag := byte(0) + if i < ai && j < bj { + tag = 'r' + } else if i < ai { + tag = 'd' + } else if j < bj { + tag = 'i' + } + if tag > 0 { + opCodes = append(opCodes, OpCode{tag, i, ai, j, bj}) + } + i, j = ai+size, bj+size + // the list of matching blocks is terminated by a + // sentinel with size 0 + if size > 0 { + opCodes = append(opCodes, OpCode{'e', ai, i, bj, j}) + } + } + m.opCodes = opCodes + return m.opCodes +} + +// Isolate change clusters by eliminating ranges with no changes. +// +// Return a generator of groups with up to n lines of context. +// Each group is in the same format as returned by GetOpCodes(). +func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode { + if n < 0 { + n = 3 + } + codes := m.GetOpCodes() + if len(codes) == 0 { + codes = []OpCode{OpCode{'e', 0, 1, 0, 1}} + } + // Fixup leading and trailing groups if they show no changes. + if codes[0].Tag == 'e' { + c := codes[0] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[0] = OpCode{c.Tag, max(i1, i2-n), i2, max(j1, j2-n), j2} + } + if codes[len(codes)-1].Tag == 'e' { + c := codes[len(codes)-1] + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + codes[len(codes)-1] = OpCode{c.Tag, i1, min(i2, i1+n), j1, min(j2, j1+n)} + } + nn := n + n + groups := [][]OpCode{} + group := []OpCode{} + for _, c := range codes { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + // End the current group and start a new one whenever + // there is a large range with no changes. + if c.Tag == 'e' && i2-i1 > nn { + group = append(group, OpCode{c.Tag, i1, min(i2, i1+n), + j1, min(j2, j1+n)}) + groups = append(groups, group) + group = []OpCode{} + i1, j1 = max(i1, i2-n), max(j1, j2-n) + } + group = append(group, OpCode{c.Tag, i1, i2, j1, j2}) + } + if len(group) > 0 && !(len(group) == 1 && group[0].Tag == 'e') { + groups = append(groups, group) + } + return groups +} + +// Return a measure of the sequences' similarity (float in [0,1]). +// +// Where T is the total number of elements in both sequences, and +// M is the number of matches, this is 2.0*M / T. +// Note that this is 1 if the sequences are identical, and 0 if +// they have nothing in common. +// +// .Ratio() is expensive to compute if you haven't already computed +// .GetMatchingBlocks() or .GetOpCodes(), in which case you may +// want to try .QuickRatio() or .RealQuickRation() first to get an +// upper bound. +func (m *SequenceMatcher) Ratio() float64 { + matches := 0 + for _, m := range m.GetMatchingBlocks() { + matches += m.Size + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() relatively quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute. +func (m *SequenceMatcher) QuickRatio() float64 { + // viewing a and b as multisets, set matches to the cardinality + // of their intersection; this counts the number of matches + // without regard to order, so is clearly an upper bound + if m.fullBCount == nil { + m.fullBCount = map[string]int{} + for _, s := range m.b { + m.fullBCount[s] = m.fullBCount[s] + 1 + } + } + + // avail[x] is the number of times x appears in 'b' less the + // number of times we've seen it in 'a' so far ... kinda + avail := map[string]int{} + matches := 0 + for _, s := range m.a { + n, ok := avail[s] + if !ok { + n = m.fullBCount[s] + } + avail[s] = n - 1 + if n > 0 { + matches += 1 + } + } + return calculateRatio(matches, len(m.a)+len(m.b)) +} + +// Return an upper bound on ratio() very quickly. +// +// This isn't defined beyond that it is an upper bound on .Ratio(), and +// is faster to compute than either .Ratio() or .QuickRatio(). +func (m *SequenceMatcher) RealQuickRatio() float64 { + la, lb := len(m.a), len(m.b) + return calculateRatio(min(la, lb), la+lb) +} + +// Convert range to the "ed" format +func formatRangeUnified(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 1 { + return fmt.Sprintf("%d", beginning) + } + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + return fmt.Sprintf("%d,%d", beginning, length) +} + +// Unified diff parameters +type UnifiedDiff struct { + A []string // First sequence lines + FromFile string // First file name + FromDate string // First file time + B []string // Second sequence lines + ToFile string // Second file name + ToDate string // Second file time + Eol string // Headers end of line, defaults to LF + Context int // Number of context lines +} + +// Compare two sequences of lines; generate the delta as a unified diff. +// +// Unified diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by 'n' which +// defaults to three. +// +// By default, the diff control lines (those with ---, +++, or @@) are +// created with a trailing newline. This is helpful so that inputs +// created from file.readlines() result in diffs that are suitable for +// file.writelines() since both the inputs and outputs have trailing +// newlines. +// +// For inputs that do not have trailing newlines, set the lineterm +// argument to "" so that the output will be uniformly newline free. +// +// The unidiff format normally has a header for filenames and modification +// times. Any or all of these may be specified using strings for +// 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'. +// The modification times are normally expressed in the ISO 8601 format. +func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + wf := func(format string, args ...interface{}) error { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + return err + } + ws := func(s string) error { + _, err := buf.WriteString(s) + return err + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + err := wf("--- %s%s%s", diff.FromFile, fromDate, diff.Eol) + if err != nil { + return err + } + err = wf("+++ %s%s%s", diff.ToFile, toDate, diff.Eol) + if err != nil { + return err + } + } + } + first, last := g[0], g[len(g)-1] + range1 := formatRangeUnified(first.I1, last.I2) + range2 := formatRangeUnified(first.J1, last.J2) + if err := wf("@@ -%s +%s @@%s", range1, range2, diff.Eol); err != nil { + return err + } + for _, c := range g { + i1, i2, j1, j2 := c.I1, c.I2, c.J1, c.J2 + if c.Tag == 'e' { + for _, line := range diff.A[i1:i2] { + if err := ws(" " + line); err != nil { + return err + } + } + continue + } + if c.Tag == 'r' || c.Tag == 'd' { + for _, line := range diff.A[i1:i2] { + if err := ws("-" + line); err != nil { + return err + } + } + } + if c.Tag == 'r' || c.Tag == 'i' { + for _, line := range diff.B[j1:j2] { + if err := ws("+" + line); err != nil { + return err + } + } + } + } + } + return nil +} + +// Like WriteUnifiedDiff but returns the diff a string. +func GetUnifiedDiffString(diff UnifiedDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteUnifiedDiff(w, diff) + return string(w.Bytes()), err +} + +// Convert range to the "ed" format. +func formatRangeContext(start, stop int) string { + // Per the diff spec at http://www.unix.org/single_unix_specification/ + beginning := start + 1 // lines start numbering with one + length := stop - start + if length == 0 { + beginning -= 1 // empty ranges begin at line just before the range + } + if length <= 1 { + return fmt.Sprintf("%d", beginning) + } + return fmt.Sprintf("%d,%d", beginning, beginning+length-1) +} + +type ContextDiff UnifiedDiff + +// Compare two sequences of lines; generate the delta as a context diff. +// +// Context diffs are a compact way of showing line changes and a few +// lines of context. The number of context lines is set by diff.Context +// which defaults to three. +// +// By default, the diff control lines (those with *** or ---) are +// created with a trailing newline. +// +// For inputs that do not have trailing newlines, set the diff.Eol +// argument to "" so that the output will be uniformly newline free. +// +// The context diff format normally has a header for filenames and +// modification times. Any or all of these may be specified using +// strings for diff.FromFile, diff.ToFile, diff.FromDate, diff.ToDate. +// The modification times are normally expressed in the ISO 8601 format. +// If not specified, the strings default to blanks. +func WriteContextDiff(writer io.Writer, diff ContextDiff) error { + buf := bufio.NewWriter(writer) + defer buf.Flush() + var diffErr error + wf := func(format string, args ...interface{}) { + _, err := buf.WriteString(fmt.Sprintf(format, args...)) + if diffErr == nil && err != nil { + diffErr = err + } + } + ws := func(s string) { + _, err := buf.WriteString(s) + if diffErr == nil && err != nil { + diffErr = err + } + } + + if len(diff.Eol) == 0 { + diff.Eol = "\n" + } + + prefix := map[byte]string{ + 'i': "+ ", + 'd': "- ", + 'r': "! ", + 'e': " ", + } + + started := false + m := NewMatcher(diff.A, diff.B) + for _, g := range m.GetGroupedOpCodes(diff.Context) { + if !started { + started = true + fromDate := "" + if len(diff.FromDate) > 0 { + fromDate = "\t" + diff.FromDate + } + toDate := "" + if len(diff.ToDate) > 0 { + toDate = "\t" + diff.ToDate + } + if diff.FromFile != "" || diff.ToFile != "" { + wf("*** %s%s%s", diff.FromFile, fromDate, diff.Eol) + wf("--- %s%s%s", diff.ToFile, toDate, diff.Eol) + } + } + + first, last := g[0], g[len(g)-1] + ws("***************" + diff.Eol) + + range1 := formatRangeContext(first.I1, last.I2) + wf("*** %s ****%s", range1, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'd' { + for _, cc := range g { + if cc.Tag == 'i' { + continue + } + for _, line := range diff.A[cc.I1:cc.I2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + + range2 := formatRangeContext(first.J1, last.J2) + wf("--- %s ----%s", range2, diff.Eol) + for _, c := range g { + if c.Tag == 'r' || c.Tag == 'i' { + for _, cc := range g { + if cc.Tag == 'd' { + continue + } + for _, line := range diff.B[cc.J1:cc.J2] { + ws(prefix[cc.Tag] + line) + } + } + break + } + } + } + return diffErr +} + +// Like WriteContextDiff but returns the diff a string. +func GetContextDiffString(diff ContextDiff) (string, error) { + w := &bytes.Buffer{} + err := WriteContextDiff(w, diff) + return string(w.Bytes()), err +} + +// Split a string on "\n" while preserving them. The output can be used +// as input for UnifiedDiff and ContextDiff structures. +func SplitLines(s string) []string { + lines := strings.SplitAfter(s, "\n") + lines[len(lines)-1] += "\n" + return lines +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.gitignore new file mode 100755 index 0000000..5357942 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.gitignore @@ -0,0 +1,2 @@ +.git +*.swp diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.travis.yml new file mode 100755 index 0000000..d2d585c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/.travis.yml @@ -0,0 +1,13 @@ +language: go + +go: + - 1.2 + - 1.3 + - 1.4 + - tip + +install: + - go build . + +script: + - go test -v diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/LICENSE new file mode 100755 index 0000000..ad2148a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/LICENSE @@ -0,0 +1,45 @@ +The MIT License (MIT) + +Copyright (c) 2015 Spring, 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. + +- Based on https://github.com/oguzbilgic/fpd, which has the following license: +""" +The MIT License (MIT) + +Copyright (c) 2013 Oguz Bilgic + +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/skycoin/skycoin/vendor/github.com/shopspring/decimal/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/README.md new file mode 100755 index 0000000..54c1a6b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/README.md @@ -0,0 +1,126 @@ +# decimal + +[![Build Status](https://travis-ci.org/shopspring/decimal.png?branch=master)](https://travis-ci.org/shopspring/decimal) [![GoDoc](https://godoc.org/github.com/shopspring/decimal?status.svg)](https://godoc.org/github.com/shopspring/decimal) [![Go Report Card](https://goreportcard.com/badge/github.com/shopspring/decimal)](https://goreportcard.com/report/github.com/shopspring/decimal) + +Arbitrary-precision fixed-point decimal numbers in go. + +NOTE: can "only" represent numbers with a maximum of 2^31 digits after the decimal point. + +## Features + + * the zero-value is 0, and is safe to use without initialization + * addition, subtraction, multiplication with no loss of precision + * division with specified precision + * database/sql serialization/deserialization + * json and xml serialization/deserialization + +## Install + +Run `go get github.com/shopspring/decimal` + +## Usage + +```go +package main + +import ( + "fmt" + "github.com/shopspring/decimal" +) + +func main() { + price, err := decimal.NewFromString("136.02") + if err != nil { + panic(err) + } + + quantity := decimal.NewFromFloat(3) + + fee, _ := decimal.NewFromString(".035") + taxRate, _ := decimal.NewFromString(".08875") + + subtotal := price.Mul(quantity) + + preTax := subtotal.Mul(fee.Add(decimal.NewFromFloat(1))) + + total := preTax.Mul(taxRate.Add(decimal.NewFromFloat(1))) + + fmt.Println("Subtotal:", subtotal) // Subtotal: 408.06 + fmt.Println("Pre-tax:", preTax) // Pre-tax: 422.3421 + fmt.Println("Taxes:", total.Sub(preTax)) // Taxes: 37.482861375 + fmt.Println("Total:", total) // Total: 459.824961375 + fmt.Println("Tax rate:", total.Sub(preTax).Div(preTax)) // Tax rate: 0.08875 +} +``` + +## Documentation + +http://godoc.org/github.com/shopspring/decimal + +## Production Usage + +* [Spring](https://shopspring.com/), since August 14, 2014. +* If you are using this in production, please let us know! + +## FAQ + +#### Why don't you just use float64? + +Because float64s (or any binary floating point type, actually) can't represent +numbers such as 0.1 exactly. + +Consider this code: http://play.golang.org/p/TQBd4yJe6B You might expect that +it prints out `10`, but it actually prints `9.999999999999831`. Over time, +these small errors can really add up! + +#### Why don't you just use big.Rat? + +big.Rat is fine for representing rational numbers, but Decimal is better for +representing money. Why? Here's a (contrived) example: + +Let's say you use big.Rat, and you have two numbers, x and y, both +representing 1/3, and you have `z = 1 - x - y = 1/3`. If you print each one +out, the string output has to stop somewhere (let's say it stops at 3 decimal +digits, for simplicity), so you'll get 0.333, 0.333, and 0.333. But where did +the other 0.001 go? + +Here's the above example as code: http://play.golang.org/p/lCZZs0w9KE + +With Decimal, the strings being printed out represent the number exactly. So, +if you have `x = y = 1/3` (with precision 3), they will actually be equal to +0.333, and when you do `z = 1 - x - y`, `z` will be equal to .334. No money is +unaccounted for! + +You still have to be careful. If you want to split a number `N` 3 ways, you +can't just send `N/3` to three different people. You have to pick one to send +`N - (2/3*N)` to. That person will receive the fraction of a penny remainder. + +But, it is much easier to be careful with Decimal than with big.Rat. + +#### Why isn't the API similar to big.Int's? + +big.Int's API is built to reduce the number of memory allocations for maximal +performance. This makes sense for its use-case, but the trade-off is that the +API is awkward and easy to misuse. + +For example, to add two big.Ints, you do: `z := new(big.Int).Add(x, y)`. A +developer unfamiliar with this API might try to do `z := a.Add(a, b)`. This +modifies `a` and sets `z` as an alias for `a`, which they might not expect. It +also modifies any other aliases to `a`. + +Here's an example of the subtle bugs you can introduce with big.Int's API: +https://play.golang.org/p/x2R_78pa8r + +In contrast, it's difficult to make such mistakes with decimal. Decimals +behave like other go numbers types: even though `a = b` will not deep copy +`b` into `a`, it is impossible to modify a Decimal, since all Decimal methods +return new Decimals and do not modify the originals. The downside is that +this causes extra allocations, so Decimal is less performant. My assumption +is that if you're using Decimals, you probably care more about correctness +than performance. + +## License + +The MIT License (MIT) + +This is a heavily modified fork of [fpd.Decimal](https://github.com/oguzbilgic/fpd), which was also released under the MIT License. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/decimal.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/decimal.go new file mode 100755 index 0000000..20aa608 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/shopspring/decimal/decimal.go @@ -0,0 +1,1107 @@ +// Package decimal implements an arbitrary precision fixed-point decimal. +// +// To use as part of a struct: +// +// type Struct struct { +// Number Decimal +// } +// +// The zero-value of a Decimal is 0, as you would expect. +// +// The best way to create a new Decimal is to use decimal.NewFromString, ex: +// +// n, err := decimal.NewFromString("-123.4567") +// n.String() // output: "-123.4567" +// +// NOTE: This can "only" represent numbers with a maximum of 2^31 digits +// after the decimal point. +package decimal + +import ( + "database/sql/driver" + "encoding/binary" + "fmt" + "math" + "math/big" + "strconv" + "strings" +) + +// DivisionPrecision is the number of decimal places in the result when it +// doesn't divide exactly. +// +// Example: +// +// d1 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) +// d1.String() // output: "0.6666666666666667" +// d2 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(30000) +// d2.String() // output: "0.0000666666666667" +// d3 := decimal.NewFromFloat(20000).Div(decimal.NewFromFloat(3) +// d3.String() // output: "6666.6666666666666667" +// decimal.DivisionPrecision = 3 +// d4 := decimal.NewFromFloat(2).Div(decimal.NewFromFloat(3) +// d4.String() // output: "0.667" +// +var DivisionPrecision = 16 + +// MarshalJSONWithoutQuotes should be set to true if you want the decimal to +// be JSON marshaled as a number, instead of as a string. +// WARNING: this is dangerous for decimals with many digits, since many JSON +// unmarshallers (ex: Javascript's) will unmarshal JSON numbers to IEEE 754 +// double-precision floating point numbers, which means you can potentially +// silently lose precision. +var MarshalJSONWithoutQuotes = false + +// Zero constant, to make computations faster. +var Zero = New(0, 1) + +// fiveDec used in Cash Rounding +var fiveDec = New(5, 0) + +var zeroInt = big.NewInt(0) +var oneInt = big.NewInt(1) +var twoInt = big.NewInt(2) +var fourInt = big.NewInt(4) +var fiveInt = big.NewInt(5) +var tenInt = big.NewInt(10) +var twentyInt = big.NewInt(20) + +// Decimal represents a fixed-point decimal. It is immutable. +// number = value * 10 ^ exp +type Decimal struct { + value *big.Int + + // NOTE(vadim): this must be an int32, because we cast it to float64 during + // calculations. If exp is 64 bit, we might lose precision. + // If we cared about being able to represent every possible decimal, we + // could make exp a *big.Int but it would hurt performance and numbers + // like that are unrealistic. + exp int32 +} + +// New returns a new fixed-point decimal, value * 10 ^ exp. +func New(value int64, exp int32) Decimal { + return Decimal{ + value: big.NewInt(value), + exp: exp, + } +} + +// NewFromBigInt returns a new Decimal from a big.Int, value * 10 ^ exp +func NewFromBigInt(value *big.Int, exp int32) Decimal { + return Decimal{ + value: big.NewInt(0).Set(value), + exp: exp, + } +} + +// NewFromString returns a new Decimal from a string representation. +// +// Example: +// +// d, err := NewFromString("-123.45") +// d2, err := NewFromString(".0001") +// +func NewFromString(value string) (Decimal, error) { + originalInput := value + var intString string + var exp int64 + + // Check if number is using scientific notation + eIndex := strings.IndexAny(value, "Ee") + if eIndex != -1 { + expInt, err := strconv.ParseInt(value[eIndex+1:], 10, 32) + if err != nil { + if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", value) + } + return Decimal{}, fmt.Errorf("can't convert %s to decimal: exponent is not numeric", value) + } + value = value[:eIndex] + exp = expInt + } + + parts := strings.Split(value, ".") + if len(parts) == 1 { + // There is no decimal point, we can just parse the original string as + // an int + intString = value + } else if len(parts) == 2 { + // strip the insignificant digits for more accurate comparisons. + decimalPart := strings.TrimRight(parts[1], "0") + intString = parts[0] + decimalPart + expInt := -len(decimalPart) + exp += int64(expInt) + } else { + return Decimal{}, fmt.Errorf("can't convert %s to decimal: too many .s", value) + } + + dValue := new(big.Int) + _, ok := dValue.SetString(intString, 10) + if !ok { + return Decimal{}, fmt.Errorf("can't convert %s to decimal", value) + } + + if exp < math.MinInt32 || exp > math.MaxInt32 { + // NOTE(vadim): I doubt a string could realistically be this long + return Decimal{}, fmt.Errorf("can't convert %s to decimal: fractional part too long", originalInput) + } + + return Decimal{ + value: dValue, + exp: int32(exp), + }, nil +} + +// RequireFromString returns a new Decimal from a string representation +// or panics if NewFromString would have returned an error. +// +// Example: +// +// d := RequireFromString("-123.45") +// d2 := RequireFromString(".0001") +// +func RequireFromString(value string) Decimal { + dec, err := NewFromString(value) + if err != nil { + panic(err) + } + return dec +} + +// NewFromFloat converts a float64 to Decimal. +// +// Example: +// +// NewFromFloat(123.45678901234567).String() // output: "123.4567890123456" +// NewFromFloat(.00000000000000001).String() // output: "0.00000000000000001" +// +// NOTE: some float64 numbers can take up about 300 bytes of memory in decimal representation. +// Consider using NewFromFloatWithExponent if space is more important than precision. +// +// NOTE: this will panic on NaN, +/-inf +func NewFromFloat(value float64) Decimal { + return NewFromFloatWithExponent(value, math.MinInt32) +} + +// NewFromFloatWithExponent converts a float64 to Decimal, with an arbitrary +// number of fractional digits. +// +// Example: +// +// NewFromFloatWithExponent(123.456, -2).String() // output: "123.46" +// +func NewFromFloatWithExponent(value float64, exp int32) Decimal { + if math.IsNaN(value) || math.IsInf(value, 0) { + panic(fmt.Sprintf("Cannot create a Decimal from %v", value)) + } + + bits := math.Float64bits(value) + mant := bits & (1<<52 - 1) + exp2 := int32((bits >> 52) & (1<<11 - 1)) + sign := bits >> 63 + + if exp2 == 0 { + // specials + if mant == 0 { + return Decimal{} + } else { + // subnormal + exp2++ + } + } else { + // normal + mant |= 1 << 52 + } + + exp2 -= 1023 + 52 + + // normalizing base-2 values + for mant&1 == 0 { + mant = mant >> 1 + exp2++ + } + + // maximum number of fractional base-10 digits to represent 2^N exactly cannot be more than -N if N<0 + if exp < 0 && exp < exp2 { + if exp2 < 0 { + exp = exp2 + } else { + exp = 0 + } + } + + // representing 10^M * 2^N as 5^M * 2^(M+N) + exp2 -= exp + + temp := big.NewInt(1) + dMant := big.NewInt(int64(mant)) + + // applying 5^M + if exp > 0 { + temp = temp.SetInt64(int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + } else if exp < 0 { + temp = temp.SetInt64(-int64(exp)) + temp = temp.Exp(fiveInt, temp, nil) + dMant = dMant.Mul(dMant, temp) + temp = temp.SetUint64(1) + } + + // applying 2^(M+N) + if exp2 > 0 { + dMant = dMant.Lsh(dMant, uint(exp2)) + } else if exp2 < 0 { + temp = temp.Lsh(temp, uint(-exp2)) + } + + // rounding and downscaling + if exp > 0 || exp2 < 0 { + halfDown := new(big.Int).Rsh(temp, 1) + dMant = dMant.Add(dMant, halfDown) + dMant = dMant.Quo(dMant, temp) + } + + if sign == 1 { + dMant = dMant.Neg(dMant) + } + + return Decimal{ + value: dMant, + exp: exp, + } +} + +// rescale returns a rescaled version of the decimal. Returned +// decimal may be less precise if the given exponent is bigger +// than the initial exponent of the Decimal. +// NOTE: this will truncate, NOT round +// +// Example: +// +// d := New(12345, -4) +// d2 := d.rescale(-1) +// d3 := d2.rescale(-4) +// println(d1) +// println(d2) +// println(d3) +// +// Output: +// +// 1.2345 +// 1.2 +// 1.2000 +// +func (d Decimal) rescale(exp int32) Decimal { + d.ensureInitialized() + // NOTE(vadim): must convert exps to float64 before - to prevent overflow + diff := math.Abs(float64(exp) - float64(d.exp)) + value := new(big.Int).Set(d.value) + + expScale := new(big.Int).Exp(tenInt, big.NewInt(int64(diff)), nil) + if exp > d.exp { + value = value.Quo(value, expScale) + } else if exp < d.exp { + value = value.Mul(value, expScale) + } + + return Decimal{ + value: value, + exp: exp, + } +} + +// Abs returns the absolute value of the decimal. +func (d Decimal) Abs() Decimal { + d.ensureInitialized() + d2Value := new(big.Int).Abs(d.value) + return Decimal{ + value: d2Value, + exp: d.exp, + } +} + +// Add returns d + d2. +func (d Decimal) Add(d2 Decimal) Decimal { + baseScale := min(d.exp, d2.exp) + rd := d.rescale(baseScale) + rd2 := d2.rescale(baseScale) + + d3Value := new(big.Int).Add(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: baseScale, + } +} + +// Sub returns d - d2. +func (d Decimal) Sub(d2 Decimal) Decimal { + baseScale := min(d.exp, d2.exp) + rd := d.rescale(baseScale) + rd2 := d2.rescale(baseScale) + + d3Value := new(big.Int).Sub(rd.value, rd2.value) + return Decimal{ + value: d3Value, + exp: baseScale, + } +} + +// Neg returns -d. +func (d Decimal) Neg() Decimal { + d.ensureInitialized() + val := new(big.Int).Neg(d.value) + return Decimal{ + value: val, + exp: d.exp, + } +} + +// Mul returns d * d2. +func (d Decimal) Mul(d2 Decimal) Decimal { + d.ensureInitialized() + d2.ensureInitialized() + + expInt64 := int64(d.exp) + int64(d2.exp) + if expInt64 > math.MaxInt32 || expInt64 < math.MinInt32 { + // NOTE(vadim): better to panic than give incorrect results, as + // Decimals are usually used for money + panic(fmt.Sprintf("exponent %v overflows an int32!", expInt64)) + } + + d3Value := new(big.Int).Mul(d.value, d2.value) + return Decimal{ + value: d3Value, + exp: int32(expInt64), + } +} + +// Div returns d / d2. If it doesn't divide exactly, the result will have +// DivisionPrecision digits after the decimal point. +func (d Decimal) Div(d2 Decimal) Decimal { + return d.DivRound(d2, int32(DivisionPrecision)) +} + +// QuoRem does divsion with remainder +// d.QuoRem(d2,precision) returns quotient q and remainder r such that +// d = d2 * q + r, q an integer multiple of 10^(-precision) +// 0 <= r < abs(d2) * 10 ^(-precision) if d>=0 +// 0 >= r > -abs(d2) * 10 ^(-precision) if d<0 +// Note that precision<0 is allowed as input. +func (d Decimal) QuoRem(d2 Decimal, precision int32) (Decimal, Decimal) { + d.ensureInitialized() + d2.ensureInitialized() + if d2.value.Sign() == 0 { + panic("decimal division by 0") + } + scale := -precision + e := int64(d.exp - d2.exp - scale) + if e > math.MaxInt32 || e < math.MinInt32 { + panic("overflow in decimal QuoRem") + } + var aa, bb, expo big.Int + var scalerest int32 + // d = a 10^ea + // d2 = b 10^eb + if e < 0 { + aa = *d.value + expo.SetInt64(-e) + bb.Exp(tenInt, &expo, nil) + bb.Mul(d2.value, &bb) + scalerest = d.exp + // now aa = a + // bb = b 10^(scale + eb - ea) + } else { + expo.SetInt64(e) + aa.Exp(tenInt, &expo, nil) + aa.Mul(d.value, &aa) + bb = *d2.value + scalerest = scale + d2.exp + // now aa = a ^ (ea - eb - scale) + // bb = b + } + var q, r big.Int + q.QuoRem(&aa, &bb, &r) + dq := Decimal{value: &q, exp: scale} + dr := Decimal{value: &r, exp: scalerest} + return dq, dr +} + +// DivRound divides and rounds to a given precision +// i.e. to an integer multiple of 10^(-precision) +// for a positive quotient digit 5 is rounded up, away from 0 +// if the quotient is negative then digit 5 is rounded down, away from 0 +// Note that precision<0 is allowed as input. +func (d Decimal) DivRound(d2 Decimal, precision int32) Decimal { + // QuoRem already checks initialization + q, r := d.QuoRem(d2, precision) + // the actual rounding decision is based on comparing r*10^precision and d2/2 + // instead compare 2 r 10 ^precision and d2 + var rv2 big.Int + rv2.Abs(r.value) + rv2.Lsh(&rv2, 1) + // now rv2 = abs(r.value) * 2 + r2 := Decimal{value: &rv2, exp: r.exp + precision} + // r2 is now 2 * r * 10 ^ precision + var c = r2.Cmp(d2.Abs()) + + if c < 0 { + return q + } + + if d.value.Sign()*d2.value.Sign() < 0 { + return q.Sub(New(1, -precision)) + } + + return q.Add(New(1, -precision)) +} + +// Mod returns d % d2. +func (d Decimal) Mod(d2 Decimal) Decimal { + quo := d.Div(d2).Truncate(0) + return d.Sub(d2.Mul(quo)) +} + +// Pow returns d to the power d2 +func (d Decimal) Pow(d2 Decimal) Decimal { + var temp Decimal + if d2.IntPart() == 0 { + return NewFromFloat(1) + } + temp = d.Pow(d2.Div(NewFromFloat(2))) + if d2.IntPart()%2 == 0 { + return temp.Mul(temp) + } + if d2.IntPart() > 0 { + return temp.Mul(temp).Mul(d) + } + return temp.Mul(temp).Div(d) +} + +// Cmp compares the numbers represented by d and d2 and returns: +// +// -1 if d < d2 +// 0 if d == d2 +// +1 if d > d2 +// +func (d Decimal) Cmp(d2 Decimal) int { + d.ensureInitialized() + d2.ensureInitialized() + + if d.exp == d2.exp { + return d.value.Cmp(d2.value) + } + + baseExp := min(d.exp, d2.exp) + rd := d.rescale(baseExp) + rd2 := d2.rescale(baseExp) + + return rd.value.Cmp(rd2.value) +} + +// Equal returns whether the numbers represented by d and d2 are equal. +func (d Decimal) Equal(d2 Decimal) bool { + return d.Cmp(d2) == 0 +} + +// Equals is deprecated, please use Equal method instead +func (d Decimal) Equals(d2 Decimal) bool { + return d.Equal(d2) +} + +// GreaterThan (GT) returns true when d is greater than d2. +func (d Decimal) GreaterThan(d2 Decimal) bool { + return d.Cmp(d2) == 1 +} + +// GreaterThanOrEqual (GTE) returns true when d is greater than or equal to d2. +func (d Decimal) GreaterThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == 1 || cmp == 0 +} + +// LessThan (LT) returns true when d is less than d2. +func (d Decimal) LessThan(d2 Decimal) bool { + return d.Cmp(d2) == -1 +} + +// LessThanOrEqual (LTE) returns true when d is less than or equal to d2. +func (d Decimal) LessThanOrEqual(d2 Decimal) bool { + cmp := d.Cmp(d2) + return cmp == -1 || cmp == 0 +} + +// Sign returns: +// +// -1 if d < 0 +// 0 if d == 0 +// +1 if d > 0 +// +func (d Decimal) Sign() int { + if d.value == nil { + return 0 + } + return d.value.Sign() +} + +// Exponent returns the exponent, or scale component of the decimal. +func (d Decimal) Exponent() int32 { + return d.exp +} + +// Coefficient returns the coefficient of the decimal. It is scaled by 10^Exponent() +func (d Decimal) Coefficient() *big.Int { + // we copy the coefficient so that mutating the result does not mutate the + // Decimal. + return big.NewInt(0).Set(d.value) +} + +// IntPart returns the integer component of the decimal. +func (d Decimal) IntPart() int64 { + scaledD := d.rescale(0) + return scaledD.value.Int64() +} + +// Rat returns a rational number representation of the decimal. +func (d Decimal) Rat() *big.Rat { + d.ensureInitialized() + if d.exp <= 0 { + // NOTE(vadim): must negate after casting to prevent int32 overflow + denom := new(big.Int).Exp(tenInt, big.NewInt(-int64(d.exp)), nil) + return new(big.Rat).SetFrac(d.value, denom) + } + + mul := new(big.Int).Exp(tenInt, big.NewInt(int64(d.exp)), nil) + num := new(big.Int).Mul(d.value, mul) + return new(big.Rat).SetFrac(num, oneInt) +} + +// Float64 returns the nearest float64 value for d and a bool indicating +// whether f represents d exactly. +// For more details, see the documentation for big.Rat.Float64 +func (d Decimal) Float64() (f float64, exact bool) { + return d.Rat().Float64() +} + +// String returns the string representation of the decimal +// with the fixed point. +// +// Example: +// +// d := New(-12345, -3) +// println(d.String()) +// +// Output: +// +// -12.345 +// +func (d Decimal) String() string { + return d.string(true) +} + +// StringFixed returns a rounded fixed-point string with places digits after +// the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.5" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +// +func (d Decimal) StringFixed(places int32) string { + rounded := d.Round(places) + return rounded.string(false) +} + +// StringFixedBank returns a banker rounded fixed-point string with places digits +// after the decimal point. +// +// Example: +// +// NewFromFloat(0).StringFixed(2) // output: "0.00" +// NewFromFloat(0).StringFixed(0) // output: "0" +// NewFromFloat(5.45).StringFixed(0) // output: "5" +// NewFromFloat(5.45).StringFixed(1) // output: "5.4" +// NewFromFloat(5.45).StringFixed(2) // output: "5.45" +// NewFromFloat(5.45).StringFixed(3) // output: "5.450" +// NewFromFloat(545).StringFixed(-1) // output: "550" +// +func (d Decimal) StringFixedBank(places int32) string { + rounded := d.RoundBank(places) + return rounded.string(false) +} + +// StringFixedCash returns a Swedish/Cash rounded fixed-point string. For +// more details see the documentation at function RoundCash. +func (d Decimal) StringFixedCash(interval uint8) string { + rounded := d.RoundCash(interval) + return rounded.string(false) +} + +// Round rounds the decimal to places decimal places. +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Example: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.5" +// NewFromFloat(545).Round(-1).String() // output: "550" +// +func (d Decimal) Round(places int32) Decimal { + // truncate to places + 1 + ret := d.rescale(-places - 1) + + // add sign(d) * 0.5 + if ret.value.Sign() < 0 { + ret.value.Sub(ret.value, fiveInt) + } else { + ret.value.Add(ret.value, fiveInt) + } + + // floor for positive numbers, ceil for negative numbers + _, m := ret.value.DivMod(ret.value, tenInt, new(big.Int)) + ret.exp++ + if ret.value.Sign() < 0 && m.Cmp(zeroInt) != 0 { + ret.value.Add(ret.value, oneInt) + } + + return ret +} + +// RoundBank rounds the decimal to places decimal places. +// If the final digit to round is equidistant from the nearest two integers the +// rounded value is taken as the even number +// +// If places < 0, it will round the integer part to the nearest 10^(-places). +// +// Examples: +// +// NewFromFloat(5.45).Round(1).String() // output: "5.4" +// NewFromFloat(545).Round(-1).String() // output: "540" +// NewFromFloat(5.46).Round(1).String() // output: "5.5" +// NewFromFloat(546).Round(-1).String() // output: "550" +// NewFromFloat(5.55).Round(1).String() // output: "5.6" +// NewFromFloat(555).Round(-1).String() // output: "560" +// +func (d Decimal) RoundBank(places int32) Decimal { + + round := d.Round(places) + remainder := d.Sub(round).Abs() + + half := New(5, -places-1) + if remainder.Cmp(half) == 0 && round.value.Bit(0) != 0 { + if round.value.Sign() < 0 { + round.value.Add(round.value, oneInt) + } else { + round.value.Sub(round.value, oneInt) + } + } + + return round +} + +// RoundCash aka Cash/Penny/öre rounding rounds decimal to a specific +// interval. The amount payable for a cash transaction is rounded to the nearest +// multiple of the minimum currency unit available. The following intervals are +// available: 5, 10, 15, 25, 50 and 100; any other number throws a panic. +// 5: 5 cent rounding 3.43 => 3.45 +// 10: 10 cent rounding 3.45 => 3.50 (5 gets rounded up) +// 15: 10 cent rounding 3.45 => 3.40 (5 gets rounded down) +// 25: 25 cent rounding 3.41 => 3.50 +// 50: 50 cent rounding 3.75 => 4.00 +// 100: 100 cent rounding 3.50 => 4.00 +// For more details: https://en.wikipedia.org/wiki/Cash_rounding +func (d Decimal) RoundCash(interval uint8) Decimal { + var iVal *big.Int + switch interval { + case 5: + iVal = twentyInt + case 10: + iVal = tenInt + case 15: + if d.exp < 0 { + // TODO: optimize and reduce allocations + orgExp := d.exp + dOne := New(10^-int64(orgExp), orgExp) + d2 := d + d2.exp = 0 + if d2.Mod(fiveDec).Equal(Zero) { + d2.exp = orgExp + d2 = d2.Sub(dOne) + d = d2 + } + } + iVal = tenInt + case 25: + iVal = fourInt + case 50: + iVal = twoInt + case 100: + iVal = oneInt + default: + panic(fmt.Sprintf("Decimal does not support this Cash rounding interval `%d`. Supported: 5, 10, 15, 25, 50, 100", interval)) + } + dVal := Decimal{ + value: iVal, + } + // TODO: optimize those calculations to reduce the high allocations (~29 allocs). + return d.Mul(dVal).Round(0).Div(dVal).Truncate(2) +} + +// Floor returns the nearest integer value less than or equal to d. +func (d Decimal) Floor() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z := new(big.Int).Div(d.value, exp) + return Decimal{value: z, exp: 0} +} + +// Ceil returns the nearest integer value greater than or equal to d. +func (d Decimal) Ceil() Decimal { + d.ensureInitialized() + + if d.exp >= 0 { + return d + } + + exp := big.NewInt(10) + + // NOTE(vadim): must negate after casting to prevent int32 overflow + exp.Exp(exp, big.NewInt(-int64(d.exp)), nil) + + z, m := new(big.Int).DivMod(d.value, exp, new(big.Int)) + if m.Cmp(zeroInt) != 0 { + z.Add(z, oneInt) + } + return Decimal{value: z, exp: 0} +} + +// Truncate truncates off digits from the number, without rounding. +// +// NOTE: precision is the last digit that will not be truncated (must be >= 0). +// +// Example: +// +// decimal.NewFromString("123.456").Truncate(2).String() // "123.45" +// +func (d Decimal) Truncate(precision int32) Decimal { + d.ensureInitialized() + if precision >= 0 && -precision > d.exp { + return d.rescale(-precision) + } + return d +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *Decimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + return nil + } + + str, err := unquoteIfQuoted(decimalBytes) + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", decimalBytes, err) + } + + decimal, err := NewFromString(str) + *d = decimal + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", str, err) + } + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (d Decimal) MarshalJSON() ([]byte, error) { + var str string + if MarshalJSONWithoutQuotes { + str = d.String() + } else { + str = "\"" + d.String() + "\"" + } + return []byte(str), nil +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. As a string representation +// is already used when encoding to text, this method stores that string as []byte +func (d *Decimal) UnmarshalBinary(data []byte) error { + // Extract the exponent + d.exp = int32(binary.BigEndian.Uint32(data[:4])) + + // Extract the value + d.value = new(big.Int) + return d.value.GobDecode(data[4:]) +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (d Decimal) MarshalBinary() (data []byte, err error) { + // Write the exponent first since it's a fixed size + v1 := make([]byte, 4) + binary.BigEndian.PutUint32(v1, uint32(d.exp)) + + // Add the value + var v2 []byte + if v2, err = d.value.GobEncode(); err != nil { + return + } + + // Return the byte array + data = append(v1, v2...) + return +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *Decimal) Scan(value interface{}) error { + // first try to see if the data is stored in database as a Numeric datatype + switch v := value.(type) { + + case float32: + *d = NewFromFloat(float64(v)) + return nil + + case float64: + // numeric in sqlite3 sends us float64 + *d = NewFromFloat(v) + return nil + + case int64: + // at least in sqlite3 when the value is 0 in db, the data is sent + // to us as an int64 instead of a float64 ... + *d = New(v, 0) + return nil + + default: + // default is trying to interpret value stored as string + str, err := unquoteIfQuoted(v) + if err != nil { + return err + } + *d, err = NewFromString(str) + return err + } +} + +// Value implements the driver.Valuer interface for database serialization. +func (d Decimal) Value() (driver.Value, error) { + return d.String(), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for XML +// deserialization. +func (d *Decimal) UnmarshalText(text []byte) error { + str := string(text) + + dec, err := NewFromString(str) + *d = dec + if err != nil { + return fmt.Errorf("Error decoding string '%s': %s", str, err) + } + + return nil +} + +// MarshalText implements the encoding.TextMarshaler interface for XML +// serialization. +func (d Decimal) MarshalText() (text []byte, err error) { + return []byte(d.String()), nil +} + +// GobEncode implements the gob.GobEncoder interface for gob serialization. +func (d Decimal) GobEncode() ([]byte, error) { + return d.MarshalBinary() +} + +// GobDecode implements the gob.GobDecoder interface for gob serialization. +func (d *Decimal) GobDecode(data []byte) error { + return d.UnmarshalBinary(data) +} + +// StringScaled first scales the decimal then calls .String() on it. +// NOTE: buggy, unintuitive, and DEPRECATED! Use StringFixed instead. +func (d Decimal) StringScaled(exp int32) string { + return d.rescale(exp).String() +} + +func (d Decimal) string(trimTrailingZeros bool) string { + if d.exp >= 0 { + return d.rescale(0).value.String() + } + + abs := new(big.Int).Abs(d.value) + str := abs.String() + + var intPart, fractionalPart string + + // NOTE(vadim): this cast to int will cause bugs if d.exp == INT_MIN + // and you are on a 32-bit machine. Won't fix this super-edge case. + dExpInt := int(d.exp) + if len(str) > -dExpInt { + intPart = str[:len(str)+dExpInt] + fractionalPart = str[len(str)+dExpInt:] + } else { + intPart = "0" + + num0s := -dExpInt - len(str) + fractionalPart = strings.Repeat("0", num0s) + str + } + + if trimTrailingZeros { + i := len(fractionalPart) - 1 + for ; i >= 0; i-- { + if fractionalPart[i] != '0' { + break + } + } + fractionalPart = fractionalPart[:i+1] + } + + number := intPart + if len(fractionalPart) > 0 { + number += "." + fractionalPart + } + + if d.value.Sign() < 0 { + return "-" + number + } + + return number +} + +func (d *Decimal) ensureInitialized() { + if d.value == nil { + d.value = new(big.Int) + } +} + +// Min returns the smallest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Min(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Min with 0 arguments. +func Min(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) < 0 { + ans = item + } + } + return ans +} + +// Max returns the largest Decimal that was passed in the arguments. +// +// To call this function with an array, you must do: +// +// Max(arr[0], arr[1:]...) +// +// This makes it harder to accidentally call Max with 0 arguments. +func Max(first Decimal, rest ...Decimal) Decimal { + ans := first + for _, item := range rest { + if item.Cmp(ans) > 0 { + ans = item + } + } + return ans +} + +// Sum returns the combined total of the provided first and rest Decimals +func Sum(first Decimal, rest ...Decimal) Decimal { + total := first + for _, item := range rest { + total = total.Add(item) + } + + return total +} + +// Avg returns the average value of the provided first and rest Decimals +func Avg(first Decimal, rest ...Decimal) Decimal { + count := New(int64(len(rest)+1), 0) + sum := Sum(first, rest...) + return sum.Div(count) +} + +func min(x, y int32) int32 { + if x >= y { + return y + } + return x +} + +func unquoteIfQuoted(value interface{}) (string, error) { + var bytes []byte + + switch v := value.(type) { + case string: + bytes = []byte(v) + case []byte: + bytes = v + default: + return "", fmt.Errorf("Could not convert value '%+v' to byte array of type '%T'", + value, value) + } + + // If the amount is quoted, strip the quotes + if len(bytes) > 2 && bytes[0] == '"' && bytes[len(bytes)-1] == '"' { + bytes = bytes[1 : len(bytes)-1] + } + return string(bytes), nil +} + +// NullDecimal represents a nullable decimal with compatibility for +// scanning null values from the database. +type NullDecimal struct { + Decimal Decimal + Valid bool +} + +// Scan implements the sql.Scanner interface for database deserialization. +func (d *NullDecimal) Scan(value interface{}) error { + if value == nil { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.Scan(value) +} + +// Value implements the driver.Valuer interface for database serialization. +func (d NullDecimal) Value() (driver.Value, error) { + if !d.Valid { + return nil, nil + } + return d.Decimal.Value() +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +func (d *NullDecimal) UnmarshalJSON(decimalBytes []byte) error { + if string(decimalBytes) == "null" { + d.Valid = false + return nil + } + d.Valid = true + return d.Decimal.UnmarshalJSON(decimalBytes) +} + +// MarshalJSON implements the json.Marshaler interface. +func (d NullDecimal) MarshalJSON() ([]byte, error) { + if !d.Valid { + return []byte("null"), nil + } + return d.Decimal.MarshalJSON() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.gitignore new file mode 100755 index 0000000..66be63a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.gitignore @@ -0,0 +1 @@ +logrus diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.travis.yml new file mode 100755 index 0000000..a23296a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/.travis.yml @@ -0,0 +1,15 @@ +language: go +go: + - 1.6.x + - 1.7.x + - 1.8.x + - tip +env: + - GOMAXPROCS=4 GORACE=halt_on_error=1 +install: + - go get github.com/stretchr/testify/assert + - go get gopkg.in/gemnasium/logrus-airbrake-hook.v2 + - go get golang.org/x/sys/unix + - go get golang.org/x/sys/windows +script: + - go test -race -v ./... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/CHANGELOG.md new file mode 100755 index 0000000..1bd1deb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/CHANGELOG.md @@ -0,0 +1,123 @@ +# 1.0.5 + +* Fix hooks race (#707) +* Fix panic deadlock (#695) + +# 1.0.4 + +* Fix race when adding hooks (#612) +* Fix terminal check in AppEngine (#635) + +# 1.0.3 + +* Replace example files with testable examples + +# 1.0.2 + +* bug: quote non-string values in text formatter (#583) +* Make (*Logger) SetLevel a public method + +# 1.0.1 + +* bug: fix escaping in text formatter (#575) + +# 1.0.0 + +* Officially changed name to lower-case +* bug: colors on Windows 10 (#541) +* bug: fix race in accessing level (#512) + +# 0.11.5 + +* feature: add writer and writerlevel to entry (#372) + +# 0.11.4 + +* bug: fix undefined variable on solaris (#493) + +# 0.11.3 + +* formatter: configure quoting of empty values (#484) +* formatter: configure quoting character (default is `"`) (#484) +* bug: fix not importing io correctly in non-linux environments (#481) + +# 0.11.2 + +* bug: fix windows terminal detection (#476) + +# 0.11.1 + +* bug: fix tty detection with custom out (#471) + +# 0.11.0 + +* performance: Use bufferpool to allocate (#370) +* terminal: terminal detection for app-engine (#343) +* feature: exit handler (#375) + +# 0.10.0 + +* feature: Add a test hook (#180) +* feature: `ParseLevel` is now case-insensitive (#326) +* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) +* performance: avoid re-allocations on `WithFields` (#335) + +# 0.9.0 + +* logrus/text_formatter: don't emit empty msg +* logrus/hooks/airbrake: move out of main repository +* logrus/hooks/sentry: move out of main repository +* logrus/hooks/papertrail: move out of main repository +* logrus/hooks/bugsnag: move out of main repository +* logrus/core: run tests with `-race` +* logrus/core: detect TTY based on `stderr` +* logrus/core: support `WithError` on logger +* logrus/core: Solaris support + +# 0.8.7 + +* logrus/core: fix possible race (#216) +* logrus/doc: small typo fixes and doc improvements + + +# 0.8.6 + +* hooks/raven: allow passing an initialized client + +# 0.8.5 + +* logrus/core: revert #208 + +# 0.8.4 + +* formatter/text: fix data race (#218) + +# 0.8.3 + +* logrus/core: fix entry log level (#208) +* logrus/core: improve performance of text formatter by 40% +* logrus/core: expose `LevelHooks` type +* logrus/core: add support for DragonflyBSD and NetBSD +* formatter/text: print structs more verbosely + +# 0.8.2 + +* logrus: fix more Fatal family functions + +# 0.8.1 + +* logrus: fix not exiting on `Fatalf` and `Fatalln` + +# 0.8.0 + +* logrus: defaults to stderr instead of stdout +* hooks/sentry: add special field for `*http.Request` +* formatter/text: ignore Windows for colors + +# 0.7.3 + +* formatter/\*: allow configuration of timestamp layout + +# 0.7.2 + +* formatter/text: Add configuration option for time format (#158) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/LICENSE new file mode 100755 index 0000000..f090cb4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Simon Eskildsen + +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/skycoin/skycoin/vendor/github.com/sirupsen/logrus/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/README.md new file mode 100755 index 0000000..f77819b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/README.md @@ -0,0 +1,511 @@ +# Logrus :walrus: [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) + +Logrus is a structured logger for Go (golang), completely API compatible with +the standard library logger. + +**Seeing weird case-sensitive problems?** It's in the past been possible to +import Logrus as both upper- and lower-case. Due to the Go package environment, +this caused issues in the community and we needed a standard. Some environments +experienced problems with the upper-case variant, so the lower-case was decided. +Everything using `logrus` will need to use the lower-case: +`github.com/sirupsen/logrus`. Any package that isn't, should be changed. + +To fix Glide, see [these +comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). +For an in-depth explanation of the casing issue, see [this +comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). + +**Are you interested in assisting in maintaining Logrus?** Currently I have a +lot of obligations, and I am unable to provide Logrus with the maintainership it +needs. If you'd like to help, please reach out to me at `simon at author's +username dot com`. + +Nicely color-coded in development (when a TTY is attached, otherwise just +plain text): + +![Colored](http://i.imgur.com/PY7qMwd.png) + +With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash +or Splunk: + +```json +{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the +ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} + +{"level":"warning","msg":"The group's number increased tremendously!", +"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"A giant walrus appears!", +"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", +"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} + +{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, +"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} +``` + +With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not +attached, the output is compatible with the +[logfmt](http://godoc.org/github.com/kr/logfmt) format: + +```text +time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 +time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 +time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true +time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 +time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 +time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true +exit status 1 +``` + +#### Case-sensitivity + +The organization's name was changed to lower-case--and this will not be changed +back. If you are getting import conflicts due to case sensitivity, please use +the lower-case import: `github.com/sirupsen/logrus`. + +#### Example + +The simplest way to use Logrus is simply the package-level exported logger: + +```go +package main + +import ( + log "github.com/sirupsen/logrus" +) + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + }).Info("A walrus appears") +} +``` + +Note that it's completely api-compatible with the stdlib logger, so you can +replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` +and you'll now have the flexibility of Logrus. You can customize it all you +want: + +```go +package main + +import ( + "os" + log "github.com/sirupsen/logrus" +) + +func init() { + // Log as JSON instead of the default ASCII formatter. + log.SetFormatter(&log.JSONFormatter{}) + + // Output to stdout instead of the default stderr + // Can be any io.Writer, see below for File example + log.SetOutput(os.Stdout) + + // Only log the warning severity or above. + log.SetLevel(log.WarnLevel) +} + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") + + log.WithFields(log.Fields{ + "omg": true, + "number": 122, + }).Warn("The group's number increased tremendously!") + + log.WithFields(log.Fields{ + "omg": true, + "number": 100, + }).Fatal("The ice breaks!") + + // A common pattern is to re-use fields between logging statements by re-using + // the logrus.Entry returned from WithFields() + contextLogger := log.WithFields(log.Fields{ + "common": "this is a common field", + "other": "I also should be logged always", + }) + + contextLogger.Info("I'll be logged with common and other field") + contextLogger.Info("Me too") +} +``` + +For more advanced usage such as logging to multiple locations from the same +application, you can also create an instance of the `logrus` Logger: + +```go +package main + +import ( + "os" + "github.com/sirupsen/logrus" +) + +// Create a new instance of the logger. You can have any number of instances. +var log = logrus.New() + +func main() { + // The API for setting attributes is a little different than the package level + // exported logger. See Godoc. + log.Out = os.Stdout + + // You could set this to any `io.Writer` such as a file + // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) + // if err == nil { + // log.Out = file + // } else { + // log.Info("Failed to log to file, using default stderr") + // } + + log.WithFields(logrus.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") +} +``` + +#### Fields + +Logrus encourages careful, structured logging through logging fields instead of +long, unparseable error messages. For example, instead of: `log.Fatalf("Failed +to send event %s to topic %s with key %d")`, you should log the much more +discoverable: + +```go +log.WithFields(log.Fields{ + "event": event, + "topic": topic, + "key": key, +}).Fatal("Failed to send event") +``` + +We've found this API forces you to think about logging in a way that produces +much more useful logging messages. We've been in countless situations where just +a single added field to a log statement that was already there would've saved us +hours. The `WithFields` call is optional. + +In general, with Logrus using any of the `printf`-family functions should be +seen as a hint you should add a field, however, you can still use the +`printf`-family functions with Logrus. + +#### Default Fields + +Often it's helpful to have fields _always_ attached to log statements in an +application or parts of one. For example, you may want to always log the +`request_id` and `user_ip` in the context of a request. Instead of writing +`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on +every line, you can create a `logrus.Entry` to pass around instead: + +```go +requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) +requestLogger.Info("something happened on that request") # will log request_id and user_ip +requestLogger.Warn("something not great happened") +``` + +#### Hooks + +You can add hooks for logging levels. For example to send errors to an exception +tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to +multiple places simultaneously, e.g. syslog. + +Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in +`init`: + +```go +import ( + log "github.com/sirupsen/logrus" + "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" + logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" + "log/syslog" +) + +func init() { + + // Use the Airbrake hook to report errors that have Error severity or above to + // an exception tracker. You can create custom hooks, see the Hooks section. + log.AddHook(airbrake.NewHook(123, "xyz", "production")) + + hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") + if err != nil { + log.Error("Unable to connect to local syslog daemon") + } else { + log.AddHook(hook) + } +} +``` +Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). + +| Hook | Description | +| ----- | ----------- | +| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. | +| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. | +| [Amazon Kinesis](https://github.com/evalphobia/logrus_kinesis) | Hook for logging to [Amazon Kinesis](https://aws.amazon.com/kinesis/) | +| [Amqp-Hook](https://github.com/vladoatanasov/logrus_amqp) | Hook for logging to Amqp broker (Like RabbitMQ) | +| [Application Insights](https://github.com/jjcollinge/logrus-appinsights) | Hook for logging to [Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) +| [AzureTableHook](https://github.com/kpfaulkner/azuretablehook/) | Hook for logging to Azure Table Storage| +| [Bugsnag](https://github.com/Shopify/logrus-bugsnag/blob/master/bugsnag.go) | Send errors to the Bugsnag exception tracking service. | +| [DeferPanic](https://github.com/deferpanic/dp-logrus) | Hook for logging to DeferPanic | +| [Discordrus](https://github.com/kz/discordrus) | Hook for logging to [Discord](https://discordapp.com/) | +| [ElasticSearch](https://github.com/sohlich/elogrus) | Hook for logging to ElasticSearch| +| [Firehose](https://github.com/beaubrewer/logrus_firehose) | Hook for logging to [Amazon Firehose](https://aws.amazon.com/kinesis/firehose/) +| [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd | +| [Go-Slack](https://github.com/multiplay/go-slack) | Hook for logging to [Slack](https://slack.com) | +| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) | +| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. | +| [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger | +| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb | +| [Influxus](http://github.com/vlad-doru/influxus) | Hook for concurrently logging to [InfluxDB](http://influxdata.com/) | +| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` | +| [KafkaLogrus](https://github.com/tracer0tong/kafkalogrus) | Hook for logging to Kafka | +| [Kafka REST Proxy](https://github.com/Nordstrom/logrus-kafka-rest-proxy) | Hook for logging to [Kafka REST Proxy](https://docs.confluent.io/current/kafka-rest/docs) | +| [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem | +| [Logbeat](https://github.com/macandmia/logbeat) | Hook for logging to [Opbeat](https://opbeat.com/) | +| [Logentries](https://github.com/jcftang/logentriesrus) | Hook for logging to [Logentries](https://logentries.com/) | +| [Logentrus](https://github.com/puddingfactory/logentrus) | Hook for logging to [Logentries](https://logentries.com/) | +| [Logmatic.io](https://github.com/logmatic/logmatic-go) | Hook for logging to [Logmatic.io](http://logmatic.io/) | +| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) | +| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) | +| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail | +| [Mattermost](https://github.com/shuLhan/mattermost-integration/tree/master/hooks/logrus) | Hook for logging to [Mattermost](https://mattermost.com/) | +| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb | +| [NATS-Hook](https://github.com/rybit/nats_logrus_hook) | Hook for logging to [NATS](https://nats.io) | +| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit | +| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. | +| [PostgreSQL](https://github.com/gemnasium/logrus-postgresql-hook) | Send logs to [PostgreSQL](http://postgresql.org) | +| [Promrus](https://github.com/weaveworks/promrus) | Expose number of log messages as [Prometheus](https://prometheus.io/) metrics | +| [Pushover](https://github.com/toorop/logrus_pushover) | Send error via [Pushover](https://pushover.net) | +| [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) | +| [Redis-Hook](https://github.com/rogierlommers/logrus-redis-hook) | Hook for logging to a ELK stack (through Redis) | +| [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar | +| [Scribe](https://github.com/sagar8192/logrus-scribe-hook) | Hook for logging to [Scribe](https://github.com/facebookarchive/scribe)| +| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. | +| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. | +| [Stackdriver](https://github.com/knq/sdhook) | Hook for logging to [Google Stackdriver](https://cloud.google.com/logging/) | +| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)| +| [Syslog](https://github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. | +| [Syslog TLS](https://github.com/shinji62/logrus-syslog-ng) | Send errors to remote syslog server with TLS support. | +| [Telegram](https://github.com/rossmcdonald/telegram_hook) | Hook for logging errors to [Telegram](https://telegram.org/) | +| [TraceView](https://github.com/evalphobia/logrus_appneta) | Hook for logging to [AppNeta TraceView](https://www.appneta.com/products/traceview/) | +| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) | +| [logz.io](https://github.com/ripcurld00d/logrus-logzio-hook) | Hook for logging to [logz.io](https://logz.io), a Log as a Service using Logstash | +| [SQS-Hook](https://github.com/tsarpaul/logrus_sqs) | Hook for logging to [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/) | + +#### Level logging + +Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic. + +```go +log.Debug("Useful debugging information.") +log.Info("Something noteworthy happened!") +log.Warn("You should probably take a look at this.") +log.Error("Something failed but I'm not quitting.") +// Calls os.Exit(1) after logging +log.Fatal("Bye.") +// Calls panic() after logging +log.Panic("I'm bailing.") +``` + +You can set the logging level on a `Logger`, then it will only log entries with +that severity or anything above it: + +```go +// Will log anything that is info or above (warn, error, fatal, panic). Default. +log.SetLevel(log.InfoLevel) +``` + +It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose +environment if your application has that. + +#### Entries + +Besides the fields added with `WithField` or `WithFields` some fields are +automatically added to all logging events: + +1. `time`. The timestamp when the entry was created. +2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after + the `AddFields` call. E.g. `Failed to send event.` +3. `level`. The logging level. E.g. `info`. + +#### Environments + +Logrus has no notion of environment. + +If you wish for hooks and formatters to only be used in specific environments, +you should handle that yourself. For example, if your application has a global +variable `Environment`, which is a string representation of the environment you +could do: + +```go +import ( + log "github.com/sirupsen/logrus" +) + +init() { + // do something here to set environment depending on an environment variable + // or command-line flag + if Environment == "production" { + log.SetFormatter(&log.JSONFormatter{}) + } else { + // The TextFormatter is default, you don't actually have to do this. + log.SetFormatter(&log.TextFormatter{}) + } +} +``` + +This configuration is how `logrus` was intended to be used, but JSON in +production is mostly only useful if you do log aggregation with tools like +Splunk or Logstash. + +#### Formatters + +The built-in logging formatters are: + +* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise + without colors. + * *Note:* to force colored output when there is no TTY, set the `ForceColors` + field to `true`. To force no colored output even if there is a TTY set the + `DisableColors` field to `true`. For Windows, see + [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). +* `logrus.JSONFormatter`. Logs fields as JSON. + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). + +Third party logging formatters: + +* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. +* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. +* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. +* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. + +You can define your formatter by implementing the `Formatter` interface, +requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a +`Fields` type (`map[string]interface{}`) with all your fields as well as the +default ones (see Entries section above): + +```go +type MyJSONFormatter struct { +} + +log.SetFormatter(new(MyJSONFormatter)) + +func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { + // Note this doesn't include Time, Level and Message which are available on + // the Entry. Consult `godoc` on information about those fields or read the + // source of the official loggers. + serialized, err := json.Marshal(entry.Data) + if err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + return append(serialized, '\n'), nil +} +``` + +#### Logger as an `io.Writer` + +Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. + +```go +w := logger.Writer() +defer w.Close() + +srv := http.Server{ + // create a stdlib log.Logger that writes to + // logrus.Logger. + ErrorLog: log.New(w, "", 0), +} +``` + +Each line written to that writer will be printed the usual way, using formatters +and hooks. The level for those entries is `info`. + +This means that we can override the standard library logger easily: + +```go +logger := logrus.New() +logger.Formatter = &logrus.JSONFormatter{} + +// Use logrus for standard log output +// Note that `log` here references stdlib's log +// Not logrus imported under the name `log`. +log.SetOutput(logger.Writer()) +``` + +#### Rotation + +Log rotation is not provided with Logrus. Log rotation should be done by an +external program (like `logrotate(8)`) that can compress and delete old log +entries. It should not be a feature of the application-level logger. + +#### Tools + +| Tool | Description | +| ---- | ----------- | +|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.| +|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | + +#### Testing + +Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: + +* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook +* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): + +```go +import( + "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus/hooks/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSomething(t*testing.T){ + logger, hook := test.NewNullLogger() + logger.Error("Helloerror") + + assert.Equal(t, 1, len(hook.Entries)) + assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) + assert.Equal(t, "Helloerror", hook.LastEntry().Message) + + hook.Reset() + assert.Nil(t, hook.LastEntry()) +} +``` + +#### Fatal handlers + +Logrus can register one or more functions that will be called when any `fatal` +level message is logged. The registered handlers will be executed before +logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need +to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. + +``` +... +handler := func() { + // gracefully shutdown something... +} +logrus.RegisterExitHandler(handler) +... +``` + +#### Thread safety + +By default Logger is protected by mutex for concurrent writes, this mutex is invoked when calling hooks and writing logs. +If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. + +Situation when locking is not needed includes: + +* You have no hooks registered, or hooks calling is already thread-safe. + +* Writing to logger.Out is already thread-safe, for example: + + 1) logger.Out is protected by locks. + + 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing) + + (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/alt_exit.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/alt_exit.go new file mode 100755 index 0000000..8af9063 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/alt_exit.go @@ -0,0 +1,64 @@ +package logrus + +// The following code was sourced and modified from the +// https://github.com/tebeka/atexit package governed by the following license: +// +// Copyright (c) 2012 Miki Tebeka . +// +// 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. + +import ( + "fmt" + "os" +) + +var handlers = []func(){} + +func runHandler(handler func()) { + defer func() { + if err := recover(); err != nil { + fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) + } + }() + + handler() +} + +func runHandlers() { + for _, handler := range handlers { + runHandler(handler) + } +} + +// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) +func Exit(code int) { + runHandlers() + os.Exit(code) +} + +// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke +// all handlers. The handlers will also be invoked when any Fatal log entry is +// made. +// +// This method is useful when a caller wishes to use logrus to log a fatal +// message but also needs to gracefully shutdown. An example usecase could be +// closing database connections, or sending a alert that the application is +// closing. +func RegisterExitHandler(handler func()) { + handlers = append(handlers, handler) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/appveyor.yml new file mode 100755 index 0000000..b4ffca2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/appveyor.yml @@ -0,0 +1,14 @@ +version: "{build}" +platform: x64 +clone_folder: c:\gopath\src\github.com\sirupsen\logrus +environment: + GOPATH: c:\gopath +branches: + only: + - master +install: + - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% + - go version +build_script: + - go get -t + - go test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/doc.go new file mode 100755 index 0000000..da67aba --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/doc.go @@ -0,0 +1,26 @@ +/* +Package logrus is a structured logger for Go, completely API compatible with the standard library logger. + + +The simplest way to use Logrus is simply the package-level exported logger: + + package main + + import ( + log "github.com/sirupsen/logrus" + ) + + func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "number": 1, + "size": 10, + }).Info("A walrus appears") + } + +Output: + time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 + +For a full guide visit https://github.com/sirupsen/logrus +*/ +package logrus diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/entry.go new file mode 100755 index 0000000..778f4c9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/entry.go @@ -0,0 +1,288 @@ +package logrus + +import ( + "bytes" + "fmt" + "os" + "sync" + "time" +) + +var bufferPool *sync.Pool + +func init() { + bufferPool = &sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + } +} + +// Defines the key when adding errors using WithError. +var ErrorKey = "error" + +// An entry is the final or intermediate Logrus logging entry. It contains all +// the fields passed with WithField{,s}. It's finally logged when Debug, Info, +// Warn, Error, Fatal or Panic is called on it. These objects can be reused and +// passed around as much as you wish to avoid field duplication. +type Entry struct { + Logger *Logger + + // Contains all the fields set by the user. + Data Fields + + // Time at which the log entry was created + Time time.Time + + // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic + // This field will be set on entry firing and the value will be equal to the one in Logger struct field. + Level Level + + // Message passed to Debug, Info, Warn, Error, Fatal or Panic + Message string + + // When formatter is called in entry.log(), an Buffer may be set to entry + Buffer *bytes.Buffer +} + +func NewEntry(logger *Logger) *Entry { + return &Entry{ + Logger: logger, + // Default is three fields, give a little extra room + Data: make(Fields, 5), + } +} + +// Returns the string representation from the reader and ultimately the +// formatter. +func (entry *Entry) String() (string, error) { + serialized, err := entry.Logger.Formatter.Format(entry) + if err != nil { + return "", err + } + str := string(serialized) + return str, nil +} + +// Add an error as single field (using the key defined in ErrorKey) to the Entry. +func (entry *Entry) WithError(err error) *Entry { + return entry.WithField(ErrorKey, err) +} + +// Add a single field to the Entry. +func (entry *Entry) WithField(key string, value interface{}) *Entry { + return entry.WithFields(Fields{key: value}) +} + +// Add a map of fields to the Entry. +func (entry *Entry) WithFields(fields Fields) *Entry { + data := make(Fields, len(entry.Data)+len(fields)) + for k, v := range entry.Data { + data[k] = v + } + for k, v := range fields { + data[k] = v + } + return &Entry{Logger: entry.Logger, Data: data} +} + +// This function is not declared with a pointer value because otherwise +// race conditions will occur when using multiple goroutines +func (entry Entry) log(level Level, msg string) { + var buffer *bytes.Buffer + entry.Time = time.Now() + entry.Level = level + entry.Message = msg + + entry.fireHooks() + + buffer = bufferPool.Get().(*bytes.Buffer) + buffer.Reset() + defer bufferPool.Put(buffer) + entry.Buffer = buffer + + entry.write() + + entry.Buffer = nil + + // To avoid Entry#log() returning a value that only would make sense for + // panic() to use in Entry#Panic(), we avoid the allocation by checking + // directly here. + if level <= PanicLevel { + panic(&entry) + } +} + +// This function is not declared with a pointer value because otherwise +// race conditions will occur when using multiple goroutines +func (entry Entry) fireHooks() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + err := entry.Logger.Hooks.Fire(entry.Level, &entry) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) + } +} + +func (entry *Entry) write() { + serialized, err := entry.Logger.Formatter.Format(entry) + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) + } else { + _, err = entry.Logger.Out.Write(serialized) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) + } + } +} + +func (entry *Entry) Debug(args ...interface{}) { + if entry.Logger.level() >= DebugLevel { + entry.log(DebugLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Print(args ...interface{}) { + entry.Info(args...) +} + +func (entry *Entry) Info(args ...interface{}) { + if entry.Logger.level() >= InfoLevel { + entry.log(InfoLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warn(args ...interface{}) { + if entry.Logger.level() >= WarnLevel { + entry.log(WarnLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warning(args ...interface{}) { + entry.Warn(args...) +} + +func (entry *Entry) Error(args ...interface{}) { + if entry.Logger.level() >= ErrorLevel { + entry.log(ErrorLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Fatal(args ...interface{}) { + if entry.Logger.level() >= FatalLevel { + entry.log(FatalLevel, fmt.Sprint(args...)) + } + Exit(1) +} + +func (entry *Entry) Panic(args ...interface{}) { + if entry.Logger.level() >= PanicLevel { + entry.log(PanicLevel, fmt.Sprint(args...)) + } + panic(fmt.Sprint(args...)) +} + +// Entry Printf family functions + +func (entry *Entry) Debugf(format string, args ...interface{}) { + if entry.Logger.level() >= DebugLevel { + entry.Debug(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Infof(format string, args ...interface{}) { + if entry.Logger.level() >= InfoLevel { + entry.Info(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Printf(format string, args ...interface{}) { + entry.Infof(format, args...) +} + +func (entry *Entry) Warnf(format string, args ...interface{}) { + if entry.Logger.level() >= WarnLevel { + entry.Warn(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Warningf(format string, args ...interface{}) { + entry.Warnf(format, args...) +} + +func (entry *Entry) Errorf(format string, args ...interface{}) { + if entry.Logger.level() >= ErrorLevel { + entry.Error(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Fatalf(format string, args ...interface{}) { + if entry.Logger.level() >= FatalLevel { + entry.Fatal(fmt.Sprintf(format, args...)) + } + Exit(1) +} + +func (entry *Entry) Panicf(format string, args ...interface{}) { + if entry.Logger.level() >= PanicLevel { + entry.Panic(fmt.Sprintf(format, args...)) + } +} + +// Entry Println family functions + +func (entry *Entry) Debugln(args ...interface{}) { + if entry.Logger.level() >= DebugLevel { + entry.Debug(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Infoln(args ...interface{}) { + if entry.Logger.level() >= InfoLevel { + entry.Info(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Println(args ...interface{}) { + entry.Infoln(args...) +} + +func (entry *Entry) Warnln(args ...interface{}) { + if entry.Logger.level() >= WarnLevel { + entry.Warn(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Warningln(args ...interface{}) { + entry.Warnln(args...) +} + +func (entry *Entry) Errorln(args ...interface{}) { + if entry.Logger.level() >= ErrorLevel { + entry.Error(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Fatalln(args ...interface{}) { + if entry.Logger.level() >= FatalLevel { + entry.Fatal(entry.sprintlnn(args...)) + } + Exit(1) +} + +func (entry *Entry) Panicln(args ...interface{}) { + if entry.Logger.level() >= PanicLevel { + entry.Panic(entry.sprintlnn(args...)) + } +} + +// Sprintlnn => Sprint no newline. This is to get the behavior of how +// fmt.Sprintln where spaces are always added between operands, regardless of +// their type. Instead of vendoring the Sprintln implementation to spare a +// string allocation, we do the simplest thing. +func (entry *Entry) sprintlnn(args ...interface{}) string { + msg := fmt.Sprintln(args...) + return msg[:len(msg)-1] +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/exported.go new file mode 100755 index 0000000..013183e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/exported.go @@ -0,0 +1,193 @@ +package logrus + +import ( + "io" +) + +var ( + // std is the name of the standard logger in stdlib `log` + std = New() +) + +func StandardLogger() *Logger { + return std +} + +// SetOutput sets the standard logger output. +func SetOutput(out io.Writer) { + std.mu.Lock() + defer std.mu.Unlock() + std.Out = out +} + +// SetFormatter sets the standard logger formatter. +func SetFormatter(formatter Formatter) { + std.mu.Lock() + defer std.mu.Unlock() + std.Formatter = formatter +} + +// SetLevel sets the standard logger level. +func SetLevel(level Level) { + std.mu.Lock() + defer std.mu.Unlock() + std.SetLevel(level) +} + +// GetLevel returns the standard logger level. +func GetLevel() Level { + std.mu.Lock() + defer std.mu.Unlock() + return std.level() +} + +// AddHook adds a hook to the standard logger hooks. +func AddHook(hook Hook) { + std.mu.Lock() + defer std.mu.Unlock() + std.Hooks.Add(hook) +} + +// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. +func WithError(err error) *Entry { + return std.WithField(ErrorKey, err) +} + +// WithField creates an entry from the standard logger and adds a field to +// it. If you want multiple fields, use `WithFields`. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithField(key string, value interface{}) *Entry { + return std.WithField(key, value) +} + +// WithFields creates an entry from the standard logger and adds multiple +// fields to it. This is simply a helper for `WithField`, invoking it +// once for each field. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithFields(fields Fields) *Entry { + return std.WithFields(fields) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + std.Debug(args...) +} + +// Print logs a message at level Info on the standard logger. +func Print(args ...interface{}) { + std.Print(args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + std.Info(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + std.Warn(args...) +} + +// Warning logs a message at level Warn on the standard logger. +func Warning(args ...interface{}) { + std.Warning(args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + std.Error(args...) +} + +// Panic logs a message at level Panic on the standard logger. +func Panic(args ...interface{}) { + std.Panic(args...) +} + +// Fatal logs a message at level Fatal on the standard logger. +func Fatal(args ...interface{}) { + std.Fatal(args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + std.Debugf(format, args...) +} + +// Printf logs a message at level Info on the standard logger. +func Printf(format string, args ...interface{}) { + std.Printf(format, args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + std.Infof(format, args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + std.Warnf(format, args...) +} + +// Warningf logs a message at level Warn on the standard logger. +func Warningf(format string, args ...interface{}) { + std.Warningf(format, args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + std.Errorf(format, args...) +} + +// Panicf logs a message at level Panic on the standard logger. +func Panicf(format string, args ...interface{}) { + std.Panicf(format, args...) +} + +// Fatalf logs a message at level Fatal on the standard logger. +func Fatalf(format string, args ...interface{}) { + std.Fatalf(format, args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + std.Debugln(args...) +} + +// Println logs a message at level Info on the standard logger. +func Println(args ...interface{}) { + std.Println(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + std.Infoln(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + std.Warnln(args...) +} + +// Warningln logs a message at level Warn on the standard logger. +func Warningln(args ...interface{}) { + std.Warningln(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + std.Errorln(args...) +} + +// Panicln logs a message at level Panic on the standard logger. +func Panicln(args ...interface{}) { + std.Panicln(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger. +func Fatalln(args ...interface{}) { + std.Fatalln(args...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/formatter.go new file mode 100755 index 0000000..b183ff5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/formatter.go @@ -0,0 +1,45 @@ +package logrus + +import "time" + +const defaultTimestampFormat = time.RFC3339 + +// The Formatter interface is used to implement a custom Formatter. It takes an +// `Entry`. It exposes all the fields, including the default ones: +// +// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. +// * `entry.Data["time"]`. The timestamp. +// * `entry.Data["level"]. The level the entry was logged at. +// +// Any additional fields added with `WithField` or `WithFields` are also in +// `entry.Data`. Format is expected to return an array of bytes which are then +// logged to `logger.Out`. +type Formatter interface { + Format(*Entry) ([]byte, error) +} + +// This is to not silently overwrite `time`, `msg` and `level` fields when +// dumping it. If this code wasn't there doing: +// +// logrus.WithField("level", 1).Info("hello") +// +// Would just silently drop the user provided level. Instead with this code +// it'll logged as: +// +// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} +// +// It's not exported because it's still using Data in an opinionated way. It's to +// avoid code duplication between the two default formatters. +func prefixFieldClashes(data Fields) { + if t, ok := data["time"]; ok { + data["fields.time"] = t + } + + if m, ok := data["msg"]; ok { + data["fields.msg"] = m + } + + if l, ok := data["level"]; ok { + data["fields.level"] = l + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/hooks.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/hooks.go new file mode 100755 index 0000000..3f151cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/hooks.go @@ -0,0 +1,34 @@ +package logrus + +// A hook to be fired when logging on the logging levels returned from +// `Levels()` on your implementation of the interface. Note that this is not +// fired in a goroutine or a channel with workers, you should handle such +// functionality yourself if your call is non-blocking and you don't wish for +// the logging calls for levels returned from `Levels()` to block. +type Hook interface { + Levels() []Level + Fire(*Entry) error +} + +// Internal type for storing the hooks on a logger instance. +type LevelHooks map[Level][]Hook + +// Add a hook to an instance of logger. This is called with +// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. +func (hooks LevelHooks) Add(hook Hook) { + for _, level := range hook.Levels() { + hooks[level] = append(hooks[level], hook) + } +} + +// Fire all the hooks for the passed level. Used by `entry.log` to fire +// appropriate hooks for a log entry. +func (hooks LevelHooks) Fire(level Level, entry *Entry) error { + for _, hook := range hooks[level] { + if err := hook.Fire(entry); err != nil { + return err + } + } + + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go new file mode 100755 index 0000000..fb01c1b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/json_formatter.go @@ -0,0 +1,79 @@ +package logrus + +import ( + "encoding/json" + "fmt" +) + +type fieldKey string + +// FieldMap allows customization of the key names for default fields. +type FieldMap map[fieldKey]string + +// Default key names for the default fields +const ( + FieldKeyMsg = "msg" + FieldKeyLevel = "level" + FieldKeyTime = "time" +) + +func (f FieldMap) resolve(key fieldKey) string { + if k, ok := f[key]; ok { + return k + } + + return string(key) +} + +// JSONFormatter formats logs into parsable json +type JSONFormatter struct { + // TimestampFormat sets the format used for marshaling timestamps. + TimestampFormat string + + // DisableTimestamp allows disabling automatic timestamps in output + DisableTimestamp bool + + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &JSONFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message", + // }, + // } + FieldMap FieldMap +} + +// Format renders a single log entry +func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { + data := make(Fields, len(entry.Data)+3) + for k, v := range entry.Data { + switch v := v.(type) { + case error: + // Otherwise errors are ignored by `encoding/json` + // https://github.com/sirupsen/logrus/issues/137 + data[k] = v.Error() + default: + data[k] = v + } + } + prefixFieldClashes(data) + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + + if !f.DisableTimestamp { + data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat) + } + data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message + data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() + + serialized, err := json.Marshal(data) + if err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + return append(serialized, '\n'), nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logger.go new file mode 100755 index 0000000..fdaf8a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logger.go @@ -0,0 +1,323 @@ +package logrus + +import ( + "io" + "os" + "sync" + "sync/atomic" +) + +type Logger struct { + // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a + // file, or leave it default which is `os.Stderr`. You can also set this to + // something more adventorous, such as logging to Kafka. + Out io.Writer + // Hooks for the logger instance. These allow firing events based on logging + // levels and log entries. For example, to send errors to an error tracking + // service, log to StatsD or dump the core on fatal errors. + Hooks LevelHooks + // All log entries pass through the formatter before logged to Out. The + // included formatters are `TextFormatter` and `JSONFormatter` for which + // TextFormatter is the default. In development (when a TTY is attached) it + // logs with colors, but to a file it wouldn't. You can easily implement your + // own that implements the `Formatter` interface, see the `README` or included + // formatters for examples. + Formatter Formatter + // The logging level the logger should log at. This is typically (and defaults + // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be + // logged. + Level Level + // Used to sync writing to the log. Locking is enabled by Default + mu MutexWrap + // Reusable empty entry + entryPool sync.Pool +} + +type MutexWrap struct { + lock sync.Mutex + disabled bool +} + +func (mw *MutexWrap) Lock() { + if !mw.disabled { + mw.lock.Lock() + } +} + +func (mw *MutexWrap) Unlock() { + if !mw.disabled { + mw.lock.Unlock() + } +} + +func (mw *MutexWrap) Disable() { + mw.disabled = true +} + +// Creates a new logger. Configuration should be set by changing `Formatter`, +// `Out` and `Hooks` directly on the default logger instance. You can also just +// instantiate your own: +// +// var log = &Logger{ +// Out: os.Stderr, +// Formatter: new(JSONFormatter), +// Hooks: make(LevelHooks), +// Level: logrus.DebugLevel, +// } +// +// It's recommended to make this a global instance called `log`. +func New() *Logger { + return &Logger{ + Out: os.Stderr, + Formatter: new(TextFormatter), + Hooks: make(LevelHooks), + Level: InfoLevel, + } +} + +func (logger *Logger) newEntry() *Entry { + entry, ok := logger.entryPool.Get().(*Entry) + if ok { + return entry + } + return NewEntry(logger) +} + +func (logger *Logger) releaseEntry(entry *Entry) { + logger.entryPool.Put(entry) +} + +// Adds a field to the log entry, note that it doesn't log until you call +// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry. +// If you want multiple fields, use `WithFields`. +func (logger *Logger) WithField(key string, value interface{}) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithField(key, value) +} + +// Adds a struct of fields to the log entry. All it does is call `WithField` for +// each `Field`. +func (logger *Logger) WithFields(fields Fields) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithFields(fields) +} + +// Add an error as single field to the log entry. All it does is call +// `WithError` for the given `error`. +func (logger *Logger) WithError(err error) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithError(err) +} + +func (logger *Logger) Debugf(format string, args ...interface{}) { + if logger.level() >= DebugLevel { + entry := logger.newEntry() + entry.Debugf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infof(format string, args ...interface{}) { + if logger.level() >= InfoLevel { + entry := logger.newEntry() + entry.Infof(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Printf(format string, args ...interface{}) { + entry := logger.newEntry() + entry.Printf(format, args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnf(format string, args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningf(format string, args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorf(format string, args ...interface{}) { + if logger.level() >= ErrorLevel { + entry := logger.newEntry() + entry.Errorf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalf(format string, args ...interface{}) { + if logger.level() >= FatalLevel { + entry := logger.newEntry() + entry.Fatalf(format, args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panicf(format string, args ...interface{}) { + if logger.level() >= PanicLevel { + entry := logger.newEntry() + entry.Panicf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debug(args ...interface{}) { + if logger.level() >= DebugLevel { + entry := logger.newEntry() + entry.Debug(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Info(args ...interface{}) { + if logger.level() >= InfoLevel { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Print(args ...interface{}) { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warn(args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warning(args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Error(args ...interface{}) { + if logger.level() >= ErrorLevel { + entry := logger.newEntry() + entry.Error(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatal(args ...interface{}) { + if logger.level() >= FatalLevel { + entry := logger.newEntry() + entry.Fatal(args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panic(args ...interface{}) { + if logger.level() >= PanicLevel { + entry := logger.newEntry() + entry.Panic(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debugln(args ...interface{}) { + if logger.level() >= DebugLevel { + entry := logger.newEntry() + entry.Debugln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infoln(args ...interface{}) { + if logger.level() >= InfoLevel { + entry := logger.newEntry() + entry.Infoln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Println(args ...interface{}) { + entry := logger.newEntry() + entry.Println(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnln(args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningln(args ...interface{}) { + if logger.level() >= WarnLevel { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorln(args ...interface{}) { + if logger.level() >= ErrorLevel { + entry := logger.newEntry() + entry.Errorln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalln(args ...interface{}) { + if logger.level() >= FatalLevel { + entry := logger.newEntry() + entry.Fatalln(args...) + logger.releaseEntry(entry) + } + Exit(1) +} + +func (logger *Logger) Panicln(args ...interface{}) { + if logger.level() >= PanicLevel { + entry := logger.newEntry() + entry.Panicln(args...) + logger.releaseEntry(entry) + } +} + +//When file is opened with appending mode, it's safe to +//write concurrently to a file (within 4k message on Linux). +//In these cases user can choose to disable the lock. +func (logger *Logger) SetNoLock() { + logger.mu.Disable() +} + +func (logger *Logger) level() Level { + return Level(atomic.LoadUint32((*uint32)(&logger.Level))) +} + +func (logger *Logger) SetLevel(level Level) { + atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) +} + +func (logger *Logger) AddHook(hook Hook) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Hooks.Add(hook) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logrus.go new file mode 100755 index 0000000..dd38999 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/logrus.go @@ -0,0 +1,143 @@ +package logrus + +import ( + "fmt" + "log" + "strings" +) + +// Fields type, used to pass to `WithFields`. +type Fields map[string]interface{} + +// Level type +type Level uint32 + +// Convert the Level to a string. E.g. PanicLevel becomes "panic". +func (level Level) String() string { + switch level { + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warning" + case ErrorLevel: + return "error" + case FatalLevel: + return "fatal" + case PanicLevel: + return "panic" + } + + return "unknown" +} + +// ParseLevel takes a string level and returns the Logrus log level constant. +func ParseLevel(lvl string) (Level, error) { + switch strings.ToLower(lvl) { + case "panic": + return PanicLevel, nil + case "fatal": + return FatalLevel, nil + case "error": + return ErrorLevel, nil + case "warn", "warning": + return WarnLevel, nil + case "info": + return InfoLevel, nil + case "debug": + return DebugLevel, nil + } + + var l Level + return l, fmt.Errorf("not a valid logrus Level: %q", lvl) +} + +// A constant exposing all logging levels +var AllLevels = []Level{ + PanicLevel, + FatalLevel, + ErrorLevel, + WarnLevel, + InfoLevel, + DebugLevel, +} + +// These are the different logging levels. You can set the logging level to log +// on your instance of logger, obtained with `logrus.New()`. +const ( + // PanicLevel level, highest level of severity. Logs and then calls panic with the + // message passed to Debug, Info, ... + PanicLevel Level = iota + // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the + // logging level is set to Panic. + FatalLevel + // ErrorLevel level. Logs. Used for errors that should definitely be noted. + // Commonly used for hooks to send errors to an error tracking service. + ErrorLevel + // WarnLevel level. Non-critical entries that deserve eyes. + WarnLevel + // InfoLevel level. General operational entries about what's going on inside the + // application. + InfoLevel + // DebugLevel level. Usually only enabled when debugging. Very verbose logging. + DebugLevel +) + +// Won't compile if StdLogger can't be realized by a log.Logger +var ( + _ StdLogger = &log.Logger{} + _ StdLogger = &Entry{} + _ StdLogger = &Logger{} +) + +// StdLogger is what your logrus-enabled library should take, that way +// it'll accept a stdlib logger and a logrus logger. There's no standard +// interface, this is the closest we get, unfortunately. +type StdLogger interface { + Print(...interface{}) + Printf(string, ...interface{}) + Println(...interface{}) + + Fatal(...interface{}) + Fatalf(string, ...interface{}) + Fatalln(...interface{}) + + Panic(...interface{}) + Panicf(string, ...interface{}) + Panicln(...interface{}) +} + +// The FieldLogger interface generalizes the Entry and Logger types +type FieldLogger interface { + WithField(key string, value interface{}) *Entry + WithFields(fields Fields) *Entry + WithError(err error) *Entry + + Debugf(format string, args ...interface{}) + Infof(format string, args ...interface{}) + Printf(format string, args ...interface{}) + Warnf(format string, args ...interface{}) + Warningf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + Fatalf(format string, args ...interface{}) + Panicf(format string, args ...interface{}) + + Debug(args ...interface{}) + Info(args ...interface{}) + Print(args ...interface{}) + Warn(args ...interface{}) + Warning(args ...interface{}) + Error(args ...interface{}) + Fatal(args ...interface{}) + Panic(args ...interface{}) + + Debugln(args ...interface{}) + Infoln(args ...interface{}) + Println(args ...interface{}) + Warnln(args ...interface{}) + Warningln(args ...interface{}) + Errorln(args ...interface{}) + Fatalln(args ...interface{}) + Panicln(args ...interface{}) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_bsd.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_bsd.go new file mode 100755 index 0000000..4880d13 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_bsd.go @@ -0,0 +1,10 @@ +// +build darwin freebsd openbsd netbsd dragonfly +// +build !appengine,!gopherjs + +package logrus + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA + +type Termios unix.Termios diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go new file mode 100755 index 0000000..3de08e8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go @@ -0,0 +1,11 @@ +// +build appengine gopherjs + +package logrus + +import ( + "io" +) + +func checkIfTerminal(w io.Writer) bool { + return true +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go new file mode 100755 index 0000000..067047a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go @@ -0,0 +1,19 @@ +// +build !appengine,!gopherjs + +package logrus + +import ( + "io" + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +func checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_linux.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_linux.go new file mode 100755 index 0000000..f29a009 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/terminal_linux.go @@ -0,0 +1,14 @@ +// Based on ssh/terminal: +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !appengine,!gopherjs + +package logrus + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS + +type Termios unix.Termios diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go new file mode 100755 index 0000000..61b21ca --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/text_formatter.go @@ -0,0 +1,178 @@ +package logrus + +import ( + "bytes" + "fmt" + "sort" + "strings" + "sync" + "time" +) + +const ( + nocolor = 0 + red = 31 + green = 32 + yellow = 33 + blue = 36 + gray = 37 +) + +var ( + baseTimestamp time.Time +) + +func init() { + baseTimestamp = time.Now() +} + +// TextFormatter formats logs into text +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. + DisableColors bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // TimestampFormat to use for display when a full timestamp is printed + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // QuoteEmptyFields will wrap empty fields in quotes if true + QuoteEmptyFields bool + + // Whether the logger's out is to a terminal + isTerminal bool + + sync.Once +} + +func (f *TextFormatter) init(entry *Entry) { + if entry.Logger != nil { + f.isTerminal = checkIfTerminal(entry.Logger.Out) + } +} + +// Format renders a single log entry +func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { + var b *bytes.Buffer + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + + if !f.DisableSorting { + sort.Strings(keys) + } + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + prefixFieldClashes(entry.Data) + + f.Do(func() { f.init(entry) }) + + isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if isColored { + f.printColored(b, entry, keys, timestampFormat) + } else { + if !f.DisableTimestamp { + f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat)) + } + f.appendKeyValue(b, "level", entry.Level.String()) + if entry.Message != "" { + f.appendKeyValue(b, "msg", entry.Message) + } + for _, key := range keys { + f.appendKeyValue(b, key, entry.Data[key]) + } + } + + b.WriteByte('\n') + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) { + var levelColor int + switch entry.Level { + case DebugLevel: + levelColor = gray + case WarnLevel: + levelColor = yellow + case ErrorLevel, FatalLevel, PanicLevel: + levelColor = red + default: + levelColor = blue + } + + levelText := strings.ToUpper(entry.Level.String())[0:4] + + if f.DisableTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message) + } else if !f.FullTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message) + } else { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message) + } + for _, k := range keys { + v := entry.Data[k] + fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) + f.appendValue(b, v) + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if f.QuoteEmptyFields && len(text) == 0 { + return true + } + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { + return true + } + } + return false +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { + if b.Len() > 0 { + b.WriteByte(' ') + } + b.WriteString(key) + b.WriteByte('=') + f.appendValue(b, value) +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + stringVal, ok := value.(string) + if !ok { + stringVal = fmt.Sprint(value) + } + + if !f.needsQuoting(stringVal) { + b.WriteString(stringVal) + } else { + b.WriteString(fmt.Sprintf("%q", stringVal)) + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/writer.go new file mode 100755 index 0000000..7bdebed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/sirupsen/logrus/writer.go @@ -0,0 +1,62 @@ +package logrus + +import ( + "bufio" + "io" + "runtime" +) + +func (logger *Logger) Writer() *io.PipeWriter { + return logger.WriterLevel(InfoLevel) +} + +func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { + return NewEntry(logger).WriterLevel(level) +} + +func (entry *Entry) Writer() *io.PipeWriter { + return entry.WriterLevel(InfoLevel) +} + +func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { + reader, writer := io.Pipe() + + var printFunc func(args ...interface{}) + + switch level { + case DebugLevel: + printFunc = entry.Debug + case InfoLevel: + printFunc = entry.Info + case WarnLevel: + printFunc = entry.Warn + case ErrorLevel: + printFunc = entry.Error + case FatalLevel: + printFunc = entry.Fatal + case PanicLevel: + printFunc = entry.Panic + default: + printFunc = entry.Print + } + + go entry.writerScanner(reader, printFunc) + runtime.SetFinalizer(writer, writerFinalizer) + + return writer +} + +func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + printFunc(scanner.Text()) + } + if err := scanner.Err(); err != nil { + entry.Errorf("Error while reading from Writer: %s", err) + } + reader.Close() +} + +func writerFinalizer(writer *io.PipeWriter) { + writer.Close() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/.travis.yml new file mode 100755 index 0000000..8fc1261 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/.travis.yml @@ -0,0 +1,21 @@ +sudo: false +language: go + +go: + - 1.9 + - "1.10" + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go build + - go test -race -v ./... + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/LICENSE.txt b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/LICENSE.txt new file mode 100755 index 0000000..298f0e2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/LICENSE.txt @@ -0,0 +1,174 @@ + 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. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/README.md new file mode 100755 index 0000000..0c9b04b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/README.md @@ -0,0 +1,452 @@ +![afero logo-sm](https://cloud.githubusercontent.com/assets/173412/11490338/d50e16dc-97a5-11e5-8b12-019a300d0fcb.png) + +A FileSystem Abstraction System for Go + +[![Build Status](https://travis-ci.org/spf13/afero.svg)](https://travis-ci.org/spf13/afero) [![Build status](https://ci.appveyor.com/api/projects/status/github/spf13/afero?branch=master&svg=true)](https://ci.appveyor.com/project/spf13/afero) [![GoDoc](https://godoc.org/github.com/spf13/afero?status.svg)](https://godoc.org/github.com/spf13/afero) [![Join the chat at https://gitter.im/spf13/afero](https://badges.gitter.im/Dev%20Chat.svg)](https://gitter.im/spf13/afero?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +# Overview + +Afero is an filesystem framework providing a simple, uniform and universal API +interacting with any filesystem, as an abstraction layer providing interfaces, +types and methods. Afero has an exceptionally clean interface and simple design +without needless constructors or initialization methods. + +Afero is also a library providing a base set of interoperable backend +filesystems that make it easy to work with afero while retaining all the power +and benefit of the os and ioutil packages. + +Afero provides significant improvements over using the os package alone, most +notably the ability to create mock and testing filesystems without relying on the disk. + +It is suitable for use in a any situation where you would consider using the OS +package as it provides an additional abstraction that makes it easy to use a +memory backed file system during testing. It also adds support for the http +filesystem for full interoperability. + + +## Afero Features + +* A single consistent API for accessing a variety of filesystems +* Interoperation between a variety of file system types +* A set of interfaces to encourage and enforce interoperability between backends +* An atomic cross platform memory backed file system +* Support for compositional (union) file systems by combining multiple file systems acting as one +* Specialized backends which modify existing filesystems (Read Only, Regexp filtered) +* A set of utility functions ported from io, ioutil & hugo to be afero aware + + +# Using Afero + +Afero is easy to use and easier to adopt. + +A few different ways you could use Afero: + +* Use the interfaces alone to define you own file system. +* Wrap for the OS packages. +* Define different filesystems for different parts of your application. +* Use Afero for mock filesystems while testing + +## Step 1: Install Afero + +First use go get to install the latest version of the library. + + $ go get github.com/spf13/afero + +Next include Afero in your application. +```go +import "github.com/spf13/afero" +``` + +## Step 2: Declare a backend + +First define a package variable and set it to a pointer to a filesystem. +```go +var AppFs = afero.NewMemMapFs() + +or + +var AppFs = afero.NewOsFs() +``` +It is important to note that if you repeat the composite literal you +will be using a completely new and isolated filesystem. In the case of +OsFs it will still use the same underlying filesystem but will reduce +the ability to drop in other filesystems as desired. + +## Step 3: Use it like you would the OS package + +Throughout your application use any function and method like you normally +would. + +So if my application before had: +```go +os.Open('/tmp/foo') +``` +We would replace it with: +```go +AppFs.Open('/tmp/foo') +``` + +`AppFs` being the variable we defined above. + + +## List of all available functions + +File System Methods Available: +```go +Chmod(name string, mode os.FileMode) : error +Chtimes(name string, atime time.Time, mtime time.Time) : error +Create(name string) : File, error +Mkdir(name string, perm os.FileMode) : error +MkdirAll(path string, perm os.FileMode) : error +Name() : string +Open(name string) : File, error +OpenFile(name string, flag int, perm os.FileMode) : File, error +Remove(name string) : error +RemoveAll(path string) : error +Rename(oldname, newname string) : error +Stat(name string) : os.FileInfo, error +``` +File Interfaces and Methods Available: +```go +io.Closer +io.Reader +io.ReaderAt +io.Seeker +io.Writer +io.WriterAt + +Name() : string +Readdir(count int) : []os.FileInfo, error +Readdirnames(n int) : []string, error +Stat() : os.FileInfo, error +Sync() : error +Truncate(size int64) : error +WriteString(s string) : ret int, err error +``` +In some applications it may make sense to define a new package that +simply exports the file system variable for easy access from anywhere. + +## Using Afero's utility functions + +Afero provides a set of functions to make it easier to use the underlying file systems. +These functions have been primarily ported from io & ioutil with some developed for Hugo. + +The afero utilities support all afero compatible backends. + +The list of utilities includes: + +```go +DirExists(path string) (bool, error) +Exists(path string) (bool, error) +FileContainsBytes(filename string, subslice []byte) (bool, error) +GetTempDir(subPath string) string +IsDir(path string) (bool, error) +IsEmpty(path string) (bool, error) +ReadDir(dirname string) ([]os.FileInfo, error) +ReadFile(filename string) ([]byte, error) +SafeWriteReader(path string, r io.Reader) (err error) +TempDir(dir, prefix string) (name string, err error) +TempFile(dir, prefix string) (f File, err error) +Walk(root string, walkFn filepath.WalkFunc) error +WriteFile(filename string, data []byte, perm os.FileMode) error +WriteReader(path string, r io.Reader) (err error) +``` +For a complete list see [Afero's GoDoc](https://godoc.org/github.com/spf13/afero) + +They are available under two different approaches to use. You can either call +them directly where the first parameter of each function will be the file +system, or you can declare a new `Afero`, a custom type used to bind these +functions as methods to a given filesystem. + +### Calling utilities directly + +```go +fs := new(afero.MemMapFs) +f, err := afero.TempFile(fs,"", "ioutil-test") + +``` + +### Calling via Afero + +```go +fs := afero.NewMemMapFs() +afs := &afero.Afero{Fs: fs} +f, err := afs.TempFile("", "ioutil-test") +``` + +## Using Afero for Testing + +There is a large benefit to using a mock filesystem for testing. It has a +completely blank state every time it is initialized and can be easily +reproducible regardless of OS. You could create files to your heart’s content +and the file access would be fast while also saving you from all the annoying +issues with deleting temporary files, Windows file locking, etc. The MemMapFs +backend is perfect for testing. + +* Much faster than performing I/O operations on disk +* Avoid security issues and permissions +* Far more control. 'rm -rf /' with confidence +* Test setup is far more easier to do +* No test cleanup needed + +One way to accomplish this is to define a variable as mentioned above. +In your application this will be set to afero.NewOsFs() during testing you +can set it to afero.NewMemMapFs(). + +It wouldn't be uncommon to have each test initialize a blank slate memory +backend. To do this I would define my `appFS = afero.NewOsFs()` somewhere +appropriate in my application code. This approach ensures that Tests are order +independent, with no test relying on the state left by an earlier test. + +Then in my tests I would initialize a new MemMapFs for each test: +```go +func TestExist(t *testing.T) { + appFS := afero.NewMemMapFs() + // create test files and directories + appFS.MkdirAll("src/a", 0755) + afero.WriteFile(appFS, "src/a/b", []byte("file b"), 0644) + afero.WriteFile(appFS, "src/c", []byte("file c"), 0644) + name := "src/c" + _, err := appFS.Stat(name) + if os.IsNotExist(err) { + t.Errorf("file \"%s\" does not exist.\n", name) + } +} +``` + +# Available Backends + +## Operating System Native + +### OsFs + +The first is simply a wrapper around the native OS calls. This makes it +very easy to use as all of the calls are the same as the existing OS +calls. It also makes it trivial to have your code use the OS during +operation and a mock filesystem during testing or as needed. + +```go +appfs := afero.NewOsFs() +appfs.MkdirAll("src/a", 0755)) +``` + +## Memory Backed Storage + +### MemMapFs + +Afero also provides a fully atomic memory backed filesystem perfect for use in +mocking and to speed up unnecessary disk io when persistence isn’t +necessary. It is fully concurrent and will work within go routines +safely. + +```go +mm := afero.NewMemMapFs() +mm.MkdirAll("src/a", 0755)) +``` + +#### InMemoryFile + +As part of MemMapFs, Afero also provides an atomic, fully concurrent memory +backed file implementation. This can be used in other memory backed file +systems with ease. Plans are to add a radix tree memory stored file +system using InMemoryFile. + +## Network Interfaces + +### SftpFs + +Afero has experimental support for secure file transfer protocol (sftp). Which can +be used to perform file operations over a encrypted channel. + +## Filtering Backends + +### BasePathFs + +The BasePathFs restricts all operations to a given path within an Fs. +The given file name to the operations on this Fs will be prepended with +the base path before calling the source Fs. + +```go +bp := afero.NewBasePathFs(afero.NewOsFs(), "/base/path") +``` + +### ReadOnlyFs + +A thin wrapper around the source Fs providing a read only view. + +```go +fs := afero.NewReadOnlyFs(afero.NewOsFs()) +_, err := fs.Create("/file.txt") +// err = syscall.EPERM +``` + +# RegexpFs + +A filtered view on file names, any file NOT matching +the passed regexp will be treated as non-existing. +Files not matching the regexp provided will not be created. +Directories are not filtered. + +```go +fs := afero.NewRegexpFs(afero.NewMemMapFs(), regexp.MustCompile(`\.txt$`)) +_, err := fs.Create("/file.html") +// err = syscall.ENOENT +``` + +### HttpFs + +Afero provides an http compatible backend which can wrap any of the existing +backends. + +The Http package requires a slightly specific version of Open which +returns an http.File type. + +Afero provides an httpFs file system which satisfies this requirement. +Any Afero FileSystem can be used as an httpFs. + +```go +httpFs := afero.NewHttpFs() +fileserver := http.FileServer(httpFs.Dir())) +http.Handle("/", fileserver) +``` + +## Composite Backends + +Afero provides the ability have two filesystems (or more) act as a single +file system. + +### CacheOnReadFs + +The CacheOnReadFs will lazily make copies of any accessed files from the base +layer into the overlay. Subsequent reads will be pulled from the overlay +directly permitting the request is within the cache duration of when it was +created in the overlay. + +If the base filesystem is writeable, any changes to files will be +done first to the base, then to the overlay layer. Write calls to open file +handles like `Write()` or `Truncate()` to the overlay first. + +To writing files to the overlay only, you can use the overlay Fs directly (not +via the union Fs). + +Cache files in the layer for the given time.Duration, a cache duration of 0 +means "forever" meaning the file will not be re-requested from the base ever. + +A read-only base will make the overlay also read-only but still copy files +from the base to the overlay when they're not present (or outdated) in the +caching layer. + +```go +base := afero.NewOsFs() +layer := afero.NewMemMapFs() +ufs := afero.NewCacheOnReadFs(base, layer, 100 * time.Second) +``` + +### CopyOnWriteFs() + +The CopyOnWriteFs is a read only base file system with a potentially +writeable layer on top. + +Read operations will first look in the overlay and if not found there, will +serve the file from the base. + +Changes to the file system will only be made in the overlay. + +Any attempt to modify a file found only in the base will copy the file to the +overlay layer before modification (including opening a file with a writable +handle). + +Removing and Renaming files present only in the base layer is not currently +permitted. If a file is present in the base layer and the overlay, only the +overlay will be removed/renamed. + +```go + base := afero.NewOsFs() + roBase := afero.NewReadOnlyFs(base) + ufs := afero.NewCopyOnWriteFs(roBase, afero.NewMemMapFs()) + + fh, _ = ufs.Create("/home/test/file2.txt") + fh.WriteString("This is a test") + fh.Close() +``` + +In this example all write operations will only occur in memory (MemMapFs) +leaving the base filesystem (OsFs) untouched. + + +## Desired/possible backends + +The following is a short list of possible backends we hope someone will +implement: + +* SSH +* ZIP +* TAR +* S3 + +# About the project + +## What's in the name + +Afero comes from the latin roots Ad-Facere. + +**"Ad"** is a prefix meaning "to". + +**"Facere"** is a form of the root "faciō" making "make or do". + +The literal meaning of afero is "to make" or "to do" which seems very fitting +for a library that allows one to make files and directories and do things with them. + +The English word that shares the same roots as Afero is "affair". Affair shares +the same concept but as a noun it means "something that is made or done" or "an +object of a particular type". + +It's also nice that unlike some of my other libraries (hugo, cobra, viper) it +Googles very well. + +## Release Notes + +* **0.10.0** 2015.12.10 + * Full compatibility with Windows + * Introduction of afero utilities + * Test suite rewritten to work cross platform + * Normalize paths for MemMapFs + * Adding Sync to the file interface + * **Breaking Change** Walk and ReadDir have changed parameter order + * Moving types used by MemMapFs to a subpackage + * General bugfixes and improvements +* **0.9.0** 2015.11.05 + * New Walk function similar to filepath.Walk + * MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC + * MemMapFs.Remove now really deletes the file + * InMemoryFile.Readdir and Readdirnames work correctly + * InMemoryFile functions lock it for concurrent access + * Test suite improvements +* **0.8.0** 2014.10.28 + * First public version + * Interfaces feel ready for people to build using + * Interfaces satisfy all known uses + * MemMapFs passes the majority of the OS test suite + * OsFs passes the majority of the OS test suite + +## Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new Pull Request + +## Contributors + +Names in no particular order: + +* [spf13](https://github.com/spf13) +* [jaqx0r](https://github.com/jaqx0r) +* [mbertschler](https://github.com/mbertschler) +* [xor-gate](https://github.com/xor-gate) + +## License + +Afero is released under the Apache 2.0 license. See +[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/afero.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/afero.go new file mode 100755 index 0000000..f5b5e12 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/afero.go @@ -0,0 +1,108 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// 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 afero provides types and methods for interacting with the filesystem, +// as an abstraction layer. + +// Afero also provides a few implementations that are mostly interoperable. One that +// uses the operating system filesystem, one that uses memory to store files +// (cross platform) and an interface that should be implemented if you want to +// provide your own filesystem. + +package afero + +import ( + "errors" + "io" + "os" + "time" +) + +type Afero struct { + Fs +} + +// File represents a file in the filesystem. +type File interface { + io.Closer + io.Reader + io.ReaderAt + io.Seeker + io.Writer + io.WriterAt + + Name() string + Readdir(count int) ([]os.FileInfo, error) + Readdirnames(n int) ([]string, error) + Stat() (os.FileInfo, error) + Sync() error + Truncate(size int64) error + WriteString(s string) (ret int, err error) +} + +// Fs is the filesystem interface. +// +// Any simulated or real filesystem should implement this interface. +type Fs interface { + // Create creates a file in the filesystem, returning the file and an + // error, if any happens. + Create(name string) (File, error) + + // Mkdir creates a directory in the filesystem, return an error if any + // happens. + Mkdir(name string, perm os.FileMode) error + + // MkdirAll creates a directory path and all parents that does not exist + // yet. + MkdirAll(path string, perm os.FileMode) error + + // Open opens a file, returning it or an error, if any happens. + Open(name string) (File, error) + + // OpenFile opens a file using the given flags and the given mode. + OpenFile(name string, flag int, perm os.FileMode) (File, error) + + // Remove removes a file identified by name, returning an error, if any + // happens. + Remove(name string) error + + // RemoveAll removes a directory path and any children it contains. It + // does not fail if the path does not exist (return nil). + RemoveAll(path string) error + + // Rename renames a file. + Rename(oldname, newname string) error + + // Stat returns a FileInfo describing the named file, or an error, if any + // happens. + Stat(name string) (os.FileInfo, error) + + // The name of this FileSystem + Name() string + + //Chmod changes the mode of the named file to mode. + Chmod(name string, mode os.FileMode) error + + //Chtimes changes the access and modification times of the named file + Chtimes(name string, atime time.Time, mtime time.Time) error +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("Out of range") + ErrTooLarge = errors.New("Too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/appveyor.yml new file mode 100755 index 0000000..a633ad5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/appveyor.yml @@ -0,0 +1,15 @@ +version: '{build}' +clone_folder: C:\gopath\src\github.com\spf13\afero +environment: + GOPATH: C:\gopath +build_script: +- cmd: >- + go version + + go env + + go get -v github.com/spf13/afero/... + + go build github.com/spf13/afero +test_script: +- cmd: go test -race -v github.com/spf13/afero/... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/basepath.go new file mode 100755 index 0000000..616ff8f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/basepath.go @@ -0,0 +1,180 @@ +package afero + +import ( + "os" + "path/filepath" + "runtime" + "strings" + "time" +) + +var _ Lstater = (*BasePathFs)(nil) + +// The BasePathFs restricts all operations to a given path within an Fs. +// The given file name to the operations on this Fs will be prepended with +// the base path before calling the base Fs. +// Any file name (after filepath.Clean()) outside this base path will be +// treated as non existing file. +// +// Note that it does not clean the error messages on return, so you may +// reveal the real path on errors. +type BasePathFs struct { + source Fs + path string +} + +type BasePathFile struct { + File + path string +} + +func (f *BasePathFile) Name() string { + sourcename := f.File.Name() + return strings.TrimPrefix(sourcename, filepath.Clean(f.path)) +} + +func NewBasePathFs(source Fs, path string) Fs { + return &BasePathFs{source: source, path: path} +} + +// on a file outside the base path it returns the given file name and an error, +// else the given file with the base path prepended +func (b *BasePathFs) RealPath(name string) (path string, err error) { + if err := validateBasePathName(name); err != nil { + return name, err + } + + bpath := filepath.Clean(b.path) + path = filepath.Clean(filepath.Join(bpath, name)) + if !strings.HasPrefix(path, bpath) { + return name, os.ErrNotExist + } + + return path, nil +} + +func validateBasePathName(name string) error { + if runtime.GOOS != "windows" { + // Not much to do here; + // the virtual file paths all look absolute on *nix. + return nil + } + + // On Windows a common mistake would be to provide an absolute OS path + // We could strip out the base part, but that would not be very portable. + if filepath.IsAbs(name) { + return os.ErrNotExist + } + + return nil +} + +func (b *BasePathFs) Chtimes(name string, atime, mtime time.Time) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chtimes", Path: name, Err: err} + } + return b.source.Chtimes(name, atime, mtime) +} + +func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "chmod", Path: name, Err: err} + } + return b.source.Chmod(name, mode) +} + +func (b *BasePathFs) Name() string { + return "BasePathFs" +} + +func (b *BasePathFs) Stat(name string) (fi os.FileInfo, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "stat", Path: name, Err: err} + } + return b.source.Stat(name) +} + +func (b *BasePathFs) Rename(oldname, newname string) (err error) { + if oldname, err = b.RealPath(oldname); err != nil { + return &os.PathError{Op: "rename", Path: oldname, Err: err} + } + if newname, err = b.RealPath(newname); err != nil { + return &os.PathError{Op: "rename", Path: newname, Err: err} + } + return b.source.Rename(oldname, newname) +} + +func (b *BasePathFs) RemoveAll(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove_all", Path: name, Err: err} + } + return b.source.RemoveAll(name) +} + +func (b *BasePathFs) Remove(name string) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + return b.source.Remove(name) +} + +func (b *BasePathFs) OpenFile(name string, flag int, mode os.FileMode) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "openfile", Path: name, Err: err} + } + sourcef, err := b.source.OpenFile(name, flag, mode) + if err != nil { + return nil, err + } + return &BasePathFile{sourcef, b.path}, nil +} + +func (b *BasePathFs) Open(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "open", Path: name, Err: err} + } + sourcef, err := b.source.Open(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) Mkdir(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.Mkdir(name, mode) +} + +func (b *BasePathFs) MkdirAll(name string, mode os.FileMode) (err error) { + if name, err = b.RealPath(name); err != nil { + return &os.PathError{Op: "mkdir", Path: name, Err: err} + } + return b.source.MkdirAll(name, mode) +} + +func (b *BasePathFs) Create(name string) (f File, err error) { + if name, err = b.RealPath(name); err != nil { + return nil, &os.PathError{Op: "create", Path: name, Err: err} + } + sourcef, err := b.source.Create(name) + if err != nil { + return nil, err + } + return &BasePathFile{File: sourcef, path: b.path}, nil +} + +func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + name, err := b.RealPath(name) + if err != nil { + return nil, false, &os.PathError{Op: "lstat", Path: name, Err: err} + } + if lstater, ok := b.source.(Lstater); ok { + return lstater.LstatIfPossible(name) + } + fi, err := b.source.Stat(name) + return fi, false, err +} + +// vim: ts=4 sw=4 noexpandtab nolist syn=go diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go new file mode 100755 index 0000000..29a26c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/cacheOnReadFs.go @@ -0,0 +1,290 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +// If the cache duration is 0, cache time will be unlimited, i.e. once +// a file is in the layer, the base will never be read again for this file. +// +// For cache times greater than 0, the modification time of a file is +// checked. Note that a lot of file system implementations only allow a +// resolution of a second for timestamps... or as the godoc for os.Chtimes() +// states: "The underlying filesystem may truncate or round the values to a +// less precise time unit." +// +// This caching union will forward all write calls also to the base file +// system first. To prevent writing to the base Fs, wrap it in a read-only +// filter - Note: this will also make the overlay read-only, for writing files +// in the overlay, use the overlay Fs directly, not via the union Fs. +type CacheOnReadFs struct { + base Fs + layer Fs + cacheTime time.Duration +} + +func NewCacheOnReadFs(base Fs, layer Fs, cacheTime time.Duration) Fs { + return &CacheOnReadFs{base: base, layer: layer, cacheTime: cacheTime} +} + +type cacheState int + +const ( + // not present in the overlay, unknown if it exists in the base: + cacheMiss cacheState = iota + // present in the overlay and in base, base file is newer: + cacheStale + // present in the overlay - with cache time == 0 it may exist in the base, + // with cacheTime > 0 it exists in the base and is same age or newer in the + // overlay + cacheHit + // happens if someone writes directly to the overlay without + // going through this union + cacheLocal +) + +func (u *CacheOnReadFs) cacheStatus(name string) (state cacheState, fi os.FileInfo, err error) { + var lfi, bfi os.FileInfo + lfi, err = u.layer.Stat(name) + if err == nil { + if u.cacheTime == 0 { + return cacheHit, lfi, nil + } + if lfi.ModTime().Add(u.cacheTime).Before(time.Now()) { + bfi, err = u.base.Stat(name) + if err != nil { + return cacheLocal, lfi, nil + } + if bfi.ModTime().After(lfi.ModTime()) { + return cacheStale, bfi, nil + } + } + return cacheHit, lfi, nil + } + + if err == syscall.ENOENT || os.IsNotExist(err) { + return cacheMiss, nil, nil + } + + return cacheMiss, nil, err +} + +func (u *CacheOnReadFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CacheOnReadFs) Chtimes(name string, atime, mtime time.Time) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chtimes(name, atime, mtime) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chtimes(name, atime, mtime) + } + if err != nil { + return err + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CacheOnReadFs) Chmod(name string, mode os.FileMode) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Chmod(name, mode) + case cacheStale, cacheMiss: + if err := u.copyToLayer(name); err != nil { + return err + } + err = u.base.Chmod(name, mode) + } + if err != nil { + return err + } + return u.layer.Chmod(name, mode) +} + +func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheMiss: + return u.base.Stat(name) + default: // cacheStale has base, cacheHit and cacheLocal the layer os.FileInfo + return fi, nil + } +} + +func (u *CacheOnReadFs) Rename(oldname, newname string) error { + st, _, err := u.cacheStatus(oldname) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit: + err = u.base.Rename(oldname, newname) + case cacheStale, cacheMiss: + if err := u.copyToLayer(oldname); err != nil { + return err + } + err = u.base.Rename(oldname, newname) + } + if err != nil { + return err + } + return u.layer.Rename(oldname, newname) +} + +func (u *CacheOnReadFs) Remove(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.Remove(name) + } + if err != nil { + return err + } + return u.layer.Remove(name) +} + +func (u *CacheOnReadFs) RemoveAll(name string) error { + st, _, err := u.cacheStatus(name) + if err != nil { + return err + } + switch st { + case cacheLocal: + case cacheHit, cacheStale, cacheMiss: + err = u.base.RemoveAll(name) + } + if err != nil { + return err + } + return u.layer.RemoveAll(name) +} + +func (u *CacheOnReadFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + st, _, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + switch st { + case cacheLocal, cacheHit: + default: + if err := u.copyToLayer(name); err != nil { + return nil, err + } + } + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + bfi, err := u.base.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + lfi, err := u.layer.OpenFile(name, flag, perm) + if err != nil { + bfi.Close() // oops, what if O_TRUNC was set and file opening in the layer failed...? + return nil, err + } + return &UnionFile{Base: bfi, Layer: lfi}, nil + } + return u.layer.OpenFile(name, flag, perm) +} + +func (u *CacheOnReadFs) Open(name string) (File, error) { + st, fi, err := u.cacheStatus(name) + if err != nil { + return nil, err + } + + switch st { + case cacheLocal: + return u.layer.Open(name) + + case cacheMiss: + bfi, err := u.base.Stat(name) + if err != nil { + return nil, err + } + if bfi.IsDir() { + return u.base.Open(name) + } + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + + case cacheStale: + if !fi.IsDir() { + if err := u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.Open(name) + } + case cacheHit: + if !fi.IsDir() { + return u.layer.Open(name) + } + } + // the dirs from cacheHit, cacheStale fall down here: + bfile, _ := u.base.Open(name) + lfile, err := u.layer.Open(name) + if err != nil && bfile == nil { + return nil, err + } + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CacheOnReadFs) Mkdir(name string, perm os.FileMode) error { + err := u.base.Mkdir(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) // yes, MkdirAll... we cannot assume it exists in the cache +} + +func (u *CacheOnReadFs) Name() string { + return "CacheOnReadFs" +} + +func (u *CacheOnReadFs) MkdirAll(name string, perm os.FileMode) error { + err := u.base.MkdirAll(name, perm) + if err != nil { + return err + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CacheOnReadFs) Create(name string) (File, error) { + bfh, err := u.base.Create(name) + if err != nil { + return nil, err + } + lfh, err := u.layer.Create(name) + if err != nil { + // oops, see comment about OS_TRUNC above, should we remove? then we have to + // remember if the file did not exist before + bfh.Close() + return nil, err + } + return &UnionFile{Base: bfh, Layer: lfh}, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_bsds.go new file mode 100755 index 0000000..5728243 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_bsds.go @@ -0,0 +1,22 @@ +// Copyright © 2016 Steve Francia . +// +// 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 openbsd freebsd netbsd dragonfly + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADF diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_win_unix.go new file mode 100755 index 0000000..968fc27 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/const_win_unix.go @@ -0,0 +1,25 @@ +// Copyright © 2016 Steve Francia . +// +// 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 +// +build !openbsd +// +build !freebsd +// +build !dragonfly +// +build !netbsd + +package afero + +import ( + "syscall" +) + +const BADFD = syscall.EBADFD diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go new file mode 100755 index 0000000..9aef397 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -0,0 +1,292 @@ +package afero + +import ( + "fmt" + "os" + "path/filepath" + "syscall" + "time" +) + +var _ Lstater = (*CopyOnWriteFs)(nil) + +// The CopyOnWriteFs is a union filesystem: a read only base file system with +// a possibly writeable layer on top. Changes to the file system will only +// be made in the overlay: Changing an existing file in the base layer which +// is not present in the overlay will copy the file to the overlay ("changing" +// includes also calls to e.g. Chtimes() and Chmod()). +// +// Reading directories is currently only supported via Open(), not OpenFile(). +type CopyOnWriteFs struct { + base Fs + layer Fs +} + +func NewCopyOnWriteFs(base Fs, layer Fs) Fs { + return &CopyOnWriteFs{base: base, layer: layer} +} + +// Returns true if the file is not in the overlay +func (u *CopyOnWriteFs) isBaseFile(name string) (bool, error) { + if _, err := u.layer.Stat(name); err == nil { + return false, nil + } + _, err := u.base.Stat(name) + if err != nil { + if oerr, ok := err.(*os.PathError); ok { + if oerr.Err == os.ErrNotExist || oerr.Err == syscall.ENOENT || oerr.Err == syscall.ENOTDIR { + return false, nil + } + } + if err == syscall.ENOENT { + return false, nil + } + } + return true, err +} + +func (u *CopyOnWriteFs) copyToLayer(name string) error { + return copyToLayer(u.base, u.layer, name) +} + +func (u *CopyOnWriteFs) Chtimes(name string, atime, mtime time.Time) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chtimes(name, atime, mtime) +} + +func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error { + b, err := u.isBaseFile(name) + if err != nil { + return err + } + if b { + if err := u.copyToLayer(name); err != nil { + return err + } + } + return u.layer.Chmod(name, mode) +} + +func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) { + fi, err := u.layer.Stat(name) + if err != nil { + isNotExist := u.isNotExist(err) + if isNotExist { + return u.base.Stat(name) + } + return nil, err + } + return fi, nil +} + +func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + llayer, ok1 := u.layer.(Lstater) + lbase, ok2 := u.base.(Lstater) + + if ok1 { + fi, b, err := llayer.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + + if !u.isNotExist(err) { + return nil, b, err + } + } + + if ok2 { + fi, b, err := lbase.LstatIfPossible(name) + if err == nil { + return fi, b, nil + } + if !u.isNotExist(err) { + return nil, b, err + } + } + + fi, err := u.Stat(name) + + return fi, false, err +} + +func (u *CopyOnWriteFs) isNotExist(err error) bool { + if e, ok := err.(*os.PathError); ok { + err = e.Err + } + if err == os.ErrNotExist || err == syscall.ENOENT || err == syscall.ENOTDIR { + return true + } + return false +} + +// Renaming files present only in the base layer is not permitted +func (u *CopyOnWriteFs) Rename(oldname, newname string) error { + b, err := u.isBaseFile(oldname) + if err != nil { + return err + } + if b { + return syscall.EPERM + } + return u.layer.Rename(oldname, newname) +} + +// Removing files present only in the base layer is not permitted. If +// a file is present in the base layer and the overlay, only the overlay +// will be removed. +func (u *CopyOnWriteFs) Remove(name string) error { + err := u.layer.Remove(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) RemoveAll(name string) error { + err := u.layer.RemoveAll(name) + switch err { + case syscall.ENOENT: + _, err = u.base.Stat(name) + if err == nil { + return syscall.EPERM + } + return syscall.ENOENT + default: + return err + } +} + +func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + if flag&(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + if b { + if err = u.copyToLayer(name); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + dir := filepath.Dir(name) + isaDir, err := IsDir(u.base, dir) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + if isaDir { + if err = u.layer.MkdirAll(dir, 0777); err != nil { + return nil, err + } + return u.layer.OpenFile(name, flag, perm) + } + + isaDir, err = IsDir(u.layer, dir) + if err != nil { + return nil, err + } + if isaDir { + return u.layer.OpenFile(name, flag, perm) + } + + return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOTDIR} // ...or os.ErrNotExist? + } + if b { + return u.base.OpenFile(name, flag, perm) + } + return u.layer.OpenFile(name, flag, perm) +} + +// This function handles the 9 different possibilities caused +// by the union which are the intersection of the following... +// layer: doesn't exist, exists as a file, and exists as a directory +// base: doesn't exist, exists as a file, and exists as a directory +func (u *CopyOnWriteFs) Open(name string) (File, error) { + // Since the overlay overrides the base we check that first + b, err := u.isBaseFile(name) + if err != nil { + return nil, err + } + + // If overlay doesn't exist, return the base (base state irrelevant) + if b { + return u.base.Open(name) + } + + // If overlay is a file, return it (base state irrelevant) + dir, err := IsDir(u.layer, name) + if err != nil { + return nil, err + } + if !dir { + return u.layer.Open(name) + } + + // Overlay is a directory, base state now matters. + // Base state has 3 states to check but 2 outcomes: + // A. It's a file or non-readable in the base (return just the overlay) + // B. It's an accessible directory in the base (return a UnionFile) + + // If base is file or nonreadable, return overlay + dir, err = IsDir(u.base, name) + if !dir || err != nil { + return u.layer.Open(name) + } + + // Both base & layer are directories + // Return union file (if opens are without error) + bfile, bErr := u.base.Open(name) + lfile, lErr := u.layer.Open(name) + + // If either have errors at this point something is very wrong. Return nil and the errors + if bErr != nil || lErr != nil { + return nil, fmt.Errorf("BaseErr: %v\nOverlayErr: %v", bErr, lErr) + } + + return &UnionFile{Base: bfile, Layer: lfile}, nil +} + +func (u *CopyOnWriteFs) Mkdir(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + return syscall.EEXIST + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Name() string { + return "CopyOnWriteFs" +} + +func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error { + dir, err := IsDir(u.base, name) + if err != nil { + return u.layer.MkdirAll(name, perm) + } + if dir { + return syscall.EEXIST + } + return u.layer.MkdirAll(name, perm) +} + +func (u *CopyOnWriteFs) Create(name string) (File, error) { + return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/httpFs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/httpFs.go new file mode 100755 index 0000000..c421936 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/httpFs.go @@ -0,0 +1,110 @@ +// Copyright © 2014 Steve Francia . +// +// 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 afero + +import ( + "errors" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "time" +) + +type httpDir struct { + basePath string + fs HttpFs +} + +func (d httpDir) Open(name string) (http.File, error) { + if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || + strings.Contains(name, "\x00") { + return nil, errors.New("http: invalid character in file path") + } + dir := string(d.basePath) + if dir == "" { + dir = "." + } + + f, err := d.fs.Open(filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name)))) + if err != nil { + return nil, err + } + return f, nil +} + +type HttpFs struct { + source Fs +} + +func NewHttpFs(source Fs) *HttpFs { + return &HttpFs{source: source} +} + +func (h HttpFs) Dir(s string) *httpDir { + return &httpDir{basePath: s, fs: h} +} + +func (h HttpFs) Name() string { return "h HttpFs" } + +func (h HttpFs) Create(name string) (File, error) { + return h.source.Create(name) +} + +func (h HttpFs) Chmod(name string, mode os.FileMode) error { + return h.source.Chmod(name, mode) +} + +func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return h.source.Chtimes(name, atime, mtime) +} + +func (h HttpFs) Mkdir(name string, perm os.FileMode) error { + return h.source.Mkdir(name, perm) +} + +func (h HttpFs) MkdirAll(path string, perm os.FileMode) error { + return h.source.MkdirAll(path, perm) +} + +func (h HttpFs) Open(name string) (http.File, error) { + f, err := h.source.Open(name) + if err == nil { + if httpfile, ok := f.(http.File); ok { + return httpfile, nil + } + } + return nil, err +} + +func (h HttpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + return h.source.OpenFile(name, flag, perm) +} + +func (h HttpFs) Remove(name string) error { + return h.source.Remove(name) +} + +func (h HttpFs) RemoveAll(path string) error { + return h.source.RemoveAll(path) +} + +func (h HttpFs) Rename(oldname, newname string) error { + return h.source.Rename(oldname, newname) +} + +func (h HttpFs) Stat(name string) (os.FileInfo, error) { + return h.source.Stat(name) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/ioutil.go new file mode 100755 index 0000000..5c3a3d8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/ioutil.go @@ -0,0 +1,230 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// 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 afero + +import ( + "bytes" + "io" + "os" + "path/filepath" + "sort" + "strconv" + "sync" + "time" +) + +// byName implements sort.Interface. +type byName []os.FileInfo + +func (f byName) Len() int { return len(f) } +func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() } +func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] } + +// ReadDir reads the directory named by dirname and returns +// a list of sorted directory entries. +func (a Afero) ReadDir(dirname string) ([]os.FileInfo, error) { + return ReadDir(a.Fs, dirname) +} + +func ReadDir(fs Fs, dirname string) ([]os.FileInfo, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Sort(byName(list)) + return list, nil +} + +// ReadFile reads the file named by filename and returns the contents. +// A successful call returns err == nil, not err == EOF. Because ReadFile +// reads the whole file, it does not treat an EOF from Read as an error +// to be reported. +func (a Afero) ReadFile(filename string) ([]byte, error) { + return ReadFile(a.Fs, filename) +} + +func ReadFile(fs Fs, filename string) ([]byte, error) { + f, err := fs.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + // It's a good but not certain bet that FileInfo will tell us exactly how much to + // read, so let's try it but be prepared for the answer to be wrong. + var n int64 + + if fi, err := f.Stat(); err == nil { + // Don't preallocate a huge buffer, just in case. + if size := fi.Size(); size < 1e9 { + n = size + } + } + // As initial capacity for readAll, use n + a little extra in case Size is zero, + // and to avoid another allocation after Read has filled the buffer. The readAll + // call will read into its allocated internal buffer cheaply. If the size was + // wrong, we'll either waste some space off the end or reallocate as needed, but + // in the overwhelmingly common case we'll get it just right. + return readAll(f, n+bytes.MinRead) +} + +// readAll reads from r until an error or EOF and returns the data it read +// from the internal buffer allocated with a specified capacity. +func readAll(r io.Reader, capacity int64) (b []byte, err error) { + buf := bytes.NewBuffer(make([]byte, 0, capacity)) + // If the buffer overflows, we will get bytes.ErrTooLarge. + // Return that as an error. Any other panic remains. + defer func() { + e := recover() + if e == nil { + return + } + if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge { + err = panicErr + } else { + panic(e) + } + }() + _, err = buf.ReadFrom(r) + return buf.Bytes(), err +} + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +func ReadAll(r io.Reader) ([]byte, error) { + return readAll(r, bytes.MinRead) +} + +// WriteFile writes data to a file named by filename. +// If the file does not exist, WriteFile creates it with permissions perm; +// otherwise WriteFile truncates it before writing. +func (a Afero) WriteFile(filename string, data []byte, perm os.FileMode) error { + return WriteFile(a.Fs, filename, data, perm) +} + +func WriteFile(fs Fs, filename string, data []byte, perm os.FileMode) error { + f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) + if err != nil { + return err + } + n, err := f.Write(data) + if err == nil && n < len(data) { + err = io.ErrShortWrite + } + if err1 := f.Close(); err == nil { + err = err1 + } + return err +} + +// Random number state. +// We generate random temporary file names so that there's a good +// chance the file doesn't exist yet - keeps the number of tries in +// TempFile to a minimum. +var rand uint32 +var randmu sync.Mutex + +func reseed() uint32 { + return uint32(time.Now().UnixNano() + int64(os.Getpid())) +} + +func nextSuffix() string { + randmu.Lock() + r := rand + if r == 0 { + r = reseed() + } + r = r*1664525 + 1013904223 // constants from Numerical Recipes + rand = r + randmu.Unlock() + return strconv.Itoa(int(1e9 + r%1e9))[1:] +} + +// TempFile creates a new temporary file in the directory dir +// with a name beginning with prefix, opens the file for reading +// and writing, and returns the resulting *File. +// If dir is the empty string, TempFile uses the default directory +// for temporary files (see os.TempDir). +// Multiple programs calling TempFile simultaneously +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility +// to remove the file when no longer needed. +func (a Afero) TempFile(dir, prefix string) (f File, err error) { + return TempFile(a.Fs, dir, prefix) +} + +func TempFile(fs Fs, dir, prefix string) (f File, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + name := filepath.Join(dir, prefix+nextSuffix()) + f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + break + } + return +} + +// TempDir creates a new temporary directory in the directory dir +// with a name beginning with prefix and returns the path of the +// new directory. If dir is the empty string, TempDir uses the +// default directory for temporary files (see os.TempDir). +// Multiple programs calling TempDir simultaneously +// will not choose the same directory. It is the caller's responsibility +// to remove the directory when no longer needed. +func (a Afero) TempDir(dir, prefix string) (name string, err error) { + return TempDir(a.Fs, dir, prefix) +} +func TempDir(fs Fs, dir, prefix string) (name string, err error) { + if dir == "" { + dir = os.TempDir() + } + + nconflict := 0 + for i := 0; i < 10000; i++ { + try := filepath.Join(dir, prefix+nextSuffix()) + err = fs.Mkdir(try, 0700) + if os.IsExist(err) { + if nconflict++; nconflict > 10 { + randmu.Lock() + rand = reseed() + randmu.Unlock() + } + continue + } + if err == nil { + name = try + } + break + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/lstater.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/lstater.go new file mode 100755 index 0000000..89c1bfc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/lstater.go @@ -0,0 +1,27 @@ +// Copyright © 2018 Steve Francia . +// +// 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 afero + +import ( + "os" +) + +// Lstater is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Lstat if the filesystem iself is, or it delegates to, the os filesystem. +// Else it will call Stat. +// In addtion to the FileInfo, it will return a boolean telling whether Lstat was called or not. +type Lstater interface { + LstatIfPossible(name string) (os.FileInfo, bool, error) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/match.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/match.go new file mode 100755 index 0000000..c18a87f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/match.go @@ -0,0 +1,110 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2009 The Go Authors. All rights reserved. + +// 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 afero + +import ( + "path/filepath" + "sort" + "strings" +) + +// Glob returns the names of all files matching pattern or nil +// if there is no matching file. The syntax of patterns is the same +// as in Match. The pattern may describe hierarchical names such as +// /usr/*/bin/ed (assuming the Separator is '/'). +// +// Glob ignores file system errors such as I/O errors reading directories. +// The only possible returned error is ErrBadPattern, when pattern +// is malformed. +// +// This was adapted from (http://golang.org/pkg/path/filepath) and uses several +// built-ins from that package. +func Glob(fs Fs, pattern string) (matches []string, err error) { + if !hasMeta(pattern) { + // Lstat not supported by a ll filesystems. + if _, err = lstatIfPossible(fs, pattern); err != nil { + return nil, nil + } + return []string{pattern}, nil + } + + dir, file := filepath.Split(pattern) + switch dir { + case "": + dir = "." + case string(filepath.Separator): + // nothing + default: + dir = dir[0 : len(dir)-1] // chop off trailing separator + } + + if !hasMeta(dir) { + return glob(fs, dir, file, nil) + } + + var m []string + m, err = Glob(fs, dir) + if err != nil { + return + } + for _, d := range m { + matches, err = glob(fs, d, file, matches) + if err != nil { + return + } + } + return +} + +// glob searches for files matching pattern in the directory dir +// and appends them to matches. If the directory cannot be +// opened, it returns the existing matches. New matches are +// added in lexicographical order. +func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) { + m = matches + fi, err := fs.Stat(dir) + if err != nil { + return + } + if !fi.IsDir() { + return + } + d, err := fs.Open(dir) + if err != nil { + return + } + defer d.Close() + + names, _ := d.Readdirnames(-1) + sort.Strings(names) + + for _, n := range names { + matched, err := filepath.Match(pattern, n) + if err != nil { + return m, err + } + if matched { + m = append(m, filepath.Join(dir, n)) + } + } + return +} + +// hasMeta reports whether path contains any of the magic characters +// recognized by Match. +func hasMeta(path string) bool { + // TODO(niemeyer): Should other magic characters be added here? + return strings.IndexAny(path, "*?[") >= 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dir.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dir.go new file mode 100755 index 0000000..e104013 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dir.go @@ -0,0 +1,37 @@ +// Copyright © 2014 Steve Francia . +// +// 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 mem + +type Dir interface { + Len() int + Names() []string + Files() []*FileData + Add(*FileData) + Remove(*FileData) +} + +func RemoveFromMemDir(dir *FileData, f *FileData) { + dir.memDir.Remove(f) +} + +func AddToMemDir(dir *FileData, f *FileData) { + dir.memDir.Add(f) +} + +func InitializeDir(d *FileData) { + if d.memDir == nil { + d.dir = true + d.memDir = &DirMap{} + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go new file mode 100755 index 0000000..03a57ee --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/dirmap.go @@ -0,0 +1,43 @@ +// Copyright © 2015 Steve Francia . +// +// 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 mem + +import "sort" + +type DirMap map[string]*FileData + +func (m DirMap) Len() int { return len(m) } +func (m DirMap) Add(f *FileData) { m[f.name] = f } +func (m DirMap) Remove(f *FileData) { delete(m, f.name) } +func (m DirMap) Files() (files []*FileData) { + for _, f := range m { + files = append(files, f) + } + sort.Sort(filesSorter(files)) + return files +} + +// implement sort.Interface for []*FileData +type filesSorter []*FileData + +func (s filesSorter) Len() int { return len(s) } +func (s filesSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name } + +func (m DirMap) Names() (names []string) { + for x := range m { + names = append(names, x) + } + return names +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/file.go new file mode 100755 index 0000000..885e554 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/mem/file.go @@ -0,0 +1,314 @@ +// Copyright © 2015 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// 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 mem + +import ( + "bytes" + "errors" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" +) + +import "time" + +const FilePathSeparator = string(filepath.Separator) + +type File struct { + // atomic requires 64-bit alignment for struct field access + at int64 + readDirCount int64 + closed bool + readOnly bool + fileData *FileData +} + +func NewFileHandle(data *FileData) *File { + return &File{fileData: data} +} + +func NewReadOnlyFileHandle(data *FileData) *File { + return &File{fileData: data, readOnly: true} +} + +func (f File) Data() *FileData { + return f.fileData +} + +type FileData struct { + sync.Mutex + name string + data []byte + memDir Dir + dir bool + mode os.FileMode + modtime time.Time +} + +func (d *FileData) Name() string { + d.Lock() + defer d.Unlock() + return d.name +} + +func CreateFile(name string) *FileData { + return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()} +} + +func CreateDir(name string) *FileData { + return &FileData{name: name, memDir: &DirMap{}, dir: true} +} + +func ChangeFileName(f *FileData, newname string) { + f.Lock() + f.name = newname + f.Unlock() +} + +func SetMode(f *FileData, mode os.FileMode) { + f.Lock() + f.mode = mode + f.Unlock() +} + +func SetModTime(f *FileData, mtime time.Time) { + f.Lock() + setModTime(f, mtime) + f.Unlock() +} + +func setModTime(f *FileData, mtime time.Time) { + f.modtime = mtime +} + +func GetFileInfo(f *FileData) *FileInfo { + return &FileInfo{f} +} + +func (f *File) Open() error { + atomic.StoreInt64(&f.at, 0) + atomic.StoreInt64(&f.readDirCount, 0) + f.fileData.Lock() + f.closed = false + f.fileData.Unlock() + return nil +} + +func (f *File) Close() error { + f.fileData.Lock() + f.closed = true + if !f.readOnly { + setModTime(f.fileData, time.Now()) + } + f.fileData.Unlock() + return nil +} + +func (f *File) Name() string { + return f.fileData.Name() +} + +func (f *File) Stat() (os.FileInfo, error) { + return &FileInfo{f.fileData}, nil +} + +func (f *File) Sync() error { + return nil +} + +func (f *File) Readdir(count int) (res []os.FileInfo, err error) { + var outLength int64 + + f.fileData.Lock() + files := f.fileData.memDir.Files()[f.readDirCount:] + if count > 0 { + if len(files) < count { + outLength = int64(len(files)) + } else { + outLength = int64(count) + } + if len(files) == 0 { + err = io.EOF + } + } else { + outLength = int64(len(files)) + } + f.readDirCount += outLength + f.fileData.Unlock() + + res = make([]os.FileInfo, outLength) + for i := range res { + res[i] = &FileInfo{files[i]} + } + + return res, err +} + +func (f *File) Readdirnames(n int) (names []string, err error) { + fi, err := f.Readdir(n) + names = make([]string, len(fi)) + for i, f := range fi { + _, names[i] = filepath.Split(f.Name()) + } + return names, err +} + +func (f *File) Read(b []byte) (n int, err error) { + f.fileData.Lock() + defer f.fileData.Unlock() + if f.closed == true { + return 0, ErrFileClosed + } + if len(b) > 0 && int(f.at) == len(f.fileData.data) { + return 0, io.EOF + } + if int(f.at) > len(f.fileData.data) { + return 0, io.ErrUnexpectedEOF + } + if len(f.fileData.data)-int(f.at) >= len(b) { + n = len(b) + } else { + n = len(f.fileData.data) - int(f.at) + } + copy(b, f.fileData.data[f.at:f.at+int64(n)]) + atomic.AddInt64(&f.at, int64(n)) + return +} + +func (f *File) ReadAt(b []byte, off int64) (n int, err error) { + atomic.StoreInt64(&f.at, off) + return f.Read(b) +} + +func (f *File) Truncate(size int64) error { + if f.closed == true { + return ErrFileClosed + } + if f.readOnly { + return &os.PathError{Op: "truncate", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + if size < 0 { + return ErrOutOfRange + } + if size > int64(len(f.fileData.data)) { + diff := size - int64(len(f.fileData.data)) + f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...) + } else { + f.fileData.data = f.fileData.data[0:size] + } + setModTime(f.fileData, time.Now()) + return nil +} + +func (f *File) Seek(offset int64, whence int) (int64, error) { + if f.closed == true { + return 0, ErrFileClosed + } + switch whence { + case 0: + atomic.StoreInt64(&f.at, offset) + case 1: + atomic.AddInt64(&f.at, int64(offset)) + case 2: + atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset) + } + return f.at, nil +} + +func (f *File) Write(b []byte) (n int, err error) { + if f.readOnly { + return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")} + } + n = len(b) + cur := atomic.LoadInt64(&f.at) + f.fileData.Lock() + defer f.fileData.Unlock() + diff := cur - int64(len(f.fileData.data)) + var tail []byte + if n+int(cur) < len(f.fileData.data) { + tail = f.fileData.data[n+int(cur):] + } + if diff > 0 { + f.fileData.data = append(bytes.Repeat([]byte{00}, int(diff)), b...) + f.fileData.data = append(f.fileData.data, tail...) + } else { + f.fileData.data = append(f.fileData.data[:cur], b...) + f.fileData.data = append(f.fileData.data, tail...) + } + setModTime(f.fileData, time.Now()) + + atomic.StoreInt64(&f.at, int64(len(f.fileData.data))) + return +} + +func (f *File) WriteAt(b []byte, off int64) (n int, err error) { + atomic.StoreInt64(&f.at, off) + return f.Write(b) +} + +func (f *File) WriteString(s string) (ret int, err error) { + return f.Write([]byte(s)) +} + +func (f *File) Info() *FileInfo { + return &FileInfo{f.fileData} +} + +type FileInfo struct { + *FileData +} + +// Implements os.FileInfo +func (s *FileInfo) Name() string { + s.Lock() + _, name := filepath.Split(s.name) + s.Unlock() + return name +} +func (s *FileInfo) Mode() os.FileMode { + s.Lock() + defer s.Unlock() + return s.mode +} +func (s *FileInfo) ModTime() time.Time { + s.Lock() + defer s.Unlock() + return s.modtime +} +func (s *FileInfo) IsDir() bool { + s.Lock() + defer s.Unlock() + return s.dir +} +func (s *FileInfo) Sys() interface{} { return nil } +func (s *FileInfo) Size() int64 { + if s.IsDir() { + return int64(42) + } + s.Lock() + defer s.Unlock() + return int64(len(s.data)) +} + +var ( + ErrFileClosed = errors.New("File is closed") + ErrOutOfRange = errors.New("Out of range") + ErrTooLarge = errors.New("Too large") + ErrFileNotFound = os.ErrNotExist + ErrFileExists = os.ErrExist + ErrDestinationExists = os.ErrExist +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/memmap.go new file mode 100755 index 0000000..09498e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/memmap.go @@ -0,0 +1,365 @@ +// Copyright © 2014 Steve Francia . +// +// 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 afero + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/spf13/afero/mem" +) + +type MemMapFs struct { + mu sync.RWMutex + data map[string]*mem.FileData + init sync.Once +} + +func NewMemMapFs() Fs { + return &MemMapFs{} +} + +func (m *MemMapFs) getData() map[string]*mem.FileData { + m.init.Do(func() { + m.data = make(map[string]*mem.FileData) + // Root should always exist, right? + // TODO: what about windows? + m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator) + }) + return m.data +} + +func (*MemMapFs) Name() string { return "MemMapFS" } + +func (m *MemMapFs) Create(name string) (File, error) { + name = normalizePath(name) + m.mu.Lock() + file := mem.CreateFile(name) + m.getData()[name] = file + m.registerWithParent(file) + m.mu.Unlock() + return mem.NewFileHandle(file), nil +} + +func (m *MemMapFs) unRegisterWithParent(fileName string) error { + f, err := m.lockfreeOpen(fileName) + if err != nil { + return err + } + parent := m.findParent(f) + if parent == nil { + log.Panic("parent of ", f.Name(), " is nil") + } + + parent.Lock() + mem.RemoveFromMemDir(parent, f) + parent.Unlock() + return nil +} + +func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData { + pdir, _ := filepath.Split(f.Name()) + pdir = filepath.Clean(pdir) + pfile, err := m.lockfreeOpen(pdir) + if err != nil { + return nil + } + return pfile +} + +func (m *MemMapFs) registerWithParent(f *mem.FileData) { + if f == nil { + return + } + parent := m.findParent(f) + if parent == nil { + pdir := filepath.Dir(filepath.Clean(f.Name())) + err := m.lockfreeMkdir(pdir, 0777) + if err != nil { + //log.Println("Mkdir error:", err) + return + } + parent, err = m.lockfreeOpen(pdir) + if err != nil { + //log.Println("Open after Mkdir error:", err) + return + } + } + + parent.Lock() + mem.InitializeDir(parent) + mem.AddToMemDir(parent, f) + parent.Unlock() +} + +func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error { + name = normalizePath(name) + x, ok := m.getData()[name] + if ok { + // Only return ErrFileExists if it's a file, not a directory. + i := mem.FileInfo{FileData: x} + if !i.IsDir() { + return ErrFileExists + } + } else { + item := mem.CreateDir(name) + m.getData()[name] = item + m.registerWithParent(item) + } + return nil +} + +func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error { + name = normalizePath(name) + + m.mu.RLock() + _, ok := m.getData()[name] + m.mu.RUnlock() + if ok { + return &os.PathError{Op: "mkdir", Path: name, Err: ErrFileExists} + } + + m.mu.Lock() + item := mem.CreateDir(name) + m.getData()[name] = item + m.registerWithParent(item) + m.mu.Unlock() + + m.Chmod(name, perm|os.ModeDir) + + return nil +} + +func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error { + err := m.Mkdir(path, perm) + if err != nil { + if err.(*os.PathError).Err == ErrFileExists { + return nil + } + return err + } + return nil +} + +// Handle some relative paths +func normalizePath(path string) string { + path = filepath.Clean(path) + + switch path { + case ".": + return FilePathSeparator + case "..": + return FilePathSeparator + default: + return path + } +} + +func (m *MemMapFs) Open(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewReadOnlyFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) openWrite(name string) (File, error) { + f, err := m.open(name) + if f != nil { + return mem.NewFileHandle(f), err + } + return nil, err +} + +func (m *MemMapFs) open(name string) (*mem.FileData, error) { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileNotFound} + } + return f, nil +} + +func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) { + name = normalizePath(name) + f, ok := m.getData()[name] + if ok { + return f, nil + } else { + return nil, ErrFileNotFound + } +} + +func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + chmod := false + file, err := m.openWrite(name) + if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { + file, err = m.Create(name) + chmod = true + } + if err != nil { + return nil, err + } + if flag == os.O_RDONLY { + file = mem.NewReadOnlyFileHandle(file.(*mem.File).Data()) + } + if flag&os.O_APPEND > 0 { + _, err = file.Seek(0, os.SEEK_END) + if err != nil { + file.Close() + return nil, err + } + } + if flag&os.O_TRUNC > 0 && flag&(os.O_RDWR|os.O_WRONLY) > 0 { + err = file.Truncate(0) + if err != nil { + file.Close() + return nil, err + } + } + if chmod { + m.Chmod(name, perm) + } + return file, nil +} + +func (m *MemMapFs) Remove(name string) error { + name = normalizePath(name) + + m.mu.Lock() + defer m.mu.Unlock() + + if _, ok := m.getData()[name]; ok { + err := m.unRegisterWithParent(name) + if err != nil { + return &os.PathError{Op: "remove", Path: name, Err: err} + } + delete(m.getData(), name) + } else { + return &os.PathError{Op: "remove", Path: name, Err: os.ErrNotExist} + } + return nil +} + +func (m *MemMapFs) RemoveAll(path string) error { + path = normalizePath(path) + m.mu.Lock() + m.unRegisterWithParent(path) + m.mu.Unlock() + + m.mu.RLock() + defer m.mu.RUnlock() + + for p, _ := range m.getData() { + if strings.HasPrefix(p, path) { + m.mu.RUnlock() + m.mu.Lock() + delete(m.getData(), p) + m.mu.Unlock() + m.mu.RLock() + } + } + return nil +} + +func (m *MemMapFs) Rename(oldname, newname string) error { + oldname = normalizePath(oldname) + newname = normalizePath(newname) + + if oldname == newname { + return nil + } + + m.mu.RLock() + defer m.mu.RUnlock() + if _, ok := m.getData()[oldname]; ok { + m.mu.RUnlock() + m.mu.Lock() + m.unRegisterWithParent(oldname) + fileData := m.getData()[oldname] + delete(m.getData(), oldname) + mem.ChangeFileName(fileData, newname) + m.getData()[newname] = fileData + m.registerWithParent(fileData) + m.mu.Unlock() + m.mu.RLock() + } else { + return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound} + } + return nil +} + +func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { + f, err := m.Open(name) + if err != nil { + return nil, err + } + fi := mem.GetFileInfo(f.(*mem.File).Data()) + return fi, nil +} + +func (m *MemMapFs) Chmod(name string, mode os.FileMode) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetMode(f, mode) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + name = normalizePath(name) + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chtimes", Path: name, Err: ErrFileNotFound} + } + + m.mu.Lock() + mem.SetModTime(f, mtime) + m.mu.Unlock() + + return nil +} + +func (m *MemMapFs) List() { + for _, x := range m.data { + y := mem.FileInfo{FileData: x} + fmt.Println(x.Name(), y.Size()) + } +} + +// func debugMemMapList(fs Fs) { +// if x, ok := fs.(*MemMapFs); ok { +// x.List() +// } +// } diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/os.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/os.go new file mode 100755 index 0000000..13cc1b8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/os.go @@ -0,0 +1,101 @@ +// Copyright © 2014 Steve Francia . +// Copyright 2013 tsuru authors. All rights reserved. +// +// 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 afero + +import ( + "os" + "time" +) + +var _ Lstater = (*OsFs)(nil) + +// OsFs is a Fs implementation that uses functions provided by the os package. +// +// For details in any method, check the documentation of the os package +// (http://golang.org/pkg/os/). +type OsFs struct{} + +func NewOsFs() Fs { + return &OsFs{} +} + +func (OsFs) Name() string { return "OsFs" } + +func (OsFs) Create(name string) (File, error) { + f, e := os.Create(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Mkdir(name string, perm os.FileMode) error { + return os.Mkdir(name, perm) +} + +func (OsFs) MkdirAll(path string, perm os.FileMode) error { + return os.MkdirAll(path, perm) +} + +func (OsFs) Open(name string) (File, error) { + f, e := os.Open(name) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + f, e := os.OpenFile(name, flag, perm) + if f == nil { + // while this looks strange, we need to return a bare nil (of type nil) not + // a nil value of type *os.File or nil won't be nil + return nil, e + } + return f, e +} + +func (OsFs) Remove(name string) error { + return os.Remove(name) +} + +func (OsFs) RemoveAll(path string) error { + return os.RemoveAll(path) +} + +func (OsFs) Rename(oldname, newname string) error { + return os.Rename(oldname, newname) +} + +func (OsFs) Stat(name string) (os.FileInfo, error) { + return os.Stat(name) +} + +func (OsFs) Chmod(name string, mode os.FileMode) error { + return os.Chmod(name, mode) +} + +func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error { + return os.Chtimes(name, atime, mtime) +} + +func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + fi, err := os.Lstat(name) + return fi, true, err +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/path.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/path.go new file mode 100755 index 0000000..18f60a0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/path.go @@ -0,0 +1,106 @@ +// Copyright ©2015 The Go Authors +// Copyright ©2015 Steve Francia +// +// 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 afero + +import ( + "os" + "path/filepath" + "sort" +) + +// readDirNames reads the directory named by dirname and returns +// a sorted list of directory entries. +// adapted from https://golang.org/src/path/filepath/path.go +func readDirNames(fs Fs, dirname string) ([]string, error) { + f, err := fs.Open(dirname) + if err != nil { + return nil, err + } + names, err := f.Readdirnames(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Strings(names) + return names, nil +} + +// walk recursively descends path, calling walkFn +// adapted from https://golang.org/src/path/filepath/path.go +func walk(fs Fs, path string, info os.FileInfo, walkFn filepath.WalkFunc) error { + err := walkFn(path, info, nil) + if err != nil { + if info.IsDir() && err == filepath.SkipDir { + return nil + } + return err + } + + if !info.IsDir() { + return nil + } + + names, err := readDirNames(fs, path) + if err != nil { + return walkFn(path, info, err) + } + + for _, name := range names { + filename := filepath.Join(path, name) + fileInfo, err := lstatIfPossible(fs, filename) + if err != nil { + if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { + return err + } + } else { + err = walk(fs, filename, fileInfo, walkFn) + if err != nil { + if !fileInfo.IsDir() || err != filepath.SkipDir { + return err + } + } + } + } + return nil +} + +// if the filesystem supports it, use Lstat, else use fs.Stat +func lstatIfPossible(fs Fs, path string) (os.FileInfo, error) { + if lfs, ok := fs.(Lstater); ok { + fi, _, err := lfs.LstatIfPossible(path) + return fi, err + } + return fs.Stat(path) +} + +// Walk walks the file tree rooted at root, calling walkFn for each file or +// directory in the tree, including root. All errors that arise visiting files +// and directories are filtered by walkFn. The files are walked in lexical +// order, which makes the output deterministic but means that for very +// large directories Walk can be inefficient. +// Walk does not follow symbolic links. + +func (a Afero) Walk(root string, walkFn filepath.WalkFunc) error { + return Walk(a.Fs, root, walkFn) +} + +func Walk(fs Fs, root string, walkFn filepath.WalkFunc) error { + info, err := lstatIfPossible(fs, root) + if err != nil { + return walkFn(root, nil, err) + } + return walk(fs, root, info, walkFn) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/readonlyfs.go new file mode 100755 index 0000000..c6376ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/readonlyfs.go @@ -0,0 +1,80 @@ +package afero + +import ( + "os" + "syscall" + "time" +) + +var _ Lstater = (*ReadOnlyFs)(nil) + +type ReadOnlyFs struct { + source Fs +} + +func NewReadOnlyFs(source Fs) Fs { + return &ReadOnlyFs{source: source} +} + +func (r *ReadOnlyFs) ReadDir(name string) ([]os.FileInfo, error) { + return ReadDir(r.source, name) +} + +func (r *ReadOnlyFs) Chtimes(n string, a, m time.Time) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Chmod(n string, m os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Name() string { + return "ReadOnlyFilter" +} + +func (r *ReadOnlyFs) Stat(name string) (os.FileInfo, error) { + return r.source.Stat(name) +} + +func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { + if lsf, ok := r.source.(Lstater); ok { + return lsf.LstatIfPossible(name) + } + fi, err := r.Stat(name) + return fi, false, err +} + +func (r *ReadOnlyFs) Rename(o, n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) RemoveAll(p string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Remove(n string) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 { + return nil, syscall.EPERM + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *ReadOnlyFs) Open(n string) (File, error) { + return r.source.Open(n) +} + +func (r *ReadOnlyFs) Mkdir(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) MkdirAll(n string, p os.FileMode) error { + return syscall.EPERM +} + +func (r *ReadOnlyFs) Create(n string) (File, error) { + return nil, syscall.EPERM +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/regexpfs.go new file mode 100755 index 0000000..9d92dbc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/regexpfs.go @@ -0,0 +1,214 @@ +package afero + +import ( + "os" + "regexp" + "syscall" + "time" +) + +// The RegexpFs filters files (not directories) by regular expression. Only +// files matching the given regexp will be allowed, all others get a ENOENT error ( +// "No such file or directory"). +// +type RegexpFs struct { + re *regexp.Regexp + source Fs +} + +func NewRegexpFs(source Fs, re *regexp.Regexp) Fs { + return &RegexpFs{source: source, re: re} +} + +type RegexpFile struct { + f File + re *regexp.Regexp +} + +func (r *RegexpFs) matchesName(name string) error { + if r.re == nil { + return nil + } + if r.re.MatchString(name) { + return nil + } + return syscall.ENOENT +} + +func (r *RegexpFs) dirOrMatches(name string) error { + dir, err := IsDir(r.source, name) + if err != nil { + return err + } + if dir { + return nil + } + return r.matchesName(name) +} + +func (r *RegexpFs) Chtimes(name string, a, m time.Time) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chtimes(name, a, m) +} + +func (r *RegexpFs) Chmod(name string, mode os.FileMode) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Chmod(name, mode) +} + +func (r *RegexpFs) Name() string { + return "RegexpFs" +} + +func (r *RegexpFs) Stat(name string) (os.FileInfo, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.Stat(name) +} + +func (r *RegexpFs) Rename(oldname, newname string) error { + dir, err := IsDir(r.source, oldname) + if err != nil { + return err + } + if dir { + return nil + } + if err := r.matchesName(oldname); err != nil { + return err + } + if err := r.matchesName(newname); err != nil { + return err + } + return r.source.Rename(oldname, newname) +} + +func (r *RegexpFs) RemoveAll(p string) error { + dir, err := IsDir(r.source, p) + if err != nil { + return err + } + if !dir { + if err := r.matchesName(p); err != nil { + return err + } + } + return r.source.RemoveAll(p) +} + +func (r *RegexpFs) Remove(name string) error { + if err := r.dirOrMatches(name); err != nil { + return err + } + return r.source.Remove(name) +} + +func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { + if err := r.dirOrMatches(name); err != nil { + return nil, err + } + return r.source.OpenFile(name, flag, perm) +} + +func (r *RegexpFs) Open(name string) (File, error) { + dir, err := IsDir(r.source, name) + if err != nil { + return nil, err + } + if !dir { + if err := r.matchesName(name); err != nil { + return nil, err + } + } + f, err := r.source.Open(name) + return &RegexpFile{f: f, re: r.re}, nil +} + +func (r *RegexpFs) Mkdir(n string, p os.FileMode) error { + return r.source.Mkdir(n, p) +} + +func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error { + return r.source.MkdirAll(n, p) +} + +func (r *RegexpFs) Create(name string) (File, error) { + if err := r.matchesName(name); err != nil { + return nil, err + } + return r.source.Create(name) +} + +func (f *RegexpFile) Close() error { + return f.f.Close() +} + +func (f *RegexpFile) Read(s []byte) (int, error) { + return f.f.Read(s) +} + +func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) { + return f.f.ReadAt(s, o) +} + +func (f *RegexpFile) Seek(o int64, w int) (int64, error) { + return f.f.Seek(o, w) +} + +func (f *RegexpFile) Write(s []byte) (int, error) { + return f.f.Write(s) +} + +func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) { + return f.f.WriteAt(s, o) +} + +func (f *RegexpFile) Name() string { + return f.f.Name() +} + +func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) { + var rfi []os.FileInfo + rfi, err = f.f.Readdir(c) + if err != nil { + return nil, err + } + for _, i := range rfi { + if i.IsDir() || f.re.MatchString(i.Name()) { + fi = append(fi, i) + } + } + return fi, nil +} + +func (f *RegexpFile) Readdirnames(c int) (n []string, err error) { + fi, err := f.Readdir(c) + if err != nil { + return nil, err + } + for _, s := range fi { + n = append(n, s.Name()) + } + return n, nil +} + +func (f *RegexpFile) Stat() (os.FileInfo, error) { + return f.f.Stat() +} + +func (f *RegexpFile) Sync() error { + return f.f.Sync() +} + +func (f *RegexpFile) Truncate(s int64) error { + return f.f.Truncate(s) +} + +func (f *RegexpFile) WriteString(s string) (int, error) { + return f.f.WriteString(s) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/unionFile.go new file mode 100755 index 0000000..1e78f7d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/unionFile.go @@ -0,0 +1,305 @@ +package afero + +import ( + "io" + "os" + "path/filepath" + "syscall" +) + +// The UnionFile implements the afero.File interface and will be returned +// when reading a directory present at least in the overlay or opening a file +// for writing. +// +// The calls to +// Readdir() and Readdirnames() merge the file os.FileInfo / names from the +// base and the overlay - for files present in both layers, only those +// from the overlay will be used. +// +// When opening files for writing (Create() / OpenFile() with the right flags) +// the operations will be done in both layers, starting with the overlay. A +// successful read in the overlay will move the cursor position in the base layer +// by the number of bytes read. +type UnionFile struct { + Base File + Layer File + Merger DirsMerger + off int + files []os.FileInfo +} + +func (f *UnionFile) Close() error { + // first close base, so we have a newer timestamp in the overlay. If we'd close + // the overlay first, we'd get a cacheStale the next time we access this file + // -> cache would be useless ;-) + if f.Base != nil { + f.Base.Close() + } + if f.Layer != nil { + return f.Layer.Close() + } + return BADFD +} + +func (f *UnionFile) Read(s []byte) (int, error) { + if f.Layer != nil { + n, err := f.Layer.Read(s) + if (err == nil || err == io.EOF) && f.Base != nil { + // advance the file position also in the base file, the next + // call may be a write at this position (or a seek with SEEK_CUR) + if _, seekErr := f.Base.Seek(int64(n), os.SEEK_CUR); seekErr != nil { + // only overwrite err in case the seek fails: we need to + // report an eventual io.EOF to the caller + err = seekErr + } + } + return n, err + } + if f.Base != nil { + return f.Base.Read(s) + } + return 0, BADFD +} + +func (f *UnionFile) ReadAt(s []byte, o int64) (int, error) { + if f.Layer != nil { + n, err := f.Layer.ReadAt(s, o) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o+int64(n), os.SEEK_SET) + } + return n, err + } + if f.Base != nil { + return f.Base.ReadAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Seek(o int64, w int) (pos int64, err error) { + if f.Layer != nil { + pos, err = f.Layer.Seek(o, w) + if (err == nil || err == io.EOF) && f.Base != nil { + _, err = f.Base.Seek(o, w) + } + return pos, err + } + if f.Base != nil { + return f.Base.Seek(o, w) + } + return 0, BADFD +} + +func (f *UnionFile) Write(s []byte) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.Write(s) + if err == nil && f.Base != nil { // hmm, do we have fixed size files where a write may hit the EOF mark? + _, err = f.Base.Write(s) + } + return n, err + } + if f.Base != nil { + return f.Base.Write(s) + } + return 0, BADFD +} + +func (f *UnionFile) WriteAt(s []byte, o int64) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteAt(s, o) + if err == nil && f.Base != nil { + _, err = f.Base.WriteAt(s, o) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteAt(s, o) + } + return 0, BADFD +} + +func (f *UnionFile) Name() string { + if f.Layer != nil { + return f.Layer.Name() + } + return f.Base.Name() +} + +// DirsMerger is how UnionFile weaves two directories together. +// It takes the FileInfo slices from the layer and the base and returns a +// single view. +type DirsMerger func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) + +var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) { + var files = make(map[string]os.FileInfo) + + for _, fi := range lofi { + files[fi.Name()] = fi + } + + for _, fi := range bofi { + if _, exists := files[fi.Name()]; !exists { + files[fi.Name()] = fi + } + } + + rfi := make([]os.FileInfo, len(files)) + + i := 0 + for _, fi := range files { + rfi[i] = fi + i++ + } + + return rfi, nil + +} + +// Readdir will weave the two directories together and +// return a single view of the overlayed directories +func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) { + var merge DirsMerger = f.Merger + if merge == nil { + merge = defaultUnionMergeDirsFn + } + + if f.off == 0 { + var lfi []os.FileInfo + if f.Layer != nil { + lfi, err = f.Layer.Readdir(-1) + if err != nil { + return nil, err + } + } + + var bfi []os.FileInfo + if f.Base != nil { + bfi, err = f.Base.Readdir(-1) + if err != nil { + return nil, err + } + + } + merged, err := merge(lfi, bfi) + if err != nil { + return nil, err + } + f.files = append(f.files, merged...) + } + if c == -1 { + return f.files[f.off:], nil + } + defer func() { f.off += c }() + return f.files[f.off:c], nil +} + +func (f *UnionFile) Readdirnames(c int) ([]string, error) { + rfi, err := f.Readdir(c) + if err != nil { + return nil, err + } + var names []string + for _, fi := range rfi { + names = append(names, fi.Name()) + } + return names, nil +} + +func (f *UnionFile) Stat() (os.FileInfo, error) { + if f.Layer != nil { + return f.Layer.Stat() + } + if f.Base != nil { + return f.Base.Stat() + } + return nil, BADFD +} + +func (f *UnionFile) Sync() (err error) { + if f.Layer != nil { + err = f.Layer.Sync() + if err == nil && f.Base != nil { + err = f.Base.Sync() + } + return err + } + if f.Base != nil { + return f.Base.Sync() + } + return BADFD +} + +func (f *UnionFile) Truncate(s int64) (err error) { + if f.Layer != nil { + err = f.Layer.Truncate(s) + if err == nil && f.Base != nil { + err = f.Base.Truncate(s) + } + return err + } + if f.Base != nil { + return f.Base.Truncate(s) + } + return BADFD +} + +func (f *UnionFile) WriteString(s string) (n int, err error) { + if f.Layer != nil { + n, err = f.Layer.WriteString(s) + if err == nil && f.Base != nil { + _, err = f.Base.WriteString(s) + } + return n, err + } + if f.Base != nil { + return f.Base.WriteString(s) + } + return 0, BADFD +} + +func copyToLayer(base Fs, layer Fs, name string) error { + bfh, err := base.Open(name) + if err != nil { + return err + } + defer bfh.Close() + + // First make sure the directory exists + exists, err := Exists(layer, filepath.Dir(name)) + if err != nil { + return err + } + if !exists { + err = layer.MkdirAll(filepath.Dir(name), 0777) // FIXME? + if err != nil { + return err + } + } + + // Create the file on the overlay + lfh, err := layer.Create(name) + if err != nil { + return err + } + n, err := io.Copy(lfh, bfh) + if err != nil { + // If anything fails, clean up the file + layer.Remove(name) + lfh.Close() + return err + } + + bfi, err := bfh.Stat() + if err != nil || bfi.Size() != n { + layer.Remove(name) + lfh.Close() + return syscall.EIO + } + + err = lfh.Close() + if err != nil { + layer.Remove(name) + lfh.Close() + return err + } + return layer.Chtimes(name, bfi.ModTime(), bfi.ModTime()) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/util.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/util.go new file mode 100755 index 0000000..4f253f4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/afero/util.go @@ -0,0 +1,330 @@ +// Copyright ©2015 Steve Francia +// Portions Copyright ©2015 The Hugo Authors +// Portions Copyright 2016-present Bjørn Erik Pedersen +// +// 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 afero + +import ( + "bytes" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "unicode" + + "golang.org/x/text/transform" + "golang.org/x/text/unicode/norm" +) + +// Filepath separator defined by os.Separator. +const FilePathSeparator = string(filepath.Separator) + +// Takes a reader and a path and writes the content +func (a Afero) WriteReader(path string, r io.Reader) (err error) { + return WriteReader(a.Fs, path, r) +} + +func WriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + if err != nil { + if err != os.ErrExist { + return err + } + } + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +// Same as WriteReader but checks to see if file/directory already exists. +func (a Afero) SafeWriteReader(path string, r io.Reader) (err error) { + return SafeWriteReader(a.Fs, path, r) +} + +func SafeWriteReader(fs Fs, path string, r io.Reader) (err error) { + dir, _ := filepath.Split(path) + ospath := filepath.FromSlash(dir) + + if ospath != "" { + err = fs.MkdirAll(ospath, 0777) // rwx, rw, r + if err != nil { + return + } + } + + exists, err := Exists(fs, path) + if err != nil { + return + } + if exists { + return fmt.Errorf("%v already exists", path) + } + + file, err := fs.Create(path) + if err != nil { + return + } + defer file.Close() + + _, err = io.Copy(file, r) + return +} + +func (a Afero) GetTempDir(subPath string) string { + return GetTempDir(a.Fs, subPath) +} + +// GetTempDir returns the default temp directory with trailing slash +// if subPath is not empty then it will be created recursively with mode 777 rwx rwx rwx +func GetTempDir(fs Fs, subPath string) string { + addSlash := func(p string) string { + if FilePathSeparator != p[len(p)-1:] { + p = p + FilePathSeparator + } + return p + } + dir := addSlash(os.TempDir()) + + if subPath != "" { + // preserve windows backslash :-( + if FilePathSeparator == "\\" { + subPath = strings.Replace(subPath, "\\", "____", -1) + } + dir = dir + UnicodeSanitize((subPath)) + if FilePathSeparator == "\\" { + dir = strings.Replace(dir, "____", "\\", -1) + } + + if exists, _ := Exists(fs, dir); exists { + return addSlash(dir) + } + + err := fs.MkdirAll(dir, 0777) + if err != nil { + panic(err) + } + dir = addSlash(dir) + } + return dir +} + +// Rewrite string to remove non-standard path characters +func UnicodeSanitize(s string) string { + source := []rune(s) + target := make([]rune, 0, len(source)) + + for _, r := range source { + if unicode.IsLetter(r) || + unicode.IsDigit(r) || + unicode.IsMark(r) || + r == '.' || + r == '/' || + r == '\\' || + r == '_' || + r == '-' || + r == '%' || + r == ' ' || + r == '#' { + target = append(target, r) + } + } + + return string(target) +} + +// Transform characters with accents into plain forms. +func NeuterAccents(s string) string { + t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) + result, _, _ := transform.String(t, string(s)) + + return result +} + +func isMn(r rune) bool { + return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks +} + +func (a Afero) FileContainsBytes(filename string, subslice []byte) (bool, error) { + return FileContainsBytes(a.Fs, filename, subslice) +} + +// Check if a file contains a specified byte slice. +func FileContainsBytes(fs Fs, filename string, subslice []byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslice), nil +} + +func (a Afero) FileContainsAnyBytes(filename string, subslices [][]byte) (bool, error) { + return FileContainsAnyBytes(a.Fs, filename, subslices) +} + +// Check if a file contains any of the specified byte slices. +func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, error) { + f, err := fs.Open(filename) + if err != nil { + return false, err + } + defer f.Close() + + return readerContainsAny(f, subslices...), nil +} + +// readerContains reports whether any of the subslices is within r. +func readerContainsAny(r io.Reader, subslices ...[]byte) bool { + + if r == nil || len(subslices) == 0 { + return false + } + + largestSlice := 0 + + for _, sl := range subslices { + if len(sl) > largestSlice { + largestSlice = len(sl) + } + } + + if largestSlice == 0 { + return false + } + + bufflen := largestSlice * 4 + halflen := bufflen / 2 + buff := make([]byte, bufflen) + var err error + var n, i int + + for { + i++ + if i == 1 { + n, err = io.ReadAtLeast(r, buff[:halflen], halflen) + } else { + if i != 2 { + // shift left to catch overlapping matches + copy(buff[:], buff[halflen:]) + } + n, err = io.ReadAtLeast(r, buff[halflen:], halflen) + } + + if n > 0 { + for _, sl := range subslices { + if bytes.Contains(buff, sl) { + return true + } + } + } + + if err != nil { + break + } + } + return false +} + +func (a Afero) DirExists(path string) (bool, error) { + return DirExists(a.Fs, path) +} + +// DirExists checks if a path exists and is a directory. +func DirExists(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err == nil && fi.IsDir() { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func (a Afero) IsDir(path string) (bool, error) { + return IsDir(a.Fs, path) +} + +// IsDir checks if a given path is a directory. +func IsDir(fs Fs, path string) (bool, error) { + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + return fi.IsDir(), nil +} + +func (a Afero) IsEmpty(path string) (bool, error) { + return IsEmpty(a.Fs, path) +} + +// IsEmpty checks if a given file or directory is empty. +func IsEmpty(fs Fs, path string) (bool, error) { + if b, _ := Exists(fs, path); !b { + return false, fmt.Errorf("%q path does not exist", path) + } + fi, err := fs.Stat(path) + if err != nil { + return false, err + } + if fi.IsDir() { + f, err := fs.Open(path) + if err != nil { + return false, err + } + defer f.Close() + list, err := f.Readdir(-1) + return len(list) == 0, nil + } + return fi.Size() == 0, nil +} + +func (a Afero) Exists(path string) (bool, error) { + return Exists(a.Fs, path) +} + +// Check if a file or directory exists. +func Exists(fs Fs, path string) (bool, error) { + _, err := fs.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func FullBaseFsPath(basePathFs *BasePathFs, relativePath string) string { + combinedPath := filepath.Join(basePathFs.path, relativePath) + if parent, ok := basePathFs.source.(*BasePathFs); ok { + return FullBaseFsPath(parent, combinedPath) + } + + return combinedPath +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.gitignore new file mode 100755 index 0000000..53053a8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.gitignore @@ -0,0 +1,25 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test + +*.bench diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.travis.yml new file mode 100755 index 0000000..4da9766 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/.travis.yml @@ -0,0 +1,14 @@ +language: go +sudo: required +go: + - 1.7.5 + - 1.8 + - tip +os: + - linux +matrix: + allow_failures: + - go: tip + fast_finish: true +script: + - make check diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/LICENSE new file mode 100755 index 0000000..4527efb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +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/skycoin/skycoin/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/Makefile new file mode 100755 index 0000000..7ccf893 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/Makefile @@ -0,0 +1,38 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +.PHONY: check fmt lint test test-race vet test-cover-html help +.DEFAULT_GOAL := help + +check: test-race fmt vet lint ## Run tests and linters + +test: ## Run tests + go test ./... + +test-race: ## Run tests with race detector + go test -race ./... + +fmt: ## Run gofmt linter + @for d in `go list` ; do \ + if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ + echo "^ improperly formatted go files" && echo && exit 1; \ + fi \ + done + +lint: ## Run golint linter + @for d in `go list` ; do \ + if [ "`golint $$d | tee /dev/stderr`" ]; then \ + echo "^ golint errors!" && echo && exit 1; \ + fi \ + done + +vet: ## Run go vet linter + @if [ "`go vet | tee /dev/stderr`" ]; then \ + echo "^ go vet errors!" && echo && exit 1; \ + fi + +test-cover-html: ## Generate test coverage report + go test -coverprofile=coverage.out -covermode=count + go tool cover -func=coverage.out + +help: + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/README.md new file mode 100755 index 0000000..e693939 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/README.md @@ -0,0 +1,75 @@ +cast +==== +[![GoDoc](https://godoc.org/github.com/spf13/cast?status.svg)](https://godoc.org/github.com/spf13/cast) +[![Build Status](https://api.travis-ci.org/spf13/cast.svg?branch=master)](https://travis-ci.org/spf13/cast) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cast)](https://goreportcard.com/report/github.com/spf13/cast) + +Easy and safe casting from one type to another in Go + +Don’t Panic! ... Cast + +## What is Cast? + +Cast is a library to convert between different go types in a consistent and easy way. + +Cast provides simple functions to easily convert a number to a string, an +interface into a bool, etc. Cast does this intelligently when an obvious +conversion is possible. It doesn’t make any attempts to guess what you meant, +for example you can only convert a string to an int when it is a string +representation of an int such as “8”. Cast was developed for use in +[Hugo](http://hugo.spf13.com), a website engine which uses YAML, TOML or JSON +for meta data. + +## Why use Cast? + +When working with dynamic data in Go you often need to cast or convert the data +from one type into another. Cast goes beyond just using type assertion (though +it uses that when possible) to provide a very straightforward and convenient +library. + +If you are working with interfaces to handle things like dynamic content +you’ll need an easy way to convert an interface into a given type. This +is the library for you. + +If you are taking in data from YAML, TOML or JSON or other formats which lack +full types, then Cast is the library for you. + +## Usage + +Cast provides a handful of To_____ methods. These methods will always return +the desired type. **If input is provided that will not convert to that type, the +0 or nil value for that type will be returned**. + +Cast also provides identical methods To_____E. These return the same result as +the To_____ methods, plus an additional error which tells you if it successfully +converted. Using these methods you can tell the difference between when the +input matched the zero value or when the conversion failed and the zero value +was returned. + +The following examples are merely a sample of what is available. Please review +the code for a complete set. + +### Example ‘ToString’: + + cast.ToString("mayonegg") // "mayonegg" + cast.ToString(8) // "8" + cast.ToString(8.31) // "8.31" + cast.ToString([]byte("one time")) // "one time" + cast.ToString(nil) // "" + + var foo interface{} = "one more time" + cast.ToString(foo) // "one more time" + + +### Example ‘ToInt’: + + cast.ToInt(8) // 8 + cast.ToInt(8.31) // 8 + cast.ToInt("8") // 8 + cast.ToInt(true) // 1 + cast.ToInt(false) // 0 + + var eight interface{} = 8 + cast.ToInt(eight) // 8 + cast.ToInt(nil) // 0 + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/cast.go new file mode 100755 index 0000000..8b8c208 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/cast.go @@ -0,0 +1,159 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Package cast provides easy and safe casting in Go. +package cast + +import "time" + +// ToBool casts an interface to a bool type. +func ToBool(i interface{}) bool { + v, _ := ToBoolE(i) + return v +} + +// ToTime casts an interface to a time.Time type. +func ToTime(i interface{}) time.Time { + v, _ := ToTimeE(i) + return v +} + +// ToDuration casts an interface to a time.Duration type. +func ToDuration(i interface{}) time.Duration { + v, _ := ToDurationE(i) + return v +} + +// ToFloat64 casts an interface to a float64 type. +func ToFloat64(i interface{}) float64 { + v, _ := ToFloat64E(i) + return v +} + +// ToFloat32 casts an interface to a float32 type. +func ToFloat32(i interface{}) float32 { + v, _ := ToFloat32E(i) + return v +} + +// ToInt64 casts an interface to an int64 type. +func ToInt64(i interface{}) int64 { + v, _ := ToInt64E(i) + return v +} + +// ToInt32 casts an interface to an int32 type. +func ToInt32(i interface{}) int32 { + v, _ := ToInt32E(i) + return v +} + +// ToInt16 casts an interface to an int16 type. +func ToInt16(i interface{}) int16 { + v, _ := ToInt16E(i) + return v +} + +// ToInt8 casts an interface to an int8 type. +func ToInt8(i interface{}) int8 { + v, _ := ToInt8E(i) + return v +} + +// ToInt casts an interface to an int type. +func ToInt(i interface{}) int { + v, _ := ToIntE(i) + return v +} + +// ToUint casts an interface to a uint type. +func ToUint(i interface{}) uint { + v, _ := ToUintE(i) + return v +} + +// ToUint64 casts an interface to a uint64 type. +func ToUint64(i interface{}) uint64 { + v, _ := ToUint64E(i) + return v +} + +// ToUint32 casts an interface to a uint32 type. +func ToUint32(i interface{}) uint32 { + v, _ := ToUint32E(i) + return v +} + +// ToUint16 casts an interface to a uint16 type. +func ToUint16(i interface{}) uint16 { + v, _ := ToUint16E(i) + return v +} + +// ToUint8 casts an interface to a uint8 type. +func ToUint8(i interface{}) uint8 { + v, _ := ToUint8E(i) + return v +} + +// ToString casts an interface to a string type. +func ToString(i interface{}) string { + v, _ := ToStringE(i) + return v +} + +// ToStringMapString casts an interface to a map[string]string type. +func ToStringMapString(i interface{}) map[string]string { + v, _ := ToStringMapStringE(i) + return v +} + +// ToStringMapStringSlice casts an interface to a map[string][]string type. +func ToStringMapStringSlice(i interface{}) map[string][]string { + v, _ := ToStringMapStringSliceE(i) + return v +} + +// ToStringMapBool casts an interface to a map[string]bool type. +func ToStringMapBool(i interface{}) map[string]bool { + v, _ := ToStringMapBoolE(i) + return v +} + +// ToStringMap casts an interface to a map[string]interface{} type. +func ToStringMap(i interface{}) map[string]interface{} { + v, _ := ToStringMapE(i) + return v +} + +// ToSlice casts an interface to a []interface{} type. +func ToSlice(i interface{}) []interface{} { + v, _ := ToSliceE(i) + return v +} + +// ToBoolSlice casts an interface to a []bool type. +func ToBoolSlice(i interface{}) []bool { + v, _ := ToBoolSliceE(i) + return v +} + +// ToStringSlice casts an interface to a []string type. +func ToStringSlice(i interface{}) []string { + v, _ := ToStringSliceE(i) + return v +} + +// ToIntSlice casts an interface to a []int type. +func ToIntSlice(i interface{}) []int { + v, _ := ToIntSliceE(i) + return v +} + +// ToDurationSlice casts an interface to a []time.Duration type. +func ToDurationSlice(i interface{}) []time.Duration { + v, _ := ToDurationSliceE(i) + return v +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/caste.go new file mode 100755 index 0000000..4fe1928 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/cast/caste.go @@ -0,0 +1,1166 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package cast + +import ( + "encoding/json" + "errors" + "fmt" + "html/template" + "reflect" + "strconv" + "strings" + "time" +) + +var errNegativeNotAllowed = errors.New("unable to cast negative value") + +// ToTimeE casts an interface to a time.Time type. +func ToTimeE(i interface{}) (tim time.Time, err error) { + i = indirect(i) + + switch v := i.(type) { + case time.Time: + return v, nil + case string: + return StringToDate(v) + case int: + return time.Unix(int64(v), 0), nil + case int64: + return time.Unix(v, 0), nil + case int32: + return time.Unix(int64(v), 0), nil + case uint: + return time.Unix(int64(v), 0), nil + case uint64: + return time.Unix(int64(v), 0), nil + case uint32: + return time.Unix(int64(v), 0), nil + default: + return time.Time{}, fmt.Errorf("unable to cast %#v of type %T to Time", i, i) + } +} + +// ToDurationE casts an interface to a time.Duration type. +func ToDurationE(i interface{}) (d time.Duration, err error) { + i = indirect(i) + + switch s := i.(type) { + case time.Duration: + return s, nil + case int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8: + d = time.Duration(ToInt64(s)) + return + case float32, float64: + d = time.Duration(ToFloat64(s)) + return + case string: + if strings.ContainsAny(s, "nsuµmh") { + d, err = time.ParseDuration(s) + } else { + d, err = time.ParseDuration(s + "ns") + } + return + default: + err = fmt.Errorf("unable to cast %#v of type %T to Duration", i, i) + return + } +} + +// ToBoolE casts an interface to a bool type. +func ToBoolE(i interface{}) (bool, error) { + i = indirect(i) + + switch b := i.(type) { + case bool: + return b, nil + case nil: + return false, nil + case int: + if i.(int) != 0 { + return true, nil + } + return false, nil + case string: + return strconv.ParseBool(i.(string)) + default: + return false, fmt.Errorf("unable to cast %#v of type %T to bool", i, i) + } +} + +// ToFloat64E casts an interface to a float64 type. +func ToFloat64E(i interface{}) (float64, error) { + i = indirect(i) + + switch s := i.(type) { + case float64: + return s, nil + case float32: + return float64(s), nil + case int: + return float64(s), nil + case int64: + return float64(s), nil + case int32: + return float64(s), nil + case int16: + return float64(s), nil + case int8: + return float64(s), nil + case uint: + return float64(s), nil + case uint64: + return float64(s), nil + case uint32: + return float64(s), nil + case uint16: + return float64(s), nil + case uint8: + return float64(s), nil + case string: + v, err := strconv.ParseFloat(s, 64) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i) + } +} + +// ToFloat32E casts an interface to a float32 type. +func ToFloat32E(i interface{}) (float32, error) { + i = indirect(i) + + switch s := i.(type) { + case float64: + return float32(s), nil + case float32: + return s, nil + case int: + return float32(s), nil + case int64: + return float32(s), nil + case int32: + return float32(s), nil + case int16: + return float32(s), nil + case int8: + return float32(s), nil + case uint: + return float32(s), nil + case uint64: + return float32(s), nil + case uint32: + return float32(s), nil + case uint16: + return float32(s), nil + case uint8: + return float32(s), nil + case string: + v, err := strconv.ParseFloat(s, 32) + if err == nil { + return float32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i) + } +} + +// ToInt64E casts an interface to an int64 type. +func ToInt64E(i interface{}) (int64, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int64(s), nil + case int64: + return s, nil + case int32: + return int64(s), nil + case int16: + return int64(s), nil + case int8: + return int64(s), nil + case uint: + return int64(s), nil + case uint64: + return int64(s), nil + case uint32: + return int64(s), nil + case uint16: + return int64(s), nil + case uint8: + return int64(s), nil + case float64: + return int64(s), nil + case float32: + return int64(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i) + } +} + +// ToInt32E casts an interface to an int32 type. +func ToInt32E(i interface{}) (int32, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int32(s), nil + case int64: + return int32(s), nil + case int32: + return s, nil + case int16: + return int32(s), nil + case int8: + return int32(s), nil + case uint: + return int32(s), nil + case uint64: + return int32(s), nil + case uint32: + return int32(s), nil + case uint16: + return int32(s), nil + case uint8: + return int32(s), nil + case float64: + return int32(s), nil + case float32: + return int32(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i) + } +} + +// ToInt16E casts an interface to an int16 type. +func ToInt16E(i interface{}) (int16, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int16(s), nil + case int64: + return int16(s), nil + case int32: + return int16(s), nil + case int16: + return s, nil + case int8: + return int16(s), nil + case uint: + return int16(s), nil + case uint64: + return int16(s), nil + case uint32: + return int16(s), nil + case uint16: + return int16(s), nil + case uint8: + return int16(s), nil + case float64: + return int16(s), nil + case float32: + return int16(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i) + } +} + +// ToInt8E casts an interface to an int8 type. +func ToInt8E(i interface{}) (int8, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return int8(s), nil + case int64: + return int8(s), nil + case int32: + return int8(s), nil + case int16: + return int8(s), nil + case int8: + return s, nil + case uint: + return int8(s), nil + case uint64: + return int8(s), nil + case uint32: + return int8(s), nil + case uint16: + return int8(s), nil + case uint8: + return int8(s), nil + case float64: + return int8(s), nil + case float32: + return int8(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i) + } +} + +// ToIntE casts an interface to an int type. +func ToIntE(i interface{}) (int, error) { + i = indirect(i) + + switch s := i.(type) { + case int: + return s, nil + case int64: + return int(s), nil + case int32: + return int(s), nil + case int16: + return int(s), nil + case int8: + return int(s), nil + case uint: + return int(s), nil + case uint64: + return int(s), nil + case uint32: + return int(s), nil + case uint16: + return int(s), nil + case uint8: + return int(s), nil + case float64: + return int(s), nil + case float32: + return int(s), nil + case string: + v, err := strconv.ParseInt(s, 0, 0) + if err == nil { + return int(v), nil + } + return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i) + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i) + } +} + +// ToUintE casts an interface to a uint type. +func ToUintE(i interface{}) (uint, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 0) + if err == nil { + return uint(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case uint: + return s, nil + case uint64: + return uint(s), nil + case uint32: + return uint(s), nil + case uint16: + return uint(s), nil + case uint8: + return uint(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint", i, i) + } +} + +// ToUint64E casts an interface to a uint64 type. +func ToUint64E(i interface{}) (uint64, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 64) + if err == nil { + return v, nil + } + return 0, fmt.Errorf("unable to cast %#v to uint64: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case uint: + return uint64(s), nil + case uint64: + return s, nil + case uint32: + return uint64(s), nil + case uint16: + return uint64(s), nil + case uint8: + return uint64(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint64(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) + } +} + +// ToUint32E casts an interface to a uint32 type. +func ToUint32E(i interface{}) (uint32, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 32) + if err == nil { + return uint32(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint32: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case uint: + return uint32(s), nil + case uint64: + return uint32(s), nil + case uint32: + return s, nil + case uint16: + return uint32(s), nil + case uint8: + return uint32(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint32(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint32", i, i) + } +} + +// ToUint16E casts an interface to a uint16 type. +func ToUint16E(i interface{}) (uint16, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 16) + if err == nil { + return uint16(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint16: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case uint: + return uint16(s), nil + case uint64: + return uint16(s), nil + case uint32: + return uint16(s), nil + case uint16: + return s, nil + case uint8: + return uint16(s), nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint16(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint16", i, i) + } +} + +// ToUint8E casts an interface to a uint type. +func ToUint8E(i interface{}) (uint8, error) { + i = indirect(i) + + switch s := i.(type) { + case string: + v, err := strconv.ParseUint(s, 0, 8) + if err == nil { + return uint8(v), nil + } + return 0, fmt.Errorf("unable to cast %#v to uint8: %s", i, err) + case int: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int16: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case int8: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case uint: + return uint8(s), nil + case uint64: + return uint8(s), nil + case uint32: + return uint8(s), nil + case uint16: + return uint8(s), nil + case uint8: + return s, nil + case float64: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case float32: + if s < 0 { + return 0, errNegativeNotAllowed + } + return uint8(s), nil + case bool: + if s { + return 1, nil + } + return 0, nil + case nil: + return 0, nil + default: + return 0, fmt.Errorf("unable to cast %#v of type %T to uint8", i, i) + } +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirect returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil). +func indirect(a interface{}) interface{} { + if a == nil { + return nil + } + if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr { + // Avoid creating a reflect.Value if it's not a pointer. + return a + } + v := reflect.ValueOf(a) + for v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// From html/template/content.go +// Copyright 2011 The Go Authors. All rights reserved. +// indirectToStringerOrError returns the value, after dereferencing as many times +// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer +// or error, +func indirectToStringerOrError(a interface{}) interface{} { + if a == nil { + return nil + } + + var errorType = reflect.TypeOf((*error)(nil)).Elem() + var fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem() + + v := reflect.ValueOf(a) + for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + return v.Interface() +} + +// ToStringE casts an interface to a string type. +func ToStringE(i interface{}) (string, error) { + i = indirectToStringerOrError(i) + + switch s := i.(type) { + case string: + return s, nil + case bool: + return strconv.FormatBool(s), nil + case float64: + return strconv.FormatFloat(s, 'f', -1, 64), nil + case float32: + return strconv.FormatFloat(float64(s), 'f', -1, 32), nil + case int: + return strconv.Itoa(s), nil + case int64: + return strconv.FormatInt(s, 10), nil + case int32: + return strconv.Itoa(int(s)), nil + case int16: + return strconv.FormatInt(int64(s), 10), nil + case int8: + return strconv.FormatInt(int64(s), 10), nil + case uint: + return strconv.FormatInt(int64(s), 10), nil + case uint64: + return strconv.FormatInt(int64(s), 10), nil + case uint32: + return strconv.FormatInt(int64(s), 10), nil + case uint16: + return strconv.FormatInt(int64(s), 10), nil + case uint8: + return strconv.FormatInt(int64(s), 10), nil + case []byte: + return string(s), nil + case template.HTML: + return string(s), nil + case template.URL: + return string(s), nil + case template.JS: + return string(s), nil + case template.CSS: + return string(s), nil + case template.HTMLAttr: + return string(s), nil + case nil: + return "", nil + case fmt.Stringer: + return s.String(), nil + case error: + return s.Error(), nil + default: + return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i) + } +} + +// ToStringMapStringE casts an interface to a map[string]string type. +func ToStringMapStringE(i interface{}) (map[string]string, error) { + var m = map[string]string{} + + switch v := i.(type) { + case map[string]string: + return v, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToString(val) + } + return m, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]string", i, i) + } +} + +// ToStringMapStringSliceE casts an interface to a map[string][]string type. +func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) { + var m = map[string][]string{} + + switch v := i.(type) { + case map[string][]string: + return v, nil + case map[string][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[string]string: + for k, val := range v { + m[ToString(k)] = []string{val} + } + case map[string]interface{}: + for k, val := range v { + switch vt := val.(type) { + case []interface{}: + m[ToString(k)] = ToStringSlice(vt) + case []string: + m[ToString(k)] = vt + default: + m[ToString(k)] = []string{ToString(val)} + } + } + return m, nil + case map[interface{}][]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]string: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}][]interface{}: + for k, val := range v { + m[ToString(k)] = ToStringSlice(val) + } + return m, nil + case map[interface{}]interface{}: + for k, val := range v { + key, err := ToStringE(k) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + value, err := ToStringSliceE(val) + if err != nil { + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + m[key] = value + } + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i) + } + return m, nil +} + +// ToStringMapBoolE casts an interface to a map[string]bool type. +func ToStringMapBoolE(i interface{}) (map[string]bool, error) { + var m = map[string]bool{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]interface{}: + for k, val := range v { + m[ToString(k)] = ToBool(val) + } + return m, nil + case map[string]bool: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]bool", i, i) + } +} + +// ToStringMapE casts an interface to a map[string]interface{} type. +func ToStringMapE(i interface{}) (map[string]interface{}, error) { + var m = map[string]interface{}{} + + switch v := i.(type) { + case map[interface{}]interface{}: + for k, val := range v { + m[ToString(k)] = val + } + return m, nil + case map[string]interface{}: + return v, nil + case string: + err := jsonStringToObject(v, &m) + return m, err + default: + return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i) + } +} + +// ToSliceE casts an interface to a []interface{} type. +func ToSliceE(i interface{}) ([]interface{}, error) { + var s []interface{} + + switch v := i.(type) { + case []interface{}: + return append(s, v...), nil + case []map[string]interface{}: + for _, u := range v { + s = append(s, u) + } + return s, nil + default: + return s, fmt.Errorf("unable to cast %#v of type %T to []interface{}", i, i) + } +} + +// ToBoolSliceE casts an interface to a []bool type. +func ToBoolSliceE(i interface{}) ([]bool, error) { + if i == nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + + switch v := i.(type) { + case []bool: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]bool, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToBoolE(s.Index(j).Interface()) + if err != nil { + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } + a[j] = val + } + return a, nil + default: + return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i) + } +} + +// ToStringSliceE casts an interface to a []string type. +func ToStringSliceE(i interface{}) ([]string, error) { + var a []string + + switch v := i.(type) { + case []interface{}: + for _, u := range v { + a = append(a, ToString(u)) + } + return a, nil + case []string: + return v, nil + case string: + return strings.Fields(v), nil + case interface{}: + str, err := ToStringE(v) + if err != nil { + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } + return []string{str}, nil + default: + return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i) + } +} + +// ToIntSliceE casts an interface to a []int type. +func ToIntSliceE(i interface{}) ([]int, error) { + if i == nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + + switch v := i.(type) { + case []int: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]int, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToIntE(s.Index(j).Interface()) + if err != nil { + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } + a[j] = val + } + return a, nil + default: + return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i) + } +} + +// ToDurationSliceE casts an interface to a []time.Duration type. +func ToDurationSliceE(i interface{}) ([]time.Duration, error) { + if i == nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + + switch v := i.(type) { + case []time.Duration: + return v, nil + } + + kind := reflect.TypeOf(i).Kind() + switch kind { + case reflect.Slice, reflect.Array: + s := reflect.ValueOf(i) + a := make([]time.Duration, s.Len()) + for j := 0; j < s.Len(); j++ { + val, err := ToDurationE(s.Index(j).Interface()) + if err != nil { + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } + a[j] = val + } + return a, nil + default: + return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i) + } +} + +// StringToDate attempts to parse a string into a time.Time type using a +// predefined list of formats. If no suitable format is found, an error is +// returned. +func StringToDate(s string) (time.Time, error) { + return parseDateWith(s, []string{ + time.RFC3339, + "2006-01-02T15:04:05", // iso8601 without timezone + time.RFC1123Z, + time.RFC1123, + time.RFC822Z, + time.RFC822, + time.RFC850, + time.ANSIC, + time.UnixDate, + time.RubyDate, + "2006-01-02 15:04:05.999999999 -0700 MST", // Time.String() + "2006-01-02", + "02 Jan 2006", + "2006-01-02 15:04:05 -07:00", + "2006-01-02 15:04:05 -0700", + "2006-01-02 15:04:05Z07:00", // RFC3339 without T + "2006-01-02 15:04:05", + time.Kitchen, + time.Stamp, + time.StampMilli, + time.StampMicro, + time.StampNano, + }) +} + +func parseDateWith(s string, dates []string) (d time.Time, e error) { + for _, dateType := range dates { + if d, e = time.Parse(dateType, s); e == nil { + return + } + } + return d, fmt.Errorf("unable to parse date: %s", s) +} + +// jsonStringToObject attempts to unmarshall a string as JSON into +// the object passed as pointer. +func jsonStringToObject(s string, v interface{}) error { + data := []byte(s) + return json.Unmarshal(data, v) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore new file mode 100755 index 0000000..0026861 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/.gitignore @@ -0,0 +1,22 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE new file mode 100755 index 0000000..4527efb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +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/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md new file mode 100755 index 0000000..d8cfd27 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/README.md @@ -0,0 +1,148 @@ +jWalterWeatherman +================= + +Seamless printing to the terminal (stdout) and logging to a io.Writer +(file) that’s as easy to use as fmt.Println. + +![and_that__s_why_you_always_leave_a_note_by_jonnyetc-d57q7um](https://cloud.githubusercontent.com/assets/173412/11002937/ccd01654-847d-11e5-828e-12ebaf582eaf.jpg) +Graphic by [JonnyEtc](http://jonnyetc.deviantart.com/art/And-That-s-Why-You-Always-Leave-a-Note-315311422) + +JWW is primarily a wrapper around the excellent standard log library. It +provides a few advantages over using the standard log library alone. + +1. Ready to go out of the box. +2. One library for both printing to the terminal and logging (to files). +3. Really easy to log to either a temp file or a file you specify. + + +I really wanted a very straightforward library that could seamlessly do +the following things. + +1. Replace all the println, printf, etc statements thought my code with + something more useful +2. Allow the user to easily control what levels are printed to stdout +3. Allow the user to easily control what levels are logged +4. Provide an easy mechanism (like fmt.Println) to print info to the user + which can be easily logged as well +5. Due to 2 & 3 provide easy verbose mode for output and logs +6. Not have any unnecessary initialization cruft. Just use it. + +# Usage + +## Step 1. Use it +Put calls throughout your source based on type of feedback. +No initialization or setup needs to happen. Just start calling things. + +Available Loggers are: + + * TRACE + * DEBUG + * INFO + * WARN + * ERROR + * CRITICAL + * FATAL + +These each are loggers based on the log standard library and follow the +standard usage. Eg. + +```go + import ( + jww "github.com/spf13/jwalterweatherman" + ) + + ... + + if err != nil { + + // This is a pretty serious error and the user should know about + // it. It will be printed to the terminal as well as logged under the + // default thresholds. + + jww.ERROR.Println(err) + } + + if err2 != nil { + // This error isn’t going to materially change the behavior of the + // application, but it’s something that may not be what the user + // expects. Under the default thresholds, Warn will be logged, but + // not printed to the terminal. + + jww.WARN.Println(err2) + } + + // Information that’s relevant to what’s happening, but not very + // important for the user. Under the default thresholds this will be + // discarded. + + jww.INFO.Printf("information %q", response) + +``` + +NOTE: You can also use the library in a non-global setting by creating an instance of a Notebook: + +```go +notepad = jww.NewNotepad(jww.LevelInfo, jww.LevelTrace, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime) +notepad.WARN.Println("Some warning"") +``` + +_Why 7 levels?_ + +Maybe you think that 7 levels are too much for any application... and you +are probably correct. Just because there are seven levels doesn’t mean +that you should be using all 7 levels. Pick the right set for your needs. +Remember they only have to mean something to your project. + +## Step 2. Optionally configure JWW + +Under the default thresholds : + + * Debug, Trace & Info goto /dev/null + * Warn and above is logged (when a log file/io.Writer is provided) + * Error and above is printed to the terminal (stdout) + +### Changing the thresholds + +The threshold can be changed at any time, but will only affect calls that +execute after the change was made. + +This is very useful if your application has a verbose mode. Of course you +can decide what verbose means to you or even have multiple levels of +verbosity. + + +```go + import ( + jww "github.com/spf13/jwalterweatherman" + ) + + if Verbose { + jww.SetLogThreshold(jww.LevelTrace) + jww.SetStdoutThreshold(jww.LevelInfo) + } +``` + +Note that JWW's own internal output uses log levels as well, so set the log +level before making any other calls if you want to see what it's up to. + + +### Setting a log file + +JWW can log to any `io.Writer`: + + +```go + + jww.SetLogOutput(customWriter) + +``` + + +# More information + +This is an early release. I’ve been using it for a while and this is the +third interface I’ve tried. I like this one pretty well, but no guarantees +that it won’t change a bit. + +I wrote this for use in [hugo](https://gohugo.io). If you are looking +for a static website engine that’s super fast please checkout Hugo. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go new file mode 100755 index 0000000..bcb7634 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/default_notepad.go @@ -0,0 +1,113 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "io" + "io/ioutil" + "log" + "os" +) + +var ( + TRACE *log.Logger + DEBUG *log.Logger + INFO *log.Logger + WARN *log.Logger + ERROR *log.Logger + CRITICAL *log.Logger + FATAL *log.Logger + + LOG *log.Logger + FEEDBACK *Feedback + + defaultNotepad *Notepad +) + +func reloadDefaultNotepad() { + TRACE = defaultNotepad.TRACE + DEBUG = defaultNotepad.DEBUG + INFO = defaultNotepad.INFO + WARN = defaultNotepad.WARN + ERROR = defaultNotepad.ERROR + CRITICAL = defaultNotepad.CRITICAL + FATAL = defaultNotepad.FATAL + + LOG = defaultNotepad.LOG + FEEDBACK = defaultNotepad.FEEDBACK +} + +func init() { + defaultNotepad = NewNotepad(LevelError, LevelWarn, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime) + reloadDefaultNotepad() +} + +// SetLogThreshold set the log threshold for the default notepad. Trace by default. +func SetLogThreshold(threshold Threshold) { + defaultNotepad.SetLogThreshold(threshold) + reloadDefaultNotepad() +} + +// SetLogOutput set the log output for the default notepad. Discarded by default. +func SetLogOutput(handle io.Writer) { + defaultNotepad.SetLogOutput(handle) + reloadDefaultNotepad() +} + +// SetStdoutThreshold set the standard output threshold for the default notepad. +// Info by default. +func SetStdoutThreshold(threshold Threshold) { + defaultNotepad.SetStdoutThreshold(threshold) + reloadDefaultNotepad() +} + +// SetPrefix set the prefix for the default logger. Empty by default. +func SetPrefix(prefix string) { + defaultNotepad.SetPrefix(prefix) + reloadDefaultNotepad() +} + +// SetFlags set the flags for the default logger. "log.Ldate | log.Ltime" by default. +func SetFlags(flags int) { + defaultNotepad.SetFlags(flags) + reloadDefaultNotepad() +} + +// Level returns the current global log threshold. +func LogThreshold() Threshold { + return defaultNotepad.logThreshold +} + +// Level returns the current global output threshold. +func StdoutThreshold() Threshold { + return defaultNotepad.stdoutThreshold +} + +// GetStdoutThreshold returns the defined Treshold for the log logger. +func GetLogThreshold() Threshold { + return defaultNotepad.GetLogThreshold() +} + +// GetStdoutThreshold returns the Treshold for the stdout logger. +func GetStdoutThreshold() Threshold { + return defaultNotepad.GetStdoutThreshold() +} + +// LogCountForLevel returns the number of log invocations for a given threshold. +func LogCountForLevel(l Threshold) uint64 { + return defaultNotepad.LogCountForLevel(l) +} + +// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations +// greater than or equal to a given threshold. +func LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { + return defaultNotepad.LogCountForLevelsGreaterThanorEqualTo(threshold) +} + +// ResetLogCounters resets the invocation counters for all levels. +func ResetLogCounters() { + defaultNotepad.ResetLogCounters() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go new file mode 100755 index 0000000..11423ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/log_counter.go @@ -0,0 +1,55 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "sync/atomic" +) + +type logCounter struct { + counter uint64 +} + +func (c *logCounter) incr() { + atomic.AddUint64(&c.counter, 1) +} + +func (c *logCounter) resetCounter() { + atomic.StoreUint64(&c.counter, 0) +} + +func (c *logCounter) getCount() uint64 { + return atomic.LoadUint64(&c.counter) +} + +func (c *logCounter) Write(p []byte) (n int, err error) { + c.incr() + return len(p), nil +} + +// LogCountForLevel returns the number of log invocations for a given threshold. +func (n *Notepad) LogCountForLevel(l Threshold) uint64 { + return n.logCounters[l].getCount() +} + +// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations +// greater than or equal to a given threshold. +func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { + var cnt uint64 + + for i := int(threshold); i < len(n.logCounters); i++ { + cnt += n.LogCountForLevel(Threshold(i)) + } + + return cnt +} + +// ResetLogCounters resets the invocation counters for all levels. +func (n *Notepad) ResetLogCounters() { + for _, np := range n.logCounters { + np.resetCounter() + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go new file mode 100755 index 0000000..ae5aaf7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/jwalterweatherman/notepad.go @@ -0,0 +1,194 @@ +// Copyright © 2016 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +package jwalterweatherman + +import ( + "fmt" + "io" + "log" +) + +type Threshold int + +func (t Threshold) String() string { + return prefixes[t] +} + +const ( + LevelTrace Threshold = iota + LevelDebug + LevelInfo + LevelWarn + LevelError + LevelCritical + LevelFatal +) + +var prefixes map[Threshold]string = map[Threshold]string{ + LevelTrace: "TRACE", + LevelDebug: "DEBUG", + LevelInfo: "INFO", + LevelWarn: "WARN", + LevelError: "ERROR", + LevelCritical: "CRITICAL", + LevelFatal: "FATAL", +} + +// Notepad is where you leave a note! +type Notepad struct { + TRACE *log.Logger + DEBUG *log.Logger + INFO *log.Logger + WARN *log.Logger + ERROR *log.Logger + CRITICAL *log.Logger + FATAL *log.Logger + + LOG *log.Logger + FEEDBACK *Feedback + + loggers [7]**log.Logger + logHandle io.Writer + outHandle io.Writer + logThreshold Threshold + stdoutThreshold Threshold + prefix string + flags int + + // One per Threshold + logCounters [7]*logCounter +} + +// NewNotepad create a new notepad. +func NewNotepad(outThreshold Threshold, logThreshold Threshold, outHandle, logHandle io.Writer, prefix string, flags int) *Notepad { + n := &Notepad{} + + n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL} + n.outHandle = outHandle + n.logHandle = logHandle + n.stdoutThreshold = outThreshold + n.logThreshold = logThreshold + + if len(prefix) != 0 { + n.prefix = "[" + prefix + "] " + } else { + n.prefix = "" + } + + n.flags = flags + + n.LOG = log.New(n.logHandle, + "LOG: ", + n.flags) + n.FEEDBACK = &Feedback{out: log.New(outHandle, "", 0), log: n.LOG} + + n.init() + return n +} + +// init creates the loggers for each level depending on the notepad thresholds. +func (n *Notepad) init() { + logAndOut := io.MultiWriter(n.outHandle, n.logHandle) + + for t, logger := range n.loggers { + threshold := Threshold(t) + counter := &logCounter{} + n.logCounters[t] = counter + prefix := n.prefix + threshold.String() + " " + + switch { + case threshold >= n.logThreshold && threshold >= n.stdoutThreshold: + *logger = log.New(io.MultiWriter(counter, logAndOut), prefix, n.flags) + + case threshold >= n.logThreshold: + *logger = log.New(io.MultiWriter(counter, n.logHandle), prefix, n.flags) + + case threshold >= n.stdoutThreshold: + *logger = log.New(io.MultiWriter(counter, n.outHandle), prefix, n.flags) + + default: + // counter doesn't care about prefix and flags, so don't use them + // for performance. + *logger = log.New(counter, "", 0) + } + } +} + +// SetLogThreshold changes the threshold above which messages are written to the +// log file. +func (n *Notepad) SetLogThreshold(threshold Threshold) { + n.logThreshold = threshold + n.init() +} + +// SetLogOutput changes the file where log messages are written. +func (n *Notepad) SetLogOutput(handle io.Writer) { + n.logHandle = handle + n.init() +} + +// GetStdoutThreshold returns the defined Treshold for the log logger. +func (n *Notepad) GetLogThreshold() Threshold { + return n.logThreshold +} + +// SetStdoutThreshold changes the threshold above which messages are written to the +// standard output. +func (n *Notepad) SetStdoutThreshold(threshold Threshold) { + n.stdoutThreshold = threshold + n.init() +} + +// GetStdoutThreshold returns the Treshold for the stdout logger. +func (n *Notepad) GetStdoutThreshold() Threshold { + return n.stdoutThreshold +} + +// SetPrefix changes the prefix used by the notepad. Prefixes are displayed between +// brackets at the beginning of the line. An empty prefix won't be displayed at all. +func (n *Notepad) SetPrefix(prefix string) { + if len(prefix) != 0 { + n.prefix = "[" + prefix + "] " + } else { + n.prefix = "" + } + n.init() +} + +// SetFlags choose which flags the logger will display (after prefix and message +// level). See the package log for more informations on this. +func (n *Notepad) SetFlags(flags int) { + n.flags = flags + n.init() +} + +// Feedback writes plainly to the outHandle while +// logging with the standard extra information (date, file, etc). +type Feedback struct { + out *log.Logger + log *log.Logger +} + +func (fb *Feedback) Println(v ...interface{}) { + fb.output(fmt.Sprintln(v...)) +} + +func (fb *Feedback) Printf(format string, v ...interface{}) { + fb.output(fmt.Sprintf(format, v...)) +} + +func (fb *Feedback) Print(v ...interface{}) { + fb.output(fmt.Sprint(v...)) +} + +func (fb *Feedback) output(s string) { + if fb.out != nil { + fb.out.Output(2, s) + } + if fb.log != nil { + fb.log.Output(2, s) + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.gitignore new file mode 100755 index 0000000..c3da290 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.gitignore @@ -0,0 +1,2 @@ +.idea/* + diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.travis.yml new file mode 100755 index 0000000..f8a63b3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/.travis.yml @@ -0,0 +1,21 @@ +sudo: false + +language: go + +go: + - 1.7.3 + - 1.8.1 + - tip + +matrix: + allow_failures: + - go: tip + +install: + - go get github.com/golang/lint/golint + - export PATH=$GOPATH/bin:$PATH + - go install ./... + +script: + - verify/all.sh -v + - go test ./... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/LICENSE new file mode 100755 index 0000000..63ed1cf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2012 Alex Ogier. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/README.md new file mode 100755 index 0000000..b052414 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/README.md @@ -0,0 +1,296 @@ +[![Build Status](https://travis-ci.org/spf13/pflag.svg?branch=master)](https://travis-ci.org/spf13/pflag) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/pflag)](https://goreportcard.com/report/github.com/spf13/pflag) +[![GoDoc](https://godoc.org/github.com/spf13/pflag?status.svg)](https://godoc.org/github.com/spf13/pflag) + +## Description + +pflag is a drop-in replacement for Go's flag package, implementing +POSIX/GNU-style --flags. + +pflag is compatible with the [GNU extensions to the POSIX recommendations +for command-line options][1]. For a more precise description, see the +"Command-line flag syntax" section below. + +[1]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html + +pflag is available under the same style of BSD license as the Go language, +which can be found in the LICENSE file. + +## Installation + +pflag is available using the standard `go get` command. + +Install by running: + + go get github.com/spf13/pflag + +Run tests by running: + + go test github.com/spf13/pflag + +## Usage + +pflag is a drop-in replacement of Go's native flag package. If you import +pflag under the name "flag" then all code should continue to function +with no changes. + +``` go +import flag "github.com/spf13/pflag" +``` + +There is one exception to this: if you directly instantiate the Flag struct +there is one more field "Shorthand" that you will need to set. +Most code never instantiates this struct directly, and instead uses +functions such as String(), BoolVar(), and Var(), and is therefore +unaffected. + +Define flags using flag.String(), Bool(), Int(), etc. + +This declares an integer flag, -flagname, stored in the pointer ip, with type *int. + +``` go +var ip *int = flag.Int("flagname", 1234, "help message for flagname") +``` + +If you like, you can bind the flag to a variable using the Var() functions. + +``` go +var flagvar int +func init() { + flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") +} +``` + +Or you can create custom flags that satisfy the Value interface (with +pointer receivers) and couple them to flag parsing by + +``` go +flag.Var(&flagVal, "name", "help message for flagname") +``` + +For such flags, the default value is just the initial value of the variable. + +After all flags are defined, call + +``` go +flag.Parse() +``` + +to parse the command line into the defined flags. + +Flags may then be used directly. If you're using the flags themselves, +they are all pointers; if you bind to variables, they're values. + +``` go +fmt.Println("ip has value ", *ip) +fmt.Println("flagvar has value ", flagvar) +``` + +There are helpers function to get values later if you have the FlagSet but +it was difficult to keep up with all of the flag pointers in your code. +If you have a pflag.FlagSet with a flag called 'flagname' of type int you +can use GetInt() to get the int value. But notice that 'flagname' must exist +and it must be an int. GetString("flagname") will fail. + +``` go +i, err := flagset.GetInt("flagname") +``` + +After parsing, the arguments after the flag are available as the +slice flag.Args() or individually as flag.Arg(i). +The arguments are indexed from 0 through flag.NArg()-1. + +The pflag package also defines some new functions that are not in flag, +that give one-letter shorthands for flags. You can use these by appending +'P' to the name of any function that defines a flag. + +``` go +var ip = flag.IntP("flagname", "f", 1234, "help message") +var flagvar bool +func init() { + flag.BoolVarP(&flagvar, "boolname", "b", true, "help message") +} +flag.VarP(&flagVal, "varname", "v", "help message") +``` + +Shorthand letters can be used with single dashes on the command line. +Boolean shorthand flags can be combined with other shorthand flags. + +The default set of command-line flags is controlled by +top-level functions. The FlagSet type allows one to define +independent sets of flags, such as to implement subcommands +in a command-line interface. The methods of FlagSet are +analogous to the top-level functions for the command-line +flag set. + +## Setting no option default values for flags + +After you create a flag it is possible to set the pflag.NoOptDefVal for +the given flag. Doing this changes the meaning of the flag slightly. If +a flag has a NoOptDefVal and the flag is set on the command line without +an option the flag will be set to the NoOptDefVal. For example given: + +``` go +var ip = flag.IntP("flagname", "f", 1234, "help message") +flag.Lookup("flagname").NoOptDefVal = "4321" +``` + +Would result in something like + +| Parsed Arguments | Resulting Value | +| ------------- | ------------- | +| --flagname=1357 | ip=1357 | +| --flagname | ip=4321 | +| [nothing] | ip=1234 | + +## Command line flag syntax + +``` +--flag // boolean flags, or flags with no option default values +--flag x // only on flags without a default value +--flag=x +``` + +Unlike the flag package, a single dash before an option means something +different than a double dash. Single dashes signify a series of shorthand +letters for flags. All but the last shorthand letter must be boolean flags +or a flag with a default value + +``` +// boolean or flags where the 'no option default value' is set +-f +-f=true +-abc +but +-b true is INVALID + +// non-boolean and flags without a 'no option default value' +-n 1234 +-n=1234 +-n1234 + +// mixed +-abcs "hello" +-absd="hello" +-abcs1234 +``` + +Flag parsing stops after the terminator "--". Unlike the flag package, +flags can be interspersed with arguments anywhere on the command line +before this terminator. + +Integer flags accept 1234, 0664, 0x1234 and may be negative. +Boolean flags (in their long form) accept 1, 0, t, f, true, false, +TRUE, FALSE, True, False. +Duration flags accept any input valid for time.ParseDuration. + +## Mutating or "Normalizing" Flag names + +It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow. + +**Example #1**: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag + +``` go +func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { + from := []string{"-", "_"} + to := "." + for _, sep := range from { + name = strings.Replace(name, sep, to, -1) + } + return pflag.NormalizedName(name) +} + +myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc) +``` + +**Example #2**: You want to alias two flags. aka --old-flag-name == --new-flag-name + +``` go +func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName { + switch name { + case "old-flag-name": + name = "new-flag-name" + break + } + return pflag.NormalizedName(name) +} + +myFlagSet.SetNormalizeFunc(aliasNormalizeFunc) +``` + +## Deprecating a flag or its shorthand +It is possible to deprecate a flag, or just its shorthand. Deprecating a flag/shorthand hides it from help text and prints a usage message when the deprecated flag/shorthand is used. + +**Example #1**: You want to deprecate a flag named "badflag" as well as inform the users what flag they should use instead. +```go +// deprecate a flag by specifying its name and a usage message +flags.MarkDeprecated("badflag", "please use --good-flag instead") +``` +This hides "badflag" from help text, and prints `Flag --badflag has been deprecated, please use --good-flag instead` when "badflag" is used. + +**Example #2**: You want to keep a flag name "noshorthandflag" but deprecate its shortname "n". +```go +// deprecate a flag shorthand by specifying its flag name and a usage message +flags.MarkShorthandDeprecated("noshorthandflag", "please use --noshorthandflag only") +``` +This hides the shortname "n" from help text, and prints `Flag shorthand -n has been deprecated, please use --noshorthandflag only` when the shorthand "n" is used. + +Note that usage message is essential here, and it should not be empty. + +## Hidden flags +It is possible to mark a flag as hidden, meaning it will still function as normal, however will not show up in usage/help text. + +**Example**: You have a flag named "secretFlag" that you need for internal use only and don't want it showing up in help text, or for its usage text to be available. +```go +// hide a flag by specifying its name +flags.MarkHidden("secretFlag") +``` + +## Disable sorting of flags +`pflag` allows you to disable sorting of flags for help and usage message. + +**Example**: +```go +flags.BoolP("verbose", "v", false, "verbose output") +flags.String("coolflag", "yeaah", "it's really cool flag") +flags.Int("usefulflag", 777, "sometimes it's very useful") +flags.SortFlags = false +flags.PrintDefaults() +``` +**Output**: +``` + -v, --verbose verbose output + --coolflag string it's really cool flag (default "yeaah") + --usefulflag int sometimes it's very useful (default 777) +``` + + +## Supporting Go flags when using pflag +In order to support flags defined using Go's `flag` package, they must be added to the `pflag` flagset. This is usually necessary +to support flags defined by third-party dependencies (e.g. `golang/glog`). + +**Example**: You want to add the Go flags to the `CommandLine` flagset +```go +import ( + goflag "flag" + flag "github.com/spf13/pflag" +) + +var ip *int = flag.Int("flagname", 1234, "help message for flagname") + +func main() { + flag.CommandLine.AddGoFlagSet(goflag.CommandLine) + flag.Parse() +} +``` + +## More info + +You can see the full reference documentation of the pflag package +[at godoc.org][3], or through go's standard documentation system by +running `godoc -http=:6060` and browsing to +[http://localhost:6060/pkg/github.com/spf13/pflag][2] after +installation. + +[2]: http://localhost:6060/pkg/github.com/spf13/pflag +[3]: http://godoc.org/github.com/spf13/pflag diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool.go new file mode 100755 index 0000000..c4c5c0b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool.go @@ -0,0 +1,94 @@ +package pflag + +import "strconv" + +// optional interface to indicate boolean flags that can be +// supplied without "=value" text +type boolFlag interface { + Value + IsBoolFlag() bool +} + +// -- bool Value +type boolValue bool + +func newBoolValue(val bool, p *bool) *boolValue { + *p = val + return (*boolValue)(p) +} + +func (b *boolValue) Set(s string) error { + v, err := strconv.ParseBool(s) + *b = boolValue(v) + return err +} + +func (b *boolValue) Type() string { + return "bool" +} + +func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) } + +func (b *boolValue) IsBoolFlag() bool { return true } + +func boolConv(sval string) (interface{}, error) { + return strconv.ParseBool(sval) +} + +// GetBool return the bool value of a flag with the given name +func (f *FlagSet) GetBool(name string) (bool, error) { + val, err := f.getFlagType(name, "bool", boolConv) + if err != nil { + return false, err + } + return val.(bool), nil +} + +// BoolVar defines a bool flag with specified name, default value, and usage string. +// The argument p points to a bool variable in which to store the value of the flag. +func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) { + f.BoolVarP(p, name, "", value, usage) +} + +// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolVarP(p *bool, name, shorthand string, value bool, usage string) { + flag := f.VarPF(newBoolValue(value, p), name, shorthand, usage) + flag.NoOptDefVal = "true" +} + +// BoolVar defines a bool flag with specified name, default value, and usage string. +// The argument p points to a bool variable in which to store the value of the flag. +func BoolVar(p *bool, name string, value bool, usage string) { + BoolVarP(p, name, "", value, usage) +} + +// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash. +func BoolVarP(p *bool, name, shorthand string, value bool, usage string) { + flag := CommandLine.VarPF(newBoolValue(value, p), name, shorthand, usage) + flag.NoOptDefVal = "true" +} + +// Bool defines a bool flag with specified name, default value, and usage string. +// The return value is the address of a bool variable that stores the value of the flag. +func (f *FlagSet) Bool(name string, value bool, usage string) *bool { + return f.BoolP(name, "", value, usage) +} + +// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string) *bool { + p := new(bool) + f.BoolVarP(p, name, shorthand, value, usage) + return p +} + +// Bool defines a bool flag with specified name, default value, and usage string. +// The return value is the address of a bool variable that stores the value of the flag. +func Bool(name string, value bool, usage string) *bool { + return BoolP(name, "", value, usage) +} + +// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash. +func BoolP(name, shorthand string, value bool, usage string) *bool { + b := CommandLine.BoolP(name, shorthand, value, usage) + return b +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool_slice.go new file mode 100755 index 0000000..5af02f1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bool_slice.go @@ -0,0 +1,147 @@ +package pflag + +import ( + "io" + "strconv" + "strings" +) + +// -- boolSlice Value +type boolSliceValue struct { + value *[]bool + changed bool +} + +func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue { + bsv := new(boolSliceValue) + bsv.value = p + *bsv.value = val + return bsv +} + +// Set converts, and assigns, the comma-separated boolean argument string representation as the []bool value of this flag. +// If Set is called on a flag that already has a []bool assigned, the newly converted values will be appended. +func (s *boolSliceValue) Set(val string) error { + + // remove all quote characters + rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "") + + // read flag arguments with CSV parser + boolStrSlice, err := readAsCSV(rmQuote.Replace(val)) + if err != nil && err != io.EOF { + return err + } + + // parse boolean values into slice + out := make([]bool, 0, len(boolStrSlice)) + for _, boolStr := range boolStrSlice { + b, err := strconv.ParseBool(strings.TrimSpace(boolStr)) + if err != nil { + return err + } + out = append(out, b) + } + + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + + s.changed = true + + return nil +} + +// Type returns a string that uniquely represents this flag's type. +func (s *boolSliceValue) Type() string { + return "boolSlice" +} + +// String defines a "native" format for this boolean slice flag value. +func (s *boolSliceValue) String() string { + + boolStrSlice := make([]string, len(*s.value)) + for i, b := range *s.value { + boolStrSlice[i] = strconv.FormatBool(b) + } + + out, _ := writeAsCSV(boolStrSlice) + + return "[" + out + "]" +} + +func boolSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []bool{}, nil + } + ss := strings.Split(val, ",") + out := make([]bool, len(ss)) + for i, t := range ss { + var err error + out[i], err = strconv.ParseBool(t) + if err != nil { + return nil, err + } + } + return out, nil +} + +// GetBoolSlice returns the []bool value of a flag with the given name. +func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) { + val, err := f.getFlagType(name, "boolSlice", boolSliceConv) + if err != nil { + return []bool{}, err + } + return val.([]bool), nil +} + +// BoolSliceVar defines a boolSlice flag with specified name, default value, and usage string. +// The argument p points to a []bool variable in which to store the value of the flag. +func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usage string) { + f.VarP(newBoolSliceValue(value, p), name, "", usage) +} + +// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) { + f.VarP(newBoolSliceValue(value, p), name, shorthand, usage) +} + +// BoolSliceVar defines a []bool flag with specified name, default value, and usage string. +// The argument p points to a []bool variable in which to store the value of the flag. +func BoolSliceVar(p *[]bool, name string, value []bool, usage string) { + CommandLine.VarP(newBoolSliceValue(value, p), name, "", usage) +} + +// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash. +func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) { + CommandLine.VarP(newBoolSliceValue(value, p), name, shorthand, usage) +} + +// BoolSlice defines a []bool flag with specified name, default value, and usage string. +// The return value is the address of a []bool variable that stores the value of the flag. +func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]bool { + p := []bool{} + f.BoolSliceVarP(&p, name, "", value, usage) + return &p +} + +// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool { + p := []bool{} + f.BoolSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// BoolSlice defines a []bool flag with specified name, default value, and usage string. +// The return value is the address of a []bool variable that stores the value of the flag. +func BoolSlice(name string, value []bool, usage string) *[]bool { + return CommandLine.BoolSliceP(name, "", value, usage) +} + +// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash. +func BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool { + return CommandLine.BoolSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bytes.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bytes.go new file mode 100755 index 0000000..12c58db --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/bytes.go @@ -0,0 +1,105 @@ +package pflag + +import ( + "encoding/hex" + "fmt" + "strings" +) + +// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded +type bytesHexValue []byte + +func (bytesHex bytesHexValue) String() string { + return fmt.Sprintf("%X", []byte(bytesHex)) +} + +func (bytesHex *bytesHexValue) Set(value string) error { + bin, err := hex.DecodeString(strings.TrimSpace(value)) + + if err != nil { + return err + } + + *bytesHex = bin + + return nil +} + +func (*bytesHexValue) Type() string { + return "bytesHex" +} + +func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue { + *p = val + return (*bytesHexValue)(p) +} + +func bytesHexConv(sval string) (interface{}, error) { + + bin, err := hex.DecodeString(sval) + + if err == nil { + return bin, nil + } + + return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) +} + +// GetBytesHex return the []byte value of a flag with the given name +func (f *FlagSet) GetBytesHex(name string) ([]byte, error) { + val, err := f.getFlagType(name, "bytesHex", bytesHexConv) + + if err != nil { + return []byte{}, err + } + + return val.([]byte), nil +} + +// BytesHexVar defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) { + f.VarP(newBytesHexValue(value, p), name, "", usage) +} + +// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { + f.VarP(newBytesHexValue(value, p), name, shorthand, usage) +} + +// BytesHexVar defines an []byte flag with specified name, default value, and usage string. +// The argument p points to an []byte variable in which to store the value of the flag. +func BytesHexVar(p *[]byte, name string, value []byte, usage string) { + CommandLine.VarP(newBytesHexValue(value, p), name, "", usage) +} + +// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. +func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { + CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage) +} + +// BytesHex defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesHexVarP(p, name, "", value, usage) + return p +} + +// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { + p := new([]byte) + f.BytesHexVarP(p, name, shorthand, value, usage) + return p +} + +// BytesHex defines an []byte flag with specified name, default value, and usage string. +// The return value is the address of an []byte variable that stores the value of the flag. +func BytesHex(name string, value []byte, usage string) *[]byte { + return CommandLine.BytesHexP(name, "", value, usage) +} + +// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. +func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { + return CommandLine.BytesHexP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/count.go new file mode 100755 index 0000000..aa126e4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/count.go @@ -0,0 +1,96 @@ +package pflag + +import "strconv" + +// -- count Value +type countValue int + +func newCountValue(val int, p *int) *countValue { + *p = val + return (*countValue)(p) +} + +func (i *countValue) Set(s string) error { + // "+1" means that no specific value was passed, so increment + if s == "+1" { + *i = countValue(*i + 1) + return nil + } + v, err := strconv.ParseInt(s, 0, 0) + *i = countValue(v) + return err +} + +func (i *countValue) Type() string { + return "count" +} + +func (i *countValue) String() string { return strconv.Itoa(int(*i)) } + +func countConv(sval string) (interface{}, error) { + i, err := strconv.Atoi(sval) + if err != nil { + return nil, err + } + return i, nil +} + +// GetCount return the int value of a flag with the given name +func (f *FlagSet) GetCount(name string) (int, error) { + val, err := f.getFlagType(name, "count", countConv) + if err != nil { + return 0, err + } + return val.(int), nil +} + +// CountVar defines a count flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func (f *FlagSet) CountVar(p *int, name string, usage string) { + f.CountVarP(p, name, "", usage) +} + +// CountVarP is like CountVar only take a shorthand for the flag name. +func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) { + flag := f.VarPF(newCountValue(0, p), name, shorthand, usage) + flag.NoOptDefVal = "+1" +} + +// CountVar like CountVar only the flag is placed on the CommandLine instead of a given flag set +func CountVar(p *int, name string, usage string) { + CommandLine.CountVar(p, name, usage) +} + +// CountVarP is like CountVar only take a shorthand for the flag name. +func CountVarP(p *int, name, shorthand string, usage string) { + CommandLine.CountVarP(p, name, shorthand, usage) +} + +// Count defines a count flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func (f *FlagSet) Count(name string, usage string) *int { + p := new(int) + f.CountVarP(p, name, "", usage) + return p +} + +// CountP is like Count only takes a shorthand for the flag name. +func (f *FlagSet) CountP(name, shorthand string, usage string) *int { + p := new(int) + f.CountVarP(p, name, shorthand, usage) + return p +} + +// Count defines a count flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +// A count flag will add 1 to its value evey time it is found on the command line +func Count(name string, usage string) *int { + return CommandLine.CountP(name, "", usage) +} + +// CountP is like Count only takes a shorthand for the flag name. +func CountP(name, shorthand string, usage string) *int { + return CommandLine.CountP(name, shorthand, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration.go new file mode 100755 index 0000000..e9debef --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration.go @@ -0,0 +1,86 @@ +package pflag + +import ( + "time" +) + +// -- time.Duration Value +type durationValue time.Duration + +func newDurationValue(val time.Duration, p *time.Duration) *durationValue { + *p = val + return (*durationValue)(p) +} + +func (d *durationValue) Set(s string) error { + v, err := time.ParseDuration(s) + *d = durationValue(v) + return err +} + +func (d *durationValue) Type() string { + return "duration" +} + +func (d *durationValue) String() string { return (*time.Duration)(d).String() } + +func durationConv(sval string) (interface{}, error) { + return time.ParseDuration(sval) +} + +// GetDuration return the duration value of a flag with the given name +func (f *FlagSet) GetDuration(name string) (time.Duration, error) { + val, err := f.getFlagType(name, "duration", durationConv) + if err != nil { + return 0, err + } + return val.(time.Duration), nil +} + +// DurationVar defines a time.Duration flag with specified name, default value, and usage string. +// The argument p points to a time.Duration variable in which to store the value of the flag. +func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) { + f.VarP(newDurationValue(value, p), name, "", usage) +} + +// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) { + f.VarP(newDurationValue(value, p), name, shorthand, usage) +} + +// DurationVar defines a time.Duration flag with specified name, default value, and usage string. +// The argument p points to a time.Duration variable in which to store the value of the flag. +func DurationVar(p *time.Duration, name string, value time.Duration, usage string) { + CommandLine.VarP(newDurationValue(value, p), name, "", usage) +} + +// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash. +func DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) { + CommandLine.VarP(newDurationValue(value, p), name, shorthand, usage) +} + +// Duration defines a time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a time.Duration variable that stores the value of the flag. +func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration { + p := new(time.Duration) + f.DurationVarP(p, name, "", value, usage) + return p +} + +// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration { + p := new(time.Duration) + f.DurationVarP(p, name, shorthand, value, usage) + return p +} + +// Duration defines a time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a time.Duration variable that stores the value of the flag. +func Duration(name string, value time.Duration, usage string) *time.Duration { + return CommandLine.DurationP(name, "", value, usage) +} + +// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash. +func DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration { + return CommandLine.DurationP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration_slice.go new file mode 100755 index 0000000..52c6b6d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/duration_slice.go @@ -0,0 +1,128 @@ +package pflag + +import ( + "fmt" + "strings" + "time" +) + +// -- durationSlice Value +type durationSliceValue struct { + value *[]time.Duration + changed bool +} + +func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue { + dsv := new(durationSliceValue) + dsv.value = p + *dsv.value = val + return dsv +} + +func (s *durationSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]time.Duration, len(ss)) + for i, d := range ss { + var err error + out[i], err = time.ParseDuration(d) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *durationSliceValue) Type() string { + return "durationSlice" +} + +func (s *durationSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%s", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func durationSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []time.Duration{}, nil + } + ss := strings.Split(val, ",") + out := make([]time.Duration, len(ss)) + for i, d := range ss { + var err error + out[i], err = time.ParseDuration(d) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetDurationSlice returns the []time.Duration value of a flag with the given name +func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) { + val, err := f.getFlagType(name, "durationSlice", durationSliceConv) + if err != nil { + return []time.Duration{}, err + } + return val.([]time.Duration), nil +} + +// DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string. +// The argument p points to a []time.Duration variable in which to store the value of the flag. +func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) { + f.VarP(newDurationSliceValue(value, p), name, "", usage) +} + +// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) { + f.VarP(newDurationSliceValue(value, p), name, shorthand, usage) +} + +// DurationSliceVar defines a duration[] flag with specified name, default value, and usage string. +// The argument p points to a duration[] variable in which to store the value of the flag. +func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) { + CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage) +} + +// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash. +func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) { + CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage) +} + +// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a []time.Duration variable that stores the value of the flag. +func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration { + p := []time.Duration{} + f.DurationSliceVarP(&p, name, "", value, usage) + return &p +} + +// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration { + p := []time.Duration{} + f.DurationSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string. +// The return value is the address of a []time.Duration variable that stores the value of the flag. +func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration { + return CommandLine.DurationSliceP(name, "", value, usage) +} + +// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash. +func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration { + return CommandLine.DurationSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/flag.go new file mode 100755 index 0000000..5eadc84 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/flag.go @@ -0,0 +1,1223 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package pflag is a drop-in replacement for Go's flag package, implementing +POSIX/GNU-style --flags. + +pflag is compatible with the GNU extensions to the POSIX recommendations +for command-line options. See +http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html + +Usage: + +pflag is a drop-in replacement of Go's native flag package. If you import +pflag under the name "flag" then all code should continue to function +with no changes. + + import flag "github.com/spf13/pflag" + +There is one exception to this: if you directly instantiate the Flag struct +there is one more field "Shorthand" that you will need to set. +Most code never instantiates this struct directly, and instead uses +functions such as String(), BoolVar(), and Var(), and is therefore +unaffected. + +Define flags using flag.String(), Bool(), Int(), etc. + +This declares an integer flag, -flagname, stored in the pointer ip, with type *int. + var ip = flag.Int("flagname", 1234, "help message for flagname") +If you like, you can bind the flag to a variable using the Var() functions. + var flagvar int + func init() { + flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") + } +Or you can create custom flags that satisfy the Value interface (with +pointer receivers) and couple them to flag parsing by + flag.Var(&flagVal, "name", "help message for flagname") +For such flags, the default value is just the initial value of the variable. + +After all flags are defined, call + flag.Parse() +to parse the command line into the defined flags. + +Flags may then be used directly. If you're using the flags themselves, +they are all pointers; if you bind to variables, they're values. + fmt.Println("ip has value ", *ip) + fmt.Println("flagvar has value ", flagvar) + +After parsing, the arguments after the flag are available as the +slice flag.Args() or individually as flag.Arg(i). +The arguments are indexed from 0 through flag.NArg()-1. + +The pflag package also defines some new functions that are not in flag, +that give one-letter shorthands for flags. You can use these by appending +'P' to the name of any function that defines a flag. + var ip = flag.IntP("flagname", "f", 1234, "help message") + var flagvar bool + func init() { + flag.BoolVarP("boolname", "b", true, "help message") + } + flag.VarP(&flagVar, "varname", "v", 1234, "help message") +Shorthand letters can be used with single dashes on the command line. +Boolean shorthand flags can be combined with other shorthand flags. + +Command line flag syntax: + --flag // boolean flags only + --flag=x + +Unlike the flag package, a single dash before an option means something +different than a double dash. Single dashes signify a series of shorthand +letters for flags. All but the last shorthand letter must be boolean flags. + // boolean flags + -f + -abc + // non-boolean flags + -n 1234 + -Ifile + // mixed + -abcs "hello" + -abcn1234 + +Flag parsing stops after the terminator "--". Unlike the flag package, +flags can be interspersed with arguments anywhere on the command line +before this terminator. + +Integer flags accept 1234, 0664, 0x1234 and may be negative. +Boolean flags (in their long form) accept 1, 0, t, f, true, false, +TRUE, FALSE, True, False. +Duration flags accept any input valid for time.ParseDuration. + +The default set of command-line flags is controlled by +top-level functions. The FlagSet type allows one to define +independent sets of flags, such as to implement subcommands +in a command-line interface. The methods of FlagSet are +analogous to the top-level functions for the command-line +flag set. +*/ +package pflag + +import ( + "bytes" + "errors" + goflag "flag" + "fmt" + "io" + "os" + "sort" + "strings" +) + +// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined. +var ErrHelp = errors.New("pflag: help requested") + +// ErrorHandling defines how to handle flag parsing errors. +type ErrorHandling int + +const ( + // ContinueOnError will return an err from Parse() if an error is found + ContinueOnError ErrorHandling = iota + // ExitOnError will call os.Exit(2) if an error is found when parsing + ExitOnError + // PanicOnError will panic() if an error is found when parsing flags + PanicOnError +) + +// ParseErrorsWhitelist defines the parsing errors that can be ignored +type ParseErrorsWhitelist struct { + // UnknownFlags will ignore unknown flags errors and continue parsing rest of the flags + UnknownFlags bool +} + +// NormalizedName is a flag name that has been normalized according to rules +// for the FlagSet (e.g. making '-' and '_' equivalent). +type NormalizedName string + +// A FlagSet represents a set of defined flags. +type FlagSet struct { + // Usage is the function called when an error occurs while parsing flags. + // The field is a function (not a method) that may be changed to point to + // a custom error handler. + Usage func() + + // SortFlags is used to indicate, if user wants to have sorted flags in + // help/usage messages. + SortFlags bool + + // ParseErrorsWhitelist is used to configure a whitelist of errors + ParseErrorsWhitelist ParseErrorsWhitelist + + name string + parsed bool + actual map[NormalizedName]*Flag + orderedActual []*Flag + sortedActual []*Flag + formal map[NormalizedName]*Flag + orderedFormal []*Flag + sortedFormal []*Flag + shorthands map[byte]*Flag + args []string // arguments after flags + argsLenAtDash int // len(args) when a '--' was located when parsing, or -1 if no -- + errorHandling ErrorHandling + output io.Writer // nil means stderr; use out() accessor + interspersed bool // allow interspersed option/non-option args + normalizeNameFunc func(f *FlagSet, name string) NormalizedName + + addedGoFlagSets []*goflag.FlagSet +} + +// A Flag represents the state of a flag. +type Flag struct { + Name string // name as it appears on command line + Shorthand string // one-letter abbreviated flag + Usage string // help message + Value Value // value as set + DefValue string // default value (as text); for usage message + Changed bool // If the user set the value (or if left to default) + NoOptDefVal string // default value (as text); if the flag is on the command line without any options + Deprecated string // If this flag is deprecated, this string is the new or now thing to use + Hidden bool // used by cobra.Command to allow flags to be hidden from help/usage text + ShorthandDeprecated string // If the shorthand of this flag is deprecated, this string is the new or now thing to use + Annotations map[string][]string // used by cobra.Command bash autocomple code +} + +// Value is the interface to the dynamic value stored in a flag. +// (The default value is represented as a string.) +type Value interface { + String() string + Set(string) error + Type() string +} + +// sortFlags returns the flags as a slice in lexicographical sorted order. +func sortFlags(flags map[NormalizedName]*Flag) []*Flag { + list := make(sort.StringSlice, len(flags)) + i := 0 + for k := range flags { + list[i] = string(k) + i++ + } + list.Sort() + result := make([]*Flag, len(list)) + for i, name := range list { + result[i] = flags[NormalizedName(name)] + } + return result +} + +// SetNormalizeFunc allows you to add a function which can translate flag names. +// Flags added to the FlagSet will be translated and then when anything tries to +// look up the flag that will also be translated. So it would be possible to create +// a flag named "getURL" and have it translated to "geturl". A user could then pass +// "--getUrl" which may also be translated to "geturl" and everything will work. +func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) { + f.normalizeNameFunc = n + f.sortedFormal = f.sortedFormal[:0] + for fname, flag := range f.formal { + nname := f.normalizeFlagName(flag.Name) + if fname == nname { + continue + } + flag.Name = string(nname) + delete(f.formal, fname) + f.formal[nname] = flag + if _, set := f.actual[fname]; set { + delete(f.actual, fname) + f.actual[nname] = flag + } + } +} + +// GetNormalizeFunc returns the previously set NormalizeFunc of a function which +// does no translation, if not set previously. +func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) NormalizedName { + if f.normalizeNameFunc != nil { + return f.normalizeNameFunc + } + return func(f *FlagSet, name string) NormalizedName { return NormalizedName(name) } +} + +func (f *FlagSet) normalizeFlagName(name string) NormalizedName { + n := f.GetNormalizeFunc() + return n(f, name) +} + +func (f *FlagSet) out() io.Writer { + if f.output == nil { + return os.Stderr + } + return f.output +} + +// SetOutput sets the destination for usage and error messages. +// If output is nil, os.Stderr is used. +func (f *FlagSet) SetOutput(output io.Writer) { + f.output = output +} + +// VisitAll visits the flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits all flags, even those not set. +func (f *FlagSet) VisitAll(fn func(*Flag)) { + if len(f.formal) == 0 { + return + } + + var flags []*Flag + if f.SortFlags { + if len(f.formal) != len(f.sortedFormal) { + f.sortedFormal = sortFlags(f.formal) + } + flags = f.sortedFormal + } else { + flags = f.orderedFormal + } + + for _, flag := range flags { + fn(flag) + } +} + +// HasFlags returns a bool to indicate if the FlagSet has any flags defined. +func (f *FlagSet) HasFlags() bool { + return len(f.formal) > 0 +} + +// HasAvailableFlags returns a bool to indicate if the FlagSet has any flags +// that are not hidden. +func (f *FlagSet) HasAvailableFlags() bool { + for _, flag := range f.formal { + if !flag.Hidden { + return true + } + } + return false +} + +// VisitAll visits the command-line flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits all flags, even those not set. +func VisitAll(fn func(*Flag)) { + CommandLine.VisitAll(fn) +} + +// Visit visits the flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits only those flags that have been set. +func (f *FlagSet) Visit(fn func(*Flag)) { + if len(f.actual) == 0 { + return + } + + var flags []*Flag + if f.SortFlags { + if len(f.actual) != len(f.sortedActual) { + f.sortedActual = sortFlags(f.actual) + } + flags = f.sortedActual + } else { + flags = f.orderedActual + } + + for _, flag := range flags { + fn(flag) + } +} + +// Visit visits the command-line flags in lexicographical order or +// in primordial order if f.SortFlags is false, calling fn for each. +// It visits only those flags that have been set. +func Visit(fn func(*Flag)) { + CommandLine.Visit(fn) +} + +// Lookup returns the Flag structure of the named flag, returning nil if none exists. +func (f *FlagSet) Lookup(name string) *Flag { + return f.lookup(f.normalizeFlagName(name)) +} + +// ShorthandLookup returns the Flag structure of the short handed flag, +// returning nil if none exists. +// It panics, if len(name) > 1. +func (f *FlagSet) ShorthandLookup(name string) *Flag { + if name == "" { + return nil + } + if len(name) > 1 { + msg := fmt.Sprintf("can not look up shorthand which is more than one ASCII character: %q", name) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + c := name[0] + return f.shorthands[c] +} + +// lookup returns the Flag structure of the named flag, returning nil if none exists. +func (f *FlagSet) lookup(name NormalizedName) *Flag { + return f.formal[name] +} + +// func to return a given type for a given flag name +func (f *FlagSet) getFlagType(name string, ftype string, convFunc func(sval string) (interface{}, error)) (interface{}, error) { + flag := f.Lookup(name) + if flag == nil { + err := fmt.Errorf("flag accessed but not defined: %s", name) + return nil, err + } + + if flag.Value.Type() != ftype { + err := fmt.Errorf("trying to get %s value of flag of type %s", ftype, flag.Value.Type()) + return nil, err + } + + sval := flag.Value.String() + result, err := convFunc(sval) + if err != nil { + return nil, err + } + return result, nil +} + +// ArgsLenAtDash will return the length of f.Args at the moment when a -- was +// found during arg parsing. This allows your program to know which args were +// before the -- and which came after. +func (f *FlagSet) ArgsLenAtDash() int { + return f.argsLenAtDash +} + +// MarkDeprecated indicated that a flag is deprecated in your program. It will +// continue to function but will not show up in help or usage messages. Using +// this flag will also print the given usageMessage. +func (f *FlagSet) MarkDeprecated(name string, usageMessage string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + if usageMessage == "" { + return fmt.Errorf("deprecated message for flag %q must be set", name) + } + flag.Deprecated = usageMessage + flag.Hidden = true + return nil +} + +// MarkShorthandDeprecated will mark the shorthand of a flag deprecated in your +// program. It will continue to function but will not show up in help or usage +// messages. Using this flag will also print the given usageMessage. +func (f *FlagSet) MarkShorthandDeprecated(name string, usageMessage string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + if usageMessage == "" { + return fmt.Errorf("deprecated message for flag %q must be set", name) + } + flag.ShorthandDeprecated = usageMessage + return nil +} + +// MarkHidden sets a flag to 'hidden' in your program. It will continue to +// function but will not show up in help or usage messages. +func (f *FlagSet) MarkHidden(name string) error { + flag := f.Lookup(name) + if flag == nil { + return fmt.Errorf("flag %q does not exist", name) + } + flag.Hidden = true + return nil +} + +// Lookup returns the Flag structure of the named command-line flag, +// returning nil if none exists. +func Lookup(name string) *Flag { + return CommandLine.Lookup(name) +} + +// ShorthandLookup returns the Flag structure of the short handed flag, +// returning nil if none exists. +func ShorthandLookup(name string) *Flag { + return CommandLine.ShorthandLookup(name) +} + +// Set sets the value of the named flag. +func (f *FlagSet) Set(name, value string) error { + normalName := f.normalizeFlagName(name) + flag, ok := f.formal[normalName] + if !ok { + return fmt.Errorf("no such flag -%v", name) + } + + err := flag.Value.Set(value) + if err != nil { + var flagName string + if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { + flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name) + } else { + flagName = fmt.Sprintf("--%s", flag.Name) + } + return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err) + } + + if !flag.Changed { + if f.actual == nil { + f.actual = make(map[NormalizedName]*Flag) + } + f.actual[normalName] = flag + f.orderedActual = append(f.orderedActual, flag) + + flag.Changed = true + } + + if flag.Deprecated != "" { + fmt.Fprintf(f.out(), "Flag --%s has been deprecated, %s\n", flag.Name, flag.Deprecated) + } + return nil +} + +// SetAnnotation allows one to set arbitrary annotations on a flag in the FlagSet. +// This is sometimes used by spf13/cobra programs which want to generate additional +// bash completion information. +func (f *FlagSet) SetAnnotation(name, key string, values []string) error { + normalName := f.normalizeFlagName(name) + flag, ok := f.formal[normalName] + if !ok { + return fmt.Errorf("no such flag -%v", name) + } + if flag.Annotations == nil { + flag.Annotations = map[string][]string{} + } + flag.Annotations[key] = values + return nil +} + +// Changed returns true if the flag was explicitly set during Parse() and false +// otherwise +func (f *FlagSet) Changed(name string) bool { + flag := f.Lookup(name) + // If a flag doesn't exist, it wasn't changed.... + if flag == nil { + return false + } + return flag.Changed +} + +// Set sets the value of the named command-line flag. +func Set(name, value string) error { + return CommandLine.Set(name, value) +} + +// PrintDefaults prints, to standard error unless configured +// otherwise, the default values of all defined flags in the set. +func (f *FlagSet) PrintDefaults() { + usages := f.FlagUsages() + fmt.Fprint(f.out(), usages) +} + +// defaultIsZeroValue returns true if the default value for this flag represents +// a zero value. +func (f *Flag) defaultIsZeroValue() bool { + switch f.Value.(type) { + case boolFlag: + return f.DefValue == "false" + case *durationValue: + // Beginning in Go 1.7, duration zero values are "0s" + return f.DefValue == "0" || f.DefValue == "0s" + case *intValue, *int8Value, *int32Value, *int64Value, *uintValue, *uint8Value, *uint16Value, *uint32Value, *uint64Value, *countValue, *float32Value, *float64Value: + return f.DefValue == "0" + case *stringValue: + return f.DefValue == "" + case *ipValue, *ipMaskValue, *ipNetValue: + return f.DefValue == "" + case *intSliceValue, *stringSliceValue, *stringArrayValue: + return f.DefValue == "[]" + default: + switch f.Value.String() { + case "false": + return true + case "": + return true + case "": + return true + case "0": + return true + } + return false + } +} + +// UnquoteUsage extracts a back-quoted name from the usage +// string for a flag and returns it and the un-quoted usage. +// Given "a `name` to show" it returns ("name", "a name to show"). +// If there are no back quotes, the name is an educated guess of the +// type of the flag's value, or the empty string if the flag is boolean. +func UnquoteUsage(flag *Flag) (name string, usage string) { + // Look for a back-quoted name, but avoid the strings package. + usage = flag.Usage + for i := 0; i < len(usage); i++ { + if usage[i] == '`' { + for j := i + 1; j < len(usage); j++ { + if usage[j] == '`' { + name = usage[i+1 : j] + usage = usage[:i] + name + usage[j+1:] + return name, usage + } + } + break // Only one back quote; use type name. + } + } + + name = flag.Value.Type() + switch name { + case "bool": + name = "" + case "float64": + name = "float" + case "int64": + name = "int" + case "uint64": + name = "uint" + case "stringSlice": + name = "strings" + case "intSlice": + name = "ints" + case "uintSlice": + name = "uints" + case "boolSlice": + name = "bools" + } + + return +} + +// Splits the string `s` on whitespace into an initial substring up to +// `i` runes in length and the remainder. Will go `slop` over `i` if +// that encompasses the entire string (which allows the caller to +// avoid short orphan words on the final line). +func wrapN(i, slop int, s string) (string, string) { + if i+slop > len(s) { + return s, "" + } + + w := strings.LastIndexAny(s[:i], " \t\n") + if w <= 0 { + return s, "" + } + nlPos := strings.LastIndex(s[:i], "\n") + if nlPos > 0 && nlPos < w { + return s[:nlPos], s[nlPos+1:] + } + return s[:w], s[w+1:] +} + +// Wraps the string `s` to a maximum width `w` with leading indent +// `i`. The first line is not indented (this is assumed to be done by +// caller). Pass `w` == 0 to do no wrapping +func wrap(i, w int, s string) string { + if w == 0 { + return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1) + } + + // space between indent i and end of line width w into which + // we should wrap the text. + wrap := w - i + + var r, l string + + // Not enough space for sensible wrapping. Wrap as a block on + // the next line instead. + if wrap < 24 { + i = 16 + wrap = w - i + r += "\n" + strings.Repeat(" ", i) + } + // If still not enough space then don't even try to wrap. + if wrap < 24 { + return strings.Replace(s, "\n", r, -1) + } + + // Try to avoid short orphan words on the final line, by + // allowing wrapN to go a bit over if that would fit in the + // remainder of the line. + slop := 5 + wrap = wrap - slop + + // Handle first line, which is indented by the caller (or the + // special case above) + l, s = wrapN(wrap, slop, s) + r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1) + + // Now wrap the rest + for s != "" { + var t string + + t, s = wrapN(wrap, slop, s) + r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1) + } + + return r + +} + +// FlagUsagesWrapped returns a string containing the usage information +// for all flags in the FlagSet. Wrapped to `cols` columns (0 for no +// wrapping) +func (f *FlagSet) FlagUsagesWrapped(cols int) string { + buf := new(bytes.Buffer) + + lines := make([]string, 0, len(f.formal)) + + maxlen := 0 + f.VisitAll(func(flag *Flag) { + if flag.Hidden { + return + } + + line := "" + if flag.Shorthand != "" && flag.ShorthandDeprecated == "" { + line = fmt.Sprintf(" -%s, --%s", flag.Shorthand, flag.Name) + } else { + line = fmt.Sprintf(" --%s", flag.Name) + } + + varname, usage := UnquoteUsage(flag) + if varname != "" { + line += " " + varname + } + if flag.NoOptDefVal != "" { + switch flag.Value.Type() { + case "string": + line += fmt.Sprintf("[=\"%s\"]", flag.NoOptDefVal) + case "bool": + if flag.NoOptDefVal != "true" { + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + case "count": + if flag.NoOptDefVal != "+1" { + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + default: + line += fmt.Sprintf("[=%s]", flag.NoOptDefVal) + } + } + + // This special character will be replaced with spacing once the + // correct alignment is calculated + line += "\x00" + if len(line) > maxlen { + maxlen = len(line) + } + + line += usage + if !flag.defaultIsZeroValue() { + if flag.Value.Type() == "string" { + line += fmt.Sprintf(" (default %q)", flag.DefValue) + } else { + line += fmt.Sprintf(" (default %s)", flag.DefValue) + } + } + if len(flag.Deprecated) != 0 { + line += fmt.Sprintf(" (DEPRECATED: %s)", flag.Deprecated) + } + + lines = append(lines, line) + }) + + for _, line := range lines { + sidx := strings.Index(line, "\x00") + spacing := strings.Repeat(" ", maxlen-sidx) + // maxlen + 2 comes from + 1 for the \x00 and + 1 for the (deliberate) off-by-one in maxlen-sidx + fmt.Fprintln(buf, line[:sidx], spacing, wrap(maxlen+2, cols, line[sidx+1:])) + } + + return buf.String() +} + +// FlagUsages returns a string containing the usage information for all flags in +// the FlagSet +func (f *FlagSet) FlagUsages() string { + return f.FlagUsagesWrapped(0) +} + +// PrintDefaults prints to standard error the default values of all defined command-line flags. +func PrintDefaults() { + CommandLine.PrintDefaults() +} + +// defaultUsage is the default function to print a usage message. +func defaultUsage(f *FlagSet) { + fmt.Fprintf(f.out(), "Usage of %s:\n", f.name) + f.PrintDefaults() +} + +// NOTE: Usage is not just defaultUsage(CommandLine) +// because it serves (via godoc flag Usage) as the example +// for how to write your own usage function. + +// Usage prints to standard error a usage message documenting all defined command-line flags. +// The function is a variable that may be changed to point to a custom function. +// By default it prints a simple header and calls PrintDefaults; for details about the +// format of the output and how to control it, see the documentation for PrintDefaults. +var Usage = func() { + fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) + PrintDefaults() +} + +// NFlag returns the number of flags that have been set. +func (f *FlagSet) NFlag() int { return len(f.actual) } + +// NFlag returns the number of command-line flags that have been set. +func NFlag() int { return len(CommandLine.actual) } + +// Arg returns the i'th argument. Arg(0) is the first remaining argument +// after flags have been processed. +func (f *FlagSet) Arg(i int) string { + if i < 0 || i >= len(f.args) { + return "" + } + return f.args[i] +} + +// Arg returns the i'th command-line argument. Arg(0) is the first remaining argument +// after flags have been processed. +func Arg(i int) string { + return CommandLine.Arg(i) +} + +// NArg is the number of arguments remaining after flags have been processed. +func (f *FlagSet) NArg() int { return len(f.args) } + +// NArg is the number of arguments remaining after flags have been processed. +func NArg() int { return len(CommandLine.args) } + +// Args returns the non-flag arguments. +func (f *FlagSet) Args() []string { return f.args } + +// Args returns the non-flag command-line arguments. +func Args() []string { return CommandLine.args } + +// Var defines a flag with the specified name and usage string. The type and +// value of the flag are represented by the first argument, of type Value, which +// typically holds a user-defined implementation of Value. For instance, the +// caller could create a flag that turns a comma-separated string into a slice +// of strings by giving the slice the methods of Value; in particular, Set would +// decompose the comma-separated string into the slice. +func (f *FlagSet) Var(value Value, name string, usage string) { + f.VarP(value, name, "", usage) +} + +// VarPF is like VarP, but returns the flag created +func (f *FlagSet) VarPF(value Value, name, shorthand, usage string) *Flag { + // Remember the default value as a string; it won't change. + flag := &Flag{ + Name: name, + Shorthand: shorthand, + Usage: usage, + Value: value, + DefValue: value.String(), + } + f.AddFlag(flag) + return flag +} + +// VarP is like Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) VarP(value Value, name, shorthand, usage string) { + f.VarPF(value, name, shorthand, usage) +} + +// AddFlag will add the flag to the FlagSet +func (f *FlagSet) AddFlag(flag *Flag) { + normalizedFlagName := f.normalizeFlagName(flag.Name) + + _, alreadyThere := f.formal[normalizedFlagName] + if alreadyThere { + msg := fmt.Sprintf("%s flag redefined: %s", f.name, flag.Name) + fmt.Fprintln(f.out(), msg) + panic(msg) // Happens only if flags are declared with identical names + } + if f.formal == nil { + f.formal = make(map[NormalizedName]*Flag) + } + + flag.Name = string(normalizedFlagName) + f.formal[normalizedFlagName] = flag + f.orderedFormal = append(f.orderedFormal, flag) + + if flag.Shorthand == "" { + return + } + if len(flag.Shorthand) > 1 { + msg := fmt.Sprintf("%q shorthand is more than one ASCII character", flag.Shorthand) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + if f.shorthands == nil { + f.shorthands = make(map[byte]*Flag) + } + c := flag.Shorthand[0] + used, alreadyThere := f.shorthands[c] + if alreadyThere { + msg := fmt.Sprintf("unable to redefine %q shorthand in %q flagset: it's already used for %q flag", c, f.name, used.Name) + fmt.Fprintf(f.out(), msg) + panic(msg) + } + f.shorthands[c] = flag +} + +// AddFlagSet adds one FlagSet to another. If a flag is already present in f +// the flag from newSet will be ignored. +func (f *FlagSet) AddFlagSet(newSet *FlagSet) { + if newSet == nil { + return + } + newSet.VisitAll(func(flag *Flag) { + if f.Lookup(flag.Name) == nil { + f.AddFlag(flag) + } + }) +} + +// Var defines a flag with the specified name and usage string. The type and +// value of the flag are represented by the first argument, of type Value, which +// typically holds a user-defined implementation of Value. For instance, the +// caller could create a flag that turns a comma-separated string into a slice +// of strings by giving the slice the methods of Value; in particular, Set would +// decompose the comma-separated string into the slice. +func Var(value Value, name string, usage string) { + CommandLine.VarP(value, name, "", usage) +} + +// VarP is like Var, but accepts a shorthand letter that can be used after a single dash. +func VarP(value Value, name, shorthand, usage string) { + CommandLine.VarP(value, name, shorthand, usage) +} + +// failf prints to standard error a formatted error and usage message and +// returns the error. +func (f *FlagSet) failf(format string, a ...interface{}) error { + err := fmt.Errorf(format, a...) + if f.errorHandling != ContinueOnError { + fmt.Fprintln(f.out(), err) + f.usage() + } + return err +} + +// usage calls the Usage method for the flag set, or the usage function if +// the flag set is CommandLine. +func (f *FlagSet) usage() { + if f == CommandLine { + Usage() + } else if f.Usage == nil { + defaultUsage(f) + } else { + f.Usage() + } +} + +//--unknown (args will be empty) +//--unknown --next-flag ... (args will be --next-flag ...) +//--unknown arg ... (args will be arg ...) +func stripUnknownFlagValue(args []string) []string { + if len(args) == 0 { + //--unknown + return args + } + + first := args[0] + if first[0] == '-' { + //--unknown --next-flag ... + return args + } + + //--unknown arg ... (args will be arg ...) + return args[1:] +} + +func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []string, err error) { + a = args + name := s[2:] + if len(name) == 0 || name[0] == '-' || name[0] == '=' { + err = f.failf("bad flag syntax: %s", s) + return + } + + split := strings.SplitN(name, "=", 2) + name = split[0] + flag, exists := f.formal[f.normalizeFlagName(name)] + + if !exists { + switch { + case name == "help": + f.usage() + return a, ErrHelp + case f.ParseErrorsWhitelist.UnknownFlags: + // --unknown=unknownval arg ... + // we do not want to lose arg in this case + if len(split) >= 2 { + return a, nil + } + + return stripUnknownFlagValue(a), nil + default: + err = f.failf("unknown flag: --%s", name) + return + } + } + + var value string + if len(split) == 2 { + // '--flag=arg' + value = split[1] + } else if flag.NoOptDefVal != "" { + // '--flag' (arg was optional) + value = flag.NoOptDefVal + } else if len(a) > 0 { + // '--flag arg' + value = a[0] + a = a[1:] + } else { + // '--flag' (arg was required) + err = f.failf("flag needs an argument: %s", s) + return + } + + err = fn(flag, value) + if err != nil { + f.failf(err.Error()) + } + return +} + +func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parseFunc) (outShorts string, outArgs []string, err error) { + if strings.HasPrefix(shorthands, "test.") { + return + } + + outArgs = args + outShorts = shorthands[1:] + c := shorthands[0] + + flag, exists := f.shorthands[c] + if !exists { + switch { + case c == 'h': + f.usage() + err = ErrHelp + return + case f.ParseErrorsWhitelist.UnknownFlags: + // '-f=arg arg ...' + // we do not want to lose arg in this case + if len(shorthands) > 2 && shorthands[1] == '=' { + outShorts = "" + return + } + + outArgs = stripUnknownFlagValue(outArgs) + return + default: + err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands) + return + } + } + + var value string + if len(shorthands) > 2 && shorthands[1] == '=' { + // '-f=arg' + value = shorthands[2:] + outShorts = "" + } else if flag.NoOptDefVal != "" { + // '-f' (arg was optional) + value = flag.NoOptDefVal + } else if len(shorthands) > 1 { + // '-farg' + value = shorthands[1:] + outShorts = "" + } else if len(args) > 0 { + // '-f arg' + value = args[0] + outArgs = args[1:] + } else { + // '-f' (arg was required) + err = f.failf("flag needs an argument: %q in -%s", c, shorthands) + return + } + + if flag.ShorthandDeprecated != "" { + fmt.Fprintf(f.out(), "Flag shorthand -%s has been deprecated, %s\n", flag.Shorthand, flag.ShorthandDeprecated) + } + + err = fn(flag, value) + if err != nil { + f.failf(err.Error()) + } + return +} + +func (f *FlagSet) parseShortArg(s string, args []string, fn parseFunc) (a []string, err error) { + a = args + shorthands := s[1:] + + // "shorthands" can be a series of shorthand letters of flags (e.g. "-vvv"). + for len(shorthands) > 0 { + shorthands, a, err = f.parseSingleShortArg(shorthands, args, fn) + if err != nil { + return + } + } + + return +} + +func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) { + for len(args) > 0 { + s := args[0] + args = args[1:] + if len(s) == 0 || s[0] != '-' || len(s) == 1 { + if !f.interspersed { + f.args = append(f.args, s) + f.args = append(f.args, args...) + return nil + } + f.args = append(f.args, s) + continue + } + + if s[1] == '-' { + if len(s) == 2 { // "--" terminates the flags + f.argsLenAtDash = len(f.args) + f.args = append(f.args, args...) + break + } + args, err = f.parseLongArg(s, args, fn) + } else { + args, err = f.parseShortArg(s, args, fn) + } + if err != nil { + return + } + } + return +} + +// Parse parses flag definitions from the argument list, which should not +// include the command name. Must be called after all flags in the FlagSet +// are defined and before flags are accessed by the program. +// The return value will be ErrHelp if -help was set but not defined. +func (f *FlagSet) Parse(arguments []string) error { + if f.addedGoFlagSets != nil { + for _, goFlagSet := range f.addedGoFlagSets { + goFlagSet.Parse(nil) + } + } + f.parsed = true + + if len(arguments) < 0 { + return nil + } + + f.args = make([]string, 0, len(arguments)) + + set := func(flag *Flag, value string) error { + return f.Set(flag.Name, value) + } + + err := f.parseArgs(arguments, set) + if err != nil { + switch f.errorHandling { + case ContinueOnError: + return err + case ExitOnError: + fmt.Println(err) + os.Exit(2) + case PanicOnError: + panic(err) + } + } + return nil +} + +type parseFunc func(flag *Flag, value string) error + +// ParseAll parses flag definitions from the argument list, which should not +// include the command name. The arguments for fn are flag and value. Must be +// called after all flags in the FlagSet are defined and before flags are +// accessed by the program. The return value will be ErrHelp if -help was set +// but not defined. +func (f *FlagSet) ParseAll(arguments []string, fn func(flag *Flag, value string) error) error { + f.parsed = true + f.args = make([]string, 0, len(arguments)) + + err := f.parseArgs(arguments, fn) + if err != nil { + switch f.errorHandling { + case ContinueOnError: + return err + case ExitOnError: + os.Exit(2) + case PanicOnError: + panic(err) + } + } + return nil +} + +// Parsed reports whether f.Parse has been called. +func (f *FlagSet) Parsed() bool { + return f.parsed +} + +// Parse parses the command-line flags from os.Args[1:]. Must be called +// after all flags are defined and before flags are accessed by the program. +func Parse() { + // Ignore errors; CommandLine is set for ExitOnError. + CommandLine.Parse(os.Args[1:]) +} + +// ParseAll parses the command-line flags from os.Args[1:] and called fn for each. +// The arguments for fn are flag and value. Must be called after all flags are +// defined and before flags are accessed by the program. +func ParseAll(fn func(flag *Flag, value string) error) { + // Ignore errors; CommandLine is set for ExitOnError. + CommandLine.ParseAll(os.Args[1:], fn) +} + +// SetInterspersed sets whether to support interspersed option/non-option arguments. +func SetInterspersed(interspersed bool) { + CommandLine.SetInterspersed(interspersed) +} + +// Parsed returns true if the command-line flags have been parsed. +func Parsed() bool { + return CommandLine.Parsed() +} + +// CommandLine is the default set of command-line flags, parsed from os.Args. +var CommandLine = NewFlagSet(os.Args[0], ExitOnError) + +// NewFlagSet returns a new, empty flag set with the specified name, +// error handling property and SortFlags set to true. +func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet { + f := &FlagSet{ + name: name, + errorHandling: errorHandling, + argsLenAtDash: -1, + interspersed: true, + SortFlags: true, + } + return f +} + +// SetInterspersed sets whether to support interspersed option/non-option arguments. +func (f *FlagSet) SetInterspersed(interspersed bool) { + f.interspersed = interspersed +} + +// Init sets the name and error handling property for a flag set. +// By default, the zero FlagSet uses an empty name and the +// ContinueOnError error handling policy. +func (f *FlagSet) Init(name string, errorHandling ErrorHandling) { + f.name = name + f.errorHandling = errorHandling + f.argsLenAtDash = -1 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float32.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float32.go new file mode 100755 index 0000000..a243f81 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- float32 Value +type float32Value float32 + +func newFloat32Value(val float32, p *float32) *float32Value { + *p = val + return (*float32Value)(p) +} + +func (f *float32Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 32) + *f = float32Value(v) + return err +} + +func (f *float32Value) Type() string { + return "float32" +} + +func (f *float32Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 32) } + +func float32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseFloat(sval, 32) + if err != nil { + return 0, err + } + return float32(v), nil +} + +// GetFloat32 return the float32 value of a flag with the given name +func (f *FlagSet) GetFloat32(name string) (float32, error) { + val, err := f.getFlagType(name, "float32", float32Conv) + if err != nil { + return 0, err + } + return val.(float32), nil +} + +// Float32Var defines a float32 flag with specified name, default value, and usage string. +// The argument p points to a float32 variable in which to store the value of the flag. +func (f *FlagSet) Float32Var(p *float32, name string, value float32, usage string) { + f.VarP(newFloat32Value(value, p), name, "", usage) +} + +// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32VarP(p *float32, name, shorthand string, value float32, usage string) { + f.VarP(newFloat32Value(value, p), name, shorthand, usage) +} + +// Float32Var defines a float32 flag with specified name, default value, and usage string. +// The argument p points to a float32 variable in which to store the value of the flag. +func Float32Var(p *float32, name string, value float32, usage string) { + CommandLine.VarP(newFloat32Value(value, p), name, "", usage) +} + +// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash. +func Float32VarP(p *float32, name, shorthand string, value float32, usage string) { + CommandLine.VarP(newFloat32Value(value, p), name, shorthand, usage) +} + +// Float32 defines a float32 flag with specified name, default value, and usage string. +// The return value is the address of a float32 variable that stores the value of the flag. +func (f *FlagSet) Float32(name string, value float32, usage string) *float32 { + p := new(float32) + f.Float32VarP(p, name, "", value, usage) + return p +} + +// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float32P(name, shorthand string, value float32, usage string) *float32 { + p := new(float32) + f.Float32VarP(p, name, shorthand, value, usage) + return p +} + +// Float32 defines a float32 flag with specified name, default value, and usage string. +// The return value is the address of a float32 variable that stores the value of the flag. +func Float32(name string, value float32, usage string) *float32 { + return CommandLine.Float32P(name, "", value, usage) +} + +// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash. +func Float32P(name, shorthand string, value float32, usage string) *float32 { + return CommandLine.Float32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float64.go new file mode 100755 index 0000000..04b5492 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/float64.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- float64 Value +type float64Value float64 + +func newFloat64Value(val float64, p *float64) *float64Value { + *p = val + return (*float64Value)(p) +} + +func (f *float64Value) Set(s string) error { + v, err := strconv.ParseFloat(s, 64) + *f = float64Value(v) + return err +} + +func (f *float64Value) Type() string { + return "float64" +} + +func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) } + +func float64Conv(sval string) (interface{}, error) { + return strconv.ParseFloat(sval, 64) +} + +// GetFloat64 return the float64 value of a flag with the given name +func (f *FlagSet) GetFloat64(name string) (float64, error) { + val, err := f.getFlagType(name, "float64", float64Conv) + if err != nil { + return 0, err + } + return val.(float64), nil +} + +// Float64Var defines a float64 flag with specified name, default value, and usage string. +// The argument p points to a float64 variable in which to store the value of the flag. +func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) { + f.VarP(newFloat64Value(value, p), name, "", usage) +} + +// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64VarP(p *float64, name, shorthand string, value float64, usage string) { + f.VarP(newFloat64Value(value, p), name, shorthand, usage) +} + +// Float64Var defines a float64 flag with specified name, default value, and usage string. +// The argument p points to a float64 variable in which to store the value of the flag. +func Float64Var(p *float64, name string, value float64, usage string) { + CommandLine.VarP(newFloat64Value(value, p), name, "", usage) +} + +// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash. +func Float64VarP(p *float64, name, shorthand string, value float64, usage string) { + CommandLine.VarP(newFloat64Value(value, p), name, shorthand, usage) +} + +// Float64 defines a float64 flag with specified name, default value, and usage string. +// The return value is the address of a float64 variable that stores the value of the flag. +func (f *FlagSet) Float64(name string, value float64, usage string) *float64 { + p := new(float64) + f.Float64VarP(p, name, "", value, usage) + return p +} + +// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Float64P(name, shorthand string, value float64, usage string) *float64 { + p := new(float64) + f.Float64VarP(p, name, shorthand, value, usage) + return p +} + +// Float64 defines a float64 flag with specified name, default value, and usage string. +// The return value is the address of a float64 variable that stores the value of the flag. +func Float64(name string, value float64, usage string) *float64 { + return CommandLine.Float64P(name, "", value, usage) +} + +// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash. +func Float64P(name, shorthand string, value float64, usage string) *float64 { + return CommandLine.Float64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/golangflag.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/golangflag.go new file mode 100755 index 0000000..d3dd72b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/golangflag.go @@ -0,0 +1,105 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package pflag + +import ( + goflag "flag" + "reflect" + "strings" +) + +// flagValueWrapper implements pflag.Value around a flag.Value. The main +// difference here is the addition of the Type method that returns a string +// name of the type. As this is generally unknown, we approximate that with +// reflection. +type flagValueWrapper struct { + inner goflag.Value + flagType string +} + +// We are just copying the boolFlag interface out of goflag as that is what +// they use to decide if a flag should get "true" when no arg is given. +type goBoolFlag interface { + goflag.Value + IsBoolFlag() bool +} + +func wrapFlagValue(v goflag.Value) Value { + // If the flag.Value happens to also be a pflag.Value, just use it directly. + if pv, ok := v.(Value); ok { + return pv + } + + pv := &flagValueWrapper{ + inner: v, + } + + t := reflect.TypeOf(v) + if t.Kind() == reflect.Interface || t.Kind() == reflect.Ptr { + t = t.Elem() + } + + pv.flagType = strings.TrimSuffix(t.Name(), "Value") + return pv +} + +func (v *flagValueWrapper) String() string { + return v.inner.String() +} + +func (v *flagValueWrapper) Set(s string) error { + return v.inner.Set(s) +} + +func (v *flagValueWrapper) Type() string { + return v.flagType +} + +// PFlagFromGoFlag will return a *pflag.Flag given a *flag.Flag +// If the *flag.Flag.Name was a single character (ex: `v`) it will be accessiblei +// with both `-v` and `--v` in flags. If the golang flag was more than a single +// character (ex: `verbose`) it will only be accessible via `--verbose` +func PFlagFromGoFlag(goflag *goflag.Flag) *Flag { + // Remember the default value as a string; it won't change. + flag := &Flag{ + Name: goflag.Name, + Usage: goflag.Usage, + Value: wrapFlagValue(goflag.Value), + // Looks like golang flags don't set DefValue correctly :-( + //DefValue: goflag.DefValue, + DefValue: goflag.Value.String(), + } + // Ex: if the golang flag was -v, allow both -v and --v to work + if len(flag.Name) == 1 { + flag.Shorthand = flag.Name + } + if fv, ok := goflag.Value.(goBoolFlag); ok && fv.IsBoolFlag() { + flag.NoOptDefVal = "true" + } + return flag +} + +// AddGoFlag will add the given *flag.Flag to the pflag.FlagSet +func (f *FlagSet) AddGoFlag(goflag *goflag.Flag) { + if f.Lookup(goflag.Name) != nil { + return + } + newflag := PFlagFromGoFlag(goflag) + f.AddFlag(newflag) +} + +// AddGoFlagSet will add the given *flag.FlagSet to the pflag.FlagSet +func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) { + if newSet == nil { + return + } + newSet.VisitAll(func(goflag *goflag.Flag) { + f.AddGoFlag(goflag) + }) + if f.addedGoFlagSets == nil { + f.addedGoFlagSets = make([]*goflag.FlagSet, 0) + } + f.addedGoFlagSets = append(f.addedGoFlagSets, newSet) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int.go new file mode 100755 index 0000000..1474b89 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- int Value +type intValue int + +func newIntValue(val int, p *int) *intValue { + *p = val + return (*intValue)(p) +} + +func (i *intValue) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + *i = intValue(v) + return err +} + +func (i *intValue) Type() string { + return "int" +} + +func (i *intValue) String() string { return strconv.Itoa(int(*i)) } + +func intConv(sval string) (interface{}, error) { + return strconv.Atoi(sval) +} + +// GetInt return the int value of a flag with the given name +func (f *FlagSet) GetInt(name string) (int, error) { + val, err := f.getFlagType(name, "int", intConv) + if err != nil { + return 0, err + } + return val.(int), nil +} + +// IntVar defines an int flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +func (f *FlagSet) IntVar(p *int, name string, value int, usage string) { + f.VarP(newIntValue(value, p), name, "", usage) +} + +// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntVarP(p *int, name, shorthand string, value int, usage string) { + f.VarP(newIntValue(value, p), name, shorthand, usage) +} + +// IntVar defines an int flag with specified name, default value, and usage string. +// The argument p points to an int variable in which to store the value of the flag. +func IntVar(p *int, name string, value int, usage string) { + CommandLine.VarP(newIntValue(value, p), name, "", usage) +} + +// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash. +func IntVarP(p *int, name, shorthand string, value int, usage string) { + CommandLine.VarP(newIntValue(value, p), name, shorthand, usage) +} + +// Int defines an int flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +func (f *FlagSet) Int(name string, value int, usage string) *int { + p := new(int) + f.IntVarP(p, name, "", value, usage) + return p +} + +// IntP is like Int, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntP(name, shorthand string, value int, usage string) *int { + p := new(int) + f.IntVarP(p, name, shorthand, value, usage) + return p +} + +// Int defines an int flag with specified name, default value, and usage string. +// The return value is the address of an int variable that stores the value of the flag. +func Int(name string, value int, usage string) *int { + return CommandLine.IntP(name, "", value, usage) +} + +// IntP is like Int, but accepts a shorthand letter that can be used after a single dash. +func IntP(name, shorthand string, value int, usage string) *int { + return CommandLine.IntP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int16.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int16.go new file mode 100755 index 0000000..f1a01d0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int16.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int16 Value +type int16Value int16 + +func newInt16Value(val int16, p *int16) *int16Value { + *p = val + return (*int16Value)(p) +} + +func (i *int16Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 16) + *i = int16Value(v) + return err +} + +func (i *int16Value) Type() string { + return "int16" +} + +func (i *int16Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int16Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 16) + if err != nil { + return 0, err + } + return int16(v), nil +} + +// GetInt16 returns the int16 value of a flag with the given name +func (f *FlagSet) GetInt16(name string) (int16, error) { + val, err := f.getFlagType(name, "int16", int16Conv) + if err != nil { + return 0, err + } + return val.(int16), nil +} + +// Int16Var defines an int16 flag with specified name, default value, and usage string. +// The argument p points to an int16 variable in which to store the value of the flag. +func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage string) { + f.VarP(newInt16Value(value, p), name, "", usage) +} + +// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int16, usage string) { + f.VarP(newInt16Value(value, p), name, shorthand, usage) +} + +// Int16Var defines an int16 flag with specified name, default value, and usage string. +// The argument p points to an int16 variable in which to store the value of the flag. +func Int16Var(p *int16, name string, value int16, usage string) { + CommandLine.VarP(newInt16Value(value, p), name, "", usage) +} + +// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash. +func Int16VarP(p *int16, name, shorthand string, value int16, usage string) { + CommandLine.VarP(newInt16Value(value, p), name, shorthand, usage) +} + +// Int16 defines an int16 flag with specified name, default value, and usage string. +// The return value is the address of an int16 variable that stores the value of the flag. +func (f *FlagSet) Int16(name string, value int16, usage string) *int16 { + p := new(int16) + f.Int16VarP(p, name, "", value, usage) + return p +} + +// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int16P(name, shorthand string, value int16, usage string) *int16 { + p := new(int16) + f.Int16VarP(p, name, shorthand, value, usage) + return p +} + +// Int16 defines an int16 flag with specified name, default value, and usage string. +// The return value is the address of an int16 variable that stores the value of the flag. +func Int16(name string, value int16, usage string) *int16 { + return CommandLine.Int16P(name, "", value, usage) +} + +// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash. +func Int16P(name, shorthand string, value int16, usage string) *int16 { + return CommandLine.Int16P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int32.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int32.go new file mode 100755 index 0000000..9b95944 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int32 Value +type int32Value int32 + +func newInt32Value(val int32, p *int32) *int32Value { + *p = val + return (*int32Value)(p) +} + +func (i *int32Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 32) + *i = int32Value(v) + return err +} + +func (i *int32Value) Type() string { + return "int32" +} + +func (i *int32Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 32) + if err != nil { + return 0, err + } + return int32(v), nil +} + +// GetInt32 return the int32 value of a flag with the given name +func (f *FlagSet) GetInt32(name string) (int32, error) { + val, err := f.getFlagType(name, "int32", int32Conv) + if err != nil { + return 0, err + } + return val.(int32), nil +} + +// Int32Var defines an int32 flag with specified name, default value, and usage string. +// The argument p points to an int32 variable in which to store the value of the flag. +func (f *FlagSet) Int32Var(p *int32, name string, value int32, usage string) { + f.VarP(newInt32Value(value, p), name, "", usage) +} + +// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32VarP(p *int32, name, shorthand string, value int32, usage string) { + f.VarP(newInt32Value(value, p), name, shorthand, usage) +} + +// Int32Var defines an int32 flag with specified name, default value, and usage string. +// The argument p points to an int32 variable in which to store the value of the flag. +func Int32Var(p *int32, name string, value int32, usage string) { + CommandLine.VarP(newInt32Value(value, p), name, "", usage) +} + +// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash. +func Int32VarP(p *int32, name, shorthand string, value int32, usage string) { + CommandLine.VarP(newInt32Value(value, p), name, shorthand, usage) +} + +// Int32 defines an int32 flag with specified name, default value, and usage string. +// The return value is the address of an int32 variable that stores the value of the flag. +func (f *FlagSet) Int32(name string, value int32, usage string) *int32 { + p := new(int32) + f.Int32VarP(p, name, "", value, usage) + return p +} + +// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int32P(name, shorthand string, value int32, usage string) *int32 { + p := new(int32) + f.Int32VarP(p, name, shorthand, value, usage) + return p +} + +// Int32 defines an int32 flag with specified name, default value, and usage string. +// The return value is the address of an int32 variable that stores the value of the flag. +func Int32(name string, value int32, usage string) *int32 { + return CommandLine.Int32P(name, "", value, usage) +} + +// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash. +func Int32P(name, shorthand string, value int32, usage string) *int32 { + return CommandLine.Int32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int64.go new file mode 100755 index 0000000..0026d78 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int64.go @@ -0,0 +1,84 @@ +package pflag + +import "strconv" + +// -- int64 Value +type int64Value int64 + +func newInt64Value(val int64, p *int64) *int64Value { + *p = val + return (*int64Value)(p) +} + +func (i *int64Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 64) + *i = int64Value(v) + return err +} + +func (i *int64Value) Type() string { + return "int64" +} + +func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int64Conv(sval string) (interface{}, error) { + return strconv.ParseInt(sval, 0, 64) +} + +// GetInt64 return the int64 value of a flag with the given name +func (f *FlagSet) GetInt64(name string) (int64, error) { + val, err := f.getFlagType(name, "int64", int64Conv) + if err != nil { + return 0, err + } + return val.(int64), nil +} + +// Int64Var defines an int64 flag with specified name, default value, and usage string. +// The argument p points to an int64 variable in which to store the value of the flag. +func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) { + f.VarP(newInt64Value(value, p), name, "", usage) +} + +// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64VarP(p *int64, name, shorthand string, value int64, usage string) { + f.VarP(newInt64Value(value, p), name, shorthand, usage) +} + +// Int64Var defines an int64 flag with specified name, default value, and usage string. +// The argument p points to an int64 variable in which to store the value of the flag. +func Int64Var(p *int64, name string, value int64, usage string) { + CommandLine.VarP(newInt64Value(value, p), name, "", usage) +} + +// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash. +func Int64VarP(p *int64, name, shorthand string, value int64, usage string) { + CommandLine.VarP(newInt64Value(value, p), name, shorthand, usage) +} + +// Int64 defines an int64 flag with specified name, default value, and usage string. +// The return value is the address of an int64 variable that stores the value of the flag. +func (f *FlagSet) Int64(name string, value int64, usage string) *int64 { + p := new(int64) + f.Int64VarP(p, name, "", value, usage) + return p +} + +// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int64P(name, shorthand string, value int64, usage string) *int64 { + p := new(int64) + f.Int64VarP(p, name, shorthand, value, usage) + return p +} + +// Int64 defines an int64 flag with specified name, default value, and usage string. +// The return value is the address of an int64 variable that stores the value of the flag. +func Int64(name string, value int64, usage string) *int64 { + return CommandLine.Int64P(name, "", value, usage) +} + +// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash. +func Int64P(name, shorthand string, value int64, usage string) *int64 { + return CommandLine.Int64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int8.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int8.go new file mode 100755 index 0000000..4da9222 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int8.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- int8 Value +type int8Value int8 + +func newInt8Value(val int8, p *int8) *int8Value { + *p = val + return (*int8Value)(p) +} + +func (i *int8Value) Set(s string) error { + v, err := strconv.ParseInt(s, 0, 8) + *i = int8Value(v) + return err +} + +func (i *int8Value) Type() string { + return "int8" +} + +func (i *int8Value) String() string { return strconv.FormatInt(int64(*i), 10) } + +func int8Conv(sval string) (interface{}, error) { + v, err := strconv.ParseInt(sval, 0, 8) + if err != nil { + return 0, err + } + return int8(v), nil +} + +// GetInt8 return the int8 value of a flag with the given name +func (f *FlagSet) GetInt8(name string) (int8, error) { + val, err := f.getFlagType(name, "int8", int8Conv) + if err != nil { + return 0, err + } + return val.(int8), nil +} + +// Int8Var defines an int8 flag with specified name, default value, and usage string. +// The argument p points to an int8 variable in which to store the value of the flag. +func (f *FlagSet) Int8Var(p *int8, name string, value int8, usage string) { + f.VarP(newInt8Value(value, p), name, "", usage) +} + +// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int8VarP(p *int8, name, shorthand string, value int8, usage string) { + f.VarP(newInt8Value(value, p), name, shorthand, usage) +} + +// Int8Var defines an int8 flag with specified name, default value, and usage string. +// The argument p points to an int8 variable in which to store the value of the flag. +func Int8Var(p *int8, name string, value int8, usage string) { + CommandLine.VarP(newInt8Value(value, p), name, "", usage) +} + +// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash. +func Int8VarP(p *int8, name, shorthand string, value int8, usage string) { + CommandLine.VarP(newInt8Value(value, p), name, shorthand, usage) +} + +// Int8 defines an int8 flag with specified name, default value, and usage string. +// The return value is the address of an int8 variable that stores the value of the flag. +func (f *FlagSet) Int8(name string, value int8, usage string) *int8 { + p := new(int8) + f.Int8VarP(p, name, "", value, usage) + return p +} + +// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Int8P(name, shorthand string, value int8, usage string) *int8 { + p := new(int8) + f.Int8VarP(p, name, shorthand, value, usage) + return p +} + +// Int8 defines an int8 flag with specified name, default value, and usage string. +// The return value is the address of an int8 variable that stores the value of the flag. +func Int8(name string, value int8, usage string) *int8 { + return CommandLine.Int8P(name, "", value, usage) +} + +// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash. +func Int8P(name, shorthand string, value int8, usage string) *int8 { + return CommandLine.Int8P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int_slice.go new file mode 100755 index 0000000..1e7c9ed --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/int_slice.go @@ -0,0 +1,128 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- intSlice Value +type intSliceValue struct { + value *[]int + changed bool +} + +func newIntSliceValue(val []int, p *[]int) *intSliceValue { + isv := new(intSliceValue) + isv.value = p + *isv.value = val + return isv +} + +func (s *intSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]int, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.Atoi(d) + if err != nil { + return err + } + + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *intSliceValue) Type() string { + return "intSlice" +} + +func (s *intSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func intSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []int{}, nil + } + ss := strings.Split(val, ",") + out := make([]int, len(ss)) + for i, d := range ss { + var err error + out[i], err = strconv.Atoi(d) + if err != nil { + return nil, err + } + + } + return out, nil +} + +// GetIntSlice return the []int value of a flag with the given name +func (f *FlagSet) GetIntSlice(name string) ([]int, error) { + val, err := f.getFlagType(name, "intSlice", intSliceConv) + if err != nil { + return []int{}, err + } + return val.([]int), nil +} + +// IntSliceVar defines a intSlice flag with specified name, default value, and usage string. +// The argument p points to a []int variable in which to store the value of the flag. +func (f *FlagSet) IntSliceVar(p *[]int, name string, value []int, usage string) { + f.VarP(newIntSliceValue(value, p), name, "", usage) +} + +// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) { + f.VarP(newIntSliceValue(value, p), name, shorthand, usage) +} + +// IntSliceVar defines a int[] flag with specified name, default value, and usage string. +// The argument p points to a int[] variable in which to store the value of the flag. +func IntSliceVar(p *[]int, name string, value []int, usage string) { + CommandLine.VarP(newIntSliceValue(value, p), name, "", usage) +} + +// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash. +func IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) { + CommandLine.VarP(newIntSliceValue(value, p), name, shorthand, usage) +} + +// IntSlice defines a []int flag with specified name, default value, and usage string. +// The return value is the address of a []int variable that stores the value of the flag. +func (f *FlagSet) IntSlice(name string, value []int, usage string) *[]int { + p := []int{} + f.IntSliceVarP(&p, name, "", value, usage) + return &p +} + +// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IntSliceP(name, shorthand string, value []int, usage string) *[]int { + p := []int{} + f.IntSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// IntSlice defines a []int flag with specified name, default value, and usage string. +// The return value is the address of a []int variable that stores the value of the flag. +func IntSlice(name string, value []int, usage string) *[]int { + return CommandLine.IntSliceP(name, "", value, usage) +} + +// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash. +func IntSliceP(name, shorthand string, value []int, usage string) *[]int { + return CommandLine.IntSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip.go new file mode 100755 index 0000000..3d414ba --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip.go @@ -0,0 +1,94 @@ +package pflag + +import ( + "fmt" + "net" + "strings" +) + +// -- net.IP value +type ipValue net.IP + +func newIPValue(val net.IP, p *net.IP) *ipValue { + *p = val + return (*ipValue)(p) +} + +func (i *ipValue) String() string { return net.IP(*i).String() } +func (i *ipValue) Set(s string) error { + ip := net.ParseIP(strings.TrimSpace(s)) + if ip == nil { + return fmt.Errorf("failed to parse IP: %q", s) + } + *i = ipValue(ip) + return nil +} + +func (i *ipValue) Type() string { + return "ip" +} + +func ipConv(sval string) (interface{}, error) { + ip := net.ParseIP(sval) + if ip != nil { + return ip, nil + } + return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval) +} + +// GetIP return the net.IP value of a flag with the given name +func (f *FlagSet) GetIP(name string) (net.IP, error) { + val, err := f.getFlagType(name, "ip", ipConv) + if err != nil { + return nil, err + } + return val.(net.IP), nil +} + +// IPVar defines an net.IP flag with specified name, default value, and usage string. +// The argument p points to an net.IP variable in which to store the value of the flag. +func (f *FlagSet) IPVar(p *net.IP, name string, value net.IP, usage string) { + f.VarP(newIPValue(value, p), name, "", usage) +} + +// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) { + f.VarP(newIPValue(value, p), name, shorthand, usage) +} + +// IPVar defines an net.IP flag with specified name, default value, and usage string. +// The argument p points to an net.IP variable in which to store the value of the flag. +func IPVar(p *net.IP, name string, value net.IP, usage string) { + CommandLine.VarP(newIPValue(value, p), name, "", usage) +} + +// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash. +func IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) { + CommandLine.VarP(newIPValue(value, p), name, shorthand, usage) +} + +// IP defines an net.IP flag with specified name, default value, and usage string. +// The return value is the address of an net.IP variable that stores the value of the flag. +func (f *FlagSet) IP(name string, value net.IP, usage string) *net.IP { + p := new(net.IP) + f.IPVarP(p, name, "", value, usage) + return p +} + +// IPP is like IP, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPP(name, shorthand string, value net.IP, usage string) *net.IP { + p := new(net.IP) + f.IPVarP(p, name, shorthand, value, usage) + return p +} + +// IP defines an net.IP flag with specified name, default value, and usage string. +// The return value is the address of an net.IP variable that stores the value of the flag. +func IP(name string, value net.IP, usage string) *net.IP { + return CommandLine.IPP(name, "", value, usage) +} + +// IPP is like IP, but accepts a shorthand letter that can be used after a single dash. +func IPP(name, shorthand string, value net.IP, usage string) *net.IP { + return CommandLine.IPP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip_slice.go new file mode 100755 index 0000000..7dd196f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ip_slice.go @@ -0,0 +1,148 @@ +package pflag + +import ( + "fmt" + "io" + "net" + "strings" +) + +// -- ipSlice Value +type ipSliceValue struct { + value *[]net.IP + changed bool +} + +func newIPSliceValue(val []net.IP, p *[]net.IP) *ipSliceValue { + ipsv := new(ipSliceValue) + ipsv.value = p + *ipsv.value = val + return ipsv +} + +// Set converts, and assigns, the comma-separated IP argument string representation as the []net.IP value of this flag. +// If Set is called on a flag that already has a []net.IP assigned, the newly converted values will be appended. +func (s *ipSliceValue) Set(val string) error { + + // remove all quote characters + rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "") + + // read flag arguments with CSV parser + ipStrSlice, err := readAsCSV(rmQuote.Replace(val)) + if err != nil && err != io.EOF { + return err + } + + // parse ip values into slice + out := make([]net.IP, 0, len(ipStrSlice)) + for _, ipStr := range ipStrSlice { + ip := net.ParseIP(strings.TrimSpace(ipStr)) + if ip == nil { + return fmt.Errorf("invalid string being converted to IP address: %s", ipStr) + } + out = append(out, ip) + } + + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + + s.changed = true + + return nil +} + +// Type returns a string that uniquely represents this flag's type. +func (s *ipSliceValue) Type() string { + return "ipSlice" +} + +// String defines a "native" format for this net.IP slice flag value. +func (s *ipSliceValue) String() string { + + ipStrSlice := make([]string, len(*s.value)) + for i, ip := range *s.value { + ipStrSlice[i] = ip.String() + } + + out, _ := writeAsCSV(ipStrSlice) + + return "[" + out + "]" +} + +func ipSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Emtpy string would cause a slice with one (empty) entry + if len(val) == 0 { + return []net.IP{}, nil + } + ss := strings.Split(val, ",") + out := make([]net.IP, len(ss)) + for i, sval := range ss { + ip := net.ParseIP(strings.TrimSpace(sval)) + if ip == nil { + return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval) + } + out[i] = ip + } + return out, nil +} + +// GetIPSlice returns the []net.IP value of a flag with the given name +func (f *FlagSet) GetIPSlice(name string) ([]net.IP, error) { + val, err := f.getFlagType(name, "ipSlice", ipSliceConv) + if err != nil { + return []net.IP{}, err + } + return val.([]net.IP), nil +} + +// IPSliceVar defines a ipSlice flag with specified name, default value, and usage string. +// The argument p points to a []net.IP variable in which to store the value of the flag. +func (f *FlagSet) IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) { + f.VarP(newIPSliceValue(value, p), name, "", usage) +} + +// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) { + f.VarP(newIPSliceValue(value, p), name, shorthand, usage) +} + +// IPSliceVar defines a []net.IP flag with specified name, default value, and usage string. +// The argument p points to a []net.IP variable in which to store the value of the flag. +func IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) { + CommandLine.VarP(newIPSliceValue(value, p), name, "", usage) +} + +// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash. +func IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) { + CommandLine.VarP(newIPSliceValue(value, p), name, shorthand, usage) +} + +// IPSlice defines a []net.IP flag with specified name, default value, and usage string. +// The return value is the address of a []net.IP variable that stores the value of that flag. +func (f *FlagSet) IPSlice(name string, value []net.IP, usage string) *[]net.IP { + p := []net.IP{} + f.IPSliceVarP(&p, name, "", value, usage) + return &p +} + +// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP { + p := []net.IP{} + f.IPSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// IPSlice defines a []net.IP flag with specified name, default value, and usage string. +// The return value is the address of a []net.IP variable that stores the value of the flag. +func IPSlice(name string, value []net.IP, usage string) *[]net.IP { + return CommandLine.IPSliceP(name, "", value, usage) +} + +// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash. +func IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP { + return CommandLine.IPSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipmask.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipmask.go new file mode 100755 index 0000000..5bd44bd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipmask.go @@ -0,0 +1,122 @@ +package pflag + +import ( + "fmt" + "net" + "strconv" +) + +// -- net.IPMask value +type ipMaskValue net.IPMask + +func newIPMaskValue(val net.IPMask, p *net.IPMask) *ipMaskValue { + *p = val + return (*ipMaskValue)(p) +} + +func (i *ipMaskValue) String() string { return net.IPMask(*i).String() } +func (i *ipMaskValue) Set(s string) error { + ip := ParseIPv4Mask(s) + if ip == nil { + return fmt.Errorf("failed to parse IP mask: %q", s) + } + *i = ipMaskValue(ip) + return nil +} + +func (i *ipMaskValue) Type() string { + return "ipMask" +} + +// ParseIPv4Mask written in IP form (e.g. 255.255.255.0). +// This function should really belong to the net package. +func ParseIPv4Mask(s string) net.IPMask { + mask := net.ParseIP(s) + if mask == nil { + if len(s) != 8 { + return nil + } + // net.IPMask.String() actually outputs things like ffffff00 + // so write a horrible parser for that as well :-( + m := []int{} + for i := 0; i < 4; i++ { + b := "0x" + s[2*i:2*i+2] + d, err := strconv.ParseInt(b, 0, 0) + if err != nil { + return nil + } + m = append(m, int(d)) + } + s := fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3]) + mask = net.ParseIP(s) + if mask == nil { + return nil + } + } + return net.IPv4Mask(mask[12], mask[13], mask[14], mask[15]) +} + +func parseIPv4Mask(sval string) (interface{}, error) { + mask := ParseIPv4Mask(sval) + if mask == nil { + return nil, fmt.Errorf("unable to parse %s as net.IPMask", sval) + } + return mask, nil +} + +// GetIPv4Mask return the net.IPv4Mask value of a flag with the given name +func (f *FlagSet) GetIPv4Mask(name string) (net.IPMask, error) { + val, err := f.getFlagType(name, "ipMask", parseIPv4Mask) + if err != nil { + return nil, err + } + return val.(net.IPMask), nil +} + +// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string. +// The argument p points to an net.IPMask variable in which to store the value of the flag. +func (f *FlagSet) IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) { + f.VarP(newIPMaskValue(value, p), name, "", usage) +} + +// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) { + f.VarP(newIPMaskValue(value, p), name, shorthand, usage) +} + +// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string. +// The argument p points to an net.IPMask variable in which to store the value of the flag. +func IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) { + CommandLine.VarP(newIPMaskValue(value, p), name, "", usage) +} + +// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash. +func IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) { + CommandLine.VarP(newIPMaskValue(value, p), name, shorthand, usage) +} + +// IPMask defines an net.IPMask flag with specified name, default value, and usage string. +// The return value is the address of an net.IPMask variable that stores the value of the flag. +func (f *FlagSet) IPMask(name string, value net.IPMask, usage string) *net.IPMask { + p := new(net.IPMask) + f.IPMaskVarP(p, name, "", value, usage) + return p +} + +// IPMaskP is like IPMask, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask { + p := new(net.IPMask) + f.IPMaskVarP(p, name, shorthand, value, usage) + return p +} + +// IPMask defines an net.IPMask flag with specified name, default value, and usage string. +// The return value is the address of an net.IPMask variable that stores the value of the flag. +func IPMask(name string, value net.IPMask, usage string) *net.IPMask { + return CommandLine.IPMaskP(name, "", value, usage) +} + +// IPMaskP is like IP, but accepts a shorthand letter that can be used after a single dash. +func IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask { + return CommandLine.IPMaskP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipnet.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipnet.go new file mode 100755 index 0000000..e2c1b8b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/ipnet.go @@ -0,0 +1,98 @@ +package pflag + +import ( + "fmt" + "net" + "strings" +) + +// IPNet adapts net.IPNet for use as a flag. +type ipNetValue net.IPNet + +func (ipnet ipNetValue) String() string { + n := net.IPNet(ipnet) + return n.String() +} + +func (ipnet *ipNetValue) Set(value string) error { + _, n, err := net.ParseCIDR(strings.TrimSpace(value)) + if err != nil { + return err + } + *ipnet = ipNetValue(*n) + return nil +} + +func (*ipNetValue) Type() string { + return "ipNet" +} + +func newIPNetValue(val net.IPNet, p *net.IPNet) *ipNetValue { + *p = val + return (*ipNetValue)(p) +} + +func ipNetConv(sval string) (interface{}, error) { + _, n, err := net.ParseCIDR(strings.TrimSpace(sval)) + if err == nil { + return *n, nil + } + return nil, fmt.Errorf("invalid string being converted to IPNet: %s", sval) +} + +// GetIPNet return the net.IPNet value of a flag with the given name +func (f *FlagSet) GetIPNet(name string) (net.IPNet, error) { + val, err := f.getFlagType(name, "ipNet", ipNetConv) + if err != nil { + return net.IPNet{}, err + } + return val.(net.IPNet), nil +} + +// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string. +// The argument p points to an net.IPNet variable in which to store the value of the flag. +func (f *FlagSet) IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) { + f.VarP(newIPNetValue(value, p), name, "", usage) +} + +// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) { + f.VarP(newIPNetValue(value, p), name, shorthand, usage) +} + +// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string. +// The argument p points to an net.IPNet variable in which to store the value of the flag. +func IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) { + CommandLine.VarP(newIPNetValue(value, p), name, "", usage) +} + +// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash. +func IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) { + CommandLine.VarP(newIPNetValue(value, p), name, shorthand, usage) +} + +// IPNet defines an net.IPNet flag with specified name, default value, and usage string. +// The return value is the address of an net.IPNet variable that stores the value of the flag. +func (f *FlagSet) IPNet(name string, value net.IPNet, usage string) *net.IPNet { + p := new(net.IPNet) + f.IPNetVarP(p, name, "", value, usage) + return p +} + +// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet { + p := new(net.IPNet) + f.IPNetVarP(p, name, shorthand, value, usage) + return p +} + +// IPNet defines an net.IPNet flag with specified name, default value, and usage string. +// The return value is the address of an net.IPNet variable that stores the value of the flag. +func IPNet(name string, value net.IPNet, usage string) *net.IPNet { + return CommandLine.IPNetP(name, "", value, usage) +} + +// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash. +func IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet { + return CommandLine.IPNetP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string.go new file mode 100755 index 0000000..04e0a26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string.go @@ -0,0 +1,80 @@ +package pflag + +// -- string Value +type stringValue string + +func newStringValue(val string, p *string) *stringValue { + *p = val + return (*stringValue)(p) +} + +func (s *stringValue) Set(val string) error { + *s = stringValue(val) + return nil +} +func (s *stringValue) Type() string { + return "string" +} + +func (s *stringValue) String() string { return string(*s) } + +func stringConv(sval string) (interface{}, error) { + return sval, nil +} + +// GetString return the string value of a flag with the given name +func (f *FlagSet) GetString(name string) (string, error) { + val, err := f.getFlagType(name, "string", stringConv) + if err != nil { + return "", err + } + return val.(string), nil +} + +// StringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a string variable in which to store the value of the flag. +func (f *FlagSet) StringVar(p *string, name string, value string, usage string) { + f.VarP(newStringValue(value, p), name, "", usage) +} + +// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringVarP(p *string, name, shorthand string, value string, usage string) { + f.VarP(newStringValue(value, p), name, shorthand, usage) +} + +// StringVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a string variable in which to store the value of the flag. +func StringVar(p *string, name string, value string, usage string) { + CommandLine.VarP(newStringValue(value, p), name, "", usage) +} + +// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash. +func StringVarP(p *string, name, shorthand string, value string, usage string) { + CommandLine.VarP(newStringValue(value, p), name, shorthand, usage) +} + +// String defines a string flag with specified name, default value, and usage string. +// The return value is the address of a string variable that stores the value of the flag. +func (f *FlagSet) String(name string, value string, usage string) *string { + p := new(string) + f.StringVarP(p, name, "", value, usage) + return p +} + +// StringP is like String, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringP(name, shorthand string, value string, usage string) *string { + p := new(string) + f.StringVarP(p, name, shorthand, value, usage) + return p +} + +// String defines a string flag with specified name, default value, and usage string. +// The return value is the address of a string variable that stores the value of the flag. +func String(name string, value string, usage string) *string { + return CommandLine.StringP(name, "", value, usage) +} + +// StringP is like String, but accepts a shorthand letter that can be used after a single dash. +func StringP(name, shorthand string, value string, usage string) *string { + return CommandLine.StringP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_array.go new file mode 100755 index 0000000..fa7bc60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_array.go @@ -0,0 +1,103 @@ +package pflag + +// -- stringArray Value +type stringArrayValue struct { + value *[]string + changed bool +} + +func newStringArrayValue(val []string, p *[]string) *stringArrayValue { + ssv := new(stringArrayValue) + ssv.value = p + *ssv.value = val + return ssv +} + +func (s *stringArrayValue) Set(val string) error { + if !s.changed { + *s.value = []string{val} + s.changed = true + } else { + *s.value = append(*s.value, val) + } + return nil +} + +func (s *stringArrayValue) Type() string { + return "stringArray" +} + +func (s *stringArrayValue) String() string { + str, _ := writeAsCSV(*s.value) + return "[" + str + "]" +} + +func stringArrayConv(sval string) (interface{}, error) { + sval = sval[1 : len(sval)-1] + // An empty string would cause a array with one (empty) string + if len(sval) == 0 { + return []string{}, nil + } + return readAsCSV(sval) +} + +// GetStringArray return the []string value of a flag with the given name +func (f *FlagSet) GetStringArray(name string) ([]string, error) { + val, err := f.getFlagType(name, "stringArray", stringArrayConv) + if err != nil { + return []string{}, err + } + return val.([]string), nil +} + +// StringArrayVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the values of the multiple flags. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) { + f.VarP(newStringArrayValue(value, p), name, "", usage) +} + +// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) { + f.VarP(newStringArrayValue(value, p), name, shorthand, usage) +} + +// StringArrayVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func StringArrayVar(p *[]string, name string, value []string, usage string) { + CommandLine.VarP(newStringArrayValue(value, p), name, "", usage) +} + +// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash. +func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) { + CommandLine.VarP(newStringArrayValue(value, p), name, shorthand, usage) +} + +// StringArray defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string { + p := []string{} + f.StringArrayVarP(&p, name, "", value, usage) + return &p +} + +// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage string) *[]string { + p := []string{} + f.StringArrayVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringArray defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// The value of each argument will not try to be separated by comma. Use a StringSlice for that. +func StringArray(name string, value []string, usage string) *[]string { + return CommandLine.StringArrayP(name, "", value, usage) +} + +// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash. +func StringArrayP(name, shorthand string, value []string, usage string) *[]string { + return CommandLine.StringArrayP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_slice.go new file mode 100755 index 0000000..0cd3ccc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/string_slice.go @@ -0,0 +1,149 @@ +package pflag + +import ( + "bytes" + "encoding/csv" + "strings" +) + +// -- stringSlice Value +type stringSliceValue struct { + value *[]string + changed bool +} + +func newStringSliceValue(val []string, p *[]string) *stringSliceValue { + ssv := new(stringSliceValue) + ssv.value = p + *ssv.value = val + return ssv +} + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +func writeAsCSV(vals []string) (string, error) { + b := &bytes.Buffer{} + w := csv.NewWriter(b) + err := w.Write(vals) + if err != nil { + return "", err + } + w.Flush() + return strings.TrimSuffix(b.String(), "\n"), nil +} + +func (s *stringSliceValue) Set(val string) error { + v, err := readAsCSV(val) + if err != nil { + return err + } + if !s.changed { + *s.value = v + } else { + *s.value = append(*s.value, v...) + } + s.changed = true + return nil +} + +func (s *stringSliceValue) Type() string { + return "stringSlice" +} + +func (s *stringSliceValue) String() string { + str, _ := writeAsCSV(*s.value) + return "[" + str + "]" +} + +func stringSliceConv(sval string) (interface{}, error) { + sval = sval[1 : len(sval)-1] + // An empty string would cause a slice with one (empty) string + if len(sval) == 0 { + return []string{}, nil + } + return readAsCSV(sval) +} + +// GetStringSlice return the []string value of a flag with the given name +func (f *FlagSet) GetStringSlice(name string) ([]string, error) { + val, err := f.getFlagType(name, "stringSlice", stringSliceConv) + if err != nil { + return []string{}, err + } + return val.([]string), nil +} + +// StringSliceVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) { + f.VarP(newStringSliceValue(value, p), name, "", usage) +} + +// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { + f.VarP(newStringSliceValue(value, p), name, shorthand, usage) +} + +// StringSliceVar defines a string flag with specified name, default value, and usage string. +// The argument p points to a []string variable in which to store the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func StringSliceVar(p *[]string, name string, value []string, usage string) { + CommandLine.VarP(newStringSliceValue(value, p), name, "", usage) +} + +// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash. +func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) { + CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage) +} + +// StringSlice defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string { + p := []string{} + f.StringSliceVarP(&p, name, "", value, usage) + return &p +} + +// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string { + p := []string{} + f.StringSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// StringSlice defines a string flag with specified name, default value, and usage string. +// The return value is the address of a []string variable that stores the value of the flag. +// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly. +// For example: +// --ss="v1,v2" -ss="v3" +// will result in +// []string{"v1", "v2", "v3"} +func StringSlice(name string, value []string, usage string) *[]string { + return CommandLine.StringSliceP(name, "", value, usage) +} + +// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash. +func StringSliceP(name, shorthand string, value []string, usage string) *[]string { + return CommandLine.StringSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint.go new file mode 100755 index 0000000..dcbc2b7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint Value +type uintValue uint + +func newUintValue(val uint, p *uint) *uintValue { + *p = val + return (*uintValue)(p) +} + +func (i *uintValue) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + *i = uintValue(v) + return err +} + +func (i *uintValue) Type() string { + return "uint" +} + +func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uintConv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 0) + if err != nil { + return 0, err + } + return uint(v), nil +} + +// GetUint return the uint value of a flag with the given name +func (f *FlagSet) GetUint(name string) (uint, error) { + val, err := f.getFlagType(name, "uint", uintConv) + if err != nil { + return 0, err + } + return val.(uint), nil +} + +// UintVar defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) { + f.VarP(newUintValue(value, p), name, "", usage) +} + +// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintVarP(p *uint, name, shorthand string, value uint, usage string) { + f.VarP(newUintValue(value, p), name, shorthand, usage) +} + +// UintVar defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func UintVar(p *uint, name string, value uint, usage string) { + CommandLine.VarP(newUintValue(value, p), name, "", usage) +} + +// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash. +func UintVarP(p *uint, name, shorthand string, value uint, usage string) { + CommandLine.VarP(newUintValue(value, p), name, shorthand, usage) +} + +// Uint defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func (f *FlagSet) Uint(name string, value uint, usage string) *uint { + p := new(uint) + f.UintVarP(p, name, "", value, usage) + return p +} + +// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintP(name, shorthand string, value uint, usage string) *uint { + p := new(uint) + f.UintVarP(p, name, shorthand, value, usage) + return p +} + +// Uint defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func Uint(name string, value uint, usage string) *uint { + return CommandLine.UintP(name, "", value, usage) +} + +// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash. +func UintP(name, shorthand string, value uint, usage string) *uint { + return CommandLine.UintP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint16.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint16.go new file mode 100755 index 0000000..7e9914e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint16.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint16 value +type uint16Value uint16 + +func newUint16Value(val uint16, p *uint16) *uint16Value { + *p = val + return (*uint16Value)(p) +} + +func (i *uint16Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 16) + *i = uint16Value(v) + return err +} + +func (i *uint16Value) Type() string { + return "uint16" +} + +func (i *uint16Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint16Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 16) + if err != nil { + return 0, err + } + return uint16(v), nil +} + +// GetUint16 return the uint16 value of a flag with the given name +func (f *FlagSet) GetUint16(name string) (uint16, error) { + val, err := f.getFlagType(name, "uint16", uint16Conv) + if err != nil { + return 0, err + } + return val.(uint16), nil +} + +// Uint16Var defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func (f *FlagSet) Uint16Var(p *uint16, name string, value uint16, usage string) { + f.VarP(newUint16Value(value, p), name, "", usage) +} + +// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) { + f.VarP(newUint16Value(value, p), name, shorthand, usage) +} + +// Uint16Var defines a uint flag with specified name, default value, and usage string. +// The argument p points to a uint variable in which to store the value of the flag. +func Uint16Var(p *uint16, name string, value uint16, usage string) { + CommandLine.VarP(newUint16Value(value, p), name, "", usage) +} + +// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash. +func Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) { + CommandLine.VarP(newUint16Value(value, p), name, shorthand, usage) +} + +// Uint16 defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func (f *FlagSet) Uint16(name string, value uint16, usage string) *uint16 { + p := new(uint16) + f.Uint16VarP(p, name, "", value, usage) + return p +} + +// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint16P(name, shorthand string, value uint16, usage string) *uint16 { + p := new(uint16) + f.Uint16VarP(p, name, shorthand, value, usage) + return p +} + +// Uint16 defines a uint flag with specified name, default value, and usage string. +// The return value is the address of a uint variable that stores the value of the flag. +func Uint16(name string, value uint16, usage string) *uint16 { + return CommandLine.Uint16P(name, "", value, usage) +} + +// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash. +func Uint16P(name, shorthand string, value uint16, usage string) *uint16 { + return CommandLine.Uint16P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint32.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint32.go new file mode 100755 index 0000000..d802453 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint32.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint32 value +type uint32Value uint32 + +func newUint32Value(val uint32, p *uint32) *uint32Value { + *p = val + return (*uint32Value)(p) +} + +func (i *uint32Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 32) + *i = uint32Value(v) + return err +} + +func (i *uint32Value) Type() string { + return "uint32" +} + +func (i *uint32Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint32Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 32) + if err != nil { + return 0, err + } + return uint32(v), nil +} + +// GetUint32 return the uint32 value of a flag with the given name +func (f *FlagSet) GetUint32(name string) (uint32, error) { + val, err := f.getFlagType(name, "uint32", uint32Conv) + if err != nil { + return 0, err + } + return val.(uint32), nil +} + +// Uint32Var defines a uint32 flag with specified name, default value, and usage string. +// The argument p points to a uint32 variable in which to store the value of the flag. +func (f *FlagSet) Uint32Var(p *uint32, name string, value uint32, usage string) { + f.VarP(newUint32Value(value, p), name, "", usage) +} + +// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) { + f.VarP(newUint32Value(value, p), name, shorthand, usage) +} + +// Uint32Var defines a uint32 flag with specified name, default value, and usage string. +// The argument p points to a uint32 variable in which to store the value of the flag. +func Uint32Var(p *uint32, name string, value uint32, usage string) { + CommandLine.VarP(newUint32Value(value, p), name, "", usage) +} + +// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash. +func Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) { + CommandLine.VarP(newUint32Value(value, p), name, shorthand, usage) +} + +// Uint32 defines a uint32 flag with specified name, default value, and usage string. +// The return value is the address of a uint32 variable that stores the value of the flag. +func (f *FlagSet) Uint32(name string, value uint32, usage string) *uint32 { + p := new(uint32) + f.Uint32VarP(p, name, "", value, usage) + return p +} + +// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint32P(name, shorthand string, value uint32, usage string) *uint32 { + p := new(uint32) + f.Uint32VarP(p, name, shorthand, value, usage) + return p +} + +// Uint32 defines a uint32 flag with specified name, default value, and usage string. +// The return value is the address of a uint32 variable that stores the value of the flag. +func Uint32(name string, value uint32, usage string) *uint32 { + return CommandLine.Uint32P(name, "", value, usage) +} + +// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash. +func Uint32P(name, shorthand string, value uint32, usage string) *uint32 { + return CommandLine.Uint32P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint64.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint64.go new file mode 100755 index 0000000..f62240f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint64.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint64 Value +type uint64Value uint64 + +func newUint64Value(val uint64, p *uint64) *uint64Value { + *p = val + return (*uint64Value)(p) +} + +func (i *uint64Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 64) + *i = uint64Value(v) + return err +} + +func (i *uint64Value) Type() string { + return "uint64" +} + +func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint64Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 64) + if err != nil { + return 0, err + } + return uint64(v), nil +} + +// GetUint64 return the uint64 value of a flag with the given name +func (f *FlagSet) GetUint64(name string) (uint64, error) { + val, err := f.getFlagType(name, "uint64", uint64Conv) + if err != nil { + return 0, err + } + return val.(uint64), nil +} + +// Uint64Var defines a uint64 flag with specified name, default value, and usage string. +// The argument p points to a uint64 variable in which to store the value of the flag. +func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) { + f.VarP(newUint64Value(value, p), name, "", usage) +} + +// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) { + f.VarP(newUint64Value(value, p), name, shorthand, usage) +} + +// Uint64Var defines a uint64 flag with specified name, default value, and usage string. +// The argument p points to a uint64 variable in which to store the value of the flag. +func Uint64Var(p *uint64, name string, value uint64, usage string) { + CommandLine.VarP(newUint64Value(value, p), name, "", usage) +} + +// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash. +func Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) { + CommandLine.VarP(newUint64Value(value, p), name, shorthand, usage) +} + +// Uint64 defines a uint64 flag with specified name, default value, and usage string. +// The return value is the address of a uint64 variable that stores the value of the flag. +func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 { + p := new(uint64) + f.Uint64VarP(p, name, "", value, usage) + return p +} + +// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint64P(name, shorthand string, value uint64, usage string) *uint64 { + p := new(uint64) + f.Uint64VarP(p, name, shorthand, value, usage) + return p +} + +// Uint64 defines a uint64 flag with specified name, default value, and usage string. +// The return value is the address of a uint64 variable that stores the value of the flag. +func Uint64(name string, value uint64, usage string) *uint64 { + return CommandLine.Uint64P(name, "", value, usage) +} + +// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash. +func Uint64P(name, shorthand string, value uint64, usage string) *uint64 { + return CommandLine.Uint64P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint8.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint8.go new file mode 100755 index 0000000..bb0e83c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint8.go @@ -0,0 +1,88 @@ +package pflag + +import "strconv" + +// -- uint8 Value +type uint8Value uint8 + +func newUint8Value(val uint8, p *uint8) *uint8Value { + *p = val + return (*uint8Value)(p) +} + +func (i *uint8Value) Set(s string) error { + v, err := strconv.ParseUint(s, 0, 8) + *i = uint8Value(v) + return err +} + +func (i *uint8Value) Type() string { + return "uint8" +} + +func (i *uint8Value) String() string { return strconv.FormatUint(uint64(*i), 10) } + +func uint8Conv(sval string) (interface{}, error) { + v, err := strconv.ParseUint(sval, 0, 8) + if err != nil { + return 0, err + } + return uint8(v), nil +} + +// GetUint8 return the uint8 value of a flag with the given name +func (f *FlagSet) GetUint8(name string) (uint8, error) { + val, err := f.getFlagType(name, "uint8", uint8Conv) + if err != nil { + return 0, err + } + return val.(uint8), nil +} + +// Uint8Var defines a uint8 flag with specified name, default value, and usage string. +// The argument p points to a uint8 variable in which to store the value of the flag. +func (f *FlagSet) Uint8Var(p *uint8, name string, value uint8, usage string) { + f.VarP(newUint8Value(value, p), name, "", usage) +} + +// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) { + f.VarP(newUint8Value(value, p), name, shorthand, usage) +} + +// Uint8Var defines a uint8 flag with specified name, default value, and usage string. +// The argument p points to a uint8 variable in which to store the value of the flag. +func Uint8Var(p *uint8, name string, value uint8, usage string) { + CommandLine.VarP(newUint8Value(value, p), name, "", usage) +} + +// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash. +func Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) { + CommandLine.VarP(newUint8Value(value, p), name, shorthand, usage) +} + +// Uint8 defines a uint8 flag with specified name, default value, and usage string. +// The return value is the address of a uint8 variable that stores the value of the flag. +func (f *FlagSet) Uint8(name string, value uint8, usage string) *uint8 { + p := new(uint8) + f.Uint8VarP(p, name, "", value, usage) + return p +} + +// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) Uint8P(name, shorthand string, value uint8, usage string) *uint8 { + p := new(uint8) + f.Uint8VarP(p, name, shorthand, value, usage) + return p +} + +// Uint8 defines a uint8 flag with specified name, default value, and usage string. +// The return value is the address of a uint8 variable that stores the value of the flag. +func Uint8(name string, value uint8, usage string) *uint8 { + return CommandLine.Uint8P(name, "", value, usage) +} + +// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash. +func Uint8P(name, shorthand string, value uint8, usage string) *uint8 { + return CommandLine.Uint8P(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint_slice.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint_slice.go new file mode 100755 index 0000000..edd94c6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/pflag/uint_slice.go @@ -0,0 +1,126 @@ +package pflag + +import ( + "fmt" + "strconv" + "strings" +) + +// -- uintSlice Value +type uintSliceValue struct { + value *[]uint + changed bool +} + +func newUintSliceValue(val []uint, p *[]uint) *uintSliceValue { + uisv := new(uintSliceValue) + uisv.value = p + *uisv.value = val + return uisv +} + +func (s *uintSliceValue) Set(val string) error { + ss := strings.Split(val, ",") + out := make([]uint, len(ss)) + for i, d := range ss { + u, err := strconv.ParseUint(d, 10, 0) + if err != nil { + return err + } + out[i] = uint(u) + } + if !s.changed { + *s.value = out + } else { + *s.value = append(*s.value, out...) + } + s.changed = true + return nil +} + +func (s *uintSliceValue) Type() string { + return "uintSlice" +} + +func (s *uintSliceValue) String() string { + out := make([]string, len(*s.value)) + for i, d := range *s.value { + out[i] = fmt.Sprintf("%d", d) + } + return "[" + strings.Join(out, ",") + "]" +} + +func uintSliceConv(val string) (interface{}, error) { + val = strings.Trim(val, "[]") + // Empty string would cause a slice with one (empty) entry + if len(val) == 0 { + return []uint{}, nil + } + ss := strings.Split(val, ",") + out := make([]uint, len(ss)) + for i, d := range ss { + u, err := strconv.ParseUint(d, 10, 0) + if err != nil { + return nil, err + } + out[i] = uint(u) + } + return out, nil +} + +// GetUintSlice returns the []uint value of a flag with the given name. +func (f *FlagSet) GetUintSlice(name string) ([]uint, error) { + val, err := f.getFlagType(name, "uintSlice", uintSliceConv) + if err != nil { + return []uint{}, err + } + return val.([]uint), nil +} + +// UintSliceVar defines a uintSlice flag with specified name, default value, and usage string. +// The argument p points to a []uint variable in which to store the value of the flag. +func (f *FlagSet) UintSliceVar(p *[]uint, name string, value []uint, usage string) { + f.VarP(newUintSliceValue(value, p), name, "", usage) +} + +// UintSliceVarP is like UintSliceVar, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) { + f.VarP(newUintSliceValue(value, p), name, shorthand, usage) +} + +// UintSliceVar defines a uint[] flag with specified name, default value, and usage string. +// The argument p points to a uint[] variable in which to store the value of the flag. +func UintSliceVar(p *[]uint, name string, value []uint, usage string) { + CommandLine.VarP(newUintSliceValue(value, p), name, "", usage) +} + +// UintSliceVarP is like the UintSliceVar, but accepts a shorthand letter that can be used after a single dash. +func UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) { + CommandLine.VarP(newUintSliceValue(value, p), name, shorthand, usage) +} + +// UintSlice defines a []uint flag with specified name, default value, and usage string. +// The return value is the address of a []uint variable that stores the value of the flag. +func (f *FlagSet) UintSlice(name string, value []uint, usage string) *[]uint { + p := []uint{} + f.UintSliceVarP(&p, name, "", value, usage) + return &p +} + +// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash. +func (f *FlagSet) UintSliceP(name, shorthand string, value []uint, usage string) *[]uint { + p := []uint{} + f.UintSliceVarP(&p, name, shorthand, value, usage) + return &p +} + +// UintSlice defines a []uint flag with specified name, default value, and usage string. +// The return value is the address of a []uint variable that stores the value of the flag. +func UintSlice(name string, value []uint, usage string) *[]uint { + return CommandLine.UintSliceP(name, "", value, usage) +} + +// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash. +func UintSliceP(name, shorthand string, value []uint, usage string) *[]uint { + return CommandLine.UintSliceP(name, shorthand, value, usage) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.gitignore new file mode 100755 index 0000000..352a34a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.bench \ No newline at end of file diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.travis.yml new file mode 100755 index 0000000..55960d1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/.travis.yml @@ -0,0 +1,28 @@ +go_import_path: github.com/spf13/viper + +language: go +go: + - 1.7.x + - 1.8.x + - 1.9.x + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go install ./... + - diff -u <(echo -n) <(gofmt -d .) + - go test -v ./... + +after_success: + - go get -u -d github.com/spf13/hugo + - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd - + +sudo: false diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/LICENSE new file mode 100755 index 0000000..4527efb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +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/skycoin/skycoin/vendor/github.com/spf13/viper/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/README.md new file mode 100755 index 0000000..64bf474 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/README.md @@ -0,0 +1,643 @@ +![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png) + +Go configuration with fangs! + +Many Go projects are built using Viper including: + +* [Hugo](http://gohugo.io) +* [EMC RexRay](http://rexray.readthedocs.org/en/stable/) +* [Imgur’s Incus](https://github.com/Imgur/incus) +* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack) +* [Docker Notary](https://github.com/docker/Notary) +* [BloomApi](https://www.bloomapi.com/) +* [doctl](https://github.com/digitalocean/doctl) +* [Clairctl](https://github.com/jgsqware/clairctl) + +[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) + + +## What is Viper? + +Viper is a complete configuration solution for Go applications including 12-Factor apps. It is designed +to work within an application, and can handle all types of configuration needs +and formats. It supports: + +* setting defaults +* reading from JSON, TOML, YAML, HCL, and Java properties config files +* live watching and re-reading of config files (optional) +* reading from environment variables +* reading from remote config systems (etcd or Consul), and watching changes +* reading from command line flags +* reading from buffer +* setting explicit values + +Viper can be thought of as a registry for all of your applications +configuration needs. + +## Why Viper? + +When building a modern application, you don’t want to worry about +configuration file formats; you want to focus on building awesome software. +Viper is here to help with that. + +Viper does the following for you: + +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats. +2. Provide a mechanism to set default values for your different + configuration options. +3. Provide a mechanism to set override values for options specified through + command line flags. +4. Provide an alias system to easily rename parameters without breaking existing + code. +5. Make it easy to tell the difference between when a user has provided a + command line or config file which is the same as the default. + +Viper uses the following precedence order. Each item takes precedence over the +item below it: + + * explicit call to Set + * flag + * env + * config + * key/value store + * default + +Viper configuration keys are case insensitive. + +## Putting Values into Viper + +### Establishing Defaults + +A good configuration system will support default values. A default value is not +required for a key, but it’s useful in the event that a key hasn’t been set via +config file, environment variable, remote configuration or flag. + +Examples: + +```go +viper.SetDefault("ContentDir", "content") +viper.SetDefault("LayoutDir", "layouts") +viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) +``` + +### Reading Config Files + +Viper requires minimal configuration so it knows where to look for config files. +Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but +currently a single Viper instance only supports a single configuration file. +Viper does not default to any configuration search paths leaving defaults decision +to an application. + +Here is an example of how to use Viper to search for and read a configuration file. +None of the specific paths are required, but at least one path should be provided +where a configuration file is expected. + +```go +viper.SetConfigName("config") // name of config file (without extension) +viper.AddConfigPath("/etc/appname/") // path to look for the config file in +viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths +viper.AddConfigPath(".") // optionally look for config in the working directory +err := viper.ReadInConfig() // Find and read the config file +if err != nil { // Handle errors reading the config file + panic(fmt.Errorf("Fatal error config file: %s \n", err)) +} +``` + +### Watching and re-reading config files + +Viper supports the ability to have your application live read a config file while running. + +Gone are the days of needing to restart a server to have a config take effect, +viper powered applications can read an update to a config file while running and +not miss a beat. + +Simply tell the viper instance to watchConfig. +Optionally you can provide a function for Viper to run each time a change occurs. + +**Make sure you add all of the configPaths prior to calling `WatchConfig()`** + +```go +viper.WatchConfig() +viper.OnConfigChange(func(e fsnotify.Event) { + fmt.Println("Config file changed:", e.Name) +}) +``` + +### Reading Config from io.Reader + +Viper predefines many configuration sources such as files, environment +variables, flags, and remote K/V store, but you are not bound to them. You can +also implement your own required configuration source and feed it to viper. + +```go +viper.SetConfigType("yaml") // or viper.SetConfigType("YAML") + +// any approach to require this configuration into your program. +var yamlExample = []byte(` +Hacker: true +name: steve +hobbies: +- skateboarding +- snowboarding +- go +clothing: + jacket: leather + trousers: denim +age: 35 +eyes : brown +beard: true +`) + +viper.ReadConfig(bytes.NewBuffer(yamlExample)) + +viper.Get("name") // this would be "steve" +``` + +### Setting Overrides + +These could be from a command line flag, or from your own application logic. + +```go +viper.Set("Verbose", true) +viper.Set("LogFile", LogFile) +``` + +### Registering and Using Aliases + +Aliases permit a single value to be referenced by multiple keys + +```go +viper.RegisterAlias("loud", "Verbose") + +viper.Set("verbose", true) // same result as next line +viper.Set("loud", true) // same result as prior line + +viper.GetBool("loud") // true +viper.GetBool("verbose") // true +``` + +### Working with Environment Variables + +Viper has full support for environment variables. This enables 12 factor +applications out of the box. There are four methods that exist to aid working +with ENV: + + * `AutomaticEnv()` + * `BindEnv(string...) : error` + * `SetEnvPrefix(string)` + * `SetEnvKeyReplacer(string...) *strings.Replacer` + +_When working with ENV variables, it’s important to recognize that Viper +treats ENV variables as case sensitive._ + +Viper provides a mechanism to try to ensure that ENV variables are unique. By +using `SetEnvPrefix`, you can tell Viper to use add a prefix while reading from +the environment variables. Both `BindEnv` and `AutomaticEnv` will use this +prefix. + +`BindEnv` takes one or two parameters. The first parameter is the key name, the +second is the name of the environment variable. The name of the environment +variable is case sensitive. If the ENV variable name is not provided, then +Viper will automatically assume that the key name matches the ENV variable name, +but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV +variable name, it **does not** automatically add the prefix. + +One important thing to recognize when working with ENV variables is that the +value will be read each time it is accessed. Viper does not fix the value when +the `BindEnv` is called. + +`AutomaticEnv` is a powerful helper especially when combined with +`SetEnvPrefix`. When called, Viper will check for an environment variable any +time a `viper.Get` request is made. It will apply the following rules. It will +check for a environment variable with a name matching the key uppercased and +prefixed with the `EnvPrefix` if set. + +`SetEnvKeyReplacer` allows you to use a `strings.Replacer` object to rewrite Env +keys to an extent. This is useful if you want to use `-` or something in your +`Get()` calls, but want your environmental variables to use `_` delimiters. An +example of using it can be found in `viper_test.go`. + +#### Env example + +```go +SetEnvPrefix("spf") // will be uppercased automatically +BindEnv("id") + +os.Setenv("SPF_ID", "13") // typically done outside of the app + +id := Get("id") // 13 +``` + +### Working with Flags + +Viper has the ability to bind to flags. Specifically, Viper supports `Pflags` +as used in the [Cobra](https://github.com/spf13/cobra) library. + +Like `BindEnv`, the value is not set when the binding method is called, but when +it is accessed. This means you can bind as early as you want, even in an +`init()` function. + +For individual flags, the `BindPFlag()` method provides this functionality. + +Example: + +```go +serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +``` + +You can also bind an existing set of pflags (pflag.FlagSet): + +Example: + +```go +pflag.Int("flagname", 1234, "help message for flagname") + +pflag.Parse() +viper.BindPFlags(pflag.CommandLine) + +i := viper.GetInt("flagname") // retrieve values from viper instead of pflag +``` + +The use of [pflag](https://github.com/spf13/pflag/) in Viper does not preclude +the use of other packages that use the [flag](https://golang.org/pkg/flag/) +package from the standard library. The pflag package can handle the flags +defined for the flag package by importing these flags. This is accomplished +by a calling a convenience function provided by the pflag package called +AddGoFlagSet(). + +Example: + +```go +package main + +import ( + "flag" + "github.com/spf13/pflag" +) + +func main() { + + // using standard library "flag" package + flag.Int("flagname", 1234, "help message for flagname") + + pflag.CommandLine.AddGoFlagSet(flag.CommandLine) + pflag.Parse() + viper.BindPFlags(pflag.CommandLine) + + i := viper.GetInt("flagname") // retrieve value from viper + + ... +} +``` + +#### Flag interfaces + +Viper provides two Go interfaces to bind other flag systems if you don’t use `Pflags`. + +`FlagValue` represents a single flag. This is a very simple example on how to implement this interface: + +```go +type myFlag struct {} +func (f myFlag) HasChanged() bool { return false } +func (f myFlag) Name() string { return "my-flag-name" } +func (f myFlag) ValueString() string { return "my-flag-value" } +func (f myFlag) ValueType() string { return "string" } +``` + +Once your flag implements this interface, you can simply tell Viper to bind it: + +```go +viper.BindFlagValue("my-flag-name", myFlag{}) +``` + +`FlagValueSet` represents a group of flags. This is a very simple example on how to implement this interface: + +```go +type myFlagSet struct { + flags []myFlag +} + +func (f myFlagSet) VisitAll(fn func(FlagValue)) { + for _, flag := range flags { + fn(flag) + } +} +``` + +Once your flag set implements this interface, you can simply tell Viper to bind it: + +```go +fSet := myFlagSet{ + flags: []myFlag{myFlag{}, myFlag{}}, +} +viper.BindFlagValues("my-flags", fSet) +``` + +### Remote Key/Value Store Support + +To enable remote support in Viper, do a blank import of the `viper/remote` +package: + +`import _ "github.com/spf13/viper/remote"` + +Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path +in a Key/Value store such as etcd or Consul. These values take precedence over +default values, but are overridden by configuration values retrieved from disk, +flags, or environment variables. + +Viper uses [crypt](https://github.com/xordataexchange/crypt) to retrieve +configuration from the K/V store, which means that you can store your +configuration values encrypted and have them automatically decrypted if you have +the correct gpg keyring. Encryption is optional. + +You can use remote configuration in conjunction with local configuration, or +independently of it. + +`crypt` has a command-line helper that you can use to put configurations in your +K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001. + +```bash +$ go get github.com/xordataexchange/crypt/bin/crypt +$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json +``` + +Confirm that your value was set: + +```bash +$ crypt get -plaintext /config/hugo.json +``` + +See the `crypt` documentation for examples of how to set encrypted values, or +how to use Consul. + +### Remote Key/Value Store Example - Unencrypted + +```go +viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +err := viper.ReadRemoteConfig() +``` + +### Remote Key/Value Store Example - Encrypted + +```go +viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +err := viper.ReadRemoteConfig() +``` + +### Watching Changes in etcd - Unencrypted + +```go +// alternatively, you can create a new viper instance. +var runtime_viper = viper.New() + +runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" + +// read from remote config the first time. +err := runtime_viper.ReadRemoteConfig() + +// unmarshal config +runtime_viper.Unmarshal(&runtime_conf) + +// open a goroutine to watch remote changes forever +go func(){ + for { + time.Sleep(time.Second * 5) // delay after each request + + // currently, only tested with etcd support + err := runtime_viper.WatchRemoteConfig() + if err != nil { + log.Errorf("unable to read remote config: %v", err) + continue + } + + // unmarshal new config into our runtime config struct. you can also use channel + // to implement a signal to notify the system of the changes + runtime_viper.Unmarshal(&runtime_conf) + } +}() +``` + +## Getting Values From Viper + +In Viper, there are a few ways to get a value depending on the value’s type. +The following functions and methods exist: + + * `Get(key string) : interface{}` + * `GetBool(key string) : bool` + * `GetFloat64(key string) : float64` + * `GetInt(key string) : int` + * `GetString(key string) : string` + * `GetStringMap(key string) : map[string]interface{}` + * `GetStringMapString(key string) : map[string]string` + * `GetStringSlice(key string) : []string` + * `GetTime(key string) : time.Time` + * `GetDuration(key string) : time.Duration` + * `IsSet(key string) : bool` + +One important thing to recognize is that each Get function will return a zero +value if it’s not found. To check if a given key exists, the `IsSet()` method +has been provided. + +Example: +```go +viper.GetString("logfile") // case-insensitive Setting & Getting +if viper.GetBool("verbose") { + fmt.Println("verbose enabled") +} +``` +### Accessing nested keys + +The accessor methods also accept formatted paths to deeply nested keys. For +example, if the following JSON file is loaded: + +```json +{ + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +``` + +Viper can access a nested field by passing a `.` delimited path of keys: + +```go +GetString("datastore.metric.host") // (returns "127.0.0.1") +``` + +This obeys the precedence rules established above; the search for the path +will cascade through the remaining configuration registries until found. + +For example, given this configuration file, both `datastore.metric.host` and +`datastore.metric.port` are already defined (and may be overridden). If in addition +`datastore.metric.protocol` was defined in the defaults, Viper would also find it. + +However, if `datastore.metric` was overridden (by a flag, an environment variable, +the `Set()` method, …) with an immediate value, then all sub-keys of +`datastore.metric` become undefined, they are “shadowed” by the higher-priority +configuration level. + +Lastly, if there exists a key that matches the delimited key path, its value +will be returned instead. E.g. + +```json +{ + "datastore.metric.host": "0.0.0.0", + "host": { + "address": "localhost", + "port": 5799 + }, + "datastore": { + "metric": { + "host": "127.0.0.1", + "port": 3099 + }, + "warehouse": { + "host": "198.0.0.1", + "port": 2112 + } + } +} + +GetString("datastore.metric.host") // returns "0.0.0.0" +``` + +### Extract sub-tree + +Extract sub-tree from Viper. + +For example, `viper` represents: + +```json +app: + cache1: + max-items: 100 + item-size: 64 + cache2: + max-items: 200 + item-size: 80 +``` + +After executing: + +```go +subv := viper.Sub("app.cache1") +``` + +`subv` represents: + +```json +max-items: 100 +item-size: 64 +``` + +Suppose we have: + +```go +func NewCache(cfg *Viper) *Cache {...} +``` + +which creates a cache based on config information formatted as `subv`. +Now it’s easy to create these 2 caches separately as: + +```go +cfg1 := viper.Sub("app.cache1") +cache1 := NewCache(cfg1) + +cfg2 := viper.Sub("app.cache2") +cache2 := NewCache(cfg2) +``` + +### Unmarshaling + +You also have the option of Unmarshaling all or a specific value to a struct, map, +etc. + +There are two methods to do this: + + * `Unmarshal(rawVal interface{}) : error` + * `UnmarshalKey(key string, rawVal interface{}) : error` + +Example: + +```go +type config struct { + Port int + Name string + PathMap string `mapstructure:"path_map"` +} + +var C config + +err := Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +## Viper or Vipers? + +Viper comes ready to use out of the box. There is no configuration or +initialization needed to begin using Viper. Since most applications will want +to use a single central repository for their configuration, the viper package +provides this. It is similar to a singleton. + +In all of the examples above, they demonstrate using viper in its singleton +style approach. + +### Working with multiple vipers + +You can also create many different vipers for use in your application. Each will +have its own unique set of configurations and values. Each can read from a +different config file, key value store, etc. All of the functions that viper +package supports are mirrored as methods on a viper. + +Example: + +```go +x := viper.New() +y := viper.New() + +x.SetDefault("ContentDir", "content") +y.SetDefault("ContentDir", "foobar") + +//... +``` + +When working with multiple vipers, it is up to the user to keep track of the +different vipers. + +## Q & A + +Q: Why not INI files? + +A: Ini files are pretty awful. There’s no standard format, and they are hard to +validate. Viper is designed to work with JSON, TOML or YAML files. If someone +really wants to add this feature, I’d be happy to merge it. It’s easy to specify +which formats your application will permit. + +Q: Why is it called “Viper”? + +A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) +to [Cobra](https://github.com/spf13/cobra). While both can operate completely +independently, together they make a powerful pair to handle much of your +application foundation needs. + +Q: Why is it called “Cobra”? + +A: Is there a better name for a [commander](http://en.wikipedia.org/wiki/Cobra_Commander)? diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/flags.go new file mode 100755 index 0000000..dd32f4e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/flags.go @@ -0,0 +1,57 @@ +package viper + +import "github.com/spf13/pflag" + +// FlagValueSet is an interface that users can implement +// to bind a set of flags to viper. +type FlagValueSet interface { + VisitAll(fn func(FlagValue)) +} + +// FlagValue is an interface that users can implement +// to bind different flags to viper. +type FlagValue interface { + HasChanged() bool + Name() string + ValueString() string + ValueType() string +} + +// pflagValueSet is a wrapper around *pflag.ValueSet +// that implements FlagValueSet. +type pflagValueSet struct { + flags *pflag.FlagSet +} + +// VisitAll iterates over all *pflag.Flag inside the *pflag.FlagSet. +func (p pflagValueSet) VisitAll(fn func(flag FlagValue)) { + p.flags.VisitAll(func(flag *pflag.Flag) { + fn(pflagValue{flag}) + }) +} + +// pflagValue is a wrapper aroung *pflag.flag +// that implements FlagValue +type pflagValue struct { + flag *pflag.Flag +} + +// HasChanges returns whether the flag has changes or not. +func (p pflagValue) HasChanged() bool { + return p.flag.Changed +} + +// Name returns the name of the flag. +func (p pflagValue) Name() string { + return p.flag.Name +} + +// ValueString returns the value of the flag as a string. +func (p pflagValue) ValueString() string { + return p.flag.Value.String() +} + +// ValueType returns the type of the flag as a string. +func (p pflagValue) ValueType() string { + return p.flag.Value.Type() +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/util.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/util.go new file mode 100755 index 0000000..952cad4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/util.go @@ -0,0 +1,221 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is a application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +package viper + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" + "unicode" + + "github.com/spf13/afero" + "github.com/spf13/cast" + jww "github.com/spf13/jwalterweatherman" +) + +// ConfigParseError denotes failing to parse configuration file. +type ConfigParseError struct { + err error +} + +// Error returns the formatted configuration error. +func (pe ConfigParseError) Error() string { + return fmt.Sprintf("While parsing config: %s", pe.err.Error()) +} + +// toCaseInsensitiveValue checks if the value is a map; +// if so, create a copy and lower-case the keys recursively. +func toCaseInsensitiveValue(value interface{}) interface{} { + switch v := value.(type) { + case map[interface{}]interface{}: + value = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]interface{}: + value = copyAndInsensitiviseMap(v) + } + + return value +} + +// copyAndInsensitiviseMap behaves like insensitiviseMap, but creates a copy of +// any map it makes case insensitive. +func copyAndInsensitiviseMap(m map[string]interface{}) map[string]interface{} { + nm := make(map[string]interface{}) + + for key, val := range m { + lkey := strings.ToLower(key) + switch v := val.(type) { + case map[interface{}]interface{}: + nm[lkey] = copyAndInsensitiviseMap(cast.ToStringMap(v)) + case map[string]interface{}: + nm[lkey] = copyAndInsensitiviseMap(v) + default: + nm[lkey] = v + } + } + + return nm +} + +func insensitiviseMap(m map[string]interface{}) { + for key, val := range m { + switch val.(type) { + case map[interface{}]interface{}: + // nested map: cast and recursively insensitivise + val = cast.ToStringMap(val) + insensitiviseMap(val.(map[string]interface{})) + case map[string]interface{}: + // nested map: recursively insensitivise + insensitiviseMap(val.(map[string]interface{})) + } + + lower := strings.ToLower(key) + if key != lower { + // remove old key (not lower-cased) + delete(m, key) + } + // update map + m[lower] = val + } +} + +func absPathify(inPath string) string { + jww.INFO.Println("Trying to resolve absolute path to", inPath) + + if strings.HasPrefix(inPath, "$HOME") { + inPath = userHomeDir() + inPath[5:] + } + + if strings.HasPrefix(inPath, "$") { + end := strings.Index(inPath, string(os.PathSeparator)) + inPath = os.Getenv(inPath[1:end]) + inPath[end:] + } + + if filepath.IsAbs(inPath) { + return filepath.Clean(inPath) + } + + p, err := filepath.Abs(inPath) + if err == nil { + return filepath.Clean(p) + } + + jww.ERROR.Println("Couldn't discover absolute path") + jww.ERROR.Println(err) + return "" +} + +// Check if File / Directory Exists +func exists(fs afero.Fs, path string) (bool, error) { + _, err := fs.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} + +func stringInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +} + +func userHomeDir() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + return os.Getenv("HOME") +} + +func safeMul(a, b uint) uint { + c := a * b + if a > 1 && b > 1 && c/b != a { + return 0 + } + return c +} + +// parseSizeInBytes converts strings like 1GB or 12 mb into an unsigned integer number of bytes +func parseSizeInBytes(sizeStr string) uint { + sizeStr = strings.TrimSpace(sizeStr) + lastChar := len(sizeStr) - 1 + multiplier := uint(1) + + if lastChar > 0 { + if sizeStr[lastChar] == 'b' || sizeStr[lastChar] == 'B' { + if lastChar > 1 { + switch unicode.ToLower(rune(sizeStr[lastChar-1])) { + case 'k': + multiplier = 1 << 10 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'm': + multiplier = 1 << 20 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + case 'g': + multiplier = 1 << 30 + sizeStr = strings.TrimSpace(sizeStr[:lastChar-1]) + default: + multiplier = 1 + sizeStr = strings.TrimSpace(sizeStr[:lastChar]) + } + } + } + } + + size := cast.ToInt(sizeStr) + if size < 0 { + size = 0 + } + + return safeMul(uint(size), multiplier) +} + +// deepSearch scans deep maps, following the key indexes listed in the +// sequence "path". +// The last value is expected to be another map, and is returned. +// +// In case intermediate keys do not exist, or map to a non-map value, +// a new map is created and inserted, and the search continues from there: +// the initial map "m" may be modified! +func deepSearch(m map[string]interface{}, path []string) map[string]interface{} { + for _, k := range path { + m2, ok := m[k] + if !ok { + // intermediate key does not exist + // => create it and continue from there + m3 := make(map[string]interface{}) + m[k] = m3 + m = m3 + continue + } + m3, ok := m2.(map[string]interface{}) + if !ok { + // intermediate key is a value + // => replace with a new map + m3 = make(map[string]interface{}) + m[k] = m3 + } + // continue search from here + m = m3 + } + return m +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/viper.go new file mode 100755 index 0000000..e9966ba --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/spf13/viper/viper.go @@ -0,0 +1,1771 @@ +// Copyright © 2014 Steve Francia . +// +// Use of this source code is governed by an MIT-style +// license that can be found in the LICENSE file. + +// Viper is a application configuration system. +// It believes that applications can be configured a variety of ways +// via flags, ENVIRONMENT variables, configuration files retrieved +// from the file system, or a remote key/value store. + +// Each item takes precedence over the item below it: + +// overrides +// flag +// env +// config +// key/value store +// default + +package viper + +import ( + "bytes" + "encoding/csv" + "encoding/json" + "fmt" + "io" + "log" + "os" + "path/filepath" + "reflect" + "strings" + "time" + + yaml "gopkg.in/yaml.v2" + + "github.com/fsnotify/fsnotify" + "github.com/hashicorp/hcl" + "github.com/hashicorp/hcl/hcl/printer" + "github.com/magiconair/properties" + "github.com/mitchellh/mapstructure" + toml "github.com/pelletier/go-toml" + "github.com/spf13/afero" + "github.com/spf13/cast" + jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/pflag" +) + +// ConfigMarshalError happens when failing to marshal the configuration. +type ConfigMarshalError struct { + err error +} + +// Error returns the formatted configuration error. +func (e ConfigMarshalError) Error() string { + return fmt.Sprintf("While marshaling config: %s", e.err.Error()) +} + +var v *Viper + +type RemoteResponse struct { + Value []byte + Error error +} + +func init() { + v = New() +} + +type remoteConfigFactory interface { + Get(rp RemoteProvider) (io.Reader, error) + Watch(rp RemoteProvider) (io.Reader, error) + WatchChannel(rp RemoteProvider) (<-chan *RemoteResponse, chan bool) +} + +// RemoteConfig is optional, see the remote package +var RemoteConfig remoteConfigFactory + +// UnsupportedConfigError denotes encountering an unsupported +// configuration filetype. +type UnsupportedConfigError string + +// Error returns the formatted configuration error. +func (str UnsupportedConfigError) Error() string { + return fmt.Sprintf("Unsupported Config Type %q", string(str)) +} + +// UnsupportedRemoteProviderError denotes encountering an unsupported remote +// provider. Currently only etcd and Consul are supported. +type UnsupportedRemoteProviderError string + +// Error returns the formatted remote provider error. +func (str UnsupportedRemoteProviderError) Error() string { + return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str)) +} + +// RemoteConfigError denotes encountering an error while trying to +// pull the configuration from the remote provider. +type RemoteConfigError string + +// Error returns the formatted remote provider error +func (rce RemoteConfigError) Error() string { + return fmt.Sprintf("Remote Configurations Error: %s", string(rce)) +} + +// ConfigFileNotFoundError denotes failing to find configuration file. +type ConfigFileNotFoundError struct { + name, locations string +} + +// Error returns the formatted configuration error. +func (fnfe ConfigFileNotFoundError) Error() string { + return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) +} + +// Viper is a prioritized configuration registry. It +// maintains a set of configuration sources, fetches +// values to populate those, and provides them according +// to the source's priority. +// The priority of the sources is the following: +// 1. overrides +// 2. flags +// 3. env. variables +// 4. config file +// 5. key/value store +// 6. defaults +// +// For example, if values from the following sources were loaded: +// +// Defaults : { +// "secret": "", +// "user": "default", +// "endpoint": "https://localhost" +// } +// Config : { +// "user": "root" +// "secret": "defaultsecret" +// } +// Env : { +// "secret": "somesecretkey" +// } +// +// The resulting config will have the following values: +// +// { +// "secret": "somesecretkey", +// "user": "root", +// "endpoint": "https://localhost" +// } +type Viper struct { + // Delimiter that separates a list of keys + // used to access a nested value in one go + keyDelim string + + // A set of paths to look for the config file in + configPaths []string + + // The filesystem to read config from. + fs afero.Fs + + // A set of remote providers to search for the configuration + remoteProviders []*defaultRemoteProvider + + // Name of file to look for inside the path + configName string + configFile string + configType string + envPrefix string + + automaticEnvApplied bool + envKeyReplacer *strings.Replacer + + config map[string]interface{} + override map[string]interface{} + defaults map[string]interface{} + kvstore map[string]interface{} + pflags map[string]FlagValue + env map[string]string + aliases map[string]string + typeByDefValue bool + + // Store read properties on the object so that we can write back in order with comments. + // This will only be used if the configuration read is a properties file. + properties *properties.Properties + + onConfigChange func(fsnotify.Event) +} + +// New returns an initialized Viper instance. +func New() *Viper { + v := new(Viper) + v.keyDelim = "." + v.configName = "config" + v.fs = afero.NewOsFs() + v.config = make(map[string]interface{}) + v.override = make(map[string]interface{}) + v.defaults = make(map[string]interface{}) + v.kvstore = make(map[string]interface{}) + v.pflags = make(map[string]FlagValue) + v.env = make(map[string]string) + v.aliases = make(map[string]string) + v.typeByDefValue = false + + return v +} + +// Intended for testing, will reset all to default settings. +// In the public interface for the viper package so applications +// can use it in their testing as well. +func Reset() { + v = New() + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} + SupportedRemoteProviders = []string{"etcd", "consul"} +} + +type defaultRemoteProvider struct { + provider string + endpoint string + path string + secretKeyring string +} + +func (rp defaultRemoteProvider) Provider() string { + return rp.provider +} + +func (rp defaultRemoteProvider) Endpoint() string { + return rp.endpoint +} + +func (rp defaultRemoteProvider) Path() string { + return rp.path +} + +func (rp defaultRemoteProvider) SecretKeyring() string { + return rp.secretKeyring +} + +// RemoteProvider stores the configuration necessary +// to connect to a remote key/value store. +// Optional secretKeyring to unencrypt encrypted values +// can be provided. +type RemoteProvider interface { + Provider() string + Endpoint() string + Path() string + SecretKeyring() string +} + +// SupportedExts are universally supported extensions. +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} + +// SupportedRemoteProviders are universally supported remote providers. +var SupportedRemoteProviders = []string{"etcd", "consul"} + +func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) } +func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { + v.onConfigChange = run +} + +func WatchConfig() { v.WatchConfig() } +func (v *Viper) WatchConfig() { + go func() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + defer watcher.Close() + + // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way + filename, err := v.getConfigFile() + if err != nil { + log.Println("error:", err) + return + } + + configFile := filepath.Clean(filename) + configDir, _ := filepath.Split(configFile) + + done := make(chan bool) + go func() { + for { + select { + case event := <-watcher.Events: + // we only care about the config file + if filepath.Clean(event.Name) == configFile { + if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create { + err := v.ReadInConfig() + if err != nil { + log.Println("error:", err) + } + v.onConfigChange(event) + } + } + case err := <-watcher.Errors: + log.Println("error:", err) + } + } + }() + + watcher.Add(configDir) + <-done + }() +} + +// SetConfigFile explicitly defines the path, name and extension of the config file. +// Viper will use this and not check any of the config paths. +func SetConfigFile(in string) { v.SetConfigFile(in) } +func (v *Viper) SetConfigFile(in string) { + if in != "" { + v.configFile = in + } +} + +// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use. +// E.g. if your prefix is "spf", the env registry will look for env +// variables that start with "SPF_". +func SetEnvPrefix(in string) { v.SetEnvPrefix(in) } +func (v *Viper) SetEnvPrefix(in string) { + if in != "" { + v.envPrefix = in + } +} + +func (v *Viper) mergeWithEnvPrefix(in string) string { + if v.envPrefix != "" { + return strings.ToUpper(v.envPrefix + "_" + in) + } + + return strings.ToUpper(in) +} + +// TODO: should getEnv logic be moved into find(). Can generalize the use of +// rewriting keys many things, Ex: Get('someKey') -> some_key +// (camel case to snake case for JSON keys perhaps) + +// getEnv is a wrapper around os.Getenv which replaces characters in the original +// key. This allows env vars which have different keys than the config object +// keys. +func (v *Viper) getEnv(key string) string { + if v.envKeyReplacer != nil { + key = v.envKeyReplacer.Replace(key) + } + return os.Getenv(key) +} + +// ConfigFileUsed returns the file used to populate the config registry. +func ConfigFileUsed() string { return v.ConfigFileUsed() } +func (v *Viper) ConfigFileUsed() string { return v.configFile } + +// AddConfigPath adds a path for Viper to search for the config file in. +// Can be called multiple times to define multiple search paths. +func AddConfigPath(in string) { v.AddConfigPath(in) } +func (v *Viper) AddConfigPath(in string) { + if in != "" { + absin := absPathify(in) + jww.INFO.Println("adding", absin, "to paths to search") + if !stringInSlice(absin, v.configPaths) { + v.configPaths = append(v.configPaths, absin) + } + } +} + +// AddRemoteProvider adds a remote configuration source. +// Remote Providers are searched in the order they are added. +// provider is a string value, "etcd" or "consul" are currently supported. +// endpoint is the url. etcd requires http://ip:port consul requires ip:port +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp" +func AddRemoteProvider(provider, endpoint, path string) error { + return v.AddRemoteProvider(provider, endpoint, path) +} +func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint) + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +// AddSecureRemoteProvider adds a remote configuration source. +// Secure Remote Providers are searched in the order they are added. +// provider is a string value, "etcd" or "consul" are currently supported. +// endpoint is the url. etcd requires http://ip:port consul requires ip:port +// secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg +// path is the path in the k/v store to retrieve configuration +// To retrieve a config file called myapp.json from /configs/myapp.json +// you should set path to /configs and set config name (SetConfigName()) to +// "myapp" +// Secure Remote Providers are implemented with github.com/xordataexchange/crypt +func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring) +} + +func (v *Viper) AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { + if !stringInSlice(provider, SupportedRemoteProviders) { + return UnsupportedRemoteProviderError(provider) + } + if provider != "" && endpoint != "" { + jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint) + rp := &defaultRemoteProvider{ + endpoint: endpoint, + provider: provider, + path: path, + secretKeyring: secretkeyring, + } + if !v.providerPathExists(rp) { + v.remoteProviders = append(v.remoteProviders, rp) + } + } + return nil +} + +func (v *Viper) providerPathExists(p *defaultRemoteProvider) bool { + for _, y := range v.remoteProviders { + if reflect.DeepEqual(y, p) { + return true + } + } + return false +} + +// searchMap recursively searches for a value for path in source map. +// Returns nil if not found. +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchMap(source map[string]interface{}, path []string) interface{} { + if len(path) == 0 { + return source + } + + next, ok := source[path[0]] + if ok { + // Fast path + if len(path) == 1 { + return next + } + + // Nested case + switch next.(type) { + case map[interface{}]interface{}: + return v.searchMap(cast.ToStringMap(next), path[1:]) + case map[string]interface{}: + // Type assertion is safe here since it is only reached + // if the type of `next` is the same as the type being asserted + return v.searchMap(next.(map[string]interface{}), path[1:]) + default: + // got a value but nested key expected, return "nil" for not found + return nil + } + } + return nil +} + +// searchMapWithPathPrefixes recursively searches for a value for path in source map. +// +// While searchMap() considers each path element as a single map key, this +// function searches for, and prioritizes, merged path elements. +// e.g., if in the source, "foo" is defined with a sub-key "bar", and "foo.bar" +// is also defined, this latter value is returned for path ["foo", "bar"]. +// +// This should be useful only at config level (other maps may not contain dots +// in their keys). +// +// Note: This assumes that the path entries and map keys are lower cased. +func (v *Viper) searchMapWithPathPrefixes(source map[string]interface{}, path []string) interface{} { + if len(path) == 0 { + return source + } + + // search for path prefixes, starting from the longest one + for i := len(path); i > 0; i-- { + prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim)) + + next, ok := source[prefixKey] + if ok { + // Fast path + if i == len(path) { + return next + } + + // Nested case + var val interface{} + switch next.(type) { + case map[interface{}]interface{}: + val = v.searchMapWithPathPrefixes(cast.ToStringMap(next), path[i:]) + case map[string]interface{}: + // Type assertion is safe here since it is only reached + // if the type of `next` is the same as the type being asserted + val = v.searchMapWithPathPrefixes(next.(map[string]interface{}), path[i:]) + default: + // got a value but nested key expected, do nothing and look for next prefix + } + if val != nil { + return val + } + } + } + + // not found + return nil +} + +// isPathShadowedInDeepMap makes sure the given path is not shadowed somewhere +// on its path in the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows” +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInDeepMap(path []string, m map[string]interface{}) string { + var parentVal interface{} + for i := 1; i < len(path); i++ { + parentVal = v.searchMap(m, path[0:i]) + if parentVal == nil { + // not found, no need to add more path elements + return "" + } + switch parentVal.(type) { + case map[interface{}]interface{}: + continue + case map[string]interface{}: + continue + default: + // parentVal is a regular value which shadows "path" + return strings.Join(path[0:i], v.keyDelim) + } + } + return "" +} + +// isPathShadowedInFlatMap makes sure the given path is not shadowed somewhere +// in a sub-path of the map. +// e.g., if "foo.bar" has a value in the given map, it “shadows” +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInFlatMap(path []string, mi interface{}) string { + // unify input map + var m map[string]interface{} + switch mi.(type) { + case map[string]string, map[string]FlagValue: + m = cast.ToStringMap(mi) + default: + return "" + } + + // scan paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if _, ok := m[parentKey]; ok { + return parentKey + } + } + return "" +} + +// isPathShadowedInAutoEnv makes sure the given path is not shadowed somewhere +// in the environment, when automatic env is on. +// e.g., if "foo.bar" has a value in the environment, it “shadows” +// "foo.bar.baz" in a lower-priority map +func (v *Viper) isPathShadowedInAutoEnv(path []string) string { + var parentKey string + var val string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if val = v.getEnv(v.mergeWithEnvPrefix(parentKey)); val != "" { + return parentKey + } + } + return "" +} + +// SetTypeByDefaultValue enables or disables the inference of a key value's +// type when the Get function is used based upon a key's default value as +// opposed to the value returned based on the normal fetch logic. +// +// For example, if a key has a default value of []string{} and the same key +// is set via an environment variable to "a b c", a call to the Get function +// would return a string slice for the key if the key's type is inferred by +// the default value and the Get function would return: +// +// []string {"a", "b", "c"} +// +// Otherwise the Get function would return: +// +// "a b c" +func SetTypeByDefaultValue(enable bool) { v.SetTypeByDefaultValue(enable) } +func (v *Viper) SetTypeByDefaultValue(enable bool) { + v.typeByDefValue = enable +} + +// GetViper gets the global Viper instance. +func GetViper() *Viper { + return v +} + +// Get can retrieve any value given the key to use. +// Get is case-insensitive for a key. +// Get has the behavior of returning the value associated with the first +// place from where it is set. Viper will check in the following order: +// override, flag, env, config file, key/value store, default +// +// Get returns an interface. For a specific value use one of the Get____ methods. +func Get(key string) interface{} { return v.Get(key) } +func (v *Viper) Get(key string) interface{} { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey) + if val == nil { + return nil + } + + if v.typeByDefValue { + // TODO(bep) this branch isn't covered by a single test. + valType := val + path := strings.Split(lcaseKey, v.keyDelim) + defVal := v.searchMap(v.defaults, path) + if defVal != nil { + valType = defVal + } + + switch valType.(type) { + case bool: + return cast.ToBool(val) + case string: + return cast.ToString(val) + case int64, int32, int16, int8, int: + return cast.ToInt(val) + case float64, float32: + return cast.ToFloat64(val) + case time.Time: + return cast.ToTime(val) + case time.Duration: + return cast.ToDuration(val) + case []string: + return cast.ToStringSlice(val) + } + } + + return val +} + +// Sub returns new Viper instance representing a sub tree of this instance. +// Sub is case-insensitive for a key. +func Sub(key string) *Viper { return v.Sub(key) } +func (v *Viper) Sub(key string) *Viper { + subv := New() + data := v.Get(key) + if data == nil { + return nil + } + + if reflect.TypeOf(data).Kind() == reflect.Map { + subv.config = cast.ToStringMap(data) + return subv + } + return nil +} + +// GetString returns the value associated with the key as a string. +func GetString(key string) string { return v.GetString(key) } +func (v *Viper) GetString(key string) string { + return cast.ToString(v.Get(key)) +} + +// GetBool returns the value associated with the key as a boolean. +func GetBool(key string) bool { return v.GetBool(key) } +func (v *Viper) GetBool(key string) bool { + return cast.ToBool(v.Get(key)) +} + +// GetInt returns the value associated with the key as an integer. +func GetInt(key string) int { return v.GetInt(key) } +func (v *Viper) GetInt(key string) int { + return cast.ToInt(v.Get(key)) +} + +// GetInt64 returns the value associated with the key as an integer. +func GetInt64(key string) int64 { return v.GetInt64(key) } +func (v *Viper) GetInt64(key string) int64 { + return cast.ToInt64(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 { + return cast.ToFloat64(v.Get(key)) +} + +// GetTime returns the value associated with the key as time. +func GetTime(key string) time.Time { return v.GetTime(key) } +func (v *Viper) GetTime(key string) time.Time { + return cast.ToTime(v.Get(key)) +} + +// GetDuration returns the value associated with the key as a duration. +func GetDuration(key string) time.Duration { return v.GetDuration(key) } +func (v *Viper) GetDuration(key string) time.Duration { + return cast.ToDuration(v.Get(key)) +} + +// GetStringSlice returns the value associated with the key as a slice of strings. +func GetStringSlice(key string) []string { return v.GetStringSlice(key) } +func (v *Viper) GetStringSlice(key string) []string { + return cast.ToStringSlice(v.Get(key)) +} + +// GetStringMap returns the value associated with the key as a map of interfaces. +func GetStringMap(key string) map[string]interface{} { return v.GetStringMap(key) } +func (v *Viper) GetStringMap(key string) map[string]interface{} { + return cast.ToStringMap(v.Get(key)) +} + +// GetStringMapString returns the value associated with the key as a map of strings. +func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) } +func (v *Viper) GetStringMapString(key string) map[string]string { + return cast.ToStringMapString(v.Get(key)) +} + +// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. +func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) } +func (v *Viper) GetStringMapStringSlice(key string) map[string][]string { + return cast.ToStringMapStringSlice(v.Get(key)) +} + +// GetSizeInBytes returns the size of the value associated with the given key +// in bytes. +func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) } +func (v *Viper) GetSizeInBytes(key string) uint { + sizeStr := cast.ToString(v.Get(key)) + return parseSizeInBytes(sizeStr) +} + +// UnmarshalKey takes a single key and unmarshals it into a Struct. +func UnmarshalKey(key string, rawVal interface{}) error { return v.UnmarshalKey(key, rawVal) } +func (v *Viper) UnmarshalKey(key string, rawVal interface{}) error { + err := decode(v.Get(key), defaultDecoderConfig(rawVal)) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// Unmarshal unmarshals the config into a Struct. Make sure that the tags +// on the fields of the structure are properly set. +func Unmarshal(rawVal interface{}) error { return v.Unmarshal(rawVal) } +func (v *Viper) Unmarshal(rawVal interface{}) error { + err := decode(v.AllSettings(), defaultDecoderConfig(rawVal)) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// defaultDecoderConfig returns default mapsstructure.DecoderConfig with suppot +// of time.Duration values & string slices +func defaultDecoderConfig(output interface{}) *mapstructure.DecoderConfig { + return &mapstructure.DecoderConfig{ + Metadata: nil, + Result: output, + WeaklyTypedInput: true, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + mapstructure.StringToTimeDurationHookFunc(), + mapstructure.StringToSliceHookFunc(","), + ), + } +} + +// A wrapper around mapstructure.Decode that mimics the WeakDecode functionality +func decode(input interface{}, config *mapstructure.DecoderConfig) error { + decoder, err := mapstructure.NewDecoder(config) + if err != nil { + return err + } + return decoder.Decode(input) +} + +// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent +// in the destination struct. +func (v *Viper) UnmarshalExact(rawVal interface{}) error { + config := defaultDecoderConfig(rawVal) + config.ErrorUnused = true + + err := decode(v.AllSettings(), config) + + if err != nil { + return err + } + + v.insensitiviseMaps() + + return nil +} + +// BindPFlags binds a full flag set to the configuration, using each flag's long +// name as the config key. +func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) } +func (v *Viper) BindPFlags(flags *pflag.FlagSet) error { + return v.BindFlagValues(pflagValueSet{flags}) +} + +// BindPFlag binds a specific key to a pflag (as used by cobra). +// Example (where serverCmd is a Cobra instance): +// +// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +// Viper.BindPFlag("port", serverCmd.Flags().Lookup("port")) +// +func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) } +func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error { + return v.BindFlagValue(key, pflagValue{flag}) +} + +// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long +// name as the config key. +func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) } +func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) { + flags.VisitAll(func(flag FlagValue) { + if err = v.BindFlagValue(flag.Name(), flag); err != nil { + return + } + }) + return nil +} + +// BindFlagValue binds a specific key to a FlagValue. +// Example (where serverCmd is a Cobra instance): +// +// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") +// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port")) +// +func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) } +func (v *Viper) BindFlagValue(key string, flag FlagValue) error { + if flag == nil { + return fmt.Errorf("flag for %q is nil", key) + } + v.pflags[strings.ToLower(key)] = flag + return nil +} + +// BindEnv binds a Viper key to a ENV variable. +// ENV variables are case sensitive. +// If only a key is provided, it will use the env key matching the key, uppercased. +// EnvPrefix will be used when set when env name is not provided. +func BindEnv(input ...string) error { return v.BindEnv(input...) } +func (v *Viper) BindEnv(input ...string) error { + var key, envkey string + if len(input) == 0 { + return fmt.Errorf("BindEnv missing key to bind to") + } + + key = strings.ToLower(input[0]) + + if len(input) == 1 { + envkey = v.mergeWithEnvPrefix(key) + } else { + envkey = input[1] + } + + v.env[key] = envkey + + return nil +} + +// Given a key, find the value. +// Viper will check in the following order: +// flag, env, config file, key/value store, default. +// Viper will check to see if an alias exists first. +// Note: this assumes a lower-cased key given. +func (v *Viper) find(lcaseKey string) interface{} { + + var ( + val interface{} + exists bool + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + ) + + // compute the path through the nested maps to the nested value + if nested && v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)) != "" { + return nil + } + + // if the requested key is an alias, then return the proper key + lcaseKey = v.realKey(lcaseKey) + path = strings.Split(lcaseKey, v.keyDelim) + nested = len(path) > 1 + + // Set() override first + val = v.searchMap(v.override, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.override) != "" { + return nil + } + + // PFlag override next + flag, exists := v.pflags[lcaseKey] + if exists && flag.HasChanged() { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + default: + return flag.ValueString() + } + } + if nested && v.isPathShadowedInFlatMap(path, v.pflags) != "" { + return nil + } + + // Env override next + if v.automaticEnvApplied { + // even if it hasn't been registered, if automaticEnv is used, + // check any Get request + if val = v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); val != "" { + return val + } + if nested && v.isPathShadowedInAutoEnv(path) != "" { + return nil + } + } + envkey, exists := v.env[lcaseKey] + if exists { + if val = v.getEnv(envkey); val != "" { + return val + } + } + if nested && v.isPathShadowedInFlatMap(path, v.env) != "" { + return nil + } + + // Config file next + val = v.searchMapWithPathPrefixes(v.config, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.config) != "" { + return nil + } + + // K/V store next + val = v.searchMap(v.kvstore, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.kvstore) != "" { + return nil + } + + // Default next + val = v.searchMap(v.defaults, path) + if val != nil { + return val + } + if nested && v.isPathShadowedInDeepMap(path, v.defaults) != "" { + return nil + } + + // last chance: if no other value is returned and a flag does exist for the value, + // get the flag's value even if the flag's value has not changed + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + default: + return flag.ValueString() + } + } + // last item, no need to check shadowing + + return nil +} + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +// IsSet checks to see if the key has been set in any of the data locations. +// IsSet is case-insensitive for a key. +func IsSet(key string) bool { return v.IsSet(key) } +func (v *Viper) IsSet(key string) bool { + lcaseKey := strings.ToLower(key) + val := v.find(lcaseKey) + return val != nil +} + +// AutomaticEnv has Viper check ENV variables for all. +// keys set in config, default & flags +func AutomaticEnv() { v.AutomaticEnv() } +func (v *Viper) AutomaticEnv() { + v.automaticEnvApplied = true +} + +// SetEnvKeyReplacer sets the strings.Replacer on the viper object +// Useful for mapping an environmental variable to a key that does +// not match it. +func SetEnvKeyReplacer(r *strings.Replacer) { v.SetEnvKeyReplacer(r) } +func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { + v.envKeyReplacer = r +} + +// Aliases provide another accessor for the same key. +// This enables one to change a name without breaking the application +func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) } +func (v *Viper) RegisterAlias(alias string, key string) { + v.registerAlias(alias, strings.ToLower(key)) +} + +func (v *Viper) registerAlias(alias string, key string) { + alias = strings.ToLower(alias) + if alias != key && alias != v.realKey(key) { + _, exists := v.aliases[alias] + + if !exists { + // if we alias something that exists in one of the maps to another + // name, we'll never be able to get that value using the original + // name, so move the config value to the new realkey. + if val, ok := v.config[alias]; ok { + delete(v.config, alias) + v.config[key] = val + } + if val, ok := v.kvstore[alias]; ok { + delete(v.kvstore, alias) + v.kvstore[key] = val + } + if val, ok := v.defaults[alias]; ok { + delete(v.defaults, alias) + v.defaults[key] = val + } + if val, ok := v.override[alias]; ok { + delete(v.override, alias) + v.override[key] = val + } + v.aliases[alias] = key + } + } else { + jww.WARN.Println("Creating circular reference alias", alias, key, v.realKey(key)) + } +} + +func (v *Viper) realKey(key string) string { + newkey, exists := v.aliases[key] + if exists { + jww.DEBUG.Println("Alias", key, "to", newkey) + return v.realKey(newkey) + } + return key +} + +// InConfig checks to see if the given key (or an alias) is in the config file. +func InConfig(key string) bool { return v.InConfig(key) } +func (v *Viper) InConfig(key string) bool { + // if the requested key is an alias, then return the proper key + key = v.realKey(key) + + _, exists := v.config[key] + return exists +} + +// SetDefault sets the default value for this key. +// SetDefault is case-insensitive for a key. +// Default only used when no value is provided by the user via flag, config or ENV. +func SetDefault(key string, value interface{}) { v.SetDefault(key, value) } +func (v *Viper) SetDefault(key string, value interface{}) { + // If alias passed in, then set the proper default + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.defaults, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// Set sets the value for the key in the override regiser. +// Set is case-insensitive for a key. +// Will be used instead of values obtained via +// flags, config file, ENV, default, or key/value store. +func Set(key string, value interface{}) { v.Set(key, value) } +func (v *Viper) Set(key string, value interface{}) { + // If alias passed in, then set the proper override + key = v.realKey(strings.ToLower(key)) + value = toCaseInsensitiveValue(value) + + path := strings.Split(key, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(v.override, path[0:len(path)-1]) + + // set innermost value + deepestMap[lastKey] = value +} + +// ReadInConfig will discover and load the configuration file from disk +// and key/value stores, searching in one of the defined paths. +func ReadInConfig() error { return v.ReadInConfig() } +func (v *Viper) ReadInConfig() error { + jww.INFO.Println("Attempting to read in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + jww.DEBUG.Println("Reading file: ", filename) + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + config := make(map[string]interface{}) + + err = v.unmarshalReader(bytes.NewReader(file), config) + if err != nil { + return err + } + + v.config = config + return nil +} + +// MergeInConfig merges a new configuration with an existing config. +func MergeInConfig() error { return v.MergeInConfig() } +func (v *Viper) MergeInConfig() error { + jww.INFO.Println("Attempting to merge in config file") + filename, err := v.getConfigFile() + if err != nil { + return err + } + + if !stringInSlice(v.getConfigType(), SupportedExts) { + return UnsupportedConfigError(v.getConfigType()) + } + + file, err := afero.ReadFile(v.fs, filename) + if err != nil { + return err + } + + return v.MergeConfig(bytes.NewReader(file)) +} + +// ReadConfig will read a configuration file, setting existing keys to nil if the +// key does not exist in the file. +func ReadConfig(in io.Reader) error { return v.ReadConfig(in) } +func (v *Viper) ReadConfig(in io.Reader) error { + v.config = make(map[string]interface{}) + return v.unmarshalReader(in, v.config) +} + +// MergeConfig merges a new configuration with an existing config. +func MergeConfig(in io.Reader) error { return v.MergeConfig(in) } +func (v *Viper) MergeConfig(in io.Reader) error { + if v.config == nil { + v.config = make(map[string]interface{}) + } + cfg := make(map[string]interface{}) + if err := v.unmarshalReader(in, cfg); err != nil { + return err + } + mergeMaps(cfg, v.config, nil) + return nil +} + +// WriteConfig writes the current configuration to a file. +func WriteConfig() error { return v.WriteConfig() } +func (v *Viper) WriteConfig() error { + filename, err := v.getConfigFile() + if err != nil { + return err + } + return v.writeConfig(filename, true) +} + +// SafeWriteConfig writes current configuration to file only if the file does not exist. +func SafeWriteConfig() error { return v.SafeWriteConfig() } +func (v *Viper) SafeWriteConfig() error { + filename, err := v.getConfigFile() + if err != nil { + return err + } + return v.writeConfig(filename, false) +} + +// WriteConfigAs writes current configuration to a given filename. +func WriteConfigAs(filename string) error { return v.WriteConfigAs(filename) } +func (v *Viper) WriteConfigAs(filename string) error { + return v.writeConfig(filename, true) +} + +// SafeWriteConfigAs writes current configuration to a given filename if it does not exist. +func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } +func (v *Viper) SafeWriteConfigAs(filename string) error { + return v.writeConfig(filename, false) +} + +func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) } +func (v *Viper) writeConfig(filename string, force bool) error { + jww.INFO.Println("Attempting to write configuration to file.") + ext := filepath.Ext(filename) + if len(ext) <= 1 { + return fmt.Errorf("Filename: %s requires valid extension.", filename) + } + configType := ext[1:] + if !stringInSlice(configType, SupportedExts) { + return UnsupportedConfigError(configType) + } + if v.config == nil { + v.config = make(map[string]interface{}) + } + var flags int + if force == true { + flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY + } else { + if _, err := os.Stat(filename); os.IsNotExist(err) { + flags = os.O_WRONLY + } else { + return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) + } + } + f, err := v.fs.OpenFile(filename, flags, os.FileMode(0644)) + if err != nil { + return err + } + return v.marshalWriter(f, configType) +} + +// Unmarshal a Reader into a map. +// Should probably be an unexported function. +func unmarshalReader(in io.Reader, c map[string]interface{}) error { + return v.unmarshalReader(in, c) +} +func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { + buf := new(bytes.Buffer) + buf.ReadFrom(in) + + switch strings.ToLower(v.getConfigType()) { + case "yaml", "yml": + if err := yaml.Unmarshal(buf.Bytes(), &c); err != nil { + return ConfigParseError{err} + } + + case "json": + if err := json.Unmarshal(buf.Bytes(), &c); err != nil { + return ConfigParseError{err} + } + + case "hcl": + obj, err := hcl.Parse(string(buf.Bytes())) + if err != nil { + return ConfigParseError{err} + } + if err = hcl.DecodeObject(&c, obj); err != nil { + return ConfigParseError{err} + } + + case "toml": + tree, err := toml.LoadReader(buf) + if err != nil { + return ConfigParseError{err} + } + tmap := tree.ToMap() + for k, v := range tmap { + c[k] = v + } + + case "properties", "props", "prop": + v.properties = properties.NewProperties() + var err error + if v.properties, err = properties.Load(buf.Bytes(), properties.UTF8); err != nil { + return ConfigParseError{err} + } + for _, key := range v.properties.Keys() { + value, _ := v.properties.Get(key) + // recursively build nested maps + path := strings.Split(key, ".") + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(c, path[0:len(path)-1]) + // set innermost value + deepestMap[lastKey] = value + } + } + + insensitiviseMap(c) + return nil +} + +// Marshal a map into Writer. +func marshalWriter(f afero.File, configType string) error { + return v.marshalWriter(f, configType) +} +func (v *Viper) marshalWriter(f afero.File, configType string) error { + c := v.AllSettings() + switch configType { + case "json": + b, err := json.MarshalIndent(c, "", " ") + if err != nil { + return ConfigMarshalError{err} + } + _, err = f.WriteString(string(b)) + if err != nil { + return ConfigMarshalError{err} + } + + case "hcl": + b, err := json.Marshal(c) + ast, err := hcl.Parse(string(b)) + if err != nil { + return ConfigMarshalError{err} + } + err = printer.Fprint(f, ast.Node) + if err != nil { + return ConfigMarshalError{err} + } + + case "prop", "props", "properties": + if v.properties == nil { + v.properties = properties.NewProperties() + } + p := v.properties + for _, key := range v.AllKeys() { + _, _, err := p.Set(key, v.GetString(key)) + if err != nil { + return ConfigMarshalError{err} + } + } + _, err := p.WriteComment(f, "#", properties.UTF8) + if err != nil { + return ConfigMarshalError{err} + } + + case "toml": + t, err := toml.TreeFromMap(c) + if err != nil { + return ConfigMarshalError{err} + } + s := t.String() + if _, err := f.WriteString(s); err != nil { + return ConfigMarshalError{err} + } + + case "yaml", "yml": + b, err := yaml.Marshal(c) + if err != nil { + return ConfigMarshalError{err} + } + if _, err = f.WriteString(string(b)); err != nil { + return ConfigMarshalError{err} + } + } + return nil +} + +func keyExists(k string, m map[string]interface{}) string { + lk := strings.ToLower(k) + for mk := range m { + lmk := strings.ToLower(mk) + if lmk == lk { + return mk + } + } + return "" +} + +func castToMapStringInterface( + src map[interface{}]interface{}) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[fmt.Sprintf("%v", k)] = v + } + return tgt +} + +func castMapStringToMapInterface(src map[string]string) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +func castMapFlagToMapInterface(src map[string]FlagValue) map[string]interface{} { + tgt := map[string]interface{}{} + for k, v := range src { + tgt[k] = v + } + return tgt +} + +// mergeMaps merges two maps. The `itgt` parameter is for handling go-yaml's +// insistence on parsing nested structures as `map[interface{}]interface{}` +// instead of using a `string` as the key for nest structures beyond one level +// deep. Both map types are supported as there is a go-yaml fork that uses +// `map[string]interface{}` instead. +func mergeMaps( + src, tgt map[string]interface{}, itgt map[interface{}]interface{}) { + for sk, sv := range src { + tk := keyExists(sk, tgt) + if tk == "" { + jww.TRACE.Printf("tk=\"\", tgt[%s]=%v", sk, sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + tv, ok := tgt[tk] + if !ok { + jww.TRACE.Printf("tgt[%s] != ok, tgt[%s]=%v", tk, sk, sv) + tgt[sk] = sv + if itgt != nil { + itgt[sk] = sv + } + continue + } + + svType := reflect.TypeOf(sv) + tvType := reflect.TypeOf(tv) + if svType != tvType { + jww.ERROR.Printf( + "svType != tvType; key=%s, st=%v, tt=%v, sv=%v, tv=%v", + sk, svType, tvType, sv, tv) + continue + } + + jww.TRACE.Printf("processing key=%s, st=%v, tt=%v, sv=%v, tv=%v", + sk, svType, tvType, sv, tv) + + switch ttv := tv.(type) { + case map[interface{}]interface{}: + jww.TRACE.Printf("merging maps (must convert)") + tsv := sv.(map[interface{}]interface{}) + ssv := castToMapStringInterface(tsv) + stv := castToMapStringInterface(ttv) + mergeMaps(ssv, stv, ttv) + case map[string]interface{}: + jww.TRACE.Printf("merging maps") + mergeMaps(sv.(map[string]interface{}), ttv, nil) + default: + jww.TRACE.Printf("setting value") + tgt[tk] = sv + if itgt != nil { + itgt[tk] = sv + } + } + } +} + +// ReadRemoteConfig attempts to get configuration from a remote source +// and read it in the remote configuration registry. +func ReadRemoteConfig() error { return v.ReadRemoteConfig() } +func (v *Viper) ReadRemoteConfig() error { + return v.getKeyValueConfig() +} + +func WatchRemoteConfig() error { return v.WatchRemoteConfig() } +func (v *Viper) WatchRemoteConfig() error { + return v.watchKeyValueConfig() +} + +func (v *Viper) WatchRemoteConfigOnChannel() error { + return v.watchKeyValueConfigOnChannel() +} + +func (v *Viper) insensitiviseMaps() { + insensitiviseMap(v.config) + insensitiviseMap(v.defaults) + insensitiviseMap(v.override) + insensitiviseMap(v.kvstore) +} + +// Retrieve the first found remote configuration. +func (v *Viper) getKeyValueConfig() error { + if RemoteConfig == nil { + return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'") + } + + for _, rp := range v.remoteProviders { + val, err := v.getRemoteConfig(rp) + if err != nil { + continue + } + v.kvstore = val + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) { + reader, err := RemoteConfig.Get(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfigOnChannel() error { + for _, rp := range v.remoteProviders { + respc, _ := RemoteConfig.WatchChannel(rp) + //Todo: Add quit channel + go func(rc <-chan *RemoteResponse) { + for { + b := <-rc + reader := bytes.NewReader(b.Value) + v.unmarshalReader(reader, v.kvstore) + } + }(respc) + return nil + } + return RemoteConfigError("No Files Found") +} + +// Retrieve the first found remote configuration. +func (v *Viper) watchKeyValueConfig() error { + for _, rp := range v.remoteProviders { + val, err := v.watchRemoteConfig(rp) + if err != nil { + continue + } + v.kvstore = val + return nil + } + return RemoteConfigError("No Files Found") +} + +func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) { + reader, err := RemoteConfig.Watch(provider) + if err != nil { + return nil, err + } + err = v.unmarshalReader(reader, v.kvstore) + return v.kvstore, err +} + +// AllKeys returns all keys holding a value, regardless of where they are set. +// Nested keys are returned with a v.keyDelim (= ".") separator +func AllKeys() []string { return v.AllKeys() } +func (v *Viper) AllKeys() []string { + m := map[string]bool{} + // add all paths, by order of descending priority to ensure correct shadowing + m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "") + m = v.flattenAndMergeMap(m, v.override, "") + m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags)) + m = v.mergeFlatMap(m, castMapStringToMapInterface(v.env)) + m = v.flattenAndMergeMap(m, v.config, "") + m = v.flattenAndMergeMap(m, v.kvstore, "") + m = v.flattenAndMergeMap(m, v.defaults, "") + + // convert set of paths to list + a := []string{} + for x := range m { + a = append(a, x) + } + return a +} + +// flattenAndMergeMap recursively flattens the given map into a map[string]bool +// of key paths (used as a set, easier to manipulate than a []string): +// - each path is merged into a single key string, delimited with v.keyDelim (= ".") +// - if a path is shadowed by an earlier value in the initial shadow map, +// it is skipped. +// The resulting set of paths is merged to the given shadow set at the same time. +func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interface{}, prefix string) map[string]bool { + if shadow != nil && prefix != "" && shadow[prefix] { + // prefix is shadowed => nothing more to flatten + return shadow + } + if shadow == nil { + shadow = make(map[string]bool) + } + + var m2 map[string]interface{} + if prefix != "" { + prefix += v.keyDelim + } + for k, val := range m { + fullKey := prefix + k + switch val.(type) { + case map[string]interface{}: + m2 = val.(map[string]interface{}) + case map[interface{}]interface{}: + m2 = cast.ToStringMap(val) + default: + // immediate value + shadow[strings.ToLower(fullKey)] = true + continue + } + // recursively merge to shadow map + shadow = v.flattenAndMergeMap(shadow, m2, fullKey) + } + return shadow +} + +// mergeFlatMap merges the given maps, excluding values of the second map +// shadowed by values from the first map. +func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool { + // scan keys +outer: + for k, _ := range m { + path := strings.Split(k, v.keyDelim) + // scan intermediate paths + var parentKey string + for i := 1; i < len(path); i++ { + parentKey = strings.Join(path[0:i], v.keyDelim) + if shadow[parentKey] { + // path is shadowed, continue + continue outer + } + } + // add key + shadow[strings.ToLower(k)] = true + } + return shadow +} + +// AllSettings merges all settings and returns them as a map[string]interface{}. +func AllSettings() map[string]interface{} { return v.AllSettings() } +func (v *Viper) AllSettings() map[string]interface{} { + m := map[string]interface{}{} + // start from the list of keys, and construct the map one value at a time + for _, k := range v.AllKeys() { + value := v.Get(k) + if value == nil { + // should not happen, since AllKeys() returns only keys holding a value, + // check just in case anything changes + continue + } + path := strings.Split(k, v.keyDelim) + lastKey := strings.ToLower(path[len(path)-1]) + deepestMap := deepSearch(m, path[0:len(path)-1]) + // set innermost value + deepestMap[lastKey] = value + } + return m +} + +// SetFs sets the filesystem to use to read configuration. +func SetFs(fs afero.Fs) { v.SetFs(fs) } +func (v *Viper) SetFs(fs afero.Fs) { + v.fs = fs +} + +// SetConfigName sets name for the config file. +// Does not include extension. +func SetConfigName(in string) { v.SetConfigName(in) } +func (v *Viper) SetConfigName(in string) { + if in != "" { + v.configName = in + v.configFile = "" + } +} + +// SetConfigType sets the type of the configuration returned by the +// remote source, e.g. "json". +func SetConfigType(in string) { v.SetConfigType(in) } +func (v *Viper) SetConfigType(in string) { + if in != "" { + v.configType = in + } +} + +func (v *Viper) getConfigType() string { + if v.configType != "" { + return v.configType + } + + cf, err := v.getConfigFile() + if err != nil { + return "" + } + + ext := filepath.Ext(cf) + + if len(ext) > 1 { + return ext[1:] + } + + return "" +} + +func (v *Viper) getConfigFile() (string, error) { + if v.configFile == "" { + cf, err := v.findConfigFile() + if err != nil { + return "", err + } + v.configFile = cf + } + return v.configFile, nil +} + +func (v *Viper) searchInPath(in string) (filename string) { + jww.DEBUG.Println("Searching for config in ", in) + for _, ext := range SupportedExts { + jww.DEBUG.Println("Checking for", filepath.Join(in, v.configName+"."+ext)) + if b, _ := exists(v.fs, filepath.Join(in, v.configName+"."+ext)); b { + jww.DEBUG.Println("Found: ", filepath.Join(in, v.configName+"."+ext)) + return filepath.Join(in, v.configName+"."+ext) + } + } + + return "" +} + +// Search all configPaths for any config file. +// Returns the first path that exists (and is a config file). +func (v *Viper) findConfigFile() (string, error) { + jww.INFO.Println("Searching for config in ", v.configPaths) + + for _, cp := range v.configPaths { + file := v.searchInPath(cp) + if file != "" { + return file, nil + } + } + return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)} +} + +// Debug prints all configuration registries for debugging +// purposes. +func Debug() { v.Debug() } +func (v *Viper) Debug() { + fmt.Printf("Aliases:\n%#v\n", v.aliases) + fmt.Printf("Override:\n%#v\n", v.override) + fmt.Printf("PFlags:\n%#v\n", v.pflags) + fmt.Printf("Env:\n%#v\n", v.env) + fmt.Printf("Key/Value Store:\n%#v\n", v.kvstore) + fmt.Printf("Config:\n%#v\n", v.config) + fmt.Printf("Defaults:\n%#v\n", v.defaults) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.gitignore new file mode 100755 index 0000000..e0170a5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.gitignore @@ -0,0 +1,4 @@ +/dep +/testdep +/profile.out +/coverage.txt diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.travis.yml new file mode 100755 index 0000000..1456363 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/.travis.yml @@ -0,0 +1,13 @@ +language: go +go: + - 1.8 + - 1.9 + - tip + +install: +- go get github.com/go-task/task/cmd/task + +script: +- task dl-deps +- task lint +- task test diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock new file mode 100755 index 0000000..1f5739c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.lock @@ -0,0 +1,27 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/davecgh/go-spew" + packages = ["spew"] + revision = "346938d642f2ec3594ed81d874461961cd0faa76" + version = "v1.1.0" + +[[projects]] + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + +[[projects]] + name = "github.com/stretchr/testify" + packages = ["assert"] + revision = "b91bfb9ebec76498946beb6af7c0230c7cc7ba6c" + version = "v1.2.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "50e2495ec1af6e2f7ffb2f3551e4300d30357d7c7fe38ff6056469fa9cfb3673" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml new file mode 100755 index 0000000..f87e18e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Gopkg.toml @@ -0,0 +1,3 @@ +[[constraint]] + name = "github.com/stretchr/testify" + version = "~1.2.0" diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/LICENSE new file mode 100755 index 0000000..44d4d9d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/LICENSE @@ -0,0 +1,22 @@ +The MIT License + +Copyright (c) 2014 Stretchr, Inc. +Copyright (c) 2017-2018 objx contributors + +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/skycoin/skycoin/vendor/github.com/stretchr/objx/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/README.md new file mode 100755 index 0000000..4e2400e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/README.md @@ -0,0 +1,78 @@ +# Objx +[![Build Status](https://travis-ci.org/stretchr/objx.svg?branch=master)](https://travis-ci.org/stretchr/objx) +[![Go Report Card](https://goreportcard.com/badge/github.com/stretchr/objx)](https://goreportcard.com/report/github.com/stretchr/objx) +[![Sourcegraph](https://sourcegraph.com/github.com/stretchr/objx/-/badge.svg)](https://sourcegraph.com/github.com/stretchr/objx) +[![GoDoc](https://godoc.org/github.com/stretchr/objx?status.svg)](https://godoc.org/github.com/stretchr/objx) + +Objx - Go package for dealing with maps, slices, JSON and other data. + +Get started: + +- Install Objx with [one line of code](#installation), or [update it with another](#staying-up-to-date) +- Check out the API Documentation http://godoc.org/github.com/stretchr/objx + +## Overview +Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes a powerful `Get` method (among others) that allows you to easily and quickly get access to data within the map, without having to worry too much about type assertions, missing data, default values etc. + +### Pattern +Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. Call one of the `objx.` functions to create your `objx.Map` to get going: + + m, err := objx.FromJSON(json) + +NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, the rest will be optimistic and try to figure things out without panicking. + +Use `Get` to access the value you're interested in. You can use dot and array +notation too: + + m.Get("places[0].latlng") + +Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. + + if m.Get("code").IsStr() { // Your code... } + +Or you can just assume the type, and use one of the strong type methods to extract the real value: + + m.Get("code").Int() + +If there's no value there (or if it's the wrong type) then a default value will be returned, or you can be explicit about the default value. + + Get("code").Int(-1) + +If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, manipulating and selecting that data. You can find out more by exploring the index below. + +### Reading data +A simple example of how to use Objx: + + // Use MustFromJSON to make an objx.Map from some JSON + m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) + + // Get the details + name := m.Get("name").Str() + age := m.Get("age").Int() + + // Get their nickname (or use their name if they don't have one) + nickname := m.Get("nickname").Str(name) + +### Ranging +Since `objx.Map` is a `map[string]interface{}` you can treat it as such. For example, to `range` the data, do what you would expect: + + m := objx.MustFromJSON(json) + for key, value := range m { + // Your code... + } + +## Installation +To install Objx, use go get: + + go get github.com/stretchr/objx + +### Staying up to date +To update Objx to the latest version, run: + + go get -u github.com/stretchr/objx + +### Supported go versions +We support the lastest two major Go versions, which are 1.8 and 1.9 at the moment. + +## Contributing +Please feel free to submit issues, fork the repository and send pull requests! diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml new file mode 100755 index 0000000..403b5f0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/Taskfile.yml @@ -0,0 +1,26 @@ +default: + deps: [test] + +dl-deps: + desc: Downloads cli dependencies + cmds: + - go get -u github.com/golang/lint/golint + - go get -u github.com/golang/dep/cmd/dep + +update-deps: + desc: Updates dependencies + cmds: + - dep ensure + - dep ensure -update + - dep prune + +lint: + desc: Runs golint + cmds: + - golint $(ls *.go | grep -v "doc.go") + silent: true + +test: + desc: Runs go tests + cmds: + - go test -race . diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/accessors.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/accessors.go new file mode 100755 index 0000000..d95be0c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/accessors.go @@ -0,0 +1,171 @@ +package objx + +import ( + "fmt" + "regexp" + "strconv" + "strings" +) + +// arrayAccesRegexString is the regex used to extract the array number +// from the access path +const arrayAccesRegexString = `^(.+)\[([0-9]+)\]$` + +// arrayAccesRegex is the compiled arrayAccesRegexString +var arrayAccesRegex = regexp.MustCompile(arrayAccesRegexString) + +// Get gets the value using the specified selector and +// returns it inside a new Obj object. +// +// If it cannot find the value, Get will return a nil +// value inside an instance of Obj. +// +// Get can only operate directly on map[string]interface{} and []interface. +// +// Example +// +// To access the title of the third chapter of the second book, do: +// +// o.Get("books[1].chapters[2].title") +func (m Map) Get(selector string) *Value { + rawObj := access(m, selector, nil, false, false) + return &Value{data: rawObj} +} + +// Set sets the value using the specified selector and +// returns the object on which Set was called. +// +// Set can only operate directly on map[string]interface{} and []interface +// +// Example +// +// To set the title of the third chapter of the second book, do: +// +// o.Set("books[1].chapters[2].title","Time to Go") +func (m Map) Set(selector string, value interface{}) Map { + access(m, selector, value, true, false) + return m +} + +// access accesses the object using the selector and performs the +// appropriate action. +func access(current, selector, value interface{}, isSet, panics bool) interface{} { + + switch selector.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + + if array, ok := current.([]interface{}); ok { + index := intFromInterface(selector) + + if index >= len(array) { + if panics { + panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) + } + return nil + } + + return array[index] + } + + return nil + + case string: + + selStr := selector.(string) + selSegs := strings.SplitN(selStr, PathSeparator, 2) + thisSel := selSegs[0] + index := -1 + var err error + + if strings.Contains(thisSel, "[") { + arrayMatches := arrayAccesRegex.FindStringSubmatch(thisSel) + + if len(arrayMatches) > 0 { + // Get the key into the map + thisSel = arrayMatches[1] + + // Get the index into the array at the key + index, err = strconv.Atoi(arrayMatches[2]) + + if err != nil { + // This should never happen. If it does, something has gone + // seriously wrong. Panic. + panic("objx: Array index is not an integer. Must use array[int].") + } + } + } + + if curMap, ok := current.(Map); ok { + current = map[string]interface{}(curMap) + } + + // get the object in question + switch current.(type) { + case map[string]interface{}: + curMSI := current.(map[string]interface{}) + if len(selSegs) <= 1 && isSet { + curMSI[thisSel] = value + return nil + } + current = curMSI[thisSel] + default: + current = nil + } + + if current == nil && panics { + panic(fmt.Sprintf("objx: '%v' invalid on object.", selector)) + } + + // do we need to access the item of an array? + if index > -1 { + if array, ok := current.([]interface{}); ok { + if index < len(array) { + current = array[index] + } else { + if panics { + panic(fmt.Sprintf("objx: Index %d is out of range. Slice only contains %d items.", index, len(array))) + } + current = nil + } + } + } + + if len(selSegs) > 1 { + current = access(current, selSegs[1], value, isSet, panics) + } + + } + return current +} + +// intFromInterface converts an interface object to the largest +// representation of an unsigned integer using a type switch and +// assertions +func intFromInterface(selector interface{}) int { + var value int + switch selector.(type) { + case int: + value = selector.(int) + case int8: + value = int(selector.(int8)) + case int16: + value = int(selector.(int16)) + case int32: + value = int(selector.(int32)) + case int64: + value = int(selector.(int64)) + case uint: + value = int(selector.(uint)) + case uint8: + value = int(selector.(uint8)) + case uint16: + value = int(selector.(uint16)) + case uint32: + value = int(selector.(uint32)) + case uint64: + value = int(selector.(uint64)) + default: + panic("objx: array access argument is not an integer type (this should never happen)") + } + return value +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/constants.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/constants.go new file mode 100755 index 0000000..f9eb42a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/constants.go @@ -0,0 +1,13 @@ +package objx + +const ( + // PathSeparator is the character used to separate the elements + // of the keypath. + // + // For example, `location.address.city` + PathSeparator string = "." + + // SignatureSeparator is the character that is used to + // separate the Base64 string from the security signature. + SignatureSeparator = "_" +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/conversions.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/conversions.go new file mode 100755 index 0000000..5e020f3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/conversions.go @@ -0,0 +1,108 @@ +package objx + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "net/url" +) + +// JSON converts the contained object to a JSON string +// representation +func (m Map) JSON() (string, error) { + result, err := json.Marshal(m) + if err != nil { + err = errors.New("objx: JSON encode failed with: " + err.Error()) + } + return string(result), err +} + +// MustJSON converts the contained object to a JSON string +// representation and panics if there is an error +func (m Map) MustJSON() string { + result, err := m.JSON() + if err != nil { + panic(err.Error()) + } + return result +} + +// Base64 converts the contained object to a Base64 string +// representation of the JSON string representation +func (m Map) Base64() (string, error) { + var buf bytes.Buffer + + jsonData, err := m.JSON() + if err != nil { + return "", err + } + + encoder := base64.NewEncoder(base64.StdEncoding, &buf) + _, err = encoder.Write([]byte(jsonData)) + if err != nil { + return "", err + } + _ = encoder.Close() + + return buf.String(), nil +} + +// MustBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and panics +// if there is an error +func (m Map) MustBase64() string { + result, err := m.Base64() + if err != nil { + panic(err.Error()) + } + return result +} + +// SignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key. +func (m Map) SignedBase64(key string) (string, error) { + base64, err := m.Base64() + if err != nil { + return "", err + } + + sig := HashWithKey(base64, key) + return base64 + SignatureSeparator + sig, nil +} + +// MustSignedBase64 converts the contained object to a Base64 string +// representation of the JSON string representation and signs it +// using the provided key and panics if there is an error +func (m Map) MustSignedBase64(key string) string { + result, err := m.SignedBase64(key) + if err != nil { + panic(err.Error()) + } + return result +} + +/* + URL Query + ------------------------------------------------ +*/ + +// URLValues creates a url.Values object from an Obj. This +// function requires that the wrapped object be a map[string]interface{} +func (m Map) URLValues() url.Values { + vals := make(url.Values) + for k, v := range m { + //TODO: can this be done without sprintf? + vals.Set(k, fmt.Sprintf("%v", v)) + } + return vals +} + +// URLQuery gets an encoded URL query representing the given +// Obj. This function requires that the wrapped object be a +// map[string]interface{} +func (m Map) URLQuery() (string, error) { + return m.URLValues().Encode(), nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/doc.go new file mode 100755 index 0000000..6d6af1a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/doc.go @@ -0,0 +1,66 @@ +/* +Objx - Go package for dealing with maps, slices, JSON and other data. + +Overview + +Objx provides the `objx.Map` type, which is a `map[string]interface{}` that exposes +a powerful `Get` method (among others) that allows you to easily and quickly get +access to data within the map, without having to worry too much about type assertions, +missing data, default values etc. + +Pattern + +Objx uses a preditable pattern to make access data from within `map[string]interface{}` easy. +Call one of the `objx.` functions to create your `objx.Map` to get going: + + m, err := objx.FromJSON(json) + +NOTE: Any methods or functions with the `Must` prefix will panic if something goes wrong, +the rest will be optimistic and try to figure things out without panicking. + +Use `Get` to access the value you're interested in. You can use dot and array +notation too: + + m.Get("places[0].latlng") + +Once you have sought the `Value` you're interested in, you can use the `Is*` methods to determine its type. + + if m.Get("code").IsStr() { // Your code... } + +Or you can just assume the type, and use one of the strong type methods to extract the real value: + + m.Get("code").Int() + +If there's no value there (or if it's the wrong type) then a default value will be returned, +or you can be explicit about the default value. + + Get("code").Int(-1) + +If you're dealing with a slice of data as a value, Objx provides many useful methods for iterating, +manipulating and selecting that data. You can find out more by exploring the index below. + +Reading data + +A simple example of how to use Objx: + + // Use MustFromJSON to make an objx.Map from some JSON + m := objx.MustFromJSON(`{"name": "Mat", "age": 30}`) + + // Get the details + name := m.Get("name").Str() + age := m.Get("age").Int() + + // Get their nickname (or use their name if they don't have one) + nickname := m.Get("nickname").Str(name) + +Ranging + +Since `objx.Map` is a `map[string]interface{}` you can treat it as such. +For example, to `range` the data, do what you would expect: + + m := objx.MustFromJSON(json) + for key, value := range m { + // Your code... + } +*/ +package objx diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/map.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/map.go new file mode 100755 index 0000000..7e9389a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/map.go @@ -0,0 +1,193 @@ +package objx + +import ( + "encoding/base64" + "encoding/json" + "errors" + "io/ioutil" + "net/url" + "strings" +) + +// MSIConvertable is an interface that defines methods for converting your +// custom types to a map[string]interface{} representation. +type MSIConvertable interface { + // MSI gets a map[string]interface{} (msi) representing the + // object. + MSI() map[string]interface{} +} + +// Map provides extended functionality for working with +// untyped data, in particular map[string]interface (msi). +type Map map[string]interface{} + +// Value returns the internal value instance +func (m Map) Value() *Value { + return &Value{data: m} +} + +// Nil represents a nil Map. +var Nil = New(nil) + +// New creates a new Map containing the map[string]interface{} in the data argument. +// If the data argument is not a map[string]interface, New attempts to call the +// MSI() method on the MSIConvertable interface to create one. +func New(data interface{}) Map { + if _, ok := data.(map[string]interface{}); !ok { + if converter, ok := data.(MSIConvertable); ok { + data = converter.MSI() + } else { + return nil + } + } + return Map(data.(map[string]interface{})) +} + +// MSI creates a map[string]interface{} and puts it inside a new Map. +// +// The arguments follow a key, value pattern. +// +// Panics +// +// Panics if any key argument is non-string or if there are an odd number of arguments. +// +// Example +// +// To easily create Maps: +// +// m := objx.MSI("name", "Mat", "age", 29, "subobj", objx.MSI("active", true)) +// +// // creates an Map equivalent to +// m := objx.New(map[string]interface{}{"name": "Mat", "age": 29, "subobj": map[string]interface{}{"active": true}}) +func MSI(keyAndValuePairs ...interface{}) Map { + newMap := make(map[string]interface{}) + keyAndValuePairsLen := len(keyAndValuePairs) + if keyAndValuePairsLen%2 != 0 { + panic("objx: MSI must have an even number of arguments following the 'key, value' pattern.") + } + + for i := 0; i < keyAndValuePairsLen; i = i + 2 { + key := keyAndValuePairs[i] + value := keyAndValuePairs[i+1] + + // make sure the key is a string + keyString, keyStringOK := key.(string) + if !keyStringOK { + panic("objx: MSI must follow 'string, interface{}' pattern. " + keyString + " is not a valid key.") + } + newMap[keyString] = value + } + return New(newMap) +} + +// ****** Conversion Constructors + +// MustFromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Panics if the JSON is invalid. +func MustFromJSON(jsonString string) Map { + o, err := FromJSON(jsonString) + if err != nil { + panic("objx: MustFromJSON failed with error: " + err.Error()) + } + return o +} + +// FromJSON creates a new Map containing the data specified in the +// jsonString. +// +// Returns an error if the JSON is invalid. +func FromJSON(jsonString string) (Map, error) { + var data interface{} + err := json.Unmarshal([]byte(jsonString), &data) + if err != nil { + return Nil, err + } + return New(data), nil +} + +// FromBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by Base64 +func FromBase64(base64String string) (Map, error) { + decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(base64String)) + decoded, err := ioutil.ReadAll(decoder) + if err != nil { + return nil, err + } + return FromJSON(string(decoded)) +} + +// MustFromBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromBase64(base64String string) Map { + result, err := FromBase64(base64String) + if err != nil { + panic("objx: MustFromBase64 failed with error: " + err.Error()) + } + return result +} + +// FromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string. +// +// The string is an encoded JSON string returned by SignedBase64 +func FromSignedBase64(base64String, key string) (Map, error) { + parts := strings.Split(base64String, SignatureSeparator) + if len(parts) != 2 { + return nil, errors.New("objx: Signed base64 string is malformed") + } + + sig := HashWithKey(parts[0], key) + if parts[1] != sig { + return nil, errors.New("objx: Signature for base64 data does not match") + } + return FromBase64(parts[0]) +} + +// MustFromSignedBase64 creates a new Obj containing the data specified +// in the Base64 string and panics if there is an error. +// +// The string is an encoded JSON string returned by Base64 +func MustFromSignedBase64(base64String, key string) Map { + result, err := FromSignedBase64(base64String, key) + if err != nil { + panic("objx: MustFromSignedBase64 failed with error: " + err.Error()) + } + return result +} + +// FromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +func FromURLQuery(query string) (Map, error) { + vals, err := url.ParseQuery(query) + if err != nil { + return nil, err + } + + m := make(map[string]interface{}) + for k, vals := range vals { + m[k] = vals[0] + } + return New(m), nil +} + +// MustFromURLQuery generates a new Obj by parsing the specified +// query. +// +// For queries with multiple values, the first value is selected. +// +// Panics if it encounters an error +func MustFromURLQuery(query string) Map { + o, err := FromURLQuery(query) + if err != nil { + panic("objx: MustFromURLQuery failed with error: " + err.Error()) + } + return o +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/mutations.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/mutations.go new file mode 100755 index 0000000..e7b8eb7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/mutations.go @@ -0,0 +1,74 @@ +package objx + +// Exclude returns a new Map with the keys in the specified []string +// excluded. +func (m Map) Exclude(exclude []string) Map { + excluded := make(Map) + for k, v := range m { + var shouldInclude = true + for _, toExclude := range exclude { + if k == toExclude { + shouldInclude = false + break + } + } + if shouldInclude { + excluded[k] = v + } + } + return excluded +} + +// Copy creates a shallow copy of the Obj. +func (m Map) Copy() Map { + copied := make(map[string]interface{}) + for k, v := range m { + copied[k] = v + } + return New(copied) +} + +// Merge blends the specified map with a copy of this map and returns the result. +// +// Keys that appear in both will be selected from the specified map. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) Merge(merge Map) Map { + return m.Copy().MergeHere(merge) +} + +// MergeHere blends the specified map with this map and returns the current map. +// +// Keys that appear in both will be selected from the specified map. The original map +// will be modified. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) MergeHere(merge Map) Map { + for k, v := range merge { + m[k] = v + } + return m +} + +// Transform builds a new Obj giving the transformer a chance +// to change the keys and values as it goes. This method requires that +// the wrapped object be a map[string]interface{} +func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map { + newMap := make(map[string]interface{}) + for k, v := range m { + modifiedKey, modifiedVal := transformer(k, v) + newMap[modifiedKey] = modifiedVal + } + return New(newMap) +} + +// TransformKeys builds a new map using the specified key mapping. +// +// Unspecified keys will be unaltered. +// This method requires that the wrapped object be a map[string]interface{} +func (m Map) TransformKeys(mapping map[string]string) Map { + return m.Transform(func(key string, value interface{}) (string, interface{}) { + if newKey, ok := mapping[key]; ok { + return newKey, value + } + return key, value + }) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/security.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/security.go new file mode 100755 index 0000000..e052ff8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/security.go @@ -0,0 +1,17 @@ +package objx + +import ( + "crypto/sha1" + "encoding/hex" +) + +// HashWithKey hashes the specified string using the security +// key. +func HashWithKey(data, key string) string { + hash := sha1.New() + _, err := hash.Write([]byte(data + ":" + key)) + if err != nil { + return "" + } + return hex.EncodeToString(hash.Sum(nil)) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/tests.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/tests.go new file mode 100755 index 0000000..d9e0b47 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/tests.go @@ -0,0 +1,17 @@ +package objx + +// Has gets whether there is something at the specified selector +// or not. +// +// If m is nil, Has will always return false. +func (m Map) Has(selector string) bool { + if m == nil { + return false + } + return !m.Get(selector).IsNil() +} + +// IsNil gets whether the data is nil or not. +func (v *Value) IsNil() bool { + return v == nil || v.data == nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go new file mode 100755 index 0000000..202a91f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/type_specific_codegen.go @@ -0,0 +1,2501 @@ +package objx + +/* + Inter (interface{} and []interface{}) +*/ + +// Inter gets the value as a interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Inter(optionalDefault ...interface{}) interface{} { + if s, ok := v.data.(interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInter gets the value as a interface{}. +// +// Panics if the object is not a interface{}. +func (v *Value) MustInter() interface{} { + return v.data.(interface{}) +} + +// InterSlice gets the value as a []interface{}, returns the optionalDefault +// value or nil if the value is not a []interface{}. +func (v *Value) InterSlice(optionalDefault ...[]interface{}) []interface{} { + if s, ok := v.data.([]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInterSlice gets the value as a []interface{}. +// +// Panics if the object is not a []interface{}. +func (v *Value) MustInterSlice() []interface{} { + return v.data.([]interface{}) +} + +// IsInter gets whether the object contained is a interface{} or not. +func (v *Value) IsInter() bool { + _, ok := v.data.(interface{}) + return ok +} + +// IsInterSlice gets whether the object contained is a []interface{} or not. +func (v *Value) IsInterSlice() bool { + _, ok := v.data.([]interface{}) + return ok +} + +// EachInter calls the specified callback for each object +// in the []interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachInter(callback func(int, interface{}) bool) *Value { + for index, val := range v.MustInterSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInter uses the specified decider function to select items +// from the []interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInter(decider func(int, interface{}) bool) *Value { + var selected []interface{} + v.EachInter(func(index int, val interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInter uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]interface{}. +func (v *Value) GroupInter(grouper func(int, interface{}) string) *Value { + groups := make(map[string][]interface{}) + v.EachInter(func(index int, val interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInter uses the specified function to replace each interface{}s +// by iterating each item. The data in the returned result will be a +// []interface{} containing the replaced items. +func (v *Value) ReplaceInter(replacer func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + replaced := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInter uses the specified collector function to collect a value +// for each of the interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInter(collector func(int, interface{}) interface{}) *Value { + arr := v.MustInterSlice() + collected := make([]interface{}, len(arr)) + v.EachInter(func(index int, val interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + MSI (map[string]interface{} and []map[string]interface{}) +*/ + +// MSI gets the value as a map[string]interface{}, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) MSI(optionalDefault ...map[string]interface{}) map[string]interface{} { + if s, ok := v.data.(map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSI gets the value as a map[string]interface{}. +// +// Panics if the object is not a map[string]interface{}. +func (v *Value) MustMSI() map[string]interface{} { + return v.data.(map[string]interface{}) +} + +// MSISlice gets the value as a []map[string]interface{}, returns the optionalDefault +// value or nil if the value is not a []map[string]interface{}. +func (v *Value) MSISlice(optionalDefault ...[]map[string]interface{}) []map[string]interface{} { + if s, ok := v.data.([]map[string]interface{}); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustMSISlice gets the value as a []map[string]interface{}. +// +// Panics if the object is not a []map[string]interface{}. +func (v *Value) MustMSISlice() []map[string]interface{} { + return v.data.([]map[string]interface{}) +} + +// IsMSI gets whether the object contained is a map[string]interface{} or not. +func (v *Value) IsMSI() bool { + _, ok := v.data.(map[string]interface{}) + return ok +} + +// IsMSISlice gets whether the object contained is a []map[string]interface{} or not. +func (v *Value) IsMSISlice() bool { + _, ok := v.data.([]map[string]interface{}) + return ok +} + +// EachMSI calls the specified callback for each object +// in the []map[string]interface{}. +// +// Panics if the object is the wrong type. +func (v *Value) EachMSI(callback func(int, map[string]interface{}) bool) *Value { + for index, val := range v.MustMSISlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereMSI uses the specified decider function to select items +// from the []map[string]interface{}. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereMSI(decider func(int, map[string]interface{}) bool) *Value { + var selected []map[string]interface{} + v.EachMSI(func(index int, val map[string]interface{}) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupMSI uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]map[string]interface{}. +func (v *Value) GroupMSI(grouper func(int, map[string]interface{}) string) *Value { + groups := make(map[string][]map[string]interface{}) + v.EachMSI(func(index int, val map[string]interface{}) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]map[string]interface{}, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceMSI uses the specified function to replace each map[string]interface{}s +// by iterating each item. The data in the returned result will be a +// []map[string]interface{} containing the replaced items. +func (v *Value) ReplaceMSI(replacer func(int, map[string]interface{}) map[string]interface{}) *Value { + arr := v.MustMSISlice() + replaced := make([]map[string]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectMSI uses the specified collector function to collect a value +// for each of the map[string]interface{}s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectMSI(collector func(int, map[string]interface{}) interface{}) *Value { + arr := v.MustMSISlice() + collected := make([]interface{}, len(arr)) + v.EachMSI(func(index int, val map[string]interface{}) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + ObjxMap ((Map) and [](Map)) +*/ + +// ObjxMap gets the value as a (Map), returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) ObjxMap(optionalDefault ...(Map)) Map { + if s, ok := v.data.((Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return New(nil) +} + +// MustObjxMap gets the value as a (Map). +// +// Panics if the object is not a (Map). +func (v *Value) MustObjxMap() Map { + return v.data.((Map)) +} + +// ObjxMapSlice gets the value as a [](Map), returns the optionalDefault +// value or nil if the value is not a [](Map). +func (v *Value) ObjxMapSlice(optionalDefault ...[](Map)) [](Map) { + if s, ok := v.data.([](Map)); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustObjxMapSlice gets the value as a [](Map). +// +// Panics if the object is not a [](Map). +func (v *Value) MustObjxMapSlice() [](Map) { + return v.data.([](Map)) +} + +// IsObjxMap gets whether the object contained is a (Map) or not. +func (v *Value) IsObjxMap() bool { + _, ok := v.data.((Map)) + return ok +} + +// IsObjxMapSlice gets whether the object contained is a [](Map) or not. +func (v *Value) IsObjxMapSlice() bool { + _, ok := v.data.([](Map)) + return ok +} + +// EachObjxMap calls the specified callback for each object +// in the [](Map). +// +// Panics if the object is the wrong type. +func (v *Value) EachObjxMap(callback func(int, Map) bool) *Value { + for index, val := range v.MustObjxMapSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereObjxMap uses the specified decider function to select items +// from the [](Map). The object contained in the result will contain +// only the selected items. +func (v *Value) WhereObjxMap(decider func(int, Map) bool) *Value { + var selected [](Map) + v.EachObjxMap(func(index int, val Map) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupObjxMap uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][](Map). +func (v *Value) GroupObjxMap(grouper func(int, Map) string) *Value { + groups := make(map[string][](Map)) + v.EachObjxMap(func(index int, val Map) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([](Map), 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceObjxMap uses the specified function to replace each (Map)s +// by iterating each item. The data in the returned result will be a +// [](Map) containing the replaced items. +func (v *Value) ReplaceObjxMap(replacer func(int, Map) Map) *Value { + arr := v.MustObjxMapSlice() + replaced := make([](Map), len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectObjxMap uses the specified collector function to collect a value +// for each of the (Map)s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectObjxMap(collector func(int, Map) interface{}) *Value { + arr := v.MustObjxMapSlice() + collected := make([]interface{}, len(arr)) + v.EachObjxMap(func(index int, val Map) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Bool (bool and []bool) +*/ + +// Bool gets the value as a bool, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Bool(optionalDefault ...bool) bool { + if s, ok := v.data.(bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return false +} + +// MustBool gets the value as a bool. +// +// Panics if the object is not a bool. +func (v *Value) MustBool() bool { + return v.data.(bool) +} + +// BoolSlice gets the value as a []bool, returns the optionalDefault +// value or nil if the value is not a []bool. +func (v *Value) BoolSlice(optionalDefault ...[]bool) []bool { + if s, ok := v.data.([]bool); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustBoolSlice gets the value as a []bool. +// +// Panics if the object is not a []bool. +func (v *Value) MustBoolSlice() []bool { + return v.data.([]bool) +} + +// IsBool gets whether the object contained is a bool or not. +func (v *Value) IsBool() bool { + _, ok := v.data.(bool) + return ok +} + +// IsBoolSlice gets whether the object contained is a []bool or not. +func (v *Value) IsBoolSlice() bool { + _, ok := v.data.([]bool) + return ok +} + +// EachBool calls the specified callback for each object +// in the []bool. +// +// Panics if the object is the wrong type. +func (v *Value) EachBool(callback func(int, bool) bool) *Value { + for index, val := range v.MustBoolSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereBool uses the specified decider function to select items +// from the []bool. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereBool(decider func(int, bool) bool) *Value { + var selected []bool + v.EachBool(func(index int, val bool) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupBool uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]bool. +func (v *Value) GroupBool(grouper func(int, bool) string) *Value { + groups := make(map[string][]bool) + v.EachBool(func(index int, val bool) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]bool, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceBool uses the specified function to replace each bools +// by iterating each item. The data in the returned result will be a +// []bool containing the replaced items. +func (v *Value) ReplaceBool(replacer func(int, bool) bool) *Value { + arr := v.MustBoolSlice() + replaced := make([]bool, len(arr)) + v.EachBool(func(index int, val bool) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectBool uses the specified collector function to collect a value +// for each of the bools in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectBool(collector func(int, bool) interface{}) *Value { + arr := v.MustBoolSlice() + collected := make([]interface{}, len(arr)) + v.EachBool(func(index int, val bool) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Str (string and []string) +*/ + +// Str gets the value as a string, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Str(optionalDefault ...string) string { + if s, ok := v.data.(string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return "" +} + +// MustStr gets the value as a string. +// +// Panics if the object is not a string. +func (v *Value) MustStr() string { + return v.data.(string) +} + +// StrSlice gets the value as a []string, returns the optionalDefault +// value or nil if the value is not a []string. +func (v *Value) StrSlice(optionalDefault ...[]string) []string { + if s, ok := v.data.([]string); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustStrSlice gets the value as a []string. +// +// Panics if the object is not a []string. +func (v *Value) MustStrSlice() []string { + return v.data.([]string) +} + +// IsStr gets whether the object contained is a string or not. +func (v *Value) IsStr() bool { + _, ok := v.data.(string) + return ok +} + +// IsStrSlice gets whether the object contained is a []string or not. +func (v *Value) IsStrSlice() bool { + _, ok := v.data.([]string) + return ok +} + +// EachStr calls the specified callback for each object +// in the []string. +// +// Panics if the object is the wrong type. +func (v *Value) EachStr(callback func(int, string) bool) *Value { + for index, val := range v.MustStrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereStr uses the specified decider function to select items +// from the []string. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereStr(decider func(int, string) bool) *Value { + var selected []string + v.EachStr(func(index int, val string) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupStr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]string. +func (v *Value) GroupStr(grouper func(int, string) string) *Value { + groups := make(map[string][]string) + v.EachStr(func(index int, val string) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]string, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceStr uses the specified function to replace each strings +// by iterating each item. The data in the returned result will be a +// []string containing the replaced items. +func (v *Value) ReplaceStr(replacer func(int, string) string) *Value { + arr := v.MustStrSlice() + replaced := make([]string, len(arr)) + v.EachStr(func(index int, val string) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectStr uses the specified collector function to collect a value +// for each of the strings in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectStr(collector func(int, string) interface{}) *Value { + arr := v.MustStrSlice() + collected := make([]interface{}, len(arr)) + v.EachStr(func(index int, val string) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int (int and []int) +*/ + +// Int gets the value as a int, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int(optionalDefault ...int) int { + if s, ok := v.data.(int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt gets the value as a int. +// +// Panics if the object is not a int. +func (v *Value) MustInt() int { + return v.data.(int) +} + +// IntSlice gets the value as a []int, returns the optionalDefault +// value or nil if the value is not a []int. +func (v *Value) IntSlice(optionalDefault ...[]int) []int { + if s, ok := v.data.([]int); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustIntSlice gets the value as a []int. +// +// Panics if the object is not a []int. +func (v *Value) MustIntSlice() []int { + return v.data.([]int) +} + +// IsInt gets whether the object contained is a int or not. +func (v *Value) IsInt() bool { + _, ok := v.data.(int) + return ok +} + +// IsIntSlice gets whether the object contained is a []int or not. +func (v *Value) IsIntSlice() bool { + _, ok := v.data.([]int) + return ok +} + +// EachInt calls the specified callback for each object +// in the []int. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt(callback func(int, int) bool) *Value { + for index, val := range v.MustIntSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt uses the specified decider function to select items +// from the []int. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt(decider func(int, int) bool) *Value { + var selected []int + v.EachInt(func(index int, val int) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int. +func (v *Value) GroupInt(grouper func(int, int) string) *Value { + groups := make(map[string][]int) + v.EachInt(func(index int, val int) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt uses the specified function to replace each ints +// by iterating each item. The data in the returned result will be a +// []int containing the replaced items. +func (v *Value) ReplaceInt(replacer func(int, int) int) *Value { + arr := v.MustIntSlice() + replaced := make([]int, len(arr)) + v.EachInt(func(index int, val int) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt uses the specified collector function to collect a value +// for each of the ints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt(collector func(int, int) interface{}) *Value { + arr := v.MustIntSlice() + collected := make([]interface{}, len(arr)) + v.EachInt(func(index int, val int) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int8 (int8 and []int8) +*/ + +// Int8 gets the value as a int8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int8(optionalDefault ...int8) int8 { + if s, ok := v.data.(int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt8 gets the value as a int8. +// +// Panics if the object is not a int8. +func (v *Value) MustInt8() int8 { + return v.data.(int8) +} + +// Int8Slice gets the value as a []int8, returns the optionalDefault +// value or nil if the value is not a []int8. +func (v *Value) Int8Slice(optionalDefault ...[]int8) []int8 { + if s, ok := v.data.([]int8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt8Slice gets the value as a []int8. +// +// Panics if the object is not a []int8. +func (v *Value) MustInt8Slice() []int8 { + return v.data.([]int8) +} + +// IsInt8 gets whether the object contained is a int8 or not. +func (v *Value) IsInt8() bool { + _, ok := v.data.(int8) + return ok +} + +// IsInt8Slice gets whether the object contained is a []int8 or not. +func (v *Value) IsInt8Slice() bool { + _, ok := v.data.([]int8) + return ok +} + +// EachInt8 calls the specified callback for each object +// in the []int8. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt8(callback func(int, int8) bool) *Value { + for index, val := range v.MustInt8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt8 uses the specified decider function to select items +// from the []int8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt8(decider func(int, int8) bool) *Value { + var selected []int8 + v.EachInt8(func(index int, val int8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int8. +func (v *Value) GroupInt8(grouper func(int, int8) string) *Value { + groups := make(map[string][]int8) + v.EachInt8(func(index int, val int8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt8 uses the specified function to replace each int8s +// by iterating each item. The data in the returned result will be a +// []int8 containing the replaced items. +func (v *Value) ReplaceInt8(replacer func(int, int8) int8) *Value { + arr := v.MustInt8Slice() + replaced := make([]int8, len(arr)) + v.EachInt8(func(index int, val int8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt8 uses the specified collector function to collect a value +// for each of the int8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt8(collector func(int, int8) interface{}) *Value { + arr := v.MustInt8Slice() + collected := make([]interface{}, len(arr)) + v.EachInt8(func(index int, val int8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int16 (int16 and []int16) +*/ + +// Int16 gets the value as a int16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int16(optionalDefault ...int16) int16 { + if s, ok := v.data.(int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt16 gets the value as a int16. +// +// Panics if the object is not a int16. +func (v *Value) MustInt16() int16 { + return v.data.(int16) +} + +// Int16Slice gets the value as a []int16, returns the optionalDefault +// value or nil if the value is not a []int16. +func (v *Value) Int16Slice(optionalDefault ...[]int16) []int16 { + if s, ok := v.data.([]int16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt16Slice gets the value as a []int16. +// +// Panics if the object is not a []int16. +func (v *Value) MustInt16Slice() []int16 { + return v.data.([]int16) +} + +// IsInt16 gets whether the object contained is a int16 or not. +func (v *Value) IsInt16() bool { + _, ok := v.data.(int16) + return ok +} + +// IsInt16Slice gets whether the object contained is a []int16 or not. +func (v *Value) IsInt16Slice() bool { + _, ok := v.data.([]int16) + return ok +} + +// EachInt16 calls the specified callback for each object +// in the []int16. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt16(callback func(int, int16) bool) *Value { + for index, val := range v.MustInt16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt16 uses the specified decider function to select items +// from the []int16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt16(decider func(int, int16) bool) *Value { + var selected []int16 + v.EachInt16(func(index int, val int16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int16. +func (v *Value) GroupInt16(grouper func(int, int16) string) *Value { + groups := make(map[string][]int16) + v.EachInt16(func(index int, val int16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt16 uses the specified function to replace each int16s +// by iterating each item. The data in the returned result will be a +// []int16 containing the replaced items. +func (v *Value) ReplaceInt16(replacer func(int, int16) int16) *Value { + arr := v.MustInt16Slice() + replaced := make([]int16, len(arr)) + v.EachInt16(func(index int, val int16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt16 uses the specified collector function to collect a value +// for each of the int16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt16(collector func(int, int16) interface{}) *Value { + arr := v.MustInt16Slice() + collected := make([]interface{}, len(arr)) + v.EachInt16(func(index int, val int16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int32 (int32 and []int32) +*/ + +// Int32 gets the value as a int32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int32(optionalDefault ...int32) int32 { + if s, ok := v.data.(int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt32 gets the value as a int32. +// +// Panics if the object is not a int32. +func (v *Value) MustInt32() int32 { + return v.data.(int32) +} + +// Int32Slice gets the value as a []int32, returns the optionalDefault +// value or nil if the value is not a []int32. +func (v *Value) Int32Slice(optionalDefault ...[]int32) []int32 { + if s, ok := v.data.([]int32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt32Slice gets the value as a []int32. +// +// Panics if the object is not a []int32. +func (v *Value) MustInt32Slice() []int32 { + return v.data.([]int32) +} + +// IsInt32 gets whether the object contained is a int32 or not. +func (v *Value) IsInt32() bool { + _, ok := v.data.(int32) + return ok +} + +// IsInt32Slice gets whether the object contained is a []int32 or not. +func (v *Value) IsInt32Slice() bool { + _, ok := v.data.([]int32) + return ok +} + +// EachInt32 calls the specified callback for each object +// in the []int32. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt32(callback func(int, int32) bool) *Value { + for index, val := range v.MustInt32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt32 uses the specified decider function to select items +// from the []int32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt32(decider func(int, int32) bool) *Value { + var selected []int32 + v.EachInt32(func(index int, val int32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int32. +func (v *Value) GroupInt32(grouper func(int, int32) string) *Value { + groups := make(map[string][]int32) + v.EachInt32(func(index int, val int32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt32 uses the specified function to replace each int32s +// by iterating each item. The data in the returned result will be a +// []int32 containing the replaced items. +func (v *Value) ReplaceInt32(replacer func(int, int32) int32) *Value { + arr := v.MustInt32Slice() + replaced := make([]int32, len(arr)) + v.EachInt32(func(index int, val int32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt32 uses the specified collector function to collect a value +// for each of the int32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt32(collector func(int, int32) interface{}) *Value { + arr := v.MustInt32Slice() + collected := make([]interface{}, len(arr)) + v.EachInt32(func(index int, val int32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Int64 (int64 and []int64) +*/ + +// Int64 gets the value as a int64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Int64(optionalDefault ...int64) int64 { + if s, ok := v.data.(int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustInt64 gets the value as a int64. +// +// Panics if the object is not a int64. +func (v *Value) MustInt64() int64 { + return v.data.(int64) +} + +// Int64Slice gets the value as a []int64, returns the optionalDefault +// value or nil if the value is not a []int64. +func (v *Value) Int64Slice(optionalDefault ...[]int64) []int64 { + if s, ok := v.data.([]int64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustInt64Slice gets the value as a []int64. +// +// Panics if the object is not a []int64. +func (v *Value) MustInt64Slice() []int64 { + return v.data.([]int64) +} + +// IsInt64 gets whether the object contained is a int64 or not. +func (v *Value) IsInt64() bool { + _, ok := v.data.(int64) + return ok +} + +// IsInt64Slice gets whether the object contained is a []int64 or not. +func (v *Value) IsInt64Slice() bool { + _, ok := v.data.([]int64) + return ok +} + +// EachInt64 calls the specified callback for each object +// in the []int64. +// +// Panics if the object is the wrong type. +func (v *Value) EachInt64(callback func(int, int64) bool) *Value { + for index, val := range v.MustInt64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereInt64 uses the specified decider function to select items +// from the []int64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereInt64(decider func(int, int64) bool) *Value { + var selected []int64 + v.EachInt64(func(index int, val int64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupInt64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]int64. +func (v *Value) GroupInt64(grouper func(int, int64) string) *Value { + groups := make(map[string][]int64) + v.EachInt64(func(index int, val int64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]int64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceInt64 uses the specified function to replace each int64s +// by iterating each item. The data in the returned result will be a +// []int64 containing the replaced items. +func (v *Value) ReplaceInt64(replacer func(int, int64) int64) *Value { + arr := v.MustInt64Slice() + replaced := make([]int64, len(arr)) + v.EachInt64(func(index int, val int64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectInt64 uses the specified collector function to collect a value +// for each of the int64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectInt64(collector func(int, int64) interface{}) *Value { + arr := v.MustInt64Slice() + collected := make([]interface{}, len(arr)) + v.EachInt64(func(index int, val int64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint (uint and []uint) +*/ + +// Uint gets the value as a uint, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint(optionalDefault ...uint) uint { + if s, ok := v.data.(uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint gets the value as a uint. +// +// Panics if the object is not a uint. +func (v *Value) MustUint() uint { + return v.data.(uint) +} + +// UintSlice gets the value as a []uint, returns the optionalDefault +// value or nil if the value is not a []uint. +func (v *Value) UintSlice(optionalDefault ...[]uint) []uint { + if s, ok := v.data.([]uint); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintSlice gets the value as a []uint. +// +// Panics if the object is not a []uint. +func (v *Value) MustUintSlice() []uint { + return v.data.([]uint) +} + +// IsUint gets whether the object contained is a uint or not. +func (v *Value) IsUint() bool { + _, ok := v.data.(uint) + return ok +} + +// IsUintSlice gets whether the object contained is a []uint or not. +func (v *Value) IsUintSlice() bool { + _, ok := v.data.([]uint) + return ok +} + +// EachUint calls the specified callback for each object +// in the []uint. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint(callback func(int, uint) bool) *Value { + for index, val := range v.MustUintSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint uses the specified decider function to select items +// from the []uint. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint(decider func(int, uint) bool) *Value { + var selected []uint + v.EachUint(func(index int, val uint) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint. +func (v *Value) GroupUint(grouper func(int, uint) string) *Value { + groups := make(map[string][]uint) + v.EachUint(func(index int, val uint) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint uses the specified function to replace each uints +// by iterating each item. The data in the returned result will be a +// []uint containing the replaced items. +func (v *Value) ReplaceUint(replacer func(int, uint) uint) *Value { + arr := v.MustUintSlice() + replaced := make([]uint, len(arr)) + v.EachUint(func(index int, val uint) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint uses the specified collector function to collect a value +// for each of the uints in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint(collector func(int, uint) interface{}) *Value { + arr := v.MustUintSlice() + collected := make([]interface{}, len(arr)) + v.EachUint(func(index int, val uint) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint8 (uint8 and []uint8) +*/ + +// Uint8 gets the value as a uint8, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint8(optionalDefault ...uint8) uint8 { + if s, ok := v.data.(uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint8 gets the value as a uint8. +// +// Panics if the object is not a uint8. +func (v *Value) MustUint8() uint8 { + return v.data.(uint8) +} + +// Uint8Slice gets the value as a []uint8, returns the optionalDefault +// value or nil if the value is not a []uint8. +func (v *Value) Uint8Slice(optionalDefault ...[]uint8) []uint8 { + if s, ok := v.data.([]uint8); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint8Slice gets the value as a []uint8. +// +// Panics if the object is not a []uint8. +func (v *Value) MustUint8Slice() []uint8 { + return v.data.([]uint8) +} + +// IsUint8 gets whether the object contained is a uint8 or not. +func (v *Value) IsUint8() bool { + _, ok := v.data.(uint8) + return ok +} + +// IsUint8Slice gets whether the object contained is a []uint8 or not. +func (v *Value) IsUint8Slice() bool { + _, ok := v.data.([]uint8) + return ok +} + +// EachUint8 calls the specified callback for each object +// in the []uint8. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint8(callback func(int, uint8) bool) *Value { + for index, val := range v.MustUint8Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint8 uses the specified decider function to select items +// from the []uint8. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint8(decider func(int, uint8) bool) *Value { + var selected []uint8 + v.EachUint8(func(index int, val uint8) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint8 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint8. +func (v *Value) GroupUint8(grouper func(int, uint8) string) *Value { + groups := make(map[string][]uint8) + v.EachUint8(func(index int, val uint8) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint8, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint8 uses the specified function to replace each uint8s +// by iterating each item. The data in the returned result will be a +// []uint8 containing the replaced items. +func (v *Value) ReplaceUint8(replacer func(int, uint8) uint8) *Value { + arr := v.MustUint8Slice() + replaced := make([]uint8, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint8 uses the specified collector function to collect a value +// for each of the uint8s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint8(collector func(int, uint8) interface{}) *Value { + arr := v.MustUint8Slice() + collected := make([]interface{}, len(arr)) + v.EachUint8(func(index int, val uint8) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint16 (uint16 and []uint16) +*/ + +// Uint16 gets the value as a uint16, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint16(optionalDefault ...uint16) uint16 { + if s, ok := v.data.(uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint16 gets the value as a uint16. +// +// Panics if the object is not a uint16. +func (v *Value) MustUint16() uint16 { + return v.data.(uint16) +} + +// Uint16Slice gets the value as a []uint16, returns the optionalDefault +// value or nil if the value is not a []uint16. +func (v *Value) Uint16Slice(optionalDefault ...[]uint16) []uint16 { + if s, ok := v.data.([]uint16); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint16Slice gets the value as a []uint16. +// +// Panics if the object is not a []uint16. +func (v *Value) MustUint16Slice() []uint16 { + return v.data.([]uint16) +} + +// IsUint16 gets whether the object contained is a uint16 or not. +func (v *Value) IsUint16() bool { + _, ok := v.data.(uint16) + return ok +} + +// IsUint16Slice gets whether the object contained is a []uint16 or not. +func (v *Value) IsUint16Slice() bool { + _, ok := v.data.([]uint16) + return ok +} + +// EachUint16 calls the specified callback for each object +// in the []uint16. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint16(callback func(int, uint16) bool) *Value { + for index, val := range v.MustUint16Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint16 uses the specified decider function to select items +// from the []uint16. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint16(decider func(int, uint16) bool) *Value { + var selected []uint16 + v.EachUint16(func(index int, val uint16) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint16 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint16. +func (v *Value) GroupUint16(grouper func(int, uint16) string) *Value { + groups := make(map[string][]uint16) + v.EachUint16(func(index int, val uint16) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint16, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint16 uses the specified function to replace each uint16s +// by iterating each item. The data in the returned result will be a +// []uint16 containing the replaced items. +func (v *Value) ReplaceUint16(replacer func(int, uint16) uint16) *Value { + arr := v.MustUint16Slice() + replaced := make([]uint16, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint16 uses the specified collector function to collect a value +// for each of the uint16s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint16(collector func(int, uint16) interface{}) *Value { + arr := v.MustUint16Slice() + collected := make([]interface{}, len(arr)) + v.EachUint16(func(index int, val uint16) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint32 (uint32 and []uint32) +*/ + +// Uint32 gets the value as a uint32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint32(optionalDefault ...uint32) uint32 { + if s, ok := v.data.(uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint32 gets the value as a uint32. +// +// Panics if the object is not a uint32. +func (v *Value) MustUint32() uint32 { + return v.data.(uint32) +} + +// Uint32Slice gets the value as a []uint32, returns the optionalDefault +// value or nil if the value is not a []uint32. +func (v *Value) Uint32Slice(optionalDefault ...[]uint32) []uint32 { + if s, ok := v.data.([]uint32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint32Slice gets the value as a []uint32. +// +// Panics if the object is not a []uint32. +func (v *Value) MustUint32Slice() []uint32 { + return v.data.([]uint32) +} + +// IsUint32 gets whether the object contained is a uint32 or not. +func (v *Value) IsUint32() bool { + _, ok := v.data.(uint32) + return ok +} + +// IsUint32Slice gets whether the object contained is a []uint32 or not. +func (v *Value) IsUint32Slice() bool { + _, ok := v.data.([]uint32) + return ok +} + +// EachUint32 calls the specified callback for each object +// in the []uint32. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint32(callback func(int, uint32) bool) *Value { + for index, val := range v.MustUint32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint32 uses the specified decider function to select items +// from the []uint32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint32(decider func(int, uint32) bool) *Value { + var selected []uint32 + v.EachUint32(func(index int, val uint32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint32. +func (v *Value) GroupUint32(grouper func(int, uint32) string) *Value { + groups := make(map[string][]uint32) + v.EachUint32(func(index int, val uint32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint32 uses the specified function to replace each uint32s +// by iterating each item. The data in the returned result will be a +// []uint32 containing the replaced items. +func (v *Value) ReplaceUint32(replacer func(int, uint32) uint32) *Value { + arr := v.MustUint32Slice() + replaced := make([]uint32, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint32 uses the specified collector function to collect a value +// for each of the uint32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint32(collector func(int, uint32) interface{}) *Value { + arr := v.MustUint32Slice() + collected := make([]interface{}, len(arr)) + v.EachUint32(func(index int, val uint32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uint64 (uint64 and []uint64) +*/ + +// Uint64 gets the value as a uint64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uint64(optionalDefault ...uint64) uint64 { + if s, ok := v.data.(uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUint64 gets the value as a uint64. +// +// Panics if the object is not a uint64. +func (v *Value) MustUint64() uint64 { + return v.data.(uint64) +} + +// Uint64Slice gets the value as a []uint64, returns the optionalDefault +// value or nil if the value is not a []uint64. +func (v *Value) Uint64Slice(optionalDefault ...[]uint64) []uint64 { + if s, ok := v.data.([]uint64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUint64Slice gets the value as a []uint64. +// +// Panics if the object is not a []uint64. +func (v *Value) MustUint64Slice() []uint64 { + return v.data.([]uint64) +} + +// IsUint64 gets whether the object contained is a uint64 or not. +func (v *Value) IsUint64() bool { + _, ok := v.data.(uint64) + return ok +} + +// IsUint64Slice gets whether the object contained is a []uint64 or not. +func (v *Value) IsUint64Slice() bool { + _, ok := v.data.([]uint64) + return ok +} + +// EachUint64 calls the specified callback for each object +// in the []uint64. +// +// Panics if the object is the wrong type. +func (v *Value) EachUint64(callback func(int, uint64) bool) *Value { + for index, val := range v.MustUint64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUint64 uses the specified decider function to select items +// from the []uint64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUint64(decider func(int, uint64) bool) *Value { + var selected []uint64 + v.EachUint64(func(index int, val uint64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUint64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uint64. +func (v *Value) GroupUint64(grouper func(int, uint64) string) *Value { + groups := make(map[string][]uint64) + v.EachUint64(func(index int, val uint64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uint64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUint64 uses the specified function to replace each uint64s +// by iterating each item. The data in the returned result will be a +// []uint64 containing the replaced items. +func (v *Value) ReplaceUint64(replacer func(int, uint64) uint64) *Value { + arr := v.MustUint64Slice() + replaced := make([]uint64, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUint64 uses the specified collector function to collect a value +// for each of the uint64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUint64(collector func(int, uint64) interface{}) *Value { + arr := v.MustUint64Slice() + collected := make([]interface{}, len(arr)) + v.EachUint64(func(index int, val uint64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Uintptr (uintptr and []uintptr) +*/ + +// Uintptr gets the value as a uintptr, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Uintptr(optionalDefault ...uintptr) uintptr { + if s, ok := v.data.(uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustUintptr gets the value as a uintptr. +// +// Panics if the object is not a uintptr. +func (v *Value) MustUintptr() uintptr { + return v.data.(uintptr) +} + +// UintptrSlice gets the value as a []uintptr, returns the optionalDefault +// value or nil if the value is not a []uintptr. +func (v *Value) UintptrSlice(optionalDefault ...[]uintptr) []uintptr { + if s, ok := v.data.([]uintptr); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustUintptrSlice gets the value as a []uintptr. +// +// Panics if the object is not a []uintptr. +func (v *Value) MustUintptrSlice() []uintptr { + return v.data.([]uintptr) +} + +// IsUintptr gets whether the object contained is a uintptr or not. +func (v *Value) IsUintptr() bool { + _, ok := v.data.(uintptr) + return ok +} + +// IsUintptrSlice gets whether the object contained is a []uintptr or not. +func (v *Value) IsUintptrSlice() bool { + _, ok := v.data.([]uintptr) + return ok +} + +// EachUintptr calls the specified callback for each object +// in the []uintptr. +// +// Panics if the object is the wrong type. +func (v *Value) EachUintptr(callback func(int, uintptr) bool) *Value { + for index, val := range v.MustUintptrSlice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereUintptr uses the specified decider function to select items +// from the []uintptr. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereUintptr(decider func(int, uintptr) bool) *Value { + var selected []uintptr + v.EachUintptr(func(index int, val uintptr) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupUintptr uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]uintptr. +func (v *Value) GroupUintptr(grouper func(int, uintptr) string) *Value { + groups := make(map[string][]uintptr) + v.EachUintptr(func(index int, val uintptr) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]uintptr, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceUintptr uses the specified function to replace each uintptrs +// by iterating each item. The data in the returned result will be a +// []uintptr containing the replaced items. +func (v *Value) ReplaceUintptr(replacer func(int, uintptr) uintptr) *Value { + arr := v.MustUintptrSlice() + replaced := make([]uintptr, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectUintptr uses the specified collector function to collect a value +// for each of the uintptrs in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectUintptr(collector func(int, uintptr) interface{}) *Value { + arr := v.MustUintptrSlice() + collected := make([]interface{}, len(arr)) + v.EachUintptr(func(index int, val uintptr) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float32 (float32 and []float32) +*/ + +// Float32 gets the value as a float32, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float32(optionalDefault ...float32) float32 { + if s, ok := v.data.(float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat32 gets the value as a float32. +// +// Panics if the object is not a float32. +func (v *Value) MustFloat32() float32 { + return v.data.(float32) +} + +// Float32Slice gets the value as a []float32, returns the optionalDefault +// value or nil if the value is not a []float32. +func (v *Value) Float32Slice(optionalDefault ...[]float32) []float32 { + if s, ok := v.data.([]float32); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat32Slice gets the value as a []float32. +// +// Panics if the object is not a []float32. +func (v *Value) MustFloat32Slice() []float32 { + return v.data.([]float32) +} + +// IsFloat32 gets whether the object contained is a float32 or not. +func (v *Value) IsFloat32() bool { + _, ok := v.data.(float32) + return ok +} + +// IsFloat32Slice gets whether the object contained is a []float32 or not. +func (v *Value) IsFloat32Slice() bool { + _, ok := v.data.([]float32) + return ok +} + +// EachFloat32 calls the specified callback for each object +// in the []float32. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat32(callback func(int, float32) bool) *Value { + for index, val := range v.MustFloat32Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat32 uses the specified decider function to select items +// from the []float32. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat32(decider func(int, float32) bool) *Value { + var selected []float32 + v.EachFloat32(func(index int, val float32) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat32 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float32. +func (v *Value) GroupFloat32(grouper func(int, float32) string) *Value { + groups := make(map[string][]float32) + v.EachFloat32(func(index int, val float32) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float32, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat32 uses the specified function to replace each float32s +// by iterating each item. The data in the returned result will be a +// []float32 containing the replaced items. +func (v *Value) ReplaceFloat32(replacer func(int, float32) float32) *Value { + arr := v.MustFloat32Slice() + replaced := make([]float32, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat32 uses the specified collector function to collect a value +// for each of the float32s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat32(collector func(int, float32) interface{}) *Value { + arr := v.MustFloat32Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat32(func(index int, val float32) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Float64 (float64 and []float64) +*/ + +// Float64 gets the value as a float64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Float64(optionalDefault ...float64) float64 { + if s, ok := v.data.(float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustFloat64 gets the value as a float64. +// +// Panics if the object is not a float64. +func (v *Value) MustFloat64() float64 { + return v.data.(float64) +} + +// Float64Slice gets the value as a []float64, returns the optionalDefault +// value or nil if the value is not a []float64. +func (v *Value) Float64Slice(optionalDefault ...[]float64) []float64 { + if s, ok := v.data.([]float64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustFloat64Slice gets the value as a []float64. +// +// Panics if the object is not a []float64. +func (v *Value) MustFloat64Slice() []float64 { + return v.data.([]float64) +} + +// IsFloat64 gets whether the object contained is a float64 or not. +func (v *Value) IsFloat64() bool { + _, ok := v.data.(float64) + return ok +} + +// IsFloat64Slice gets whether the object contained is a []float64 or not. +func (v *Value) IsFloat64Slice() bool { + _, ok := v.data.([]float64) + return ok +} + +// EachFloat64 calls the specified callback for each object +// in the []float64. +// +// Panics if the object is the wrong type. +func (v *Value) EachFloat64(callback func(int, float64) bool) *Value { + for index, val := range v.MustFloat64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereFloat64 uses the specified decider function to select items +// from the []float64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereFloat64(decider func(int, float64) bool) *Value { + var selected []float64 + v.EachFloat64(func(index int, val float64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupFloat64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]float64. +func (v *Value) GroupFloat64(grouper func(int, float64) string) *Value { + groups := make(map[string][]float64) + v.EachFloat64(func(index int, val float64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]float64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceFloat64 uses the specified function to replace each float64s +// by iterating each item. The data in the returned result will be a +// []float64 containing the replaced items. +func (v *Value) ReplaceFloat64(replacer func(int, float64) float64) *Value { + arr := v.MustFloat64Slice() + replaced := make([]float64, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectFloat64 uses the specified collector function to collect a value +// for each of the float64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectFloat64(collector func(int, float64) interface{}) *Value { + arr := v.MustFloat64Slice() + collected := make([]interface{}, len(arr)) + v.EachFloat64(func(index int, val float64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex64 (complex64 and []complex64) +*/ + +// Complex64 gets the value as a complex64, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex64(optionalDefault ...complex64) complex64 { + if s, ok := v.data.(complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex64 gets the value as a complex64. +// +// Panics if the object is not a complex64. +func (v *Value) MustComplex64() complex64 { + return v.data.(complex64) +} + +// Complex64Slice gets the value as a []complex64, returns the optionalDefault +// value or nil if the value is not a []complex64. +func (v *Value) Complex64Slice(optionalDefault ...[]complex64) []complex64 { + if s, ok := v.data.([]complex64); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex64Slice gets the value as a []complex64. +// +// Panics if the object is not a []complex64. +func (v *Value) MustComplex64Slice() []complex64 { + return v.data.([]complex64) +} + +// IsComplex64 gets whether the object contained is a complex64 or not. +func (v *Value) IsComplex64() bool { + _, ok := v.data.(complex64) + return ok +} + +// IsComplex64Slice gets whether the object contained is a []complex64 or not. +func (v *Value) IsComplex64Slice() bool { + _, ok := v.data.([]complex64) + return ok +} + +// EachComplex64 calls the specified callback for each object +// in the []complex64. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex64(callback func(int, complex64) bool) *Value { + for index, val := range v.MustComplex64Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex64 uses the specified decider function to select items +// from the []complex64. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex64(decider func(int, complex64) bool) *Value { + var selected []complex64 + v.EachComplex64(func(index int, val complex64) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex64 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex64. +func (v *Value) GroupComplex64(grouper func(int, complex64) string) *Value { + groups := make(map[string][]complex64) + v.EachComplex64(func(index int, val complex64) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex64, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex64 uses the specified function to replace each complex64s +// by iterating each item. The data in the returned result will be a +// []complex64 containing the replaced items. +func (v *Value) ReplaceComplex64(replacer func(int, complex64) complex64) *Value { + arr := v.MustComplex64Slice() + replaced := make([]complex64, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex64 uses the specified collector function to collect a value +// for each of the complex64s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex64(collector func(int, complex64) interface{}) *Value { + arr := v.MustComplex64Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex64(func(index int, val complex64) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} + +/* + Complex128 (complex128 and []complex128) +*/ + +// Complex128 gets the value as a complex128, returns the optionalDefault +// value or a system default object if the value is the wrong type. +func (v *Value) Complex128(optionalDefault ...complex128) complex128 { + if s, ok := v.data.(complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return 0 +} + +// MustComplex128 gets the value as a complex128. +// +// Panics if the object is not a complex128. +func (v *Value) MustComplex128() complex128 { + return v.data.(complex128) +} + +// Complex128Slice gets the value as a []complex128, returns the optionalDefault +// value or nil if the value is not a []complex128. +func (v *Value) Complex128Slice(optionalDefault ...[]complex128) []complex128 { + if s, ok := v.data.([]complex128); ok { + return s + } + if len(optionalDefault) == 1 { + return optionalDefault[0] + } + return nil +} + +// MustComplex128Slice gets the value as a []complex128. +// +// Panics if the object is not a []complex128. +func (v *Value) MustComplex128Slice() []complex128 { + return v.data.([]complex128) +} + +// IsComplex128 gets whether the object contained is a complex128 or not. +func (v *Value) IsComplex128() bool { + _, ok := v.data.(complex128) + return ok +} + +// IsComplex128Slice gets whether the object contained is a []complex128 or not. +func (v *Value) IsComplex128Slice() bool { + _, ok := v.data.([]complex128) + return ok +} + +// EachComplex128 calls the specified callback for each object +// in the []complex128. +// +// Panics if the object is the wrong type. +func (v *Value) EachComplex128(callback func(int, complex128) bool) *Value { + for index, val := range v.MustComplex128Slice() { + carryon := callback(index, val) + if !carryon { + break + } + } + return v +} + +// WhereComplex128 uses the specified decider function to select items +// from the []complex128. The object contained in the result will contain +// only the selected items. +func (v *Value) WhereComplex128(decider func(int, complex128) bool) *Value { + var selected []complex128 + v.EachComplex128(func(index int, val complex128) bool { + shouldSelect := decider(index, val) + if !shouldSelect { + selected = append(selected, val) + } + return true + }) + return &Value{data: selected} +} + +// GroupComplex128 uses the specified grouper function to group the items +// keyed by the return of the grouper. The object contained in the +// result will contain a map[string][]complex128. +func (v *Value) GroupComplex128(grouper func(int, complex128) string) *Value { + groups := make(map[string][]complex128) + v.EachComplex128(func(index int, val complex128) bool { + group := grouper(index, val) + if _, ok := groups[group]; !ok { + groups[group] = make([]complex128, 0) + } + groups[group] = append(groups[group], val) + return true + }) + return &Value{data: groups} +} + +// ReplaceComplex128 uses the specified function to replace each complex128s +// by iterating each item. The data in the returned result will be a +// []complex128 containing the replaced items. +func (v *Value) ReplaceComplex128(replacer func(int, complex128) complex128) *Value { + arr := v.MustComplex128Slice() + replaced := make([]complex128, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + replaced[index] = replacer(index, val) + return true + }) + return &Value{data: replaced} +} + +// CollectComplex128 uses the specified collector function to collect a value +// for each of the complex128s in the slice. The data returned will be a +// []interface{}. +func (v *Value) CollectComplex128(collector func(int, complex128) interface{}) *Value { + arr := v.MustComplex128Slice() + collected := make([]interface{}, len(arr)) + v.EachComplex128(func(index int, val complex128) bool { + collected[index] = collector(index, val) + return true + }) + return &Value{data: collected} +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/value.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/value.go new file mode 100755 index 0000000..956a221 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/objx/value.go @@ -0,0 +1,56 @@ +package objx + +import ( + "fmt" + "strconv" +) + +// Value provides methods for extracting interface{} data in various +// types. +type Value struct { + // data contains the raw data being managed by this Value + data interface{} +} + +// Data returns the raw data contained by this Value +func (v *Value) Data() interface{} { + return v.data +} + +// String returns the value always as a string +func (v *Value) String() string { + switch { + case v.IsStr(): + return v.Str() + case v.IsBool(): + return strconv.FormatBool(v.Bool()) + case v.IsFloat32(): + return strconv.FormatFloat(float64(v.Float32()), 'f', -1, 32) + case v.IsFloat64(): + return strconv.FormatFloat(v.Float64(), 'f', -1, 64) + case v.IsInt(): + return strconv.FormatInt(int64(v.Int()), 10) + case v.IsInt(): + return strconv.FormatInt(int64(v.Int()), 10) + case v.IsInt8(): + return strconv.FormatInt(int64(v.Int8()), 10) + case v.IsInt16(): + return strconv.FormatInt(int64(v.Int16()), 10) + case v.IsInt32(): + return strconv.FormatInt(int64(v.Int32()), 10) + case v.IsInt64(): + return strconv.FormatInt(v.Int64(), 10) + case v.IsUint(): + return strconv.FormatUint(uint64(v.Uint()), 10) + case v.IsUint8(): + return strconv.FormatUint(uint64(v.Uint8()), 10) + case v.IsUint16(): + return strconv.FormatUint(uint64(v.Uint16()), 10) + case v.IsUint32(): + return strconv.FormatUint(uint64(v.Uint32()), 10) + case v.IsUint64(): + return strconv.FormatUint(v.Uint64(), 10) + } + + return fmt.Sprintf("%#v", v.Data()) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt new file mode 100755 index 0000000..473b670 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENCE.txt @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENSE new file mode 100755 index 0000000..473b670 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2012 - 2013 Mat Ryer and Tyler Bunnell + +Please consider promoting this project if you find it useful. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT +OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go new file mode 100755 index 0000000..23838c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -0,0 +1,379 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp Comparison, msg string, args ...interface{}) bool { + return Condition(t, comp, append([]interface{}{msg}, args...)...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Contains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Empty(t, object, append([]interface{}{msg}, args...)...) +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equal(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) bool { + return EqualError(t, theError, errString, append([]interface{}{msg}, args...)...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { + return Error(t, err, append([]interface{}{msg}, args...)...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactly(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return Fail(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) bool { + return FailNow(t, failureMessage, append([]interface{}{msg}, args...)...) +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { + return False(t, value, append([]interface{}{msg}, args...)...) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(t, handler, method, url, values, str) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(t, handler, method, url, values) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implements(t, interfaceObject, object, append([]interface{}{msg}, args...)...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDelta(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlice(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilon(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsType(t, expectedType, object, append([]interface{}{msg}, args...)...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) bool { + return Len(t, object, length, append([]interface{}{msg}, args...)...) +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return Nil(t, object, append([]interface{}{msg}, args...)...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { + return NoError(t, err, append([]interface{}{msg}, args...)...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContains(t, s, contains, append([]interface{}{msg}, args...)...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotEmpty(t, object, append([]interface{}{msg}, args...)...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + return NotNil(t, object, append([]interface{}{msg}, args...)...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanics(t, f, append([]interface{}{msg}, args...)...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return NotZero(t, i, append([]interface{}{msg}, args...)...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool { + return Panics(t, f, append([]interface{}{msg}, args...)...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexp(t, rx, str, append([]interface{}{msg}, args...)...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subset(t, list, subset, append([]interface{}{msg}, args...)...) +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) bool { + return True(t, value, append([]interface{}{msg}, args...)...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { + return Zero(t, i, append([]interface{}{msg}, args...)...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl new file mode 100755 index 0000000..c5cc66f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentFormat}} +func {{.DocInfo.Name}}f(t TestingT, {{.ParamsFormat}}) bool { + return {{.DocInfo.Name}}(t, {{.ForwardedParamsFormat}}) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go new file mode 100755 index 0000000..fcccbd0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -0,0 +1,746 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package assert + +import ( + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp Comparison, msgAndArgs ...interface{}) bool { + return Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp Comparison, msg string, args ...interface{}) bool { + return Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) bool { + return Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) bool { + return Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) bool { + return EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) bool { + return EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { + return Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) bool { + return Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) bool { + return Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) bool { + return FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) bool { + return FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) bool { + return Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) bool { + return False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { + return Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) bool { + return HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) bool { + return HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { + return Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + return InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { + return InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + return InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) bool { + return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + return IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { + return IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) bool { + return JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) bool { + return JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) bool { + return Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) bool { + return Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) bool { + return Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) bool { + return Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) bool { + return NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { + return NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) bool { + return NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) bool { + return NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) bool { + return NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) bool { + return NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + return NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + return NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) bool { + return NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) bool { + return NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) bool { + return NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) bool { + return NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { + return Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + return PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f PanicTestFunc, msg string, args ...interface{}) bool { + return PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) bool { + return Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + return Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { + return Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) bool { + return Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) bool { + return Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) bool { + return True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) bool { + return Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + return WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) bool { + return WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { + return Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) bool { + return Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl new file mode 100755 index 0000000..99f9acf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) bool { + return {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go new file mode 100755 index 0000000..8259050 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/assertions.go @@ -0,0 +1,1208 @@ +package assert + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "math" + "reflect" + "regexp" + "runtime" + "strings" + "time" + "unicode" + "unicode/utf8" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" +) + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) +} + +// Comparison a custom function that returns true on success and false on failure +type Comparison func() (success bool) + +/* + Helper functions +*/ + +// ObjectsAreEqual determines if two objects are considered equal. +// +// This function does no assertion of any kind. +func ObjectsAreEqual(expected, actual interface{}) bool { + + if expected == nil || actual == nil { + return expected == actual + } + if exp, ok := expected.([]byte); ok { + act, ok := actual.([]byte) + if !ok { + return false + } else if exp == nil || act == nil { + return exp == nil && act == nil + } + return bytes.Equal(exp, act) + } + return reflect.DeepEqual(expected, actual) + +} + +// ObjectsAreEqualValues gets whether two objects are equal, or if their +// values are equal. +func ObjectsAreEqualValues(expected, actual interface{}) bool { + if ObjectsAreEqual(expected, actual) { + return true + } + + actualType := reflect.TypeOf(actual) + if actualType == nil { + return false + } + expectedValue := reflect.ValueOf(expected) + if expectedValue.IsValid() && expectedValue.Type().ConvertibleTo(actualType) { + // Attempt comparison after type conversion + return reflect.DeepEqual(expectedValue.Convert(actualType).Interface(), actual) + } + + return false +} + +/* CallerInfo is necessary because the assert functions use the testing object +internally, causing it to print the file:line of the assert method, rather than where +the problem actually occurred in calling code.*/ + +// CallerInfo returns an array of strings containing the file and line number +// of each stack frame leading from the current test to the assert call that +// failed. +func CallerInfo() []string { + + pc := uintptr(0) + file := "" + line := 0 + ok := false + name := "" + + callers := []string{} + for i := 0; ; i++ { + pc, file, line, ok = runtime.Caller(i) + if !ok { + // The breaks below failed to terminate the loop, and we ran off the + // end of the call stack. + break + } + + // This is a huge edge case, but it will panic if this is the case, see #180 + if file == "" { + break + } + + f := runtime.FuncForPC(pc) + if f == nil { + break + } + name = f.Name() + + // testing.tRunner is the standard library function that calls + // tests. Subtests are called directly by tRunner, without going through + // the Test/Benchmark/Example function that contains the t.Run calls, so + // with subtests we should break when we hit tRunner, without adding it + // to the list of callers. + if name == "testing.tRunner" { + break + } + + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + if len(parts) > 1 { + dir := parts[len(parts)-2] + if (dir != "assert" && dir != "mock" && dir != "require") || file == "mock_test.go" { + callers = append(callers, fmt.Sprintf("%s:%d", file, line)) + } + } + + // Drop the package + segments := strings.Split(name, ".") + name = segments[len(segments)-1] + if isTest(name, "Test") || + isTest(name, "Benchmark") || + isTest(name, "Example") { + break + } + } + + return callers +} + +// Stolen from the `go test` tool. +// isTest tells whether name looks like a test (or benchmark, according to prefix). +// It is a Test (say) if there is a character after Test that is not a lower-case letter. +// We don't want TesticularCancer. +func isTest(name, prefix string) bool { + if !strings.HasPrefix(name, prefix) { + return false + } + if len(name) == len(prefix) { // "Test" is ok + return true + } + rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(rune) +} + +// getWhitespaceString returns a string that is long enough to overwrite the default +// output from the go testing framework. +func getWhitespaceString() string { + + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + parts := strings.Split(file, "/") + file = parts[len(parts)-1] + + return strings.Repeat(" ", len(fmt.Sprintf("%s:%d: ", file, line))) + +} + +func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { + if len(msgAndArgs) == 0 || msgAndArgs == nil { + return "" + } + if len(msgAndArgs) == 1 { + return msgAndArgs[0].(string) + } + if len(msgAndArgs) > 1 { + return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...) + } + return "" +} + +// Aligns the provided message so that all lines after the first line start at the same location as the first line. +// Assumes that the first line starts at the correct location (after carriage return, tab, label, spacer and tab). +// The longestLabelLen parameter specifies the length of the longest label in the output (required becaues this is the +// basis on which the alignment occurs). +func indentMessageLines(message string, longestLabelLen int) string { + outBuf := new(bytes.Buffer) + + for i, scanner := 0, bufio.NewScanner(strings.NewReader(message)); scanner.Scan(); i++ { + // no need to align first line because it starts at the correct location (after the label) + if i != 0 { + // append alignLen+1 spaces to align with "{{longestLabel}}:" before adding tab + outBuf.WriteString("\n\r\t" + strings.Repeat(" ", longestLabelLen+1) + "\t") + } + outBuf.WriteString(scanner.Text()) + } + + return outBuf.String() +} + +type failNower interface { + FailNow() +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + Fail(t, failureMessage, msgAndArgs...) + + // We cannot extend TestingT with FailNow() and + // maintain backwards compatibility, so we fallback + // to panicking when FailNow is not available in + // TestingT. + // See issue #263 + + if t, ok := t.(failNower); ok { + t.FailNow() + } else { + panic("test failed and t is missing `FailNow()`") + } + return false +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) bool { + content := []labeledContent{ + {"Error Trace", strings.Join(CallerInfo(), "\n\r\t\t\t")}, + {"Error", failureMessage}, + } + + message := messageFromMsgAndArgs(msgAndArgs...) + if len(message) > 0 { + content = append(content, labeledContent{"Messages", message}) + } + + t.Errorf("%s", "\r"+getWhitespaceString()+labeledOutput(content...)) + + return false +} + +type labeledContent struct { + label string + content string +} + +// labeledOutput returns a string consisting of the provided labeledContent. Each labeled output is appended in the following manner: +// +// \r\t{{label}}:{{align_spaces}}\t{{content}}\n +// +// The initial carriage return is required to undo/erase any padding added by testing.T.Errorf. The "\t{{label}}:" is for the label. +// If a label is shorter than the longest label provided, padding spaces are added to make all the labels match in length. Once this +// alignment is achieved, "\t{{content}}\n" is added for the output. +// +// If the content of the labeledOutput contains line breaks, the subsequent lines are aligned so that they start at the same location as the first line. +func labeledOutput(content ...labeledContent) string { + longestLabel := 0 + for _, v := range content { + if len(v.label) > longestLabel { + longestLabel = len(v.label) + } + } + var output string + for _, v := range content { + output += "\r\t" + v.label + ":" + strings.Repeat(" ", longestLabel-len(v.label)) + "\t" + indentMessageLines(v.content, longestLabel) + "\n" + } + return output +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + interfaceType := reflect.TypeOf(interfaceObject).Elem() + + if !reflect.TypeOf(object).Implements(interfaceType) { + return Fail(t, fmt.Sprintf("%T must implement %v", object, interfaceType), msgAndArgs...) + } + + return true + +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqual(reflect.TypeOf(object), reflect.TypeOf(expectedType)) { + return Fail(t, fmt.Sprintf("Object expected to be of type %v, but was %v", reflect.TypeOf(expectedType), reflect.TypeOf(object)), msgAndArgs...) + } + + return true +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v == %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if !ObjectsAreEqual(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// formatUnequalValues takes two values of arbitrary types and returns string +// representations appropriate to be presented to the user. +// +// If the values are not of like type, the returned strings will be prefixed +// with the type name, and the value will be enclosed in parenthesis similar +// to a type conversion in the Go grammar. +func formatUnequalValues(expected, actual interface{}) (e string, a string) { + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return fmt.Sprintf("%T(%#v)", expected, expected), + fmt.Sprintf("%T(%#v)", actual, actual) + } + + return fmt.Sprintf("%#v", expected), + fmt.Sprintf("%#v", actual) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + if !ObjectsAreEqualValues(expected, actual) { + diff := diff(expected, actual) + expected, actual = formatUnequalValues(expected, actual) + return Fail(t, fmt.Sprintf("Not equal: \n"+ + "expected: %s\n"+ + "actual: %s%s", expected, actual, diff), msgAndArgs...) + } + + return true + +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + + aType := reflect.TypeOf(expected) + bType := reflect.TypeOf(actual) + + if aType != bType { + return Fail(t, fmt.Sprintf("Types expected to match exactly\n\r\t%v != %v", aType, bType), msgAndArgs...) + } + + return Equal(t, expected, actual, msgAndArgs...) + +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if !isNil(object) { + return true + } + return Fail(t, "Expected value not to be nil.", msgAndArgs...) +} + +// isNil checks if a specified object is nil or not, without Failing. +func isNil(object interface{}) bool { + if object == nil { + return true + } + + value := reflect.ValueOf(object) + kind := value.Kind() + if kind >= reflect.Chan && kind <= reflect.Slice && value.IsNil() { + return true + } + + return false +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + if isNil(object) { + return true + } + return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) +} + +var numericZeros = []interface{}{ + int(0), + int8(0), + int16(0), + int32(0), + int64(0), + uint(0), + uint8(0), + uint16(0), + uint32(0), + uint64(0), + float32(0), + float64(0), +} + +// isEmpty gets whether the specified object is considered empty or not. +func isEmpty(object interface{}) bool { + + if object == nil { + return true + } else if object == "" { + return true + } else if object == false { + return true + } + + for _, v := range numericZeros { + if object == v { + return true + } + } + + objValue := reflect.ValueOf(object) + + switch objValue.Kind() { + case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice, reflect.String: + { + return (objValue.Len() == 0) + } + case reflect.Struct: + switch object.(type) { + case time.Time: + return object.(time.Time).IsZero() + } + case reflect.Ptr: + { + if objValue.IsNil() { + return true + } + switch object.(type) { + case *time.Time: + return object.(*time.Time).IsZero() + default: + return false + } + } + } + return false +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + + pass := !isEmpty(object) + if !pass { + Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) + } + + return pass + +} + +// getLen try to get length of object. +// return (false, 0) if impossible. +func getLen(x interface{}) (ok bool, length int) { + v := reflect.ValueOf(x) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + return true, v.Len() +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) bool { + ok, l := getLen(object) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", object), msgAndArgs...) + } + + if l != length { + return Fail(t, fmt.Sprintf("\"%s\" should have %d item(s), but has %d", object, length, l), msgAndArgs...) + } + return true +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != true { + return Fail(t, "Should be true", msgAndArgs...) + } + + return true + +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { + + if value != false { + return Fail(t, "Should be false", msgAndArgs...) + } + + return true + +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if err := validateEqualArgs(expected, actual); err != nil { + return Fail(t, fmt.Sprintf("Invalid operation: %#v != %#v (%s)", + expected, actual, err), msgAndArgs...) + } + + if ObjectsAreEqual(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true + +} + +// containsElement try loop over the list check if the list includes the element. +// return (false, false) if impossible. +// return (true, false) if element was not found. +// return (true, true) if element was found. +func includeElement(list interface{}, element interface{}) (ok, found bool) { + + listValue := reflect.ValueOf(list) + elementValue := reflect.ValueOf(element) + defer func() { + if e := recover(); e != nil { + ok = false + found = false + } + }() + + if reflect.TypeOf(list).Kind() == reflect.String { + return true, strings.Contains(listValue.String(), elementValue.String()) + } + + if reflect.TypeOf(list).Kind() == reflect.Map { + mapKeys := listValue.MapKeys() + for i := 0; i < len(mapKeys); i++ { + if ObjectsAreEqual(mapKeys[i].Interface(), element) { + return true, true + } + } + return true, false + } + + for i := 0; i < listValue.Len(); i++ { + if ObjectsAreEqual(listValue.Index(i).Interface(), element) { + return true, true + } + } + return true, false + +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bool { + + ok, found := includeElement(s, contains) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + } + if found { + return Fail(t, fmt.Sprintf("\"%s\" should not contain \"%s\"", s, contains), msgAndArgs...) + } + + return true + +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return true // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", list, element), msgAndArgs...) + } + } + + return true +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list, subset interface{}, msgAndArgs ...interface{}) (ok bool) { + if subset == nil { + return false // we consider nil to be equal to the nil set + } + + subsetValue := reflect.ValueOf(subset) + defer func() { + if e := recover(); e != nil { + ok = false + } + }() + + listKind := reflect.TypeOf(list).Kind() + subsetKind := reflect.TypeOf(subset).Kind() + + if listKind != reflect.Array && listKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", list, listKind), msgAndArgs...) + } + + if subsetKind != reflect.Array && subsetKind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s", subset, subsetKind), msgAndArgs...) + } + + for i := 0; i < subsetValue.Len(); i++ { + element := subsetValue.Index(i).Interface() + ok, found := includeElement(list, element) + if !ok { + return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", list), msgAndArgs...) + } + if !found { + return true + } + } + + return Fail(t, fmt.Sprintf("%q is a subset of %q", subset, list), msgAndArgs...) +} + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { + result := comp() + if !result { + Fail(t, "Condition failed!", msgAndArgs...) + } + return result +} + +// PanicTestFunc defines a func that should be passed to the assert.Panics and assert.NotPanics +// methods, and represents a simple func that takes no arguments, and returns nothing. +type PanicTestFunc func() + +// didPanic returns true if the function passed to it panics. Otherwise, it returns false. +func didPanic(f PanicTestFunc) (bool, interface{}) { + + didPanic := false + var message interface{} + func() { + + defer func() { + if message = recover(); message != nil { + didPanic = true + } + }() + + // call the target function + f() + + }() + + return didPanic, message + +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + funcDidPanic, panicValue := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + if panicValue != expected { + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%v\n\r\tPanic value:\t%v", f, expected, panicValue), msgAndArgs...) + } + + return true +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { + + if funcDidPanic, panicValue := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\r\tPanic value:\t%v", f, panicValue), msgAndArgs...) + } + + return true +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) bool { + + dt := expected.Sub(actual) + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +func toFloat(x interface{}) (float64, bool) { + var xf float64 + xok := true + + switch xn := x.(type) { + case uint8: + xf = float64(xn) + case uint16: + xf = float64(xn) + case uint32: + xf = float64(xn) + case uint64: + xf = float64(xn) + case int: + xf = float64(xn) + case int8: + xf = float64(xn) + case int16: + xf = float64(xn) + case int32: + xf = float64(xn) + case int64: + xf = float64(xn) + case float32: + xf = float64(xn) + case float64: + xf = float64(xn) + case time.Duration: + xf = float64(xn) + default: + xok = false + } + + return xf, xok +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + + af, aok := toFloat(expected) + bf, bok := toFloat(actual) + + if !aok || !bok { + return Fail(t, fmt.Sprintf("Parameters must be numerical"), msgAndArgs...) + } + + if math.IsNaN(af) { + return Fail(t, fmt.Sprintf("Expected must not be NaN"), msgAndArgs...) + } + + if math.IsNaN(bf) { + return Fail(t, fmt.Sprintf("Expected %v with delta %v, but was NaN", expected, delta), msgAndArgs...) + } + + dt := af - bf + if dt < -delta || dt > delta { + return Fail(t, fmt.Sprintf("Max difference between %v and %v allowed is %v, but difference was %v", expected, actual, delta, dt), msgAndArgs...) + } + + return true +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InDelta(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), delta, msgAndArgs...) + if !result { + return result + } + } + + return true +} + +func calcRelativeError(expected, actual interface{}) (float64, error) { + af, aok := toFloat(expected) + if !aok { + return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) + } + if af == 0 { + return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") + } + bf, bok := toFloat(actual) + if !bok { + return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) + } + + return math.Abs(af-bf) / math.Abs(af), nil +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + actualEpsilon, err := calcRelativeError(expected, actual) + if err != nil { + return Fail(t, err.Error(), msgAndArgs...) + } + if actualEpsilon > epsilon { + return Fail(t, fmt.Sprintf("Relative error is too high: %#v (expected)\n"+ + " < %#v (actual)", epsilon, actualEpsilon), msgAndArgs...) + } + + return true +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, msgAndArgs ...interface{}) bool { + if expected == nil || actual == nil || + reflect.TypeOf(actual).Kind() != reflect.Slice || + reflect.TypeOf(expected).Kind() != reflect.Slice { + return Fail(t, fmt.Sprintf("Parameters must be slice"), msgAndArgs...) + } + + actualSlice := reflect.ValueOf(actual) + expectedSlice := reflect.ValueOf(expected) + + for i := 0; i < actualSlice.Len(); i++ { + result := InEpsilon(t, actualSlice.Index(i).Interface(), expectedSlice.Index(i).Interface(), epsilon) + if !result { + return result + } + } + + return true +} + +/* + Errors +*/ + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { + if err != nil { + return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) + } + + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { + + if err == nil { + return Fail(t, "An error is expected but got nil.", msgAndArgs...) + } + + return true +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) bool { + if !Error(t, theError, msgAndArgs...) { + return false + } + expected := errString + actual := theError.Error() + // don't need to use deep equals here, we know they are both strings + if expected != actual { + return Fail(t, fmt.Sprintf("Error message not equal:\n"+ + "expected: %q\n"+ + "actual: %q", expected, actual), msgAndArgs...) + } + return true +} + +// matchRegexp return true if a specified regexp matches a string. +func matchRegexp(rx interface{}, str interface{}) bool { + + var r *regexp.Regexp + if rr, ok := rx.(*regexp.Regexp); ok { + r = rr + } else { + r = regexp.MustCompile(fmt.Sprint(rx)) + } + + return (r.FindStringIndex(fmt.Sprint(str)) != nil) + +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + + match := matchRegexp(rx, str) + + if !match { + Fail(t, fmt.Sprintf("Expect \"%v\" to match \"%v\"", str, rx), msgAndArgs...) + } + + return match +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) bool { + match := matchRegexp(rx, str) + + if match { + Fail(t, fmt.Sprintf("Expect \"%v\" to NOT match \"%v\"", str, rx), msgAndArgs...) + } + + return !match + +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i != nil && !reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { + if i == nil || reflect.DeepEqual(i, reflect.Zero(reflect.TypeOf(i)).Interface()) { + return Fail(t, fmt.Sprintf("Should not be zero, but was %v", i), msgAndArgs...) + } + return true +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) bool { + var expectedJSONAsInterface, actualJSONAsInterface interface{} + + if err := json.Unmarshal([]byte(expected), &expectedJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Expected value ('%s') is not valid json.\nJSON parsing error: '%s'", expected, err.Error()), msgAndArgs...) + } + + if err := json.Unmarshal([]byte(actual), &actualJSONAsInterface); err != nil { + return Fail(t, fmt.Sprintf("Input ('%s') needs to be valid json.\nJSON parsing error: '%s'", actual, err.Error()), msgAndArgs...) + } + + return Equal(t, expectedJSONAsInterface, actualJSONAsInterface, msgAndArgs...) +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return "\n\nDiff:\n" + diff +} + +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + +func isFunction(arg interface{}) bool { + if arg == nil { + return false + } + return reflect.TypeOf(arg).Kind() == reflect.Func +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/doc.go new file mode 100755 index 0000000..c9dccc4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/doc.go @@ -0,0 +1,45 @@ +// Package assert provides a set of comprehensive testing tools for use with the normal Go testing system. +// +// Example Usage +// +// The following is a complete example using assert in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// if you assert many times, use the format below: +// +// import ( +// "testing" +// "github.com/stretchr/testify/assert" +// ) +// +// func TestSomething(t *testing.T) { +// assert := assert.New(t) +// +// var a string = "Hello" +// var b string = "Hello" +// +// assert.Equal(a, b, "The two words should be the same.") +// } +// +// Assertions +// +// Assertions allow you to easily write test code, and are global funcs in the `assert` package. +// All assertion functions take, as the first argument, the `*testing.T` object provided by the +// testing framework. This allows the assertion funcs to write the failings and other details to +// the correct place. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package assert diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/errors.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/errors.go new file mode 100755 index 0000000..ac9dc9d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/errors.go @@ -0,0 +1,10 @@ +package assert + +import ( + "errors" +) + +// AnError is an error instance useful for testing. If the code does not care +// about error specifics, and only needs to return the error for example, this +// error should be used to make the test code more readable. +var AnError = errors.New("assert.AnError general error for testing") diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go new file mode 100755 index 0000000..9ad5685 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -0,0 +1,16 @@ +package assert + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go new file mode 100755 index 0000000..ba811c0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -0,0 +1,127 @@ +package assert + +import ( + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "strings" +) + +// httpCode is a helper that returns HTTP code of the response. It returns -1 and +// an error if building a new request fails. +func httpCode(handler http.HandlerFunc, method, url string, values url.Values) (int, error) { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return -1, err + } + handler(w, req) + return w.Code, nil +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent + if !isSuccessCode { + Fail(t, fmt.Sprintf("Expected HTTP success status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isSuccessCode +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect + if !isRedirectCode { + Fail(t, fmt.Sprintf("Expected HTTP redirect status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isRedirectCode +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values url.Values) bool { + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + return false + } + + isErrorCode := code >= http.StatusBadRequest + if !isErrorCode { + Fail(t, fmt.Sprintf("Expected HTTP error status code for %q but received %d", url+"?"+values.Encode(), code)) + } + + return isErrorCode +} + +// HTTPBody is a helper that returns HTTP body of the response. It returns +// empty string if building a new request fails. +func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { + w := httptest.NewRecorder() + req, err := http.NewRequest(method, url+"?"+values.Encode(), nil) + if err != nil { + return "" + } + handler(w, req) + return w.Body.String() +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if !contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return contains +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, str interface{}) bool { + body := HTTPBody(handler, method, url, values) + + contains := strings.Contains(body, fmt.Sprint(str)) + if contains { + Fail(t, fmt.Sprintf("Expected response body for \"%s\" to NOT contain \"%s\" but found \"%s\"", url+"?"+values.Encode(), str, body)) + } + + return !contains +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/doc.go new file mode 100755 index 0000000..7324128 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/doc.go @@ -0,0 +1,44 @@ +// Package mock provides a system by which it is possible to mock your objects +// and verify calls are happening as expected. +// +// Example Usage +// +// The mock package provides an object, Mock, that tracks activity on another object. It is usually +// embedded into a test object as shown below: +// +// type MyTestObject struct { +// // add a Mock object instance +// mock.Mock +// +// // other fields go here as normal +// } +// +// When implementing the methods of an interface, you wire your functions up +// to call the Mock.Called(args...) method, and return the appropriate values. +// +// For example, to mock a method that saves the name and age of a person and returns +// the year of their birth or an error, you might write this: +// +// func (o *MyTestObject) SavePersonDetails(firstname, lastname string, age int) (int, error) { +// args := o.Called(firstname, lastname, age) +// return args.Int(0), args.Error(1) +// } +// +// The Int, Error and Bool methods are examples of strongly typed getters that take the argument +// index position. Given this argument list: +// +// (12, true, "Something") +// +// You could read them out strongly typed like this: +// +// args.Int(0) +// args.Bool(1) +// args.String(2) +// +// For objects of your own type, use the generic Arguments.Get(index) method and make a type assertion: +// +// return args.Get(0).(*MyObject), args.Get(1).(*AnotherObjectOfMine) +// +// This may cause a panic if the object you are getting is nil (the type assertion will fail), in those +// cases you should check for nil first. +package mock diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/mock.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/mock.go new file mode 100755 index 0000000..5c17124 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/mock/mock.go @@ -0,0 +1,784 @@ +package mock + +import ( + "fmt" + "reflect" + "regexp" + "runtime" + "strings" + "sync" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/pmezard/go-difflib/difflib" + "github.com/stretchr/objx" + "github.com/stretchr/testify/assert" +) + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Logf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + FailNow() +} + +/* + Call +*/ + +// Call represents a method call and is used for setting expectations, +// as well as recording activity. +type Call struct { + Parent *Mock + + // The name of the method that was or will be called. + Method string + + // Holds the arguments of the method. + Arguments Arguments + + // Holds the arguments that should be returned when + // this method is called. + ReturnArguments Arguments + + // The number of times to return the return arguments when setting + // expectations. 0 means to always return the value. + Repeatability int + + // Amount of times this call has been called + totalCalls int + + // Holds a channel that will be used to block the Return until it either + // receives a message or is closed. nil means it returns immediately. + WaitFor <-chan time.Time + + // Holds a handler used to manipulate arguments content that are passed by + // reference. It's useful when mocking methods such as unmarshalers or + // decoders. + RunFn func(Arguments) +} + +func newCall(parent *Mock, methodName string, methodArguments ...interface{}) *Call { + return &Call{ + Parent: parent, + Method: methodName, + Arguments: methodArguments, + ReturnArguments: make([]interface{}, 0), + Repeatability: 0, + WaitFor: nil, + RunFn: nil, + } +} + +func (c *Call) lock() { + c.Parent.mutex.Lock() +} + +func (c *Call) unlock() { + c.Parent.mutex.Unlock() +} + +// Return specifies the return arguments for the expectation. +// +// Mock.On("DoSomething").Return(errors.New("failed")) +func (c *Call) Return(returnArguments ...interface{}) *Call { + c.lock() + defer c.unlock() + + c.ReturnArguments = returnArguments + + return c +} + +// Once indicates that that the mock should only return the value once. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Once() +func (c *Call) Once() *Call { + return c.Times(1) +} + +// Twice indicates that that the mock should only return the value twice. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Twice() +func (c *Call) Twice() *Call { + return c.Times(2) +} + +// Times indicates that that the mock should only return the indicated number +// of times. +// +// Mock.On("MyMethod", arg1, arg2).Return(returnArg1, returnArg2).Times(5) +func (c *Call) Times(i int) *Call { + c.lock() + defer c.unlock() + c.Repeatability = i + return c +} + +// WaitUntil sets the channel that will block the mock's return until its closed +// or a message is received. +// +// Mock.On("MyMethod", arg1, arg2).WaitUntil(time.After(time.Second)) +func (c *Call) WaitUntil(w <-chan time.Time) *Call { + c.lock() + defer c.unlock() + c.WaitFor = w + return c +} + +// After sets how long to block until the call returns +// +// Mock.On("MyMethod", arg1, arg2).After(time.Second) +func (c *Call) After(d time.Duration) *Call { + return c.WaitUntil(time.After(d)) +} + +// Run sets a handler to be called before returning. It can be used when +// mocking a method such as unmarshalers that takes a pointer to a struct and +// sets properties in such struct +// +// Mock.On("Unmarshal", AnythingOfType("*map[string]interface{}").Return().Run(func(args Arguments) { +// arg := args.Get(0).(*map[string]interface{}) +// arg["foo"] = "bar" +// }) +func (c *Call) Run(fn func(args Arguments)) *Call { + c.lock() + defer c.unlock() + c.RunFn = fn + return c +} + +// On chains a new expectation description onto the mocked interface. This +// allows syntax like. +// +// Mock. +// On("MyMethod", 1).Return(nil). +// On("MyOtherMethod", 'a', 'b', 'c').Return(errors.New("Some Error")) +func (c *Call) On(methodName string, arguments ...interface{}) *Call { + return c.Parent.On(methodName, arguments...) +} + +// Mock is the workhorse used to track activity on another object. +// For an example of its usage, refer to the "Example Usage" section at the top +// of this document. +type Mock struct { + // Represents the calls that are expected of + // an object. + ExpectedCalls []*Call + + // Holds the calls that were made to this mocked object. + Calls []Call + + // TestData holds any data that might be useful for testing. Testify ignores + // this data completely allowing you to do whatever you like with it. + testData objx.Map + + mutex sync.Mutex +} + +// TestData holds any data that might be useful for testing. Testify ignores +// this data completely allowing you to do whatever you like with it. +func (m *Mock) TestData() objx.Map { + + if m.testData == nil { + m.testData = make(objx.Map) + } + + return m.testData +} + +/* + Setting expectations +*/ + +// On starts a description of an expectation of the specified method +// being called. +// +// Mock.On("MyMethod", arg1, arg2) +func (m *Mock) On(methodName string, arguments ...interface{}) *Call { + for _, arg := range arguments { + if v := reflect.ValueOf(arg); v.Kind() == reflect.Func { + panic(fmt.Sprintf("cannot use Func in expectations. Use mock.AnythingOfType(\"%T\")", arg)) + } + } + + m.mutex.Lock() + defer m.mutex.Unlock() + c := newCall(m, methodName, arguments...) + m.ExpectedCalls = append(m.ExpectedCalls, c) + return c +} + +// /* +// Recording and responding to activity +// */ + +func (m *Mock) findExpectedCall(method string, arguments ...interface{}) (int, *Call) { + for i, call := range m.ExpectedCalls { + if call.Method == method && call.Repeatability > -1 { + + _, diffCount := call.Arguments.Diff(arguments) + if diffCount == 0 { + return i, call + } + + } + } + return -1, nil +} + +func (m *Mock) findClosestCall(method string, arguments ...interface{}) (bool, *Call) { + diffCount := 0 + var closestCall *Call + + for _, call := range m.expectedCalls() { + if call.Method == method { + + _, tempDiffCount := call.Arguments.Diff(arguments) + if tempDiffCount < diffCount || diffCount == 0 { + diffCount = tempDiffCount + closestCall = call + } + + } + } + + if closestCall == nil { + return false, nil + } + + return true, closestCall +} + +func callString(method string, arguments Arguments, includeArgumentValues bool) string { + + var argValsString string + if includeArgumentValues { + var argVals []string + for argIndex, arg := range arguments { + argVals = append(argVals, fmt.Sprintf("%d: %#v", argIndex, arg)) + } + argValsString = fmt.Sprintf("\n\t\t%s", strings.Join(argVals, "\n\t\t")) + } + + return fmt.Sprintf("%s(%s)%s", method, arguments.String(), argValsString) +} + +// Called tells the mock object that a method has been called, and gets an array +// of arguments to return. Panics if the call is unexpected (i.e. not preceded by +// appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) Called(arguments ...interface{}) Arguments { + // get the calling function's name + pc, _, _, ok := runtime.Caller(1) + if !ok { + panic("Couldn't get the caller information") + } + functionPath := runtime.FuncForPC(pc).Name() + //Next four lines are required to use GCCGO function naming conventions. + //For Ex: github_com_docker_libkv_store_mock.WatchTree.pN39_github_com_docker_libkv_store_mock.Mock + //uses interface information unlike golang github.com/docker/libkv/store/mock.(*Mock).WatchTree + //With GCCGO we need to remove interface information starting from pN

. + re := regexp.MustCompile("\\.pN\\d+_") + if re.MatchString(functionPath) { + functionPath = re.Split(functionPath, -1)[0] + } + parts := strings.Split(functionPath, ".") + functionName := parts[len(parts)-1] + return m.MethodCalled(functionName, arguments...) +} + +// MethodCalled tells the mock object that the given method has been called, and gets +// an array of arguments to return. Panics if the call is unexpected (i.e. not preceded +// by appropriate .On .Return() calls) +// If Call.WaitFor is set, blocks until the channel is closed or receives a message. +func (m *Mock) MethodCalled(methodName string, arguments ...interface{}) Arguments { + m.mutex.Lock() + found, call := m.findExpectedCall(methodName, arguments...) + + if found < 0 { + // we have to fail here - because we don't know what to do + // as the return arguments. This is because: + // + // a) this is a totally unexpected call to this method, + // b) the arguments are not what was expected, or + // c) the developer has forgotten to add an accompanying On...Return pair. + + closestFound, closestCall := m.findClosestCall(methodName, arguments...) + m.mutex.Unlock() + + if closestFound { + panic(fmt.Sprintf("\n\nmock: Unexpected Method Call\n-----------------------------\n\n%s\n\nThe closest call I have is: \n\n%s\n\n%s\n", callString(methodName, arguments, true), callString(methodName, closestCall.Arguments, true), diffArguments(arguments, closestCall.Arguments))) + } else { + panic(fmt.Sprintf("\nassert: mock: I don't know what to return because the method call was unexpected.\n\tEither do Mock.On(\"%s\").Return(...) first, or remove the %s() call.\n\tThis method was unexpected:\n\t\t%s\n\tat: %s", methodName, methodName, callString(methodName, arguments, true), assert.CallerInfo())) + } + } + + switch { + case call.Repeatability == 1: + call.Repeatability = -1 + call.totalCalls++ + + case call.Repeatability > 1: + call.Repeatability-- + call.totalCalls++ + + case call.Repeatability == 0: + call.totalCalls++ + } + + // add the call + m.Calls = append(m.Calls, *newCall(m, methodName, arguments...)) + m.mutex.Unlock() + + // block if specified + if call.WaitFor != nil { + <-call.WaitFor + } + + m.mutex.Lock() + runFn := call.RunFn + m.mutex.Unlock() + + if runFn != nil { + runFn(arguments) + } + + m.mutex.Lock() + returnArgs := call.ReturnArguments + m.mutex.Unlock() + + return returnArgs +} + +/* + Assertions +*/ + +type assertExpectationser interface { + AssertExpectations(TestingT) bool +} + +// AssertExpectationsForObjects asserts that everything specified with On and Return +// of the specified objects was in fact called as expected. +// +// Calls may have occurred in any order. +func AssertExpectationsForObjects(t TestingT, testObjects ...interface{}) bool { + for _, obj := range testObjects { + if m, ok := obj.(Mock); ok { + t.Logf("Deprecated mock.AssertExpectationsForObjects(myMock.Mock) use mock.AssertExpectationsForObjects(myMock)") + obj = &m + } + m := obj.(assertExpectationser) + if !m.AssertExpectations(t) { + return false + } + } + return true +} + +// AssertExpectations asserts that everything specified with On and Return was +// in fact called as expected. Calls may have occurred in any order. +func (m *Mock) AssertExpectations(t TestingT) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var somethingMissing bool + var failedExpectations int + + // iterate through each expectation + expectedCalls := m.expectedCalls() + for _, expectedCall := range expectedCalls { + if !m.methodWasCalled(expectedCall.Method, expectedCall.Arguments) && expectedCall.totalCalls == 0 { + somethingMissing = true + failedExpectations++ + t.Logf("\u274C\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } else { + if expectedCall.Repeatability > 0 { + somethingMissing = true + failedExpectations++ + } else { + t.Logf("\u2705\t%s(%s)", expectedCall.Method, expectedCall.Arguments.String()) + } + } + } + + if somethingMissing { + t.Errorf("FAIL: %d out of %d expectation(s) were met.\n\tThe code you are testing needs to make %d more call(s).\n\tat: %s", len(expectedCalls)-failedExpectations, len(expectedCalls), failedExpectations, assert.CallerInfo()) + } + + return !somethingMissing +} + +// AssertNumberOfCalls asserts that the method was called expectedCalls times. +func (m *Mock) AssertNumberOfCalls(t TestingT, methodName string, expectedCalls int) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + var actualCalls int + for _, call := range m.calls() { + if call.Method == methodName { + actualCalls++ + } + } + return assert.Equal(t, expectedCalls, actualCalls, fmt.Sprintf("Expected number of calls (%d) does not match the actual number of calls (%d).", expectedCalls, actualCalls)) +} + +// AssertCalled asserts that the method was called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.True(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method should have been called with %d argument(s), but was not.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +// AssertNotCalled asserts that the method was not called. +// It can produce a false result when an argument is a pointer type and the underlying value changed after calling the mocked method. +func (m *Mock) AssertNotCalled(t TestingT, methodName string, arguments ...interface{}) bool { + m.mutex.Lock() + defer m.mutex.Unlock() + if !assert.False(t, m.methodWasCalled(methodName, arguments), fmt.Sprintf("The \"%s\" method was called with %d argument(s), but should NOT have been.", methodName, len(arguments))) { + t.Logf("%v", m.expectedCalls()) + return false + } + return true +} + +func (m *Mock) methodWasCalled(methodName string, expected []interface{}) bool { + for _, call := range m.calls() { + if call.Method == methodName { + + _, differences := Arguments(expected).Diff(call.Arguments) + + if differences == 0 { + // found the expected call + return true + } + + } + } + // we didn't find the expected call + return false +} + +func (m *Mock) expectedCalls() []*Call { + return append([]*Call{}, m.ExpectedCalls...) +} + +func (m *Mock) calls() []Call { + return append([]Call{}, m.Calls...) +} + +/* + Arguments +*/ + +// Arguments holds an array of method arguments or return values. +type Arguments []interface{} + +const ( + // Anything is used in Diff and Assert when the argument being tested + // shouldn't be taken into consideration. + Anything string = "mock.Anything" +) + +// AnythingOfTypeArgument is a string that contains the type of an argument +// for use when type checking. Used in Diff and Assert. +type AnythingOfTypeArgument string + +// AnythingOfType returns an AnythingOfTypeArgument object containing the +// name of the type to check for. Used in Diff and Assert. +// +// For example: +// Assert(t, AnythingOfType("string"), AnythingOfType("int")) +func AnythingOfType(t string) AnythingOfTypeArgument { + return AnythingOfTypeArgument(t) +} + +// argumentMatcher performs custom argument matching, returning whether or +// not the argument is matched by the expectation fixture function. +type argumentMatcher struct { + // fn is a function which accepts one argument, and returns a bool. + fn reflect.Value +} + +func (f argumentMatcher) Matches(argument interface{}) bool { + expectType := f.fn.Type().In(0) + + if reflect.TypeOf(argument).AssignableTo(expectType) { + result := f.fn.Call([]reflect.Value{reflect.ValueOf(argument)}) + return result[0].Bool() + } + return false +} + +func (f argumentMatcher) String() string { + return fmt.Sprintf("func(%s) bool", f.fn.Type().In(0).Name()) +} + +// MatchedBy can be used to match a mock call based on only certain properties +// from a complex struct or some calculation. It takes a function that will be +// evaluated with the called argument and will return true when there's a match +// and false otherwise. +// +// Example: +// m.On("Do", MatchedBy(func(req *http.Request) bool { return req.Host == "example.com" })) +// +// |fn|, must be a function accepting a single argument (of the expected type) +// which returns a bool. If |fn| doesn't match the required signature, +// MatchedBy() panics. +func MatchedBy(fn interface{}) argumentMatcher { + fnType := reflect.TypeOf(fn) + + if fnType.Kind() != reflect.Func { + panic(fmt.Sprintf("assert: arguments: %s is not a func", fn)) + } + if fnType.NumIn() != 1 { + panic(fmt.Sprintf("assert: arguments: %s does not take exactly one argument", fn)) + } + if fnType.NumOut() != 1 || fnType.Out(0).Kind() != reflect.Bool { + panic(fmt.Sprintf("assert: arguments: %s does not return a bool", fn)) + } + + return argumentMatcher{fn: reflect.ValueOf(fn)} +} + +// Get Returns the argument at the specified index. +func (args Arguments) Get(index int) interface{} { + if index+1 > len(args) { + panic(fmt.Sprintf("assert: arguments: Cannot call Get(%d) because there are %d argument(s).", index, len(args))) + } + return args[index] +} + +// Is gets whether the objects match the arguments specified. +func (args Arguments) Is(objects ...interface{}) bool { + for i, obj := range args { + if obj != objects[i] { + return false + } + } + return true +} + +// Diff gets a string describing the differences between the arguments +// and the specified objects. +// +// Returns the diff string and number of differences found. +func (args Arguments) Diff(objects []interface{}) (string, int) { + + var output = "\n" + var differences int + + var maxArgCount = len(args) + if len(objects) > maxArgCount { + maxArgCount = len(objects) + } + + for i := 0; i < maxArgCount; i++ { + var actual, expected interface{} + + if len(objects) <= i { + actual = "(Missing)" + } else { + actual = objects[i] + } + + if len(args) <= i { + expected = "(Missing)" + } else { + expected = args[i] + } + + if matcher, ok := expected.(argumentMatcher); ok { + if matcher.Matches(actual) { + output = fmt.Sprintf("%s\t%d: \u2705 %s matched by %s\n", output, i, actual, matcher) + } else { + differences++ + output = fmt.Sprintf("%s\t%d: \u2705 %s not matched by %s\n", output, i, actual, matcher) + } + } else if reflect.TypeOf(expected) == reflect.TypeOf((*AnythingOfTypeArgument)(nil)).Elem() { + + // type checking + if reflect.TypeOf(actual).Name() != string(expected.(AnythingOfTypeArgument)) && reflect.TypeOf(actual).String() != string(expected.(AnythingOfTypeArgument)) { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: \u274C type %s != type %s - %s\n", output, i, expected, reflect.TypeOf(actual).Name(), actual) + } + + } else { + + // normal checking + + if assert.ObjectsAreEqual(expected, Anything) || assert.ObjectsAreEqual(actual, Anything) || assert.ObjectsAreEqual(actual, expected) { + // match + output = fmt.Sprintf("%s\t%d: \u2705 %s == %s\n", output, i, actual, expected) + } else { + // not match + differences++ + output = fmt.Sprintf("%s\t%d: \u274C %s != %s\n", output, i, actual, expected) + } + } + + } + + if differences == 0 { + return "No differences.", differences + } + + return output, differences + +} + +// Assert compares the arguments with the specified objects and fails if +// they do not exactly match. +func (args Arguments) Assert(t TestingT, objects ...interface{}) bool { + + // get the differences + diff, diffCount := args.Diff(objects) + + if diffCount == 0 { + return true + } + + // there are differences... report them... + t.Logf(diff) + t.Errorf("%sArguments do not match.", assert.CallerInfo()) + + return false + +} + +// String gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +// +// If no index is provided, String() returns a complete string representation +// of the arguments. +func (args Arguments) String(indexOrNil ...int) string { + + if len(indexOrNil) == 0 { + // normal String() method - return a string representation of the args + var argsStr []string + for _, arg := range args { + argsStr = append(argsStr, fmt.Sprintf("%s", reflect.TypeOf(arg))) + } + return strings.Join(argsStr, ",") + } else if len(indexOrNil) == 1 { + // Index has been specified - get the argument at that index + var index = indexOrNil[0] + var s string + var ok bool + if s, ok = args.Get(index).(string); !ok { + panic(fmt.Sprintf("assert: arguments: String(%d) failed because object wasn't correct type: %s", index, args.Get(index))) + } + return s + } + + panic(fmt.Sprintf("assert: arguments: Wrong number of arguments passed to String. Must be 0 or 1, not %d", len(indexOrNil))) + +} + +// Int gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Int(index int) int { + var s int + var ok bool + if s, ok = args.Get(index).(int); !ok { + panic(fmt.Sprintf("assert: arguments: Int(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Error gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Error(index int) error { + obj := args.Get(index) + var s error + var ok bool + if obj == nil { + return nil + } + if s, ok = obj.(error); !ok { + panic(fmt.Sprintf("assert: arguments: Error(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +// Bool gets the argument at the specified index. Panics if there is no argument, or +// if the argument is of the wrong type. +func (args Arguments) Bool(index int) bool { + var s bool + var ok bool + if s, ok = args.Get(index).(bool); !ok { + panic(fmt.Sprintf("assert: arguments: Bool(%d) failed because object wasn't correct type: %v", index, args.Get(index))) + } + return s +} + +func typeAndKind(v interface{}) (reflect.Type, reflect.Kind) { + t := reflect.TypeOf(v) + k := t.Kind() + + if k == reflect.Ptr { + t = t.Elem() + k = t.Kind() + } + return t, k +} + +func diffArguments(expected Arguments, actual Arguments) string { + if len(expected) != len(actual) { + return fmt.Sprintf("Provided %v arguments, mocked for %v arguments", len(expected), len(actual)) + } + + for x := range expected { + if diffString := diff(expected[x], actual[x]); diffString != "" { + return fmt.Sprintf("Difference found in argument %v:\n\n%s", x, diffString) + } + } + + return "" +} + +// diff returns a diff of both values as long as both are of the same type and +// are a struct, map, slice or array. Otherwise it returns an empty string. +func diff(expected interface{}, actual interface{}) string { + if expected == nil || actual == nil { + return "" + } + + et, ek := typeAndKind(expected) + at, _ := typeAndKind(actual) + + if et != at { + return "" + } + + if ek != reflect.Struct && ek != reflect.Map && ek != reflect.Slice && ek != reflect.Array { + return "" + } + + e := spewConfig.Sdump(expected) + a := spewConfig.Sdump(actual) + + diff, _ := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(e), + B: difflib.SplitLines(a), + FromFile: "Expected", + FromDate: "", + ToFile: "Actual", + ToDate: "", + Context: 1, + }) + + return diff +} + +var spewConfig = spew.ConfigState{ + Indent: " ", + DisablePointerAddresses: true, + DisableCapacities: true, + SortKeys: true, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/doc.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/doc.go new file mode 100755 index 0000000..169de39 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/doc.go @@ -0,0 +1,28 @@ +// Package require implements the same assertions as the `assert` package but +// stops test execution when a test fails. +// +// Example Usage +// +// The following is a complete example using require in a standard test function: +// import ( +// "testing" +// "github.com/stretchr/testify/require" +// ) +// +// func TestSomething(t *testing.T) { +// +// var a string = "Hello" +// var b string = "Hello" +// +// require.Equal(t, a, b, "The two words should be the same.") +// +// } +// +// Assertions +// +// The `require` package have same global functions as in the `assert` package, +// but instead of returning a boolean result they call `t.FailNow()`. +// +// Every assertion function also takes an optional string message as the final argument, +// allowing custom error messages to be appended to the message the assertion method outputs. +package require diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go new file mode 100755 index 0000000..ac71d40 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/forward_requirements.go @@ -0,0 +1,16 @@ +package require + +// Assertions provides assertion methods around the +// TestingT interface. +type Assertions struct { + t TestingT +} + +// New makes a new Assertions object for the specified TestingT. +func New(t TestingT) *Assertions { + return &Assertions{ + t: t, + } +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require_forward.go.tmpl -include-format-funcs diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go new file mode 100755 index 0000000..2fe0557 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go @@ -0,0 +1,911 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func Condition(t TestingT, comp assert.Comparison, msgAndArgs ...interface{}) { + if !assert.Condition(t, comp, msgAndArgs...) { + t.FailNow() + } +} + +// Conditionf uses a Comparison to assert a complex condition. +func Conditionf(t TestingT, comp assert.Comparison, msg string, args ...interface{}) { + if !assert.Conditionf(t, comp, msg, args...) { + t.FailNow() + } +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Contains(t, "Hello World", "World") +// assert.Contains(t, ["Hello", "World"], "World") +// assert.Contains(t, {"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func Contains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.Contains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// assert.Containsf(t, "Hello World", "World", "error message %s", "formatted") +// assert.Containsf(t, ["Hello", "World"], "World", "error message %s", "formatted") +// assert.Containsf(t, {"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.Containsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Empty(t, obj) +// +// Returns whether the assertion was successful (true) or not (false). +func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Empty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// assert.Emptyf(t, obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Emptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Emptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// Equal asserts that two objects are equal. +// +// assert.Equal(t, 123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equal(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Equal(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualError(t, err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualError(t TestingT, theError error, errString string, msgAndArgs ...interface{}) { + if !assert.EqualError(t, theError, errString, msgAndArgs...) { + t.FailNow() + } +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// assert.EqualErrorf(t, err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func EqualErrorf(t TestingT, theError error, errString string, msg string, args ...interface{}) { + if !assert.EqualErrorf(t, theError, errString, msg, args...) { + t.FailNow() + } +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValues(t, uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.EqualValues(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.EqualValuesf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Equalf asserts that two objects are equal. +// +// assert.Equalf(t, 123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func Equalf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Equalf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Error(t, err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Error(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.Error(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if assert.Errorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func Errorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.Errorf(t, err, msg, args...) { + t.FailNow() + } +} + +// Exactly asserts that two objects are equal is value and type. +// +// assert.Exactly(t, int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.Exactly(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.Exactlyf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Fail reports a failure through +func Fail(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.Fail(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNow fails test +func FailNow(t TestingT, failureMessage string, msgAndArgs ...interface{}) { + if !assert.FailNow(t, failureMessage, msgAndArgs...) { + t.FailNow() + } +} + +// FailNowf fails test +func FailNowf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.FailNowf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// Failf reports a failure through +func Failf(t TestingT, failureMessage string, msg string, args ...interface{}) { + if !assert.Failf(t, failureMessage, msg, args...) { + t.FailNow() + } +} + +// False asserts that the specified value is false. +// +// assert.False(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func False(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.False(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Falsef asserts that the specified value is false. +// +// assert.Falsef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Falsef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Falsef(t, value, msg, args...) { + t.FailNow() + } +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// assert.HTTPBodyContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContains(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContains(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContains(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// assert.HTTPBodyNotContainsf(t, myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + if !assert.HTTPBodyNotContainsf(t, handler, method, url, values, str) { + t.FailNow() + } +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// assert.HTTPError(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPError(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPErrorf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirect(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirect(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPRedirectf(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccess(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccess(t, handler, method, url, values) { + t.FailNow() + } +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values) { + if !assert.HTTPSuccessf(t, handler, method, url, values) { + t.FailNow() + } +} + +// Implements asserts that an object is implemented by the specified interface. +// +// assert.Implements(t, (*MyInterface)(nil), new(MyObject)) +func Implements(t TestingT, interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.Implements(t, interfaceObject, object, msgAndArgs...) { + t.FailNow() + } +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.Implementsf(t, interfaceObject, object, msg, args...) { + t.FailNow() + } +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDelta(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDelta(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func InDeltaSlice(t TestingT, expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + if !assert.InDeltaSlice(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func InDeltaSlicef(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaSlicef(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + if !assert.InDeltaf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilon(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilon(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlice(t TestingT, expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + if !assert.InEpsilonSlice(t, expected, actual, epsilon, msgAndArgs...) { + t.FailNow() + } +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonSlicef(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func InEpsilonf(t TestingT, expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + if !assert.InEpsilonf(t, expected, actual, epsilon, msg, args...) { + t.FailNow() + } +} + +// IsType asserts that the specified objects are of the same type. +func IsType(t TestingT, expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + if !assert.IsType(t, expectedType, object, msgAndArgs...) { + t.FailNow() + } +} + +// IsTypef asserts that the specified objects are of the same type. +func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) { + if !assert.IsTypef(t, expectedType, object, msg, args...) { + t.FailNow() + } +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEq(t TestingT, expected string, actual string, msgAndArgs ...interface{}) { + if !assert.JSONEq(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// assert.JSONEqf(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func JSONEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) { + if !assert.JSONEqf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// assert.Len(t, mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) { + if !assert.Len(t, object, length, msgAndArgs...) { + t.FailNow() + } +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// assert.Lenf(t, mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Lenf(t TestingT, object interface{}, length int, msg string, args ...interface{}) { + if !assert.Lenf(t, object, length, msg, args...) { + t.FailNow() + } +} + +// Nil asserts that the specified object is nil. +// +// assert.Nil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.Nil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// Nilf asserts that the specified object is nil. +// +// assert.Nilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.Nilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoError(t, err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoError(t TestingT, err error, msgAndArgs ...interface{}) { + if !assert.NoError(t, err, msgAndArgs...) { + t.FailNow() + } +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if assert.NoErrorf(t, err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NoErrorf(t TestingT, err error, msg string, args ...interface{}) { + if !assert.NoErrorf(t, err, msg, args...) { + t.FailNow() + } +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContains(t, "Hello World", "Earth") +// assert.NotContains(t, ["Hello", "World"], "Earth") +// assert.NotContains(t, {"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContains(t TestingT, s interface{}, contains interface{}, msgAndArgs ...interface{}) { + if !assert.NotContains(t, s, contains, msgAndArgs...) { + t.FailNow() + } +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// assert.NotContainsf(t, "Hello World", "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, ["Hello", "World"], "Earth", "error message %s", "formatted") +// assert.NotContainsf(t, {"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotContainsf(t TestingT, s interface{}, contains interface{}, msg string, args ...interface{}) { + if !assert.NotContainsf(t, s, contains, msg, args...) { + t.FailNow() + } +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmpty(t, obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotEmpty(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if assert.NotEmptyf(t, obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func NotEmptyf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotEmptyf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotEqual asserts that the specified values are NOT equal. +// +// assert.NotEqual(t, obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if !assert.NotEqual(t, expected, actual, msgAndArgs...) { + t.FailNow() + } +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if !assert.NotEqualf(t, expected, actual, msg, args...) { + t.FailNow() + } +} + +// NotNil asserts that the specified object is not nil. +// +// assert.NotNil(t, err) +// +// Returns whether the assertion was successful (true) or not (false). +func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) { + if !assert.NotNil(t, object, msgAndArgs...) { + t.FailNow() + } +} + +// NotNilf asserts that the specified object is not nil. +// +// assert.NotNilf(t, err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotNilf(t TestingT, object interface{}, msg string, args ...interface{}) { + if !assert.NotNilf(t, object, msg, args...) { + t.FailNow() + } +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanics(t, func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.NotPanics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// assert.NotPanicsf(t, func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotPanicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.NotPanicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// assert.NotRegexp(t, regexp.MustCompile("starts"), "it's starting") +// assert.NotRegexp(t, "^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.NotRegexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.NotRegexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubset(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.NotSubset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// assert.NotSubsetf(t, [1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func NotSubsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.NotSubsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.NotZero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func NotZerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.NotZerof(t, i, msg, args...) { + t.FailNow() + } +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panics(t, func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func Panics(t TestingT, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.Panics(t, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValue(t, "crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValue(t TestingT, expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + if !assert.PanicsWithValue(t, expected, f, msgAndArgs...) { + t.FailNow() + } +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// assert.PanicsWithValuef(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func PanicsWithValuef(t TestingT, expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.PanicsWithValuef(t, expected, f, msg, args...) { + t.FailNow() + } +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// assert.Panicsf(t, func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Panicsf(t TestingT, f assert.PanicTestFunc, msg string, args ...interface{}) { + if !assert.Panicsf(t, f, msg, args...) { + t.FailNow() + } +} + +// Regexp asserts that a specified regexp matches a string. +// +// assert.Regexp(t, regexp.MustCompile("start"), "it's starting") +// assert.Regexp(t, "start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface{}) { + if !assert.Regexp(t, rx, str, msgAndArgs...) { + t.FailNow() + } +} + +// Regexpf asserts that a specified regexp matches a string. +// +// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { + if !assert.Regexpf(t, rx, str, msg, args...) { + t.FailNow() + } +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subset(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func Subset(t TestingT, list interface{}, subset interface{}, msgAndArgs ...interface{}) { + if !assert.Subset(t, list, subset, msgAndArgs...) { + t.FailNow() + } +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// assert.Subsetf(t, [1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Subsetf(t TestingT, list interface{}, subset interface{}, msg string, args ...interface{}) { + if !assert.Subsetf(t, list, subset, msg, args...) { + t.FailNow() + } +} + +// True asserts that the specified value is true. +// +// assert.True(t, myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func True(t TestingT, value bool, msgAndArgs ...interface{}) { + if !assert.True(t, value, msgAndArgs...) { + t.FailNow() + } +} + +// Truef asserts that the specified value is true. +// +// assert.Truef(t, myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func Truef(t TestingT, value bool, msg string, args ...interface{}) { + if !assert.Truef(t, value, msg, args...) { + t.FailNow() + } +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// assert.WithinDuration(t, time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDuration(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + if !assert.WithinDuration(t, expected, actual, delta, msgAndArgs...) { + t.FailNow() + } +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// assert.WithinDurationf(t, time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + if !assert.WithinDurationf(t, expected, actual, delta, msg, args...) { + t.FailNow() + } +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func Zero(t TestingT, i interface{}, msgAndArgs ...interface{}) { + if !assert.Zero(t, i, msgAndArgs...) { + t.FailNow() + } +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) { + if !assert.Zerof(t, i, msg, args...) { + t.FailNow() + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go.tmpl b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go.tmpl new file mode 100755 index 0000000..d2c38f6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require.go.tmpl @@ -0,0 +1,6 @@ +{{.Comment}} +func {{.DocInfo.Name}}(t TestingT, {{.Params}}) { + if !assert.{{.DocInfo.Name}}(t, {{.ForwardedParams}}) { + t.FailNow() + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go new file mode 100755 index 0000000..c59c3c7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go @@ -0,0 +1,747 @@ +/* +* CODE GENERATED AUTOMATICALLY WITH github.com/stretchr/testify/_codegen +* THIS FILE MUST NOT BE EDITED BY HAND + */ + +package require + +import ( + assert "github.com/stretchr/testify/assert" + http "net/http" + url "net/url" + time "time" +) + +// Condition uses a Comparison to assert a complex condition. +func (a *Assertions) Condition(comp assert.Comparison, msgAndArgs ...interface{}) { + Condition(a.t, comp, msgAndArgs...) +} + +// Conditionf uses a Comparison to assert a complex condition. +func (a *Assertions) Conditionf(comp assert.Comparison, msg string, args ...interface{}) { + Conditionf(a.t, comp, msg, args...) +} + +// Contains asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Contains("Hello World", "World") +// a.Contains(["Hello", "World"], "World") +// a.Contains({"Hello": "World"}, "Hello") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Contains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + Contains(a.t, s, contains, msgAndArgs...) +} + +// Containsf asserts that the specified string, list(array, slice...) or map contains the +// specified substring or element. +// +// a.Containsf("Hello World", "World", "error message %s", "formatted") +// a.Containsf(["Hello", "World"], "World", "error message %s", "formatted") +// a.Containsf({"Hello": "World"}, "Hello", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + Containsf(a.t, s, contains, msg, args...) +} + +// Empty asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Empty(obj) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Empty(object interface{}, msgAndArgs ...interface{}) { + Empty(a.t, object, msgAndArgs...) +} + +// Emptyf asserts that the specified object is empty. I.e. nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// a.Emptyf(obj, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Emptyf(object interface{}, msg string, args ...interface{}) { + Emptyf(a.t, object, msg, args...) +} + +// Equal asserts that two objects are equal. +// +// a.Equal(123, 123) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equal(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Equal(a.t, expected, actual, msgAndArgs...) +} + +// EqualError asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualError(err, expectedErrorString) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualError(theError error, errString string, msgAndArgs ...interface{}) { + EqualError(a.t, theError, errString, msgAndArgs...) +} + +// EqualErrorf asserts that a function returned an error (i.e. not `nil`) +// and that it is equal to the provided error. +// +// actualObj, err := SomeFunction() +// a.EqualErrorf(err, expectedErrorString, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualErrorf(theError error, errString string, msg string, args ...interface{}) { + EqualErrorf(a.t, theError, errString, msg, args...) +} + +// EqualValues asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValues(uint32(123), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + EqualValues(a.t, expected, actual, msgAndArgs...) +} + +// EqualValuesf asserts that two objects are equal or convertable to the same types +// and equal. +// +// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + EqualValuesf(a.t, expected, actual, msg, args...) +} + +// Equalf asserts that two objects are equal. +// +// a.Equalf(123, 123, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). Function equality +// cannot be determined and will always fail. +func (a *Assertions) Equalf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Equalf(a.t, expected, actual, msg, args...) +} + +// Error asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Error(err) { +// assert.Equal(t, expectedError, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Error(err error, msgAndArgs ...interface{}) { + Error(a.t, err, msgAndArgs...) +} + +// Errorf asserts that a function returned an error (i.e. not `nil`). +// +// actualObj, err := SomeFunction() +// if a.Errorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedErrorf, err) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Errorf(err error, msg string, args ...interface{}) { + Errorf(a.t, err, msg, args...) +} + +// Exactly asserts that two objects are equal is value and type. +// +// a.Exactly(int32(123), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + Exactly(a.t, expected, actual, msgAndArgs...) +} + +// Exactlyf asserts that two objects are equal is value and type. +// +// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + Exactlyf(a.t, expected, actual, msg, args...) +} + +// Fail reports a failure through +func (a *Assertions) Fail(failureMessage string, msgAndArgs ...interface{}) { + Fail(a.t, failureMessage, msgAndArgs...) +} + +// FailNow fails test +func (a *Assertions) FailNow(failureMessage string, msgAndArgs ...interface{}) { + FailNow(a.t, failureMessage, msgAndArgs...) +} + +// FailNowf fails test +func (a *Assertions) FailNowf(failureMessage string, msg string, args ...interface{}) { + FailNowf(a.t, failureMessage, msg, args...) +} + +// Failf reports a failure through +func (a *Assertions) Failf(failureMessage string, msg string, args ...interface{}) { + Failf(a.t, failureMessage, msg, args...) +} + +// False asserts that the specified value is false. +// +// a.False(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) False(value bool, msgAndArgs ...interface{}) { + False(a.t, value, msgAndArgs...) +} + +// Falsef asserts that the specified value is false. +// +// a.Falsef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) { + Falsef(a.t, value, msg, args...) +} + +// HTTPBodyContains asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyContainsf asserts that a specified handler returns a +// body that contains a string. +// +// a.HTTPBodyContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyContainsf(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContains asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContains(myHandler, "www.google.com", nil, "I'm Feeling Lucky") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContains(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContains(a.t, handler, method, url, values, str) +} + +// HTTPBodyNotContainsf asserts that a specified handler returns a +// body that does not contain a string. +// +// a.HTTPBodyNotContainsf(myHandler, "www.google.com", nil, "I'm Feeling Lucky", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPBodyNotContainsf(handler http.HandlerFunc, method string, url string, values url.Values, str interface{}) { + HTTPBodyNotContainsf(a.t, handler, method, url, values, str) +} + +// HTTPError asserts that a specified handler returns an error status code. +// +// a.HTTPError(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPError(a.t, handler, method, url, values) +} + +// HTTPErrorf asserts that a specified handler returns an error status code. +// +// a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPErrorf(a.t, handler, method, url, values) +} + +// HTTPRedirect asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirect(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirect(a.t, handler, method, url, values) +} + +// HTTPRedirectf asserts that a specified handler returns a redirect status code. +// +// a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} +// +// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPRedirectf(a.t, handler, method, url, values) +} + +// HTTPSuccess asserts that a specified handler returns a success status code. +// +// a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccess(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccess(a.t, handler, method, url, values) +} + +// HTTPSuccessf asserts that a specified handler returns a success status code. +// +// a.HTTPSuccessf(myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPSuccessf(handler http.HandlerFunc, method string, url string, values url.Values) { + HTTPSuccessf(a.t, handler, method, url, values) +} + +// Implements asserts that an object is implemented by the specified interface. +// +// a.Implements((*MyInterface)(nil), new(MyObject)) +func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, msgAndArgs ...interface{}) { + Implements(a.t, interfaceObject, object, msgAndArgs...) +} + +// Implementsf asserts that an object is implemented by the specified interface. +// +// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { + Implementsf(a.t, interfaceObject, object, msg, args...) +} + +// InDelta asserts that the two numerals are within delta of each other. +// +// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDelta(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlice is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlice(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) { + InDeltaSlice(a.t, expected, actual, delta, msgAndArgs...) +} + +// InDeltaSlicef is the same as InDelta, except it compares two slices. +func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaSlicef(a.t, expected, actual, delta, msg, args...) +} + +// InDeltaf asserts that the two numerals are within delta of each other. +// +// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) { + InDeltaf(a.t, expected, actual, delta, msg, args...) +} + +// InEpsilon asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilon(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilon(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlice is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlice(expected interface{}, actual interface{}, epsilon float64, msgAndArgs ...interface{}) { + InEpsilonSlice(a.t, expected, actual, epsilon, msgAndArgs...) +} + +// InEpsilonSlicef is the same as InEpsilon, except it compares each value from two slices. +func (a *Assertions) InEpsilonSlicef(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonSlicef(a.t, expected, actual, epsilon, msg, args...) +} + +// InEpsilonf asserts that expected and actual have a relative error less than epsilon +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilon float64, msg string, args ...interface{}) { + InEpsilonf(a.t, expected, actual, epsilon, msg, args...) +} + +// IsType asserts that the specified objects are of the same type. +func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) { + IsType(a.t, expectedType, object, msgAndArgs...) +} + +// IsTypef asserts that the specified objects are of the same type. +func (a *Assertions) IsTypef(expectedType interface{}, object interface{}, msg string, args ...interface{}) { + IsTypef(a.t, expectedType, object, msg, args...) +} + +// JSONEq asserts that two JSON strings are equivalent. +// +// a.JSONEq(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEq(expected string, actual string, msgAndArgs ...interface{}) { + JSONEq(a.t, expected, actual, msgAndArgs...) +} + +// JSONEqf asserts that two JSON strings are equivalent. +// +// a.JSONEqf(`{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) JSONEqf(expected string, actual string, msg string, args ...interface{}) { + JSONEqf(a.t, expected, actual, msg, args...) +} + +// Len asserts that the specified object has specific length. +// Len also fails if the object has a type that len() not accept. +// +// a.Len(mySlice, 3) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Len(object interface{}, length int, msgAndArgs ...interface{}) { + Len(a.t, object, length, msgAndArgs...) +} + +// Lenf asserts that the specified object has specific length. +// Lenf also fails if the object has a type that len() not accept. +// +// a.Lenf(mySlice, 3, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Lenf(object interface{}, length int, msg string, args ...interface{}) { + Lenf(a.t, object, length, msg, args...) +} + +// Nil asserts that the specified object is nil. +// +// a.Nil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nil(object interface{}, msgAndArgs ...interface{}) { + Nil(a.t, object, msgAndArgs...) +} + +// Nilf asserts that the specified object is nil. +// +// a.Nilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) { + Nilf(a.t, object, msg, args...) +} + +// NoError asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoError(err) { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoError(err error, msgAndArgs ...interface{}) { + NoError(a.t, err, msgAndArgs...) +} + +// NoErrorf asserts that a function returned no error (i.e. `nil`). +// +// actualObj, err := SomeFunction() +// if a.NoErrorf(err, "error message %s", "formatted") { +// assert.Equal(t, expectedObj, actualObj) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) { + NoErrorf(a.t, err, msg, args...) +} + +// NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContains("Hello World", "Earth") +// a.NotContains(["Hello", "World"], "Earth") +// a.NotContains({"Hello": "World"}, "Earth") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContains(s interface{}, contains interface{}, msgAndArgs ...interface{}) { + NotContains(a.t, s, contains, msgAndArgs...) +} + +// NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the +// specified substring or element. +// +// a.NotContainsf("Hello World", "Earth", "error message %s", "formatted") +// a.NotContainsf(["Hello", "World"], "Earth", "error message %s", "formatted") +// a.NotContainsf({"Hello": "World"}, "Earth", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotContainsf(s interface{}, contains interface{}, msg string, args ...interface{}) { + NotContainsf(a.t, s, contains, msg, args...) +} + +// NotEmpty asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmpty(obj) { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmpty(object interface{}, msgAndArgs ...interface{}) { + NotEmpty(a.t, object, msgAndArgs...) +} + +// NotEmptyf asserts that the specified object is NOT empty. I.e. not nil, "", false, 0 or either +// a slice or a channel with len == 0. +// +// if a.NotEmptyf(obj, "error message %s", "formatted") { +// assert.Equal(t, "two", obj[1]) +// } +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotEmptyf(object interface{}, msg string, args ...interface{}) { + NotEmptyf(a.t, object, msg, args...) +} + +// NotEqual asserts that the specified values are NOT equal. +// +// a.NotEqual(obj1, obj2) +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + NotEqual(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualf asserts that the specified values are NOT equal. +// +// a.NotEqualf(obj1, obj2, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +// +// Pointer variable equality is determined based on the equality of the +// referenced values (as opposed to the memory addresses). +func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + NotEqualf(a.t, expected, actual, msg, args...) +} + +// NotNil asserts that the specified object is not nil. +// +// a.NotNil(err) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNil(object interface{}, msgAndArgs ...interface{}) { + NotNil(a.t, object, msgAndArgs...) +} + +// NotNilf asserts that the specified object is not nil. +// +// a.NotNilf(err, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotNilf(object interface{}, msg string, args ...interface{}) { + NotNilf(a.t, object, msg, args...) +} + +// NotPanics asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanics(func(){ RemainCalm() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + NotPanics(a.t, f, msgAndArgs...) +} + +// NotPanicsf asserts that the code inside the specified PanicTestFunc does NOT panic. +// +// a.NotPanicsf(func(){ RemainCalm() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotPanicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + NotPanicsf(a.t, f, msg, args...) +} + +// NotRegexp asserts that a specified regexp does not match a string. +// +// a.NotRegexp(regexp.MustCompile("starts"), "it's starting") +// a.NotRegexp("^start", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + NotRegexp(a.t, rx, str, msgAndArgs...) +} + +// NotRegexpf asserts that a specified regexp does not match a string. +// +// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + NotRegexpf(a.t, rx, str, msg, args...) +} + +// NotSubset asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubset([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + NotSubset(a.t, list, subset, msgAndArgs...) +} + +// NotSubsetf asserts that the specified list(array, slice...) contains not all +// elements given in the specified subset(array, slice...). +// +// a.NotSubsetf([1, 3, 4], [1, 2], "But [1, 3, 4] does not contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) NotSubsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + NotSubsetf(a.t, list, subset, msg, args...) +} + +// NotZero asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZero(i interface{}, msgAndArgs ...interface{}) { + NotZero(a.t, i, msgAndArgs...) +} + +// NotZerof asserts that i is not the zero value for its type and returns the truth. +func (a *Assertions) NotZerof(i interface{}, msg string, args ...interface{}) { + NotZerof(a.t, i, msg, args...) +} + +// Panics asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panics(func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panics(f assert.PanicTestFunc, msgAndArgs ...interface{}) { + Panics(a.t, f, msgAndArgs...) +} + +// PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValue("crazy error", func(){ GoCrazy() }) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValue(expected interface{}, f assert.PanicTestFunc, msgAndArgs ...interface{}) { + PanicsWithValue(a.t, expected, f, msgAndArgs...) +} + +// PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that +// the recovered panic value equals the expected panic value. +// +// a.PanicsWithValuef("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) PanicsWithValuef(expected interface{}, f assert.PanicTestFunc, msg string, args ...interface{}) { + PanicsWithValuef(a.t, expected, f, msg, args...) +} + +// Panicsf asserts that the code inside the specified PanicTestFunc panics. +// +// a.Panicsf(func(){ GoCrazy() }, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Panicsf(f assert.PanicTestFunc, msg string, args ...interface{}) { + Panicsf(a.t, f, msg, args...) +} + +// Regexp asserts that a specified regexp matches a string. +// +// a.Regexp(regexp.MustCompile("start"), "it's starting") +// a.Regexp("start...$", "it's not starting") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...interface{}) { + Regexp(a.t, rx, str, msgAndArgs...) +} + +// Regexpf asserts that a specified regexp matches a string. +// +// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { + Regexpf(a.t, rx, str, msg, args...) +} + +// Subset asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subset([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subset(list interface{}, subset interface{}, msgAndArgs ...interface{}) { + Subset(a.t, list, subset, msgAndArgs...) +} + +// Subsetf asserts that the specified list(array, slice...) contains all +// elements given in the specified subset(array, slice...). +// +// a.Subsetf([1, 2, 3], [1, 2], "But [1, 2, 3] does contain [1, 2]", "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Subsetf(list interface{}, subset interface{}, msg string, args ...interface{}) { + Subsetf(a.t, list, subset, msg, args...) +} + +// True asserts that the specified value is true. +// +// a.True(myBool) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) True(value bool, msgAndArgs ...interface{}) { + True(a.t, value, msgAndArgs...) +} + +// Truef asserts that the specified value is true. +// +// a.Truef(myBool, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) Truef(value bool, msg string, args ...interface{}) { + Truef(a.t, value, msg, args...) +} + +// WithinDuration asserts that the two times are within duration delta of each other. +// +// a.WithinDuration(time.Now(), time.Now(), 10*time.Second) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDuration(expected time.Time, actual time.Time, delta time.Duration, msgAndArgs ...interface{}) { + WithinDuration(a.t, expected, actual, delta, msgAndArgs...) +} + +// WithinDurationf asserts that the two times are within duration delta of each other. +// +// a.WithinDurationf(time.Now(), time.Now(), 10*time.Second, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta time.Duration, msg string, args ...interface{}) { + WithinDurationf(a.t, expected, actual, delta, msg, args...) +} + +// Zero asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) { + Zero(a.t, i, msgAndArgs...) +} + +// Zerof asserts that i is the zero value for its type and returns the truth. +func (a *Assertions) Zerof(i interface{}, msg string, args ...interface{}) { + Zerof(a.t, i, msg, args...) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl new file mode 100755 index 0000000..b93569e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl @@ -0,0 +1,4 @@ +{{.CommentWithoutT "a"}} +func (a *Assertions) {{.DocInfo.Name}}({{.Params}}) { + {{.DocInfo.Name}}(a.t, {{.ForwardedParams}}) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/requirements.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/requirements.go new file mode 100755 index 0000000..e404f01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/stretchr/testify/require/requirements.go @@ -0,0 +1,9 @@ +package require + +// TestingT is an interface wrapper around *testing.T +type TestingT interface { + Errorf(format string, args ...interface{}) + FailNow() +} + +//go:generate go run ../_codegen/main.go -output-package=require -template=require.go.tmpl -include-format-funcs diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml new file mode 100755 index 0000000..adfd4e2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/.travis.yml @@ -0,0 +1,12 @@ +language: go + +go: + - 1.2 + - 1.3 + - 1.4 + - 1.5 + - tip + +script: + - go get -t ./... + - go test ./... diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md new file mode 100755 index 0000000..b9f7bf8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/CONTRIBUTING.md @@ -0,0 +1,11 @@ +# webbrowser contributing guide + +Any changes are welcomed! + +1. Be nice. +2. Don't be afraid to ask, but please try search first. + +## Looking for contact info? + +- Twitter: [@toqueteos](https://twitter.com/toqueteos) +- Mail: `toqueteos AT gmail DOT com` diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md new file mode 100755 index 0000000..4b7314c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/LICENSE.md @@ -0,0 +1,19 @@ +The MIT License (MIT) +Copyright (c) 2013-17 by Carlos Cobo and contributors. + +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/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/README.md new file mode 100755 index 0000000..d25c166 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/README.md @@ -0,0 +1,42 @@ +# webbrowser [![Build Status](https://travis-ci.org/toqueteos/webbrowser.png?branch=master)](https://travis-ci.org/toqueteos/webbrowser) [![GoDoc](http://godoc.org/github.com/toqueteos/webbrowser?status.png)](http://godoc.org/github.com/toqueteos/webbrowser) + +webbrowser provides a simple API for opening web pages on your default browser. It's inspired on [Python's webbrowser](http://docs.python.org/3/library/webbrowser.html) package but lacks some of its features (open new window). + +It just opens a webpage, most browsers will open it on a new tab. + +## Installation + +As simple as: `go get -u github.com/toqueteos/webbrowser` + +## Usage + +```go +package main + +import "github.com/toqueteos/webbrowser" + +func main() { + webbrowser.Open("http://golang.org") +} +``` + +That's it! + +## Already disliking it? + +No problem! There's alternative libraries that may be better to your needs: + +- https://github.com/pkg/browser, it does what webbrowser does and more! +- https://github.com/skratchdot/open-golang, it even provides a `xdg-open` implementation in case you don't have it! + +## Crossplatform support + +The package is guaranteed to work on `windows`, `linux` and `darwin`. It also has default support for `freebsd`, `openbsd` and `netbsd` but these three have not been tested yet (that I'm aware of). + +## License + +It is licensed under the MIT open source license, please see the [LICENSE.md] file for more information. + +## Thanks... + +Miki Tebeka wrote a nicer version that wasn't on godoc.org when I did this, [check it out!](https://bitbucket.org/tebeka/go-wise/src/d8db9bf5c4d1/desktop.go?at=default). diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go new file mode 100755 index 0000000..f4f19b6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/toqueteos/webbrowser/webbrowser.go @@ -0,0 +1,137 @@ +// Package webbrowser provides a simple API for opening web pages on your +// default browser. +package webbrowser + +import ( + "errors" + "fmt" + "net/url" + "os" + "os/exec" + "runtime" + "strings" +) + +var ( + ErrCantOpenBrowser = errors.New("webbrowser: can't open browser") + ErrNoCandidates = errors.New("webbrowser: no browser candidate found for your OS") +) + +// Candidates contains a list of registered `Browser`s that will be tried with Open. +var Candidates []Browser + +type Browser interface { + // Command returns a ready to be used Cmd that will open an URL. + Command(string) (*exec.Cmd, error) + // Open tries to open a URL in your default browser. NOTE: This may cause + // your program to hang until the browser process is closed in some OSes, + // see https://github.com/toqueteos/webbrowser/issues/4. + Open(string) error +} + +// Open tries to open a URL in your default browser ensuring you have a display +// set up and not running this from SSH. NOTE: This may cause your program to +// hang until the browser process is closed in some OSes, see +// https://github.com/toqueteos/webbrowser/issues/4. +func Open(s string) (err error) { + if len(Candidates) == 0 { + return ErrNoCandidates + } + + // Try to determine if there's a display available (only linux) and we + // aren't on a terminal (all but windows). + switch runtime.GOOS { + case "linux": + // No display, no need to open a browser. Lynx users **MAY** have + // something to say about this. + if os.Getenv("DISPLAY") == "" { + return fmt.Errorf("webbrowser: tried to open %q, no screen found", s) + } + fallthrough + case "darwin": + // Check SSH env vars. + if os.Getenv("SSH_CLIENT") != "" || os.Getenv("SSH_TTY") != "" { + return fmt.Errorf("webbrowser: tried to open %q, but you are running a shell session", s) + } + } + + // Try all candidates + for _, candidate := range Candidates { + err := candidate.Open(s) + if err == nil { + return nil + } + } + + return ErrCantOpenBrowser +} + +func init() { + // Register the default Browser for current OS, if it exists. + if os, ok := osCommand[runtime.GOOS]; ok { + Candidates = append(Candidates, browserCommand{os.cmd, os.args}) + } +} + +var ( + osCommand = map[string]*browserCommand{ + "android": &browserCommand{"xdg-open", nil}, + "darwin": &browserCommand{"open", nil}, + "freebsd": &browserCommand{"xdg-open", nil}, + "linux": &browserCommand{"xdg-open", nil}, + "netbsd": &browserCommand{"xdg-open", nil}, + "openbsd": &browserCommand{"xdg-open", nil}, // It may be open instead + "windows": &browserCommand{"cmd", []string{"/c", "start"}}, + } + winSchemes = [3]string{"https", "http", "file"} +) + +type browserCommand struct { + cmd string + args []string +} + +func (b browserCommand) Command(s string) (*exec.Cmd, error) { + u, err := url.Parse(s) + if err != nil { + return nil, err + } + + validUrl := ensureValidURL(u) + + b.args = append(b.args, validUrl) + + return exec.Command(b.cmd, b.args...), nil +} + +func (b browserCommand) Open(s string) error { + cmd, err := b.Command(s) + if err != nil { + return err + } + + return cmd.Run() +} + +func ensureScheme(u *url.URL) { + for _, s := range winSchemes { + if u.Scheme == s { + return + } + } + u.Scheme = "http" +} + +func ensureValidURL(u *url.URL) string { + // Enforce a scheme (windows requires scheme to be set to work properly). + ensureScheme(u) + s := u.String() + + // Escape characters not allowed by cmd/bash + switch runtime.GOOS { + case "windows": + s = strings.Replace(s, "&", `^&`, -1) + } + + return s +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.flake8 b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.flake8 new file mode 100755 index 0000000..6deafc2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 120 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.gitignore new file mode 100755 index 0000000..faf70c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.gitignore @@ -0,0 +1,2 @@ +*.coverprofile +node_modules/ diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.travis.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.travis.yml new file mode 100755 index 0000000..cf8d098 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/.travis.yml @@ -0,0 +1,27 @@ +language: go +sudo: false +dist: trusty +osx_image: xcode8.3 +go: 1.8.x + +os: +- linux +- osx + +cache: + directories: + - node_modules + +before_script: +- go get github.com/urfave/gfmrun/... || true +- go get golang.org/x/tools/cmd/goimports +- if [ ! -f node_modules/.bin/markdown-toc ] ; then + npm install markdown-toc ; + fi + +script: +- ./runtests gen +- ./runtests vet +- ./runtests test +- ./runtests gfmrun +- ./runtests toc diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md new file mode 100755 index 0000000..401eae5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/CHANGELOG.md @@ -0,0 +1,435 @@ +# Change Log + +**ATTN**: This project uses [semantic versioning](http://semver.org/). + +## [Unreleased] + +## 1.20.0 - 2017-08-10 + +### Fixed + +* `HandleExitCoder` is now correctly iterates over all errors in + a `MultiError`. The exit code is the exit code of the last error or `1` if + there are no `ExitCoder`s in the `MultiError`. +* Fixed YAML file loading on Windows (previously would fail validate the file path) +* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly + propogated +* `ErrWriter` is now passed downwards through command structure to avoid the + need to redefine it +* Pass `Command` context into `OnUsageError` rather than parent context so that + all fields are avaiable +* Errors occuring in `Before` funcs are no longer double printed +* Use `UsageText` in the help templates for commands and subcommands if + defined; otherwise build the usage as before (was previously ignoring this + field) +* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if + a program calls `Set` or `GlobalSet` directly after flag parsing (would + previously only return `true` if the flag was set during parsing) + +### Changed + +* No longer exit the program on command/subcommand error if the error raised is + not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was + determined to be a regression in functionality. See [the + PR](https://github.com/urfave/cli/pull/595) for discussion. + +### Added + +* `CommandsByName` type was added to make it easy to sort `Command`s by name, + alphabetically +* `altsrc` now handles loading of string and int arrays from TOML +* Support for definition of custom help templates for `App` via + `CustomAppHelpTemplate` +* Support for arbitrary key/value fields on `App` to be used with + `CustomAppHelpTemplate` via `ExtraInfo` +* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be + `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` + interface to be used. + + +## [1.19.1] - 2016-11-21 + +### Fixed + +- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as + the `Action` for a command would cause it to error rather than calling the + function. Should not have a affected declarative cases using `func(c + *cli.Context) err)`. +- Shell completion now handles the case where the user specifies + `--generate-bash-completion` immediately after a flag that takes an argument. + Previously it call the application with `--generate-bash-completion` as the + flag value. + +## [1.19.0] - 2016-11-19 +### Added +- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) +- A `Description` field was added to `App` for a more detailed description of + the application (similar to the existing `Description` field on `Command`) +- Flag type code generation via `go generate` +- Write to stderr and exit 1 if action returns non-nil error +- Added support for TOML to the `altsrc` loader +- `SkipArgReorder` was added to allow users to skip the argument reordering. + This is useful if you want to consider all "flags" after an argument as + arguments rather than flags (the default behavior of the stdlib `flag` + library). This is backported functionality from the [removal of the flag + reordering](https://github.com/urfave/cli/pull/398) in the unreleased version + 2 +- For formatted errors (those implementing `ErrorFormatter`), the errors will + be formatted during output. Compatible with `pkg/errors`. + +### Changed +- Raise minimum tested/supported Go version to 1.2+ + +### Fixed +- Consider empty environment variables as set (previously environment variables + with the equivalent of `""` would be skipped rather than their value used). +- Return an error if the value in a given environment variable cannot be parsed + as the flag type. Previously these errors were silently swallowed. +- Print full error when an invalid flag is specified (which includes the invalid flag) +- `App.Writer` defaults to `stdout` when `nil` +- If no action is specified on a command or app, the help is now printed instead of `panic`ing +- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) +- Correctly show help message if `-h` is provided to a subcommand +- `context.(Global)IsSet` now respects environment variables. Previously it + would return `false` if a flag was specified in the environment rather than + as an argument +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user +- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This + fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well + as `altsrc` where Go would complain that the types didn't match + +## [1.18.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) + +## [1.18.0] - 2016-06-27 +### Added +- `./runtests` test runner with coverage tracking by default +- testing on OS X +- testing on Windows +- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code + +### Changed +- Use spaces for alignment in help/usage output instead of tabs, making the + output alignment consistent regardless of tab width + +### Fixed +- Printing of command aliases in help text +- Printing of visible flags for both struct and struct pointer flags +- Display the `help` subcommand when using `CommandCategories` +- No longer swallows `panic`s that occur within the `Action`s themselves when + detecting the signature of the `Action` field + +## [1.17.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.17.0] - 2016-05-09 +### Added +- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` +- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` +- Support for hiding commands by setting `Hidden: true` -- this will hide the + commands in help output + +### Changed +- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer + quoted in help text output. +- All flag types now include `(default: {value})` strings following usage when a + default value can be (reasonably) detected. +- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent + with non-slice flag types +- Apps now exit with a code of 3 if an unknown subcommand is specified + (previously they printed "No help topic for...", but still exited 0. This + makes it easier to script around apps built using `cli` since they can trust + that a 0 exit code indicated a successful execution. +- cleanups based on [Go Report Card + feedback](https://goreportcard.com/report/github.com/urfave/cli) + +## [1.16.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.16.0] - 2016-05-02 +### Added +- `Hidden` field on all flag struct types to omit from generated help text + +### Changed +- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from +generated help text via the `Hidden` field + +### Fixed +- handling of error values in `HandleAction` and `HandleExitCoder` + +## [1.15.0] - 2016-04-30 +### Added +- This file! +- Support for placeholders in flag usage strings +- `App.Metadata` map for arbitrary data/state management +- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after +parsing. +- Support for nested lookup of dot-delimited keys in structures loaded from +YAML. + +### Changed +- The `App.Action` and `Command.Action` now prefer a return signature of +`func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil +`error` is returned, there may be two outcomes: + - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called + automatically + - Else the error is bubbled up and returned from `App.Run` +- Specifying an `Action` with the legacy return signature of +`func(*cli.Context)` will produce a deprecation message to stderr +- Specifying an `Action` that is not a `func` type will produce a non-zero exit +from `App.Run` +- Specifying an `Action` func that has an invalid (input) signature will +produce a non-zero exit from `App.Run` + +### Deprecated +- +`cli.App.RunAndExitOnError`, which should now be done by returning an error +that fulfills `cli.ExitCoder` to `cli.App.Run`. +- the legacy signature for +`cli.App.Action` of `func(*cli.Context)`, which should now have a return +signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. + +### Fixed +- Added missing `*cli.Context.GlobalFloat64` method + +## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) +### Added +- Codebeat badge +- Support for categorization via `CategorizedHelp` and `Categories` on app. + +### Changed +- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. + +### Fixed +- Ensure version is not shown in help text when `HideVersion` set. + +## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) +### Added +- YAML file input support. +- `NArg` method on context. + +## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) +### Added +- Custom usage error handling. +- Custom text support in `USAGE` section of help output. +- Improved help messages for empty strings. +- AppVeyor CI configuration. + +### Changed +- Removed `panic` from default help printer func. +- De-duping and optimizations. + +### Fixed +- Correctly handle `Before`/`After` at command level when no subcommands. +- Case of literal `-` argument causing flag reordering. +- Environment variable hints on Windows. +- Docs updates. + +## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) +### Changed +- Use `path.Base` in `Name` and `HelpName` +- Export `GetName` on flag types. + +### Fixed +- Flag parsing when skipping is enabled. +- Test output cleanup. +- Move completion check to account for empty input case. + +## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) +### Added +- Destination scan support for flags. +- Testing against `tip` in Travis CI config. + +### Changed +- Go version in Travis CI config. + +### Fixed +- Removed redundant tests. +- Use correct example naming in tests. + +## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) +### Fixed +- Remove unused var in bash completion. + +## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) +### Added +- Coverage and reference logos in README. + +### Fixed +- Use specified values in help and version parsing. +- Only display app version and help message once. + +## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) +### Added +- More tests for existing functionality. +- `ArgsUsage` at app and command level for help text flexibility. + +### Fixed +- Honor `HideHelp` and `HideVersion` in `App.Run`. +- Remove juvenile word from README. + +## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) +### Added +- `FullName` on command with accompanying help output update. +- Set default `$PROG` in bash completion. + +### Changed +- Docs formatting. + +### Fixed +- Removed self-referential imports in tests. + +## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) +### Added +- Support for `Copyright` at app level. +- `Parent` func at context level to walk up context lineage. + +### Fixed +- Global flag processing at top level. + +## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) +### Added +- Aggregate errors from `Before`/`After` funcs. +- Doc comments on flag structs. +- Include non-global flags when checking version and help. +- Travis CI config updates. + +### Fixed +- Ensure slice type flags have non-nil values. +- Collect global flags from the full command hierarchy. +- Docs prose. + +## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) +### Changed +- `HelpPrinter` signature includes output writer. + +### Fixed +- Specify go 1.1+ in docs. +- Set `Writer` when running command as app. + +## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) +### Added +- Multiple author support. +- `NumFlags` at context level. +- `Aliases` at command level. + +### Deprecated +- `ShortName` at command level. + +### Fixed +- Subcommand help output. +- Backward compatible support for deprecated `Author` and `Email` fields. +- Docs regarding `Names`/`Aliases`. + +## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) +### Added +- `After` hook func support at app and command level. + +### Fixed +- Use parsed context when running command as subcommand. +- Docs prose. + +## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) +### Added +- Support for hiding `-h / --help` flags, but not `help` subcommand. +- Stop flag parsing after `--`. + +### Fixed +- Help text for generic flags to specify single value. +- Use double quotes in output for defaults. +- Use `ParseInt` instead of `ParseUint` for int environment var values. +- Use `0` as base when parsing int environment var values. + +## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) +### Added +- Support for environment variable lookup "cascade". +- Support for `Stdout` on app for output redirection. + +### Fixed +- Print command help instead of app help in `ShowCommandHelp`. + +## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) +### Added +- Docs and example code updates. + +### Changed +- Default `-v / --version` flag made optional. + +## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) +### Added +- `FlagNames` at context level. +- Exposed `VersionPrinter` var for more control over version output. +- Zsh completion hook. +- `AUTHOR` section in default app help template. +- Contribution guidelines. +- `DurationFlag` type. + +## [1.2.0] - 2014-08-02 +### Added +- Support for environment variable defaults on flags plus tests. + +## [1.1.0] - 2014-07-15 +### Added +- Bash completion. +- Optional hiding of built-in help command. +- Optional skipping of flag parsing at command level. +- `Author`, `Email`, and `Compiled` metadata on app. +- `Before` hook func support at app and command level. +- `CommandNotFound` func support at app level. +- Command reference available on context. +- `GenericFlag` type. +- `Float64Flag` type. +- `BoolTFlag` type. +- `IsSet` flag helper on context. +- More flag lookup funcs at context level. +- More tests & docs. + +### Changed +- Help template updates to account for presence/absence of flags. +- Separated subcommand help template. +- Exposed `HelpPrinter` var for more control over help output. + +## [1.0.0] - 2013-11-01 +### Added +- `help` flag in default app flag set and each command flag set. +- Custom handling of argument parsing errors. +- Command lookup by name at app level. +- `StringSliceFlag` type and supporting `StringSlice` type. +- `IntSliceFlag` type and supporting `IntSlice` type. +- Slice type flag lookups by name at context level. +- Export of app and command help functions. +- More tests & docs. + +## 0.1.0 - 2013-07-22 +### Added +- Initial implementation. + +[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD +[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 +[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 +[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 +[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 +[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 +[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 +[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 +[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 +[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 +[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 +[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 +[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 +[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 +[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 +[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 +[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 +[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 +[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 +[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/LICENSE new file mode 100755 index 0000000..42a597e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Jeremy Saenz & Contributors + +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/skycoin/skycoin/vendor/github.com/urfave/cli/README.md b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/README.md new file mode 100755 index 0000000..2bbbd8e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/README.md @@ -0,0 +1,1381 @@ +cli +=== + +[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) +[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) +[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) +[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) +[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) +[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / +[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) + +**Notice:** This is the library formerly known as +`github.com/codegangsta/cli` -- Github will automatically redirect requests +to this repository, but we recommend updating your references for clarity. + +cli is a simple, fast, and fun package for building command line apps in Go. The +goal is to enable developers to write fast and distributable command line +applications in an expressive way. + + + +- [Overview](#overview) +- [Installation](#installation) + * [Supported platforms](#supported-platforms) + * [Using the `v2` branch](#using-the-v2-branch) + * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) +- [Getting Started](#getting-started) +- [Examples](#examples) + * [Arguments](#arguments) + * [Flags](#flags) + + [Placeholder Values](#placeholder-values) + + [Alternate Names](#alternate-names) + + [Ordering](#ordering) + + [Values from the Environment](#values-from-the-environment) + + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) + * [Subcommands](#subcommands) + * [Subcommands categories](#subcommands-categories) + * [Exit code](#exit-code) + * [Bash Completion](#bash-completion) + + [Enabling](#enabling) + + [Distribution](#distribution) + + [Customization](#customization) + * [Generated Help Text](#generated-help-text) + + [Customization](#customization-1) + * [Version Flag](#version-flag) + + [Customization](#customization-2) + + [Full API Example](#full-api-example) +- [Contribution Guidelines](#contribution-guidelines) + + + +## Overview + +Command line apps are usually so tiny that there is absolutely no reason why +your code should *not* be self-documenting. Things like generating help text and +parsing command flags/options should not hinder productivity when writing a +command line app. + +**This is where cli comes into play.** cli makes command line programming fun, +organized, and expressive! + +## Installation + +Make sure you have a working Go environment. Go version 1.2+ is supported. [See +the install instructions for Go](http://golang.org/doc/install.html). + +To install cli, simply run: +``` +$ go get github.com/urfave/cli +``` + +Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can +be easily used: +``` +export PATH=$PATH:$GOPATH/bin +``` + +### Supported platforms + +cli is tested against multiple versions of Go on Linux, and against the latest +released version of Go on OS X and Windows. For full details, see +[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). + +### Using the `v2` branch + +**Warning**: The `v2` branch is currently unreleased and considered unstable. + +There is currently a long-lived branch named `v2` that is intended to land as +the new `master` branch once development there has settled down. The current +`master` branch (mirrored as `v1`) is being manually merged into `v2` on +an irregular human-based schedule, but generally if one wants to "upgrade" to +`v2` *now* and accept the volatility (read: "awesomeness") that comes along with +that, please use whatever version pinning of your preference, such as via +`gopkg.in`: + +``` +$ go get gopkg.in/urfave/cli.v2 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v2" // imports as package "cli" +) +... +``` + +### Pinning to the `v1` releases + +Similarly to the section above describing use of the `v2` branch, if one wants +to avoid any unexpected compatibility pains once `v2` becomes `master`, then +pinning to `v1` is an acceptable option, e.g.: + +``` +$ go get gopkg.in/urfave/cli.v1 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v1" // imports as package "cli" +) +... +``` + +This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). + +## Getting Started + +One of the philosophies behind cli is that an API should be playful and full of +discovery. So a cli app can be as little as one line of code in `main()`. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.NewApp().Run(os.Args) +} +``` + +This app will run and show help text, but is not very useful. Let's give an +action to execute and some help documentation: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "boom" + app.Usage = "make an explosive entrance" + app.Action = func(c *cli.Context) error { + fmt.Println("boom! I say!") + return nil + } + + app.Run(os.Args) +} +``` + +Running this already gives you a ton of functionality, plus support for things +like subcommands and flags, which are covered below. + +## Examples + +Being a programmer can be a lonely job. Thankfully by the power of automation +that is not the case! Let's create a greeter app to fend off our demons of +loneliness! + +Start by creating a directory named `greet`, and within it, add a file, +`greet.go` with the following code in it: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "greet" + app.Usage = "fight the loneliness!" + app.Action = func(c *cli.Context) error { + fmt.Println("Hello friend!") + return nil + } + + app.Run(os.Args) +} +``` + +Install our command to the `$GOPATH/bin` directory: + +``` +$ go install +``` + +Finally run our new command: + +``` +$ greet +Hello friend! +``` + +cli also generates neat help text: + +``` +$ greet help +NAME: + greet - fight the loneliness! + +USAGE: + greet [global options] command [command options] [arguments...] + +VERSION: + 0.0.0 + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS + --version Shows version information +``` + +### Arguments + +You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Action = func(c *cli.Context) error { + fmt.Printf("Hello %q", c.Args().Get(0)) + return nil + } + + app.Run(os.Args) +} +``` + +### Flags + +Setting and querying flags is simple. + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + }, + } + + app.Action = func(c *cli.Context) error { + name := "Nefertiti" + if c.NArg() > 0 { + name = c.Args().Get(0) + } + if c.String("lang") == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + app.Run(os.Args) +} +``` + +You can also set a destination variable for a flag, to which the content will be +scanned. + + +``` go +package main + +import ( + "os" + "fmt" + + "github.com/urfave/cli" +) + +func main() { + var language string + + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + Destination: &language, + }, + } + + app.Action = func(c *cli.Context) error { + name := "someone" + if c.NArg() > 0 { + name = c.Args()[0] + } + if language == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + app.Run(os.Args) +} +``` + +See full list of flags at http://godoc.org/github.com/urfave/cli + +#### Placeholder Values + +Sometimes it's useful to specify a flag's value within the usage string itself. +Such placeholders are indicated with back quotes. + +For example this: + + +```go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + app.Run(os.Args) +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +``` + +Note that only the first placeholder is used. Subsequent back-quoted words will +be left as-is. + +#### Alternate Names + +You can set alternate (or short) names for flags by providing a comma-delimited +list for the `Name`. e.g. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + }, + } + + app.Run(os.Args) +} +``` + +That flag can then be set with `--lang spanish` or `-l spanish`. Note that +giving two different forms of the same flag in the same command invocation is an +error. + +#### Ordering + +Flags for the application and commands are shown in the order they are defined. +However, it's possible to sort them from outside this library by using `FlagsByName` +or `CommandsByName` with `sort`. + +For example this: + + +``` go +package main + +import ( + "os" + "sort" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "Language for the greeting", + }, + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + } + + sort.Sort(cli.FlagsByName(app.Flags)) + sort.Sort(cli.CommandsByName(app.Commands)) + + app.Run(os.Args) +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +--lang value, -l value Language for the greeting (default: "english") +``` + +#### Values from the Environment + +You can also have the default value set from the environment via `EnvVar`. e.g. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "APP_LANG", + }, + } + + app.Run(os.Args) +} +``` + +The `EnvVar` may also be given as a comma-delimited "cascade", where the first +environment variable that resolves is used as the default. + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", + }, + } + + app.Run(os.Args) +} +``` + +#### Values from alternate input sources (YAML, TOML, and others) + +There is a separate package altsrc that adds support for getting flag values +from other file input sources. + +Currently supported input source formats: +* YAML +* TOML + +In order to get values for a flag from an alternate input source the following +code would be added to wrap an existing cli.Flag like below: + +``` go + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) +``` + +Initialization must also occur for these flags. Below is an example initializing +getting data from a yaml file below. + +``` go + command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) +``` + +The code above will use the "load" string as a flag name to get the file name of +a yaml file from the cli.Context. It will then use that file name to initialize +the yaml input source for any flags that are defined on that command. As a note +the "load" flag used would also have to be defined on the command flags in order +for this code snipped to work. + +Currently only the aboved specified formats are supported but developers can +add support for other input sources by implementing the +altsrc.InputSourceContext for their given sources. + +Here is a more complete sample of a command using YAML support: + + +``` go +package notmain + +import ( + "fmt" + "os" + + "github.com/urfave/cli" + "github.com/urfave/cli/altsrc" +) + +func main() { + app := cli.NewApp() + + flags := []cli.Flag{ + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), + cli.StringFlag{Name: "load"}, + } + + app.Action = func(c *cli.Context) error { + fmt.Println("yaml ist rad") + return nil + } + + app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) + app.Flags = flags + + app.Run(os.Args) +} +``` + +### Subcommands + +Subcommands can be defined for a more git-like command line app. + + +```go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + fmt.Println("added task: ", c.Args().First()) + return nil + }, + }, + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + }, + { + Name: "template", + Aliases: []string{"t"}, + Usage: "options for task templates", + Subcommands: []cli.Command{ + { + Name: "add", + Usage: "add a new template", + Action: func(c *cli.Context) error { + fmt.Println("new task template: ", c.Args().First()) + return nil + }, + }, + { + Name: "remove", + Usage: "remove an existing template", + Action: func(c *cli.Context) error { + fmt.Println("removed task template: ", c.Args().First()) + return nil + }, + }, + }, + }, + } + + app.Run(os.Args) +} +``` + +### Subcommands categories + +For additional organization in apps that have many subcommands, you can +associate a category for each command to group them together in the help +output. + +E.g. + +```go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "noop", + }, + { + Name: "add", + Category: "template", + }, + { + Name: "remove", + Category: "template", + }, + } + + app.Run(os.Args) +} +``` + +Will include: + +``` +COMMANDS: + noop + + Template actions: + add + remove +``` + +### Exit code + +Calling `App.Run` will not automatically call `os.Exit`, which means that by +default the exit code will "fall through" to being `0`. An explicit exit code +may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a +`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{ + cli.BoolTFlag{ + Name: "ginger-crouton", + Usage: "is it in the soup?", + }, + } + app.Action = func(ctx *cli.Context) error { + if !ctx.Bool("ginger-crouton") { + return cli.NewExitError("it is not in the soup", 86) + } + return nil + } + + app.Run(os.Args) +} +``` + +### Bash Completion + +You can enable completion commands by setting the `EnableBashCompletion` +flag on the `App` object. By default, this setting will only auto-complete to +show an app's subcommands, but you can write your own completion methods for +the App or its subcommands. + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +func main() { + tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + BashComplete: func(c *cli.Context) { + // This will complete if no args are passed + if c.NArg() > 0 { + return + } + for _, t := range tasks { + fmt.Println(t) + } + }, + }, + } + + app.Run(os.Args) +} +``` + +#### Enabling + +Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while +setting the `PROG` variable to the name of your program: + +`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` + +#### Distribution + +Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename +it to the name of the program you wish to add autocomplete support for (or +automatically install it there if you are distributing a package). Don't forget +to source the file to make it active in the current shell. + +``` +sudo cp src/bash_autocomplete /etc/bash_completion.d/ +source /etc/bash_completion.d/ +``` + +Alternatively, you can just document that users should source the generic +`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set +to the name of their program (as above). + +#### Customization + +The default bash completion flag (`--generate-bash-completion`) is defined as +`cli.BashCompletionFlag`, and may be redefined if desired, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.BashCompletionFlag = cli.BoolFlag{ + Name: "compgen", + Hidden: true, + } + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "wat", + }, + } + app.Run(os.Args) +} +``` + +### Generated Help Text + +The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked +by the cli internals in order to print generated help text for the app, command, +or subcommand, and break execution. + +#### Customization + +All of the help text generation may be customized, and at multiple levels. The +templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and +`SubcommandHelpTemplate` which may be reassigned or augmented, and full override +is possible by assigning a compatible func to the `cli.HelpPrinter` variable, +e.g.: + + +``` go +package main + +import ( + "fmt" + "io" + "os" + + "github.com/urfave/cli" +) + +func main() { + // EXAMPLE: Append to an existing template + cli.AppHelpTemplate = fmt.Sprintf(`%s + +WEBSITE: http://awesometown.example.com + +SUPPORT: support@awesometown.example.com + +`, cli.AppHelpTemplate) + + // EXAMPLE: Override a template + cli.AppHelpTemplate = `NAME: + {{.Name}} - {{.Usage}} +USAGE: + {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} + {{if len .Authors}} +AUTHOR: + {{range .Authors}}{{ . }}{{end}} + {{end}}{{if .Commands}} +COMMANDS: +{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +GLOBAL OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}}{{if .Copyright }} +COPYRIGHT: + {{.Copyright}} + {{end}}{{if .Version}} +VERSION: + {{.Version}} + {{end}} +` + + // EXAMPLE: Replace the `HelpPrinter` func + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Println("Ha HA. I pwnd the help!!1") + } + + cli.NewApp().Run(os.Args) +} +``` + +The default flag may be customized to something other than `-h/--help` by +setting `cli.HelpFlag`, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.HelpFlag = cli.BoolFlag{ + Name: "halp, haaaaalp", + Usage: "HALP", + EnvVar: "SHOW_HALP,HALPPLZ", + } + + cli.NewApp().Run(os.Args) +} +``` + +### Version Flag + +The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which +is checked by the cli internals in order to print the `App.Version` via +`cli.VersionPrinter` and break execution. + +#### Customization + +The default flag may be customized to something other than `-v/--version` by +setting `cli.VersionFlag`, e.g.: + + +``` go +package main + +import ( + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.VersionFlag = cli.BoolFlag{ + Name: "print-version, V", + Usage: "print only the version", + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + app.Run(os.Args) +} +``` + +Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: + + +``` go +package main + +import ( + "fmt" + "os" + + "github.com/urfave/cli" +) + +var ( + Revision = "fafafaf" +) + +func main() { + cli.VersionPrinter = func(c *cli.Context) { + fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + app.Run(os.Args) +} +``` + +#### Full API Example + +**Notice**: This is a contrived (functioning) example meant strictly for API +demonstration purposes. Use of one's imagination is encouraged. + + +``` go +package main + +import ( + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "time" + + "github.com/urfave/cli" +) + +func init() { + cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" + cli.CommandHelpTemplate += "\nYMMV\n" + cli.SubcommandHelpTemplate += "\nor something\n" + + cli.HelpFlag = cli.BoolFlag{Name: "halp"} + cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} + cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} + + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Fprintf(w, "best of luck to you\n") + } + cli.VersionPrinter = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) + } + cli.OsExiter = func(c int) { + fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) + } + cli.ErrWriter = ioutil.Discard + cli.FlagStringer = func(fl cli.Flag) string { + return fmt.Sprintf("\t\t%s", fl.GetName()) + } +} + +type hexWriter struct{} + +func (w *hexWriter) Write(p []byte) (int, error) { + for _, b := range p { + fmt.Printf("%x", b) + } + fmt.Printf("\n") + + return len(p), nil +} + +type genericType struct{ + s string +} + +func (g *genericType) Set(value string) error { + g.s = value + return nil +} + +func (g *genericType) String() string { + return g.s +} + +func main() { + app := cli.NewApp() + app.Name = "kənˈtrīv" + app.Version = "19.99.0" + app.Compiled = time.Now() + app.Authors = []cli.Author{ + cli.Author{ + Name: "Example Human", + Email: "human@example.com", + }, + } + app.Copyright = "(c) 1999 Serious Enterprise" + app.HelpName = "contrive" + app.Usage = "demonstrate available API" + app.UsageText = "contrive - demonstrating the available API" + app.ArgsUsage = "[args and such]" + app.Commands = []cli.Command{ + cli.Command{ + Name: "doo", + Aliases: []string{"do"}, + Category: "motion", + Usage: "do the doo", + UsageText: "doo - does the dooing", + Description: "no really, there is a lot of dooing to be done", + ArgsUsage: "[arrgh]", + Flags: []cli.Flag{ + cli.BoolFlag{Name: "forever, forevvarr"}, + }, + Subcommands: cli.Commands{ + cli.Command{ + Name: "wop", + Action: wopAction, + }, + }, + SkipFlagParsing: false, + HideHelp: false, + Hidden: false, + HelpName: "doo!", + BashComplete: func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "--better\n") + }, + Before: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "brace for impact\n") + return nil + }, + After: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") + return nil + }, + Action: func(c *cli.Context) error { + c.Command.FullName() + c.Command.HasName("wop") + c.Command.Names() + c.Command.VisibleFlags() + fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") + if c.Bool("forever") { + c.Command.Run(c) + } + return nil + }, + OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(c.App.Writer, "for shame\n") + return err + }, + }, + } + app.Flags = []cli.Flag{ + cli.BoolFlag{Name: "fancy"}, + cli.BoolTFlag{Name: "fancier"}, + cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, + cli.Float64Flag{Name: "howmuch"}, + cli.GenericFlag{Name: "wat", Value: &genericType{}}, + cli.Int64Flag{Name: "longdistance"}, + cli.Int64SliceFlag{Name: "intervals"}, + cli.IntFlag{Name: "distance"}, + cli.IntSliceFlag{Name: "times"}, + cli.StringFlag{Name: "dance-move, d"}, + cli.StringSliceFlag{Name: "names, N"}, + cli.UintFlag{Name: "age"}, + cli.Uint64Flag{Name: "bigage"}, + } + app.EnableBashCompletion = true + app.HideHelp = false + app.HideVersion = false + app.BashComplete = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") + } + app.Before = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") + return nil + } + app.After = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "Phew!\n") + return nil + } + app.CommandNotFound = func(c *cli.Context, command string) { + fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) + } + app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { + if isSubcommand { + return err + } + + fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) + return nil + } + app.Action = func(c *cli.Context) error { + cli.DefaultAppComplete(c) + cli.HandleExitCoder(errors.New("not an exit coder, though")) + cli.ShowAppHelp(c) + cli.ShowCommandCompletions(c, "nope") + cli.ShowCommandHelp(c, "also-nope") + cli.ShowCompletions(c) + cli.ShowSubcommandHelp(c) + cli.ShowVersion(c) + + categories := c.App.Categories() + categories.AddCommand("sounds", cli.Command{ + Name: "bloop", + }) + + for _, category := range c.App.Categories() { + fmt.Fprintf(c.App.Writer, "%s\n", category.Name) + fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) + fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) + } + + fmt.Printf("%#v\n", c.App.Command("doo")) + if c.Bool("infinite") { + c.App.Run([]string{"app", "doo", "wop"}) + } + + if c.Bool("forevar") { + c.App.RunAsSubcommand(c) + } + c.App.Setup() + fmt.Printf("%#v\n", c.App.VisibleCategories()) + fmt.Printf("%#v\n", c.App.VisibleCommands()) + fmt.Printf("%#v\n", c.App.VisibleFlags()) + + fmt.Printf("%#v\n", c.Args().First()) + if len(c.Args()) > 0 { + fmt.Printf("%#v\n", c.Args()[1]) + } + fmt.Printf("%#v\n", c.Args().Present()) + fmt.Printf("%#v\n", c.Args().Tail()) + + set := flag.NewFlagSet("contrive", 0) + nc := cli.NewContext(c.App, set, c) + + fmt.Printf("%#v\n", nc.Args()) + fmt.Printf("%#v\n", nc.Bool("nope")) + fmt.Printf("%#v\n", nc.BoolT("nerp")) + fmt.Printf("%#v\n", nc.Duration("howlong")) + fmt.Printf("%#v\n", nc.Float64("hay")) + fmt.Printf("%#v\n", nc.Generic("bloop")) + fmt.Printf("%#v\n", nc.Int64("bonk")) + fmt.Printf("%#v\n", nc.Int64Slice("burnks")) + fmt.Printf("%#v\n", nc.Int("bips")) + fmt.Printf("%#v\n", nc.IntSlice("blups")) + fmt.Printf("%#v\n", nc.String("snurt")) + fmt.Printf("%#v\n", nc.StringSlice("snurkles")) + fmt.Printf("%#v\n", nc.Uint("flub")) + fmt.Printf("%#v\n", nc.Uint64("florb")) + fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) + fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) + fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) + fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) + fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) + fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) + fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) + fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) + fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) + + fmt.Printf("%#v\n", nc.FlagNames()) + fmt.Printf("%#v\n", nc.GlobalFlagNames()) + fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) + fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) + fmt.Printf("%#v\n", nc.NArg()) + fmt.Printf("%#v\n", nc.NumFlags()) + fmt.Printf("%#v\n", nc.Parent()) + + nc.Set("wat", "also-nope") + + ec := cli.NewExitError("ohwell", 86) + fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) + fmt.Printf("made it!\n") + return ec + } + + if os.Getenv("HEXY") != "" { + app.Writer = &hexWriter{} + app.ErrWriter = &hexWriter{} + } + + app.Metadata = map[string]interface{}{ + "layers": "many", + "explicable": false, + "whatever-values": 19.99, + } + + app.Run(os.Args) +} + +func wopAction(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") + return nil +} +``` + +## Contribution Guidelines + +Feel free to put up a pull request to fix a bug or maybe add a feature. I will +give it a code review and make sure that it does not break backwards +compatibility. If I or any other collaborators agree that it is in line with +the vision of the project, we will work with you to get the code into +a mergeable state and merge it into the master branch. + +If you have contributed something significant to the project, we will most +likely add you as a collaborator. As a collaborator you are given the ability +to merge others pull requests. It is very important that new code does not +break existing code, so be careful about what code you do choose to merge. + +If you feel like you have contributed to the project but have not yet been +added as a collaborator, we probably forgot to add you, please open an issue. diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/app.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/app.go new file mode 100755 index 0000000..51fc45d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/app.go @@ -0,0 +1,497 @@ +package cli + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "time" +) + +var ( + changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" + appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) + runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) + + contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." + + errInvalidActionType = NewExitError("ERROR invalid Action type. "+ + fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ + fmt.Sprintf("See %s", appActionDeprecationURL), 2) +) + +// App is the main structure of a cli application. It is recommended that +// an app be created with the cli.NewApp() function +type App struct { + // The name of the program. Defaults to path.Base(os.Args[0]) + Name string + // Full name of command for help, defaults to Name + HelpName string + // Description of the program. + Usage string + // Text to override the USAGE section of help + UsageText string + // Description of the program argument format. + ArgsUsage string + // Version of the program + Version string + // Description of the program + Description string + // List of commands to execute + Commands []Command + // List of flags to parse + Flags []Flag + // Boolean to enable bash completion commands + EnableBashCompletion bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide built-in version flag and the VERSION section of help + HideVersion bool + // Populate on app startup, only gettable through method Categories() + categories CommandCategories + // An action to execute when the bash-completion flag is set + BashComplete BashCompleteFunc + // An action to execute before any subcommands are run, but after the context is ready + // If a non-nil error is returned, no subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + + // The action to execute when no subcommands are specified + // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` + // *Note*: support for the deprecated `Action` signature will be removed in a future version + Action interface{} + + // Execute this function if the proper command cannot be found + CommandNotFound CommandNotFoundFunc + // Execute this function if an usage error occurs + OnUsageError OnUsageErrorFunc + // Compilation date + Compiled time.Time + // List of all authors who contributed + Authors []Author + // Copyright of the binary if any + Copyright string + // Name of Author (Note: Use App.Authors, this is deprecated) + Author string + // Email of Author (Note: Use App.Authors, this is deprecated) + Email string + // Writer writer to write output to + Writer io.Writer + // ErrWriter writes error output + ErrWriter io.Writer + // Other custom info + Metadata map[string]interface{} + // Carries a function which returns app specific info. + ExtraInfo func() map[string]string + // CustomAppHelpTemplate the text template for app help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomAppHelpTemplate string + + didSetup bool +} + +// Tries to find out when this binary was compiled. +// Returns the current time if it fails to find it. +func compileTime() time.Time { + info, err := os.Stat(os.Args[0]) + if err != nil { + return time.Now() + } + return info.ModTime() +} + +// NewApp creates a new cli Application with some reasonable defaults for Name, +// Usage, Version and Action. +func NewApp() *App { + return &App{ + Name: filepath.Base(os.Args[0]), + HelpName: filepath.Base(os.Args[0]), + Usage: "A new cli application", + UsageText: "", + Version: "0.0.0", + BashComplete: DefaultAppComplete, + Action: helpCommand.Action, + Compiled: compileTime(), + Writer: os.Stdout, + } +} + +// Setup runs initialization code to ensure all data structures are ready for +// `Run` or inspection prior to `Run`. It is internally called by `Run`, but +// will return early if setup has already happened. +func (a *App) Setup() { + if a.didSetup { + return + } + + a.didSetup = true + + if a.Author != "" || a.Email != "" { + a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + + if !a.HideVersion { + a.appendFlag(VersionFlag) + } + + a.categories = CommandCategories{} + for _, command := range a.Commands { + a.categories = a.categories.AddCommand(command.Category, command) + } + sort.Sort(a.categories) + + if a.Metadata == nil { + a.Metadata = make(map[string]interface{}) + } + + if a.Writer == nil { + a.Writer = os.Stdout + } +} + +// Run is the entry point to the cli app. Parses the arguments slice and routes +// to the proper flag/args combination +func (a *App) Run(arguments []string) (err error) { + a.Setup() + + // handle the completion flag separately from the flagset since + // completion could be attempted after a flag, but before its value was put + // on the command line. this causes the flagset to interpret the completion + // flag name as the value of the flag before it which is undesirable + // note that we can only do this because the shell autocomplete function + // always appends the completion flag at the end of the command + shellComplete, arguments := checkShellCompleteFlag(a, arguments) + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(arguments[1:]) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, nil) + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + ShowAppHelp(context) + return nerr + } + context.shellComplete = shellComplete + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err := a.OnUsageError(context, err, false) + HandleExitCoder(err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowAppHelp(context) + return err + } + + if !a.HideHelp && checkHelp(context) { + ShowAppHelp(context) + return nil + } + + if !a.HideVersion && checkVersion(context) { + ShowVersion(context) + return nil + } + + if a.After != nil { + defer func() { + if afterErr := a.After(context); afterErr != nil { + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + ShowAppHelp(context) + HandleExitCoder(beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + if a.Action == nil { + a.Action = helpCommand.Action + } + + // Run default Action + err = HandleAction(a.Action, context) + + HandleExitCoder(err) + return err +} + +// RunAndExitOnError calls .Run() and exits non-zero if an error was returned +// +// Deprecated: instead you should return an error that fulfills cli.ExitCoder +// to cli.App.Run. This will cause the application to exit with the given eror +// code in the cli.ExitCoder +func (a *App) RunAndExitOnError() { + if err := a.Run(os.Args); err != nil { + fmt.Fprintln(a.errWriter(), err) + OsExiter(1) + } +} + +// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to +// generate command-specific flags +func (a *App) RunAsSubcommand(ctx *Context) (err error) { + // append help to commands + if len(a.Commands) > 0 { + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(ctx.Args().Tail()) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, ctx) + + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + fmt.Fprintln(a.Writer) + if len(a.Commands) > 0 { + ShowSubcommandHelp(context) + } else { + ShowCommandHelp(ctx, context.Args().First()) + } + return nerr + } + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err = a.OnUsageError(context, err, true) + HandleExitCoder(err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowSubcommandHelp(context) + return err + } + + if len(a.Commands) > 0 { + if checkSubcommandHelp(context) { + return nil + } + } else { + if checkCommandHelp(ctx, context.Args().First()) { + return nil + } + } + + if a.After != nil { + defer func() { + afterErr := a.After(context) + if afterErr != nil { + HandleExitCoder(err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + HandleExitCoder(beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + // Run default Action + err = HandleAction(a.Action, context) + + HandleExitCoder(err) + return err +} + +// Command returns the named command on App. Returns nil if the command does not exist +func (a *App) Command(name string) *Command { + for _, c := range a.Commands { + if c.HasName(name) { + return &c + } + } + + return nil +} + +// Categories returns a slice containing all the categories with the commands they contain +func (a *App) Categories() CommandCategories { + return a.categories +} + +// VisibleCategories returns a slice of categories and commands that are +// Hidden=false +func (a *App) VisibleCategories() []*CommandCategory { + ret := []*CommandCategory{} + for _, category := range a.categories { + if visible := func() *CommandCategory { + for _, command := range category.Commands { + if !command.Hidden { + return category + } + } + return nil + }(); visible != nil { + ret = append(ret, visible) + } + } + return ret +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (a *App) VisibleCommands() []Command { + ret := []Command{} + for _, command := range a.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (a *App) VisibleFlags() []Flag { + return visibleFlags(a.Flags) +} + +func (a *App) hasFlag(flag Flag) bool { + for _, f := range a.Flags { + if flag == f { + return true + } + } + + return false +} + +func (a *App) errWriter() io.Writer { + + // When the app ErrWriter is nil use the package level one. + if a.ErrWriter == nil { + return ErrWriter + } + + return a.ErrWriter +} + +func (a *App) appendFlag(flag Flag) { + if !a.hasFlag(flag) { + a.Flags = append(a.Flags, flag) + } +} + +// Author represents someone who has contributed to a cli project. +type Author struct { + Name string // The Authors name + Email string // The Authors email +} + +// String makes Author comply to the Stringer interface, to allow an easy print in the templating process +func (a Author) String() string { + e := "" + if a.Email != "" { + e = " <" + a.Email + ">" + } + + return fmt.Sprintf("%v%v", a.Name, e) +} + +// HandleAction attempts to figure out which Action signature was used. If +// it's an ActionFunc or a func with the legacy signature for Action, the func +// is run! +func HandleAction(action interface{}, context *Context) (err error) { + if a, ok := action.(ActionFunc); ok { + return a(context) + } else if a, ok := action.(func(*Context) error); ok { + return a(context) + } else if a, ok := action.(func(*Context)); ok { // deprecated function signature + a(context) + return nil + } else { + return errInvalidActionType + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/appveyor.yml b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/appveyor.yml new file mode 100755 index 0000000..1e1489c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/appveyor.yml @@ -0,0 +1,26 @@ +version: "{build}" + +os: Windows Server 2016 + +image: Visual Studio 2017 + +clone_folder: c:\gopath\src\github.com\urfave\cli + +environment: + GOPATH: C:\gopath + GOVERSION: 1.8.x + PYTHON: C:\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + +install: +- set PATH=%GOPATH%\bin;C:\go\bin;%PATH% +- go version +- go env +- go get github.com/urfave/gfmrun/... +- go get -v -t ./... + +build_script: +- python runtests vet +- python runtests test +- python runtests gfmrun diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/category.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/category.go new file mode 100755 index 0000000..1a60550 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/category.go @@ -0,0 +1,44 @@ +package cli + +// CommandCategories is a slice of *CommandCategory. +type CommandCategories []*CommandCategory + +// CommandCategory is a category containing commands. +type CommandCategory struct { + Name string + Commands Commands +} + +func (c CommandCategories) Less(i, j int) bool { + return c[i].Name < c[j].Name +} + +func (c CommandCategories) Len() int { + return len(c) +} + +func (c CommandCategories) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// AddCommand adds a command to a category. +func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { + for _, commandCategory := range c { + if commandCategory.Name == category { + commandCategory.Commands = append(commandCategory.Commands, command) + return c + } + } + return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (c *CommandCategory) VisibleCommands() []Command { + ret := []Command{} + for _, command := range c.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/cli.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/cli.go new file mode 100755 index 0000000..90c07eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/cli.go @@ -0,0 +1,22 @@ +// Package cli provides a minimal framework for creating and organizing command line +// Go applications. cli is designed to be easy to understand and write, the most simple +// cli application can be written as follows: +// func main() { +// cli.NewApp().Run(os.Args) +// } +// +// Of course this application does not do much, so let's make this an actual application: +// func main() { +// app := cli.NewApp() +// app.Name = "greet" +// app.Usage = "say a greeting" +// app.Action = func(c *cli.Context) error { +// println("Greetings") +// return nil +// } +// +// app.Run(os.Args) +// } +package cli + +//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/command.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/command.go new file mode 100755 index 0000000..23de294 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/command.go @@ -0,0 +1,304 @@ +package cli + +import ( + "fmt" + "io/ioutil" + "sort" + "strings" +) + +// Command is a subcommand for a cli.App. +type Command struct { + // The name of the command + Name string + // short name of the command. Typically one character (deprecated, use `Aliases`) + ShortName string + // A list of aliases for the command + Aliases []string + // A short description of the usage of this command + Usage string + // Custom text to show on USAGE section of help + UsageText string + // A longer explanation of how the command works + Description string + // A short description of the arguments of this command + ArgsUsage string + // The category the command is part of + Category string + // The function to call when checking for bash command completions + BashComplete BashCompleteFunc + // An action to execute before any sub-subcommands are run, but after the context is ready + // If a non-nil error is returned, no sub-subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + // The function to call when this command is invoked + Action interface{} + // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind + // of deprecation period has passed, maybe? + + // Execute this function if a usage error occurs. + OnUsageError OnUsageErrorFunc + // List of child commands + Subcommands Commands + // List of flags to parse + Flags []Flag + // Treat all flags as normal arguments if true + SkipFlagParsing bool + // Skip argument reordering which attempts to move flags before arguments, + // but only works if all flags appear after all arguments. This behavior was + // removed n version 2 since it only works under specific conditions so we + // backport here by exposing it as an option for compatibility. + SkipArgReorder bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide this command from help or completion + Hidden bool + + // Full name of command for help, defaults to full command name, including parent commands. + HelpName string + commandNamePath []string + + // CustomHelpTemplate the text template for the command help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomHelpTemplate string +} + +type CommandsByName []Command + +func (c CommandsByName) Len() int { + return len(c) +} + +func (c CommandsByName) Less(i, j int) bool { + return c[i].Name < c[j].Name +} + +func (c CommandsByName) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// FullName returns the full name of the command. +// For subcommands this ensures that parent commands are part of the command path +func (c Command) FullName() string { + if c.commandNamePath == nil { + return c.Name + } + return strings.Join(c.commandNamePath, " ") +} + +// Commands is a slice of Command +type Commands []Command + +// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags +func (c Command) Run(ctx *Context) (err error) { + if len(c.Subcommands) > 0 { + return c.startApp(ctx) + } + + if !c.HideHelp && (HelpFlag != BoolFlag{}) { + // append help to flags + c.Flags = append( + c.Flags, + HelpFlag, + ) + } + + set, err := flagSet(c.Name, c.Flags) + if err != nil { + return err + } + set.SetOutput(ioutil.Discard) + + if c.SkipFlagParsing { + err = set.Parse(append([]string{"--"}, ctx.Args().Tail()...)) + } else if !c.SkipArgReorder { + firstFlagIndex := -1 + terminatorIndex := -1 + for index, arg := range ctx.Args() { + if arg == "--" { + terminatorIndex = index + break + } else if arg == "-" { + // Do nothing. A dash alone is not really a flag. + continue + } else if strings.HasPrefix(arg, "-") && firstFlagIndex == -1 { + firstFlagIndex = index + } + } + + if firstFlagIndex > -1 { + args := ctx.Args() + regularArgs := make([]string, len(args[1:firstFlagIndex])) + copy(regularArgs, args[1:firstFlagIndex]) + + var flagArgs []string + if terminatorIndex > -1 { + flagArgs = args[firstFlagIndex:terminatorIndex] + regularArgs = append(regularArgs, args[terminatorIndex:]...) + } else { + flagArgs = args[firstFlagIndex:] + } + + err = set.Parse(append(flagArgs, regularArgs...)) + } else { + err = set.Parse(ctx.Args().Tail()) + } + } else { + err = set.Parse(ctx.Args().Tail()) + } + + nerr := normalizeFlags(c.Flags, set) + if nerr != nil { + fmt.Fprintln(ctx.App.Writer, nerr) + fmt.Fprintln(ctx.App.Writer) + ShowCommandHelp(ctx, c.Name) + return nerr + } + + context := NewContext(ctx.App, set, ctx) + context.Command = c + if checkCommandCompletions(context, c.Name) { + return nil + } + + if err != nil { + if c.OnUsageError != nil { + err := c.OnUsageError(context, err, false) + HandleExitCoder(err) + return err + } + fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) + fmt.Fprintln(context.App.Writer) + ShowCommandHelp(context, c.Name) + return err + } + + if checkCommandHelp(context, c.Name) { + return nil + } + + if c.After != nil { + defer func() { + afterErr := c.After(context) + if afterErr != nil { + HandleExitCoder(err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if c.Before != nil { + err = c.Before(context) + if err != nil { + ShowCommandHelp(context, c.Name) + HandleExitCoder(err) + return err + } + } + + if c.Action == nil { + c.Action = helpSubcommand.Action + } + + err = HandleAction(c.Action, context) + + if err != nil { + HandleExitCoder(err) + } + return err +} + +// Names returns the names including short names and aliases. +func (c Command) Names() []string { + names := []string{c.Name} + + if c.ShortName != "" { + names = append(names, c.ShortName) + } + + return append(names, c.Aliases...) +} + +// HasName returns true if Command.Name or Command.ShortName matches given name +func (c Command) HasName(name string) bool { + for _, n := range c.Names() { + if n == name { + return true + } + } + return false +} + +func (c Command) startApp(ctx *Context) error { + app := NewApp() + app.Metadata = ctx.App.Metadata + // set the name and usage + app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) + if c.HelpName == "" { + app.HelpName = c.HelpName + } else { + app.HelpName = app.Name + } + + app.Usage = c.Usage + app.Description = c.Description + app.ArgsUsage = c.ArgsUsage + + // set CommandNotFound + app.CommandNotFound = ctx.App.CommandNotFound + app.CustomAppHelpTemplate = c.CustomHelpTemplate + + // set the flags and commands + app.Commands = c.Subcommands + app.Flags = c.Flags + app.HideHelp = c.HideHelp + + app.Version = ctx.App.Version + app.HideVersion = ctx.App.HideVersion + app.Compiled = ctx.App.Compiled + app.Author = ctx.App.Author + app.Email = ctx.App.Email + app.Writer = ctx.App.Writer + app.ErrWriter = ctx.App.ErrWriter + + app.categories = CommandCategories{} + for _, command := range c.Subcommands { + app.categories = app.categories.AddCommand(command.Category, command) + } + + sort.Sort(app.categories) + + // bash completion + app.EnableBashCompletion = ctx.App.EnableBashCompletion + if c.BashComplete != nil { + app.BashComplete = c.BashComplete + } + + // set the actions + app.Before = c.Before + app.After = c.After + if c.Action != nil { + app.Action = c.Action + } else { + app.Action = helpSubcommand.Action + } + app.OnUsageError = c.OnUsageError + + for index, cc := range app.Commands { + app.Commands[index].commandNamePath = []string{c.Name, cc.Name} + } + + return app.RunAsSubcommand(ctx) +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (c Command) VisibleFlags() []Flag { + return visibleFlags(c.Flags) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/context.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/context.go new file mode 100755 index 0000000..db94191 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/context.go @@ -0,0 +1,278 @@ +package cli + +import ( + "errors" + "flag" + "reflect" + "strings" + "syscall" +) + +// Context is a type that is passed through to +// each Handler action in a cli application. Context +// can be used to retrieve context-specific Args and +// parsed command-line options. +type Context struct { + App *App + Command Command + shellComplete bool + flagSet *flag.FlagSet + setFlags map[string]bool + parentContext *Context +} + +// NewContext creates a new context. For use in when invoking an App or Command action. +func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { + c := &Context{App: app, flagSet: set, parentContext: parentCtx} + + if parentCtx != nil { + c.shellComplete = parentCtx.shellComplete + } + + return c +} + +// NumFlags returns the number of flags set +func (c *Context) NumFlags() int { + return c.flagSet.NFlag() +} + +// Set sets a context flag to a value. +func (c *Context) Set(name, value string) error { + c.setFlags = nil + return c.flagSet.Set(name, value) +} + +// GlobalSet sets a context flag to a value on the global flagset +func (c *Context) GlobalSet(name, value string) error { + globalContext(c).setFlags = nil + return globalContext(c).flagSet.Set(name, value) +} + +// IsSet determines if the flag was actually set +func (c *Context) IsSet(name string) bool { + if c.setFlags == nil { + c.setFlags = make(map[string]bool) + + c.flagSet.Visit(func(f *flag.Flag) { + c.setFlags[f.Name] = true + }) + + c.flagSet.VisitAll(func(f *flag.Flag) { + if _, ok := c.setFlags[f.Name]; ok { + return + } + c.setFlags[f.Name] = false + }) + + // XXX hack to support IsSet for flags with EnvVar + // + // There isn't an easy way to do this with the current implementation since + // whether a flag was set via an environment variable is very difficult to + // determine here. Instead, we intend to introduce a backwards incompatible + // change in version 2 to add `IsSet` to the Flag interface to push the + // responsibility closer to where the information required to determine + // whether a flag is set by non-standard means such as environment + // variables is avaliable. + // + // See https://github.com/urfave/cli/issues/294 for additional discussion + flags := c.Command.Flags + if c.Command.Name == "" { // cannot == Command{} since it contains slice types + if c.App != nil { + flags = c.App.Flags + } + } + for _, f := range flags { + eachName(f.GetName(), func(name string) { + if isSet, ok := c.setFlags[name]; isSet || !ok { + return + } + + val := reflect.ValueOf(f) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + + envVarValue := val.FieldByName("EnvVar") + if !envVarValue.IsValid() { + return + } + + eachName(envVarValue.String(), func(envVar string) { + envVar = strings.TrimSpace(envVar) + if _, ok := syscall.Getenv(envVar); ok { + c.setFlags[name] = true + return + } + }) + }) + } + } + + return c.setFlags[name] +} + +// GlobalIsSet determines if the global flag was actually set +func (c *Context) GlobalIsSet(name string) bool { + ctx := c + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + + for ; ctx != nil; ctx = ctx.parentContext { + if ctx.IsSet(name) { + return true + } + } + return false +} + +// FlagNames returns a slice of flag names used in this context. +func (c *Context) FlagNames() (names []string) { + for _, flag := range c.Command.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" { + continue + } + names = append(names, name) + } + return +} + +// GlobalFlagNames returns a slice of global flag names used by the app. +func (c *Context) GlobalFlagNames() (names []string) { + for _, flag := range c.App.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" || name == "version" { + continue + } + names = append(names, name) + } + return +} + +// Parent returns the parent context, if any +func (c *Context) Parent() *Context { + return c.parentContext +} + +// value returns the value of the flag coressponding to `name` +func (c *Context) value(name string) interface{} { + return c.flagSet.Lookup(name).Value.(flag.Getter).Get() +} + +// Args contains apps console arguments +type Args []string + +// Args returns the command line arguments associated with the context. +func (c *Context) Args() Args { + args := Args(c.flagSet.Args()) + return args +} + +// NArg returns the number of the command line arguments. +func (c *Context) NArg() int { + return len(c.Args()) +} + +// Get returns the nth argument, or else a blank string +func (a Args) Get(n int) string { + if len(a) > n { + return a[n] + } + return "" +} + +// First returns the first argument, or else a blank string +func (a Args) First() string { + return a.Get(0) +} + +// Tail returns the rest of the arguments (not the first one) +// or else an empty string slice +func (a Args) Tail() []string { + if len(a) >= 2 { + return []string(a)[1:] + } + return []string{} +} + +// Present checks if there are any arguments present +func (a Args) Present() bool { + return len(a) != 0 +} + +// Swap swaps arguments at the given indexes +func (a Args) Swap(from, to int) error { + if from >= len(a) || to >= len(a) { + return errors.New("index out of range") + } + a[from], a[to] = a[to], a[from] + return nil +} + +func globalContext(ctx *Context) *Context { + if ctx == nil { + return nil + } + + for { + if ctx.parentContext == nil { + return ctx + } + ctx = ctx.parentContext + } +} + +func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + for ; ctx != nil; ctx = ctx.parentContext { + if f := ctx.flagSet.Lookup(name); f != nil { + return ctx.flagSet + } + } + return nil +} + +func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { + switch ff.Value.(type) { + case *StringSlice: + default: + set.Set(name, ff.Value.String()) + } +} + +func normalizeFlags(flags []Flag, set *flag.FlagSet) error { + visited := make(map[string]bool) + set.Visit(func(f *flag.Flag) { + visited[f.Name] = true + }) + for _, f := range flags { + parts := strings.Split(f.GetName(), ",") + if len(parts) == 1 { + continue + } + var ff *flag.Flag + for _, name := range parts { + name = strings.Trim(name, " ") + if visited[name] { + if ff != nil { + return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) + } + ff = set.Lookup(name) + } + } + if ff == nil { + continue + } + for _, name := range parts { + name = strings.Trim(name, " ") + if !visited[name] { + copyFlag(name, ff, set) + } + } + } + return nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/errors.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/errors.go new file mode 100755 index 0000000..562b295 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/errors.go @@ -0,0 +1,115 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" +) + +// OsExiter is the function used when the app exits. If not set defaults to os.Exit. +var OsExiter = os.Exit + +// ErrWriter is used to write errors to the user. This can be anything +// implementing the io.Writer interface and defaults to os.Stderr. +var ErrWriter io.Writer = os.Stderr + +// MultiError is an error that wraps multiple errors. +type MultiError struct { + Errors []error +} + +// NewMultiError creates a new MultiError. Pass in one or more errors. +func NewMultiError(err ...error) MultiError { + return MultiError{Errors: err} +} + +// Error implements the error interface. +func (m MultiError) Error() string { + errs := make([]string, len(m.Errors)) + for i, err := range m.Errors { + errs[i] = err.Error() + } + + return strings.Join(errs, "\n") +} + +type ErrorFormatter interface { + Format(s fmt.State, verb rune) +} + +// ExitCoder is the interface checked by `App` and `Command` for a custom exit +// code +type ExitCoder interface { + error + ExitCode() int +} + +// ExitError fulfills both the builtin `error` interface and `ExitCoder` +type ExitError struct { + exitCode int + message interface{} +} + +// NewExitError makes a new *ExitError +func NewExitError(message interface{}, exitCode int) *ExitError { + return &ExitError{ + exitCode: exitCode, + message: message, + } +} + +// Error returns the string message, fulfilling the interface required by +// `error` +func (ee *ExitError) Error() string { + return fmt.Sprintf("%v", ee.message) +} + +// ExitCode returns the exit code, fulfilling the interface required by +// `ExitCoder` +func (ee *ExitError) ExitCode() int { + return ee.exitCode +} + +// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if +// so prints the error to stderr (if it is non-empty) and calls OsExiter with the +// given exit code. If the given error is a MultiError, then this func is +// called on all members of the Errors slice and calls OsExiter with the last exit code. +func HandleExitCoder(err error) { + if err == nil { + return + } + + if exitErr, ok := err.(ExitCoder); ok { + if err.Error() != "" { + if _, ok := exitErr.(ErrorFormatter); ok { + fmt.Fprintf(ErrWriter, "%+v\n", err) + } else { + fmt.Fprintln(ErrWriter, err) + } + } + OsExiter(exitErr.ExitCode()) + return + } + + if multiErr, ok := err.(MultiError); ok { + code := handleMultiError(multiErr) + OsExiter(code) + return + } +} + +func handleMultiError(multiErr MultiError) int { + code := 1 + for _, merr := range multiErr.Errors { + if multiErr2, ok := merr.(MultiError); ok { + code = handleMultiError(multiErr2) + } else { + fmt.Fprintln(ErrWriter, merr) + if exitErr, ok := merr.(ExitCoder); ok { + code = exitErr.ExitCode() + } + } + } + return code +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag-types.json b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag-types.json new file mode 100755 index 0000000..1223107 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag-types.json @@ -0,0 +1,93 @@ +[ + { + "name": "Bool", + "type": "bool", + "value": false, + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "BoolT", + "type": "bool", + "value": false, + "doctail": " that is true by default", + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "Duration", + "type": "time.Duration", + "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", + "context_default": "0", + "parser": "time.ParseDuration(f.Value.String())" + }, + { + "name": "Float64", + "type": "float64", + "context_default": "0", + "parser": "strconv.ParseFloat(f.Value.String(), 64)" + }, + { + "name": "Generic", + "type": "Generic", + "dest": false, + "context_default": "nil", + "context_type": "interface{}" + }, + { + "name": "Int64", + "type": "int64", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" + }, + { + "name": "Int", + "type": "int", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", + "parser_cast": "int(parsed)" + }, + { + "name": "IntSlice", + "type": "*IntSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]int", + "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" + }, + { + "name": "Int64Slice", + "type": "*Int64Slice", + "dest": false, + "context_default": "nil", + "context_type": "[]int64", + "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" + }, + { + "name": "String", + "type": "string", + "context_default": "\"\"", + "parser": "f.Value.String(), error(nil)" + }, + { + "name": "StringSlice", + "type": "*StringSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]string", + "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" + }, + { + "name": "Uint64", + "type": "uint64", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" + }, + { + "name": "Uint", + "type": "uint", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", + "parser_cast": "uint(parsed)" + } +] diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag.go new file mode 100755 index 0000000..877ff35 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag.go @@ -0,0 +1,799 @@ +package cli + +import ( + "flag" + "fmt" + "reflect" + "runtime" + "strconv" + "strings" + "syscall" + "time" +) + +const defaultPlaceholder = "value" + +// BashCompletionFlag enables bash-completion for all commands and subcommands +var BashCompletionFlag Flag = BoolFlag{ + Name: "generate-bash-completion", + Hidden: true, +} + +// VersionFlag prints the version for the application +var VersionFlag Flag = BoolFlag{ + Name: "version, v", + Usage: "print the version", +} + +// HelpFlag prints the help for all commands and subcommands +// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand +// unless HideHelp is set to true) +var HelpFlag Flag = BoolFlag{ + Name: "help, h", + Usage: "show help", +} + +// FlagStringer converts a flag definition to a string. This is used by help +// to display a flag. +var FlagStringer FlagStringFunc = stringifyFlag + +// FlagsByName is a slice of Flag. +type FlagsByName []Flag + +func (f FlagsByName) Len() int { + return len(f) +} + +func (f FlagsByName) Less(i, j int) bool { + return f[i].GetName() < f[j].GetName() +} + +func (f FlagsByName) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// Flag is a common interface related to parsing flags in cli. +// For more advanced flag parsing techniques, it is recommended that +// this interface be implemented. +type Flag interface { + fmt.Stringer + // Apply Flag settings to the given flag set + Apply(*flag.FlagSet) + GetName() string +} + +// errorableFlag is an interface that allows us to return errors during apply +// it allows flags defined in this library to return errors in a fashion backwards compatible +// TODO remove in v2 and modify the existing Flag interface to return errors +type errorableFlag interface { + Flag + + ApplyWithError(*flag.FlagSet) error +} + +func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { + set := flag.NewFlagSet(name, flag.ContinueOnError) + + for _, f := range flags { + //TODO remove in v2 when errorableFlag is removed + if ef, ok := f.(errorableFlag); ok { + if err := ef.ApplyWithError(set); err != nil { + return nil, err + } + } else { + f.Apply(set) + } + } + return set, nil +} + +func eachName(longName string, fn func(string)) { + parts := strings.Split(longName, ",") + for _, name := range parts { + name = strings.Trim(name, " ") + fn(name) + } +} + +// Generic is a generic parseable type identified by a specific flag +type Generic interface { + Set(value string) error + String() string +} + +// Apply takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +// Ignores parsing errors +func (f GenericFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { + val := f.Value + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if err := val.Set(envVal); err != nil { + return fmt.Errorf("could not parse %s as value for flag %s: %s", envVal, f.Name, err) + } + break + } + } + } + + eachName(f.Name, func(name string) { + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter +type StringSlice []string + +// Set appends the string value to the list of values +func (f *StringSlice) Set(value string) error { + *f = append(*f, value) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *StringSlice) String() string { + return fmt.Sprintf("%s", *f) +} + +// Value returns the slice of strings set by this flag +func (f *StringSlice) Value() []string { + return *f +} + +// Get returns the slice of strings set by this flag +func (f *StringSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &StringSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &StringSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter +type IntSlice []int + +// Set parses the value into an integer and appends it to the list of values +func (f *IntSlice) Set(value string) error { + tmp, err := strconv.Atoi(value) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *IntSlice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *IntSlice) Value() []int { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *IntSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &IntSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &IntSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter +type Int64Slice []int64 + +// Set parses the value into an integer and appends it to the list of values +func (f *Int64Slice) Set(value string) error { + tmp, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Int64Slice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *Int64Slice) Value() []int64 { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *Int64Slice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64SliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + newVal := &Int64Slice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) + } + } + f.Value = newVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &Int64Slice{} + } + set.Var(f.Value, name, f.Usage) + }) + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { + val := false + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if envVal == "" { + val = false + break + } + + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + + val = envValBool + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolTFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { + val := true + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + if envVal == "" { + val = false + break + } + + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + + val = envValBool + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + f.Value = envVal + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.StringVar(f.Destination, name, f.Value, f.Usage) + return + } + set.String(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + f.Value = int(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.IntVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Int(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValInt + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Int64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Int64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f UintFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.UintVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Uint64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint64(envValInt) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Uint64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f DurationFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValDuration, err := time.ParseDuration(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValDuration + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.DurationVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Duration(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Float64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { + if f.EnvVar != "" { + for _, envVar := range strings.Split(f.EnvVar, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + envValFloat, err := strconv.ParseFloat(envVal, 10) + if err != nil { + return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = float64(envValFloat) + break + } + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Float64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Float64(name, f.Value, f.Usage) + }) + + return nil +} + +func visibleFlags(fl []Flag) []Flag { + visible := []Flag{} + for _, flag := range fl { + field := flagValue(flag).FieldByName("Hidden") + if !field.IsValid() || !field.Bool() { + visible = append(visible, flag) + } + } + return visible +} + +func prefixFor(name string) (prefix string) { + if len(name) == 1 { + prefix = "-" + } else { + prefix = "--" + } + + return +} + +// Returns the placeholder, if any, and the unquoted usage string. +func unquoteUsage(usage string) (string, string) { + for i := 0; i < len(usage); i++ { + if usage[i] == '`' { + for j := i + 1; j < len(usage); j++ { + if usage[j] == '`' { + name := usage[i+1 : j] + usage = usage[:i] + name + usage[j+1:] + return name, usage + } + } + break + } + } + return "", usage +} + +func prefixedNames(fullName, placeholder string) string { + var prefixed string + parts := strings.Split(fullName, ",") + for i, name := range parts { + name = strings.Trim(name, " ") + prefixed += prefixFor(name) + name + if placeholder != "" { + prefixed += " " + placeholder + } + if i < len(parts)-1 { + prefixed += ", " + } + } + return prefixed +} + +func withEnvHint(envVar, str string) string { + envText := "" + if envVar != "" { + prefix := "$" + suffix := "" + sep := ", $" + if runtime.GOOS == "windows" { + prefix = "%" + suffix = "%" + sep = "%, %" + } + envText = fmt.Sprintf(" [%s%s%s]", prefix, strings.Join(strings.Split(envVar, ","), sep), suffix) + } + return str + envText +} + +func flagValue(f Flag) reflect.Value { + fv := reflect.ValueOf(f) + for fv.Kind() == reflect.Ptr { + fv = reflect.Indirect(fv) + } + return fv +} + +func stringifyFlag(f Flag) string { + fv := flagValue(f) + + switch f.(type) { + case IntSliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyIntSliceFlag(f.(IntSliceFlag))) + case Int64SliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyInt64SliceFlag(f.(Int64SliceFlag))) + case StringSliceFlag: + return withEnvHint(fv.FieldByName("EnvVar").String(), + stringifyStringSliceFlag(f.(StringSliceFlag))) + } + + placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) + + needsPlaceholder := false + defaultValueString := "" + + if val := fv.FieldByName("Value"); val.IsValid() { + needsPlaceholder = true + defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) + + if val.Kind() == reflect.String && val.String() != "" { + defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) + } + } + + if defaultValueString == " (default: )" { + defaultValueString = "" + } + + if needsPlaceholder && placeholder == "" { + placeholder = defaultPlaceholder + } + + usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultValueString)) + + return withEnvHint(fv.FieldByName("EnvVar").String(), + fmt.Sprintf("%s\t%s", prefixedNames(fv.FieldByName("Name").String(), placeholder), usageWithDefault)) +} + +func stringifyIntSliceFlag(f IntSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyInt64SliceFlag(f Int64SliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, fmt.Sprintf("%d", i)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyStringSliceFlag(f StringSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, s := range f.Value.Value() { + if len(s) > 0 { + defaultVals = append(defaultVals, fmt.Sprintf("%q", s)) + } + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifySliceFlag(usage, name string, defaultVals []string) string { + placeholder, usage := unquoteUsage(usage) + if placeholder == "" { + placeholder = defaultPlaceholder + } + + defaultVal := "" + if len(defaultVals) > 0 { + defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) + } + + usageWithDefault := strings.TrimSpace(fmt.Sprintf("%s%s", usage, defaultVal)) + return fmt.Sprintf("%s\t%s", prefixedNames(name, placeholder), usageWithDefault) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag_generated.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag_generated.go new file mode 100755 index 0000000..491b619 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/flag_generated.go @@ -0,0 +1,627 @@ +package cli + +import ( + "flag" + "strconv" + "time" +) + +// WARNING: This file is generated! + +// BoolFlag is a flag with type bool +type BoolFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolFlag) GetName() string { + return f.Name +} + +// Bool looks up the value of a local BoolFlag, returns +// false if not found +func (c *Context) Bool(name string) bool { + return lookupBool(name, c.flagSet) +} + +// GlobalBool looks up the value of a global BoolFlag, returns +// false if not found +func (c *Context) GlobalBool(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBool(name, fs) + } + return false +} + +func lookupBool(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// BoolTFlag is a flag with type bool that is true by default +type BoolTFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolTFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolTFlag) GetName() string { + return f.Name +} + +// BoolT looks up the value of a local BoolTFlag, returns +// false if not found +func (c *Context) BoolT(name string) bool { + return lookupBoolT(name, c.flagSet) +} + +// GlobalBoolT looks up the value of a global BoolTFlag, returns +// false if not found +func (c *Context) GlobalBoolT(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBoolT(name, fs) + } + return false +} + +func lookupBoolT(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) +type DurationFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value time.Duration + Destination *time.Duration +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f DurationFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f DurationFlag) GetName() string { + return f.Name +} + +// Duration looks up the value of a local DurationFlag, returns +// 0 if not found +func (c *Context) Duration(name string) time.Duration { + return lookupDuration(name, c.flagSet) +} + +// GlobalDuration looks up the value of a global DurationFlag, returns +// 0 if not found +func (c *Context) GlobalDuration(name string) time.Duration { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupDuration(name, fs) + } + return 0 +} + +func lookupDuration(name string, set *flag.FlagSet) time.Duration { + f := set.Lookup(name) + if f != nil { + parsed, err := time.ParseDuration(f.Value.String()) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// Float64Flag is a flag with type float64 +type Float64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value float64 + Destination *float64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Float64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Float64Flag) GetName() string { + return f.Name +} + +// Float64 looks up the value of a local Float64Flag, returns +// 0 if not found +func (c *Context) Float64(name string) float64 { + return lookupFloat64(name, c.flagSet) +} + +// GlobalFloat64 looks up the value of a global Float64Flag, returns +// 0 if not found +func (c *Context) GlobalFloat64(name string) float64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupFloat64(name, fs) + } + return 0 +} + +func lookupFloat64(name string, set *flag.FlagSet) float64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseFloat(f.Value.String(), 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// GenericFlag is a flag with type Generic +type GenericFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value Generic +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f GenericFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f GenericFlag) GetName() string { + return f.Name +} + +// Generic looks up the value of a local GenericFlag, returns +// nil if not found +func (c *Context) Generic(name string) interface{} { + return lookupGeneric(name, c.flagSet) +} + +// GlobalGeneric looks up the value of a global GenericFlag, returns +// nil if not found +func (c *Context) GlobalGeneric(name string) interface{} { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupGeneric(name, fs) + } + return nil +} + +func lookupGeneric(name string, set *flag.FlagSet) interface{} { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value, error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64Flag is a flag with type int64 +type Int64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value int64 + Destination *int64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64Flag) GetName() string { + return f.Name +} + +// Int64 looks up the value of a local Int64Flag, returns +// 0 if not found +func (c *Context) Int64(name string) int64 { + return lookupInt64(name, c.flagSet) +} + +// GlobalInt64 looks up the value of a global Int64Flag, returns +// 0 if not found +func (c *Context) GlobalInt64(name string) int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64(name, fs) + } + return 0 +} + +func lookupInt64(name string, set *flag.FlagSet) int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// IntFlag is a flag with type int +type IntFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value int + Destination *int +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntFlag) GetName() string { + return f.Name +} + +// Int looks up the value of a local IntFlag, returns +// 0 if not found +func (c *Context) Int(name string) int { + return lookupInt(name, c.flagSet) +} + +// GlobalInt looks up the value of a global IntFlag, returns +// 0 if not found +func (c *Context) GlobalInt(name string) int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt(name, fs) + } + return 0 +} + +func lookupInt(name string, set *flag.FlagSet) int { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return int(parsed) + } + return 0 +} + +// IntSliceFlag is a flag with type *IntSlice +type IntSliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *IntSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntSliceFlag) GetName() string { + return f.Name +} + +// IntSlice looks up the value of a local IntSliceFlag, returns +// nil if not found +func (c *Context) IntSlice(name string) []int { + return lookupIntSlice(name, c.flagSet) +} + +// GlobalIntSlice looks up the value of a global IntSliceFlag, returns +// nil if not found +func (c *Context) GlobalIntSlice(name string) []int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupIntSlice(name, fs) + } + return nil +} + +func lookupIntSlice(name string, set *flag.FlagSet) []int { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64SliceFlag is a flag with type *Int64Slice +type Int64SliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *Int64Slice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64SliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64SliceFlag) GetName() string { + return f.Name +} + +// Int64Slice looks up the value of a local Int64SliceFlag, returns +// nil if not found +func (c *Context) Int64Slice(name string) []int64 { + return lookupInt64Slice(name, c.flagSet) +} + +// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns +// nil if not found +func (c *Context) GlobalInt64Slice(name string) []int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64Slice(name, fs) + } + return nil +} + +func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// StringFlag is a flag with type string +type StringFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value string + Destination *string +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringFlag) GetName() string { + return f.Name +} + +// String looks up the value of a local StringFlag, returns +// "" if not found +func (c *Context) String(name string) string { + return lookupString(name, c.flagSet) +} + +// GlobalString looks up the value of a global StringFlag, returns +// "" if not found +func (c *Context) GlobalString(name string) string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupString(name, fs) + } + return "" +} + +func lookupString(name string, set *flag.FlagSet) string { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value.String(), error(nil) + if err != nil { + return "" + } + return parsed + } + return "" +} + +// StringSliceFlag is a flag with type *StringSlice +type StringSliceFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value *StringSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringSliceFlag) GetName() string { + return f.Name +} + +// StringSlice looks up the value of a local StringSliceFlag, returns +// nil if not found +func (c *Context) StringSlice(name string) []string { + return lookupStringSlice(name, c.flagSet) +} + +// GlobalStringSlice looks up the value of a global StringSliceFlag, returns +// nil if not found +func (c *Context) GlobalStringSlice(name string) []string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupStringSlice(name, fs) + } + return nil +} + +func lookupStringSlice(name string, set *flag.FlagSet) []string { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Uint64Flag is a flag with type uint64 +type Uint64Flag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value uint64 + Destination *uint64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Uint64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Uint64Flag) GetName() string { + return f.Name +} + +// Uint64 looks up the value of a local Uint64Flag, returns +// 0 if not found +func (c *Context) Uint64(name string) uint64 { + return lookupUint64(name, c.flagSet) +} + +// GlobalUint64 looks up the value of a global Uint64Flag, returns +// 0 if not found +func (c *Context) GlobalUint64(name string) uint64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint64(name, fs) + } + return 0 +} + +func lookupUint64(name string, set *flag.FlagSet) uint64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// UintFlag is a flag with type uint +type UintFlag struct { + Name string + Usage string + EnvVar string + Hidden bool + Value uint + Destination *uint +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f UintFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f UintFlag) GetName() string { + return f.Name +} + +// Uint looks up the value of a local UintFlag, returns +// 0 if not found +func (c *Context) Uint(name string) uint { + return lookupUint(name, c.flagSet) +} + +// GlobalUint looks up the value of a global UintFlag, returns +// 0 if not found +func (c *Context) GlobalUint(name string) uint { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint(name, fs) + } + return 0 +} + +func lookupUint(name string, set *flag.FlagSet) uint { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return uint(parsed) + } + return 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/funcs.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/funcs.go new file mode 100755 index 0000000..cba5e6c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/funcs.go @@ -0,0 +1,28 @@ +package cli + +// BashCompleteFunc is an action to execute when the bash-completion flag is set +type BashCompleteFunc func(*Context) + +// BeforeFunc is an action to execute before any subcommands are run, but after +// the context is ready if a non-nil error is returned, no subcommands are run +type BeforeFunc func(*Context) error + +// AfterFunc is an action to execute after any subcommands are run, but after the +// subcommand has finished it is run even if Action() panics +type AfterFunc func(*Context) error + +// ActionFunc is the action to execute when no subcommands are specified +type ActionFunc func(*Context) error + +// CommandNotFoundFunc is executed if the proper command cannot be found +type CommandNotFoundFunc func(*Context, string) + +// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying +// customized usage error messages. This function is able to replace the +// original error messages. If this function is not set, the "Incorrect usage" +// is displayed and the execution is interrupted. +type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error + +// FlagStringFunc is used by the help generation to display a flag, which is +// expected to be a single line. +type FlagStringFunc func(Flag) string diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/generate-flag-types b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/generate-flag-types new file mode 100755 index 0000000..7147381 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/generate-flag-types @@ -0,0 +1,255 @@ +#!/usr/bin/env python +""" +The flag types that ship with the cli library have many things in common, and +so we can take advantage of the `go generate` command to create much of the +source code from a list of definitions. These definitions attempt to cover +the parts that vary between flag types, and should evolve as needed. + +An example of the minimum definition needed is: + + { + "name": "SomeType", + "type": "sometype", + "context_default": "nil" + } + +In this example, the code generated for the `cli` package will include a type +named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. +Fetching values by name via `*cli.Context` will default to a value of `nil`. + +A more complete, albeit somewhat redundant, example showing all available +definition keys is: + + { + "name": "VeryMuchType", + "type": "*VeryMuchType", + "value": true, + "dest": false, + "doctail": " which really only wraps a []float64, oh well!", + "context_type": "[]float64", + "context_default": "nil", + "parser": "parseVeryMuchType(f.Value.String())", + "parser_cast": "[]float64(parsed)" + } + +The meaning of each field is as follows: + + name (string) - The type "name", which will be suffixed with + `Flag` when generating the type definition + for `cli` and the wrapper type for `altsrc` + type (string) - The type that the generated `Flag` type for `cli` + is expected to "contain" as its `.Value` member + value (bool) - Should the generated `cli` type have a `Value` + member? + dest (bool) - Should the generated `cli` type support a + destination pointer? + doctail (string) - Additional docs for the `cli` flag type comment + context_type (string) - The literal type used in the `*cli.Context` + reader func signature + context_default (string) - The literal value used as the default by the + `*cli.Context` reader funcs when no value is + present + parser (string) - Literal code used to parse the flag `f`, + expected to have a return signature of + (value, error) + parser_cast (string) - Literal code used to cast the `parsed` value + returned from the `parser` code +""" + +from __future__ import print_function, unicode_literals + +import argparse +import json +import os +import subprocess +import sys +import tempfile +import textwrap + + +class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, + argparse.RawDescriptionHelpFormatter): + pass + + +def main(sysargs=sys.argv[:]): + parser = argparse.ArgumentParser( + description='Generate flag type code!', + formatter_class=_FancyFormatter) + parser.add_argument( + 'package', + type=str, default='cli', choices=_WRITEFUNCS.keys(), + help='Package for which flag types will be generated' + ) + parser.add_argument( + '-i', '--in-json', + type=argparse.FileType('r'), + default=sys.stdin, + help='Input JSON file which defines each type to be generated' + ) + parser.add_argument( + '-o', '--out-go', + type=argparse.FileType('w'), + default=sys.stdout, + help='Output file/stream to which generated source will be written' + ) + parser.epilog = __doc__ + + args = parser.parse_args(sysargs[1:]) + _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) + return 0 + + +def _generate_flag_types(writefunc, output_go, input_json): + types = json.load(input_json) + + tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) + writefunc(tmp, types) + tmp.close() + + new_content = subprocess.check_output( + ['goimports', tmp.name] + ).decode('utf-8') + + print(new_content, file=output_go, end='') + output_go.flush() + os.remove(tmp.name) + + +def _set_typedef_defaults(typedef): + typedef.setdefault('doctail', '') + typedef.setdefault('context_type', typedef['type']) + typedef.setdefault('dest', True) + typedef.setdefault('value', True) + typedef.setdefault('parser', 'f.Value, error(nil)') + typedef.setdefault('parser_cast', 'parsed') + + +def _write_cli_flag_types(outfile, types): + _fwrite(outfile, """\ + package cli + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is a flag with type {type}{doctail} + type {name}Flag struct {{ + Name string + Usage string + EnvVar string + Hidden bool + """.format(**typedef)) + + if typedef['value']: + _fwrite(outfile, """\ + Value {type} + """.format(**typedef)) + + if typedef['dest']: + _fwrite(outfile, """\ + Destination *{type} + """.format(**typedef)) + + _fwrite(outfile, "\n}\n\n") + + _fwrite(outfile, """\ + // String returns a readable representation of this value + // (for usage defaults) + func (f {name}Flag) String() string {{ + return FlagStringer(f) + }} + + // GetName returns the name of the flag + func (f {name}Flag) GetName() string {{ + return f.Name + }} + + // {name} looks up the value of a local {name}Flag, returns + // {context_default} if not found + func (c *Context) {name}(name string) {context_type} {{ + return lookup{name}(name, c.flagSet) + }} + + // Global{name} looks up the value of a global {name}Flag, returns + // {context_default} if not found + func (c *Context) Global{name}(name string) {context_type} {{ + if fs := lookupGlobalFlagSet(name, c); fs != nil {{ + return lookup{name}(name, fs) + }} + return {context_default} + }} + + func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ + f := set.Lookup(name) + if f != nil {{ + parsed, err := {parser} + if err != nil {{ + return {context_default} + }} + return {parser_cast} + }} + return {context_default} + }} + """.format(**typedef)) + + +def _write_altsrc_flag_types(outfile, types): + _fwrite(outfile, """\ + package altsrc + + import ( + "gopkg.in/urfave/cli.v1" + ) + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is the flag type that wraps cli.{name}Flag to allow + // for other values to be specified + type {name}Flag struct {{ + cli.{name}Flag + set *flag.FlagSet + }} + + // New{name}Flag creates a new {name}Flag + func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ + return &{name}Flag{{{name}Flag: fl, set: nil}} + }} + + // Apply saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.Apply + func (f *{name}Flag) Apply(set *flag.FlagSet) {{ + f.set = set + f.{name}Flag.Apply(set) + }} + + // ApplyWithError saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.ApplyWithError + func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ + f.set = set + return f.{name}Flag.ApplyWithError(set) + }} + """.format(**typedef)) + + +def _fwrite(outfile, text): + print(textwrap.dedent(text), end='', file=outfile) + + +_WRITEFUNCS = { + 'cli': _write_cli_flag_types, + 'altsrc': _write_altsrc_flag_types +} + +if __name__ == '__main__': + sys.exit(main()) diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/help.go b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/help.go new file mode 100755 index 0000000..57ec98d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/help.go @@ -0,0 +1,338 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" + "text/tabwriter" + "text/template" +) + +// AppHelpTemplate is the text template for the Default help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var AppHelpTemplate = `NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +` + +// CommandHelpTemplate is the text template for the command help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var CommandHelpTemplate = `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}} +` + +// SubcommandHelpTemplate is the text template for the subcommand help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var SubcommandHelpTemplate = `NAME: + {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} +{{end}}{{if .VisibleFlags}} +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +` + +var helpCommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + ShowAppHelp(c) + return nil + }, +} + +var helpSubcommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + return ShowSubcommandHelp(c) + }, +} + +// Prints help for the App or Command +type helpPrinter func(w io.Writer, templ string, data interface{}) + +// Prints help for the App or Command with custom template function. +type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) + +// HelpPrinter is a function that writes the help output. If not set a default +// is used. The function signature is: +// func(w io.Writer, templ string, data interface{}) +var HelpPrinter helpPrinter = printHelp + +// HelpPrinterCustom is same as HelpPrinter but +// takes a custom function for template function map. +var HelpPrinterCustom helpPrinterCustom = printHelpCustom + +// VersionPrinter prints the version for the App +var VersionPrinter = printVersion + +// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. +func ShowAppHelpAndExit(c *Context, exitCode int) { + ShowAppHelp(c) + os.Exit(exitCode) +} + +// ShowAppHelp is an action that displays the help. +func ShowAppHelp(c *Context) (err error) { + if c.App.CustomAppHelpTemplate == "" { + HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) + return + } + customAppData := func() map[string]interface{} { + if c.App.ExtraInfo == nil { + return nil + } + return map[string]interface{}{ + "ExtraInfo": c.App.ExtraInfo, + } + } + HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) + return nil +} + +// DefaultAppComplete prints the list of subcommands as the default app completion method +func DefaultAppComplete(c *Context) { + for _, command := range c.App.Commands { + if command.Hidden { + continue + } + for _, name := range command.Names() { + fmt.Fprintln(c.App.Writer, name) + } + } +} + +// ShowCommandHelpAndExit - exits with code after showing help +func ShowCommandHelpAndExit(c *Context, command string, code int) { + ShowCommandHelp(c, command) + os.Exit(code) +} + +// ShowCommandHelp prints help for the given command +func ShowCommandHelp(ctx *Context, command string) error { + // show the subcommand help for a command with subcommands + if command == "" { + HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) + return nil + } + + for _, c := range ctx.App.Commands { + if c.HasName(command) { + if c.CustomHelpTemplate != "" { + HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) + } else { + HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) + } + return nil + } + } + + if ctx.App.CommandNotFound == nil { + return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) + } + + ctx.App.CommandNotFound(ctx, command) + return nil +} + +// ShowSubcommandHelp prints help for the given subcommand +func ShowSubcommandHelp(c *Context) error { + return ShowCommandHelp(c, c.Command.Name) +} + +// ShowVersion prints the version number of the App +func ShowVersion(c *Context) { + VersionPrinter(c) +} + +func printVersion(c *Context) { + fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) +} + +// ShowCompletions prints the lists of commands within a given context +func ShowCompletions(c *Context) { + a := c.App + if a != nil && a.BashComplete != nil { + a.BashComplete(c) + } +} + +// ShowCommandCompletions prints the custom completions for a given command +func ShowCommandCompletions(ctx *Context, command string) { + c := ctx.App.Command(command) + if c != nil && c.BashComplete != nil { + c.BashComplete(ctx) + } +} + +func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { + funcMap := template.FuncMap{ + "join": strings.Join, + } + if customFunc != nil { + for key, value := range customFunc { + funcMap[key] = value + } + } + + w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) + t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) + err := t.Execute(w, data) + if err != nil { + // If the writer is closed, t.Execute will fail, and there's nothing + // we can do to recover. + if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { + fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) + } + return + } + w.Flush() +} + +func printHelp(out io.Writer, templ string, data interface{}) { + printHelpCustom(out, templ, data, nil) +} + +func checkVersion(c *Context) bool { + found := false + if VersionFlag.GetName() != "" { + eachName(VersionFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkHelp(c *Context) bool { + found := false + if HelpFlag.GetName() != "" { + eachName(HelpFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkCommandHelp(c *Context, name string) bool { + if c.Bool("h") || c.Bool("help") { + ShowCommandHelp(c, name) + return true + } + + return false +} + +func checkSubcommandHelp(c *Context) bool { + if c.Bool("h") || c.Bool("help") { + ShowSubcommandHelp(c) + return true + } + + return false +} + +func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { + if !a.EnableBashCompletion { + return false, arguments + } + + pos := len(arguments) - 1 + lastArg := arguments[pos] + + if lastArg != "--"+BashCompletionFlag.GetName() { + return false, arguments + } + + return true, arguments[:pos] +} + +func checkCompletions(c *Context) bool { + if !c.shellComplete { + return false + } + + if args := c.Args(); args.Present() { + name := args.First() + if cmd := c.App.Command(name); cmd != nil { + // let the command handle the completion + return false + } + } + + ShowCompletions(c) + return true +} + +func checkCommandCompletions(c *Context, name string) bool { + if !c.shellComplete { + return false + } + + ShowCommandCompletions(c, name) + return true +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/runtests b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/runtests new file mode 100755 index 0000000..ee22bde --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/github.com/urfave/cli/runtests @@ -0,0 +1,122 @@ +#!/usr/bin/env python +from __future__ import print_function + +import argparse +import os +import sys +import tempfile + +from subprocess import check_call, check_output + + +PACKAGE_NAME = os.environ.get( + 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' +) + + +def main(sysargs=sys.argv[:]): + targets = { + 'vet': _vet, + 'test': _test, + 'gfmrun': _gfmrun, + 'toc': _toc, + 'gen': _gen, + } + + parser = argparse.ArgumentParser() + parser.add_argument( + 'target', nargs='?', choices=tuple(targets.keys()), default='test' + ) + args = parser.parse_args(sysargs[1:]) + + targets[args.target]() + return 0 + + +def _test(): + if check_output('go version'.split()).split()[2] < 'go1.2': + _run('go test -v .') + return + + coverprofiles = [] + for subpackage in ['', 'altsrc']: + coverprofile = 'cli.coverprofile' + if subpackage != '': + coverprofile = '{}.coverprofile'.format(subpackage) + + coverprofiles.append(coverprofile) + + _run('go test -v'.split() + [ + '-coverprofile={}'.format(coverprofile), + ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') + ]) + + combined_name = _combine_coverprofiles(coverprofiles) + _run('go tool cover -func={}'.format(combined_name)) + os.remove(combined_name) + + +def _gfmrun(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.3': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) + + +def _vet(): + _run('go vet ./...') + + +def _toc(): + _run('node_modules/.bin/markdown-toc -i README.md') + _run('git diff --exit-code') + + +def _gen(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.5': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + + _run('go generate ./...') + _run('git diff --exit-code') + + +def _run(command): + if hasattr(command, 'split'): + command = command.split() + print('runtests: {}'.format(' '.join(command)), file=sys.stderr) + check_call(command) + + +def _gfmrun_count(): + with open('README.md') as infile: + lines = infile.read().splitlines() + return len(filter(_is_go_runnable, lines)) + + +def _is_go_runnable(line): + return line.startswith('package main') + + +def _combine_coverprofiles(coverprofiles): + combined = tempfile.NamedTemporaryFile( + suffix='.coverprofile', delete=False + ) + combined.write('mode: set\n') + + for coverprofile in coverprofiles: + with open(coverprofile, 'r') as infile: + for line in infile.readlines(): + if not line.startswith('mode: '): + combined.write(line) + + combined.flush() + name = combined.name + combined.close() + return name + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/AUTHORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/AUTHORS new file mode 100755 index 0000000..2b00ddb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at https://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS new file mode 100755 index 0000000..1fbd3e9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at https://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/LICENSE new file mode 100755 index 0000000..6a66aea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/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/skycoin/skycoin/vendor/golang.org/x/crypto/PATENTS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/PATENTS new file mode 100755 index 0000000..7330990 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go new file mode 100755 index 0000000..9a88759 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -0,0 +1,951 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import ( + "bytes" + "io" + "sync" + "unicode/utf8" +) + +// EscapeCodes contains escape sequences that can be written to the terminal in +// order to achieve different styles of text. +type EscapeCodes struct { + // Foreground colors + Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte + + // Reset all attributes + Reset []byte +} + +var vt100EscapeCodes = EscapeCodes{ + Black: []byte{keyEscape, '[', '3', '0', 'm'}, + Red: []byte{keyEscape, '[', '3', '1', 'm'}, + Green: []byte{keyEscape, '[', '3', '2', 'm'}, + Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, + Blue: []byte{keyEscape, '[', '3', '4', 'm'}, + Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, + Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, + White: []byte{keyEscape, '[', '3', '7', 'm'}, + + Reset: []byte{keyEscape, '[', '0', 'm'}, +} + +// Terminal contains the state for running a VT100 terminal that is capable of +// reading lines of input. +type Terminal struct { + // AutoCompleteCallback, if non-null, is called for each keypress with + // the full input line and the current position of the cursor (in + // bytes, as an index into |line|). If it returns ok=false, the key + // press is processed normally. Otherwise it returns a replacement line + // and the new cursor position. + AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) + + // Escape contains a pointer to the escape codes for this terminal. + // It's always a valid pointer, although the escape codes themselves + // may be empty if the terminal doesn't support them. + Escape *EscapeCodes + + // lock protects the terminal and the state in this object from + // concurrent processing of a key press and a Write() call. + lock sync.Mutex + + c io.ReadWriter + prompt []rune + + // line is the current line being entered. + line []rune + // pos is the logical position of the cursor in line + pos int + // echo is true if local echo is enabled + echo bool + // pasteActive is true iff there is a bracketed paste operation in + // progress. + pasteActive bool + + // cursorX contains the current X value of the cursor where the left + // edge is 0. cursorY contains the row number where the first row of + // the current line is 0. + cursorX, cursorY int + // maxLine is the greatest value of cursorY so far. + maxLine int + + termWidth, termHeight int + + // outBuf contains the terminal data to be sent. + outBuf []byte + // remainder contains the remainder of any partial key sequences after + // a read. It aliases into inBuf. + remainder []byte + inBuf [256]byte + + // history contains previously entered commands so that they can be + // accessed with the up and down keys. + history stRingBuffer + // historyIndex stores the currently accessed history entry, where zero + // means the immediately previous entry. + historyIndex int + // When navigating up and down the history it's possible to return to + // the incomplete, initial line. That value is stored in + // historyPending. + historyPending string +} + +// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is +// a local terminal, that terminal must first have been put into raw mode. +// prompt is a string that is written at the start of each input line (i.e. +// "> "). +func NewTerminal(c io.ReadWriter, prompt string) *Terminal { + return &Terminal{ + Escape: &vt100EscapeCodes, + c: c, + prompt: []rune(prompt), + termWidth: 80, + termHeight: 24, + echo: true, + historyIndex: -1, + } +} + +const ( + keyCtrlD = 4 + keyCtrlU = 21 + keyEnter = '\r' + keyEscape = 27 + keyBackspace = 127 + keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota + keyUp + keyDown + keyLeft + keyRight + keyAltLeft + keyAltRight + keyHome + keyEnd + keyDeleteWord + keyDeleteLine + keyClearScreen + keyPasteStart + keyPasteEnd +) + +var ( + crlf = []byte{'\r', '\n'} + pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} + pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} +) + +// bytesToKey tries to parse a key sequence from b. If successful, it returns +// the key and the remainder of the input. Otherwise it returns utf8.RuneError. +func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { + if len(b) == 0 { + return utf8.RuneError, nil + } + + if !pasteActive { + switch b[0] { + case 1: // ^A + return keyHome, b[1:] + case 5: // ^E + return keyEnd, b[1:] + case 8: // ^H + return keyBackspace, b[1:] + case 11: // ^K + return keyDeleteLine, b[1:] + case 12: // ^L + return keyClearScreen, b[1:] + case 23: // ^W + return keyDeleteWord, b[1:] + } + } + + if b[0] != keyEscape { + if !utf8.FullRune(b) { + return utf8.RuneError, b + } + r, l := utf8.DecodeRune(b) + return r, b[l:] + } + + if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { + switch b[2] { + case 'A': + return keyUp, b[3:] + case 'B': + return keyDown, b[3:] + case 'C': + return keyRight, b[3:] + case 'D': + return keyLeft, b[3:] + case 'H': + return keyHome, b[3:] + case 'F': + return keyEnd, b[3:] + } + } + + if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { + switch b[5] { + case 'C': + return keyAltRight, b[6:] + case 'D': + return keyAltLeft, b[6:] + } + } + + if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { + return keyPasteStart, b[6:] + } + + if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { + return keyPasteEnd, b[6:] + } + + // If we get here then we have a key that we don't recognise, or a + // partial sequence. It's not clear how one should find the end of a + // sequence without knowing them all, but it seems that [a-zA-Z~] only + // appears at the end of a sequence. + for i, c := range b[0:] { + if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { + return keyUnknown, b[i+1:] + } + } + + return utf8.RuneError, b +} + +// queue appends data to the end of t.outBuf +func (t *Terminal) queue(data []rune) { + t.outBuf = append(t.outBuf, []byte(string(data))...) +} + +var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} +var space = []rune{' '} + +func isPrintable(key rune) bool { + isInSurrogateArea := key >= 0xd800 && key <= 0xdbff + return key >= 32 && !isInSurrogateArea +} + +// moveCursorToPos appends data to t.outBuf which will move the cursor to the +// given, logical position in the text. +func (t *Terminal) moveCursorToPos(pos int) { + if !t.echo { + return + } + + x := visualLength(t.prompt) + pos + y := x / t.termWidth + x = x % t.termWidth + + up := 0 + if y < t.cursorY { + up = t.cursorY - y + } + + down := 0 + if y > t.cursorY { + down = y - t.cursorY + } + + left := 0 + if x < t.cursorX { + left = t.cursorX - x + } + + right := 0 + if x > t.cursorX { + right = x - t.cursorX + } + + t.cursorX = x + t.cursorY = y + t.move(up, down, left, right) +} + +func (t *Terminal) move(up, down, left, right int) { + movement := make([]rune, 3*(up+down+left+right)) + m := movement + for i := 0; i < up; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'A' + m = m[3:] + } + for i := 0; i < down; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'B' + m = m[3:] + } + for i := 0; i < left; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'D' + m = m[3:] + } + for i := 0; i < right; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'C' + m = m[3:] + } + + t.queue(movement) +} + +func (t *Terminal) clearLineToRight() { + op := []rune{keyEscape, '[', 'K'} + t.queue(op) +} + +const maxLineLength = 4096 + +func (t *Terminal) setLine(newLine []rune, newPos int) { + if t.echo { + t.moveCursorToPos(0) + t.writeLine(newLine) + for i := len(newLine); i < len(t.line); i++ { + t.writeLine(space) + } + t.moveCursorToPos(newPos) + } + t.line = newLine + t.pos = newPos +} + +func (t *Terminal) advanceCursor(places int) { + t.cursorX += places + t.cursorY += t.cursorX / t.termWidth + if t.cursorY > t.maxLine { + t.maxLine = t.cursorY + } + t.cursorX = t.cursorX % t.termWidth + + if places > 0 && t.cursorX == 0 { + // Normally terminals will advance the current position + // when writing a character. But that doesn't happen + // for the last character in a line. However, when + // writing a character (except a new line) that causes + // a line wrap, the position will be advanced two + // places. + // + // So, if we are stopping at the end of a line, we + // need to write a newline so that our cursor can be + // advanced to the next line. + t.outBuf = append(t.outBuf, '\r', '\n') + } +} + +func (t *Terminal) eraseNPreviousChars(n int) { + if n == 0 { + return + } + + if t.pos < n { + n = t.pos + } + t.pos -= n + t.moveCursorToPos(t.pos) + + copy(t.line[t.pos:], t.line[n+t.pos:]) + t.line = t.line[:len(t.line)-n] + if t.echo { + t.writeLine(t.line[t.pos:]) + for i := 0; i < n; i++ { + t.queue(space) + } + t.advanceCursor(n) + t.moveCursorToPos(t.pos) + } +} + +// countToLeftWord returns then number of characters from the cursor to the +// start of the previous word. +func (t *Terminal) countToLeftWord() int { + if t.pos == 0 { + return 0 + } + + pos := t.pos - 1 + for pos > 0 { + if t.line[pos] != ' ' { + break + } + pos-- + } + for pos > 0 { + if t.line[pos] == ' ' { + pos++ + break + } + pos-- + } + + return t.pos - pos +} + +// countToRightWord returns then number of characters from the cursor to the +// start of the next word. +func (t *Terminal) countToRightWord() int { + pos := t.pos + for pos < len(t.line) { + if t.line[pos] == ' ' { + break + } + pos++ + } + for pos < len(t.line) { + if t.line[pos] != ' ' { + break + } + pos++ + } + return pos - t.pos +} + +// visualLength returns the number of visible glyphs in s. +func visualLength(runes []rune) int { + inEscapeSeq := false + length := 0 + + for _, r := range runes { + switch { + case inEscapeSeq: + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + inEscapeSeq = false + } + case r == '\x1b': + inEscapeSeq = true + default: + length++ + } + } + + return length +} + +// handleKey processes the given key and, optionally, returns a line of text +// that the user has entered. +func (t *Terminal) handleKey(key rune) (line string, ok bool) { + if t.pasteActive && key != keyEnter { + t.addKeyToLine(key) + return + } + + switch key { + case keyBackspace: + if t.pos == 0 { + return + } + t.eraseNPreviousChars(1) + case keyAltLeft: + // move left by a word. + t.pos -= t.countToLeftWord() + t.moveCursorToPos(t.pos) + case keyAltRight: + // move right by a word. + t.pos += t.countToRightWord() + t.moveCursorToPos(t.pos) + case keyLeft: + if t.pos == 0 { + return + } + t.pos-- + t.moveCursorToPos(t.pos) + case keyRight: + if t.pos == len(t.line) { + return + } + t.pos++ + t.moveCursorToPos(t.pos) + case keyHome: + if t.pos == 0 { + return + } + t.pos = 0 + t.moveCursorToPos(t.pos) + case keyEnd: + if t.pos == len(t.line) { + return + } + t.pos = len(t.line) + t.moveCursorToPos(t.pos) + case keyUp: + entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) + if !ok { + return "", false + } + if t.historyIndex == -1 { + t.historyPending = string(t.line) + } + t.historyIndex++ + runes := []rune(entry) + t.setLine(runes, len(runes)) + case keyDown: + switch t.historyIndex { + case -1: + return + case 0: + runes := []rune(t.historyPending) + t.setLine(runes, len(runes)) + t.historyIndex-- + default: + entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) + if ok { + t.historyIndex-- + runes := []rune(entry) + t.setLine(runes, len(runes)) + } + } + case keyEnter: + t.moveCursorToPos(len(t.line)) + t.queue([]rune("\r\n")) + line = string(t.line) + ok = true + t.line = t.line[:0] + t.pos = 0 + t.cursorX = 0 + t.cursorY = 0 + t.maxLine = 0 + case keyDeleteWord: + // Delete zero or more spaces and then one or more characters. + t.eraseNPreviousChars(t.countToLeftWord()) + case keyDeleteLine: + // Delete everything from the current cursor position to the + // end of line. + for i := t.pos; i < len(t.line); i++ { + t.queue(space) + t.advanceCursor(1) + } + t.line = t.line[:t.pos] + t.moveCursorToPos(t.pos) + case keyCtrlD: + // Erase the character under the current position. + // The EOF case when the line is empty is handled in + // readLine(). + if t.pos < len(t.line) { + t.pos++ + t.eraseNPreviousChars(1) + } + case keyCtrlU: + t.eraseNPreviousChars(t.pos) + case keyClearScreen: + // Erases the screen and moves the cursor to the home position. + t.queue([]rune("\x1b[2J\x1b[H")) + t.queue(t.prompt) + t.cursorX, t.cursorY = 0, 0 + t.advanceCursor(visualLength(t.prompt)) + t.setLine(t.line, t.pos) + default: + if t.AutoCompleteCallback != nil { + prefix := string(t.line[:t.pos]) + suffix := string(t.line[t.pos:]) + + t.lock.Unlock() + newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) + t.lock.Lock() + + if completeOk { + t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) + return + } + } + if !isPrintable(key) { + return + } + if len(t.line) == maxLineLength { + return + } + t.addKeyToLine(key) + } + return +} + +// addKeyToLine inserts the given key at the current position in the current +// line. +func (t *Terminal) addKeyToLine(key rune) { + if len(t.line) == cap(t.line) { + newLine := make([]rune, len(t.line), 2*(1+len(t.line))) + copy(newLine, t.line) + t.line = newLine + } + t.line = t.line[:len(t.line)+1] + copy(t.line[t.pos+1:], t.line[t.pos:]) + t.line[t.pos] = key + if t.echo { + t.writeLine(t.line[t.pos:]) + } + t.pos++ + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) writeLine(line []rune) { + for len(line) != 0 { + remainingOnLine := t.termWidth - t.cursorX + todo := len(line) + if todo > remainingOnLine { + todo = remainingOnLine + } + t.queue(line[:todo]) + t.advanceCursor(visualLength(line[:todo])) + line = line[todo:] + } +} + +// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. +func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { + for len(buf) > 0 { + i := bytes.IndexByte(buf, '\n') + todo := len(buf) + if i >= 0 { + todo = i + } + + var nn int + nn, err = w.Write(buf[:todo]) + n += nn + if err != nil { + return n, err + } + buf = buf[todo:] + + if i >= 0 { + if _, err = w.Write(crlf); err != nil { + return n, err + } + n++ + buf = buf[1:] + } + } + + return n, nil +} + +func (t *Terminal) Write(buf []byte) (n int, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + if t.cursorX == 0 && t.cursorY == 0 { + // This is the easy case: there's nothing on the screen that we + // have to move out of the way. + return writeWithCRLF(t.c, buf) + } + + // We have a prompt and possibly user input on the screen. We + // have to clear it first. + t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) + t.cursorX = 0 + t.clearLineToRight() + + for t.cursorY > 0 { + t.move(1 /* up */, 0, 0, 0) + t.cursorY-- + t.clearLineToRight() + } + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + + if n, err = writeWithCRLF(t.c, buf); err != nil { + return + } + + t.writeLine(t.prompt) + if t.echo { + t.writeLine(t.line) + } + + t.moveCursorToPos(t.pos) + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + return +} + +// ReadPassword temporarily changes the prompt and reads a password, without +// echo, from the terminal. +func (t *Terminal) ReadPassword(prompt string) (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + oldPrompt := t.prompt + t.prompt = []rune(prompt) + t.echo = false + + line, err = t.readLine() + + t.prompt = oldPrompt + t.echo = true + + return +} + +// ReadLine returns a line of input from the terminal. +func (t *Terminal) ReadLine() (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + return t.readLine() +} + +func (t *Terminal) readLine() (line string, err error) { + // t.lock must be held at this point + + if t.cursorX == 0 && t.cursorY == 0 { + t.writeLine(t.prompt) + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + } + + lineIsPasted := t.pasteActive + + for { + rest := t.remainder + lineOk := false + for !lineOk { + var key rune + key, rest = bytesToKey(rest, t.pasteActive) + if key == utf8.RuneError { + break + } + if !t.pasteActive { + if key == keyCtrlD { + if len(t.line) == 0 { + return "", io.EOF + } + } + if key == keyPasteStart { + t.pasteActive = true + if len(t.line) == 0 { + lineIsPasted = true + } + continue + } + } else if key == keyPasteEnd { + t.pasteActive = false + continue + } + if !t.pasteActive { + lineIsPasted = false + } + line, lineOk = t.handleKey(key) + } + if len(rest) > 0 { + n := copy(t.inBuf[:], rest) + t.remainder = t.inBuf[:n] + } else { + t.remainder = nil + } + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + if lineOk { + if t.echo { + t.historyIndex = -1 + t.history.Add(line) + } + if lineIsPasted { + err = ErrPasteIndicator + } + return + } + + // t.remainder is a slice at the beginning of t.inBuf + // containing a partial key sequence + readBuf := t.inBuf[len(t.remainder):] + var n int + + t.lock.Unlock() + n, err = t.c.Read(readBuf) + t.lock.Lock() + + if err != nil { + return + } + + t.remainder = t.inBuf[:n+len(t.remainder)] + } +} + +// SetPrompt sets the prompt to be used when reading subsequent lines. +func (t *Terminal) SetPrompt(prompt string) { + t.lock.Lock() + defer t.lock.Unlock() + + t.prompt = []rune(prompt) +} + +func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { + // Move cursor to column zero at the start of the line. + t.move(t.cursorY, 0, t.cursorX, 0) + t.cursorX, t.cursorY = 0, 0 + t.clearLineToRight() + for t.cursorY < numPrevLines { + // Move down a line + t.move(0, 1, 0, 0) + t.cursorY++ + t.clearLineToRight() + } + // Move back to beginning. + t.move(t.cursorY, 0, 0, 0) + t.cursorX, t.cursorY = 0, 0 + + t.queue(t.prompt) + t.advanceCursor(visualLength(t.prompt)) + t.writeLine(t.line) + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) SetSize(width, height int) error { + t.lock.Lock() + defer t.lock.Unlock() + + if width == 0 { + width = 1 + } + + oldWidth := t.termWidth + t.termWidth, t.termHeight = width, height + + switch { + case width == oldWidth: + // If the width didn't change then nothing else needs to be + // done. + return nil + case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: + // If there is nothing on current line and no prompt printed, + // just do nothing + return nil + case width < oldWidth: + // Some terminals (e.g. xterm) will truncate lines that were + // too long when shinking. Others, (e.g. gnome-terminal) will + // attempt to wrap them. For the former, repainting t.maxLine + // works great, but that behaviour goes badly wrong in the case + // of the latter because they have doubled every full line. + + // We assume that we are working on a terminal that wraps lines + // and adjust the cursor position based on every previous line + // wrapping and turning into two. This causes the prompt on + // xterms to move upwards, which isn't great, but it avoids a + // huge mess with gnome-terminal. + if t.cursorX >= t.termWidth { + t.cursorX = t.termWidth - 1 + } + t.cursorY *= 2 + t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) + case width > oldWidth: + // If the terminal expands then our position calculations will + // be wrong in the future because we think the cursor is + // |t.pos| chars into the string, but there will be a gap at + // the end of any wrapped line. + // + // But the position will actually be correct until we move, so + // we can move back to the beginning and repaint everything. + t.clearAndRepaintLinePlusNPrevious(t.maxLine) + } + + _, err := t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + return err +} + +type pasteIndicatorError struct{} + +func (pasteIndicatorError) Error() string { + return "terminal: ErrPasteIndicator not correctly handled" +} + +// ErrPasteIndicator may be returned from ReadLine as the error, in addition +// to valid line data. It indicates that bracketed paste mode is enabled and +// that the returned line consists only of pasted data. Programs may wish to +// interpret pasted data more literally than typed data. +var ErrPasteIndicator = pasteIndicatorError{} + +// SetBracketedPasteMode requests that the terminal bracket paste operations +// with markers. Not all terminals support this but, if it is supported, then +// enabling this mode will stop any autocomplete callback from running due to +// pastes. Additionally, any lines that are completely pasted will be returned +// from ReadLine with the error set to ErrPasteIndicator. +func (t *Terminal) SetBracketedPasteMode(on bool) { + if on { + io.WriteString(t.c, "\x1b[?2004h") + } else { + io.WriteString(t.c, "\x1b[?2004l") + } +} + +// stRingBuffer is a ring buffer of strings. +type stRingBuffer struct { + // entries contains max elements. + entries []string + max int + // head contains the index of the element most recently added to the ring. + head int + // size contains the number of elements in the ring. + size int +} + +func (s *stRingBuffer) Add(a string) { + if s.entries == nil { + const defaultNumEntries = 100 + s.entries = make([]string, defaultNumEntries) + s.max = defaultNumEntries + } + + s.head = (s.head + 1) % s.max + s.entries[s.head] = a + if s.size < s.max { + s.size++ + } +} + +// NthPreviousEntry returns the value passed to the nth previous call to Add. +// If n is zero then the immediately prior value is returned, if one, then the +// next most recent, and so on. If such an element doesn't exist then ok is +// false. +func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { + if n >= s.size { + return "", false + } + index := s.head - n + if index < 0 { + index += s.max + } + return s.entries[index], true +} + +// readPasswordLine reads from reader until it finds \n or io.EOF. +// The slice returned does not include the \n. +// readPasswordLine also ignores any \r it finds. +func readPasswordLine(reader io.Reader) ([]byte, error) { + var buf [1]byte + var ret []byte + + for { + n, err := reader.Read(buf[:]) + if n > 0 { + switch buf[0] { + case '\n': + return ret, nil + case '\r': + // remove \r from passwords on Windows + default: + ret = append(ret, buf[0]) + } + continue + } + if err != nil { + if err == io.EOF && len(ret) > 0 { + return ret, nil + } + return ret, err + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go new file mode 100755 index 0000000..731c89a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -0,0 +1,114 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + // This attempts to replicate the behaviour documented for cfmakeraw in + // the termios(3) manpage. + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return -1, -1, err + } + return int(ws.Col), int(ws.Row), nil +} + +// passwordReader is an io.Reader that reads from a specific file descriptor. +type passwordReader int + +func (r passwordReader) Read(buf []byte) (int, error) { + return unix.Read(int(r), buf) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + newState := *termios + newState.Lflag &^= unix.ECHO + newState.Lflag |= unix.ICANON | unix.ISIG + newState.Iflag |= unix.ICRNL + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) + + return readPasswordLine(passwordReader(fd)) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go new file mode 100755 index 0000000..cb23a59 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA +const ioctlWriteTermios = unix.TIOCSETA diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go new file mode 100755 index 0000000..5fadfe8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go @@ -0,0 +1,10 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go new file mode 100755 index 0000000..799f049 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go @@ -0,0 +1,58 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "fmt" + "runtime" +) + +type State struct{} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + return false +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go new file mode 100755 index 0000000..9e41b9f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go @@ -0,0 +1,124 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" + "io" + "syscall" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermio(fd, unix.TCGETA) + return err == nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c + val, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + oldState := *val + + newState := oldState + newState.Lflag &^= syscall.ECHO + newState.Lflag |= syscall.ICANON | syscall.ISIG + newState.Iflag |= syscall.ICRNL + err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) + if err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) + + var buf [16]byte + var ret []byte + for { + n, err := syscall.Read(fd, buf[:]) + if err != nil { + return nil, err + } + if n == 0 { + if len(ret) == 0 { + return nil, io.EOF + } + break + } + if buf[n-1] == '\n' { + n-- + } + ret = append(ret, buf[:n]...) + if n < len(buf) { + break + } + } + + return ret, nil +} + +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +// see http://cr.illumos.org/~webrev/andy_js/1060/ +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, oldState *State) error { + return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return 0, 0, err + } + return int(ws.Col), int(ws.Row), nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go new file mode 100755 index 0000000..8618955 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -0,0 +1,103 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "os" + + "golang.org/x/sys/windows" +) + +type State struct { + mode uint32 +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + var st uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { + return nil, err + } + return &State{st}, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + return &State{st}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return windows.SetConsoleMode(windows.Handle(fd), state.mode) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err + } + return int(info.Size.X), int(info.Size.Y), nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + old := st + + st &^= (windows.ENABLE_ECHO_INPUT) + st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { + return nil, err + } + + defer windows.SetConsoleMode(windows.Handle(fd), old) + + var h windows.Handle + p, _ := windows.GetCurrentProcess() + if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } + + f := os.NewFile(uintptr(h), "stdin") + defer f.Close() + return readPasswordLine(f) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/AUTHORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/AUTHORS new file mode 100755 index 0000000..15167cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/CONTRIBUTORS new file mode 100755 index 0000000..1c4577e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/LICENSE new file mode 100755 index 0000000..6a66aea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/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/skycoin/skycoin/vendor/golang.org/x/net/PATENTS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/PATENTS new file mode 100755 index 0000000..7330990 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/context.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/context.go new file mode 100755 index 0000000..a3c021d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/context.go @@ -0,0 +1,56 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package context defines the Context type, which carries deadlines, +// cancelation signals, and other request-scoped values across API boundaries +// and between processes. +// As of Go 1.7 this package is available in the standard library under the +// name context. https://golang.org/pkg/context. +// +// Incoming requests to a server should create a Context, and outgoing calls to +// servers should accept a Context. The chain of function calls between must +// propagate the Context, optionally replacing it with a modified copy created +// using WithDeadline, WithTimeout, WithCancel, or WithValue. +// +// Programs that use Contexts should follow these rules to keep interfaces +// consistent across packages and enable static analysis tools to check context +// propagation: +// +// Do not store Contexts inside a struct type; instead, pass a Context +// explicitly to each function that needs it. The Context should be the first +// parameter, typically named ctx: +// +// func DoSomething(ctx context.Context, arg Arg) error { +// // ... use ctx ... +// } +// +// Do not pass a nil Context, even if a function permits it. Pass context.TODO +// if you are unsure about which Context to use. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +// +// The same Context may be passed to functions running in different goroutines; +// Contexts are safe for simultaneous use by multiple goroutines. +// +// See http://blog.golang.org/context for example code for a server that uses +// Contexts. +package context // import "golang.org/x/net/context" + +// Background returns a non-nil, empty Context. It is never canceled, has no +// values, and has no deadline. It is typically used by the main function, +// initialization, and tests, and as the top-level Context for incoming +// requests. +func Background() Context { + return background +} + +// TODO returns a non-nil, empty Context. Code should use context.TODO when +// it's unclear which Context to use or it is not yet available (because the +// surrounding function has not yet been extended to accept a Context +// parameter). TODO is recognized by static analysis tools that determine +// whether Contexts are propagated correctly in a program. +func TODO() Context { + return todo +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go17.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go17.go new file mode 100755 index 0000000..d20f52b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go17.go @@ -0,0 +1,72 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.7 + +package context + +import ( + "context" // standard library's context, as of Go 1.7 + "time" +) + +var ( + todo = context.TODO() + background = context.Background() +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = context.Canceled + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = context.DeadlineExceeded + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + ctx, f := context.WithCancel(parent) + return ctx, CancelFunc(f) +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + ctx, f := context.WithDeadline(parent, deadline) + return ctx, CancelFunc(f) +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return context.WithValue(parent, key, val) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go19.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go19.go new file mode 100755 index 0000000..d88bd1d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/go19.go @@ -0,0 +1,20 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.9 + +package context + +import "context" // standard library's context, as of Go 1.7 + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context = context.Context + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc = context.CancelFunc diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go17.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go17.go new file mode 100755 index 0000000..0f35592 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go17.go @@ -0,0 +1,300 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.7 + +package context + +import ( + "errors" + "fmt" + "sync" + "time" +) + +// An emptyCtx is never canceled, has no values, and has no deadline. It is not +// struct{}, since vars of this type must have distinct addresses. +type emptyCtx int + +func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { + return +} + +func (*emptyCtx) Done() <-chan struct{} { + return nil +} + +func (*emptyCtx) Err() error { + return nil +} + +func (*emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (e *emptyCtx) String() string { + switch e { + case background: + return "context.Background" + case todo: + return "context.TODO" + } + return "unknown empty Context" +} + +var ( + background = new(emptyCtx) + todo = new(emptyCtx) +) + +// Canceled is the error returned by Context.Err when the context is canceled. +var Canceled = errors.New("context canceled") + +// DeadlineExceeded is the error returned by Context.Err when the context's +// deadline passes. +var DeadlineExceeded = errors.New("context deadline exceeded") + +// WithCancel returns a copy of parent with a new Done channel. The returned +// context's Done channel is closed when the returned cancel function is called +// or when the parent context's Done channel is closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { + c := newCancelCtx(parent) + propagateCancel(parent, c) + return c, func() { c.cancel(true, Canceled) } +} + +// newCancelCtx returns an initialized cancelCtx. +func newCancelCtx(parent Context) *cancelCtx { + return &cancelCtx{ + Context: parent, + done: make(chan struct{}), + } +} + +// propagateCancel arranges for child to be canceled when parent is. +func propagateCancel(parent Context, child canceler) { + if parent.Done() == nil { + return // parent is never canceled + } + if p, ok := parentCancelCtx(parent); ok { + p.mu.Lock() + if p.err != nil { + // parent has already been canceled + child.cancel(false, p.err) + } else { + if p.children == nil { + p.children = make(map[canceler]bool) + } + p.children[child] = true + } + p.mu.Unlock() + } else { + go func() { + select { + case <-parent.Done(): + child.cancel(false, parent.Err()) + case <-child.Done(): + } + }() + } +} + +// parentCancelCtx follows a chain of parent references until it finds a +// *cancelCtx. This function understands how each of the concrete types in this +// package represents its parent. +func parentCancelCtx(parent Context) (*cancelCtx, bool) { + for { + switch c := parent.(type) { + case *cancelCtx: + return c, true + case *timerCtx: + return c.cancelCtx, true + case *valueCtx: + parent = c.Context + default: + return nil, false + } + } +} + +// removeChild removes a context from its parent. +func removeChild(parent Context, child canceler) { + p, ok := parentCancelCtx(parent) + if !ok { + return + } + p.mu.Lock() + if p.children != nil { + delete(p.children, child) + } + p.mu.Unlock() +} + +// A canceler is a context type that can be canceled directly. The +// implementations are *cancelCtx and *timerCtx. +type canceler interface { + cancel(removeFromParent bool, err error) + Done() <-chan struct{} +} + +// A cancelCtx can be canceled. When canceled, it also cancels any children +// that implement canceler. +type cancelCtx struct { + Context + + done chan struct{} // closed by the first cancel call. + + mu sync.Mutex + children map[canceler]bool // set to nil by the first cancel call + err error // set to non-nil by the first cancel call +} + +func (c *cancelCtx) Done() <-chan struct{} { + return c.done +} + +func (c *cancelCtx) Err() error { + c.mu.Lock() + defer c.mu.Unlock() + return c.err +} + +func (c *cancelCtx) String() string { + return fmt.Sprintf("%v.WithCancel", c.Context) +} + +// cancel closes c.done, cancels each of c's children, and, if +// removeFromParent is true, removes c from its parent's children. +func (c *cancelCtx) cancel(removeFromParent bool, err error) { + if err == nil { + panic("context: internal error: missing cancel error") + } + c.mu.Lock() + if c.err != nil { + c.mu.Unlock() + return // already canceled + } + c.err = err + close(c.done) + for child := range c.children { + // NOTE: acquiring the child's lock while holding parent's lock. + child.cancel(false, err) + } + c.children = nil + c.mu.Unlock() + + if removeFromParent { + removeChild(c.Context, c) + } +} + +// WithDeadline returns a copy of the parent context with the deadline adjusted +// to be no later than d. If the parent's deadline is already earlier than d, +// WithDeadline(parent, d) is semantically equivalent to parent. The returned +// context's Done channel is closed when the deadline expires, when the returned +// cancel function is called, or when the parent context's Done channel is +// closed, whichever happens first. +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete. +func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { + if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { + // The current deadline is already sooner than the new one. + return WithCancel(parent) + } + c := &timerCtx{ + cancelCtx: newCancelCtx(parent), + deadline: deadline, + } + propagateCancel(parent, c) + d := deadline.Sub(time.Now()) + if d <= 0 { + c.cancel(true, DeadlineExceeded) // deadline has already passed + return c, func() { c.cancel(true, Canceled) } + } + c.mu.Lock() + defer c.mu.Unlock() + if c.err == nil { + c.timer = time.AfterFunc(d, func() { + c.cancel(true, DeadlineExceeded) + }) + } + return c, func() { c.cancel(true, Canceled) } +} + +// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to +// implement Done and Err. It implements cancel by stopping its timer then +// delegating to cancelCtx.cancel. +type timerCtx struct { + *cancelCtx + timer *time.Timer // Under cancelCtx.mu. + + deadline time.Time +} + +func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { + return c.deadline, true +} + +func (c *timerCtx) String() string { + return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) +} + +func (c *timerCtx) cancel(removeFromParent bool, err error) { + c.cancelCtx.cancel(false, err) + if removeFromParent { + // Remove this timerCtx from its parent cancelCtx's children. + removeChild(c.cancelCtx.Context, c) + } + c.mu.Lock() + if c.timer != nil { + c.timer.Stop() + c.timer = nil + } + c.mu.Unlock() +} + +// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). +// +// Canceling this context releases resources associated with it, so code should +// call cancel as soon as the operations running in this Context complete: +// +// func slowOperationWithTimeout(ctx context.Context) (Result, error) { +// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) +// defer cancel() // releases resources if slowOperation completes before timeout elapses +// return slowOperation(ctx) +// } +func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { + return WithDeadline(parent, time.Now().Add(timeout)) +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +// +// Use context Values only for request-scoped data that transits processes and +// APIs, not for passing optional parameters to functions. +func WithValue(parent Context, key interface{}, val interface{}) Context { + return &valueCtx{parent, key, val} +} + +// A valueCtx carries a key-value pair. It implements Value for that key and +// delegates all other calls to the embedded Context. +type valueCtx struct { + Context + key, val interface{} +} + +func (c *valueCtx) String() string { + return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) +} + +func (c *valueCtx) Value(key interface{}) interface{} { + if c.key == key { + return c.val + } + return c.Context.Value(key) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go19.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go19.go new file mode 100755 index 0000000..b105f80 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/net/context/pre_go19.go @@ -0,0 +1,109 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.9 + +package context + +import "time" + +// A Context carries a deadline, a cancelation signal, and other values across +// API boundaries. +// +// Context's methods may be called by multiple goroutines simultaneously. +type Context interface { + // Deadline returns the time when work done on behalf of this context + // should be canceled. Deadline returns ok==false when no deadline is + // set. Successive calls to Deadline return the same results. + Deadline() (deadline time.Time, ok bool) + + // Done returns a channel that's closed when work done on behalf of this + // context should be canceled. Done may return nil if this context can + // never be canceled. Successive calls to Done return the same value. + // + // WithCancel arranges for Done to be closed when cancel is called; + // WithDeadline arranges for Done to be closed when the deadline + // expires; WithTimeout arranges for Done to be closed when the timeout + // elapses. + // + // Done is provided for use in select statements: + // + // // Stream generates values with DoSomething and sends them to out + // // until DoSomething returns an error or ctx.Done is closed. + // func Stream(ctx context.Context, out chan<- Value) error { + // for { + // v, err := DoSomething(ctx) + // if err != nil { + // return err + // } + // select { + // case <-ctx.Done(): + // return ctx.Err() + // case out <- v: + // } + // } + // } + // + // See http://blog.golang.org/pipelines for more examples of how to use + // a Done channel for cancelation. + Done() <-chan struct{} + + // Err returns a non-nil error value after Done is closed. Err returns + // Canceled if the context was canceled or DeadlineExceeded if the + // context's deadline passed. No other values for Err are defined. + // After Done is closed, successive calls to Err return the same value. + Err() error + + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. Successive calls to Value with + // the same key returns the same result. + // + // Use context values only for request-scoped data that transits + // processes and API boundaries, not for passing optional parameters to + // functions. + // + // A key identifies a specific value in a Context. Functions that wish + // to store values in Context typically allocate a key in a global + // variable then use that key as the argument to context.WithValue and + // Context.Value. A key can be any type that supports equality; + // packages should define keys as an unexported type to avoid + // collisions. + // + // Packages that define a Context key should provide type-safe accessors + // for the values stores using that key: + // + // // Package user defines a User type that's stored in Contexts. + // package user + // + // import "golang.org/x/net/context" + // + // // User is the type of value stored in the Contexts. + // type User struct {...} + // + // // key is an unexported type for keys defined in this package. + // // This prevents collisions with keys defined in other packages. + // type key int + // + // // userKey is the key for user.User values in Contexts. It is + // // unexported; clients use user.NewContext and user.FromContext + // // instead of using this key directly. + // var userKey key = 0 + // + // // NewContext returns a new Context that carries value u. + // func NewContext(ctx context.Context, u *User) context.Context { + // return context.WithValue(ctx, userKey, u) + // } + // + // // FromContext returns the User value stored in ctx, if any. + // func FromContext(ctx context.Context) (*User, bool) { + // u, ok := ctx.Value(userKey).(*User) + // return u, ok + // } + Value(key interface{}) interface{} +} + +// A CancelFunc tells an operation to abandon its work. +// A CancelFunc does not wait for the work to stop. +// After the first call, subsequent calls to a CancelFunc do nothing. +type CancelFunc func() diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/AUTHORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/AUTHORS new file mode 100755 index 0000000..15167cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS new file mode 100755 index 0000000..1c4577e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/LICENSE new file mode 100755 index 0000000..6a66aea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/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/skycoin/skycoin/vendor/golang.org/x/sys/PATENTS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/PATENTS new file mode 100755 index 0000000..7330990 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/.gitignore b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/.gitignore new file mode 100755 index 0000000..e3e0fc6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/.gitignore @@ -0,0 +1,2 @@ +_obj/ +unix.test diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/README.md b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/README.md new file mode 100755 index 0000000..bc6f603 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/README.md @@ -0,0 +1,173 @@ +# Building `sys/unix` + +The sys/unix package provides access to the raw system call interface of the +underlying operating system. See: https://godoc.org/golang.org/x/sys/unix + +Porting Go to a new architecture/OS combination or adding syscalls, types, or +constants to an existing architecture/OS pair requires some manual effort; +however, there are tools that automate much of the process. + +## Build Systems + +There are currently two ways we generate the necessary files. We are currently +migrating the build system to use containers so the builds are reproducible. +This is being done on an OS-by-OS basis. Please update this documentation as +components of the build system change. + +### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`) + +The old build system generates the Go files based on the C header files +present on your system. This means that files +for a given GOOS/GOARCH pair must be generated on a system with that OS and +architecture. This also means that the generated code can differ from system +to system, based on differences in the header files. + +To avoid this, if you are using the old build system, only generate the Go +files on an installation with unmodified header files. It is also important to +keep track of which version of the OS the files were generated from (ex. +Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes +and have each OS upgrade correspond to a single change. + +To build the files for your current OS and architecture, make sure GOOS and +GOARCH are set correctly and run `mkall.sh`. This will generate the files for +your specific system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go + +### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`) + +The new build system uses a Docker container to generate the go files directly +from source checkouts of the kernel and various system libraries. This means +that on any platform that supports Docker, all the files using the new build +system can be generated at once, and generated files will not change based on +what the person running the scripts has installed on their computer. + +The OS specific files for the new build system are located in the `${GOOS}` +directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When +the kernel or system library updates, modify the Dockerfile at +`${GOOS}/Dockerfile` to checkout the new release of the source. + +To build all the files under the new build system, you must be on an amd64/Linux +system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will +then generate all of the files for all of the GOOS/GOARCH pairs in the new build +system. Running `mkall.sh -n` shows the commands that will be run. + +Requirements: bash, perl, go, docker + +## Component files + +This section describes the various files used in the code generation process. +It also contains instructions on how to modify these files to add a new +architecture/OS or to add additional syscalls, types, or constants. Note that +if you are using the new build system, the scripts cannot be called normally. +They must be called from within the docker container. + +### asm files + +The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system +call dispatch. There are three entry points: +``` + func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) + func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr) + func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr) +``` +The first and second are the standard ones; they differ only in how many +arguments can be passed to the kernel. The third is for low-level use by the +ForkExec wrapper. Unlike the first two, it does not call into the scheduler to +let it know that a system call is running. + +When porting Go to an new architecture/OS, this file must be implemented for +each GOOS/GOARCH pair. + +### mksysnum + +Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl` +for the old system). This script takes in a list of header files containing the +syscall number declarations and parses them to produce the corresponding list of +Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated +constants. + +Adding new syscall numbers is mostly done by running the build on a sufficiently +new installation of the target OS (or updating the source checkouts for the +new build system). However, depending on the OS, you make need to update the +parsing in mksysnum. + +### mksyscall.pl + +The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are +hand-written Go files which implement system calls (for unix, the specific OS, +or the specific OS/Architecture pair respectively) that need special handling +and list `//sys` comments giving prototypes for ones that can be generated. + +The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts +them into syscalls. This requires the name of the prototype in the comment to +match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function +prototype can be exported (capitalized) or not. + +Adding a new syscall often just requires adding a new `//sys` function prototype +with the desired arguments and a capitalized name so it is exported. However, if +you want the interface to the syscall to be different, often one will make an +unexported `//sys` prototype, an then write a custom wrapper in +`syscall_${GOOS}.go`. + +### types files + +For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or +`types_${GOOS}.go` on the old system). This file includes standard C headers and +creates Go type aliases to the corresponding C types. The file is then fed +through godef to get the Go compatible definitions. Finally, the generated code +is fed though mkpost.go to format the code correctly and remove any hidden or +private identifiers. This cleaned-up code is written to +`ztypes_${GOOS}_${GOARCH}.go`. + +The hardest part about preparing this file is figuring out which headers to +include and which symbols need to be `#define`d to get the actual data +structures that pass through to the kernel system calls. Some C libraries +preset alternate versions for binary compatibility and translate them on the +way in and out of system calls, but there is almost always a `#define` that can +get the real ones. +See `types_darwin.go` and `linux/types.go` for examples. + +To add a new type, add in the necessary include statement at the top of the +file (if it is not already there) and add in a type alias line. Note that if +your type is significantly different on different architectures, you may need +some `#if/#elif` macros in your include statements. + +### mkerrors.sh + +This script is used to generate the system's various constants. This doesn't +just include the error numbers and error strings, but also the signal numbers +an a wide variety of miscellaneous constants. The constants come from the list +of include files in the `includes_${uname}` variable. A regex then picks out +the desired `#define` statements, and generates the corresponding Go constants. +The error numbers and strings are generated from `#include `, and the +signal numbers and strings are generated from `#include `. All of +these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program, +`_errors.c`, which prints out all the constants. + +To add a constant, add the header that includes it to the appropriate variable. +Then, edit the regex (if necessary) to match the desired constant. Avoid making +the regex too broad to avoid matching unintended constants. + + +## Generated files + +### `zerror_${GOOS}_${GOARCH}.go` + +A file containing all of the system's generated error numbers, error strings, +signal numbers, and constants. Generated by `mkerrors.sh` (see above). + +### `zsyscall_${GOOS}_${GOARCH}.go` + +A file containing all the generated syscalls for a specific GOOS and GOARCH. +Generated by `mksyscall.pl` (see above). + +### `zsysnum_${GOOS}_${GOARCH}.go` + +A list of numeric constants for all the syscall number of the specific GOOS +and GOARCH. Generated by mksysnum (see above). + +### `ztypes_${GOOS}_${GOARCH}.go` + +A file containing Go types for passing into (or returning from) syscalls. +Generated by godefs and the types file (see above). diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go new file mode 100755 index 0000000..72afe33 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/affinity_linux.go @@ -0,0 +1,124 @@ +// 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. + +// CPU affinity functions + +package unix + +import ( + "unsafe" +) + +const cpuSetSize = _CPU_SETSIZE / _NCPUBITS + +// CPUSet represents a CPU affinity mask. +type CPUSet [cpuSetSize]cpuMask + +func schedAffinity(trap uintptr, pid int, set *CPUSet) error { + _, _, e := RawSyscall(trap, uintptr(pid), uintptr(unsafe.Sizeof(*set)), uintptr(unsafe.Pointer(set))) + if e != 0 { + return errnoErr(e) + } + return nil +} + +// SchedGetaffinity gets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedGetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_GETAFFINITY, pid, set) +} + +// SchedSetaffinity sets the CPU affinity mask of the thread specified by pid. +// If pid is 0 the calling thread is used. +func SchedSetaffinity(pid int, set *CPUSet) error { + return schedAffinity(SYS_SCHED_SETAFFINITY, pid, set) +} + +// Zero clears the set s, so that it contains no CPUs. +func (s *CPUSet) Zero() { + for i := range s { + s[i] = 0 + } +} + +func cpuBitsIndex(cpu int) int { + return cpu / _NCPUBITS +} + +func cpuBitsMask(cpu int) cpuMask { + return cpuMask(1 << (uint(cpu) % _NCPUBITS)) +} + +// Set adds cpu to the set s. +func (s *CPUSet) Set(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] |= cpuBitsMask(cpu) + } +} + +// Clear removes cpu from the set s. +func (s *CPUSet) Clear(cpu int) { + i := cpuBitsIndex(cpu) + if i < len(s) { + s[i] &^= cpuBitsMask(cpu) + } +} + +// IsSet reports whether cpu is in the set s. +func (s *CPUSet) IsSet(cpu int) bool { + i := cpuBitsIndex(cpu) + if i < len(s) { + return s[i]&cpuBitsMask(cpu) != 0 + } + return false +} + +// Count returns the number of CPUs in the set s. +func (s *CPUSet) Count() int { + c := 0 + for _, b := range s { + c += onesCount64(uint64(b)) + } + return c +} + +// onesCount64 is a copy of Go 1.9's math/bits.OnesCount64. +// Once this package can require Go 1.9, we can delete this +// and update the caller to use bits.OnesCount64. +func onesCount64(x uint64) int { + const m0 = 0x5555555555555555 // 01010101 ... + const m1 = 0x3333333333333333 // 00110011 ... + const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... + const m3 = 0x00ff00ff00ff00ff // etc. + const m4 = 0x0000ffff0000ffff + + // Implementation: Parallel summing of adjacent bits. + // See "Hacker's Delight", Chap. 5: Counting Bits. + // The following pattern shows the general approach: + // + // x = x>>1&(m0&m) + x&(m0&m) + // x = x>>2&(m1&m) + x&(m1&m) + // x = x>>4&(m2&m) + x&(m2&m) + // x = x>>8&(m3&m) + x&(m3&m) + // x = x>>16&(m4&m) + x&(m4&m) + // x = x>>32&(m5&m) + x&(m5&m) + // return int(x) + // + // Masking (& operations) can be left away when there's no + // danger that a field's sum will carry over into the next + // field: Since the result cannot be > 64, 8 bits is enough + // and we can ignore the masks for the shifts by 8 and up. + // Per "Hacker's Delight", the first line can be simplified + // more, but it saves at best one instruction, so we leave + // it alone for clarity. + const m = 1<<64 - 1 + x = x>>1&(m0&m) + x&(m0&m) + x = x>>2&(m1&m) + x&(m1&m) + x = (x>>4 + x) & (m2 & m) + x += x >> 8 + x += x >> 16 + x += x >> 32 + return int(x) & (1<<7 - 1) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s new file mode 100755 index 0000000..8a72783 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s new file mode 100755 index 0000000..6321421 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s new file mode 100755 index 0000000..333242d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm,darwin + +#include "textflag.h" + +// +// System call support for ARM, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s new file mode 100755 index 0000000..97e0174 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm64,darwin + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s new file mode 100755 index 0000000..d5ed672 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, DragonFly +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-112 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-64 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s new file mode 100755 index 0000000..c9a0a26 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s new file mode 100755 index 0000000..3517247 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, FreeBSD +// + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s new file mode 100755 index 0000000..9227c87 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s new file mode 100755 index 0000000..448bebb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -0,0 +1,65 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for 386, Linux +// + +// See ../runtime/sys_linux_386.s for the reason why we always use int 0x80 +// instead of the glibc-specific "CALL 0x10(GS)". +#define INVOKE_SYSCALL INT $0x80 + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + CALL runtime·entersyscall(SB) + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + CALL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVL trap+0(FP), AX // syscall entry + MOVL a1+4(FP), BX + MOVL a2+8(FP), CX + MOVL a3+12(FP), DX + MOVL $0, SI + MOVL $0, DI + INVOKE_SYSCALL + MOVL AX, r1+16(FP) + MOVL DX, r2+20(FP) + RET + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) + +TEXT ·seek(SB),NOSPLIT,$0-28 + JMP syscall·seek(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s new file mode 100755 index 0000000..c6468a9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -0,0 +1,57 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for AMD64, Linux +// + +// 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 ·SyscallNoError(SB),NOSPLIT,$0-48 + CALL runtime·entersyscall(SB) + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + 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 + MOVQ a1+8(FP), DI + MOVQ a2+16(FP), SI + MOVQ a3+24(FP), DX + MOVQ $0, R10 + MOVQ $0, R8 + MOVQ $0, R9 + MOVQ trap+0(FP), AX // syscall entry + SYSCALL + MOVQ AX, r1+32(FP) + MOVQ DX, r2+40(FP) + RET + +TEXT ·gettimeofday(SB),NOSPLIT,$0-16 + JMP syscall·gettimeofday(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s new file mode 100755 index 0000000..cf0f357 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -0,0 +1,56 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for arm, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + BL runtime·entersyscall(SB) + MOVW trap+0(FP), R7 + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + MOVW $0, R3 + MOVW $0, R4 + MOVW $0, R5 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW trap+0(FP), R7 // syscall entry + MOVW a1+4(FP), R0 + MOVW a2+8(FP), R1 + MOVW a3+12(FP), R2 + SWI $0 + MOVW R0, r1+16(FP) + MOVW $0, R0 + MOVW R0, r2+20(FP) + RET + +TEXT ·seek(SB),NOSPLIT,$0-28 + B syscall·seek(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s new file mode 100755 index 0000000..afe6fdf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -0,0 +1,52 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build arm64 +// +build !gccgo + +#include "textflag.h" + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) // r1 + MOVD R1, r2+40(FP) // r2 + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R0 + MOVD a2+16(FP), R1 + MOVD a3+24(FP), R2 + MOVD $0, R3 + MOVD $0, R4 + MOVD $0, R5 + MOVD trap+0(FP), R8 // syscall entry + SVC + MOVD R0, r1+32(FP) + MOVD R1, r2+40(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s new file mode 100755 index 0000000..ab9d638 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -0,0 +1,56 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips64, Linux +// + +// 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 ·SyscallNoError(SB),NOSPLIT,$0-48 + JAL runtime·entersyscall(SB) + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + JAL 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 + MOVV a1+8(FP), R4 + MOVV a2+16(FP), R5 + MOVV a3+24(FP), R6 + MOVV R0, R7 + MOVV R0, R8 + MOVV R0, R9 + MOVV trap+0(FP), R2 // syscall entry + SYSCALL + MOVV R2, r1+32(FP) + MOVV R3, r2+40(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s new file mode 100755 index 0000000..99e5399 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_mipsx.s @@ -0,0 +1,54 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips mipsle +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-24 + JAL runtime·entersyscall(SB) + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW R0, R7 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) // r1 + MOVW R3, r2+20(FP) // r2 + JAL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-24 + MOVW a1+4(FP), R4 + MOVW a2+8(FP), R5 + MOVW a3+12(FP), R6 + MOVW trap+0(FP), R2 // syscall entry + SYSCALL + MOVW R2, r1+16(FP) + MOVW R3, r2+20(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s new file mode 100755 index 0000000..649e587 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -0,0 +1,56 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R3 + MOVD a2+16(FP), R4 + MOVD a3+24(FP), R5 + MOVD R0, R6 + MOVD R0, R7 + MOVD R0, R8 + MOVD trap+0(FP), R9 // syscall entry + SYSCALL R9 + MOVD R3, r1+32(FP) + MOVD R4, r2+40(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s new file mode 100755 index 0000000..a5a863c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -0,0 +1,56 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x +// +build linux +// +build !gccgo + +#include "textflag.h" + +// +// System calls for s390x, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·SyscallNoError(SB),NOSPLIT,$0-48 + BL runtime·entersyscall(SB) + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + BL runtime·exitsyscall(SB) + RET + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) + +TEXT ·RawSyscallNoError(SB),NOSPLIT,$0-48 + MOVD a1+8(FP), R2 + MOVD a2+16(FP), R3 + MOVD a3+24(FP), R4 + MOVD $0, R5 + MOVD $0, R6 + MOVD $0, R7 + MOVD trap+0(FP), R1 // syscall entry + SYSCALL + MOVD R2, r1+32(FP) + MOVD R3, r2+40(FP) + RET diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s new file mode 100755 index 0000000..48bdcd7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s new file mode 100755 index 0000000..2ede05c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, NetBSD +// + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s new file mode 100755 index 0000000..e892857 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s new file mode 100755 index 0000000..00576f3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s new file mode 100755 index 0000000..790ef77 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s new file mode 100755 index 0000000..469bfa1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_openbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s new file mode 100755 index 0000000..ded8260 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -0,0 +1,17 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go +// + +TEXT ·sysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-88 + JMP syscall·rawSysvicall6(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go new file mode 100755 index 0000000..6e32296 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -0,0 +1,35 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Bluetooth sockets and messages + +package unix + +// Bluetooth Protocols +const ( + BTPROTO_L2CAP = 0 + BTPROTO_HCI = 1 + BTPROTO_SCO = 2 + BTPROTO_RFCOMM = 3 + BTPROTO_BNEP = 4 + BTPROTO_CMTP = 5 + BTPROTO_HIDP = 6 + BTPROTO_AVDTP = 7 +) + +const ( + HCI_CHANNEL_RAW = 0 + HCI_CHANNEL_USER = 1 + HCI_CHANNEL_MONITOR = 2 + HCI_CHANNEL_CONTROL = 3 +) + +// Socketoption Level +const ( + SOL_BLUETOOTH = 0x112 + SOL_HCI = 0x0 + SOL_L2CAP = 0x6 + SOL_RFCOMM = 0x12 + SOL_SCO = 0x11 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go new file mode 100755 index 0000000..df52048 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/cap_freebsd.go @@ -0,0 +1,195 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build freebsd + +package unix + +import ( + "errors" + "fmt" +) + +// Go implementation of C mostly found in /usr/src/sys/kern/subr_capability.c + +const ( + // This is the version of CapRights this package understands. See C implementation for parallels. + capRightsGoVersion = CAP_RIGHTS_VERSION_00 + capArSizeMin = CAP_RIGHTS_VERSION_00 + 2 + capArSizeMax = capRightsGoVersion + 2 +) + +var ( + bit2idx = []int{ + -1, 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, + 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + } +) + +func capidxbit(right uint64) int { + return int((right >> 57) & 0x1f) +} + +func rightToIndex(right uint64) (int, error) { + idx := capidxbit(right) + if idx < 0 || idx >= len(bit2idx) { + return -2, fmt.Errorf("index for right 0x%x out of range", right) + } + return bit2idx[idx], nil +} + +func caprver(right uint64) int { + return int(right >> 62) +} + +func capver(rights *CapRights) int { + return caprver(rights.Rights[0]) +} + +func caparsize(rights *CapRights) int { + return capver(rights) + 2 +} + +// CapRightsSet sets the permissions in setrights in rights. +func CapRightsSet(rights *CapRights, setrights []uint64) error { + // This is essentially a copy of cap_rights_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] |= right + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsClear clears the permissions in clearrights from rights. +func CapRightsClear(rights *CapRights, clearrights []uint64) error { + // This is essentially a copy of cap_rights_vclear() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return errors.New("bad rights size") + } + + for _, right := range clearrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return err + } + if i >= n { + return errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch") + } + rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF) + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return errors.New("index mismatch (after assign)") + } + } + + return nil +} + +// CapRightsIsSet checks whether all the permissions in setrights are present in rights. +func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) { + // This is essentially a copy of cap_rights_is_vset() + if capver(rights) != CAP_RIGHTS_VERSION_00 { + return false, fmt.Errorf("bad rights version %d", capver(rights)) + } + + n := caparsize(rights) + if n < capArSizeMin || n > capArSizeMax { + return false, errors.New("bad rights size") + } + + for _, right := range setrights { + if caprver(right) != CAP_RIGHTS_VERSION_00 { + return false, errors.New("bad right version") + } + i, err := rightToIndex(right) + if err != nil { + return false, err + } + if i >= n { + return false, errors.New("index overflow") + } + if capidxbit(rights.Rights[i]) != capidxbit(right) { + return false, errors.New("index mismatch") + } + if (rights.Rights[i] & right) != right { + return false, nil + } + } + + return true, nil +} + +func capright(idx uint64, bit uint64) uint64 { + return ((1 << (57 + idx)) | bit) +} + +// CapRightsInit returns a pointer to an initialised CapRights structure filled with rights. +// See man cap_rights_init(3) and rights(4). +func CapRightsInit(rights []uint64) (*CapRights, error) { + var r CapRights + r.Rights[0] = (capRightsGoVersion << 62) | capright(0, 0) + r.Rights[1] = capright(1, 0) + + err := CapRightsSet(&r, rights) + if err != nil { + return nil, err + } + return &r, nil +} + +// CapRightsLimit reduces the operations permitted on fd to at most those contained in rights. +// The capability rights on fd can never be increased by CapRightsLimit. +// See man cap_rights_limit(2) and rights(4). +func CapRightsLimit(fd uintptr, rights *CapRights) error { + return capRightsLimit(int(fd), rights) +} + +// CapRightsGet returns a CapRights structure containing the operations permitted on fd. +// See man cap_rights_get(3) and rights(4). +func CapRightsGet(fd uintptr) (*CapRights, error) { + r, err := CapRightsInit(nil) + if err != nil { + return nil, err + } + err = capRightsGet(capRightsGoVersion, int(fd), r) + if err != nil { + return nil, err + } + return r, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/constants.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/constants.go new file mode 100755 index 0000000..a96f0eb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/constants.go @@ -0,0 +1,13 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +const ( + R_OK = 0x4 + W_OK = 0x2 + X_OK = 0x1 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go new file mode 100755 index 0000000..8d1dc0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_darwin.go @@ -0,0 +1,24 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Darwin's sys/types.h header. + +package unix + +// Major returns the major component of a Darwin device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 24) & 0xff) +} + +// Minor returns the minor component of a Darwin device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffffff) +} + +// Mkdev returns a Darwin device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 24) | uint64(minor) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go new file mode 100755 index 0000000..8502f20 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_dragonfly.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in Dragonfly's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a DragonFlyBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a DragonFlyBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a DragonFlyBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go new file mode 100755 index 0000000..eba3b4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_freebsd.go @@ -0,0 +1,30 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in FreeBSD's sys/types.h header. +// +// The information below is extracted and adapted from sys/types.h: +// +// Minor gives a cookie instead of an index since in order to avoid changing the +// meanings of bits 0-15 or wasting time and space shifting bits 16-31 for +// devices that don't use them. + +package unix + +// Major returns the major component of a FreeBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev >> 8) & 0xff) +} + +// Minor returns the minor component of a FreeBSD device number. +func Minor(dev uint64) uint32 { + return uint32(dev & 0xffff00ff) +} + +// Mkdev returns a FreeBSD device number generated from the given major and +// minor components. +func Mkdev(major, minor uint32) uint64 { + return (uint64(major) << 8) | uint64(minor) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go new file mode 100755 index 0000000..d165d6f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_linux.go @@ -0,0 +1,42 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used by the Linux kernel and glibc. +// +// The information below is extracted and adapted from bits/sysmacros.h in the +// glibc sources: +// +// dev_t in glibc is 64-bit, with 32-bit major and minor numbers. glibc's +// default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of the major +// number and m is a hex digit of the minor number. This is backward compatible +// with legacy systems where dev_t is 16 bits wide, encoded as MMmm. It is also +// backward compatible with the Linux kernel, which for some architectures uses +// 32-bit dev_t, encoded as mmmM MMmm. + +package unix + +// Major returns the major component of a Linux device number. +func Major(dev uint64) uint32 { + major := uint32((dev & 0x00000000000fff00) >> 8) + major |= uint32((dev & 0xfffff00000000000) >> 32) + return major +} + +// Minor returns the minor component of a Linux device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x00000000000000ff) >> 0) + minor |= uint32((dev & 0x00000ffffff00000) >> 12) + return minor +} + +// Mkdev returns a Linux device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) & 0x00000fff) << 8 + dev |= (uint64(major) & 0xfffff000) << 32 + dev |= (uint64(minor) & 0x000000ff) << 0 + dev |= (uint64(minor) & 0xffffff00) << 12 + return dev +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go new file mode 100755 index 0000000..b4a203d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_netbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in NetBSD's sys/types.h header. + +package unix + +// Major returns the major component of a NetBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x000fff00) >> 8) +} + +// Minor returns the minor component of a NetBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xfff00000) >> 12) + return minor +} + +// Mkdev returns a NetBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x000fff00 + dev |= (uint64(minor) << 12) & 0xfff00000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go new file mode 100755 index 0000000..f3430c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dev_openbsd.go @@ -0,0 +1,29 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Functions to access/create device major and minor numbers matching the +// encoding used in OpenBSD's sys/types.h header. + +package unix + +// Major returns the major component of an OpenBSD device number. +func Major(dev uint64) uint32 { + return uint32((dev & 0x0000ff00) >> 8) +} + +// Minor returns the minor component of an OpenBSD device number. +func Minor(dev uint64) uint32 { + minor := uint32((dev & 0x000000ff) >> 0) + minor |= uint32((dev & 0xffff0000) >> 8) + return minor +} + +// Mkdev returns an OpenBSD device number generated from the given major and minor +// components. +func Mkdev(major, minor uint32) uint64 { + dev := (uint64(major) << 8) & 0x0000ff00 + dev |= (uint64(minor) << 8) & 0xffff0000 + dev |= (uint64(minor) << 0) & 0x000000ff + return dev +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dirent.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dirent.go new file mode 100755 index 0000000..95fd353 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/dirent.go @@ -0,0 +1,17 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package unix + +import "syscall" + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number of +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + return syscall.ParseDirent(buf, max, names) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_big.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_big.go new file mode 100755 index 0000000..5e92690 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_big.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build ppc64 s390x mips mips64 + +package unix + +const isBigEndian = true diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_little.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_little.go new file mode 100755 index 0000000..085df2d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/endian_little.go @@ -0,0 +1,9 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le + +package unix + +const isBigEndian = false diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/env_unix.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/env_unix.go new file mode 100755 index 0000000..706b3cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/env_unix.go @@ -0,0 +1,31 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Unix environment variables. + +package unix + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go new file mode 100755 index 0000000..c56bc8b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_386.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go new file mode 100755 index 0000000..3e97711 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go @@ -0,0 +1,227 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Constants that were deprecated or moved to enums in the FreeBSD headers. Keep +// them here for backwards compatibility. + +package unix + +const ( + IFF_SMART = 0x20 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8040720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8040720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go new file mode 100755 index 0000000..856dca3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/errors_freebsd_arm.go @@ -0,0 +1,226 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +const ( + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BSC = 0x53 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + + // missing constants on FreeBSD-11.1-RELEASE, copied from old values in ztypes_freebsd_arm.go + IFF_SMART = 0x20 + IFT_FAITH = 0xf2 + IFT_IPXIP = 0xf9 + IPPROTO_MAXID = 0x34 + IPV6_FAITH = 0x1d + IP_FAITH = 0x16 + MAP_NORESERVE = 0x40 + MAP_RENAME = 0x20 + NET_RT_MAXID = 0x6 + RTF_PRCLONING = 0x10000 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + SIOCADDRT = 0x8030720a + SIOCALIFADDR = 0x8118691b + SIOCDELRT = 0x8030720b + SIOCDLIFADDR = 0x8118691d + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCSLIFPHYADDR = 0x8118694a +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/fcntl.go new file mode 100755 index 0000000..0c58c7e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/fcntl.go @@ -0,0 +1,28 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package unix + +import "unsafe" + +// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux +// systems by flock_linux_32bit.go to be SYS_FCNTL64. +var fcntl64Syscall uintptr = SYS_FCNTL + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, err := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(arg)) + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) + if errno == 0 { + return nil + } + return errno +} diff --git a/vendor/golang.org/x/sys/unix/flock_linux_32bit.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go similarity index 100% rename from vendor/golang.org/x/sys/unix/flock_linux_32bit.go rename to vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo.go new file mode 100755 index 0000000..50062e3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo.go @@ -0,0 +1,61 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +package unix + +import "syscall" + +// We can't use the gc-syntax .s files for gccgo. On the plus side +// much of the functionality can be written directly in Go. + +//extern gccgoRealSyscallNoError +func realSyscallNoError(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r uintptr) + +//extern gccgoRealSyscall +func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) + +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + syscall.Entersyscall() + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0 +} + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) { + r := realSyscallNoError(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0 +} + +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} + +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c new file mode 100755 index 0000000..24e96b1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -0,0 +1,47 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +#include +#include +#include + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +// Call syscall from C code because the gccgo support for calling from +// Go to C does not support varargs functions. + +struct ret { + uintptr_t r; + uintptr_t err; +}; + +struct ret +gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + struct ret r; + + errno = 0; + r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); + r.err = errno; + return r; +} + +uintptr_t +gccgoRealSyscallNoError(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + return syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); +} + +// Define the use function in C so that it is not inlined. + +extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline)); + +void +use(void *p __attribute__ ((unused))) +{ +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go new file mode 100755 index 0000000..251a977 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -0,0 +1,20 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo,linux,amd64 + +package unix + +import "syscall" + +//extern gettimeofday +func realGettimeofday(*Timeval, *byte) int32 + +func gettimeofday(tv *Timeval) (err syscall.Errno) { + r := realGettimeofday(tv, nil) + if r < 0 { + return syscall.GetErrno() + } + return 0 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkall.sh new file mode 100755 index 0000000..1715122 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkall.sh @@ -0,0 +1,188 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This script runs or (given -n) prints suggested commands to generate files for +# the Architecture/OS specified by the GOARCH and GOOS environment variables. +# See README.md for more information about how the build system works. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" +cmd="" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + # Run the command line that appears in the first line + # of the generated file to regenerate it. + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + cmd="echo" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + # Use then new build system + # Files generated through docker (use $cmd so you can Ctl-C the build or run) + $cmd docker build --tag generate:$GOOS $GOOS + $cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS + exit +fi + +GOOSARCH_in=syscall_$GOOSARCH.go +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +darwin_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_amd64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm) + mkerrors="$mkerrors" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_amd64) + mkerrors="$mkerrors -m64" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_sparc64) + GOOSARCH_in=syscall_linux_sparc64.go + unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -netbsd -arm" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +openbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -openbsd -arm" + mksysctl="./mksysctl_openbsd.pl" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +solaris_amd64) + mksyscall="./mksyscall_solaris.pl" + mkerrors="$mkerrors -m64" + mksysnum= + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + *) + syscall_goos="syscall_$GOOS.go" + case "$GOOS" in + darwin | dragonfly | freebsd | netbsd | openbsd) + syscall_goos="syscall_bsd.go $syscall_goos" + ;; + esac + if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then + echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go"; + fi +) | $run diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh new file mode 100755 index 0000000..a1c5c37 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -0,0 +1,596 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +if test -z "$GOARCH" -o -z "$GOOS"; then + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 +fi + +# Check that we are using the new build system if we should +if [[ "$GOOS" = "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then + if [[ "$GOLANG_SYS_BUILD" != "docker" ]]; then + echo 1>&2 "In the new build system, mkerrors should not be called directly." + echo 1>&2 "See README.md" + exit 1 + fi +fi + +CC=${CC:-cc} + +if [[ "$GOOS" = "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi + +uname=$(uname) + +includes_Darwin=' +#define _DARWIN_C_SOURCE +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_DragonFly=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + +includes_FreeBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __FreeBSD__ >= 10 +#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 +#undef SIOCAIFADDR +#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data +#undef SIOCSIFPHYADDR +#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data +#endif +' + +includes_Linux=' +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#ifndef __LP64__ +#define _FILE_OFFSET_BITS 64 +#endif +#define _GNU_SOURCE + +// is broken on powerpc64, as it fails to include definitions of +// these structures. We just include them copied from . +#if defined(__powerpc__) +struct sgttyb { + char sg_ispeed; + char sg_ospeed; + char sg_erase; + char sg_kill; + short sg_flags; +}; + +struct tchars { + char t_intrc; + char t_quitc; + char t_startc; + char t_stopc; + char t_eofc; + char t_brkc; +}; + +struct ltchars { + char t_suspc; + char t_dsuspc; + char t_rprntc; + char t_flushc; + char t_werasc; + char t_lnextc; +}; +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MSG_FASTOPEN +#define MSG_FASTOPEN 0x20000000 +#endif + +#ifndef PTRACE_GETREGS +#define PTRACE_GETREGS 0xc +#endif + +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS 0xd +#endif + +#ifndef SOL_NETLINK +#define SOL_NETLINK 270 +#endif + +#ifdef SOL_BLUETOOTH +// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h +// but it is already in bluetooth_linux.go +#undef SOL_BLUETOOTH +#endif + +// Certain constants are missing from the fs/crypto UAPI +#define FS_KEY_DESC_PREFIX "fscrypt:" +#define FS_KEY_DESC_PREFIX_SIZE 8 +#define FS_MAX_KEY_SIZE 64 +' + +includes_NetBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Needed since refers to it... +#define schedppq 1 +' + +includes_OpenBSD=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 +' + +includes_SunOS=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' + + +includes=' +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +' +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package unix + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo 'import "syscall"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + $2 ~ /^ELF_.*$/ {next}# contains ELF_ARCH, etc. + + $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || + $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 ~ /^(OLD|NEW)DEV$/ || + $2 == "BOTHER" || + $2 ~ /^CI?BAUD(EX)?$/ || + $2 == "IBSHIFT" || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 !~ "X86_CR3_PCID_NOFLUSH" && + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 == "XCASE" || + $2 == "ALTWERASE" || + $2 == "NOKERNINFO" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || + $2 ~ /^O?XTABS$/ || + $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|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^FALLOC_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(HW|KERN|MAXNAME|NET|QUERY)$/ || + $2 ~ /^KERN_(HOSTNAME|OS(RELEASE|TYPE)|VERSION)$/ || + $2 ~ /^HW_MACHINE$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|E?FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^CLOCK_/ || + $2 ~ /^CAN_/ || + $2 ~ /^CAP_/ || + $2 ~ /^ALG_/ || + $2 ~ /^FS_(POLICY_FLAGS|KEY_DESC|ENCRYPTION_MODE|[A-Z0-9_]+_KEY_SIZE|IOC_(GET|SET)_ENCRYPTION)/ || + $2 ~ /^GRND_/ || + $2 ~ /^KEY_(SPEC|REQKEY_DEFL)_/ || + $2 ~ /^KEYCTL_/ || + $2 ~ /^PERF_EVENT_IOC_/ || + $2 ~ /^SECCOMP_MODE_/ || + $2 ~ /^SPLICE_/ || + $2 ~ /^(VM|VMADDR)_/ || + $2 ~ /^IOCTL_VM_SOCKETS_/ || + $2 ~ /^(TASKSTATS|TS)_/ || + $2 ~ /^CGROUPSTATS_/ || + $2 ~ /^GENL_/ || + $2 ~ /^STATX_/ || + $2 ~ /^UTIME_/ || + $2 ~ /^XATTR_(CREATE|REPLACE)/ || + $2 ~ /^ATTR_(BIT_MAP_COUNT|(CMN|VOL|FILE)_)/ || + $2 ~ /^FSOPT_/ || + $2 ~ /^WDIOC_/ || + $2 ~ /^(HDIO|WIN|SMART)_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ || + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include ' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// Code generated by the command above; see README.md. DO NOT EDIT.' +echo +echo "// +build ${GOARCH},${GOOS}" +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include +#include +#include +#include +#include +#include + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +struct tuple { + int num; + const char *name; +}; + +struct tuple errors[] = { +" + for i in $errors + do + echo -E ' {'$i', "'$i'" },' + done + + echo -E " +}; + +struct tuple signals[] = { +" + for i in $signals + do + echo -E ' {'$i', "'$i'" },' + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +tuplecmp(const void *a, const void *b) +{ + return ((struct tuple *)a)->num - ((struct tuple *)b)->num; +} + +int +main(void) +{ + int i, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errorList = [...]struct {\n"); + printf("\tnum syscall.Errno\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(errors, nelem(errors), sizeof errors[0], tuplecmp); + for(i=0; i 0 && errors[i-1].num == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, errors[i].name, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signalList = [...]struct {\n"); + printf("\tnum syscall.Signal\n"); + printf("\tname string\n"); + printf("\tdesc string\n"); + printf("} {\n"); + qsort(signals, nelem(signals), sizeof signals[0], tuplecmp); + for(i=0; i 0 && signals[i-1].num == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t{ %d, \"%s\", \"%s\" },\n", e, signals[i].name, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100755 index 0000000..c28e42b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,98 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs; see README.md. +package main + +import ( + "bytes" + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + // Get the OS and architecture (using GOARCH_TARGET if it exists) + goos := os.Getenv("GOOS") + goarch := os.Getenv("GOARCH_TARGET") + if goarch == "" { + goarch = os.Getenv("GOARCH") + } + // Check that we are using the new build system if we should be. + if goos == "linux" && goarch != "sparc64" { + if os.Getenv("GOLANG_SYS_BUILD") != "docker" { + os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n") + os.Stderr.WriteString("See README.md\n") + os.Exit(1) + } + } + + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + // 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}")) + + // If we have empty Ptrace structs, we should delete them. Only s390x emits + // nonempty Ptrace structs. + ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`) + b = ptraceRexexp.ReplaceAll(b, nil) + + // Replace the control_regs union with a blank identifier for now. + controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`) + b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64")) + + // Remove fields that are added by glibc + // Note that this is unstable as the identifers are private. + removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Convert [65]int8 to [65]byte in Utsname members to simplify + // conversion to string; see golang.org/issue/20753 + convertUtsnameRegex := regexp.MustCompile(`((Sys|Node|Domain)name|Release|Version|Machine)(\s+)\[(\d+)\]u?int8`) + b = convertUtsnameRegex.ReplaceAll(b, []byte("$1$3[$4]byte")) + + // Remove spare fields (e.g. in Statx_t) + spareFieldsRegex := regexp.MustCompile(`X__spare\S*`) + b = spareFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove cgo padding fields + removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`) + b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove padding, hidden, or unused fields + removeFieldsRegex = regexp.MustCompile(`\bX_\S+`) + b = removeFieldsRegex.ReplaceAll(b, []byte("_")) + + // Remove the first line of warning from cgo + b = b[bytes.IndexByte(b, '\n')+1:] + // Modify the command in the header to include: + // mkpost, our own warning, and a build tag. + replacement := fmt.Sprintf(`$1 | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build %s,%s`, goarch, goos) + cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`) + b = cgoCommandRegex.ReplaceAll(b, []byte(replacement)) + + // gofmt + b, err = format.Source(b) + if err != nil { + log.Fatal(err) + } + + os.Stdout.Write(b) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100755 index 0000000..1f6b926 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,341 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair +my $tags = ""; # build tags + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} +if($ARGV[0] eq "-tags") { + shift; + $tags = $ARGV[0]; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n"; + exit 1; +} + +# Check that we are using the new build system if we should +if($ENV{'GOOS'} eq "linux" && $ENV{'GOARCH'} ne "sparc64") { + if($ENV{'GOLANG_SYS_BUILD'} ne "docker") { + print STDERR "In the new build system, mksyscall should not be called directly.\n"; + print STDERR "See README.md\n"; + exit 1; + } +} + + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "RawSyscallNoError"; + } else { + $asm = "RawSyscall"; + } + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + $asm = "SyscallNoError"; + } + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + if ($errvar eq "" && $ENV{'GOOS'} eq "linux") { + # raw syscall without error on Linux, see golang.org/issue/22924 + $text .= "\t$ret[0], $ret[1] := $call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print < "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 <){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '13' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print < uint64(len(b)) { + return nil, nil, EINVAL + } + return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil +} + +// UnixRights encodes a set of open file descriptors into a socket +// control message for sending to another process. +func UnixRights(fds ...int) []byte { + datalen := len(fds) * 4 + b := make([]byte, CmsgSpace(datalen)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_RIGHTS + h.SetLen(CmsgLen(datalen)) + data := cmsgData(h) + for _, fd := range fds { + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) + } + return b +} + +// ParseUnixRights decodes a socket control message that contains an +// integer array of open file descriptors from another process. +func ParseUnixRights(m *SocketControlMessage) ([]int, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_RIGHTS { + return nil, EINVAL + } + fds := make([]int, len(m.Data)>>2) + for i, j := 0, 0; i < len(m.Data); i += 4 { + fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) + j++ + } + return fds, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/str.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/str.go new file mode 100755 index 0000000..35ed664 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/str.go @@ -0,0 +1,26 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + uitoa(uint(-val)) + } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall.go new file mode 100755 index 0000000..ef35fce --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall.go @@ -0,0 +1,54 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Package unix contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display OS-specific documentation for the current +// system. If you want godoc to display OS documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package unix // import "golang.org/x/sys/unix" + +import "strings" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + if strings.IndexByte(s, 0) != -1 { + return nil, EINVAL + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mkunix.pl. +var _zero uintptr diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go new file mode 100755 index 0000000..53fb851 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -0,0 +1,624 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +// BSD system call wrappers shared by *BSD based systems +// including OS X (Darwin) and FreeBSD. Like the other +// syscall_*.go files it is compiled as Go code but also +// used as input to mksyscall which parses the //sys +// lines and generates system call stubs. + +package unix + +import ( + "runtime" + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys Shutdown(s int, how int) (err error) + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Index == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = sa.Len + sa.raw.Family = AF_LINK + sa.raw.Index = sa.Index + sa.raw.Type = sa.Type + sa.raw.Nlen = sa.Nlen + sa.raw.Alen = sa.Alen + sa.raw.Slen = sa.Slen + for i := 0; i < len(sa.raw.Data); i++ { + sa.raw.Data[i] = sa.Data[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_LINK: + pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) + sa := new(SockaddrDatalink) + sa.Len = pp.Len + sa.Family = pp.Family + sa.Index = pp.Index + sa.Type = pp.Type + sa.Nlen = pp.Nlen + sa.Alen = pp.Alen + sa.Slen = pp.Slen + for i := 0; i < len(sa.Data); i++ { + sa.Data[i] = pp.Data[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { + return nil, EINVAL + } + sa := new(SockaddrUnix) + + // Some BSDs include the trailing NUL in the length, whereas + // others do not. Work around this by subtracting the leading + // family and len. The path is then scanned to see if a NUL + // terminator still exists within the length. + n := int(pp.Len) - 2 // subtract leading Family, Len + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + // found early NUL; assume Len included the NUL + // or was overestimating. + n = i + break + } + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be + // reported upstream. + if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { + rsa.Addr.Family = AF_UNIX + rsa.Addr.Len = SizeofSockaddrUnix + } + return anyToSockaddr(&rsa) +} + +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) + +func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { + var change, event unsafe.Pointer + if len(changes) > 0 { + change = unsafe.Pointer(&changes[0]) + } + if len(events) > 0 { + event = unsafe.Pointer(&events[0]) + } + return kevent(kq, change, len(changes), event, len(events), timeout) +} + +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL + +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { + // Translate name to mib number. + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + buf, err := SysctlRaw(name, args...) + if err != nil { + return "", err + } + n := len(buf) + + // Throw away terminating NUL. + if n > 0 && buf[n-1] == '\x00' { + n-- + } + return string(buf[0:n]), nil +} + +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(4) + buf := make([]byte, 4) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 4 { + return 0, EIO + } + return *(*uint32)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + // Darwin setattrlist can set nanosecond timestamps + err := setattrlistTimes(path, ts, 0) + if err != ENOSYS { + return err + } + err = utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + err := setattrlistTimes(path, ts, flags) + if err != ENOSYS { + return err + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimes(fd int, timeval *[2]Timeval) (err error) + +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +// TODO: wrap +// Acct(name nil-string) (err error) +// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, behav int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go new file mode 100755 index 0000000..693be79 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -0,0 +1,602 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Darwin system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "errors" + "syscall" + "unsafe" +) + +const ImplementsGetwd = true + +func Getwd() (string, error) { + buf := make([]byte, 2048) + attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) + if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { + wd := string(attrs[0]) + // Sanity check that it's an absolute path and ends + // in a null byte, which we then strip. + if wd[0] == '/' && wd[len(wd)-1] == 0 { + return wd[:len(wd)-1], nil + } + } + // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the + // slow algorithm. + return "", ENOTSUP +} + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } +func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } + +const ( + attrBitMapCount = 5 + attrCmnFullpath = 0x08000000 +) + +type attrList struct { + bitmapCount uint16 + _ uint16 + CommonAttr uint32 + VolAttr uint32 + DirAttr uint32 + FileAttr uint32 + Forkattr uint32 +} + +func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { + if len(attrBuf) < 4 { + return nil, errors.New("attrBuf too small") + } + attrList.bitmapCount = attrBitMapCount + + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return nil, err + } + + _, _, e1 := Syscall6( + SYS_GETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attrBuf[0])), + uintptr(len(attrBuf)), + uintptr(options), + 0, + ) + if e1 != 0 { + return nil, e1 + } + size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) + + // dat is the section of attrBuf that contains valid data, + // without the 4 byte length header. All attribute offsets + // are relative to dat. + dat := attrBuf + if int(size) < len(attrBuf) { + dat = dat[:size] + } + dat = dat[4:] // remove length prefix + + for i := uint32(0); int(i) < len(dat); { + header := dat[i:] + if len(header) < 8 { + return attrs, errors.New("truncated attribute header") + } + datOff := *(*int32)(unsafe.Pointer(&header[0])) + attrLen := *(*uint32)(unsafe.Pointer(&header[4])) + if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { + return attrs, errors.New("truncated results; attrBuf too small") + } + end := uint32(datOff) + attrLen + attrs = append(attrs, dat[datOff:end]) + i = end + if r := i % 4; r != 0 { + i += (4 - r) + } + } + return +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + _p0, err := BytePtrFromString(path) + if err != nil { + return err + } + + var attrList attrList + attrList.bitmapCount = ATTR_BIT_MAP_COUNT + attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME + + // order is mtime, atime: the opposite of Chtimes + attributes := [2]Timespec{times[1], times[0]} + options := 0 + if flags&AT_SYMLINK_NOFOLLOW != 0 { + options |= FSOPT_NOFOLLOW + } + _, _, e1 := Syscall6( + SYS_SETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attributes)), + uintptr(unsafe.Sizeof(attributes)), + uintptr(options), + 0, + ) + if e1 != 0 { + return e1 + } + return nil +} + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error { + // Darwin doesn't support SYS_UTIMENSAT + return ENOSYS +} + +/* + * Wrapped + */ + +//sys kill(pid int, signum int, posix int) (err error) + +func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exchangedata(path1 string, path2 string, options int) (err error) +//sys Exit(code int) +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 +//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_GETDIRENTRIES64 +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setprivexec(flag int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// sendfile +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go new file mode 100755 index 0000000..b3ac109 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -0,0 +1,68 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go new file mode 100755 index 0000000..7521944 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -0,0 +1,68 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +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) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go new file mode 100755 index 0000000..faae207 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -0,0 +1,66 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go new file mode 100755 index 0000000..d6d9628 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -0,0 +1,68 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +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) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go new file mode 100755 index 0000000..b5072de --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -0,0 +1,523 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// DragonFly BSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { + return extpread(fd, p, 0, offset) +} + +//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + return extpwrite(fd, p, 0, offset) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func sysctlUname(mib []_C_int, old *byte, oldlen *uintptr) error { + err := sysctl(mib, old, oldlen, nil, 0) + if err != nil { + // Utsname members on Dragonfly are only 32 bytes and + // the syscall returns ENOMEM in case the actual value + // is longer. + if err == ENOMEM { + err = nil + } + } + return err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctlUname(mib, &uname.Sysname[0], &n); err != nil { + return err + } + uname.Sysname[unsafe.Sizeof(uname.Sysname)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctlUname(mib, &uname.Nodename[0], &n); err != nil { + return err + } + uname.Nodename[unsafe.Sizeof(uname.Nodename)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctlUname(mib, &uname.Release[0], &n); err != nil { + return err + } + uname.Release[unsafe.Sizeof(uname.Release)-1] = 0 + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctlUname(mib, &uname.Version[0], &n); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctlUname(mib, &uname.Machine[0], &n); err != nil { + return err + } + uname.Machine[unsafe.Sizeof(uname.Machine)-1] = 0 + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//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 Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go new file mode 100755 index 0000000..9babb31 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +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) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go new file mode 100755 index 0000000..ba9df4a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -0,0 +1,756 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "strings" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, errno +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +// Derive extattr namespace and attribute name + +func xattrnamespace(fullattr string) (ns int, attr string, err error) { + s := strings.IndexByte(fullattr, '.') + if s == -1 { + return -1, "", ENOATTR + } + + namespace := fullattr[0:s] + attr = fullattr[s+1:] + + switch namespace { + case "user": + return EXTATTR_NAMESPACE_USER, attr, nil + case "system": + return EXTATTR_NAMESPACE_SYSTEM, attr, nil + default: + return -1, "", ENOATTR + } +} + +func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { + if len(dest) > idx { + return unsafe.Pointer(&dest[idx]) + } else { + return unsafe.Pointer(_zero) + } +} + +// FreeBSD implements its own syscalls to handle extended attributes + +func Getxattr(file string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) +} + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) +} + +// flags are unused on FreeBSD + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) + return +} + +func Setxattr(file string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) + return +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) + return +} + +func Removexattr(file string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFile(file, nsid, a) + return +} + +func Fremovexattr(fd int, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFd(fd, nsid, a) + return +} + +func Lremovexattr(link string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteLink(link, nsid, a) + return +} + +func Listxattr(file string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + // FreeBSD won't allow you to list xattrs from multiple namespaces + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) + + /* Errors accessing system attrs are ignored so that + * we can implement the Linux-like behavior of omitting errors that + * we don't have read permissions on + * + * Linux will still error if we ask for user attributes on a file that + * we don't have read permissions on, so don't ignore those errors + */ + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, nil +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys CapEnter() (err error) +//sys capRightsGet(version int, fd int, rightsp *CapRights) (err error) = SYS___CAP_RIGHTS_GET +//sys capRightsLimit(fd int, rightsp *CapRights) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Linkat(pathfd int, path string, linkfd int, link string, flags int) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(fromfd int, from string, tofd int, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go new file mode 100755 index 0000000..21e0395 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go new file mode 100755 index 0000000..9c945a6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -0,0 +1,52 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +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) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go new file mode 100755 index 0000000..5cd6243 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -0,0 +1,52 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go new file mode 100755 index 0000000..04f38c5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -0,0 +1,1474 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Linux system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +func Access(path string, mode uint32) (err error) { + return Faccessat(AT_FDCWD, path, mode, 0) +} + +func Chmod(path string, mode uint32) (err error) { + return Fchmodat(AT_FDCWD, path, mode, 0) +} + +func Chown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, 0) +} + +func Creat(path string, mode uint32) (fd int, err error) { + return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) +} + +//sys fchmodat(dirfd int, path string, mode uint32) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior + // and check the flags. Otherwise the mode would be applied to the symlink + // destination which is not what the user expects. + if flags&^AT_SYMLINK_NOFOLLOW != 0 { + return EINVAL + } else if flags&AT_SYMLINK_NOFOLLOW != 0 { + return EOPNOTSUPP + } + return fchmodat(dirfd, path, mode) +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) + +func Link(oldpath string, newpath string) (err error) { + return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) +} + +func Mkdir(path string, mode uint32) (err error) { + return Mkdirat(AT_FDCWD, path, mode) +} + +func Mknod(path string, mode uint32, dev int) (err error) { + return Mknodat(AT_FDCWD, path, mode, dev) +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) +} + +//sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + return openat(dirfd, path, flags|O_LARGEFILE, mode) +} + +//sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) + +func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + if len(fds) == 0 { + return ppoll(nil, 0, timeout, sigmask) + } + return ppoll(&fds[0], len(fds), timeout, sigmask) +} + +//sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) + +func Readlink(path string, buf []byte) (n int, err error) { + return Readlinkat(AT_FDCWD, path, buf) +} + +func Rename(oldpath string, newpath string) (err error) { + return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) +} + +func Rmdir(path string) error { + return Unlinkat(AT_FDCWD, path, AT_REMOVEDIR) +} + +//sys Symlinkat(oldpath string, newdirfd int, newpath string) (err error) + +func Symlink(oldpath string, newpath string) (err error) { + return Symlinkat(oldpath, AT_FDCWD, newpath) +} + +func Unlink(path string) error { + return Unlinkat(AT_FDCWD, path, 0) +} + +//sys Unlinkat(dirfd int, path string, flags int) (err error) + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + var ts [2]Timespec + ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) + ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // If the utimensat syscall isn't available (utimensat was added to Linux + // in 2.6.22, Released, 8 July 2007) then fall back to utimes + var tv [2]Timeval + for i := 0; i < 2; i++ { + tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Futimes(fd int, tv []Timeval) (err error) { + // Believe it or not, this is the best we can do on Linux + // (and is what glibc does). + return Utimes("/proc/self/fd/"+itoa(fd), tv) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() syscall.Signal { + if !w.Signaled() { + return -1 + } + return syscall.Signal(w & mask) +} + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { + if w.StopSignal() != SIGTRAP { + return -1 + } + return int(w>>shift) >> 8 +} + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +func Mkfifo(path string, mode uint32) error { + return Mknod(path, mode|S_IFIFO, 0) +} + +func Mkfifoat(dirfd int, path string, mode uint32) error { + return Mknodat(dirfd, path, mode|S_IFIFO, 0) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +// SockaddrLinklayer implements the Sockaddr interface for AF_PACKET type sockets. +type SockaddrLinklayer struct { + Protocol uint16 + Ifindex int + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]byte + raw RawSockaddrLinklayer +} + +func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_PACKET + sa.raw.Protocol = sa.Protocol + sa.raw.Ifindex = int32(sa.Ifindex) + sa.raw.Hatype = sa.Hatype + sa.raw.Pkttype = sa.Pkttype + sa.raw.Halen = sa.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil +} + +// SockaddrNetlink implements the Sockaddr interface for AF_NETLINK type sockets. +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil +} + +// SockaddrHCI implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the HCI protocol. +type SockaddrHCI struct { + Dev uint16 + Channel uint16 + raw RawSockaddrHCI +} + +func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Dev = sa.Dev + sa.raw.Channel = sa.Channel + return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil +} + +// SockaddrL2 implements the Sockaddr interface for AF_BLUETOOTH type sockets +// using the L2CAP protocol. +type SockaddrL2 struct { + PSM uint16 + CID uint16 + Addr [6]uint8 + AddrType uint8 + raw RawSockaddrL2 +} + +func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm)) + psm[0] = byte(sa.PSM) + psm[1] = byte(sa.PSM >> 8) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i] + } + cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid)) + cid[0] = byte(sa.CID) + cid[1] = byte(sa.CID >> 8) + sa.raw.Bdaddr_type = sa.AddrType + return unsafe.Pointer(&sa.raw), SizeofSockaddrL2, nil +} + +// SockaddrCAN implements the Sockaddr interface for AF_CAN type sockets. +// The RxID and TxID fields are used for transport protocol addressing in +// (CAN_TP16, CAN_TP20, CAN_MCNET, and CAN_ISOTP), they can be left with +// zero values for CAN_RAW and CAN_BCM sockets as they have no meaning. +// +// The SockaddrCAN struct must be bound to the socket file descriptor +// using Bind before the CAN socket can be used. +// +// // Read one raw CAN frame +// fd, _ := Socket(AF_CAN, SOCK_RAW, CAN_RAW) +// addr := &SockaddrCAN{Ifindex: index} +// Bind(fd, addr) +// frame := make([]byte, 16) +// Read(fd, frame) +// +// The full SocketCAN documentation can be found in the linux kernel +// archives at: https://www.kernel.org/doc/Documentation/networking/can.txt +type SockaddrCAN struct { + Ifindex int + RxID uint32 + TxID uint32 + raw RawSockaddrCAN +} + +func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_CAN + sa.raw.Ifindex = int32(sa.Ifindex) + rx := (*[4]byte)(unsafe.Pointer(&sa.RxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i] = rx[i] + } + tx := (*[4]byte)(unsafe.Pointer(&sa.TxID)) + for i := 0; i < 4; i++ { + sa.raw.Addr[i+4] = tx[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil +} + +// SockaddrALG implements the Sockaddr interface for AF_ALG type sockets. +// SockaddrALG enables userspace access to the Linux kernel's cryptography +// subsystem. The Type and Name fields specify which type of hash or cipher +// should be used with a given socket. +// +// To create a file descriptor that provides access to a hash or cipher, both +// Bind and Accept must be used. Once the setup process is complete, input +// data can be written to the socket, processed by the kernel, and then read +// back as hash output or ciphertext. +// +// Here is an example of using an AF_ALG socket with SHA1 hashing. +// The initial socket setup process is as follows: +// +// // Open a socket to perform SHA1 hashing. +// fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0) +// addr := &unix.SockaddrALG{Type: "hash", Name: "sha1"} +// unix.Bind(fd, addr) +// // Note: unix.Accept does not work at this time; must invoke accept() +// // manually using unix.Syscall. +// hashfd, _, _ := unix.Syscall(unix.SYS_ACCEPT, uintptr(fd), 0, 0) +// +// Once a file descriptor has been returned from Accept, it may be used to +// perform SHA1 hashing. The descriptor is not safe for concurrent use, but +// may be re-used repeatedly with subsequent Write and Read operations. +// +// When hashing a small byte slice or string, a single Write and Read may +// be used: +// +// // Assume hashfd is already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash an input string and read the results. Each Write discards +// // previous hash state. Read always reads the current state. +// b := make([]byte, 20) +// for i := 0; i < 2; i++ { +// io.WriteString(hash, "Hello, world.") +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// } +// // Output: +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// // 2ae01472317d1935a84797ec1983ae243fc6aa28 +// +// For hashing larger byte slices, or byte streams such as those read from +// a file or socket, use Sendto with MSG_MORE to instruct the kernel to update +// the hash digest instead of creating a new one for a given chunk and finalizing it. +// +// // Assume hashfd and addr are already configured using the setup process. +// hash := os.NewFile(hashfd, "sha1") +// // Hash the contents of a file. +// f, _ := os.Open("/tmp/linux-4.10-rc7.tar.xz") +// b := make([]byte, 4096) +// for { +// n, err := f.Read(b) +// if err == io.EOF { +// break +// } +// unix.Sendto(hashfd, b[:n], unix.MSG_MORE, addr) +// } +// hash.Read(b) +// fmt.Println(hex.EncodeToString(b)) +// // Output: 85cdcad0c06eef66f805ecce353bec9accbeecc5 +// +// For more information, see: http://www.chronox.de/crypto-API/crypto/userspace-if.html. +type SockaddrALG struct { + Type string + Name string + Feature uint32 + Mask uint32 + raw RawSockaddrALG +} + +func (sa *SockaddrALG) sockaddr() (unsafe.Pointer, _Socklen, error) { + // Leave room for NUL byte terminator. + if len(sa.Type) > 13 { + return nil, 0, EINVAL + } + if len(sa.Name) > 63 { + return nil, 0, EINVAL + } + + sa.raw.Family = AF_ALG + sa.raw.Feat = sa.Feature + sa.raw.Mask = sa.Mask + + typ, err := ByteSliceFromString(sa.Type) + if err != nil { + return nil, 0, err + } + name, err := ByteSliceFromString(sa.Name) + if err != nil { + return nil, 0, err + } + + copy(sa.raw.Type[:], typ) + copy(sa.raw.Name[:], name) + + return unsafe.Pointer(&sa.raw), SizeofSockaddrALG, nil +} + +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Linux VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, nil + + case AF_PACKET: + pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) + sa := new(SockaddrLinklayer) + sa.Protocol = pp.Protocol + sa.Ifindex = int(pp.Ifindex) + sa.Hatype = pp.Hatype + sa.Pkttype = pp.Pkttype + sa.Halen = pp.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + if pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := _Socklen(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { + var value TCPInfo + vallen := _Socklen(SizeofTCPInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + if err == ERANGE { + buf = make([]byte, vallen) + err = getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + } + if err != nil { + return "", err + } + } + return string(buf[:vallen-1]), nil +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +// Keyctl Commands (http://man7.org/linux/man-pages/man2/keyctl.2.html) + +// KeyctlInt calls keyctl commands in which each argument is an int. +// These commands are KEYCTL_REVOKE, KEYCTL_CHOWN, KEYCTL_CLEAR, KEYCTL_LINK, +// KEYCTL_UNLINK, KEYCTL_NEGATE, KEYCTL_SET_REQKEY_KEYRING, KEYCTL_SET_TIMEOUT, +// KEYCTL_ASSUME_AUTHORITY, KEYCTL_SESSION_TO_PARENT, KEYCTL_REJECT, +// KEYCTL_INVALIDATE, and KEYCTL_GET_PERSISTENT. +//sys KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlBuffer calls keyctl commands in which the third and fourth +// arguments are a buffer and its length, respectively. +// These commands are KEYCTL_UPDATE, KEYCTL_READ, and KEYCTL_INSTANTIATE. +//sys KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlString calls keyctl commands which return a string. +// These commands are KEYCTL_DESCRIBE and KEYCTL_GET_SECURITY. +func KeyctlString(cmd int, id int) (string, error) { + // We must loop as the string data may change in between the syscalls. + // We could allocate a large buffer here to reduce the chance that the + // syscall needs to be called twice; however, this is unnecessary as + // the performance loss is negligible. + var buffer []byte + for { + // Try to fill the buffer with data + length, err := KeyctlBuffer(cmd, id, buffer, 0) + if err != nil { + return "", err + } + + // Check if the data was written + if length <= len(buffer) { + // Exclude the null terminator + return string(buffer[:length-1]), nil + } + + // Make a bigger buffer if needed + buffer = make([]byte, length) + } +} + +// Keyctl commands with special signatures. + +// KeyctlGetKeyringID implements the KEYCTL_GET_KEYRING_ID command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_get_keyring_ID.3.html +func KeyctlGetKeyringID(id int, create bool) (ringid int, err error) { + createInt := 0 + if create { + createInt = 1 + } + return KeyctlInt(KEYCTL_GET_KEYRING_ID, id, createInt, 0, 0) +} + +// KeyctlSetperm implements the KEYCTL_SETPERM command. The perm value is the +// key handle permission mask as described in the "keyctl setperm" section of +// http://man7.org/linux/man-pages/man1/keyctl.1.html. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_setperm.3.html +func KeyctlSetperm(id int, perm uint32) error { + _, err := KeyctlInt(KEYCTL_SETPERM, id, int(perm), 0, 0) + return err +} + +//sys keyctlJoin(cmd int, arg2 string) (ret int, err error) = SYS_KEYCTL + +// KeyctlJoinSessionKeyring implements the KEYCTL_JOIN_SESSION_KEYRING command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_join_session_keyring.3.html +func KeyctlJoinSessionKeyring(name string) (ringid int, err error) { + return keyctlJoin(KEYCTL_JOIN_SESSION_KEYRING, name) +} + +//sys keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) = SYS_KEYCTL + +// KeyctlSearch implements the KEYCTL_SEARCH command. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_search.3.html +func KeyctlSearch(ringid int, keyType, description string, destRingid int) (id int, err error) { + return keyctlSearch(KEYCTL_SEARCH, ringid, keyType, description, destRingid) +} + +//sys keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) = SYS_KEYCTL + +// KeyctlInstantiateIOV implements the KEYCTL_INSTANTIATE_IOV command. This +// command is similar to KEYCTL_INSTANTIATE, except that the payload is a slice +// of Iovec (each of which represents a buffer) instead of a single buffer. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_instantiate_iov.3.html +func KeyctlInstantiateIOV(id int, payload []Iovec, ringid int) error { + return keyctlIOV(KEYCTL_INSTANTIATE_IOV, id, payload, ringid) +} + +//sys keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) = SYS_KEYCTL + +// KeyctlDHCompute implements the KEYCTL_DH_COMPUTE command. This command +// computes a Diffie-Hellman shared secret based on the provide params. The +// secret is written to the provided buffer and the returned size is the number +// of bytes written (returning an error if there is insufficient space in the +// buffer). If a nil buffer is passed in, this function returns the minimum +// buffer length needed to store the appropriate data. Note that this differs +// from KEYCTL_READ's behavior which always returns the requested payload size. +// See the full documentation at: +// http://man7.org/linux/man-pages/man3/keyctl_dh_compute.3.html +func KeyctlDHCompute(params *KeyctlDHParams, buffer []byte) (size int, err error) { + return keyctlDH(KEYCTL_DH_COMPUTE, params, buffer) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return + } + // receive at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(ptr) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = &p[0] + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + if len(p) == 0 { + var sockType int + sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE) + if err != nil { + return 0, err + } + // send at least one normal byte + if sockType != SOCK_DGRAM { + iov.Base = &dummy + iov.SetLen(1) + } + } + msg.Control = &oob[0] + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (err error) { + return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + +func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { + // The peek requests are machine-size oriented, so we wrap it + // to retrieve arbitrary-length data. + + // The ptrace syscall differs from glibc's ptrace. + // Peeks returns the word in *data, not as the return value. + + var buf [sizeofPtr]byte + + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // access (PEEKUSER warns that it might), but if we don't + // align our reads, we might straddle an unmapped page + // boundary and not get the bytes leading up to the page + // boundary. + n := 0 + if addr%sizeofPtr != 0 { + err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(out, buf[addr%sizeofPtr:]) + out = out[n:] + } + + // Remainder. + for len(out) > 0 { + // We use an internal buffer to guarantee alignment. + // It's not documented if this is necessary, but we're paranoid. + err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copied := copy(out, buf[0:]) + n += copied + out = out[copied:] + } + + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) +} + +func PtracePeekUser(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKUSR, pid, addr, out) +} + +func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { + // As for ptracePeek, we need to align our accesses to deal + // with the possibility of straddling an invalid page. + + // Leading edge. + n := 0 + if addr%sizeofPtr != 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(buf[addr%sizeofPtr:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word) + if err != nil { + return 0, err + } + data = data[n:] + } + + // Interior. + for len(data) > sizeofPtr { + word := *((*uintptr)(unsafe.Pointer(&data[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += sizeofPtr + data = data[sizeofPtr:] + } + + // Trailing edge. + if len(data) > 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copy(buf[0:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += len(data) + } + + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) +} + +func PtracePokeUser(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEUSR, PTRACE_PEEKUSR, pid, addr, data) +} + +func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +func PtraceSetOptions(pid int, options int) (err error) { + return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) +} + +func PtraceGetEventMsg(pid int) (msg uint, err error) { + var data _C_long + err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) + msg = uint(data) + return +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) +} + +func PtraceSyscall(pid int, signal int) (err error) { + return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } + +//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) + +func Reboot(cmd int) (err error) { + return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} + +//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) + +func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { + // Certain file systems get rather angry and EINVAL if you give + // them an empty string of data, rather than NULL. + if data == "" { + return mount(source, target, fstype, flags, nil) + } + datap, err := BytePtrFromString(data) + if err != nil { + return err + } + return mount(source, target, fstype, flags, datap) +} + +// Sendto +// Recvfrom +// Socketpair + +/* + * Direct access + */ +//sys Acct(path string) (err error) +//sys AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) +//sys Adjtimex(buf *Timex) (state int, err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys Close(fd int) (err error) +//sys CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Dup3(oldfd int, newfd int, flags int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sysnb EpollCreate1(flag int) (fd int, err error) +//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD2 +//sys Exit(code int) = SYS_EXIT_GROUP +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fsync(fd int) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 +//sysnb Getpgid(pid int) (pgid int, err error) + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sys Getrandom(buf []byte, flags int) (n int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettid() (tid int) +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error) +//sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) +//sysnb InotifyInit1(flags int) (fd int, err error) +//sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) +//sysnb Kill(pid int, sig syscall.Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Lgetxattr(path string, attr string, dest []byte) (sz int, err error) +//sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Llistxattr(path string, dest []byte) (sz int, err error) +//sys Lremovexattr(path string, attr string) (err error) +//sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) +//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT +//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys read(fd int, p []byte) (n int, err error) +//sys Removexattr(path string, attr string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) +//sys Setns(fd int, nstype int) (err error) + +// issue 1435. +// On linux Setuid and Setgid only affects the current thread, not the process. +// This does not match what most callers expect so we must return an error +// here rather than letting the caller think that the call succeeded. + +func Setuid(uid int) (err error) { + return EOPNOTSUPP +} + +func Setgid(uid int) (err error) { + return EOPNOTSUPP +} + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) +//sys Sync() +//sys Syncfs(fd int) (err error) +//sysnb Sysinfo(info *Sysinfo_t) (err error) +//sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) +//sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 +//sys Unshare(flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys exitThread(code int) (err error) = SYS_EXIT +//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ +//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE + +// mmap varies by architecture; see syscall_linux_*.go. +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) + +// Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, +// using the specified flags. +func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { + n, _, errno := Syscall6( + SYS_VMSPLICE, + uintptr(fd), + uintptr(unsafe.Pointer(&iovs[0])), + uintptr(len(iovs)), + uintptr(flags), + 0, + 0, + ) + if errno != 0 { + return 0, syscall.Errno(errno) + } + + return int(n), nil +} + +/* + * Unimplemented + */ +// AfsSyscall +// Alarm +// ArchPrctl +// Brk +// Capget +// Capset +// ClockGetres +// ClockNanosleep +// ClockSettime +// Clone +// CreateModule +// DeleteModule +// EpollCtlOld +// EpollPwait +// EpollWaitOld +// Execve +// Fgetxattr +// Flistxattr +// Fork +// Fremovexattr +// Fsetxattr +// Futex +// GetKernelSyms +// GetMempolicy +// GetRobustList +// GetThreadArea +// Getitimer +// Getpmsg +// IoCancel +// IoDestroy +// IoGetevents +// IoSetup +// IoSubmit +// IoprioGet +// IoprioSet +// KexecLoad +// LookupDcookie +// Mbind +// MigratePages +// Mincore +// ModifyLdt +// Mount +// MovePages +// MqGetsetattr +// MqNotify +// MqOpen +// MqTimedreceive +// MqTimedsend +// MqUnlink +// Mremap +// Msgctl +// Msgget +// Msgrcv +// Msgsnd +// Nfsservctl +// Personality +// Pselect6 +// Ptrace +// Putpmsg +// QueryModule +// Quotactl +// Readahead +// Readv +// RemapFilePages +// RestartSyscall +// RtSigaction +// RtSigpending +// RtSigprocmask +// RtSigqueueinfo +// RtSigreturn +// RtSigsuspend +// RtSigtimedwait +// SchedGetPriorityMax +// SchedGetPriorityMin +// SchedGetparam +// SchedGetscheduler +// SchedRrGetInterval +// SchedSetparam +// SchedYield +// Security +// Semctl +// Semget +// Semop +// Semtimedop +// SetMempolicy +// SetRobustList +// SetThreadArea +// SetTidAddress +// Shmat +// Shmctl +// Shmdt +// Shmget +// Sigaltstack +// Signalfd +// Swapoff +// Swapon +// Sysfs +// TimerCreate +// TimerDelete +// TimerGetoverrun +// TimerGettime +// TimerSettime +// Timerfd +// Tkill (obsolete) +// Tuxcall +// Umount2 +// Uselib +// Utimensat +// Vfork +// Vhangup +// Vserver +// Waitid +// _Sysctl diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go new file mode 100755 index 0000000..bb8e4fb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -0,0 +1,391 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) +// so that go vet can check that they are correct. + +// +build 386,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// 64-bit file system and 32-bit uid calls +// (386 default is 32-bit file system and 16-bit uid). +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +// On x86 Linux, all the socket calls go through an extra indirection, +// I think because the 5-register system call interface can't handle +// the 6-argument calls like sendto and recvfrom. Instead the +// arguments to the underlying system call are the number below +// and a pointer to an array of uintptr. We hide the pointer in the +// socketcall assembly to avoid allocation on every system call. + +const ( + // see linux/net.h + _SOCKET = 1 + _BIND = 2 + _CONNECT = 3 + _LISTEN = 4 + _ACCEPT = 5 + _GETSOCKNAME = 6 + _GETPEERNAME = 7 + _SOCKETPAIR = 8 + _SEND = 9 + _RECV = 10 + _SENDTO = 11 + _RECVFROM = 12 + _SHUTDOWN = 13 + _SETSOCKOPT = 14 + _GETSOCKOPT = 15 + _SENDMSG = 16 + _RECVMSG = 17 + _ACCEPT4 = 18 + _RECVMMSG = 19 + _SENDMMSG = 20 +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e != 0 { + err = e + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e != 0 { + err = e + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) + if e != 0 { + err = e + } + return +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + if e != 0 { + err = e + } + return +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e != 0 { + err = e + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Listen(s int, n int) (err error) { + _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Shutdown(s, how int) (err error) { + _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go new file mode 100755 index 0000000..d121106 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -0,0 +1,157 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,linux + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + // Use fstatat, because Android's seccomp policy blocks stat. + return Fstatat(AT_FDCWD, path, stat, 0) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Gettimeofday(tv *Timeval) (err error) { + errno := gettimeofday(tv) + if errno != 0 { + return errno + } + return nil +} + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + errno := gettimeofday(&tv) + if errno != 0 { + return 0, errno + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Rip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go new file mode 100755 index 0000000..21a4946 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go @@ -0,0 +1,13 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,linux +// +build !gccgo + +package unix + +import "syscall" + +//go:noescape +func gettimeofday(tv *Timeval) (err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go new file mode 100755 index 0000000..c59f858 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -0,0 +1,255 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// 64-bit file system and 32-bit uid calls +// (16-bit uid calls are not always supported in newer kernels) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go new file mode 100755 index 0000000..a1e8a60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -0,0 +1,190 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +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 Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove +// these when the deprecated syscalls that the syscall package relies on +// are removed. +const ( + SYS_GETPGRP = 1060 + SYS_UTIMES = 1037 + SYS_FUTIMESAT = 1066 + SYS_PAUSE = 1061 + SYS_USTAT = 1070 + SYS_UTIME = 1063 + SYS_LCHOWN = 1032 + SYS_TIME = 1062 + SYS_EPOLL_CREATE = 1042 + SYS_EPOLL_WAIT = 1069 +) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + if len(fds) == 0 { + return ppoll(nil, 0, ts, nil) + } + return ppoll(&fds[0], len(fds), ts, nil) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go new file mode 100755 index 0000000..c26e6ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gc.go @@ -0,0 +1,14 @@ +// 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 linux,!gccgo + +package unix + +// SyscallNoError may be used instead of Syscall for syscalls that don't fail. +func SyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) + +// RawSyscallNoError may be used instead of RawSyscall for syscalls that don't +// fail. +func RawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go new file mode 100755 index 0000000..df9c123 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_gccgo.go @@ -0,0 +1,21 @@ +// 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 linux +// +build gccgo +// +build 386 arm + +package unix + +import ( + "syscall" + "unsafe" +) + +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) { + offsetLow := uint32(offset & 0xffffffff) + offsetHigh := uint32((offset >> 32) & 0xffffffff) + _, _, err = Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offsetHigh), uintptr(offsetLow), uintptr(unsafe.Pointer(&newoffset)), uintptr(whence), 0) + return newoffset, err +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go new file mode 100755 index 0000000..090ed40 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -0,0 +1,210 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le + +package unix + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + var ts *Timespec + if timeout != nil { + ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} + } + return Pselect(nfd, r, w, e, ts, nil) +} + +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +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 Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +type stat_t struct { + Dev uint32 + Pad0 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad1 [3]uint32 + Size int64 + Atime uint32 + Atime_nsec uint32 + Mtime uint32 + Mtime_nsec uint32 + Ctime uint32 + Ctime_nsec uint32 + Blksize uint32 + Pad2 uint32 + Blocks int64 +} + +//sys fstat(fd int, st *stat_t) (err error) +//sys lstat(path string, st *stat_t) (err error) +//sys stat(path string, st *stat_t) (err error) + +func Fstat(fd int, s *Stat_t) (err error) { + st := &stat_t{} + err = fstat(fd, st) + fillStat_t(s, st) + return +} + +func Lstat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = lstat(path, st) + fillStat_t(s, st) + return +} + +func Stat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = stat(path, st) + fillStat_t(s, st) + return +} + +func fillStat_t(s *Stat_t, st *stat_t) { + s.Dev = st.Dev + s.Ino = st.Ino + s.Mode = st.Mode + s.Nlink = st.Nlink + s.Uid = st.Uid + s.Gid = st.Gid + s.Rdev = st.Rdev + s.Size = st.Size + s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} + s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} + s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} + s.Blksize = st.Blksize + s.Blocks = st.Blocks +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go new file mode 100755 index 0000000..9e16cc9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -0,0 +1,232 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) + +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) + +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +//sys Utime(path string, buf *Utimbuf) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + p, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = errnoErr(e) + } + return +} + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + _, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0) + if e != 0 { + err = errnoErr(e) + } + return +} + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: int32(sec), Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: int32(sec), Usec: int32(usec)} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return r.Epc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go new file mode 100755 index 0000000..6fb8733 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -0,0 +1,128 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2 +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +func (r *PtraceRegs) PC() uint64 { return r.Nip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go new file mode 100755 index 0000000..c0d86e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -0,0 +1,320 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,linux + +package unix + +import ( + "unsafe" +) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_NEWFSTATAT +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: usec} +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. +// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in . +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} + r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// On s390x Linux, all the socket calls go through an extra indirection. +// The arguments to the underlying system call (SYS_SOCKETCALL) are the +// number below and a pointer to an array of uintptr. +const ( + // see linux/net.h + netSocket = 1 + netBind = 2 + netConnect = 3 + netListen = 4 + netAccept = 5 + netGetSockName = 6 + netGetPeerName = 7 + netSocketPair = 8 + netSend = 9 + netRecv = 10 + netSendTo = 11 + netRecvFrom = 12 + netShutdown = 13 + netSetSockOpt = 14 + netGetSockOpt = 15 + netSendMsg = 16 + netRecvMsg = 17 + netAccept4 = 18 + netRecvMMsg = 19 + netSendMMsg = 20 +) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { + args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) error { + args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socket(domain int, typ int, proto int) (int, error) { + args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} + fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { + args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} + _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { + args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} + _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func Listen(s int, n int) error { + args := [2]uintptr{uintptr(s), uintptr(n)} + _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func Shutdown(s, how int) error { + args := [2]uintptr{uintptr(s), uintptr(how)} + _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go new file mode 100755 index 0000000..78c1e0d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -0,0 +1,144 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build sparc64,linux + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: nsec} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func (r *PtraceRegs) PC() uint64 { return r.Tpc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go new file mode 100755 index 0000000..e1a3baa --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -0,0 +1,567 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// NetBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { + var olen uintptr + + // Get a list of all sysctl nodes below the given MIB by performing + // a sysctl for the given MIB with CTL_QUERY appended. + mib = append(mib, CTL_QUERY) + qnode := Sysctlnode{Flags: SYSCTL_VERS_1} + qp := (*byte)(unsafe.Pointer(&qnode)) + sz := unsafe.Sizeof(qnode) + if err = sysctl(mib, nil, &olen, qp, sz); err != nil { + return nil, err + } + + // Now that we know the size, get the actual nodes. + nodes = make([]Sysctlnode, olen/sz) + np := (*byte)(unsafe.Pointer(&nodes[0])) + if err = sysctl(mib, np, &olen, qp, sz); err != nil { + return nil, err + } + + return nodes, nil +} + +func nametomib(name string) (mib []_C_int, err error) { + // Split name into components. + var parts []string + last := 0 + for i := 0; i < len(name); i++ { + if name[i] == '.' { + parts = append(parts, name[last:i]) + last = i + 1 + } + } + parts = append(parts, name[last:]) + + // Discover the nodes and construct the MIB OID. + for partno, part := range parts { + nodes, err := sysctlNodes(mib) + if err != nil { + return nil, err + } + for _, node := range nodes { + n := make([]byte, 0) + for i := range node.Name { + if node.Name[i] != 0 { + n = append(n, byte(node.Name[i])) + } + } + if string(n) == part { + mib = append(mib, _C_int(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, EINVAL + } + } + + return mib, nil +} + +//sysnb pipe() (fd1 int, fd2 int, err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//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) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// ____semctl13 +// __clone +// __fhopen40 +// __fhstat40 +// __fhstatvfs140 +// __fstat30 +// __getcwd +// __getfh30 +// __getlogin +// __lstat30 +// __mount50 +// __msgctl13 +// __msync13 +// __ntp_gettime30 +// __posix_chown +// __posix_fchown +// __posix_lchown +// __posix_rename +// __setlogin +// __shmctl13 +// __sigaction_sigtramp +// __sigaltstack14 +// __sigpending14 +// __sigprocmask14 +// __sigsuspend14 +// __sigtimedwait +// __stat30 +// __syscall +// __vfork14 +// _ksem_close +// _ksem_destroy +// _ksem_getvalue +// _ksem_init +// _ksem_open +// _ksem_post +// _ksem_trywait +// _ksem_unlink +// _ksem_wait +// _lwp_continue +// _lwp_create +// _lwp_ctl +// _lwp_detach +// _lwp_exit +// _lwp_getname +// _lwp_getprivate +// _lwp_kill +// _lwp_park +// _lwp_self +// _lwp_setname +// _lwp_setprivate +// _lwp_suspend +// _lwp_unpark +// _lwp_unpark_all +// _lwp_wait +// _lwp_wakeup +// _pset_bind +// _sched_getaffinity +// _sched_getparam +// _sched_setaffinity +// _sched_setparam +// acct +// aio_cancel +// aio_error +// aio_fsync +// aio_read +// aio_return +// aio_suspend +// aio_write +// break +// clock_getres +// clock_gettime +// clock_settime +// compat_09_ogetdomainname +// compat_09_osetdomainname +// compat_09_ouname +// compat_10_omsgsys +// compat_10_osemsys +// compat_10_oshmsys +// compat_12_fstat12 +// compat_12_getdirentries +// compat_12_lstat12 +// compat_12_msync +// compat_12_oreboot +// compat_12_oswapon +// compat_12_stat12 +// compat_13_sigaction13 +// compat_13_sigaltstack13 +// compat_13_sigpending13 +// compat_13_sigprocmask13 +// compat_13_sigreturn13 +// compat_13_sigsuspend13 +// compat_14___semctl +// compat_14_msgctl +// compat_14_shmctl +// compat_16___sigaction14 +// compat_16___sigreturn14 +// compat_20_fhstatfs +// compat_20_fstatfs +// compat_20_getfsstat +// compat_20_statfs +// compat_30___fhstat30 +// compat_30___fstat13 +// compat_30___lstat13 +// compat_30___stat13 +// compat_30_fhopen +// compat_30_fhstat +// compat_30_fhstatvfs1 +// compat_30_getdents +// compat_30_getfh +// compat_30_ntp_gettime +// compat_30_socket +// compat_40_mount +// compat_43_fstat43 +// compat_43_lstat43 +// compat_43_oaccept +// compat_43_ocreat +// compat_43_oftruncate +// compat_43_ogetdirentries +// compat_43_ogetdtablesize +// compat_43_ogethostid +// compat_43_ogethostname +// compat_43_ogetkerninfo +// compat_43_ogetpagesize +// compat_43_ogetpeername +// compat_43_ogetrlimit +// compat_43_ogetsockname +// compat_43_okillpg +// compat_43_olseek +// compat_43_ommap +// compat_43_oquota +// compat_43_orecv +// compat_43_orecvfrom +// compat_43_orecvmsg +// compat_43_osend +// compat_43_osendmsg +// compat_43_osethostid +// compat_43_osethostname +// compat_43_osetrlimit +// compat_43_osigblock +// compat_43_osigsetmask +// compat_43_osigstack +// compat_43_osigvec +// compat_43_otruncate +// compat_43_owait +// compat_43_stat43 +// execve +// extattr_delete_fd +// extattr_delete_file +// extattr_delete_link +// extattr_get_fd +// extattr_get_file +// extattr_get_link +// extattr_list_fd +// extattr_list_file +// extattr_list_link +// extattr_set_fd +// extattr_set_file +// extattr_set_link +// extattrctl +// fchroot +// fdatasync +// fgetxattr +// fktrace +// flistxattr +// fork +// fremovexattr +// fsetxattr +// fstatvfs1 +// fsync_range +// getcontext +// getitimer +// getvfsstat +// getxattr +// ktrace +// lchflags +// lchmod +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// lgetxattr +// lio_listio +// listxattr +// llistxattr +// lremovexattr +// lseek +// lsetxattr +// lutimes +// madvise +// mincore +// minherit +// modctl +// mq_close +// mq_getattr +// mq_notify +// mq_open +// mq_receive +// mq_send +// mq_setattr +// mq_timedreceive +// mq_timedsend +// mq_unlink +// mremap +// msgget +// msgrcv +// msgsnd +// nfssvc +// ntp_adjtime +// pmc_control +// pmc_get_info +// pollts +// preadv +// profil +// pselect +// pset_assign +// pset_create +// pset_destroy +// ptrace +// pwritev +// quotactl +// rasctl +// readv +// reboot +// removexattr +// sa_enable +// sa_preempt +// sa_register +// sa_setconcurrency +// sa_stacks +// sa_yield +// sbrk +// sched_yield +// semconfig +// semget +// semop +// setcontext +// setitimer +// setxattr +// shmat +// shmdt +// shmget +// sstk +// statvfs1 +// swapctl +// sysarch +// syscall +// timer_create +// timer_delete +// timer_getoverrun +// timer_gettime +// timer_settime +// undelete +// utrace +// uuidgen +// vadvise +// vfork +// writev diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go new file mode 100755 index 0000000..24f74e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go new file mode 100755 index 0000000..6878bf7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,netbsd + +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: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(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) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go new file mode 100755 index 0000000..dbbfcf7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -0,0 +1,33 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,netbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go new file mode 100755 index 0000000..614fcf0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -0,0 +1,367 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// OpenBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "sort" + "syscall" + "unsafe" +) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func nametomib(name string) (mib []_C_int, err error) { + i := sort.Search(len(sysctlMib), func(i int) bool { + return sysctlMib[i].ctlname >= name + }) + if i < len(sysctlMib) && sysctlMib[i].ctlname == name { + return sysctlMib[i].ctloid, nil + } + return nil, EINVAL +} + +//sysnb pipe(p *[2]_C_int) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//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) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) = SYS___GETCWD + +func Getwd() (string, error) { + var buf [PathMax]byte + _, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setattrlistTimes(path string, times []Timespec, flags int) error { + // used on Darwin for UtimesNano + return ENOSYS +} + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +// ioctl itself should not be exposed directly, but additional get/set +// functions for specific types are permissible. + +// IoctlSetInt performs an ioctl operation which sets an integer value +// on fd, using the specified request number. +func IoctlSetInt(fd int, req uint, value int) error { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) error { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +// IoctlGetInt performs an ioctl operation which gets an integer value +// from fd, using the specified request number. +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func Uname(uname *Utsname) error { + mib := []_C_int{CTL_KERN, KERN_OSTYPE} + n := unsafe.Sizeof(uname.Sysname) + if err := sysctl(mib, &uname.Sysname[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_HOSTNAME} + n = unsafe.Sizeof(uname.Nodename) + if err := sysctl(mib, &uname.Nodename[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_OSRELEASE} + n = unsafe.Sizeof(uname.Release) + if err := sysctl(mib, &uname.Release[0], &n, nil, 0); err != nil { + return err + } + + mib = []_C_int{CTL_KERN, KERN_VERSION} + n = unsafe.Sizeof(uname.Version) + if err := sysctl(mib, &uname.Version[0], &n, nil, 0); err != nil { + return err + } + + // The version might have newlines or tabs in it, convert them to + // spaces. + for i, b := range uname.Version { + if b == '\n' || b == '\t' { + if i == len(uname.Version)-1 { + uname.Version[i] = 0 + } else { + uname.Version[i] = ' ' + } + } + } + + mib = []_C_int{CTL_HW, HW_MACHINE} + n = unsafe.Sizeof(uname.Machine) + if err := sysctl(mib, &uname.Machine[0], &n, nil, 0); err != nil { + return err + } + + return nil +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrtable() (rtable int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setrtable(rtable int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +/* + * Unimplemented + */ +// __getcwd +// __semctl +// __syscall +// __sysctl +// adjfreq +// break +// clock_getres +// clock_gettime +// clock_settime +// closefrom +// execve +// faccessat +// fchmodat +// fchownat +// fcntl +// fhopen +// fhstat +// fhstatfs +// fork +// fstatat +// futimens +// getfh +// getgid +// getitimer +// getlogin +// getresgid +// getresuid +// getthrid +// ktrace +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// linkat +// mincore +// minherit +// mkdirat +// mkfifoat +// mknodat +// mount +// mquery +// msgctl +// msgget +// msgrcv +// msgsnd +// nfssvc +// nnpfspioctl +// openat +// preadv +// profil +// pwritev +// quotactl +// readlinkat +// readv +// reboot +// renameat +// rfork +// sched_yield +// semget +// semop +// setgroups +// setitimer +// setsockopt +// shmat +// shmctl +// shmdt +// shmget +// sigaction +// sigaltstack +// sigpending +// sigprocmask +// sigreturn +// sigsuspend +// symlinkat +// sysarch +// syscall +// threxit +// thrsigdivert +// thrsleep +// thrwakeup +// unlinkat +// vfork +// writev diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go new file mode 100755 index 0000000..994964a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go new file mode 100755 index 0000000..649e67f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -0,0 +1,33 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,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) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go new file mode 100755 index 0000000..59844f5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go @@ -0,0 +1,33 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,openbsd + +package unix + +func setTimespec(sec, nsec int64) Timespec { + return Timespec{Sec: sec, Nsec: int32(nsec)} +} + +func setTimeval(sec, usec int64) Timeval { + return Timeval{Sec: sec, Usec: int32(usec)} +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go new file mode 100755 index 0000000..b762952 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -0,0 +1,725 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Solaris system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_solaris.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +// Implemented in runtime/syscall_solaris.go. +type syscallFunc uintptr + +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. +type SockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 + raw RawSockaddrDatalink +} + +//sysnb pipe(p *[2]_C_int) (n int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + n, err := pipe(&pp) + if n != 0 { + return err + } + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return nil +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +// GetsockoptString returns the string value of the socket option opt for the +// socket associated with fd at the given socket level. +func GetsockoptString(fd, level, opt int) (string, error) { + buf := make([]byte, 256) + vallen := _Socklen(len(buf)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) + if err != nil { + return "", err + } + return string(buf[:vallen-1]), nil +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } + return nil, EINVAL + } else if n == 0 { + return nil, nil + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if n == -1 { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // TODO(rsc): Can we use a single global basep for all calls? + return Getdents(fd, buf, new(uintptr)) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { + var status _C_int + rpid, err := wait4(int32(pid), &status, options, rusage) + wpid := int(rpid) + if wpid == -1 { + return wpid, err + } + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return wpid, nil +} + +//sys gethostname(buf []byte) (n int, err error) + +func Gethostname() (name string, err error) { + var buf [MaxHostNameLen]byte + n, err := gethostname(buf[:]) + if n != 0 { + return "", err + } + n = clen(buf[:]) + if n < 1 { + return "", EFAULT + } + return string(buf[:n]), nil +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + valptr, _, err := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + return int(valptr), err +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) + if e1 != 0 { + return e1 + } + return nil +} + +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // Assume path ends at NUL. + // This is not technically the Solaris semantics for + // abstract Unix domain sockets -- they are supposed + // to be uninterpreted fixed-size binary blobs -- but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Accrightslen) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrightslen = int32(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +//sys __makedev(version int, major uint, minor uint) (val uint64) + +func Mkdev(major, minor uint32) uint64 { + return __makedev(NEWDEV, uint(major), uint(minor)) +} + +//sys __major(version int, dev uint64) (val uint) + +func Major(dev uint64) uint32 { + return uint32(__major(NEWDEV, dev)) +} + +//sys __minor(version int, dev uint64) (val uint) + +func Minor(dev uint64) uint32 { + return uint32(__minor(NEWDEV, dev)) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req uint, arg uintptr) (err error) + +func IoctlSetInt(fd int, req uint, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req uint, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req uint, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req uint) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req uint) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req uint) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) +//sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) +//sys Geteuid() (euid int) +//sys Getegid() (egid int) +//sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Madvise(b []byte, advice int) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Msync(b []byte, flags int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Setuid(uid int) (err error) +//sys Shutdown(s int, how int) (err error) = libsocket.shutdown +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statvfs(path string, vfsstat *Statvfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sys Truncate(path string, length int64) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = libsendfile.sendfile +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair +//sys write(fd int, p []byte) (n int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go new file mode 100755 index 0000000..91c32dd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -0,0 +1,23 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,solaris + +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 (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go new file mode 100755 index 0000000..b835bad --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -0,0 +1,394 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import ( + "bytes" + "runtime" + "sort" + "sync" + "syscall" + "unsafe" +) + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +const ( + darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 + dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 + netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 + solaris64Bit = runtime.GOOS == "solaris" && sizeofPtr == 8 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +// ErrnoName returns the error name for error number e. +func ErrnoName(e syscall.Errno) string { + i := sort.Search(len(errorList), func(i int) bool { + return errorList[i].num >= e + }) + if i < len(errorList) && errorList[i].num == e { + return errorList[i].name + } + return "" +} + +// SignalName returns the signal name for signal number s. +func SignalName(s syscall.Signal) string { + i := sort.Search(len(signalList), func(i int) bool { + return signalList[i].num >= s + }) + if i < len(signalList) && signalList[i].num == s { + return signalList[i].name + } + return "" +} + +// clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. +func clen(n []byte) int { + i := bytes.IndexByte(n, 0) + if i == -1 { + i = len(n) + } + return i +} + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +// Sockaddr represents a socket address. +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +// SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets. +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +// SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets. +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +// SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets. +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptLinger(fd, level, opt int) (*Linger, error) { + var linger Linger + vallen := _Socklen(SizeofLinger) + err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen) + return &linger, err +} + +func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) { + var tv Timeval + vallen := _Socklen(unsafe.Sizeof(tv)) + err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen) + return &tv, err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + return sendfile(outfd, infd, offset, count) +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} + +// Exec calls execve(2), which replaces the calling executable in the process +// tree. argv0 should be the full path to an executable ("/bin/ls") and the +// executable name should also be the first argument in argv (["ls", "-l"]). +// envv are the environment variables that should be passed to the new +// process (["USER=go", "PWD=/tmp"]). +func Exec(argv0 string, argv []string, envv []string) error { + return syscall.Exec(argv0, argv, envv) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go new file mode 100755 index 0000000..4cb8e8e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/syscall_unix_gc.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris +// +build !gccgo + +package unix + +import "syscall" + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/timestruct.go new file mode 100755 index 0000000..47b9011 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/timestruct.go @@ -0,0 +1,82 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import "time" + +// TimespecToNsec converts a Timespec value into a number of +// nanoseconds since the Unix epoch. +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +// NsecToTimespec takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timespec value. +func NsecToTimespec(nsec int64) Timespec { + sec := nsec / 1e9 + nsec = nsec % 1e9 + if nsec < 0 { + nsec += 1e9 + sec-- + } + return setTimespec(sec, nsec) +} + +// TimeToTimespec converts t into a Timespec. +// On some 32-bit systems the range of valid Timespec values are smaller +// than that of time.Time values. So if t is out of the valid range of +// Timespec, it returns a zero Timespec and ERANGE. +func TimeToTimespec(t time.Time) (Timespec, error) { + sec := t.Unix() + nsec := int64(t.Nanosecond()) + ts := setTimespec(sec, nsec) + + // Currently all targets have either int32 or int64 for Timespec.Sec. + // If there were a new target with floating point type for it, we have + // to consider the rounding error. + if int64(ts.Sec) != sec { + return Timespec{}, ERANGE + } + return ts, nil +} + +// TimevalToNsec converts a Timeval value into a number of nanoseconds +// since the Unix epoch. +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } + +// NsecToTimeval takes a number of nanoseconds since the Unix epoch +// and returns the corresponding Timeval value. +func NsecToTimeval(nsec int64) Timeval { + nsec += 999 // round up to microsecond + usec := nsec % 1e9 / 1e3 + sec := nsec / 1e9 + if usec < 0 { + usec += 1e6 + sec-- + } + return setTimeval(sec, usec) +} + +// Unix returns ts as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +// Unix returns tv as the number of seconds and nanoseconds elapsed since the +// Unix epoch. +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100755 index 0000000..46b9908 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,277 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100755 index 0000000..0c63304 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,280 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100755 index 0000000..4eb02cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,402 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of stat on FreeBSD 8-STABLE. +// See /usr/include/sys/stat.h. +struct stat8 { +#undef st_atimespec st_atim +#undef st_mtimespec st_mtim +#undef st_ctimespec st_ctim +#undef st_birthtimespec st_birthtim + __dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + __dev_t st_rdev; +#if __BSD_VISIBLE + struct timespec st_atimespec; + struct timespec st_mtimespec; + struct timespec st_ctimespec; +#else + time_t st_atime; + long __st_atimensec; + time_t st_mtime; + long __st_mtimensec; + time_t st_ctime; + long __st_ctimensec; +#endif + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + fflags_t st_flags; + __uint32_t st_gen; + __int32_t st_lspare; +#if __BSD_VISIBLE + struct timespec st_birthtimespec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); +#else + time_t st_birthtime; + long st_birthtimensec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); +#endif +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; +// FIXME: these are now unions, so maybe need to change definitions? +#undef ifi_epoch + time_t ifi_epoch; +#undef ifi_lastchange + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat8 + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLINIGNEOF = C.POLLINIGNEOF + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Capabilities + +type CapRights C.struct_cap_rights + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100755 index 0000000..1494aaf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,281 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Sysctl + +type Sysctlnode C.struct_sysctlnode + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100755 index 0000000..649e559 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,282 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// File system limits + +const ( + PathMax = C.PATH_MAX +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +type Winsize C.struct_winsize + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) + +// Uname + +type Utsname C.struct_utsname diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100755 index 0000000..f777155 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,283 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See README.md +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX + MaxHostNameLen = C.MAXHOSTNAMELEN +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Filesystems + +type _Fsblkcnt_t C.fsblkcnt_t + +type Statvfs_t C.struct_statvfs + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize + +// poll + +type PollFd C.struct_pollfd + +const ( + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLIN = C.POLLIN + POLLNVAL = C.POLLNVAL + POLLOUT = C.POLLOUT + POLLPRI = C.POLLPRI + POLLRDBAND = C.POLLRDBAND + POLLRDNORM = C.POLLRDNORM + POLLWRBAND = C.POLLWRBAND + POLLWRNORM = C.POLLWRNORM +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go new file mode 100755 index 0000000..c5a9b73 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -0,0 +1,1777 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + 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 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x8008427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + 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_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc0086924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6981 + SIOCRSLVMULTI = 0xc008693b + SIOCSDRVSPEC = 0x801c697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + 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_IFWHT = 0xe000 + 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 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40087458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + 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 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x20 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + 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(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + 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(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + 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) + 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", "resource 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, "ENOTSUP", "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", "disc 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 prog. not avail"}, + {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, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// 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"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go new file mode 100755 index 0000000..7de222b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -0,0 +1,1777 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + 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 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + 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_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + 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_IFWHT = 0xe000 + 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 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + 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 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + 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(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + 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(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + 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) + 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", "resource 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, "ENOTSUP", "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", "disc 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 prog. not avail"}, + {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, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// 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"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go new file mode 100755 index 0000000..33a42e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -0,0 +1,1777 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + 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 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + 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_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + 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_IFWHT = 0xe000 + 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 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + 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 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + 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(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + 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(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + 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) + 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", "resource 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, "ENOTSUP", "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", "disc 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 prog. not avail"}, + {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, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// 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"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go new file mode 100755 index 0000000..7180515 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -0,0 +1,1777 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x41c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf007ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + 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 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xf + EVFILT_THREADMARKER = 0xf + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + 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_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x300 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0x17f0f5ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + 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_IFWHT = 0xe000 + 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 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + 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 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + 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(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + 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(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + 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) + 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", "resource 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, "ENOTSUP", "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", "disc 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 prog. not avail"}, + {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, "EPWROFF", "device power is off"}, + {83, "EDEVERR", "device error"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EBADEXEC", "bad executable (or shared library)"}, + {86, "EBADARCH", "bad CPU type in executable"}, + {87, "ESHLIBVERS", "shared library version mismatch"}, + {88, "EBADMACHO", "malformed Mach-o file"}, + {89, "ECANCELED", "operation canceled"}, + {90, "EIDRM", "identifier removed"}, + {91, "ENOMSG", "no message of desired type"}, + {92, "EILSEQ", "illegal byte sequence"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EBADMSG", "bad message"}, + {95, "EMULTIHOP", "EMULTIHOP (Reserved)"}, + {96, "ENODATA", "no message available on STREAM"}, + {97, "ENOLINK", "ENOLINK (Reserved)"}, + {98, "ENOSR", "no STREAM resources"}, + {99, "ENOSTR", "not a STREAM"}, + {100, "EPROTO", "protocol error"}, + {101, "ETIME", "STREAM ioctl timeout"}, + {102, "EOPNOTSUPP", "operation not supported on socket"}, + {103, "ENOPOLICY", "policy not found"}, + {104, "ENOTRECOVERABLE", "state not recoverable"}, + {105, "EOWNERDEAD", "previous owner died"}, + {106, "EQFULL", "interface output queue is full"}, +} + +// 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"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go new file mode 100755 index 0000000..46a082b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -0,0 +1,1586 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x21 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x23 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x22 + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DEFAULTBUFSIZE = 0x1000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MAX_CLONES = 0x80 + 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_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DBF = 0xf + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0x8 + EVFILT_FS = -0xa + EVFILT_MARKER = 0xf + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xa + EVFILT_TIMER = -0x7 + EVFILT_USER = -0x9 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_NODATA = 0x1000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTEXIT_LWP = 0x10000 + EXTEXIT_PROC = 0x0 + EXTEXIT_SETINT = 0x1 + EXTEXIT_SIMPLE = 0x0 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + 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_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x118e72 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NPOLLING = 0x100000 + IFF_OACTIVE = 0x400 + IFF_OACTIVE_COMPAT = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_POLLING = 0x10000 + IFF_POLLING_COMPAT = 0x10000 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_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_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xf3 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SKIP = 0x39 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UNKNOWN = 0x102 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MINHLIM = 0x28 + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PKTOPTIONS = 0x34 + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_RESETLOG = 0x37 + IP_FW_X = 0x31 + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CONTROL_END = 0xb + MADV_CONTROL_START = 0xa + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_INVAL = 0xa + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SETMAP = 0xb + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_NOCORE = 0x20000 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SIZEALIGN = 0x40000 + MAP_STACK = 0x400 + MAP_TRYFIXED = 0x10000 + MAP_VPAGETABLE = 0x2000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x1000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FBLOCKING = 0x10000 + MSG_FMASK = 0xffff0000 + MSG_FNONBLOCKING = 0x20000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_SYNC = 0x800 + MSG_TRUNC = 0x10 + MSG_UNUSED09 = 0x200 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x20000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x8000000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FAPPEND = 0x100000 + O_FASYNCWRITE = 0x800000 + O_FBLOCKING = 0x40000 + O_FMASK = 0xfc0000 + O_FNONBLOCKING = 0x80000 + O_FOFFSET = 0x200000 + O_FSYNC = 0x80 + O_FSYNCWRITE = 0x400000 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0xb + RTAX_MPLS1 = 0x8 + RTAX_MPLS2 = 0x9 + RTAX_MPLS3 = 0xa + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_MPLS1 = 0x100 + RTA_MPLS2 = 0x200 + RTA_MPLS3 = 0x400 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPLSOPS = 0x1000000 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x6 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_IWCAPSEGS = 0x400 + RTV_IWMAXSEGS = 0x200 + RTV_MSL = 0x100 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc0206926 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPOLLCPU = 0xc020697e + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFTSOLEN = 0xc0206980 + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFPOLLCPU = 0x8020697d + SIOCSIFTSOLEN = 0x8020697f + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_CPUHINT = 0x1030 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDSPACE = 0x100a + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_FASTKEEP = 0x80 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x20 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0x100 + TCP_MIN_WINSHIFT = 0x5 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_SIGNATURE_ENABLE = 0x10 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCISPTMASTER = 0x20007455 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + 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 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VCHECKPT = 0x13 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VM_BCACHE_SIZE_MAX = 0x0 + VM_SWZONE_SIZE_MAX = 0x4000000000 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EASYNC = syscall.Errno(0x63) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + 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) + EDOOFUS = syscall.Errno(0x58) + 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(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x63) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + 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(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEDIUM = syscall.Errno(0x5d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + 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(0x5c) + 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) + EUNUSED94 = syscall.Errno(0x5e) + EUNUSED95 = syscall.Errno(0x5f) + EUNUSED96 = syscall.Errno(0x60) + EUNUSED97 = syscall.Errno(0x61) + EUNUSED98 = syscall.Errno(0x62) + 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) + SIGCKPT = syscall.Signal(0x21) + SIGCKPTEXIT = syscall.Signal(0x22) + 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, "EWOULDBLOCK", "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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOMEDIUM", "no medium found"}, + {94, "EUNUSED94", "unknown error: 94"}, + {95, "EUNUSED95", "unknown error: 95"}, + {96, "EUNUSED96", "unknown error: 96"}, + {97, "EUNUSED97", "unknown error: 97"}, + {98, "EUNUSED98", "unknown error: 98"}, + {99, "ELAST", "unknown error: 99"}, +} + +// 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, "SIGIOT", "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 Scheduler"}, + {33, "SIGCKPT", "checkPoint"}, + {34, "SIGCKPTEXIT", "checkPointExit"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go new file mode 100755 index 0000000..2947dc0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -0,0 +1,1764 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +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(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + 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) + EDOOFUS = syscall.Errno(0x58) + 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(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + 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(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + 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(0x5c) + 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) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// 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, "SIGIOT", "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", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go new file mode 100755 index 0000000..c600d01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -0,0 +1,1765 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffffffffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x104 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc030698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +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(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + 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) + EDOOFUS = syscall.Errno(0x58) + 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(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + 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(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + 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(0x5c) + 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) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// 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, "SIGIOT", "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", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go new file mode 100755 index 0000000..e8240d2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -0,0 +1,1773 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + ALTWERASE = 0x200 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CAP_ACCEPT = 0x200000020000000 + CAP_ACL_CHECK = 0x400000000010000 + CAP_ACL_DELETE = 0x400000000020000 + CAP_ACL_GET = 0x400000000040000 + CAP_ACL_SET = 0x400000000080000 + CAP_ALL0 = 0x20007ffffffffff + CAP_ALL1 = 0x4000000001fffff + CAP_BIND = 0x200000040000000 + CAP_BINDAT = 0x200008000000400 + CAP_CHFLAGSAT = 0x200000000001400 + CAP_CONNECT = 0x200000080000000 + CAP_CONNECTAT = 0x200010000000400 + CAP_CREATE = 0x200000000000040 + CAP_EVENT = 0x400000000000020 + CAP_EXTATTR_DELETE = 0x400000000001000 + CAP_EXTATTR_GET = 0x400000000002000 + CAP_EXTATTR_LIST = 0x400000000004000 + CAP_EXTATTR_SET = 0x400000000008000 + CAP_FCHDIR = 0x200000000000800 + CAP_FCHFLAGS = 0x200000000001000 + CAP_FCHMOD = 0x200000000002000 + CAP_FCHMODAT = 0x200000000002400 + CAP_FCHOWN = 0x200000000004000 + CAP_FCHOWNAT = 0x200000000004400 + CAP_FCNTL = 0x200000000008000 + CAP_FCNTL_ALL = 0x78 + CAP_FCNTL_GETFL = 0x8 + CAP_FCNTL_GETOWN = 0x20 + CAP_FCNTL_SETFL = 0x10 + CAP_FCNTL_SETOWN = 0x40 + CAP_FEXECVE = 0x200000000000080 + CAP_FLOCK = 0x200000000010000 + CAP_FPATHCONF = 0x200000000020000 + CAP_FSCK = 0x200000000040000 + CAP_FSTAT = 0x200000000080000 + CAP_FSTATAT = 0x200000000080400 + CAP_FSTATFS = 0x200000000100000 + CAP_FSYNC = 0x200000000000100 + CAP_FTRUNCATE = 0x200000000000200 + CAP_FUTIMES = 0x200000000200000 + CAP_FUTIMESAT = 0x200000000200400 + CAP_GETPEERNAME = 0x200000100000000 + CAP_GETSOCKNAME = 0x200000200000000 + CAP_GETSOCKOPT = 0x200000400000000 + CAP_IOCTL = 0x400000000000080 + CAP_IOCTLS_ALL = 0x7fffffff + CAP_KQUEUE = 0x400000000100040 + CAP_KQUEUE_CHANGE = 0x400000000100000 + CAP_KQUEUE_EVENT = 0x400000000000040 + CAP_LINKAT_SOURCE = 0x200020000000400 + CAP_LINKAT_TARGET = 0x200000000400400 + CAP_LISTEN = 0x200000800000000 + CAP_LOOKUP = 0x200000000000400 + CAP_MAC_GET = 0x400000000000001 + CAP_MAC_SET = 0x400000000000002 + CAP_MKDIRAT = 0x200000000800400 + CAP_MKFIFOAT = 0x200000001000400 + CAP_MKNODAT = 0x200000002000400 + CAP_MMAP = 0x200000000000010 + CAP_MMAP_R = 0x20000000000001d + CAP_MMAP_RW = 0x20000000000001f + CAP_MMAP_RWX = 0x20000000000003f + CAP_MMAP_RX = 0x20000000000003d + CAP_MMAP_W = 0x20000000000001e + CAP_MMAP_WX = 0x20000000000003e + CAP_MMAP_X = 0x20000000000003c + CAP_PDGETPID = 0x400000000000200 + CAP_PDKILL = 0x400000000000800 + CAP_PDWAIT = 0x400000000000400 + CAP_PEELOFF = 0x200001000000000 + CAP_POLL_EVENT = 0x400000000000020 + CAP_PREAD = 0x20000000000000d + CAP_PWRITE = 0x20000000000000e + CAP_READ = 0x200000000000001 + CAP_RECV = 0x200000000000001 + CAP_RENAMEAT_SOURCE = 0x200000004000400 + CAP_RENAMEAT_TARGET = 0x200040000000400 + CAP_RIGHTS_VERSION = 0x0 + CAP_RIGHTS_VERSION_00 = 0x0 + CAP_SEEK = 0x20000000000000c + CAP_SEEK_TELL = 0x200000000000004 + CAP_SEM_GETVALUE = 0x400000000000004 + CAP_SEM_POST = 0x400000000000008 + CAP_SEM_WAIT = 0x400000000000010 + CAP_SEND = 0x200000000000002 + CAP_SETSOCKOPT = 0x200002000000000 + CAP_SHUTDOWN = 0x200004000000000 + CAP_SOCK_CLIENT = 0x200007780000003 + CAP_SOCK_SERVER = 0x200007f60000003 + CAP_SYMLINKAT = 0x200000008000400 + CAP_TTYHOOK = 0x400000000000100 + CAP_UNLINKAT = 0x200000010000400 + CAP_UNUSED0_44 = 0x200080000000000 + CAP_UNUSED0_57 = 0x300000000000000 + CAP_UNUSED1_22 = 0x400000000200000 + CAP_UNUSED1_57 = 0x500000000000000 + CAP_WRITE = 0x200000000000002 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_BREDR_BB = 0xff + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_BLUETOOTH_LE_LL = 0xfb + DLT_BLUETOOTH_LE_LL_WITH_PHDR = 0x100 + DLT_BLUETOOTH_LINUX_MONITOR = 0xfe + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_CLASS_NETBSD_RAWAF = 0x2240000 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_EPON = 0x103 + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_INFINIBAND = 0xf7 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPMI_HPM_2 = 0x104 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_ISO_14443 = 0x108 + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x109 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NETLINK = 0xfd + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PKTAP = 0x102 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PROFIBUS_DL = 0x101 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RDS = 0x109 + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_RTAC_SERIAL = 0xfa + DLT_SCCP = 0x8e + DLT_SCTP = 0xf8 + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USBPCAP = 0xf9 + DLT_USB_FREEBSD = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WATTSTOPPER_DLM = 0x107 + DLT_WIHART = 0xdf + DLT_WIRESHARK_UPPER_PDU = 0xfc + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DLT_ZWAVE_R1_R2 = 0x105 + DLT_ZWAVE_R3 = 0x106 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_PROCDESC = -0x8 + EVFILT_READ = -0x1 + EVFILT_SENDFILE = -0xc + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xc + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_FLAG2 = 0x4000 + EV_FORCEONESHOT = 0x100 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f52 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_IEEE1394 = 0x90 + IFT_INFINIBAND = 0xc7 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_PPP = 0x17 + IFT_PROPVIRTUAL = 0x35 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDMULTI = 0x41 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FLOWID = 0x43 + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOWTYPE = 0x44 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVFLOWID = 0x46 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRSSBUCKETID = 0x47 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RSSBUCKETID = 0x45 + IPV6_RSS_LISTEN_BUCKET = 0x42 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BINDMULTI = 0x19 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FLOWID = 0x5a + IP_FLOWTYPE = 0x5b + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVFLOWID = 0x5d + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRSSBUCKETID = 0x5e + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSSBUCKETID = 0x5c + IP_RSS_LISTEN_BUCKET = 0x1a + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GUARD = 0x2000 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RESERVED0020 = 0x20 + MAP_RESERVED0040 = 0x40 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ACLS = 0x8000000 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x200000000 + MNT_BYFSID = 0x8000000 + MNT_CMDFLAGS = 0xd0f0000 + MNT_DEFEXPORTED = 0x200 + MNT_DELEXPORT = 0x20000 + MNT_EXKERB = 0x800 + MNT_EXPORTANON = 0x400 + MNT_EXPORTED = 0x100 + MNT_EXPUBLIC = 0x20000000 + MNT_EXRDONLY = 0x80 + MNT_FORCE = 0x80000 + MNT_GJOURNAL = 0x2000000 + MNT_IGNORE = 0x800000 + MNT_LAZY = 0x3 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NFS4ACLS = 0x10 + MNT_NOATIME = 0x10000000 + MNT_NOCLUSTERR = 0x40000000 + MNT_NOCLUSTERW = 0x80000000 + MNT_NOEXEC = 0x4 + MNT_NONBUSY = 0x4000000 + MNT_NOSUID = 0x8 + MNT_NOSYMFOLLOW = 0x400000 + MNT_NOWAIT = 0x2 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x1000000 + MNT_SOFTDEP = 0x200000 + MNT_SUIDDIR = 0x100000 + MNT_SUJ = 0x100000000 + MNT_SUSPEND = 0x4 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UPDATE = 0x10000 + MNT_UPDATEMASK = 0x2d8d0807e + MNT_USER = 0x8000 + MNT_VISFLAGMASK = 0x3fef0ffff + MNT_WAIT = 0x1 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITFORONE = 0x80000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_CLOSE = 0x100 + NOTE_CLOSE_WRITE = 0x200 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FILE_POLL = 0x2 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_OPEN = 0x80 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_READ = 0x400 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_VERIFY = 0x200000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FIXEDMTU = 0x80000 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_BLACKHOLE = 0x40 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_HAS_GW = 0x80 + RT_HAS_HEADER = 0x10 + RT_HAS_HEADER_BIT = 0x4 + RT_L2_ME = 0x4 + RT_L2_ME_BIT = 0x2 + RT_LLE_CACHE = 0x100 + RT_MAY_LOOP = 0x8 + RT_MAY_LOOP_BIT = 0x3 + RT_NORTREF = 0x2 + RT_REJECT = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGHWADDR = 0xc020693e + SIOCGI2C = 0xc020693d + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFXMEDIA = 0xc028698b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCGTUNFIB = 0xc020695e + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSTUNFIB = 0x8020695f + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TAB0 = 0x0 + TAB3 = 0x4 + TABDLY = 0x4 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CCALGOOPT = 0x41 + TCP_CONGESTION = 0x40 + TCP_FASTOPEN = 0x401 + TCP_FUNCTION_BLK = 0x2000 + TCP_FUNCTION_NAME_LEN_MAX = 0x20 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_PCAP_IN = 0x1000 + TCP_PCAP_OUT = 0x800 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +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(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + 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) + EDOOFUS = syscall.Errno(0x58) + 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(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + 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(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + 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(0x5c) + 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) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "ECANCELED", "operation canceled"}, + {86, "EILSEQ", "illegal byte sequence"}, + {87, "ENOATTR", "attribute not found"}, + {88, "EDOOFUS", "programming error"}, + {89, "EBADMSG", "bad message"}, + {90, "EMULTIHOP", "multihop attempted"}, + {91, "ENOLINK", "link has been severed"}, + {92, "EPROTO", "protocol error"}, + {93, "ENOTCAPABLE", "capabilities insufficient"}, + {94, "ECAPMODE", "not permitted in capability mode"}, + {95, "ENOTRECOVERABLE", "state not recoverable"}, + {96, "EOWNERDEAD", "previous owner died"}, +} + +// 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, "SIGIOT", "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", "unknown signal"}, + {33, "SIGLIBRT", "unknown signal"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go new file mode 100755 index 0000000..3c3d5e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -0,0 +1,2446 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go new file mode 100755 index 0000000..4229e97 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -0,0 +1,2447 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go new file mode 100755 index 0000000..d0c62ae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -0,0 +1,2454 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80041270 + BLKBSZSET = 0x40041271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80041272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFDPIC = 0x1f + PTRACE_GETFDPIC_EXEC = 0x0 + PTRACE_GETFDPIC_INTERP = 0x1 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x800854db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go new file mode 100755 index 0000000..018fe57 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -0,0 +1,2437 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ESR_MAGIC = 0x45535201 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + EXTRA_MAGIC = 0x45585401 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go new file mode 100755 index 0000000..f523b6c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -0,0 +1,2456 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {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, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go new file mode 100755 index 0000000..7e2e296 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -0,0 +1,2456 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {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, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go new file mode 100755 index 0000000..08f9638 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -0,0 +1,2456 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {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, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go new file mode 100755 index 0000000..3a3fd1d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -0,0 +1,2456 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x40041270 + BLKBSZSET = 0x80041271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40041272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x80 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x21 + F_GETLK64 = 0x21 + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x22 + F_SETLK64 = 0x22 + F_SETLKW = 0x23 + F_SETLKW64 = 0x23 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40042407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc004240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80042406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x9 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x5 + RLIMIT_NPROC = 0x8 + RLIMIT_RSS = 0x7 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x467f + SIOCOUTQ = 0x7472 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCGETS2 = 0x4030542a + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSBRKP = 0x5486 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETS2 = 0x8030542b + TCSETSF = 0x5410 + TCSETSF2 = 0x8030542d + TCSETSW = 0x540f + TCSETSW2 = 0x8030542c + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x800854d5 + TUNDETACHFILTER = 0x800854d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x400854db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "resource deadlock avoided"}, + {46, "ENOLCK", "no locks available"}, + {50, "EBADE", "invalid exchange"}, + {51, "EBADR", "invalid request descriptor"}, + {52, "EXFULL", "exchange full"}, + {53, "ENOANO", "no anode"}, + {54, "EBADRQC", "invalid request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "bad message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in too many shared libraries"}, + {87, "ELIBEXEC", "cannot exec a shared library directly"}, + {88, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {89, "ENOSYS", "function not implemented"}, + {90, "ELOOP", "too many levels of symbolic links"}, + {91, "ERESTART", "interrupted system call should be restarted"}, + {92, "ESTRPIPE", "streams pipe error"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "protocol not available"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "ENOTSUP", "operation not supported"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection on reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {135, "EUCLEAN", "structure needs cleaning"}, + {137, "ENOTNAM", "not a XENIX named type file"}, + {138, "ENAVAIL", "no XENIX semaphores available"}, + {139, "EISNAM", "is a named type file"}, + {140, "EREMOTEIO", "remote I/O error"}, + {141, "EINIT", "unknown error 141"}, + {142, "EREMDEV", "unknown error 142"}, + {143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale file handle"}, + {158, "ECANCELED", "operation canceled"}, + {159, "ENOMEDIUM", "no medium found"}, + {160, "EMEDIUMTYPE", "wrong medium type"}, + {161, "ENOKEY", "required key not available"}, + {162, "EKEYEXPIRED", "key has expired"}, + {163, "EKEYREVOKED", "key has been revoked"}, + {164, "EKEYREJECTED", "key was rejected by service"}, + {165, "EOWNERDEAD", "owner died"}, + {166, "ENOTRECOVERABLE", "state not recoverable"}, + {167, "ERFKILL", "operation not possible due to RF-kill"}, + {168, "EHWPOISON", "memory page has hardware error"}, + {1133, "EDQUOT", "disk quota exceeded"}, +} + +// 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {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, "SIGUSR1", "user defined signal 1"}, + {17, "SIGUSR2", "user defined signal 2"}, + {18, "SIGCHLD", "child exited"}, + {19, "SIGPWR", "power failure"}, + {20, "SIGWINCH", "window changed"}, + {21, "SIGURG", "urgent I/O condition"}, + {22, "SIGIO", "I/O possible"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual timer expired"}, + {29, "SIGPROF", "profiling timer expired"}, + {30, "SIGXCPU", "CPU time limit exceeded"}, + {31, "SIGXFSZ", "file size limit exceeded"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go new file mode 100755 index 0000000..3e6c178 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -0,0 +1,2509 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go new file mode 100755 index 0000000..4fabd8d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -0,0 +1,2509 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BLKBSZGET = 0x40081270 + BLKBSZSET = 0x80081271 + BLKFLSBUF = 0x20001261 + BLKFRAGET = 0x20001265 + BLKFRASET = 0x20001264 + BLKGETSIZE = 0x20001260 + BLKGETSIZE64 = 0x40081272 + BLKPBSZGET = 0x2000127b + BLKRAGET = 0x20001263 + BLKRASET = 0x20001262 + BLKROGET = 0x2000125e + BLKROSET = 0x2000125d + BLKRRPART = 0x2000125f + BLKSECTGET = 0x20001267 + BLKSECTSET = 0x20001266 + BLKSSZGET = 0x20001268 + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x800c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x80106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x400c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x200007b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x404000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PERF_EVENT_IOC_DISABLE = 0x20002401 + PERF_EVENT_IOC_ENABLE = 0x20002400 + PERF_EVENT_IOC_ID = 0x40082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x80042409 + PERF_EVENT_IOC_PERIOD = 0x80082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x20002402 + PERF_EVENT_IOC_RESET = 0x20002403 + PERF_EVENT_IOC_SET_BPF = 0x80042408 + PERF_EVENT_IOC_SET_FILTER = 0x80082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x20002405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGPTPEER = 0x20005441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETFILTEREBPF = 0x400454e1 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETSTEERINGEBPF = 0x400454e0 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x5 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x40045702 + WDIOC_GETPRETIMEOUT = 0x40045709 + WDIOC_GETSTATUS = 0x40045701 + WDIOC_GETSUPPORT = 0x40285700 + WDIOC_GETTEMP = 0x40045703 + WDIOC_GETTIMELEFT = 0x4004570a + WDIOC_GETTIMEOUT = 0x40045707 + WDIOC_KEEPALIVE = 0x40045705 + WDIOC_SETOPTIONS = 0x40045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {58, "EDEADLOCK", "file locking deadlock error"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go new file mode 100755 index 0000000..685667a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -0,0 +1,2508 @@ +// mkerrors.sh -Wall -Werror -static -I/tmp/include -fsigned-char +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2c + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_QIPCRTR = 0x2a + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SMC = 0x2b + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_RAWIP = 0x207 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_VSOCKMON = 0x33a + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKPBSZGET = 0x127b + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RAW_FILTER_MAX = 0x200 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EFD_CLOEXEC = 0x80000 + EFD_NONBLOCK = 0x800 + EFD_SEMAPHORE = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_ERSPAN = 0x88be + ETH_P_ERSPAN2 = 0x22eb + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IBOE = 0x8915 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IFE = 0xed3e + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MAP = 0xf9 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_NCSI = 0x88f8 + ETH_P_NSH = 0x894f + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXABYTE_ENABLE_NEST = 0xf0 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_UNSHARE_RANGE = 0x40 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + FS_ENCRYPTION_MODE_AES_128_CBC = 0x5 + FS_ENCRYPTION_MODE_AES_128_CTS = 0x6 + FS_ENCRYPTION_MODE_AES_256_CBC = 0x3 + FS_ENCRYPTION_MODE_AES_256_CTS = 0x4 + FS_ENCRYPTION_MODE_AES_256_GCM = 0x2 + FS_ENCRYPTION_MODE_AES_256_XTS = 0x1 + FS_ENCRYPTION_MODE_INVALID = 0x0 + FS_IOC_GET_ENCRYPTION_POLICY = 0x400c6615 + FS_IOC_GET_ENCRYPTION_PWSALT = 0x40106614 + FS_IOC_SET_ENCRYPTION_POLICY = 0x800c6613 + FS_KEY_DESCRIPTOR_SIZE = 0x8 + FS_KEY_DESC_PREFIX = "fscrypt:" + FS_KEY_DESC_PREFIX_SIZE = 0x8 + FS_MAX_KEY_SIZE = 0x40 + FS_POLICY_FLAGS_PAD_16 = 0x2 + FS_POLICY_FLAGS_PAD_32 = 0x3 + FS_POLICY_FLAGS_PAD_4 = 0x0 + FS_POLICY_FLAGS_PAD_8 = 0x1 + FS_POLICY_FLAGS_PAD_MASK = 0x3 + FS_POLICY_FLAGS_VALID = 0x3 + F_ADD_SEALS = 0x409 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_GET_FILE_RW_HINT = 0x40d + F_GET_RW_HINT = 0x40b + F_GET_SEALS = 0x40a + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SEAL_GROW = 0x4 + F_SEAL_SEAL = 0x1 + F_SEAL_SHRINK = 0x2 + F_SEAL_WRITE = 0x8 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SET_FILE_RW_HINT = 0x40e + F_SET_RW_HINT = 0x40c + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + GENL_ADMIN_PERM = 0x1 + GENL_CMD_CAP_DO = 0x2 + GENL_CMD_CAP_DUMP = 0x4 + GENL_CMD_CAP_HASPOL = 0x8 + GENL_HDRLEN = 0x4 + GENL_ID_CTRL = 0x10 + GENL_ID_PMCRAID = 0x12 + GENL_ID_VFS_DQUOT = 0x11 + GENL_MAX_ID = 0x3ff + GENL_MIN_ID = 0x10 + GENL_NAMSIZ = 0x10 + GENL_START_ALLOC = 0x13 + GENL_UNS_ADMIN_PERM = 0x10 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HDIO_DRIVE_CMD = 0x31f + HDIO_DRIVE_CMD_AEB = 0x31e + HDIO_DRIVE_CMD_HDR_SIZE = 0x4 + HDIO_DRIVE_HOB_HDR_SIZE = 0x8 + HDIO_DRIVE_RESET = 0x31c + HDIO_DRIVE_TASK = 0x31e + HDIO_DRIVE_TASKFILE = 0x31d + HDIO_DRIVE_TASK_HDR_SIZE = 0x8 + HDIO_GETGEO = 0x301 + HDIO_GET_32BIT = 0x309 + HDIO_GET_ACOUSTIC = 0x30f + HDIO_GET_ADDRESS = 0x310 + HDIO_GET_BUSSTATE = 0x31a + HDIO_GET_DMA = 0x30b + HDIO_GET_IDENTITY = 0x30d + HDIO_GET_KEEPSETTINGS = 0x308 + HDIO_GET_MULTCOUNT = 0x304 + HDIO_GET_NICE = 0x30c + HDIO_GET_NOWERR = 0x30a + HDIO_GET_QDMA = 0x305 + HDIO_GET_UNMASKINTR = 0x302 + HDIO_GET_WCACHE = 0x30e + HDIO_OBSOLETE_IDENTITY = 0x307 + HDIO_SCAN_HWIF = 0x328 + HDIO_SET_32BIT = 0x324 + HDIO_SET_ACOUSTIC = 0x32c + HDIO_SET_ADDRESS = 0x32f + HDIO_SET_BUSSTATE = 0x32d + HDIO_SET_DMA = 0x326 + HDIO_SET_KEEPSETTINGS = 0x323 + HDIO_SET_MULTCOUNT = 0x321 + HDIO_SET_NICE = 0x329 + HDIO_SET_NOWERR = 0x325 + HDIO_SET_PIO_MODE = 0x327 + HDIO_SET_QDMA = 0x32e + HDIO_SET_UNMASKINTR = 0x322 + HDIO_SET_WCACHE = 0x32b + HDIO_SET_XFER = 0x306 + HDIO_TRISTATE_HWIF = 0x31b + HDIO_UNREGISTER_HWIF = 0x32a + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NAPI = 0x10 + IFF_NAPI_FRAGS = 0x20 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x7b9 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADDR_PREFERENCES = 0x48 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_AUTOFLOWLABEL = 0x46 + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MINHOPCOUNT = 0x49 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_ORIGDSTADDR = 0x4a + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVFRAGSIZE = 0x4d + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVORIGDSTADDR = 0x4a + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_TRANSPARENT = 0x4b + IPV6_UNICAST_HOPS = 0x10 + IPV6_UNICAST_IF = 0x4c + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVFRAGSIZE = 0x19 + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + KEYCTL_ASSUME_AUTHORITY = 0x10 + KEYCTL_CHOWN = 0x4 + KEYCTL_CLEAR = 0x7 + KEYCTL_DESCRIBE = 0x6 + KEYCTL_DH_COMPUTE = 0x17 + KEYCTL_GET_KEYRING_ID = 0x0 + KEYCTL_GET_PERSISTENT = 0x16 + KEYCTL_GET_SECURITY = 0x11 + KEYCTL_INSTANTIATE = 0xc + KEYCTL_INSTANTIATE_IOV = 0x14 + KEYCTL_INVALIDATE = 0x15 + KEYCTL_JOIN_SESSION_KEYRING = 0x1 + KEYCTL_LINK = 0x8 + KEYCTL_NEGATE = 0xd + KEYCTL_READ = 0xb + KEYCTL_REJECT = 0x13 + KEYCTL_RESTRICT_KEYRING = 0x1d + KEYCTL_REVOKE = 0x3 + KEYCTL_SEARCH = 0xa + KEYCTL_SESSION_TO_PARENT = 0x12 + KEYCTL_SETPERM = 0x5 + KEYCTL_SET_REQKEY_KEYRING = 0xe + KEYCTL_SET_TIMEOUT = 0xf + KEYCTL_UNLINK = 0x9 + KEYCTL_UPDATE = 0x2 + KEY_REQKEY_DEFL_DEFAULT = 0x0 + KEY_REQKEY_DEFL_GROUP_KEYRING = 0x6 + KEY_REQKEY_DEFL_NO_CHANGE = -0x1 + KEY_REQKEY_DEFL_PROCESS_KEYRING = 0x2 + KEY_REQKEY_DEFL_REQUESTOR_KEYRING = 0x7 + KEY_REQKEY_DEFL_SESSION_KEYRING = 0x3 + KEY_REQKEY_DEFL_THREAD_KEYRING = 0x1 + KEY_REQKEY_DEFL_USER_KEYRING = 0x4 + KEY_REQKEY_DEFL_USER_SESSION_KEYRING = 0x5 + KEY_SPEC_GROUP_KEYRING = -0x6 + KEY_SPEC_PROCESS_KEYRING = -0x2 + KEY_SPEC_REQKEY_AUTH_KEY = -0x7 + KEY_SPEC_REQUESTOR_KEYRING = -0x8 + KEY_SPEC_SESSION_KEYRING = -0x3 + KEY_SPEC_THREAD_KEYRING = -0x1 + KEY_SPEC_USER_KEYRING = -0x4 + KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_KEEPONFORK = 0x13 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MADV_WIPEONFORK = 0x12 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MSG_ZEROCOPY = 0x4000000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_BORN = 0x20000000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOREMOTELOCK = 0x8000000 + MS_NOSEC = 0x10000000 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SUBMOUNT = 0x4000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + MS_VERBOSE = 0x8000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_EXT_ACK = 0xb + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SMC = 0x16 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_ACK_TLVS = 0x200 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CAPPED = 0x100 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_NONREC = 0x100 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_FLAG_UNIQUEID = 0x2000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PERF_EVENT_IOC_DISABLE = 0x2401 + PERF_EVENT_IOC_ENABLE = 0x2400 + PERF_EVENT_IOC_ID = 0x80082407 + PERF_EVENT_IOC_PAUSE_OUTPUT = 0x40042409 + PERF_EVENT_IOC_PERIOD = 0x40082404 + PERF_EVENT_IOC_QUERY_BPF = 0xc008240a + PERF_EVENT_IOC_REFRESH = 0x2402 + PERF_EVENT_IOC_RESET = 0x2403 + PERF_EVENT_IOC_SET_BPF = 0x40042408 + PERF_EVENT_IOC_SET_FILTER = 0x40082406 + PERF_EVENT_IOC_SET_OUTPUT = 0x2405 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffffffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_SVE_GET_VL = 0x33 + PR_SVE_SET_VL = 0x32 + PR_SVE_SET_VL_ONEXEC = 0x40000 + PR_SVE_VL_INHERIT = 0x20000 + PR_SVE_VL_LEN_MASK = 0xffff + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SECCOMP_GET_METADATA = 0x420d + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_LOCKS = 0xa + RLIMIT_MEMLOCK = 0x8 + RLIMIT_MSGQUEUE = 0xc + RLIMIT_NICE = 0xd + RLIMIT_NOFILE = 0x7 + RLIMIT_NPROC = 0x6 + RLIMIT_RSS = 0x5 + RLIMIT_RTPRIO = 0xe + RLIMIT_RTTIME = 0xf + RLIMIT_SIGPENDING = 0xb + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0xffffffffffffffff + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FASTOPEN_NO_COOKIE = 0x11 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x11 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x1a + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNETCONF = 0x51 + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_FIB_MATCH = 0x2000 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x63 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWCACHEREPORT = 0x60 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x15 + RTM_NR_MSGTYPES = 0x54 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x19 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTNH_F_UNRESOLVED = 0x20 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPING_OPT_STATS = 0x36 + SCM_TIMESTAMPING_PKTINFO = 0x3a + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SECCOMP_MODE_DISABLED = 0x0 + SECCOMP_MODE_FILTER = 0x2 + SECCOMP_MODE_STRICT = 0x1 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSKNS = 0x894c + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x541b + SIOCOUTQ = 0x5411 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SMART_AUTOSAVE = 0xd2 + SMART_AUTO_OFFLINE = 0xdb + SMART_DISABLE = 0xd9 + SMART_ENABLE = 0xd8 + SMART_HCYL_PASS = 0xc2 + SMART_IMMEDIATE_OFFLINE = 0xd4 + SMART_LCYL_PASS = 0x4f + SMART_READ_LOG_SECTOR = 0xd5 + SMART_READ_THRESHOLDS = 0xd1 + SMART_READ_VALUES = 0xd0 + SMART_SAVE = 0xd3 + SMART_STATUS = 0xda + SMART_WRITE_LOG_SECTOR = 0xd6 + SMART_WRITE_THRESHOLDS = 0xd7 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_IOC_TYPE = 0x89 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_CAN_BASE = 0x64 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_TLS = 0x11a + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x33 + SO_ATTACH_REUSEPORT_EBPF = 0x34 + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_CNX_ADVICE = 0x35 + SO_COOKIE = 0x39 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_INCOMING_NAPI_ID = 0x38 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_MEMINFO = 0x37 + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERGROUPS = 0x3b + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x29 + SO_ZEROCOPY = 0x3c + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + STATX_ALL = 0xfff + STATX_ATIME = 0x20 + STATX_ATTR_APPEND = 0x20 + STATX_ATTR_AUTOMOUNT = 0x1000 + STATX_ATTR_COMPRESSED = 0x4 + STATX_ATTR_ENCRYPTED = 0x800 + STATX_ATTR_IMMUTABLE = 0x10 + STATX_ATTR_NODUMP = 0x40 + STATX_BASIC_STATS = 0x7ff + STATX_BLOCKS = 0x400 + STATX_BTIME = 0x800 + STATX_CTIME = 0x80 + STATX_GID = 0x10 + STATX_INO = 0x100 + STATX_MODE = 0x2 + STATX_MTIME = 0x40 + STATX_NLINK = 0x4 + STATX_SIZE = 0x200 + STATX_TYPE = 0x1 + STATX_UID = 0x8 + STATX__RESERVED = 0x80000000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TASKSTATS_CMD_ATTR_MAX = 0x4 + TASKSTATS_CMD_MAX = 0x2 + TASKSTATS_GENL_NAME = "TASKSTATS" + TASKSTATS_GENL_VERSION = 0x1 + TASKSTATS_TYPE_MAX = 0x6 + TASKSTATS_VERSION = 0x8 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_FASTOPEN_CONNECT = 0x1e + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_EXT = 0x20 + TCP_MD5SIG_FLAG_PREFIX = 0x1 + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_REPAIR_WINDOW = 0x1d + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_ULP = 0x1f + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGPTPEER = 0x5441 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TS_COMM_LEN = 0x20 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETFILTEREBPF = 0x800454e1 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETSTEERINGEBPF = 0x800454e0 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + UMOUNT_NOFOLLOW = 0x8 + UTIME_NOW = 0x3fffffff + UTIME_OMIT = 0x3ffffffe + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x6 + VM_SOCKETS_INVALID_VERSION = 0xffffffff + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WDIOC_GETBOOTSTATUS = 0x80045702 + WDIOC_GETPRETIMEOUT = 0x80045709 + WDIOC_GETSTATUS = 0x80045701 + WDIOC_GETSUPPORT = 0x80285700 + WDIOC_GETTEMP = 0x80045703 + WDIOC_GETTIMELEFT = 0x8004570a + WDIOC_GETTIMEOUT = 0x80045707 + WDIOC_KEEPALIVE = 0x80045705 + WDIOC_SETOPTIONS = 0x80045704 + WDIOC_SETPRETIMEOUT = 0xc0045708 + WDIOC_SETTIMEOUT = 0xc0045706 + WEXITED = 0x4 + WIN_ACKMEDIACHANGE = 0xdb + WIN_CHECKPOWERMODE1 = 0xe5 + WIN_CHECKPOWERMODE2 = 0x98 + WIN_DEVICE_RESET = 0x8 + WIN_DIAGNOSE = 0x90 + WIN_DOORLOCK = 0xde + WIN_DOORUNLOCK = 0xdf + WIN_DOWNLOAD_MICROCODE = 0x92 + WIN_FLUSH_CACHE = 0xe7 + WIN_FLUSH_CACHE_EXT = 0xea + WIN_FORMAT = 0x50 + WIN_GETMEDIASTATUS = 0xda + WIN_IDENTIFY = 0xec + WIN_IDENTIFY_DMA = 0xee + WIN_IDLEIMMEDIATE = 0xe1 + WIN_INIT = 0x60 + WIN_MEDIAEJECT = 0xed + WIN_MULTREAD = 0xc4 + WIN_MULTREAD_EXT = 0x29 + WIN_MULTWRITE = 0xc5 + WIN_MULTWRITE_EXT = 0x39 + WIN_NOP = 0x0 + WIN_PACKETCMD = 0xa0 + WIN_PIDENTIFY = 0xa1 + WIN_POSTBOOT = 0xdc + WIN_PREBOOT = 0xdd + WIN_QUEUED_SERVICE = 0xa2 + WIN_READ = 0x20 + WIN_READDMA = 0xc8 + WIN_READDMA_EXT = 0x25 + WIN_READDMA_ONCE = 0xc9 + WIN_READDMA_QUEUED = 0xc7 + WIN_READDMA_QUEUED_EXT = 0x26 + WIN_READ_BUFFER = 0xe4 + WIN_READ_EXT = 0x24 + WIN_READ_LONG = 0x22 + WIN_READ_LONG_ONCE = 0x23 + WIN_READ_NATIVE_MAX = 0xf8 + WIN_READ_NATIVE_MAX_EXT = 0x27 + WIN_READ_ONCE = 0x21 + WIN_RECAL = 0x10 + WIN_RESTORE = 0x10 + WIN_SECURITY_DISABLE = 0xf6 + WIN_SECURITY_ERASE_PREPARE = 0xf3 + WIN_SECURITY_ERASE_UNIT = 0xf4 + WIN_SECURITY_FREEZE_LOCK = 0xf5 + WIN_SECURITY_SET_PASS = 0xf1 + WIN_SECURITY_UNLOCK = 0xf2 + WIN_SEEK = 0x70 + WIN_SETFEATURES = 0xef + WIN_SETIDLE1 = 0xe3 + WIN_SETIDLE2 = 0x97 + WIN_SETMULT = 0xc6 + WIN_SET_MAX = 0xf9 + WIN_SET_MAX_EXT = 0x37 + WIN_SLEEPNOW1 = 0xe6 + WIN_SLEEPNOW2 = 0x99 + WIN_SMART = 0xb0 + WIN_SPECIFY = 0x91 + WIN_SRST = 0x8 + WIN_STANDBY = 0xe2 + WIN_STANDBY2 = 0x96 + WIN_STANDBYNOW1 = 0xe0 + WIN_STANDBYNOW2 = 0x94 + WIN_VERIFY = 0x40 + WIN_VERIFY_EXT = 0x42 + WIN_VERIFY_ONCE = 0x41 + WIN_WRITE = 0x30 + WIN_WRITEDMA = 0xca + WIN_WRITEDMA_EXT = 0x35 + WIN_WRITEDMA_ONCE = 0xcb + WIN_WRITEDMA_QUEUED = 0xcc + WIN_WRITEDMA_QUEUED_EXT = 0x36 + WIN_WRITE_BUFFER = 0xe8 + WIN_WRITE_EXT = 0x34 + WIN_WRITE_LONG = 0x32 + WIN_WRITE_LONG_ONCE = 0x33 + WIN_WRITE_ONCE = 0x31 + WIN_WRITE_SAME = 0xe9 + WIN_WRITE_VERIFY = 0x3c + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XATTR_CREATE = 0x1 + XATTR_REPLACE = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + 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", "no such device or address"}, + {7, "E2BIG", "argument list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file descriptor"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "cannot allocate memory"}, + {13, "EACCES", "permission denied"}, + {14, "EFAULT", "bad address"}, + {15, "ENOTBLK", "block device required"}, + {16, "EBUSY", "device or resource busy"}, + {17, "EEXIST", "file exists"}, + {18, "EXDEV", "invalid cross-device link"}, + {19, "ENODEV", "no such 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", "numerical result out of range"}, + {35, "EDEADLK", "resource deadlock avoided"}, + {36, "ENAMETOOLONG", "file name too long"}, + {37, "ENOLCK", "no locks available"}, + {38, "ENOSYS", "function not implemented"}, + {39, "ENOTEMPTY", "directory not empty"}, + {40, "ELOOP", "too many levels of symbolic links"}, + {42, "ENOMSG", "no message of desired type"}, + {43, "EIDRM", "identifier removed"}, + {44, "ECHRNG", "channel number out of range"}, + {45, "EL2NSYNC", "level 2 not synchronized"}, + {46, "EL3HLT", "level 3 halted"}, + {47, "EL3RST", "level 3 reset"}, + {48, "ELNRNG", "link number out of range"}, + {49, "EUNATCH", "protocol driver not attached"}, + {50, "ENOCSI", "no CSI structure available"}, + {51, "EL2HLT", "level 2 halted"}, + {52, "EBADE", "invalid exchange"}, + {53, "EBADR", "invalid request descriptor"}, + {54, "EXFULL", "exchange full"}, + {55, "ENOANO", "no anode"}, + {56, "EBADRQC", "invalid request code"}, + {57, "EBADSLT", "invalid slot"}, + {59, "EBFONT", "bad font file format"}, + {60, "ENOSTR", "device not a stream"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of streams resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "EMULTIHOP", "multihop attempted"}, + {73, "EDOTDOT", "RFS specific error"}, + {74, "EBADMSG", "bad message"}, + {75, "EOVERFLOW", "value too large for defined data type"}, + {76, "ENOTUNIQ", "name not unique on network"}, + {77, "EBADFD", "file descriptor in bad state"}, + {78, "EREMCHG", "remote address changed"}, + {79, "ELIBACC", "can not access a needed shared library"}, + {80, "ELIBBAD", "accessing a corrupted shared library"}, + {81, "ELIBSCN", ".lib section in a.out corrupted"}, + {82, "ELIBMAX", "attempting to link in too many shared libraries"}, + {83, "ELIBEXEC", "cannot exec a shared library directly"}, + {84, "EILSEQ", "invalid or incomplete multibyte or wide character"}, + {85, "ERESTART", "interrupted system call should be restarted"}, + {86, "ESTRPIPE", "streams pipe error"}, + {87, "EUSERS", "too many users"}, + {88, "ENOTSOCK", "socket operation on non-socket"}, + {89, "EDESTADDRREQ", "destination address required"}, + {90, "EMSGSIZE", "message too long"}, + {91, "EPROTOTYPE", "protocol wrong type for socket"}, + {92, "ENOPROTOOPT", "protocol not available"}, + {93, "EPROTONOSUPPORT", "protocol not supported"}, + {94, "ESOCKTNOSUPPORT", "socket type not supported"}, + {95, "ENOTSUP", "operation not supported"}, + {96, "EPFNOSUPPORT", "protocol family not supported"}, + {97, "EAFNOSUPPORT", "address family not supported by protocol"}, + {98, "EADDRINUSE", "address already in use"}, + {99, "EADDRNOTAVAIL", "cannot assign requested address"}, + {100, "ENETDOWN", "network is down"}, + {101, "ENETUNREACH", "network is unreachable"}, + {102, "ENETRESET", "network dropped connection on reset"}, + {103, "ECONNABORTED", "software caused connection abort"}, + {104, "ECONNRESET", "connection reset by peer"}, + {105, "ENOBUFS", "no buffer space available"}, + {106, "EISCONN", "transport endpoint is already connected"}, + {107, "ENOTCONN", "transport endpoint is not connected"}, + {108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"}, + {109, "ETOOMANYREFS", "too many references: cannot splice"}, + {110, "ETIMEDOUT", "connection timed out"}, + {111, "ECONNREFUSED", "connection refused"}, + {112, "EHOSTDOWN", "host is down"}, + {113, "EHOSTUNREACH", "no route to host"}, + {114, "EALREADY", "operation already in progress"}, + {115, "EINPROGRESS", "operation now in progress"}, + {116, "ESTALE", "stale file handle"}, + {117, "EUCLEAN", "structure needs cleaning"}, + {118, "ENOTNAM", "not a XENIX named type file"}, + {119, "ENAVAIL", "no XENIX semaphores available"}, + {120, "EISNAM", "is a named type file"}, + {121, "EREMOTEIO", "remote I/O error"}, + {122, "EDQUOT", "disk quota exceeded"}, + {123, "ENOMEDIUM", "no medium found"}, + {124, "EMEDIUMTYPE", "wrong medium type"}, + {125, "ECANCELED", "operation canceled"}, + {126, "ENOKEY", "required key not available"}, + {127, "EKEYEXPIRED", "key has expired"}, + {128, "EKEYREVOKED", "key has been revoked"}, + {129, "EKEYREJECTED", "key was rejected by service"}, + {130, "EOWNERDEAD", "owner died"}, + {131, "ENOTRECOVERABLE", "state not recoverable"}, + {132, "ERFKILL", "operation not possible due to RF-kill"}, + {133, "EHWPOISON", "memory page has hardware 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/breakpoint trap"}, + {6, "SIGABRT", "aborted"}, + {7, "SIGBUS", "bus error"}, + {8, "SIGFPE", "floating point exception"}, + {9, "SIGKILL", "killed"}, + {10, "SIGUSR1", "user defined signal 1"}, + {11, "SIGSEGV", "segmentation fault"}, + {12, "SIGUSR2", "user defined signal 2"}, + {13, "SIGPIPE", "broken pipe"}, + {14, "SIGALRM", "alarm clock"}, + {15, "SIGTERM", "terminated"}, + {16, "SIGSTKFLT", "stack fault"}, + {17, "SIGCHLD", "child exited"}, + {18, "SIGCONT", "continued"}, + {19, "SIGSTOP", "stopped (signal)"}, + {20, "SIGTSTP", "stopped"}, + {21, "SIGTTIN", "stopped (tty input)"}, + {22, "SIGTTOU", "stopped (tty output)"}, + {23, "SIGURG", "urgent I/O condition"}, + {24, "SIGXCPU", "CPU time limit exceeded"}, + {25, "SIGXFSZ", "file size limit exceeded"}, + {26, "SIGVTALRM", "virtual timer expired"}, + {27, "SIGPROF", "profiling timer expired"}, + {28, "SIGWINCH", "window changed"}, + {29, "SIGIO", "I/O possible"}, + {30, "SIGPWR", "power failure"}, + {31, "SIGSYS", "bad system call"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go new file mode 100755 index 0000000..95de199 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -0,0 +1,2142 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build sparc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KCM = 0x29 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ALG_OP_DECRYPT = 0x0 + ALG_OP_ENCRYPT = 0x1 + ALG_SET_AEAD_ASSOCLEN = 0x4 + ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_IV = 0x2 + ALG_SET_KEY = 0x1 + ALG_SET_OP = 0x3 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + ASI_LEON_DFLUSH = 0x11 + ASI_LEON_IFLUSH = 0x10 + ASI_LEON_MMUFLUSH = 0x18 + B0 = 0x0 + B1000000 = 0x100c + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x100d + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100e + B153600 = 0x1006 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100f + B230400 = 0x1003 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x1007 + B38400 = 0xf + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x100a + B57600 = 0x1001 + B576000 = 0x100b + B600 = 0x8 + B614400 = 0x1008 + B75 = 0x2 + B76800 = 0x1005 + B921600 = 0x1009 + B9600 = 0xd + BLKBSZGET = 0x80081270 + BLKBSZSET = 0x40081271 + BLKFLSBUF = 0x1261 + BLKFRAGET = 0x1265 + BLKFRASET = 0x1264 + BLKGETSIZE = 0x1260 + BLKGETSIZE64 = 0x80081272 + BLKRAGET = 0x1263 + BLKRASET = 0x1262 + BLKROGET = 0x125e + BLKROSET = 0x125d + BLKRRPART = 0x125f + BLKSECTGET = 0x1267 + BLKSECTSET = 0x1266 + BLKSSZGET = 0x1268 + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CAN_BCM = 0x2 + CAN_EFF_FLAG = 0x80000000 + CAN_EFF_ID_BITS = 0x1d + CAN_EFF_MASK = 0x1fffffff + CAN_ERR_FLAG = 0x20000000 + CAN_ERR_MASK = 0x1fffffff + CAN_INV_FILTER = 0x20000000 + CAN_ISOTP = 0x6 + CAN_MAX_DLC = 0x8 + CAN_MAX_DLEN = 0x8 + CAN_MCNET = 0x5 + CAN_MTU = 0x10 + CAN_NPROTO = 0x7 + CAN_RAW = 0x1 + CAN_RTR_FLAG = 0x40000000 + CAN_SFF_ID_BITS = 0xb + CAN_SFF_MASK = 0x7ff + CAN_TP16 = 0x3 + CAN_TP20 = 0x4 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMT_TAGOVF = 0x1 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLEXCLUSIVE = 0x10000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x400000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_HSR = 0x892f + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MACSEC = 0x88e5 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FALLOC_FL_COLLAPSE_RANGE = 0x8 + FALLOC_FL_INSERT_RANGE = 0x20 + FALLOC_FL_KEEP_SIZE = 0x1 + FALLOC_FL_NO_HIDE_STALE = 0x4 + FALLOC_FL_PUNCH_HOLE = 0x2 + FALLOC_FL_ZERO_RANGE = 0x10 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x7 + F_GETLK64 = 0x7 + F_GETOWN = 0x5 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x8 + F_SETLK64 = 0x8 + F_SETLKW = 0x9 + F_SETLKW64 = 0x9 + F_SETOWN = 0x6 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x3 + F_WRLCK = 0x2 + GRND_NONBLOCK = 0x1 + GRND_RANDOM = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x400000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x4000 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HDRINCL = 0x24 + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_FREE = 0x8 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x200 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x100 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MCL_ONFAULT = 0x8000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_BATCH = 0x40000 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x100000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x2000 + O_EXCL = 0x800 + O_FSYNC = 0x802000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x4004 + O_NOATIME = 0x200000 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x4000 + O_PATH = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x802000 + O_SYNC = 0x802000 + O_TMPFILE = 0x2010000 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPAREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPREGS64 = 0x19 + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_READDATA = 0x10 + PTRACE_READTEXT = 0x12 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPAREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPREGS64 = 0x1a + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SPARC_DETACH = 0xb + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PTRACE_WRITEDATA = 0x11 + PTRACE_WRITETEXT = 0x13 + PT_FP = 0x48 + PT_G0 = 0x10 + PT_G1 = 0x14 + PT_G2 = 0x18 + PT_G3 = 0x1c + PT_G4 = 0x20 + PT_G5 = 0x24 + PT_G6 = 0x28 + PT_G7 = 0x2c + PT_I0 = 0x30 + PT_I1 = 0x34 + PT_I2 = 0x38 + PT_I3 = 0x3c + PT_I4 = 0x40 + PT_I5 = 0x44 + PT_I6 = 0x48 + PT_I7 = 0x4c + PT_NPC = 0x8 + PT_PC = 0x4 + PT_PSR = 0x0 + PT_REGS_MAGIC = 0x57ac6c00 + PT_TNPC = 0x90 + PT_TPC = 0x88 + PT_TSTATE = 0x80 + PT_V9_FP = 0x70 + PT_V9_G0 = 0x0 + PT_V9_G1 = 0x8 + PT_V9_G2 = 0x10 + PT_V9_G3 = 0x18 + PT_V9_G4 = 0x20 + PT_V9_G5 = 0x28 + PT_V9_G6 = 0x30 + PT_V9_G7 = 0x38 + PT_V9_I0 = 0x40 + PT_V9_I1 = 0x48 + PT_V9_I2 = 0x50 + PT_V9_I3 = 0x58 + PT_V9_I4 = 0x60 + PT_V9_I5 = 0x68 + PT_V9_I6 = 0x70 + PT_V9_I7 = 0x78 + PT_V9_MAGIC = 0x9c + PT_V9_TNPC = 0x90 + PT_V9_TPC = 0x88 + PT_V9_TSTATE = 0x80 + PT_V9_Y = 0x98 + PT_WIM = 0x10 + PT_Y = 0xc + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x6 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x18 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETSTATS = 0x5e + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWSTATS = 0x5c + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x14 + RTM_NR_MSGTYPES = 0x50 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x23 + SCM_TIMESTAMPNS = 0x21 + SCM_WIFI_STATUS = 0x25 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCBONDCHANGEACTIVE = 0x8995 + SIOCBONDENSLAVE = 0x8990 + SIOCBONDINFOQUERY = 0x8994 + SIOCBONDRELEASE = 0x8991 + SIOCBONDSETHWADDR = 0x8992 + SIOCBONDSLAVEINFOQUERY = 0x8993 + SIOCBRADDBR = 0x89a0 + SIOCBRADDIF = 0x89a2 + SIOCBRDELBR = 0x89a1 + SIOCBRDELIF = 0x89a3 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCETHTOOL = 0x8946 + SIOCGARP = 0x8954 + SIOCGHWTSTAMP = 0x89b1 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGIFVLAN = 0x8982 + SIOCGMIIPHY = 0x8947 + SIOCGMIIREG = 0x8948 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCINQ = 0x4004667f + SIOCOUTQ = 0x40047473 + SIOCOUTQNSD = 0x894b + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSHWTSTAMP = 0x89b0 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSIFVLAN = 0x8983 + SIOCSMIIREG = 0x8949 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SIOCWANDEV = 0x894a + SOCK_CLOEXEC = 0x400000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ALG = 0x117 + SOL_ATM = 0x108 + SOL_CAIF = 0x116 + SOL_DCCP = 0x10d + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_IUCV = 0x115 + SOL_KCM = 0x119 + SOL_LLC = 0x10c + SOL_NETBEUI = 0x10b + SOL_NETLINK = 0x10e + SOL_NFC = 0x118 + SOL_PACKET = 0x107 + SOL_PNPIPE = 0x113 + SOL_PPPOL2TP = 0x111 + SOL_RAW = 0xff + SOL_RDS = 0x114 + SOL_RXRPC = 0x110 + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_TIPC = 0x10f + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x8000 + SO_ATTACH_BPF = 0x34 + SO_ATTACH_FILTER = 0x1a + SO_ATTACH_REUSEPORT_CBPF = 0x35 + SO_ATTACH_REUSEPORT_EBPF = 0x36 + SO_BINDTODEVICE = 0xd + SO_BPF_EXTENSIONS = 0x32 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0x400 + SO_BUSY_POLL = 0x30 + SO_CNX_ADVICE = 0x37 + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x33 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x28 + SO_MARK = 0x22 + SO_MAX_PACING_RATE = 0x31 + SO_NOFCS = 0x27 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x2 + SO_PASSSEC = 0x1f + SO_PEEK_OFF = 0x26 + SO_PEERCRED = 0x40 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x100b + SO_RCVLOWAT = 0x800 + SO_RCVTIMEO = 0x2000 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x24 + SO_SECURITY_AUTHENTICATION = 0x5001 + SO_SECURITY_ENCRYPTION_NETWORK = 0x5004 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x5002 + SO_SELECT_ERR_QUEUE = 0x29 + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x100a + SO_SNDLOWAT = 0x1000 + SO_SNDTIMEO = 0x4000 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x23 + SO_TIMESTAMPNS = 0x21 + SO_TYPE = 0x1008 + SO_VM_SOCKETS_BUFFER_MAX_SIZE = 0x2 + SO_VM_SOCKETS_BUFFER_MIN_SIZE = 0x1 + SO_VM_SOCKETS_BUFFER_SIZE = 0x0 + SO_VM_SOCKETS_CONNECT_TIMEOUT = 0x6 + SO_VM_SOCKETS_NONBLOCK_TXRX = 0x7 + SO_VM_SOCKETS_PEER_HOST_VM_ID = 0x3 + SO_VM_SOCKETS_TRUSTED = 0x5 + SO_WIFI_STATUS = 0x25 + SPLICE_F_GIFT = 0x8 + SPLICE_F_MORE = 0x4 + SPLICE_F_MOVE = 0x1 + SPLICE_F_NONBLOCK = 0x2 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x20005407 + TCGETA = 0x40125401 + TCGETS = 0x40245408 + TCGETS2 = 0x402c540c + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x20005405 + TCSBRKP = 0x5425 + TCSETA = 0x80125402 + TCSETAF = 0x80125404 + TCSETAW = 0x80125403 + TCSETS = 0x80245409 + TCSETS2 = 0x802c540d + TCSETSF = 0x8024540b + TCSETSF2 = 0x802c540f + TCSETSW = 0x8024540a + TCSETSW2 = 0x802c540e + TCXONC = 0x20005406 + TIOCCBRK = 0x2000747a + TIOCCONS = 0x20007424 + TIOCEXCL = 0x2000740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x40047400 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x40047483 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40047486 + TIOCGRS485 = 0x40205441 + TIOCGSERIAL = 0x541e + TIOCGSID = 0x40047485 + TIOCGSOFTCAR = 0x40047464 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMIWAIT = 0x545c + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 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 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007484 + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x80047401 + TIOCSIG = 0x80047488 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x80047482 + TIOCSPTLCK = 0x80047487 + TIOCSRS485 = 0xc0205442 + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x80047465 + TIOCSTART = 0x2000746e + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x20005437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WRAP = 0x20000 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 + __TIOCFLUSH = 0x80047410 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EADV = syscall.Errno(0x53) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x25) + EBADE = syscall.Errno(0x66) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x5d) + EBADMSG = syscall.Errno(0x4c) + EBADR = syscall.Errno(0x67) + EBADRQC = syscall.Errno(0x6a) + EBADSLT = syscall.Errno(0x6b) + EBFONT = syscall.Errno(0x6d) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x5e) + ECOMM = syscall.Errno(0x55) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0x4e) + EDEADLOCK = syscall.Errno(0x6c) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EHWPOISON = syscall.Errno(0x87) + EIDRM = syscall.Errno(0x4d) + EILSEQ = syscall.Errno(0x7a) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x81) + EKEYREJECTED = syscall.Errno(0x83) + EKEYREVOKED = syscall.Errno(0x82) + EL2HLT = syscall.Errno(0x65) + EL2NSYNC = syscall.Errno(0x5f) + EL3HLT = syscall.Errno(0x60) + EL3RST = syscall.Errno(0x61) + ELIBACC = syscall.Errno(0x72) + ELIBBAD = syscall.Errno(0x70) + ELIBEXEC = syscall.Errno(0x6e) + ELIBMAX = syscall.Errno(0x7b) + ELIBSCN = syscall.Errno(0x7c) + ELNRNG = syscall.Errno(0x62) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x7e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x57) + ENAMETOOLONG = syscall.Errno(0x3f) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x69) + ENOBUFS = syscall.Errno(0x37) + ENOCSI = syscall.Errno(0x64) + ENODATA = syscall.Errno(0x6f) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x80) + ENOLCK = syscall.Errno(0x4f) + ENOLINK = syscall.Errno(0x52) + ENOMEDIUM = syscall.Errno(0x7d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x4b) + ENONET = syscall.Errno(0x50) + ENOPKG = syscall.Errno(0x71) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x4a) + ENOSTR = syscall.Errno(0x48) + ENOSYS = syscall.Errno(0x5a) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x85) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x73) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x5c) + EOWNERDEAD = syscall.Errno(0x84) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROTO = syscall.Errno(0x56) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x59) + EREMOTE = syscall.Errno(0x47) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x74) + ERFKILL = syscall.Errno(0x86) + EROFS = syscall.Errno(0x1e) + ERREMOTE = syscall.Errno(0x51) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x54) + ESTALE = syscall.Errno(0x46) + ESTRPIPE = syscall.Errno(0x5b) + ETIME = syscall.Errno(0x49) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x63) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x68) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x1d) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x17) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1d) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol", + 48: "address already in use", + 49: "cannot assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "transport endpoint is already connected", + 57: "transport endpoint is not connected", + 58: "cannot send after transport endpoint shutdown", + 59: "too many references: cannot splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disk quota exceeded", + 70: "stale file handle", + 71: "object is remote", + 72: "device not a stream", + 73: "timer expired", + 74: "out of streams resources", + 75: "no message of desired type", + 76: "bad message", + 77: "identifier removed", + 78: "resource deadlock avoided", + 79: "no locks available", + 80: "machine is not on the network", + 81: "unknown error 81", + 82: "link has been severed", + 83: "advertise error", + 84: "srmount error", + 85: "communication error on send", + 86: "protocol error", + 87: "multihop attempted", + 88: "RFS specific error", + 89: "remote address changed", + 90: "function not implemented", + 91: "streams pipe error", + 92: "value too large for defined data type", + 93: "file descriptor in bad state", + 94: "channel number out of range", + 95: "level 2 not synchronized", + 96: "level 3 halted", + 97: "level 3 reset", + 98: "link number out of range", + 99: "protocol driver not attached", + 100: "no CSI structure available", + 101: "level 2 halted", + 102: "invalid exchange", + 103: "invalid request descriptor", + 104: "exchange full", + 105: "no anode", + 106: "invalid request code", + 107: "invalid slot", + 108: "file locking deadlock error", + 109: "bad font file format", + 110: "cannot exec a shared library directly", + 111: "no data available", + 112: "accessing a corrupted shared library", + 113: "package not installed", + 114: "can not access a needed shared library", + 115: "name not unique on network", + 116: "interrupted system call should be restarted", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "invalid or incomplete multibyte or wide character", + 123: "attempting to link in too many shared libraries", + 124: ".lib section in a.out corrupted", + 125: "no medium found", + 126: "wrong medium type", + 127: "operation canceled", + 128: "required key not available", + 129: "key has expired", + 130: "key has been revoked", + 131: "key was rejected by service", + 132: "owner died", + 133: "state not recoverable", + 134: "operation not possible due to RF-kill", + 135: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "resource lost", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go new file mode 100755 index 0000000..cd93ce0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -0,0 +1,1728 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + 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 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + EN_SW_CTL_INF = 0x1000 + EN_SW_CTL_PREC = 0x300 + EN_SW_CTL_ROUND = 0xc00 + EN_SW_DATACHAIN = 0x80 + EN_SW_DENORM = 0x2 + EN_SW_INVOP = 0x1 + EN_SW_OVERFLOW = 0x8 + EN_SW_PRECLOSS = 0x20 + EN_SW_UNDERFLOW = 0x10 + EN_SW_ZERODIV = 0x4 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + 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_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_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_SLOWPROTOCOLS = 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_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + 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 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_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 = 0xf1 + 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_STF = 0xd7 + 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 + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + 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_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + 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 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + 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_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + 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_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + 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_IFWHT = 0xe000 + 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 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + 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 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + 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(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + 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(0x60) + 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) + ETIME = syscall.Errno(0x5c) + 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) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + 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 or too small"}, + {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 option 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", "connection 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "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, "SIGIOT", "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", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {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, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go new file mode 100755 index 0000000..071701c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -0,0 +1,1718 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + 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 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + 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_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_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_SLOWPROTOCOLS = 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_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + 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 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_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 = 0xf1 + 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_STF = 0xd7 + 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 + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + 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_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + 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 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + 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_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + 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_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + 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_IFWHT = 0xe000 + 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 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + 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 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + 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(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + 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(0x60) + 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) + ETIME = syscall.Errno(0x5c) + 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) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + 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 or too small"}, + {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 option 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", "connection 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "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, "SIGIOT", "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", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {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, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go new file mode 100755 index 0000000..5fe56ae --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -0,0 +1,1707 @@ +// mkerrors.sh -marm +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -marm _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CRTSCTS = 0x10000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + 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_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_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_SLOWPROTOCOLS = 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_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + 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 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_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 = 0xf1 + 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_STF = 0xd7 + 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 + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + 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_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + 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 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + 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_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + 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_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PRI_IOFLUSH = 0x7c + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + 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_IFWHT = 0xe000 + 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 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + 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 + TIOCPTMGET = 0x48087446 + TIOCPTSNAME = 0x48087448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + 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(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + 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(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + 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(0x60) + 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) + ETIME = syscall.Errno(0x5c) + 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) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + 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 or too small"}, + {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 option 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", "connection 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", "disc 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 prog. not avail"}, + {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, "EIDRM", "identifier removed"}, + {83, "ENOMSG", "no message of desired type"}, + {84, "EOVERFLOW", "value too large to be stored in data type"}, + {85, "EILSEQ", "illegal byte sequence"}, + {86, "ENOTSUP", "not supported"}, + {87, "ECANCELED", "operation Canceled"}, + {88, "EBADMSG", "bad or Corrupt message"}, + {89, "ENODATA", "no message available"}, + {90, "ENOSR", "no STREAM resources"}, + {91, "ENOSTR", "not a STREAM"}, + {92, "ETIME", "STREAM ioctl timeout"}, + {93, "ENOATTR", "attribute not found"}, + {94, "EMULTIHOP", "multihop attempted"}, + {95, "ENOLINK", "link has been severed"}, + {96, "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, "SIGIOT", "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", "stopped (signal)"}, + {18, "SIGTSTP", "stopped"}, + {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, "SIGPWR", "power fail/restart"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go new file mode 100755 index 0000000..0a1c3e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -0,0 +1,1600 @@ +// mkerrors.sh -m32 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _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 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + 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_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_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 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + 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_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_MASK = 0x3ff000 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var 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, "EWOULDBLOCK", "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, "ELAST", "not supported"}, +} + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go new file mode 100755 index 0000000..0d50f6b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -0,0 +1,1599 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,openbsd + +// Created by 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 + 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_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + 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_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_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 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + 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_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8058693c + SIOCBRDGADDS = 0x80586941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8058693d + SIOCBRDGDELS = 0x80586942 + SIOCBRDGFLUSH = 0x80586948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc058693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGSIFS = 0xc058693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0586942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80586955 + SIOCBRDGSIFFLGS = 0x8058693f + SIOCBRDGSIFPRIO = 0x80586954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 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 + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var 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, "EWOULDBLOCK", "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, "ELAST", "not supported"}, +} + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go new file mode 100755 index 0000000..93e37c4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -0,0 +1,1602 @@ +// mkerrors.sh +// Code generated by the command above; see README.md. DO NOT EDIT. + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,openbsd + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + 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_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + 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_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x3ff7 + MAP_HASSEMAPHORE = 0x0 + MAP_INHERIT = 0x0 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_INHERIT_ZERO = 0x3 + MAP_NOEXTEND = 0x0 + MAP_NORESERVE = 0x0 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x0 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x70f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFRXR = 0x802069aa + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_CLOEXEC = 0x8000 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x4000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var 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, "EWOULDBLOCK", "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, "ELAST", "not supported"}, +} + +// 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go new file mode 100755 index 0000000..be42830 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -0,0 +1,1497 @@ +// mkerrors.sh -m64 +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_802 = 0x12 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_FILE = 0x1 + AF_GOSIP = 0x16 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1a + AF_INET_OFFLOAD = 0x1e + AF_IPX = 0x17 + AF_KEY = 0x1b + AF_LAT = 0xe + AF_LINK = 0x19 + AF_LOCAL = 0x1 + AF_MAX = 0x20 + AF_NBS = 0x7 + AF_NCA = 0x1c + AF_NIT = 0x11 + AF_NS = 0x6 + AF_OSI = 0x13 + AF_OSINET = 0x15 + AF_PACKET = 0x20 + AF_POLICY = 0x1d + AF_PUP = 0x4 + AF_ROUTE = 0x18 + AF_SNA = 0xb + AF_TRILL = 0x1f + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_X25 = 0x14 + ARPHRD_ARCNET = 0x7 + ARPHRD_ATM = 0x10 + ARPHRD_AX25 = 0x3 + ARPHRD_CHAOS = 0x5 + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_FC = 0x12 + ARPHRD_FRAME = 0xf + ARPHRD_HDLC = 0x11 + ARPHRD_IB = 0x20 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IPATM = 0x13 + ARPHRD_METRICOM = 0x17 + ARPHRD_TUNNEL = 0x1f + B0 = 0x0 + B110 = 0x3 + B115200 = 0x12 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B153600 = 0x13 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B230400 = 0x14 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x15 + B38400 = 0xf + B460800 = 0x16 + B4800 = 0xc + B50 = 0x1 + B57600 = 0x10 + B600 = 0x8 + B75 = 0x2 + B76800 = 0x11 + B921600 = 0x17 + B9600 = 0xd + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = -0x3fefbd89 + BIOCGDLTLIST32 = -0x3ff7bd89 + BIOCGETIF = 0x4020426b + BIOCGETLIF = 0x4078426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGRTIMEOUT32 = 0x4008427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = -0x7ffbbd90 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = -0x3ffbbd9a + BIOCSDLT = -0x7ffbbd8a + BIOCSETF = -0x7fefbd99 + BIOCSETF32 = -0x7ff7bd99 + BIOCSETIF = -0x7fdfbd94 + BIOCSETLIF = -0x7f87bd94 + BIOCSHDRCMPLT = -0x7ffbbd8b + BIOCSRTIMEOUT = -0x7fefbd86 + BIOCSRTIMEOUT32 = -0x7ff7bd86 + BIOCSSEESENT = -0x7ffbbd87 + BIOCSTCPF = -0x7fefbd8e + BIOCSUDPF = -0x7fefbd8d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + 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 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0xf + CFLUSH = 0xf + CIBAUD = 0xf0000 + CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + CSWTCH = 0x1a + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_BACNET_MS_TP = 0xa5 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FRELAY = 0x6b + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xa2 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_PPPD = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMPTY_SET = 0x0 + EMT_CPCOVF = 0x1 + EQUALITY_CHECK = 0x0 + EXTA = 0xe + EXTB = 0xf + FD_CLOEXEC = 0x1 + FD_NFDBITS = 0x40 + FD_SETSIZE = 0x10000 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHALL = 0x1 + FLUSHDATA = 0x0 + FLUSHO = 0x2000 + F_ALLOCSP = 0xa + F_ALLOCSP64 = 0xa + F_BADFD = 0x2e + F_BLKSIZE = 0x13 + F_BLOCKS = 0x12 + F_CHKFL = 0x8 + F_COMPAT = 0x8 + F_DUP2FD = 0x9 + F_DUP2FD_CLOEXEC = 0x24 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x25 + F_FLOCK = 0x35 + F_FLOCK64 = 0x35 + F_FLOCKW = 0x36 + F_FLOCKW64 = 0x36 + F_FREESP = 0xb + F_FREESP64 = 0xb + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETXFL = 0x2d + F_HASREMOTELOCKS = 0x1a + F_ISSTREAM = 0xd + F_MANDDNY = 0x10 + F_MDACC = 0x20 + F_NODNY = 0x0 + F_NPRIV = 0x10 + F_OFD_GETLK = 0x2f + F_OFD_GETLK64 = 0x2f + F_OFD_SETLK = 0x30 + F_OFD_SETLK64 = 0x30 + F_OFD_SETLKW = 0x31 + F_OFD_SETLKW64 = 0x31 + F_PRIV = 0xf + F_QUOTACTL = 0x11 + F_RDACC = 0x1 + F_RDDNY = 0x1 + F_RDLCK = 0x1 + F_REVOKE = 0x19 + F_RMACC = 0x4 + F_RMDNY = 0x4 + F_RWACC = 0x3 + F_RWDNY = 0x3 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLK64_NBMAND = 0x2a + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETLK_NBMAND = 0x2a + F_SETOWN = 0x18 + F_SHARE = 0x28 + F_SHARE_NBMAND = 0x2b + F_UNLCK = 0x3 + F_UNLKSYS = 0x4 + F_UNSHARE = 0x29 + F_WRACC = 0x2 + F_WRDNY = 0x2 + F_WRLCK = 0x2 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFF_ADDRCONF = 0x80000 + IFF_ALLMULTI = 0x200 + IFF_ANYCAST = 0x400000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x7f203003b5a + IFF_COS_ENABLED = 0x200000000 + IFF_DEBUG = 0x4 + IFF_DEPRECATED = 0x40000 + IFF_DHCPRUNNING = 0x4000 + IFF_DUPLICATE = 0x4000000000 + IFF_FAILED = 0x10000000 + IFF_FIXEDMTU = 0x1000000000 + IFF_INACTIVE = 0x40000000 + IFF_INTELLIGENT = 0x400 + IFF_IPMP = 0x8000000000 + IFF_IPMP_CANTCHANGE = 0x10000000 + IFF_IPMP_INVALID = 0x1ec200080 + IFF_IPV4 = 0x1000000 + IFF_IPV6 = 0x2000000 + IFF_L3PROTECT = 0x40000000000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x800 + IFF_MULTI_BCAST = 0x1000 + IFF_NOACCEPT = 0x4000000 + IFF_NOARP = 0x80 + IFF_NOFAILOVER = 0x8000000 + IFF_NOLINKLOCAL = 0x20000000000 + IFF_NOLOCAL = 0x20000 + IFF_NONUD = 0x200000 + IFF_NORTEXCH = 0x800000 + IFF_NOTRAILERS = 0x20 + IFF_NOXMIT = 0x10000 + IFF_OFFLINE = 0x80000000 + IFF_POINTOPOINT = 0x10 + IFF_PREFERRED = 0x400000000 + IFF_PRIVATE = 0x8000 + IFF_PROMISC = 0x100 + IFF_ROUTER = 0x100000 + IFF_RUNNING = 0x40 + IFF_STANDBY = 0x20000000 + IFF_TEMPORARY = 0x800000000 + IFF_UNNUMBERED = 0x2000 + IFF_UP = 0x1 + IFF_VIRTUAL = 0x2000000000 + IFF_VRRP = 0x10000000000 + IFF_XRESOLV = 0x100000000 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6TO4 = 0xca + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_IPV4 = 0xc8 + IFT_IPV6 = 0xc9 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_AUTOCONF_MASK = 0xffff0000 + IN_AUTOCONF_NET = 0xa9fe0000 + 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_CLASSE_NET = 0xffffffff + IN_LOOPBACKNET = 0x7f + IN_PRIVATE12_MASK = 0xfff00000 + IN_PRIVATE12_NET = 0xac100000 + IN_PRIVATE16_MASK = 0xffff0000 + IN_PRIVATE16_NET = 0xc0a80000 + IN_PRIVATE8_MASK = 0xff000000 + IN_PRIVATE8_NET = 0xa000000 + IPPROTO_AH = 0x33 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x4 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_HELLO = 0x3f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_ND = 0x4d + IPPROTO_NONE = 0x3b + IPPROTO_OSPF = 0x59 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_UDP = 0x11 + IPV6_ADD_MEMBERSHIP = 0x9 + IPV6_BOUND_IF = 0x41 + IPV6_CHECKSUM = 0x18 + IPV6_DONTFRAG = 0x21 + IPV6_DROP_MEMBERSHIP = 0xa + IPV6_DSTOPTS = 0xf + IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 + IPV6_FLOWINFO_TCLASS = 0xf00f + IPV6_HOPLIMIT = 0xc + IPV6_HOPOPTS = 0xe + IPV6_JOIN_GROUP = 0x9 + IPV6_LEAVE_GROUP = 0xa + IPV6_MULTICAST_HOPS = 0x7 + IPV6_MULTICAST_IF = 0x6 + IPV6_MULTICAST_LOOP = 0x8 + IPV6_NEXTHOP = 0xd + IPV6_PAD1_OPT = 0x0 + IPV6_PATHMTU = 0x25 + IPV6_PKTINFO = 0xb + IPV6_PREFER_SRC_CGA = 0x20 + IPV6_PREFER_SRC_CGADEFAULT = 0x10 + IPV6_PREFER_SRC_CGAMASK = 0x30 + IPV6_PREFER_SRC_COA = 0x2 + IPV6_PREFER_SRC_DEFAULT = 0x15 + IPV6_PREFER_SRC_HOME = 0x1 + IPV6_PREFER_SRC_MASK = 0x3f + IPV6_PREFER_SRC_MIPDEFAULT = 0x1 + IPV6_PREFER_SRC_MIPMASK = 0x3 + IPV6_PREFER_SRC_NONCGA = 0x10 + IPV6_PREFER_SRC_PUBLIC = 0x4 + IPV6_PREFER_SRC_TMP = 0x8 + IPV6_PREFER_SRC_TMPDEFAULT = 0x4 + IPV6_PREFER_SRC_TMPMASK = 0xc + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x13 + IPV6_RECVHOPOPTS = 0x14 + IPV6_RECVPATHMTU = 0x24 + IPV6_RECVPKTINFO = 0x12 + IPV6_RECVRTHDR = 0x16 + IPV6_RECVRTHDRDSTOPTS = 0x17 + IPV6_RECVTCLASS = 0x19 + IPV6_RTHDR = 0x10 + IPV6_RTHDRDSTOPTS = 0x11 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SEC_OPT = 0x22 + IPV6_SRC_PREFERENCES = 0x23 + IPV6_TCLASS = 0x26 + IPV6_UNICAST_HOPS = 0x5 + IPV6_UNSPEC_SRC = 0x42 + IPV6_USE_MIN_MTU = 0x20 + IPV6_V6ONLY = 0x27 + IP_ADD_MEMBERSHIP = 0x13 + IP_ADD_SOURCE_MEMBERSHIP = 0x17 + IP_BLOCK_SOURCE = 0x15 + IP_BOUND_IF = 0x41 + IP_BROADCAST = 0x106 + IP_BROADCAST_TTL = 0x43 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPINIT_IF = 0x45 + IP_DONTFRAG = 0x1b + IP_DONTROUTE = 0x105 + IP_DROP_MEMBERSHIP = 0x14 + IP_DROP_SOURCE_MEMBERSHIP = 0x18 + IP_HDRINCL = 0x2 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x10 + IP_MULTICAST_LOOP = 0x12 + IP_MULTICAST_TTL = 0x11 + IP_NEXTHOP = 0x19 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x9 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVSLLA = 0xa + IP_RECVTTL = 0xb + IP_RETOPTS = 0x8 + IP_REUSEADDR = 0x104 + IP_SEC_OPT = 0x22 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x16 + IP_UNSPEC_SRC = 0x42 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_ACCESS_DEFAULT = 0x6 + MADV_ACCESS_LWP = 0x7 + MADV_ACCESS_MANY = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NORMAL = 0x0 + MADV_PURGE = 0x9 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80 + MAP_ALIGN = 0x200 + MAP_ANON = 0x100 + MAP_ANONYMOUS = 0x100 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_INITDATA = 0x800 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TEXT = 0x400 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x10 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_DUPCTRL = 0x800 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 0x10 + MSG_NOTIFICATION = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x20 + MSG_WAITALL = 0x40 + MSG_XPG4_2 = 0x8000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_OLDSYNC = 0x0 + MS_SYNC = 0x4 + M_FLUSH = 0x86 + NAME_MAX = 0xff + NEWDEV = 0x1 + NL0 = 0x0 + NL1 = 0x100 + NLDLY = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + OLDDEV = 0x0 + ONBITSMAJOR = 0x7 + ONBITSMINOR = 0x8 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENFAIL = -0x1 + OPOST = 0x1 + O_ACCMODE = 0x600003 + O_APPEND = 0x8 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DSYNC = 0x40 + O_EXCL = 0x400 + O_EXEC = 0x400000 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x4 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NOLINKS = 0x40000 + O_NONBLOCK = 0x80 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x8000 + O_SEARCH = 0x200000 + O_SIOCGIFCONF = -0x3ff796ec + O_SIOCGLIFCONF = -0x3fef9688 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + O_XATTR = 0x4000 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x3 + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_NUMBITS = 0x9 + RTA_SRC = 0x100 + RTF_BLACKHOLE = 0x1000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INDIRECT = 0x40000 + RTF_KERNEL = 0x80000 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTIRT = 0x10000 + RTF_PRIVATE = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SETSRC = 0x20000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTF_ZONE = 0x100000 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0xf + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_FREEADDR = 0x10 + RTM_GET = 0x4 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_VERSION = 0x3 + 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_AWARE = 0x1 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_RIGHTS = 0x1010 + SCM_TIMESTAMP = 0x1013 + SCM_UCRED = 0x1012 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIG2STR_MAX = 0x20 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDRT = -0x7fcf8df6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fdb96e0 + SIOCDELMULTI = -0x7fdf96ce + SIOCDELRT = -0x7fcf8df5 + SIOCDXARP = -0x7fff9658 + SIOCGARP = -0x3fdb96e1 + SIOCGDSTINFO = -0x3fff965c + SIOCGENADDR = -0x3fdf96ab + SIOCGENPSTATS = -0x3fdf96c7 + SIOCGETLSGCNT = -0x3fef8deb + SIOCGETNAME = 0x40107334 + SIOCGETPEER = 0x40107335 + SIOCGETPROP = -0x3fff8f44 + SIOCGETSGCNT = -0x3feb8deb + SIOCGETSYNC = -0x3fdf96d3 + SIOCGETVIFCNT = -0x3feb8dec + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fdf96f3 + SIOCGIFBRDADDR = -0x3fdf96e9 + SIOCGIFCONF = -0x3ff796a4 + SIOCGIFDSTADDR = -0x3fdf96f1 + SIOCGIFFLAGS = -0x3fdf96ef + SIOCGIFHWADDR = -0x3fdf9647 + SIOCGIFINDEX = -0x3fdf96a6 + SIOCGIFMEM = -0x3fdf96ed + SIOCGIFMETRIC = -0x3fdf96e5 + SIOCGIFMTU = -0x3fdf96ea + SIOCGIFMUXID = -0x3fdf96a8 + SIOCGIFNETMASK = -0x3fdf96e7 + SIOCGIFNUM = 0x40046957 + SIOCGIP6ADDRPOLICY = -0x3fff965e + SIOCGIPMSFILTER = -0x3ffb964c + SIOCGLIFADDR = -0x3f87968f + SIOCGLIFBINDING = -0x3f879666 + SIOCGLIFBRDADDR = -0x3f879685 + SIOCGLIFCONF = -0x3fef965b + SIOCGLIFDADSTATE = -0x3f879642 + SIOCGLIFDSTADDR = -0x3f87968d + SIOCGLIFFLAGS = -0x3f87968b + SIOCGLIFGROUPINFO = -0x3f4b9663 + SIOCGLIFGROUPNAME = -0x3f879664 + SIOCGLIFHWADDR = -0x3f879640 + SIOCGLIFINDEX = -0x3f87967b + SIOCGLIFLNKINFO = -0x3f879674 + SIOCGLIFMETRIC = -0x3f879681 + SIOCGLIFMTU = -0x3f879686 + SIOCGLIFMUXID = -0x3f87967d + SIOCGLIFNETMASK = -0x3f879683 + SIOCGLIFNUM = -0x3ff3967e + SIOCGLIFSRCOF = -0x3fef964f + SIOCGLIFSUBNET = -0x3f879676 + SIOCGLIFTOKEN = -0x3f879678 + SIOCGLIFUSESRC = -0x3f879651 + SIOCGLIFZONE = -0x3f879656 + SIOCGLOWAT = 0x40047303 + SIOCGMSFILTER = -0x3ffb964e + SIOCGPGRP = 0x40047309 + SIOCGSTAMP = -0x3fef9646 + SIOCGXARP = -0x3fff9659 + SIOCIFDETACH = -0x7fdf96c8 + SIOCILB = -0x3ffb9645 + SIOCLIFADDIF = -0x3f879691 + SIOCLIFDELND = -0x7f879673 + SIOCLIFGETND = -0x3f879672 + SIOCLIFREMOVEIF = -0x7f879692 + SIOCLIFSETND = -0x7f879671 + SIOCLOWER = -0x7fdf96d7 + SIOCSARP = -0x7fdb96e2 + SIOCSCTPGOPT = -0x3fef9653 + SIOCSCTPPEELOFF = -0x3ffb9652 + SIOCSCTPSOPT = -0x7fef9654 + SIOCSENABLESDP = -0x3ffb9649 + SIOCSETPROP = -0x7ffb8f43 + SIOCSETSYNC = -0x7fdf96d4 + SIOCSHIWAT = -0x7ffb8d00 + SIOCSIFADDR = -0x7fdf96f4 + SIOCSIFBRDADDR = -0x7fdf96e8 + SIOCSIFDSTADDR = -0x7fdf96f2 + SIOCSIFFLAGS = -0x7fdf96f0 + SIOCSIFINDEX = -0x7fdf96a5 + SIOCSIFMEM = -0x7fdf96ee + SIOCSIFMETRIC = -0x7fdf96e4 + SIOCSIFMTU = -0x7fdf96eb + SIOCSIFMUXID = -0x7fdf96a7 + SIOCSIFNAME = -0x7fdf96b7 + SIOCSIFNETMASK = -0x7fdf96e6 + SIOCSIP6ADDRPOLICY = -0x7fff965d + SIOCSIPMSFILTER = -0x7ffb964b + SIOCSLGETREQ = -0x3fdf96b9 + SIOCSLIFADDR = -0x7f879690 + SIOCSLIFBRDADDR = -0x7f879684 + SIOCSLIFDSTADDR = -0x7f87968e + SIOCSLIFFLAGS = -0x7f87968c + SIOCSLIFGROUPNAME = -0x7f879665 + SIOCSLIFINDEX = -0x7f87967a + SIOCSLIFLNKINFO = -0x7f879675 + SIOCSLIFMETRIC = -0x7f879680 + SIOCSLIFMTU = -0x7f879687 + SIOCSLIFMUXID = -0x7f87967c + SIOCSLIFNAME = -0x3f87967f + SIOCSLIFNETMASK = -0x7f879682 + SIOCSLIFPREFIX = -0x3f879641 + SIOCSLIFSUBNET = -0x7f879677 + SIOCSLIFTOKEN = -0x7f879679 + SIOCSLIFUSESRC = -0x7f879650 + SIOCSLIFZONE = -0x7f879655 + SIOCSLOWAT = -0x7ffb8cfe + SIOCSLSTAT = -0x7fdf96b8 + SIOCSMSFILTER = -0x7ffb964d + SIOCSPGRP = -0x7ffb8cf8 + SIOCSPROMISC = -0x7ffb96d0 + SIOCSQPTR = -0x3ffb9648 + SIOCSSDSTATS = -0x3fdf96d2 + SIOCSSESTATS = -0x3fdf96d1 + SIOCSXARP = -0x7fff965a + SIOCTMYADDR = -0x3ff79670 + SIOCTMYSITE = -0x3ff7966e + SIOCTONLINK = -0x3ff7966f + SIOCUPPER = -0x7fdf96d8 + SIOCX25RCV = -0x3fdf96c4 + SIOCX25TBL = -0x3fdf96c3 + SIOCX25XMT = -0x3fdf96c5 + SIOCXPROTO = 0x20007337 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x1 + SOCK_NDELAY = 0x200000 + SOCK_NONBLOCK = 0x100000 + SOCK_RAW = 0x4 + SOCK_RDM = 0x5 + SOCK_SEQPACKET = 0x6 + SOCK_STREAM = 0x2 + SOCK_TYPE_MASK = 0xffff + SOL_FILTER = 0xfffc + SOL_PACKET = 0xfffd + SOL_ROUTE = 0xfffe + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ALL = 0x3f + SO_ALLZONES = 0x1014 + SO_ANON_MLP = 0x100a + SO_ATTACH_FILTER = 0x40000001 + SO_BAND = 0x4000 + SO_BROADCAST = 0x20 + SO_COPYOPT = 0x80000 + SO_DEBUG = 0x1 + SO_DELIM = 0x8000 + SO_DETACH_FILTER = 0x40000002 + SO_DGRAM_ERRIND = 0x200 + SO_DOMAIN = 0x100c + SO_DONTLINGER = -0x81 + SO_DONTROUTE = 0x10 + SO_ERROPT = 0x40000 + SO_ERROR = 0x1007 + SO_EXCLBIND = 0x1015 + SO_HIWAT = 0x10 + SO_ISNTTY = 0x800 + SO_ISTTY = 0x400 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOWAT = 0x20 + SO_MAC_EXEMPT = 0x100b + SO_MAC_IMPLICIT = 0x1016 + SO_MAXBLK = 0x100000 + SO_MAXPSZ = 0x8 + SO_MINPSZ = 0x4 + SO_MREADOFF = 0x80 + SO_MREADON = 0x40 + SO_NDELOFF = 0x200 + SO_NDELON = 0x100 + SO_NODELIM = 0x10000 + SO_OOBINLINE = 0x100 + SO_PROTOTYPE = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVPSH = 0x100d + SO_RCVTIMEO = 0x1006 + SO_READOPT = 0x1 + SO_RECVUCRED = 0x400 + SO_REUSEADDR = 0x4 + SO_SECATTR = 0x1011 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STRHOLD = 0x20000 + SO_TAIL = 0x200000 + SO_TIMESTAMP = 0x1013 + SO_TONSTOP = 0x2000 + SO_TOSTOP = 0x1000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_VRRP = 0x1017 + SO_WROFF = 0x2 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_ABORT_THRESHOLD = 0x11 + TCP_ANONPRIVBIND = 0x20 + TCP_CONN_ABORT_THRESHOLD = 0x13 + TCP_CONN_NOTIFY_THRESHOLD = 0x12 + TCP_CORK = 0x18 + TCP_EXCLBIND = 0x21 + TCP_INIT_CWND = 0x15 + TCP_KEEPALIVE = 0x8 + TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 + TCP_KEEPALIVE_THRESHOLD = 0x16 + TCP_KEEPCNT = 0x23 + TCP_KEEPIDLE = 0x22 + TCP_KEEPINTVL = 0x24 + TCP_LINGER2 = 0x1c + TCP_MAXSEG = 0x2 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOTIFY_THRESHOLD = 0x10 + TCP_RECVDSTADDR = 0x14 + TCP_RTO_INITIAL = 0x19 + TCP_RTO_MAX = 0x1b + TCP_RTO_MIN = 0x1a + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 + TIOC = 0x5400 + TIOCCBRK = 0x747a + TIOCCDTR = 0x7478 + TIOCCILOOP = 0x746c + TIOCEXCL = 0x740d + TIOCFLUSH = 0x7410 + TIOCGETC = 0x7412 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x7414 + TIOCGPPS = 0x547d + TIOCGPPSEV = 0x547f + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5469 + TIOCGWINSZ = 0x5468 + TIOCHPCL = 0x7402 + TIOCKBOF = 0x5409 + TIOCKBON = 0x5408 + TIOCLBIC = 0x747e + TIOCLBIS = 0x747f + TIOCLGET = 0x747c + TIOCLSET = 0x747d + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMSET = 0x741a + 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 = 0x7471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7473 + TIOCREMOTE = 0x741e + TIOCSBRK = 0x747b + TIOCSCTTY = 0x7484 + TIOCSDTR = 0x7479 + TIOCSETC = 0x7411 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIGNAL = 0x741f + TIOCSILOOP = 0x746d + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x7415 + TIOCSPPS = 0x547e + TIOCSSOFTCAR = 0x546a + TIOCSTART = 0x746e + TIOCSTI = 0x7417 + TIOCSTOP = 0x746f + TIOCSWINSZ = 0x5467 + TOSTOP = 0x100 + VCEOF = 0x8 + VCEOL = 0x9 + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VERASE2 = 0x11 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTATUS = 0x10 + VSTOP = 0x9 + VSUSP = 0xa + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WCONTFLG = 0xffff + WCONTINUED = 0x8 + WCOREFLG = 0x80 + WEXITED = 0x1 + WNOHANG = 0x40 + WNOWAIT = 0x80 + WOPTMASK = 0xcf + WRAP = 0x20000 + WSIGMASK = 0x7f + WSTOPFLG = 0x7f + WSTOPPED = 0x4 + WTRAPPED = 0x2 + WUNTRACED = 0x4 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x39) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x2f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x31) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOCKUNMAPPED = syscall.Errno(0x48) + ELOOP = syscall.Errno(0x5a) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTACTIVE = syscall.Errno(0x49) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTRECOVERABLE = syscall.Errno(0x3b) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x30) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0x3a) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMOTE = syscall.Errno(0x42) + ERESTART = syscall.Errno(0x5b) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCANCEL = syscall.Signal(0x24) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGFREEZE = syscall.Signal(0x22) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGJVM1 = syscall.Signal(0x27) + SIGJVM2 = syscall.Signal(0x28) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x25) + SIGLWP = syscall.Signal(0x21) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHAW = syscall.Signal(0x23) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWAITING = syscall.Signal(0x20) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) + SIGXRES = syscall.Signal(0x26) +) + +// Error table +var errorList = [...]struct { + num syscall.Errno + name string + desc string +}{ + {1, "EPERM", "not owner"}, + {2, "ENOENT", "no such file or directory"}, + {3, "ESRCH", "no such process"}, + {4, "EINTR", "interrupted system call"}, + {5, "EIO", "I/O error"}, + {6, "ENXIO", "no such device or address"}, + {7, "E2BIG", "arg list too long"}, + {8, "ENOEXEC", "exec format error"}, + {9, "EBADF", "bad file number"}, + {10, "ECHILD", "no child processes"}, + {11, "EAGAIN", "resource temporarily unavailable"}, + {12, "ENOMEM", "not enough space"}, + {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", "no such device"}, + {20, "ENOTDIR", "not a directory"}, + {21, "EISDIR", "is a directory"}, + {22, "EINVAL", "invalid argument"}, + {23, "ENFILE", "file table overflow"}, + {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", "argument out of domain"}, + {34, "ERANGE", "result too large"}, + {35, "ENOMSG", "no message of desired type"}, + {36, "EIDRM", "identifier removed"}, + {37, "ECHRNG", "channel number out of range"}, + {38, "EL2NSYNC", "level 2 not synchronized"}, + {39, "EL3HLT", "level 3 halted"}, + {40, "EL3RST", "level 3 reset"}, + {41, "ELNRNG", "link number out of range"}, + {42, "EUNATCH", "protocol driver not attached"}, + {43, "ENOCSI", "no CSI structure available"}, + {44, "EL2HLT", "level 2 halted"}, + {45, "EDEADLK", "deadlock situation detected/avoided"}, + {46, "ENOLCK", "no record locks available"}, + {47, "ECANCELED", "operation canceled"}, + {48, "ENOTSUP", "operation not supported"}, + {49, "EDQUOT", "disc quota exceeded"}, + {50, "EBADE", "bad exchange descriptor"}, + {51, "EBADR", "bad request descriptor"}, + {52, "EXFULL", "message tables full"}, + {53, "ENOANO", "anode table overflow"}, + {54, "EBADRQC", "bad request code"}, + {55, "EBADSLT", "invalid slot"}, + {56, "EDEADLOCK", "file locking deadlock"}, + {57, "EBFONT", "bad font file format"}, + {58, "EOWNERDEAD", "owner of the lock died"}, + {59, "ENOTRECOVERABLE", "lock is not recoverable"}, + {60, "ENOSTR", "not a stream device"}, + {61, "ENODATA", "no data available"}, + {62, "ETIME", "timer expired"}, + {63, "ENOSR", "out of stream resources"}, + {64, "ENONET", "machine is not on the network"}, + {65, "ENOPKG", "package not installed"}, + {66, "EREMOTE", "object is remote"}, + {67, "ENOLINK", "link has been severed"}, + {68, "EADV", "advertise error"}, + {69, "ESRMNT", "srmount error"}, + {70, "ECOMM", "communication error on send"}, + {71, "EPROTO", "protocol error"}, + {72, "ELOCKUNMAPPED", "locked lock was unmapped "}, + {73, "ENOTACTIVE", "facility is not active"}, + {74, "EMULTIHOP", "multihop attempted"}, + {77, "EBADMSG", "not a data message"}, + {78, "ENAMETOOLONG", "file name too long"}, + {79, "EOVERFLOW", "value too large for defined data type"}, + {80, "ENOTUNIQ", "name not unique on network"}, + {81, "EBADFD", "file descriptor in bad state"}, + {82, "EREMCHG", "remote address changed"}, + {83, "ELIBACC", "can not access a needed shared library"}, + {84, "ELIBBAD", "accessing a corrupted shared library"}, + {85, "ELIBSCN", ".lib section in a.out corrupted"}, + {86, "ELIBMAX", "attempting to link in more shared libraries than system limit"}, + {87, "ELIBEXEC", "can not exec a shared library directly"}, + {88, "EILSEQ", "illegal byte sequence"}, + {89, "ENOSYS", "operation not applicable"}, + {90, "ELOOP", "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"}, + {91, "ERESTART", "error 91"}, + {92, "ESTRPIPE", "error 92"}, + {93, "ENOTEMPTY", "directory not empty"}, + {94, "EUSERS", "too many users"}, + {95, "ENOTSOCK", "socket operation on non-socket"}, + {96, "EDESTADDRREQ", "destination address required"}, + {97, "EMSGSIZE", "message too long"}, + {98, "EPROTOTYPE", "protocol wrong type for socket"}, + {99, "ENOPROTOOPT", "option not supported by protocol"}, + {120, "EPROTONOSUPPORT", "protocol not supported"}, + {121, "ESOCKTNOSUPPORT", "socket type not supported"}, + {122, "EOPNOTSUPP", "operation not supported on transport endpoint"}, + {123, "EPFNOSUPPORT", "protocol family not supported"}, + {124, "EAFNOSUPPORT", "address family not supported by protocol family"}, + {125, "EADDRINUSE", "address already in use"}, + {126, "EADDRNOTAVAIL", "cannot assign requested address"}, + {127, "ENETDOWN", "network is down"}, + {128, "ENETUNREACH", "network is unreachable"}, + {129, "ENETRESET", "network dropped connection because of reset"}, + {130, "ECONNABORTED", "software caused connection abort"}, + {131, "ECONNRESET", "connection reset by peer"}, + {132, "ENOBUFS", "no buffer space available"}, + {133, "EISCONN", "transport endpoint is already connected"}, + {134, "ENOTCONN", "transport endpoint is not connected"}, + {143, "ESHUTDOWN", "cannot send after socket shutdown"}, + {144, "ETOOMANYREFS", "too many references: cannot splice"}, + {145, "ETIMEDOUT", "connection timed out"}, + {146, "ECONNREFUSED", "connection refused"}, + {147, "EHOSTDOWN", "host is down"}, + {148, "EHOSTUNREACH", "no route to host"}, + {149, "EALREADY", "operation already in progress"}, + {150, "EINPROGRESS", "operation now in progress"}, + {151, "ESTALE", "stale NFS file handle"}, +} + +// 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/Breakpoint Trap"}, + {6, "SIGABRT", "abort"}, + {7, "SIGEMT", "emulation Trap"}, + {8, "SIGFPE", "arithmetic 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, "SIGUSR1", "user Signal 1"}, + {17, "SIGUSR2", "user Signal 2"}, + {18, "SIGCHLD", "child Status Changed"}, + {19, "SIGPWR", "power-Fail/Restart"}, + {20, "SIGWINCH", "window Size Change"}, + {21, "SIGURG", "urgent Socket Condition"}, + {22, "SIGIO", "pollable Event"}, + {23, "SIGSTOP", "stopped (signal)"}, + {24, "SIGTSTP", "stopped (user)"}, + {25, "SIGCONT", "continued"}, + {26, "SIGTTIN", "stopped (tty input)"}, + {27, "SIGTTOU", "stopped (tty output)"}, + {28, "SIGVTALRM", "virtual Timer Expired"}, + {29, "SIGPROF", "profiling Timer Expired"}, + {30, "SIGXCPU", "cpu Limit Exceeded"}, + {31, "SIGXFSZ", "file Size Limit Exceeded"}, + {32, "SIGWAITING", "no runnable lwp"}, + {33, "SIGLWP", "inter-lwp signal"}, + {34, "SIGFREEZE", "checkpoint Freeze"}, + {35, "SIGTHAW", "checkpoint Thaw"}, + {36, "SIGCANCEL", "thread Cancellation"}, + {37, "SIGLOST", "resource Lost"}, + {38, "SIGXRES", "resource Control Exceeded"}, + {39, "SIGJVM1", "reserved for JVM 1"}, + {40, "SIGJVM2", "reserved for JVM 2"}, + {41, "SIGINFO", "information Request"}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptrace386_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptrace386_linux.go new file mode 100755 index 0000000..2d21c49 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptrace386_linux.go @@ -0,0 +1,80 @@ +// Code generated by linux/mkall.go generatePtracePair(386, amd64). DO NOT EDIT. + +// +build linux +// +build 386 amd64 + +package unix + +import "unsafe" + +// PtraceRegs386 is the registers used by 386 binaries. +type PtraceRegs386 struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +// PtraceGetRegs386 fetches the registers used by 386 binaries. +func PtraceGetRegs386(pid int, regsout *PtraceRegs386) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegs386 sets the registers used by 386 binaries. +func PtraceSetRegs386(pid int, regs *PtraceRegs386) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsAmd64 is the registers used by amd64 binaries. +type PtraceRegsAmd64 struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +// PtraceGetRegsAmd64 fetches the registers used by amd64 binaries. +func PtraceGetRegsAmd64(pid int, regsout *PtraceRegsAmd64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsAmd64 sets the registers used by amd64 binaries. +func PtraceSetRegsAmd64(pid int, regs *PtraceRegsAmd64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracearm_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracearm_linux.go new file mode 100755 index 0000000..faf23bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracearm_linux.go @@ -0,0 +1,41 @@ +// Code generated by linux/mkall.go generatePtracePair(arm, arm64). DO NOT EDIT. + +// +build linux +// +build arm arm64 + +package unix + +import "unsafe" + +// PtraceRegsArm is the registers used by arm binaries. +type PtraceRegsArm struct { + Uregs [18]uint32 +} + +// PtraceGetRegsArm fetches the registers used by arm binaries. +func PtraceGetRegsArm(pid int, regsout *PtraceRegsArm) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm sets the registers used by arm binaries. +func PtraceSetRegsArm(pid int, regs *PtraceRegsArm) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsArm64 is the registers used by arm64 binaries. +type PtraceRegsArm64 struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +// PtraceGetRegsArm64 fetches the registers used by arm64 binaries. +func PtraceGetRegsArm64(pid int, regsout *PtraceRegsArm64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsArm64 sets the registers used by arm64 binaries. +func PtraceSetRegsArm64(pid int, regs *PtraceRegsArm64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemips_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemips_linux.go new file mode 100755 index 0000000..c431131 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemips_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mips, mips64). DO NOT EDIT. + +// +build linux +// +build mips mips64 + +package unix + +import "unsafe" + +// PtraceRegsMips is the registers used by mips binaries. +type PtraceRegsMips struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips fetches the registers used by mips binaries. +func PtraceGetRegsMips(pid int, regsout *PtraceRegsMips) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips sets the registers used by mips binaries. +func PtraceSetRegsMips(pid int, regs *PtraceRegsMips) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64 is the registers used by mips64 binaries. +type PtraceRegsMips64 struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64 fetches the registers used by mips64 binaries. +func PtraceGetRegsMips64(pid int, regsout *PtraceRegsMips64) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64 sets the registers used by mips64 binaries. +func PtraceSetRegsMips64(pid int, regs *PtraceRegsMips64) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go new file mode 100755 index 0000000..dc3d6d3 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zptracemipsle_linux.go @@ -0,0 +1,50 @@ +// Code generated by linux/mkall.go generatePtracePair(mipsle, mips64le). DO NOT EDIT. + +// +build linux +// +build mipsle mips64le + +package unix + +import "unsafe" + +// PtraceRegsMipsle is the registers used by mipsle binaries. +type PtraceRegsMipsle struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMipsle fetches the registers used by mipsle binaries. +func PtraceGetRegsMipsle(pid int, regsout *PtraceRegsMipsle) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMipsle sets the registers used by mipsle binaries. +func PtraceSetRegsMipsle(pid int, regs *PtraceRegsMipsle) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +// PtraceRegsMips64le is the registers used by mips64le binaries. +type PtraceRegsMips64le struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +// PtraceGetRegsMips64le fetches the registers used by mips64le binaries. +func PtraceGetRegsMips64le(pid int, regsout *PtraceRegsMips64le) error { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +// PtraceSetRegsMips64le sets the registers used by mips64le binaries. +func PtraceSetRegsMips64le(pid int, regs *PtraceRegsMips64le) error { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go new file mode 100755 index 0000000..4c9f727 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -0,0 +1,1635 @@ +// mksyscall.pl -l32 -tags darwin,386 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,386 + +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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + 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_FSTAT64, 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_FSTATAT64, 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_FSTATFS64, 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), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + 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_LSTAT64, 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 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 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)), uintptr(offset), uintptr(offset>>32), 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)), uintptr(offset), uintptr(offset>>32), 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, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(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 Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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_STATFS64, 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)), uintptr(length), uintptr(length>>32)) + 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 Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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), uintptr(pos), uintptr(pos>>32), 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 gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go new file mode 100755 index 0000000..2562377 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -0,0 +1,1635 @@ +// mksyscall.pl -tags darwin,amd64 syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,amd64 + +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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + 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_FSTAT64, 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_FSTATAT64, 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_FSTATFS64, 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + 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_LSTAT64, 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 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 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)), uintptr(offset), 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 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)), uintptr(offset), 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 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 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + 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 := Syscall(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 Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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_STATFS64, 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)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + 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 gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go new file mode 100755 index 0000000..4ae787e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -0,0 +1,1635 @@ +// mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,arm + +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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + 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_FSTAT64, 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_FSTATAT64, 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_FSTATFS64, 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), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + 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_LSTAT64, 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 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 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)), uintptr(offset), uintptr(offset>>32), 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)), uintptr(offset), uintptr(offset>>32), 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, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(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 Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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_STATFS64, 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)), uintptr(length), uintptr(length>>32)) + 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 Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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), uintptr(pos), uintptr(pos>>32), 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 gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go new file mode 100755 index 0000000..14ed688 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -0,0 +1,1635 @@ +// mksyscall.pl -tags darwin,arm64 syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build darwin,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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + 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_FSTAT64, 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_FSTATAT64, 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_FSTATFS64, 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + 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_LSTAT64, 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 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 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)), uintptr(offset), 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 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)), uintptr(offset), 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 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 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + 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 := Syscall(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 Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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_STATFS64, 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)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + 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 gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go new file mode 100755 index 0000000..91f36e9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -0,0 +1,1508 @@ +// mksyscall.pl -dragonfly -tags dragonfly,amd64 syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build dragonfly,amd64 + +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() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpread(fd int, p []byte, flags int, 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_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), 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 extpwrite(fd int, p []byte, flags int, 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_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), 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 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 Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 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 Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, 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 Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := 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 Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 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 accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go new file mode 100755 index 0000000..a86434a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -l32 -tags freebsd,386 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,386 + +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() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + 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 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 CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + 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), uintptr(length), uintptr(length>>32)) + 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 Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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)), uintptr(offset), uintptr(offset>>32), 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)), uintptr(offset), uintptr(offset>>32), 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, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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)), uintptr(length), uintptr(length>>32)) + 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 Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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), uintptr(pos), uintptr(pos>>32), 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 accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go new file mode 100755 index 0000000..040e2f7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -tags freebsd,amd64 syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,amd64 + +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() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + 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 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 CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + 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), uintptr(length), 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 Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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)), uintptr(offset), 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 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)), uintptr(offset), 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 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 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + 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 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)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + 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 accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go new file mode 100755 index 0000000..cddc5e8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -0,0 +1,1937 @@ +// mksyscall.pl -l32 -arm -tags freebsd,arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build freebsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + 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 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 CapEnter() (err error) { + _, _, e1 := Syscall(SYS_CAP_ENTER, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsGet(version int, fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS___CAP_RIGHTS_GET, uintptr(version), uintptr(fd), uintptr(unsafe.Pointer(rightsp))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func capRightsLimit(fd int, rightsp *CapRights) (err error) { + _, _, e1 := Syscall(SYS_CAP_RIGHTS_LIMIT, uintptr(fd), uintptr(unsafe.Pointer(rightsp)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), 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 ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + 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 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 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 Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Openat(fdat int, path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(fdat), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, 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 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), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go new file mode 100755 index 0000000..433becf --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -0,0 +1,2005 @@ +// mksyscall.pl -l32 -tags linux,386 syscall_linux.go syscall_linux_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,386 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + 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_FCHOWN32, 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 Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), 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 Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) + 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, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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_LCHOWN32, 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 Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, 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 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, 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 Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, 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 Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, 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_SETRESUID32, 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 Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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 SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) + 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_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + 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 Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go new file mode 100755 index 0000000..33c02b2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -0,0 +1,2172 @@ +// mksyscall.pl -tags linux,amd64 syscall_linux.go syscall_linux_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go new file mode 100755 index 0000000..f91b56c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -0,0 +1,2107 @@ +// mksyscall.pl -l32 -arm -tags linux,arm syscall_linux.go syscall_linux_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 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_FCHOWN32, 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 Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), 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 Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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_LCHOWN32, 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 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_LSTAT64, 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 sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, 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 Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, 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 Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, 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_SETRESUID32, 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 Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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 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 EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go new file mode 100755 index 0000000..52d7595 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -0,0 +1,2065 @@ +// mksyscall.pl -tags linux,arm64 syscall_linux.go syscall_linux_arm64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,arm64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go new file mode 100755 index 0000000..970a5c1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -0,0 +1,2173 @@ +// mksyscall.pl -b32 -arm -tags linux,mips syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off>>32), uintptr(off), uintptr(len>>32), uintptr(len)) + 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r0)<<32 | int64(r1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset>>32), uintptr(offset), uintptr(length>>32), uintptr(length), uintptr(advice), 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 Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length>>32), uintptr(length), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset>>32), uintptr(offset)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n), 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 Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length>>32), uintptr(length), 0, 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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 Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + 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_LSTAT64, 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 Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), 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 Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go new file mode 100755 index 0000000..b989d0f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -0,0 +1,2156 @@ +// mksyscall.pl -tags linux,mips64 syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 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, st *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(st)), 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, st *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(st)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go new file mode 100755 index 0000000..1f8d14c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -0,0 +1,2156 @@ +// mksyscall.pl -tags linux,mips64le syscall_linux.go syscall_linux_mips64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mips64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 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, st *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(st)), 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, st *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(st)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go new file mode 100755 index 0000000..a9c7e52 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -0,0 +1,2173 @@ +// mksyscall.pl -l32 -arm -tags linux,mipsle syscall_linux.go syscall_linux_mipsx.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,mipsle + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_FADVISE64, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 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 Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall9(SYS_SYNC_FILE_RANGE, uintptr(fd), 0, uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), 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 Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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 Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + 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_LSTAT64, 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 Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT64, uintptr(dirfd), 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 Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, 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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go new file mode 100755 index 0000000..3bb9a20 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -0,0 +1,2219 @@ +// mksyscall.pl -tags linux,ppc64 syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + 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, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go new file mode 100755 index 0000000..5611662 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -0,0 +1,2219 @@ +// mksyscall.pl -tags linux,ppc64le syscall_linux.go syscall_linux_ppc64x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,ppc64le + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + 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, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go new file mode 100755 index 0000000..9696a01 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -0,0 +1,1989 @@ +// mksyscall.pl -tags linux,s390x syscall_linux.go syscall_linux_s390x.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,s390x + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fchmodat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 KeyctlInt(cmd int, arg2 int, arg3 int, arg4 int, arg5 int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func KeyctlBuffer(cmd int, arg2 int, buf []byte, arg5 int) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(buf)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlJoin(cmd int, arg2 string) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg2) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlSearch(cmd int, arg2 int, arg3 string, arg4 string, arg5 int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg3) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(arg4) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(arg5), 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlIOV(cmd int, arg2 int, payload []Iovec, arg5 int) (err error) { + var _p0 unsafe.Pointer + if len(payload) > 0 { + _p0 = unsafe.Pointer(&payload[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(arg2), uintptr(_p0), uintptr(len(payload)), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func keyctlDH(cmd int, arg2 *KeyctlDHParams, buf []byte) (ret int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_KEYCTL, uintptr(cmd), uintptr(unsafe.Pointer(arg2)), uintptr(_p0), uintptr(len(buf)), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 AddKey(keyType string, description string, payload []byte, ringid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(payload) > 0 { + _p2 = unsafe.Pointer(&payload[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_ADD_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(payload)), uintptr(ringid), 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Eventfd(initval uint, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_EVENTFD2, uintptr(initval), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + SyscallNoError(SYS_EXIT_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 Getpid() (pid int) { + r0, _ := RawSyscallNoError(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, _ := RawSyscallNoError(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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _ := RawSyscallNoError(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Lgetxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_LGETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Llistxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LLISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lremovexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LREMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lsetxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_LSETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + 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 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 PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 RequestKey(keyType string, description string, callback string, destRingid int) (id int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(keyType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(description) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(callback) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_REQUEST_KEY, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(destRingid), 0, 0) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statx(dirfd int, path string, flags int, mask int, stat *Statx_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_STATX, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mask), 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 Sync() { + SyscallNoError(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Syncfs(fd int) (err error) { + _, _, e1 := Syscall(SYS_SYNCFS, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _ := RawSyscallNoError(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 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 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(dirfd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_NEWFSTATAT, uintptr(dirfd), 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, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _ := RawSyscallNoError(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _ := RawSyscallNoError(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _ := RawSyscallNoError(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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, _ := RawSyscallNoError(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + 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, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go new file mode 100755 index 0000000..c01b3b6 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -0,0 +1,1843 @@ +// mksyscall.pl -tags linux,sparc64 syscall_linux.go syscall_linux_sparc64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build linux,sparc64 + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 openat(dirfd int, path string, flags int, mode 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(flags), uintptr(mode), 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 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 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 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 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 utimes(path string, times *[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(times)), 0) + 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 +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + 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 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 ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), 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 mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, 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 Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + 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 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 ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 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 CopyFileRange(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_COPY_FILE_RANGE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 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 EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 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 EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 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_GROUP, 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 Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 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 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 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 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 Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, 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 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 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 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_GETDENTS64, 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 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 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 Getrandom(buf []byte, flags int) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + 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 Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 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 InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ 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_SYSLOG, uintptr(typ), 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 Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 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 PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, 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 prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + 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 Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, 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(olddirfd int, 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 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), 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 Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 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 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(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, 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 Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 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 Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, 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 Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, 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 Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 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 exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + 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, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(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 Madvise(b []byte, advice 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(advice)) + 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 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 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 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 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 EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 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 Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 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), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = 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 Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 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 Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 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 Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + 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_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 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_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 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 Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, 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 Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, 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 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 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(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 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 Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, 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 Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + 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, buf *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(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), 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 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)), uintptr(length), 0) + 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 accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 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 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 getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + 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 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 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 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 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 mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(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 Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 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 pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + 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 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go new file mode 100755 index 0000000..fb4b962 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -l32 -netbsd -tags netbsd,386 syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,386 + +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() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + 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 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 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 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 Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go new file mode 100755 index 0000000..beac82e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -netbsd -tags netbsd,amd64 syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,amd64 + +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() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + 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 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), 0, uintptr(length), uintptr(advice)) + 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 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 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 Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 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 Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, 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 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := 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 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go new file mode 100755 index 0000000..7bd5f60 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -0,0 +1,1424 @@ +// mksyscall.pl -l32 -netbsd -arm -tags netbsd,arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build netbsd,arm + +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() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + 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 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 Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), 0, uintptr(length), uintptr(length>>32), uintptr(advice), 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 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 Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go new file mode 100755 index 0000000..49b3b5e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -l32 -openbsd -tags openbsd,386 syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,386 + +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 Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 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 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go new file mode 100755 index 0000000..c4c7d85 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -openbsd -tags openbsd,amd64 syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,amd64 + +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 Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 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 Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 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 Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, 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 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 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/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go new file mode 100755 index 0000000..210285b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -0,0 +1,1493 @@ +// mksyscall.pl -l32 -openbsd -arm -tags openbsd,arm syscall_bsd.go syscall_openbsd.go syscall_openbsd_arm.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build openbsd,arm + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, behav int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(behav)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Msync(b []byte, flags int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSYNC, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 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 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func 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 Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go new file mode 100755 index 0000000..3978963 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -0,0 +1,1681 @@ +// mksyscall_solaris.pl -tags solaris,amd64 syscall_solaris.go syscall_solaris_amd64.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build solaris,amd64 + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_wait4 wait4 "libc.so" +//go:cgo_import_dynamic libc_gethostname gethostname "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc___xnet_recvmsg __xnet_recvmsg "libsocket.so" +//go:cgo_import_dynamic libc___xnet_sendmsg __xnet_sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc___makedev __makedev "libc.so" +//go:cgo_import_dynamic libc___major __major "libc.so" +//go:cgo_import_dynamic libc___minor __minor "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_poll poll "libc.so" +//go:cgo_import_dynamic libc_access access "libc.so" +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" +//go:cgo_import_dynamic libc_chdir chdir "libc.so" +//go:cgo_import_dynamic libc_chmod chmod "libc.so" +//go:cgo_import_dynamic libc_chown chown "libc.so" +//go:cgo_import_dynamic libc_chroot chroot "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" +//go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" +//go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_flock flock "libc.so" +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" +//go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_fstatat fstatat "libc.so" +//go:cgo_import_dynamic libc_fstatvfs fstatvfs "libc.so" +//go:cgo_import_dynamic libc_getdents getdents "libc.so" +//go:cgo_import_dynamic libc_getgid getgid "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" +//go:cgo_import_dynamic libc_getegid getegid "libc.so" +//go:cgo_import_dynamic libc_getppid getppid "libc.so" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" +//go:cgo_import_dynamic libc_getuid getuid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_lchown lchown "libc.so" +//go:cgo_import_dynamic libc_link link "libc.so" +//go:cgo_import_dynamic libc___xnet_llisten __xnet_llisten "libsocket.so" +//go:cgo_import_dynamic libc_lstat lstat "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" +//go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_msync msync "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" +//go:cgo_import_dynamic libc_pread pread "libc.so" +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_readlink readlink "libc.so" +//go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" +//go:cgo_import_dynamic libc_lseek lseek "libc.so" +//go:cgo_import_dynamic libc_select select "libc.so" +//go:cgo_import_dynamic libc_setegid setegid "libc.so" +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" +//go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" +//go:cgo_import_dynamic libc_setregid setregid "libc.so" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" +//go:cgo_import_dynamic libc_setsid setsid "libc.so" +//go:cgo_import_dynamic libc_setuid setuid "libc.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_statvfs statvfs "libc.so" +//go:cgo_import_dynamic libc_symlink symlink "libc.so" +//go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" +//go:cgo_import_dynamic libc_truncate truncate "libc.so" +//go:cgo_import_dynamic libc_fsync fsync "libc.so" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" +//go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" +//go:cgo_import_dynamic libc_unlink unlink "libc.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc___xnet_bind __xnet_bind "libsocket.so" +//go:cgo_import_dynamic libc___xnet_connect __xnet_connect "libsocket.so" +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc_sendfile sendfile "libsendfile.so" +//go:cgo_import_dynamic libc___xnet_sendto __xnet_sendto "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socket __xnet_socket "libsocket.so" +//go:cgo_import_dynamic libc___xnet_socketpair __xnet_socketpair "libsocket.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc___xnet_getsockopt __xnet_getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" + +//go:linkname procpipe libc_pipe +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd +//go:linkname procgetgroups libc_getgroups +//go:linkname procsetgroups libc_setgroups +//go:linkname procwait4 libc_wait4 +//go:linkname procgethostname libc_gethostname +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat +//go:linkname procfcntl libc_fcntl +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname proc__xnet_recvmsg libc___xnet_recvmsg +//go:linkname proc__xnet_sendmsg libc___xnet_sendmsg +//go:linkname procacct libc_acct +//go:linkname proc__makedev libc___makedev +//go:linkname proc__major libc___major +//go:linkname proc__minor libc___minor +//go:linkname procioctl libc_ioctl +//go:linkname procpoll libc_poll +//go:linkname procAccess libc_access +//go:linkname procAdjtime libc_adjtime +//go:linkname procChdir libc_chdir +//go:linkname procChmod libc_chmod +//go:linkname procChown libc_chown +//go:linkname procChroot libc_chroot +//go:linkname procClose libc_close +//go:linkname procCreat libc_creat +//go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 +//go:linkname procExit libc_exit +//go:linkname procFchdir libc_fchdir +//go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat +//go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync +//go:linkname procFlock libc_flock +//go:linkname procFpathconf libc_fpathconf +//go:linkname procFstat libc_fstat +//go:linkname procFstatat libc_fstatat +//go:linkname procFstatvfs libc_fstatvfs +//go:linkname procGetdents libc_getdents +//go:linkname procGetgid libc_getgid +//go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp +//go:linkname procGeteuid libc_geteuid +//go:linkname procGetegid libc_getegid +//go:linkname procGetppid libc_getppid +//go:linkname procGetpriority libc_getpriority +//go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage +//go:linkname procGettimeofday libc_gettimeofday +//go:linkname procGetuid libc_getuid +//go:linkname procKill libc_kill +//go:linkname procLchown libc_lchown +//go:linkname procLink libc_link +//go:linkname proc__xnet_llisten libc___xnet_llisten +//go:linkname procLstat libc_lstat +//go:linkname procMadvise libc_madvise +//go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat +//go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMsync libc_msync +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall +//go:linkname procNanosleep libc_nanosleep +//go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat +//go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause +//go:linkname procPread libc_pread +//go:linkname procPwrite libc_pwrite +//go:linkname procread libc_read +//go:linkname procReadlink libc_readlink +//go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat +//go:linkname procRmdir libc_rmdir +//go:linkname proclseek libc_lseek +//go:linkname procSelect libc_select +//go:linkname procSetegid libc_setegid +//go:linkname procSeteuid libc_seteuid +//go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname +//go:linkname procSetpgid libc_setpgid +//go:linkname procSetpriority libc_setpriority +//go:linkname procSetregid libc_setregid +//go:linkname procSetreuid libc_setreuid +//go:linkname procSetrlimit libc_setrlimit +//go:linkname procSetsid libc_setsid +//go:linkname procSetuid libc_setuid +//go:linkname procshutdown libc_shutdown +//go:linkname procStat libc_stat +//go:linkname procStatvfs libc_statvfs +//go:linkname procSymlink libc_symlink +//go:linkname procSync libc_sync +//go:linkname procTimes libc_times +//go:linkname procTruncate libc_truncate +//go:linkname procFsync libc_fsync +//go:linkname procFtruncate libc_ftruncate +//go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount +//go:linkname procUnlink libc_unlink +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname proc__xnet_bind libc___xnet_bind +//go:linkname proc__xnet_connect libc___xnet_connect +//go:linkname procmmap libc_mmap +//go:linkname procmunmap libc_munmap +//go:linkname procsendfile libc_sendfile +//go:linkname proc__xnet_sendto libc___xnet_sendto +//go:linkname proc__xnet_socket libc___xnet_socket +//go:linkname proc__xnet_socketpair libc___xnet_socketpair +//go:linkname procwrite libc_write +//go:linkname proc__xnet_getsockopt libc___xnet_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom + +var ( + procpipe, + procgetsockname, + procGetcwd, + procgetgroups, + procsetgroups, + procwait4, + procgethostname, + procutimes, + procutimensat, + procfcntl, + procfutimesat, + procaccept, + proc__xnet_recvmsg, + proc__xnet_sendmsg, + procacct, + proc__makedev, + proc__major, + proc__minor, + procioctl, + procpoll, + procAccess, + procAdjtime, + procChdir, + procChmod, + procChown, + procChroot, + procClose, + procCreat, + procDup, + procDup2, + procExit, + procFchdir, + procFchmod, + procFchmodat, + procFchown, + procFchownat, + procFdatasync, + procFlock, + procFpathconf, + procFstat, + procFstatat, + procFstatvfs, + procGetdents, + procGetgid, + procGetpid, + procGetpgid, + procGetpgrp, + procGeteuid, + procGetegid, + procGetppid, + procGetpriority, + procGetrlimit, + procGetrusage, + procGettimeofday, + procGetuid, + procKill, + procLchown, + procLink, + proc__xnet_llisten, + procLstat, + procMadvise, + procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, + procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMsync, + procMunlock, + procMunlockall, + procNanosleep, + procOpen, + procOpenat, + procPathconf, + procPause, + procPread, + procPwrite, + procread, + procReadlink, + procRename, + procRenameat, + procRmdir, + proclseek, + procSelect, + procSetegid, + procSeteuid, + procSetgid, + procSethostname, + procSetpgid, + procSetpriority, + procSetregid, + procSetreuid, + procSetrlimit, + procSetsid, + procSetuid, + procshutdown, + procStat, + procStatvfs, + procSymlink, + procSync, + procTimes, + procTruncate, + procFsync, + procFtruncate, + procUmask, + procUname, + procumount, + procUnlink, + procUnlinkat, + procUstat, + procUtime, + proc__xnet_bind, + proc__xnet_connect, + procmmap, + procmunmap, + procsendfile, + proc__xnet_sendto, + proc__xnet_socket, + proc__xnet_socketpair, + procwrite, + proc__xnet_getsockopt, + procgetpeername, + procsetsockopt, + procrecvfrom syscallFunc +) + +func pipe(p *[2]_C_int) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe)), 1, uintptr(unsafe.Pointer(p)), 0, 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwait4)), 4, uintptr(pid), uintptr(unsafe.Pointer(statusp)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int32(r0) + if e1 != 0 { + err = e1 + } + return +} + +func gethostname(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_recvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func __makedev(version int, major uint, minor uint) (val uint64) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__makedev)), 3, uintptr(version), uintptr(major), uintptr(minor), 0, 0, 0) + val = uint64(r0) + return +} + +func __major(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__major)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func __minor(version int, dev uint64) (val uint) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&proc__minor)), 2, uintptr(version), uintptr(dev), 0, 0, 0, 0) + val = uint(r0) + return +} + +func ioctl(fd int, req uint, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procpoll)), 3, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Close(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) + nfd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Exit(code int) { + sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +func Fchdir(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +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 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Flock(fd int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFlock)), 2, uintptr(fd), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +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 := sysvicall6(uintptr(unsafe.Pointer(&procFstatat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstatvfs)), 2, uintptr(fd), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getgid() (gid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) + gid = int(r0) + return +} + +func Getpid() (pid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + return +} + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Geteuid() (euid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) + euid = int(r0) + return +} + +func Getegid() (egid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) + egid = int(r0) + return +} + +func Getppid() (ppid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) + ppid = int(r0) + return +} + +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getuid() (uid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) + uid = int(r0) + return +} + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +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 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Listen(s int, backlog int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_llisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Msync(b []byte, flags int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMsync)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +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 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +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 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Renameat(olddirfd int, 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 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSelect)), 5, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setegid(egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seteuid(euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setgid(gid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setsid() (pid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setuid(uid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Shutdown(s int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Statvfs(path string, vfsstat *Statvfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStatvfs)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(vfsstat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sync() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fsync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + oldmask = int(r0) + return +} + +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_bind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_connect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendfile)), 4, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_sendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = e1 + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&proc__xnet_socketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proc__xnet_getsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = e1 + } + return +} + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go similarity index 100% rename from vendor/golang.org/x/sys/unix/zsysctl_openbsd.go rename to vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go new file mode 100755 index 0000000..83bb935 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go new file mode 100755 index 0000000..83bb935 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go new file mode 100755 index 0000000..d1d36da --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go new file mode 100755 index 0000000..e35de41 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go new file mode 100755 index 0000000..f2df27d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go new file mode 100755 index 0000000..9694630 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -0,0 +1,436 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.1.sdk/usr/include/sys/syscall.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TYPEFILTER = 177 + SYS_KDEBUG_TRACE_STRING = 178 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_THREAD_SELFCOUNTS = 186 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS_KEVENT_QOS = 374 + SYS_KEVENT_ID = 375 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS_PSELECT = 394 + SYS_PSELECT_NOCANCEL = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_USRCTL = 445 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_CLONEFILEAT = 462 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAMEATX_NP = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_NETAGENT_TRIGGER = 490 + SYS_STACK_SNAPSHOT_WITH_CONFIG = 491 + SYS_MICROSTACKSHOT = 492 + SYS_GRAB_PGO_DATA = 493 + SYS_PERSONA = 494 + SYS_WORK_INTERVAL_CTL = 499 + SYS_GETENTROPY = 500 + SYS_NECP_OPEN = 501 + SYS_NECP_CLIENT_ACTION = 502 + SYS___NEXUS_OPEN = 503 + SYS___NEXUS_REGISTER = 504 + SYS___NEXUS_DEREGISTER = 505 + SYS___NEXUS_CREATE = 506 + SYS___NEXUS_DESTROY = 507 + SYS___NEXUS_GET_OPT = 508 + SYS___NEXUS_SET_OPT = 509 + SYS___CHANNEL_OPEN = 510 + SYS___CHANNEL_GET_INFO = 511 + SYS___CHANNEL_SYNC = 512 + SYS___CHANNEL_GET_OPT = 513 + SYS___CHANNEL_SET_OPT = 514 + SYS_ULOCK_WAIT = 515 + SYS_ULOCK_WAKE = 516 + SYS_FCLONEFILEAT = 517 + SYS_FS_SNAPSHOT = 518 + SYS_TERMINATE_WITH_PAYLOAD = 520 + SYS_ABORT_WITH_PAYLOAD = 521 + SYS_NECP_SESSION_OPEN = 522 + SYS_NECP_SESSION_ACTION = 523 + SYS_SETATTRLISTAT = 524 + SYS_NET_QOS_GUIDELINE = 525 + SYS_FMOUNT = 526 + SYS_NTP_ADJTIME = 527 + SYS_NTP_GETTIME = 528 + SYS_OS_FAULT_WITH_PAYLOAD = 529 + SYS_MAXSYSCALL = 530 + SYS_INVALID = 63 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go new file mode 100755 index 0000000..b2c9ef8 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -0,0 +1,315 @@ +// mksysnum_dragonfly.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void exit(int rval); } + SYS_FORK = 2 // { int fork(void); } + 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, int options, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ + 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, caddr_t addr, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ + SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } + SYS_ACCESS = 33 // { int access(char *path, int flags); } + SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(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, int facs, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + 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, 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 // { int readlink(char *path, char *buf, int 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, int flags); } + SYS_VFORK = 66 // { pid_t vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(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, \ + 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 itimerval *itv, \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(int from, int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + 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, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } + SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } + SYS_UNAME = 164 // { int uname(struct utsname *name); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ + SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_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_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ + // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int + SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ + 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___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ + SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + 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, u_int nfds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ + SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ + SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(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 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, 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_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_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } + 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, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + 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, const sigset_t *set, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } + 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, acl_type_t type, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + 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, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ + SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int 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_KENV = 390 // { int kenv(int what, const char *name, char *value, int len); } + SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ + SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } + SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } + SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } + SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } + SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } + SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } + SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } + SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } + SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } + SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } + SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_CLOSEFROM = 474 // { int closefrom(int fd); } + SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } + SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } + SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ + SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } + SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ + SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } + SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } + SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } + SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } + SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } + SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ + SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ + SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ + SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ + SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ + SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ + SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } + SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } + SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } + SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } + SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } + SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } + SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } + SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } + SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ + SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } + SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ + SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ + SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ + SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } + SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ + SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ + SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } + SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } + SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ + SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ + SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ + SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ + SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ + SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ + SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ + SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } + SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } + SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } + SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_SWAPOFF = 529 // { int swapoff(char *name); } + SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ + SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } + SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } + SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } + SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } + SYS_PROCCTL = 536 // { int procctl(idtype_t idtype, id_t id, int cmd, void *data); } + SYS_CHFLAGSAT = 537 // { int chflagsat(int fd, const char *path, int flags, int atflags);} + SYS_PIPE2 = 538 // { int pipe2(int *fildes, int flags); } + SYS_UTIMENSAT = 539 // { int utimensat(int fd, const char *path, const struct timespec *ts, int flags); } + SYS_FUTIMENS = 540 // { int futimens(int fd, const struct timespec *ts); } + SYS_ACCEPT4 = 541 // { int accept4(int s, caddr_t name, int *anamelen, int flags); } + SYS_LWP_SETNAME = 542 // { int lwp_setname(lwpid_t tid, const char *name); } + SYS_PPOLL = 543 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_LWP_SETAFFINITY = 544 // { int lwp_setaffinity(pid_t pid, lwpid_t tid, const cpumask_t *mask); } + SYS_LWP_GETAFFINITY = 545 // { int lwp_getaffinity(pid_t pid, lwpid_t tid, cpumask_t *mask); } + SYS_LWP_CREATE2 = 546 // { int lwp_create2(struct lwp_params *params, const cpumask_t *mask); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go new file mode 100755 index 0000000..b64a812 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go new file mode 100755 index 0000000..81722ac --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go new file mode 100755 index 0000000..4488314 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -0,0 +1,353 @@ +// mksysnum_freebsd.pl +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS___CAP_RIGHTS_GET = 515 // { int __cap_rights_get(int version, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_CAP_RIGHTS_LIMIT = 533 // { int cap_rights_limit(int fd, \ + SYS_CAP_IOCTLS_LIMIT = 534 // { int cap_ioctls_limit(int fd, \ + SYS_CAP_IOCTLS_GET = 535 // { ssize_t cap_ioctls_get(int fd, \ + SYS_CAP_FCNTLS_LIMIT = 536 // { int cap_fcntls_limit(int fd, \ + SYS_CAP_FCNTLS_GET = 537 // { int cap_fcntls_get(int fd, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ + SYS_FUTIMENS = 546 // { int futimens(int fd, \ + SYS_UTIMENSAT = 547 // { int utimensat(int fd, \ +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go new file mode 100755 index 0000000..95ab129 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -0,0 +1,390 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m32 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +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 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go new file mode 100755 index 0000000..c5dabf2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -0,0 +1,342 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -m64 /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go new file mode 100755 index 0000000..ab7fa5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -0,0 +1,362 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + SYS_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 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go new file mode 100755 index 0000000..b1c6b4b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -0,0 +1,286 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go new file mode 100755 index 0000000..2e9aa7a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +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 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go new file mode 100755 index 0000000..9282763 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go new file mode 100755 index 0000000..45bd3fd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -0,0 +1,335 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go new file mode 100755 index 0000000..62ccac4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -0,0 +1,375 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +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 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go new file mode 100755 index 0000000..384d49b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -0,0 +1,373 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +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_VM86 = 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_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go new file mode 100755 index 0000000..9623248 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -0,0 +1,373 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +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_VM86 = 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_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go new file mode 100755 index 0000000..ed92409 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -0,0 +1,334 @@ +// linux/mksysnum.pl -Wall -Werror -static -I/tmp/include -fsigned-char /tmp/include/asm/unistd.h +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + 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_SIGNAL = 48 + 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_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + 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_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_GETDENTS = 141 + SYS_SELECT = 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_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + 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_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + 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_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_NEWFSTATAT = 293 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 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_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 + SYS_S390_STHYI = 380 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go new file mode 100755 index 0000000..c9c129d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -0,0 +1,348 @@ +// mksysnum_linux.pl -Ilinux/usr/include -m64 -D__arch64__ linux/usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build sparc64,linux + +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_WAIT4 = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECV = 11 + SYS_CHDIR = 12 + SYS_CHOWN = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BRK = 17 + SYS_PERFCTR = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_CAPGET = 21 + SYS_CAPSET = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_VMSPLICE = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_SIGALTSTACK = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_STAT = 38 + SYS_SENDFILE = 39 + SYS_LSTAT = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_UMOUNT2 = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_MEMORY_ORDERING = 52 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_FSTAT = 62 + SYS_FSTAT64 = 63 + SYS_GETPAGESIZE = 64 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_MMAP = 71 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_VHANGUP = 76 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_SETHOSTNAME = 88 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_ACCEPT = 99 + SYS_GETPRIORITY = 100 + SYS_RT_SIGRETURN = 101 + SYS_RT_SIGACTION = 102 + SYS_RT_SIGPROCMASK = 103 + SYS_RT_SIGPENDING = 104 + SYS_RT_SIGTIMEDWAIT = 105 + SYS_RT_SIGQUEUEINFO = 106 + SYS_RT_SIGSUSPEND = 107 + SYS_SETRESUID = 108 + SYS_GETRESUID = 109 + SYS_SETRESGID = 110 + SYS_GETRESGID = 111 + SYS_RECVMSG = 113 + SYS_SENDMSG = 114 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_GETCWD = 119 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_RECVFROM = 125 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_TRUNCATE = 129 + SYS_FTRUNCATE = 130 + SYS_FLOCK = 131 + SYS_LSTAT64 = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_STAT64 = 139 + SYS_SENDFILE64 = 140 + SYS_GETPEERNAME = 141 + SYS_FUTEX = 142 + SYS_GETTID = 143 + SYS_GETRLIMIT = 144 + SYS_SETRLIMIT = 145 + SYS_PIVOT_ROOT = 146 + SYS_PRCTL = 147 + SYS_PCICONFIG_READ = 148 + SYS_PCICONFIG_WRITE = 149 + SYS_GETSOCKNAME = 150 + SYS_INOTIFY_INIT = 151 + SYS_INOTIFY_ADD_WATCH = 152 + SYS_POLL = 153 + SYS_GETDENTS64 = 154 + SYS_INOTIFY_RM_WATCH = 156 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UMOUNT = 159 + SYS_SCHED_SET_AFFINITY = 160 + SYS_SCHED_GET_AFFINITY = 161 + SYS_GETDOMAINNAME = 162 + SYS_SETDOMAINNAME = 163 + SYS_UTRAP_INSTALL = 164 + SYS_QUOTACTL = 165 + SYS_SET_TID_ADDRESS = 166 + SYS_MOUNT = 167 + SYS_USTAT = 168 + SYS_SETXATTR = 169 + SYS_LSETXATTR = 170 + SYS_FSETXATTR = 171 + SYS_GETXATTR = 172 + SYS_LGETXATTR = 173 + SYS_GETDENTS = 174 + SYS_SETSID = 175 + SYS_FCHDIR = 176 + SYS_FGETXATTR = 177 + SYS_LISTXATTR = 178 + SYS_LLISTXATTR = 179 + SYS_FLISTXATTR = 180 + SYS_REMOVEXATTR = 181 + SYS_LREMOVEXATTR = 182 + SYS_SIGPENDING = 183 + SYS_QUERY_MODULE = 184 + SYS_SETPGID = 185 + SYS_FREMOVEXATTR = 186 + SYS_TKILL = 187 + SYS_EXIT_GROUP = 188 + SYS_UNAME = 189 + SYS_INIT_MODULE = 190 + SYS_PERSONALITY = 191 + SYS_REMAP_FILE_PAGES = 192 + SYS_EPOLL_CREATE = 193 + SYS_EPOLL_CTL = 194 + SYS_EPOLL_WAIT = 195 + SYS_IOPRIO_SET = 196 + SYS_GETPPID = 197 + SYS_SIGACTION = 198 + SYS_SGETMASK = 199 + SYS_SSETMASK = 200 + SYS_SIGSUSPEND = 201 + SYS_OLDLSTAT = 202 + SYS_USELIB = 203 + SYS_READDIR = 204 + SYS_READAHEAD = 205 + SYS_SOCKETCALL = 206 + SYS_SYSLOG = 207 + SYS_LOOKUP_DCOOKIE = 208 + SYS_FADVISE64 = 209 + SYS_FADVISE64_64 = 210 + SYS_TGKILL = 211 + SYS_WAITPID = 212 + SYS_SWAPOFF = 213 + SYS_SYSINFO = 214 + SYS_IPC = 215 + SYS_SIGRETURN = 216 + SYS_CLONE = 217 + SYS_IOPRIO_GET = 218 + SYS_ADJTIMEX = 219 + SYS_SIGPROCMASK = 220 + SYS_CREATE_MODULE = 221 + SYS_DELETE_MODULE = 222 + SYS_GET_KERNEL_SYMS = 223 + SYS_GETPGID = 224 + SYS_BDFLUSH = 225 + SYS_SYSFS = 226 + SYS_AFS_SYSCALL = 227 + SYS_SETFSUID = 228 + SYS_SETFSGID = 229 + SYS__NEWSELECT = 230 + SYS_SPLICE = 232 + SYS_STIME = 233 + SYS_STATFS64 = 234 + SYS_FSTATFS64 = 235 + SYS__LLSEEK = 236 + SYS_MLOCK = 237 + SYS_MUNLOCK = 238 + SYS_MLOCKALL = 239 + SYS_MUNLOCKALL = 240 + SYS_SCHED_SETPARAM = 241 + SYS_SCHED_GETPARAM = 242 + SYS_SCHED_SETSCHEDULER = 243 + SYS_SCHED_GETSCHEDULER = 244 + SYS_SCHED_YIELD = 245 + SYS_SCHED_GET_PRIORITY_MAX = 246 + SYS_SCHED_GET_PRIORITY_MIN = 247 + SYS_SCHED_RR_GET_INTERVAL = 248 + SYS_NANOSLEEP = 249 + SYS_MREMAP = 250 + SYS__SYSCTL = 251 + SYS_GETSID = 252 + SYS_FDATASYNC = 253 + SYS_NFSSERVCTL = 254 + SYS_SYNC_FILE_RANGE = 255 + SYS_CLOCK_SETTIME = 256 + SYS_CLOCK_GETTIME = 257 + SYS_CLOCK_GETRES = 258 + SYS_CLOCK_NANOSLEEP = 259 + SYS_SCHED_GETAFFINITY = 260 + SYS_SCHED_SETAFFINITY = 261 + SYS_TIMER_SETTIME = 262 + SYS_TIMER_GETTIME = 263 + SYS_TIMER_GETOVERRUN = 264 + SYS_TIMER_DELETE = 265 + SYS_TIMER_CREATE = 266 + SYS_IO_SETUP = 268 + SYS_IO_DESTROY = 269 + SYS_IO_SUBMIT = 270 + SYS_IO_CANCEL = 271 + SYS_IO_GETEVENTS = 272 + SYS_MQ_OPEN = 273 + SYS_MQ_UNLINK = 274 + SYS_MQ_TIMEDSEND = 275 + SYS_MQ_TIMEDRECEIVE = 276 + SYS_MQ_NOTIFY = 277 + SYS_MQ_GETSETATTR = 278 + SYS_WAITID = 279 + SYS_TEE = 280 + SYS_ADD_KEY = 281 + SYS_REQUEST_KEY = 282 + SYS_KEYCTL = 283 + SYS_OPENAT = 284 + SYS_MKDIRAT = 285 + SYS_MKNODAT = 286 + SYS_FCHOWNAT = 287 + SYS_FUTIMESAT = 288 + SYS_FSTATAT64 = 289 + SYS_UNLINKAT = 290 + SYS_RENAMEAT = 291 + SYS_LINKAT = 292 + SYS_SYMLINKAT = 293 + SYS_READLINKAT = 294 + SYS_FCHMODAT = 295 + SYS_FACCESSAT = 296 + SYS_PSELECT6 = 297 + SYS_PPOLL = 298 + SYS_UNSHARE = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_GET_ROBUST_LIST = 301 + SYS_MIGRATE_PAGES = 302 + SYS_MBIND = 303 + SYS_GET_MEMPOLICY = 304 + SYS_SET_MEMPOLICY = 305 + SYS_KEXEC_LOAD = 306 + SYS_MOVE_PAGES = 307 + SYS_GETCPU = 308 + SYS_EPOLL_PWAIT = 309 + SYS_UTIMENSAT = 310 + SYS_SIGNALFD = 311 + SYS_TIMERFD_CREATE = 312 + SYS_EVENTFD = 313 + SYS_FALLOCATE = 314 + SYS_TIMERFD_SETTIME = 315 + SYS_TIMERFD_GETTIME = 316 + SYS_SIGNALFD4 = 317 + SYS_EVENTFD2 = 318 + SYS_EPOLL_CREATE1 = 319 + SYS_DUP3 = 320 + SYS_PIPE2 = 321 + SYS_INOTIFY_INIT1 = 322 + SYS_ACCEPT4 = 323 + SYS_PREADV = 324 + SYS_PWRITEV = 325 + SYS_RT_TGSIGQUEUEINFO = 326 + SYS_PERF_EVENT_OPEN = 327 + SYS_RECVMMSG = 328 + SYS_FANOTIFY_INIT = 329 + SYS_FANOTIFY_MARK = 330 + SYS_PRLIMIT64 = 331 + SYS_NAME_TO_HANDLE_AT = 332 + SYS_OPEN_BY_HANDLE_AT = 333 + SYS_CLOCK_ADJTIME = 334 + SYS_SYNCFS = 335 + SYS_SENDMMSG = 336 + SYS_SETNS = 337 + SYS_PROCESS_VM_READV = 338 + SYS_PROCESS_VM_WRITEV = 339 + SYS_KERN_FEATURES = 340 + SYS_KCMP = 341 + SYS_FINIT_MODULE = 342 + SYS_SCHED_SETATTR = 343 + SYS_SCHED_GETATTR = 344 + SYS_RENAMEAT2 = 345 + SYS_SECCOMP = 346 + SYS_GETRANDOM = 347 + SYS_MEMFD_CREATE = 348 + SYS_BPF = 349 + SYS_EXECVEAT = 350 + SYS_MEMBARRIER = 351 + SYS_USERFAULTFD = 352 + SYS_BIND = 353 + SYS_LISTEN = 354 + SYS_SETSOCKOPT = 355 + SYS_MLOCK2 = 356 + SYS_COPY_FILE_RANGE = 357 + SYS_PREADV2 = 358 + SYS_PWRITEV2 = 359 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go new file mode 100755 index 0000000..8afda9c --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,netbsd + +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_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + 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_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + 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_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *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 flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *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_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + 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_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + 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_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + 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_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + 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_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + 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_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_SETSID = 147 // { int|sys||setsid(void); } + 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_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + 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_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, const 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_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + 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 // { ssize_t|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_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go new file mode 100755 index 0000000..aea8dbe --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,netbsd + +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_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + 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_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + 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_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *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 flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *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_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + 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_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + 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_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + 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_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + 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_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + 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_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_SETSID = 147 // { int|sys||setsid(void); } + 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_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + 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_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, const 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_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + 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 // { ssize_t|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_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go new file mode 100755 index 0000000..c6158a7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -0,0 +1,274 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,netbsd + +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_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + 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_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + 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_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *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 flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *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_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + 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_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + 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_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + 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_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + 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_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + 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_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_SETSID = 147 // { int|sys||setsid(void); } + 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_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + 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_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, const 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_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + 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 // { ssize_t|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_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS_MSYNC = 277 // { int|sys|13|msync(void *addr, size_t len, int flags); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go new file mode 100755 index 0000000..3e8ce2a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + 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_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go new file mode 100755 index 0000000..bd28146 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + 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_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go new file mode 100755 index 0000000..32653e5 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go @@ -0,0 +1,213 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS_GETENTROPY = 7 // { int sys_getentropy(void *buf, size_t nbyte); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int amode); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { ssize_t sys_readlink(const char *path, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, pid_t pgid); } + SYS_SENDSYSLOG = 83 // { int sys_sendsyslog(const void *buf, size_t nbyte); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS_ACCEPT4 = 93 // { int sys_accept4(int s, struct sockaddr *name, \ + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_PIPE2 = 101 // { int sys_pipe2(int *fdp, int flags); } + SYS_DUP3 = 102 // { int sys_dup3(int from, int to, int flags); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_CHFLAGSAT = 107 // { int sys_chflagsat(int fd, const char *path, \ + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_KILL = 122 // { int sys_kill(int pid, int signum); } + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go new file mode 100755 index 0000000..327af5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -0,0 +1,489 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct{} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +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 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +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 [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go new file mode 100755 index 0000000..116e6e0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,darwin + +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 int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +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 { + 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 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +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 [12]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 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 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]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +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 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go new file mode 100755 index 0000000..2750ad7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -0,0 +1,490 @@ +// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +// +build arm,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 [0]byte + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +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 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +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 [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go new file mode 100755 index 0000000..8cead09 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -0,0 +1,499 @@ +// cgo -godefs types_darwin.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,darwin + +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 int32 + _ [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +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 { + 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 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + _ [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + _ [8]byte + _ [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + _ [3]byte +} + +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 [12]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 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 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]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +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 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + _ [4]byte + Ispeed uint64 + Ospeed uint64 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x2 + AT_REMOVEDIR = 0x80 + AT_SYMLINK_FOLLOW = 0x40 + AT_SYMLINK_NOFOLLOW = 0x20 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go new file mode 100755 index 0000000..315a553 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -0,0 +1,486 @@ +// cgo -godefs types_dragonfly.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,dragonfly + +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 int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + 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 +} + +type Statfs_t struct { + Spare2 int64 + Bsize int64 + Iosize int64 + Blocks int64 + Bfree int64 + Bavail int64 + Files int64 + Ffree int64 + Fsid Fsid + Owner uint32 + Type int32 + Flags int32 + _ [4]byte + Syncwrites int64 + Asyncwrites int64 + Fstypename [16]int8 + Mntonname [80]int8 + Syncreads int64 + Asyncreads int64 + Spares1 int16 + Mntfromname [80]int8 + Spares2 int16 + _ [4]byte + Spare [2]int64 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Namlen uint16 + Type uint8 + Unused1 uint8 + Unused2 uint32 + 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 [12]int8 + Rcf uint16 + Route [16]uint16 +} + +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 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + 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 = 0x36 + 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 [16]uint64 +} + +const ( + SizeofIfMsghdr = 0xb0 + SizeofIfData = 0xa0 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + _ [2]byte + Mtu uint64 + Metric uint64 + Link_state uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Oqdrops uint64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Pksent uint64 + Expire uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Recvpipe uint64 + Hopcount uint64 + Mssopt uint16 + Pad uint16 + _ [4]byte + Msl uint64 + Iwmaxsegs uint64 + Iwcapsegs uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [6]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = 0xfffafdcd + AT_SYMLINK_NOFOLLOW = 0x1 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [32]byte + Nodename [32]byte + Release [32]byte + Version [32]byte + Machine [32]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go new file mode 100755 index 0000000..878a21a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -0,0 +1,553 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec + Pad_cgo_0 [8]byte +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + 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 = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x60 + sizeofIfData = 0x98 + SizeofIfData = 0x50 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Epoch int32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go new file mode 100755 index 0000000..8408af1 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -0,0 +1,556 @@ +// cgo -godefs types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,freebsd + +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 int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [46]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +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 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 = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + 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 { + X__fds_bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Filler [3]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go new file mode 100755 index 0000000..4b2d9a4 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -0,0 +1,556 @@ +// cgo -godefs -- -fsigned-char types_freebsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + 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 = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0x70 + sizeofIfData = 0x98 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Datalen uint16 + Mtu uint32 + Metric uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Oqdrops uint64 + Noproto uint64 + Hwassist uint64 + X__ifi_epoch [8]byte + X__ifi_lastchange [16]byte +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Pad_cgo_0 [4]byte + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x800 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLINIGNEOF = 0x2000 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type CapRights struct { + Rights [2]uint64 +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new file mode 100755 index 0000000..a805313 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -0,0 +1,1246 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [2]byte + Size int64 + Blksize int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [1]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +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 Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new file mode 100755 index 0000000..98aa923 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -0,0 +1,1265 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [3]int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new file mode 100755 index 0000000..ead8f25 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -0,0 +1,1235 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + _ uint16 + _ [2]byte + _ uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint16 + _ [6]byte + Size int64 + Blksize int32 + _ [4]byte + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 + _ [4]byte +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +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 Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Uregs [18]uint32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]uint8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]uint8 + Fpack [6]uint8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]uint8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new file mode 100755 index 0000000..8c32c3b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -0,0 +1,1244 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + _ uint64 + Size int64 + Blksize int32 + _ int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ [2]int32 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go new file mode 100755 index 0000000..af291d9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -0,0 +1,1240 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +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 Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new file mode 100755 index 0000000..324ee16 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -0,0 +1,1246 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new file mode 100755 index 0000000..08849df --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -0,0 +1,1246 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mips64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint32 + Pad1 [3]uint32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go new file mode 100755 index 0000000..3682beb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -0,0 +1,1240 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build mipsle,linux + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + _ [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]int32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad4 int32 + Blocks int64 + Pad5 [14]int32 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Frsize int32 + _ [4]byte + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int32 + Flags int32 + Spare [5]int32 + _ [4]byte +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +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 Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [32]uint64 + Lo uint64 + Hi uint64 + Epc uint64 + Badvaddr uint64 + Status uint64 + Cause uint64 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + _ [8]int8 +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [32]uint32 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [23]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint32 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x20 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [122]int8 + _ uint32 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + Start uint32 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new file mode 100755 index 0000000..bfa39ec --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -0,0 +1,1254 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new file mode 100755 index 0000000..72eab3d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -0,0 +1,1254 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build ppc64le,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + _ uint64 + _ uint64 + _ uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]uint8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x40045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]uint8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x1 + CBitFieldMaskBit1 = 0x2 + CBitFieldMaskBit2 = 0x4 + CBitFieldMaskBit3 = 0x8 + CBitFieldMaskBit4 = 0x10 + CBitFieldMaskBit5 = 0x20 + CBitFieldMaskBit6 = 0x40 + CBitFieldMaskBit7 = 0x80 + CBitFieldMaskBit8 = 0x100 + CBitFieldMaskBit9 = 0x200 + CBitFieldMaskBit10 = 0x400 + CBitFieldMaskBit11 = 0x800 + CBitFieldMaskBit12 = 0x1000 + CBitFieldMaskBit13 = 0x2000 + CBitFieldMaskBit14 = 0x4000 + CBitFieldMaskBit15 = 0x8000 + CBitFieldMaskBit16 = 0x10000 + CBitFieldMaskBit17 = 0x20000 + CBitFieldMaskBit18 = 0x40000 + CBitFieldMaskBit19 = 0x80000 + CBitFieldMaskBit20 = 0x100000 + CBitFieldMaskBit21 = 0x200000 + CBitFieldMaskBit22 = 0x400000 + CBitFieldMaskBit23 = 0x800000 + CBitFieldMaskBit24 = 0x1000000 + CBitFieldMaskBit25 = 0x2000000 + CBitFieldMaskBit26 = 0x4000000 + CBitFieldMaskBit27 = 0x8000000 + CBitFieldMaskBit28 = 0x10000000 + CBitFieldMaskBit29 = 0x20000000 + CBitFieldMaskBit30 = 0x40000000 + CBitFieldMaskBit31 = 0x80000000 + CBitFieldMaskBit32 = 0x100000000 + CBitFieldMaskBit33 = 0x200000000 + CBitFieldMaskBit34 = 0x400000000 + CBitFieldMaskBit35 = 0x800000000 + CBitFieldMaskBit36 = 0x1000000000 + CBitFieldMaskBit37 = 0x2000000000 + CBitFieldMaskBit38 = 0x4000000000 + CBitFieldMaskBit39 = 0x8000000000 + CBitFieldMaskBit40 = 0x10000000000 + CBitFieldMaskBit41 = 0x20000000000 + CBitFieldMaskBit42 = 0x40000000000 + CBitFieldMaskBit43 = 0x80000000000 + CBitFieldMaskBit44 = 0x100000000000 + CBitFieldMaskBit45 = 0x200000000000 + CBitFieldMaskBit46 = 0x400000000000 + CBitFieldMaskBit47 = 0x800000000000 + CBitFieldMaskBit48 = 0x1000000000000 + CBitFieldMaskBit49 = 0x2000000000000 + CBitFieldMaskBit50 = 0x4000000000000 + CBitFieldMaskBit51 = 0x8000000000000 + CBitFieldMaskBit52 = 0x10000000000000 + CBitFieldMaskBit53 = 0x20000000000000 + CBitFieldMaskBit54 = 0x40000000000000 + CBitFieldMaskBit55 = 0x80000000000000 + CBitFieldMaskBit56 = 0x100000000000000 + CBitFieldMaskBit57 = 0x200000000000000 + CBitFieldMaskBit58 = 0x400000000000000 + CBitFieldMaskBit59 = 0x800000000000000 + CBitFieldMaskBit60 = 0x1000000000000000 + CBitFieldMaskBit61 = 0x2000000000000000 + CBitFieldMaskBit62 = 0x4000000000000000 + CBitFieldMaskBit63 = 0x8000000000000000 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]uint8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new file mode 100755 index 0000000..c7935b7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -0,0 +1,1271 @@ +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build s390x,linux + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type Statfs_t struct { + Type uint32 + Bsize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen uint32 + Frsize uint32 + Flags uint32 + Spare [4]uint32 + _ [4]byte +} + +type StatxTimestamp struct { + Sec int64 + Nsec uint32 + _ int32 +} + +type Statx_t struct { + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + _ [14]uint64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +type FscryptPolicy struct { + Version uint8 + Contents_encryption_mode uint8 + Filenames_encryption_mode uint8 + Flags uint8 + Master_key_descriptor [8]uint8 +} + +type FscryptKey struct { + Mode uint32 + Raw [64]uint8 + Size uint32 +} + +type KeyctlDHParams struct { + Private int32 + Prime int32 + Base int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x6 + FADV_NOREUSE = 0x7 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrL2 struct { + Family uint16 + Psm uint16 + Bdaddr [6]uint8 + Cid uint16 + Bdaddr_type uint8 + _ [1]byte +} + +type RawSockaddrCAN struct { + Family uint16 + _ [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type PacketMreq struct { + Ifindex int32 + Type uint16 + Alen uint16 + Address [8]uint8 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrL2 = 0xe + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIovec = 0x10 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofPacketMreq = 0x10 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x31 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Psw PtracePsw + Gprs [16]uint64 + Acrs [16]uint32 + Orig_gpr2 uint64 + Fp_regs PtraceFpregs + Per_info PtracePer + Ieee_instruction_pointer uint64 +} + +type PtracePsw struct { + Mask uint64 + Addr uint64 +} + +type PtraceFpregs struct { + Fpc uint32 + _ [4]byte + Fprs [16]float64 +} + +type PtracePer struct { + _ [0]uint64 + _ [24]byte + _ [8]byte + Starting_addr uint64 + Ending_addr uint64 + Perc_atmid uint16 + _ [6]byte + Address uint64 + Access_id uint8 + _ [7]byte +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_EMPTY_PATH = 0x1000 + AT_FDCWD = -0x64 + AT_NO_AUTOMOUNT = 0x800 + AT_REMOVEDIR = 0x200 + + AT_STATX_SYNC_AS_STAT = 0x0 + AT_STATX_FORCE_SYNC = 0x2000 + AT_STATX_DONT_SYNC = 0x4000 + + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + Val [16]uint64 +} + +const RNDGETENTCNT = 0x80045200 + +const PERF_IOC_FLAG_GROUP = 0x1 + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type Taskstats struct { + Version uint16 + _ [2]byte + Ac_exitcode uint32 + Ac_flag uint8 + Ac_nice uint8 + _ [6]byte + Cpu_count uint64 + Cpu_delay_total uint64 + Blkio_count uint64 + Blkio_delay_total uint64 + Swapin_count uint64 + Swapin_delay_total uint64 + Cpu_run_real_total uint64 + Cpu_run_virtual_total uint64 + Ac_comm [32]int8 + Ac_sched uint8 + Ac_pad [3]uint8 + _ [4]byte + Ac_uid uint32 + Ac_gid uint32 + Ac_pid uint32 + Ac_ppid uint32 + Ac_btime uint32 + _ [4]byte + Ac_etime uint64 + Ac_utime uint64 + Ac_stime uint64 + Ac_minflt uint64 + Ac_majflt uint64 + Coremem uint64 + Virtmem uint64 + Hiwater_rss uint64 + Hiwater_vm uint64 + Read_char uint64 + Write_char uint64 + Read_syscalls uint64 + Write_syscalls uint64 + Read_bytes uint64 + Write_bytes uint64 + Cancelled_write_bytes uint64 + Nvcsw uint64 + Nivcsw uint64 + Ac_utimescaled uint64 + Ac_stimescaled uint64 + Cpu_scaled_run_real_total uint64 + Freepages_count uint64 + Freepages_delay_total uint64 +} + +const ( + TASKSTATS_CMD_UNSPEC = 0x0 + TASKSTATS_CMD_GET = 0x1 + TASKSTATS_CMD_NEW = 0x2 + TASKSTATS_TYPE_UNSPEC = 0x0 + TASKSTATS_TYPE_PID = 0x1 + TASKSTATS_TYPE_TGID = 0x2 + TASKSTATS_TYPE_STATS = 0x3 + TASKSTATS_TYPE_AGGR_PID = 0x4 + TASKSTATS_TYPE_AGGR_TGID = 0x5 + TASKSTATS_TYPE_NULL = 0x6 + TASKSTATS_CMD_ATTR_UNSPEC = 0x0 + TASKSTATS_CMD_ATTR_PID = 0x1 + TASKSTATS_CMD_ATTR_TGID = 0x2 + TASKSTATS_CMD_ATTR_REGISTER_CPUMASK = 0x3 + TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK = 0x4 +) + +type CGroupStats struct { + Sleeping uint64 + Running uint64 + Stopped uint64 + Uninterruptible uint64 + Io_wait uint64 +} + +const ( + CGROUPSTATS_CMD_UNSPEC = 0x3 + CGROUPSTATS_CMD_GET = 0x4 + CGROUPSTATS_CMD_NEW = 0x5 + CGROUPSTATS_TYPE_UNSPEC = 0x0 + CGROUPSTATS_TYPE_CGROUP_STATS = 0x1 + CGROUPSTATS_CMD_ATTR_UNSPEC = 0x0 + CGROUPSTATS_CMD_ATTR_FD = 0x1 +) + +type Genlmsghdr struct { + Cmd uint8 + Version uint8 + Reserved uint16 +} + +const ( + CTRL_CMD_UNSPEC = 0x0 + CTRL_CMD_NEWFAMILY = 0x1 + CTRL_CMD_DELFAMILY = 0x2 + CTRL_CMD_GETFAMILY = 0x3 + CTRL_CMD_NEWOPS = 0x4 + CTRL_CMD_DELOPS = 0x5 + CTRL_CMD_GETOPS = 0x6 + CTRL_CMD_NEWMCAST_GRP = 0x7 + CTRL_CMD_DELMCAST_GRP = 0x8 + CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_ATTR_UNSPEC = 0x0 + CTRL_ATTR_FAMILY_ID = 0x1 + CTRL_ATTR_FAMILY_NAME = 0x2 + CTRL_ATTR_VERSION = 0x3 + CTRL_ATTR_HDRSIZE = 0x4 + CTRL_ATTR_MAXATTR = 0x5 + CTRL_ATTR_OPS = 0x6 + CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_OP_UNSPEC = 0x0 + CTRL_ATTR_OP_ID = 0x1 + CTRL_ATTR_OP_FLAGS = 0x2 + CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 + CTRL_ATTR_MCAST_GRP_NAME = 0x1 + CTRL_ATTR_MCAST_GRP_ID = 0x2 +) + +type cpuMask uint64 + +const ( + _CPU_SETSIZE = 0x400 + _NCPUBITS = 0x40 +) + +const ( + BDADDR_BREDR = 0x0 + BDADDR_LE_PUBLIC = 0x1 + BDADDR_LE_RANDOM = 0x2 +) + +type PerfEventAttr struct { + Type uint32 + Size uint32 + Config uint64 + Sample uint64 + Sample_type uint64 + Read_format uint64 + Bits uint64 + Wakeup uint32 + Bp_type uint32 + Ext1 uint64 + Ext2 uint64 + Branch_sample_type uint64 + Sample_regs_user uint64 + Sample_stack_user uint32 + Clockid int32 + Sample_regs_intr uint64 + Aux_watermark uint32 + _ uint32 +} + +type PerfEventMmapPage struct { + Version uint32 + Compat_version uint32 + Lock uint32 + Index uint32 + Offset int64 + Time_enabled uint64 + Time_running uint64 + Capabilities uint64 + Pmc_width uint16 + Time_shift uint16 + Time_mult uint32 + Time_offset uint64 + Time_zero uint64 + Size uint32 + _ [948]uint8 + Data_head uint64 + Data_tail uint64 + Data_offset uint64 + Data_size uint64 + Aux_head uint64 + Aux_tail uint64 + Aux_offset uint64 + Aux_size uint64 +} + +const ( + PerfBitDisabled uint64 = CBitFieldMaskBit0 + PerfBitInherit = CBitFieldMaskBit1 + PerfBitPinned = CBitFieldMaskBit2 + PerfBitExclusive = CBitFieldMaskBit3 + PerfBitExcludeUser = CBitFieldMaskBit4 + PerfBitExcludeKernel = CBitFieldMaskBit5 + PerfBitExcludeHv = CBitFieldMaskBit6 + PerfBitExcludeIdle = CBitFieldMaskBit7 + PerfBitMmap = CBitFieldMaskBit8 + PerfBitComm = CBitFieldMaskBit9 + PerfBitFreq = CBitFieldMaskBit10 + PerfBitInheritStat = CBitFieldMaskBit11 + PerfBitEnableOnExec = CBitFieldMaskBit12 + PerfBitTask = CBitFieldMaskBit13 + PerfBitWatermark = CBitFieldMaskBit14 + PerfBitPreciseIPBit1 = CBitFieldMaskBit15 + PerfBitPreciseIPBit2 = CBitFieldMaskBit16 + PerfBitMmapData = CBitFieldMaskBit17 + PerfBitSampleIDAll = CBitFieldMaskBit18 + PerfBitExcludeHost = CBitFieldMaskBit19 + PerfBitExcludeGuest = CBitFieldMaskBit20 + PerfBitExcludeCallchainKernel = CBitFieldMaskBit21 + PerfBitExcludeCallchainUser = CBitFieldMaskBit22 + PerfBitMmap2 = CBitFieldMaskBit23 + PerfBitCommExec = CBitFieldMaskBit24 + PerfBitUseClockID = CBitFieldMaskBit25 + PerfBitContextSwitch = CBitFieldMaskBit26 +) + +const ( + PERF_TYPE_HARDWARE = 0x0 + PERF_TYPE_SOFTWARE = 0x1 + PERF_TYPE_TRACEPOINT = 0x2 + PERF_TYPE_HW_CACHE = 0x3 + PERF_TYPE_RAW = 0x4 + PERF_TYPE_BREAKPOINT = 0x5 + + PERF_COUNT_HW_CPU_CYCLES = 0x0 + PERF_COUNT_HW_INSTRUCTIONS = 0x1 + PERF_COUNT_HW_CACHE_REFERENCES = 0x2 + PERF_COUNT_HW_CACHE_MISSES = 0x3 + PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 0x4 + PERF_COUNT_HW_BRANCH_MISSES = 0x5 + PERF_COUNT_HW_BUS_CYCLES = 0x6 + PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7 + PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 0x8 + PERF_COUNT_HW_REF_CPU_CYCLES = 0x9 + + PERF_COUNT_HW_CACHE_L1D = 0x0 + PERF_COUNT_HW_CACHE_L1I = 0x1 + PERF_COUNT_HW_CACHE_LL = 0x2 + PERF_COUNT_HW_CACHE_DTLB = 0x3 + PERF_COUNT_HW_CACHE_ITLB = 0x4 + PERF_COUNT_HW_CACHE_BPU = 0x5 + PERF_COUNT_HW_CACHE_NODE = 0x6 + + PERF_COUNT_HW_CACHE_OP_READ = 0x0 + PERF_COUNT_HW_CACHE_OP_WRITE = 0x1 + PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2 + + PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0 + PERF_COUNT_HW_CACHE_RESULT_MISS = 0x1 + + PERF_COUNT_SW_CPU_CLOCK = 0x0 + PERF_COUNT_SW_TASK_CLOCK = 0x1 + PERF_COUNT_SW_PAGE_FAULTS = 0x2 + PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3 + PERF_COUNT_SW_CPU_MIGRATIONS = 0x4 + PERF_COUNT_SW_PAGE_FAULTS_MIN = 0x5 + PERF_COUNT_SW_PAGE_FAULTS_MAJ = 0x6 + PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7 + PERF_COUNT_SW_EMULATION_FAULTS = 0x8 + PERF_COUNT_SW_DUMMY = 0x9 + + PERF_SAMPLE_IP = 0x1 + PERF_SAMPLE_TID = 0x2 + PERF_SAMPLE_TIME = 0x4 + PERF_SAMPLE_ADDR = 0x8 + PERF_SAMPLE_READ = 0x10 + PERF_SAMPLE_CALLCHAIN = 0x20 + PERF_SAMPLE_ID = 0x40 + PERF_SAMPLE_CPU = 0x80 + PERF_SAMPLE_PERIOD = 0x100 + PERF_SAMPLE_STREAM_ID = 0x200 + PERF_SAMPLE_RAW = 0x400 + PERF_SAMPLE_BRANCH_STACK = 0x800 + + PERF_SAMPLE_BRANCH_USER = 0x1 + PERF_SAMPLE_BRANCH_KERNEL = 0x2 + PERF_SAMPLE_BRANCH_HV = 0x4 + PERF_SAMPLE_BRANCH_ANY = 0x8 + PERF_SAMPLE_BRANCH_ANY_CALL = 0x10 + PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20 + PERF_SAMPLE_BRANCH_IND_CALL = 0x40 + + PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1 + PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2 + PERF_FORMAT_ID = 0x4 + PERF_FORMAT_GROUP = 0x8 + + PERF_RECORD_MMAP = 0x1 + PERF_RECORD_LOST = 0x2 + PERF_RECORD_COMM = 0x3 + PERF_RECORD_EXIT = 0x4 + PERF_RECORD_THROTTLE = 0x5 + PERF_RECORD_UNTHROTTLE = 0x6 + PERF_RECORD_FORK = 0x7 + PERF_RECORD_READ = 0x8 + PERF_RECORD_SAMPLE = 0x9 + + PERF_CONTEXT_HV = -0x20 + PERF_CONTEXT_KERNEL = -0x80 + PERF_CONTEXT_USER = -0x200 + + PERF_CONTEXT_GUEST = -0x800 + PERF_CONTEXT_GUEST_KERNEL = -0x880 + PERF_CONTEXT_GUEST_USER = -0xa00 + + PERF_FLAG_FD_NO_GROUP = 0x1 + PERF_FLAG_FD_OUTPUT = 0x2 + PERF_FLAG_PID_CGROUP = 0x4 +) + +const ( + CBitFieldMaskBit0 = 0x8000000000000000 + CBitFieldMaskBit1 = 0x4000000000000000 + CBitFieldMaskBit2 = 0x2000000000000000 + CBitFieldMaskBit3 = 0x1000000000000000 + CBitFieldMaskBit4 = 0x800000000000000 + CBitFieldMaskBit5 = 0x400000000000000 + CBitFieldMaskBit6 = 0x200000000000000 + CBitFieldMaskBit7 = 0x100000000000000 + CBitFieldMaskBit8 = 0x80000000000000 + CBitFieldMaskBit9 = 0x40000000000000 + CBitFieldMaskBit10 = 0x20000000000000 + CBitFieldMaskBit11 = 0x10000000000000 + CBitFieldMaskBit12 = 0x8000000000000 + CBitFieldMaskBit13 = 0x4000000000000 + CBitFieldMaskBit14 = 0x2000000000000 + CBitFieldMaskBit15 = 0x1000000000000 + CBitFieldMaskBit16 = 0x800000000000 + CBitFieldMaskBit17 = 0x400000000000 + CBitFieldMaskBit18 = 0x200000000000 + CBitFieldMaskBit19 = 0x100000000000 + CBitFieldMaskBit20 = 0x80000000000 + CBitFieldMaskBit21 = 0x40000000000 + CBitFieldMaskBit22 = 0x20000000000 + CBitFieldMaskBit23 = 0x10000000000 + CBitFieldMaskBit24 = 0x8000000000 + CBitFieldMaskBit25 = 0x4000000000 + CBitFieldMaskBit26 = 0x2000000000 + CBitFieldMaskBit27 = 0x1000000000 + CBitFieldMaskBit28 = 0x800000000 + CBitFieldMaskBit29 = 0x400000000 + CBitFieldMaskBit30 = 0x200000000 + CBitFieldMaskBit31 = 0x100000000 + CBitFieldMaskBit32 = 0x80000000 + CBitFieldMaskBit33 = 0x40000000 + CBitFieldMaskBit34 = 0x20000000 + CBitFieldMaskBit35 = 0x10000000 + CBitFieldMaskBit36 = 0x8000000 + CBitFieldMaskBit37 = 0x4000000 + CBitFieldMaskBit38 = 0x2000000 + CBitFieldMaskBit39 = 0x1000000 + CBitFieldMaskBit40 = 0x800000 + CBitFieldMaskBit41 = 0x400000 + CBitFieldMaskBit42 = 0x200000 + CBitFieldMaskBit43 = 0x100000 + CBitFieldMaskBit44 = 0x80000 + CBitFieldMaskBit45 = 0x40000 + CBitFieldMaskBit46 = 0x20000 + CBitFieldMaskBit47 = 0x10000 + CBitFieldMaskBit48 = 0x8000 + CBitFieldMaskBit49 = 0x4000 + CBitFieldMaskBit50 = 0x2000 + CBitFieldMaskBit51 = 0x1000 + CBitFieldMaskBit52 = 0x800 + CBitFieldMaskBit53 = 0x400 + CBitFieldMaskBit54 = 0x200 + CBitFieldMaskBit55 = 0x100 + CBitFieldMaskBit56 = 0x80 + CBitFieldMaskBit57 = 0x40 + CBitFieldMaskBit58 = 0x20 + CBitFieldMaskBit59 = 0x10 + CBitFieldMaskBit60 = 0x8 + CBitFieldMaskBit61 = 0x4 + CBitFieldMaskBit62 = 0x2 + CBitFieldMaskBit63 = 0x1 +) + +type SockaddrStorage struct { + Family uint16 + _ [118]int8 + _ uint64 +} + +type TCPMD5Sig struct { + Addr SockaddrStorage + Flags uint8 + Prefixlen uint8 + Keylen uint16 + _ uint32 + Key [80]uint8 +} + +type HDDriveCmdHdr struct { + Command uint8 + Number uint8 + Feature uint8 + Count uint8 +} + +type HDGeometry struct { + Heads uint8 + Sectors uint8 + Cylinders uint16 + _ [4]byte + Start uint64 +} + +type HDDriveID struct { + Config uint16 + Cyls uint16 + Reserved2 uint16 + Heads uint16 + Track_bytes uint16 + Sector_bytes uint16 + Sectors uint16 + Vendor0 uint16 + Vendor1 uint16 + Vendor2 uint16 + Serial_no [20]uint8 + Buf_type uint16 + Buf_size uint16 + Ecc_bytes uint16 + Fw_rev [8]uint8 + Model [40]uint8 + Max_multsect uint8 + Vendor3 uint8 + Dword_io uint16 + Vendor4 uint8 + Capability uint8 + Reserved50 uint16 + Vendor5 uint8 + TPIO uint8 + Vendor6 uint8 + TDMA uint8 + Field_valid uint16 + Cur_cyls uint16 + Cur_heads uint16 + Cur_sectors uint16 + Cur_capacity0 uint16 + Cur_capacity1 uint16 + Multsect uint8 + Multsect_valid uint8 + Lba_capacity uint32 + Dma_1word uint16 + Dma_mword uint16 + Eide_pio_modes uint16 + Eide_dma_min uint16 + Eide_dma_time uint16 + Eide_pio uint16 + Eide_pio_iordy uint16 + Words69_70 [2]uint16 + Words71_74 [4]uint16 + Queue_depth uint16 + Words76_79 [4]uint16 + Major_rev_num uint16 + Minor_rev_num uint16 + Command_set_1 uint16 + Command_set_2 uint16 + Cfsse uint16 + Cfs_enable_1 uint16 + Cfs_enable_2 uint16 + Csf_default uint16 + Dma_ultra uint16 + Trseuc uint16 + TrsEuc uint16 + CurAPMvalues uint16 + Mprc uint16 + Hw_config uint16 + Acoustic uint16 + Msrqs uint16 + Sxfert uint16 + Sal uint16 + Spg uint32 + Lba_capacity_2 uint64 + Words104_125 [22]uint16 + Last_lun uint16 + Word127 uint16 + Dlf uint16 + Csfo uint16 + Words130_155 [26]uint16 + Word156 uint16 + Words157_159 [3]uint16 + Cfa_power uint16 + Words161_175 [15]uint16 + Words176_205 [30]uint16 + Words206_254 [49]uint16 + Integrity_word uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go new file mode 100755 index 0000000..8e7384b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -0,0 +1,690 @@ +// +build sparc64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go | go run mkpost.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +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 int32 + Pad_cgo_0 [4]byte +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [6]byte + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + X__glibc_reserved int16 + Pad_cgo_1 [2]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddrCAN struct { + Family uint16 + Pad_cgo_0 [2]byte + Ifindex int32 + Addr [8]byte +} + +type RawSockaddrALG struct { + Family uint16 + Type [14]uint8 + Feat uint32 + Mask uint32 + Name [64]uint8 +} + +type RawSockaddrVM struct { + Family uint16 + Reserved1 uint16 + Port uint32 + Cid uint32 + Zero [4]uint8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]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 IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofSockaddrCAN = 0x10 + SizeofSockaddrALG = 0x58 + SizeofSockaddrVM = 0x10 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_NUM_VF = 0x15 + IFLA_VFINFO_LIST = 0x16 + IFLA_STATS64 = 0x17 + IFLA_VF_PORTS = 0x18 + IFLA_PORT_SELF = 0x19 + IFLA_AF_SPEC = 0x1a + IFLA_GROUP = 0x1b + IFLA_NET_NS_FD = 0x1c + IFLA_EXT_MASK = 0x1d + IFLA_PROMISCUITY = 0x1e + IFLA_NUM_TX_QUEUES = 0x1f + IFLA_NUM_RX_QUEUES = 0x20 + IFLA_CARRIER = 0x21 + IFLA_PHYS_PORT_ID = 0x22 + IFLA_CARRIER_CHANGES = 0x23 + IFLA_PHYS_SWITCH_ID = 0x24 + IFLA_LINK_NETNSID = 0x25 + IFLA_PHYS_PORT_NAME = 0x26 + IFLA_PROTO_DOWN = 0x27 + IFLA_GSO_MAX_SEGS = 0x28 + IFLA_GSO_MAX_SIZE = 0x29 + IFLA_PAD = 0x2a + IFLA_XDP = 0x2b + IFLA_EVENT = 0x2c + IFLA_NEW_NETNSID = 0x2d + IFLA_IF_NETNSID = 0x2e + IFLA_MAX = 0x2e + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [16]uint64 + Tstate uint64 + Tpc uint64 + Tnpc uint64 + Y uint32 + Magic uint32 +} + +type ptracePsw struct { +} + +type ptraceFpregs struct { +} + +type ptracePer struct { +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]byte + Nodename [65]byte + Release [65]byte + Version [65]byte + Machine [65]byte + Domainname [65]byte +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x800 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Sigset_t struct { + X__val [16]uint64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go new file mode 100755 index 0000000..4b86fb2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -0,0 +1,448 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +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 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + 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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x84 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData + Pad_cgo_1 [4]byte +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +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 = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go new file mode 100755 index 0000000..9048a50 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -0,0 +1,455 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,netbsd + +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 int32 + Pad_cgo_0 [4]byte +} + +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 { + 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 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [12]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 + 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 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 = 0x14 + 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 uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +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 = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go new file mode 100755 index 0000000..00525e7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -0,0 +1,453 @@ +// cgo -godefs types_netbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +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 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +const ( + PathMax = 0x400 +) + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + 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 [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + 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 = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 + Pad_cgo_0 [4]byte +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +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 = 0x200 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go new file mode 100755 index 0000000..d5a2d75 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -0,0 +1,484 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build 386,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]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 uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xec + SizeofIfData = 0xd4 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval + Mclpool [7]Mclpool +} + +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 { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go new file mode 100755 index 0000000..d531410 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -0,0 +1,491 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,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 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Pad_cgo_0 [4]byte + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + Pad_cgo_0 [4]byte + 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 + Pad_cgo_1 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]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 + 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 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 = 0xf8 + SizeofIfData = 0xe0 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Pad_cgo_0 [4]byte + Lastchange Timeval + Mclpool [7]Mclpool + Pad_cgo_1 [4]byte +} + +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 { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +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 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go new file mode 100755 index 0000000..e35b13b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -0,0 +1,477 @@ +// cgo -godefs types_openbsd.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build arm,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]uint8 + F_mntonname [90]uint8 + F_mntfromname [90]uint8 + F_mntfromspec [90]uint8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]uint8 +} + +type Fsid struct { + Val [2]int32 +} + +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 uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x80 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]uint8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct{} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +const ( + AT_FDCWD = -0x64 + AT_SYMLINK_NOFOLLOW = 0x2 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) + +type Utsname struct { + Sysname [256]byte + Nodename [256]byte + Release [256]byte + Version [256]byte + Machine [256]byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go new file mode 100755 index 0000000..2248598 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -0,0 +1,459 @@ +// cgo -godefs types_solaris.go | go run mkpost.go +// Code generated by the command above; see README.md. DO NOT EDIT. + +// +build amd64,solaris + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x400 + MaxHostNameLen = 0x100 +) + +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 Timeval32 struct { + Sec int32 + Usec int32 +} + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime 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 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + _ [4]byte + Blocks int64 + Fstype [16]int8 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Sysid int32 + Pid int32 + Pad [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Name [1]int8 + _ [5]byte +} + +type _Fsblkcnt_t uint64 + +type Statvfs_t struct { + Bsize uint64 + Frsize uint64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Favail uint64 + Fsid uint64 + Basetype [16]int8 + Flag uint64 + Namemax uint64 + Fstr [32]int8 +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [236]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *int8 + 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 + _ [4]byte + Iov *Iovec + Iovlen int32 + _ [4]byte + Accrights *int8 + Accrightslen int32 + _ [4]byte +} + +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 { + X__icmp6_filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x20 + SizeofSockaddrAny = 0xfc + SizeofSockaddrUnix = 0x6e + SizeofSockaddrDatalink = 0xfc + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x24 + SizeofICMPv6Filter = 0x20 +) + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [257]byte + Nodename [257]byte + Release [257]byte + Version [257]byte + Machine [257]byte +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + +const ( + SizeofIfMsghdr = 0x54 + SizeofIfData = 0x44 + SizeofIfaMsghdr = 0x14 + SizeofRtMsghdr = 0x4c + SizeofRtMetrics = 0x28 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + _ [1]byte + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Lastchange Timeval32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + _ [2]byte + Metric int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + _ [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + _ [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + _ [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + _ [1]byte +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + _ [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLERR = 0x8 + POLLHUP = 0x10 + POLLIN = 0x1 + POLLNVAL = 0x20 + POLLOUT = 0x4 + POLLPRI = 0x2 + POLLRDBAND = 0x80 + POLLRDNORM = 0x40 + POLLWRBAND = 0x100 + POLLWRNORM = 0x4 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_386.s new file mode 100755 index 0000000..1c20dd2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_386.s @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +// System calls for 386, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-8 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-4 + JMP syscall·loadlibrary(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_amd64.s new file mode 100755 index 0000000..4d025ab --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/asm_windows_amd64.s @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc +// + +TEXT ·getprocaddress(SB), 7, $0-32 + JMP syscall·getprocaddress(SB) + +TEXT ·loadlibrary(SB), 7, $0-8 + JMP syscall·loadlibrary(SB) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/dll_windows.go new file mode 100755 index 0000000..e92c05b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/dll_windows.go @@ -0,0 +1,378 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import ( + "sync" + "sync/atomic" + "syscall" + "unsafe" +) + +// DLLError describes reasons for DLL load failures. +type DLLError struct { + Err error + ObjName string + Msg string +} + +func (e *DLLError) Error() string { return e.Msg } + +// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file. +func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno) +func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno) + +// A DLL implements access to a single DLL. +type DLL struct { + Name string + Handle Handle +} + +// LoadDLL loads DLL file into memory. +// +// Warning: using LoadDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use LazyDLL +// with System set to true, or use LoadLibraryEx directly. +func LoadDLL(name string) (dll *DLL, err error) { + namep, err := UTF16PtrFromString(name) + if err != nil { + return nil, err + } + h, e := loadlibrary(namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to load " + name + ": " + e.Error(), + } + } + d := &DLL{ + Name: name, + Handle: Handle(h), + } + return d, nil +} + +// MustLoadDLL is like LoadDLL but panics if load operation failes. +func MustLoadDLL(name string) *DLL { + d, e := LoadDLL(name) + if e != nil { + panic(e) + } + return d +} + +// FindProc searches DLL d for procedure named name and returns *Proc +// if found. It returns an error if search fails. +func (d *DLL) FindProc(name string) (proc *Proc, err error) { + namep, err := BytePtrFromString(name) + if err != nil { + return nil, err + } + a, e := getprocaddress(uintptr(d.Handle), namep) + if e != 0 { + return nil, &DLLError{ + Err: e, + ObjName: name, + Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(), + } + } + p := &Proc{ + Dll: d, + Name: name, + addr: a, + } + return p, nil +} + +// MustFindProc is like FindProc but panics if search fails. +func (d *DLL) MustFindProc(name string) *Proc { + p, e := d.FindProc(name) + if e != nil { + panic(e) + } + return p +} + +// Release unloads DLL d from memory. +func (d *DLL) Release() (err error) { + return FreeLibrary(d.Handle) +} + +// A Proc implements access to a procedure inside a DLL. +type Proc struct { + Dll *DLL + Name string + addr uintptr +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +func (p *Proc) Addr() uintptr { + return p.addr +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + switch len(a) { + case 0: + return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0) + case 1: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0) + case 2: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0) + case 3: + return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2]) + case 4: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0) + case 5: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0) + case 6: + return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5]) + case 7: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0) + case 8: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0) + case 9: + return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]) + case 10: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0) + case 11: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0) + case 12: + return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11]) + case 13: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0) + case 14: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0) + case 15: + return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14]) + default: + panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".") + } +} + +// A LazyDLL implements access to a single DLL. +// It will delay the load of the DLL until the first +// call to its Handle method or to one of its +// LazyProc's Addr method. +type LazyDLL struct { + Name string + + // System determines whether the DLL must be loaded from the + // Windows System directory, bypassing the normal DLL search + // path. + System bool + + mu sync.Mutex + dll *DLL // non nil once DLL is loaded +} + +// Load loads DLL file d.Name into memory. It returns an error if fails. +// Load will not try to load DLL, if it is already loaded into memory. +func (d *LazyDLL) Load() error { + // Non-racy version of: + // if d.dll != nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil { + return nil + } + d.mu.Lock() + defer d.mu.Unlock() + if d.dll != nil { + return nil + } + + // kernel32.dll is special, since it's where LoadLibraryEx comes from. + // The kernel already special-cases its name, so it's always + // loaded from system32. + var dll *DLL + var err error + if d.Name == "kernel32.dll" { + dll, err = LoadDLL(d.Name) + } else { + dll, err = loadLibraryEx(d.Name, d.System) + } + if err != nil { + return err + } + + // Non-racy version of: + // d.dll = dll + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll)) + return nil +} + +// mustLoad is like Load but panics if search fails. +func (d *LazyDLL) mustLoad() { + e := d.Load() + if e != nil { + panic(e) + } +} + +// Handle returns d's module handle. +func (d *LazyDLL) Handle() uintptr { + d.mustLoad() + return uintptr(d.dll.Handle) +} + +// NewProc returns a LazyProc for accessing the named procedure in the DLL d. +func (d *LazyDLL) NewProc(name string) *LazyProc { + return &LazyProc{l: d, Name: name} +} + +// NewLazyDLL creates new LazyDLL associated with DLL file. +func NewLazyDLL(name string) *LazyDLL { + return &LazyDLL{Name: name} +} + +// NewLazySystemDLL is like NewLazyDLL, but will only +// search Windows System directory for the DLL if name is +// a base name (like "advapi32.dll"). +func NewLazySystemDLL(name string) *LazyDLL { + return &LazyDLL{Name: name, System: true} +} + +// A LazyProc implements access to a procedure inside a LazyDLL. +// It delays the lookup until the Addr method is called. +type LazyProc struct { + Name string + + mu sync.Mutex + l *LazyDLL + proc *Proc +} + +// Find searches DLL for procedure named p.Name. It returns +// an error if search fails. Find will not search procedure, +// if it is already found and loaded into memory. +func (p *LazyProc) Find() error { + // Non-racy version of: + // if p.proc == nil { + if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil { + p.mu.Lock() + defer p.mu.Unlock() + if p.proc == nil { + e := p.l.Load() + if e != nil { + return e + } + proc, e := p.l.dll.FindProc(p.Name) + if e != nil { + return e + } + // Non-racy version of: + // p.proc = proc + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc)) + } + } + return nil +} + +// mustFind is like Find but panics if search fails. +func (p *LazyProc) mustFind() { + e := p.Find() + if e != nil { + panic(e) + } +} + +// Addr returns the address of the procedure represented by p. +// The return value can be passed to Syscall to run the procedure. +// It will panic if the procedure cannot be found. +func (p *LazyProc) Addr() uintptr { + p.mustFind() + return p.proc.Addr() +} + +//go:uintptrescapes + +// Call executes procedure p with arguments a. It will panic, if more than 15 arguments +// are supplied. It will also panic if the procedure cannot be found. +// +// The returned error is always non-nil, constructed from the result of GetLastError. +// Callers must inspect the primary return value to decide whether an error occurred +// (according to the semantics of the specific function being called) before consulting +// the error. The error will be guaranteed to contain windows.Errno. +func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) { + p.mustFind() + return p.proc.Call(a...) +} + +var canDoSearchSystem32Once struct { + sync.Once + v bool +} + +func initCanDoSearchSystem32() { + // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says: + // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows + // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on + // systems that have KB2533623 installed. To determine whether the + // flags are available, use GetProcAddress to get the address of the + // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories + // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_* + // flags can be used with LoadLibraryEx." + canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil) +} + +func canDoSearchSystem32() bool { + canDoSearchSystem32Once.Do(initCanDoSearchSystem32) + return canDoSearchSystem32Once.v +} + +func isBaseName(name string) bool { + for _, c := range name { + if c == ':' || c == '/' || c == '\\' { + return false + } + } + return true +} + +// loadLibraryEx wraps the Windows LoadLibraryEx function. +// +// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx +// +// If name is not an absolute path, LoadLibraryEx searches for the DLL +// in a variety of automatic locations unless constrained by flags. +// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx +func loadLibraryEx(name string, system bool) (*DLL, error) { + loadDLL := name + var flags uintptr + if system { + if canDoSearchSystem32() { + const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800 + flags = LOAD_LIBRARY_SEARCH_SYSTEM32 + } else if isBaseName(name) { + // WindowsXP or unpatched Windows machine + // trying to load "foo.dll" out of the system + // folder, but LoadLibraryEx doesn't support + // that yet on their system, so emulate it. + windir, _ := Getenv("WINDIR") // old var; apparently works on XP + if windir == "" { + return nil, errString("%WINDIR% not defined") + } + loadDLL = windir + "\\System32\\" + name + } + } + h, err := LoadLibraryEx(loadDLL, 0, flags) + if err != nil { + return nil, err + } + return &DLL{Name: name, Handle: h}, nil +} + +type errString string + +func (s errString) Error() string { return string(s) } diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/env_windows.go new file mode 100755 index 0000000..bdc71e2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/env_windows.go @@ -0,0 +1,29 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Windows environment variables. + +package windows + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} + +func Unsetenv(key string) error { + return syscall.Unsetenv(key) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/eventlog.go new file mode 100755 index 0000000..40af946 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/eventlog.go @@ -0,0 +1,20 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +const ( + EVENTLOG_SUCCESS = 0 + EVENTLOG_ERROR_TYPE = 1 + EVENTLOG_WARNING_TYPE = 2 + EVENTLOG_INFORMATION_TYPE = 4 + EVENTLOG_AUDIT_SUCCESS = 8 + EVENTLOG_AUDIT_FAILURE = 16 +) + +//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW +//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource +//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/exec_windows.go new file mode 100755 index 0000000..3606c3a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/exec_windows.go @@ -0,0 +1,97 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Fork, exec, wait, etc. + +package windows + +// EscapeArg rewrites command line argument s as prescribed +// in http://msdn.microsoft.com/en-us/library/ms880421. +// This function returns "" (2 double quotes) if s is empty. +// Alternatively, these transformations are done: +// - every back slash (\) is doubled, but only if immediately +// followed by double quote ("); +// - every double quote (") is escaped by back slash (\); +// - finally, s is wrapped with double quotes (arg -> "arg"), +// but only if there is space or tab inside s. +func EscapeArg(s string) string { + if len(s) == 0 { + return "\"\"" + } + n := len(s) + hasSpace := false + for i := 0; i < len(s); i++ { + switch s[i] { + case '"', '\\': + n++ + case ' ', '\t': + hasSpace = true + } + } + if hasSpace { + n += 2 + } + if n == len(s) { + return s + } + + qs := make([]byte, n) + j := 0 + if hasSpace { + qs[j] = '"' + j++ + } + slashes := 0 + for i := 0; i < len(s); i++ { + switch s[i] { + default: + slashes = 0 + qs[j] = s[i] + case '\\': + slashes++ + qs[j] = s[i] + case '"': + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '\\' + j++ + qs[j] = s[i] + } + j++ + } + if hasSpace { + for ; slashes > 0; slashes-- { + qs[j] = '\\' + j++ + } + qs[j] = '"' + j++ + } + return string(qs[:j]) +} + +func CloseOnExec(fd Handle) { + SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0) +} + +// FullPath retrieves the full path of the specified file. +func FullPath(name string) (path string, err error) { + p, err := UTF16PtrFromString(name) + if err != nil { + return "", err + } + n := uint32(100) + for { + buf := make([]uint16, n) + n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil) + if err != nil { + return "", err + } + if n <= uint32(len(buf)) { + return UTF16ToString(buf[:n]), nil + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/memory_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/memory_windows.go new file mode 100755 index 0000000..f80a420 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/memory_windows.go @@ -0,0 +1,26 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +const ( + MEM_COMMIT = 0x00001000 + MEM_RESERVE = 0x00002000 + MEM_DECOMMIT = 0x00004000 + MEM_RELEASE = 0x00008000 + MEM_RESET = 0x00080000 + MEM_TOP_DOWN = 0x00100000 + MEM_WRITE_WATCH = 0x00200000 + MEM_PHYSICAL = 0x00400000 + MEM_RESET_UNDO = 0x01000000 + MEM_LARGE_PAGES = 0x20000000 + + PAGE_NOACCESS = 0x01 + PAGE_READONLY = 0x02 + PAGE_READWRITE = 0x04 + PAGE_WRITECOPY = 0x08 + PAGE_EXECUTE_READ = 0x20 + PAGE_EXECUTE_READWRITE = 0x40 + PAGE_EXECUTE_WRITECOPY = 0x80 +) diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/mksyscall.go new file mode 100755 index 0000000..fb7db0e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/mksyscall.go @@ -0,0 +1,7 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race.go new file mode 100755 index 0000000..a74e3e2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race.go @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows,race + +package windows + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race0.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race0.go new file mode 100755 index 0000000..e44a3cb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/race0.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows,!race + +package windows + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/security_windows.go new file mode 100755 index 0000000..f1ec5dc --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/security_windows.go @@ -0,0 +1,476 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import ( + "syscall" + "unsafe" +) + +const ( + STANDARD_RIGHTS_REQUIRED = 0xf0000 + STANDARD_RIGHTS_READ = 0x20000 + STANDARD_RIGHTS_WRITE = 0x20000 + STANDARD_RIGHTS_EXECUTE = 0x20000 + STANDARD_RIGHTS_ALL = 0x1F0000 +) + +const ( + NameUnknown = 0 + NameFullyQualifiedDN = 1 + NameSamCompatible = 2 + NameDisplay = 3 + NameUniqueId = 6 + NameCanonical = 7 + NameUserPrincipal = 8 + NameCanonicalEx = 9 + NameServicePrincipal = 10 + NameDnsDomain = 12 +) + +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx +//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW +//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW + +// TranslateAccountName converts a directory service +// object name from one format to another. +func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) { + u, e := UTF16PtrFromString(username) + if e != nil { + return "", e + } + n := uint32(50) + for { + b := make([]uint16, n) + e = TranslateName(u, from, to, &b[0], &n) + if e == nil { + return UTF16ToString(b[:n]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +const ( + // do not reorder + NetSetupUnknownStatus = iota + NetSetupUnjoined + NetSetupWorkgroupName + NetSetupDomainName +) + +type UserInfo10 struct { + Name *uint16 + Comment *uint16 + UsrComment *uint16 + FullName *uint16 +} + +//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo +//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation +//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree + +const ( + // do not reorder + SidTypeUser = 1 + iota + SidTypeGroup + SidTypeDomain + SidTypeAlias + SidTypeWellKnownGroup + SidTypeDeletedAccount + SidTypeInvalid + SidTypeUnknown + SidTypeComputer + SidTypeLabel +) + +type SidIdentifierAuthority struct { + Value [6]byte +} + +var ( + SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}} + SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}} + SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}} + SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}} + SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}} + SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}} + SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}} +) + +const ( + SECURITY_NULL_RID = 0 + SECURITY_WORLD_RID = 0 + SECURITY_LOCAL_RID = 0 + SECURITY_CREATOR_OWNER_RID = 0 + SECURITY_CREATOR_GROUP_RID = 1 + SECURITY_DIALUP_RID = 1 + SECURITY_NETWORK_RID = 2 + SECURITY_BATCH_RID = 3 + SECURITY_INTERACTIVE_RID = 4 + SECURITY_LOGON_IDS_RID = 5 + SECURITY_SERVICE_RID = 6 + SECURITY_LOCAL_SYSTEM_RID = 18 + SECURITY_BUILTIN_DOMAIN_RID = 32 + SECURITY_PRINCIPAL_SELF_RID = 10 + SECURITY_CREATOR_OWNER_SERVER_RID = 0x2 + SECURITY_CREATOR_GROUP_SERVER_RID = 0x3 + SECURITY_LOGON_IDS_RID_COUNT = 0x3 + SECURITY_ANONYMOUS_LOGON_RID = 0x7 + SECURITY_PROXY_RID = 0x8 + SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9 + SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID + SECURITY_AUTHENTICATED_USER_RID = 0xb + SECURITY_RESTRICTED_CODE_RID = 0xc + SECURITY_NT_NON_UNIQUE_RID = 0x15 +) + +// Predefined domain-relative RIDs for local groups. +// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649(v=vs.85).aspx +const ( + DOMAIN_ALIAS_RID_ADMINS = 0x220 + DOMAIN_ALIAS_RID_USERS = 0x221 + DOMAIN_ALIAS_RID_GUESTS = 0x222 + DOMAIN_ALIAS_RID_POWER_USERS = 0x223 + DOMAIN_ALIAS_RID_ACCOUNT_OPS = 0x224 + DOMAIN_ALIAS_RID_SYSTEM_OPS = 0x225 + DOMAIN_ALIAS_RID_PRINT_OPS = 0x226 + DOMAIN_ALIAS_RID_BACKUP_OPS = 0x227 + DOMAIN_ALIAS_RID_REPLICATOR = 0x228 + DOMAIN_ALIAS_RID_RAS_SERVERS = 0x229 + DOMAIN_ALIAS_RID_PREW2KCOMPACCESS = 0x22a + DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS = 0x22b + DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS = 0x22c + DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d + DOMAIN_ALIAS_RID_MONITORING_USERS = 0X22e + DOMAIN_ALIAS_RID_LOGGING_USERS = 0x22f + DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS = 0x230 + DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS = 0x231 + DOMAIN_ALIAS_RID_DCOM_USERS = 0x232 + DOMAIN_ALIAS_RID_IUSERS = 0x238 + DOMAIN_ALIAS_RID_CRYPTO_OPERATORS = 0x239 + DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP = 0x23b + DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 0x23c + DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP = 0x23d + DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP = 0x23e +) + +//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW +//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW +//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW +//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW +//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid +//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid +//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid +//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid +//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid + +// The security identifier (SID) structure is a variable-length +// structure used to uniquely identify users or groups. +type SID struct{} + +// StringToSid converts a string-format security identifier +// sid into a valid, functional sid. +func StringToSid(s string) (*SID, error) { + var sid *SID + p, e := UTF16PtrFromString(s) + if e != nil { + return nil, e + } + e = ConvertStringSidToSid(p, &sid) + if e != nil { + return nil, e + } + defer LocalFree((Handle)(unsafe.Pointer(sid))) + return sid.Copy() +} + +// LookupSID retrieves a security identifier sid for the account +// and the name of the domain on which the account was found. +// System specify target computer to search. +func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) { + if len(account) == 0 { + return nil, "", 0, syscall.EINVAL + } + acc, e := UTF16PtrFromString(account) + if e != nil { + return nil, "", 0, e + } + var sys *uint16 + if len(system) > 0 { + sys, e = UTF16PtrFromString(system) + if e != nil { + return nil, "", 0, e + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]byte, n) + db := make([]uint16, dn) + sid = (*SID)(unsafe.Pointer(&b[0])) + e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType) + if e == nil { + return sid, UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, "", 0, e + } + if n <= uint32(len(b)) { + return nil, "", 0, e + } + } +} + +// String converts sid to a string format +// suitable for display, storage, or transmission. +func (sid *SID) String() (string, error) { + var s *uint16 + e := ConvertSidToStringSid(sid, &s) + if e != nil { + return "", e + } + defer LocalFree((Handle)(unsafe.Pointer(s))) + return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil +} + +// Len returns the length, in bytes, of a valid security identifier sid. +func (sid *SID) Len() int { + return int(GetLengthSid(sid)) +} + +// Copy creates a duplicate of security identifier sid. +func (sid *SID) Copy() (*SID, error) { + b := make([]byte, sid.Len()) + sid2 := (*SID)(unsafe.Pointer(&b[0])) + e := CopySid(uint32(len(b)), sid2, sid) + if e != nil { + return nil, e + } + return sid2, nil +} + +// LookupAccount retrieves the name of the account for this sid +// and the name of the first domain on which this sid is found. +// System specify target computer to search for. +func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) { + var sys *uint16 + if len(system) > 0 { + sys, err = UTF16PtrFromString(system) + if err != nil { + return "", "", 0, err + } + } + n := uint32(50) + dn := uint32(50) + for { + b := make([]uint16, n) + db := make([]uint16, dn) + e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType) + if e == nil { + return UTF16ToString(b), UTF16ToString(db), accType, nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", "", 0, e + } + if n <= uint32(len(b)) { + return "", "", 0, e + } + } +} + +const ( + // do not reorder + TOKEN_ASSIGN_PRIMARY = 1 << iota + TOKEN_DUPLICATE + TOKEN_IMPERSONATE + TOKEN_QUERY + TOKEN_QUERY_SOURCE + TOKEN_ADJUST_PRIVILEGES + TOKEN_ADJUST_GROUPS + TOKEN_ADJUST_DEFAULT + + TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + TOKEN_ASSIGN_PRIMARY | + TOKEN_DUPLICATE | + TOKEN_IMPERSONATE | + TOKEN_QUERY | + TOKEN_QUERY_SOURCE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY + TOKEN_WRITE = STANDARD_RIGHTS_WRITE | + TOKEN_ADJUST_PRIVILEGES | + TOKEN_ADJUST_GROUPS | + TOKEN_ADJUST_DEFAULT + TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE +) + +const ( + // do not reorder + TokenUser = 1 + iota + TokenGroups + TokenPrivileges + TokenOwner + TokenPrimaryGroup + TokenDefaultDacl + TokenSource + TokenType + TokenImpersonationLevel + TokenStatistics + TokenRestrictedSids + TokenSessionId + TokenGroupsAndPrivileges + TokenSessionReference + TokenSandBoxInert + TokenAuditPolicy + TokenOrigin + TokenElevationType + TokenLinkedToken + TokenElevation + TokenHasRestrictions + TokenAccessInformation + TokenVirtualizationAllowed + TokenVirtualizationEnabled + TokenIntegrityLevel + TokenUIAccess + TokenMandatoryPolicy + TokenLogonSid + MaxTokenInfoClass +) + +type SIDAndAttributes struct { + Sid *SID + Attributes uint32 +} + +type Tokenuser struct { + User SIDAndAttributes +} + +type Tokenprimarygroup struct { + PrimaryGroup *SID +} + +type Tokengroups struct { + GroupCount uint32 + Groups [1]SIDAndAttributes +} + +// 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 GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW + +// An access token contains the security information for a logon session. +// The system creates an access token when a user logs on, and every +// process executed on behalf of the user has a copy of the token. +// The token identifies the user, the user's groups, and the user's +// privileges. The system uses the token to control access to securable +// objects and to control the ability of the user to perform various +// system-related operations on the local computer. +type Token Handle + +// OpenCurrentProcessToken opens the access token +// associated with current process. +func OpenCurrentProcessToken() (Token, error) { + p, e := GetCurrentProcess() + if e != nil { + return 0, e + } + var t Token + e = OpenProcessToken(p, TOKEN_QUERY, &t) + if e != nil { + return 0, e + } + return t, nil +} + +// Close releases access to access token. +func (t Token) Close() error { + return CloseHandle(Handle(t)) +} + +// getInfo retrieves a specified type of information about an access token. +func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) { + n := uint32(initSize) + for { + b := make([]byte, n) + e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n) + if e == nil { + return unsafe.Pointer(&b[0]), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return nil, e + } + if n <= uint32(len(b)) { + return nil, e + } + } +} + +// GetTokenUser retrieves access token t user account information. +func (t Token) GetTokenUser() (*Tokenuser, error) { + i, e := t.getInfo(TokenUser, 50) + if e != nil { + return nil, e + } + return (*Tokenuser)(i), nil +} + +// GetTokenGroups retrieves group accounts associated with access token t. +func (t Token) GetTokenGroups() (*Tokengroups, error) { + i, e := t.getInfo(TokenGroups, 50) + if e != nil { + return nil, e + } + return (*Tokengroups)(i), nil +} + +// GetTokenPrimaryGroup retrieves access token t primary group information. +// A pointer to a SID structure representing a group that will become +// the primary group of any objects created by a process using this access token. +func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) { + i, e := t.getInfo(TokenPrimaryGroup, 50) + if e != nil { + return nil, e + } + return (*Tokenprimarygroup)(i), nil +} + +// GetUserProfileDirectory retrieves path to the +// root directory of the access token t user's profile. +func (t Token) GetUserProfileDirectory() (string, error) { + n := uint32(100) + for { + b := make([]uint16, n) + e := GetUserProfileDirectory(t, &b[0], &n) + if e == nil { + return UTF16ToString(b), nil + } + if e != ERROR_INSUFFICIENT_BUFFER { + return "", e + } + if n <= uint32(len(b)) { + return "", e + } + } +} + +// IsMember reports whether the access token t is a member of the provided SID. +func (t Token) IsMember(sid *SID) (bool, error) { + var b int32 + if e := checkTokenMembership(t, sid, &b); e != nil { + return false, e + } + return b != 0, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/service.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/service.go new file mode 100755 index 0000000..a500dd7 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/service.go @@ -0,0 +1,164 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +const ( + SC_MANAGER_CONNECT = 1 + SC_MANAGER_CREATE_SERVICE = 2 + SC_MANAGER_ENUMERATE_SERVICE = 4 + SC_MANAGER_LOCK = 8 + SC_MANAGER_QUERY_LOCK_STATUS = 16 + SC_MANAGER_MODIFY_BOOT_CONFIG = 32 + SC_MANAGER_ALL_ACCESS = 0xf003f +) + +//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW + +const ( + SERVICE_KERNEL_DRIVER = 1 + SERVICE_FILE_SYSTEM_DRIVER = 2 + SERVICE_ADAPTER = 4 + SERVICE_RECOGNIZER_DRIVER = 8 + SERVICE_WIN32_OWN_PROCESS = 16 + SERVICE_WIN32_SHARE_PROCESS = 32 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 256 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS + + SERVICE_BOOT_START = 0 + SERVICE_SYSTEM_START = 1 + SERVICE_AUTO_START = 2 + SERVICE_DEMAND_START = 3 + SERVICE_DISABLED = 4 + + SERVICE_ERROR_IGNORE = 0 + SERVICE_ERROR_NORMAL = 1 + SERVICE_ERROR_SEVERE = 2 + SERVICE_ERROR_CRITICAL = 3 + + SC_STATUS_PROCESS_INFO = 0 + + SERVICE_STOPPED = 1 + SERVICE_START_PENDING = 2 + SERVICE_STOP_PENDING = 3 + SERVICE_RUNNING = 4 + SERVICE_CONTINUE_PENDING = 5 + SERVICE_PAUSE_PENDING = 6 + SERVICE_PAUSED = 7 + SERVICE_NO_CHANGE = 0xffffffff + + SERVICE_ACCEPT_STOP = 1 + SERVICE_ACCEPT_PAUSE_CONTINUE = 2 + SERVICE_ACCEPT_SHUTDOWN = 4 + SERVICE_ACCEPT_PARAMCHANGE = 8 + SERVICE_ACCEPT_NETBINDCHANGE = 16 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32 + SERVICE_ACCEPT_POWEREVENT = 64 + SERVICE_ACCEPT_SESSIONCHANGE = 128 + + SERVICE_CONTROL_STOP = 1 + SERVICE_CONTROL_PAUSE = 2 + SERVICE_CONTROL_CONTINUE = 3 + SERVICE_CONTROL_INTERROGATE = 4 + SERVICE_CONTROL_SHUTDOWN = 5 + SERVICE_CONTROL_PARAMCHANGE = 6 + SERVICE_CONTROL_NETBINDADD = 7 + SERVICE_CONTROL_NETBINDREMOVE = 8 + SERVICE_CONTROL_NETBINDENABLE = 9 + SERVICE_CONTROL_NETBINDDISABLE = 10 + SERVICE_CONTROL_DEVICEEVENT = 11 + SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12 + SERVICE_CONTROL_POWEREVENT = 13 + SERVICE_CONTROL_SESSIONCHANGE = 14 + + SERVICE_ACTIVE = 1 + SERVICE_INACTIVE = 2 + SERVICE_STATE_ALL = 3 + + SERVICE_QUERY_CONFIG = 1 + SERVICE_CHANGE_CONFIG = 2 + SERVICE_QUERY_STATUS = 4 + SERVICE_ENUMERATE_DEPENDENTS = 8 + SERVICE_START = 16 + SERVICE_STOP = 32 + SERVICE_PAUSE_CONTINUE = 64 + SERVICE_INTERROGATE = 128 + SERVICE_USER_DEFINED_CONTROL = 256 + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL + SERVICE_RUNS_IN_SYSTEM_PROCESS = 1 + SERVICE_CONFIG_DESCRIPTION = 1 + SERVICE_CONFIG_FAILURE_ACTIONS = 2 + + NO_ERROR = 0 + + SC_ENUM_PROCESS_INFO = 0 +) + +type SERVICE_STATUS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 +} + +type SERVICE_TABLE_ENTRY struct { + ServiceName *uint16 + ServiceProc uintptr +} + +type QUERY_SERVICE_CONFIG struct { + ServiceType uint32 + StartType uint32 + ErrorControl uint32 + BinaryPathName *uint16 + LoadOrderGroup *uint16 + TagId uint32 + Dependencies *uint16 + ServiceStartName *uint16 + DisplayName *uint16 +} + +type SERVICE_DESCRIPTION struct { + Description *uint16 +} + +type SERVICE_STATUS_PROCESS struct { + ServiceType uint32 + CurrentState uint32 + ControlsAccepted uint32 + Win32ExitCode uint32 + ServiceSpecificExitCode uint32 + CheckPoint uint32 + WaitHint uint32 + ProcessId uint32 + ServiceFlags uint32 +} + +type ENUM_SERVICE_STATUS_PROCESS struct { + ServiceName *uint16 + DisplayName *uint16 + ServiceStatusProcess SERVICE_STATUS_PROCESS +} + +//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle +//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW +//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW +//sys DeleteService(service Handle) (err error) = advapi32.DeleteService +//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW +//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus +//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService +//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW +//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus +//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW +//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW +//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W +//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W +//sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/str.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/str.go new file mode 100755 index 0000000..917cc2a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/str.go @@ -0,0 +1,22 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package windows + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + itoa(-val) + } + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall.go new file mode 100755 index 0000000..af828a9 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall.go @@ -0,0 +1,74 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package windows contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display the OS-specific documentation for the current +// system. If you want godoc to display syscall documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package windows // import "golang.org/x/sys/windows" + +import ( + "syscall" +) + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mksyscall.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall_windows.go new file mode 100755 index 0000000..1e9f4bb --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -0,0 +1,1153 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Windows system calls. + +package windows + +import ( + errorspkg "errors" + "sync" + "syscall" + "unicode/utf16" + "unsafe" +) + +type Handle uintptr + +const ( + InvalidHandle = ^Handle(0) + + // Flags for DefineDosDevice. + DDD_EXACT_MATCH_ON_REMOVE = 0x00000004 + DDD_NO_BROADCAST_SYSTEM = 0x00000008 + DDD_RAW_TARGET_PATH = 0x00000001 + DDD_REMOVE_DEFINITION = 0x00000002 + + // Return values for GetDriveType. + DRIVE_UNKNOWN = 0 + DRIVE_NO_ROOT_DIR = 1 + DRIVE_REMOVABLE = 2 + DRIVE_FIXED = 3 + DRIVE_REMOTE = 4 + DRIVE_CDROM = 5 + DRIVE_RAMDISK = 6 + + // File system flags from GetVolumeInformation and GetVolumeInformationByHandle. + FILE_CASE_SENSITIVE_SEARCH = 0x00000001 + FILE_CASE_PRESERVED_NAMES = 0x00000002 + FILE_FILE_COMPRESSION = 0x00000010 + FILE_DAX_VOLUME = 0x20000000 + FILE_NAMED_STREAMS = 0x00040000 + FILE_PERSISTENT_ACLS = 0x00000008 + FILE_READ_ONLY_VOLUME = 0x00080000 + FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000 + FILE_SUPPORTS_ENCRYPTION = 0x00020000 + FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000 + FILE_SUPPORTS_HARD_LINKS = 0x00400000 + FILE_SUPPORTS_OBJECT_IDS = 0x00010000 + FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000 + FILE_SUPPORTS_REPARSE_POINTS = 0x00000080 + FILE_SUPPORTS_SPARSE_FILES = 0x00000040 + FILE_SUPPORTS_TRANSACTIONS = 0x00200000 + FILE_SUPPORTS_USN_JOURNAL = 0x02000000 + FILE_UNICODE_ON_DISK = 0x00000004 + FILE_VOLUME_IS_COMPRESSED = 0x00008000 + FILE_VOLUME_QUOTAS = 0x00000020 +) + +// StringToUTF16 is deprecated. Use UTF16FromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16(s string) []uint16 { + a, err := UTF16FromString(s) + if err != nil { + panic("windows: string with NUL passed to StringToUTF16") + } + return a +} + +// UTF16FromString returns the UTF-16 encoding of the UTF-8 string +// s, with a terminating NUL added. If s contains a NUL byte at any +// location, it returns (nil, syscall.EINVAL). +func UTF16FromString(s string) ([]uint16, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, syscall.EINVAL + } + } + return utf16.Encode([]rune(s + "\x00")), nil +} + +// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s, +// with a terminating NUL removed. +func UTF16ToString(s []uint16) string { + for i, v := range s { + if v == 0 { + s = s[0:i] + break + } + } + return string(utf16.Decode(s)) +} + +// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead. +// If s contains a NUL byte this function panics instead of +// returning an error. +func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] } + +// UTF16PtrFromString returns pointer to the UTF-16 encoding of +// the UTF-8 string s, with a terminating NUL added. If s +// contains a NUL byte at any location, it returns (nil, syscall.EINVAL). +func UTF16PtrFromString(s string) (*uint16, error) { + a, err := UTF16FromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +func Getpagesize() int { return 4096 } + +// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallback(fn interface{}) uintptr { + return syscall.NewCallback(fn) +} + +// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. +// This is useful when interoperating with Windows code requiring callbacks. +func NewCallbackCDecl(fn interface{}) uintptr { + return syscall.NewCallbackCDecl(fn) +} + +// windows api calls + +//sys GetLastError() (lasterr error) +//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW +//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW +//sys FreeLibrary(handle Handle) (err error) +//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error) +//sys GetVersion() (ver uint32, err error) +//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW +//sys ExitProcess(exitcode uint32) +//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW +//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) +//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff] +//sys CloseHandle(handle Handle) (err error) +//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle] +//sys SetStdHandle(stdhandle uint32, handle Handle) (err error) +//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW +//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW +//sys FindClose(handle Handle) (err error) +//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) +//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW +//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW +//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW +//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW +//sys DeleteFile(path *uint16) (err error) = DeleteFileW +//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW +//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW +//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW +//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW +//sys SetEndOfFile(handle Handle) (err error) +//sys GetSystemTimeAsFileTime(time *Filetime) +//sys GetSystemTimePreciseAsFileTime(time *Filetime) +//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff] +//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) +//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) +//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) +//sys CancelIo(s Handle) (err error) +//sys CancelIoEx(s Handle, o *Overlapped) (err error) +//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW +//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) +//sys TerminateProcess(handle Handle, exitcode uint32) (err error) +//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) +//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW +//sys GetCurrentProcess() (pseudoHandle Handle, err error) +//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) +//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) +//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] +//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW +//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) +//sys GetFileType(filehandle Handle) (n uint32, err error) +//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW +//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext +//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom +//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW +//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW +//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW +//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) +//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW +//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW +//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW +//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW +//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW +//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0] +//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) +//sys FlushFileBuffers(handle Handle) (err error) +//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW +//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW +//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW +//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW +//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) +//sys UnmapViewOfFile(addr uintptr) (err error) +//sys FlushViewOfFile(addr uintptr, length uintptr) (err error) +//sys VirtualLock(addr uintptr, length uintptr) (err error) +//sys VirtualUnlock(addr uintptr, length uintptr) (err error) +//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc +//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree +//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect +//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile +//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW +//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW +//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore +//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore +//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore +//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore +//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain +//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain +//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext +//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext +//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy +//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW +//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey +//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW +//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW +//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW +//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId +//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode +//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode +//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo +//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW +//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW +//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot +//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW +//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW +//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) +// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL. +//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW +//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW +//sys GetCurrentThreadId() (id uint32) +//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW +//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW +//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW +//sys SetEvent(event Handle) (err error) = kernel32.SetEvent +//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent +//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent + +// Volume Management Functions +//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW +//sys DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) = DeleteVolumeMountPointW +//sys FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeW +//sys FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeMountPointW +//sys FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) = FindNextVolumeW +//sys FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW +//sys FindVolumeClose(findVolume Handle) (err error) +//sys FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) +//sys GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW +//sys GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0] +//sys GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW +//sys GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationW +//sys GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationByHandleW +//sys GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) = GetVolumeNameForVolumeMountPointW +//sys GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) = GetVolumePathNameW +//sys GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) = GetVolumePathNamesForVolumeNameW +//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 + +// syscall interface implementation for other packages + +// GetProcAddressByOrdinal retrieves the address of the exported +// function from module by ordinal. +func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Exit(code int) { ExitProcess(uint32(code)) } + +func makeInheritSa() *SecurityAttributes { + var sa SecurityAttributes + sa.Length = uint32(unsafe.Sizeof(sa)) + sa.InheritHandle = 1 + return &sa +} + +func Open(path string, mode int, perm uint32) (fd Handle, err error) { + if len(path) == 0 { + return InvalidHandle, ERROR_FILE_NOT_FOUND + } + pathp, err := UTF16PtrFromString(path) + if err != nil { + return InvalidHandle, err + } + var access uint32 + switch mode & (O_RDONLY | O_WRONLY | O_RDWR) { + case O_RDONLY: + access = GENERIC_READ + case O_WRONLY: + access = GENERIC_WRITE + case O_RDWR: + access = GENERIC_READ | GENERIC_WRITE + } + if mode&O_CREAT != 0 { + access |= GENERIC_WRITE + } + if mode&O_APPEND != 0 { + access &^= GENERIC_WRITE + access |= FILE_APPEND_DATA + } + sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE) + var sa *SecurityAttributes + if mode&O_CLOEXEC == 0 { + sa = makeInheritSa() + } + var createmode uint32 + switch { + case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL): + createmode = CREATE_NEW + case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC): + createmode = CREATE_ALWAYS + case mode&O_CREAT == O_CREAT: + createmode = OPEN_ALWAYS + case mode&O_TRUNC == O_TRUNC: + createmode = TRUNCATE_EXISTING + default: + createmode = OPEN_EXISTING + } + h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0) + return h, e +} + +func Read(fd Handle, p []byte) (n int, err error) { + var done uint32 + e := ReadFile(fd, p, &done, nil) + if e != nil { + if e == ERROR_BROKEN_PIPE { + // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin + return 0, nil + } + return 0, e + } + if raceenabled { + if done > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), int(done)) + } + raceAcquire(unsafe.Pointer(&ioSync)) + } + return int(done), nil +} + +func Write(fd Handle, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + var done uint32 + e := WriteFile(fd, p, &done, nil) + if e != nil { + return 0, e + } + if raceenabled && done > 0 { + raceReadRange(unsafe.Pointer(&p[0]), int(done)) + } + return int(done), nil +} + +var ioSync int64 + +func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) { + var w uint32 + switch whence { + case 0: + w = FILE_BEGIN + case 1: + w = FILE_CURRENT + case 2: + w = FILE_END + } + hi := int32(offset >> 32) + lo := int32(offset) + // use GetFileType to check pipe, pipe can't do seek + ft, _ := GetFileType(fd) + if ft == FILE_TYPE_PIPE { + return 0, syscall.EPIPE + } + rlo, e := SetFilePointer(fd, lo, &hi, w) + if e != nil { + return 0, e + } + return int64(hi)<<32 + int64(rlo), nil +} + +func Close(fd Handle) (err error) { + return CloseHandle(fd) +} + +var ( + Stdin = getStdHandle(STD_INPUT_HANDLE) + Stdout = getStdHandle(STD_OUTPUT_HANDLE) + Stderr = getStdHandle(STD_ERROR_HANDLE) +) + +func getStdHandle(stdhandle uint32) (fd Handle) { + r, _ := GetStdHandle(stdhandle) + CloseOnExec(r) + return r +} + +const ImplementsGetwd = true + +func Getwd() (wd string, err error) { + b := make([]uint16, 300) + n, e := GetCurrentDirectory(uint32(len(b)), &b[0]) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Chdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return SetCurrentDirectory(pathp) +} + +func Mkdir(path string, mode uint32) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return CreateDirectory(pathp, nil) +} + +func Rmdir(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return RemoveDirectory(pathp) +} + +func Unlink(path string) (err error) { + pathp, err := UTF16PtrFromString(path) + if err != nil { + return err + } + return DeleteFile(pathp) +} + +func Rename(oldpath, newpath string) (err error) { + from, err := UTF16PtrFromString(oldpath) + if err != nil { + return err + } + to, err := UTF16PtrFromString(newpath) + if err != nil { + return err + } + return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING) +} + +func ComputerName() (name string, err error) { + var n uint32 = MAX_COMPUTERNAME_LENGTH + 1 + b := make([]uint16, n) + e := GetComputerName(&b[0], &n) + if e != nil { + return "", e + } + return string(utf16.Decode(b[0:n])), nil +} + +func Ftruncate(fd Handle, length int64) (err error) { + curoffset, e := Seek(fd, 0, 1) + if e != nil { + return e + } + defer Seek(fd, curoffset, 0) + _, e = Seek(fd, length, 0) + if e != nil { + return e + } + e = SetEndOfFile(fd) + if e != nil { + return e + } + return nil +} + +func Gettimeofday(tv *Timeval) (err error) { + var ft Filetime + GetSystemTimeAsFileTime(&ft) + *tv = NsecToTimeval(ft.Nanoseconds()) + return nil +} + +func Pipe(p []Handle) (err error) { + if len(p) != 2 { + return syscall.EINVAL + } + var r, w Handle + e := CreatePipe(&r, &w, makeInheritSa(), 0) + if e != nil { + return e + } + p[0] = r + p[1] = w + return nil +} + +func Utimes(path string, tv []Timeval) (err error) { + if len(tv) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(tv[0].Nanoseconds()) + w := NsecToFiletime(tv[1].Nanoseconds()) + return SetFileTime(h, nil, &a, &w) +} + +func UtimesNano(path string, ts []Timespec) (err error) { + if len(ts) != 2 { + return syscall.EINVAL + } + pathp, e := UTF16PtrFromString(path) + if e != nil { + return e + } + h, e := CreateFile(pathp, + FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil, + OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0) + if e != nil { + return e + } + defer Close(h) + a := NsecToFiletime(TimespecToNsec(ts[0])) + w := NsecToFiletime(TimespecToNsec(ts[1])) + return SetFileTime(h, nil, &a, &w) +} + +func Fsync(fd Handle) (err error) { + return FlushFileBuffers(fd) +} + +func Chmod(path string, mode uint32) (err error) { + if mode == 0 { + return syscall.EINVAL + } + p, e := UTF16PtrFromString(path) + if e != nil { + return e + } + attrs, e := GetFileAttributes(p) + if e != nil { + return e + } + if mode&S_IWRITE != 0 { + attrs &^= FILE_ATTRIBUTE_READONLY + } else { + attrs |= FILE_ATTRIBUTE_READONLY + } + return SetFileAttributes(p, attrs) +} + +func LoadGetSystemTimePreciseAsFileTime() error { + return procGetSystemTimePreciseAsFileTime.Find() +} + +func LoadCancelIoEx() error { + return procCancelIoEx.Find() +} + +func LoadSetFileCompletionNotificationModes() error { + return procSetFileCompletionNotificationModes.Find() +} + +// net api calls + +const socket_error = uintptr(^uint32(0)) + +//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup +//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup +//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl +//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket +//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt +//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt +//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind +//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect +//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname +//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername +//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen +//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown +//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket +//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx +//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs +//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv +//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend +//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom +//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo +//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname +//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname +//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs +//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname +//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W +//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree +//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W +//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW +//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW +//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry +//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo +//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes +//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW +//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses +//sys GetACP() (acp uint32) = kernel32.GetACP +//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, syscall.EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil +} + +type SockaddrUnix struct { + Name string +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) { + // TODO(brainman): implement SockaddrUnix.sockaddr() + return nil, 0, syscall.EWINDOWS +} + +func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + return nil, syscall.EWINDOWS + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, syscall.EAFNOSUPPORT +} + +func Socket(domain, typ, proto int) (fd Handle, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return InvalidHandle, syscall.EAFNOSUPPORT + } + return socket(int32(domain), int32(typ), int32(proto)) +} + +func SetsockoptInt(fd Handle, level, opt int, value int) (err error) { + v := int32(value) + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v))) +} + +func Bind(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd Handle, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getsockname(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getsockname(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Getpeername(fd Handle) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + l := int32(unsafe.Sizeof(rsa)) + if err = getpeername(fd, &rsa, &l); err != nil { + return + } + return rsa.Sockaddr() +} + +func Listen(s Handle, n int) (err error) { + return listen(s, int32(n)) +} + +func Shutdown(fd Handle, how int) (err error) { + return shutdown(fd, int32(how)) +} + +func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) { + rsa, l, err := to.sockaddr() + if err != nil { + return err + } + return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine) +} + +func LoadGetAddrInfo() error { + return procGetAddrInfoW.Find() +} + +var connectExFunc struct { + once sync.Once + addr uintptr + err error +} + +func LoadConnectEx() error { + connectExFunc.once.Do(func() { + var s Handle + s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) + if connectExFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + connectExFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)), + uint32(unsafe.Sizeof(WSAID_CONNECTEX)), + (*byte)(unsafe.Pointer(&connectExFunc.addr)), + uint32(unsafe.Sizeof(connectExFunc.addr)), + &n, nil, 0) + }) + return connectExFunc.err +} + +func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error { + err := LoadConnectEx() + if err != nil { + return errorspkg.New("failed to find ConnectEx: " + err.Error()) + } + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped) +} + +var sendRecvMsgFunc struct { + once sync.Once + sendAddr uintptr + recvAddr uintptr + err error +} + +func loadWSASendRecvMsg() error { + sendRecvMsgFunc.once.Do(func() { + var s Handle + s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) + if sendRecvMsgFunc.err != nil { + return + } + defer CloseHandle(s) + var n uint32 + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)), + uint32(unsafe.Sizeof(WSAID_WSARECVMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)), + &n, nil, 0) + if sendRecvMsgFunc.err != nil { + return + } + sendRecvMsgFunc.err = WSAIoctl(s, + SIO_GET_EXTENSION_FUNCTION_POINTER, + (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)), + uint32(unsafe.Sizeof(WSAID_WSASENDMSG)), + (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)), + uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)), + &n, nil, 0) + }) + return sendRecvMsgFunc.err +} + +func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error { + err := loadWSASendRecvMsg() + if err != nil { + return err + } + r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return err +} + +// Invented structures to support what package os expects. +type Rusage struct { + CreationTime Filetime + ExitTime Filetime + KernelTime Filetime + UserTime Filetime +} + +type WaitStatus struct { + ExitCode uint32 +} + +func (w WaitStatus) Exited() bool { return true } + +func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) } + +func (w WaitStatus) Signal() Signal { return -1 } + +func (w WaitStatus) CoreDump() bool { return false } + +func (w WaitStatus) Stopped() bool { return false } + +func (w WaitStatus) Continued() bool { return false } + +func (w WaitStatus) StopSignal() Signal { return -1 } + +func (w WaitStatus) Signaled() bool { return false } + +func (w WaitStatus) TrapCause() int { return -1 } + +// Timespec is an invented structure on Windows, but here for +// consistency with the corresponding package for other operating systems. +type Timespec struct { + Sec int64 + Nsec int64 +} + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +// TODO(brainman): fix all needed for net + +func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS } +func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) { + return 0, nil, syscall.EWINDOWS +} +func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS } +func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS } + +// The Linger struct is wrong but we only noticed after Go 1. +// sysLinger is the real system call structure. + +// BUG(brainman): The definition of Linger is not appropriate for direct use +// with Setsockopt and Getsockopt. +// Use SetsockoptLinger instead. + +type Linger struct { + Onoff int32 + Linger int32 +} + +type sysLinger struct { + Onoff uint16 + Linger uint16 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS } + +func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { + sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)} + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys))) +} + +func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) +} +func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { + return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) +} +func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { + return syscall.EWINDOWS +} + +func Getpid() (pid int) { return int(getCurrentProcessId()) } + +func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) { + // NOTE(rsc): The Win32finddata struct is wrong for the system call: + // the two paths are each one uint16 short. Use the correct struct, + // a win32finddata1, and then copy the results out. + // There is no loss of expressivity here, because the final + // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that. + // For Go 1.1, we might avoid the allocation of win32finddata1 here + // by adding a final Bug [2]uint16 field to the struct and then + // adjusting the fields in the result directly. + var data1 win32finddata1 + handle, err = findFirstFile1(name, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func FindNextFile(handle Handle, data *Win32finddata) (err error) { + var data1 win32finddata1 + err = findNextFile1(handle, &data1) + if err == nil { + copyFindData(data, &data1) + } + return +} + +func getProcessEntry(pid int) (*ProcessEntry32, error) { + snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) + if err != nil { + return nil, err + } + defer CloseHandle(snapshot) + var procEntry ProcessEntry32 + procEntry.Size = uint32(unsafe.Sizeof(procEntry)) + if err = Process32First(snapshot, &procEntry); err != nil { + return nil, err + } + for { + if procEntry.ProcessID == uint32(pid) { + return &procEntry, nil + } + err = Process32Next(snapshot, &procEntry) + if err != nil { + return nil, err + } + } +} + +func Getppid() (ppid int) { + pe, err := getProcessEntry(Getpid()) + if err != nil { + return -1 + } + return int(pe.ParentProcessID) +} + +// TODO(brainman): fix all needed for os +func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS } +func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS } +func Symlink(path, link string) (err error) { return syscall.EWINDOWS } + +func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS } +func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS } +func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS } + +func Getuid() (uid int) { return -1 } +func Geteuid() (euid int) { return -1 } +func Getgid() (gid int) { return -1 } +func Getegid() (egid int) { return -1 } +func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS } + +type Signal int + +func (s Signal) Signal() {} + +func (s Signal) String() string { + if 0 <= s && int(s) < len(signals) { + str := signals[s] + if str != "" { + return str + } + } + return "signal " + itoa(int(s)) +} + +func LoadCreateSymbolicLink() error { + return procCreateSymbolicLinkW.Find() +} + +// Readlink returns the destination of the named symbolic link. +func Readlink(path string, buf []byte) (n int, err error) { + fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING, + FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0) + if err != nil { + return -1, err + } + defer CloseHandle(fd) + + rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE) + var bytesReturned uint32 + err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil) + if err != nil { + return -1, err + } + + rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0])) + var s string + switch rdb.ReparseTag { + case IO_REPARSE_TAG_SYMLINK: + data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + case IO_REPARSE_TAG_MOUNT_POINT: + data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer)) + p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0])) + s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2]) + default: + // the path is not a symlink or junction but another type of reparse + // point + return -1, syscall.ENOENT + } + n = copy(buf, []byte(s)) + + return n, nil +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows.go new file mode 100755 index 0000000..52c2037 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows.go @@ -0,0 +1,1333 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import "syscall" + +const ( + // Windows errors. + ERROR_FILE_NOT_FOUND syscall.Errno = 2 + ERROR_PATH_NOT_FOUND syscall.Errno = 3 + ERROR_ACCESS_DENIED syscall.Errno = 5 + ERROR_NO_MORE_FILES syscall.Errno = 18 + ERROR_HANDLE_EOF syscall.Errno = 38 + ERROR_NETNAME_DELETED syscall.Errno = 64 + ERROR_FILE_EXISTS syscall.Errno = 80 + ERROR_BROKEN_PIPE syscall.Errno = 109 + ERROR_BUFFER_OVERFLOW syscall.Errno = 111 + ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122 + ERROR_MOD_NOT_FOUND syscall.Errno = 126 + ERROR_PROC_NOT_FOUND syscall.Errno = 127 + ERROR_ALREADY_EXISTS syscall.Errno = 183 + ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203 + ERROR_MORE_DATA syscall.Errno = 234 + ERROR_OPERATION_ABORTED syscall.Errno = 995 + ERROR_IO_PENDING syscall.Errno = 997 + ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066 + ERROR_NOT_FOUND syscall.Errno = 1168 + ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314 + WSAEACCES syscall.Errno = 10013 + WSAEMSGSIZE syscall.Errno = 10040 + WSAECONNRESET syscall.Errno = 10054 +) + +const ( + // Invented values to support what package os expects. + O_RDONLY = 0x00000 + O_WRONLY = 0x00001 + O_RDWR = 0x00002 + O_CREAT = 0x00040 + O_EXCL = 0x00080 + O_NOCTTY = 0x00100 + O_TRUNC = 0x00200 + O_NONBLOCK = 0x00800 + O_APPEND = 0x00400 + O_SYNC = 0x01000 + O_ASYNC = 0x02000 + O_CLOEXEC = 0x80000 +) + +const ( + // More invented values for signals + SIGHUP = Signal(0x1) + SIGINT = Signal(0x2) + SIGQUIT = Signal(0x3) + SIGILL = Signal(0x4) + SIGTRAP = Signal(0x5) + SIGABRT = Signal(0x6) + SIGBUS = Signal(0x7) + SIGFPE = Signal(0x8) + SIGKILL = Signal(0x9) + SIGSEGV = Signal(0xb) + SIGPIPE = Signal(0xd) + SIGALRM = Signal(0xe) + SIGTERM = Signal(0xf) +) + +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", +} + +const ( + GENERIC_READ = 0x80000000 + GENERIC_WRITE = 0x40000000 + GENERIC_EXECUTE = 0x20000000 + GENERIC_ALL = 0x10000000 + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_APPEND_DATA = 0x00000004 + FILE_WRITE_ATTRIBUTES = 0x00000100 + + FILE_SHARE_READ = 0x00000001 + FILE_SHARE_WRITE = 0x00000002 + FILE_SHARE_DELETE = 0x00000004 + FILE_ATTRIBUTE_READONLY = 0x00000001 + FILE_ATTRIBUTE_HIDDEN = 0x00000002 + FILE_ATTRIBUTE_SYSTEM = 0x00000004 + FILE_ATTRIBUTE_DIRECTORY = 0x00000010 + FILE_ATTRIBUTE_ARCHIVE = 0x00000020 + FILE_ATTRIBUTE_NORMAL = 0x00000080 + FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400 + + INVALID_FILE_ATTRIBUTES = 0xffffffff + + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 + + FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 + FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 + FILE_FLAG_OVERLAPPED = 0x40000000 + + HANDLE_FLAG_INHERIT = 0x00000001 + STARTF_USESTDHANDLES = 0x00000100 + STARTF_USESHOWWINDOW = 0x00000001 + DUPLICATE_CLOSE_SOURCE = 0x00000001 + DUPLICATE_SAME_ACCESS = 0x00000002 + + STD_INPUT_HANDLE = -10 & (1<<32 - 1) + STD_OUTPUT_HANDLE = -11 & (1<<32 - 1) + STD_ERROR_HANDLE = -12 & (1<<32 - 1) + + FILE_BEGIN = 0 + FILE_CURRENT = 1 + FILE_END = 2 + + LANG_ENGLISH = 0x09 + SUBLANG_ENGLISH_US = 0x01 + + FORMAT_MESSAGE_ALLOCATE_BUFFER = 256 + FORMAT_MESSAGE_IGNORE_INSERTS = 512 + FORMAT_MESSAGE_FROM_STRING = 1024 + FORMAT_MESSAGE_FROM_HMODULE = 2048 + FORMAT_MESSAGE_FROM_SYSTEM = 4096 + FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192 + FORMAT_MESSAGE_MAX_WIDTH_MASK = 255 + + MAX_PATH = 260 + MAX_LONG_PATH = 32768 + + MAX_COMPUTERNAME_LENGTH = 15 + + TIME_ZONE_ID_UNKNOWN = 0 + TIME_ZONE_ID_STANDARD = 1 + + TIME_ZONE_ID_DAYLIGHT = 2 + IGNORE = 0 + INFINITE = 0xffffffff + + WAIT_TIMEOUT = 258 + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x00000000 + WAIT_FAILED = 0xFFFFFFFF + + PROCESS_TERMINATE = 1 + PROCESS_QUERY_INFORMATION = 0x00000400 + SYNCHRONIZE = 0x00100000 + + FILE_MAP_COPY = 0x01 + FILE_MAP_WRITE = 0x02 + FILE_MAP_READ = 0x04 + FILE_MAP_EXECUTE = 0x20 + + CTRL_C_EVENT = 0 + CTRL_BREAK_EVENT = 1 + + // Windows reserves errors >= 1<<29 for application use. + APPLICATION_ERROR = 1 << 29 +) + +const ( + // Process creation flags. + CREATE_BREAKAWAY_FROM_JOB = 0x01000000 + CREATE_DEFAULT_ERROR_MODE = 0x04000000 + CREATE_NEW_CONSOLE = 0x00000010 + CREATE_NEW_PROCESS_GROUP = 0x00000200 + CREATE_NO_WINDOW = 0x08000000 + CREATE_PROTECTED_PROCESS = 0x00040000 + CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000 + CREATE_SEPARATE_WOW_VDM = 0x00000800 + CREATE_SHARED_WOW_VDM = 0x00001000 + CREATE_SUSPENDED = 0x00000004 + CREATE_UNICODE_ENVIRONMENT = 0x00000400 + DEBUG_ONLY_THIS_PROCESS = 0x00000002 + DEBUG_PROCESS = 0x00000001 + DETACHED_PROCESS = 0x00000008 + EXTENDED_STARTUPINFO_PRESENT = 0x00080000 + INHERIT_PARENT_AFFINITY = 0x00010000 +) + +const ( + // flags for CreateToolhelp32Snapshot + TH32CS_SNAPHEAPLIST = 0x01 + TH32CS_SNAPPROCESS = 0x02 + TH32CS_SNAPTHREAD = 0x04 + TH32CS_SNAPMODULE = 0x08 + TH32CS_SNAPMODULE32 = 0x10 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD + TH32CS_INHERIT = 0x80000000 +) + +const ( + // filters for ReadDirectoryChangesW + FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 + FILE_NOTIFY_CHANGE_DIR_NAME = 0x002 + FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004 + FILE_NOTIFY_CHANGE_SIZE = 0x008 + FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010 + FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020 + FILE_NOTIFY_CHANGE_CREATION = 0x040 + FILE_NOTIFY_CHANGE_SECURITY = 0x100 +) + +const ( + // do not reorder + FILE_ACTION_ADDED = iota + 1 + FILE_ACTION_REMOVED + FILE_ACTION_MODIFIED + FILE_ACTION_RENAMED_OLD_NAME + FILE_ACTION_RENAMED_NEW_NAME +) + +const ( + // wincrypt.h + PROV_RSA_FULL = 1 + PROV_RSA_SIG = 2 + PROV_DSS = 3 + PROV_FORTEZZA = 4 + PROV_MS_EXCHANGE = 5 + PROV_SSL = 6 + PROV_RSA_SCHANNEL = 12 + PROV_DSS_DH = 13 + PROV_EC_ECDSA_SIG = 14 + PROV_EC_ECNRA_SIG = 15 + PROV_EC_ECDSA_FULL = 16 + PROV_EC_ECNRA_FULL = 17 + PROV_DH_SCHANNEL = 18 + PROV_SPYRUS_LYNKS = 20 + PROV_RNG = 21 + PROV_INTEL_SEC = 22 + PROV_REPLACE_OWF = 23 + PROV_RSA_AES = 24 + CRYPT_VERIFYCONTEXT = 0xF0000000 + CRYPT_NEWKEYSET = 0x00000008 + CRYPT_DELETEKEYSET = 0x00000010 + CRYPT_MACHINE_KEYSET = 0x00000020 + CRYPT_SILENT = 0x00000040 + CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 + + USAGE_MATCH_TYPE_AND = 0 + USAGE_MATCH_TYPE_OR = 1 + + X509_ASN_ENCODING = 0x00000001 + PKCS_7_ASN_ENCODING = 0x00010000 + + CERT_STORE_PROV_MEMORY = 2 + + CERT_STORE_ADD_ALWAYS = 4 + + CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004 + + CERT_TRUST_NO_ERROR = 0x00000000 + CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001 + CERT_TRUST_IS_REVOKED = 0x00000004 + CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008 + CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010 + CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020 + CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040 + CERT_TRUST_IS_CYCLIC = 0x00000080 + CERT_TRUST_INVALID_EXTENSION = 0x00000100 + CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200 + CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400 + CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800 + CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000 + CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000 + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000 + CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000 + CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000 + CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000 + CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000 + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000 + + CERT_CHAIN_POLICY_BASE = 1 + CERT_CHAIN_POLICY_AUTHENTICODE = 2 + CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3 + CERT_CHAIN_POLICY_SSL = 4 + CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5 + CERT_CHAIN_POLICY_NT_AUTH = 6 + CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7 + CERT_CHAIN_POLICY_EV = 8 + + CERT_E_EXPIRED = 0x800B0101 + CERT_E_ROLE = 0x800B0103 + CERT_E_PURPOSE = 0x800B0106 + CERT_E_UNTRUSTEDROOT = 0x800B0109 + CERT_E_CN_NO_MATCH = 0x800B010F + + AUTHTYPE_CLIENT = 1 + AUTHTYPE_SERVER = 2 +) + +var ( + OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00") + OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00") + OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00") +) + +// Invented values to support what package os expects. +type Timeval struct { + Sec int32 + Usec int32 +} + +func (tv *Timeval) Nanoseconds() int64 { + return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3 +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +type SecurityAttributes struct { + Length uint32 + SecurityDescriptor uintptr + InheritHandle uint32 +} + +type Overlapped struct { + Internal uintptr + InternalHigh uintptr + Offset uint32 + OffsetHigh uint32 + HEvent Handle +} + +type FileNotifyInformation struct { + NextEntryOffset uint32 + Action uint32 + FileNameLength uint32 + FileName uint16 +} + +type Filetime struct { + LowDateTime uint32 + HighDateTime uint32 +} + +// Nanoseconds returns Filetime ft in nanoseconds +// since Epoch (00:00:00 UTC, January 1, 1970). +func (ft *Filetime) Nanoseconds() int64 { + // 100-nanosecond intervals since January 1, 1601 + nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) + // change starting time to the Epoch (00:00:00 UTC, January 1, 1970) + nsec -= 116444736000000000 + // convert into nanoseconds + nsec *= 100 + return nsec +} + +func NsecToFiletime(nsec int64) (ft Filetime) { + // convert into 100-nanosecond + nsec /= 100 + // change starting time to January 1, 1601 + nsec += 116444736000000000 + // split into high / low + ft.LowDateTime = uint32(nsec & 0xffffffff) + ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff) + return ft +} + +type Win32finddata struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH - 1]uint16 + AlternateFileName [13]uint16 +} + +// This is the actual system call structure. +// Win32finddata is what we committed to in Go 1. +type win32finddata1 struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 + Reserved0 uint32 + Reserved1 uint32 + FileName [MAX_PATH]uint16 + AlternateFileName [14]uint16 +} + +func copyFindData(dst *Win32finddata, src *win32finddata1) { + dst.FileAttributes = src.FileAttributes + dst.CreationTime = src.CreationTime + dst.LastAccessTime = src.LastAccessTime + dst.LastWriteTime = src.LastWriteTime + dst.FileSizeHigh = src.FileSizeHigh + dst.FileSizeLow = src.FileSizeLow + dst.Reserved0 = src.Reserved0 + dst.Reserved1 = src.Reserved1 + + // The src is 1 element bigger than dst, but it must be NUL. + copy(dst.FileName[:], src.FileName[:]) + copy(dst.AlternateFileName[:], src.AlternateFileName[:]) +} + +type ByHandleFileInformation struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + VolumeSerialNumber uint32 + FileSizeHigh uint32 + FileSizeLow uint32 + NumberOfLinks uint32 + FileIndexHigh uint32 + FileIndexLow uint32 +} + +const ( + GetFileExInfoStandard = 0 + GetFileExMaxInfoLevel = 1 +) + +type Win32FileAttributeData struct { + FileAttributes uint32 + CreationTime Filetime + LastAccessTime Filetime + LastWriteTime Filetime + FileSizeHigh uint32 + FileSizeLow uint32 +} + +// ShowWindow constants +const ( + // winuser.h + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_SHOWMAXIMIZED = 3 + SW_MAXIMIZE = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +type StartupInfo struct { + Cb uint32 + _ *uint16 + Desktop *uint16 + Title *uint16 + X uint32 + Y uint32 + XSize uint32 + YSize uint32 + XCountChars uint32 + YCountChars uint32 + FillAttribute uint32 + Flags uint32 + ShowWindow uint16 + _ uint16 + _ *byte + StdInput Handle + StdOutput Handle + StdErr Handle +} + +type ProcessInformation struct { + Process Handle + Thread Handle + ProcessId uint32 + ThreadId uint32 +} + +type ProcessEntry32 struct { + Size uint32 + Usage uint32 + ProcessID uint32 + DefaultHeapID uintptr + ModuleID uint32 + Threads uint32 + ParentProcessID uint32 + PriClassBase int32 + Flags uint32 + ExeFile [MAX_PATH]uint16 +} + +type Systemtime struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +type Timezoneinformation struct { + Bias int32 + StandardName [32]uint16 + StandardDate Systemtime + StandardBias int32 + DaylightName [32]uint16 + DaylightDate Systemtime + DaylightBias int32 +} + +// Socket related. + +const ( + AF_UNSPEC = 0 + AF_UNIX = 1 + AF_INET = 2 + AF_INET6 = 23 + AF_NETBIOS = 17 + + SOCK_STREAM = 1 + SOCK_DGRAM = 2 + SOCK_RAW = 3 + SOCK_SEQPACKET = 5 + + IPPROTO_IP = 0 + IPPROTO_IPV6 = 0x29 + IPPROTO_TCP = 6 + IPPROTO_UDP = 17 + + SOL_SOCKET = 0xffff + SO_REUSEADDR = 4 + SO_KEEPALIVE = 8 + SO_DONTROUTE = 16 + SO_BROADCAST = 32 + SO_LINGER = 128 + SO_RCVBUF = 0x1002 + SO_SNDBUF = 0x1001 + SO_UPDATE_ACCEPT_CONTEXT = 0x700b + SO_UPDATE_CONNECT_CONTEXT = 0x7010 + + IOC_OUT = 0x40000000 + IOC_IN = 0x80000000 + IOC_VENDOR = 0x18000000 + IOC_INOUT = IOC_IN | IOC_OUT + IOC_WS2 = 0x08000000 + SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 + SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 + SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 + + // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 + + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_LOOP = 0xb + IP_ADD_MEMBERSHIP = 0xc + IP_DROP_MEMBERSHIP = 0xd + + IPV6_V6ONLY = 0x1b + IPV6_UNICAST_HOPS = 0x4 + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_LOOP = 0xb + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_DONTROUTE = 0x4 + MSG_WAITALL = 0x8 + + MSG_TRUNC = 0x0100 + MSG_CTRUNC = 0x0200 + MSG_BCAST = 0x0400 + MSG_MCAST = 0x0800 + + SOMAXCONN = 0x7fffffff + + TCP_NODELAY = 1 + + SHUT_RD = 0 + SHUT_WR = 1 + SHUT_RDWR = 2 + + WSADESCRIPTION_LEN = 256 + WSASYS_STATUS_LEN = 128 +) + +type WSABuf struct { + Len uint32 + Buf *byte +} + +type WSAMsg struct { + Name *syscall.RawSockaddrAny + Namelen int32 + Buffers *WSABuf + BufferCount uint32 + Control WSABuf + Flags uint32 +} + +// Invented values to support what package os expects. +const ( + S_IFMT = 0x1f000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +const ( + FILE_TYPE_CHAR = 0x0002 + FILE_TYPE_DISK = 0x0001 + FILE_TYPE_PIPE = 0x0003 + FILE_TYPE_REMOTE = 0x8000 + FILE_TYPE_UNKNOWN = 0x0000 +) + +type Hostent struct { + Name *byte + Aliases **byte + AddrType uint16 + Length uint16 + AddrList **byte +} + +type Protoent struct { + Name *byte + Aliases **byte + Proto uint16 +} + +const ( + DNS_TYPE_A = 0x0001 + DNS_TYPE_NS = 0x0002 + DNS_TYPE_MD = 0x0003 + DNS_TYPE_MF = 0x0004 + DNS_TYPE_CNAME = 0x0005 + DNS_TYPE_SOA = 0x0006 + DNS_TYPE_MB = 0x0007 + DNS_TYPE_MG = 0x0008 + DNS_TYPE_MR = 0x0009 + DNS_TYPE_NULL = 0x000a + DNS_TYPE_WKS = 0x000b + DNS_TYPE_PTR = 0x000c + DNS_TYPE_HINFO = 0x000d + DNS_TYPE_MINFO = 0x000e + DNS_TYPE_MX = 0x000f + DNS_TYPE_TEXT = 0x0010 + DNS_TYPE_RP = 0x0011 + DNS_TYPE_AFSDB = 0x0012 + DNS_TYPE_X25 = 0x0013 + DNS_TYPE_ISDN = 0x0014 + DNS_TYPE_RT = 0x0015 + DNS_TYPE_NSAP = 0x0016 + DNS_TYPE_NSAPPTR = 0x0017 + DNS_TYPE_SIG = 0x0018 + DNS_TYPE_KEY = 0x0019 + DNS_TYPE_PX = 0x001a + DNS_TYPE_GPOS = 0x001b + DNS_TYPE_AAAA = 0x001c + DNS_TYPE_LOC = 0x001d + DNS_TYPE_NXT = 0x001e + DNS_TYPE_EID = 0x001f + DNS_TYPE_NIMLOC = 0x0020 + DNS_TYPE_SRV = 0x0021 + DNS_TYPE_ATMA = 0x0022 + DNS_TYPE_NAPTR = 0x0023 + DNS_TYPE_KX = 0x0024 + DNS_TYPE_CERT = 0x0025 + DNS_TYPE_A6 = 0x0026 + DNS_TYPE_DNAME = 0x0027 + DNS_TYPE_SINK = 0x0028 + DNS_TYPE_OPT = 0x0029 + DNS_TYPE_DS = 0x002B + DNS_TYPE_RRSIG = 0x002E + DNS_TYPE_NSEC = 0x002F + DNS_TYPE_DNSKEY = 0x0030 + DNS_TYPE_DHCID = 0x0031 + DNS_TYPE_UINFO = 0x0064 + DNS_TYPE_UID = 0x0065 + DNS_TYPE_GID = 0x0066 + DNS_TYPE_UNSPEC = 0x0067 + DNS_TYPE_ADDRS = 0x00f8 + DNS_TYPE_TKEY = 0x00f9 + DNS_TYPE_TSIG = 0x00fa + DNS_TYPE_IXFR = 0x00fb + DNS_TYPE_AXFR = 0x00fc + DNS_TYPE_MAILB = 0x00fd + DNS_TYPE_MAILA = 0x00fe + DNS_TYPE_ALL = 0x00ff + DNS_TYPE_ANY = 0x00ff + DNS_TYPE_WINS = 0xff01 + DNS_TYPE_WINSR = 0xff02 + DNS_TYPE_NBSTAT = 0xff01 +) + +const ( + DNS_INFO_NO_RECORDS = 0x251D +) + +const ( + // flags inside DNSRecord.Dw + DnsSectionQuestion = 0x0000 + DnsSectionAnswer = 0x0001 + DnsSectionAuthority = 0x0002 + DnsSectionAdditional = 0x0003 +) + +type DNSSRVData struct { + Target *uint16 + Priority uint16 + Weight uint16 + Port uint16 + Pad uint16 +} + +type DNSPTRData struct { + Host *uint16 +} + +type DNSMXData struct { + NameExchange *uint16 + Preference uint16 + Pad uint16 +} + +type DNSTXTData struct { + StringCount uint16 + StringArray [1]*uint16 +} + +type DNSRecord struct { + Next *DNSRecord + Name *uint16 + Type uint16 + Length uint16 + Dw uint32 + Ttl uint32 + Reserved uint32 + Data [40]byte +} + +const ( + TF_DISCONNECT = 1 + TF_REUSE_SOCKET = 2 + TF_WRITE_BEHIND = 4 + TF_USE_DEFAULT_WORKER = 0 + TF_USE_SYSTEM_THREAD = 16 + TF_USE_KERNEL_APC = 32 +) + +type TransmitFileBuffers struct { + Head uintptr + HeadLength uint32 + Tail uintptr + TailLength uint32 +} + +const ( + IFF_UP = 1 + IFF_BROADCAST = 2 + IFF_LOOPBACK = 4 + IFF_POINTTOPOINT = 8 + IFF_MULTICAST = 16 +) + +const SIO_GET_INTERFACE_LIST = 0x4004747F + +// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old. +// will be fixed to change variable type as suitable. + +type SockaddrGen [24]byte + +type InterfaceInfo struct { + Flags uint32 + Address SockaddrGen + BroadcastAddress SockaddrGen + Netmask SockaddrGen +} + +type IpAddressString struct { + String [16]byte +} + +type IpMaskString IpAddressString + +type IpAddrString struct { + Next *IpAddrString + IpAddress IpAddressString + IpMask IpMaskString + Context uint32 +} + +const MAX_ADAPTER_NAME_LENGTH = 256 +const MAX_ADAPTER_DESCRIPTION_LENGTH = 128 +const MAX_ADAPTER_ADDRESS_LENGTH = 8 + +type IpAdapterInfo struct { + Next *IpAdapterInfo + ComboIndex uint32 + AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte + Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte + AddressLength uint32 + Address [MAX_ADAPTER_ADDRESS_LENGTH]byte + Index uint32 + Type uint32 + DhcpEnabled uint32 + CurrentIpAddress *IpAddrString + IpAddressList IpAddrString + GatewayList IpAddrString + DhcpServer IpAddrString + HaveWins bool + PrimaryWinsServer IpAddrString + SecondaryWinsServer IpAddrString + LeaseObtained int64 + LeaseExpires int64 +} + +const MAXLEN_PHYSADDR = 8 +const MAX_INTERFACE_NAME_LEN = 256 +const MAXLEN_IFDESCR = 256 + +type MibIfRow struct { + Name [MAX_INTERFACE_NAME_LEN]uint16 + Index uint32 + Type uint32 + Mtu uint32 + Speed uint32 + PhysAddrLen uint32 + PhysAddr [MAXLEN_PHYSADDR]byte + AdminStatus uint32 + OperStatus uint32 + LastChange uint32 + InOctets uint32 + InUcastPkts uint32 + InNUcastPkts uint32 + InDiscards uint32 + InErrors uint32 + InUnknownProtos uint32 + OutOctets uint32 + OutUcastPkts uint32 + OutNUcastPkts uint32 + OutDiscards uint32 + OutErrors uint32 + OutQLen uint32 + DescrLen uint32 + Descr [MAXLEN_IFDESCR]byte +} + +type CertContext struct { + EncodingType uint32 + EncodedCert *byte + Length uint32 + CertInfo uintptr + Store Handle +} + +type CertChainContext struct { + Size uint32 + TrustStatus CertTrustStatus + ChainCount uint32 + Chains **CertSimpleChain + LowerQualityChainCount uint32 + LowerQualityChains **CertChainContext + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertSimpleChain struct { + Size uint32 + TrustStatus CertTrustStatus + NumElements uint32 + Elements **CertChainElement + TrustListInfo uintptr + HasRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 +} + +type CertChainElement struct { + Size uint32 + CertContext *CertContext + TrustStatus CertTrustStatus + RevocationInfo *CertRevocationInfo + IssuanceUsage *CertEnhKeyUsage + ApplicationUsage *CertEnhKeyUsage + ExtendedErrorInfo *uint16 +} + +type CertRevocationInfo struct { + Size uint32 + RevocationResult uint32 + RevocationOid *byte + OidSpecificInfo uintptr + HasFreshnessTime uint32 + FreshnessTime uint32 + CrlInfo uintptr // *CertRevocationCrlInfo +} + +type CertTrustStatus struct { + ErrorStatus uint32 + InfoStatus uint32 +} + +type CertUsageMatch struct { + Type uint32 + Usage CertEnhKeyUsage +} + +type CertEnhKeyUsage struct { + Length uint32 + UsageIdentifiers **byte +} + +type CertChainPara struct { + Size uint32 + RequestedUsage CertUsageMatch + RequstedIssuancePolicy CertUsageMatch + URLRetrievalTimeout uint32 + CheckRevocationFreshnessTime uint32 + RevocationFreshnessTime uint32 + CacheResync *Filetime +} + +type CertChainPolicyPara struct { + Size uint32 + Flags uint32 + ExtraPolicyPara uintptr +} + +type SSLExtraCertChainPolicyPara struct { + Size uint32 + AuthType uint32 + Checks uint32 + ServerName *uint16 +} + +type CertChainPolicyStatus struct { + Size uint32 + Error uint32 + ChainIndex uint32 + ElementIndex uint32 + ExtraPolicyStatus uintptr +} + +const ( + // do not reorder + HKEY_CLASSES_ROOT = 0x80000000 + iota + HKEY_CURRENT_USER + HKEY_LOCAL_MACHINE + HKEY_USERS + HKEY_PERFORMANCE_DATA + HKEY_CURRENT_CONFIG + HKEY_DYN_DATA + + KEY_QUERY_VALUE = 1 + KEY_SET_VALUE = 2 + KEY_CREATE_SUB_KEY = 4 + KEY_ENUMERATE_SUB_KEYS = 8 + KEY_NOTIFY = 16 + KEY_CREATE_LINK = 32 + KEY_WRITE = 0x20006 + KEY_EXECUTE = 0x20019 + KEY_READ = 0x20019 + KEY_WOW64_64KEY = 0x0100 + KEY_WOW64_32KEY = 0x0200 + KEY_ALL_ACCESS = 0xf003f +) + +const ( + // do not reorder + REG_NONE = iota + REG_SZ + REG_EXPAND_SZ + REG_BINARY + REG_DWORD_LITTLE_ENDIAN + REG_DWORD_BIG_ENDIAN + REG_LINK + REG_MULTI_SZ + REG_RESOURCE_LIST + REG_FULL_RESOURCE_DESCRIPTOR + REG_RESOURCE_REQUIREMENTS_LIST + REG_QWORD_LITTLE_ENDIAN + REG_DWORD = REG_DWORD_LITTLE_ENDIAN + REG_QWORD = REG_QWORD_LITTLE_ENDIAN +) + +type AddrinfoW struct { + Flags int32 + Family int32 + Socktype int32 + Protocol int32 + Addrlen uintptr + Canonname *uint16 + Addr uintptr + Next *AddrinfoW +} + +const ( + AI_PASSIVE = 1 + AI_CANONNAME = 2 + AI_NUMERICHOST = 4 +) + +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +var WSAID_CONNECTEX = GUID{ + 0x25a207b9, + 0xddf3, + 0x4660, + [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}, +} + +var WSAID_WSASENDMSG = GUID{ + 0xa441e712, + 0x754f, + 0x43ca, + [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d}, +} + +var WSAID_WSARECVMSG = GUID{ + 0xf689d7c8, + 0x6f1f, + 0x436b, + [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22}, +} + +const ( + FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1 + FILE_SKIP_SET_EVENT_ON_HANDLE = 2 +) + +const ( + WSAPROTOCOL_LEN = 255 + MAX_PROTOCOL_CHAIN = 7 + BASE_PROTOCOL = 1 + LAYERED_PROTOCOL = 0 + + XP1_CONNECTIONLESS = 0x00000001 + XP1_GUARANTEED_DELIVERY = 0x00000002 + XP1_GUARANTEED_ORDER = 0x00000004 + XP1_MESSAGE_ORIENTED = 0x00000008 + XP1_PSEUDO_STREAM = 0x00000010 + XP1_GRACEFUL_CLOSE = 0x00000020 + XP1_EXPEDITED_DATA = 0x00000040 + XP1_CONNECT_DATA = 0x00000080 + XP1_DISCONNECT_DATA = 0x00000100 + XP1_SUPPORT_BROADCAST = 0x00000200 + XP1_SUPPORT_MULTIPOINT = 0x00000400 + XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800 + XP1_MULTIPOINT_DATA_PLANE = 0x00001000 + XP1_QOS_SUPPORTED = 0x00002000 + XP1_UNI_SEND = 0x00008000 + XP1_UNI_RECV = 0x00010000 + XP1_IFS_HANDLES = 0x00020000 + XP1_PARTIAL_MESSAGE = 0x00040000 + XP1_SAN_SUPPORT_SDP = 0x00080000 + + PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001 + PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002 + PFL_HIDDEN = 0x00000004 + PFL_MATCHES_PROTOCOL_ZERO = 0x00000008 + PFL_NETWORKDIRECT_PROVIDER = 0x00000010 +) + +type WSAProtocolInfo struct { + ServiceFlags1 uint32 + ServiceFlags2 uint32 + ServiceFlags3 uint32 + ServiceFlags4 uint32 + ProviderFlags uint32 + ProviderId GUID + CatalogEntryId uint32 + ProtocolChain WSAProtocolChain + Version int32 + AddressFamily int32 + MaxSockAddr int32 + MinSockAddr int32 + SocketType int32 + Protocol int32 + ProtocolMaxOffset int32 + NetworkByteOrder int32 + SecurityScheme int32 + MessageSize uint32 + ProviderReserved uint32 + ProtocolName [WSAPROTOCOL_LEN + 1]uint16 +} + +type WSAProtocolChain struct { + ChainLen int32 + ChainEntries [MAX_PROTOCOL_CHAIN]uint32 +} + +type TCPKeepalive struct { + OnOff uint32 + Time uint32 + Interval uint32 +} + +type symbolicLinkReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + Flags uint32 + PathBuffer [1]uint16 +} + +type mountPointReparseBuffer struct { + SubstituteNameOffset uint16 + SubstituteNameLength uint16 + PrintNameOffset uint16 + PrintNameLength uint16 + PathBuffer [1]uint16 +} + +type reparseDataBuffer struct { + ReparseTag uint32 + ReparseDataLength uint16 + Reserved uint16 + + // GenericReparseBuffer + reparseBuffer byte +} + +const ( + FSCTL_GET_REPARSE_POINT = 0x900A8 + MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 + IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 + IO_REPARSE_TAG_SYMLINK = 0xA000000C + SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1 +) + +const ( + ComputerNameNetBIOS = 0 + ComputerNameDnsHostname = 1 + ComputerNameDnsDomain = 2 + ComputerNameDnsFullyQualified = 3 + ComputerNamePhysicalNetBIOS = 4 + ComputerNamePhysicalDnsHostname = 5 + ComputerNamePhysicalDnsDomain = 6 + ComputerNamePhysicalDnsFullyQualified = 7 + ComputerNameMax = 8 +) + +const ( + MOVEFILE_REPLACE_EXISTING = 0x1 + MOVEFILE_COPY_ALLOWED = 0x2 + MOVEFILE_DELAY_UNTIL_REBOOT = 0x4 + MOVEFILE_WRITE_THROUGH = 0x8 + MOVEFILE_CREATE_HARDLINK = 0x10 + MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 +) + +const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 + +const ( + IF_TYPE_OTHER = 1 + IF_TYPE_ETHERNET_CSMACD = 6 + IF_TYPE_ISO88025_TOKENRING = 9 + IF_TYPE_PPP = 23 + IF_TYPE_SOFTWARE_LOOPBACK = 24 + IF_TYPE_ATM = 37 + IF_TYPE_IEEE80211 = 71 + IF_TYPE_TUNNEL = 131 + IF_TYPE_IEEE1394 = 144 +) + +type SocketAddress struct { + Sockaddr *syscall.RawSockaddrAny + SockaddrLength int32 +} + +type IpAdapterUnicastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterUnicastAddress + Address SocketAddress + PrefixOrigin int32 + SuffixOrigin int32 + DadState int32 + ValidLifetime uint32 + PreferredLifetime uint32 + LeaseLifetime uint32 + OnLinkPrefixLength uint8 +} + +type IpAdapterAnycastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterAnycastAddress + Address SocketAddress +} + +type IpAdapterMulticastAddress struct { + Length uint32 + Flags uint32 + Next *IpAdapterMulticastAddress + Address SocketAddress +} + +type IpAdapterDnsServerAdapter struct { + Length uint32 + Reserved uint32 + Next *IpAdapterDnsServerAdapter + Address SocketAddress +} + +type IpAdapterPrefix struct { + Length uint32 + Flags uint32 + Next *IpAdapterPrefix + Address SocketAddress + PrefixLength uint32 +} + +type IpAdapterAddresses struct { + Length uint32 + IfIndex uint32 + Next *IpAdapterAddresses + AdapterName *byte + FirstUnicastAddress *IpAdapterUnicastAddress + FirstAnycastAddress *IpAdapterAnycastAddress + FirstMulticastAddress *IpAdapterMulticastAddress + FirstDnsServerAddress *IpAdapterDnsServerAdapter + DnsSuffix *uint16 + Description *uint16 + FriendlyName *uint16 + PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte + PhysicalAddressLength uint32 + Flags uint32 + Mtu uint32 + IfType uint32 + OperStatus uint32 + Ipv6IfIndex uint32 + ZoneIndices [16]uint32 + FirstPrefix *IpAdapterPrefix + /* more fields might be present here. */ +} + +const ( + IfOperStatusUp = 1 + IfOperStatusDown = 2 + IfOperStatusTesting = 3 + IfOperStatusUnknown = 4 + IfOperStatusDormant = 5 + IfOperStatusNotPresent = 6 + IfOperStatusLowerLayerDown = 7 +) + +// Console related constants used for the mode parameter to SetConsoleMode. See +// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details. + +const ( + ENABLE_PROCESSED_INPUT = 0x1 + ENABLE_LINE_INPUT = 0x2 + ENABLE_ECHO_INPUT = 0x4 + ENABLE_WINDOW_INPUT = 0x8 + ENABLE_MOUSE_INPUT = 0x10 + ENABLE_INSERT_MODE = 0x20 + ENABLE_QUICK_EDIT_MODE = 0x40 + ENABLE_EXTENDED_FLAGS = 0x80 + ENABLE_AUTO_POSITION = 0x100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200 + + ENABLE_PROCESSED_OUTPUT = 0x1 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x2 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4 + DISABLE_NEWLINE_AUTO_RETURN = 0x8 + ENABLE_LVB_GRID_WORLDWIDE = 0x10 +) + +type Coord struct { + X int16 + Y int16 +} + +type SmallRect struct { + Left int16 + Top int16 + Right int16 + Bottom int16 +} + +// Used with GetConsoleScreenBuffer to retreive information about a console +// screen buffer. See +// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str +// for details. + +type ConsoleScreenBufferInfo struct { + Size Coord + CursorPosition Coord + Attributes uint16 + Window SmallRect + MaximumWindowSize Coord +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_386.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_386.go new file mode 100755 index 0000000..fe0ddd0 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_386.go @@ -0,0 +1,22 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte +} + +type Servent struct { + Name *byte + Aliases **byte + Port uint16 + Proto *byte +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_amd64.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_amd64.go new file mode 100755 index 0000000..7e154c2 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/types_windows_amd64.go @@ -0,0 +1,22 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +type WSAData struct { + Version uint16 + HighVersion uint16 + MaxSockets uint16 + MaxUdpDg uint16 + VendorInfo *byte + Description [WSADESCRIPTION_LEN + 1]byte + SystemStatus [WSASYS_STATUS_LEN + 1]byte +} + +type Servent struct { + Name *byte + Aliases **byte + Proto *byte + Port uint16 +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/zsyscall_windows.go new file mode 100755 index 0000000..c7b3b15 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -0,0 +1,2687 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package windows + +import ( + "syscall" + "unsafe" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = NewLazySystemDLL("advapi32.dll") + modkernel32 = NewLazySystemDLL("kernel32.dll") + modshell32 = NewLazySystemDLL("shell32.dll") + modmswsock = NewLazySystemDLL("mswsock.dll") + modcrypt32 = NewLazySystemDLL("crypt32.dll") + modws2_32 = NewLazySystemDLL("ws2_32.dll") + moddnsapi = NewLazySystemDLL("dnsapi.dll") + modiphlpapi = NewLazySystemDLL("iphlpapi.dll") + modsecur32 = NewLazySystemDLL("secur32.dll") + modnetapi32 = NewLazySystemDLL("netapi32.dll") + moduserenv = NewLazySystemDLL("userenv.dll") + + procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource") + procReportEventW = modadvapi32.NewProc("ReportEventW") + procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procCreateServiceW = modadvapi32.NewProc("CreateServiceW") + procOpenServiceW = modadvapi32.NewProc("OpenServiceW") + procDeleteService = modadvapi32.NewProc("DeleteService") + procStartServiceW = modadvapi32.NewProc("StartServiceW") + procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") + procControlService = modadvapi32.NewProc("ControlService") + procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW") + procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus") + procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW") + procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W") + procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") + procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW") + procGetLastError = modkernel32.NewProc("GetLastError") + procLoadLibraryW = modkernel32.NewProc("LoadLibraryW") + procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW") + procFreeLibrary = modkernel32.NewProc("FreeLibrary") + procGetProcAddress = modkernel32.NewProc("GetProcAddress") + procGetVersion = modkernel32.NewProc("GetVersion") + procFormatMessageW = modkernel32.NewProc("FormatMessageW") + procExitProcess = modkernel32.NewProc("ExitProcess") + procCreateFileW = modkernel32.NewProc("CreateFileW") + procReadFile = modkernel32.NewProc("ReadFile") + procWriteFile = modkernel32.NewProc("WriteFile") + procSetFilePointer = modkernel32.NewProc("SetFilePointer") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procGetStdHandle = modkernel32.NewProc("GetStdHandle") + procSetStdHandle = modkernel32.NewProc("SetStdHandle") + procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") + procFindNextFileW = modkernel32.NewProc("FindNextFileW") + procFindClose = modkernel32.NewProc("FindClose") + procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") + procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") + procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") + procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW") + procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procDeleteFileW = modkernel32.NewProc("DeleteFileW") + procMoveFileW = modkernel32.NewProc("MoveFileW") + procMoveFileExW = modkernel32.NewProc("MoveFileExW") + procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") + procSetEndOfFile = modkernel32.NewProc("SetEndOfFile") + procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") + procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime") + procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation") + procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort") + procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus") + procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus") + procCancelIo = modkernel32.NewProc("CancelIo") + procCancelIoEx = modkernel32.NewProc("CancelIoEx") + procCreateProcessW = modkernel32.NewProc("CreateProcessW") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") + procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW") + procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") + procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") + procGetTempPathW = modkernel32.NewProc("GetTempPathW") + procCreatePipe = modkernel32.NewProc("CreatePipe") + procGetFileType = modkernel32.NewProc("GetFileType") + procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW") + procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext") + procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom") + procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW") + procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW") + procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") + procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW") + procSetFileTime = modkernel32.NewProc("SetFileTime") + procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW") + procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW") + procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") + procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") + procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") + procLocalFree = modkernel32.NewProc("LocalFree") + procSetHandleInformation = modkernel32.NewProc("SetHandleInformation") + procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers") + procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") + procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW") + procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW") + procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") + procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile") + procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile") + procVirtualLock = modkernel32.NewProc("VirtualLock") + procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") + procVirtualAlloc = modkernel32.NewProc("VirtualAlloc") + procVirtualFree = modkernel32.NewProc("VirtualFree") + procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procTransmitFile = modmswsock.NewProc("TransmitFile") + procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") + procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") + procCertOpenStore = modcrypt32.NewProc("CertOpenStore") + procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") + procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore") + procCertCloseStore = modcrypt32.NewProc("CertCloseStore") + procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain") + procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") + procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") + procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") + procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") + procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") + procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") + procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") + procReadConsoleW = modkernel32.NewProc("ReadConsoleW") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procProcess32FirstW = modkernel32.NewProc("Process32FirstW") + procProcess32NextW = modkernel32.NewProc("Process32NextW") + procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") + procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW") + procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") + procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") + procCreateEventW = modkernel32.NewProc("CreateEventW") + procCreateEventExW = modkernel32.NewProc("CreateEventExW") + procOpenEventW = modkernel32.NewProc("OpenEventW") + procSetEvent = modkernel32.NewProc("SetEvent") + procResetEvent = modkernel32.NewProc("ResetEvent") + procPulseEvent = modkernel32.NewProc("PulseEvent") + procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW") + procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW") + procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW") + procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW") + procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW") + procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW") + procFindVolumeClose = modkernel32.NewProc("FindVolumeClose") + procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose") + procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW") + procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") + procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") + procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW") + procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW") + procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW") + procGetVolumePathNameW = modkernel32.NewProc("GetVolumePathNameW") + procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW") + procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW") + procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW") + procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW") + procWSAStartup = modws2_32.NewProc("WSAStartup") + procWSACleanup = modws2_32.NewProc("WSACleanup") + procWSAIoctl = modws2_32.NewProc("WSAIoctl") + procsocket = modws2_32.NewProc("socket") + procsetsockopt = modws2_32.NewProc("setsockopt") + procgetsockopt = modws2_32.NewProc("getsockopt") + procbind = modws2_32.NewProc("bind") + procconnect = modws2_32.NewProc("connect") + procgetsockname = modws2_32.NewProc("getsockname") + procgetpeername = modws2_32.NewProc("getpeername") + proclisten = modws2_32.NewProc("listen") + procshutdown = modws2_32.NewProc("shutdown") + procclosesocket = modws2_32.NewProc("closesocket") + procAcceptEx = modmswsock.NewProc("AcceptEx") + procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") + procWSARecv = modws2_32.NewProc("WSARecv") + procWSASend = modws2_32.NewProc("WSASend") + procWSARecvFrom = modws2_32.NewProc("WSARecvFrom") + procWSASendTo = modws2_32.NewProc("WSASendTo") + procgethostbyname = modws2_32.NewProc("gethostbyname") + procgetservbyname = modws2_32.NewProc("getservbyname") + procntohs = modws2_32.NewProc("ntohs") + procgetprotobyname = modws2_32.NewProc("getprotobyname") + procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") + procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") + procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") + procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") + procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") + procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") + procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes") + procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW") + procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses") + procGetACP = modkernel32.NewProc("GetACP") + procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") + procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") + procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo") + procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation") + procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree") + procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW") + procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW") + procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW") + procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW") + procGetLengthSid = modadvapi32.NewProc("GetLengthSid") + procCopySid = modadvapi32.NewProc("CopySid") + procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") + procFreeSid = modadvapi32.NewProc("FreeSid") + procEqualSid = modadvapi32.NewProc("EqualSid") + procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership") + procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken") + procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation") + procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") +) + +func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeregisterEventSource(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseServiceHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteService(service Handle) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) { + r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) { + r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) { + r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLastError() (lasterr error) { + r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) + if r0 != 0 { + lasterr = syscall.Errno(r0) + } + return +} + +func LoadLibrary(libname string) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibrary(_p0) +} + +func _LoadLibrary(libname *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(libname) + if err != nil { + return + } + return _LoadLibraryEx(_p0, zero, flags) +} + +func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeLibrary(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcAddress(module Handle, procname string) (proc uintptr, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(procname) + if err != nil { + return + } + return _GetProcAddress(module, _p0) +} + +func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) { + r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0) + proc = uintptr(r0) + if proc == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVersion() (ver uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0) + ver = uint32(r0) + if ver == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) { + var _p0 *uint16 + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ExitProcess(exitcode uint32) { + syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0) + return +} + +func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) { + r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0) + newlowoffset = uint32(r0) + if newlowoffset == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CloseHandle(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStdHandle(stdhandle uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetStdHandle(stdhandle uint32, handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func findNextFile1(handle Handle, data *win32finddata1) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindClose(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetCurrentDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) { + r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RemoveDirectory(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteFile(path *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFile(from *uint16, to *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerName(buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEndOfFile(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetSystemTimeAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetSystemTimePreciseAsFileTime(time *Filetime) { + syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0) + return +} + +func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0) + rc = uint32(r0) + if rc == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIo(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CancelIoEx(s Handle, o *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) { + var _p0 uint32 + if inheritHandles { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid)) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TerminateProcess(handle Handle, exitcode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetStartupInfo(startupInfo *StartupInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentProcess() (pseudoHandle Handle, err error) { + r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) + pseudoHandle = Handle(r0) + if pseudoHandle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) { + var _p0 uint32 + if bInheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) { + r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0) + event = uint32(r0) + if event == 0xffffffff { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileType(filehandle Handle) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptReleaseContext(provhandle Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) { + r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentStrings() (envs *uint16, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0) + envs = (*uint16)(unsafe.Pointer(r0)) + if envs == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeEnvironmentStrings(envs *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEnvironmentVariable(name *uint16, value *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) { + r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributes(name *uint16) (attrs uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + attrs = uint32(r0) + if attrs == INVALID_FILE_ATTRIBUTES { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetFileAttributes(name *uint16, attrs uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) { + r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCommandLine() (cmd *uint16) { + r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0) + cmd = (*uint16)(unsafe.Pointer(r0)) + return +} + +func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { + r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) + argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) + if argv == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LocalFree(hmem Handle) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0) + handle = Handle(r0) + if handle != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushFileBuffers(handle Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0) + addr = uintptr(r0) + if addr == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func UnmapViewOfFile(addr uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FlushViewOfFile(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualLock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualUnlock(addr uintptr, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) { + r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0) + value = uintptr(r0) + if value == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + var _p0 uint32 + if watchSubTree { + _p0 = 1 + } else { + _p0 = 0 + } + r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) { + r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0) + store = Handle(r0) + if store == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) { + r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertCloseStore(store Handle, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) { + r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateChain(ctx *CertChainContext) { + syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + return +} + +func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) { + r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen)) + context = (*CertContext)(unsafe.Pointer(r0)) + if context == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertFreeCertificateContext(ctx *CertContext) (err error) { + r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) { + r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegCloseKey(key Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func getCurrentProcessId() (pid uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) + pid = uint32(r0) + return +} + +func GetConsoleMode(console Handle, mode *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetConsoleMode(console Handle, mode uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { + r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) { + r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved)) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetCurrentThreadId() (id uint32) { + r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) + id = uint32(r0) + return +} + +func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) { + var _p0 uint32 + if inheritHandle { + _p0 = 1 + } else { + _p0 = 0 + } + r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name))) + handle = Handle(r0) + if handle == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ResetEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func PulseEvent(event Handle) (err error) { + r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func 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 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procDeleteVolumeMountPointW.Addr(), 1, uintptr(unsafe.Pointer(volumeMountPoint)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstVolumeW.Addr(), 2, uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength), 0) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procFindFirstVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextVolumeW.Addr(), 3, uintptr(findVolume), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procFindNextVolumeMountPointW.Addr(), 3, uintptr(findVolumeMountPoint), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindVolumeClose(findVolume Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindVolumeClose.Addr(), 1, uintptr(findVolume), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) { + r1, _, e1 := syscall.Syscall(procFindVolumeMountPointClose.Addr(), 1, uintptr(findVolumeMountPoint), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetDriveType(rootPathName *uint16) (driveType uint32) { + r0, _, _ := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0) + driveType = uint32(r0) + return +} + +func GetLogicalDrives() (drivesBitMask uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLogicalDrives.Addr(), 0, 0, 0, 0) + drivesBitMask = uint32(r0) + if drivesBitMask == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetVolumeInformationW.Addr(), 8, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procGetVolumeInformationByHandleW.Addr(), 8, uintptr(file), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetVolumeNameForVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferlength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetVolumePathNameW.Addr(), 3, uintptr(unsafe.Pointer(fileName)), uintptr(unsafe.Pointer(volumePathName)), uintptr(bufferLength)) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetVolumePathNamesForVolumeNameW.Addr(), 4, uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(volumePathNames)), uintptr(bufferLength), uintptr(unsafe.Pointer(returnLength)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procQueryDosDeviceW.Addr(), 3, uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)), uintptr(max)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetVolumeLabelW.Addr(), 2, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) { + r1, _, e1 := syscall.Syscall(procSetVolumeMountPointW.Addr(), 2, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAStartup(verreq uint32, data *WSAData) (sockerr error) { + r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func WSACleanup() (err error) { + r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) { + r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func socket(af int32, typ int32, protocol int32) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol)) + handle = Handle(r0) + if handle == InvalidHandle { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) { + r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) { + r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) { + r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen)) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) { + r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func listen(s Handle, backlog int32) (err error) { + r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func shutdown(s Handle, how int32) (err error) { + r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Closesocket(s Handle) (err error) { + r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { + r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) { + syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0) + return +} + +func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) { + r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine))) + if r1 == socket_error { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetHostByName(name string) (h *Hostent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetHostByName(_p0) +} + +func _GetHostByName(name *byte) (h *Hostent, err error) { + r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + h = (*Hostent)(unsafe.Pointer(r0)) + if h == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetServByName(name string, proto string) (s *Servent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + var _p1 *byte + _p1, err = syscall.BytePtrFromString(proto) + if err != nil { + return + } + return _GetServByName(_p0, _p1) +} + +func _GetServByName(name *byte, proto *byte) (s *Servent, err error) { + r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0) + s = (*Servent)(unsafe.Pointer(r0)) + if s == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func Ntohs(netshort uint16) (u uint16) { + r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0) + u = uint16(r0) + return +} + +func GetProtoByName(name string) (p *Protoent, err error) { + var _p0 *byte + _p0, err = syscall.BytePtrFromString(name) + if err != nil { + return + } + return _GetProtoByName(_p0) +} + +func _GetProtoByName(name *byte) (p *Protoent, err error) { + r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0) + p = (*Protoent)(unsafe.Pointer(r0)) + if p == nil { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + var _p0 *uint16 + _p0, status = syscall.UTF16PtrFromString(name) + if status != nil { + return + } + return _DnsQuery(_p0, qtype, options, extra, qrs, pr) +} + +func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) { + r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr))) + if r0 != 0 { + status = syscall.Errno(r0) + } + return +} + +func DnsRecordListFree(rl *DNSRecord, freetype uint32) { + syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0) + return +} + +func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { + r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) + same = r0 != 0 + return +} + +func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) { + r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0) + if r0 != 0 { + sockerr = syscall.Errno(r0) + } + return +} + +func FreeAddrInfoW(addrinfo *AddrinfoW) { + syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0) + return +} + +func GetIfEntry(pIfRow *MibIfRow) (errcode error) { + r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) { + r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) { + r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) { + r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength))) + n = int32(r0) + if n == -1 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) { + r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0) + if r0 != 0 { + errcode = syscall.Errno(r0) + } + return +} + +func GetACP() (acp uint32) { + r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) + acp = uint32(r0) + return +} + +func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) { + r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar)) + nwrite = int32(r0) + if nwrite == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) + if r1&0xff == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) { + r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) { + r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType))) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func NetApiBufferFree(buf *byte) (neterr error) { + r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0) + if r0 != 0 { + neterr = syscall.Errno(r0) + } + return +} + +func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) { + r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetLengthSid(sid *SID) (len uint32) { + r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + len = uint32(r0) + return +} + +func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) { + r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func FreeSid(sid *SID) (err error) { + r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) + if r1 != 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) { + r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0) + isEqual = r0 != 0 + return +} + +func 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 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func OpenProcessToken(h Handle, access uint32, token *Token) (err error) { + r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { + r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen))) + if r1 == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/AUTHORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/AUTHORS new file mode 100755 index 0000000..15167cd --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/AUTHORS @@ -0,0 +1,3 @@ +# This source code refers to The Go Authors for copyright purposes. +# The master list of authors is in the main Go distribution, +# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/CONTRIBUTORS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/CONTRIBUTORS new file mode 100755 index 0000000..1c4577e --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/CONTRIBUTORS @@ -0,0 +1,3 @@ +# This source code was written by the Go contributors. +# The master list of contributors is in the main Go distribution, +# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/LICENSE b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/LICENSE new file mode 100755 index 0000000..6a66aea --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/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/skycoin/skycoin/vendor/golang.org/x/text/PATENTS b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/PATENTS new file mode 100755 index 0000000..7330990 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/code.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/code.go new file mode 100755 index 0000000..0389509 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/code.go @@ -0,0 +1,369 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package gen + +import ( + "bytes" + "encoding/gob" + "fmt" + "hash" + "hash/fnv" + "io" + "log" + "os" + "reflect" + "strings" + "unicode" + "unicode/utf8" +) + +// This file contains utilities for generating code. + +// TODO: other write methods like: +// - slices, maps, types, etc. + +// CodeWriter is a utility for writing structured code. It computes the content +// hash and size of written content. It ensures there are newlines between +// written code blocks. +type CodeWriter struct { + buf bytes.Buffer + Size int + Hash hash.Hash32 // content hash + gob *gob.Encoder + // For comments we skip the usual one-line separator if they are followed by + // a code block. + skipSep bool +} + +func (w *CodeWriter) Write(p []byte) (n int, err error) { + return w.buf.Write(p) +} + +// NewCodeWriter returns a new CodeWriter. +func NewCodeWriter() *CodeWriter { + h := fnv.New32() + return &CodeWriter{Hash: h, gob: gob.NewEncoder(h)} +} + +// WriteGoFile appends the buffer with the total size of all created structures +// and writes it as a Go file to the the given file with the given package name. +func (w *CodeWriter) WriteGoFile(filename, pkg string) { + f, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer f.Close() + if _, err = w.WriteGo(f, pkg, ""); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteVersionedGoFile appends the buffer with the total size of all created +// structures and writes it as a Go file to the the given file with the given +// package name and build tags for the current Unicode version, +func (w *CodeWriter) WriteVersionedGoFile(filename, pkg string) { + tags := buildTags() + if tags != "" { + filename = insertVersion(filename, UnicodeVersion()) + } + f, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer f.Close() + if _, err = w.WriteGo(f, pkg, tags); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo appends the buffer with the total size of all created structures and +// writes it as a Go file to the the given writer with the given package name. +func (w *CodeWriter) WriteGo(out io.Writer, pkg, tags string) (n int, err error) { + sz := w.Size + w.WriteComment("Total table size %d bytes (%dKiB); checksum: %X\n", sz, sz/1024, w.Hash.Sum32()) + defer w.buf.Reset() + return WriteGo(out, pkg, tags, w.buf.Bytes()) +} + +func (w *CodeWriter) printf(f string, x ...interface{}) { + fmt.Fprintf(w, f, x...) +} + +func (w *CodeWriter) insertSep() { + if w.skipSep { + w.skipSep = false + return + } + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n") +} + +// WriteComment writes a comment block. All line starts are prefixed with "//". +// Initial empty lines are gobbled. The indentation for the first line is +// stripped from consecutive lines. +func (w *CodeWriter) WriteComment(comment string, args ...interface{}) { + s := fmt.Sprintf(comment, args...) + s = strings.Trim(s, "\n") + + // Use at least two newlines to ensure a blank space between the previous + // block. WriteGoFile will remove extraneous newlines. + w.printf("\n\n// ") + w.skipSep = true + + // strip first indent level. + sep := "\n" + for ; len(s) > 0 && (s[0] == '\t' || s[0] == ' '); s = s[1:] { + sep += s[:1] + } + + strings.NewReplacer(sep, "\n// ", "\n", "\n// ").WriteString(w, s) + + w.printf("\n") +} + +func (w *CodeWriter) writeSizeInfo(size int) { + w.printf("// Size: %d bytes\n", size) +} + +// WriteConst writes a constant of the given name and value. +func (w *CodeWriter) WriteConst(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + + switch v.Type().Kind() { + case reflect.String: + w.printf("const %s %s = ", name, typeName(x)) + w.WriteString(v.String()) + w.printf("\n") + default: + w.printf("const %s = %#v\n", name, x) + } +} + +// WriteVar writes a variable of the given name and value. +func (w *CodeWriter) WriteVar(name string, x interface{}) { + w.insertSep() + v := reflect.ValueOf(x) + oldSize := w.Size + sz := int(v.Type().Size()) + w.Size += sz + + switch v.Type().Kind() { + case reflect.String: + w.printf("var %s %s = ", name, typeName(x)) + w.WriteString(v.String()) + case reflect.Struct: + w.gob.Encode(x) + fallthrough + case reflect.Slice, reflect.Array: + w.printf("var %s = ", name) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + default: + w.printf("var %s %s = ", name, typeName(x)) + w.gob.Encode(x) + w.writeValue(v) + w.writeSizeInfo(w.Size - oldSize) + } + w.printf("\n") +} + +func (w *CodeWriter) writeValue(v reflect.Value) { + x := v.Interface() + switch v.Kind() { + case reflect.String: + w.WriteString(v.String()) + case reflect.Array: + // Don't double count: callers of WriteArray count on the size being + // added, so we need to discount it here. + w.Size -= int(v.Type().Size()) + w.writeSlice(x, true) + case reflect.Slice: + w.writeSlice(x, false) + case reflect.Struct: + w.printf("%s{\n", typeName(v.Interface())) + t := v.Type() + for i := 0; i < v.NumField(); i++ { + w.printf("%s: ", t.Field(i).Name) + w.writeValue(v.Field(i)) + w.printf(",\n") + } + w.printf("}") + default: + w.printf("%#v", x) + } +} + +// WriteString writes a string literal. +func (w *CodeWriter) WriteString(s string) { + s = strings.Replace(s, `\`, `\\`, -1) + io.WriteString(w.Hash, s) // content hash + w.Size += len(s) + + const maxInline = 40 + if len(s) <= maxInline { + w.printf("%q", s) + return + } + + // We will render the string as a multi-line string. + const maxWidth = 80 - 4 - len(`"`) - len(`" +`) + + // When starting on its own line, go fmt indents line 2+ an extra level. + n, max := maxWidth, maxWidth-4 + + // As per https://golang.org/issue/18078, the compiler has trouble + // compiling the concatenation of many strings, s0 + s1 + s2 + ... + sN, + // for large N. We insert redundant, explicit parentheses to work around + // that, lowering the N at any given step: (s0 + s1 + ... + s63) + (s64 + + // ... + s127) + etc + (etc + ... + sN). + explicitParens, extraComment := len(s) > 128*1024, "" + if explicitParens { + w.printf(`(`) + extraComment = "; the redundant, explicit parens are for https://golang.org/issue/18078" + } + + // Print "" +\n, if a string does not start on its own line. + b := w.buf.Bytes() + if p := len(bytes.TrimRight(b, " \t")); p > 0 && b[p-1] != '\n' { + w.printf("\"\" + // Size: %d bytes%s\n", len(s), extraComment) + n, max = maxWidth, maxWidth + } + + w.printf(`"`) + + for sz, p, nLines := 0, 0, 0; p < len(s); { + var r rune + r, sz = utf8.DecodeRuneInString(s[p:]) + out := s[p : p+sz] + chars := 1 + if !unicode.IsPrint(r) || r == utf8.RuneError || r == '"' { + switch sz { + case 1: + out = fmt.Sprintf("\\x%02x", s[p]) + case 2, 3: + out = fmt.Sprintf("\\u%04x", r) + case 4: + out = fmt.Sprintf("\\U%08x", r) + } + chars = len(out) + } + if n -= chars; n < 0 { + nLines++ + if explicitParens && nLines&63 == 63 { + w.printf("\") + (\"") + } + w.printf("\" +\n\"") + n = max - len(out) + } + w.printf("%s", out) + p += sz + } + w.printf(`"`) + if explicitParens { + w.printf(`)`) + } +} + +// WriteSlice writes a slice value. +func (w *CodeWriter) WriteSlice(x interface{}) { + w.writeSlice(x, false) +} + +// WriteArray writes an array value. +func (w *CodeWriter) WriteArray(x interface{}) { + w.writeSlice(x, true) +} + +func (w *CodeWriter) writeSlice(x interface{}, isArray bool) { + v := reflect.ValueOf(x) + w.gob.Encode(v.Len()) + w.Size += v.Len() * int(v.Type().Elem().Size()) + name := typeName(x) + if isArray { + name = fmt.Sprintf("[%d]%s", v.Len(), name[strings.Index(name, "]")+1:]) + } + if isArray { + w.printf("%s{\n", name) + } else { + w.printf("%s{ // %d elements\n", name, v.Len()) + } + + switch kind := v.Type().Elem().Kind(); kind { + case reflect.String: + for _, s := range x.([]string) { + w.WriteString(s) + w.printf(",\n") + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + // nLine and nBlock are the number of elements per line and block. + nLine, nBlock, format := 8, 64, "%d," + switch kind { + case reflect.Uint8: + format = "%#02x," + case reflect.Uint16: + format = "%#04x," + case reflect.Uint32: + nLine, nBlock, format = 4, 32, "%#08x," + case reflect.Uint, reflect.Uint64: + nLine, nBlock, format = 4, 32, "%#016x," + case reflect.Int8: + nLine = 16 + } + n := nLine + for i := 0; i < v.Len(); i++ { + if i%nBlock == 0 && v.Len() > nBlock { + w.printf("// Entry %X - %X\n", i, i+nBlock-1) + } + x := v.Index(i).Interface() + w.gob.Encode(x) + w.printf(format, x) + if n--; n == 0 { + n = nLine + w.printf("\n") + } + } + w.printf("\n") + case reflect.Struct: + zero := reflect.Zero(v.Type().Elem()).Interface() + for i := 0; i < v.Len(); i++ { + x := v.Index(i).Interface() + w.gob.EncodeValue(v) + if !reflect.DeepEqual(zero, x) { + line := fmt.Sprintf("%#v,\n", x) + line = line[strings.IndexByte(line, '{'):] + w.printf("%d: ", i) + w.printf(line) + } + } + case reflect.Array: + for i := 0; i < v.Len(); i++ { + w.printf("%d: %#v,\n", i, v.Index(i).Interface()) + } + default: + panic("gen: slice elem type not supported") + } + w.printf("}") +} + +// WriteType writes a definition of the type of the given value and returns the +// type name. +func (w *CodeWriter) WriteType(x interface{}) string { + t := reflect.TypeOf(x) + w.printf("type %s struct {\n", t.Name()) + for i := 0; i < t.NumField(); i++ { + w.printf("\t%s %s\n", t.Field(i).Name, t.Field(i).Type) + } + w.printf("}\n") + return t.Name() +} + +// typeName returns the name of the go type of x. +func typeName(x interface{}) string { + t := reflect.ValueOf(x).Type() + return strings.Replace(fmt.Sprint(t), "main.", "", 1) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/gen.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/gen.go new file mode 100755 index 0000000..4c3f760 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/gen/gen.go @@ -0,0 +1,333 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package gen contains common code for the various code generation tools in the +// text repository. Its usage ensures consistency between tools. +// +// This package defines command line flags that are common to most generation +// tools. The flags allow for specifying specific Unicode and CLDR versions +// in the public Unicode data repository (http://www.unicode.org/Public). +// +// A local Unicode data mirror can be set through the flag -local or the +// environment variable UNICODE_DIR. The former takes precedence. The local +// directory should follow the same structure as the public repository. +// +// IANA data can also optionally be mirrored by putting it in the iana directory +// rooted at the top of the local mirror. Beware, though, that IANA data is not +// versioned. So it is up to the developer to use the right version. +package gen // import "golang.org/x/text/internal/gen" + +import ( + "bytes" + "flag" + "fmt" + "go/build" + "go/format" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path" + "path/filepath" + "strings" + "sync" + "unicode" + + "golang.org/x/text/unicode/cldr" +) + +var ( + url = flag.String("url", + "http://www.unicode.org/Public", + "URL of Unicode database directory") + iana = flag.String("iana", + "http://www.iana.org", + "URL of the IANA repository") + unicodeVersion = flag.String("unicode", + getEnv("UNICODE_VERSION", unicode.Version), + "unicode version to use") + cldrVersion = flag.String("cldr", + getEnv("CLDR_VERSION", cldr.Version), + "cldr version to use") +) + +func getEnv(name, def string) string { + if v := os.Getenv(name); v != "" { + return v + } + return def +} + +// Init performs common initialization for a gen command. It parses the flags +// and sets up the standard logging parameters. +func Init() { + log.SetPrefix("") + log.SetFlags(log.Lshortfile) + flag.Parse() +} + +const header = `// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +` + +// UnicodeVersion reports the requested Unicode version. +func UnicodeVersion() string { + return *unicodeVersion +} + +// CLDRVersion reports the requested CLDR version. +func CLDRVersion() string { + return *cldrVersion +} + +var tags = []struct{ version, buildTags string }{ + {"10.0.0", "go1.10"}, + {"", "!go1.10"}, +} + +// buildTags reports the build tags used for the current Unicode version. +func buildTags() string { + v := UnicodeVersion() + for _, x := range tags { + // We should do a numeric comparison, but including the collate package + // would create an import cycle. We approximate it by assuming that + // longer version strings are later. + if len(x.version) <= len(v) { + return x.buildTags + } + if len(x.version) == len(v) && x.version <= v { + return x.buildTags + } + } + return tags[0].buildTags +} + +// IsLocal reports whether data files are available locally. +func IsLocal() bool { + dir, err := localReadmeFile() + if err != nil { + return false + } + if _, err = os.Stat(dir); err != nil { + return false + } + return true +} + +// OpenUCDFile opens the requested UCD file. The file is specified relative to +// the public Unicode root directory. It will call log.Fatal if there are any +// errors. +func OpenUCDFile(file string) io.ReadCloser { + return openUnicode(path.Join(*unicodeVersion, "ucd", file)) +} + +// OpenCLDRCoreZip opens the CLDR core zip file. It will call log.Fatal if there +// are any errors. +func OpenCLDRCoreZip() io.ReadCloser { + return OpenUnicodeFile("cldr", *cldrVersion, "core.zip") +} + +// OpenUnicodeFile opens the requested file of the requested category from the +// root of the Unicode data archive. The file is specified relative to the +// public Unicode root directory. If version is "", it will use the default +// Unicode version. It will call log.Fatal if there are any errors. +func OpenUnicodeFile(category, version, file string) io.ReadCloser { + if version == "" { + version = UnicodeVersion() + } + return openUnicode(path.Join(category, version, file)) +} + +// OpenIANAFile opens the requested IANA file. The file is specified relative +// to the IANA root, which is typically either http://www.iana.org or the +// iana directory in the local mirror. It will call log.Fatal if there are any +// errors. +func OpenIANAFile(path string) io.ReadCloser { + return Open(*iana, "iana", path) +} + +var ( + dirMutex sync.Mutex + localDir string +) + +const permissions = 0755 + +func localReadmeFile() (string, error) { + p, err := build.Import("golang.org/x/text", "", build.FindOnly) + if err != nil { + return "", fmt.Errorf("Could not locate package: %v", err) + } + return filepath.Join(p.Dir, "DATA", "README"), nil +} + +func getLocalDir() string { + dirMutex.Lock() + defer dirMutex.Unlock() + + readme, err := localReadmeFile() + if err != nil { + log.Fatal(err) + } + dir := filepath.Dir(readme) + if _, err := os.Stat(readme); err != nil { + if err := os.MkdirAll(dir, permissions); err != nil { + log.Fatalf("Could not create directory: %v", err) + } + ioutil.WriteFile(readme, []byte(readmeTxt), permissions) + } + return dir +} + +const readmeTxt = `Generated by golang.org/x/text/internal/gen. DO NOT EDIT. + +This directory contains downloaded files used to generate the various tables +in the golang.org/x/text subrepo. + +Note that the language subtag repo (iana/assignments/language-subtag-registry) +and all other times in the iana subdirectory are not versioned and will need +to be periodically manually updated. The easiest way to do this is to remove +the entire iana directory. This is mostly of concern when updating the language +package. +` + +// Open opens subdir/path if a local directory is specified and the file exists, +// where subdir is a directory relative to the local root, or fetches it from +// urlRoot/path otherwise. It will call log.Fatal if there are any errors. +func Open(urlRoot, subdir, path string) io.ReadCloser { + file := filepath.Join(getLocalDir(), subdir, filepath.FromSlash(path)) + return open(file, urlRoot, path) +} + +func openUnicode(path string) io.ReadCloser { + file := filepath.Join(getLocalDir(), filepath.FromSlash(path)) + return open(file, *url, path) +} + +// TODO: automatically periodically update non-versioned files. + +func open(file, urlRoot, path string) io.ReadCloser { + if f, err := os.Open(file); err == nil { + return f + } + r := get(urlRoot, path) + defer r.Close() + b, err := ioutil.ReadAll(r) + if err != nil { + log.Fatalf("Could not download file: %v", err) + } + os.MkdirAll(filepath.Dir(file), permissions) + if err := ioutil.WriteFile(file, b, permissions); err != nil { + log.Fatalf("Could not create file: %v", err) + } + return ioutil.NopCloser(bytes.NewReader(b)) +} + +func get(root, path string) io.ReadCloser { + url := root + "/" + path + fmt.Printf("Fetching %s...", url) + defer fmt.Println(" done.") + resp, err := http.Get(url) + if err != nil { + log.Fatalf("HTTP GET: %v", err) + } + if resp.StatusCode != 200 { + log.Fatalf("Bad GET status for %q: %q", url, resp.Status) + } + return resp.Body +} + +// TODO: use Write*Version in all applicable packages. + +// WriteUnicodeVersion writes a constant for the Unicode version from which the +// tables are generated. +func WriteUnicodeVersion(w io.Writer) { + fmt.Fprintf(w, "// UnicodeVersion is the Unicode version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const UnicodeVersion = %q\n\n", UnicodeVersion()) +} + +// WriteCLDRVersion writes a constant for the CLDR version from which the +// tables are generated. +func WriteCLDRVersion(w io.Writer) { + fmt.Fprintf(w, "// CLDRVersion is the CLDR version from which the tables in this package are derived.\n") + fmt.Fprintf(w, "const CLDRVersion = %q\n\n", CLDRVersion()) +} + +// WriteGoFile prepends a standard file comment and package statement to the +// given bytes, applies gofmt, and writes them to a file with the given name. +// It will call log.Fatal if there are any errors. +func WriteGoFile(filename, pkg string, b []byte) { + w, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer w.Close() + if _, err = WriteGo(w, pkg, "", b); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +func insertVersion(filename, version string) string { + suffix := ".go" + if strings.HasSuffix(filename, "_test.go") { + suffix = "_test.go" + } + return fmt.Sprint(filename[:len(filename)-len(suffix)], version, suffix) +} + +// WriteVersionedGoFile prepends a standard file comment, adds build tags to +// version the file for the current Unicode version, and package statement to +// the given bytes, applies gofmt, and writes them to a file with the given +// name. It will call log.Fatal if there are any errors. +func WriteVersionedGoFile(filename, pkg string, b []byte) { + tags := buildTags() + if tags != "" { + filename = insertVersion(filename, UnicodeVersion()) + } + w, err := os.Create(filename) + if err != nil { + log.Fatalf("Could not create file %s: %v", filename, err) + } + defer w.Close() + if _, err = WriteGo(w, pkg, tags, b); err != nil { + log.Fatalf("Error writing file %s: %v", filename, err) + } +} + +// WriteGo prepends a standard file comment and package statement to the given +// bytes, applies gofmt, and writes them to w. +func WriteGo(w io.Writer, pkg, tags string, b []byte) (n int, err error) { + src := []byte(header) + if tags != "" { + src = append(src, fmt.Sprintf("// +build %s\n\n", tags)...) + } + src = append(src, fmt.Sprintf("package %s\n\n", pkg)...) + src = append(src, b...) + formatted, err := format.Source(src) + if err != nil { + // Print the generated code even in case of an error so that the + // returned error can be meaningfully interpreted. + n, _ = w.Write(src) + return n, err + } + return w.Write(formatted) +} + +// Repackage rewrites a Go file from belonging to package main to belonging to +// the given package. +func Repackage(inFile, outFile, pkg string) { + src, err := ioutil.ReadFile(inFile) + if err != nil { + log.Fatalf("reading %s: %v", inFile, err) + } + const toDelete = "package main\n\n" + i := bytes.Index(src, []byte(toDelete)) + if i < 0 { + log.Fatalf("Could not find %q in %s.", toDelete, inFile) + } + w := &bytes.Buffer{} + w.Write(src[i+len(toDelete):]) + WriteGoFile(outFile, pkg, w.Bytes()) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go new file mode 100755 index 0000000..397b975 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/compact.go @@ -0,0 +1,58 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package triegen + +// This file defines Compacter and its implementations. + +import "io" + +// A Compacter generates an alternative, more space-efficient way to store a +// trie value block. A trie value block holds all possible values for the last +// byte of a UTF-8 encoded rune. Excluding ASCII characters, a trie value block +// always has 64 values, as a UTF-8 encoding ends with a byte in [0x80, 0xC0). +type Compacter interface { + // Size returns whether the Compacter could encode the given block as well + // as its size in case it can. len(v) is always 64. + Size(v []uint64) (sz int, ok bool) + + // Store stores the block using the Compacter's compression method. + // It returns a handle with which the block can be retrieved. + // len(v) is always 64. + Store(v []uint64) uint32 + + // Print writes the data structures associated to the given store to w. + Print(w io.Writer) error + + // Handler returns the name of a function that gets called during trie + // lookup for blocks generated by the Compacter. The function should be of + // the form func (n uint32, b byte) uint64, where n is the index returned by + // the Compacter's Store method and b is the last byte of the UTF-8 + // encoding, where 0x80 <= b < 0xC0, for which to do the lookup in the + // block. + Handler() string +} + +// simpleCompacter is the default Compacter used by builder. It implements a +// normal trie block. +type simpleCompacter builder + +func (b *simpleCompacter) Size([]uint64) (sz int, ok bool) { + return blockSize * b.ValueSize, true +} + +func (b *simpleCompacter) Store(v []uint64) uint32 { + h := uint32(len(b.ValueBlocks) - blockOffset) + b.ValueBlocks = append(b.ValueBlocks, v) + return h +} + +func (b *simpleCompacter) Print(io.Writer) error { + // Structures are printed in print.go. + return nil +} + +func (b *simpleCompacter) Handler() string { + panic("Handler should be special-cased for this Compacter") +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/print.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/print.go new file mode 100755 index 0000000..8d9f120 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/print.go @@ -0,0 +1,251 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package triegen + +import ( + "bytes" + "fmt" + "io" + "strings" + "text/template" +) + +// print writes all the data structures as well as the code necessary to use the +// trie to w. +func (b *builder) print(w io.Writer) error { + b.Stats.NValueEntries = len(b.ValueBlocks) * blockSize + b.Stats.NValueBytes = len(b.ValueBlocks) * blockSize * b.ValueSize + b.Stats.NIndexEntries = len(b.IndexBlocks) * blockSize + b.Stats.NIndexBytes = len(b.IndexBlocks) * blockSize * b.IndexSize + b.Stats.NHandleBytes = len(b.Trie) * 2 * b.IndexSize + + // If we only have one root trie, all starter blocks are at position 0 and + // we can access the arrays directly. + if len(b.Trie) == 1 { + // At this point we cannot refer to the generated tables directly. + b.ASCIIBlock = b.Name + "Values" + b.StarterBlock = b.Name + "Index" + } else { + // Otherwise we need to have explicit starter indexes in the trie + // structure. + b.ASCIIBlock = "t.ascii" + b.StarterBlock = "t.utf8Start" + } + + b.SourceType = "[]byte" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + b.SourceType = "string" + if err := lookupGen.Execute(w, b); err != nil { + return err + } + + if err := trieGen.Execute(w, b); err != nil { + return err + } + + for _, c := range b.Compactions { + if err := c.c.Print(w); err != nil { + return err + } + } + + return nil +} + +func printValues(n int, values []uint64) string { + w := &bytes.Buffer{} + boff := n * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", n, boff) + var newline bool + for i, v := range values { + if i%6 == 0 { + newline = true + } + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#04x, ", boff+i, v) + } + } + return w.String() +} + +func printIndex(b *builder, nr int, n *node) string { + w := &bytes.Buffer{} + boff := nr * blockSize + fmt.Fprintf(w, "\t// Block %#x, offset %#x", nr, boff) + var newline bool + for i, c := range n.children { + if i%8 == 0 { + newline = true + } + if c != nil { + v := b.Compactions[c.index.compaction].Offset + uint32(c.index.index) + if v != 0 { + if newline { + fmt.Fprintf(w, "\n") + newline = false + } + fmt.Fprintf(w, "\t%#02x:%#02x, ", boff+i, v) + } + } + } + return w.String() +} + +var ( + trieGen = template.Must(template.New("trie").Funcs(template.FuncMap{ + "printValues": printValues, + "printIndex": printIndex, + "title": strings.Title, + "dec": func(x int) int { return x - 1 }, + "psize": func(n int) string { + return fmt.Sprintf("%d bytes (%.2f KiB)", n, float64(n)/1024) + }, + }).Parse(trieTemplate)) + lookupGen = template.Must(template.New("lookup").Parse(lookupTemplate)) +) + +// TODO: consider the return type of lookup. It could be uint64, even if the +// internal value type is smaller. We will have to verify this with the +// performance of unicode/norm, which is very sensitive to such changes. +const trieTemplate = `{{$b := .}}{{$multi := gt (len .Trie) 1}} +// {{.Name}}Trie. Total size: {{psize .Size}}. Checksum: {{printf "%08x" .Checksum}}. +type {{.Name}}Trie struct { {{if $multi}} + ascii []{{.ValueType}} // index for ASCII bytes + utf8Start []{{.IndexType}} // index for UTF-8 bytes >= 0xC0 +{{end}}} + +func new{{title .Name}}Trie(i int) *{{.Name}}Trie { {{if $multi}} + h := {{.Name}}TrieHandles[i] + return &{{.Name}}Trie{ {{.Name}}Values[uint32(h.ascii)<<6:], {{.Name}}Index[uint32(h.multi)<<6:] } +} + +type {{.Name}}TrieHandle struct { + ascii, multi {{.IndexType}} +} + +// {{.Name}}TrieHandles: {{len .Trie}} handles, {{.Stats.NHandleBytes}} bytes +var {{.Name}}TrieHandles = [{{len .Trie}}]{{.Name}}TrieHandle{ +{{range .Trie}} { {{.ASCIIIndex}}, {{.StarterIndex}} }, // {{printf "%08x" .Checksum}}: {{.Name}} +{{end}}}{{else}} + return &{{.Name}}Trie{} +} +{{end}} +// lookupValue determines the type of block n and looks up the value for b. +func (t *{{.Name}}Trie) lookupValue(n uint32, b byte) {{.ValueType}}{{$last := dec (len .Compactions)}} { + switch { {{range $i, $c := .Compactions}} + {{if eq $i $last}}default{{else}}case n < {{$c.Cutoff}}{{end}}:{{if ne $i 0}} + n -= {{$c.Offset}}{{end}} + return {{print $b.ValueType}}({{$c.Handler}}){{end}} + } +} + +// {{.Name}}Values: {{len .ValueBlocks}} blocks, {{.Stats.NValueEntries}} entries, {{.Stats.NValueBytes}} bytes +// The third block is the zero block. +var {{.Name}}Values = [{{.Stats.NValueEntries}}]{{.ValueType}} { +{{range $i, $v := .ValueBlocks}}{{printValues $i $v}} +{{end}}} + +// {{.Name}}Index: {{len .IndexBlocks}} blocks, {{.Stats.NIndexEntries}} entries, {{.Stats.NIndexBytes}} bytes +// Block 0 is the zero block. +var {{.Name}}Index = [{{.Stats.NIndexEntries}}]{{.IndexType}} { +{{range $i, $v := .IndexBlocks}}{{printIndex $b $i $v}} +{{end}}} +` + +// TODO: consider allowing zero-length strings after evaluating performance with +// unicode/norm. +const lookupTemplate = ` +// lookup{{if eq .SourceType "string"}}String{{end}} 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 *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}(s {{.SourceType}}) (v {{.ValueType}}, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return {{.ASCIIBlock}}[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 := {{.StarterBlock}}[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 := {{.StarterBlock}}[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 = {{.Name}}Index[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 := {{.StarterBlock}}[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 = {{.Name}}Index[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 = {{.Name}}Index[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 +} + +// lookup{{if eq .SourceType "string"}}String{{end}}Unsafe 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 *{{.Name}}Trie) lookup{{if eq .SourceType "string"}}String{{end}}Unsafe(s {{.SourceType}}) {{.ValueType}} { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return {{.ASCIIBlock}}[c0] + } + i := {{.StarterBlock}}[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = {{.Name}}Index[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} +` diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go new file mode 100755 index 0000000..adb0108 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/triegen/triegen.go @@ -0,0 +1,494 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package triegen implements a code generator for a trie for associating +// unsigned integer values with UTF-8 encoded runes. +// +// Many of the go.text packages use tries for storing per-rune information. A +// trie is especially useful if many of the runes have the same value. If this +// is the case, many blocks can be expected to be shared allowing for +// information on many runes to be stored in little space. +// +// As most of the lookups are done directly on []byte slices, the tries use the +// UTF-8 bytes directly for the lookup. This saves a conversion from UTF-8 to +// runes and contributes a little bit to better performance. It also naturally +// provides a fast path for ASCII. +// +// Space is also an issue. There are many code points defined in Unicode and as +// a result tables can get quite large. So every byte counts. The triegen +// package automatically chooses the smallest integer values to represent the +// tables. Compacters allow further compression of the trie by allowing for +// alternative representations of individual trie blocks. +// +// triegen allows generating multiple tries as a single structure. This is +// useful when, for example, one wants to generate tries for several languages +// that have a lot of values in common. Some existing libraries for +// internationalization store all per-language data as a dynamically loadable +// chunk. The go.text packages are designed with the assumption that the user +// typically wants to compile in support for all supported languages, in line +// with the approach common to Go to create a single standalone binary. The +// multi-root trie approach can give significant storage savings in this +// scenario. +// +// triegen generates both tables and code. The code is optimized to use the +// automatically chosen data types. The following code is generated for a Trie +// or multiple Tries named "foo": +// - type fooTrie +// The trie type. +// +// - func newFooTrie(x int) *fooTrie +// Trie constructor, where x is the index of the trie passed to Gen. +// +// - func (t *fooTrie) lookup(s []byte) (v uintX, sz int) +// The lookup method, where uintX is automatically chosen. +// +// - func lookupString, lookupUnsafe and lookupStringUnsafe +// Variants of the above. +// +// - var fooValues and fooIndex and any tables generated by Compacters. +// The core trie data. +// +// - var fooTrieHandles +// Indexes of starter blocks in case of multiple trie roots. +// +// It is recommended that users test the generated trie by checking the returned +// value for every rune. Such exhaustive tests are possible as the the number of +// runes in Unicode is limited. +package triegen // import "golang.org/x/text/internal/triegen" + +// TODO: Arguably, the internally optimized data types would not have to be +// exposed in the generated API. We could also investigate not generating the +// code, but using it through a package. We would have to investigate the impact +// on performance of making such change, though. For packages like unicode/norm, +// small changes like this could tank performance. + +import ( + "encoding/binary" + "fmt" + "hash/crc64" + "io" + "log" + "unicode/utf8" +) + +// builder builds a set of tries for associating values with runes. The set of +// tries can share common index and value blocks. +type builder struct { + Name string + + // ValueType is the type of the trie values looked up. + ValueType string + + // ValueSize is the byte size of the ValueType. + ValueSize int + + // IndexType is the type of trie index values used for all UTF-8 bytes of + // a rune except the last one. + IndexType string + + // IndexSize is the byte size of the IndexType. + IndexSize int + + // SourceType is used when generating the lookup functions. If the user + // requests StringSupport, all lookup functions will be generated for + // string input as well. + SourceType string + + Trie []*Trie + + IndexBlocks []*node + ValueBlocks [][]uint64 + Compactions []compaction + Checksum uint64 + + ASCIIBlock string + StarterBlock string + + indexBlockIdx map[uint64]int + valueBlockIdx map[uint64]nodeIndex + asciiBlockIdx map[uint64]int + + // Stats are used to fill out the template. + Stats struct { + NValueEntries int + NValueBytes int + NIndexEntries int + NIndexBytes int + NHandleBytes int + } + + err error +} + +// A nodeIndex encodes the index of a node, which is defined by the compaction +// which stores it and an index within the compaction. For internal nodes, the +// compaction is always 0. +type nodeIndex struct { + compaction int + index int +} + +// compaction keeps track of stats used for the compaction. +type compaction struct { + c Compacter + blocks []*node + maxHandle uint32 + totalSize int + + // Used by template-based generator and thus exported. + Cutoff uint32 + Offset uint32 + Handler string +} + +func (b *builder) setError(err error) { + if b.err == nil { + b.err = err + } +} + +// An Option can be passed to Gen. +type Option func(b *builder) error + +// Compact configures the trie generator to use the given Compacter. +func Compact(c Compacter) Option { + return func(b *builder) error { + b.Compactions = append(b.Compactions, compaction{ + c: c, + Handler: c.Handler() + "(n, b)"}) + return nil + } +} + +// Gen writes Go code for a shared trie lookup structure to w for the given +// Tries. The generated trie type will be called nameTrie. newNameTrie(x) will +// return the *nameTrie for tries[x]. A value can be looked up by using one of +// the various lookup methods defined on nameTrie. It returns the table size of +// the generated trie. +func Gen(w io.Writer, name string, tries []*Trie, opts ...Option) (sz int, err error) { + // The index contains two dummy blocks, followed by the zero block. The zero + // block is at offset 0x80, so that the offset for the zero block for + // continuation bytes is 0. + b := &builder{ + Name: name, + Trie: tries, + IndexBlocks: []*node{{}, {}, {}}, + Compactions: []compaction{{ + Handler: name + "Values[n<<6+uint32(b)]", + }}, + // The 0 key in indexBlockIdx and valueBlockIdx is the hash of the zero + // block. + indexBlockIdx: map[uint64]int{0: 0}, + valueBlockIdx: map[uint64]nodeIndex{0: {}}, + asciiBlockIdx: map[uint64]int{}, + } + b.Compactions[0].c = (*simpleCompacter)(b) + + for _, f := range opts { + if err := f(b); err != nil { + return 0, err + } + } + b.build() + if b.err != nil { + return 0, b.err + } + if err = b.print(w); err != nil { + return 0, err + } + return b.Size(), nil +} + +// A Trie represents a single root node of a trie. A builder may build several +// overlapping tries at once. +type Trie struct { + root *node + + hiddenTrie +} + +// hiddenTrie contains values we want to be visible to the template generator, +// but hidden from the API documentation. +type hiddenTrie struct { + Name string + Checksum uint64 + ASCIIIndex int + StarterIndex int +} + +// NewTrie returns a new trie root. +func NewTrie(name string) *Trie { + return &Trie{ + &node{ + children: make([]*node, blockSize), + values: make([]uint64, utf8.RuneSelf), + }, + hiddenTrie{Name: name}, + } +} + +// Gen is a convenience wrapper around the Gen func passing t as the only trie +// and uses the name passed to NewTrie. It returns the size of the generated +// tables. +func (t *Trie) Gen(w io.Writer, opts ...Option) (sz int, err error) { + return Gen(w, t.Name, []*Trie{t}, opts...) +} + +// node is a node of the intermediate trie structure. +type node struct { + // children holds this node's children. It is always of length 64. + // A child node may be nil. + children []*node + + // values contains the values of this node. If it is non-nil, this node is + // either a root or leaf node: + // For root nodes, len(values) == 128 and it maps the bytes in [0x00, 0x7F]. + // For leaf nodes, len(values) == 64 and it maps the bytes in [0x80, 0xBF]. + values []uint64 + + index nodeIndex +} + +// Insert associates value with the given rune. Insert will panic if a non-zero +// value is passed for an invalid rune. +func (t *Trie) Insert(r rune, value uint64) { + if value == 0 { + return + } + s := string(r) + if []rune(s)[0] != r && value != 0 { + // Note: The UCD tables will always assign what amounts to a zero value + // to a surrogate. Allowing a zero value for an illegal rune allows + // users to iterate over [0..MaxRune] without having to explicitly + // exclude surrogates, which would be tedious. + panic(fmt.Sprintf("triegen: non-zero value for invalid rune %U", r)) + } + if len(s) == 1 { + // It is a root node value (ASCII). + t.root.values[s[0]] = value + return + } + + n := t.root + for ; len(s) > 1; s = s[1:] { + if n.children == nil { + n.children = make([]*node, blockSize) + } + p := s[0] % blockSize + c := n.children[p] + if c == nil { + c = &node{} + n.children[p] = c + } + if len(s) > 2 && c.values != nil { + log.Fatalf("triegen: insert(%U): found internal node with values", r) + } + n = c + } + if n.values == nil { + n.values = make([]uint64, blockSize) + } + if n.children != nil { + log.Fatalf("triegen: insert(%U): found leaf node that also has child nodes", r) + } + n.values[s[0]-0x80] = value +} + +// Size returns the number of bytes the generated trie will take to store. It +// needs to be exported as it is used in the templates. +func (b *builder) Size() int { + // Index blocks. + sz := len(b.IndexBlocks) * blockSize * b.IndexSize + + // Skip the first compaction, which represents the normal value blocks, as + // its totalSize does not account for the ASCII blocks, which are managed + // separately. + sz += len(b.ValueBlocks) * blockSize * b.ValueSize + for _, c := range b.Compactions[1:] { + sz += c.totalSize + } + + // TODO: this computation does not account for the fixed overhead of a using + // a compaction, either code or data. As for data, though, the typical + // overhead of data is in the order of bytes (2 bytes for cases). Further, + // the savings of using a compaction should anyway be substantial for it to + // be worth it. + + // For multi-root tries, we also need to account for the handles. + if len(b.Trie) > 1 { + sz += 2 * b.IndexSize * len(b.Trie) + } + return sz +} + +func (b *builder) build() { + // Compute the sizes of the values. + var vmax uint64 + for _, t := range b.Trie { + vmax = maxValue(t.root, vmax) + } + b.ValueType, b.ValueSize = getIntType(vmax) + + // Compute all block allocations. + // TODO: first compute the ASCII blocks for all tries and then the other + // nodes. ASCII blocks are more restricted in placement, as they require two + // blocks to be placed consecutively. Processing them first may improve + // sharing (at least one zero block can be expected to be saved.) + for _, t := range b.Trie { + b.Checksum += b.buildTrie(t) + } + + // Compute the offsets for all the Compacters. + offset := uint32(0) + for i := range b.Compactions { + c := &b.Compactions[i] + c.Offset = offset + offset += c.maxHandle + 1 + c.Cutoff = offset + } + + // Compute the sizes of indexes. + // TODO: different byte positions could have different sizes. So far we have + // not found a case where this is beneficial. + imax := uint64(b.Compactions[len(b.Compactions)-1].Cutoff) + for _, ib := range b.IndexBlocks { + if x := uint64(ib.index.index); x > imax { + imax = x + } + } + b.IndexType, b.IndexSize = getIntType(imax) +} + +func maxValue(n *node, max uint64) uint64 { + if n == nil { + return max + } + for _, c := range n.children { + max = maxValue(c, max) + } + for _, v := range n.values { + if max < v { + max = v + } + } + return max +} + +func getIntType(v uint64) (string, int) { + switch { + case v < 1<<8: + return "uint8", 1 + case v < 1<<16: + return "uint16", 2 + case v < 1<<32: + return "uint32", 4 + } + return "uint64", 8 +} + +const ( + blockSize = 64 + + // Subtract two blocks to offset 0x80, the first continuation byte. + blockOffset = 2 + + // Subtract three blocks to offset 0xC0, the first non-ASCII starter. + rootBlockOffset = 3 +) + +var crcTable = crc64.MakeTable(crc64.ISO) + +func (b *builder) buildTrie(t *Trie) uint64 { + n := t.root + + // Get the ASCII offset. For the first trie, the ASCII block will be at + // position 0. + hasher := crc64.New(crcTable) + binary.Write(hasher, binary.BigEndian, n.values) + hash := hasher.Sum64() + + v, ok := b.asciiBlockIdx[hash] + if !ok { + v = len(b.ValueBlocks) + b.asciiBlockIdx[hash] = v + + b.ValueBlocks = append(b.ValueBlocks, n.values[:blockSize], n.values[blockSize:]) + if v == 0 { + // Add the zero block at position 2 so that it will be assigned a + // zero reference in the lookup blocks. + // TODO: always do this? This would allow us to remove a check from + // the trie lookup, but at the expense of extra space. Analyze + // performance for unicode/norm. + b.ValueBlocks = append(b.ValueBlocks, make([]uint64, blockSize)) + } + } + t.ASCIIIndex = v + + // Compute remaining offsets. + t.Checksum = b.computeOffsets(n, true) + // We already subtracted the normal blockOffset from the index. Subtract the + // difference for starter bytes. + t.StarterIndex = n.index.index - (rootBlockOffset - blockOffset) + return t.Checksum +} + +func (b *builder) computeOffsets(n *node, root bool) uint64 { + // For the first trie, the root lookup block will be at position 3, which is + // the offset for UTF-8 non-ASCII starter bytes. + first := len(b.IndexBlocks) == rootBlockOffset + if first { + b.IndexBlocks = append(b.IndexBlocks, n) + } + + // We special-case the cases where all values recursively are 0. This allows + // for the use of a zero block to which all such values can be directed. + hash := uint64(0) + if n.children != nil || n.values != nil { + hasher := crc64.New(crcTable) + for _, c := range n.children { + var v uint64 + if c != nil { + v = b.computeOffsets(c, false) + } + binary.Write(hasher, binary.BigEndian, v) + } + binary.Write(hasher, binary.BigEndian, n.values) + hash = hasher.Sum64() + } + + if first { + b.indexBlockIdx[hash] = rootBlockOffset - blockOffset + } + + // Compacters don't apply to internal nodes. + if n.children != nil { + v, ok := b.indexBlockIdx[hash] + if !ok { + v = len(b.IndexBlocks) - blockOffset + b.IndexBlocks = append(b.IndexBlocks, n) + b.indexBlockIdx[hash] = v + } + n.index = nodeIndex{0, v} + } else { + h, ok := b.valueBlockIdx[hash] + if !ok { + bestI, bestSize := 0, blockSize*b.ValueSize + for i, c := range b.Compactions[1:] { + if sz, ok := c.c.Size(n.values); ok && bestSize > sz { + bestI, bestSize = i+1, sz + } + } + c := &b.Compactions[bestI] + c.totalSize += bestSize + v := c.c.Store(n.values) + if c.maxHandle < v { + c.maxHandle = v + } + h = nodeIndex{bestI, int(v)} + b.valueBlockIdx[hash] = h + } + n.index = h + } + return hash +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go new file mode 100755 index 0000000..8c45b5f --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/internal/ucd/ucd.go @@ -0,0 +1,371 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package ucd provides a parser for Unicode Character Database files, the +// format of which is defined in http://www.unicode.org/reports/tr44/. See +// http://www.unicode.org/Public/UCD/latest/ucd/ for example files. +// +// It currently does not support substitutions of missing fields. +package ucd // import "golang.org/x/text/internal/ucd" + +import ( + "bufio" + "errors" + "fmt" + "io" + "log" + "regexp" + "strconv" + "strings" +) + +// UnicodeData.txt fields. +const ( + CodePoint = iota + Name + GeneralCategory + CanonicalCombiningClass + BidiClass + DecompMapping + DecimalValue + DigitValue + NumericValue + BidiMirrored + Unicode1Name + ISOComment + SimpleUppercaseMapping + SimpleLowercaseMapping + SimpleTitlecaseMapping +) + +// Parse calls f for each entry in the given reader of a UCD file. It will close +// the reader upon return. It will call log.Fatal if any error occurred. +// +// This implements the most common usage pattern of using Parser. +func Parse(r io.ReadCloser, f func(p *Parser)) { + defer r.Close() + + p := New(r) + for p.Next() { + f(p) + } + if err := p.Err(); err != nil { + r.Close() // os.Exit will cause defers not to be called. + log.Fatal(err) + } +} + +// An Option is used to configure a Parser. +type Option func(p *Parser) + +func keepRanges(p *Parser) { + p.keepRanges = true +} + +var ( + // KeepRanges prevents the expansion of ranges. The raw ranges can be + // obtained by calling Range(0) on the parser. + KeepRanges Option = keepRanges +) + +// The Part option register a handler for lines starting with a '@'. The text +// after a '@' is available as the first field. Comments are handled as usual. +func Part(f func(p *Parser)) Option { + return func(p *Parser) { + p.partHandler = f + } +} + +// The CommentHandler option passes comments that are on a line by itself to +// a given handler. +func CommentHandler(f func(s string)) Option { + return func(p *Parser) { + p.commentHandler = f + } +} + +// A Parser parses Unicode Character Database (UCD) files. +type Parser struct { + scanner *bufio.Scanner + + keepRanges bool // Don't expand rune ranges in field 0. + + err error + comment string + field []string + // parsedRange is needed in case Range(0) is called more than once for one + // field. In some cases this requires scanning ahead. + line int + parsedRange bool + rangeStart, rangeEnd rune + + partHandler func(p *Parser) + commentHandler func(s string) +} + +func (p *Parser) setError(err error, msg string) { + if p.err == nil && err != nil { + if msg == "" { + p.err = fmt.Errorf("ucd:line:%d: %v", p.line, err) + } else { + p.err = fmt.Errorf("ucd:line:%d:%s: %v", p.line, msg, err) + } + } +} + +func (p *Parser) getField(i int) string { + if i >= len(p.field) { + return "" + } + return p.field[i] +} + +// Err returns a non-nil error if any error occurred during parsing. +func (p *Parser) Err() error { + return p.err +} + +// New returns a Parser for the given Reader. +func New(r io.Reader, o ...Option) *Parser { + p := &Parser{ + scanner: bufio.NewScanner(r), + } + for _, f := range o { + f(p) + } + return p +} + +// Next parses the next line in the file. It returns true if a line was parsed +// and false if it reached the end of the file. +func (p *Parser) Next() bool { + if !p.keepRanges && p.rangeStart < p.rangeEnd { + p.rangeStart++ + return true + } + p.comment = "" + p.field = p.field[:0] + p.parsedRange = false + + for p.scanner.Scan() && p.err == nil { + p.line++ + s := p.scanner.Text() + if s == "" { + continue + } + if s[0] == '#' { + if p.commentHandler != nil { + p.commentHandler(strings.TrimSpace(s[1:])) + } + continue + } + + // Parse line + if i := strings.IndexByte(s, '#'); i != -1 { + p.comment = strings.TrimSpace(s[i+1:]) + s = s[:i] + } + if s[0] == '@' { + if p.partHandler != nil { + p.field = append(p.field, strings.TrimSpace(s[1:])) + p.partHandler(p) + p.field = p.field[:0] + } + p.comment = "" + continue + } + for { + i := strings.IndexByte(s, ';') + if i == -1 { + p.field = append(p.field, strings.TrimSpace(s)) + break + } + p.field = append(p.field, strings.TrimSpace(s[:i])) + s = s[i+1:] + } + if !p.keepRanges { + p.rangeStart, p.rangeEnd = p.getRange(0) + } + return true + } + p.setError(p.scanner.Err(), "scanner failed") + return false +} + +func parseRune(b string) (rune, error) { + if len(b) > 2 && b[0] == 'U' && b[1] == '+' { + b = b[2:] + } + x, err := strconv.ParseUint(b, 16, 32) + return rune(x), err +} + +func (p *Parser) parseRune(s string) rune { + x, err := parseRune(s) + p.setError(err, "failed to parse rune") + return x +} + +// Rune parses and returns field i as a rune. +func (p *Parser) Rune(i int) rune { + if i > 0 || p.keepRanges { + return p.parseRune(p.getField(i)) + } + return p.rangeStart +} + +// Runes interprets and returns field i as a sequence of runes. +func (p *Parser) Runes(i int) (runes []rune) { + add := func(s string) { + if s = strings.TrimSpace(s); len(s) > 0 { + runes = append(runes, p.parseRune(s)) + } + } + for b := p.getField(i); ; { + i := strings.IndexByte(b, ' ') + if i == -1 { + add(b) + break + } + add(b[:i]) + b = b[i+1:] + } + return +} + +var ( + errIncorrectLegacyRange = errors.New("ucd: unmatched <* First>") + + // reRange matches one line of a legacy rune range. + reRange = regexp.MustCompile("^([0-9A-F]*);<([^,]*), ([^>]*)>(.*)$") +) + +// Range parses and returns field i as a rune range. A range is inclusive at +// both ends. If the field only has one rune, first and last will be identical. +// It supports the legacy format for ranges used in UnicodeData.txt. +func (p *Parser) Range(i int) (first, last rune) { + if !p.keepRanges { + return p.rangeStart, p.rangeStart + } + return p.getRange(i) +} + +func (p *Parser) getRange(i int) (first, last rune) { + b := p.getField(i) + if k := strings.Index(b, ".."); k != -1 { + return p.parseRune(b[:k]), p.parseRune(b[k+2:]) + } + // The first field may not be a rune, in which case we may ignore any error + // and set the range as 0..0. + x, err := parseRune(b) + if err != nil { + // Disable range parsing henceforth. This ensures that an error will be + // returned if the user subsequently will try to parse this field as + // a Rune. + p.keepRanges = true + } + // Special case for UnicodeData that was retained for backwards compatibility. + if i == 0 && len(p.field) > 1 && strings.HasSuffix(p.field[1], "First>") { + if p.parsedRange { + return p.rangeStart, p.rangeEnd + } + mf := reRange.FindStringSubmatch(p.scanner.Text()) + p.line++ + if mf == nil || !p.scanner.Scan() { + p.setError(errIncorrectLegacyRange, "") + return x, x + } + // Using Bytes would be more efficient here, but Text is a lot easier + // and this is not a frequent case. + ml := reRange.FindStringSubmatch(p.scanner.Text()) + if ml == nil || mf[2] != ml[2] || ml[3] != "Last" || mf[4] != ml[4] { + p.setError(errIncorrectLegacyRange, "") + return x, x + } + p.rangeStart, p.rangeEnd = x, p.parseRune(p.scanner.Text()[:len(ml[1])]) + p.parsedRange = true + return p.rangeStart, p.rangeEnd + } + return x, x +} + +// bools recognizes all valid UCD boolean values. +var bools = map[string]bool{ + "": false, + "N": false, + "No": false, + "F": false, + "False": false, + "Y": true, + "Yes": true, + "T": true, + "True": true, +} + +// Bool parses and returns field i as a boolean value. +func (p *Parser) Bool(i int) bool { + f := p.getField(i) + for s, v := range bools { + if f == s { + return v + } + } + p.setError(strconv.ErrSyntax, "error parsing bool") + return false +} + +// Int parses and returns field i as an integer value. +func (p *Parser) Int(i int) int { + x, err := strconv.ParseInt(string(p.getField(i)), 10, 64) + p.setError(err, "error parsing int") + return int(x) +} + +// Uint parses and returns field i as an unsigned integer value. +func (p *Parser) Uint(i int) uint { + x, err := strconv.ParseUint(string(p.getField(i)), 10, 64) + p.setError(err, "error parsing uint") + return uint(x) +} + +// Float parses and returns field i as a decimal value. +func (p *Parser) Float(i int) float64 { + x, err := strconv.ParseFloat(string(p.getField(i)), 64) + p.setError(err, "error parsing float") + return x +} + +// String parses and returns field i as a string value. +func (p *Parser) String(i int) string { + return string(p.getField(i)) +} + +// Strings parses and returns field i as a space-separated list of strings. +func (p *Parser) Strings(i int) []string { + ss := strings.Split(string(p.getField(i)), " ") + for i, s := range ss { + ss[i] = strings.TrimSpace(s) + } + return ss +} + +// Comment returns the comments for the current line. +func (p *Parser) Comment() string { + return string(p.comment) +} + +var errUndefinedEnum = errors.New("ucd: undefined enum value") + +// Enum interprets and returns field i as a value that must be one of the values +// in enum. +func (p *Parser) Enum(i int, enum ...string) string { + f := p.getField(i) + for _, s := range enum { + if f == s { + return s + } + } + p.setError(errUndefinedEnum, "error parsing enum") + return "" +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/transform/transform.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/transform/transform.go new file mode 100755 index 0000000..fe47b9b --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/transform/transform.go @@ -0,0 +1,705 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package transform provides reader and writer wrappers that transform the +// bytes passing through as well as various transformations. Example +// transformations provided by other packages include normalization and +// conversion between character sets. +package transform // import "golang.org/x/text/transform" + +import ( + "bytes" + "errors" + "io" + "unicode/utf8" +) + +var ( + // ErrShortDst means that the destination buffer was too short to + // receive all of the transformed bytes. + ErrShortDst = errors.New("transform: short destination buffer") + + // ErrShortSrc means that the source buffer has insufficient data to + // complete the transformation. + ErrShortSrc = errors.New("transform: short source buffer") + + // ErrEndOfSpan means that the input and output (the transformed input) + // are not identical. + ErrEndOfSpan = errors.New("transform: input and output are not identical") + + // errInconsistentByteCount means that Transform returned success (nil + // error) but also returned nSrc inconsistent with the src argument. + errInconsistentByteCount = errors.New("transform: inconsistent byte count returned") + + // errShortInternal means that an internal buffer is not large enough + // to make progress and the Transform operation must be aborted. + errShortInternal = errors.New("transform: short internal buffer") +) + +// Transformer transforms bytes. +type Transformer interface { + // Transform writes to dst the transformed bytes read from src, and + // returns the number of dst bytes written and src bytes read. The + // atEOF argument tells whether src represents the last bytes of the + // input. + // + // Callers should always process the nDst bytes produced and account + // for the nSrc bytes consumed before considering the error err. + // + // A nil error means that all of the transformed bytes (whether freshly + // transformed from src or left over from previous Transform calls) + // were written to dst. A nil error can be returned regardless of + // whether atEOF is true. If err is nil then nSrc must equal len(src); + // the converse is not necessarily true. + // + // ErrShortDst means that dst was too short to receive all of the + // transformed bytes. ErrShortSrc means that src had insufficient data + // to complete the transformation. If both conditions apply, then + // either error may be returned. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) + + // Reset resets the state and allows a Transformer to be reused. + Reset() +} + +// SpanningTransformer extends the Transformer interface with a Span method +// that determines how much of the input already conforms to the Transformer. +type SpanningTransformer interface { + Transformer + + // Span returns a position in src such that transforming src[:n] results in + // identical output src[:n] for these bytes. It does not necessarily return + // the largest such n. The atEOF argument tells whether src represents the + // last bytes of the input. + // + // Callers should always account for the n bytes consumed before + // considering the error err. + // + // A nil error means that all input bytes are known to be identical to the + // output produced by the Transformer. A nil error can be be returned + // regardless of whether atEOF is true. If err is nil, then then n must + // equal len(src); the converse is not necessarily true. + // + // ErrEndOfSpan means that the Transformer output may differ from the + // input after n bytes. Note that n may be len(src), meaning that the output + // would contain additional bytes after otherwise identical output. + // ErrShortSrc means that src had insufficient data to determine whether the + // remaining bytes would change. Other than the error conditions listed + // here, implementations are free to report other errors that arise. + // + // Calling Span can modify the Transformer state as a side effect. In + // effect, it does the transformation just as calling Transform would, only + // without copying to a destination buffer and only up to a point it can + // determine the input and output bytes are the same. This is obviously more + // limited than calling Transform, but can be more efficient in terms of + // copying and allocating buffers. Calls to Span and Transform may be + // interleaved. + Span(src []byte, atEOF bool) (n int, err error) +} + +// NopResetter can be embedded by implementations of Transformer to add a nop +// Reset method. +type NopResetter struct{} + +// Reset implements the Reset method of the Transformer interface. +func (NopResetter) Reset() {} + +// Reader wraps another io.Reader by transforming the bytes read. +type Reader struct { + r io.Reader + t Transformer + err error + + // dst[dst0:dst1] contains bytes that have been transformed by t but + // not yet copied out via Read. + dst []byte + dst0, dst1 int + + // src[src0:src1] contains bytes that have been read from r but not + // yet transformed through t. + src []byte + src0, src1 int + + // transformComplete is whether the transformation is complete, + // regardless of whether or not it was successful. + transformComplete bool +} + +const defaultBufSize = 4096 + +// NewReader returns a new Reader that wraps r by transforming the bytes read +// via t. It calls Reset on t. +func NewReader(r io.Reader, t Transformer) *Reader { + t.Reset() + return &Reader{ + r: r, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Read implements the io.Reader interface. +func (r *Reader) Read(p []byte) (int, error) { + n, err := 0, error(nil) + for { + // Copy out any transformed bytes and return the final error if we are done. + if r.dst0 != r.dst1 { + n = copy(p, r.dst[r.dst0:r.dst1]) + r.dst0 += n + if r.dst0 == r.dst1 && r.transformComplete { + return n, r.err + } + return n, nil + } else if r.transformComplete { + return 0, r.err + } + + // Try to transform some source bytes, or to flush the transformer if we + // are out of source bytes. We do this even if r.r.Read returned an error. + // As the io.Reader documentation says, "process the n > 0 bytes returned + // before considering the error". + if r.src0 != r.src1 || r.err != nil { + r.dst0 = 0 + r.dst1, n, err = r.t.Transform(r.dst, r.src[r.src0:r.src1], r.err == io.EOF) + r.src0 += n + + switch { + case err == nil: + if r.src0 != r.src1 { + r.err = errInconsistentByteCount + } + // The Transform call was successful; we are complete if we + // cannot read more bytes into src. + r.transformComplete = r.err != nil + continue + case err == ErrShortDst && (r.dst1 != 0 || n != 0): + // Make room in dst by copying out, and try again. + continue + case err == ErrShortSrc && r.src1-r.src0 != len(r.src) && r.err == nil: + // Read more bytes into src via the code below, and try again. + default: + r.transformComplete = true + // The reader error (r.err) takes precedence over the + // transformer error (err) unless r.err is nil or io.EOF. + if r.err == nil || r.err == io.EOF { + r.err = err + } + continue + } + } + + // Move any untransformed source bytes to the start of the buffer + // and read more bytes. + if r.src0 != 0 { + r.src0, r.src1 = 0, copy(r.src, r.src[r.src0:r.src1]) + } + n, r.err = r.r.Read(r.src[r.src1:]) + r.src1 += n + } +} + +// TODO: implement ReadByte (and ReadRune??). + +// Writer wraps another io.Writer by transforming the bytes read. +// The user needs to call Close to flush unwritten bytes that may +// be buffered. +type Writer struct { + w io.Writer + t Transformer + dst []byte + + // src[:n] contains bytes that have not yet passed through t. + src []byte + n int +} + +// NewWriter returns a new Writer that wraps w by transforming the bytes written +// via t. It calls Reset on t. +func NewWriter(w io.Writer, t Transformer) *Writer { + t.Reset() + return &Writer{ + w: w, + t: t, + dst: make([]byte, defaultBufSize), + src: make([]byte, defaultBufSize), + } +} + +// Write implements the io.Writer interface. If there are not enough +// bytes available to complete a Transform, the bytes will be buffered +// for the next write. Call Close to convert the remaining bytes. +func (w *Writer) Write(data []byte) (n int, err error) { + src := data + if w.n > 0 { + // Append bytes from data to the last remainder. + // TODO: limit the amount copied on first try. + n = copy(w.src[w.n:], data) + w.n += n + src = w.src[:w.n] + } + for { + nDst, nSrc, err := w.t.Transform(w.dst, src, false) + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return n, werr + } + src = src[nSrc:] + if w.n == 0 { + n += nSrc + } else if len(src) <= n { + // Enough bytes from w.src have been consumed. We make src point + // to data instead to reduce the copying. + w.n = 0 + n -= len(src) + src = data[n:] + if n < len(data) && (err == nil || err == ErrShortSrc) { + continue + } + } + switch err { + case ErrShortDst: + // This error is okay as long as we are making progress. + if nDst > 0 || nSrc > 0 { + continue + } + case ErrShortSrc: + if len(src) < len(w.src) { + m := copy(w.src, src) + // If w.n > 0, bytes from data were already copied to w.src and n + // was already set to the number of bytes consumed. + if w.n == 0 { + n += m + } + w.n = m + err = nil + } else if nDst > 0 || nSrc > 0 { + // Not enough buffer to store the remainder. Keep processing as + // long as there is progress. Without this case, transforms that + // require a lookahead larger than the buffer may result in an + // error. This is not something one may expect to be common in + // practice, but it may occur when buffers are set to small + // sizes during testing. + continue + } + case nil: + if w.n > 0 { + err = errInconsistentByteCount + } + } + return n, err + } +} + +// Close implements the io.Closer interface. +func (w *Writer) Close() error { + src := w.src[:w.n] + for { + nDst, nSrc, err := w.t.Transform(w.dst, src, true) + if _, werr := w.w.Write(w.dst[:nDst]); werr != nil { + return werr + } + if err != ErrShortDst { + return err + } + src = src[nSrc:] + } +} + +type nop struct{ NopResetter } + +func (nop) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + n := copy(dst, src) + if n < len(src) { + err = ErrShortDst + } + return n, n, err +} + +func (nop) Span(src []byte, atEOF bool) (n int, err error) { + return len(src), nil +} + +type discard struct{ NopResetter } + +func (discard) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + return 0, len(src), nil +} + +var ( + // Discard is a Transformer for which all Transform calls succeed + // by consuming all bytes and writing nothing. + Discard Transformer = discard{} + + // Nop is a SpanningTransformer that copies src to dst. + Nop SpanningTransformer = nop{} +) + +// chain is a sequence of links. A chain with N Transformers has N+1 links and +// N+1 buffers. Of those N+1 buffers, the first and last are the src and dst +// buffers given to chain.Transform and the middle N-1 buffers are intermediate +// buffers owned by the chain. The i'th link transforms bytes from the i'th +// buffer chain.link[i].b at read offset chain.link[i].p to the i+1'th buffer +// chain.link[i+1].b at write offset chain.link[i+1].n, for i in [0, N). +type chain struct { + link []link + err error + // errStart is the index at which the error occurred plus 1. Processing + // errStart at this level at the next call to Transform. As long as + // errStart > 0, chain will not consume any more source bytes. + errStart int +} + +func (c *chain) fatalError(errIndex int, err error) { + if i := errIndex + 1; i > c.errStart { + c.errStart = i + c.err = err + } +} + +type link struct { + t Transformer + // b[p:n] holds the bytes to be transformed by t. + b []byte + p int + n int +} + +func (l *link) src() []byte { + return l.b[l.p:l.n] +} + +func (l *link) dst() []byte { + return l.b[l.n:] +} + +// Chain returns a Transformer that applies t in sequence. +func Chain(t ...Transformer) Transformer { + if len(t) == 0 { + return nop{} + } + c := &chain{link: make([]link, len(t)+1)} + for i, tt := range t { + c.link[i].t = tt + } + // Allocate intermediate buffers. + b := make([][defaultBufSize]byte, len(t)-1) + for i := range b { + c.link[i+1].b = b[i][:] + } + return c +} + +// Reset resets the state of Chain. It calls Reset on all the Transformers. +func (c *chain) Reset() { + for i, l := range c.link { + if l.t != nil { + l.t.Reset() + } + c.link[i].p, c.link[i].n = 0, 0 + } +} + +// TODO: make chain use Span (is going to be fun to implement!) + +// Transform applies the transformers of c in sequence. +func (c *chain) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + // Set up src and dst in the chain. + srcL := &c.link[0] + dstL := &c.link[len(c.link)-1] + srcL.b, srcL.p, srcL.n = src, 0, len(src) + dstL.b, dstL.n = dst, 0 + var lastFull, needProgress bool // for detecting progress + + // i is the index of the next Transformer to apply, for i in [low, high]. + // low is the lowest index for which c.link[low] may still produce bytes. + // high is the highest index for which c.link[high] has a Transformer. + // The error returned by Transform determines whether to increase or + // decrease i. We try to completely fill a buffer before converting it. + for low, i, high := c.errStart, c.errStart, len(c.link)-2; low <= i && i <= high; { + in, out := &c.link[i], &c.link[i+1] + nDst, nSrc, err0 := in.t.Transform(out.dst(), in.src(), atEOF && low == i) + out.n += nDst + in.p += nSrc + if i > 0 && in.p == in.n { + in.p, in.n = 0, 0 + } + needProgress, lastFull = lastFull, false + switch err0 { + case ErrShortDst: + // Process the destination buffer next. Return if we are already + // at the high index. + if i == high { + return dstL.n, srcL.p, ErrShortDst + } + if out.n != 0 { + i++ + // If the Transformer at the next index is not able to process any + // source bytes there is nothing that can be done to make progress + // and the bytes will remain unprocessed. lastFull is used to + // detect this and break out of the loop with a fatal error. + lastFull = true + continue + } + // The destination buffer was too small, but is completely empty. + // Return a fatal error as this transformation can never complete. + c.fatalError(i, errShortInternal) + case ErrShortSrc: + if i == 0 { + // Save ErrShortSrc in err. All other errors take precedence. + err = ErrShortSrc + break + } + // Source bytes were depleted before filling up the destination buffer. + // Verify we made some progress, move the remaining bytes to the errStart + // and try to get more source bytes. + if needProgress && nSrc == 0 || in.n-in.p == len(in.b) { + // There were not enough source bytes to proceed while the source + // buffer cannot hold any more bytes. Return a fatal error as this + // transformation can never complete. + c.fatalError(i, errShortInternal) + break + } + // in.b is an internal buffer and we can make progress. + in.p, in.n = 0, copy(in.b, in.src()) + fallthrough + case nil: + // if i == low, we have depleted the bytes at index i or any lower levels. + // In that case we increase low and i. In all other cases we decrease i to + // fetch more bytes before proceeding to the next index. + if i > low { + i-- + continue + } + default: + c.fatalError(i, err0) + } + // Exhausted level low or fatal error: increase low and continue + // to process the bytes accepted so far. + i++ + low = i + } + + // If c.errStart > 0, this means we found a fatal error. We will clear + // all upstream buffers. At this point, no more progress can be made + // downstream, as Transform would have bailed while handling ErrShortDst. + if c.errStart > 0 { + for i := 1; i < c.errStart; i++ { + c.link[i].p, c.link[i].n = 0, 0 + } + err, c.errStart, c.err = c.err, 0, nil + } + return dstL.n, srcL.p, err +} + +// Deprecated: use runes.Remove instead. +func RemoveFunc(f func(r rune) bool) Transformer { + return removeF(f) +} + +type removeF func(r rune) bool + +func (removeF) Reset() {} + +// Transform implements the Transformer interface. +func (t removeF) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) { + for r, sz := rune(0), 0; len(src) > 0; src = src[sz:] { + + if r = rune(src[0]); r < utf8.RuneSelf { + sz = 1 + } else { + r, sz = utf8.DecodeRune(src) + + if sz == 1 { + // Invalid rune. + if !atEOF && !utf8.FullRune(src) { + err = ErrShortSrc + break + } + // We replace illegal bytes with RuneError. Not doing so might + // otherwise turn a sequence of invalid UTF-8 into valid UTF-8. + // The resulting byte sequence may subsequently contain runes + // for which t(r) is true that were passed unnoticed. + if !t(r) { + if nDst+3 > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], "\uFFFD") + } + nSrc++ + continue + } + } + + if !t(r) { + if nDst+sz > len(dst) { + err = ErrShortDst + break + } + nDst += copy(dst[nDst:], src[:sz]) + } + nSrc += sz + } + return +} + +// grow returns a new []byte that is longer than b, and copies the first n bytes +// of b to the start of the new slice. +func grow(b []byte, n int) []byte { + m := len(b) + if m <= 32 { + m = 64 + } else if m <= 256 { + m *= 2 + } else { + m += m >> 1 + } + buf := make([]byte, m) + copy(buf, b[:n]) + return buf +} + +const initialBufSize = 128 + +// String returns a string with the result of converting s[:n] using t, where +// n <= len(s). If err == nil, n will be len(s). It calls Reset on t. +func String(t Transformer, s string) (result string, n int, err error) { + t.Reset() + if s == "" { + // Fast path for the common case for empty input. Results in about a + // 86% reduction of running time for BenchmarkStringLowerEmpty. + if _, _, err := t.Transform(nil, nil, true); err == nil { + return "", 0, nil + } + } + + // Allocate only once. Note that both dst and src escape when passed to + // Transform. + buf := [2 * initialBufSize]byte{} + dst := buf[:initialBufSize:initialBufSize] + src := buf[initialBufSize : 2*initialBufSize] + + // The input string s is transformed in multiple chunks (starting with a + // chunk size of initialBufSize). nDst and nSrc are per-chunk (or + // per-Transform-call) indexes, pDst and pSrc are overall indexes. + nDst, nSrc := 0, 0 + pDst, pSrc := 0, 0 + + // pPrefix is the length of a common prefix: the first pPrefix bytes of the + // result will equal the first pPrefix bytes of s. It is not guaranteed to + // be the largest such value, but if pPrefix, len(result) and len(s) are + // all equal after the final transform (i.e. calling Transform with atEOF + // being true returned nil error) then we don't need to allocate a new + // result string. + pPrefix := 0 + for { + // Invariant: pDst == pPrefix && pSrc == pPrefix. + + n := copy(src, s[pSrc:]) + nDst, nSrc, err = t.Transform(dst, src[:n], pSrc+n == len(s)) + pDst += nDst + pSrc += nSrc + + // TODO: let transformers implement an optional Spanner interface, akin + // to norm's QuickSpan. This would even allow us to avoid any allocation. + if !bytes.Equal(dst[:nDst], src[:nSrc]) { + break + } + pPrefix = pSrc + if err == ErrShortDst { + // A buffer can only be short if a transformer modifies its input. + break + } else if err == ErrShortSrc { + if nSrc == 0 { + // No progress was made. + break + } + // Equal so far and !atEOF, so continue checking. + } else if err != nil || pPrefix == len(s) { + return string(s[:pPrefix]), pPrefix, err + } + } + // Post-condition: pDst == pPrefix + nDst && pSrc == pPrefix + nSrc. + + // We have transformed the first pSrc bytes of the input s to become pDst + // transformed bytes. Those transformed bytes are discontiguous: the first + // pPrefix of them equal s[:pPrefix] and the last nDst of them equal + // dst[:nDst]. We copy them around, into a new dst buffer if necessary, so + // that they become one contiguous slice: dst[:pDst]. + if pPrefix != 0 { + newDst := dst + if pDst > len(newDst) { + newDst = make([]byte, len(s)+nDst-nSrc) + } + copy(newDst[pPrefix:pDst], dst[:nDst]) + copy(newDst[:pPrefix], s[:pPrefix]) + dst = newDst + } + + // Prevent duplicate Transform calls with atEOF being true at the end of + // the input. Also return if we have an unrecoverable error. + if (err == nil && pSrc == len(s)) || + (err != nil && err != ErrShortDst && err != ErrShortSrc) { + return string(dst[:pDst]), pSrc, err + } + + // Transform the remaining input, growing dst and src buffers as necessary. + for { + n := copy(src, s[pSrc:]) + nDst, nSrc, err := t.Transform(dst[pDst:], src[:n], pSrc+n == len(s)) + pDst += nDst + pSrc += nSrc + + // If we got ErrShortDst or ErrShortSrc, do not grow as long as we can + // make progress. This may avoid excessive allocations. + if err == ErrShortDst { + if nDst == 0 { + dst = grow(dst, pDst) + } + } else if err == ErrShortSrc { + if nSrc == 0 { + src = grow(src, 0) + } + } else if err != nil || pSrc == len(s) { + return string(dst[:pDst]), pSrc, err + } + } +} + +// Bytes returns a new byte slice with the result of converting b[:n] using t, +// where n <= len(b). If err == nil, n will be len(b). It calls Reset on t. +func Bytes(t Transformer, b []byte) (result []byte, n int, err error) { + return doAppend(t, 0, make([]byte, len(b)), b) +} + +// Append appends the result of converting src[:n] using t to dst, where +// n <= len(src), If err == nil, n will be len(src). It calls Reset on t. +func Append(t Transformer, dst, src []byte) (result []byte, n int, err error) { + if len(dst) == cap(dst) { + n := len(src) + len(dst) // It is okay for this to be 0. + b := make([]byte, n) + dst = b[:copy(b, dst)] + } + return doAppend(t, len(dst), dst[:cap(dst)], src) +} + +func doAppend(t Transformer, pDst int, dst, src []byte) (result []byte, n int, err error) { + t.Reset() + pSrc := 0 + for { + nDst, nSrc, err := t.Transform(dst[pDst:], src[pSrc:], true) + pDst += nDst + pSrc += nSrc + if err != ErrShortDst { + return dst[:pDst], pSrc, err + } + + // Grow the destination buffer, but do not grow as long as we can make + // progress. This may avoid excessive allocations. + if nDst == 0 { + dst = grow(dst, pDst) + } + } +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go new file mode 100755 index 0000000..63cdc16 --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/base.go @@ -0,0 +1,105 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cldr + +import ( + "encoding/xml" + "regexp" + "strconv" +) + +// Elem is implemented by every XML element. +type Elem interface { + setEnclosing(Elem) + setName(string) + enclosing() Elem + + GetCommon() *Common +} + +type hidden struct { + CharData string `xml:",chardata"` + Alias *struct { + Common + Source string `xml:"source,attr"` + Path string `xml:"path,attr"` + } `xml:"alias"` + Def *struct { + Common + Choice string `xml:"choice,attr,omitempty"` + Type string `xml:"type,attr,omitempty"` + } `xml:"default"` +} + +// Common holds several of the most common attributes and sub elements +// of an XML element. +type Common struct { + XMLName xml.Name + name string + enclElem Elem + Type string `xml:"type,attr,omitempty"` + Reference string `xml:"reference,attr,omitempty"` + Alt string `xml:"alt,attr,omitempty"` + ValidSubLocales string `xml:"validSubLocales,attr,omitempty"` + Draft string `xml:"draft,attr,omitempty"` + hidden +} + +// Default returns the default type to select from the enclosed list +// or "" if no default value is specified. +func (e *Common) Default() string { + if e.Def == nil { + return "" + } + if e.Def.Choice != "" { + return e.Def.Choice + } else if e.Def.Type != "" { + // Type is still used by the default element in collation. + return e.Def.Type + } + return "" +} + +// Element returns the XML element name. +func (e *Common) Element() string { + return e.name +} + +// GetCommon returns e. It is provided such that Common implements Elem. +func (e *Common) GetCommon() *Common { + return e +} + +// Data returns the character data accumulated for this element. +func (e *Common) Data() string { + e.CharData = charRe.ReplaceAllStringFunc(e.CharData, replaceUnicode) + return e.CharData +} + +func (e *Common) setName(s string) { + e.name = s +} + +func (e *Common) enclosing() Elem { + return e.enclElem +} + +func (e *Common) setEnclosing(en Elem) { + e.enclElem = en +} + +// Escape characters that can be escaped without further escaping the string. +var charRe = regexp.MustCompile(`&#x[0-9a-fA-F]*;|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\[abtnvfr]`) + +// replaceUnicode converts hexadecimal Unicode codepoint notations to a one-rune string. +// It assumes the input string is correctly formatted. +func replaceUnicode(s string) string { + if s[1] == '#' { + r, _ := strconv.ParseInt(s[3:len(s)-1], 16, 32) + return string(r) + } + r, _, _, _ := strconv.UnquoteChar(s, 0) + return string(r) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go new file mode 100755 index 0000000..2197f8a --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/cldr.go @@ -0,0 +1,130 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run makexml.go -output xml.go + +// Package cldr provides a parser for LDML and related XML formats. +// This package is intended to be used by the table generation tools +// for the various internationalization-related packages. +// As the XML types are generated from the CLDR DTD, and as the CLDR standard +// is periodically amended, this package may change considerably over time. +// This mostly means that data may appear and disappear between versions. +// That is, old code should keep compiling for newer versions, but data +// may have moved or changed. +// CLDR version 22 is the first version supported by this package. +// Older versions may not work. +package cldr // import "golang.org/x/text/unicode/cldr" + +import ( + "fmt" + "sort" +) + +// CLDR provides access to parsed data of the Unicode Common Locale Data Repository. +type CLDR struct { + parent map[string][]string + locale map[string]*LDML + resolved map[string]*LDML + bcp47 *LDMLBCP47 + supp *SupplementalData +} + +func makeCLDR() *CLDR { + return &CLDR{ + parent: make(map[string][]string), + locale: make(map[string]*LDML), + resolved: make(map[string]*LDML), + bcp47: &LDMLBCP47{}, + supp: &SupplementalData{}, + } +} + +// BCP47 returns the parsed BCP47 LDML data. If no such data was parsed, nil is returned. +func (cldr *CLDR) BCP47() *LDMLBCP47 { + return nil +} + +// Draft indicates the draft level of an element. +type Draft int + +const ( + Approved Draft = iota + Contributed + Provisional + Unconfirmed +) + +var drafts = []string{"unconfirmed", "provisional", "contributed", "approved", ""} + +// ParseDraft returns the Draft value corresponding to the given string. The +// empty string corresponds to Approved. +func ParseDraft(level string) (Draft, error) { + if level == "" { + return Approved, nil + } + for i, s := range drafts { + if level == s { + return Unconfirmed - Draft(i), nil + } + } + return Approved, fmt.Errorf("cldr: unknown draft level %q", level) +} + +func (d Draft) String() string { + return drafts[len(drafts)-1-int(d)] +} + +// SetDraftLevel sets which draft levels to include in the evaluated LDML. +// Any draft element for which the draft level is higher than lev will be excluded. +// If multiple draft levels are available for a single element, the one with the +// lowest draft level will be selected, unless preferDraft is true, in which case +// the highest draft will be chosen. +// It is assumed that the underlying LDML is canonicalized. +func (cldr *CLDR) SetDraftLevel(lev Draft, preferDraft bool) { + // TODO: implement + cldr.resolved = make(map[string]*LDML) +} + +// RawLDML returns the LDML XML for id in unresolved form. +// id must be one of the strings returned by Locales. +func (cldr *CLDR) RawLDML(loc string) *LDML { + return cldr.locale[loc] +} + +// LDML returns the fully resolved LDML XML for loc, which must be one of +// the strings returned by Locales. +func (cldr *CLDR) LDML(loc string) (*LDML, error) { + return cldr.resolve(loc) +} + +// Supplemental returns the parsed supplemental data. If no such data was parsed, +// nil is returned. +func (cldr *CLDR) Supplemental() *SupplementalData { + return cldr.supp +} + +// Locales returns the locales for which there exist files. +// Valid sublocales for which there is no file are not included. +// The root locale is always sorted first. +func (cldr *CLDR) Locales() []string { + loc := []string{"root"} + hasRoot := false + for l, _ := range cldr.locale { + if l == "root" { + hasRoot = true + continue + } + loc = append(loc, l) + } + sort.Strings(loc[1:]) + if !hasRoot { + return loc[1:] + } + return loc +} + +// Get fills in the fields of x based on the XPath path. +func Get(e Elem, path string) (res Elem, err error) { + return walkXPath(e, path) +} diff --git a/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go new file mode 100755 index 0000000..80ee28d --- /dev/null +++ b/vendor/github.com/skycoin/skycoin/vendor/golang.org/x/text/unicode/cldr/collate.go @@ -0,0 +1,359 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cldr + +import ( + "bufio" + "encoding/xml" + "errors" + "fmt" + "strconv" + "strings" + "unicode" + "unicode/utf8" +) + +// RuleProcessor can be passed to Collator's Process method, which +// parses the rules and calls the respective method for each rule found. +type RuleProcessor interface { + Reset(anchor string, before int) error + Insert(level int, str, context, extend string) error + Index(id string) +} + +const ( + // cldrIndex is a Unicode-reserved sentinel value used to mark the start + // of a grouping within an index. + // We ignore any rule that starts with this rune. + // See http://unicode.org/reports/tr35/#Collation_Elements for details. + cldrIndex = "\uFDD0" + + // specialAnchor is the format in which to represent logical reset positions, + // such as "first tertiary ignorable". + specialAnchor = "<%s/>" +) + +// Process parses the rules for the tailorings of this collation +// and calls the respective methods of p for each rule found. +func (c Collation) Process(p RuleProcessor) (err error) { + if len(c.Cr) > 0 { + if len(c.Cr) > 1 { + return fmt.Errorf("multiple cr elements, want 0 or 1") + } + return processRules(p, c.Cr[0].Data()) + } + if c.Rules.Any != nil { + return c.processXML(p) + } + return errors.New("no tailoring data") +} + +// processRules parses rules in the Collation Rule Syntax defined in +// http://www.unicode.org/reports/tr35/tr35-collation.html#Collation_Tailorings. +func processRules(p RuleProcessor, s string) (err error) { + chk := func(s string, e error) string { + if err == nil { + err = e + } + return s + } + i := 0 // Save the line number for use after the loop. + scanner := bufio.NewScanner(strings.NewReader(s)) + for ; scanner.Scan() && err == nil; i++ { + for s := skipSpace(scanner.Text()); s != "" && s[0] != '#'; s = skipSpace(s) { + level := 5 + var ch byte + switch ch, s = s[0], s[1:]; ch { + case '&': // followed by or '[' ']' + if s = skipSpace(s); consume(&s, '[') { + s = chk(parseSpecialAnchor(p, s)) + } else { + s = chk(parseAnchor(p, 0, s)) + } + case '<': // sort relation '<'{1,4}, optionally followed by '*'. + for level = 1; consume(&s, '<'); level++ { + } + if level > 4 { + err = fmt.Errorf("level %d > 4", level) + } + fallthrough + case '=': // identity relation, optionally followed by *. + if consume(&s, '*') { + s = chk(parseSequence(p, level, s)) + } else { + s = chk(parseOrder(p, level, s)) + } + default: + chk("", fmt.Errorf("illegal operator %q", ch)) + break + } + } + } + if chk("", scanner.Err()); err != nil { + return fmt.Errorf("%d: %v", i, err) + } + return nil +} + +// parseSpecialAnchor parses the anchor syntax which is either of the form +// ['before' ] +// or +// [